ZGlmZiAtLWdpdCBhL3RveWJveC8uY29uZmlnIGIvdG95Ym94Ly5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzMGE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC8uY29uZmlnCkBAIC0wLDAgKzEsMzQ4IEBACisjCisjIE1hbnVhbGx5LWdlbmVyYXRlZC4KKyMgVG95Qm94IHZlcnNpb246IEtDT05GSUdfVkVSU0lPTgorIworQ09ORklHX1RPWUJPWF9DT05UQUlORVI9eQorQ09ORklHX1RPWUJPWF9GQUxMT0NBVEU9eQorQ09ORklHX1RPWUJPWF9GSUZSRUVaRT15CitDT05GSUdfVE9ZQk9YX0ZPUks9eQorQ09ORklHX1RPWUJPWF9JQ09OVj15CitDT05GSUdfVE9ZQk9YX09OX0FORFJPSUQ9eQorIyBDT05GSUdfVE9ZQk9YX1NIQURPVyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1lCT1hfVVRNUFggaXMgbm90IHNldAorCisjCisjIFBvc2l4IGNvbW1hbmRzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUPXkKK0NPTkZJR19DQVRfVj15CisjIENPTkZJR19DQVRWIGlzIG5vdCBzZXQKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfQ1BfTU9SRT15CitDT05GSUdfQ1BfUFJFU0VSVkU9eQorQ09ORklHX01WPXkKK0NPTkZJR19NVl9NT1JFPXkKK0NPTkZJR19JTlNUQUxMPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19DVVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0RGPXkKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19EVT15CitDT05GSUdfRUNITz15CitDT05GSUdfRU5WPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GSUxFPXkKK0NPTkZJR19GSU5EPXkKK0NPTkZJR19HUkVQPXkKK0NPTkZJR19FR1JFUD15CitDT05GSUdfRkdSRVA9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19JRF9aPXkKK0NPTkZJR19JT05JQ0U9eQorQ09ORklHX0lPUkVOSUNFPXkKK0NPTkZJR19HUk9VUFM9eQorQ09ORklHX0xPR05BTUU9eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfS0lMTD15CisjIENPTkZJR19LSUxMQUxMNSBpcyBub3Qgc2V0CisjIENPTkZJR19MSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19MTj15CitDT05GSUdfTFM9eQorQ09ORklHX0xTX0NPTE9SPXkKK0NPTkZJR19MU19aPXkKK0NPTkZJR19NS0RJUj15CitDT05GSUdfTUtESVJfWj15CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS0ZJRk9fWj15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01LTk9EX1o9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05MPXkKK0NPTkZJR19OT0hVUD15CisjIENPTkZJR19OUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfT0Q9eQorQ09ORklHX1BBU1RFPXkKK0NPTkZJR19QQVRDSD15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QUz15CisjIENPTkZJR19UVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFTklDRT15CitDT05GSUdfUk09eQorQ09ORklHX1JNRElSPXkKK0NPTkZJR19TRUQ9eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19TTEVFUF9GTE9BVD15CitDT05GSUdfU09SVD15CitDT05GSUdfU09SVF9CSUc9eQorQ09ORklHX1NPUlRfRkxPQVQ9eQorQ09ORklHX1NQTElUPXkKK0NPTkZJR19TVFJJTkdTPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19UQUlMX1NFRUs9eQorQ09ORklHX1RBU0tTRVQ9eQorQ09ORklHX1RFRT15CitDT05GSUdfVElNRT15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVUxJTUlUPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5JUT15CisjIENPTkZJR19VTkxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVVERUNPREUgaXMgbm90IHNldAorIyBDT05GSUdfVVVFTkNPREUgaXMgbm90IHNldAorIyBDT05GSUdfVkkgaXMgbm90IHNldAorQ09ORklHX1dDPXkKKyMgQ09ORklHX1dITyBpcyBub3Qgc2V0CitDT05GSUdfWEFSR1M9eQorIyBDT05GSUdfWEFSR1NfUEVEQU5USUMgaXMgbm90IHNldAorCisjCisjIHBlbmRpbmcgKHNlZSB0b3lzL3BlbmRpbmcvUkVBRE1FKQorIworIyBDT05GSUdfQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0daSVAgaXMgbm90IHNldAorIyBDT05GSUdfR1pJUF9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ09NUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfWkNBVCBpcyBub3Qgc2V0CisjIENPTkZJR19HVU5aSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JPTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JPTlRBQiBpcyBub3Qgc2V0CitDT05GSUdfREQ9eQorIyBDT05GSUdfREhDUDYgaXMgbm90IHNldAorIyBDT05GSUdfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJRkYgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CitDT05GSUdfRVhQUj15CisjIENPTkZJR19GRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19GT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRGQVRUUj15CisjIENPTkZJR19HRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUEFERCBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUERFTCBpcyBub3Qgc2V0CisjIENPTkZJR19IRVhFRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1QgaXMgbm90IHNldAorQ09ORklHX0hXQ0xPQ0s9eQorIyBDT05GSUdfSUNPTlYgaXMgbm90IHNldAorIyBDT05GSUdfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUENSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tMT0dEX1NPVVJDRV9SSU5HX0JVRkZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CitDT05GSUdfTFNPRj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0UyRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUtFMkZTX0pPVVJOQUwgaXMgbm90IHNldAorIyBDT05GSUdfTUtFMkZTX0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0UyRlNfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUtFMkZTX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NT1JFPXkKK0NPTkZJR19ORVRTVEFUPXkKKyMgQ09ORklHX09QRU5WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUFMTE9DVlQgaXMgbm90IHNldAorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QS0lMTD15CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ0QgaXMgbm90IHNldAorQ09ORklHX1NFVEZBVFRSPXkKKyMgQ09ORklHX1NVTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfU1lTTE9HRCBpcyBub3Qgc2V0CitDT05GSUdfVEFSPXkKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfVEVMTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUEQgaXMgbm90IHNldAorQ09ORklHX1RPUD15CitDT05GSUdfVFJBQ0VST1VURT15CitDT05GSUdfVFI9eQorIyBDT05GSUdfVVNFUkFERCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSREVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dHRVQgaXMgbm90IHNldAorIyBDT05GSUdfWFpDQVQgaXMgbm90IHNldAorCisjCisjIE90aGVyIGNvbW1hbmRzCisjCitDT05GSUdfQUNQST15CitDT05GSUdfQkFTRTY0PXkKK0NPTkZJR19CTEtJRD15CisjIENPTkZJR19GU1RZUEUgaXMgbm90IHNldAorQ09ORklHX0JMT0NLREVWPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWkNBVD15CitDT05GSUdfQ0hDT049eQorQ09ORklHX0NIUk9PVD15CisjIENPTkZJR19DSFZUIGlzIG5vdCBzZXQKK0NPTkZJR19DTEVBUj15CisjIENPTkZJR19DT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfRkFMTE9DQVRFPXkKK0NPTkZJR19GTE9DSz15CitDT05GSUdfRlJFRT15CitDT05GSUdfRlJFRVJBTURJU0s9eQorQ09ORklHX0ZTRlJFRVpFPXkKKyMgQ09ORklHX0ZTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19IRUxQPXkKK0NPTkZJR19IRUxQX0VYVFJBUz15CisjIENPTkZJR19IT1NUSUQgaXMgbm90IHNldAorQ09ORklHX0lGQ09ORklHPXkKK0NPTkZJR19JTk9USUZZRD15CitDT05GSUdfSU5TTU9EPXkKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKK0NPTkZJR19MT1NFVFVQPXkKK0NPTkZJR19MU0FUVFI9eQorQ09ORklHX0NIQVRUUj15CitDT05GSUdfTFNNT0Q9eQorIyBDT05GSUdfTFNQQ0kgaXMgbm90IHNldAorQ09ORklHX0xTUENJX1RFWFQ9eQorQ09ORklHX0xTVVNCPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19NSVggaXMgbm90IHNldAorIyBDT05GSUdfTUtQQVNTV0QgaXMgbm90IHNldAorQ09ORklHX01LU1dBUD15CitDT05GSUdfTU9ESU5GTz15CitDT05GSUdfTU9VTlRQT0lOVD15CitDT05GSUdfTkJEX0NMSUVOVD15CitDT05GSUdfTkVUQ0FUPXkKK0NPTkZJR19ORVRDQVRfTElTVEVOPXkKKyMgQ09ORklHX1VOU0hBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTlNFTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19PTkVJVCBpcyBub3Qgc2V0CitDT05GSUdfUEFSVFBST0JFPXkKK0NPTkZJR19QSVZPVF9ST09UPXkKK0NPTkZJR19QTUFQPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFdEWD15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19SRUFMUEFUSD15CisjIENPTkZJR19SRUJPT1QgaXMgbm90IHNldAorQ09ORklHX1JFVj15CitDT05GSUdfUkZLSUxMPXkKK0NPTkZJR19STU1PRD15CitDT05GSUdfU0VUU0lEPXkKKyMgQ09ORklHX1NIUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFUPXkKK0NPTkZJR19TV0FQT0ZGPXkKK0NPTkZJR19TV0FQT049eQorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQVNLU0VUPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UUlVOQ0FURT15CitDT05GSUdfVVBUSU1FPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1ZDT05GSUc9eQorQ09ORklHX1ZNU1RBVD15CisjIENPTkZJR19XIGlzIG5vdCBzZXQKK0NPTkZJR19XSElDSD15CitDT05GSUdfWFhEPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIExpbnV4IFN0YW5kYXJkIEJhc2UgY29tbWFuZHMKKyMKK0NPTkZJR19ETUVTRz15CitDT05GSUdfSE9TVE5BTUU9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjI0U1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorQ09ORklHX1NIQTM4NFNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19NT1VOVD15CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorQ09ORklHX1BJRE9GPXkKK0NPTkZJR19TRVE9eQorIyBDT05GSUdfU1UgaXMgbm90IHNldAorQ09ORklHX1NZTkM9eQorQ09ORklHX1VNT1VOVD15CisKKyMKKyMgRXhhbXBsZSBjb21tYW5kcworIworIyBDT05GSUdfSEVMTE8gaXMgbm90IHNldAorIyBDT05GSUdfU0tFTEVUT04gaXMgbm90IHNldAorIyBDT05GSUdfU0tFTEVUT05fQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfVEVTVF9IVU1BTl9SRUFEQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUX01BTllfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUX1NDQU5LRVkgaXMgbm90IHNldAorCisjCisjIEFuZHJvaWQKKyMKK0NPTkZJR19HRVRFTkZPUkNFPXkKK0NPTkZJR19HRVRQUk9QPXkKK0NPTkZJR19MT0FEX1BPTElDWT15CitDT05GSUdfTE9HPXkKK0NPTkZJR19SRVNUT1JFQ09OPXkKK0NPTkZJR19SVU5DT049eQorQ09ORklHX1NFTkRFVkVOVD15CitDT05GSUdfU0VURU5GT1JDRT15CitDT05GSUdfU0VUUFJPUD15CitDT05GSUdfU1RBUlQ9eQorQ09ORklHX1NUT1A9eQorCisjCisjIAorIworCisjCisjIFRveWJveCBnbG9iYWwgc2V0dGluZ3MKKyMKK0NPTkZJR19UT1lCT1g9eQorQ09ORklHX1RPWUJPWF9TVUlEPXkKKyMgQ09ORklHX1RPWUJPWF9MU01fTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfVE9ZQk9YX1NFTElOVVg9eQorIyBDT05GSUdfVE9ZQk9YX1NNQUNLIGlzIG5vdCBzZXQKK0NPTkZJR19UT1lCT1hfRkxPQVQ9eQorQ09ORklHX1RPWUJPWF9IRUxQPXkKK0NPTkZJR19UT1lCT1hfSEVMUF9EQVNIREFTSD15CitDT05GSUdfVE9ZQk9YX0kxOE49eQorQ09ORklHX1RPWUJPWF9MSUJDUllQVE89eQorIyBDT05GSUdfVE9ZQk9YX0ZSRUUgaXMgbm90IHNldAorQ09ORklHX1RPWUJPWF9OT1JFQ1VSU0U9eQorIyBDT05GSUdfVE9ZQk9YX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19UT1lCT1hfVUlEX1NZUz0xMDAKK0NPTkZJR19UT1lCT1hfVUlEX1VTUj01MDAKKyMgQ09ORklHX1RPWUJPWF9NVVNMX05PTU1VX0lTX0JST0tFTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS90b3lib3gvQW5kcm9pZC5tayBiL3RveWJveC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzhkYzQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjCisjIFRvIHVwZGF0ZToKKyMKKworIyAgZ2l0IHJlbW90ZSBhZGQgdG95Ym94IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5kbGV5L3RveWJveC5naXQKKyMgIGdpdCBmZXRjaCB0b3lib3gKKyMgIGdpdCBtZXJnZSB0b3lib3gvbWFzdGVyCisjICBtbSAtajMyCisjICAjIChNYWtlIGFueSBuZWNlc3NhcnkgQW5kcm9pZC5tayBjaGFuZ2VzIGFuZCB0ZXN0IHRoZSBuZXcgdG95Ym94LikKKyMgIHJlcG8gdXBsb2FkIC4KKyMgIGdpdCBwdXNoIGFvc3AgSEVBRDpyZWZzL2Zvci9tYXN0ZXIgICMgUHVzaCB0byBnZXJyaXQgZm9yIHJldmlldy4KKyMgIGdpdCBwdXNoIGFvc3AgSEVBRDptYXN0ZXIgICMgUHVzaCBkaXJlY3RseSwgYXZvaWRpbmcgZ2Vycml0LgorIworIyAgIyBOb3cgY29tbWl0IGFueSBuZWNlc3NhcnkgQW5kcm9pZC5tayBjaGFuZ2VzIGxpa2Ugbm9ybWFsOgorIyAgcmVwbyBzdGFydCBwb3N0LXN5bmMgLgorIyAgZ2l0IGNvbW1pdCAtYQorCisKKyMKKyMgVG8gYWRkIGEgdG95OgorIworCisjICBFZGl0IC5jb25maWcgdG8gZW5hYmxlIHRoZSB0b3kgeW91IHdhbnQgdG8gYWRkLgorIyAgbWFrZSBjbGVhbiAmJiBtYWtlICAjIFJlZ2VuZXJhdGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKyMgICMgRWRpdCBMT0NBTF9TUkNfRklMRVMgYmVsb3cgdG8gYWRkIHRoZSB0b3kuCisjICAjIElmIHlvdSBqdXN0IHdhbnQgdG8gdXNlIGl0IGFzICJ0b3lib3ggeCIgcmF0aGVyIHRoYW4gIngiLCB5b3UgY2FuIHN0b3Agbm93LgorIyAgIyBJZiB5b3Ugd2FudCB0aGlzIHRveSB0byBoYXZlIGEgc3ltYm9saWMgbGluayBpbiAvc3lzdGVtL2JpbiwgYWRkIHRoZSB0b3kgdG8gQUxMX1RPT0xTLgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBsaWIvYXJncy5jIFwKKyAgICBsaWIvZGlydHJlZS5jIFwKKyAgICBsaWIvZ2V0bW91bnRsaXN0LmMgXAorICAgIGxpYi9oZWxwLmMgXAorICAgIGxpYi9pbnRlcmVzdGluZ3RpbWVzLmMgXAorICAgIGxpYi9saWIuYyBcCisgICAgbGliL2xpbmVzdGFjay5jIFwKKyAgICBsaWIvbGxpc3QuYyBcCisgICAgbGliL25ldC5jIFwKKyAgICBsaWIvcG9ydGFiaWxpdHkuYyBcCisgICAgbGliL3h3cmFwLmMgXAorICAgIG1haW4uYyBcCisgICAgdG95cy9hbmRyb2lkL2dldGVuZm9yY2UuYyBcCisgICAgdG95cy9hbmRyb2lkL2dldHByb3AuYyBcCisgICAgdG95cy9hbmRyb2lkL2xvYWRfcG9saWN5LmMgXAorICAgIHRveXMvYW5kcm9pZC9sb2cuYyBcCisgICAgdG95cy9hbmRyb2lkL3Jlc3RvcmVjb24uYyBcCisgICAgdG95cy9hbmRyb2lkL3J1bmNvbi5jIFwKKyAgICB0b3lzL2FuZHJvaWQvc2VuZGV2ZW50LmMgXAorICAgIHRveXMvYW5kcm9pZC9zZXRlbmZvcmNlLmMgXAorICAgIHRveXMvYW5kcm9pZC9zZXRwcm9wLmMgXAorICAgIHRveXMvYW5kcm9pZC9zdGFydC5jIFwKKyAgICB0b3lzL2xzYi9kbWVzZy5jIFwKKyAgICB0b3lzL2xzYi9ob3N0bmFtZS5jIFwKKyAgICB0b3lzL2xzYi9raWxsYWxsLmMgXAorICAgIHRveXMvbHNiL21kNXN1bS5jIFwKKyAgICB0b3lzL2xzYi9ta25vZC5jIFwKKyAgICB0b3lzL2xzYi9ta3RlbXAuYyBcCisgICAgdG95cy9sc2IvbW91bnQuYyBcCisgICAgdG95cy9sc2IvcGlkb2YuYyBcCisgICAgdG95cy9sc2Ivc2VxLmMgXAorICAgIHRveXMvbHNiL3N5bmMuYyBcCisgICAgdG95cy9sc2IvdW1vdW50LmMgXAorICAgIHRveXMvbmV0L2lmY29uZmlnLmMgXAorICAgIHRveXMvbmV0L25ldGNhdC5jIFwKKyAgICB0b3lzL25ldC9uZXRzdGF0LmMgXAorICAgIHRveXMvbmV0L3Jma2lsbC5jIFwKKyAgICB0b3lzL290aGVyL2FjcGkuYyBcCisgICAgdG95cy9vdGhlci9iYXNlNjQuYyBcCisgICAgdG95cy9vdGhlci9ibGtpZC5jIFwKKyAgICB0b3lzL290aGVyL2Jsb2NrZGV2LmMgXAorICAgIHRveXMvb3RoZXIvYnpjYXQuYyBcCisgICAgdG95cy9vdGhlci9jaGNvbi5jIFwKKyAgICB0b3lzL290aGVyL2Nocm9vdC5jIFwKKyAgICB0b3lzL290aGVyL2NsZWFyLmMgXAorICAgIHRveXMvb3RoZXIvZG9zMnVuaXguYyBcCisgICAgdG95cy9vdGhlci9mYWxsb2NhdGUuYyBcCisgICAgdG95cy9vdGhlci9mbG9jay5jIFwKKyAgICB0b3lzL290aGVyL2ZyZWUuYyBcCisgICAgdG95cy9vdGhlci9mcmVlcmFtZGlzay5jIFwKKyAgICB0b3lzL290aGVyL2ZzZnJlZXplLmMgXAorICAgIHRveXMvb3RoZXIvaGVscC5jIFwKKyAgICB0b3lzL290aGVyL2h3Y2xvY2suYyBcCisgICAgdG95cy9vdGhlci9pbm90aWZ5ZC5jIFwKKyAgICB0b3lzL290aGVyL2luc21vZC5jIFwKKyAgICB0b3lzL290aGVyL2lvbmljZS5jIFwKKyAgICB0b3lzL290aGVyL2xvc2V0dXAuYyBcCisgICAgdG95cy9vdGhlci9sc2F0dHIuYyBcCisgICAgdG95cy9vdGhlci9sc21vZC5jIFwKKyAgICB0b3lzL290aGVyL2xzdXNiLmMgXAorICAgIHRveXMvb3RoZXIvbWFrZWRldnMuYyBcCisgICAgdG95cy9vdGhlci9ta3N3YXAuYyBcCisgICAgdG95cy9vdGhlci9tb2RpbmZvLmMgXAorICAgIHRveXMvb3RoZXIvbW91bnRwb2ludC5jIFwKKyAgICB0b3lzL290aGVyL25iZF9jbGllbnQuYyBcCisgICAgdG95cy9vdGhlci9wYXJ0cHJvYmUuYyBcCisgICAgdG95cy9vdGhlci9waXZvdF9yb290LmMgXAorICAgIHRveXMvb3RoZXIvcG1hcC5jIFwKKyAgICB0b3lzL290aGVyL3ByaW50ZW52LmMgXAorICAgIHRveXMvb3RoZXIvcHdkeC5jIFwKKyAgICB0b3lzL290aGVyL3JlYWRsaW5rLmMgXAorICAgIHRveXMvb3RoZXIvcmVhbHBhdGguYyBcCisgICAgdG95cy9vdGhlci9yZXYuYyBcCisgICAgdG95cy9vdGhlci9ybW1vZC5jIFwKKyAgICB0b3lzL290aGVyL3NldGZhdHRyLmMgXAorICAgIHRveXMvb3RoZXIvc2V0c2lkLmMgXAorICAgIHRveXMvb3RoZXIvc3RhdC5jIFwKKyAgICB0b3lzL290aGVyL3N3YXBvZmYuYyBcCisgICAgdG95cy9vdGhlci9zd2Fwb24uYyBcCisgICAgdG95cy9vdGhlci9zeXNjdGwuYyBcCisgICAgdG95cy9vdGhlci90YWMuYyBcCisgICAgdG95cy9vdGhlci90YXNrc2V0LmMgXAorICAgIHRveXMvb3RoZXIvdGltZW91dC5jIFwKKyAgICB0b3lzL290aGVyL3RydW5jYXRlLmMgXAorICAgIHRveXMvb3RoZXIvdXB0aW1lLmMgXAorICAgIHRveXMvb3RoZXIvdXNsZWVwLmMgXAorICAgIHRveXMvb3RoZXIvdmNvbmZpZy5jIFwKKyAgICB0b3lzL290aGVyL3Ztc3RhdC5jIFwKKyAgICB0b3lzL290aGVyL3doaWNoLmMgXAorICAgIHRveXMvb3RoZXIveHhkLmMgXAorICAgIHRveXMvb3RoZXIveWVzLmMgXAorICAgIHRveXMvcGVuZGluZy9kZC5jIFwKKyAgICB0b3lzL3BlbmRpbmcvZXhwci5jIFwKKyAgICB0b3lzL3BlbmRpbmcvZ2V0ZmF0dHIuYyBcCisgICAgdG95cy9wZW5kaW5nL2xzb2YuYyBcCisgICAgdG95cy9wZW5kaW5nL21vcmUuYyBcCisgICAgdG95cy9wZW5kaW5nL3Rhci5jIFwKKyAgICB0b3lzL3BlbmRpbmcvdHIuYyBcCisgICAgdG95cy9wZW5kaW5nL3RyYWNlcm91dGUuYyBcCisgICAgdG95cy9wb3NpeC9iYXNlbmFtZS5jIFwKKyAgICB0b3lzL3Bvc2l4L2NhbC5jIFwKKyAgICB0b3lzL3Bvc2l4L2NhdC5jIFwKKyAgICB0b3lzL3Bvc2l4L2NoZ3JwLmMgXAorICAgIHRveXMvcG9zaXgvY2htb2QuYyBcCisgICAgdG95cy9wb3NpeC9ja3N1bS5jIFwKKyAgICB0b3lzL3Bvc2l4L2NtcC5jIFwKKyAgICB0b3lzL3Bvc2l4L2NvbW0uYyBcCisgICAgdG95cy9wb3NpeC9jcC5jIFwKKyAgICB0b3lzL3Bvc2l4L2NwaW8uYyBcCisgICAgdG95cy9wb3NpeC9jdXQuYyBcCisgICAgdG95cy9wb3NpeC9kYXRlLmMgXAorICAgIHRveXMvcG9zaXgvZGYuYyBcCisgICAgdG95cy9wb3NpeC9kaXJuYW1lLmMgXAorICAgIHRveXMvcG9zaXgvZHUuYyBcCisgICAgdG95cy9wb3NpeC9lY2hvLmMgXAorICAgIHRveXMvcG9zaXgvZW52LmMgXAorICAgIHRveXMvcG9zaXgvZXhwYW5kLmMgXAorICAgIHRveXMvcG9zaXgvZmFsc2UuYyBcCisgICAgdG95cy9wb3NpeC9maWxlLmMgXAorICAgIHRveXMvcG9zaXgvZmluZC5jIFwKKyAgICB0b3lzL3Bvc2l4L2dyZXAuYyBcCisgICAgdG95cy9wb3NpeC9oZWFkLmMgXAorICAgIHRveXMvcG9zaXgvaWQuYyBcCisgICAgdG95cy9wb3NpeC9raWxsLmMgXAorICAgIHRveXMvcG9zaXgvbG4uYyBcCisgICAgdG95cy9wb3NpeC9scy5jIFwKKyAgICB0b3lzL3Bvc2l4L21rZGlyLmMgXAorICAgIHRveXMvcG9zaXgvbWtmaWZvLmMgXAorICAgIHRveXMvcG9zaXgvbmljZS5jIFwKKyAgICB0b3lzL3Bvc2l4L25sLmMgXAorICAgIHRveXMvcG9zaXgvbm9odXAuYyBcCisgICAgdG95cy9wb3NpeC9vZC5jIFwKKyAgICB0b3lzL3Bvc2l4L3Bhc3RlLmMgXAorICAgIHRveXMvcG9zaXgvcGF0Y2guYyBcCisgICAgdG95cy9wb3NpeC9wcmludGYuYyBcCisgICAgdG95cy9wb3NpeC9wcy5jIFwKKyAgICB0b3lzL3Bvc2l4L3B3ZC5jIFwKKyAgICB0b3lzL3Bvc2l4L3JlbmljZS5jIFwKKyAgICB0b3lzL3Bvc2l4L3JtLmMgXAorICAgIHRveXMvcG9zaXgvcm1kaXIuYyBcCisgICAgdG95cy9wb3NpeC9zZWQuYyBcCisgICAgdG95cy9wb3NpeC9zbGVlcC5jIFwKKyAgICB0b3lzL3Bvc2l4L3NvcnQuYyBcCisgICAgdG95cy9wb3NpeC9zcGxpdC5jIFwKKyAgICB0b3lzL3Bvc2l4L3N0cmluZ3MuYyBcCisgICAgdG95cy9wb3NpeC90YWlsLmMgXAorICAgIHRveXMvcG9zaXgvdGVlLmMgXAorICAgIHRveXMvcG9zaXgvdGltZS5jIFwKKyAgICB0b3lzL3Bvc2l4L3RvdWNoLmMgXAorICAgIHRveXMvcG9zaXgvdHJ1ZS5jIFwKKyAgICB0b3lzL3Bvc2l4L3R0eS5jIFwKKyAgICB0b3lzL3Bvc2l4L3VsaW1pdC5jIFwKKyAgICB0b3lzL3Bvc2l4L3VuYW1lLmMgXAorICAgIHRveXMvcG9zaXgvdW5pcS5jIFwKKyAgICB0b3lzL3Bvc2l4L3djLmMgXAorICAgIHRveXMvcG9zaXgveGFyZ3MuYyBcCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLXN0ZD1jOTkgXAorICAgIC1PcyBcCisgICAgLVduby1jaGFyLXN1YnNjcmlwdHMgXAorICAgIC1Xbm8tc2lnbi1jb21wYXJlIFwKKyAgICAtV25vLXN0cmluZy1wbHVzLWludCBcCisgICAgLVduby11bmluaXRpYWxpemVkIFwKKyAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorICAgIC1mdW5zaWduZWQtY2hhciBcCisgICAgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMgXAorICAgIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgXAorCit0b3lib3hfdXBzdHJlYW1fdmVyc2lvbiA6PSAkKHNoZWxsIGF3ayAnbWF0Y2goJCQwLCAvVE9ZQk9YX1ZFUlNJT04uKiIoLiopIi8sIGFyeSkge3ByaW50IGFyeVsxXX0nICQoTE9DQUxfUEFUSCkvbWFpbi5jKQordG95Ym94X3NoYSA6PSAkKHNoZWxsIGdpdCAtQyAkKExPQ0FMX1BBVEgpIHJldi1wYXJzZSAtLXNob3J0PTEyIEhFQUQgMj4vZGV2L251bGwpCisKK3RveWJveF92ZXJzaW9uIDo9ICQodG95Ym94X3Vwc3RyZWFtX3ZlcnNpb24pLSQodG95Ym94X3NoYSktYW5kcm9pZAorTE9DQUxfQ0ZMQUdTICs9IC1EVE9ZQk9YX1ZFUlNJT049JyIkKHRveWJveF92ZXJzaW9uKSInCisKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlic2VsaW51eCBsaWJjcnlwdG8KKworIyBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHJldmVudCB1cyBmcm9tIGRyYWdnaW5nIGluIGxpYmMrKyBhdCBydW50aW1lCisjIGJlY2F1c2UgbGlibmV0ZF9jbGllbnQuc28gaXMgQysrLgorTE9DQUxfQ1hYX1NUTCA6PSBub25lCisKK0xPQ0FMX01PRFVMRSA6PSB0b3lib3gKKworIyBkdXBlczogZGQKKyMgdXNlbGVzcz86IGZyZWVyYW1kaXNrIGZzZnJlZXplIGluc3RhbGwgbWFrZWRldnMgbWtmaWZvIG5iZC1jbGllbnQKKyMgICAgICAgICAgIHBhcnRwcm9iZSBwaXZvdF9yb290IHB3ZHggcmV2IHJma2lsbCB2Y29uZmlnCisjIHByZWZlciBCU0QgbmV0Y2F0IGluc3RlYWQ/OiBuYyBuZXRjYXQKKyMgcHJlZmVyIGVmczJwcm9ncyBpbnN0ZWFkPzogYmxraWQgY2hhdHRyIGxzYXR0cgorCitBTExfVE9PTFMgOj0gXAorICAgIGFjcGkgXAorICAgIGJhc2U2NCBcCisgICAgYmFzZW5hbWUgXAorICAgIGJsb2NrZGV2IFwKKyAgICBiemNhdCBcCisgICAgY2FsIFwKKyAgICBjYXQgXAorICAgIGNoY29uIFwKKyAgICBjaGdycCBcCisgICAgY2htb2QgXAorICAgIGNob3duIFwKKyAgICBjaHJvb3QgXAorICAgIGNrc3VtIFwKKyAgICBjbGVhciBcCisgICAgY29tbSBcCisgICAgY21wIFwKKyAgICBjcCBcCisgICAgY3BpbyBcCisgICAgY3V0IFwKKyAgICBkYXRlIFwKKyAgICBkZiBcCisgICAgZGlybmFtZSBcCisgICAgZG1lc2cgXAorICAgIGRvczJ1bml4IFwKKyAgICBkdSBcCisgICAgZWNobyBcCisgICAgZW52IFwKKyAgICBleHBhbmQgXAorICAgIGV4cHIgXAorICAgIGZhbGxvY2F0ZSBcCisgICAgZmFsc2UgXAorICAgIGZpbGUgXAorICAgIGZpbmQgXAorICAgIGZsb2NrIFwKKyAgICBmcmVlIFwKKyAgICBnZXRlbmZvcmNlIFwKKyAgICBnZXRwcm9wIFwKKyAgICBncm91cHMgXAorICAgIGhlYWQgXAorICAgIGhvc3RuYW1lIFwKKyAgICBod2Nsb2NrIFwKKyAgICBpZCBcCisgICAgaWZjb25maWcgXAorICAgIGlub3RpZnlkIFwKKyAgICBpbnNtb2QgXAorICAgIGlvbmljZSBcCisgICAgaW9yZW5pY2UgXAorICAgIGtpbGwgXAorICAgIGtpbGxhbGwgXAorICAgIGxvYWRfcG9saWN5IFwKKyAgICBsbiBcCisgICAgbG9nIFwKKyAgICBsb2duYW1lIFwKKyAgICBsb3NldHVwIFwKKyAgICBscyBcCisgICAgbHNtb2QgXAorICAgIGxzb2YgXAorICAgIGxzdXNiIFwKKyAgICBtZDVzdW0gXAorICAgIG1rZGlyIFwKKyAgICBta25vZCBcCisgICAgbWtzd2FwIFwKKyAgICBta3RlbXAgXAorICAgIG1vZGluZm8gXAorICAgIG1vcmUgXAorICAgIG1vdW50IFwKKyAgICBtb3VudHBvaW50IFwKKyAgICBtdiBcCisgICAgbmV0c3RhdCBcCisgICAgbmljZSBcCisgICAgbmwgXAorICAgIG5vaHVwIFwKKyAgICBvZCBcCisgICAgcGFzdGUgXAorICAgIHBhdGNoIFwKKyAgICBwZ3JlcCBcCisgICAgcGlkb2YgXAorICAgIHBraWxsIFwKKyAgICBwbWFwIFwKKyAgICBwcmludGVudiBcCisgICAgcHJpbnRmIFwKKyAgICBwcyBcCisgICAgcHdkIFwKKyAgICByZWFkbGluayBcCisgICAgcmVhbHBhdGggXAorICAgIHJlbmljZSBcCisgICAgcmVzdG9yZWNvbiBcCisgICAgcm0gXAorICAgIHJtZGlyIFwKKyAgICBybW1vZCBcCisgICAgcnVuY29uIFwKKyAgICBzZWQgXAorICAgIHNlbmRldmVudCBcCisgICAgc2VxIFwKKyAgICBzZXRlbmZvcmNlIFwKKyAgICBzZXRwcm9wIFwKKyAgICBzZXRzaWQgXAorICAgIHNoYTFzdW0gXAorICAgIHNoYTIyNHN1bSBcCisgICAgc2hhMjU2c3VtIFwKKyAgICBzaGEzODRzdW0gXAorICAgIHNoYTUxMnN1bSBcCisgICAgc2xlZXAgXAorICAgIHNvcnQgXAorICAgIHNwbGl0IFwKKyAgICBzdGFydCBcCisgICAgc3RhdCBcCisgICAgc3RvcCBcCisgICAgc3RyaW5ncyBcCisgICAgc3dhcG9mZiBcCisgICAgc3dhcG9uIFwKKyAgICBzeW5jIFwKKyAgICBzeXNjdGwgXAorICAgIHRhYyBcCisgICAgdGFpbCBcCisgICAgdGFyIFwKKyAgICB0YXNrc2V0IFwKKyAgICB0ZWUgXAorICAgIHRpbWUgXAorICAgIHRpbWVvdXQgXAorICAgIHRvcCBcCisgICAgdG91Y2ggXAorICAgIHRyIFwKKyAgICB0cnVlIFwKKyAgICB0cnVuY2F0ZSBcCisgICAgdHR5IFwKKyAgICB1bGltaXQgXAorICAgIHVtb3VudCBcCisgICAgdW5hbWUgXAorICAgIHVuaXEgXAorICAgIHVuaXgyZG9zIFwKKyAgICB1cHRpbWUgXAorICAgIHVzbGVlcCBcCisgICAgdm1zdGF0IFwKKyAgICB3YyBcCisgICAgd2hpY2ggXAorICAgIHdob2FtaSBcCisgICAgeGFyZ3MgXAorICAgIHh4ZCBcCisgICAgeWVzIFwKKworIyBJbnN0YWxsIHRoZSBzeW1saW5rcy4KK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSAkKGZvcmVhY2ggdCwkKEFMTF9UT09MUyksbG4gLXNmIHRveWJveCAkKFRBUkdFVF9PVVQpL2Jpbi8kKHQpOykKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS90b3lib3gvQ29uZmlnLmluIGIvdG95Ym94L0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmIyZWYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L0NvbmZpZy5pbgpAQCAtMCwwICsxLDE2NSBAQAorbWFpbm1lbnUgIlRveWJveCBDb25maWd1cmF0aW9uIgorCisKK3NvdXJjZSBnZW5lcmF0ZWQvQ29uZmlnLnByb2JlZAorc291cmNlIGdlbmVyYXRlZC9Db25maWcuaW4KKworY29tbWVudCAiIgorCittZW51ICJUb3lib3ggZ2xvYmFsIHNldHRpbmdzIgorCisjIFRoaXMgZW50cnkgY29udHJvbHMgdGhlIG11bHRpcGxleGVyLCBkaXNhYmxlZCBmb3Igc2luZ2xlIGNvbW1hbmQgYnVpbGRzCitjb25maWcgVE9ZQk9YCisJYm9vbAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVzYWdlOiB0b3lib3ggWy0tbG9uZyB8IC0tdmVyc2lvbiB8IFtjb21tYW5kXSBbYXJndW1lbnRzLi4uXV0KKworCSAgV2l0aCBubyBhcmd1bWVudHMsIHNob3dzIGF2YWlsYWJsZSBjb21tYW5kcy4gRmlyc3QgYXJndW1lbnQgaXMKKwkgIG5hbWUgb2YgYSBjb21tYW5kIHRvIHJ1biwgZm9sbG93ZWQgYnkgYW55IGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQuCisKKwkgIC0tbG9uZwlTaG93IHBhdGggdG8gZWFjaCBjb21tYW5kCisJICAtLXZlcnNpb24JU2hvdyB0b3lib3ggdmVyc2lvbgorCisJICBUbyBpbnN0YWxsIGNvbW1hbmQgc3ltbGlua3MsIHRyeToKKwkgICAgZm9yIGkgaW4gJCgvYmluL3RveWJveCAtLWxvbmcpOyBkbyBsbiAtcyAvYmluL3RveWJveCAkaTsgZG9uZQorCitjb25maWcgVE9ZQk9YX1NVSUQKKwlib29sICJTVUlEIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFNldCBVc2VyIElEIGJpdCwgdG8gaW5zdGFsbCB0b3lib3ggc3VpZCByb290IGFuZCBkcm9wCisJICBwZXJtaXNzaW9ucyBmb3IgY29tbWFuZHMgd2hpY2ggZG8gbm90IHJlcXVpcmUgcm9vdCBhY2Nlc3MuIFRvIHVzZQorCSAgdGhpcyBjaGFuZ2Ugb3duZXJzaGlwIG9mIHRoZSBmaWxlIHRvIHRoZSByb290IHVzZXIgYW5kIHNldCB0aGUgc3VpZAorCSAgYml0IGluIHRoZSBmaWxlIHBlcm1pc3Npb25zOgorCisJICBjaG93biByb290OnJvb3QgdG95Ym94OyBjaG1vZCArcyB0b3lib3gKKworY2hvaWNlCisJcHJvbXB0ICJTZWN1cml0eSBCbGFua2V0IgorCWRlZmF1bHQgVE9ZQk9YX0xTTV9OT05FCisJaGVscAorCSAgU2VsZWN0IGEgTGludXggU2VjdXJpdHkgTW9kdWxlIHRvIGNvbXBsaWNhdGUgeW91ciBzeXN0ZW0KKwkgIHVudGlsIHlvdSBjYW4ndCBmaW5kIGhvbGVzIGluIGl0LgorCitjb25maWcgVE9ZQk9YX0xTTV9OT05FCisJYm9vbCAiTm9uZSIKKwloZWxwCisgICAgICAgICAgRG9uJ3QgdHJ5IHRvIGFjaGlldmUgIndhdGVydGlnaHQiIGJ5IHBsdWdnaW5nIHRoZSBob2xlcyBpbiBhCisgICAgICAgICAgY29sbGFuZGVyLCBpbnN0ZWFkIHVzZSBjb252ZW50aW9uYWwgdW5peCBzZWN1cml0eSAoYW5kIHBvc3NpYmx5CisgICAgICAgICAgTGludXggQ29udGFpbmVycykgZm9yIGEgc2ltcGxlIHN0cmFpZ2h0Zm9yd2FyZCBzeXN0ZW0uCisJICAKK2NvbmZpZyBUT1lCT1hfU0VMSU5VWAorCWJvb2wgIlNFTGludXggc3VwcG9ydCIKKwloZWxwCisJICBJbmNsdWRlIFNFTGludXggb3B0aW9ucyBpbiBjb21tYW5kcyBzdWNoIGFzIGxzLCBhbmQgYWRkCisJICBTRUxpbnV4LXNwZWNpZmljIGNvbW1hbmRzIHN1Y2ggYXMgY2hjb24gdG8gdGhlIEFuZHJvaWQgbWVudS4KKworY29uZmlnIFRPWUJPWF9TTUFDSworCWJvb2wgIlNNQUNLIHN1cHBvcnQiCisJaGVscAorCSAgSW5jbHVkZSBTTUFDSyBvcHRpb25zIGluIGNvbW1hbmRzIGxpa2UgbHMgZm9yIHN5c3RlbXMgbGlrZSBUaXplbi4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBUT1lCT1hfTElCQ1JZUFRPCisgICAgICAgYm9vbCAiVXNlIGxpYmNyeXB0byAoT3BlblNTTC9Cb3JpbmdTU0wpIgorICAgICAgIGRlZmF1bHQgbgorICAgICAgIGhlbHAKKyAgICAgICAgIFVzZSBmYXN0ZXIgaGFzaCBmdW5jdGlvbnMgb3V0IG9mIGV4dGVyYWwgLWxjcnlwdG8gbGlicmFyeS4KKworY29uZmlnIFRPWUJPWF9GTE9BVAorCWJvb2wgIkZsb2F0aW5nIHBvaW50IHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSW5jbHVkZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGluZnJhc3RydWN0dXJlIGFuZCBjb21tYW5kcyB0aGF0CisJICByZXF1aXJlIGl0LgorCitjb25maWcgVE9ZQk9YX0hFTFAKKwlib29sICJIZWxwIG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEluY2x1ZGUgaGVscCB0ZXh0IGZvciBlYWNoIGNvbW1hbmQuCisKK2NvbmZpZyBUT1lCT1hfSEVMUF9EQVNIREFTSAorCWJvb2wgIi0taGVscCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRPWUJPWF9IRUxQCisJaGVscAorCSAgU3VwcG9ydCAtLWhlbHAgYXJndW1lbnQgaW4gYWxsIGNvbW1hbmRzLCBldmVuIG9uZXMgd2l0aCBhIE5VTEwKKwkgIG9wdHN0cmluZy4gUHJvZHVjZXMgdGhlIHNhbWUgb3V0cHV0IGFzICJoZWxwIGNvbW1hbmQiLgorCitjb25maWcgVE9ZQk9YX0kxOE4KKwlib29sICJJbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFVURi04IGNoYXJhY3RlciBzZXRzLCBhbmQgc29tZSBsb2NhbGUgc3VwcG9ydC4KKworY29uZmlnIFRPWUJPWF9GUkVFCisJYm9vbCAiRnJlZSBtZW1vcnkgdW5uZWNlc3NhcmlseSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBXaGVuIGEgcHJvZ3JhbSBleGl0cywgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBjbGVhbiB1cCBhZnRlciBpdAorCSAgKGZyZWUgbWVtb3J5LCBjbG9zZSBmaWxlcywgZXRjKS4gVG8gc2F2ZSBzaXplLCB0b3lib3ggdXN1YWxseSByZWxpZXMKKwkgIG9uIHRoaXMgYmVoYXZpb3IuIElmIHlvdSdyZSBydW5uaW5nIHRveWJveCB1bmRlciBhIGRlYnVnZ2VyIG9yCisJICB3aXRob3V0IGEgcmVhbCBPUyAoYWxhIG5ld2xpYitsaWJnbG9zcyksIGVuYWJsZSB0aGlzIHRvIG1ha2UgdG95Ym94CisJICBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisKK2NvbmZpZyBUT1lCT1hfTk9SRUNVUlNFCisJYm9vbCAiRGlzYWJsZSByZWN1cnNpdmUgZXhlY3V0aW9uIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFdoZW4gb25lIHRveWJveCBjb21tYW5kIGNhbGxzIGFub3RoZXIsIHVzdWFsbHkgaXQganVzdCBjYWxscyB0aGUgbmV3CisJICBjb21tYW5kJ3MgbWFpbigpIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgJFBBVEggYW5kIGNhbGxpbmcKKwkgIGV4ZWMgb24gYW5vdGhlciBmaWxlICh3aGljaCBpcyBtdWNoIHNsb3dlcikuCisKKwkgIFRoaXMgZGlzYWJsZXMgdGhhdCBvcHRpbWl6YXRpb24sIHNvIHRveWJveCB3aWxsIHJ1biBleHRlcm5hbCBjb21tYW5kcworICAgICAgICAgIGV2ZW4gd2hlbiBpdCBoYXMgYSBidWlsdC1pbiB2ZXJzaW9uIG9mIHRoYXQgY29tbWFuZC4gVGhpcyByZXF1aXJlcworICAgICAgICAgIHRveWJveCBzeW1saW5rcyB0byBiZSBpbnN0YWxsZWQgaW4gdGhlICRQQVRILCBvciByZS1pbnZva2luZyB0aGUKKyAgICAgICAgICAidG95Ym94IiBtdWx0aXBsZXhlciBjb21tYW5kIGJ5IG5hbWUuCisKK2NvbmZpZyBUT1lCT1hfREVCVUcKKwlib29sICJEZWJ1Z2dpbmcgdGVzdHMiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIGV4dHJhIGNoZWNrcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBBbGwgb2YgdGhlbSBjYXRjaAorCSAgdGhpbmdzIHRoYXQgY2FuIG9ubHkgZ28gd3JvbmcgYXQgZGV2ZWxvcG1lbnQgdGltZSwgbm90IHJ1bnRpbWUuCisKK2NvbmZpZyBUT1lCT1hfVUlEX1NZUworCWludCAiRmlyc3Qgc3lzdGVtIFVJRCIKKwlkZWZhdWx0IDEwMAorCWhlbHAKKwkgIFdoZW4gY29tbWFuZHMgbGlrZSB1c2VyYWRkL2dyb3VwYWRkIGFsbG9jYXRlIHN5c3RlbSBJRHMsIHN0YXJ0IGhlcmUuCisKK2NvbmZpZyBUT1lCT1hfVUlEX1VTUgorCWludCAiRmlyc3QgdXNlciBVSUQiCisJZGVmYXVsdCA1MDAKKwloZWxwCisJICBXaGVuIGNvbW1hbmRzIGxpa2UgdXNlcmFkZC9ncm91cGFkZCBhbGxvY2F0ZSB1c2VyIElEcywgc3RhcnQgaGVyZS4KKworY29uZmlnIFRPWUJPWF9NVVNMX05PTU1VX0lTX0JST0tFTgorCWJvb2wgIldvcmthcm91bmQgZm9yIG11c2wtbGliYyBicmVha2FnZSBvbiBub21tdSBzeXN0ZW1zLiIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBXaGVuIHVzaW5nIG11c2wtbGliYyBvbiBhIG5vbW11IHN5c3RlbSwgeW91J2xsIG5lZWQgdG8gc2F5ICJ5IiBoZXJlLgorCisJICBBbHRob3VnaCB1Y2xpYmMgbGV0cyB5b3UgZGV0ZWN0IHN1cHBvcnQgZm9yIHRoaW5ncyBsaWtlIGZvcmsoKSBhbmQKKwkgIGRhZW1vbigpIGF0IGNvbXBpbGUgdGltZSwgbXVzbCBpbnRlbnRpb25hbGx5IGluY2x1ZGVzIGJyb2tlbiB2ZXJzaW9ucworCSAgdGhhdCBhbHdheXMgcmV0dXJuIC1FTk9TWVMgb24gbm9tbXUgc3lzdGVtcywgYW5kIGdvZXMgb3V0IG9mIGl0cyB3YXkKKwkgIHRvIHByZXZlbnQgYW55IGNyb3NzLWNvbXBpbGUgY29tcGF0aWJsZSBjb21waWxlLXRpbWUgcHJvYmVzIGZvciBhCisJICBub21tdSBzeXN0ZW0uCisKKwkgIE11c2wgZG9lcyB0aGlzIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBhIG5vbW11IHN5c3RlbSBjYW4ndCBldmVuIHJ1bgorCSAgc3RhbmRhcmQgRUxGIGJpbmFyaWVzLCBhbmQgcmVxdWlyZXMgc3BlY2lhbGx5IHBhY2thZ2VkIGV4ZWN1dGFibGVzLgorCSAgKFlvdSBjYW4ndCBldmVuIGNoZWNrIGEgI2RlZmluZSB0byBzZWUgdGhhdCB5b3UncmUgYnVpbGRpbmcgYWdhaW5zdAorCSAgbXVzbCwgZHVlIHRvIGl0cyBtYWludGFpbmVyJ3MgcG9saWN5IHRoYXQgbXVzbCBuZXZlciBoYXMgYnVncyB0aGF0CisJICByZXF1aXJlIHdvcmthcm91bmRzLikKKworCSAgU28gb3VyIG9ubHkgY2hvaWNlIGlzIHRvIG1hbnVhbGx5IHByb3ZpZGUgYSBtdXNsIG5vbW11IGJ1ZyB3b3JrYXJvdW5kCisJICB5b3UgY2FuIG1hbnVhbGx5IHNlbGVjdCB0byBlbmFibGUgKGxhcmdlciwgc2xvd2VyKSBub21tdSBzdXBwb3J0IHdpdGgKKwkgIG11c2wuCisKKwkgIFlvdSBkb24ndCBuZWVkIHRoaXMgZm9yIHVDbGliYywgd2UgaGF2ZSBhIGNvbXBpbGUgdGltZSBwcm9iZSB0aGF0CisJICBhdXRvZGV0ZWN0cyBub21tdSBzdXBwb3J0IHRoZXJlLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS90b3lib3gvTElDRU5TRSBiL3RveWJveC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWEwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvTElDRU5TRQpAQCAtMCwwICsxLDE2IEBACitDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMTMgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CitwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKK0FOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKK1dIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKK09SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyhOb3RlOiBzb21lIGJ1aWxkIGluZnJhc3RydWN0dXJlIGluIHRoZSBrY29uZmlnIGRpcmVjdG9yeSBpcyBzdGlsbCBHUEx2MiwKK2NsZWFuaW5nIHRoYXQgb3V0IGlzIGEgVE9ETyBpdGVtLCBidXQgaXQgZG9lc24ndCBhZmZlY3QgdGhlIHJlc3VsdGluZworYmluYXJ5LikKZGlmZiAtLWdpdCBhL3RveWJveC9NT0RVTEVfTElDRU5TRV9CU0QgYi90b3lib3gvTU9EVUxFX0xJQ0VOU0VfQlNECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvTU9EVUxFX0xJQ0VOU0VfQlNECmRpZmYgLS1naXQgYS90b3lib3gvTWFrZWZpbGUgYi90b3lib3gvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExZDYyNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9NYWtlZmlsZQpAQCAtMCwwICsxLDg0IEBACisjIE1ha2VmaWxlIGZvciB0b3lib3guCisjIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKKyMgSWYgcGVvcGxlIHNldCB0aGVzZSBvbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUsIHVzZSAnZW0KKyMgTm90ZSB0aGF0IENDIGRlZmF1bHRzIHRvICJjYyIgc28gdGhlIG9uZSBpbiBjb25maWd1cmUgZG9lc24ndCBnZXQKKyMgdXNlZCB3aGVuIHNjcmlwdHMvbWFrZS5zaCBhbmQgY2FyZSBjYWxsZWQgdGhyb3VnaCAibWFrZSIuCisKK0hPU1RDQz89Y2MKKworZXhwb3J0IENST1NTX0NPTVBJTEUgQ0ZMQUdTIE9QVElNSVpFIExET1BUSU1JWkUgQ0MgSE9TVENDIFYKKworYWxsOiB0b3lib3gKKworS0NPTkZJR19DT05GSUcgPz0gLmNvbmZpZworCit0b3lib3hfc3R1ZmY6ICQoS0NPTkZJR19DT05GSUcpICouW2NoXSBsaWIvKi5bY2hdIHRveXMvKi5oIHRveXMvKi8qLmMgc2NyaXB0cy8qLnNoCisKK3RveWJveCBnZW5lcmF0ZWQvdW5zdHJpcHBlZC90b3lib3g6IHRveWJveF9zdHVmZgorCXNjcmlwdHMvbWFrZS5zaAorCisuUEhPTlk6IGNsZWFuIGRpc3RjbGVhbiBiYXNlbGluZSBibG9hdGNoZWNrIGluc3RhbGwgaW5zdGFsbF9mbGF0IFwKKwl1aW5zdGFsbCB1bmluc3RhbGxfZmxhdCB0ZXN0cyBoZWxwIHRveWJveF9zdHVmZiBjaGFuZ2UgXAorCWxpc3QgbGlzdF93b3JraW5nIGxpc3RfcGVuZGluZworCitpbmNsdWRlIGtjb25maWcvTWFrZWZpbGUKKy1pbmNsdWRlIC5zaW5nbGVtYWtlCisKKyQoS0NPTkZJR19DT05GSUcpOiAkKEtDT05GSUdfVE9QKQorJChLQ09ORklHX1RPUCk6IGdlbmVyYXRlZC9Db25maWcuaW4KK2dlbmVyYXRlZC9Db25maWcuaW46IHRveXMvKi8qLmMgc2NyaXB0cy9nZW5jb25maWcuc2gKKwlzY3JpcHRzL2dlbmNvbmZpZy5zaAorCisjIERldmVsb3BtZW50IHRhcmdldHMKK2Jhc2VsaW5lOiBnZW5lcmF0ZWQvdW5zdHJpcHBlZC90b3lib3gKKwlAY3AgZ2VuZXJhdGVkL3Vuc3RyaXBwZWQvdG95Ym94IGdlbmVyYXRlZC91bnN0cmlwcGVkL3RveWJveF9vbGQKKworYmxvYXRjaGVjazogdG95Ym94X29sZCBnZW5lcmF0ZWQvdW5zdHJpcHBlZC90b3lib3gKKwlAc2NyaXB0cy9ibG9hdGNoZWNrIGdlbmVyYXRlZC91bnN0cmlwcGVkL3RveWJveF9vbGQgZ2VuZXJhdGVkL3Vuc3RyaXBwZWQvdG95Ym94CisKK2luc3RhbGxfZmxhdDoKKwlzY3JpcHRzL2luc3RhbGwuc2ggLS1zeW1saW5rIC0tZm9yY2UKKworaW5zdGFsbDoKKwlzY3JpcHRzL2luc3RhbGwuc2ggLS1sb25nIC0tc3ltbGluayAtLWZvcmNlCisKK3VuaW5zdGFsbF9mbGF0OgorCXNjcmlwdHMvaW5zdGFsbC5zaCAtLXVuaW5zdGFsbAorCit1bmluc3RhbGw6CisJc2NyaXB0cy9pbnN0YWxsLnNoIC0tbG9uZyAtLXVuaW5zdGFsbAorCitjaGFuZ2U6CisJc2NyaXB0cy9jaGFuZ2Uuc2gKKworY2xlYW46OgorCXJtIC1yZiB0b3lib3ggZ2VuZXJhdGVkIGNoYW5nZSAuc2luZ2xlY29uZmlnKgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgdG95Ym94X29sZCAuY29uZmlnKiAuc2luZ2xlbWFrZQorCit0ZXN0czoKKwlzY3JpcHRzL3Rlc3Quc2gKKworaGVscDo6CisJQGVjaG8gICcgIHRveWJveCAgICAgICAgICAtIEJ1aWxkIHRveWJveC4nCisJQGVjaG8gICcgIENPTU1BTkROQU1FICAgICAtIEJ1aWxkIGluZGl2aWR1YWwgdG95Ym94IGNvbW1hbmQgYXMgYSBzdGFuZGFsb25lIGJpbmFyeS4nCisJQGVjaG8gICcgIGxpc3QgICAgICAgICAgICAtIExpc3QgQ09NTUFORE5BTUVzIHlvdSBjYW4gYnVpbGQgc3RhbmRhbG9uZS4nCisJQGVjaG8gICcgIGxpc3RfcGVuZGluZyAgICAtIExpc3QgdW5maW5pc2hlZCBDT01NQU5ETkFNRXMgb3V0IG9mIHRveXMvcGVuZGluZy4nCisJQGVjaG8gICcgIGNoYW5nZSAgICAgICAgICAtIEJ1aWxkIGVhY2ggY29tbWFuZCBzdGFuZGFsb25lIHVuZGVyIGNoYW5nZS8uJworCUBlY2hvICAnICBiYXNlbGluZSAgICAgICAgLSBDcmVhdGUgdG95Ym94X29sZCBmb3IgdXNlIGJ5IGJsb2F0Y2hlY2suJworCUBlY2hvICAnICBibG9hdGNoZWNrICAgICAgLSBSZXBvcnQgc2l6ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9sZCBhbmQgY3VycmVudCB2ZXJzaW9ucycKKwlAZWNobyAgJyAgdGVzdF9DT01NQU5EICAgIC0gUnVuIHRlc3RzIGZvciBDT01NQU5EICh0ZXN0X3BzLCB0ZXN0X2NhdCwgZXRjLiknCisJQGVjaG8gICcgIHRlc3RzICAgICAgICAgICAtIFJ1biB0ZXN0IHN1aXRlIGFnYWluc3QgYWxsIGNvbXBpbGVkIGNvbW1hbmRzLicKKwlAZWNobyAgJyAgICAgICAgICAgICAgICAgICAgZXhwb3J0IFRFU1RfSE9TVD0xIHRvIHRlc3QgaG9zdCBjb21tYW5kLCBWRVJCT1NFPTEnCisJQGVjaG8gICcgICAgICAgICAgICAgICAgICAgIHRvIHNob3cgZGlmZiwgVkVSQk9TRT1mYWlsIHRvIHN0b3AgYWZ0ZXIgZmlyc3QgZmFpbHVyZS4nCisJQGVjaG8gICcgIGNsZWFuICAgICAgICAgICAtIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMuJworCUBlY2hvICAiICBkaXN0Y2xlYW4gICAgICAgLSBEZWxldGUgZXZlcnl0aGluZyB0aGF0IGlzbid0IHNoaXBwZWQuIgorCUBlY2hvICAnICBpbnN0YWxsX2ZsYXQgICAgLSBJbnN0YWxsIHRveWJveCBpbnRvICQkUFJFRklYIGRpcmVjdG9yeS4nCisJQGVjaG8gICcgIGluc3RhbGwgICAgICAgICAtIEluc3RhbGwgdG95Ym94IGludG8gc3ViZGlyZWN0b3JpZXMgb2YgJCRQUkVGSVguJworCUBlY2hvICAnICB1bmluc3RhbGxfZmxhdCAgLSBSZW1vdmUgdG95Ym94IGZyb20gJCRQUkVGSVggZGlyZWN0b3J5LicKKwlAZWNobyAgJyAgdW5pbnN0YWxsICAgICAgIC0gUmVtb3ZlIHRveWJveCBmcm9tIHN1YmRpcmVjdG9yaWVzIG9mICQkUFJFRklYLicKKwlAZWNobyAgJycKKwlAZWNobyAgJ2V4YW1wbGU6IENGTEFHUz0iLS1zdGF0aWMiIENST1NTX0NPTVBJTEU9YXJtdjVsLSBtYWtlIGRlZmNvbmZpZyB0b3lib3ggaW5zdGFsbCcKKwlAZWNobyAgJycKZGlmZiAtLWdpdCBhL3RveWJveC9OT1RJQ0UgYi90b3lib3gvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWEwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvTk9USUNFCkBAIC0wLDAgKzEsMTYgQEAKK0NvcHlyaWdodCAoQykgMjAwNiwgMjAxMyBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKK3B1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCitXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCitBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKE5vdGU6IHNvbWUgYnVpbGQgaW5mcmFzdHJ1Y3R1cmUgaW4gdGhlIGtjb25maWcgZGlyZWN0b3J5IGlzIHN0aWxsIEdQTHYyLAorY2xlYW5pbmcgdGhhdCBvdXQgaXMgYSBUT0RPIGl0ZW0sIGJ1dCBpdCBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0aW5nCitiaW5hcnkuKQpkaWZmIC0tZ2l0IGEvdG95Ym94L1JFQURNRSBiL3RveWJveC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyMzMwOQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9SRUFETUUKQEAgLTAsMCArMSwxNzggQEAKK1RveWJveDogYWxsLWluLW9uZSBMaW51eCBjb21tYW5kIGxpbmUuCisKKy0tLSBHZXR0aW5nIHN0YXJ0ZWQKKworWW91IGNhbiBkb3dubG9hZCBzdGF0aWMgYmluYXJpZXMgZm9yIHZhcmlvdXMgdGFyZ2V0cyBmcm9tOgorCisgIGh0dHA6Ly9sYW5kbGV5Lm5ldC90b3lib3gvYmluCisKK1RoZSBzcGVjaWFsIG5hbWUgIi4iIGluZGljYXRlcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGp1c3QgbGlrZSAiLi4iIG1lYW5zCit0aGUgcGFyZW50IGRpcmVjdG9yeSksIGFuZCB5b3UgY2FuIHJ1biBhIHByb2dyYW0gdGhhdCBpc24ndCBpbiB0aGUgJFBBVEggYnkKK3NwZWNpZnlpbmcgYSBwYXRoIHRvIGl0LCBzbyB0aGlzIHNob3VsZCB3b3JrOgorCisgIHdnZXQgaHR0cDovL2xhbmRsZXkubmV0L3RveWJveC9iaW4vdG95Ym94LXg4Nl82NAorICBjaG1vZCAreCB0b3lib3gteDg2XzY0CisgIC4vdG95Ym94LXg4Nl82NCBlY2hvIGhlbGxvIHdvcmxkCisKKy0tLSBCdWlsZGluZyB0b3lib3gKKworVHlwZSAibWFrZSBoZWxwIiBmb3IgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorCitUb3lib3ggdXNlcyB0aGUgIm1ha2UgbWVudWNvbmZpZzsgbWFrZTsgbWFrZSBpbnN0YWxsIiBpZGlvbSBzYW1lIGFzCit0aGUgTGludXgga2VybmVsLiBVc3VhbGx5IHlvdSB3YW50IHNvbWV0aGluZyBsaWtlOgorCisgIG1ha2UgZGVmY29uZmlnCisgIG1ha2UKKyAgbWFrZSBpbnN0YWxsCisKK09yIG1heWJlOgorCisgIExERkxBR1M9Ii0tc3RhdGljIiBDUk9TU19DT01QSUxFPWFybXY1bC0gbWFrZSBkZWZjb25maWcgdG95Ym94CisgIFBSRUZJWD0vcGF0aC90by9yb290L2ZpbGVzeXN0ZW0vYmluIG1ha2UgaW5zdGFsbF9mbGF0CisKK1RoZSBmaWxlICJjb25maWd1cmUiIGRlZmluZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIG1hbnkgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgdGhlIHRveWJveCBidWlsZDsgaWYgeW91IHNldCBhIHZhbHVlIGZvciBhbnkgb2YKK3RoZXNlLCB5b3VyIHZhbHVlIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBpbiB0aGF0IGZpbGUuCisKK1RoZSBDUk9TU19DT01QSUxFIGFyZ3VtZW50IGFib3ZlIGlzIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBidWlsZHMgYSB2ZXJzaW9uIG9mCit0b3lib3ggdG8gcnVuIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUuIENyb3NzIGNvbXBpbGluZyByZXF1aXJlcyBhbiBhcHByb3ByaWF0ZWx5CitwcmVmaXhlZCBjcm9zcyBjb21waWxlciB0b29sY2hhaW4sIHNldmVyYWwgZXhhbXBsZSB0b29sY2hhaW5zIGFyZSBhdmFpbGFibGUgYXQ6CisKKyAgaHR0cDsvL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYmluCisKK0ZvciB0aGUgIkNST1NTX0NPTVBJTEU9YXJtdjVsLSIgZXhhbXBsZSBhYm92ZSwgZG93bmxvYWQKK2Nyb3NzLWNvbXBpbGVyLWFybXY1bC50YXIuYnoyLCBleHRyYWN0IGl0LCBhbmQgYWRkIGl0cyAiYmluIiBzdWJkaXJlY3RvcnkgdG8KK3lvdXIgJFBBVEguIChBbmQgeWVzLCB0aGUgdHJhaWxpbmcgLSBpcyBzaWduaWZpY2FudCwgYmVjYXVzZSB0aGUgcHJlZml4CitpbmNsdWRlcyBhIGRhc2guKQorCitGb3IgbW9yZSBhYm91dCBjcm9zcyBjb21waWxpbmcsIHNlZToKKworICBodHRwOi8vbGFuZGxleS5uZXQvd3JpdGluZy9kb2NzL2Nyb3NzLWNvbXBpbGluZy5odG1sCisgIGh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL2FyY2hpdGVjdHVyZXMuaHRtbAorCitGb3IgYSBtb3JlIHRob3JvdWdoIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3lib3ggYnVpbGQgcHJvY2Vzcywgc2VlCitodHRwOi8vbGFuZGxleS5uZXQvdG95Ym94L2NvZGUuaHRtbCNidWlsZGluZworCistLS0gVXNpbmcgdG95Ym94CisKK1RoZSB0b3lib3ggYnVpbGQgcHJvZHVjZXMgYSBtdWx0aWNhbGwgYmluYXJ5LCBhICJzd2lzcy1hcm15LWtuaWZlIiBwcm9ncmFtCit0aGF0IGFjdHMgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBuYW1lIGl0IHdhcyBjYWxsZWQgYnkgKGNwLCBtdiwgY2F0Li4uKS4KK0luc3RhbGxpbmcgdG95Ym94IGFkZHMgc3ltbGlua3MgZm9yIGVhY2ggY29tbWFuZCBuYW1lIHRvIHRoZSAkUEFUSC4KKworVGhlIHNwZWNpYWwgInRveWJveCIgY29tbWFuZCB0cmVhdHMgaXRzIGZpcnN0IGFyZ3VtZW50IGFzIHRoZSBjb21tYW5kIHRvIHJ1bi4KK1dpdGggbm8gYXJndW1lbnRzLCBpdCBsaXN0cyBhdmFpbGFibGUgY29tbWFuZHMuIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgdG95Ym94Cit3aXRob3V0IGluc3RhbGxpbmcgaXQuIFRoaXMgaXMgdGhlIG9ubHkgY29tbWFuZCB0aGF0IGNhbiBoYXZlIGFuIGFyYml0cmFyeQorc3VmZml4IChoZW5jZSAidG95Ym94LWFybXY1bCIpLgorCitUaGUgImhlbHAiIGNvbW1hbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb21tYW5kIChhbGEgImhlbHAgY2F0IikuCisKKy0tLSBDb25maWd1cmluZyB0b3lib3gKKworSXQgd29ya3MgbGlrZSB0aGUgTGludXgga2VybmVsOiBhbGxub2NvbmZpZywgZGVmY29uZmlnLCBhbmQgbWVudWNvbmZpZyBlZGl0CithICIuY29uZmlnIiBmaWxlIHRoYXQgc2VsZWN0cyB3aGljaCBmZWF0dXJlcyB0byBpbmNsdWRlIGluIHRoZSByZXN1bHRpbmcKK2JpbmFyeS4gWW91IGNhbiBzYXZlIGFuZCByZS11c2UgeW91ciAuY29uZmlnIGZpbGUsIGFsdGhvdWdoIG1heSB3YW50IHRvCitydW4gIm1ha2Ugb2xkY29uZmlnIiB0byByZS1ydW4gdGhlIGRlcGVuZGVuY3kgcmVzb2x2ZXIgd2hlbiBtaWdyYXRpbmcgdG8KK25ldyB2ZXJzaW9ucy4KKworVGhlIG1heGltdW0gc2FuZSBjb25maWd1cmF0aW9uIGlzICJtYWtlIGRlZmNvbmZpZyI6IGFsbHllc2NvbmZpZyBpc24ndAorcmVjb21tZW5kZWQgZm9yIHRveWJveCBiZWNhdXNlIGl0IGVuYWJsZXMgdW5maW5pc2hlZCBjb21tYW5kcyBhbmQgZGVidWcgY29kZS4KKworLS0tIENyZWF0aW5nIGEgVG95Ym94LWJhc2VkIExpbnV4IHN5c3RlbQorCitUb3lib3ggaXMgbm90IGEgY29tcGxldGUgb3BlcmF0aW5nIHN5c3RlbSwgaXQncyBhIHByb2dyYW0gdGhhdCBydW5zIHVuZGVyCithbiBvcGVyYXRpbmcgc3lzdGVtLiBCb290aW5nIGEgc2ltcGxlIHN5c3RlbSB0byBhIHNoZWxsIHByb21wdCByZXF1aXJlcwordGhyZWUgcGFja2FnZXM6IGFuIG9wZXJhdGluZyBzeXN0ZW0ga2VybmVsIChMaW51eCopIHRvIGRyaXZlIHRoZSBoYXJkd2FyZSwKK29uZSBvciBtb3JlIHByb2dyYW1zIGZvciB0aGUgc3lzdGVtIHRvIHJ1biAodG95Ym94KSwgYW5kIGEgQyBsaWJyYXJ5ICgibGliYyIpCit0byB0aWUgdGhlbSB0b2dldGhlciAodG95Ym94IGhhcyBiZWVuIHRlc3RlZCB3aXRoIG11c2wsIHVDbGliYywgZ2xpYmMsCithbmQgYmlvbmljKS4KKworVGhlIEMgbGlicmFyeSBpcyBwYXJ0IG9mIGEgInRvb2xjaGFpbiIsIHdoaWNoIGlzIGFuIGludGVncmF0ZWQgc3VpdGUKK29mIGNvbXBpbGVyLCBhc3NlbWJsZXIsIGFuZCBsaW5rZXIsIHBsdXMgdGhlIHN0YW5kYXJkIGhlYWRlcnMgYW5kIGxpYnJhcmllcworbmVjZXNzYXJ5IHRvIGJ1aWxkIEMgcHJvZ3JhbXMuIChBbmQgbWlzY2VsbGFuZW91cyBiaW5hcmllcyBsaWtlIG5tIGFuZCBvYmpkdW1wLikKKworU3RhdGljIGxpbmtpbmcgKHdpdGggdGhlIC0tc3RhdGljIG9wdGlvbikgY29waWVzIHRoZSBzaGFyZWQgbGlicmFyeSBjb250ZW50cworaW50byB0aGUgcHJvZ3JhbSwgcmVzdWx0aW5nIGluIGxhcmdlciBidXQgbW9yZSBwb3J0YWJsZSBwcm9ncmFtcywgd2hpY2gKK2NhbiBydW4gZXZlbiBpZiB0aGV5J3JlIHRoZSBvbmx5IGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0uIE90aGVyd2lzZSwKK3RoZSAiZHluYW1pY2FsbHkiIGxpbmtlZCBwcm9ncmFtcyByZXF1aXJlIHRoZSBsaWJyYXJ5IGZpbGVzIHRvIGJlIHByZXNlbnQgb24KK3RoZSB0YXJnZXQgc3lzdGVtICgibWFuIGxkZCIgYW5kICJtYW4gbGQuc28iIGZvciBkZXRhaWxzKS4KKworQW4gZXhhbXBsZSB0b3lib3gtYmFzZWQgc3lzdGVtIGlzIEFib3JpZ2luYWwgTGludXg6CisKKyAgaHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYWJvdXQuaHRtbAorCitUaGF0J3MgZGVzaWduZWQgdG8gcnVuIHVuZGVyIHFlbXUsIGVtdWxhdGluZyBzZXZlcmFsIGRpZmZlcmVudCBoYXJkd2FyZQorYXJjaGl0ZWN0dXJlcyAoeDg2LCB4ODYtNjQsIGFybSwgbWlwcywgc3BhcmMsIHBvd2VycGMsIHNoNCkuIEVhY2ggdG95Ym94CityZWxlYXNlIGlzIHJlZ3Jlc3Npb24gdGVzdGVkIGJ5IGJ1aWxkaW5nIExpbnV4IEZyb20gU2NyYXRjaCB1bmRlciB0aGlzCit0b3lib3gtYmFzZWQgc3lzdGVtIG9uIGVhY2ggc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSwgdXNpbmcgUUVNVSB0byBlbXVsYXRlCitiaWcgYW5kIGxpdHRsZSBlbmRpYW4gc3lzdGVtcyB3aXRoIGRpZmZlcmVudCB3b3JkIHNpemUgYW5kIGFsaWdubWVudAorcmVxdWlyZW1lbnRzLiAoVGhlIGV2ZW50dWFsIGdvYWwgaXMgdG8gcmVwbGFjZSBMaW51eCBGcm9tIFNjcmF0Y2ggd2l0aAordGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdC4pCisKKyogT3Igc29tZXRoaW5nIHByb3ZpZGluZyB0aGUgc2FtZSBBUEkgc3VjaCBhcyBGcmVlQlNEJ3MgTGludXggZW11bGF0aW9uIGxheWVyLgorCistLS0gUHJlc2VudGF0aW9ucworCisxKSAiV2h5IFRveWJveD8iIHRhbGsgYXQgdGhlIEVtYmVkZGVkIExpbnV4IENvbmZlcmVuY2UgaW4gMjAxMworCisgICAgdmlkZW86IGh0dHA6Ly95b3V0dS5iZS9TR210UDVMZ190MAorICAgIG91dGxpbmU6IGh0dHA6Ly9sYW5kbGV5Lm5ldC90YWxrcy9jZWxmLTIwMTMudHh0CisgICAgbGlua2VkIGZyb20gaHR0cDovL2xhbmRsZXkubmV0L3RveWJveC8gaW4gbmF2IGJhciBvbiBsZWZ0IGFzICJXaHkgaXMgaXQ/IgorICAgIC0gbWFyY2ggMjEsIDIwMTMgZW50cnkgaGFzIHNlY3Rpb24gbGlua3MuCisKKzIpICJXaHkgUHVibGljIERvbWFpbj8iIFRoZSByaXNlIGFuZCBmYWxsIG9mIGNvcHlsZWZ0LCBPaGlvIExpbnV4RmVzdCAyMDEzCisKKyAgICBhdWRpbzogaHR0cHM6Ly9hcmNoaXZlLm9yZy9kb3dubG9hZC9PaGlvTGludXhmZXN0MjAxMy8yNC1Sb2JfTGFuZGxleS1UaGVfUmlzZV9hbmRfRmFsbF9vZl9Db3B5bGVmdC5tcDMKKyAgICBvdXRsaW5lOiBodHRwOi8vbGFuZGxleS5uZXQvdGFsa3Mvb2hpby0yMDEzLnR4dAorCiszKSBXaHkgZGlkIEkgZG8gQWJvcmlnaW5hbCBMaW51eCAod2hpY2ggbGVkIG1lIGhlcmUpCisKKyAgICAyNjAgc2xpZGUgcHJlc2VudGF0aW9uOgorICAgIGh0dHBzOi8vc3BlYWtlcmRlY2suY29tL2xhbmRsZXkvZGV2ZWxvcGluZy1mb3Itbm9uLXg4Ni10YXJnZXRzLXVzaW5nLXFlbXUKKworICAgIEhvdyBhbmQgd2h5IHRvIG1ha2UgYW5kcm9pZCBzZWxmLWhvc3Rpbmc6CisgICAgICBodHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9hYm91dC5odG1sI3NlbGZob3N0CisKKzQpIFdoYXQncyBuZXcgd2l0aCB0b3lib3ggKEVMQyAyMDE1IHN0YXR1cyB1cGRhdGUpOgorCisgICAgdmlkZW86IGh0dHA6Ly9lbGludXgub3JnL0VMQ18yMDE1X1ByZXNlbnRhdGlvbnMKKyAgICBvdXRsaW5lOiBodHRwOi8vbGFuZGxleS5uZXQvdGFsa3MvY2VsZi0yMDE1LnR4dAorCistLS0gQ29udHJpYnV0aW5nCisKK1RoZSB0aHJlZSBpbXBvcnRhbnQgVVJMcyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSB0b3lib3ggcHJvamVjdCBhcmU6CisKKyAgd2ViIHBhZ2U6IGh0dHA6Ly9sYW5kbGV5Lm5ldC90b3lib3gKKworICBtYWlsaW5nIGxpc3Q6IGh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9saXN0aW5mby5jZ2kvdG95Ym94LWxhbmRsZXkubmV0CisKKyAgZ2l0IHJlcG86IGh0dHA6Ly9naXRodWIuY29tL2xhbmRsZXkvdG95Ym94CisKK1RoZSBtYWludGFpbmVyIHByZWZlcnMgcGF0Y2hlcyBiZSBzZW50IHRvIHRoZSBtYWlsaW5nIGxpc3QuIElmIHlvdSB1c2UgZ2l0LAordGhlIGVhc3kgdGhpbmcgdG8gZG8gaXM6CisKKyAgZ2l0IGZvcm1hdC1wYXRjaCAtMSAkSEFTSAorCitUaGVuIHNlbmQgYSBmaWxlIGF0dGFjaG1lbnQuIFRoZSBsaXN0IGhvbGRzIG1lc3NhZ2VzIGZyb20gbm9uLXN1YnNjcmliZXJzCitmb3IgbW9kZXJhdGlvbiwgYnV0IEkgdXN1YWxseSBnZXQgdG8gdGhlbSBpbiBhIGRheSBvciB0d28uCisKK0FsdGhvdWdoIEkgZG8gYWNjZXB0IHB1bGwgcmVxdWVzdHMgb24gZ2l0aHViLCBJIGRvd25sb2FkIHRoZSBwYXRjaGVzIGFuZAorYXBwbHkgdGhlbSB3aXRoICJnaXQgYW0iICh3aGljaCBhdm9pZHMgZ3JhdHVpdG91cyBtZXJnZSBjb21taXRzKS4gQ2xvc2luZwordGhlIHB1bGwgcmVxdWVzdCBpcyB0aGVuIHRoZSBzdWJtaXR0ZXIncyByZXNwb25zaWJpbGl0eS4KKworSWYgSSBoYXZlbid0IHJlc3BvbmRlZCB0byB5b3VyIHBhdGNoIGFmdGVyIG9uZSB3ZWVrLCBmZWVsIGZyZWUgdG8gcmVtaW5kCittZSBvZiBpdC4KKworQW5kcm9pZCdzIHBvbGljeSBmb3IgdG95Ym94IHBhdGNoZXMgaXMgdGhhdCBub24tYnVpbGQgcGF0Y2hlcyBzaG91bGQgZ28KK3Vwc3RyZWFtIGZpcnN0IChpbnRvIHZhbmlsbGEgdG95Ym94LCB3aXRoIGRpc2N1c3Npb24gb24gdGhlIHRveWJveCBtYWlsaW5nCitsaXN0KSBhbmQgdGhlbiBiZSBwdWxsZWQgaW50byBhbmRyb2lkJ3MgdG95Ym94IHJlcG8gZnJvbSB0aGVyZS4gKFRoZXkKK2dlbmVyYWxseSByZXN5bmMgb24gZnJpZGF5cykuIFRoZSBleGNlcHRpb24gaXMgcGF0Y2hlcyB0byB0aGVpciBidWlsZCBzY3JpcHRzCisoQW5kcm9pZC5tayBhbmQgdGhlIGNoZWNrZWQtaW4gZ2VuZXJhdGVkLyogZmlsZXMpIHdoaWNoIGdvIGRpcmVjdGx5IHRvIEFPU1AuCisKKy0tLSBDb2RlIG9mIGNvbmR1Y3QKKworV2UncmUgdXNpbmcgdHdpdHRlcidzIGh0dHBzOi8vZW5naW5lZXJpbmcudHdpdHRlci5jb20vb3BlbnNvdXJjZS9jb2RlLW9mLWNvbmR1Y3QKK2V4Y2VwdCBlbWFpbCByb2JAbGFuZGxleS5uZXQgd2l0aCBjb21wbGFpbnRzLgorCisoWWVzLCBJIHRyeSB0byBwYXkgbW9yZSBhdHRlbnRpb24gdG8gbWFyZ2luYWxpemVkIHByb2dyYW1tZXJzLCB3aGljaCBzb21laG93CittYW5hZ2VzIHRvIGluY2x1ZGUgNTElIG9mIHRoZSBwb3B1bGF0aW9uLiBJZiBzb21lYm9keSBoYXMgdG8gYmUgdGhyZWUgdGltZXMgYXMKK2dvb2QgdG8gZ2V0IGhhbGYgdGhlIHJlY29nbml0aW9uLCB3aHkgV09VTEROJ1QgeW91IGFkanVzdCBmb3IgdGhhdD8pCmRpZmYgLS1naXQgYS90b3lib3gvY29uZmlndXJlIGIvdG95Ym94L2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEwZjZlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2NvbmZpZ3VyZQpAQCAtMCwwICsxLDI1IEBACisjIFRveWJveCBjb25maWd1cmF0aW9uIGZpbGUuCisKKyMgVGhpcyBzZXRzIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIGJ5IHNjcmlwdHMvbWFrZS5zaAorCisjIEEgc3lub255bS4KK1sgLXogIiRDUk9TU19DT01QSUxFIiBdICYmIENST1NTX0NPTVBJTEU9IiRDUk9TUyIKKworIyBDRkxBR1MgYW5kIE9QVElNSVpFIGFyZSBkaWZmZXJlbnQgc28geW91IGNhbiBhZGQgZXh0cmEgQ0ZMQUdTIHdpdGhvdXQKKyMgZGlzYWJsaW5nIGRlZmF1bHQgb3B0aW1pemF0aW9ucworWyAteiAiJENGTEFHUyIgXSAmJiBDRkxBR1M9Ii1XYWxsIC1XdW5kZWYgLVduby1jaGFyLXN1YnNjcmlwdHMiCisjIFJlcXVpcmVkIGZvciBvdXIgZXhwZWN0ZWQgQUJJLiB3ZSdyZSA4LWJpdCBjbGVhbiB0aHVzICJjaGFyIiBtdXN0IGJlIHVuc2lnbmVkLgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdW5zaWduZWQtY2hhciIKK1sgLXogIiRPUFRJTUlaRSIgXSAmJiBPUFRJTUlaRT0iLU9zIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLWZuby1zdHJpY3QtYWxpYXNpbmciCisKKyMgV2UgYWNjZXB0IExERkxBR1MsIGJ1dCBieSBkZWZhdWx0IGRvbid0IGhhdmUgYW55dGhpbmcgaW4gaXQKK1sgLXogIiRMRE9QVElNSVpFIiBdICYmIExET1BUSU1JWkU9Ii1XbCwtLWdjLXNlY3Rpb25zIgorCisjIFRoZSBtYWtlZmlsZSBwcm92aWRlcyBkZWZhdWx0cyBmb3IgdGhlc2UsIHNvIHRoaXMgb25seSBnZXRzIHVzZWQgaWYKKyMgeW91IGNhbGwgc2NyaXB0cy9tYWtlLnNoIGFuZCBmcmllbmRzIGRpcmVjdGx5LgorCitbIC16ICIkQ0MiIF0gJiYgQ0M9Y2MKKworIyBJZiBIT1NUQ0MgbmVlZHMgQ0ZMQUdTIG9yIExERkxBR1MsIGp1c3QgYWRkIHRoZW0gdG8gdGhlIHZhcmlhYmxlCisjIGFsYSBIT1NUQ0M9ImJsYWgtY2MgLS1zdGF0aWMiCitbIC16ICIkSE9TVENDIiBdICYmIEhPU1RDQz1jYwpkaWZmIC0tZ2l0IGEvdG95Ym94L2dlbmVyYXRlZC9jb25maWcuaCBiL3RveWJveC9nZW5lcmF0ZWQvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2OWEzMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9nZW5lcmF0ZWQvY29uZmlnLmgKQEAgLTAsMCArMSw2MjIgQEAKKyNkZWZpbmUgQ0ZHX1RPWUJPWF9DT05UQUlORVIgMQorI2RlZmluZSBVU0VfVE9ZQk9YX0NPTlRBSU5FUiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfRkFMTE9DQVRFIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9GQUxMT0NBVEUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVE9ZQk9YX0ZJRlJFRVpFIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9GSUZSRUVaRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfRk9SSyAxCisjZGVmaW5lIFVTRV9UT1lCT1hfRk9SSyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfSUNPTlYgMQorI2RlZmluZSBVU0VfVE9ZQk9YX0lDT05WKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RPWUJPWF9PTl9BTkRST0lEIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9PTl9BTkRST0lEKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RPWUJPWF9TSEFET1cgMAorI2RlZmluZSBVU0VfVE9ZQk9YX1NIQURPVyguLi4pCisjZGVmaW5lIENGR19UT1lCT1hfVVRNUFggMAorI2RlZmluZSBVU0VfVE9ZQk9YX1VUTVBYKC4uLikKKyNkZWZpbmUgQ0ZHX0JBU0VOQU1FIDEKKyNkZWZpbmUgVVNFX0JBU0VOQU1FKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NBTCAxCisjZGVmaW5lIFVTRV9DQUwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ0FUIDEKKyNkZWZpbmUgVVNFX0NBVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19DQVRfViAxCisjZGVmaW5lIFVTRV9DQVRfViguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19DQVRWIDAKKyNkZWZpbmUgVVNFX0NBVFYoLi4uKQorI2RlZmluZSBDRkdfQ0hHUlAgMQorI2RlZmluZSBVU0VfQ0hHUlAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ0hPV04gMQorI2RlZmluZSBVU0VfQ0hPV04oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ0hNT0QgMQorI2RlZmluZSBVU0VfQ0hNT0QoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ0tTVU0gMQorI2RlZmluZSBVU0VfQ0tTVU0oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ01QIDEKKyNkZWZpbmUgVVNFX0NNUCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19DT01NIDEKKyNkZWZpbmUgVVNFX0NPTU0oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ1AgMQorI2RlZmluZSBVU0VfQ1AoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ1BfTU9SRSAxCisjZGVmaW5lIFVTRV9DUF9NT1JFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NQX1BSRVNFUlZFIDEKKyNkZWZpbmUgVVNFX0NQX1BSRVNFUlZFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01WIDEKKyNkZWZpbmUgVVNFX01WKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01WX01PUkUgMQorI2RlZmluZSBVU0VfTVZfTU9SRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19JTlNUQUxMIDEKKyNkZWZpbmUgVVNFX0lOU1RBTEwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ1BJTyAxCisjZGVmaW5lIFVTRV9DUElPKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NVVCAxCisjZGVmaW5lIFVTRV9DVVQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfREFURSAxCisjZGVmaW5lIFVTRV9EQVRFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0RGIDEKKyNkZWZpbmUgVVNFX0RGKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0RJUk5BTUUgMQorI2RlZmluZSBVU0VfRElSTkFNRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19EVSAxCisjZGVmaW5lIFVTRV9EVSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19FQ0hPIDEKKyNkZWZpbmUgVVNFX0VDSE8oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfRU5WIDEKKyNkZWZpbmUgVVNFX0VOViguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19FWFBBTkQgMQorI2RlZmluZSBVU0VfRVhQQU5EKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0ZBTFNFIDEKKyNkZWZpbmUgVVNFX0ZBTFNFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0ZJTEUgMQorI2RlZmluZSBVU0VfRklMRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19GSU5EIDEKKyNkZWZpbmUgVVNFX0ZJTkQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfR1JFUCAxCisjZGVmaW5lIFVTRV9HUkVQKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0VHUkVQIDEKKyNkZWZpbmUgVVNFX0VHUkVQKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0ZHUkVQIDEKKyNkZWZpbmUgVVNFX0ZHUkVQKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0hFQUQgMQorI2RlZmluZSBVU0VfSEVBRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19JRCAxCisjZGVmaW5lIFVTRV9JRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19JRF9aIDEKKyNkZWZpbmUgVVNFX0lEX1ooLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSU9OSUNFIDEKKyNkZWZpbmUgVVNFX0lPTklDRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19JT1JFTklDRSAxCisjZGVmaW5lIFVTRV9JT1JFTklDRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19HUk9VUFMgMQorI2RlZmluZSBVU0VfR1JPVVBTKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0xPR05BTUUgMQorI2RlZmluZSBVU0VfTE9HTkFNRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19XSE9BTUkgMQorI2RlZmluZSBVU0VfV0hPQU1JKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0tJTEwgMQorI2RlZmluZSBVU0VfS0lMTCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19LSUxMQUxMNSAwCisjZGVmaW5lIFVTRV9LSUxMQUxMNSguLi4pCisjZGVmaW5lIENGR19MSU5LIDAKKyNkZWZpbmUgVVNFX0xJTksoLi4uKQorI2RlZmluZSBDRkdfTE4gMQorI2RlZmluZSBVU0VfTE4oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTFMgMQorI2RlZmluZSBVU0VfTFMoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTFNfQ09MT1IgMQorI2RlZmluZSBVU0VfTFNfQ09MT1IoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTFNfWiAxCisjZGVmaW5lIFVTRV9MU19aKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01LRElSIDEKKyNkZWZpbmUgVVNFX01LRElSKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01LRElSX1ogMQorI2RlZmluZSBVU0VfTUtESVJfWiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19NS0ZJRk8gMQorI2RlZmluZSBVU0VfTUtGSUZPKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01LRklGT19aIDEKKyNkZWZpbmUgVVNFX01LRklGT19aKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01LTk9EIDEKKyNkZWZpbmUgVVNFX01LTk9EKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01LTk9EX1ogMQorI2RlZmluZSBVU0VfTUtOT0RfWiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19OSUNFIDEKKyNkZWZpbmUgVVNFX05JQ0UoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTkwgMQorI2RlZmluZSBVU0VfTkwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTk9IVVAgMQorI2RlZmluZSBVU0VfTk9IVVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTlBST0MgMAorI2RlZmluZSBVU0VfTlBST0MoLi4uKQorI2RlZmluZSBDRkdfT0QgMQorI2RlZmluZSBVU0VfT0QoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUEFTVEUgMQorI2RlZmluZSBVU0VfUEFTVEUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUEFUQ0ggMQorI2RlZmluZSBVU0VfUEFUQ0goLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUFJJTlRGIDEKKyNkZWZpbmUgVVNFX1BSSU5URiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19QUyAxCisjZGVmaW5lIFVTRV9QUyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UVE9QIDAKKyNkZWZpbmUgVVNFX1RUT1AoLi4uKQorI2RlZmluZSBDRkdfUFdEIDEKKyNkZWZpbmUgVVNFX1BXRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19SRU5JQ0UgMQorI2RlZmluZSBVU0VfUkVOSUNFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1JNIDEKKyNkZWZpbmUgVVNFX1JNKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1JNRElSIDEKKyNkZWZpbmUgVVNFX1JNRElSKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NFRCAxCisjZGVmaW5lIFVTRV9TRUQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0xFRVAgMQorI2RlZmluZSBVU0VfU0xFRVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0xFRVBfRkxPQVQgMQorI2RlZmluZSBVU0VfU0xFRVBfRkxPQVQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU09SVCAxCisjZGVmaW5lIFVTRV9TT1JUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NPUlRfQklHIDEKKyNkZWZpbmUgVVNFX1NPUlRfQklHKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NPUlRfRkxPQVQgMQorI2RlZmluZSBVU0VfU09SVF9GTE9BVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TUExJVCAxCisjZGVmaW5lIFVTRV9TUExJVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TVFJJTkdTIDEKKyNkZWZpbmUgVVNFX1NUUklOR1MoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVEFJTCAxCisjZGVmaW5lIFVTRV9UQUlMKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RBSUxfU0VFSyAxCisjZGVmaW5lIFVTRV9UQUlMX1NFRUsoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVEFTS1NFVCAxCisjZGVmaW5lIFVTRV9UQVNLU0VUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RFRSAxCisjZGVmaW5lIFVTRV9URUUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVElNRSAxCisjZGVmaW5lIFVTRV9USU1FKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RPVUNIIDEKKyNkZWZpbmUgVVNFX1RPVUNIKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RSVUUgMQorI2RlZmluZSBVU0VfVFJVRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UVFkgMQorI2RlZmluZSBVU0VfVFRZKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1VMSU1JVCAxCisjZGVmaW5lIFVTRV9VTElNSVQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVU5BTUUgMQorI2RlZmluZSBVU0VfVU5BTUUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVU5JUSAxCisjZGVmaW5lIFVTRV9VTklRKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1VOTElOSyAwCisjZGVmaW5lIFVTRV9VTkxJTksoLi4uKQorI2RlZmluZSBDRkdfVVVERUNPREUgMAorI2RlZmluZSBVU0VfVVVERUNPREUoLi4uKQorI2RlZmluZSBDRkdfVVVFTkNPREUgMAorI2RlZmluZSBVU0VfVVVFTkNPREUoLi4uKQorI2RlZmluZSBDRkdfVkkgMAorI2RlZmluZSBVU0VfVkkoLi4uKQorI2RlZmluZSBDRkdfV0MgMQorI2RlZmluZSBVU0VfV0MoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfV0hPIDAKKyNkZWZpbmUgVVNFX1dITyguLi4pCisjZGVmaW5lIENGR19YQVJHUyAxCisjZGVmaW5lIFVTRV9YQVJHUyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19YQVJHU19QRURBTlRJQyAwCisjZGVmaW5lIFVTRV9YQVJHU19QRURBTlRJQyguLi4pCisjZGVmaW5lIENGR19BUlAgMAorI2RlZmluZSBVU0VfQVJQKC4uLikKKyNkZWZpbmUgQ0ZHX0FSUElORyAwCisjZGVmaW5lIFVTRV9BUlBJTkcoLi4uKQorI2RlZmluZSBDRkdfQk9PVENIQVJURCAwCisjZGVmaW5lIFVTRV9CT09UQ0hBUlREKC4uLikKKyNkZWZpbmUgQ0ZHX0JSQ1RMIDAKKyNkZWZpbmUgVVNFX0JSQ1RMKC4uLikKKyNkZWZpbmUgQ0ZHX0NPTVBSRVNTIDAKKyNkZWZpbmUgVVNFX0NPTVBSRVNTKC4uLikKKyNkZWZpbmUgQ0ZHX0daSVAgMAorI2RlZmluZSBVU0VfR1pJUCguLi4pCisjZGVmaW5lIENGR19HWklQX0QgMAorI2RlZmluZSBVU0VfR1pJUF9EKC4uLikKKyNkZWZpbmUgQ0ZHX0RFQ09NUFJFU1MgMAorI2RlZmluZSBVU0VfREVDT01QUkVTUyguLi4pCisjZGVmaW5lIENGR19aQ0FUIDAKKyNkZWZpbmUgVVNFX1pDQVQoLi4uKQorI2RlZmluZSBDRkdfR1VOWklQIDAKKyNkZWZpbmUgVVNFX0dVTlpJUCguLi4pCisjZGVmaW5lIENGR19DUk9ORCAwCisjZGVmaW5lIFVTRV9DUk9ORCguLi4pCisjZGVmaW5lIENGR19DUk9OVEFCIDAKKyNkZWZpbmUgVVNFX0NST05UQUIoLi4uKQorI2RlZmluZSBDRkdfREQgMQorI2RlZmluZSBVU0VfREQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfREhDUDYgMAorI2RlZmluZSBVU0VfREhDUDYoLi4uKQorI2RlZmluZSBDRkdfREhDUCAwCisjZGVmaW5lIFVTRV9ESENQKC4uLikKKyNkZWZpbmUgQ0ZHX0RIQ1BEIDAKKyNkZWZpbmUgVVNFX0RIQ1BEKC4uLikKKyNkZWZpbmUgQ0ZHX0RFQlVHX0RIQ1AgMAorI2RlZmluZSBVU0VfREVCVUdfREhDUCguLi4pCisjZGVmaW5lIENGR19ESUZGIDAKKyNkZWZpbmUgVVNFX0RJRkYoLi4uKQorI2RlZmluZSBDRkdfRFVNUExFQVNFUyAwCisjZGVmaW5lIFVTRV9EVU1QTEVBU0VTKC4uLikKKyNkZWZpbmUgQ0ZHX0VYUFIgMQorI2RlZmluZSBVU0VfRVhQUiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19GRElTSyAwCisjZGVmaW5lIFVTRV9GRElTSyguLi4pCisjZGVmaW5lIENGR19GT0xEIDAKKyNkZWZpbmUgVVNFX0ZPTEQoLi4uKQorI2RlZmluZSBDRkdfRlNDSyAwCisjZGVmaW5lIFVTRV9GU0NLKC4uLikKKyNkZWZpbmUgQ0ZHX0ZUUEdFVCAwCisjZGVmaW5lIFVTRV9GVFBHRVQoLi4uKQorI2RlZmluZSBDRkdfR0VURkFUVFIgMQorI2RlZmluZSBVU0VfR0VURkFUVFIoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfR0VUVFkgMAorI2RlZmluZSBVU0VfR0VUVFkoLi4uKQorI2RlZmluZSBDRkdfR1JPVVBBREQgMAorI2RlZmluZSBVU0VfR1JPVVBBREQoLi4uKQorI2RlZmluZSBDRkdfR1JPVVBERUwgMAorI2RlZmluZSBVU0VfR1JPVVBERUwoLi4uKQorI2RlZmluZSBDRkdfSEVYRURJVCAwCisjZGVmaW5lIFVTRV9IRVhFRElUKC4uLikKKyNkZWZpbmUgQ0ZHX0hPU1QgMAorI2RlZmluZSBVU0VfSE9TVCguLi4pCisjZGVmaW5lIENGR19IV0NMT0NLIDEKKyNkZWZpbmUgVVNFX0hXQ0xPQ0soLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSUNPTlYgMAorI2RlZmluZSBVU0VfSUNPTlYoLi4uKQorI2RlZmluZSBDRkdfSU5JVCAwCisjZGVmaW5lIFVTRV9JTklUKC4uLikKKyNkZWZpbmUgQ0ZHX0lPVE9QIDAKKyNkZWZpbmUgVVNFX0lPVE9QKC4uLikKKyNkZWZpbmUgQ0ZHX0lQIDAKKyNkZWZpbmUgVVNFX0lQKC4uLikKKyNkZWZpbmUgQ0ZHX0lQQ1JNIDAKKyNkZWZpbmUgVVNFX0lQQ1JNKC4uLikKKyNkZWZpbmUgQ0ZHX0lQQ1MgMAorI2RlZmluZSBVU0VfSVBDUyguLi4pCisjZGVmaW5lIENGR19LTE9HRCAwCisjZGVmaW5lIFVTRV9LTE9HRCguLi4pCisjZGVmaW5lIENGR19LTE9HRF9TT1VSQ0VfUklOR19CVUZGRVIgMAorI2RlZmluZSBVU0VfS0xPR0RfU09VUkNFX1JJTkdfQlVGRkVSKC4uLikKKyNkZWZpbmUgQ0ZHX0xBU1QgMAorI2RlZmluZSBVU0VfTEFTVCguLi4pCisjZGVmaW5lIENGR19MT0dHRVIgMAorI2RlZmluZSBVU0VfTE9HR0VSKC4uLikKKyNkZWZpbmUgQ0ZHX0xTT0YgMQorI2RlZmluZSBVU0VfTFNPRiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19NREVWIDAKKyNkZWZpbmUgVVNFX01ERVYoLi4uKQorI2RlZmluZSBDRkdfTURFVl9DT05GIDAKKyNkZWZpbmUgVVNFX01ERVZfQ09ORiguLi4pCisjZGVmaW5lIENGR19NS0UyRlMgMAorI2RlZmluZSBVU0VfTUtFMkZTKC4uLikKKyNkZWZpbmUgQ0ZHX01LRTJGU19KT1VSTkFMIDAKKyNkZWZpbmUgVVNFX01LRTJGU19KT1VSTkFMKC4uLikKKyNkZWZpbmUgQ0ZHX01LRTJGU19HRU4gMAorI2RlZmluZSBVU0VfTUtFMkZTX0dFTiguLi4pCisjZGVmaW5lIENGR19NS0UyRlNfTEFCRUwgMAorI2RlZmluZSBVU0VfTUtFMkZTX0xBQkVMKC4uLikKKyNkZWZpbmUgQ0ZHX01LRTJGU19FWFRFTkRFRCAwCisjZGVmaW5lIFVTRV9NS0UyRlNfRVhURU5ERUQoLi4uKQorI2RlZmluZSBDRkdfTU9EUFJPQkUgMAorI2RlZmluZSBVU0VfTU9EUFJPQkUoLi4uKQorI2RlZmluZSBDRkdfTU9SRSAxCisjZGVmaW5lIFVTRV9NT1JFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX05FVFNUQVQgMQorI2RlZmluZSBVU0VfTkVUU1RBVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19PUEVOVlQgMAorI2RlZmluZSBVU0VfT1BFTlZUKC4uLikKKyNkZWZpbmUgQ0ZHX0RFQUxMT0NWVCAwCisjZGVmaW5lIFVTRV9ERUFMTE9DVlQoLi4uKQorI2RlZmluZSBDRkdfUEdSRVAgMQorI2RlZmluZSBVU0VfUEdSRVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUEtJTEwgMQorI2RlZmluZSBVU0VfUEtJTEwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUElORyAwCisjZGVmaW5lIFVTRV9QSU5HKC4uLikKKyNkZWZpbmUgQ0ZHX1JFU0VUIDAKKyNkZWZpbmUgVVNFX1JFU0VUKC4uLikKKyNkZWZpbmUgQ0ZHX1JPVVRFIDAKKyNkZWZpbmUgVVNFX1JPVVRFKC4uLikKKyNkZWZpbmUgQ0ZHX1NIIDAKKyNkZWZpbmUgVVNFX1NIKC4uLikKKyNkZWZpbmUgQ0ZHX0VYSVQgMAorI2RlZmluZSBVU0VfRVhJVCguLi4pCisjZGVmaW5lIENGR19DRCAwCisjZGVmaW5lIFVTRV9DRCguLi4pCisjZGVmaW5lIENGR19TRVRGQVRUUiAxCisjZGVmaW5lIFVTRV9TRVRGQVRUUiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TVUxPR0lOIDAKKyNkZWZpbmUgVVNFX1NVTE9HSU4oLi4uKQorI2RlZmluZSBDRkdfU1lTTE9HRCAwCisjZGVmaW5lIFVTRV9TWVNMT0dEKC4uLikKKyNkZWZpbmUgQ0ZHX1RBUiAxCisjZGVmaW5lIFVTRV9UQVIoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVENQU1ZEIDAKKyNkZWZpbmUgVVNFX1RDUFNWRCguLi4pCisjZGVmaW5lIENGR19URUxORVQgMAorI2RlZmluZSBVU0VfVEVMTkVUKC4uLikKKyNkZWZpbmUgQ0ZHX1RFTE5FVEQgMAorI2RlZmluZSBVU0VfVEVMTkVURCguLi4pCisjZGVmaW5lIENGR19URVNUIDAKKyNkZWZpbmUgVVNFX1RFU1QoLi4uKQorI2RlZmluZSBDRkdfVEZUUCAwCisjZGVmaW5lIFVTRV9URlRQKC4uLikKKyNkZWZpbmUgQ0ZHX1RGVFBEIDAKKyNkZWZpbmUgVVNFX1RGVFBEKC4uLikKKyNkZWZpbmUgQ0ZHX1RPUCAxCisjZGVmaW5lIFVTRV9UT1AoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVFJBQ0VST1VURSAxCisjZGVmaW5lIFVTRV9UUkFDRVJPVVRFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RSIDEKKyNkZWZpbmUgVVNFX1RSKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1VTRVJBREQgMAorI2RlZmluZSBVU0VfVVNFUkFERCguLi4pCisjZGVmaW5lIENGR19VU0VSREVMIDAKKyNkZWZpbmUgVVNFX1VTRVJERUwoLi4uKQorI2RlZmluZSBDRkdfV0FUQ0ggMAorI2RlZmluZSBVU0VfV0FUQ0goLi4uKQorI2RlZmluZSBDRkdfV0dFVCAwCisjZGVmaW5lIFVTRV9XR0VUKC4uLikKKyNkZWZpbmUgQ0ZHX1haQ0FUIDAKKyNkZWZpbmUgVVNFX1haQ0FUKC4uLikKKyNkZWZpbmUgQ0ZHX0FDUEkgMQorI2RlZmluZSBVU0VfQUNQSSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19CQVNFNjQgMQorI2RlZmluZSBVU0VfQkFTRTY0KC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0JMS0lEIDEKKyNkZWZpbmUgVVNFX0JMS0lEKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0ZTVFlQRSAwCisjZGVmaW5lIFVTRV9GU1RZUEUoLi4uKQorI2RlZmluZSBDRkdfQkxPQ0tERVYgMQorI2RlZmluZSBVU0VfQkxPQ0tERVYoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQlVOWklQMiAxCisjZGVmaW5lIFVTRV9CVU5aSVAyKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0JaQ0FUIDEKKyNkZWZpbmUgVVNFX0JaQ0FUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NIQ09OIDEKKyNkZWZpbmUgVVNFX0NIQ09OKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NIUk9PVCAxCisjZGVmaW5lIFVTRV9DSFJPT1QoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfQ0hWVCAwCisjZGVmaW5lIFVTRV9DSFZUKC4uLikKKyNkZWZpbmUgQ0ZHX0NMRUFSIDEKKyNkZWZpbmUgVVNFX0NMRUFSKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0NPVU5UIDAKKyNkZWZpbmUgVVNFX0NPVU5UKC4uLikKKyNkZWZpbmUgQ0ZHX0RPUzJVTklYIDEKKyNkZWZpbmUgVVNFX0RPUzJVTklYKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1VOSVgyRE9TIDEKKyNkZWZpbmUgVVNFX1VOSVgyRE9TKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0VKRUNUIDAKKyNkZWZpbmUgVVNFX0VKRUNUKC4uLikKKyNkZWZpbmUgQ0ZHX0ZBQ1RPUiAwCisjZGVmaW5lIFVTRV9GQUNUT1IoLi4uKQorI2RlZmluZSBDRkdfRkFMTE9DQVRFIDEKKyNkZWZpbmUgVVNFX0ZBTExPQ0FURSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19GTE9DSyAxCisjZGVmaW5lIFVTRV9GTE9DSyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19GUkVFIDEKKyNkZWZpbmUgVVNFX0ZSRUUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfRlJFRVJBTURJU0sgMQorI2RlZmluZSBVU0VfRlJFRVJBTURJU0soLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfRlNGUkVFWkUgMQorI2RlZmluZSBVU0VfRlNGUkVFWkUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfRlNZTkMgMAorI2RlZmluZSBVU0VfRlNZTkMoLi4uKQorI2RlZmluZSBDRkdfSEVMUCAxCisjZGVmaW5lIFVTRV9IRUxQKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0hFTFBfRVhUUkFTIDEKKyNkZWZpbmUgVVNFX0hFTFBfRVhUUkFTKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0hPU1RJRCAwCisjZGVmaW5lIFVTRV9IT1NUSUQoLi4uKQorI2RlZmluZSBDRkdfSUZDT05GSUcgMQorI2RlZmluZSBVU0VfSUZDT05GSUcoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSU5PVElGWUQgMQorI2RlZmluZSBVU0VfSU5PVElGWUQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSU5TTU9EIDEKKyNkZWZpbmUgVVNFX0lOU01PRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19MT0dJTiAwCisjZGVmaW5lIFVTRV9MT0dJTiguLi4pCisjZGVmaW5lIENGR19MT1NFVFVQIDEKKyNkZWZpbmUgVVNFX0xPU0VUVVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTFNBVFRSIDEKKyNkZWZpbmUgVVNFX0xTQVRUUiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19DSEFUVFIgMQorI2RlZmluZSBVU0VfQ0hBVFRSKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0xTTU9EIDEKKyNkZWZpbmUgVVNFX0xTTU9EKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0xTUENJIDAKKyNkZWZpbmUgVVNFX0xTUENJKC4uLikKKyNkZWZpbmUgQ0ZHX0xTUENJX1RFWFQgMQorI2RlZmluZSBVU0VfTFNQQ0lfVEVYVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19MU1VTQiAxCisjZGVmaW5lIFVTRV9MU1VTQiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19NQUtFREVWUyAxCisjZGVmaW5lIFVTRV9NQUtFREVWUyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19NSVggMAorI2RlZmluZSBVU0VfTUlYKC4uLikKKyNkZWZpbmUgQ0ZHX01LUEFTU1dEIDAKKyNkZWZpbmUgVVNFX01LUEFTU1dEKC4uLikKKyNkZWZpbmUgQ0ZHX01LU1dBUCAxCisjZGVmaW5lIFVTRV9NS1NXQVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTU9ESU5GTyAxCisjZGVmaW5lIFVTRV9NT0RJTkZPKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01PVU5UUE9JTlQgMQorI2RlZmluZSBVU0VfTU9VTlRQT0lOVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19OQkRfQ0xJRU5UIDEKKyNkZWZpbmUgVVNFX05CRF9DTElFTlQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTkVUQ0FUIDEKKyNkZWZpbmUgVVNFX05FVENBVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19ORVRDQVRfTElTVEVOIDEKKyNkZWZpbmUgVVNFX05FVENBVF9MSVNURU4oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVU5TSEFSRSAwCisjZGVmaW5lIFVTRV9VTlNIQVJFKC4uLikKKyNkZWZpbmUgQ0ZHX05TRU5URVIgMAorI2RlZmluZSBVU0VfTlNFTlRFUiguLi4pCisjZGVmaW5lIENGR19PTkVJVCAwCisjZGVmaW5lIFVTRV9PTkVJVCguLi4pCisjZGVmaW5lIENGR19QQVJUUFJPQkUgMQorI2RlZmluZSBVU0VfUEFSVFBST0JFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1BJVk9UX1JPT1QgMQorI2RlZmluZSBVU0VfUElWT1RfUk9PVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19QTUFQIDEKKyNkZWZpbmUgVVNFX1BNQVAoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUFJJTlRFTlYgMQorI2RlZmluZSBVU0VfUFJJTlRFTlYoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUFdEWCAxCisjZGVmaW5lIFVTRV9QV0RYKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1JFQURBSEVBRCAwCisjZGVmaW5lIFVTRV9SRUFEQUhFQUQoLi4uKQorI2RlZmluZSBDRkdfUkVBRExJTksgMQorI2RlZmluZSBVU0VfUkVBRExJTksoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUkVBTFBBVEggMQorI2RlZmluZSBVU0VfUkVBTFBBVEgoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUkVCT09UIDAKKyNkZWZpbmUgVVNFX1JFQk9PVCguLi4pCisjZGVmaW5lIENGR19SRVYgMQorI2RlZmluZSBVU0VfUkVWKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1JGS0lMTCAxCisjZGVmaW5lIFVTRV9SRktJTEwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfUk1NT0QgMQorI2RlZmluZSBVU0VfUk1NT0QoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0VUU0lEIDEKKyNkZWZpbmUgVVNFX1NFVFNJRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TSFJFRCAwCisjZGVmaW5lIFVTRV9TSFJFRCguLi4pCisjZGVmaW5lIENGR19TVEFUIDEKKyNkZWZpbmUgVVNFX1NUQVQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU1dBUE9GRiAxCisjZGVmaW5lIFVTRV9TV0FQT0ZGKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NXQVBPTiAxCisjZGVmaW5lIFVTRV9TV0FQT04oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU1dJVENIX1JPT1QgMAorI2RlZmluZSBVU0VfU1dJVENIX1JPT1QoLi4uKQorI2RlZmluZSBDRkdfU1lTQ1RMIDEKKyNkZWZpbmUgVVNFX1NZU0NUTCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UQUMgMQorI2RlZmluZSBVU0VfVEFDKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RBU0tTRVQgMQorI2RlZmluZSBVU0VfVEFTS1NFVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19USU1FT1VUIDEKKyNkZWZpbmUgVVNFX1RJTUVPVVQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVFJVTkNBVEUgMQorI2RlZmluZSBVU0VfVFJVTkNBVEUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVVBUSU1FIDEKKyNkZWZpbmUgVVNFX1VQVElNRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19VU0xFRVAgMQorI2RlZmluZSBVU0VfVVNMRUVQKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1ZDT05GSUcgMQorI2RlZmluZSBVU0VfVkNPTkZJRyguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19WTVNUQVQgMQorI2RlZmluZSBVU0VfVk1TVEFUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1cgMAorI2RlZmluZSBVU0VfVyguLi4pCisjZGVmaW5lIENGR19XSElDSCAxCisjZGVmaW5lIFVTRV9XSElDSCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19YWEQgMQorI2RlZmluZSBVU0VfWFhEKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1lFUyAxCisjZGVmaW5lIFVTRV9ZRVMoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfRE1FU0cgMQorI2RlZmluZSBVU0VfRE1FU0coLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSE9TVE5BTUUgMQorI2RlZmluZSBVU0VfSE9TVE5BTUUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfS0lMTEFMTCAxCisjZGVmaW5lIFVTRV9LSUxMQUxMKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX01ENVNVTSAxCisjZGVmaW5lIFVTRV9NRDVTVU0oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0hBMVNVTSAxCisjZGVmaW5lIFVTRV9TSEExU1VNKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NIQTIyNFNVTSAxCisjZGVmaW5lIFVTRV9TSEEyMjRTVU0oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0hBMjU2U1VNIDEKKyNkZWZpbmUgVVNFX1NIQTI1NlNVTSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TSEEzODRTVU0gMQorI2RlZmluZSBVU0VfU0hBMzg0U1VNKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NIQTUxMlNVTSAxCisjZGVmaW5lIFVTRV9TSEE1MTJTVU0oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTUtOT0QgMQorI2RlZmluZSBVU0VfTUtOT0QoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfTUtURU1QIDEKKyNkZWZpbmUgVVNFX01LVEVNUCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19NT1VOVCAxCisjZGVmaW5lIFVTRV9NT1VOVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19QQVNTV0QgMAorI2RlZmluZSBVU0VfUEFTU1dEKC4uLikKKyNkZWZpbmUgQ0ZHX1BJRE9GIDEKKyNkZWZpbmUgVVNFX1BJRE9GKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NFUSAxCisjZGVmaW5lIFVTRV9TRVEoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU1UgMAorI2RlZmluZSBVU0VfU1UoLi4uKQorI2RlZmluZSBDRkdfU1lOQyAxCisjZGVmaW5lIFVTRV9TWU5DKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1VNT1VOVCAxCisjZGVmaW5lIFVTRV9VTU9VTlQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfSEVMTE8gMAorI2RlZmluZSBVU0VfSEVMTE8oLi4uKQorI2RlZmluZSBDRkdfU0tFTEVUT04gMAorI2RlZmluZSBVU0VfU0tFTEVUT04oLi4uKQorI2RlZmluZSBDRkdfU0tFTEVUT05fQUxJQVMgMAorI2RlZmluZSBVU0VfU0tFTEVUT05fQUxJQVMoLi4uKQorI2RlZmluZSBDRkdfVEVTVF9IVU1BTl9SRUFEQUJMRSAwCisjZGVmaW5lIFVTRV9URVNUX0hVTUFOX1JFQURBQkxFKC4uLikKKyNkZWZpbmUgQ0ZHX1RFU1RfTUFOWV9PUFRJT05TIDAKKyNkZWZpbmUgVVNFX1RFU1RfTUFOWV9PUFRJT05TKC4uLikKKyNkZWZpbmUgQ0ZHX1RFU1RfU0NBTktFWSAwCisjZGVmaW5lIFVTRV9URVNUX1NDQU5LRVkoLi4uKQorI2RlZmluZSBDRkdfR0VURU5GT1JDRSAxCisjZGVmaW5lIFVTRV9HRVRFTkZPUkNFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX0dFVFBST1AgMQorI2RlZmluZSBVU0VfR0VUUFJPUCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19MT0FEX1BPTElDWSAxCisjZGVmaW5lIFVTRV9MT0FEX1BPTElDWSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19MT0cgMQorI2RlZmluZSBVU0VfTE9HKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1JFU1RPUkVDT04gMQorI2RlZmluZSBVU0VfUkVTVE9SRUNPTiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19SVU5DT04gMQorI2RlZmluZSBVU0VfUlVOQ09OKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NFTkRFVkVOVCAxCisjZGVmaW5lIFVTRV9TRU5ERVZFTlQoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfU0VURU5GT1JDRSAxCisjZGVmaW5lIFVTRV9TRVRFTkZPUkNFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1NFVFBST1AgMQorI2RlZmluZSBVU0VfU0VUUFJPUCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TVEFSVCAxCisjZGVmaW5lIFVTRV9TVEFSVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19TVE9QIDEKKyNkZWZpbmUgVVNFX1NUT1AoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVE9ZQk9YIDEKKyNkZWZpbmUgVVNFX1RPWUJPWCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfU1VJRCAxCisjZGVmaW5lIFVTRV9UT1lCT1hfU1VJRCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfTFNNX05PTkUgMAorI2RlZmluZSBVU0VfVE9ZQk9YX0xTTV9OT05FKC4uLikKKyNkZWZpbmUgQ0ZHX1RPWUJPWF9TRUxJTlVYIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9TRUxJTlVYKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RPWUJPWF9TTUFDSyAwCisjZGVmaW5lIFVTRV9UT1lCT1hfU01BQ0soLi4uKQorI2RlZmluZSBDRkdfVE9ZQk9YX0ZMT0FUIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9GTE9BVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfSEVMUCAxCisjZGVmaW5lIFVTRV9UT1lCT1hfSEVMUCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfSEVMUF9EQVNIREFTSCAxCisjZGVmaW5lIFVTRV9UT1lCT1hfSEVMUF9EQVNIREFTSCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfSTE4TiAxCisjZGVmaW5lIFVTRV9UT1lCT1hfSTE4TiguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENGR19UT1lCT1hfTElCQ1JZUFRPIDEKKyNkZWZpbmUgVVNFX1RPWUJPWF9MSUJDUllQVE8oLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBDRkdfVE9ZQk9YX0ZSRUUgMAorI2RlZmluZSBVU0VfVE9ZQk9YX0ZSRUUoLi4uKQorI2RlZmluZSBDRkdfVE9ZQk9YX05PUkVDVVJTRSAxCisjZGVmaW5lIFVTRV9UT1lCT1hfTk9SRUNVUlNFKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ0ZHX1RPWUJPWF9ERUJVRyAwCisjZGVmaW5lIFVTRV9UT1lCT1hfREVCVUcoLi4uKQorI2RlZmluZSBDRkdfVE9ZQk9YX1VJRF9TWVMgMTAwCisjZGVmaW5lIENGR19UT1lCT1hfVUlEX1VTUiA1MDAKKyNkZWZpbmUgQ0ZHX1RPWUJPWF9NVVNMX05PTU1VX0lTX0JST0tFTiAwCisjZGVmaW5lIFVTRV9UT1lCT1hfTVVTTF9OT01NVV9JU19CUk9LRU4oLi4uKQpkaWZmIC0tZ2l0IGEvdG95Ym94L2dlbmVyYXRlZC9mbGFncy5oIGIvdG95Ym94L2dlbmVyYXRlZC9mbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjNlMjQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvZ2VuZXJhdGVkL2ZsYWdzLmgKQEAgLTAsMCArMSw1NzU0IEBACisjdW5kZWYgRk9SQ0VEX0ZMQUcKKyN1bmRlZiBGT1JDRURfRkxBR0xMCisjaWZkZWYgRk9SQ0VfRkxBR1MKKyNkZWZpbmUgRk9SQ0VEX0ZMQUcgMQorI2RlZmluZSBGT1JDRURfRkxBR0xMIDFMTAorI2Vsc2UKKyNkZWZpbmUgRk9SQ0VEX0ZMQUcgMAorI2RlZmluZSBGT1JDRURfRkxBR0xMIDAKKyNlbmRpZgorCisvLyBhY3BpIGFiY3RWIGFiY3RWCisjdW5kZWYgT1BUU1RSX2FjcGkKKyNkZWZpbmUgT1BUU1RSX2FjcGkgImFiY3RWIgorI2lmZGVmIENMRUFOVVBfYWNwaQorI3VuZGVmIENMRUFOVVBfYWNwaQorI3VuZGVmIEZPUl9hY3BpCisjdW5kZWYgRkxBR19WCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gYXJwICAgdmk6bkRzZGFwOkE6SDpbK0FwXVshc2RdCisjdW5kZWYgT1BUU1RSX2FycAorI2RlZmluZSBPUFRTVFJfYXJwICJ2aTpuRHNkYXA6QTpIOlsrQXBdWyFzZF0iCisjaWZkZWYgQ0xFQU5VUF9hcnAKKyN1bmRlZiBDTEVBTlVQX2FycAorI3VuZGVmIEZPUl9hcnAKKyN1bmRlZiBGTEFHX0gKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX0QKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX3YKKyNlbmRpZgorCisvLyBhcnBpbmcgICA8MT4xczpJOncjPDBjIzwwQVVEYnFmWytBVV1bK0RmXQorI3VuZGVmIE9QVFNUUl9hcnBpbmcKKyNkZWZpbmUgT1BUU1RSX2FycGluZyAiPDE+MXM6STp3IzwwYyM8MEFVRGJxZlsrQVVdWytEZl0iCisjaWZkZWYgQ0xFQU5VUF9hcnBpbmcKKyN1bmRlZiBDTEVBTlVQX2FycGluZworI3VuZGVmIEZPUl9hcnBpbmcKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX0QKKyN1bmRlZiBGTEFHX1UKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX0kKKyN1bmRlZiBGTEFHX3MKKyNlbmRpZgorCisvLyBiYXNlNjQgZGl3IzwwPTc2WyFkd10gZGl3IzwwPTc2WyFkd10KKyN1bmRlZiBPUFRTVFJfYmFzZTY0CisjZGVmaW5lIE9QVFNUUl9iYXNlNjQgImRpdyM8MD03NlshZHddIgorI2lmZGVmIENMRUFOVVBfYmFzZTY0CisjdW5kZWYgQ0xFQU5VUF9iYXNlNjQKKyN1bmRlZiBGT1JfYmFzZTY0CisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19kCisjZW5kaWYKKworLy8gYmFzZW5hbWUgPDE+MiA8MT4yCisjdW5kZWYgT1BUU1RSX2Jhc2VuYW1lCisjZGVmaW5lIE9QVFNUUl9iYXNlbmFtZSAiPDE+MiIKKyNpZmRlZiBDTEVBTlVQX2Jhc2VuYW1lCisjdW5kZWYgQ0xFQU5VUF9iYXNlbmFtZQorI3VuZGVmIEZPUl9iYXNlbmFtZQorI2VuZGlmCisKKy8vIGJsa2lkICAgIAorI3VuZGVmIE9QVFNUUl9ibGtpZAorI2RlZmluZSBPUFRTVFJfYmxraWQgMAorI2lmZGVmIENMRUFOVVBfYmxraWQKKyN1bmRlZiBDTEVBTlVQX2Jsa2lkCisjdW5kZWYgRk9SX2Jsa2lkCisjZW5kaWYKKworLy8gYmxvY2tkZXYgPDE+MShzZXRybykoc2V0cncpKGdldHJvKShnZXRzcykoZ2V0YnN6KShzZXRic3opIzwwKGdldHN6KShnZXRzaXplKShnZXRzaXplNjQpKGZsdXNoYnVmcykocmVyZWFkcHQpIDwxPjEoc2V0cm8pKHNldHJ3KShnZXRybykoZ2V0c3MpKGdldGJzeikoc2V0YnN6KSM8MChnZXRzeikoZ2V0c2l6ZSkoZ2V0c2l6ZTY0KShmbHVzaGJ1ZnMpKHJlcmVhZHB0KQorI3VuZGVmIE9QVFNUUl9ibG9ja2RldgorI2RlZmluZSBPUFRTVFJfYmxvY2tkZXYgIjwxPjEoc2V0cm8pKHNldHJ3KShnZXRybykoZ2V0c3MpKGdldGJzeikoc2V0YnN6KSM8MChnZXRzeikoZ2V0c2l6ZSkoZ2V0c2l6ZTY0KShmbHVzaGJ1ZnMpKHJlcmVhZHB0KSIKKyNpZmRlZiBDTEVBTlVQX2Jsb2NrZGV2CisjdW5kZWYgQ0xFQU5VUF9ibG9ja2RldgorI3VuZGVmIEZPUl9ibG9ja2RldgorI3VuZGVmIEZMQUdfcmVyZWFkcHQKKyN1bmRlZiBGTEFHX2ZsdXNoYnVmcworI3VuZGVmIEZMQUdfZ2V0c2l6ZTY0CisjdW5kZWYgRkxBR19nZXRzaXplCisjdW5kZWYgRkxBR19nZXRzegorI3VuZGVmIEZMQUdfc2V0YnN6CisjdW5kZWYgRkxBR19nZXRic3oKKyN1bmRlZiBGTEFHX2dldHNzCisjdW5kZWYgRkxBR19nZXRybworI3VuZGVmIEZMQUdfc2V0cncKKyN1bmRlZiBGTEFHX3NldHJvCisjZW5kaWYKKworLy8gYm9vdGNoYXJ0ZCAgICAKKyN1bmRlZiBPUFRTVFJfYm9vdGNoYXJ0ZAorI2RlZmluZSBPUFRTVFJfYm9vdGNoYXJ0ZCAwCisjaWZkZWYgQ0xFQU5VUF9ib290Y2hhcnRkCisjdW5kZWYgQ0xFQU5VUF9ib290Y2hhcnRkCisjdW5kZWYgRk9SX2Jvb3RjaGFydGQKKyNlbmRpZgorCisvLyBicmN0bCAgIDwxCisjdW5kZWYgT1BUU1RSX2JyY3RsCisjZGVmaW5lIE9QVFNUUl9icmN0bCAiPDEiCisjaWZkZWYgQ0xFQU5VUF9icmN0bAorI3VuZGVmIENMRUFOVVBfYnJjdGwKKyN1bmRlZiBGT1JfYnJjdGwKKyNlbmRpZgorCisvLyBidW56aXAyIGNmdGt2IGNmdGt2CisjdW5kZWYgT1BUU1RSX2J1bnppcDIKKyNkZWZpbmUgT1BUU1RSX2J1bnppcDIgImNmdGt2IgorI2lmZGVmIENMRUFOVVBfYnVuemlwMgorI3VuZGVmIENMRUFOVVBfYnVuemlwMgorI3VuZGVmIEZPUl9idW56aXAyCisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19rCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19jCisjZW5kaWYKKworLy8gYnpjYXQgICAgCisjdW5kZWYgT1BUU1RSX2J6Y2F0CisjZGVmaW5lIE9QVFNUUl9iemNhdCAwCisjaWZkZWYgQ0xFQU5VUF9iemNhdAorI3VuZGVmIENMRUFOVVBfYnpjYXQKKyN1bmRlZiBGT1JfYnpjYXQKKyNlbmRpZgorCisvLyBjYWwgPjIgPjIKKyN1bmRlZiBPUFRTVFJfY2FsCisjZGVmaW5lIE9QVFNUUl9jYWwgIj4yIgorI2lmZGVmIENMRUFOVVBfY2FsCisjdW5kZWYgQ0xFQU5VUF9jYWwKKyN1bmRlZiBGT1JfY2FsCisjZW5kaWYKKworLy8gY2F0IHV2dGUgdXZ0ZQorI3VuZGVmIE9QVFNUUl9jYXQKKyNkZWZpbmUgT1BUU1RSX2NhdCAidXZ0ZSIKKyNpZmRlZiBDTEVBTlVQX2NhdAorI3VuZGVmIENMRUFOVVBfY2F0CisjdW5kZWYgRk9SX2NhdAorI3VuZGVmIEZMQUdfZQorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfdQorI2VuZGlmCisKKy8vIGNhdHYgICB2dGUKKyN1bmRlZiBPUFRTVFJfY2F0dgorI2RlZmluZSBPUFRTVFJfY2F0diAidnRlIgorI2lmZGVmIENMRUFOVVBfY2F0dgorI3VuZGVmIENMRUFOVVBfY2F0dgorI3VuZGVmIEZPUl9jYXR2CisjdW5kZWYgRkxBR19lCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR192CisjZW5kaWYKKworLy8gY2QgICAgCisjdW5kZWYgT1BUU1RSX2NkCisjZGVmaW5lIE9QVFNUUl9jZCAwCisjaWZkZWYgQ0xFQU5VUF9jZAorI3VuZGVmIENMRUFOVVBfY2QKKyN1bmRlZiBGT1JfY2QKKyNlbmRpZgorCisvLyBjaGF0dHIgICAgCisjdW5kZWYgT1BUU1RSX2NoYXR0cgorI2RlZmluZSBPUFRTVFJfY2hhdHRyIDAKKyNpZmRlZiBDTEVBTlVQX2NoYXR0cgorI3VuZGVmIENMRUFOVVBfY2hhdHRyCisjdW5kZWYgRk9SX2NoYXR0cgorI2VuZGlmCisKKy8vIGNoY29uIDwyaHZSIDwyaHZSCisjdW5kZWYgT1BUU1RSX2NoY29uCisjZGVmaW5lIE9QVFNUUl9jaGNvbiAiPDJodlIiCisjaWZkZWYgQ0xFQU5VUF9jaGNvbgorI3VuZGVmIENMRUFOVVBfY2hjb24KKyN1bmRlZiBGT1JfY2hjb24KKyN1bmRlZiBGTEFHX1IKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX2gKKyNlbmRpZgorCisvLyBjaGdycCA8MmhQTEhSZnZbLUhMUF0gPDJoUExIUmZ2Wy1ITFBdCisjdW5kZWYgT1BUU1RSX2NoZ3JwCisjZGVmaW5lIE9QVFNUUl9jaGdycCAiPDJoUExIUmZ2Wy1ITFBdIgorI2lmZGVmIENMRUFOVVBfY2hncnAKKyN1bmRlZiBDTEVBTlVQX2NoZ3JwCisjdW5kZWYgRk9SX2NoZ3JwCisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19QCisjdW5kZWYgRkxBR19oCisjZW5kaWYKKworLy8gY2htb2QgPDI/dlJmWy12Zl0gPDI/dlJmWy12Zl0KKyN1bmRlZiBPUFRTVFJfY2htb2QKKyNkZWZpbmUgT1BUU1RSX2NobW9kICI8Mj92UmZbLXZmXSIKKyNpZmRlZiBDTEVBTlVQX2NobW9kCisjdW5kZWYgQ0xFQU5VUF9jaG1vZAorI3VuZGVmIEZPUl9jaG1vZAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfUgorI3VuZGVmIEZMQUdfdgorI2VuZGlmCisKKy8vIGNocm9vdCBePDEgXjwxCisjdW5kZWYgT1BUU1RSX2Nocm9vdAorI2RlZmluZSBPUFRTVFJfY2hyb290ICJePDEiCisjaWZkZWYgQ0xFQU5VUF9jaHJvb3QKKyN1bmRlZiBDTEVBTlVQX2Nocm9vdAorI3VuZGVmIEZPUl9jaHJvb3QKKyNlbmRpZgorCisvLyBjaHZ0ICAgPDEKKyN1bmRlZiBPUFRTVFJfY2h2dAorI2RlZmluZSBPUFRTVFJfY2h2dCAiPDEiCisjaWZkZWYgQ0xFQU5VUF9jaHZ0CisjdW5kZWYgQ0xFQU5VUF9jaHZ0CisjdW5kZWYgRk9SX2NodnQKKyNlbmRpZgorCisvLyBja3N1bSBISVBMTiBISVBMTgorI3VuZGVmIE9QVFNUUl9ja3N1bQorI2RlZmluZSBPUFRTVFJfY2tzdW0gIkhJUExOIgorI2lmZGVmIENMRUFOVVBfY2tzdW0KKyN1bmRlZiBDTEVBTlVQX2Nrc3VtCisjdW5kZWYgRk9SX2Nrc3VtCisjdW5kZWYgRkxBR19OCisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19QCisjdW5kZWYgRkxBR19JCisjdW5kZWYgRkxBR19ICisjZW5kaWYKKworLy8gY2xlYXIgICAgCisjdW5kZWYgT1BUU1RSX2NsZWFyCisjZGVmaW5lIE9QVFNUUl9jbGVhciAwCisjaWZkZWYgQ0xFQU5VUF9jbGVhcgorI3VuZGVmIENMRUFOVVBfY2xlYXIKKyN1bmRlZiBGT1JfY2xlYXIKKyNlbmRpZgorCisvLyBjbXAgPDI+MmxzWyFsc10gPDI+MmxzWyFsc10KKyN1bmRlZiBPUFRTVFJfY21wCisjZGVmaW5lIE9QVFNUUl9jbXAgIjwyPjJsc1shbHNdIgorI2lmZGVmIENMRUFOVVBfY21wCisjdW5kZWYgQ0xFQU5VUF9jbXAKKyN1bmRlZiBGT1JfY21wCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19sCisjZW5kaWYKKworLy8gY29tbSA8Mj4yMzIxIDwyPjIzMjEKKyN1bmRlZiBPUFRTVFJfY29tbQorI2RlZmluZSBPUFRTVFJfY29tbSAiPDI+MjMyMSIKKyNpZmRlZiBDTEVBTlVQX2NvbW0KKyN1bmRlZiBDTEVBTlVQX2NvbW0KKyN1bmRlZiBGT1JfY29tbQorI3VuZGVmIEZMQUdfMQorI3VuZGVmIEZMQUdfMgorI3VuZGVmIEZMQUdfMworI2VuZGlmCisKKy8vIGNvbXByZXNzICAgemNkOWxyZ1stY2RdWyF6Z0xyXQorI3VuZGVmIE9QVFNUUl9jb21wcmVzcworI2RlZmluZSBPUFRTVFJfY29tcHJlc3MgInpjZDlscmdbLWNkXVshemdMcl0iCisjaWZkZWYgQ0xFQU5VUF9jb21wcmVzcworI3VuZGVmIENMRUFOVVBfY29tcHJlc3MKKyN1bmRlZiBGT1JfY29tcHJlc3MKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHXzkKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX3oKKyNlbmRpZgorCisvLyBjb3VudCAgICAKKyN1bmRlZiBPUFRTVFJfY291bnQKKyNkZWZpbmUgT1BUU1RSX2NvdW50IDAKKyNpZmRlZiBDTEVBTlVQX2NvdW50CisjdW5kZWYgQ0xFQU5VUF9jb3VudAorI3VuZGVmIEZPUl9jb3VudAorI2VuZGlmCisKKy8vIGNwIDwyKHByZXNlcnZlKTo7UkhMUHByZGFzbHZuRihyZW1vdmUtZGVzdGluYXRpb24pZmlbLUhMUGRdWy1uaV0gPDIocHJlc2VydmUpOjtSSExQcHJkYXNsdm5GKHJlbW92ZS1kZXN0aW5hdGlvbilmaVstSExQZF1bLW5pXQorI3VuZGVmIE9QVFNUUl9jcAorI2RlZmluZSBPUFRTVFJfY3AgIjwyKHByZXNlcnZlKTo7UkhMUHByZGFzbHZuRihyZW1vdmUtZGVzdGluYXRpb24pZmlbLUhMUGRdWy1uaV0iCisjaWZkZWYgQ0xFQU5VUF9jcAorI3VuZGVmIENMRUFOVVBfY3AKKyN1bmRlZiBGT1JfY3AKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX3JlbW92ZV9kZXN0aW5hdGlvbgorI3VuZGVmIEZMQUdfRgorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfUAorI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfSAorI3VuZGVmIEZMQUdfUgorI3VuZGVmIEZMQUdfcHJlc2VydmUKKyNlbmRpZgorCisvLyBjcGlvIChuby1wcmVzZXJ2ZS1vd25lciltZHVIOnA6fGl8dHxGOnYodmVyYm9zZSlvfFshcGlvXVshcG90XVshcEZdIChuby1wcmVzZXJ2ZS1vd25lciltZHVIOnA6fGl8dHxGOnYodmVyYm9zZSlvfFshcGlvXVshcG90XVshcEZdCisjdW5kZWYgT1BUU1RSX2NwaW8KKyNkZWZpbmUgT1BUU1RSX2NwaW8gIihuby1wcmVzZXJ2ZS1vd25lciltZHVIOnA6fGl8dHxGOnYodmVyYm9zZSlvfFshcGlvXVshcG90XVshcEZdIgorI2lmZGVmIENMRUFOVVBfY3BpbworI3VuZGVmIENMRUFOVVBfY3BpbworI3VuZGVmIEZPUl9jcGlvCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR192ZXJib3NlCisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19GCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19ub19wcmVzZXJ2ZV9vd25lcgorI2VuZGlmCisKKy8vIGNyb25kICAgZmJTbCM8MD04ZCM8MEw6YzpbLWJmXVstTFNdWy1sZF0KKyN1bmRlZiBPUFRTVFJfY3JvbmQKKyNkZWZpbmUgT1BUU1RSX2Nyb25kICJmYlNsIzwwPThkIzwwTDpjOlstYmZdWy1MU11bLWxkXSIKKyNpZmRlZiBDTEVBTlVQX2Nyb25kCisjdW5kZWYgQ0xFQU5VUF9jcm9uZAorI3VuZGVmIEZPUl9jcm9uZAorI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfUworI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfZgorI2VuZGlmCisKKy8vIGNyb250YWIgICBjOnU6ZWxyWyFlbHJdCisjdW5kZWYgT1BUU1RSX2Nyb250YWIKKyNkZWZpbmUgT1BUU1RSX2Nyb250YWIgImM6dTplbHJbIWVscl0iCisjaWZkZWYgQ0xFQU5VUF9jcm9udGFiCisjdW5kZWYgQ0xFQU5VUF9jcm9udGFiCisjdW5kZWYgRk9SX2Nyb250YWIKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyBjdXQgYjp8Yzp8Zjp8ZDpzblshY2JmXSBiOnxjOnxmOnxkOnNuWyFjYmZdCisjdW5kZWYgT1BUU1RSX2N1dAorI2RlZmluZSBPUFRTVFJfY3V0ICJiOnxjOnxmOnxkOnNuWyFjYmZdIgorI2lmZGVmIENMRUFOVVBfY3V0CisjdW5kZWYgQ0xFQU5VUF9jdXQKKyN1bmRlZiBGT1JfY3V0CisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19iCisjZW5kaWYKKworLy8gZGF0ZSBkOkQ6cjp1WyFkcl0gZDpEOnI6dVshZHJdCisjdW5kZWYgT1BUU1RSX2RhdGUKKyNkZWZpbmUgT1BUU1RSX2RhdGUgImQ6RDpyOnVbIWRyXSIKKyNpZmRlZiBDTEVBTlVQX2RhdGUKKyN1bmRlZiBDTEVBTlVQX2RhdGUKKyN1bmRlZiBGT1JfZGF0ZQorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfRAorI3VuZGVmIEZMQUdfZAorI2VuZGlmCisKKy8vIGRkICAgIAorI3VuZGVmIE9QVFNUUl9kZAorI2RlZmluZSBPUFRTVFJfZGQgMAorI2lmZGVmIENMRUFOVVBfZGQKKyN1bmRlZiBDTEVBTlVQX2RkCisjdW5kZWYgRk9SX2RkCisjZW5kaWYKKworLy8gZGVhbGxvY3Z0ICAgPjEKKyN1bmRlZiBPUFRTVFJfZGVhbGxvY3Z0CisjZGVmaW5lIE9QVFNUUl9kZWFsbG9jdnQgIj4xIgorI2lmZGVmIENMRUFOVVBfZGVhbGxvY3Z0CisjdW5kZWYgQ0xFQU5VUF9kZWFsbG9jdnQKKyN1bmRlZiBGT1JfZGVhbGxvY3Z0CisjZW5kaWYKKworLy8gZGYgSFBraHQqYVstSFBraF0gSFBraHQqYVstSFBraF0KKyN1bmRlZiBPUFRTVFJfZGYKKyNkZWZpbmUgT1BUU1RSX2RmICJIUGtodCphWy1IUGtoXSIKKyNpZmRlZiBDTEVBTlVQX2RmCisjdW5kZWYgQ0xFQU5VUF9kZgorI3VuZGVmIEZPUl9kZgorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfaAorI3VuZGVmIEZMQUdfaworI3VuZGVmIEZMQUdfUAorI3VuZGVmIEZMQUdfSAorI2VuZGlmCisKKy8vIGRoY3AgICBWOkg6Rjp4KnI6TypBIzwwPTIwVCM8MD0zdCM8MD0zczpwOmk6U0JSQ2FvdnFuYmYKKyN1bmRlZiBPUFRTVFJfZGhjcAorI2RlZmluZSBPUFRTVFJfZGhjcCAiVjpIOkY6eCpyOk8qQSM8MD0yMFQjPDA9M3QjPDA9M3M6cDppOlNCUkNhb3ZxbmJmIgorI2lmZGVmIENMRUFOVVBfZGhjcAorI3VuZGVmIENMRUFOVVBfZGhjcAorI3VuZGVmIEZPUl9kaGNwCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19DCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19CCisjdW5kZWYgRkxBR19TCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19UCisjdW5kZWYgRkxBR19BCisjdW5kZWYgRkxBR19PCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR19GCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR19WCisjZW5kaWYKKworLy8gZGhjcDYgICByOkEjPDBUIzwwdCM8MHM6cDppOlNSdnFuYmYKKyN1bmRlZiBPUFRTVFJfZGhjcDYKKyNkZWZpbmUgT1BUU1RSX2RoY3A2ICJyOkEjPDBUIzwwdCM8MHM6cDppOlNSdnFuYmYiCisjaWZkZWYgQ0xFQU5VUF9kaGNwNgorI3VuZGVmIENMRUFOVVBfZGhjcDYKKyN1bmRlZiBGT1JfZGhjcDYKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX1IKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX1QKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX3IKKyNlbmRpZgorCisvLyBkaGNwZCAgID4xUCM8MD42NTUzNWZpOlM0NlshNDZdCisjdW5kZWYgT1BUU1RSX2RoY3BkCisjZGVmaW5lIE9QVFNUUl9kaGNwZCAiPjFQIzwwPjY1NTM1Zmk6UzQ2WyE0Nl0iCisjaWZkZWYgQ0xFQU5VUF9kaGNwZAorI3VuZGVmIENMRUFOVVBfZGhjcGQKKyN1bmRlZiBGT1JfZGhjcGQKKyN1bmRlZiBGTEFHXzYKKyN1bmRlZiBGTEFHXzQKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX1AKKyNlbmRpZgorCisvLyBkaWZmICAgPDI+MkIoaWdub3JlLWJsYW5rLWxpbmVzKWQobWluaW1hbCliKGlnbm9yZS1zcGFjZS1jaGFuZ2UpdXQoZXhwYW5kLXRhYnMpdyhpZ25vcmUtYWxsLXNwYWNlKWkoaWdub3JlLWNhc2UpVChpbml0aWFsLXRhYilzKHJlcG9ydC1pZGVudGljYWwtZmlsZXMpcShicmllZilhKHRleHQpTChsYWJlbCkqUyhzdGFydGluZy1maWxlKTpOKG5ldy1maWxlKXIocmVjdXJzaXZlKVUodW5pZmllZCkjPDA9MworI3VuZGVmIE9QVFNUUl9kaWZmCisjZGVmaW5lIE9QVFNUUl9kaWZmICI8Mj4yQihpZ25vcmUtYmxhbmstbGluZXMpZChtaW5pbWFsKWIoaWdub3JlLXNwYWNlLWNoYW5nZSl1dChleHBhbmQtdGFicyl3KGlnbm9yZS1hbGwtc3BhY2UpaShpZ25vcmUtY2FzZSlUKGluaXRpYWwtdGFiKXMocmVwb3J0LWlkZW50aWNhbC1maWxlcylxKGJyaWVmKWEodGV4dClMKGxhYmVsKSpTKHN0YXJ0aW5nLWZpbGUpOk4obmV3LWZpbGUpcihyZWN1cnNpdmUpVSh1bmlmaWVkKSM8MD0zIgorI2lmZGVmIENMRUFOVVBfZGlmZgorI3VuZGVmIENMRUFOVVBfZGlmZgorI3VuZGVmIEZPUl9kaWZmCisjdW5kZWYgRkxBR191bmlmaWVkCisjdW5kZWYgRkxBR19VCisjdW5kZWYgRkxBR19yZWN1cnNpdmUKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX25ld19maWxlCisjdW5kZWYgRkxBR19OCisjdW5kZWYgRkxBR19zdGFydGluZ19maWxlCisjdW5kZWYgRkxBR19TCisjdW5kZWYgRkxBR19sYWJlbAorI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfdGV4dAorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfYnJpZWYKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3JlcG9ydF9pZGVudGljYWxfZmlsZXMKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX2luaXRpYWxfdGFiCisjdW5kZWYgRkxBR19UCisjdW5kZWYgRkxBR19pZ25vcmVfY2FzZQorI3VuZGVmIEZMQUdfaQorI3VuZGVmIEZMQUdfaWdub3JlX2FsbF9zcGFjZQorI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfZXhwYW5kX3RhYnMKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX2lnbm9yZV9zcGFjZV9jaGFuZ2UKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX21pbmltYWwKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2lnbm9yZV9ibGFua19saW5lcworI3VuZGVmIEZMQUdfQgorI2VuZGlmCisKKy8vIGRpcm5hbWUgPDEgPDEKKyN1bmRlZiBPUFRTVFJfZGlybmFtZQorI2RlZmluZSBPUFRTVFJfZGlybmFtZSAiPDEiCisjaWZkZWYgQ0xFQU5VUF9kaXJuYW1lCisjdW5kZWYgQ0xFQU5VUF9kaXJuYW1lCisjdW5kZWYgRk9SX2Rpcm5hbWUKKyNlbmRpZgorCisvLyBkbWVzZyB0cnMjPDFuI2NbIXRyXSB0cnMjPDFuI2NbIXRyXQorI3VuZGVmIE9QVFNUUl9kbWVzZworI2RlZmluZSBPUFRTVFJfZG1lc2cgInRycyM8MW4jY1shdHJdIgorI2lmZGVmIENMRUFOVVBfZG1lc2cKKyN1bmRlZiBDTEVBTlVQX2RtZXNnCisjdW5kZWYgRk9SX2RtZXNnCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR190CisjZW5kaWYKKworLy8gZG9zMnVuaXggICAgCisjdW5kZWYgT1BUU1RSX2RvczJ1bml4CisjZGVmaW5lIE9QVFNUUl9kb3MydW5peCAwCisjaWZkZWYgQ0xFQU5VUF9kb3MydW5peAorI3VuZGVmIENMRUFOVVBfZG9zMnVuaXgKKyN1bmRlZiBGT1JfZG9zMnVuaXgKKyNlbmRpZgorCisvLyBkdSBkIzwwaG1sY2FIa0tMc3hbLUhMXVsta0ttaF0gZCM8MGhtbGNhSGtLTHN4Wy1ITF1bLWtLbWhdCisjdW5kZWYgT1BUU1RSX2R1CisjZGVmaW5lIE9QVFNUUl9kdSAiZCM8MGhtbGNhSGtLTHN4Wy1ITF1bLWtLbWhdIgorI2lmZGVmIENMRUFOVVBfZHUKKyN1bmRlZiBDTEVBTlVQX2R1CisjdW5kZWYgRk9SX2R1CisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19LCisjdW5kZWYgRkxBR19rCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19oCisjdW5kZWYgRkxBR19kCisjZW5kaWYKKworLy8gZHVtcGxlYXNlcyAgID4wYXJmOlshYXJdCisjdW5kZWYgT1BUU1RSX2R1bXBsZWFzZXMKKyNkZWZpbmUgT1BUU1RSX2R1bXBsZWFzZXMgIj4wYXJmOlshYXJdIgorI2lmZGVmIENMRUFOVVBfZHVtcGxlYXNlcworI3VuZGVmIENMRUFOVVBfZHVtcGxlYXNlcworI3VuZGVmIEZPUl9kdW1wbGVhc2VzCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gZWNobyBeP2VuIF4/ZW4KKyN1bmRlZiBPUFRTVFJfZWNobworI2RlZmluZSBPUFRTVFJfZWNobyAiXj9lbiIKKyNpZmRlZiBDTEVBTlVQX2VjaG8KKyN1bmRlZiBDTEVBTlVQX2VjaG8KKyN1bmRlZiBGT1JfZWNobworI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZQorI2VuZGlmCisKKy8vIGVqZWN0ICAgPjFzdFRbIXRUXQorI3VuZGVmIE9QVFNUUl9lamVjdAorI2RlZmluZSBPUFRTVFJfZWplY3QgIj4xc3RUWyF0VF0iCisjaWZkZWYgQ0xFQU5VUF9lamVjdAorI3VuZGVmIENMRUFOVVBfZWplY3QKKyN1bmRlZiBGT1JfZWplY3QKKyN1bmRlZiBGTEFHX1QKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3MKKyNlbmRpZgorCisvLyBlbnYgXml1KiBeaXUqCisjdW5kZWYgT1BUU1RSX2VudgorI2RlZmluZSBPUFRTVFJfZW52ICJeaXUqIgorI2lmZGVmIENMRUFOVVBfZW52CisjdW5kZWYgQ0xFQU5VUF9lbnYKKyN1bmRlZiBGT1JfZW52CisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19pCisjZW5kaWYKKworLy8gZXhpdCAgICAKKyN1bmRlZiBPUFRTVFJfZXhpdAorI2RlZmluZSBPUFRTVFJfZXhpdCAwCisjaWZkZWYgQ0xFQU5VUF9leGl0CisjdW5kZWYgQ0xFQU5VUF9leGl0CisjdW5kZWYgRk9SX2V4aXQKKyNlbmRpZgorCisvLyBleHBhbmQgdCogdCoKKyN1bmRlZiBPUFRTVFJfZXhwYW5kCisjZGVmaW5lIE9QVFNUUl9leHBhbmQgInQqIgorI2lmZGVmIENMRUFOVVBfZXhwYW5kCisjdW5kZWYgQ0xFQU5VUF9leHBhbmQKKyN1bmRlZiBGT1JfZXhwYW5kCisjdW5kZWYgRkxBR190CisjZW5kaWYKKworLy8gZXhwciAgICAKKyN1bmRlZiBPUFRTVFJfZXhwcgorI2RlZmluZSBPUFRTVFJfZXhwciAwCisjaWZkZWYgQ0xFQU5VUF9leHByCisjdW5kZWYgQ0xFQU5VUF9leHByCisjdW5kZWYgRk9SX2V4cHIKKyNlbmRpZgorCisvLyBmYWN0b3IgICAgCisjdW5kZWYgT1BUU1RSX2ZhY3RvcgorI2RlZmluZSBPUFRTVFJfZmFjdG9yIDAKKyNpZmRlZiBDTEVBTlVQX2ZhY3RvcgorI3VuZGVmIENMRUFOVVBfZmFjdG9yCisjdW5kZWYgRk9SX2ZhY3RvcgorI2VuZGlmCisKKy8vIGZhbGxvY2F0ZSA+MWwjfCA+MWwjfAorI3VuZGVmIE9QVFNUUl9mYWxsb2NhdGUKKyNkZWZpbmUgT1BUU1RSX2ZhbGxvY2F0ZSAiPjFsI3wiCisjaWZkZWYgQ0xFQU5VUF9mYWxsb2NhdGUKKyN1bmRlZiBDTEVBTlVQX2ZhbGxvY2F0ZQorI3VuZGVmIEZPUl9mYWxsb2NhdGUKKyN1bmRlZiBGTEFHX2wKKyNlbmRpZgorCisvLyBmYWxzZSAgICAKKyN1bmRlZiBPUFRTVFJfZmFsc2UKKyNkZWZpbmUgT1BUU1RSX2ZhbHNlIDAKKyNpZmRlZiBDTEVBTlVQX2ZhbHNlCisjdW5kZWYgQ0xFQU5VUF9mYWxzZQorI3VuZGVmIEZPUl9mYWxzZQorI2VuZGlmCisKKy8vIGZkaXNrICAgQyM8MEgjPDBTIzwwYiM8NTEydWwKKyN1bmRlZiBPUFRTVFJfZmRpc2sKKyNkZWZpbmUgT1BUU1RSX2ZkaXNrICJDIzwwSCM8MFMjPDBiIzw1MTJ1bCIKKyNpZmRlZiBDTEVBTlVQX2ZkaXNrCisjdW5kZWYgQ0xFQU5VUF9mZGlzaworI3VuZGVmIEZPUl9mZGlzaworI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfUworI3VuZGVmIEZMQUdfSAorI3VuZGVmIEZMQUdfQworI2VuZGlmCisKKy8vIGZpbGUgPDEgPDEKKyN1bmRlZiBPUFRTVFJfZmlsZQorI2RlZmluZSBPUFRTVFJfZmlsZSAiPDEiCisjaWZkZWYgQ0xFQU5VUF9maWxlCisjdW5kZWYgQ0xFQU5VUF9maWxlCisjdW5kZWYgRk9SX2ZpbGUKKyNlbmRpZgorCisvLyBmaW5kID9eSExbLUhMXSA/XkhMWy1ITF0KKyN1bmRlZiBPUFRTVFJfZmluZAorI2RlZmluZSBPUFRTVFJfZmluZCAiP15ITFstSExdIgorI2lmZGVmIENMRUFOVVBfZmluZAorI3VuZGVmIENMRUFOVVBfZmluZAorI3VuZGVmIEZPUl9maW5kCisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19ICisjZW5kaWYKKworLy8gZmxvY2sgPDE+MW5zdXhbLXN1eF0gPDE+MW5zdXhbLXN1eF0KKyN1bmRlZiBPUFRTVFJfZmxvY2sKKyNkZWZpbmUgT1BUU1RSX2Zsb2NrICI8MT4xbnN1eFstc3V4XSIKKyNpZmRlZiBDTEVBTlVQX2Zsb2NrCisjdW5kZWYgQ0xFQU5VUF9mbG9jaworI3VuZGVmIEZPUl9mbG9jaworI3VuZGVmIEZMQUdfeAorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfbgorI2VuZGlmCisKKy8vIGZvbGQgICBic3V3IzwxCisjdW5kZWYgT1BUU1RSX2ZvbGQKKyNkZWZpbmUgT1BUU1RSX2ZvbGQgImJzdXcjPDEiCisjaWZkZWYgQ0xFQU5VUF9mb2xkCisjdW5kZWYgQ0xFQU5VUF9mb2xkCisjdW5kZWYgRk9SX2ZvbGQKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX2IKKyNlbmRpZgorCisvLyBmcmVlIGh0Z21rYlshaHRnbWtiXSBodGdta2JbIWh0Z21rYl0KKyN1bmRlZiBPUFRTVFJfZnJlZQorI2RlZmluZSBPUFRTVFJfZnJlZSAiaHRnbWtiWyFodGdta2JdIgorI2lmZGVmIENMRUFOVVBfZnJlZQorI3VuZGVmIENMRUFOVVBfZnJlZQorI3VuZGVmIEZPUl9mcmVlCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19rCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19nCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19oCisjZW5kaWYKKworLy8gZnJlZXJhbWRpc2sgPDE+MSA8MT4xCisjdW5kZWYgT1BUU1RSX2ZyZWVyYW1kaXNrCisjZGVmaW5lIE9QVFNUUl9mcmVlcmFtZGlzayAiPDE+MSIKKyNpZmRlZiBDTEVBTlVQX2ZyZWVyYW1kaXNrCisjdW5kZWYgQ0xFQU5VUF9mcmVlcmFtZGlzaworI3VuZGVmIEZPUl9mcmVlcmFtZGlzaworI2VuZGlmCisKKy8vIGZzY2sgICA/dDpBTlBSVFZzQyMKKyN1bmRlZiBPUFRTVFJfZnNjaworI2RlZmluZSBPUFRTVFJfZnNjayAiP3Q6QU5QUlRWc0MjIgorI2lmZGVmIENMRUFOVVBfZnNjaworI3VuZGVmIENMRUFOVVBfZnNjaworI3VuZGVmIEZPUl9mc2NrCisjdW5kZWYgRkxBR19DCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19WCisjdW5kZWYgRkxBR19UCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19QCisjdW5kZWYgRkxBR19OCisjdW5kZWYgRkxBR19BCisjdW5kZWYgRkxBR190CisjZW5kaWYKKworLy8gZnNmcmVlemUgPDE+MWZ8dXxbIWZ1XSA8MT4xZnx1fFshZnVdCisjdW5kZWYgT1BUU1RSX2ZzZnJlZXplCisjZGVmaW5lIE9QVFNUUl9mc2ZyZWV6ZSAiPDE+MWZ8dXxbIWZ1XSIKKyNpZmRlZiBDTEVBTlVQX2ZzZnJlZXplCisjdW5kZWYgQ0xFQU5VUF9mc2ZyZWV6ZQorI3VuZGVmIEZPUl9mc2ZyZWV6ZQorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfZgorI2VuZGlmCisKKy8vIGZzdHlwZSAgIDwxCisjdW5kZWYgT1BUU1RSX2ZzdHlwZQorI2RlZmluZSBPUFRTVFJfZnN0eXBlICI8MSIKKyNpZmRlZiBDTEVBTlVQX2ZzdHlwZQorI3VuZGVmIENMRUFOVVBfZnN0eXBlCisjdW5kZWYgRk9SX2ZzdHlwZQorI2VuZGlmCisKKy8vIGZzeW5jICAgPDFkCisjdW5kZWYgT1BUU1RSX2ZzeW5jCisjZGVmaW5lIE9QVFNUUl9mc3luYyAiPDFkIgorI2lmZGVmIENMRUFOVVBfZnN5bmMKKyN1bmRlZiBDTEVBTlVQX2ZzeW5jCisjdW5kZWYgRk9SX2ZzeW5jCisjdW5kZWYgRkxBR19kCisjZW5kaWYKKworLy8gZnRwZ2V0ICAgPDJjdnU6cDpQIzwwPTIxPjY1NTM1CisjdW5kZWYgT1BUU1RSX2Z0cGdldAorI2RlZmluZSBPUFRTVFJfZnRwZ2V0ICI8MmN2dTpwOlAjPDA9MjE+NjU1MzUiCisjaWZkZWYgQ0xFQU5VUF9mdHBnZXQKKyN1bmRlZiBDTEVBTlVQX2Z0cGdldAorI3VuZGVmIEZPUl9mdHBnZXQKKyN1bmRlZiBGTEFHX1AKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyBnZXRlbmZvcmNlID4wID4wCisjdW5kZWYgT1BUU1RSX2dldGVuZm9yY2UKKyNkZWZpbmUgT1BUU1RSX2dldGVuZm9yY2UgIj4wIgorI2lmZGVmIENMRUFOVVBfZ2V0ZW5mb3JjZQorI3VuZGVmIENMRUFOVVBfZ2V0ZW5mb3JjZQorI3VuZGVmIEZPUl9nZXRlbmZvcmNlCisjZW5kaWYKKworLy8gZ2V0ZmF0dHIgZGhuOiBkaG46CisjdW5kZWYgT1BUU1RSX2dldGZhdHRyCisjZGVmaW5lIE9QVFNUUl9nZXRmYXR0ciAiZGhuOiIKKyNpZmRlZiBDTEVBTlVQX2dldGZhdHRyCisjdW5kZWYgQ0xFQU5VUF9nZXRmYXR0cgorI3VuZGVmIEZPUl9nZXRmYXR0cgorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfaAorI3VuZGVmIEZMQUdfZAorI2VuZGlmCisKKy8vIGdldHByb3AgPjJaID4yWgorI3VuZGVmIE9QVFNUUl9nZXRwcm9wCisjZGVmaW5lIE9QVFNUUl9nZXRwcm9wICI+MloiCisjaWZkZWYgQ0xFQU5VUF9nZXRwcm9wCisjdW5kZWYgQ0xFQU5VUF9nZXRwcm9wCisjdW5kZWYgRk9SX2dldHByb3AKKyN1bmRlZiBGTEFHX1oKKyNlbmRpZgorCisvLyBnZXR0eSAgIDwydCM8MEg6STpsOmY6aXdubUxoCisjdW5kZWYgT1BUU1RSX2dldHR5CisjZGVmaW5lIE9QVFNUUl9nZXR0eSAiPDJ0IzwwSDpJOmw6Zjppd25tTGgiCisjaWZkZWYgQ0xFQU5VUF9nZXR0eQorI3VuZGVmIENMRUFOVVBfZ2V0dHkKKyN1bmRlZiBGT1JfZ2V0dHkKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX0wKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX0kKKyN1bmRlZiBGTEFHX0gKKyN1bmRlZiBGTEFHX3QKKyNlbmRpZgorCisvLyBncmVwIEMjQiNBI1p6RUZIYWJoaW5vcnN2d2NscWUqZiptI3hbIXd4XVshRUZ3XSBDI0IjQSNaekVGSGFiaGlub3JzdndjbHFlKmYqbSN4WyF3eF1bIUVGd10KKyN1bmRlZiBPUFRTVFJfZ3JlcAorI2RlZmluZSBPUFRTVFJfZ3JlcCAiQyNCI0EjWnpFRkhhYmhpbm9yc3Z3Y2xxZSpmKm0jeFshd3hdWyFFRnddIgorI2lmZGVmIENMRUFOVVBfZ3JlcAorI3VuZGVmIENMRUFOVVBfZ3JlcAorI3VuZGVmIEZPUl9ncmVwCisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19lCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19oCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR19GCisjdW5kZWYgRkxBR19FCisjdW5kZWYgRkxBR196CisjdW5kZWYgRkxBR19aCisjdW5kZWYgRkxBR19BCisjdW5kZWYgRkxBR19CCisjdW5kZWYgRkxBR19DCisjZW5kaWYKKworLy8gZ3JvdXBhZGQgICA8MT4yZyM8MFMKKyN1bmRlZiBPUFRTVFJfZ3JvdXBhZGQKKyNkZWZpbmUgT1BUU1RSX2dyb3VwYWRkICI8MT4yZyM8MFMiCisjaWZkZWYgQ0xFQU5VUF9ncm91cGFkZAorI3VuZGVmIENMRUFOVVBfZ3JvdXBhZGQKKyN1bmRlZiBGT1JfZ3JvdXBhZGQKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX2cKKyNlbmRpZgorCisvLyBncm91cGRlbCAgIDwxPjIKKyN1bmRlZiBPUFRTVFJfZ3JvdXBkZWwKKyNkZWZpbmUgT1BUU1RSX2dyb3VwZGVsICI8MT4yIgorI2lmZGVmIENMRUFOVVBfZ3JvdXBkZWwKKyN1bmRlZiBDTEVBTlVQX2dyb3VwZGVsCisjdW5kZWYgRk9SX2dyb3VwZGVsCisjZW5kaWYKKworLy8gZ3JvdXBzICAgIAorI3VuZGVmIE9QVFNUUl9ncm91cHMKKyNkZWZpbmUgT1BUU1RSX2dyb3VwcyAwCisjaWZkZWYgQ0xFQU5VUF9ncm91cHMKKyN1bmRlZiBDTEVBTlVQX2dyb3VwcworI3VuZGVmIEZPUl9ncm91cHMKKyNlbmRpZgorCisvLyBndW56aXAgICBjZmxxU3R2CisjdW5kZWYgT1BUU1RSX2d1bnppcAorI2RlZmluZSBPUFRTVFJfZ3VuemlwICJjZmxxU3R2IgorI2lmZGVmIENMRUFOVVBfZ3VuemlwCisjdW5kZWYgQ0xFQU5VUF9ndW56aXAKKyN1bmRlZiBGT1JfZ3VuemlwCisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19TCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19jCisjZW5kaWYKKworLy8gZ3ppcCAgIGQxOWRjZmxxU3R2Z0xSelshZ0xSel0KKyN1bmRlZiBPUFRTVFJfZ3ppcAorI2RlZmluZSBPUFRTVFJfZ3ppcCAiZDE5ZGNmbHFTdHZnTFJ6WyFnTFJ6XSIKKyNpZmRlZiBDTEVBTlVQX2d6aXAKKyN1bmRlZiBDTEVBTlVQX2d6aXAKKyN1bmRlZiBGT1JfZ3ppcAorI3VuZGVmIEZMQUdfegorI3VuZGVmIEZMQUdfUgorI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfUworI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfOQorI3VuZGVmIEZMQUdfMQorI3VuZGVmIEZMQUdfZAorI2VuZGlmCisKKy8vIGhlYWQgP24jPDA9MTAgP24jPDA9MTAKKyN1bmRlZiBPUFRTVFJfaGVhZAorI2RlZmluZSBPUFRTVFJfaGVhZCAiP24jPDA9MTAiCisjaWZkZWYgQ0xFQU5VUF9oZWFkCisjdW5kZWYgQ0xFQU5VUF9oZWFkCisjdW5kZWYgRk9SX2hlYWQKKyN1bmRlZiBGTEFHX24KKyNlbmRpZgorCisvLyBoZWxsbyAgICAKKyN1bmRlZiBPUFRTVFJfaGVsbG8KKyNkZWZpbmUgT1BUU1RSX2hlbGxvIDAKKyNpZmRlZiBDTEVBTlVQX2hlbGxvCisjdW5kZWYgQ0xFQU5VUF9oZWxsbworI3VuZGVmIEZPUl9oZWxsbworI2VuZGlmCisKKy8vIGhlbHAgYWggYWgKKyN1bmRlZiBPUFRTVFJfaGVscAorI2RlZmluZSBPUFRTVFJfaGVscCAiYWgiCisjaWZkZWYgQ0xFQU5VUF9oZWxwCisjdW5kZWYgQ0xFQU5VUF9oZWxwCisjdW5kZWYgRk9SX2hlbHAKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX2EKKyNlbmRpZgorCisvLyBoZXhlZGl0ICAgPDE+MXIKKyN1bmRlZiBPUFRTVFJfaGV4ZWRpdAorI2RlZmluZSBPUFRTVFJfaGV4ZWRpdCAiPDE+MXIiCisjaWZkZWYgQ0xFQU5VUF9oZXhlZGl0CisjdW5kZWYgQ0xFQU5VUF9oZXhlZGl0CisjdW5kZWYgRk9SX2hleGVkaXQKKyN1bmRlZiBGTEFHX3IKKyNlbmRpZgorCisvLyBob3N0ICAgPDE+MmF2dDoKKyN1bmRlZiBPUFRTVFJfaG9zdAorI2RlZmluZSBPUFRTVFJfaG9zdCAiPDE+MmF2dDoiCisjaWZkZWYgQ0xFQU5VUF9ob3N0CisjdW5kZWYgQ0xFQU5VUF9ob3N0CisjdW5kZWYgRk9SX2hvc3QKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX2EKKyNlbmRpZgorCisvLyBob3N0aWQgICA+MAorI3VuZGVmIE9QVFNUUl9ob3N0aWQKKyNkZWZpbmUgT1BUU1RSX2hvc3RpZCAiPjAiCisjaWZkZWYgQ0xFQU5VUF9ob3N0aWQKKyN1bmRlZiBDTEVBTlVQX2hvc3RpZAorI3VuZGVmIEZPUl9ob3N0aWQKKyNlbmRpZgorCisvLyBob3N0bmFtZSBiRjogYkY6CisjdW5kZWYgT1BUU1RSX2hvc3RuYW1lCisjZGVmaW5lIE9QVFNUUl9ob3N0bmFtZSAiYkY6IgorI2lmZGVmIENMRUFOVVBfaG9zdG5hbWUKKyN1bmRlZiBDTEVBTlVQX2hvc3RuYW1lCisjdW5kZWYgRk9SX2hvc3RuYW1lCisjdW5kZWYgRkxBR19GCisjdW5kZWYgRkxBR19iCisjZW5kaWYKKworLy8gaHdjbG9jayA+MChmYXN0KWYocnRjKTp1KHV0YylsKGxvY2FsdGltZSl0KHN5c3R6KXMoaGN0b3N5cylyKHNob3cpdyhzeXN0b2hjKVstdWxdWyFydHN3XSA+MChmYXN0KWYocnRjKTp1KHV0YylsKGxvY2FsdGltZSl0KHN5c3R6KXMoaGN0b3N5cylyKHNob3cpdyhzeXN0b2hjKVstdWxdWyFydHN3XQorI3VuZGVmIE9QVFNUUl9od2Nsb2NrCisjZGVmaW5lIE9QVFNUUl9od2Nsb2NrICI+MChmYXN0KWYocnRjKTp1KHV0YylsKGxvY2FsdGltZSl0KHN5c3R6KXMoaGN0b3N5cylyKHNob3cpdyhzeXN0b2hjKVstdWxdWyFydHN3XSIKKyNpZmRlZiBDTEVBTlVQX2h3Y2xvY2sKKyN1bmRlZiBDTEVBTlVQX2h3Y2xvY2sKKyN1bmRlZiBGT1JfaHdjbG9jaworI3VuZGVmIEZMQUdfc3lzdG9oYworI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfc2hvdworI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfaGN0b3N5cworI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfc3lzdHoKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX2xvY2FsdGltZQorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfdXRjCisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19ydGMKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2Zhc3QKKyNlbmRpZgorCisvLyBpY29udiAgIGNzdDpmOgorI3VuZGVmIE9QVFNUUl9pY29udgorI2RlZmluZSBPUFRTVFJfaWNvbnYgImNzdDpmOiIKKyNpZmRlZiBDTEVBTlVQX2ljb252CisjdW5kZWYgQ0xFQU5VUF9pY29udgorI3VuZGVmIEZPUl9pY29udgorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfYworI2VuZGlmCisKKy8vIGlkID4xWm5HZ3J1WyFaR2d1XSA+MVpuR2dydVshWkdndV0KKyN1bmRlZiBPUFRTVFJfaWQKKyNkZWZpbmUgT1BUU1RSX2lkICI+MVpuR2dydVshWkdndV0iCisjaWZkZWYgQ0xFQU5VUF9pZAorI3VuZGVmIENMRUFOVVBfaWQKKyN1bmRlZiBGT1JfaWQKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX0cKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX1oKKyNlbmRpZgorCisvLyBpZmNvbmZpZyBeP2EgXj9hCisjdW5kZWYgT1BUU1RSX2lmY29uZmlnCisjZGVmaW5lIE9QVFNUUl9pZmNvbmZpZyAiXj9hIgorI2lmZGVmIENMRUFOVVBfaWZjb25maWcKKyN1bmRlZiBDTEVBTlVQX2lmY29uZmlnCisjdW5kZWYgRk9SX2lmY29uZmlnCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gaW5pdCAgICAKKyN1bmRlZiBPUFRTVFJfaW5pdAorI2RlZmluZSBPUFRTVFJfaW5pdCAwCisjaWZkZWYgQ0xFQU5VUF9pbml0CisjdW5kZWYgQ0xFQU5VUF9pbml0CisjdW5kZWYgRk9SX2luaXQKKyNlbmRpZgorCisvLyBpbm90aWZ5ZCA8MiA8MgorI3VuZGVmIE9QVFNUUl9pbm90aWZ5ZAorI2RlZmluZSBPUFRTVFJfaW5vdGlmeWQgIjwyIgorI2lmZGVmIENMRUFOVVBfaW5vdGlmeWQKKyN1bmRlZiBDTEVBTlVQX2lub3RpZnlkCisjdW5kZWYgRk9SX2lub3RpZnlkCisjZW5kaWYKKworLy8gaW5zbW9kIDwxIDwxCisjdW5kZWYgT1BUU1RSX2luc21vZAorI2RlZmluZSBPUFRTVFJfaW5zbW9kICI8MSIKKyNpZmRlZiBDTEVBTlVQX2luc21vZAorI3VuZGVmIENMRUFOVVBfaW5zbW9kCisjdW5kZWYgRk9SX2luc21vZAorI2VuZGlmCisKKy8vIGluc3RhbGwgPDFjZERwc3ZtOm86ZzogPDFjZERwc3ZtOm86ZzoKKyN1bmRlZiBPUFRTVFJfaW5zdGFsbAorI2RlZmluZSBPUFRTVFJfaW5zdGFsbCAiPDFjZERwc3ZtOm86ZzoiCisjaWZkZWYgQ0xFQU5VUF9pbnN0YWxsCisjdW5kZWYgQ0xFQU5VUF9pbnN0YWxsCisjdW5kZWYgRk9SX2luc3RhbGwKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX0QKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyBpb25pY2UgXnRjIzwwPjM9Mm4jPDA+Nz01cCMgXnRjIzwwPjM9Mm4jPDA+Nz01cCMKKyN1bmRlZiBPUFRTVFJfaW9uaWNlCisjZGVmaW5lIE9QVFNUUl9pb25pY2UgIl50YyM8MD4zPTJuIzwwPjc9NXAjIgorI2lmZGVmIENMRUFOVVBfaW9uaWNlCisjdW5kZWYgQ0xFQU5VUF9pb25pY2UKKyN1bmRlZiBGT1JfaW9uaWNlCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR190CisjZW5kaWYKKworLy8gaW9yZW5pY2UgPzwxPjMgPzwxPjMKKyN1bmRlZiBPUFRTVFJfaW9yZW5pY2UKKyNkZWZpbmUgT1BUU1RSX2lvcmVuaWNlICI/PDE+MyIKKyNpZmRlZiBDTEVBTlVQX2lvcmVuaWNlCisjdW5kZWYgQ0xFQU5VUF9pb3JlbmljZQorI3VuZGVmIEZPUl9pb3JlbmljZQorI2VuZGlmCisKKy8vIGlvdG9wICAgPjBBYUtPaypvKnAqdSpzIzwxPTdkIz0zPDFuIzwxYnEKKyN1bmRlZiBPUFRTVFJfaW90b3AKKyNkZWZpbmUgT1BUU1RSX2lvdG9wICI+MEFhS09rKm8qcCp1KnMjPDE9N2QjPTM8MW4jPDFicSIKKyNpZmRlZiBDTEVBTlVQX2lvdG9wCisjdW5kZWYgQ0xFQU5VUF9pb3RvcAorI3VuZGVmIEZPUl9pb3RvcAorI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfbworI3VuZGVmIEZMQUdfaworI3VuZGVmIEZMQUdfTworI3VuZGVmIEZMQUdfSworI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfQQorI2VuZGlmCisKKy8vIGlwICAgIAorI3VuZGVmIE9QVFNUUl9pcAorI2RlZmluZSBPUFRTVFJfaXAgMAorI2lmZGVmIENMRUFOVVBfaXAKKyN1bmRlZiBDTEVBTlVQX2lwCisjdW5kZWYgRk9SX2lwCisjZW5kaWYKKworLy8gaXBjcm0gICBtKk0qcypTKnEqUSoKKyN1bmRlZiBPUFRTVFJfaXBjcm0KKyNkZWZpbmUgT1BUU1RSX2lwY3JtICJtKk0qcypTKnEqUSoiCisjaWZkZWYgQ0xFQU5VUF9pcGNybQorI3VuZGVmIENMRUFOVVBfaXBjcm0KKyN1bmRlZiBGT1JfaXBjcm0KKyN1bmRlZiBGTEFHX1EKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX00KKyN1bmRlZiBGTEFHX20KKyNlbmRpZgorCisvLyBpcGNzICAgYWNwdHVsc3FtaSMKKyN1bmRlZiBPUFRTVFJfaXBjcworI2RlZmluZSBPUFRTVFJfaXBjcyAiYWNwdHVsc3FtaSMiCisjaWZkZWYgQ0xFQU5VUF9pcGNzCisjdW5kZWYgQ0xFQU5VUF9pcGNzCisjdW5kZWYgRk9SX2lwY3MKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX2EKKyNlbmRpZgorCisvLyBraWxsID9sczogID9sczogCisjdW5kZWYgT1BUU1RSX2tpbGwKKyNkZWZpbmUgT1BUU1RSX2tpbGwgIj9sczogIgorI2lmZGVmIENMRUFOVVBfa2lsbAorI3VuZGVmIENMRUFOVVBfa2lsbAorI3VuZGVmIEZPUl9raWxsCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19sCisjZW5kaWYKKworLy8ga2lsbGFsbCA/czpscXZpID9zOmxxdmkKKyN1bmRlZiBPUFRTVFJfa2lsbGFsbAorI2RlZmluZSBPUFRTVFJfa2lsbGFsbCAiP3M6bHF2aSIKKyNpZmRlZiBDTEVBTlVQX2tpbGxhbGwKKyN1bmRlZiBDTEVBTlVQX2tpbGxhbGwKKyN1bmRlZiBGT1Jfa2lsbGFsbAorI3VuZGVmIEZMQUdfaQorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfcworI2VuZGlmCisKKy8vIGtpbGxhbGw1ICAgP28qbHM6IFshbG9dWyFsc10KKyN1bmRlZiBPUFRTVFJfa2lsbGFsbDUKKyNkZWZpbmUgT1BUU1RSX2tpbGxhbGw1ICI/bypsczogWyFsb11bIWxzXSIKKyNpZmRlZiBDTEVBTlVQX2tpbGxhbGw1CisjdW5kZWYgQ0xFQU5VUF9raWxsYWxsNQorI3VuZGVmIEZPUl9raWxsYWxsNQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfbworI2VuZGlmCisKKy8vIGtsb2dkICAgYyM8MT44bgorI3VuZGVmIE9QVFNUUl9rbG9nZAorI2RlZmluZSBPUFRTVFJfa2xvZ2QgImMjPDE+OG4iCisjaWZkZWYgQ0xFQU5VUF9rbG9nZAorI3VuZGVmIENMRUFOVVBfa2xvZ2QKKyN1bmRlZiBGT1Jfa2xvZ2QKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyBsYXN0ICAgZjpXCisjdW5kZWYgT1BUU1RSX2xhc3QKKyNkZWZpbmUgT1BUU1RSX2xhc3QgImY6VyIKKyNpZmRlZiBDTEVBTlVQX2xhc3QKKyN1bmRlZiBDTEVBTlVQX2xhc3QKKyN1bmRlZiBGT1JfbGFzdAorI3VuZGVmIEZMQUdfVworI3VuZGVmIEZMQUdfZgorI2VuZGlmCisKKy8vIGxpbmsgICA8Mj4yCisjdW5kZWYgT1BUU1RSX2xpbmsKKyNkZWZpbmUgT1BUU1RSX2xpbmsgIjwyPjIiCisjaWZkZWYgQ0xFQU5VUF9saW5rCisjdW5kZWYgQ0xFQU5VUF9saW5rCisjdW5kZWYgRk9SX2xpbmsKKyNlbmRpZgorCisvLyBsbiA8MXZuZnMgPDF2bmZzCisjdW5kZWYgT1BUU1RSX2xuCisjZGVmaW5lIE9QVFNUUl9sbiAiPDF2bmZzIgorI2lmZGVmIENMRUFOVVBfbG4KKyN1bmRlZiBDTEVBTlVQX2xuCisjdW5kZWYgRk9SX2xuCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR192CisjZW5kaWYKKworLy8gbG9hZF9wb2xpY3kgPDE+MSA8MT4xCisjdW5kZWYgT1BUU1RSX2xvYWRfcG9saWN5CisjZGVmaW5lIE9QVFNUUl9sb2FkX3BvbGljeSAiPDE+MSIKKyNpZmRlZiBDTEVBTlVQX2xvYWRfcG9saWN5CisjdW5kZWYgQ0xFQU5VUF9sb2FkX3BvbGljeQorI3VuZGVmIEZPUl9sb2FkX3BvbGljeQorI2VuZGlmCisKKy8vIGxvZyA8MXA6dDogPDFwOnQ6CisjdW5kZWYgT1BUU1RSX2xvZworI2RlZmluZSBPUFRTVFJfbG9nICI8MXA6dDoiCisjaWZkZWYgQ0xFQU5VUF9sb2cKKyN1bmRlZiBDTEVBTlVQX2xvZworI3VuZGVmIEZPUl9sb2cKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3AKKyNlbmRpZgorCisvLyBsb2dnZXIgICBzdDpwOgorI3VuZGVmIE9QVFNUUl9sb2dnZXIKKyNkZWZpbmUgT1BUU1RSX2xvZ2dlciAic3Q6cDoiCisjaWZkZWYgQ0xFQU5VUF9sb2dnZXIKKyN1bmRlZiBDTEVBTlVQX2xvZ2dlcgorI3VuZGVmIEZPUl9sb2dnZXIKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3MKKyNlbmRpZgorCisvLyBsb2dpbiAgID4xZjpwaDoKKyN1bmRlZiBPUFRTVFJfbG9naW4KKyNkZWZpbmUgT1BUU1RSX2xvZ2luICI+MWY6cGg6IgorI2lmZGVmIENMRUFOVVBfbG9naW4KKyN1bmRlZiBDTEVBTlVQX2xvZ2luCisjdW5kZWYgRk9SX2xvZ2luCisjdW5kZWYgRkxBR19oCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gbG9nbmFtZSA+MCA+MAorI3VuZGVmIE9QVFNUUl9sb2duYW1lCisjZGVmaW5lIE9QVFNUUl9sb2duYW1lICI+MCIKKyNpZmRlZiBDTEVBTlVQX2xvZ25hbWUKKyN1bmRlZiBDTEVBTlVQX2xvZ25hbWUKKyN1bmRlZiBGT1JfbG9nbmFtZQorI2VuZGlmCisKKy8vIGxvc2V0dXAgPjJTKHNpemVsaW1pdCkjcyhzaG93KXJvI2o6ZmRjYVshYWZqXSA+MlMoc2l6ZWxpbWl0KSNzKHNob3cpcm8jajpmZGNhWyFhZmpdCisjdW5kZWYgT1BUU1RSX2xvc2V0dXAKKyNkZWZpbmUgT1BUU1RSX2xvc2V0dXAgIj4yUyhzaXplbGltaXQpI3Moc2hvdylybyNqOmZkY2FbIWFmal0iCisjaWZkZWYgQ0xFQU5VUF9sb3NldHVwCisjdW5kZWYgQ0xFQU5VUF9sb3NldHVwCisjdW5kZWYgRk9SX2xvc2V0dXAKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2oKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX3Nob3cKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3NpemVsaW1pdAorI3VuZGVmIEZMQUdfUworI2VuZGlmCisKKy8vIGxzIChjb2xvcik6O1pnb0FDRkhMUlNhYmNkZmhpa2xtbnBxcnN0dXgxWy1DeG0xXVstQ3htbF1bLUN4bW9dWy1DeG1nXVstY3VdWy1mdFNdWy1ITF1bIXFiXSAoY29sb3IpOjtaZ29BQ0ZITFJTYWJjZGZoaWtsbW5wcXJzdHV4MVstQ3htMV1bLUN4bWxdWy1DeG1vXVstQ3htZ11bLWN1XVstZnRTXVstSExdWyFxYl0KKyN1bmRlZiBPUFRTVFJfbHMKKyNkZWZpbmUgT1BUU1RSX2xzICIoY29sb3IpOjtaZ29BQ0ZITFJTYWJjZGZoaWtsbW5wcXJzdHV4MVstQ3htMV1bLUN4bWxdWy1DeG1vXVstQ3htZ11bLWN1XVstZnRTXVstSExdWyFxYl0iCisjaWZkZWYgQ0xFQU5VUF9scworI3VuZGVmIENMRUFOVVBfbHMKKyN1bmRlZiBGT1JfbHMKKyN1bmRlZiBGTEFHXzEKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX2sKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX1IKKyN1bmRlZiBGTEFHX0wKKyN1bmRlZiBGTEFHX0gKKyN1bmRlZiBGTEFHX0YKKyN1bmRlZiBGTEFHX0MKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX1oKKyN1bmRlZiBGTEFHX2NvbG9yCisjZW5kaWYKKworLy8gbHNhdHRyIHZsZGFSIHZsZGFSCisjdW5kZWYgT1BUU1RSX2xzYXR0cgorI2RlZmluZSBPUFRTVFJfbHNhdHRyICJ2bGRhUiIKKyNpZmRlZiBDTEVBTlVQX2xzYXR0cgorI3VuZGVmIENMRUFOVVBfbHNhdHRyCisjdW5kZWYgRk9SX2xzYXR0cgorI3VuZGVmIEZMQUdfUgorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfdgorI2VuZGlmCisKKy8vIGxzbW9kICAgIAorI3VuZGVmIE9QVFNUUl9sc21vZAorI2RlZmluZSBPUFRTVFJfbHNtb2QgMAorI2lmZGVmIENMRUFOVVBfbHNtb2QKKyN1bmRlZiBDTEVBTlVQX2xzbW9kCisjdW5kZWYgRk9SX2xzbW9kCisjZW5kaWYKKworLy8gbHNvZiBscCp0IGxwKnQKKyN1bmRlZiBPUFRTVFJfbHNvZgorI2RlZmluZSBPUFRTVFJfbHNvZiAibHAqdCIKKyNpZmRlZiBDTEVBTlVQX2xzb2YKKyN1bmRlZiBDTEVBTlVQX2xzb2YKKyN1bmRlZiBGT1JfbHNvZgorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfbAorI2VuZGlmCisKKy8vIGxzcGNpICAgZW1rbkBpOgorI3VuZGVmIE9QVFNUUl9sc3BjaQorI2RlZmluZSBPUFRTVFJfbHNwY2kgImVta25AaToiCisjaWZkZWYgQ0xFQU5VUF9sc3BjaQorI3VuZGVmIENMRUFOVVBfbHNwY2kKKyN1bmRlZiBGT1JfbHNwY2kKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX2sKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX2UKKyNlbmRpZgorCisvLyBsc3VzYiAgICAKKyN1bmRlZiBPUFRTVFJfbHN1c2IKKyNkZWZpbmUgT1BUU1RSX2xzdXNiIDAKKyNpZmRlZiBDTEVBTlVQX2xzdXNiCisjdW5kZWYgQ0xFQU5VUF9sc3VzYgorI3VuZGVmIEZPUl9sc3VzYgorI2VuZGlmCisKKy8vIG1ha2VkZXZzIDwxPjFkOiA8MT4xZDoKKyN1bmRlZiBPUFRTVFJfbWFrZWRldnMKKyNkZWZpbmUgT1BUU1RSX21ha2VkZXZzICI8MT4xZDoiCisjaWZkZWYgQ0xFQU5VUF9tYWtlZGV2cworI3VuZGVmIENMRUFOVVBfbWFrZWRldnMKKyN1bmRlZiBGT1JfbWFrZWRldnMKKyN1bmRlZiBGTEFHX2QKKyNlbmRpZgorCisvLyBtZDVzdW0gYmMqWyFiY10gYmMqWyFiY10KKyN1bmRlZiBPUFRTVFJfbWQ1c3VtCisjZGVmaW5lIE9QVFNUUl9tZDVzdW0gImJjKlshYmNdIgorI2lmZGVmIENMRUFOVVBfbWQ1c3VtCisjdW5kZWYgQ0xFQU5VUF9tZDVzdW0KKyN1bmRlZiBGT1JfbWQ1c3VtCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19iCisjZW5kaWYKKworLy8gbWRldiAgIHMKKyN1bmRlZiBPUFRTVFJfbWRldgorI2RlZmluZSBPUFRTVFJfbWRldiAicyIKKyNpZmRlZiBDTEVBTlVQX21kZXYKKyN1bmRlZiBDTEVBTlVQX21kZXYKKyN1bmRlZiBGT1JfbWRldgorI3VuZGVmIEZMQUdfcworI2VuZGlmCisKKy8vIG1peCAgIGM6ZDpsI3IjCisjdW5kZWYgT1BUU1RSX21peAorI2RlZmluZSBPUFRTVFJfbWl4ICJjOmQ6bCNyIyIKKyNpZmRlZiBDTEVBTlVQX21peAorI3VuZGVmIENMRUFOVVBfbWl4CisjdW5kZWYgRk9SX21peAorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfYworI2VuZGlmCisKKy8vIG1rZGlyIDwxWjp2cG06IDwxWjp2cG06CisjdW5kZWYgT1BUU1RSX21rZGlyCisjZGVmaW5lIE9QVFNUUl9ta2RpciAiPDFaOnZwbToiCisjaWZkZWYgQ0xFQU5VUF9ta2RpcgorI3VuZGVmIENMRUFOVVBfbWtkaXIKKyN1bmRlZiBGT1JfbWtkaXIKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX1oKKyNlbmRpZgorCisvLyBta2UyZnMgICA8MT4yZzpGbnFtI04jaSNiIworI3VuZGVmIE9QVFNUUl9ta2UyZnMKKyNkZWZpbmUgT1BUU1RSX21rZTJmcyAiPDE+Mmc6Rm5xbSNOI2kjYiMiCisjaWZkZWYgQ0xFQU5VUF9ta2UyZnMKKyN1bmRlZiBDTEVBTlVQX21rZTJmcworI3VuZGVmIEZPUl9ta2UyZnMKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX04KKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX0YKKyN1bmRlZiBGTEFHX2cKKyNlbmRpZgorCisvLyBta2ZpZm8gPDFaOm06IDwxWjptOgorI3VuZGVmIE9QVFNUUl9ta2ZpZm8KKyNkZWZpbmUgT1BUU1RSX21rZmlmbyAiPDFaOm06IgorI2lmZGVmIENMRUFOVVBfbWtmaWZvCisjdW5kZWYgQ0xFQU5VUF9ta2ZpZm8KKyN1bmRlZiBGT1JfbWtmaWZvCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19aCisjZW5kaWYKKworLy8gbWtub2QgPDI+NG0obW9kZSk6WjogPDI+NG0obW9kZSk6WjoKKyN1bmRlZiBPUFRTVFJfbWtub2QKKyNkZWZpbmUgT1BUU1RSX21rbm9kICI8Mj40bShtb2RlKTpaOiIKKyNpZmRlZiBDTEVBTlVQX21rbm9kCisjdW5kZWYgQ0xFQU5VUF9ta25vZAorI3VuZGVmIEZPUl9ta25vZAorI3VuZGVmIEZMQUdfWgorI3VuZGVmIEZMQUdfbW9kZQorI3VuZGVmIEZMQUdfbQorI2VuZGlmCisKKy8vIG1rcGFzc3dkICAgPjJTOm06UCM9MDwwCisjdW5kZWYgT1BUU1RSX21rcGFzc3dkCisjZGVmaW5lIE9QVFNUUl9ta3Bhc3N3ZCAiPjJTOm06UCM9MDwwIgorI2lmZGVmIENMRUFOVVBfbWtwYXNzd2QKKyN1bmRlZiBDTEVBTlVQX21rcGFzc3dkCisjdW5kZWYgRk9SX21rcGFzc3dkCisjdW5kZWYgRkxBR19QCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19TCisjZW5kaWYKKworLy8gbWtzd2FwIDwxPjFMOiA8MT4xTDoKKyN1bmRlZiBPUFRTVFJfbWtzd2FwCisjZGVmaW5lIE9QVFNUUl9ta3N3YXAgIjwxPjFMOiIKKyNpZmRlZiBDTEVBTlVQX21rc3dhcAorI3VuZGVmIENMRUFOVVBfbWtzd2FwCisjdW5kZWYgRk9SX21rc3dhcAorI3VuZGVmIEZMQUdfTAorI2VuZGlmCisKKy8vIG1rdGVtcCA+MXVxZChkaXJlY3RvcnkpcCh0bXBkaXIpOiA+MXVxZChkaXJlY3RvcnkpcCh0bXBkaXIpOgorI3VuZGVmIE9QVFNUUl9ta3RlbXAKKyNkZWZpbmUgT1BUU1RSX21rdGVtcCAiPjF1cWQoZGlyZWN0b3J5KXAodG1wZGlyKToiCisjaWZkZWYgQ0xFQU5VUF9ta3RlbXAKKyN1bmRlZiBDTEVBTlVQX21rdGVtcAorI3VuZGVmIEZPUl9ta3RlbXAKKyN1bmRlZiBGTEFHX3RtcGRpcgorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfZGlyZWN0b3J5CisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR191CisjZW5kaWYKKworLy8gbW9kaW5mbyA8MWI6azpGOjAgPDFiOms6RjowCisjdW5kZWYgT1BUU1RSX21vZGluZm8KKyNkZWZpbmUgT1BUU1RSX21vZGluZm8gIjwxYjprOkY6MCIKKyNpZmRlZiBDTEVBTlVQX21vZGluZm8KKyN1bmRlZiBDTEVBTlVQX21vZGluZm8KKyN1bmRlZiBGT1JfbW9kaW5mbworI3VuZGVmIEZMQUdfMAorI3VuZGVmIEZMQUdfRgorI3VuZGVmIEZMQUdfaworI3VuZGVmIEZMQUdfYgorI2VuZGlmCisKKy8vIG1vZHByb2JlICAgYWxycXZzRGIKKyN1bmRlZiBPUFRTVFJfbW9kcHJvYmUKKyNkZWZpbmUgT1BUU1RSX21vZHByb2JlICJhbHJxdnNEYiIKKyNpZmRlZiBDTEVBTlVQX21vZHByb2JlCisjdW5kZWYgQ0xFQU5VUF9tb2Rwcm9iZQorI3VuZGVmIEZPUl9tb2Rwcm9iZQorI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfRAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfYQorI2VuZGlmCisKKy8vIG1vcmUgICAgCisjdW5kZWYgT1BUU1RSX21vcmUKKyNkZWZpbmUgT1BUU1RSX21vcmUgMAorI2lmZGVmIENMRUFOVVBfbW9yZQorI3VuZGVmIENMRUFOVVBfbW9yZQorI3VuZGVmIEZPUl9tb3JlCisjZW5kaWYKKworLy8gbW91bnQgP086YWZucnZ3dDpvKlstcnddID9POmFmbnJ2d3Q6bypbLXJ3XQorI3VuZGVmIE9QVFNUUl9tb3VudAorI2RlZmluZSBPUFRTVFJfbW91bnQgIj9POmFmbnJ2d3Q6bypbLXJ3XSIKKyNpZmRlZiBDTEVBTlVQX21vdW50CisjdW5kZWYgQ0xFQU5VUF9tb3VudAorI3VuZGVmIEZPUl9tb3VudAorI3VuZGVmIEZMQUdfbworI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfTworI2VuZGlmCisKKy8vIG1vdW50cG9pbnQgPDFxZHhbLWR4XSA8MXFkeFstZHhdCisjdW5kZWYgT1BUU1RSX21vdW50cG9pbnQKKyNkZWZpbmUgT1BUU1RSX21vdW50cG9pbnQgIjwxcWR4Wy1keF0iCisjaWZkZWYgQ0xFQU5VUF9tb3VudHBvaW50CisjdW5kZWYgQ0xFQU5VUF9tb3VudHBvaW50CisjdW5kZWYgRk9SX21vdW50cG9pbnQKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX3EKKyNlbmRpZgorCisvLyBtdiA8MnZuRihyZW1vdmUtZGVzdGluYXRpb24pZmlbLW5pXSA8MnZuRihyZW1vdmUtZGVzdGluYXRpb24pZmlbLW5pXQorI3VuZGVmIE9QVFNUUl9tdgorI2RlZmluZSBPUFRTVFJfbXYgIjwydm5GKHJlbW92ZS1kZXN0aW5hdGlvbilmaVstbmldIgorI2lmZGVmIENMRUFOVVBfbXYKKyN1bmRlZiBDTEVBTlVQX212CisjdW5kZWYgRk9SX212CisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19yZW1vdmVfZGVzdGluYXRpb24KKyN1bmRlZiBGTEFHX0YKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3YKKyNlbmRpZgorCisvLyBuYmRfY2xpZW50IDwzPjNucyA8Mz4zbnMKKyN1bmRlZiBPUFRTVFJfbmJkX2NsaWVudAorI2RlZmluZSBPUFRTVFJfbmJkX2NsaWVudCAiPDM+M25zIgorI2lmZGVmIENMRUFOVVBfbmJkX2NsaWVudAorI3VuZGVmIENMRUFOVVBfbmJkX2NsaWVudAorI3VuZGVmIEZPUl9uYmRfY2xpZW50CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19uCisjZW5kaWYKKworLy8gbmV0Y2F0IF50bEx3I3AjczpxI2Y6IF50bEx3I3AjczpxI2Y6CisjdW5kZWYgT1BUU1RSX25ldGNhdAorI2RlZmluZSBPUFRTVFJfbmV0Y2F0ICJedGxMdyNwI3M6cSNmOiIKKyNpZmRlZiBDTEVBTlVQX25ldGNhdAorI3VuZGVmIENMRUFOVVBfbmV0Y2F0CisjdW5kZWYgRk9SX25ldGNhdAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfdAorI2VuZGlmCisKKy8vIG5ldHN0YXQgcFdyeHd1dG5lYWwgcFdyeHd1dG5lYWwKKyN1bmRlZiBPUFRTVFJfbmV0c3RhdAorI2RlZmluZSBPUFRTVFJfbmV0c3RhdCAicFdyeHd1dG5lYWwiCisjaWZkZWYgQ0xFQU5VUF9uZXRzdGF0CisjdW5kZWYgQ0xFQU5VUF9uZXRzdGF0CisjdW5kZWYgRk9SX25ldHN0YXQKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX1cKKyN1bmRlZiBGTEFHX3AKKyNlbmRpZgorCisvLyBuaWNlIF48MW4jIF48MW4jCisjdW5kZWYgT1BUU1RSX25pY2UKKyNkZWZpbmUgT1BUU1RSX25pY2UgIl48MW4jIgorI2lmZGVmIENMRUFOVVBfbmljZQorI3VuZGVmIENMRUFOVVBfbmljZQorI3VuZGVmIEZPUl9uaWNlCisjdW5kZWYgRkxBR19uCisjZW5kaWYKKworLy8gbmwgdiM8MT0xbCNiOm46czp3IzwwPTZFIHYjPDE9MWwjYjpuOnM6dyM8MD02RQorI3VuZGVmIE9QVFNUUl9ubAorI2RlZmluZSBPUFRTVFJfbmwgInYjPDE9MWwjYjpuOnM6dyM8MD02RSIKKyNpZmRlZiBDTEVBTlVQX25sCisjdW5kZWYgQ0xFQU5VUF9ubAorI3VuZGVmIEZPUl9ubAorI3VuZGVmIEZMQUdfRQorI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfdgorI2VuZGlmCisKKy8vIG5vaHVwIDwxXiA8MV4KKyN1bmRlZiBPUFRTVFJfbm9odXAKKyNkZWZpbmUgT1BUU1RSX25vaHVwICI8MV4iCisjaWZkZWYgQ0xFQU5VUF9ub2h1cAorI3VuZGVmIENMRUFOVVBfbm9odXAKKyN1bmRlZiBGT1Jfbm9odXAKKyNlbmRpZgorCisvLyBucHJvYyAgIChhbGwpCisjdW5kZWYgT1BUU1RSX25wcm9jCisjZGVmaW5lIE9QVFNUUl9ucHJvYyAiKGFsbCkiCisjaWZkZWYgQ0xFQU5VUF9ucHJvYworI3VuZGVmIENMRUFOVVBfbnByb2MKKyN1bmRlZiBGT1JfbnByb2MKKyN1bmRlZiBGTEFHX2FsbAorI2VuZGlmCisKKy8vIG5zZW50ZXIgICA8MUYobm8tZm9yayl0IzwxKHRhcmdldClpOihpcGMpO206KG1vdW50KTtuOihuZXQpO3A6KHBpZCk7dToodXRzKTtVOih1c2VyKTsKKyN1bmRlZiBPUFRTVFJfbnNlbnRlcgorI2RlZmluZSBPUFRTVFJfbnNlbnRlciAiPDFGKG5vLWZvcmspdCM8MSh0YXJnZXQpaTooaXBjKTttOihtb3VudCk7bjoobmV0KTtwOihwaWQpO3U6KHV0cyk7VToodXNlcik7IgorI2lmZGVmIENMRUFOVVBfbnNlbnRlcgorI3VuZGVmIENMRUFOVVBfbnNlbnRlcgorI3VuZGVmIEZPUl9uc2VudGVyCisjdW5kZWYgRkxBR191c2VyCisjdW5kZWYgRkxBR19VCisjdW5kZWYgRkxBR191dHMKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3BpZAorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfbmV0CisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19tb3VudAorI3VuZGVmIEZMQUdfbQorI3VuZGVmIEZMQUdfaXBjCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR190YXJnZXQKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX25vX2ZvcmsKKyN1bmRlZiBGTEFHX0YKKyNlbmRpZgorCisvLyBvZCBqI3Z3IzwxPTE2TiN4c29kY2JBOnQqIGojdncjPDE9MTZOI3hzb2RjYkE6dCoKKyN1bmRlZiBPUFRTVFJfb2QKKyNkZWZpbmUgT1BUU1RSX29kICJqI3Z3IzwxPTE2TiN4c29kY2JBOnQqIgorI2lmZGVmIENMRUFOVVBfb2QKKyN1bmRlZiBDTEVBTlVQX29kCisjdW5kZWYgRk9SX29kCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19BCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR19OCisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19qCisjZW5kaWYKKworLy8gb25laXQgICBePDFuYzpwM1shcG5dCisjdW5kZWYgT1BUU1RSX29uZWl0CisjZGVmaW5lIE9QVFNUUl9vbmVpdCAiXjwxbmM6cDNbIXBuXSIKKyNpZmRlZiBDTEVBTlVQX29uZWl0CisjdW5kZWYgQ0xFQU5VUF9vbmVpdAorI3VuZGVmIEZPUl9vbmVpdAorI3VuZGVmIEZMQUdfMworI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfbgorI2VuZGlmCisKKy8vIG9wZW52dCAgIGMjPDE+NjNzdworI3VuZGVmIE9QVFNUUl9vcGVudnQKKyNkZWZpbmUgT1BUU1RSX29wZW52dCAiYyM8MT42M3N3IgorI2lmZGVmIENMRUFOVVBfb3BlbnZ0CisjdW5kZWYgQ0xFQU5VUF9vcGVudnQKKyN1bmRlZiBGT1Jfb3BlbnZ0CisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19jCisjZW5kaWYKKworLy8gcGFydHByb2JlIDwxIDwxCisjdW5kZWYgT1BUU1RSX3BhcnRwcm9iZQorI2RlZmluZSBPUFRTVFJfcGFydHByb2JlICI8MSIKKyNpZmRlZiBDTEVBTlVQX3BhcnRwcm9iZQorI3VuZGVmIENMRUFOVVBfcGFydHByb2JlCisjdW5kZWYgRk9SX3BhcnRwcm9iZQorI2VuZGlmCisKKy8vIHBhc3N3ZCAgID4xYTpkbHUKKyN1bmRlZiBPUFRTVFJfcGFzc3dkCisjZGVmaW5lIE9QVFNUUl9wYXNzd2QgIj4xYTpkbHUiCisjaWZkZWYgQ0xFQU5VUF9wYXNzd2QKKyN1bmRlZiBDTEVBTlVQX3Bhc3N3ZAorI3VuZGVmIEZPUl9wYXNzd2QKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2EKKyNlbmRpZgorCisvLyBwYXN0ZSBkOnMgZDpzCisjdW5kZWYgT1BUU1RSX3Bhc3RlCisjZGVmaW5lIE9QVFNUUl9wYXN0ZSAiZDpzIgorI2lmZGVmIENMRUFOVVBfcGFzdGUKKyN1bmRlZiBDTEVBTlVQX3Bhc3RlCisjdW5kZWYgRk9SX3Bhc3RlCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19kCisjZW5kaWYKKworLy8gcGF0Y2ggKGRyeS1ydW4pZDp1bHAjaTpSIChkcnktcnVuKXhkOnVscCNpOlIKKyN1bmRlZiBPUFRTVFJfcGF0Y2gKKyNkZWZpbmUgT1BUU1RSX3BhdGNoICIoZHJ5LXJ1bikBZDp1bHAjaTpSIgorI2lmZGVmIENMRUFOVVBfcGF0Y2gKKyN1bmRlZiBDTEVBTlVQX3BhdGNoCisjdW5kZWYgRk9SX3BhdGNoCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR19kcnlfcnVuCisjZW5kaWYKKworLy8gcGdyZXAgP2NsZDp1KlUqdCpzKlAqZypHKmZub3Z4TDpbLW5vXSA/Y2xkOnUqVSp0KnMqUCpnKkcqZm5vdnhMOlstbm9dCisjdW5kZWYgT1BUU1RSX3BncmVwCisjZGVmaW5lIE9QVFNUUl9wZ3JlcCAiP2NsZDp1KlUqdCpzKlAqZypHKmZub3Z4TDpbLW5vXSIKKyNpZmRlZiBDTEVBTlVQX3BncmVwCisjdW5kZWYgQ0xFQU5VUF9wZ3JlcAorI3VuZGVmIEZPUl9wZ3JlcAorI3VuZGVmIEZMQUdfTAorI3VuZGVmIEZMQUdfeAorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfbworI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfRworI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfUAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfVQorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfYworI2VuZGlmCisKKy8vIHBpZG9mIDwxc286IDwxc286CisjdW5kZWYgT1BUU1RSX3BpZG9mCisjZGVmaW5lIE9QVFNUUl9waWRvZiAiPDFzbzoiCisjaWZkZWYgQ0xFQU5VUF9waWRvZgorI3VuZGVmIENMRUFOVVBfcGlkb2YKKyN1bmRlZiBGT1JfcGlkb2YKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX3MKKyNlbmRpZgorCisvLyBwaW5nICAgPDE+MXQjPDA+MjU1YyM8MHMjPDA+NjU1MzVJOlcjPDB3IzwwcTQ2Wy00Nl0KKyN1bmRlZiBPUFRTVFJfcGluZworI2RlZmluZSBPUFRTVFJfcGluZyAiPDE+MXQjPDA+MjU1YyM8MHMjPDA+NjU1MzVJOlcjPDB3IzwwcTQ2Wy00Nl0iCisjaWZkZWYgQ0xFQU5VUF9waW5nCisjdW5kZWYgQ0xFQU5VUF9waW5nCisjdW5kZWYgRk9SX3BpbmcKKyN1bmRlZiBGTEFHXzYKKyN1bmRlZiBGTEFHXzQKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX1cKKyN1bmRlZiBGTEFHX0kKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX3QKKyNlbmRpZgorCisvLyBwaXZvdF9yb290IDwyPjIgPDI+MgorI3VuZGVmIE9QVFNUUl9waXZvdF9yb290CisjZGVmaW5lIE9QVFNUUl9waXZvdF9yb290ICI8Mj4yIgorI2lmZGVmIENMRUFOVVBfcGl2b3Rfcm9vdAorI3VuZGVmIENMRUFOVVBfcGl2b3Rfcm9vdAorI3VuZGVmIEZPUl9waXZvdF9yb290CisjZW5kaWYKKworLy8gcGtpbGwgP1Z1KlUqdCpzKlAqZypHKmZub3Z4bDpbLW5vXSA/VnUqVSp0KnMqUCpnKkcqZm5vdnhsOlstbm9dCisjdW5kZWYgT1BUU1RSX3BraWxsCisjZGVmaW5lIE9QVFNUUl9wa2lsbCAiP1Z1KlUqdCpzKlAqZypHKmZub3Z4bDpbLW5vXSIKKyNpZmRlZiBDTEVBTlVQX3BraWxsCisjdW5kZWYgQ0xFQU5VUF9wa2lsbAorI3VuZGVmIEZPUl9wa2lsbAorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfeAorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfbworI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfRworI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfUAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfVQorI3VuZGVmIEZMQUdfdQorI3VuZGVmIEZMQUdfVgorI2VuZGlmCisKKy8vIHBtYXAgPDF4cSA8MXhxCisjdW5kZWYgT1BUU1RSX3BtYXAKKyNkZWZpbmUgT1BUU1RSX3BtYXAgIjwxeHEiCisjaWZkZWYgQ0xFQU5VUF9wbWFwCisjdW5kZWYgQ0xFQU5VUF9wbWFwCisjdW5kZWYgRk9SX3BtYXAKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3gKKyNlbmRpZgorCisvLyBwcmludGVudiAwKG51bGwpIDAobnVsbCkKKyN1bmRlZiBPUFRTVFJfcHJpbnRlbnYKKyNkZWZpbmUgT1BUU1RSX3ByaW50ZW52ICIwKG51bGwpIgorI2lmZGVmIENMRUFOVVBfcHJpbnRlbnYKKyN1bmRlZiBDTEVBTlVQX3ByaW50ZW52CisjdW5kZWYgRk9SX3ByaW50ZW52CisjdW5kZWYgRkxBR19udWxsCisjdW5kZWYgRkxBR18wCisjZW5kaWYKKworLy8gcHJpbnRmIDwxP14gPDE/XgorI3VuZGVmIE9QVFNUUl9wcmludGYKKyNkZWZpbmUgT1BUU1RSX3ByaW50ZiAiPDE/XiIKKyNpZmRlZiBDTEVBTlVQX3ByaW50ZgorI3VuZGVmIENMRUFOVVBfcHJpbnRmCisjdW5kZWYgRk9SX3ByaW50ZgorI2VuZGlmCisKKy8vIHBzIGsoc29ydCkqUChwcGlkKSphQWRlZmxNbm8qTypwKHBpZCkqcyp0KlR1KlUqZypHKndaWyFvbF1bK0FlXVshb09dIGsoc29ydCkqUChwcGlkKSphQWRlZmxNbm8qTypwKHBpZCkqcyp0KlR1KlUqZypHKndaWyFvbF1bK0FlXVshb09dCisjdW5kZWYgT1BUU1RSX3BzCisjZGVmaW5lIE9QVFNUUl9wcyAiayhzb3J0KSpQKHBwaWQpKmFBZGVmbE1ubypPKnAocGlkKSpzKnQqVHUqVSpnKkcqd1pbIW9sXVsrQWVdWyFvT10iCisjaWZkZWYgQ0xFQU5VUF9wcworI3VuZGVmIENMRUFOVVBfcHMKKyN1bmRlZiBGT1JfcHMKKyN1bmRlZiBGTEFHX1oKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX0cKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX1UKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX1QKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3BpZAorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfTworI3VuZGVmIEZMQUdfbworI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfTQorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfZQorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfQQorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfcHBpZAorI3VuZGVmIEZMQUdfUAorI3VuZGVmIEZMQUdfc29ydAorI3VuZGVmIEZMQUdfaworI2VuZGlmCisKKy8vIHB3ZCA+MExQWy1MUF0gPjBMUFstTFBdCisjdW5kZWYgT1BUU1RSX3B3ZAorI2RlZmluZSBPUFRTVFJfcHdkICI+MExQWy1MUF0iCisjaWZkZWYgQ0xFQU5VUF9wd2QKKyN1bmRlZiBDTEVBTlVQX3B3ZAorI3VuZGVmIEZPUl9wd2QKKyN1bmRlZiBGTEFHX1AKKyN1bmRlZiBGTEFHX0wKKyNlbmRpZgorCisvLyBwd2R4IDwxYSA8MWEKKyN1bmRlZiBPUFRTVFJfcHdkeAorI2RlZmluZSBPUFRTVFJfcHdkeCAiPDFhIgorI2lmZGVmIENMRUFOVVBfcHdkeAorI3VuZGVmIENMRUFOVVBfcHdkeAorI3VuZGVmIEZPUl9wd2R4CisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gcmVhZGFoZWFkICAgIAorI3VuZGVmIE9QVFNUUl9yZWFkYWhlYWQKKyNkZWZpbmUgT1BUU1RSX3JlYWRhaGVhZCAwCisjaWZkZWYgQ0xFQU5VUF9yZWFkYWhlYWQKKyN1bmRlZiBDTEVBTlVQX3JlYWRhaGVhZAorI3VuZGVmIEZPUl9yZWFkYWhlYWQKKyNlbmRpZgorCisvLyByZWFkbGluayA8MT4xZmVucVstZmVdIDwxPjFmZW5xWy1mZV0KKyN1bmRlZiBPUFRTVFJfcmVhZGxpbmsKKyNkZWZpbmUgT1BUU1RSX3JlYWRsaW5rICI8MT4xZmVucVstZmVdIgorI2lmZGVmIENMRUFOVVBfcmVhZGxpbmsKKyN1bmRlZiBDTEVBTlVQX3JlYWRsaW5rCisjdW5kZWYgRk9SX3JlYWRsaW5rCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19lCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gcmVhbHBhdGggPDEgPDEKKyN1bmRlZiBPUFRTVFJfcmVhbHBhdGgKKyNkZWZpbmUgT1BUU1RSX3JlYWxwYXRoICI8MSIKKyNpZmRlZiBDTEVBTlVQX3JlYWxwYXRoCisjdW5kZWYgQ0xFQU5VUF9yZWFscGF0aAorI3VuZGVmIEZPUl9yZWFscGF0aAorI2VuZGlmCisKKy8vIHJlYm9vdCAgIGZuCisjdW5kZWYgT1BUU1RSX3JlYm9vdAorI2RlZmluZSBPUFRTVFJfcmVib290ICJmbiIKKyNpZmRlZiBDTEVBTlVQX3JlYm9vdAorI3VuZGVmIENMRUFOVVBfcmVib290CisjdW5kZWYgRk9SX3JlYm9vdAorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfZgorI2VuZGlmCisKKy8vIHJlbmljZSA8MWdwdW4jfCA8MWdwdW4jfAorI3VuZGVmIE9QVFNUUl9yZW5pY2UKKyNkZWZpbmUgT1BUU1RSX3JlbmljZSAiPDFncHVuI3wiCisjaWZkZWYgQ0xFQU5VUF9yZW5pY2UKKyN1bmRlZiBDTEVBTlVQX3JlbmljZQorI3VuZGVmIEZPUl9yZW5pY2UKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX2cKKyNlbmRpZgorCisvLyByZXNldCAgICAKKyN1bmRlZiBPUFRTVFJfcmVzZXQKKyNkZWZpbmUgT1BUU1RSX3Jlc2V0IDAKKyNpZmRlZiBDTEVBTlVQX3Jlc2V0CisjdW5kZWYgQ0xFQU5VUF9yZXNldAorI3VuZGVmIEZPUl9yZXNldAorI2VuZGlmCisKKy8vIHJlc3RvcmVjb24gPDFERm5ScnYgPDFERm5ScnYKKyN1bmRlZiBPUFRTVFJfcmVzdG9yZWNvbgorI2RlZmluZSBPUFRTVFJfcmVzdG9yZWNvbiAiPDFERm5ScnYiCisjaWZkZWYgQ0xFQU5VUF9yZXN0b3JlY29uCisjdW5kZWYgQ0xFQU5VUF9yZXN0b3JlY29uCisjdW5kZWYgRk9SX3Jlc3RvcmVjb24KKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX1IKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX0YKKyN1bmRlZiBGTEFHX0QKKyNlbmRpZgorCisvLyByZXYgICAgCisjdW5kZWYgT1BUU1RSX3JldgorI2RlZmluZSBPUFRTVFJfcmV2IDAKKyNpZmRlZiBDTEVBTlVQX3JldgorI3VuZGVmIENMRUFOVVBfcmV2CisjdW5kZWYgRk9SX3JldgorI2VuZGlmCisKKy8vIHJma2lsbCA8MT4yIDwxPjIKKyN1bmRlZiBPUFRTVFJfcmZraWxsCisjZGVmaW5lIE9QVFNUUl9yZmtpbGwgIjwxPjIiCisjaWZkZWYgQ0xFQU5VUF9yZmtpbGwKKyN1bmRlZiBDTEVBTlVQX3Jma2lsbAorI3VuZGVmIEZPUl9yZmtpbGwKKyNlbmRpZgorCisvLyBybSBmaVJyWy1maV0gZmlSclstZmldCisjdW5kZWYgT1BUU1RSX3JtCisjZGVmaW5lIE9QVFNUUl9ybSAiZmlSclstZmldIgorI2lmZGVmIENMRUFOVVBfcm0KKyN1bmRlZiBDTEVBTlVQX3JtCisjdW5kZWYgRk9SX3JtCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gcm1kaXIgPDFwIDwxcAorI3VuZGVmIE9QVFNUUl9ybWRpcgorI2RlZmluZSBPUFRTVFJfcm1kaXIgIjwxcCIKKyNpZmRlZiBDTEVBTlVQX3JtZGlyCisjdW5kZWYgQ0xFQU5VUF9ybWRpcgorI3VuZGVmIEZPUl9ybWRpcgorI3VuZGVmIEZMQUdfcAorI2VuZGlmCisKKy8vIHJtbW9kIDwxd2YgPDF3ZgorI3VuZGVmIE9QVFNUUl9ybW1vZAorI2RlZmluZSBPUFRTVFJfcm1tb2QgIjwxd2YiCisjaWZkZWYgQ0xFQU5VUF9ybW1vZAorI3VuZGVmIENMRUFOVVBfcm1tb2QKKyN1bmRlZiBGT1Jfcm1tb2QKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX3cKKyNlbmRpZgorCisvLyByb3V0ZSAgID9uZUE6CisjdW5kZWYgT1BUU1RSX3JvdXRlCisjZGVmaW5lIE9QVFNUUl9yb3V0ZSAiP25lQToiCisjaWZkZWYgQ0xFQU5VUF9yb3V0ZQorI3VuZGVmIENMRUFOVVBfcm91dGUKKyN1bmRlZiBGT1Jfcm91dGUKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX24KKyNlbmRpZgorCisvLyBydW5jb24gPDIgPDIKKyN1bmRlZiBPUFRTVFJfcnVuY29uCisjZGVmaW5lIE9QVFNUUl9ydW5jb24gIjwyIgorI2lmZGVmIENMRUFOVVBfcnVuY29uCisjdW5kZWYgQ0xFQU5VUF9ydW5jb24KKyN1bmRlZiBGT1JfcnVuY29uCisjZW5kaWYKKworLy8gc2VkICh2ZXJzaW9uKWUqZippbkVyWytFcl0gKHZlcnNpb24pZSpmKmluRXJbK0VyXQorI3VuZGVmIE9QVFNUUl9zZWQKKyNkZWZpbmUgT1BUU1RSX3NlZCAiKHZlcnNpb24pZSpmKmluRXJbK0VyXSIKKyNpZmRlZiBDTEVBTlVQX3NlZAorI3VuZGVmIENMRUFOVVBfc2VkCisjdW5kZWYgRk9SX3NlZAorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfRQorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfaQorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfZQorI3VuZGVmIEZMQUdfdmVyc2lvbgorI2VuZGlmCisKKy8vIHNlbmRldmVudCA8ND40IDw0PjQKKyN1bmRlZiBPUFRTVFJfc2VuZGV2ZW50CisjZGVmaW5lIE9QVFNUUl9zZW5kZXZlbnQgIjw0PjQiCisjaWZkZWYgQ0xFQU5VUF9zZW5kZXZlbnQKKyN1bmRlZiBDTEVBTlVQX3NlbmRldmVudAorI3VuZGVmIEZPUl9zZW5kZXZlbnQKKyNlbmRpZgorCisvLyBzZXEgPDE+Mz9mOnM6d1shZnddIDwxPjM/ZjpzOndbIWZ3XQorI3VuZGVmIE9QVFNUUl9zZXEKKyNkZWZpbmUgT1BUU1RSX3NlcSAiPDE+Mz9mOnM6d1shZnddIgorI2lmZGVmIENMRUFOVVBfc2VxCisjdW5kZWYgQ0xFQU5VUF9zZXEKKyN1bmRlZiBGT1Jfc2VxCisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gc2V0ZW5mb3JjZSA8MT4xIDwxPjEKKyN1bmRlZiBPUFRTVFJfc2V0ZW5mb3JjZQorI2RlZmluZSBPUFRTVFJfc2V0ZW5mb3JjZSAiPDE+MSIKKyNpZmRlZiBDTEVBTlVQX3NldGVuZm9yY2UKKyN1bmRlZiBDTEVBTlVQX3NldGVuZm9yY2UKKyN1bmRlZiBGT1Jfc2V0ZW5mb3JjZQorI2VuZGlmCisKKy8vIHNldGZhdHRyIGhuOnx2Ong6fFsheHZdIGhuOnx2Ong6fFsheHZdCisjdW5kZWYgT1BUU1RSX3NldGZhdHRyCisjZGVmaW5lIE9QVFNUUl9zZXRmYXR0ciAiaG46fHY6eDp8WyF4dl0iCisjaWZkZWYgQ0xFQU5VUF9zZXRmYXR0cgorI3VuZGVmIENMRUFOVVBfc2V0ZmF0dHIKKyN1bmRlZiBGT1Jfc2V0ZmF0dHIKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX2gKKyNlbmRpZgorCisvLyBzZXRwcm9wIDwyPjIgPDI+MgorI3VuZGVmIE9QVFNUUl9zZXRwcm9wCisjZGVmaW5lIE9QVFNUUl9zZXRwcm9wICI8Mj4yIgorI2lmZGVmIENMRUFOVVBfc2V0cHJvcAorI3VuZGVmIENMRUFOVVBfc2V0cHJvcAorI3VuZGVmIEZPUl9zZXRwcm9wCisjZW5kaWYKKworLy8gc2V0c2lkIF48MXQgXjwxdAorI3VuZGVmIE9QVFNUUl9zZXRzaWQKKyNkZWZpbmUgT1BUU1RSX3NldHNpZCAiXjwxdCIKKyNpZmRlZiBDTEVBTlVQX3NldHNpZAorI3VuZGVmIENMRUFOVVBfc2V0c2lkCisjdW5kZWYgRk9SX3NldHNpZAorI3VuZGVmIEZMQUdfdAorI2VuZGlmCisKKy8vIHNoICAgYzppCisjdW5kZWYgT1BUU1RSX3NoCisjZGVmaW5lIE9QVFNUUl9zaCAiYzppIgorI2lmZGVmIENMRUFOVVBfc2gKKyN1bmRlZiBDTEVBTlVQX3NoCisjdW5kZWYgRk9SX3NoCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19jCisjZW5kaWYKKworLy8gc2hhMXN1bSBiYypbIWJjXSBiYypbIWJjXQorI3VuZGVmIE9QVFNUUl9zaGExc3VtCisjZGVmaW5lIE9QVFNUUl9zaGExc3VtICJiYypbIWJjXSIKKyNpZmRlZiBDTEVBTlVQX3NoYTFzdW0KKyN1bmRlZiBDTEVBTlVQX3NoYTFzdW0KKyN1bmRlZiBGT1Jfc2hhMXN1bQorI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfYgorI2VuZGlmCisKKy8vIHNocmVkICAgPDF6eHVzIzwxbiM8MW8jPDBmCisjdW5kZWYgT1BUU1RSX3NocmVkCisjZGVmaW5lIE9QVFNUUl9zaHJlZCAiPDF6eHVzIzwxbiM8MW8jPDBmIgorI2lmZGVmIENMRUFOVVBfc2hyZWQKKyN1bmRlZiBDTEVBTlVQX3NocmVkCisjdW5kZWYgRk9SX3NocmVkCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR196CisjZW5kaWYKKworLy8gc2tlbGV0b24gICAod2FscnVzKShibHViYmVyKTo7KGFsc28pOmVAZCpjI2I6YQorI3VuZGVmIE9QVFNUUl9za2VsZXRvbgorI2RlZmluZSBPUFRTVFJfc2tlbGV0b24gIih3YWxydXMpKGJsdWJiZXIpOjsoYWxzbyk6ZUBkKmMjYjphIgorI2lmZGVmIENMRUFOVVBfc2tlbGV0b24KKyN1bmRlZiBDTEVBTlVQX3NrZWxldG9uCisjdW5kZWYgRk9SX3NrZWxldG9uCisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19lCisjdW5kZWYgRkxBR19hbHNvCisjdW5kZWYgRkxBR19ibHViYmVyCisjdW5kZWYgRkxBR193YWxydXMKKyNlbmRpZgorCisvLyBza2VsZXRvbl9hbGlhcyAgIGIjZHEKKyN1bmRlZiBPUFRTVFJfc2tlbGV0b25fYWxpYXMKKyNkZWZpbmUgT1BUU1RSX3NrZWxldG9uX2FsaWFzICJiI2RxIgorI2lmZGVmIENMRUFOVVBfc2tlbGV0b25fYWxpYXMKKyN1bmRlZiBDTEVBTlVQX3NrZWxldG9uX2FsaWFzCisjdW5kZWYgRk9SX3NrZWxldG9uX2FsaWFzCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19iCisjZW5kaWYKKworLy8gc2xlZXAgPDEgPDEKKyN1bmRlZiBPUFRTVFJfc2xlZXAKKyNkZWZpbmUgT1BUU1RSX3NsZWVwICI8MSIKKyNpZmRlZiBDTEVBTlVQX3NsZWVwCisjdW5kZWYgQ0xFQU5VUF9zbGVlcAorI3VuZGVmIEZPUl9zbGVlcAorI2VuZGlmCisKKy8vIHNvcnQgZ1M6VDptbzprKnQ6eGJNY3N6ZGZpcnVuIGdTOlQ6bW86ayp0OnhiTWNzemRmaXJ1bgorI3VuZGVmIE9QVFNUUl9zb3J0CisjZGVmaW5lIE9QVFNUUl9zb3J0ICJnUzpUOm1vOmsqdDp4Yk1jc3pkZmlydW4iCisjaWZkZWYgQ0xFQU5VUF9zb3J0CisjdW5kZWYgQ0xFQU5VUF9zb3J0CisjdW5kZWYgRk9SX3NvcnQKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX3oKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX00KKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX2sKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX1QKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX2cKKyNlbmRpZgorCisvLyBzcGxpdCA+MmEjPDE9Mj45YiM8MWwjPDEgPjJhIzwxPTI+OWIjPDFsIzwxCisjdW5kZWYgT1BUU1RSX3NwbGl0CisjZGVmaW5lIE9QVFNUUl9zcGxpdCAiPjJhIzwxPTI+OWIjPDFsIzwxIgorI2lmZGVmIENMRUFOVVBfc3BsaXQKKyN1bmRlZiBDTEVBTlVQX3NwbGl0CisjdW5kZWYgRk9SX3NwbGl0CisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gc3RhcnQgICAgCisjdW5kZWYgT1BUU1RSX3N0YXJ0CisjZGVmaW5lIE9QVFNUUl9zdGFydCAwCisjaWZkZWYgQ0xFQU5VUF9zdGFydAorI3VuZGVmIENMRUFOVVBfc3RhcnQKKyN1bmRlZiBGT1Jfc3RhcnQKKyNlbmRpZgorCisvLyBzdGF0IDwxYzpmTHQgPDFjOmZMdAorI3VuZGVmIE9QVFNUUl9zdGF0CisjZGVmaW5lIE9QVFNUUl9zdGF0ICI8MWM6Zkx0IgorI2lmZGVmIENMRUFOVVBfc3RhdAorI3VuZGVmIENMRUFOVVBfc3RhdAorI3VuZGVmIEZPUl9zdGF0CisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19jCisjZW5kaWYKKworLy8gc3RvcCAgICAKKyN1bmRlZiBPUFRTVFJfc3RvcAorI2RlZmluZSBPUFRTVFJfc3RvcCAwCisjaWZkZWYgQ0xFQU5VUF9zdG9wCisjdW5kZWYgQ0xFQU5VUF9zdG9wCisjdW5kZWYgRk9SX3N0b3AKKyNlbmRpZgorCisvLyBzdHJpbmdzIGFuIz00PDFmbyBhbiM9NDwxZm8KKyN1bmRlZiBPUFRTVFJfc3RyaW5ncworI2RlZmluZSBPUFRTVFJfc3RyaW5ncyAiYW4jPTQ8MWZvIgorI2lmZGVmIENMRUFOVVBfc3RyaW5ncworI3VuZGVmIENMRUFOVVBfc3RyaW5ncworI3VuZGVmIEZPUl9zdHJpbmdzCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gc3UgICBsbXBjOnM6CisjdW5kZWYgT1BUU1RSX3N1CisjZGVmaW5lIE9QVFNUUl9zdSAibG1wYzpzOiIKKyNpZmRlZiBDTEVBTlVQX3N1CisjdW5kZWYgQ0xFQU5VUF9zdQorI3VuZGVmIEZPUl9zdQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfbQorI3VuZGVmIEZMQUdfbAorI2VuZGlmCisKKy8vIHN1bG9naW4gICB0IzwwPTAKKyN1bmRlZiBPUFRTVFJfc3Vsb2dpbgorI2RlZmluZSBPUFRTVFJfc3Vsb2dpbiAidCM8MD0wIgorI2lmZGVmIENMRUFOVVBfc3Vsb2dpbgorI3VuZGVmIENMRUFOVVBfc3Vsb2dpbgorI3VuZGVmIEZPUl9zdWxvZ2luCisjdW5kZWYgRkxBR190CisjZW5kaWYKKworLy8gc3dhcG9mZiA8MT4xIDwxPjEKKyN1bmRlZiBPUFRTVFJfc3dhcG9mZgorI2RlZmluZSBPUFRTVFJfc3dhcG9mZiAiPDE+MSIKKyNpZmRlZiBDTEVBTlVQX3N3YXBvZmYKKyN1bmRlZiBDTEVBTlVQX3N3YXBvZmYKKyN1bmRlZiBGT1Jfc3dhcG9mZgorI2VuZGlmCisKKy8vIHN3YXBvbiA8MT4xcCM8MD4zMjc2N2QgPDE+MXAjPDA+MzI3NjdkCisjdW5kZWYgT1BUU1RSX3N3YXBvbgorI2RlZmluZSBPUFRTVFJfc3dhcG9uICI8MT4xcCM8MD4zMjc2N2QiCisjaWZkZWYgQ0xFQU5VUF9zd2Fwb24KKyN1bmRlZiBDTEVBTlVQX3N3YXBvbgorI3VuZGVmIEZPUl9zd2Fwb24KKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX3AKKyNlbmRpZgorCisvLyBzd2l0Y2hfcm9vdCAgIDwyYzpoCisjdW5kZWYgT1BUU1RSX3N3aXRjaF9yb290CisjZGVmaW5lIE9QVFNUUl9zd2l0Y2hfcm9vdCAiPDJjOmgiCisjaWZkZWYgQ0xFQU5VUF9zd2l0Y2hfcm9vdAorI3VuZGVmIENMRUFOVVBfc3dpdGNoX3Jvb3QKKyN1bmRlZiBGT1Jfc3dpdGNoX3Jvb3QKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyBzeW5jICAgIAorI3VuZGVmIE9QVFNUUl9zeW5jCisjZGVmaW5lIE9QVFNUUl9zeW5jIDAKKyNpZmRlZiBDTEVBTlVQX3N5bmMKKyN1bmRlZiBDTEVBTlVQX3N5bmMKKyN1bmRlZiBGT1Jfc3luYworI2VuZGlmCisKKy8vIHN5c2N0bCBebmVOcXdwYUFbIWFwXVshYXFdWyFhd11bK2FBXSBebmVOcXdwYUFbIWFwXVshYXFdWyFhd11bK2FBXQorI3VuZGVmIE9QVFNUUl9zeXNjdGwKKyNkZWZpbmUgT1BUU1RSX3N5c2N0bCAiXm5lTnF3cGFBWyFhcF1bIWFxXVshYXddWythQV0iCisjaWZkZWYgQ0xFQU5VUF9zeXNjdGwKKyN1bmRlZiBDTEVBTlVQX3N5c2N0bAorI3VuZGVmIEZPUl9zeXNjdGwKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX04KKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX24KKyNlbmRpZgorCisvLyBzeXNsb2dkICAgPjBsIzwxPjg9OFI6YiM8MD45OT0xcyM8MD0yMDBtIzwwPjcxNTgyNzg3PTIwTzpwOmY6YTpuU0tMRAorI3VuZGVmIE9QVFNUUl9zeXNsb2dkCisjZGVmaW5lIE9QVFNUUl9zeXNsb2dkICI+MGwjPDE+OD04UjpiIzwwPjk5PTFzIzwwPTIwMG0jPDA+NzE1ODI3ODc9MjBPOnA6ZjphOm5TS0xEIgorI2lmZGVmIENMRUFOVVBfc3lzbG9nZAorI3VuZGVmIENMRUFOVVBfc3lzbG9nZAorI3VuZGVmIEZPUl9zeXNsb2dkCisjdW5kZWYgRkxBR19ECisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19LCisjdW5kZWYgRkxBR19TCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19PCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19iCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19sCisjZW5kaWYKKworLy8gdGFjICAgIAorI3VuZGVmIE9QVFNUUl90YWMKKyNkZWZpbmUgT1BUU1RSX3RhYyAwCisjaWZkZWYgQ0xFQU5VUF90YWMKKyN1bmRlZiBDTEVBTlVQX3RhYworI3VuZGVmIEZPUl90YWMKKyNlbmRpZgorCisvLyB0YWlsID9mYy1uLVstY25dID9mYy1uLVstY25dCisjdW5kZWYgT1BUU1RSX3RhaWwKKyNkZWZpbmUgT1BUU1RSX3RhaWwgIj9mYy1uLVstY25dIgorI2lmZGVmIENMRUFOVVBfdGFpbAorI3VuZGVmIENMRUFOVVBfdGFpbAorI3VuZGVmIEZPUl90YWlsCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gdGFyICYobm8tcmVjdXJzaW9uKShudW1lcmljLW93bmVyKShuby1zYW1lLXBlcm1pc3Npb25zKShvdmVyd3JpdGUpKGV4Y2x1ZGUpKih0by1jb21tYW5kKTpvKG5vLXNhbWUtb3duZXIpcChzYW1lLXBlcm1pc3Npb25zKWsoa2VlcC1vbGQpYyhjcmVhdGUpfGgoZGVyZWZlcmVuY2UpeChleHRyYWN0KXx0KGxpc3QpfHYodmVyYm9zZSl6KGd6aXApTyh0by1zdGRvdXQpbSh0b3VjaClYKGV4Y2x1ZGUtZnJvbSkqVChmaWxlcy1mcm9tKSpDKGRpcmVjdG9yeSk6ZihmaWxlKTpbIXR4Y10gJihuby1yZWN1cnNpb24pKG51bWVyaWMtb3duZXIpKG5vLXNhbWUtcGVybWlzc2lvbnMpKG92ZXJ3cml0ZSkoZXhjbHVkZSkqKHRvLWNvbW1hbmQpOm8obm8tc2FtZS1vd25lcilwKHNhbWUtcGVybWlzc2lvbnMpayhrZWVwLW9sZCljKGNyZWF0ZSl8aChkZXJlZmVyZW5jZSl4KGV4dHJhY3QpfHQobGlzdCl8dih2ZXJib3NlKXooZ3ppcClPKHRvLXN0ZG91dCltKHRvdWNoKVgoZXhjbHVkZS1mcm9tKSpUKGZpbGVzLWZyb20pKkMoZGlyZWN0b3J5KTpmKGZpbGUpOlshdHhjXQorI3VuZGVmIE9QVFNUUl90YXIKKyNkZWZpbmUgT1BUU1RSX3RhciAiJihuby1yZWN1cnNpb24pKG51bWVyaWMtb3duZXIpKG5vLXNhbWUtcGVybWlzc2lvbnMpKG92ZXJ3cml0ZSkoZXhjbHVkZSkqKHRvLWNvbW1hbmQpOm8obm8tc2FtZS1vd25lcilwKHNhbWUtcGVybWlzc2lvbnMpayhrZWVwLW9sZCljKGNyZWF0ZSl8aChkZXJlZmVyZW5jZSl4KGV4dHJhY3QpfHQobGlzdCl8dih2ZXJib3NlKXooZ3ppcClPKHRvLXN0ZG91dCltKHRvdWNoKVgoZXhjbHVkZS1mcm9tKSpUKGZpbGVzLWZyb20pKkMoZGlyZWN0b3J5KTpmKGZpbGUpOlshdHhjXSIKKyNpZmRlZiBDTEVBTlVQX3RhcgorI3VuZGVmIENMRUFOVVBfdGFyCisjdW5kZWYgRk9SX3RhcgorI3VuZGVmIEZMQUdfZmlsZQorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfZGlyZWN0b3J5CisjdW5kZWYgRkxBR19DCisjdW5kZWYgRkxBR19maWxlc19mcm9tCisjdW5kZWYgRkxBR19UCisjdW5kZWYgRkxBR19leGNsdWRlX2Zyb20KKyN1bmRlZiBGTEFHX1gKKyN1bmRlZiBGTEFHX3RvdWNoCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR190b19zdGRvdXQKKyN1bmRlZiBGTEFHX08KKyN1bmRlZiBGTEFHX2d6aXAKKyN1bmRlZiBGTEFHX3oKKyN1bmRlZiBGTEFHX3ZlcmJvc2UKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX2xpc3QKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX2V4dHJhY3QKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX2RlcmVmZXJlbmNlCisjdW5kZWYgRkxBR19oCisjdW5kZWYgRkxBR19jcmVhdGUKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX2tlZXBfb2xkCisjdW5kZWYgRkxBR19rCisjdW5kZWYgRkxBR19zYW1lX3Blcm1pc3Npb25zCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19ub19zYW1lX293bmVyCisjdW5kZWYgRkxBR19vCisjdW5kZWYgRkxBR190b19jb21tYW5kCisjdW5kZWYgRkxBR19leGNsdWRlCisjdW5kZWYgRkxBR19vdmVyd3JpdGUKKyN1bmRlZiBGTEFHX25vX3NhbWVfcGVybWlzc2lvbnMKKyN1bmRlZiBGTEFHX251bWVyaWNfb3duZXIKKyN1bmRlZiBGTEFHX25vX3JlY3Vyc2lvbgorI2VuZGlmCisKKy8vIHRhc2tzZXQgPDFecGEgPDFecGEKKyN1bmRlZiBPUFRTVFJfdGFza3NldAorI2RlZmluZSBPUFRTVFJfdGFza3NldCAiPDFecGEiCisjaWZkZWYgQ0xFQU5VUF90YXNrc2V0CisjdW5kZWYgQ0xFQU5VUF90YXNrc2V0CisjdW5kZWYgRk9SX3Rhc2tzZXQKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX3AKKyNlbmRpZgorCisvLyB0Y3BzdmQgICBePDNjIz0zMDwxQzpiIz0yMDwwdTpsOmhFdgorI3VuZGVmIE9QVFNUUl90Y3BzdmQKKyNkZWZpbmUgT1BUU1RSX3RjcHN2ZCAiXjwzYyM9MzA8MUM6YiM9MjA8MHU6bDpoRXYiCisjaWZkZWYgQ0xFQU5VUF90Y3BzdmQKKyN1bmRlZiBDTEVBTlVQX3RjcHN2ZAorI3VuZGVmIEZPUl90Y3BzdmQKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX0UKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX0MKKyN1bmRlZiBGTEFHX2MKKyNlbmRpZgorCisvLyB0ZWUgaWEgaWEKKyN1bmRlZiBPUFRTVFJfdGVlCisjZGVmaW5lIE9QVFNUUl90ZWUgImlhIgorI2lmZGVmIENMRUFOVVBfdGVlCisjdW5kZWYgQ0xFQU5VUF90ZWUKKyN1bmRlZiBGT1JfdGVlCisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19pCisjZW5kaWYKKworLy8gdGVsbmV0ICAgPDE+MgorI3VuZGVmIE9QVFNUUl90ZWxuZXQKKyNkZWZpbmUgT1BUU1RSX3RlbG5ldCAiPDE+MiIKKyNpZmRlZiBDTEVBTlVQX3RlbG5ldAorI3VuZGVmIENMRUFOVVBfdGVsbmV0CisjdW5kZWYgRk9SX3RlbG5ldAorI2VuZGlmCisKKy8vIHRlbG5ldGQgICB3IzwwYjpwIzwwPjY1NTM1PTIzZjpsOkZTS2lbIXdpXQorI3VuZGVmIE9QVFNUUl90ZWxuZXRkCisjZGVmaW5lIE9QVFNUUl90ZWxuZXRkICJ3IzwwYjpwIzwwPjY1NTM1PTIzZjpsOkZTS2lbIXdpXSIKKyNpZmRlZiBDTEVBTlVQX3RlbG5ldGQKKyN1bmRlZiBDTEVBTlVQX3RlbG5ldGQKKyN1bmRlZiBGT1JfdGVsbmV0ZAorI3VuZGVmIEZMQUdfaQorI3VuZGVmIEZMQUdfSworI3VuZGVmIEZMQUdfUworI3VuZGVmIEZMQUdfRgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfdworI2VuZGlmCisKKy8vIHRlc3QgICAgCisjdW5kZWYgT1BUU1RSX3Rlc3QKKyNkZWZpbmUgT1BUU1RSX3Rlc3QgMAorI2lmZGVmIENMRUFOVVBfdGVzdAorI3VuZGVmIENMRUFOVVBfdGVzdAorI3VuZGVmIEZPUl90ZXN0CisjZW5kaWYKKworLy8gdGVzdF9odW1hbl9yZWFkYWJsZSAgIDwxPjFpYnMKKyN1bmRlZiBPUFRTVFJfdGVzdF9odW1hbl9yZWFkYWJsZQorI2RlZmluZSBPUFRTVFJfdGVzdF9odW1hbl9yZWFkYWJsZSAiPDE+MWlicyIKKyNpZmRlZiBDTEVBTlVQX3Rlc3RfaHVtYW5fcmVhZGFibGUKKyN1bmRlZiBDTEVBTlVQX3Rlc3RfaHVtYW5fcmVhZGFibGUKKyN1bmRlZiBGT1JfdGVzdF9odW1hbl9yZWFkYWJsZQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfYgorI3VuZGVmIEZMQUdfaQorI2VuZGlmCisKKy8vIHRlc3RfbWFueV9vcHRpb25zICAgWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkF6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYQorI3VuZGVmIE9QVFNUUl90ZXN0X21hbnlfb3B0aW9ucworI2RlZmluZSBPUFRTVFJfdGVzdF9tYW55X29wdGlvbnMgIlpZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBenl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmEiCisjaWZkZWYgQ0xFQU5VUF90ZXN0X21hbnlfb3B0aW9ucworI3VuZGVmIENMRUFOVVBfdGVzdF9tYW55X29wdGlvbnMKKyN1bmRlZiBGT1JfdGVzdF9tYW55X29wdGlvbnMKKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX2YKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX2gKKyN1bmRlZiBGTEFHX2kKKyN1bmRlZiBGTEFHX2oKKyN1bmRlZiBGTEFHX2sKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX3cKKyN1bmRlZiBGTEFHX3gKKyN1bmRlZiBGTEFHX3kKKyN1bmRlZiBGTEFHX3oKKyN1bmRlZiBGTEFHX0EKKyN1bmRlZiBGTEFHX0IKKyN1bmRlZiBGTEFHX0MKKyN1bmRlZiBGTEFHX0QKKyN1bmRlZiBGTEFHX0UKKyN1bmRlZiBGTEFHX0YKKyN1bmRlZiBGTEFHX0cKKyN1bmRlZiBGTEFHX0gKKyN1bmRlZiBGTEFHX0kKKyN1bmRlZiBGTEFHX0oKKyN1bmRlZiBGTEFHX0sKKyN1bmRlZiBGTEFHX0wKKyN1bmRlZiBGTEFHX00KKyN1bmRlZiBGTEFHX04KKyN1bmRlZiBGTEFHX08KKyN1bmRlZiBGTEFHX1AKKyN1bmRlZiBGTEFHX1EKKyN1bmRlZiBGTEFHX1IKKyN1bmRlZiBGTEFHX1MKKyN1bmRlZiBGTEFHX1QKKyN1bmRlZiBGTEFHX1UKKyN1bmRlZiBGTEFHX1YKKyN1bmRlZiBGTEFHX1cKKyN1bmRlZiBGTEFHX1gKKyN1bmRlZiBGTEFHX1kKKyN1bmRlZiBGTEFHX1oKKyNlbmRpZgorCisvLyB0ZXN0X3NjYW5rZXkgICAgCisjdW5kZWYgT1BUU1RSX3Rlc3Rfc2NhbmtleQorI2RlZmluZSBPUFRTVFJfdGVzdF9zY2Fua2V5IDAKKyNpZmRlZiBDTEVBTlVQX3Rlc3Rfc2NhbmtleQorI3VuZGVmIENMRUFOVVBfdGVzdF9zY2Fua2V5CisjdW5kZWYgRk9SX3Rlc3Rfc2NhbmtleQorI2VuZGlmCisKKy8vIHRmdHAgICA8MWIjPDg+NjU0NjRyOmw6Z3xwfFshZ3BdCisjdW5kZWYgT1BUU1RSX3RmdHAKKyNkZWZpbmUgT1BUU1RSX3RmdHAgIjwxYiM8OD42NTQ2NHI6bDpnfHB8WyFncF0iCisjaWZkZWYgQ0xFQU5VUF90ZnRwCisjdW5kZWYgQ0xFQU5VUF90ZnRwCisjdW5kZWYgRk9SX3RmdHAKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX2cKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX2IKKyNlbmRpZgorCisvLyB0ZnRwZCAgIHJjdTpsCisjdW5kZWYgT1BUU1RSX3RmdHBkCisjZGVmaW5lIE9QVFNUUl90ZnRwZCAicmN1OmwiCisjaWZkZWYgQ0xFQU5VUF90ZnRwZAorI3VuZGVmIENMRUFOVVBfdGZ0cGQKKyN1bmRlZiBGT1JfdGZ0cGQKKyN1bmRlZiBGTEFHX2wKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX2MKKyN1bmRlZiBGTEFHX3IKKyNlbmRpZgorCisvLyB0aW1lIDwxXnAgPDFecAorI3VuZGVmIE9QVFNUUl90aW1lCisjZGVmaW5lIE9QVFNUUl90aW1lICI8MV5wIgorI2lmZGVmIENMRUFOVVBfdGltZQorI3VuZGVmIENMRUFOVVBfdGltZQorI3VuZGVmIEZPUl90aW1lCisjdW5kZWYgRkxBR19wCisjZW5kaWYKKworLy8gdGltZW91dCA8Ml52azpzOiAgPDJedms6czogCisjdW5kZWYgT1BUU1RSX3RpbWVvdXQKKyNkZWZpbmUgT1BUU1RSX3RpbWVvdXQgIjwyXnZrOnM6ICIKKyNpZmRlZiBDTEVBTlVQX3RpbWVvdXQKKyN1bmRlZiBDTEVBTlVQX3RpbWVvdXQKKyN1bmRlZiBGT1JfdGltZW91dAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfaworI3VuZGVmIEZMQUdfdgorI2VuZGlmCisKKy8vIHRvcCA+MG1PKkhrKm8qcCp1KnMjPDFkIz0zPDFuIzwxYnFbIW9PXSA+MG1PKkhrKm8qcCp1KnMjPDFkIz0zPDFuIzwxYnFbIW9PXQorI3VuZGVmIE9QVFNUUl90b3AKKyNkZWZpbmUgT1BUU1RSX3RvcCAiPjBtTypIaypvKnAqdSpzIzwxZCM9MzwxbiM8MWJxWyFvT10iCisjaWZkZWYgQ0xFQU5VUF90b3AKKyN1bmRlZiBDTEVBTlVQX3RvcAorI3VuZGVmIEZPUl90b3AKKyN1bmRlZiBGTEFHX3EKKyN1bmRlZiBGTEFHX2IKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX2QKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX3UKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX28KKyN1bmRlZiBGTEFHX2sKKyN1bmRlZiBGTEFHX0gKKyN1bmRlZiBGTEFHX08KKyN1bmRlZiBGTEFHX20KKyNlbmRpZgorCisvLyB0b3VjaCBhY2Q6bXI6dDpoWyFkdHJdIGFjZDptcjp0OmhbIWR0cl0KKyN1bmRlZiBPUFRTVFJfdG91Y2gKKyNkZWZpbmUgT1BUU1RSX3RvdWNoICJhY2Q6bXI6dDpoWyFkdHJdIgorI2lmZGVmIENMRUFOVVBfdG91Y2gKKyN1bmRlZiBDTEVBTlVQX3RvdWNoCisjdW5kZWYgRk9SX3RvdWNoCisjdW5kZWYgRkxBR19oCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19hCisjZW5kaWYKKworLy8gdG95Ym94ICAgIAorI3VuZGVmIE9QVFNUUl90b3lib3gKKyNkZWZpbmUgT1BUU1RSX3RveWJveCAwCisjaWZkZWYgQ0xFQU5VUF90b3lib3gKKyN1bmRlZiBDTEVBTlVQX3RveWJveAorI3VuZGVmIEZPUl90b3lib3gKKyNlbmRpZgorCisvLyB0ciBePjI8MUNjc2RbK2NDXSBePjI8MUNjc2RbK2NDXQorI3VuZGVmIE9QVFNUUl90cgorI2RlZmluZSBPUFRTVFJfdHIgIl4+MjwxQ2NzZFsrY0NdIgorI2lmZGVmIENMRUFOVVBfdHIKKyN1bmRlZiBDTEVBTlVQX3RyCisjdW5kZWYgRk9SX3RyCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19DCisjZW5kaWYKKworLy8gdHJhY2Vyb3V0ZSA8MT4yaTpmIzwxPjI1NT0xeiM8MD44NjQwMD0wZyp3IzwwPjg2NDAwPTV0IzwwPjI1NT0wczpxIzwxPjI1NT0zcCM8MT42NTUzNT0zMzQzNG0jPDE+MjU1PTMwcnZuZGxJVUY2NCA8MT4yaTpmIzwxPjI1NT0xeiM8MD44NjQwMD0wZyp3IzwwPjg2NDAwPTV0IzwwPjI1NT0wczpxIzwxPjI1NT0zcCM8MT42NTUzNT0zMzQzNG0jPDE+MjU1PTMwcnZuZGxJVUY2NAorI3VuZGVmIE9QVFNUUl90cmFjZXJvdXRlCisjZGVmaW5lIE9QVFNUUl90cmFjZXJvdXRlICI8MT4yaTpmIzwxPjI1NT0xeiM8MD44NjQwMD0wZyp3IzwwPjg2NDAwPTV0IzwwPjI1NT0wczpxIzwxPjI1NT0zcCM8MT42NTUzNT0zMzQzNG0jPDE+MjU1PTMwcnZuZGxJVUY2NCIKKyNpZmRlZiBDTEVBTlVQX3RyYWNlcm91dGUKKyN1bmRlZiBDTEVBTlVQX3RyYWNlcm91dGUKKyN1bmRlZiBGT1JfdHJhY2Vyb3V0ZQorI3VuZGVmIEZMQUdfNAorI3VuZGVmIEZMQUdfNgorI3VuZGVmIEZMQUdfRgorI3VuZGVmIEZMQUdfVQorI3VuZGVmIEZMQUdfSQorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfbQorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfcQorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfdworI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfegorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfaQorI2VuZGlmCisKKy8vIHRydWUgICAgCisjdW5kZWYgT1BUU1RSX3RydWUKKyNkZWZpbmUgT1BUU1RSX3RydWUgMAorI2lmZGVmIENMRUFOVVBfdHJ1ZQorI3VuZGVmIENMRUFOVVBfdHJ1ZQorI3VuZGVmIEZPUl90cnVlCisjZW5kaWYKKworLy8gdHJ1bmNhdGUgPDFzOnxjIDwxczp8YworI3VuZGVmIE9QVFNUUl90cnVuY2F0ZQorI2RlZmluZSBPUFRTVFJfdHJ1bmNhdGUgIjwxczp8YyIKKyNpZmRlZiBDTEVBTlVQX3RydW5jYXRlCisjdW5kZWYgQ0xFQU5VUF90cnVuY2F0ZQorI3VuZGVmIEZPUl90cnVuY2F0ZQorI3VuZGVmIEZMQUdfYworI3VuZGVmIEZMQUdfcworI2VuZGlmCisKKy8vIHR0eSBzIHMKKyN1bmRlZiBPUFRTVFJfdHR5CisjZGVmaW5lIE9QVFNUUl90dHkgInMiCisjaWZkZWYgQ0xFQU5VUF90dHkKKyN1bmRlZiBDTEVBTlVQX3R0eQorI3VuZGVmIEZPUl90dHkKKyN1bmRlZiBGTEFHX3MKKyNlbmRpZgorCisvLyB1bGltaXQgPjFQIzwxU0hhdnV0c3JScXBubWxpZmVkY1stU0hdWyFhcHZ1dHNyUnFubWxpZmVkY10gPjFQIzwxU0hhdnV0c3JScXBubWxpZmVkY1stU0hdWyFhcHZ1dHNyUnFubWxpZmVkY10KKyN1bmRlZiBPUFRTVFJfdWxpbWl0CisjZGVmaW5lIE9QVFNUUl91bGltaXQgIj4xUCM8MVNIYXZ1dHNyUnFwbm1saWZlZGNbLVNIXVshYXB2dXRzclJxbm1saWZlZGNdIgorI2lmZGVmIENMRUFOVVBfdWxpbWl0CisjdW5kZWYgQ0xFQU5VUF91bGltaXQKKyN1bmRlZiBGT1JfdWxpbWl0CisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19lCisjdW5kZWYgRkxBR19mCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR19tCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19xCisjdW5kZWYgRkxBR19SCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR192CisjdW5kZWYgRkxBR19hCisjdW5kZWYgRkxBR19ICisjdW5kZWYgRkxBR19TCisjdW5kZWYgRkxBR19QCisjZW5kaWYKKworLy8gdW1vdW50IG5kRGZscmF0KnZbIW5hXSBuZERmbHJhdCp2WyFuYV0KKyN1bmRlZiBPUFRTVFJfdW1vdW50CisjZGVmaW5lIE9QVFNUUl91bW91bnQgIm5kRGZscmF0KnZbIW5hXSIKKyNpZmRlZiBDTEVBTlVQX3Vtb3VudAorI3VuZGVmIENMRUFOVVBfdW1vdW50CisjdW5kZWYgRk9SX3Vtb3VudAorI3VuZGVmIEZMQUdfdgorI3VuZGVmIEZMQUdfdAorI3VuZGVmIEZMQUdfYQorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfZgorI3VuZGVmIEZMQUdfRAorI3VuZGVmIEZMQUdfZAorI3VuZGVmIEZMQUdfbgorI2VuZGlmCisKKy8vIHVuYW1lIG9hbXZybnNbK29zXSBvYW12cm5zWytvc10KKyN1bmRlZiBPUFRTVFJfdW5hbWUKKyNkZWZpbmUgT1BUU1RSX3VuYW1lICJvYW12cm5zWytvc10iCisjaWZkZWYgQ0xFQU5VUF91bmFtZQorI3VuZGVmIENMRUFOVVBfdW5hbWUKKyN1bmRlZiBGT1JfdW5hbWUKKyN1bmRlZiBGTEFHX3MKKyN1bmRlZiBGTEFHX24KKyN1bmRlZiBGTEFHX3IKKyN1bmRlZiBGTEFHX3YKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX2EKKyN1bmRlZiBGTEFHX28KKyNlbmRpZgorCisvLyB1bmlxIGYjcyN3I3ppY2R1IGYjcyN3I3ppY2R1CisjdW5kZWYgT1BUU1RSX3VuaXEKKyNkZWZpbmUgT1BUU1RSX3VuaXEgImYjcyN3I3ppY2R1IgorI2lmZGVmIENMRUFOVVBfdW5pcQorI3VuZGVmIENMRUFOVVBfdW5pcQorI3VuZGVmIEZPUl91bmlxCisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19kCisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19pCisjdW5kZWYgRkxBR196CisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gdW5peDJkb3MgICAgCisjdW5kZWYgT1BUU1RSX3VuaXgyZG9zCisjZGVmaW5lIE9QVFNUUl91bml4MmRvcyAwCisjaWZkZWYgQ0xFQU5VUF91bml4MmRvcworI3VuZGVmIENMRUFOVVBfdW5peDJkb3MKKyN1bmRlZiBGT1JfdW5peDJkb3MKKyNlbmRpZgorCisvLyB1bmxpbmsgICA8MT4xCisjdW5kZWYgT1BUU1RSX3VubGluaworI2RlZmluZSBPUFRTVFJfdW5saW5rICI8MT4xIgorI2lmZGVmIENMRUFOVVBfdW5saW5rCisjdW5kZWYgQ0xFQU5VUF91bmxpbmsKKyN1bmRlZiBGT1JfdW5saW5rCisjZW5kaWYKKworLy8gdW5zaGFyZSAgIDwxXmYoZm9yayk7cihtYXAtcm9vdC11c2VyKTtpOihpcGMpO206KG1vdW50KTtuOihuZXQpO3A6KHBpZCk7dToodXRzKTtVOih1c2VyKTsKKyN1bmRlZiBPUFRTVFJfdW5zaGFyZQorI2RlZmluZSBPUFRTVFJfdW5zaGFyZSAiPDFeZihmb3JrKTtyKG1hcC1yb290LXVzZXIpO2k6KGlwYyk7bToobW91bnQpO246KG5ldCk7cDoocGlkKTt1Oih1dHMpO1U6KHVzZXIpOyIKKyNpZmRlZiBDTEVBTlVQX3Vuc2hhcmUKKyN1bmRlZiBDTEVBTlVQX3Vuc2hhcmUKKyN1bmRlZiBGT1JfdW5zaGFyZQorI3VuZGVmIEZMQUdfdXNlcgorI3VuZGVmIEZMQUdfVQorI3VuZGVmIEZMQUdfdXRzCisjdW5kZWYgRkxBR191CisjdW5kZWYgRkxBR19waWQKKyN1bmRlZiBGTEFHX3AKKyN1bmRlZiBGTEFHX25ldAorI3VuZGVmIEZMQUdfbgorI3VuZGVmIEZMQUdfbW91bnQKKyN1bmRlZiBGTEFHX20KKyN1bmRlZiBGTEFHX2lwYworI3VuZGVmIEZMQUdfaQorI3VuZGVmIEZMQUdfbWFwX3Jvb3RfdXNlcgorI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfZm9yaworI3VuZGVmIEZMQUdfZgorI2VuZGlmCisKKy8vIHVwdGltZSAgICAKKyN1bmRlZiBPUFRTVFJfdXB0aW1lCisjZGVmaW5lIE9QVFNUUl91cHRpbWUgMAorI2lmZGVmIENMRUFOVVBfdXB0aW1lCisjdW5kZWYgQ0xFQU5VUF91cHRpbWUKKyN1bmRlZiBGT1JfdXB0aW1lCisjZW5kaWYKKworLy8gdXNlcmFkZCAgIDwxPjJ1IzwwRzpzOmc6aDpTREgKKyN1bmRlZiBPUFRTVFJfdXNlcmFkZAorI2RlZmluZSBPUFRTVFJfdXNlcmFkZCAiPDE+MnUjPDBHOnM6ZzpoOlNESCIKKyNpZmRlZiBDTEVBTlVQX3VzZXJhZGQKKyN1bmRlZiBDTEVBTlVQX3VzZXJhZGQKKyN1bmRlZiBGT1JfdXNlcmFkZAorI3VuZGVmIEZMQUdfSAorI3VuZGVmIEZMQUdfRAorI3VuZGVmIEZMQUdfUworI3VuZGVmIEZMQUdfaAorI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfRworI3VuZGVmIEZMQUdfdQorI2VuZGlmCisKKy8vIHVzZXJkZWwgICA8MT4xcgorI3VuZGVmIE9QVFNUUl91c2VyZGVsCisjZGVmaW5lIE9QVFNUUl91c2VyZGVsICI8MT4xciIKKyNpZmRlZiBDTEVBTlVQX3VzZXJkZWwKKyN1bmRlZiBDTEVBTlVQX3VzZXJkZWwKKyN1bmRlZiBGT1JfdXNlcmRlbAorI3VuZGVmIEZMQUdfcgorI2VuZGlmCisKKy8vIHVzbGVlcCA8MSA8MQorI3VuZGVmIE9QVFNUUl91c2xlZXAKKyNkZWZpbmUgT1BUU1RSX3VzbGVlcCAiPDEiCisjaWZkZWYgQ0xFQU5VUF91c2xlZXAKKyN1bmRlZiBDTEVBTlVQX3VzbGVlcAorI3VuZGVmIEZPUl91c2xlZXAKKyNlbmRpZgorCisvLyB1dWRlY29kZSAgID4xbzoKKyN1bmRlZiBPUFRTVFJfdXVkZWNvZGUKKyNkZWZpbmUgT1BUU1RSX3V1ZGVjb2RlICI+MW86IgorI2lmZGVmIENMRUFOVVBfdXVkZWNvZGUKKyN1bmRlZiBDTEVBTlVQX3V1ZGVjb2RlCisjdW5kZWYgRk9SX3V1ZGVjb2RlCisjdW5kZWYgRkxBR19vCisjZW5kaWYKKworLy8gdXVlbmNvZGUgICA8MT4ybQorI3VuZGVmIE9QVFNUUl91dWVuY29kZQorI2RlZmluZSBPUFRTVFJfdXVlbmNvZGUgIjwxPjJtIgorI2lmZGVmIENMRUFOVVBfdXVlbmNvZGUKKyN1bmRlZiBDTEVBTlVQX3V1ZW5jb2RlCisjdW5kZWYgRk9SX3V1ZW5jb2RlCisjdW5kZWYgRkxBR19tCisjZW5kaWYKKworLy8gdmNvbmZpZyA8Mj40IDwyPjQKKyN1bmRlZiBPUFRTVFJfdmNvbmZpZworI2RlZmluZSBPUFRTVFJfdmNvbmZpZyAiPDI+NCIKKyNpZmRlZiBDTEVBTlVQX3Zjb25maWcKKyN1bmRlZiBDTEVBTlVQX3Zjb25maWcKKyN1bmRlZiBGT1JfdmNvbmZpZworI2VuZGlmCisKKy8vIHZpICAgPDE+MQorI3VuZGVmIE9QVFNUUl92aQorI2RlZmluZSBPUFRTVFJfdmkgIjwxPjEiCisjaWZkZWYgQ0xFQU5VUF92aQorI3VuZGVmIENMRUFOVVBfdmkKKyN1bmRlZiBGT1JfdmkKKyNlbmRpZgorCisvLyB2bXN0YXQgPjJuID4ybgorI3VuZGVmIE9QVFNUUl92bXN0YXQKKyNkZWZpbmUgT1BUU1RSX3Ztc3RhdCAiPjJuIgorI2lmZGVmIENMRUFOVVBfdm1zdGF0CisjdW5kZWYgQ0xFQU5VUF92bXN0YXQKKyN1bmRlZiBGT1Jfdm1zdGF0CisjdW5kZWYgRkxBR19uCisjZW5kaWYKKworLy8gdyAgICAKKyN1bmRlZiBPUFRTVFJfdworI2RlZmluZSBPUFRTVFJfdyAwCisjaWZkZWYgQ0xFQU5VUF93CisjdW5kZWYgQ0xFQU5VUF93CisjdW5kZWYgRk9SX3cKKyNlbmRpZgorCisvLyB3YXRjaCAgIF48MW4jPDA9MnRlCisjdW5kZWYgT1BUU1RSX3dhdGNoCisjZGVmaW5lIE9QVFNUUl93YXRjaCAiXjwxbiM8MD0ydGUiCisjaWZkZWYgQ0xFQU5VUF93YXRjaAorI3VuZGVmIENMRUFOVVBfd2F0Y2gKKyN1bmRlZiBGT1Jfd2F0Y2gKKyN1bmRlZiBGTEFHX2UKKyN1bmRlZiBGTEFHX3QKKyN1bmRlZiBGTEFHX24KKyNlbmRpZgorCisvLyB3YyBtY3dsIG1jd2wKKyN1bmRlZiBPUFRTVFJfd2MKKyNkZWZpbmUgT1BUU1RSX3djICJtY3dsIgorI2lmZGVmIENMRUFOVVBfd2MKKyN1bmRlZiBDTEVBTlVQX3djCisjdW5kZWYgRk9SX3djCisjdW5kZWYgRkxBR19sCisjdW5kZWYgRkxBR193CisjdW5kZWYgRkxBR19jCisjdW5kZWYgRkxBR19tCisjZW5kaWYKKworLy8gd2dldCAgIGY6CisjdW5kZWYgT1BUU1RSX3dnZXQKKyNkZWZpbmUgT1BUU1RSX3dnZXQgImY6IgorI2lmZGVmIENMRUFOVVBfd2dldAorI3VuZGVmIENMRUFOVVBfd2dldAorI3VuZGVmIEZPUl93Z2V0CisjdW5kZWYgRkxBR19mCisjZW5kaWYKKworLy8gd2hpY2ggPDFhIDwxYQorI3VuZGVmIE9QVFNUUl93aGljaAorI2RlZmluZSBPUFRTVFJfd2hpY2ggIjwxYSIKKyNpZmRlZiBDTEVBTlVQX3doaWNoCisjdW5kZWYgQ0xFQU5VUF93aGljaAorI3VuZGVmIEZPUl93aGljaAorI3VuZGVmIEZMQUdfYQorI2VuZGlmCisKKy8vIHdobyAgIGEKKyN1bmRlZiBPUFRTVFJfd2hvCisjZGVmaW5lIE9QVFNUUl93aG8gImEiCisjaWZkZWYgQ0xFQU5VUF93aG8KKyN1bmRlZiBDTEVBTlVQX3dobworI3VuZGVmIEZPUl93aG8KKyN1bmRlZiBGTEFHX2EKKyNlbmRpZgorCisvLyB4YXJncyBeSTpFOkwjcHR4cm4jPDFzIzAgXkk6RTpMI3B0eHJuIzwxcyMwCisjdW5kZWYgT1BUU1RSX3hhcmdzCisjZGVmaW5lIE9QVFNUUl94YXJncyAiXkk6RTpMI3B0eHJuIzwxcyMwIgorI2lmZGVmIENMRUFOVVBfeGFyZ3MKKyN1bmRlZiBDTEVBTlVQX3hhcmdzCisjdW5kZWYgRk9SX3hhcmdzCisjdW5kZWYgRkxBR18wCisjdW5kZWYgRkxBR19zCisjdW5kZWYgRkxBR19uCisjdW5kZWYgRkxBR19yCisjdW5kZWYgRkxBR194CisjdW5kZWYgRkxBR190CisjdW5kZWYgRkxBR19wCisjdW5kZWYgRkxBR19MCisjdW5kZWYgRkxBR19FCisjdW5kZWYgRkxBR19JCisjZW5kaWYKKworLy8geHhkID4xYyM8MT40MDk2PTE2bCNnIzwxPTJwcnMjWyFyc10gPjFjIzwxPjQwOTY9MTZsI2cjPDE9MnBycyNbIXJzXQorI3VuZGVmIE9QVFNUUl94eGQKKyNkZWZpbmUgT1BUU1RSX3h4ZCAiPjFjIzwxPjQwOTY9MTZsI2cjPDE9MnBycyNbIXJzXSIKKyNpZmRlZiBDTEVBTlVQX3h4ZAorI3VuZGVmIENMRUFOVVBfeHhkCisjdW5kZWYgRk9SX3h4ZAorI3VuZGVmIEZMQUdfcworI3VuZGVmIEZMQUdfcgorI3VuZGVmIEZMQUdfcAorI3VuZGVmIEZMQUdfZworI3VuZGVmIEZMQUdfbAorI3VuZGVmIEZMQUdfYworI2VuZGlmCisKKy8vIHh6Y2F0ICAgIAorI3VuZGVmIE9QVFNUUl94emNhdAorI2RlZmluZSBPUFRTVFJfeHpjYXQgMAorI2lmZGVmIENMRUFOVVBfeHpjYXQKKyN1bmRlZiBDTEVBTlVQX3h6Y2F0CisjdW5kZWYgRk9SX3h6Y2F0CisjZW5kaWYKKworLy8geWVzICAgIAorI3VuZGVmIE9QVFNUUl95ZXMKKyNkZWZpbmUgT1BUU1RSX3llcyAwCisjaWZkZWYgQ0xFQU5VUF95ZXMKKyN1bmRlZiBDTEVBTlVQX3llcworI3VuZGVmIEZPUl95ZXMKKyNlbmRpZgorCisvLyB6Y2F0ICAgIAorI3VuZGVmIE9QVFNUUl96Y2F0CisjZGVmaW5lIE9QVFNUUl96Y2F0IDAKKyNpZmRlZiBDTEVBTlVQX3pjYXQKKyN1bmRlZiBDTEVBTlVQX3pjYXQKKyN1bmRlZiBGT1JfemNhdAorI2VuZGlmCisKKyNpZmRlZiBGT1JfYWNwaQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmFjcGkKKyNlbmRpZgorI2RlZmluZSBGTEFHX1YgKDE8PDApCisjZGVmaW5lIEZMQUdfdCAoMTw8MSkKKyNkZWZpbmUgRkxBR19jICgxPDwyKQorI2RlZmluZSBGTEFHX2IgKDE8PDMpCisjZGVmaW5lIEZMQUdfYSAoMTw8NCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2FycAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmFycAorI2VuZGlmCisjZGVmaW5lIEZMQUdfSCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfQSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfRCAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfbiAoRk9SQ0VEX0ZMQUc8PDcpCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDgpCisjZGVmaW5lIEZMQUdfdiAoRk9SQ0VEX0ZMQUc8PDkpCisjZW5kaWYKKworI2lmZGVmIEZPUl9hcnBpbmcKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5hcnBpbmcKKyNlbmRpZgorI2RlZmluZSBGTEFHX2YgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX3EgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2IgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX0QgKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX1UgKEZPUkNFRF9GTEFHPDw0KQorI2RlZmluZSBGTEFHX0EgKEZPUkNFRF9GTEFHPDw1KQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX3cgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX0kgKEZPUkNFRF9GTEFHPDw4KQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDw5KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfYmFzZTY0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuYmFzZTY0CisjZW5kaWYKKyNkZWZpbmUgRkxBR193ICgxPDwwKQorI2RlZmluZSBGTEFHX2kgKDE8PDEpCisjZGVmaW5lIEZMQUdfZCAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2Jhc2VuYW1lCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuYmFzZW5hbWUKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfYmxraWQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ibGtpZAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9ibG9ja2RldgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmJsb2NrZGV2CisjZW5kaWYKKyNkZWZpbmUgRkxBR19yZXJlYWRwdCAoMTw8MCkKKyNkZWZpbmUgRkxBR19mbHVzaGJ1ZnMgKDE8PDEpCisjZGVmaW5lIEZMQUdfZ2V0c2l6ZTY0ICgxPDwyKQorI2RlZmluZSBGTEFHX2dldHNpemUgKDE8PDMpCisjZGVmaW5lIEZMQUdfZ2V0c3ogKDE8PDQpCisjZGVmaW5lIEZMQUdfc2V0YnN6ICgxPDw1KQorI2RlZmluZSBGTEFHX2dldGJzeiAoMTw8NikKKyNkZWZpbmUgRkxBR19nZXRzcyAoMTw8NykKKyNkZWZpbmUgRkxBR19nZXRybyAoMTw8OCkKKyNkZWZpbmUgRkxBR19zZXRydyAoMTw8OSkKKyNkZWZpbmUgRkxBR19zZXRybyAoMTw8MTApCisjZW5kaWYKKworI2lmZGVmIEZPUl9ib290Y2hhcnRkCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuYm9vdGNoYXJ0ZAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9icmN0bAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmJyY3RsCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2J1bnppcDIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5idW56aXAyCisjZW5kaWYKKyNkZWZpbmUgRkxBR192ICgxPDwwKQorI2RlZmluZSBGTEFHX2sgKDE8PDEpCisjZGVmaW5lIEZMQUdfdCAoMTw8MikKKyNkZWZpbmUgRkxBR19mICgxPDwzKQorI2RlZmluZSBGTEFHX2MgKDE8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9iemNhdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmJ6Y2F0CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NhbAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNhbAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9jYXQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5jYXQKKyNlbmRpZgorI2RlZmluZSBGTEFHX2UgKDE8PDApCisjZGVmaW5lIEZMQUdfdCAoMTw8MSkKKyNkZWZpbmUgRkxBR192ICgxPDwyKQorI2RlZmluZSBGTEFHX3UgKDE8PDMpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jYXR2CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuY2F0dgorI2VuZGlmCisjZGVmaW5lIEZMQUdfZSAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfdiAoRk9SQ0VEX0ZMQUc8PDIpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNkCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NoYXR0cgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNoYXR0cgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9jaGNvbgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNoY29uCisjZW5kaWYKKyNkZWZpbmUgRkxBR19SICgxPDwwKQorI2RlZmluZSBGTEFHX3YgKDE8PDEpCisjZGVmaW5lIEZMQUdfaCAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NoZ3JwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuY2hncnAKKyNlbmRpZgorI2RlZmluZSBGTEFHX3YgKDE8PDApCisjZGVmaW5lIEZMQUdfZiAoMTw8MSkKKyNkZWZpbmUgRkxBR19SICgxPDwyKQorI2RlZmluZSBGTEFHX0ggKDE8PDMpCisjZGVmaW5lIEZMQUdfTCAoMTw8NCkKKyNkZWZpbmUgRkxBR19QICgxPDw1KQorI2RlZmluZSBGTEFHX2ggKDE8PDYpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jaG1vZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNobW9kCisjZW5kaWYKKyNkZWZpbmUgRkxBR19mICgxPDwwKQorI2RlZmluZSBGTEFHX1IgKDE8PDEpCisjZGVmaW5lIEZMQUdfdiAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2Nocm9vdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNocm9vdAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9jaHZ0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuY2h2dAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9ja3N1bQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNrc3VtCisjZW5kaWYKKyNkZWZpbmUgRkxBR19OICgxPDwwKQorI2RlZmluZSBGTEFHX0wgKDE8PDEpCisjZGVmaW5lIEZMQUdfUCAoMTw8MikKKyNkZWZpbmUgRkxBR19JICgxPDwzKQorI2RlZmluZSBGTEFHX0ggKDE8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jbGVhcgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNsZWFyCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NtcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNtcAorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoMTw8MCkKKyNkZWZpbmUgRkxBR19sICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfY29tbQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNvbW0KKyNlbmRpZgorI2RlZmluZSBGTEFHXzEgKDE8PDApCisjZGVmaW5lIEZMQUdfMiAoMTw8MSkKKyNkZWZpbmUgRkxBR18zICgxPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfY29tcHJlc3MKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5jb21wcmVzcworI2VuZGlmCisjZGVmaW5lIEZMQUdfZyAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfOSAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfeiAoRk9SQ0VEX0ZMQUc8PDYpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jb3VudAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmNvdW50CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuY3AKKyNlbmRpZgorI2RlZmluZSBGTEFHX2kgKDE8PDApCisjZGVmaW5lIEZMQUdfZiAoMTw8MSkKKyNkZWZpbmUgRkxBR19yZW1vdmVfZGVzdGluYXRpb24gKDE8PDIpCisjZGVmaW5lIEZMQUdfRiAoMTw8MikKKyNkZWZpbmUgRkxBR19uICgxPDwzKQorI2RlZmluZSBGTEFHX3YgKDE8PDQpCisjZGVmaW5lIEZMQUdfbCAoMTw8NSkKKyNkZWZpbmUgRkxBR19zICgxPDw2KQorI2RlZmluZSBGTEFHX2EgKDE8PDcpCisjZGVmaW5lIEZMQUdfZCAoMTw8OCkKKyNkZWZpbmUgRkxBR19yICgxPDw5KQorI2RlZmluZSBGTEFHX3AgKDE8PDEwKQorI2RlZmluZSBGTEFHX1AgKDE8PDExKQorI2RlZmluZSBGTEFHX0wgKDE8PDEyKQorI2RlZmluZSBGTEFHX0ggKDE8PDEzKQorI2RlZmluZSBGTEFHX1IgKDE8PDE0KQorI2RlZmluZSBGTEFHX3ByZXNlcnZlICgxPDwxNSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2NwaW8KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5jcGlvCisjZW5kaWYKKyNkZWZpbmUgRkxBR19vICgxPDwwKQorI2RlZmluZSBGTEFHX3ZlcmJvc2UgKDE8PDEpCisjZGVmaW5lIEZMQUdfdiAoMTw8MSkKKyNkZWZpbmUgRkxBR19GICgxPDwyKQorI2RlZmluZSBGTEFHX3QgKDE8PDMpCisjZGVmaW5lIEZMQUdfaSAoMTw8NCkKKyNkZWZpbmUgRkxBR19wICgxPDw1KQorI2RlZmluZSBGTEFHX0ggKDE8PDYpCisjZGVmaW5lIEZMQUdfdSAoMTw8NykKKyNkZWZpbmUgRkxBR19kICgxPDw4KQorI2RlZmluZSBGTEFHX20gKDE8PDkpCisjZGVmaW5lIEZMQUdfbm9fcHJlc2VydmVfb3duZXIgKDE8PDEwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfY3JvbmQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5jcm9uZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfTCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfZiAoRk9SQ0VEX0ZMQUc8PDYpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jcm9udGFiCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuY3JvbnRhYgorI2VuZGlmCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfZSAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9jdXQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5jdXQKKyNlbmRpZgorI2RlZmluZSBGTEFHX24gKDE8PDApCisjZGVmaW5lIEZMQUdfcyAoMTw8MSkKKyNkZWZpbmUgRkxBR19kICgxPDwyKQorI2RlZmluZSBGTEFHX2YgKDE8PDMpCisjZGVmaW5lIEZMQUdfYyAoMTw8NCkKKyNkZWZpbmUgRkxBR19iICgxPDw1KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZGF0ZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRhdGUKKyNlbmRpZgorI2RlZmluZSBGTEFHX3UgKDE8PDApCisjZGVmaW5lIEZMQUdfciAoMTw8MSkKKyNkZWZpbmUgRkxBR19EICgxPDwyKQorI2RlZmluZSBGTEFHX2QgKDE8PDMpCisjZW5kaWYKKworI2lmZGVmIEZPUl9kZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRkCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2RlYWxsb2N2dAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRlYWxsb2N2dAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9kZgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRmCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hICgxPDwwKQorI2RlZmluZSBGTEFHX3QgKDE8PDEpCisjZGVmaW5lIEZMQUdfaCAoMTw8MikKKyNkZWZpbmUgRkxBR19rICgxPDwzKQorI2RlZmluZSBGTEFHX1AgKDE8PDQpCisjZGVmaW5lIEZMQUdfSCAoMTw8NSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2RoY3AKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5kaGNwCisjZW5kaWYKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19iIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR192IChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19vIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19hIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19DIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19SIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19CIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8MTApCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHX3AgKEZPUkNFRF9GTEFHPDwxMikKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8MTMpCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDE0KQorI2RlZmluZSBGTEFHX1QgKEZPUkNFRF9GTEFHPDwxNSkKKyNkZWZpbmUgRkxBR19BIChGT1JDRURfRkxBRzw8MTYpCisjZGVmaW5lIEZMQUdfTyAoRk9SQ0VEX0ZMQUc8PDE3KQorI2RlZmluZSBGTEFHX3IgKEZPUkNFRF9GTEFHPDwxOCkKKyNkZWZpbmUgRkxBR194IChGT1JDRURfRkxBRzw8MTkpCisjZGVmaW5lIEZMQUdfRiAoRk9SQ0VEX0ZMQUc8PDIwKQorI2RlZmluZSBGTEFHX0ggKEZPUkNFRF9GTEFHPDwyMSkKKyNkZWZpbmUgRkxBR19WIChGT1JDRURfRkxBRzw8MjIpCisjZW5kaWYKKworI2lmZGVmIEZPUl9kaGNwNgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRoY3A2CisjZW5kaWYKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19iIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR192IChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19SIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19pIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19wIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MTApCisjZGVmaW5lIEZMQUdfVCAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHX0EgKEZPUkNFRF9GTEFHPDwxMikKKyNkZWZpbmUgRkxBR19yIChGT1JDRURfRkxBRzw8MTMpCisjZW5kaWYKKworI2lmZGVmIEZPUl9kaGNwZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmRoY3BkCisjZW5kaWYKKyNkZWZpbmUgRkxBR182IChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR180IChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19pIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19QIChGT1JDRURfRkxBRzw8NSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2RpZmYKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5kaWZmCisjZW5kaWYKKyNkZWZpbmUgRkxBR191bmlmaWVkIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19VIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19yZWN1cnNpdmUgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX3IgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX25ld19maWxlIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19OIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19zdGFydGluZ19maWxlIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19sYWJlbCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfTCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfdGV4dCAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfYnJpZWYgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX3EgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX3JlcG9ydF9pZGVudGljYWxfZmlsZXMgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX2luaXRpYWxfdGFiIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19UIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19pZ25vcmVfY2FzZSAoRk9SQ0VEX0ZMQUc8PDkpCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDkpCisjZGVmaW5lIEZMQUdfaWdub3JlX2FsbF9zcGFjZSAoRk9SQ0VEX0ZMQUc8PDEwKQorI2RlZmluZSBGTEFHX3cgKEZPUkNFRF9GTEFHPDwxMCkKKyNkZWZpbmUgRkxBR19leHBhbmRfdGFicyAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHX3QgKEZPUkNFRF9GTEFHPDwxMSkKKyNkZWZpbmUgRkxBR191IChGT1JDRURfRkxBRzw8MTIpCisjZGVmaW5lIEZMQUdfaWdub3JlX3NwYWNlX2NoYW5nZSAoRk9SQ0VEX0ZMQUc8PDEzKQorI2RlZmluZSBGTEFHX2IgKEZPUkNFRF9GTEFHPDwxMykKKyNkZWZpbmUgRkxBR19taW5pbWFsIChGT1JDRURfRkxBRzw8MTQpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDE0KQorI2RlZmluZSBGTEFHX2lnbm9yZV9ibGFua19saW5lcyAoRk9SQ0VEX0ZMQUc8PDE1KQorI2RlZmluZSBGTEFHX0IgKEZPUkNFRF9GTEFHPDwxNSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2Rpcm5hbWUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5kaXJuYW1lCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2RtZXNnCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZG1lc2cKKyNlbmRpZgorI2RlZmluZSBGTEFHX2MgKDE8PDApCisjZGVmaW5lIEZMQUdfbiAoMTw8MSkKKyNkZWZpbmUgRkxBR19zICgxPDwyKQorI2RlZmluZSBGTEFHX3IgKDE8PDMpCisjZGVmaW5lIEZMQUdfdCAoMTw8NCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2RvczJ1bml4CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZG9zMnVuaXgKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZHUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5kdQorI2VuZGlmCisjZGVmaW5lIEZMQUdfeCAoMTw8MCkKKyNkZWZpbmUgRkxBR19zICgxPDwxKQorI2RlZmluZSBGTEFHX0wgKDE8PDIpCisjZGVmaW5lIEZMQUdfSyAoMTw8MykKKyNkZWZpbmUgRkxBR19rICgxPDw0KQorI2RlZmluZSBGTEFHX0ggKDE8PDUpCisjZGVmaW5lIEZMQUdfYSAoMTw8NikKKyNkZWZpbmUgRkxBR19jICgxPDw3KQorI2RlZmluZSBGTEFHX2wgKDE8PDgpCisjZGVmaW5lIEZMQUdfbSAoMTw8OSkKKyNkZWZpbmUgRkxBR19oICgxPDwxMCkKKyNkZWZpbmUgRkxBR19kICgxPDwxMSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2R1bXBsZWFzZXMKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5kdW1wbGVhc2VzCisjZW5kaWYKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19yIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19hIChGT1JDRURfRkxBRzw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2VjaG8KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5lY2hvCisjZW5kaWYKKyNkZWZpbmUgRkxBR19uICgxPDwwKQorI2RlZmluZSBGTEFHX2UgKDE8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9lamVjdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmVqZWN0CisjZW5kaWYKKyNkZWZpbmUgRkxBR19UIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2VudgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmVudgorI2VuZGlmCisjZGVmaW5lIEZMQUdfdSAoMTw8MCkKKyNkZWZpbmUgRkxBR19pICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZXhpdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmV4aXQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZXhwYW5kCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZXhwYW5kCisjZW5kaWYKKyNkZWZpbmUgRkxBR190ICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZXhwcgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmV4cHIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZmFjdG9yCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZmFjdG9yCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZhbGxvY2F0ZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmZhbGxvY2F0ZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfbCAoMTw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZhbHNlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZmFsc2UKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZmRpc2sKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5mZGlzaworI2VuZGlmCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfSCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfQyAoRk9SQ0VEX0ZMQUc8PDUpCisjZW5kaWYKKworI2lmZGVmIEZPUl9maWxlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZmlsZQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9maW5kCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZmluZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfTCAoMTw8MCkKKyNkZWZpbmUgRkxBR19IICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZmxvY2sKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5mbG9jaworI2VuZGlmCisjZGVmaW5lIEZMQUdfeCAoMTw8MCkKKyNkZWZpbmUgRkxBR191ICgxPDwxKQorI2RlZmluZSBGTEFHX3MgKDE8PDIpCisjZGVmaW5lIEZMQUdfbiAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZvbGQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5mb2xkCisjZW5kaWYKKyNkZWZpbmUgRkxBR193IChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR191IChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19iIChGT1JDRURfRkxBRzw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZyZWUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5mcmVlCisjZW5kaWYKKyNkZWZpbmUgRkxBR19iICgxPDwwKQorI2RlZmluZSBGTEFHX2sgKDE8PDEpCisjZGVmaW5lIEZMQUdfbSAoMTw8MikKKyNkZWZpbmUgRkxBR19nICgxPDwzKQorI2RlZmluZSBGTEFHX3QgKDE8PDQpCisjZGVmaW5lIEZMQUdfaCAoMTw8NSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZyZWVyYW1kaXNrCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZnJlZXJhbWRpc2sKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZnNjaworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmZzY2sKKyNlbmRpZgorI2RlZmluZSBGTEFHX0MgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX1YgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX1QgKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX1IgKEZPUkNFRF9GTEFHPDw0KQorI2RlZmluZSBGTEFHX1AgKEZPUkNFRF9GTEFHPDw1KQorI2RlZmluZSBGTEFHX04gKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX0EgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX3QgKEZPUkNFRF9GTEFHPDw4KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZnNmcmVlemUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5mc2ZyZWV6ZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfdSAoMTw8MCkKKyNkZWZpbmUgRkxBR19mICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZnN0eXBlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZnN0eXBlCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ZzeW5jCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZnN5bmMKKyNlbmRpZgorI2RlZmluZSBGTEFHX2QgKEZPUkNFRF9GTEFHPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZnRwZ2V0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZnRwZ2V0CisjZW5kaWYKKyNkZWZpbmUgRkxBR19QIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19wIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR191IChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR192IChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19jIChGT1JDRURfRkxBRzw8NCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2dldGVuZm9yY2UKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5nZXRlbmZvcmNlCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2dldGZhdHRyCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZ2V0ZmF0dHIKKyNlbmRpZgorI2RlZmluZSBGTEFHX24gKDE8PDApCisjZGVmaW5lIEZMQUdfaCAoMTw8MSkKKyNkZWZpbmUgRkxBR19kICgxPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZ2V0cHJvcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmdldHByb3AKKyNlbmRpZgorI2RlZmluZSBGTEFHX1ogKDE8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9nZXR0eQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmdldHR5CisjZW5kaWYKKyNkZWZpbmUgRkxBR19oIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19MIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19tIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR193IChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19pIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19sIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19JIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19IIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MTApCisjZW5kaWYKKworI2lmZGVmIEZPUl9ncmVwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZ3JlcAorI2VuZGlmCisjZGVmaW5lIEZMQUdfeCAoMTw8MCkKKyNkZWZpbmUgRkxBR19tICgxPDwxKQorI2RlZmluZSBGTEFHX2YgKDE8PDIpCisjZGVmaW5lIEZMQUdfZSAoMTw8MykKKyNkZWZpbmUgRkxBR19xICgxPDw0KQorI2RlZmluZSBGTEFHX2wgKDE8PDUpCisjZGVmaW5lIEZMQUdfYyAoMTw8NikKKyNkZWZpbmUgRkxBR193ICgxPDw3KQorI2RlZmluZSBGTEFHX3YgKDE8PDgpCisjZGVmaW5lIEZMQUdfcyAoMTw8OSkKKyNkZWZpbmUgRkxBR19yICgxPDwxMCkKKyNkZWZpbmUgRkxBR19vICgxPDwxMSkKKyNkZWZpbmUgRkxBR19uICgxPDwxMikKKyNkZWZpbmUgRkxBR19pICgxPDwxMykKKyNkZWZpbmUgRkxBR19oICgxPDwxNCkKKyNkZWZpbmUgRkxBR19iICgxPDwxNSkKKyNkZWZpbmUgRkxBR19hICgxPDwxNikKKyNkZWZpbmUgRkxBR19IICgxPDwxNykKKyNkZWZpbmUgRkxBR19GICgxPDwxOCkKKyNkZWZpbmUgRkxBR19FICgxPDwxOSkKKyNkZWZpbmUgRkxBR196ICgxPDwyMCkKKyNkZWZpbmUgRkxBR19aICgxPDwyMSkKKyNkZWZpbmUgRkxBR19BICgxPDwyMikKKyNkZWZpbmUgRkxBR19CICgxPDwyMykKKyNkZWZpbmUgRkxBR19DICgxPDwyNCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2dyb3VwYWRkCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZ3JvdXBhZGQKKyNlbmRpZgorI2RlZmluZSBGTEFHX1MgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2cgKEZPUkNFRF9GTEFHPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfZ3JvdXBkZWwKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ncm91cGRlbAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9ncm91cHMKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ncm91cHMKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfZ3VuemlwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuZ3VuemlwCisjZW5kaWYKKyNkZWZpbmUgRkxBR192IChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19sIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19jIChGT1JDRURfRkxBRzw8NikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2d6aXAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5nemlwCisjZW5kaWYKKyNkZWZpbmUgRkxBR196IChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19SIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19MIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19nIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR192IChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19sIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR19jIChGT1JDRURfRkxBRzw8MTApCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHXzkgKEZPUkNFRF9GTEFHPDwxMikKKyNkZWZpbmUgRkxBR18xIChGT1JDRURfRkxBRzw8MTMpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDE0KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaGVhZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmhlYWQKKyNlbmRpZgorI2RlZmluZSBGTEFHX24gKDE8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9oZWxsbworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmhlbGxvCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2hlbHAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5oZWxwCisjZW5kaWYKKyNkZWZpbmUgRkxBR19oICgxPDwwKQorI2RlZmluZSBGTEFHX2EgKDE8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9oZXhlZGl0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaGV4ZWRpdAorI2VuZGlmCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9ob3N0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaG9zdAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfdiAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDIpCisjZW5kaWYKKworI2lmZGVmIEZPUl9ob3N0aWQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ob3N0aWQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfaG9zdG5hbWUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ob3N0bmFtZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfRiAoMTw8MCkKKyNkZWZpbmUgRkxBR19iICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaHdjbG9jaworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmh3Y2xvY2sKKyNlbmRpZgorI2RlZmluZSBGTEFHX3N5c3RvaGMgKDE8PDApCisjZGVmaW5lIEZMQUdfdyAoMTw8MCkKKyNkZWZpbmUgRkxBR19zaG93ICgxPDwxKQorI2RlZmluZSBGTEFHX3IgKDE8PDEpCisjZGVmaW5lIEZMQUdfaGN0b3N5cyAoMTw8MikKKyNkZWZpbmUgRkxBR19zICgxPDwyKQorI2RlZmluZSBGTEFHX3N5c3R6ICgxPDwzKQorI2RlZmluZSBGTEFHX3QgKDE8PDMpCisjZGVmaW5lIEZMQUdfbG9jYWx0aW1lICgxPDw0KQorI2RlZmluZSBGTEFHX2wgKDE8PDQpCisjZGVmaW5lIEZMQUdfdXRjICgxPDw1KQorI2RlZmluZSBGTEFHX3UgKDE8PDUpCisjZGVmaW5lIEZMQUdfcnRjICgxPDw2KQorI2RlZmluZSBGTEFHX2YgKDE8PDYpCisjZGVmaW5lIEZMQUdfZmFzdCAoMTw8NykKKyNlbmRpZgorCisjaWZkZWYgRk9SX2ljb252CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaWNvbnYKKyNlbmRpZgorI2RlZmluZSBGTEFHX2YgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX3QgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaWQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5pZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdSAoMTw8MCkKKyNkZWZpbmUgRkxBR19yICgxPDwxKQorI2RlZmluZSBGTEFHX2cgKDE8PDIpCisjZGVmaW5lIEZMQUdfRyAoMTw8MykKKyNkZWZpbmUgRkxBR19uICgxPDw0KQorI2RlZmluZSBGTEFHX1ogKDE8PDUpCisjZW5kaWYKKworI2lmZGVmIEZPUl9pZmNvbmZpZworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmlmY29uZmlnCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaW5pdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmluaXQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfaW5vdGlmeWQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5pbm90aWZ5ZAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9pbnNtb2QKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5pbnNtb2QKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfaW5zdGFsbAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmluc3RhbGwKKyNlbmRpZgorI2RlZmluZSBGTEFHX2cgKDE8PDApCisjZGVmaW5lIEZMQUdfbyAoMTw8MSkKKyNkZWZpbmUgRkxBR19tICgxPDwyKQorI2RlZmluZSBGTEFHX3YgKDE8PDMpCisjZGVmaW5lIEZMQUdfcyAoMTw8NCkKKyNkZWZpbmUgRkxBR19wICgxPDw1KQorI2RlZmluZSBGTEFHX0QgKDE8PDYpCisjZGVmaW5lIEZMQUdfZCAoMTw8NykKKyNkZWZpbmUgRkxBR19jICgxPDw4KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaW9uaWNlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaW9uaWNlCisjZW5kaWYKKyNkZWZpbmUgRkxBR19wICgxPDwwKQorI2RlZmluZSBGTEFHX24gKDE8PDEpCisjZGVmaW5lIEZMQUdfYyAoMTw8MikKKyNkZWZpbmUgRkxBR190ICgxPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfaW9yZW5pY2UKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5pb3JlbmljZQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9pb3RvcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmlvdG9wCisjZW5kaWYKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19iIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19kIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR191IChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19wIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19vIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19rIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19PIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR19LIChGT1JDRURfRkxBRzw8MTApCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHX0EgKEZPUkNFRF9GTEFHPDwxMikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2lwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaXAKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfaXBjcm0KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5pcGNybQorI2VuZGlmCisjZGVmaW5lIEZMQUdfUSAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfcSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfTSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDUpCisjZW5kaWYKKworI2lmZGVmIEZPUl9pcGNzCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuaXBjcworI2VuZGlmCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcSAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDcpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDgpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDkpCisjZW5kaWYKKworI2lmZGVmIEZPUl9raWxsCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMua2lsbAorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoMTw8MCkKKyNkZWZpbmUgRkxBR19sICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfa2lsbGFsbAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmtpbGxhbGwKKyNlbmRpZgorI2RlZmluZSBGTEFHX2kgKDE8PDApCisjZGVmaW5lIEZMQUdfdiAoMTw8MSkKKyNkZWZpbmUgRkxBR19xICgxPDwyKQorI2RlZmluZSBGTEFHX2wgKDE8PDMpCisjZGVmaW5lIEZMQUdfcyAoMTw8NCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2tpbGxhbGw1CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMua2lsbGFsbDUKKyNlbmRpZgorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2wgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX28gKEZPUkNFRF9GTEFHPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfa2xvZ2QKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5rbG9nZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfbiAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9sYXN0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubGFzdAorI2VuZGlmCisjZGVmaW5lIEZMQUdfVyAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfZiAoRk9SQ0VEX0ZMQUc8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9saW5rCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubGluaworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9sbgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmxuCisjZW5kaWYKKyNkZWZpbmUgRkxBR19zICgxPDwwKQorI2RlZmluZSBGTEFHX2YgKDE8PDEpCisjZGVmaW5lIEZMQUdfbiAoMTw8MikKKyNkZWZpbmUgRkxBR192ICgxPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbG9hZF9wb2xpY3kKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sb2FkX3BvbGljeQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9sb2cKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sb2cKKyNlbmRpZgorI2RlZmluZSBGTEFHX3QgKDE8PDApCisjZGVmaW5lIEZMQUdfcCAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xvZ2dlcgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmxvZ2dlcgorI2VuZGlmCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDIpCisjZW5kaWYKKworI2lmZGVmIEZPUl9sb2dpbgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmxvZ2luCisjZW5kaWYKKyNkZWZpbmUgRkxBR19oIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19wIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xvZ25hbWUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sb2duYW1lCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xvc2V0dXAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sb3NldHVwCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hICgxPDwwKQorI2RlZmluZSBGTEFHX2MgKDE8PDEpCisjZGVmaW5lIEZMQUdfZCAoMTw8MikKKyNkZWZpbmUgRkxBR19mICgxPDwzKQorI2RlZmluZSBGTEFHX2ogKDE8PDQpCisjZGVmaW5lIEZMQUdfbyAoMTw8NSkKKyNkZWZpbmUgRkxBR19yICgxPDw2KQorI2RlZmluZSBGTEFHX3Nob3cgKDE8PDcpCisjZGVmaW5lIEZMQUdfcyAoMTw8NykKKyNkZWZpbmUgRkxBR19zaXplbGltaXQgKDE8PDgpCisjZGVmaW5lIEZMQUdfUyAoMTw8OCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xzCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubHMKKyNlbmRpZgorI2RlZmluZSBGTEFHXzEgKDE8PDApCisjZGVmaW5lIEZMQUdfeCAoMTw8MSkKKyNkZWZpbmUgRkxBR191ICgxPDwyKQorI2RlZmluZSBGTEFHX3QgKDE8PDMpCisjZGVmaW5lIEZMQUdfcyAoMTw8NCkKKyNkZWZpbmUgRkxBR19yICgxPDw1KQorI2RlZmluZSBGTEFHX3EgKDE8PDYpCisjZGVmaW5lIEZMQUdfcCAoMTw8NykKKyNkZWZpbmUgRkxBR19uICgxPDw4KQorI2RlZmluZSBGTEFHX20gKDE8PDkpCisjZGVmaW5lIEZMQUdfbCAoMTw8MTApCisjZGVmaW5lIEZMQUdfayAoMTw8MTEpCisjZGVmaW5lIEZMQUdfaSAoMTw8MTIpCisjZGVmaW5lIEZMQUdfaCAoMTw8MTMpCisjZGVmaW5lIEZMQUdfZiAoMTw8MTQpCisjZGVmaW5lIEZMQUdfZCAoMTw8MTUpCisjZGVmaW5lIEZMQUdfYyAoMTw8MTYpCisjZGVmaW5lIEZMQUdfYiAoMTw8MTcpCisjZGVmaW5lIEZMQUdfYSAoMTw8MTgpCisjZGVmaW5lIEZMQUdfUyAoMTw8MTkpCisjZGVmaW5lIEZMQUdfUiAoMTw8MjApCisjZGVmaW5lIEZMQUdfTCAoMTw8MjEpCisjZGVmaW5lIEZMQUdfSCAoMTw8MjIpCisjZGVmaW5lIEZMQUdfRiAoMTw8MjMpCisjZGVmaW5lIEZMQUdfQyAoMTw8MjQpCisjZGVmaW5lIEZMQUdfQSAoMTw8MjUpCisjZGVmaW5lIEZMQUdfbyAoMTw8MjYpCisjZGVmaW5lIEZMQUdfZyAoMTw8MjcpCisjZGVmaW5lIEZMQUdfWiAoMTw8MjgpCisjZGVmaW5lIEZMQUdfY29sb3IgKDE8PDI5KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbHNhdHRyCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubHNhdHRyCisjZW5kaWYKKyNkZWZpbmUgRkxBR19SICgxPDwwKQorI2RlZmluZSBGTEFHX2EgKDE8PDEpCisjZGVmaW5lIEZMQUdfZCAoMTw8MikKKyNkZWZpbmUgRkxBR19sICgxPDwzKQorI2RlZmluZSBGTEFHX3YgKDE8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9sc21vZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLmxzbW9kCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xzb2YKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sc29mCisjZW5kaWYKKyNkZWZpbmUgRkxBR190ICgxPDwwKQorI2RlZmluZSBGTEFHX3AgKDE8PDEpCisjZGVmaW5lIEZMQUdfbCAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX2xzcGNpCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubHNwY2kKKyNlbmRpZgorI2RlZmluZSBGTEFHX2kgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX24gKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2sgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX20gKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX2UgKEZPUkNFRF9GTEFHPDw0KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbHN1c2IKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5sc3VzYgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9tYWtlZGV2cworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLm1ha2VkZXZzCisjZW5kaWYKKyNkZWZpbmUgRkxBR19kICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbWQ1c3VtCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubWQ1c3VtCisjZW5kaWYKKyNkZWZpbmUgRkxBR19jICgxPDwwKQorI2RlZmluZSBGTEFHX2IgKDE8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9tZGV2CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubWRldgorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9taXgKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5taXgKKyNlbmRpZgorI2RlZmluZSBGTEFHX3IgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2wgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2QgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbWtkaXIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ta2RpcgorI2VuZGlmCisjZGVmaW5lIEZMQUdfbSAoMTw8MCkKKyNkZWZpbmUgRkxBR19wICgxPDwxKQorI2RlZmluZSBGTEFHX3YgKDE8PDIpCisjZGVmaW5lIEZMQUdfWiAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX21rZTJmcworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLm1rZTJmcworI2VuZGlmCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfTiAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfcSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfbiAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfRiAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfZyAoRk9SQ0VEX0ZMQUc8PDcpCisjZW5kaWYKKworI2lmZGVmIEZPUl9ta2ZpZm8KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ta2ZpZm8KKyNlbmRpZgorI2RlZmluZSBGTEFHX20gKDE8PDApCisjZGVmaW5lIEZMQUdfWiAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX21rbm9kCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubWtub2QKKyNlbmRpZgorI2RlZmluZSBGTEFHX1ogKDE8PDApCisjZGVmaW5lIEZMQUdfbW9kZSAoMTw8MSkKKyNkZWZpbmUgRkxBR19tICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbWtwYXNzd2QKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ta3Bhc3N3ZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfUCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDIpCisjZW5kaWYKKworI2lmZGVmIEZPUl9ta3N3YXAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ta3N3YXAKKyNlbmRpZgorI2RlZmluZSBGTEFHX0wgKDE8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9ta3RlbXAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ta3RlbXAKKyNlbmRpZgorI2RlZmluZSBGTEFHX3RtcGRpciAoMTw8MCkKKyNkZWZpbmUgRkxBR19wICgxPDwwKQorI2RlZmluZSBGTEFHX2RpcmVjdG9yeSAoMTw8MSkKKyNkZWZpbmUgRkxBR19kICgxPDwxKQorI2RlZmluZSBGTEFHX3EgKDE8PDIpCisjZGVmaW5lIEZMQUdfdSAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX21vZGluZm8KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5tb2RpbmZvCisjZW5kaWYKKyNkZWZpbmUgRkxBR18wICgxPDwwKQorI2RlZmluZSBGTEFHX0YgKDE8PDEpCisjZGVmaW5lIEZMQUdfayAoMTw8MikKKyNkZWZpbmUgRkxBR19iICgxPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbW9kcHJvYmUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5tb2Rwcm9iZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfRCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfdiAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfcSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDcpCisjZW5kaWYKKworI2lmZGVmIEZPUl9tb3JlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubW9yZQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9tb3VudAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLm1vdW50CisjZW5kaWYKKyNkZWZpbmUgRkxBR19vICgxPDwwKQorI2RlZmluZSBGTEFHX3QgKDE8PDEpCisjZGVmaW5lIEZMQUdfdyAoMTw8MikKKyNkZWZpbmUgRkxBR192ICgxPDwzKQorI2RlZmluZSBGTEFHX3IgKDE8PDQpCisjZGVmaW5lIEZMQUdfbiAoMTw8NSkKKyNkZWZpbmUgRkxBR19mICgxPDw2KQorI2RlZmluZSBGTEFHX2EgKDE8PDcpCisjZGVmaW5lIEZMQUdfTyAoMTw8OCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX21vdW50cG9pbnQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5tb3VudHBvaW50CisjZW5kaWYKKyNkZWZpbmUgRkxBR194ICgxPDwwKQorI2RlZmluZSBGTEFHX2QgKDE8PDEpCisjZGVmaW5lIEZMQUdfcSAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX212CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubXYKKyNlbmRpZgorI2RlZmluZSBGTEFHX2kgKDE8PDApCisjZGVmaW5lIEZMQUdfZiAoMTw8MSkKKyNkZWZpbmUgRkxBR19yZW1vdmVfZGVzdGluYXRpb24gKDE8PDIpCisjZGVmaW5lIEZMQUdfRiAoMTw8MikKKyNkZWZpbmUgRkxBR19uICgxPDwzKQorI2RlZmluZSBGTEFHX3YgKDE8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9uYmRfY2xpZW50CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubmJkX2NsaWVudAorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoMTw8MCkKKyNkZWZpbmUgRkxBR19uICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbmV0Y2F0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubmV0Y2F0CisjZW5kaWYKKyNkZWZpbmUgRkxBR19mICgxPDwwKQorI2RlZmluZSBGTEFHX3EgKDE8PDEpCisjZGVmaW5lIEZMQUdfcyAoMTw8MikKKyNkZWZpbmUgRkxBR19wICgxPDwzKQorI2RlZmluZSBGTEFHX3cgKDE8PDQpCisjZGVmaW5lIEZMQUdfTCAoMTw8NSkKKyNkZWZpbmUgRkxBR19sICgxPDw2KQorI2RlZmluZSBGTEFHX3QgKDE8PDcpCisjZW5kaWYKKworI2lmZGVmIEZPUl9uZXRzdGF0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubmV0c3RhdAorI2VuZGlmCisjZGVmaW5lIEZMQUdfbCAoMTw8MCkKKyNkZWZpbmUgRkxBR19hICgxPDwxKQorI2RlZmluZSBGTEFHX2UgKDE8PDIpCisjZGVmaW5lIEZMQUdfbiAoMTw8MykKKyNkZWZpbmUgRkxBR190ICgxPDw0KQorI2RlZmluZSBGTEFHX3UgKDE8PDUpCisjZGVmaW5lIEZMQUdfdyAoMTw8NikKKyNkZWZpbmUgRkxBR194ICgxPDw3KQorI2RlZmluZSBGTEFHX3IgKDE8PDgpCisjZGVmaW5lIEZMQUdfVyAoMTw8OSkKKyNkZWZpbmUgRkxBR19wICgxPDwxMCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX25pY2UKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5uaWNlCisjZW5kaWYKKyNkZWZpbmUgRkxBR19uICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfbmwKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ubAorI2VuZGlmCisjZGVmaW5lIEZMQUdfRSAoMTw8MCkKKyNkZWZpbmUgRkxBR193ICgxPDwxKQorI2RlZmluZSBGTEFHX3MgKDE8PDIpCisjZGVmaW5lIEZMQUdfbiAoMTw8MykKKyNkZWZpbmUgRkxBR19iICgxPDw0KQorI2RlZmluZSBGTEFHX2wgKDE8PDUpCisjZGVmaW5lIEZMQUdfdiAoMTw8NikKKyNlbmRpZgorCisjaWZkZWYgRk9SX25vaHVwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMubm9odXAKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfbnByb2MKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ucHJvYworI2VuZGlmCisjZGVmaW5lIEZMQUdfYWxsIChGT1JDRURfRkxBRzw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX25zZW50ZXIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5uc2VudGVyCisjZW5kaWYKKyNkZWZpbmUgRkxBR191c2VyIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19VIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR191dHMgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX3UgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX3BpZCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfbmV0IChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19tb3VudCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfaXBjIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19pIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR190YXJnZXQgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX3QgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX25vX2ZvcmsgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX0YgKEZPUkNFRF9GTEFHPDw3KQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfb2QKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5vZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdCAoMTw8MCkKKyNkZWZpbmUgRkxBR19BICgxPDwxKQorI2RlZmluZSBGTEFHX2IgKDE8PDIpCisjZGVmaW5lIEZMQUdfYyAoMTw8MykKKyNkZWZpbmUgRkxBR19kICgxPDw0KQorI2RlZmluZSBGTEFHX28gKDE8PDUpCisjZGVmaW5lIEZMQUdfcyAoMTw8NikKKyNkZWZpbmUgRkxBR194ICgxPDw3KQorI2RlZmluZSBGTEFHX04gKDE8PDgpCisjZGVmaW5lIEZMQUdfdyAoMTw8OSkKKyNkZWZpbmUgRkxBR192ICgxPDwxMCkKKyNkZWZpbmUgRkxBR19qICgxPDwxMSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX29uZWl0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMub25laXQKKyNlbmRpZgorI2RlZmluZSBGTEFHXzMgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX3AgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX24gKEZPUkNFRF9GTEFHPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfb3BlbnZ0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMub3BlbnZ0CisjZW5kaWYKKyNkZWZpbmUgRkxBR193IChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19jIChGT1JDRURfRkxBRzw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX3BhcnRwcm9iZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnBhcnRwcm9iZQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9wYXNzd2QKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5wYXNzd2QKKyNlbmRpZgorI2RlZmluZSBGTEFHX3UgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2wgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2QgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX2EgKEZPUkNFRF9GTEFHPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcGFzdGUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5wYXN0ZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoMTw8MCkKKyNkZWZpbmUgRkxBR19kICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcGF0Y2gKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5wYXRjaAorI2VuZGlmCisjZGVmaW5lIEZMQUdfUiAoMTw8MCkKKyNkZWZpbmUgRkxBR19pICgxPDwxKQorI2RlZmluZSBGTEFHX3AgKDE8PDIpCisjZGVmaW5lIEZMQUdfbCAoMTw8MykKKyNkZWZpbmUgRkxBR191ICgxPDw0KQorI2RlZmluZSBGTEFHX2QgKDE8PDUpCisjZGVmaW5lIEZMQUdfeCAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfZHJ5X3J1biAoMTw8NykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3BncmVwCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucGdyZXAKKyNlbmRpZgorI2RlZmluZSBGTEFHX0wgKDE8PDApCisjZGVmaW5lIEZMQUdfeCAoMTw8MSkKKyNkZWZpbmUgRkxBR192ICgxPDwyKQorI2RlZmluZSBGTEFHX28gKDE8PDMpCisjZGVmaW5lIEZMQUdfbiAoMTw8NCkKKyNkZWZpbmUgRkxBR19mICgxPDw1KQorI2RlZmluZSBGTEFHX0cgKDE8PDYpCisjZGVmaW5lIEZMQUdfZyAoMTw8NykKKyNkZWZpbmUgRkxBR19QICgxPDw4KQorI2RlZmluZSBGTEFHX3MgKDE8PDkpCisjZGVmaW5lIEZMQUdfdCAoMTw8MTApCisjZGVmaW5lIEZMQUdfVSAoMTw8MTEpCisjZGVmaW5lIEZMQUdfdSAoMTw8MTIpCisjZGVmaW5lIEZMQUdfZCAoMTw8MTMpCisjZGVmaW5lIEZMQUdfbCAoMTw8MTQpCisjZGVmaW5lIEZMQUdfYyAoMTw8MTUpCisjZW5kaWYKKworI2lmZGVmIEZPUl9waWRvZgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnBpZG9mCisjZW5kaWYKKyNkZWZpbmUgRkxBR19vICgxPDwwKQorI2RlZmluZSBGTEFHX3MgKDE8PDEpCisjZW5kaWYKKworI2lmZGVmIEZPUl9waW5nCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucGluZworI2VuZGlmCisjZGVmaW5lIEZMQUdfNiAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfNCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcSAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfdyAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfVyAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfSSAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDcpCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDgpCisjZW5kaWYKKworI2lmZGVmIEZPUl9waXZvdF9yb290CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucGl2b3Rfcm9vdAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9wa2lsbAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnBraWxsCisjZW5kaWYKKyNkZWZpbmUgRkxBR19sICgxPDwwKQorI2RlZmluZSBGTEFHX3ggKDE8PDEpCisjZGVmaW5lIEZMQUdfdiAoMTw8MikKKyNkZWZpbmUgRkxBR19vICgxPDwzKQorI2RlZmluZSBGTEFHX24gKDE8PDQpCisjZGVmaW5lIEZMQUdfZiAoMTw8NSkKKyNkZWZpbmUgRkxBR19HICgxPDw2KQorI2RlZmluZSBGTEFHX2cgKDE8PDcpCisjZGVmaW5lIEZMQUdfUCAoMTw8OCkKKyNkZWZpbmUgRkxBR19zICgxPDw5KQorI2RlZmluZSBGTEFHX3QgKDE8PDEwKQorI2RlZmluZSBGTEFHX1UgKDE8PDExKQorI2RlZmluZSBGTEFHX3UgKDE8PDEyKQorI2RlZmluZSBGTEFHX1YgKDE8PDEzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcG1hcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnBtYXAKKyNlbmRpZgorI2RlZmluZSBGTEFHX3EgKDE8PDApCisjZGVmaW5lIEZMQUdfeCAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3ByaW50ZW52CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucHJpbnRlbnYKKyNlbmRpZgorI2RlZmluZSBGTEFHX251bGwgKDE8PDApCisjZGVmaW5lIEZMQUdfMCAoMTw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3ByaW50ZgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnByaW50ZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9wcworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnBzCisjZW5kaWYKKyNkZWZpbmUgRkxBR19aICgxPDwwKQorI2RlZmluZSBGTEFHX3cgKDE8PDEpCisjZGVmaW5lIEZMQUdfRyAoMTw8MikKKyNkZWZpbmUgRkxBR19nICgxPDwzKQorI2RlZmluZSBGTEFHX1UgKDE8PDQpCisjZGVmaW5lIEZMQUdfdSAoMTw8NSkKKyNkZWZpbmUgRkxBR19UICgxPDw2KQorI2RlZmluZSBGTEFHX3QgKDE8PDcpCisjZGVmaW5lIEZMQUdfcyAoMTw8OCkKKyNkZWZpbmUgRkxBR19waWQgKDE8PDkpCisjZGVmaW5lIEZMQUdfcCAoMTw8OSkKKyNkZWZpbmUgRkxBR19PICgxPDwxMCkKKyNkZWZpbmUgRkxBR19vICgxPDwxMSkKKyNkZWZpbmUgRkxBR19uICgxPDwxMikKKyNkZWZpbmUgRkxBR19NICgxPDwxMykKKyNkZWZpbmUgRkxBR19sICgxPDwxNCkKKyNkZWZpbmUgRkxBR19mICgxPDwxNSkKKyNkZWZpbmUgRkxBR19lICgxPDwxNikKKyNkZWZpbmUgRkxBR19kICgxPDwxNykKKyNkZWZpbmUgRkxBR19BICgxPDwxOCkKKyNkZWZpbmUgRkxBR19hICgxPDwxOSkKKyNkZWZpbmUgRkxBR19wcGlkICgxPDwyMCkKKyNkZWZpbmUgRkxBR19QICgxPDwyMCkKKyNkZWZpbmUgRkxBR19zb3J0ICgxPDwyMSkKKyNkZWZpbmUgRkxBR19rICgxPDwyMSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3B3ZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnB3ZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfUCAoMTw8MCkKKyNkZWZpbmUgRkxBR19MICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcHdkeAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnB3ZHgKKyNlbmRpZgorI2RlZmluZSBGTEFHX2EgKDE8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9yZWFkYWhlYWQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5yZWFkYWhlYWQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfcmVhZGxpbmsKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5yZWFkbGluaworI2VuZGlmCisjZGVmaW5lIEZMQUdfcSAoMTw8MCkKKyNkZWZpbmUgRkxBR19uICgxPDwxKQorI2RlZmluZSBGTEFHX2UgKDE8PDIpCisjZGVmaW5lIEZMQUdfZiAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3JlYWxwYXRoCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucmVhbHBhdGgKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfcmVib290CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucmVib290CisjZW5kaWYKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3JlbmljZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnJlbmljZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfbiAoMTw8MCkKKyNkZWZpbmUgRkxBR191ICgxPDwxKQorI2RlZmluZSBGTEFHX3AgKDE8PDIpCisjZGVmaW5lIEZMQUdfZyAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3Jlc2V0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucmVzZXQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfcmVzdG9yZWNvbgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnJlc3RvcmVjb24KKyNlbmRpZgorI2RlZmluZSBGTEFHX3YgKDE8PDApCisjZGVmaW5lIEZMQUdfciAoMTw8MSkKKyNkZWZpbmUgRkxBR19SICgxPDwyKQorI2RlZmluZSBGTEFHX24gKDE8PDMpCisjZGVmaW5lIEZMQUdfRiAoMTw8NCkKKyNkZWZpbmUgRkxBR19EICgxPDw1KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcmV2CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucmV2CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3Jma2lsbAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnJma2lsbAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9ybQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnJtCisjZW5kaWYKKyNkZWZpbmUgRkxBR19yICgxPDwwKQorI2RlZmluZSBGTEFHX1IgKDE8PDEpCisjZGVmaW5lIEZMQUdfaSAoMTw8MikKKyNkZWZpbmUgRkxBR19mICgxPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfcm1kaXIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5ybWRpcgorI2VuZGlmCisjZGVmaW5lIEZMQUdfcCAoMTw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3JtbW9kCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucm1tb2QKKyNlbmRpZgorI2RlZmluZSBGTEFHX2YgKDE8PDApCisjZGVmaW5lIEZMQUdfdyAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3JvdXRlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucm91dGUKKyNlbmRpZgorI2RlZmluZSBGTEFHX0EgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2UgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX24gKEZPUkNFRF9GTEFHPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfcnVuY29uCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMucnVuY29uCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NlZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnNlZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfciAoMTw8MCkKKyNkZWZpbmUgRkxBR19FICgxPDwxKQorI2RlZmluZSBGTEFHX24gKDE8PDIpCisjZGVmaW5lIEZMQUdfaSAoMTw8MykKKyNkZWZpbmUgRkxBR19mICgxPDw0KQorI2RlZmluZSBGTEFHX2UgKDE8PDUpCisjZGVmaW5lIEZMQUdfdmVyc2lvbiAoMTw8NikKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NlbmRldmVudAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnNlbmRldmVudAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9zZXEKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zZXEKKyNlbmRpZgorI2RlZmluZSBGTEFHX3cgKDE8PDApCisjZGVmaW5lIEZMQUdfcyAoMTw8MSkKKyNkZWZpbmUgRkxBR19mICgxPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc2V0ZW5mb3JjZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnNldGVuZm9yY2UKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc2V0ZmF0dHIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zZXRmYXR0cgorI2VuZGlmCisjZGVmaW5lIEZMQUdfeCAoMTw8MCkKKyNkZWZpbmUgRkxBR192ICgxPDwxKQorI2RlZmluZSBGTEFHX24gKDE8PDIpCisjZGVmaW5lIEZMQUdfaCAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NldHByb3AKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zZXRwcm9wCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NldHNpZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnNldHNpZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdCAoMTw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NoCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc2gKKyNlbmRpZgorI2RlZmluZSBGTEFHX2kgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc2hhMXN1bQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnNoYTFzdW0KKyNlbmRpZgorI2RlZmluZSBGTEFHX2MgKDE8PDApCisjZGVmaW5lIEZMQUdfYiAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NocmVkCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc2hyZWQKKyNlbmRpZgorI2RlZmluZSBGTEFHX2YgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX28gKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX24gKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX3UgKEZPUkNFRF9GTEFHPDw0KQorI2RlZmluZSBGTEFHX3ggKEZPUkNFRF9GTEFHPDw1KQorI2RlZmluZSBGTEFHX3ogKEZPUkNFRF9GTEFHPDw2KQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc2tlbGV0b24KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5za2VsZXRvbgorI2VuZGlmCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfZCAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfZSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfYWxzbyAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfYmx1YmJlciAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfd2FscnVzIChGT1JDRURfRkxBRzw8NykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NrZWxldG9uX2FsaWFzCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc2tlbGV0b25fYWxpYXMKKyNlbmRpZgorI2RlZmluZSBGTEFHX3EgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2QgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2IgKEZPUkNFRF9GTEFHPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc2xlZXAKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zbGVlcAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9zb3J0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc29ydAorI2VuZGlmCisjZGVmaW5lIEZMQUdfbiAoMTw8MCkKKyNkZWZpbmUgRkxBR191ICgxPDwxKQorI2RlZmluZSBGTEFHX3IgKDE8PDIpCisjZGVmaW5lIEZMQUdfaSAoMTw8MykKKyNkZWZpbmUgRkxBR19mICgxPDw0KQorI2RlZmluZSBGTEFHX2QgKDE8PDUpCisjZGVmaW5lIEZMQUdfeiAoMTw8NikKKyNkZWZpbmUgRkxBR19zICgxPDw3KQorI2RlZmluZSBGTEFHX2MgKDE8PDgpCisjZGVmaW5lIEZMQUdfTSAoMTw8OSkKKyNkZWZpbmUgRkxBR19iICgxPDwxMCkKKyNkZWZpbmUgRkxBR194ICgxPDwxMSkKKyNkZWZpbmUgRkxBR190ICgxPDwxMikKKyNkZWZpbmUgRkxBR19rICgxPDwxMykKKyNkZWZpbmUgRkxBR19vICgxPDwxNCkKKyNkZWZpbmUgRkxBR19tICgxPDwxNSkKKyNkZWZpbmUgRkxBR19UICgxPDwxNikKKyNkZWZpbmUgRkxBR19TICgxPDwxNykKKyNkZWZpbmUgRkxBR19nICgxPDwxOCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3NwbGl0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3BsaXQKKyNlbmRpZgorI2RlZmluZSBGTEFHX2wgKDE8PDApCisjZGVmaW5lIEZMQUdfYiAoMTw8MSkKKyNkZWZpbmUgRkxBR19hICgxPDwyKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc3RhcnQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zdGFydAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9zdGF0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3RhdAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdCAoMTw8MCkKKyNkZWZpbmUgRkxBR19MICgxPDwxKQorI2RlZmluZSBGTEFHX2YgKDE8PDIpCisjZGVmaW5lIEZMQUdfYyAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3N0b3AKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zdG9wCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3N0cmluZ3MKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zdHJpbmdzCisjZW5kaWYKKyNkZWZpbmUgRkxBR19vICgxPDwwKQorI2RlZmluZSBGTEFHX2YgKDE8PDEpCisjZGVmaW5lIEZMQUdfbiAoMTw8MikKKyNkZWZpbmUgRkxBR19hICgxPDwzKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc3UKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zdQorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDQpCisjZW5kaWYKKworI2lmZGVmIEZPUl9zdWxvZ2luCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3Vsb2dpbgorI2VuZGlmCisjZGVmaW5lIEZMQUdfdCAoRk9SQ0VEX0ZMQUc8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl9zd2Fwb2ZmCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3dhcG9mZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl9zd2Fwb24KKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy5zd2Fwb24KKyNlbmRpZgorI2RlZmluZSBGTEFHX2QgKDE8PDApCisjZGVmaW5lIEZMQUdfcCAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3N3aXRjaF9yb290CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3dpdGNoX3Jvb3QKKyNlbmRpZgorI2RlZmluZSBGTEFHX2ggKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2MgKEZPUkNFRF9GTEFHPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc3luYworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnN5bmMKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1Jfc3lzY3RsCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3lzY3RsCisjZW5kaWYKKyNkZWZpbmUgRkxBR19BICgxPDwwKQorI2RlZmluZSBGTEFHX2EgKDE8PDEpCisjZGVmaW5lIEZMQUdfcCAoMTw8MikKKyNkZWZpbmUgRkxBR193ICgxPDwzKQorI2RlZmluZSBGTEFHX3EgKDE8PDQpCisjZGVmaW5lIEZMQUdfTiAoMTw8NSkKKyNkZWZpbmUgRkxBR19lICgxPDw2KQorI2RlZmluZSBGTEFHX24gKDE8PDcpCisjZW5kaWYKKworI2lmZGVmIEZPUl9zeXNsb2dkCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMuc3lzbG9nZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfRCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfTCAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfSyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfbiAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfYSAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfZiAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDcpCisjZGVmaW5lIEZMQUdfTyAoRk9SQ0VEX0ZMQUc8PDgpCisjZGVmaW5lIEZMQUdfbSAoRk9SQ0VEX0ZMQUc8PDkpCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDEwKQorI2RlZmluZSBGTEFHX2IgKEZPUkNFRF9GTEFHPDwxMSkKKyNkZWZpbmUgRkxBR19SIChGT1JDRURfRkxBRzw8MTIpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDEzKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdGFjCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudGFjCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RhaWwKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50YWlsCisjZW5kaWYKKyNkZWZpbmUgRkxBR19uICgxPDwwKQorI2RlZmluZSBGTEFHX2MgKDE8PDEpCisjZGVmaW5lIEZMQUdfZiAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RhcgorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRhcgorI2VuZGlmCisjZGVmaW5lIEZMQUdfZmlsZSAoMTw8MCkKKyNkZWZpbmUgRkxBR19mICgxPDwwKQorI2RlZmluZSBGTEFHX2RpcmVjdG9yeSAoMTw8MSkKKyNkZWZpbmUgRkxBR19DICgxPDwxKQorI2RlZmluZSBGTEFHX2ZpbGVzX2Zyb20gKDE8PDIpCisjZGVmaW5lIEZMQUdfVCAoMTw8MikKKyNkZWZpbmUgRkxBR19leGNsdWRlX2Zyb20gKDE8PDMpCisjZGVmaW5lIEZMQUdfWCAoMTw8MykKKyNkZWZpbmUgRkxBR190b3VjaCAoMTw8NCkKKyNkZWZpbmUgRkxBR19tICgxPDw0KQorI2RlZmluZSBGTEFHX3RvX3N0ZG91dCAoMTw8NSkKKyNkZWZpbmUgRkxBR19PICgxPDw1KQorI2RlZmluZSBGTEFHX2d6aXAgKDE8PDYpCisjZGVmaW5lIEZMQUdfeiAoMTw8NikKKyNkZWZpbmUgRkxBR192ZXJib3NlICgxPDw3KQorI2RlZmluZSBGTEFHX3YgKDE8PDcpCisjZGVmaW5lIEZMQUdfbGlzdCAoMTw8OCkKKyNkZWZpbmUgRkxBR190ICgxPDw4KQorI2RlZmluZSBGTEFHX2V4dHJhY3QgKDE8PDkpCisjZGVmaW5lIEZMQUdfeCAoMTw8OSkKKyNkZWZpbmUgRkxBR19kZXJlZmVyZW5jZSAoMTw8MTApCisjZGVmaW5lIEZMQUdfaCAoMTw8MTApCisjZGVmaW5lIEZMQUdfY3JlYXRlICgxPDwxMSkKKyNkZWZpbmUgRkxBR19jICgxPDwxMSkKKyNkZWZpbmUgRkxBR19rZWVwX29sZCAoMTw8MTIpCisjZGVmaW5lIEZMQUdfayAoMTw8MTIpCisjZGVmaW5lIEZMQUdfc2FtZV9wZXJtaXNzaW9ucyAoMTw8MTMpCisjZGVmaW5lIEZMQUdfcCAoMTw8MTMpCisjZGVmaW5lIEZMQUdfbm9fc2FtZV9vd25lciAoMTw8MTQpCisjZGVmaW5lIEZMQUdfbyAoMTw8MTQpCisjZGVmaW5lIEZMQUdfdG9fY29tbWFuZCAoMTw8MTUpCisjZGVmaW5lIEZMQUdfZXhjbHVkZSAoMTw8MTYpCisjZGVmaW5lIEZMQUdfb3ZlcndyaXRlICgxPDwxNykKKyNkZWZpbmUgRkxBR19ub19zYW1lX3Blcm1pc3Npb25zICgxPDwxOCkKKyNkZWZpbmUgRkxBR19udW1lcmljX293bmVyICgxPDwxOSkKKyNkZWZpbmUgRkxBR19ub19yZWN1cnNpb24gKDE8PDIwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdGFza3NldAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRhc2tzZXQKKyNlbmRpZgorI2RlZmluZSBGTEFHX2EgKDE8PDApCisjZGVmaW5lIEZMQUdfcCAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RjcHN2ZAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRjcHN2ZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfdiAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfRSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfaCAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfQyAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDcpCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZWUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50ZWUKKyNlbmRpZgorI2RlZmluZSBGTEFHX2EgKDE8PDApCisjZGVmaW5lIEZMQUdfaSAoMTw8MSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RlbG5ldAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRlbG5ldAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZWxuZXRkCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudGVsbmV0ZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfSyAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfRiAoRk9SQ0VEX0ZMQUc8PDMpCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDQpCisjZGVmaW5lIEZMQUdfZiAoRk9SQ0VEX0ZMQUc8PDUpCisjZGVmaW5lIEZMQUdfcCAoRk9SQ0VEX0ZMQUc8PDYpCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDcpCisjZGVmaW5lIEZMQUdfdyAoRk9SQ0VEX0ZMQUc8PDgpCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZXN0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudGVzdAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZXN0X2h1bWFuX3JlYWRhYmxlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudGVzdF9odW1hbl9yZWFkYWJsZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfcyAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfYiAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfaSAoRk9SQ0VEX0ZMQUc8PDIpCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZXN0X21hbnlfb3B0aW9ucworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRlc3RfbWFueV9vcHRpb25zCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19iIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19jIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19kIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19lIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19mIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19nIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR19oIChGT1JDRURfRkxBRzw8NykKKyNkZWZpbmUgRkxBR19pIChGT1JDRURfRkxBRzw8OCkKKyNkZWZpbmUgRkxBR19qIChGT1JDRURfRkxBRzw8OSkKKyNkZWZpbmUgRkxBR19rIChGT1JDRURfRkxBRzw8MTApCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDExKQorI2RlZmluZSBGTEFHX20gKEZPUkNFRF9GTEFHPDwxMikKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MTMpCisjZGVmaW5lIEZMQUdfbyAoRk9SQ0VEX0ZMQUc8PDE0KQorI2RlZmluZSBGTEFHX3AgKEZPUkNFRF9GTEFHPDwxNSkKKyNkZWZpbmUgRkxBR19xIChGT1JDRURfRkxBRzw8MTYpCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDE3KQorI2RlZmluZSBGTEFHX3MgKEZPUkNFRF9GTEFHPDwxOCkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MTkpCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDIwKQorI2RlZmluZSBGTEFHX3YgKEZPUkNFRF9GTEFHPDwyMSkKKyNkZWZpbmUgRkxBR193IChGT1JDRURfRkxBRzw8MjIpCisjZGVmaW5lIEZMQUdfeCAoRk9SQ0VEX0ZMQUc8PDIzKQorI2RlZmluZSBGTEFHX3kgKEZPUkNFRF9GTEFHPDwyNCkKKyNkZWZpbmUgRkxBR196IChGT1JDRURfRkxBRzw8MjUpCisjZGVmaW5lIEZMQUdfQSAoRk9SQ0VEX0ZMQUc8PDI2KQorI2RlZmluZSBGTEFHX0IgKEZPUkNFRF9GTEFHPDwyNykKKyNkZWZpbmUgRkxBR19DIChGT1JDRURfRkxBRzw8MjgpCisjZGVmaW5lIEZMQUdfRCAoRk9SQ0VEX0ZMQUc8PDI5KQorI2RlZmluZSBGTEFHX0UgKEZPUkNFRF9GTEFHPDwzMCkKKyNkZWZpbmUgRkxBR19GIChGT1JDRURfRkxBRzw8MzEpCisjZGVmaW5lIEZMQUdfRyAoRk9SQ0VEX0ZMQUdMTDw8MzIpCisjZGVmaW5lIEZMQUdfSCAoRk9SQ0VEX0ZMQUdMTDw8MzMpCisjZGVmaW5lIEZMQUdfSSAoRk9SQ0VEX0ZMQUdMTDw8MzQpCisjZGVmaW5lIEZMQUdfSiAoRk9SQ0VEX0ZMQUdMTDw8MzUpCisjZGVmaW5lIEZMQUdfSyAoRk9SQ0VEX0ZMQUdMTDw8MzYpCisjZGVmaW5lIEZMQUdfTCAoRk9SQ0VEX0ZMQUdMTDw8MzcpCisjZGVmaW5lIEZMQUdfTSAoRk9SQ0VEX0ZMQUdMTDw8MzgpCisjZGVmaW5lIEZMQUdfTiAoRk9SQ0VEX0ZMQUdMTDw8MzkpCisjZGVmaW5lIEZMQUdfTyAoRk9SQ0VEX0ZMQUdMTDw8NDApCisjZGVmaW5lIEZMQUdfUCAoRk9SQ0VEX0ZMQUdMTDw8NDEpCisjZGVmaW5lIEZMQUdfUSAoRk9SQ0VEX0ZMQUdMTDw8NDIpCisjZGVmaW5lIEZMQUdfUiAoRk9SQ0VEX0ZMQUdMTDw8NDMpCisjZGVmaW5lIEZMQUdfUyAoRk9SQ0VEX0ZMQUdMTDw8NDQpCisjZGVmaW5lIEZMQUdfVCAoRk9SQ0VEX0ZMQUdMTDw8NDUpCisjZGVmaW5lIEZMQUdfVSAoRk9SQ0VEX0ZMQUdMTDw8NDYpCisjZGVmaW5lIEZMQUdfViAoRk9SQ0VEX0ZMQUdMTDw8NDcpCisjZGVmaW5lIEZMQUdfVyAoRk9SQ0VEX0ZMQUdMTDw8NDgpCisjZGVmaW5lIEZMQUdfWCAoRk9SQ0VEX0ZMQUdMTDw8NDkpCisjZGVmaW5lIEZMQUdfWSAoRk9SQ0VEX0ZMQUdMTDw8NTApCisjZGVmaW5lIEZMQUdfWiAoRk9SQ0VEX0ZMQUdMTDw8NTEpCisjZW5kaWYKKworI2lmZGVmIEZPUl90ZXN0X3NjYW5rZXkKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50ZXN0X3NjYW5rZXkKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfdGZ0cAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRmdHAKKyNlbmRpZgorI2RlZmluZSBGTEFHX3AgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX2cgKEZPUkNFRF9GTEFHPDwxKQorI2RlZmluZSBGTEFHX2wgKEZPUkNFRF9GTEFHPDwyKQorI2RlZmluZSBGTEFHX3IgKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX2IgKEZPUkNFRF9GTEFHPDw0KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdGZ0cGQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50ZnRwZAorI2VuZGlmCisjZGVmaW5lIEZMQUdfbCAoRk9SQ0VEX0ZMQUc8PDApCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfYyAoRk9SQ0VEX0ZMQUc8PDIpCisjZGVmaW5lIEZMQUdfciAoRk9SQ0VEX0ZMQUc8PDMpCisjZW5kaWYKKworI2lmZGVmIEZPUl90aW1lCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudGltZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfcCAoMTw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RpbWVvdXQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50aW1lb3V0CisjZW5kaWYKKyNkZWZpbmUgRkxBR19zICgxPDwwKQorI2RlZmluZSBGTEFHX2sgKDE8PDEpCisjZGVmaW5lIEZMQUdfdiAoMTw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RvcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRvcAorI2VuZGlmCisjZGVmaW5lIEZMQUdfcSAoMTw8MCkKKyNkZWZpbmUgRkxBR19iICgxPDwxKQorI2RlZmluZSBGTEFHX24gKDE8PDIpCisjZGVmaW5lIEZMQUdfZCAoMTw8MykKKyNkZWZpbmUgRkxBR19zICgxPDw0KQorI2RlZmluZSBGTEFHX3UgKDE8PDUpCisjZGVmaW5lIEZMQUdfcCAoMTw8NikKKyNkZWZpbmUgRkxBR19vICgxPDw3KQorI2RlZmluZSBGTEFHX2sgKDE8PDgpCisjZGVmaW5lIEZMQUdfSCAoMTw8OSkKKyNkZWZpbmUgRkxBR19PICgxPDwxMCkKKyNkZWZpbmUgRkxBR19tICgxPDwxMSkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RvdWNoCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudG91Y2gKKyNlbmRpZgorI2RlZmluZSBGTEFHX2ggKDE8PDApCisjZGVmaW5lIEZMQUdfdCAoMTw8MSkKKyNkZWZpbmUgRkxBR19yICgxPDwyKQorI2RlZmluZSBGTEFHX20gKDE8PDMpCisjZGVmaW5lIEZMQUdfZCAoMTw8NCkKKyNkZWZpbmUgRkxBR19jICgxPDw1KQorI2RlZmluZSBGTEFHX2EgKDE8PDYpCisjZW5kaWYKKworI2lmZGVmIEZPUl90b3lib3gKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50b3lib3gKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfdHIKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50cgorI2VuZGlmCisjZGVmaW5lIEZMQUdfZCAoMTw8MCkKKyNkZWZpbmUgRkxBR19zICgxPDwxKQorI2RlZmluZSBGTEFHX2MgKDE8PDIpCisjZGVmaW5lIEZMQUdfQyAoMTw8MykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3RyYWNlcm91dGUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50cmFjZXJvdXRlCisjZW5kaWYKKyNkZWZpbmUgRkxBR180ICgxPDwwKQorI2RlZmluZSBGTEFHXzYgKDE8PDEpCisjZGVmaW5lIEZMQUdfRiAoMTw8MikKKyNkZWZpbmUgRkxBR19VICgxPDwzKQorI2RlZmluZSBGTEFHX0kgKDE8PDQpCisjZGVmaW5lIEZMQUdfbCAoMTw8NSkKKyNkZWZpbmUgRkxBR19kICgxPDw2KQorI2RlZmluZSBGTEFHX24gKDE8PDcpCisjZGVmaW5lIEZMQUdfdiAoMTw8OCkKKyNkZWZpbmUgRkxBR19yICgxPDw5KQorI2RlZmluZSBGTEFHX20gKDE8PDEwKQorI2RlZmluZSBGTEFHX3AgKDE8PDExKQorI2RlZmluZSBGTEFHX3EgKDE8PDEyKQorI2RlZmluZSBGTEFHX3MgKDE8PDEzKQorI2RlZmluZSBGTEFHX3QgKDE8PDE0KQorI2RlZmluZSBGTEFHX3cgKDE8PDE1KQorI2RlZmluZSBGTEFHX2cgKDE8PDE2KQorI2RlZmluZSBGTEFHX3ogKDE8PDE3KQorI2RlZmluZSBGTEFHX2YgKDE8PDE4KQorI2RlZmluZSBGTEFHX2kgKDE8PDE5KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdHJ1ZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnRydWUKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfdHJ1bmNhdGUKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy50cnVuY2F0ZQorI2VuZGlmCisjZGVmaW5lIEZMQUdfYyAoMTw8MCkKKyNkZWZpbmUgRkxBR19zICgxPDwxKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdHR5CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudHR5CisjZW5kaWYKKyNkZWZpbmUgRkxBR19zICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdWxpbWl0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudWxpbWl0CisjZW5kaWYKKyNkZWZpbmUgRkxBR19jICgxPDwwKQorI2RlZmluZSBGTEFHX2QgKDE8PDEpCisjZGVmaW5lIEZMQUdfZSAoMTw8MikKKyNkZWZpbmUgRkxBR19mICgxPDwzKQorI2RlZmluZSBGTEFHX2kgKDE8PDQpCisjZGVmaW5lIEZMQUdfbCAoMTw8NSkKKyNkZWZpbmUgRkxBR19tICgxPDw2KQorI2RlZmluZSBGTEFHX24gKDE8PDcpCisjZGVmaW5lIEZMQUdfcCAoMTw8OCkKKyNkZWZpbmUgRkxBR19xICgxPDw5KQorI2RlZmluZSBGTEFHX1IgKDE8PDEwKQorI2RlZmluZSBGTEFHX3IgKDE8PDExKQorI2RlZmluZSBGTEFHX3MgKDE8PDEyKQorI2RlZmluZSBGTEFHX3QgKDE8PDEzKQorI2RlZmluZSBGTEFHX3UgKDE8PDE0KQorI2RlZmluZSBGTEFHX3YgKDE8PDE1KQorI2RlZmluZSBGTEFHX2EgKDE8PDE2KQorI2RlZmluZSBGTEFHX0ggKDE8PDE3KQorI2RlZmluZSBGTEFHX1MgKDE8PDE4KQorI2RlZmluZSBGTEFHX1AgKDE8PDE5KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdW1vdW50CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudW1vdW50CisjZW5kaWYKKyNkZWZpbmUgRkxBR192ICgxPDwwKQorI2RlZmluZSBGTEFHX3QgKDE8PDEpCisjZGVmaW5lIEZMQUdfYSAoMTw8MikKKyNkZWZpbmUgRkxBR19yICgxPDwzKQorI2RlZmluZSBGTEFHX2wgKDE8PDQpCisjZGVmaW5lIEZMQUdfZiAoMTw8NSkKKyNkZWZpbmUgRkxBR19EICgxPDw2KQorI2RlZmluZSBGTEFHX2QgKDE8PDcpCisjZGVmaW5lIEZMQUdfbiAoMTw8OCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3VuYW1lCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudW5hbWUKKyNlbmRpZgorI2RlZmluZSBGTEFHX3MgKDE8PDApCisjZGVmaW5lIEZMQUdfbiAoMTw8MSkKKyNkZWZpbmUgRkxBR19yICgxPDwyKQorI2RlZmluZSBGTEFHX3YgKDE8PDMpCisjZGVmaW5lIEZMQUdfbSAoMTw8NCkKKyNkZWZpbmUgRkxBR19hICgxPDw1KQorI2RlZmluZSBGTEFHX28gKDE8PDYpCisjZW5kaWYKKworI2lmZGVmIEZPUl91bmlxCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudW5pcQorI2VuZGlmCisjZGVmaW5lIEZMQUdfdSAoMTw8MCkKKyNkZWZpbmUgRkxBR19kICgxPDwxKQorI2RlZmluZSBGTEFHX2MgKDE8PDIpCisjZGVmaW5lIEZMQUdfaSAoMTw8MykKKyNkZWZpbmUgRkxBR196ICgxPDw0KQorI2RlZmluZSBGTEFHX3cgKDE8PDUpCisjZGVmaW5lIEZMQUdfcyAoMTw8NikKKyNkZWZpbmUgRkxBR19mICgxPDw3KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdW5peDJkb3MKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy51bml4MmRvcworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl91bmxpbmsKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy51bmxpbmsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfdW5zaGFyZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnVuc2hhcmUKKyNlbmRpZgorI2RlZmluZSBGTEFHX3VzZXIgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX1UgKEZPUkNFRF9GTEFHPDwwKQorI2RlZmluZSBGTEFHX3V0cyAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfdSAoRk9SQ0VEX0ZMQUc8PDEpCisjZGVmaW5lIEZMQUdfcGlkIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19wIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19uZXQgKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX24gKEZPUkNFRF9GTEFHPDwzKQorI2RlZmluZSBGTEFHX21vdW50IChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19tIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19pcGMgKEZPUkNFRF9GTEFHPDw1KQorI2RlZmluZSBGTEFHX2kgKEZPUkNFRF9GTEFHPDw1KQorI2RlZmluZSBGTEFHX21hcF9yb290X3VzZXIgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX3IgKEZPUkNFRF9GTEFHPDw2KQorI2RlZmluZSBGTEFHX2ZvcmsgKEZPUkNFRF9GTEFHPDw3KQorI2RlZmluZSBGTEFHX2YgKEZPUkNFRF9GTEFHPDw3KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdXB0aW1lCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudXB0aW1lCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk9SX3VzZXJhZGQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy51c2VyYWRkCisjZW5kaWYKKyNkZWZpbmUgRkxBR19IIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR19EIChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19TIChGT1JDRURfRkxBRzw8MikKKyNkZWZpbmUgRkxBR19oIChGT1JDRURfRkxBRzw8MykKKyNkZWZpbmUgRkxBR19nIChGT1JDRURfRkxBRzw8NCkKKyNkZWZpbmUgRkxBR19zIChGT1JDRURfRkxBRzw8NSkKKyNkZWZpbmUgRkxBR19HIChGT1JDRURfRkxBRzw8NikKKyNkZWZpbmUgRkxBR191IChGT1JDRURfRkxBRzw8NykKKyNlbmRpZgorCisjaWZkZWYgRk9SX3VzZXJkZWwKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy51c2VyZGVsCisjZW5kaWYKKyNkZWZpbmUgRkxBR19yIChGT1JDRURfRkxBRzw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3VzbGVlcAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnVzbGVlcAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl91dWRlY29kZQorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnV1ZGVjb2RlCisjZW5kaWYKKyNkZWZpbmUgRkxBR19vIChGT1JDRURfRkxBRzw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3V1ZW5jb2RlCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudXVlbmNvZGUKKyNlbmRpZgorI2RlZmluZSBGTEFHX20gKEZPUkNFRF9GTEFHPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1JfdmNvbmZpZworI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnZjb25maWcKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfdmkKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy52aQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl92bXN0YXQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy52bXN0YXQKKyNlbmRpZgorI2RlZmluZSBGTEFHX24gKDE8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl93CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMudworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl93YXRjaAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLndhdGNoCisjZW5kaWYKKyNkZWZpbmUgRkxBR19lIChGT1JDRURfRkxBRzw8MCkKKyNkZWZpbmUgRkxBR190IChGT1JDRURfRkxBRzw8MSkKKyNkZWZpbmUgRkxBR19uIChGT1JDRURfRkxBRzw8MikKKyNlbmRpZgorCisjaWZkZWYgRk9SX3djCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMud2MKKyNlbmRpZgorI2RlZmluZSBGTEFHX2wgKDE8PDApCisjZGVmaW5lIEZMQUdfdyAoMTw8MSkKKyNkZWZpbmUgRkxBR19jICgxPDwyKQorI2RlZmluZSBGTEFHX20gKDE8PDMpCisjZW5kaWYKKworI2lmZGVmIEZPUl93Z2V0CisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMud2dldAorI2VuZGlmCisjZGVmaW5lIEZMQUdfZiAoRk9SQ0VEX0ZMQUc8PDApCisjZW5kaWYKKworI2lmZGVmIEZPUl93aGljaAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLndoaWNoCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hICgxPDwwKQorI2VuZGlmCisKKyNpZmRlZiBGT1Jfd2hvCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMud2hvCisjZW5kaWYKKyNkZWZpbmUgRkxBR19hIChGT1JDRURfRkxBRzw8MCkKKyNlbmRpZgorCisjaWZkZWYgRk9SX3hhcmdzCisjaWZuZGVmIFRUCisjZGVmaW5lIFRUIHRoaXMueGFyZ3MKKyNlbmRpZgorI2RlZmluZSBGTEFHXzAgKDE8PDApCisjZGVmaW5lIEZMQUdfcyAoMTw8MSkKKyNkZWZpbmUgRkxBR19uICgxPDwyKQorI2RlZmluZSBGTEFHX3IgKDE8PDMpCisjZGVmaW5lIEZMQUdfeCAoMTw8NCkKKyNkZWZpbmUgRkxBR190ICgxPDw1KQorI2RlZmluZSBGTEFHX3AgKDE8PDYpCisjZGVmaW5lIEZMQUdfTCAoMTw8NykKKyNkZWZpbmUgRkxBR19FICgxPDw4KQorI2RlZmluZSBGTEFHX0kgKDE8PDkpCisjZW5kaWYKKworI2lmZGVmIEZPUl94eGQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy54eGQKKyNlbmRpZgorI2RlZmluZSBGTEFHX3MgKDE8PDApCisjZGVmaW5lIEZMQUdfciAoMTw8MSkKKyNkZWZpbmUgRkxBR19wICgxPDwyKQorI2RlZmluZSBGTEFHX2cgKDE8PDMpCisjZGVmaW5lIEZMQUdfbCAoMTw8NCkKKyNkZWZpbmUgRkxBR19jICgxPDw1KQorI2VuZGlmCisKKyNpZmRlZiBGT1JfeHpjYXQKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy54emNhdAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEZPUl95ZXMKKyNpZm5kZWYgVFQKKyNkZWZpbmUgVFQgdGhpcy55ZXMKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGT1JfemNhdAorI2lmbmRlZiBUVAorI2RlZmluZSBUVCB0aGlzLnpjYXQKKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3RveWJveC9nZW5lcmF0ZWQvZ2xvYmFscy5oIGIvdG95Ym94L2dlbmVyYXRlZC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YmUwNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9nZW5lcmF0ZWQvZ2xvYmFscy5oCkBAIC0wLDAgKzEsMTQ5NyBAQAorLy8gdG95cy9hbmRyb2lkL2dldHByb3AuYworCitzdHJ1Y3QgZ2V0cHJvcF9kYXRhIHsKKyAgc2l6ZV90IHNpemU7CisgIGNoYXIgKipudjsgLy8gbmFtZS92YWx1ZSBwYWlyczogZXZlbj1uYW1lLCBvZGQ9dmFsdWUKKyAgc3RydWN0IHNlbGFiZWxfaGFuZGxlICpoYW5kbGU7Cit9OworCisvLyB0b3lzL2FuZHJvaWQvbG9nLmMKKworc3RydWN0IGxvZ19kYXRhIHsKKyAgY2hhciAqdGFnOworICBjaGFyICpwcmk7Cit9OworCisvLyB0b3lzL2V4YW1wbGUvaGVsbG8uYworCitzdHJ1Y3QgaGVsbG9fZGF0YSB7CisgIGludCB1bnVzZWQ7Cit9OworCisvLyB0b3lzL2V4YW1wbGUvc2tlbGV0b24uYworCitzdHJ1Y3Qgc2tlbGV0b25fZGF0YSB7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciAqYl9zdHJpbmc7CisgICAgICBsb25nIGNfbnVtYmVyOworICAgICAgc3RydWN0IGFyZ19saXN0ICpkX2xpc3Q7CisgICAgICBsb25nIGVfY291bnQ7CisgICAgICBjaGFyICphbHNvX3N0cmluZzsKKyAgICAgIGNoYXIgKmJsdWJiZXJfc3RyaW5nOworICAgIH0gczsKKyAgICBzdHJ1Y3QgeworICAgICAgbG9uZyBiX251bWJlcjsKKyAgICB9IGE7CisgIH07CisKKyAgaW50IG1vcmVfZ2xvYmFsczsKK307CisKKy8vIHRveXMvbHNiL2RtZXNnLmMKKworc3RydWN0IGRtZXNnX2RhdGEgeworICBsb25nIGxldmVsOworICBsb25nIHNpemU7Cit9OworCisvLyB0b3lzL2xzYi9ob3N0bmFtZS5jCisKK3N0cnVjdCBob3N0bmFtZV9kYXRhIHsKKyAgY2hhciAqZm5hbWU7Cit9OworCisvLyB0b3lzL2xzYi9raWxsYWxsLmMKKworc3RydWN0IGtpbGxhbGxfZGF0YSB7CisgIGNoYXIgKnNpZzsKKworICBpbnQgc2lnbnVtOworICBwaWRfdCBjdXJfcGlkOworICBjaGFyICoqbmFtZXM7CisgIHNob3J0ICplcnI7Cit9OworCisvLyB0b3lzL2xzYi9tZDVzdW0uYworCitzdHJ1Y3QgbWQ1c3VtX2RhdGEgeworICBzdHJ1Y3QgYXJnX2xpc3QgKmM7CisKKyAgaW50IHNhd2xpbmU7CisKKyAgLy8gQ3J5cHRvIHZhcmlhYmxlcyBibGFua2VkIGFmdGVyIHN1bW1pbmcKKyAgdW5zaWduZWQgc3RhdGVbNV07CisgIHVuc2lnbmVkIG9sZHN0YXRlWzVdOworICB1aW50NjRfdCBjb3VudDsKKyAgdW5pb24geworICAgIGNoYXIgY1s2NF07CisgICAgdW5zaWduZWQgaVsxNl07CisgIH0gYnVmZmVyOworfTsKKworLy8gdG95cy9sc2IvbWtub2QuYworCitzdHJ1Y3QgbWtub2RfZGF0YSB7CisgIGNoYXIgKmFyZ19jb250ZXh0OworICBjaGFyICptOworfTsKKworLy8gdG95cy9sc2IvbWt0ZW1wLmMKKworc3RydWN0IG1rdGVtcF9kYXRhIHsKKyAgY2hhciAqdG1wZGlyOworfTsKKworLy8gdG95cy9sc2IvbW91bnQuYworCitzdHJ1Y3QgbW91bnRfZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqb3B0bGlzdDsKKyAgY2hhciAqdHlwZTsKKyAgY2hhciAqYmlnTzsKKworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBjaGFyICpvcHRzOworICBpbnQgb2t1c2VyOworfTsKKworLy8gdG95cy9sc2IvcGFzc3dkLmMKKworc3RydWN0IHBhc3N3ZF9kYXRhIHsKKyAgY2hhciAqYWxnbzsKK307CisKKy8vIHRveXMvbHNiL3BpZG9mLmMKKworc3RydWN0IHBpZG9mX2RhdGEgeworICBjaGFyICpvbWl0OworfTsKKworLy8gdG95cy9sc2Ivc2VxLmMKKworc3RydWN0IHNlcV9kYXRhIHsKKyAgY2hhciAqc2VwOworICBjaGFyICpmbXQ7Cit9OworCisvLyB0b3lzL2xzYi9zdS5jCisKK3N0cnVjdCBzdV9kYXRhIHsKKyAgY2hhciAqczsKKyAgY2hhciAqYzsKK307CisKKy8vIHRveXMvbHNiL3Vtb3VudC5jCisKK3N0cnVjdCB1bW91bnRfZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqdDsKKworICBjaGFyICp0eXBlczsKK307CisKKy8vIHRveXMvbmV0L2lmY29uZmlnLmMKKworc3RydWN0IGlmY29uZmlnX2RhdGEgeworICBpbnQgc29ja2ZkOworfTsKKworLy8gdG95cy9uZXQvbmV0Y2F0LmMKKworc3RydWN0IG5ldGNhdF9kYXRhIHsKKyAgY2hhciAqZmlsZW5hbWU7ICAgICAgICAvLyAtZiByZWFkIGZyb20gZmlsZW5hbWUgaW5zdGVhZCBvZiBuZXR3b3JrCisgIGxvbmcgcXVpdF9kZWxheTsgICAgICAgLy8gLXEgRXhpdCBhZnRlciBFT0YgZnJvbSBzdGRpbiBhZnRlciAjIHNlY29uZHMuCisgIGNoYXIgKnNvdXJjZV9hZGRyZXNzOyAgLy8gLXMgQmluZCB0byBhIHNwZWNpZmljIHNvdXJjZSBhZGRyZXNzLgorICBsb25nIHBvcnQ7ICAgICAgICAgICAgIC8vIC1wIEJpbmQgdG8gYSBzcGVjaWZpYyBzb3VyY2UgcG9ydC4KKyAgbG9uZyB3YWl0OyAgICAgICAgICAgICAvLyAtdyBXYWl0ICMgc2Vjb25kcyBmb3IgYSBjb25uZWN0aW9uLgorfTsKKworLy8gdG95cy9uZXQvbmV0c3RhdC5jCisKK3N0cnVjdCBuZXRzdGF0X2RhdGEgeworICBzdHJ1Y3QgbnVtX2NhY2hlICppbm9kZXM7CisgIGludCB3cGFkOworfTs7CisKKy8vIHRveXMvb3RoZXIvYWNwaS5jCisKK3N0cnVjdCBhY3BpX2RhdGEgeworICBpbnQgYWMsIGJhdCwgdGhlcm0sIGNvb2w7CisgIGNoYXIgKmNwYXRoOworfTsKKworLy8gdG95cy9vdGhlci9iYXNlNjQuYworCitzdHJ1Y3QgYmFzZTY0X2RhdGEgeworICBsb25nIGNvbHVtbnM7CisKKyAgdW5zaWduZWQgdG90YWw7Cit9OworCisvLyB0b3lzL290aGVyL2Jsb2NrZGV2LmMKKworc3RydWN0IGJsb2NrZGV2X2RhdGEgeworICBsb25nIGJzejsKK307CisKKy8vIHRveXMvb3RoZXIvZG9zMnVuaXguYworCitzdHJ1Y3QgZG9zMnVuaXhfZGF0YSB7CisgIGNoYXIgKnRlbXBmaWxlOworfTsKKworLy8gdG95cy9vdGhlci9mYWxsb2NhdGUuYworCitzdHJ1Y3QgZmFsbG9jYXRlX2RhdGEgeworICBsb25nIHNpemU7Cit9OworCisvLyB0b3lzL290aGVyL2ZyZWUuYworCitzdHJ1Y3QgZnJlZV9kYXRhIHsKKyAgdW5zaWduZWQgYml0czsKKyAgdW5zaWduZWQgbG9uZyBsb25nIHVuaXRzOworICBjaGFyICpidWY7Cit9OworCisvLyB0b3lzL290aGVyL2hleGVkaXQuYworCitzdHJ1Y3QgaGV4ZWRpdF9kYXRhIHsKKyAgY2hhciAqZGF0YTsKKyAgbG9uZyBsb25nIGxlbiwgYmFzZTsKKyAgaW50IG51bWxlbiwgdW5kbywgdW5kb2xlbjsKKyAgdW5zaWduZWQgaGVpZ2h0OworfTsKKworLy8gdG95cy9vdGhlci9od2Nsb2NrLmMKKworc3RydWN0IGh3Y2xvY2tfZGF0YSB7CisgIGNoYXIgKmZuYW1lOworCisgIGludCB1dGM7Cit9OworCisvLyB0b3lzL290aGVyL2lvbmljZS5jCisKK3N0cnVjdCBpb25pY2VfZGF0YSB7CisgIGxvbmcgcGlkOworICBsb25nIGxldmVsOworICBsb25nIGNsYXNzOworfTsKKworLy8gdG95cy9vdGhlci9sb2dpbi5jCisKK3N0cnVjdCBsb2dpbl9kYXRhIHsKKyAgY2hhciAqaG9zdG5hbWU7CisgIGNoYXIgKnVzZXJuYW1lOworCisgIGludCBsb2dpbl90aW1lb3V0LCBsb2dpbl9mYWlsX3RpbWVvdXQ7Cit9OworCisvLyB0b3lzL290aGVyL2xvc2V0dXAuYworCitzdHJ1Y3QgbG9zZXR1cF9kYXRhIHsKKyAgY2hhciAqamZpbGU7CisgIGxvbmcgb2Zmc2V0OworICBsb25nIHNpemU7CisKKyAgaW50IG9wZW5mbGFnczsKKyAgZGV2X3QgamRldjsKKyAgaW5vX3QgamlubzsKK307CisKKy8vIHRveXMvb3RoZXIvbHNwY2kuYworCitzdHJ1Y3QgbHNwY2lfZGF0YSB7CisgIGNoYXIgKmlkczsKKyAgbG9uZyBudW1lcmljOworCisgIEZJTEUgKmRiOworfTsKKworLy8gdG95cy9vdGhlci9tYWtlZGV2cy5jCisKK3N0cnVjdCBtYWtlZGV2c19kYXRhIHsKKyAgY2hhciAqZm5hbWU7Cit9OworCisvLyB0b3lzL290aGVyL21peC5jCisKK3N0cnVjdCBtaXhfZGF0YSB7CisgICBsb25nIHJpZ2h0OworICAgbG9uZyBsZXZlbDsKKyAgIGNoYXIgKmRldjsKKyAgIGNoYXIgKmNoYW47Cit9OworCisvLyB0b3lzL290aGVyL21rcGFzc3dkLmMKKworc3RydWN0IG1rcGFzc3dkX2RhdGEgeworICBsb25nIHBmZDsKKyAgY2hhciAqbWV0aG9kOworICBjaGFyICpzYWx0OworfTsKKworLy8gdG95cy9vdGhlci9ta3N3YXAuYworCitzdHJ1Y3QgbWtzd2FwX2RhdGEgeworICBjaGFyICpMOworfTsKKworLy8gdG95cy9vdGhlci9tb2RpbmZvLmMKKworc3RydWN0IG1vZGluZm9fZGF0YSB7CisgIGNoYXIgKmZpZWxkOworICBjaGFyICprbmFtOworICBjaGFyICpiYXNlOworCisgIGxvbmcgbW9kOworfTsKKworLy8gdG95cy9vdGhlci9uc2VudGVyLmMKKworc3RydWN0IG5zZW50ZXJfZGF0YSB7CisgIGNoYXIgKm5zbmFtZXNbNl07CisgIGxvbmcgdGFyZ2V0cGlkOworfTsKKworLy8gdG95cy9vdGhlci9vbmVpdC5jCisKK3N0cnVjdCBvbmVpdF9kYXRhIHsKKyAgY2hhciAqY29uc29sZTsKK307CisKKy8vIHRveXMvb3RoZXIvc2V0ZmF0dHIuYworCitzdHJ1Y3Qgc2V0ZmF0dHJfZGF0YSB7CisgIGNoYXIgKngsICp2LCAqbjsKK307CisKKy8vIHRveXMvb3RoZXIvc2hyZWQuYworCitzdHJ1Y3Qgc2hyZWRfZGF0YSB7CisgIGxvbmcgb2Zmc2V0OworICBsb25nIGl0ZXJhdGlvbnM7CisgIGxvbmcgc2l6ZTsKKworICBpbnQgdWZkOworfTsKKworLy8gdG95cy9vdGhlci9zdGF0LmMKKworc3RydWN0IHN0YXRfZGF0YSB7CisgIGNoYXIgKmZtdDsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgc3RydWN0IHN0YXRmcyBzZjsKKyAgfSBzdGF0OworICBjaGFyICpmaWxlLCAqcGF0dGVybjsKKyAgaW50IHBhdGxlbjsKK307CisKKy8vIHRveXMvb3RoZXIvc3dhcG9uLmMKKworc3RydWN0IHN3YXBvbl9kYXRhIHsKKyAgbG9uZyBwcmlvcml0eTsKK307CisKKy8vIHRveXMvb3RoZXIvc3dpdGNoX3Jvb3QuYworCitzdHJ1Y3Qgc3dpdGNoX3Jvb3RfZGF0YSB7CisgIGNoYXIgKmNvbnNvbGU7CisKKyAgZGV2X3Qgcm9vdGRldjsKK307CisKKy8vIHRveXMvb3RoZXIvdGltZW91dC5jCisKK3N0cnVjdCB0aW1lb3V0X2RhdGEgeworICBjaGFyICpzX3NpZ25hbDsKKyAgY2hhciAqa190aW1lb3V0OworCisgIGludCBuZXh0c2lnOworICBwaWRfdCBwaWQ7CisgIHN0cnVjdCB0aW1ldmFsIGt0djsKKyAgc3RydWN0IGl0aW1lcnZhbCBpdHY7Cit9OworCisvLyB0b3lzL290aGVyL3RydW5jYXRlLmMKKworc3RydWN0IHRydW5jYXRlX2RhdGEgeworICBjaGFyICpzOworCisgIGxvbmcgc2l6ZTsKKyAgaW50IHR5cGU7Cit9OworCisvLyB0b3lzL290aGVyL3h4ZC5jCisKK3N0cnVjdCB4eGRfZGF0YSB7CisgIGxvbmcgczsKKyAgbG9uZyBnOworICBsb25nIGw7CisgIGxvbmcgYzsKK307CisKKy8vIHRveXMvcGVuZGluZy9hcnAuYworCitzdHJ1Y3QgYXJwX2RhdGEgeworICAgIGNoYXIgKmh3X3R5cGU7CisgICAgY2hhciAqYWZfdHlwZV9BOworICAgIGNoYXIgKmFmX3R5cGVfcDsKKyAgICBjaGFyICppbnRlcmZhY2U7CisgICAgCisgICAgaW50IHNvY2tmZDsKKyAgICBjaGFyICpkZXZpY2U7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvYXJwaW5nLmMKKworc3RydWN0IGFycGluZ19kYXRhIHsKKyAgICBsb25nIGNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgdGltZV9vdXQ7CisgICAgY2hhciAqaWZhY2U7CisgICAgY2hhciAqc3JjX2lwOworCisgICAgaW50IHNvY2tmZDsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisgICAgdW5zaWduZWQgc2VudF9hdCwgc2VudF9uciwgcmN2ZF9uciwgYnJkX3NlbnQsIHJjdmRfcmVxLCBicmRfcmN2LAorICAgICAgICAgICAgIHVuaWNhc3RfZmxhZzsKK307CisKKy8vIHRveXMvcGVuZGluZy9ib290Y2hhcnRkLmMKKworc3RydWN0IGJvb3RjaGFydGRfZGF0YSB7CisgIGNoYXIgYnVmWzMyXTsKKyAgbG9uZyBzbXBsX3BlcmlvZF91c2VjOworICBpbnQgcHJvY19hY2NvdW50aW5nOworICBpbnQgaXNfbG9naW47CisKKyAgdm9pZCAqaGVhZDsKK307CisKKy8vIHRveXMvcGVuZGluZy9icmN0bC5jCisKK3N0cnVjdCBicmN0bF9kYXRhIHsKKyAgICBpbnQgc29ja2ZkOworfTsKKworLy8gdG95cy9wZW5kaW5nL2NvbXByZXNzLmMKKworc3RydWN0IGNvbXByZXNzX2RhdGEgeworICAvLyBIdWZmbWFuIGNvZGVzOiBiYXNlIG9mZnNldCBhbmQgZXh0cmEgYml0cyB0YWJsZXMgKGxlbmd0aCBhbmQgZGlzdGFuY2UpCisgIGNoYXIgbGVuYml0c1syOV0sIGRpc3RiaXRzWzMwXTsKKyAgdW5zaWduZWQgc2hvcnQgbGVuYmFzZVsyOV0sIGRpc3RiYXNlWzMwXTsKKyAgdm9pZCAqZml4ZGlzdGh1ZmYsICpmaXhsaXRodWZmOworCisgIC8vIENSQworICB2b2lkICgqY3JjZnVuYykoY2hhciAqZGF0YSwgaW50IGxlbik7CisgIHVuc2lnbmVkIGNyYzsKKworICAvLyBDb21wcmVzc2VkIGRhdGEgYnVmZmVyCisgIGNoYXIgKmRhdGE7CisgIHVuc2lnbmVkIHBvcywgbGVuOworICBpbnQgaW5mZCwgb3V0ZmQ7CisKKyAgLy8gVGFibGVzIG9ubHkgdXNlZCBmb3IgZGVmbGF0aW9uCisgIHVuc2lnbmVkIHNob3J0ICpoYXNoaGVhZCwgKmhhc2hjaGFpbjsKK307CisKKy8vIHRveXMvcGVuZGluZy9jcm9uZC5jCisKK3N0cnVjdCBjcm9uZF9kYXRhIHsKKyAgY2hhciAqY3JvbnRhYnNfZGlyOworICBjaGFyICpsb2dmaWxlOworICBpbnQgbG9nbGV2ZWxfZDsKKyAgaW50IGxvZ2xldmVsOworCisgIHRpbWVfdCBjcm9udGFic19kaXJfbXRpbWU7CisgIHVpbnQ4X3QgZmxhZ2Q7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvY3JvbnRhYi5jCisKK3N0cnVjdCBjcm9udGFiX2RhdGEgeworICBjaGFyICp1c2VyOworICBjaGFyICpjZGlyOworfTsKKworLy8gdG95cy9wZW5kaW5nL2RkLmMKKworc3RydWN0IGRkX2RhdGEgeworICBpbnQgc2hvd194ZmVyOworICBpbnQgc2hvd19yZWNvcmRzOworICB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXMsIGNfY291bnQsIGluX2Z1bGwsIGluX3BhcnQsIG91dF9mdWxsLCBvdXRfcGFydDsKKyAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7CisgIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgZmQ7CisgICAgdW5zaWduZWQgY2hhciAqYnVmZiwgKmJwOworICAgIGxvbmcgc3osIGNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQ7CisgIH0gaW4sIG91dDsKK307OworCisvLyB0b3lzL3BlbmRpbmcvZGhjcC5jCisKK3N0cnVjdCBkaGNwX2RhdGEgeworICAgIGNoYXIgKmlmYWNlOworICAgIGNoYXIgKnBpZGZpbGU7CisgICAgY2hhciAqc2NyaXB0OworICAgIGxvbmcgcmV0cmllczsKKyAgICBsb25nIHRpbWVvdXQ7CisgICAgbG9uZyB0cnlhZ2FpbjsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKnJlcV9vcHQ7CisgICAgY2hhciAqcmVxX2lwOworICAgIHN0cnVjdCBhcmdfbGlzdCAqcGt0X29wdDsKKyAgICBjaGFyICpmZG5fbmFtZTsKKyAgICBjaGFyICpob3N0bmFtZTsKKyAgICBjaGFyICp2ZW5kb3JfY2xzOworfTsKKworLy8gdG95cy9wZW5kaW5nL2RoY3A2LmMKKworc3RydWN0IGRoY3A2X2RhdGEgeworICBjaGFyICppbnRlcmZhY2VfbmFtZSwgKnBpZGZpbGUsICpzY3JpcHQ7CisgIGxvbmcgcmV0cnksIHRpbWVvdXQsIGVycm9ydGltZW91dDsKKyAgY2hhciAqcmVxX2lwOworICBpbnQgbGVuZ3RoLCBzdGF0ZSwgcmVxdWVzdF9sZW5ndGgsIHNvY2ssIHNvY2sxLCBzdGF0dXMsIHJldHZhbCwgcmV0cmllczsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIHVpbnQ4X3QgdHJhbnNjdGlvbl9pZFszXTsKKyAgc3RydWN0IHNvY2thZGRyX2luNiBpbnB1dF9zb2NrZXQ2OworfTsKKworLy8gdG95cy9wZW5kaW5nL2RoY3BkLmMKKworc3RydWN0IGRoY3BkX2RhdGEgeworICAgIGNoYXIgKmlmYWNlOworICAgIGxvbmcgcG9ydDsKK307OworCisvLyB0b3lzL3BlbmRpbmcvZGlmZi5jCisKK3N0cnVjdCBkaWZmX2RhdGEgeworICBsb25nIGN0OworICBjaGFyICpzdGFydDsKKyAgc3RydWN0IGFyZ19saXN0ICpMX2xpc3Q7CisKKyAgaW50IGRpcl9udW0sIHNpemUsIGlzX2JpbmFyeSwgc3RhdHVzLCBjaGFuZ2UsIGxlblsyXTsKKyAgaW50ICpvZmZzZXRbMl07Cit9OworCisvLyB0b3lzL3BlbmRpbmcvZHVtcGxlYXNlcy5jCisKK3N0cnVjdCBkdW1wbGVhc2VzX2RhdGEgeworICAgIGNoYXIgKmZpbGU7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvZXhwci5jCisKK3N0cnVjdCBleHByX2RhdGEgeworICBjaGFyICoqdG9rOyAvLyBjdXJyZW50IHRva2VuLCBub3Qgb24gdGhlIHN0YWNrIHNpbmNlIHJlY3Vyc2l2ZSBjYWxscyBtdXRhdGUgaXQKKworICBjaGFyICpyZWZyZWU7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvZmRpc2suYworCitzdHJ1Y3QgZmRpc2tfZGF0YSB7CisgIGxvbmcgc2VjdF9zejsKKyAgbG9uZyBzZWN0b3JzOworICBsb25nIGhlYWRzOworICBsb25nIGN5bGluZGVyczsKK307CisKKy8vIHRveXMvcGVuZGluZy9mb2xkLmMKKworc3RydWN0IGZvbGRfZGF0YSB7CisgIGludCB3aWR0aDsKK307CisKKy8vIHRveXMvcGVuZGluZy9mc2NrLmMKKworc3RydWN0IGZzY2tfZGF0YSB7CisgIGludCBmZF9udW07CisgIGNoYXIgKnRfbGlzdDsKKworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRldmljZXM7CisgIGNoYXIgKmFycl9mbGFnOworICBjaGFyICoqYXJyX3R5cGU7CisgIGludCBuZWdhdGU7CisgIGludCBzdW1fc3RhdHVzOworICBpbnQgbnJfcnVuOworICBpbnQgc2lnX251bTsKKyAgbG9uZyBtYXhfbnJfcnVuOworfTsKKworLy8gdG95cy9wZW5kaW5nL2Z0cGdldC5jCisKK3N0cnVjdCBmdHBnZXRfZGF0YSB7CisgIGxvbmcgcG9ydDsgLy8gIGNoYXIgKnBvcnQ7CisgIGNoYXIgKnBhc3N3b3JkOworICBjaGFyICp1c2VybmFtZTsKKworICBGSUxFICpzb2NrZnA7CisgIGludCBjOworICBpbnQgaXNnZXQ7CisgIGNoYXIgYnVmW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSldOworfTsKKworLy8gdG95cy9wZW5kaW5nL2dldGZhdHRyLmMKKworc3RydWN0IGdldGZhdHRyX2RhdGEgeworICBjaGFyICpuOworfTsKKworLy8gdG95cy9wZW5kaW5nL2dldHR5LmMKKworc3RydWN0IGdldHR5X2RhdGEgeworICBjaGFyICppc3N1ZV9zdHI7CisgIGNoYXIgKmxvZ2luX3N0cjsKKyAgY2hhciAqaW5pdF9zdHI7CisgIGNoYXIgKmhvc3Rfc3RyOyAKKyAgbG9uZyB0aW1lb3V0OworICAKKyAgY2hhciAqdHR5X25hbWU7ICAKKyAgaW50ICBzcGVlZHNbMjBdOworICBpbnQgIHNjOyAgICAgICAgICAgICAgCisgIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisgIGNoYXIgYnVmZlsxMjhdOworfTsKKworLy8gdG95cy9wZW5kaW5nL2dyb3VwYWRkLmMKKworc3RydWN0IGdyb3VwYWRkX2RhdGEgeworICBsb25nIGdpZDsKK307CisKKy8vIHRveXMvcGVuZGluZy9ob3N0LmMKKworc3RydWN0IGhvc3RfZGF0YSB7CisgIGNoYXIgKnR5cGVfc3RyOworfTsKKworLy8gdG95cy9wZW5kaW5nL2ljb252LmMKKworc3RydWN0IGljb252X2RhdGEgeworICBjaGFyICpmcm9tOworICBjaGFyICp0bzsKKworICB2b2lkICppYzsKK307CisKKy8vIHRveXMvcGVuZGluZy9pcC5jCisKK3N0cnVjdCBpcF9kYXRhIHsKKyAgY2hhciBzdGF0cywgc2luZ2xlbGluZSwgZmx1c2gsICpmaWx0ZXJfZGV2LCBnYnVmWzgxOTJdOworICBpbnQgc29ja2ZkLCBjb25uZWN0ZWQsIGZyb21fb2ssIHJvdXRlX2NtZDsKKyAgaW50OF90IGFkZHJlc3NmYW1pbHksIGlzX2FkZHI7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvaXBjcm0uYworCitzdHJ1Y3QgaXBjcm1fZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqcWtleTsKKyAgc3RydWN0IGFyZ19saXN0ICpxaWQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqc2tleTsKKyAgc3RydWN0IGFyZ19saXN0ICpzaWQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqbWtleTsKKyAgc3RydWN0IGFyZ19saXN0ICptaWQ7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvaXBjcy5jCisKK3N0cnVjdCBpcGNzX2RhdGEgeworICBpbnQgaWQ7Cit9OworCisvLyB0b3lzL3BlbmRpbmcva2xvZ2QuYworCitzdHJ1Y3Qga2xvZ2RfZGF0YSB7CisgIGxvbmcgbGV2ZWw7CisKKyAgaW50IGZkOworfTsKKworLy8gdG95cy9wZW5kaW5nL2xhc3QuYworCitzdHJ1Y3QgbGFzdF9kYXRhIHsKKyAgY2hhciAqZmlsZTsKKworICBzdHJ1Y3QgYXJnX2xpc3QgKmxpc3Q7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvbG9nZ2VyLmMKKworc3RydWN0IGxvZ2dlcl9kYXRhIHsKKyAgY2hhciAqcHJpb3JpdHlfYXJnOworICBjaGFyICppZGVudDsKK307CisKKy8vIHRveXMvcGVuZGluZy9sc29mLmMKKworc3RydWN0IGxzb2ZfZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqcDsKKworICBzdHJ1Y3Qgc3RhdCAqc291Z2h0X2ZpbGVzOworCisgIHN0cnVjdCBkb3VibGVfbGlzdCAqYWxsX3NvY2tldHM7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqZmlsZXM7CisgIGludCBsYXN0X3Nob3duX3BpZDsKKyAgaW50IHNob3duX2hlYWRlcjsKK307CisKKy8vIHRveXMvcGVuZGluZy9ta2UyZnMuYworCitzdHJ1Y3QgbWtlMmZzX2RhdGEgeworICAvLyBDb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICBsb25nIGJsb2Nrc2l6ZTsKKyAgbG9uZyBieXRlc19wZXJfaW5vZGU7CisgIGxvbmcgaW5vZGVzOyAgICAgICAgICAgLy8gVG90YWwgaW5vZGVzIGluIGZpbGVzeXN0ZW0uCisgIGxvbmcgcmVzZXJ2ZWRfcGVyY2VudDsgLy8gSW50ZWdlciBwcmVjZW50IG9mIHNwYWNlIHRvIHJlc2VydmUgZm9yIHJvb3QuCisgIGNoYXIgKmdlbmRpcjsgICAgICAgICAgLy8gV2hlcmUgdG8gcmVhZCBkaXJ0cmVlIGZyb20uCisKKyAgLy8gSW50ZXJuYWwgZGF0YS4KKyAgc3RydWN0IGRpcnRyZWUgKmR0OyAgICAvLyBUcmVlIG9mIGZpbGVzIHRvIGNvcHkgaW50byB0aGUgbmV3IGZpbGVzeXN0ZW0uCisgIHVuc2lnbmVkIHRyZWVibG9ja3M7ICAgLy8gQmxvY2tzIHVzZWQgYnkgZHQKKyAgdW5zaWduZWQgdHJlZWlub2RlczsgICAvLyBJbm9kZXMgdXNlZCBieSBkdAorCisgIHVuc2lnbmVkIGJsb2NrczsgICAgICAgLy8gVG90YWwgYmxvY2tzIGluIHRoZSBmaWxlc3lzdGVtLgorICB1bnNpZ25lZCBmcmVlYmxvY2tzOyAgIC8vIEZyZWUgYmxvY2tzIGluIHRoZSBmaWxlc3lzdGVtLgorICB1bnNpZ25lZCBpbm9kZXNwZzsgICAgIC8vIElub2RlcyBwZXIgZ3JvdXAKKyAgdW5zaWduZWQgZ3JvdXBzOyAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzLgorICB1bnNpZ25lZCBibG9ja2JpdHM7ICAgIC8vIEJpdHMgcGVyIGJsb2NrLiAgKEFsc28gYmxvY2tzIHBlciBncm91cC4pCisKKyAgLy8gRm9yIGdlbmUyZnMKKyAgdW5zaWduZWQgbmV4dGJsb2NrOyAgICAvLyBOZXh0IGRhdGEgYmxvY2sgdG8gYWxsb2NhdGUKKyAgdW5zaWduZWQgbmV4dGdyb3VwOyAgICAvLyBOZXh0IGdyb3VwIHdlJ2xsIGJlIGFsbG9jYXRpbmcgZnJvbQorICBpbnQgZnNmZDsgICAgICAgICAgICAgIC8vIEZpbGUgZGVzY3JpcHRvciBvZiBmaWxlc3lzdGVtICh0byBvdXRwdXQgdG8pLgorCisgIHN0cnVjdCBleHQyX3N1cGVyYmxvY2sgc2I7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvbW9kcHJvYmUuYworCitzdHJ1Y3QgbW9kcHJvYmVfZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqcHJvYmVzOworICBzdHJ1Y3QgYXJnX2xpc3QgKmRiYXNlWzI1Nl07CisgIGNoYXIgKmNtZG9wdHM7CisgIGludCBudWRlcHM7CisgIHVpbnQ4X3Qgc3ltcmVxOworICB2b2lkICgqZGJnKShjaGFyICpmb3JtYXQsIC4uLik7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvbW9yZS5jCisKK3N0cnVjdCBtb3JlX2RhdGEgeworICBzdHJ1Y3QgdGVybWlvcyBpbmY7CisgIGludCBjaW5fZmQ7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvb3BlbnZ0LmMKKworc3RydWN0IG9wZW52dF9kYXRhIHsKKyAgdW5zaWduZWQgbG9uZyB2dF9udW07Cit9OworCisvLyB0b3lzL3BlbmRpbmcvcGluZy5jCisKK3N0cnVjdCBwaW5nX2RhdGEgeworICBsb25nIHdhaXRfZXhpdDsKKyAgbG9uZyB3YWl0X3Jlc3A7CisgIGNoYXIgKmlmYWNlOworICBsb25nIHNpemU7CisgIGxvbmcgY291bnQ7CisgIGxvbmcgdHRsOworCisgIGludCBzb2NrOworfTsKKworLy8gdG95cy9wZW5kaW5nL3JvdXRlLmMKKworc3RydWN0IHJvdXRlX2RhdGEgeworICBjaGFyICpmYW1pbHk7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvc2guYworCitzdHJ1Y3Qgc2hfZGF0YSB7CisgIGNoYXIgKmNvbW1hbmQ7CisKKyAgbG9uZyBsaW5lbm87Cit9OworCisvLyB0b3lzL3BlbmRpbmcvc3Vsb2dpbi5jCisKK3N0cnVjdCBzdWxvZ2luX2RhdGEgeworICBsb25nIHRpbWVvdXQ7CisgIHN0cnVjdCB0ZXJtaW9zIGNybnRpbzsKK307CisKKy8vIHRveXMvcGVuZGluZy9zeXNsb2dkLmMKKworc3RydWN0IHN5c2xvZ2RfZGF0YSB7CisgIGNoYXIgKnNvY2tldDsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIGNoYXIgKnVuaXhfc29ja2V0OworICBjaGFyICpsb2dmaWxlOworICBsb25nIGludGVydmFsOworICBsb25nIHJvdF9zaXplOworICBsb25nIHJvdF9jb3VudDsKKyAgY2hhciAqcmVtb3RlX2xvZzsKKyAgbG9uZyBsb2dfcHJpbzsKKworICBzdHJ1Y3QgdW5zb2NrcyAqbHNvY2tzOyAgLy8gbGlzdCBvZiBsaXN0ZW4gc29ja2V0cworICBzdHJ1Y3QgbG9nZmlsZSAqbGZpbGVzOyAgLy8gbGlzdCBvZiB3cml0ZSBsb2dmaWxlcworICBpbnQgc2lnZmRbMl07Cit9OworCisvLyB0b3lzL3BlbmRpbmcvdGFyLmMKKworc3RydWN0IHRhcl9kYXRhIHsKKyAgY2hhciAqZm5hbWU7CisgIGNoYXIgKmRpcjsKKyAgc3RydWN0IGFyZ19saXN0ICppbmNfZmlsZTsKKyAgc3RydWN0IGFyZ19saXN0ICpleGNfZmlsZTsKKyAgY2hhciAqdG9jbWQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqZXhjOworCisgIHN0cnVjdCBhcmdfbGlzdCAqaW5jLCAqcGFzczsKKyAgdm9pZCAqaW5vZGVzLCAqaGFuZGxlOworfTsKKworLy8gdG95cy9wZW5kaW5nL3RjcHN2ZC5jCisKK3N0cnVjdCB0Y3BzdmRfZGF0YSB7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnVzZXI7CisgIGxvbmcgYm47CisgIGNoYXIgKm5tc2c7CisgIGxvbmcgY247CisKKyAgaW50IG1heGM7CisgIGludCBjb3VudF9hbGw7CisgIGludCB1ZHA7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvdGVsbmV0LmMKKworc3RydWN0IHRlbG5ldF9kYXRhIHsKKyAgaW50IHBvcnQ7CisgIGludCBzZmQ7CisgIGNoYXIgYnVmZlsxMjhdOworICBpbnQgcGJ1ZmY7CisgIGNoYXIgaWFjWzI1Nl07CisgIGludCBwaWFjOworICBjaGFyICp0dHlwZTsKKyAgc3RydWN0IHRlcm1pb3MgZGVmX3Rlcm07CisgIHN0cnVjdCB0ZXJtaW9zIHJhd190ZXJtOworICB1aW50OF90IHRlcm1fb2s7CisgIHVpbnQ4X3QgdGVybV9tb2RlOworICB1aW50OF90IGZsYWdzOworICB1bnNpZ25lZCB3aW5fd2lkdGg7CisgIHVuc2lnbmVkIHdpbl9oZWlnaHQ7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvdGVsbmV0ZC5jCisKK3N0cnVjdCB0ZWxuZXRkX2RhdGEgeworICAgIGNoYXIgKmxvZ2luX3BhdGg7CisgICAgY2hhciAqaXNzdWVfcGF0aDsKKyAgICBpbnQgcG9ydDsKKyAgICBjaGFyICpob3N0X2FkZHI7CisgICAgbG9uZyB3X3NlYzsKKworICAgIGludCBnbWF4X2ZkOworICAgIHBpZF90IGZvcmtfcGlkOworfTsKKworLy8gdG95cy9wZW5kaW5nL3RmdHAuYworCitzdHJ1Y3QgdGZ0cF9kYXRhIHsKKyAgY2hhciAqbG9jYWxfZmlsZTsKKyAgY2hhciAqcmVtb3RlX2ZpbGU7CisgIGxvbmcgYmxvY2tfc2l6ZTsKKworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBpbmFkZHI7CisgIGludCBhZjsKK307CisKKy8vIHRveXMvcGVuZGluZy90ZnRwZC5jCisKK3N0cnVjdCB0ZnRwZF9kYXRhIHsKKyAgY2hhciAqdXNlcjsKKworICBsb25nIHNmZDsKKyAgc3RydWN0IHBhc3N3ZCAqcHc7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvdHIuYworCitzdHJ1Y3QgdHJfZGF0YSB7CisgIHNob3J0IG1hcFsyNTZdOyAvL21hcCBvZiBjaGFycworICBpbnQgbGVuMSwgbGVuMjsKK307CisKKy8vIHRveXMvcGVuZGluZy90cmFjZXJvdXRlLmMKKworc3RydWN0IHRyYWNlcm91dGVfZGF0YSB7CisgIGxvbmcgbWF4X3R0bDsKKyAgbG9uZyBwb3J0OworICBsb25nIHR0bF9wcm9iZXM7CisgIGNoYXIgKnNyY19pcDsKKyAgbG9uZyB0b3M7CisgIGxvbmcgd2FpdF90aW1lOworICBzdHJ1Y3QgYXJnX2xpc3QgKmxvb3NlX3NvdXJjZTsKKyAgbG9uZyBwYXVzZV90aW1lOworICBsb25nIGZpcnN0X3R0bDsKKyAgY2hhciAqaWZhY2U7CisKKyAgdWludDMyX3QgZ3dfbGlzdFs5XTsKKyAgaW50IHJlY3Zfc29jazsKKyAgaW50IHNuZF9zb2NrOworICB1bnNpZ25lZCBtc2dfbGVuOworICBjaGFyICpwYWNrZXQ7CisgIHVpbnQzMl90IGlkZW50OworICBpbnQgaXN0cmFjZXJvdXRlNjsKK307CisKKy8vIHRveXMvcGVuZGluZy91c2VyYWRkLmMKKworc3RydWN0IHVzZXJhZGRfZGF0YSB7CisgIGNoYXIgKmRpcjsKKyAgY2hhciAqZ2Vjb3M7CisgIGNoYXIgKnNoZWxsOworICBjaGFyICp1X2dycDsKKyAgbG9uZyB1aWQ7CisKKyAgbG9uZyBnaWQ7Cit9OworCisvLyB0b3lzL3BlbmRpbmcvdmkuYworCitzdHJ1Y3QgdmlfZGF0YSB7CisgIHN0cnVjdCBsaW5lc3RhY2sgKmxzOworICBjaGFyICpzdGF0bGluZTsKK307CisKKy8vIHRveXMvcGVuZGluZy93YXRjaC5jCisKK3N0cnVjdCB3YXRjaF9kYXRhIHsKKyAgaW50IGludGVydmFsOworfTsKKworLy8gdG95cy9wZW5kaW5nL3dnZXQuYworCitzdHJ1Y3Qgd2dldF9kYXRhIHsKKyAgY2hhciAqZmlsZW5hbWU7Cit9OworCisvLyB0b3lzL3Bvc2l4L2NoZ3JwLmMKKworc3RydWN0IGNoZ3JwX2RhdGEgeworICB1aWRfdCBvd25lcjsKKyAgZ2lkX3QgZ3JvdXA7CisgIGNoYXIgKm93bmVyX25hbWUsICpncm91cF9uYW1lOworICBpbnQgc3ltZm9sbG93OworfTsKKworLy8gdG95cy9wb3NpeC9jaG1vZC5jCisKK3N0cnVjdCBjaG1vZF9kYXRhIHsKKyAgY2hhciAqbW9kZTsKK307CisKKy8vIHRveXMvcG9zaXgvY2tzdW0uYworCitzdHJ1Y3QgY2tzdW1fZGF0YSB7CisgIHVuc2lnbmVkIGNyY190YWJsZVsyNTZdOworfTsKKworLy8gdG95cy9wb3NpeC9jbXAuYworCitzdHJ1Y3QgY21wX2RhdGEgeworICBpbnQgZmQ7CisgIGNoYXIgKm5hbWU7Cit9OworCisvLyB0b3lzL3Bvc2l4L2NwLmMKKworc3RydWN0IGNwX2RhdGEgeworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIC8vIGluc3RhbGwncyBvcHRpb25zCisgICAgICBjaGFyICpncm91cDsKKyAgICAgIGNoYXIgKnVzZXI7CisgICAgICBjaGFyICptb2RlOworICAgIH0gaTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciAqcHJlc2VydmU7CisgICAgfSBjOworICB9OworCisgIGNoYXIgKmRlc3RuYW1lOworICBzdHJ1Y3Qgc3RhdCB0b3A7CisgIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGlydHJlZSAqdHJ5KTsKKyAgdWlkX3QgdWlkOworICBnaWRfdCBnaWQ7CisgIGludCBwZmxhZ3M7Cit9OworCisvLyB0b3lzL3Bvc2l4L2NwaW8uYworCitzdHJ1Y3QgY3Bpb19kYXRhIHsKKyAgY2hhciAqYXJjaGl2ZTsKKyAgY2hhciAqcGFzczsKKyAgY2hhciAqZm10OworfTsKKworLy8gdG95cy9wb3NpeC9jdXQuYworCitzdHJ1Y3QgY3V0X2RhdGEgeworICBjaGFyICpkZWxpbTsKKyAgY2hhciAqZmxpc3Q7CisgIGNoYXIgKmNsaXN0OworICBjaGFyICpibGlzdDsKKworICB2b2lkICpzbGlzdF9oZWFkOworICB1bnNpZ25lZCBuZWxlbTsKKyAgdm9pZCAoKmRvX2N1dCkoaW50IGZkKTsKK307CisKKy8vIHRveXMvcG9zaXgvZGF0ZS5jCisKK3N0cnVjdCBkYXRlX2RhdGEgeworICBjaGFyICpmaWxlOworICBjaGFyICpzZXRmbXQ7CisgIGNoYXIgKnNob3dkYXRlOworCisgIGNoYXIgKnR6OworICB1bnNpZ25lZCBuYW5vOworfTsKKworLy8gdG95cy9wb3NpeC9kZi5jCisKK3N0cnVjdCBkZl9kYXRhIHsKKyAgc3RydWN0IGFyZ19saXN0ICpmc3R5cGU7CisKKyAgbG9uZyB1bml0czsKKyAgaW50IGNvbHVtbl93aWR0aHNbNV07CisgIGludCBoZWFkZXJfc2hvd247Cit9OworCisvLyB0b3lzL3Bvc2l4L2R1LmMKKworc3RydWN0IGR1X2RhdGEgeworICBsb25nIG1heGRlcHRoOworCisgIGxvbmcgZGVwdGgsIHRvdGFsOworICBkZXZfdCBzdF9kZXY7CisgIHZvaWQgKmlub2RlczsKK307CisKKy8vIHRveXMvcG9zaXgvZW52LmMKKworc3RydWN0IGVudl9kYXRhIHsKKyAgc3RydWN0IGFyZ19saXN0ICp1OworfTs7CisKKy8vIHRveXMvcG9zaXgvZXhwYW5kLmMKKworc3RydWN0IGV4cGFuZF9kYXRhIHsKKyAgc3RydWN0IGFyZ19saXN0ICp0YWJzOworCisgIHVuc2lnbmVkIHRhYmNvdW50LCAqdGFiOworfTsKKworLy8gdG95cy9wb3NpeC9maWxlLmMKKworc3RydWN0IGZpbGVfZGF0YSB7CisgIGludCBtYXhfbmFtZV9sZW47Cit9OworCisvLyB0b3lzL3Bvc2l4L2ZpbmQuYworCitzdHJ1Y3QgZmluZF9kYXRhIHsKKyAgY2hhciAqKmZpbHRlcjsKKyAgc3RydWN0IGRvdWJsZV9saXN0ICphcmdkYXRhOworICBpbnQgdG9wZGlyLCB4ZGV2LCBkZXB0aDsKKyAgdGltZV90IG5vdzsKK307CisKKy8vIHRveXMvcG9zaXgvZ3JlcC5jCisKK3N0cnVjdCBncmVwX2RhdGEgeworICBsb25nIG07CisgIHN0cnVjdCBhcmdfbGlzdCAqZjsKKyAgc3RydWN0IGFyZ19saXN0ICplOworICBsb25nIGE7CisgIGxvbmcgYjsKKyAgbG9uZyBjOworCisgIGNoYXIgaW5kZWxpbSwgb3V0ZGVsaW07Cit9OworCisvLyB0b3lzL3Bvc2l4L2hlYWQuYworCitzdHJ1Y3QgaGVhZF9kYXRhIHsKKyAgbG9uZyBsaW5lczsKKyAgaW50IGZpbGVfbm87Cit9OworCisvLyB0b3lzL3Bvc2l4L2lkLmMKKworc3RydWN0IGlkX2RhdGEgeworICBpbnQgaXNfZ3JvdXBzOworfTsKKworLy8gdG95cy9wb3NpeC9raWxsLmMKKworc3RydWN0IGtpbGxfZGF0YSB7CisgIGNoYXIgKnNpZ25hbWU7CisgIHN0cnVjdCBhcmdfbGlzdCAqb2xpc3Q7Cit9OworCisvLyB0b3lzL3Bvc2l4L2xzLmMKKworc3RydWN0IGxzX2RhdGEgeworICBjaGFyICpjb2xvcjsKKworICBzdHJ1Y3QgZGlydHJlZSAqZmlsZXMsICpzaW5nbGVkaXI7CisKKyAgdW5zaWduZWQgc2NyZWVuX3dpZHRoOworICBpbnQgbmxfdGl0bGU7CisgIGNoYXIgKmVzY21vcmU7Cit9OworCisvLyB0b3lzL3Bvc2l4L21rZGlyLmMKKworc3RydWN0IG1rZGlyX2RhdGEgeworICBjaGFyICphcmdfbW9kZTsKKyAgY2hhciAqYXJnX2NvbnRleHQ7Cit9OworCisvLyB0b3lzL3Bvc2l4L21rZmlmby5jCisKK3N0cnVjdCBta2ZpZm9fZGF0YSB7CisgIGNoYXIgKm1fc3RyaW5nOworICBjaGFyICpaOworCisgIG1vZGVfdCBtb2RlOworfTsKKworLy8gdG95cy9wb3NpeC9uaWNlLmMKKworc3RydWN0IG5pY2VfZGF0YSB7CisgIGxvbmcgcHJpb3JpdHk7Cit9OworCisvLyB0b3lzL3Bvc2l4L25sLmMKKworc3RydWN0IG5sX2RhdGEgeworICBsb25nIHc7CisgIGNoYXIgKnM7CisgIGNoYXIgKm47CisgIGNoYXIgKmI7CisgIGxvbmcgbDsKKyAgbG9uZyB2OworCisgIC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGJsYW5rIGxpbmVzIGZvciAtbCBoYXMgdG8gcGVyc2lzdCBiZXR3ZWVuIGZpbGVzCisgIGxvbmcgbGNvdW50OworfTsKKworLy8gdG95cy9wb3NpeC9vZC5jCisKK3N0cnVjdCBvZF9kYXRhIHsKKyAgc3RydWN0IGFyZ19saXN0ICpvdXRwdXRfYmFzZTsKKyAgY2hhciAqYWRkcmVzc19iYXNlOworICBsb25nIG1heF9jb3VudDsKKyAgbG9uZyB3aWR0aDsKKyAgbG9uZyBqdW1wX2J5dGVzOworCisgIGludCBhZGRyZXNzX2lkeDsKKyAgdW5zaWduZWQgdHlwZXMsIGxlZnRvdmVyLCBzdGFyOworICBjaGFyICpidWY7IC8vIFBvaW50cyB0byBidWZmZXJzWzBdIG9yIGJ1ZmZlcnNbMV0uCisgIGNoYXIgKmJ1ZnNbMl07IC8vIFVzZWQgdG8gZGV0ZWN0IGR1cGxpY2F0ZSBsaW5lcy4KKyAgb2ZmX3QgcG9zOworfTsKKworLy8gdG95cy9wb3NpeC9wYXN0ZS5jCisKK3N0cnVjdCBwYXN0ZV9kYXRhIHsKKyAgY2hhciAqZGVsaW07Cit9OworCisvLyB0b3lzL3Bvc2l4L3BhdGNoLmMKKworc3RydWN0IHBhdGNoX2RhdGEgeworICBjaGFyICppbmZpbGU7CisgIGxvbmcgcHJlZml4OworICBjaGFyICpkaXI7CisKKyAgc3RydWN0IGRvdWJsZV9saXN0ICpjdXJyZW50X2h1bms7CisgIGxvbmcgb2xkbGluZSwgb2xkbGVuLCBuZXdsaW5lLCBuZXdsZW47CisgIGxvbmcgbGluZW51bTsKKyAgaW50IGNvbnRleHQsIHN0YXRlLCBmaWxlaW4sIGZpbGVvdXQsIGZpbGVwYXRjaCwgaHVua251bTsKKyAgY2hhciAqdGVtcG5hbWU7Cit9OworCisvLyB0b3lzL3Bvc2l4L3BzLmMKKworc3RydWN0IHBzX2RhdGEgeworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqRzsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqZzsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqVTsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqdTsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqdDsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqczsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqcDsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqTzsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqbzsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqUDsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqazsKKyAgICB9IHBzOworICAgIHN0cnVjdCB7CisgICAgICBsb25nIG47CisgICAgICBsb25nIGQ7CisgICAgICBsb25nIHM7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnU7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnA7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKm87CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKms7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKk87CisgICAgfSB0b3A7CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgKkw7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKkc7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKmc7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKlA7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnM7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnQ7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKlU7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnU7CisgICAgICBjaGFyICpkOworCisgICAgICB2b2lkICpyZWdleGVzLCAqc25hcHNob3Q7CisgICAgICBpbnQgc2lnbmFsOworICAgICAgcGlkX3Qgc2VsZiwgbWF0Y2g7CisgICAgfSBwZ3JlcDsKKyAgfTsKKworICBzdHJ1Y3Qgc3lzaW5mbyBzaTsKKyAgc3RydWN0IHB0cl9sZW4gZ2csIEdHLCBwcCwgUFAsIHNzLCB0dCwgdXUsIFVVOworICBzdHJ1Y3QgZGlydHJlZSAqdGhyZWFkcGFyZW50OworICB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworICBkZXZfdCB0dHk7CisgIHZvaWQgKmZpZWxkcywgKmtmaWVsZHM7CisgIGxvbmcgbG9uZyB0aWNrcywgYml0cywgdGltZTsKKyAgaW50IGtjb3VudCwgZm9yY2VrLCBzb3J0cG9zOworICBpbnQgKCptYXRjaF9wcm9jZXNzKShsb25nIGxvbmcgKnNsb3QpOworICB2b2lkICgqc2hvd19wcm9jZXNzKSh2b2lkICp0Yik7Cit9OworCisvLyB0b3lzL3Bvc2l4L3JlbmljZS5jCisKK3N0cnVjdCByZW5pY2VfZGF0YSB7CisgIGxvbmcgbkFyZ3U7Cit9OworCisvLyB0b3lzL3Bvc2l4L3NlZC5jCisKK3N0cnVjdCBzZWRfZGF0YSB7CisgIHN0cnVjdCBhcmdfbGlzdCAqZjsKKyAgc3RydWN0IGFyZ19saXN0ICplOworCisgIC8vIHByb2Nlc3NlZCBwYXR0ZXJuIGxpc3QKKyAgc3RydWN0IGRvdWJsZV9saXN0ICpwYXR0ZXJuOworCisgIGNoYXIgKm5leHRsaW5lLCAqcmVtZW1iZXI7CisgIHZvaWQgKnJlc3RhcnQsICpsYXN0cmVnZXg7CisgIGxvbmcgbmV4dGxlbiwgcmVtZW1iZXJsZW4sIGNvdW50OworICBpbnQgZmRvdXQsIG5vZW9sOworICB1bnNpZ25lZCB4eDsKK307CisKKy8vIHRveXMvcG9zaXgvc29ydC5jCisKK3N0cnVjdCBzb3J0X2RhdGEgeworICBjaGFyICprZXlfc2VwYXJhdG9yOworICBzdHJ1Y3QgYXJnX2xpc3QgKnJhd19rZXlzOworICBjaGFyICpvdXRmaWxlOworICBjaGFyICppZ25vcmUxLCBpZ25vcmUyOyAgIC8vIEdOVSBjb21wYXRhYmlsaXR5IE5PUHMgZm9yIC1TIGFuZCAtVC4KKworICB2b2lkICprZXlfbGlzdDsKKyAgaW50IGxpbmVjb3VudDsKKyAgY2hhciAqKmxpbmVzOworfTsKKworLy8gdG95cy9wb3NpeC9zcGxpdC5jCisKK3N0cnVjdCBzcGxpdF9kYXRhIHsKKyAgbG9uZyBsaW5lczsKKyAgbG9uZyBieXRlczsKKyAgbG9uZyBzdWZsZW47CisKKyAgY2hhciAqb3V0ZmlsZTsKK307CisKKy8vIHRveXMvcG9zaXgvc3RyaW5ncy5jCisKK3N0cnVjdCBzdHJpbmdzX2RhdGEgeworICBsb25nIG51bTsKK307CisKKy8vIHRveXMvcG9zaXgvdGFpbC5jCisKK3N0cnVjdCB0YWlsX2RhdGEgeworICBsb25nIGxpbmVzOworICBsb25nIGJ5dGVzOworCisgIGludCBmaWxlX25vLCBmZmQsICpmaWxlczsKK307CisKKy8vIHRveXMvcG9zaXgvdGVlLmMKKworc3RydWN0IHRlZV9kYXRhIHsKKyAgdm9pZCAqb3V0cHV0czsKK307CisKKy8vIHRveXMvcG9zaXgvdG91Y2guYworCitzdHJ1Y3QgdG91Y2hfZGF0YSB7CisgIGNoYXIgKnRpbWU7CisgIGNoYXIgKmZpbGU7CisgIGNoYXIgKmRhdGU7Cit9OworCisvLyB0b3lzL3Bvc2l4L3VsaW1pdC5jCisKK3N0cnVjdCB1bGltaXRfZGF0YSB7CisgIGxvbmcgcGlkOworfTsKKworLy8gdG95cy9wb3NpeC91bmlxLmMKKworc3RydWN0IHVuaXFfZGF0YSB7CisgIGxvbmcgbWF4Y2hhcnM7CisgIGxvbmcgbmNoYXJzOworICBsb25nIG5maWVsZHM7CisgIGxvbmcgcmVwZWF0czsKK307CisKKy8vIHRveXMvcG9zaXgvdXVkZWNvZGUuYworCitzdHJ1Y3QgdXVkZWNvZGVfZGF0YSB7CisgIGNoYXIgKm87Cit9OworCisvLyB0b3lzL3Bvc2l4L3djLmMKKworc3RydWN0IHdjX2RhdGEgeworICB1bnNpZ25lZCBsb25nIHRvdGFsc1s0XTsKK307CisKKy8vIHRveXMvcG9zaXgveGFyZ3MuYworCitzdHJ1Y3QgeGFyZ3NfZGF0YSB7CisgIGxvbmcgbWF4X2J5dGVzOworICBsb25nIG1heF9lbnRyaWVzOworICBsb25nIEw7CisgIGNoYXIgKmVvZnN0cjsKKyAgY2hhciAqSTsKKworICBsb25nIGVudHJpZXMsIGJ5dGVzOworICBjaGFyIGRlbGltOworfTsKKworZXh0ZXJuIHVuaW9uIGdsb2JhbF91bmlvbiB7CisJc3RydWN0IGdldHByb3BfZGF0YSBnZXRwcm9wOworCXN0cnVjdCBsb2dfZGF0YSBsb2c7CisJc3RydWN0IGhlbGxvX2RhdGEgaGVsbG87CisJc3RydWN0IHNrZWxldG9uX2RhdGEgc2tlbGV0b247CisJc3RydWN0IGRtZXNnX2RhdGEgZG1lc2c7CisJc3RydWN0IGhvc3RuYW1lX2RhdGEgaG9zdG5hbWU7CisJc3RydWN0IGtpbGxhbGxfZGF0YSBraWxsYWxsOworCXN0cnVjdCBtZDVzdW1fZGF0YSBtZDVzdW07CisJc3RydWN0IG1rbm9kX2RhdGEgbWtub2Q7CisJc3RydWN0IG1rdGVtcF9kYXRhIG1rdGVtcDsKKwlzdHJ1Y3QgbW91bnRfZGF0YSBtb3VudDsKKwlzdHJ1Y3QgcGFzc3dkX2RhdGEgcGFzc3dkOworCXN0cnVjdCBwaWRvZl9kYXRhIHBpZG9mOworCXN0cnVjdCBzZXFfZGF0YSBzZXE7CisJc3RydWN0IHN1X2RhdGEgc3U7CisJc3RydWN0IHVtb3VudF9kYXRhIHVtb3VudDsKKwlzdHJ1Y3QgaWZjb25maWdfZGF0YSBpZmNvbmZpZzsKKwlzdHJ1Y3QgbmV0Y2F0X2RhdGEgbmV0Y2F0OworCXN0cnVjdCBuZXRzdGF0X2RhdGEgbmV0c3RhdDsKKwlzdHJ1Y3QgYWNwaV9kYXRhIGFjcGk7CisJc3RydWN0IGJhc2U2NF9kYXRhIGJhc2U2NDsKKwlzdHJ1Y3QgYmxvY2tkZXZfZGF0YSBibG9ja2RldjsKKwlzdHJ1Y3QgZG9zMnVuaXhfZGF0YSBkb3MydW5peDsKKwlzdHJ1Y3QgZmFsbG9jYXRlX2RhdGEgZmFsbG9jYXRlOworCXN0cnVjdCBmcmVlX2RhdGEgZnJlZTsKKwlzdHJ1Y3QgaGV4ZWRpdF9kYXRhIGhleGVkaXQ7CisJc3RydWN0IGh3Y2xvY2tfZGF0YSBod2Nsb2NrOworCXN0cnVjdCBpb25pY2VfZGF0YSBpb25pY2U7CisJc3RydWN0IGxvZ2luX2RhdGEgbG9naW47CisJc3RydWN0IGxvc2V0dXBfZGF0YSBsb3NldHVwOworCXN0cnVjdCBsc3BjaV9kYXRhIGxzcGNpOworCXN0cnVjdCBtYWtlZGV2c19kYXRhIG1ha2VkZXZzOworCXN0cnVjdCBtaXhfZGF0YSBtaXg7CisJc3RydWN0IG1rcGFzc3dkX2RhdGEgbWtwYXNzd2Q7CisJc3RydWN0IG1rc3dhcF9kYXRhIG1rc3dhcDsKKwlzdHJ1Y3QgbW9kaW5mb19kYXRhIG1vZGluZm87CisJc3RydWN0IG5zZW50ZXJfZGF0YSBuc2VudGVyOworCXN0cnVjdCBvbmVpdF9kYXRhIG9uZWl0OworCXN0cnVjdCBzZXRmYXR0cl9kYXRhIHNldGZhdHRyOworCXN0cnVjdCBzaHJlZF9kYXRhIHNocmVkOworCXN0cnVjdCBzdGF0X2RhdGEgc3RhdDsKKwlzdHJ1Y3Qgc3dhcG9uX2RhdGEgc3dhcG9uOworCXN0cnVjdCBzd2l0Y2hfcm9vdF9kYXRhIHN3aXRjaF9yb290OworCXN0cnVjdCB0aW1lb3V0X2RhdGEgdGltZW91dDsKKwlzdHJ1Y3QgdHJ1bmNhdGVfZGF0YSB0cnVuY2F0ZTsKKwlzdHJ1Y3QgeHhkX2RhdGEgeHhkOworCXN0cnVjdCBhcnBfZGF0YSBhcnA7CisJc3RydWN0IGFycGluZ19kYXRhIGFycGluZzsKKwlzdHJ1Y3QgYm9vdGNoYXJ0ZF9kYXRhIGJvb3RjaGFydGQ7CisJc3RydWN0IGJyY3RsX2RhdGEgYnJjdGw7CisJc3RydWN0IGNvbXByZXNzX2RhdGEgY29tcHJlc3M7CisJc3RydWN0IGNyb25kX2RhdGEgY3JvbmQ7CisJc3RydWN0IGNyb250YWJfZGF0YSBjcm9udGFiOworCXN0cnVjdCBkZF9kYXRhIGRkOworCXN0cnVjdCBkaGNwX2RhdGEgZGhjcDsKKwlzdHJ1Y3QgZGhjcDZfZGF0YSBkaGNwNjsKKwlzdHJ1Y3QgZGhjcGRfZGF0YSBkaGNwZDsKKwlzdHJ1Y3QgZGlmZl9kYXRhIGRpZmY7CisJc3RydWN0IGR1bXBsZWFzZXNfZGF0YSBkdW1wbGVhc2VzOworCXN0cnVjdCBleHByX2RhdGEgZXhwcjsKKwlzdHJ1Y3QgZmRpc2tfZGF0YSBmZGlzazsKKwlzdHJ1Y3QgZm9sZF9kYXRhIGZvbGQ7CisJc3RydWN0IGZzY2tfZGF0YSBmc2NrOworCXN0cnVjdCBmdHBnZXRfZGF0YSBmdHBnZXQ7CisJc3RydWN0IGdldGZhdHRyX2RhdGEgZ2V0ZmF0dHI7CisJc3RydWN0IGdldHR5X2RhdGEgZ2V0dHk7CisJc3RydWN0IGdyb3VwYWRkX2RhdGEgZ3JvdXBhZGQ7CisJc3RydWN0IGhvc3RfZGF0YSBob3N0OworCXN0cnVjdCBpY29udl9kYXRhIGljb252OworCXN0cnVjdCBpcF9kYXRhIGlwOworCXN0cnVjdCBpcGNybV9kYXRhIGlwY3JtOworCXN0cnVjdCBpcGNzX2RhdGEgaXBjczsKKwlzdHJ1Y3Qga2xvZ2RfZGF0YSBrbG9nZDsKKwlzdHJ1Y3QgbGFzdF9kYXRhIGxhc3Q7CisJc3RydWN0IGxvZ2dlcl9kYXRhIGxvZ2dlcjsKKwlzdHJ1Y3QgbHNvZl9kYXRhIGxzb2Y7CisJc3RydWN0IG1rZTJmc19kYXRhIG1rZTJmczsKKwlzdHJ1Y3QgbW9kcHJvYmVfZGF0YSBtb2Rwcm9iZTsKKwlzdHJ1Y3QgbW9yZV9kYXRhIG1vcmU7CisJc3RydWN0IG9wZW52dF9kYXRhIG9wZW52dDsKKwlzdHJ1Y3QgcGluZ19kYXRhIHBpbmc7CisJc3RydWN0IHJvdXRlX2RhdGEgcm91dGU7CisJc3RydWN0IHNoX2RhdGEgc2g7CisJc3RydWN0IHN1bG9naW5fZGF0YSBzdWxvZ2luOworCXN0cnVjdCBzeXNsb2dkX2RhdGEgc3lzbG9nZDsKKwlzdHJ1Y3QgdGFyX2RhdGEgdGFyOworCXN0cnVjdCB0Y3BzdmRfZGF0YSB0Y3BzdmQ7CisJc3RydWN0IHRlbG5ldF9kYXRhIHRlbG5ldDsKKwlzdHJ1Y3QgdGVsbmV0ZF9kYXRhIHRlbG5ldGQ7CisJc3RydWN0IHRmdHBfZGF0YSB0ZnRwOworCXN0cnVjdCB0ZnRwZF9kYXRhIHRmdHBkOworCXN0cnVjdCB0cl9kYXRhIHRyOworCXN0cnVjdCB0cmFjZXJvdXRlX2RhdGEgdHJhY2Vyb3V0ZTsKKwlzdHJ1Y3QgdXNlcmFkZF9kYXRhIHVzZXJhZGQ7CisJc3RydWN0IHZpX2RhdGEgdmk7CisJc3RydWN0IHdhdGNoX2RhdGEgd2F0Y2g7CisJc3RydWN0IHdnZXRfZGF0YSB3Z2V0OworCXN0cnVjdCBjaGdycF9kYXRhIGNoZ3JwOworCXN0cnVjdCBjaG1vZF9kYXRhIGNobW9kOworCXN0cnVjdCBja3N1bV9kYXRhIGNrc3VtOworCXN0cnVjdCBjbXBfZGF0YSBjbXA7CisJc3RydWN0IGNwX2RhdGEgY3A7CisJc3RydWN0IGNwaW9fZGF0YSBjcGlvOworCXN0cnVjdCBjdXRfZGF0YSBjdXQ7CisJc3RydWN0IGRhdGVfZGF0YSBkYXRlOworCXN0cnVjdCBkZl9kYXRhIGRmOworCXN0cnVjdCBkdV9kYXRhIGR1OworCXN0cnVjdCBlbnZfZGF0YSBlbnY7CisJc3RydWN0IGV4cGFuZF9kYXRhIGV4cGFuZDsKKwlzdHJ1Y3QgZmlsZV9kYXRhIGZpbGU7CisJc3RydWN0IGZpbmRfZGF0YSBmaW5kOworCXN0cnVjdCBncmVwX2RhdGEgZ3JlcDsKKwlzdHJ1Y3QgaGVhZF9kYXRhIGhlYWQ7CisJc3RydWN0IGlkX2RhdGEgaWQ7CisJc3RydWN0IGtpbGxfZGF0YSBraWxsOworCXN0cnVjdCBsc19kYXRhIGxzOworCXN0cnVjdCBta2Rpcl9kYXRhIG1rZGlyOworCXN0cnVjdCBta2ZpZm9fZGF0YSBta2ZpZm87CisJc3RydWN0IG5pY2VfZGF0YSBuaWNlOworCXN0cnVjdCBubF9kYXRhIG5sOworCXN0cnVjdCBvZF9kYXRhIG9kOworCXN0cnVjdCBwYXN0ZV9kYXRhIHBhc3RlOworCXN0cnVjdCBwYXRjaF9kYXRhIHBhdGNoOworCXN0cnVjdCBwc19kYXRhIHBzOworCXN0cnVjdCByZW5pY2VfZGF0YSByZW5pY2U7CisJc3RydWN0IHNlZF9kYXRhIHNlZDsKKwlzdHJ1Y3Qgc29ydF9kYXRhIHNvcnQ7CisJc3RydWN0IHNwbGl0X2RhdGEgc3BsaXQ7CisJc3RydWN0IHN0cmluZ3NfZGF0YSBzdHJpbmdzOworCXN0cnVjdCB0YWlsX2RhdGEgdGFpbDsKKwlzdHJ1Y3QgdGVlX2RhdGEgdGVlOworCXN0cnVjdCB0b3VjaF9kYXRhIHRvdWNoOworCXN0cnVjdCB1bGltaXRfZGF0YSB1bGltaXQ7CisJc3RydWN0IHVuaXFfZGF0YSB1bmlxOworCXN0cnVjdCB1dWRlY29kZV9kYXRhIHV1ZGVjb2RlOworCXN0cnVjdCB3Y19kYXRhIHdjOworCXN0cnVjdCB4YXJnc19kYXRhIHhhcmdzOworfSB0aGlzOwpkaWZmIC0tZ2l0IGEvdG95Ym94L2dlbmVyYXRlZC9oZWxwLmggYi90b3lib3gvZ2VuZXJhdGVkL2hlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI3N2YxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2dlbmVyYXRlZC9oZWxwLmgKQEAgLTAsMCArMSw1ODIgQEAKKyNkZWZpbmUgSEVMUF90b3lib3hfbXVzbF9ub21tdV9pc19icm9rZW4gIldoZW4gdXNpbmcgbXVzbC1saWJjIG9uIGEgbm9tbXUgc3lzdGVtLCB5b3UnbGwgbmVlZCB0byBzYXkgXCJ5XCIgaGVyZS5cblxuQWx0aG91Z2ggdWNsaWJjIGxldHMgeW91IGRldGVjdCBzdXBwb3J0IGZvciB0aGluZ3MgbGlrZSBmb3JrKCkgYW5kXG5kYWVtb24oKSBhdCBjb21waWxlIHRpbWUsIG11c2wgaW50ZW50aW9uYWxseSBpbmNsdWRlcyBicm9rZW4gdmVyc2lvbnNcbnRoYXQgYWx3YXlzIHJldHVybiAtRU5PU1lTIG9uIG5vbW11IHN5c3RlbXMsIGFuZCBnb2VzIG91dCBvZiBpdHMgd2F5XG50byBwcmV2ZW50IGFueSBjcm9zcy1jb21waWxlIGNvbXBhdGlibGUgY29tcGlsZS10aW1lIHByb2JlcyBmb3IgYVxubm9tbXUgc3lzdGVtLlxuXG5NdXNsIGRvZXMgdGhpcyBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgYSBub21tdSBzeXN0ZW0gY2FuJ3QgZXZlbiBydW5cbnN0YW5kYXJkIEVMRiBiaW5hcmllcywgYW5kIHJlcXVpcmVzIHNwZWNpYWxseSBwYWNrYWdlZCBleGVjdXRhYmxlcy5cbihZb3UgY2FuJ3QgZXZlbiBjaGVjayBhICNkZWZpbmUgdG8gc2VlIHRoYXQgeW91J3JlIGJ1aWxkaW5nIGFnYWluc3Rcbm11c2wsIGR1ZSB0byBpdHMgbWFpbnRhaW5lcidzIHBvbGljeSB0aGF0IG11c2wgbmV2ZXIgaGFzIGJ1Z3MgdGhhdFxucmVxdWlyZSB3b3JrYXJvdW5kcy4pXG5cblNvIG91ciBvbmx5IGNob2ljZSBpcyB0byBtYW51YWxseSBwcm92aWRlIGEgbXVzbCBub21tdSBidWcgd29ya2Fyb3VuZFxueW91IGNhbiBtYW51YWxseSBzZWxlY3QgdG8gZW5hYmxlIChsYXJnZXIsIHNsb3dlcikgbm9tbXUgc3VwcG9ydCB3aXRoXG5tdXNsLlxuXG5Zb3UgZG9uJ3QgbmVlZCB0aGlzIGZvciB1Q2xpYmMsIHdlIGhhdmUgYSBjb21waWxlIHRpbWUgcHJvYmUgdGhhdFxuYXV0b2RldGVjdHMgbm9tbXUgc3VwcG9ydCB0aGVyZS5cblxuIgorCisjZGVmaW5lIEhFTFBfdG95Ym94X3VpZF91c3IgIldoZW4gY29tbWFuZHMgbGlrZSB1c2VyYWRkL2dyb3VwYWRkIGFsbG9jYXRlIHVzZXIgSURzLCBzdGFydCBoZXJlLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfdWlkX3N5cyAiV2hlbiBjb21tYW5kcyBsaWtlIHVzZXJhZGQvZ3JvdXBhZGQgYWxsb2NhdGUgc3lzdGVtIElEcywgc3RhcnQgaGVyZS5cblxuIgorCisjZGVmaW5lIEhFTFBfdG95Ym94X2RlYnVnICJFbmFibGUgZXh0cmEgY2hlY2tzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuIEFsbCBvZiB0aGVtIGNhdGNoXG50aGluZ3MgdGhhdCBjYW4gb25seSBnbyB3cm9uZyBhdCBkZXZlbG9wbWVudCB0aW1lLCBub3QgcnVudGltZS5cblxuIgorCisjZGVmaW5lIEhFTFBfdG95Ym94X25vcmVjdXJzZSAiV2hlbiBvbmUgdG95Ym94IGNvbW1hbmQgY2FsbHMgYW5vdGhlciwgdXN1YWxseSBpdCBqdXN0IGNhbGxzIHRoZSBuZXdcbmNvbW1hbmQncyBtYWluKCkgZnVuY3Rpb24gcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSAkUEFUSCBhbmQgY2FsbGluZ1xuZXhlYyBvbiBhbm90aGVyIGZpbGUgKHdoaWNoIGlzIG11Y2ggc2xvd2VyKS5cblxuVGhpcyBkaXNhYmxlcyB0aGF0IG9wdGltaXphdGlvbiwgc28gdG95Ym94IHdpbGwgcnVuIGV4dGVybmFsIGNvbW1hbmRzXG4gICAgICAgZXZlbiB3aGVuIGl0IGhhcyBhIGJ1aWx0LWluIHZlcnNpb24gb2YgdGhhdCBjb21tYW5kLiBUaGlzIHJlcXVpcmVzXG4gICAgICAgdG95Ym94IHN5bWxpbmtzIHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgJFBBVEgsIG9yIHJlLWludm9raW5nIHRoZVxuICAgICAgIFwidG95Ym94XCIgbXVsdGlwbGV4ZXIgY29tbWFuZCBieSBuYW1lLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfZnJlZSAiV2hlbiBhIHByb2dyYW0gZXhpdHMsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgY2xlYW4gdXAgYWZ0ZXIgaXRcbihmcmVlIG1lbW9yeSwgY2xvc2UgZmlsZXMsIGV0YykuIFRvIHNhdmUgc2l6ZSwgdG95Ym94IHVzdWFsbHkgcmVsaWVzXG5vbiB0aGlzIGJlaGF2aW9yLiBJZiB5b3UncmUgcnVubmluZyB0b3lib3ggdW5kZXIgYSBkZWJ1Z2dlciBvclxud2l0aG91dCBhIHJlYWwgT1MgKGFsYSBuZXdsaWIrbGliZ2xvc3MpLCBlbmFibGUgdGhpcyB0byBtYWtlIHRveWJveFxuY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfaTE4biAiU3VwcG9ydCBmb3IgVVRGLTggY2hhcmFjdGVyIHNldHMsIGFuZCBzb21lIGxvY2FsZSBzdXBwb3J0LlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfaGVscF9kYXNoZGFzaCAiU3VwcG9ydCAtLWhlbHAgYXJndW1lbnQgaW4gYWxsIGNvbW1hbmRzLCBldmVuIG9uZXMgd2l0aCBhIE5VTExcbm9wdHN0cmluZy4gUHJvZHVjZXMgdGhlIHNhbWUgb3V0cHV0IGFzIFwiaGVscCBjb21tYW5kXCIuXG5cbiIKKworI2RlZmluZSBIRUxQX3RveWJveF9oZWxwICJJbmNsdWRlIGhlbHAgdGV4dCBmb3IgZWFjaCBjb21tYW5kLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfZmxvYXQgIkluY2x1ZGUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBpbmZyYXN0cnVjdHVyZSBhbmQgY29tbWFuZHMgdGhhdFxucmVxdWlyZSBpdC5cblxuIgorCisjZGVmaW5lIEhFTFBfdG95Ym94X2xpYmNyeXB0byAiVXNlIGZhc3RlciBoYXNoIGZ1bmN0aW9ucyBvdXQgb2YgZXh0ZXJhbCAtbGNyeXB0byBsaWJyYXJ5LlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfc21hY2sgIkluY2x1ZGUgU01BQ0sgb3B0aW9ucyBpbiBjb21tYW5kcyBsaWtlIGxzIGZvciBzeXN0ZW1zIGxpa2UgVGl6ZW4uXG5cblxuIgorCisjZGVmaW5lIEhFTFBfdG95Ym94X3NlbGludXggIkluY2x1ZGUgU0VMaW51eCBvcHRpb25zIGluIGNvbW1hbmRzIHN1Y2ggYXMgbHMsIGFuZCBhZGRcblNFTGludXgtc3BlY2lmaWMgY29tbWFuZHMgc3VjaCBhcyBjaGNvbiB0byB0aGUgQW5kcm9pZCBtZW51LlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfbHNtX25vbmUgIkRvbid0IHRyeSB0byBhY2hpZXZlIFwid2F0ZXJ0aWdodFwiIGJ5IHBsdWdnaW5nIHRoZSBob2xlcyBpbiBhXG5jb2xsYW5kZXIsIGluc3RlYWQgdXNlIGNvbnZlbnRpb25hbCB1bml4IHNlY3VyaXR5IChhbmQgcG9zc2libHlcbkxpbnV4IENvbnRhaW5lcnMpIGZvciBhIHNpbXBsZSBzdHJhaWdodGZvcndhcmQgc3lzdGVtLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3hfc3VpZCAiU3VwcG9ydCBmb3IgdGhlIFNldCBVc2VyIElEIGJpdCwgdG8gaW5zdGFsbCB0b3lib3ggc3VpZCByb290IGFuZCBkcm9wXG5wZXJtaXNzaW9ucyBmb3IgY29tbWFuZHMgd2hpY2ggZG8gbm90IHJlcXVpcmUgcm9vdCBhY2Nlc3MuIFRvIHVzZVxudGhpcyBjaGFuZ2Ugb3duZXJzaGlwIG9mIHRoZSBmaWxlIHRvIHRoZSByb290IHVzZXIgYW5kIHNldCB0aGUgc3VpZFxuYml0IGluIHRoZSBmaWxlIHBlcm1pc3Npb25zOlxuXG5jaG93biByb290OnJvb3QgdG95Ym94OyBjaG1vZCArcyB0b3lib3hcblxucHJvbXB0IFwiU2VjdXJpdHkgQmxhbmtldFwiXG5kZWZhdWx0IFRPWUJPWF9MU01fTk9ORVxuaGVscFxuU2VsZWN0IGEgTGludXggU2VjdXJpdHkgTW9kdWxlIHRvIGNvbXBsaWNhdGUgeW91ciBzeXN0ZW1cbnVudGlsIHlvdSBjYW4ndCBmaW5kIGhvbGVzIGluIGl0LlxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3lib3ggInVzYWdlOiB0b3lib3ggWy0tbG9uZyB8IC0tdmVyc2lvbiB8IFtjb21tYW5kXSBbYXJndW1lbnRzLi4uXV1cblxuV2l0aCBubyBhcmd1bWVudHMsIHNob3dzIGF2YWlsYWJsZSBjb21tYW5kcy4gRmlyc3QgYXJndW1lbnQgaXNcbm5hbWUgb2YgYSBjb21tYW5kIHRvIHJ1biwgZm9sbG93ZWQgYnkgYW55IGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQuXG5cbi0tbG9uZwlTaG93IHBhdGggdG8gZWFjaCBjb21tYW5kXG4tLXZlcnNpb24JU2hvdyB0b3lib3ggdmVyc2lvblxuXG5UbyBpbnN0YWxsIGNvbW1hbmQgc3ltbGlua3MsIHRyeTpcbiAgZm9yIGkgaW4gJCgvYmluL3RveWJveCAtLWxvbmcpOyBkbyBsbiAtcyAvYmluL3RveWJveCAkaTsgZG9uZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9zdG9wICJ1c2FnZTogc3RvcCBbU0VSVklDRS4uLl1cblxuU3RvcCB0aGUgZ2l2ZW4gc3lzdGVtIHNlcnZpY2UsIG9yIG5ldGQvc3VyZmFjZWZsaW5nZXIvenlnb3Rlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfc3RhcnQgInVzYWdlOiBzdGFydCBbU0VSVklDRS4uLl1cblxuU3RhcnRzIHRoZSBnaXZlbiBzeXN0ZW0gc2VydmljZSwgb3IgbmV0ZC9zdXJmYWNlZmxpbmdlci96eWdvdGVzLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9zZXRwcm9wICJ1c2FnZTogc2V0cHJvcCBOQU1FIFZBTFVFXG5cblNldHMgYW4gQW5kcm9pZCBzeXN0ZW0gcHJvcGVydHkuXG5cbiIKKworI2RlZmluZSBIRUxQX3NldGVuZm9yY2UgInVzYWdlOiBzZXRlbmZvcmNlIFtlbmZvcmNpbmd8cGVybWlzc2l2ZXwxfDBdXG5cblNldHMgd2hldGhlciBTRUxpbnV4IGlzIGVuZm9yY2luZyAoMSkgb3IgcGVybWlzc2l2ZSAoMCkuXG5cbiIKKworI2RlZmluZSBIRUxQX3NlbmRldmVudCAidXNhZ2U6IHNlbmRldmVudCBERVZJQ0UgVFlQRSBDT0RFIFZBTFVFXG5cblNlbmRzIGEgTGludXggaW5wdXQgZXZlbnQuXG5cbiIKKworI2RlZmluZSBIRUxQX3J1bmNvbiAidXNhZ2U6IHJ1bmNvbiBDT05URVhUIENPTU1BTkQgW0FSR1MuLi5dXG5cblJ1biBhIGNvbW1hbmQgaW4gYSBzcGVjaWZpZWQgc2VjdXJpdHkgY29udGV4dC5cblxuIgorCisjZGVmaW5lIEhFTFBfcmVzdG9yZWNvbiAidXNhZ2U6IHJlc3RvcmVjb24gWy1EXSBbLUZdIFstUl0gWy1uXSBbLXZdIEZJTEUuLi5cblxuUmVzdG9yZXMgdGhlIGRlZmF1bHQgc2VjdXJpdHkgY29udGV4dHMgZm9yIHRoZSBnaXZlbiBmaWxlcy5cblxuLUQJYXBwbHkgdG8gL2RhdGEvZGF0YSB0b29cbi1GCWZvcmNlIHJlc2V0XG4tUglyZWN1cnNlIGludG8gZGlyZWN0b3JpZXNcbi1uCWRvbid0IG1ha2UgYW55IGNoYW5nZXM7IHVzZWZ1bCB3aXRoIC12IHRvIHNlZSB3aGF0IHdvdWxkIGNoYW5nZVxuLXYJdmVyYm9zZTogc2hvdyBhbnkgY2hhbmdlc1xuXG4iCisKKyNkZWZpbmUgSEVMUF9sb2cgInVzYWdlOiBsb2cgWy1wIFBSSV0gWy10IFRBR10gTUVTU0FHRS4uLlxuXG5Mb2dzIG1lc3NhZ2UgdG8gbG9nY2F0LlxuXG4tcAl1c2UgdGhlIGdpdmVuIHByaW9yaXR5IGluc3RlYWQgb2YgSU5GTzpcbglkOiBERUJVRyAgZTogRVJST1IgIGY6IEZBVEFMICBpOiBJTkZPICB2OiBWRVJCT1NFICB3OiBXQVJOICBzOiBTSUxFTlRcbi10CXVzZSB0aGUgZ2l2ZW4gdGFnIGluc3RlYWQgb2YgXCJsb2dcIlxuXG4iCisKKyNkZWZpbmUgSEVMUF9sb2FkX3BvbGljeSAidXNhZ2U6IGxvYWRfcG9saWN5IEZJTEVcblxuTG9hZCB0aGUgc3BlY2lmaWVkIHBvbGljeSBmaWxlLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9nZXRwcm9wICJ1c2FnZTogZ2V0cHJvcCBbTkFNRSBbREVGQVVMVF1dXG5cbkdldHMgYW4gQW5kcm9pZCBzeXN0ZW0gcHJvcGVydHksIG9yIGxpc3RzIHRoZW0gYWxsLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9nZXRlbmZvcmNlICJ1c2FnZTogZ2V0ZW5mb3JjZVxuXG5TaG93cyB3aGV0aGVyIFNFTGludXggaXMgZGlzYWJsZWQsIGVuZm9yY2luZywgb3IgcGVybWlzc2l2ZS5cblxuIgorCisjZGVmaW5lIEhFTFBfdGVzdF9zY2Fua2V5ICJ1c2FnZTogdGVzdF9zY2Fua2V5XG5cbk1vdmUgYSBsZXR0ZXIgYXJvdW5kIHRoZSBzY3JlZW4uIEhpdCBFU0MgdG8gZXhpdC5cblxuXG4iCisKKyNkZWZpbmUgSEVMUF90ZXN0X21hbnlfb3B0aW9ucyAidXNhZ2U6IHRlc3RfbWFueV9vcHRpb25zIC1bYS16QS1aXVxuXG5QcmludCB0aGUgb3B0ZmxhZ3MgdmFsdWUgb2YgdGhlIGNvbW1hbmQgYXJndW1lbnRzLCBpbiBoZXguXG5cbiIKKworI2RlZmluZSBIRUxQX3Rlc3RfaHVtYW5fcmVhZGFibGUgInVzYWdlOiB0ZXN0X2h1bWFuX3JlYWRhYmxlIFstc2JpXSBOVU1CRVJcblxuIgorCisjZGVmaW5lIEhFTFBfc2tlbGV0b25fYWxpYXMgInVzYWdlOiBza2VsZXRvbl9hbGlhcyBbLWRxXSBbLWIgTlVNQkVSXVxuXG5FeGFtcGxlIG9mIGEgc2Vjb25kIGNvbW1hbmQgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzIGluIHRoZSBzYW1lIHNvdXJjZVxuZmlsZSBhcyB0aGUgZmlyc3QuIFRoaXMgYWxsb3dzIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSBub3QgYWRkZWQgdG8gbGliLy5cblxuIgorCisjZGVmaW5lIEhFTFBfc2tlbGV0b24gInVzYWdlOiBza2VsZXRvbiBbLWFdIFstYiBTVFJJTkddIFstYyBOVU1CRVJdIFstZCBMSVNUXSBbLWUgQ09VTlRdIFsuLi5dXG5cblRlbXBsYXRlIGZvciBuZXcgY29tbWFuZHMuIFlvdSBkb24ndCBuZWVkIHRoaXMuXG5cbldoZW4gY3JlYXRpbmcgYSBuZXcgY29tbWFuZCwgY29weSB0aGlzIGZpbGUgYW5kIGRlbGV0ZSB0aGUgcGFydHMgeW91XG5kb24ndCBuZWVkLiBCZSBzdXJlIHRvIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBcInNrZWxldG9uXCIgKHVwcGVyIGFuZCBsb3dlclxuY2FzZSkgd2l0aCB5b3VyIG5ldyBjb21tYW5kIG5hbWUuXG5cbkZvciBzaW1wbGUgY29tbWFuZHMsIFwiaGVsbG8uY1wiIGlzIHByb2JhYmx5IGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LlxuXG4iCisKKyNkZWZpbmUgSEVMUF9oZWxsbyAidXNhZ2U6IGhlbGxvIFstc11cblxuQSBoZWxsbyB3b3JsZCBwcm9ncmFtLiAgWW91IGRvbid0IG5lZWQgdGhpcy5cblxuTW9zdGx5IHVzZWQgYXMgYSBzaW1wbGUgdGVtcGxhdGUgZm9yIGFkZGluZyBuZXcgY29tbWFuZHMuXG5PY2Nhc2lvbmFsbHkgbmljZSB0byBzbW9rZXRlc3Qga2VybmVsIGJvb3RpbmcgdmlhIFwiaW5pdD0vdXNyL2Jpbi9oZWxsb1wiLlxuXG4iCisKKyNkZWZpbmUgSEVMUF91bW91bnQgInVzYWdlOiB1bW91bnQgWy1hIFstdCBUWVBFWyxUWVBFLi4uXV1dIFstdnJmRF0gW0RJUi4uLl1cblxuVW5tb3VudCB0aGUgbGlzdGVkIGZpbGVzeXN0ZW1zLlxuXG4tYQlVbm1vdW50IGFsbCBtb3VudHMgaW4gL3Byb2MvbW91bnRzIGluc3RlYWQgb2YgY29tbWFuZCBsaW5lIGxpc3Rcbi1EICBEb24ndCBmcmVlIGxvb3BiYWNrIGRldmljZShzKS5cbi1mICBGb3JjZSB1bm1vdW50LlxuLWwgIExhenkgdW5tb3VudCAoZGV0YWNoIGZyb20gZmlsZXN5c3RlbSBub3csIGNsb3NlIHdoZW4gbGFzdCB1c2VyIGRvZXMpLlxuLW4JRG9uJ3QgdXNlIC9wcm9jL21vdW50c1xuLXIgIFJlbW91bnQgcmVhZCBvbmx5IGlmIHVubW91bnRpbmcgZmFpbHMuXG4tdAlSZXN0cmljdCBcImFsbFwiIHRvIG1vdW50cyBvZiBUWVBFIChvciB1c2UgXCJub1RZUEVcIiB0byBza2lwKVxuLXYJVmVyYm9zZVxuXG5cbiIKKworI2RlZmluZSBIRUxQX3N5bmMgInVzYWdlOiBzeW5jXG5cbldyaXRlIHBlbmRpbmcgY2FjaGVkIGRhdGEgdG8gZGlzayAoc3luY2hyb25pemUpLCBibG9ja2luZyB1bnRpbCBkb25lLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9zdSAidXNhZ2U6IHN1IFstbG1wXSBbLWMgQ01EXSBbLXMgU0hFTExdIFtVU0VSIFtBUkdTLi4uXV1cblxuU3dpdGNoIHRvIHVzZXIgKG9yIHJvb3QpIGFuZCBydW4gc2hlbGwgKHdpdGggb3B0aW9uYWwgY29tbWFuZCBsaW5lKS5cblxuLXMJc2hlbGwgdG8gdXNlXG4tYwljb21tYW5kIHRvIHBhc3MgdG8gc2hlbGwgd2l0aCAtY1xuLWwJbG9naW4gc2hlbGxcbi0obXxwKQlwcmVzZXJ2ZSBlbnZpcm9ubWVudFxuXG4iCisKKyNkZWZpbmUgSEVMUF9zZXEgInVzYWdlOiBzZXEgWy13fC1mIGZtdF9zdHJdIFstcyBzZXBfc3RyXSBbZmlyc3RdIFtpbmNyZW1lbnRdIGxhc3RcblxuQ291bnQgZnJvbSBmaXJzdCB0byBsYXN0LCBieSBpbmNyZW1lbnQuIE9taXR0ZWQgYXJndW1lbnRzIGRlZmF1bHRcbnRvIDEuIFR3byBhcmd1bWVudHMgYXJlIHVzZWQgYXMgZmlyc3QgYW5kIGxhc3QuIEFyZ3VtZW50cyBjYW4gYmVcbm5lZ2F0aXZlIG9yIGZsb2F0aW5nIHBvaW50LlxuXG4tZglVc2UgZm10X3N0ciBhcyBhIHByaW50Zi1zdHlsZSBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3RyaW5nXG4tcwlVc2Ugc2VwX3N0ciBhcyBzZXBhcmF0b3IsIGRlZmF1bHQgaXMgYSBuZXdsaW5lIGNoYXJhY3RlclxuLXcJUGFkIHRvIGVxdWFsIHdpZHRoIHdpdGggbGVhZGluZyB6ZXJvZXMuXG5cbiIKKworI2RlZmluZSBIRUxQX3BpZG9mICJ1c2FnZTogcGlkb2YgWy1zXSBbLW8gb21pdHBpZFssb21pdHBpZC4uLl1dIFtOQU1FXS4uLlxuXG5QcmludCB0aGUgUElEcyBvZiBhbGwgcHJvY2Vzc2VzIHdpdGggdGhlIGdpdmVuIG5hbWVzLlxuXG4tcwlzaW5nbGUgc2hvdCwgb25seSByZXR1cm4gb25lIHBpZC5cbi1vCW9taXQgUElEKHMpXG5cbiIKKworI2RlZmluZSBIRUxQX3Bhc3N3ZF9zYWQgIlBhc3N3b3JkIGNoYW5nZXMgYXJlIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3QgaW5jbHVkZSB0aGUgZW50aXJlXG51c2VybmFtZSAoYnV0IG5vdCBhIHN1YnNldCBvZiBpdCksIGFuZCB0aGUgZW50aXJlIHByZXZpb3VzIHBhc3N3b3JkXG4oYnV0IGNoYW5naW5nIHBhc3N3b3JkMSwgcGFzc3dvcmQyLCBwYXNzd29yZDMgaXMgZmluZSkuIFRoaXMgaGV1cmlzdGljXG5hY2NlcHRzIFwiYWFhYWFhXCIgYXMgYSBwYXNzd29yZC5cblxuIgorCisjZGVmaW5lIEhFTFBfcGFzc3dkICJ1c2FnZTogcGFzc3dkIFstYSBBTEdPXSBbLWRsdV0gPGFjY291bnQgbmFtZT5cblxudXBkYXRlIHVzZXIncyBhdXRoZW50aWNhdGlvbiB0b2tlbnMuIERlZmF1bHQgOiBjdXJyZW50IHVzZXJcblxuLWEgQUxHTwlFbmNyeXB0aW9uIG1ldGhvZCAoZGVzLCBtZDUsIHNoYTI1Niwgc2hhNTEyKSBkZWZhdWx0OiBkZXNcbi1kCQlTZXQgcGFzc3dvcmQgdG8gJydcbi1sCQlMb2NrIChkaXNhYmxlKSBhY2NvdW50XG4tdQkJVW5sb2NrIChlbmFibGUpIGFjY291bnRcblxuIgorCisjZGVmaW5lIEhFTFBfbW91bnQgInVzYWdlOiBtb3VudCBbLWFmRnJzdnddIFstdCBUWVBFXSBbLW8gT1BUSU9OLF0gW1tERVZJQ0VdIERJUl1cblxuTW91bnQgbmV3IGZpbGVzeXN0ZW0ocykgb24gZGlyZWN0b3JpZXMuIFdpdGggbm8gYXJndW1lbnRzLCBkaXNwbGF5IGV4aXN0aW5nXG5tb3VudHMuXG5cbi1hCW1vdW50IGFsbCBlbnRyaWVzIGluIC9ldGMvZnN0YWIgKHdpdGggLXQsIG9ubHkgZW50cmllcyBvZiB0aGF0IFRZUEUpXG4tTwlvbmx5IG1vdW50IC1hIGVudHJpZXMgdGhhdCBoYXZlIHRoaXMgb3B0aW9uXG4tZglmYWtlIGl0IChkb24ndCBhY3R1YWxseSBtb3VudClcbi1yCXJlYWQgb25seSAoc2FtZSBhcyAtbyBybylcbi13CXJlYWQvd3JpdGUgKGRlZmF1bHQsIHNhbWUgYXMgLW8gcncpXG4tdAlzcGVjaWZ5IGZpbGVzeXN0ZW0gdHlwZVxuLXYJdmVyYm9zZVxuXG5PUFRJT05TIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9ucywgd2hpY2ggY2FuIGFsc28gYmUgc3VwcGxpZWRcbmFzIC0tbG9uZ29wdHMuXG5cblRoaXMgbW91bnQgYXV0b2RldGVjdHMgbG9vcGJhY2sgbW91bnRzIChhIGZpbGUgb24gYSBkaXJlY3RvcnkpIGFuZFxuYmluZCBtb3VudHMgKGZpbGUgb24gZmlsZSwgZGlyZWN0b3J5IG9uIGRpcmVjdG9yeSksIHNvIHlvdSBkb24ndCBuZWVkXG50byBzYXkgLS1iaW5kIG9yIC0tbG9vcC4gWW91IGNhbiBhbHNvIFwibW91bnQgLWEgL3BhdGhcIiB0byBtb3VudCBldmVyeXRoaW5nXG5pbiAvZXRjL2ZzdGFiIHVuZGVyIC9wYXRoLCBldmVuIGlmIGl0J3Mgbm9hdXRvLlxuXG5cbiIKKworI2RlZmluZSBIRUxQX21rdGVtcCAidXNhZ2U6IG1rdGVtcCBbLWRxdV0gWy1wIERJUl0gW1RFTVBMQVRFXVxuXG5TYWZlbHkgY3JlYXRlIGEgbmV3IGZpbGUgXCJESVIvVEVNUExBVEVcIiBhbmQgcHJpbnQgaXRzIG5hbWUuXG5cbi1kCUNyZWF0ZSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBmaWxlICgtLWRpcmVjdG9yeSlcbi1wCVB1dCBuZXcgZmlsZSBpbiBESVIgKC0tdG1wZGlyKVxuLXEJUXVpZXQsIG5vIGVycm9yIG1lc3NhZ2VzXG4tdQlEb24ndCBjcmVhdGUgYW55dGhpbmcsIGp1c3QgcHJpbnQgd2hhdCB3b3VsZCBiZSBjcmVhdGVkXG5cbkVhY2ggWCBpbiBURU1QTEFURSBpcyByZXBsYWNlZCB3aXRoIGEgcmFuZG9tIHByaW50YWJsZSBjaGFyYWN0ZXIuIFRoZVxuZGVmYXVsdCBURU1QTEFURSBpcyB0bXAuWFhYWFhYLCBhbmQgdGhlIGRlZmF1bHQgRElSIGlzICRUTVBESVIgaWYgc2V0LFxuZWxzZSBcIi90bXBcIi5cblxuIgorCisjZGVmaW5lIEhFTFBfbWtub2RfeiAidXNhZ2U6IG1rbm9kIFstWiBDT05URVhUXSAuLi5cblxuLVoJU2V0IHNlY3VyaXR5IGNvbnRleHQgdG8gY3JlYXRlZCBmaWxlXG5cbiIKKworI2RlZmluZSBIRUxQX21rbm9kICJ1c2FnZTogbWtub2QgWy1tIE1PREVdIE5BTUUgVFlQRSBbTUFKT1IgTUlOT1JdXG5cbkNyZWF0ZSBhIHNwZWNpYWwgZmlsZSBOQU1FIHdpdGggYSBnaXZlbiB0eXBlLiBUWVBFIGlzIGIgZm9yIGJsb2NrIGRldmljZSxcbmMgb3IgdSBmb3IgY2hhcmFjdGVyIGRldmljZSwgcCBmb3IgbmFtZWQgcGlwZSAod2hpY2ggaWdub3JlcyBNQUpPUi9NSU5PUikuXG5cbi1tCU1vZGUgKGZpbGUgcGVybWlzc2lvbnMpIG9mIG5ldyBkZXZpY2UsIGluIG9jdGFsIG9yIHUreCBmb3JtYXRcblxuIgorCisjZGVmaW5lIEhFTFBfc2hhNTEyc3VtICJTZWUgc2hhMXN1bVxuXG4iCisKKyNkZWZpbmUgSEVMUF9zaGEzODRzdW0gIlNlZSBzaGExc3VtXG5cbiIKKworI2RlZmluZSBIRUxQX3NoYTI1NnN1bSAiU2VlIHNoYTFzdW1cblxuIgorCisjZGVmaW5lIEhFTFBfc2hhMjI0c3VtICJTZWUgc2hhMXN1bVxuXG4iCisKKyNkZWZpbmUgSEVMUF9zaGExc3VtICJ1c2FnZTogc2hhP3N1bSBbLWJdIFstYyBGSUxFXSBbRklMRV0uLi5cblxuY2FsY3VsYXRlIHNoYSBoYXNoIGZvciBlYWNoIGlucHV0IGZpbGUsIHJlYWRpbmcgZnJvbSBzdGRpbiBpZiBub25lLiBPdXRwdXRcbm9uZSBoYXNoICg0MCBoZXggZGlnaXRzIGZvciBzaGExLCA1NiBmb3Igc2hhMjI0LCA2NCBmb3Igc2hhMjU2LCA5NiBmb3Igc2hhMzg0LFxuYW5kIDEyOCBmb3Igc2hhNTEyKSBmb3IgZWFjaCBpbnB1dCBmaWxlLCBmb2xsb3dlZCBieSBmaWxlbmFtZS5cblxuLWIJYnJpZWYgKGhhc2ggb25seSwgbm8gZmlsZW5hbWUpXG4tYwlDaGVjayBlYWNoIGxpbmUgb2YgRklMRSBpcyB0aGUgc2FtZSBoYXNoK2ZpbGVuYW1lIHdlJ2Qgb3V0cHV0LlxuXG4iCisKKyNkZWZpbmUgSEVMUF9tZDVzdW0gInVzYWdlOiBtZDVzdW0gWy1iXSBbLWMgRklMRV0gW0ZJTEVdLi4uXG5cbkNhbGN1bGF0ZSBtZDUgaGFzaCBmb3IgZWFjaCBpbnB1dCBmaWxlLCByZWFkaW5nIGZyb20gc3RkaW4gaWYgbm9uZS5cbk91dHB1dCBvbmUgaGFzaCAoMzIgaGV4IGRpZ2l0cykgZm9yIGVhY2ggaW5wdXQgZmlsZSwgZm9sbG93ZWQgYnkgZmlsZW5hbWUuXG5cbi1iCWJyaWVmIChoYXNoIG9ubHksIG5vIGZpbGVuYW1lKVxuLWMJQ2hlY2sgZWFjaCBsaW5lIG9mIEZJTEUgaXMgdGhlIHNhbWUgaGFzaCtmaWxlbmFtZSB3ZSdkIG91dHB1dC5cblxuIgorCisjZGVmaW5lIEhFTFBfa2lsbGFsbCAidXNhZ2U6IGtpbGxhbGwgWy1sXSBbLWlxdl0gWy1TSUdOQUx8LXMgU0lHTkFMXSBQUk9DRVNTX05BTUUuLi5cblxuU2VuZCBhIHNpZ25hbCAoZGVmYXVsdDogVEVSTSkgdG8gYWxsIHByb2Nlc3NlcyB3aXRoIHRoZSBnaXZlbiBuYW1lcy5cblxuLWkJYXNrIGZvciBjb25maXJtYXRpb24gYmVmb3JlIGtpbGxpbmdcbi1sCXByaW50IGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBzaWduYWxzXG4tcQlkb24ndCBwcmludCBhbnkgd2FybmluZ3Mgb3IgZXJyb3IgbWVzc2FnZXNcbi1zCXNlbmQgU0lHTkFMIGluc3RlYWQgb2YgU0lHVEVSTVxuLXYJcmVwb3J0IGlmIHRoZSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBzZW50XG5cbiIKKworI2RlZmluZSBIRUxQX2hvc3RuYW1lICJ1c2FnZTogaG9zdG5hbWUgWy1iXSBbLUYgRklMRU5BTUVdIFtuZXduYW1lXVxuXG5HZXQvU2V0IHRoZSBjdXJyZW50IGhvc3RuYW1lXG5cbi1iICBTZXQgaG9zdG5hbWUgdG8gJ2xvY2FsaG9zdCcgaWYgb3RoZXJ3aXNlIHVuc2V0XG4tRiAgU2V0IGhvc3RuYW1lIHRvIGNvbnRlbnRzIG9mIEZJTEVOQU1FXG5cbiIKKworI2RlZmluZSBIRUxQX2RtZXNnICJ1c2FnZTogZG1lc2cgWy1jXSBbLXJ8LXRdIFstbiBMRVZFTF0gWy1zIFNJWkVdXG5cblByaW50IG9yIGNvbnRyb2wgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci5cblxuLWMJQ2xlYXIgdGhlIHJpbmcgYnVmZmVyIGFmdGVyIHByaW50aW5nXG4tbglTZXQga2VybmVsIGxvZ2dpbmcgTEVWRUwgKDEtOSlcbi1yCVJhdyBvdXRwdXQgKHdpdGggPGxldmVsIG1hcmtlcnM+KVxuLXMJU2hvdyB0aGUgbGFzdCBTSVpFIG1hbnkgYnl0ZXNcbi10CURvbid0IHByaW50IGtlcm5lbCdzIHRpbWVzdGFtcHNcblxuIgorCisjZGVmaW5lIEhFTFBfcmZraWxsICJVc2FnZTogcmZraWxsIENPTU1BTkQgW0RFVklDRV1cblxuRW5hYmxlL2Rpc2FibGUgd2lyZWxlc3MgZGV2aWNlcy5cblxuQ29tbWFuZHM6XG5saXN0IFtERVZJQ0VdICAgTGlzdCBjdXJyZW50IHN0YXRlXG5ibG9jayBERVZJQ0UgICAgRGlzYWJsZSBkZXZpY2VcbnVuYmxvY2sgREVWSUNFICBFbmFibGUgZGV2aWNlXG5cbkRFVklDRSBpcyBhbiBpbmRleCBudW1iZXIsIG9yIG9uZSBvZjpcbmFsbCwgd2xhbih3aWZpKSwgYmx1ZXRvb3RoLCB1d2IodWx0cmF3aWRlYmFuZCksIHdpbWF4LCB3d2FuLCBncHMsIGZtLlxuXG5cbiIKKworI2RlZmluZSBIRUxQX25ldHN0YXQgInVzYWdlOiBuZXRzdGF0IFstcFdyeHd1dG5lYWxdXG5cbkRpc3BsYXkgbmV0d29ya2luZyBpbmZvcm1hdGlvbi4gRGVmYXVsdCBpcyBuZXRzYXQgLXR1d3hcblxuLXIgIHJvdXRpbmcgdGFibGVcbi1hICBhbGwgc29ja2V0cyAobm90IGp1c3QgY29ubmVjdGVkKVxuLWwgIGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0c1xuLXQgIFRDUCBzb2NrZXRzXG4tdSAgVURQIHNvY2tldHNcbi13ICByYXcgc29ja2V0c1xuLXggIHVuaXggc29ja2V0c1xuLWUgIGV4dGVuZGVkIGluZm9cbi1uICBkb24ndCByZXNvbHZlIG5hbWVzXG4tVyAgd2lkZSBkaXNwbGF5XG4tcCAgUElEL1Byb2dyYW0gbmFtZSBvZiBzb2NrZXRzXG5cbiIKKworI2RlZmluZSBIRUxQX25ldGNhdF9saXN0ZW5fdHR5ICJ1c2FnZTogbmV0Y2F0IFstdF1cblxuLXQJYWxsb2NhdGUgdHR5IChtdXN0IGNvbWUgYmVmb3JlIC1sIG9yIC1MKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9uZXRjYXQgInVzYWdlOiBuZXRjYXQgWy1sTCBDT01NQU5ELi4uXSBbLXVdIFstd3BxICNdIFstcyBhZGRyXSB7SVBBRERSIFBPUlROVU18LWYgRklMRU5BTUV9XG5cbi1MCWxpc3RlbiBmb3IgbXVsdGlwbGUgaW5jb21pbmcgY29ubmVjdGlvbnMgKHNlcnZlciBtb2RlKS5cbi1mCXVzZSBGSUxFTkFNRSAoYWxhIC9kZXYvdHR5UzApIGluc3RlYWQgb2YgbmV0d29ya1xuLWwJbGlzdGVuIGZvciBvbmUgaW5jb21pbmcgY29ubmVjdGlvbi5cbi1wCWxvY2FsIHBvcnQgbnVtYmVyXG4tcQlTRUNPTkRTIHF1aXQgdGhpcyBtYW55IHNlY29uZHMgYWZ0ZXIgRU9GIG9uIHN0ZGluLlxuLXMJbG9jYWwgaXB2NCBhZGRyZXNzXG4tdwlTRUNPTkRTIHRpbWVvdXQgZm9yIGNvbm5lY3Rpb25cblxuVXNlIFwic3R0eSAxMTUyMDAgLUYgL2Rldi90dHlTMCAmJiBzdHR5IHJhdyAtZWNobyAtY3RsZWNob1wiIHdpdGhcbm5ldGNhdCAtZiB0byBjb25uZWN0IHRvIGEgc2VyaWFsIHBvcnQuXG5cblRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgLWwgb3IgLUwgaXMgZXhlY3V0ZWQgdG8gaGFuZGxlIGVhY2ggaW5jb21pbmdcbmNvbm5lY3Rpb24uIElmIG5vbmUsIHRoZSBjb25uZWN0aW9uIGlzIGZvcndhcmRlZCB0byBzdGRpbi9zdGRvdXQuXG5cbkZvciBhIHF1aWNrLWFuZC1kaXJ0eSBzZXJ2ZXIsIHRyeSBzb21ldGhpbmcgbGlrZTpcbm5ldGNhdCAtcyAxMjcuMC4wLjEgLXAgMTIzNCAtdEwgL2Jpbi9iYXNoIC1sXG4iCisKKyNkZWZpbmUgSEVMUF9pZmNvbmZpZyAidXNhZ2U6IGlmY29uZmlnIFstYV0gW0lOVEVSRkFDRSBbQUNUSU9OLi4uXV1cblxuRGlzcGxheSBvciBjb25maWd1cmUgbmV0d29yayBpbnRlcmZhY2UuXG5cbldpdGggbm8gYXJndW1lbnRzLCBkaXNwbGF5IGFjdGl2ZSBpbnRlcmZhY2VzLiBGaXJzdCBhcmd1bWVudCBpcyBpbnRlcmZhY2VcbnRvIG9wZXJhdGUgb24sIG9uZSBhcmd1bWVudCBieSBpdHNlbGYgZGlzcGxheXMgdGhhdCBpbnRlcmZhY2UuXG5cbi1hCVNob3cgYWxsIGludGVyZmFjZXMsIG5vdCBqdXN0IGFjdGl2ZSBvbmVzXG5cbkFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIGludGVyZmFjZTpcblxuQUREUkVTU1svTkVUTUFTS10gLSBzZXQgSVB2NCBhZGRyZXNzICgxLjIuMy40LzUpXG5kZWZhdWx0IC0gdW5zZXQgaXB2NCBhZGRyZXNzXG5hZGR8ZGVsIEFERFJFU1NbL1BSRUZJWExFTl0gLSBhZGQvcmVtb3ZlIElQdjYgYWRkcmVzcyAoMTExMTo6ODg4OC8xMjgpXG51cCAtIGVuYWJsZSBpbnRlcmZhY2VcbmRvd24gLSBkaXNhYmxlIGludGVyZmFjZVxuXG5uZXRtYXNrfGJyb2FkY2FzdHxwb2ludG9wb2ludCBBRERSRVNTIC0gc2V0IG1vcmUgSVB2NCBjaGFyYWN0ZXJpc3RpY3Ncbmh3IGV0aGVyfGluZmluaWJhbmQgQUREUkVTUyAtIHNldCBMQU4gaGFyZHdhcmUgYWRkcmVzcyAoQUE6QkI6Q0MuLi4pXG50eHF1ZXVlbGVuIExFTiAtIG51bWJlciBvZiBidWZmZXJlZCBwYWNrZXRzIGJlZm9yZSBvdXRwdXQgYmxvY2tzXG5tdHUgTEVOIC0gc2l6ZSBvZiBvdXRnb2luZyBwYWNrZXRzIChNYXhpbXVtIFRyYW5zbWlzc2lvbiBVbml0KVxuXG5GbGFncyB5b3UgY2FuIHNldCBvbiBhbiBpbnRlcmZhY2UgKG9yIC1yZW1vdmUgYnkgcHJlZml4aW5nIHdpdGggLSk6XG5hcnAgLSBkb24ndCB1c2UgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIHRvIG1hcCBMQU4gcm91dGVzXG5wcm9taXNjIC0gZG9uJ3QgZGlzY2FyZCBwYWNrZXRzIHRoYXQgYXJlbid0IHRvIHRoaXMgTEFOIGhhcmR3YXJlIGFkZHJlc3Ncbm11bHRpY2FzdCAtIGZvcmNlIGludGVyZmFjZSBpbnRvIG11bHRpY2FzdCBtb2RlIGlmIHRoZSBkcml2ZXIgZG9lc24ndFxuYWxsbXVsdGkgLSBwcm9taXNjIGZvciBtdWx0aWNhc3QgcGFja2V0c1xuXG5PYnNvbGV0ZSBmaWVsZHMgaW5jbHVkZWQgZm9yIGhpc3RvcmljYWwgcHVycG9zZXM6XG5pcnF8aW9fYWRkcnxtZW1fc3RhcnQgQUREUiAtIG1pY3JvbWFuYWdlIG9ic29sZXRlIGhhcmR3YXJlXG5vdXRmaWxsfGtlZXBhbGl2ZSBJTlRFR0VSIC0gU0xJUCBhbmFsb2cgZGlhbHVwIGxpbmUgcXVhbGl0eSBtb25pdG9yaW5nXG5tZXRyaWMgSU5URUdFUiAtIGFkZGVkIHRvIExpbnV4IDAuOS4xMCB3aXRoIGNvbW1lbnQgXCJuZXZlciB1c2VkXCIsIHN0aWxsIHRydWVcblxuIgorCisjZGVmaW5lIEhFTFBfeWVzICJ1c2FnZTogeWVzIFthcmdzLi4uXVxuXG5SZXBlYXRlZGx5IG91dHB1dCBsaW5lIHVudGlsIGtpbGxlZC4gSWYgbm8gYXJncywgb3V0cHV0ICd5Jy5cblxuXG4iCisKKyNkZWZpbmUgSEVMUF94eGQgInVzYWdlOiB4eGQgWy1jIG5dIFstZyBuXSBbLWwgbl0gWy1wXSBbLXJdIFstcyBuXSBbZmlsZV1cblxuSGV4ZHVtcCBhIGZpbGUgdG8gc3Rkb3V0LiAgSWYgbm8gZmlsZSBpcyBsaXN0ZWQsIGNvcHkgZnJvbSBzdGRpbi5cbkZpbGVuYW1lIFwiLVwiIGlzIGEgc3lub255bSBmb3Igc3RkaW4uXG5cbi1jIG4JU2hvdyBuIGJ5dGVzIHBlciBsaW5lIChkZWZhdWx0IDE2KS5cbi1nIG4JR3JvdXAgYnl0ZXMgYnkgYWRkaW5nIGEgJyAnIGV2ZXJ5IG4gYnl0ZXMgKGRlZmF1bHQgMikuXG4tbCBuCUxpbWl0IG9mIG4gYnl0ZXMgYmVmb3JlIHN0b3BwaW5nIChkZWZhdWx0IGlzIG5vIGxpbWl0KS5cbi1wCVBsYWluIGhleGR1bXAgKDMwIGJ5dGVzL2xpbmUsIG5vIGdyb3VwaW5nKS5cbi1yCVJldmVyc2Ugb3BlcmF0aW9uOiB0dXJuIGEgaGV4ZHVtcCBpbnRvIGEgYmluYXJ5IGZpbGUuXG4tcyBuCVNraXAgdG8gb2Zmc2V0IG4uXG5cbiIKKworI2RlZmluZSBIRUxQX3doaWNoICJ1c2FnZTogd2hpY2ggWy1hXSBmaWxlbmFtZSAuLi5cblxuU2VhcmNoICRQQVRIIGZvciBleGVjdXRhYmxlIGZpbGVzIG1hdGNoaW5nIGZpbGVuYW1lKHMpLlxuXG4tYQlTaG93IGFsbCBtYXRjaGVzXG5cbiIKKworI2RlZmluZSBIRUxQX3cgInVzYWdlOiB3XG5cblNob3cgd2hvIGlzIGxvZ2dlZCBvbiBhbmQgc2luY2UgaG93IGxvbmcgdGhleSBsb2dnZWQgaW4uXG5cbiIKKworI2RlZmluZSBIRUxQX3Ztc3RhdCAidXNhZ2U6IHZtc3RhdCBbLW5dIFtERUxBWSBbQ09VTlRdXVxuXG5QcmludCB2aXJ0dWFsIG1lbW9yeSBzdGF0aXN0aWNzLCByZXBlYXRpbmcgZWFjaCBERUxBWSBzZWNvbmRzLCBDT1VOVCB0aW1lcy5cbihXaXRoIG5vIERFTEFZLCBwcmludHMgb25lIGxpbmUuIFdpdGggbm8gQ09VTlQsIHJlcGVhdHMgdW50aWwga2lsbGVkLilcblxuU2hvdyBwcm9jZXNzZXMgcnVubmluZyBhbmQgYmxvY2tlZCwga2lsb2J5dGVzIHN3YXBwZWQsIGZyZWUsIGJ1ZmZlcmVkLCBhbmRcbmNhY2hlZCwga2lsb2J5dGVzIHN3YXBwZWQgaW4gYW5kIG91dCBwZXIgc2Vjb25kLCBmaWxlIGRpc2sgYmxvY2tzIGlucHV0IGFuZFxub3V0cHV0IHBlciBzZWNvbmQsIGludGVycnVwdHMgYW5kIGNvbnRleHQgc3dpdGNoZXMgcGVyIHNlY29uZCwgcGVyY2VudFxub2YgQ1BVIHRpbWUgc3BlbnQgcnVubmluZyB1c2VyIGNvZGUsIHN5c3RlbSBjb2RlLCBpZGxlLCBhbmQgYXdhaXRpbmcgSS9PLlxuRmlyc3QgbGluZSBpcyBzaW5jZSBzeXN0ZW0gc3RhcnRlZCwgbGF0ZXIgbGluZXMgYXJlIHNpbmNlIGxhc3QgbGluZS5cblxuLW4JRGlzcGxheSB0aGUgaGVhZGVyIG9ubHkgb25jZVxuXG4iCisKKyNkZWZpbmUgSEVMUF92Y29uZmlnICJ1c2FnZTogdmNvbmZpZyBDT01NQU5EIFtPUFRJT05TXVxuXG5DcmVhdGUgYW5kIHJlbW92ZSB2aXJ0dWFsIGV0aGVybmV0IGRldmljZXNcblxuYWRkICAgICAgICAgICAgIFtpbnRlcmZhY2UtbmFtZV0gW3ZsYW5faWRdXG5yZW0gICAgICAgICAgICAgW3ZsYW4tbmFtZV1cbnNldF9mbGFnICAgICAgICBbaW50ZXJmYWNlLW5hbWVdIFtmbGFnLW51bV0gICAgICAgWzAgfCAxXVxuc2V0X2VncmVzc19tYXAgIFt2bGFuLW5hbWVdICAgICAgW3NrYl9wcmlvcml0eV0gICBbdmxhbl9xb3NdXG5zZXRfaW5ncmVzc19tYXAgW3ZsYW4tbmFtZV0gICAgICBbc2tiX3ByaW9yaXR5XSAgIFt2bGFuX3Fvc11cbnNldF9uYW1lX3R5cGUgICBbbmFtZS10eXBlXVxuXG4iCisKKyNkZWZpbmUgSEVMUF91c2xlZXAgInVzYWdlOiB1c2xlZXAgTUlDUk9TRUNPTkRTXG5cblBhdXNlIGZvciBNSUNST1NFQ09ORFMgbWljcm9zZWNvbmRzLlxuXG4iCisKKyNkZWZpbmUgSEVMUF91cHRpbWUgInVzYWdlOiB1cHRpbWVcblxuVGVsbCBob3cgbG9uZyB0aGUgc3lzdGVtIGhhcyBiZWVuIHJ1bm5pbmcgYW5kIHRoZSBzeXN0ZW0gbG9hZFxuYXZlcmFnZXMgZm9yIHRoZSBwYXN0IDEsIDUgYW5kIDE1IG1pbnV0ZXMuXG5cbiIKKworI2RlZmluZSBIRUxQX3RydW5jYXRlICJ1c2FnZTogdHJ1bmNhdGUgWy1jXSAtcyBTSVpFIGZpbGUuLi5cblxuU2V0IGxlbmd0aCBvZiBmaWxlKHMpLCBleHRlbmRpbmcgc3BhcnNlbHkgaWYgbmVjZXNzYXJ5LlxuXG4tYwlEb24ndCBjcmVhdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuLXMJTmV3IHNpemUgKHdpdGggb3B0aW9uYWwgcHJlZml4IGFuZCBzdWZmaXgpXG5cblNJWkUgcHJlZml4OiArIGFkZCwgLSBzdWJ0cmFjdCwgPCBzaHJpbmsgdG8sID4gZXhwYW5kIHRvLFxuICAgICAgICAgICAgIC8gbXVsdGlwbGUgcm91bmRpbmcgZG93biwgJSBtdWx0aXBsZSByb3VuZGluZyB1cFxuU0laRSBzdWZmaXg6IGs9MTAyNCwgbT0xMDI0XjIsIGc9MTAyNF4zLCB0PTEwMjReNCwgcD0xMDI0XjUsIGU9MTAyNF42XG5cbiIKKworI2RlZmluZSBIRUxQX3RpbWVvdXQgInVzYWdlOiB0aW1lb3V0IFstayBMRU5HVEhdIFstcyBTSUdOQUxdIExFTkdUSCBDT01NQU5ELi4uXG5cblJ1biBjb21tYW5kIGxpbmUgYXMgYSBjaGlsZCBwcm9jZXNzLCBzZW5kaW5nIGNoaWxkIGEgc2lnbmFsIGlmIHRoZVxuY29tbWFuZCBkb2Vzbid0IGV4aXQgc29vbiBlbm91Z2guXG5cbkxlbmd0aCBjYW4gYmUgYSBkZWNpbWFsIGZyYWN0aW9uLiBBbiBvcHRpb25hbCBzdWZmaXggY2FuIGJlIFwibVwiXG4obWludXRlcyksIFwiaFwiIChob3VycyksIFwiZFwiIChkYXlzKSwgb3IgXCJzXCIgKHNlY29uZHMsIHRoZSBkZWZhdWx0KS5cblxuLXMJU2VuZCBzcGVjaWZpZWQgc2lnbmFsIChkZWZhdWx0IFRFUk0pXG4tawlTZW5kIEtJTEwgc2lnbmFsIGlmIGNoaWxkIHN0aWxsIHJ1bm5pbmcgdGhpcyBsb25nIGFmdGVyIGZpcnN0IHNpZ25hbC5cbi12CVZlcmJvc2VcblxuIgorCisjZGVmaW5lIEhFTFBfdGFza3NldCAidXNhZ2U6IHRhc2tzZXQgWy1hcF0gW21hc2tdIFtQSUQgfCBjbWQgW2FyZ3MuLi5dXVxuXG5MYXVuY2ggYSBuZXcgdGFzayB3aGljaCBtYXkgb25seSBydW4gb24gY2VydGFpbiBwcm9jZXNzb3JzLCBvciBjaGFuZ2VcbnRoZSBwcm9jZXNzb3IgYWZmaW5pdHkgb2YgYW4gZXhpc2l0bmcgUElELlxuXG5NYXNrIGlzIGEgaGV4IHN0cmluZyB3aGVyZSBlYWNoIGJpdCByZXByZXNlbnRzIGEgcHJvY2Vzc29yIHRoZSBwcm9jZXNzXG5pcyBhbGxvd2VkIHRvIHJ1biBvbi4gUElEIHdpdGhvdXQgYSBtYXNrIGRpc3BsYXlzIGV4aXN0aW5nIGFmZmluaXR5LlxuXG4tcAlTZXQvZ2V0IHRoZSBhZmZpbml0eSBvZiBnaXZlbiBQSUQgaW5zdGVhZCBvZiBhIG5ldyBjb21tYW5kLlxuLWEJU2V0L2dldCB0aGUgYWZmaW5pdHkgb2YgYWxsIHRocmVhZHMgb2YgdGhlIFBJRC5cblxuIgorCisjZGVmaW5lIEhFTFBfbnByb2MgInVzYWdlOiBucHJvYyBbLS1hbGxdXG5cblByaW50IG51bWJlciBvZiBwcm9jZXNzb3JzLlxuXG4tLWFsbAlTaG93IGFsbCBwcm9jZXNzb3JzLCBub3QganVzdCBvbmVzIHRoaXMgdGFzayBjYW4gcnVuIG9uLlxuXG4iCisKKyNkZWZpbmUgSEVMUF90YWMgInVzYWdlOiB0YWMgW0ZJTEUuLi5dXG5cbk91dHB1dCBsaW5lcyBpbiByZXZlcnNlIG9yZGVyLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9zeXNjdGwgInVzYWdlOiBzeXNjdGwgWy1hQWVObnF3XSBbLXAgW0ZJTEVdIHwgS0VZWz1WQUxVRV0uLi5dXG5cblJlYWQvd3JpdGUgc3lzdGVtIGNvbnRyb2wgZGF0YSAodW5kZXIgL3Byb2Mvc3lzKS5cblxuLWEsQQlTaG93IGFsbCB2YWx1ZXNcbi1lCURvbid0IHdhcm4gYWJvdXQgdW5rbm93biBrZXlzXG4tTglEb24ndCBwcmludCBrZXkgdmFsdWVzXG4tbglEb24ndCBwcmludCBrZXkgbmFtZXNcbi1wCVJlYWQgdmFsdWVzIGZyb20gRklMRSAoZGVmYXVsdCAvZXRjL3N5c2N0bC5jb25mKVxuLXEJRG9uJ3Qgc2hvdyB2YWx1ZSBhZnRlciB3cml0ZVxuLXcJT25seSB3cml0ZSB2YWx1ZXMgKG9iamVjdCB0byByZWFkaW5nKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9zd2l0Y2hfcm9vdCAidXNhZ2U6IHN3aXRjaF9yb290IFstYyAvZGV2L2NvbnNvbGVdIE5FV19ST09UIE5FV19JTklULi4uXG5cblVzZSBmcm9tIFBJRCAxIHVuZGVyIGluaXRyYW1mcyB0byBmcmVlIGluaXRyYW1mcywgY2hyb290IHRvIE5FV19ST09ULFxuYW5kIGV4ZWMgTkVXX0lOSVQuXG5cbi1jCVJlZGlyZWN0IGNvbnNvbGUgdG8gZGV2aWNlIGluIE5FV19ST09UXG4taAlIYW5nIGluc3RlYWQgb2YgZXhpdGluZyBvbiBmYWlsdXJlIChhdm9pZHMga2VybmVsIHBhbmljKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9zd2Fwb24gInVzYWdlOiBzd2Fwb24gWy1kXSBbLXAgcHJpb3JpdHldIGZpbGVuYW1lXG5cbkVuYWJsZSBzd2FwcGluZyBvbiBhIGdpdmVuIGRldmljZS9maWxlLlxuXG4tZAlEaXNjYXJkIGZyZWVkIFNTRCBwYWdlc1xuXG4iCisKKyNkZWZpbmUgSEVMUF9zd2Fwb2ZmICJ1c2FnZTogc3dhcG9mZiBzd2FwcmVnaW9uXG5cbkRpc2FibGUgc3dhcHBpbmcgb24gYSBnaXZlbiBzd2FwcmVnaW9uLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9zdGF0ICJ1c2FnZTogc3RhdCBbLXRmTF0gWy1jIEZPUk1BVF0gRklMRS4uLlxuXG5EaXNwbGF5IHN0YXR1cyBvZiBmaWxlcyBvciBmaWxlc3lzdGVtcy5cblxuLWMJT3V0cHV0IHNwZWNpZmllZCBGT1JNQVQgc3RyaW5nIGluc3RlYWQgb2YgZGVmYXVsdFxuLWYJZGlzcGxheSBmaWxlc3lzdGVtIHN0YXR1cyBpbnN0ZWFkIG9mIGZpbGUgc3RhdHVzXG4tTAlGb2xsb3cgc3ltbGlua3Ncbi10CXRlcnNlICgtYyBcIiVuICVzICViICVmICV1ICVnICVEICVpICVoICV0ICVUICVYICVZICVaICVvXCIpXG4JICAgICAgKHdpdGggLWYgPSAtYyBcIiVuICVpICVsICV0ICVzICVTICViICVmICVhICVjICVkXCIpXG5cblRoZSB2YWxpZCBmb3JtYXQgZXNjYXBlIHNlcXVlbmNlcyBmb3IgZmlsZXM6XG4lYSAgQWNjZXNzIGJpdHMgKG9jdGFsKSB8JUEgIEFjY2VzcyBiaXRzIChmbGFncyl8JWIgIFNpemUvNTEyXG4lQiAgQnl0ZXMgcGVyICViICg1MTIpICB8JWQgIERldmljZSBJRCAoZGVjKSAgICB8JUQgIERldmljZSBJRCAoaGV4KVxuJWYgIEFsbCBtb2RlIGJpdHMgKGhleCkgfCVGICBGaWxlIHR5cGUgICAgICAgICAgfCVnICBHcm91cCBJRFxuJUcgIEdyb3VwIG5hbWUgICAgICAgICAgfCVoICBIYXJkIGxpbmtzICAgICAgICAgfCVpICBJbm9kZVxuJW0gIE1vdW50IHBvaW50ICAgICAgICAgfCVuICBGaWxlbmFtZSAgICAgICAgICAgfCVOICBMb25nIGZpbGVuYW1lXG4lbyAgSS9PIGJsb2NrIHNpemUgICAgICB8JXMgIFNpemUgKGJ5dGVzKSAgICAgICB8JXQgIERldnR5cGUgbWFqb3IgKGhleClcbiVUICBEZXZ0eXBlIG1pbm9yIChoZXgpIHwldSAgVXNlciBJRCAgICAgICAgICAgIHwlVSAgVXNlciBuYW1lXG4leCAgQWNjZXNzIHRpbWUgICAgICAgICB8JVggIEFjY2VzcyB1bml4IHRpbWUgICB8JXkgIEZpbGUgd3JpdGUgdGltZVxuJVkgIEZpbGUgd3JpdGUgdW5peCB0aW1lfCV6ICBEaXIgY2hhbmdlIHRpbWUgICAgfCVaICBEaXIgY2hhbmdlIHVuaXggdGltZVxuXG5UaGUgdmFsaWQgZm9ybWF0IGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGZpbGVzeXN0ZW1zOlxuJWEgIEF2YWlsYWJsZSBibG9ja3MgICAgfCViICBUb3RhbCBibG9ja3MgICAgICAgfCVjICBUb3RhbCBpbm9kZXNcbiVkICBGcmVlIGlub2RlcyAgICAgICAgIHwlZiAgRnJlZSBibG9ja3MgICAgICAgIHwlaSAgRmlsZSBzeXN0ZW0gSURcbiVsICBNYXggZmlsZW5hbWUgbGVuZ3RoIHwlbiAgRmlsZSBuYW1lICAgICAgICAgIHwlcyAgRnJhZ21lbnQgc2l6ZVxuJVMgIEJlc3QgdHJhbnNmZXIgc2l6ZSAgfCV0ICBGUyB0eXBlIChoZXgpICAgICAgfCVUICBGUyB0eXBlIChkcml2ZXIgbmFtZSlcblxuIgorCisjZGVmaW5lIEhFTFBfc2hyZWQgInVzYWdlOiBzaHJlZCBbLWZ1el0gWy1uIENPVU5UXSBbLXMgU0laRV0gRklMRS4uLlxuXG5TZWN1cmVseSBkZWxldGUgYSBmaWxlIGJ5IG92ZXJ3cml0aW5nIGl0cyBjb250ZW50cyB3aXRoIHJhbmRvbSBkYXRhLlxuXG4tZiAgICAgICAgRm9yY2UgKGNobW9kIGlmIG5lY2Vzc2FyeSlcbi1uIENPVU5UICBSYW5kb20gb3ZlcndyaXRlIGl0ZXJhdGlvbnMgKGRlZmF1bHQgMSlcbi1vIE9GRlNFVCBTdGFydCBhdCBPRkZTRVRcbi1zIFNJWkUgICBVc2UgU0laRSBpbnN0ZWFkIG9mIGRldGVjdGluZyBmaWxlIHNpemVcbi11ICAgICAgICB1bmxpbmsgKGFjdHVhbGx5IGRlbGV0ZSBmaWxlIHdoZW4gZG9uZSlcbi14ICAgICAgICBVc2UgZXhhY3Qgc2l6ZSAoZGVmYXVsdCB3aXRob3V0IC1zIHJvdW5kcyB1cCB0byBuZXh0IDRrKVxuLXogICAgICAgIHplcm8gYXQgZW5kXG5cbk5vdGU6IGRhdGEgam91cm5hbGluZyBmaWxlc3lzdGVtcyByZW5kZXIgdGhpcyBjb21tYW5kIHVzZWxlc3MsIHlvdSBtdXN0XG5vdmVyd3JpdGUgYWxsIGZyZWUgc3BhY2UgKGZpbGwgdXAgZGlzaykgdG8gZXJhc2Ugb2xkIGRhdGEgb24gdGhvc2UuXG5cbiIKKworI2RlZmluZSBIRUxQX3NldHNpZCAidXNhZ2U6IHNldHNpZCBbLXRdIGNvbW1hbmQgW2FyZ3MuLi5dXG5cblJ1biBwcm9jZXNzIGluIGEgbmV3IHNlc3Npb24uXG5cbi10CUdyYWIgdHR5IChiZWNvbWUgZm9yZWdyb3VuZCBwcm9jZXNzLCByZWNlaXZpbmcga2V5Ym9hcmQgc2lnbmFscylcblxuIgorCisjZGVmaW5lIEhFTFBfc2V0ZmF0dHIgInVzYWdlOiBzZXRmYXR0ciBbLWhdIFsteHwtbiBOQU1FXSBbLXYgVkFMVUVdIEZJTEUuLi5cblxuV3JpdGUgUE9TSVggZXh0ZW5kZWQgYXR0cmlidXRlcy5cblxuLWgJRG8gbm90IGRlcmVmZXJlbmNlIHN5bWxpbmsuXG4tbglTZXQgZ2l2ZW4gYXR0cmlidXRlLlxuLXgJUmVtb3ZlIGdpdmVuIGF0dHJpYnV0ZS5cbi12CVNldCB2YWx1ZSBmb3IgYXR0cmlidXRlIC1uIChkZWZhdWx0IGlzIGVtcHR5KS5cblxuIgorCisjZGVmaW5lIEhFTFBfcm1tb2QgInVzYWdlOiBybW1vZCBbLXdmXSBbTU9EVUxFXVxuXG5VbmxvYWQgdGhlIG1vZHVsZSBuYW1lZCBNT0RVTEUgZnJvbSB0aGUgTGludXgga2VybmVsLlxuLWYJRm9yY2UgdW5sb2FkIG9mIGEgbW9kdWxlXG4tdwlXYWl0IHVudGlsIHRoZSBtb2R1bGUgaXMgbm8gbG9uZ2VyIHVzZWQuXG5cblxuIgorCisjZGVmaW5lIEhFTFBfcmV2ICJ1c2FnZTogcmV2IFtGSUxFLi4uXVxuXG5PdXRwdXQgZWFjaCBsaW5lIHJldmVyc2VkLCB3aGVuIG5vIGZpbGVzIGFyZSBnaXZlbiBzdGRpbiBpcyB1c2VkLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9yZXNldCAidXNhZ2U6IHJlc2V0XG5cbnJlc2V0IHRoZSB0ZXJtaW5hbFxuXG4iCisKKyNkZWZpbmUgSEVMUF9yZWJvb3QgInVzYWdlOiByZWJvb3QvaGFsdC9wb3dlcm9mZiBbLWZuXVxuXG5SZXN0YXJ0LCBoYWx0IG9yIHBvd2VyZG93biB0aGUgc3lzdGVtLlxuXG4tZglEb24ndCBzaWduYWwgaW5pdFxuLW4JRG9uJ3Qgc3luYyBiZWZvcmUgc3RvcHBpbmcgdGhlIHN5c3RlbS5cblxuIgorCisjZGVmaW5lIEhFTFBfcmVhbHBhdGggInVzYWdlOiByZWFscGF0aCBGSUxFLi4uXG5cbkRpc3BsYXkgdGhlIGNhbm9uaWNhbCBhYnNvbHV0ZSBwYXRobmFtZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9yZWFkbGluayAidXNhZ2U6IHJlYWRsaW5rIEZJTEVcblxuV2l0aCBubyBvcHRpb25zLCBzaG93IHdoYXQgc3ltbGluayBwb2ludHMgdG8sIHJldHVybiBlcnJvciBpZiBub3Qgc3ltbGluay5cblxuT3B0aW9ucyBmb3IgcHJvZHVjaW5nIGNhbm5vbmljYWwgcGF0aHMgKGFsbCBzeW1saW5rcy8uLy4uIHJlc29sdmVkKTpcblxuLWUJY2Fubm9uaWNhbCBwYXRoIHRvIGV4aXN0aW5nIGVudHJ5IChmYWlsIGlmIG1pc3NpbmcpXG4tZglmdWxsIHBhdGggKGZhaWwgaWYgZGlyZWN0b3J5IG1pc3NpbmcpXG4tbglubyB0cmFpbGluZyBuZXdsaW5lXG4tcQlxdWlldCAobm8gb3V0cHV0LCBqdXN0IGVycm9yIGNvZGUpXG5cbiIKKworI2RlZmluZSBIRUxQX3JlYWRhaGVhZCAidXNhZ2U6IHJlYWRhaGVhZCBGSUxFLi4uXG5cblByZWxvYWQgZmlsZXMgaW50byBkaXNrIGNhY2hlLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9wd2R4ICJ1c2FnZTogcHdkeCBQSUQuLi5cblxuUHJpbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgcHJvY2Vzc2VzIGxpc3RlZCBvbiBjb21tYW5kIGxpbmUuXG5cbiIKKworI2RlZmluZSBIRUxQX3ByaW50ZW52ICJ1c2FnZTogcHJpbnRlbnYgWy0wXSBbZW52X3Zhci4uLl1cblxuUHJpbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuXG4tMAlVc2UgXFwwIGFzIGRlbGltaXRlciBpbnN0ZWFkIG9mIFxcblxuXG4iCisKKyNkZWZpbmUgSEVMUF9wbWFwICJ1c2FnZTogcG1hcCBbLXhxXSBbcGlkcy4uLl1cblxuUmVwb3J0cyB0aGUgbWVtb3J5IG1hcCBvZiBhIHByb2Nlc3Mgb3IgcHJvY2Vzc2VzLlxuXG4teCBTaG93IHRoZSBleHRlbmRlZCBmb3JtYXQuXG4tcSBEbyBub3QgZGlzcGxheSBzb21lIGhlYWRlci9mb290ZXIgbGluZXMuXG5cbiIKKworI2RlZmluZSBIRUxQX3Bpdm90X3Jvb3QgInVzYWdlOiBwaXZvdF9yb290IE9MRCBORVdcblxuU3dhcCBPTEQgYW5kIE5FVyBmaWxlc3lzdGVtcyAoYXMgaWYgYnkgc2ltdWx0YW5lb3VzIG1vdW50IC0tbW92ZSksIGFuZFxubW92ZSBhbGwgcHJvY2Vzc2VzIHdpdGggY2hkaXIgb3IgY2hyb290IHVuZGVyIE9MRCBpbnRvIE5FVyAoaW5jbHVkaW5nXG5rZXJuZWwgdGhyZWFkcykgc28gT0xEIG1heSBiZSB1bm1vdW50ZWQuXG5cblRoZSBkaXJlY3RvcnkgTkVXIG11c3QgZXhpc3QgdW5kZXIgT0xELiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpbml0cmFtZnMsXG53aGljaCBjYW4ndCBiZSBtb3ZlZCAoYWJvdXQgdGhlIHNhbWUgd2F5IFBJRCAxIGNhbid0IGJlIGtpbGxlZDsgc2VlXG5zd2l0Y2hfcm9vdCBpbnN0ZWFkKS5cblxuIgorCisjZGVmaW5lIEhFTFBfcGFydHByb2JlICJ1c2FnZTogcGFydHByb2JlIERFVklDRS4uLlxuXG5UZWxsIHRoZSBrZXJuZWwgYWJvdXQgcGFydGl0aW9uIHRhYmxlIGNoYW5nZXNcblxuQXNrIHRoZSBrZXJuZWwgdG8gcmUtcmVhZCB0aGUgcGFydGl0aW9uIHRhYmxlIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfb25laXQgInVzYWdlOiBvbmVpdCBbLXBdIFstYyAvZGV2L3R0eTBdIGNvbW1hbmQgWy4uLl1cblxuU2ltcGxlIGluaXQgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzaW5nbGUgc3VwcGxpZWQgY29tbWFuZCBsaW5lIHdpdGggYVxuY29udHJvbGxpbmcgdHR5IChzbyBDVFJMLUMgY2FuIGtpbGwgaXQpLlxuXG4tYwlXaGljaCBjb25zb2xlIGRldmljZSB0byB1c2UgKC9kZXYvY29uc29sZSBkb2Vzbid0IGRvIENUUkwtQywgZXRjKS5cbi1wCVBvd2VyIG9mZiBpbnN0ZWFkIG9mIHJlYm9vdGluZyB3aGVuIGNvbW1hbmQgZXhpdHMuXG4tcglSZXN0YXJ0IGNoaWxkIHdoZW4gaXQgZXhpdHMuXG4tMwlXcml0ZSAzMiBiaXQgUElEIG9mIGVhY2ggZXhpdGluZyByZXBhcmVudGVkIHByb2Nlc3MgdG8gZmQgMyBvZiBjaGlsZC5cbgkoQmxvY2tpbmcgd3JpdGVzLCBjaGlsZCBtdXN0IHJlYWQgdG8gYXZvaWQgZXZlbnR1YWwgZGVhZGxvY2suKVxuXG5TcGF3bnMgYSBzaW5nbGUgY2hpbGQgcHJvY2VzcyAoYmVjYXVzZSBQSUQgMSBoYXMgc2lnbmFscyBibG9ja2VkKVxuaW4gaXRzIG93biBzZXNzaW9uLCByZWFwcyB6b21iaWVzIHVudGlsIHRoZSBjaGlsZCBleGl0cywgdGhlblxucmVib290cyB0aGUgc3lzdGVtIChvciBwb3dlcnMgb2ZmIHdpdGggLXAsIG9yIHJlc3RhcnRzIHRoZSBjaGlsZCB3aXRoIC1yKS5cblxuUmVzcG9uZHMgdG8gU0lHVVNSMSBieSBoYWx0aW5nIHRoZSBzeXN0ZW0sIFNJR1VTUjIgYnkgcG93ZXJpbmcgb2ZmLFxuYW5kIFNJR1RFUk0gb3IgU0lHSU5UIHJlYm9vdC5cblxuIgorCisjZGVmaW5lIEhFTFBfbnNlbnRlciAidXNhZ2U6IG5zZW50ZXIgWy10IHBpZF0gWy1GXSBbLWldIFstbV0gWy1uXSBbLXBdIFstdV0gWy1VXSBDT01NQU5ELi4uXG5cblJ1biBDT01NQU5EIGluIGFuIGV4aXN0aW5nIChzZXQgb2YpIG5hbWVzcGFjZShzKS5cblxuLXQgIFBJRCB0byB0YWtlIG5hbWVzcGFjZXMgZnJvbSAgICAoLS10YXJnZXQpXG4tRiAgZG9uJ3QgZm9yaywgZXZlbiBpZiAtcCBpcyB1c2VkICgtLW5vLWZvcmspXG5cblRoZSBuYW1lc3BhY2VzIHRvIHN3aXRjaCBhcmU6XG5cbi1pCVN5c1YgSVBDOiBtZXNzYWdlIHF1ZXVlcywgc2VtYXBob3Jlcywgc2hhcmVkIG1lbW9yeSAoLS1pcGMpXG4tbQlNb3VudC91bm1vdW50IHRyZWUgKC0tbW91bnQpXG4tbglOZXR3b3JrIGFkZHJlc3MsIHNvY2tldHMsIHJvdXRpbmcsIGlwdGFibGVzICgtLW5ldClcbi1wCVByb2Nlc3MgSURzIGFuZCBpbml0LCB3aWxsIGZvcmsgdW5sZXNzIC1GIGlzIHVzZWQgKC0tcGlkKVxuLXUJSG9zdCBhbmQgZG9tYWluIG5hbWVzICgtLXV0cylcbi1VCVVJRHMsIEdJRHMsIGNhcGFiaWxpdGllcyAoLS11c2VyKVxuXG5JZiAtdCBpc24ndCBzcGVjaWZpZWQsIGVhY2ggbmFtZXNwYWNlIGFyZ3VtZW50IG11c3QgcHJvdmlkZSBhIHBhdGhcbnRvIGEgbmFtZXNwYWNlIGZpbGUsIGFsYSBcIi1pPS9wcm9jLyRQSUQvbnMvaXBjXCJcblxuIgorCisjZGVmaW5lIEhFTFBfdW5zaGFyZSAidXNhZ2U6IHVuc2hhcmUgWy1pbW5wdVVyXSBDT01NQU5ELi4uXG5cbkNyZWF0ZSBuZXcgY29udGFpbmVyIG5hbWVzcGFjZShzKSBmb3IgdGhpcyBwcm9jZXNzIGFuZCBpdHMgY2hpbGRyZW4sIHNvXG5zb21lIGF0dHJpYnV0ZSBpcyBub3Qgc2hhcmVkIHdpdGggdGhlIHBhcmVudCBwcm9jZXNzLlxuXG4tZiAgRm9yayBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kICgtLWZvcmspXG4taQlTeXNWIElQQyAobWVzc2FnZSBxdWV1ZXMsIHNlbWFwaG9yZXMsIHNoYXJlZCBtZW1vcnkpICgtLWlwYylcbi1tCU1vdW50L3VubW91bnQgdHJlZSAoLS1tb3VudClcbi1uCU5ldHdvcmsgYWRkcmVzcywgc29ja2V0cywgcm91dGluZywgaXB0YWJsZXMgKC0tbmV0KVxuLXAJUHJvY2VzcyBJRHMgYW5kIGluaXQgKC0tcGlkKVxuLXIJQmVjb21lIHJvb3QgKG1hcCBjdXJyZW50IGV1aWQvZWdpZCB0byAwLzAsIGltcGxpZXMgLVUpICgtLW1hcC1yb290LXVzZXIpXG4tdQlIb3N0IGFuZCBkb21haW4gbmFtZXMgKC0tdXRzKVxuLVUJVUlEcywgR0lEcywgY2FwYWJpbGl0aWVzICgtLXVzZXIpXG5cbkEgbmFtZXNwYWNlIGFsbG93cyBhIHNldCBvZiBwcm9jZXNzZXMgdG8gaGF2ZSBhIGRpZmZlcmVudCB2aWV3IG9mIHRoZVxuc3lzdGVtIHRoYW4gb3RoZXIgc2V0cyBvZiBwcm9jZXNzZXMuXG5cbiIKKworI2RlZmluZSBIRUxQX25iZF9jbGllbnQgInVzYWdlOiBuYmQtY2xpZW50IFstbnNdIEhPU1QgUE9SVCBERVZJQ0VcblxuLW4JRG8gbm90IGZvcmsgaW50byBiYWNrZ3JvdW5kXG4tcwluYmQgc3dhcCBzdXBwb3J0IChsb2NrIHNlcnZlciBpbnRvIG1lbW9yeSlcblxuIgorCisjZGVmaW5lIEhFTFBfbW91bnRwb2ludCAidXNhZ2U6IG1vdW50cG9pbnQgWy1xXSBbLWRdIGRpcmVjdG9yeVxuICAgICAgIG1vdW50cG9pbnQgWy1xXSBbLXhdIGRldmljZVxuXG4tcQlCZSBxdWlldCwgcmV0dXJuIHplcm8gaWYgZGlyZWN0b3J5IGlzIGEgbW91bnRwb2ludFxuLWQJUHJpbnQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBvZiB0aGUgZGlyZWN0b3J5XG4teAlQcmludCBtYWpvci9taW5vciBkZXZpY2UgbnVtYmVyIG9mIHRoZSBibG9jayBkZXZpY2VcblxuIgorCisjZGVmaW5lIEhFTFBfbW9kaW5mbyAidXNhZ2U6IG1vZGluZm8gWy0wXSBbLWIgYmFzZWRpcl0gWy1rIGtlcm5yZWxlYXNlXSBbLUYgZmllbGRdIFttb2R1bGVuYW1lLi4uXVxuXG5EaXNwbGF5IG1vZHVsZSBmaWVsZHMgZm9yIGFsbCBzcGVjaWZpZWQgbW9kdWxlcywgbG9va2luZyBpblxuPGJhc2VkaXI+L2xpYi9tb2R1bGVzLzxrZXJucmVsZWFzZT4vIChrZXJucmVsZWFzZSBkZWZhdWx0cyB0byB1bmFtZSAtcikuXG5cbiIKKworI2RlZmluZSBIRUxQX21rc3dhcCAidXNhZ2U6IG1rc3dhcCBbLUwgTEFCRUxdIERFVklDRVxuXG5TZXRzIHVwIGEgTGludXggc3dhcCBhcmVhIG9uIGEgZGV2aWNlIG9yIGZpbGUuXG5cbiIKKworI2RlZmluZSBIRUxQX21rcGFzc3dkICJ1c2FnZTogbWtwYXNzd2QgWy1QIEZEXSBbLW0gVFlQRV0gWy1TIFNBTFRdIFtQQVNTV09SRF0gW1NBTFRdXG5cbkNyeXB0IFBBU1NXT1JEIHVzaW5nIGNyeXB0KDMpXG5cbi1QIEZEICAgUmVhZCBwYXNzd29yZCBmcm9tIGZpbGUgZGVzY3JpcHRvciBGRFxuLW0gVFlQRSBFbmNyeXB0aW9uIG1ldGhvZCAoZGVzLCBtZDUsIHNoYTI1Niwgb3Igc2hhNTEyOyBkZWZhdWx0IGlzIGRlcylcbi1TIFNBTFRcblxuIgorCisjZGVmaW5lIEhFTFBfbWl4ICJ1c2FnZTogbWl4IFstZCBERVZdIFstYyBDSEFOTkVMXSBbLWwgVk9MXSBbLXIgUklHSFRdXG5cbkxpc3QgT1NTIHNvdW5kIGNoYW5uZWxzIChtb2R1bGUgc25kLW1peGVyLW9zcyksIG9yIHNldCB2b2x1bWUocykuXG5cbi1jIENIQU5ORUwJU2V0L3Nob3cgdm9sdW1lIG9mIENIQU5ORUwgKGRlZmF1bHQgZmlyc3QgY2hhbm5lbCBmb3VuZClcbi1kIERFVgkJRGV2aWNlIG5vZGUgKGRlZmF1bHQgL2Rldi9taXhlcilcbi1sIFZPTAkJVm9sdW1lIGxldmVsXG4tciBSSUdIVAlWb2x1bWUgb2YgcmlnaHQgc3RlcmVvIGNoYW5uZWwgKHdpdGggLXIsIC1sIHNldHMgbGVmdCB2b2x1bWUpXG5cbiIKKworI2RlZmluZSBIRUxQX21ha2VkZXZzICJ1c2FnZTogbWFrZWRldnMgWy1kIGRldmljZV90YWJsZV0gcm9vdGRpclxuXG5DcmVhdGUgYSByYW5nZSBvZiBzcGVjaWFsIGZpbGVzIGFzIHNwZWNpZmllZCBpbiBhIGRldmljZSB0YWJsZS5cblxuLWQJZmlsZSBjb250YWluaW5nIGRldmljZSB0YWJsZSAoZGVmYXVsdCByZWFkcyBmcm9tIHN0ZGluKVxuXG5FYWNoIGxpbmUgb2Ygb2YgdGhlIGRldmljZSB0YWJsZSBoYXMgdGhlIGZpZWxkczpcbjxuYW1lPiA8dHlwZT4gPG1vZGU+IDx1aWQ+IDxnaWQ+IDxtYWpvcj4gPG1pbm9yPiA8c3RhcnQ+IDxpbmNyZW1lbnQ+IDxjb3VudD5cbldoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgYW5kIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cbmIJQmxvY2sgZGV2aWNlXG5jCUNoYXJhY3RlciBkZXZpY2VcbmQJRGlyZWN0b3J5XG5mCVJlZ3VsYXIgZmlsZVxucAlOYW1lZCBwaXBlIChmaWZvKVxuXG5PdGhlciBmaWVsZHMgc3BlY2lmeSBwZXJtaXNzaW9ucywgdXNlciBhbmQgZ3JvdXAgaWQgb3duaW5nIHRoZSBmaWxlLFxuYW5kIGFkZGl0aW9uYWwgZmllbGRzIGZvciBkZXZpY2Ugc3BlY2lhbCBmaWxlcy4gVXNlICctJyBmb3IgYmxhbmsgZW50cmllcyxcbnVuc3BlY2lmaWVkIGZpZWxkcyBhcmUgdHJlYXRlZCBhcyAnLScuXG5cbiIKKworI2RlZmluZSBIRUxQX2xzdXNiICJ1c2FnZTogbHN1c2JcblxuTGlzdCBVU0IgaG9zdHMvZGV2aWNlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfbHNwY2lfdGV4dCAidXNhZ2U6IGxzcGNpIFstbl0gWy1pIEZJTEUgXVxuXG4tbglOdW1lcmljIG91dHB1dCAocmVwZWF0IGZvciByZWFkYWJsZSBhbmQgbnVtZXJpYylcbi1pCVBDSSBJRCBkYXRhYmFzZSAoZGVmYXVsdCAvdXNyL3NoYXJlL21pc2MvcGNpLmlkcylcblxuXG4iCisKKyNkZWZpbmUgSEVMUF9sc3BjaSAidXNhZ2U6IGxzcGNpIFstZWttXVxuXG5MaXN0IFBDSSBkZXZpY2VzLlxuXG4tZQlQcmludCBhbGwgNiBkaWdpdHMgaW4gY2xhc3Ncbi1rCVByaW50IGtlcm5lbCBkcml2ZXJcbi1tCU1hY2hpbmUgcGFyc2VhYmxlIGZvcm1hdFxuXG4iCisKKyNkZWZpbmUgSEVMUF9sc21vZCAidXNhZ2U6IGxzbW9kXG5cbkRpc3BsYXkgdGhlIGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcywgdGhlaXIgc2l6ZXMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcy5cblxuIgorCisjZGVmaW5lIEhFTFBfY2hhdHRyICJ1c2FnZTogY2hhdHRyIFstUl0gWy0rPUFhY0RkaWpzU3RUdV0gWy12IHZlcnNpb25dIFtGaWxlLi4uXVxuXG5DaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLlxuXG5PcGVyYXRvcnM6XG4gICctJyBSZW1vdmUgYXR0cmlidXRlcy5cbiAgJysnIEFkZCBhdHRyaWJ1dGVzLlxuICAnPScgU2V0IGF0dHJpYnV0ZXMuXG5cbkF0dHJpYnV0ZXM6XG4gIEEgIERvbid0IHRyYWNrIGF0aW1lLlxuICBhICBBcHBlbmQgbW9kZSBvbmx5LlxuICBjICBFbmFibGUgY29tcHJlc3MuXG4gIEQgIFdyaXRlIGRpciBjb250ZW50cyBzeW5jaHJvbm91c2x5LlxuICBkICBEb24ndCBiYWNrdXAgd2l0aCBkdW1wLlxuICBpICBDYW5ub3QgYmUgbW9kaWZpZWQgKGltbXV0YWJsZSkuXG4gIGogIFdyaXRlIGFsbCBkYXRhIHRvIGpvdXJuYWwgZmlyc3QuXG4gIHMgIFplcm8gZGlzayBzdG9yYWdlIHdoZW4gZGVsZXRlZC5cbiAgUyAgV3JpdGUgZmlsZSBjb250ZW50cyBzeW5jaHJvbm91c2x5LlxuICB0ICBEaXNhYmxlIHRhaWwtbWVyZ2luZyBvZiBwYXJ0aWFsIGJsb2NrcyB3aXRoIG90aGVyIGZpbGVzLlxuICB1ICBBbGxvdyBmaWxlIHRvIGJlIHVuZGVsZXRlZC5cbiAgLVIgUmVjdXJzZS5cbiAgLXYgU2V0IHRoZSBmaWxlJ3MgdmVyc2lvbi9nZW5lcmF0aW9uIG51bWJlci5cblxuXG4iCisKKyNkZWZpbmUgSEVMUF9sc2F0dHIgInVzYWdlOiBsc2F0dHIgWy1SYWRsdl0gW0ZpbGVzLi4uXVxuXG5MaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS5cblxuLVIgUmVjdXJzaXZlbHkgbGlzdCBhdHRyaWJ1dGVzIG9mIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBjb250ZW50cy5cbi1hIExpc3QgYWxsIGZpbGVzIGluIGRpcmVjdG9yaWVzLCBpbmNsdWRpbmcgZmlsZXMgdGhhdCBzdGFydCB3aXRoICcuJy5cbi1kIExpc3QgZGlyZWN0b3JpZXMgbGlrZSBvdGhlciBmaWxlcywgcmF0aGVyIHRoYW4gbGlzdGluZyB0aGVpciBjb250ZW50cy5cbi1sIExpc3QgbG9uZyBmbGFnIG5hbWVzLlxuLXYgTGlzdCB0aGUgZmlsZSdzIHZlcnNpb24vZ2VuZXJhdGlvbiBudW1iZXIuXG5cbiIKKworI2RlZmluZSBIRUxQX2xvc2V0dXAgInVzYWdlOiBsb3NldHVwIFstY2Ryc10gWy1vIE9GRlNFVF0gWy1TIFNJWkVdIHstZCBERVZJQ0UuLi58LWogRklMRXwtYWZ8e0RFVklDRSBGSUxFfX1cblxuQXNzb2NpYXRlIGEgbG9vcGJhY2sgZGV2aWNlIHdpdGggYSBmaWxlLCBvciBzaG93IGN1cnJlbnQgZmlsZSAoaWYgYW55KVxuYXNzb2NpYXRlZCB3aXRoIGEgbG9vcCBkZXZpY2UuXG5cbkluc3RlYWQgb2YgYSBkZXZpY2U6XG4tYQlJdGVyYXRlIHRocm91Z2ggYWxsIGxvb3BiYWNrIGRldmljZXNcbi1mCUZpbmQgZmlyc3QgdW51c2VkIGxvb3AgZGV2aWNlIChtYXkgY3JlYXRlIG9uZSlcbi1qCUl0ZXJhdGUgdGhyb3VnaCBhbGwgbG9vcGJhY2sgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggRklMRVxuXG5leGlzdGluZzpcbi1jCUNoZWNrIGNhcGFjaXR5IChmaWxlIHNpemUgY2hhbmdlZClcbi1kCURldGFjaCBsb29wYmFjayBkZXZpY2VcblxubmV3OlxuLXMJU2hvdyBkZXZpY2UgbmFtZSAoYWxpYXMgLS1zaG93KVxuLW8JU3RhcnQgYXNzb2NhdGlvbiBhdCBPRkZTRVQgaW50byBGSUxFXG4tcglSZWFkIG9ubHlcbi1TCUxpbWl0IFNJWkUgb2YgbG9vcGJhY2sgYXNzb2NpYXRpb24gKGFsaWFzIC0tc2l6ZWxpbWl0KVxuXG4iCisKKyNkZWZpbmUgSEVMUF9sb2dpbiAidXNhZ2U6IGxvZ2luIFstcF0gWy1oIGhvc3RdIFstZiBVU0VSTkFNRV0gW1VTRVJOQU1FXVxuXG5Mb2cgaW4gYXMgYSB1c2VyLCBwcm9tcHRpbmcgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpZiBuZWNlc3NhcnkuXG5cbi1wCVByZXNlcnZlIGVudmlyb25tZW50XG4taAlUaGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QgZm9yIHRoaXMgbG9naW5cbi1mCWxvZ2luIGFzIFVTRVJOQU1FIHdpdGhvdXQgYXV0aGVudGljYXRpb25cblxuIgorCisjZGVmaW5lIEhFTFBfaW9yZW5pY2UgInVzYWdlOiBpb3JlbmljZSBQSUQgW0NMQVNTXSBbUFJJT1JJVFldXG5cbkRpc3BsYXkgb3IgY2hhbmdlIEkvTyBwcmlvcml0eSBvZiBleGlzdGluZyBwcm9jZXNzLiBDTEFTUyBjYW4gYmVcblwicnRcIiBmb3IgcmVhbHRpbWUsIFwiYmVcIiBmb3IgYmVzdCBlZmZvcnQsIFwiaWRsZVwiIGZvciBvbmx5IHdoZW4gaWRsZSwgb3Jcblwibm9uZVwiIHRvIGxlYXZlIGl0IGFsb25lLiBQUklPUklUWSBjYW4gYmUgMC03ICgwIGlzIGhpZ2hlc3QsIGRlZmF1bHQgNCkuXG5cbiIKKworI2RlZmluZSBIRUxQX2lvbmljZSAidXNhZ2U6IGlvbmljZSBbLXRdIFstYyBDTEFTU10gWy1uIExFVkVMXSBbQ09NTUFORC4uLnwtcCBQSURdXG5cbkNoYW5nZSB0aGUgSS9PIHNjaGVkdWxpbmcgcHJpb3JpdHkgb2YgYSBwcm9jZXNzLiBXaXRoIG5vIGFyZ3VtZW50c1xuKG9yIGp1c3QgLXApLCBkaXNwbGF5IHByb2Nlc3MnIGV4aXN0aW5nIEkvTyBjbGFzcy9wcmlvcml0eS5cblxuLWMJQ0xBU1MgPSAxLTM6IDEocmVhbHRpbWUpLCAyKGJlc3QtZWZmb3J0LCBkZWZhdWx0KSwgMyh3aGVuLWlkbGUpXG4tbglMRVZFTCA9IDAtNzogKDAgaXMgaGlnaGVzdCBwcmlvcml0eSwgZGVmYXVsdCA9IDUpXG4tcAlBZmZlY3QgZXhpc3RpbmcgUElEIGluc3RlYWQgb2Ygc3Bhd25pbmcgbmV3IGNoaWxkXG4tdAlJZ25vcmUgZmFpbHVyZSB0byBzZXQgSS9PIHByaW9yaXR5XG5cblN5c3RlbSBkZWZhdWx0IGlvcHJpb3JpdHkgaXMgZ2VuZXJhbGx5IC1jIDIgLW4gNC5cblxuIgorCisjZGVmaW5lIEhFTFBfaW5zbW9kICJ1c2FnZTogaW5zbW9kIE1PRFVMRSBbTU9EVUxFX09QVElPTlNdXG5cbkxvYWQgdGhlIG1vZHVsZSBuYW1lZCBNT0RVTEUgcGFzc2luZyBvcHRpb25zIGlmIGdpdmVuLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9pbm90aWZ5ZCAidXNhZ2U6IGlub3RpZnlkIFBST0cgRklMRVs6TUFTS10gLi4uXG5cbldoZW4gYSBmaWxlc3lzdGVtIGV2ZW50IG1hdGNoaW5nIE1BU0sgb2NjdXJzIHRvIGEgRklMRSwgcnVuIFBST0cgYXM6XG5cbiAgUFJPRyBFVkVOVFMgRklMRSBbRElSRklMRV1cblxuSWYgUFJPRyBpcyBcIi1cIiBldmVudHMgYXJlIHNlbnQgdG8gc3Rkb3V0LlxuXG5UaGlzIGZpbGUgaXM6XG4gIGEgIGFjY2Vzc2VkICAgIGMgIG1vZGlmaWVkICAgIGUgIG1ldGFkYXRhIGNoYW5nZSAgdyAgY2xvc2VkICh3cml0YWJsZSlcbiAgciAgb3BlbmVkICAgICAgRCAgZGVsZXRlZCAgICAgTSAgbW92ZWQgICAgICAgICAgICAwICBjbG9zZWQgKHVud3JpdGFibGUpXG4gIHUgIHVubW91bnRlZCAgIG8gIG92ZXJmbG93ICAgIHggIHVud2F0Y2hhYmxlXG5cbkEgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBpczpcbiAgbSAgbW92ZWQgaW4gICAgeSAgbW92ZWQgb3V0ICAgbiAgY3JlYXRlZCAgICAgICAgICBkICBkZWxldGVkXG5cbldoZW4geCBldmVudCBoYXBwZW5zIGZvciBhbGwgRklMRXMsIGlub3RpZnlkIGV4aXRzIChhZnRlciB3YWl0aW5nIGZvciBQUk9HKS5cblxuIgorCisjZGVmaW5lIEhFTFBfaHdjbG9jayAidXNhZ2U6IGh3Y2xvY2sgWy1yc3d0bHVmXVxuXG4tZiBGSUxFIFVzZSBzcGVjaWZpZWQgZGV2aWNlIGZpbGUgaW5zdGVhZCBvZiAvZGV2L3J0YyAoLS1ydGMpXG4tbCAgICAgIEhhcmR3YXJlIGNsb2NrIHVzZXMgbG9jYWx0aW1lICgtLWxvY2FsdGltZSlcbi1yICAgICAgU2hvdyBoYXJkd2FyZSBjbG9jayB0aW1lICgtLXNob3cpXG4tcyAgICAgIFNldCBzeXN0ZW0gdGltZSBmcm9tIGhhcmR3YXJlIGNsb2NrICgtLWhjdG9zeXMpXG4tdCAgICAgIFNldCB0aGUgc3lzdGVtIHRpbWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZXpvbmUgKC0tc3lzdHopXG4tdSAgICAgIEhhcmR3YXJlIGNsb2NrIHVzZXMgVVRDICgtLXV0Yylcbi13ICAgICAgU2V0IGhhcmR3YXJlIGNsb2NrIGZyb20gc3lzdGVtIHRpbWUgKC0tc3lzdG9oYylcblxuIgorCisjZGVmaW5lIEhFTFBfaG9zdGlkICJ1c2FnZTogaG9zdGlkXG5cblByaW50IHRoZSBudW1lcmljIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGhvc3QuXG5cbiIKKworI2RlZmluZSBIRUxQX2hleGVkaXQgInVzYWdlOiBoZXhlZGl0IEZJTEVOQU1FXG5cbkhleGFkZWNpbWFsIGZpbGUgZWRpdG9yLiBBbGwgY2hhbmdlcyBhcmUgd3JpdHRlbiB0byBkaXNrIGltbWVkaWF0ZWx5LlxuXG4tcglSZWFkIG9ubHkgKGRpc3BsYXkgYnV0IGRvbid0IGVkaXQpXG5cbktleXM6XG5BcnJvd3MgICAgICAgIE1vdmUgbGVmdC9yaWdodC91cC9kb3duIGJ5IG9uZSBsaW5lL2NvbHVtblxuUGcgVXAvUGcgRG4gICBNb3ZlIHVwL2Rvd24gYnkgb25lIHBhZ2VcbjAtOSwgYS1mICAgICAgQ2hhbmdlIGN1cnJlbnQgaGFsZi1ieXRlIHRvIGhleGFkZWNpbWFsIHZhbHVlXG51ICAgICAgICAgICAgIFVuZG9cbnEvXmMvXmQvPGVzYz4gUXVpdFxuXG4iCisKKyNkZWZpbmUgSEVMUF9oZWxwICJ1c2FnZTogaGVscCBbLWFoXSBbY29tbWFuZF1cblxuU2hvdyB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdG95Ym94IGNvbW1hbmRzLlxuUnVuIFwidG95Ym94XCIgd2l0aCBubyBhcmd1bWVudHMgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuXG5cbi1oCUhUTUwgb3V0cHV0XG4tYQlBbGwgY29tbWFuZHNcbiIKKworI2RlZmluZSBIRUxQX2ZzeW5jICJ1c2FnZTogZnN5bmMgWy1kXSBbRklMRS4uLl1cblxuU3luY2hyb25pemUgYSBmaWxlJ3MgaW4tY29yZSBzdGF0ZSB3aXRoIHN0b3JhZ2UgZGV2aWNlLlxuXG4tZAlBdm9pZCBzeW5jaW5nIG1ldGFkYXRhLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9mc2ZyZWV6ZSAidXNhZ2U6IGZzZnJlZXplIHstZiB8IC11fSBNT1VOVFBPSU5UXG5cbkZyZWV6ZSBvciB1bmZyZWV6ZSBhIGZpbGVzeXN0ZW0uXG5cbi1mCWZyZWV6ZVxuLXUJdW5mcmVlemVcblxuIgorCisjZGVmaW5lIEhFTFBfZnJlZXJhbWRpc2sgInVzYWdlOiBmcmVlcmFtZGlzayBbUkFNIGRldmljZV1cblxuRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCB0byBzcGVjaWZpZWQgcmFtZGlza1xuXG4iCisKKyNkZWZpbmUgSEVMUF9mcmVlICJ1c2FnZTogZnJlZSBbLWJrbWd0XVxuXG5EaXNwbGF5IHRoZSB0b3RhbCwgZnJlZSBhbmQgdXNlZCBhbW91bnQgb2YgcGh5c2ljYWwgbWVtb3J5IGFuZCBzd2FwIHNwYWNlLlxuXG4tYmttZ3QJT3V0cHV0IHVuaXRzIChkZWZhdWx0IGlzIGJ5dGVzKVxuLWgJSHVtYW4gcmVhZGFibGVcblxuIgorCisjZGVmaW5lIEhFTFBfZmxvY2sgInVzYWdlOiBmbG9jayBbLXN4dW5dIGZkXG5cbk1hbmFnZSBhZHZpc29yeSBmaWxlIGxvY2tzLlxuXG4tcwlTaGFyZWQgbG9jay5cbi14CUV4Y2x1c2l2ZSBsb2NrIChkZWZhdWx0KS5cbi11CVVubG9jay5cbi1uCU5vbi1ibG9ja2luZzogZmFpbCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgbG9jay5cblxuIgorCisjZGVmaW5lIEhFTFBfZmFsbG9jYXRlICJ1c2FnZTogZmFsbG9jYXRlIFstbCBzaXplXSBmaWxlXG5cblRlbGwgdGhlIGZpbGVzeXN0ZW0gdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGEgZmlsZS5cblxuIgorCisjZGVmaW5lIEhFTFBfZmFjdG9yICJ1c2FnZTogZmFjdG9yIE5VTUJFUi4uLlxuXG5GYWN0b3IgaW50ZWdlcnMuXG5cbiIKKworI2RlZmluZSBIRUxQX2VqZWN0ICJ1c2FnZTogZWplY3QgWy1zdFRdIFtERVZJQ0VdXG5cbkVqZWN0IERFVklDRSBvciBkZWZhdWx0IC9kZXYvY2Ryb21cblxuLXMJU0NTSSBkZXZpY2Vcbi10CUNsb3NlIHRyYXlcbi1UCU9wZW4vY2xvc2UgdHJheSAodG9nZ2xlKS5cblxuIgorCisjZGVmaW5lIEhFTFBfdW5peDJkb3MgInVzYWdlOiB1bml4MmRvcyBbRklMRS4uLl1cblxuQ29udmVydCBuZXdsaW5lIGZvcm1hdCBmcm9tIHVuaXggXCJcXG5cIiB0byBkb3MgXCJcXHJcXG5cIi5cbklmIG5vIGZpbGVzIGxpc3RlZCBjb3B5IGZyb20gc3RkaW4sIFwiLVwiIGlzIGEgc3lub255bSBmb3Igc3RkaW4uXG5cbiIKKworI2RlZmluZSBIRUxQX2RvczJ1bml4ICJ1c2FnZTogZG9zMnVuaXggW0ZJTEUuLi5dXG5cbkNvbnZlcnQgbmV3bGluZSBmb3JtYXQgZnJvbSBkb3MgXCJcXHJcXG5cIiB0byB1bml4IFwiXFxuXCIuXG5JZiBubyBmaWxlcyBsaXN0ZWQgY29weSBmcm9tIHN0ZGluLCBcIi1cIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9jb3VudCAidXNhZ2U6IGNvdW50XG5cbkNvcHkgc3RkaW4gdG8gc3Rkb3V0LCBkaXNwbGF5aW5nIHNpbXBsZSBwcm9ncmVzcyBpbmRpY2F0b3IgdG8gc3RkZXJyLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9jbGVhciAiQ2xlYXIgdGhlIHNjcmVlbi5cblxuIgorCisjZGVmaW5lIEhFTFBfY2h2dCAidXNhZ2U6IGNodnQgTlxuXG5DaGFuZ2UgdG8gdmlydHVhbCB0ZXJtaW5hbCBudW1iZXIgTi4gKFRoaXMgb25seSB3b3JrcyBpbiB0ZXh0IG1vZGUuKVxuXG5WaXJ0dWFsIHRlcm1pbmFscyBhcmUgdGhlIExpbnV4IFZHQSB0ZXh0IG1vZGUgZGlzcGxheXMsIG9yZGluYXJpbHlcbnN3aXRjaGVkIGJldHdlZW4gdmlhIGFsdC1GMSwgYWx0LUYyLCBldGMuIFVzZSBjdHJsLWFsdC1GMSB0byBzd2l0Y2hcbmZyb20gWCB0byBhIHZpcnR1YWwgdGVybWluYWwsIGFuZCBhbHQtRjYgKG9yIEY3LCBvciBGOCkgdG8gZ2V0IGJhY2suXG5cbiIKKworI2RlZmluZSBIRUxQX2Nocm9vdCAidXNhZ2U6IGNocm9vdCBORVdQQVRIIFtjb21tYW5kbGluZS4uLl1cblxuUnVuIGNvbW1hbmQgd2l0aGluIGEgbmV3IHJvb3QgZGlyZWN0b3J5LiBJZiBubyBjb21tYW5kLCBydW4gL2Jpbi9zaC5cblxuIgorCisjZGVmaW5lIEhFTFBfY2hjb24gInVzYWdlOiBjaGNvbiBbLWhSdl0gQ09OVEVYVCBGSUxFLi4uXG5cbkNoYW5nZSB0aGUgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IG9mIGxpc3RlZCBmaWxlW3NdLlxuXG4taCBjaGFuZ2Ugc3ltbGlua3MgaW5zdGVhZCBvZiB3aGF0IHRoZXkgcG9pbnQgdG8uXG4tUiByZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMuXG4tdiB2ZXJib3NlIG91dHB1dC5cblxuIgorCisjZGVmaW5lIEhFTFBfYnpjYXQgInVzYWdlOiBiemNhdCBbRklMRS4uLl1cblxuRGVjb21wcmVzcyBsaXN0ZWQgZmlsZXMgdG8gc3Rkb3V0LiBVc2Ugc3RkaW4gaWYgbm8gZmlsZXMgbGlzdGVkLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9idW56aXAyICJ1c2FnZTogYnVuemlwMiBbLWNmdGt2XSBbRklMRS4uLl1cblxuRGVjb21wcmVzcyBsaXN0ZWQgZmlsZXMgKGZpbGUuYnogYmVjb21lcyBmaWxlKSBkZWxldGluZyBhcmNoaXZlIGZpbGUocykuXG5SZWFkIGZyb20gc3RkaW4gaWYgbm8gZmlsZXMgbGlzdGVkLlxuXG4tYwlmb3JjZSBvdXRwdXQgdG8gc3Rkb3V0XG4tZglmb3JjZSBkZWNvbXByZXNzaW9uLiAoSWYgRklMRSBkb2Vzbid0IGVuZCBpbiAuYnosIHJlcGxhY2Ugb3JpZ2luYWwuKVxuLWsJa2VlcCBpbnB1dCBmaWxlcyAoLWMgYW5kIC10IGltcGx5IHRoaXMpXG4tdCAgdGVzdCBpbnRlZ3JpdHlcbi12CXZlcmJvc2VcblxuIgorCisjZGVmaW5lIEhFTFBfYmxvY2tkZXYgInVzYWdlOiBibG9ja2RldiAtLU9QVElPTi4uLiBCTE9DS0RFVi4uLlxuXG5DYWxsIGlvY3RsKHMpIG9uIGVhY2ggbGlzdGVkIGJsb2NrIGRldmljZVxuXG5PUFRJT05zOlxuLS1zZXRybwkJU2V0IHJlYWQgb25seVxuLS1zZXRydwkJU2V0IHJlYWQgd3JpdGVcbi0tZ2V0cm8JCUdldCByZWFkIG9ubHlcbi0tZ2V0c3MJCUdldCBzZWN0b3Igc2l6ZVxuLS1nZXRic3oJR2V0IGJsb2NrIHNpemVcbi0tc2V0YnN6CUJZVEVTCVNldCBibG9jayBzaXplXG4tLWdldHN6CQlHZXQgZGV2aWNlIHNpemUgaW4gNTEyLWJ5dGUgc2VjdG9yc1xuLS1nZXRzaXplCUdldCBkZXZpY2Ugc2l6ZSBpbiBzZWN0b3JzIChkZXByZWNhdGVkKVxuLS1nZXRzaXplNjQJR2V0IGRldmljZSBzaXplIGluIGJ5dGVzXG4tLWZsdXNoYnVmcwlGbHVzaCBidWZmZXJzXG4tLXJlcmVhZHB0CVJlcmVhZCBwYXJ0aXRpb24gdGFibGVcblxuIgorCisjZGVmaW5lIEhFTFBfZnN0eXBlICJ1c2FnZTogZnN0eXBlIERFVi4uLlxuXG5QcmludHMgdHlwZSBvZiBmaWxlc3lzdGVtIG9uIGEgYmxvY2sgZGV2aWNlIG9yIGltYWdlLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9ibGtpZCAidXNhZ2U6IGJsa2lkIERFVi4uLlxuXG5QcmludHMgdHlwZSwgbGFiZWwgYW5kIFVVSUQgb2YgZmlsZXN5c3RlbSBvbiBhIGJsb2NrIGRldmljZSBvciBpbWFnZS5cblxuIgorCisjZGVmaW5lIEhFTFBfYmFzZTY0ICJ1c2FnZTogYmFzZTY0IFstZGldIFstdyBDT0xVTU5TXSBbRklMRS4uLl1cblxuRW5jb2RlIG9yIGRlY29kZSBpbiBiYXNlNjQuXG5cbi1kCWRlY29kZVxuLWkJaWdub3JlIG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnNcbi13CXdyYXAgb3V0cHV0IGF0IENPTFVNTlMgKGRlZmF1bHQgNzYgb3IgMCBmb3Igbm8gd3JhcClcblxuIgorCisjZGVmaW5lIEhFTFBfYWNwaSAidXNhZ2U6IGFjcGkgWy1hYmN0Vl1cblxuU2hvdyBzdGF0dXMgb2YgcG93ZXIgc291cmNlcyBhbmQgdGhlcm1hbCBkZXZpY2VzLlxuXG4tYQlzaG93IHBvd2VyIGFkYXB0ZXJzXG4tYglzaG93IGJhdHRlcmllc1xuLWMJc2hvdyBjb29saW5nIGRldmljZSBzdGF0ZVxuLXQJc2hvdyB0ZW1wZXJhdHVyZXNcbi1WCXNob3cgZXZlcnl0aGluZ1xuXG4iCisKKyNkZWZpbmUgSEVMUF94emNhdCAidXNhZ2U6IHh6Y2F0IFtmaWxlbmFtZS4uLl1cblxuRGVjb21wcmVzcyBsaXN0ZWQgZmlsZXMgdG8gc3Rkb3V0LiBVc2Ugc3RkaW4gaWYgbm8gZmlsZXMgbGlzdGVkLlxuXG5cblxuIgorCisjZGVmaW5lIEhFTFBfd2dldCAidXNhZ2U6IHdnZXQgLWYgZmlsZW5hbWUgVVJMXG4tZiBmaWxlbmFtZTogc3BlY2lmeSB0aGUgZmlsZW5hbWUgdG8gYmUgc2F2ZWRcblVSTDogSFRUUCB1bmlmb3JtIHJlc291cmNlIGxvY2F0aW9uIGFuZCBvbmx5IEhUVFAsIG5vdCBIVFRQU1xuXG5leGFtcGxlczpcbiAgd2dldCAtZiBpbmRleC5odG1sIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgd2dldCAtZiBzYW1wbGUuanBnIGh0dHA6Ly93d3cuZXhhbXBsZS5jb206ODA4MC9zYW1wbGUuanBnXG5cbiIKKworI2RlZmluZSBIRUxQX3dhdGNoICJ1c2FnZTogd2F0Y2ggWy1uIFNFQ10gWy10XSBQUk9HIEFSR1NcblxuUnVuIFBST0cgcGVyaW9kaWNhbGx5XG5cbi1uICBMb29wIHBlcmlvZCBpbiBzZWNvbmRzIChkZWZhdWx0IDIpXG4tdCAgRG9uJ3QgcHJpbnQgaGVhZGVyXG4tZSAgRnJlZXplIHVwZGF0ZXMgb24gY29tbWFuZCBlcnJvciwgYW5kIGV4aXQgYWZ0ZXIgZW50ZXIuXG5cbiIKKworI2RlZmluZSBIRUxQX3ZpICJ1c2FnZTogdmkgRklMRVxuXG5WaXN1YWwgdGV4dCBlZGl0b3IuIFByZWRhdGVzIHRoZSBleGlzdGVuY2Ugb2Ygc3RhbmRhcmRpemVkIGN1cnNvciBrZXlzLFxuc28gdGhlIGNvbnRyb2xzIGFyZSB3ZWlyZCBhbmQgaGlzdG9yaWNhbC5cblxuIgorCisjZGVmaW5lIEhFTFBfdXNlcmRlbCAidXNhZ2U6IHVzZXJkZWwgWy1yXSBVU0VSXG51c2FnZTogZGVsdXNlciBbLXJdIFVTRVJcblxuT3B0aW9uczpcbi1yIHJlbW92ZSBob21lIGRpcmVjdG9yeVxuRGVsZXRlIFVTRVIgZnJvbSB0aGUgU1lTVEVNXG5cbiIKKworI2RlZmluZSBIRUxQX3VzZXJhZGQgInVzYWdlOiB1c2VyYWRkIFstU0RIXSBbLWggRElSXSBbLXMgU0hFTExdIFstRyBHUlBdIFstZyBOQU1FXSBbLXUgVUlEXSBVU0VSIFtHUk9VUF1cblxuQ3JlYXRlIG5ldyB1c2VyLCBvciBhZGQgVVNFUiB0byBHUk9VUFxuXG4tRCAgICAgICBEb24ndCBhc3NpZ24gYSBwYXNzd29yZFxuLWcgTkFNRSAgUmVhbCBuYW1lXG4tRyBHUlAgICBBZGQgdXNlciB0byBleGlzdGluZyBncm91cFxuLWggRElSICAgSG9tZSBkaXJlY3Rvcnlcbi1IICAgICAgIERvbid0IGNyZWF0ZSBob21lIGRpcmVjdG9yeVxuLXMgU0hFTEwgTG9naW4gc2hlbGxcbi1TICAgICAgIENyZWF0ZSBhIHN5c3RlbSB1c2VyXG4tdSBVSUQgICBVc2VyIGlkXG5cbiIKKworI2RlZmluZSBIRUxQX3RyICJ1c2FnZTogdHIgWy1jZHNdIFNFVDEgW1NFVDJdXG5cblRyYW5zbGF0ZSwgc3F1ZWV6ZSwgb3IgZGVsZXRlIGNoYXJhY3RlcnMgZnJvbSBzdGRpbiwgd3JpdGluZyB0byBzdGRvdXRcblxuLWMvLUMgIFRha2UgY29tcGxlbWVudCBvZiBTRVQxXG4tZCAgICAgRGVsZXRlIGlucHV0IGNoYXJhY3RlcnMgY29kZWQgU0VUMVxuLXMgICAgIFNxdWVlemUgbXVsdGlwbGUgb3V0cHV0IGNoYXJhY3RlcnMgb2YgU0VUMiBpbnRvIG9uZSBjaGFyYWN0ZXJcblxuIgorCisjZGVmaW5lIEhFTFBfdHJhY2Vyb3V0ZSAidXNhZ2U6IHRyYWNlcm91dGUgWy00NkZVSWxkbnZyXSBbLWYgMVNUX1RUTF0gWy1tIE1BWFRUTF0gWy1wIFBPUlRdIFstcSBQUk9CRVNdXG5bLXMgU1JDX0lQXSBbLXQgVE9TXSBbLXcgV0FJVF9TRUNdIFstZyBHQVRFV0FZXSBbLWkgSUZBQ0VdIFsteiBQQVVTRV9NU0VDXSBIT1NUIFtCWVRFU11cblxudHJhY2Vyb3V0ZTYgWy1kbnJ2XSBbLW0gTUFYVFRMXSBbLXAgUE9SVF0gWy1xIFBST0JFU11bLXMgU1JDX0lQXSBbLXQgVE9TXSBbLXcgV0FJVF9TRUNdXG4gIFstaSBJRkFDRV0gSE9TVCBbQllURVNdXG5cblRyYWNlIHRoZSByb3V0ZSB0byBIT1NUXG5cbi00LC02IEZvcmNlIElQIG9yIElQdjYgbmFtZSByZXNvbHV0aW9uXG4tRiAgICBTZXQgdGhlIGRvbid0IGZyYWdtZW50IGJpdCAoc3VwcG9ydHMgSVBWNCBvbmx5KVxuLVUgICAgVXNlIFVEUCBkYXRhZ3JhbXMgaW5zdGVhZCBvZiBJQ01QIEVDSE8gKHN1cHBvcnRzIElQVjQgb25seSlcbi1JICAgIFVzZSBJQ01QIEVDSE8gaW5zdGVhZCBvZiBVRFAgZGF0YWdyYW1zIChzdXBwb3J0cyBJUFY0IG9ubHkpXG4tbCAgICBEaXNwbGF5IHRoZSBUVEwgdmFsdWUgb2YgdGhlIHJldHVybmVkIHBhY2tldCAoc3VwcG9ydHMgSVBWNCBvbmx5KVxuLWQgICAgU2V0IFNPX0RFQlVHIG9wdGlvbnMgdG8gc29ja2V0XG4tbiAgICBQcmludCBudW1lcmljIGFkZHJlc3Nlc1xuLXYgICAgdmVyYm9zZVxuLXIgICAgQnlwYXNzIHJvdXRpbmcgdGFibGVzLCBzZW5kIGRpcmVjdGx5IHRvIEhPU1Rcbi1tICAgIE1heCB0aW1lLXRvLWxpdmUgKG1heCBudW1iZXIgb2YgaG9wcykoUkFOR0UgMSB0byAyNTUpXG4tcCAgICBCYXNlIFVEUCBwb3J0IG51bWJlciB1c2VkIGluIHByb2JlcyhkZWZhdWx0IDMzNDM0KShSQU5HRSAxIHRvIDY1NTM1KVxuLXEgICAgTnVtYmVyIG9mIHByb2JlcyBwZXIgVFRMIChkZWZhdWx0IDMpKFJBTkdFIDEgdG8gMjU1KVxuLXMgICAgSVAgYWRkcmVzcyB0byB1c2UgYXMgdGhlIHNvdXJjZSBhZGRyZXNzXG4tdCAgICBUeXBlLW9mLXNlcnZpY2UgaW4gcHJvYmUgcGFja2V0cyAoZGVmYXVsdCAwKShSQU5HRSAwIHRvIDI1NSlcbi13ICAgIFRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlc3BvbnNlIChkZWZhdWx0IDMpKFJBTkdFIDAgdG8gODY0MDApXG4tZyAgICBMb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheSAoOCBtYXgpIChzdXBwb3J0cyBJUFY0IG9ubHkpXG4teiAgICBQYXVzZSBUaW1lIGluIG1pbGlzZWMgKGRlZmF1bHQgMCkoUkFOR0UgMCB0byA4NjQwMCkgKHN1cHBvcnRzIElQVjQgb25seSlcbi1mICAgIFN0YXJ0IGZyb20gdGhlIDFTVF9UVEwgaG9wIChpbnN0ZWFkIGZyb20gMSkoUkFOR0UgMSB0byAyNTUpIChzdXBwb3J0cyBJUFY0IG9ubHkpXG4taSAgICBTcGVjaWZ5IGEgbmV0d29yayBpbnRlcmZhY2UgdG8gb3BlcmF0ZSB3aXRoXG5cbiIKKworI2RlZmluZSBIRUxQX3RmdHBkICJ1c2FnZTogdGZ0cGQgWy1jcl0gWy11IFVTRVJdIFtESVJdXG5cblRyYW5zZmVyIGZpbGUgZnJvbS90byB0ZnRwIHNlcnZlci5cblxuLXIJcmVhZCBvbmx5XG4tYwlBbGxvdyBmaWxlIGNyZWF0aW9uIHZpYSB1cGxvYWRcbi11CXJ1biBhcyBVU0VSXG4tbAlMb2cgdG8gc3lzbG9nIChpbmV0ZCBtb2RlIHJlcXVpcmVzIHRoaXMpXG5cbiIKKworI2RlZmluZSBIRUxQX3RmdHAgInVzYWdlOiB0ZnRwIFtPUFRJT05TXSBIT1NUIFtQT1JUXVxuXG5UcmFuc2ZlciBmaWxlIGZyb20vdG8gdGZ0cCBzZXJ2ZXIuXG5cbi1sIEZJTEUgTG9jYWwgRklMRVxuLXIgRklMRSBSZW1vdGUgRklMRVxuLWcgICAgR2V0IGZpbGVcbi1wICAgIFB1dCBmaWxlXG4tYiBTSVpFIFRyYW5zZmVyIGJsb2NrcyBvZiBTSVpFIG9jdGV0cyg4IDw9IFNJWkUgPD0gNjU0NjQpXG5cbiIKKworI2RlZmluZSBIRUxQX3Rlc3QgInVzYWdlOiB0ZXN0IFstYmNkZWZnaExQclNzdXd4IFBBVEhdIFstbnogU1RSSU5HXSBbLXQgRkRdIFtYID8/IFldXG5cblJldHVybiB0cnVlIG9yIGZhbHNlIGJ5IHBlcmZvcm1pbmcgdGVzdHMuIChXaXRoIG5vIGFyZ3VtZW50cyByZXR1cm4gZmFsc2UuKVxuXG4tLS0gVGVzdHMgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCAoYWZ0ZXIgdGhlIG9wdGlvbik6XG5QQVRIIGlzL2hhczpcbiAgLWIgIGJsb2NrIGRldmljZSAgIC1mICByZWd1bGFyIGZpbGUgICAtcCAgZmlmbyAgICAgICAgICAgLXUgIHNldHVpZCBiaXRcbiAgLWMgIGNoYXIgZGV2aWNlICAgIC1nICBzZXRnaWQgICAgICAgICAtciAgcmVhZCBiaXQgICAgICAgLXcgIHdyaXRlIGJpdFxuICAtZCAgZGlyZWN0b3J5ICAgICAgLWggIHN5bWxpbmsgICAgICAgIC1TICBzb2NrZXQgICAgICAgICAteCAgZXhlY3V0ZSBiaXRcbiAgLWUgIGV4aXN0cyAgICAgICAgIC1MICBzeW1saW5rICAgICAgICAtcyAgbm9uemVybyBzaXplXG5TVFJJTkcgaXM6XG4gIC1uICBub256ZXJvIHNpemUgICAteiAgemVybyBzaXplICAgICAgKFNUUklORyBieSBpdHNlbGYgaW1wbGllcyAtbilcbkZEIChpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvcikgaXM6XG4gIC10ICBhIFRUWVxuXG4tLS0gVGVzdHMgd2l0aCBvbmUgYXJndW1lbnQgb24gZWFjaCBzaWRlIG9mIGFuIG9wZXJhdG9yOlxuVHdvIHN0cmluZ3M6XG4gID0gIGFyZSBpZGVudGljYWwJICE9ICBkaWZmZXJcblR3byBpbnRlZ2VyczpcbiAgLWVxICBlcXVhbCAgICAgICAgIC1ndCAgZmlyc3QgPiBzZWNvbmQgICAgLWx0ICBmaXJzdCA8IHNlY29uZFxuICAtbmUgIG5vdCBlcXVhbCAgICAgLWdlICBmaXJzdCA+PSBzZWNvbmQgICAtbGUgIGZpcnN0IDw9IHNlY29uZFxuXG4tLS0gTW9kaWZ5IG9yIGNvbWJpbmUgdGVzdHM6XG4gICEgRVhQUiAgICAgbm90IChzd2FwIHRydWUvZmFsc2UpICAgRVhQUiAtYSBFWFBSICAgIGFuZCAoYXJlIGJvdGggdHJ1ZSlcbiAgKCBFWFBSICkgICBldmFsdWF0ZSB0aGlzIGZpcnN0ICAgICBFWFBSIC1vIEVYUFIgICAgb3IgKGlzIGVpdGhlciB0cnVlKVxuXG4iCisKKyNkZWZpbmUgSEVMUF90ZWxuZXRkICJIYW5kbGUgaW5jb21pbmcgdGVsbmV0IGNvbm5lY3Rpb25zXG5cbi1sIExPR0lOICBFeGVjIExPR0lOIG9uIGNvbm5lY3Rcbi1mIElTU1VFX0ZJTEUgRGlzcGxheSBJU1NVRV9GSUxFIGluc3RlYWQgb2YgL2V0Yy9pc3N1ZVxuLUsgQ2xvc2UgY29ubmVjdGlvbiBhcyBzb29uIGFzIGxvZ2luIGV4aXRzXG4tcCBQT1JUICAgUG9ydCB0byBsaXN0ZW4gb25cbi1iIEFERFJbOlBPUlRdICBBZGRyZXNzIHRvIGJpbmQgdG9cbi1GIFJ1biBpbiBmb3JlZ3JvdW5kXG4taSBJbmV0ZCBtb2RlXG4tdyBTRUMgICAgSW5ldGQgJ3dhaXQnIG1vZGUsIGxpbmdlciB0aW1lIFNFQ1xuLVMgTG9nIHRvIHN5c2xvZyAoaW1wbGllZCBieSAtaSBvciB3aXRob3V0IC1GIGFuZCAtdylcblxuIgorCisjZGVmaW5lIEhFTFBfdGVsbmV0ICJ1c2FnZTogdGVsbmV0IEhPU1QgW1BPUlRdXG5cbkNvbm5lY3QgdG8gdGVsbmV0IHNlcnZlclxuXG4iCisKKyNkZWZpbmUgSEVMUF90Y3BzdmQgInVzYWdlOiB0Y3BzdmQgWy1oRXZdIFstYyBOXSBbLUMgTls6TVNHXV0gWy1iIE5dIFstdSBVc2VyXSBbLWwgTmFtZV0gSVAgUG9ydCBQcm9nXG51c2FnZTogdWRwc3ZkIFstaEV2XSBbLWMgTl0gWy11IFVzZXJdIFstbCBOYW1lXSBJUCBQb3J0IFByb2dcblxuQ3JlYXRlIFRDUC9VRFAgc29ja2V0LCBiaW5kIHRvIElQOlBPUlQgYW5kIGxpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbi5cblJ1biBQUk9HIGZvciBlYWNoIGNvbm5lY3Rpb24uXG5cbklQICAgICAgICAgICAgSVAgdG8gbGlzdGVuIG9uLCAwID0gYWxsXG5QT1JUICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uXG5QUk9HIEFSR1MgICAgIFByb2dyYW0gdG8gcnVuXG4tbCBOQU1FICAgICAgIExvY2FsIGhvc3RuYW1lIChlbHNlIGxvb2tzIHVwIGxvY2FsIGhvc3RuYW1lIGluIEROUylcbi11IFVTRVJbOkdSUF0gQ2hhbmdlIHRvIHVzZXIvZ3JvdXAgYWZ0ZXIgYmluZFxuLWMgTiAgICAgICAgICBIYW5kbGUgdXAgdG8gTiAoPiAwKSBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseVxuLWIgTiAgICAgICAgICAoVENQIE9ubHkpIEFsbG93IGEgYmFja2xvZyBvZiBhcHByb3hpbWF0ZWx5IE4gVENQIFNZTnNcbi1DIE5bOk1TR10gICAgKFRDUCBPbmx5KSBBbGxvdyBvbmx5IHVwIHRvIE4gKD4gMCkgY29ubmVjdGlvbnMgZnJvbSB0aGUgc2FtZSBJUFxuICAgICAgICAgICAgICBOZXcgY29ubmVjdGlvbnMgZnJvbSB0aGlzIElQIGFkZHJlc3MgYXJlIGNsb3NlZFxuICAgICAgICAgICAgICBpbW1lZGlhdGVseS4gTVNHIGlzIHdyaXR0ZW4gdG8gdGhlIHBlZXIgYmVmb3JlIGNsb3NlXG4taCAgICAgICAgICAgIExvb2sgdXAgcGVlcidzIGhvc3RuYW1lXG4tRSAgICAgICAgICAgIERvbid0IHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbi12ICAgICAgICAgICAgVmVyYm9zZVxuXG4iCisKKyNkZWZpbmUgSEVMUF90YXIgInVzYWdlOiB0YXIgLVtjeHR6aG12T10gWy1YIEZJTEVdIFstVCBGSUxFXSBbLWYgVEFSRklMRV0gWy1DIERJUl1cblxuQ3JlYXRlLCBleHRyYWN0LCBvciBsaXN0IGZpbGVzIGZyb20gYSB0YXIgZmlsZVxuXG5PcGVyYXRpb246XG5jIENyZWF0ZVxuZiBOYW1lIG9mIFRBUkZJTEUgKCctJyBmb3Igc3RkaW4vb3V0KVxuaCBGb2xsb3cgc3ltbGlua3Ncbm0gRG9uJ3QgcmVzdG9yZSBtdGltZVxudCBMaXN0XG52IFZlcmJvc2VcbnggRXh0cmFjdFxueiAoRGUpY29tcHJlc3MgdXNpbmcgZ3ppcFxuQyBDaGFuZ2UgdG8gRElSIGJlZm9yZSBvcGVyYXRpb25cbk8gRXh0cmFjdCB0byBzdGRvdXRcbmV4Y2x1ZGU9RklMRSBGaWxlIHRvIGV4Y2x1ZGVcblggRmlsZSB3aXRoIG5hbWVzIHRvIGV4Y2x1ZGVcblQgRmlsZSB3aXRoIG5hbWVzIHRvIGluY2x1ZGVcblxuIgorCisjZGVmaW5lIEhFTFBfc3lzbG9nZCAidXNhZ2U6IHN5c2xvZ2QgIFstYSBzb2NrZXRdIFstTyBsb2dmaWxlXSBbLWYgY29uZmlnIGZpbGVdIFstbSBpbnRlcnZhbF1cbiAgICAgICAgICAgICAgICBbLXAgc29ja2V0XSBbLXMgU0laRV0gWy1iIE5dIFstUiBIT1NUXSBbLWwgTl0gWy1uU0xLRF1cblxuU3lzdGVtIGxvZ2dpbmcgdXRpbGl0eVxuXG4tYSAgICAgIEV4dHJhIHVuaXggc29ja2V0IGZvciBsaXN0ZW5cbi1PIEZJTEUgRGVmYXVsdCBsb2cgZmlsZSA8REVGQVVMVDogL3Zhci9sb2cvbWVzc2FnZXM+XG4tZiBGSUxFIENvbmZpZyBmaWxlIDxERUZBVUxUOiAvZXRjL3N5c2xvZy5jb25mPlxuLXAgICAgICBBbHRlcm5hdGl2ZSB1bml4IGRvbWFpbiBzb2NrZXQgPERFRkFVTFQgOiAvZGV2L2xvZz5cbi1uICAgICAgQXZvaWQgYXV0by1iYWNrZ3JvdW5kaW5nLlxuLVMgICAgICBTbWFsbGVyIG91dHB1dFxuLW0gTUFSSyBpbnRlcnZhbCA8REVGQVVMVDogMjAgbWludXRlcz4gKFJBTkdFOiAwIHRvIDcxNTgyNzg3KVxuLVIgSE9TVCBMb2cgdG8gSVAgb3IgaG9zdG5hbWUgb24gUE9SVCAoZGVmYXVsdCBQT1JUPTUxNC9VRFApXCJcbi1MICAgICAgTG9nIGxvY2FsbHkgYW5kIHZpYSBuZXR3b3JrIChkZWZhdWx0IGlzIG5ldHdvcmsgb25seSBpZiAtUilcIlxuLXMgU0laRSBNYXggc2l6ZSAoS0IpIGJlZm9yZSByb3RhdGlvbiAoZGVmYXVsdDoyMDBLQiwgMD1vZmYpXG4tYiBOICAgIHJvdGF0ZWQgbG9ncyB0byBrZWVwIChkZWZhdWx0OjEsIG1heD05OSwgMD1wdXJnZSlcbi1LICAgICAgTG9nIHRvIGtlcm5lbCBwcmludGsgYnVmZmVyICh1c2UgZG1lc2cgdG8gcmVhZCBpdClcbi1sIE4gICAgTG9nIG9ubHkgbWVzc2FnZXMgbW9yZSB1cmdlbnQgdGhhbiBwcmlvKGRlZmF1bHQ6OCBtYXg6OCBtaW46MSlcbi1EICAgICAgRHJvcCBkdXBsaWNhdGVzXG5cbiIKKworI2RlZmluZSBIRUxQX3N1bG9naW4gInVzYWdlOiBzdWxvZ2luIFstdCB0aW1lXSBbdHR5XVxuXG5TaW5nbGUgVXNlciBMb2dpbi5cbi10CURlZmF1bHQgVGltZSBmb3IgU2luZ2xlIFVzZXIgTG9naW5cblxuIgorCisjZGVmaW5lIEhFTFBfZXhpdCAidXNhZ2U6IGV4aXQgW3N0YXR1c11cblxuRXhpdCBzaGVsbC4gIElmIG5vIHJldHVybiB2YWx1ZSBzdXBwbGllZCBvbiBjb21tYW5kIGxpbmUsIHVzZSB2YWx1ZVxub2YgbW9zdCByZWNlbnQgY29tbWFuZCwgb3IgMCBpZiBub25lLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9jZCAidXNhZ2U6IGNkIFstUExdIFtwYXRoXVxuXG5DaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkuICBXaXRoIG5vIGFyZ3VtZW50cywgZ28gJEhPTUUuXG5cbi1QCVBoeXNpY2FsIHBhdGg6IHJlc29sdmUgc3ltbGlua3MgaW4gcGF0aC5cbi1MCUxvY2FsIHBhdGg6IC4uIHRyaW1zIGRpcmVjdG9yaWVzIG9mZiAkUFdEIChkZWZhdWx0KS5cblxuIgorCisjZGVmaW5lIEhFTFBfc2ggInVzYWdlOiBzaCBbLWMgY29tbWFuZF0gW3NjcmlwdF1cblxuQ29tbWFuZCBzaGVsbC4gIFJ1bnMgYSBzaGVsbCBzY3JpcHQsIG9yIHJlYWRzIGlucHV0IGludGVyYWN0aXZlbHlcbmFuZCByZXNwb25kcyB0byBpdC5cblxuLWMJY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGVcbi1pCWludGVyYWN0aXZlIG1vZGUgKGRlZmF1bHQgd2hlbiBTVERJTiBpcyBhIHR0eSlcblxuIgorCisjZGVmaW5lIEhFTFBfcm91dGUgInVzYWdlOiByb3V0ZSBbLW5lXSBbLUEgaW5ldFs2XV0gLyBbYWRkfGRlbF1cblxuRGlzcGxheS9FZGl0IGtlcm5lbCByb3V0aW5nIHRhYmxlcy5cblxuLW4Jbm8gbmFtZSBsb29rdXBzXG4tZQlkaXNwbGF5IG90aGVyL21vcmUgaW5mb3JtYXRpb25cbi1BCWluZXR7Nn0gU2VsZWN0IEFkZHJlc3MgRmFtaWx5XG5cbnJlamVjdCBtb2QgZHluIHJlaW5zdGF0ZSBtZXRyaWMgbmV0bWFzayBndyBtc3Mgd2luZG93IGlydHQgZGV2XG5cbiIKKworI2RlZmluZSBIRUxQX3BpbmcgInVzYWdlOiBwaW5nIFtPUFRJT05TXSBIT1NUXG5cbkNoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5IGJ5IHNlbmRpbmcgcGFja2V0cyB0byBhIGhvc3QgYW5kIHJlcG9ydGluZ1xuaXRzIHJlc3BvbnNlLlxuXG5TZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gaXB2NCBvciBpcHY2IGFkZHJlc3NlcyBhbmQgcHJpbnRzIGVhY2hcbmVjaG8gaXQgcmVjZWl2ZXMgYmFjaywgd2l0aCByb3VuZCB0cmlwIHRpbWUuXG5cbk9wdGlvbnM6XG4tNCwgLTYgICAgICBGb3JjZSBJUHY0IG9yIElQdjZcbi1jIENOVCAgICAgIFNlbmQgQ05UIG1hbnkgcGFja2V0c1xuLUkgSUZBQ0UvSVAgU291cmNlIGludGVyZmFjZSBvciBhZGRyZXNzXG4tcSAgICAgICAgICBRdWlldCwgb25seSBkaXNwbGF5cyBvdXRwdXQgYXQgc3RhcnQgYW5kIHdoZW4gZmluaXNoZWRcbi1zIFNJWkUgICAgIFBhY2tldCBTSVpFIGluIGJ5dGVzIChkZWZhdWx0IDU2KVxuLXQgVFRMICAgICAgU2V0IFRpbWUgKG51bWJlciBvZiBob3BzKSBUbyBMaXZlXG4tVyBTRUMgICAgICBTZWNvbmRzIHRvIHdhaXQgZm9yIHJlc3BvbnNlIGFmdGVyIGFsbCBwYWNrZXRzIHNlbnQgKGRlZmF1bHQgMTApXG4tdyBTRUMgICAgICBFeGl0IGFmdGVyIHRoaXMgbWFueSBzZWNvbmRzXG5cbiIKKworI2RlZmluZSBIRUxQX2RlYWxsb2N2dCAidXNhZ2U6IGRlYWxsb2N2dCBbTl1cblxuRGVhbGxvY2F0ZSB1bnVzZWQgdmlydHVhbCB0ZXJtaW5hbCAvZGV2L3R0eU4sIG9yIGFsbCB1bnVzZWQgY29uc29sZXMuXG5cbiIKKworI2RlZmluZSBIRUxQX29wZW52dCAidXNhZ2U6IG9wZW52dCBbLWMgTl0gWy1zd10gW2NvbW1hbmQgW2NvbW1hbmRfb3B0aW9uc11dXG5cbnN0YXJ0IGEgcHJvZ3JhbSBvbiBhIG5ldyB2aXJ0dWFsIHRlcm1pbmFsIChWVClcblxuLWMgTiAgVXNlIFZUIE5cbi1zICAgIFN3aXRjaCB0byBuZXcgVlRcbi13ICAgIFdhaXQgZm9yIGNvbW1hbmQgdG8gZXhpdFxuXG5pZiAtc3cgdXNlZCB0b2dldGhlciwgc3dpdGNoIGJhY2sgdG8gb3JpZ2luYXRpbmcgVlQgd2hlbiBjb21tYW5kIGNvbXBsZXRlc1xuXG4iCisKKyNkZWZpbmUgSEVMUF9tb3JlICJ1c2FnZTogbW9yZSBbRklMRS4uLl1cblxuVmlldyBGSUxFKHMpIChvciBzdGRpbikgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWUuXG5cbiIKKworI2RlZmluZSBIRUxQX21vZHByb2JlICJ1c2FnZTogbW9kcHJvYmUgWy1hbHJxdnNEYl0gTU9EVUxFIFtzeW1ib2w9dmFsdWVdWy4uLl1cblxubW9kcHJvYmUgdXRpbGl0eSAtIGluc2VydHMgbW9kdWxlcyBhbmQgZGVwZW5kZW5jaWVzLlxuXG4tYSAgTG9hZCBtdWx0aXBsZSBNT0RVTEVzXG4tbCAgTGlzdCAoTU9EVUxFIGlzIGEgcGF0dGVybilcbi1yICBSZW1vdmUgTU9EVUxFIChzdGFja3MpIG9yIGRvIGF1dG9jbGVhblxuLXEgIFF1aWV0XG4tdiAgVmVyYm9zZVxuLXMgIExvZyB0byBzeXNsb2dcbi1EICBTaG93IGRlcGVuZGVuY2llc1xuLWIgIEFwcGx5IGJsYWNrbGlzdCB0byBtb2R1bGUgbmFtZXMgdG9vXG5cbiIKKworI2RlZmluZSBIRUxQX21rZTJmc19leHRlbmRlZCAidXNhZ2U6IG1rZTJmcyBbLUUgc3RyaWRlPSMjI10gWy1PIG9wdGlvblssb3B0aW9uXV1cblxuLUUgc3RyaWRlPSBTZXQgUkFJRCBzdHJpcGUgc2l6ZSAoaW4gYmxvY2tzKVxuLU8gW29wdHNdICBTcGVjaWZ5IGZld2VyIGV4dDIgb3B0aW9uIGZsYWdzIChmb3Igb2xkIGtlcm5lbHMpXG4gICAgICAgICAgIEFsbCBvZiB0aGVzZSBhcmUgb24gYnkgZGVmYXVsdCAoYXMgYXBwcm9wcmlhdGUpXG4gICBub25lICAgICAgICAgQ2xlYXIgZGVmYXVsdCBvcHRpb25zIChhbGwgYnV0IGpvdXJuYWxpbmcpXG4gICBkaXJfaW5kZXggICAgVXNlIGh0cmVlIGluZGV4ZXMgZm9yIGxhcmdlIGRpcmVjdG9yaWVzXG4gICBmaWxldHlwZSAgICAgU3RvcmUgZmlsZSB0eXBlIGluZm8gaW4gZGlyZWN0b3J5IGVudHJ5XG4gICBoYXNfam91cm5hbCAgU2V0IGJ5IC1qXG4gICBqb3VybmFsX2RldiAgU2V0IGJ5IC1KIGRldmljZT1YWFhcbiAgIHNwYXJzZV9zdXBlciBEb24ndCBhbGxvY2F0ZSBodWdlIG51bWJlcnMgb2YgcmVkdW5kYW50IHN1cGVyYmxvY2tzXG5cbiIKKworI2RlZmluZSBIRUxQX21rZTJmc19sYWJlbCAidXNhZ2U6IG1rZTJmcyBbLUwgbGFiZWxdIFstTSBwYXRoXSBbLW8gc3RyaW5nXVxuXG4tTCAgICAgICAgIFZvbHVtZSBsYWJlbFxuLU0gICAgICAgICBQYXRoIHRvIG1vdW50IHBvaW50XG4tbyAgICAgICAgIENyZWF0ZWQgYnlcblxuIgorCisjZGVmaW5lIEhFTFBfbWtlMmZzX2dlbiAidXNhZ2U6IGdlbmUyZnMgW29wdGlvbnNdIGRldmljZSBmaWxlbmFtZVxuXG5UaGUgW29wdGlvbnNdIGFyZSB0aGUgc2FtZSBhcyBta2UyZnMuXG5cbiIKKworI2RlZmluZSBIRUxQX21rZTJmc19qb3VybmFsICJ1c2FnZTogbWtlMmZzIFstal0gWy1KIHNpemU9IyMjLGRldmljZT1YWFhdXG5cbi1qICAgICAgICAgQ3JlYXRlIGpvdXJuYWwgKGV4dDMpXG4tSiAgICAgICAgIEpvdXJuYWwgb3B0aW9uc1xuICAgICAgICAgICBzaXplOiBOdW1iZXIgb2YgYmxvY2tzICgxMDI0LTEwMjQwMClcbiAgICAgICAgICAgZGV2aWNlOiBTcGVjaWZ5IGFuIGV4dGVybmFsIGpvdXJuYWxcblxuIgorCisjZGVmaW5lIEhFTFBfbWtlMmZzICJ1c2FnZTogbWtlMmZzIFstRm5xXSBbLWIgIyMjXSBbLU58aSAjIyNdIFstbSAjIyNdIGRldmljZVxuXG5DcmVhdGUgYW4gZXh0MiBmaWxlc3lzdGVtIG9uIGEgYmxvY2sgZGV2aWNlIG9yIGZpbGVzeXN0ZW0gaW1hZ2UuXG5cbi1GICAgICAgICAgRm9yY2UgdG8gcnVuIG9uIGEgbW91bnRlZCBkZXZpY2Vcbi1uICAgICAgICAgRG9uJ3Qgd3JpdGUgdG8gZGV2aWNlXG4tcSAgICAgICAgIFF1aWV0IChubyBvdXRwdXQpXG4tYiBzaXplICAgIEJsb2NrIHNpemUgKDEwMjQsIDIwNDgsIG9yIDQwOTYpXG4tTiBpbm9kZXMgIEFsbG9jYXRlIHRoaXMgbWFueSBpbm9kZXNcbi1pIGJ5dGVzICAgQWxsb2NhdGUgb25lIGlub2RlIGZvciBldmVyeSBYWFggYnl0ZXMgb2YgZGV2aWNlXG4tbSBwZXJjZW50IFJlc2VydmUgdGhpcyBwZXJjZW50IG9mIGZpbGVzeXN0ZW0gc3BhY2UgZm9yIHJvb3QgdXNlclxuXG4iCisKKyNkZWZpbmUgSEVMUF9tZGV2X2NvbmYgIlRoZSBtZGV2IGNvbmZpZyBmaWxlICgvZXRjL21kZXYuY29uZikgY29udGFpbnMgbGluZXMgdGhhdCBsb29rIGxpa2U6XG5oZFthLXpdWzAtOV0qIDA6MyA2NjBcblxuRWFjaCBsaW5lIG11c3QgY29udGFpbiB0aHJlZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBmaWVsZHMuIFRoZSBmaXJzdFxuZmllbGQgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgb25lIG9yIG1vcmUgZGV2aWNlIG5hbWVzLFxudGhlIHNlY29uZCBhbmQgdGhpcmQgZmllbGRzIGFyZSB1aWQ6Z2lkIGFuZCBmaWxlIHBlcm1pc3Npb25zIGZvclxubWF0Y2hpbmcgZGV2aWVzLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9tZGV2ICJ1c2FnZTogbWRldiBbLXNdXG5cbkNyZWF0ZSBkZXZpY2VzIGluIC9kZXYgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSAvc3lzLlxuXG4tcwlTY2FuIGFsbCBlbnRyaWVzIGluIC9zeXMgdG8gcG9wdWxhdGUgL2Rldi5cblxuIgorCisjZGVmaW5lIEhFTFBfbHNvZiAidXNhZ2U6IGxzb2YgWy1sdF0gWy1wIFBJRDEsUElEMiwuLi5dIFtOQU1FXS4uLlxuXG5MaXN0cyBvcGVuIGZpbGVzLiBJZiBuYW1lcyBhcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgb25seVxudGhvc2UgZmlsZXMgd2lsbCBiZSBzaG93bi5cblxuLWwJbGlzdCB1aWRzIG51bWVyaWNhbGx5XG4tcAlmb3IgZ2l2ZW4gY29tbWEtc2VwYXJhdGVkIHBpZHMgb25seSAoZGVmYXVsdCBhbGwgcGlkcylcbi10CXRlcnNlIChwaWQgb25seSkgb3V0cHV0XG5cbiIKKworI2RlZmluZSBIRUxQX2xvZ2dlciAidXNhZ2U6IGxvZ2dlciBbLXNdIFstdCB0YWddIFstcCBbZmFjaWxpdHkuXXByaW9yaXR5XSBbbWVzc2FnZV1cblxuTG9nIG1lc3NhZ2UgKG9yIHN0ZGluKSB0byBzeXNsb2cuXG5cbiIKKworI2RlZmluZSBIRUxQX2xhc3QgInVzYWdlOiBsYXN0IFstV10gWy1mIEZJTEVdXG5cblNob3cgbGlzdGluZyBvZiBsYXN0IGxvZ2dlZCBpbiB1c2Vycy5cblxuLVcgICAgICBEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiB3aXRob3V0IGhvc3QtY29sdW1uIHRydW5jYXRpb24uXG4tZiBGSUxFIFJlYWQgZnJvbSBmaWxlIEZJTEUgaW5zdGVhZCBvZiAvdmFyL2xvZy93dG1wLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9rbG9nZCAidXNhZ2U6IGtsb2dkIFstbl0gWy1jIE5dXG5cbi1jICBOICAgUHJpbnQgdG8gY29uc29sZSBtZXNzYWdlcyBtb3JlIHVyZ2VudCB0aGFuIHByaW8gTiAoMS04KVwiXG4tbiAgICBSdW4gaW4gZm9yZWdyb3VuZC5cblxuIgorCisjZGVmaW5lIEhFTFBfaXBjcyAidXNhZ2U6IGlwY3MgW1stc21xXSAtaSBzaG1pZF0gfCBbWy1hc21xXSBbLXRjcGx1XV1cblxuLWkgU2hvdyBzcGVjaWZpYyByZXNvdXJjZVxuUmVzb3VyY2Ugc3BlY2lmaWNhdGlvbjpcbi1hIEFsbCAoZGVmYXVsdClcbi1tIFNoYXJlZCBtZW1vcnkgc2VnbWVudHNcbi1xIE1lc3NhZ2UgcXVldWVzXG4tcyBTZW1hcGhvcmUgYXJyYXlzXG5PdXRwdXQgZm9ybWF0OlxuLWMgQ3JlYXRvclxuLWwgTGltaXRzXG4tcCBQaWRcbi10IFRpbWVcbi11IFN1bW1hcnlcblxuIgorCisjZGVmaW5lIEhFTFBfaXBjcm0gInVzYWdlOiBpcGNybSBbIFstcSBtc3FpZF0gWy1tIHNobWlkXSBbLXMgc2VtaWRdXG4gICAgICAgICAgWy1RIG1zZ2tleV0gWy1NIHNobWtleV0gWy1TIHNlbWtleV0gLi4uIF1cblxuLW1NIFJlbW92ZSBtZW1vcnkgc2VnbWVudCBhZnRlciBsYXN0IGRldGFjaFxuLXFRIFJlbW92ZSBtZXNzYWdlIHF1ZXVlXG4tc1MgUmVtb3ZlIHNlbWFwaG9yZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9pcCAidXNhZ2U6IGlwIFsgT1BUSU9OUyBdIE9CSkVDVCB7IENPTU1BTkQgfVxuXG5TaG93IC8gbWFuaXB1bGF0ZSByb3V0aW5nLCBkZXZpY2VzLCBwb2xpY3kgcm91dGluZyBhbmQgdHVubmVscy5cblxud2hlcmUgT0JKRUNUIDo9IHthZGRyZXNzIHwgbGluayB8IHJvdXRlIHwgcnVsZSB8IHR1bm5lbH1cbk9QVElPTlMgOj0geyAtZlthbWlseV0geyBpbmV0IHwgaW5ldDYgfCBsaW5rIH0gfCAtb1tuZWxpbmVdIH1cblxuIgorCisjZGVmaW5lIEhFTFBfaW5pdCAidXNhZ2U6IGluaXRcblxuU3lzdGVtIFYgc3R5bGUgaW5pdC5cblxuRmlyc3QgcHJvZ3JhbSB0byBydW4gKGFzIFBJRCAxKSB3aGVuIHRoZSBzeXN0ZW0gY29tZXMgdXAsIHJlYWRpbmdcbi9ldGMvaW5pdHRhYiB0byBkZXRlcm1pbmUgYWN0aW9ucy5cblxuIgorCisjZGVmaW5lIEhFTFBfaWNvbnYgInVzYWdlOiBpY29udiBbLWYgRlJPTV0gWy10IFRPXSBbRklMRS4uLl1cblxuQ29udmVydCBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgZmlsZXMuXG5cbi1mICBjb252ZXJ0IGZyb20gKGRlZmF1bHQgdXRmOClcbi10ICBjb252ZXJ0IHRvICAgKGRlZmF1bHQgdXRmOClcblxuIgorCisjZGVmaW5lIEhFTFBfaG9zdCAidXNhZ2U6IGhvc3QgWy1hdl0gWy10IFRZUEVdIE5BTUUgW1NFUlZFUl1cblxuUGVyZm9ybSBETlMgbG9va3VwIG9uIE5BTUUsIHdoaWNoIGNhbiBiZSBhIGRvbWFpbiBuYW1lIHRvIGxvb2t1cCxcbm9yIGFuIGlwdjQgZG90dGVkIG9yIGlwdjYgY29sb24gc2VwcmF0ZWQgYWRkcmVzcyB0byByZXZlcnNlIGxvb2t1cC5cblNFUlZFUiAoaWYgcHJlc2VudCkgaXMgdGhlIEROUyBzZXJ2ZXIgdG8gdXNlLlxuXG4tYQlubyBpZGVhXG4tdAlub3QgYSBjbHVlXG4tdgl2ZXJib3NlXG5cbiIKKworI2RlZmluZSBIRUxQX2dyb3VwZGVsICJ1c2FnZTogZ3JvdXBkZWwgW1VTRVJdIEdST1VQXG5cbkRlbGV0ZSBhIGdyb3VwIG9yIHJlbW92ZSBhIHVzZXIgZnJvbSBhIGdyb3VwXG5cbiIKKworI2RlZmluZSBIRUxQX2dyb3VwYWRkICJ1c2FnZTogZ3JvdXBhZGQgWy1TXSBbLWcgR0lEXSBbVVNFUl0gR1JPVVBcblxuQWRkIGEgZ3JvdXAgb3IgYWRkIGEgdXNlciB0byBhIGdyb3VwXG5cbiAgLWcgR0lEIEdyb3VwIGlkXG4gIC1TICAgICBDcmVhdGUgYSBzeXN0ZW0gZ3JvdXBcblxuIgorCisjZGVmaW5lIEhFTFBfZ2V0dHkgInVzYWdlOiBnZXR0eSBbT1BUSU9OU10gQkFVRF9SQVRFWyxCQVVEX1JBVEVdLi4uIFRUWSBbVEVSTVRZUEVdXG5cbi1oICAgIEVuYWJsZSBoYXJkd2FyZSBSVFMvQ1RTIGZsb3cgY29udHJvbFxuLUwgICAgU2V0IENMT0NBTCAoaWdub3JlIENhcnJpZXIgRGV0ZWN0IHN0YXRlKVxuLW0gICAgR2V0IGJhdWQgcmF0ZSBmcm9tIG1vZGVtJ3MgQ09OTkVDVCBzdGF0dXMgbWVzc2FnZVxuLW4gICAgRG9uJ3QgcHJvbXB0IGZvciBsb2dpbiBuYW1lXG4tdyAgICBXYWl0IGZvciBDUiBvciBMRiBiZWZvcmUgc2VuZGluZyAvZXRjL2lzc3VlXG4taSAgICBEb24ndCBkaXNwbGF5IC9ldGMvaXNzdWVcbi1mIElTU1VFX0ZJTEUgIERpc3BsYXkgSVNTVUVfRklMRSBpbnN0ZWFkIG9mIC9ldGMvaXNzdWVcbi1sIExPR0lOICBJbnZva2UgTE9HSU4gaW5zdGVhZCBvZiAvYmluL2xvZ2luXG4tdCBTRUMgICAgVGVybWluYXRlIGFmdGVyIFNFQyBpZiBubyBsb2dpbiBuYW1lIGlzIHJlYWRcbi1JIElOSVRTVFIgIFNlbmQgSU5JVFNUUiBiZWZvcmUgYW55dGhpbmcgZWxzZVxuLUggSE9TVCAgICBMb2cgSE9TVCBpbnRvIHRoZSB1dG1wIGZpbGUgYXMgdGhlIGhvc3RuYW1lXG5cbiIKKworI2RlZmluZSBIRUxQX2dldGZhdHRyICJ1c2FnZTogZ2V0ZmF0dHIgWy1kXSBbLWhdIFstbiBOQU1FXSBGSUxFLi4uXG5cblJlYWQgUE9TSVggZXh0ZW5kZWQgYXR0cmlidXRlcy5cblxuLWQJU2hvdyB2YWx1ZXMgYXMgd2VsbCBhcyBuYW1lcy5cbi1oCURvIG5vdCBkZXJlZmVyZW5jZSBzeW1ib2xpYyBsaW5rcy5cbi1uCVNob3cgb25seSBhdHRyaWJ1dGVzIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cbiIKKworI2RlZmluZSBIRUxQX2Z0cGdldCAidXNhZ2U6IGZ0cGdldCBbLWN2XSBbLXUgVVNFUiAtcCBQQVNTV09SRCAtUCBQT1JUXSBIT1NUX05BTUUgW0xPQ0FMX0ZJTEVOQU1FXSBSRU1PVEVfRklMRU5BTUVcbnVzYWdlOiBmdHBwdXQgWy12XSBbLXUgVVNFUiAtcCBQQVNTV09SRCAtUCBQT1JUXSBIT1NUX05BTUUgW1JFTU9URV9GSUxFTkFNRV0gTE9DQUxfRklMRU5BTUVcblxuZnRwZ2V0IC0gR2V0IGEgcmVtb3RlIGZpbGUgZnJvbSBGVFAuXG5mdHBwdXQgLSBVcGxvYWQgYSBsb2NhbCBmaWxlIG9uIHJlbW90ZSBtYWNoaW5lIHRocm91Z2ggRlRQLlxuXG4tYyBDb250aW51ZSBwcmV2aW91cyB0cmFuc2Zlci5cbi12IFZlcmJvc2UuXG4tdSBVc2VyIG5hbWUuXG4tcCBQYXNzd29yZC5cbi1QIFBvcnQgTnVtYmVyIChkZWZhdWx0IDIxKS5cblxuIgorCisjZGVmaW5lIEhFTFBfZnNjayAidXNhZ2U6IGZzY2sgWy1BTlBSVFZdIFstQyBGRF0gWy10IEZTVFlQRV0gW0ZTX09QVFNdIFtCTE9DS0RFVl0uLi5cblxuQ2hlY2sgYW5kIHJlcGFpciBmaWxlc3lzdGVtc1xuXG4tQSAgICAgIFdhbGsgL2V0Yy9mc3RhYiBhbmQgY2hlY2sgYWxsIGZpbGVzeXN0ZW1zXG4tTiAgICAgIERvbid0IGV4ZWN1dGUsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmVcbi1QICAgICAgV2l0aCAtQSwgY2hlY2sgZmlsZXN5c3RlbXMgaW4gcGFyYWxsZWxcbi1SICAgICAgV2l0aCAtQSwgc2tpcCB0aGUgcm9vdCBmaWxlc3lzdGVtXG4tVCAgICAgIERvbid0IHNob3cgdGl0bGUgb24gc3RhcnR1cFxuLVYgICAgICBWZXJib3NlXG4tQyBuICAgIFdyaXRlIHN0YXR1cyBpbmZvcm1hdGlvbiB0byBzcGVjaWZpZWQgZmlsZWRlc2NyaXB0b3Jcbi10IFRZUEUgTGlzdCBvZiBmaWxlc3lzdGVtIHR5cGVzIHRvIGNoZWNrXG5cblxuIgorCisjZGVmaW5lIEhFTFBfZm9sZCAidXNhZ2U6IGZvbGQgWy1ic3VdIFstdyBXSURUSF0gW0ZJTEUuLi5dXG5cbkZvbGRzICh3cmFwcykgb3IgdW5mb2xkcyBhc2NpaSB0ZXh0IGJ5IGFkZGluZyBvciByZW1vdmluZyBuZXdsaW5lcy5cbkRlZmF1bHQgbGluZSB3aWR0aCBpcyA4MCBjb2x1bW5zIGZvciBmb2xkaW5nIGFuZCBpbmZpbml0ZSBmb3IgdW5mb2xkaW5nLlxuXG4tYglGb2xkIGJhc2VkIG9uIGJ5dGVzIGluc3RlYWQgb2YgY29sdW1uc1xuLXMJRm9sZC91bmZvbGQgYXQgd2hpdGVzcGFjZSBib3VuZGFyaWVzIGlmIHBvc3NpYmxlXG4tdQlVbmZvbGQgdGV4dCAoYW5kIHJlZm9sZCBpZiAtdyBpcyBnaXZlbilcbi13CVNldCBsaW5lcyB0byBXSURUSCBjb2x1bW5zIG9yIGJ5dGVzXG5cbiIKKworI2RlZmluZSBIRUxQX2ZkaXNrICJ1c2FnZTogZmRpc2sgWy1sdV0gWy1DIENZTElOREVSU10gWy1IIEhFQURTXSBbLVMgU0VDVE9SU10gWy1iIFNFQ1RTWl0gRElTS1xuXG5DaGFuZ2UgcGFydGl0aW9uIHRhYmxlXG5cbi11ICAgICAgICAgICAgU3RhcnQgYW5kIEVuZCBhcmUgaW4gc2VjdG9ycyAoaW5zdGVhZCBvZiBjeWxpbmRlcnMpXG4tbCAgICAgICAgICAgIFNob3cgcGFydGl0aW9uIHRhYmxlIGZvciBlYWNoIERJU0ssIHRoZW4gZXhpdFxuLWIgc2l6ZSAgICAgICBzZWN0b3Igc2l6ZSAoNTEyLCAxMDI0LCAyMDQ4IG9yIDQwOTYpXG4tQyBDWUxJTkRFUlMgIFNldCBudW1iZXIgb2YgY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnNcbi1IIEhFQURTXG4tUyBTRUNUT1JTXG5cbiIKKworI2RlZmluZSBIRUxQX2V4cHIgInVzYWdlOiBleHByIEFSRzEgT1BFUkFUT1IgQVJHMi4uLlxuXG5FdmFsdWF0ZSBleHByZXNzaW9uIGFuZCBwcmludCByZXN1bHQuIEZvciBleGFtcGxlLCBcImV4cHIgMSArIDJcIi5cblxuVGhlIHN1cHBvcnRlZCBvcGVyYXRvcnMgYXJlIChncm91cGVkIGZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJpb3JpdHkpOlxuXG4gICggKSAgICA6ICAgICogLyAlICAgICsgLSAgICAhPSA8PSA8ID49ID4gPSAgICAmICAgIHxcblxuRWFjaCBjb25zdGFudCBhbmQgb3BlcmF0b3IgbXVzdCBiZSBhIHNlcGFyYXRlIGNvbW1hbmQgbGluZSBhcmd1bWVudC5cbkFsbCBvcGVyYXRvcnMgYXJlIGluZml4LCBtZWFuaW5nIHRoZXkgZXhwZWN0IGEgY29uc3RhbnQgKG9yIGV4cHJlc3Npb25cbnRoYXQgcmVzb2x2ZXMgdG8gYSBjb25zdGFudCkgb24gZWFjaCBzaWRlIG9mIHRoZSBvcGVyYXRvci4gT3BlcmF0b3JzIG9mXG50aGUgc2FtZSBwcmlvcml0eSAod2l0aGluIGVhY2ggZ3JvdXAgYWJvdmUpIGFyZSBldmFsdWF0ZWQgbGVmdCB0byByaWdodC5cblBhcmVudGhlc2VzIG1heSBiZSB1c2VkIChhcyBzZXBhcmF0ZSBhcmd1bWVudHMpIHRvIGVsZXZhdGUgdGhlIHByaW9yaXR5XG5vZiBleHByZXNzaW9ucy5cblxuQ2FsbGluZyBleHByIGZyb20gYSBjb21tYW5kIHNoZWxsIHJlcXVpcmVzIGEgbG90IG9mIFxcKCBvciAnKicgZXNjYXBpbmdcbnRvIGF2b2lkIGludGVycHJldGluZyBzaGVsbCBjb250cm9sIGNoYXJhY3RlcnMuXG5cblRoZSAmIGFuZCB8IG9wZXJhdG9ycyBhcmUgbG9naWNhbCAobm90IGJpdHdpc2UpIGFuZCBtYXkgb3BlcmF0ZSBvblxuc3RyaW5ncyAoYSBibGFuayBzdHJpbmcgaXMgXCJmYWxzZVwiKS4gQ29tcGFyaXNvbiBvcGVyYXRvcnMgbWF5IGFsc29cbm9wZXJhdGUgb24gc3RyaW5ncyAoYWxwaGFiZXRpY2FsIHNvcnQpLlxuXG5Db25zdGFudHMgbWF5IGJlIHN0cmluZ3Mgb3IgaW50ZWdlcnMuIENvbXBhcmlzb24sIGxvZ2ljYWwsIGFuZCByZWdleFxub3BlcmF0b3JzIG1heSBvcGVyYXRlIG9uIHN0cmluZ3MgKGEgYmxhbmsgc3RyaW5nIGlzIFwiZmFsc2VcIiksIG90aGVyXG5vcGVyYXRvcnMgcmVxdWlyZSBpbnRlZ2Vycy5cblxuIgorCisjZGVmaW5lIEhFTFBfZHVtcGxlYXNlcyAidXNhZ2U6IGR1bXBsZWFzZXMgWy1yfC1hXSBbLWYgTEVBU0VGSUxFXVxuXG5EaXNwbGF5IERIQ1AgbGVhc2VzIGdyYW50ZWQgYnkgdWRoY3BkXG4tZiBGSUxFLCAgTGVhc2UgZmlsZVxuLXIgICAgICAgIFNob3cgcmVtYWluaW5nIHRpbWVcbi1hICAgICAgICBTaG93IGV4cGlyYXRpb24gdGltZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9kaWZmICJ1c2FnZTogZGlmZiBbLWFiQmRpTnFyVHN0d10gWy1MIExBQkVMXSBbLVMgRklMRV0gWy1VIExJTkVTXSBGSUxFMSBGSUxFMlxuXG4tYSAgVHJlYXQgYWxsIGZpbGVzIGFzIHRleHRcbi1iICBJZ25vcmUgY2hhbmdlcyBpbiB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2Vcbi1CICBJZ25vcmUgY2hhbmdlcyB3aG9zZSBsaW5lcyBhcmUgYWxsIGJsYW5rXG4tZCAgVHJ5IGhhcmQgdG8gZmluZCBhIHNtYWxsZXIgc2V0IG9mIGNoYW5nZXNcbi1pICBJZ25vcmUgY2FzZSBkaWZmZXJlbmNlc1xuLUwgIFVzZSBMQUJFTCBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZSBpbiB0aGUgdW5pZmllZCBoZWFkZXJcbi1OICBUcmVhdCBhYnNlbnQgZmlsZXMgYXMgZW1wdHlcbi1xICBPdXRwdXQgb25seSB3aGV0aGVyIGZpbGVzIGRpZmZlclxuLXIgIFJlY3Vyc2Vcbi1TICBTdGFydCB3aXRoIEZJTEUgd2hlbiBjb21wYXJpbmcgZGlyZWN0b3JpZXNcbi1UICBNYWtlIHRhYnMgbGluZSB1cCBieSBwcmVmaXhpbmcgYSB0YWIgd2hlbiBuZWNlc3Nhcnlcbi1zICBSZXBvcnQgd2hlbiB0d28gZmlsZXMgYXJlIHRoZSBzYW1lXG4tdCAgRXhwYW5kIHRhYnMgdG8gc3BhY2VzIGluIG91dHB1dFxuLVUgIE91dHB1dCBMSU5FUyBsaW5lcyBvZiBjb250ZXh0XG4tdyAgSWdub3JlIGFsbCB3aGl0ZXNwYWNlXG5cbiIKKworI2RlZmluZSBIRUxQX2RoY3BkICJ1c2FnZTogZGhjcGQgWy00NmZTXSBbLWkgSUZBQ0VdIFstUCBOXSBbQ09ORkZJTEVdXG5cbiAtZiAgICBSdW4gaW4gZm9yZWdyb3VuZFxuIC1pIEludGVyZmFjZSB0byB1c2VcbiAtUyAgICBMb2cgdG8gc3lzbG9nIHRvb1xuIC1QIE4gIFVzZSBwb3J0IE4gKGRlZmF1bHQgaXB2NCA2NywgaXB2NiA1NDcpXG4gLTQsIC02ICAgIFJ1biBhcyBhIERIQ1B2NCBvciBESENQdjYgc2VydmVyXG5cbiIKKworI2RlZmluZSBIRUxQX2RoY3AgInVzYWdlOiBkaGNwIFstZmJucXZvQ1JCXSBbLWkgSUZBQ0VdIFstciBJUF0gWy1zIFBST0ddIFstcCBQSURGSUxFXVxuICAgICAgICAgICAgWy1IIEhPU1ROQU1FXSBbLVYgVkVORE9SXSBbLXggT1BUOlZBTF0gWy1PIE9QVF1cblxuICAgICBDb25maWd1cmUgbmV0d29yayBkeW5hbWljYWx5IHVzaW5nIERIQ1AuXG5cbiAgIC1pIEludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMClcbiAgIC1wIENyZWF0ZSBwaWRmaWxlXG4gICAtcyBSdW4gUFJPRyBhdCBESENQIGV2ZW50cyAoZGVmYXVsdCAvdXNyL3NoYXJlL2RoY3AvZGVmYXVsdC5zY3JpcHQpXG4gICAtQiBSZXF1ZXN0IGJyb2FkY2FzdCByZXBsaWVzXG4gICAtdCBTZW5kIHVwIHRvIE4gZGlzY292ZXIgcGFja2V0c1xuICAgLVQgUGF1c2UgYmV0d2VlbiBwYWNrZXRzIChkZWZhdWx0IDMgc2Vjb25kcylcbiAgIC1BIFdhaXQgTiBzZWNvbmRzIGFmdGVyIGZhaWx1cmUgKGRlZmF1bHQgMjApXG4gICAtZiBSdW4gaW4gZm9yZWdyb3VuZFxuICAgLWIgQmFja2dyb3VuZCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWRcbiAgIC1uIEV4aXQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkXG4gICAtcSBFeGl0IGFmdGVyIG9idGFpbmluZyBsZWFzZVxuICAgLVIgUmVsZWFzZSBJUCBvbiBleGl0XG4gICAtUyBMb2cgdG8gc3lzbG9nIHRvb1xuICAgLWEgVXNlIGFycGluZyB0byB2YWxpZGF0ZSBvZmZlcmVkIGFkZHJlc3NcbiAgIC1PIFJlcXVlc3Qgb3B0aW9uIE9QVCBmcm9tIHNlcnZlciAoY3VtdWxhdGl2ZSlcbiAgIC1vIERvbid0IHJlcXVlc3QgYW55IG9wdGlvbnMgKHVubGVzcyAtTyBpcyBnaXZlbilcbiAgIC1yIFJlcXVlc3QgdGhpcyBJUCBhZGRyZXNzXG4gICAteCBPUFQ6VkFMICBJbmNsdWRlIG9wdGlvbiBPUFQgaW4gc2VudCBwYWNrZXRzIChjdW11bGF0aXZlKVxuICAgLUYgQXNrIHNlcnZlciB0byB1cGRhdGUgRE5TIG1hcHBpbmcgZm9yIE5BTUVcbiAgIC1IIFNlbmQgTkFNRSBhcyBjbGllbnQgaG9zdG5hbWUgKGRlZmF1bHQgbm9uZSlcbiAgIC1WIFZFTkRPUiBWZW5kb3IgaWRlbnRpZmllciAoZGVmYXVsdCAndG95Ym94IFZFUlNJT04nKVxuICAgLUMgRG9uJ3Qgc2VuZCBNQUMgYXMgY2xpZW50IGlkZW50aWZpZXJcbiAgIC12IFZlcmJvc2VcblxuICAgU2lnbmFsczpcbiAgIFVTUjEgIFJlbmV3IGN1cnJlbnQgbGVhc2VcbiAgIFVTUjIgIFJlbGVhc2UgY3VycmVudCBsZWFzZVxuXG5cbiIKKworI2RlZmluZSBIRUxQX2RoY3A2ICJ1c2FnZTogZGhjcDYgWy1mYm5xdlJdIFstaSBJRkFDRV0gWy1yIElQXSBbLXMgUFJPR10gWy1wIFBJREZJTEVdXG5cbiAgICAgIENvbmZpZ3VyZSBuZXR3b3JrIGR5bmFtaWNhbHkgdXNpbmcgREhDUC5cblxuICAgIC1pIEludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMClcbiAgICAtcCBDcmVhdGUgcGlkZmlsZVxuICAgIC1zIFJ1biBQUk9HIGF0IERIQ1AgZXZlbnRzXG4gICAgLXQgU2VuZCB1cCB0byBOIFNvbGljaXQgcGFja2V0c1xuICAgIC1UIFBhdXNlIGJldHdlZW4gcGFja2V0cyAoZGVmYXVsdCAzIHNlY29uZHMpXG4gICAgLUEgV2FpdCBOIHNlY29uZHMgYWZ0ZXIgZmFpbHVyZSAoZGVmYXVsdCAyMClcbiAgICAtZiBSdW4gaW4gZm9yZWdyb3VuZFxuICAgIC1iIEJhY2tncm91bmQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkXG4gICAgLW4gRXhpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWRcbiAgICAtcSBFeGl0IGFmdGVyIG9idGFpbmluZyBsZWFzZVxuICAgIC1SIFJlbGVhc2UgSVAgb24gZXhpdFxuICAgIC1TIExvZyB0byBzeXNsb2cgdG9vXG4gICAgLXIgUmVxdWVzdCB0aGlzIElQIGFkZHJlc3NcbiAgICAtdiBWZXJib3NlXG5cbiAgICBTaWduYWxzOlxuICAgIFVTUjEgIFJlbmV3IGN1cnJlbnQgbGVhc2VcbiAgICBVU1IyICBSZWxlYXNlIGN1cnJlbnQgbGVhc2VcblxuIgorCisjZGVmaW5lIEhFTFBfZGQgInVzYWdlOiBkZCBbaWY9RklMRV0gW29mPUZJTEVdIFtpYnM9Tl0gW29icz1OXSBbYnM9Tl0gW2NvdW50PU5dIFtza2lwPU5dXG4gICAgICAgIFtzZWVrPU5dIFtjb252PW5vdHJ1bmN8bm9lcnJvcnxzeW5jfGZzeW5jXSBbc3RhdHVzPW5veGZlcnxub25lXVxuXG5PcHRpb25zOlxuaWY9RklMRSAgIFJlYWQgZnJvbSBGSUxFIGluc3RlYWQgb2Ygc3RkaW5cbm9mPUZJTEUgICBXcml0ZSB0byBGSUxFIGluc3RlYWQgb2Ygc3Rkb3V0XG5icz1OICAgICAgUmVhZCBhbmQgd3JpdGUgTiBieXRlcyBhdCBhIHRpbWVcbmlicz1OICAgICBSZWFkIE4gYnl0ZXMgYXQgYSB0aW1lXG5vYnM9TiAgICAgV3JpdGUgTiBieXRlcyBhdCBhIHRpbWVcbmNvdW50PU4gICBDb3B5IG9ubHkgTiBpbnB1dCBibG9ja3NcbnNraXA9TiAgICBTa2lwIE4gaW5wdXQgYmxvY2tzXG5zZWVrPU4gICAgU2tpcCBOIG91dHB1dCBibG9ja3NcbmNvbnY9bm90cnVuYyAgRG9uJ3QgdHJ1bmNhdGUgb3V0cHV0IGZpbGVcbmNvbnY9bm9lcnJvciAgQ29udGludWUgYWZ0ZXIgcmVhZCBlcnJvcnNcbmNvbnY9c3luYyAgICAgUGFkIGJsb2NrcyB3aXRoIHplcm9zXG5jb252PWZzeW5jICAgIFBoeXNpY2FsbHkgd3JpdGUgZGF0YSBvdXQgYmVmb3JlIGZpbmlzaGluZ1xuc3RhdHVzPW5veGZlciBEb24ndCBzaG93IHRyYW5zZmVyIHJhdGVcbnN0YXR1cz1ub25lICAgRG9uJ3Qgc2hvdyB0cmFuc2ZlciByYXRlIG9yIHJlY29yZHMgaW4vb3V0XG5cbk51bWJlcnMgbWF5IGJlIHN1ZmZpeGVkIGJ5IGMgKCoxKSwgdyAoKjIpLCBiICgqNTEyKSwga0QgKCoxMDAwKSwgayAoKjEwMjQpLFxuTUQgKCoxMDAwKjEwMDApLCBNICgqMTAyNCoxMDI0KSwgR0QgKCoxMDAwKjEwMDAqMTAwMCkgb3IgRyAoKjEwMjQqMTAyNCoxMDI0KS5cblxuIgorCisjZGVmaW5lIEhFTFBfY3JvbnRhYiAidXNhZ2U6IGNyb250YWIgWy11IHVzZXJdIEZJTEVcbiAgICAgICAgICAgICAgIFstdSB1c2VyXSBbLWUgfCAtbCB8IC1yXVxuICAgICAgICAgICAgICAgWy1jIGRpcl1cblxuRmlsZXMgdXNlZCB0byBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIHByb2dyYW1zLlxuXG4tYyBjcm9udGFiIGRpclxuLWUgZWRpdCB1c2VyJ3MgY3JvbnRhYlxuLWwgbGlzdCB1c2VyJ3MgY3JvbnRhYlxuLXIgZGVsZXRlIHVzZXIncyBjcm9udGFiXG4tdSB1c2VyXG5GSUxFIFJlcGxhY2UgY3JvbnRhYiBieSBGSUxFICgnLSc6IHN0ZGluKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9jcm9uZCAidXNhZ2U6IGNyb25kIFstZmJTXSBbLWwgTl0gWy1kIE5dIFstTCBMT0dGSUxFXSBbLWMgRElSXVxuXG5BIGRhZW1vbiB0byBleGVjdXRlIHNjaGVkdWxlZCBjb21tYW5kcy5cblxuLWIgQmFja2dyb3VuZCAoZGVmYXVsdClcbi1jIGNyb250YWIgZGlyXG4tZCBTZXQgbG9nIGxldmVsLCBsb2cgdG8gc3RkZXJyXG4tZiBGb3JlZ3JvdW5kXG4tbCBTZXQgbG9nIGxldmVsLiAwIGlzIHRoZSBtb3N0IHZlcmJvc2UsIGRlZmF1bHQgOFxuLVMgTG9nIHRvIHN5c2xvZyAoZGVmYXVsdClcbi1MIExvZyB0byBmaWxlXG5cbiIKKworI2RlZmluZSBIRUxQX2d1bnppcCAidXNhZ2U6IGd1bnppcCBbLWNmbHFTdHZdIFtGSUxFLi4uXVxuXG5EZWNvbXBlc3MgKGRlZmxhdGUpIGZpbGUocykuIFdpdGggbm8gZmlsZXMsIGNvbXByZXNzIHN0ZGluIHRvIHN0ZG91dC5cblxuT24gc3VjY2Vzc2Z1bCBkZWNvbXByZXNzaW9uLCBjb21wcmVzc2VkIGZpbGVzIGFyZSByZXBsYWNlZCB3aXRoIHRoZVxudW5jb21wcmVzc2VkIHZlcnNpb24uIFRoZSBpbnB1dCBmaWxlIGlzIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGhcbmEgbmV3IGZpbGUgd2l0aG91dCB0aGUgLmd6IGV4dGVuc2lvbiAod2l0aCBzYW1lIG93bmVyc2hpcC9wZXJtaXNzaW9ucykuXG5cbi1jCWNhdCB0byBzdGRvdXQgKGFjdCBhcyB6Y2F0KVxuLWYJZm9yY2UgKG91dHB1dCBmaWxlIGV4aXN0cywgaW5wdXQgaXMgdHR5LCB1bnJlY29nbml6ZWQgZXh0ZW5zaW9uKVxuLWwJbGlzdCBjb21wcmVzc2VkL3VuY29tcHJlc3NlZC9yYXRpby9uYW1lIGZvciBlYWNoIGlucHV0IGZpbGUuXG4tcQlxdWlldCAobm8gd2FybmluZ3MpXG4tUwlzcGVjaWZ5IGV4ZW5zaW9uIChkZWZhdWx0IC4qKVxuLXQJdGVzdCBjb21wcmVzc2VkIGZpbGUocylcbi12CXZlcmJvc2UgKGxpa2UgLWwsIGJ1dCBkZWNvbXByZXNzIGZpbGVzKVxuXG4iCisKKyNkZWZpbmUgSEVMUF96Y2F0ICJ1c2FnZTogemNhdCBbRklMRS4uLl1cblxuRGVjb21wcmVzcyBkZWZsYXRlZCBmaWxlKHMpIHRvIHN0ZG91dFxuXG4iCisKKyNkZWZpbmUgSEVMUF9kZWNvbXByZXNzICJ1c2FnZTogY29tcHJlc3MgWy16Z2xyY2Q5XSBbRklMRV1cblxuQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlIChvciBzdGRpbikgdXNpbmcgXCJkZWZsYXRlXCIgYWxnb3JpdGhtLlxuXG4tYwljb21wcmVzcyB3aXRoIC1nIGd6aXAgKGRlZmF1bHQpICAtbCB6bGliICAtciByYXcgIC16IHppcFxuLWQJZGVjb21wcmVzcyAoYXV0b2RldGVjdHMgdHlwZSlcblxuXG4iCisKKyNkZWZpbmUgSEVMUF9nemlwX2QgInVzYWdlOiBnemlwIFstZF1cblxuLWQJZGVjb21wcmVzcyAoYWN0IGFzIGd1bnppcClcblxuIgorCisjZGVmaW5lIEhFTFBfZ3ppcCAidXNhZ2U6IGd6aXAgWy0xOWNmcVN0dnpnTFJdIFtGSUxFLi4uXVxuXG5Db21wZXNzIChkZWZsYXRlKSBmaWxlKHMpLiBXaXRoIG5vIGZpbGVzLCBjb21wcmVzcyBzdGRpbiB0byBzdGRvdXQuXG5cbk9uIHN1Y2Nlc3NmdWwgZGVjb21wcmVzc2lvbiwgY29tcHJlc3NlZCBmaWxlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGVcbnVuY29tcHJlc3NlZCB2ZXJzaW9uLiBUaGUgaW5wdXQgZmlsZSBpcyByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoXG5hIG5ldyBmaWxlIHdpdGhvdXQgdGhlIC5neiBleHRlbnNpb24gKHdpdGggc2FtZSBvd25lcnNoaXAvcGVybWlzc2lvbnMpLlxuXG4tMQlNaW5pbWFsIGNvbXByZXNzaW9uIChmYXN0ZXN0KVxuLTkJTWF4IGNvbXByZXNzaW9uIChkZWZhdWx0KVxuLWMJY2F0IHRvIHN0ZG91dCAoYWN0IGFzIHpjYXQpXG4tZglmb3JjZSAoaWYgb3V0cHV0IGZpbGUgZXhpc3RzLCBpbnB1dCBpcyB0dHksIHVucmVjb2duaXplZCBleHRlbnNpb24pXG4tcQlxdWlldCAobm8gd2FybmluZ3MpXG4tUwlzcGVjaWZ5IGV4ZW5zaW9uIChkZWZhdWx0IC4qKVxuLXQJdGVzdCBjb21wcmVzc2VkIGZpbGUocylcbi12CXZlcmJvc2UgKGxpa2UgLWwsIGJ1dCBjb21wcmVzcyBmaWxlcylcblxuQ29tcHJlc3Npb24gdHlwZTpcbi1nIGd6aXAgKGRlZmF1bHQpICAgIC1MIHpsaWIgICAgLVIgcmF3ICAgIC16IHppcFxuXG4iCisKKyNkZWZpbmUgSEVMUF9jb21wcmVzcyAidXNhZ2U6IGNvbXByZXNzIFstemdMUjE5XSBbRklMRV1cblxuQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlIChvciBzdGRpbikgdXNpbmcgXCJkZWZsYXRlXCIgYWxnb3JpdGhtLlxuXG4tMQltaW4gY29tcHJlc3Npb25cbi05CW1heCBjb21wcmVzc2lvbiAoZGVmYXVsdClcbi1nCWd6aXAgKGRlZmF1bHQpXG4tTAl6bGliXG4tUglyYXdcbi16CXppcFxuXG4iCisKKyNkZWZpbmUgSEVMUF9icmN0bCAidXNhZ2U6IGJyY3RsIENPTU1BTkQgW0JSSURHRSBbSU5URVJGQUNFXV1cblxuTWFuYWdlIGV0aGVybmV0IGJyaWRnZXNcblxuQ29tbWFuZHM6XG5zaG93ICAgICAgICAgICAgICAgICAgU2hvdyBhIGxpc3Qgb2YgYnJpZGdlc1xuYWRkYnIgQlJJREdFICAgICAgICAgIENyZWF0ZSBCUklER0VcbmRlbGJyIEJSSURHRSAgICAgICAgICBEZWxldGUgQlJJREdFXG5hZGRpZiBCUklER0UgSUZBQ0UgICAgQWRkIElGQUNFIHRvIEJSSURHRVxuZGVsaWYgQlJJREdFIElGQUNFICAgIERlbGV0ZSBJRkFDRSBmcm9tIEJSSURHRVxuc2V0YWdlaW5nIEJSSURHRSBUSU1FIFNldCBhZ2VpbmcgdGltZVxuc2V0ZmQgQlJJREdFIFRJTUUgICAgIFNldCBicmlkZ2UgZm9yd2FyZCBkZWxheVxuc2V0aGVsbG8gQlJJREdFIFRJTUUgIFNldCBoZWxsbyB0aW1lXG5zZXRtYXhhZ2UgQlJJREdFIFRJTUUgU2V0IG1heCBtZXNzYWdlIGFnZVxuc2V0cGF0aGNvc3QgQlJJREdFIFBPUlQgQ09TVCAgIFNldCBwYXRoIGNvc3RcbnNldHBvcnRwcmlvIEJSSURHRSBQT1JUIFBSSU8gICBTZXQgcG9ydCBwcmlvcml0eVxuc2V0YnJpZGdlcHJpbyBCUklER0UgUFJJTyAgICAgIFNldCBicmlkZ2UgcHJpb3JpdHlcbnN0cCBCUklER0UgWzEveWVzL29ufDAvbm8vb2ZmXSBTVFAgb24vb2ZmXG5cbiIKKworI2RlZmluZSBIRUxQX2Jvb3RjaGFydGQgInVzYWdlOiBib290Y2hhcnRkIHtzdGFydCBbUFJPRyBBUkdTXX18c3RvcHxpbml0XG5cbkNyZWF0ZSAvdmFyL2xvZy9ib290bG9nLnRneiB3aXRoIGJvb3QgY2hhcnQgZGF0YVxuXG5zdGFydDogc3RhcnQgYmFja2dyb3VuZCBsb2dnaW5nOyB3aXRoIFBST0csIHJ1biBQUk9HLFxuICAgICAgIHRoZW4ga2lsbCBsb2dnaW5nIHdpdGggVVNSMVxuc3RvcDogIHNlbmQgVVNSMSB0byBhbGwgYm9vdGNoYXJ0ZCBwcm9jZXNzZXNcbmluaXQ6ICBzdGFydCBiYWNrZ3JvdW5kIGxvZ2dpbmc7IHN0b3Agd2hlbiBnZXR0eS94ZG0gaXMgc2VlblxuICAgICAgKGZvciBpbml0IHNjcmlwdHMpXG5cblVuZGVyIFBJRCAxOiBhcyBpbml0LCB0aGVuIGV4ZWMgJGJvb3RjaGFydF9pbml0LCAvaW5pdCwgL3NiaW4vaW5pdFxuXG4iCisKKyNkZWZpbmUgSEVMUF9hcnBpbmcgInVzYWdlOiBhcnBpbmcgWy1mcWJEVUFdIFstYyBDTlRdIFstdyBUSU1FT1VUXSBbLUkgSUZBQ0VdIFstcyBTUkNfSVBdIERTVF9JUFxuXG5TZW5kIEFSUCByZXF1ZXN0cy9yZXBsaWVzXG5cbi1mICAgICAgICAgUXVpdCBvbiBmaXJzdCBBUlAgcmVwbHlcbi1xICAgICAgICAgUXVpZXRcbi1iICAgICAgICAgS2VlcCBicm9hZGNhc3RpbmcsIGRvbid0IGdvIHVuaWNhc3Rcbi1EICAgICAgICAgRHVwbGljYXRlZCBhZGRyZXNzIGRldGVjdGlvbiBtb2RlXG4tVSAgICAgICAgIFVuc29saWNpdGVkIEFSUCBtb2RlLCB1cGRhdGUgeW91ciBuZWlnaGJvcnNcbi1BICAgICAgICAgQVJQIGFuc3dlciBtb2RlLCB1cGRhdGUgeW91ciBuZWlnaGJvcnNcbi1jIE4gICAgICAgU3RvcCBhZnRlciBzZW5kaW5nIE4gQVJQIHJlcXVlc3RzXG4tdyBUSU1FT1VUIFRpbWUgdG8gd2FpdCBmb3IgQVJQIHJlcGx5LCBzZWNvbmRzXG4tSSBJRkFDRSAgIEludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMClcbi1zIFNSQ19JUCAgU2VuZGVyIElQIGFkZHJlc3NcbkRTVF9JUCAgICAgVGFyZ2V0IElQIGFkZHJlc3NcblxuIgorCisjZGVmaW5lIEhFTFBfYXJwICJVc2FnZTogYXJwXG5bLXZuXSBbLUggSFdUWVBFXSBbLWkgSUZdIC1hIFtIT1NUTkFNRV1cblstdl0gICAgICAgICAgICAgIFstaSBJRl0gLWQgSE9TVE5BTUUgW3B1Yl1cblstdl0gIFstSCBIV1RZUEVdIFstaSBJRl0gLXMgSE9TVE5BTUUgSFdBRERSIFt0ZW1wXVxuWy12XSAgWy1IIEhXVFlQRV0gWy1pIElGXSAtcyBIT1NUTkFNRSBIV0FERFIgW25ldG1hc2sgTUFTS10gcHViXG5bLXZdICBbLUggSFdUWVBFXSBbLWkgSUZdIC1EcyBIT1NUTkFNRSBJRkFDRSBbbmV0bWFzayBNQVNLXSBwdWJcblxuTWFuaXB1bGF0ZSBBUlAgY2FjaGVcblxuLWEgICAgRGlzcGxheSAoYWxsKSBob3N0c1xuLXMgICAgU2V0IG5ldyBBUlAgZW50cnlcbi1kICAgIERlbGV0ZSBhIHNwZWNpZmllZCBlbnRyeVxuLXYgICAgVmVyYm9zZVxuLW4gICAgRG9uJ3QgcmVzb2x2ZSBuYW1lc1xuLWkgSUYgTmV0d29yayBpbnRlcmZhY2Vcbi1EICAgIFJlYWQgPGh3YWRkcj4gZnJvbSBnaXZlbiBkZXZpY2Vcbi1BLC1wIEFGICBQcm90b2NvbCBmYW1pbHlcbi1IICAgIEhXVFlQRSBIYXJkd2FyZSBhZGRyZXNzIHR5cGVcblxuXG4iCisKKyNkZWZpbmUgSEVMUF94YXJnc19wZWRhbnRpYyAiVGhpcyB2ZXJzaW9uIHN1cHBvcnRzIGluc2FuZSBwb3NpeCB3aGl0ZXNwYWNlIGhhbmRsaW5nIHJlbmRlcmVkIG9ic29sZXRlXG5ieSAtMCBtb2RlLlxuXG5cbiIKKworI2RlZmluZSBIRUxQX3hhcmdzICJ1c2FnZTogeGFyZ3MgWy1wdHhyMF0gWy1zIE5VTV0gWy1uIE5VTV0gWy1MIE5VTV0gWy1FIFNUUl0gQ09NTUFORC4uLlxuXG5SdW4gY29tbWFuZCBsaW5lIG9uZSBvciBtb3JlIHRpbWVzLCBhcHBlbmRpbmcgYXJndW1lbnRzIGZyb20gc3RkaW4uXG5cbklmIGNvbW1hbmQgZXhpdHMgd2l0aCAyNTUsIGRvbid0IGxhdW5jaCBhbm90aGVyIGV2ZW4gaWYgYXJndW1lbnRzIHJlbWFpbi5cblxuLXMJU2l6ZSBpbiBieXRlcyBwZXIgY29tbWFuZCBsaW5lXG4tbglNYXggbnVtYmVyIG9mIGFyZ3VtZW50cyBwZXIgY29tbWFuZFxuLTAJRWFjaCBhcmd1bWVudCBpcyBOVUxMIHRlcm1pbmF0ZWQsIG5vIHdoaXRlc3BhY2Ugb3IgcXVvdGUgcHJvY2Vzc2luZ1xuIy1wCVByb21wdCBmb3IgeS9uIGZyb20gdHR5IGJlZm9yZSBydW5uaW5nIGVhY2ggY29tbWFuZFxuIy10CVRyYWNlLCBwcmludCBjb21tYW5kIGxpbmUgdG8gc3RkZXJyXG4jLXgJRXhpdCBpZiBjYW4ndCBmaXQgZXZlcnl0aGluZyBpbiBvbmUgY29tbWFuZFxuIy1yCURvbid0IHJ1biBjb21tYW5kIHdpdGggZW1wdHkgaW5wdXRcbiMtTAlNYXggbnVtYmVyIG9mIGxpbmVzIG9mIGlucHV0IHBlciBjb21tYW5kXG4tRQlzdG9wIGF0IGxpbmUgbWF0Y2hpbmcgc3RyaW5nXG5cbiIKKworI2RlZmluZSBIRUxQX3dobyAidXNhZ2U6IHdob1xuXG5QcmludCBsb2dnZWQgdXNlciBpbmZvcm1hdGlvbiBvbiBzeXN0ZW1cblxuIgorCisjZGVmaW5lIEhFTFBfd2MgInVzYWdlOiB3YyAtbHdjbSBbRklMRS4uLl1cblxuQ291bnQgbGluZXMsIHdvcmRzLCBhbmQgY2hhcmFjdGVycyBpbiBpbnB1dC5cblxuLWwJc2hvdyBsaW5lc1xuLXcJc2hvdyB3b3Jkc1xuLWMJc2hvdyBieXRlc1xuLW0Jc2hvdyBjaGFyYWN0ZXJzXG5cbkJ5IGRlZmF1bHQgb3V0cHV0cyBsaW5lcywgd29yZHMsIGJ5dGVzLCBhbmQgZmlsZW5hbWUgZm9yIGVhY2hcbmFyZ3VtZW50IChvciBmcm9tIHN0ZGluIGlmIG5vbmUpLiBEaXNwbGF5cyBvbmx5IGVpdGhlciBieXRlc1xub3IgY2hhcmFjdGVycy5cblxuIgorCisjZGVmaW5lIEhFTFBfdXVlbmNvZGUgInVzYWdlOiB1dWVuY29kZSBbLW1dIFtmaWxlXSBlbmNvZGUtZmlsZW5hbWVcblxuVXVlbmNvZGUgc3RkaW4gKG9yIGZpbGUpIHRvIHN0ZG91dCwgd2l0aCBlbmNvZGUtZmlsZW5hbWUgaW4gdGhlIG91dHB1dC5cblxuLW0JYmFzZTY0LWVuY29kZVxuXG4iCisKKyNkZWZpbmUgSEVMUF91dWRlY29kZSAidXNhZ2U6IHV1ZGVjb2RlIFstbyBPVVRGSUxFXSBbSU5GSUxFXVxuXG5EZWNvZGUgZmlsZSBmcm9tIHN0ZGluIChvciBJTkZJTEUpLlxuXG4tbwl3cml0ZSB0byBPVVRGSUxFIGluc3RlYWQgb2YgZmlsZW5hbWUgaW4gaGVhZGVyXG5cbiIKKworI2RlZmluZSBIRUxQX3VubGluayAidXNhZ2U6IHVubGluayBGSUxFXG5cbkRlbGV0ZXMgb25lIGZpbGUuXG5cbiIKKworI2RlZmluZSBIRUxQX3VuaXEgInVzYWdlOiB1bmlxIFstY2R1aXpdIFstdyBtYXhjaGFyc10gWy1mIGZpZWxkc10gWy1zIGNoYXJdIFtpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1dXG5cblJlcG9ydCBvciBmaWx0ZXIgb3V0IHJlcGVhdGVkIGxpbmVzIGluIGEgZmlsZVxuXG4tYwlzaG93IGNvdW50cyBiZWZvcmUgZWFjaCBsaW5lXG4tZAlzaG93IG9ubHkgbGluZXMgdGhhdCBhcmUgcmVwZWF0ZWRcbi11CXNob3cgb25seSBsaW5lcyB0aGF0IGFyZSB1bmlxdWVcbi1pCWlnbm9yZSBjYXNlIHdoZW4gY29tcGFyaW5nIGxpbmVzXG4teglsaW5lcyBlbmQgd2l0aCBcXDAgbm90IFxcblxuLXcJY29tcGFyZSBtYXhpbXVtIFggY2hhcnMgcGVyIGxpbmVcbi1mCWlnbm9yZSBmaXJzdCBYIGZpZWxkc1xuLXMJaWdub3JlIGZpcnN0IFggY2hhcnNcblxuIgorCisjZGVmaW5lIEhFTFBfdW5hbWUgInVzYWdlOiB1bmFtZSBbLWFzbnJ2bV1cblxuUHJpbnQgc3lzdGVtIGluZm9ybWF0aW9uLlxuXG4tcwlTeXN0ZW0gbmFtZVxuLW4JTmV0d29yayAoZG9tYWluKSBuYW1lXG4tcglLZXJuZWwgUmVsZWFzZSBudW1iZXJcbi12CUtlcm5lbCBWZXJzaW9uXG4tbQlNYWNoaW5lIChoYXJkd2FyZSkgbmFtZVxuLWEJQWxsIG9mIHRoZSBhYm92ZVxuXG4iCisKKyNkZWZpbmUgSEVMUF91bGltaXQgInVzYWdlOiB1bGltaXQgWy1QIFBJRF0gWy1TSFJhY2RlZmlsbW5wcXJzdHV2XSBbTElNSVRdXG5cblByaW50IG9yIHNldCByZXNvdXJjZSBsaW1pdHMgZm9yIHByb2Nlc3MgbnVtYmVyIFBJRC4gSWYgbm8gTElNSVQgc3BlY2lmaWVkXG4ob3IgcmVhZC1vbmx5IC1hcCBzZWxlY3RlZCkgZGlzcGxheSBjdXJyZW50IHZhbHVlIChzaXplcyBpbiBieXRlcykuXG5EZWZhdWx0IGlzIHVsaW1pdCAtUCAkUFBJRCAtU2ZcIiAoc2hvdyBzb2Z0IGZpbGVzaXplIG9mIHlvdXIgc2hlbGwpLlxuXG4tUyAgU2V0L3Nob3cgc29mdCBsaW1pdCAgICAgICAgICAtSCAgU2V0L3Nob3cgaGFyZCAobWF4aW11bSkgbGltaXRcbi1hICBTaG93IGFsbCBsaW1pdHMgICAgICAgICAgICAgIC1jICBDb3JlIGZpbGUgc2l6ZVxuLWQgIFByb2Nlc3MgZGF0YSBzZWdtZW50ICAgICAgICAgLWUgIE1heCBzY2hlZHVsaW5nIHByaW9yaXR5XG4tZiAgT3V0cHV0IGZpbGUgc2l6ZSAgICAgICAgICAgICAtaSAgUGVuZGluZyBzaWduYWwgY291bnRcbi1sICBMb2NrZWQgbWVtb3J5ICAgICAgICAgICAgICAgIC1tICBSZXNpZGVudCBTZXQgU2l6ZVxuLW4gIE51bWJlciBvZiBvcGVuIGZpbGVzICAgICAgICAgLXAgIFBpcGUgYnVmZmVyXG4tcSAgUG9zaXggbWVzc2FnZSBxdWV1ZSAgICAgICAgICAtciAgTWF4IFJlYWwtdGltZSBwcmlvcml0eVxuLVIgIFJlYWx0aW1lIGxhdGVuY3kgKHVzZWMpICAgICAgLXMgIFN0YWNrIHNpemVcbi10ICBUb3RhbCBDUFUgdGltZSAoaW4gc2Vjb25kcykgIC11ICBNYXhpbXVtIHByb2Nlc3NlcyAodW5kZXIgdGhpcyBVSUQpXG4tdiAgVmlydHVhbCBtZW1vcnkgc2l6ZSAgICAgICAgICAtUCAgUElEIHRvIGFmZmVjdCAoZGVmYXVsdCAkUFBJRClcblxuIgorCisjZGVmaW5lIEhFTFBfdHR5ICJ1c2FnZTogdHR5IFstc11cblxuU2hvdyBmaWxlbmFtZSBvZiB0ZXJtaW5hbCBjb25uZWN0ZWQgdG8gc3RkaW4uXG5cblByaW50cyBcIm5vdCBhIHR0eVwiIGFuZCBleGl0cyB3aXRoIG5vbnplcm8gc3RhdHVzIGlmIG5vIHRlcm1pbmFsXG5pcyBjb25uZWN0ZWQgdG8gc3RkaW4uXG5cbi1zCXNpbGVudCwgZXhpdCBjb2RlIG9ubHlcblxuIgorCisjZGVmaW5lIEhFTFBfdHJ1ZSAiUmV0dXJuIHplcm8uXG5cbiIKKworI2RlZmluZSBIRUxQX3RvdWNoICJ1c2FnZTogdG91Y2ggWy1hbWNoXSBbLWQgREFURV0gWy10IFRJTUVdIFstciBGSUxFXSBGSUxFLi4uXG5cblVwZGF0ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgb2YgZWFjaCBGSUxFIHRvIHRoZSBjdXJyZW50IHRpbWUuXG5cbi1hCWNoYW5nZSBhY2Nlc3MgdGltZVxuLW0JY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lXG4tYwlkb24ndCBjcmVhdGUgZmlsZVxuLWgJY2hhbmdlIHN5bWxpbmtcbi1kCXNldCB0aW1lIHRvIERBVEUgKGluIFlZWVktTU0tRERUaGg6bW06U1NbLmZyYWNdW3R6XSBmb3JtYXQpXG4tdAlzZXQgdGltZSB0byBUSU1FIChpbiBbW0NDXVlZXU1NRERoaG1tWy5zc11bZnJhY10gZm9ybWF0KVxuLXIJc2V0IHRpbWUgc2FtZSBhcyByZWZlcmVuY2UgRklMRVxuXG4iCisKKyNkZWZpbmUgSEVMUF90aW1lICJ1c2FnZTogdGltZSBbLXBdIENPTU1BTkQgW0FSR1MuLi5dXG5cblJ1biBjb21tYW5kIGxpbmUgYW5kIHJlcG9ydCByZWFsLCB1c2VyLCBhbmQgc3lzdGVtIHRpbWUgZWxhcHNlZCBpbiBzZWNvbmRzLlxuKHJlYWwgPSBjbG9jayBvbiB0aGUgd2FsbCwgdXNlciA9IGNwdSB1c2VkIGJ5IGNvbW1hbmQncyBjb2RlLFxuc3lzdGVtID0gY3B1IHVzZWQgYnkgT1Mgb24gYmVoYWxmIG9mIGNvbW1hbmQuKVxuXG4tcAlwb3NpeCBtb2RlIChpZ25vcmVkKVxuXG4iCisKKyNkZWZpbmUgSEVMUF90ZWUgInVzYWdlOiB0ZWUgWy1haV0gW2ZpbGUuLi5dXG5cbkNvcHkgc3RkaW4gdG8gZWFjaCBsaXN0ZWQgZmlsZSwgYW5kIGFsc28gdG8gc3Rkb3V0LlxuRmlsZW5hbWUgXCItXCIgaXMgYSBzeW5vbnltIGZvciBzdGRvdXQuXG5cbi1hCWFwcGVuZCB0byBmaWxlcy5cbi1pCWlnbm9yZSBTSUdJTlQuXG5cbiIKKworI2RlZmluZSBIRUxQX3RhaWxfc2VlayAiVGhpcyB2ZXJzaW9uIHVzZXMgbHNlZWssIHdoaWNoIGlzIGZhc3RlciBvbiBsYXJnZSBmaWxlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfdGFpbCAidXNhZ2U6IHRhaWwgWy1ufGMgTlVNQkVSXSBbLWZdIFtGSUxFLi4uXVxuXG5Db3B5IGxhc3QgbGluZXMgZnJvbSBmaWxlcyB0byBzdGRvdXQuIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tXG5zdGRpbi4gRmlsZW5hbWUgXCItXCIgaXMgYSBzeW5vbnltIGZvciBzdGRpbi5cblxuLW4Jb3V0cHV0IHRoZSBsYXN0IE5VTUJFUiBsaW5lcyAoZGVmYXVsdCAxMCksICtYIGNvdW50cyBmcm9tIHN0YXJ0LlxuLWMJb3V0cHV0IHRoZSBsYXN0IE5VTUJFUiBieXRlcywgK05VTUJFUiBjb3VudHMgZnJvbSBzdGFydFxuLWYJZm9sbG93IEZJTEUocyksIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSB0byBiZSBhcHBlbmRlZFxuXG4iCisKKyNkZWZpbmUgSEVMUF9zdHJpbmdzICJ1c2FnZTogc3RyaW5ncyBbLWZvXSBbLW4gTEVOXSBbRklMRS4uLl1cblxuRGlzcGxheSBwcmludGFibGUgc3RyaW5ncyBpbiBhIGJpbmFyeSBmaWxlXG5cbi1mCVByZWNlZGUgc3RyaW5ncyB3aXRoIGZpbGVuYW1lc1xuLW4JQXQgbGVhc3QgTEVOIGNoYXJhY3RlcnMgZm9ybSBhIHN0cmluZyAoZGVmYXVsdCA0KVxuLW8JUHJlY2VkZSBzdHJpbmdzIHdpdGggZGVjaW1hbCBvZmZzZXRzXG5cbiIKKworI2RlZmluZSBIRUxQX3NwbGl0ICJ1c2FnZTogc3BsaXQgWy1hIFNVRkZJWF9MRU5dIFstYiBCWVRFU10gWy1sIExJTkVTXSBbSU5QVVQgW09VVFBVVF1dXG5cbkNvcHkgSU5QVVQgKG9yIHN0ZGluKSBkYXRhIHRvIGEgc2VyaWVzIG9mIE9VVFBVVCAob3IgXCJ4XCIpIGZpbGVzIHdpdGhcbmFscGhhYmV0aWNhbGx5IGluY3JlYXNpbmcgc3VmZml4IChhYSwgYWIsIGFjLi4uIGF6LCBiYSwgYmIuLi4pLlxuXG4tYQlTdWZmaXggbGVuZ3RoIChkZWZhdWx0IDIpXG4tYglCWVRFUy9maWxlICgxMCwgMTBrLCAxMG0sIDEwZy4uLilcbi1sCUxJTkVTL2ZpbGUgKGRlZmF1bHQgMTAwMClcblxuIgorCisjZGVmaW5lIEhFTFBfc29ydCAidXNhZ2U6IHNvcnQgWy1NYmNkZmdpbnJzdXpdIFstayNbLCNbeF1dIFstdCBYXV0gWy1vIEZJTEVdIFtGSUxFLi4uXVxuXG5Tb3J0IGFsbCBsaW5lcyBvZiB0ZXh0IGZyb20gaW5wdXQgZmlsZXMgKG9yIHN0ZGluKSB0byBzdGRvdXQuXG5cbi1NCW1vbnRoIHNvcnQgKGphbiwgZmViLCBldGMpLlxuLWIJaWdub3JlIGxlYWRpbmcgYmxhbmtzIChvciB0cmFpbGluZyBibGFua3MgaW4gc2Vjb25kIHBhcnQgb2Yga2V5KVxuLWMJY2hlY2sgd2hldGhlciBpbnB1dCBpcyBzb3J0ZWRcbi1kCWRpY3Rpb25hcnkgb3JkZXIgKHVzZSBhbHBoYW51bWVyaWMgYW5kIHdoaXRlc3BhY2UgY2hhcnMgb25seSlcbi1mCWZvcmNlIHVwcGVyY2FzZSAoY2FzZSBpbnNlbnNpdGl2ZSBzb3J0KVxuLWcJZ2VuZXJhbCBudW1lcmljIHNvcnQgKGRvdWJsZSBwcmVjaXNpb24gd2l0aCBuYW4gYW5kIGluZilcbi1pCWlnbm9yZSBub25wcmludGluZyBjaGFyYWN0ZXJzXG4tawlzb3J0IGJ5IFwia2V5XCIgKHNlZSBiZWxvdylcbi1uCW51bWVyaWMgb3JkZXIgKGluc3RlYWQgb2YgYWxwaGFiZXRpY2FsKVxuLW8Jb3V0cHV0IHRvIEZJTEUgaW5zdGVhZCBvZiBzdGRvdXRcbi1yCXJldmVyc2Vcbi1zCXNraXAgZmFsbGJhY2sgc29ydCAob25seSBzb3J0IHdpdGgga2V5cylcbi10CXVzZSBhIGtleSBzZXBhcmF0b3Igb3RoZXIgdGhhbiB3aGl0ZXNwYWNlXG4tdQl1bmlxdWUgbGluZXMgb25seVxuLXgJSGV4YWRlY2ltYWwgbnVtZXJpY2FsIHNvcnRcbi16CXplcm8gKG51bGwpIHRlcm1pbmF0ZWQgbGluZXNcblxuU29ydGluZyBieSBrZXkgbG9va3MgYXQgYSBzdWJzZXQgb2YgdGhlIHdvcmRzIG9uIGVhY2ggbGluZS4gIC1rMlxudXNlcyB0aGUgc2Vjb25kIHdvcmQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgLWsyLDIgbG9va3MgYXQgb25seVxudGhlIHNlY29uZCB3b3JkLCAtazIsNCBsb29rcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHRvIHRoZSBlbmRcbm9mIHRoZSBmb3VydGggd29yZC4gIFNwZWNpZnlpbmcgbXVsdGlwbGUga2V5cyB1c2VzIHRoZSBsYXRlciBrZXlzIGFzXG50aWUgYnJlYWtlcnMsIGluIG9yZGVyLiAgQSB0eXBlIHNwZWNpZmllciBhcHBlbmRlZCB0byBhIHNvcnQga2V5XG4oc3VjaCBhcyAtMiwybikgYXBwbGllcyBvbmx5IHRvIHNvcnRpbmcgdGhhdCBrZXkuXG4iCisKKyNkZWZpbmUgSEVMUF9zbGVlcF9mbG9hdCAiTGVuZ3RoIGNhbiBiZSBhIGRlY2ltYWwgZnJhY3Rpb24uXG5cbiIKKworI2RlZmluZSBIRUxQX3NsZWVwICJ1c2FnZTogc2xlZXAgTEVOR1RIXG5cbldhaXQgYmVmb3JlIGV4aXRpbmcuIEFuIG9wdGlvbmFsIHN1ZmZpeCBjYW4gYmUgXCJtXCIgKG1pbnV0ZXMpLCBcImhcIiAoaG91cnMpLFxuXCJkXCIgKGRheXMpLCBvciBcInNcIiAoc2Vjb25kcywgdGhlIGRlZmF1bHQpLlxuXG5cbiIKKworI2RlZmluZSBIRUxQX3NlZCAidXNhZ2U6IHNlZCBbLWluckVdIFstZSBTQ1JJUFRdLi4ufFNDUklQVCBbLWYgU0NSSVBUX0ZJTEVdLi4uIFtGSUxFLi4uXVxuXG5TdHJlYW0gZWRpdG9yLiBBcHBseSBvbmUgb3IgbW9yZSBlZGl0aW5nIFNDUklQVHMgdG8gZWFjaCBsaW5lIG9mIGlucHV0XG4oZnJvbSBGSUxFIG9yIHN0ZGluKSBwcm9kdWNpbmcgb3V0cHV0IChieSBkZWZhdWx0IHRvIHN0ZG91dCkuXG5cbi1lCWFkZCBTQ1JJUFQgdG8gbGlzdFxuLWYJYWRkIGNvbnRlbnRzIG9mIFNDUklQVF9GSUxFIHRvIGxpc3Rcbi1pCUVkaXQgZWFjaCBmaWxlIGluIHBsYWNlLlxuLW4JTm8gZGVmYXVsdCBvdXRwdXQuIChVc2UgdGhlIHAgY29tbWFuZCB0byBvdXRwdXQgbWF0Y2hlZCBsaW5lcy4pXG4tcglVc2UgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uIHN5bnRheC5cbi1FCUFsaWFzIGZvciAtci5cbi1zCVRyZWF0IGlucHV0IGZpbGVzIHNlcGFyYXRlbHkgKGltcGxpZWQgYnkgLWkpXG5cbkEgU0NSSVBUIGlzIGEgc2VyaWVzIG9mIG9uZSBvciBtb3JlIENPTU1BTkRzIHNlcGFyYXRlZCBieSBuZXdsaW5lcyBvclxuc2VtaWNvbG9ucy4gQWxsIC1lIFNDUklQVHMgYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciBhcyBpZiBzZXBhcmF0ZWRcbmJ5IG5ld2xpbmVzLCBmb2xsb3dlZCBieSBhbGwgbGluZXMgZnJvbSAtZiBTQ1JJUFRfRklMRXMsIGluIG9yZGVyLlxuSWYgbm8gLWUgb3IgLWYgU0NSSVBUcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIFNDUklQVC5cblxuRWFjaCBDT01NQU5EIG1heSBiZSBwcmVjZWRlZCBieSBhbiBhZGRyZXNzIHdoaWNoIGxpbWl0cyB0aGUgY29tbWFuZCB0b1xuYXBwbHkgb25seSB0byB0aGUgc3BlY2lmaWVkIGxpbmUocykuIENvbW1hbmRzIHdpdGhvdXQgYW4gYWRkcmVzcyBhcHBseSB0b1xuZXZlcnkgbGluZS4gQWRkcmVzc2VzIGFyZSBvZiB0aGUgZm9ybTpcblxuICBbQUREUkVTU1ssQUREUkVTU11dQ09NTUFORFxuXG5UaGUgQUREUkVTUyBtYXkgYmUgYSBkZWNpbWFsIGxpbmUgbnVtYmVyIChzdGFydGluZyBhdCAxKSwgYSAvcmVndWxhclxuZXhwcmVzc2lvbi8gd2l0aGluIGEgcGFpciBvZiBmb3J3YXJkIHNsYXNoZXMsIG9yIHRoZSBjaGFyYWN0ZXIgXCIkXCIgd2hpY2hcbm1hdGNoZXMgdGhlIGxhc3QgbGluZSBvZiBpbnB1dC4gKEluIC1zIG9yIC1pIG1vZGUgdGhpcyBtYXRjaGVzIHRoZSBsYXN0XG5saW5lIG9mIGVhY2ggZmlsZSwgb3RoZXJ3aXNlIGp1c3QgdGhlIGxhc3QgbGluZSBvZiB0aGUgbGFzdCBmaWxlLikgQSBzaW5nbGVcbmFkZHJlc3MgbWF0Y2hlcyBvbmUgbGluZSwgYSBwYWlyIG9mIGNvbW1hIHNlcGFyYXRlZCBhZGRyZXNzZXMgbWF0Y2hcbmV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyB0byB0aGUgc2Vjb25kIGFkZHJlc3MgKGluY2x1c2l2ZSkuIElmXG5ib3RoIGFkZHJlc3NlcyBhcmUgcmVndWxhciBleHByZXNzaW9ucywgbW9yZSB0aGFuIG9uZSByYW5nZSBvZiBsaW5lcyBpblxuZWFjaCBmaWxlIGNhbiBtYXRjaC5cblxuUkVHVUxBUiBFWFBSRVNTSU9OUyBpbiBzZWQgYXJlIHN0YXJ0ZWQgYW5kIGVuZGVkIGJ5IHRoZSBzYW1lIGNoYXJhY3RlclxuKHRyYWRpdGlvbmFsbHkgLyBidXQgYW55dGhpbmcgZXhjZXB0IGEgYmFja3NsYXNoIG9yIGEgbmV3bGluZSB3b3JrcykuXG5CYWNrc2xhc2hlcyBtYXkgYmUgdXNlZCB0byBlc2NhcGUgdGhlIGRlbGltaXRlciBpZiBpdCBvY2N1cnMgaW4gdGhlXG5yZWdleCwgYW5kIGZvciB0aGUgdXN1YWwgcHJpbnRmIGVzY2FwZXMgKFxcYWJjZWZucnR2IGFuZCBvY3RhbCwgaGV4LFxuYW5kIHVuaWNvZGUpLiBBbiBlbXB0eSByZWdleCByZXBlYXRzIHRoZSBwcmV2aW91cyBvbmUuIEFERFJFU1MgcmVnZXhlc1xuKGFib3ZlKSByZXF1aXJlIHRoZSBmaXJzdCBkZWxpbWV0ZXIgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoIHdoZW5cbml0IGlzbid0IGEgZm9yd2FyZCBzbGFzaCAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgQ09NTUFORHMgYmVsb3cpLlxuXG5TZWQgbW9zdGx5IG9wZXJhdGVzIG9uIGluZGl2aWR1YWwgbGluZXMgb25lIGF0IGEgdGltZS4gSXQgcmVhZHMgZWFjaCBsaW5lLFxucHJvY2Vzc2VzIGl0LCBhbmQgZWl0aGVyIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IG9yIGRpc2NhcmRzIGl0IGJlZm9yZVxucmVhZGluZyB0aGUgbmV4dCBsaW5lLiBTZWQgY2FuIHJlbWVtYmVyIG9uZSBhZGRpdGlvbmFsIGxpbmUgaW4gYSBzZXBhcmF0ZVxuYnVmZmVyICh1c2luZyB0aGUgaCwgSCwgZywgRywgYW5kIHggY29tbWFuZHMpLCBhbmQgY2FuIHJlYWQgdGhlIG5leHQgbGluZVxub2YgaW5wdXQgZWFybHkgKHVzaW5nIHRoZSBuIGFuZCBOIGNvbW1hbmQpLCBidXQgb3RoZXIgdGhhbiB0aGF0IGNvbW1hbmRcbnNjcmlwdHMgb3BlcmF0ZSBvbiBpbmRpdmlkdWFsIGxpbmVzIG9mIHRleHQuXG5cbkVhY2ggQ09NTUFORCBzdGFydHMgd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIuIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdGFrZVxubm8gYXJndW1lbnRzOlxuXG4gIHsgIFN0YXJ0IGEgbmV3IGNvbW1hbmQgYmxvY2ssIGNvbnRpbnVpbmcgdW50aWwgYSBjb3JyZXNwb25kaW5nIFwifVwiLlxuICAgICBDb21tYW5kIGJsb2NrcyBtYXkgbmVzdC4gSWYgdGhlIGJsb2NrIGhhcyBhbiBhZGRyZXNzLCBjb21tYW5kcyB3aXRoaW5cbiAgICAgdGhlIGJsb2NrIGFyZSBvbmx5IHJ1biBmb3IgbGluZXMgd2l0aGluIHRoZSBibG9jaydzIGFkZHJlc3MgcmFuZ2UuXG5cbiAgfSAgRW5kIGNvbW1hbmQgYmxvY2sgKHRoaXMgY29tbWFuZCBjYW5ub3QgaGF2ZSBhbiBhZGRyZXNzKVxuXG4gIGQgIERlbGV0ZSB0aGlzIGxpbmUgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgb25lXG4gICAgIChpZ25vcmVzIHJlbWFpbmluZyBDT01NQU5EcylcblxuICBEICBEZWxldGUgb25lIGxpbmUgb2YgaW5wdXQgYW5kIHJlc3RhcnQgY29tbWFuZCBTQ1JJUFQgKHNhbWUgYXMgXCJkXCJcbiAgICAgdW5sZXNzIHlvdSd2ZSBnbHVlZCBsaW5lcyB0b2dldGhlciB3aXRoIFwiTlwiIG9yIHNpbWlsYXIpXG5cbiAgZyAgR2V0IHJlbWVtYmVyZWQgbGluZSAob3ZlcndyaXRpbmcgY3VycmVudCBsaW5lKVxuXG4gIEcgIEdldCByZW1lbWJlcmVkIGxpbmUgKGFwcGVuZGluZyB0byBjdXJyZW50IGxpbmUpXG5cbiAgaCAgUmVtZW1iZXIgdGhpcyBsaW5lIChvdmVyd3JpdGluZyByZW1lbWJlcmVkIGxpbmUpXG5cbiAgSCAgUmVtZW1iZXIgdGhpcyBsaW5lIChhcHBlbmRpbmcgdG8gcmVtZW1iZXJlZCBsaW5lLCBpZiBhbnkpXG5cbiAgbCAgUHJpbnQgbGluZSwgZXNjYXBpbmcgXFxhYmZydHYgKGJ1dCBub3QgbmV3bGluZSksIG9jdGFsIGVzY2FwaW5nIG90aGVyXG4gICAgIG5vbnByaW50YWJsZSBjaGFyYWN0ZXJzLCB3cmFwcGluZyBsaW5lcyB0byB0ZXJtaW5hbCB3aWR0aCB3aXRoIGFcbiAgICAgYmFja3NsYXNoLCBhbmQgYXBwZW5kaW5nICQgdG8gYWN0dWFsIGVuZCBvZiBsaW5lLlxuXG4gIG4gIFByaW50IGRlZmF1bHQgb3V0cHV0IGFuZCByZWFkIG5leHQgbGluZSwgcmVwbGFjaW5nIGN1cnJlbnQgbGluZVxuICAgICAoSWYgbm8gbmV4dCBsaW5lIGF2YWlsYWJsZSwgcXVpdCBwcm9jZXNzaW5nIHNjcmlwdClcblxuICBOICBBcHBlbmQgbmV4dCBsaW5lIG9mIGlucHV0IHRvIHRoaXMgbGluZSwgc2VwYXJhdGVkIGJ5IGEgbmV3bGluZVxuICAgICAoVGhpcyBhZHZhbmNlcyB0aGUgbGluZSBjb3VudGVyIGZvciBhZGRyZXNzIG1hdGNoaW5nIGFuZCBcIj1cIiwgaWYgbm9cbiAgICAgbmV4dCBsaW5lIGF2YWlsYWJsZSBxdWl0IHByb2Nlc3Npbmcgc2NyaXB0IHdpdGhvdXQgZGVmYXVsdCBvdXRwdXQpXG5cbiAgcCAgUHJpbnQgdGhpcyBsaW5lXG5cbiAgUCAgUHJpbnQgdGhpcyBsaW5lIHVwIHRvIGZpcnN0IG5ld2xpbmUgKGZyb20gXCJOXCIpXG5cbiAgcSAgUXVpdCAocHJpbnQgZGVmYXVsdCBvdXRwdXQsIG5vIG1vcmUgY29tbWFuZHMgcHJvY2Vzc2VkIG9yIGxpbmVzIHJlYWQpXG5cbiAgeCAgRXhjaGFuZ2UgdGhpcyBsaW5lIHdpdGggcmVtZW1iZXJlZCBsaW5lIChvdmVyd3JpdGUgaW4gYm90aCBkaXJlY3Rpb25zKVxuXG4gID0gIFByaW50IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIChmb2xsb3dlZCBieSBhIG5ld2xpbmUpXG5cblRoZSBmb2xsb3dpbmcgY29tbWFuZHMgKG1heSkgdGFrZSBhbiBhcmd1bWVudC4gVGhlIFwidGV4dFwiIGFyZ3VtZW50cyAodG9cbnRoZSBcImFcIiwgXCJiXCIsIGFuZCBcImNcIiBjb21tYW5kcykgbWF5IGVuZCB3aXRoIGFuIHVuZXNjYXBlZCBcIlxcXCIgdG8gYXBwZW5kXG50aGUgbmV4dCBsaW5lIChmb3Igd2hpY2ggbGVhZGluZyB3aGl0ZXNwYWNlIGlzIG5vdCBza2lwcGVkKSwgYW5kIGFsc29cbnRyZWF0IFwiO1wiIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKHVzZSBcIlxcO1wiIGluc3RlYWQpLlxuXG4gIGEgW3RleHRdICAgQXBwZW5kIHRleHQgdG8gb3V0cHV0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgbmV4dCBsaW5lXG5cbiAgYiBbbGFiZWxdICBCcmFuY2gsIGp1bXBzIHRvIDpsYWJlbCAob3Igd2l0aCBubyBsYWJlbCwgdG8gZW5kIG9mIFNDUklQVClcblxuICBjIFt0ZXh0XSAgIERlbGV0ZSBsaW5lLCBvdXRwdXQgdGV4dCBhdCBlbmQgb2YgbWF0Y2hpbmcgYWRkcmVzcyByYW5nZVxuICAgICAgICAgICAgIChpZ25vcmVzIHJlbWFpbmluZyBDT01NQU5EcylcblxuICBpIFt0ZXh0XSAgIFByaW50IHRleHRcblxuICByIFtmaWxlXSAgIEFwcGVuZCBjb250ZW50cyBvZiBmaWxlIHRvIG91dHB1dCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkXG4gICAgICAgICAgICAgbmV4dCBsaW5lLlxuXG4gIHMvUy9SL0YgICAgU2VhcmNoIGZvciByZWdleCBTLCByZXBsYWNlIG1hdGNoZWQgdGV4dCB3aXRoIFIgdXNpbmcgZmxhZ3MgRi5cbiAgICAgICAgICAgICBUaGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBcInNcIiAoYW55dGhpbmcgYnV0IG5ld2xpbmUgb3JcbiAgICAgICAgICAgICBiYWNrc2xhc2gpIGlzIHRoZSBkZWxpbWl0ZXIsIGVzY2FwZSB3aXRoIFxcIHRvIHVzZSBub3JtYWxseS5cblxuICAgICAgICAgICAgIFRoZSByZXBsYWNlbWVudCB0ZXh0IG1heSBjb250YWluIFwiJlwiIHRvIHN1YnN0aXR1dGUgdGhlIG1hdGNoZWRcbiAgICAgICAgICAgICB0ZXh0IChlc2NhcGUgaXQgd2l0aCBiYWNrc2xhc2ggZm9yIGEgbGl0ZXJhbCAmKSwgb3IgXFwxIHRocm91Z2hcbiAgICAgICAgICAgICBcXDkgdG8gc3Vic3RpdHV0ZSBhIHBhcmVudGhldGljYWwgc3ViZXhwcmVzc2lvbiBpbiB0aGUgcmVnZXguXG4gICAgICAgICAgICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgbm9ybWFsIGJhY2tzbGFzaCBlc2NhcGVzIHN1Y2ggYXMgXFxuIGFuZFxuICAgICAgICAgICAgIGEgYmFja3NsYXNoIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYXBwZW5kcyB0aGUgbmV4dCBsaW5lLlxuXG4gICAgICAgICAgICAgVGhlIGZsYWdzIGFyZTpcblxuICAgICAgICAgICAgIFswLTldICAgIEEgbnVtYmVyLCBzdWJzdGl0dXRlIG9ubHkgdGhhdCBvY2N1cnJlbmNlIG9mIHBhdHRlcm5cbiAgICAgICAgICAgICBnICAgICAgICBHbG9iYWwsIHN1YnN0aXR1dGUgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm5cbiAgICAgICAgICAgICBpICAgICAgICBJZ25vcmUgY2FzZSB3aGVuIG1hdGNoaW5nXG4gICAgICAgICAgICAgcCAgICAgICAgUHJpbnQgdGhlIGxpbmUgaWYgbWF0Y2ggd2FzIGZvdW5kIGFuZCByZXBsYWNlZFxuICAgICAgICAgICAgIHcgW2ZpbGVdIFdyaXRlIChhcHBlbmQpIGxpbmUgdG8gZmlsZSBpZiBtYXRjaCByZXBsYWNlZFxuXG4gIHQgW2xhYmVsXSAgVGVzdCwganVtcCB0byA6bGFiZWwgb25seSBpZiBhbiBcInNcIiBjb21tYW5kIGZvdW5kIGEgbWF0Y2ggaW5cbiAgICAgICAgICAgICB0aGlzIGxpbmUgc2luY2UgbGFzdCB0ZXN0IChyZXBsYWNpbmcgd2l0aCBzYW1lIHRleHQgY291bnRzKVxuXG4gIFQgW2xhYmVsXSAgVGVzdCBmYWxzZSwganVtcCBvbmx5IGlmIFwic1wiIGhhc24ndCBmb3VuZCBhIG1hdGNoLlxuXG4gIHcgW2ZpbGVdICAgV3JpdGUgKGFwcGVuZCkgbGluZSB0byBmaWxlXG5cbiAgeS9vbGQvbmV3LyBDaGFuZ2UgZWFjaCBjaGFyYWN0ZXIgaW4gJ29sZCcgdG8gY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJcbiAgICAgICAgICAgICBpbiAnbmV3JyAod2l0aCBzdGFuZGFyZCBiYWNrc2xhc2ggZXNjYXBlcywgZGVsaW1pdGVyIGNhbiBiZVxuICAgICAgICAgICAgIGFueSByZXBlYXRlZCBjaGFyYWN0ZXIgZXhjZXB0IFxcIG9yIFxcbilcblxuICA6IFtsYWJlbF0gIExhYmVsZWQgdGFyZ2V0IGZvciBqdW1wIGNvbW1hbmRzXG5cbiAgIyAgQ29tbWVudCwgaWdub3JlIHJlc3Qgb2YgdGhpcyBsaW5lIG9mIFNDUklQVFxuXG5EZXZpYXRpb25zIGZyb20gcG9zaXg6IGFsbG93IGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2l0aCAtcixcbmVkaXRpbmcgaW4gcGxhY2Ugd2l0aCAtaSwgc2VwYXJhdGUgd2l0aCAtcywgcHJpbnRmIGVzY2FwZXMgaW4gdGV4dCwgbGluZVxuY29udGludWF0aW9ucywgc2VtaWNvbG9ucyBhZnRlciBhbGwgY29tbWFuZHMsIDItYWRkcmVzcyBhbnl3aGVyZSBhblxuYWRkcmVzcyBpcyBhbGxvd2VkLCBcIlRcIiBjb21tYW5kLCBtdWx0aWxpbmUgY29udGludWF0aW9ucyBmb3IgW2FiY10sXG5cXDsgdG8gZW5kIFthYmNdIGFyZ3VtZW50IGJlZm9yZSBlbmQgb2YgbGluZS5cblxuIgorCisjZGVmaW5lIEhFTFBfcm1kaXIgInVzYWdlOiBybWRpciBbLXBdIFtkaXJuYW1lLi4uXVxuXG5SZW1vdmUgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMuXG5cbi1wCVJlbW92ZSBwYXRoLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9ybSAidXNhZ2U6IHJtIFstZmlScl0gRklMRS4uLlxuXG5SZW1vdmUgZWFjaCBhcmd1bWVudCBmcm9tIHRoZSBmaWxlc3lzdGVtLlxuXG4tZglmb3JjZTogcmVtb3ZlIHdpdGhvdXQgY29uZmlybWF0aW9uLCBubyBlcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0XG4taQlpbnRlcmFjdGl2ZTogcHJvbXB0IGZvciBjb25maXJtYXRpb25cbi1yUglyZWN1cnNpdmU6IHJlbW92ZSBkaXJlY3RvcnkgY29udGVudHNcblxuIgorCisjZGVmaW5lIEhFTFBfcmVuaWNlICJ1c2FnZTogcmVuaWNlIFstZ3B1XSAtbiBpbmNyZW1lbnQgSUQgLi4uXG5cbiIKKworI2RlZmluZSBIRUxQX3B3ZCAidXNhZ2U6IHB3ZCBbLUx8LVBdXG5cblByaW50IHdvcmtpbmcgKGN1cnJlbnQpIGRpcmVjdG9yeS5cblxuLUwgIFVzZSBzaGVsbCdzIHBhdGggZnJvbSAkUFdEICh3aGVuIGFwcGxpY2FibGUpXG4tUCAgUHJpbnQgY2Fubm9uaWNhbCBhYnNvbHV0ZSBwYXRoXG5cbiIKKworI2RlZmluZSBIRUxQX3Bna2lsbF9jb21tb24gInVzYWdlOiAqIFstZm5vdnhdIFstRyBHSUQsXSBbLWcgUEdSUCxdIFstUCBQUElELF0gWy1zIFNJRCxdIFstdCBURVJNLF0gWy1VIFVJRCxdIFstdSBFVUlELF1cblxuLWYJQ2hlY2sgZnVsbCBjb21tYW5kIGxpbmUgZm9yIFBBVFRFUk5cbi1HCU1hdGNoIHJlYWwgR3JvdXAgSUQocylcbi1nCU1hdGNoIFByb2Nlc3MgR3JvdXAocykgKDAgaXMgY3VycmVudCB1c2VyKVxuLW4JTmV3ZXN0IG1hdGNoIG9ubHlcbi1vCU9sZGVzdCBtYXRjaCBvbmx5XG4tUAlNYXRjaCBQYXJlbnQgUHJvY2VzcyBJRChzKVxuLXMJTWF0Y2ggU2Vzc2lvbiBJRChzKSAoMCBmb3IgY3VycmVudClcbi10CU1hdGNoIFRlcm1pbmFsKHMpXG4tVQlNYXRjaCByZWFsIFVzZXIgSUQocylcbi11CU1hdGNoIGVmZmVjdGl2ZSBVc2VyIElEKHMpXG4tdglOZWdhdGUgdGhlIG1hdGNoXG4teAlNYXRjaCB3aG9sZSBjb21tYW5kIChub3Qgc3Vic3RyaW5nKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9wa2lsbCAidXNhZ2U6IHBraWxsIFstU0lHTkFMfC1sIFNJR05BTF0gW1BBVFRFUk5dXG5cbi1sCVNlbmQgU0lHTkFMIChkZWZhdWx0IFNJR1RFUk0pXG4tVgl2ZXJib3NlXG5cbiIKKworI2RlZmluZSBIRUxQX3BncmVwICJ1c2FnZTogcGdyZXAgWy1jTF0gWy1kIERFTElNXSBbLUwgU0lHTkFMXSBbUEFUVEVSTl1cblxuU2VhcmNoIGZvciBwcm9jZXNzKGVzKS4gUEFUVEVSTiBpcyBhbiBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24gY2hlY2tlZFxuYWdhaW5zdCBjb21tYW5kIG5hbWVzLlxuXG4tYwlTaG93IG9ubHkgY291bnQgb2YgbWF0Y2hlc1xuLWQJVXNlIERFTElNIGluc3RlYWQgb2YgbmV3bGluZVxuLUwJU2VuZCBTSUdOQUwgaW5zdGVhZCBvZiBwcmludGluZyBuYW1lXG4tbAlTaG93IGNvbW1hbmQgbmFtZVxuXG4iCisKKyNkZWZpbmUgSEVMUF90b3BfY29tbW9uICJ1c2FnZTogKiBbLWJxXSBbLW4gTlVNQkVSXSBbLWQgU0VDT05EU10gWy1wIFBJRCxdIFstdSBVU0VSLF1cblxuLWIJQmF0Y2ggbW9kZSAobm8gdHR5KVxuLWQJRGVsYXkgU0VDT05EUyBiZXR3ZWVuIGVhY2ggY3ljbGUgKGRlZmF1bHQgMylcbi1uCUV4aXQgYWZ0ZXIgTlVNQkVSIGl0ZXJhdGlvbnNcbi1wCVNob3cgdGhlc2UgUElEc1xuLXUJU2hvdyB0aGVzZSBVU0VSc1xuLXEJUXVpZXQgKG5vIGhlYWRlciBsaW5lcylcblxuQ3Vyc29yIExFRlQvUklHSFQgdG8gY2hhbmdlIHNvcnQsIFVQL0RPV04gbW92ZSBsaXN0LCBzcGFjZSB0byBmb3JjZVxudXBkYXRlLCBSIHRvIHJldmVyc2Ugc29ydCwgUSB0byBleGl0LlxuXG4iCisKKyNkZWZpbmUgSEVMUF9pb3RvcCAidXNhZ2U6IGlvdG9wIFstQWFLT11cblxuUmFuayBwcm9jZXNzZXMgYnkgSS9PLlxuXG4tQQlBbGwgSS9PLCBub3QganVzdCBkaXNrXG4tYQlBY2N1bXVsYXRlZCBJL08gKG5vdCBwZXJjZW50YWdlKVxuLUsJS2lsb2J5dGVzXG4tawlGYWxsYmFjayBzb3J0IEZJRUxEUyAoZGVmYXVsdCAtW0RdSU8sLUVUSU1FLC1QSUQpXG4tTwlPbmx5IHNob3cgcHJvY2Vzc2VzIGRvaW5nIEkvT1xuLW8JU2hvdyBGSUVMRFMgKGRlZmF1bHQgUElELFBSLFVTRVIsW0RdUkVBRCxbRF1XUklURSxTV0FQLFtEXUlPLENPTU0pXG4tcwlTb3J0IGJ5IGZpZWxkIG51bWJlciAoMC1YLCBkZWZhdWx0IDYpXG5cbiIKKworI2RlZmluZSBIRUxQX3RvcCAidXNhZ2U6IHRvcCBbLUhdIFstayBGSUVMRCxdIFstbyBGSUVMRCxdIFstcyBTT1JUXVxuXG5TaG93IHByb2Nlc3MgYWN0aXZpdHkgaW4gcmVhbCB0aW1lLlxuXG4tSAlTaG93IHRocmVhZHNcbi1rCUZhbGxiYWNrIHNvcnQgRklFTERTIChkZWZhdWx0IC1TLC0lQ1BVLC1FVElNRSwtUElEKVxuLW8JU2hvdyBGSUVMRFMgKGRlZiBQSUQsVVNFUixQUixOSSxWSVJULFJFUyxTSFIsUywlQ1BVLCVNRU0sVElNRSssQ01ETElORSlcbi1PCUFkZCBGSUVMRFMgKHJlcGxhY2luZyBQUixOSSxWSVJULFJFUyxTSFIsUyBmcm9tIGRlZmF1bHQpXG4tcwlTb3J0IGJ5IGZpZWxkIG51bWJlciAoMS1YLCBkZWZhdWx0IDkpXG5cbiIKKworI2RlZmluZSBIRUxQX3BzICJ1c2FnZTogcHMgWy1BYWRlZkxsbndaXSBbLWdHIEdST1VQLF0gWy1rIEZJRUxELF0gWy1vIEZJRUxELF0gWy1wIFBJRCxdIFstdCBUVFksXSBbLXVVIFVTRVIsXVxuXG5MaXN0IHByb2Nlc3Nlcy5cblxuV2hpY2ggcHJvY2Vzc2VzIHRvIHNob3cgKHNlbGVjdGlvbnMgbWF5IGJlIGNvbW1hIHNlcGFyYXRlZCBsaXN0cyk6XG5cbi1BCUFsbCBwcm9jZXNzZXNcbi1hCVByb2Nlc3NlcyB3aXRoIHRlcm1pbmFscyB0aGF0IGFyZW4ndCBzZXNzaW9uIGxlYWRlcnNcbi1kCUFsbCBwcm9jZXNzZXMgdGhhdCBhcmVuJ3Qgc2Vzc2lvbiBsZWFkZXJzXG4tZQlTYW1lIGFzIC1BXG4tZwlCZWxvbmdpbmcgdG8gR1JPVVBzXG4tRwlCZWxvbmdpbmcgdG8gcmVhbCBHUk9VUHMgKGJlZm9yZSBzZ2lkKVxuLXAJUElEcyAoLS1waWQpXG4tUAlQYXJlbnQgUElEcyAoLS1wcGlkKVxuLXMJSW4gc2Vzc2lvbiBJRHNcbi10CUF0dGFjaGVkIHRvIHNlbGVjdGVkIFRUWXNcbi1UCVNob3cgdGhyZWFkc1xuLXUJT3duZWQgYnkgVVNFUnNcbi1VCU93bmVkIGJ5IHJlYWwgVVNFUnMgKGJlZm9yZSBzdWlkKVxuXG5PdXRwdXQgbW9kaWZpZXJzOlxuXG4tawlTb3J0IEZJRUxEcyBpbiAraW5jcmVhc2luZyBvciAtZGVjcmVhc3Rpbmcgb3JkZXIgKC0tc29ydClcbi1NCU1lYXN1cmUgZmllbGQgd2lkdGhzIChleHBhbmRpbmcgYXMgbmVjZXNzYXJ5KVxuLW4JU2hvdyBudW1lcmljIFVTRVIgYW5kIEdST1VQXG4tdwlXaWRlIG91dHB1dCAoZG9uJ3QgdHJ1bmNhdGUgYXQgdGVybWluYWwgd2lkdGgpXG5cbldoaWNoIEZJRUxEcyB0byBzaG93LiAoRGVmYXVsdCA9IC1vIFBJRCxUVFksVElNRSxDTUQpXG5cbi1mCUZ1bGwgbGlzdGluZyAoLW8gVVNFUjo4PVVJRCxQSUQsUFBJRCxDLFNUSU1FLFRUWSxUSU1FLEFSR1M9Q01EKVxuLWwJTG9uZyBsaXN0aW5nICgtbyBGLFMsVUlELFBJRCxQUElELEMsUFJJLE5JLEFERFIsU1osV0NIQU4sVFRZLFRJTUUsQ01EKVxuLW8JT3V0cHV0IEZJRUxEcyBpbnN0ZWFkIG9mIGRlZmF1bHRzLCBlYWNoIHdpdGggb3B0aW9uYWwgOnNpemUgYW5kID10aXRsZVxuLU8JQWRkIEZJRUxEUyB0byBkZWZhdWx0c1xuLVoJSW5jbHVkZSBMQUJFTFxuXG5Db21tYW5kIGxpbmUgLW8gZmllbGRzOlxuXG4gIEFSR1MgICAgIENNRExJTkUgbWludXMgaW5pdGlhbCBwYXRoICAgICBDTUQgIENvbW1hbmQgKHRocmVhZCkgbmFtZSAoc3RhdFsyXSlcbiAgQ01ETElORSAgQ29tbWFuZCBsaW5lIChhcmd2W10pICAgICAgICAgIENPTU0gQ29tbWFuZCBmaWxlbmFtZSAoL3Byb2MvJFBJRC9leGUpXG4gIENPTU1BTkQgIENvbW1hbmQgZmlsZSAoL3Byb2MvJFBJRC9leGUpICBOQU1FIFByb2Nlc3MgbmFtZSAoYXJndlswXSBvZiAkUElEKVxuXG5Qcm9jZXNzIGF0dHJpYnV0ZSAtbyBGSUVMRHM6XG5cbiAgQUREUiAgSW5zdHJ1Y3Rpb24gcG9pbnRlciAgICAgICAgICAgICAgIEJJVCAgIElzIHRoaXMgcHJvY2VzcyAzMiBvciA2NCBiaXRzXG4gIENQVSAgIFdoaWNoIHByb2Nlc3NvciBydW5uaW5nIG9uICAgICAgICBFVElNRSAgIEVsYXBzZWQgdGltZSBzaW5jZSBQSUQgc3RhcnRcbiAgRiAgICAgRmxhZ3MgKDE9Rk9SS05PRVhFQyA0PVNVUEVSUFJJVikgIEdJRCAgICAgR3JvdXAgaWRcbiAgR1JPVVAgR3JvdXAgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIExBQkVMICAgU2VjdXJpdHkgbGFiZWxcbiAgTUFKRkwgTWFqb3IgcGFnZSBmYXVsdHMgICAgICAgICAgICAgICAgIE1JTkZMICAgTWlub3IgcGFnZSBmYXVsdHNcbiAgTkkgICAgTmljZW5lc3MgKGxvd2VyIGlzIGZhc3RlcilcbiAgUENQVSAgUGVyY2VudGFnZSBvZiBDUFUgdGltZSB1c2VkICAgICAgIFBDWSAgICAgQW5kcm9pZCBzY2hlZHVsaW5nIHBvbGljeVxuICBQR0lEICBQcm9jZXNzIEdyb3VwIElEXG4gIFBJRCAgIFByb2Nlc3MgSUQgICAgICAgICAgICAgICAgICAgICAgICBQUElEICAgIFBhcmVudCBQcm9jZXNzIElEXG4gIFBSSSAgIFByaW9yaXR5IChoaWdoZXIgaXMgZmFzdGVyKSAgICAgICBQU1IgICAgIFByb2Nlc3NvciBsYXN0IGV4ZWN1dGVkIG9uXG4gIFJHSUQgIFJlYWwgKGJlZm9yZSBzZ2lkKSBncm91cCBJRCAgICAgICBSR1JPVVAgIFJlYWwgKGJlZm9yZSBzZ2lkKSBncm91cCBuYW1lXG4gIFJTUyAgIFJlc2lkZW50IFNldCBTaXplIChwYWdlcyBpbiB1c2UpICBSVFBSSU8gIFJlYWx0aW1lIHByaW9yaXR5XG4gIFJVSUQgIFJlYWwgKGJlZm9yZSBzdWlkKSB1c2VyIElEICAgICAgICBSVVNFUiAgIFJlYWwgKGJlZm9yZSBzdWlkKSB1c2VyIG5hbWVcbiAgUyAgICAgUHJvY2VzcyBzdGF0ZTpcbiAgICAgICAgUiAocnVubmluZykgUyAoc2xlZXBpbmcpIEQgKGRldmljZSBJL08pIFQgKHN0b3BwZWQpICB0ICh0cmFjZWQpXG4gICAgICAgIFogKHpvbWJpZSkgIFggKGRlYWRlcikgICB4IChkZWFkKSAgICAgICBLICh3YWtla2lsbCkgVyAod2FraW5nKVxuICBTQ0hFRCBTY2hlZHVsaW5nIHBvbGljeSAoMD1vdGhlciwgMT1maWZvLCAyPXJyLCAzPWJhdGNoLCA0PWlzbywgNT1pZGxlKVxuICBTVEFUICBQcm9jZXNzIHN0YXRlIChTKSBwbHVzOlxuICAgICAgICA8IGhpZ2ggcHJpb3JpdHkgICAgICAgICAgTiBsb3cgcHJpb3JpdHkgTCBsb2NrZWQgbWVtb3J5XG4gICAgICAgIHMgc2Vzc2lvbiBsZWFkZXIgICAgICAgICArIGZvcmVncm91bmQgICBsIG11bHRpdGhyZWFkZWRcbiAgU1RJTUUgU3RhcnQgdGltZSBvZiBwcm9jZXNzIGluIGhoOm1tIChzaXplIDoxOSBzaG93cyB5eXl5LW1tLWRkIGhoOm1tOnNzKVxuICBTWiAgICBNZW1vcnkgU2l6ZSAoNGsgcGFnZXMgbmVlZGVkIHRvIGNvbXBsZXRlbHkgc3dhcCBvdXQgcHJvY2VzcylcbiAgVENOVCAgVGhyZWFkIGNvdW50ICAgICAgICAgICAgICAgICAgICAgIFRJRCAgICAgVGhyZWFkIElEXG4gIFRJTUUgIENQVSB0aW1lIGNvbnN1bWVkICAgICAgICAgICAgICAgICBUVFkgICAgIENvbnRyb2xsaW5nIHRlcm1pbmFsXG4gIFVJRCAgIFVzZXIgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSICAgIFVzZXIgbmFtZVxuICBWU1ogICBWaXJ0dWFsIG1lbW9yeSBzaXplICgxayB1bml0cykgICAgJVZTWiAgICBWU1ogYXMgJSBvZiBwaHlzaWNhbCBtZW1vcnlcbiAgV0NIQU4gV2hhdCBhcmUgd2Ugd2FpdGluZyBpbiBrZXJuZWwgZm9yXG5cbiIKKworI2RlZmluZSBIRUxQX3ByaW50ZiAidXNhZ2U6IHByaW50ZiBGT1JNQVQgW0FSR1VNRU5ULi4uXVxuXG5Gb3JtYXQgYW5kIHByaW50IEFSR1VNRU5UKHMpIGFjY29yZGluZyB0byBGT1JNQVQsIHVzaW5nIEMgcHJpbnRmIHN5bnRheFxuKCUgZXNjYXBlcyBmb3IgY2RlRWZnR2lvc3V4WCwgXFwgZXNjYXBlcyBmb3IgYWJlZm5ydHYwIG9yIFxcT0NUQUwgb3IgXFx4SEVYKS5cblxuIgorCisjZGVmaW5lIEhFTFBfcGF0Y2ggInVzYWdlOiBwYXRjaCBbLWQgRElSXSBbLWkgZmlsZV0gWy1wIGRlcHRoXSBbLVJsdV0gWy0tZHJ5LXJ1bl1cblxuQXBwbHkgYSB1bmlmaWVkIGRpZmYgdG8gb25lIG9yIG1vcmUgZmlsZXMuXG5cbi1kCW1vZGlmeSBmaWxlcyBpbiBESVJcbi1pCUlucHV0IGZpbGUgKGRlZmF1bHRzPXN0ZGluKVxuLWwJTG9vc2UgbWF0Y2ggKGlnbm9yZSB3aGl0ZXNwYWNlKVxuLXAJTnVtYmVyIG9mICcvJyB0byBzdHJpcCBmcm9tIHN0YXJ0IG9mIGZpbGUgcGF0aHMgKGRlZmF1bHQ9YWxsKVxuLVIJUmV2ZXJzZSBwYXRjaC5cbi11CUlnbm9yZWQgKG9ubHkgaGFuZGxlcyBcInVuaWZpZWRcIiBkaWZmcylcbi0tZHJ5LXJ1biBEb24ndCBjaGFuZ2UgZmlsZXMsIGp1c3QgY29uZmlybSBwYXRjaCBhcHBsaWVzXG5cblRoaXMgdmVyc2lvbiBvZiBwYXRjaCBvbmx5IGhhbmRsZXMgdW5pZmllZCBkaWZmcywgYW5kIG9ubHkgbW9kaWZpZXNcbmEgZmlsZSB3aGVuIGFsbCBhbGwgaHVua3MgdG8gdGhhdCBmaWxlIGFwcGx5LiAgUGF0Y2ggcHJpbnRzIGZhaWxlZFxuaHVua3MgdG8gc3RkZXJyLCBhbmQgZXhpdHMgd2l0aCBub256ZXJvIHN0YXR1cyBpZiBhbnkgaHVua3MgZmFpbC5cblxuQSBmaWxlIGNvbXBhcmVkIGFnYWluc3QgL2Rldi9udWxsIChvciB3aXRoIGEgZGF0ZSA8PSB0aGUgZXBvY2gpIGlzXG5jcmVhdGVkL2RlbGV0ZWQgYXMgYXBwcm9wcmlhdGUuXG5cbiIKKworI2RlZmluZSBIRUxQX3Bhc3RlICJ1c2FnZTogcGFzdGUgWy1zXSBbLWQgbGlzdF0gW2ZpbGUuLi5dXG5cblJlcGxhY2UgbmV3bGluZXMgaW4gZmlsZXMuXG5cbi1kIGxpc3QgICAgbGlzdCBvZiBkZWxpbWl0ZXJzIHRvIHNlcGFyYXRlIGxpbmVzXG4tcyAgICAgICAgIHByb2Nlc3MgZmlsZXMgc2VxdWVudGlhbGx5IGluc3RlYWQgb2YgaW4gcGFyYWxsZWxcblxuQnkgZGVmYXVsdCBwcmludCBjb3JyZXNwb25kaW5nIGxpbmVzIHNlcGFyYXRlZCBieSA8dGFiPi5cblxuIgorCisjZGVmaW5lIEhFTFBfb2QgInVzYWdlOiBvZCBbLWJjZG9zeHZdIFstaiAjXSBbLU4gI10gWy13ICNdIFstQSBkb3huXSBbLXQgYWNkZm91eFsjXV1cblxuLUEJQWRkcmVzcyBiYXNlIChkZWNpbWFsLCBvY3RhbCwgaGV4ZGVjaW1hbCwgbm9uZSlcbi1qCVNraXAgdGhpcyBtYW55IGJ5dGVzIG9mIGlucHV0XG4tTglTdG9wIGR1bXBpbmcgYWZ0ZXIgdGhpcyBtYW55IGJ5dGVzXG4tdAlPdXRwdXQgdHlwZSBhKHNjaWkpIGMoaGFyKSBkKGVjaW1hbCkgZihsb2F0KSBvKGN0YWwpIHUobnNpZ25lZCkgKGhlKXhcbglwbHVzIG9wdGlvbmFsIHNpemUgaW4gYnl0ZXNcbglhbGlhc2VzOiAtYj0tdCBvMSwgLWM9LXQgYywgLWQ9LXQgdTIsIC1vPS10IG8yLCAtcz0tdCBkMiwgLXg9LXQgeDJcbi12CURvbid0IGNvbGxhcHNlIHJlcGVhdGVkIGxpbmVzIHRvZ2V0aGVyXG4tdwlUb3RhbCBsaW5lIHdpZHRoIGluIGJ5dGVzIChkZWZhdWx0IDE2KS5cblxuIgorCisjZGVmaW5lIEhFTFBfbm9odXAgInVzYWdlOiBub2h1cCBDT01NQU5EIFtBUkdTLi4uXVxuXG5SdW4gYSBjb21tYW5kIHRoYXQgc3Vydml2ZXMgdGhlIGVuZCBvZiBpdHMgdGVybWluYWwuXG5cblJlZGlyZWN0IHR0eSBvbiBzdGRpbiB0byAvZGV2L251bGwsIHR0eSBvbiBzdGRvdXQgdG8gXCJub2h1cC5vdXRcIi5cblxuIgorCisjZGVmaW5lIEhFTFBfbmwgInVzYWdlOiBubCBbLUVdIFstbCAjXSBbLWIgTU9ERV0gWy1uIFNUWUxFXSBbLXMgU0VQQVJBVE9SXSBbLXcgV0lEVEhdIFtGSUxFLi4uXVxuXG5OdW1iZXIgbGluZXMgb2YgaW5wdXQuXG5cbi1FCVVzZSBleHRlbmRlZCByZWdleCBzeW50YXggKHdoZW4gZG9pbmcgLWIgcFJFR0VYKVxuLWIJd2hpY2ggbGluZXMgdG8gbnVtYmVyOiBhIChhbGwpIHQgKG5vbi1lbXB0eSwgZGVmYXVsdCkgcFJFR0VYIChwYXR0ZXJuKVxuLWwJT25seSBjb3VudCBsYXN0IG9mIHRoaXMgbWFueSBjb25zZWN1dGl2ZSBibGFuayBsaW5lc1xuLW4JbnVtYmVyIFNUWUxFOiBsbiAobGVmdCBqdXN0aWZpZWQpIHJuIChyaWdodCBqdXN0aWZpZWQpIHJ6ICh6ZXJvIHBhZClcbi1zCVNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBudW1iZXIgYW5kIGxpbmUgKGluc3RlYWQgb2YgVEFCKVxuLXcJV2lkdGggb2YgbGluZSBudW1iZXJzIChkZWZhdWx0IDYpXG5cbiIKKworI2RlZmluZSBIRUxQX25pY2UgInVzYWdlOiBuaWNlIFstbiBQUklPUklUWV0gY29tbWFuZCBbYXJncy4uLl1cblxuUnVuIGEgY29tbWFuZCBsaW5lIGF0IGFuIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgc2NoZWR1bGluZyBwcmlvcml0eS5cblxuSGlnaGVyIG51bWJlcnMgbWFrZSBhIHByb2dyYW0geWllbGQgbW9yZSBDUFUgdGltZSwgZnJvbSAtMjAgKGhpZ2hlc3RcbnByaW9yaXR5KSB0byAxOSAobG93ZXN0KS4gIEJ5IGRlZmF1bHQgcHJvY2Vzc2VzIGluaGVyaXQgdGhlaXIgcGFyZW50J3Ncbm5pY2VuZXNzICh1c3VhbGx5IDApLiAgQnkgZGVmYXVsdCB0aGlzIGNvbW1hbmQgYWRkcyAxMCB0byB0aGUgcGFyZW50J3NcbnByaW9yaXR5LiAgT25seSByb290IGNhbiBzZXQgYSBuZWdhdGl2ZSBuaWNlbmVzcyBsZXZlbC5cblxuIgorCisjZGVmaW5lIEhFTFBfbWtmaWZvICJ1c2FnZTogbWtmaWZvIFstWiBDT05URVhUXSBbTkFNRS4uLl1cblxuQ3JlYXRlIEZJRk9zIChuYW1lZCBwaXBlcykuXG5cbi1aCVNlY3VyaXR5IGNvbnRleHRcbiIKKworI2RlZmluZSBIRUxQX21rZGlyX3ogInVzYWdlOiBbLVogY29udGV4dF1cblxuLVoJc2V0IHNlY3VyaXR5IGNvbnRleHRcblxuIgorCisjZGVmaW5lIEhFTFBfbWtkaXIgInVzYWdlOiBta2RpciBbLXZwXSBbLW0gbW9kZV0gW2Rpcm5hbWUuLi5dXG5cbkNyZWF0ZSBvbmUgb3IgbW9yZSBkaXJlY3Rvcmllcy5cblxuLW0Jc2V0IHBlcm1pc3Npb25zIG9mIGRpcmVjdG9yeSB0byBtb2RlLlxuLXAJbWFrZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXMgbmVlZGVkLlxuLXYJdmVyYm9zZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9sc19jb2xvciAiLS1jb2xvciAgZGV2aWNlPXllbGxvdyAgc3ltbGluaz10dXJxdW9pc2UvcmVkICBkaXI9Ymx1ZSAgc29ja2V0PXB1cnBsZVxuICAgICAgICAgZmlsZXM6IGV4ZT1ncmVlbiAgc3VpZD1yZWQgIHN1aWRmaWxlPXJlZGJhY2sgIHN0aWNreWRpcj1ncmVlbmJhY2tcbiAgICAgICAgID1hdXRvIG1lYW5zIGRldGVjdCBpZiBvdXRwdXQgaXMgYSB0dHkuXG5cbnVzYWdlOiBscyAtLWNvbG9yWz1hdXRvXSBbLUFDRkhMUlNaYWNkZmhpa2xtbnBxcnN0dXgxXSBbZGlyZWN0b3J5Li4uXVxuXG5saXN0IGZpbGVzXG5cbndoYXQgdG8gc2hvdzpcbi1hICBhbGwgZmlsZXMgaW5jbHVkaW5nIC5oaWRkZW4gICAgLWIgIGVzY2FwZSBub25ncmFwaGljIGNoYXJzXG4tYyAgdXNlIGN0aW1lIGZvciB0aW1lc3RhbXBzICAgICAgIC1kICBkaXJlY3RvcnksIG5vdCBjb250ZW50c1xuLWkgIGlub2RlIG51bWJlciAgICAgICAgICAgICAgICAgICAtayAgYmxvY2sgc2l6ZXMgaW4ga2lsb2J5dGVzXG4tcCAgcHV0IGEgJy8nIGFmdGVyIGRpciBuYW1lcyAgICAgIC1xICB1bnByaW50YWJsZSBjaGFycyBhcyAnPydcbi1zICBzaXplIChpbiBibG9ja3MpICAgICAgICAgICAgICAgLXUgIHVzZSBhY2Nlc3MgdGltZSBmb3IgdGltZXN0YW1wc1xuLUEgIGxpc3QgYWxsIGZpbGVzIGJ1dCAuIGFuZCAuLiAgICAtSCAgZm9sbG93IGNvbW1hbmQgbGluZSBzeW1saW5rc1xuLUwgIGZvbGxvdyBzeW1saW5rcyAgICAgICAgICAgICAgICAtUiAgcmVjdXJzaXZlbHkgbGlzdCBmaWxlcyBpbiBzdWJkaXJzXG4tRiAgYXBwZW5kIC9kaXIgKmV4ZSBAc3ltIHxGSUZPICAgIC1aICBzZWN1cml0eSBjb250ZXh0XG5cbm91dHB1dCBmb3JtYXRzOlxuLTEgIGxpc3Qgb25lIGZpbGUgcGVyIGxpbmUgICAgICAgICAtQyAgY29sdW1ucyAoc29ydGVkIHZlcnRpY2FsbHkpXG4tZyAgbGlrZSAtbCBidXQgbm8gb3duZXIgICAgICAgICAgIC1oICBodW1hbiByZWFkYWJsZSBzaXplc1xuLWwgIGxvbmcgKHNob3cgZnVsbCBkZXRhaWxzKSAgICAgICAtbSAgY29tbWEgc2VwYXJhdGVkXG4tbiAgbGlrZSAtbCBidXQgbnVtZXJpYyB1aWQvZ2lkICAgIC1vICBsaWtlIC1sIGJ1dCBubyBncm91cFxuLXggIGNvbHVtbnMgKGhvcml6b250YWwgc29ydClcblxuc29ydGluZyAoZGVmYXVsdCBpcyBhbHBoYWJldGljYWwpOlxuLWYgIHVuc29ydGVkICAgIC1yICByZXZlcnNlICAgIC10ICB0aW1lc3RhbXAgICAgLVMgIHNpemVcbiIKKworI2RlZmluZSBIRUxQX2xzICJ1c2FnZTogbHMgLS1jb2xvcls9YXV0b10gWy1BQ0ZITFJTWmFjZGZoaWtsbW5wcXJzdHV4MV0gW2RpcmVjdG9yeS4uLl1cblxubGlzdCBmaWxlc1xuXG53aGF0IHRvIHNob3c6XG4tYSAgYWxsIGZpbGVzIGluY2x1ZGluZyAuaGlkZGVuICAgIC1iICBlc2NhcGUgbm9uZ3JhcGhpYyBjaGFyc1xuLWMgIHVzZSBjdGltZSBmb3IgdGltZXN0YW1wcyAgICAgICAtZCAgZGlyZWN0b3J5LCBub3QgY29udGVudHNcbi1pICBpbm9kZSBudW1iZXIgICAgICAgICAgICAgICAgICAgLWsgIGJsb2NrIHNpemVzIGluIGtpbG9ieXRlc1xuLXAgIHB1dCBhICcvJyBhZnRlciBkaXIgbmFtZXMgICAgICAtcSAgdW5wcmludGFibGUgY2hhcnMgYXMgJz8nXG4tcyAgc2l6ZSAoaW4gYmxvY2tzKSAgICAgICAgICAgICAgIC11ICB1c2UgYWNjZXNzIHRpbWUgZm9yIHRpbWVzdGFtcHNcbi1BICBsaXN0IGFsbCBmaWxlcyBidXQgLiBhbmQgLi4gICAgLUggIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3Ncbi1MICBmb2xsb3cgc3ltbGlua3MgICAgICAgICAgICAgICAgLVIgIHJlY3Vyc2l2ZWx5IGxpc3QgZmlsZXMgaW4gc3ViZGlyc1xuLUYgIGFwcGVuZCAvZGlyICpleGUgQHN5bSB8RklGTyAgICAtWiAgc2VjdXJpdHkgY29udGV4dFxuXG5vdXRwdXQgZm9ybWF0czpcbi0xICBsaXN0IG9uZSBmaWxlIHBlciBsaW5lICAgICAgICAgLUMgIGNvbHVtbnMgKHNvcnRlZCB2ZXJ0aWNhbGx5KVxuLWcgIGxpa2UgLWwgYnV0IG5vIG93bmVyICAgICAgICAgICAtaCAgaHVtYW4gcmVhZGFibGUgc2l6ZXNcbi1sICBsb25nIChzaG93IGZ1bGwgZGV0YWlscykgICAgICAgLW0gIGNvbW1hIHNlcGFyYXRlZFxuLW4gIGxpa2UgLWwgYnV0IG51bWVyaWMgdWlkL2dpZCAgICAtbyAgbGlrZSAtbCBidXQgbm8gZ3JvdXBcbi14ICBjb2x1bW5zIChob3Jpem9udGFsIHNvcnQpXG5cbnNvcnRpbmcgKGRlZmF1bHQgaXMgYWxwaGFiZXRpY2FsKTpcbi1mICB1bnNvcnRlZCAgICAtciAgcmV2ZXJzZSAgICAtdCAgdGltZXN0YW1wICAgIC1TICBzaXplXG4tLWNvbG9yICBkZXZpY2U9eWVsbG93ICBzeW1saW5rPXR1cnF1b2lzZS9yZWQgIGRpcj1ibHVlICBzb2NrZXQ9cHVycGxlXG4gICAgICAgICBmaWxlczogZXhlPWdyZWVuICBzdWlkPXJlZCAgc3VpZGZpbGU9cmVkYmFjayAgc3RpY2t5ZGlyPWdyZWVuYmFja1xuICAgICAgICAgPWF1dG8gbWVhbnMgZGV0ZWN0IGlmIG91dHB1dCBpcyBhIHR0eS5cblxuIgorCisjZGVmaW5lIEhFTFBfbG4gInVzYWdlOiBsbiBbLXNmbnZdIFtGUk9NLi4uXSBUT1xuXG5DcmVhdGUgYSBsaW5rIGJldHdlZW4gRlJPTSBhbmQgVE8uXG5XaXRoIG9ubHkgb25lIGFyZ3VtZW50LCBjcmVhdGUgbGluayBpbiBjdXJyZW50IGRpcmVjdG9yeS5cblxuLXMJQ3JlYXRlIGEgc3ltYm9saWMgbGlua1xuLWYJRm9yY2UgdGhlIGNyZWF0aW9uIG9mIHRoZSBsaW5rLCBldmVuIGlmIFRPIGFscmVhZHkgZXhpc3RzXG4tbglTeW1saW5rIGF0IGRlc3RpbmF0aW9uIHRyZWF0ZWQgYXMgZmlsZVxuLXYJVmVyYm9zZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9saW5rICJ1c2FnZTogbGluayBGSUxFIE5FV0xJTktcblxuQ3JlYXRlIGhhcmRsaW5rIHRvIGEgZmlsZS5cblxuIgorCisjZGVmaW5lIEhFTFBfa2lsbGFsbDUgInVzYWdlOiBraWxsYWxsNSBbLWwgW1NJR05BTF1dIFstU0lHTkFMfC1zIFNJR05BTF0gWy1vIFBJRF0uLi5cblxuU2VuZCBhIHNpZ25hbCB0byBhbGwgcHJvY2Vzc2VzIG91dHNpZGUgY3VycmVudCBzZXNzaW9uLlxuXG4tbCAgICAgTGlzdCBzaWduYWwgbmFtZShzKSBhbmQgbnVtYmVyKHMpXG4tbyBQSUQgT21pdCBQSURcbi1zICAgICBzZW5kIFNJR05BTCAoZGVmYXVsdCBTSUdURVJNKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9raWxsICJ1c2FnZToga2lsbCBbLWwgW1NJR05BTF0gfCAtcyBTSUdOQUwgfCAtU0lHTkFMXSBwaWQuLi5cblxuU2VuZCBzaWduYWwgdG8gcHJvY2VzcyhlcykuXG5cbi1sCUxpc3Qgc2lnbmFsIG5hbWUocykgYW5kIG51bWJlcihzKVxuLXMJU2VuZCBTSUdOQUwgKGRlZmF1bHQgU0lHVEVSTSlcblxuIgorCisjZGVmaW5lIEhFTFBfd2hvYW1pICJ1c2FnZTogd2hvYW1pXG5cblByaW50IHRoZSBjdXJyZW50IHVzZXIgbmFtZS5cblxuIgorCisjZGVmaW5lIEhFTFBfbG9nbmFtZSAidXNhZ2U6IGxvZ25hbWVcblxuUHJpbnQgdGhlIGN1cnJlbnQgdXNlciBuYW1lLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9ncm91cHMgInVzYWdlOiBncm91cHMgW3VzZXJdXG5cblByaW50IHRoZSBncm91cHMgYSB1c2VyIGlzIGluLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9pZCAidXNhZ2U6IGlkIFstR1pnbnJ1XSBcblxuUHJpbnQgdXNlciBhbmQgZ3JvdXAgSUQuXG4tRwlTaG93IG9ubHkgdGhlIGdyb3VwIElEc1xuLVoJU2hvdyBvbmx5IHNlY3VyaXR5IGNvbnRleHRcbi1nCVNob3cgb25seSB0aGUgZWZmZWN0aXZlIGdyb3VwIElEXG4tbglwcmludCBuYW1lcyBpbnN0ZWFkIG9mIG51bWVyaWMgSURzICh0byBiZSB1c2VkIHdpdGggLUdndSlcbi1yCVNob3cgcmVhbCBJRCBpbnN0ZWFkIG9mIGVmZmVjdGl2ZSBJRFxuLXUJU2hvdyBvbmx5IHRoZSBlZmZlY3RpdmUgdXNlciBJRFxuIgorCisjZGVmaW5lIEhFTFBfaGVhZCAidXNhZ2U6IGhlYWQgWy1uIG51bWJlcl0gW2ZpbGUuLi5dXG5cbkNvcHkgZmlyc3QgbGluZXMgZnJvbSBmaWxlcyB0byBzdGRvdXQuIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tXG5zdGRpbi4gRmlsZW5hbWUgXCItXCIgaXMgYSBzeW5vbnltIGZvciBzdGRpbi5cblxuLW4JTnVtYmVyIG9mIGxpbmVzIHRvIGNvcHkuXG5cbiIKKworI2RlZmluZSBIRUxQX2dyZXAgInVzYWdlOiBncmVwIFstRUZpdndjbG9xc0hiaG5dIFstQSBOVU1dIFstbSBNQVhdIFstZSBSRUdFWF0uLi4gWy1mIFJFR0ZJTEVdIFtGSUxFXS4uLlxuXG5TaG93IGxpbmVzIG1hdGNoaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIElmIG5vIC1lLCBmaXJzdCBhcmd1bWVudCBpc1xucmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoLiBXaXRoIG5vIGZpbGVzIChvciBcIi1cIiBmaWxlbmFtZSkgcmVhZCBzdGRpbi5cblJldHVybnMgMCBpZiBtYXRjaGVkLCAxIGlmIG5vIG1hdGNoIGZvdW5kLlxuXG4tZSAgUmVnZXggdG8gbWF0Y2guIChNYXkgYmUgcmVwZWF0ZWQuKVxuLWYgIEZpbGUgY29udGFpbmluZyByZWd1bGFyIGV4cHJlc3Npb25zIHRvIG1hdGNoLlxuXG5tYXRjaCB0eXBlOlxuLUEgIFNob3cgTlVNIGxpbmVzIGFmdGVyICAgICAtQiAgU2hvdyBOVU0gbGluZXMgYmVmb3JlIG1hdGNoXG4tQyAgTlVNIGxpbmVzIGNvbnRleHQgKEErQikgIC1FICBleHRlbmRlZCByZWdleCBzeW50YXhcbi1GICBmaXhlZCAobGl0ZXJhbCBtYXRjaCkgICAgLWkgIGNhc2UgaW5zZW5zaXRpdmVcbi1tICBtYXRjaCBNQVggbWFueSBsaW5lcyAgICAgLXIgIHJlY3Vyc2l2ZSAob24gZGlyKVxuLXYgIGludmVydCBtYXRjaCAgICAgICAgICAgICAtdyAgd2hvbGUgd29yZCAoaW1wbGllcyAtRSlcbi14ICB3aG9sZSBsaW5lICAgICAgICAgICAgICAgLXogIGlucHV0IE5VTCB0ZXJtaW5hdGVkXG5cbmRpc3BsYXkgbW9kZXM6IChkZWZhdWx0OiBtYXRjaGVkIGxpbmUpXG4tYyAgY291bnQgb2YgbWF0Y2hpbmcgbGluZXMgIC1sICBzaG93IG1hdGNoaW5nIGZpbGVuYW1lc1xuLW8gIG9ubHkgbWF0Y2hpbmcgcGFydCAgICAgICAtcSAgcXVpZXQgKGVycm9ycyBvbmx5KVxuLXMgIHNpbGVudCAobm8gZXJyb3IgbXNnKSAgICAtWiAgb3V0cHV0IE5VTCB0ZXJtaW5hdGVkXG5cbm91dHB1dCBwcmVmaXggKGRlZmF1bHQ6IGZpbGVuYW1lIGlmIGNoZWNraW5nIG1vcmUgdGhhbiAxIGZpbGUpXG4tSCAgZm9yY2UgZmlsZW5hbWUgICAgICAgICAgIC1iICBieXRlIG9mZnNldCBvZiBtYXRjaFxuLWggIGhpZGUgZmlsZW5hbWUgICAgICAgICAgICAtbiAgbGluZSBudW1iZXIgb2YgbWF0Y2hcblxuIgorCisjZGVmaW5lIEhFTFBfZmluZCAidXNhZ2U6IGZpbmQgWy1ITF0gW0RJUi4uLl0gWzxvcHRpb25zPl1cblxuU2VhcmNoIGRpcmVjdG9yaWVzIGZvciBtYXRjaGluZyBmaWxlcy5cbkRlZmF1bHQ6IHNlYXJjaCBcIi5cIiBtYXRjaCBhbGwgLXByaW50IGFsbCBtYXRjaGVzLlxuXG4tSCAgRm9sbG93IGNvbW1hbmQgbGluZSBzeW1saW5rcyAgICAgICAgIC1MICBGb2xsb3cgYWxsIHN5bWxpbmtzXG5cbk1hdGNoIGZpbHRlcnM6XG4tbmFtZSAgUEFUVEVSTiAgZmlsZW5hbWUgd2l0aCB3aWxkY2FyZHMgICAtaW5hbWUgICAgICBjYXNlIGluc2Vuc2l0aXZlIC1uYW1lXG4tcGF0aCAgUEFUVEVSTiAgcGF0aCBuYW1lIHdpdGggd2lsZGNhcmRzICAtaXBhdGggICAgICBjYXNlIGluc2Vuc2l0aXZlIC1wYXRoXG4tdXNlciAgVU5BTUUgICAgYmVsb25ncyB0byB1c2VyIFVOQU1FICAgICAtbm91c2VyICAgICB1c2VyIElEIG5vdCBrbm93blxuLWdyb3VwIEdST1VQICAgIGJlbG9uZ3MgdG8gZ3JvdXAgR1JPVVAgICAgLW5vZ3JvdXAgICAgZ3JvdXAgSUQgbm90IGtub3duXG4tcGVybSAgWy0vXU1PREUgcGVybWlzc2lvbnMgKC09bWluIC89YW55KSAtcHJ1bmUgICAgICBpZ25vcmUgY29udGVudHMgb2YgZGlyXG4tc2l6ZSAgTltjXSAgICAgNTEyIGJ5dGUgYmxvY2tzIChjPWJ5dGVzKSAteGRldiAgICAgICBvbmx5IHRoaXMgZmlsZXN5c3RlbVxuLWxpbmtzIE4gICAgICAgIGhhcmRsaW5rIGNvdW50ICAgICAgICAgICAgLWF0aW1lIE4gICAgYWNjZXNzZWQgTiBkYXlzIGFnb1xuLWN0aW1lIE4gICAgICAgIGNyZWF0ZWQgTiBkYXlzIGFnbyAgICAgICAgLW10aW1lIE4gICAgbW9kaWZpZWQgTiBkYXlzIGFnb1xuLW5ld2VyIEZJTEUgICAgIG5ld2VyIG10aW1lIHRoYW4gRklMRSAgICAgLW1pbmRlcHRoICMgYXQgbGVhc3QgIyBkaXJzIGRvd25cbi1kZXB0aCAgICAgICAgICBpZ25vcmUgY29udGVudHMgb2YgZGlyICAgIC1tYXhkZXB0aCAjIGF0IG1vc3QgIyBkaXJzIGRvd25cbi1pbnVtICBOICAgICAgICBpbm9kZSBudW1iZXIgTiAgICAgICAgICAgIC1lbXB0eSAgICAgIGVtcHR5IGZpbGVzIGFuZCBkaXJzXG4tdHlwZSBbYmNkZmxwc10gKGJsb2NrLCBjaGFyLCBkaXIsIGZpbGUsIHN5bWxpbmssIHBpcGUsIHNvY2tldClcblxuTnVtYmVycyBOIG1heSBiZSBwcmVmaXhlZCBieSBhIC0gKGxlc3MgdGhhbikgb3IgKyAoZ3JlYXRlciB0aGFuKTpcblxuQ29tYmluZSBtYXRjaGVzIHdpdGg6XG4hLCAtYSwgLW8sICggKSAgICBub3QsIGFuZCwgb3IsIGdyb3VwIGV4cHJlc3Npb25zXG5cbkFjdGlvbnM6XG4tcHJpbnQgICBQcmludCBtYXRjaCB3aXRoIG5ld2xpbmUgIC1wcmludDAgICAgUHJpbnQgbWF0Y2ggd2l0aCBudWxsXG4tZXhlYyAgICBSdW4gY29tbWFuZCB3aXRoIHBhdGggICAgIC1leGVjZGlyICAgUnVuIGNvbW1hbmQgaW4gZmlsZSdzIGRpclxuLW9rICAgICAgQXNrIGJlZm9yZSBleGVjICAgICAgICAgICAtb2tkaXIgICAgIEFzayBiZWZvcmUgZXhlY2RpclxuLWRlbGV0ZSAgUmVtb3ZlIG1hdGNoaW5nIGZpbGUvZGlyXG5cbkNvbW1hbmRzIHN1YnN0aXR1dGUgXCJ7fVwiIHdpdGggbWF0Y2hlZCBmaWxlLiBFbmQgd2l0aCBcIjtcIiB0byBydW4gZWFjaCBmaWxlLFxub3IgXCIrXCIgKG5leHQgYXJndW1lbnQgYWZ0ZXIgXCJ7fVwiKSB0byBjb2xsZWN0IGFuZCBydW4gd2l0aCBtdWx0aXBsZSBmaWxlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfZmlsZSAidXNhZ2U6IGZpbGUgW2ZpbGUuLi5dXG5cbkV4YW1pbmUgdGhlIGdpdmVuIGZpbGVzIGFuZCBkZXNjcmliZSB0aGVpciBjb250ZW50IHR5cGVzLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9mYWxzZSAiUmV0dXJuIG5vbnplcm8uXG5cbiIKKworI2RlZmluZSBIRUxQX2V4cGFuZCAidXNhZ2U6IGV4cGFuZCBbLXQgVEFCTElTVF0gW0ZJTEUuLi5dXG5cbkV4cGFuZCB0YWJzIHRvIHNwYWNlcyBhY2NvcmRpbmcgdG8gdGFic3RvcHMuXG5cbi10CVRBQkxJU1RcblxuU3BlY2lmeSB0YWIgc3RvcHMsIGVpdGhlciBhIHNpbmdsZSBudW1iZXIgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA4LFxub3IgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbmNyZWFzaW5nIG51bWJlcnMgcmVwcmVzZW50aW5nIHRhYnN0b3BcbnBvc2l0aW9ucyAoYWJzb2x1dGUsIG5vdCBpbmNyZW1lbnRzKSB3aXRoIGVhY2ggYWRkaXRpb25hbCB0YWIgYmV5b3VuZFxudGhhdCBiZWNvbWluZyBvbmUgc3BhY2UuXG5cbiIKKworI2RlZmluZSBIRUxQX2VudiAidXNhZ2U6IGVudiBbLWldIFstdSBOQU1FXSBbTkFNRT1WQUxVRS4uLl0gW2NvbW1hbmQgW29wdGlvbi4uLl1dXG5cblNldCB0aGUgZW52aXJvbm1lbnQgZm9yIGNvbW1hbmQgaW52b2NhdGlvbi5cblxuLWkJQ2xlYXIgZXhpc3RpbmcgZW52aXJvbm1lbnQuXG4tdSBOQU1FCVJlbW92ZSBOQU1FIGZyb20gdGhlIGVudmlyb25tZW50XG5cbiIKKworI2RlZmluZSBIRUxQX2VjaG8gInVzYWdlOiBlY2hvIFstbmVdIFthcmdzLi4uXVxuXG5Xcml0ZSBlYWNoIGFyZ3VtZW50IHRvIHN0ZG91dCwgd2l0aCBvbmUgc3BhY2UgYmV0d2VlbiBlYWNoLCBmb2xsb3dlZFxuYnkgYSBuZXdsaW5lLlxuXG4tbglObyB0cmFpbGluZyBuZXdsaW5lLlxuLWUJUHJvY2VzcyB0aGUgZm9sbG93aW5nIGVzY2FwZSBzZXF1ZW5jZXM6XG4JXFxcXAliYWNrc2xhc2hcbglcXDBOTk4Jb2N0YWwgdmFsdWVzICgxIHRvIDMgZGlnaXRzKVxuCVxcYQlhbGVydCAoYmVlcC9mbGFzaClcbglcXGIJYmFja3NwYWNlXG4JXFxjCXN0b3Agb3V0cHV0IGhlcmUgKGF2b2lkcyB0cmFpbGluZyBuZXdsaW5lKVxuCVxcZglmb3JtIGZlZWRcbglcXG4JbmV3bGluZVxuCVxccgljYXJyaWFnZSByZXR1cm5cbglcXHQJaG9yaXpvbnRhbCB0YWJcbglcXHYJdmVydGljYWwgdGFiXG4JXFx4SEgJaGV4YWRlY2ltYWwgdmFsdWVzICgxIHRvIDIgZGlnaXRzKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9kdSAidXNhZ2U6IGR1IFstZCBOXSBbLWFza3hITGxtY10gW2ZpbGUuLi5dXG5cblNob3cgZGlzayB1c2FnZSwgc3BhY2UgY29uc3VtZWQgYnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuXG5TaXplIGluOlxuLWsgICAgMTAyNCBieXRlIGJsb2NrcyAoZGVmYXVsdClcbi1LICAgIDUxMiBieXRlIGJsb2NrcyAocG9zaXgpXG4tbSAgICBtZWdhYnl0ZXNcbi1oICAgIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoZS5nLiwgMUsgMjQzTSAyRyApXG5cbldoYXQgdG8gc2hvdzpcbi1hICAgIGFsbCBmaWxlcywgbm90IGp1c3QgZGlyZWN0b3JpZXNcbi1IICAgIGZvbGxvdyBzeW1saW5rcyBvbiBjbWRsaW5lXG4tTCAgICBmb2xsb3cgYWxsIHN5bWxpbmtzXG4tcyAgICBvbmx5IHRvdGFsIHNpemUgb2YgZWFjaCBhcmd1bWVudFxuLXggICAgZG9uJ3QgbGVhdmUgdGhpcyBmaWxlc3lzdGVtXG4tYyAgICBjdW11bGF0aXZlIHRvdGFsXG4tZCBOICBvbmx5IGRlcHRoIDwgTlxuLWwgICAgZGlzYWJsZSBoYXJkbGluayBmaWx0ZXJcblxuIgorCisjZGVmaW5lIEhFTFBfZGlybmFtZSAidXNhZ2U6IGRpcm5hbWUgUEFUSFxuXG5TaG93IGRpcmVjdG9yeSBwb3J0aW9uIG9mIHBhdGguXG5cbiIKKworI2RlZmluZSBIRUxQX2RmICJ1c2FnZTogZGYgWy1IUGtoXSBbLXQgdHlwZV0gW0ZJTEVTWVNURU0gLi4uXVxuXG5UaGUgXCJkaXNrIGZyZWVcIiBjb21tYW5kIHNob3dzIHRvdGFsL3VzZWQvYXZhaWxhYmxlIGRpc2sgc3BhY2UgZm9yXG5lYWNoIGZpbGVzeXN0ZW0gbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIGFsbCBjdXJyZW50bHkgbW91bnRlZFxuZmlsZXN5c3RlbXMuXG5cbi1QCVRoZSBTVVN2MyBcIlBlZGFudGljXCIgb3B0aW9uXG4tawlTZXRzIHVuaXRzIGJhY2sgdG8gMTAyNCBieXRlcyAodGhlIGRlZmF1bHQgd2l0aG91dCAtUClcbi1oCUh1bWFuIHJlYWRhYmxlIG91dHB1dCAoSz0xMDI0KVxuLUgJSHVtYW4gcmVhZGFibGUgb3V0cHV0IChrPTEwMDApXG4tdCB0eXBlCURpc3BsYXkgb25seSBmaWxlc3lzdGVtcyBvZiB0aGlzIHR5cGUuXG5cblBlZGFudGljIHByb3ZpZGVzIGEgc2xpZ2h0bHkgbGVzcyB1c2VmdWwgb3V0cHV0IGZvcm1hdCBkaWN0YXRlZCBieSBQb3NpeCxcbmFuZCBzZXRzIHRoZSB1bml0cyB0byA1MTIgYnl0ZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAxMDI0IGJ5dGVzLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9kYXRlICJ1c2FnZTogZGF0ZSBbLXVdIFstciBGSUxFXSBbLWQgREFURV0gWytESVNQTEFZX0ZPUk1BVF0gWy1EIFNFVF9GT1JNQVRdIFtTRVRdXG5cblNldC9nZXQgdGhlIGN1cnJlbnQgZGF0ZS90aW1lLiBXaXRoIG5vIFNFVCBzaG93cyB0aGUgY3VycmVudCBkYXRlLlxuXG5EZWZhdWx0IFNFVCBmb3JtYXQgaXMgXCJNTUREaGhtbVtbQ0NdWVldWy5zc11cIiwgdGhhdCdzICgyIGRpZ2l0cyBlYWNoKVxubW9udGgsIGRheSwgaG91ciAoMC0yMyksIGFuZCBtaW51dGUuIE9wdGlvbmFsbHkgY2VudHVyeSwgeWVhciwgYW5kIHNlY29uZC5cbkFsc28gYWNjZXB0cyBcIkBVTklYVElNRVsuRlJBQ1RJT05dXCIgYXMgc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLlxuXG4tZAlTaG93IERBVEUgaW5zdGVhZCBvZiBjdXJyZW50IHRpbWUgKGNvbnZlcnQgZGF0ZSBmb3JtYXQpXG4tRAkrRk9STUFUIGZvciBTRVQgb3IgLWQgKGluc3RlYWQgb2YgTU1ERGhobW1bW0NDXVlZXVsuc3NdKVxuLXIJVXNlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUgaW5zdGVhZCBvZiBjdXJyZW50IGRhdGVcbi11CVVzZSBVVEMgaW5zdGVhZCBvZiBjdXJyZW50IHRpbWV6b25lXG5cbitGT1JNQVQgc3BlY2lmaWVzIGRpc3BsYXkgZm9ybWF0IHN0cmluZyB1c2luZyB0aGVzZSBlc2NhcGVzOlxuXG4lJSBsaXRlcmFsICUgICAgICAgICAgICAgJW4gbmV3bGluZSAgICAgICAgICAgICAgJXQgdGFiXG4lUyBzZWNvbmRzICgwMC02MCkgICAgICAgJU0gbWludXRlICgwMC01OSkgICAgICAgJW0gbW9udGggKDAxLTEyKVxuJUggaG91ciAoMC0yMykgICAgICAgICAgICVJIGhvdXIgKDAxLTEyKSAgICAgICAgICVwIEFNL1BNXG4leSBzaG9ydCB5ZWFyICgwMC05OSkgICAgJVkgeWVhciAgICAgICAgICAgICAgICAgJUMgY2VudHVyeVxuJWEgc2hvcnQgd2Vla2RheSBuYW1lICAgICVBIHdlZWtkYXkgbmFtZSAgICAgICAgICV1IGRheSBvZiB3ZWVrICgxLTcsIDE9bW9uKVxuJWIgc2hvcnQgbW9udGggbmFtZSAgICAgICVCIG1vbnRoIG5hbWUgICAgICAgICAgICVaIHRpbWV6b25lIG5hbWVcbiVqIGRheSBvZiB5ZWFyICgwMDEtMzY2KSAlZCBkYXkgb2YgbW9udGggKDAxLTMxKSAlZSBkYXkgb2YgbW9udGggKCAxLTMxKVxuJXMgc2Vjb25kcyBwYXN0IHRoZSBFcG9jaFxuXG4lVSBXZWVrIG9mIHllYXIgKDAtNTMgc3RhcnQgc3VuZGF5KSAgICVXIFdlZWsgb2YgeWVhciAoMC01MyBzdGFydCBtb25kYXkpXG4lViBXZWVrIG9mIHllYXIgKDEtNTMgc3RhcnQgbW9uZGF5LCB3ZWVrIDwgNCBkYXlzIG5vdCBwYXJ0IG9mIHRoaXMgeWVhcilcblxuJUQgPSBcIiVtLyVkLyV5XCIgICAgJXIgPSBcIiVJIDogJU0gOiAlUyAlcFwiICAgJVQgPSBcIiVIOiVNOiVTXCIgICAlaCA9IFwiJWJcIlxuJXggbG9jYWxlIGRhdGUgICAgICVYIGxvY2FsZSB0aW1lICAgICAgICAgICAlYyBsb2NhbGUgZGF0ZS90aW1lXG5cbiIKKworI2RlZmluZSBIRUxQX2N1dCAidXNhZ2U6IGN1dCBPUFRJT04uLi4gW0ZJTEVdLi4uXG5cblByaW50IHNlbGVjdGVkIHBhcnRzIG9mIGxpbmVzIGZyb20gZWFjaCBGSUxFIHRvIHN0YW5kYXJkIG91dHB1dC5cblxuLWIgTElTVAlzZWxlY3Qgb25seSB0aGVzZSBieXRlcyBmcm9tIExJU1QuXG4tYyBMSVNUCXNlbGVjdCBvbmx5IHRoZXNlIGNoYXJhY3RlcnMgZnJvbSBMSVNULlxuLWYgTElTVAlzZWxlY3Qgb25seSB0aGVzZSBmaWVsZHMuXG4tZCBERUxJTQl1c2UgREVMSU0gaW5zdGVhZCBvZiBUQUIgZm9yIGZpZWxkIGRlbGltaXRlci5cbi1zCWRvIG5vdCBwcmludCBsaW5lcyBub3QgY29udGFpbmluZyBkZWxpbWl0ZXJzLlxuLW4JZG9uJ3Qgc3BsaXQgbXVsdGlieXRlIGNoYXJhY3RlcnMgKElnbm9yZWQpLlxuXG4iCisKKyNkZWZpbmUgSEVMUF9jcGlvICJ1c2FnZTogY3BpbyAte298dHxpfHAgREVTVH0gWy12XSBbLS12ZXJib3NlXSBbLUYgRklMRV0gWy0tbm8tcHJlc2VydmUtb3duZXJdXG4gICAgICAgW2lnbm9yZWQ6IC1tZHUgLUggbmV3Y11cblxuY29weSBmaWxlcyBpbnRvIGFuZCBvdXQgb2YgYSBcIm5ld2NcIiBmb3JtYXQgY3BpbyBhcmNoaXZlXG5cbi1GIEZJTEUJdXNlIGFyY2hpdmUgRklMRSBpbnN0ZWFkIG9mIHN0ZGluL3N0ZG91dFxuLXAgREVTVAljb3B5LXBhc3MgbW9kZSwgY29weSBzdGRpbiBmaWxlIGxpc3QgdG8gZGlyZWN0b3J5IERFU1Rcbi1pCWV4dHJhY3QgZnJvbSBhcmNoaXZlIGludG8gZmlsZSBzeXN0ZW0gKHN0ZGluPWFyY2hpdmUpXG4tbwljcmVhdGUgYXJjaGl2ZSAoc3RkaW49bGlzdCBvZiBmaWxlcywgc3Rkb3V0PWFyY2hpdmUpXG4tdAl0ZXN0IGZpbGVzIChsaXN0IG9ubHksIHN0ZGluPWFyY2hpdmUsIHN0ZG91dD1saXN0IG9mIGZpbGVzKVxuLXYJdmVyYm9zZSAobGlzdCBmaWxlcyBkdXJpbmcgY3JlYXRlL2V4dHJhY3QpXG4tLW5vLXByZXNlcnZlLW93bmVyIChkb24ndCBzZXQgb3duZXJzaGlwIGR1cmluZyBleHRyYWN0KVxuXG4iCisKKyNkZWZpbmUgSEVMUF9pbnN0YWxsICJ1c2FnZTogaW5zdGFsbCBbLWREcHN2XSBbLW8gVVNFUl0gWy1nIEdST1VQXSBbLW0gTU9ERV0gW1NPVVJDRS4uLl0gREVTVFxuXG5Db3B5IGZpbGVzIGFuZCBzZXQgYXR0cmlidXRlcy5cblxuLWQJQWN0IGxpa2UgbWtkaXIgLXBcbi1ECUNyZWF0ZSBsZWFkaW5nIGRpcmVjdG9yaWVzIGZvciBERVNUXG4tZwlNYWtlIGNvcHkgYmVsb25nIHRvIEdST1VQXG4tbQlTZXQgcGVybWlzc2lvbnMgdG8gTU9ERVxuLW8JTWFrZSBjb3B5IGJlbG9uZyB0byBVU0VSXG4tcAlQcmVzZXJ2ZSB0aW1lc3RhbXBzXG4tcwlDYWxsIFwic3RyaXAgLXBcIlxuLXYJVmVyYm9zZVxuXG4iCisKKyNkZWZpbmUgSEVMUF9tdiAidXNhZ2U6IG12IFstZml2bl0gU09VUkNFLi4uIERFU1RcIlxuXG4tZglmb3JjZSBjb3B5IGJ5IGRlbGV0aW5nIGRlc3RpbmF0aW9uIGZpbGVcbi1pCWludGVyYWN0aXZlLCBwcm9tcHQgYmVmb3JlIG92ZXJ3cml0aW5nIGV4aXN0aW5nIERFU1Rcbi12CXZlcmJvc2Vcbi1uCW5vIGNsb2JiZXIgKGRvbid0IG92ZXJ3cml0ZSBERVNUKVxuXG4iCisKKyNkZWZpbmUgSEVMUF9jcF9wcmVzZXJ2ZSAiLS1wcmVzZXJ2ZSB0YWtlcyBlaXRoZXIgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLCBvciB0aGUgZmlyc3RcbmxldHRlcihzKSBvZjpcblxuICAgICAgICBtb2RlIC0gcGVybWlzc2lvbnMgKGlnbm9yZSB1bWFzayBmb3Igcnd4LCBjb3B5IHN1aWQgYW5kIHN0aWNreSBiaXQpXG4gICBvd25lcnNoaXAgLSB1c2VyIGFuZCBncm91cFxuICB0aW1lc3RhbXBzIC0gZmlsZSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBhbmQgYWNjZXNzIHRpbWVzLlxuICAgICBjb250ZXh0IC0gc2VjdXJpdHkgY29udGV4dFxuICAgICAgIHhhdHRyIC0gZXh0ZW5kZWQgYXR0cmlidXRlc1xuICAgICAgICAgYWxsIC0gYWxsIG9mIHRoZSBhYm92ZVxuXG51c2FnZTogY3AgWy0tcHJlc2VydmU9bW90Y3hhXSBbLWFkbG5yc3ZmaXBSSExQXSBTT1VSQ0UuLi4gREVTVFxuXG5Db3B5IGZpbGVzIGZyb20gU09VUkNFIHRvIERFU1QuICBJZiBtb3JlIHRoYW4gb25lIFNPVVJDRSwgREVTVCBtdXN0XG5iZSBhIGRpcmVjdG9yeS5cbi12CXZlcmJvc2Vcbi1zCXN5bWxpbmsgaW5zdGVhZCBvZiBjb3B5XG4tcglzeW5vbnltIGZvciAtUlxuLW4Jbm8gY2xvYmJlciAoZG9uJ3Qgb3ZlcndyaXRlIERFU1QpXG4tbAloYXJkIGxpbmsgaW5zdGVhZCBvZiBjb3B5XG4tZAlkb24ndCBkZXJlZmVyZW5jZSBzeW1saW5rc1xuLWEJc2FtZSBhcyAtZHByXG4tUAlEbyBub3QgZm9sbG93IHN5bWxpbmtzIFtkZWZhdWx0XVxuLUwJRm9sbG93IGFsbCBzeW1saW5rc1xuLUgJRm9sbG93IHN5bWxpbmtzIGxpc3RlZCBvbiBjb21tYW5kIGxpbmVcbi1SCXJlY3Vyc2UgaW50byBzdWJkaXJlY3RvcmllcyAoREVTVCBtdXN0IGJlIGEgZGlyZWN0b3J5KVxuLXAJcHJlc2VydmUgdGltZXN0YW1wcywgb3duZXJzaGlwLCBhbmQgbW9kZVxuLWkJaW50ZXJhY3RpdmUsIHByb21wdCBiZWZvcmUgb3ZlcndyaXRpbmcgZXhpc3RpbmcgREVTVFxuLUYJZGVsZXRlIGFueSBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlIGZpcnN0ICgtLXJlbW92ZS1kZXN0aW5hdGlvbilcbi1mCWRlbGV0ZSBkZXN0aW5hdGlvbiBmaWxlcyB3ZSBjYW4ndCB3cml0ZSB0b1xuIgorCisjZGVmaW5lIEhFTFBfY3AgInVzYWdlOiBjcCBbLS1wcmVzZXJ2ZT1tb3RjeGFdIFstYWRsbnJzdmZpcFJITFBdIFNPVVJDRS4uLiBERVNUXG5cbkNvcHkgZmlsZXMgZnJvbSBTT1VSQ0UgdG8gREVTVC4gIElmIG1vcmUgdGhhbiBvbmUgU09VUkNFLCBERVNUIG11c3RcbmJlIGEgZGlyZWN0b3J5LlxuLXYJdmVyYm9zZVxuLXMJc3ltbGluayBpbnN0ZWFkIG9mIGNvcHlcbi1yCXN5bm9ueW0gZm9yIC1SXG4tbglubyBjbG9iYmVyIChkb24ndCBvdmVyd3JpdGUgREVTVClcbi1sCWhhcmQgbGluayBpbnN0ZWFkIG9mIGNvcHlcbi1kCWRvbid0IGRlcmVmZXJlbmNlIHN5bWxpbmtzXG4tYQlzYW1lIGFzIC1kcHJcbi1QCURvIG5vdCBmb2xsb3cgc3ltbGlua3MgW2RlZmF1bHRdXG4tTAlGb2xsb3cgYWxsIHN5bWxpbmtzXG4tSAlGb2xsb3cgc3ltbGlua3MgbGlzdGVkIG9uIGNvbW1hbmQgbGluZVxuLVIJcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzIChERVNUIG11c3QgYmUgYSBkaXJlY3RvcnkpXG4tcAlwcmVzZXJ2ZSB0aW1lc3RhbXBzLCBvd25lcnNoaXAsIGFuZCBtb2RlXG4taQlpbnRlcmFjdGl2ZSwgcHJvbXB0IGJlZm9yZSBvdmVyd3JpdGluZyBleGlzdGluZyBERVNUXG4tRglkZWxldGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUgZmlyc3QgKC0tcmVtb3ZlLWRlc3RpbmF0aW9uKVxuLWYJZGVsZXRlIGRlc3RpbmF0aW9uIGZpbGVzIHdlIGNhbid0IHdyaXRlIHRvXG4tLXByZXNlcnZlIHRha2VzIGVpdGhlciBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMsIG9yIHRoZSBmaXJzdFxubGV0dGVyKHMpIG9mOlxuXG4gICAgICAgIG1vZGUgLSBwZXJtaXNzaW9ucyAoaWdub3JlIHVtYXNrIGZvciByd3gsIGNvcHkgc3VpZCBhbmQgc3RpY2t5IGJpdClcbiAgIG93bmVyc2hpcCAtIHVzZXIgYW5kIGdyb3VwXG4gIHRpbWVzdGFtcHMgLSBmaWxlIGNyZWF0aW9uLCBtb2RpZmljYXRpb24sIGFuZCBhY2Nlc3MgdGltZXMuXG4gICAgIGNvbnRleHQgLSBzZWN1cml0eSBjb250ZXh0XG4gICAgICAgeGF0dHIgLSBleHRlbmRlZCBhdHRyaWJ1dGVzXG4gICAgICAgICBhbGwgLSBhbGwgb2YgdGhlIGFib3ZlXG5cbiIKKworI2RlZmluZSBIRUxQX2NvbW0gInVzYWdlOiBjb21tIFstMTIzXSBGSUxFMSBGSUxFMlxuXG5SZWFkcyBGSUxFMSBhbmQgRklMRTIsIHdoaWNoIHNob3VsZCBiZSBvcmRlcmVkLCBhbmQgcHJvZHVjZXMgdGhyZWUgdGV4dFxuY29sdW1ucyBhcyBvdXRwdXQ6IGxpbmVzIG9ubHkgaW4gRklMRTE7IGxpbmVzIG9ubHkgaW4gRklMRTI7IGFuZCBsaW5lc1xuaW4gYm90aCBmaWxlcy4gRmlsZW5hbWUgXCItXCIgaXMgYSBzeW5vbnltIGZvciBzdGRpbi5cblxuLTEgc3VwcHJlc3MgdGhlIG91dHB1dCBjb2x1bW4gb2YgbGluZXMgdW5pcXVlIHRvIEZJTEUxXG4tMiBzdXBwcmVzcyB0aGUgb3V0cHV0IGNvbHVtbiBvZiBsaW5lcyB1bmlxdWUgdG8gRklMRTJcbi0zIHN1cHByZXNzIHRoZSBvdXRwdXQgY29sdW1uIG9mIGxpbmVzIGR1cGxpY2F0ZWQgaW4gRklMRTEgYW5kIEZJTEUyXG5cbiIKKworI2RlZmluZSBIRUxQX2NtcCAidXNhZ2U6IGNtcCBbLWxdIFstc10gRklMRTEgRklMRTJcblxuQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIGZpbGVzLlxuXG4tbAlzaG93IGFsbCBkaWZmZXJpbmcgYnl0ZXNcbi1zCXNpbGVudFxuXG4iCisKKyNkZWZpbmUgSEVMUF9ja3N1bSAidXNhZ2U6IGNrc3VtIFstSVBMTl0gW2ZpbGUuLi5dXG5cbkZvciBlYWNoIGZpbGUsIG91dHB1dCBjcmMzMiBjaGVja3N1bSB2YWx1ZSwgbGVuZ3RoIGFuZCBuYW1lIG9mIGZpbGUuXG5JZiBubyBmaWxlcyBsaXN0ZWQsIGNvcHkgZnJvbSBzdGRpbi4gIEZpbGVuYW1lIFwiLVwiIGlzIGEgc3lub255bSBmb3Igc3RkaW4uXG5cbi1ICUhleGFkZWNpbWFsIGNoZWNrc3VtIChkZWZhdWx0cyB0byBkZWNpbWFsKVxuLUwJTGl0dGxlIGVuZGlhbiAoZGVmYXVsdHMgdG8gYmlnIGVuZGlhbilcbi1QCVByZS1pbnZlcnNpb25cbi1JCVNraXAgcG9zdC1pbnZlcnNpb25cbi1OCURvIG5vdCBpbmNsdWRlIGxlbmd0aCBpbiBDUkMgY2FsY3VsYXRpb25cblxuIgorCisjZGVmaW5lIEhFTFBfY2htb2QgInVzYWdlOiBjaG1vZCBbLVJdIE1PREUgRklMRS4uLlxuXG5DaGFuZ2UgbW9kZSBvZiBsaXN0ZWQgZmlsZVtzXSAocmVjdXJzaXZlbHkgd2l0aCAtUikuXG5cbk1PREUgY2FuIGJlIChjb21tYS1zZXBhcmF0ZWQpIHN0YW56YXM6IFt1Z29hXVsrLT1dW3J3eHN0WHVnb11cblxuU3RhbnphcyBhcmUgYXBwbGllZCBpbiBvcmRlcjogRm9yIGVhY2ggY2F0ZWdvcnkgKHUgPSB1c2VyLFxuZyA9IGdyb3VwLCBvID0gb3RoZXIsIGEgPSBhbGwgdGhyZWUsIGlmIG5vbmUgc3BlY2lmaWVkIGRlZmF1bHQgaXMgYSksXG5zZXQgKCspLCBjbGVhciAoLSksIG9yIGNvcHkgKD0pLCByID0gcmVhZCwgdyA9IHdyaXRlLCB4ID0gZXhlY3V0ZS5cbnMgPSB1K3MgPSBzdWlkLCBnK3MgPSBzZ2lkLCBvK3MgPSBzdGlja3kuICgrdCBpcyBhbiBhbGlhcyBmb3IgbytzKS5cbnN1aWQvc2dpZDogZXhlY3V0ZSBhcyB0aGUgdXNlci9ncm91cCB3aG8gb3ducyB0aGUgZmlsZS5cbnN0aWNreTogY2FuJ3QgZGVsZXRlIGZpbGVzIHlvdSBkb24ndCBvd24gb3V0IG9mIHRoaXMgZGlyZWN0b3J5XG5YID0geCBmb3IgZGlyZWN0b3JpZXMgb3IgaWYgYW55IGNhdGVnb3J5IGFscmVhZHkgaGFzIHggc2V0LlxuXG5PciBNT0RFIGNhbiBiZSBhbiBvY3RhbCB2YWx1ZSB1cCB0byA3Nzc3CXVnIHV1dWdnZ29vbwl0b3AgK1xuYml0IDEgPSBvK3gsIGJpdCAxPDw4ID0gdSt3LCAxPDwxMSA9IGcrMQlzc3Ryd3hyd3hyd3gJYm90dG9tXG5cbkV4YW1wbGVzOlxuY2htb2QgdSt3IGZpbGUgLSBhbGxvdyBvd25lciBvZiBcImZpbGVcIiB0byB3cml0ZSB0byBpdC5cbmNobW9kIDc0NCBmaWxlIC0gdXNlciBjYW4gcmVhZC93cml0ZS9leGVjdXRlLCBldmVyeW9uZSBlbHNlIHJlYWQgb25seVxuXG4iCisKKyNkZWZpbmUgSEVMUF9jaG93biAic2VlOiBjaGdycFxuXG4iCisKKyNkZWZpbmUgSEVMUF9jaGdycCAidXNhZ2U6IGNoZ3JwL2Nob3duIFstUkhMUF0gWy1mdmhdIGdyb3VwIGZpbGUuLi5cblxuQ2hhbmdlIGdyb3VwIG9mIG9uZSBvciBtb3JlIGZpbGVzLlxuXG4tZglzdXBwcmVzcyBtb3N0IGVycm9yIG1lc3NhZ2VzLlxuLWgJY2hhbmdlIHN5bWxpbmtzIGluc3RlYWQgb2Ygd2hhdCB0aGV5IHBvaW50IHRvXG4tUglyZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMgKGltcGxpZXMgLWgpLlxuLUgJd2l0aCAtUiBjaGFuZ2UgdGFyZ2V0IG9mIHN5bWxpbmssIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3Ncbi1MCXdpdGggLVIgY2hhbmdlIHRhcmdldCBvZiBzeW1saW5rLCBmb2xsb3cgYWxsIHN5bWxpbmtzXG4tUAl3aXRoIC1SIGNoYW5nZSBzeW1saW5rLCBkbyBub3QgZm9sbG93IHN5bWxpbmtzIChkZWZhdWx0KVxuLXYJdmVyYm9zZSBvdXRwdXQuXG5cbiIKKworI2RlZmluZSBIRUxQX2NhdHYgInVzYWdlOiBjYXR2IFstZXZ0XSBbZmlsZW5hbWUuLi5dXG5cbkRpc3BsYXkgbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzLiBVc2UgTS14IGZvclxuaGlnaCBhc2NpaSBjaGFyYWN0ZXJzICg+MTI3KSwgYW5kIF54IGZvciBvdGhlciBub25wcmludGluZyBjaGFycy5cblxuLWUgIE1hcmsgZWFjaCBuZXdsaW5lIHdpdGggJFxuLXQgIFNob3cgdGFicyBhcyBeSVxuLXYgIERvbid0IHVzZSBeeCBvciBNLXggZXNjYXBlcy5cblxuIgorCisjZGVmaW5lIEhFTFBfY2F0ICJ1c2FnZTogY2F0IFstZXR1dl0gW2ZpbGUuLi5dXG5cbkNvcHkgKGNvbmNhdGVuYXRlKSBmaWxlcyB0byBzdGRvdXQuICBJZiBubyBmaWxlcyBsaXN0ZWQsIGNvcHkgZnJvbSBzdGRpbi5cbkZpbGVuYW1lIFwiLVwiIGlzIGEgc3lub255bSBmb3Igc3RkaW4uXG5cbi1lCU1hcmsgZWFjaCBuZXdsaW5lIHdpdGggJFxuLXQJU2hvdyB0YWJzIGFzIF5JXG4tdQlDb3B5IG9uZSBieXRlIGF0IGEgdGltZSAoc2xvdykuXG4tdglEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcy4gVXNlIE0teCBmb3JcbgloaWdoIGFzY2lpIGNoYXJhY3RlcnMgKD4xMjcpLCBhbmQgXnggZm9yIG90aGVyIG5vbnByaW50aW5nIGNoYXJzLlxuIgorCisjZGVmaW5lIEhFTFBfY2FsICJ1c2FnZTogY2FsIFtbbW9udGhdIHllYXJdXG5cblByaW50IGEgY2FsZW5kYXIuXG5cbldpdGggb25lIGFyZ3VtZW50LCBwcmludHMgYWxsIG1vbnRocyBvZiB0aGUgc3BlY2lmaWVkIHllYXIuXG5XaXRoIHR3byBhcmd1bWVudHMsIHByaW50cyBjYWxlbmRhciBmb3IgbW9udGggYW5kIHllYXIuXG5cbiIKKworI2RlZmluZSBIRUxQX2Jhc2VuYW1lICJ1c2FnZTogYmFzZW5hbWUgc3RyaW5nIFtzdWZmaXhdXG5cblJldHVybiBub24tZGlyZWN0b3J5IHBvcnRpb24gb2YgYSBwYXRobmFtZSByZW1vdmluZyBzdWZmaXhcblxuIgorCmRpZmYgLS1naXQgYS90b3lib3gvZ2VuZXJhdGVkL25ld3RveXMuaCBiL3RveWJveC9nZW5lcmF0ZWQvbmV3dG95cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDEyNzgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvZ2VuZXJhdGVkL25ld3RveXMuaApAQCAtMCwwICsxLDI3OSBAQAorVVNFX1RPWUJPWChORVdUT1kodG95Ym94LCBOVUxMLCBUT1lGTEFHX1NUQVlST09UKSkKK1VTRV9TSChPTERUT1koLXNoLCBzaCwgMCkpCitVU0VfU0goT0xEVE9ZKC10b3lzaCwgc2gsIDApKQorVVNFX1RSVUUoT0xEVE9ZKDosIHRydWUsIFRPWUZMQUdfTk9GT1JLfFRPWUZMQUdfTk9IRUxQKSkKK1VTRV9BQ1BJKE5FV1RPWShhY3BpLCAiYWJjdFYiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfR1JPVVBBREQoT0xEVE9ZKGFkZGdyb3VwLCBncm91cGFkZCwgVE9ZRkxBR19ORUVEUk9PVHxUT1lGTEFHX1NCSU4pKQorVVNFX1VTRVJBREQoT0xEVE9ZKGFkZHVzZXIsIHVzZXJhZGQsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19VTUFTS3xUT1lGTEFHX1NCSU4pKQorVVNFX0FSUChORVdUT1koYXJwLCAidmk6bkRzZGFwOkE6SDpbK0FwXVshc2RdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0FSUElORyhORVdUT1koYXJwaW5nLCAiPDE+MXM6STp3IzwwYyM8MEFVRGJxZlsrQVVdWytEZl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX0JBU0U2NChORVdUT1koYmFzZTY0LCAiZGl3IzwwPTc2WyFkd10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfQkFTRU5BTUUoTkVXVE9ZKGJhc2VuYW1lLCAiPDE+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9CTEtJRChORVdUT1koYmxraWQsIDAsIFRPWUZMQUdfQklOKSkKK1VTRV9CTE9DS0RFVihORVdUT1koYmxvY2tkZXYsICI8MT4xKHNldHJvKShzZXRydykoZ2V0cm8pKGdldHNzKShnZXRic3opKHNldGJzeikjPDAoZ2V0c3opKGdldHNpemUpKGdldHNpemU2NCkoZmx1c2hidWZzKShyZXJlYWRwdCkiLFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9CT09UQ0hBUlREKE5FV1RPWShib290Y2hhcnRkLCAwLCBUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9CUkNUTChORVdUT1koYnJjdGwsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfQlVOWklQMihORVdUT1koYnVuemlwMiwgImNmdGt2IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0JaQ0FUKE5FV1RPWShiemNhdCwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0NBTChORVdUT1koY2FsLCAiPjIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfQ0FUKE5FV1RPWShjYXQsICJ1IlVTRV9DQVRfVigidnRlIiksIFRPWUZMQUdfQklOKSkKK1VTRV9DQVRWKE5FV1RPWShjYXR2LCBVU0VfQ0FUVigidnRlIiksIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TSChORVdUT1koY2QsIE5VTEwsIFRPWUZMQUdfTk9GT1JLKSkKK1VTRV9DSEFUVFIoTkVXVE9ZKGNoYXR0ciwgTlVMTCwgVE9ZRkxBR19CSU4pKQorVVNFX0NIQ09OKE5FV1RPWShjaGNvbiwgIjwyaHZSIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0NIR1JQKE5FV1RPWShjaGdycCwgIjwyaFBMSFJmdlstSExQXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9DSE1PRChORVdUT1koY2htb2QsICI8Mj92UmZbLXZmXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9DSE9XTihPTERUT1koY2hvd24sIGNoZ3JwLCBUT1lGTEFHX0JJTikpCitVU0VfQ0hST09UKE5FV1RPWShjaHJvb3QsICJePDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX0NIVlQoTkVXVE9ZKGNodnQsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9DS1NVTShORVdUT1koY2tzdW0sICJISVBMTiIsIFRPWUZMQUdfQklOKSkKK1VTRV9DTEVBUihORVdUT1koY2xlYXIsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9DTVAoTkVXVE9ZKGNtcCwgIjwyPjJsc1shbHNdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0NPTU0oTkVXVE9ZKGNvbW0sICI8Mj4yMzIxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0NPTVBSRVNTKE5FV1RPWShjb21wcmVzcywgInpjZDlscmdbLWNkXVshemdMcl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfQ09VTlQoTkVXVE9ZKGNvdW50LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfQ1AoTkVXVE9ZKGNwLCAiPDIiVVNFX0NQX1BSRVNFUlZFKCIocHJlc2VydmUpOjsiKSJSSExQcHJkYXNsdm5GKHJlbW92ZS1kZXN0aW5hdGlvbilmaVstSExQZF1bLW5pXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9DUElPKE5FV1RPWShjcGlvLCAiKG5vLXByZXNlcnZlLW93bmVyKW1kdUg6cDp8aXx0fEY6dih2ZXJib3NlKW98WyFwaW9dWyFwb3RdWyFwRl0iLCBUT1lGTEFHX0JJTikpCitVU0VfQ1JPTkQoTkVXVE9ZKGNyb25kLCAiZmJTbCM8MD04ZCM8MEw6YzpbLWJmXVstTFNdWy1sZF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfQ1JPTlRBQihORVdUT1koY3JvbnRhYiwgImM6dTplbHJbIWVscl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTnxUT1lGTEFHX1NUQVlST09UKSkKK1VTRV9DVVQoTkVXVE9ZKGN1dCwgImI6fGM6fGY6fGQ6c25bIWNiZl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfREFURShORVdUT1koZGF0ZSwgImQ6RDpyOnVbIWRyXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9ERChORVdUT1koZGQsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9ERUFMTE9DVlQoTkVXVE9ZKGRlYWxsb2N2dCwgIj4xIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfR1JPVVBERUwoT0xEVE9ZKGRlbGdyb3VwLCBncm91cGRlbCwgVE9ZRkxBR19ORUVEUk9PVHxUT1lGTEFHX1NCSU4pKQorVVNFX1VTRVJERUwoT0xEVE9ZKGRlbHVzZXIsIHVzZXJkZWwsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19TQklOKSkKK1VTRV9ERihORVdUT1koZGYsICJIUGtodCphWy1IUGtoXSIsIFRPWUZMQUdfU0JJTikpCitVU0VfREhDUChORVdUT1koZGhjcCwgIlY6SDpGOngqcjpPKkEjPDA9MjBUIzwwPTN0IzwwPTNzOnA6aTpTQlJDYW92cW5iZiIsIFRPWUZMQUdfU0JJTnxUT1lGTEFHX1JPT1RPTkxZKSkKK1VTRV9ESENQNihORVdUT1koZGhjcDYsICJyOkEjPDBUIzwwdCM8MHM6cDppOlNSdnFuYmYiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ST09UT05MWSkpCitVU0VfREhDUEQoTkVXVE9ZKGRoY3BkLCAiPjFQIzwwPjY1NTM1Zmk6UzQ2WyE0Nl0iLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ST09UT05MWSkpCitVU0VfRElGRihORVdUT1koZGlmZiwgIjwyPjJCKGlnbm9yZS1ibGFuay1saW5lcylkKG1pbmltYWwpYihpZ25vcmUtc3BhY2UtY2hhbmdlKXV0KGV4cGFuZC10YWJzKXcoaWdub3JlLWFsbC1zcGFjZSlpKGlnbm9yZS1jYXNlKVQoaW5pdGlhbC10YWIpcyhyZXBvcnQtaWRlbnRpY2FsLWZpbGVzKXEoYnJpZWYpYSh0ZXh0KUwobGFiZWwpKlMoc3RhcnRpbmctZmlsZSk6TihuZXctZmlsZSlyKHJlY3Vyc2l2ZSlVKHVuaWZpZWQpIzwwPTMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfRElSTkFNRShORVdUT1koZGlybmFtZSwgIjwxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0RNRVNHKE5FV1RPWShkbWVzZywgInRycyM8MW4jY1shdHJdIiwgVE9ZRkxBR19CSU4pKQorVVNFX0RPUzJVTklYKE5FV1RPWShkb3MydW5peCwgMCwgVE9ZRkxBR19CSU4pKQorVVNFX0RVKE5FV1RPWShkdSwgImQjPDBobWxjYUhrS0xzeFstSExdWy1rS21oXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9EVU1QTEVBU0VTKE5FV1RPWShkdW1wbGVhc2VzLCAiPjBhcmY6WyFhcl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfRUNITyhORVdUT1koZWNobywgIl4/ZW4iLCBUT1lGTEFHX0JJTikpCitVU0VfRUdSRVAoT0xEVE9ZKGVncmVwLCBncmVwLCBUT1lGTEFHX0JJTikpCitVU0VfRUpFQ1QoTkVXVE9ZKGVqZWN0LCAiPjFzdFRbIXRUXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9FTlYoTkVXVE9ZKGVudiwgIl5pdSoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0goTkVXVE9ZKGV4aXQsIE5VTEwsIFRPWUZMQUdfTk9GT1JLKSkKK1VTRV9FWFBBTkQoTkVXVE9ZKGV4cGFuZCwgInQqIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorVVNFX0VYUFIoTkVXVE9ZKGV4cHIsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9GQUNUT1IoTkVXVE9ZKGZhY3RvciwgMCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0ZBTExPQ0FURShORVdUT1koZmFsbG9jYXRlLCAiPjFsI3wiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfRkFMU0UoTkVXVE9ZKGZhbHNlLCBOVUxMLCBUT1lGTEFHX0JJTnxUT1lGTEFHX05PSEVMUCkpCitVU0VfRkRJU0soTkVXVE9ZKGZkaXNrLCAiQyM8MEgjPDBTIzwwYiM8NTEydWwiLCBUT1lGTEFHX1NCSU4pKQorVVNFX0ZHUkVQKE9MRFRPWShmZ3JlcCwgZ3JlcCwgVE9ZRkxBR19CSU4pKQorVVNFX0ZJTEUoTkVXVE9ZKGZpbGUsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9GSU5EKE5FV1RPWShmaW5kLCAiP15ITFstSExdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0ZMT0NLKE5FV1RPWShmbG9jaywgIjwxPjFuc3V4Wy1zdXhdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0ZPTEQoTkVXVE9ZKGZvbGQsICJic3V3IzwxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0ZSRUUoTkVXVE9ZKGZyZWUsICJodGdta2JbIWh0Z21rYl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfRlJFRVJBTURJU0soTkVXVE9ZKGZyZWVyYW1kaXNrLCAiPDE+MSIsIFRPWUZMQUdfU0JJTnxUT1lGTEFHX05FRURST09UKSkKK1VTRV9GU0NLKE5FV1RPWShmc2NrLCAiP3Q6QU5QUlRWc0MjIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0ZTRlJFRVpFKE5FV1RPWShmc2ZyZWV6ZSwgIjwxPjFmfHV8WyFmdV0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX0ZTVFlQRShORVdUT1koZnN0eXBlLCAiPDEiLCBUT1lGTEFHX0JJTikpCitVU0VfRlNZTkMoTkVXVE9ZKGZzeW5jLCAiPDFkIiwgVE9ZRkxBR19CSU4pKQorVVNFX0ZUUEdFVChORVdUT1koZnRwZ2V0LCAiPDJjdnU6cDpQIzwwPTIxPjY1NTM1IiwgVE9ZRkxBR19CSU4pKQorVVNFX0ZUUEdFVChPTERUT1koZnRwcHV0LCBmdHBnZXQsIFRPWUZMQUdfQklOKSkKK1VTRV9HRVRFTkZPUkNFKE5FV1RPWShnZXRlbmZvcmNlLCAiPjAiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX0dFVEZBVFRSKE5FV1RPWShnZXRmYXR0ciwgImRobjoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfR0VUUFJPUChORVdUT1koZ2V0cHJvcCwgIj4yWiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfR0VUVFkoTkVXVE9ZKGdldHR5LCAiPDJ0IzwwSDpJOmw6Zjppd25tTGgiLFRPWUZMQUdfU0JJTikpCitVU0VfR1JFUChORVdUT1koZ3JlcCwgIkMjQiNBI1p6RUZIYWJoaW5vcnN2d2NscWUqZiptI3hbIXd4XVshRUZ3XSIsIFRPWUZMQUdfQklOKSkKK1VTRV9HUk9VUEFERChORVdUT1koZ3JvdXBhZGQsICI8MT4yZyM8MFMiLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCitVU0VfR1JPVVBERUwoTkVXVE9ZKGdyb3VwZGVsLCAiPDE+MiIsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19TQklOKSkKK1VTRV9HUk9VUFMoTkVXVE9ZKGdyb3VwcywgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0dVTlpJUChORVdUT1koZ3VuemlwLCAiY2ZscVN0diIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9HWklQKE5FV1RPWShnemlwLCBVU0VfR1pJUF9EKCJkIikiMTlkY2ZscVN0dmdMUnpbIWdMUnpdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1JFQk9PVChPTERUT1koaGFsdCwgcmVib290LCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfSEVBRChORVdUT1koaGVhZCwgIj9uIzwwPTEwIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0hFTExPKE5FV1RPWShoZWxsbywgMCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0hFTFAoTkVXVE9ZKGhlbHAsICIiVVNFX0hFTFBfRVhUUkFTKCJhaCIpLCBUT1lGTEFHX0JJTikpCitVU0VfSEVYRURJVChORVdUT1koaGV4ZWRpdCwgIjwxPjFyIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorVVNFX0hPU1QoTkVXVE9ZKGhvc3QsICI8MT4yYXZ0OiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9IT1NUSUQoTkVXVE9ZKGhvc3RpZCwgIj4wIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0hPU1ROQU1FKE5FV1RPWShob3N0bmFtZSwgImJGOiIsIFRPWUZMQUdfQklOKSkKK1VTRV9IV0NMT0NLKE5FV1RPWShod2Nsb2NrLCAiPjAoZmFzdClmKHJ0Yyk6dSh1dGMpbChsb2NhbHRpbWUpdChzeXN0eilzKGhjdG9zeXMpcihzaG93KXcoc3lzdG9oYylbLXVsXVshcnRzd10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfSUNPTlYoTkVXVE9ZKGljb252LCAiY3N0OmY6IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0lEKE5FV1RPWShpZCwgIj4xIlVTRV9JRF9aKCJaIikibkdncnVbISJVU0VfSURfWigiWiIpIkdndV0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfSUZDT05GSUcoTkVXVE9ZKGlmY29uZmlnLCAiXj9hIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9JTklUKE5FV1RPWShpbml0LCAiIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9JTk9USUZZRChORVdUT1koaW5vdGlmeWQsICI8MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9JTlNNT0QoTkVXVE9ZKGluc21vZCwgIjwxIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorVVNFX0lOU1RBTEwoTkVXVE9ZKGluc3RhbGwsICI8MWNkRHBzdm06bzpnOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9JT05JQ0UoTkVXVE9ZKGlvbmljZSwgIl50YyM8MD4zPTJuIzwwPjc9NXAjIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0lPUkVOSUNFKE5FV1RPWShpb3JlbmljZSwgIj88MT4zIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0lPVE9QKE5FV1RPWShpb3RvcCwgIj4wQWFLTyIgImsqbypwKnUqcyM8MT03ZCM9MzwxbiM8MWJxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19TVEFZUk9PVHxUT1lGTEFHX0xPQ0FMRSkpCitVU0VfSVAoTkVXVE9ZKGlwLCBOVUxMLCBUT1lGTEFHX1NCSU4pKQorVVNFX0lQKE9MRFRPWShpcGFkZHIsIGlwLCBUT1lGTEFHX1NCSU4pKQorVVNFX0lQQ1JNKE5FV1RPWShpcGNybSwgIm0qTSpzKlMqcSpRKiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9JUENTKE5FV1RPWShpcGNzLCAiYWNwdHVsc3FtaSMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfSVAoT0xEVE9ZKGlwbGluaywgaXAsIFRPWUZMQUdfU0JJTikpCitVU0VfSVAoT0xEVE9ZKGlwcm91dGUsIGlwLCBUT1lGTEFHX1NCSU4pKQorVVNFX0lQKE9MRFRPWShpcHJ1bGUsIGlwLCBUT1lGTEFHX1NCSU4pKQorVVNFX0lQKE9MRFRPWShpcHR1bm5lbCwgaXAsIFRPWUZMQUdfU0JJTikpCitVU0VfS0lMTChORVdUT1koa2lsbCwgIj9sczogIiwgVE9ZRkxBR19CSU4pKQorVVNFX0tJTExBTEwoTkVXVE9ZKGtpbGxhbGwsICI/czpscXZpIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0tJTExBTEw1KE5FV1RPWShraWxsYWxsNSwgIj9vKmxzOiBbIWxvXVshbHNdIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9LTE9HRChORVdUT1koa2xvZ2QsICJjIzwxPjhuIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9MQVNUKE5FV1RPWShsYXN0LCAiZjpXIiwgVE9ZRkxBR19CSU4pKQorVVNFX0xJTksoTkVXVE9ZKGxpbmssICI8Mj4yIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0xOKE5FV1RPWShsbiwgIjwxdm5mcyIsIFRPWUZMQUdfQklOKSkKK1VTRV9MT0FEX1BPTElDWShORVdUT1kobG9hZF9wb2xpY3ksICI8MT4xIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKK1VTRV9MT0coTkVXVE9ZKGxvZywgIjwxcDp0OiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfTE9HR0VSKE5FV1RPWShsb2dnZXIsICJzdDpwOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9MT0dJTihORVdUT1kobG9naW4sICI+MWY6cGg6IiwgVE9ZRkxBR19CSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfTE9HTkFNRShORVdUT1kobG9nbmFtZSwgIj4wIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0xPU0VUVVAoTkVXVE9ZKGxvc2V0dXAsICI+MlMoc2l6ZWxpbWl0KSNzKHNob3cpcm8jajpmZGNhWyFhZmpdIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9MUyhORVdUT1kobHMsIFVTRV9MU19DT0xPUigiKGNvbG9yKTo7IikiWmdvQUNGSExSU2FiY2RmaGlrbG1ucHFyc3R1eDFbLUN4bTFdWy1DeG1sXVstQ3htb11bLUN4bWddWy1jdV1bLWZ0U11bLUhMXVshcWJdIiwgVE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorVVNFX0xTQVRUUihORVdUT1kobHNhdHRyLCAidmxkYVIiLCBUT1lGTEFHX0JJTikpCitVU0VfTFNNT0QoTkVXVE9ZKGxzbW9kLCBOVUxMLCBUT1lGTEFHX1NCSU4pKQorVVNFX0xTT0YoTkVXVE9ZKGxzb2YsICJscCp0IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0xTUENJKE5FV1RPWShsc3BjaSwgImVta24iVVNFX0xTUENJX1RFWFQoIkBpOiIpLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTFNVU0IoTkVXVE9ZKGxzdXNiLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTUFLRURFVlMoTkVXVE9ZKG1ha2VkZXZzLCAiPDE+MWQ6IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX01ENVNVTShORVdUT1kobWQ1c3VtLCAiYmMqWyFiY10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTURFVihORVdUT1kobWRldiwgInMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTnxUT1lGTEFHX1VNQVNLKSkKK1VTRV9NSVgoTkVXVE9ZKG1peCwgImM6ZDpsI3IjIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX01LRElSKE5FV1RPWShta2RpciwgIjwxIlVTRV9NS0RJUl9aKCJaOiIpInZwbToiLCBUT1lGTEFHX0JJTnxUT1lGTEFHX1VNQVNLKSkKK1VTRV9NS0UyRlMoTkVXVE9ZKG1rZTJmcywgIjwxPjJnOkZucW0jTiNpI2IjIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9NS0ZJRk8oTkVXVE9ZKG1rZmlmbywgIjwxIlVTRV9NS0ZJRk9fWigiWjoiKSJtOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9NS05PRChORVdUT1kobWtub2QsICI8Mj40bShtb2RlKToiVVNFX01LTk9EX1ooIlo6IiksIFRPWUZMQUdfQklOfFRPWUZMQUdfVU1BU0spKQorVVNFX01LUEFTU1dEKE5FV1RPWShta3Bhc3N3ZCwgIj4yUzptOlAjPTA8MCIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9NS1NXQVAoTkVXVE9ZKG1rc3dhcCwgIjwxPjFMOiIsIFRPWUZMQUdfU0JJTikpCitVU0VfTUtURU1QKE5FV1RPWShta3RlbXAsICI+MXVxZChkaXJlY3RvcnkpcCh0bXBkaXIpOiIsIFRPWUZMQUdfQklOKSkKK1VTRV9NT0RJTkZPKE5FV1RPWShtb2RpbmZvLCAiPDFiOms6RjowIiwgVE9ZRkxBR19CSU4pKQorVVNFX01PRFBST0JFKE5FV1RPWShtb2Rwcm9iZSwgImFscnF2c0RiIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9NT1JFKE5FV1RPWShtb3JlLCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTU9VTlQoTkVXVE9ZKG1vdW50LCAiP086YWZucnZ3dDpvKlstcnddIiwgVE9ZRkxBR19CSU58VE9ZRkxBR19TVEFZUk9PVCkpCitVU0VfTU9VTlRQT0lOVChORVdUT1kobW91bnRwb2ludCwgIjwxcWR4Wy1keF0iLCBUT1lGTEFHX0JJTikpCitVU0VfTVYoTkVXVE9ZKG12LCAiPDJ2bkYocmVtb3ZlLWRlc3RpbmF0aW9uKWZpWy1uaV0iLCBUT1lGTEFHX0JJTikpCitVU0VfTkJEX0NMSUVOVChPTERUT1kobmJkLWNsaWVudCwgbmJkX2NsaWVudCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX05CRF9DTElFTlQoTkVXVE9ZKG5iZF9jbGllbnQsICI8Mz4zbnMiLCAwKSkKK1VTRV9ORVRDQVQoT0xEVE9ZKG5jLCBuZXRjYXQsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9ORVRDQVQoTkVXVE9ZKG5ldGNhdCwgVVNFX05FVENBVF9MSVNURU4oIl50bEwiKSJ3I3AjczpxI2Y6IiwgVE9ZRkxBR19CSU4pKQorVVNFX05FVFNUQVQoTkVXVE9ZKG5ldHN0YXQsICJwV3J4d3V0bmVhbCIsIFRPWUZMQUdfQklOKSkKK1VTRV9OSUNFKE5FV1RPWShuaWNlLCAiXjwxbiMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTkwoTkVXVE9ZKG5sLCAidiM8MT0xbCNiOm46czp3IzwwPTZFIiwgVE9ZRkxBR19CSU4pKQorVVNFX05PSFVQKE5FV1RPWShub2h1cCwgIjwxXiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9OUFJPQyhORVdUT1kobnByb2MsICIoYWxsKSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9OU0VOVEVSKE5FV1RPWShuc2VudGVyLCAiPDFGKG5vLWZvcmspdCM8MSh0YXJnZXQpaTooaXBjKTttOihtb3VudCk7bjoobmV0KTtwOihwaWQpO3U6KHV0cyk7VToodXNlcik7IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX09EKE5FV1RPWShvZCwgImojdncjPDE9MTZOI3hzb2RjYkE6dCoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfT05FSVQoTkVXVE9ZKG9uZWl0LCAiXjwxbmM6cDNbIXBuXSIsIFRPWUZMQUdfU0JJTikpCitVU0VfT1BFTlZUKE5FV1RPWShvcGVudnQsICJjIzwxPjYzc3ciLCBUT1lGTEFHX0JJTnxUT1lGTEFHX05FRURST09UKSkKK1VTRV9QQVJUUFJPQkUoTkVXVE9ZKHBhcnRwcm9iZSwgIjwxIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9QQVNTV0QoTkVXVE9ZKHBhc3N3ZCwgIj4xYTpkbHUiLCBUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QQVNURShORVdUT1kocGFzdGUsICJkOnMiLCBUT1lGTEFHX0JJTikpCitVU0VfUEFUQ0goTkVXVE9ZKHBhdGNoLCAiKGRyeS1ydW4pIlVTRV9UT1lCT1hfREVCVUcoIngiKSJkOnVscCNpOlIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfUEdSRVAoTkVXVE9ZKHBncmVwLCAiP2NsZDp1KlUqdCpzKlAqZypHKmZub3Z4TDpbLW5vXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QSURPRihORVdUT1kocGlkb2YsICI8MXNvOiIsIFRPWUZMQUdfQklOKSkKK1VTRV9QSU5HKE5FV1RPWShwaW5nLCAiPDE+MXQjPDA+MjU1YyM8MHMjPDA+NjU1MzVJOlcjPDB3IzwwcTQ2Wy00Nl0iLCBUT1lGTEFHX1JPT1RPTkxZfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QSVZPVF9ST09UKE5FV1RPWShwaXZvdF9yb290LCAiPDI+MiIsIFRPWUZMQUdfU0JJTikpCitVU0VfUEtJTEwoTkVXVE9ZKHBraWxsLCAgICAiP1Z1KlUqdCpzKlAqZypHKmZub3Z4bDpbLW5vXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QTUFQKE5FV1RPWShwbWFwLCAiPDF4cSIsIFRPWUZMQUdfQklOKSkKK1VTRV9SRUJPT1QoT0xEVE9ZKHBvd2Vyb2ZmLCByZWJvb3QsIFRPWUZMQUdfU0JJTnxUT1lGTEFHX05FRURST09UKSkKK1VTRV9QUklOVEVOVihORVdUT1kocHJpbnRlbnYsICIwKG51bGwpIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1BSSU5URihORVdUT1kocHJpbnRmLCAiPDE/XiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QUyhORVdUT1kocHMsICJrKHNvcnQpKlAocHBpZCkqYUFkZWZsTW5vKk8qcChwaWQpKnMqdCpUdSpVKmcqRyp3Wlshb2xdWytBZV1bIW9PXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKK1VTRV9QV0QoTkVXVE9ZKHB3ZCwgIj4wTFBbLUxQXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9QV0RYKE5FV1RPWShwd2R4LCAiPDFhIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1JFQURBSEVBRChORVdUT1kocmVhZGFoZWFkLCBOVUxMLCBUT1lGTEFHX0JJTikpCitVU0VfUkVBRExJTksoTkVXVE9ZKHJlYWRsaW5rLCAiPDE+MWZlbnFbLWZlXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9SRUFMUEFUSChORVdUT1kocmVhbHBhdGgsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9SRUJPT1QoTkVXVE9ZKHJlYm9vdCwgImZuIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorVVNFX1JFTklDRShORVdUT1kocmVuaWNlLCAiPDFncHVuI3wiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfUkVTRVQoTkVXVE9ZKHJlc2V0LCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfUkVTVE9SRUNPTihORVdUT1kocmVzdG9yZWNvbiwgIjwxREZuUnJ2IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKK1VTRV9SRVYoTkVXVE9ZKHJldiwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1JGS0lMTChORVdUT1kocmZraWxsLCAiPDE+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfUk0oTkVXVE9ZKHJtLCAiZmlSclstZmldIiwgVE9ZRkxBR19CSU4pKQorVVNFX1JNRElSKE5FV1RPWShybWRpciwgIjwxcCIsIFRPWUZMQUdfQklOKSkKK1VTRV9STU1PRChORVdUT1kocm1tb2QsICI8MXdmIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorVVNFX1JPVVRFKE5FV1RPWShyb3V0ZSwgIj9uZUE6IiwgVE9ZRkxBR19CSU4pKQorVVNFX1JVTkNPTihORVdUT1kocnVuY29uLCAiPDIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX1NFRChORVdUT1koc2VkLCAiKHZlcnNpb24pZSpmKmluRXJbK0VyXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKK1VTRV9TRU5ERVZFTlQoTkVXVE9ZKHNlbmRldmVudCwgIjw0PjQiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX1NFUShORVdUT1koc2VxLCAiPDE+Mz9mOnM6d1shZnddIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1NFVEVORk9SQ0UoTkVXVE9ZKHNldGVuZm9yY2UsICI8MT4xIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKK1VTRV9TRVRGQVRUUihORVdUT1koc2V0ZmF0dHIsICJobjp8djp4OnxbIXh2XSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TRVRQUk9QKE5FV1RPWShzZXRwcm9wLCAiPDI+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfU0VUU0lEKE5FV1RPWShzZXRzaWQsICJePDF0IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1NIKE5FV1RPWShzaCwgImM6aSIsIFRPWUZMQUdfQklOKSkKK1VTRV9TSEExU1VNKE5FV1RPWShzaGExc3VtLCAiYmMqWyFiY10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0hBMjI0U1VNKE9MRFRPWShzaGEyMjRzdW0sIHNoYTFzdW0sIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TSEEyNTZTVU0oT0xEVE9ZKHNoYTI1NnN1bSwgc2hhMXN1bSwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1NIQTM4NFNVTShPTERUT1koc2hhMzg0c3VtLCBzaGExc3VtLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0hBNTEyU1VNKE9MRFRPWShzaGE1MTJzdW0sIHNoYTFzdW0sIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TSFJFRChORVdUT1koc2hyZWQsICI8MXp4dXMjPDFuIzwxbyM8MGYiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0tFTEVUT04oTkVXVE9ZKHNrZWxldG9uLCAiKHdhbHJ1cykoYmx1YmJlcik6OyhhbHNvKTplQGQqYyNiOmEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0tFTEVUT05fQUxJQVMoTkVXVE9ZKHNrZWxldG9uX2FsaWFzLCAiYiNkcSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TTEVFUChORVdUT1koc2xlZXAsICI8MSIsIFRPWUZMQUdfQklOKSkKK1VTRV9TT1JUKE5FV1RPWShzb3J0LCBVU0VfU09SVF9GTE9BVCgiZyIpVVNFX1NPUlRfQklHKCJTOlQ6bSIgIm86ayp0OnhiTWNzemRmaSIpICJydW4iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU1BMSVQoTkVXVE9ZKHNwbGl0LCAiPjJhIzwxPTI+OWIjPDFsIzwxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1NUQVJUKE5FV1RPWShzdGFydCwgIiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCitVU0VfU1RBVChORVdUT1koc3RhdCwgIjwxYzpmTHQiLCBUT1lGTEFHX0JJTikpIAorVVNFX1NUT1AoTkVXVE9ZKHN0b3AsICIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX1NUUklOR1MoTkVXVE9ZKHN0cmluZ3MsICJhbiM9NDwxZm8iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU1UoTkVXVE9ZKHN1LCAibG1wYzpzOiIsIFRPWUZMQUdfQklOfFRPWUZMQUdfUk9PVE9OTFkpKQorVVNFX1NVTE9HSU4oTkVXVE9ZKHN1bG9naW4sICJ0IzwwPTAiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfU1dBUE9GRihORVdUT1koc3dhcG9mZiwgIjwxPjEiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfU1dBUE9OKE5FV1RPWShzd2Fwb24sICI8MT4xcCM8MD4zMjc2N2QiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfU1dJVENIX1JPT1QoTkVXVE9ZKHN3aXRjaF9yb290LCAiPDJjOmgiLCBUT1lGTEFHX1NCSU4pKQorVVNFX1NZTkMoTkVXVE9ZKHN5bmMsIE5VTEwsIFRPWUZMQUdfQklOKSkKK1VTRV9TWVNDVEwoTkVXVE9ZKHN5c2N0bCwgIl5uZU5xd3BhQVshYXBdWyFhcV1bIWF3XVsrYUFdIiwgVE9ZRkxBR19TQklOKSkKK1VTRV9TWVNMT0dEKE5FV1RPWShzeXNsb2dkLCI+MGwjPDE+OD04UjpiIzwwPjk5PTFzIzwwPTIwMG0jPDA+NzE1ODI3ODc9MjBPOnA6ZjphOm5TS0xEIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfU1RBWVJPT1QpKQorVVNFX1RBQyhORVdUT1kodGFjLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVEFJTChORVdUT1kodGFpbCwgIj9mYy1uLVstY25dIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1RBUihORVdUT1kodGFyLCAiJihuby1yZWN1cnNpb24pKG51bWVyaWMtb3duZXIpKG5vLXNhbWUtcGVybWlzc2lvbnMpKG92ZXJ3cml0ZSkoZXhjbHVkZSkqKHRvLWNvbW1hbmQpOm8obm8tc2FtZS1vd25lcilwKHNhbWUtcGVybWlzc2lvbnMpayhrZWVwLW9sZCljKGNyZWF0ZSl8aChkZXJlZmVyZW5jZSl4KGV4dHJhY3QpfHQobGlzdCl8dih2ZXJib3NlKXooZ3ppcClPKHRvLXN0ZG91dCltKHRvdWNoKVgoZXhjbHVkZS1mcm9tKSpUKGZpbGVzLWZyb20pKkMoZGlyZWN0b3J5KTpmKGZpbGUpOlshdHhjXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9UQVNLU0VUKE5FV1RPWSh0YXNrc2V0LCAiPDFecGEiLCBUT1lGTEFHX0JJTnxUT1lGTEFHX1NUQVlST09UKSkKK1VTRV9UQ1BTVkQoTkVXVE9ZKHRjcHN2ZCwgIl48M2MjPTMwPDFDOmIjPTIwPDB1Omw6aEV2IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1RFRShORVdUT1kodGVlLCAiaWEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVEVMTkVUKE5FV1RPWSh0ZWxuZXQsICI8MT4yIiwgVE9ZRkxBR19CSU4pKQorVVNFX1RFTE5FVEQoTkVXVE9ZKHRlbG5ldGQsICJ3IzwwYjpwIzwwPjY1NTM1PTIzZjpsOkZTS2lbIXdpXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9URVNUKE5FV1RPWSh0ZXN0LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVEVTVF9IVU1BTl9SRUFEQUJMRShORVdUT1kodGVzdF9odW1hbl9yZWFkYWJsZSwgIjwxPjFpYnMiLCBUT1lGTEFHX0JJTikpCitVU0VfVEVTVF9NQU5ZX09QVElPTlMoTkVXVE9ZKHRlc3RfbWFueV9vcHRpb25zLCAiWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkF6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYSIsIFRPWUZMQUdfQklOKSkKK1VTRV9URVNUX1NDQU5LRVkoTkVXVE9ZKHRlc3Rfc2NhbmtleSwgMCwgVE9ZRkxBR19CSU4pKQorVVNFX1RGVFAoTkVXVE9ZKHRmdHAsICI8MWIjPDg+NjU0NjRyOmw6Z3xwfFshZ3BdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1RGVFBEKE5FV1RPWSh0ZnRwZCwgInJjdTpsIiwgVE9ZRkxBR19CSU4pKQorVVNFX1RJTUUoTkVXVE9ZKHRpbWUsICI8MV5wIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1RJTUVPVVQoTkVXVE9ZKHRpbWVvdXQsICI8Ml52azpzOiAiLCBUT1lGTEFHX0JJTikpCitVU0VfVE9QKE5FV1RPWSh0b3AsICI+MG0iICJPKkhrKm8qcCp1KnMjPDFkIz0zPDFuIzwxYnFbIW9PXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKK1VTRV9UT1VDSChORVdUT1kodG91Y2gsICJhY2Q6bXI6dDpoWyFkdHJdIiwgVE9ZRkxBR19CSU4pKQorVVNFX1NIKE9MRFRPWSh0b3lzaCwgc2gsIFRPWUZMQUdfQklOKSkKK1VTRV9UUihORVdUT1kodHIsICJePjI8MUNjc2RbK2NDXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9UUkFDRVJPVVRFKE5FV1RPWSh0cmFjZXJvdXRlLCAiPDE+Mmk6ZiM8MT4yNTU9MXojPDA+ODY0MDA9MGcqdyM8MD44NjQwMD01dCM8MD4yNTU9MHM6cSM8MT4yNTU9M3AjPDE+NjU1MzU9MzM0MzRtIzwxPjI1NT0zMHJ2bmRsSVVGNjQiLCBUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9UUkFDRVJPVVRFKE9MRFRPWSh0cmFjZXJvdXRlNix0cmFjZXJvdXRlLCBUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9UUlVFKE5FV1RPWSh0cnVlLCBOVUxMLCBUT1lGTEFHX0JJTnxUT1lGTEFHX05PSEVMUCkpCitVU0VfVFJVTkNBVEUoTkVXVE9ZKHRydW5jYXRlLCAiPDFzOnxjIiwgVE9ZRkxBR19CSU4pKQorVVNFX1RUWShORVdUT1kodHR5LCAicyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9UQ1BTVkQoT0xEVE9ZKHVkcHN2ZCwgdGNwc3ZkLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVUxJTUlUKE5FV1RPWSh1bGltaXQsICI+MVAjPDFTSGF2dXRzclJxcG5tbGlmZWRjWy1TSF1bIWFwdnV0c3JScW5tbGlmZWRjXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9VTU9VTlQoTkVXVE9ZKHVtb3VudCwgIm5kRGZscmF0KnZbIW5hXSIsIFRPWUZMQUdfQklOfFRPWUZMQUdfU1RBWVJPT1QpKQorVVNFX1VOQU1FKE5FV1RPWSh1bmFtZSwgIm9hbXZybnNbK29zXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9VTklRKE5FV1RPWSh1bmlxLCAiZiNzI3cjemljZHUiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVU5JWDJET1MoTkVXVE9ZKHVuaXgyZG9zLCAwLCBUT1lGTEFHX0JJTikpCitVU0VfVU5MSU5LKE5FV1RPWSh1bmxpbmssICI8MT4xIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1VOU0hBUkUoTkVXVE9ZKHVuc2hhcmUsICI8MV5mKGZvcmspO3IobWFwLXJvb3QtdXNlcik7aTooaXBjKTttOihtb3VudCk7bjoobmV0KTtwOihwaWQpO3U6KHV0cyk7VToodXNlcik7IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1VQVElNRShORVdUT1kodXB0aW1lLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVVNFUkFERChORVdUT1kodXNlcmFkZCwgIjwxPjJ1IzwwRzpzOmc6aDpTREgiLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfVU1BU0t8VE9ZRkxBR19TQklOKSkKK1VTRV9VU0VSREVMKE5FV1RPWSh1c2VyZGVsLCAiPDE+MXIiLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCitVU0VfVVNMRUVQKE5FV1RPWSh1c2xlZXAsICI8MSIsIFRPWUZMQUdfQklOKSkKK1VTRV9VVURFQ09ERShORVdUT1kodXVkZWNvZGUsICI+MW86IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19VTUFTSykpCitVU0VfVVVFTkNPREUoTkVXVE9ZKHV1ZW5jb2RlLCAiPDE+Mm0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVkNPTkZJRyhORVdUT1kodmNvbmZpZywgIjwyPjQiLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCitVU0VfVkkoTkVXVE9ZKHZpLCAiPDE+MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9WTVNUQVQoTkVXVE9ZKHZtc3RhdCwgIj4ybiIsIFRPWUZMQUdfQklOKSkKK1VTRV9XKE5FV1RPWSh3LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfV0FUQ0goTkVXVE9ZKHdhdGNoLCAiXjwxbiM8MD0ydGUiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfV0MoTkVXVE9ZKHdjLCAibWN3bCIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKK1VTRV9XR0VUKE5FV1RPWSh3Z2V0LCAiZjoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfV0hJQ0goTkVXVE9ZKHdoaWNoLCAiPDFhIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1dITyhORVdUT1kod2hvLCAiYSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9XSE9BTUkoT0xEVE9ZKHdob2FtaSwgbG9nbmFtZSwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1hBUkdTKE5FV1RPWSh4YXJncywgIl5JOkU6TCNwdHhybiM8MXMjMCIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9YWEQoTkVXVE9ZKHh4ZCwgIj4xYyM8MT40MDk2PTE2bCNnIzwxPTJwcnMjWyFyc10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfWFpDQVQoTkVXVE9ZKHh6Y2F0LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfWUVTKE5FV1RPWSh5ZXMsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9aQ0FUKE5FV1RPWSh6Y2F0LCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCmRpZmYgLS1naXQgYS90b3lib3gvZ2VuZXJhdGVkL3RhZ3MuaCBiL3RveWJveC9nZW5lcmF0ZWQvdGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTc3NzMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvZ2VuZXJhdGVkL3RhZ3MuaApAQCAtMCwwICsxLDE5MiBAQAorI2RlZmluZSBDUF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgX0NQX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQ1Bfb3duZXJzaGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIF9DUF9vd25lcnNoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIENQX3RpbWVzdGFtcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBfQ1BfdGltZXN0YW1wcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBDUF9jb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgX0NQX2NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MykKKyNkZWZpbmUgQ1BfeGF0dHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIF9DUF94YXR0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIFBTX1BJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBfUFNfUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBQU19QUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX1BTX1BQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgUFNfUFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIF9QU19QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFBTX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBfUFNfTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBQU19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgX1BTX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgUFNfU1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIF9QU19TWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIFBTX1JTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBfUFNfUlNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBQU19QR0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgX1BTX1BHSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NykKKyNkZWZpbmUgUFNfVlNaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIF9QU19WU1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIFBTX01BSkZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBfUFNfTUFKRkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw5KQorI2RlZmluZSBQU19NSU5GTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIF9QU19NSU5GTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBQU19QUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIF9QU19QUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDExKQorI2RlZmluZSBQU19QU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIF9QU19QU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorI2RlZmluZSBQU19SVFBSSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIF9QU19SVFBSSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEzKQorI2RlZmluZSBQU19TQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIF9QU19TQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBQU19DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIF9QU19DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE1KQorI2RlZmluZSBQU19USUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIF9QU19USUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBQU19UQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIF9QU19UQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE3KQorI2RlZmluZSBQU19CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIF9QU19CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE4KQorI2RlZmluZSBQU19UVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIF9QU19UVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE5KQorI2RlZmluZSBQU19XQ0hBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIF9QU19XQ0hBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIwKQorI2RlZmluZSBQU19MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIF9QU19MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIxKQorI2RlZmluZSBQU19DT01NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIF9QU19DT01NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIyKQorI2RlZmluZSBQU19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIF9QU19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIzKQorI2RlZmluZSBQU19DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIF9QU19DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBQU19DTURMSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIF9QU19DTURMSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI1KQorI2RlZmluZSBQU19BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIF9QU19BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI2KQorI2RlZmluZSBQU19DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIF9QU19DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI3KQorI2RlZmluZSBQU19VSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIF9QU19VSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBQU19VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIF9QU19VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI5KQorI2RlZmluZSBQU19SVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIF9QU19SVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBQU19SVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIF9QU19SVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBQU19HSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIF9QU19HSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8MzIpCisjZGVmaW5lIFBTX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgX1BTX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDwzMykKKyNkZWZpbmUgUFNfUkdJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBfUFNfUkdJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDM0KQorI2RlZmluZSBQU19SR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIF9QU19SR1JPVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8MzUpCisjZGVmaW5lIFBTX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgX1BTX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDwzNikKKyNkZWZpbmUgUFNfRUxBUFNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBfUFNfRUxBUFNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDM3KQorI2RlZmluZSBQU19USU1FXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIF9QU19USU1FXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8MzgpCisjZGVmaW5lIFBTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgX1BTX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDwzOSkKKyNkZWZpbmUgUFNfX1ZTWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBfUFNfX1ZTWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDQwKQorI2RlZmluZSBQU19fTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIF9QU19fTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NDEpCisjZGVmaW5lIFBTX19DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgX1BTX19DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw0MikKKyNkZWZpbmUgUFNfVklSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBfUFNfVklSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDQzKQorI2RlZmluZSBQU19SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIF9QU19SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NDQpCisjZGVmaW5lIFBTX1NIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgX1BTX1NIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw0NSkKKyNkZWZpbmUgUFNfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NgorI2RlZmluZSBfUFNfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDQ2KQorI2RlZmluZSBQU19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIF9QU19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NDcpCisjZGVmaW5lIFBTX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgX1BTX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw0OCkKKyNkZWZpbmUgUFNfRFJFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OQorI2RlZmluZSBfUFNfRFJFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDQ5KQorI2RlZmluZSBQU19EV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIF9QU19EV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NTApCisjZGVmaW5lIFBTX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgX1BTX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw1MSkKKyNkZWZpbmUgUFNfRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MgorI2RlZmluZSBfUFNfRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDUyKQorI2RlZmluZSBQU19TVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzCisjZGVmaW5lIF9QU19TVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NTMpCisjZGVmaW5lIFBTX0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQKKyNkZWZpbmUgX1BTX0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw1NCkKKyNkZWZpbmUgUFNfUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBfUFNfUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTEw8PDU1KQorI2RlZmluZSBQU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2CisjZGVmaW5lIF9QU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMTDw8NTYpCisjZGVmaW5lIFBTX1BDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcKKyNkZWZpbmUgX1BTX1BDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDw1NykKKyNkZWZpbmUgS0VZX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBfS0VZX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgS0VZX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBfS0VZX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgS0VZX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBfS0VZX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgS0VZX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBfS0VZX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MykKKyNkZWZpbmUgS0VZX1BHVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBfS0VZX1BHVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgS0VZX1BHRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBfS0VZX1BHRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgS0VZX0hPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBfS0VZX0hPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgS0VZX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBfS0VZX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NykKKyNkZWZpbmUgS0VZX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBfS0VZX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgS0VZX0YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBfS0VZX0YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OSkKKyNkZWZpbmUgS0VZX0YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgX0tFWV9GMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBLRVlfRjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBfS0VZX0YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTEpCisjZGVmaW5lIEtFWV9GNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIF9LRVlfRjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKyNkZWZpbmUgS0VZX0Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgX0tFWV9GNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEzKQorI2RlZmluZSBLRVlfRjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBfS0VZX0Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTQpCisjZGVmaW5lIEtFWV9GNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIF9LRVlfRjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxNSkKKyNkZWZpbmUgS0VZX0Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgX0tFWV9GOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBLRVlfRjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBfS0VZX0Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTcpCisjZGVmaW5lIEtFWV9TVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIF9LRVlfU1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgS0VZX0FVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgX0tFWV9BVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDE5KQorI2RlZmluZSBLRVlfQ1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBfS0VZX0NVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjApCisjZGVmaW5lIEtFWV9TRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIF9LRVlfU0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyMSkKKyNkZWZpbmUgS0VZX0FET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgX0tFWV9BRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIyKQorI2RlZmluZSBLRVlfQ0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBfS0VZX0NET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjMpCisjZGVmaW5lIEtFWV9TUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIF9LRVlfU1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyNCkKKyNkZWZpbmUgS0VZX0FSSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgX0tFWV9BUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI1KQorI2RlZmluZSBLRVlfQ1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBfS0VZX0NSSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjYpCisjZGVmaW5lIEtFWV9TTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIF9LRVlfU0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyNykKKyNkZWZpbmUgS0VZX0FMRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgX0tFWV9BTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBLRVlfQ0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBfS0VZX0NMRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjkpCisjZGVmaW5lIEtFWV9TRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIF9LRVlfU0YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgS0VZX0FGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgX0tFWV9BRjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBLRVlfQ0YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBfS0VZX0NGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUxMPDwzMikKZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL01ha2VmaWxlIGIvdG95Ym94L2tjb25maWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2NmQwMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL01ha2VmaWxlCkBAIC0wLDAgKzEsNjkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEtlcm5lbCBjb25maWd1cmF0aW9uIHRhcmdldHMKKyMgVGhlc2UgdGFyZ2V0cyBhcmUgdXNlZCBmcm9tIHRvcC1sZXZlbCBtYWtlZmlsZQorCitLQ09ORklHX1RPUCA9IENvbmZpZy5pbgorS0NPTkZJR19QUk9KRUNUID0gVG95Qm94CitvYmogPSAuL2tjb25maWcKK1BIT05ZICs9IGNsZWFuIGhlbHAgb2xkY29uZmlnIG1lbnVjb25maWcgY29uZmlnIHNpbGVudG9sZGNvbmZpZyBcCisJcmFuZGNvbmZpZyBhbGx5ZXNjb25maWcgYWxsbm9jb25maWcgYWxsbW9kY29uZmlnIGRlZmNvbmZpZworCittZW51Y29uZmlnOiAkKG9iaikvbWNvbmYgJChLQ09ORklHX1RPUCkKKwkkPCAkKEtDT05GSUdfVE9QKQorCitjb25maWc6ICQob2JqKS9jb25mICQoS0NPTkZJR19UT1ApCisJJDwgJChLQ09ORklHX1RPUCkKKworb2xkY29uZmlnOiAkKG9iaikvY29uZiAkKEtDT05GSUdfVE9QKQorCSQ8IC1vICQoS0NPTkZJR19UT1ApCisKK3NpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYgJChLQ09ORklHX1RPUCkKKwkkPCAtcyAkKEtDT05GSUdfVE9QKQorCityYW5kY29uZmlnOiAkKG9iaikvY29uZiAkKEtDT05GSUdfVE9QKQorCSQ8IC1yICQoS0NPTkZJR19UT1ApID4gL2Rldi9udWxsCisKK2FsbHllc2NvbmZpZzogJChvYmopL2NvbmYgJChLQ09ORklHX1RPUCkKKwkkPCAteSAkKEtDT05GSUdfVE9QKSA+IC9kZXYvbnVsbAorCithbGxub2NvbmZpZzogJChvYmopL2NvbmYgJChLQ09ORklHX1RPUCkKKwkkPCAtbiAkKEtDT05GSUdfVE9QKSA+IC9kZXYvbnVsbAorCitkZWZjb25maWc6ICQob2JqKS9jb25mICQoS0NPTkZJR19UT1ApCisJJDwgLUQgL2Rldi9udWxsICQoS0NPTkZJR19UT1ApID4gL2Rldi9udWxsCisKKyMgSGVscCB0ZXh0IHVzZWQgYnkgbWFrZSBoZWxwCitoZWxwOjoKKwlAZWNobyAgJyAgY29uZmlnCSAgLSBVcGRhdGUgY3VycmVudCBjb25maWcgdXRpbGlzaW5nIGEgbGluZS1vcmllbnRlZCBwcm9ncmFtJworCUBlY2hvICAnICBtZW51Y29uZmlnCSAgLSBVcGRhdGUgY3VycmVudCBjb25maWcgdXRpbGlzaW5nIGEgbWVudSBiYXNlZCBwcm9ncmFtJworCUBlY2hvICAnICBvbGRjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2UnCisJQGVjaG8gICcgIHNpbGVudG9sZGNvbmZpZyAtIFNhbWUgYXMgb2xkY29uZmlnLCBidXQgcXVpZXRseScKKwlAZWNobyAgJyAgcmFuZGNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIHJhbmRvbSBhbnN3ZXIgdG8gYWxsIG9wdGlvbnMnCisJQGVjaG8gICcgIGRlZmNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIGRlZmF1bHQgYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBtYXhpbXVtIHNhbmUgY29uZmlndXJhdGlvbi4nCisJQGVjaG8gICcgIGFsbHllc2NvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQgd2l0aCB5ZXMnCisJQGVjaG8gICIgICAgICAgICAgICAgICAgICAgIFRoaXMgbWF5IG5vdCBhY3R1YWxseSBjb21waWxlLCBpdCdzIGEgc3RhcnRpbmcgcG9pbnQiCisJQGVjaG8gICcgICAgICAgICAgICAgICAgICAgIGZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gKHByb2JhYmx5IHdpdGggbWVudWNvbmZpZyknCisJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vJworCUBlY2hvICAnICAgICAgICAgICAgICAgICAgICAoTk9QIGJpbmFyeSwgc3RhcnRpbmcgcG9pbnQgZm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbiknCisKKyMgQ2hlZXN5IGJ1aWxkCisKK1NISVBQRUQgPSBrY29uZmlnL3pjb25mLnRhYi5jIGtjb25maWcvbGV4Lnpjb25mLmMga2NvbmZpZy96Y29uZi5oYXNoLmMKKworJS5jOiAlLmNfc2hpcHBlZAorCUBsbiAtcyAkKG5vdGRpciAkPCkgJEAKKworZ2VuX2NvbmZpZy5oOiAuY29uZmlnCisKK2tjb25maWcvbWNvbmY6ICQoU0hJUFBFRCkKKwkkKEhPU1RDQykgLW8gJEAga2NvbmZpZy9tY29uZi5jIGtjb25maWcvemNvbmYudGFiLmMgXAorCQlrY29uZmlnL2x4ZGlhbG9nLyouYyAtbGN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IiBcCisJCS1ES0JVSUxEX05PX05MUz0xIC1EUFJPSkVDVF9OQU1FPVwiJChLQ09ORklHX1BST0pFQ1QpXCIKKwora2NvbmZpZy9jb25mOiAkKFNISVBQRUQpCisJJChIT1NUQ0MpIC1vICRAIGtjb25maWcvY29uZi5jIGtjb25maWcvemNvbmYudGFiLmMgLURLQlVJTERfTk9fTkxTPTEgXAorCQktRFBST0pFQ1RfTkFNRT1cIiQoS0NPTkZJR19QUk9KRUNUKVwiCisKK2NsZWFuOjoKKwlybSAtZiAkKHdpbGRjYXJkIGtjb25maWcvKnpjb25mKi5jKSBrY29uZmlnL2NvbmYga2NvbmZpZy9tY29uZgpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvUkVBRE1FIGIvdG95Ym94L2tjb25maWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDliYmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9SRUFETUUKQEAgLTAsMCArMSwyNiBAQAorVGhpcyBpcyBhIHNuYXBzaG90IG9mIGxpbnV4IDIuNi4xMiBrY29uZmlnIGFzIHdhc2hlZCB0aHJvdWdoIGJ1c3lib3ggYW5kCitmdXJ0aGVyIG1vZGlmaWVkIGJ5IFJvYiBMYW5kbGV5LgorCitXYXkgYmFjayB3aGVuIEkgdHJpZWQgdG8gcHVzaCBteSBsb2NhbCBjaGFuZ2VzIHRvIGtjb25maWcgdXBzdHJlYW0KK2luIDIwMDUgaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzE2MTA4Ni8KK2FuZCAyMDA2IGh0dHA6Ly9sa21sLml1LmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzA2MDcuMC8xODA1Lmh0bWwKK2FuZCAyMDA3IGh0dHA6Ly9sa21sLml1LmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzA3MDcuMS8xNzQxLmh0bWwKK2VhY2ggb2Ygd2hpY2ggc3Bhd25lZCBsb25nICJJIHRoaW5rIHlvdSBzaG91bGQgZ28gZG8gdGhpcyBhbmQgdGhpcyBhbmQgdGhpcworYnV0IEknbSBub3QgZ29pbmcgdG8gbGlmdCBhIGZpbmdlciBwZXJzb25hbGx5IiB0aHJlYWRzIGZyb20gdGhlIGtlcm5lbAorZGV2ZWxvcGVycy4gVHdpY2UgSSBjYW1lIGJhY2sgYSB5ZWFyIGxhdGVyIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW55IGludGVyZXN0CitpbiB3aGF0IEkgX2hhZF8gZG9uZSwgYW5kIHRoZSB0aGlyZCB0aHJlYWQgd2FzIHRoZSBsb25nZXN0IG9mIHRoZSBsb3QgYnV0CitubyBjb2RlIHdhcyBtZXJnZWQgYXMgYSByZXN1bHQuCisKKypzaHJ1ZyogVGhhdCdzIHRoZSBsaW51eC1rZXJuZWwgY29tbXVuaXR5IGZvciB5b3UuIEkgaGFkIGFuIGVhc2llciB0aW1lCit0aGFuIHRoZSBhdXRob3Igb2Ygc3F1YXNoZnMsIHdobyBzcGVudCA1IHllYXJzIGFjdGl2ZWx5IHRyeWluZyB0byBnZXQgaGlzIGNvZGUKK21lcmdlZCwgZmluYWxseSBxdWl0dGluZyBoaXMgam9iIHRvIHNwZW5kIGFuIHVucGFpZCB5ZWFyIHdvcmtpbmcgb24gdXBzdHJlYW1pbmcKK3NxdWFzaGZzIF9hZnRlcl8gYWZ0ZXIgZXZlcnkgbWFqb3IgTGludXggZGlzdHJvIGhhZCBiZWVuIGxvY2FsbHkgY2FycnlpbmcgaXQKK2ZvciB5ZWFycy4gTm8gcmVhbGx5LCBoZXJlJ3Mgd2hlcmUgaGUgd3JvdGUgYWJvdXQgaXQgaGltc2VsZjoKKworaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzU2MzU3OC8KKworVGhpcyBjb2RlIGlzIF9nb2luZ19hd2F5Xy4gUmV3cml0aW5nIGl0IGlzIGxvdyBwcmlvcml0eSwgYnV0IHJlbW92aW5nIGl0IGlzIGEKK2NoZWNrbGlzdCBpdGVtIGZvciB0aGUgMS4wIHRveWJveCByZWxlYXNlLiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgb25seQorR1BMIGNvZGUgbGVmdCBpbiB0aGUgdHJlZSwgYW5kIG5vbmUgb2YgaXRzIGNvZGUgd2luZHMgdXAgaW4gdGhlIHJlc3VsdGluZworYmluYXJ5LiBJdCdzIGp1c3QgYW4gZWRpdG9yIHRoYXQgcmVhZHMgb3VyIENvbmZpZy5pbiBmaWxlcyB0byB1cGRhdGUgdGhlIHRvcAorbGV2ZWwgLmNvbmZpZyBmaWxlOyB5b3UgY2FuIGVkaXQgdGhleSBieSBoYW5kIGlmIHlvdSByZWFsbHkgd2FudCB0by4KZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL2NvbmYuYyBiL3RveWJveC9rY29uZmlnL2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk0MGUxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvY29uZi5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKKworZW51bSB7CisJYXNrX2FsbCwKKwlhc2tfbmV3LAorCWFza19zaWxlbnQsCisJc2V0X2RlZmF1bHQsCisJc2V0X3llcywKKwlzZXRfbW9kLAorCXNldF9ubywKKwlzZXRfcmFuZG9tCit9IGlucHV0X21vZGUgPSBhc2tfYWxsOworY2hhciAqZGVmY29uZmlnX2ZpbGU7CisKK3N0YXRpYyBpbnQgaW5kZW50ID0gMTsKK3N0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBjb25mX2NudDsKK3N0YXRpYyBjaGFyIGxpbmVbMTI4XTsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OworCitzdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0gTl8oIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIik7CisKK3N0YXRpYyB2b2lkIHN0cmlwKGNoYXIgKnN0cikKK3sKKwljaGFyICpwID0gc3RyOworCWludCBsOworCisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCXArKzsKKwlsID0gc3RybGVuKHApOworCWlmIChwICE9IHN0cikKKwkJbWVtbW92ZShzdHIsIHAsIGwgKyAxKTsKKwlpZiAoIWwpCisJCXJldHVybjsKKwlwID0gc3RyICsgbCAtIDE7CisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCSpwLS0gPSAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zdGRpbih2b2lkKQoreworCWlmICghdmFsaWRfc3RkaW4gJiYgaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50KSB7CisJCXByaW50ZihfKCJhYm9ydGVkIVxuXG4iKSk7CisJCXByaW50ZihfKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKSk7CisJCXByaW50ZihfKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIikpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9hc2t2YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwl0cmlzdGF0ZSB2YWw7CisKKwlpZiAoIXN5bV9oYXNfdmFsdWUoc3ltKSkKKwkJcHJpbnRmKCIoTkVXKSAiKTsKKworCWxpbmVbMF0gPSAnXG4nOworCWxpbmVbMV0gPSAwOworCisJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJbGluZVswXSA9ICdcbic7CisJCWxpbmVbMV0gPSAwOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfbm86CisJY2FzZSBzZXRfbW9kOgorCWNhc2Ugc2V0X3llczoKKwljYXNlIHNldF9yYW5kb206CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBhc2tfbmV3OgorCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJCXJldHVybjsKKwkJfQorCQljaGVja19zdGRpbigpOworCWNhc2UgYXNrX2FsbDoKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOworCQlyZXR1cm47CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJOworCX0KKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIHNldF95ZXM6CisJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJbGluZVswXSA9ICd5JzsKKwkJCWxpbmVbMV0gPSAnXG4nOworCQkJbGluZVsyXSA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2Ugc2V0X21vZDoKKwkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKSB7CisJCQkJbGluZVswXSA9ICdtJzsKKwkJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCQlsaW5lWzJdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJCWxpbmVbMF0gPSAneSc7CisJCQkJbGluZVsxXSA9ICdcbic7CisJCQkJbGluZVsyXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwljYXNlIHNldF9ubzoKKwkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpIHsKKwkJCWxpbmVbMF0gPSAnbic7CisJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCWxpbmVbMl0gPSAwOworCQkJYnJlYWs7CisJCX0KKwljYXNlIHNldF9yYW5kb206CisJCWRvIHsKKwkJCXZhbCA9ICh0cmlzdGF0ZSkocmFuZG9tKCkgJSAzKTsKKwkJfSB3aGlsZSAoIXN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB2YWwpKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzogbGluZVswXSA9ICduJzsgYnJlYWs7CisJCWNhc2UgbW9kOiBsaW5lWzBdID0gJ20nOyBicmVhazsKKwkJY2FzZSB5ZXM6IGxpbmVbMF0gPSAneSc7IGJyZWFrOworCQl9CisJCWxpbmVbMV0gPSAnXG4nOworCQlsaW5lWzJdID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiJXMiLCBsaW5lKTsKK30KKworaW50IGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWYsICpoZWxwOworCisJd2hpbGUgKDEpIHsKKwkJcHJpbnRmKCIlKnMlcyAiLCBpbmRlbnQgLSAxLCAiIiwgbWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJcHJpbnRmKCIoJXMpICIsIHN5bS0+bmFtZSk7CisJCWRlZiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKQorCQkJcHJpbnRmKCJbJXNdICIsIGRlZik7CisJCWNvbmZfYXNrdmFsdWUoc3ltLCBkZWYpOworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJLyogcHJpbnQgaGVscCAqLworCQkJaWYgKGxpbmVbMV0gPT0gJ1xuJykgeworCQkJCWhlbHAgPSBub2hlbHBfdGV4dDsKKwkJCQlpZiAobWVudS0+c3ltLT5oZWxwKQorCQkJCQloZWxwID0gbWVudS0+c3ltLT5oZWxwOworCQkJCXByaW50ZigiXG4lc1xuIiwgbWVudS0+c3ltLT5oZWxwKTsKKwkJCQlkZWYgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJbGluZVtzdHJsZW4obGluZSktMV0gPSAwOworCQkJZGVmID0gbGluZTsKKwkJfQorCQlpZiAoZGVmICYmIHN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN5bSwgZGVmKSkKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBjb25mX3N5bShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJaW50IHR5cGU7CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisJY29uc3QgY2hhciAqaGVscDsKKworCXdoaWxlICgxKSB7CisJCXByaW50ZigiJSpzJXMgIiwgaW5kZW50IC0gMSwgIiIsIG1lbnUtPnByb21wdC0+dGV4dCk7CisJCWlmIChzeW0tPm5hbWUpCisJCQlwcmludGYoIiglcykgIiwgc3ltLT5uYW1lKTsKKwkJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCQlwdXRjaGFyKCdbJyk7CisJCW9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChvbGR2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXB1dGNoYXIoJ04nKTsKKwkJCWJyZWFrOworCQljYXNlIG1vZDoKKwkJCXB1dGNoYXIoJ00nKTsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCXB1dGNoYXIoJ1knKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvbGR2YWwgIT0gbm8gJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSkKKwkJCXByaW50ZigiL24iKTsKKwkJaWYgKG9sZHZhbCAhPSBtb2QgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkpCisJCQlwcmludGYoIi9tIik7CisJCWlmIChvbGR2YWwgIT0geWVzICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKQorCQkJcHJpbnRmKCIveSIpOworCQlpZiAoc3ltLT5oZWxwKQorCQkJcHJpbnRmKCIvPyIpOworCQlwcmludGYoIl0gIik7CisJCWNvbmZfYXNrdmFsdWUoc3ltLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwkJc3RyaXAobGluZSk7CisKKwkJc3dpdGNoIChsaW5lWzBdKSB7CisJCWNhc2UgJ24nOgorCQljYXNlICdOJzoKKwkJCW5ld3ZhbCA9IG5vOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJvIikpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAnbSc6CisJCWNhc2UgJ00nOgorCQkJbmV3dmFsID0gbW9kOworCQkJaWYgKCFsaW5lWzFdKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgJ3knOgorCQljYXNlICdZJzoKKwkJCW5ld3ZhbCA9IHllczsKKwkJCWlmICghbGluZVsxXSB8fCAhc3RyY21wKCZsaW5lWzFdLCAiZXMiKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQluZXd2YWwgPSBvbGR2YWw7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlnb3RvIGhlbHA7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCkpCisJCQlyZXR1cm4gMDsKK2hlbHA6CisJCWhlbHAgPSBub2hlbHBfdGV4dDsKKwkJaWYgKHN5bS0+aGVscCkKKwkJCWhlbHAgPSBzeW0tPmhlbHA7CisJCXByaW50ZigiXG4lc1xuIiwgaGVscCk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSwgKmRlZl9zeW07CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWludCB0eXBlOworCWJvb2wgaXNfbmV3OworCisJc3ltID0gbWVudS0+c3ltOworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlpc19uZXcgPSAhc3ltX2hhc192YWx1ZShzeW0pOworCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJY29uZl9zeW0obWVudSk7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7CisJCWNhc2Ugbm86CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBtb2Q6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSB5ZXM6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7CisJCWNhc2Ugbm86CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBtb2Q6CisJCQlwcmludGYoIiUqcyVzXG4iLCBpbmRlbnQgLSAxLCAiIiwgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJCXJldHVybiAwOworCQljYXNlIHllczoKKwkJCWJyZWFrOworCQl9CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IGNudCwgZGVmOworCisJCXByaW50ZigiJSpzJXNcbiIsIGluZGVudCAtIDEsICIiLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQlkZWZfc3ltID0gc3ltX2dldF9jaG9pY2VfdmFsdWUoc3ltKTsKKwkJY250ID0gZGVmID0gMDsKKwkJbGluZVswXSA9IDA7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFjaGlsZC0+c3ltKSB7CisJCQkJcHJpbnRmKCIlKmMgJXNcbiIsIGluZGVudCwgJyonLCBtZW51X2dldF9wcm9tcHQoY2hpbGQpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNudCsrOworCQkJaWYgKGNoaWxkLT5zeW0gPT0gZGVmX3N5bSkgeworCQkJCWRlZiA9IGNudDsKKwkJCQlwcmludGYoIiUqYyIsIGluZGVudCwgJz4nKTsKKwkJCX0gZWxzZQorCQkJCXByaW50ZigiJSpjIiwgaW5kZW50LCAnICcpOworCQkJcHJpbnRmKCIgJWQuICVzIiwgY250LCBtZW51X2dldF9wcm9tcHQoY2hpbGQpKTsKKwkJCWlmIChjaGlsZC0+c3ltLT5uYW1lKQorCQkJCXByaW50ZigiICglcykiLCBjaGlsZC0+c3ltLT5uYW1lKTsKKwkJCWlmICghc3ltX2hhc192YWx1ZShjaGlsZC0+c3ltKSkKKwkJCQlwcmludGYoIiAoTkVXKSIpOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJCXByaW50ZigiJSpzY2hvaWNlIiwgaW5kZW50IC0gMSwgIiIpOworCQlpZiAoY250ID09IDEpIHsKKwkJCXByaW50ZigiWzFdOiAxXG4iKTsKKwkJCWdvdG8gY29uZl9jaGlsZHM7CisJCX0KKwkJcHJpbnRmKCJbMS0lZCIsIGNudCk7CisJCWlmIChzeW0tPmhlbHApCisJCQlwcmludGYoIj8iKTsKKwkJcHJpbnRmKCJdOiAiKTsKKwkJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJCWNhc2UgYXNrX25ldzoKKwkJY2FzZSBhc2tfc2lsZW50OgorCQkJaWYgKCFpc19uZXcpIHsKKwkJCQljbnQgPSBkZWY7CisJCQkJcHJpbnRmKCIlZFxuIiwgY250KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNoZWNrX3N0ZGluKCk7CisJCWNhc2UgYXNrX2FsbDoKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJZmdldHMobGluZSwgMTI4LCBzdGRpbik7CisJCQlzdHJpcChsaW5lKTsKKwkJCWlmIChsaW5lWzBdID09ICc/JykgeworCQkJCXByaW50ZigiXG4lc1xuIiwgbWVudS0+c3ltLT5oZWxwID8KKwkJCQkJbWVudS0+c3ltLT5oZWxwIDogbm9oZWxwX3RleHQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFsaW5lWzBdKQorCQkJCWNudCA9IGRlZjsKKwkJCWVsc2UgaWYgKGlzZGlnaXQobGluZVswXSkpCisJCQkJY250ID0gYXRvaShsaW5lKTsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlIHNldF9yYW5kb206CisJCQlkZWYgPSAocmFuZG9tKCkgJSBjbnQpICsgMTsKKwkJY2FzZSBzZXRfZGVmYXVsdDoKKwkJY2FzZSBzZXRfeWVzOgorCQljYXNlIHNldF9tb2Q6CisJCWNhc2Ugc2V0X25vOgorCQkJY250ID0gZGVmOworCQkJcHJpbnRmKCIlZFxuIiwgY250KTsKKwkJCWJyZWFrOworCQl9CisKKwljb25mX2NoaWxkczoKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIWNoaWxkLT5zeW0gfHwgIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIS0tY250KQorCQkJCWJyZWFrOworCQl9CisJCWlmICghY2hpbGQpCisJCQljb250aW51ZTsKKwkJaWYgKGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJz8nKSB7CisJCQlwcmludGYoIlxuJXNcbiIsIGNoaWxkLT5zeW0tPmhlbHAgPworCQkJCWNoaWxkLT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzeW1fc2V0X2Nob2ljZV92YWx1ZShzeW0sIGNoaWxkLT5zeW0pOworCQlpZiAoY2hpbGQtPmxpc3QpIHsKKwkJCWluZGVudCArPSAyOworCQkJY29uZihjaGlsZC0+bGlzdCk7CisJCQlpbmRlbnQgLT0gMjsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJaWYgKHByb3ApIHsKKwkJY29uc3QgY2hhciAqcHJvbXB0OworCisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfTUVOVToKKwkJCWlmIChpbnB1dF9tb2RlID09IGFza19zaWxlbnQgJiYgcm9vdEVudHJ5ICE9IG1lbnUpIHsKKwkJCQljaGVja19jb25mKG1lbnUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJY2FzZSBQX0NPTU1FTlQ6CisJCQlwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJCQlpZiAocHJvbXB0KQorCQkJCXByaW50ZigiJSpjXG4lKmMgJXNcbiUqY1xuIiwKKwkJCQkJaW5kZW50LCAnKicsCisJCQkJCWluZGVudCwgJyonLCBwcm9tcHQsCisJCQkJCWluZGVudCwgJyonKTsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KKworCWlmICghc3ltKQorCQlnb3RvIGNvbmZfY2hpbGRzOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQljb25mX2Nob2ljZShtZW51KTsKKwkJaWYgKHN5bS0+Y3Vyci50cmkgIT0gbW9kKQorCQkJcmV0dXJuOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCWNvbmZfc3RyaW5nKG1lbnUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25mX3N5bShtZW51KTsKKwkJYnJlYWs7CisJfQorCitjb25mX2NoaWxkczoKKwlpZiAoc3ltKQorCQlpbmRlbnQgKz0gMjsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWNvbmYoY2hpbGQpOworCWlmIChzeW0pCisJCWluZGVudCAtPSAyOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0gJiYgIXN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pIHx8CisJCSAgICAoc3ltX2lzX2Nob2ljZShzeW0pICYmIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSB5ZXMpKSB7CisJCQlpZiAoIWNvbmZfY250KyspCisJCQkJcHJpbnRmKF8oIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpKTsKKwkJCXJvb3RFbnRyeSA9IG1lbnVfZ2V0X3BhcmVudF9tZW51KG1lbnUpOworCQkJY29uZihyb290RW50cnkpOworCQl9CisJfQorCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQljaGVja19jb25mKGNoaWxkKTsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJaW50IGkgPSAxOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHN0YXQgdG1wc3RhdDsKKworCWlmIChhYyA+IGkgJiYgYXZbaV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbaSsrXVsxXSkgeworCQljYXNlICdvJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfbmV3OworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkgJiYgaXNhdHR5KDIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJZGVmY29uZmlnX2ZpbGUgPSBhdltpKytdOworCQkJaWYgKCFkZWZjb25maWdfZmlsZSkgeworCQkJCXByaW50ZihfKCIlczogTm8gZGVmYXVsdCBjb25maWcgZmlsZSBzcGVjaWZpZWRcbiIpLAorCQkJCQlhdlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfbm87CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X21vZDsKKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCWlucHV0X21vZGUgPSBzZXRfeWVzOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaW5wdXRfbW9kZSA9IHNldF9yYW5kb207CisJCQlzcmFuZG9tKHRpbWUoTlVMTCkpOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VlIFJFQURNRSBmb3IgdXNhZ2UgaW5mb1xuIik7CisJCQlleGl0KDApOworCQl9CisJfQorICAJbmFtZSA9IGF2W2ldOworCWlmICghbmFtZSkgeworCQlwcmludGYoXygiJXM6IEtjb25maWcgZmlsZSBtaXNzaW5nXG4iKSwgYXZbMF0pOworCQlleGl0KDEpOworCX0KKwljb25mX3BhcnNlKG5hbWUpOworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJaWYgKCFkZWZjb25maWdfZmlsZSkKKwkJCWRlZmNvbmZpZ19maWxlID0gY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSgpOworCQlpZiAoY29uZl9yZWFkKGRlZmNvbmZpZ19maWxlKSkgeworCQkJcHJpbnRmKCIqKipcbiIKKwkJCQkiKioqIENhbid0IGZpbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIFwiJXNcIiFcbiIKKwkJCQkiKioqXG4iLCBkZWZjb25maWdfZmlsZSk7CisJCQlleGl0KDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN0YXQoIi5jb25maWciLCAmdG1wc3RhdCkpIHsKKwkJCXByaW50ZihfKCIqKipcbiIKKwkJCQkiKioqIFlvdSBoYXZlIG5vdCB5ZXQgY29uZmlndXJlZCB5b3VyICJQUk9KRUNUX05BTUUiIVxuIgorCQkJCSIqKipcbiIKKwkJCQkiKioqIFBsZWFzZSBydW4gc29tZSBjb25maWd1cmF0b3IgKGUuZy4gXCJtYWtlIG9sZGNvbmZpZ1wiIG9yXG4iCisJCQkJIioqKiBcIm1ha2UgbWVudWNvbmZpZ1wiIG9yIFwibWFrZSB4Y29uZmlnXCIpLlxuIgorCQkJCSIqKipcbiIpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwljYXNlIGFza19hbGw6CisJY2FzZSBhc2tfbmV3OgorCQljb25mX3JlYWQoTlVMTCk7CisJCWJyZWFrOworCWNhc2Ugc2V0X25vOgorCWNhc2Ugc2V0X21vZDoKKwljYXNlIHNldF95ZXM6CisJY2FzZSBzZXRfcmFuZG9tOgorCQluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FMTENPTkZJRyIpOworCQlpZiAobmFtZSAmJiAhc3RhdChuYW1lLCAmdG1wc3RhdCkpIHsKKwkJCWNvbmZfcmVhZF9zaW1wbGUobmFtZSwgU19ERUZfVVNFUik7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBzZXRfbm86CSBuYW1lID0gImFsbG5vLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIHNldF9tb2Q6CSBuYW1lID0gImFsbG1vZC5jb25maWciOyBicmVhazsKKwkJY2FzZSBzZXRfeWVzOgkgbmFtZSA9ICJhbGx5ZXMuY29uZmlnIjsgYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbTogbmFtZSA9ICJhbGxyYW5kb20uY29uZmlnIjsgYnJlYWs7CisJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisJCWlmICghc3RhdChuYW1lLCAmdG1wc3RhdCkpCisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUsIFNfREVGX1VTRVIpOworCQllbHNlIGlmICghc3RhdCgiYWxsLmNvbmZpZyIsICZ0bXBzdGF0KSkKKwkJCWNvbmZfcmVhZF9zaW1wbGUoImFsbC5jb25maWciLCBTX0RFRl9VU0VSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGlucHV0X21vZGUgIT0gYXNrX3NpbGVudCkgeworCQlyb290RW50cnkgPSAmcm9vdG1lbnU7CisJCWNvbmYoJnJvb3RtZW51KTsKKwkJaWYgKGlucHV0X21vZGUgPT0gYXNrX2FsbCkgeworCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHN5bV9jaGFuZ2VfY291bnQpIHsKKwkJbmFtZSA9IGdldGVudigiS0NPTkZJR19OT1NJTEVOVFVQREFURSIpOworCQlpZiAobmFtZSAmJiAqbmFtZSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqICJQUk9KRUNUX05BTUUiIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgZXhwbGljaXQgdXBkYXRlLlxuXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZQorCQlnb3RvIHNraXBfY2hlY2s7CisKKwlkbyB7CisJCWNvbmZfY250ID0gMDsKKwkJY2hlY2tfY29uZigmcm9vdG1lbnUpOworCX0gd2hpbGUgKGNvbmZfY250KTsKKworCWlmICghY29uZl93cml0ZShOVUxMKSkgeworc2tpcF9jaGVjazoKKwkJaWYgKCEoaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50ICYmIGNvbmZfd3JpdGVfYXV0b2NvbmYoKSkpCisJCQlyZXR1cm4gMDsKKwl9CisJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIHdyaXRpbmcgIlBST0pFQ1RfTkFNRSIgY29uZmlndXJhdGlvbi5cblxuIikpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvY29uZmRhdGEuYyBiL3RveWJveC9rY29uZmlnL2NvbmZkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMWVkNQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZl93YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZfZmlsZW5hbWU7CitzdGF0aWMgaW50IGNvbmZfbGluZW5vLCBjb25mX3dhcm5pbmdzLCBjb25mX3Vuc2F2ZWQ7CisKKyNpZm5kZWYgY29uZl9kZWZuYW1lCitjb25zdCBjaGFyIGNvbmZfZGVmbmFtZVtdID0gImFyY2gvJEFSQ0gvZGVmY29uZmlnIjsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19QUkVGSVgKKyNkZWZpbmUgQ09ORklHX1BSRUZJWCAiQ09ORklHXyIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb25mX3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIGNvbmZfZmlsZW5hbWUsIGNvbmZfbGluZW5vKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQoYXApOworCWNvbmZfd2FybmluZ3MrKzsKK30KKworY29uc3QgY2hhciAqY29uZl9nZXRfY29uZmlnbmFtZSh2b2lkKQoreworCWNoYXIgKm5hbWUgPSBnZXRlbnYoIktDT05GSUdfQ09ORklHIik7CisKKwlyZXR1cm4gbmFtZSA/IG5hbWUgOiAiLmNvbmZpZyI7Cit9CisKK3N0YXRpYyBjaGFyICpjb25mX2V4cGFuZF92YWx1ZShjb25zdCBjaGFyICppbikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY29uc3QgY2hhciAqc3JjOworCXN0YXRpYyBjaGFyIHJlc192YWx1ZVtTWU1CT0xfTUFYTEVOR1RIXTsKKwljaGFyICpkc3QsIG5hbWVbU1lNQk9MX01BWExFTkdUSF07CisKKwlyZXNfdmFsdWVbMF0gPSAwOworCWRzdCA9IG5hbWU7CisJd2hpbGUgKChzcmMgPSBzdHJjaHIoaW4sICckJykpKSB7CisJCXN0cm5jYXQocmVzX3ZhbHVlLCBpbiwgc3JjIC0gaW4pOworCQlzcmMrKzsKKwkJZHN0ID0gbmFtZTsKKwkJd2hpbGUgKGlzYWxudW0oKnNyYykgfHwgKnNyYyA9PSAnXycpCisJCQkqZHN0KysgPSAqc3JjKys7CisJCSpkc3QgPSAwOworCQlzeW0gPSBzeW1fbG9va3VwKG5hbWUsIDApOworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQlzdHJjYXQocmVzX3ZhbHVlLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwkJaW4gPSBzcmM7CisJfQorCXN0cmNhdChyZXNfdmFsdWUsIGluKTsKKworCXJldHVybiByZXNfdmFsdWU7Cit9CisKK2NoYXIgKmNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJc3RhdGljIGNoYXIgZnVsbG5hbWVbUEFUSF9NQVgrMV07CisJY2hhciAqZW52LCAqbmFtZTsKKworCW5hbWUgPSBjb25mX2V4cGFuZF92YWx1ZShjb25mX2RlZm5hbWUpOworCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwlpZiAoZW52KSB7CisJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCWlmICghc3RhdChmdWxsbmFtZSwgJmJ1ZikpCisJCQlyZXR1cm4gZnVsbG5hbWU7CisJfQorCXJldHVybiBuYW1lOworfQorCitpbnQgY29uZl9yZWFkX3NpbXBsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQoreworCUZJTEUgKmluID0gTlVMTDsKKwljaGFyIGxpbmVbMTAyNF07CisJY2hhciAqcCwgKnAyOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaSwgZGVmX2ZsYWdzOworCisJaWYgKG5hbWUpIHsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwkJbmFtZSA9IGNvbmZfZ2V0X2NvbmZpZ25hbWUoKTsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwkJaWYgKGluKQorCQkJZ290byBsb2FkOworCQlzeW1fY2hhbmdlX2NvdW50Kys7CisJCWlmICghc3ltX2RlZmNvbmZpZ19saXN0KQorCQkJcmV0dXJuIDE7CisKKwkJZm9yX2FsbF9kZWZhdWx0cyhzeW1fZGVmY29uZmlnX2xpc3QsIHByb3ApIHsKKwkJCWlmIChleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKSA9PSBubyB8fAorCQkJICAgIHByb3AtPmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQkJY29udGludWU7CisJCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUocHJvcC0+ZXhwci0+bGVmdC5zeW0tPm5hbWUpOworCQkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwkJCWlmIChpbikgeworCQkJCXByaW50ZihfKCIjXG4iCisJCQkJCSAiIyB1c2luZyBkZWZhdWx0cyBmb3VuZCBpbiAlc1xuIgorCQkJCQkgIiNcbiIpLCBuYW1lKTsKKwkJCQlnb3RvIGxvYWQ7CisJCQl9CisJCX0KKwl9CisJaWYgKCFpbikKKwkJcmV0dXJuIDE7CisKK2xvYWQ6CisJY29uZl9maWxlbmFtZSA9IG5hbWU7CisJY29uZl9saW5lbm8gPSAwOworCWNvbmZfd2FybmluZ3MgPSAwOworCWNvbmZfdW5zYXZlZCA9IDA7CisKKwlkZWZfZmxhZ3MgPSBTWU1CT0xfREVGIDw8IGRlZjsKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIQU5HRUQ7CisJCXN5bS0+ZmxhZ3MgJj0gfihkZWZfZmxhZ3N8U1lNQk9MX1ZBTElEKTsKKwkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfSU5UOgorCQljYXNlIFNfSEVYOgorCQljYXNlIFNfU1RSSU5HOgorCQkJaWYgKHN5bS0+ZGVmW2RlZl0udmFsKQorCQkJCWZyZWUoc3ltLT5kZWZbZGVmXS52YWwpOworCQlkZWZhdWx0OgorCQkJc3ltLT5kZWZbZGVmXS52YWwgPSBOVUxMOworCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKKwkJfQorCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgeworCQljb25mX2xpbmVubysrOworCQlzeW0gPSBOVUxMOworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnIyc6CisJCQlpZiAobGluZVsxXSE9JyAnIHx8IG1lbWNtcChsaW5lICsgMiwgQ09ORklHX1BSRUZJWCwKKwkJCQkJICAgICAgIAlzdHJsZW4oQ09ORklHX1BSRUZJWCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwID0gc3RyY2hyKGxpbmUgKyAyICsgc3RybGVuKENPTkZJR19QUkVGSVgpLCAnICcpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9IDA7CisJCQlpZiAoc3RybmNtcChwLCAiaXMgbm90IHNldCIsIDEwKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZWYgPT0gU19ERUZfVVNFUikgeworCQkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyAyICsgc3RybGVuKENPTkZJR19QUkVGSVgpKTsKKwkJCQlpZiAoIXN5bSkgeworCQkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDIgKyBzdHJsZW4oQ09ORklHX1BSRUZJWCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN5bSA9IHN5bV9sb29rdXAobGluZSArIDksIDApOworCQkJCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKQorCQkJCQlzeW0tPnR5cGUgPSBTX0JPT0xFQU47CisJCQl9CisJCQlpZiAoc3ltLT5mbGFncyAmIGRlZl9mbGFncykgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKKwkJCQlzeW0tPmZsYWdzIHw9IGRlZl9mbGFnczsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0EnIC4uLiAnWic6CisJCQlpZiAobWVtY21wKGxpbmUsIENPTkZJR19QUkVGSVgsIHN0cmxlbihDT05GSUdfUFJFRklYKSkpIHsKKwkJCQljb25mX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGF0YSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcCA9IHN0cmNocihsaW5lICsgc3RybGVuKENPTkZJR19QUkVGSVgpLCAnPScpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9IDA7CisJCQlwMiA9IHN0cmNocihwLCAnXG4nKTsKKwkJCWlmIChwMikgeworCQkJCSpwMi0tID0gMDsKKwkJCQlpZiAoKnAyID09ICdccicpCisJCQkJCSpwMiA9IDA7CisJCQl9CisJCQlpZiAoZGVmID09IFNfREVGX1VTRVIpIHsKKwkJCQlzeW0gPSBzeW1fZmluZChsaW5lICsgc3RybGVuKENPTkZJR19QUkVGSVgpKTsKKwkJCQlpZiAoIXN5bSkgeworCQkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDcpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN5bSA9IHN5bV9sb29rdXAobGluZSArIHN0cmxlbihDT05GSUdfUFJFRklYKSwgMCk7CisJCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCisJCQkJCXN5bS0+dHlwZSA9IFNfT1RIRVI7CisJCQl9CisJCQlpZiAoc3ltLT5mbGFncyAmIGRlZl9mbGFncykgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChwWzBdID09ICdtJykgeworCQkJCQlzeW0tPmRlZltkZWZdLnRyaSA9IG1vZDsKKwkJCQkJc3ltLT5mbGFncyB8PSBkZWZfZmxhZ3M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgU19CT09MRUFOOgorCQkJCWlmIChwWzBdID09ICd5JykgeworCQkJCQlzeW0tPmRlZltkZWZdLnRyaSA9IHllczsKKwkJCQkJc3ltLT5mbGFncyB8PSBkZWZfZmxhZ3M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocFswXSA9PSAnbicpIHsKKwkJCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKKwkJCQkJc3ltLT5mbGFncyB8PSBkZWZfZmxhZ3M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19PVEhFUjoKKwkJCQlpZiAoKnAgIT0gJyInKSB7CisJCQkJCWZvciAocDIgPSBwOyAqcDIgJiYgIWlzc3BhY2UoKnAyKTsgcDIrKykKKwkJCQkJCTsKKwkJCQkJc3ltLT50eXBlID0gU19TVFJJTkc7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQljYXNlIFNfU1RSSU5HOgorCQkJCWlmICgqcCsrICE9ICciJykKKwkJCQkJYnJlYWs7CisJCQkJZm9yIChwMiA9IHA7IChwMiA9IHN0cnBicmsocDIsICJcIlxcIikpOyBwMisrKSB7CisJCQkJCWlmICgqcDIgPT0gJyInKSB7CisJCQkJCQkqcDIgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtbW92ZShwMiwgcDIgKyAxLCBzdHJsZW4ocDIpKTsKKwkJCQl9CisJCQkJaWYgKCFwMikgeworCQkJCQljb25mX3dhcm5pbmcoImludmFsaWQgc3RyaW5nIGZvdW5kIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJZG9uZToKKwkJCQlpZiAoc3ltX3N0cmluZ192YWxpZChzeW0sIHApKSB7CisJCQkJCXN5bS0+ZGVmW2RlZl0udmFsID0gc3RyZHVwKHApOworCQkJCQlzeW0tPmZsYWdzIHw9IGRlZl9mbGFnczsKKwkJCQl9IGVsc2UgeworCQkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbmZfd2FybmluZygidW5leHBlY3RlZCBkYXRhIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3ltICYmIHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJc3RydWN0IHN5bWJvbCAqY3MgPSBwcm9wX2dldF9zeW1ib2woc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pKTsKKwkJCXN3aXRjaCAoc3ltLT5kZWZbZGVmXS50cmkpIHsKKwkJCWNhc2Ugbm86CisJCQkJYnJlYWs7CisJCQljYXNlIG1vZDoKKwkJCQlpZiAoY3MtPmRlZltkZWZdLnRyaSA9PSB5ZXMpIHsKKwkJCQkJY29uZl93YXJuaW5nKCIlcyBjcmVhdGVzIGluY29uc2lzdGVudCBjaG9pY2Ugc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJCQljcy0+ZmxhZ3MgJj0gfmRlZl9mbGFnczsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIHllczoKKwkJCQlpZiAoY3MtPmRlZltkZWZdLnRyaSAhPSBubykgeworCQkJCQljb25mX3dhcm5pbmcoIiVzIGNyZWF0ZXMgaW5jb25zaXN0ZW50IGNob2ljZSBzdGF0ZSIsIHN5bS0+bmFtZSk7CisJCQkJCWNzLT5mbGFncyAmPSB+ZGVmX2ZsYWdzOworCQkJCX0gZWxzZQorCQkJCQljcy0+ZGVmW2RlZl0udmFsID0gc3ltOworCQkJCWJyZWFrOworCQkJfQorCQkJY3MtPmRlZltkZWZdLnRyaSA9IEVfT1IoY3MtPmRlZltkZWZdLnRyaSwgc3ltLT5kZWZbZGVmXS50cmkpOworCQl9CisJfQorCWZjbG9zZShpbik7CisKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbmZfcmVhZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisJaW50IGksIGZsYWdzOworCisJc3ltX2NoYW5nZV9jb3VudCA9IDA7CisKKwlpZiAoY29uZl9yZWFkX3NpbXBsZShuYW1lLCBTX0RFRl9VU0VSKSkKKwkJcmV0dXJuIDE7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgfHwgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQVVUTykpCisJCQlnb3RvIHN5bV9vazsKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSAmJiAoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpIHsKKwkJCS8qIGNoZWNrIHRoYXQgY2FsY3VsYXRlZCB2YWx1ZSBhZ3JlZXMgd2l0aCBzYXZlZCB2YWx1ZSAqLworCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChzeW0tPmRlZltTX0RFRl9VU0VSXS50cmkgIT0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCQkJZ290byBzeW1fb2s7CisJCQlkZWZhdWx0OgorCQkJCWlmICghc3RyY21wKHN5bS0+Y3Vyci52YWwsIHN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCkpCisJCQkJCWdvdG8gc3ltX29rOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKKwkJCS8qIG5vIHByZXZpb3VzIHZhbHVlIGFuZCBub3Qgc2F2ZWQgKi8KKwkJCWdvdG8gc3ltX29rOworCQljb25mX3Vuc2F2ZWQrKzsKKwkJLyogbWF5YmUgcHJpbnQgdmFsdWUgaW4gdmVyYm9zZSBtb2RlLi4uICovCisJc3ltX29rOgorCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pICYmICFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCisJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0RFRl9VU0VSOworCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQljYXNlIFNfSU5UOgorCQkJY2FzZSBTX0hFWDoKKwkJCQlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsKSkKKwkJCQkJc3ltLT5mbGFncyAmPSB+KFNZTUJPTF9WQUxJRHxTWU1CT0xfREVGX1VTRVIpOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmbGFncyA9IHN5bS0+ZmxhZ3M7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpCisJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQorCQkJCWZsYWdzICY9IGUtPnJpZ2h0LnN5bS0+ZmxhZ3M7CisJCXN5bS0+ZmxhZ3MgJj0gZmxhZ3MgfCB+U1lNQk9MX0RFRl9VU0VSOworCX0KKworCXN5bV9jaGFuZ2VfY291bnQgKz0gY29uZl93YXJuaW5ncyB8fCBjb25mX3Vuc2F2ZWQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1lbnUgKm5leHRfbWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlpZiAobWVudS0+bGlzdCkgcmV0dXJuIG1lbnUtPmxpc3Q7CisJZG8geworCQlpZiAobWVudS0+bmV4dCkgeworCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSk7CisKKwlyZXR1cm4gbWVudTsKK30KKworI2RlZmluZSBTWU1CT0xfRk9SQ0VXUklURSAoMTw8MzEpCisKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqb3V0OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwljb25zdCBjaGFyICpiYXNlbmFtZTsKKwljaGFyIGRpcm5hbWVbMTI4XSwgdG1wbmFtZVsxMjhdLCBuZXduYW1lWzEyOF07CisJaW50IHR5cGUsIGwsIHdyaXRldHlwZTsKKwljb25zdCBjaGFyICpzdHI7CisJdGltZV90IG5vdzsKKwlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CisJY2hhciAqZW52OworCisJZGlybmFtZVswXSA9IDA7CisJaWYgKG5hbWUgJiYgbmFtZVswXSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqc2xhc2g7CisKKwkJaWYgKCFzdGF0KG5hbWUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJc3RyY3B5KGRpcm5hbWUsIG5hbWUpOworCQkJc3RyY2F0KGRpcm5hbWUsICIvIik7CisJCQliYXNlbmFtZSA9IGNvbmZfZ2V0X2NvbmZpZ25hbWUoKTsKKwkJfSBlbHNlIGlmICgoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CisJCQlpbnQgc2l6ZSA9IHNsYXNoIC0gbmFtZSArIDE7CisJCQltZW1jcHkoZGlybmFtZSwgbmFtZSwgc2l6ZSk7CisJCQlkaXJuYW1lW3NpemVdID0gMDsKKwkJCWlmIChzbGFzaFsxXSkKKwkJCQliYXNlbmFtZSA9IHNsYXNoICsgMTsKKwkJCWVsc2UKKwkJCQliYXNlbmFtZSA9IGNvbmZfZ2V0X2NvbmZpZ25hbWUoKTsKKwkJfSBlbHNlCisJCQliYXNlbmFtZSA9IG5hbWU7CisJfSBlbHNlCisJCWJhc2VuYW1lID0gY29uZl9nZXRfY29uZmlnbmFtZSgpOworCisJc3ByaW50ZihuZXduYW1lLCAiJXMlcyIsIGRpcm5hbWUsIGJhc2VuYW1lKTsKKwllbnYgPSBnZXRlbnYoIktDT05GSUdfT1ZFUldSSVRFQ09ORklHIik7CisJaWYgKCFlbnYgfHwgISplbnYpIHsKKwkJc3ByaW50Zih0bXBuYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJCW91dCA9IGZvcGVuKHRtcG5hbWUsICJ3Iik7CisJfSBlbHNlIHsKKwkJKnRtcG5hbWUgPSAwOworCQlvdXQgPSBmb3BlbihuZXduYW1lLCAidyIpOworCX0KKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLQ09ORklHX1ZFUlNJT04iLCAwKTsKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXRpbWUoJm5vdyk7CisJZW52ID0gZ2V0ZW52KCJLQ09ORklHX05PVElNRVNUQU1QIik7CisJaWYgKGVudiAmJiAqZW52KQorCQl1c2VfdGltZXN0YW1wID0gMDsKKworCWZwcmludGYob3V0LCBfKCIjXG4iCisJCSAgICAgICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgorCQkgICAgICAgIiMgIlBST0pFQ1RfTkFNRSIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICIlcyVzIgorCQkgICAgICAgIiNcbiIpLAorCQkgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksCisJCSAgICAgdXNlX3RpbWVzdGFtcCA/ICIjICIgOiAiIiwKKwkJICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CisKKwlpZiAoIXN5bV9jaGFuZ2VfY291bnQpCisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCS8vIFdyaXRlIG91dCBhbGwgc3ltYm9scyAoZXZlbiBpbiBjbG9zZWQgc3ViLW1lbnVzKS4KKwlpZiAoMSkgeworCQlmb3IgKG1lbnUgPSByb290bWVudS5saXN0OyBtZW51OyBtZW51ID0gbmV4dF9tZW51KG1lbnUpKQorCQkJaWYgKG1lbnUtPnN5bSkgbWVudS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfRk9SQ0VXUklURTsKKwkJd3JpdGV0eXBlID0gU1lNQk9MX0ZPUkNFV1JJVEU7CisKKwkvLyBEb24ndCB3cml0ZSAgb3V0IHN5bWJvbHMgaW4gY2xvc2VkIG1lbnVzLgorCisJfSBlbHNlIHdyaXRldHlwZSA9IFNZTUJPTF9XUklURTsKKworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJc3ltID0gbWVudS0+c3ltOworCQlpZiAoIXN5bSkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCQkJZ290byBuZXh0OworCQkJc3RyID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJZnByaW50ZihvdXQsICJcbiIKKwkJCQkgICAgICIjXG4iCisJCQkJICAgICAiIyAlc1xuIgorCQkJCSAgICAgIiNcbiIsIHN0cik7CisJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSkpIHsKKwkJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCQlpZiAoIShzeW0tPmZsYWdzICYgd3JpdGV0eXBlKSkKKwkJCQlnb3RvIG5leHQ7CisJCQlzeW0tPmZsYWdzICY9IH53cml0ZXR5cGU7CisJCQl0eXBlID0gc3ltLT50eXBlOworCQkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQkJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwkJCQlpZiAobW9kdWxlc19zeW0tPmN1cnIudHJpID09IG5vKQorCQkJCQl0eXBlID0gU19CT09MRUFOOworCQkJfQorCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQkJCWNhc2Ugbm86CisJCQkJCWZwcmludGYob3V0LCAiIyAiQ09ORklHX1BSRUZJWCIlcyBpcyBub3Qgc2V0XG4iLCBzeW0tPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIG1vZDoKKwkJCQkJZnByaW50ZihvdXQsIENPTkZJR19QUkVGSVgiJXM9bVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSB5ZXM6CisJCQkJCWZwcmludGYob3V0LCBDT05GSUdfUFJFRklYIiVzPXlcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgQ09ORklHX1BSRUZJWCIlcz1cIiIsIHN5bS0+bmFtZSk7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJbCA9IHN0cmNzcG4oc3RyLCAiXCJcXCIpOworCQkJCQlpZiAobCkgeworCQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKKwkJCQkJCXN0ciArPSBsOworCQkJCQl9CisJCQkJCWlmICghKnN0cikKKwkJCQkJCWJyZWFrOworCQkJCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKyspOworCQkJCX0KKwkJCQlmcHV0cygiXCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfSEVYOgorCQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQkJaWYgKHN0clswXSAhPSAnMCcgfHwgKHN0clsxXSAhPSAneCcgJiYgc3RyWzFdICE9ICdYJykpIHsKKwkJCQkJZnByaW50ZihvdXQsIENPTkZJR19QUkVGSVgiJXM9JXNcbiIsIHN5bS0+bmFtZSwgKnN0ciA/IHN0ciA6ICIwIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgQ09ORklHX1BSRUZJWCIlcz0lc1xuIiwgc3ltLT5uYW1lLCAqc3RyID8gc3RyIDogIjAiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJbmV4dDoKKwkJaWYgKHdyaXRldHlwZSA9PSBTWU1CT0xfV1JJVEUpIHsKKwkJCWlmIChtZW51LT5saXN0KSB7CisJCQkJbWVudSA9IG1lbnUtPmxpc3Q7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobWVudS0+bmV4dCkKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJCWlmIChtZW51LT5uZXh0KSB7CisJCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJbWVudSA9IG5leHRfbWVudShtZW51KTsKKwl9CisJZmNsb3NlKG91dCk7CisKKwlpZiAoKnRtcG5hbWUpIHsKKwkJc3RyY2F0KGRpcm5hbWUsIGJhc2VuYW1lKTsKKwkJc3RyY2F0KGRpcm5hbWUsICIub2xkIik7CisJCXJlbmFtZShuZXduYW1lLCBkaXJuYW1lKTsKKwkJaWYgKHJlbmFtZSh0bXBuYW1lLCBuZXduYW1lKSkKKwkJCXJldHVybiAxOworCX0KKworCXByaW50ZihfKCIjXG4iCisJCSAiIyBjb25maWd1cmF0aW9uIHdyaXR0ZW4gdG8gJXNcbiIKKwkJICIjXG4iKSwgbmV3bmFtZSk7CisKKwlzeW1fY2hhbmdlX2NvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgY29uZl9zcGxpdF9jb25maWcodm9pZCkKK3sKKwljaGFyICpuYW1lLCBwYXRoWzEyOF07CisJY2hhciAqcywgKmQsIGM7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBzdGF0IHNiOworCWludCByZXMsIGksIGZkOworCisJbmFtZSA9IGdldGVudigiS0NPTkZJR19BVVRPQ09ORklHIik7CisJaWYgKCFuYW1lKQorCQluYW1lID0gImluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiI7CisJY29uZl9yZWFkX3NpbXBsZShuYW1lLCBTX0RFRl9BVVRPKTsKKworCWlmIChjaGRpcigiaW5jbHVkZS9jb25maWciKSkKKwkJcmV0dXJuIDE7CisKKwlyZXMgPSAwOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJaWYgKChzeW0tPmZsYWdzICYgU1lNQk9MX0FVVE8pIHx8ICFzeW0tPm5hbWUpCisJCQljb250aW51ZTsKKwkJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpIHsKKwkJCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0RFRl9BVVRPKSB7CisJCQkJLyoKKwkJCQkgKiBzeW1ib2wgaGFzIG9sZCBhbmQgbmV3IHZhbHVlLAorCQkJCSAqIHNvIGNvbXBhcmUgdGhlbS4uLgorCQkJCSAqLworCQkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCQlpZiAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pID09CisJCQkJCSAgICBzeW0tPmRlZltTX0RFRl9BVVRPXS50cmkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTX1NUUklORzoKKwkJCQljYXNlIFNfSEVYOgorCQkJCWNhc2UgU19JTlQ6CisJCQkJCWlmICghc3RyY21wKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksCisJCQkJCQkgICAgc3ltLT5kZWZbU19ERUZfQVVUT10udmFsKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSWYgdGhlcmUgaXMgbm8gb2xkIHZhbHVlLCBvbmx5ICdubycgKHVuc2V0KQorCQkJCSAqIGlzIGFsbG93ZWQgYXMgbmV3IHZhbHVlLgorCQkJCSAqLworCQkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCQlpZiAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pID09IG5vKQorCQkJCQkJY29udGludWU7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfREVGX0FVVE8pKQorCQkJLyogVGhlcmUgaXMgbmVpdGhlciBhbiBvbGQgbm9yIGEgbmV3IHZhbHVlLiAqLworCQkJY29udGludWU7CisJCS8qIGVsc2UKKwkJICoJVGhlcmUgaXMgYW4gb2xkIHZhbHVlLCBidXQgbm8gbmV3IHZhbHVlICgnbm8nICh1bnNldCkKKwkJICoJaXNuJ3Qgc2F2ZWQgaW4gYXV0by5jb25mLCBzbyB0aGUgb2xkIHZhbHVlIGlzIGFsd2F5cworCQkgKglkaWZmZXJlbnQgZnJvbSAnbm8nKS4KKwkJICovCisKKwkJLyogUmVwbGFjZSBhbGwgJ18nIGFuZCBhcHBlbmQgIi5oIiAqLworCQlzID0gc3ltLT5uYW1lOworCQlkID0gcGF0aDsKKwkJd2hpbGUgKChjID0gKnMrKykpIHsKKwkJCWMgPSB0b2xvd2VyKGMpOworCQkJKmQrKyA9IChjID09ICdfJykgPyAnLycgOiBjOworCQl9CisJCXN0cmNweShkLCAiLmgiKTsKKworCQkvKiBBc3N1bWUgZGlyZWN0b3J5IHBhdGggYWxyZWFkeSBleGlzdHMuICovCisJCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKKwkJaWYgKGZkID09IC0xKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJcmVzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBDcmVhdGUgZGlyZWN0b3J5IGNvbXBvbmVudHMsCisJCQkgKiB1bmxlc3MgdGhleSBleGlzdCBhbHJlYWR5LgorCQkJICovCisJCQlkID0gcGF0aDsKKwkJCXdoaWxlICgoZCA9IHN0cmNocihkLCAnLycpKSkgeworCQkJCSpkID0gMDsKKwkJCQlpZiAoc3RhdChwYXRoLCAmc2IpICYmIG1rZGlyKHBhdGgsIDA3NTUpKSB7CisJCQkJCXJlcyA9IDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkqZCsrID0gJy8nOworCQkJfQorCQkJLyogVHJ5IGl0IGFnYWluLiAqLworCQkJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworCQkJaWYgKGZkID09IC0xKSB7CisJCQkJcmVzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljbG9zZShmZCk7CisJfQorb3V0OgorCWlmIChjaGRpcigiLi4vLi4iKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gcmVzOworfQorCitpbnQgY29uZl93cml0ZV9hdXRvY29uZih2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwljb25zdCBjaGFyICpzdHI7CisJY2hhciAqbmFtZTsKKwlGSUxFICpvdXQsICpvdXRfaDsKKwl0aW1lX3Qgbm93OworCWludCBpLCBsOworCisJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCisJZmlsZV93cml0ZV9kZXAoImluY2x1ZGUvY29uZmlnL2F1dG8uY29uZi5jbWQiKTsKKworCWlmIChjb25mX3NwbGl0X2NvbmZpZygpKQorCQlyZXR1cm4gMTsKKworCW91dCA9IGZvcGVuKCIudG1wY29uZmlnIiwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisKKwlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOworCWlmICghb3V0X2gpIHsKKwkJZmNsb3NlKG91dCk7CisJCXJldHVybiAxOworCX0KKworCXN5bSA9IHN5bV9sb29rdXAoIktDT05GSUdfVkVSU0lPTiIsIDApOworCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJdGltZSgmbm93KTsKKwlmcHJpbnRmKG91dCwgIiNcbiIKKwkJICAgICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgorCQkgICAgICIjICJQUk9KRUNUX05BTUUiIHZlcnNpb246ICVzXG4iCisJCSAgICAgIiMgJXMiCisJCSAgICAgIiNcbiIsCisJCSAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwgY3RpbWUoJm5vdykpOworCWZwcmludGYob3V0X2gsICIvKlxuIgorCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgICAiICogIlBST0pFQ1RfTkFNRSIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICIgKiAlcyIKKwkJICAgICAgICIgKi9cbiIKKwkJICAgICAgIC8vICIjZGVmaW5lIEFVVE9DT05GX0lOQ0xVREVEXG4iCisJCSAgICAgICAsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIGN0aW1lKCZub3cpKTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkgfHwgIXN5bS0+bmFtZSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfQk9PTEVBTjoKKwkJY2FzZSBTX1RSSVNUQVRFOgorCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJCWNhc2Ugbm86CisJCQkJYnJlYWs7CisJCQljYXNlIG1vZDoKKwkJCQlmcHJpbnRmKG91dCwgQ09ORklHX1BSRUZJWCIlcz1tXG4iLCBzeW0tPm5hbWUpOworCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lc19NT0RVTEUgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgeWVzOgorCQkJCWZwcmludGYob3V0LCBDT05GSUdfUFJFRklYIiVzPXlcbiIsIHN5bS0+bmFtZSk7CisJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgIkNPTkZJR19QUkVGSVgiJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNfU1RSSU5HOgorCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCWZwcmludGYob3V0LCBDT05GSUdfUFJFRklYIiVzPVwiIiwgc3ltLT5uYW1lKTsKKwkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lICJDT05GSUdfUFJFRklYIiVzIFwiIiwgc3ltLT5uYW1lKTsKKwkJCXdoaWxlICgxKSB7CisJCQkJbCA9IHN0cmNzcG4oc3RyLCAiXCJcXCIpOworCQkJCWlmIChsKSB7CisJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dCk7CisJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dF9oKTsKKwkJCQkJc3RyICs9IGw7CisJCQkJfQorCQkJCWlmICghKnN0cikKKwkJCQkJYnJlYWs7CisJCQkJZnByaW50ZihvdXQsICJcXCVjIiwgKnN0cik7CisJCQkJZnByaW50ZihvdXRfaCwgIlxcJWMiLCAqc3RyKTsKKwkJCQlzdHIrKzsKKwkJCX0KKwkJCWZwdXRzKCJcIlxuIiwgb3V0KTsKKwkJCWZwdXRzKCJcIlxuIiwgb3V0X2gpOworCQkJYnJlYWs7CisJCWNhc2UgU19IRVg6CisJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJaWYgKHN0clswXSAhPSAnMCcgfHwgKHN0clsxXSAhPSAneCcgJiYgc3RyWzFdICE9ICdYJykpIHsKKwkJCQlmcHJpbnRmKG91dCwgQ09ORklHX1BSRUZJWCIlcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lICJDT05GSUdfUFJFRklYIiVzIDB4JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBTX0lOVDoKKwkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQlmcHJpbnRmKG91dCwgQ09ORklHX1BSRUZJWCIlcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgIkNPTkZJR19QUkVGSVgiJXMgJXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKG91dCk7CisJZmNsb3NlKG91dF9oKTsKKworCW5hbWUgPSBnZXRlbnYoIktDT05GSUdfQVVUT0hFQURFUiIpOworCWlmICghbmFtZSkKKwkJbmFtZSA9ICJpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgiOworCWlmIChyZW5hbWUoIi50bXBjb25maWcuaCIsIG5hbWUpKQorCQlyZXR1cm4gMTsKKwluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FVVE9DT05GSUciKTsKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSAiaW5jbHVkZS9jb25maWcvYXV0by5jb25mIjsKKwkvKgorCSAqIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzdGVwLCBrYnVpbGQgaGFzIGEgZGVwZW5kZW5jeSBvbiBhdXRvLmNvbmYKKwkgKiBhbmQgdGhpcyBtYXJrcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBwcmV2aW91cyBzdGVwcy4KKwkgKi8KKwlpZiAocmVuYW1lKCIudG1wY29uZmlnIiwgbmFtZSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9leHByLmMgYi90b3lib3gva2NvbmZpZy9leHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5OGRiZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL2V4cHIuYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBERUJVR19FWFBSCTAKKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+dHlwZSA9IEVfU1lNQk9MOworCWUtPmxlZnQuc3ltID0gc3ltOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vbmUoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmNlKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LmV4cHIgPSBjZTsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfdHdvKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LmV4cHIgPSBlMTsKKwllLT5yaWdodC5leHByID0gZTI7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2NvbXAoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqczEsIHN0cnVjdCBzeW1ib2wgKnMyKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gdHlwZTsKKwllLT5sZWZ0LnN5bSA9IHMxOworCWUtPnJpZ2h0LnN5bSA9IHMyOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaWYgKCFlMSkKKwkJcmV0dXJuIGUyOworCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpIDogZTE7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWlmICghZTEpCisJCXJldHVybiBlMjsKKwlyZXR1cm4gZTIgPyBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpIDogZTE7Cit9CisKK3N0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZykKK3sKKwlzdHJ1Y3QgZXhwciAqZTsKKworCWlmICghb3JnKQorCQlyZXR1cm4gTlVMTDsKKworCWUgPSBtYWxsb2Moc2l6ZW9mKCpvcmcpKTsKKwltZW1jcHkoZSwgb3JnLCBzaXplb2YoKm9yZykpOworCXN3aXRjaCAob3JnLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJZS0+bGVmdCA9IG9yZy0+bGVmdDsKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl9jb3B5KG9yZy0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQllLT5sZWZ0LnN5bSA9IG9yZy0+bGVmdC5zeW07CisJCWUtPnJpZ2h0LnN5bSA9IG9yZy0+cmlnaHQuc3ltOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwljYXNlIEVfQ0hPSUNFOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2NvcHkob3JnLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9jb3B5KG9yZy0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiY2FuJ3QgY29weSB0eXBlICVkXG4iLCBlLT50eXBlKTsKKwkJZnJlZShlKTsKKwkJZSA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlOworfQorCit2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybjsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQlyZXR1cm47CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlicmVhazsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJob3cgdG8gZnJlZSB0eXBlICVkP1xuIiwgZS0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlmcmVlKGUpOworfQorCitzdGF0aWMgaW50IHRyYW5zX2NvdW50OworCisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKworc3RhdGljIHZvaWQgX19leHByX2VsaW1pbmF0ZV9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJX19leHByX2VsaW1pbmF0ZV9lcSh0eXBlLCAmZTEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MICYmCisJICAgIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0gJiYKKwkgICAgKGUxLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcyB8fCBlMS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykpCisJCXJldHVybjsKKwlpZiAoIWV4cHJfZXEoZTEsIGUyKSkKKwkJcmV0dXJuOworCXRyYW5zX2NvdW50Kys7CisJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KK30KKwordm9pZCBleHByX2VsaW1pbmF0ZV9lcShzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJaWYgKCFlMSB8fCAhZTIpCisJCXJldHVybjsKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCV9fZXhwcl9lbGltaW5hdGVfZXEoZTEtPnR5cGUsIGVwMSwgZXAyKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCWlmIChlMS0+dHlwZSAhPSBlMi0+dHlwZSkgc3dpdGNoIChlMi0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlfX2V4cHJfZWxpbWluYXRlX2VxKGUyLT50eXBlLCBlcDEsIGVwMik7CisJZGVmYXVsdDoKKwkJOworCX0KKwllMSA9IGV4cHJfZWxpbWluYXRlX3luKGUxKTsKKwllMiA9IGV4cHJfZWxpbWluYXRlX3luKGUyKTsKK30KKworI3VuZGVmIGUxCisjdW5kZWYgZTIKKworaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaW50IHJlcywgb2xkX2NvdW50OworCisJaWYgKGUxLT50eXBlICE9IGUyLT50eXBlKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlyZXR1cm4gZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiBlMS0+cmlnaHQuc3ltID09IGUyLT5yaWdodC5zeW07CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW07CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfZXEoZTEtPmxlZnQuZXhwciwgZTItPmxlZnQuZXhwcik7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl9jb3B5KGUxKTsKKwkJZTIgPSBleHByX2NvcHkoZTIpOworCQlvbGRfY291bnQgPSB0cmFuc19jb3VudDsKKwkJZXhwcl9lbGltaW5hdGVfZXEoJmUxLCAmZTIpOworCQlyZXMgPSAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKKwkJICAgICAgIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0pOworCQlleHByX2ZyZWUoZTEpOworCQlleHByX2ZyZWUoZTIpOworCQl0cmFuc19jb3VudCA9IG9sZF9jb3VudDsKKwkJcmV0dXJuIHJlczsKKwljYXNlIEVfQ0hPSUNFOgorCWNhc2UgRV9SQU5HRToKKwljYXNlIEVfTk9ORToKKwkJLyogcGFuaWMgKi87CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiID0gIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIiA/XG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoZSkgc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPnJpZ2h0LmV4cHIpOworCQlpZiAoZS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJdG1wID0gZS0+cmlnaHQuZXhwcjsKKwkJCQkqZSA9ICooZS0+cmlnaHQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWlmIChlLT5yaWdodC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCSplID0gKihlLT5sZWZ0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEVfT1I6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5yaWdodC5leHByKTsKKwkJaWYgKGUtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQl0bXAgPSBlLT5yaWdodC5leHByOworCQkJCSplID0gKihlLT5yaWdodC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJaWYgKGUtPnJpZ2h0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJKmUgPSAqKGUtPmxlZnQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCisvKgorICogYm9vbCBGT08hPW4gPT4gRk9PCisgKi8KK3N0cnVjdCBleHByICpleHByX3RyYW5zX2Jvb2woc3RydWN0IGV4cHIgKmUpCit7CisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwljYXNlIEVfTk9UOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX3RyYW5zX2Jvb2woZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfdHJhbnNfYm9vbChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCS8vIEZPTyE9biAtPiBGT08KKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBlMSB8fCBlMiAtPiA/CisgKi8KK3N0cnVjdCBleHByICpleHByX2pvaW5fb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0xLCAqc3ltMjsKKworCWlmIChleHByX2VxKGUxLCBlMikpCisJCXJldHVybiBleHByX2NvcHkoZTEpOworCWlmIChlMS0+dHlwZSAhPSBFX0VRVUFMICYmIGUxLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMS0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUyLT50eXBlICE9IEVfRVFVQUwgJiYgZTItPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUyLT50eXBlICE9IEVfU1lNQk9MICYmIGUyLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTEtPnR5cGUgPT0gRV9OT1QpIHsKKwkJdG1wID0gZTEtPmxlZnQuZXhwcjsKKwkJaWYgKHRtcC0+dHlwZSAhPSBFX0VRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1VORVFVQUwgJiYgdG1wLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTEgPSB0bXAtPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0xID0gZTEtPmxlZnQuc3ltOworCWlmIChlMi0+dHlwZSA9PSBFX05PVCkgeworCQlpZiAoZTItPmxlZnQuZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0yID0gZTItPmxlZnQuZXhwci0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTIgPSBlMi0+bGVmdC5zeW07CisJaWYgKHN5bTEgIT0gc3ltMikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTEtPnR5cGUgIT0gU19UUklTVEFURSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpIHsKKwkJCS8vIChhPSd5JykgfHwgKGE9J20nKSAtPiAoYSE9J24nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHN5bTEsICZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYKKwkJICAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpIHsKKwkJCS8vIChhPSd5JykgfHwgKGE9J24nKSAtPiAoYSE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHN5bTEsICZzeW1ib2xfbW9kKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkpKSB7CisJCQkvLyAoYT0nbScpIHx8IChhPSduJykgLT4gKGEhPSd5JykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisJCX0KKwl9CisJaWYgKHN5bTEtPnR5cGUgPT0gU19CT09MRUFOICYmIHN5bTEgPT0gc3ltMikgeworCQlpZiAoKGUxLT50eXBlID09IEVfTk9UICYmIGUxLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9OT1QgJiYgZTItPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1NZTUJPTCkpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCXByaW50Zigib3B0aW1pemUgKCIpOworCQlleHByX2ZwcmludChlMSwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpIHx8ICgiKTsKKwkJZXhwcl9mcHJpbnQoZTIsIHN0ZG91dCk7CisJCXByaW50ZigiKT9cbiIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfam9pbl9hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0xLCAqc3ltMjsKKworCWlmIChleHByX2VxKGUxLCBlMikpCisJCXJldHVybiBleHByX2NvcHkoZTEpOworCWlmIChlMS0+dHlwZSAhPSBFX0VRVUFMICYmIGUxLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMS0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUyLT50eXBlICE9IEVfRVFVQUwgJiYgZTItPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUyLT50eXBlICE9IEVfU1lNQk9MICYmIGUyLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTEtPnR5cGUgPT0gRV9OT1QpIHsKKwkJdG1wID0gZTEtPmxlZnQuZXhwcjsKKwkJaWYgKHRtcC0+dHlwZSAhPSBFX0VRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1VORVFVQUwgJiYgdG1wLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTEgPSB0bXAtPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0xID0gZTEtPmxlZnQuc3ltOworCWlmIChlMi0+dHlwZSA9PSBFX05PVCkgeworCQlpZiAoZTItPmxlZnQuZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0yID0gZTItPmxlZnQuZXhwci0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTIgPSBlMi0+bGVmdC5zeW07CisJaWYgKHN5bTEgIT0gc3ltMikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTEtPnR5cGUgIT0gU19UUklTVEFURSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpCisJCS8vIChhKSAmJiAoYT0neScpIC0+IChhPSd5JykKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSkKKwkJLy8gKGEpICYmIChhIT0nbicpIC0+IChhKQorCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woc3ltMSk7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKQorCQkvLyAoYSkgJiYgKGEhPSdtJykgLT4gKGE9J3knKQorCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCWlmIChzeW0xLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMKSB7CisJCQkvLyAoYT0nYicpICYmIChhIT0nYycpIC0+ICdiJz0nYycgPyAnbicgOiBhPSdiJworCQkJc3ltMiA9IGUxLT5yaWdodC5zeW07CisJCQlpZiAoKGUyLT5yaWdodC5zeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUKSAmJiAoc3ltMi0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKQorCQkJCXJldHVybiBzeW0yICE9IGUyLT5yaWdodC5zeW0gPyBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgc3ltMikKKwkJCQkJCQkgICAgIDogZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMKSB7CisJCQkvLyAoYT0nYicpICYmIChhIT0nYycpIC0+ICdiJz0nYycgPyAnbicgOiBhPSdiJworCQkJc3ltMiA9IGUyLT5yaWdodC5zeW07CisJCQlpZiAoKGUxLT5yaWdodC5zeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUKSAmJiAoc3ltMi0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKQorCQkJCXJldHVybiBzeW0yICE9IGUxLT5yaWdodC5zeW0gPyBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgc3ltMikKKwkJCQkJCQkgICAgIDogZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpCisJCQkvLyAoYSE9J3knKSAmJiAoYSE9J24nKSAtPiAoYT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfbW9kKTsKKworCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJgorCQkJICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKQorCQkJLy8gKGEhPSd5JykgJiYgKGEhPSdtJykgLT4gKGE9J24nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX25vKTsKKworCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJgorCQkJICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJCSAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKSkKKwkJCS8vIChhIT0nbScpICYmIChhIT0nbicpIC0+IChhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJCWlmICgoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgIChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlwcmludGYoIm9wdGltaXplICgiKTsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiKSAmJiAoIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIik/XG4iKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfZWxpbWluYXRlX2R1cHMxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLT5yaWdodC5leHByLCAmZTIpOworCQlyZXR1cm47CisJfQorCWlmIChlMi0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGUxID09IGUyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOiBjYXNlIEVfQU5EOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMShlMS0+dHlwZSwgJmUxLCAmZTEpOworCWRlZmF1bHQ6CisJCTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVfT1I6CisJCXRtcCA9IGV4cHJfam9pbl9vcihlMSwgZTIpOworCQlpZiAodG1wKSB7CisJCQlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCWUyID0gdG1wOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQl0bXAgPSBleHByX2pvaW5fYW5kKGUxLCBlMik7CisJCWlmICh0bXApIHsKKwkJCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCWUyID0gdG1wOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RhdGljIHZvaWQgZXhwcl9lbGltaW5hdGVfZHVwczIoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJc3RydWN0IGV4cHIgKnRtcCwgKnRtcDEsICp0bXAyOworCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCX0KKwlpZiAoZTEgPT0gZTIpCisJCXJldHVybjsKKworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUxLT50eXBlLCAmZTEsICZlMSk7CisJCS8vIChGT08gfHwgQkFSKSAmJiAoIUZPTyAmJiAhQkFSKSAtPiBuCisJCXRtcDEgPSBleHByX3RyYW5zZm9ybShleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUxKSkpOworCQl0bXAyID0gZXhwcl9jb3B5KGUyKTsKKwkJdG1wID0gZXhwcl9leHRyYWN0X2VxX2FuZCgmdG1wMSwgJnRtcDIpOworCQlpZiAoZXhwcl9pc195ZXModG1wMSkpIHsKKwkJCWV4cHJfZnJlZShlMSk7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlleHByX2ZyZWUodG1wMik7CisJCWV4cHJfZnJlZSh0bXAxKTsKKwkJZXhwcl9mcmVlKHRtcCk7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUxLT50eXBlLCAmZTEsICZlMSk7CisJCS8vIChGT08gJiYgQkFSKSB8fCAoIUZPTyB8fCAhQkFSKSAtPiB5CisJCXRtcDEgPSBleHByX3RyYW5zZm9ybShleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUxKSkpOworCQl0bXAyID0gZXhwcl9jb3B5KGUyKTsKKwkJdG1wID0gZXhwcl9leHRyYWN0X2VxX29yKCZ0bXAxLCAmdG1wMik7CisJCWlmIChleHByX2lzX25vKHRtcDEpKSB7CisJCQlleHByX2ZyZWUoZTEpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQl0cmFuc19jb3VudCsrOworCQl9CisJCWV4cHJfZnJlZSh0bXAyKTsKKwkJZXhwcl9mcmVlKHRtcDEpOworCQlleHByX2ZyZWUodG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV9kdXBzKHN0cnVjdCBleHByICplKQoreworCWludCBvbGRjb3VudDsKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJb2xkY291bnQgPSB0cmFuc19jb3VudDsKKwl3aGlsZSAoMSkgeworCQl0cmFuc19jb3VudCA9IDA7CisJCXN3aXRjaCAoZS0+dHlwZSkgeworCQljYXNlIEVfT1I6IGNhc2UgRV9BTkQ6CisJCQlleHByX2VsaW1pbmF0ZV9kdXBzMShlLT50eXBlLCAmZSwgJmUpOworCQkJZXhwcl9lbGltaW5hdGVfZHVwczIoZS0+dHlwZSwgJmUsICZlKTsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCQlpZiAoIXRyYW5zX2NvdW50KQorCQkJYnJlYWs7CisJCWUgPSBleHByX2VsaW1pbmF0ZV95bihlKTsKKwl9CisJdHJhbnNfY291bnQgPSBvbGRjb3VudDsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNmb3JtKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwljYXNlIEVfU1lNQk9MOgorCWNhc2UgRV9DSE9JQ0U6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfdHJhbnNmb3JtKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX3RyYW5zZm9ybShlLT5yaWdodC5leHByKTsKKwl9CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSAhPSBTX0JPT0xFQU4pCisJCQlicmVhazsKKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQllLT50eXBlID0gRV9OT1Q7CisJCQllLT5sZWZ0LmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChlLT5sZWZ0LnN5bSk7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgeworCQkJcHJpbnRmKCJib29sZWFuIHN5bWJvbCAlcyB0ZXN0ZWQgZm9yICdtJz8gdGVzdCBmb3JjZWQgdG8gJ24nXG4iLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgIT0gU19CT09MRUFOKQorCQkJYnJlYWs7CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCXByaW50ZigiYm9vbGVhbiBzeW1ib2wgJXMgdGVzdGVkIGZvciAnbSc/IHRlc3QgZm9yY2VkIHRvICd5J1xuIiwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQllLT50eXBlID0gRV9OT1Q7CisJCQllLT5sZWZ0LmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChlLT5sZWZ0LnN5bSk7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJc3dpdGNoIChlLT5sZWZ0LmV4cHItPnR5cGUpIHsKKwkJY2FzZSBFX05PVDoKKwkJCS8vICEhYSAtPiBhCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHItPmxlZnQuZXhwcjsKKwkJCWZyZWUoZS0+bGVmdC5leHByKTsKKwkJCWZyZWUoZSk7CisJCQllID0gdG1wOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9FUVVBTDoKKwkJY2FzZSBFX1VORVFVQUw6CisJCQkvLyAhYT0neCcgLT4gYSE9J3gnCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQlmcmVlKGUpOworCQkJZSA9IHRtcDsKKwkJCWUtPnR5cGUgPSBlLT50eXBlID09IEVfRVFVQUwgPyBFX1VORVFVQUwgOiBFX0VRVUFMOworCQkJYnJlYWs7CisJCWNhc2UgRV9PUjoKKwkJCS8vICEoYSB8fCBiKSAtPiAhYSAmJiAhYgorCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZS0+dHlwZSA9IEVfQU5EOworCQkJZS0+cmlnaHQuZXhwciA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCB0bXAtPnJpZ2h0LmV4cHIpOworCQkJdG1wLT50eXBlID0gRV9OT1Q7CisJCQl0bXAtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9BTkQ6CisJCQkvLyAhKGEgJiYgYikgLT4gIWEgfHwgIWIKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWUtPnR5cGUgPSBFX09SOworCQkJZS0+cmlnaHQuZXhwciA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCB0bXAtPnJpZ2h0LmV4cHIpOworCQkJdG1wLT50eXBlID0gRV9OT1Q7CisJCQl0bXAtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9TWU1CT0w6CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCS8vICEneScgLT4gJ24nCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCQkvLyAhJ20nIC0+ICdtJworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9tb2Q7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJLy8gISduJyAtPiAneScKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworaW50IGV4cHJfY29udGFpbnNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlpZiAoIWRlcCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRlcC0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCQlyZXR1cm4gZXhwcl9jb250YWluc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSkgfHwKKwkJICAgICAgIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+cmlnaHQuZXhwciwgc3ltKTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZGVwLT5sZWZ0LnN5bSA9PSBzeW07CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlyZXR1cm4gZGVwLT5sZWZ0LnN5bSA9PSBzeW0gfHwKKwkJICAgICAgIGRlcC0+cmlnaHQuc3ltID09IHN5bTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl9jb250YWluc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSk7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gMDsKK30KKworYm9vbCBleHByX2RlcGVuZHNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlpZiAoIWRlcCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChkZXAtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCQlyZXR1cm4gZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAtPmxlZnQuZXhwciwgc3ltKSB8fAorCQkgICAgICAgZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAtPnJpZ2h0LmV4cHIsIHN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltOworCWNhc2UgRV9FUVVBTDoKKwkJaWYgKGRlcC0+bGVmdC5zeW0gPT0gc3ltKSB7CisJCQlpZiAoZGVwLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgfHwgZGVwLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWlmIChkZXAtPmxlZnQuc3ltID09IHN5bSkgeworCQkJaWYgKGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyAJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJc3RydWN0IGV4cHIgKnRtcCA9IE5VTEw7CisJZXhwcl9leHRyYWN0X2VxKEVfQU5ELCAmdG1wLCBlcDEsIGVwMik7CisJaWYgKHRtcCkgeworCQkqZXAxID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMSk7CisJCSplcDIgPSBleHByX2VsaW1pbmF0ZV95bigqZXAyKTsKKwl9CisJcmV0dXJuIHRtcDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJc3RydWN0IGV4cHIgKnRtcCA9IE5VTEw7CisJZXhwcl9leHRyYWN0X2VxKEVfT1IsICZ0bXAsIGVwMSwgZXAyKTsKKwlpZiAodG1wKSB7CisJCSplcDEgPSBleHByX2VsaW1pbmF0ZV95bigqZXAxKTsKKwkJKmVwMiA9IGV4cHJfZWxpbWluYXRlX3luKCplcDIpOworCX0KKwlyZXR1cm4gdG1wOworfQorCit2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsIGVwMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsIGVwMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZXhwcl9lcShlMSwgZTIpKSB7CisJCSplcCA9ICplcCA/IGV4cHJfYWxsb2NfdHdvKHR5cGUsICplcCwgZTEpIDogZTE7CisJCWV4cHJfZnJlZShlMik7CisJCWlmICh0eXBlID09IEVfQU5EKSB7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gRV9PUikgeworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19jb21wYXJlKHN0cnVjdCBleHByICplLCBlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IGV4cHIgKmUxLCAqZTI7CisKKwlpZiAoIWUpIHsKKwkJZSA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSk7CisJCWlmICh0eXBlID09IEVfVU5FUVVBTCkKKwkJCWUgPSBleHByX2FsbG9jX29uZShFX05PVCwgZSk7CisJCXJldHVybiBlOworCX0KKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCQllMSA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWUyID0gZXhwcl90cmFuc19jb21wYXJlKGUtPnJpZ2h0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQllID0gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMik7CisJCWlmIChzeW0gPT0gJnN5bWJvbF9ubykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJZTIgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+cmlnaHQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpOworCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQllID0gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMik7CisJCWlmICh0eXBlID09IEVfVU5FUVVBTCkKKwkJCWUgPSBleHByX2FsbG9jX29uZShFX05PVCwgZSk7CisJCXJldHVybiBlOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCB0eXBlID09IEVfRVFVQUwgPyBFX1VORVFVQUwgOiBFX0VRVUFMLCBzeW0pOworCWNhc2UgRV9VTkVRVUFMOgorCWNhc2UgRV9FUVVBTDoKKwkJaWYgKHR5cGUgPT0gRV9FUVVBTCkgeworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCQlyZXR1cm4gZXhwcl9jb3B5KGUpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZSkpOworCQl9IGVsc2UgeworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlKSk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIGV4cHJfY29weShlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKHR5cGUsIGUtPmxlZnQuc3ltLCBzeW0pOworCWNhc2UgRV9DSE9JQ0U6CisJY2FzZSBFX1JBTkdFOgorCWNhc2UgRV9OT05FOgorCQkvKiBwYW5pYyAqLzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3RyaXN0YXRlIGV4cHJfY2FsY192YWx1ZShzdHJ1Y3QgZXhwciAqZSkKK3sKKwl0cmlzdGF0ZSB2YWwxLCB2YWwyOworCWNvbnN0IGNoYXIgKnN0cjEsICpzdHIyOworCisJaWYgKCFlKQorCQlyZXR1cm4geWVzOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJc3ltX2NhbGNfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlyZXR1cm4gZS0+bGVmdC5zeW0tPmN1cnIudHJpOworCWNhc2UgRV9BTkQ6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJdmFsMiA9IGV4cHJfY2FsY192YWx1ZShlLT5yaWdodC5leHByKTsKKwkJcmV0dXJuIEVfQU5EKHZhbDEsIHZhbDIpOworCWNhc2UgRV9PUjoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQl2YWwyID0gZXhwcl9jYWxjX3ZhbHVlKGUtPnJpZ2h0LmV4cHIpOworCQlyZXR1cm4gRV9PUih2YWwxLCB2YWwyKTsKKwljYXNlIEVfTk9UOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXJldHVybiBFX05PVCh2YWwxKTsKKwljYXNlIEVfRVFVQUw6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3ltX2NhbGNfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJc3RyMSA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3RyMiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXJldHVybiAhc3RyY21wKHN0cjEsIHN0cjIpID8geWVzIDogbm87CisJY2FzZSBFX1VORVFVQUw6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3ltX2NhbGNfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJc3RyMSA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3RyMiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXJldHVybiAhc3RyY21wKHN0cjEsIHN0cjIpID8gbm8gOiB5ZXM7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJleHByX2NhbGNfdmFsdWU6ICVkP1xuIiwgZS0+dHlwZSk7CisJCXJldHVybiBubzsKKwl9Cit9CisKK2ludCBleHByX2NvbXBhcmVfdHlwZShlbnVtIGV4cHJfdHlwZSB0MSwgZW51bSBleHByX3R5cGUgdDIpCit7CisjaWYgMAorCXJldHVybiAxOworI2Vsc2UKKwlpZiAodDEgPT0gdDIpCisJCXJldHVybiAwOworCXN3aXRjaCAodDEpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWlmICh0MiA9PSBFX05PVCkKKwkJCXJldHVybiAxOworCWNhc2UgRV9OT1Q6CisJCWlmICh0MiA9PSBFX0FORCkKKwkJCXJldHVybiAxOworCWNhc2UgRV9BTkQ6CisJCWlmICh0MiA9PSBFX09SKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX09SOgorCQlpZiAodDIgPT0gRV9DSE9JQ0UpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfQ0hPSUNFOgorCQlpZiAodDIgPT0gMCkKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJbJWRndCVkP10iLCB0MSwgdDIpOworCXJldHVybiAwOworI2VuZGlmCit9CisKK3ZvaWQgZXhwcl9wcmludChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIHN0cnVjdCBzeW1ib2wgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikKK3sKKwlpZiAoIWUpIHsKKwkJZm4oZGF0YSwgTlVMTCwgInkiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKKwkJZm4oZGF0YSwgTlVMTCwgIigiKTsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQlpZiAoZS0+bGVmdC5zeW0tPm5hbWUpCisJCQlmbihkYXRhLCBlLT5sZWZ0LnN5bSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQllbHNlCisJCQlmbihkYXRhLCBOVUxMLCAiPGNob2ljZT4iKTsKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZm4oZGF0YSwgTlVMTCwgIiEiKTsKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX05PVCk7CisJCWJyZWFrOworCWNhc2UgRV9FUVVBTDoKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0sIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIj0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0sIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIiE9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfT1IpOworCQlmbihkYXRhLCBOVUxMLCAiIHx8ICIpOworCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7CisJCWZuKGRhdGEsIE5VTEwsICIgJiYgIik7CisJCWV4cHJfcHJpbnQoZS0+cmlnaHQuZXhwciwgZm4sIGRhdGEsIEVfQU5EKTsKKwkJYnJlYWs7CisJY2FzZSBFX0NIT0lDRToKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlpZiAoZS0+bGVmdC5leHByKSB7CisJCQlmbihkYXRhLCBOVUxMLCAiIF4gIik7CisJCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfQ0hPSUNFKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfUkFOR0U6CisJCWZuKGRhdGEsIE5VTEwsICJbIik7CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCWZuKGRhdGEsIE5VTEwsICIgIik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgTlVMTCwgIl0iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkgIHsKKwkJY2hhciBidWZbMzJdOworCQlzcHJpbnRmKGJ1ZiwgIjx1bmtub3duIHR5cGUgJWQ+IiwgZS0+dHlwZSk7CisJCWZuKGRhdGEsIE5VTEwsIGJ1Zik7CisJCWJyZWFrOworCSAgfQorCX0KKwlpZiAoZXhwcl9jb21wYXJlX3R5cGUocHJldnRva2VuLCBlLT50eXBlKSA+IDApCisJCWZuKGRhdGEsIE5VTEwsICIpIik7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZmlsZV9oZWxwZXIodm9pZCAqZGF0YSwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJZndyaXRlKHN0ciwgc3RybGVuKHN0ciksIDEsIGRhdGEpOworfQorCit2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2ZpbGVfaGVscGVyLCBvdXQsIEVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RyX2FwcGVuZCgoc3RydWN0IGdzdHIqKWRhdGEsIHN0cik7Cit9CisKK3ZvaWQgZXhwcl9nc3RyX3ByaW50KHN0cnVjdCBleHByICplLCBzdHJ1Y3QgZ3N0ciAqZ3MpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2dzdHJfaGVscGVyLCBncywgRV9OT05FKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL2V4cHIuaCBiL3RveWJveC9rY29uZmlnL2V4cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDg0NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvZXhwci5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2lmbmRlZiBFWFBSX0gKKyNkZWZpbmUgRVhQUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2VuZGlmCisKK3N0cnVjdCBmaWxlIHsKKwlzdHJ1Y3QgZmlsZSAqbmV4dDsKKwlzdHJ1Y3QgZmlsZSAqcGFyZW50OworCWNoYXIgKm5hbWU7CisJaW50IGxpbmVubzsKKwlpbnQgZmxhZ3M7Cit9OworCisjZGVmaW5lIEZJTEVfQlVTWQkJMHgwMDAxCisjZGVmaW5lIEZJTEVfU0NBTk5FRAkJMHgwMDAyCisjZGVmaW5lIEZJTEVfUFJJTlRFRAkJMHgwMDA0CisKK3R5cGVkZWYgZW51bSB0cmlzdGF0ZSB7CisJbm8sIG1vZCwgeWVzCit9IHRyaXN0YXRlOworCitlbnVtIGV4cHJfdHlwZSB7CisJRV9OT05FLCBFX09SLCBFX0FORCwgRV9OT1QsIEVfRVFVQUwsIEVfVU5FUVVBTCwgRV9DSE9JQ0UsIEVfU1lNQk9MLCBFX1JBTkdFCit9OworCit1bmlvbiBleHByX2RhdGEgeworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKK307CisKK3N0cnVjdCBleHByIHsKKwllbnVtIGV4cHJfdHlwZSB0eXBlOworCXVuaW9uIGV4cHJfZGF0YSBsZWZ0LCByaWdodDsKK307CisKKyNkZWZpbmUgRV9PUihkZXAxLCBkZXAyKQkoKChkZXAxKT4oZGVwMikpPyhkZXAxKTooZGVwMikpCisjZGVmaW5lIEVfQU5EKGRlcDEsIGRlcDIpCSgoKGRlcDEpPChkZXAyKSk/KGRlcDEpOihkZXAyKSkKKyNkZWZpbmUgRV9OT1QoZGVwKQkJKDItKGRlcCkpCisKK3N0cnVjdCBleHByX3ZhbHVlIHsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwl0cmlzdGF0ZSB0cmk7Cit9OworCitzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIHsKKwl2b2lkICp2YWw7CisJdHJpc3RhdGUgdHJpOworfTsKKworZW51bSBzeW1ib2xfdHlwZSB7CisJU19VTktOT1dOLCBTX0JPT0xFQU4sIFNfVFJJU1RBVEUsIFNfSU5ULCBTX0hFWCwgU19TVFJJTkcsIFNfT1RIRVIKK307CisKK2VudW0geworCVNfREVGX1VTRVIsCQkvKiBtYWluIHVzZXIgdmFsdWUgKi8KKwlTX0RFRl9BVVRPLAorfTsKKworc3RydWN0IHN5bWJvbCB7CisJc3RydWN0IHN5bWJvbCAqbmV4dDsKKwljaGFyICpuYW1lOworCWNoYXIgKmhlbHA7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlOworCXN0cnVjdCBzeW1ib2xfdmFsdWUgY3VycjsKKwlzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIGRlZls0XTsKKwl0cmlzdGF0ZSB2aXNpYmxlOworCWludCBmbGFnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmRlcCwgKmRlcDI7CisJc3RydWN0IGV4cHJfdmFsdWUgcmV2X2RlcDsKK307CisKKyNkZWZpbmUgZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKSBmb3IgKHN5bSA9IHN5bWJvbF9oYXNoW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkgaWYgKHN5bS0+dHlwZSAhPSBTX09USEVSKQorCisjZGVmaW5lIFNZTUJPTF9DT05TVAkJMHgwMDAxCisjZGVmaW5lIFNZTUJPTF9DSEVDSwkJMHgwMDA4CisjZGVmaW5lIFNZTUJPTF9DSE9JQ0UJCTB4MDAxMAorI2RlZmluZSBTWU1CT0xfQ0hPSUNFVkFMCTB4MDAyMAorI2RlZmluZSBTWU1CT0xfUFJJTlRFRAkJMHgwMDQwCisjZGVmaW5lIFNZTUJPTF9WQUxJRAkJMHgwMDgwCisjZGVmaW5lIFNZTUJPTF9PUFRJT05BTAkJMHgwMTAwCisjZGVmaW5lIFNZTUJPTF9XUklURQkJMHgwMjAwCisjZGVmaW5lIFNZTUJPTF9DSEFOR0VECQkweDA0MDAKKyNkZWZpbmUgU1lNQk9MX0FVVE8JCTB4MTAwMAorI2RlZmluZSBTWU1CT0xfQ0hFQ0tFRAkJMHgyMDAwCisjZGVmaW5lIFNZTUJPTF9XQVJORUQJCTB4ODAwMAorI2RlZmluZSBTWU1CT0xfREVGCQkweDEwMDAwCisjZGVmaW5lIFNZTUJPTF9ERUZfVVNFUgkJMHgxMDAwMAorI2RlZmluZSBTWU1CT0xfREVGX0FVVE8JCTB4MjAwMDAKKyNkZWZpbmUgU1lNQk9MX0RFRjMJCTB4NDAwMDAKKyNkZWZpbmUgU1lNQk9MX0RFRjQJCTB4ODAwMDAKKworI2RlZmluZSBTWU1CT0xfTUFYTEVOR1RICTI1NgorI2RlZmluZSBTWU1CT0xfSEFTSFNJWkUJCTI1NworI2RlZmluZSBTWU1CT0xfSEFTSE1BU0sJCTB4ZmYKKworZW51bSBwcm9wX3R5cGUgeworCVBfVU5LTk9XTiwgUF9QUk9NUFQsIFBfQ09NTUVOVCwgUF9NRU5VLCBQX0RFRkFVTFQsIFBfQ0hPSUNFLCBQX1NFTEVDVCwgUF9SQU5HRQorfTsKKworc3RydWN0IHByb3BlcnR5IHsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWVudW0gcHJvcF90eXBlIHR5cGU7CisJY29uc3QgY2hhciAqdGV4dDsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSB2aXNpYmxlOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87Cit9OworCisjZGVmaW5lIGZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHN0LCB0b2spIFwKKwlmb3IgKHN0ID0gc3ltLT5wcm9wOyBzdDsgc3QgPSBzdC0+bmV4dCkgXAorCQlpZiAoc3QtPnR5cGUgPT0gKHRvaykpCisjZGVmaW5lIGZvcl9hbGxfZGVmYXVsdHMoc3ltLCBzdCkgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIFBfREVGQVVMVCkKKyNkZWZpbmUgZm9yX2FsbF9jaG9pY2VzKHN5bSwgc3QpIGZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHN0LCBQX0NIT0lDRSkKKyNkZWZpbmUgZm9yX2FsbF9wcm9tcHRzKHN5bSwgc3QpIFwKKwlmb3IgKHN0ID0gc3ltLT5wcm9wOyBzdDsgc3QgPSBzdC0+bmV4dCkgXAorCQlpZiAoc3QtPnRleHQpCisKK3N0cnVjdCBtZW51IHsKKwlzdHJ1Y3QgbWVudSAqbmV4dDsKKwlzdHJ1Y3QgbWVudSAqcGFyZW50OworCXN0cnVjdCBtZW51ICpsaXN0OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb21wdDsKKwlzdHJ1Y3QgZXhwciAqZGVwOworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvL2NoYXIgKmhlbHA7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKKwl2b2lkICpkYXRhOworfTsKKworI2RlZmluZSBNRU5VX0NIQU5HRUQJCTB4MDAwMQorI2RlZmluZSBNRU5VX1JPT1QJCTB4MDAwMgorCisjaWZuZGVmIFNXSUcKKworZXh0ZXJuIHN0cnVjdCBmaWxlICpmaWxlX2xpc3Q7CitleHRlcm4gc3RydWN0IGZpbGUgKmN1cnJlbnRfZmlsZTsKK3N0cnVjdCBmaWxlICpsb29rdXBfZmlsZShjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgc3ltYm9sX3llcywgc3ltYm9sX25vLCBzeW1ib2xfbW9kOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKnN5bV9kZWZjb25maWdfbGlzdDsKK2V4dGVybiBpbnQgY2RlYnVnOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vbmUoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmNlKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3R3byhlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19jb21wKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnMxLCBzdHJ1Y3Qgc3ltYm9sICpzMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKTsKK3ZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKTsKK2ludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3ZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3RyaXN0YXRlIGV4cHJfY2FsY192YWx1ZShzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfeW4oc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfYm9vbChzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc2Zvcm0oc3RydWN0IGV4cHIgKmUpOworaW50IGV4cHJfY29udGFpbnNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7Citib29sIGV4cHJfZGVwZW5kc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfYW5kKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX29yKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Cit2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKKwordm9pZCBleHByX2ZwcmludChzdHJ1Y3QgZXhwciAqZSwgRklMRSAqb3V0KTsKK3N0cnVjdCBnc3RyOyAvKiBmb3J3YXJkICovCit2b2lkIGV4cHJfZ3N0cl9wcmludChzdHJ1Y3QgZXhwciAqZSwgc3RydWN0IGdzdHIgKmdzKTsKKworc3RhdGljIGlubGluZSBpbnQgZXhwcl9pc195ZXMoc3RydWN0IGV4cHIgKmUpCit7CisJcmV0dXJuICFlIHx8IChlLT50eXBlID09IEVfU1lNQk9MICYmIGUtPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXhwcl9pc19ubyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlyZXR1cm4gZSAmJiAoZS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRVhQUl9IICovCmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkIGIvdG95Ym94L2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBmOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApAQCAtMCwwICsxLDIzNTAgQEAKKworI2xpbmUgMyAic2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jIgorCisjZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKKworLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KKworI2RlZmluZSBGTEVYX1NDQU5ORVIKKyNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKKyNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKKyNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDMzCisjaWYgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OID4gMAorI2RlZmluZSBGTEVYX0JFVEEKKyNlbmRpZgorCisvKiBGaXJzdCwgd2UgZGVhbCB3aXRoICBwbGF0Zm9ybS1zcGVjaWZpYyBvciBjb21waWxlci1zcGVjaWZpYyBpc3N1ZXMuICovCisKKy8qIGJlZ2luIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGVuZCBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisKKy8qIGZsZXggaW50ZWdlciB0eXBlIGRlZmluaXRpb25zICovCisKKyNpZm5kZWYgRkxFWElOVF9ICisjZGVmaW5lIEZMRVhJTlRfSAorCisvKiBDOTkgc3lzdGVtcyBoYXZlIDxpbnR0eXBlcy5oPi4gTm9uLUM5OSBzeXN0ZW1zIG1heSBvciBtYXkgbm90LiAqLworCisjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisKKy8qIEM5OSBzYXlzIHRvIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSBpbmNsdWRpbmcgc3RkaW50LmgsCisgKiBpZiB5b3Ugd2FudCB0aGUgbGltaXQgKG1heC9taW4pIG1hY3JvcyBmb3IgaW50IHR5cGVzLgorICovCisjaWZuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDhfdCBmbGV4X2ludDhfdDsKK3R5cGVkZWYgdWludDhfdCBmbGV4X3VpbnQ4X3Q7Cit0eXBlZGVmIGludDE2X3QgZmxleF9pbnQxNl90OwordHlwZWRlZiB1aW50MTZfdCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiBpbnQzMl90IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgZmxleF91aW50MzJfdDsKKyNlbHNlCit0eXBlZGVmIHNpZ25lZCBjaGFyIGZsZXhfaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQgZmxleF9pbnQxNl90OwordHlwZWRlZiBpbnQgZmxleF9pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsZXhfdWludDhfdDsgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxleF91aW50MzJfdDsKKyNlbmRpZiAvKiAhIEM5OSAqLworCisvKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICovCisjaWZuZGVmIElOVDhfTUlOCisjZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUlOCisjZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01JTgorI2RlZmluZSBJTlQzMl9NSU4gICAgICAgICAgICAgICgtMjE0NzQ4MzY0Ny0xKQorI2VuZGlmCisjaWZuZGVmIElOVDhfTUFYCisjZGVmaW5lIElOVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NQVgKKyNkZWZpbmUgSU5UMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlQ4X01BWCAgICAgICAgICAgICAgKDI1NVUpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UMTZfTUFYICAgICAgICAgICAgICg2NTUzNVUpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKKyNlbmRpZgorCisjZW5kaWYgLyogISBGTEVYSU5UX0ggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qIFRoZSAiY29uc3QiIHN0b3JhZ2UtY2xhc3MtbW9kaWZpZXIgaXMgdmFsaWQuICovCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZiBfX1NURENfXworCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZW5kaWYJLyogX19TVERDX18gKi8KKyNlbmRpZgkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZmRlZiBZWV9VU0VfQ09OU1QKKyNkZWZpbmUgeXljb25zdCBjb25zdAorI2Vsc2UKKyNkZWZpbmUgeXljb25zdAorI2VuZGlmCisKKy8qIFJldHVybmVkIHVwb24gZW5kLW9mLWZpbGUuICovCisjZGVmaW5lIFlZX05VTEwgMAorCisvKiBQcm9tb3RlcyBhIHBvc3NpYmx5IG5lZ2F0aXZlLCBwb3NzaWJseSBzaWduZWQgY2hhciB0byBhbiB1bnNpZ25lZAorICogaW50ZWdlciBmb3IgdXNlIGFzIGFuIGFycmF5IGluZGV4LiAgSWYgdGhlIHNpZ25lZCBjaGFyIGlzIG5lZ2F0aXZlLAorICogd2Ugd2FudCB0byBpbnN0ZWFkIHRyZWF0IGl0IGFzIGFuIDgtYml0IHVuc2lnbmVkIGNoYXIsIGhlbmNlIHRoZQorICogZG91YmxlIGNhc3QuCisgKi8KKyNkZWZpbmUgWVlfU0NfVE9fVUkoYykgKCh1bnNpZ25lZCBpbnQpICh1bnNpZ25lZCBjaGFyKSBjKQorCisvKiBFbnRlciBhIHN0YXJ0IGNvbmRpdGlvbi4gIFRoaXMgbWFjcm8gcmVhbGx5IG91Z2h0IHRvIHRha2UgYSBwYXJhbWV0ZXIsCisgKiBidXQgd2UgZG8gaXQgdGhlIGRpc2d1c3RpbmcgY3J1ZnR5IHdheSBmb3JjZWQgb24gdXMgYnkgdGhlICgpLWxlc3MKKyAqIGRlZmluaXRpb24gb2YgQkVHSU4uCisgKi8KKyNkZWZpbmUgQkVHSU4gKHl5X3N0YXJ0KSA9IDEgKyAyICoKKworLyogVHJhbnNsYXRlIHRoZSBjdXJyZW50IHN0YXJ0IHN0YXRlIGludG8gYSB2YWx1ZSB0aGF0IGNhbiBiZSBsYXRlciBoYW5kZWQKKyAqIHRvIEJFR0lOIHRvIHJldHVybiB0byB0aGUgc3RhdGUuICBUaGUgWVlTVEFURSBhbGlhcyBpcyBmb3IgbGV4CisgKiBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIFlZX1NUQVJUICgoKHl5X3N0YXJ0KSAtIDEpIC8gMikKKyNkZWZpbmUgWVlTVEFURSBZWV9TVEFSVAorCisvKiBBY3Rpb24gbnVtYmVyIGZvciBFT0YgcnVsZSBvZiBhIGdpdmVuIHN0YXJ0IHN0YXRlLiAqLworI2RlZmluZSBZWV9TVEFURV9FT0Yoc3RhdGUpIChZWV9FTkRfT0ZfQlVGRkVSICsgc3RhdGUgKyAxKQorCisvKiBTcGVjaWFsIGFjdGlvbiBtZWFuaW5nICJzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGZpbGUiLiAqLworI2RlZmluZSBZWV9ORVdfRklMRSB6Y29uZnJlc3RhcnQoemNvbmZpbiAgKQorCisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVJfQ0hBUiAwCisKKy8qIFNpemUgb2YgZGVmYXVsdCBpbnB1dCBidWZmZXIuICovCisjaWZuZGVmIFlZX0JVRl9TSVpFCisjZGVmaW5lIFlZX0JVRl9TSVpFIDE2Mzg0CisjZW5kaWYKKworLyogVGhlIHN0YXRlIGJ1ZiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIG9uZSBzdGF0ZSBwZXIgY2hhcmFjdGVyIGluIHRoZSBtYWluIGJ1ZmZlci4KKyAqLworI2RlZmluZSBZWV9TVEFURV9CVUZfU0laRSAgICgoWVlfQlVGX1NJWkUgKyAyKSAqIHNpemVvZih5eV9zdGF0ZV90eXBlKSkKKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQordHlwZWRlZiBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICpZWV9CVUZGRVJfU1RBVEU7CisjZW5kaWYKKworZXh0ZXJuIGludCB6Y29uZmxlbmc7CisKK2V4dGVybiBGSUxFICp6Y29uZmluLCAqemNvbmZvdXQ7CisKKyNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKKyNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCisjZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCisKKyAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCisgICAgCisvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IFwKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCisJCSh5eV9jX2J1Zl9wKSA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKyNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgKHl5dGV4dF9wdHIpICApCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgYmVjYXVzZSB3ZSBjYW5ub3QgcG9ydGFibHkgZ2V0IG91ciBoYW5kcyBvbiBzaXplX3QKKyAqICh3aXRob3V0IGF1dG9jb25mJ3MgaGVscCwgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIGJlY2F1c2Ugd2Ugd2FudAorICogZmxleC1nZW5lcmF0ZWQgc2Nhbm5lcnMgdG8gY29tcGlsZSBvbiB0aGVpciBvd24pLgorICovCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TSVpFX1QKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TSVpFX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHl5X3NpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZQorCXsKKwlGSUxFICp5eV9pbnB1dF9maWxlOworCisJY2hhciAqeXlfY2hfYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCisJY2hhciAqeXlfYnVmX3BvczsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgYnVmZmVyICovCisKKwkvKiBTaXplIG9mIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbm90IGluY2x1ZGluZyByb29tIGZvciBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCXl5X3NpemVfdCB5eV9idWZfc2l6ZTsKKworCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYsIG5vdCBpbmNsdWRpbmcgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwlpbnQgeXlfbl9jaGFyczsKKworCS8qIFdoZXRoZXIgd2UgIm93biIgdGhlIGJ1ZmZlciAtIGkuZS4sIHdlIGtub3cgd2UgY3JlYXRlZCBpdCwKKwkgKiBhbmQgY2FuIHJlYWxsb2MoKSBpdCB0byBncm93IGl0LCBhbmQgc2hvdWxkIGZyZWUoKSBpdCB0bworCSAqIGRlbGV0ZSBpdC4KKwkgKi8KKwlpbnQgeXlfaXNfb3VyX2J1ZmZlcjsKKworCS8qIFdoZXRoZXIgdGhpcyBpcyBhbiAiaW50ZXJhY3RpdmUiIGlucHV0IHNvdXJjZTsgaWYgc28sIGFuZAorCSAqIGlmIHdlJ3JlIHVzaW5nIHN0ZGlvIGZvciBpbnB1dCwgdGhlbiB3ZSB3YW50IHRvIHVzZSBnZXRjKCkKKwkgKiBpbnN0ZWFkIG9mIGZyZWFkKCksIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIGZldGNoaW5nIGlucHV0IGFmdGVyCisJICogZWFjaCBuZXdsaW5lLgorCSAqLworCWludCB5eV9pc19pbnRlcmFjdGl2ZTsKKworCS8qIFdoZXRoZXIgd2UncmUgY29uc2lkZXJlZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KKwkgKiBJZiBzbywgJ14nIHJ1bGVzIHdpbGwgYmUgYWN0aXZlIG9uIHRoZSBuZXh0IG1hdGNoLCBvdGhlcndpc2UKKwkgKiBub3QuCisJICovCisJaW50IHl5X2F0X2JvbDsKKworICAgIGludCB5eV9ic19saW5lbm87IC8qKjwgVGhlIGxpbmUgY291bnQuICovCisgICAgaW50IHl5X2JzX2NvbHVtbjsgLyoqPCBUaGUgY29sdW1uIGNvdW50LiAqLworICAgIAorCS8qIFdoZXRoZXIgdG8gdHJ5IHRvIGZpbGwgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHdlIHJlYWNoIHRoZQorCSAqIGVuZCBvZiBpdC4KKwkgKi8KKwlpbnQgeXlfZmlsbF9idWZmZXI7CisKKwlpbnQgeXlfYnVmZmVyX3N0YXR1czsKKworI2RlZmluZSBZWV9CVUZGRVJfTkVXIDAKKyNkZWZpbmUgWVlfQlVGRkVSX05PUk1BTCAxCisJLyogV2hlbiBhbiBFT0YncyBiZWVuIHNlZW4gYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSB0ZXh0IHRvIHByb2Nlc3MKKwkgKiB0aGVuIHdlIG1hcmsgdGhlIGJ1ZmZlciBhcyBZWV9FT0ZfUEVORElORywgdG8gaW5kaWNhdGUgdGhhdCB3ZQorCSAqIHNob3VsZG4ndCB0cnkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW55IG1vcmUuICBXZSBtaWdodAorCSAqIHN0aWxsIGhhdmUgYSBidW5jaCBvZiB0b2tlbnMgdG8gbWF0Y2gsIHRob3VnaCwgYmVjYXVzZSBvZgorCSAqIHBvc3NpYmxlIGJhY2tpbmctdXAuCisJICoKKwkgKiBXaGVuIHdlIGFjdHVhbGx5IHNlZSB0aGUgRU9GLCB3ZSBjaGFuZ2UgdGhlIHN0YXR1cyB0byAibmV3IgorCSAqICh2aWEgemNvbmZyZXN0YXJ0KCkpLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb250aW51ZSBzY2FubmluZyBieQorCSAqIGp1c3QgcG9pbnRpbmcgemNvbmZpbiBhdCBhIG5ldyBpbnB1dCBmaWxlLgorCSAqLworI2RlZmluZSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgMgorCisJfTsKKyNlbmRpZiAvKiAhWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURSAqLworCisvKiBTdGFjayBvZiBpbnB1dCBidWZmZXJzLiAqLworc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfdG9wID0gMDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCitzdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXggPSAwOyAvKio8IGNhcGFjaXR5IG9mIHN0YWNrLiAqLworc3RhdGljIFlZX0JVRkZFUl9TVEFURSAqIHl5X2J1ZmZlcl9zdGFjayA9IDA7IC8qKjwgU3RhY2sgYXMgYW4gYXJyYXkuICovCisKKy8qIFdlIHByb3ZpZGUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgYnVmZmVyIHN0YXRlcyBpbiBjYXNlIGluIHRoZQorICogZnV0dXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBidWZmZXIgc3RhdGVzIGluIGEgbW9yZSBnZW5lcmFsCisgKiAic2Nhbm5lciBzdGF0ZSIuCisgKgorICogUmV0dXJucyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb3IgTlVMTC4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUiAoICh5eV9idWZmZXJfc3RhY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKQorCisvKiBTYW1lIGFzIHByZXZpb3VzIG1hY3JvLCBidXQgdXNlZnVsIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgc3RhY2sgaXMgbm90CisgKiBOVUxMIG9yIHdoZW4gd2UgbmVlZCBhbiBsdmFsdWUuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXQorCisvKiB5eV9ob2xkX2NoYXIgaG9sZHMgdGhlIGNoYXJhY3RlciBsb3N0IHdoZW4gemNvbmZ0ZXh0IGlzIGZvcm1lZC4gKi8KK3N0YXRpYyBjaGFyIHl5X2hvbGRfY2hhcjsKK3N0YXRpYyBpbnQgeXlfbl9jaGFyczsJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYgKi8KK2ludCB6Y29uZmxlbmc7CisKKy8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCitzdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7CitzdGF0aWMgaW50IHl5X2luaXQgPSAwOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KK3N0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KKworLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIGFsbG93IHpjb25md3JhcCgpJ3MgdG8gZG8gYnVmZmVyIHN3aXRjaGVzCisgKiBpbnN0ZWFkIG9mIHNldHRpbmcgdXAgYSBmcmVzaCB6Y29uZmluLiAgQSBiaXQgb2YgYSBoYWNrIC4uLgorICovCitzdGF0aWMgaW50IHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZjsKKwordm9pZCB6Y29uZnJlc3RhcnQgKEZJTEUgKmlucHV0X2ZpbGUgICk7Cit2b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgICk7Cit2b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwordm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwordm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKK3ZvaWQgemNvbmZwb3BfYnVmZmVyX3N0YXRlICh2b2lkICk7CisKK3N0YXRpYyB2b2lkIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAodm9pZCApOworc3RhdGljIHZvaWQgemNvbmZfbG9hZF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHpjb25mX2luaXRfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYixGSUxFICpmaWxlICApOworCisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiB6Y29uZl9mbHVzaF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKQorCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgKGNoYXIgKmJhc2UseXlfc2l6ZV90IHNpemUgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqeXlfc3RyICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgKHl5Y29uc3QgY2hhciAqYnl0ZXMsaW50IGxlbiAgKTsKKwordm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICApOwordm9pZCAqemNvbmZyZWFsbG9jICh2b2lkICoseXlfc2l6ZV90ICApOwordm9pZCB6Y29uZmZyZWUgKHZvaWQgKiAgKTsKKworI2RlZmluZSB5eV9uZXdfYnVmZmVyIHpjb25mX2NyZWF0ZV9idWZmZXIKKworI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKKwl7IFwKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsgXAorICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7IFwKKwl9IFwKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlID0gaXNfaW50ZXJhY3RpdmU7IFwKKwl9CisKKyNkZWZpbmUgeXlfc2V0X2JvbChhdF9ib2wpIFwKKwl7IFwKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXtcCisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCisJfQorCisjZGVmaW5lIFlZX0FUX0JPTCgpIChZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCkKKworLyogQmVnaW4gdXNlciBzZWN0MyAqLworCisjZGVmaW5lIHpjb25md3JhcCgpIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CisKK0ZJTEUgKnpjb25maW4gPSAoRklMRSAqKSAwLCAqemNvbmZvdXQgPSAoRklMRSAqKSAwOworCit0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOworCitleHRlcm4gaW50IHpjb25mbGluZW5vOworCitpbnQgemNvbmZsaW5lbm8gPSAxOworCitleHRlcm4gY2hhciAqemNvbmZ0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHpjb25mdGV4dAorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFtdWzE3XSA9CisgICAgeworICAgIHsKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxNiwgICAxNiwgICAxOCwgICAxNiwgICAxNiwgICAxNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCisgICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTYKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTksICAgMjAsICAgMjEsICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE5LCAgIDIwLCAgIDIxLCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAorICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyMiwgICAyMiwgICAyMywgICAyMiwgICAyNCwgICAyMiwgICAyMiwgICAyNCwgICAyMiwKKyAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICAyMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjIsICAgMjIsICAgMjMsICAgMjIsICAgMjQsICAgMjIsICAgMjIsICAgMjQsICAgMjIsCisgICAgICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjUsICAgMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisgICAgfSwKKworICAgIHsKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEzLCAgIDM5LCAgIDQwLCAgLTEzLCAgLTEzLCAgIDQxLCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LAorICAgICAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwKKyAgICAgIC0xOCwgIC0xOCwgIC0xOCwgICA0NCwgIC0xOCwgIC0xOCwgIC0xOAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDUsICAgNDUsICAtMTksICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsCisgICAgICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjAsICAgNDYsICAgNDcsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsCisgICAgICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTIxLCAgLTIxLCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OSwgICA0OSwgICA1MCwgICA0OSwgIC0yMiwgICA0OSwgICA0OSwgIC0yMiwgICA0OSwKKyAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgIC0yMiwgICA0OQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsCisgICAgICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LAorICAgICAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDUxLCAgIDUxLCAgIDUyLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLAorICAgICAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwKKyAgICAgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsCisgICAgICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LAorICAgICAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgIDUzLCAgLTI4LCAgLTI4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwKKyAgICAgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NCwgICA1NCwgIC0zMCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwKKyAgICAgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAgNTUsICAtMzEsICAtMzEsCisgICAgICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLAorICAgICAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywKKyAgICAgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsCisgICAgICAtMzQsICAgNTYsICAgNTcsICAgNTcsICAtMzQsICAtMzQsICAtMzQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsCisgICAgICAtMzUsICAgNTcsICAgNTcsICAgNTcsICAtMzUsICAtMzUsICAtMzUKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LAorICAgICAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNywgIC0zNywgICA1OCwgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywKKyAgICAgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAgNTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM5LCAgIDM5LCAgIDQwLCAgLTM5LCAgLTM5LCAgIDQxLCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgICA0NCwgIC00NCwgIC00NCwgIC00NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0NSwgICA0NSwgIC00NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwKKyAgICAgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDYsICAgNDYsICAgNDcsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsCisgICAgICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTQ3LCAgLTQ3LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwKKyAgICAgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDksICAgNDksICAgNTAsICAgNDksICAtNDksICAgNDksICAgNDksICAtNDksICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAtNDksICAgNDkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsCisgICAgICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUxLCAgLTUxLCAgIDUyLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLAorICAgICAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwKKyAgICAgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU0LCAgIDU0LCAgLTU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAorICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LAorICAgICAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwKKyAgICAgIC01NiwgICA2MCwgICA1NywgICA1NywgIC01NiwgIC01NiwgIC01NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisgICAgICAtNTcsICAgNTcsICAgNTcsICAgNTcsICAtNTcsICAtNTcsICAtNTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LAorICAgICAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwKKyAgICAgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwKKyAgICAgIC02MCwgICA1NywgICA1NywgICA1NywgIC02MCwgIC02MCwgIC02MAorICAgIH0sCisKKyAgICB9IDsKKworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkICk7CitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICh5eV9zdGF0ZV90eXBlIGN1cnJlbnRfc3RhdGUgICk7CitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCApOworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciBtc2dbXSAgKTsKKworLyogRG9uZSBhZnRlciB0aGUgY3VycmVudCBwYXR0ZXJuIGhhcyBiZWVuIG1hdGNoZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB6Y29uZnRleHQuCisgKi8KKyNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCisJKHl5dGV4dF9wdHIpID0geXlfYnA7IFwKKwl6Y29uZmxlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsgXAorCSp5eV9jcCA9ICdcMCc7IFwKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKKworI2RlZmluZSBZWV9OVU1fUlVMRVMgMzMKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiAzNAorLyogVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhpcyBzY2FubmVyLAorICAgYnV0IGl0cyBwcmVzZW5jZSBpcyBuZWNlc3NhcnkuICovCitzdHJ1Y3QgeXlfdHJhbnNfaW5mbworCXsKKwlmbGV4X2ludDMyX3QgeXlfdmVyaWZ5OworCWZsZXhfaW50MzJfdCB5eV9ueHQ7CisJfTsKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbNjFdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAzNCwgICAgNSwgICAgNCwgICAgMiwgICAgMywgICAgNywgICAgOCwgICAgNiwgICAzMiwgICAyOSwKKyAgICAgICAzMSwgICAyNCwgICAyOCwgICAyNywgICAyNiwgICAyMiwgICAxNywgICAxMywgICAxNiwgICAyMCwKKyAgICAgICAyMiwgICAxMSwgICAxMiwgICAxOSwgICAxOSwgICAxNCwgICAyMiwgICAyMiwgICAgNCwgICAgMiwKKyAgICAgICAgMywgICAgMywgICAgMSwgICAgNiwgICAzMiwgICAyOSwgICAzMSwgICAzMCwgICAyNCwgICAyMywKKyAgICAgICAyNiwgICAyNSwgICAxNSwgICAyMCwgICAgOSwgICAxOSwgICAxOSwgICAyMSwgICAxMCwgICAxOAorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfZWNbMjU2XSA9CisgICAgeyAgIDAsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDMsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDIsICAgIDQsICAgIDUsICAgIDYsICAgIDEsICAgIDEsICAgIDcsICAgIDgsICAgIDksCisgICAgICAgMTAsICAgIDEsICAgIDEsICAgIDEsICAgMTEsICAgMTIsICAgMTIsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgMTQsICAgIDEsICAgIDEsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgIDEsICAgMTUsICAgIDEsICAgIDEsICAgMTMsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAgMSwgICAxNiwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKworICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxCisgICAgfSA7CisKK2V4dGVybiBpbnQgemNvbmZfZmxleF9kZWJ1ZzsKK2ludCB6Y29uZl9mbGV4X2RlYnVnID0gMDsKKworLyogVGhlIGludGVudCBiZWhpbmQgdGhpcyBkZWZpbml0aW9uIGlzIHRoYXQgaXQnbGwgY2F0Y2gKKyAqIGFueSB1c2VzIG9mIFJFSkVDVCB3aGljaCBmbGV4IG1pc3NlZC4KKyAqLworI2RlZmluZSBSRUpFQ1QgcmVqZWN0X3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSB5eW1vcmUoKSB5eW1vcmVfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIFlZX01PUkVfQURKIDAKKyNkZWZpbmUgWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorY2hhciAqemNvbmZ0ZXh0OworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgorCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworfSBjdXJyZW50X3BvczsKKworc3RhdGljIGNoYXIgKnRleHQ7CitzdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKKworc3RydWN0IGJ1ZmZlciB7CisgICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKKyAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOworfTsKKworc3RydWN0IGJ1ZmZlciAqY3VycmVudF9idWY7CisKK3N0YXRpYyBpbnQgbGFzdF90cywgZmlyc3RfdHM7CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCk7CitzdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpOworCit2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfc2l6ZSA9IDA7CisJKnRleHQgPSAwOworfQorCit2b2lkIGFwcGVuZF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbmV3X3NpemUgPSB0ZXh0X3NpemUgKyBzaXplICsgMTsKKwlpZiAobmV3X3NpemUgPiB0ZXh0X2FzaXplKSB7CisJCW5ld19zaXplICs9IFNUQVJUX1NUUlNJWkUgLSAxOworCQluZXdfc2l6ZSAmPSAtU1RBUlRfU1RSU0laRTsKKwkJdGV4dCA9IHJlYWxsb2ModGV4dCwgbmV3X3NpemUpOworCQl0ZXh0X2FzaXplID0gbmV3X3NpemU7CisJfQorCW1lbWNweSh0ZXh0ICsgdGV4dF9zaXplLCBzdHIsIHNpemUpOworCXRleHRfc2l6ZSArPSBzaXplOworCXRleHRbdGV4dF9zaXplXSA9IDA7Cit9CisKK3ZvaWQgYWxsb2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJdGV4dCA9IG1hbGxvYyhzaXplICsgMSk7CisJbWVtY3B5KHRleHQsIHN0ciwgc2l6ZSk7CisJdGV4dFtzaXplXSA9IDA7Cit9CisKKyNkZWZpbmUgSU5JVElBTCAwCisjZGVmaW5lIENPTU1BTkQgMQorI2RlZmluZSBIRUxQIDIKKyNkZWZpbmUgU1RSSU5HIDMKKyNkZWZpbmUgUEFSQU0gNAorCisjaWZuZGVmIFlZX05PX1VOSVNURF9ICisvKiBTcGVjaWFsIGNhc2UgZm9yICJ1bmlzdGQuaCIsIHNpbmNlIGl0IGlzIG5vbi1BTlNJLiBXZSBpbmNsdWRlIGl0IHdheQorICogZG93biBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdXNlcidzIHNlY3Rpb24gMSB0byBoYXZlIGJlZW4gc2Nhbm5lZCBmaXJzdC4KKyAqIFRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byBvdmVycmlkZSBpdCB3aXRoIGFuIG9wdGlvbi4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgWVlfRVhUUkFfVFlQRQorI2RlZmluZSBZWV9FWFRSQV9UWVBFIHZvaWQgKgorI2VuZGlmCisKK3N0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkICk7CisKKy8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCisgKiBzZWN0aW9uIDEuCisgKi8KKworI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbHNlCitleHRlcm4gaW50IHpjb25md3JhcCAodm9pZCApOworI2VuZGlmCisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLGNoYXIgKmJ1Zl9wdHIgICk7CisgICAgCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCApOworI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogKTsKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX0lOUFVUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljIGludCB5eWlucHV0ICh2b2lkICk7CisjZWxzZQorc3RhdGljIGludCBpbnB1dCAodm9pZCApOworI2VuZGlmCisKKyNlbmRpZgorCisvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCisjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNkZWZpbmUgWVlfUkVBRF9CVUZfU0laRSA4MTkyCisjZW5kaWYKKworLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KKyNpZm5kZWYgRUNITworLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCisgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgorICovCisjZGVmaW5lIEVDSE8gKHZvaWQpIGZ3cml0ZSggemNvbmZ0ZXh0LCB6Y29uZmxlbmcsIDEsIHpjb25mb3V0ICkKKyNlbmRpZgorCisvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCisgKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KKyAqLworI2lmbmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJZXJybm89MDsgXAorCXdoaWxlICggKHJlc3VsdCA9IHJlYWQoIGZpbGVubyh6Y29uZmluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSApKSA8IDAgKSBcCisJeyBcCisJCWlmKCBlcnJubyAhPSBFSU5UUikgXAorCQl7IFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQkJYnJlYWs7IFwKKwkJfSBcCisJCWVycm5vPTA7IFwKKwkJY2xlYXJlcnIoemNvbmZpbik7IFwKKwl9XAorXAorCisjZW5kaWYKKworLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCisgKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKKyAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCisgKi8KKyNpZm5kZWYgeXl0ZXJtaW5hdGUKKyNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KKyNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgorI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1CisjZW5kaWYKKworLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCisjaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCisjZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCisjZW5kaWYKKworLyogZW5kIHRhYmxlcyBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKi8KKworLyogRGVmYXVsdCBkZWNsYXJhdGlvbiBvZiBnZW5lcmF0ZWQgc2Nhbm5lciAtIGEgZGVmaW5lIHNvIHRoZSB1c2VyIGNhbgorICogZWFzaWx5IGFkZCBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIFlZX0RFQ0wKKyNkZWZpbmUgWVlfREVDTF9JU19PVVJTIDEKKworZXh0ZXJuIGludCB6Y29uZmxleCAodm9pZCk7CisKKyNkZWZpbmUgWVlfREVDTCBpbnQgemNvbmZsZXggKHZvaWQpCisjZW5kaWYgLyogIVlZX0RFQ0wgKi8KKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwgYWZ0ZXIgemNvbmZ0ZXh0IGFuZCB6Y29uZmxlbmcKKyAqIGhhdmUgYmVlbiBzZXQgdXAuCisgKi8KKyNpZm5kZWYgWVlfVVNFUl9BQ1RJT04KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04KKyNlbmRpZgorCisvKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBydWxlLiAqLworI2lmbmRlZiBZWV9CUkVBSworI2RlZmluZSBZWV9CUkVBSyBicmVhazsKKyNlbmRpZgorCisjZGVmaW5lIFlZX1JVTEVfU0VUVVAgXAorCVlZX1VTRVJfQUNUSU9OCisKKy8qKiBUaGUgbWFpbiBzY2FubmVyIGZ1bmN0aW9uIHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrLgorICovCitZWV9ERUNMCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CisJcmVnaXN0ZXIgaW50IHl5X2FjdDsKKyAgICAKKwlpbnQgc3RyID0gMDsKKwlpbnQgdHMsIGk7CisKKwlpZiAoICEoeXlfaW5pdCkgKQorCQl7CisJCSh5eV9pbml0KSA9IDE7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhICh5eV9zdGFydCkgKQorCQkJKHl5X3N0YXJ0KSA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCisKKwkJaWYgKCAhIHpjb25maW4gKQorCQkJemNvbmZpbiA9IHN0ZGluOworCisJCWlmICggISB6Y29uZm91dCApCisJCQl6Y29uZm91dCA9IHN0ZG91dDsKKworCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKSB7CisJCQl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorCQkJCXpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOworCQl9CisKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCX0KKworCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCisJCXsKKwkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkJLyogU3VwcG9ydCBvZiB6Y29uZnRleHQuICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworeXlfbWF0Y2g6CisJCXdoaWxlICggKHl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bIHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldICBdKSA+IDAgKQorCQkJKyt5eV9jcDsKKworCQl5eV9jdXJyZW50X3N0YXRlID0gLXl5X2N1cnJlbnRfc3RhdGU7CisKK3l5X2ZpbmRfYWN0aW9uOgorCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworZG9fYWN0aW9uOgkvKiBUaGlzIGxhYmVsIGlzIHVzZWQgb25seSB0byBhY2Nlc3MgRU9GIGFjdGlvbnMuICovCisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCitjYXNlIDE6CisvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAyOgorLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCXJldHVybiBUX0VPTDsKK30KKwlZWV9CUkVBSworY2FzZSAzOgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgNDoKK1lZX1JVTEVfU0VUVVAKK3sKKwlCRUdJTihDT01NQU5EKTsKK30KKwlZWV9CUkVBSworY2FzZSA1OgorWVlfUlVMRV9TRVRVUAoreworCXVucHV0KHpjb25mdGV4dFswXSk7CisJQkVHSU4oQ09NTUFORCk7Cit9CisJWVlfQlJFQUsKKworY2FzZSA2OgorWVlfUlVMRV9TRVRVUAoreworCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJQkVHSU4oUEFSQU0pOworCQljdXJyZW50X3Bvcy5maWxlID0gY3VycmVudF9maWxlOworCQljdXJyZW50X3Bvcy5saW5lbm8gPSBjdXJyZW50X2ZpbGUtPmxpbmVubzsKKwkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX0NPTU1BTkQpIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNzoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIDg6CisvKiBydWxlIDggY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQlCRUdJTihJTklUSUFMKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlZWV9CUkVBSworCitjYXNlIDk6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9BTkQ7CisJWVlfQlJFQUsKK2Nhc2UgMTA6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PUjsKKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX09QRU5fUEFSRU47CisJWVlfQlJFQUsKK2Nhc2UgMTI6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9DTE9TRV9QQVJFTjsKKwlZWV9CUkVBSworY2FzZSAxMzoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX05PVDsKKwlZWV9CUkVBSworY2FzZSAxNDoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0VRVUFMOworCVlZX0JSRUFLCitjYXNlIDE1OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfVU5FUVVBTDsKKwlZWV9CUkVBSworY2FzZSAxNjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJc3RyID0gemNvbmZ0ZXh0WzBdOworCQluZXdfc3RyaW5nKCk7CisJCUJFR0lOKFNUUklORyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDE3OgorLyogcnVsZSAxNyBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitCRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOworCVlZX0JSRUFLCitjYXNlIDE4OgorWVlfUlVMRV9TRVRVUAorLyogaWdub3JlICovCisJWVlfQlJFQUsKK2Nhc2UgMTk6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfUEFSQU0pIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjA6CitZWV9SVUxFX1NFVFVQCisvKiBjb21tZW50ICovCisJWVlfQlJFQUsKK2Nhc2UgMjE6CisvKiBydWxlIDIxIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJWVlfQlJFQUsKK2Nhc2UgMjI6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoUEFSQU0pOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSAyMzoKKy8qIHJ1bGUgMjMgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlZWV9CUkVBSworY2FzZSAyNDoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI1OgorLyogcnVsZSAyNSBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjY6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI3OgorWVlfUlVMRV9TRVRVUAoreworCQlpZiAoc3RyID09IHpjb25mdGV4dFswXSkgeworCQkJQkVHSU4oUEFSQU0pOworCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCQl9IGVsc2UKKwkJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjg6CisvKiBydWxlIDI4IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJcHJpbnRmKCIlczolZDp3YXJuaW5nOiBtdWx0aS1saW5lIHN0cmluZ3Mgbm90IHN1cHBvcnRlZFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCUJFR0lOKElOSVRJQUwpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihTVFJJTkcpOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSAyOToKK1lZX1JVTEVfU0VUVVAKK3sKKwkJdHMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgemNvbmZsZW5nOyBpKyspIHsKKwkJCWlmICh6Y29uZnRleHRbaV0gPT0gJ1x0JykKKwkJCQl0cyA9ICh0cyAmIH43KSArIDg7CisJCQllbHNlCisJCQkJdHMrKzsKKwkJfQorCQlsYXN0X3RzID0gdHM7CisJCWlmIChmaXJzdF90cykgeworCQkJaWYgKHRzIDwgZmlyc3RfdHMpIHsKKwkJCQl6Y29uZl9lbmRoZWxwKCk7CisJCQkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJCQl9CisJCQl0cyAtPSBmaXJzdF90czsKKwkJCXdoaWxlICh0cyA+IDgpIHsKKwkJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIDgpOworCQkJCXRzIC09IDg7CisJCQl9CisJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIHRzKTsKKwkJfQorCX0KKwlZWV9CUkVBSworY2FzZSAzMDoKKy8qIHJ1bGUgMzAgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzE6CisvKiBydWxlIDMxIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJYXBwZW5kX3N0cmluZygiXG4iLCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzI6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoIWZpcnN0X3RzKQorCQkJZmlyc3RfdHMgPSBsYXN0X3RzOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoSEVMUCk6Cit7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoQ09NTUFORCk6Cit7CisJaWYgKGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZl9lbmRmaWxlKCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJZmNsb3NlKHpjb25maW4pOworCXl5dGVybWluYXRlKCk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMzM6CitZWV9SVUxFX1NFVFVQCitZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBqYW1tZWQiICk7CisJWVlfQlJFQUsKKworCWNhc2UgWVlfRU5EX09GX0JVRkZFUjoKKwkJeworCQkvKiBBbW91bnQgb2YgdGV4dCBtYXRjaGVkIG5vdCBpbmNsdWRpbmcgdGhlIEVPQiBjaGFyLiAqLworCQlpbnQgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dCA9IChpbnQpICh5eV9jcCAtICh5eXRleHRfcHRyKSkgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKKworCQlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB6Y29uZmluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiB6Y29uZmxleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4gWVlfQ1VSUkVOVF9CVUZGRVIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlID0gemNvbmZpbjsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9OT1JNQUw7CisJCQl9CisKKwkJLyogTm90ZSB0aGF0IGhlcmUgd2UgdGVzdCBmb3IgeXlfY19idWZfcCAiPD0iIHRvIHRoZSBwb3NpdGlvbgorCQkgKiBvZiB0aGUgZmlyc3QgRU9CIGluIHRoZSBidWZmZXIsIHNpbmNlIHl5X2NfYnVmX3Agd2lsbAorCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBOVUwgY2hhcmFjdGVyCisJCSAqIChzaW5jZSBhbGwgc3RhdGVzIG1ha2UgdHJhbnNpdGlvbnMgb24gRU9CIHRvIHRoZQorCQkgKiBlbmQtb2YtYnVmZmVyIHN0YXRlKS4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgdGVzdAorCQkgKiBpbiBpbnB1dCgpLgorCQkgKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgPD0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJeyAvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQl5eV9zdGF0ZV90eXBlIHl5X25leHRfc3RhdGU7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkvKiBPa2F5LCB3ZSdyZSBub3cgcG9zaXRpb25lZCB0byBtYWtlIHRoZSBOVUwKKwkJCSAqIHRyYW5zaXRpb24uICBXZSBjb3VsZG4ndCBoYXZlCisJCQkgKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKSBnbyBhaGVhZCBhbmQgZG8gaXQKKwkJCSAqIGZvciB1cyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gZGVhbAorCQkJICogd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgamFtbWluZyAoYW5kIHdlIGRvbid0CisJCQkgKiB3YW50IHRvIGJ1aWxkIGphbW1pbmcgaW50byBpdCBiZWNhdXNlIHRoZW4gaXQKKwkJCSAqIHdpbGwgcnVuIG1vcmUgc2xvd2x5KS4KKwkJCSAqLworCisJCQl5eV9uZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggeXlfY3VycmVudF9zdGF0ZSApOworCisJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArKyh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbmV4dF9zdGF0ZTsKKwkJCQlnb3RvIHl5X21hdGNoOworCQkJCX0KKworCQkJZWxzZQorCQkJCXsKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJCX0KKwkJCX0KKworCQllbHNlIHN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggICkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDA7CisKKwkJCQlpZiAoIHpjb25md3JhcCggKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHpjb25mdGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCQkJeXlfYWN0ID0gWVlfU1RBVEVfRU9GKFlZX1NUQVJUKTsKKwkJCQkJZ290byBkb19hY3Rpb247CisJCQkJCX0KKworCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCSh5eV9jX2J1Zl9wKSA9CisJCQkJCSh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9tYXRjaDsKKworCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KK30gLyogZW5kIG9mIHpjb25mbGV4ICovCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQpCit7CisgICAgCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZjsKKwlyZWdpc3RlciBjaGFyICpzb3VyY2UgPSAoeXl0ZXh0X3B0cik7CisJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOworCWludCByZXRfdmFsOworCisJaWYgKCAoeXlfY19idWZfcCkgPiAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gKQorCQlZWV9GQVRBTF9FUlJPUigKKwkJImZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tZW5kIG9mIGJ1ZmZlciBtaXNzZWQiICk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfZmlsbF9idWZmZXIgPT0gMCApCisJCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCisJCWlmICggKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpIC0gWVlfTU9SRV9BREogPT0gMSApCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIGEgc2luZ2xlIGNoYXJhY3RlciwgdGhlIEVPQiwgc28KKwkJCSAqIHRyZWF0IHRoaXMgYXMgYSBmaW5hbCBFT0YuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0VORF9PRl9GSUxFOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgc29tZSB0ZXh0IHByaW9yIHRvIHRoZSBFT0IsIGZpcnN0CisJCQkgKiBwcm9jZXNzIGl0LgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9MQVNUX01BVENIOworCQkJfQorCQl9CisKKwkvKiBUcnkgdG8gcmVhZCBtb3JlIGRhdGEuICovCisKKwkvKiBGaXJzdCBtb3ZlIGxhc3QgY2hhcnMgdG8gc3RhcnQgb2YgYnVmZmVyLiAqLworCW51bWJlcl90b19tb3ZlID0gKGludCkgKCh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSkgLSAxOworCisJZm9yICggaSA9IDA7IGkgPCBudW1iZXJfdG9fbW92ZTsgKytpICkKKwkJKihkZXN0KyspID0gKihzb3VyY2UrKyk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQorCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAorCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgorCQkgKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpID0gMDsKKworCWVsc2UKKwkJeworCQkJaW50IG51bV90b19yZWFkID0KKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLSBudW1iZXJfdG9fbW92ZSAtIDE7CisKKwkJd2hpbGUgKCBudW1fdG9fcmVhZCA8PSAwICkKKwkJCXsgLyogTm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIgLSBncm93IGl0LiAqLworCisJCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJCVlZX0JVRkZFUl9TVEFURSBiID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisKKwkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9CisJCQkJKGludCkgKCh5eV9jX2J1Zl9wKSAtIGItPnl5X2NoX2J1Zik7CisKKwkJCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCQkJeworCQkJCWludCBuZXdfc2l6ZSA9IGItPnl5X2J1Zl9zaXplICogMjsKKworCQkJCWlmICggbmV3X3NpemUgPD0gMCApCisJCQkJCWItPnl5X2J1Zl9zaXplICs9IGItPnl5X2J1Zl9zaXplIC8gODsKKwkJCQllbHNlCisJCQkJCWItPnl5X2J1Zl9zaXplICo9IDI7CisKKwkJCQliLT55eV9jaF9idWYgPSAoY2hhciAqKQorCQkJCQkvKiBJbmNsdWRlIHJvb20gaW4gZm9yIDIgRU9CIGNoYXJzLiAqLworCQkJCQl6Y29uZnJlYWxsb2MoKHZvaWQgKikgYi0+eXlfY2hfYnVmLGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwkJCQl9CisJCQllbHNlCisJCQkJLyogQ2FuJ3QgZ3JvdyBpdCwgd2UgZG9uJ3Qgb3duIGl0LiAqLworCQkJCWItPnl5X2NoX2J1ZiA9IDA7CisKKwkJCWlmICggISBiLT55eV9jaF9idWYgKQorCQkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJCSJmYXRhbCBlcnJvciAtIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiApOworCisJCQkoeXlfY19idWZfcCkgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0KKwkJCQkJCW51bWJlcl90b19tb3ZlIC0gMTsKKworCQkJfQorCisJCWlmICggbnVtX3RvX3JlYWQgPiBZWV9SRUFEX0JVRl9TSVpFICkKKwkJCW51bV90b19yZWFkID0gWVlfUkVBRF9CVUZfU0laRTsKKworCQkvKiBSZWFkIGluIG1vcmUgZGF0YS4gKi8KKwkJWVlfSU5QVVQoICgmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdKSwKKwkJCSh5eV9uX2NoYXJzKSwgbnVtX3RvX3JlYWQgKTsKKworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCWlmICggKHl5X25fY2hhcnMpID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl6Y29uZnJlc3RhcnQoemNvbmZpbiAgKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0KKwkJCQlZWV9CVUZGRVJfRU9GX1BFTkRJTkc7CisJCQl9CisJCX0KKworCWVsc2UKKwkJcmV0X3ZhbCA9IEVPQl9BQ1RfQ09OVElOVUVfU0NBTjsKKworCSh5eV9uX2NoYXJzKSArPSBudW1iZXJfdG9fbW92ZTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJKHl5dGV4dF9wdHIpID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWzBdOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCisKKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHZvaWQpCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworICAgIAorCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworCisJZm9yICggeXlfY3AgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsgeXlfY3AgPCAoeXlfY19idWZfcCk7ICsreXlfY3AgKQorCQl7CisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSldOworCQl9CisKKwlyZXR1cm4geXlfY3VycmVudF9zdGF0ZTsKK30KKworLyogeXlfdHJ5X05VTF90cmFucyAtIHRyeSB0byBtYWtlIGEgdHJhbnNpdGlvbiBvbiB0aGUgTlVMIGNoYXJhY3RlcgorICoKKyAqIHN5bm9wc2lzCisgKgluZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggY3VycmVudF9zdGF0ZSApOworICovCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAgKHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZSApCit7CisJcmVnaXN0ZXIgaW50IHl5X2lzX2phbTsKKyAgICAKKwl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWzFdOworCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlIDw9IDApOworCisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOworfQorCisgICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsIHJlZ2lzdGVyIGNoYXIgKiB5eV9icCApCit7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisgICAgCisgICAgeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKwkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKworCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQorCQl7IC8qIG5lZWQgdG8gc2hpZnQgdGhpbmdzIHVwIHRvIG1ha2Ugcm9vbSAqLworCQkvKiArMiBmb3IgRU9CIGNoYXJzLiAqLworCQlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUgPSAoeXlfbl9jaGFycykgKyAyOworCQlyZWdpc3RlciBjaGFyICpkZXN0ID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWworCQkJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplICsgMl07CisJCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9CisJCQkJJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXTsKKworCQl3aGlsZSAoIHNvdXJjZSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKKwkJCSotLWRlc3QgPSAqLS1zb3VyY2U7CisKKwkJeXlfY3AgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOworCQl5eV9icCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9CisJCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplOworCisJCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQorCQkJWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93IiApOworCQl9CisKKwkqLS15eV9jcCA9IChjaGFyKSBjOworCisJKHl5dGV4dF9wdHIpID0geXlfYnA7CisJKHl5X2hvbGRfY2hhcikgPSAqeXlfY3A7CisJKHl5X2NfYnVmX3ApID0geXlfY3A7Cit9CisKKyNpZm5kZWYgWVlfTk9fSU5QVVQKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIHN0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCkKKyNlbHNlCisgICAgc3RhdGljIGludCBpbnB1dCAgKHZvaWQpCisjZW5kaWYKKworeworCWludCBjOworICAgIAorCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKworCWlmICggKih5eV9jX2J1Zl9wKSA9PSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQl7CisJCS8qIHl5X2NfYnVmX3Agbm93IHBvaW50cyB0byB0aGUgY2hhcmFjdGVyIHdlIHdhbnQgdG8gcmV0dXJuLgorCQkgKiBJZiB0aGlzIG9jY3VycyAqYmVmb3JlKiB0aGUgRU9CIGNoYXJhY3RlcnMsIHRoZW4gaXQncyBhCisJCSAqIHZhbGlkIE5VTDsgaWYgbm90LCB0aGVuIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSA8ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldICkKKwkJCS8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCSooeXlfY19idWZfcCkgPSAnXDAnOworCisJCWVsc2UKKwkJCXsgLyogbmVlZCBtb3JlIGlucHV0ICovCisJCQlpbnQgb2Zmc2V0ID0gKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpOworCQkJKysoeXlfY19idWZfcCk7CisKKwkJCXN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggICkgKQorCQkJCXsKKwkJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQkJLyogVGhpcyBoYXBwZW5zIGJlY2F1c2UgeXlfZ19uX2IoKQorCQkJCQkgKiBzZWVzIHRoYXQgd2UndmUgYWNjdW11bGF0ZWQgYQorCQkJCQkgKiB0b2tlbiBhbmQgZmxhZ3MgdGhhdCB3ZSBuZWVkIHRvCisJCQkJCSAqIHRyeSBtYXRjaGluZyB0aGUgdG9rZW4gYmVmb3JlCisJCQkJCSAqIHByb2NlZWRpbmcuICBCdXQgZm9yIGlucHV0KCksCisJCQkJCSAqIHRoZXJlJ3Mgbm8gbWF0Y2hpbmcgdG8gY29uc2lkZXIuCisJCQkJCSAqIFNvIGNvbnZlcnQgdGhlIEVPQl9BQ1RfTEFTVF9NQVRDSAorCQkJCQkgKiB0byBFT0JfQUNUX0VORF9PRl9GSUxFLgorCQkJCQkgKi8KKworCQkJCQkvKiBSZXNldCBidWZmZXIgc3RhdHVzLiAqLworCQkJCQl6Y29uZnJlc3RhcnQoemNvbmZpbiApOworCisJCQkJCS8qRkFMTFRIUk9VR0gqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggemNvbmZ3cmFwKCApICkKKwkJCQkJCXJldHVybiBFT0Y7CisKKwkJCQkJaWYgKCAhICh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KCk7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgb2Zmc2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHl5X2NfYnVmX3ApOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqKHl5X2NfYnVmX3ApID0gJ1wwJzsJLyogcHJlc2VydmUgemNvbmZ0ZXh0ICovCisJKHl5X2hvbGRfY2hhcikgPSAqKysoeXlfY19idWZfcCk7CisKKwlyZXR1cm4gYzsKK30KKyNlbmRpZgkvKiBpZm5kZWYgWVlfTk9fSU5QVVQgKi8KKworLyoqIEltbWVkaWF0ZWx5IHN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBzdHJlYW0uCisgKiBAcGFyYW0gaW5wdXRfZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgc3RhcnQgY29uZGl0aW9uIHRvIEBjIElOSVRJQUwgLgorICovCisgICAgdm9pZCB6Y29uZnJlc3RhcnQgIChGSUxFICogaW5wdXRfZmlsZSApCit7CisgICAgCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7CisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOworCX0KKworCXpjb25mX2luaXRfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLGlucHV0X2ZpbGUgKTsKKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IGlucHV0IGJ1ZmZlci4KKyAqIAorICovCisgICAgdm9pZCB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBuZXdfYnVmZmVyICkKK3sKKyAgICAKKwkvKiBUT0RPLiBXZSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgZW50aXJlIGZ1bmN0aW9uIGJvZHkKKwkgKiB3aXRoCisJICoJCXpjb25mcG9wX2J1ZmZlcl9zdGF0ZSgpOworCSAqCQl6Y29uZnB1c2hfYnVmZmVyX3N0YXRlKG5ld19idWZmZXIpOworICAgICAqLworCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSID09IG5ld19idWZmZXIgKQorCQlyZXR1cm47CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IHdoZXRoZXIgd2UgZGlkIHRoaXMgc3dpdGNoIGR1cmluZworCSAqIEVPRiAoemNvbmZ3cmFwKCkpIHByb2Nlc3NpbmcsIGJ1dCB0aGUgb25seSB0aW1lIHRoaXMgZmxhZworCSAqIGlzIGxvb2tlZCBhdCBpcyBhZnRlciB6Y29uZndyYXAoKSBpcyBjYWxsZWQsIHNvIGl0J3Mgc2FmZQorCSAqIHRvIGdvIGFoZWFkIGFuZCBhbHdheXMgc2V0IGl0LgorCSAqLworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfbG9hZF9idWZmZXJfc3RhdGUgICh2b2lkKQoreworICAgIAkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJKHl5dGV4dF9wdHIpID0gKHl5X2NfYnVmX3ApID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zOworCXpjb25maW4gPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGU7CisJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOworfQorCisvKiogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gaW5wdXQgYnVmZmVyIHN0YXRlLgorICogQHBhcmFtIGZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiBAcGFyYW0gc2l6ZSBUaGUgY2hhcmFjdGVyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBXaGVuIGluIGRvdWJ0LCB1c2UgQGMgWVlfQlVGX1NJWkUuCisgKiAKKyAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBidWZmZXIgc3RhdGUuCisgKi8KKyAgICBZWV9CVUZGRVJfU1RBVEUgemNvbmZfY3JlYXRlX2J1ZmZlciAgKEZJTEUgKiBmaWxlLCBpbnQgIHNpemUgKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworICAgIAorCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB6Y29uZmFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplOworCisJLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQorCSAqIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLgorCSAqLworCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHpjb25mYWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICApOworCWlmICggISBiLT55eV9jaF9idWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXpjb25mX2luaXRfYnVmZmVyKGIsZmlsZSApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBEZXN0cm95IHRoZSBidWZmZXIuCisgKiBAcGFyYW0gYiBhIGJ1ZmZlciBjcmVhdGVkIHdpdGggemNvbmZfY3JlYXRlX2J1ZmZlcigpCisgKiAKKyAqLworICAgIHZvaWQgemNvbmZfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKyAgICAKKwlpZiAoICEgYiApCisJCXJldHVybjsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApIC8qIE5vdCBzdXJlIGlmIHdlIHNob3VsZCBwb3AgaGVyZS4gKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gKFlZX0JVRkZFUl9TVEFURSkgMDsKKworCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCXpjb25mZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgICk7CisKKwl6Y29uZmZyZWUoKHZvaWQgKikgYiAgKTsKK30KKworLyogSW5pdGlhbGl6ZXMgb3IgcmVpbml0aWFsaXplcyBhIGJ1ZmZlci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgc29tZXRpbWVzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBidWZmZXIsCisgKiBzdWNoIGFzIGR1cmluZyBhIHpjb25mcmVzdGFydCgpIG9yIGF0IEVPRi4KKyAqLworICAgIHN0YXRpYyB2b2lkIHpjb25mX2luaXRfYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBiLCBGSUxFICogZmlsZSApCisKK3sKKwlpbnQgb2Vycm5vID0gZXJybm87CisgICAgCisJemNvbmZfZmx1c2hfYnVmZmVyKGIgKTsKKworCWItPnl5X2lucHV0X2ZpbGUgPSBmaWxlOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMTsKKworICAgIC8qIElmIGIgaXMgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVuIHpjb25mX2luaXRfYnVmZmVyIHdhcyBfcHJvYmFibHlfCisgICAgICogY2FsbGVkIGZyb20gemNvbmZyZXN0YXJ0KCkgb3IgdGhyb3VnaCB5eV9nZXRfbmV4dF9idWZmZXIuCisgICAgICogSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IHRoZSBsaW5lbm8gb3IgY29sdW1uLgorICAgICAqLworICAgIGlmIChiICE9IFlZX0NVUlJFTlRfQlVGRkVSKXsKKyAgICAgICAgYi0+eXlfYnNfbGluZW5vID0gMTsKKyAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKKyAgICB9CisKKyAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworICAgIAorCWVycm5vID0gb2Vycm5vOworfQorCisvKiogRGlzY2FyZCBhbGwgYnVmZmVyZWQgY2hhcmFjdGVycy4gT24gdGhlIG5leHQgc2NhbiwgWVlfSU5QVVQgd2lsbCBiZSBjYWxsZWQuCisgKiBAcGFyYW0gYiB0aGUgYnVmZmVyIHN0YXRlIHRvIGJlIGZsdXNoZWQsIHVzdWFsbHkgQGMgWVlfQ1VSUkVOVF9CVUZGRVIuCisgKiAKKyAqLworICAgIHZvaWQgemNvbmZfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQoreworICAgIAlpZiAoICEgYiApCisJCXJldHVybjsKKworCWItPnl5X25fY2hhcnMgPSAwOworCisJLyogV2UgYWx3YXlzIG5lZWQgdHdvIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4gIFRoZSBmaXJzdCBjYXVzZXMKKwkgKiBhIHRyYW5zaXRpb24gdG8gdGhlIGVuZC1vZi1idWZmZXIgc3RhdGUuICBUaGUgc2Vjb25kIGNhdXNlcworCSAqIGEgamFtIGluIHRoYXQgc3RhdGUuCisJICovCisJYi0+eXlfY2hfYnVmWzBdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCWItPnl5X2NoX2J1ZlsxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWItPnl5X2J1Zl9wb3MgPSAmYi0+eXlfY2hfYnVmWzBdOworCisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworfQorCisvKiogUHVzaGVzIHRoZSBuZXcgc3RhdGUgb250byB0aGUgc3RhY2suIFRoZSBuZXcgc3RhdGUgYmVjb21lcworICogIHRoZSBjdXJyZW50IHN0YXRlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlIHN0YWNrCisgKiAgaWYgbmVjZXNzYXJ5LgorICogIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgc3RhdGUuCisgKiAgCisgKi8KK3ZvaWQgemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKQoreworICAgIAlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2soKTsKKworCS8qIFRoaXMgYmxvY2sgaXMgY29waWVkIGZyb20gemNvbmZfc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCS8qIE9ubHkgcHVzaCBpZiB0b3AgZXhpc3RzLiBPdGhlcndpc2UsIHJlcGxhY2UgdG9wLiAqLworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikKKwkJKHl5X2J1ZmZlcl9zdGFja190b3ApKys7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKworCS8qIGNvcGllZCBmcm9tIHpjb25mX3N3aXRjaF90b19idWZmZXIuICovCisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworfQorCisvKiogUmVtb3ZlcyBhbmQgZGVsZXRlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgaWYgcHJlc2VudC4KKyAqICBUaGUgbmV4dCBlbGVtZW50IGJlY29tZXMgdGhlIG5ldyB0b3AuCisgKiAgCisgKi8KK3ZvaWQgemNvbmZwb3BfYnVmZmVyX3N0YXRlICh2b2lkKQoreworICAgIAlpZiAoIVlZX0NVUlJFTlRfQlVGRkVSKQorCQlyZXR1cm47CisKKwl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICk7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwlpZiAoKHl5X2J1ZmZlcl9zdGFja190b3ApID4gMCkKKwkJLS0oeXlfYnVmZmVyX3N0YWNrX3RvcCk7CisKKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpIHsKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKKwl9Cit9CisKKy8qIEFsbG9jYXRlcyB0aGUgc3RhY2sgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKiAgR3VhcmFudGVlcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIHB1c2guCisgKi8KK3N0YXRpYyB2b2lkIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAodm9pZCkKK3sKKwlpbnQgbnVtX3RvX2FsbG9jOworICAgIAorCWlmICghKHl5X2J1ZmZlcl9zdGFjaykpIHsKKworCQkvKiBGaXJzdCBhbGxvY2F0aW9uIGlzIGp1c3QgZm9yIDIgZWxlbWVudHMsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcworCQkgKiBzY2FubmVyIHdpbGwgZXZlbiBuZWVkIGEgc3RhY2suIFdlIHVzZSAyIGluc3RlYWQgb2YgMSB0byBhdm9pZCBhbgorCQkgKiBpbW1lZGlhdGUgcmVhbGxvYyBvbiB0aGUgbmV4dCBjYWxsLgorICAgICAgICAgKi8KKwkJbnVtX3RvX2FsbG9jID0gMTsKKwkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXpjb25mYWxsb2MKKwkJCQkJCQkJKG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJKTsKKwkJCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSwgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCQkJCisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwkJKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPj0gKCh5eV9idWZmZXJfc3RhY2tfbWF4KSkgLSAxKXsKKworCQkvKiBJbmNyZWFzZSB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIGEgcG9zc2libGUgcHVzaC4gKi8KKwkJaW50IGdyb3dfc2l6ZSA9IDggLyogYXJiaXRyYXJ5IGdyb3cgc2l6ZSAqLzsKKworCQludW1fdG9fYWxsb2MgPSAoeXlfYnVmZmVyX3N0YWNrX21heCkgKyBncm93X3NpemU7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZnJlYWxsb2MKKwkJCQkJCQkJKCh5eV9idWZmZXJfc3RhY2spLAorCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisKKwkJLyogemVybyBvbmx5IHRoZSBuZXcgc2xvdHMuKi8KKwkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spICsgKHl5X2J1ZmZlcl9zdGFja19tYXgpLCAwLCBncm93X3NpemUgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOworCX0KK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBkaXJlY3RseSBmcm9tIGEgdXNlci1zcGVjaWZpZWQgY2hhcmFjdGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBiYXNlIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4gCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J1ZmZlciAgKGNoYXIgKiBiYXNlLCB5eV9zaXplX3QgIHNpemUgKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworICAgIAorCWlmICggc2l6ZSA8IDIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0yXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0xXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQkvKiBUaGV5IGZvcmdvdCB0byBsZWF2ZSByb29tIGZvciB0aGUgRU9CJ3MuICovCisJCXJldHVybiAwOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHpjb25mYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9zY2FuX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplIC0gMjsJLyogIi0gMiIgdG8gdGFrZSBjYXJlIG9mIEVPQidzICovCisJYi0+eXlfYnVmX3BvcyA9IGItPnl5X2NoX2J1ZiA9IGJhc2U7CisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDA7CisJYi0+eXlfaW5wdXRfZmlsZSA9IDA7CisJYi0+eXlfbl9jaGFycyA9IGItPnl5X2J1Zl9zaXplOworCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCXpjb25mX3N3aXRjaF90b19idWZmZXIoYiAgKTsKKworCXJldHVybiBiOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHpjb25mbGV4KCkgd2lsbAorICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCisgKiBAcGFyYW0geXlzdHIgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2NhbgorICogCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqIEBub3RlIElmIHlvdSB3YW50IHRvIHNjYW4gYnl0ZXMgdGhhdCBtYXkgY29udGFpbiBOVUwgdmFsdWVzLCB0aGVuIHVzZQorICogICAgICAgemNvbmZfc2Nhbl9ieXRlcygpIGluc3RlYWQuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICogeXlzdHIgKQoreworICAgIAorCXJldHVybiB6Y29uZl9zY2FuX2J5dGVzKHl5c3RyLHN0cmxlbih5eXN0cikgKTsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiB0aGUgZ2l2ZW4gYnl0ZXMuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIGJ5dGVzLgorICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBzY2FuCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBhIGJ5dGVzLgorICogCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiB5eWJ5dGVzLCBpbnQgIF95eWJ5dGVzX2xlbiApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisJY2hhciAqYnVmOworCXl5X3NpemVfdCBuOworCWludCBpOworICAgIAorCS8qIEdldCBtZW1vcnkgZm9yIGZ1bGwgYnVmZmVyLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRyYWlsaW5nIEVPQidzLiAqLworCW4gPSBfeXlieXRlc19sZW4gKyAyOworCWJ1ZiA9IChjaGFyICopIHpjb25mYWxsb2MobiAgKTsKKwlpZiAoICEgYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOworCisJZm9yICggaSA9IDA7IGkgPCBfeXlieXRlc19sZW47ICsraSApCisJCWJ1ZltpXSA9IHl5Ynl0ZXNbaV07CisKKwlidWZbX3l5Ynl0ZXNfbGVuXSA9IGJ1ZltfeXlieXRlc19sZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliID0gemNvbmZfc2Nhbl9idWZmZXIoYnVmLG4gKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAiYmFkIGJ1ZmZlciBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7CisKKwkvKiBJdCdzIG9rYXkgdG8gZ3JvdyBldGMuIHRoaXMgYnVmZmVyLCBhbmQgd2Ugc2hvdWxkIHRocm93IGl0CisJICogYXdheSB3aGVuIHdlJ3JlIGRvbmUuCisJICovCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwlyZXR1cm4gYjsKK30KKworI2lmbmRlZiBZWV9FWElUX0ZBSUxVUkUKKyNkZWZpbmUgWVlfRVhJVF9GQUlMVVJFIDIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyKiBtc2cgKQoreworICAgIAkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOworCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOworfQorCisvKiBSZWRlZmluZSB5eWxlc3MoKSBzbyBpdCB3b3JrcyBpbiBzZWN0aW9uIDMgY29kZS4gKi8KKworI3VuZGVmIHl5bGVzcworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCXpjb25mdGV4dFt6Y29uZmxlbmddID0gKHl5X2hvbGRfY2hhcik7IFwKKwkJKHl5X2NfYnVmX3ApID0gemNvbmZ0ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAorCQkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7IFwKKwkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7IFwKKwkJemNvbmZsZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisvKiBBY2Nlc3NvciAgbWV0aG9kcyAoZ2V0L3NldCBmdW5jdGlvbnMpIHRvIHN0cnVjdCBtZW1iZXJzLiAqLworCisvKiogR2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogCisgKi8KK2ludCB6Y29uZmdldF9saW5lbm8gICh2b2lkKQoreworICAgICAgICAKKyAgICByZXR1cm4gemNvbmZsaW5lbm87Cit9CisKKy8qKiBHZXQgdGhlIGlucHV0IHN0cmVhbS4KKyAqIAorICovCitGSUxFICp6Y29uZmdldF9pbiAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZmluOworfQorCisvKiogR2V0IHRoZSBvdXRwdXQgc3RyZWFtLgorICogCisgKi8KK0ZJTEUgKnpjb25mZ2V0X291dCAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZm91dDsKK30KKworLyoqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICogCisgKi8KK2ludCB6Y29uZmdldF9sZW5nICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mbGVuZzsKK30KKworLyoqIEdldCB0aGUgY3VycmVudCB0b2tlbi4KKyAqIAorICovCisKK2NoYXIgKnpjb25mZ2V0X3RleHQgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZ0ZXh0OworfQorCisvKiogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogQHBhcmFtIGxpbmVfbnVtYmVyCisgKiAKKyAqLwordm9pZCB6Y29uZnNldF9saW5lbm8gKGludCAgbGluZV9udW1iZXIgKQoreworICAgIAorICAgIHpjb25mbGluZW5vID0gbGluZV9udW1iZXI7Cit9CisKKy8qKiBTZXQgdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjdXJyZW50CisgKiBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gaW5fc3RyIEEgcmVhZGFibGUgc3RyZWFtLgorICogCisgKiBAc2VlIHpjb25mX3N3aXRjaF90b19idWZmZXIKKyAqLwordm9pZCB6Y29uZnNldF9pbiAoRklMRSAqICBpbl9zdHIgKQoreworICAgICAgICB6Y29uZmluID0gaW5fc3RyIDsKK30KKwordm9pZCB6Y29uZnNldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciApCit7CisgICAgICAgIHpjb25mb3V0ID0gb3V0X3N0ciA7Cit9CisKK2ludCB6Y29uZmdldF9kZWJ1ZyAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZl9mbGV4X2RlYnVnOworfQorCit2b2lkIHpjb25mc2V0X2RlYnVnIChpbnQgIGJkZWJ1ZyApCit7CisgICAgICAgIHpjb25mX2ZsZXhfZGVidWcgPSBiZGVidWcgOworfQorCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCkKK3sKKyAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB6Y29uZmxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCisgICAgICovCisKKyAgICAoeXlfYnVmZmVyX3N0YWNrKSA9IDA7CisgICAgKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKKyAgICAoeXlfYnVmZmVyX3N0YWNrX21heCkgPSAwOworICAgICh5eV9jX2J1Zl9wKSA9IChjaGFyICopIDA7CisgICAgKHl5X2luaXQpID0gMDsKKyAgICAoeXlfc3RhcnQpID0gMDsKKworLyogRGVmaW5lZCBpbiBtYWluLmMgKi8KKyNpZmRlZiBZWV9TVERJTklUCisgICAgemNvbmZpbiA9IHN0ZGluOworICAgIHpjb25mb3V0ID0gc3Rkb3V0OworI2Vsc2UKKyAgICB6Y29uZmluID0gKEZJTEUgKikgMDsKKyAgICB6Y29uZm91dCA9IChGSUxFICopIDA7CisjZW5kaWYKKworICAgIC8qIEZvciBmdXR1cmUgcmVmZXJlbmNlOiBTZXQgZXJybm8gb24gZXJyb3IsIHNpbmNlIHdlIGFyZSBjYWxsZWQgYnkKKyAgICAgKiB6Y29uZmxleF9pbml0KCkKKyAgICAgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogemNvbmZsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCitpbnQgemNvbmZsZXhfZGVzdHJveSAgKHZvaWQpCit7CisgICAgCisgICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLworCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKKwkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAgKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJfQorCisJLyogRGVzdHJveSB0aGUgc3RhY2sgaXRzZWxmLiAqLworCXpjb25mZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOworCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKKworICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCisgICAgICogemNvbmZsZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCisgICAgeXlfaW5pdF9nbG9iYWxzKCApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLgorICovCisKKyNpZm5kZWYgeXl0ZXh0X3B0cgorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyKiBzMSwgeXljb25zdCBjaGFyICogczIsIGludCBuICkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisJCXMxW2ldID0gczJbaV07Cit9CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiBzICkKK3sKKwlyZWdpc3RlciBpbnQgbjsKKwlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKKwkJOworCisJcmV0dXJuIG47Cit9CisjZW5kaWYKKwordm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICBzaXplICkKK3sKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7Cit9CisKK3ZvaWQgKnpjb25mcmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJLyogVGhlIGNhc3QgdG8gKGNoYXIgKikgaW4gdGhlIGZvbGxvd2luZyBhY2NvbW1vZGF0ZXMgYm90aAorCSAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBjaGFyKiBnZW5lcmljIHBvaW50ZXJzLCBhbmQgdGhvc2UKKwkgKiB0aGF0IHVzZSB2b2lkKiBnZW5lcmljIHBvaW50ZXJzLiAgSXQgd29ya3Mgd2l0aCB0aGUgbGF0dGVyCisJICogYmVjYXVzZSBib3RoIEFOU0kgQyBhbmQgQysrIGFsbG93IGNhc3RsZXNzIGFzc2lnbm1lbnQgZnJvbQorCSAqIGFueSBwb2ludGVyIHR5cGUgdG8gdm9pZCosIGFuZCBkZWFsIHdpdGggYXJndW1lbnQgY29udmVyc2lvbnMKKwkgKiBhcyB0aG91Z2ggZG9pbmcgYW4gYXNzaWdubWVudC4KKwkgKi8KKwlyZXR1cm4gKHZvaWQgKikgcmVhbGxvYyggKGNoYXIgKikgcHRyLCBzaXplICk7Cit9CisKK3ZvaWQgemNvbmZmcmVlICh2b2lkICogcHRyICkKK3sKKwlmcmVlKCAoY2hhciAqKSBwdHIgKTsJLyogc2VlIHpjb25mcmVhbGxvYygpIGZvciAoY2hhciAqKSBjYXN0ICovCit9CisKKyNkZWZpbmUgWVlUQUJMRVNfTkFNRSAieXl0YWJsZXMiCisKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCit7CisJbmV3X3N0cmluZygpOworCWxhc3RfdHMgPSBmaXJzdF90cyA9IDA7CisJQkVHSU4oSEVMUCk7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCkKK3sKKwl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwlCRUdJTihJTklUSUFMKTsKK30KKworLyoKKyAqIFRyeSB0byBvcGVuIHNwZWNpZmllZCBmaWxlIHdpdGggZm9sbG93aW5nIG5hbWVzOgorICogLi9uYW1lCisgKiAkKHNyY3RyZWUpL25hbWUKKyAqIFRoZSBsYXR0ZXIgaXMgdXNlZCB3aGVuIHNyY3RyZWUgaXMgc2VwYXJhdGUgZnJvbSBvYmp0cmVlCisgKiB3aGVuIGNvbXBpbGluZyB0aGUga2VybmVsLgorICogUmV0dXJuIE5VTEwgaWYgZmlsZSBpcyBub3QgZm91bmQuCisgKi8KK0ZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqZW52LCBmdWxsbmFtZVtQQVRIX01BWCsxXTsKKwlGSUxFICpmOworCisJZiA9IGZvcGVuKG5hbWUsICJyIik7CisJaWYgKCFmICYmIG5hbWVbMF0gIT0gJy8nKSB7CisJCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwkJaWYgKGVudikgeworCQkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJCWYgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwkJfQorCX0KKwlyZXR1cm4gZjsKK30KKwordm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKQoreworCXpjb25maW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCJjYW4ndCBmaW5kIGZpbGUgJXNcbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKworCWN1cnJlbnRfYnVmID0gbWFsbG9jKHNpemVvZigqY3VycmVudF9idWYpKTsKKwltZW1zZXQoY3VycmVudF9idWYsIDAsIHNpemVvZigqY3VycmVudF9idWYpKTsKKworCWN1cnJlbnRfZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCWN1cnJlbnRfZmlsZS0+bGluZW5vID0gMTsKKwljdXJyZW50X2ZpbGUtPmZsYWdzID0gRklMRV9CVVNZOworfQorCit2b2lkIHpjb25mX25leHRmaWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwlzdHJ1Y3QgYnVmZmVyICpidWYgPSBtYWxsb2Moc2l6ZW9mKCpidWYpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCisJY3VycmVudF9idWYtPnN0YXRlID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisJemNvbmZpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICghemNvbmZpbikgeworCQlwcmludGYoIiVzOiVkOiBjYW4ndCBvcGVuIGZpbGUgXCIlc1wiXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcih6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUpKTsKKwlidWYtPnBhcmVudCA9IGN1cnJlbnRfYnVmOworCWN1cnJlbnRfYnVmID0gYnVmOworCisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9CVVNZKSB7CisJCXByaW50ZigicmVjdXJzaXZlIHNjYW4gKCVzKT9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX1NDQU5ORUQpIHsKKwkJcHJpbnRmKCJmaWxlICVzIGFscmVhZHkgc2Nhbm5lZD9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlmaWxlLT5mbGFncyB8PSBGSUxFX0JVU1k7CisJZmlsZS0+bGluZW5vID0gMTsKKwlmaWxlLT5wYXJlbnQgPSBjdXJyZW50X2ZpbGU7CisJY3VycmVudF9maWxlID0gZmlsZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kZmlsZSh2b2lkKQoreworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgfD0gRklMRV9TQ0FOTkVEOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgJj0gfkZJTEVfQlVTWTsKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoemNvbmZpbik7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKK30KKworaW50IHpjb25mX2xpbmVubyh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5saW5lbm87Cit9CisKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudF9wb3MuZmlsZSA/IGN1cnJlbnRfcG9zLmZpbGUtPm5hbWUgOiAiPG5vbmU+IjsKK30KKwpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvbGtjLmggYi90b3lib3gva2NvbmZpZy9sa2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYyOWZmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbGtjLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaWZuZGVmIExLQ19ICisjZGVmaW5lIExLQ19ICisKKy8vIE1ha2Ugc29tZSB3YXJuaW5ncyBnbyBhd2F5CisjZGVmaW5lIFlZRU5BQkxFX05MUyAwCisjZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTCAwCisKKyNpbmNsdWRlICJleHByLmgiCisKKyNpZm5kZWYgS0JVSUxEX05PX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKChjb25zdCBjaGFyICopIChNc2dpZCkpCisjIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpICgoY29uc3QgY2hhciAqKSAoRG9tYWlubmFtZSkpCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSAoKGNvbnN0IGNoYXIgKikgKERpcm5hbWUpKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIExLQ19ESVJFQ1RfTElOSworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlIG5hbWUgYXJnCisjZWxzZQorI2luY2x1ZGUgImxrY19kZWZzLmgiCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgKCpuYW1lICMjIF9wKSBhcmcKKyNlbmRpZgorI2luY2x1ZGUgImxrY19wcm90by5oIgorI3VuZGVmIFAKKworI2RlZmluZSBTUkNUUkVFICJzcmN0cmVlIgorCisjZGVmaW5lIFBBQ0tBR0UgImxpbnV4IgorI2RlZmluZSBMT0NBTEVESVIgIi91c3Ivc2hhcmUvbG9jYWxlIgorCisjZGVmaW5lIF8odGV4dCkgZ2V0dGV4dCh0ZXh0KQorI2RlZmluZSBOXyh0ZXh0KSAodGV4dCkKKworCisjZGVmaW5lIFRGX0NPTU1BTkQJMHgwMDAxCisjZGVmaW5lIFRGX1BBUkFNCTB4MDAwMgorI2RlZmluZSBURl9PUFRJT04JMHgwMDA0CisKKyNkZWZpbmUgVF9PUFRfTU9EVUxFUwkJMQorI2RlZmluZSBUX09QVF9ERUZDT05GSUdfTElTVAkyCisKK3N0cnVjdCBrY29uZl9pZCB7CisJaW50IG5hbWU7CisJaW50IHRva2VuOworCXVuc2lnbmVkIGludCBmbGFnczsKKwllbnVtIHN5bWJvbF90eXBlIHN0eXBlOworfTsKKworaW50IHpjb25mcGFyc2Uodm9pZCk7Cit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpOworCitleHRlcm4gaW50IHpjb25mZGVidWc7Cit2b2lkIHpjb25mX3N0YXJ0aGVscCh2b2lkKTsKK0ZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgemNvbmZfbGluZW5vKHZvaWQpOworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKTsKKworLyogY29uZmRhdGEuYyAqLworY2hhciAqY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSh2b2lkKTsKKworLyoga2NvbmZpZ19sb2FkLmMgKi8KK3ZvaWQga2NvbmZpZ19sb2FkKHZvaWQpOworCisvKiBtZW51LmMgKi8KK3ZvaWQgbWVudV9pbml0KHZvaWQpOworc3RydWN0IG1lbnUgKm1lbnVfYWRkX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfYWRkX2VudHJ5KHN0cnVjdCBzeW1ib2wgKnN5bSk7Cit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpOwordm9pZCBtZW51X2FkZF9kZXAoc3RydWN0IGV4cHIgKmRlcCk7CitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7CitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9hZGRfc3ltYm9sKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX29wdGlvbihpbnQgdG9rZW4sIGNoYXIgKmFyZyk7Cit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCk7Cit2b2lkIG1lbnVfc2V0X3R5cGUoaW50IHR5cGUpOworCisvKiB1dGlsLmMgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKTsKKworc3RydWN0IGdzdHIgeworCXNpemVfdCBsZW47CisJY2hhciAgKnM7Cit9Oworc3RydWN0IGdzdHIgc3RyX25ldyh2b2lkKTsKK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcyk7Cit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncyk7Cit2b2lkIHN0cl9hcHBlbmQoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpzKTsKK3ZvaWQgc3RyX3ByaW50ZihzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2NvbnN0IGNoYXIgKnN0cl9nZXQoc3RydWN0IGdzdHIgKmdzKTsKKworLyogc3ltYm9sLmMgKi8KK3ZvaWQgc3ltX2luaXQodm9pZCk7Cit2b2lkIHN5bV9jbGVhcl9hbGxfdmFsaWQodm9pZCk7Cit2b2lkIHN5bV9zZXRfYWxsX2NoYW5nZWQodm9pZCk7Cit2b2lkIHN5bV9zZXRfY2hhbmdlZChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBwcm9wZXJ0eSAqcHJvcF9hbGxvYyhlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCk7CisKK3N0YXRpYyBpbmxpbmUgdHJpc3RhdGUgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+Y3Vyci50cmk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ltYm9sICpzeW1fZ2V0X2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIChzdHJ1Y3Qgc3ltYm9sICopc3ltLT5jdXJyLnZhbDsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKmNoLCBzdHJ1Y3Qgc3ltYm9sICpjaHZhbCkKK3sKKwlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShjaHZhbCwgeWVzKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2Uoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRVZBTCA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19vcHRpb25hbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfT1BUSU9OQUwgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faGFzX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9ERUZfVVNFUiA/IHRydWUgOiBmYWxzZTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExLQ19IICovCmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3RveWJveC9rY29uZmlnL2xrY19wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjM3NDYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9sa2NfcHJvdG8uaApAQCAtMCwwICsxLDQyIEBACisKKy8qIGNvbmZkYXRhLmMgKi8KK1AoY29uZl9wYXJzZSx2b2lkLChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfcmVhZCxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl9yZWFkX3NpbXBsZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUsIGludCkpOworUChjb25mX3dyaXRlLGludCwoY29uc3QgY2hhciAqbmFtZSkpOworUChjb25mX3dyaXRlX2F1dG9jb25mLGludCwodm9pZCkpOworCisvKiBtZW51LmMgKi8KK1Aocm9vdG1lbnUsc3RydWN0IG1lbnUsKTsKKworUChtZW51X2lzX3Zpc2libGUsYm9vbCwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcHJvbXB0LGNvbnN0IGNoYXIgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcm9vdF9tZW51LHN0cnVjdCBtZW51ICosKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3BhcmVudF9tZW51LHN0cnVjdCBtZW51ICosKHN0cnVjdCBtZW51ICptZW51KSk7CisKKy8qIHN5bWJvbC5jICovCitQKHN5bWJvbF9oYXNoLHN0cnVjdCBzeW1ib2wgKixbU1lNQk9MX0hBU0hTSVpFXSk7CitQKHN5bV9jaGFuZ2VfY291bnQsaW50LCk7CisKK1Aoc3ltX2xvb2t1cCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpc2NvbnN0KSk7CitQKHN5bV9maW5kLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSkpOworUChzeW1fcmVfc2VhcmNoLHN0cnVjdCBzeW1ib2wgKiosKGNvbnN0IGNoYXIgKnBhdHRlcm4pKTsKK1Aoc3ltX3R5cGVfbmFtZSxjb25zdCBjaGFyICosKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkpOworUChzeW1fY2FsY192YWx1ZSx2b2lkLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF90eXBlLGVudW0gc3ltYm9sX3R5cGUsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSx0cmlzdGF0ZSB0cmkpKTsKK1Aoc3ltX3NldF90cmlzdGF0ZV92YWx1ZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sdHJpc3RhdGUgdHJpKSk7CitQKHN5bV90b2dnbGVfdHJpc3RhdGVfdmFsdWUsdHJpc3RhdGUsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fc3RyaW5nX3ZhbGlkLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKSk7CitQKHN5bV9zdHJpbmdfd2l0aGluX3JhbmdlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKSk7CitQKHN5bV9zZXRfc3RyaW5nX3ZhbHVlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKSk7CitQKHN5bV9pc19jaGFuZ2FibGUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfY2hvaWNlX3Byb3Asc3RydWN0IHByb3BlcnR5ICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X2RlZmF1bHRfcHJvcCxzdHJ1Y3QgcHJvcGVydHkgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfc3RyaW5nX3ZhbHVlLGNvbnN0IGNoYXIgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CisKK1AocHJvcF9nZXRfdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBwcm9wX3R5cGUgdHlwZSkpOworCisvKiBleHByLmMgKi8KK1AoZXhwcl9jb21wYXJlX3R5cGUsaW50LChlbnVtIGV4cHJfdHlwZSB0MSwgZW51bSBleHByX3R5cGUgdDIpKTsKK1AoZXhwcl9wcmludCx2b2lkLChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIHN0cnVjdCBzeW1ib2wgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikpOwpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OTk5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcKQEAgLTAsMCArMSw0IEBACitUaGlzIGlzIE5PVCB0aGUgb2ZmaWNpYWwgdmVyc2lvbiBvZiBkaWFsb2cuICBUaGlzIHZlcnNpb24gaGFzIGJlZW4KK3NpZ25pZmljYW50bHkgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwuICBJdCBpcyBmb3IgdXNlIGJ5IHRoZSBMaW51eAora2VybmVsIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgUGxlYXNlIGRvIG5vdCBib3RoZXIgU2F2aW8gTGFtIHdpdGggCitxdWVzdGlvbnMgYWJvdXQgdGhpcyBwcm9ncmFtLgpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2ggYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy9jaGVjay1seGRpYWxvZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjBkNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2gKQEAgLTAsMCArMSw4NCBAQAorIyEvYmluL3NoCisjIENoZWNrIG5jdXJzZXMgY29tcGF0aWJpbGl0eQorCisjIFdoYXQgbGlicmFyeSB0byBsaW5rCitsZGZsYWdzKCkKK3sKKwkkY2MgLXByaW50LWZpbGUtbmFtZT1saWJuY3Vyc2Vzdy5zbyB8IGdyZXAgLXEgLworCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQllY2hvICctbG5jdXJzZXN3JworCQlleGl0CisJZmkKKwkkY2MgLXByaW50LWZpbGUtbmFtZT1saWJuY3Vyc2VzLnNvIHwgZ3JlcCAtcSAvCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWVjaG8gJy1sbmN1cnNlcycKKwkJZXhpdAorCWZpCisJJGNjIC1wcmludC1maWxlLW5hbWU9bGliY3Vyc2VzLnNvIHwgZ3JlcCAtcSAvCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWVjaG8gJy1sY3Vyc2VzJworCQlleGl0CisJZmkKKwlleGl0IDEKK30KKworIyBXaGVyZSBpcyBuY3Vyc2VzLmg/CitjY2ZsYWdzKCkKK3sKKwlpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL25jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL2N1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzL2N1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IicKKwllbHNlCisJCWVjaG8gJy1EQ1VSU0VTX0xPQz0iPGN1cnNlcy5oPiInCisJZmkKK30KKworIyBUZW1wIGZpbGUsIHRyeSB0byBjbGVhbiB1cCBhZnRlciB1cwordG1wPS5seGRpYWxvZy50bXAKK3RyYXAgInJtIC1mICR0bXAiIDAgMSAyIDMgMTUKKworIyBDaGVjayBpZiB3ZSBjYW4gbGluayB0byBuY3Vyc2VzCitjaGVjaygpIHsKKwllY2hvICJtYWluKCkge30iIHwgJGNjIC14YyAtIC1vICR0bXAgMj4gL2Rldi9udWxsCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZWNobyAiICoqKiBVbmFibGUgdG8gZmluZCB0aGUgbmN1cnNlcyBsaWJyYXJpZXMuIiAgICAgICAgICAxPiYyCisJCWVjaG8gIiAqKiogbWFrZSBtZW51Y29uZmlnIHJlcXVpcmUgdGhlIG5jdXJzZXMgbGlicmFyaWVzIiAgMT4mMgorCQllY2hvICIgKioqICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkJZWNobyAiICoqKiBJbnN0YWxsIG5jdXJzZXMgKG5jdXJzZXMtZGV2ZWwpIGFuZCB0cnkgYWdhaW4iICAxPiYyCisJCWVjaG8gIiAqKiogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT4mMgorCQlleGl0IDEKKwlmaQorfQorCit1c2FnZSgpIHsKKwlwcmludGYgIlVzYWdlOiAkMCBbLWNoZWNrIGNvbXBpbGVyIG9wdGlvbnN8LWhlYWRlcnwtbGlicmFyeV1cbiIKK30KKworaWYgWyAkIyA9PSAwIF07IHRoZW4KKwl1c2FnZQorCWV4aXQgMQorZmkKKworY2M9IiIKK2Nhc2UgIiQxIiBpbgorCSItY2hlY2siKQorCQlzaGlmdAorCQljYz0iJEAiCisJCWNoZWNrCisJCTs7CisJIi1jY2ZsYWdzIikKKwkJY2NmbGFncworCQk7OworCSItbGRmbGFncyIpCisJCXNoaWZ0CisJCWNjPSIkQCIKKwkJbGRmbGFncworCQk7OworCSIqIikKKwkJdXNhZ2UKKwkJZXhpdCAxCisJCTs7Citlc2FjCmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYyBiL3RveWJveC9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjk3MDgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqICBjaGVja2xpc3QuYyAtLSBpbXBsZW1lbnRzIHRoZSBjaGVja2xpc3QgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICAgICBTdHVhcnQgSGVyYmVydCAtIFMuSGVyYmVydEBzaGVmZmllbGQuYWMudWs6IHJhZGlvbGlzdCBleHRlbnNpb24KKyAqICAgICBBbGVzc2FuZHJvIFJ1YmluaSAtIHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQ6IG1lcmdlZCB0aGUgdHdvCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgaW50IGxpc3Rfd2lkdGgsIGNoZWNrX3gsIGl0ZW1feDsKKworLyoKKyAqIFByaW50IGxpc3QgaXRlbQorICovCitzdGF0aWMgdm9pZCBwcmludF9pdGVtKFdJTkRPVyAqIHdpbiwgaW50IGNob2ljZSwgaW50IHNlbGVjdGVkKQoreworCWludCBpOworCisJLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIGxhc3QgaXRlbSAqLworCXdhdHRyc2V0KHdpbiwgZGxnLm1lbnVib3guYXRyKTsKKwl3bW92ZSh3aW4sIGNob2ljZSwgMCk7CisJZm9yIChpID0gMDsgaSA8IGxpc3Rfd2lkdGg7IGkrKykKKwkJd2FkZGNoKHdpbiwgJyAnKTsKKworCXdtb3ZlKHdpbiwgY2hvaWNlLCBjaGVja194KTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLmNoZWNrX3NlbGVjdGVkLmF0cgorCQkgOiBkbGcuY2hlY2suYXRyKTsKKwl3cHJpbnR3KHdpbiwgIiglYykiLCBpdGVtX2lzX3RhZygnWCcpID8gJ1gnIDogJyAnKTsKKworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBkbGcudGFnX3NlbGVjdGVkLmF0ciA6IGRsZy50YWcuYXRyKTsKKwltdndhZGRjaCh3aW4sIGNob2ljZSwgaXRlbV94LCBpdGVtX3N0cigpWzBdKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLml0ZW1fc2VsZWN0ZWQuYXRyIDogZGxnLml0ZW0uYXRyKTsKKwl3YWRkc3RyKHdpbiwgKGNoYXIgKilpdGVtX3N0cigpICsgMSk7CisJaWYgKHNlbGVjdGVkKSB7CisJCXdtb3ZlKHdpbiwgY2hvaWNlLCBjaGVja194ICsgMSk7CisJCXdyZWZyZXNoKHdpbik7CisJfQorfQorCisvKgorICogUHJpbnQgdGhlIHNjcm9sbCBpbmRpY2F0b3JzLgorICovCitzdGF0aWMgdm9pZCBwcmludF9hcnJvd3MoV0lORE9XICogd2luLCBpbnQgY2hvaWNlLCBpbnQgaXRlbV9ubywgaW50IHNjcm9sbCwKKwkgICAgIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCkKK3sKKwl3bW92ZSh3aW4sIHksIHgpOworCisJaWYgKHNjcm9sbCA+IDApIHsKKwkJd2F0dHJzZXQod2luLCBkbGcudWFycm93LmF0cik7CisJCXdhZGRjaCh3aW4sIEFDU19VQVJST1cpOworCQl3YWRkc3RyKHdpbiwgIigtKSIpOworCX0gZWxzZSB7CisJCXdhdHRyc2V0KHdpbiwgZGxnLm1lbnVib3guYXRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9CisKKwl5ID0geSArIGhlaWdodCArIDE7CisJd21vdmUod2luLCB5LCB4KTsKKworCWlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGNob2ljZSA8IGl0ZW1fbm8gLSAxKSkgeworCQl3YXR0cnNldCh3aW4sIGRsZy5kYXJyb3cuYXRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0RBUlJPVyk7CisJCXdhZGRzdHIod2luLCAiKCspIik7CisJfSBlbHNlIHsKKwkJd2F0dHJzZXQod2luLCBkbGcubWVudWJveF9ib3JkZXIuYXRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9Cit9CisKKy8qCisgKiAgRGlzcGxheSB0aGUgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZCBwcmludF9idXR0b25zKFdJTkRPVyAqIGRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IHggPSB3aWR0aCAvIDIgLSAxMTsKKwlpbnQgeSA9IGhlaWdodCAtIDI7CisKKwlwcmludF9idXR0b24oZGlhbG9nLCAiU2VsZWN0IiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBIZWxwICIsIHksIHggKyAxNCwgc2VsZWN0ZWQgPT0gMSk7CisKKwl3bW92ZShkaWFsb2csIHksIHggKyAxICsgMTQgKiBzZWxlY3RlZCk7CisJd3JlZnJlc2goZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IHdpdGggYSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgdHVybmVkIG9uIG9yIG9mZgorICogaW4gdGhlIHN0eWxlIG9mIHJhZGlvbGlzdCAob25seSBvbmUgb3B0aW9uIHR1cm5lZCBvbiBhdCBhIHRpbWUpLgorICovCitpbnQgZGlhbG9nX2NoZWNrbGlzdChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgICAgIGludCB3aWR0aCwgaW50IGxpc3RfaGVpZ2h0KQoreworCWludCBpLCB4LCB5LCBib3hfeCwgYm94X3k7CisJaW50IGtleSA9IDAsIGJ1dHRvbiA9IDAsIGNob2ljZSA9IDAsIHNjcm9sbCA9IDAsIG1heF9jaG9pY2U7CisJV0lORE9XICpkaWFsb2csICpsaXN0OworCisJLyogd2hpY2ggaXRlbSB0byBoaWdobGlnaHQgKi8KKwlpdGVtX2ZvcmVhY2goKSB7CisJCWlmIChpdGVtX2lzX3RhZygnWCcpKQorCQkJY2hvaWNlID0gaXRlbV9uKCk7CisJCWlmIChpdGVtX2lzX3NlbGVjdGVkKCkpIHsKKwkJCWNob2ljZSA9IGl0ZW1fbigpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvX3Jlc2l6ZToKKwlpZiAoZ2V0bWF4eShzdGRzY3IpIDwgKGhlaWdodCArIDYpKQorCQlyZXR1cm4gLUVSUkRJU1BMQVlUT09TTUFMTDsKKwlpZiAoZ2V0bWF4eChzdGRzY3IpIDwgKHdpZHRoICsgNikpCisJCXJldHVybiAtRVJSRElTUExBWVRPT1NNQUxMOworCisJbWF4X2Nob2ljZSA9IE1JTihsaXN0X2hlaWdodCwgaXRlbV9jb3VudCgpKTsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwKKwkJIGRsZy5kaWFsb2cuYXRyLCBkbGcuYm9yZGVyLmF0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBkbGcuYm9yZGVyLmF0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmRpYWxvZy5hdHIpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmRpYWxvZy5hdHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJbGlzdF93aWR0aCA9IHdpZHRoIC0gNjsKKwlib3hfeSA9IGhlaWdodCAtIGxpc3RfaGVpZ2h0IC0gNTsKKwlib3hfeCA9ICh3aWR0aCAtIGxpc3Rfd2lkdGgpIC8gMiAtIDE7CisKKwkvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIGxpc3QgKi8KKwlsaXN0ID0gc3Vid2luKGRpYWxvZywgbGlzdF9oZWlnaHQsIGxpc3Rfd2lkdGgsIHkgKyBib3hfeSArIDEsCisJICAgICAgICAgICAgICB4ICsgYm94X3ggKyAxKTsKKworCWtleXBhZChsaXN0LCBUUlVFKTsKKworCS8qIGRyYXcgYSBib3ggYXJvdW5kIHRoZSBsaXN0IGl0ZW1zICovCisJZHJhd19ib3goZGlhbG9nLCBib3hfeSwgYm94X3gsIGxpc3RfaGVpZ2h0ICsgMiwgbGlzdF93aWR0aCArIDIsCisJICAgICAgICAgZGxnLm1lbnVib3hfYm9yZGVyLmF0ciwgZGxnLm1lbnVib3guYXRyKTsKKworCS8qIEZpbmQgbGVuZ3RoIG9mIGxvbmdlc3QgaXRlbSBpbiBvcmRlciB0byBjZW50ZXIgY2hlY2tsaXN0ICovCisJY2hlY2tfeCA9IDA7CisJaXRlbV9mb3JlYWNoKCkKKwkJY2hlY2tfeCA9IE1BWChjaGVja194LCBzdHJsZW4oaXRlbV9zdHIoKSkgKyA0KTsKKworCWNoZWNrX3ggPSAobGlzdF93aWR0aCAtIGNoZWNrX3gpIC8gMjsKKwlpdGVtX3ggPSBjaGVja194ICsgNDsKKworCWlmIChjaG9pY2UgPj0gbGlzdF9oZWlnaHQpIHsKKwkJc2Nyb2xsID0gY2hvaWNlIC0gbGlzdF9oZWlnaHQgKyAxOworCQljaG9pY2UgLT0gc2Nyb2xsOworCX0KKworCS8qIFByaW50IHRoZSBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQlpdGVtX3NldChzY3JvbGwgKyBpKTsKKwkJcHJpbnRfaXRlbShsaXN0LCBpLCBpID09IGNob2ljZSk7CisJfQorCisJcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX2NvdW50KCksIHNjcm9sbCwKKwkJICAgICBib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCisJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJd25vdXRyZWZyZXNoKGxpc3QpOworCWRvdXBkYXRlKCk7CisKKwl3aGlsZSAoa2V5ICE9IEtFWV9FU0MpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQkJaXRlbV9zZXQoaSArIHNjcm9sbCk7CisJCQlpZiAodG91cHBlcihrZXkpID09IHRvdXBwZXIoaXRlbV9zdHIoKVswXSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IG1heF9jaG9pY2UgfHwga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04gfHwKKwkJICAgIGtleSA9PSAnKycgfHwga2V5ID09ICctJykgeworCQkJaWYgKGtleSA9PSBLRVlfVVAgfHwga2V5ID09ICctJykgeworCQkJCWlmICghY2hvaWNlKSB7CisJCQkJCWlmICghc2Nyb2xsKQorCQkJCQkJY29udGludWU7CisJCQkJCS8qIFNjcm9sbCBsaXN0IGRvd24gKi8KKwkJCQkJaWYgKGxpc3RfaGVpZ2h0ID4gMSkgeworCQkJCQkJLyogRGUtaGlnaGxpZ2h0IGN1cnJlbnQgZmlyc3QgaXRlbSAqLworCQkJCQkJaXRlbV9zZXQoc2Nyb2xsKTsKKwkJCQkJCXByaW50X2l0ZW0obGlzdCwgMCwgRkFMU0UpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgVFJVRSk7CisJCQkJCQl3c2NybChsaXN0LCAtMSk7CisJCQkJCQlzY3JvbGxvayhsaXN0LCBGQUxTRSk7CisJCQkJCX0KKwkJCQkJc2Nyb2xsLS07CisJCQkJCWl0ZW1fc2V0KHNjcm9sbCk7CisJCQkJCXByaW50X2l0ZW0obGlzdCwgMCwgVFJVRSk7CisJCQkJCXByaW50X2Fycm93cyhkaWFsb2csIGNob2ljZSwgaXRlbV9jb3VudCgpLAorCQkJCQkJICAgICBzY3JvbGwsIGJveF95LCBib3hfeCArIGNoZWNrX3ggKyA1LCBsaXN0X2hlaWdodCk7CisKKwkJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJCXdyZWZyZXNoKGxpc3QpOworCisJCQkJCWNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQkJCX0gZWxzZQorCQkJCQlpID0gY2hvaWNlIC0gMTsKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEtFWV9ET1dOIHx8IGtleSA9PSAnKycpIHsKKwkJCQlpZiAoY2hvaWNlID09IG1heF9jaG9pY2UgLSAxKSB7CisJCQkJCWlmIChzY3JvbGwgKyBjaG9pY2UgPj0gaXRlbV9jb3VudCgpIC0gMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBTY3JvbGwgbGlzdCB1cCAqLworCQkJCQlpZiAobGlzdF9oZWlnaHQgPiAxKSB7CisJCQkJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBsYXN0IGl0ZW0gYmVmb3JlIHNjcm9sbGluZyB1cCAqLworCQkJCQkJaXRlbV9zZXQoc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDEpOworCQkJCQkJcHJpbnRfaXRlbShsaXN0LAorCQkJCQkJCSAgICBtYXhfY2hvaWNlIC0gMSwKKwkJCQkJCQkgICAgRkFMU0UpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgVFJVRSk7CisJCQkJCQl3c2NybChsaXN0LCAxKTsKKwkJCQkJCXNjcm9sbG9rKGxpc3QsIEZBTFNFKTsKKwkJCQkJfQorCQkJCQlzY3JvbGwrKzsKKwkJCQkJaXRlbV9zZXQoc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDEpOworCQkJCQlwcmludF9pdGVtKGxpc3QsIG1heF9jaG9pY2UgLSAxLCBUUlVFKTsKKworCQkJCQlwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fY291bnQoKSwKKwkJCQkJCSAgICAgc2Nyb2xsLCBib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJCQkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJCQl3cmVmcmVzaChsaXN0KTsKKworCQkJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJCQl9IGVsc2UKKwkJCQkJaSA9IGNob2ljZSArIDE7CisJCQl9CisJCQlpZiAoaSAhPSBjaG9pY2UpIHsKKwkJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBpdGVtICovCisJCQkJaXRlbV9zZXQoc2Nyb2xsICsgY2hvaWNlKTsKKwkJCQlwcmludF9pdGVtKGxpc3QsIGNob2ljZSwgRkFMU0UpOworCQkJCS8qIEhpZ2hsaWdodCBuZXcgaXRlbSAqLworCQkJCWNob2ljZSA9IGk7CisJCQkJaXRlbV9zZXQoc2Nyb2xsICsgY2hvaWNlKTsKKwkJCQlwcmludF9pdGVtKGxpc3QsIGNob2ljZSwgVFJVRSk7CisJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJd3JlZnJlc2gobGlzdCk7CisJCQl9CisJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJfQorCQlzd2l0Y2ggKGtleSkgeworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJYnV0dG9uID0gMTsKKwkJCS8qIGZhbGwtdGhyb3VnaCAqLworCQljYXNlICdTJzoKKwkJY2FzZSAncyc6CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlpdGVtX2ZvcmVhY2goKQorCQkJCWl0ZW1fc2V0X3NlbGVjdGVkKDApOworCQkJaXRlbV9zZXQoc2Nyb2xsICsgY2hvaWNlKTsKKwkJCWl0ZW1fc2V0X3NlbGVjdGVkKDEpOworCQkJZGVsd2luKGxpc3QpOworCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gYnV0dG9uOworCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkKKwkJCSAgICA/IDEgOiAoYnV0dG9uID4gMSA/IDAgOiBidXR0b24pOworCisJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnWCc6CisJCWNhc2UgJ3gnOgorCQkJa2V5ID0gS0VZX0VTQzsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FU0M6CisJCQlrZXkgPSBvbl9rZXlfZXNjKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfUkVTSVpFOgorCQkJZGVsd2luKGxpc3QpOworCQkJZGVsd2luKGRpYWxvZyk7CisJCQlvbl9rZXlfcmVzaXplKCk7CisJCQlnb3RvIGRvX3Jlc2l6ZTsKKwkJfQorCisJCS8qIE5vdywgdXBkYXRlIGV2ZXJ5dGhpbmcuLi4gKi8KKwkJZG91cGRhdGUoKTsKKwl9CisJZGVsd2luKGxpc3QpOworCWRlbHdpbihkaWFsb2cpOworCXJldHVybiBrZXk7CQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmggYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy9kaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDY5NWUxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiAgZGlhbG9nLmggLS0gY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGRpYWxvZyBtb2R1bGVzCisgKgorICogIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19zdW5fXworI2RlZmluZSBDVVJTX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSBDVVJTRVNfTE9DCisKKy8qCisgKiBDb2xvcnMgaW4gbmN1cnNlcyAxLjkuOWUgZG8gbm90IHdvcmsgcHJvcGVybHkgc2luY2UgZm9yZWdyb3VuZCBhbmQKKyAqIGJhY2tncm91bmQgY29sb3JzIGFyZSBPUidkIHJhdGhlciB0aGFuIHNlcGFyYXRlbHkgbWFza2VkLiAgVGhpcyB2ZXJzaW9uCisgKiBvZiBkaWFsb2cgd2FzIGhhY2tlZCB0byB3b3JrIHdpdGggbmN1cnNlcyAxLjkuOWUsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUKKyAqIHdpdGggc3RhbmRhcmQgY3Vyc2VzLiAgVGhlIHNpbXBsZXN0IGZpeCAodG8gbWFrZSB0aGlzIHdvcmsgd2l0aCBzdGFuZGFyZAorICogY3Vyc2VzKSB1c2VzIHRoZSB3YmtnZHNldCgpIGZ1bmN0aW9uLCBub3QgdXNlZCBpbiB0aGUgb3JpZ2luYWwgaGFjay4KKyAqIFR1cm4gaXQgb2ZmIGlmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggMS45LjllLCBzaW5jZSBpdCBqdXN0IGNvbmZ1c2VzIHRoaW5ncy4KKyAqLworI2lmIGRlZmluZWQoTkNVUlNFU19WRVJTSU9OKSAmJiBkZWZpbmVkKF9ORUVEX1dSQVApICYmICFkZWZpbmVkKEdDQ19QUklOVEZMSUtFKQorI2RlZmluZSBPTERfTkNVUlNFUyAxCisjdW5kZWYgIHdia2dkc2V0CisjZGVmaW5lIHdia2dkc2V0KHcscCkJCS8qbm90aGluZyAqLworI2Vsc2UKKyNkZWZpbmUgT0xEX05DVVJTRVMgMAorI2VuZGlmCisKKyNkZWZpbmUgVFIocGFyYW1zKSBfdHJhY2VmIHBhcmFtcworCisjZGVmaW5lIEtFWV9FU0MgMjcKKyNkZWZpbmUgVEFCIDkKKyNkZWZpbmUgTUFYX0xFTiAyMDQ4CisjZGVmaW5lIEJVRl9TSVpFICgxMCoxMDI0KQorI2RlZmluZSBNSU4oeCx5KSAoeCA8IHkgPyB4IDogeSkKKyNkZWZpbmUgTUFYKHgseSkgKHggPiB5ID8geCA6IHkpCisKKyNpZm5kZWYgQUNTX1VMQ09STkVSCisjZGVmaW5lIEFDU19VTENPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTExDT1JORVIKKyNkZWZpbmUgQUNTX0xMQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19VUkNPUk5FUgorI2RlZmluZSBBQ1NfVVJDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xSQ09STkVSCisjZGVmaW5lIEFDU19MUkNPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfSExJTkUKKyNkZWZpbmUgQUNTX0hMSU5FICctJworI2VuZGlmCisjaWZuZGVmIEFDU19WTElORQorI2RlZmluZSBBQ1NfVkxJTkUgJ3wnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xURUUKKyNkZWZpbmUgQUNTX0xURUUgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1JURUUKKyNkZWZpbmUgQUNTX1JURUUgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1VBUlJPVworI2RlZmluZSBBQ1NfVUFSUk9XICdeJworI2VuZGlmCisjaWZuZGVmIEFDU19EQVJST1cKKyNkZWZpbmUgQUNTX0RBUlJPVyAndicKKyNlbmRpZgorCisvKiBlcnJvciByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgRVJSRElTUExBWVRPT1NNQUxMIChLRVlfTUFYICsgMSkKKworLyoKKyAqICAgQ29sb3IgZGVmaW5pdGlvbnMKKyAqLworc3RydWN0IGRpYWxvZ19jb2xvciB7CisJY2h0eXBlIGF0cjsJLyogQ29sb3IgYXR0cmlidXRlICovCisJaW50IGZnOwkJLyogZm9yZWdyb3VuZCAqLworCWludCBiZzsJCS8qIGJhY2tncm91bmQgKi8KKwlpbnQgaGw7CQkvKiBoaWdobGlnaHQgdGhpcyBpdGVtICovCit9OworCitzdHJ1Y3QgZGlhbG9nX2luZm8geworCWNvbnN0IGNoYXIgKmJhY2t0aXRsZTsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHNjcmVlbjsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHNoYWRvdzsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGRpYWxvZzsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHRpdGxlOworCXN0cnVjdCBkaWFsb2dfY29sb3IgYm9yZGVyOworCXN0cnVjdCBkaWFsb2dfY29sb3IgYnV0dG9uX2FjdGl2ZTsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGJ1dHRvbl9pbmFjdGl2ZTsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGJ1dHRvbl9rZXlfYWN0aXZlOworCXN0cnVjdCBkaWFsb2dfY29sb3IgYnV0dG9uX2tleV9pbmFjdGl2ZTsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGJ1dHRvbl9sYWJlbF9hY3RpdmU7CisJc3RydWN0IGRpYWxvZ19jb2xvciBidXR0b25fbGFiZWxfaW5hY3RpdmU7CisJc3RydWN0IGRpYWxvZ19jb2xvciBpbnB1dGJveDsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGlucHV0Ym94X2JvcmRlcjsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHNlYXJjaGJveDsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHNlYXJjaGJveF90aXRsZTsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHNlYXJjaGJveF9ib3JkZXI7CisJc3RydWN0IGRpYWxvZ19jb2xvciBwb3NpdGlvbl9pbmRpY2F0b3I7CisJc3RydWN0IGRpYWxvZ19jb2xvciBtZW51Ym94OworCXN0cnVjdCBkaWFsb2dfY29sb3IgbWVudWJveF9ib3JkZXI7CisJc3RydWN0IGRpYWxvZ19jb2xvciBpdGVtOworCXN0cnVjdCBkaWFsb2dfY29sb3IgaXRlbV9zZWxlY3RlZDsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHRhZzsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHRhZ19zZWxlY3RlZDsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHRhZ19rZXk7CisJc3RydWN0IGRpYWxvZ19jb2xvciB0YWdfa2V5X3NlbGVjdGVkOworCXN0cnVjdCBkaWFsb2dfY29sb3IgY2hlY2s7CisJc3RydWN0IGRpYWxvZ19jb2xvciBjaGVja19zZWxlY3RlZDsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIHVhcnJvdzsKKwlzdHJ1Y3QgZGlhbG9nX2NvbG9yIGRhcnJvdzsKK307CisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGlhbG9nX2luZm8gZGxnOworZXh0ZXJuIGNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFtdOworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICovCisKKy8qIGl0ZW0gbGlzdCBhcyB1c2VkIGJ5IGNoZWNrbGlzdCBhbmQgbWVudWJveCAqLwordm9pZCBpdGVtX3Jlc2V0KHZvaWQpOwordm9pZCBpdGVtX21ha2UoY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBpdGVtX2FkZF9zdHIoY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBpdGVtX3NldF90YWcoY2hhciB0YWcpOwordm9pZCBpdGVtX3NldF9kYXRhKHZvaWQgKnApOwordm9pZCBpdGVtX3NldF9zZWxlY3RlZChpbnQgdmFsKTsKK2ludCBpdGVtX2FjdGl2YXRlX3NlbGVjdGVkKHZvaWQpOwordm9pZCAqaXRlbV9kYXRhKHZvaWQpOworY2hhciBpdGVtX3RhZyh2b2lkKTsKKworLyogaXRlbSBsaXN0IG1hbmlwdWxhdGlvbiBmb3IgbHhkaWFsb2cgdXNlICovCisjZGVmaW5lIE1BWElURU1TVFIgMjAwCitzdHJ1Y3QgZGlhbG9nX2l0ZW0geworCWNoYXIgc3RyW01BWElURU1TVFJdOwkvKiBwcm9tdHAgZGlzcGxheWVkICovCisJY2hhciB0YWc7CisJdm9pZCAqZGF0YTsJLyogcG9pbnRlciB0byBtZW51IGl0ZW0gLSB1c2VkIGJ5IG1lbnVib3grY2hlY2tsaXN0ICovCisJaW50IHNlbGVjdGVkOwkvKiBTZXQgdG8gMSBieSBkaWFsb2dfKigpIGZ1bmN0aW9uIGlmIHNlbGVjdGVkLiAqLworfTsKKworLyogbGlzdCBvZiBsaWFsb2dfaXRlbXMgKi8KK3N0cnVjdCBkaWFsb2dfbGlzdCB7CisJc3RydWN0IGRpYWxvZ19pdGVtIG5vZGU7CisJc3RydWN0IGRpYWxvZ19saXN0ICpuZXh0OworfTsKKworZXh0ZXJuIHN0cnVjdCBkaWFsb2dfbGlzdCAqaXRlbV9jdXI7CitleHRlcm4gc3RydWN0IGRpYWxvZ19saXN0IGl0ZW1fbmlsOworZXh0ZXJuIHN0cnVjdCBkaWFsb2dfbGlzdCAqaXRlbV9oZWFkOworCitpbnQgaXRlbV9jb3VudCh2b2lkKTsKK3ZvaWQgaXRlbV9zZXQoaW50IG4pOworaW50IGl0ZW1fbih2b2lkKTsKK2NvbnN0IGNoYXIgKml0ZW1fc3RyKHZvaWQpOworaW50IGl0ZW1faXNfc2VsZWN0ZWQodm9pZCk7CitpbnQgaXRlbV9pc190YWcoY2hhciB0YWcpOworI2RlZmluZSBpdGVtX2ZvcmVhY2goKSBcCisJZm9yIChpdGVtX2N1ciA9IGl0ZW1faGVhZCA/IGl0ZW1faGVhZDogaXRlbV9jdXI7IFwKKwkgICAgIGl0ZW1fY3VyICYmIChpdGVtX2N1ciAhPSAmaXRlbV9uaWwpOyBpdGVtX2N1ciA9IGl0ZW1fY3VyLT5uZXh0KQorCisvKiBnZW5lcmljIGtleSBoYW5kbGVycyAqLworaW50IG9uX2tleV9lc2MoV0lORE9XICp3aW4pOworaW50IG9uX2tleV9yZXNpemUodm9pZCk7CisKK3ZvaWQgaW5pdF9kaWFsb2coY29uc3QgY2hhciAqYmFja3RpdGxlKTsKK3ZvaWQgcmVzZXRfZGlhbG9nKHZvaWQpOwordm9pZCBlbmRfZGlhbG9nKHZvaWQpOwordm9pZCBhdHRyX2NsZWFyKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cik7Cit2b2lkIGRpYWxvZ19jbGVhcih2b2lkKTsKK3ZvaWQgcHJpbnRfYXV0b3dyYXAoV0lORE9XICogd2luLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB3aWR0aCwgaW50IHksIGludCB4KTsKK3ZvaWQgcHJpbnRfYnV0dG9uKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKTsKK3ZvaWQgcHJpbnRfdGl0bGUoV0lORE9XICpkaWFsb2csIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgd2lkdGgpOwordm9pZCBkcmF3X2JveChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYm94LAorCSAgICAgIGNodHlwZSBib3JkZXIpOwordm9pZCBkcmF3X3NoYWRvdyhXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKKworaW50IGZpcnN0X2FscGhhKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZXhlbXB0KTsKK2ludCBkaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK2ludCBkaWFsb2dfbXNnYm94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgaW50IHdpZHRoLCBpbnQgcGF1c2UpOworaW50IGRpYWxvZ190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworaW50IGRpYWxvZ19tZW51KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsCisJCWNvbnN0IHZvaWQgKnNlbGVjdGVkLCBpbnQgKnNfc2Nyb2xsKTsKK2ludCBkaWFsb2dfY2hlY2tsaXN0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgICAgaW50IHdpZHRoLCBpbnQgbGlzdF9oZWlnaHQpOworZXh0ZXJuIGNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFtdOworaW50IGRpYWxvZ19pbnB1dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgICAgaW50IHdpZHRoLCBjb25zdCBjaGFyICppbml0KTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGJhc2UgZm9yIGZpY3RpdGlvdXMga2V5cywgd2hpY2ggYWN0aXZhdGUKKyAqIHRoZSBidXR0b25zLgorICoKKyAqIE1vdXNlLWdlbmVyYXRlZCBrZXlzIGFyZSB0aGUgZm9sbG93aW5nOgorICogICAtLSB0aGUgZmlyc3QgMzIgYXJlIHVzZWQgYXMgbnVtYmVycywgaW4gYWRkaXRpb24gdG8gJzAnLSc5JworICogICAtLSB0aGUgbG93ZXJjYXNlIGFyZSB1c2VkIHRvIHNpZ25hbCBtb3VzZS1lbnRlciBldmVudHMgKE1fRVZFTlQgKyAnbycpCisgKiAgIC0tIHVwcGVyY2FzZSBjaGFycyBhcmUgdXNlZCB0byBpbnZva2UgdGhlIGJ1dHRvbiAoTV9FVkVOVCArICdPJykKKyAqLworI2RlZmluZSBNX0VWRU5UIChLRVlfTUFYKzEpCmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9seGRpYWxvZy9pbnB1dGJveC5jIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvaW5wdXRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU3MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvaW5wdXRib3guYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqICBpbnB1dGJveC5jIC0tIGltcGxlbWVudHMgdGhlIGlucHV0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbTUFYX0xFTiArIDFdOworCisvKgorICogIFByaW50IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDExOworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbihkaWFsb2csICIgIE9rICAiLCB5LCB4LCBzZWxlY3RlZCA9PSAwKTsKKwlwcmludF9idXR0b24oZGlhbG9nLCAiIEhlbHAgIiwgeSwgeCArIDE0LCBzZWxlY3RlZCA9PSAxKTsKKworCXdtb3ZlKGRpYWxvZywgeSwgeCArIDEgKyAxNCAqIHNlbGVjdGVkKTsKKwl3cmVmcmVzaChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggZm9yIGlucHV0aW5nIGEgc3RyaW5nCisgKi8KK2ludCBkaWFsb2dfaW5wdXRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0KQoreworCWludCBpLCB4LCB5LCBib3hfeSwgYm94X3gsIGJveF93aWR0aDsKKwlpbnQgaW5wdXRfeCA9IDAsIHNjcm9sbCA9IDAsIGtleSA9IDAsIGJ1dHRvbiA9IC0xOworCWNoYXIgKmluc3RyID0gZGlhbG9nX2lucHV0X3Jlc3VsdDsKKwlXSU5ET1cgKmRpYWxvZzsKKworCWlmICghaW5pdCkKKwkJaW5zdHJbMF0gPSAnXDAnOworCWVsc2UKKwkJc3RyY3B5KGluc3RyLCBpbml0KTsKKworZG9fcmVzaXplOgorCWlmIChnZXRtYXh5KHN0ZHNjcikgPD0gKGhlaWdodCAtIDIpKQorCQlyZXR1cm4gLUVSUkRJU1BMQVlUT09TTUFMTDsKKwlpZiAoZ2V0bWF4eChzdGRzY3IpIDw9ICh3aWR0aCAtIDIpKQorCQlyZXR1cm4gLUVSUkRJU1BMQVlUT09TTUFMTDsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwKKwkJIGRsZy5kaWFsb2cuYXRyLCBkbGcuYm9yZGVyLmF0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBkbGcuYm9yZGVyLmF0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmRpYWxvZy5hdHIpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmRpYWxvZy5hdHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJLyogRHJhdyB0aGUgaW5wdXQgZmllbGQgYm94ICovCisJYm94X3dpZHRoID0gd2lkdGggLSA2OworCWdldHl4KGRpYWxvZywgeSwgeCk7CisJYm94X3kgPSB5ICsgMjsKKwlib3hfeCA9ICh3aWR0aCAtIGJveF93aWR0aCkgLyAyOworCWRyYXdfYm94KGRpYWxvZywgeSArIDEsIGJveF94IC0gMSwgMywgYm94X3dpZHRoICsgMiwKKwkJIGRsZy5ib3JkZXIuYXRyLCBkbGcuZGlhbG9nLmF0cik7CisKKwlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKwkvKiBTZXQgdXAgdGhlIGluaXRpYWwgdmFsdWUgKi8KKwl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCk7CisJd2F0dHJzZXQoZGlhbG9nLCBkbGcuaW5wdXRib3guYXRyKTsKKworCWlucHV0X3ggPSBzdHJsZW4oaW5zdHIpOworCisJaWYgKGlucHV0X3ggPj0gYm94X3dpZHRoKSB7CisJCXNjcm9sbCA9IGlucHV0X3ggLSBib3hfd2lkdGggKyAxOworCQlpbnB1dF94ID0gYm94X3dpZHRoIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IGJveF93aWR0aCAtIDE7IGkrKykKKwkJCXdhZGRjaChkaWFsb2csIGluc3RyW3Njcm9sbCArIGldKTsKKwl9IGVsc2UgeworCQl3YWRkc3RyKGRpYWxvZywgaW5zdHIpOworCX0KKworCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisKKwl3cmVmcmVzaChkaWFsb2cpOworCisJd2hpbGUgKGtleSAhPSBLRVlfRVNDKSB7CisJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCisJCWlmIChidXR0b24gPT0gLTEpIHsJLyogSW5wdXQgYm94IHNlbGVjdGVkICovCisJCQlzd2l0Y2ggKGtleSkgeworCQkJY2FzZSBUQUI6CisJCQljYXNlIEtFWV9VUDoKKwkJCWNhc2UgS0VZX0RPV046CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWV9MRUZUOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBLRVlfUklHSFQ6CisJCQkJY29udGludWU7CisJCQljYXNlIEtFWV9CQUNLU1BBQ0U6CisJCQljYXNlIDEyNzoKKwkJCQlpZiAoaW5wdXRfeCB8fCBzY3JvbGwpIHsKKwkJCQkJd2F0dHJzZXQoZGlhbG9nLCBkbGcuaW5wdXRib3guYXRyKTsKKwkJCQkJaWYgKCFpbnB1dF94KSB7CisJCQkJCQlzY3JvbGwgPSBzY3JvbGwgPCBib3hfd2lkdGggLSAxID8gMCA6IHNjcm9sbCAtIChib3hfd2lkdGggLSAxKTsKKwkJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGg7IGkrKykKKwkJCQkJCQl3YWRkY2goZGlhbG9nLAorCQkJCQkJCSAgICAgICBpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgaV0gPworCQkJCQkJCSAgICAgICBpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgaV0gOiAnICcpOworCQkJCQkJaW5wdXRfeCA9IHN0cmxlbihpbnN0cikgLSBzY3JvbGw7CisJCQkJCX0gZWxzZQorCQkJCQkJaW5wdXRfeC0tOworCQkJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94XSA9ICdcMCc7CisJCQkJCW12d2FkZGNoKGRpYWxvZywgYm94X3ksIGlucHV0X3ggKyBib3hfeCwgJyAnKTsKKwkJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgaW5wdXRfeCArIGJveF94KTsKKwkJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQlkZWZhdWx0OgorCQkJCWlmIChrZXkgPCAweDEwMCAmJiBpc3ByaW50KGtleSkpIHsKKwkJCQkJaWYgKHNjcm9sbCArIGlucHV0X3ggPCBNQVhfTEVOKSB7CisJCQkJCQl3YXR0cnNldChkaWFsb2csIGRsZy5pbnB1dGJveC5hdHIpOworCQkJCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeF0gPSBrZXk7CisJCQkJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgMV0gPSAnXDAnOworCQkJCQkJaWYgKGlucHV0X3ggPT0gYm94X3dpZHRoIC0gMSkgeworCQkJCQkJCXNjcm9sbCsrOworCQkJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoIC0gMTsgaSsrKQorCQkJCQkJCQl3YWRkY2goZGlhbG9nLCBpbnN0ciBbc2Nyb2xsICsgaV0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl3bW92ZShkaWFsb2csIGJveF95LCBpbnB1dF94KysgKyBib3hfeCk7CisJCQkJCQkJd2FkZGNoKGRpYWxvZywga2V5KTsKKwkJCQkJCX0KKwkJCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQkJCX0gZWxzZQorCQkJCQkJZmxhc2goKTsJLyogQWxhcm0gdXNlciBhYm91dCBvdmVyZmxvdyAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnTyc6CisJCWNhc2UgJ28nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBLRVlfVVA6CisJCWNhc2UgS0VZX0xFRlQ6CisJCQlzd2l0Y2ggKGJ1dHRvbikgeworCQkJY2FzZSAtMToKKwkJCQlidXR0b24gPSAxOwkvKiBJbmRpY2F0ZXMgIkNhbmNlbCIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWJ1dHRvbiA9IC0xOwkvKiBJbmRpY2F0ZXMgaW5wdXQgYm94IGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlidXR0b24gPSAwOwkvKiBJbmRpY2F0ZXMgIk9LIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUQUI6CisJCWNhc2UgS0VZX0RPV046CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJc3dpdGNoIChidXR0b24pIHsKKwkJCWNhc2UgLTE6CisJCQkJYnV0dG9uID0gMDsJLyogSW5kaWNhdGVzICJPSyIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWJ1dHRvbiA9IDE7CS8qIEluZGljYXRlcyAiQ2FuY2VsIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJYnV0dG9uID0gLTE7CS8qIEluZGljYXRlcyBpbnB1dCBib3ggaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAoYnV0dG9uID09IC0xID8gMCA6IGJ1dHRvbik7CisJCWNhc2UgJ1gnOgorCQljYXNlICd4JzoKKwkJCWtleSA9IEtFWV9FU0M7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfRVNDOgorCQkJa2V5ID0gb25fa2V5X2VzYyhkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX1JFU0laRToKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJb25fa2V5X3Jlc2l6ZSgpOworCQkJZ290byBkb19yZXNpemU7CisJCX0KKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZXR1cm4gS0VZX0VTQzsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MzE1OQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYwpAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqICBtZW51Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgbWVudSBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIENoYW5nZXMgYnkgQ2xpZmZvcmQgV29sZiAoZ29kQGNsaWZmb3JkLmF0KQorICoKKyAqICBbIDE5OTgtMDYtMTMgXQorICoKKyAqICAgICopICBBIGJ1Z2ZpeCBmb3IgdGhlIFBhZ2UtRG93biBwcm9ibGVtCisgKgorICogICAgKikgIEZvcm1lcmx5IHdoZW4gSSB1c2VkIFBhZ2UgRG93biBhbmQgUGFnZSBVcCwgdGhlIGN1cnNvciB3b3VsZCBiZSBzZXQgCisgKiAgICAgICAgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBtZW51IGJveC4gIE5vdyBseGRpYWxvZyBpcyBhIGJpdAorICogICAgICAgIHNtYXJ0ZXIgYW5kIHdvcmtzIG1vcmUgbGlrZSBvdGhlciBtZW51IHN5c3RlbXMgKGp1c3QgaGF2ZSBhIGxvb2sgYXQKKyAqICAgICAgICBpdCkuCisgKgorICogICAgKikgIEZvcm1lcmx5IGlmIEkgc2VsZWN0ZWQgc29tZXRoaW5nIG15IHNjcm9sbGluZyB3b3VsZCBiZSBicm9rZW4gYmVjYXVzZQorICogICAgICAgIGx4ZGlhbG9nIGlzIHJlLWludm9rZWQgYnkgdGhlIE1lbnVjb25maWcgc2hlbGwgc2NyaXB0LCBjYW4ndAorICogICAgICAgIHJlbWVtYmVyIHRoZSBsYXN0IHNjcm9sbGluZyBwb3NpdGlvbiwgYW5kIGp1c3Qgc2V0cyBpdCBzbyB0aGF0IHRoZQorICogICAgICAgIGN1cnNvciBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBib3guICBOb3cgaXQgd3JpdGVzIHRoZSB0ZW1wb3JhcnkgZmlsZQorICogICAgICAgIGx4ZGlhbG9nLnNjcmx0bXAgd2hpY2ggY29udGFpbnMgdGhpcyBpbmZvcm1hdGlvbi4gVGhlIGZpbGUgaXMKKyAqICAgICAgICBkZWxldGVkIGJ5IGx4ZGlhbG9nIGlmIHRoZSB1c2VyIGxlYXZlcyBhIHN1Ym1lbnUgb3IgZW50ZXJzIGEgbmV3CisgKiAgICAgICAgb25lLCBidXQgaXQgd291bGQgYmUgbmljZSBpZiBNZW51Y29uZmlnIGNvdWxkIG1ha2UgYW5vdGhlciAicm0gLWYiCisgKiAgICAgICAganVzdCB0byBiZSBzdXJlLiAgSnVzdCB0cnkgaXQgb3V0IC0geW91IHdpbGwgcmVjb2duaXNlIGEgZGlmZmVyZW5jZSEKKyAqCisgKiAgWyAxOTk4LTA2LTE0IF0KKyAqCisgKiAgICAqKSAgTm93IGx4ZGlhbG9nIGlzIGNyYXNoLXNhZmUgYWdhaW5zdCBicm9rZW4gImx4ZGlhbG9nLnNjcmx0bXAiIGZpbGVzCisgKiAgICAgICAgYW5kIG1lbnVzIGNoYW5nZSB0aGVpciBzaXplIG9uIHRoZSBmbHkuCisgKgorICogICAgKikgIElmIGZvciBzb21lIHJlYXNvbiB0aGUgbGFzdCBzY3JvbGxpbmcgcG9zaXRpb24gaXMgbm90IHNhdmVkIGJ5CisgKiAgICAgICAgbHhkaWFsb2csIGl0IHNldHMgdGhlIHNjcm9sbGluZyBzbyB0aGF0IHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZQorICogICAgICAgIG1pZGRsZSBvZiB0aGUgbWVudSBib3gsIG5vdCBhdCB0aGUgYm90dG9tLgorICoKKyAqIDAyIEphbnVhcnkgMTk5OSwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4gKG1lY0BzaG91dC5uZXQpCisgKiBSZXNldCAnc2Nyb2xsJyB0byAwIGlmIHRoZSB2YWx1ZSBmcm9tIGx4ZGlhbG9nLnNjcmx0bXAgaXMgYm9ndXMuCisgKiBUaGlzIGZpeGVzIGEgYnVnIGluIE1lbnVjb25maWcgd2hlcmUgdXNpbmcgJyAnIHRvIGRlc2NlbmQgaW50byBtZW51cworICogd291bGQgbGVhdmUgbWlzLXN5bmNocm9uaXplZCBseGRpYWxvZy5zY3JsdG1wIGZpbGVzIGx5aW5nIGFyb3VuZCwKKyAqIGZzY2FuZiB3b3VsZCByZWFkIGluICdzY3JvbGwnLCBhbmQgZXZlbnR1YWxseSB0aGF0IHZhbHVlIHdvdWxkIGdldCB1c2VkLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIGludCBtZW51X3dpZHRoLCBpdGVtX3g7CisKKy8qCisgKiBQcmludCBtZW51IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgZG9fcHJpbnRfaXRlbShXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKml0ZW0sIGludCBsaW5lX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWxlY3RlZCwgaW50IGhvdGtleSkKK3sKKwlpbnQgajsKKwljaGFyICptZW51X2l0ZW0gPSBtYWxsb2MobWVudV93aWR0aCArIDEpOworCisJc3RybmNweShtZW51X2l0ZW0sIGl0ZW0sIG1lbnVfd2lkdGggLSBpdGVtX3gpOworCW1lbnVfaXRlbVttZW51X3dpZHRoIC0gaXRlbV94XSA9ICdcMCc7CisJaiA9IGZpcnN0X2FscGhhKG1lbnVfaXRlbSwgIll5Tm5NbUhoIik7CisKKwkvKiBDbGVhciAncmVzaWR1ZScgb2YgbGFzdCBpdGVtICovCisJd2F0dHJzZXQod2luLCBkbGcubWVudWJveC5hdHIpOworCXdtb3ZlKHdpbiwgbGluZV95LCAwKTsKKyNpZiBPTERfTkNVUlNFUworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBtZW51X3dpZHRoOyBpKyspCisJCQl3YWRkY2god2luLCAnICcpOworCX0KKyNlbHNlCisJd2NscnRvZW9sKHdpbik7CisjZW5kaWYKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLml0ZW1fc2VsZWN0ZWQuYXRyIDogZGxnLml0ZW0uYXRyKTsKKwltdndhZGRzdHIod2luLCBsaW5lX3ksIGl0ZW1feCwgbWVudV9pdGVtKTsKKwlpZiAoaG90a2V5KSB7CisJCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBkbGcudGFnX2tleV9zZWxlY3RlZC5hdHIKKwkJCSA6IGRsZy50YWdfa2V5LmF0cik7CisJCW12d2FkZGNoKHdpbiwgbGluZV95LCBpdGVtX3ggKyBqLCBtZW51X2l0ZW1bal0pOworCX0KKwlpZiAoc2VsZWN0ZWQpIHsKKwkJd21vdmUod2luLCBsaW5lX3ksIGl0ZW1feCArIDEpOworCX0KKwlmcmVlKG1lbnVfaXRlbSk7CisJd3JlZnJlc2god2luKTsKK30KKworI2RlZmluZSBwcmludF9pdGVtKGluZGV4LCBjaG9pY2UsIHNlbGVjdGVkKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWl0ZW1fc2V0KGluZGV4KTsJCQkJCQlcCisJZG9fcHJpbnRfaXRlbShtZW51LCBpdGVtX3N0cigpLCBjaG9pY2UsIHNlbGVjdGVkLCAhaXRlbV9pc190YWcoJzonKSk7IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBQcmludCB0aGUgc2Nyb2xsIGluZGljYXRvcnMuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2Fycm93cyhXSU5ET1cgKiB3aW4sIGludCBpdGVtX25vLCBpbnQgc2Nyb2xsLCBpbnQgeSwgaW50IHgsCisJCQkgaW50IGhlaWdodCkKK3sKKwlpbnQgY3VyX3ksIGN1cl94OworCisJZ2V0eXgod2luLCBjdXJfeSwgY3VyX3gpOworCisJd21vdmUod2luLCB5LCB4KTsKKworCWlmIChzY3JvbGwgPiAwKSB7CisJCXdhdHRyc2V0KHdpbiwgZGxnLnVhcnJvdy5hdHIpOworCQl3YWRkY2god2luLCBBQ1NfVUFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoLSkiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIGRsZy5tZW51Ym94LmF0cik7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJfQorCisJeSA9IHkgKyBoZWlnaHQgKyAxOworCXdtb3ZlKHdpbiwgeSwgeCk7CisJd3JlZnJlc2god2luKTsKKworCWlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGhlaWdodCA8IGl0ZW1fbm8pKSB7CisJCXdhdHRyc2V0KHdpbiwgZGxnLmRhcnJvdy5hdHIpOworCQl3YWRkY2god2luLCBBQ1NfREFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoKykiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIGRsZy5tZW51Ym94X2JvcmRlci5hdHIpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCX0KKworCXdtb3ZlKHdpbiwgY3VyX3ksIGN1cl94KTsKKwl3cmVmcmVzaCh3aW4pOworfQorCisvKgorICogRGlzcGxheSB0aGUgdGVybWluYXRpb24gYnV0dG9ucy4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnV0dG9ucyhXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworCWludCB4ID0gd2lkdGggLyAyIC0gMTY7CisJaW50IHkgPSBoZWlnaHQgLSAyOworCisJcHJpbnRfYnV0dG9uKHdpbiwgIlNlbGVjdCIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbih3aW4sICIgRXhpdCAiLCB5LCB4ICsgMTIsIHNlbGVjdGVkID09IDEpOworCXByaW50X2J1dHRvbih3aW4sICIgSGVscCAiLCB5LCB4ICsgMjQsIHNlbGVjdGVkID09IDIpOworCisJd21vdmUod2luLCB5LCB4ICsgMSArIDEyICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKHdpbik7Cit9CisKKy8qIHNjcm9sbCB1cCBuIGxpbmVzIChuIG1heSBiZSBuZWdhdGl2ZSkgKi8KK3N0YXRpYyB2b2lkIGRvX3Njcm9sbChXSU5ET1cgKndpbiwgaW50ICpzY3JvbGwsIGludCBuKQoreworCS8qIFNjcm9sbCBtZW51IHVwICovCisJc2Nyb2xsb2sod2luLCBUUlVFKTsKKwl3c2NybCh3aW4sIG4pOworCXNjcm9sbG9rKHdpbiwgRkFMU0UpOworCSpzY3JvbGwgPSAqc2Nyb2xsICsgbjsKKwl3cmVmcmVzaCh3aW4pOworfQorCisvKgorICogRGlzcGxheSBhIG1lbnUgZm9yIGNob29zaW5nIGFtb25nIGEgbnVtYmVyIG9mIG9wdGlvbnMKKyAqLworaW50IGRpYWxvZ19tZW51KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2VsZWN0ZWQsIGludCAqc19zY3JvbGwpCit7CisJaW50IGksIGosIHgsIHksIGJveF94LCBib3hfeTsKKwlpbnQgaGVpZ2h0LCB3aWR0aCwgbWVudV9oZWlnaHQ7CisJaW50IGtleSA9IDAsIGJ1dHRvbiA9IDAsIHNjcm9sbCA9IDAsIGNob2ljZSA9IDA7CisJaW50IGZpcnN0X2l0ZW0gPSAgMCwgbWF4X2Nob2ljZTsKKwlXSU5ET1cgKmRpYWxvZywgKm1lbnU7CisKK2RvX3Jlc2l6ZToKKwloZWlnaHQgPSBnZXRtYXh5KHN0ZHNjcik7CisJd2lkdGggPSBnZXRtYXh4KHN0ZHNjcik7CisJaWYgKGhlaWdodCA8IDE1IHx8IHdpZHRoIDwgNjUpCisJCXJldHVybiAtRVJSRElTUExBWVRPT1NNQUxMOworCisJaGVpZ2h0IC09IDQ7CisJd2lkdGggIC09IDU7CisJbWVudV9oZWlnaHQgPSBoZWlnaHQgLSAxMDsKKworCW1heF9jaG9pY2UgPSBNSU4obWVudV9oZWlnaHQsIGl0ZW1fY291bnQoKSk7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsCisJCSBkbGcuZGlhbG9nLmF0ciwgZGxnLmJvcmRlci5hdHIpOworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmJvcmRlci5hdHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyKTsKKwl3YmtnZHNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyICYgQV9DT0xPUik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkbGcuZGlhbG9nLmF0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKwltZW51X3dpZHRoID0gd2lkdGggLSA2OworCWJveF95ID0gaGVpZ2h0IC0gbWVudV9oZWlnaHQgLSA1OworCWJveF94ID0gKHdpZHRoIC0gbWVudV93aWR0aCkgLyAyIC0gMTsKKworCS8qIGNyZWF0ZSBuZXcgd2luZG93IGZvciB0aGUgbWVudSAqLworCW1lbnUgPSBzdWJ3aW4oZGlhbG9nLCBtZW51X2hlaWdodCwgbWVudV93aWR0aCwKKwkJICAgICAgeSArIGJveF95ICsgMSwgeCArIGJveF94ICsgMSk7CisJa2V5cGFkKG1lbnUsIFRSVUUpOworCisJLyogZHJhdyBhIGJveCBhcm91bmQgdGhlIG1lbnUgaXRlbXMgKi8KKwlkcmF3X2JveChkaWFsb2csIGJveF95LCBib3hfeCwgbWVudV9oZWlnaHQgKyAyLCBtZW51X3dpZHRoICsgMiwKKwkJIGRsZy5tZW51Ym94X2JvcmRlci5hdHIsIGRsZy5tZW51Ym94LmF0cik7CisKKwlpZiAobWVudV93aWR0aCA+PSA4MCkKKwkJaXRlbV94ID0gKG1lbnVfd2lkdGggLSA3MCkgLyAyOworCWVsc2UKKwkJaXRlbV94ID0gNDsKKworCS8qIFNldCBjaG9pY2UgdG8gZGVmYXVsdCBpdGVtICovCisJaXRlbV9mb3JlYWNoKCkKKwkJaWYgKHNlbGVjdGVkICYmIChzZWxlY3RlZCA9PSBpdGVtX2RhdGEoKSkpCisJCQljaG9pY2UgPSBpdGVtX24oKTsKKwkvKiBnZXQgdGhlIHNhdmVkIHNjcm9sbCBpbmZvICovCisJc2Nyb2xsID0gKnNfc2Nyb2xsOworCWlmICgoc2Nyb2xsIDw9IGNob2ljZSkgJiYgKHNjcm9sbCArIG1heF9jaG9pY2UgPiBjaG9pY2UpICYmCisJICAgKHNjcm9sbCA+PSAwKSAmJiAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8PSBpdGVtX2NvdW50KCkpKSB7CisJCWZpcnN0X2l0ZW0gPSBzY3JvbGw7CisJCWNob2ljZSA9IGNob2ljZSAtIHNjcm9sbDsKKwl9IGVsc2UgeworCQlzY3JvbGwgPSAwOworCX0KKwlpZiAoKGNob2ljZSA+PSBtYXhfY2hvaWNlKSkgeworCQlpZiAoY2hvaWNlID49IGl0ZW1fY291bnQoKSAtIG1heF9jaG9pY2UgLyAyKQorCQkJc2Nyb2xsID0gZmlyc3RfaXRlbSA9IGl0ZW1fY291bnQoKSAtIG1heF9jaG9pY2U7CisJCWVsc2UKKwkJCXNjcm9sbCA9IGZpcnN0X2l0ZW0gPSBjaG9pY2UgLSBtYXhfY2hvaWNlIC8gMjsKKwkJY2hvaWNlID0gY2hvaWNlIC0gc2Nyb2xsOworCX0KKworCS8qIFByaW50IHRoZSBtZW51ICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQlwcmludF9pdGVtKGZpcnN0X2l0ZW0gKyBpLCBpLCBpID09IGNob2ljZSk7CisJfQorCisJd25vdXRyZWZyZXNoKG1lbnUpOworCisJcHJpbnRfYXJyb3dzKGRpYWxvZywgaXRlbV9jb3VudCgpLCBzY3JvbGwsCisJCSAgICAgYm94X3ksIGJveF94ICsgaXRlbV94ICsgMSwgbWVudV9oZWlnaHQpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCXdtb3ZlKG1lbnUsIGNob2ljZSwgaXRlbV94ICsgMSk7CisJd3JlZnJlc2gobWVudSk7CisKKwl3aGlsZSAoa2V5ICE9IEtFWV9FU0MpIHsKKwkJa2V5ID0gd2dldGNoKG1lbnUpOworCisJCWlmIChrZXkgPCAyNTYgJiYgaXNhbHBoYShrZXkpKQorCQkJa2V5ID0gdG9sb3dlcihrZXkpOworCisJCWlmIChzdHJjaHIoInlubWgiLCBrZXkpKQorCQkJaSA9IG1heF9jaG9pY2U7CisJCWVsc2UgeworCQkJZm9yIChpID0gY2hvaWNlICsgMTsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQkJCWl0ZW1fc2V0KHNjcm9sbCArIGkpOworCQkJCWogPSBmaXJzdF9hbHBoYShpdGVtX3N0cigpLCAiWXlObk1tSGgiKTsKKwkJCQlpZiAoa2V5ID09IHRvbG93ZXIoaXRlbV9zdHIoKVtqXSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGkgPT0gbWF4X2Nob2ljZSkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCQkJCWl0ZW1fc2V0KHNjcm9sbCArIGkpOworCQkJCQlqID0gZmlyc3RfYWxwaGEoaXRlbV9zdHIoKSwgIll5Tm5NbUhoIik7CisJCQkJCWlmIChrZXkgPT0gdG9sb3dlcihpdGVtX3N0cigpW2pdKSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCisJCWlmIChpIDwgbWF4X2Nob2ljZSB8fAorCQkgICAga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04gfHwKKwkJICAgIGtleSA9PSAnLScgfHwga2V5ID09ICcrJyB8fAorCQkgICAga2V5ID09IEtFWV9QUEFHRSB8fCBrZXkgPT0gS0VZX05QQUdFKSB7CisJCQkvKiBSZW1vdmUgaGlnaGxpZ3Qgb2YgY3VycmVudCBpdGVtICovCisJCQlwcmludF9pdGVtKHNjcm9sbCArIGNob2ljZSwgY2hvaWNlLCBGQUxTRSk7CisKKwkJCWlmIChrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSAnLScpIHsKKwkJCQlpZiAoY2hvaWNlIDwgMiAmJiBzY3JvbGwpIHsKKwkJCQkJLyogU2Nyb2xsIG1lbnUgZG93biAqLworCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgLTEpOworCisJCQkJCXByaW50X2l0ZW0oc2Nyb2xsLCAwLCBGQUxTRSk7CisJCQkJfSBlbHNlCisJCQkJCWNob2ljZSA9IE1BWChjaG9pY2UgLSAxLCAwKTsKKworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX0RPV04gfHwga2V5ID09ICcrJykgeworCQkJCXByaW50X2l0ZW0oc2Nyb2xsK2Nob2ljZSwgY2hvaWNlLCBGQUxTRSk7CisKKwkJCQlpZiAoKGNob2ljZSA+IG1heF9jaG9pY2UgLSAzKSAmJgorCQkJCSAgICAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8IGl0ZW1fY291bnQoKSkpIHsKKwkJCQkJLyogU2Nyb2xsIG1lbnUgdXAgKi8KKwkJCQkJZG9fc2Nyb2xsKG1lbnUsICZzY3JvbGwsIDEpOworCisJCQkJCXByaW50X2l0ZW0oc2Nyb2xsK21heF9jaG9pY2UgLSAxLAorCQkJCQkJICAgbWF4X2Nob2ljZSAtIDEsIEZBTFNFKTsKKwkJCQl9IGVsc2UKKwkJCQkJY2hvaWNlID0gTUlOKGNob2ljZSArIDEsIG1heF9jaG9pY2UgLSAxKTsKKworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX1BQQUdFKSB7CisJCQkJc2Nyb2xsb2sobWVudSwgVFJVRSk7CisJCQkJZm9yIChpID0gMDsgKGkgPCBtYXhfY2hvaWNlKTsgaSsrKSB7CisJCQkJCWlmIChzY3JvbGwgPiAwKSB7CisJCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgLTEpOworCQkJCQkJcHJpbnRfaXRlbShzY3JvbGwsIDAsIEZBTFNFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjaG9pY2UgPiAwKQorCQkJCQkJCWNob2ljZS0tOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKGtleSA9PSBLRVlfTlBBR0UpIHsKKwkJCQlmb3IgKGkgPSAwOyAoaSA8IG1heF9jaG9pY2UpOyBpKyspIHsKKwkJCQkJaWYgKHNjcm9sbCArIG1heF9jaG9pY2UgPCBpdGVtX2NvdW50KCkpIHsKKwkJCQkJCWRvX3Njcm9sbChtZW51LCAmc2Nyb2xsLCAxKTsKKwkJCQkJCXByaW50X2l0ZW0oc2Nyb2xsK21heF9jaG9pY2UtMSwKKwkJCQkJCQkgICBtYXhfY2hvaWNlIC0gMSwgRkFMU0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGNob2ljZSArIDEgPCBtYXhfY2hvaWNlKQorCQkJCQkJCWNob2ljZSsrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlCisJCQkJY2hvaWNlID0gaTsKKworCQkJcHJpbnRfaXRlbShzY3JvbGwgKyBjaG9pY2UsIGNob2ljZSwgVFJVRSk7CisKKwkJCXByaW50X2Fycm93cyhkaWFsb2csIGl0ZW1fY291bnQoKSwgc2Nyb2xsLAorCQkJCSAgICAgYm94X3ksIGJveF94ICsgaXRlbV94ICsgMSwgbWVudV9oZWlnaHQpOworCisJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCXdyZWZyZXNoKG1lbnUpOworCisJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJfQorCisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgS0VZX0xFRlQ6CisJCWNhc2UgVEFCOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCWJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKQorCQkJICAgID8gMiA6IChidXR0b24gPiAyID8gMCA6IGJ1dHRvbik7CisKKwkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCQkJd3JlZnJlc2gobWVudSk7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCWNhc2UgJ3MnOgorCQljYXNlICd5JzoKKwkJY2FzZSAnbic6CisJCWNhc2UgJ20nOgorCQljYXNlICcvJzoKKwkJCS8qIHNhdmUgc2Nyb2xsIGluZm8gKi8KKwkJCSpzX3Njcm9sbCA9IHNjcm9sbDsKKwkJCWRlbHdpbihtZW51KTsKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJaXRlbV9zZXQoc2Nyb2xsICsgY2hvaWNlKTsKKwkJCWl0ZW1fc2V0X3NlbGVjdGVkKDEpOworCQkJc3dpdGNoIChrZXkpIHsKKwkJCWNhc2UgJ3MnOgorCQkJCXJldHVybiAzOworCQkJY2FzZSAneSc6CisJCQkJcmV0dXJuIDM7CisJCQljYXNlICduJzoKKwkJCQlyZXR1cm4gNDsKKwkJCWNhc2UgJ20nOgorCQkJCXJldHVybiA1OworCQkJY2FzZSAnICc6CisJCQkJcmV0dXJuIDY7CisJCQljYXNlICcvJzoKKwkJCQlyZXR1cm4gNzsKKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlidXR0b24gPSAyOworCQljYXNlICdcbic6CisJCQkqc19zY3JvbGwgPSBzY3JvbGw7CisJCQlkZWx3aW4obWVudSk7CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWl0ZW1fc2V0KHNjcm9sbCArIGNob2ljZSk7CisJCQlpdGVtX3NldF9zZWxlY3RlZCgxKTsKKwkJCXJldHVybiBidXR0b247CisJCWNhc2UgJ2UnOgorCQljYXNlICd4JzoKKwkJCWtleSA9IEtFWV9FU0M7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfRVNDOgorCQkJa2V5ID0gb25fa2V5X2VzYyhtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9SRVNJWkU6CisJCQlvbl9rZXlfcmVzaXplKCk7CisJCQlkZWx3aW4obWVudSk7CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWdvdG8gZG9fcmVzaXplOworCQl9CisJfQorCWRlbHdpbihtZW51KTsKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZXR1cm4ga2V5OwkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYyBiL3RveWJveC9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJmYzFhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogIHRleHRib3guYyAtLSBpbXBsZW1lbnRzIHRoZSB0ZXh0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgdm9pZCBiYWNrX2xpbmVzKGludCBuKTsKK3N0YXRpYyB2b2lkIHByaW50X3BhZ2UoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworc3RhdGljIHZvaWQgcHJpbnRfbGluZShXSU5ET1cgKiB3aW4sIGludCByb3csIGludCB3aWR0aCk7CitzdGF0aWMgY2hhciAqZ2V0X2xpbmUodm9pZCk7CitzdGF0aWMgdm9pZCBwcmludF9wb3NpdGlvbihXSU5ET1cgKiB3aW4pOworCitzdGF0aWMgaW50IGhzY3JvbGw7CitzdGF0aWMgaW50IGJlZ2luX3JlYWNoZWQsIGVuZF9yZWFjaGVkLCBwYWdlX2xlbmd0aDsKK3N0YXRpYyBjb25zdCBjaGFyICpidWY7CitzdGF0aWMgY29uc3QgY2hhciAqcGFnZTsKKworLyoKKyAqIHJlZnJlc2ggd2luZG93IGNvbnRlbnQKKyAqLworc3RhdGljIHZvaWQgcmVmcmVzaF90ZXh0X2JveChXSU5ET1cgKmRpYWxvZywgV0lORE9XICpib3gsIGludCBib3hoLCBpbnQgYm94dywKKwkJCQkJCQkgIGludCBjdXJfeSwgaW50IGN1cl94KQoreworCXByaW50X3BhZ2UoYm94LCBib3hoLCBib3h3KTsKKwlwcmludF9wb3NpdGlvbihkaWFsb2cpOworCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwl3cmVmcmVzaChkaWFsb2cpOworfQorCisKKy8qCisgKiBEaXNwbGF5IHRleHQgZnJvbSBhIGZpbGUgaW4gYSBkaWFsb2cgYm94LgorICovCitpbnQgZGlhbG9nX3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRidWYsCisJCSAgIGludCBpbml0aWFsX2hlaWdodCwgaW50IGluaXRpYWxfd2lkdGgpCit7CisJaW50IGksIHgsIHksIGN1cl94LCBjdXJfeSwga2V5ID0gMDsKKwlpbnQgaGVpZ2h0LCB3aWR0aCwgYm94aCwgYm94dzsKKwlpbnQgcGFzc2VkX2VuZDsKKwlXSU5ET1cgKmRpYWxvZywgKmJveDsKKworCWJlZ2luX3JlYWNoZWQgPSAxOworCWVuZF9yZWFjaGVkID0gMDsKKwlwYWdlX2xlbmd0aCA9IDA7CisJaHNjcm9sbCA9IDA7CisJYnVmID0gdGJ1ZjsKKwlwYWdlID0gYnVmOwkvKiBwYWdlIGlzIHBvaW50ZXIgdG8gc3RhcnQgb2YgcGFnZSB0byBiZSBkaXNwbGF5ZWQgKi8KKworZG9fcmVzaXplOgorCWdldG1heHl4KHN0ZHNjciwgaGVpZ2h0LCB3aWR0aCk7CisJaWYgKGhlaWdodCA8IDggfHwgd2lkdGggPCA4KQorCQlyZXR1cm4gLUVSUkRJU1BMQVlUT09TTUFMTDsKKwlpZiAoaW5pdGlhbF9oZWlnaHQgIT0gMCkKKwkJaGVpZ2h0ID0gaW5pdGlhbF9oZWlnaHQ7CisJZWxzZQorCQlpZiAoaGVpZ2h0ID4gNCkKKwkJCWhlaWdodCAtPSA0OworCQllbHNlCisJCQloZWlnaHQgPSAwOworCWlmIChpbml0aWFsX3dpZHRoICE9IDApCisJCXdpZHRoID0gaW5pdGlhbF93aWR0aDsKKwllbHNlCisJCWlmICh3aWR0aCA+IDUpCisJCQl3aWR0aCAtPSA1OworCQllbHNlCisJCQl3aWR0aCA9IDA7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwkvKiBDcmVhdGUgd2luZG93IGZvciBib3ggcmVnaW9uLCB1c2VkIGZvciBzY3JvbGxpbmcgdGV4dCAqLworCWJveGggPSBoZWlnaHQgLSA0OworCWJveHcgPSB3aWR0aCAtIDI7CisJYm94ID0gc3Vid2luKGRpYWxvZywgYm94aCwgYm94dywgeSArIDEsIHggKyAxKTsKKwl3YXR0cnNldChib3gsIGRsZy5kaWFsb2cuYXRyKTsKKwl3YmtnZHNldChib3gsIGRsZy5kaWFsb2cuYXRyICYgQV9DT0xPUik7CisKKwlrZXlwYWQoYm94LCBUUlVFKTsKKworCS8qIHJlZ2lzdGVyIHRoZSBuZXcgd2luZG93LCBhbG9uZyB3aXRoIGl0cyBib3JkZXJzICovCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLAorCQkgZGxnLmRpYWxvZy5hdHIsIGRsZy5ib3JkZXIuYXRyKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmJvcmRlci5hdHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyKTsKKwl3YmtnZHNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyICYgQV9DT0xPUik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBFeGl0ICIsIGhlaWdodCAtIDIsIHdpZHRoIC8gMiAtIDQsIFRSVUUpOworCXdub3V0cmVmcmVzaChkaWFsb2cpOworCWdldHl4KGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogU2F2ZSBjdXJzb3IgcG9zaXRpb24gKi8KKworCS8qIFByaW50IGZpcnN0IHBhZ2Ugb2YgdGV4dCAqLworCWF0dHJfY2xlYXIoYm94LCBib3hoLCBib3h3LCBkbGcuZGlhbG9nLmF0cik7CisJcmVmcmVzaF90ZXh0X2JveChkaWFsb2csIGJveCwgYm94aCwgYm94dywgY3VyX3ksIGN1cl94KTsKKworCXdoaWxlICgoa2V5ICE9IEtFWV9FU0MpICYmIChrZXkgIT0gJ1xuJykpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgJ0UnOgkvKiBFeGl0ICovCisJCWNhc2UgJ2UnOgorCQljYXNlICdYJzoKKwkJY2FzZSAneCc6CisJCQlkZWx3aW4oYm94KTsKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2cnOgkvKiBGaXJzdCBwYWdlICovCisJCWNhc2UgS0VZX0hPTUU6CisJCQlpZiAoIWJlZ2luX3JlYWNoZWQpIHsKKwkJCQliZWdpbl9yZWFjaGVkID0gMTsKKwkJCQlwYWdlID0gYnVmOworCQkJCXJlZnJlc2hfdGV4dF9ib3goZGlhbG9nLCBib3gsIGJveGgsIGJveHcsCisJCQkJCQkgY3VyX3ksIGN1cl94KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdHJzoJLyogTGFzdCBwYWdlICovCisJCWNhc2UgS0VZX0VORDoKKworCQkJZW5kX3JlYWNoZWQgPSAxOworCQkJLyogcG9pbnQgdG8gbGFzdCBjaGFyIGluIGJ1ZiAqLworCQkJcGFnZSA9IGJ1ZiArIHN0cmxlbihidWYpOworCQkJYmFja19saW5lcyhib3hoKTsKKwkJCXJlZnJlc2hfdGV4dF9ib3goZGlhbG9nLCBib3gsIGJveGgsIGJveHcsCisJCQkJCSBjdXJfeSwgY3VyX3gpOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgkvKiBQcmV2aW91cyBsaW5lICovCisJCWNhc2UgJ2snOgorCQljYXNlIEtFWV9VUDoKKwkJCWlmICghYmVnaW5fcmVhY2hlZCkgeworCQkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGggKyAxKTsKKworCQkJCS8qIFdlIGRvbid0IGNhbGwgcHJpbnRfcGFnZSgpIGhlcmUgYnV0IHVzZQorCQkJCSAqIHNjcm9sbGluZyB0byBlbnN1cmUgZmFzdGVyIHNjcmVlbiB1cGRhdGUuCisJCQkJICogSG93ZXZlciwgJ2VuZF9yZWFjaGVkJyBhbmQgJ3BhZ2VfbGVuZ3RoJworCQkJCSAqIHNob3VsZCBzdGlsbCBiZSB1cGRhdGVkLCBhbmQgJ3BhZ2UnIHNob3VsZAorCQkJCSAqIHBvaW50IHRvIHN0YXJ0IG9mIG5leHQgcGFnZS4gVGhpcyBpcyBkb25lCisJCQkJICogYnkgY2FsbGluZyBnZXRfbGluZSgpIGluIHRoZSBmb2xsb3dpbmcKKwkJCQkgKiAnZm9yJyBsb29wLiAqLworCQkJCXNjcm9sbG9rKGJveCwgVFJVRSk7CisJCQkJd3NjcmwoYm94LCAtMSk7CS8qIFNjcm9sbCBib3ggcmVnaW9uIGRvd24gb25lIGxpbmUgKi8KKwkJCQlzY3JvbGxvayhib3gsIEZBTFNFKTsKKwkJCQlwYWdlX2xlbmd0aCA9IDA7CisJCQkJcGFzc2VkX2VuZCA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IGJveGg7IGkrKykgeworCQkJCQlpZiAoIWkpIHsKKwkJCQkJCS8qIHByaW50IGZpcnN0IGxpbmUgb2YgcGFnZSAqLworCQkJCQkJcHJpbnRfbGluZShib3gsIDAsIGJveHcpOworCQkJCQkJd25vdXRyZWZyZXNoKGJveCk7CisJCQkJCX0gZWxzZQorCQkJCQkJLyogQ2FsbGVkIHRvIHVwZGF0ZSAnZW5kX3JlYWNoZWQnIGFuZCAncGFnZScgKi8KKwkJCQkJCWdldF9saW5lKCk7CisJCQkJCWlmICghcGFzc2VkX2VuZCkKKwkJCQkJCXBhZ2VfbGVuZ3RoKys7CisJCQkJCWlmIChlbmRfcmVhY2hlZCAmJiAhcGFzc2VkX2VuZCkKKwkJCQkJCXBhc3NlZF9lbmQgPSAxOworCQkJCX0KKworCQkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZyk7CisJCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnQic6CS8qIFByZXZpb3VzIHBhZ2UgKi8KKwkJY2FzZSAnYic6CisJCWNhc2UgS0VZX1BQQUdFOgorCQkJaWYgKGJlZ2luX3JlYWNoZWQpCisJCQkJYnJlYWs7CisJCQliYWNrX2xpbmVzKHBhZ2VfbGVuZ3RoICsgYm94aCk7CisJCQlyZWZyZXNoX3RleHRfYm94KGRpYWxvZywgYm94LCBib3hoLCBib3h3LAorCQkJCQkgY3VyX3ksIGN1cl94KTsKKwkJCWJyZWFrOworCQljYXNlICdKJzoJLyogTmV4dCBsaW5lICovCisJCWNhc2UgJ2onOgorCQljYXNlIEtFWV9ET1dOOgorCQkJaWYgKCFlbmRfcmVhY2hlZCkgeworCQkJCWJlZ2luX3JlYWNoZWQgPSAwOworCQkJCXNjcm9sbG9rKGJveCwgVFJVRSk7CisJCQkJc2Nyb2xsKGJveCk7CS8qIFNjcm9sbCBib3ggcmVnaW9uIHVwIG9uZSBsaW5lICovCisJCQkJc2Nyb2xsb2soYm94LCBGQUxTRSk7CisJCQkJcHJpbnRfbGluZShib3gsIGJveGggLSAxLCBib3h3KTsKKwkJCQl3bm91dHJlZnJlc2goYm94KTsKKwkJCQlwcmludF9wb3NpdGlvbihkaWFsb2cpOworCQkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgS0VZX05QQUdFOgkvKiBOZXh0IHBhZ2UgKi8KKwkJY2FzZSAnICc6CisJCQlpZiAoZW5kX3JlYWNoZWQpCisJCQkJYnJlYWs7CisKKwkJCWJlZ2luX3JlYWNoZWQgPSAwOworCQkJcmVmcmVzaF90ZXh0X2JveChkaWFsb2csIGJveCwgYm94aCwgYm94dywKKwkJCQkJIGN1cl95LCBjdXJfeCk7CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CS8qIEJlZ2lubmluZyBvZiBsaW5lICovCisJCWNhc2UgJ0gnOgkvKiBTY3JvbGwgbGVmdCAqLworCQljYXNlICdoJzoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJCWlmIChoc2Nyb2xsIDw9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChrZXkgPT0gJzAnKQorCQkJCWhzY3JvbGwgPSAwOworCQkJZWxzZQorCQkJCWhzY3JvbGwtLTsKKwkJCS8qIFJlcHJpbnQgY3VycmVudCBwYWdlIHRvIHNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGgpOworCQkJcmVmcmVzaF90ZXh0X2JveChkaWFsb2csIGJveCwgYm94aCwgYm94dywKKwkJCQkJIGN1cl95LCBjdXJfeCk7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CS8qIFNjcm9sbCByaWdodCAqLworCQljYXNlICdsJzoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlpZiAoaHNjcm9sbCA+PSBNQVhfTEVOKQorCQkJCWJyZWFrOworCQkJaHNjcm9sbCsrOworCQkJLyogUmVwcmludCBjdXJyZW50IHBhZ2UgdG8gc2Nyb2xsIGhvcml6b250YWxseSAqLworCQkJYmFja19saW5lcyhwYWdlX2xlbmd0aCk7CisJCQlyZWZyZXNoX3RleHRfYm94KGRpYWxvZywgYm94LCBib3hoLCBib3h3LAorCQkJCQkgY3VyX3ksIGN1cl94KTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FU0M6CisJCQlrZXkgPSBvbl9rZXlfZXNjKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfUkVTSVpFOgorCQkJYmFja19saW5lcyhoZWlnaHQpOworCQkJZGVsd2luKGJveCk7CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCW9uX2tleV9yZXNpemUoKTsKKwkJCWdvdG8gZG9fcmVzaXplOworCQl9CisJfQorCWRlbHdpbihib3gpOworCWRlbHdpbihkaWFsb2cpOworCXJldHVybiBrZXk7CQkvKiBFU0MgcHJlc3NlZCAqLworfQorCisvKgorICogR28gYmFjayAnbicgbGluZXMgaW4gdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkuCisgKiAncGFnZScgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBkZXNpcmVkIGxpbmUgaW4gJ2J1ZicuCisgKi8KK3N0YXRpYyB2b2lkIGJhY2tfbGluZXMoaW50IG4pCit7CisJaW50IGk7CisKKwliZWdpbl9yZWFjaGVkID0gMDsKKwkvKiBHbyBiYWNrICduJyBsaW5lcyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKCpwYWdlID09ICdcMCcpIHsKKwkJCWlmIChlbmRfcmVhY2hlZCkgeworCQkJCWVuZF9yZWFjaGVkID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAocGFnZSA9PSBidWYpIHsKKwkJCWJlZ2luX3JlYWNoZWQgPSAxOworCQkJcmV0dXJuOworCQl9CisJCXBhZ2UtLTsKKwkJZG8geworCQkJaWYgKHBhZ2UgPT0gYnVmKSB7CisJCQkJYmVnaW5fcmVhY2hlZCA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcGFnZS0tOworCQl9IHdoaWxlICgqcGFnZSAhPSAnXG4nKTsKKwkJcGFnZSsrOworCX0KK30KKworLyoKKyAqIFByaW50IGEgbmV3IHBhZ2Ugb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3BhZ2UoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGksIHBhc3NlZF9lbmQgPSAwOworCisJcGFnZV9sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQlwcmludF9saW5lKHdpbiwgaSwgd2lkdGgpOworCQlpZiAoIXBhc3NlZF9lbmQpCisJCQlwYWdlX2xlbmd0aCsrOworCQlpZiAoZW5kX3JlYWNoZWQgJiYgIXBhc3NlZF9lbmQpCisJCQlwYXNzZWRfZW5kID0gMTsKKwl9CisJd25vdXRyZWZyZXNoKHdpbik7Cit9CisKKy8qCisgKiBQcmludCBhIG5ldyBsaW5lIG9mIHRleHQuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpIGFuZCBwcmludF9wYWdlKCkuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpCit7CisJaW50IHksIHg7CisJY2hhciAqbGluZTsKKworCWxpbmUgPSBnZXRfbGluZSgpOworCWxpbmUgKz0gTUlOKHN0cmxlbihsaW5lKSwgaHNjcm9sbCk7CS8qIFNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwl3bW92ZSh3aW4sIHJvdywgMCk7CS8qIG1vdmUgY3Vyc29yIHRvIGNvcnJlY3QgbGluZSAqLworCXdhZGRjaCh3aW4sICcgJyk7CisJd2FkZG5zdHIod2luLCBsaW5lLCBNSU4oc3RybGVuKGxpbmUpLCB3aWR0aCAtIDIpKTsKKworCWdldHl4KHdpbiwgeSwgeCk7CisJLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIHByZXZpb3VzIGxpbmUgKi8KKyNpZiBPTERfTkNVUlNFUworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIHg7IGkrKykKKwkJCXdhZGRjaCh3aW4sICcgJyk7CisJfQorI2Vsc2UKKwl3Y2xydG9lb2wod2luKTsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIGN1cnJlbnQgbGluZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKSBhbmQgcHJpbnRfbGluZSgpLgorICogJ3BhZ2UnIHNob3VsZCBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IGxpbmUgYmVmb3JlIGNhbGxpbmcsIGFuZCB3aWxsIGJlCisgKiB1cGRhdGVkIHRvIHBvaW50IHRvIHN0YXJ0IG9mIG5leHQgbGluZS4KKyAqLworc3RhdGljIGNoYXIgKmdldF9saW5lKHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0YXRpYyBjaGFyIGxpbmVbTUFYX0xFTiArIDFdOworCisJZW5kX3JlYWNoZWQgPSAwOworCXdoaWxlICgqcGFnZSAhPSAnXG4nKSB7CisJCWlmICgqcGFnZSA9PSAnXDAnKSB7CisJCQlpZiAoIWVuZF9yZWFjaGVkKSB7CisJCQkJZW5kX3JlYWNoZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGkgPCBNQVhfTEVOKQorCQkJbGluZVtpKytdID0gKihwYWdlKyspOworCQllbHNlIHsKKwkJCS8qIFRydW5jYXRlIGxpbmVzIGxvbmdlciB0aGFuIE1BWF9MRU4gY2hhcmFjdGVycyAqLworCQkJaWYgKGkgPT0gTUFYX0xFTikKKwkJCQlsaW5lW2krK10gPSAnXDAnOworCQkJcGFnZSsrOworCQl9CisJfQorCWlmIChpIDw9IE1BWF9MRU4pCisJCWxpbmVbaV0gPSAnXDAnOworCWlmICghZW5kX3JlYWNoZWQpCisJCXBhZ2UrKzsJCS8qIG1vdmUgcGFzcyAnXG4nICovCisKKwlyZXR1cm4gbGluZTsKK30KKworLyoKKyAqIFByaW50IGN1cnJlbnQgcG9zaXRpb24KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfcG9zaXRpb24oV0lORE9XICogd2luKQoreworCWludCBwZXJjZW50OworCisJd2F0dHJzZXQod2luLCBkbGcucG9zaXRpb25faW5kaWNhdG9yLmF0cik7CisJd2JrZ2RzZXQod2luLCBkbGcucG9zaXRpb25faW5kaWNhdG9yLmF0ciAmIEFfQ09MT1IpOworCXBlcmNlbnQgPSAocGFnZSAtIGJ1ZikgKiAxMDAgLyBzdHJsZW4oYnVmKTsKKwl3bW92ZSh3aW4sIGdldG1heHkod2luKSAtIDMsIGdldG1heHgod2luKSAtIDkpOworCXdwcmludHcod2luLCAiKCUzZCUlKSIsIHBlcmNlbnQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvdXRpbC5jIGIvdG95Ym94L2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzc4MWIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qCisgKiAgdXRpbC5jCisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0cnVjdCBkaWFsb2dfaW5mbyBkbGc7CisKK3N0YXRpYyB2b2lkIHNldF9tb25vX3RoZW1lKHZvaWQpCit7CisJZGxnLnNjcmVlbi5hdHIgPSBBX05PUk1BTDsKKwlkbGcuc2hhZG93LmF0ciA9IEFfTk9STUFMOworCWRsZy5kaWFsb2cuYXRyID0gQV9OT1JNQUw7CisJZGxnLnRpdGxlLmF0ciA9IEFfQk9MRDsKKwlkbGcuYm9yZGVyLmF0ciA9IEFfTk9STUFMOworCWRsZy5idXR0b25fYWN0aXZlLmF0ciA9IEFfUkVWRVJTRTsKKwlkbGcuYnV0dG9uX2luYWN0aXZlLmF0ciA9IEFfRElNOworCWRsZy5idXR0b25fa2V5X2FjdGl2ZS5hdHIgPSBBX1JFVkVSU0U7CisJZGxnLmJ1dHRvbl9rZXlfaW5hY3RpdmUuYXRyID0gQV9CT0xEOworCWRsZy5idXR0b25fbGFiZWxfYWN0aXZlLmF0ciA9IEFfUkVWRVJTRTsKKwlkbGcuYnV0dG9uX2xhYmVsX2luYWN0aXZlLmF0ciA9IEFfTk9STUFMOworCWRsZy5pbnB1dGJveC5hdHIgPSBBX05PUk1BTDsKKwlkbGcuaW5wdXRib3hfYm9yZGVyLmF0ciA9IEFfTk9STUFMOworCWRsZy5zZWFyY2hib3guYXRyID0gQV9OT1JNQUw7CisJZGxnLnNlYXJjaGJveF90aXRsZS5hdHIgPSBBX0JPTEQ7CisJZGxnLnNlYXJjaGJveF9ib3JkZXIuYXRyID0gQV9OT1JNQUw7CisJZGxnLnBvc2l0aW9uX2luZGljYXRvci5hdHIgPSBBX0JPTEQ7CisJZGxnLm1lbnVib3guYXRyID0gQV9OT1JNQUw7CisJZGxnLm1lbnVib3hfYm9yZGVyLmF0ciA9IEFfTk9STUFMOworCWRsZy5pdGVtLmF0ciA9IEFfTk9STUFMOworCWRsZy5pdGVtX3NlbGVjdGVkLmF0ciA9IEFfUkVWRVJTRTsKKwlkbGcudGFnLmF0ciA9IEFfQk9MRDsKKwlkbGcudGFnX3NlbGVjdGVkLmF0ciA9IEFfUkVWRVJTRTsKKwlkbGcudGFnX2tleS5hdHIgPSBBX0JPTEQ7CisJZGxnLnRhZ19rZXlfc2VsZWN0ZWQuYXRyID0gQV9SRVZFUlNFOworCWRsZy5jaGVjay5hdHIgPSBBX0JPTEQ7CisJZGxnLmNoZWNrX3NlbGVjdGVkLmF0ciA9IEFfUkVWRVJTRTsKKwlkbGcudWFycm93LmF0ciA9IEFfQk9MRDsKKwlkbGcuZGFycm93LmF0ciA9IEFfQk9MRDsKK30KKworI2RlZmluZSBETEdfQ09MT1IoZGlhbG9nLCBmLCBiLCBoKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbGcuZGlhbG9nLmZnID0gKGYpOyAgICAgICBcCisJZGxnLmRpYWxvZy5iZyA9IChiKTsgICAgICAgXAorCWRsZy5kaWFsb2cuaGwgPSAoaCk7ICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHNldF9jbGFzc2ljX3RoZW1lKHZvaWQpCit7CisJRExHX0NPTE9SKHNjcmVlbiwgICAgICAgICAgICAgICAgQ09MT1JfQ1lBTiwgICBDT0xPUl9CTFVFLCAgIHRydWUpOworCURMR19DT0xPUihzaGFkb3csICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLLCAgQ09MT1JfQkxBQ0ssICB0cnVlKTsKKwlETEdfQ09MT1IoZGlhbG9nLCAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSywgIENPTE9SX1dISVRFLCAgZmFsc2UpOworCURMR19DT0xPUih0aXRsZSwgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVywgQ09MT1JfV0hJVEUsICB0cnVlKTsKKwlETEdfQ09MT1IoYm9yZGVyLCAgICAgICAgICAgICAgICBDT0xPUl9XSElURSwgIENPTE9SX1dISVRFLCAgdHJ1ZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9hY3RpdmUsICAgICAgICAgQ09MT1JfV0hJVEUsICBDT0xPUl9CTFVFLCAgIHRydWUpOworCURMR19DT0xPUihidXR0b25faW5hY3RpdmUsICAgICAgIENPTE9SX0JMQUNLLCAgQ09MT1JfV0hJVEUsICBmYWxzZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9rZXlfYWN0aXZlLCAgICAgQ09MT1JfV0hJVEUsICBDT0xPUl9CTFVFLCAgIHRydWUpOworCURMR19DT0xPUihidXR0b25fa2V5X2luYWN0aXZlLCAgIENPTE9SX1JFRCwgICAgQ09MT1JfV0hJVEUsICBmYWxzZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9sYWJlbF9hY3RpdmUsICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTFVFLCAgIHRydWUpOworCURMR19DT0xPUihidXR0b25fbGFiZWxfaW5hY3RpdmUsIENPTE9SX0JMQUNLLCAgQ09MT1JfV0hJVEUsICB0cnVlKTsKKwlETEdfQ09MT1IoaW5wdXRib3gsICAgICAgICAgICAgICBDT0xPUl9CTEFDSywgIENPTE9SX1dISVRFLCAgZmFsc2UpOworCURMR19DT0xPUihpbnB1dGJveF9ib3JkZXIsICAgICAgIENPTE9SX0JMQUNLLCAgQ09MT1JfV0hJVEUsICBmYWxzZSk7CisJRExHX0NPTE9SKHNlYXJjaGJveCwgICAgICAgICAgICAgQ09MT1JfQkxBQ0ssICBDT0xPUl9XSElURSwgIGZhbHNlKTsKKwlETEdfQ09MT1Ioc2VhcmNoYm94X3RpdGxlLCAgICAgICBDT0xPUl9ZRUxMT1csIENPTE9SX1dISVRFLCAgdHJ1ZSk7CisJRExHX0NPTE9SKHNlYXJjaGJveF9ib3JkZXIsICAgICAgQ09MT1JfV0hJVEUsICBDT0xPUl9XSElURSwgIHRydWUpOworCURMR19DT0xPUihwb3NpdGlvbl9pbmRpY2F0b3IsICAgIENPTE9SX1lFTExPVywgQ09MT1JfV0hJVEUsICB0cnVlKTsKKwlETEdfQ09MT1IobWVudWJveCwgICAgICAgICAgICAgICBDT0xPUl9CTEFDSywgIENPTE9SX1dISVRFLCAgZmFsc2UpOworCURMR19DT0xPUihtZW51Ym94X2JvcmRlciwgICAgICAgIENPTE9SX1dISVRFLCAgQ09MT1JfV0hJVEUsICB0cnVlKTsKKwlETEdfQ09MT1IoaXRlbSwgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSywgIENPTE9SX1dISVRFLCAgZmFsc2UpOworCURMR19DT0xPUihpdGVtX3NlbGVjdGVkLCAgICAgICAgIENPTE9SX1dISVRFLCAgQ09MT1JfQkxVRSwgICB0cnVlKTsKKwlETEdfQ09MT1IodGFnLCAgICAgICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1csIENPTE9SX1dISVRFLCAgdHJ1ZSk7CisJRExHX0NPTE9SKHRhZ19zZWxlY3RlZCwgICAgICAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTFVFLCAgIHRydWUpOworCURMR19DT0xPUih0YWdfa2V5LCAgICAgICAgICAgICAgIENPTE9SX1lFTExPVywgQ09MT1JfV0hJVEUsICB0cnVlKTsKKwlETEdfQ09MT1IodGFnX2tleV9zZWxlY3RlZCwgICAgICBDT0xPUl9ZRUxMT1csIENPTE9SX0JMVUUsICAgdHJ1ZSk7CisJRExHX0NPTE9SKGNoZWNrLCAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0ssICBDT0xPUl9XSElURSwgIGZhbHNlKTsKKwlETEdfQ09MT1IoY2hlY2tfc2VsZWN0ZWQsICAgICAgICBDT0xPUl9XSElURSwgIENPTE9SX0JMVUUsICAgdHJ1ZSk7CisJRExHX0NPTE9SKHVhcnJvdywgICAgICAgICAgICAgICAgQ09MT1JfR1JFRU4sICBDT0xPUl9XSElURSwgIHRydWUpOworCURMR19DT0xPUihkYXJyb3csICAgICAgICAgICAgICAgIENPTE9SX0dSRUVOLCAgQ09MT1JfV0hJVEUsICB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2JsYWNrYmdfdGhlbWUodm9pZCkKK3sKKwlETEdfQ09MT1Ioc2NyZWVuLCBDT0xPUl9SRUQsICAgQ09MT1JfQkxBQ0ssIHRydWUpOworCURMR19DT0xPUihzaGFkb3csIENPTE9SX0JMQUNLLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihkaWFsb2csIENPTE9SX1dISVRFLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUih0aXRsZSwgIENPTE9SX1JFRCwgICBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihib3JkZXIsIENPTE9SX0JMQUNLLCBDT0xPUl9CTEFDSywgdHJ1ZSk7CisKKwlETEdfQ09MT1IoYnV0dG9uX2FjdGl2ZSwgICAgICAgICBDT0xPUl9ZRUxMT1csIENPTE9SX1JFRCwgICBmYWxzZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9pbmFjdGl2ZSwgICAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihidXR0b25fa2V5X2FjdGl2ZSwgICAgIENPTE9SX1lFTExPVywgQ09MT1JfUkVELCAgIHRydWUpOworCURMR19DT0xPUihidXR0b25fa2V5X2luYWN0aXZlLCAgIENPTE9SX1JFRCwgICAgQ09MT1JfQkxBQ0ssIGZhbHNlKTsKKwlETEdfQ09MT1IoYnV0dG9uX2xhYmVsX2FjdGl2ZSwgICBDT0xPUl9XSElURSwgIENPTE9SX1JFRCwgICBmYWxzZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZSwgQ09MT1JfQkxBQ0ssICBDT0xPUl9CTEFDSywgdHJ1ZSk7CisKKwlETEdfQ09MT1IoaW5wdXRib3gsICAgICAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihpbnB1dGJveF9ib3JkZXIsICBDT0xPUl9ZRUxMT1csIENPTE9SX0JMQUNLLCBmYWxzZSk7CisKKwlETEdfQ09MT1Ioc2VhcmNoYm94LCAgICAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihzZWFyY2hib3hfdGl0bGUsICBDT0xPUl9ZRUxMT1csIENPTE9SX0JMQUNLLCB0cnVlKTsKKwlETEdfQ09MT1Ioc2VhcmNoYm94X2JvcmRlciwgQ09MT1JfQkxBQ0ssICBDT0xPUl9CTEFDSywgdHJ1ZSk7CisKKwlETEdfQ09MT1IocG9zaXRpb25faW5kaWNhdG9yLCBDT0xPUl9SRUQsIENPTE9SX0JMQUNLLCAgZmFsc2UpOworCisJRExHX0NPTE9SKG1lbnVib3gsICAgICAgICAgIENPTE9SX1lFTExPVywgQ09MT1JfQkxBQ0ssIGZhbHNlKTsKKwlETEdfQ09MT1IobWVudWJveF9ib3JkZXIsICAgQ09MT1JfQkxBQ0ssICBDT0xPUl9CTEFDSywgdHJ1ZSk7CisKKwlETEdfQ09MT1IoaXRlbSwgICAgICAgICAgICAgQ09MT1JfV0hJVEUsIENPTE9SX0JMQUNLLCBmYWxzZSk7CisJRExHX0NPTE9SKGl0ZW1fc2VsZWN0ZWQsICAgIENPTE9SX1dISVRFLCBDT0xPUl9SRUQsICAgZmFsc2UpOworCisJRExHX0NPTE9SKHRhZywgICAgICAgICAgICAgIENPTE9SX1JFRCwgICAgQ09MT1JfQkxBQ0ssIGZhbHNlKTsKKwlETEdfQ09MT1IodGFnX3NlbGVjdGVkLCAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9SRUQsICAgdHJ1ZSk7CisJRExHX0NPTE9SKHRhZ19rZXksICAgICAgICAgIENPTE9SX1JFRCwgICAgQ09MT1JfQkxBQ0ssIGZhbHNlKTsKKwlETEdfQ09MT1IodGFnX2tleV9zZWxlY3RlZCwgQ09MT1JfWUVMTE9XLCBDT0xPUl9SRUQsICAgdHJ1ZSk7CisKKwlETEdfQ09MT1IoY2hlY2ssICAgICAgICAgICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTEFDSywgZmFsc2UpOworCURMR19DT0xPUihjaGVja19zZWxlY3RlZCwgICBDT0xPUl9ZRUxMT1csIENPTE9SX1JFRCwgICB0cnVlKTsKKworCURMR19DT0xPUih1YXJyb3csIENPTE9SX1JFRCwgQ09MT1JfQkxBQ0ssIGZhbHNlKTsKKwlETEdfQ09MT1IoZGFycm93LCBDT0xPUl9SRUQsIENPTE9SX0JMQUNLLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ibHVldGl0bGVfdGhlbWUodm9pZCkKK3sKKwlzZXRfY2xhc3NpY190aGVtZSgpOworCURMR19DT0xPUih0aXRsZSwgICAgICAgICAgICAgICBDT0xPUl9CTFVFLCAgIENPTE9SX1dISVRFLCB0cnVlKTsKKwlETEdfQ09MT1IoYnV0dG9uX2tleV9hY3RpdmUsICAgQ09MT1JfWUVMTE9XLCBDT0xPUl9CTFVFLCAgdHJ1ZSk7CisJRExHX0NPTE9SKGJ1dHRvbl9sYWJlbF9hY3RpdmUsIENPTE9SX1dISVRFLCAgQ09MT1JfQkxVRSwgIHRydWUpOworCURMR19DT0xPUihzZWFyY2hib3hfdGl0bGUsICAgICBDT0xPUl9CTFVFLCAgIENPTE9SX1dISVRFLCB0cnVlKTsKKwlETEdfQ09MT1IocG9zaXRpb25faW5kaWNhdG9yLCAgQ09MT1JfQkxVRSwgICBDT0xPUl9XSElURSwgdHJ1ZSk7CisJRExHX0NPTE9SKHRhZywgICAgICAgICAgICAgICAgIENPTE9SX0JMVUUsICAgQ09MT1JfV0hJVEUsIHRydWUpOworCURMR19DT0xPUih0YWdfa2V5LCAgICAgICAgICAgICBDT0xPUl9CTFVFLCAgIENPTE9SX1dISVRFLCB0cnVlKTsKKworfQorCisvKgorICogU2VsZWN0IGNvbG9yIHRoZW1lCisgKi8KK3N0YXRpYyBpbnQgc2V0X3RoZW1lKGNvbnN0IGNoYXIgKnRoZW1lKQoreworCWludCB1c2VfY29sb3IgPSAxOworCWlmICghdGhlbWUpCisJCXNldF9ibHVldGl0bGVfdGhlbWUoKTsKKwllbHNlIGlmIChzdHJjbXAodGhlbWUsICJjbGFzc2ljIikgPT0gMCkKKwkJc2V0X2NsYXNzaWNfdGhlbWUoKTsKKwllbHNlIGlmIChzdHJjbXAodGhlbWUsICJibHVldGl0bGUiKSA9PSAwKQorCQlzZXRfYmx1ZXRpdGxlX3RoZW1lKCk7CisJZWxzZSBpZiAoc3RyY21wKHRoZW1lLCAiYmxhY2tiZyIpID09IDApCisJCXNldF9ibGFja2JnX3RoZW1lKCk7CisJZWxzZSBpZiAoc3RyY21wKHRoZW1lLCAibW9ubyIpID09IDApCisJCXVzZV9jb2xvciA9IDA7CisKKwlyZXR1cm4gdXNlX2NvbG9yOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uZV9jb2xvcihzdHJ1Y3QgZGlhbG9nX2NvbG9yICpjb2xvcikKK3sKKwlzdGF0aWMgaW50IHBhaXIgPSAwOworCisJcGFpcisrOworCWluaXRfcGFpcihwYWlyLCBjb2xvci0+ZmcsIGNvbG9yLT5iZyk7CisJaWYgKGNvbG9yLT5obCkKKwkJY29sb3ItPmF0ciA9IEFfQk9MRCB8IENPTE9SX1BBSVIocGFpcik7CisJZWxzZQorCQljb2xvci0+YXRyID0gQ09MT1JfUEFJUihwYWlyKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9kaWFsb2dfY29sb3JzKHZvaWQpCit7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5zY3JlZW4pOworCWluaXRfb25lX2NvbG9yKCZkbGcuc2hhZG93KTsKKwlpbml0X29uZV9jb2xvcigmZGxnLmRpYWxvZyk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy50aXRsZSk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5ib3JkZXIpOworCWluaXRfb25lX2NvbG9yKCZkbGcuYnV0dG9uX2FjdGl2ZSk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5idXR0b25faW5hY3RpdmUpOworCWluaXRfb25lX2NvbG9yKCZkbGcuYnV0dG9uX2tleV9hY3RpdmUpOworCWluaXRfb25lX2NvbG9yKCZkbGcuYnV0dG9uX2tleV9pbmFjdGl2ZSk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5idXR0b25fbGFiZWxfYWN0aXZlKTsKKwlpbml0X29uZV9jb2xvcigmZGxnLmJ1dHRvbl9sYWJlbF9pbmFjdGl2ZSk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5pbnB1dGJveCk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5pbnB1dGJveF9ib3JkZXIpOworCWluaXRfb25lX2NvbG9yKCZkbGcuc2VhcmNoYm94KTsKKwlpbml0X29uZV9jb2xvcigmZGxnLnNlYXJjaGJveF90aXRsZSk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5zZWFyY2hib3hfYm9yZGVyKTsKKwlpbml0X29uZV9jb2xvcigmZGxnLnBvc2l0aW9uX2luZGljYXRvcik7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5tZW51Ym94KTsKKwlpbml0X29uZV9jb2xvcigmZGxnLm1lbnVib3hfYm9yZGVyKTsKKwlpbml0X29uZV9jb2xvcigmZGxnLml0ZW0pOworCWluaXRfb25lX2NvbG9yKCZkbGcuaXRlbV9zZWxlY3RlZCk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy50YWcpOworCWluaXRfb25lX2NvbG9yKCZkbGcudGFnX3NlbGVjdGVkKTsKKwlpbml0X29uZV9jb2xvcigmZGxnLnRhZ19rZXkpOworCWluaXRfb25lX2NvbG9yKCZkbGcudGFnX2tleV9zZWxlY3RlZCk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5jaGVjayk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy5jaGVja19zZWxlY3RlZCk7CisJaW5pdF9vbmVfY29sb3IoJmRsZy51YXJyb3cpOworCWluaXRfb25lX2NvbG9yKCZkbGcuZGFycm93KTsKK30KKworLyoKKyAqIFNldHVwIGZvciBjb2xvciBkaXNwbGF5CisgKi8KK3N0YXRpYyB2b2lkIGNvbG9yX3NldHVwKGNvbnN0IGNoYXIgKnRoZW1lKQoreworCWlmIChzZXRfdGhlbWUodGhlbWUpKSB7CisJCWlmIChoYXNfY29sb3JzKCkpIHsJLyogVGVybWluYWwgc3VwcG9ydHMgY29sb3I/ICovCisJCQlzdGFydF9jb2xvcigpOworCQkJaW5pdF9kaWFsb2dfY29sb3JzKCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJc2V0X21vbm9fdGhlbWUoKTsKKwl9Cit9CisKKy8qCisgKiBTZXQgd2luZG93IHRvIGF0dHJpYnV0ZSAnYXR0cicKKyAqLwordm9pZCBhdHRyX2NsZWFyKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cikKK3sKKwlpbnQgaSwgajsKKworCXdhdHRyc2V0KHdpbiwgYXR0cik7CisJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJCXdtb3ZlKHdpbiwgaSwgMCk7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCQkJd2FkZGNoKHdpbiwgJyAnKTsKKwl9CisJdG91Y2h3aW4od2luKTsKK30KKwordm9pZCBkaWFsb2dfY2xlYXIodm9pZCkKK3sKKwlhdHRyX2NsZWFyKHN0ZHNjciwgTElORVMsIENPTFMsIGRsZy5zY3JlZW4uYXRyKTsKKwkvKiBEaXNwbGF5IGJhY2tncm91bmQgdGl0bGUgaWYgaXQgZXhpc3RzIC4uLiAtIFNMSCAqLworCWlmIChkbGcuYmFja3RpdGxlICE9IE5VTEwpIHsKKwkJaW50IGk7CisKKwkJd2F0dHJzZXQoc3Rkc2NyLCBkbGcuc2NyZWVuLmF0cik7CisJCW12d2FkZHN0cihzdGRzY3IsIDAsIDEsIChjaGFyICopZGxnLmJhY2t0aXRsZSk7CisJCXdtb3ZlKHN0ZHNjciwgMSwgMSk7CisJCWZvciAoaSA9IDE7IGkgPCBDT0xTIC0gMTsgaSsrKQorCQkJd2FkZGNoKHN0ZHNjciwgQUNTX0hMSU5FKTsKKwl9CisJd25vdXRyZWZyZXNoKHN0ZHNjcik7Cit9CisKKy8qCisgKiBEbyBzb21lIGluaXRpYWxpemF0aW9uIGZvciBkaWFsb2cKKyAqLwordm9pZCBpbml0X2RpYWxvZyhjb25zdCBjaGFyICpiYWNrdGl0bGUpCit7CisJZGxnLmJhY2t0aXRsZSA9IGJhY2t0aXRsZTsKKwljb2xvcl9zZXR1cChnZXRlbnYoIk1FTlVDT05GSUdfQ09MT1IiKSk7Cit9CisKK3ZvaWQgcmVzZXRfZGlhbG9nKHZvaWQpCit7CisJaW5pdHNjcigpOwkJLyogSW5pdCBjdXJzZXMgKi8KKwlrZXlwYWQoc3Rkc2NyLCBUUlVFKTsKKwljYnJlYWsoKTsKKwlub2VjaG8oKTsKKwlkaWFsb2dfY2xlYXIoKTsKK30KKworLyoKKyAqIEVuZCB1c2luZyBkaWFsb2cgZnVuY3Rpb25zLgorICovCit2b2lkIGVuZF9kaWFsb2codm9pZCkKK3sKKwllbmR3aW4oKTsKK30KKworLyogUHJpbnQgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuIENlbnRlciB0aGUgdGl0bGUgYW5kIHRydW5jYXRlCisgKiB0aWxlIGlmIHdpZGVyIHRoYW4gZGlhbG9nICgtIDIgY2hhcnMpLgorICoqLwordm9pZCBwcmludF90aXRsZShXSU5ET1cgKmRpYWxvZywgY29uc3QgY2hhciAqdGl0bGUsIGludCB3aWR0aCkKK3sKKwlpZiAodGl0bGUpIHsKKwkJaW50IHRsZW4gPSBNSU4od2lkdGggLSAyLCBzdHJsZW4odGl0bGUpKTsKKwkJd2F0dHJzZXQoZGlhbG9nLCBkbGcudGl0bGUuYXRyKTsKKwkJbXZ3YWRkY2goZGlhbG9nLCAwLCAod2lkdGggLSB0bGVuKSAvIDIgLSAxLCAnICcpOworCQltdndhZGRuc3RyKGRpYWxvZywgMCwgKHdpZHRoIC0gdGxlbikvMiwgdGl0bGUsIHRsZW4pOworCQl3YWRkY2goZGlhbG9nLCAnICcpOworCX0KK30KKworLyoKKyAqIFByaW50IGEgc3RyaW5nIG9mIHRleHQgaW4gYSB3aW5kb3csIGF1dG9tYXRpY2FsbHkgd3JhcCBhcm91bmQgdG8gdGhlCisgKiBuZXh0IGxpbmUgaWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZyB0byBmaXQgb24gb25lIGxpbmUuIE5ld2xpbmUKKyAqIGNoYXJhY3RlcnMgJ1xuJyBhcmUgcmVwbGFjZWQgYnkgc3BhY2VzLiAgV2Ugc3RhcnQgb24gYSBuZXcgbGluZQorICogaWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgYXQgbGVhc3QgNCBub25ibGFua3MgZm9sbG93aW5nIGEgZG91YmxlLXNwYWNlLgorICovCit2b2lkIHByaW50X2F1dG93cmFwKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgd2lkdGgsIGludCB5LCBpbnQgeCkKK3sKKwlpbnQgbmV3bCwgY3VyX3gsIGN1cl95OworCWludCBpLCBwcm9tcHRfbGVuLCByb29tLCB3bGVuOworCWNoYXIgdGVtcHN0cltNQVhfTEVOICsgMV0sICp3b3JkLCAqc3AsICpzcDI7CisKKwlzdHJjcHkodGVtcHN0ciwgcHJvbXB0KTsKKworCXByb21wdF9sZW4gPSBzdHJsZW4odGVtcHN0cik7CisKKwkvKgorCSAqIFJlbW92ZSBuZXdsaW5lcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBwcm9tcHRfbGVuOyBpKyspIHsKKwkJaWYgKHRlbXBzdHJbaV0gPT0gJ1xuJykKKwkJCXRlbXBzdHJbaV0gPSAnICc7CisJfQorCisJaWYgKHByb21wdF9sZW4gPD0gd2lkdGggLSB4ICogMikgewkvKiBJZiBwcm9tcHQgaXMgc2hvcnQgKi8KKwkJd21vdmUod2luLCB5LCAod2lkdGggLSBwcm9tcHRfbGVuKSAvIDIpOworCQl3YWRkc3RyKHdpbiwgdGVtcHN0cik7CisJfSBlbHNlIHsKKwkJY3VyX3ggPSB4OworCQljdXJfeSA9IHk7CisJCW5ld2wgPSAxOworCQl3b3JkID0gdGVtcHN0cjsKKwkJd2hpbGUgKHdvcmQgJiYgKndvcmQpIHsKKwkJCXNwID0gaW5kZXgod29yZCwgJyAnKTsKKwkJCWlmIChzcCkKKwkJCQkqc3ArKyA9IDA7CisKKwkJCS8qIFdyYXAgdG8gbmV4dCBsaW5lIGlmIGVpdGhlciB0aGUgd29yZCBkb2VzIG5vdCBmaXQsCisJCQkgICBvciBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvZiBhIG5ldyBzZW50ZW5jZSwgYW5kIGl0IGlzCisJCQkgICBzaG9ydCwgYW5kIHRoZSBuZXh0IHdvcmQgZG9lcyBub3QgZml0LiAqLworCQkJcm9vbSA9IHdpZHRoIC0gY3VyX3g7CisJCQl3bGVuID0gc3RybGVuKHdvcmQpOworCQkJaWYgKHdsZW4gPiByb29tIHx8CisJCQkgICAgKG5ld2wgJiYgd2xlbiA8IDQgJiYgc3AKKwkJCSAgICAgJiYgd2xlbiArIDEgKyBzdHJsZW4oc3ApID4gcm9vbQorCQkJICAgICAmJiAoIShzcDIgPSBpbmRleChzcCwgJyAnKSkKKwkJCQkgfHwgd2xlbiArIDEgKyAoc3AyIC0gc3ApID4gcm9vbSkpKSB7CisJCQkJY3VyX3krKzsKKwkJCQljdXJfeCA9IHg7CisJCQl9CisJCQl3bW92ZSh3aW4sIGN1cl95LCBjdXJfeCk7CisJCQl3YWRkc3RyKHdpbiwgd29yZCk7CisJCQlnZXR5eCh3aW4sIGN1cl95LCBjdXJfeCk7CisJCQljdXJfeCsrOworCQkJaWYgKHNwICYmICpzcCA9PSAnICcpIHsKKwkJCQljdXJfeCsrOwkvKiBkb3VibGUgc3BhY2UgKi8KKwkJCQl3aGlsZSAoKisrc3AgPT0gJyAnKSA7CisJCQkJbmV3bCA9IDE7CisJCQl9IGVsc2UKKwkJCQluZXdsID0gMDsKKwkJCXdvcmQgPSBzcDsKKwkJfQorCX0KK30KKworLyoKKyAqIFByaW50IGEgYnV0dG9uCisgKi8KK3ZvaWQgcHJpbnRfYnV0dG9uKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKQoreworCWludCBpLCB0ZW1wOworCisJd21vdmUod2luLCB5LCB4KTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLmJ1dHRvbl9hY3RpdmUuYXRyCisJCSA6IGRsZy5idXR0b25faW5hY3RpdmUuYXRyKTsKKwl3YWRkc3RyKHdpbiwgIjwiKTsKKwl0ZW1wID0gc3Ryc3BuKGxhYmVsLCAiICIpOworCWxhYmVsICs9IHRlbXA7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGRsZy5idXR0b25fbGFiZWxfYWN0aXZlLmF0cgorCQkgOiBkbGcuYnV0dG9uX2xhYmVsX2luYWN0aXZlLmF0cik7CisJZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykKKwkJd2FkZGNoKHdpbiwgJyAnKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLmJ1dHRvbl9rZXlfYWN0aXZlLmF0cgorCQkgOiBkbGcuYnV0dG9uX2tleV9pbmFjdGl2ZS5hdHIpOworCXdhZGRjaCh3aW4sIGxhYmVsWzBdKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLmJ1dHRvbl9sYWJlbF9hY3RpdmUuYXRyCisJCSA6IGRsZy5idXR0b25fbGFiZWxfaW5hY3RpdmUuYXRyKTsKKwl3YWRkc3RyKHdpbiwgKGNoYXIgKilsYWJlbCArIDEpOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBkbGcuYnV0dG9uX2FjdGl2ZS5hdHIKKwkJIDogZGxnLmJ1dHRvbl9pbmFjdGl2ZS5hdHIpOworCXdhZGRzdHIod2luLCAiPiIpOworCXdtb3ZlKHdpbiwgeSwgeCArIHRlbXAgKyAxKTsKK30KKworLyoKKyAqIERyYXcgYSByZWN0YW5ndWxhciBib3ggd2l0aCBsaW5lIGRyYXdpbmcgY2hhcmFjdGVycworICovCit2b2lkCitkcmF3X2JveChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCSBjaHR5cGUgYm94LCBjaHR5cGUgYm9yZGVyKQoreworCWludCBpLCBqOworCisJd2F0dHJzZXQod2luLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJd21vdmUod2luLCB5ICsgaSwgeCk7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCQkJaWYgKCFpICYmICFqKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19VTENPUk5FUik7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgIWopCisJCQkJd2FkZGNoKHdpbiwgYm9yZGVyIHwgQUNTX0xMQ09STkVSKTsKKwkJCWVsc2UgaWYgKCFpICYmIGogPT0gd2lkdGggLSAxKQorCQkJCXdhZGRjaCh3aW4sIGJveCB8IEFDU19VUkNPUk5FUik7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgaiA9PSB3aWR0aCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX0xSQ09STkVSKTsKKwkJCWVsc2UgaWYgKCFpKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19ITElORSk7CisJCQllbHNlIGlmIChpID09IGhlaWdodCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX0hMSU5FKTsKKwkJCWVsc2UgaWYgKCFqKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19WTElORSk7CisJCQllbHNlIGlmIChqID09IHdpZHRoIC0gMSkKKwkJCQl3YWRkY2god2luLCBib3ggfCBBQ1NfVkxJTkUpOworCQkJZWxzZQorCQkJCXdhZGRjaCh3aW4sIGJveCB8ICcgJyk7CisJfQorfQorCisvKgorICogRHJhdyBzaGFkb3dzIGFsb25nIHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2UgdG8gZ2l2ZSBhIG1vcmUgM0QgbG9vaworICogdG8gdGhlIGJveGVzCisgKi8KK3ZvaWQgZHJhd19zaGFkb3coV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaTsKKworCWlmIChoYXNfY29sb3JzKCkpIHsJLyogV2hldGhlciB0ZXJtaW5hbCBzdXBwb3J0cyBjb2xvcj8gKi8KKwkJd2F0dHJzZXQod2luLCBkbGcuc2hhZG93LmF0cik7CisJCXdtb3ZlKHdpbiwgeSArIGhlaWdodCwgeCArIDIpOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkJCXdhZGRjaCh3aW4sIHdpbmNoKHdpbikgJiBBX0NIQVJURVhUKTsKKwkJZm9yIChpID0geSArIDE7IGkgPCB5ICsgaGVpZ2h0ICsgMTsgaSsrKSB7CisJCQl3bW92ZSh3aW4sIGksIHggKyB3aWR0aCk7CisJCQl3YWRkY2god2luLCB3aW5jaCh3aW4pICYgQV9DSEFSVEVYVCk7CisJCQl3YWRkY2god2luLCB3aW5jaCh3aW4pICYgQV9DSEFSVEVYVCk7CisJCX0KKwkJd25vdXRyZWZyZXNoKHdpbik7CisJfQorfQorCisvKgorICogIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGFscGhhYmV0aWMgY2hhcmFjdGVyIGluIGEgc3RyaW5nLgorICovCitpbnQgZmlyc3RfYWxwaGEoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpleGVtcHQpCit7CisJaW50IGksIGluX3BhcmVuID0gMCwgYzsKKworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oc3RyaW5nKTsgaSsrKSB7CisJCWMgPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisKKwkJaWYgKHN0cmNocigiPFsoIiwgYykpCisJCQkrK2luX3BhcmVuOworCQlpZiAoc3RyY2hyKCI+XSkiLCBjKSAmJiBpbl9wYXJlbiA+IDApCisJCQktLWluX3BhcmVuOworCisJCWlmICgoIWluX3BhcmVuKSAmJiBpc2FscGhhKGMpICYmIHN0cmNocihleGVtcHQsIGMpID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5jdXJzZXMgdXNlcyBFU0MgdG8gZGV0ZWN0IGVzY2FwZWQgY2hhciBzZXF1ZW5jZXMuIFRoaXMgcmVzdXRsIGluCisgKiBhIHNtYWxsIHRpbWVvdXQgYmVmb3JlIEVTQyBpcyBhY3R1YWxseSBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgorICogbHhkaWFsb2cgc3VnZ2VzdCA8RVNDPiA8RVNDPiB3aGljaCBpcyBjb3JyZWN0bHkgdHJhbnNsYXRlZCB0byB0d28KKyAqIHRpbWVzIGVzYy4gQnV0IHRoZW4gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHNlY29uZCBlc2MgdG8gYXZvaWQgc3RlcHBpbmcKKyAqIG91dCBvbmUgbWVudSB0b28gbXVjaC4gRmlsdGVyIGF3YXkgYWxsIGVzY2FwZWQga2V5IHNlcXVlbmNlcyBzaW5jZQorICoga2V5cGFkKEZBTFNFKSB0dXJuIG9mZiBuY3Vyc2VzIHN1cHBvcnQgZm9yIGVzY2FwZSBzZXF1ZW5jZXMgLSBhbmQgdGhhdHMKKyAqIG5lZWRlZCB0byBtYWtlIG5vdGltZW91dCgpIGRvIGFzIGV4cGVjdGVkLgorICovCitpbnQgb25fa2V5X2VzYyhXSU5ET1cgKndpbikKK3sKKwlpbnQga2V5OworCWludCBrZXkyOworCWludCBrZXkzOworCisJbm9kZWxheSh3aW4sIFRSVUUpOworCWtleXBhZCh3aW4sIEZBTFNFKTsKKwlrZXkgPSB3Z2V0Y2god2luKTsKKwlrZXkyID0gd2dldGNoKHdpbik7CisJZG8geworCQlrZXkzID0gd2dldGNoKHdpbik7CisJfSB3aGlsZSAoa2V5MyAhPSBFUlIpOworCW5vZGVsYXkod2luLCBGQUxTRSk7CisJa2V5cGFkKHdpbiwgVFJVRSk7CisJaWYgKGtleSA9PSBLRVlfRVNDICYmIGtleTIgPT0gRVJSKQorCQlyZXR1cm4gS0VZX0VTQzsKKwllbHNlIGlmIChrZXkgIT0gRVJSICYmIGtleSAhPSBLRVlfRVNDICYmIGtleTIgPT0gRVJSKQorCQl1bmdldGNoKGtleSk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHJlZHJhdyBzY3JlZW4gaW4gbmV3IHNpemUgKi8KK2ludCBvbl9rZXlfcmVzaXplKHZvaWQpCit7CisJZGlhbG9nX2NsZWFyKCk7CisJcmV0dXJuIEtFWV9SRVNJWkU7Cit9CisKK3N0cnVjdCBkaWFsb2dfbGlzdCAqaXRlbV9jdXI7CitzdHJ1Y3QgZGlhbG9nX2xpc3QgaXRlbV9uaWw7CitzdHJ1Y3QgZGlhbG9nX2xpc3QgKml0ZW1faGVhZDsKKwordm9pZCBpdGVtX3Jlc2V0KHZvaWQpCit7CisJc3RydWN0IGRpYWxvZ19saXN0ICpwLCAqbmV4dDsKKworCWZvciAocCA9IGl0ZW1faGVhZDsgcDsgcCA9IG5leHQpIHsKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWZyZWUocCk7CisJfQorCWl0ZW1faGVhZCA9IE5VTEw7CisJaXRlbV9jdXIgPSAmaXRlbV9uaWw7Cit9CisKK3ZvaWQgaXRlbV9tYWtlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJc3RydWN0IGRpYWxvZ19saXN0ICpwID0gbWFsbG9jKHNpemVvZigqcCkpOworCisJaWYgKGl0ZW1faGVhZCkKKwkJaXRlbV9jdXItPm5leHQgPSBwOworCWVsc2UKKwkJaXRlbV9oZWFkID0gcDsKKwlpdGVtX2N1ciA9IHA7CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKGl0ZW1fY3VyLT5ub2RlLnN0ciwgc2l6ZW9mKGl0ZW1fY3VyLT5ub2RlLnN0ciksIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgaXRlbV9hZGRfc3RyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisgICAgICAgIHNpemVfdCBhdmFpbDsKKworCWF2YWlsID0gc2l6ZW9mKGl0ZW1fY3VyLT5ub2RlLnN0cikgLSBzdHJsZW4oaXRlbV9jdXItPm5vZGUuc3RyKTsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZzbnByaW50ZihpdGVtX2N1ci0+bm9kZS5zdHIgKyBzdHJsZW4oaXRlbV9jdXItPm5vZGUuc3RyKSwKKwkJICBhdmFpbCwgZm10LCBhcCk7CisJaXRlbV9jdXItPm5vZGUuc3RyW3NpemVvZihpdGVtX2N1ci0+bm9kZS5zdHIpIC0gMV0gPSAnXDAnOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgaXRlbV9zZXRfdGFnKGNoYXIgdGFnKQoreworCWl0ZW1fY3VyLT5ub2RlLnRhZyA9IHRhZzsKK30KK3ZvaWQgaXRlbV9zZXRfZGF0YSh2b2lkICpwdHIpCit7CisJaXRlbV9jdXItPm5vZGUuZGF0YSA9IHB0cjsKK30KKwordm9pZCBpdGVtX3NldF9zZWxlY3RlZChpbnQgdmFsKQoreworCWl0ZW1fY3VyLT5ub2RlLnNlbGVjdGVkID0gdmFsOworfQorCitpbnQgaXRlbV9hY3RpdmF0ZV9zZWxlY3RlZCh2b2lkKQoreworCWl0ZW1fZm9yZWFjaCgpCisJCWlmIChpdGVtX2lzX3NlbGVjdGVkKCkpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqaXRlbV9kYXRhKHZvaWQpCit7CisJcmV0dXJuIGl0ZW1fY3VyLT5ub2RlLmRhdGE7Cit9CisKK2NoYXIgaXRlbV90YWcodm9pZCkKK3sKKwlyZXR1cm4gaXRlbV9jdXItPm5vZGUudGFnOworfQorCitpbnQgaXRlbV9jb3VudCh2b2lkKQoreworCWludCBuID0gMDsKKwlzdHJ1Y3QgZGlhbG9nX2xpc3QgKnA7CisKKwlmb3IgKHAgPSBpdGVtX2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQorCQluKys7CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgaXRlbV9zZXQoaW50IG4pCit7CisJaW50IGkgPSAwOworCWl0ZW1fZm9yZWFjaCgpCisJCWlmIChpKysgPT0gbikKKwkJCXJldHVybjsKK30KKworaW50IGl0ZW1fbih2b2lkKQoreworCWludCBuID0gMDsKKwlzdHJ1Y3QgZGlhbG9nX2xpc3QgKnA7CisKKwlmb3IgKHAgPSBpdGVtX2hlYWQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwID09IGl0ZW1fY3VyKQorCQkJcmV0dXJuIG47CisJCW4rKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKml0ZW1fc3RyKHZvaWQpCit7CisJcmV0dXJuIGl0ZW1fY3VyLT5ub2RlLnN0cjsKK30KKworaW50IGl0ZW1faXNfc2VsZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gKGl0ZW1fY3VyLT5ub2RlLnNlbGVjdGVkICE9IDApOworfQorCitpbnQgaXRlbV9pc190YWcoY2hhciB0YWcpCit7CisJcmV0dXJuIChpdGVtX2N1ci0+bm9kZS50YWcgPT0gdGFnKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL2x4ZGlhbG9nL3llc25vLmMgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy95ZXNuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGEwNGUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy9seGRpYWxvZy95ZXNuby5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogIHllc25vLmMgLS0gaW1wbGVtZW50cyB0aGUgeWVzL25vIGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisvKgorICogRGlzcGxheSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDEwOworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbihkaWFsb2csICIgWWVzICIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbihkaWFsb2csICIgIE5vICAiLCB5LCB4ICsgMTMsIHNlbGVjdGVkID09IDEpOworCisJd21vdmUoZGlhbG9nLCB5LCB4ICsgMSArIDEzICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCB3aXRoIHR3byBidXR0b25zIC0gWWVzIGFuZCBObworICovCitpbnQgZGlhbG9nX3llc25vKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaSwgeCwgeSwga2V5ID0gMCwgYnV0dG9uID0gMDsKKwlXSU5ET1cgKmRpYWxvZzsKKworZG9fcmVzaXplOgorCWlmIChnZXRtYXh5KHN0ZHNjcikgPCAoaGVpZ2h0ICsgNCkpCisJCXJldHVybiAtRVJSRElTUExBWVRPT1NNQUxMOworCWlmIChnZXRtYXh4KHN0ZHNjcikgPCAod2lkdGggKyA0KSkKKwkJcmV0dXJuIC1FUlJESVNQTEFZVE9PU01BTEw7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsCisJCSBkbGcuZGlhbG9nLmF0ciwgZGxnLmJvcmRlci5hdHIpOworCXdhdHRyc2V0KGRpYWxvZywgZGxnLmJvcmRlci5hdHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRsZy5kaWFsb2cuYXRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworCXdoaWxlIChrZXkgIT0gS0VZX0VTQykgeworCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnWSc6CisJCWNhc2UgJ3knOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnTic6CisJCWNhc2UgJ24nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMTsKKworCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkgPyAxIDogKGJ1dHRvbiA+IDEgPyAwIDogYnV0dG9uKTsKKworCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIGJ1dHRvbik7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiBidXR0b247CisJCWNhc2UgS0VZX0VTQzoKKwkJCWtleSA9IG9uX2tleV9lc2MoZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9SRVNJWkU6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCW9uX2tleV9yZXNpemUoKTsKKwkJCWdvdG8gZG9fcmVzaXplOworCQl9CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJcmV0dXJuIGtleTsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9tY29uZi5jIGIvdG95Ym94L2tjb25maWcvbWNvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFjZGMwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2tjb25maWcvbWNvbmYuYwpAQCAtMCwwICsxLDkxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICoKKyAqIEludHJvZHVjZWQgc2luZ2xlIG1lbnUgbW9kZSAoc2hvdyBhbGwgc3ViLW1lbnVzIGluIG9uZSBsYXJnZSB0cmVlKS4KKyAqIDIwMDItMTEtMDYgUGV0ciBCYXVkaXMgPHBhc2t5QHVjdy5jej4KKyAqCisgKiBpMThuLCAyMDA1LCBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqLworCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAibHhkaWFsb2cvZGlhbG9nLmgiCisKK3N0YXRpYyBjaGFyIG1lbnVfYmFja3RpdGxlWzEyOF07CitzdGF0aWMgY29uc3QgY2hhciBtY29uZl9yZWFkbWVbXSA9IE5fKAorIk92ZXJ2aWV3XG4iCisiLS0tLS0tLS1cbiIKKyJTb21lIGZlYXR1cmVzIG1heSBiZSBidWlsdCBkaXJlY3RseSBpbnRvIHRoZSBwcm9qZWN0LlxuIgorIlNvbWUgbWF5IGJlIG1hZGUgaW50byBsb2FkYWJsZSBydW50aW1lIG1vZHVsZXMuICBTb21lIGZlYXR1cmVzXG4iCisibWF5IGJlIGNvbXBsZXRlbHkgcmVtb3ZlZCBhbHRvZ2V0aGVyLiAgVGhlcmUgYXJlIGFsc28gY2VydGFpblxuIgorInBhcmFtZXRlcnMgd2hpY2ggYXJlIG5vdCByZWFsbHkgZmVhdHVyZXMsIGJ1dCBtdXN0IGJlXG4iCisiZW50ZXJlZCBpbiBhcyBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIG51bWJlcnMgb3IgcG9zc2libHkgdGV4dC5cbiIKKyJcbiIKKyJNZW51IGl0ZW1zIGJlZ2lubmluZyB3aXRoIFsqXSwgPE0+IG9yIFsgXSByZXByZXNlbnQgZmVhdHVyZXNcbiIKKyJjb25maWd1cmVkIHRvIGJlIGJ1aWx0IGluLCBtb2R1bGFyaXplZCBvciByZW1vdmVkIHJlc3BlY3RpdmVseS5cbiIKKyJQb2ludGVkIGJyYWNrZXRzIDw+IHJlcHJlc2VudCBtb2R1bGUgY2FwYWJsZSBmZWF0dXJlcy5cbiIKKyJcbiIKKyJUbyBjaGFuZ2UgYW55IG9mIHRoZXNlIGZlYXR1cmVzLCBoaWdobGlnaHQgaXQgd2l0aCB0aGUgY3Vyc29yXG4iCisia2V5cyBhbmQgcHJlc3MgPFk+IHRvIGJ1aWxkIGl0IGluLCA8TT4gdG8gbWFrZSBpdCBhIG1vZHVsZSBvclxuIgorIjxOPiB0byByZW1vdmVkIGl0LiAgWW91IG1heSBhbHNvIHByZXNzIHRoZSA8U3BhY2UgQmFyPiB0byBjeWNsZVxuIgorInRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcHRpb25zIChpZS4gWS0+Ti0+TS0+WSkuXG4iCisiXG4iCisiU29tZSBhZGRpdGlvbmFsIGtleWJvYXJkIGhpbnRzOlxuIgorIlxuIgorIk1lbnVzXG4iCisiLS0tLS0tLS0tLVxuIgorIm8gIFVzZSB0aGUgVXAvRG93biBhcnJvdyBrZXlzIChjdXJzb3Iga2V5cykgdG8gaGlnaGxpZ2h0IHRoZSBpdGVtXG4iCisiICAgeW91IHdpc2ggdG8gY2hhbmdlIG9yIHN1Ym1lbnUgd2lzaCB0byBzZWxlY3QgYW5kIHByZXNzIDxFbnRlcj4uXG4iCisiICAgU3VibWVudXMgYXJlIGRlc2lnbmF0ZWQgYnkgXCItLS0+XCIuXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIHRoZSBvcHRpb24ncyBoaWdobGlnaHRlZCBsZXR0ZXIgKGhvdGtleSkuXG4iCisiICAgICAgICAgICAgIFByZXNzaW5nIGEgaG90a2V5IG1vcmUgdGhhbiBvbmNlIHdpbGwgc2VxdWVuY2VcbiIKKyIgICAgICAgICAgICAgdGhyb3VnaCBhbGwgdmlzaWJsZSBpdGVtcyB3aGljaCB1c2UgdGhhdCBob3RrZXkuXG4iCisiXG4iCisiICAgWW91IG1heSBhbHNvIHVzZSB0aGUgPFBBR0UgVVA+IGFuZCA8UEFHRSBET1dOPiBrZXlzIHRvIHNjcm9sbFxuIgorIiAgIHVuc2VlbiBvcHRpb25zIGludG8gdmlldy5cbiIKKyJcbiIKKyJvICBUbyBleGl0IGEgbWVudSB1c2UgdGhlIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCB0aGUgPEV4aXQ+IGJ1dHRvblxuIgorIiAgIGFuZCBwcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8RVNDPjxFU0M+IG9yIDxFPiBvciA8WD4gaWYgdGhlcmUgaXMgbm8gaG90a2V5XG4iCisiICAgICAgICAgICAgIHVzaW5nIHRob3NlIGxldHRlcnMuICBZb3UgbWF5IHByZXNzIGEgc2luZ2xlIDxFU0M+LCBidXRcbiIKKyIgICAgICAgICAgICAgdGhlcmUgaXMgYSBkZWxheWVkIHJlc3BvbnNlIHdoaWNoIHlvdSBtYXkgZmluZCBhbm5veWluZy5cbiIKKyJcbiIKKyIgICBBbHNvLCB0aGUgPFRBQj4gYW5kIGN1cnNvciBrZXlzIHdpbGwgY3ljbGUgYmV0d2VlbiA8U2VsZWN0PixcbiIKKyIgICA8RXhpdD4gYW5kIDxIZWxwPlxuIgorIlxuIgorIm8gIFRvIGdldCBoZWxwIHdpdGggYW4gaXRlbSwgdXNlIHRoZSBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgPEhlbHA+XG4iCisiICAgYW5kIFByZXNzIDxFTlRFUj4uXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIDxIPiBvciA8Pz4uXG4iCisiXG4iCisiXG4iCisiUmFkaW9saXN0cyAgKENob2ljZSBsaXN0cylcbiIKKyItLS0tLS0tLS0tLVxuIgorIm8gIFVzZSB0aGUgY3Vyc29yIGtleXMgdG8gc2VsZWN0IHRoZSBvcHRpb24geW91IHdpc2ggdG8gc2V0IGFuZCBwcmVzc1xuIgorIiAgIDxTPiBvciB0aGUgPFNQQUNFIEJBUj4uXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG9wdGlvbiB5b3Ugd2lzaCB0byBzZXQgdGhlblxuIgorIiAgICAgICAgICAgICBwcmVzcyA8Uz4gb3IgPFNQQUNFIEJBUj4uXG4iCisiXG4iCisibyAgVG8gc2VlIGF2YWlsYWJsZSBoZWxwIGZvciB0aGUgaXRlbSwgdXNlIHRoZSBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHRcbiIKKyIgICA8SGVscD4gYW5kIFByZXNzIDxFTlRFUj4uXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIDxIPiBvciA8Pz4uXG4iCisiXG4iCisiICAgQWxzbywgdGhlIDxUQUI+IGFuZCBjdXJzb3Iga2V5cyB3aWxsIGN5Y2xlIGJldHdlZW4gPFNlbGVjdD4gYW5kXG4iCisiICAgPEhlbHA+XG4iCisiXG4iCisiXG4iCisiRGF0YSBFbnRyeVxuIgorIi0tLS0tLS0tLS0tXG4iCisibyAgRW50ZXIgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBhbmQgcHJlc3MgPEVOVEVSPlxuIgorIiAgIElmIHlvdSBhcmUgZW50ZXJpbmcgaGV4YWRlY2ltYWwgdmFsdWVzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvXG4iCisiICAgYWRkIHRoZSAnMHgnIHByZWZpeCB0byB0aGUgZW50cnkuXG4iCisiXG4iCisibyAgRm9yIGhlbHAsIHVzZSB0aGUgPFRBQj4gb3IgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IHRoZSBoZWxwIG9wdGlvblxuIgorIiAgIGFuZCBwcmVzcyA8RU5URVI+LiAgWW91IGNhbiB0cnkgPFRBQj48SD4gYXMgd2VsbC5cbiIKKyJcbiIKKyJcbiIKKyJUZXh0IEJveCAgICAoSGVscCBXaW5kb3cpXG4iCisiLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIGN1cnNvciBrZXlzIHRvIHNjcm9sbCB1cC9kb3duL2xlZnQvcmlnaHQuICBUaGUgVkkgZWRpdG9yXG4iCisiICAga2V5cyBoLGosayxsIGZ1bmN0aW9uIGhlcmUgYXMgZG8gPFNQQUNFIEJBUj4gYW5kIDxCPiBmb3IgdGhvc2VcbiIKKyIgICB3aG8gYXJlIGZhbWlsaWFyIHdpdGggbGVzcyBhbmQgbHlueC5cbiIKKyJcbiIKKyJvICBQcmVzcyA8RT4sIDxYPiwgPEVudGVyPiBvciA8RXNjPjxFc2M+IHRvIGV4aXQuXG4iCisiXG4iCisiXG4iCisiQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24gRmlsZXNcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorIk1lbnVjb25maWcgc3VwcG9ydHMgdGhlIHVzZSBvZiBhbHRlcm5hdGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3JcbiIKKyJ0aG9zZSB3aG8sIGZvciB2YXJpb3VzIHJlYXNvbnMsIGZpbmQgaXQgbmVjZXNzYXJ5IHRvIHN3aXRjaFxuIgorImJldHdlZW4gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxuIgorIlxuIgorIkF0IHRoZSBlbmQgb2YgdGhlIG1haW4gbWVudSB5b3Ugd2lsbCBmaW5kIHR3byBvcHRpb25zLiAgT25lIGlzXG4iCisiZm9yIHNhdmluZyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgZmlsZSBvZiB5b3VyIGNob29zaW5nLlxuIgorIlRoZSBvdGhlciBvcHRpb24gaXMgZm9yIGxvYWRpbmcgYSBwcmV2aW91c2x5IHNhdmVkIGFsdGVybmF0ZVxuIgorImNvbmZpZ3VyYXRpb24uXG4iCisiXG4iCisiRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIGFsdGVybmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzLCBidXQgeW91XG4iCisiZmluZCBkdXJpbmcgYSBNZW51Y29uZmlnIHNlc3Npb24gdGhhdCB5b3UgaGF2ZSBjb21wbGV0ZWx5IG1lc3NlZFxuIgorInVwIHlvdXIgc2V0dGluZ3MsIHlvdSBtYXkgdXNlIHRoZSBcIkxvYWQgQWx0ZXJuYXRlLi4uXCIgb3B0aW9uIHRvXG4iCisicmVzdG9yZSB5b3VyIHByZXZpb3VzbHkgc2F2ZWQgc2V0dGluZ3MgZnJvbSBcIi5jb25maWdcIiB3aXRob3V0XG4iCisicmVzdGFydGluZyBNZW51Y29uZmlnLlxuIgorIlxuIgorIk90aGVyIGluZm9ybWF0aW9uXG4iCisiLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJJZiB5b3UgdXNlIE1lbnVjb25maWcgaW4gYW4gWFRFUk0gd2luZG93IG1ha2Ugc3VyZSB5b3UgaGF2ZSB5b3VyXG4iCisiJFRFUk0gdmFyaWFibGUgc2V0IHRvIHBvaW50IHRvIGEgeHRlcm0gZGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyBjb2xvci5cbiIKKyJPdGhlcndpc2UsIE1lbnVjb25maWcgd2lsbCBsb29rIHJhdGhlciBiYWQuICBNZW51Y29uZmlnIHdpbGwgbm90XG4iCisiZGlzcGxheSBjb3JyZWN0bHkgaW4gYSBSWFZUIHdpbmRvdyBiZWNhdXNlIHJ4dnQgZGlzcGxheXMgb25seSBvbmVcbiIKKyJpbnRlbnNpdHkgb2YgY29sb3IsIGJyaWdodC5cbiIKKyJcbiIKKyJNZW51Y29uZmlnIHdpbGwgZGlzcGxheSBsYXJnZXIgbWVudXMgb24gc2NyZWVucyBvciB4dGVybXMgd2hpY2ggYXJlXG4iCisic2V0IHRvIGRpc3BsYXkgbW9yZSB0aGFuIHRoZSBzdGFuZGFyZCAyNSByb3cgYnkgODAgY29sdW1uIGdlb21ldHJ5LlxuIgorIkluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHRoZSBcInN0dHkgc2l6ZVwiIGNvbW1hbmQgbXVzdCBiZSBhYmxlIHRvXG4iCisiZGlzcGxheSB0aGUgc2NyZWVuJ3MgY3VycmVudCByb3cgYW5kIGNvbHVtbiBnZW9tZXRyeS4gIEkgU1RST05HTFlcbiIKKyJSRUNPTU1FTkQgdGhhdCB5b3UgbWFrZSBzdXJlIHlvdSBkbyBOT1QgaGF2ZSB0aGUgc2hlbGwgdmFyaWFibGVzXG4iCisiTElORVMgYW5kIENPTFVNTlMgZXhwb3J0ZWQgaW50byB5b3VyIGVudmlyb25tZW50LiAgU29tZSBkaXN0cmlidXRpb25zXG4iCisiZXhwb3J0IHRob3NlIHZhcmlhYmxlcyB2aWEgL2V0Yy9wcm9maWxlLiAgU29tZSBuY3Vyc2VzIHByb2dyYW1zIGNhblxuIgorImJlY29tZSBjb25mdXNlZCB3aGVuIHRob3NlIHZhcmlhYmxlcyAoTElORVMgJiBDT0xVTU5TKSBkb24ndCByZWZsZWN0XG4iCisidGhlIHRydWUgc2NyZWVuIHNpemUuXG4iCisiXG4iCisiT3B0aW9uYWwgcGVyc29uYWxpdHkgYXZhaWxhYmxlXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSWYgeW91IHByZWZlciB0byBoYXZlIGFsbCBvZiB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gYSBzaW5nbGVcbiIKKyJtZW51LCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBtdWx0aW1lbnUgaGllcmFyY2h5LCBydW4gdGhlIG1lbnVjb25maWdcbiIKKyJ3aXRoIE1FTlVDT05GSUdfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgdG8gc2luZ2xlX21lbnUuIEV4YW1wbGU6XG4iCisiXG4iCisibWFrZSBNRU5VQ09ORklHX01PREU9c2luZ2xlX21lbnUgbWVudWNvbmZpZ1xuIgorIlxuIgorIjxFbnRlcj4gd2lsbCB0aGVuIHVucm9sbCB0aGUgYXBwcm9wcmlhdGUgY2F0ZWdvcnksIG9yIGVuZm9sZCBpdCBpZiBpdFxuIgorImlzIGFscmVhZHkgdW5yb2xsZWQuXG4iCisiXG4iCisiTm90ZSB0aGF0IHRoaXMgbW9kZSBjYW4gZXZlbnR1YWxseSBiZSBhIGxpdHRsZSBtb3JlIENQVSBleHBlbnNpdmVcbiIKKyIoZXNwZWNpYWxseSB3aXRoIGEgbGFyZ2VyIG51bWJlciBvZiB1bnJvbGxlZCBjYXRlZ29yaWVzKSB0aGFuIHRoZVxuIgorImRlZmF1bHQgbW9kZS5cbiIKKyJcbiIKKyJEaWZmZXJlbnQgY29sb3IgdGhlbWVzIGF2YWlsYWJsZVxuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IGRpZmZlcmVudCBjb2xvciB0aGVtZXMgdXNpbmcgdGhlIHZhcmlhYmxlXG4iCisiTUVOVUNPTkZJR19DT0xPUi4gVG8gc2VsZWN0IGEgdGhlbWUgdXNlOlxuIgorIlxuIgorIm1ha2UgTUVOVUNPTkZJR19DT0xPUj08dGhlbWU+IG1lbnVjb25maWdcbiIKKyJcbiIKKyJBdmFpbGFibGUgdGhlbWVzIGFyZVxuIgorIiBtb25vICAgICAgID0+IHNlbGVjdHMgY29sb3JzIHN1aXRhYmxlIGZvciBtb25vY2hyb21lIGRpc3BsYXlzXG4iCisiIGJsYWNrYmcgICAgPT4gc2VsZWN0cyBhIGNvbG9yIHNjaGVtZSB3aXRoIGJsYWNrIGJhY2tncm91bmRcbiIKKyIgY2xhc3NpYyAgICA9PiB0aGVtZSB3aXRoIGJsdWUgYmFja2dyb3VuZC4gVGhlIGNsYXNzaWMgbG9va1xuIgorIiBibHVldGl0bGUgID0+IGEgTENEIGZyaWVuZGx5IHZlcnNpb24gb2YgY2xhc3NpYy4gKGRlZmF1bHQpXG4iCisiXG4iKSwKK21lbnVfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiQXJyb3cga2V5cyBuYXZpZ2F0ZSB0aGUgbWVudS4gICIKKwkiPEVudGVyPiBzZWxlY3RzIHN1Ym1lbnVzIC0tLT4uICAiCisJIkhpZ2hsaWdodGVkIGxldHRlcnMgYXJlIGhvdGtleXMuICAiCisJIlByZXNzaW5nIDxZPiBpbmNsdWRlcywgPE4+IGV4Y2x1ZGVzLCA8TT4gbW9kdWxhcml6ZXMgZmVhdHVyZXMuICAiCisJIlByZXNzIDxFc2M+PEVzYz4gdG8gZXhpdCwgPD8+IGZvciBIZWxwLCA8Lz4gZm9yIFNlYXJjaC4gICIKKwkiTGVnZW5kOiBbKl0gYnVpbHQtaW4gIFsgXSBleGNsdWRlZCAgPE0+IG1vZHVsZSAgPCA+IG1vZHVsZSBjYXBhYmxlIiksCityYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiVXNlIHRoZSBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlIHRoaXMgd2luZG93IG9yICIKKwkicHJlc3MgdGhlIGhvdGtleSBvZiB0aGUgaXRlbSB5b3Ugd2lzaCB0byBzZWxlY3QgIgorCSJmb2xsb3dlZCBieSB0aGUgPFNQQUNFIEJBUj4uICIKKwkiUHJlc3MgPD8+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGRlY2ltYWwgdmFsdWUuICIKKwkiRnJhY3Rpb25zIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2hleFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGhleGFkZWNpbWFsIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitpbnB1dGJveF9pbnN0cnVjdGlvbnNfc3RyaW5nW10gPSBOXygKKwkiUGxlYXNlIGVudGVyIGEgc3RyaW5nIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitzZXRtb2RfdGV4dFtdID0gTl8oCisJIlRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIGFub3RoZXIgd2hpY2ggaGFzIGJlZW4gY29uZmlndXJlZCBhcyBhIG1vZHVsZS5cbiIKKwkiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIpLAorbm9oZWxwX3RleHRbXSA9IE5fKAorCSJUaGVyZSBpcyBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24uXG4iKSwKK2xvYWRfY29uZmlnX3RleHRbXSA9IE5fKAorCSJFbnRlciB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSB3aXNoIHRvIGxvYWQuICAiCisJIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdSAiCisJImxhc3QgcmV0cmlldmVkLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiksCitsb2FkX2NvbmZpZ19oZWxwW10gPSBOXygKKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIHNldmVyYWwgZGlmZmVyZW50XG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiSWYgeW91IGhhdmUgc2F2ZWQgYSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGluIGEgZmlsZSBvdGhlciB0aGFuIHRoZVxuIgorCSJkZWZhdWx0LCBlbnRlcmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBoZXJlIHdpbGwgYWxsb3cgeW91XG4iCisJInRvIG1vZGlmeSB0aGF0IGNvbmZpZ3VyYXRpb24uXG4iCisJIlxuIgorCSJJZiB5b3UgYXJlIHVuY2VydGFpbiwgdGhlbiB5b3UgaGF2ZSBwcm9iYWJseSBuZXZlciB1c2VkIGFsdGVybmF0ZVxuIgorCSJjb25maWd1cmF0aW9uIGZpbGVzLiAgWW91IHNob3VsZCB0aGVyZWZvciBsZWF2ZSB0aGlzIGJsYW5rIHRvIGFib3J0LlxuIiksCitzYXZlX2NvbmZpZ190ZXh0W10gPSBOXygKKwkiRW50ZXIgYSBmaWxlbmFtZSB0byB3aGljaCB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHNhdmVkICIKKwkiYXMgYW4gYWx0ZXJuYXRlLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiksCitzYXZlX2NvbmZpZ19oZWxwW10gPSBOXygKKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIGRpZmZlcmVudFxuIgorCSJjb25maWd1cmF0aW9ucyBhdmFpbGFibGUgb24gYSBzaW5nbGUgbWFjaGluZS5cbiIKKwkiXG4iCisJIkVudGVyaW5nIGEgZmlsZSBuYW1lIGhlcmUgd2lsbCBhbGxvdyB5b3UgdG8gbGF0ZXIgcmV0cmlldmUsIG1vZGlmeVxuIgorCSJhbmQgdXNlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYXMgYW4gYWx0ZXJuYXRlIHRvIHdoYXRldmVyXG4iCisJImNvbmZpZ3VyYXRpb24gb3B0aW9ucyB5b3UgaGF2ZSBzZWxlY3RlZCBhdCB0aGF0IHRpbWUuXG4iCisJIlxuIgorCSJJZiB5b3UgYXJlIHVuY2VydGFpbiB3aGF0IGFsbCB0aGlzIG1lYW5zIHRoZW4geW91IHNob3VsZCBwcm9iYWJseVxuIgorCSJsZWF2ZSB0aGlzIGJsYW5rLlxuIiksCitzZWFyY2hfaGVscFtdID0gTl8oCisJIlxuIgorCSJTZWFyY2ggZm9yIENPTkZJR18gc3ltYm9scyBhbmQgZGlzcGxheSB0aGVpciByZWxhdGlvbnMuXG4iCisJIlJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQuXG4iCisJIkV4YW1wbGU6IHNlYXJjaCBmb3IgXCJeRk9PXCJcbiIKKwkiUmVzdWx0OlxuIgorCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSJTeW1ib2w6IEZPTyBbPW1dXG4iCisJIlByb21wdDogRm9vIGJ1cyBpcyB1c2VkIHRvIGRyaXZlIHRoZSBiYXIgSFdcbiIKKwkiRGVmaW5lZCBhdCBkcml2ZXJzL3BjaS9LY29uZmlnOjQ3XG4iCisJIkRlcGVuZHMgb246IFg4Nl9MT0NBTF9BUElDICYmIFg4Nl9JT19BUElDIHx8IElBNjRcbiIKKwkiTG9jYXRpb246XG4iCisJIiAgLT4gQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSlcbiIKKwkiICAgIC0+IFBDSSBzdXBwb3J0IChQQ0kgWz15XSlcbiIKKwkiICAgICAgLT4gUENJIGFjY2VzcyBtb2RlICg8Y2hvaWNlPiBbPXldKVxuIgorCSJTZWxlY3RzOiBMSUJDUkMzMlxuIgorCSJTZWxlY3RlZCBieTogQkFSXG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIm8gVGhlIGxpbmUgJ1Byb21wdDonIHNob3dzIHRoZSB0ZXh0IHVzZWQgaW4gdGhlIG1lbnUgc3RydWN0dXJlIGZvclxuIgorCSIgIHRoaXMgQ09ORklHXyBzeW1ib2xcbiIKKwkibyBUaGUgJ0RlZmluZWQgYXQnIGxpbmUgdGVsbCBhdCB3aGF0IGZpbGUgLyBsaW5lIG51bWJlciB0aGUgc3ltYm9sXG4iCisJIiAgaXMgZGVmaW5lZFxuIgorCSJvIFRoZSAnRGVwZW5kcyBvbjonIGxpbmUgdGVsbCB3aGF0IHN5bWJvbHMgbmVlZHMgdG8gYmUgZGVmaW5lZCBmb3JcbiIKKwkiICB0aGlzIHN5bWJvbCB0byBiZSB2aXNpYmxlIGluIHRoZSBtZW51IChzZWxlY3RhYmxlKVxuIgorCSJvIFRoZSAnTG9jYXRpb246JyBsaW5lcyB0ZWxsIHdoZXJlIGluIHRoZSBtZW51IHN0cnVjdHVyZSB0aGlzIHN5bWJvbFxuIgorCSIgIGlzIGxvY2F0ZWRcbiIKKwkiICAgIEEgbG9jYXRpb24gZm9sbG93ZWQgYnkgYSBbPXldIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHNlbGVjdGFibGVcbiIKKwkiICAgIG1lbnUgaXRlbSAtIGFuZCBjdXJyZW50IHZhbHVlIGlzIGRpc3BsYXllZCBpbnNpZGUgYnJhY2tldHMuXG4iCisJIm8gVGhlICdTZWxlY3RzOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIHdpbGwgYmUgYXV0b21hdGljYWxseVxuIgorCSIgIHNlbGVjdGVkIGlmIHRoaXMgc3ltYm9sIGlzIHNlbGVjdGVkICh5IG9yIG0pXG4iCisJIm8gVGhlICdTZWxlY3RlZCBieScgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIGhhcyBzZWxlY3RlZCB0aGlzIHN5bWJvbFxuIgorCSJcbiIKKwkiT25seSByZWxldmFudCBsaW5lcyBhcmUgc2hvd24uXG4iCisJIlxuXG4iCisJIlNlYXJjaCBleGFtcGxlczpcbiIKKwkiRXhhbXBsZXM6IFVTQgk9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgY29udGFpbmluZyBVU0JcbiIKKwkiICAgICAgICAgIF5VU0IgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggVVNCXG4iCisJIiAgICAgICAgICBVU0IkID0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBlbmRpbmcgd2l0aCBVU0JcbiIKKwkiXG4iKTsKKworc3RhdGljIGNoYXIgZmlsZW5hbWVbUEFUSF9NQVgrMV0gPSAiLmNvbmZpZyI7CitzdGF0aWMgaW50IGluZGVudDsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBpb3Nfb3JnOworc3RhdGljIGludCByb3dzID0gMCwgY29scyA9IDA7CitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudTsKK3N0YXRpYyBpbnQgY2hpbGRfY291bnQ7CitzdGF0aWMgaW50IHNpbmdsZV9tZW51X21vZGU7CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9sb2FkKHZvaWQpOworc3RhdGljIHZvaWQgY29uZl9zYXZlKHZvaWQpOworc3RhdGljIHZvaWQgc2hvd190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgciwgaW50IGMpOworc3RhdGljIHZvaWQgc2hvd19oZWxwdGV4dChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCk7CitzdGF0aWMgdm9pZCBzaG93X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpOworCitzdGF0aWMgdm9pZCBpbml0X3dzaXplKHZvaWQpCit7CisJc3RydWN0IHdpbnNpemUgd3M7CisJY2hhciAqZW52OworCisJaWYgKCFpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJcm93cyA9IHdzLndzX3JvdzsKKwkJY29scyA9IHdzLndzX2NvbDsKKwl9CisKKwlpZiAoIXJvd3MpIHsKKwkJZW52ID0gZ2V0ZW52KCJMSU5FUyIpOworCQlpZiAoZW52KQorCQkJcm93cyA9IGF0b2koZW52KTsKKwkJaWYgKCFyb3dzKQorCQkJcm93cyA9IDI0OworCX0KKwlpZiAoIWNvbHMpIHsKKwkJZW52ID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJCWlmIChlbnYpCisJCQljb2xzID0gYXRvaShlbnYpOworCQlpZiAoIWNvbHMpCisJCQljb2xzID0gODA7CisJfQorCisJaWYgKHJvd3MgPCAxOSB8fCBjb2xzIDwgODApIHsKKwkJZnByaW50ZihzdGRlcnIsIE5fKCJZb3VyIGRpc3BsYXkgaXMgdG9vIHNtYWxsIHRvIHJ1biBNZW51Y29uZmlnIVxuIikpOworCQlmcHJpbnRmKHN0ZGVyciwgTl8oIkl0IG11c3QgYmUgYXQgbGVhc3QgMTkgbGluZXMgYnkgODAgY29sdW1ucy5cbiIpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyb3dzIC09IDQ7CisJY29scyAtPSA1OworfQorCitzdGF0aWMgdm9pZCBnZXRfcHJvbXB0X3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHByb3BlcnR5ICpwcm9wKQoreworCWludCBpLCBqOworCXN0cnVjdCBtZW51ICpzdWJtZW51WzhdLCAqbWVudTsKKworCXN0cl9wcmludGYociwgIlByb21wdDogJXNcbiIsIHByb3AtPnRleHQpOworCXN0cl9wcmludGYociwgIiAgRGVmaW5lZCBhdCAlczolZFxuIiwgcHJvcC0+bWVudS0+ZmlsZS0+bmFtZSwKKwkJcHJvcC0+bWVudS0+bGluZW5vKTsKKwlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBEZXBlbmRzIG9uOiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHByb3AtPnZpc2libGUuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCW1lbnUgPSBwcm9wLT5tZW51LT5wYXJlbnQ7CisJZm9yIChpID0gMDsgbWVudSAhPSAmcm9vdG1lbnUgJiYgaSA8IDg7IG1lbnUgPSBtZW51LT5wYXJlbnQpCisJCXN1Ym1lbnVbaSsrXSA9IG1lbnU7CisJaWYgKGkgPiAwKSB7CisJCXN0cl9wcmludGYociwgIiAgTG9jYXRpb246XG4iKTsKKwkJZm9yIChqID0gNDsgLS1pID49IDA7IGogKz0gMikgeworCQkJbWVudSA9IHN1Ym1lbnVbaV07CisJCQlzdHJfcHJpbnRmKHIsICIlKmMtPiAlcyIsIGosICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJCWlmIChtZW51LT5zeW0pIHsKKwkJCQlzdHJfcHJpbnRmKHIsICIgKCVzIFs9JXNdKSIsIG1lbnUtPnN5bS0+bmFtZSA/CisJCQkJCW1lbnUtPnN5bS0+bmFtZSA6ICI8Y2hvaWNlPiIsCisJCQkJCXN5bV9nZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSkpOworCQkJfQorCQkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X3N5bWJvbF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlib29sIGhpdDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzdHJfcHJpbnRmKHIsICJTeW1ib2w6ICVzIFs9JXNdXG4iLCBzeW0tPm5hbWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApCisJCWdldF9wcm9tcHRfc3RyKHIsIHByb3ApOworCWhpdCA9IGZhbHNlOworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfU0VMRUNUKSB7CisJCWlmICghaGl0KSB7CisJCQlzdHJfYXBwZW5kKHIsICIgIFNlbGVjdHM6ICIpOworCQkJaGl0ID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlzdHJfcHJpbnRmKHIsICIgJiYgIik7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT5leHByLCByKTsKKwl9CisJaWYgKGhpdCkKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBTZWxlY3RlZCBieTogIik7CisJCWV4cHJfZ3N0cl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCXN0cl9hcHBlbmQociwgIlxuXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBnc3RyIGdldF9yZWxhdGlvbnNfc3RyKHN0cnVjdCBzeW1ib2wgKipzeW1fYXJyKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgZ3N0ciByZXMgPSBzdHJfbmV3KCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBzeW1fYXJyICYmIChzeW0gPSBzeW1fYXJyW2ldKTsgaSsrKQorCQlnZXRfc3ltYm9sX3N0cigmcmVzLCBzeW0pOworCWlmICghaSkKKwkJc3RyX2FwcGVuZCgmcmVzLCAiTm8gbWF0Y2hlcyBmb3VuZC5cbiIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHNlYXJjaF9jb25mKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqKnN5bV9hcnI7CisJc3RydWN0IGdzdHIgcmVzOworCWludCBkcmVzOworYWdhaW46CisJZGlhbG9nX2NsZWFyKCk7CisJZHJlcyA9IGRpYWxvZ19pbnB1dGJveChfKCJTZWFyY2ggQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIiKSwKKwkJCSAgICAgIF8oIkVudGVyIENPTkZJR18gKHN1YilzdHJpbmcgdG8gc2VhcmNoIGZvciAob21pdCBDT05GSUdfKSIpLAorCQkJICAgICAgMTAsIDc1LCAiIik7CisJc3dpdGNoIChkcmVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXNob3dfaGVscHRleHQoXygiU2VhcmNoIENvbmZpZ3VyYXRpb24iKSwgc2VhcmNoX2hlbHApOworCQlnb3RvIGFnYWluOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlzeW1fYXJyID0gc3ltX3JlX3NlYXJjaChkaWFsb2dfaW5wdXRfcmVzdWx0KTsKKwlyZXMgPSBnZXRfcmVsYXRpb25zX3N0cihzeW1fYXJyKTsKKwlmcmVlKHN5bV9hcnIpOworCXNob3dfdGV4dGJveChfKCJTZWFyY2ggUmVzdWx0cyIpLCBzdHJfZ2V0KCZyZXMpLCAwLCAwKTsKKwlzdHJfZnJlZSgmcmVzKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwlpbnQgdHlwZSwgdG1wLCBkb2ludCA9IDI7CisJdHJpc3RhdGUgdmFsOworCWNoYXIgY2g7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJaWYgKCFzeW0pIHsKKwkJaWYgKHByb3AgJiYgbWVudSAhPSBjdXJyZW50X21lbnUpIHsKKwkJCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX01FTlU6CisJCQkJY2hpbGRfY291bnQrKzsKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSkgeworCQkJCQlpdGVtX21ha2UoIiVzJSpjJXMiLAorCQkJCQkJICBtZW51LT5kYXRhID8gIi0tPiIgOiAiKys+IiwKKwkJCQkJCSAgaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCX0gZWxzZQorCQkJCQlpdGVtX21ha2UoIiAgICUqYyVzICAtLS0+IiwgaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCisJCQkJaXRlbV9zZXRfdGFnKCdtJyk7CisJCQkJaXRlbV9zZXRfZGF0YShtZW51KTsKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSAmJiBtZW51LT5kYXRhKQorCQkJCQlnb3RvIGNvbmZfY2hpbGRzOworCQkJCXJldHVybjsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHByb21wdCkgeworCQkJCQljaGlsZF9jb3VudCsrOworCQkJCQlpdGVtX21ha2UoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCQlpdGVtX3NldF90YWcoJzonKTsKKwkJCQkJaXRlbV9zZXRfZGF0YShtZW51KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJZG9pbnQgPSAwOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCXN0cnVjdCBzeW1ib2wgKmRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQlzdHJ1Y3QgbWVudSAqZGVmX21lbnUgPSBOVUxMOworCisJCWNoaWxkX2NvdW50Kys7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJaXRlbV9tYWtlKCJbJWNdIiwgdmFsID09IG5vID8gJyAnIDogJyonKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQlpdGVtX21ha2UoIjwlYz4iLCBjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpdGVtX3NldF90YWcoJ3QnKTsKKwkJCWl0ZW1fc2V0X2RhdGEobWVudSk7CisJCX0gZWxzZSB7CisJCQlpdGVtX21ha2UoIiAgICIpOworCQkJaXRlbV9zZXRfdGFnKGRlZl9tZW51ID8gJ3QnIDogJzonKTsKKwkJCWl0ZW1fc2V0X2RhdGEobWVudSk7CisJCX0KKworCQlpdGVtX2FkZF9zdHIoIiUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQlpZiAodmFsID09IHllcykgeworCQkJaWYgKGRlZl9tZW51KSB7CisJCQkJaXRlbV9hZGRfc3RyKCIgKCVzKSIsIG1lbnVfZ2V0X3Byb21wdChkZWZfbWVudSkpOworCQkJCWl0ZW1fYWRkX3N0cigiICAtLS0+Iik7CisJCQkJaWYgKGRlZl9tZW51LT5saXN0KSB7CisJCQkJCWluZGVudCArPSAyOworCQkJCQlidWlsZF9jb25mKGRlZl9tZW51KTsKKwkJCQkJaW5kZW50IC09IDI7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1lbnUgPT0gY3VycmVudF9tZW51KSB7CisJCQlpdGVtX21ha2UoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJaXRlbV9zZXRfdGFnKCc6Jyk7CisJCQlpdGVtX3NldF9kYXRhKG1lbnUpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQljaGlsZF9jb3VudCsrOworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQkJaXRlbV9tYWtlKCIgICAiKTsKKwkJCWl0ZW1fc2V0X3RhZygnOicpOworCQkJaXRlbV9zZXRfZGF0YShtZW51KTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkKKwkJCQkJaXRlbV9tYWtlKCJbJWNdIiwgdmFsID09IG5vID8gJyAnIDogJyonKTsKKwkJCQllbHNlCisJCQkJCWl0ZW1fbWFrZSgiLS0tIik7CisJCQkJaXRlbV9zZXRfdGFnKCd0Jyk7CisJCQkJaXRlbV9zZXRfZGF0YShtZW51KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKQorCQkJCQlpdGVtX21ha2UoIjwlYz4iLCBjaCk7CisJCQkJZWxzZQorCQkJCQlpdGVtX21ha2UoIi0tLSIpOworCQkJCWl0ZW1fc2V0X3RhZygndCcpOworCQkJCWl0ZW1fc2V0X2RhdGEobWVudSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRtcCA9IDIgKyBzdHJsZW4oc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7IC8qICgpID0gMiAqLworCQkJCWl0ZW1fbWFrZSgiKCVzKSIsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQkJCXRtcCA9IGluZGVudCAtIHRtcCArIDQ7CisJCQkJaWYgKHRtcCA8IDApCisJCQkJCXRtcCA9IDA7CisJCQkJaXRlbV9hZGRfc3RyKCIlKmMlcyVzIiwgdG1wLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCQkJICAgICAoc3ltX2hhc192YWx1ZShzeW0pIHx8ICFzeW1faXNfY2hhbmdhYmxlKHN5bSkpID8KKwkJCQkJICAgICAiIiA6ICIgKE5FVykiKTsKKwkJCQlpdGVtX3NldF90YWcoJ3MnKTsKKwkJCQlpdGVtX3NldF9kYXRhKG1lbnUpOworCQkJCWdvdG8gY29uZl9jaGlsZHM7CisJCQl9CisJCX0KKwkJaXRlbV9hZGRfc3RyKCIlKmMlcyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkgIChzeW1faGFzX3ZhbHVlKHN5bSkgfHwgIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgPworCQkJICAiIiA6ICIgKE5FVykiKTsKKwkJaWYgKG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCWl0ZW1fYWRkX3N0cigiICAtLS0+Iik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKK2NvbmZfY2hpbGRzOgorCWluZGVudCArPSBkb2ludDsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWJ1aWxkX2NvbmYoY2hpbGQpOworCWluZGVudCAtPSBkb2ludDsKK30KKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqc3VibWVudTsKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICphY3RpdmVfbWVudSA9IE5VTEw7CisJaW50IHJlczsKKwlpbnQgc19zY3JvbGwgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaXRlbV9yZXNldCgpOworCQljdXJyZW50X21lbnUgPSBtZW51OworCQlidWlsZF9jb25mKG1lbnUpOworCQlpZiAoIWNoaWxkX2NvdW50KQorCQkJYnJlYWs7CisJCWlmIChtZW51ID09ICZyb290bWVudSkgeworCQkJaXRlbV9tYWtlKCItLS0gIik7CisJCQlpdGVtX3NldF90YWcoJzonKTsKKwkJCWl0ZW1fbWFrZShfKCIgICAgTG9hZCBhbiBBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlIikpOworCQkJaXRlbV9zZXRfdGFnKCdMJyk7CisJCQlpdGVtX21ha2UoXygiICAgIFNhdmUgYW4gQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24gRmlsZSIpKTsKKwkJCWl0ZW1fc2V0X3RhZygnUycpOworCQl9CisJCWRpYWxvZ19jbGVhcigpOworCQlyZXMgPSBkaWFsb2dfbWVudShwcm9tcHQgPyBwcm9tcHQgOiBfKCJNYWluIE1lbnUiKSwKKwkJCQkgIF8obWVudV9pbnN0cnVjdGlvbnMpLAorCQkJCSAgYWN0aXZlX21lbnUsICZzX3Njcm9sbCk7CisJCWlmIChyZXMgPT0gMSB8fCByZXMgPT0gS0VZX0VTQyB8fCByZXMgPT0gLUVSUkRJU1BMQVlUT09TTUFMTCkKKwkJCWJyZWFrOworCQlpZiAoIWl0ZW1fYWN0aXZhdGVfc2VsZWN0ZWQoKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWl0ZW1fdGFnKCkpCisJCQljb250aW51ZTsKKworCQlzdWJtZW51ID0gaXRlbV9kYXRhKCk7CisJCWFjdGl2ZV9tZW51ID0gaXRlbV9kYXRhKCk7CisJCWlmIChzdWJtZW51KQorCQkJc3ltID0gc3VibWVudS0+c3ltOworCQllbHNlCisJCQlzeW0gPSBOVUxMOworCisJCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgMDoKKwkJCXN3aXRjaCAoaXRlbV90YWcoKSkgeworCQkJY2FzZSAnbSc6CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUpCisJCQkJCXN1Ym1lbnUtPmRhdGEgPSAodm9pZCAqKSAobG9uZykgIXN1Ym1lbnUtPmRhdGE7CisJCQkJZWxzZQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgPT0geWVzKQorCQkJCQljb25mX2Nob2ljZShzdWJtZW51KTsKKwkJCQllbHNlIGlmIChzdWJtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJY29uZl9zdHJpbmcoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQljb25mX2xvYWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWNvbmZfc2F2ZSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChzeW0pCisJCQkJc2hvd19oZWxwKHN1Ym1lbnUpOworCQkJZWxzZQorCQkJCXNob3dfaGVscHRleHQoIlJFQURNRSIsIF8obWNvbmZfcmVhZG1lKSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaWYgKGl0ZW1faXNfdGFnKCd0JykpIHsKKwkJCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHllcykpCisJCQkJCWJyZWFrOworCQkJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKSkKKwkJCQkJc2hvd190ZXh0Ym94KE5VTEwsIHNldG1vZF90ZXh0LCA2LCA3NCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaWYgKGl0ZW1faXNfdGFnKCd0JykpCisJCQkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5vKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlpZiAoaXRlbV9pc190YWcoJ3QnKSkKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlpZiAoaXRlbV9pc190YWcoJ3QnKSkKKwkJCQlzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCQllbHNlIGlmIChpdGVtX2lzX3RhZygnbScpKQorCQkJCWNvbmYoc3VibWVudSk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJc2VhcmNoX2NvbmYoKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQsIGludCByLCBpbnQgYykKK3sKKwlkaWFsb2dfY2xlYXIoKTsKKwlkaWFsb2dfdGV4dGJveCh0aXRsZSwgdGV4dCwgciwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscHRleHQoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc2hvd190ZXh0Ym94KHRpdGxlLCB0ZXh0LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBnc3RyIGhlbHAgPSBzdHJfbmV3KCk7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCisJaWYgKHN5bS0+aGVscCkKKwl7CisJCWlmIChzeW0tPm5hbWUpIHsKKwkJCXN0cl9wcmludGYoJmhlbHAsICJDT05GSUdfJXM6XG5cbiIsIHN5bS0+bmFtZSk7CisJCQlzdHJfYXBwZW5kKCZoZWxwLCBfKHN5bS0+aGVscCkpOworCQkJc3RyX2FwcGVuZCgmaGVscCwgIlxuIik7CisJCX0KKwl9IGVsc2UgeworCQlzdHJfYXBwZW5kKCZoZWxwLCBub2hlbHBfdGV4dCk7CisJfQorCWdldF9zeW1ib2xfc3RyKCZoZWxwLCBzeW0pOworCXNob3dfaGVscHRleHQobWVudV9nZXRfcHJvbXB0KG1lbnUpLCBzdHJfZ2V0KCZoZWxwKSk7CisJc3RyX2ZyZWUoJmhlbHApOworfQorCitzdGF0aWMgdm9pZCBjb25mX2Nob2ljZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0cnVjdCBzeW1ib2wgKmFjdGl2ZTsKKworCWFjdGl2ZSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKG1lbnUtPnN5bSk7CisJd2hpbGUgKDEpIHsKKwkJaW50IHJlczsKKwkJaW50IHNlbGVjdGVkOworCQlpdGVtX3Jlc2V0KCk7CisKKwkJY3VycmVudF9tZW51ID0gbWVudTsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQlpdGVtX21ha2UoIiVzIiwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpdGVtX3NldF9kYXRhKGNoaWxkKTsKKwkJCWlmIChjaGlsZC0+c3ltID09IGFjdGl2ZSkKKwkJCQlpdGVtX3NldF9zZWxlY3RlZCgxKTsKKwkJCWlmIChjaGlsZC0+c3ltID09IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKG1lbnUtPnN5bSkpCisJCQkJaXRlbV9zZXRfdGFnKCdYJyk7CisJCX0KKwkJZGlhbG9nX2NsZWFyKCk7CisJCXJlcyA9IGRpYWxvZ19jaGVja2xpc3QocHJvbXB0ID8gcHJvbXB0IDogXygiTWFpbiBNZW51IiksCisJCQkJCV8ocmFkaW9saXN0X2luc3RydWN0aW9ucyksCisJCQkJCSAxNSwgNzAsIDYpOworCQlzZWxlY3RlZCA9IGl0ZW1fYWN0aXZhdGVfc2VsZWN0ZWQoKTsKKwkJc3dpdGNoIChyZXMpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNlbGVjdGVkKSB7CisJCQkJY2hpbGQgPSBpdGVtX2RhdGEoKTsKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKGNoaWxkLT5zeW0sIHllcyk7CisJCQl9CisJCQlyZXR1cm47CisJCWNhc2UgMToKKwkJCWlmIChzZWxlY3RlZCkgeworCQkJCWNoaWxkID0gaXRlbV9kYXRhKCk7CisJCQkJc2hvd19oZWxwKGNoaWxkKTsKKwkJCQlhY3RpdmUgPSBjaGlsZC0+c3ltOworCQkJfSBlbHNlCisJCQkJc2hvd19oZWxwKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX0VTQzoKKwkJCXJldHVybjsKKwkJY2FzZSAtRVJSRElTUExBWVRPT1NNQUxMOgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX3N0cmluZyhzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgcmVzOworCQljaGFyICpoZWFkaW5nOworCisJCXN3aXRjaCAoc3ltX2dldF90eXBlKG1lbnUtPnN5bSkpIHsKKwkJY2FzZSBTX0lOVDoKKwkJCWhlYWRpbmcgPSAoY2hhciAqKV8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludCk7CisJCQlicmVhazsKKwkJY2FzZSBTX0hFWDoKKwkJCWhlYWRpbmcgPSAoY2hhciAqKV8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2hleCk7CisJCQlicmVhazsKKwkJY2FzZSBTX1NUUklORzoKKwkJCWhlYWRpbmcgPSAoY2hhciAqKV8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX3N0cmluZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhlYWRpbmcgPSAiSW50ZXJuYWwgbWNvbmYgZXJyb3IhIjsKKwkJfQorCQlkaWFsb2dfY2xlYXIoKTsKKwkJcmVzID0gZGlhbG9nX2lucHV0Ym94KHByb21wdCA/IHByb21wdCA6IF8oIk1haW4gTWVudSIpLAorCQkJCSAgICAgIGhlYWRpbmcsIDEwLCA3NSwKKwkJCQkgICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJc3dpdGNoIChyZXMpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgZGlhbG9nX2lucHV0X3Jlc3VsdCkpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIllvdSBoYXZlIG1hZGUgYW4gaW52YWxpZCBlbnRyeS4iKSwgNSwgNDMpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNob3dfaGVscChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FU0M6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfbG9hZCh2b2lkKQoreworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJlczsKKwkJZGlhbG9nX2NsZWFyKCk7CisJCXJlcyA9IGRpYWxvZ19pbnB1dGJveChOVUxMLCBsb2FkX2NvbmZpZ190ZXh0LAorCQkJCSAgICAgIDExLCA1NSwgZmlsZW5hbWUpOworCQlzd2l0Y2gocmVzKSB7CisJCWNhc2UgMDoKKwkJCWlmICghZGlhbG9nX2lucHV0X3Jlc3VsdFswXSkKKwkJCQlyZXR1cm47CisJCQlpZiAoIWNvbmZfcmVhZChkaWFsb2dfaW5wdXRfcmVzdWx0KSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgXygiRmlsZSBkb2VzIG5vdCBleGlzdCEiKSwgNSwgMzgpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNob3dfaGVscHRleHQoXygiTG9hZCBBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiIpLCBsb2FkX2NvbmZpZ19oZWxwKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FU0M6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKQoreworCXdoaWxlICgxKSB7CisJCWludCByZXM7CisJCWRpYWxvZ19jbGVhcigpOworCQlyZXMgPSBkaWFsb2dfaW5wdXRib3goTlVMTCwgc2F2ZV9jb25maWdfdGV4dCwKKwkJCQkgICAgICAxMSwgNTUsIGZpbGVuYW1lKTsKKwkJc3dpdGNoKHJlcykgeworCQljYXNlIDA6CisJCQlpZiAoIWRpYWxvZ19pbnB1dF9yZXN1bHRbMF0pCisJCQkJcmV0dXJuOworCQkJaWYgKCFjb25mX3dyaXRlKGRpYWxvZ19pbnB1dF9yZXN1bHQpKQorCQkJCXJldHVybjsKKwkJCXNob3dfdGV4dGJveChOVUxMLCBfKCJDYW4ndCBjcmVhdGUgZmlsZSEgIFByb2JhYmx5IGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5LiIpLCA1LCA2MCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwdGV4dChfKCJTYXZlIEFsdGVybmF0ZSBDb25maWd1cmF0aW9uIiksIHNhdmVfY29uZmlnX2hlbHApOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX0VTQzoKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9jbGVhbnVwKHZvaWQpCit7CisJdGNzZXRhdHRyKDEsIFRDU0FGTFVTSCwgJmlvc19vcmcpOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciAqbW9kZTsKKwlpbnQgcmVzOworCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworCWNvbmZfcGFyc2UoYXZbMV0gPyBhdlsxXSA6ICIiKTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzcHJpbnRmKG1lbnVfYmFja3RpdGxlLCBfKFBST0pFQ1RfTkFNRSIgdiVzIENvbmZpZ3VyYXRpb24iKSwKKwkJc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisKKwltb2RlID0gZ2V0ZW52KCJNRU5VQ09ORklHX01PREUiKTsKKwlpZiAobW9kZSkgeworCQlpZiAoIXN0cmNhc2VjbXAobW9kZSwgInNpbmdsZV9tZW51IikpCisJCQlzaW5nbGVfbWVudV9tb2RlID0gMTsKKwl9CisKKwl0Y2dldGF0dHIoMSwgJmlvc19vcmcpOworCWF0ZXhpdChjb25mX2NsZWFudXApOworCWluaXRfd3NpemUoKTsKKwlyZXNldF9kaWFsb2coKTsKKwlpbml0X2RpYWxvZyhtZW51X2JhY2t0aXRsZSk7CisJZG8geworCQljb25mKCZyb290bWVudSk7CisJCWRpYWxvZ19jbGVhcigpOworCQlyZXMgPSBkaWFsb2dfeWVzbm8oTlVMTCwKKwkJCQkgICBfKCJEbyB5b3Ugd2lzaCB0byBzYXZlIHlvdXIgIgorCQkJCSAgICAgIm5ldyAiUFJPSkVDVF9OQU1FIiBjb25maWd1cmF0aW9uP1xuIgorCQkJCSAgICAgIjxFU0M+PEVTQz4gdG8gY29udGludWUuIiksCisJCQkJICAgNiwgNjApOworCX0gd2hpbGUgKHJlcyA9PSBLRVlfRVNDKTsKKwllbmRfZGlhbG9nKCk7CisJaWYgKHJlcyA9PSAwKSB7CisJCWlmIChjb25mX3dyaXRlKE5VTEwpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiIKKwkJCQkiRXJyb3Igd3JpdGluZyAiUFJPSkVDVF9OQU1FIiBjb25maWd1cmF0aW9uLlxuIgorCQkJCSJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJIlxuXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwcmludGYoXygiXG5cbiIKKwkJCSIqKiogRW5kIG9mICJQUk9KRUNUX05BTUUiIGNvbmZpZ3VyYXRpb24uXG4iCisJCQkiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIGJ1aWxkLCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJIlxuXG4iKSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlxuXG4iCisJCQkiWW91ciBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJIlxuXG4iKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b3lib3gva2NvbmZpZy9tZW51LmMgYi90b3lib3gva2NvbmZpZy9tZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL21lbnUuYwpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IG1lbnUgcm9vdG1lbnU7CitzdGF0aWMgc3RydWN0IG1lbnUgKipsYXN0X2VudHJ5X3B0cjsKKworc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK3N0cnVjdCBmaWxlICpjdXJyZW50X2ZpbGU7CisKK3N0YXRpYyB2b2lkIG1lbnVfd2FybihzdHJ1Y3QgbWVudSAqbWVudSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIG1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcF93YXJuKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIHByb3AtPmZpbGUtPm5hbWUsIHByb3AtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBtZW51X2luaXQodm9pZCkKK3sKKwljdXJyZW50X2VudHJ5ID0gY3VycmVudF9tZW51ID0gJnJvb3RtZW51OworCWxhc3RfZW50cnlfcHRyID0gJnJvb3RtZW51Lmxpc3Q7Cit9CisKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IG1hbGxvYyhzaXplb2YoKm1lbnUpKTsKKwltZW1zZXQobWVudSwgMCwgc2l6ZW9mKCptZW51KSk7CisJbWVudS0+c3ltID0gc3ltOworCW1lbnUtPnBhcmVudCA9IGN1cnJlbnRfbWVudTsKKwltZW51LT5maWxlID0gY3VycmVudF9maWxlOworCW1lbnUtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJKmxhc3RfZW50cnlfcHRyID0gbWVudTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZtZW51LT5uZXh0OworCWN1cnJlbnRfZW50cnkgPSBtZW51OworfQorCit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpCit7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2FkZF9tZW51KHZvaWQpCit7CisJbWVudV9lbmRfZW50cnkoKTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X2VudHJ5LT5saXN0OworCXJldHVybiBjdXJyZW50X21lbnUgPSBjdXJyZW50X2VudHJ5OworfQorCit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCkKK3sKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X21lbnUtPm5leHQ7CisJY3VycmVudF9tZW51ID0gY3VycmVudF9tZW51LT5wYXJlbnQ7Cit9CisKK3N0cnVjdCBleHByICptZW51X2NoZWNrX2RlcChzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gbWVudV9jaGVja19kZXAoZS0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJLyogY2hhbmdlICdtJyBpbnRvICdtJyAmJiBNT0RVTEVTICovCisJCWlmIChlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCXJldHVybiBleHByX2FsbG9jX2FuZChlLCBleHByX2FsbG9jX3N5bWJvbChtb2R1bGVzX3N5bSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApCit7CisJY3VycmVudF9lbnRyeS0+ZGVwID0gZXhwcl9hbGxvY19hbmQoY3VycmVudF9lbnRyeS0+ZGVwLCBtZW51X2NoZWNrX2RlcChkZXApKTsKK30KKwordm9pZCBtZW51X3NldF90eXBlKGludCB0eXBlKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IGN1cnJlbnRfZW50cnktPnN5bTsKKworCWlmIChzeW0tPnR5cGUgPT0gdHlwZSkKKwkJcmV0dXJuOworCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKSB7CisJCXN5bS0+dHlwZSA9IHR5cGU7CisJCXJldHVybjsKKwl9CisJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJ0eXBlIG9mICclcycgcmVkZWZpbmVkIGZyb20gJyVzJyB0byAnJXMnIiwKKwkgICAgc3ltLT5uYW1lID8gc3ltLT5uYW1lIDogIjxjaG9pY2U+IiwKKwkgICAgc3ltX3R5cGVfbmFtZShzeW0tPnR5cGUpLCBzeW1fdHlwZV9uYW1lKHR5cGUpKTsKK30KKworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9wKGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gcHJvcF9hbGxvYyh0eXBlLCBjdXJyZW50X2VudHJ5LT5zeW0pOworCisJcHJvcC0+bWVudSA9IGN1cnJlbnRfZW50cnk7CisJcHJvcC0+ZXhwciA9IGV4cHI7CisJcHJvcC0+dmlzaWJsZS5leHByID0gbWVudV9jaGVja19kZXAoZGVwKTsKKworCWlmIChwcm9tcHQpIHsKKwkJaWYgKGlzc3BhY2UoKnByb21wdCkpIHsKKwkJCXByb3Bfd2Fybihwcm9wLCAibGVhZGluZyB3aGl0ZXNwYWNlIGlnbm9yZWQiKTsKKwkJCXdoaWxlIChpc3NwYWNlKCpwcm9tcHQpKQorCQkJCXByb21wdCsrOworCQl9CisJCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCQlwcm9wX3dhcm4ocHJvcCwgInByb21wdCByZWRlZmluZWQiKTsKKwkJY3VycmVudF9lbnRyeS0+cHJvbXB0ID0gcHJvcDsKKwl9CisJcHJvcC0+dGV4dCA9IHByb21wdDsKKworCXJldHVybiBwcm9wOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApCit7CisJcmV0dXJuIG1lbnVfYWRkX3Byb3AodHlwZSwgcHJvbXB0LCBOVUxMLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByX2FsbG9jX3N5bWJvbChzeW0pLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX29wdGlvbihpbnQgdG9rZW4sIGNoYXIgKmFyZykKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzd2l0Y2ggKHRva2VuKSB7CisJY2FzZSBUX09QVF9NT0RVTEVTOgorCQlwcm9wID0gcHJvcF9hbGxvYyhQX0RFRkFVTFQsIG1vZHVsZXNfc3ltKTsKKwkJcHJvcC0+ZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKGN1cnJlbnRfZW50cnktPnN5bSk7CisJCWJyZWFrOworCWNhc2UgVF9PUFRfREVGQ09ORklHX0xJU1Q6CisJCWlmICghc3ltX2RlZmNvbmZpZ19saXN0KQorCQkJc3ltX2RlZmNvbmZpZ19saXN0ID0gY3VycmVudF9lbnRyeS0+c3ltOworCQllbHNlIGlmIChzeW1fZGVmY29uZmlnX2xpc3QgIT0gY3VycmVudF9lbnRyeS0+c3ltKQorCQkJemNvbmZfZXJyb3IoInRyeWluZyB0byByZWRlZmluZSBkZWZjb25maWcgc3ltYm9sIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBtZW51X3JhbmdlX3ZhbGlkX3N5bShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBzeW1ib2wgKnN5bTIpCit7CisJcmV0dXJuIHN5bTItPnR5cGUgPT0gU19JTlQgfHwgc3ltMi0+dHlwZSA9PSBTX0hFWCB8fAorCSAgICAgICAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04gJiYgc3ltX3N0cmluZ192YWxpZChzeW0sIHN5bTItPm5hbWUpKTsKK30KKwordm9pZCBzeW1fY2hlY2tfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTI7CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlpZiAoKHN5bS0+dHlwZSA9PSBTX1NUUklORyB8fCBzeW0tPnR5cGUgPT0gU19JTlQgfHwgc3ltLT50eXBlID09IFNfSEVYKSAmJgorCQkJICAgIHByb3AtPmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICJkZWZhdWx0IGZvciBjb25maWcgc3ltYm9sICclJyIKKwkJCQkgICAgIiBtdXN0IGJlIGEgc2luZ2xlIHN5bWJvbCIsIHN5bS0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBQX1NFTEVDVDoKKwkJCXN5bTIgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoc3ltLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0tPnR5cGUgIT0gU19UUklTVEFURSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgImNvbmZpZyBzeW1ib2wgJyVzJyB1c2VzIHNlbGVjdCwgYnV0IGlzICIKKwkJCQkgICAgIm5vdCBib29sZWFuIG9yIHRyaXN0YXRlIiwgc3ltLT5uYW1lKTsKKwkJCWVsc2UgaWYgKHN5bTItPnR5cGUgPT0gU19VTktOT1dOKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiJ3NlbGVjdCcgdXNlZCBieSBjb25maWcgc3ltYm9sICclcycgIgorCQkJCSAgICAicmVmZXIgdG8gdW5kZWZpbmVkIHN5bWJvbCAnJXMnIiwKKwkJCQkgICAgc3ltLT5uYW1lLCBzeW0yLT5uYW1lKTsKKwkJCWVsc2UgaWYgKHN5bTItPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTItPnR5cGUgIT0gU19UUklTVEFURSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgIiclcycgaGFzIHdyb25nIHR5cGUuICdzZWxlY3QnIG9ubHkgIgorCQkJCSAgICAiYWNjZXB0IGFyZ3VtZW50cyBvZiBib29sZWFuIGFuZCAiCisJCQkJICAgICJ0cmlzdGF0ZSB0eXBlIiwgc3ltMi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBQX1JBTkdFOgorCQkJaWYgKHN5bS0+dHlwZSAhPSBTX0lOVCAmJiBzeW0tPnR5cGUgIT0gU19IRVgpCisJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBvbmx5IGFsbG93ZWQgIgorCQkJCSAgICAgICAgICAgICAgICAiZm9yIGludCBvciBoZXggc3ltYm9scyIpOworCQkJaWYgKCFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltKSB8fAorCQkJICAgICFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bSkpCisJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBpbnZhbGlkIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KK30KKwordm9pZCBtZW51X2ZpbmFsaXplKHN0cnVjdCBtZW51ICpwYXJlbnQpCit7CisJc3RydWN0IG1lbnUgKm1lbnUsICpsYXN0X21lbnU7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqcGFyZW50ZGVwLCAqYmFzZWRlcCwgKmRlcCwgKmRlcDIsICoqZXA7CisKKwlzeW0gPSBwYXJlbnQtPnN5bTsKKwlpZiAocGFyZW50LT5saXN0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkvKiBmaW5kIHRoZSBmaXJzdCBjaG9pY2UgdmFsdWUgYW5kIGZpbmQgb3V0IGNob2ljZSB0eXBlICovCisJCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQkJaWYgKG1lbnUtPnN5bSkgeworCQkJCQljdXJyZW50X2VudHJ5ID0gcGFyZW50OworCQkJCQltZW51X3NldF90eXBlKG1lbnUtPnN5bS0+dHlwZSk7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudGRlcCA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSk7CisJCX0gZWxzZSBpZiAocGFyZW50LT5wcm9tcHQpCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByOworCQllbHNlCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPmRlcDsKKworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQliYXNlZGVwID0gZXhwcl90cmFuc2Zvcm0obWVudS0+ZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkocGFyZW50ZGVwKSwgYmFzZWRlcCk7CisJCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhiYXNlZGVwKTsKKwkJCW1lbnUtPmRlcCA9IGJhc2VkZXA7CisJCQlpZiAobWVudS0+c3ltKQorCQkJCXByb3AgPSBtZW51LT5zeW0tPnByb3A7CisJCQllbHNlCisJCQkJcHJvcCA9IG1lbnUtPnByb21wdDsKKwkJCWZvciAoOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT5tZW51ICE9IG1lbnUpCisJCQkJCWNvbnRpbnVlOworCQkJCWRlcCA9IGV4cHJfdHJhbnNmb3JtKHByb3AtPnZpc2libGUuZXhwcik7CisJCQkJZGVwID0gZXhwcl9hbGxvY19hbmQoZXhwcl9jb3B5KGJhc2VkZXApLCBkZXApOworCQkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZGVwKTsKKwkJCQlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCQlkZXAgPSBleHByX3RyYW5zX2Jvb2woZGVwKTsKKwkJCQlwcm9wLT52aXNpYmxlLmV4cHIgPSBkZXA7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9TRUxFQ1QpIHsKKwkJCQkJc3RydWN0IHN5bWJvbCAqZXMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQkJCWVzLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKGVzLT5yZXZfZGVwLmV4cHIsCisJCQkJCQkJZXhwcl9hbGxvY19hbmQoZXhwcl9hbGxvY19zeW1ib2wobWVudS0+c3ltKSwgZXhwcl9jb3B5KGRlcCkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJfSBlbHNlIGlmIChzeW0pIHsKKwkJYmFzZWRlcCA9IHBhcmVudC0+cHJvbXB0ID8gcGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IE5VTEw7CisJCWJhc2VkZXAgPSBleHByX3RyYW5zX2NvbXBhcmUoYmFzZWRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJYmFzZWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oYmFzZWRlcCkpOworCQlsYXN0X21lbnUgPSBOVUxMOworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPm5leHQ7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQlkZXAgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IG1lbnUtPmRlcDsKKwkJCWlmICghZXhwcl9jb250YWluc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWJyZWFrOworCQkJaWYgKGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWdvdG8gbmV4dDsKKwkJCWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShkZXAsIEVfVU5FUVVBTCwgJnN5bWJvbF9ubyk7CisJCQlkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGV4cHJfdHJhbnNmb3JtKGRlcCkpOworCQkJZGVwMiA9IGV4cHJfY29weShiYXNlZGVwKTsKKwkJCWV4cHJfZWxpbWluYXRlX2VxKCZkZXAsICZkZXAyKTsKKwkJCWV4cHJfZnJlZShkZXApOworCQkJaWYgKCFleHByX2lzX3llcyhkZXAyKSkgeworCQkJCWV4cHJfZnJlZShkZXAyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWV4cHJfZnJlZShkZXAyKTsKKwkJbmV4dDoKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJCQltZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisJCQlsYXN0X21lbnUgPSBtZW51OworCQl9CisJCWlmIChsYXN0X21lbnUpIHsKKwkJCXBhcmVudC0+bGlzdCA9IHBhcmVudC0+bmV4dDsKKwkJCXBhcmVudC0+bmV4dCA9IGxhc3RfbWVudS0+bmV4dDsKKwkJCWxhc3RfbWVudS0+bmV4dCA9IE5VTEw7CisJCX0KKwl9CisJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkgeworCQlpZiAoc3ltICYmIHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBtZW51LT5zeW0pIHsKKwkJCW1lbnUtPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRVZBTDsKKwkJCWlmICghbWVudS0+cHJvbXB0KQorCQkJCW1lbnVfd2FybihtZW51LCAiY2hvaWNlIHZhbHVlIG11c3QgaGF2ZSBhIHByb21wdCIpOworCQkJZm9yIChwcm9wID0gbWVudS0+c3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT50eXBlID09IFBfUFJPTVBUICYmIHByb3AtPm1lbnUgIT0gbWVudSkgeworCQkJCQlwcm9wX3dhcm4ocHJvcCwgImNob2ljZSB2YWx1ZXMgIgorCQkJCQkgICAgImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgYSAiCisJCQkJCSAgICAic2luZ2xlIHByb21wdCIpOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX0RFRkFVTFQpCisJCQkJCXByb3Bfd2Fybihwcm9wLCAiZGVmYXVsdHMgZm9yIGNob2ljZSAiCisJCQkJCSAgICAidmFsdWVzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCX0KKwkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJbWVudV9zZXRfdHlwZShzeW0tPnR5cGUpOworCQkJbWVudV9hZGRfc3ltYm9sKFBfQ0hPSUNFLCBzeW0sIE5VTEwpOworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCWZvciAoZXAgPSAmcHJvcC0+ZXhwcjsgKmVwOyBlcCA9ICYoKmVwKS0+bGVmdC5leHByKQorCQkJCTsKKwkJCSplcCA9IGV4cHJfYWxsb2Nfb25lKEVfQ0hPSUNFLCBOVUxMKTsKKwkJCSgqZXApLT5yaWdodC5zeW0gPSBtZW51LT5zeW07CisJCX0KKwkJaWYgKG1lbnUtPmxpc3QgJiYgKCFtZW51LT5wcm9tcHQgfHwgIW1lbnUtPnByb21wdC0+dGV4dCkpIHsKKwkJCWZvciAobGFzdF9tZW51ID0gbWVudS0+bGlzdDsgOyBsYXN0X21lbnUgPSBsYXN0X21lbnUtPm5leHQpIHsKKwkJCQlsYXN0X21lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCQlpZiAoIWxhc3RfbWVudS0+bmV4dCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlsYXN0X21lbnUtPm5leHQgPSBtZW51LT5uZXh0OworCQkJbWVudS0+bmV4dCA9IG1lbnUtPmxpc3Q7CisJCQltZW51LT5saXN0ID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzeW0gJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dBUk5FRCkpIHsKKwkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCisJCQltZW51X3dhcm4ocGFyZW50LCAiY29uZmlnIHN5bWJvbCBkZWZpbmVkIHdpdGhvdXQgdHlwZSIpOworCisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgIXBhcmVudC0+cHJvbXB0KQorCQkJbWVudV93YXJuKHBhcmVudCwgImNob2ljZSBtdXN0IGhhdmUgYSBwcm9tcHQiKTsKKworCQkvKiBDaGVjayBwcm9wZXJ0aWVzIGNvbm5lY3RlZCB0byB0aGlzIHN5bWJvbCAqLworCQlzeW1fY2hlY2tfcHJvcChzeW0pOworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XQVJORUQ7CisJfQorCisJaWYgKHN5bSAmJiAhc3ltX2lzX29wdGlvbmFsKHN5bSkgJiYgcGFyZW50LT5wcm9tcHQpIHsKKwkJc3ltLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKHN5bS0+cmV2X2RlcC5leHByLAorCQkJCWV4cHJfYWxsb2NfYW5kKHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHIsCisJCQkJCWV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbW9kKSkpOworCX0KK30KKworYm9vbCBtZW51X2lzX3Zpc2libGUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwl0cmlzdGF0ZSB2aXNpYmxlOworCisJaWYgKCFtZW51LT5wcm9tcHQpCisJCXJldHVybiBmYWxzZTsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaTsKKwl9IGVsc2UKKwkJdmlzaWJsZSA9IG1lbnUtPnByb21wdC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIpOworCisJaWYgKHZpc2libGUgIT0gbm8pCisJCXJldHVybiB0cnVlOworCWlmICghc3ltIHx8IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUobWVudS0+c3ltKSA9PSBubykKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciAqbWVudV9nZXRfcHJvbXB0KHN0cnVjdCBtZW51ICptZW51KQoreworCWlmIChtZW51LT5wcm9tcHQpCisJCXJldHVybiBfKG1lbnUtPnByb21wdC0+dGV4dCk7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQlyZXR1cm4gXyhtZW51LT5zeW0tPm5hbWUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWVudSAqbWVudV9nZXRfcm9vdF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCXJldHVybiAmcm9vdG1lbnU7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9wYXJlbnRfbWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJZm9yICg7IG1lbnUgIT0gJnJvb3RtZW51OyBtZW51ID0gbWVudS0+cGFyZW50KSB7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiAwOworCQlpZiAodHlwZSA9PSBQX01FTlUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG1lbnU7Cit9CisKZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL3N5bWJvbC5jIGIvdG95Ym94L2tjb25maWcvc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMjVjZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL3N5bWJvbC5jCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CisJLm5hbWUgPSAieSIsCisJLmN1cnIgPSB7ICJ5IiwgeWVzIH0sCisJLmZsYWdzID0gU1lNQk9MX0NPTlNUfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9tb2QgPSB7CisJLm5hbWUgPSAibSIsCisJLmN1cnIgPSB7ICJtIiwgbW9kIH0sCisJLmZsYWdzID0gU1lNQk9MX0NPTlNUfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9ubyA9IHsKKwkubmFtZSA9ICJuIiwKKwkuY3VyciA9IHsgIm4iLCBubyB9LAorCS5mbGFncyA9IFNZTUJPTF9DT05TVHxTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfZW1wdHkgPSB7CisJLm5hbWUgPSAiIiwKKwkuY3VyciA9IHsgIiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX1ZBTElELAorfTsKKworaW50IHN5bV9jaGFuZ2VfY291bnQ7CitzdHJ1Y3Qgc3ltYm9sICpzeW1fZGVmY29uZmlnX2xpc3Q7CitzdHJ1Y3Qgc3ltYm9sICptb2R1bGVzX3N5bTsKK3RyaXN0YXRlIG1vZHVsZXNfdmFsOworCit2b2lkIHN5bV9hZGRfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKFBfREVGQVVMVCwgc3ltKTsKKworCXByb3AtPmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChzeW1fbG9va3VwKGRlZiwgMSkpOworfQorCit2b2lkIHN5bV9pbml0KHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCB1dHNuYW1lIHV0czsKKwljaGFyICpwOworCXN0YXRpYyBib29sIGluaXRlZCA9IGZhbHNlOworCisJaWYgKGluaXRlZCkKKwkJcmV0dXJuOworCWluaXRlZCA9IHRydWU7CisKKwl1bmFtZSgmdXRzKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIkFSQ0giLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIkFSQ0giKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlwID0gZ2V0ZW52KCJLRVJORUxWRVJTSU9OIik7CisJaWYgKHApCisJCXN5bV9hZGRfZGVmYXVsdChzeW0sIHApOworCisJc3ltID0gc3ltX2xvb2t1cCgiVU5BTUVfUkVMRUFTRSIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJc3ltX2FkZF9kZWZhdWx0KHN5bSwgdXRzLnJlbGVhc2UpOworfQorCitlbnVtIHN5bWJvbF90eXBlIHN5bV9nZXRfdHlwZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlID0gc3ltLT50eXBlOworCisJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHN5bS0+dmlzaWJsZSA9PSB5ZXMpCisJCQl0eXBlID0gU19CT09MRUFOOworCQllbHNlIGlmIChtb2R1bGVzX3ZhbCA9PSBubykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJfQorCXJldHVybiB0eXBlOworfQorCitjb25zdCBjaGFyICpzeW1fdHlwZV9uYW1lKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJcmV0dXJuICJib29sZWFuIjsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXJldHVybiAidHJpc3RhdGUiOworCWNhc2UgU19JTlQ6CisJCXJldHVybiAiaW50ZWdlciI7CisJY2FzZSBTX0hFWDoKKwkJcmV0dXJuICJoZXgiOworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiAic3RyaW5nIjsKKwljYXNlIFNfVU5LTk9XTjoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwljYXNlIFNfT1RIRVI6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gIj8/PyI7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9jaG9pY2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9jaG9pY2VzKHN5bSwgcHJvcCkKKwkJcmV0dXJuIHByb3A7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSAhPSBubykKKwkJCXJldHVybiBwcm9wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X3JhbmdlX3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfUkFOR0UpIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHN5bV9nZXRfcmFuZ2VfdmFsKHN0cnVjdCBzeW1ib2wgKnN5bSwgaW50IGJhc2UpCit7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJCWJhc2UgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJYmFzZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHN0cnRvbChzeW0tPmN1cnIudmFsLCBOVUxMLCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgc3ltX3ZhbGlkYXRlX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IGJhc2UsIHZhbCwgdmFsMjsKKwljaGFyIHN0cls2NF07CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJCWJhc2UgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJYmFzZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKwl2YWwgPSBzdHJ0b2woc3ltLT5jdXJyLnZhbCwgTlVMTCwgYmFzZSk7CisJdmFsMiA9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPmxlZnQuc3ltLCBiYXNlKTsKKwlpZiAodmFsID49IHZhbDIpIHsKKwkJdmFsMiA9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgYmFzZSk7CisJCWlmICh2YWwgPD0gdmFsMikKKwkJCXJldHVybjsKKwl9CisJaWYgKHN5bS0+dHlwZSA9PSBTX0lOVCkKKwkJc3ByaW50ZihzdHIsICIlZCIsIHZhbDIpOworCWVsc2UKKwkJc3ByaW50ZihzdHIsICIweCV4IiwgdmFsMik7CisJc3ltLT5jdXJyLnZhbCA9IHN0cmR1cChzdHIpOworfQorCitzdGF0aWMgdm9pZCBzeW1fY2FsY192aXNpYmlsaXR5KHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdHJpc3RhdGUgdHJpOworCisJLyogYW55IHByb21wdCB2aXNpYmxlPyAqLworCXRyaSA9IG5vOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJdHJpID0gRV9PUih0cmksIHByb3AtPnZpc2libGUudHJpKTsKKwl9CisJaWYgKHRyaSA9PSBtb2QgJiYgKHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFIHx8IG1vZHVsZXNfdmFsID09IG5vKSkKKwkJdHJpID0geWVzOworCWlmIChzeW0tPnZpc2libGUgIT0gdHJpKSB7CisJCXN5bS0+dmlzaWJsZSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXJldHVybjsKKwl0cmkgPSBubzsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpCisJCXRyaSA9IGV4cHJfY2FsY192YWx1ZShzeW0tPnJldl9kZXAuZXhwcik7CisJaWYgKHRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+cmV2X2RlcC50cmkgIT0gdHJpKSB7CisJCXN5bS0+cmV2X2RlcC50cmkgPSB0cmk7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jYWxjX2Nob2ljZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbCAqZGVmX3N5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KKwlkZWZfc3ltID0gc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsOworCWlmIChkZWZfc3ltKSB7CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogYW55IG9mIHRoZSBkZWZhdWx0cyB2aXNpYmxlPyAqLworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSA9PSBubykKKwkJCWNvbnRpbnVlOworCQlkZWZfc3ltID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGp1c3QgZ2V0IHRoZSBmaXJzdCB2aXNpYmxlIHZhbHVlICovCisJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCWRlZl9zeW0gPSBlLT5yaWdodC5zeW07CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLworCXN5bS0+Y3Vyci50cmkgPSBubzsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzeW1fY2FsY192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBuZXd2YWwsIG9sZHZhbDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfVkFMSUQpCisJCXJldHVybjsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9WQUxJRDsKKworCW9sZHZhbCA9IHN5bS0+Y3VycjsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCW5ld3ZhbCA9IHN5bWJvbF9lbXB0eS5jdXJyOworCQlicmVhazsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW5ld3ZhbCA9IHN5bWJvbF9uby5jdXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzeW0tPmN1cnIudmFsID0gc3ltLT5uYW1lOworCQlzeW0tPmN1cnIudHJpID0gbm87CisJCXJldHVybjsKKwl9CisJaWYgKCFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKworCXN5bV9jYWxjX3Zpc2liaWxpdHkoc3ltKTsKKworCS8qIHNldCBkZWZhdWx0IGlmIHJlY3Vyc2l2ZWx5IGNhbGxlZCAqLworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykgeworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCW5ld3ZhbC50cmkgPSAocHJvcF9nZXRfc3ltYm9sKHByb3ApLT5jdXJyLnZhbCA9PSBzeW0pID8geWVzIDogbm87CisJCX0gZWxzZSBpZiAoRV9PUihzeW0tPnZpc2libGUsIHN5bS0+cmV2X2RlcC50cmkpICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpCisJCQkJbmV3dmFsLnRyaSA9IHN5bS0+ZGVmW1NfREVGX1VTRVJdLnRyaTsKKwkJCWVsc2UgaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJCQlpZiAocHJvcCkKKwkJCQkJbmV3dmFsLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT5leHByKTsKKwkJCX0KKwkJCW5ld3ZhbC50cmkgPSBFX09SKEVfQU5EKG5ld3ZhbC50cmksIHN5bS0+dmlzaWJsZSksIHN5bS0+cmV2X2RlcC50cmkpOworCQl9IGVsc2UgaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQkJaWYgKHByb3ApIHsKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCQluZXd2YWwudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPmV4cHIpOworCQkJfQorCQl9CisJCWlmIChuZXd2YWwudHJpID09IG1vZCAmJiBzeW1fZ2V0X3R5cGUoc3ltKSA9PSBTX0JPT0xFQU4pCisJCQluZXd2YWwudHJpID0geWVzOworCQlicmVhazsKKwljYXNlIFNfU1RSSU5HOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX0lOVDoKKwkJaWYgKHN5bS0+dmlzaWJsZSAhPSBubykgeworCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKSB7CisJCQkJbmV3dmFsLnZhbCA9IHN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJaWYgKHByb3ApIHsKKwkJCXN0cnVjdCBzeW1ib2wgKmRzID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQkJaWYgKGRzKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJc3ltX2NhbGNfdmFsdWUoZHMpOworCQkJCW5ld3ZhbC52YWwgPSBkcy0+Y3Vyci52YWw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmIG5ld3ZhbC50cmkgPT0geWVzKQorCQlzeW0tPmN1cnIudmFsID0gc3ltX2NhbGNfY2hvaWNlKHN5bSk7CisJc3ltX3ZhbGlkYXRlX3JhbmdlKHN5bSk7CisKKwlpZiAobWVtY21wKCZvbGR2YWwsICZzeW0tPmN1cnIsIHNpemVvZihvbGR2YWwpKSkgeworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwkJaWYgKG1vZHVsZXNfc3ltID09IHN5bSkgeworCQkJc3ltX3NldF9hbGxfY2hhbmdlZCgpOworCQkJbW9kdWxlc192YWwgPSBtb2R1bGVzX3N5bS0+Y3Vyci50cmk7CisJCX0KKwl9CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCWludCBmbGFncyA9IHN5bS0+ZmxhZ3MgJiAoU1lNQk9MX0NIQU5HRUQgfCBTWU1CT0xfV1JJVEUpOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCQllLT5yaWdodC5zeW0tPmZsYWdzIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgU1lNQk9MX0NIQU5HRUQpCisJCQkJc3ltX3NldF9jaGFuZ2VkKGUtPnJpZ2h0LnN5bSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9WQUxJRDsKKwlzeW1fY2hhbmdlX2NvdW50Kys7CisJaWYgKG1vZHVsZXNfc3ltKQorCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7Cit9CisKK3ZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEFOR0VEOworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUpCisJCQlwcm9wLT5tZW51LT5mbGFncyB8PSBNRU5VX0NIQU5HRUQ7CisJfQorfQorCit2b2lkIHN5bV9zZXRfYWxsX2NoYW5nZWQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGk7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKK30KKworYm9vbCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCWludCB0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisKKwlpZiAoc3ltLT52aXNpYmxlID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSAhPSBTX0JPT0xFQU4gJiYgdHlwZSAhPSBTX1RSSVNUQVRFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBTX0JPT0xFQU4gJiYgdmFsID09IG1vZCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW0tPnZpc2libGUgPD0gc3ltLT5yZXZfZGVwLnRyaSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJcmV0dXJuIHZhbCA9PSB5ZXM7CisJcmV0dXJuIHZhbCA+PSBzeW0tPnJldl9kZXAudHJpICYmIHZhbCA8PSBzeW0tPnZpc2libGU7Cit9CisKK2Jvb2wgc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHRyaXN0YXRlIHZhbCkKK3sKKwl0cmlzdGF0ZSBvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwlpZiAob2xkdmFsICE9IHZhbCAmJiAhc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHZhbCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfREVGX1VTRVIpKSB7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0RFRl9VU0VSOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJLyoKKwkgKiBzZXR0aW5nIGEgY2hvaWNlIHZhbHVlIGFsc28gcmVzZXRzIHRoZSBuZXcgZmxhZyBvZiB0aGUgY2hvaWNlCisJICogc3ltYm9sIGFuZCBhbGwgb3RoZXIgY2hvaWNlIHZhbHVlcy4KKwkgKi8KKwlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHZhbCA9PSB5ZXMpIHsKKwkJc3RydWN0IHN5bWJvbCAqY3MgPSBwcm9wX2dldF9zeW1ib2woc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pKTsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCQlzdHJ1Y3QgZXhwciAqZTsKKworCQljcy0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHN5bTsKKwkJY3MtPmZsYWdzIHw9IFNZTUJPTF9ERUZfVVNFUjsKKwkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3AoY3MpOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQorCQkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0RFRl9VU0VSOworCQl9CisJfQorCisJc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpID0gdmFsOworCWlmIChvbGR2YWwgIT0gdmFsKQorCQlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordHJpc3RhdGUgc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlvbGR2YWwgPSBuZXd2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJZG8geworCQlzd2l0Y2ggKG5ld3ZhbCkgeworCQljYXNlIG5vOgorCQkJbmV3dmFsID0gbW9kOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJbmV3dmFsID0geWVzOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJbmV3dmFsID0gbm87CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCkpCisJCQlicmVhazsKKwl9IHdoaWxlIChvbGR2YWwgIT0gbmV3dmFsKTsKKwlyZXR1cm4gbmV3dmFsOworfQorCitib29sIHN5bV9zdHJpbmdfdmFsaWQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc2lnbmVkIGNoYXIgY2g7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiB0cnVlOworCWNhc2UgU19JTlQ6CisJCWNoID0gKnN0cisrOworCQlpZiAoY2ggPT0gJy0nKQorCQkJY2ggPSAqc3RyKys7CisJCWlmICghaXNkaWdpdChjaCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjaCA9PSAnMCcgJiYgKnN0ciAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCQl3aGlsZSAoKGNoID0gKnN0cisrKSkgeworCQkJaWYgKCFpc2RpZ2l0KGNoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0hFWDoKKwkJaWYgKHN0clswXSA9PSAnMCcgJiYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykpCisJCQlzdHIgKz0gMjsKKwkJY2ggPSAqc3RyKys7CisJCWRvIHsKKwkJCWlmICghaXN4ZGlnaXQoY2gpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSB3aGlsZSAoKGNoID0gKnN0cisrKSk7CisJCXJldHVybiB0cnVlOworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzdHJbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQljYXNlICdtJzogY2FzZSAnTSc6CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitib29sIHN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfU1RSSU5HOgorCQlyZXR1cm4gc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cik7CisJY2FzZSBTX0lOVDoKKwkJaWYgKCFzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3RyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcHJvcCA9IHN5bV9nZXRfcmFuZ2VfcHJvcChzeW0pOworCQlpZiAoIXByb3ApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdmFsID0gc3RydG9sKHN0ciwgTlVMTCwgMTApOworCQlyZXR1cm4gdmFsID49IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPmxlZnQuc3ltLCAxMCkgJiYKKwkJICAgICAgIHZhbCA8PSBzeW1fZ2V0X3JhbmdlX3ZhbChwcm9wLT5leHByLT5yaWdodC5zeW0sIDEwKTsKKwljYXNlIFNfSEVYOgorCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCWlmICghcHJvcCkKKwkJCXJldHVybiB0cnVlOworCQl2YWwgPSBzdHJ0b2woc3RyLCBOVUxMLCAxNik7CisJCXJldHVybiB2YWwgPj0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIDE2KSAmJgorCQkgICAgICAgdmFsIDw9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgMTYpOworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzdHJbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpOworCQljYXNlICdtJzogY2FzZSAnTSc6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCk7CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitib29sIHN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKQoreworCWNvbnN0IGNoYXIgKm9sZHZhbDsKKwljaGFyICp2YWw7CisJaW50IHNpemU7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChuZXd2YWxbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCB5ZXMpOworCQljYXNlICdtJzogY2FzZSAnTSc6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCk7CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbm8pOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJaWYgKCFzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZShzeW0sIG5ld3ZhbCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfREVGX1VTRVIpKSB7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0RFRl9VU0VSOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisKKwlvbGR2YWwgPSBzeW0tPmRlZltTX0RFRl9VU0VSXS52YWw7CisJc2l6ZSA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwlpZiAoc3ltLT50eXBlID09IFNfSEVYICYmIChuZXd2YWxbMF0gIT0gJzAnIHx8IChuZXd2YWxbMV0gIT0gJ3gnICYmIG5ld3ZhbFsxXSAhPSAnWCcpKSkgeworCQlzaXplICs9IDI7CisJCXN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKKwkJKnZhbCsrID0gJzAnOworCQkqdmFsKysgPSAneCc7CisJfSBlbHNlIGlmICghb2xkdmFsIHx8IHN0cmNtcChvbGR2YWwsIG5ld3ZhbCkpCisJCXN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKKwllbHNlCisJCXJldHVybiB0cnVlOworCisJc3RyY3B5KHZhbCwgbmV3dmFsKTsKKwlmcmVlKCh2b2lkICopb2xkdmFsKTsKKwlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgY2hhciAqc3ltX2dldF9zdHJpbmdfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXRyaXN0YXRlIHZhbDsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2Ugbm86CisJCQlyZXR1cm4gIm4iOworCQljYXNlIG1vZDoKKwkJCXJldHVybiAibSI7CisJCWNhc2UgeWVzOgorCQkJcmV0dXJuICJ5IjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiAoY29uc3QgY2hhciAqKXN5bS0+Y3Vyci52YWw7Cit9CisKK2Jvb2wgc3ltX2lzX2NoYW5nYWJsZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+dmlzaWJsZSA+IHN5bS0+cmV2X2RlcC50cmk7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGlzY29uc3QpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCWNvbnN0IGNoYXIgKnB0cjsKKwljaGFyICpuZXdfbmFtZTsKKwlpbnQgaGFzaCA9IDA7CisKKwlpZiAobmFtZSkgeworCQlpZiAobmFtZVswXSAmJiAhbmFtZVsxXSkgeworCQkJc3dpdGNoIChuYW1lWzBdKSB7CisJCQljYXNlICd5JzogcmV0dXJuICZzeW1ib2xfeWVzOworCQkJY2FzZSAnbSc6IHJldHVybiAmc3ltYm9sX21vZDsKKwkJCWNhc2UgJ24nOiByZXR1cm4gJnN5bWJvbF9ubzsKKwkJCX0KKwkJfQorCQlmb3IgKHB0ciA9IG5hbWU7ICpwdHI7IHB0cisrKQorCQkJaGFzaCArPSAqcHRyOworCQloYXNoICY9IDB4ZmY7CisKKwkJZm9yIChzeW1ib2wgPSBzeW1ib2xfaGFzaFtoYXNoXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wtPm5leHQpIHsKKwkJCWlmICghc3RyY21wKHN5bWJvbC0+bmFtZSwgbmFtZSkpIHsKKwkJCQlpZiAoKGlzY29uc3QgJiYgc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgfHwKKwkJCQkgICAgKCFpc2NvbnN0ICYmICEoc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpKQorCQkJCQlyZXR1cm4gc3ltYm9sOworCQkJfQorCQl9CisJCW5ld19uYW1lID0gc3RyZHVwKG5hbWUpOworCX0gZWxzZSB7CisJCW5ld19uYW1lID0gTlVMTDsKKwkJaGFzaCA9IDI1NjsKKwl9CisKKwlzeW1ib2wgPSBtYWxsb2Moc2l6ZW9mKCpzeW1ib2wpKTsKKwltZW1zZXQoc3ltYm9sLCAwLCBzaXplb2YoKnN5bWJvbCkpOworCXN5bWJvbC0+bmFtZSA9IG5ld19uYW1lOworCXN5bWJvbC0+dHlwZSA9IFNfVU5LTk9XTjsKKwlpZiAoaXNjb25zdCkKKwkJc3ltYm9sLT5mbGFncyB8PSBTWU1CT0xfQ09OU1Q7CisKKwlzeW1ib2wtPm5leHQgPSBzeW1ib2xfaGFzaFtoYXNoXTsKKwlzeW1ib2xfaGFzaFtoYXNoXSA9IHN5bWJvbDsKKworCXJldHVybiBzeW1ib2w7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sID0gTlVMTDsKKwljb25zdCBjaGFyICpwdHI7CisJaW50IGhhc2ggPSAwOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuYW1lWzBdICYmICFuYW1lWzFdKSB7CisJCXN3aXRjaCAobmFtZVswXSkgeworCQljYXNlICd5JzogcmV0dXJuICZzeW1ib2xfeWVzOworCQljYXNlICdtJzogcmV0dXJuICZzeW1ib2xfbW9kOworCQljYXNlICduJzogcmV0dXJuICZzeW1ib2xfbm87CisJCX0KKwl9CisJZm9yIChwdHIgPSBuYW1lOyAqcHRyOyBwdHIrKykKKwkJaGFzaCArPSAqcHRyOworCWhhc2ggJj0gMHhmZjsKKworCWZvciAoc3ltYm9sID0gc3ltYm9sX2hhc2hbaGFzaF07IHN5bWJvbDsgc3ltYm9sID0gc3ltYm9sLT5uZXh0KSB7CisJCWlmICghc3RyY21wKHN5bWJvbC0+bmFtZSwgbmFtZSkgJiYKKwkJICAgICEoc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpCisJCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN5bWJvbDsKK30KKworc3RydWN0IHN5bWJvbCAqKnN5bV9yZV9zZWFyY2goY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0sICoqc3ltX2FyciA9IE5VTEw7CisJaW50IGksIGNudCwgc2l6ZTsKKwlyZWdleF90IHJlOworCisJY250ID0gc2l6ZSA9IDA7CisJLyogU2tpcCBpZiBlbXB0eSAqLworCWlmIChzdHJsZW4ocGF0dGVybikgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHJlZ2NvbXAoJnJlLCBwYXR0ZXJuLCBSRUdfRVhURU5ERUR8UkVHX05PU1VCfFJFR19JQ0FTRSkpCisJCXJldHVybiBOVUxMOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCB8fCAhc3ltLT5uYW1lKQorCQkJY29udGludWU7CisJCWlmIChyZWdleGVjKCZyZSwgc3ltLT5uYW1lLCAwLCBOVUxMLCAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY250ICsgMSA+PSBzaXplKSB7CisJCQl2b2lkICp0bXAgPSBzeW1fYXJyOworCQkJc2l6ZSArPSAxNjsKKwkJCXN5bV9hcnIgPSByZWFsbG9jKHN5bV9hcnIsIHNpemUgKiBzaXplb2Yoc3RydWN0IHN5bWJvbCAqKSk7CisJCQlpZiAoIXN5bV9hcnIpIHsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJc3ltX2FycltjbnQrK10gPSBzeW07CisJfQorCWlmIChzeW1fYXJyKQorCQlzeW1fYXJyW2NudF0gPSBOVUxMOworCXJlZ2ZyZWUoJnJlKTsKKworCXJldHVybiBzeW1fYXJyOworfQorCisKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZXhwcl9kZXBzKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCXN5bSA9IHN5bV9jaGVja19leHByX2RlcHMoZS0+bGVmdC5leHByKTsKKwkJaWYgKHN5bSkKKwkJCXJldHVybiBzeW07CisJCXJldHVybiBzeW1fY2hlY2tfZXhwcl9kZXBzKGUtPnJpZ2h0LmV4cHIpOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBzeW1fY2hlY2tfZXhwcl9kZXBzKGUtPmxlZnQuZXhwcik7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlzeW0gPSBzeW1fY2hlY2tfZGVwcyhlLT5sZWZ0LnN5bSk7CisJCWlmIChzeW0pCisJCQlyZXR1cm4gc3ltOworCQlyZXR1cm4gc3ltX2NoZWNrX2RlcHMoZS0+cmlnaHQuc3ltKTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gc3ltX2NoZWNrX2RlcHMoZS0+bGVmdC5zeW0pOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludGYoIk9vcHMhIEhvdyB0byBjaGVjayAlZD9cbiIsIGUtPnR5cGUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZGVwcyhzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltMjsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEVDSykgeworCQlwcmludGYoIldhcm5pbmchIEZvdW5kIHJlY3Vyc2l2ZSBkZXBlbmRlbmN5OiAlcyIsIHN5bS0+bmFtZSk7CisJCXJldHVybiBzeW07CisJfQorCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLRUQpCisJCXJldHVybiBOVUxMOworCisJc3ltLT5mbGFncyB8PSAoU1lNQk9MX0NIRUNLIHwgU1lNQk9MX0NIRUNLRUQpOworCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHN5bS0+cmV2X2RlcC5leHByKTsKKwlpZiAoc3ltMikKKwkJZ290byBvdXQ7CisKKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCWlmIChwcm9wLT50eXBlID09IFBfQ0hPSUNFIHx8IHByb3AtPnR5cGUgPT0gUF9TRUxFQ1QpCisJCQljb250aW51ZTsKKwkJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHN5bTIpCisJCQlnb3RvIG91dDsKKwkJaWYgKHByb3AtPnR5cGUgIT0gUF9ERUZBVUxUIHx8IHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT5leHByKTsKKwkJaWYgKHN5bTIpCisJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJaWYgKHN5bTIpIHsKKwkJcHJpbnRmKCIgJXMiLCBzeW0tPm5hbWUpOworCQlpZiAoc3ltMiA9PSBzeW0pIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXN5bTIgPSBOVUxMOworCQl9CisJfQorCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEVDSzsKKwlyZXR1cm4gc3ltMjsKK30KKworc3RydWN0IHByb3BlcnR5ICpwcm9wX2FsbG9jKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHByb3BlcnR5ICoqcHJvcHA7CisKKwlwcm9wID0gbWFsbG9jKHNpemVvZigqcHJvcCkpOworCW1lbXNldChwcm9wLCAwLCBzaXplb2YoKnByb3ApKTsKKwlwcm9wLT50eXBlID0gdHlwZTsKKwlwcm9wLT5zeW0gPSBzeW07CisJcHJvcC0+ZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwlwcm9wLT5saW5lbm8gPSB6Y29uZl9saW5lbm8oKTsKKworCS8qIGFwcGVuZCBwcm9wZXJ0eSB0byB0aGUgcHJvcCBsaXN0IG9mIHN5bWJvbCAqLworCWlmIChzeW0pIHsKKwkJZm9yIChwcm9wcCA9ICZzeW0tPnByb3A7ICpwcm9wcDsgcHJvcHAgPSAmKCpwcm9wcCktPm5leHQpCisJCQk7CisJCSpwcm9wcCA9IHByb3A7CisJfQorCisJcmV0dXJuIHByb3A7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnByb3BfZ2V0X3N5bWJvbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJaWYgKHByb3AtPmV4cHIgJiYgKHByb3AtPmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgfHwKKwkJCSAgIHByb3AtPmV4cHItPnR5cGUgPT0gRV9DSE9JQ0UpKQorCQlyZXR1cm4gcHJvcC0+ZXhwci0+bGVmdC5zeW07CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKnByb3BfZ2V0X3R5cGVfbmFtZShlbnVtIHByb3BfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUF9QUk9NUFQ6CisJCXJldHVybiAicHJvbXB0IjsKKwljYXNlIFBfQ09NTUVOVDoKKwkJcmV0dXJuICJjb21tZW50IjsKKwljYXNlIFBfTUVOVToKKwkJcmV0dXJuICJtZW51IjsKKwljYXNlIFBfREVGQVVMVDoKKwkJcmV0dXJuICJkZWZhdWx0IjsKKwljYXNlIFBfQ0hPSUNFOgorCQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBQX1NFTEVDVDoKKwkJcmV0dXJuICJzZWxlY3QiOworCWNhc2UgUF9SQU5HRToKKwkJcmV0dXJuICJyYW5nZSI7CisJY2FzZSBQX1VOS05PV046CisJCWJyZWFrOworCX0KKwlyZXR1cm4gInVua25vd24iOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2tjb25maWcvdXRpbC5jIGIvdG95Ym94L2tjb25maWcvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy91dGlsLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFNhbSBSYXZuYm9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGtjLmgiCisKKy8qIGZpbGUgYWxyZWFkeSBwcmVzZW50IGluIGxpc3Q/IElmIG5vdCBhZGQgaXQgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCBmaWxlLT5uYW1lKSkKKwkJCXJldHVybiBmaWxlOworCX0KKworCWZpbGUgPSBtYWxsb2Moc2l6ZW9mKCpmaWxlKSk7CisJbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworCWZpbGUtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZmlsZS0+bmV4dCA9IGZpbGVfbGlzdDsKKwlmaWxlX2xpc3QgPSBmaWxlOworCXJldHVybiBmaWxlOworfQorCisvKiB3cml0ZSBhIGRlcGVuZGVuY3kgZmlsZSBhcyB1c2VkIGJ5IGtidWlsZCB0byB0cmFjayBkZXBlbmRlbmNpZXMgKi8KK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCUZJTEUgKm91dDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9ICIua2NvbmZpZy5kIjsKKwlvdXQgPSBmb3BlbigiLi5jb25maWcudG1wIiwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJZnByaW50ZihvdXQsICJkZXBzX2NvbmZpZyA6PSBcXFxuIik7CisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoZmlsZS0+bmV4dCkKKwkJCWZwcmludGYob3V0LCAiXHQlcyBcXFxuIiwgZmlsZS0+bmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYob3V0LCAiXHQlc1xuIiwgZmlsZS0+bmFtZSk7CisJfQorCWZwcmludGYob3V0LCAiXG5pbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmY6IFxcXG4iCisJCSAgICAgIlx0JChkZXBzX2NvbmZpZylcblxuIgorCQkgICAgICIkKGRlcHNfY29uZmlnKTogO1xuIik7CisJZmNsb3NlKG91dCk7CisJcmVuYW1lKCIuLmNvbmZpZy50bXAiLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBBbGxvY2F0ZSBpbml0aWFsIGdyb3dhYmxlIHN0aW5nICovCitzdHJ1Y3QgZ3N0ciBzdHJfbmV3KHZvaWQpCit7CisJc3RydWN0IGdzdHIgZ3M7CisJZ3MucyA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiA2NCk7CisJZ3MubGVuID0gMTY7CisJc3RyY3B5KGdzLnMsICJcMCIpOworCXJldHVybiBnczsKK30KKworLyogQWxsb2NhdGUgYW5kIGFzc2lnbiBncm93YWJsZSBzdHJpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gc3RyZHVwKHMpOworCWdzLmxlbiA9IHN0cmxlbihzKSArIDE7CisJcmV0dXJuIGdzOworfQorCisvKiBGcmVlIHN0b3JhZ2UgZm9yIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfZnJlZShzdHJ1Y3QgZ3N0ciAqZ3MpCit7CisJaWYgKGdzLT5zKQorCQlmcmVlKGdzLT5zKTsKKwlncy0+cyA9IE5VTEw7CisJZ3MtPmxlbiA9IDA7Cit9CisKKy8qIEFwcGVuZCB0byBncm93YWJsZSBzdHJpbmcgKi8KK3ZvaWQgc3RyX2FwcGVuZChzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKnMpCit7CisJc2l6ZV90IGwgPSBzdHJsZW4oZ3MtPnMpICsgc3RybGVuKHMpICsgMTsKKwlpZiAobCA+IGdzLT5sZW4pIHsKKwkJZ3MtPnMgICA9IHJlYWxsb2MoZ3MtPnMsIGwpOworCQlncy0+bGVuID0gbDsKKwl9CisJc3RyY2F0KGdzLT5zLCBzKTsKK30KKworLyogQXBwZW5kIHByaW50ZiBmb3JtYXR0ZWQgc3RyaW5nIHRvIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfcHJpbnRmKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljaGFyIHNbMTAwMDBdOyAvKiBiaWcgZW5vdWdoLi4uICovCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKHMsIHNpemVvZihzKSwgZm10LCBhcCk7CisJc3RyX2FwcGVuZChncywgcyk7CisJdmFfZW5kKGFwKTsKK30KKworLyogUmV0cmlldmUgdmFsdWUgb2YgZ3Jvd2FibGUgc3RyaW5nICovCitjb25zdCBjaGFyICpzdHJfZ2V0KHN0cnVjdCBnc3RyICpncykKK3sKKwlyZXR1cm4gZ3MtPnM7Cit9CisKZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkIGIvdG95Ym94L2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmZmNiYgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkCkBAIC0wLDAgKzEsMjM5IEBACisvKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDMuMC4xICovCisvKiBDb21tYW5kLWxpbmU6IGdwZXJmICAqLworLyogQ29tcHV0ZWQgcG9zaXRpb25zOiAtaycxLDMnICovCisKKyNpZiAhKCgnICcgPT0gMzIpICYmICgnIScgPT0gMzMpICYmICgnIicgPT0gMzQpICYmICgnIycgPT0gMzUpIFwKKyAgICAgICYmICgnJScgPT0gMzcpICYmICgnJicgPT0gMzgpICYmICgnXCcnID09IDM5KSAmJiAoJygnID09IDQwKSBcCisgICAgICAmJiAoJyknID09IDQxKSAmJiAoJyonID09IDQyKSAmJiAoJysnID09IDQzKSAmJiAoJywnID09IDQ0KSBcCisgICAgICAmJiAoJy0nID09IDQ1KSAmJiAoJy4nID09IDQ2KSAmJiAoJy8nID09IDQ3KSAmJiAoJzAnID09IDQ4KSBcCisgICAgICAmJiAoJzEnID09IDQ5KSAmJiAoJzInID09IDUwKSAmJiAoJzMnID09IDUxKSAmJiAoJzQnID09IDUyKSBcCisgICAgICAmJiAoJzUnID09IDUzKSAmJiAoJzYnID09IDU0KSAmJiAoJzcnID09IDU1KSAmJiAoJzgnID09IDU2KSBcCisgICAgICAmJiAoJzknID09IDU3KSAmJiAoJzonID09IDU4KSAmJiAoJzsnID09IDU5KSAmJiAoJzwnID09IDYwKSBcCisgICAgICAmJiAoJz0nID09IDYxKSAmJiAoJz4nID09IDYyKSAmJiAoJz8nID09IDYzKSAmJiAoJ0EnID09IDY1KSBcCisgICAgICAmJiAoJ0InID09IDY2KSAmJiAoJ0MnID09IDY3KSAmJiAoJ0QnID09IDY4KSAmJiAoJ0UnID09IDY5KSBcCisgICAgICAmJiAoJ0YnID09IDcwKSAmJiAoJ0cnID09IDcxKSAmJiAoJ0gnID09IDcyKSAmJiAoJ0knID09IDczKSBcCisgICAgICAmJiAoJ0onID09IDc0KSAmJiAoJ0snID09IDc1KSAmJiAoJ0wnID09IDc2KSAmJiAoJ00nID09IDc3KSBcCisgICAgICAmJiAoJ04nID09IDc4KSAmJiAoJ08nID09IDc5KSAmJiAoJ1AnID09IDgwKSAmJiAoJ1EnID09IDgxKSBcCisgICAgICAmJiAoJ1InID09IDgyKSAmJiAoJ1MnID09IDgzKSAmJiAoJ1QnID09IDg0KSAmJiAoJ1UnID09IDg1KSBcCisgICAgICAmJiAoJ1YnID09IDg2KSAmJiAoJ1cnID09IDg3KSAmJiAoJ1gnID09IDg4KSAmJiAoJ1knID09IDg5KSBcCisgICAgICAmJiAoJ1onID09IDkwKSAmJiAoJ1snID09IDkxKSAmJiAoJ1xcJyA9PSA5MikgJiYgKCddJyA9PSA5MykgXAorICAgICAgJiYgKCdeJyA9PSA5NCkgJiYgKCdfJyA9PSA5NSkgJiYgKCdhJyA9PSA5NykgJiYgKCdiJyA9PSA5OCkgXAorICAgICAgJiYgKCdjJyA9PSA5OSkgJiYgKCdkJyA9PSAxMDApICYmICgnZScgPT0gMTAxKSAmJiAoJ2YnID09IDEwMikgXAorICAgICAgJiYgKCdnJyA9PSAxMDMpICYmICgnaCcgPT0gMTA0KSAmJiAoJ2knID09IDEwNSkgJiYgKCdqJyA9PSAxMDYpIFwKKyAgICAgICYmICgnaycgPT0gMTA3KSAmJiAoJ2wnID09IDEwOCkgJiYgKCdtJyA9PSAxMDkpICYmICgnbicgPT0gMTEwKSBcCisgICAgICAmJiAoJ28nID09IDExMSkgJiYgKCdwJyA9PSAxMTIpICYmICgncScgPT0gMTEzKSAmJiAoJ3InID09IDExNCkgXAorICAgICAgJiYgKCdzJyA9PSAxMTUpICYmICgndCcgPT0gMTE2KSAmJiAoJ3UnID09IDExNykgJiYgKCd2JyA9PSAxMTgpIFwKKyAgICAgICYmICgndycgPT0gMTE5KSAmJiAoJ3gnID09IDEyMCkgJiYgKCd5JyA9PSAxMjEpICYmICgneicgPT0gMTIyKSBcCisgICAgICAmJiAoJ3snID09IDEyMykgJiYgKCd8JyA9PSAxMjQpICYmICgnfScgPT0gMTI1KSAmJiAoJ34nID09IDEyNikpCisvKiBUaGUgY2hhcmFjdGVyIHNldCBpcyBub3QgYmFzZWQgb24gSVNPLTY0Ni4gICovCisjZXJyb3IgImdwZXJmIGdlbmVyYXRlZCB0YWJsZXMgZG9uJ3Qgd29yayB3aXRoIHRoaXMgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQuIFBsZWFzZSByZXBvcnQgYSBidWcgdG8gPGJ1Zy1nbnUtZ3BlcmZAZ251Lm9yZz4uIgorI2VuZGlmCisKK3N0cnVjdCBrY29uZl9pZDsKKy8qIG1heGltdW0ga2V5IHJhbmdlID0gNDUsIGR1cGxpY2F0ZXMgPSAwICovCisKKyNpZmRlZiBfX0dOVUNfXworX19pbmxpbmUKKyNlbHNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2lubGluZQorI2VuZGlmCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2tjb25mX2lkX2hhc2ggKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNzb192YWx1ZXNbXSA9CisgICAgeworICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDI1LCAzMCwgMTUsCisgICAgICAgMCwgMTUsICAwLCA0NywgIDUsIDE1LCA0NywgNDcsIDMwLCAyMCwKKyAgICAgICA1LCAgMCwgMjUsIDE1LCAgMCwgIDAsIDEwLCAzNSwgNDcsIDQ3LAorICAgICAgIDUsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3CisgICAgfTsKKyAgcmVnaXN0ZXIgaW50IGh2YWwgPSBsZW47CisKKyAgc3dpdGNoIChodmFsKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGh2YWwgKz0gYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyWzJdXTsKKyAgICAgIC8qRkFMTFRIUk9VR0gqLworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAxOgorICAgICAgICBodmFsICs9IGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clswXV07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIGh2YWw7Cit9CisKK3N0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QKKyAgeworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyW3NpemVvZigib24iKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjZbc2l6ZW9mKCJzdHJpbmciKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjdbc2l6ZW9mKCJkZWZhdWx0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI4W3NpemVvZigiZGVmX2Jvb2wiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEwW3NpemVvZigicmFuZ2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjExW3NpemVvZigiZGVmX2Jvb2xlYW4iKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEyW3NpemVvZigiZGVmX3RyaXN0YXRlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxM1tzaXplb2YoImhleCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTRbc2l6ZW9mKCJkZWZjb25maWdfbGlzdCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTZbc2l6ZW9mKCJvcHRpb24iKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE3W3NpemVvZigiaWYiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE4W3NpemVvZigib3B0aW9uYWwiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIwW3NpemVvZigiZW5kaWYiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIxW3NpemVvZigiY2hvaWNlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyMltzaXplb2YoImVuZG1lbnUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIzW3NpemVvZigicmVxdWlyZXMiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI0W3NpemVvZigiZW5kY2hvaWNlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyNltzaXplb2YoImNvbmZpZyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjdbc2l6ZW9mKCJtb2R1bGVzIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyOFtzaXplb2YoImludCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjlbc2l6ZW9mKCJtZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzMVtzaXplb2YoInByb21wdCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzJbc2l6ZW9mKCJkZXBlbmRzIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzM1tzaXplb2YoInRyaXN0YXRlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNFtzaXplb2YoImJvb2wiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM1W3NpemVvZigibWVudWNvbmZpZyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzZbc2l6ZW9mKCJzZWxlY3QiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM3W3NpemVvZigiYm9vbGVhbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzlbc2l6ZW9mKCJoZWxwIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0MVtzaXplb2YoInNvdXJjZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDJbc2l6ZW9mKCJjb21tZW50IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0M1tzaXplb2YoIm1haW5tZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0NltzaXplb2YoImVuYWJsZSIpXTsKKyAgfTsKK3N0YXRpYyBzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190IGtjb25mX2lkX3N0cmluZ3NfY29udGVudHMgPQorICB7CisgICAgIm9uIiwKKyAgICAic3RyaW5nIiwKKyAgICAiZGVmYXVsdCIsCisgICAgImRlZl9ib29sIiwKKyAgICAicmFuZ2UiLAorICAgICJkZWZfYm9vbGVhbiIsCisgICAgImRlZl90cmlzdGF0ZSIsCisgICAgImhleCIsCisgICAgImRlZmNvbmZpZ19saXN0IiwKKyAgICAib3B0aW9uIiwKKyAgICAiaWYiLAorICAgICJvcHRpb25hbCIsCisgICAgImVuZGlmIiwKKyAgICAiY2hvaWNlIiwKKyAgICAiZW5kbWVudSIsCisgICAgInJlcXVpcmVzIiwKKyAgICAiZW5kY2hvaWNlIiwKKyAgICAiY29uZmlnIiwKKyAgICAibW9kdWxlcyIsCisgICAgImludCIsCisgICAgIm1lbnUiLAorICAgICJwcm9tcHQiLAorICAgICJkZXBlbmRzIiwKKyAgICAidHJpc3RhdGUiLAorICAgICJib29sIiwKKyAgICAibWVudWNvbmZpZyIsCisgICAgInNlbGVjdCIsCisgICAgImJvb2xlYW4iLAorICAgICJoZWxwIiwKKyAgICAic291cmNlIiwKKyAgICAiY29tbWVudCIsCisgICAgIm1haW5tZW51IiwKKyAgICAiZW5hYmxlIgorICB9OworI2RlZmluZSBrY29uZl9pZF9zdHJpbmdzICgoY29uc3QgY2hhciAqKSAma2NvbmZfaWRfc3RyaW5nc19jb250ZW50cykKK3N0cnVjdCBrY29uZl9pZCAqCitrY29uZl9pZF9sb29rdXAgKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgZW51bQorICAgIHsKKyAgICAgIFRPVEFMX0tFWVdPUkRTID0gMzMsCisgICAgICBNSU5fV09SRF9MRU5HVEggPSAyLAorICAgICAgTUFYX1dPUkRfTEVOR1RIID0gMTQsCisgICAgICBNSU5fSEFTSF9WQUxVRSA9IDIsCisgICAgICBNQVhfSEFTSF9WQUxVRSA9IDQ2CisgICAgfTsKKworICBzdGF0aWMgc3RydWN0IGtjb25mX2lkIHdvcmRsaXN0W10gPQorICAgIHsKKyAgICAgIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMiwJCVRfT04sCQlURl9QQVJBTX0sCisgICAgICB7LTF9LCB7LTF9LCB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjYsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1NUUklOR30sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNywJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1VOS05PV059LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjgsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTAsCQlUX1JBTkdFLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMSwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU59LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEyLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEzLAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19IRVh9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE0LAlUX09QVF9ERUZDT05GSUdfTElTVCxURl9PUFRJT059LAorICAgICAgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNiwJCVRfT1BUSU9OLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNywJCVRfSUYsCQlURl9DT01NQU5EfFRGX1BBUkFNfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxOCwJVF9PUFRJT05BTCwJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIwLAkJVF9FTkRJRiwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjEsCQlUX0NIT0lDRSwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjIsCVRfRU5ETUVOVSwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjMsCVRfUkVRVUlSRVMsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjI0LAlUX0VORENIT0lDRSwJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjI2LAkJVF9DT05GSUcsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjI3LAlUX09QVF9NT0RVTEVTLAlURl9PUFRJT059LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjI4LAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19JTlR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjI5LAkJVF9NRU5VLAkJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMxLAkJVF9QUk9NUFQsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMyLAlUX0RFUEVORFMsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMzLAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNCwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzUsCVRfTUVOVUNPTkZJRywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzYsCQlUX1NFTEVDVCwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzcsCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjM5LAkJVF9IRUxQLAkJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQxLAkJVF9TT1VSQ0UsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQyLAlUX0NPTU1FTlQsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQzLAlUX01BSU5NRU5VLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDYsCQlUX1NFTEVDVCwJVEZfQ09NTUFORH0KKyAgICB9OworCisgIGlmIChsZW4gPD0gTUFYX1dPUkRfTEVOR1RIICYmIGxlbiA+PSBNSU5fV09SRF9MRU5HVEgpCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGtleSA9IGtjb25mX2lkX2hhc2ggKHN0ciwgbGVuKTsKKworICAgICAgaWYgKGtleSA8PSBNQVhfSEFTSF9WQUxVRSAmJiBrZXkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJlZ2lzdGVyIGludCBvID0gd29yZGxpc3Rba2V5XS5uYW1lOworICAgICAgICAgIGlmIChvID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBvICsga2NvbmZfaWRfc3RyaW5nczsKKworICAgICAgICAgICAgICBpZiAoKnN0ciA9PSAqcyAmJiAhc3RybmNtcCAoc3RyICsgMSwgcyArIDEsIGxlbiAtIDEpICYmIHNbbGVuXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiAmd29yZGxpc3Rba2V5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3RveWJveC9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi90b3lib3gva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2NhYmQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjM0NSBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuMS4gICovCisKKy8qIFNrZWxldG9uIHBhcnNlciBmb3IgWWFjYy1saWtlIHBhcnNpbmcgd2l0aCBCaXNvbiwKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisgICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKworLyogV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBvcmlnaW5hbCBzbyBjYWxsZWQKKyAgIGBgc2VtYW50aWMnJyBwYXJzZXIuICAqLworCisvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAorICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisgICB2YXJpYWJsZXMsIGFzIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlIGV4cGFuZGVkIGJ5IHVzZXIgbWFjcm9zLgorICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bworICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKyAgIFVTRVIgTkFNRSBTUEFDRSIgYmVsb3cuICAqLworCisvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworI2RlZmluZSBZWUJJU09OIDEKKworLyogQmlzb24gdmVyc2lvbi4gICovCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi4xIgorCisvKiBTa2VsZXRvbiBuYW1lLiAgKi8KKyNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCisKKy8qIFB1cmUgcGFyc2Vycy4gICovCisjZGVmaW5lIFlZUFVSRSAwCisKKy8qIFVzaW5nIGxvY2F0aW9ucy4gICovCisjZGVmaW5lIFlZTFNQX05FRURFRCAwCisKKy8qIFN1YnN0aXR1dGUgdGhlIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcy4gICovCisjZGVmaW5lIHl5cGFyc2UgemNvbmZwYXJzZQorI2RlZmluZSB5eWxleCAgIHpjb25mbGV4CisjZGVmaW5lIHl5ZXJyb3IgemNvbmZlcnJvcgorI2RlZmluZSB5eWx2YWwgIHpjb25mbHZhbAorI2RlZmluZSB5eWNoYXIgIHpjb25mY2hhcgorI2RlZmluZSB5eWRlYnVnIHpjb25mZGVidWcKKyNkZWZpbmUgeXluZXJycyB6Y29uZm5lcnJzCisKKworLyogVG9rZW5zLiAgKi8KKyNpZm5kZWYgWVlUT0tFTlRZUEUKKyMgZGVmaW5lIFlZVE9LRU5UWVBFCisgICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKKyAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCisgICBlbnVtIHl5dG9rZW50eXBlIHsKKyAgICAgVF9NQUlOTUVOVSA9IDI1OCwKKyAgICAgVF9NRU5VID0gMjU5LAorICAgICBUX0VORE1FTlUgPSAyNjAsCisgICAgIFRfU09VUkNFID0gMjYxLAorICAgICBUX0NIT0lDRSA9IDI2MiwKKyAgICAgVF9FTkRDSE9JQ0UgPSAyNjMsCisgICAgIFRfQ09NTUVOVCA9IDI2NCwKKyAgICAgVF9DT05GSUcgPSAyNjUsCisgICAgIFRfTUVOVUNPTkZJRyA9IDI2NiwKKyAgICAgVF9IRUxQID0gMjY3LAorICAgICBUX0hFTFBURVhUID0gMjY4LAorICAgICBUX0lGID0gMjY5LAorICAgICBUX0VORElGID0gMjcwLAorICAgICBUX0RFUEVORFMgPSAyNzEsCisgICAgIFRfUkVRVUlSRVMgPSAyNzIsCisgICAgIFRfT1BUSU9OQUwgPSAyNzMsCisgICAgIFRfUFJPTVBUID0gMjc0LAorICAgICBUX1RZUEUgPSAyNzUsCisgICAgIFRfREVGQVVMVCA9IDI3NiwKKyAgICAgVF9TRUxFQ1QgPSAyNzcsCisgICAgIFRfUkFOR0UgPSAyNzgsCisgICAgIFRfT1BUSU9OID0gMjc5LAorICAgICBUX09OID0gMjgwLAorICAgICBUX1dPUkQgPSAyODEsCisgICAgIFRfV09SRF9RVU9URSA9IDI4MiwKKyAgICAgVF9VTkVRVUFMID0gMjgzLAorICAgICBUX0NMT1NFX1BBUkVOID0gMjg0LAorICAgICBUX09QRU5fUEFSRU4gPSAyODUsCisgICAgIFRfRU9MID0gMjg2LAorICAgICBUX09SID0gMjg3LAorICAgICBUX0FORCA9IDI4OCwKKyAgICAgVF9FUVVBTCA9IDI4OSwKKyAgICAgVF9OT1QgPSAyOTAKKyAgIH07CisjZW5kaWYKKy8qIFRva2Vucy4gICovCisjZGVmaW5lIFRfTUFJTk1FTlUgMjU4CisjZGVmaW5lIFRfTUVOVSAyNTkKKyNkZWZpbmUgVF9FTkRNRU5VIDI2MAorI2RlZmluZSBUX1NPVVJDRSAyNjEKKyNkZWZpbmUgVF9DSE9JQ0UgMjYyCisjZGVmaW5lIFRfRU5EQ0hPSUNFIDI2MworI2RlZmluZSBUX0NPTU1FTlQgMjY0CisjZGVmaW5lIFRfQ09ORklHIDI2NQorI2RlZmluZSBUX01FTlVDT05GSUcgMjY2CisjZGVmaW5lIFRfSEVMUCAyNjcKKyNkZWZpbmUgVF9IRUxQVEVYVCAyNjgKKyNkZWZpbmUgVF9JRiAyNjkKKyNkZWZpbmUgVF9FTkRJRiAyNzAKKyNkZWZpbmUgVF9ERVBFTkRTIDI3MQorI2RlZmluZSBUX1JFUVVJUkVTIDI3MgorI2RlZmluZSBUX09QVElPTkFMIDI3MworI2RlZmluZSBUX1BST01QVCAyNzQKKyNkZWZpbmUgVF9UWVBFIDI3NQorI2RlZmluZSBUX0RFRkFVTFQgMjc2CisjZGVmaW5lIFRfU0VMRUNUIDI3NworI2RlZmluZSBUX1JBTkdFIDI3OAorI2RlZmluZSBUX09QVElPTiAyNzkKKyNkZWZpbmUgVF9PTiAyODAKKyNkZWZpbmUgVF9XT1JEIDI4MQorI2RlZmluZSBUX1dPUkRfUVVPVEUgMjgyCisjZGVmaW5lIFRfVU5FUVVBTCAyODMKKyNkZWZpbmUgVF9DTE9TRV9QQVJFTiAyODQKKyNkZWZpbmUgVF9PUEVOX1BBUkVOIDI4NQorI2RlZmluZSBUX0VPTCAyODYKKyNkZWZpbmUgVF9PUiAyODcKKyNkZWZpbmUgVF9BTkQgMjg4CisjZGVmaW5lIFRfRVFVQUwgMjg5CisjZGVmaW5lIFRfTk9UIDI5MAorCisKKworCisvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNpbmNsdWRlICJ6Y29uZi5oYXNoLmMiCisKKyNkZWZpbmUgcHJpbnRkKG1hc2ssIGZtdC4uLikgaWYgKGNkZWJ1ZyAmIChtYXNrKSkgcHJpbnRmKGZtdCkKKworI2RlZmluZSBQUklOVEQJCTB4MDAwMQorI2RlZmluZSBERUJVR19QQVJTRQkweDAwMDIKKworaW50IGNkZWJ1ZyA9IFBSSU5URDsKKworZXh0ZXJuIGludCB6Y29uZmxleCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pOworc3RhdGljIHZvaWQgemNvbmZfZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pOworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpOworc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oc3RydWN0IGtjb25mX2lkICppZCwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbik7CisKK3N0cnVjdCBzeW1ib2wgKnN5bWJvbF9oYXNoWzI1N107CisKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51LCAqY3VycmVudF9lbnRyeTsKKworI2RlZmluZSBZWURFQlVHIDAKKyNpZiBZWURFQlVHCisjZGVmaW5lIFlZRVJST1JfVkVSQk9TRQorI2VuZGlmCisKKworLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAwCisjZW5kaWYKKworLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisjIHVuZGVmIFlZRVJST1JfVkVSQk9TRQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKyNlbHNlCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAorI2VuZGlmCisKKy8qIEVuYWJsaW5nIHRoZSB0b2tlbiB0YWJsZS4gICovCisjaWZuZGVmIFlZVE9LRU5fVEFCTEUKKyMgZGVmaW5lIFlZVE9LRU5fVEFCTEUgMAorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKFlZU1RZUEUpICYmICEgZGVmaW5lZCAoWVlTVFlQRV9JU19ERUNMQVJFRCkKKwordHlwZWRlZiB1bmlvbiBZWVNUWVBFIHsKKwljaGFyICpzdHJpbmc7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBrY29uZl9pZCAqaWQ7Cit9IFlZU1RZUEU7CisvKiBMaW5lIDE5NiBvZiB5YWNjLmMuICAqLworCisjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCisjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKworCisKKy8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKiBMaW5lIDIxOSBvZiB5YWNjLmMuICAqLworCisKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChfX1NJWkVfVFlQRV9fKQorIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoc2l6ZV90KQorIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiAoZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSkKKyMgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZm5kZWYgWVlfCisjIGlmIFlZRU5BQkxFX05MUworIyAgaWYgRU5BQkxFX05MUworIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIFlZXworIyAgZGVmaW5lIFlZXyhtc2dpZCkgbXNnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWZkZWYgX19HTlVDX18KKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgICAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgICBkZWZpbmUgWVlJTkNMVURFRF9TVERMSUJfSAorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIFlZU1RBQ0tfQUxMT0MKKyAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gKi8KKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlICgwKQorIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQorICAgIC8qIFRoZSBPUyBtaWdodCBndWFyYW50ZWUgb25seSBvbmUgZ3VhcmQgcGFnZSBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKyAgICAgICBhbmQgYSBwYWdlIHNpemUgY2FuIGJlIGFzIHNtYWxsIGFzIDQwOTYgYnl0ZXMuICBTbyB3ZSBjYW5ub3Qgc2FmZWx5CisgICAgICAgaW52b2tlIGFsbG9jYSAoTikgaWYgTiBleGNlZWRzIDQwOTYuICBVc2UgYSBzbGlnaHRseSBzbWFsbGVyIG51bWJlcgorICAgICAgIHRvIGFsbG93IGZvciBhIGZldyBjb21waWxlci1hbGxvY2F0ZWQgdGVtcG9yYXJ5IHN0YWNrIHNsb3RzLiAgKi8KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIDQwMzIgLyogcmVhc29uYWJsZSBjaXJjYSAyMDA1ICovCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNICgoWVlTSVpFX1QpIC0xKQorIyAgZW5kaWYKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyMgIGVuZGlmCisjICBpZm5kZWYgWVlNQUxMT0MKKyMgICBkZWZpbmUgWVlNQUxMT0MgbWFsbG9jCisjICAgaWYgKCEgZGVmaW5lZCAobWFsbG9jKSAmJiAhIGRlZmluZWQgKFlZSU5DTFVERURfU1RETElCX0gpIFwKKwkmJiAoZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSkpCit2b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIFlZRlJFRQorIyAgIGRlZmluZSBZWUZSRUUgZnJlZQorIyAgIGlmICghIGRlZmluZWQgKGZyZWUpICYmICEgZGVmaW5lZCAoWVlJTkNMVURFRF9TVERMSUJfSCkgXAorCSYmIChkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpKSkKK3ZvaWQgZnJlZSAodm9pZCAqKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX19jcGx1c3BsdXMKK30KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UgKi8KKworCisjaWYgKCEgZGVmaW5lZCAoeXlvdmVyZmxvdykgXAorICAgICAmJiAoISBkZWZpbmVkIChfX2NwbHVzcGx1cykgXAorCSB8fCAoZGVmaW5lZCAoWVlTVFlQRV9JU19UUklWSUFMKSAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKworLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCit1bmlvbiB5eWFsbG9jCit7CisgIHNob3J0IGludCB5eXNzOworICBZWVNUWVBFIHl5dnM7CisgIH07CisKKy8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCisjIGRlZmluZSBZWVNUQUNLX0dBUF9NQVhJTVVNIChzaXplb2YgKHVuaW9uIHl5YWxsb2MpIC0gMSkKKworLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCisgICBOIGVsZW1lbnRzLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAorICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQgaW50KSArIHNpemVvZiAoWVlTVFlQRSkpCQkJXAorICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQorCisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIDEgPCBfX0dOVUNfXworIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCisgICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCisjICBlbHNlCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCisgICAgICBkbwkJCQkJXAorCXsJCQkJCVwKKwkgIFlZU0laRV9UIHl5aTsJCQkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFjaywgU3RhY2ssIHl5c2l6ZSk7CQkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2s7CQkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlICgwKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgeXlzaWduZWRfY2hhcjsKKyNlbHNlCisgICB0eXBlZGVmIHNob3J0IGludCB5eXNpZ25lZF9jaGFyOworI2VuZGlmCisKKy8qIFlZRklOQUwgLS0gU3RhdGUgbnVtYmVyIG9mIHRoZSB0ZXJtaW5hdGlvbiBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlGSU5BTCAgMworLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCisjZGVmaW5lIFlZTEFTVCAgIDI3NQorCisvKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gKi8KKyNkZWZpbmUgWVlOVE9LRU5TICAzNgorLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICovCisjZGVmaW5lIFlZTk5UUyAgNDUKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gKi8KKyNkZWZpbmUgWVlOUlVMRVMgIDExMAorLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHN0YXRlcy4gKi8KKyNkZWZpbmUgWVlOU1RBVEVTICAxODMKKworLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCisjZGVmaW5lIFlZVU5ERUZUT0sgIDIKKyNkZWZpbmUgWVlNQVhVVE9LICAgMjkwCisKKyNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKKyAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQorCisvKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwKKyAgICAgIDM1Cit9OworCisjaWYgWVlERUJVRworLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCisgICBZWVJIUy4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IHl5cHJoc1tdID0KK3sKKyAgICAgICAwLCAgICAgMCwgICAgIDMsICAgICA1LCAgICAgNiwgICAgIDksICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDIzLAorICAgICAgMjgsICAgIDMzLCAgICAzNywgICAgMzksICAgIDQxLCAgICA0MywgICAgNDUsICAgIDQ3LCAgICA0OSwgICAgNTEsCisgICAgICA1MywgICAgNTUsICAgIDU3LCAgICA1OSwgICAgNjEsICAgIDYzLCAgICA2NywgICAgNzAsICAgIDc0LCAgICA3NywKKyAgICAgIDgxLCAgICA4NCwgICAgODUsICAgIDg4LCAgICA5MSwgICAgOTQsICAgIDk3LCAgIDEwMCwgICAxMDMsICAgMTA3LAorICAgICAxMTIsICAgMTE3LCAgIDEyMiwgICAxMjgsICAgMTMyLCAgIDEzMywgICAxMzcsICAgMTM4LCAgIDE0MSwgICAxNDQsCisgICAgIDE0NywgICAxNDksICAgMTUzLCAgIDE1NCwgICAxNTcsICAgMTYwLCAgIDE2MywgICAxNjYsICAgMTY5LCAgIDE3NCwKKyAgICAgMTc4LCAgIDE4MSwgICAxODYsICAgMTg3LCAgIDE5MCwgICAxOTQsICAgMTk2LCAgIDIwMCwgICAyMDEsICAgMjA0LAorICAgICAyMDcsICAgMjEwLCAgIDIxNCwgICAyMTcsICAgMjE5LCAgIDIyMywgICAyMjQsICAgMjI3LCAgIDIzMCwgICAyMzMsCisgICAgIDIzNywgICAyNDEsICAgMjQ0LCAgIDI0NywgICAyNTAsICAgMjUxLCAgIDI1NCwgICAyNTcsICAgMjYwLCAgIDI2NSwKKyAgICAgMjY5LCAgIDI3MywgICAyNzQsICAgMjc3LCAgIDI3OSwgICAyODEsICAgMjg0LCAgIDI4NywgICAyOTAsICAgMjkyLAorICAgICAyOTUsICAgMjk2LCAgIDI5OSwgICAzMDEsICAgMzA1LCAgIDMwOSwgICAzMTMsICAgMzE2LCAgIDMyMCwgICAzMjQsCisgICAgIDMyNgorfTsKKworLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAqLworc3RhdGljIGNvbnN0IHl5c2lnbmVkX2NoYXIgeXlyaHNbXSA9Cit7CisgICAgICAzNywgICAgIDAsICAgIC0xLCAgICAzOCwgICAgLTEsICAgIC0xLCAgICAzOCwgICAgNDAsICAgIC0xLCAgICAzOCwKKyAgICAgIDU0LCAgICAtMSwgICAgMzgsICAgIDY1LCAgICAtMSwgICAgMzgsICAgICAzLCAgICA3NSwgICAgNzcsICAgIC0xLAorICAgICAgMzgsICAgIDc2LCAgICAtMSwgICAgMzgsICAgIDI2LCAgICAgMSwgICAgMzEsICAgIC0xLCAgICAzOCwgICAgMzksCisgICAgICAgMSwgICAgMzEsICAgIC0xLCAgICAzOCwgICAgIDEsICAgIDMxLCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOSwKKyAgICAgIC0xLCAgICAyMCwgICAgLTEsICAgIDIyLCAgICAtMSwgICAgMTgsICAgIC0xLCAgICAyMywgICAgLTEsICAgIDIxLAorICAgICAgLTEsICAgIDMxLCAgICAtMSwgICAgNjAsICAgIC0xLCAgICA2OSwgICAgLTEsICAgIDQzLCAgICAtMSwgICAgNDUsCisgICAgICAtMSwgICAgNjcsICAgIC0xLCAgICAyNiwgICAgIDEsICAgIDMxLCAgICAtMSwgICAgIDEsICAgIDMxLCAgICAtMSwKKyAgICAgIDEwLCAgICAyNiwgICAgMzEsICAgIC0xLCAgICA0MiwgICAgNDYsICAgIC0xLCAgICAxMSwgICAgMjYsICAgIDMxLAorICAgICAgLTEsICAgIDQ0LCAgICA0NiwgICAgLTEsICAgIC0xLCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0NiwgICAgNDgsCisgICAgICAtMSwgICAgNDYsICAgIDczLCAgICAtMSwgICAgNDYsICAgIDcxLCAgICAtMSwgICAgNDYsICAgIDQxLCAgICAtMSwKKyAgICAgIDQ2LCAgICAzMSwgICAgLTEsICAgIDIwLCAgICA3NCwgICAgMzEsICAgIC0xLCAgICAxOSwgICAgNzUsICAgIDc4LAorICAgICAgMzEsICAgIC0xLCAgICAyMSwgICAgNzksICAgIDc4LCAgICAzMSwgICAgLTEsICAgIDIyLCAgICAyNiwgICAgNzgsCisgICAgICAzMSwgICAgLTEsICAgIDIzLCAgICA4MCwgICAgODAsICAgIDc4LCAgICAzMSwgICAgLTEsICAgIDI0LCAgICA0OSwKKyAgICAgIDMxLCAgICAtMSwgICAgLTEsICAgIDQ5LCAgICAyNiwgICAgNTAsICAgIC0xLCAgICAtMSwgICAgMzQsICAgIDc1LAorICAgICAgLTEsICAgICA3LCAgICAzMSwgICAgLTEsICAgIDUxLCAgICA1NSwgICAgLTEsICAgIDc2LCAgICAtMSwgICAgNTIsCisgICAgICA1NywgICAgNTMsICAgIC0xLCAgICAtMSwgICAgNTUsICAgIDU2LCAgICAtMSwgICAgNTUsICAgIDczLCAgICAtMSwKKyAgICAgIDU1LCAgICA3MSwgICAgLTEsICAgIDU1LCAgICAzMSwgICAgLTEsICAgIDU1LCAgICA0MSwgICAgLTEsICAgIDE5LAorICAgICAgNzUsICAgIDc4LCAgICAzMSwgICAgLTEsICAgIDIwLCAgICA3NCwgICAgMzEsICAgIC0xLCAgICAxOCwgICAgMzEsCisgICAgICAtMSwgICAgMjEsICAgIDI2LCAgICA3OCwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgNTcsICAgIDQwLCAgICAtMSwKKyAgICAgIDE0LCAgICA3OSwgICAgNzcsICAgIC0xLCAgICA3NiwgICAgLTEsICAgIDU4LCAgICA2MSwgICAgNTksICAgIC0xLAorICAgICAgLTEsICAgIDYxLCAgICA0MCwgICAgLTEsICAgIDYxLCAgICA2NSwgICAgLTEsICAgIDYxLCAgICA1NCwgICAgLTEsCisgICAgICAgNCwgICAgNzUsICAgIDMxLCAgICAtMSwgICAgNjIsICAgIDcyLCAgICAtMSwgICAgNzYsICAgIC0xLCAgICA2MywKKyAgICAgIDY2LCAgICA2NCwgICAgLTEsICAgIC0xLCAgICA2NiwgICAgNDAsICAgIC0xLCAgICA2NiwgICAgNjUsICAgIC0xLAorICAgICAgNjYsICAgIDU0LCAgICAtMSwgICAgIDYsICAgIDc1LCAgICAzMSwgICAgLTEsICAgICA5LCAgICA3NSwgICAgMzEsCisgICAgICAtMSwgICAgNjgsICAgIDcyLCAgICAtMSwgICAgMTIsICAgIDMxLCAgICAtMSwgICAgNzAsICAgIDEzLCAgICAtMSwKKyAgICAgIC0xLCAgICA3MiwgICAgNzMsICAgIC0xLCAgICA3MiwgICAgMzEsICAgIC0xLCAgICA3MiwgICAgNDEsICAgIC0xLAorICAgICAgMTYsICAgIDI1LCAgICA3OSwgICAgMzEsICAgIC0xLCAgICAxNiwgICAgNzksICAgIDMxLCAgICAtMSwgICAgMTcsCisgICAgICA3OSwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgNzUsICAgIDc4LCAgICAtMSwgICAgMjYsICAgIC0xLCAgICAyNywKKyAgICAgIC0xLCAgICAgNSwgICAgMzEsICAgIC0xLCAgICAgOCwgICAgMzEsICAgIC0xLCAgICAxNSwgICAgMzEsICAgIC0xLAorICAgICAgMzEsICAgIC0xLCAgICA3NywgICAgMzEsICAgIC0xLCAgICAtMSwgICAgMTQsICAgIDc5LCAgICAtMSwgICAgODAsCisgICAgICAtMSwgICAgODAsICAgIDM0LCAgICA4MCwgICAgLTEsICAgIDgwLCAgICAyOCwgICAgODAsICAgIC0xLCAgICAzMCwKKyAgICAgIDc5LCAgICAyOSwgICAgLTEsICAgIDM1LCAgICA3OSwgICAgLTEsICAgIDc5LCAgICAzMiwgICAgNzksICAgIC0xLAorICAgICAgNzksICAgIDMzLCAgICA3OSwgICAgLTEsICAgIDI2LCAgICAtMSwgICAgMjcsICAgIC0xCit9OworCisvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgeXlybGluZVtdID0KK3sKKyAgICAgICAwLCAgIDEwNSwgICAxMDUsICAgMTA3LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LAorICAgICAxMTUsICAgMTE5LCAgIDEyMywgICAxMjMsICAgMTIzLCAgIDEyMywgICAxMjMsICAgMTIzLCAgIDEyMywgICAxMjcsCisgICAgIDEyOCwgICAxMjksICAgMTMwLCAgIDEzMSwgICAxMzIsICAgMTM2LCAgIDEzNywgICAxNDMsICAgMTUxLCAgIDE1NywKKyAgICAgMTY1LCAgIDE3NSwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODAsICAgMTgxLCAgIDE4MiwgICAxODUsICAgMTkzLAorICAgICAxOTksICAgMjA5LCAgIDIxNSwgICAyMjEsICAgMjI0LCAgIDIyNiwgICAyMzcsICAgMjM4LCAgIDI0MywgICAyNTIsCisgICAgIDI1NywgICAyNjUsICAgMjY4LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsICAgMjc3LCAgIDI4MywKKyAgICAgMjk0LCAgIDMwMCwgICAzMTAsICAgMzEyLCAgIDMxNywgICAzMjUsICAgMzMzLCAgIDMzNiwgICAzMzgsICAgMzM5LAorICAgICAzNDAsICAgMzQ1LCAgIDM1MiwgICAzNTcsICAgMzY1LCAgIDM2OCwgICAzNzAsICAgMzcxLCAgIDM3MiwgICAzNzUsCisgICAgIDM4MywgICAzOTAsICAgMzk3LCAgIDQwMywgICA0MTAsICAgNDEyLCAgIDQxMywgICA0MTQsICAgNDE3LCAgIDQyMiwKKyAgICAgNDI3LCAgIDQzNSwgICA0MzcsICAgNDQyLCAgIDQ0MywgICA0NDYsICAgNDQ3LCAgIDQ0OCwgICA0NTIsICAgNDUzLAorICAgICA0NTYsICAgNDU3LCAgIDQ2MCwgICA0NjEsICAgNDYyLCAgIDQ2MywgICA0NjQsICAgNDY1LCAgIDQ2NiwgICA0NjksCisgICAgIDQ3MAorfTsKKyNlbmRpZgorCisjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgWVlUT0tFTl9UQUJMRQorLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCisgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KK3sKKyAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJUX01BSU5NRU5VIiwgIlRfTUVOVSIsICJUX0VORE1FTlUiLAorICAiVF9TT1VSQ0UiLCAiVF9DSE9JQ0UiLCAiVF9FTkRDSE9JQ0UiLCAiVF9DT01NRU5UIiwgIlRfQ09ORklHIiwKKyAgIlRfTUVOVUNPTkZJRyIsICJUX0hFTFAiLCAiVF9IRUxQVEVYVCIsICJUX0lGIiwgIlRfRU5ESUYiLCAiVF9ERVBFTkRTIiwKKyAgIlRfUkVRVUlSRVMiLCAiVF9PUFRJT05BTCIsICJUX1BST01QVCIsICJUX1RZUEUiLCAiVF9ERUZBVUxUIiwKKyAgIlRfU0VMRUNUIiwgIlRfUkFOR0UiLCAiVF9PUFRJT04iLCAiVF9PTiIsICJUX1dPUkQiLCAiVF9XT1JEX1FVT1RFIiwKKyAgIlRfVU5FUVVBTCIsICJUX0NMT1NFX1BBUkVOIiwgIlRfT1BFTl9QQVJFTiIsICJUX0VPTCIsICJUX09SIiwgIlRfQU5EIiwKKyAgIlRfRVFVQUwiLCAiVF9OT1QiLCAiJGFjY2VwdCIsICJpbnB1dCIsICJzdG10X2xpc3QiLCAib3B0aW9uX25hbWUiLAorICAiY29tbW9uX3N0bXQiLCAib3B0aW9uX2Vycm9yIiwgImNvbmZpZ19lbnRyeV9zdGFydCIsICJjb25maWdfc3RtdCIsCisgICJtZW51Y29uZmlnX2VudHJ5X3N0YXJ0IiwgIm1lbnVjb25maWdfc3RtdCIsICJjb25maWdfb3B0aW9uX2xpc3QiLAorICAiY29uZmlnX29wdGlvbiIsICJzeW1ib2xfb3B0aW9uIiwgInN5bWJvbF9vcHRpb25fbGlzdCIsCisgICJzeW1ib2xfb3B0aW9uX2FyZyIsICJjaG9pY2UiLCAiY2hvaWNlX2VudHJ5IiwgImNob2ljZV9lbmQiLAorICAiY2hvaWNlX3N0bXQiLCAiY2hvaWNlX29wdGlvbl9saXN0IiwgImNob2ljZV9vcHRpb24iLCAiY2hvaWNlX2Jsb2NrIiwKKyAgImlmX2VudHJ5IiwgImlmX2VuZCIsICJpZl9zdG10IiwgImlmX2Jsb2NrIiwgIm1lbnUiLCAibWVudV9lbnRyeSIsCisgICJtZW51X2VuZCIsICJtZW51X3N0bXQiLCAibWVudV9ibG9jayIsICJzb3VyY2Vfc3RtdCIsICJjb21tZW50IiwKKyAgImNvbW1lbnRfc3RtdCIsICJoZWxwX3N0YXJ0IiwgImhlbHAiLCAiZGVwZW5kc19saXN0IiwgImRlcGVuZHMiLAorICAicHJvbXB0X3N0bXRfb3B0IiwgInByb21wdCIsICJlbmQiLCAibmwiLCAiaWZfZXhwciIsICJleHByIiwgInN5bWJvbCIsIDAKK307CisjZW5kaWYKKworIyBpZmRlZiBZWVBSSU5UCisvKiBZWVRPS05VTVtZWUxFWC1OVU1dIC0tIEludGVybmFsIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvCisgICB0b2tlbiBZWUxFWC1OVU0uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXRva251bVtdID0KK3sKKyAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLCAgIDI2MiwgICAyNjMsICAgMjY0LAorICAgICAyNjUsICAgMjY2LCAgIDI2NywgICAyNjgsICAgMjY5LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsCisgICAgIDI3NSwgICAyNzYsICAgMjc3LCAgIDI3OCwgICAyNzksICAgMjgwLCAgIDI4MSwgICAyODIsICAgMjgzLCAgIDI4NCwKKyAgICAgMjg1LCAgIDI4NiwgICAyODcsICAgMjg4LCAgIDI4OSwgICAyOTAKK307CisjIGVuZGlmCisKKy8qIFlZUjFbWVlOXSAtLSBTeW1ib2wgbnVtYmVyIG9mIHN5bWJvbCB0aGF0IHJ1bGUgWVlOIGRlcml2ZXMuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlyMVtdID0KK3sKKyAgICAgICAwLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LAorICAgICAgMzgsICAgIDM4LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsCisgICAgICA0MCwgICAgNDAsICAgIDQwLCAgICA0MCwgICAgNDAsICAgIDQxLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKKyAgICAgIDQ1LCAgICA0NiwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAgNDcsICAgIDQ3LAorICAgICAgNDcsICAgIDQ3LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA0OSwgICAgNTAsICAgIDUwLCAgICA1MSwgICAgNTIsCisgICAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NSwgICAgNTUsICAgIDU1LCAgICA1NSwgICAgNTUsICAgIDU2LCAgICA1NiwKKyAgICAgIDU2LCAgICA1NiwgICAgNTcsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjEsICAgIDYxLAorICAgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjcsCisgICAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDczLCAgICA3MywKKyAgICAgIDczLCAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc2LCAgICA3NiwgICAgNzcsICAgIDc3LAorICAgICAgNzgsICAgIDc4LCAgICA3OSwgICAgNzksICAgIDc5LCAgICA3OSwgICAgNzksICAgIDc5LCAgICA3OSwgICAgODAsCisgICAgICA4MAorfTsKKworLyogWVlSMltZWU5dIC0tIE51bWJlciBvZiBzeW1ib2xzIGNvbXBvc2luZyByaWdodCBoYW5kIHNpZGUgb2YgcnVsZSBZWU4uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlyMltdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDEsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDIsICAgICA0LAorICAgICAgIDQsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMywKKyAgICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICA0LAorICAgICAgIDQsICAgICA0LCAgICAgNSwgICAgIDMsICAgICAwLCAgICAgMywgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMSwgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMywKKyAgICAgICAyLCAgICAgNCwgICAgIDAsICAgICAyLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsCisgICAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMywKKyAgICAgICAzLCAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLAorICAgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMywgICAgIDEsCisgICAgICAgMQorfTsKKworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCisgICBTVEFURS1OVU0gd2hlbiBZWVRBQkxFIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8KKyAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5ZGVmYWN0W10gPQoreworICAgICAgIDMsICAgICAwLCAgICAgMCwgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMiwgICAgMTYsICAgIDEzLCAgICAxNCwKKyAgICAgIDE4LCAgICAxNSwgICAgMTcsICAgICAwLCAgICAxOSwgICAgIDAsICAgICA0LCAgICAzMSwgICAgMjIsICAgIDMxLAorICAgICAgMjMsICAgIDUyLCAgICA2MiwgICAgIDUsICAgIDY3LCAgICAyMCwgICAgODQsICAgIDc1LCAgICAgNiwgICAgMjQsCisgICAgICA4NCwgICAgMjEsICAgICA4LCAgICAxMSwgICAgOTMsICAgIDk0LCAgICAgMCwgICAgIDAsICAgIDk1LCAgICAgMCwKKyAgICAgIDQ4LCAgICA5NiwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMDksICAgMTEwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAxMDIsICAgIDk3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDk4LCAgICAgNywgICAgNzEsICAgIDc5LCAgICA4MCwgICAgMjcsICAgIDI5LCAgICAgMCwKKyAgICAgMTA2LCAgICAgMCwgICAgIDAsICAgIDY0LCAgICAgMCwgICAgIDAsICAgICA5LCAgICAxMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTEsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ0LCAgICAgMCwgICAgMzcsCisgICAgICAzNiwgICAgMzIsICAgIDMzLCAgICAgMCwgICAgMzUsICAgIDM0LCAgICAgMCwgICAgIDAsICAgIDkxLCAgICAgMCwKKyAgICAgIDU2LCAgICA1NywgICAgNTMsICAgIDU1LCAgICA1NCwgICAgNjMsICAgIDUxLCAgICA1MCwgICAgNjgsICAgIDcwLAorICAgICAgNjYsICAgIDY5LCAgICA2NSwgICAgODYsICAgIDg3LCAgICA4NSwgICAgNzYsICAgIDc4LCAgICA3NCwgICAgNzcsCisgICAgICA3MywgICAgOTksICAgMTA1LCAgIDEwNywgICAxMDgsICAgMTA0LCAgIDEwMywgICAgMjYsICAgIDgyLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAxMDAsICAgICAwLCAgIDEwMCwgICAxMDAsICAgMTAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgODMsICAgIDYwLCAgIDEwMCwgICAgIDAsICAgMTAwLCAgICAgMCwgICAgODksICAgIDkwLCAgICAgMCwgICAgIDAsCisgICAgICAzOCwgICAgOTIsICAgICAwLCAgICAgMCwgICAxMDAsICAgIDQ2LCAgICA0MywgICAgMjUsICAgICAwLCAgICA1OSwKKyAgICAgICAwLCAgICA4OCwgICAxMDEsICAgIDM5LCAgICA0MCwgICAgNDEsICAgICAwLCAgICAgMCwgICAgNDUsICAgIDU4LAorICAgICAgNjEsICAgIDQyLCAgICA0NworfTsKKworLyogWVlERUZHT1RPW05URVJNLU5VTV0uICovCitzdGF0aWMgY29uc3Qgc2hvcnQgaW50IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIC0xLCAgICAgMSwgICAgIDIsICAgIDI1LCAgICAyNiwgICAxMDAsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAorICAgICAgNjQsICAgMTAxLCAgIDEwMiwgICAxNDgsICAgMTc4LCAgICAzMSwgICAgMzIsICAgMTE2LCAgICAzMywgICAgNjYsCisgICAgIDExMiwgICAgNjcsICAgIDM0LCAgIDEyMCwgICAgMzUsICAgIDY4LCAgICAzNiwgICAgMzcsICAgMTI4LCAgICAzOCwKKyAgICAgIDcwLCAgICAzOSwgICAgNDAsICAgIDQxLCAgIDEwMywgICAxMDQsICAgIDY5LCAgIDEwNSwgICAxNDMsICAgMTQ0LAorICAgICAgNDIsICAgIDczLCAgIDE1OSwgICAgNTksICAgIDYwCit9OworCisvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKKyAgIFNUQVRFLU5VTS4gICovCisjZGVmaW5lIFlZUEFDVF9OSU5GIC0xMzUKK3N0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwYWN0W10gPQoreworICAgIC0xMzUsICAgICAyLCAgIDE3MCwgIC0xMzUsICAgLTE0LCAgICA1NiwgICAgNTYsICAgIC04LCAgICA1NiwgICAgMjQsCisgICAgICA2NywgICAgNTYsICAgICA3LCAgICAxNCwgICAgNjIsICAgIDk3LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMTU2LCAgLTEzNSwgICAxNjYsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDEzOCwgICAxNTEsICAtMTM1LCAgIDE1MiwKKyAgICAtMTM1LCAgLTEzNSwgICAxNjMsICAgMTY3LCAgIDE3NiwgIC0xMzUsICAtMTM1LCAgICA2MiwgICAgNjIsICAgMTg1LAorICAgICAtMTksICAtMTM1LCAgIDE4OCwgICAxOTAsICAgIDQyLCAgIDEwMywgICAxOTQsICAgIDg1LCAgICA3MCwgICAyMjIsCisgICAgICA3MCwgICAxMzIsICAtMTM1LCAgIDE5MSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDEyNywKKyAgICAtMTM1LCAgICA2MiwgICAgNjIsICAgMTkxLCAgIDEwNCwgICAxMDQsICAtMTM1LCAgLTEzNSwgICAxOTMsICAgMjAzLAorICAgICAgIDksICAgIDYyLCAgICA1NiwgICAgNTYsICAgIDYyLCAgIDE2MSwgICAxMDQsICAtMTM1LCAgIDE5NiwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDIzMywgIC0xMzUsICAtMTM1LCAgIDIwNCwgICAgNTYsICAgIDU2LCAgIDIyMSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDIxOSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICA2MiwKKyAgICAgMjA5LCAgIDIxMiwgICAyNDAsICAgMjI0LCAgIDI0MCwgICAgLTEsICAgMjQwLCAgIDEwNCwgICAgNDEsICAgMjI1LAorICAgIC0xMzUsICAtMTM1LCAgIDI0MCwgICAyMjYsICAgMjQwLCAgIDIxOCwgIC0xMzUsICAtMTM1LCAgICA2MiwgICAyMjcsCisgICAgLTEzNSwgIC0xMzUsICAgMjI4LCAgIDIyOSwgICAyNDAsICAgMjMwLCAgLTEzNSwgIC0xMzUsICAgMjMxLCAgLTEzNSwKKyAgICAgMjMyLCAgLTEzNSwgICAxMTIsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMjM0LCAgICA1NiwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNQorfTsKKworLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwZ290b1tdID0KK3sKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICA5NCwgICAtNDUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgICAyMzcsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIC01NCwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICAgMSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAxOTUsICAgMjM1LCAgIC00NCwgICAxNTksICAgIC01LAorICAgICAgOTgsICAgMjEwLCAgLTEzNCwgICAtNTMsICAgLTc3Cit9OworCisvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKKyAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAorICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KKyAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC04Mgorc3RhdGljIGNvbnN0IHNob3J0IGludCB5eXRhYmxlW10gPQoreworICAgICAgNDYsICAgIDQ3LCAgICAgMywgICAgNDksICAgIDc5LCAgICA4MCwgICAgNTIsICAgMTM1LCAgIDEzNiwgICAgODQsCisgICAgIDE2MSwgICAxNjIsICAgMTYzLCAgIDE1OCwgICAxMTksICAgIDg1LCAgIDEyNywgICAgNDMsICAgMTY4LCAgIDE0NywKKyAgICAgMTcwLCAgIDExMSwgICAxMTQsICAgIDQ4LCAgIDEyNCwgICAxMjUsICAgMTI0LCAgIDEyNSwgICAxMzMsICAgMTM0LAorICAgICAxNzYsICAgIDgxLCAgICA4MiwgICAgNTMsICAgMTM5LCAgICA1NSwgICAgNTYsICAgMTQwLCAgIDE0MSwgICAgNTcsCisgICAgICA1NCwgICAxNDUsICAgLTI4LCAgICA4OCwgICAgNTgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwKKyAgICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgICA4OSwgICAgNTAsICAgLTI4LCAgIC0yOCwgICAgOTAsICAgIDkxLAorICAgICAtMjgsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgMTY1LCAgICA5OCwgICAxMjEsCisgICAgIDE2NCwgICAxMjksICAgMTY2LCAgICA5OSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgNDQsICAgIDQ1LCAgICAxNCwgICAgMTUsICAgMTU1LCAgIDE0MiwgICAgNTUsICAgIDU2LAorICAgICAgIDcsICAgICA4LCAgICA1NywgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDU4LCAgICA1MSwgICAgMTQsCisgICAgICAxNSwgICAgMjQsICAgMTUyLCAgIC0zMCwgICAgODgsICAgMTcyLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwKKyAgICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwgICAgODksICAgIDI0LCAgIC0zMCwgICAtMzAsICAgIDkwLAorICAgICAgOTEsICAgLTMwLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA2MSwgICAgOTgsCisgICAgICA1NSwgICAgNTYsICAgLTgxLCAgICA4OCwgICAgOTksICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgIC04MSwKKyAgICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgICA4MSwgICAgODIsICAgLTgxLCAgIC04MSwgICAgOTAsICAgIDkxLAorICAgICAtODEsICAgLTgxLCAgIC04MSwgICAtODEsICAgLTgxLCAgIC04MSwgICAxMzIsICAgIDYyLCAgICA5OCwgICAgODEsCisgICAgICA4MiwgICAxMTUsICAgMTE4LCAgIDEyMywgICAxMjYsICAgMTE3LCAgIDEyMiwgICAgNjMsICAgMTMwLCAgICA3MiwKKyAgICAgIC0yLCAgICAgNCwgICAxODIsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgICAgMTIsICAgIDEzLCAgICA3NCwgICAgNzUsICAgIDE0LCAgICAxNSwgICAgMTYsICAgMTQ2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgNzYsICAgIDg4LCAgICAyMywgICAxNDksICAgIDc3LCAgIC00OSwKKyAgICAgLTQ5LCAgICAyNCwgICAtNDksICAgLTQ5LCAgIC00OSwgICAtNDksICAgIDg5LCAgICA3OCwgICAtNDksICAgLTQ5LAorICAgICAgOTAsICAgIDkxLCAgIDEwNiwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAgNzIsICAgIDgxLCAgICA4MiwgICAgODYsCisgICAgICA5OCwgICAgODcsICAgMTMxLCAgICA4OCwgICAxMzcsICAgMTEwLCAgIC03MiwgICAtNzIsICAgLTcyLCAgIC03MiwKKyAgICAgLTcyLCAgIC03MiwgICAtNzIsICAgLTcyLCAgIDEzOCwgICAxNTEsICAgLTcyLCAgIC03MiwgICAgOTAsICAgIDkxLAorICAgICAxNTYsICAgIDgxLCAgICA4MiwgICAxNTcsICAgIDgxLCAgICA4MiwgICAxNTAsICAgMTU0LCAgICA5OCwgICAxNzEsCisgICAgICA4MSwgICAgODIsICAgIDgyLCAgIDEyMywgICAxNTgsICAgMTYwLCAgIDE2NywgICAxNjksICAgMTczLCAgIDE3NCwKKyAgICAgMTc1LCAgIDExMywgICAxNzksICAgMTgwLCAgIDE3NywgICAxODEsICAgIDY1LCAgIDE1MywgICAgIDAsICAgIDgzLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA3MQorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWNoZWNrW10gPQoreworICAgICAgIDUsICAgICA2LCAgICAgMCwgICAgIDgsICAgIDU3LCAgICA1OCwgICAgMTEsICAgIDg0LCAgICA4NSwgICAgMjgsCisgICAgIDE0NCwgICAxNDUsICAgMTQ2LCAgICAxNCwgICAgNjgsICAgIDM0LCAgICA3MCwgICAgMzEsICAgMTUyLCAgICA5NiwKKyAgICAgMTU0LCAgICA2NiwgICAgNjYsICAgIDMxLCAgICA2OSwgICAgNjksICAgIDcxLCAgICA3MSwgICAgODEsICAgIDgyLAorICAgICAxNjQsICAgIDMyLCAgICAzMywgICAgMjYsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDkwLCAgICA5MSwgICAgMzAsCisgICAgICAyNiwgICAgOTQsICAgICAwLCAgICAgMSwgICAgMzUsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI2LCAgICAyNiwgICAgNjgsCisgICAgIDE0NywgICAgNzAsICAgIDMxLCAgICAzMSwgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAgICAgIDEwLCAgICAxMSwgICAgMjYsICAgIDI3LCAgICAxNCwgICAgMTUsICAgMTM5LCAgICA5MiwgICAgMjYsICAgIDI3LAorICAgICAgIDUsICAgICA2LCAgICAzMCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDM1LCAgICAzMSwgICAgMTQsCisgICAgICAxNSwgICAgMzEsICAgMTA3LCAgICAgMCwgICAgIDEsICAgMTU4LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDMxLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAzMSwgICAgMjYsCisgICAgICAyNiwgICAgMjcsICAgICAwLCAgICAgMSwgICAgMzEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAzMiwgICAgMzMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjksICAgICAxLCAgICAyNiwgICAgMzIsCisgICAgICAzMywgICAgNjcsICAgIDY4LCAgICAzMSwgICAgNzAsICAgIDY3LCAgICA2OCwgICAgIDEsICAgIDcwLCAgICAzMSwKKyAgICAgICAwLCAgICAgMSwgICAxNzcsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgIDExLCAgICAzMSwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDI2LCAgICAxOCwgICAgMTksCisgICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMzEsICAgICAxLCAgICAyNiwgICAgIDEsICAgIDMxLCAgICAgNSwKKyAgICAgICA2LCAgICAzMSwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAzMSwgICAgMTQsICAgIDE1LAorICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzEsCisgICAgICAyNiwgICAgMzEsICAgIDMxLCAgICAgMSwgICAgMzEsICAgIDMxLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAzMSwgICAgMzEsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzEsICAgIDMyLCAgICAzMywgICAgMTMsICAgIDI2LCAgICAyNiwgICAgMzEsCisgICAgICAzMiwgICAgMzMsICAgIDMzLCAgICAzMSwgICAgMTQsICAgIDMxLCAgICAzMSwgICAgMzEsICAgIDMxLCAgICAzMSwKKyAgICAgIDMxLCAgICA2NiwgICAgMzEsICAgIDMxLCAgICAzNCwgICAgMzEsICAgIDI5LCAgIDEwOCwgICAgLTEsICAgIDU5LAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MAorfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlzdG9zW10gPQoreworICAgICAgIDAsICAgIDM3LCAgICAzOCwgICAgIDAsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsCisgICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTgsICAgIDE5LCAgICAyMCwKKyAgICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI2LCAgICAzMSwgICAgMzksICAgIDQwLCAgICA0MiwgICAgNDMsICAgIDQ0LAorICAgICAgNDUsICAgIDUxLCAgICA1MiwgICAgNTQsICAgIDU4LCAgICA2MCwgICAgNjIsICAgIDYzLCAgICA2NSwgICAgNjcsCisgICAgICA2OCwgICAgNjksICAgIDc2LCAgICAzMSwgICAgMjYsICAgIDI3LCAgICA3NSwgICAgNzUsICAgIDMxLCAgICA3NSwKKyAgICAgIDMxLCAgICAzMSwgICAgNzUsICAgIDI2LCAgICAyNiwgICAgMjYsICAgIDI3LCAgICAzMCwgICAgMzUsICAgIDc5LAorICAgICAgODAsICAgIDMxLCAgICAgMSwgICAgIDEsICAgIDQ2LCAgICA0NiwgICAgNTUsICAgIDU3LCAgICA2MSwgICAgNzIsCisgICAgICA2NiwgICAgNzIsICAgIDMxLCAgICA3NywgICAgMzEsICAgIDMxLCAgICAzMSwgICAgMzEsICAgIDMxLCAgICA3OSwKKyAgICAgIDc5LCAgICAzMiwgICAgMzMsICAgIDc3LCAgICAyOCwgICAgMzQsICAgIDMxLCAgICAzMSwgICAgIDEsICAgIDEyLAorICAgICAgMTYsICAgIDE3LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNiwgICAgMzEsCisgICAgICA0MSwgICAgNDcsICAgIDQ4LCAgICA3MCwgICAgNzEsICAgIDczLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKKyAgICAgIDMxLCAgICA0MSwgICAgNTYsICAgIDcxLCAgICA3MywgICAgNDAsICAgIDUzLCAgICA3NiwgICAgNDAsICAgIDU0LAorICAgICAgNTksICAgIDY1LCAgICA3NiwgICAgMzEsICAgIDQxLCAgICA3MywgICAgNDAsICAgIDU0LCAgICA2NCwgICAgNjUsCisgICAgICA3NiwgICAgMzEsICAgIDI5LCAgICA3OSwgICAgNzksICAgIDgwLCAgICA4MCwgICAgMzEsICAgIDMxLCAgICAyNSwKKyAgICAgIDc5LCAgICA3OSwgICAgNzUsICAgIDc0LCAgICA3NSwgICAgNzksICAgIDI2LCAgICA4MCwgICAgNDksICAgICAxLAorICAgICAgMTMsICAgIDMxLCAgICA3NSwgICAgNzQsICAgIDI2LCAgICA3OSwgICAgMzEsICAgIDMxLCAgICAxNCwgICAgNzgsCisgICAgICAzMSwgICAgNzgsICAgIDc4LCAgICA3OCwgICAgODAsICAgIDI2LCAgICAzMSwgICAgMzEsICAgIDc4LCAgICAzMSwKKyAgICAgIDc4LCAgICAzMSwgICAgNzksICAgIDMxLCAgICAzMSwgICAgMzEsICAgIDc4LCAgICAzNCwgICAgNTAsICAgIDMxLAorICAgICAgMzEsICAgIDMxLCAgICA3NQorfTsKKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCSgtMikKKyNkZWZpbmUgWVlFT0YJCTAKKworI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQJCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJyb3JsYWIKKworCisvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CisgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKworI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCitkbwkJCQkJCQkJXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHl5Y2hhciA9IChUb2tlbik7CQkJCQkJXAorICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKKyAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAorICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIikpOyBcCisgICAgICBZWUVSUk9SOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBTZXQgQ1VSUkVOVCB0byBzcGFuIGZyb20gUkhTWzFdIHRvIFJIU1tOXS4KKyAgIElmIE4gaXMgMCwgdGhlbiBzZXQgQ1VSUkVOVCB0byB0aGUgZW1wdHkgbG9jYXRpb24gd2hpY2ggZW5kcworICAgdGhlIHByZXZpb3VzIHN5bWJvbDogUkhTWzBdIChhbHdheXMgZGVmaW5lZCkuICAqLworCisjZGVmaW5lIFlZUkhTTE9DKFJocywgSykgKChSaHMpW0tdKQorI2lmbmRlZiBZWUxMT0NfREVGQVVMVAorIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICBpZiAoTikJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfbGluZTsJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2NvbHVtbjsJXAorCSAgKEN1cnJlbnQpLmxhc3RfbGluZSAgICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfbGluZTsJCVwKKwkgIChDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2NvbHVtbjsJXAorCX0JCQkJCQkJCVwKKyAgICAgIGVsc2UJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSAgID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKKwl9CQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBZWV9MT0NBVElPTl9QUklOVCAtLSBQcmludCB0aGUgbG9jYXRpb24gb24gdGhlIHN0cmVhbS4KKyAgIFRoaXMgbWFjcm8gd2FzIG5vdCBtYW5kYXRlZCBvcmlnaW5hbGx5OiBkZWZpbmUgb25seSBpZiB3ZSBrbm93CisgICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCisKKyNpZm5kZWYgWVlfTE9DQVRJT05fUFJJTlQKKyMgaWYgWVlMVFlQRV9JU19UUklWSUFMCisjICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKQkJCVwKKyAgICAgZnByaW50ZiAoRmlsZSwgIiVkLiVkLSVkLiVkIiwJCQlcCisgICAgICAgICAgICAgIChMb2MpLmZpcnN0X2xpbmUsIChMb2MpLmZpcnN0X2NvbHVtbiwJXAorICAgICAgICAgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKKyMgZWxzZQorIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCisKKyNpZmRlZiBZWUxFWF9QQVJBTQorIyBkZWZpbmUgWVlMRVggeXlsZXggKFlZTEVYX1BBUkFNKQorI2Vsc2UKKyMgZGVmaW5lIFlZTEVYIHl5bGV4ICgpCisjZW5kaWYKKworLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLworI2lmIFlZREVCVUcKKworIyBpZm5kZWYgWVlGUFJJTlRGCisjICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKKyMgZW5kaWYKKworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAorZG8gewkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQlcCisgICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKK30gd2hpbGUgKDApCisKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJXAorZG8gewkJCQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQlcCisgICAgICB5eXN5bXByaW50IChzdGRlcnIsCQkJCQlcCisgICAgICAgICAgICAgICAgICBUeXBlLCBWYWx1ZSk7CVwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlfc3RhY2tfcHJpbnQgLS0gUHJpbnQgdGhlIHN0YXRlIHN0YWNrIGZyb20gaXRzIEJPVFRPTSB1cCB0byBpdHMgfAorfCBUT1AgKGluY2x1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoc2hvcnQgaW50ICpib3R0b20sIHNob3J0IGludCAqdG9wKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoYm90dG9tLCB0b3ApCisgICAgc2hvcnQgaW50ICpib3R0b207CisgICAgc2hvcnQgaW50ICp0b3A7CisjZW5kaWYKK3sKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJTdGFjayBub3ciKTsKKyAgZm9yICgvKiBOb3RoaW5nLiAqLzsgYm90dG9tIDw9IHRvcDsgKytib3R0b20pCisgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCAqYm90dG9tKTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOworfQorCisjIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAorICAgIHl5X3N0YWNrX3ByaW50ICgoQm90dG9tKSwgKFRvcCkpOwkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBSZXBvcnQgdGhhdCB0aGUgWVlSVUxFIGlzIGdvaW5nIHRvIGJlIHJlZHVjZWQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eV9yZWR1Y2VfcHJpbnQgKGludCB5eXJ1bGUpCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoeXlydWxlKQorICAgIGludCB5eXJ1bGU7CisjZW5kaWYKK3sKKyAgaW50IHl5aTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgeXlsbm8gPSB5eXJsaW5lW3l5cnVsZV07CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAlbHUpLCAiLAorICAgICAgICAgICAgIHl5cnVsZSAtIDEsIHl5bG5vKTsKKyAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCisgIGZvciAoeXlpID0geXlwcmhzW3l5cnVsZV07IDAgPD0geXlyaHNbeXlpXTsgeXlpKyspCisgICAgWVlGUFJJTlRGIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW3l5aV1dKTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICItPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5cnVsZV1dKTsKK30KKworIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCitkbyB7CQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQlcCisgICAgeXlfcmVkdWNlX3ByaW50IChSdWxlKTsJCVwKK30gd2hpbGUgKDApCisKKy8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAorICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCitpbnQgeXlkZWJ1ZzsKKyNlbHNlIC8qICFZWURFQlVHICovCisjIGRlZmluZSBZWURQUklOVEYoQXJncykKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQorIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKKyNlbmRpZiAvKiAhWVlERUJVRyAqLworCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisgICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KKworI2lmbmRlZiBZWU1BWERFUFRICisjIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCisjZW5kaWYKKworDAorCisjaWYgWVlFUlJPUl9WRVJCT1NFCisKKyMgaWZuZGVmIHl5c3RybGVuCisjICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkKKyMgICBkZWZpbmUgeXlzdHJsZW4gc3RybGVuCisjICBlbHNlCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCitzdGF0aWMgWVlTSVpFX1QKKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit5eXN0cmxlbiAoY29uc3QgY2hhciAqeXlzdHIpCisjICAgZWxzZQoreXlzdHJsZW4gKHl5c3RyKQorICAgICBjb25zdCBjaGFyICp5eXN0cjsKKyMgICBlbmRpZgoreworICBjb25zdCBjaGFyICp5eXMgPSB5eXN0cjsKKworICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5cyAtIHl5c3RyIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIHl5c3RwY3B5CisjICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkgJiYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCisjICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQorIyAgZWxzZQorLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgorICAgWVlERVNULiAgKi8KK3N0YXRpYyBjaGFyICoKKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit5eXN0cGNweSAoY2hhciAqeXlkZXN0LCBjb25zdCBjaGFyICp5eXNyYykKKyMgICBlbHNlCit5eXN0cGNweSAoeXlkZXN0LCB5eXNyYykKKyAgICAgY2hhciAqeXlkZXN0OworICAgICBjb25zdCBjaGFyICp5eXNyYzsKKyMgICBlbmRpZgoreworICBjaGFyICp5eWQgPSB5eWRlc3Q7CisgIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOworCisgIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eWQgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXl0bmFtZXJyCisvKiBDb3B5IHRvIFlZUkVTIHRoZSBjb250ZW50cyBvZiBZWVNUUiBhZnRlciBzdHJpcHBpbmcgYXdheSB1bm5lY2Vzc2FyeQorICAgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcywgc28gdGhhdCBpdCdzIHN1aXRhYmxlIGZvciB5eWVycm9yLiAgVGhlCisgICBoZXVyaXN0aWMgaXMgdGhhdCBkb3VibGUtcXVvdGluZyBpcyB1bm5lY2Vzc2FyeSB1bmxlc3MgdGhlIHN0cmluZworICAgY29udGFpbnMgYW4gYXBvc3Ryb3BoZSwgYSBjb21tYSwgb3IgYmFja3NsYXNoIChvdGhlciB0aGFuCisgICBiYWNrc2xhc2gtYmFja3NsYXNoKS4gIFlZU1RSIGlzIHRha2VuIGZyb20geXl0bmFtZS4gIElmIFlZUkVTIGlzCisgICBudWxsLCBkbyBub3QgY29weTsgaW5zdGVhZCwgcmV0dXJuIHRoZSBsZW5ndGggb2Ygd2hhdCB0aGUgcmVzdWx0CisgICB3b3VsZCBoYXZlIGJlZW4uICAqLworc3RhdGljIFlZU0laRV9UCit5eXRuYW1lcnIgKGNoYXIgKnl5cmVzLCBjb25zdCBjaGFyICp5eXN0cikKK3sKKyAgaWYgKCp5eXN0ciA9PSAnIicpCisgICAgeworICAgICAgc2l6ZV90IHl5biA9IDA7CisgICAgICBjaGFyIGNvbnN0ICp5eXAgPSB5eXN0cjsKKworICAgICAgZm9yICg7OykKKwlzd2l0Y2ggKCorK3l5cCkKKwkgIHsKKwkgIGNhc2UgJ1wnJzoKKwkgIGNhc2UgJywnOgorCSAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7CisKKwkgIGNhc2UgJ1xcJzoKKwkgICAgaWYgKCorK3l5cCAhPSAnXFwnKQorCSAgICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKKwkgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkgIGRlZmF1bHQ6CisJICAgIGlmICh5eXJlcykKKwkgICAgICB5eXJlc1t5eW5dID0gKnl5cDsKKwkgICAgeXluKys7CisJICAgIGJyZWFrOworCisJICBjYXNlICciJzoKKwkgICAgaWYgKHl5cmVzKQorCSAgICAgIHl5cmVzW3l5bl0gPSAnXDAnOworCSAgICByZXR1cm4geXluOworCSAgfQorICAgIGRvX25vdF9zdHJpcF9xdW90ZXM6IDsKKyAgICB9CisKKyAgaWYgKCEgeXlyZXMpCisgICAgcmV0dXJuIHl5c3RybGVuICh5eXN0cik7CisKKyAgcmV0dXJuIHl5c3RwY3B5ICh5eXJlcywgeXlzdHIpIC0geXlyZXM7Cit9CisjIGVuZGlmCisKKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKworDAorCisjaWYgWVlERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5c3ltcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlzeW1wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCisgICAgRklMRSAqeXlvdXRwdXQ7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFICp5eXZhbHVlcDsKKyNlbmRpZgoreworICAvKiBQYWNpZnkgYGB1bnVzZWQgdmFyaWFibGUnJyB3YXJuaW5ncy4gICovCisgICh2b2lkKSB5eXZhbHVlcDsKKworICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJ0b2tlbiAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKyAgZWxzZQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKworCisjIGlmZGVmIFlZUFJJTlQKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKKyMgZW5kaWYKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOworfQorCisjZW5kaWYgLyogISBZWURFQlVHICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB0aGlzIHN5bWJvbC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBjb25zdCBjaGFyICp5eW1zZzsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KKyAgKHZvaWQpIHl5dmFsdWVwOworCisgIGlmICgheXltc2cpCisgICAgeXltc2cgPSAiRGVsZXRpbmciOworICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CisKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgY2FzZSA1MjogLyogImNob2ljZV9lbnRyeSIgKi8KKworICAgICAgICB7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLAorCQkoeXl2YWx1ZXAtPm1lbnUpLT5maWxlLT5uYW1lLCAoeXl2YWx1ZXAtPm1lbnUpLT5saW5lbm8pOworCWlmIChjdXJyZW50X21lbnUgPT0gKHl5dmFsdWVwLT5tZW51KSkKKwkJbWVudV9lbmRfbWVudSgpOworfTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTg6IC8qICJpZl9lbnRyeSIgKi8KKworICAgICAgICB7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogbWlzc2luZyBlbmQgc3RhdGVtZW50IGZvciB0aGlzIGVudHJ5XG4iLAorCQkoeXl2YWx1ZXAtPm1lbnUpLT5maWxlLT5uYW1lLCAoeXl2YWx1ZXAtPm1lbnUpLT5saW5lbm8pOworCWlmIChjdXJyZW50X21lbnUgPT0gKHl5dmFsdWVwLT5tZW51KSkKKwkJbWVudV9lbmRfbWVudSgpOworfTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjM6IC8qICJtZW51X2VudHJ5IiAqLworCisgICAgICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBtaXNzaW5nIGVuZCBzdGF0ZW1lbnQgZm9yIHRoaXMgZW50cnlcbiIsCisJCSh5eXZhbHVlcC0+bWVudSktPmZpbGUtPm5hbWUsICh5eXZhbHVlcC0+bWVudSktPmxpbmVubyk7CisJaWYgKGN1cnJlbnRfbWVudSA9PSAoeXl2YWx1ZXAtPm1lbnUpKQorCQltZW51X2VuZF9tZW51KCk7Cit9OworCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisMCisKKy8qIFByZXZlbnQgd2FybmluZ3MgZnJvbSAtV21pc3NpbmctcHJvdG90eXBlcy4gICovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKTsKKyMgZWxzZQoraW50IHl5cGFyc2UgKCk7CisjIGVuZGlmCisjZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitpbnQgeXlwYXJzZSAodm9pZCk7CisjZWxzZQoraW50IHl5cGFyc2UgKCk7CisjZW5kaWYKKyNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKworCisKKy8qIFRoZSBsb29rLWFoZWFkIHN5bWJvbC4gICovCitpbnQgeXljaGFyOworCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KK1lZU1RZUEUgeXlsdmFsOworCisvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLworaW50IHl5bmVycnM7CisKKworCisvKi0tLS0tLS0tLS0uCit8IHl5cGFyc2UuICB8CitgLS0tLS0tLS0tLSovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQorIyBlbHNlCitpbnQgeXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKKyAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyMgZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludAoreXlwYXJzZSAodm9pZCkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKCkKKyAgICA7CisjZW5kaWYKKyNlbmRpZgoreworICAKKyAgaW50IHl5c3RhdGU7CisgIGludCB5eW47CisgIGludCB5eXJlc3VsdDsKKyAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCisgIGludCB5eWVycnN0YXR1czsKKyAgLyogTG9vay1haGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW4gPSAwOworCisgIC8qIFRocmVlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6CisgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMsCisgICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMsCisgICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCisKKyAgICAgUmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzLCB0byBhbGxvdyB5eW92ZXJmbG93CisgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCisgIHNob3J0IGludCB5eXNzYVtZWUlOSVRERVBUSF07CisgIHNob3J0IGludCAqeXlzcyA9IHl5c3NhOworICBzaG9ydCBpbnQgKnl5c3NwOworCisgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CisgIFlZU1RZUEUgKnl5dnNwOworCisKKworI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisKKyAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKworICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQorICAgICBhY3Rpb24gcm91dGluZXMuICAqLworICBZWVNUWVBFIHl5dmFsOworCisKKyAgLyogV2hlbiByZWR1Y2luZywgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQKKyAgICAgcnVsZS4gICovCisgIGludCB5eWxlbjsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisKKyAgZ290byB5eXNldHN0YXRlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgeXluZXdzdGF0ZToKKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKyAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLgorICAgICAqLworICB5eXNzcCsrOworCisgeXlzZXRzdGF0ZToKKyAgKnl5c3NwID0geXlzdGF0ZTsKKworICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7CisKKyNpZmRlZiB5eW92ZXJmbG93CisgICAgICB7CisJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisJICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bworCSAgIG1lbW9yeS4gICovCisJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworCXNob3J0IGludCAqeXlzczEgPSB5eXNzOworCisKKwkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKKwkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gIFRoaXMgdXNlZCB0byBiZSBhCisJICAgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLCBidXQgdGhhdCBtaWdodAorCSAgIGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworCXl5b3ZlcmZsb3cgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpLAorCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCisJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKworCQkgICAgJnl5c3RhY2tzaXplKTsKKworCXl5c3MgPSB5eXNzMTsKKwl5eXZzID0geXl2czE7CisgICAgICB9CisjZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCisjIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCisgICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmIChZWU1BWERFUFRIIDw9IHl5c3RhY2tzaXplKQorCWdvdG8geXlleGhhdXN0ZWRsYWI7CisgICAgICB5eXN0YWNrc2l6ZSAqPSAyOworICAgICAgaWYgKFlZTUFYREVQVEggPCB5eXN0YWNrc2l6ZSkKKwl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7CisKKyAgICAgIHsKKwlzaG9ydCBpbnQgKnl5c3MxID0geXlzczsKKwl1bmlvbiB5eWFsbG9jICp5eXB0ciA9CisJICAodW5pb24geXlhbGxvYyAqKSBZWVNUQUNLX0FMTE9DIChZWVNUQUNLX0JZVEVTICh5eXN0YWNrc2l6ZSkpOworCWlmICghIHl5cHRyKQorCSAgZ290byB5eWV4aGF1c3RlZGxhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKworIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorCWlmICh5eXNzMSAhPSB5eXNzYSkKKwkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOworICAgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKKyAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7CisKKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAorCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKKworICAgICAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisJWVlBQk9SVDsKKyAgICB9CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKworICBnb3RvIHl5YmFja3VwOworCisvKi0tLS0tLS0tLS0tLgorfCB5eWJhY2t1cC4gIHwKK2AtLS0tLS0tLS0tLSovCit5eWJhY2t1cDoKKworLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCisvKiBSZWFkIGEgbG9vay1haGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9vay1haGVhZCB0b2tlbi4gICovCisKKyAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rLWFoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIGlmICh5eWNoYXIgPD0gWVlFT0YpCisgICAgeworICAgICAgeXljaGFyID0geXl0b2tlbiA9IFlZRU9GOworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisgICAgICBZWV9TWU1CT0xfUFJJTlQgKCJOZXh0IHRva2VuIGlzIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisgICAgfQorCisgIC8qIElmIHRoZSBwcm9wZXIgYWN0aW9uIG9uIHNlZWluZyB0b2tlbiBZWVRPS0VOIGlzIHRvIHJlZHVjZSBvciB0bworICAgICBkZXRlY3QgYW4gZXJyb3IsIHRha2UgdGhhdCBhY3Rpb24uICAqLworICB5eW4gKz0geXl0b2tlbjsKKyAgaWYgKHl5biA8IDAgfHwgWVlMQVNUIDwgeXluIHx8IHl5Y2hlY2tbeXluXSAhPSB5eXRva2VuKQorICAgIGdvdG8geXlkZWZhdWx0OworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPD0gMCkKKyAgICB7CisgICAgICBpZiAoeXluID09IDAgfHwgeXluID09IFlZVEFCTEVfTklORikKKwlnb3RvIHl5ZXJybGFiOworICAgICAgeXluID0gLXl5bjsKKyAgICAgIGdvdG8geXlyZWR1Y2U7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICAvKiBTaGlmdCB0aGUgbG9vay1haGVhZCB0b2tlbi4gICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisKKyAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKyAgICB5eWNoYXIgPSBZWUVNUFRZOworCisgICorK3l5dnNwID0geXlsdmFsOworCisKKyAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgorICAgICBzdGF0dXMuICAqLworICBpZiAoeXllcnJzdGF0dXMpCisgICAgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlkZWZhdWx0OgorICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisgIGdvdG8geXlyZWR1Y2U7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlyZWR1Y2U6CisgIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCisgIHl5bGVuID0geXlyMlt5eW5dOworCisgIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgorICAgICBgJCQgPSAkMScuCisKKyAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgorICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKworICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7CisgIHN3aXRjaCAoeXluKQorICAgIHsKKyAgICAgICAgY2FzZSA4OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5leHBlY3RlZCBlbmQgc3RhdGVtZW50Iik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5rbm93biBzdGF0ZW1lbnQgXCIlc1wiIiwgKHl5dnNwWy0yXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOgorCisgICAgeworCXpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkIG9wdGlvbiBcIiVzXCIiLCBrY29uZl9pZF9zdHJpbmdzICsgKHl5dnNwWy0yXS5pZCktPm5hbWUpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDExOgorCisgICAgeyB6Y29uZl9lcnJvcigiaW52YWxpZCBzdGF0ZW1lbnQiKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI1OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5rbm93biBvcHRpb24gXCIlc1wiIiwgKHl5dnNwWy0yXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI2OgorCisgICAgeyB6Y29uZl9lcnJvcigiaW52YWxpZCBvcHRpb24iKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI3OgorCisgICAgeworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoKHl5dnNwWy0xXS5zdHJpbmcpLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyODoKKworICAgIHsKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjk6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCgoeXl2c3BbLTFdLnN0cmluZyksIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudWNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMDoKKworICAgIHsKKwlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQljdXJyZW50X2VudHJ5LT5wcm9tcHQtPnR5cGUgPSBQX01FTlU7CisJZWxzZQorCQl6Y29uZnByaW50KCJ3YXJuaW5nOiBtZW51Y29uZmlnIHN0YXRlbWVudCB3aXRob3V0IHByb21wdCIpOworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzODoKKworICAgIHsKKwltZW51X3NldF90eXBlKCh5eXZzcFstMl0uaWQpLT5zdHlwZSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHlwZSgldSlcbiIsCisJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCSh5eXZzcFstMl0uaWQpLT5zdHlwZSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzk6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAoeXl2c3BbLTJdLnN0cmluZyksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDA6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFstMV0uZXhwcikpOworCWlmICgoeXl2c3BbLTNdLmlkKS0+c3R5cGUgIT0gU19VTktOT1dOKQorCQltZW51X3NldF90eXBlKCh5eXZzcFstM10uaWQpLT5zdHlwZSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdCgldSlcbiIsCisJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCSh5eXZzcFstM10uaWQpLT5zdHlwZSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDE6CisKKyAgICB7CisJbWVudV9hZGRfc3ltYm9sKFBfU0VMRUNULCBzeW1fbG9va3VwKCh5eXZzcFstMl0uc3RyaW5nKSwgMCksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNlbGVjdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDI6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX1JBTkdFLCBleHByX2FsbG9jX2NvbXAoRV9SQU5HRSwoeXl2c3BbLTNdLnN5bWJvbCksICh5eXZzcFstMl0uc3ltYm9sKSksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJhbmdlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0NToKKworICAgIHsKKwlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKCh5eXZzcFstMV0uc3RyaW5nKSwgc3RybGVuKCh5eXZzcFstMV0uc3RyaW5nKSkpOworCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9PUFRJT04pCisJCW1lbnVfYWRkX29wdGlvbihpZC0+dG9rZW4sICh5eXZzcFswXS5zdHJpbmcpKTsKKwllbHNlCisJCXpjb25mcHJpbnQoIndhcm5pbmc6IGlnbm9yaW5nIHVua25vd24gb3B0aW9uICVzIiwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKwlmcmVlKCh5eXZzcFstMV0uc3RyaW5nKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDY6CisKKyAgICB7ICh5eXZhbC5zdHJpbmcpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDQ3OgorCisgICAgeyAoeXl2YWwuc3RyaW5nKSA9ICh5eXZzcFswXS5zdHJpbmcpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDg6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cChOVUxMLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSE9JQ0U7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwltZW51X2FkZF9leHByKFBfQ0hPSUNFLCBOVUxMLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDQ5OgorCisgICAgeworCSh5eXZhbC5tZW51KSA9IG1lbnVfYWRkX21lbnUoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MDoKKworICAgIHsKKwlpZiAoemNvbmZfZW5kdG9rZW4oKHl5dnNwWzBdLmlkKSwgVF9DSE9JQ0UsIFRfRU5EQ0hPSUNFKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorO30KKyAgICBicmVhazsKKworICBjYXNlIDU4OgorCisgICAgeworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgKHl5dnNwWy0yXS5zdHJpbmcpLCAoeXl2c3BbLTFdLmV4cHIpKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpwcm9tcHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDU5OgorCisgICAgeworCWlmICgoeXl2c3BbLTJdLmlkKS0+c3R5cGUgPT0gU19CT09MRUFOIHx8ICh5eXZzcFstMl0uaWQpLT5zdHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCW1lbnVfc2V0X3R5cGUoKHl5dnNwWy0yXS5pZCktPnN0eXBlKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHlwZSgldSlcbiIsCisJCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLAorCQkJKHl5dnNwWy0yXS5pZCktPnN0eXBlKTsKKwl9IGVsc2UKKwkJWVlFUlJPUjsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MDoKKworICAgIHsKKwljdXJyZW50X2VudHJ5LT5zeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpvcHRpb25hbFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjE6CisKKyAgICB7CisJaWYgKCh5eXZzcFstM10uaWQpLT5zdHlwZSA9PSBTX1VOS05PV04pIHsKKwkJbWVudV9hZGRfc3ltYm9sKFBfREVGQVVMVCwgc3ltX2xvb2t1cCgoeXl2c3BbLTJdLnN0cmluZyksIDApLCAoeXl2c3BbLTFdLmV4cHIpKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdFxuIiwKKwkJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0gZWxzZQorCQlZWUVSUk9SOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY0OgorCisgICAgeworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9kZXAoKHl5dnNwWy0xXS5leHByKSk7CisJKHl5dmFsLm1lbnUpID0gbWVudV9hZGRfbWVudSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY1OgorCisgICAgeworCWlmICh6Y29uZl9lbmR0b2tlbigoeXl2c3BbMF0uaWQpLCBUX0lGLCBUX0VORElGKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzE6CisKKyAgICB7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfTUVOVSwgKHl5dnNwWy0xXS5zdHJpbmcpLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDptZW51XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MjoKKworICAgIHsKKwkoeXl2YWwubWVudSkgPSBtZW51X2FkZF9tZW51KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzM6CisKKyAgICB7CisJaWYgKHpjb25mX2VuZHRva2VuKCh5eXZzcFswXS5pZCksIFRfTUVOVSwgVF9FTkRNRU5VKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZG1lbnVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3OToKKworICAgIHsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzb3VyY2UgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksICh5eXZzcFstMV0uc3RyaW5nKSk7CisJemNvbmZfbmV4dGZpbGUoKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MDoKKworICAgIHsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9wcm9tcHQoUF9DT01NRU5ULCAoeXl2c3BbLTFdLnN0cmluZyksIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbW1lbnRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDgxOgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODI6CisKKyAgICB7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGVscFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJemNvbmZfc3RhcnRoZWxwKCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODM6CisKKyAgICB7CisJY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0gKHl5dnNwWzBdLnN0cmluZyk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODg6CisKKyAgICB7CisJbWVudV9hZGRfZGVwKCh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHMgb25cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDg5OgorCisgICAgeworCW1lbnVfYWRkX2RlcCgoeXl2c3BbLTFdLmV4cHIpKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MDoKKworICAgIHsKKwltZW51X2FkZF9kZXAoKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmVxdWlyZXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDkyOgorCisgICAgeworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgKHl5dnNwWy0xXS5zdHJpbmcpLCAoeXl2c3BbMF0uZXhwcikpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDk1OgorCisgICAgeyAoeXl2YWwuaWQpID0gKHl5dnNwWy0xXS5pZCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NjoKKworICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTc6CisKKyAgICB7ICh5eXZhbC5pZCkgPSAoeXl2c3BbLTFdLmlkKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMDoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMToKKworICAgIHsgKHl5dmFsLmV4cHIpID0gKHl5dnNwWzBdLmV4cHIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAyOgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX3N5bWJvbCgoeXl2c3BbMF0uc3ltYm9sKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDM6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCAoeXl2c3BbLTJdLnN5bWJvbCksICh5eXZzcFswXS5zeW1ib2wpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNDoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgKHl5dnNwWy0yXS5zeW1ib2wpLCAoeXl2c3BbMF0uc3ltYm9sKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDU6CisKKyAgICB7ICh5eXZhbC5leHByKSA9ICh5eXZzcFstMV0uZXhwcik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDY6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA3OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX3R3byhFX09SLCAoeXl2c3BbLTJdLmV4cHIpLCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA4OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX3R3byhFX0FORCwgKHl5dnNwWy0yXS5leHByKSwgKHl5dnNwWzBdLmV4cHIpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOToKKworICAgIHsgKHl5dmFsLnN5bWJvbCkgPSBzeW1fbG9va3VwKCh5eXZzcFswXS5zdHJpbmcpLCAwKTsgZnJlZSgoeXl2c3BbMF0uc3RyaW5nKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTA6CisKKyAgICB7ICh5eXZhbC5zeW1ib2wpID0gc3ltX2xvb2t1cCgoeXl2c3BbMF0uc3RyaW5nKSwgMSk7IGZyZWUoKHl5dnNwWzBdLnN0cmluZykpOyA7fQorICAgIGJyZWFrOworCisKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworLyogTGluZSAxMTI2IG9mIHlhY2MuYy4gICovCisKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworCisKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKKyAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICBpZiAoIXl5ZXJyc3RhdHVzKQorICAgIHsKKyAgICAgICsreXluZXJyczsKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8IFlZTEFTVCkKKwl7CisJICBpbnQgeXl0eXBlID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisJICBZWVNJWkVfVCB5eXNpemUwID0geXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5dHlwZV0pOworCSAgWVlTSVpFX1QgeXlzaXplID0geXlzaXplMDsKKwkgIFlZU0laRV9UIHl5c2l6ZTE7CisJICBpbnQgeXlzaXplX292ZXJmbG93ID0gMDsKKwkgIGNoYXIgKnl5bXNnID0gMDsKKyMJICBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA1CisJICBjaGFyIGNvbnN0ICp5eWFyZ1tZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNXTsKKwkgIGludCB5eXg7CisKKyNpZiAwCisJICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCisJICAgICBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LiAgKi8KKwkgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIik7CisJICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIik7CisJICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIik7CisJICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIik7CisJICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIik7CisjZW5kaWYKKwkgIGNoYXIgKnl5Zm10OworCSAgY2hhciBjb25zdCAqeXlmOworCSAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKKwkgIHN0YXRpYyBjaGFyIGNvbnN0IHl5ZXhwZWN0aW5nW10gPSAiLCBleHBlY3RpbmcgJXMiOworCSAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7CisJICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKKwkJCSsgc2l6ZW9mIHl5ZXhwZWN0aW5nIC0gMQorCQkJKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQorCQkJICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOworCSAgY2hhciBjb25zdCAqeXlwcmVmaXggPSB5eWV4cGVjdGluZzsKKworCSAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgorCSAgICAgWVlDSEVDSy4gICovCisJICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisKKwkgIC8qIFN0YXkgd2l0aGluIGJvdW5kcyBvZiBib3RoIHl5Y2hlY2sgYW5kIHl5dG5hbWUuICAqLworCSAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW47CisJICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7CisJICBpbnQgeXljb3VudCA9IDE7CisKKwkgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOworCSAgeXlmbXQgPSB5eXN0cGNweSAoeXlmb3JtYXQsIHl5dW5leHBlY3RlZCk7CisKKwkgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKKwkgICAgICB7CisJCWlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCisJCSAgeworCQkgICAgeXljb3VudCA9IDE7CisJCSAgICB5eXNpemUgPSB5eXNpemUwOworCQkgICAgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJeXlhcmdbeXljb3VudCsrXSA9IHl5dG5hbWVbeXl4XTsKKwkJeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKKwkJeXlzaXplX292ZXJmbG93IHw9IHl5c2l6ZTEgPCB5eXNpemU7CisJCXl5c2l6ZSA9IHl5c2l6ZTE7CisJCXl5Zm10ID0geXlzdHBjcHkgKHl5Zm10LCB5eXByZWZpeCk7CisJCXl5cHJlZml4ID0geXlvcjsKKwkgICAgICB9CisKKwkgIHl5ZiA9IFlZXyh5eWZvcm1hdCk7CisJICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7CisJICB5eXNpemVfb3ZlcmZsb3cgfD0geXlzaXplMSA8IHl5c2l6ZTsKKwkgIHl5c2l6ZSA9IHl5c2l6ZTE7CisKKwkgIGlmICgheXlzaXplX292ZXJmbG93ICYmIHl5c2l6ZSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pCisJICAgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKKwkgIGlmICh5eW1zZykKKwkgICAgeworCSAgICAgIC8qIEF2b2lkIHNwcmludGYsIGFzIHRoYXQgaW5mcmluZ2VzIG9uIHRoZSB1c2VyJ3MgbmFtZSBzcGFjZS4KKwkJIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCisJCSBwcm9kdWNlZCBhIHN0cmluZyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgIiVzInMuICAqLworCSAgICAgIGNoYXIgKnl5cCA9IHl5bXNnOworCSAgICAgIGludCB5eWkgPSAwOworCSAgICAgIHdoaWxlICgoKnl5cCA9ICp5eWYpKQorCQl7CisJCSAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKKwkJICAgIHsKKwkJICAgICAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOworCQkgICAgICB5eWYgKz0gMjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHl5cCsrOworCQkgICAgICB5eWYrKzsKKwkJICAgIH0KKwkJfQorCSAgICAgIHl5ZXJyb3IgKHl5bXNnKTsKKwkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7CisJICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKwl5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKKyAgICB9CisKKworCisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rLWFoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICAgICAgeworCSAgLyogUmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0LiAgKi8KKwkgIGlmICh5eWNoYXIgPT0gWVlFT0YpCisJICAgIFlZQUJPUlQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLCB5eXRva2VuLCAmeXlsdmFsKTsKKwkgIHl5Y2hhciA9IFlZRU1QVFk7CisJfQorICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJvcmxhYjoKKworICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCisgICAgIFlZRVJST1IgYW5kIHRoZSBsYWJlbCB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIKKyAgICAgY29kZS4gICovCisgIGlmICgwKQorICAgICBnb3RvIHl5ZXJyb3JsYWI7CisKK3l5dnNwIC09IHl5bGVuOworICB5eXNzcCAtPSB5eWxlbjsKKyAgeXlzdGF0ZSA9ICp5eXNzcDsKKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYjEgLS0gY29tbW9uIGNvZGUgZm9yIGJvdGggc3ludGF4IGVycm9yIGFuZCBZWUVSUk9SLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWIxOgorICB5eWVycnN0YXR1cyA9IDM7CS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcy4gICovCisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQorCXsKKwkgIHl5biArPSBZWVRFUlJPUjsKKwkgIGlmICgwIDw9IHl5biAmJiB5eW4gPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXluXSA9PSBZWVRFUlJPUikKKwkgICAgeworCSAgICAgIHl5biA9IHl5dGFibGVbeXluXTsKKwkgICAgICBpZiAoMCA8IHl5bikKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuLiAgKi8KKyAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQorCVlZQUJPUlQ7CisKKworICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7CisgICAgICBZWVBPUFNUQUNLOworICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKKyAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworCisgIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gKi8KKyAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisjaWZuZGVmIHl5b3ZlcmZsb3cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXhoYXVzdGVkbGFiOgorICB5eWVycm9yIChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyNlbmRpZgorCit5eXJldHVybjoKKyAgaWYgKHl5Y2hhciAhPSBZWUVPRiAmJiB5eWNoYXIgIT0gWVlFTVBUWSkKKyAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKKwkJIHl5dG9rZW4sICZ5eWx2YWwpOworICB3aGlsZSAoeXlzc3AgIT0geXlzcykKKyAgICB7CisgICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogcG9wcGluZyIsCisJCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKKyAgICAgIFlZUE9QU1RBQ0s7CisgICAgfQorI2lmbmRlZiB5eW92ZXJmbG93CisgIGlmICh5eXNzICE9IHl5c3NhKQorICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CisjZW5kaWYKKyAgcmV0dXJuIHl5cmVzdWx0OworfQorCisKKworCisKK3ZvaWQgY29uZl9wYXJzZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCXpjb25mX2luaXRzY2FuKG5hbWUpOworCisJc3ltX2luaXQoKTsKKwltZW51X2luaXQoKTsKKwltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoTlVMTCwgMCk7CisJbW9kdWxlc19zeW0tPnR5cGUgPSBTX0JPT0xFQU47CisJbW9kdWxlc19zeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb21wdChQX01FTlUsIFBST0pFQ1RfTkFNRSIgQ29uZmlndXJhdGlvbiIsIE5VTEwpOworCisjaWYgWVlERUJVRworCWlmIChnZXRlbnYoIlpDT05GX0RFQlVHIikpCisJCXpjb25mZGVidWcgPSAxOworI2VuZGlmCisJemNvbmZwYXJzZSgpOworCWlmICh6Y29uZm5lcnJzKQorCQlleGl0KDEpOworCWlmICghbW9kdWxlc19zeW0tPnByb3ApIHsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJCXByb3AgPSBwcm9wX2FsbG9jKFBfREVGQVVMVCwgbW9kdWxlc19zeW0pOworCQlwcm9wLT5leHByID0gZXhwcl9hbGxvY19zeW1ib2woc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApKTsKKwl9CisJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NoZWNrX2RlcHMoc3ltKTsKKyAgICAgICAgfQorCisJc3ltX2NoYW5nZV9jb3VudCA9IDE7Cit9CisKK2NvbnN0IGNoYXIgKnpjb25mX3Rva2VubmFtZShpbnQgdG9rZW4pCit7CisJc3dpdGNoICh0b2tlbikgeworCWNhc2UgVF9NRU5VOgkJcmV0dXJuICJtZW51IjsKKwljYXNlIFRfRU5ETUVOVToJCXJldHVybiAiZW5kbWVudSI7CisJY2FzZSBUX0NIT0lDRToJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFRfRU5EQ0hPSUNFOglyZXR1cm4gImVuZGNob2ljZSI7CisJY2FzZSBUX0lGOgkJcmV0dXJuICJpZiI7CisJY2FzZSBUX0VORElGOgkJcmV0dXJuICJlbmRpZiI7CisJY2FzZSBUX0RFUEVORFM6CQlyZXR1cm4gImRlcGVuZHMiOworCX0KKwlyZXR1cm4gIjx0b2tlbj4iOworfQorCitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKQoreworCWlmIChpZC0+dG9rZW4gIT0gZW5kdG9rZW4pIHsKKwkJemNvbmZfZXJyb3IoInVuZXhwZWN0ZWQgJyVzJyB3aXRoaW4gJXMgYmxvY2siLAorCQkJa2NvbmZfaWRfc3RyaW5ncyArIGlkLT5uYW1lLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGN1cnJlbnRfbWVudS0+ZmlsZSAhPSBjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZfZXJyb3IoIiclcycgaW4gZGlmZmVyZW50IGZpbGUgdGhhbiAnJXMnIiwKKwkJCWtjb25mX2lkX3N0cmluZ3MgKyBpZC0+bmFtZSwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczolZDogbG9jYXRpb24gb2YgdGhlICclcydcbiIsCisJCQljdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vLAorCQkJemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZuZXJycysrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB6Y29uZnByaW50KGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAiLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl2YV9zdGFydChhcCwgZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgYXApOworCXZhX2VuZChhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJemNvbmZuZXJycysrOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKQoreworI2lmIFlZREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSArIDEsIGVycik7CisjZW5kaWYKK30KKwordm9pZCBwcmludF9xdW90ZWRfc3RyaW5nKEZJTEUgKm91dCwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKworCXB1dGMoJyInLCBvdXQpOworCXdoaWxlICgocCA9IHN0cmNocihzdHIsICciJykpKSB7CisJCWxlbiA9IHAgLSBzdHI7CisJCWlmIChsZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBsZW4sIHN0cik7CisJCWZwdXRzKCJcXFwiIiwgb3V0KTsKKwkJc3RyID0gcCArIDE7CisJfQorCWZwdXRzKHN0ciwgb3V0KTsKKwlwdXRjKCciJywgb3V0KTsKK30KKwordm9pZCBwcmludF9zeW1ib2woRklMRSAqb3V0LCBzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJZnByaW50ZihvdXQsICJjaG9pY2VcbiIpOworCWVsc2UKKwkJZnByaW50ZihvdXQsICJjb25maWcgJXNcbiIsIHN5bS0+bmFtZSk7CisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJZnB1dHMoIiAgYm9vbGVhblxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1RSSVNUQVRFOgorCQlmcHV0cygiICB0cmlzdGF0ZVxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwkJZnB1dHMoIiAgc3RyaW5nXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCQlmcHV0cygiICBpbnRlZ2VyXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQlmcHV0cygiICBoZXhcbiIsIG91dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwdXRzKCIgID8/P1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJfQorCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX1BST01QVDoKKwkJCWZwdXRzKCIgIHByb21wdCAiLCBvdXQpOworCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlmcHV0cyggIiAgZGVmYXVsdCAiLCBvdXQpOworCQkJZXhwcl9mcHJpbnQocHJvcC0+ZXhwciwgb3V0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9DSE9JQ0U6CisJCQlmcHV0cygiICAjY2hvaWNlIHZhbHVlXG4iLCBvdXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKG91dCwgIiAgdW5rbm93biBwcm9wICVkIVxuIiwgcHJvcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc3ltLT5oZWxwKSB7CisJCWludCBsZW4gPSBzdHJsZW4oc3ltLT5oZWxwKTsKKwkJd2hpbGUgKHN5bS0+aGVscFstLWxlbl0gPT0gJ1xuJykKKwkJCXN5bS0+aGVscFtsZW5dID0gMDsKKwkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBzeW0tPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBvdXQpOworfQorCit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCWlmICgoc3ltID0gbWVudS0+c3ltKSkKKwkJCXByaW50X3N5bWJvbChvdXQsIG1lbnUpOworCQllbHNlIGlmICgocHJvcCA9IG1lbnUtPnByb21wdCkpIHsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX0NPTU1FTlQ6CisJCQkJZnB1dHMoIlxuY29tbWVudCAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBQX01FTlU6CisJCQkJZnB1dHMoIlxubWVudSAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiICBkZXBlbmRzICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJCWZwdXRjKCdcbicsIG91dCk7CisJCQl9CisJCQlmcHV0cygiXG4iLCBvdXQpOworCQl9CisKKwkJaWYgKG1lbnUtPmxpc3QpCisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJZWxzZSBpZiAobWVudS0+bmV4dCkKKwkJCW1lbnUgPSBtZW51LT5uZXh0OworCQllbHNlIHdoaWxlICgobWVudSA9IG1lbnUtPnBhcmVudCkpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQgJiYgbWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkKKwkJCQlmcHV0cygiXG5lbmRtZW51XG4iLCBvdXQpOworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2luY2x1ZGUgImxleC56Y29uZi5jIgorI2luY2x1ZGUgInV0aWwuYyIKKyNpbmNsdWRlICJjb25mZGF0YS5jIgorI2luY2x1ZGUgImV4cHIuYyIKKyNpbmNsdWRlICJzeW1ib2wuYyIKKyNpbmNsdWRlICJtZW51LmMiCisKKwpkaWZmIC0tZ2l0IGEvdG95Ym94L2xpYi9hcmdzLmMgYi90b3lib3gvbGliL2FyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjM3OGJlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9hcmdzLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qIGFyZ3MuYyAtIENvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzaW5nLgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKi8KKworLy8gTk9URTogSWYgb3B0aW9uIHBhcnNpbmcgc2VnZmF1bHRzLCBzd2l0Y2ggb24gVE9ZQk9YX0RFQlVHIGluIG1lbnVjb25maWcuCisKKy8vIEVuYWJsaW5nIFRPWUJPWF9ERUJVRyBpbiAuY29uZmlnIGFkZHMgc3ludGF4IGNoZWNrcyB0byBvcHRpb24gc3RyaW5nIHBhcnNpbmcKKy8vIHdoaWNoIGFyZW4ndCBuZWVkZWQgaW4gdGhlIGZpbmFsIGNvZGUgKHlvdXIgb3B0aW9uIHN0cmluZyBpcyBoYXJkd2lyZWQgYW5kCisvLyBzaG91bGQgYmUgY29ycmVjdCB3aGVuIHlvdSBzaGlwKSwgYnV0IGFyZSB1c2VmdWwgZm9yIGRldmVsb3BtZW50LgorCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBEZXNpZ24gZ29hbHM6CisvLyAgIERvbid0IHVzZSBnZXRvcHQoKSBvdXQgb2YgbGliYy4KKy8vICAgRG9uJ3QgcGVybXV0ZSBvcmlnaW5hbCBhcmd1bWVudHMgKHNjcmV3aW5nIHVwIHBzL3RvcCBvdXRwdXQpLgorLy8gICBJbnRlZ3JhdGVkIC0tbG9uZyBvcHRpb25zICIobm9zaG9ydClhKGFsb25nKWIoYmxvbmcxKShibG9uZzIpIgorCisvKiBUaGlzIHVzZXMgYSBnZXRvcHQtbGlrZSBvcHRpb24gc3RyaW5nLCBidXQgbm90IGdldG9wdCgpIGl0c2VsZi4gV2UgY2FsbAorICogaXQgdGhlIGdldF9vcHQgc3RyaW5nLgorICoKKyAqIEVhY2ggb3B0aW9uIGluIHRoZSBnZXRfb3B0IHN0cmluZyBjb3JyZXNwb25kcyB0byBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAqIHJldHVybiB2YWx1ZS4gVGhlIHJpZ2h0bW9zdCBhcmd1bWVudCBpcyAoMTw8MCksIHRoZSBuZXh0IHRvIGxhc3QgaXMgKDE8PDEpCisgKiBhbmQgc28gb24uIElmIHRoZSBvcHRpb24gaXNuJ3Qgc2VlbiBpbiBhcmd2W10sIGl0cyBiaXQgcmVtYWlucyAwLgorICoKKyAqIE9wdGlvbnMgd2hpY2ggaGF2ZSBhbiBhcmd1bWVudCBmaWxsIGluIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QgaW4gdGhlIGdsb2JhbAorICogdW5pb24gInRoaXMiIChzZWUgZ2VuZXJhdGVkL2dsb2JhbHMuaCksIHdoaWNoIGl0IHRyZWF0cyBhcyBhbiBhcnJheSBvZiBsb25ncworICogKG5vdGUgdGhhdCBzaXplb2YobG9uZyk9PXNpemVvZihwb2ludGVyKSBpcyBndWFyYW50ZWVkIGJ5IExQNjQpLgorICoKKyAqIFlvdSBkb24ndCBoYXZlIHRvIGZyZWUgdGhlIG9wdGlvbiBzdHJpbmdzLCB3aGljaCBwb2ludCBpbnRvIHRoZSBlbnZpcm9ubWVudAorICogc3BhY2UuIExpc3Qgb2JqZWN0cyBzaG91bGQgYmUgZnJlZWQgYnkgbWFpbigpIHdoZW4gY29tbWFuZF9tYWluKCkgcmV0dXJucy4KKyAqCisgKiBFeGFtcGxlOgorICogICBDYWxsaW5nIGdldF9vcHRmbGFncygpIHdoZW4gdG95cy53aGljaC0+b3B0aW9ucz0iYWI6YzpkIiBhbmQKKyAqICAgYXJndiA9IFsiY29tbWFuZCIsICItYiIsICJmcnVpdCIsICItZCIsICJ3YWxydXMiXSByZXN1bHRzIGluOgorICoKKyAqICAgICBDaGFuZ2VzIHRvIHN0cnVjdCB0b3lzOgorICogICAgICAgdG95cy5vcHRmbGFncyA9IDUgKEkuRS4gMDEwMSBzbyAtYiA9IDQgfCAtZCA9IDEpCisgKiAgICAgICB0b3lzLm9wdGFyZ3NbMF0gPSAid2FscnVzIiAobGVmdG92ZXIgYXJndW1lbnQpCisgKiAgICAgICB0b3lzLm9wdGFyZ3NbMV0gPSBOVUxMIChlbmQgb2YgbGlzdCkKKyAqICAgICAgIHRveXMub3B0YyA9IDEgKHRoZXJlIHdhcyAxIGxlZnRvdmVyIGFyZ3VtZW50KQorICoKKyAqICAgICBDaGFuZ2VzIHRvIHVuaW9uIHRoaXM6CisgKiAgICAgICB0aGlzWzBdPU5VTEwgKGJlY2F1c2UgLWMgZGlkbid0IGdldCBhbiBhcmd1bWVudCB0aGlzIHRpbWUpCisgKiAgICAgICB0aGlzWzFdPSJmcnVpdCIgKGFyZ3VtZW50IHRvIC1iKQorICovCisKKy8vIFdoYXQgeW91IGNhbiBwdXQgaW4gYSBnZXRfb3B0IHN0cmluZzoKKy8vICAgQW55IG90aGVyd2lzZSB1bnVzZWQgY2hhcmFjdGVyIChhbGwgbGV0dGVycywgdW5wcmVmaXhlZCBudW1iZXJzKSBzcGVjaWZ5CisvLyAgIGFuIG9wdGlvbiB0aGF0IHNldHMgYSBmbGFnLiBUaGUgYml0IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBiaW5hcnkgZGlnaXQKKy8vICAgaWYgeW91IHN0cmluZyB0aGUgb3B0aW9uIGNoYXJhY3RlcnMgdG9nZXRoZXIgaW4gb3JkZXIuCisvLyAgIFNvIGluICJhYmNkZWZnaCIgYSA9IDEyOCwgaCA9IDEKKy8vCisvLyAgIFN1ZmZpeGVzIHNwZWNpZnkgdGhhdCB0aGlzIG9wdGlvbiB0YWtlcyBhbiBhcmd1bWVudCAoc3RvcmVkIGluIEdMT0JBTFMpOgorLy8gICAgICAgTm90ZSB0aGF0IHBvaW50ZXIgYW5kIGxvbmcgYXJlIGFsd2F5cyB0aGUgc2FtZSBzaXplLCBldmVuIG9uIDY0IGJpdC4KKy8vICAgICA6IHBsdXMgYSBzdHJpbmcgYXJndW1lbnQsIGtlZXAgbW9zdCByZWNlbnQgaWYgbW9yZSB0aGFuIG9uZQorLy8gICAgICogcGx1cyBhIHN0cmluZyBhcmd1bWVudCwgYXBwZW5kZWQgdG8gYSBsaXN0CisvLyAgICAgIyBwbHVzIGEgc2lnbmVkIGxvbmcgYXJndW1lbnQKKy8vICAgICAgIDxMT1cgICAgIC0gZGllIGlmIGxlc3MgdGhhbiBMT1cKKy8vICAgICAgID5ISUdIICAgIC0gZGllIGlmIGdyZWF0ZXIgdGhhbiBISUdICisvLyAgICAgICA9REVGQVVMVCAtIHZhbHVlIGlmIG5vdCBzcGVjaWZpZWQKKy8vICAgICAtIHBsdXMgYSBzaWduZWQgbG9uZyBhcmd1bWVudCBkZWZhdWx0aW5nIHRvIG5lZ2F0aXZlIChzYXkgKyBmb3IgcG9zaXRpdmUpCisvLyAgICAgLiBwbHVzIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBhcmd1bWVudCAod2l0aCBDRkdfVE9ZQk9YX0ZMT0FUKQorLy8gICAgICAgQ2hvcCB0aGlzIG9wdGlvbiBvdXQgd2l0aCBVU0VfVE9ZQk9YX0ZMT0FUKCkgaW4gb3B0aW9uIHN0cmluZworLy8gICAgICAgU2FtZSA8TE9XPkhJR0g9REVGQVVMVCBhcyAjCisvLyAgICAgQCBwbHVzIGFuIG9jY3VycmVuY2UgY291bnRlciAod2hpY2ggaXMgYSBsb25nKQorLy8gICAgIChsb25nb3B0KQorLy8gICAgIHwgdGhpcyBpcyByZXF1aXJlZC4gSWYgbW9yZSB0aGFuIG9uZSBtYXJrZWQsIG9ubHkgb25lIHJlcXVpcmVkLgorLy8gICAgIDsgbG9uZyBvcHRpb24ncyBhcmd1bWVudCBpcyBvcHRpb25hbCAoY2FuIG9ubHkgYmUgc3VwcGxpZWQgd2l0aCAtLW9wdD0pCisvLyAgICAgXiBTdG9wIHBhcnNpbmcgYWZ0ZXIgZW5jb3VudGVyaW5nIHRoaXMgYXJndW1lbnQKKy8vICAgICIgIiAoc3BhY2UgY2hhcikgdGhlICJwbHVzIGFuIGFyZ3VtZW50IiBtdXN0IGJlIHNlcGFyYXRlCisvLyAgICAgICAgSS5FLiAiLWogMyIgbm90ICItajMiLiBTbyAia2lsbCAtc3RvcCIgIT0gImtpbGwgLXMgdG9wIgorLy8KKy8vICAgQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2V0X29wdCBzdHJpbmcgKGJlZm9yZSBhbnkgb3B0aW9ucyk6CisvLyAgICAgXiBzdG9wIGF0IGZpcnN0IG5vbm9wdGlvbiBhcmd1bWVudAorLy8gICAgIDwwIGRpZSBpZiBsZXNzIHRoYW4gIyBsZWZ0b3ZlciBhcmd1bWVudHMgKGRlZmF1bHQgMCkKKy8vICAgICA+OSBkaWUgaWYgPiAjIGxlZnRvdmVyIGFyZ3VtZW50cyAoZGVmYXVsdCBNQVhfSU5UKQorLy8gICAgID8gQWxsb3cgdW5rbm93biBhcmd1bWVudHMgKHBhc3MgdGhlbSB0aHJvdWdoIHRvIGNvbW1hbmQpLgorLy8gICAgICYgZmlyc3QgYXJndW1lbnQgaGFzIGltYWdpbmFyeSBkYXNoIChhbGEgdGFyL3BzKQorLy8gICAgICAgSWYgZ2l2ZW4gdHdpY2UsIGFsbCBhcmd1bWVudHMgaGF2ZSBpbWFnaW5hcnkgZGFzaAorLy8KKy8vICAgQXQgdGhlIGVuZDogW2dyb3Vwc10gb2YgcHJldmlvdXNseSBzZWVuIG9wdGlvbnMKKy8vICAgICAtIE9ubHkgb25lIGluIGdyb3VwIChzd2l0Y2ggb2ZmKSAgICBbLWFiY10gbWVhbnMgLWFiPS1iLCAtYmE9LWEsIC1hYmM9LWMKKy8vICAgICArIFN5bm9ueW1zIChzd2l0Y2ggb24gYWxsKSAgICAgICAgICBbK2FiY10gbWVhbnMgLWFiPS1hYmMsIC1jPS1hYmMKKy8vICAgICAhIE1vcmUgdGhhbiBvbmUgaW4gZ3JvdXAgaXMgZXJyb3IgICBbIWFiY10gbWVhbnMgLWFiIGNhbGxzIGVycm9yX2V4aXQoKQorLy8gICAgICAgcHJpbWFyaWx5IHVzZWZ1bCBpZiB5b3UgY2FuIHN3aXRjaCB0aGluZ3MgYmFjayBvZmYgYWdhaW4uCisKKy8vIE5vdGVzIGZyb20gZ2V0b3B0IG1hbiBwYWdlCisvLyAgIC0gYW5kIC0tIGNhbm5vdCBiZSBhcmd1bWVudHMuCisvLyAgICAgLS0gZm9yY2UgZW5kIG9mIGFyZ3VtZW50cworLy8gICAgIC0gaXMgYSBzeW5vbnltIGZvciBzdGRpbiBpbiBmaWxlIGFyZ3VtZW50cworLy8gICAtYWJjZCBtZWFucyAtYSAtYiAtYyAtZCAoYnV0IGlmIC1iIHRha2VzIGFuIGFyZ3VtZW50LCB0aGVuIGl0J3MgLWEgLWIgY2QpCisKKy8vIExpbmtlZCBsaXN0IG9mIGFsbCBrbm93biBvcHRpb25zIChvcHRpb24gc3RyaW5nIHBhcnNlZCBpbnRvIHRoaXMpLgorLy8gSGFuZ3Mgb2ZmIGdldG9wdGZsYWdzdGF0ZSwgZnJlZWQgYXQgZW5kIG9mIG9wdGlvbiBwYXJzaW5nLgorc3RydWN0IG9wdHMgeworICBzdHJ1Y3Qgb3B0cyAqbmV4dDsKKyAgbG9uZyAqYXJnOyAgICAgICAgIC8vIFBvaW50ZXIgaW50byB1bmlvbiAidGhpcyIgdG8gc3RvcmUgYXJndW1lbnRzIGF0LgorICBpbnQgYzsgICAgICAgICAgICAgLy8gQXJndW1lbnQgY2hhcmFjdGVyIHRvIG1hdGNoCisgIGludCBmbGFnczsgICAgICAgICAvLyB8PTEsIF49MiwgIiAiPTQsIDs9OAorICB1bnNpZ25lZCBsb25nIGxvbmcgZGV4WzNdOyAvLyBiaXRzIHRvIGRpc2FibGUvZW5hYmxlL2V4Y2x1ZGUgaW4gdG95cy5vcHRmbGFncworICBjaGFyIHR5cGU7ICAgICAgICAgLy8gVHlwZSBvZiBhcmd1bWVudHMgdG8gc3RvcmUgdW5pb24gInRoaXMiCisgIHVuaW9uIHsKKyAgICBsb25nIGw7CisgICAgRkxPQVQgZjsKKyAgfSB2YWxbM107ICAgICAgICAgIC8vIGxvdywgaGlnaCwgZGVmYXVsdCAtIHJhbmdlIG9mIGFsbG93ZWQgdmFsdWVzCit9OworCisvLyBsaW5rZWQgbGlzdCBvZiBsb25nIG9wdGlvbnMuIChIYW5ncyBvZmYgZ2V0b3B0ZmxhZ3N0YXRlLCBmcmVlIGF0IGVuZCBvZgorLy8gb3B0aW9uIHBhcnNpbmcsIGRldGFpbHMgYWJvdXQgZmxhZyB0byBzZXQgYW5kIGdsb2JhbCBzbG90IHRvIGZpbGwgb3V0CisvLyBzdG9yZWQgaW4gcmVsYXRlZCBzaG9ydCBvcHRpb24gc3RydWN0LCBidXQgaWYgb3B0LT5jID0gLTEgdGhlIGxvbmcgb3B0aW9uCisvLyBpcyAiYmFyZSIgKGhhcyBubyBjb3JyZXNwb25kaW5nIHNob3J0IG9wdGlvbikuCitzdHJ1Y3QgbG9uZ29wdHMgeworICBzdHJ1Y3QgbG9uZ29wdHMgKm5leHQ7CisgIHN0cnVjdCBvcHRzICpvcHQ7CisgIGNoYXIgKnN0cjsKKyAgaW50IGxlbjsKK307CisKKy8vIFN0YXRlIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLgorc3RydWN0IGdldG9wdGZsYWdzdGF0ZQoreworICBpbnQgYXJnYywgbWluYXJncywgbWF4YXJncywgbm9kYXNoOworICBjaGFyICphcmc7CisgIHN0cnVjdCBvcHRzICpvcHRzOworICBzdHJ1Y3QgbG9uZ29wdHMgKmxvbmdvcHRzOworICBpbnQgbm9lcnJvciwgbm9kYXNoX25vdywgc3RvcGVhcmx5OworICB1bnNpZ25lZCBleGNsdWRlcywgcmVxdWlyZXM7Cit9OworCisvLyBVc2UgZ2V0b3B0ZmxhZ3N0YXRlIHRvIHBhcnNlIHBhcnNlIG9uZSBjb21tYW5kIGxpbmUgb3B0aW9uIGZyb20gYXJndgorc3RhdGljIGludCBnb3RmbGFnKHN0cnVjdCBnZXRvcHRmbGFnc3RhdGUgKmdvZiwgc3RydWN0IG9wdHMgKm9wdCkKK3sKKyAgaW50IHR5cGU7CisKKyAgLy8gRGlkIHdlIHJlY29nbml6ZSB0aGlzIG9wdGlvbj8KKyAgaWYgKCFvcHQpIHsKKyAgICBpZiAoZ29mLT5ub2Vycm9yKSByZXR1cm4gMTsKKyAgICBoZWxwX2V4aXQoIlVua25vd24gb3B0aW9uICVzIiwgZ29mLT5hcmcpOworICB9CisKKyAgLy8gTWlnaHQgZW5hYmxpbmcgdGhpcyBzd2l0Y2ggb2ZmIHNvbWV0aGluZyBlbHNlPworICBpZiAodG95cy5vcHRmbGFncyAmIG9wdC0+ZGV4WzBdKSB7CisgICAgc3RydWN0IG9wdHMgKmNscjsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaSA9IDE7CisKKyAgICAvLyBGb3JnZXQgc2F2ZWQgYXJndW1lbnQgZm9yIGZsYWcgd2Ugc3dpdGNoIGJhY2sgb2ZmCisgICAgZm9yIChjbHI9Z29mLT5vcHRzLCBpPTE7IGNscjsgY2xyID0gY2xyLT5uZXh0LCBpPDw9MSkKKyAgICAgIGlmIChjbHItPmFyZyAmJiAoaSAmIHRveXMub3B0ZmxhZ3MgJiBvcHQtPmRleFswXSkpICpjbHItPmFyZyA9IDA7CisgICAgdG95cy5vcHRmbGFncyAmPSB+b3B0LT5kZXhbMF07CisgIH0KKworICAvLyBTZXQgZmxhZ3MKKyAgdG95cy5vcHRmbGFncyB8PSBvcHQtPmRleFsxXTsKKyAgZ29mLT5leGNsdWRlcyB8PSBvcHQtPmRleFsyXTsKKyAgaWYgKG9wdC0+ZmxhZ3MmMikgZ29mLT5zdG9wZWFybHk9MjsKKworICBpZiAodG95cy5vcHRmbGFncyAmIGdvZi0+ZXhjbHVkZXMpIHsKKyAgICBzdHJ1Y3Qgb3B0cyAqYmFkOworICAgIHVuc2lnbmVkIGkgPSAxOworCisgICAgZm9yIChiYWQ9Z29mLT5vcHRzLCBpPTE7IDtiYWQgPSBiYWQtPm5leHQsIGk8PD0xKSB7CisgICAgICBpZiAob3B0ID09IGJhZCB8fCAhKGkgJiB0b3lzLm9wdGZsYWdzKSkgY29udGludWU7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIGJhZC0+ZGV4WzJdKSBicmVhazsKKyAgICB9CisgICAgaGVscF9leGl0KCJObyAnJWMnIHdpdGggJyVjJyIsIG9wdC0+YywgYmFkLT5jKTsKKyAgfQorCisgIC8vIERvZXMgdGhpcyBvcHRpb24gdGFrZSBhbiBhcmd1bWVudD8KKyAgaWYgKCFnb2YtPmFyZykgeworICAgIGlmIChvcHQtPmZsYWdzICYgOCkgcmV0dXJuIDA7CisgICAgZ29mLT5hcmcgPSAiIjsKKyAgfSBlbHNlIGdvZi0+YXJnKys7CisgIHR5cGUgPSBvcHQtPnR5cGU7CisKKyAgaWYgKHR5cGUgPT0gJ0AnKSArKyoob3B0LT5hcmcpOworICBlbHNlIGlmICh0eXBlKSB7CisgICAgY2hhciAqYXJnID0gZ29mLT5hcmc7CisKKyAgICAvLyBIYW5kbGUgIi14YmxhaCIgYW5kICIteCBibGFoIiwgYnV0IGFsc28gYSB0aGlyZCBjYXNlOiAiYWJ4YyBibGFoIgorICAgIC8vIHRvIG1ha2UgInRhciB4Q2pmdiBibGFoMSBibGFoMiB0aGluZ3kiIHdvcmsgbGlrZQorICAgIC8vICJ0YXIgLXggLUMgYmxhaDEgLWogLWYgYmxhaDIgLXYgdGhpbmd5IgorCisgICAgaWYgKGdvZi0+bm9kYXNoX25vdyB8fCAoIWFyZ1swXSAmJiAhKG9wdC0+ZmxhZ3MgJiA4KSkpCisgICAgICBhcmcgPSB0b3lzLmFyZ3ZbKytnb2YtPmFyZ2NdOworICAgIGlmICghYXJnKSB7CisgICAgICBjaGFyICpzID0gIk1pc3NpbmcgYXJndW1lbnQgdG8gIjsKKyAgICAgIHN0cnVjdCBsb25nb3B0cyAqbG87CisKKyAgICAgIGlmIChvcHQtPmMgIT0gLTEpIGhlbHBfZXhpdCgiJXMtJWMiLCBzLCBvcHQtPmMpOworCisgICAgICBmb3IgKGxvID0gZ29mLT5sb25nb3B0czsgbG8tPm9wdCAhPSBvcHQ7IGxvID0gbG8tPm5leHQpOworICAgICAgaGVscF9leGl0KCIlcy0tJS4qcyIsIHMsIGxvLT5sZW4sIGxvLT5zdHIpOworICAgIH0KKworICAgIGlmICh0eXBlID09ICc6JykgKihvcHQtPmFyZykgPSAobG9uZylhcmc7CisgICAgZWxzZSBpZiAodHlwZSA9PSAnKicpIHsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqKmxpc3Q7CisKKyAgICAgIGxpc3QgPSAoc3RydWN0IGFyZ19saXN0ICoqKW9wdC0+YXJnOworICAgICAgd2hpbGUgKCpsaXN0KSBsaXN0PSYoKCpsaXN0KS0+bmV4dCk7CisgICAgICAqbGlzdCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICAgICAgKCpsaXN0KS0+YXJnID0gYXJnOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnIycgfHwgdHlwZSA9PSAnLScpIHsKKyAgICAgIGxvbmcgbCA9IGF0b2x4KGFyZyk7CisgICAgICBpZiAodHlwZSA9PSAnLScgJiYgIWlzcHVuY3QoKmFyZykpIGwqPS0xOworICAgICAgaWYgKGwgPCBvcHQtPnZhbFswXS5sKSBoZWxwX2V4aXQoIi0lYyA8ICVsZCIsIG9wdC0+Yywgb3B0LT52YWxbMF0ubCk7CisgICAgICBpZiAobCA+IG9wdC0+dmFsWzFdLmwpIGhlbHBfZXhpdCgiLSVjID4gJWxkIiwgb3B0LT5jLCBvcHQtPnZhbFsxXS5sKTsKKworICAgICAgKihvcHQtPmFyZykgPSBsOworICAgIH0gZWxzZSBpZiAoQ0ZHX1RPWUJPWF9GTE9BVCAmJiB0eXBlID09ICcuJykgeworICAgICAgRkxPQVQgKmYgPSAoRkxPQVQgKikob3B0LT5hcmcpOworCisgICAgICAqZiA9IHN0cnRvZChhcmcsICZhcmcpOworICAgICAgaWYgKG9wdC0+dmFsWzBdLmwgIT0gTE9OR19NSU4gJiYgKmYgPCBvcHQtPnZhbFswXS5mKQorICAgICAgICBoZWxwX2V4aXQoIi0lYyA8ICVsZiIsIG9wdC0+YywgKGRvdWJsZSlvcHQtPnZhbFswXS5mKTsKKyAgICAgIGlmIChvcHQtPnZhbFsxXS5sICE9IExPTkdfTUFYICYmICpmID4gb3B0LT52YWxbMV0uZikKKyAgICAgICAgaGVscF9leGl0KCItJWMgPiAlbGYiLCBvcHQtPmMsIChkb3VibGUpb3B0LT52YWxbMV0uZik7CisgICAgfQorCisgICAgaWYgKCFnb2YtPm5vZGFzaF9ub3cpIGdvZi0+YXJnID0gIiI7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8gUGFyc2UgdGhpcyBjb21tYW5kJ3Mgb3B0aW9ucyBzdHJpbmcgaW50byBzdHJ1Y3QgZ2V0b3B0ZmxhZ3N0YXRlLCB3aGljaAorLy8gaW5jbHVkZXMgYSBzdHJ1Y3Qgb3B0cyBsaW5rZWQgbGlzdCBpbiByZXZlcnNlIG9yZGVyIChJLkUuIHJpZ2h0LXRvLWxlZnQpCit2b2lkIHBhcnNlX29wdGZsYWdsaXN0KHN0cnVjdCBnZXRvcHRmbGFnc3RhdGUgKmdvZikKK3sKKyAgY2hhciAqb3B0aW9ucyA9IHRveXMud2hpY2gtPm9wdGlvbnM7CisgIGxvbmcgKm5leHRhcmcgPSAobG9uZyAqKSZ0aGlzOworICBzdHJ1Y3Qgb3B0cyAqbmV3ID0gMDsKKyAgaW50IGlkeDsKKworICAvLyBQYXJzZSBvcHRpb24gZm9ybWF0IHN0cmluZworICBtZW1zZXQoZ29mLCAwLCBzaXplb2Yoc3RydWN0IGdldG9wdGZsYWdzdGF0ZSkpOworICBnb2YtPm1heGFyZ3MgPSBJTlRfTUFYOworICBpZiAoIW9wdGlvbnMpIHJldHVybjsKKworICAvLyBQYXJzZSBsZWFkaW5nIHNwZWNpYWwgYmVoYXZpb3IgaW5kaWNhdG9ycworICBmb3IgKDs7KSB7CisgICAgaWYgKCpvcHRpb25zID09ICdeJykgZ29mLT5zdG9wZWFybHkrKzsKKyAgICBlbHNlIGlmICgqb3B0aW9ucyA9PSAnPCcpIGdvZi0+bWluYXJncz0qKCsrb3B0aW9ucyktJzAnOworICAgIGVsc2UgaWYgKCpvcHRpb25zID09ICc+JykgZ29mLT5tYXhhcmdzPSooKytvcHRpb25zKS0nMCc7CisgICAgZWxzZSBpZiAoKm9wdGlvbnMgPT0gJz8nKSBnb2YtPm5vZXJyb3IrKzsKKyAgICBlbHNlIGlmICgqb3B0aW9ucyA9PSAnJicpIGdvZi0+bm9kYXNoKys7CisgICAgZWxzZSBicmVhazsKKyAgICBvcHRpb25zKys7CisgIH0KKworICAvLyBQYXJzZSBvcHRpb24gc3RyaW5nIGludG8gYSBsaW5rZWQgbGlzdCBvZiBvcHRpb25zIHdpdGggYXR0cmlidXRlcy4KKworICBpZiAoISpvcHRpb25zKSBnb2YtPnN0b3BlYXJseSsrOworICB3aGlsZSAoKm9wdGlvbnMpIHsKKyAgICBjaGFyICp0ZW1wOworCisgICAgLy8gT3B0aW9uIGdyb3VwcyBjb21lIGFmdGVyIGFsbCBvcHRpb25zIGFyZSBkZWZpbmVkCisgICAgaWYgKCpvcHRpb25zID09ICdbJykgYnJlYWs7CisKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBsaXN0IGVudHJ5IHdoZW4gbmVjZXNzYXJ5CisgICAgaWYgKCFuZXcpIHsKKyAgICAgIG5ldyA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvcHRzKSk7CisgICAgICBuZXctPm5leHQgPSBnb2YtPm9wdHM7CisgICAgICBnb2YtPm9wdHMgPSBuZXc7CisgICAgICBuZXctPnZhbFswXS5sID0gTE9OR19NSU47CisgICAgICBuZXctPnZhbFsxXS5sID0gTE9OR19NQVg7CisgICAgfQorICAgIC8vIEVhY2ggb3B0aW9uIG11c3Qgc3RhcnQgd2l0aCAiKCIgb3IgYW4gb3B0aW9uIGNoYXJhY3Rlci4gIChCYXJlCisgICAgLy8gbG9uZ29wdHMgb25seSBjb21lIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLikKKyAgICBpZiAoKm9wdGlvbnMgPT0gJygnICYmIG5ldy0+YyAhPSAtMSkgeworICAgICAgY2hhciAqZW5kOworICAgICAgc3RydWN0IGxvbmdvcHRzICpsbzsKKworICAgICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBsb25nb3B0CisgICAgICBmb3IgKGVuZCA9ICsrb3B0aW9uczsgKmVuZCAmJiAqZW5kICE9ICcpJzsgZW5kKyspOworICAgICAgaWYgKENGR19UT1lCT1hfREVCVUcgJiYgISplbmQpIGVycm9yX2V4aXQoIihsb25nb3B0KSBkaWRuJ3QgZW5kIik7CisKKyAgICAgIC8vIGluaXQgYSBuZXcgc3RydWN0IGxvbmdvcHRzCisgICAgICBsbyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb25nb3B0cykpOworICAgICAgbG8tPm5leHQgPSBnb2YtPmxvbmdvcHRzOworICAgICAgbG8tPm9wdCA9IG5ldzsKKyAgICAgIGxvLT5zdHIgPSBvcHRpb25zOworICAgICAgbG8tPmxlbiA9IGVuZC1vcHRpb25zOworICAgICAgZ29mLT5sb25nb3B0cyA9IGxvOworICAgICAgb3B0aW9ucyA9ICsrZW5kOworCisgICAgICAvLyBNYXJrIHRoaXMgc3RydWN0IG9wdCBhcyB1c2VkLCBldmVuIHdoZW4gbm8gc2hvcnQgb3B0LgorICAgICAgaWYgKCFuZXctPmMpIG5ldy0+YyA9IC0xOworCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IG9wdGlvbiB0aGF0IHdhc24ndCBhIGxvbmdvcHQsCisKKyAgICB9IGVsc2UgaWYgKHN0cmNocigiOiojQC4tIiwgKm9wdGlvbnMpKSB7CisgICAgICBpZiAoQ0ZHX1RPWUJPWF9ERUJVRyAmJiBuZXctPnR5cGUpCisgICAgICAgIGVycm9yX2V4aXQoIm11bHRpcGxlIHR5cGVzICVjOiVjJWMiLCBuZXctPmMsIG5ldy0+dHlwZSwgKm9wdGlvbnMpOworICAgICAgbmV3LT50eXBlID0gKm9wdGlvbnM7CisgICAgfSBlbHNlIGlmICgtMSAhPSAoaWR4ID0gc3RyaWR4KCJ8XiA7IiwgKm9wdGlvbnMpKSkgbmV3LT5mbGFncyB8PSAxPDxpZHg7CisgICAgLy8gYm91bmRzIGNoZWNraW5nCisgICAgZWxzZSBpZiAoLTEgIT0gKGlkeCA9IHN0cmlkeCgiPD49IiwgKm9wdGlvbnMpKSkgeworICAgICAgaWYgKG5ldy0+dHlwZSA9PSAnIycpIHsKKyAgICAgICAgbG9uZyBsID0gc3RydG9sKCsrb3B0aW9ucywgJnRlbXAsIDEwKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gb3B0aW9ucykgbmV3LT52YWxbaWR4XS5sID0gbDsKKyAgICAgIH0gZWxzZSBpZiAoQ0ZHX1RPWUJPWF9GTE9BVCAmJiBuZXctPnR5cGUgPT0gJy4nKSB7CisgICAgICAgIEZMT0FUIGYgPSBzdHJ0b2QoKytvcHRpb25zLCAmdGVtcCk7CisgICAgICAgIGlmICh0ZW1wICE9IG9wdGlvbnMpIG5ldy0+dmFsW2lkeF0uZiA9IGY7CisgICAgICB9IGVsc2UgaWYgKENGR19UT1lCT1hfREVCVUcpIGVycm9yX2V4aXQoIjw+PSBvbmx5IGFmdGVyIC4jIik7CisgICAgICBvcHRpb25zID0gLS10ZW1wOworCisgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG9wdGlvbi4gIFRoZQorICAgIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBvcHRpb24uICBJZiB3ZSd2ZSBhbHJlYWR5CisgICAgLy8gYXNzaWduZWQgYW4gb3B0aW9uIHRvIHRoaXMgc3RydWN0LCBsb29wIHRvIGFsbG9jYXRlIGEgbmV3IG9uZS4KKyAgICAvLyAoSXQnbGwgZ2V0IGJhY2sgaGVyZSBhZnRlcndhcmRzIGFuZCBmYWxsIHRocm91Z2ggdG8gbmV4dCBlbHNlLikKKyAgICB9IGVsc2UgaWYgKG5ldy0+YykgeworICAgICAgbmV3ID0gMDsKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gQ2xhaW0gdGhpcyBvcHRpb24sIGxvb3AgdG8gc2VlIHdoYXQncyBhZnRlciBpdC4KKyAgICB9IGVsc2UgbmV3LT5jID0gKm9wdGlvbnM7CisKKyAgICBvcHRpb25zKys7CisgIH0KKworICAvLyBJbml0aWFsaXplIGVuYWJsZS9kaXNhYmxlL2V4Y2x1ZGUgbWFza3MgYW5kIHBvaW50ZXJzIHRvIHN0b3JlIGFyZ3VtZW50cy4KKyAgLy8gKFRoaXMgZ29lcyByaWdodCB0byBsZWZ0IHNvIHdlIG5lZWQgdGhlIHdob2xlIGxpc3QgYmVmb3JlIHdlIGNhbiBzdGFydC4pCisgIGlkeCA9IDA7CisgIGZvciAobmV3ID0gZ29mLT5vcHRzOyBuZXc7IG5ldyA9IG5ldy0+bmV4dCkgeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1ID0gMUw8PGlkeCsrOworCisgICAgaWYgKG5ldy0+YyA9PSAxKSBuZXctPmMgPSAwOworICAgIG5ldy0+ZGV4WzFdID0gdTsKKyAgICBpZiAobmV3LT5mbGFncyAmIDEpIGdvZi0+cmVxdWlyZXMgfD0gdTsKKyAgICBpZiAobmV3LT50eXBlKSB7CisgICAgICBuZXctPmFyZyA9ICh2b2lkICopbmV4dGFyZzsKKyAgICAgICoobmV4dGFyZysrKSA9IG5ldy0+dmFsWzJdLmw7CisgICAgfQorICB9CisKKyAgLy8gUGFyc2UgdHJhaWxpbmcgZ3JvdXAgaW5kaWNhdG9ycworICB3aGlsZSAoKm9wdGlvbnMpIHsKKyAgICB1bnNpZ25lZCBiaXRzID0gMDsKKworICAgIGlmIChDRkdfVE9ZQk9YX0RFQlVHICYmICpvcHRpb25zICE9ICdbJykgZXJyb3JfZXhpdCgidHJhaWxpbmcgJXMiLCBvcHRpb25zKTsKKworICAgIGlkeCA9IHN0cmlkeCgiLSshIiwgKisrb3B0aW9ucyk7CisgICAgaWYgKENGR19UT1lCT1hfREVCVUcgJiYgaWR4ID09IC0xKSBlcnJvcl9leGl0KCJbIG5lZWRzICstISIpOworICAgIGlmIChDRkdfVE9ZQk9YX0RFQlVHICYmIChvcHRpb25zWzFdID09ICddJyB8fCAhb3B0aW9uc1sxXSkpCisgICAgICBlcnJvcl9leGl0KCJlbXB0eSBbXSIpOworCisgICAgLy8gRG9uJ3QgYWR2YW5jZSBwYXN0IF0gYnV0IGRvIHByb2Nlc3MgaXQgb25jZSBpbiBsb29wLgorICAgIHdoaWxlICgqb3B0aW9ucysrICE9ICddJykgeworICAgICAgc3RydWN0IG9wdHMgKm9wdDsKKyAgICAgIGludCBpOworCisgICAgICBpZiAoQ0ZHX1RPWUJPWF9ERUJVRyAmJiAhKm9wdGlvbnMpIGVycm9yX2V4aXQoIlsgd2l0aG91dCBdIik7CisgICAgICAvLyBGaW5kIHRoaXMgb3B0aW9uIGZsYWcgKGluIHByZXZpb3VzbHkgcGFyc2VkIHN0cnVjdCBvcHQpCisgICAgICBmb3IgKGk9MCwgb3B0ID0gZ29mLT5vcHRzOyA7IGkrKywgb3B0ID0gb3B0LT5uZXh0KSB7CisgICAgICAgIGlmICgqb3B0aW9ucyA9PSAnXScpIHsKKyAgICAgICAgICBpZiAoIW9wdCkgYnJlYWs7CisgICAgICAgICAgaWYgKGJpdHMmKDE8PGkpKSBvcHQtPmRleFtpZHhdIHw9IGJpdHMmfigxPDxpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoKm9wdGlvbnM9PTEpIGJyZWFrOworICAgICAgICAgIGlmIChDRkdfVE9ZQk9YX0RFQlVHICYmICFvcHQpCisgICAgICAgICAgICBlcnJvcl9leGl0KCJbXSB1bmtub3duIHRhcmdldCAlYyIsICpvcHRpb25zKTsKKyAgICAgICAgICBpZiAob3B0LT5jID09ICpvcHRpb25zKSB7CisgICAgICAgICAgICBiaXRzIHw9IDE8PGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gRmlsbCBvdXQgdG95cy5vcHRmbGFncywgdG95cy5vcHRhcmdzLCBhbmQgdGhpc1tdIGZyb20gdG95cy5hcmd2CisKK3ZvaWQgZ2V0X29wdGZsYWdzKHZvaWQpCit7CisgIHN0cnVjdCBnZXRvcHRmbGFnc3RhdGUgZ29mOworICBzdHJ1Y3Qgb3B0cyAqY2F0Y2g7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBzYXZlZmxhZ3M7CisgIGNoYXIgKmxldHRlcnNbXT17InMiLCIifTsKKworICAvLyBPcHRpb24gcGFyc2luZyBpcyBhIHR3byBzdGFnZSBwcm9jZXNzOiBwYXJzZSB0aGUgb3B0aW9uIHN0cmluZyBpbnRvCisgIC8vIGEgc3RydWN0IG9wdHMgbGlzdCwgdGhlbiB1c2UgdGhhdCBsaXN0IHRvIHByb2Nlc3MgYXJndltdOworCisgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0YXJncworICBzYXZlZmxhZ3MgPSAwOworICB3aGlsZSAodG95cy5hcmd2W3NhdmVmbGFncysrXSk7CisgIHRveXMub3B0YXJncyA9IHh6YWxsb2Moc2l6ZW9mKGNoYXIgKikqc2F2ZWZsYWdzKTsKKworICBwYXJzZV9vcHRmbGFnbGlzdCgmZ29mKTsKKworICAvLyBJdGVyYXRlIHRocm91Z2ggY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgc2tpcHBpbmcgYXJndlswXQorICBmb3IgKGdvZi5hcmdjPTE7IHRveXMuYXJndltnb2YuYXJnY107IGdvZi5hcmdjKyspIHsKKyAgICBnb2YuYXJnID0gdG95cy5hcmd2W2dvZi5hcmdjXTsKKyAgICBjYXRjaCA9IE5VTEw7CisKKyAgICAvLyBQYXJzZSB0aGlzIGFyZ3VtZW50CisgICAgaWYgKGdvZi5zdG9wZWFybHk+MSkgZ290byBub3RmbGFnOworCisgICAgZ29mLm5vZGFzaF9ub3cgPSAwOworCisgICAgLy8gVmFyaW91cyB0aGluZ3Mgd2l0aCBkYXNoZXMKKyAgICBpZiAoKmdvZi5hcmcgPT0gJy0nKSB7CisKKyAgICAgIC8vIEhhbmRsZSAtCisgICAgICBpZiAoIWdvZi5hcmdbMV0pIGdvdG8gbm90ZmxhZzsKKyAgICAgIGdvZi5hcmcrKzsKKyAgICAgIGlmICgqZ29mLmFyZz09Jy0nKSB7CisgICAgICAgIHN0cnVjdCBsb25nb3B0cyAqbG87CisKKyAgICAgICAgZ29mLmFyZysrOworICAgICAgICAvLyBIYW5kbGUgLS0KKyAgICAgICAgaWYgKCEqZ29mLmFyZykgeworICAgICAgICAgIGdvZi5zdG9wZWFybHkgKz0gMjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHdlIG1hdGNoIGEga25vd24gLS1sb25nb3B0PworICAgICAgICBmb3IgKGxvID0gZ29mLmxvbmdvcHRzOyBsbzsgbG8gPSBsby0+bmV4dCkgeworICAgICAgICAgIGlmICghc3RybmNtcChnb2YuYXJnLCBsby0+c3RyLCBsby0+bGVuKSkgeworICAgICAgICAgICAgaWYgKCFnb2YuYXJnW2xvLT5sZW5dKSBnb2YuYXJnID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGdvZi5hcmdbbG8tPmxlbl0gPT0gJz0nICYmIGxvLT5vcHQtPnR5cGUpCisgICAgICAgICAgICAgIGdvZi5hcmcgKz0gbG8tPmxlbjsKKyAgICAgICAgICAgIGVsc2UgY29udGludWU7CisgICAgICAgICAgICAvLyBJdCdzIGEgbWF0Y2guCisgICAgICAgICAgICBjYXRjaCA9IGxvLT5vcHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTaG91bGQgd2UgaGFuZGxlIHRoaXMgLS1sb25nb3B0IGFzIGEgbm9uLW9wdGlvbiBhcmd1bWVudD8KKyAgICAgICAgaWYgKCFsbyAmJiBnb2Yubm9lcnJvcikgeworICAgICAgICAgIGdvZi5hcmcgLT0gMjsKKyAgICAgICAgICBnb3RvIG5vdGZsYWc7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb25nIG9wdGlvbiBwYXJzZWQsIGhhbmRsZSBvcHRpb24uCisgICAgICAgIGdvdGZsYWcoJmdvZiwgY2F0Y2gpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGluZ3MgdGhhdCBkb24ndCBzdGFydCB3aXRoIGEgZGFzaC4KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdvZi5ub2Rhc2ggJiYgKGdvZi5ub2Rhc2g+MSB8fCBnb2YuYXJnYyA9PSAxKSkgZ29mLm5vZGFzaF9ub3cgPSAxOworICAgICAgZWxzZSBnb3RvIG5vdGZsYWc7CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0aGUgYXJncyBwYXJ0IG9mIC1hcmdzLiAgTG9vcCB0aHJvdWdoCisgICAgLy8gZWFjaCBlbnRyeSAoY291bGQgYmUgLWFiYyBtZWFuaW5nIC1hIC1iIC1jKQorICAgIHNhdmVmbGFncyA9IHRveXMub3B0ZmxhZ3M7CisgICAgd2hpbGUgKCpnb2YuYXJnKSB7CisKKyAgICAgIC8vIElkZW50aWZ5IG5leHQgb3B0aW9uIGNoYXIuCisgICAgICBmb3IgKGNhdGNoID0gZ29mLm9wdHM7IGNhdGNoOyBjYXRjaCA9IGNhdGNoLT5uZXh0KQorICAgICAgICBpZiAoKmdvZi5hcmcgPT0gY2F0Y2gtPmMpCisgICAgICAgICAgaWYgKCEoKGNhdGNoLT5mbGFncyY0KSAmJiBnb2YuYXJnWzFdKSkgYnJlYWs7CisKKyAgICAgIC8vIEhhbmRsZSBvcHRpb24gY2hhciAoYWR2YW5jaW5nIHBhc3Qgd2hhdCB3YXMgdXNlZCkKKyAgICAgIGlmIChnb3RmbGFnKCZnb2YsIGNhdGNoKSApIHsKKyAgICAgICAgdG95cy5vcHRmbGFncyA9IHNhdmVmbGFnczsKKyAgICAgICAgZ29mLmFyZyA9IHRveXMuYXJndltnb2YuYXJnY107CisgICAgICAgIGdvdG8gbm90ZmxhZzsKKyAgICAgIH0KKyAgICB9CisgICAgY29udGludWU7CisKKyAgICAvLyBOb3QgYSBmbGFnLCBzYXZlIHZhbHVlIGluIHRveXMub3B0YXJnc1tdCitub3RmbGFnOgorICAgIGlmIChnb2Yuc3RvcGVhcmx5KSBnb2Yuc3RvcGVhcmx5Kys7CisgICAgdG95cy5vcHRhcmdzW3RveXMub3B0YysrXSA9IHRveXMuYXJndltnb2YuYXJnY107CisgIH0KKworICAvLyBTYW5pdHkgY2hlY2sKKyAgaWYgKHRveXMub3B0Yzxnb2YubWluYXJncykKKyAgICBoZWxwX2V4aXQoIk5lZWQlcyAlZCBhcmd1bWVudCVzIiwgbGV0dGVyc1shIShnb2YubWluYXJncy0xKV0sCisgICAgICBnb2YubWluYXJncywgbGV0dGVyc1shKGdvZi5taW5hcmdzLTEpXSk7CisgIGlmICh0b3lzLm9wdGM+Z29mLm1heGFyZ3MpCisgICAgaGVscF9leGl0KCJNYXggJWQgYXJndW1lbnQlcyIsIGdvZi5tYXhhcmdzLCBsZXR0ZXJzWyEoZ29mLm1heGFyZ3MtMSldKTsKKyAgaWYgKGdvZi5yZXF1aXJlcyAmJiAhKGdvZi5yZXF1aXJlcyAmIHRveXMub3B0ZmxhZ3MpKSB7CisgICAgc3RydWN0IG9wdHMgKnJlcTsKKyAgICBjaGFyIG5lZWRzWzMyXSwgKnMgPSBuZWVkczsKKworICAgIGZvciAocmVxID0gZ29mLm9wdHM7IHJlcTsgcmVxID0gcmVxLT5uZXh0KQorICAgICAgaWYgKHJlcS0+ZmxhZ3MgJiAxKSAqKHMrKykgPSByZXEtPmM7CisgICAgKnMgPSAwOworCisgICAgaGVscF9leGl0KCJOZWVkcyAlcy0lcyIsIHNbMV0gPyAib25lIG9mICIgOiAiIiwgbmVlZHMpOworICB9CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGxsaXN0X3RyYXZlcnNlKGdvZi5vcHRzLCBmcmVlKTsKKyAgICBsbGlzdF90cmF2ZXJzZShnb2YubG9uZ29wdHMsIGZyZWUpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvbGliL2RpcnRyZWUuYyBiL3RveWJveC9saWIvZGlydHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvbGliL2RpcnRyZWUuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogZGlydHJlZS5jIC0gRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggZGlyZWN0b3J5IHRyZWVzLgorICoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworc3RhdGljIGludCBub3Rkb3Rkb3QoY2hhciAqbmFtZSkKK3sKKyAgaWYgKG5hbWVbMF09PScuJyAmJiAoIW5hbWVbMV0gfHwgKG5hbWVbMV09PScuJyAmJiAhbmFtZVsyXSkpKSByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworLy8gRGVmYXVsdCBjYWxsYmFjaywgZmlsdGVycyBvdXQgIi4iIGFuZCAiLi4iLgorCitpbnQgZGlydHJlZV9ub3Rkb3Rkb3Qoc3RydWN0IGRpcnRyZWUgKmNhdGNoKQoreworICAvLyBTaG91bGQgd2Ugc2tpcCAiLiIgYW5kICIuLiI/CisgIHJldHVybiBub3Rkb3Rkb3QoY2F0Y2gtPm5hbWUpKihESVJUUkVFX1NBVkV8RElSVFJFRV9SRUNVUlNFKTsKK30KKworLy8gQ3JlYXRlIGEgZGlydHJlZSBub2RlIGZyb20gYSBwYXRoLCB3aXRoIHN0YXQgYW5kIHN5bWxpbmsgaW5mby4KKy8vIChUaGlzIGRvZXNuJ3Qgb3BlbiBkaXJlY3RvcnkgZmlsZWhhbmRsZXMgeWV0IHNvIGFzIG5vdCB0byBleGhhdXN0IHRoZQorLy8gZmlsZWhhbmRsZSBzcGFjZSBvbiBsYXJnZSB0cmVlcywgZGlydHJlZV9oYW5kbGVfY2FsbGJhY2soKSBkb2VzIHRoYXQuKQorCitzdHJ1Y3QgZGlydHJlZSAqZGlydHJlZV9hZGRfbm9kZShzdHJ1Y3QgZGlydHJlZSAqcGFyZW50LCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCBkaXJ0cmVlICpkdCA9IE5VTEw7CisgIHN0cnVjdCBzdGF0IHN0OworICBpbnQgbGVuID0gMCwgbGlua2xlbiA9IDA7CisKKyAgaWYgKG5hbWUpIHsKKyAgICAvLyBvcGVuIGNvZGUgdGhpcyBiZWNhdXNlIGhhdmVuJ3QgZ290IG5vZGUgdG8gY2FsbCBkaXJ0cmVlX3BhcmVudGZkKCkgb24geWV0CisgICAgaW50IGZkID0gcGFyZW50ID8gcGFyZW50LT5kaXJmZCA6IEFUX0ZEQ1dEOworCisgICAgaWYgKGZzdGF0YXQoZmQsIG5hbWUsICZzdCwgQVRfU1lNTElOS19OT0ZPTExPVyohKGZsYWdzJkRJUlRSRUVfU1lNRk9MTE9XKSkpCisgICAgICBnb3RvIGVycm9yOworICAgIGlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisgICAgICBpZiAoMD4obGlua2xlbiA9IHJlYWRsaW5rYXQoZmQsIG5hbWUsIGxpYmJ1ZiwgNDA5NSkpKSBnb3RvIGVycm9yOworICAgICAgbGliYnVmW2xpbmtsZW4rK109MDsKKyAgICB9CisgICAgbGVuID0gc3RybGVuKG5hbWUpOworICB9CisgIGR0ID0geHphbGxvYygobGVuID0gc2l6ZW9mKHN0cnVjdCBkaXJ0cmVlKStsZW4rMSkrbGlua2xlbik7CisgIGR0LT5wYXJlbnQgPSBwYXJlbnQ7CisgIGlmIChuYW1lKSB7CisgICAgbWVtY3B5KCYoZHQtPnN0KSwgJnN0LCBzaXplb2Yoc3RydWN0IHN0YXQpKTsKKyAgICBzdHJjcHkoZHQtPm5hbWUsIG5hbWUpOworCisgICAgaWYgKGxpbmtsZW4pIGR0LT5zeW1saW5rID0gbWVtY3B5KGxlbisoY2hhciAqKWR0LCBsaWJidWYsIGxpbmtsZW4pOworICB9CisKKyAgcmV0dXJuIGR0OworCitlcnJvcjoKKyAgaWYgKCEoZmxhZ3MmRElSVFJFRV9TSFVUVVApICYmIG5vdGRvdGRvdChuYW1lKSkgeworICAgIGNoYXIgKnBhdGggPSBwYXJlbnQgPyBkaXJ0cmVlX3BhdGgocGFyZW50LCAwKSA6ICIiOworCisgICAgcGVycm9yX21zZygiJXMlcyVzIiwgcGF0aCwgcGFyZW50ID8gIi8iIDogIiIsIG5hbWUpOworICAgIGlmIChwYXJlbnQpIGZyZWUocGF0aCk7CisgIH0KKyAgaWYgKHBhcmVudCkgcGFyZW50LT5zeW1saW5rID0gKGNoYXIgKikxOworICBmcmVlKGR0KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFJldHVybiBwYXRoIHRvIHRoaXMgbm9kZSwgYXNzZW1ibGVkIHJlY3Vyc2l2ZWx5LgorCisvLyBJbml0aWFsIGNhbGwgY2FuIHBhc3MgaW4gTlVMTCB0byBwbGVuLCBvciBwb2ludCB0byBhbiBpbnQgaW5pdGlhbGl6ZWQgdG8gMAorLy8gdG8gcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHBhdGgsIG9yIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAgdG8gYWxsb2NhdGUKKy8vIGV4dHJhIHNwYWNlIGlmIHlvdSB3YW50IHRvIGFwcGVuZCB5b3VyIG93biB0ZXh0IHRvIHRoZSBzdHJpbmcuCisKK2NoYXIgKmRpcnRyZWVfcGF0aChzdHJ1Y3QgZGlydHJlZSAqbm9kZSwgaW50ICpwbGVuKQoreworICBjaGFyICpwYXRoOworICBpbnQgbGVuOworCisgIGlmICghbm9kZSkgeworICAgIHBhdGggPSB4bWFsbG9jKCpwbGVuKTsKKyAgICAqcGxlbiA9IDA7CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBsZW4gPSAocGxlbiA/ICpwbGVuIDogMCkrc3RybGVuKG5vZGUtPm5hbWUpKzE7CisgIHBhdGggPSBkaXJ0cmVlX3BhdGgobm9kZS0+cGFyZW50LCAmbGVuKTsKKyAgaWYgKGxlbiAmJiBwYXRoW2xlbi0xXSAhPSAnLycpIHBhdGhbbGVuKytdPScvJzsKKyAgbGVuID0gKHN0cGNweShwYXRoK2xlbiwgbm9kZS0+bmFtZSkgLSBwYXRoKTsKKyAgaWYgKHBsZW4pICpwbGVuID0gbGVuOworCisgIHJldHVybiBwYXRoOworfQorCitpbnQgZGlydHJlZV9wYXJlbnRmZChzdHJ1Y3QgZGlydHJlZSAqbm9kZSkKK3sKKyAgcmV0dXJuIG5vZGUtPnBhcmVudCA/IG5vZGUtPnBhcmVudC0+ZGlyZmQgOiBBVF9GRENXRDsKK30KKworLy8gSGFuZGxlIGNhbGxiYWNrIGZvciBhIG5vZGUgaW4gdGhlIHRyZWUuIFJldHVybnMgc2F2ZWQgbm9kZShzKSBpZgorLy8gY2FsbGJhY2sgcmV0dXJucyBESVJUUkVFX1NBVkUsIG90aGVyd2lzZSBmcmVlcyBjb25zdW1lZCBub2RlcyBhbmQKKy8vIHJldHVybnMgTlVMTC4gSWYgIWNhbGxiYWNrIHJldHVybiB0b3Agbm9kZSB1bmNoYW5nZWQuCisvLyBJZiAhbmV3IHJldHVybiBESVJUUkVFX0FCT1JUVkFMCisKK3N0cnVjdCBkaXJ0cmVlICpkaXJ0cmVlX2hhbmRsZV9jYWxsYmFjayhzdHJ1Y3QgZGlydHJlZSAqbmV3LAorICAgICAgICAgIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGlydHJlZSAqbm9kZSkpCit7CisgIGludCBmbGFnczsKKworICBpZiAoIW5ldykgcmV0dXJuIERJUlRSRUVfQUJPUlRWQUw7CisgIGlmICghY2FsbGJhY2spIHJldHVybiBuZXc7CisgIGZsYWdzID0gY2FsbGJhY2sobmV3KTsKKworICBpZiAoU19JU0RJUihuZXctPnN0LnN0X21vZGUpICYmIChmbGFncyAmIChESVJUUkVFX1JFQ1VSU0V8RElSVFJFRV9DT01FQUdBSU4pKSkKKyAgICBmbGFncyA9IGRpcnRyZWVfcmVjdXJzZShuZXcsIGNhbGxiYWNrLAorICAgICAgb3BlbmF0KGRpcnRyZWVfcGFyZW50ZmQobmV3KSwgbmV3LT5uYW1lLCBPX0NMT0VYRUMpLCBmbGFncyk7CisKKyAgLy8gSWYgdGhpcyBoYWQgY2hpbGRyZW4sIGl0IHdhcyBjYWxsYmFjaydzIGpvYiB0byBmcmVlIHRoZW0gYWxyZWFkeS4KKyAgaWYgKCEoZmxhZ3MgJiBESVJUUkVFX1NBVkUpKSB7CisgICAgZnJlZShuZXcpOworICAgIG5ldyA9IE5VTEw7CisgIH0KKworICByZXR1cm4gKGZsYWdzICYgRElSVFJFRV9BQk9SVCk9PURJUlRSRUVfQUJPUlQgPyBESVJUUkVFX0FCT1JUVkFMIDogbmV3OworfQorCisvLyBSZWN1cnNpdmVseSByZWFkL3Byb2Nlc3MgY2hpbGRyZW4gb2YgZGlyZWN0b3J5IG5vZGUsIGZpbHRlcmluZyB0aHJvdWdoCisvLyBjYWxsYmFjaygpLiBVc2VzIGFuZCBjbG9zZXMgc3VwcGxpZWQgLT5kaXJmZC4KKworaW50IGRpcnRyZWVfcmVjdXJzZShzdHJ1Y3QgZGlydHJlZSAqbm9kZSwKKyAgICAgICAgICBpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRpcnRyZWUgKm5vZGUpLCBpbnQgZGlyZmQsIGludCBmbGFncykKK3sKKyAgc3RydWN0IGRpcnRyZWUgKm5ldywgKipkZHQgPSAmKG5vZGUtPmNoaWxkKTsKKyAgc3RydWN0IGRpcmVudCAqZW50cnk7CisgIERJUiAqZGlyOworCisgIG5vZGUtPmRpcmZkID0gZGlyZmQ7CisgIGlmIChub2RlLT5kaXJmZCA9PSAtMSB8fCAhKGRpciA9IGZkb3BlbmRpcihub2RlLT5kaXJmZCkpKSB7CisgICAgaWYgKCEoZmxhZ3MgJiBESVJUUkVFX1NIVVRVUCkpIHsKKyAgICAgIGNoYXIgKnBhdGggPSBkaXJ0cmVlX3BhdGgobm9kZSwgMCk7CisgICAgICBwZXJyb3JfbXNnKCJObyAlcyIsIHBhdGgpOworICAgICAgZnJlZShwYXRoKTsKKyAgICB9CisgICAgY2xvc2Uobm9kZS0+ZGlyZmQpOworCisgICAgcmV0dXJuIGZsYWdzOworICB9CisKKyAgLy8gYWNjb3JkaW5nIHRvIHRoZSBmZGRpcigpIG1hbiBwYWdlLCB0aGUgZmlsZWhhbmRsZSBpbiB0aGUgRElSICogY2FuIHN0aWxsCisgIC8vIGJlIGV4dGVybmFsbHkgdXNlZCBieSB0aGluZ3MgdGhhdCBkb24ndCBsc2VlaygpIGl0LgorCisgIC8vIFRoZSBleHRyYSBwYXJlbnRoZXNlcyBhcmUgdG8gc2h1dCB0aGUgc3R1cGlkIGNvbXBpbGVyIHVwLgorICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgIGlmICghKG5ldyA9IGRpcnRyZWVfYWRkX25vZGUobm9kZSwgZW50cnktPmRfbmFtZSwgZmxhZ3MpKSkgY29udGludWU7CisgICAgbmV3ID0gZGlydHJlZV9oYW5kbGVfY2FsbGJhY2sobmV3LCBjYWxsYmFjayk7CisgICAgaWYgKG5ldyA9PSBESVJUUkVFX0FCT1JUVkFMKSBicmVhazsKKyAgICBpZiAobmV3KSB7CisgICAgICAqZGR0ID0gbmV3OworICAgICAgZGR0ID0gJigoKmRkdCktPm5leHQpOworICAgIH0KKyAgfQorCisgIGlmIChmbGFncyAmIERJUlRSRUVfQ09NRUFHQUlOKSB7CisgICAgbm9kZS0+YWdhaW4rKzsKKyAgICBmbGFncyA9IGNhbGxiYWNrKG5vZGUpOworICB9CisKKyAgLy8gVGhpcyBjbG9zZXMgZmlsZWhhbmRsZSBhcyB3ZWxsLCBzbyBub3RlIGl0CisgIGNsb3NlZGlyKGRpcik7CisgIG5vZGUtPmRpcmZkID0gLTE7CisKKyAgcmV0dXJuIGZsYWdzOworfQorCisvLyBDcmVhdGUgZGlydHJlZSBmcm9tIHBhdGgsIHVzaW5nIGNhbGxiYWNrIHRvIGZpbHRlciBub2Rlcy4gSWYgIWNhbGxiYWNrCisvLyByZXR1cm4ganVzdCB0aGUgdG9wIG5vZGUuIFVzZSBkaXJ0cmVlX25vdGRvdGRvdCBjYWxsYmFjayB0byBhbGxvY2F0ZSBhCisvLyB0cmVlIG9mIHN0cnVjdCBkaXJ0cmVlIG5vZGVzIGFuZCByZXR1cm4gcG9pbnRlciB0byByb290IG5vZGUgZm9yIGxhdGVyCisvLyBwcm9jZXNzaW5nLgorLy8gUmV0dXJucyBESVJUUkVFX0FCT1JUVkFMIGlmIHBhdGggZGlkbid0IGV4aXN0ICh1c2UgRElSVFJFRV9TSFVUVVAgdG8gaGFuZGxlCisvLyBlcnJvciBtZXNzYWdlIHlvdXJzZWxmKS4KKworc3RydWN0IGRpcnRyZWUgKmRpcnRyZWVfZmxhZ3JlYWQoY2hhciAqcGF0aCwgaW50IGZsYWdzLAorICBpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRpcnRyZWUgKm5vZGUpKQoreworICByZXR1cm4gZGlydHJlZV9oYW5kbGVfY2FsbGJhY2soZGlydHJlZV9hZGRfbm9kZSgwLCBwYXRoLCBmbGFncyksIGNhbGxiYWNrKTsKK30KKworLy8gQ29tbW9uIGNhc2UKK3N0cnVjdCBkaXJ0cmVlICpkaXJ0cmVlX3JlYWQoY2hhciAqcGF0aCwgaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkaXJ0cmVlICpub2RlKSkKK3sKKyAgcmV0dXJuIGRpcnRyZWVfZmxhZ3JlYWQocGF0aCwgMCwgY2FsbGJhY2spOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2xpYi9nZXRtb3VudGxpc3QuYyBiL3RveWJveC9saWIvZ2V0bW91bnRsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyODUyYQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9saWIvZ2V0bW91bnRsaXN0LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qIGdldG1vdW50bGlzdC5jIC0gR2V0IGEgbGlua2VkIGxpc3Qgb2YgbW91bnQgcG9pbnRzLCB3aXRoIHN0YXQgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPG1udGVudC5oPgorCisvLyBUcmF2ZXJzZSBhcmdfbGlzdCBvZiBjc3YsIGNhbGxpbmcgY2FsbGJhY2sgb24gZWFjaCB2YWx1ZQordm9pZCBjb21tYV9hcmdzKHN0cnVjdCBhcmdfbGlzdCAqYWwsIHZvaWQgKmRhdGEsIGNoYXIgKmVyciwKKyAgY2hhciAqKCpjYWxsYmFjaykodm9pZCAqZGF0YSwgY2hhciAqc3RyLCBpbnQgbGVuKSkKK3sKKyAgY2hhciAqbmV4dCwgKmFyZzsKKyAgaW50IGxlbjsKKworICBpZiAoQ0ZHX1RPWUJPWF9ERUJVRyAmJiAhZXJyKSBlcnIgPSAiSU5URVJOQUwiOworCisgIHdoaWxlIChhbCkgeworICAgIGFyZyA9IGFsLT5hcmc7CisgICAgd2hpbGUgKChuZXh0ID0gY29tbWFfaXRlcmF0ZSgmYXJnLCAmbGVuKSkpCisgICAgICBpZiAoKG5leHQgPSBjYWxsYmFjayhkYXRhLCBuZXh0LCBsZW4pKSkKKyAgICAgICAgZXJyb3JfZXhpdCgiJXMgJyVzJ1xuJSpjIiwgZXJyLCBhbC0+YXJnLAorICAgICAgICAgIChpbnQpKDUrc3RybGVuKHRveXMud2hpY2gtPm5hbWUpK3N0cmxlbihlcnIpK25leHQtYWwtPmFyZyksICdeJyk7CisgICAgYWwgPSBhbC0+bmV4dDsKKyAgfQorfQorCisvLyBSZWFsbG9jICpvbGQgd2l0aCBvbGRzdHJpbmcsbmV3c3RyaW5nCisKK3ZvaWQgY29tbWFfY29sbGF0ZShjaGFyICoqb2xkLCBjaGFyICpuZXcpCit7CisgIGNoYXIgKnRlbXAsICphdG9sZCA9ICpvbGQ7CisKKyAgLy8gT25seSBhZGQgYSBjb21tYSBpZiBvbGQgc3RyaW5nIGRpZG4ndCBlbmQgd2l0aCBvbmUKKyAgaWYgKGF0b2xkICYmICphdG9sZCkgeworICAgIGNoYXIgKmNvbW1hID0gIiwiOworCisgICAgaWYgKGF0b2xkW3N0cmxlbihhdG9sZCktMV0gPT0gJywnKSBjb21tYSA9ICIiOworICAgIHRlbXAgPSB4bXByaW50ZigiJXMlcyVzIiwgYXRvbGQsIGNvbW1hLCBuZXcpOworICB9IGVsc2UgdGVtcCA9IHhzdHJkdXAobmV3KTsKKyAgZnJlZSAoYXRvbGQpOworICAqb2xkID0gdGVtcDsKK30KKworLy8gaXRlcmF0ZSB0aHJvdWdoIHN0cmluZ3MgaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdC4KKy8vIHJldHVybnMgc3RhcnQgb2YgbmV4dCBlbnRyeSBvciBOVUxMIGlmIG5vbmUKKy8vIHNldHMgKmxlbiB0byBsZW5ndGggb2YgZW50cnkgKG5vdCBpbmNsdWRpbmcgY29tbWEpCisvLyBhZHZhbmNlcyAqbGlzdCB0byBzdGFydCBvZiBuZXh0IGVudHJ5CitjaGFyICpjb21tYV9pdGVyYXRlKGNoYXIgKipsaXN0LCBpbnQgKmxlbikKK3sKKyAgY2hhciAqc3RhcnQgPSAqbGlzdCwgKmVuZDsKKworICBpZiAoISpsaXN0IHx8ICEqKmxpc3QpIHJldHVybiAwOworCisgIGlmICghKGVuZCA9IHN0cmNocigqbGlzdCwgJywnKSkpIHsKKyAgICAqbGVuID0gc3RybGVuKCpsaXN0KTsKKyAgICAqbGlzdCA9IDA7CisgIH0gZWxzZSAqbGlzdCArPSAoKmxlbiA9IGVuZC1zdGFydCkrMTsKKworICByZXR1cm4gc3RhcnQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGFsX2Rlc2xhc2goY2hhciAqcykKK3sKKyAgY2hhciAqbyA9IHM7CisKKyAgd2hpbGUgKCpzKSB7CisgICAgaWYgKCpzID09ICdcXCcpIHsKKyAgICAgIGludCBpLCBvY3QgPSAwOworCisgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmICghaXNkaWdpdChzW2ldKSkgYnJlYWs7CisgICAgICAgIG9jdCA9IChvY3Q8PDMpK3NbaV0tJzAnOworICAgICAgfQorICAgICAgaWYgKGkgPT0gNCkgeworICAgICAgICAqbysrID0gb2N0OworICAgICAgICBzICs9IGk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAqbysrID0gKnMrKzsKKyAgfQorCisgICpvID0gMDsKK30KKworLy8gY2hlY2sgYWxsIGluc3RhbmNlcyBvZiBvcHQgYW5kICJubyJvcHQgaW4gb3B0bGlzdCwgcmV0dXJuIHRydWUgaWYgb3B0CisvLyBmb3VuZCBhbmQgbGFzdCBpbnN0YW5jZSB3YXNuJ3Qgbm8uIElmIGNsZWFuLCByZW1vdmUgZWFjaCBpbnN0YW5jZSBmcm9tIGxpc3QuCitpbnQgY29tbWFfc2NhbihjaGFyICpvcHRsaXN0LCBjaGFyICpvcHQsIGludCBjbGVhbikKK3sKKyAgaW50IG9wdGxlbiA9IHN0cmxlbihvcHQpLCBsZW4sIG5vLCBnb3QgPSAwOworCisgIGlmIChvcHRsaXN0KSBmb3IgKDs7KSB7CisgICAgY2hhciAqcyA9IGNvbW1hX2l0ZXJhdGUoJm9wdGxpc3QsICZsZW4pOworCisgICAgaWYgKCFzKSBicmVhazsKKyAgICBubyA9IDIqKCpzID09ICduJyAmJiBzWzFdID09ICdvJyk7CisgICAgaWYgKG9wdGxlbiA9PSBsZW4tbm8gJiYgIXN0cm5jbXAob3B0LCBzK25vLCBvcHRsZW4pKSB7CisgICAgICBnb3QgPSAhbm87CisgICAgICBpZiAoY2xlYW4gJiYgb3B0bGlzdCkgbWVtbW92ZShzLCBvcHRsaXN0LCBzdHJsZW4ob3B0bGlzdCkrMSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdvdDsKK30KKworLy8gcmV0dXJuIHRydWUgaWYgYWxsIHNjYW5saXN0IG9wdGlvbnMgZW5hYmxlZCBpbiBvcHRsaXN0CitpbnQgY29tbWFfc2NhbmFsbChjaGFyICpvcHRsaXN0LCBjaGFyICpzY2FubGlzdCkKK3sKKyAgaW50IGkgPSAxOworCisgIHdoaWxlIChzY2FubGlzdCAmJiAqc2Nhbmxpc3QpIHsKKyAgICBjaGFyICpvcHQgPSBjb21tYV9pdGVyYXRlKCZzY2FubGlzdCwgJmkpLCAqcyA9IHhzdHJuZHVwKG9wdCwgaSk7CisKKyAgICBpID0gY29tbWFfc2NhbihvcHRsaXN0LCBzLCAwKTsKKyAgICBmcmVlKHMpOworICAgIGlmICghaSkgYnJlYWs7CisgIH0KKworICByZXR1cm4gaTsKK30KKworLy8gQ2hlY2sgaWYgdGhpcyB0eXBlIG1hdGNoZXMgbGlzdC4KKy8vIE9kZCBzeW50YXg6IHR5cGVsaXN0IGFsbCB5ZXMgPSBpZiBhbnksIHR5cGVsaXN0IGFsbCBubyA9IGlmIG5vbmUuCisKK2ludCBtb3VudGxpc3RfaXN0eXBlKHN0cnVjdCBtdGFiX2xpc3QgKm1sLCBjaGFyICp0eXBlbGlzdCkKK3sKKyAgaW50IGxlbiwgc2tpcDsKKyAgY2hhciAqdDsKKworICBpZiAoIXR5cGVsaXN0KSByZXR1cm4gMTsKKworICBza2lwID0gc3RybmNtcCh0eXBlbGlzdCwgIm5vIiwgMik7CisKKyAgZm9yICg7OykgeworICAgIGlmICghKHQgPSBjb21tYV9pdGVyYXRlKCZ0eXBlbGlzdCwgJmxlbikpKSBicmVhazsKKyAgICBpZiAoIXNraXApIHsKKyAgICAgIC8vIElmIG9uZSAtdCBzdGFydHMgd2l0aCAibm8iLCB0aGUgcmVzdCBtdXN0IHRvbworICAgICAgaWYgKHN0cm5jbXAodCwgIm5vIiwgMikpIGVycm9yX2V4aXQoImJhZCB0eXBlbGlzdCIpOworICAgICAgaWYgKCFzdHJuY21wKHQrMiwgbWwtPnR5cGUsIGxlbi0yKSkgeworICAgICAgICBza2lwID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcCh0LCBtbC0+dHlwZSwgbGVuKSAmJiAhbWwtPnR5cGVbbGVuXSkgeworICAgICAgc2tpcCA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gIXNraXA7Cit9CisKKy8vIEdldCBsaXN0IG9mIG1vdW50ZWQgZmlsZXN5c3RlbXMsIGluY2x1ZGluZyBzdGF0IGFuZCBzdGF0dmZzIGluZm8uCisvLyBSZXR1cm5zIGEgcmV2ZXJzZWQgbGlzdCwgd2hpY2ggaXMgZ29vZCBmb3IgZmluZGluZyBvdmVybW91bnRzIGFuZCBzdWNoLgorCitzdHJ1Y3QgbXRhYl9saXN0ICp4Z2V0bW91bnRsaXN0KGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBtdGFiX2xpc3QgKm10bGlzdCA9IDAsICptdDsKKyAgc3RydWN0IG1udGVudCAqbWU7CisgIEZJTEUgKmZwOworICBjaGFyICpwID0gcGF0aCA/IHBhdGggOiAiL3Byb2MvbW91bnRzIjsKKworICBpZiAoIShmcCA9IHNldG1udGVudChwLCAiciIpKSkgcGVycm9yX2V4aXQoImJhZCAlcyIsIHApOworCisgIC8vIFRoZSAidGVzdCIgcGFydCBvZiB0aGUgbG9vcCBpcyBkb25lIGJlZm9yZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIGFuZAorICAvLyBhZ2FpbiBhZnRlciBlYWNoICJpbmNyZW1lbnQiLCBzbyBwdXR0aW5nIHRoZSBhY3R1YWwgbG9hZCB0aGVyZSBhdm9pZHMKKyAgLy8gZHVwbGljYXRpbmcgaXQuIElmIHRoZSBsb2FkIHdhcyBOVUxMLCB0aGUgbG9vcCBzdG9wcy4KKworICB3aGlsZSAoKG1lID0gZ2V0bW50ZW50KGZwKSkpIHsKKyAgICBtdCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGFiX2xpc3QpICsgc3RybGVuKG1lLT5tbnRfZnNuYW1lKSArCisgICAgICBzdHJsZW4obWUtPm1udF9kaXIpICsgc3RybGVuKG1lLT5tbnRfdHlwZSkgKyBzdHJsZW4obWUtPm1udF9vcHRzKSArIDQpOworICAgIGRsaXN0X2FkZF9ub21hbGxvYygodm9pZCAqKSZtdGxpc3QsICh2b2lkICopbXQpOworCisgICAgLy8gQ29sbGVjdCBkZXRhaWxzIGFib3V0IG1vdW50ZWQgZmlsZXN5c3RlbQorICAgIC8vIERvbid0IHJlcG9ydCBlcnJvcnMsIGp1c3QgbGVhdmUgZGF0YSB6ZXJvZWQKKyAgICBpZiAoIXBhdGgpIHsKKyAgICAgIHN0YXQobWUtPm1udF9kaXIsICYobXQtPnN0YXQpKTsKKyAgICAgIHN0YXR2ZnMobWUtPm1udF9kaXIsICYobXQtPnN0YXR2ZnMpKTsKKyAgICB9CisKKyAgICAvLyBSZW1lbWJlciBpbmZvcm1hdGlvbiBmcm9tIC9wcm9jL21vdW50cworICAgIG10LT5kaXIgPSBzdHBjcHkobXQtPnR5cGUsIG1lLT5tbnRfdHlwZSkrMTsKKyAgICBtdC0+ZGV2aWNlID0gc3RwY3B5KG10LT5kaXIsIG1lLT5tbnRfZGlyKSsxOworICAgIG10LT5vcHRzID0gc3RwY3B5KG10LT5kZXZpY2UsIG1lLT5tbnRfZnNuYW1lKSsxOworICAgIHN0cmNweShtdC0+b3B0cywgbWUtPm1udF9vcHRzKTsKKworICAgIG9jdGFsX2Rlc2xhc2gobXQtPmRpcik7CisgICAgb2N0YWxfZGVzbGFzaChtdC0+ZGV2aWNlKTsKKyAgfQorICBlbmRtbnRlbnQoZnApOworCisgIHJldHVybiBtdGxpc3Q7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvbGliL2hlbHAuYyBiL3RveWJveC9saWIvaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTNkZjkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvbGliL2hlbHAuYwpAQCAtMCwwICsxLDM3IEBACisvLyBGdW5jdGlvbiB0byBkaXNwbGF5IGhlbHAgdGV4dAorCisjaW5jbHVkZSAidG95cy5oIgorCisjaWYgIUNGR19UT1lCT1hfSEVMUAordm9pZCBzaG93X2hlbHAoRklMRSAqb3V0KSB7O30KKyNlbHNlCisjaW5jbHVkZSAiZ2VuZXJhdGVkL2hlbHAuaCIKKworI3VuZGVmIE5FV1RPWQorI3VuZGVmIE9MRFRPWQorI2RlZmluZSBORVdUT1kobmFtZSxvcHQsZmxhZ3MpIEhFTFBfIyNuYW1lICJcMCIKKyNpZiBDRkdfVE9ZQk9YCisjZGVmaW5lIE9MRFRPWShuYW1lLG9sZG5hbWUsZmxhZ3MpICJceGZmIiAjb2xkbmFtZSAiXDAiCisjZWxzZQorI2RlZmluZSBPTERUT1kobmFtZSwgb2xkbmFtZSwgZmxhZ3MpIEhFTFBfIyNvbGRuYW1lICJcMCIKKyNlbmRpZgorc3RhdGljIGNoYXIgKmhlbHBfZGF0YSA9CisjaW5jbHVkZSAiZ2VuZXJhdGVkL25ld3RveXMuaCIKKzsKKwordm9pZCBzaG93X2hlbHAoRklMRSAqb3V0KQoreworICBpbnQgaSA9IHRveXMud2hpY2gtdG95X2xpc3Q7CisgIGNoYXIgKnM7CisKKyAgZm9yICg7OykgeworICAgIHMgPSBoZWxwX2RhdGE7CisgICAgd2hpbGUgKGktLSkgcyArPSBzdHJsZW4ocykgKyAxOworICAgIC8vIElmIGl0J3MgYW4gYWxpYXMsIHJlc3RhcnQgc2VhcmNoIGZvciByZWFsIG5hbWUKKyAgICBpZiAoKnMgIT0gMjU1KSBicmVhazsKKyAgICBpID0gdG95X2ZpbmQoKytzKS10b3lfbGlzdDsKKyAgfQorCisgIGZwcmludGYob3V0LCAiJXMiLCBzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG95Ym94L2xpYi9pbnRlcmVzdGluZ3RpbWVzLmMgYi90b3lib3gvbGliL2ludGVyZXN0aW5ndGltZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY3MGNiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9pbnRlcmVzdGluZ3RpbWVzLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIGludGVyZXN0aW5ndGltZXMuYyAtIGN1cnNvciBjb250cm9sCisgKgorICogQ29weXJpZ2h0IDIwMTUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisjaW5jbHVkZSAidG95cy5oIgorCitpbnQgeGdldHR0eSh2b2lkKQoreworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgaWYgKGlzYXR0eShqID0gKGkrMSklMykpIHJldHVybiBqOworCisgIHJldHVybiB4b3BlbigiL2Rldi90dHkiLCBPX1JEV1IpOworfQorCisvLyBRdWljayBhbmQgZGlydHkgcXVlcnkgc2l6ZSBvZiB0ZXJtaW5hbCwgZG9lc24ndCBkbyBBTlNJIHByb2JlIGZhbGxiYWNrLgorLy8gc2V0IHg9ODAgeT0yNSBiZWZvcmUgY2FsbGluZyB0byBwcm92aWRlIGRlZmF1bHRzLiBSZXR1cm5zIDAgaWYgY291bGRuJ3QKKy8vIGRldGVybWluZSBzaXplLgorCitpbnQgdGVybWluYWxfc2l6ZSh1bnNpZ25lZCAqeHgsIHVuc2lnbmVkICp5eSkKK3sKKyAgc3RydWN0IHdpbnNpemUgd3M7CisgIHVuc2lnbmVkIGksIHggPSAwLCB5ID0gMDsKKyAgY2hhciAqczsKKworICAvLyBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIKKyAgZm9yIChpPTA7IGk8MzsgaSsrKSB7CisgICAgbWVtc2V0KCZ3cywgMCwgc2l6ZW9mKHdzKSk7CisgICAgaWYgKCFpb2N0bChpLCBUSU9DR1dJTlNaLCAmd3MpKSB7CisgICAgICBpZiAod3Mud3NfY29sKSB4ID0gd3Mud3NfY29sOworICAgICAgaWYgKHdzLndzX3JvdykgeSA9IHdzLndzX3JvdzsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHMgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKyAgaWYgKHMpIHNzY2FuZihzLCAiJXUiLCAmeCk7CisgIHMgPSBnZXRlbnYoIkxJTkVTIik7CisgIGlmIChzKSBzc2NhbmYocywgIiV1IiwgJnkpOworCisgIC8vIE5ldmVyIHJldHVybiAwIGZvciBlaXRoZXIgdmFsdWUsIGxlYXZlIGl0IGF0IGRlZmF1bHQgaW5zdGVhZC4KKyAgaWYgKHh4ICYmIHgpICp4eCA9IHg7CisgIGlmICh5eSAmJiB5KSAqeXkgPSB5OworCisgIHJldHVybiB4IHx8IHk7Cit9CisKKy8vIFF1ZXJ5IHRlcm1pbmFsIHNpemUsIHNlbmRpbmcgQU5TSSBwcm9iZSBpZiBuZWNlc2FyeS4gKFByb2JlIHF1ZXJpZXMgeHRlcm0KKy8vIHNpemUgdGhyb3VnaCBzZXJpYWwgY29ubmVjdGlvbiwgd2hlbiBsb2NhbCBUVFkgZG9lc24ndCBrbm93IGJ1dCByZW1vdGUgZG9lcy4pCisvLyBSZXR1cm5zIDAgaWYgQU5TSSBwcm9iZSBzZW50LCAxIGlmIHNpemUgZGV0ZXJtaW5lZCBmcm9tIHR0eSBvciBlbnZpcm9ubWVudAorCitpbnQgdGVybWluYWxfcHJvYmVzaXplKHVuc2lnbmVkICp4eCwgdW5zaWduZWQgKnl5KQoreworICBpZiAodGVybWluYWxfc2l6ZSh4eCwgeXkpICYmICgheHggfHwgKnh4KSAmJiAoIXl5IHx8ICp5eSkpIHJldHVybiAxOworCisgIC8vIFNlbmQgcHJvYmU6IGJvb2ttYXJrIGN1cnNvciBwb3NpdGlvbiwganVtcCB0byBib3R0b20gcmlnaHQsCisgIC8vIHF1ZXJ5IHBvc2l0aW9uLCByZXR1cm4gY3Vyc29yIHRvIGJvb2ttYXJrZWQgcG9zaXRpb24uCisgIHhwcmludGYoIlxlW3NcZVs5OTlDXGVbOTk5QlxlWzZuXGVbdSIpOworCisgIHJldHVybiAwOworfQorCisvLyBXcmFwcGVyIHRoYXQgcGFyc2VzIHJlc3VsdHMgZnJvbSBBTlNJIHByb2JlIHRvIHVwZGF0ZSBzY3JlZW5zaXplLgorLy8gT3RoZXJ3aXNlIGFjdHMgbGlrZSBzY2FuX2tleSgpCitpbnQgc2Nhbl9rZXlfZ2V0c2l6ZShjaGFyICpzY3JhdGNoLCBpbnQgbWlsaXdhaXQsIHVuc2lnbmVkICp4eCwgdW5zaWduZWQgKnl5KQoreworICBpbnQga2V5OworCisgIGlmICg1MTImKGtleSA9IHNjYW5fa2V5KHNjcmF0Y2gsIG1pbGl3YWl0KSkpIHsKKyAgICBpZiAoa2V5PjApIHsKKyAgICAgIGlmICh4eCkgKnh4ID0gKGtleT4+MTApJjEwMjM7CisgICAgICBpZiAoeXkpICp5eSA9IChrZXk+PjIwKSYxMDIzOworICAgICAgdG95cy5zaWduYWwgPSBTSUdXSU5DSDsKKworICAgICAgcmV0dXJuIC0zOworICAgIH0KKyAgfQorCisgIHJldHVybiBrZXk7Cit9CisKKy8vIFJlc2V0IHRlcm1pbmFsIHRvIGtub3duIHN0YXRlLCBzYXZpbmcgY29weSBvZiBvbGQgc3RhdGUgaWYgb2xkICE9IE5VTEwuCitpbnQgc2V0X3Rlcm1pbmFsKGludCBmZCwgaW50IHJhdywgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3sKKyAgc3RydWN0IHRlcm1pb3MgdGVybWlvOworCisgIC8vIEZldGNoIGxvY2FsIGNvcHkgb2Ygb2xkIHRlcm1pbmZvLCBhbmQgY29weSBzdHJ1Y3QgY29udGVudHMgdG8gKm9sZCBpZiBzZXQKKyAgaWYgKCF0Y2dldGF0dHIoZmQsICZ0ZXJtaW8pICYmIG9sZCkgKm9sZCA9IHRlcm1pbzsKKworICAvLyB0aGUgZm9sbG93aW5nIGFyZSB0aGUgYml0cyBzZXQgZm9yIGFuIHh0ZXJtLiBMaW51eCB0ZXh0IG1vZGUgVFRZcyBieQorICAvLyBkZWZhdWx0IGFkZCB0d28gYWRkaXRpb25hbCBiaXRzIHRoYXQgb25seSBtYXR0ZXIgZm9yIHNlcmlhbCBwcm9jZXNzaW5nCisgIC8vICh0dXJuIHNlcmlhbCBsaW5lIGJyZWFrIGludG8gYW4gaW50ZXJydXB0LCBhbmQgWE9OL1hPRkYgZmxvdyBjb250cm9sKQorCisgIC8vIEFueSBrZXkgdW5ibG9ja3Mgb3V0cHV0LCBzd2FwIENSIGFuZCBOTCBvbiBpbnB1dAorICB0ZXJtaW8uY19pZmxhZyA9IElYQU5ZfElDUk5MfElOTENSOworICBpZiAodG95cy53aGljaC0+ZmxhZ3MgJiBUT1lGTEFHX0xPQ0FMRSkgdGVybWlvLmNfaWZsYWcgfD0gSVVURjg7CisKKyAgLy8gT3V0cHV0IGFwcGVuZHMgQ1IgdG8gTkwsIGRvZXMgbWFnaWMgdW5kb2N1bWVudGVkIHBvc3Rwcm9jZXNzaW5nCisgIHRlcm1pby5jX29mbGFnID0gT05MQ1J8T1BPU1Q7CisKKyAgLy8gTGVhdmUgc2VyaWFsIHBvcnQgc3BlZWQgYWxvbmUKKyAgLy8gdGVybWlvLmNfY2ZsYWcgPSBDX1JFQUR8Q1M4fEVYVEI7CisKKyAgLy8gR2VuZXJhdGUgc2lnbmFscywgaW5wdXQgZW50aXJlIGxpbmUgYXQgb25jZSwgZWNobyBvdXRwdXQKKyAgLy8gZXJhc2UsIGxpbmUga2lsbCwgZXNjYXBlIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoIF4KKyAgLy8gZXJhc2UgbGluZSBjaGFyIGF0IGEgdGltZQorICAvLyAiZXh0ZW5kZWQiIGJlaGF2aW9yOiBjdHJsLVYgcXVvdGVzIG5leHQgY2hhciwgY3RybC1SIHJlcHJpbnRzIHVucmVhZCBjaGFycywKKyAgLy8gY3RybC1XIGVyYXNlcyB3b3JkCisgIHRlcm1pby5jX2xmbGFnID0gSVNJR3xJQ0FOT058RUNIT3xFQ0hPRXxFQ0hPS3xFQ0hPQ1RMfEVDSE9LRXxJRVhURU47CisKKyAgaWYgKHJhdykgY2ZtYWtlcmF3KCZ0ZXJtaW8pOworCisgIHJldHVybiB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0ZXJtaW8pOworfQorCit2b2lkIHhzZXRfdGVybWluYWwoaW50IGZkLCBpbnQgcmF3LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworICBpZiAoLTEgPT0gc2V0X3Rlcm1pbmFsKGZkLCByYXcsIG9sZCkpIHBlcnJvcl9leGl0KCJiYWQgdHR5IGZkIyVkIiwgZmQpOworfQorCitzdHJ1Y3Qgc2Nhbl9rZXlfbGlzdCB7CisgIGNoYXIgKm5hbWUsICpzZXE7Cit9IHN0YXRpYyBjb25zdCBzY2FuX2tleV9saXN0W10gPSBUQUdHRURfQVJSQVkoS0VZLAorICAvLyB1cCBkb3duIHJpZ2h0IGxlZnQgcGd1cCBwZ2RuIGhvbWUgZW5kIGlucworICB7IlVQIiwgIlwwMzNbQSJ9LCB7IkRPV04iLCAiXDAzM1tCIn0sIHsiUklHSFQiLCAiXDAzM1tDIn0sIHsiTEVGVCIsICJcMDMzW0QifSwKKyAgeyJQR1VQIiwgIlwwMzNbNX4ifSwgeyJQR0ROIiwgIlwwMzNbNn4ifSwgeyJIT01FIiwgIlwwMzNPSCJ9LAorICB7IkVORCIsICJcMDMzT0YifSwgeyJJTlNFUlQiLCAiXDAzM1syfiJ9LAorCisgIHsiRjEiLCAiXDAzM09QIn0sIHsiRjIiLCAiXDAzM09RIn0sIHsiRjMiLCAiXDAzM09SIn0sIHsiRjQiLCAiXDAzM09TIn0sCisgIHsiRjUiLCAiXDAzM1sxNX4ifSwgeyJGNiIsICJcMDMzWzE3fiJ9LCB7IkY3IiwgIlwwMzNbMTh+In0sCisgIHsiRjgiLCAiXDAzM1sxOX4ifSwgeyJGOSIsICJcMDMzWzIwfiJ9LAorCisgIHsiU1VQIiwgIlwwMzNbMTsyQSJ9LCB7IkFVUCIsICJcMDMzWzE7M0EifSwgeyJDVVAiLCAiXDAzM1sxOzVBIn0sCisgIHsiU0RPV04iLCAiXDAzM1sxOzJCIn0sIHsiQURPV04iLCAiXDAzM1sxOzNCIn0sIHsiQ0RPV04iLCAiXDAzM1sxOzVCIn0sCisgIHsiU1JJR0hUIiwgIlwwMzNbMTsyQyJ9LCB7IkFSSUdIVCIsICJcMDMzWzE7M0MifSwgeyJDUklHSFQiLCAiXDAzM1sxOzVDIn0sCisgIHsiU0xFRlQiLCAiXDAzM1sxOzJEIn0sIHsiQUxFRlQiLCAiXDAzM1sxOzNEIn0sIHsiQ0xFRlQiLCAiXDAzM1sxOzVEIn0sCisKKyAgeyJTRjEiLCAiXDAzM08xOzJQIn0sIHsiQUYxIiwgIlwwMzNPMTszUCJ9LCB7IkNGMSIsICJcMDMzWzE7NVAifQorKTsKKworLy8gU2NhbiBzdGRpbiBmb3IgYSBrZXlwcmVzcywgcGFyc2luZyBrbm93biBlc2NhcGUgc2VxdWVuY2VzCisvLyBCbG9ja3MgZm9yIG1pbGl3YWl0IG1pbGlzZWNvbmRzLCBub25lIDAsIGZvcmV2ZXIgaWYgLTEKKy8vIFJldHVybnM6IDAtMjU1PWxpdGVyYWwsIC0xPUVPRiwgLTI9Tk9ORSwgMjU2LS4uLj1pbmRleCBpbnRvIHNjYW5fa2V5X2xpc3QKKy8vID41MTIgaXMgeDw8OSt5PDwyMQorLy8gc2NyYXRjaCBzcGFjZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBsYXN0IGNoYXIgb2YgIXNlcSBjb3VsZCBzdGFydCBuZXcgc2VxCisvLyBaZXJvIG91dCBmaXJzdCBieXRlIG9mIHNjcmF0Y2ggYmVmb3JlIGZpcnN0IGNhbGwgdG8gc2Nhbl9rZXkKKy8vIGJsb2NrPTAgYWxsb3dzIGZldGNoaW5nIG11bHRpcGxlIGNoYXJhY3RlcnMgYmVmb3JlIHVwZGF0aW5nIGRpc3BsYXkKK2ludCBzY2FuX2tleShjaGFyICpzY3JhdGNoLCBpbnQgbWlsaXdhaXQpCit7CisgIHN0cnVjdCBwb2xsZmQgcGZkOworICBpbnQgbWF5YmUsIGksIGo7CisgIGNoYXIgKnRlc3Q7CisKKyAgZm9yICg7OykgeworICAgIHBmZC5mZCA9IDA7CisgICAgcGZkLmV2ZW50cyA9IFBPTExJTjsKKyAgICBwZmQucmV2ZW50cyA9IDA7CisKKyAgICBtYXliZSA9IDA7CisgICAgaWYgKCpzY3JhdGNoKSB7CisgICAgICBpbnQgcG9zWzZdOworICAgICAgdW5zaWduZWQgeCwgeTsKKworICAgICAgLy8gQ2hlY2sgZm9yIHJldHVybiBmcm9tIHRlcm1pbmFsIHNpemUgcHJvYmUKKyAgICAgIG1lbXNldChwb3MsIDAsIDYqc2l6ZW9mKGludCkpOworICAgICAgc2NyYXRjaFsoMSsqc2NyYXRjaCkmMTVdID0gMDsKKyAgICAgIHNzY2FuZihzY3JhdGNoKzEsICJcMDMzJW5bJW4lM3UlbjslbiUzdSVuUiVuIiwgcG9zLCBwb3MrMSwgJnksCisgICAgICAgICAgICAgcG9zKzIsIHBvcyszLCAmeCwgcG9zKzQsIHBvcys1KTsKKyAgICAgIGlmIChwb3NbNV0pIHsKKyAgICAgICAgLy8gUmVjb2duaXplZCBYL1kgcG9zaXRpb24sIGNvbnN1bWUgYW5kIHJldHVybgorICAgICAgICAqc2NyYXRjaCA9IDA7CisgICAgICAgIHJldHVybiA1MTIrKHg8PDEwKSsoeTw8MjApOworICAgICAgfSBlbHNlIGZvciAoaT0wOyBpPDY7IGkrKykgaWYgKHBvc1tpXT09KnNjcmF0Y2gpIG1heWJlID0gMTsKKworICAgICAgLy8gQ2hlY2sgc2VxdWVuY2VzCisgICAgICBmb3IgKGkgPSAwOyBpPEFSUkFZX0xFTihzY2FuX2tleV9saXN0KTsgaSsrKSB7CisgICAgICAgIHRlc3QgPSBzY2FuX2tleV9saXN0W2ldLnNlcTsKKyAgICAgICAgZm9yIChqID0gMDsgajwqc2NyYXRjaDsgaisrKSBpZiAoc2NyYXRjaFtqKzFdICE9IHRlc3Rbal0pIGJyZWFrOworICAgICAgICBpZiAoaiA9PSAqc2NyYXRjaCkgeworICAgICAgICAgIG1heWJlID0gMTsKKyAgICAgICAgICBpZiAoIXRlc3Rbal0pIHsKKyAgICAgICAgICAgIC8vIFdlIHJlY29nbml6ZWQgY3VycmVudCBzZXF1ZW5jZTogY29uc3VtZSBhbmQgcmV0dXJuCisgICAgICAgICAgICAqc2NyYXRjaCA9IDA7CisgICAgICAgICAgICByZXR1cm4gMjU2K2k7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIGN1cnJlbnQgZGF0YSBjYW4ndCBiZSBhIGtub3duIHNlcXVlbmNlLCByZXR1cm4gbmV4dCByYXcgY2hhcgorICAgICAgaWYgKCFtYXliZSkgYnJlYWs7CisgICAgfQorCisgICAgLy8gTmVlZCBtb3JlIGRhdGEgdG8gZGVjaWRlCisKKyAgICAvLyAzMCBtaWxpc2Vjb25kcyBpcyBhYm91dCB0aGUgZ2FwIGJldHdlZW4gY2hhcmFjdGVycyBhdCAzMDAgYmF1ZCAKKyAgICBpZiAobWF5YmUgfHwgbWlsaXdhaXQgIT0gLTEpCisgICAgICBpZiAoIXhwb2xsKCZwZmQsIDEsIG1heWJlID8gMzAgOiBtaWxpd2FpdCkpIGJyZWFrOworCisgICAgLy8gUmVhZCAxIGJ5dGUgc28gd2UgZG9uJ3Qgb3ZlcnNob290IHNlcXVlbmNlIG1hdGNoLiAoV2UgY2FuIGRldmlhdGUKKyAgICAvLyBhbmQgZmFpbCB0byBtYXRjaCwgYnV0IG1hdGNoIGNvbnN1bWVzIGVudGlyZSBidWZmZXIuKQorICAgIGlmICh0b3lzLnNpZ25hbCB8fCAxICE9IHJlYWQoMCwgc2NyYXRjaCsxKypzY3JhdGNoLCAxKSkKKyAgICAgIHJldHVybiB0b3lzLnNpZ25hbCA/IC0zIDogLTE7CisgICAgKysqc2NyYXRjaDsKKyAgfQorCisgIC8vIFdhcyBub3QgYSBzZXF1ZW5jZQorICBpZiAoISpzY3JhdGNoKSByZXR1cm4gLTI7CisgIGkgPSBzY3JhdGNoWzFdOworICBpZiAoLS0qc2NyYXRjaCkgbWVtbW92ZShzY3JhdGNoKzEsIHNjcmF0Y2grMiwgKnNjcmF0Y2gpOworCisgIHJldHVybiBpOworfQorCit2b2lkIHR0eV9lc2MoY2hhciAqcykKK3sKKyAgcHJpbnRmKCJcMDMzWyVzIiwgcyk7Cit9CisKK3ZvaWQgdHR5X2p1bXAoaW50IHgsIGludCB5KQoreworICBjaGFyIHNbMzJdOworCisgIHNwcmludGYocywgIiVkOyVkSCIsIHkrMSwgeCsxKTsKKyAgdHR5X2VzYyhzKTsKK30KKwordm9pZCB0dHlfcmVzZXQodm9pZCkKK3sKKyAgc2V0X3Rlcm1pbmFsKDAsIDAsIDApOworICB0dHlfZXNjKCI/MjVoIik7CisgIHR0eV9lc2MoIjBtIik7CisgIHR0eV9qdW1wKDAsIDk5OSk7CisgIHR0eV9lc2MoIksiKTsKKyAgZmZsdXNoKDApOworfQorCisvLyBJZiB5b3UgY2FsbCBzZXRfdGVybWluYWwoKSwgdXNlIHNpZ2F0ZXhpdCh0dHlfc2lncmVzZXQpOwordm9pZCB0dHlfc2lncmVzZXQoaW50IGkpCit7CisgIHR0eV9yZXNldCgpOworICBfZXhpdChpID8gMTI4K2kgOiAwKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9saWIvbGliLmMgYi90b3lib3gvbGliL2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGI0YTMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvbGliL2xpYi5jCkBAIC0wLDAgKzEsMTIwOSBAQAorLyogbGliLmMgLSB2YXJpb3VzIHJldXNhYmxlIHN0dWZmLgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB2ZXJyb3JfbXNnKGNoYXIgKm1zZywgaW50IGVyciwgdmFfbGlzdCB2YSkKK3sKKyAgY2hhciAqcyA9ICI6ICVzIjsKKworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCB0b3lzLndoaWNoLT5uYW1lKTsKKyAgaWYgKG1zZykgdmZwcmludGYoc3RkZXJyLCBtc2csIHZhKTsKKyAgZWxzZSBzKz0yOworICBpZiAoZXJyKSBmcHJpbnRmKHN0ZGVyciwgcywgc3RyZXJyb3IoZXJyKSk7CisgIGlmIChtc2cgfHwgZXJyKSBwdXRjKCdcbicsIHN0ZGVycik7CisgIGlmICghdG95cy5leGl0dmFsKSB0b3lzLmV4aXR2YWwrKzsKK30KKworLy8gVGhlc2UgZnVuY3Rpb25zIGRvbid0IGNvbGxhcHNlIHRvZ2V0aGVyIGJlY2F1c2Ugb2YgdGhlIHZhX3N0dWZmLgorCit2b2lkIGVycm9yX21zZyhjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCB2YTsKKworICB2YV9zdGFydCh2YSwgbXNnKTsKKyAgdmVycm9yX21zZyhtc2csIDAsIHZhKTsKKyAgdmFfZW5kKHZhKTsKK30KKwordm9pZCBwZXJyb3JfbXNnKGNoYXIgKm1zZywgLi4uKQoreworICB2YV9saXN0IHZhOworCisgIHZhX3N0YXJ0KHZhLCBtc2cpOworICB2ZXJyb3JfbXNnKG1zZywgZXJybm8sIHZhKTsKKyAgdmFfZW5kKHZhKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KK3ZvaWQgZXJyb3JfZXhpdChjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCB2YTsKKworICB2YV9zdGFydCh2YSwgbXNnKTsKKyAgdmVycm9yX21zZyhtc2csIDAsIHZhKTsKKyAgdmFfZW5kKHZhKTsKKworICB4ZXhpdCgpOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGFuZCBzdHJlcnJvcihlcnJubykKK3ZvaWQgcGVycm9yX2V4aXQoY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgdmE7CisKKyAgdmFfc3RhcnQodmEsIG1zZyk7CisgIHZlcnJvcl9tc2cobXNnLCBlcnJubywgdmEpOworICB2YV9lbmQodmEpOworCisgIHhleGl0KCk7Cit9CisKKy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGFmdGVyIHNob3dpbmcgaGVscCB0ZXh0Lgordm9pZCBoZWxwX2V4aXQoY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgdmE7CisKKyAgaWYgKENGR19UT1lCT1hfSEVMUCkgc2hvd19oZWxwKHN0ZGVycik7CisKKyAgaWYgKG1zZykgeworICAgIHZhX3N0YXJ0KHZhLCBtc2cpOworICAgIHZlcnJvcl9tc2cobXNnLCAwLCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgfQorCisgIHhleGl0KCk7Cit9CisKKy8vIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUgcHJpbnRmKCkgYmVoYXZpb3IgKGJlY2F1c2UgeW91J3JlCisvLyBwcmludGluZyB1c2VyLXN1cHBsaWVkIGRhdGEsIG9yIGJlY2F1c2UgYW5kcm9pZCdzIHN0YXRpYyBjaGVja2VyIHByb2R1Y2VzCisvLyBmYWxzZSBwb3NpdGl2ZXMgZm9yICdjaGFyICpzID0geCA/ICJibGFoMSIgOiAiYmxhaDIiOyBwcmludGYocyk7JyBhbmQgaXQncworLy8gLVdlcnJvciB0aGVyZSBmb3IgcG9saWN5IHJlYXNvbnMpLgordm9pZCBlcnJvcl9tc2dfcmF3KGNoYXIgKm1zZykKK3sKKyAgZXJyb3JfbXNnKCIlcyIsIG1zZyk7Cit9CisKK3ZvaWQgcGVycm9yX21zZ19yYXcoY2hhciAqbXNnKQoreworICBwZXJyb3JfbXNnKCIlcyIsIG1zZyk7Cit9CisKK3ZvaWQgZXJyb3JfZXhpdF9yYXcoY2hhciAqbXNnKQoreworICBlcnJvcl9leGl0KCIlcyIsIG1zZyk7Cit9CisKK3ZvaWQgcGVycm9yX2V4aXRfcmF3KGNoYXIgKm1zZykKK3sKKyAgcGVycm9yX2V4aXQoIiVzIiwgbXNnKTsKK30KKworLy8gS2VlcCByZWFkaW5nIHVudGlsIGZ1bGwgb3IgRU9GCitzc2l6ZV90IHJlYWRhbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisgIHNpemVfdCBjb3VudCA9IDA7CisKKyAgd2hpbGUgKGNvdW50PGxlbikgeworICAgIGludCBpID0gcmVhZChmZCwgKGNoYXIgKilidWYrY291bnQsIGxlbi1jb3VudCk7CisgICAgaWYgKCFpKSBicmVhazsKKyAgICBpZiAoaTwwKSByZXR1cm4gaTsKKyAgICBjb3VudCArPSBpOworICB9CisKKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBLZWVwIHdyaXRpbmcgdW50aWwgZG9uZSBvciBFT0YKK3NzaXplX3Qgd3JpdGVhbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIHdoaWxlIChjb3VudDxsZW4pIHsKKyAgICBpbnQgaSA9IHdyaXRlKGZkLCBjb3VudCsoY2hhciAqKWJ1ZiwgbGVuLWNvdW50KTsKKyAgICBpZiAoaTwxKSByZXR1cm4gaTsKKyAgICBjb3VudCArPSBpOworICB9CisKKyAgcmV0dXJuIGNvdW50OworfQorCisvLyBza2lwIHRoaXMgbWFueSBieXRlcyBvZiBpbnB1dC4gUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsID4wIG1lYW5zIHRoaXMgbXVjaAorLy8gbGVmdCBhZnRlciBpbnB1dCBza2lwcGVkLgorb2ZmX3QgbHNraXAoaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisgIG9mZl90IGN1ciA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CisKKyAgaWYgKGN1ciAhPSAtMSkgeworICAgIG9mZl90IGVuZCA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCkgLSBjdXI7CisKKyAgICBpZiAoZW5kID4gMCAmJiBlbmQgPCBvZmZzZXQpIHJldHVybiBvZmZzZXQgLSBlbmQ7CisgICAgZW5kID0gb2Zmc2V0K2N1cjsKKyAgICBpZiAoZW5kID09IGxzZWVrKGZkLCBlbmQsIFNFRUtfU0VUKSkgcmV0dXJuIDA7CisgICAgcGVycm9yX2V4aXQoImxzZWVrIik7CisgIH0KKworICB3aGlsZSAob2Zmc2V0PjApIHsKKyAgICBpbnQgdHJ5ID0gb2Zmc2V0PnNpemVvZihsaWJidWYpID8gc2l6ZW9mKGxpYmJ1ZikgOiBvZmZzZXQsIG9yOworCisgICAgb3IgPSByZWFkYWxsKGZkLCBsaWJidWYsIHRyeSk7CisgICAgaWYgKG9yIDwgMCkgcGVycm9yX2V4aXQoImxza2lwIHRvICVsbGQiLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgZWxzZSBvZmZzZXQgLT0gb3I7CisgICAgaWYgKG9yIDwgdHJ5KSBicmVhazsKKyAgfQorCisgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8vIGZsYWdzOiAxPW1ha2UgbGFzdCBkaXIgKHdpdGggbW9kZSBsYXN0bW9kZSwgb3RoZXJ3aXNlIHNraXBzIGxhc3QgY29tcG9uZW50KQorLy8gICAgICAgIDI9bWFrZSBwYXRoIChhbHJlYWR5IGV4aXN0cyBpcyBvaykKKy8vICAgICAgICA0PXZlcmJvc2UKKy8vIHJldHVybnMgMCA9IHBhdGggb2ssIDEgPSBlcnJvcgoraW50IG1rcGF0aGF0KGludCBhdGZkLCBjaGFyICpkaXIsIG1vZGVfdCBsYXN0bW9kZSwgaW50IGZsYWdzKQoreworICBzdHJ1Y3Qgc3RhdCBidWY7CisgIGNoYXIgKnM7CisKKyAgLy8gbWtkaXIgLXAgb25lL3R3by90aHJlZSBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIHBhdGggYWxyZWFkeSBleGlzdHMsCisgIC8vIGJ1dCBpcyBpZiAidGhyZWUiIGlzIGEgZmlsZS4gVGhlIG90aGVycyB3ZSBkZXJlZmVyZW5jZSBhbmQgY2F0Y2gKKyAgLy8gbm90LWEtZGlyZWN0b3J5IGFsb25nIHRoZSB3YXksIGJ1dCB0aGUgbGFzdCBvbmUgd2UgbXVzdCBleHBsaWNpdGx5CisgIC8vIHRlc3QgZm9yLiBNaWdodCBhcyB3ZWxsIGRvIGl0IHVwIGZyb250LgorCisgIGlmICghZnN0YXRhdChhdGZkLCBkaXIsICZidWYsIDApICYmICFTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgeworICAgIGVycm5vID0gRUVYSVNUOworICAgIHJldHVybiAxOworICB9CisKKyAgZm9yIChzID0gZGlyOyA7cysrKSB7CisgICAgY2hhciBzYXZlID0gMDsKKyAgICBtb2RlX3QgbW9kZSA9ICgwNzc3Jn50b3lzLm9sZF91bWFzayl8MDMwMDsKKworICAgIC8vIGZpbmQgbmV4dCAnLycsIGJ1dCBkb24ndCB0cnkgdG8gbWtkaXIgIiIgYXQgc3RhcnQgb2YgYWJzb2x1dGUgcGF0aAorICAgIGlmICgqcyA9PSAnLycgJiYgKGZsYWdzJjIpICYmIHMgIT0gZGlyKSB7CisgICAgICBzYXZlID0gKnM7CisgICAgICAqcyA9IDA7CisgICAgfSBlbHNlIGlmICgqcykgY29udGludWU7CisKKyAgICAvLyBVc2UgdGhlIG1vZGUgZnJvbSB0aGUgLW0gb3B0aW9uIG9ubHkgZm9yIHRoZSBsYXN0IGRpcmVjdG9yeS4KKyAgICBpZiAoIXNhdmUpIHsKKyAgICAgIGlmIChmbGFncyYxKSBtb2RlID0gbGFzdG1vZGU7CisgICAgICBlbHNlIGJyZWFrOworICAgIH0KKworICAgIGlmIChta2RpcmF0KGF0ZmQsIGRpciwgbW9kZSkpIHsKKyAgICAgIGlmICghKGZsYWdzJjIpIHx8IGVycm5vICE9IEVFWElTVCkgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChmbGFncyY0KQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY3JlYXRlZCBkaXJlY3RvcnkgJyVzJ1xuIiwgdG95cy53aGljaC0+bmFtZSwgZGlyKTsKKworICAgIGlmICghKCpzID0gc2F2ZSkpIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNwbGl0IGEgcGF0aCBpbnRvIGxpbmtlZCBsaXN0IG9mIGNvbXBvbmVudHMsIHRyYWNraW5nIGhlYWQgYW5kIHRhaWwgb2YgbGlzdC4KKy8vIEZpbHRlcnMgb3V0IC8vIGVudHJpZXMgd2l0aCBubyBjb250ZW50cy4KK3N0cnVjdCBzdHJpbmdfbGlzdCAqKnNwbGl0cGF0aChjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipsaXN0KQoreworICBjaGFyICpuZXcgPSBwYXRoOworCisgICpsaXN0ID0gMDsKKyAgZG8geworICAgIGludCBsZW47CisKKyAgICBpZiAoKnBhdGggJiYgKnBhdGggIT0gJy8nKSBjb250aW51ZTsKKyAgICBsZW4gPSBwYXRoLW5ldzsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgKmxpc3QgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyaW5nX2xpc3QpICsgbGVuICsgMSk7CisgICAgICAoKmxpc3QpLT5uZXh0ID0gMDsKKyAgICAgIG1lbWNweSgoKmxpc3QpLT5zdHIsIG5ldywgbGVuKTsKKyAgICAgICgqbGlzdCktPnN0cltsZW5dID0gMDsKKyAgICAgIGxpc3QgPSAmKCpsaXN0KS0+bmV4dDsKKyAgICB9CisgICAgbmV3ID0gcGF0aCsxOworICB9IHdoaWxlICgqcGF0aCsrKTsKKworICByZXR1cm4gbGlzdDsKK30KKworLy8gRmluZCBhbGwgZmlsZSBpbiBhIGNvbG9uLXNlcGFyYXRlZCBwYXRoIHdpdGggYWNjZXNzIHR5cGUgInR5cGUiIChnZW5lcmFsbHkKKy8vIFhfT0sgb3IgUl9PSykuICBSZXR1cm5zIGEgbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0byBlYWNoIGZpbGUgZm91bmQsIGluCisvLyBvcmRlci4KKworc3RydWN0IHN0cmluZ19saXN0ICpmaW5kX2luX3BhdGgoY2hhciAqcGF0aCwgY2hhciAqZmlsZW5hbWUpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqcmxpc3QgPSBOVUxMLCAqKnBybGlzdD0mcmxpc3Q7CisgIGNoYXIgKmN3ZDsKKworICBpZiAoIXBhdGgpIHJldHVybiAwOworCisgIGN3ZCA9IHhnZXRjd2QoKTsKKyAgZm9yICg7OykgeworICAgIGNoYXIgKm5leHQgPSBzdHJjaHIocGF0aCwgJzonKTsKKyAgICBpbnQgbGVuID0gbmV4dCA/IG5leHQtcGF0aCA6IHN0cmxlbihwYXRoKTsKKyAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnJuZXh0OworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgcm5leHQgPSB4bWFsbG9jKHNpemVvZih2b2lkICopICsgc3RybGVuKGZpbGVuYW1lKQorICAgICAgKyAobGVuID8gbGVuIDogc3RybGVuKGN3ZCkpICsgMik7CisgICAgaWYgKCFsZW4pIHNwcmludGYocm5leHQtPnN0ciwgIiVzLyVzIiwgY3dkLCBmaWxlbmFtZSk7CisgICAgZWxzZSB7CisgICAgICBjaGFyICpyZXMgPSBybmV4dC0+c3RyOworCisgICAgICBtZW1jcHkocmVzLCBwYXRoLCBsZW4pOworICAgICAgcmVzICs9IGxlbjsKKyAgICAgICoocmVzKyspID0gJy8nOworICAgICAgc3RyY3B5KHJlcywgZmlsZW5hbWUpOworICAgIH0KKworICAgIC8vIENvbmZpcm0gaXQncyBub3QgYSBkaXJlY3RvcnkuCisgICAgaWYgKCFzdGF0KHJuZXh0LT5zdHIsICZzdCkgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgeworICAgICAgKnBybGlzdCA9IHJuZXh0OworICAgICAgcm5leHQtPm5leHQgPSBOVUxMOworICAgICAgcHJsaXN0ID0gJihybmV4dC0+bmV4dCk7CisgICAgfSBlbHNlIGZyZWUocm5leHQpOworCisgICAgaWYgKCFuZXh0KSBicmVhazsKKyAgICBwYXRoICs9IGxlbjsKKyAgICBwYXRoKys7CisgIH0KKyAgZnJlZShjd2QpOworCisgIHJldHVybiBybGlzdDsKK30KKworbG9uZyBsb25nIGVzdHJ0b2woY2hhciAqc3RyLCBjaGFyICoqZW5kLCBpbnQgYmFzZSkKK3sKKyAgZXJybm8gPSAwOworCisgIHJldHVybiBzdHJ0b2xsKHN0ciwgZW5kLCBiYXNlKTsKK30KKworbG9uZyBsb25nIHhzdHJ0b2woY2hhciAqc3RyLCBjaGFyICoqZW5kLCBpbnQgYmFzZSkKK3sKKyAgbG9uZyBsb25nIGwgPSBlc3RydG9sKHN0ciwgZW5kLCBiYXNlKTsKKworICBpZiAoZXJybm8pIHBlcnJvcl9leGl0X3JhdyhzdHIpOworCisgIHJldHVybiBsOworfQorCisvLyBhdG9sKCkgd2l0aCB0aGUga2lsby9tZWdhL2dpZ2EvdGVyYS9wZXRhL2V4YSBleHRlbnNpb25zLgorLy8gKHpldHRhIGFuZCB5b3R0YSBkb24ndCBmaXQgaW4gNjQgYml0cy4pCitsb25nIGxvbmcgYXRvbHgoY2hhciAqbnVtc3RyKQoreworICBjaGFyICpjID0gbnVtc3RyLCAqc3VmZml4ZXM9ImNia21ndHBlIiwgKmVuZDsKKyAgbG9uZyBsb25nIHZhbDsKKworICB2YWwgPSB4c3RydG9sKG51bXN0ciwgJmMsIDApOworICBpZiAoYyAhPSBudW1zdHIgJiYgKmMgJiYgKGVuZCA9IHN0cmNocihzdWZmaXhlcywgdG9sb3dlcigqYykpKSkgeworICAgIGludCBzaGlmdCA9IGVuZC1zdWZmaXhlcy0yOworCisgICAgaWYgKHNoaWZ0ID49IDApIHsKKyAgICAgIGlmICh0b3VwcGVyKCorK2MpPT0nZCcpIGRvIHZhbCAqPSAxMDAwOyB3aGlsZSAoc2hpZnQtLSk7CisgICAgICBlbHNlIHZhbCAqPSAxMDI0TEw8PChzaGlmdCoxMCk7CisgICAgfQorICB9CisgIHdoaWxlIChpc3NwYWNlKCpjKSkgYysrOworICBpZiAoYz09bnVtc3RyIHx8ICpjKSBlcnJvcl9leGl0KCJub3QgaW50ZWdlcjogJXMiLCBudW1zdHIpOworCisgIHJldHVybiB2YWw7Cit9CisKK2xvbmcgbG9uZyBhdG9seF9yYW5nZShjaGFyICpudW1zdHIsIGxvbmcgbG9uZyBsb3csIGxvbmcgbG9uZyBoaWdoKQoreworICBsb25nIGxvbmcgdmFsID0gYXRvbHgobnVtc3RyKTsKKworICBpZiAodmFsIDwgbG93KSBlcnJvcl9leGl0KCIlbGxkIDwgJWxsZCIsIHZhbCwgbG93KTsKKyAgaWYgKHZhbCA+IGhpZ2gpIGVycm9yX2V4aXQoIiVsbGQgPiAlbGxkIiwgdmFsLCBoaWdoKTsKKworICByZXR1cm4gdmFsOworfQorCitpbnQgc3RyaWR4KGNoYXIgKmhheXN0YWNrLCBjaGFyIG5lZWRsZSkKK3sKKyAgY2hhciAqb2ZmOworCisgIGlmICghbmVlZGxlKSByZXR1cm4gLTE7CisgIG9mZiA9IHN0cmNocihoYXlzdGFjaywgbmVlZGxlKTsKKyAgaWYgKCFvZmYpIHJldHVybiAtMTsKKworICByZXR1cm4gb2ZmLWhheXN0YWNrOworfQorCitjaGFyICpzdHJsb3dlcihjaGFyICpzKQoreworICBjaGFyICp0cnksICpuZXc7CisKKyAgaWYgKCFDRkdfVE9ZQk9YX0kxOE4pIHsKKyAgICB0cnkgPSBuZXcgPSB4c3RyZHVwKHMpOworICAgIGZvciAoOyAqczsgcysrKSAqKG5ldysrKSA9IHRvbG93ZXIoKnMpOworICB9IGVsc2UgeworICAgIC8vIEkgY2FuJ3QgZ3VhcmFudGVlIHRoZSBzdHJpbmcgX3dvbid0XyBleHBhbmQgZHVyaW5nIHJlZW5jb2RpbmcsIHNvLi4uPworICAgIHRyeSA9IG5ldyA9IHhtYWxsb2Moc3RybGVuKHMpKjIrMSk7CisKKyAgICB3aGlsZSAoKnMpIHsKKyAgICAgIHdjaGFyX3QgYzsKKyAgICAgIGludCBsZW4gPSBtYnJ0b3djKCZjLCBzLCBNQl9DVVJfTUFYLCAwKTsKKworICAgICAgaWYgKGxlbiA8IDEpICoobmV3KyspID0gKihzKyspOworICAgICAgZWxzZSB7CisgICAgICAgIHMgKz0gbGVuOworICAgICAgICAvLyBzcXVhc2ggdGl0bGUgY2FzZSB0b28KKyAgICAgICAgYyA9IHRvd2xvd2VyKGMpOworCisgICAgICAgIC8vIGlmIHdlIGhhZCBhIHZhbGlkIHV0Zjggc2VxdWVuY2UsIGNvbnZlcnQgaXQgdG8gbG93ZXIgY2FzZSwgYW5kIGNhbid0CisgICAgICAgIC8vIGVuY29kZSBiYWNrIHRvIHV0ZjgsIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHlvdXIgbGliYy4gQnV0IGp1c3QKKyAgICAgICAgLy8gaW4gY2FzZSBzb21lYm9keSBmaW5kcyBhbiBleHBsb2l0Li4uCisgICAgICAgIGxlbiA9IHdjcnRvbWIobmV3LCBjLCAwKTsKKyAgICAgICAgaWYgKGxlbiA8IDEpIGVycm9yX2V4aXQoImJhZCB1dGY4ICV4IiwgKGludCljKTsKKyAgICAgICAgbmV3ICs9IGxlbjsKKyAgICAgIH0KKyAgICB9CisgICAgKm5ldyA9IDA7CisgIH0KKworICByZXR1cm4gdHJ5OworfQorCisvLyBzdHJzdHIgYnV0IHJldHVybnMgcG9pbnRlciBhZnRlciBtYXRjaAorY2hhciAqc3RyYWZ0ZXIoY2hhciAqaGF5c3RhY2ssIGNoYXIgKm5lZWRsZSkKK3sKKyAgY2hhciAqcyA9IHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKTsKKworICByZXR1cm4gcyA/IHMrc3RybGVuKG5lZWRsZSkgOiBzOworfQorCisvLyBSZW1vdmUgdHJhaWxpbmcgXG4KK2NoYXIgKmNob21wKGNoYXIgKnMpCit7CisgIGNoYXIgKnAgPSBzdHJyY2hyKHMsICdcbicpOworCisgIGlmIChwICYmICFwWzFdKSAqcCA9IDA7CisgIHJldHVybiBzOworfQorCitpbnQgdW5lc2NhcGUoY2hhciBjKQoreworICBjaGFyICpmcm9tID0gIlxcYWJlZm5ydHYiLCAqdG8gPSAiXFxcYVxiXDAzM1xmXG5cclx0XHYiOworICBpbnQgaWR4ID0gc3RyaWR4KGZyb20sIGMpOworCisgIHJldHVybiAoaWR4ID09IC0xKSA/IDAgOiB0b1tpZHhdOworfQorCisvLyBJZiAqYSBzdGFydHMgd2l0aCBiLCBhZHZhbmNlICphIHBhc3QgaXQgYW5kIHJldHVybiAxLCBlbHNlIHJldHVybiAwOworaW50IHN0cnN0YXJ0KGNoYXIgKiphLCBjaGFyICpiKQoreworICBpbnQgbGVuID0gc3RybGVuKGIpLCBpID0gIXN0cm5jbXAoKmEsIGIsIGxlbik7CisKKyAgaWYgKGkpICphICs9IGxlbjsKKworICByZXR1cm4gaTsKK30KKworLy8gUmV0dXJuIGhvdyBsb25nIHRoZSBmaWxlIGF0IGZkIGlzLCBpZiB0aGVyZSdzIGFueSB3YXkgdG8gZGV0ZXJtaW5lIGl0Lgorb2ZmX3QgZmRsZW5ndGgoaW50IGZkKQoreworICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgb2ZmX3QgYmFzZSA9IDAsIHJhbmdlID0gMSwgZXhwYW5kID0gMSwgb2xkOworCisgIGlmICghZnN0YXQoZmQsICZzdCkgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgcmV0dXJuIHN0LnN0X3NpemU7CisKKyAgLy8gSWYgdGhlIGlvY3RsIHdvcmtzIGZvciB0aGlzLCByZXR1cm4gaXQuCisgIC8vIFRPRE86IGlzIGJsb2Nrc2l6ZSBzdGlsbCBhbHdheXMgNTEyLCBvciBkbyB3ZSBzdGF0IGZvciBpdD8KKyAgLy8gdW5zaWduZWQgaW50IHNpemU7CisgIC8vIGlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJnNpemUpID49IDApIHJldHVybiBzaXplKjUxMkw7CisKKyAgLy8gSWYgbm90LCBkbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IGxvY2F0aW9uIHdlIGNhbiByZWFkLiAgKFNvbWUKKyAgLy8gYmxvY2sgZGV2aWNlcyBkb24ndCBkbyBCTEtHRVRTSVpFIHJpZ2h0LikgIFRoaXMgc2hvdWxkIHByb2JhYmx5IGhhdmUKKyAgLy8gYSBDT05GSUcgb3B0aW9uLi4uCisKKyAgLy8gSWYgbm90LCBkbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IGxvY2F0aW9uIHdlIGNhbiByZWFkLgorCisgIG9sZCA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CisgIGRvIHsKKyAgICBjaGFyIHRlbXA7CisgICAgb2ZmX3QgcG9zID0gYmFzZSArIHJhbmdlIC8gMjsKKworICAgIGlmIChsc2VlayhmZCwgcG9zLCAwKT49MCAmJiByZWFkKGZkLCAmdGVtcCwgMSk9PTEpIHsKKyAgICAgIG9mZl90IGRlbHRhID0gKHBvcyArIDEpIC0gYmFzZTsKKworICAgICAgYmFzZSArPSBkZWx0YTsKKyAgICAgIGlmIChleHBhbmQpIHJhbmdlID0gKGV4cGFuZCA8PD0gMSkgLSBiYXNlOworICAgICAgZWxzZSByYW5nZSAtPSBkZWx0YTsKKyAgICB9IGVsc2UgeworICAgICAgZXhwYW5kID0gMDsKKyAgICAgIHJhbmdlID0gcG9zIC0gYmFzZTsKKyAgICB9CisgIH0gd2hpbGUgKHJhbmdlID4gMCk7CisKKyAgbHNlZWsoZmQsIG9sZCwgU0VFS19TRVQpOworCisgIHJldHVybiBiYXNlOworfQorCisvLyBSZWFkIGNvbnRlbnRzIG9mIGZpbGUgYXMgYSBzaW5nbGUgbnVsLXRlcm1pbmF0ZWQgc3RyaW5nLgorLy8gbWVhc3VyZSBmaWxlIHNpemUgaWYgIWxlbiwgYWxsb2NhdGUgYnVmZmVyIGlmICFidWYKKy8vIEV4aXN0aW5nIGJ1ZmZlcnMgbmVlZCBsZW4gaW4gKnBsZW4KKy8vIFJldHVybnMgYW1vdW50IG9mIGRhdGEgcmVhZCBpbiAqcGxlbgorY2hhciAqcmVhZGZpbGVhdChpbnQgZGlyZmQsIGNoYXIgKm5hbWUsIGNoYXIgKmlidWYsIG9mZl90ICpwbGVuKQoreworICBvZmZfdCBsZW4sIHJsZW47CisgIGludCBmZDsKKyAgY2hhciAqYnVmLCAqcmJ1ZjsKKworICAvLyBVbnNhZmUgdG8gcHJvYmUgZm9yIHNpemUgd2l0aCBhIHN1cHBsaWVkIGJ1ZmZlciwgZG9uJ3QgZXZlciBkbyB0aGF0LgorICBpZiAoQ0ZHX1RPWUJPWF9ERUJVRyAmJiAoaWJ1ZiA/ICEqcGxlbiA6ICpwbGVuKSkgZXJyb3JfZXhpdCgiYmFkIHJlYWRmaWxlYXQiKTsKKworICBpZiAoLTEgPT0gKGZkID0gb3BlbmF0KGRpcmZkLCBuYW1lLCBPX1JET05MWSkpKSByZXR1cm4gMDsKKworICAvLyBJZiB3ZSBkdW5ubyB0aGUgbGVuZ3RoLCBwcm9iZSBpdC4gSWYgd2UgY2FuJ3QgcHJvYmUsIHN0YXJ0IHdpdGggMSBwYWdlLgorICBpZiAoISpwbGVuKSB7CisgICAgaWYgKChsZW4gPSBmZGxlbmd0aChmZCkpPjApICpwbGVuID0gbGVuOworICAgIGVsc2UgbGVuID0gNDA5NjsKKyAgfSBlbHNlIGxlbiA9ICpwbGVuLTE7CisKKyAgaWYgKCFpYnVmKSBidWYgPSB4bWFsbG9jKGxlbisxKTsKKyAgZWxzZSBidWYgPSBpYnVmOworCisgIGZvciAocmJ1ZiA9IGJ1Zjs7KSB7CisgICAgcmxlbiA9IHJlYWRhbGwoZmQsIHJidWYsIGxlbik7CisgICAgaWYgKCpwbGVuIHx8IHJsZW48bGVuKSBicmVhazsKKworICAgIC8vIElmIHJlYWRpbmcgdW5rbm93biBzaXplLCBleHBhbmQgYnVmZmVyIGJ5IDEuNSBlYWNoIHRpbWUgd2UgZmlsbCBpdCB1cC4KKyAgICBybGVuICs9IHJidWYtYnVmOworICAgIGJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgbGVuID0gKHJsZW4qMykvMik7CisgICAgcmJ1ZiA9IGJ1ZitybGVuOworICAgIGxlbiAtPSBybGVuOworICB9CisgICpwbGVuID0gbGVuID0gcmxlbisocmJ1Zi1idWYpOworICBjbG9zZShmZCk7CisKKyAgaWYgKHJsZW48MCkgeworICAgIGlmIChpYnVmICE9IGJ1ZikgZnJlZShidWYpOworICAgIGJ1ZiA9IDA7CisgIH0gZWxzZSBidWZbbGVuXSA9IDA7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqcmVhZGZpbGUoY2hhciAqbmFtZSwgY2hhciAqaWJ1Ziwgb2ZmX3QgbGVuKQoreworICByZXR1cm4gcmVhZGZpbGVhdChBVF9GRENXRCwgbmFtZSwgaWJ1ZiwgJmxlbik7Cit9CisKKy8vIFNsZWVwIGZvciB0aGlzIG1hbnkgdGhvdXNhbmR0aHMgb2YgYSBzZWNvbmQKK3ZvaWQgbXNsZWVwKGxvbmcgbWlsaXNlY29uZHMpCit7CisgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICB0cy50dl9zZWMgPSBtaWxpc2Vjb25kcy8xMDAwOworICB0cy50dl9uc2VjID0gKG1pbGlzZWNvbmRzJTEwMDApKjEwMDAwMDA7CisgIG5hbm9zbGVlcCgmdHMsICZ0cyk7Cit9CisKKy8vIEluZWZmaWNpZW50LCBidXQgZGVhbHMgd2l0aCB1bmFsaWduZWQgYWNjZXNzCitpbnQ2NF90IHBlZWtfbGUodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQoreworICBpbnQ2NF90IHJldCA9IDA7CisgIGNoYXIgKmMgPSBwdHI7CisgIGludCBpOworCisgIGZvciAoaT0wOyBpPHNpemU7IGkrKykgcmV0IHw9ICgoaW50NjRfdCljW2ldKTw8KGkqOCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludDY0X3QgcGVla19iZSh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCit7CisgIGludDY0X3QgcmV0ID0gMDsKKyAgY2hhciAqYyA9IHB0cjsKKyAgaW50IGk7CisKKyAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSByZXQgPSAocmV0PDw4KXwoY1tpXSYweGZmKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50NjRfdCBwZWVrKHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgcmV0dXJuIElTX0JJR19FTkRJQU4gPyBwZWVrX2JlKHB0ciwgc2l6ZSkgOiBwZWVrX2xlKHB0ciwgc2l6ZSk7Cit9CisKK3ZvaWQgcG9rZSh2b2lkICpwdHIsIHVpbnQ2NF90IHZhbCwgaW50IHNpemUpCit7CisgIGlmIChzaXplICYgOCkgeworICAgIHZvbGF0aWxlIHVpbnQ2NF90ICpwID0gKHVpbnQ2NF90ICopcHRyOworICAgICpwID0gdmFsOworICB9IGVsc2UgaWYgKHNpemUgJiA0KSB7CisgICAgdm9sYXRpbGUgaW50ICpwID0gKGludCAqKXB0cjsKKyAgICAqcCA9IHZhbDsKKyAgfSBlbHNlIGlmIChzaXplICYgMikgeworICAgIHZvbGF0aWxlIHNob3J0ICpwID0gKHNob3J0ICopcHRyOworICAgICpwID0gdmFsOworICB9IGVsc2UgeworICAgIHZvbGF0aWxlIGNoYXIgKnAgPSAoY2hhciAqKXB0cjsKKyAgICAqcCA9IHZhbDsKKyAgfQorfQorCisvLyBJdGVyYXRlIHRocm91Z2ggYW4gYXJyYXkgb2YgZmlsZXMsIG9wZW5pbmcgZWFjaCBvbmUgYW5kIGNhbGxpbmcgYSBmdW5jdGlvbgorLy8gb24gdGhhdCBmaWxlaGFuZGxlIGFuZCBuYW1lLiAgVGhlIHNwZWNpYWwgZmlsZW5hbWUgIi0iIG1lYW5zIHN0ZGluIGlmCisvLyBmbGFncyBpcyBPX1JET05MWSwgc3Rkb3V0IG90aGVyd2lzZS4gIEFuIGVtcHR5IGFyZ3VtZW50IGxpc3QgY2FsbHMKKy8vIGZ1bmN0aW9uKCkgb24ganVzdCBzdGRpbi9zdGRvdXQuCisvLworLy8gTm90ZTogcGFzcyBPX0NMT0VYRUMgdG8gYXV0b21hdGljYWxseSBjbG9zZSBmaWxlaGFuZGxlcyB3aGVuIGZ1bmN0aW9uKCkKKy8vIHJldHVybnMsIG90aGVyd2lzZSBmaWxlaGFuZGxlcyBtdXN0IGJlIGNsb3NlZCBieSBmdW5jdGlvbigpCit2b2lkIGxvb3BmaWxlc19ydyhjaGFyICoqYXJndiwgaW50IGZsYWdzLCBpbnQgcGVybWlzc2lvbnMsIGludCBmYWlsb2ssCisgIHZvaWQgKCpmdW5jdGlvbikoaW50IGZkLCBjaGFyICpuYW1lKSkKK3sKKyAgaW50IGZkOworCisgIC8vIElmIG5vIGFyZ3VtZW50cywgcmVhZCBmcm9tIHN0ZGluLgorICBpZiAoISphcmd2KSBmdW5jdGlvbigoZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZID8gMSA6IDAsICItIik7CisgIGVsc2UgZG8geworICAgIC8vIEZpbGVuYW1lICItIiBtZWFucyByZWFkIGZyb20gc3RkaW4uCisgICAgLy8gSW5hYmlsaXR5IHRvIG9wZW4gYSBmaWxlIHByaW50cyBhIHdhcm5pbmcsIGJ1dCBkb2Vzbid0IGV4aXQuCisKKyAgICBpZiAoIXN0cmNtcCgqYXJndiwgIi0iKSkgZmQ9MDsKKyAgICBlbHNlIGlmICgwPihmZCA9IG9wZW4oKmFyZ3YsIGZsYWdzLCBwZXJtaXNzaW9ucykpICYmICFmYWlsb2spIHsKKyAgICAgIHBlcnJvcl9tc2dfcmF3KCphcmd2KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmdW5jdGlvbihmZCwgKmFyZ3YpOworICAgIGlmICgoZmxhZ3MgJiBPX0NMT0VYRUMpICYmIGZkKSBjbG9zZShmZCk7CisgIH0gd2hpbGUgKCorK2FyZ3YpOworfQorCisvLyBDYWxsIGxvb3BmaWxlc19ydyB3aXRoIE9fUkRPTkxZfE9fQ0xPRVhFQyBhbmQgIWZhaWxvayAoY29tbW9uIGNhc2UpLgordm9pZCBsb29wZmlsZXMoY2hhciAqKmFyZ3YsIHZvaWQgKCpmdW5jdGlvbikoaW50IGZkLCBjaGFyICpuYW1lKSkKK3sKKyAgbG9vcGZpbGVzX3J3KGFyZ3YsIE9fUkRPTkxZfE9fQ0xPRVhFQywgMCwgMCwgZnVuY3Rpb24pOworfQorCisvLyBTbG93LCBidXQgc21hbGwuCisKK2NoYXIgKmdldF9yYXdsaW5lKGludCBmZCwgbG9uZyAqcGxlbiwgY2hhciBlbmQpCit7CisgIGNoYXIgYywgKmJ1ZiA9IE5VTEw7CisgIGxvbmcgbGVuID0gMDsKKworICBmb3IgKDs7KSB7CisgICAgaWYgKDE+cmVhZChmZCwgJmMsIDEpKSBicmVhazsKKyAgICBpZiAoIShsZW4gJiA2MykpIGJ1Zj14cmVhbGxvYyhidWYsIGxlbis2NSk7CisgICAgaWYgKChidWZbbGVuKytdPWMpID09IGVuZCkgYnJlYWs7CisgIH0KKyAgaWYgKGJ1ZikgYnVmW2xlbl09MDsKKyAgaWYgKHBsZW4pICpwbGVuID0gbGVuOworCisgIHJldHVybiBidWY7Cit9CisKK2NoYXIgKmdldF9saW5lKGludCBmZCkKK3sKKyAgbG9uZyBsZW47CisgIGNoYXIgKmJ1ZiA9IGdldF9yYXdsaW5lKGZkLCAmbGVuLCAnXG4nKTsKKworICBpZiAoYnVmICYmIGJ1ZlstLWxlbl09PSdcbicpIGJ1ZltsZW5dPTA7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IHdmY2htb2RhdChpbnQgZmQsIGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlKQoreworICBpbnQgcmMgPSBmY2htb2RhdChmZCwgbmFtZSwgbW9kZSwgMCk7CisKKyAgaWYgKHJjKSB7CisgICAgcGVycm9yX21zZygiY2htb2QgJyVzJyB0byAlMDRvIiwgbmFtZSwgbW9kZSk7CisgICAgdG95cy5leGl0dmFsPTE7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgY2hhciAqdGVtcGZpbGUyemFwOworc3RhdGljIHZvaWQgdGVtcGZpbGVfaGFuZGxlcih2b2lkKQoreworICBpZiAoMSA8IChsb25nKXRlbXBmaWxlMnphcCkgdW5saW5rKHRlbXBmaWxlMnphcCk7Cit9CisKKy8vIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSB0byBjb3B5IGFuIGV4aXN0aW5nIGZpbGUgaW50by4KK2ludCBjb3B5X3RlbXBmaWxlKGludCBmZGluLCBjaGFyICpuYW1lLCBjaGFyICoqdGVtcG5hbWUpCit7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgIGludCBmZDsKKworICAqdGVtcG5hbWUgPSB4bXByaW50ZigiJXMlcyIsIG5hbWUsICJYWFhYWFgiKTsKKyAgaWYoLTEgPT0gKGZkID0gbWtzdGVtcCgqdGVtcG5hbWUpKSkgZXJyb3JfZXhpdCgibm8gdGVtcCBmaWxlIik7CisgIGlmICghdGVtcGZpbGUyemFwKSBzaWdhdGV4aXQodGVtcGZpbGVfaGFuZGxlcik7CisgIHRlbXBmaWxlMnphcCA9ICp0ZW1wbmFtZTsKKworICAvLyBTZXQgcGVybWlzc2lvbnMgb2Ygb3V0cHV0IGZpbGUKKworICBmc3RhdChmZGluLCAmc3RhdGJ1Zik7CisgIGZjaG1vZChmZCwgc3RhdGJ1Zi5zdF9tb2RlKTsKKworICByZXR1cm4gZmQ7Cit9CisKKy8vIEFib3J0IHRoZSBjb3B5IGFuZCBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlLgordm9pZCBkZWxldGVfdGVtcGZpbGUoaW50IGZkaW4sIGludCBmZG91dCwgY2hhciAqKnRlbXBuYW1lKQoreworICBjbG9zZShmZGluKTsKKyAgY2xvc2UoZmRvdXQpOworICBpZiAoKnRlbXBuYW1lKSB1bmxpbmsoKnRlbXBuYW1lKTsKKyAgdGVtcGZpbGUyemFwID0gKGNoYXIgKikxOworICBmcmVlKCp0ZW1wbmFtZSk7CisgICp0ZW1wbmFtZSA9IE5VTEw7Cit9CisKKy8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHdpdGggdGhlIGNvcHkuCit2b2lkIHJlcGxhY2VfdGVtcGZpbGUoaW50IGZkaW4sIGludCBmZG91dCwgY2hhciAqKnRlbXBuYW1lKQoreworICBjaGFyICp0ZW1wID0geHN0cmR1cCgqdGVtcG5hbWUpOworCisgIHRlbXBbc3RybGVuKHRlbXApLTZdPTA7CisgIGlmIChmZGluICE9IC0xKSB7CisgICAgeHNlbmRmaWxlKGZkaW4sIGZkb3V0KTsKKyAgICB4Y2xvc2UoZmRpbik7CisgIH0KKyAgeGNsb3NlKGZkb3V0KTsKKyAgcmVuYW1lKCp0ZW1wbmFtZSwgdGVtcCk7CisgIHRlbXBmaWxlMnphcCA9IChjaGFyICopMTsKKyAgZnJlZSgqdGVtcG5hbWUpOworICBmcmVlKHRlbXApOworICAqdGVtcG5hbWUgPSBOVUxMOworfQorCisvLyBDcmVhdGUgYSAyNTYgZW50cnkgQ1JDMzIgbG9va3VwIHRhYmxlLgorCit2b2lkIGNyY19pbml0KHVuc2lnbmVkIGludCAqY3JjX3RhYmxlLCBpbnQgbGl0dGxlX2VuZGlhbikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLy8gSW5pdCB0aGUgQ1JDMzIgdGFibGUgKGJpZyBlbmRpYW4pCisgIGZvciAoaT0wOyBpPDI1NjsgaSsrKSB7CisgICAgdW5zaWduZWQgaW50IGosIGMgPSBsaXR0bGVfZW5kaWFuID8gaSA6IGk8PDI0OworICAgIGZvciAoaj04OyBqOyBqLS0pCisgICAgICBpZiAobGl0dGxlX2VuZGlhbikgYyA9IChjJjEpID8gKGM+PjEpXjB4RURCODgzMjAgOiBjPj4xOworICAgICAgZWxzZSBjPWMmMHg4MDAwMDAwMCA/IChjPDwxKV4weDA0YzExZGI3IDogKGM8PDEpOworICAgIGNyY190YWJsZVtpXSA9IGM7CisgIH0KK30KKworLy8gSW5pdCBiYXNlNjQgdGFibGUKKwordm9pZCBiYXNlNjRfaW5pdChjaGFyICpwKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAnQSc7IGkgIT0gJzonOyBpKyspIHsKKyAgICBpZiAoaSA9PSAnWicrMSkgaSA9ICdhJzsKKyAgICBpZiAoaSA9PSAneicrMSkgaSA9ICcwJzsKKyAgICAqKHArKykgPSBpOworICB9CisgICoocCsrKSA9ICcrJzsKKyAgKihwKyspID0gJy8nOworfQorCitpbnQgeWVzbm8oaW50IGRlZikKK3sKKyAgY2hhciBidWY7CisKKyAgZnByaW50ZihzdGRlcnIsICIgKCVjLyVjKToiLCBkZWYgPyAnWScgOiAneScsIGRlZiA/ICduJyA6ICdOJyk7CisgIGZmbHVzaChzdGRlcnIpOworICB3aGlsZSAoZnJlYWQoJmJ1ZiwgMSwgMSwgc3RkaW4pKSB7CisgICAgaW50IG5ldzsKKworICAgIC8vIFRoZSBsZXR0ZXIgY2hhbmdlcyB0aGUgdmFsdWUsIHRoZSBuZXdsaW5lIChvciBzcGFjZSkgcmV0dXJucyBpdC4KKyAgICBpZiAoaXNzcGFjZShidWYpKSBicmVhazsKKyAgICBpZiAoLTEgIT0gKG5ldyA9IHN0cmlkeCgibnkiLCB0b2xvd2VyKGJ1ZikpKSkgZGVmID0gbmV3OworICB9CisKKyAgcmV0dXJuIGRlZjsKK30KKworc3RydWN0IHNpZ25hbWUgeworICBpbnQgbnVtOworICBjaGFyICpuYW1lOworfTsKKworLy8gU2lnbmFscyByZXF1aXJlZCBieSBQT1NJWCAyMDA4OgorLy8gaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvYmFzZWRlZnMvc2lnbmFsLmguaHRtbAorCisjZGVmaW5lIFNJR05JRlkoeCkge1NJRyMjeCwgI3h9CisKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmFtZSBzaWduYW1lc1tdID0geworICBTSUdOSUZZKEFCUlQpLCBTSUdOSUZZKEFMUk0pLCBTSUdOSUZZKEJVUyksCisgIFNJR05JRlkoRlBFKSwgU0lHTklGWShIVVApLCBTSUdOSUZZKElMTCksIFNJR05JRlkoSU5UKSwgU0lHTklGWShLSUxMKSwKKyAgU0lHTklGWShQSVBFKSwgU0lHTklGWShRVUlUKSwgU0lHTklGWShTRUdWKSwgU0lHTklGWShURVJNKSwKKyAgU0lHTklGWShVU1IxKSwgU0lHTklGWShVU1IyKSwgU0lHTklGWShTWVMpLCBTSUdOSUZZKFRSQVApLAorICBTSUdOSUZZKFZUQUxSTSksIFNJR05JRlkoWENQVSksIFNJR05JRlkoWEZTWiksCisKKyAgLy8gU3RhcnQgb2Ygbm9uLXRlcm1pbmFsIHNpZ25hbHMKKworICBTSUdOSUZZKENITEQpLCBTSUdOSUZZKENPTlQpLCBTSUdOSUZZKFNUT1ApLCBTSUdOSUZZKFRTVFApLAorICBTSUdOSUZZKFRUSU4pLCBTSUdOSUZZKFRUT1UpLCBTSUdOSUZZKFVSRykKK307CisKKy8vIG5vdCBpbiBwb3NpeDogU0lHTklGWShTVEtGTFQpLCBTSUdOSUZZKFdJTkNIKSwgU0lHTklGWShJTyksIFNJR05JRlkoUFdSKQorLy8gb2Jzb2xldGU6IFNJR05JRlkoUFJPRikgU0lHTklGWShQT0xMKQorCisvLyBIYW5kbGVyIHRoYXQgc2V0cyB0b3lzLnNpZ25hbCwgYW5kIHdyaXRlcyB0byB0b3lzLnNpZ25hbGZkIGlmIHNldAordm9pZCBnZW5lcmljX3NpZ25hbChpbnQgc2lnKQoreworICBpZiAodG95cy5zaWduYWxmZCkgeworICAgIGNoYXIgYyA9IHNpZzsKKworICAgIHdyaXRlYWxsKHRveXMuc2lnbmFsZmQsICZjLCAxKTsKKyAgfQorICB0b3lzLnNpZ25hbCA9IHNpZzsKK30KKwordm9pZCBleGl0X3NpZ25hbChpbnQgc2lnKQoreworICBpZiAoc2lnKSB0b3lzLmV4aXR2YWwgPSBzaWd8MTI4OworICB4ZXhpdCgpOworfQorCisvLyBJbnN0YWxsIHRoZSBzYW1lIGhhbmRsZXIgb24gZXZlcnkgc2lnbmFsIHRoYXQgZGVmYXVsdHMgdG8ga2lsbGluZyB0aGUKKy8vIHByb2Nlc3MsIGNhbGxpbmcgdGhlIGhhbmRsZXIgb24gdGhlIHdheSBvdXQuIENhbGxpbmcgbXVsdGlwbGUgdGltZXMKKy8vIGFkZHMgdGhlIGhhbmRsZXJzIHRvIGEgbGlzdCwgdG8gYmUgY2FsbGVkIGluIG9yZGVyLgordm9pZCBzaWdhdGV4aXQodm9pZCAqaGFuZGxlcikKK3sKKyAgc3RydWN0IGFyZ19saXN0ICphbCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICBpbnQgaTsKKworICBmb3IgKGk9MDsgc2lnbmFtZXNbaV0ubnVtICE9IFNJR0NITEQ7IGkrKykKKyAgICBzaWduYWwoc2lnbmFtZXNbaV0ubnVtLCBleGl0X3NpZ25hbCk7CisgIGFsLT5uZXh0ID0gdG95cy54ZXhpdDsKKyAgYWwtPmFyZyA9IGhhbmRsZXI7CisgIHRveXMueGV4aXQgPSBhbDsKK30KKworLy8gQ29udmVydCBuYW1lIHRvIHNpZ25hbCBudW1iZXIuICBJZiBuYW1lID09IE5VTEwgcHJpbnQgbmFtZXMuCitpbnQgc2lnX3RvX251bShjaGFyICpwaWRzdHIpCit7CisgIGludCBpOworCisgIGlmIChwaWRzdHIpIHsKKyAgICBjaGFyICpzOworCisgICAgaSA9IGVzdHJ0b2wocGlkc3RyLCAmcywgMTApOworICAgIGlmICghZXJybm8gJiYgISpzKSByZXR1cm4gaTsKKworICAgIGlmICghc3RybmNhc2VjbXAocGlkc3RyLCAic2lnIiwgMykpIHBpZHN0cis9MzsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbWVzKS9zaXplb2Yoc3RydWN0IHNpZ25hbWUpOyBpKyspCisgICAgaWYgKCFwaWRzdHIpIHhwdXRzKHNpZ25hbWVzW2ldLm5hbWUpOworICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKHBpZHN0ciwgc2lnbmFtZXNbaV0ubmFtZSkpIHJldHVybiBzaWduYW1lc1tpXS5udW07CisKKyAgcmV0dXJuIC0xOworfQorCitjaGFyICpudW1fdG9fc2lnKGludCBzaWcpCit7CisgIGludCBpOworCisgIGZvciAoaT0wOyBpPHNpemVvZihzaWduYW1lcykvc2l6ZW9mKHN0cnVjdCBzaWduYW1lKTsgaSsrKQorICAgIGlmIChzaWduYW1lc1tpXS5udW0gPT0gc2lnKSByZXR1cm4gc2lnbmFtZXNbaV0ubmFtZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIHByZW11dGUgbW9kZSBiaXRzIGJhc2VkIG9uIHBvc2l4IG1vZGUgc3RyaW5ncy4KK21vZGVfdCBzdHJpbmdfdG9fbW9kZShjaGFyICptb2Rlc3RyLCBtb2RlX3QgbW9kZSkKK3sKKyAgY2hhciAqd2hvcyA9ICJvZ3VhIiwgKmhvd3MgPSAiPSstIiwgKndoYXRzID0gInh3cnN0WCIsICp3aHlzID0gIm9ndSIsCisgICAgICAgKnMsICpzdHIgPSBtb2Rlc3RyOworICBtb2RlX3QgZXh0cmFiaXRzID0gbW9kZSAmIH4oMDc3NzcpOworCisgIC8vIEhhbmRsZSBvY3RhbCBtb2RlCisgIGlmIChpc2RpZ2l0KCpzdHIpKSB7CisgICAgbW9kZSA9IGVzdHJ0b2woc3RyLCAmcywgOCk7CisgICAgaWYgKGVycm5vIHx8ICpzIHx8IChtb2RlICYgfigwNzc3NykpKSBnb3RvIGJhcmY7CisKKyAgICByZXR1cm4gbW9kZSB8IGV4dHJhYml0czsKKyAgfQorCisgIC8vIEdhemUgaW50byB0aGUgYmluIG9mIHBlcm1pc3Npb24uLi4KKyAgZm9yICg7OykgeworICAgIGludCBpLCBqLCBkb3dobywgZG9ob3csIGRvd2hhdCwgYW1hc2s7CisKKyAgICBkb3dobyA9IGRvaG93ID0gZG93aGF0ID0gYW1hc2sgPSAwOworCisgICAgLy8gRmluZCB0aGUgd2hvLCBob3csIGFuZCB3aGF0IHN0YW56YXMsIGluIHRoYXQgb3JkZXIKKyAgICB3aGlsZSAoKnN0ciAmJiAocyA9IHN0cmNocih3aG9zLCAqc3RyKSkpIHsKKyAgICAgIGRvd2hvIHw9IDE8PChzLXdob3MpOworICAgICAgc3RyKys7CisgICAgfQorICAgIC8vIElmIHdobyBpc24ndCBzcGVjaWZpZWQsIGxpa2UgImEiIGJ1dCBob25vcmluZyB1bWFzay4KKyAgICBpZiAoIWRvd2hvKSB7CisgICAgICBkb3dobyA9IDg7CisgICAgICB1bWFzayhhbWFzaz11bWFzaygwKSk7CisgICAgfQorICAgIGlmICghKnN0ciB8fCAhKHMgPSBzdHJjaHIoaG93cywgKnN0cikpKSBnb3RvIGJhcmY7CisgICAgZG9ob3cgPSAqKHN0cisrKTsKKworICAgIGlmICghZG9ob3cpIGdvdG8gYmFyZjsKKyAgICB3aGlsZSAoKnN0ciAmJiAocyA9IHN0cmNocih3aGF0cywgKnN0cikpKSB7CisgICAgICBkb3doYXQgfD0gMTw8KHMtd2hhdHMpOworICAgICAgc3RyKys7CisgICAgfQorCisgICAgLy8gQ29udmVydCBYIHRvIHggZm9yIGRpcmVjdG9yeSBvciBpZiBhbHJlYWR5IGV4ZWN1dGFibGUgc29tZXdoZXJlCisgICAgaWYgKChkb3doYXQmMzIpICYmICAoU19JU0RJUihtb2RlKSB8fCAobW9kZSYwMTExKSkpIGRvd2hhdCB8PSAxOworCisgICAgLy8gQ29weSBtb2RlIGZyb20gYW5vdGhlciBjYXRlZ29yeT8KKyAgICBpZiAoIWRvd2hhdCAmJiAqc3RyICYmIChzID0gc3RyY2hyKHdoeXMsICpzdHIpKSkgeworICAgICAgZG93aGF0ID0gKG1vZGU+PigzKihzLXdoeXMpKSkmNzsKKyAgICAgIHN0cisrOworICAgIH0KKworICAgIC8vIEFyZSB3ZSByZWFkeSB0byBkbyBhIHRoaW5nIHlldD8KKyAgICBpZiAoKnN0ciAmJiAqKHN0cisrKSAhPSAnLCcpIGdvdG8gYmFyZjsKKworICAgIC8vIE9rLCBhcHBseSB0aGUgYml0cyB0byB0aGUgbW9kZS4KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgIGZvciAoaj0wOyBqPDM7IGorKykgeworICAgICAgICBtb2RlX3QgYml0ID0gMDsKKyAgICAgICAgaW50IHdoZXJlID0gMTw8KCgzKmkpK2opOworCisgICAgICAgIGlmIChhbWFzayAmIHdoZXJlKSBjb250aW51ZTsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IG5ldyB2YWx1ZSBhdCB0aGlzIGxvY2F0aW9uCisgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICAvLyBzdWlkL3N0aWNreSBiaXQuCisgICAgICAgICAgaWYgKGopIHsKKyAgICAgICAgICAgIGlmICgoZG93aGF0ICYgOCkgJiYgKGRvd2hvJig4fCgxPDxpKSkpKSBiaXQrKzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGRvd2hhdCAmIDE2KSBiaXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIShkb3dobyYoOHwoMTw8aSkpKSkgY29udGludWU7CisgICAgICAgICAgaWYgKGRvd2hhdCYoMTw8aikpIGJpdCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBzZWxlY3Rpb24gYWN0aXZlLCBtb2RpZnkgYml0CisKKyAgICAgICAgaWYgKGRvaG93ID09ICc9JyB8fCAoYml0ICYmIGRvaG93ID09ICctJykpIG1vZGUgJj0gfndoZXJlOworICAgICAgICBpZiAoYml0ICYmIGRvaG93ICE9ICctJykgbW9kZSB8PSB3aGVyZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISpzdHIpIGJyZWFrOworICB9CisKKyAgcmV0dXJuIG1vZGV8ZXh0cmFiaXRzOworYmFyZjoKKyAgZXJyb3JfZXhpdCgiYmFkIG1vZGUgJyVzJyIsIG1vZGVzdHIpOworfQorCisvLyBGb3JtYXQgYWNjZXNzIG1vZGUgaW50byBhIGRyd3hyd3hyd3ggc3RyaW5nCit2b2lkIG1vZGVfdG9fc3RyaW5nKG1vZGVfdCBtb2RlLCBjaGFyICpidWYpCit7CisgIGNoYXIgYywgZDsKKyAgaW50IGksIGJpdDsKKworICBidWZbMTBdPTA7CisgIGZvciAoaT0wOyBpPDk7IGkrKykgeworICAgIGJpdCA9IG1vZGUgJiAoMTw8aSk7CisgICAgYyA9IGklMzsKKyAgICBpZiAoIWMgJiYgKG1vZGUgJiAoMTw8KChkPWkvMykrOSkpKSkgeworICAgICAgYyA9ICJ0c3MiW2RdOworICAgICAgaWYgKCFiaXQpIGMgJj0gfjB4MjA7CisgICAgfSBlbHNlIGMgPSBiaXQgPyAieHdyIltjXSA6ICctJzsKKyAgICBidWZbOS1pXSA9IGM7CisgIH0KKworICBpZiAoU19JU0RJUihtb2RlKSkgYyA9ICdkJzsKKyAgZWxzZSBpZiAoU19JU0JMSyhtb2RlKSkgYyA9ICdiJzsKKyAgZWxzZSBpZiAoU19JU0NIUihtb2RlKSkgYyA9ICdjJzsKKyAgZWxzZSBpZiAoU19JU0xOSyhtb2RlKSkgYyA9ICdsJzsKKyAgZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpIGMgPSAncCc7CisgIGVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKSBjID0gJ3MnOworICBlbHNlIGMgPSAnLSc7CisgICpidWYgPSBjOworfQorCisvLyBiYXNlbmFtZSgpIGNhbiBtb2RpZnkgaXRzIGFyZ3VtZW50IG9yIHJldHVybiBhIHBvaW50ZXIgdG8gYSBjb25zdGFudCBzdHJpbmcKKy8vIFRoaXMganVzdCBnaXZlcyBhZnRlciB0aGUgbGFzdCAnLycgb3IgdGhlIHdob2xlIHN0aXJuZyBpZiBubyAvCitjaGFyICpnZXRiYXNlbmFtZShjaGFyICpuYW1lKQoreworICBjaGFyICpzID0gc3RycmNocihuYW1lLCAnLycpOworCisgIGlmIChzKSByZXR1cm4gcysxOworCisgIHJldHVybiBuYW1lOworfQorCisvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGVhY2ggUElEIHRoYXQgbWF0Y2hlcyBhIHByb2Nlc3MgbmFtZSBmcm9tIGEgbGlzdC4KK3ZvaWQgbmFtZXNfdG9fcGlkKGNoYXIgKipuYW1lcywgaW50ICgqY2FsbGJhY2spKHBpZF90IHBpZCwgY2hhciAqbmFtZSkpCit7CisgIERJUiAqZHA7CisgIHN0cnVjdCBkaXJlbnQgKmVudHJ5OworCisgIGlmICghKGRwID0gb3BlbmRpcigiL3Byb2MiKSkpIHBlcnJvcl9leGl0KCJvcGVuZGlyIik7CisKKyAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZHApKSkgeworICAgIHVuc2lnbmVkIHU7CisgICAgY2hhciAqY21kLCAqKmN1cm5hbWU7CisKKyAgICBpZiAoISh1ID0gYXRvaShlbnRyeS0+ZF9uYW1lKSkpIGNvbnRpbnVlOworICAgIHNwcmludGYobGliYnVmLCAiL3Byb2MvJXUvY21kbGluZSIsIHUpOworICAgIGlmICghKGNtZCA9IHJlYWRmaWxlKGxpYmJ1ZiwgbGliYnVmLCBzaXplb2YobGliYnVmKSkpKSBjb250aW51ZTsKKworICAgIGZvciAoY3VybmFtZSA9IG5hbWVzOyAqY3VybmFtZTsgY3VybmFtZSsrKQorICAgICAgaWYgKCoqY3VybmFtZSA9PSAnLycgPyAhc3RyY21wKGNtZCwgKmN1cm5hbWUpCisgICAgICAgICAgOiAhc3RyY21wKGdldGJhc2VuYW1lKGNtZCksIGdldGJhc2VuYW1lKCpjdXJuYW1lKSkpCisgICAgICAgIGlmIChjYWxsYmFjayh1LCAqY3VybmFtZSkpIGJyZWFrOworICAgIGlmICgqY3VybmFtZSkgYnJlYWs7CisgIH0KKyAgY2xvc2VkaXIoZHApOworfQorCisvLyBkaXNwbGF5IGZpcnN0IGZldyBkaWdpdHMgb2YgbnVtYmVyIHdpdGggcG93ZXIgb2YgdHdvIHVuaXRzCitpbnQgaHVtYW5fcmVhZGFibGUoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgc3R5bGUpCit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBzbmFwID0gMDsKKyAgaW50IGxlbiwgdW5pdCwgZGl2aXNvciA9IChzdHlsZSZIUl8xMDAwKSA/IDEwMDAgOiAxMDI0OworCisgIC8vIERpdmlkZSByb3VuZGluZyB1cCB1bnRpbCB3ZSBoYXZlIDMgb3IgZmV3ZXIgZGlnaXRzLiBTaW5jZSB0aGUgcGFydCB3ZQorICAvLyBwcmludCBpcyBkZWNpbWFsLCB0aGUgdGVzdCBpcyA5OTkgZXZlbiB3aGVuIHdlIGRpdmlkZSBieSAxMDI0LgorICAvLyBXZSBjYW4ndCBydW4gb3V0IG9mIHVuaXRzIGJlY2F1c2UgMjw8NjQgaXMgMTggZXhhYnl0ZXMuCisgIC8vIHRlc3QgNTY3NSBpcyA1LjVrIG5vdCA1LjZrLgorICBmb3IgKHVuaXQgPSAwOyBudW0gPiA5OTk7IHVuaXQrKykgbnVtID0gKChzbmFwID0gbnVtKSsoZGl2aXNvci8yKSkvZGl2aXNvcjsKKyAgbGVuID0gc3ByaW50ZihidWYsICIlbGx1IiwgbnVtKTsKKyAgaWYgKHVuaXQgJiYgbGVuID09IDEpIHsKKyAgICAvLyBSZWRvIHJvdW5kaW5nIGZvciAxLjJNIGNhc2UsIHRoaXMgd29ya3Mgd2l0aCBhbmQgd2l0aG91dCBIUl8xMDAwLgorICAgIG51bSA9IHNuYXAvZGl2aXNvcjsKKyAgICBzbmFwIC09IG51bSpkaXZpc29yOworICAgIHNuYXAgPSAoKHNuYXAqMTAwKSs1MCkvZGl2aXNvcjsKKyAgICBzbmFwIC89IDEwOworICAgIGxlbiA9IHNwcmludGYoYnVmLCAiJWxsdS4lbGx1IiwgbnVtLCBzbmFwKTsKKyAgfQorICBpZiAoc3R5bGUgJiBIUl9TUEFDRSkgYnVmW2xlbisrXSA9ICcgJzsKKyAgaWYgKHVuaXQpIHsKKyAgICB1bml0ID0gIiBrTUdUUEUiW3VuaXRdOworCisgICAgaWYgKCEoc3R5bGUmSFJfMTAwMCkpIHVuaXQgPSB0b3VwcGVyKHVuaXQpOworICAgIGJ1ZltsZW4rK10gPSB1bml0OworICB9IGVsc2UgaWYgKHN0eWxlICYgSFJfQikgYnVmW2xlbisrXSA9ICdCJzsKKyAgYnVmW2xlbl0gPSAwOworCisgIHJldHVybiBsZW47Cit9CisKKy8vIFRoZSBxc29ydCBtYW4gcGFnZSBzYXlzIHlvdSBjYW4gdXNlIGFscGhhc29ydCwgdGhlIHBvc2l4IGNvbW1pdHRlZQorLy8gZGlzYWdyZWVkLCBhbmQgZG91YmxlZCBkb3duOiBodHRwOi8vYXVzdGluZ3JvdXBidWdzLm5ldC92aWV3LnBocD9pZD0xNDIKKy8vIFNvIGp1c3QgZG8gb3VyIG93bi4gKFRoZSBjb25zdCBpcyBlbnRpcmVseSB0byBodW1vciB0aGUgc3R1cGlkIGNvbXBpbGVyLikKK2ludCBxc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgIHJldHVybiBzdHJjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKTsKK30KKworLy8gQWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2MjkzOTkvYXBkeGEuaHRtCisvLyB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB1dWlkIHN0cnVjdHVyZSBieSByZWFkaW5nIGEgY2xvY2sgd2l0aCAxMDAgbmFub3NlY29uZAorLy8gcHJlY2lzaW9uLCBub3JtYWxpemluZyBpdCB0byB0aGUgc3RhcnQgb2YgdGhlIGdyZWdvcmlhbiBjYWxlbmRhciBpbiAxNTgyLAorLy8gYW5kIGxvb2tpbmcgdXAgb3VyIGV0aDAgbWFjIGFkZHJlc3MuCisvLworLy8gT24gdGhlIG90aGVyIGhhbmQsIHdlIGhhdmUgMTI4IGJpdHMgdG8gY29tZSB1cCB3aXRoIGEgdW5pcXVlIGlkZW50aWZpZXIsIG9mCisvLyB3aGljaCA2IGhhdmUgYSBkZWZpbmVkIHZhbHVlLiAgL2Rldi91cmFuZG9tIGl0IGlzLgorCit2b2lkIGNyZWF0ZV91dWlkKGNoYXIgKnV1aWQpCit7CisgIC8vIFJlYWQgMTI4IHJhbmRvbSBiaXRzCisgIGludCBmZCA9IHhvcGVucm8oIi9kZXYvdXJhbmRvbSIpOworICB4cmVhZGFsbChmZCwgdXVpZCwgMTYpOworICBjbG9zZShmZCk7CisKKyAgLy8gQ2xhaW0gdG8gYmUgYSBEQ0UgZm9ybWF0IFVVSUQuCisgIHV1aWRbNl0gPSAodXVpZFs2XSAmIDB4MEYpIHwgMHg0MDsKKyAgdXVpZFs4XSA9ICh1dWlkWzhdICYgMHgzRikgfCAweDgwOworCisgIC8vIHJmYzI1MTggc2VjdGlvbiA2LjQuMSBzdWdnZXN0cyBpZiB3ZSdyZSBub3QgdXNpbmcgYSBtYWNhZGRyLCB3ZSBzaG91bGQKKyAgLy8gc2V0IGJpdCAxIG9mIHRoZSBub2RlIElELCB3aGljaCBpcyB0aGUgbWFjIG11bHRpY2FzdCBiaXQuICBUaGlzIG1lYW5zIHdlCisgIC8vIHNob3VsZCBuZXZlciBjb2xsaWRlIHdpdGggYW55Ym9keSBhY3R1YWxseSB1c2luZyBhIG1hY2FkZHIuCisgIHV1aWRbMTFdIHw9IDEyODsKK30KKworY2hhciAqc2hvd191dWlkKGNoYXIgKnV1aWQpCit7CisgIGNoYXIgKm91dCA9IGxpYmJ1ZjsKKyAgaW50IGk7CisKKyAgZm9yIChpPTA7IGk8MTY7IGkrKykgb3V0Kz1zcHJpbnRmKG91dCwgIi0lMDJ4IishKDB4NTUwJigxPDxpKSksIHV1aWRbaV0pOworICAqb3V0ID0gMDsKKworICByZXR1cm4gbGliYnVmOworfQorCisvLyBSZXR1cm5zIHBvaW50ZXIgdG8gbGV0dGVyIGF0IGVuZCwgMCBpZiBub25lLiAqc3RhcnQgPSBpbml0aWFsICUKK2NoYXIgKm5leHRfcHJpbnRmKGNoYXIgKnMsIGNoYXIgKipzdGFydCkKK3sKKyAgZm9yICg7ICpzOyBzKyspIHsKKyAgICBpZiAoKnMgIT0gJyUnKSBjb250aW51ZTsKKyAgICBpZiAoKisrcyA9PSAnJScpIGNvbnRpbnVlOworICAgIGlmIChzdGFydCkgKnN0YXJ0ID0gcy0xOworICAgIHdoaWxlICgwIDw9IHN0cmlkeCgiMCcjLSsgIiwgKnMpKSBzKys7CisgICAgd2hpbGUgKGlzZGlnaXQoKnMpKSBzKys7CisgICAgaWYgKCpzID09ICcuJykgcysrOworICAgIHdoaWxlIChpc2RpZ2l0KCpzKSkgcysrOworCisgICAgcmV0dXJuIHM7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLy8gUG9zaXggaW5leHBsaWNhYmx5IGhhc24ndCBnb3QgdGhpcywgc28gZmluZCBzdHIgaW4gbGluZS4KK2NoYXIgKnN0cm5zdHIoY2hhciAqbGluZSwgY2hhciAqc3RyKQoreworICBsb25nIGxlbiA9IHN0cmxlbihzdHIpOworICBjaGFyICpzOworCisgIGZvciAocyA9IGxpbmU7ICpzOyBzKyspIGlmICghc3RybmNhc2VjbXAocywgc3RyLCBsZW4pKSBicmVhazsKKworICByZXR1cm4gKnMgPyBzIDogMDsKK30KKworaW50IGRldl9taW5vcihpbnQgZGV2KQoreworICByZXR1cm4gKChkZXYmMHhmZmYwMDAwMCk+PjEyKXwoZGV2JjB4ZmYpOworfQorCitpbnQgZGV2X21ham9yKGludCBkZXYpCit7CisgIHJldHVybiAoZGV2JjB4ZmZmMDApPj44OworfQorCitpbnQgZGV2X21ha2VkZXYoaW50IG1ham9yLCBpbnQgbWlub3IpCit7CisgIHJldHVybiAobWlub3ImMHhmZil8KChtYWpvciYweGZmZik8PDgpfCgobWlub3ImMHhmZmYwMCk8PDEyKTsKK30KKworLy8gUmV0dXJuIGNhY2hlZCBwYXNzd2QgZW50cmllcy4KK3N0cnVjdCBwYXNzd2QgKmJ1ZmdldHB3dWlkKHVpZF90IHVpZCkKK3sKKyAgc3RydWN0IHB3dWlkYnVmX2xpc3QgeworICAgIHN0cnVjdCBwd3VpZGJ1Zl9saXN0ICpuZXh0OworICAgIHN0cnVjdCBwYXNzd2QgcHc7CisgIH0gKmxpc3Q7CisgIHN0cnVjdCBwYXNzd2QgKnRlbXA7CisgIHN0YXRpYyBzdHJ1Y3QgcHd1aWRidWZfbGlzdCAqcHd1aWRidWY7CisKKyAgZm9yIChsaXN0ID0gcHd1aWRidWY7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KQorICAgIGlmIChsaXN0LT5wdy5wd191aWQgPT0gdWlkKSByZXR1cm4gJihsaXN0LT5wdyk7CisKKyAgbGlzdCA9IHhtYWxsb2MoNTEyKTsKKyAgbGlzdC0+bmV4dCA9IHB3dWlkYnVmOworCisgIGVycm5vID0gZ2V0cHd1aWRfcih1aWQsICZsaXN0LT5wdywgc2l6ZW9mKCpsaXN0KSsoY2hhciAqKWxpc3QsCisgICAgNTEyLXNpemVvZigqbGlzdCksICZ0ZW1wKTsKKyAgaWYgKCF0ZW1wKSB7CisgICAgZnJlZShsaXN0KTsKKworICAgIHJldHVybiAwOworICB9CisgIHB3dWlkYnVmID0gbGlzdDsKKworICByZXR1cm4gJmxpc3QtPnB3OworfQorCisvLyBSZXR1cm4gY2FjaGVkIHBhc3N3ZCBlbnRyaWVzLgorc3RydWN0IGdyb3VwICpidWZnZXRncmdpZChnaWRfdCBnaWQpCit7CisgIHN0cnVjdCBncmdpZGJ1Zl9saXN0IHsKKyAgICBzdHJ1Y3QgZ3JnaWRidWZfbGlzdCAqbmV4dDsKKyAgICBzdHJ1Y3QgZ3JvdXAgZ3I7CisgIH0gKmxpc3Q7CisgIHN0cnVjdCBncm91cCAqdGVtcDsKKyAgc3RhdGljIHN0cnVjdCBncmdpZGJ1Zl9saXN0ICpncmdpZGJ1ZjsKKworICBmb3IgKGxpc3QgPSBncmdpZGJ1ZjsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCisgICAgaWYgKGxpc3QtPmdyLmdyX2dpZCA9PSBnaWQpIHJldHVybiAmKGxpc3QtPmdyKTsKKworICBsaXN0ID0geG1hbGxvYyg1MTIpOworICBsaXN0LT5uZXh0ID0gZ3JnaWRidWY7CisKKyAgZXJybm8gPSBnZXRncmdpZF9yKGdpZCwgJmxpc3QtPmdyLCBzaXplb2YoKmxpc3QpKyhjaGFyICopbGlzdCwKKyAgICA1MTItc2l6ZW9mKCpsaXN0KSwgJnRlbXApOworICBpZiAoIXRlbXApIHsKKyAgICBmcmVlKGxpc3QpOworCisgICAgcmV0dXJuIDA7CisgIH0KKyAgZ3JnaWRidWYgPSBsaXN0OworCisgIHJldHVybiAmbGlzdC0+Z3I7Cit9CisKKy8vIEFsd2F5cyBudWxsIHRlcm1pbmF0ZXMsIHJldHVybnMgMCBmb3IgZmFpbHVyZSwgbGVuIGZvciBzdWNjZXNzCitpbnQgcmVhZGxpbmthdDAoaW50IGRpcmZkLCBjaGFyICpwYXRoLCBjaGFyICpidWYsIGludCBsZW4pCit7CisgIGlmICghbGVuKSByZXR1cm4gMDsKKworICBsZW4gPSByZWFkbGlua2F0KGRpcmZkLCBwYXRoLCBidWYsIGxlbi0xKTsKKyAgaWYgKGxlbjwxKSByZXR1cm4gMDsKKyAgYnVmW2xlbl0gPSAwOworCisgIHJldHVybiBsZW47Cit9CisKK2ludCByZWFkbGluazAoY2hhciAqcGF0aCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICByZXR1cm4gcmVhZGxpbmthdDAoQVRfRkRDV0QsIHBhdGgsIGJ1ZiwgbGVuKTsKK30KKworLy8gRG8gcmVnZXggbWF0Y2hpbmcgaGFuZGxpbmcgZW1iZWRkZWQgTlVMIGJ5dGVzIGluIHN0cmluZyAoaGVuY2UgZXh0cmEgbGVuCisvLyBhcmd1bWVudCkuIE5vdGUgdGhhdCBuZWl0aGVyIHRoZSBwYXR0ZXJuIG5vciB0aGUgbWF0Y2ggY2FuIGN1cnJlbnRseSBpbmNsdWRlCisvLyBOVUwgYnl0ZXMgKGV2ZW4gd2l0aCB3aWxkY2FyZHMpIGFuZCBzdHJpbmcgbXVzdCBiZSBudWxsIHRlcm1pbmF0ZWQgYXQKKy8vIHN0cmluZ1tsZW5dLiBCdXQgdGhpcyBjYW4gZmluZCBhIG1hdGNoIGFmdGVyIHRoZSBmaXJzdCBOVUwuCitpbnQgcmVnZXhlYzAocmVnZXhfdCAqcHJlZywgY2hhciAqc3RyaW5nLCBsb25nIGxlbiwgaW50IG5tYXRjaCwKKyAgcmVnbWF0Y2hfdCBwbWF0Y2hbXSwgaW50IGVmbGFncykKK3sKKyAgY2hhciAqcyA9IHN0cmluZzsKKworICBmb3IgKDs7KSB7CisgICAgbG9uZyBsbCA9IDA7CisgICAgaW50IHJjOworCisgICAgd2hpbGUgKGxlbiAmJiAhKnMpIHsKKyAgICAgIHMrKzsKKyAgICAgIGxlbi0tOworICAgIH0KKyAgICB3aGlsZSAoc1tsbF0gJiYgbGw8bGVuKSBsbCsrOworCisgICAgcmMgPSByZWdleGVjKHByZWcsIHMsIG5tYXRjaCwgcG1hdGNoLCBlZmxhZ3MpOworICAgIGlmICghcmMpIHsKKyAgICAgIGZvciAocmMgPSAwOyByYzxubWF0Y2ggJiYgcG1hdGNoW3JjXS5ybV9zbyE9LTE7IHJjKyspIHsKKyAgICAgICAgcG1hdGNoW3JjXS5ybV9zbyArPSBzLXN0cmluZzsKKyAgICAgICAgcG1hdGNoW3JjXS5ybV9lbyArPSBzLXN0cmluZzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsbD09bGVuKSByZXR1cm4gcmM7CisKKyAgICBzICs9IGxsOworICAgIGxlbiAtPSBsbDsKKyAgfQorfQorCisvLyBSZXR1cm4gdXNlciBuYW1lIG9yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBudW1iZXIsIHJldHVybmVkIGJ1ZmZlcgorLy8gbGFzdHMgdW50aWwgbmV4dCBjYWxsLgorY2hhciAqZ2V0dXNlcm5hbWUodWlkX3QgdWlkKQoreworICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGJ1ZmdldHB3dWlkKHVpZCk7CisgIHN0YXRpYyBjaGFyIHVudW1bMTJdOworCisgIHNwcmludGYodW51bSwgIiV1IiwgKHVuc2lnbmVkKXVpZCk7CisgIHJldHVybiBwdyA/IHB3LT5wd19uYW1lIDogdW51bTsKK30KKworLy8gUmV0dXJuIGdyb3VwIG5hbWUgb3Igc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciwgcmV0dXJuZWQgYnVmZmVyCisvLyBsYXN0cyB1bnRpbCBuZXh0IGNhbGwuCitjaGFyICpnZXRncm91cG5hbWUoZ2lkX3QgZ2lkKQoreworICBzdHJ1Y3QgZ3JvdXAgKmdyID0gYnVmZ2V0Z3JnaWQoZ2lkKTsKKyAgc3RhdGljIGNoYXIgZ251bVsxMl07CisKKyAgc3ByaW50ZihnbnVtLCAiJXUiLCAodW5zaWduZWQpZ2lkKTsKKyAgcmV0dXJuIGdyID8gZ3ItPmdyX25hbWUgOiBnbnVtOworfQorCmRpZmYgLS1naXQgYS90b3lib3gvbGliL2xpYi5oIGIvdG95Ym94L2xpYi9saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q2YjFmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9saWIuaApAQCAtMCwwICsxLDMzMSBAQAorLyogbGliLmggLSBoZWFkZXIgZmlsZSBmb3IgbGliIGRpcmVjdG9yeQorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKi8KKworc3RydWN0IHB0cl9sZW4geworICB2b2lkICpwdHI7CisgIGxvbmcgbGVuOworfTsKKworc3RydWN0IHN0cl9sZW4geworICBjaGFyICpzdHI7CisgIGxvbmcgbGVuOworfTsKKworLy8gbGxpc3QuYworCisvLyBBbGwgdGhlc2UgbGlzdCB0eXBlcyBjYW4gYmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGJlY2F1c2UgZmlyc3QgZWxlbWVudAorLy8gaXMgYWx3YXlzIG5leHQgcG9pbnRlciwgc28gbmV4dCA9IChteXR5cGUgKikmc3RydWN0LiAoVGhlIHBheWxvYWRzIGFyZQorLy8gbmFtZWQgZGlmZmVyZW50bHkgdG8gY2F0Y2ggdXNpbmcgdGhlIHdyb25nIHR5cGUgZWFybHkuKQorCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgeworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7CisgIGNoYXIgc3RyWzBdOworfTsKKworc3RydWN0IGFyZ19saXN0IHsKKyAgc3RydWN0IGFyZ19saXN0ICpuZXh0OworICBjaGFyICphcmc7Cit9OworCitzdHJ1Y3QgZG91YmxlX2xpc3QgeworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKm5leHQsICpwcmV2OworICBjaGFyICpkYXRhOworfTsKKworc3RydWN0IG51bV9jYWNoZSB7CisgIHN0cnVjdCBudW1fY2FjaGUgKm5leHQ7CisgIGxvbmcgbG9uZyBudW07CisgIGNoYXIgZGF0YVtdOworfTsKKwordm9pZCBsbGlzdF9mcmVlX2FyZyh2b2lkICpub2RlKTsKK3ZvaWQgbGxpc3RfZnJlZV9kb3VibGUodm9pZCAqbm9kZSk7Cit2b2lkIGxsaXN0X3RyYXZlcnNlKHZvaWQgKmxpc3QsIHZvaWQgKCp1c2luZykodm9pZCAqbm9kZSkpOwordm9pZCAqbGxpc3RfcG9wKHZvaWQgKmxpc3QpOyAgLy8gYWN0dWFsbHkgdm9pZCAqKmxpc3QKK3ZvaWQgKmRsaXN0X3BvcCh2b2lkICpsaXN0KTsgIC8vIGFjdHVhbGx5IHN0cnVjdCBkb3VibGVfbGlzdCAqKmxpc3QKK3ZvaWQgZGxpc3RfYWRkX25vbWFsbG9jKHN0cnVjdCBkb3VibGVfbGlzdCAqKmxpc3QsIHN0cnVjdCBkb3VibGVfbGlzdCAqbmV3KTsKK3N0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3RfYWRkKHN0cnVjdCBkb3VibGVfbGlzdCAqKmxpc3QsIGNoYXIgKmRhdGEpOwordm9pZCAqZGxpc3RfdGVybWluYXRlKHZvaWQgKmxpc3QpOworc3RydWN0IG51bV9jYWNoZSAqZ2V0X251bV9jYWNoZShzdHJ1Y3QgbnVtX2NhY2hlICpjYWNoZSwgbG9uZyBsb25nIG51bSk7CitzdHJ1Y3QgbnVtX2NhY2hlICphZGRfbnVtX2NhY2hlKHN0cnVjdCBudW1fY2FjaGUgKipjYWNoZSwgbG9uZyBsb25nIG51bSwKKyAgdm9pZCAqZGF0YSwgaW50IGxlbik7CisKKy8vIGFyZ3MuYwordm9pZCBnZXRfb3B0ZmxhZ3Modm9pZCk7CisKKy8vIGRpcnRyZWUuYworCisvLyBWYWx1ZXMgcmV0dXJuYWJsZSBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uIChiaXRmaWVsZCwgb3IgdGhlbSB0b2dldGhlcikKKy8vIERlZmF1bHQgd2l0aCBubyBjYWxsYmFjayBpcyAwCisKKy8vIEFkZCB0aGlzIG5vZGUgdG8gdGhlIHRyZWUKKyNkZWZpbmUgRElSVFJFRV9TQVZFICAgICAgICAgMQorLy8gUmVjdXJzZSBpbnRvIGNoaWxkcmVuCisjZGVmaW5lIERJUlRSRUVfUkVDVVJTRSAgICAgIDIKKy8vIENhbGwgYWdhaW4gYWZ0ZXIgaGFuZGxpbmcgYWxsIGNoaWxkcmVuIG9mIHRoaXMgZGlyZWN0b3J5CisvLyAoSWdub3JlZCBmb3Igbm9uLWRpcmVjdG9yaWVzLCBzZXRzIGxpbmtsZW4gPSAtMSBiZWZvcmUgc2Vjb25kIGNhbGwuKQorI2RlZmluZSBESVJUUkVFX0NPTUVBR0FJTiAgICA0CisvLyBGb2xsb3cgc3ltbGlua3MgdG8gZGlyZWN0b3JpZXMKKyNkZWZpbmUgRElSVFJFRV9TWU1GT0xMT1cgICAgOAorLy8gRG9uJ3Qgd2FybiBhYm91dCBmYWlsdXJlIHRvIHN0YXQKKyNkZWZpbmUgRElSVFJFRV9TSFVUVVAgICAgICAxNgorLy8gQnJlYWR0aCBmaXJzdCB0cmF2ZXJzYWwsIGNvbnNlcnZlcyBmaWxlaGFuZGxlcyBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkKKyNkZWZpbmUgRElSVFJFRV9CUkVBRFRIICAgICAzMgorLy8gRG9uJ3QgbG9vayBhdCBhbnkgbW9yZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4KKyNkZWZpbmUgRElSVFJFRV9BQk9SVCAgICAgIDI1NgorCisjZGVmaW5lIERJUlRSRUVfQUJPUlRWQUwgKChzdHJ1Y3QgZGlydHJlZSAqKTEpCisKK3N0cnVjdCBkaXJ0cmVlIHsKKyAgc3RydWN0IGRpcnRyZWUgKm5leHQsICpwYXJlbnQsICpjaGlsZDsKKyAgbG9uZyBleHRyYTsgLy8gcGxhY2UgZm9yIHVzZXIgdG8gc3RvcmUgdGhlaXIgc3R1ZmYgKGNhbiBiZSBwb2ludGVyKQorICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgY2hhciAqc3ltbGluazsKKyAgaW50IGRpcmZkOworICBjaGFyIGFnYWluOworICBjaGFyIG5hbWVbXTsKK307CisKK3N0cnVjdCBkaXJ0cmVlICpkaXJ0cmVlX2FkZF9ub2RlKHN0cnVjdCBkaXJ0cmVlICpwLCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOworY2hhciAqZGlydHJlZV9wYXRoKHN0cnVjdCBkaXJ0cmVlICpub2RlLCBpbnQgKnBsZW4pOworaW50IGRpcnRyZWVfbm90ZG90ZG90KHN0cnVjdCBkaXJ0cmVlICpjYXRjaCk7CitpbnQgZGlydHJlZV9wYXJlbnRmZChzdHJ1Y3QgZGlydHJlZSAqbm9kZSk7CitpbnQgZGlydHJlZV9yZWN1cnNlKHN0cnVjdCBkaXJ0cmVlICpub2RlLCBpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRpcnRyZWUgKm5vZGUpLAorICBpbnQgZGlyZmQsIGludCBzeW1mb2xsb3cpOworc3RydWN0IGRpcnRyZWUgKmRpcnRyZWVfZmxhZ3JlYWQoY2hhciAqcGF0aCwgaW50IGZsYWdzLAorICBpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRpcnRyZWUgKm5vZGUpKTsKK3N0cnVjdCBkaXJ0cmVlICpkaXJ0cmVlX3JlYWQoY2hhciAqcGF0aCwgaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkaXJ0cmVlICpub2RlKSk7CisKKy8vIGhlbHAuYworCit2b2lkIHNob3dfaGVscChGSUxFICpvdXQpOworCisvLyB4d3JhcC5jCit2b2lkIHhzdHJuY3B5KGNoYXIgKmRlc3QsIGNoYXIgKnNyYywgc2l6ZV90IHNpemUpOwordm9pZCB4c3RybmNhdChjaGFyICpkZXN0LCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKK3ZvaWQgX3hleGl0KHZvaWQpIG5vcmV0dXJuOwordm9pZCB4ZXhpdCh2b2lkKSBub3JldHVybjsKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpOwordm9pZCAqeHphbGxvYyhzaXplX3Qgc2l6ZSk7Cit2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK2NoYXIgKnhzdHJuZHVwKGNoYXIgKnMsIHNpemVfdCBuKTsKK2NoYXIgKnhzdHJkdXAoY2hhciAqcyk7Cit2b2lkICp4bWVtZHVwKHZvaWQgKnMsIGxvbmcgbGVuKTsKK2NoYXIgKnhtcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKSBwcmludGZfZm9ybWF0Owordm9pZCB4cHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKSBwcmludGZfZm9ybWF0Owordm9pZCB4cHV0cyhjaGFyICpzKTsKK3ZvaWQgeHB1dGMoY2hhciBjKTsKK3ZvaWQgeGZsdXNoKHZvaWQpOwordm9pZCB4ZXhlYyhjaGFyICoqYXJndik7CitwaWRfdCB4cG9wZW5fYm90aChjaGFyICoqYXJndiwgaW50ICpwaXBlcyk7CitpbnQgeHdhaXRwaWQocGlkX3QgcGlkKTsKK2ludCB4cGNsb3NlX2JvdGgocGlkX3QgcGlkLCBpbnQgKnBpcGVzKTsKK3BpZF90IHhwb3BlbihjaGFyICoqYXJndiwgaW50ICpwaXBlLCBpbnQgc3Rkb3V0KTsKK3BpZF90IHhwY2xvc2UocGlkX3QgcGlkLCBpbnQgcGlwZSk7CitpbnQgeHJ1bihjaGFyICoqYXJndik7CitpbnQgeHBzcGF3bihjaGFyICoqYXJndiwgaW50KnBpcGVzKTsKK3ZvaWQgeGFjY2VzcyhjaGFyICpwYXRoLCBpbnQgZmxhZ3MpOwordm9pZCB4dW5saW5rKGNoYXIgKnBhdGgpOworaW50IHhjcmVhdGUoY2hhciAqcGF0aCwgaW50IGZsYWdzLCBpbnQgbW9kZSk7CitpbnQgeG9wZW4oY2hhciAqcGF0aCwgaW50IGZsYWdzKTsKK2ludCB4Y3JlYXRlX3N0ZGlvKGNoYXIgKnBhdGgsIGludCBmbGFncywgaW50IG1vZGUpOworaW50IHhvcGVuX3N0ZGlvKGNoYXIgKnBhdGgsIGludCBmbGFncyk7CitpbnQgeG9wZW5ybyhjaGFyICpwYXRoKTsKK3ZvaWQgeHBpcGUoaW50ICpwcCk7Cit2b2lkIHhjbG9zZShpbnQgZmQpOworaW50IHhkdXAoaW50IGZkKTsKK0ZJTEUgKnhmZG9wZW4oaW50IGZkLCBjaGFyICptb2RlKTsKK0ZJTEUgKnhmb3BlbihjaGFyICpwYXRoLCBjaGFyICptb2RlKTsKK3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7Cit2b2lkIHhyZWFkYWxsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKK3ZvaWQgeHdyaXRlKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKK29mZl90IHhsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7CitjaGFyICp4cmVhZGZpbGUoY2hhciAqbmFtZSwgY2hhciAqYnVmLCBvZmZfdCBsZW4pOworaW50IHhpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICpkYXRhKTsKK2NoYXIgKnhnZXRjd2Qodm9pZCk7Cit2b2lkIHhzdGF0KGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpzdCk7CitjaGFyICp4YWJzcGF0aChjaGFyICpwYXRoLCBpbnQgZXhhY3QpOwordm9pZCB4Y2hkaXIoY2hhciAqcGF0aCk7Cit2b2lkIHhjaHJvb3QoY2hhciAqcGF0aCk7CitzdHJ1Y3QgcGFzc3dkICp4Z2V0cHd1aWQodWlkX3QgdWlkKTsKK3N0cnVjdCBncm91cCAqeGdldGdyZ2lkKGdpZF90IGdpZCk7CitzdHJ1Y3QgcGFzc3dkICp4Z2V0cHduYW0oY2hhciAqbmFtZSk7CitzdHJ1Y3QgZ3JvdXAgKnhnZXRncm5hbShjaGFyICpuYW1lKTsKK3Vuc2lnbmVkIHhnZXR1aWQoY2hhciAqbmFtZSk7Cit1bnNpZ25lZCB4Z2V0Z2lkKGNoYXIgKm5hbWUpOwordm9pZCB4c2V0dXNlcihzdHJ1Y3QgcGFzc3dkICpwd2QpOworY2hhciAqeHJlYWRsaW5rKGNoYXIgKm5hbWUpOworbG9uZyB4cGFyc2V0aW1lKGNoYXIgKmFyZywgbG9uZyB1bml0cywgbG9uZyAqZnJhY3Rpb24pOwordm9pZCB4cGlkZmlsZShjaGFyICpuYW1lKTsKK3ZvaWQgeHJlZ2NvbXAocmVnZXhfdCAqcHJlZywgY2hhciAqcmV4ZWMsIGludCBjZmxhZ3MpOworY2hhciAqeHR6c2V0KGNoYXIgKm5ldyk7Cit2b2lkIHhzaWduYWwoaW50IHNpZ25hbCwgdm9pZCAqaGFuZGxlcik7CisKKy8vIGxpYi5jCit2b2lkIHZlcnJvcl9tc2coY2hhciAqbXNnLCBpbnQgZXJyLCB2YV9saXN0IHZhKTsKK3ZvaWQgZXJyb3JfbXNnKGNoYXIgKm1zZywgLi4uKSBwcmludGZfZm9ybWF0Owordm9pZCBwZXJyb3JfbXNnKGNoYXIgKm1zZywgLi4uKSBwcmludGZfZm9ybWF0Owordm9pZCBlcnJvcl9leGl0KGNoYXIgKm1zZywgLi4uKSBwcmludGZfZm9ybWF0IG5vcmV0dXJuOwordm9pZCBwZXJyb3JfZXhpdChjaGFyICptc2csIC4uLikgcHJpbnRmX2Zvcm1hdCBub3JldHVybjsKK3ZvaWQgaGVscF9leGl0KGNoYXIgKm1zZywgLi4uKSBwcmludGZfZm9ybWF0IG5vcmV0dXJuOwordm9pZCBlcnJvcl9tc2dfcmF3KGNoYXIgKm1zZyk7Cit2b2lkIHBlcnJvcl9tc2dfcmF3KGNoYXIgKm1zZyk7Cit2b2lkIGVycm9yX2V4aXRfcmF3KGNoYXIgKm1zZyk7Cit2b2lkIHBlcnJvcl9leGl0X3JhdyhjaGFyICptc2cpOworc3NpemVfdCByZWFkYWxsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKK3NzaXplX3Qgd3JpdGVhbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOworb2ZmX3QgbHNraXAoaW50IGZkLCBvZmZfdCBvZmZzZXQpOworaW50IG1rcGF0aGF0KGludCBhdGZkLCBjaGFyICpkaXIsIG1vZGVfdCBsYXN0bW9kZSwgaW50IGZsYWdzKTsKK3N0cnVjdCBzdHJpbmdfbGlzdCAqKnNwbGl0cGF0aChjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipsaXN0KTsKK2NoYXIgKnJlYWRmaWxlYXQoaW50IGRpcmZkLCBjaGFyICpuYW1lLCBjaGFyICpidWYsIG9mZl90ICpsZW4pOworY2hhciAqcmVhZGZpbGUoY2hhciAqbmFtZSwgY2hhciAqYnVmLCBvZmZfdCBsZW4pOwordm9pZCBtc2xlZXAobG9uZyBtaWxpc2Vjb25kcyk7CitpbnQ2NF90IHBlZWtfbGUodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKTsKK2ludDY0X3QgcGVla19iZSh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpOworaW50NjRfdCBwZWVrKHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSk7Cit2b2lkIHBva2Uodm9pZCAqcHRyLCB1aW50NjRfdCB2YWwsIGludCBzaXplKTsKK3N0cnVjdCBzdHJpbmdfbGlzdCAqZmluZF9pbl9wYXRoKGNoYXIgKnBhdGgsIGNoYXIgKmZpbGVuYW1lKTsKK2xvbmcgbG9uZyBlc3RydG9sKGNoYXIgKnN0ciwgY2hhciAqKmVuZCwgaW50IGJhc2UpOworbG9uZyBsb25nIHhzdHJ0b2woY2hhciAqc3RyLCBjaGFyICoqZW5kLCBpbnQgYmFzZSk7Citsb25nIGxvbmcgYXRvbHgoY2hhciAqYyk7Citsb25nIGxvbmcgYXRvbHhfcmFuZ2UoY2hhciAqbnVtc3RyLCBsb25nIGxvbmcgbG93LCBsb25nIGxvbmcgaGlnaCk7CitpbnQgc3RyaWR4KGNoYXIgKmhheXN0YWNrLCBjaGFyIG5lZWRsZSk7CitjaGFyICpzdHJsb3dlcihjaGFyICpzKTsKK2NoYXIgKnN0cmFmdGVyKGNoYXIgKmhheXN0YWNrLCBjaGFyICpuZWVkbGUpOworY2hhciAqY2hvbXAoY2hhciAqcyk7CitpbnQgdW5lc2NhcGUoY2hhciBjKTsKK2ludCBzdHJzdGFydChjaGFyICoqYSwgY2hhciAqYik7CitvZmZfdCBmZGxlbmd0aChpbnQgZmQpOwordm9pZCBsb29wZmlsZXNfcncoY2hhciAqKmFyZ3YsIGludCBmbGFncywgaW50IHBlcm1pc3Npb25zLCBpbnQgZmFpbG9rLAorICB2b2lkICgqZnVuY3Rpb24pKGludCBmZCwgY2hhciAqbmFtZSkpOwordm9pZCBsb29wZmlsZXMoY2hhciAqKmFyZ3YsIHZvaWQgKCpmdW5jdGlvbikoaW50IGZkLCBjaGFyICpuYW1lKSk7Cit2b2lkIHhzZW5kZmlsZShpbnQgaW4sIGludCBvdXQpOworaW50IHdmY2htb2RhdChpbnQgcmMsIGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlKTsKK2ludCBjb3B5X3RlbXBmaWxlKGludCBmZGluLCBjaGFyICpuYW1lLCBjaGFyICoqdGVtcG5hbWUpOwordm9pZCBkZWxldGVfdGVtcGZpbGUoaW50IGZkaW4sIGludCBmZG91dCwgY2hhciAqKnRlbXBuYW1lKTsKK3ZvaWQgcmVwbGFjZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpOwordm9pZCBjcmNfaW5pdCh1bnNpZ25lZCBpbnQgKmNyY190YWJsZSwgaW50IGxpdHRsZV9lbmRpYW4pOwordm9pZCBiYXNlNjRfaW5pdChjaGFyICpwKTsKK2ludCB5ZXNubyhpbnQgZGVmKTsKK2ludCBxc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwordm9pZCBjcmVhdGVfdXVpZChjaGFyICp1dWlkKTsKK2NoYXIgKnNob3dfdXVpZChjaGFyICp1dWlkKTsKK2NoYXIgKm5leHRfcHJpbnRmKGNoYXIgKnMsIGNoYXIgKipzdGFydCk7CitjaGFyICpzdHJuc3RyKGNoYXIgKmxpbmUsIGNoYXIgKnN0cik7CitpbnQgZGV2X21pbm9yKGludCBkZXYpOworaW50IGRldl9tYWpvcihpbnQgZGV2KTsKK2ludCBkZXZfbWFrZWRldihpbnQgbWFqb3IsIGludCBtaW5vcik7CitzdHJ1Y3QgcGFzc3dkICpidWZnZXRwd3VpZCh1aWRfdCB1aWQpOworc3RydWN0IGdyb3VwICpidWZnZXRncmdpZChnaWRfdCBnaWQpOworaW50IHJlYWRsaW5rYXQwKGludCBkaXJmZCwgY2hhciAqcGF0aCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCByZWFkbGluazAoY2hhciAqcGF0aCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCByZWdleGVjMChyZWdleF90ICpwcmVnLCBjaGFyICpzdHJpbmcsIGxvbmcgbGVuLCBpbnQgbm1hdGNoLAorICByZWdtYXRjaF90IHBtYXRjaFtdLCBpbnQgZWZsYWdzKTsKK2NoYXIgKmdldHVzZXJuYW1lKHVpZF90IHVpZCk7CitjaGFyICpnZXRncm91cG5hbWUoZ2lkX3QgZ2lkKTsKKworI2RlZmluZSBIUl9TUEFDRSAxIC8vIFNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCB1bml0cworI2RlZmluZSBIUl9CICAgICAyIC8vIFVzZSAiQiIgZm9yIHNpbmdsZSBieXRlIHVuaXRzCisjZGVmaW5lIEhSXzEwMDAgIDQgLy8gVXNlIGRlY2ltYWwgaW5zdGVhZCBvZiBiaW5hcnkgdW5pdHMKK2ludCBodW1hbl9yZWFkYWJsZShjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBzdHlsZSk7CisKKy8vIGxpbmVzdGFjay5jCisKK3N0cnVjdCBsaW5lc3RhY2sgeworICBsb25nIGxlbiwgbWF4OworICBzdHJ1Y3QgcHRyX2xlbiBpZHhbXTsKK307CisKK3ZvaWQgbGluZXN0YWNrX2FkZHN0YWNrKHN0cnVjdCBsaW5lc3RhY2sgKipsbHMsIHN0cnVjdCBsaW5lc3RhY2sgKnRocm93LAorICBsb25nIHBvcyk7Cit2b2lkIGxpbmVzdGFja19pbnNlcnQoc3RydWN0IGxpbmVzdGFjayAqKmxscywgbG9uZyBwb3MsIGNoYXIgKmxpbmUsIGxvbmcgbGVuKTsKK3ZvaWQgbGluZXN0YWNrX2FwcGVuZChzdHJ1Y3QgbGluZXN0YWNrICoqbGxzLCBjaGFyICpsaW5lKTsKK3N0cnVjdCBsaW5lc3RhY2sgKmxpbmVzdGFja19sb2FkKGNoYXIgKm5hbWUpOworaW50IGNydW5jaF9lc2NhcGUoRklMRSAqb3V0LCBpbnQgY29scywgaW50IHdjKTsKK2ludCBjcnVuY2hfcmV2X2VzY2FwZShGSUxFICpvdXQsIGludCBjb2xzLCBpbnQgd2MpOworaW50IGNydW5jaF9zdHIoY2hhciAqKnN0ciwgaW50IHdpZHRoLCBGSUxFICpvdXQsIGNoYXIgKmVzY21vcmUsCisgIGludCAoKmVzY291dCkoRklMRSAqb3V0LCBpbnQgY29scywgaW50IHdjKSk7CitpbnQgZHJhd19zdHIoY2hhciAqc3RhcnQsIGludCB3aWR0aCk7CitpbnQgdXRmOGxlbihjaGFyICpzdHIpOworaW50IHV0Zjhza2lwKGNoYXIgKnN0ciwgaW50IHdpZHRoKTsKK2ludCBkcmF3X3RyaW1fZXNjKGNoYXIgKnN0ciwgaW50IHBhZHRvLCBpbnQgd2lkdGgsIGNoYXIgKmVzY21vcmUsCisgIGludCAoKmVzY291dCkoRklMRSAqb3V0LCBpbnQgY29scyxpbnQgd2MpKTsKK2ludCBkcmF3X3RyaW0oY2hhciAqc3RyLCBpbnQgcGFkdG8sIGludCB3aWR0aCk7CisKKy8vIGludGVyZXN0aW5ndGltZXMuYworaW50IHhnZXR0dHkodm9pZCk7CitpbnQgdGVybWluYWxfc2l6ZSh1bnNpZ25lZCAqeHgsIHVuc2lnbmVkICp5eSk7CitpbnQgdGVybWluYWxfcHJvYmVzaXplKHVuc2lnbmVkICp4eCwgdW5zaWduZWQgKnl5KTsKK2ludCBzY2FuX2tleV9nZXRzaXplKGNoYXIgKnNjcmF0Y2gsIGludCBtaWxpd2FpdCwgdW5zaWduZWQgKnh4LCB1bnNpZ25lZCAqeXkpOworaW50IHNldF90ZXJtaW5hbChpbnQgZmQsIGludCByYXcsIHN0cnVjdCB0ZXJtaW9zICpvbGQpOwordm9pZCB4c2V0X3Rlcm1pbmFsKGludCBmZCwgaW50IHJhdywgc3RydWN0IHRlcm1pb3MgKm9sZCk7CitpbnQgc2Nhbl9rZXkoY2hhciAqc2NyYXRjaCwgaW50IG1pbGl3YWl0KTsKK3ZvaWQgdHR5X2VzYyhjaGFyICpzKTsKK3ZvaWQgdHR5X2p1bXAoaW50IHgsIGludCB5KTsKK3ZvaWQgdHR5X3Jlc2V0KHZvaWQpOwordm9pZCB0dHlfc2lncmVzZXQoaW50IGkpOworCisvLyBuZXQuYworaW50IHhzb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCk7Cit2b2lkIHhzZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0LCB2b2lkICp2YWwsIHNvY2tsZW5fdCBsZW4pOworaW50IHhjb25uZWN0KGNoYXIgKmhvc3QsIGNoYXIgKnBvcnQsIGludCBmYW1pbHksIGludCBzb2NrdHlwZSwgaW50IHByb3RvY29sLAorICBpbnQgZmxhZ3MpOworaW50IHhwb2xsKHN0cnVjdCBwb2xsZmQgKmZkcywgaW50IG5mZHMsIGludCB0aW1lb3V0KTsKKworLy8gcGFzc3dvcmQuYworaW50IGdldF9zYWx0KGNoYXIgKnNhbHQsIGNoYXIgKiBhbGdvKTsKKworLy8gZ2V0bW91bnRsaXN0LmMKK3N0cnVjdCBtdGFiX2xpc3QgeworICBzdHJ1Y3QgbXRhYl9saXN0ICpuZXh0LCAqcHJldjsKKyAgc3RydWN0IHN0YXQgc3RhdDsKKyAgc3RydWN0IHN0YXR2ZnMgc3RhdHZmczsKKyAgY2hhciAqZGlyOworICBjaGFyICpkZXZpY2U7CisgIGNoYXIgKm9wdHM7CisgIGNoYXIgdHlwZVswXTsKK307CisKK3ZvaWQgY29tbWFfYXJncyhzdHJ1Y3QgYXJnX2xpc3QgKmFsLCB2b2lkICpkYXRhLCBjaGFyICplcnIsCisgIGNoYXIgKigqY2FsbGJhY2spKHZvaWQgKmRhdGEsIGNoYXIgKnN0ciwgaW50IGxlbikpOwordm9pZCBjb21tYV9jb2xsYXRlKGNoYXIgKipvbGQsIGNoYXIgKm5ldyk7CitjaGFyICpjb21tYV9pdGVyYXRlKGNoYXIgKipsaXN0LCBpbnQgKmxlbik7CitpbnQgY29tbWFfc2NhbihjaGFyICpvcHRsaXN0LCBjaGFyICpvcHQsIGludCBjbGVhbik7CitpbnQgY29tbWFfc2NhbmFsbChjaGFyICpvcHRsaXN0LCBjaGFyICpzY2FubGlzdCk7CitpbnQgbW91bnRsaXN0X2lzdHlwZShzdHJ1Y3QgbXRhYl9saXN0ICAqbWwsIGNoYXIgKnR5cGVsaXN0KTsKK3N0cnVjdCBtdGFiX2xpc3QgKnhnZXRtb3VudGxpc3QoY2hhciAqcGF0aCk7CisKKy8vIHNpZ25hbAorCit2b2lkIGdlbmVyaWNfc2lnbmFsKGludCBzaWduYWwpOwordm9pZCBleGl0X3NpZ25hbChpbnQgc2lnbmFsKTsKK3ZvaWQgc2lnYXRleGl0KHZvaWQgKmhhbmRsZXIpOworaW50IHNpZ190b19udW0oY2hhciAqcGlkc3RyKTsKK2NoYXIgKm51bV90b19zaWcoaW50IHNpZyk7CisKK21vZGVfdCBzdHJpbmdfdG9fbW9kZShjaGFyICptb2RlX3N0ciwgbW9kZV90IGJhc2UpOwordm9pZCBtb2RlX3RvX3N0cmluZyhtb2RlX3QgbW9kZSwgY2hhciAqYnVmKTsKK2NoYXIgKmdldGJhc2VuYW1lKGNoYXIgKm5hbWUpOwordm9pZCBuYW1lc190b19waWQoY2hhciAqKm5hbWVzLCBpbnQgKCpjYWxsYmFjaykocGlkX3QgcGlkLCBjaGFyICpuYW1lKSk7CisKK3BpZF90IHh2Zm9ya3dyYXAocGlkX3QgcGlkKTsKKyNkZWZpbmUgWFZGT1JLKCkgeHZmb3Jrd3JhcCh2Zm9yaygpKQorCisvLyBXcmFwcGVyIHRvIG1ha2UgeGZ1bmNzKCkgcmV0dXJuICh2aWEgbG9uZ2ptcCkgaW5zdGVhZCBvZiBleGl0aW5nLgorLy8gQXNzaWducyB0cnVlL2ZhbHNlICJkaWQgaXQgZXhpdCIgdmFsdWUgdG8gZmlyc3QgYXJndW1lbnQuCisjZGVmaW5lIFdPVUxEX0VYSVQoeSwgeCkgZG8geyBqbXBfYnVmIF9ub2V4aXQ7IFwKKyAgaW50IF9ub2V4aXRfcmVzOyBcCisgIHRveXMucmVib3VuZCA9ICZfbm9leGl0OyBcCisgIF9ub2V4aXRfcmVzID0gc2V0am1wKF9ub2V4aXQpOyBcCisgIGlmICghX25vZXhpdF9yZXMpIGRvIHt4O30gd2hpbGUoMCk7IFwKKyAgdG95cy5yZWJvdW5kID0gMDsgXAorICB5ID0gX25vZXhpdF9yZXM7IFwKK30gd2hpbGUoMCk7CisKKy8vIFdyYXBwZXIgdGhhdCBkaXNjYXJkcyB0cnVlL2ZhbHNlICJkaWQgaXQgZXhpdCIgdmFsdWUuCisjZGVmaW5lIE5PRVhJVCh4KSBXT1VMRF9FWElUKF9ub2V4aXRfcmVzLCB4KQorCisvLyBGdW5jdGlvbnMgaW4gbmVlZCBvZiBmdXJ0aGVyIHJldmlldy9jbGVhbnVwCisjaW5jbHVkZSAibGliL3BlbmRpbmcuaCIKZGlmZiAtLWdpdCBhL3RveWJveC9saWIvbGluZXN0YWNrLmMgYi90b3lib3gvbGliL2xpbmVzdGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvbGliL2xpbmVzdGFjay5jCkBAIC0wLDAgKzEsMTg3IEBACisjaW5jbHVkZSAidG95cy5oIgorCisvLyBJbnNlcnQgb25lIHN0YWNrIGludG8gYW5vdGhlciBiZWZvcmUgcG9zaXRpb24gaW4gb2xkIHN0YWNrLgorLy8gKERvZXMgbm90IGNvcHkgY29udGVudHMgb2Ygc3RyaW5ncywganVzdCBzaHVmZmxlcyBpbmRleCBhcnJheSBjb250ZW50cy4pCit2b2lkIGxpbmVzdGFja19hZGRzdGFjayhzdHJ1Y3QgbGluZXN0YWNrICoqbGxzLCBzdHJ1Y3QgbGluZXN0YWNrICp0aHJvdywKKyAgbG9uZyBwb3MpCit7CisgIHN0cnVjdCBsaW5lc3RhY2sgKmNhdGNoID0gKmxsczsKKworICBpZiAoQ0ZHX1RPWUJPWF9ERUJVRykKKyAgICBpZiAocG9zID4gY2F0Y2gtPmxlbikgZXJyb3JfZXhpdCgibGluZXN0YWNrX2FkZHN0YWNrIHBhc3QgZW5kLiIpOworCisgIC8vIE1ha2UgYSBob2xlLCBhbGxvY2F0aW5nIG1vcmUgc3BhY2UgaWYgbmVjZXNzYXJ5LgorICBpZiAoY2F0Y2gtPmxlbit0aHJvdy0+bGVuID49IGNhdGNoLT5tYXgpIHsKKyAgICAvLyBOZXcgc2l6ZSByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgNjQsIGFsbG9jYXRlIGFuZCBjb3B5IHN0YXJ0LgorICAgIGNhdGNoLT5tYXggPSAoKGNhdGNoLT5sZW4rdGhyb3ctPmxlbil8NjMpKzE7CisgICAgKmxscyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW5lc3RhY2spK2NhdGNoLT5tYXgqc2l6ZW9mKHN0cnVjdCBwdHJfbGVuKSk7CisgICAgbWVtY3B5KCpsbHMsIGNhdGNoLCBzaXplb2Yoc3RydWN0IGxpbmVzdGFjaykrcG9zKnNpemVvZihzdHJ1Y3QgcHRyX2xlbikpOworICB9CisKKyAgLy8gQ29weSBlbmQgKGludG8gbmV3IGFsbG9jYXRpb24gaWYgbmVjZXNzYXJ5KQorICBpZiAocG9zICE9IGNhdGNoLT5sZW4pCisgICAgbWVtbW92ZSgoKmxscyktPmlkeCtwb3MrdGhyb3ctPmxlbiwgY2F0Y2gtPmlkeCtwb3MsCisgICAgICAoY2F0Y2gtPmxlbi1wb3MpKnNpemVvZihzdHJ1Y3QgcHRyX2xlbikpOworCisgIC8vIENsZWFudXAgaWYgd2UgaGFkIHRvIHJlYWxsb2MuCisgIGlmIChjYXRjaCAhPSAqbGxzKSB7CisgICAgZnJlZShjYXRjaCk7CisgICAgY2F0Y2ggPSAqbGxzOworICB9CisKKyAgbWVtY3B5KGNhdGNoLT5pZHgrcG9zLCB0aHJvdy0+aWR4LCB0aHJvdy0+bGVuKnNpemVvZihzdHJ1Y3QgcHRyX2xlbikpOworICBjYXRjaC0+bGVuICs9IHRocm93LT5sZW47Cit9CisKK3ZvaWQgbGluZXN0YWNrX2luc2VydChzdHJ1Y3QgbGluZXN0YWNrICoqbGxzLCBsb25nIHBvcywgY2hhciAqbGluZSwgbG9uZyBsZW4pCit7CisgIC8vIGFsbG9jYSgpIHdhcyBpbiAzMlYgYW5kIFR1cmJvIEMgZm9yIERPUywgYnV0IGlzbid0IGluIHBvc2l4IG9yIGM5OS4KKyAgLy8gSSdtIG5vdCB0aHJhc2hpbmcgdGhlIGhlYXAgZm9yIHRoaXMsIGJ1dCB0aGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYKKyAgLy8gYSBicm9rZW4gY29tcGlsZXIgYWRkcyBncmF0dWl0b3VzIHBhZGRpbmcuCisgIHN0cnVjdCB7CisgICAgc3RydWN0IGxpbmVzdGFjayBsczsKKyAgICBzdHJ1Y3QgcHRyX2xlbiBwbDsKKyAgfSBsczsKKworICBscy5scy5sZW4gPSBscy5scy5tYXggPSAxOworICBscy5scy5pZHhbMF0ucHRyID0gbGluZTsKKyAgbHMubHMuaWR4WzBdLmxlbiA9IGxlbjsKKyAgbGluZXN0YWNrX2FkZHN0YWNrKGxscywgJmxzLmxzLCBwb3MpOworfQorCit2b2lkIGxpbmVzdGFja19hcHBlbmQoc3RydWN0IGxpbmVzdGFjayAqKmxscywgY2hhciAqbGluZSkKK3sKKyAgbGluZXN0YWNrX2luc2VydChsbHMsICgqbGxzKS0+bGVuLCBsaW5lLCBzdHJsZW4obGluZSkpOworfQorCitzdHJ1Y3QgbGluZXN0YWNrICpsaW5lc3RhY2tfbG9hZChjaGFyICpuYW1lKQoreworICBGSUxFICpmcCA9IGZvcGVuKG5hbWUsICJyIik7CisgIHN0cnVjdCBsaW5lc3RhY2sgKmxzOworCisgIGlmICghZnApIHJldHVybiAwOworCisgIGxzID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGxpbmVzdGFjaykpOworCisgIGZvciAoOzspIHsKKyAgICBjaGFyICpsaW5lID0gMDsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGlmICgobGVuID0gZ2V0bGluZSgmbGluZSwgKHZvaWQgKikmbGVuLCBmcCkpPDEpIGJyZWFrOworICAgIGlmIChsaW5lW2xlbi0xXT09J1xuJykgbGVuLS07CisgICAgbGluZXN0YWNrX2luc2VydCgmbHMsIGxzLT5sZW4sIGxpbmUsIGxlbik7CisgIH0KKyAgZmNsb3NlKGZwKTsKKworICByZXR1cm4gbHM7Cit9CisKKy8vIFNob3cgd2lkdGggbWFueSBjb2x1bW5zLCBuZWdhdGl2ZSBtZWFucyBmcm9tIHJpZ2h0IGVkZ2UuCisvLyBJZiBvdXQ9MCBqdXN0IG1lYXN1cmUKKy8vIGlmIGVzY291dCwgc2VuZCBpdCB1bnByaW50YWJsZSBjaGFycywgcmV0dXJucyBjb2x1bW5zIG91dHB1dCBvciAtMSBmb3IKKy8vIHN0YW5kYXJkIGVzY2FwZTogXlggaWYgPDMyLCA8WFg+IGlmIGludmxpYWQgVVRGOCwgVStYWFhYIGlmIFVURjggIWlzd3ByaW50KCkKKy8vIFJldHVybnMgd2lkdGggaW4gY29sdW1ucywgbW92ZXMgKnN0ciB0byBlbmQgb2YgZGF0YSBjb25zdW1lZC4KK2ludCBjcnVuY2hfc3RyKGNoYXIgKipzdHIsIGludCB3aWR0aCwgRklMRSAqb3V0LCBjaGFyICplc2Ntb3JlLAorICBpbnQgKCplc2NvdXQpKEZJTEUgKm91dCwgaW50IGNvbHMsIGludCB3YykpCit7CisgIGludCBjb2x1bW5zID0gMCwgY29sLCBieXRlczsKKyAgY2hhciAqc3RhcnQsICplbmQ7CisKKyAgZm9yIChlbmQgPSBzdGFydCA9ICpzdHI7ICplbmQ7IGNvbHVtbnMgKz0gY29sLCBlbmQgKz0gYnl0ZXMpIHsKKyAgICB3Y2hhcl90IHdjOworCisgICAgaWYgKChieXRlcyA9IG1icnRvd2MoJndjLCBlbmQsIE1CX0NVUl9NQVgsIDApKT4wICYmIChjb2wgPSB3Y3dpZHRoKHdjKSk+PTApCisgICAgeworICAgICAgaWYgKCFlc2Ntb3JlIHx8IHdjPjI1NSB8fCAhc3RyY2hyKGVzY21vcmUsIHdjKSkgeworICAgICAgICBpZiAod2lkdGgtY29sdW1uczxjb2wpIGJyZWFrOworICAgICAgICBpZiAob3V0KSBmd3JpdGUoZW5kLCBieXRlcywgMSwgb3V0KTsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnl0ZXM8MSkgeworICAgICAgYnl0ZXMgPSAxOworICAgICAgd2MgPSAqZW5kOworICAgIH0KKyAgICBjb2wgPSB3aWR0aC1jb2x1bW5zOworICAgIGlmIChjb2w8MSkgYnJlYWs7CisgICAgY29sID0gZXNjb3V0KG91dCwgY29sLCB3Yyk7CisgIH0KKyAgKnN0ciA9IGVuZDsKKworICByZXR1cm4gY29sdW1uczsKK30KKworaW50IGNydW5jaF9lc2NhcGUoRklMRSAqb3V0LCBpbnQgY29scywgaW50IHdjKQoreworICBjaGFyIGJ1Zls4XTsKKyAgaW50IHJjOworCisgIGlmICh3YzwnICcpIHJjID0gc3ByaW50ZihidWYsICJeJWMiLCAnQCcrd2MpOworICBlbHNlIGlmICh3YzwyNTYpIHJjID0gc3ByaW50ZihidWYsICI8JTAyWD4iLCB3Yyk7CisgIGVsc2UgcmMgPSBzcHJpbnRmKGJ1ZiwgIlUrJTA0WCIsIHdjKTsKKworICBpZiAocmMgPiBjb2xzKSBidWZbcmMgPSBjb2xzXSA9IDA7CisgIGlmIChvdXQpIGZwdXRzKGJ1Ziwgb3V0KTsKKworICByZXR1cm4gcmM7Cit9CisKK2ludCBjcnVuY2hfcmV2X2VzY2FwZShGSUxFICpvdXQsIGludCBjb2xzLCBpbnQgd2MpCit7CisgIGludCByYzsKKworICB0dHlfZXNjKCI3bSIpOworICByYyA9IGNydW5jaF9lc2NhcGUob3V0LCBjb2xzLCB3Yyk7CisgIHR0eV9lc2MoIjI3bSIpOworCisgIHJldHVybiByYzsKK30KKworLy8gV3JpdGUgd2lkdGggY2hhcnMgYXQgc3RhcnQgb2Ygc3RyaW5nIHRvIHN0cmRvdXQgd2l0aCBzdGFuZGFyZCBlc2NhcGVzCisvLyBSZXR1cm5zIGxlbmd0aCBpbiBjb2x1bW5zIHNvIGNhbGxlciBjYW4gcGFkIGl0IG91dCB3aXRoIHNwYWNlcy4KK2ludCBkcmF3X3N0cihjaGFyICpzdGFydCwgaW50IHdpZHRoKQoreworICByZXR1cm4gY3J1bmNoX3N0cigmc3RhcnQsIHdpZHRoLCBzdGRvdXQsIDAsIGNydW5jaF9yZXZfZXNjYXBlKTsKK30KKworLy8gUmV0dXJuIHV0ZjggY29sdW1ucworaW50IHV0ZjhsZW4oY2hhciAqc3RyKQoreworICByZXR1cm4gY3J1bmNoX3N0cigmc3RyLCBJTlRfTUFYLCAwLCAwLCBjcnVuY2hfcmV2X2VzY2FwZSk7Cit9CisKKy8vIFJldHVybiBieXRlcyB1c2VkIGJ5ICh1cCB0bykgdGhpcyBtYW55IGNvbHVtbnMKK2ludCB1dGY4c2tpcChjaGFyICpzdHIsIGludCB3aWR0aCkKK3sKKyAgY2hhciAqcyA9IHN0cjsKKworICBjcnVuY2hfc3RyKCZzLCB3aWR0aCwgMCwgMCwgY3J1bmNoX3Jldl9lc2NhcGUpOworCisgIHJldHVybiBzLXN0cjsKK30KKworLy8gUHJpbnQgdXRmOCB0byBzdGRvdXQgd2l0aCBzdGFuZGFyZCBlc2NhcGVzLCB0cmltbWVkIHRvIHdpZHRoIGFuZCBwYWRkZWQKKy8vIG91dCB0byBwYWR0by4gSWYgcGFkdG88MCBsZWZ0IGp1c3RpZnkuIFJldHVybnMgY29sdW1ucyBwcmludGVkCitpbnQgZHJhd190cmltX2VzYyhjaGFyICpzdHIsIGludCBwYWR0bywgaW50IHdpZHRoLCBjaGFyICplc2Ntb3JlLAorICBpbnQgKCplc2NvdXQpKEZJTEUgKm91dCwgaW50IGNvbHMsIGludCB3YykpCit7CisgIGludCBhcGFkID0gYWJzKHBhZHRvKSwgbGVuID0gdXRmOGxlbihzdHIpOworCisgIGlmIChwYWR0bzwwICYmIGxlbj53aWR0aCkgc3RyICs9IHV0Zjhza2lwKHN0ciwgbGVuLXdpZHRoKTsKKyAgaWYgKGxlbj53aWR0aCkgbGVuID0gd2lkdGg7CisKKyAgLy8gTGVmdCBwYWQgaWYgcmlnaHQganVzdGlmaWVkIAorICBpZiAocGFkdG8+MCAmJiBhcGFkPmxlbikgcHJpbnRmKCIlKnMiLCBhcGFkLWxlbiwgIiIpOworICBjcnVuY2hfc3RyKCZzdHIsIGxlbiwgc3Rkb3V0LCAwLCBjcnVuY2hfcmV2X2VzY2FwZSk7CisgIGlmIChwYWR0bzwwICYmIGFwYWQ+bGVuKSBwcmludGYoIiUqcyIsIGFwYWQtbGVuLCAiIik7CisKKyAgcmV0dXJuIChhcGFkID4gbGVuKSA/IGFwYWQgOiBsZW47Cit9CisKKy8vIGRyYXdfdHJpbV9lc2MoKSB3aXRoIGRlZmF1bHQgZXNjYXBlCitpbnQgZHJhd190cmltKGNoYXIgKnN0ciwgaW50IHBhZHRvLCBpbnQgd2lkdGgpCit7CisgIHJldHVybiBkcmF3X3RyaW1fZXNjKHN0ciwgcGFkdG8sIHdpZHRoLCAwLCAwKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9saWIvbGxpc3QuYyBiL3RveWJveC9saWIvbGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI1MzUyCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9sbGlzdC5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiBsbGlzdC5jIC0gTGlua2VkIGxpc3QgZnVuY3Rpb25zCisgKgorICogTGlua2VkIGxpc3Qgc3RydWN0dXJlcyBoYXZlIGEgbmV4dCBwb2ludGVyIGFzIHRoZWlyIGZpcnN0IGVsZW1lbnQuCisgKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZnJlZSBkYXRhIHBvaW50ZXIgb2YgZG91YmxlX2xpc3Qgb3IgYXJnX2xpc3QKKwordm9pZCBsbGlzdF9mcmVlX2FyZyh2b2lkICpub2RlKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmQgPSBub2RlOworCisgIGZyZWUoZC0+YXJnKTsKKyAgZnJlZShkKTsKK30KKwordm9pZCBsbGlzdF9mcmVlX2RvdWJsZSh2b2lkICpub2RlKQoreworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmQgPSBub2RlOworCisgIGZyZWUoZC0+ZGF0YSk7CisgIGZyZWUoZCk7Cit9CisKKy8vIENhbGwgYSBmdW5jdGlvbiAoc3VjaCBhcyBmcmVlKCkpIG9uIGVhY2ggZWxlbWVudCBvZiBhIGxpbmtlZCBsaXN0Lgordm9pZCBsbGlzdF90cmF2ZXJzZSh2b2lkICpsaXN0LCB2b2lkICgqdXNpbmcpKHZvaWQgKm5vZGUpKQoreworICB2b2lkICpvbGQgPSBsaXN0OworCisgIHdoaWxlIChsaXN0KSB7CisgICAgdm9pZCAqcG9wID0gbGxpc3RfcG9wKCZsaXN0KTsKKyAgICB1c2luZyhwb3ApOworCisgICAgLy8gRW5kIGRvdWJseSBsaW5rZWQgbGlzdCB0b28uCisgICAgaWYgKG9sZCA9PSBsaXN0KSBicmVhazsKKyAgfQorfQorCisvLyBSZXR1cm4gdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgbGlzdCwgYWR2YW5jaW5nIHRoZSBsaXN0ICh3aGljaCBtdXN0IGJlIGNhbGxlZAorLy8gYXMgJmxpc3QpCit2b2lkICpsbGlzdF9wb3Aodm9pZCAqbGlzdCkKK3sKKyAgLy8gSSdkIHVzZSBhIHZvaWQgKiogZm9yIHRoZSBhcmd1bWVudCwgYW5kIGV2ZW4gYWNjZXB0IHRoZSB0eXBlY2FzdCBpbiBhbGwKKyAgLy8gY2FsbGVycyBhcyBkb2N1bWVudGF0aW9uIHlvdSBuZWVkIHRoZSAmLCBleGNlcHQgdGhlIHN0dXBpZCBjb21waWxlcgorICAvLyB3b3VsZCB0aGVuIHNjcmVhbSBhYm91dCB0eXBlLXB1bm5lZCBwb2ludGVycy4gIFNjcmV3IGl0LgorICB2b2lkICoqbGxpc3QgPSAodm9pZCAqKilsaXN0OworICB2b2lkICoqbmV4dCA9ICh2b2lkICoqKSpsbGlzdDsKKyAgKmxsaXN0ID0gKm5leHQ7CisKKyAgcmV0dXJuICh2b2lkICopbmV4dDsKK30KKwordm9pZCAqZGxpc3RfcG9wKHZvaWQgKmxpc3QpCit7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqKnBkbGlzdCA9IChzdHJ1Y3QgZG91YmxlX2xpc3QgKiopbGlzdCwgKmRsaXN0ID0gKnBkbGlzdDsKKworICBpZiAoZGxpc3QtPm5leHQgPT0gZGxpc3QpICpwZGxpc3QgPSAwOworICBlbHNlIHsKKyAgICBkbGlzdC0+bmV4dC0+cHJldiA9IGRsaXN0LT5wcmV2OworICAgIGRsaXN0LT5wcmV2LT5uZXh0ID0gKnBkbGlzdCA9IGRsaXN0LT5uZXh0OworICB9CisKKyAgcmV0dXJuIGRsaXN0OworfQorCit2b2lkIGRsaXN0X2FkZF9ub21hbGxvYyhzdHJ1Y3QgZG91YmxlX2xpc3QgKipsaXN0LCBzdHJ1Y3QgZG91YmxlX2xpc3QgKm5ldykKK3sKKyAgaWYgKCpsaXN0KSB7CisgICAgbmV3LT5uZXh0ID0gKmxpc3Q7CisgICAgbmV3LT5wcmV2ID0gKCpsaXN0KS0+cHJldjsKKyAgICAoKmxpc3QpLT5wcmV2LT5uZXh0ID0gbmV3OworICAgICgqbGlzdCktPnByZXYgPSBuZXc7CisgIH0gZWxzZSAqbGlzdCA9IG5ldy0+bmV4dCA9IG5ldy0+cHJldiA9IG5ldzsKK30KKworCisvLyBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZiBhIGRvdWJseSBsaW5rZWQgbGlzdAorc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdF9hZGQoc3RydWN0IGRvdWJsZV9saXN0ICoqbGlzdCwgY2hhciAqZGF0YSkKK3sKKyAgc3RydWN0IGRvdWJsZV9saXN0ICpuZXcgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZG91YmxlX2xpc3QpKTsKKworICBuZXctPmRhdGEgPSBkYXRhOworICBkbGlzdF9hZGRfbm9tYWxsb2MobGlzdCwgbmV3KTsKKworICByZXR1cm4gbmV3OworfQorCisvLyBUZXJtaW5hdGUgY2lyY3VsYXIgbGlzdCBmb3IgdHJhdmVyc2FsIGluIGVpdGhlciBkaXJlY3Rpb24uIFJldHVybnMgZW5kICouCit2b2lkICpkbGlzdF90ZXJtaW5hdGUodm9pZCAqbGlzdCkKK3sKKyAgc3RydWN0IGRvdWJsZV9saXN0ICplbmQgPSBsaXN0OworCisgIGlmICghbGlzdCkgcmV0dXJuIDA7CisKKyAgZW5kID0gZW5kLT5wcmV2OworICBlbmQtPm5leHQtPnByZXYgPSAwOworICBlbmQtPm5leHQgPSAwOworCisgIHJldHVybiBlbmQ7Cit9CisKKy8vIEZpbmQgbnVtIGluIGNhY2hlCitzdHJ1Y3QgbnVtX2NhY2hlICpnZXRfbnVtX2NhY2hlKHN0cnVjdCBudW1fY2FjaGUgKmNhY2hlLCBsb25nIGxvbmcgbnVtKQoreworICB3aGlsZSAoY2FjaGUpIHsKKyAgICBpZiAobnVtPT1jYWNoZS0+bnVtKSByZXR1cm4gY2FjaGU7CisgICAgY2FjaGUgPSBjYWNoZS0+bmV4dDsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyBVbmlxdWVseSBhZGQgbnVtK2RhdGEgdG8gY2FjaGUuIFVwZGF0ZXMgKmNhY2hlLCByZXR1cm5zIHBvaW50ZXIgdG8gZXhpc3RpbmcKKy8vIGVudHJ5IGlmIGl0IHdhcyBhbHJlYWR5IHRoZXJlLgorc3RydWN0IG51bV9jYWNoZSAqYWRkX251bV9jYWNoZShzdHJ1Y3QgbnVtX2NhY2hlICoqY2FjaGUsIGxvbmcgbG9uZyBudW0sCisgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisgIHN0cnVjdCBudW1fY2FjaGUgKm9sZCA9IGdldF9udW1fY2FjaGUoKmNhY2hlLCBudW0pOworCisgIGlmIChvbGQpIHJldHVybiBvbGQ7CisKKyAgb2xkID0geHphbGxvYyhzaXplb2Yoc3RydWN0IG51bV9jYWNoZSkrbGVuKTsKKyAgb2xkLT5uZXh0ID0gKmNhY2hlOworICBvbGQtPm51bSA9IG51bTsKKyAgbWVtY3B5KG9sZC0+ZGF0YSwgZGF0YSwgbGVuKTsKKyAgKmNhY2hlID0gb2xkOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L2xpYi9sc20uaCBiL3RveWJveC9saWIvbHNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxZDQyNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9saWIvbHNtLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIGxzbS5oIC0gaGVhZGVyIGZpbGUgZm9yIGxpYiBkaXJlY3RvcnkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICovCisKKyNpbmNsdWRlIDxzeXMveGF0dHIuaD4KKworI2lmIENGR19UT1lCT1hfU0VMSU5VWAorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2Vsc2UKKyNkZWZpbmUgaXNfc2VsaW51eF9lbmFibGVkKCkgMAorI2RlZmluZSBzZXRmc2NyZWF0ZWNvbiguLi4pICgtMSkKKyNkZWZpbmUgZ2V0Y29uKC4uLikgKC0xKQorI2RlZmluZSBnZXRmaWxlY29uKC4uLikgKC0xKQorI2RlZmluZSBsZ2V0ZmlsZWNvbiguLi4pICgtMSkKKyNkZWZpbmUgZmdldGZpbGVjb24oLi4uKSAoLTEpCisjZGVmaW5lIHNldGZpbGVjb24oLi4uKSAoLTEpCisjZGVmaW5lIGxzZXRmaWxlY29uKC4uLikgKC0xKQorI2RlZmluZSBmc2V0ZmlsZWNvbiguLi4pICgtMSkKKyNlbmRpZgorCisjaWYgQ0ZHX1RPWUJPWF9TTUFDSworI2luY2x1ZGUgPHN5cy9zbWFjay5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjZWxzZQorI2lmbmRlZiBYQVRUUl9OQU1FX1NNQUNLCisjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0sgMAorI2VuZGlmCisvL3NzaXplX3QgZmdldHhhdHRyIChpbnQgZmQsIGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSk7CisjZGVmaW5lIHNtYWNrX3NtYWNrZnNfcGF0aCguLi4pICgtMSkKKyNkZWZpbmUgc21hY2tfbmV3X2xhYmVsX2Zyb21fc2VsZiguLi4pICgtMSkKKyNkZWZpbmUgc21hY2tfbmV3X2xhYmVsX2Zyb21fcGF0aCguLi4pICgtMSkKKyNkZWZpbmUgc21hY2tfbmV3X2xhYmVsX2Zyb21fZmlsZSguLi4pICgtMSkKKyNkZWZpbmUgc21hY2tfc2V0X2xhYmVsX2Zvcl9zZWxmKC4uLikgKC0xKQorI2RlZmluZSBzbWFja19zZXRfbGFiZWxfZm9yX3BhdGgoLi4uKSAoLTEpCisjZGVmaW5lIHNtYWNrX3NldF9sYWJlbF9mb3JfZmlsZSguLi4pICgtMSkKKyNlbmRpZgorCisvLyBUaGlzIHR1cm5zIGludG8gInJldHVybiAwIiB3aGVuIG5vIExTTSBhbmQgbGV0cyBjb2RlIG9wdGltaXplIG91dC4KK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9lbmFibGVkKHZvaWQpCit7CisgIGlmIChDRkdfVE9ZQk9YX1NNQUNLKSByZXR1cm4gISFzbWFja19zbWFja2ZzX3BhdGgoKTsKKyAgZWxzZSByZXR1cm4gaXNfc2VsaW51eF9lbmFibGVkKCkgPT0gMTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpsc21fbmFtZSh2b2lkKQoreworICBpZiAoQ0ZHX1RPWUJPWF9TTUFDSykgcmV0dXJuICJTbWFjayI7CisgIGlmIChDRkdfVE9ZQk9YX1NFTElOVVgpIHJldHVybiAiU0VMaW51eCI7CisKKyAgcmV0dXJuICJMU00iOworfQorCisvLyBGZXRjaCB0aGlzIHByb2Nlc3MncyBsc20gY29udGV4dAorc3RhdGljIGlubGluZSBjaGFyICpsc21fY29udGV4dCh2b2lkKQoreworICBpbnQgb2sgPSAwOworICBjaGFyICpyZXN1bHQ7CisKKyAgaWYgKENGR19UT1lCT1hfU01BQ0spIG9rID0gc21hY2tfbmV3X2xhYmVsX2Zyb21fc2VsZigmcmVzdWx0KSA+IDA7CisgIGVsc2Ugb2sgPSBnZXRjb24oJnJlc3VsdCkgPT0gMDsKKworICByZXR1cm4gb2sgPyByZXN1bHQgOiBzdHJkdXAoIj8iKTsKK30KKworLy8gU2V0IGRlZmF1bHQgbGFiZWwgdG8gYXBwbHkgdG8gbmV3bHkgY3JlYXRlZCBzdHVmZiAoTlVMTCB0byBjbGVhciBpdCkKK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9zZXRfY3JlYXRlKGNoYXIgKmNvbnRleHQpCit7CisgIGlmIChDRkdfVE9ZQk9YX1NNQUNLKSByZXR1cm4gc21hY2tfc2V0X2xhYmVsX2Zvcl9zZWxmKGNvbnRleHQpOworICBlbHNlIHJldHVybiBzZXRmc2NyZWF0ZWNvbihjb250ZXh0KTsKK30KKworLy8gTGFiZWwgYSBmaWxlLCBmb2xsb3dpbmcgc3ltbGlua3MKK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9zZXRfY29udGV4dChjaGFyICpmaWxlbmFtZSwgY2hhciAqY29udGV4dCkKK3sKKyAgaWYgKENGR19UT1lCT1hfU01BQ0spCisgICAgcmV0dXJuIHNtYWNrX3NldF9sYWJlbF9mb3JfcGF0aChmaWxlbmFtZSwgWEFUVFJfTkFNRV9TTUFDSywgMSwgY29udGV4dCk7CisgIGVsc2UgcmV0dXJuIHNldGZpbGVjb24oZmlsZW5hbWUsIGNvbnRleHQpOworfQorCisvLyBMYWJlbCBhIGZpbGUsIGRvbid0IGZvbGxvdyBzeW1saW5rcworc3RhdGljIGlubGluZSBpbnQgbHNtX2xzZXRfY29udGV4dChjaGFyICpmaWxlbmFtZSwgY2hhciAqY29udGV4dCkKK3sKKyAgaWYgKENGR19UT1lCT1hfU01BQ0spCisgICAgcmV0dXJuIHNtYWNrX3NldF9sYWJlbF9mb3JfcGF0aChmaWxlbmFtZSwgWEFUVFJfTkFNRV9TTUFDSywgMCwgY29udGV4dCk7CisgIGVsc2UgcmV0dXJuIGxzZXRmaWxlY29uKGZpbGVuYW1lLCBjb250ZXh0KTsKK30KKworLy8gTGFiZWwgYSBmaWxlIGJ5IGZpbGVoYW5kbGUKK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9mc2V0X2NvbnRleHQoaW50IGZpbGUsIGNoYXIgKmNvbnRleHQpCit7CisgIGlmIChDRkdfVE9ZQk9YX1NNQUNLKQorICAgIHJldHVybiBzbWFja19zZXRfbGFiZWxfZm9yX2ZpbGUoZmlsZSwgWEFUVFJfTkFNRV9TTUFDSywgY29udGV4dCk7CisgIGVsc2UgcmV0dXJuIGZzZXRmaWxlY29uKGZpbGUsIGNvbnRleHQpOworfQorCisvLyByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3Igb3IgZWxzZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0ICovCisvLyBjb250ZXh0IGNhbiBiZSBOVUxMIHRvIGdldCB0aGUgbGVuZ3RoIG9ubHkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9nZXRfY29udGV4dChjaGFyICpmaWxlbmFtZSwgY2hhciAqKmNvbnRleHQpCit7CisgIGlmIChDRkdfVE9ZQk9YX1NNQUNLKQorICAgIHJldHVybiBzbWFja19uZXdfbGFiZWxfZnJvbV9wYXRoKGZpbGVuYW1lLCBYQVRUUl9OQU1FX1NNQUNLLCAxLCBjb250ZXh0KTsKKyAgZWxzZSByZXR1cm4gZ2V0ZmlsZWNvbihmaWxlbmFtZSwgY29udGV4dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxzbV9sZ2V0X2NvbnRleHQoY2hhciAqZmlsZW5hbWUsIGNoYXIgKipjb250ZXh0KQoreworICBpZiAoQ0ZHX1RPWUJPWF9TTUFDSykKKyAgICByZXR1cm4gc21hY2tfbmV3X2xhYmVsX2Zyb21fcGF0aChmaWxlbmFtZSwgWEFUVFJfTkFNRV9TTUFDSywgMCwgY29udGV4dCk7CisgIGVsc2UgcmV0dXJuIGxnZXRmaWxlY29uKGZpbGVuYW1lLCBjb250ZXh0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbHNtX2ZnZXRfY29udGV4dChpbnQgZmlsZSwgY2hhciAqKmNvbnRleHQpCit7CisgIGlmIChDRkdfVE9ZQk9YX1NNQUNLKQorICAgIHJldHVybiBzbWFja19uZXdfbGFiZWxfZnJvbV9maWxlKGZpbGUsIFhBVFRSX05BTUVfU01BQ0ssIGNvbnRleHQpOworICByZXR1cm4gZmdldGZpbGVjb24oZmlsZSwgY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvbGliL25ldC5jIGIvdG95Ym94L2xpYi9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTcyYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9uZXQuYwpAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSAidG95cy5oIgorCitpbnQgeHNvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBpbnQgZmQgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisKKyAgaWYgKGZkIDwgMCkgcGVycm9yX2V4aXQoInNvY2tldCAleCAleCIsIHR5cGUsIHByb3RvY29sKTsKKyAgcmV0dXJuIGZkOworfQorCit2b2lkIHhzZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0LCB2b2lkICp2YWwsIHNvY2tsZW5fdCBsZW4pCit7CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KGZkLCBsZXZlbCwgb3B0LCB2YWwsIGxlbikpIHBlcnJvcl9leGl0KCJzZXRzb2Nrb3B0Iik7Cit9CisKK2ludCB4Y29ubmVjdChjaGFyICpob3N0LCBjaGFyICpwb3J0LCBpbnQgZmFtaWx5LCBpbnQgc29ja3R5cGUsIGludCBwcm90b2NvbCwKKyAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCBhZGRyaW5mbyBpbmZvLCAqYWksICphaTI7CisgIGludCBmZDsKKworICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgaW5mby5haV9mYW1pbHkgPSBmYW1pbHk7CisgIGluZm8uYWlfc29ja3R5cGUgPSBzb2NrdHlwZTsKKyAgaW5mby5haV9wcm90b2NvbCA9IHByb3RvY29sOworICBpbmZvLmFpX2ZsYWdzID0gZmxhZ3M7CisKKyAgZmQgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaW5mbywgJmFpKTsKKyAgaWYgKGZkIHx8ICFhaSkKKyAgICBlcnJvcl9leGl0KCJDb25uZWN0ICclcyVzJXMnOiAlcyIsIGhvc3QsIHBvcnQgPyAiOiIgOiAiIiwgcG9ydCA/IHBvcnQgOiAiIiwKKyAgICAgIGZkID8gZ2FpX3N0cmVycm9yKGZkKSA6ICJub3QgZm91bmQiKTsKKworICAvLyBUcnkgYWxsIHRoZSByZXR1cm5lZCBhZGRyZXNzZXMuIFJlcG9ydCBlcnJvcnMgaWYgbGFzdCBlbnRyeSBjYW4ndCBjb25uZWN0LgorICBmb3IgKGFpMiA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworICAgIGZkID0gKGFpLT5haV9uZXh0ID8gc29ja2V0IDogeHNvY2tldCkoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLAorICAgICAgYWktPmFpX3Byb3RvY29sKTsKKyAgICBpZiAoIWNvbm5lY3QoZmQsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikpIGJyZWFrOworICAgIGVsc2UgaWYgKCFhaTItPmFpX25leHQpIHBlcnJvcl9leGl0KCJjb25uZWN0Iik7CisgICAgY2xvc2UoZmQpOworICB9CisgIGZyZWVhZGRyaW5mbyhhaTIpOworCisgIHJldHVybiBmZDsKK30KKworaW50IHhwb2xsKHN0cnVjdCBwb2xsZmQgKmZkcywgaW50IG5mZHMsIGludCB0aW1lb3V0KQoreworICBpbnQgaTsKKworICBmb3IgKDs7KSB7CisgICAgaWYgKDA+KGkgPSBwb2xsKGZkcywgbmZkcywgdGltZW91dCkpKSB7CisgICAgICBpZiAodG95cy5zaWduYWwpIHJldHVybiBpOworICAgICAgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVOT01FTSkgcGVycm9yX2V4aXQoInhwb2xsIik7CisgICAgICBlbHNlIGlmICh0aW1lb3V0PjApIHRpbWVvdXQtLTsKKyAgICB9IGVsc2UgcmV0dXJuIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC9saWIvcGFzc3dvcmQuYyBiL3RveWJveC9saWIvcGFzc3dvcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIyZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9wYXNzd29yZC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKiBwYXNzd29yZC5jIC0gcGFzc3dvcmQgcmVhZC91cGRhdGUgaGVscGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqCisgKiBUT0RPOiBjbGVhbnVwCisgKi8KKworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisKKy8vIGdlbmVyYXRlIGFwcHJvcHJpYXRlIHJhbmRvbSBzYWx0IHN0cmluZyBmb3IgZ2l2ZW4gZW5jcnlwdGlvbiBhbGdvcml0aG0uCitpbnQgZ2V0X3NhbHQoY2hhciAqc2FsdCwgY2hhciAqYWxnbykKK3sKKyAgc3RydWN0IHsKKyAgICBjaGFyICp0eXBlLCBpZCwgbGVuOworICB9IGFsW10gPSB7eyJkZXMiLCAwLCAyfSwgeyJtZDUiLCAxLCA4fSwgeyJzaGEyNTYiLCA1LCAxNn0sIHsic2hhNTEyIiwgNiwgMTZ9fTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX0xFTihhbCk7IGkrKykgeworICAgIGlmICghc3RyY21wKGFsZ28sIGFsW2ldLnR5cGUpKSB7CisgICAgICBpbnQgbGVuID0gYWxbaV0ubGVuOworICAgICAgY2hhciAqcyA9IHNhbHQ7CisKKyAgICAgIGlmIChhbFtpXS5pZCkgcyArPSBzcHJpbnRmKHMsICIkJWMkIiwgJzAnK2FsW2ldLmlkKTsKKworICAgICAgLy8gUmVhZCBhcHByb3ByaWF0ZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIGZvciBzYWx0CisgICAgICBpID0geG9wZW5ybygiL2Rldi91cmFuZG9tIik7CisgICAgICB4cmVhZGFsbChpLCBsaWJidWYsICgobGVuKjYpKzcpLzgpOworICAgICAgY2xvc2UoaSk7CisKKyAgICAgIC8vIEdyYWIgNiBiaXQgY2h1bmtzIGFuZCBjb252ZXJ0IHRvIGNoYXJhY3RlcnMgaW4gLi8wLTlhLXpBLVoKKyAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIGludCBiaXRwb3MgPSBpKjYsIGJpdHMgPSBiaXRwb3MvODsKKworICAgICAgICBiaXRzID0gKChsaWJidWZbaV0rKGxpYmJ1ZltpKzFdPDw4KSkgPj4gKGJpdHBvcyY3KSkgJiAweDNmOworICAgICAgICBiaXRzICs9IDQ2OworICAgICAgICBpZiAoYml0cyA+IDU3KSBiaXRzICs9IDc7CisgICAgICAgIGlmIChiaXRzID4gOTApIGJpdHMgKz0gNjsKKworICAgICAgICBzW2ldID0gYml0czsKKyAgICAgIH0KKyAgICAgIHNhbHRbbGVuXSA9IDA7CisKKyAgICAgIHJldHVybiBzLXNhbHQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvLyBQcm9tcHQgd2l0aCBtZXNnLCByZWFkIHBhc3N3b3JkIGludG8gYnVmLCByZXR1cm4gMCBmb3Igc3VjY2VzcyAxIGZvciBmYWlsCitpbnQgcmVhZF9wYXNzd29yZChjaGFyICpidWYsIGludCBidWZsZW4sIGNoYXIgKm1lc2cpCit7CisgIHN0cnVjdCB0ZXJtaW9zIG9sZHRlcm1pbzsKKyAgc3RydWN0IHNpZ2FjdGlvbiBzYSwgb2xkc2E7CisgIGludCBpLCByZXQgPSAxOworCisgIC8vIE5PUCBzaWduYWwgaGFuZGxlciB0byByZXR1cm4gZnJvbSB0aGUgcmVhZAorICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgc2Euc2FfaGFuZGxlciA9IGdlbmVyaWNfc2lnbmFsOworICBzaWdhY3Rpb24oU0lHSU5ULCAmc2EsICZvbGRzYSk7CisKKyAgdGNmbHVzaCgwLCBUQ0lGTFVTSCk7CisgIHNldF90ZXJtaW5hbCgwLCAxLCAmb2xkdGVybWlvKTsKKworICB4cHJpbnRmKCIlcyIsIG1lc2cpOworCisgIGZvciAoaT0wOyBpIDwgYnVmbGVuLTE7IGkrKykgeworICAgIGlmICgocmV0ID0gcmVhZCgwLCBidWYraSwgMSkpIDwgMCB8fCAoIXJldCAmJiAhaSkpIHsKKyAgICAgIGkgPSAwOworICAgICAgcmV0ID0gMTsKKworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmICghcmV0IHx8IGJ1ZltpXSA9PSAnXG4nIHx8IGJ1ZltpXSA9PSAnXHInKSB7CisgICAgICByZXQgPSAwOworCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGJ1ZltpXSA9PSA4IHx8IGJ1ZltpXSA9PSAxMjcpIGkgLT0gaSA/IDIgOiAxOworICB9CisKKyAgLy8gUmVzdG9yZSB0ZXJtaW5hbC9zaWduYWwgc3RhdGUsIHRlcm1pbmF0ZSBzdHJpbmcKKyAgc2lnYWN0aW9uKFNJR0lOVCwgJm9sZHNhLCBOVUxMKTsKKyAgdGNzZXRhdHRyKDAsIFRDU0FOT1csICZvbGR0ZXJtaW8pOworICBidWZbaV0gPSAwOworICB4cHV0YygnXG4nKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqZ2V0X25leHRjb2xvbihjaGFyICpsaW5lLCBpbnQgY250KQoreworICB3aGlsZSAoY250LS0pIHsKKyAgICBpZiAoIShsaW5lID0gc3RyY2hyKGxpbmUsICc6JykpKSBlcnJvcl9leGl0KCJJbnZhbGlkIEVudHJ5XG4iKTsKKyAgICBsaW5lKys7IC8vanVtcCBwYXN0IHRoZSBjb2xvbgorICB9CisgIHJldHVybiBsaW5lOworfQorCisvKnVwZGF0ZV9wYXNzd29yZCBpcyB1c2VkIGJ5IG11bHRpcGxlIHV0aWxpdGllcyB0byB1cGRhdGUgL2V0Yy9wYXNzd2QsCisgKiAvZXRjL3NoYWRvdywgL2V0Yy9ncm91cCBhbmQgL2V0Yy9nc2hhZG93IGZpbGVzLAorICogd2hpY2ggYXJlIHVzZWQgYXMgdXNlciwgZ3JvdXAgZGF0YWJlc2VzCisgKiBlbnRyeSBjYW4gYmUKKyAqIDEuIGVuY3J5cHRlZCBwYXNzd29yZCwgd2hlbiB1cGRhdGluZyB1c2VyIHBhc3N3b3JkLgorICogMi4gY29tcGxldGUgZW50cnkgZm9yIHVzZXIgZGV0YWlscywgd2hlbiBjcmVhdGluZyBuZXcgdXNlcgorICogMy4gZ3JvdXAgbWVtYmVycyBjb21tYScsJyBzZXBhcmF0ZWQgbGlzdCwgd2hlbiBhZGRpbmcgdXNlciB0byBncm91cAorICogNC4gY29tcGxldGUgZW50cnkgZm9yIGdyb3VwIGRldGFpbHMsIHdoZW4gY3JlYXRpbmcgbmV3IGdyb3VwCisgKiA1LiBlbnRyeSA9IE5VTEwsIGRlbGV0ZSB0aGUgbmFtZWQgZW50cnkgdXNlci9ncm91cAorICovCitpbnQgdXBkYXRlX3Bhc3N3b3JkKGNoYXIgKmZpbGVuYW1lLCBjaGFyKiB1c2VybmFtZSwgY2hhciogZW50cnkpCit7CisgIGNoYXIgKmZpbGVuYW1lc2Z4ID0gTlVMTCwgKm5hbWVzZnggPSBOVUxMLCAqc2hhZG93ID0gTlVMTCwKKyAgICAgICAqc2Z4ID0gTlVMTCwgKmxpbmUgPSBOVUxMOworICBGSUxFICpleGZwLCAqbmV3ZnA7CisgIGludCByZXQgPSAtMSwgZm91bmQgPSAwOworICBzdHJ1Y3QgZmxvY2sgbG9jazsKKworICBzaGFkb3cgPSBzdHJzdHIoZmlsZW5hbWUsICJzaGFkb3ciKTsKKyAgZmlsZW5hbWVzZnggPSB4bXByaW50ZigiJXMrIiwgZmlsZW5hbWUpOworICBzZnggPSBzdHJjaHIoZmlsZW5hbWVzZngsICcrJyk7CisKKyAgZXhmcCA9IGZvcGVuKGZpbGVuYW1lLCAicisiKTsKKyAgaWYgKCFleGZwKSB7CisgICAgcGVycm9yX21zZygiQ291bGRuJ3Qgb3BlbiBmaWxlICVzIixmaWxlbmFtZSk7CisgICAgZ290byBmcmVlX3N0b3JhZ2U7CisgIH0KKworICAqc2Z4ID0gJy0nOworICB1bmxpbmsoZmlsZW5hbWVzZngpOworICByZXQgPSBsaW5rKGZpbGVuYW1lLCBmaWxlbmFtZXNmeCk7CisgIGlmIChyZXQgPCAwKSBlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBiYWNrdXAgZmlsZSIpOworCisgICpzZnggPSAnKyc7CisgIGxvY2subF90eXBlID0gRl9XUkxDSzsKKyAgbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworICBsb2NrLmxfc3RhcnQgPSAwOworICBsb2NrLmxfbGVuID0gMDsKKworICByZXQgPSBmY250bChmaWxlbm8oZXhmcCksIEZfU0VUTEssICZsb2NrKTsKKyAgaWYgKHJldCA8IDApIHBlcnJvcl9tc2coIkNvdWxkbid0IGxvY2sgZmlsZSAlcyIsZmlsZW5hbWUpOworCisgIGxvY2subF90eXBlID0gRl9VTkxDSzsgLy91bmxvY2tpbmcgYXQgYSBsYXRlciBzdGFnZQorCisgIG5ld2ZwID0gZm9wZW4oZmlsZW5hbWVzZngsICJ3KyIpOworICBpZiAoIW5ld2ZwKSB7CisgICAgZXJyb3JfbXNnKCJjb3VsZG4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmciKTsKKyAgICByZXQgPSAtMTsKKyAgICBmY2xvc2UoZXhmcCk7CisgICAgZ290byBmcmVlX3N0b3JhZ2U7CisgIH0KKworICByZXQgPSAwOworICBuYW1lc2Z4ID0geG1wcmludGYoIiVzOiIsdXNlcm5hbWUpOworICB3aGlsZSAoKGxpbmUgPSBnZXRfbGluZShmaWxlbm8oZXhmcCkpKSAhPSBOVUxMKQorICB7CisgICAgaWYgKHN0cm5jbXAobGluZSwgbmFtZXNmeCwgc3RybGVuKG5hbWVzZngpKSkKKyAgICAgIGZwcmludGYobmV3ZnAsICIlc1xuIiwgbGluZSk7CisgICAgZWxzZSBpZiAoZW50cnkpIHsKKyAgICAgIGNoYXIgKmN1cnJlbnRfcHRyID0gTlVMTDsKKworICAgICAgZm91bmQgPSAxOworICAgICAgaWYgKCFzdHJjbXAodG95cy53aGljaC0+bmFtZSwgInBhc3N3ZCIpKSB7CisgICAgICAgIGZwcmludGYobmV3ZnAsICIlcyVzOiIsbmFtZXNmeCwgZW50cnkpOworICAgICAgICBjdXJyZW50X3B0ciA9IGdldF9uZXh0Y29sb24obGluZSwgMik7IC8vcGFzdCBwYXNzd2QKKyAgICAgICAgaWYgKHNoYWRvdykgeworICAgICAgICAgIGZwcmludGYobmV3ZnAsICIldToiLCh1bnNpZ25lZCkodGltZShOVUxMKSkvKDI0KjYwKjYwKSk7CisgICAgICAgICAgY3VycmVudF9wdHIgPSBnZXRfbmV4dGNvbG9uKGN1cnJlbnRfcHRyLCAxKTsKKyAgICAgICAgICBmcHJpbnRmKG5ld2ZwLCAiJXNcbiIsY3VycmVudF9wdHIpOworICAgICAgICB9IGVsc2UgZnByaW50ZihuZXdmcCwgIiVzXG4iLGN1cnJlbnRfcHRyKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0b3lzLndoaWNoLT5uYW1lLCAiZ3JvdXBhZGQiKSB8fAorICAgICAgICAgICFzdHJjbXAodG95cy53aGljaC0+bmFtZSwgImFkZGdyb3VwIikgfHwKKyAgICAgICAgICAhc3RyY21wKHRveXMud2hpY2gtPm5hbWUsICJkZWxncm91cCIpIHx8CisgICAgICAgICAgIXN0cmNtcCh0b3lzLndoaWNoLT5uYW1lLCAiZ3JvdXBkZWwiKSl7CisgICAgICAgIGN1cnJlbnRfcHRyID0gZ2V0X25leHRjb2xvbihsaW5lLCAzKTsgLy9wYXN0IGdpZC9hZG1pbiBsaXN0CisgICAgICAgICpjdXJyZW50X3B0ciA9ICdcMCc7CisgICAgICAgIGZwcmludGYobmV3ZnAsICIlcyIsIGxpbmUpOworICAgICAgICBmcHJpbnRmKG5ld2ZwLCAiJXNcbiIsIGVudHJ5KTsKKyAgICAgIH0KKyAgICB9CisgICAgZnJlZShsaW5lKTsKKyAgfQorICBmcmVlKG5hbWVzZngpOworICBpZiAoIWZvdW5kICYmIGVudHJ5KSBmcHJpbnRmKG5ld2ZwLCAiJXNcbiIsIGVudHJ5KTsKKyAgZmNudGwoZmlsZW5vKGV4ZnApLCBGX1NFVExLLCAmbG9jayk7CisgIGZjbG9zZShleGZwKTsKKworICBlcnJubyA9IDA7CisgIGZmbHVzaChuZXdmcCk7CisgIGZzeW5jKGZpbGVubyhuZXdmcCkpOworICBmY2xvc2UobmV3ZnApOworICByZW5hbWUoZmlsZW5hbWVzZngsIGZpbGVuYW1lKTsKKyAgaWYgKGVycm5vKSB7CisgICAgcGVycm9yX21zZygiRmlsZSBXcml0aW5nL1NhdmluZyBmYWlsZWQ6ICIpOworICAgIHVubGluayhmaWxlbmFtZXNmeCk7CisgICAgcmV0ID0gLTE7CisgIH0KKworZnJlZV9zdG9yYWdlOgorICBmcmVlKGZpbGVuYW1lc2Z4KTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9saWIvcGVuZGluZy5oIGIvdG95Ym94L2xpYi9wZW5kaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjYzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9saWIvcGVuZGluZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIHBlbmRpbmcuaCAtIGhlYWRlciBmb3IgcGVuZGluZy5jCisKKy8vIHBhc3N3b3JkLmMKKyNkZWZpbmUgTUFYX1NBTFRfTEVOICAyMCAvLzMgZm9yIGlkLCAxNiBmb3Iga2V5LCAxIGZvciAnXDAnCitpbnQgcmVhZF9wYXNzd29yZChjaGFyICogYnVmZiwgaW50IGJ1ZmxlbiwgY2hhciogbWVzZyk7CitpbnQgdXBkYXRlX3Bhc3N3b3JkKGNoYXIgKmZpbGVuYW1lLCBjaGFyKiB1c2VybmFtZSwgY2hhciogZW5jcnlwdGVkKTsKKworLy8gbGliLmMKKy8vIFRoZXNlIHNob3VsZCBiZSBzd2l0Y2hlZCB0byBwb3NpeC0yMDA4IGdldGxpbmUoKSBhbmQgZ2V0ZGVsaW0oKQorY2hhciAqZ2V0X3Jhd2xpbmUoaW50IGZkLCBsb25nICpwbGVuLCBjaGFyIGVuZCk7CitjaGFyICpnZXRfbGluZShpbnQgZmQpOworCisKKy8vIFRPRE8gdGhpcyBnb2VzIGF3YXkgd2hlbiBsaWIvcGFzc3dvcmQuYyBjbGVhbmVkIHVwCmRpZmYgLS1naXQgYS90b3lib3gvbGliL3BvcnRhYmlsaXR5LmMgYi90b3lib3gvbGliL3BvcnRhYmlsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNTAwYgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9saWIvcG9ydGFiaWxpdHkuYwpAQCAtMCwwICsxLDk0IEBACisvKiBwb3J0YWJpbGl0eS5jIC0gY29kZSB0byB3b3JrYXJvdW5kIHRoZSBkZWZpY2llbmNpZXMgb2YgdmFyaW91cyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDEyIEdlb3JnaSBDaG9yYmFkemhpeXNraSA8Z2ZAdW5peHNvbC5vcmc+CisgKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworLy8gV2UgY2FuJ3QgZm9yaygpIG9uIG5vbW11IHN5c3RlbXMsIGFuZCB2Zm9yaygpIHJlcXVpcmVzIGFuIGV4ZWMoKSBvciBleGl0KCkKKy8vIGJlZm9yZSByZXN1bWluZyB0aGUgcGFyZW50IChiZWNhdXNlIHRoZXkgc2hhcmUgYSBoZWFwIHVudGlsIHRoZW4pLiBBbmQgbm8sCisvLyB3ZSBjYW4ndCBpbXBsZW1lbnQgb3VyIG93biBjbG9uZSgpIGNhbGwgdGhhdCBkb2VzIHRoZSBlcXVpdmFsZW50IG9mIGZvcmsoKQorLy8gYmVjYXVzZSBub21tdSBoZWFwcyB1c2UgcGh5c2ljYWwgYWRkcmVzc2VzIHNvIGlmIHdlIGNvcHkgdGhlIGhlYXAgYWxsIG91cgorLy8gcG9pbnRlcnMgYXJlIHdyb25nLiAoWW91IG5lZWQgYW4gbW11IGluIG9yZGVyIHRvIG1hcCB0d28gaGVhcHMgdG8gdGhlIHNhbWUKKy8vIGFkZHJlc3MgcmFuZ2Ugd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuKSBJbiB0aGUgYWJzZW5jZSBvZgorLy8gYSBwb3J0YWJsZSB3YXkgdG8gdGVsbCBtYWxsb2MoKSB0byBzdGFydCBhIG5ldyBoZWFwIHdpdGhvdXQgZnJlZWluZyB0aGUgb2xkCisvLyBvbmUsIHlvdSBwcmV0dHkgbXVjaCBuZWVkIHRoZSBleGVjKCkuKQorCisvLyBTbyB3ZSBleGVjIG91cnNlbHZlcyAodmlhIC9wcm9jL3NlbGYvZXhlLCBpZiBhbnlib2R5IGtub3dzIGEgd2F5IHRvCisvLyByZS1leGVjIHNlbGYgd2l0aG91dCBkZXBlbmRpbmcgb24gdGhlIGZpbGVzeXN0ZW0sIEknbSBhbGwgZWFycyksCisvLyBhbmQgdXNlIHRoZSBhcmd1bWVudHMgdG8gc2lnbmFsIHJlZW50cnkuCisKKyNpZiBDRkdfVE9ZQk9YX0ZPUksKK3BpZF90IHhmb3JrKHZvaWQpCit7CisgIHBpZF90IHBpZCA9IGZvcmsoKTsKKworICBpZiAocGlkIDwgMCkgcGVycm9yX2V4aXQoImZvcmsiKTsKKworICByZXR1cm4gcGlkOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKK3NzaXplX3QgZ2V0ZGVsaW0oY2hhciAqKmxpbmVwLCBzaXplX3QgKm5wLCBpbnQgZGVsaW0sIEZJTEUgKnN0cmVhbSkKK3sKKyAgaW50IGNoOworICBzaXplX3QgbmV3X2xlbjsKKyAgc3NpemVfdCBpID0gMDsKKyAgY2hhciAqbGluZSwgKm5ld19saW5lOworCisgIC8vIEludmFsaWQgaW5wdXQKKyAgaWYgKCFsaW5lcCB8fCAhbnApIHsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKmxpbmVwID09IE5VTEwgfHwgKm5wID09IDApIHsKKyAgICAqbnAgPSAxMDI0OworICAgICpsaW5lcCA9IGNhbGxvYygxLCAqbnApOworICAgIGlmICgqbGluZXAgPT0gTlVMTCkgcmV0dXJuIC0xOworICB9CisgIGxpbmUgPSAqbGluZXA7CisKKyAgd2hpbGUgKChjaCA9IGdldGMoc3RyZWFtKSkgIT0gRU9GKSB7CisgICAgaWYgKGkgPiAqbnApIHsKKyAgICAgIC8vIE5lZWQgbW9yZSBzcGFjZQorICAgICAgbmV3X2xlbiA9ICpucCArIDEwMjQ7CisgICAgICBuZXdfbGluZSA9IHJlYWxsb2MoKmxpbmVwLCBuZXdfbGVuKTsKKyAgICAgIGlmICghbmV3X2xpbmUpIHJldHVybiAtMTsKKyAgICAgICpucCA9IG5ld19sZW47CisgICAgICBsaW5lID0gKmxpbmVwID0gbmV3X2xpbmU7CisgICAgfQorCisgICAgbGluZVtpXSA9IGNoOworICAgIGlmIChjaCA9PSBkZWxpbSkgYnJlYWs7CisgICAgaSArPSAxOworICB9CisKKyAgaWYgKGkgPiAqbnApIHsKKyAgICAvLyBOZWVkIG1vcmUgc3BhY2UKKyAgICBuZXdfbGVuICA9IGkgKyAyOworICAgIG5ld19saW5lID0gcmVhbGxvYygqbGluZXAsIG5ld19sZW4pOworICAgIGlmICghbmV3X2xpbmUpIHJldHVybiAtMTsKKyAgICAqbnAgPSBuZXdfbGVuOworICAgIGxpbmUgPSAqbGluZXAgPSBuZXdfbGluZTsKKyAgfQorICBsaW5lW2kgKyAxXSA9ICdcMCc7CisKKyAgcmV0dXJuIGkgPiAwID8gaSA6IC0xOworfQorCitzc2l6ZV90IGdldGxpbmUoY2hhciAqKmxpbmVwLCBzaXplX3QgKm5wLCBGSUxFICpzdHJlYW0pCit7CisgIHJldHVybiBnZXRkZWxpbShsaW5lcCwgbnAsICdcbicsIHN0cmVhbSk7Cit9CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworaW50IGNsZWFyZW52KHZvaWQpCit7CisgICplbnZpcm9uID0gTlVMTDsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3RveWJveC9saWIvcG9ydGFiaWxpdHkuaCBiL3RveWJveC9saWIvcG9ydGFiaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUwMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi9wb3J0YWJpbGl0eS5oCkBAIC0wLDAgKzEsMjc4IEBACisvLyBXb3JrYXJvdW5kcyBmb3IgaG9ycmlibGUgYnVpbGQgZW52aXJvbm1lbnQgaWRpb3N5bmNyYXNpZXMuCisKKy8vIEluc3RlYWQgb2YgcG9sbHV0aW5nIHRoZSBjb2RlIHdpdGggc3RyYW5nZSAjaWZkZWZzIHRvIHdvcmsgYXJvdW5kIGJ1Z3MKKy8vIGluIHNwZWNpZmljIGNvbXBpbGVyLCBsaWJyYXJ5LCBvciBPUyB2ZXJzaW9ucywgbG9jYWxpemUgYWxsIHRoYXQgaGVyZQorLy8gYW5kIGluIHBvcnRhYmlsaXR5LmMKKworLy8gRm9yIG11c2wKKyNkZWZpbmUgX0FMTF9TT1VSQ0UKKworLy8gVGVzdCBmb3IgZ2NjICh1c2luZyBjb21waWxlciBidWlsdGluICNkZWZpbmUpCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBub3JldHVybglfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZGVmaW5lIHByaW50Zl9mb3JtYXQJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQorI2Vsc2UKKyNkZWZpbmUgbm9yZXR1cm4KKyNkZWZpbmUgcHJpbnRmX2Zvcm1hdAorI2VuZGlmCisKKy8vIEFsd2F5cyB1c2UgbG9uZyBmaWxlIHN1cHBvcnQuCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKy8vIFRoaXMgaXNuJ3QgaW4gdGhlIHNwZWMsIGJ1dCBpdCdzIGhvdyB3ZSBkZXRlcm1pbmUgd2hhdCBsaWJjIHdlJ3JlIHVzaW5nLgorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLy8gVHlwZXMgdmFyaW91cyByZXBsYWNlbWVudCBwcm90b3R5cGVzIG5lZWQKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLy8gVmFyaW91cyBjb25zdGFudHMgb2xkIGJ1aWxkIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBldmVuIGlmIGtlcm5lbCBkb2VzCisKKyNpZm5kZWYgQVRfRkRDV0QKKyNkZWZpbmUgQVRfRkRDV0QgLTEwMAorI2VuZGlmCisKKyNpZm5kZWYgQVRfU1lNTElOS19OT0ZPTExPVworI2RlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XIDB4MTAwCisjZW5kaWYKKworI2lmbmRlZiBBVF9SRU1PVkVESVIKKyNkZWZpbmUgQVRfUkVNT1ZFRElSIDB4MjAwCisjZW5kaWYKKworI2lmbmRlZiBSTElNSVRfUlRUSU1FCisjZGVmaW5lIFJMSU1JVF9SVFRJTUUgMTUKKyNlbmRpZgorCisvLyBXZSBkb24ndCBkZWZpbmUgR05VX2RhbW1pdCBiZWNhdXNlIHdlJ3JlIG5vdCBwYXJ0IG9mIHRoZSBnbnUgcHJvamVjdCwgYW5kCisvLyBkb24ndCB3YW50IHRvIGdldCBhbnkgRlNGIG9uIHVzLiBVbmZvcnR1bmF0ZWx5IGdsaWJjIChnbnUgbGliYykKKy8vIHdvbid0IGdpdmUgdXMgTGludXggc3lzY2FsbCB3cmFwcGVycyB3aXRob3V0IGNsYWltaW5nIHRvIGJlIHBhcnQgb2YgdGhlCisvLyBnbnUgcHJvamVjdCAoYmVjYXVzZSBTdGFsbG1hbidzICJHTlUgb3ducyBMaW51eCIgcmV2aXNpb25pc3QgaGlzdG9yeQorLy8gY3J1c2FkZSBpbmNsdWRlcyB0aGUga2VybmVsLCBldmVuIHRob3VnaCBMaW51eCB3YXMgaW5zcGlyZWQgYnkgTWluaXgpLgorCisvLyBXZSB1c2UgbW9zdCBub24tcG9zaXggTGludXggc3lzY2FsbHMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgc3lzY2FsbCgpIHdyYXBwZXIsCisvLyBidXQgZXZlbiBtYW55IHBvc2l4LTIwMDggZnVuY3Rpb25zIGFyZW4ndCBwcm92aWRlZCBieSBnbGliYyB1bmxlc3MgeW91CisvLyBjbGFpbSBpdCdzIGluIHRoZSBuYW1lIG9mIEdudS4KKworI2lmIGRlZmluZWQoX19HTElCQ19fKQorLy8gIkZ1bmN0aW9uIHByb3RvdHlwZXMgc2hhbGwgYmUgcHJvdmlkZWQuIiBidXQgYXJlbid0LgorLy8gaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvYmFzZWRlZnMvdW5pc3RkLmguaHRtbAorY2hhciAqY3J5cHQoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpzYWx0KTsKKworLy8gQWNjb3JkaW5nIHRvIHBvc2l4LCAjaW5jbHVkZSBoZWFkZXIsIGdldCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uIEJ1dCBnbGliYy4uLgorLy8gaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvZnVuY3Rpb25zL3djd2lkdGguaHRtbAorI2luY2x1ZGUgPHdjaGFyLmg+CitpbnQgd2N3aWR0aCh3Y2hhcl90IHdjKTsKKworLy8gc2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2Z1bmN0aW9ucy9zdHJwdGltZS5odG1sCisjaW5jbHVkZSA8dGltZS5oPgorY2hhciAqc3RycHRpbWUoY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHN0cnVjdCB0bSAqdG0pOworCisvLyBUaGV5IGRpZG4ndCBsaWtlIHBvc2l4IGJhc2VuYW1lIHNvIHRoZXkgZGVmaW5lZCBhbm90aGVyIGZ1bmN0aW9uIHdpdGggdGhlCisvLyBzYW1lIG5hbWUgYW5kIGlmIHlvdSBpbmNsdWRlIGxpYmdlbi5oIGl0ICNkZWZpbmVzIGJhc2VuYW1lIHRvIHNvbWV0aGluZworLy8gZWxzZSAod2hlcmUgdGhleSBpbXBsZW1lbnRlZCB0aGUgcmVhbCBiYXNlbmFtZSksIGFuZCB0aGF0IGRlZmluZSBicmVha3MKKy8vIHRoZSB0YWJsZSBlbnRyeSBmb3IgdGhlIGJhc2VuYW1lIGNvbW1hbmQuIFRoZXkgZGlkbid0IG1ha2UgYSBuZXcgZnVuY3Rpb24KKy8vIHdpdGggYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlaXIgbmV3IGJlaGF2aW9yIGJlY2F1c2UgZ251LgorLy8KKy8vIFNvbHV0aW9uOiBkb24ndCB1c2UgdGhlaXIgYnJva2VuIGhlYWRlciwgcHJvdmlkZSBhbiBpbmxpbmUgdG8gcmVkaXJlY3QgdGhlCisvLyBjb3JyZWN0IG5hbWUgdG8gdGhlIGJyb2tlbiBuYW1lLgorCitjaGFyICpkaXJuYW1lKGNoYXIgKnBhdGgpOworY2hhciAqX194cGdfYmFzZW5hbWUoY2hhciAqcGF0aCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmJhc2VuYW1lKGNoYXIgKnBhdGgpIHsgcmV0dXJuIF9feHBnX2Jhc2VuYW1lKHBhdGgpOyB9CisKKy8vIHVDbGliYyBwcmV0ZW5kcyB0byBiZSBnbGliYyBhbmQgY29waWVkIGEgbG90IG9mIGl0cyBidWdzLCBidXQgaGFzIGEgZmV3IG1vcmUKKyNpZiBkZWZpbmVkKF9fVUNMSUJDX18pCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK3NzaXplX3QgZ2V0ZGVsaW0oY2hhciAqKmxpbmVwdHIsIHNpemVfdCAqbiwgaW50IGRlbGltLCBGSUxFICpzdHJlYW0pOworY2hhciAqc3RwY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CitwaWRfdCBnZXRzaWQocGlkX3QgcGlkKTsKKworLy8gdUNsaWJjJ3MgbGFzdC1ldmVyIHJlbGVhc2Ugd2FzIGluIDIwMTIsIHNvIG9mIGNvdXJzZSBpdCBkb2Vzbid0IGRlZmluZQorLy8gYW55IGZsYWcgbmV3ZXIgdGhhbiBNU19NT1ZFLCB3aGljaCB3YXMgYWRkZWQgaW4gMjAwMSAobGludXggMi41LjAuNSksCisvLyBlbGV2ZW4geWVhcnMgZWFybGllci4KKworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2lmbmRlZiBNU19NT1ZFCisjZGVmaW5lIE1TX01PVkUgICAgICAgKDE8PDEzKQorI2VuZGlmCisjaWZuZGVmIE1TX1JFQworI2RlZmluZSBNU19SRUMgICAgICAgICgxPDwxNCkKKyNlbmRpZgorI2lmbmRlZiBNU19TSUxFTlQKKyNkZWZpbmUgTVNfU0lMRU5UICAgICAoMTw8MTUpCisjZW5kaWYKKyNpZm5kZWYgTVNfVU5CSU5EQUJMRQorI2RlZmluZSBNU19VTkJJTkRBQkxFICgxPDwxNykKKyNlbmRpZgorI2lmbmRlZiBNU19QUklWQVRFCisjZGVmaW5lIE1TX1BSSVZBVEUgICAgKDE8PDE4KQorI2VuZGlmCisjaWZuZGVmIE1TX1NMQVZFCisjZGVmaW5lIE1TX1NMQVZFICAgICAgKDE8PDE5KQorI2VuZGlmCisjaWZuZGVmIE1TX1NIQVJFRAorI2RlZmluZSBNU19TSEFSRUQgICAgICgxPDwyMCkKKyNlbmRpZgorI2lmbmRlZiBNU19SRUxBVElNRQorI2RlZmluZSBNU19SRUxBVElNRSAoMTw8MjEpCisjZW5kaWYKKworLy8gV2hlbiBidWlsZGluZyB1bmRlciBvYnNvbGV0ZSBnbGliYyAoVWJ1bnR1IDguMDQtaXNoKSwgaG9sZCBpdHMgaGFuZCBhIGJpdC4KKyNlbGlmIF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA8IDEwCisjZGVmaW5lIGZzdGF0YXQgZnN0YXRhdDY0CitpbnQgZnN0YXRhdDY0KGludCBkaXJmZCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIHZvaWQgKmJ1ZiwgaW50IGZsYWdzKTsKK2ludCByZWFkbGlua2F0KGludCBkaXJmZCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpeik7CitjaGFyICpzdHBjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgoraW50IGZjaG1vZGF0KGludCBkaXJmZCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIG1vZGVfdCBtb2RlLCBpbnQgZmxhZ3MpOworaW50IG9wZW5hdChpbnQgZGlyZmQsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIC4uLik7CisjaW5jbHVkZSA8ZGlyZW50Lmg+CitESVIgKmZkb3BlbmRpcihpbnQgZmQpOworI2luY2x1ZGUgPHVuaXN0ZC5oPgoraW50IGZjaG93bmF0KGludCBkaXJmZCwgY29uc3QgY2hhciAqcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCwgaW50IGZsYWdzKTsKK2ludCBpc2JsYW5rKGludCBjKTsKK2ludCB1bmxpbmthdChpbnQgZGlyZmQsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MpOworI2luY2x1ZGUgPHN0ZGlvLmg+Citzc2l6ZV90IGdldGRlbGltKGNoYXIgKipsaW5lcHRyLCBzaXplX3QgKm4sIGludCBkZWxpbSwgRklMRSAqc3RyZWFtKTsKKworLy8gU3RyYWlnaHQgZnJvbSBwb3NpeC0yMDA4LCB0aGluZ3Mgb2xkIGdsaWJjIGhhZCBidXQgZGlkbid0IHByb3RvdHlwZQorCitpbnQgZmFjY2Vzc2F0KGludCBmZCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGFtb2RlLCBpbnQgZmxhZyk7CitpbnQgbGlua2F0KGludCBmZDEsIGNvbnN0IGNoYXIgKnBhdGgxLCBpbnQgZmQyLCBjb25zdCBjaGFyICpwYXRoMiwgaW50IGZsYWcpOworaW50IG1rZGlyYXQoaW50IGZkLCBjb25zdCBjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSk7CitpbnQgc3ltbGlua2F0KGNvbnN0IGNoYXIgKnBhdGgxLCBpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgyKTsKK2ludCBta25vZGF0KGludCBmZCwgY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUsIGRldl90IGRldik7CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KK2ludCBmdXRpbWVucyhpbnQgZmQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyB0aW1lc1syXSk7CitpbnQgdXRpbWVuc2F0KGludCBmZCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjIHRpbWVzWzJdLCBpbnQgZmxhZyk7CisKKyNpZm5kZWYgTU5UX0RFVEFDSAorI2RlZmluZSBNTlRfREVUQUNIIDIKKyNlbmRpZgorI2VuZGlmIC8vIE9sZCBnbGliYworCisjZW5kaWYgLy8gZ2xpYmMgaW4gZ2VuZXJhbAorCisjaWYgIWRlZmluZWQoX19HTElCQ19fKQorLy8gUE9TSVggYmFzZW5hbWUuCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKworLy8gV29yayBvdXQgaG93IHRvIGRvIGVuZGlhbm5lc3MKKworI2lmbmRlZiBfX0FQUExFX18KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZSBJU19CSUdfRU5ESUFOIDEKKyNlbHNlCisjZGVmaW5lIElTX0JJR19FTkRJQU4gMAorI2VuZGlmCisKK2ludCBjbGVhcmVudih2b2lkKTsKKyNlbHNlCisKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSBJU19CSUdfRU5ESUFOIDEKKyNlbHNlCisjZGVmaW5lIElTX0JJR19FTkRJQU4gMAorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgSVNfQklHX0VORElBTgorI2RlZmluZSBJU19MSVRUTEVfRU5ESUFOIDAKKyNkZWZpbmUgU1dBUF9CRTE2KHgpICh4KQorI2RlZmluZSBTV0FQX0JFMzIoeCkgKHgpCisjZGVmaW5lIFNXQVBfQkU2NCh4KSAoeCkKKyNkZWZpbmUgU1dBUF9MRTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIFNXQVBfTEUzMih4KSBic3dhcF8zMih4KQorI2RlZmluZSBTV0FQX0xFNjQoeCkgYnN3YXBfNjQoeCkKKyNlbHNlCisjZGVmaW5lIElTX0xJVFRMRV9FTkRJQU4gMQorI2RlZmluZSBTV0FQX0JFMTYoeCkgYnN3YXBfMTYoeCkKKyNkZWZpbmUgU1dBUF9CRTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIFNXQVBfQkU2NCh4KSBic3dhcF82NCh4KQorI2RlZmluZSBTV0FQX0xFMTYoeCkgKHgpCisjZGVmaW5lIFNXQVBfTEUzMih4KSAoeCkKKyNkZWZpbmUgU1dBUF9MRTY0KHgpICh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgXAorICAgIHx8IChkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgMTApCitzc2l6ZV90IGdldGRlbGltKGNoYXIgKipsaW5lcHRyLCBzaXplX3QgKm4sIGludCBkZWxpbSwgRklMRSAqc3RyZWFtKTsKK3NzaXplX3QgZ2V0bGluZShjaGFyICoqbGluZXB0ciwgc2l6ZV90ICpuLCBGSUxFICpzdHJlYW0pOworI2VuZGlmCisKKy8vIExpbnV4IGhlYWRlcnMgbm90IGxpc3RlZCBieSBQT1NJWCBvciBMU0IKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3dhcC5oPgorCisvLyBBbmRyb2lkIGlzIG1pc3Npbmcgc29tZSBoZWFkZXJzIGFuZCBmdW5jdGlvbnMKKy8vICJnZW5lcmF0ZWQvY29uZmlnLmgiIGlzIGluY2x1ZGVkIGZpcnN0CisjaWYgQ0ZHX1RPWUJPWF9TSEFET1cKKyNpbmNsdWRlIDxzaGFkb3cuaD4KKyNlbmRpZgorI2lmIENGR19UT1lCT1hfVVRNUFgKKyNpbmNsdWRlIDx1dG1weC5oPgorI2Vsc2UKK3N0cnVjdCB1dG1weCB7aW50IHV0X3R5cGU7fTsKKyNkZWZpbmUgVVNFUl9QUk9DRVNTIDAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHV0bXB4ICpnZXR1dHhlbnQodm9pZCkge3JldHVybiAwO30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1dHhlbnQodm9pZCkgezt9CitzdGF0aWMgaW5saW5lIHZvaWQgZW5kdXR4ZW50KHZvaWQpIHs7fQorI2VuZGlmCisKKy8vIFNvbWUgc3lzdGVtcyBkb24ndCBkZWZpbmUgT19OT0ZPTExPVywgYW5kIGl0IHZhcmllcyBieSBhcmNoaXRlY3R1cmUsIHNvLi4uCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgT19OT0ZPTExPVworI2RlZmluZSBPX05PRk9MTE9XIDAKKyNlbmRpZgorCisjaWZuZGVmIE9fTk9BVElNRQorI2RlZmluZSBPX05PQVRJTUUgMDEwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIE9fQ0xPRVhFQworI2RlZmluZSBPX0NMT0VYRUMgMDIwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIE9fUEFUSAorI2RlZmluZSBPX1BBVEggICAwMTAwMDAwMDAKKyNlbmRpZgorCisvLyBHbGliYyB3b24ndCBnaXZlIHlvdSBsaW51eC1rZXJuZWwgY29uc3RhbnRzIHVubGVzcyB5b3Ugc2F5ICJubywgYSBCVUQgbGl0ZSIKKy8vIGV2ZW4gdGhvdWdoIGxpbnV4IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlIEZTRiBhbmQgbmV2ZXIgaGFzLgorI2lmbmRlZiBGX1NFVFBJUEVfU1oKKyNkZWZpbmUgRl9TRVRQSVBFX1NaIDEwMzEKKyNlbmRpZgorCisjaWZuZGVmIEZfR0VUUElQRV9TWgorI2RlZmluZSBGX0dFVFBJUEVfU1ogMTAzMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fU0laRU9GX0RPVUJMRV9fKSAmJiBkZWZpbmVkKF9fU0laRU9GX0xPTkdfXykgXAorICAgICYmIF9fU0laRU9GX0RPVUJMRV9fIDw9IF9fU0laRU9GX0xPTkdfXwordHlwZWRlZiBkb3VibGUgRkxPQVQ7CisjZWxzZQordHlwZWRlZiBmbG9hdCBGTE9BVDsKKyNlbmRpZgorCisjaWZuZGVmIF9fdUNsaW51eF9fCitwaWRfdCB4Zm9yayh2b2lkKTsKKyNlbmRpZgorCisvLyNkZWZpbmUgc3RybmNweSguLi4pIEBAc3RybmNweWlzYmFkbW1rYXlAQAorLy8jZGVmaW5lIHN0cm5jYXQoLi4uKSBAQHN0cm5jYXRpc2JhZG1ta2F5QEAKKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zY2hlZF9wb2xpY3koaW50IHRpZCwgdm9pZCAqcG9saWN5KSB7cmV0dXJuIDA7fQorc3RhdGljIGlubGluZSBjaGFyICpnZXRfc2NoZWRfcG9saWN5X25hbWUoaW50IHBvbGljeSkge3JldHVybiAidW5rbm93biI7fQorI2VuZGlmCmRpZmYgLS1naXQgYS90b3lib3gvbGliL3RveWZsYWdzLmggYi90b3lib3gvbGliL3RveWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwOTkwMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9saWIvdG95ZmxhZ3MuaApAQCAtMCwwICsxLDMwIEBACisvKiBGbGFncyB2YWx1ZXMgZm9yIHRoZSB0aGlyZCBhcmd1bWVudCBvZiBORVdUT1koKQorICoKKyAqIEluY2x1ZGVkIGZyb20gYm90aCBtYWluLmMgKHJ1bnMgaW4gdG95cy5oIGNvbnRleHQpIGFuZCBzY3JpcHRzL2luc3RhbGwuYworICogKHdoaWNoIG1heSBidWlsZCBvbiBjcmF6eSB0aGluZ3MgbGlrZSBtYWNvc3ggd2hlbiBjcm9zcyBjb21waWxpbmcpLgorICovCisKKy8vIEZsYWdzIGRlc2NyaWJpbmcgY29tbWFuZCBiZWhhdmlvci4KKworI2RlZmluZSBUT1lGTEFHX1VTUiAgICAgICgxPDwwKQorI2RlZmluZSBUT1lGTEFHX0JJTiAgICAgICgxPDwxKQorI2RlZmluZSBUT1lGTEFHX1NCSU4gICAgICgxPDwyKQorI2RlZmluZSBUT1lNQVNLX0xPQ0FUSU9OICgoMTw8NCktMSkKKworLy8gVGhpcyBpcyBhIHNoZWxsIGJ1aWx0LWluIGZ1bmN0aW9uLCBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgY29udGV4dC4KKyNkZWZpbmUgVE9ZRkxBR19OT0ZPUksgICAoMTw8NCkKKworLy8gU3RhcnQgY29tbWFuZCB3aXRoIGEgdW1hc2sgb2YgMCAoc2F2ZXMgb2xkIHVtYXNrIGluIHRoaXMub2xkX3VtYXNrKQorI2RlZmluZSBUT1lGTEFHX1VNQVNLICAgICgxPDw1KQorCisvLyBUaGlzIGNvbW1hbmQgcnVucyBhcyByb290LgorI2RlZmluZSBUT1lGTEFHX1NUQVlST09UICgxPDw2KQorI2RlZmluZSBUT1lGTEFHX05FRURST09UICgxPDw3KQorI2RlZmluZSBUT1lGTEFHX1JPT1RPTkxZIChUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfTkVFRFJPT1QpCisKKy8vIENhbGwgc2V0bG9jYWxlIHRvIGxpc3RlbiB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisvLyBUaGlzIGludmFsaWRhdGVzIHNwcmludGYoIiUuKnMiLCBzaXplLCBzdHJpbmcpIGFzIGEgdmFsaWQgbGVuZ3RoIGNvbnN0cmFpbnQuCisjZGVmaW5lIFRPWUZMQUdfTE9DQUxFICAgKDE8PDgpCisKKy8vIFN1cHByZXNzIGRlZmF1bHQgLS1oZWxwIHByb2Nlc3NpbmcKKyNkZWZpbmUgVE9ZRkxBR19OT0hFTFAgICAoMTw8OSkKZGlmZiAtLWdpdCBhL3RveWJveC9saWIveHdyYXAuYyBiL3RveWJveC9saWIveHdyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUwMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L2xpYi94d3JhcC5jCkBAIC0wLDAgKzEsNzkyIEBACisvKiB4d3JhcC5jIC0gd3JhcHBlcnMgYXJvdW5kIGV4aXN0aW5nIGxpYnJhcnkgZnVuY3Rpb25zLgorICoKKyAqIEZ1bmN0aW9ucyB3aXRoIHRoZSB4IHByZWZpeCBhcmUgd3JhcHBlcnMgdGhhdCBlaXRoZXIgc3VjY2VlZCBvciBraWxsIHRoZQorICogcHJvZ3JhbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBuZXZlciByZXR1cm4gZmFpbHVyZS4gVGhleSB1c3VhbGx5IGhhdmUKKyAqIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIGFzIHRoZSBmdW5jdGlvbiB0aGV5IHdyYXAuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBzdHJjcHkgYW5kIHN0cm5jYXQgd2l0aCBzaXplIGNoZWNraW5nLiBTaXplIGlzIHRoZSB0b3RhbCBzcGFjZSBpbiAiZGVzdCIsCisvLyBpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hdG9yLiBFeGl0IGlmIHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBmb3IgdGhlIHN0cmluZworLy8gKGluY2x1ZGluZyBzcGFjZSBmb3IgdGhlIG51bGwgdGVybWluYXRvciksIGJlY2F1c2Ugc2lsZW50bHkgdHJ1bmNhdGluZyBpcworLy8gc3RpbGwgYnJva2VuIGJlaGF2aW9yLiAoQW5kIGxlYXZpbmcgdGhlIHN0cmluZyB1bnRlcm1pbmF0ZWQgaXMgSU5TQU5FLikKK3ZvaWQgeHN0cm5jcHkoY2hhciAqZGVzdCwgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKHN0cmxlbihzcmMpKzEgPiBzaXplKSBlcnJvcl9leGl0KCInJXMnID4gJWxkIGJ5dGVzIiwgc3JjLCAobG9uZylzaXplKTsKKyAgc3RyY3B5KGRlc3QsIHNyYyk7Cit9CisKK3ZvaWQgeHN0cm5jYXQoY2hhciAqZGVzdCwgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKyAgbG9uZyBsZW4gPSBzdHJsZW4oZGVzdCk7CisKKyAgaWYgKGxlbitzdHJsZW4oc3JjKSsxID4gc2l6ZSkKKyAgICBlcnJvcl9leGl0KCInJXMlcycgPiAlbGQgYnl0ZXMiLCBkZXN0LCBzcmMsIChsb25nKXNpemUpOworICBzdHJjcHkoZGVzdCtsZW4sIHNyYyk7Cit9CisKKy8vIFdlIHJlcGxhY2VkIGV4aXQoKSwgX2V4aXQoKSwgYW5kIGF0ZXhpdCgpIHdpdGggeGV4aXQoKSwgX3hleGl0KCksIGFuZAorLy8gc2lnYXRleGl0KCkuIFRoaXMgZ2l2ZXMgX3hleGl0KCkgdGhlIG9wdGlvbiB0byBzaWdsb25nam1wKHRveXMucmVib3VuZCwgMSkKKy8vIGluc3RlYWQgb2YgZXhpdGluZywgbGV0cyB4ZXhpdCgpIHJlcG9ydCBzdGRvdXQgZmx1c2ggZmFpbHVyZXMgdG8gc3RkZXJyCisvLyBhbmQgY2hhbmdlIHRoZSBleGl0IGNvZGUgdG8gaW5kaWNhdGUgZXJyb3IsIGxldHMgb3VyIHRveXMuZXhpdCBmdW5jdGlvbgorLy8gY2hhbmdlIGhhcHBlbiBmb3Igc2lnbmFsIGV4aXQgcGF0aHMgYW5kIGxldHMgdXMgcmVtb3ZlIHRoZSBmdW5jdGlvbnMKKy8vIGFmdGVyIHdlJ3ZlIGNhbGxlZCB0aGVtLgorCit2b2lkIF94ZXhpdCh2b2lkKQoreworICBpZiAodG95cy5yZWJvdW5kKSBzaWdsb25nam1wKCp0b3lzLnJlYm91bmQsIDEpOworCisgIF9leGl0KHRveXMuZXhpdHZhbCk7Cit9CisKK3ZvaWQgeGV4aXQodm9pZCkKK3sKKyAgLy8gQ2FsbCB0b3lzLnhleGl0IGZ1bmN0aW9ucyBpbiByZXZlcnNlIG9yZGVyIGFkZGVkLgorICB3aGlsZSAodG95cy54ZXhpdCkgeworICAgIC8vIFRoaXMgaXMgdHlwZWNhc3RpbmcgeGV4aXQtPmFyZyB0byBhIGZ1bmN0aW9uIHBvaW50ZXIsdGhlbiBjYWxsaW5nIGl0LgorICAgIC8vIFVzaW5nIHRoZSBpbnZhbGlkIHNpZ25hbCBudW1iZXIgMCBsZXRzIHRoZSBzaWduYWwgaGFuZGxlcnMgZGlzdGluZ3Vpc2gKKyAgICAvLyBhbiBhY3R1YWwgc2lnbmFsIGZyb20gYSByZWd1bGFyIGV4aXQuCisgICAgKCh2b2lkICgqKShpbnQpKSh0b3lzLnhleGl0LT5hcmcpKSgwKTsKKworICAgIGZyZWUobGxpc3RfcG9wKCZ0b3lzLnhleGl0KSk7CisgIH0KKyAgaWYgKGZmbHVzaChOVUxMKSB8fCBmZXJyb3Ioc3Rkb3V0KSkKKyAgICBpZiAoIXRveXMuZXhpdHZhbCkgcGVycm9yX21zZygid3JpdGUiKTsKKyAgX3hleGl0KCk7Cit9CisKKy8vIERpZSB1bmxlc3Mgd2UgY2FuIGFsbG9jYXRlIG1lbW9yeS4KK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKnJldCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKCFyZXQpIGVycm9yX2V4aXQoInhtYWxsb2MoJWxkKSIsIChsb25nKXNpemUpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8vIERpZSB1bmxlc3Mgd2UgY2FuIGFsbG9jYXRlIHByZXplcm9lZCBtZW1vcnkuCit2b2lkICp4emFsbG9jKHNpemVfdCBzaXplKQoreworICB2b2lkICpyZXQgPSB4bWFsbG9jKHNpemUpOworICBtZW1zZXQocmV0LCAwLCBzaXplKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gRGllIHVubGVzcyB3ZSBjYW4gY2hhbmdlIHRoZSBzaXplIG9mIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24sIHBvc3NpYmx5CisvLyBtb3ZpbmcgaXQuICAoTm90aWNlIGRpZmZlcmVudCBhcmd1bWVudHMgZnJvbSBsaWJjIGZ1bmN0aW9uLikKK3ZvaWQgKnhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIHB0ciA9IHJlYWxsb2MocHRyLCBzaXplKTsKKyAgaWYgKCFwdHIpIGVycm9yX2V4aXQoInhyZWFsbG9jIik7CisKKyAgcmV0dXJuIHB0cjsKK30KKworLy8gRGllIHVubGVzcyB3ZSBjYW4gYWxsb2NhdGUgYSBjb3B5IG9mIHRoaXMgbWFueSBieXRlcyBvZiBzdHJpbmcuCitjaGFyICp4c3RybmR1cChjaGFyICpzLCBzaXplX3QgbikKK3sKKyAgY2hhciAqcmV0ID0gc3RybmR1cChzLCArK24pOworCisgIGlmICghcmV0KSBlcnJvcl9leGl0KCJ4c3RybmR1cCIpOworICByZXRbLS1uXSA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworLy8gRGllIHVubGVzcyB3ZSBjYW4gYWxsb2NhdGUgYSBjb3B5IG9mIHRoaXMgc3RyaW5nLgorY2hhciAqeHN0cmR1cChjaGFyICpzKQoreworICByZXR1cm4geHN0cm5kdXAocywgc3RybGVuKHMpKTsKK30KKwordm9pZCAqeG1lbWR1cCh2b2lkICpzLCBsb25nIGxlbikKK3sKKyAgdm9pZCAqcmV0ID0geG1hbGxvYyhsZW4pOworICBtZW1jcHkocmV0LCBzLCBsZW4pOworCisgIHJldHVybiByZXQ7Cit9CisKKy8vIERpZSB1bmxlc3Mgd2UgY2FuIGFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBzcHJpbnRmKCkgaW50by4KK2NoYXIgKnhtcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IHZhLCB2YTI7CisgIGludCBsZW47CisgIGNoYXIgKnJldDsKKworICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgdmFfY29weSh2YTIsIHZhKTsKKworICAvLyBIb3cgbG9uZyBpcyBpdD8KKyAgbGVuID0gdnNucHJpbnRmKDAsIDAsIGZvcm1hdCwgdmEpOworICBsZW4rKzsKKyAgdmFfZW5kKHZhKTsKKworICAvLyBBbGxvY2F0ZSBhbmQgZG8gdGhlIHNwcmludGYoKQorICByZXQgPSB4bWFsbG9jKGxlbik7CisgIHZzbnByaW50ZihyZXQsIGxlbiwgZm9ybWF0LCB2YTIpOworICB2YV9lbmQodmEyKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIHhwcmludGYoY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgdmE7CisgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworCisgIHZwcmludGYoZm9ybWF0LCB2YSk7CisgIHZhX2VuZCh2YSk7CisgIGlmIChmZmx1c2goc3Rkb3V0KSB8fCBmZXJyb3Ioc3Rkb3V0KSkgcGVycm9yX2V4aXQoIndyaXRlIik7Cit9CisKK3ZvaWQgeHB1dHMoY2hhciAqcykKK3sKKyAgaWYgKEVPRiA9PSBwdXRzKHMpIHx8IGZmbHVzaChzdGRvdXQpIHx8IGZlcnJvcihzdGRvdXQpKSBwZXJyb3JfZXhpdCgid3JpdGUiKTsKK30KKwordm9pZCB4cHV0YyhjaGFyIGMpCit7CisgIGlmIChFT0YgPT0gZnB1dGMoYywgc3Rkb3V0KSB8fCBmZmx1c2goc3Rkb3V0KSB8fCBmZXJyb3Ioc3Rkb3V0KSkKKyAgICBwZXJyb3JfZXhpdCgid3JpdGUiKTsKK30KKwordm9pZCB4Zmx1c2godm9pZCkKK3sKKyAgaWYgKGZmbHVzaChzdGRvdXQpIHx8IGZlcnJvcihzdGRvdXQpKSBwZXJyb3JfZXhpdCgid3JpdGUiKTs7Cit9CisKKy8vIFRoaXMgaXMgY2FsbGVkIHRocm91Z2ggdGhlIFhWRk9SSyBtYWNybyBiZWNhdXNlIHBhcmVudC9jaGlsZCBvZiB2Zm9yaworLy8gc2hhcmUgYSBzdGFjaywgc28gY2hpbGQgcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbiB3b3VsZCBzdG9tcCB0aGUgcmV0dXJuCisvLyBhZGRyZXNzIHBhcmVudCB3b3VsZCBuZWVkLiBTb2x1dGlvbjogbWFrZSB2Zm9yaygpIGFuIGFyZ3VtZW50IHNvIHByb2Nlc3NlcworLy8gZGl2ZXJnZSBiZWZvcmUgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCitwaWRfdCB4dmZvcmt3cmFwKHBpZF90IHBpZCkKK3sKKyAgaWYgKHBpZCA9PSAtMSkgcGVycm9yX2V4aXQoInZmb3JrIik7CisKKyAgLy8gU2lnbmFsIHRvIHhleGVjKCkgYW5kIGZyaWVuZHMgdGhhdCB3ZSB2Zm9ya2VkIHNvIGNhbid0IHJlY3Vyc2UKKyAgdG95cy5zdGFja3RvcCA9IDA7CisKKyAgcmV0dXJuIHBpZDsKK30KKworLy8gRGllIHVubGVzcyB3ZSBjYW4gZXhlYyBhcmd2W10gKG9yIHJ1biBidWlsdGluIGNvbW1hbmQpLiAgTm90ZSB0aGF0IGFueXRoaW5nCisvLyB3aXRoIGEgcGF0aCBpc24ndCBhIGJ1aWx0aW4sIHNvIC9iaW4vc2ggd29uJ3QgbWF0Y2ggdGhlIGJ1aWx0aW4gc2guCit2b2lkIHhleGVjKGNoYXIgKiphcmd2KQoreworICAvLyBPbmx5IHJlY3Vyc2UgdG8gYnVpbHRpbiB3aGVuIHdlIGhhdmUgbXVsdGlwbGV4ZXIgYW5kICF2Zm9yayBjb250ZXh0LgorICBpZiAoQ0ZHX1RPWUJPWCAmJiAhQ0ZHX1RPWUJPWF9OT1JFQ1VSU0UgJiYgdG95cy5zdGFja3RvcCkgdG95X2V4ZWMoYXJndik7CisgIGV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKworICBwZXJyb3JfbXNnKCJleGVjICVzIiwgYXJndlswXSk7CisgIHRveXMuZXhpdHZhbCA9IDEyNzsKKyAgaWYgKCFDRkdfVE9ZQk9YX0ZPUkspIF9leGl0KHRveXMuZXhpdHZhbCk7CisgIHhleGl0KCk7Cit9CisKKy8vIFNwYXduIGNoaWxkIHByb2Nlc3MsIGNhcHR1cmluZyBzdGRpbi9zdGRvdXQuCisvLyBhcmd2W106IGNvbW1hbmQgdG8gZXhlYy4gSWYgbnVsbCwgY2hpbGQgcmUtcnVucyBvcmlnaW5hbCBwcm9ncmFtIHdpdGgKKy8vICAgICAgICAgdG95cy5zdGFja3RvcCB6ZXJvZWQuCisvLyBwaXBlc1syXTogc3RkaW4sIHN0ZG91dCBvZiBuZXcgcHJvY2Vzcywgb25seSBhbGxvY2F0ZWQgaWYgemVybyBvbiB3YXkgaW4sCisvLyAgICAgICAgICAgcGFzcyBOVUxMIHRvIHNraXAgcGlwZSBhbGxvY2F0aW9uIGVudGlyZWx5LgorLy8gcmV0dXJuOiBwaWQgb2YgY2hpbGQgcHJvY2VzcworcGlkX3QgeHBvcGVuX2JvdGgoY2hhciAqKmFyZ3YsIGludCAqcGlwZXMpCit7CisgIGludCBjZXN0bmVwYXN1bls0XSwgcGlkOworCisgIC8vIE1ha2UgdGhlIHBpcGVzPyBOb3RlIHRoaXMgd29uJ3Qgc2V0IGVpdGhlciBwaXBlIHRvIDAgYmVjYXVzZSBpZiBmZHMgYXJlCisgIC8vIGFsbG9jYXRlZCBpbiBvcmRlciBhbmQgaWYgZmQwIHdhcyBmcmVlIGl0IHdvdWxkIGdvIHRvIGNlc3RuZXBhc3VuWzBdCisgIGlmIChwaXBlcykgeworICAgIGZvciAocGlkID0gMDsgcGlkIDwgMjsgcGlkKyspIHsKKyAgICAgIGlmIChwaXBlc1twaWRdICE9IDApIGNvbnRpbnVlOworICAgICAgaWYgKHBpcGUoY2VzdG5lcGFzdW4rKDIqcGlkKSkpIHBlcnJvcl9leGl0KCJwaXBlIik7CisgICAgICBwaXBlc1twaWRdID0gY2VzdG5lcGFzdW5bcGlkKzFdOworICAgIH0KKyAgfQorCisgIC8vIENoaWxkIHByb2Nlc3MuCisgIGlmICghKHBpZCA9IENGR19UT1lCT1hfRk9SSyA/IHhmb3JrKCkgOiBYVkZPUksoKSkpIHsKKyAgICAvLyBEYW5jZSBvZiB0aGUgc3RkaW4vc3Rkb3V0IHJlZGlyZWN0aW9uLgorICAgIGlmIChwaXBlcykgeworICAgICAgLy8gaWYgd2UgaGFkIG5vIHN0ZGluL291dCwgcGlwZSBoYW5kbGVzIGNvdWxkIG92ZXJsYXAsIHNvIHRlc3QgZm9yIGl0CisgICAgICAvLyBhbmQgZnJlZSB1cCBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBwaXBlIGhhbmRsZXMgYmVmb3JlIHJldXNlCisgICAgICBpZiAocGlwZXNbMV0gIT0gLTEpIGNsb3NlKGNlc3RuZXBhc3VuWzJdKTsKKyAgICAgIGlmIChwaXBlc1swXSAhPSAtMSkgeworICAgICAgICBjbG9zZShjZXN0bmVwYXN1blsxXSk7CisgICAgICAgIGlmIChjZXN0bmVwYXN1blswXSkgeworICAgICAgICAgIGR1cDIoY2VzdG5lcGFzdW5bMF0sIDApOworICAgICAgICAgIGNsb3NlKGNlc3RuZXBhc3VuWzBdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBpcGVzWzFdICE9IC0xKSB7CisgICAgICAgIGR1cDIoY2VzdG5lcGFzdW5bM10sIDEpOworICAgICAgICBkdXAyKGNlc3RuZXBhc3VuWzNdLCAyKTsKKyAgICAgICAgaWYgKGNlc3RuZXBhc3VuWzNdID4gMiB8fCAhY2VzdG5lcGFzdW5bM10pIGNsb3NlKGNlc3RuZXBhc3VuWzNdKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YpIHhleGVjKGFyZ3YpOworCisgICAgLy8gSW4gZm9yaygpIGNhc2UsIGZvcmNlIHJlY3Vyc2lvbiBiZWNhdXNlIHdlIGtub3cgaXQncyB1cy4KKyAgICBpZiAoQ0ZHX1RPWUJPWF9GT1JLKSB7CisgICAgICB0b3lfaW5pdCh0b3lzLndoaWNoLCB0b3lzLmFyZ3YpOworICAgICAgdG95cy5zdGFja3RvcCA9IDA7CisgICAgICB0b3lzLndoaWNoLT50b3lfbWFpbigpOworICAgICAgeGV4aXQoKTsKKyAgICAvLyBJbiB2Zm9yaygpIGNhc2UsIGV4ZWMgL3Byb2Mvc2VsZi9leGUgd2l0aCBoaWdoIGJpdCBvZiBmaXJzdCBsZXR0ZXIgc2V0CisgICAgLy8gdG8gdGVsbCBtYWluKCkgd2UgcmVlbnRlcmVkLgorICAgIH0gZWxzZSB7CisgICAgICBjaGFyICpzID0gIi9wcm9jL3NlbGYvZXhlIjsKKworICAgICAgLy8gV2UgZGlkIGEgbm9tbXUtZnJpZW5kbHkgdmZvcmsgYnV0IG11c3QgZXhlYyB0byBjb250aW51ZS4KKyAgICAgIC8vIHNldHRpbmcgaGlnaCBiaXQgb2YgYXJndlswXVswXSB0byBsZXQgbmV3IHByb2Nlc3Mga25vdworICAgICAgKip0b3lzLmFyZ3YgfD0gMHg4MDsKKyAgICAgIGV4ZWN2KHMsIHRveXMuYXJndik7CisgICAgICBwZXJyb3JfbXNnX3JhdyhzKTsKKworICAgICAgX2V4aXQoMTI3KTsKKyAgICB9CisgIH0KKworICAvLyBQYXJlbnQgcHJvY2VzcworICBpZiAoIUNGR19UT1lCT1hfRk9SSykgKip0b3lzLmFyZ3YgJj0gMHg3ZjsKKyAgaWYgKHBpcGVzKSB7CisgICAgaWYgKHBpcGVzWzBdICE9IC0xKSBjbG9zZShjZXN0bmVwYXN1blswXSk7CisgICAgaWYgKHBpcGVzWzFdICE9IC0xKSBjbG9zZShjZXN0bmVwYXN1blszXSk7CisgIH0KKworICByZXR1cm4gcGlkOworfQorCisvLyBXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIGV4aXQsIHRoZW4gcmV0dXJuIGFkanVzdGVkIGV4aXQgY29kZS4KK2ludCB4d2FpdHBpZChwaWRfdCBwaWQpCit7CisgIGludCBzdGF0dXM7CisKKyAgd2hpbGUgKC0xID09IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgcmV0dXJuIFdJRkVYSVRFRChzdGF0dXMpID8gV0VYSVRTVEFUVVMoc3RhdHVzKSA6IFdURVJNU0lHKHN0YXR1cykrMTI3OworfQorCitpbnQgeHBjbG9zZV9ib3RoKHBpZF90IHBpZCwgaW50ICpwaXBlcykKK3sKKyAgaWYgKHBpcGVzKSB7CisgICAgY2xvc2UocGlwZXNbMF0pOworICAgIGNsb3NlKHBpcGVzWzFdKTsKKyAgfQorCisgIHJldHVybiB4d2FpdHBpZChwaWQpOworfQorCisvLyBXcmFwcGVyIHRvIHhwb3BlbiB3aXRoIGEgcGlwZSBmb3IganVzdCBvbmUgb2Ygc3RkaW4vc3Rkb3V0CitwaWRfdCB4cG9wZW4oY2hhciAqKmFyZ3YsIGludCAqcGlwZSwgaW50IHN0ZG91dCkKK3sKKyAgaW50IHBpcGVzWzJdLCBwaWQ7CisKKyAgcGlwZXNbIXN0ZG91dF0gPSAtMTsKKyAgcGlwZXNbISFzdGRvdXRdID0gMDsKKyAgcGlkID0geHBvcGVuX2JvdGgoYXJndiwgcGlwZXMpOworICAqcGlwZSA9IHBpZCA/IHBpcGVzWyEhc3Rkb3V0XSA6IC0xOworCisgIHJldHVybiBwaWQ7Cit9CisKK2ludCB4cGNsb3NlKHBpZF90IHBpZCwgaW50IHBpcGUpCit7CisgIGNsb3NlKHBpcGUpOworCisgIHJldHVybiB4cGNsb3NlX2JvdGgocGlkLCAwKTsKK30KKworLy8gQ2FsbCB4cG9wZW4gYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCwga2VlcGluZyBleGlzdGluZyBzdGRpbi9zdGRvdXQuCitpbnQgeHJ1bihjaGFyICoqYXJndikKK3sKKyAgcmV0dXJuIHhwY2xvc2VfYm90aCh4cG9wZW5fYm90aChhcmd2LCAwKSwgMCk7Cit9CisKK3ZvaWQgeGFjY2VzcyhjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChhY2Nlc3MocGF0aCwgZmxhZ3MpKSBwZXJyb3JfZXhpdCgiQ2FuJ3QgYWNjZXNzICclcyciLCBwYXRoKTsKK30KKworLy8gRGllIHVubGVzcyB3ZSBjYW4gZGVsZXRlIGEgZmlsZS4gIChGaWxlIG11c3QgZXhpc3QgdG8gYmUgZGVsZXRlZC4pCit2b2lkIHh1bmxpbmsoY2hhciAqcGF0aCkKK3sKKyAgaWYgKHVubGluayhwYXRoKSkgcGVycm9yX2V4aXQoInVubGluayAnJXMnIiwgcGF0aCk7Cit9CisKKy8vIERpZSB1bmxlc3Mgd2UgY2FuIG9wZW4vY3JlYXRlIGEgZmlsZSwgcmV0dXJuaW5nIGZpbGUgZGVzY3JpcHRvci4KK2ludCB4Y3JlYXRlX3N0ZGlvKGNoYXIgKnBhdGgsIGludCBmbGFncywgaW50IG1vZGUpCit7CisgIGludCBmZCA9IG9wZW4ocGF0aCwgZmxhZ3NeT19DTE9FWEVDLCBtb2RlKTsKKworICBpZiAoZmQgPT0gLTEpIHBlcnJvcl9leGl0X3JhdyhwYXRoKTsKKyAgcmV0dXJuIGZkOworfQorCisvLyBEaWUgdW5sZXNzIHdlIGNhbiBvcGVuIGEgZmlsZSwgcmV0dXJuaW5nIGZpbGUgZGVzY3JpcHRvci4KK2ludCB4b3Blbl9zdGRpbyhjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgIHJldHVybiB4Y3JlYXRlX3N0ZGlvKHBhdGgsIGZsYWdzLCAwKTsKK30KKwordm9pZCB4cGlwZShpbnQgKnBwKQoreworICBpZiAocGlwZShwcCkpIHBlcnJvcl9leGl0KCJ4cGlwZSIpOworfQorCit2b2lkIHhjbG9zZShpbnQgZmQpCit7CisgIGlmIChjbG9zZShmZCkpIHBlcnJvcl9leGl0KCJ4Y2xvc2UiKTsKK30KKworaW50IHhkdXAoaW50IGZkKQoreworICBpZiAoZmQgIT0gLTEpIHsKKyAgICBmZCA9IGR1cChmZCk7CisgICAgaWYgKGZkID09IC0xKSBwZXJyb3JfZXhpdCgieGR1cCIpOworICB9CisgIHJldHVybiBmZDsKK30KKworLy8gTW92ZSBmaWxlIGRlc2NyaXB0b3IgYWJvdmUgc3RkaW4vc3Rkb3V0L3N0ZGVyciwgdXNpbmcgL2Rldi9udWxsIHRvIGNvbnN1bWUKKy8vIG9sZCBvbmUuIChXZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggc3RkaW4vc3Rkb3V0L3N0ZGVyciBjbG9zZWQsIGJ1dC4uLikKK2ludCBub3RzdGRpbyhpbnQgZmQpCit7CisgIHdoaWxlIChmZDwzKSB7CisgICAgaW50IGZkMiA9IHhkdXAoZmQpOworCisgICAgY2xvc2UoZmQpOworICAgIHhvcGVuX3N0ZGlvKCIvZGV2L251bGwiLCBPX1JEV1IpOworICAgIGZkID0gZmQyOworICB9CisKKyAgcmV0dXJuIGZkOworfQorCisvLyBDcmVhdGUgYSBmaWxlIGJ1dCBkb24ndCByZXR1cm4gc3RkaW4vc3Rkb3V0L3N0ZGVycgoraW50IHhjcmVhdGUoY2hhciAqcGF0aCwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKyAgcmV0dXJuIG5vdHN0ZGlvKHhjcmVhdGVfc3RkaW8ocGF0aCwgZmxhZ3MsIG1vZGUpKTsKK30KKworLy8gT3BlbiBhIGZpbGUgZGVzY3JpcHRvciBOT1QgaW4gc3RkaW4vc3Rkb3V0L3N0ZGVycgoraW50IHhvcGVuKGNoYXIgKnBhdGgsIGludCBmbGFncykKK3sKKyAgcmV0dXJuIG5vdHN0ZGlvKHhvcGVuX3N0ZGlvKHBhdGgsIGZsYWdzKSk7Cit9CisKKy8vIE9wZW4gcmVhZCBvbmx5LCB0cmVhdGluZyAiLSIgYXMgYSBzeW5vbnltIGZvciBzdGRpbi4KK2ludCB4b3BlbnJvKGNoYXIgKnBhdGgpCit7CisgIGlmICghc3RyY21wKHBhdGgsICItIikpIHJldHVybiAwOworCisgIHJldHVybiB4b3BlbihwYXRoLCBPX1JET05MWSk7Cit9CisKK0ZJTEUgKnhmZG9wZW4oaW50IGZkLCBjaGFyICptb2RlKQoreworICBGSUxFICpmID0gZmRvcGVuKGZkLCBtb2RlKTsKKworICBpZiAoIWYpIHBlcnJvcl9leGl0KCJ4ZmRvcGVuIik7CisKKyAgcmV0dXJuIGY7Cit9CisKKy8vIERpZSB1bmxlc3Mgd2UgY2FuIG9wZW4vY3JlYXRlIGEgZmlsZSwgcmV0dXJuaW5nIEZJTEUgKi4KK0ZJTEUgKnhmb3BlbihjaGFyICpwYXRoLCBjaGFyICptb2RlKQoreworICBGSUxFICpmID0gZm9wZW4ocGF0aCwgbW9kZSk7CisgIGlmICghZikgcGVycm9yX2V4aXQoIk5vIGZpbGUgJXMiLCBwYXRoKTsKKyAgcmV0dXJuIGY7Cit9CisKKy8vIERpZSBpZiB0aGVyZSdzIGFuIGVycm9yIG90aGVyIHRoYW4gRU9GLgorc2l6ZV90IHhyZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworICBzc2l6ZV90IHJldCA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKKyAgaWYgKHJldCA8IDApIHBlcnJvcl9leGl0KCJ4cmVhZCIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgeHJlYWRhbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisgIGlmIChsZW4gIT0gcmVhZGFsbChmZCwgYnVmLCBsZW4pKSBwZXJyb3JfZXhpdCgieHJlYWRhbGwiKTsKK30KKworLy8gVGhlcmUncyBubyB4d3JpdGVhbGwoKSwganVzdCB4d3JpdGUoKS4gIFdoZW4gd2UgcmVhZCwgdGhlcmUgbWF5IG9yIG1heSBub3QKKy8vIGJlIG1vcmUgZGF0YSB3YWl0aW5nLiAgV2hlbiB3ZSB3cml0ZSwgdGhlcmUgaXMgZGF0YSBhbmQgaXQgaGFkIGJldHRlciBnbworLy8gc29tZXdoZXJlLgorCit2b2lkIHh3cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgaWYgKGxlbiAhPSB3cml0ZWFsbChmZCwgYnVmLCBsZW4pKSBwZXJyb3JfZXhpdCgieHdyaXRlIik7Cit9CisKKy8vIERpZSBpZiBsc2VlayBmYWlscywgcHJvYmFibHkgZHVlIHRvIGJlaW5nIGNhbGxlZCBvbiBhIHBpcGUuCisKK29mZl90IHhsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgb2Zmc2V0ID0gbHNlZWsoZmQsIG9mZnNldCwgd2hlbmNlKTsKKyAgaWYgKG9mZnNldDwwKSBwZXJyb3JfZXhpdCgibHNlZWsiKTsKKworICByZXR1cm4gb2Zmc2V0OworfQorCitjaGFyICp4Z2V0Y3dkKHZvaWQpCit7CisgIGNoYXIgKmJ1ZiA9IGdldGN3ZChOVUxMLCAwKTsKKyAgaWYgKCFidWYpIHBlcnJvcl9leGl0KCJ4Z2V0Y3dkIik7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCB4c3RhdChjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisgIGlmKHN0YXQocGF0aCwgc3QpKSBwZXJyb3JfZXhpdCgiQ2FuJ3Qgc3RhdCAlcyIsIHBhdGgpOworfQorCisvLyBDYW5ub25pY2FsaXplIHBhdGgsIGV2ZW4gdG8gZmlsZSB3aXRoIG9uZSBvciBtb3JlIG1pc3NpbmcgY29tcG9uZW50cyBhdCBlbmQuCisvLyBpZiBleGFjdCwgcmVxdWlyZSBsYXN0IHBhdGggY29tcG9uZW50IHRvIGV4aXN0CitjaGFyICp4YWJzcGF0aChjaGFyICpwYXRoLCBpbnQgZXhhY3QpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqdG9kbywgKmRvbmUgPSAwOworICBpbnQgdHJ5ID0gOTk5OSwgZGlyZmQgPSBvcGVuKCIvIiwgMCk7OworICBjaGFyICpyZXQ7CisKKyAgLy8gSWYgdGhpcyBpc24ndCBhbiBhYnNvbHV0ZSBwYXRoLCBzdGFydCB3aXRoIGN3ZC4KKyAgaWYgKCpwYXRoICE9ICcvJykgeworICAgIGNoYXIgKnRlbXAgPSB4Z2V0Y3dkKCk7CisKKyAgICBzcGxpdHBhdGgocGF0aCwgc3BsaXRwYXRoKHRlbXAsICZ0b2RvKSk7CisgICAgZnJlZSh0ZW1wKTsKKyAgfSBlbHNlIHNwbGl0cGF0aChwYXRoLCAmdG9kbyk7CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIHBhdGggY29tcG9uZW50cworICB3aGlsZSAodG9kbykgeworICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV3ID0gbGxpc3RfcG9wKCZ0b2RvKSwgKip0YWlsOworICAgIHNzaXplX3QgbGVuOworCisgICAgaWYgKCF0cnktLSkgeworICAgICAgZXJybm8gPSBFTE9PUDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gUmVtb3ZhYmxlIHBhdGggY29tcG9uZW5lbnRzLgorICAgIGlmICghc3RyY21wKG5ldy0+c3RyLCAiLiIpIHx8ICFzdHJjbXAobmV3LT5zdHIsICIuLiIpKSB7CisgICAgICBpbnQgeCA9IG5ldy0+c3RyWzFdOworCisgICAgICBmcmVlKG5ldyk7CisgICAgICBpZiAoeCkgeworICAgICAgICBpZiAoZG9uZSkgZnJlZShsbGlzdF9wb3AoJmRvbmUpKTsKKyAgICAgICAgbGVuID0gMDsKKyAgICAgIH0gZWxzZSBjb250aW51ZTsKKworICAgIC8vIElzIHRoaXMgYSBzeW1saW5rPworICAgIH0gZWxzZSBsZW4gPSByZWFkbGlua2F0KGRpcmZkLCBuZXctPnN0ciwgbGliYnVmLCBzaXplb2YobGliYnVmKSk7CisKKyAgICBpZiAobGVuPjQwOTUpIGdvdG8gZXJyb3I7CisgICAgaWYgKGxlbjwxKSB7CisgICAgICBpbnQgZmQ7CisgICAgICBjaGFyICpzID0gIi4uIjsKKworICAgICAgLy8gRm9yIC4uIGp1c3QgbW92ZSBkaXJmZAorICAgICAgaWYgKGxlbikgeworICAgICAgICAvLyBOb3QgYSBzeW1saW5rOiBhZGQgdG8gbGlua2VkIGxpc3QsIG1vdmUgZGlyZmQsIGZhaWwgaWYgZXJyb3IKKyAgICAgICAgaWYgKChleGFjdCB8fCB0b2RvKSAmJiBlcnJubyAhPSBFSU5WQUwpIGdvdG8gZXJyb3I7CisgICAgICAgIG5ldy0+bmV4dCA9IGRvbmU7CisgICAgICAgIGRvbmUgPSBuZXc7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwgJiYgIXRvZG8pIGJyZWFrOworICAgICAgICBzID0gbmV3LT5zdHI7CisgICAgICB9CisgICAgICBmZCA9IG9wZW5hdChkaXJmZCwgcywgMCk7CisgICAgICBpZiAoZmQgPT0gLTEgJiYgKGV4YWN0IHx8IHRvZG8gfHwgZXJybm8gIT0gRU5PRU5UKSkgZ290byBlcnJvcjsKKyAgICAgIGNsb3NlKGRpcmZkKTsKKyAgICAgIGRpcmZkID0gZmQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIHN5bWxpbmsgaXMgdG8gYW4gYWJzb2x1dGUgcGF0aCwgZGlzY2FyZCBleGlzdGluZyByZXNvbHZlZCBwYXRoCisgICAgbGliYnVmW2xlbl0gPSAwOworICAgIGlmICgqbGliYnVmID09ICcvJykgeworICAgICAgbGxpc3RfdHJhdmVyc2UoZG9uZSwgZnJlZSk7CisgICAgICBkb25lPTA7CisgICAgICBjbG9zZShkaXJmZCk7CisgICAgICBkaXJmZCA9IG9wZW4oIi8iLCAwKTsKKyAgICB9CisgICAgZnJlZShuZXcpOworCisgICAgLy8gcHJlcGVuZCBjb21wb25lbnRzIG9mIG5ldyBwYXRoLiBOb3RlIHN5bWxpbmsgdG8gIi8iIHdpbGwgbGVhdmUgbmV3IE5VTEwKKyAgICB0YWlsID0gc3BsaXRwYXRoKGxpYmJ1ZiwgJm5ldyk7CisKKyAgICAvLyBzeW1saW5rIHRvICIvIiB3aWxsIHJldHVybiBudWxsIGFuZCBsZWF2ZSB0YWlsIGFsb25lCisgICAgaWYgKG5ldykgeworICAgICAgKnRhaWwgPSB0b2RvOworICAgICAgdG9kbyA9IG5ldzsKKyAgICB9CisgIH0KKyAgY2xvc2UoZGlyZmQpOworCisgIC8vIEF0IHRoaXMgcG9pbnQgZG9uZSBoYXMgdGhlIHBhdGgsIGluIHJldmVyc2Ugb3JkZXIuIFJldmVyc2UgbGlzdCB3aGlsZQorICAvLyBjYWxjdWxhdGluZyBidWZmZXIgbGVuZ3RoLgorCisgIHRyeSA9IDI7CisgIHdoaWxlIChkb25lKSB7CisgICAgc3RydWN0IHN0cmluZ19saXN0ICp0ZW1wID0gbGxpc3RfcG9wKCZkb25lKTs7CisKKyAgICBpZiAodG9kbykgdHJ5Kys7CisgICAgdHJ5ICs9IHN0cmxlbih0ZW1wLT5zdHIpOworICAgIHRlbXAtPm5leHQgPSB0b2RvOworICAgIHRvZG8gPSB0ZW1wOworICB9CisKKyAgLy8gQXNzZW1ibGUgcmV0dXJuIGJ1ZmZlcgorCisgIHJldCA9IHhtYWxsb2ModHJ5KTsKKyAgKnJldCA9ICcvJzsKKyAgcmV0IFt0cnkgPSAxXSA9IDA7CisgIHdoaWxlICh0b2RvKSB7CisgICAgaWYgKHRyeT4xKSByZXRbdHJ5KytdID0gJy8nOworICAgIHRyeSA9IHN0cGNweShyZXQrdHJ5LCB0b2RvLT5zdHIpIC0gcmV0OworICAgIGZyZWUobGxpc3RfcG9wKCZ0b2RvKSk7CisgIH0KKworICByZXR1cm4gcmV0OworCitlcnJvcjoKKyAgY2xvc2UoZGlyZmQpOworICBsbGlzdF90cmF2ZXJzZSh0b2RvLCBmcmVlKTsKKyAgbGxpc3RfdHJhdmVyc2UoZG9uZSwgZnJlZSk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgeGNoZGlyKGNoYXIgKnBhdGgpCit7CisgIGlmIChjaGRpcihwYXRoKSkgZXJyb3JfZXhpdCgiY2hkaXIgJyVzJyIsIHBhdGgpOworfQorCit2b2lkIHhjaHJvb3QoY2hhciAqcGF0aCkKK3sKKyAgaWYgKGNocm9vdChwYXRoKSkgZXJyb3JfZXhpdCgiY2hyb290ICclcyciLCBwYXRoKTsKKyAgeGNoZGlyKCIvIik7Cit9CisKK3N0cnVjdCBwYXNzd2QgKnhnZXRwd3VpZCh1aWRfdCB1aWQpCit7CisgIHN0cnVjdCBwYXNzd2QgKnB3ZCA9IGdldHB3dWlkKHVpZCk7CisgIGlmICghcHdkKSBlcnJvcl9leGl0KCJiYWQgdWlkICVsZCIsIChsb25nKXVpZCk7CisgIHJldHVybiBwd2Q7Cit9CisKK3N0cnVjdCBncm91cCAqeGdldGdyZ2lkKGdpZF90IGdpZCkKK3sKKyAgc3RydWN0IGdyb3VwICpncm91cCA9IGdldGdyZ2lkKGdpZCk7CisKKyAgaWYgKCFncm91cCkgcGVycm9yX2V4aXQoImdpZCAlbGQiLCAobG9uZylnaWQpOworICByZXR1cm4gZ3JvdXA7Cit9CisKK3Vuc2lnbmVkIHhnZXR1aWQoY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IHBhc3N3ZCAqdXAgPSBnZXRwd25hbShuYW1lKTsKKyAgY2hhciAqcyA9IDA7CisgIGxvbmcgdWlkOworCisgIGlmICh1cCkgcmV0dXJuIHVwLT5wd191aWQ7CisKKyAgdWlkID0gZXN0cnRvbChuYW1lLCAmcywgMTApOworICBpZiAoIWVycm5vICYmIHMgJiYgISpzICYmIHVpZD49MCAmJiB1aWQ8PVVJTlRfTUFYKSByZXR1cm4gdWlkOworCisgIGVycm9yX2V4aXQoImJhZCB1c2VyICclcyciLCBuYW1lKTsKK30KKwordW5zaWduZWQgeGdldGdpZChjaGFyICpuYW1lKQoreworICBzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0obmFtZSk7CisgIGNoYXIgKnMgPSAwOworICBsb25nIGdpZDsKKworICBpZiAoZ3IpIHJldHVybiBnci0+Z3JfZ2lkOworCisgIGdpZCA9IGVzdHJ0b2wobmFtZSwgJnMsIDEwKTsKKyAgaWYgKCFlcnJubyAmJiBzICYmICEqcyAmJiBnaWQ+PTAgJiYgZ2lkPD1VSU5UX01BWCkgcmV0dXJuIGdpZDsKKworICBlcnJvcl9leGl0KCJiYWQgZ3JvdXAgJyVzJyIsIG5hbWUpOworfQorCitzdHJ1Y3QgcGFzc3dkICp4Z2V0cHduYW0oY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IHBhc3N3ZCAqdXAgPSBnZXRwd25hbShuYW1lKTsKKworICBpZiAoIXVwKSBwZXJyb3JfZXhpdCgidXNlciAnJXMnIiwgbmFtZSk7CisgIHJldHVybiB1cDsKK30KKworc3RydWN0IGdyb3VwICp4Z2V0Z3JuYW0oY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IGdyb3VwICpnciA9IGdldGdybmFtKG5hbWUpOworCisgIGlmICghZ3IpIHBlcnJvcl9leGl0KCJncm91cCAnJXMnIiwgbmFtZSk7CisgIHJldHVybiBncjsKK30KKworLy8gc2V0dWlkKCkgY2FuIGZhaWwgKGZvciBleGFtcGxlLCB0b28gbWFueSBwcm9jZXNzZXMgYmVsb25naW5nIHRvIHRoYXQgdXNlciksCisvLyB3aGljaCBvcGVucyBhIHNlY3VyaXR5IGhvbGUgaWYgdGhlIHByb2Nlc3MgY29udGludWVzIGFzIHRoZSBvcmlnaW5hbCB1c2VyLgorCit2b2lkIHhzZXR1c2VyKHN0cnVjdCBwYXNzd2QgKnB3ZCkKK3sKKyAgaWYgKGluaXRncm91cHMocHdkLT5wd19uYW1lLCBwd2QtPnB3X2dpZCkgfHwgc2V0Z2lkKHB3ZC0+cHdfdWlkKQorICAgICAgfHwgc2V0dWlkKHB3ZC0+cHdfdWlkKSkgcGVycm9yX2V4aXQoInhzZXR1c2VyICclcyciLCBwd2QtPnB3X25hbWUpOworfQorCisvLyBUaGlzIGNhbiByZXR1cm4gbnVsbCAobWVhbmluZyBmaWxlIG5vdCBmb3VuZCkuICBJdCBqdXN0IHdvbid0IHJldHVybiBudWxsCisvLyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcmVhc29ucy4KK2NoYXIgKnhyZWFkbGluayhjaGFyICpuYW1lKQoreworICBpbnQgbGVuLCBzaXplID0gMDsKKyAgY2hhciAqYnVmID0gMDsKKworICAvLyBHcm93IGJ5IDY0IGJ5dGUgY2h1bmtzIHVudGlsIGl0J3MgYmlnIGVub3VnaC4KKyAgZm9yKDs7KSB7CisgICAgc2l6ZSArPTY0OworICAgIGJ1ZiA9IHhyZWFsbG9jKGJ1Ziwgc2l6ZSk7CisgICAgbGVuID0gcmVhZGxpbmsobmFtZSwgYnVmLCBzaXplKTsKKworICAgIGlmIChsZW48MCkgeworICAgICAgZnJlZShidWYpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsZW48c2l6ZSkgeworICAgICAgYnVmW2xlbl09MDsKKyAgICAgIHJldHVybiBidWY7CisgICAgfQorICB9Cit9CisKK2NoYXIgKnhyZWFkZmlsZShjaGFyICpuYW1lLCBjaGFyICpidWYsIG9mZl90IGxlbikKK3sKKyAgaWYgKCEoYnVmID0gcmVhZGZpbGUobmFtZSwgYnVmLCBsZW4pKSkgcGVycm9yX2V4aXQoIkJhZCAnJXMnIiwgbmFtZSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IHhpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICpkYXRhKQoreworICBpbnQgcmM7CisKKyAgZXJybm8gPSAwOworICByYyA9IGlvY3RsKGZkLCByZXF1ZXN0LCBkYXRhKTsKKyAgaWYgKHJjID09IC0xICYmIGVycm5vKSBwZXJyb3JfZXhpdCgiaW9jdGwgJXgiLCByZXF1ZXN0KTsKKworICByZXR1cm4gcmM7Cit9CisKKy8vIE9wZW4gYSAvdmFyL3J1bi9OQU1FLnBpZCBmaWxlLCBkeWluZyBpZiB3ZSBjYW4ndCB3cml0ZSBpdCBvciBpZiBpdCBjdXJyZW50bHkKKy8vIGV4aXN0cyBhbmQgaXMgdGhpcyBleGVjdXRhYmxlLgordm9pZCB4cGlkZmlsZShjaGFyICpuYW1lKQoreworICBjaGFyIHBpZGZpbGVbMjU2XSwgc3BpZFszMl07CisgIGludCBpLCBmZDsKKyAgcGlkX3QgcGlkOworCisgIHNwcmludGYocGlkZmlsZSwgIi92YXIvcnVuLyVzLnBpZCIsIG5hbWUpOworICAvLyBUcnkgdGhyZWUgdGltZXMgdG8gb3BlbiB0aGUgc3Vja2VyLgorICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKKyAgICBmZCA9IG9wZW4ocGlkZmlsZSwgT19DUkVBVHxPX0VYQ0x8T19XUk9OTFksIDA2NDQpOworICAgIGlmIChmZCAhPSAtMSkgYnJlYWs7CisKKyAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0ZWQsIHJlYWQgaXQuICBMb29wIGZvciByYWNlIGNvbmRpdGlvbi4KKyAgICBmZCA9IG9wZW4ocGlkZmlsZSwgT19SRE9OTFkpOworICAgIGlmIChmZCA9PSAtMSkgY29udGludWU7CisKKyAgICAvLyBJcyB0aGUgb2xkIHByb2dyYW0gc3RpbGwgdGhlcmU/CisgICAgc3BpZFt4cmVhZChmZCwgc3BpZCwgc2l6ZW9mKHNwaWQpLTEpXSA9IDA7CisgICAgY2xvc2UoZmQpOworICAgIHBpZCA9IGF0b2koc3BpZCk7CisgICAgaWYgKHBpZCA8IDEgfHwgKGtpbGwocGlkLCAwKSAmJiBlcnJubyA9PSBFU1JDSCkpIHVubGluayhwaWRmaWxlKTsKKworICAgIC8vIEFuIGVsc2Ugd2l0aCBtb3JlIHNhbml0eSBjaGVja2luZyBtaWdodCBiZSBuaWNlIGhlcmUuCisgIH0KKworICBpZiAoaSA9PSAzKSBlcnJvcl9leGl0KCJ4cGlkZmlsZSAlcyIsIG5hbWUpOworCisgIHh3cml0ZShmZCwgc3BpZCwgc3ByaW50ZihzcGlkLCAiJWxkXG4iLCAobG9uZylnZXRwaWQoKSkpOworICBjbG9zZShmZCk7Cit9CisKKy8vIENvcHkgdGhlIHJlc3Qgb2YgaW4gdG8gb3V0IGFuZCBjbG9zZSBib3RoIGZpbGVzLgorCit2b2lkIHhzZW5kZmlsZShpbnQgaW4sIGludCBvdXQpCit7CisgIGxvbmcgbGVuOworCisgIGlmIChpbjwwKSByZXR1cm47CisgIGZvciAoOzspIHsKKyAgICBsZW4gPSB4cmVhZChpbiwgbGliYnVmLCBzaXplb2YobGliYnVmKSk7CisgICAgaWYgKGxlbjwxKSBicmVhazsKKyAgICB4d3JpdGUob3V0LCBsaWJidWYsIGxlbik7CisgIH0KK30KKworLy8gcGFyc2UgZnJhY3Rpb25hbCBzZWNvbmRzIHdpdGggb3B0aW9uYWwgcy9tL2gvZCBzdWZmaXgKK2xvbmcgeHBhcnNldGltZShjaGFyICphcmcsIGxvbmcgdW5pdHMsIGxvbmcgKmZyYWN0aW9uKQoreworICBkb3VibGUgZDsKKyAgbG9uZyBsOworCisgIGlmIChDRkdfVE9ZQk9YX0ZMT0FUKSBkID0gc3RydG9kKGFyZywgJmFyZyk7CisgIGVsc2UgbCA9IHN0cnRvdWwoYXJnLCAmYXJnLCAxMCk7CisKKyAgLy8gUGFyc2Ugc3VmZml4CisgIGlmICgqYXJnKSB7CisgICAgaW50IGlzbWhkW109ezEsNjAsMzYwMCw4NjQwMH0sIGkgPSBzdHJpZHgoInNtaGQiLCAqYXJnKTsKKworICAgIGlmIChpID09IC0xKSBlcnJvcl9leGl0KCJVbmtub3duIHN1ZmZpeCAnJWMnIiwgKmFyZyk7CisgICAgaWYgKENGR19UT1lCT1hfRkxPQVQpIGQgKj0gaXNtaGRbaV07CisgICAgZWxzZSBsICo9IGlzbWhkW2ldOworICB9CisKKyAgaWYgKENGR19UT1lCT1hfRkxPQVQpIHsKKyAgICBsID0gKGxvbmcpZDsKKyAgICBpZiAoZnJhY3Rpb24pICpmcmFjdGlvbiA9IHVuaXRzKihkLWwpOworICB9IGVsc2UgaWYgKGZyYWN0aW9uKSAqZnJhY3Rpb24gPSAwOworCisgIHJldHVybiBsOworfQorCisvLyBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGludG8gYSByZWdleF90Cit2b2lkIHhyZWdjb21wKHJlZ2V4X3QgKnByZWcsIGNoYXIgKnJlZ2V4LCBpbnQgY2ZsYWdzKQoreworICBpbnQgcmMgPSByZWdjb21wKHByZWcsIHJlZ2V4LCBjZmxhZ3MpOworCisgIGlmIChyYykgeworICAgIHJlZ2Vycm9yKHJjLCBwcmVnLCBsaWJidWYsIHNpemVvZihsaWJidWYpKTsKKyAgICBlcnJvcl9leGl0KCJ4cmVnY29tcDogJXMiLCBsaWJidWYpOworICB9Cit9CisKK2NoYXIgKnh0enNldChjaGFyICpuZXcpCit7CisgIGNoYXIgKm9sZCA9IGdldGVudigiVFoiKTsKKworICBpZiAob2xkKSBvbGQgPSB4c3RyZHVwKG9sZCk7CisgIGlmIChuZXcgPyBzZXRlbnYoIlRaIiwgbmV3LCAxKSA6IHVuc2V0ZW52KCJUWiIpKSBwZXJyb3JfZXhpdCgic2V0ZW52Iik7CisgIHR6c2V0KCk7CisKKyAgcmV0dXJuIG9sZDsKK30KKworLy8gU2V0IGEgc2lnbmFsIGhhbmRsZXIKK3ZvaWQgeHNpZ25hbChpbnQgc2lnbmFsLCB2b2lkICpoYW5kbGVyKQoreworICBzdHJ1Y3Qgc2lnYWN0aW9uICpzYSA9ICh2b2lkICopbGliYnVmOworCisgIG1lbXNldChzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzaWdhY3Rpb24pKTsKKyAgc2EtPnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCisgIGlmIChzaWdhY3Rpb24oc2lnbmFsLCBzYSwgMCkpIHBlcnJvcl9leGl0KCJ4c2lnbmFsICVkIiwgc2lnbmFsKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9tYWluLmMgYi90b3lib3gvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzFiODIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvbWFpbi5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBUb3lib3ggaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisjaW5jbHVkZSAidG95cy5oIgorCisjaWZuZGVmIFRPWUJPWF9WRVJTSU9OCisjZGVmaW5lIFRPWUJPWF9WRVJTSU9OICIwLjcuMSIKKyNlbmRpZgorCisvLyBQb3B1bGF0ZSB0b3lfbGlzdFtdLgorCisjdW5kZWYgTkVXVE9ZCisjdW5kZWYgT0xEVE9ZCisjZGVmaW5lIE5FV1RPWShuYW1lLCBvcHRzLCBmbGFncykgeyNuYW1lLCBuYW1lIyNfbWFpbiwgT1BUU1RSXyMjbmFtZSwgZmxhZ3N9LAorI2RlZmluZSBPTERUT1kobmFtZSwgb2xkbmFtZSwgZmxhZ3MpIFwKKyAgeyNuYW1lLCBvbGRuYW1lIyNfbWFpbiwgT1BUU1RSXyMjb2xkbmFtZSwgZmxhZ3N9LAorCitzdHJ1Y3QgdG95X2xpc3QgdG95X2xpc3RbXSA9IHsKKyNpbmNsdWRlICJnZW5lcmF0ZWQvbmV3dG95cy5oIgorfTsKKworLy8gZ2xvYmFsIGNvbnRleHQgZm9yIHRoaXMgY29tbWFuZC4KKworc3RydWN0IHRveV9jb250ZXh0IHRveXM7Cit1bmlvbiBnbG9iYWxfdW5pb24gdGhpczsKK2NoYXIgdG95YnVmWzQwOTZdLCBsaWJidWZbNDA5Nl07CisKK3N0cnVjdCB0b3lfbGlzdCAqdG95X2ZpbmQoY2hhciAqbmFtZSkKK3sKKyAgaW50IHRvcCwgYm90dG9tLCBtaWRkbGU7CisKKyAgaWYgKCFDRkdfVE9ZQk9YKSByZXR1cm4gMDsKKworICAvLyBJZiB0aGUgbmFtZSBzdGFydHMgd2l0aCAidG95Ym94IiBhY2NlcHQgdGhhdCBhcyBhIG1hdGNoLiAgT3RoZXJ3aXNlCisgIC8vIHNraXAgdGhlIGZpcnN0IGVudHJ5LCB3aGljaCBpcyBvdXQgb2Ygb3JkZXIuCisKKyAgaWYgKCFzdHJuY21wKG5hbWUsInRveWJveCIsNikpIHJldHVybiB0b3lfbGlzdDsKKyAgYm90dG9tID0gMTsKKworICAvLyBCaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhpcyBjb21tYW5kLgorCisgIHRvcCA9IEFSUkFZX0xFTih0b3lfbGlzdCktMTsKKyAgZm9yICg7OykgeworICAgIGludCByZXN1bHQ7CisKKyAgICBtaWRkbGUgPSAodG9wK2JvdHRvbSkvMjsKKyAgICBpZiAobWlkZGxlPGJvdHRvbSB8fCBtaWRkbGU+dG9wKSByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBzdHJjbXAobmFtZSx0b3lfbGlzdFttaWRkbGVdLm5hbWUpOworICAgIGlmICghcmVzdWx0KSByZXR1cm4gdG95X2xpc3QrbWlkZGxlOworICAgIGlmIChyZXN1bHQ8MCkgdG9wPS0tbWlkZGxlOworICAgIGVsc2UgYm90dG9tID0gKyttaWRkbGU7CisgIH0KK30KKworLy8gRmlndXJlIG91dCB3aGV0aGVyIG9yIG5vdCBhbnl0aGluZyBpcyB1c2luZyB0aGUgb3B0aW9uIHBhcnNpbmcgbG9naWMsCisvLyBiZWNhdXNlIHRoZSBjb21waWxlciBjYW4ndCBmaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGl0IGF3YXkKKy8vIG9uIGl0cycgb3duLiAgTkVFRF9PUFRJT05TIGJlY29tZXMgYSBjb25zdGFudCBhbGxvd2luZyBpZigpIHRvIG9wdGltaXplCisvLyBzdHVmZiBvdXQgdmlhIGRlYWQgY29kZSBlbGltaW5hdGlvbi4KKworI3VuZGVmIE5FV1RPWQorI3VuZGVmIE9MRFRPWQorI2RlZmluZSBORVdUT1kobmFtZSwgb3B0cywgZmxhZ3MpIG9wdHMgfHwKKyNkZWZpbmUgT0xEVE9ZKG5hbWUsIG9sZG5hbWUsIGZsYWdzKSBPUFRTVFJfIyNvbGRuYW1lIHx8CitzdGF0aWMgY29uc3QgaW50IE5FRURfT1BUSU9OUyA9CisjaW5jbHVkZSAiZ2VuZXJhdGVkL25ld3RveXMuaCIKKzA7ICAvLyBFbmRzIHRoZSBvcHRzIHx8IG9wdHMgfHwgb3B0cy4uLgorCisvLyBTZXR1cCB0b3lib3ggZ2xvYmFsIHN0YXRlIGZvciB0aGlzIGNvbW1hbmQuCitzdGF0aWMgdm9pZCB0b3lfc2luZ2xlaW5pdChzdHJ1Y3QgdG95X2xpc3QgKndoaWNoLCBjaGFyICphcmd2W10pCit7CisgIHRveXMud2hpY2ggPSB3aGljaDsKKyAgdG95cy5hcmd2ID0gYXJndjsKKworICBpZiAoQ0ZHX1RPWUJPWF9JMThOKSBzZXRsb2NhbGUoTENfQUxMLCAiQyIrISEod2hpY2gtPmZsYWdzICYgVE9ZRkxBR19MT0NBTEUpKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9IRUxQX0RBU0hEQVNIICYmICEod2hpY2gtPmZsYWdzICYgVE9ZRkxBR19OT0hFTFApCisgICAgJiYgYXJndlsxXSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkKKyAgeworICAgIGlmIChDRkdfVE9ZQk9YICYmIHRveXMud2hpY2ggPT0gdG95X2xpc3QgJiYgdG95cy5hcmd2WzJdKQorICAgICAgaWYgKCEodG95cy53aGljaCA9IHRveV9maW5kKHRveXMuYXJndlsyXSkpKSByZXR1cm47CisgICAgc2hvd19oZWxwKHN0ZG91dCk7CisgICAgeGV4aXQoKTsKKyAgfQorCisgIGlmIChORUVEX09QVElPTlMgJiYgd2hpY2gtPm9wdGlvbnMpIGdldF9vcHRmbGFncygpOworICBlbHNlIHsKKyAgICB0b3lzLm9wdGFyZ3MgPSBhcmd2KzE7CisgICAgZm9yICh0b3lzLm9wdGMgPSAwOyB0b3lzLm9wdGFyZ3NbdG95cy5vcHRjXTsgdG95cy5vcHRjKyspOworICB9CisgIHRveXMub2xkX3VtYXNrID0gdW1hc2soMCk7CisgIGlmICghKHdoaWNoLT5mbGFncyAmIFRPWUZMQUdfVU1BU0spKSB1bWFzayh0b3lzLm9sZF91bWFzayk7CisgIHRveXMuc2lnbmFsZmQtLTsKKyAgdG95cy50b3ljb3VudCA9IEFSUkFZX0xFTih0b3lfbGlzdCk7Cit9CisKKy8vIEZ1bGwgaW5pdCBuZWVkZWQgYnkgbXVsdGlwbGV4ZXIgb3IgcmVlbnRyYW50IGNhbGxzLCBjYWxscyBzaW5nbGVpbml0IGF0IGVuZAordm9pZCB0b3lfaW5pdChzdHJ1Y3QgdG95X2xpc3QgKndoaWNoLCBjaGFyICphcmd2W10pCit7CisgIHZvaWQgKm9sZHdoaWNoID0gdG95cy53aGljaDsKKworICAvLyBEcm9wIHBlcm1pc3Npb25zIGZvciBub24tc3VpZCBjb21tYW5kcy4KKworICBpZiAoQ0ZHX1RPWUJPWF9TVUlEKSB7CisgICAgaWYgKCF0b3lzLndoaWNoKSB0b3lzLndoaWNoID0gdG95X2xpc3Q7CisKKyAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKSwgZXVpZCA9IGdldGV1aWQoKTsKKworICAgIGlmICghKHdoaWNoLT5mbGFncyAmIFRPWUZMQUdfU1RBWVJPT1QpKSB7CisgICAgICBpZiAodWlkICE9IGV1aWQpIHsKKyAgICAgICAgaWYgKHNldHVpZCh1aWQpKSBwZXJyb3JfZXhpdCgic2V0dWlkICVkLT4lZCIsIGV1aWQsIHVpZCk7IC8vIGRyb3Agcm9vdAorICAgICAgICBldWlkID0gdWlkOworICAgICAgICB0b3lzLndhc3Jvb3QrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENGR19UT1lCT1hfREVCVUcgJiYgdWlkICYmIHdoaWNoICE9IHRveV9saXN0KQorICAgICAgZXJyb3JfbXNnKCJOb3QgaW5zdGFsbGVkIHN1aWQgcm9vdCIpOworCisgICAgaWYgKCh3aGljaC0+ZmxhZ3MgJiBUT1lGTEFHX05FRURST09UKSAmJiBldWlkKSBoZWxwX2V4aXQoIk5vdCByb290Iik7CisgIH0KKworICAvLyBGcmVlIG9sZCB0b3lzIGNvbnRlbnRzICh0byBiZSByZWVudHJhbnQpLCBidXQgbGVhdmUgcmVib3VuZCBpZiBhbnkKKyAgLy8gZG9uJ3QgYmxhbmsgb2xkIG9wdGFyZ3MgaWYgb3VyIG5ldyBhcmdjIGxpdmVzIGluIHRoZSBvbGQgb3B0YXJncy4KKyAgaWYgKGFyZ3Y8dG95cy5vcHRhcmdzIHx8IGFyZ3Y+dG95cy5vcHRhcmdzK3RveXMub3B0YykgZnJlZSh0b3lzLm9wdGFyZ3MpOworICBtZW1zZXQoJnRveXMsIDAsIG9mZnNldG9mKHN0cnVjdCB0b3lfY29udGV4dCwgcmVib3VuZCkpOworICBpZiAob2xkd2hpY2gpIG1lbXNldCgmdGhpcywgMCwgc2l6ZW9mKHRoaXMpKTsKKworICAvLyBDb250aW51ZSB0byBwb3J0aW9uIG9mIGluaXQgbmVlZGVkIGJ5IHN0YW5kYWxvbmUgY29tbWFuZHMKKyAgdG95X3NpbmdsZWluaXQod2hpY2gsIGFyZ3YpOworfQorCisvLyBMaWtlIGV4ZWMoKSBidXQgcnVucyBhbiBpbnRlcm5hbCB0b3lib3ggY29tbWFuZCBpbnN0ZWFkIG9mIGFub3RoZXIgZmlsZS4KKy8vIE9ubHkgcmV0dXJucyBpZiBpdCBjYW4ndCBydW4gY29tbWFuZCBpbnRlcm5hbGx5LCBvdGhlcndpc2UgZXhpdCgpIHdoZW4gZG9uZS4KK3ZvaWQgdG95X2V4ZWMoY2hhciAqYXJndltdKQoreworICBzdHJ1Y3QgdG95X2xpc3QgKndoaWNoOworCisgIC8vIFJldHVybiBpZiB3ZSBjYW4ndCBmaW5kIGl0ICh3aGljaCBpbmNsdWRlcyBubyBtdWx0aXBsZXhlciBjYXNlKSwKKyAgaWYgKCEod2hpY2ggPSB0b3lfZmluZCgqYXJndikpKSByZXR1cm47CisKKyAgLy8gUmV0dXJuIGlmIHN0YWNrIGRlcHRoIGdldHRpbmcgbm90aWNlYWJsZSAocHJveHkgZm9yIGxlYWtlZCBoZWFwLCBldGMpLgorCisgIC8vIENvbXBpbGVyIHdyaXRlcnMgaGF2ZSBkZWNpZGVkIHN1YnRyYWN0aW5nIGNoYXIgKiBpcyB1bmRlZmluZWQgYmVoYXZpb3IsCisgIC8vIHNvIGNvbnZlcnQgdG8gaW50ZWdlcnMuIChMUDY0IHNheXMgc2l6ZW9mKGxvbmcpPT1zaXplb2YocG9pbnRlcikuKQorICBpZiAoIUNGR19UT1lCT1hfTk9SRUNVUlNFKQorICAgIGlmICh0b3lzLnN0YWNrdG9wICYmIGxhYnMoKGxvbmcpdG95cy5zdGFja3RvcC0obG9uZykmd2hpY2gpPjYwMDApIHJldHVybjsKKworICAvLyBSZXR1cm4gaWYgd2UgbmVlZCB0byByZS1leGVjIHRvIGFjcXVpcmUgcm9vdCB2aWEgc3VpZCBiaXQuCisgIGlmICh0b3lzLndoaWNoICYmICh3aGljaC0+ZmxhZ3MmVE9ZRkxBR19ST09UT05MWSkgJiYgdG95cy53YXNyb290KSByZXR1cm47CisKKyAgLy8gUnVuIGNvbW1hbmQKKyAgdG95X2luaXQod2hpY2gsIGFyZ3YpOworICBpZiAodG95cy53aGljaCkgdG95cy53aGljaC0+dG95X21haW4oKTsKKyAgeGV4aXQoKTsKK30KKworLy8gTXVsdGlwbGV4ZXIgY29tbWFuZCwgZmlyc3QgYXJndW1lbnQgaXMgY29tbWFuZCB0byBydW4sIHJlc3QgYXJlIGFyZ3MgdG8gdGhhdC4KKy8vIElmIGZpcnN0IGFyZ3VtZW50IHN0YXJ0cyB3aXRoIC0gb3V0cHV0IGxpc3Qgb2YgY29tbWFuZCBpbnN0YWxsIHBhdGhzLgordm9pZCB0b3lib3hfbWFpbih2b2lkKQoreworICBzdGF0aWMgY2hhciAqdG95X3BhdGhzW109eyJ1c3IvIiwiYmluLyIsInNiaW4vIiwwfTsKKyAgaW50IGksIGxlbiA9IDA7CisKKyAgLy8gZmFzdCBwYXRoOiB0cnkgdG8gZXhlYyBpbW1lZGlhdGVseS4KKyAgLy8gKExlYXZlIHRveXMud2hpY2ggbnVsbCB0byBkaXNhYmxlIHN1aWQgcmV0dXJuIGxvZ2ljLikKKyAgaWYgKHRveXMuYXJndlsxXSkgdG95X2V4ZWModG95cy5hcmd2KzEpOworCisgIC8vIEZvciBlYXJseSBlcnJvciByZXBvcnRpbmcKKyAgdG95cy53aGljaCA9IHRveV9saXN0OworCisgIGlmICh0b3lzLmFyZ3ZbMV0pIHsKKyAgICBpZiAoIXN0cmNtcCgiLS12ZXJzaW9uIiwgdG95cy5hcmd2WzFdKSkgeworICAgICAgeHB1dHMoVE9ZQk9YX1ZFUlNJT04pOworICAgICAgeGV4aXQoKTsKKyAgICB9CisgICAgaWYgKHRveXMuYXJndlsxXVswXSAhPSAnLScpIHsKKyAgICAgIHRveXMuZXhpdHZhbCA9IDEyNzsKKyAgICAgIGVycm9yX2V4aXQoIlVua25vd24gY29tbWFuZCAlcyIsIHRveXMuYXJndlsxXSk7CisgICAgfQorICB9CisKKyAgLy8gT3V0cHV0IGxpc3Qgb2YgY29tbWFuZC4KKyAgZm9yIChpPTE7IGk8QVJSQVlfTEVOKHRveV9saXN0KTsgaSsrKSB7CisgICAgaW50IGZsID0gdG95X2xpc3RbaV0uZmxhZ3M7CisgICAgaWYgKGZsICYgVE9ZTUFTS19MT0NBVElPTikgeworICAgICAgaWYgKHRveXMuYXJndlsxXSkgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqPTA7IHRveV9wYXRoc1tqXTsgaisrKQorICAgICAgICAgIGlmIChmbCAmICgxPDxqKSkgbGVuICs9IHByaW50ZigiJXMiLCB0b3lfcGF0aHNbal0pOworICAgICAgfQorICAgICAgbGVuICs9IHByaW50ZigiJXMiLHRveV9saXN0W2ldLm5hbWUpOworICAgICAgaWYgKCsrbGVuID4gNjUpIGxlbiA9IDA7CisgICAgICB4cHV0YyhsZW4gPyAnICcgOiAnXG4nKTsKKyAgICB9CisgIH0KKyAgeHB1dGMoJ1xuJyk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGlmICghKmFyZ3YpIHJldHVybiAxMjc7CisKKyAgLy8gU25hcHNob3Qgc3RhY2sgbG9jYXRpb24gc28gd2UgY2FuIGRldGVjdCByZWN1cnNpb24gZGVwdGggbGF0ZXIuCisgIC8vIFRoaXMgaXMgaXRzIG93biBibG9jayBzbyBwcm9iZSBkb2Vzbid0IHBlcm1hbmVudGx5IGNvbnN1bWUgc3RhY2suCisgIGVsc2UgeworICAgIGludCBzdGFjazsKKworICAgIHRveXMuc3RhY2t0b3AgPSAmc3RhY2s7CisgIH0KKyAgKmFyZ3YgPSBnZXRiYXNlbmFtZSgqYXJndik7CisKKyAgLy8gSWYgbm9tbXUgY2FuJ3QgZm9yaywgc3BlY2lhbCByZWVudHJ5IHBhdGguCisgIC8vIFVzZSAhc3RhY2t0b3AgdG8gc2lnbmFsICJ2Zm9yayBoYXBwZW5lZCIsIGJvdGggYmVmb3JlIGFuZCBhZnRlciB4ZXhlYygpCisgIGlmICghQ0ZHX1RPWUJPWF9GT1JLKSB7CisgICAgaWYgKDB4ODAgJiAqKmFyZ3YpIHsKKyAgICAgICoqYXJndiAmPSAweDdmOworICAgICAgdG95cy5zdGFja3RvcCA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKENGR19UT1lCT1gpIHsKKyAgICAvLyBDYWxsIHRoZSBtdWx0aXBsZXhlciwgYWRqdXN0aW5nIHRoaXMgYXJndltdIHRvIGJlIGl0cycgYXJndlsxXS4KKyAgICAvLyAoSXQgd2lsbCBhZGp1c3QgaXQgYmFjayBiZWZvcmUgY2FsbGluZyB0b3lfZXhlYygpLikKKyAgICB0b3lzLmFyZ3YgPSBhcmd2LTE7CisgICAgdG95Ym94X21haW4oKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBhIHNpbmdsZSB0b3lib3ggY29tbWFuZCBidWlsdCBzdGFuZGFsb25lIHdpdGggbm8gbXVsdGlwbGV4ZXIKKyAgICB0b3lfc2luZ2xlaW5pdCh0b3lfbGlzdCwgYXJndik7CisgICAgdG95X2xpc3QtPnRveV9tYWluKCk7CisgIH0KKworICB4ZXhpdCgpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvYmxvYXRjaGVjayBiL3RveWJveC9zY3JpcHRzL2Jsb2F0Y2hlY2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmZmNDY5MAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL2Jsb2F0Y2hlY2sKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAkIyAtbmUgMiBdCit0aGVuCisgIGVjaG8gInVzYWdlOiBibG9hdGNoZWNrIG9sZCBuZXciCisgIGV4aXQgMQorZmkKKworYWRkbGluZSgpCit7CisgIE5FWFQ9IiQocHJpbnRmICIlcyUgJCgoNTAtJHsjTEFTVE5BTUV9KSlkJSAxMGQgJTEwZCIgIiRMQVNUTkFNRSIgIiRPTEQiICIkTkVXIiAiJERFTFRBIikiCisgIFsgLXogIiRTVFVGRiIgXSAmJgorICAgIFNUVUZGPSIkTkVYVCIgfHwKKyAgICBTVFVGRj0iJChwcmludGYgIiVzXG4lcyIgIiRTVFVGRiIgIiRORVhUIikiCit9CisKK2RvX2Jsb2F0Y2hlY2soKQoreworICBMQVNUTkFNRT0KKyAgREVMVEE9MAorICBUT1RBTD0wCisgIE9MRD0wCisgIE5FVz0wCisgIFNUVUZGPQorCisgIHByaW50ZiAibmFtZSUgNDZzJSAxMHMlIDExc1xuIiBvbGQgbmV3IGRlbHRhCisgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICB3aGlsZSByZWFkIGEgYiBjIGQKKyAgZG8KKyAgICBUSElTTkFNRT0kKGVjaG8gIiRkIiB8IHNlZCAncy9bLl1bMC05XSokLy8nKQorCisgICAgaWYgWyAiJExBU1ROQU1FIiAhPSAiJFRISVNOQU1FIiBdCisgICAgdGhlbgorICAgICAgVE9UQUw9JCgoJFRPVEFMKyRERUxUQSkpCisgICAgICBbICRERUxUQSAtbmUgMCBdICYmIGFkZGxpbmUKKyAgICAgIExBU1ROQU1FPSIkVEhJU05BTUUiCisgICAgICBERUxUQT0wCisgICAgICBPTEQ9MAorICAgICAgTkVXPTAKKyAgICBmaQorCisgICAgU0laRT0kKHByaW50ZiAiJWQiICIweCRiIikKKyAgICBpZiBbICIkYSIgPT0gIi0iIF0KKyAgICB0aGVuCisgICAgICBPTEQ9JCgoJE9MRCskU0laRSkpCisgICAgICBTSVpFPSQoKC0xKiRTSVpFKSkKKyAgICBlbHNlCisgICAgICBORVc9JCgoJE5FVyskU0laRSkpCisgICAgZmkKKyAgICBERUxUQT0kKCgkREVMVEErJFNJWkUpKQorICBkb25lCisKKyAgVE9UQUw9JCgoJFRPVEFMKyRERUxUQSkpCisgIFsgJERFTFRBIC1uZSAwIF0gJiYgYWRkbGluZQorCisgIGVjaG8gIiRTVFVGRiIgfCBzb3J0IC1rNCw0bnIKKyAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgIHByaW50ZiAiJSA3MWQgdG90YWxcbiIgIiRUT1RBTCIKK30KKworRElGRjE9YG1rdGVtcCBiYXNlLlhYWFhYWFhgCitESUZGMj1gbWt0ZW1wIGJsb2F0LlhYWFhYWFhgCit0cmFwICJybSAkRElGRjEgJERJRkYyIiBFWElUCitubSAtLXNpemUtc29ydCAiJDEiIHwgc29ydCAtazMsMyA+ICRESUZGMQorbm0gLS1zaXplLXNvcnQgIiQyIiB8IHNvcnQgLWszLDMgPiAkRElGRjIKK2RpZmYgLVUgMCAkRElGRjEgJERJRkYyIHwgdGFpbCAtbiArMyB8IHNlZCAtbiAncy9eXChbLStdXCkvXDEgL3AnIFwKKyAgfCBzb3J0IC1rNCw0IHwgZG9fYmxvYXRjaGVjawpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvY2hhbmdlLnNoIGIvdG95Ym94L3NjcmlwdHMvY2hhbmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5ZGNmZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9jaGFuZ2Uuc2gKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL2Jhc2gKKworIyBidWlsZCBlYWNoIGNvbW1hbmQgYXMgYSBzdGFuZGFsb25lIGV4ZWN1dGFibGUKKworTk9CVUlMRD0xIHNjcmlwdHMvbWFrZS5zaCA+IC9kZXYvbnVsbCAmJgorJHtIT1NUQ0M6LWNjfSAtSSAuIHNjcmlwdHMvaW5zdGFsbC5jIC1vIGdlbmVyYXRlZC9pbnN0bGlzdCAmJgorZXhwb3J0IFBSRUZJWD0ke1BSRUZJWDotY2hhbmdlL30gJiYKK21rZGlyIC1wICIkUFJFRklYIiB8fCBleGl0IDEKKworIyBCdWlsZCBhbGwgdGhlIGNvbW1hbmRzIHN0YW5kYWxvbmUgZXhjZXB0OgorCisjIHNoIC0gc2hlbGwgYnVpbHRpbnMgbGlrZSAiY2QiIGFuZCAiZXhpdCIgbmVlZCB0aGUgbXVsdGlwbGV4ZXIKKyMgaGVscCAtIG5lZWRzIHRvIGtub3cgd2hhdCBvdGhlciBjb21tYW5kcyBhcmUgZW5hYmxlZCAodXNlIGNvbW1hbmQgLS1oZWxwKQorCitmb3IgaSBpbiAkKGdlbmVyYXRlZC9pbnN0bGlzdCB8IGVncmVwIC12dyAic2h8aGVscCIpCitkbworICBlY2hvIC1uICIgJGkiICYmCisgIHNjcmlwdHMvc2luZ2xlLnNoICRpID4gL2Rldi9udWxsIDI+JFBSRUZJWC8ke2l9LmJhZCAmJgorICAgIHJtICRQUkVGSVgvJHtpfS5iYWQgfHwgZWNobyAtbiAnKicKK2RvbmUKK2VjaG8KZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL2NvbmZpZzJoZWxwLmMgYi90b3lib3gvc2NyaXB0cy9jb25maWcyaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzVlODQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9jb25maWcyaGVscC5jCkBAIC0wLDAgKzEsNDE1IEBACisvLyNpbmNsdWRlICJ0b3lzLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitzdHJ1Y3Qgc3RhdHZmcyB7aW50IGk7fTsKKyNpbmNsdWRlICJsaWIvcG9ydGFiaWxpdHkuaCIKKyNpbmNsdWRlICJsaWIvbGliLmgiCisKKy8vIEh1bW9yIHRveXMuaCAobGllIHRocm91Z2ggb3VyIHRlZXRoLCBDJ3MgbGlua2VyIGRvZXNuJ3QgY2FyZSkuCitjaGFyIHRveXNbNDA5Nl0sIGxpYmJ1Zls0MDk2XSwgdG95YnVmWzQwOTZdOwordm9pZCBzaG93X2hlbHAoRklMRSAqb3V0KSB7O30KK3ZvaWQgdG95X2V4ZWMoY2hhciAqYXJndltdKSB7O30KK3ZvaWQgdG95X2luaXQodm9pZCAqd2hpY2gsIGNoYXIgKmFyZ3ZbXSkgezt9CisKKy8vIFBhcnNlIGNvbmZpZyBmaWxlcyBpbnRvIGRhdGEgc3RydWN0dXJlcy4KKworc3RydWN0IHN5bWJvbCB7CisgIHN0cnVjdCBzeW1ib2wgKm5leHQ7CisgIGludCBlbmFibGVkLCBoZWxwX2luZGVudDsKKyAgY2hhciAqbmFtZSwgKmRlcGVuZHM7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqaGVscDsKK30gKnN5bTsKKworLy8gcmVtb3ZlIGxlYWRpbmcgc3BhY2VzCitjaGFyICp0cmltKGNoYXIgKnMpCit7CisgIHdoaWxlIChpc3NwYWNlKCpzKSkgcysrOworCisgIHJldHVybiBzOworfQorCisvLyBpZiBsaW5lIHN0YXJ0cyB3aXRoIG5hbWUgKGFzIHdob2xlIHdvcmQpIHJldHVybiBwb2ludGVyIGFmdGVyIGl0LCBlbHNlIE5VTEwKK2NoYXIgKmtleXdvcmQoY2hhciAqbmFtZSwgY2hhciAqbGluZSkKK3sKKyAgaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKKworICBsaW5lID0gdHJpbShsaW5lKTsKKyAgaWYgKHN0cm5jbXAobmFtZSwgbGluZSwgbGVuKSkgcmV0dXJuIDA7CisgIGxpbmUgKz0gbGVuOworICBpZiAoKmxpbmUgJiYgIWlzc3BhY2UoKmxpbmUpKSByZXR1cm4gMDsKKyAgbGluZSA9IHRyaW0obGluZSk7CisKKyAgcmV0dXJuIGxpbmU7Cit9CisKKy8vIGRsaXN0X3BvcCgpIGZyZWVpbmcgd3JhcHBlciBzdHJ1Y3R1cmUgZm9yIHlvdS4KK2NoYXIgKmRsaXN0X3phcChzdHJ1Y3QgZG91YmxlX2xpc3QgKipoZWxwKQoreworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRkID0gZGxpc3RfcG9wKGhlbHApOworICBjaGFyICpzID0gZGQtPmRhdGE7CisKKyAgZnJlZShkZCk7CisgIAorICByZXR1cm4gczsKK30KKworaW50IHphcF9ibGFua19saW5lcyhzdHJ1Y3QgZG91YmxlX2xpc3QgKipoZWxwKQoreworICBpbnQgZ290ID0gMDsKKworICB3aGlsZSAoKmhlbHApIHsKKyAgICBjaGFyICpzOworCisgICAgcyA9IHRyaW0oKCpoZWxwKS0+ZGF0YSk7CisKKyAgICBpZiAoKnMpIGJyZWFrOworICAgIGdvdCsrOworICAgIGZyZWUoZGxpc3RfemFwKGhlbHApKTsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy8vIENvbGxlY3QgIi1hIGJsYWgiIGRlc2NyaXB0aW9uIGxpbmVzIGZvbGxvd2luZyBhIGJsYW5rIGxpbmUgKG9yIHN0YXJ0KS4KKy8vIFJldHVybnMgYXJyYXkgb2YgcmVtb3ZlZCBsaW5lcyB3aXRoICpsZW4gZW50cmllcyAoMCBmb3Igbm9uZSkuCisKKy8vIE1vdmVzICpoZWxwIHRvIG5ldyBzdGFydCBvZiB0ZXh0IChpbiBjYXNlIGRhc2ggbGluZXMgd2VyZSBhdCBiZWdpbm5pbmcpLgorLy8gU2V0cyAqZnJvbSB0byB3aGVyZSBkYXNoIGxpbmVzIHJlbW92ZWQgZnJvbSAoaW4gY2FzZSB0aGV5IHdlcmVuJ3QpLgorLy8gRGlzY2FyZHMgYmxhbmsgbGluZXMgYmVmb3JlIGFuZCBhZnRlciBkYXNobGluZXMuCisKKy8vIElmIG5vIHByZWZpeCwgKmhlbHAgTlVMTC4gSWYgbm8gcG9zdGZpeCwgKmZyb20gPT0gKmhlbHAKKy8vIGlmIG5vIGRhc2hsaW5lcyByZXR1cm5lZCAqZnJvbSA9PSAqaGVscC4KKworY2hhciAqKmdyYWJfZGFzaGxpbmVzKHN0cnVjdCBkb3VibGVfbGlzdCAqKmhlbHAsIHN0cnVjdCBkb3VibGVfbGlzdCAqKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZW4pCit7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqZGQ7CisgIGNoYXIgKnMsICoqbGlzdDsKKyAgaW50IGNvdW50ID0gMDsKKworICAqbGVuID0gMDsKKyAgemFwX2JsYW5rX2xpbmVzKGhlbHApOworICAqZnJvbSA9ICpoZWxwOworCisgIC8vIEZpbmQgc3RhcnQgb2YgZGFzaCBibG9jay4gTXVzdCBiZSBhdCBzdGFydCBvciBhZnRlciBibGFuayBsaW5lLgorICBmb3IgKDs7KSB7CisgICAgcyA9IHRyaW0oKCpmcm9tKS0+ZGF0YSk7CisgICAgaWYgKCpzID09ICctJyAmJiBzWzFdICE9ICctJyAmJiAhY291bnQpIGJyZWFrOworCisgICAgaWYgKCEqcykgY291bnQgPSAwOworICAgIGVsc2UgY291bnQrKzsKKworICAgICpmcm9tID0gKCpmcm9tKS0+bmV4dDsKKyAgICBpZiAoKmZyb20gPT0gKmhlbHApIHJldHVybiAwOworICB9CisKKyAgLy8gSWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgYmVmb3JlIHRoaXMsIHphcCBpdC4gVGhpcyBjYW4ndCB0YWtlIG91dCAqaGVscAorICAvLyBiZWNhdXNlIHphcF9ibGFua19saW5lcyBza2lwcGVkIGJsYW5rIGxpbmVzLCBhbmQgd2UgaGFkIHRvIGhhdmUgYXQgbGVhc3QKKyAgLy8gb25lIG5vbi1ibGFuayBsaW5lIChhIGRhc2ggbGluZSkgdG8gZ2V0IHRoaXMgZmFyLgorICB3aGlsZSAoISp0cmltKCgqZnJvbSktPnByZXYtPmRhdGEpKSB7CisgICAgKmZyb20gPSAoKmZyb20pLT5wcmV2OworICAgIGZyZWUoZGxpc3RfemFwKGZyb20pKTsKKyAgfQorCisgIC8vIENvdW50IG51bWJlciBvZiBkYXNobGluZXMsIGNvcHkgb3V0IHRvIGFycmF5LCB6YXAgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAvLyBJZiAqaGVscCB3YXMgYXQgc3RhcnQgb2YgZGFzaGJsb2NrLCBtb3ZlIGl0IHdpdGggKmZyb20KKyAgY291bnQgPSAwOworICBkZCA9ICpmcm9tOworICBpZiAoKmhlbHAgPT0gKmZyb20pICpoZWxwID0gMDsKKyAgZm9yICg7OykgeworICAgaWYgKCp0cmltKGRkLT5kYXRhKSAhPSAnLScpIGJyZWFrOworICAgY291bnQrKzsKKyAgIGlmICgqZnJvbSA9PSAoZGQgPSBkZC0+bmV4dCkpIGJyZWFrOworICB9CisKKyAgbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikqY291bnQpOworICAqbGVuID0gY291bnQ7CisgIHdoaWxlIChjb3VudCkgbGlzdFstLWNvdW50XSA9IGRsaXN0X3phcChmcm9tKTsKKworICByZXR1cm4gbGlzdDsKK30KKwordm9pZCBwYXJzZShjaGFyICpmaWxlbmFtZSkKK3sKKyAgRklMRSAqZnAgPSB4Zm9wZW4oZmlsZW5hbWUsICJyIik7CisgIHN0cnVjdCBzeW1ib2wgKm5ldyA9IDA7CisKKyAgZm9yICg7OykgeworICAgIGNoYXIgKnMsICpsaW5lID0gTlVMTDsKKyAgICBzaXplX3QgbGVuOworCisgICAgLy8gUmVhZCBsaW5lLCB0cmltIHdoaXRlc3BhY2UgYXQgcmlnaHQgZWRnZS4KKyAgICBpZiAoZ2V0bGluZSgmbGluZSwgJmxlbiwgZnApIDwgMSkgYnJlYWs7CisgICAgcyA9IGxpbmUrc3RybGVuKGxpbmUpOworICAgIHdoaWxlICgtLXMgPj0gbGluZSkgeworICAgICAgaWYgKCFpc3NwYWNlKCpzKSkgYnJlYWs7CisgICAgICAqcyA9IDA7CisgICAgfQorCisgICAgLy8gc291cmNlIG9yIGNvbmZpZyBrZXl3b3JkIGF0IGxlZnQgZWRnZT8KKyAgICBpZiAoKmxpbmUgJiYgIWlzc3BhY2UoKmxpbmUpKSB7CisgICAgICBpZiAoKHMgPSBrZXl3b3JkKCJjb25maWciLCBsaW5lKSkpIHsKKyAgICAgICAgbmV3ID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHN5bWJvbCkpOworICAgICAgICBuZXctPm5leHQgPSBzeW07CisgICAgICAgIG5ldy0+bmFtZSA9IHM7CisgICAgICAgIHN5bSA9IG5ldzsKKyAgICAgIH0gZWxzZSBpZiAoKHMgPSBrZXl3b3JkKCJzb3VyY2UiLCBsaW5lKSkpIHBhcnNlKHMpOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFuZXcpIGNvbnRpbnVlOworCisgICAgaWYgKHN5bSAmJiBzeW0tPmhlbHBfaW5kZW50KSB7CisgICAgICBkbGlzdF9hZGQoJihuZXctPmhlbHApLCBsaW5lKTsKKyAgICAgIGlmIChzeW0tPmhlbHBfaW5kZW50IDwgMCkgeworICAgICAgICBzeW0tPmhlbHBfaW5kZW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGlzc3BhY2UobGluZVtzeW0tPmhlbHBfaW5kZW50XSkpIHN5bS0+aGVscF9pbmRlbnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKHMgPSBrZXl3b3JkKCJkZXBlbmRzIiwgbGluZSkpICYmIChzID0ga2V5d29yZCgib24iLCBzKSkpCisgICAgICBuZXctPmRlcGVuZHMgPSBzOworICAgIGVsc2UgaWYgKGtleXdvcmQoImhlbHAiLCBsaW5lKSkgc3ltLT5oZWxwX2luZGVudCA9IC0xOworICB9CisKKyAgZmNsb3NlKGZwKTsKK30KKworaW50IGNoYXJzb3J0KHZvaWQgKmEsIHZvaWQgKmIpCit7CisgIGNoYXIgKmFhID0gYSwgKmJiID0gYjsKKworICBpZiAoKmFhIDwgKmJiKSByZXR1cm4gLTE7CisgIGlmICgqYWEgPiAqYmIpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhc2hzb3J0KGNoYXIgKiphLCBjaGFyICoqYikKK3sKKyAgY2hhciAqYWEgPSAqYSwgKmJiID0gKmI7CisKKyAgaWYgKGFhWzFdIDwgYmJbMV0pIHJldHVybiAtMTsKKyAgaWYgKGFhWzFdID4gYmJbMV0pIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhc2hsaW5lc29ydChjaGFyICoqYSwgY2hhciAqKmIpCit7CisgIHJldHVybiBzdHJjbXAoKmEsICpiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgRklMRSAqZnA7CisKKyAgaWYgKGFyZ2MgIT0gMykgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGNvbmZpZzJoZWxwIENvbmZpZy5pbiAuY29uZmlnXG4iKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gUmVhZCBDb25maWcuaW4KKyAgcGFyc2UoYXJndlsxXSk7CisKKyAgLy8gcmVhZCAuY29uZmlnCisgIGZwID0geGZvcGVuKGFyZ3ZbMl0sICJyIik7CisgIGZvciAoOzspIHsKKyAgICBjaGFyICpsaW5lID0gTlVMTDsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGdldGxpbmUoJmxpbmUsICZsZW4sIGZwKSA8IDEpIGJyZWFrOworICAgIGlmICghc3RybmNtcCgiQ09ORklHXyIsIGxpbmUsIDcpKSB7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICp0cnk7CisgICAgICBjaGFyICpzID0gbGluZSs3OworCisgICAgICBmb3IgKHRyeT1zeW07IHRyeTsgdHJ5PXRyeS0+bmV4dCkgeworICAgICAgICBsZW4gPSBzdHJsZW4odHJ5LT5uYW1lKTsKKyAgICAgICAgaWYgKCFzdHJuY21wKHRyeS0+bmFtZSwgcywgbGVuKSAmJiBzW2xlbl09PSc9JyAmJiBzW2xlbisxXT09J3knKSB7CisgICAgICAgICAgdHJ5LT5lbmFibGVkKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gCisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29sbGF0ZSBoZWxwIGFjY29yZGluZyB0byB1c2FnZSwgZGVwZW5kcywgYW5kIC5jb25maWcKKworICAvLyBMb29wIHRocm91Z2ggZWFjaCBlbnRyeSwgZmluZGluZyBkdXBsaWNhdGUgZW5hYmxlZCAidXNhZ2U6IiBuYW1lcworICAvLyBUaGlzIGlzIGluIHJldmVyc2Ugb3JkZXIsIHNvIGxhc3QgZW50cnkgZ2V0cyBjb2xsYXRlZCB3aXRoIHByZXZpb3VzCisgIC8vIGVudHJ5IHVudGlsIHdlIHJ1biBvdXQgb2YgbWF0Y2hpbmcgcGFpcnMuCisgIGZvciAoOzspIHsKKyAgICBzdHJ1Y3Qgc3ltYm9sICp0aHJvdyA9IDAsICpjYXRjaDsKKyAgICBjaGFyICp0aGlzLCAqdGhhdCwgKmN1c2FnZSwgKnR1c2FnZSwgKm5hbWU7CisgICAgaW50IGxlbjsKKworICAgIC8vIGZpbmQgYSB1c2FnZTogbmFtZSBhbmQgY29sbGF0ZSBhbGwgZW5hYmxlZCBlbnRyaWVzIHdpdGggdGhhdCBuYW1lCisgICAgZm9yIChjYXRjaCA9IHN5bTsgY2F0Y2g7IGNhdGNoID0gY2F0Y2gtPm5leHQpIHsKKyAgICAgIGlmIChjYXRjaC0+ZW5hYmxlZCAhPSAxKSBjb250aW51ZTsKKyAgICAgIGlmIChjYXRjaC0+aGVscCAmJiAodGhhdCA9IGtleXdvcmQoInVzYWdlOiIsIGNhdGNoLT5oZWxwLT5kYXRhKSkpIHsKKyAgICAgICAgc3RydWN0IGRvdWJsZV9saXN0ICpjZnJvbSwgKnRmcm9tLCAqYW5jaG9yOworICAgICAgICBjaGFyICp0cnksICoqY2Rhc2hsaW5lcywgKip0ZGFzaGxpbmVzOworICAgICAgICBpbnQgY2xlbiwgdGxlbjsKKworICAgICAgICAvLyBBbGlnbiB1c2FnZTogbGluZXMsIGZpbmRpbmcgYSBtYXRjaGluZyBwYWlyIHNvIHdlIGNhbiBzdWNrIGhlbHAKKyAgICAgICAgLy8gdGV4dCBvdXQgb2YgdGhyb3cgaW50byBjYXRjaCwgY29weWluZyBmcm9tIHRoaXMgdG8gdGhhdAorICAgICAgICBpZiAoIXRocm93KSBuYW1lID0gdGhhdDsKKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcChuYW1lLCB0aGF0LCBsZW4pIHx8ICFpc3NwYWNlKHRoYXRbbGVuXSkpIGNvbnRpbnVlOworICAgICAgICBjYXRjaC0+ZW5hYmxlZCsrOworICAgICAgICB3aGlsZSAoIWlzc3BhY2UoKnRoYXQpICYmICp0aGF0KSB0aGF0Kys7CisgICAgICAgIGlmICghdGhyb3cpIGxlbiA9IHRoYXQtbmFtZTsKKyAgICAgICAgdGhhdCA9IHRyaW0odGhhdCk7CisgICAgICAgIGlmICghdGhyb3cpIHsKKyAgICAgICAgICB0aHJvdyA9IGNhdGNoOworICAgICAgICAgIHRoaXMgPSB0aGF0OworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBHcmFiIG9wdGlvbiBkZXNjcmlwdGlvbiBsaW5lcyB0byBjb2xsYXRlIGZyb20gY2F0Y2ggYW5kIHRocm93CisgICAgICAgIHR1c2FnZSA9IGRsaXN0X3phcCgmdGhyb3ctPmhlbHApOworICAgICAgICB0ZGFzaGxpbmVzID0gZ3JhYl9kYXNobGluZXMoJnRocm93LT5oZWxwLCAmdGZyb20sICZ0bGVuKTsKKyAgICAgICAgY3VzYWdlID0gZGxpc3RfemFwKCZjYXRjaC0+aGVscCk7CisgICAgICAgIGNkYXNobGluZXMgPSBncmFiX2Rhc2hsaW5lcygmY2F0Y2gtPmhlbHAsICZjZnJvbSwgJmNsZW4pOworICAgICAgICBhbmNob3IgPSBjYXRjaC0+aGVscDsKKworICAgICAgICAvLyBJZiB3ZSd2ZSBnb3QgYm90aCwgY29sbGF0ZSBhbmQgYWxwaGViZXRpemUKKyAgICAgICAgaWYgKGNkYXNobGluZXMgJiYgdGRhc2hsaW5lcykgeworICAgICAgICAgIGNoYXIgKipuZXcgPSB4bWFsbG9jKHNpemVvZihjaGFyICopKihjbGVuK3RsZW4pKTsKKworICAgICAgICAgIG1lbWNweShuZXcsIGNkYXNobGluZXMsIHNpemVvZihjaGFyICopKmNsZW4pOworICAgICAgICAgIG1lbWNweShuZXcrY2xlbiwgdGRhc2hsaW5lcywgc2l6ZW9mKGNoYXIgKikqdGxlbik7CisgICAgICAgICAgZnJlZShjZGFzaGxpbmVzKTsKKyAgICAgICAgICBmcmVlKHRkYXNobGluZXMpOworICAgICAgICAgIHFzb3J0KG5ldywgY2xlbit0bGVuLCBzaXplb2YoY2hhciAqKSwgKHZvaWQgKilkYXNobGluZXNvcnQpOworICAgICAgICAgIGNkYXNobGluZXMgPSBuZXc7CisKKyAgICAgICAgLy8gSWYganVzdCBvbmUsIG1ha2Ugc3VyZSBpdCdzIGluIGNhdGNoLgorICAgICAgICB9IGVsc2UgaWYgKHRkYXNobGluZXMpIGNkYXNobGluZXMgPSB0ZGFzaGxpbmVzOworCisgICAgICAgIC8vIElmIHRocm93IGhhZCBhIHByZWZpeCwgaW5zZXJ0IGl0IGJlZm9yZSBkYXNobGluZXMsIHdpdGggYQorICAgICAgICAvLyBibGFuayBsaW5lIGlmIGNhdGNoIGhhZCBhIHByZWZpeC4KKyAgICAgICAgaWYgKHRmcm9tICYmIHRmcm9tICE9IHRocm93LT5oZWxwKSB7CisgICAgICAgICAgaWYgKHRocm93LT5oZWxwIHx8IGNhdGNoLT5oZWxwKSBkbGlzdF9hZGQoJmNmcm9tLCBzdHJkdXAoIiIpKTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRsaXN0X2FkZCgmY2Zyb20sIDApOworICAgICAgICAgICAgYW5jaG9yID0gY2Zyb20tPnByZXY7CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlICh0aHJvdy0+aGVscCAmJiB0aHJvdy0+aGVscCAhPSB0ZnJvbSkKKyAgICAgICAgICAgIGRsaXN0X2FkZCgmY2Zyb20sIGRsaXN0X3phcCgmdGhyb3ctPmhlbHApKTsKKyAgICAgICAgICBpZiAoY2Zyb20gJiYgY2Zyb20tPnByZXYtPmRhdGEgJiYgKnRyaW0oY2Zyb20tPnByZXYtPmRhdGEpKQorICAgICAgICAgICAgZGxpc3RfYWRkKCZjZnJvbSwgc3RyZHVwKCIiKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbmNob3IpIHsKKyAgICAgICAgICBkbGlzdF9hZGQoJmNmcm9tLCAwKTsKKyAgICAgICAgICBhbmNob3IgPSBjZnJvbS0+cHJldjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNwbGljZSBzb3J0ZWQgbGluZXMgYmFjayBpbiBwbGFjZQorICAgICAgICBpZiAoY2Rhc2hsaW5lcykgeworICAgICAgICAgIHRsZW4gKz0gY2xlbjsKKworICAgICAgICAgIGZvciAoY2xlbiA9IDA7IGNsZW4gPCB0bGVuOyBjbGVuKyspIAorICAgICAgICAgICAgZGxpc3RfYWRkKCZjZnJvbSwgY2Rhc2hsaW5lc1tjbGVuXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGRhc2hsaW5lcywgdGV4dCB3b3VsZCBiZSBjb25zaWRlcmVkIHByZWZpeCwgc28KKyAgICAgICAgLy8gdGhlIGxpc3QgaXMgZGVmaW5pdGVseSBubyBsb25nZXIgZW1wdHksIHNvIGRpc2NhcmQgcGxhY2Vob2xkZXIuCisgICAgICAgIGlmICghYW5jaG9yLT5kYXRhKSBkbGlzdF96YXAoJmFuY2hvcik7CisKKyAgICAgICAgLy8gemFwIHdoaXRlc3BhY2UgYXQgZW5kIG9mIGNhdGNoIGhlbHAgdGV4dAorICAgICAgICB3aGlsZSAoISp0cmltKGFuY2hvci0+cHJldi0+ZGF0YSkpIHsKKyAgICAgICAgICBhbmNob3IgPSBhbmNob3ItPnByZXY7CisgICAgICAgICAgZnJlZShkbGlzdF96YXAoJmFuY2hvcikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwZW5kIHRyYWlsaW5nIGxpbmVzLgorICAgICAgICB3aGlsZSAodGZyb20pIGRsaXN0X2FkZCgmYW5jaG9yLCBkbGlzdF96YXAoJnRmcm9tKSk7CisKKyAgICAgICAgLy8gQ29sbGF0ZSBmaXJzdCBbLWFiY10gb3B0aW9uIGJsb2NrIGluIHVzYWdlOiBsaW5lcworICAgICAgICB0cnkgPSAwOworICAgICAgICBpZiAoKnRoaXMgPT0gJ1snICYmIHRoaXNbMV0gPT0gJy0nICYmIHRoaXNbMl0gIT0gJy0nICYmCisgICAgICAgICAgICAqdGhhdCA9PSAnWycgJiYgdGhhdFsxXSA9PSAnLScgJiYgdGhhdFsyXSAhPSAnLScpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpmcm9tID0gdGhpcysyLCAqdG8gPSB0aGF0KzI7CisgICAgICAgICAgaW50IGZmID0gc3RyY3Nwbihmcm9tLCAiIF0iKSwgdHQgPSBzdHJjc3BuKHRvLCAiIF0iKTsKKworICAgICAgICAgIGlmIChmcm9tW2ZmXSA9PSAnXScgJiYgdG9bdHRdID09ICddJykgeworICAgICAgICAgICAgdHJ5ID0geG1wcmludGYoIlstJS4qcyUuKnNdICIsIGZmLCBmcm9tLCB0dCwgdG8pOworICAgICAgICAgICAgcXNvcnQodHJ5KzIsIGZmK3R0LCAxLCAodm9pZCAqKWNoYXJzb3J0KTsKKyAgICAgICAgICAgIHRoaXMgPSB0cmltKHRoaXMrZmYrMyk7CisgICAgICAgICAgICB0aGF0ID0gdHJpbSh0aGF0K3R0KzMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBsaXN0IGlzIGRlZmluaXRlbHkgbm8gbG9uZ2VyIGVtcHR5LCBzbyBkaXNjYXJkIHBsYWNlaG9sZGVyLgorICAgICAgICBpZiAoIWFuY2hvci0+ZGF0YSkgZGxpc3RfemFwKCZhbmNob3IpOworCisgICAgICAgIC8vIEFkZCBuZXcgY29sbGF0ZWQgbGluZSAoYW5kIHdoaXRlc3BhY2UpLgorICAgICAgICBkbGlzdF9hZGQoJmFuY2hvciwgeG1wcmludGYoIiUqY3VzYWdlOiAlLipzICVzJXMlcyVzIiwKKyAgICAgICAgICAgICAgICAgIGNhdGNoLT5oZWxwX2luZGVudCwgJyAnLCBsZW4sIG5hbWUsIHRyeSA/IHRyeSA6ICIiLAorICAgICAgICAgICAgICAgICAgdGhpcywgKnRoaXMgPyAiICIgOiAiIiwgdGhhdCkpOworICAgICAgICBmcmVlKHRyeSk7CisgICAgICAgIGRsaXN0X2FkZCgmYW5jaG9yLCBzdHJkdXAoIiIpKTsKKyAgICAgICAgZnJlZShjdXNhZ2UpOworICAgICAgICBmcmVlKHR1c2FnZSk7CisgICAgICAgIHRocm93LT5lbmFibGVkID0gMDsKKyAgICAgICAgdGhyb3cgPSBjYXRjaDsKKyAgICAgICAgdGhyb3ctPmhlbHAgPSBhbmNob3ItPnByZXYtPnByZXY7CisKKyAgICAgICAgdGhyb3cgPSBjYXRjaDsKKyAgICAgICAgdGhpcyA9IHRocm93LT5oZWxwLT5kYXRhICsgdGhyb3ctPmhlbHBfaW5kZW50ICsgOCArIGxlbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEaWQgd2UgZmluZCBvbmU/CisKKyAgICBpZiAoIXRocm93KSBicmVhazsKKyAgfQorCisgIC8vIFByaW50IG91dCBoZWxwICNkZWZpbmVzCisgIHdoaWxlIChzeW0pIHsKKyAgICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRkOworCisgICAgaWYgKHN5bS0+aGVscCkgeworICAgICAgaW50IGk7CisgICAgICBjaGFyICpzID0geHN0cmR1cChzeW0tPm5hbWUpOworCisgICAgICBmb3IgKGkgPSAwOyBzW2ldOyBpKyspIHNbaV0gPSB0b2xvd2VyKHNbaV0pOworICAgICAgcHJpbnRmKCIjZGVmaW5lIEhFTFBfJXMgXCIiLCBzKTsKKyAgICAgIGZyZWUocyk7CisKKyAgICAgIGRkID0gc3ltLT5oZWxwOworICAgICAgZm9yICg7OykgeworICAgICAgICBpID0gc3ltLT5oZWxwX2luZGVudDsKKworICAgICAgICAvLyBUcmltIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgICAgICBzID0gZGQtPmRhdGE7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSAmJiBpKSB7CisgICAgICAgICAgcysrOworICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGk9MDsgc1tpXTsgaSsrKSB7CisgICAgICAgICAgaWYgKHNbaV0gPT0gJyInIHx8IHNbaV0gPT0gJ1xcJykgcHV0Y2hhcignXFwnKTsKKyAgICAgICAgICBwdXRjaGFyKHNbaV0pOworICAgICAgICB9CisgICAgICAgIHB1dGNoYXIoJ1xcJyk7CisgICAgICAgIHB1dGNoYXIoJ24nKTsKKyAgICAgICAgZGQgPSBkZC0+bmV4dDsKKyAgICAgICAgaWYgKGRkID09IHN5bS0+aGVscCkgYnJlYWs7CisgICAgICB9CisgICAgICBwcmludGYoIlwiXG5cbiIpOworICAgIH0KKyAgICBzeW0gPSBzeW0tPm5leHQ7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL2ZpbmRnbG9iYWxzLnNoIGIvdG95Ym94L3NjcmlwdHMvZmluZGdsb2JhbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM2MzE2NAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL2ZpbmRnbG9iYWxzLnNoCkBAIC0wLDAgKzEsNiBAQAorIyEvYmluL2Jhc2gKKworIyBRdWljayBhbmQgZGlydHkgY2hlY2sgdG8gc2VlIGlmIGFueWJvZHkncyBsZWFrZWQgZ2xvYmFsIHZhcmlhYmxlcy4KKyMgV2Ugc2hvdWxkIGhhdmUgdGhpcywgdG95X2xpc3QsIHRveWJ1ZiwgYW5kIHRveXMuCisKK25tIHRveWJveF91bnN0cmlwcGVkIHwgZ3JlcCAnWzAtOUEtRmEtZl0qIFtCQ0RHUlNdJyB8IGN1dCAtZCAnICcgLWYgMwpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvZ2VuY29uZmlnLnNoIGIvdG95Ym94L3NjcmlwdHMvZ2VuY29uZmlnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1NWU3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9nZW5jb25maWcuc2gKQEAgLTAsMCArMSwxNTQgQEAKKyMhL2Jpbi9iYXNoCisKKyMgVGhpcyBoYXMgdG8gYmUgYSBzZXBhcmF0ZSBmaWxlIGZyb20gc2NyaXB0cy9tYWtlLnNoIHNvIGl0IGNhbiBiZSBjYWxsZWQKKyMgYmVmb3JlIG1lbnVjb25maWcuICAoSXQncyBjYWxsZWQgYWdhaW4gZnJvbSBzY3JpcHRzL21ha2Uuc2gganVzdCB0byBiZSBzdXJlLikKKworbWtkaXIgLXAgZ2VuZXJhdGVkCisKK3NvdXJjZSBjb25maWd1cmUKKworcHJvYmVjYygpCit7CisgICR7Q1JPU1NfQ09NUElMRX0ke0NDfSAkQ0ZMQUdTIC14YyAtbyAvZGV2L251bGwgJDEgLQorfQorCisjIFByb2JlIGZvciBhIHNpbmdsZSBjb25maWcgc3ltYm9sIHdpdGggYSAiY29tcGlsZXMgb3Igbm90IiB0ZXN0LgorIyBTeW1ib2wgbmFtZSBpcyBmaXJzdCBhcmd1bWVudCwgZmxhZ3Mgc2Vjb25kLCBmZWVkIEMgZmlsZSB0byBzdGRpbgorcHJvYmVzeW1ib2woKQoreworICBwcm9iZWNjICQyIDI+L2Rldi9udWxsICYmIERFRkFVTFQ9eSB8fCBERUZBVUxUPW4KKyAgcm0gYS5vdXQgMj4vZGV2L251bGwKKyAgZWNobyAtZSAiY29uZmlnICQxXG5cdGJvb2wiIHx8IGV4aXQgMQorICBlY2hvIC1lICJcdGRlZmF1bHQgJERFRkFVTFRcbiIgfHwgZXhpdCAxCit9CisKK3Byb2JlY29uZmlnKCkKK3sKKyAgPiBnZW5lcmF0ZWQvY2ZsYWdzCisgICMgbGx2bSBwcm9kdWNlcyBpdHMgb3duIHJlYWxseSBzdHVwaWQgd2FybmluZ3MgYWJvdXQgdGhpbmdzIHRoYXQgYXJlbid0IHdyb25nLAorICAjIGFuZCBhbHRob3VnaCB5b3UgY2FuIHR1cm4gdGhlIHdhcm5pbmcgb2ZmLCBnY2MgcmVhY3RzIGJhZGx5IHRvIGNvbW1hbmQgbGluZQorICAjIGFyZ3VtZW50cyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuIFNvIHByb2JlLgorICBbIC16ICIkKHByb2JlY2MgLVduby1zdHJpbmctcGx1cy1pbnQgPDw8IFwjd2FybiB3YXJuIDI+JjEgfCBncmVwIHN0cmluZy1wbHVzLWludCkiIF0gJiYKKyAgICBlY2hvIC1Xbm8tc3RyaW5nLXBsdXMtaW50ID4+IGdlbmVyYXRlZC9jZmxhZ3MKKworICAjIFByb2JlIGZvciBjb250YWluZXIgc3VwcG9ydCBvbiB0YXJnZXQKKyAgcHJvYmVzeW1ib2wgVE9ZQk9YX0NPTlRBSU5FUiA8PCBFT0YKKyAgICAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyAgICBpbnQgeD1DTE9ORV9ORVdOU3xDTE9ORV9ORVdVVFN8Q0xPTkVfTkVXSVBDfENMT05FX05FV05FVDsKKworICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgcmV0dXJuIHVuc2hhcmUoeCk7IH0KK0VPRgorCisgIHByb2Jlc3ltYm9sIFRPWUJPWF9GSUZSRUVaRSAtYyA8PCBFT0YKKyAgICAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyAgICAjaWZuZGVmIEZJRlJFRVpFCisgICAgI2Vycm9yIG5vcGUKKyAgICAjZW5kaWYKK0VPRgorCisgICMgV29yayBhcm91bmQgc29tZSB1Q2xpYmMgbGltaXRhdGlvbnMKKyAgcHJvYmVzeW1ib2wgVE9ZQk9YX0lDT05WIC1jIDw8IEVPRgorICAgICNpbmNsdWRlICJpY29udi5oIgorRU9GCisgIHByb2Jlc3ltYm9sIFRPWUJPWF9GQUxMT0NBVEUgPDwgRU9GCisgICAgI2luY2x1ZGUgPGZjbnRsLmg+CisKKyAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IHJldHVybiBwb3NpeF9mYWxsb2NhdGUoMCwwLDApOyB9CitFT0YKKyAgCisgICMgQW5kcm9pZCBhbmQgc29tZSBvdGhlciBwbGF0Zm9ybXMgbWlzcyB1dG1weAorICBwcm9iZXN5bWJvbCBUT1lCT1hfVVRNUFggLWMgPDwgRU9GCisgICAgI2luY2x1ZGUgPHV0bXB4Lmg+CisgICAgI2lmbmRlZiBCT09UX1RJTUUKKyAgICAjZXJyb3Igbm9wZQorICAgICNlbmRpZgorICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICAgIHN0cnVjdCB1dG1weCAqYTsgCisgICAgICBpZiAoMCAhPSAoYSA9IGdldHV0eGVudCgpKSkgcmV0dXJuIDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CitFT0YKKworICAjIEFuZHJvaWQgaXMgbWlzc2luZyBzaGFkb3cuaAorICBwcm9iZXN5bWJvbCBUT1lCT1hfU0hBRE9XIC1jIDw8IEVPRgorICAgICNpbmNsdWRlIDxzaGFkb3cuaD4KKyAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgICAgICBzdHJ1Y3Qgc3B3ZCAqYSA9IGdldHNwbmFtKCJyb290Iik7IHJldHVybiAwOworICAgIH0KK0VPRgorCisgICMgU29tZSBjb21tYW5kcyBhcmUgYW5kcm9pZC1zcGVjaWZpYworICBwcm9iZXN5bWJvbCBUT1lCT1hfT05fQU5EUk9JRCAtYyA8PCBFT0YKKyAgICAjaWZuZGVmIF9fQU5EUk9JRF9fCisgICAgI2Vycm9yIG5vcGUKKyAgICAjZW5kaWYKK0VPRgorCisgICMgbm9tbXUgc3VwcG9ydAorICBwcm9iZXN5bWJvbCBUT1lCT1hfRk9SSyA8PCBFT0YKKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyByZXR1cm4gZm9yaygpOyB9CitFT0YKKyAgZWNobyAtZSAnXHRkZXBlbmRzIG9uICFUT1lCT1hfTVVTTF9OT01NVV9JU19CUk9LRU4nCisKKyAgcHJvYmVzeW1ib2wgVE9ZQk9YX1BSTElNSVQgPDwgRU9GCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyBwcmxpbWl0KDAsIDAsIDAsIDApOyB9CitFT0YKK30KKworZ2VuY29uZmlnKCkKK3sKKyAgIyBSZXZlcnNlIHNvcnQgcHV0cyBwb3NpeCBmaXJzdCwgZXhhbXBsZXMgbGFzdC4KKyAgZm9yIGogaW4gJChscyB0b3lzLyovUkVBRE1FIHwgc29ydCAtcyAtcikKKyAgZG8KKyAgICBESVI9IiQoZGlybmFtZSAiJGoiKSIKKworICAgIFsgJChscyAiJERJUiIgfCB3YyAtbCkgLWx0IDIgXSAmJiBjb250aW51ZQorCisgICAgZWNobyAibWVudSBcIiQoaGVhZCAtbiAxICRqKVwiIgorICAgIGVjaG8KKworICAgICMgZXh0cmFjdCBjb25maWcgc3RhbnphcyBmcm9tIGVhY2ggc291cmNlIGZpbGUsIGluIGFscGhhYmV0aWNhbCBvcmRlcgorICAgIGZvciBpIGluICQobHMgLTEgJERJUi8qLmMpCisgICAgZG8KKyAgICAgICMgR3JhYiB0aGUgY29uZmlnIGJsb2NrIGZvciBDb25maWcuaW4KKyAgICAgIGVjaG8gIiMgJGkiCisgICAgICBzZWQgLW4gJy9eXCpcLy9xOy9eY29uZmlnIFtBLVpdLywkcCcgJGkgfHwgcmV0dXJuIDEKKyAgICAgIGVjaG8KKyAgICBkb25lCisKKyAgICBlY2hvIGVuZG1lbnUKKyAgZG9uZQorfQorCitwcm9iZWNvbmZpZyA+IGdlbmVyYXRlZC9Db25maWcucHJvYmVkIHx8IHJtIGdlbmVyYXRlZC9Db25maWcucHJvYmVkCitnZW5jb25maWcgPiBnZW5lcmF0ZWQvQ29uZmlnLmluIHx8IHJtIGdlbmVyYXRlZC9Db25maWcuaW4KKworIyBGaW5kIG5hbWVzIG9mIGNvbW1hbmRzIHRoYXQgY2FuIGJlIGJ1aWx0IHN0YW5kYWxvbmUgaW4gdGhlc2UgQyBmaWxlcwordG95cygpCit7CisgIGdyZXAgJ1RPWSguKiknICIkQCIgfCBncmVwIC12IFRPWUZMQUdfTk9GT1JLIHwgZ3JlcCAtdiAiMCkpIiB8IFwKKyAgICBzZWQgLXJuICdzLyhbXjpdKik6LiooT0xEfE5FVylUT1lcKCAqKFthLXpBLVpdW14sXSopICosLiovXDE6XDMvcCcKK30KKworV09SS0lORz0KK1BFTkRJTkc9Cit0b3lzIHRveXMvKi8qLmMgfCAoCit3aGlsZSBJRlM9IjoiIHJlYWQgRklMRSBOQU1FCitkbworICBbICIkTkFNRSIgPT0gaGVscCBdICYmIGNvbnRpbnVlCisgIFsgIiROQU1FIiA9PSBpbnN0YWxsIF0gJiYgY29udGludWUKKyAgZWNobyAtZSAiJE5BTUU6ICRGSUxFICouW2NoXSBsaWIvKi5bY2hdXG5cdHNjcmlwdHMvc2luZ2xlLnNoICROQU1FXG4iCisgIGVjaG8gLWUgInRlc3RfJE5BTUU6XG5cdHNjcmlwdHMvdGVzdC5zaCAkTkFNRVxuIgorICBbICIke0ZJTEUvcGVuZGluZy8vfSIgIT0gIiRGSUxFIiBdICYmCisgICAgUEVORElORz0iJFBFTkRJTkcgJE5BTUUiIHx8CisgICAgV09SS0lORz0iJFdPUktJTkcgJE5BTUUiCitkb25lICYmCitlY2hvIC1lICJjbGVhbjo6XG5cdHJtIC1mICRXT1JLSU5HICRQRU5ESU5HIiAmJgorZWNobyAtZSAibGlzdDpcblx0QGVjaG8gJChlY2hvICRXT1JLSU5HIHwgdHIgJyAnICdcbicgfCBzb3J0IHwgeGFyZ3MpIiAmJgorZWNobyAtZSAibGlzdF9wZW5kaW5nOlxuXHRAZWNobyAkKGVjaG8gJFBFTkRJTkcgfCB0ciAnICcgJ1xuJyB8IHNvcnQgfCB4YXJncykiICYmCitlY2hvIC1lICIuUEhPTlk6ICRXT1JLSU5HICRQRU5ESU5HIiB8IHNlZCAncy8gXChbXiBdXCkvIHRlc3RfXDEvZycKKykgPiAuc2luZ2xlbWFrZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvaW5zdGFsbC5jIGIvdG95Ym94L3NjcmlwdHMvaW5zdGFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZmI4NjcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9pbnN0YWxsLmMKQEAgLTAsMCArMSwzNyBAQAorLyogV3JhcHBlciB0byBtYWtlIGluc3RhbGxhdGlvbiBlYXNpZXIgd2l0aCBjcm9zcy1jb21waWxpbmcuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnZW5lcmF0ZWQvY29uZmlnLmgiCisjaW5jbHVkZSAibGliL3RveWZsYWdzLmgiCisKKyNkZWZpbmUgTkVXVE9ZKG5hbWUsIG9wdHMsIGZsYWdzKSB7I25hbWUsIGZsYWdzfSwKKyNkZWZpbmUgT0xEVE9ZKG5hbWUsIG9sZG5hbWUsIGZsYWdzKSB7I25hbWUsIGZsYWdzfSwKKworLy8gUG9wdWxhdGUgdG95X2xpc3RbXS4KKworc3RydWN0IHtjaGFyICpuYW1lOyBpbnQgZmxhZ3M7fSB0b3lfbGlzdFtdID0geworI2luY2x1ZGUgImdlbmVyYXRlZC9uZXd0b3lzLmgiCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBzdGF0aWMgY2hhciAqdG95X3BhdGhzW109eyJ1c3IvIiwiYmluLyIsInNiaW4vIiwwfTsKKyAgaW50IGksIGxlbiA9IDA7CisKKyAgLy8gT3V0cHV0IGxpc3Qgb2YgYXBwbGV0cy4KKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHRveV9saXN0KS9zaXplb2YoKnRveV9saXN0KTsgaSsrKSB7CisgICAgaW50IGZsID0gdG95X2xpc3RbaV0uZmxhZ3M7CisgICAgaWYgKGZsICYgVE9ZTUFTS19MT0NBVElPTikgeworICAgICAgaWYgKGFyZ2M+MSkgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqPTA7IHRveV9wYXRoc1tqXTsgaisrKQorICAgICAgICAgIGlmIChmbCAmICgxPDxqKSkgbGVuICs9IHByaW50ZigiJXMiLCB0b3lfcGF0aHNbal0pOworICAgICAgfQorICAgICAgbGVuICs9IHByaW50ZigiJXNcbiIsdG95X2xpc3RbaV0ubmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvaW5zdGFsbC5zaCBiL3RveWJveC9zY3JpcHRzL2luc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTYxMzQxZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL2luc3RhbGwuc2gKQEAgLTAsMCArMSw5MSBAQAorIyEvYmluL2Jhc2gKKworIyBHcmFiIGRlZmF1bHQgdmFsdWVzIGZvciAkQ0ZMQUdTIGFuZCBzdWNoLgorCitzb3VyY2UgLi9jb25maWd1cmUKKworWyAteiAiJFBSRUZJWCIgXSAmJiBQUkVGSVg9Ii91c3IvdG95Ym94IgorCisjIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKK0xPTkdfUEFUSD0iIgord2hpbGUgWyAhIC16ICIkMSIgXQorZG8KKyAgIyBDcmVhdGUgc3ltbGlua3MgaW5zdGVhZCBvZiBoYXJkbGlua3M/CisgIFsgIiQxIiA9PSAiLS1zeW1saW5rIiBdICYmIExJTktfVFlQRT0iLXMiCisKKyAgIyBVbmluc3RhbGw/CisgIFsgIiQxIiA9PSAiLS11bmluc3RhbGwiIF0gJiYgVU5JTlNUQUxMPVVuaW5zdGFsbAorCisgICMgRGVsZXRlIGRlc3RpbmF0aW9uIGNvbW1hbmQgaWYgaXQgZXhpc3RzPworICBbICIkMSIgPT0gIi0tZm9yY2UiIF0gJiYgRE9fRk9SQ0U9Ii1mIgorCisgICMgVXNlIHssdXNyfS97YmluLHNiaW59IHBhdGhzIGluc3RlYWQgb2YgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk/CisgIFsgIiQxIiA9PSAiLS1sb25nIiBdICYmIExPTkdfUEFUSD0iYmluLyIKKworICBzaGlmdAorZG9uZQorCitlY2hvICJDb21waWxlIGluc3RsaXN0Li4uIgorCiskREVCVUcgJEhPU1RDQyAtSSAuIHNjcmlwdHMvaW5zdGFsbC5jIC1vIGdlbmVyYXRlZC9pbnN0bGlzdCB8fCBleGl0IDEKK0NPTU1BTkRTPSIkKGdlbmVyYXRlZC9pbnN0bGlzdCAkTE9OR19QQVRIKSIKKworZWNobyAiJHtVTklOU1RBTEw6LUluc3RhbGx9IGNvbW1hbmRzLi4uIgorCisjIENvcHkgdG95Ym94IGl0c2VsZgorCitpZiBbIC16ICIkVU5JTlNUQUxMIiBdCit0aGVuCisgIG1rZGlyIC1wICIke1BSRUZJWH0vJHtMT05HX1BBVEh9IiAmJgorICBybSAtZiAiJHtQUkVGSVh9LyR7TE9OR19QQVRIfS90b3lib3giICYmCisgIGNwIHRveWJveCAke1BSRUZJWH0vJHtMT05HX1BBVEh9IHx8IGV4aXQgMQorZWxzZQorICBybSAtZiAiJHtQUkVGSVh9LyR7TE9OR19QQVRIfS90b3lib3giIDI+L2Rldi9udWxsCitmaQorY2QgIiRQUkVGSVgiIHx8IGV4aXQgMQorCisjIE1ha2UgbGlua3MgdG8gdG95Ym94CisKK0VYSVQ9MAorCitmb3IgaSBpbiAkQ09NTUFORFMKK2RvCisgICMgRmlndXJlIG91dCB0YXJnZXQgb2YgbGluaworCisgIGlmIFsgLXogIiRMT05HX1BBVEgiIF0KKyAgdGhlbgorICAgIERPVFBBVEg9IiIKKyAgZWxzZQorICAgICMgQ3JlYXRlIHN1YmRpcmVjdG9yeSBmb3IgY29tbWFuZCB0byBnbyBpbiAoaWYgbmVjZXNzYXJ5KQorCisgICAgRE9UUEFUSD0iJChkaXJuYW1lICIkaSIpIi8KKyAgICBpZiBbIC16ICIkVU5JTlNUQUxMIiBdCisgICAgdGhlbgorICAgICAgbWtkaXIgLXAgIiRET1RQQVRIIiB8fCBleGl0IDEKKyAgICBmaQorCisgICAgaWYgWyAteiAiJExJTktfVFlQRSIgXQorICAgIHRoZW4KKyAgICAgIERPVFBBVEg9ImJpbi8iCisgICAgZWxzZQorICAgICAgaWYgWyAiJERPVFBBVEgiICE9ICIkTE9OR19QQVRIIiBdCisgICAgICB0aGVuCisgICAgICAgICMgRm9yIHN5bWxpbmtzIHdlIG5lZWQgLi4vLi4vYmluIHN0eWxlIHJlbGF0aXZlIHBhdGhzCisgICAgICAgIERPVFBBVEg9IiQoZWNobyAkRE9UUEFUSCB8IHNlZCAtZSAnc0BbXi9dKi9ALi4vQGcnKSIkTE9OR19QQVRICisgICAgICBlbHNlCisgICAgICAgIERPVFBBVEg9IiIKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIENyZWF0ZSBsaW5rCisgIGlmIFsgLXogIiRVTklOU1RBTEwiIF0KKyAgdGhlbgorICAgIGxuICRET19GT1JDRSAkTElOS19UWVBFICR7RE9UUEFUSH10b3lib3ggJGkgfHwgRVhJVD0xCisgIGVsc2UKKyAgICBybSAtZiAkaSB8fCBFWElUPTEKKyAgZmkKK2RvbmUKKworZXhpdCAkRVhJVApkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvbWFrZS5zaCBiL3RveWJveC9zY3JpcHRzL21ha2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTA0MTVlNQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL21ha2Uuc2gKQEAgLTAsMCArMSwzNDAgQEAKKyMhL2Jpbi9iYXNoCisKKyMgR3JhYiBkZWZhdWx0IHZhbHVlcyBmb3IgJENGTEFHUyBhbmQgc3VjaC4KKworZXhwb3J0IExBTkc9YworZXhwb3J0IExDX0FMTD1DCitzZXQgLW8gcGlwZWZhaWwKK3NvdXJjZSAuL2NvbmZpZ3VyZQorCitbIC16ICIkS0NPTkZJR19DT05GSUciIF0gJiYgS0NPTkZJR19DT05GSUc9LmNvbmZpZworWyAteiAiJE9VVE5BTUUiIF0gJiYgT1VUTkFNRT10b3lib3gKK1VOU1RSSVBQRUQ9ImdlbmVyYXRlZC91bnN0cmlwcGVkLyQoYmFzZW5hbWUgIiRPVVROQU1FIikiCisKKyMgU2luY2UgZWFjaCBjYyBpbnZvY2F0aW9uIGlzIHNob3J0LCBsYXVuY2ggaGFsZiBhZ2FpbiBhcyBtYW55IHByb2Nlc3NlcworIyBhcyB3ZSBoYXZlIHByb2Nlc3NvcnMgc28gdGhleSBkb24ndCBleGl0IGZhc3RlciB0aGFuIHdlIGNhbiBzdGFydCB0aGVtLgorWyAteiAiJENQVVMiIF0gJiYKKyAgQ1BVUz0kKCgoJChlY2hvIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVswLTldKiB8IHdjIC13KSozKS8yKSkKKworIyBSZXNwb25kIHRvIFY9IGJ5IGVjaG9pbmcgY29tbWFuZCBsaW5lcyBhcyB3ZWxsIGFzIHJ1bm5pbmcgdGhlbQorRE9UUFJPRz0KK2RvX2xvdWRseSgpCit7CisgIFsgISAteiAiJFYiIF0gJiYgZWNobyAiJEAiIHx8IGVjaG8gLW4gIiRET1RQUk9HIgorICAiJEAiCit9CisKKyMgSXMgYW55dGhpbmcgdW5kZXIgZGlyZWN0b3J5ICQyIG5ld2VyIHRoYW4gZmlsZSAkMQoraXNuZXdlcigpCit7CisgIENIRUNLPSIkMSIKKyAgc2hpZnQKKyAgWyAhIC16ICIkKGZpbmQgIiRAIiAtbmV3ZXIgIiRDSEVDSyIgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMpIiBdCit9CisKK2VjaG8gIkdlbmVyYXRlIGhlYWRlcnMgZnJvbSB0b3lzLyovKi5jLi4uIgorCitta2RpciAtcCBnZW5lcmF0ZWQvdW5zdHJpcHBlZAorCitpZiBpc25ld2VyIGdlbmVyYXRlZC9Db25maWcuaW4gdG95cwordGhlbgorICBlY2hvICJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0b3lzLyouYyBmaWxlcy4uLiIKKyAgc2NyaXB0cy9nZW5jb25maWcuc2gKK2ZpCisKKyMgQ3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIGNvbW1hbmRzIHRveWJveCBjYW4gcHJvdmlkZS4gTm90ZSB0aGF0IHRoZSBmaXJzdAorIyBlbnRyeSBpcyBvdXQgb2Ygb3JkZXIgb24gcHVycG9zZSAodGhlIHRveWJveCBtdWx0aXBsZXhlciBjb21tYW5kIG11c3QgYmUgdGhlCisjIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5KS4gVGhlIHJlc3QgbXVzdCBiZSBzb3J0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCisjIGZvciBmYXN0IGJpbmFyeSBzZWFyY2guCisKK2lmIGlzbmV3ZXIgZ2VuZXJhdGVkL25ld3RveXMuaCB0b3lzCit0aGVuCisgIGVjaG8gLW4gImdlbmVyYXRlZC9uZXd0b3lzLmggIgorCisgIGVjaG8gIlVTRV9UT1lCT1goTkVXVE9ZKHRveWJveCwgTlVMTCwgVE9ZRkxBR19TVEFZUk9PVCkpIiA+IGdlbmVyYXRlZC9uZXd0b3lzLmgKKyAgc2VkIC1uIC1lICdzL15VU0VfW0EtWjAtOV9dKigvJi9wJyB0b3lzLyovKi5jIFwKKwl8IHNlZCAncy9cKC4qVE9ZKFwpXChbXixdKlwpLFwoLipcKS9cMiBcMVwyLFwzLycgfCBzb3J0IC1zIC1rIDEsMSBcCisJfCBzZWQgJ3MvW14gXSogLy8nICA+PiBnZW5lcmF0ZWQvbmV3dG95cy5oIHx8IGV4aXQgMQorZmkKKworWyAhIC16ICIkViIgXSAmJiBlY2hvICJXaGljaCBDIGZpbGVzIHRvIGJ1aWxkLi4uIgorCisjIEV4dHJhY3QgYSBsaXN0IG9mIHRveXMvKi8qLmMgZmlsZXMgdG8gY29tcGlsZSBmcm9tIHRoZSBkYXRhIGluICRLQ09ORklHX0NPTkZJRworIyAoRmlyc3QgY29tbWFuZCBuYW1lcywgdGhlbiBmaWxlbmFtZXMgd2l0aCByZWxldmFudCB7TkVXLE9MRH1UT1koKSBtYWNyby4pCisKK0dJVEhBU0g9IiQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0xMiAyPi9kZXYvbnVsbCkiCitbICEgLXogIiRHSVRIQVNIIiBdICYmIEdJVEhBU0g9Ii1EVE9ZQk9YX1ZFUlNJT049XCIkR0lUSEFTSFwiIgorVE9ZRklMRVM9IiQoc2VkIC1uICdzL15DT05GSUdfXChbXj1dKlwpPS4qL1wxL3AnICIkS0NPTkZJR19DT05GSUciIHwgeGFyZ3MgfCB0ciAnIFtBLVpdJyAnfFthLXpdJykiCitUT1lGSUxFUz0iJChlZ3JlcCAtbCAiVE9ZWyhdKCRUT1lGSUxFUylbICxdIiB0b3lzLyovKi5jKSIKK0NGTEFHUz0iJENGTEFHUyAkKGNhdCBnZW5lcmF0ZWQvY2ZsYWdzKSIKK0JVSUxEPSIkKGVjaG8gJHtDUk9TU19DT01QSUxFfSR7Q0N9ICRDRkxBR1MgLUkgLiAkT1BUSU1JWkUgJEdJVEhBU0gpIgorTElCRklMRVM9IiQobHMgbGliLyouYyB8IGdyZXAgLXYgbGliL2hlbHAuYykiCitUT1lGSUxFUz0ibGliL2hlbHAuYyBtYWluLmMgJFRPWUZJTEVTIgorCitpZiBbICIke1RPWUZJTEVTL3BlbmRpbmcvL30iICE9ICIkVE9ZRklMRVMiIF0KK3RoZW4KKyAgZWNobyAtZSAiXG5cMDMzWzE7MzFtd2FybmluZzogdXNpbmcgdW5maW5pc2hlZCBjb2RlIGZyb20gdG95cy9wZW5kaW5nXDAzM1swbSIKK2ZpCisKK2dlbmJ1aWxkc2goKQoreworICAjIFdyaXRlIGEgY2FubmVkIGJ1aWxkIGxpbmUgZm9yIHVzZSBvbiBjcmlwcGxlZCBidWlsZCBtYWNoaW5lcy4KKworICBlY2hvICIjIS9iaW4vc2giCisgIGVjaG8KKyAgZWNobyAiQlVJTEQ9JyRCVUlMRCciCisgIGVjaG8KKyAgZWNobyAiRklMRVM9JyRMSUJGSUxFUyAkVE9ZRklMRVMnIgorICBlY2hvCisgIGVjaG8gIkxJTks9JyRMSU5LJyIKKyAgZWNobworICBlY2hvCisgIGVjaG8gJyRCVUlMRCAkRklMRVMgJExJTksnCit9CisKK2lmICEgY21wIC1zIDwoZ2VuYnVpbGRzaCB8IGhlYWQgLW4gMykgXAorICAgICAgICAgIDwoaGVhZCAtbiAzIGdlbmVyYXRlZC9idWlsZC5zaCAyPi9kZXYvbnVsbCkKK3RoZW4KKyAgZWNobyAtbiAiTGlicmFyeSBwcm9iZSIKKworICAjIFdlIHRydXN0IC0tYXMtbmVlZGVkIHRvIHJlbW92ZSBlYWNoIGxpYnJhcnkgaWYgd2UgZG9uJ3QgdXNlIGFueSBzeW1ib2xzCisgICMgb3V0IG9mIGl0LCB0aGlzIGxvb3AgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgaGFzIG5vIHdheSB0byBpZ25vcmUgYSBsaWJyYXJ5CisgICMgdGhhdCBkb2Vzbid0IGV4aXN0LCBzbyB3ZSBoYXZlIHRvIGRldGVjdCBhbmQgc2tpcCBub25leGlzdGVudCBsaWJyYXJpZXMKKyAgIyBmb3IgaXQuCisKKyAgPiBnZW5lcmF0ZWQvb3B0bGlicy5kYXQKKyAgZm9yIGkgaW4gdXRpbCBjcnlwdCBtIHJlc29sdiBzZWxpbnV4IHNtYWNrIGF0dHIgcnQgY3J5cHRvCisgIGRvCisgICAgZWNobyAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkge3JldHVybiAwO30iIHwgXAorICAgICR7Q1JPU1NfQ09NUElMRX0ke0NDfSAkQ0ZMQUdTIC14YyAtIC1vIGdlbmVyYXRlZC9saWJwcm9iZSAtV2wsLS1hcy1uZWVkZWQgLWwkaSA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJgorICAgIGVjaG8gLWwkaSA+PiBnZW5lcmF0ZWQvb3B0bGlicy5kYXQKKyAgICBlY2hvIC1uIC4KKyAgZG9uZQorICBybSAtZiBnZW5lcmF0ZWQvbGlicHJvYmUKKyAgZWNobworZmkKKworIyBMSU5LIG5lZWRzIG9wdGxpYnMuZGF0LCBhYm92ZQorCitMSU5LPSIkKGVjaG8gJExET1BUSU1JWkUgJExERkxBR1MgLW8gIiRVTlNUUklQUEVEIiAtV2wsLS1hcy1uZWVkZWQgJChjYXQgZ2VuZXJhdGVkL29wdGxpYnMuZGF0KSkiCitnZW5idWlsZHNoID4gZ2VuZXJhdGVkL2J1aWxkLnNoICYmIGNobW9kICt4IGdlbmVyYXRlZC9idWlsZC5zaCB8fCBleGl0IDEKKworaWYgaXNuZXdlciBnZW5lcmF0ZWQvY29uZmlnLmggIiRLQ09ORklHX0NPTkZJRyIKK3RoZW4KKyAgZWNobyAiTWFrZSBnZW5lcmF0ZWQvY29uZmlnLmggZnJvbSAkS0NPTkZJR19DT05GSUcuIgorCisgICMgVGhpcyBsb25nIGFuZCByb3VuZGFib3V0IHNlZCBpbnZvY2F0aW9uIGlzIHRvIG1ha2Ugb2xkIHZlcnNpb25zIG9mIHNlZAorICAjIGhhcHB5LiBOZXcgb25lcyBoYXZlICdcbicgc28gY2FuIHJlcGxhY2Ugb25lIGxpbmUgd2l0aCB0d28gd2l0aG91dCBhbGwKKyAgIyB0aGUgYnJhbmNoZXMgYW5kIHRlZGlvdXMgbXVja2luZyBhYm91dCB3aXRoIGhvbGQgc3BhY2UuCisKKyAgc2VkIC1uIFwKKyAgICAtZSAncy9eIyBDT05GSUdfXCguKlwpIGlzIG5vdCBzZXQuKi9cMS8nIFwKKyAgICAtZSAndCBub3RzZXQnIFwKKyAgICAtZSAncy9eQ09ORklHX1woLipcKT15LiovXDEvJyBcCisgICAgLWUgJ3QgaXNzZXQnIFwKKyAgICAtZSAncy9eQ09ORklHX1woW149XSpcKT1cKC4qXCkvI2RlZmluZSBDRkdfXDEgXDIvcCcgXAorICAgIC1lICdkJyBcCisgICAgLWUgJzpub3RzZXQnIFwKKyAgICAtZSAnaCcgXAorICAgIC1lICdzLy4qLyNkZWZpbmUgQ0ZHXyYgMC9wJyBcCisgICAgLWUgJ2cnIFwKKyAgICAtZSAncy8uKi8jZGVmaW5lIFVTRV8mKC4uLikvcCcgXAorICAgIC1lICdkJyBcCisgICAgLWUgJzppc3NldCcgXAorICAgIC1lICdoJyBcCisgICAgLWUgJ3MvLiovI2RlZmluZSBDRkdfJiAxL3AnIFwKKyAgICAtZSAnZycgXAorICAgIC1lICdzLy4qLyNkZWZpbmUgVVNFXyYoLi4uKSBfX1ZBX0FSR1NfXy9wJyBcCisgICAgJEtDT05GSUdfQ09ORklHID4gZ2VuZXJhdGVkL2NvbmZpZy5oIHx8IGV4aXQgMQorZmkKKworaWYgWyBnZW5lcmF0ZWQvbWtmbGFncyAtb3Qgc2NyaXB0cy9ta2ZsYWdzLmMgXQordGhlbgorICBkb19sb3VkbHkgJEhPU1RDQyBzY3JpcHRzL21rZmxhZ3MuYyAtbyBnZW5lcmF0ZWQvbWtmbGFncyB8fCBleGl0IDEKK2ZpCisKKyMgUHJvY2VzcyBjb25maWcuaCBhbmQgbmV3dG95cy5oIHRvIGdlbmVyYXRlIEZMQUdfeCBtYWNyb3MuIE5vdGUgd2UgbXVzdAorIyBhbHdheXMgI2RlZmluZSB0aGUgcmVsZXZhbnQgbWFjcm8sIGV2ZW4gd2hlbiBpdCdzIGRpc2FibGVkLCBiZWNhdXNlIHdlCisjIGFsbG93IG11bHRpcGxlIE5FV1RPWSgpIGluIHRoZSBzYW1lIEMgZmlsZS4gKFdoZW4gZGlzYWJsZWQgdGhlIEZMQUcgaXMgMCwKKyMgc28gZmxhZ3MmMCBiZWNvbWVzIGEgY29uc3RhbnQgMCBhbGxvd2luZyBkZWFkIGNvZGUgZWxpbWluYXRpb24uKQorCittYWtlX2ZsYWdzaCgpCit7CisgICMgUGFyc2UgZmlsZXMgdGhyb3VnaCBDIHByZXByb2Nlc3NvciB0d2ljZSwgb25jZSB0byBnZXQgZmxhZ3MgZm9yIGN1cnJlbnQKKyAgIyAuY29uZmlnIGFuZCBvbmNlIHRvIGdldCBmbGFncyBmb3IgYWxseWVzY29uZmlnCisgIGZvciBJIGluIEEgQgorICBkbworICAgICgKKyAgICAjIGRlZmluZSBtYWNyb3MgYW5kIHNlbGVjdCBoZWFkZXIgZmlsZXMgd2l0aCBvcHRpb24gc3RyaW5nIGRhdGEKKworICAgIGVjaG8gIiNkZWZpbmUgTkVXVE9ZKGFhLGJiLGNjKSBhYSAkSSBiYiIKKyAgICBlY2hvICcjZGVmaW5lIE9MRFRPWSguLi4pJworICAgIGlmIFsgIiRJIiA9PSBBIF0KKyAgICB0aGVuCisgICAgICBjYXQgZ2VuZXJhdGVkL2NvbmZpZy5oCisgICAgZWxzZQorICAgICAgc2VkICcvVVNFXy4qKFteKV0qKSQvcy8kLyBfX1ZBX0FSR1NfXy8nIGdlbmVyYXRlZC9jb25maWcuaAorICAgIGZpCisgICAgY2F0IGdlbmVyYXRlZC9uZXd0b3lzLmgKKworICAgICMgUnVuIHJlc3VsdCB0aHJvdWdoIHByZXByb2Nlc3NvciwgZ2x1ZSB0b2dldGhlciAiICIgZ2FwcyBsZWZ0b3ZlciBmcm9tIFVTRQorICAgICMgbWFjcm9zLCBkZWxldGUgY29tbWVudCBsaW5lcywgcHJpbnQgYW55IGxpbmUgd2l0aCBhIHF1b3RlZCBvcHRzdHJpbmcsCisgICAgIyB0dXJuIGFueSBub24tcXVvdGVkIG9wc3RyaW5nIChOVUxMIG9yIDApIGludG8gIiAiIChiZWNhdXNlIGZzY2FuZiBjYW4ndAorICAgICMgaGFuZGxlICIiIHdpdGggbm90aGluZyBpbiBpdCwgYW5kIG1rZmxhZ3MgdXNlcyB0aGF0KS4KKworICAgICkgfCAke0NST1NTX0NPTVBJTEV9JHtDQ30gLUUgLSB8IFwKKyAgICBzZWQgLW4gLWUgJ3MvIiAqIi8vZzsvXiMvZDt0IGNsZWFyOzpjbGVhcjtzLyIvIi9wO3Q7cy9cKCBbQUJdIFwpLiovXDEgIiAiL3AnCisKKyAgIyBTb3J0IHJlc3VsdGluZyBsaW5lIHBhaXJzIGFuZCBnbHVlIHRoZW0gdG9nZXRoZXIgaW50byB0cmlwbGV0cyBvZgorICAjICAgY29tbWFuZCAiZmxhZ3MiICJhbGxmbGFncyIKKyAgIyB0byBmZWVkIGludG8gbWtmbGFncyBDIHByb2dyYW0gdGhhdCBvdXRwdXRzIGFjdHVhbCBmbGFnIG1hY3JvcworICAjIElmIG5vIHBhaXIgKGJlY2F1c2UgY29tbWFuZCdzIGRpc2FibGVkIGluIGNvbmZpZyksIHVzZSAiICIgZm9yIGZsYWdzCisgICMgc28gYWxsZmxhZ3MgY2FuIGRlZmluZSB0aGUgYXBwcm9wcmlhdGUgemVybyBtYWNyb3MuCisKKyAgZG9uZSB8IHNvcnQgLXMgfCBzZWQgLW4gLWUgJ3MvIEEgLyAvO3QgcGFpcjtoO3MvXChbXiBdKlwpLiovXDEgIiAiLzt4JyBcCisgICAgLWUgJ2Igc2luZ2xlOzpwYWlyO2g7bjs6c2luZ2xlO3MvW14gXSogQiAvLztIO2c7cy9cbi8gLztwJyB8IFwKKyAgICB0ZWUgZ2VuZXJhdGVkL2ZsYWdzLnJhdyB8IGdlbmVyYXRlZC9ta2ZsYWdzID4gZ2VuZXJhdGVkL2ZsYWdzLmggfHwgZXhpdCAxCit9CisKK2lmIGlzbmV3ZXIgZ2VuZXJhdGVkL2ZsYWdzLmggdG95cyAiJEtDT05GSUdfQ09ORklHIgordGhlbgorICBlY2hvIC1uICJnZW5lcmF0ZWQvZmxhZ3MuaCAiCisgIG1ha2VfZmxhZ3NoCitmaQorCisjIEV4dHJhY3QgZ2xvYmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhbmQgZmxhZyBkZWZpbml0aW9ucyBmcm9tIHRveXMvKi8qLmMKKworZnVuY3Rpb24gZ2V0Z2xvYmFscygpCit7CisgIGZvciBpIGluIHRveXMvKi8qLmMKKyAgZG8KKyAgICBOQU1FPSIkKGVjaG8gJGkgfCBzZWQgJ3NALiovXCguKlwpXC5jQFwxQCcpIgorICAgIERBVEE9IiQoc2VkIC1uIC1lICcvXkdMT0JBTFMoLywvXikvYiBnb3Q7Yjs6Z290JyBcCisgICAgICAgICAgICAtZSAncy9eR0xPQkFMUygvc3RydWN0ICciJE5BTUUiJ19kYXRhIHsvJyBcCisgICAgICAgICAgICAtZSAncy9eKS99Oy8nIC1lICdwJyAkaSkiCisKKyAgICBbICEgLXogIiREQVRBIiBdICYmIGVjaG8gLWUgIi8vICRpXG5cbiREQVRBXG4iCisgIGRvbmUKK30KKworaWYgaXNuZXdlciBnZW5lcmF0ZWQvZ2xvYmFscy5oIHRveXMKK3RoZW4KKyAgZWNobyAtbiAiZ2VuZXJhdGVkL2dsb2JhbHMuaCAiCisgIEdMT0JTVFJVQ1Q9IiQoZ2V0Z2xvYmFscykiCisgICgKKyAgICBlY2hvICIkR0xPQlNUUlVDVCIKKyAgICBlY2hvCisgICAgZWNobyAiZXh0ZXJuIHVuaW9uIGdsb2JhbF91bmlvbiB7IgorICAgIGVjaG8gIiRHTE9CU1RSVUNUIiB8IFwKKyAgICAgIHNlZCAtbiAncy9zdHJ1Y3QgXCguKlwpX2RhdGEgey8Jc3RydWN0IFwxX2RhdGEgXDE7L3AnCisgICAgZWNobyAifSB0aGlzOyIKKyAgKSA+IGdlbmVyYXRlZC9nbG9iYWxzLmgKK2ZpCisKK2lmIFsgZ2VuZXJhdGVkL21rdGFncyAtb3Qgc2NyaXB0cy9ta3RhZ3MuYyBdCit0aGVuCisgIGRvX2xvdWRseSAkSE9TVENDIHNjcmlwdHMvbWt0YWdzLmMgLW8gZ2VuZXJhdGVkL21rdGFncyB8fCBleGl0IDEKK2ZpCisKK2lmIGlzbmV3ZXIgZ2VuZXJhdGVkL3RhZ3MuaCB0b3lzCit0aGVuCisgIGVjaG8gLW4gImdlbmVyYXRlZC90YWdzLmggIgorCisgIHNlZCAtbiAnL1RBR0dFRF9BUlJBWSgvLC9eKS97cy8uKlRBR0dFRF9BUlJBWVsoXVwoW14sXSpcKSwvXDEvO3B9JyBcCisgICAgdG95cy8qLyouYyBsaWIvKi5jIHwgZ2VuZXJhdGVkL21rdGFncyA+IGdlbmVyYXRlZC90YWdzLmgKK2ZpCisKK2lmIFsgZ2VuZXJhdGVkL2NvbmZpZzJoZWxwIC1vdCBzY3JpcHRzL2NvbmZpZzJoZWxwLmMgXQordGhlbgorICBkb19sb3VkbHkgJEhPU1RDQyBzY3JpcHRzL2NvbmZpZzJoZWxwLmMgLUkgLiBsaWIveHdyYXAuYyBsaWIvbGxpc3QuYyBcCisgICAgbGliL2xpYi5jIGxpYi9wb3J0YWJpbGl0eS5jIC1vIGdlbmVyYXRlZC9jb25maWcyaGVscCB8fCBleGl0IDEKK2ZpCitpZiBpc25ld2VyIGdlbmVyYXRlZC9oZWxwLmggZ2VuZXJhdGVkL0NvbmZpZy5pbgordGhlbgorICBlY2hvICJnZW5lcmF0ZWQvaGVscC5oIgorICBnZW5lcmF0ZWQvY29uZmlnMmhlbHAgQ29uZmlnLmluICRLQ09ORklHX0NPTkZJRyA+IGdlbmVyYXRlZC9oZWxwLmggfHwgZXhpdCAxCitmaQorCitbICEgLXogIiROT0JVSUxEIiBdICYmIGV4aXQgMAorCitlY2hvIC1uICJDb21waWxlIHRveWJveCIKK1sgISAteiAiJFYiIF0gJiYgZWNobworRE9UUFJPRz0uCisKKyMgVGhpcyBpcyBhIHBhcmFsbGVsIHZlcnNpb24gb2Y6IGRvX2xvdWRseSAkQlVJTEQgJEZJTEVTICRMSU5LIHx8IGV4aXQgMQorCisjIEFueSBoZWFkZXJzIG5ld2VyIHRoYW4gdGhlIG9sZGVzdCBnZW5lcmF0ZWQvb2JqIGZpbGU/CitYPSIkKGxzIC0xdCBnZW5lcmF0ZWQvb2JqLyogMj4vZGV2L251bGwgfCB0YWlsIC1uIDEpIgorIyBUT0RPOiByZWRvIHRoaXMKK2lmIFsgISAtZSAiJFgiIF0gfHwgWyAhIC16ICIkKGZpbmQgdG95cyAtbmFtZSAiKi5oIiAtbmV3ZXIgIiRYIikiIF0KK3RoZW4KKyAgcm0gLXJmIGdlbmVyYXRlZC9vYmogJiYgbWtkaXIgLXAgZ2VuZXJhdGVkL29iaiB8fCBleGl0IDEKK2Vsc2UKKyAgcm0gLWYgZ2VuZXJhdGVkL29iai97bWFpbixsaWJfaGVscH0ubyB8fCBleGl0IDEKK2ZpCisKKyMgYnVpbGQgZWFjaCBnZW5lcmF0ZWQvb2JqLyoubyBmaWxlIGluIHBhcmFsbGVsCisKK1BFTkRJTkc9CitMTktGSUxFUz0KK0RPTkU9MAorQ09VTlQ9MAorQ0xJQ0s9CisKK2ZvciBpIGluICRMSUJGSUxFUyBjbGljayAkVE9ZRklMRVMKK2RvCisgIFsgIiRpIiA9PSBjbGljayBdICYmIENMSUNLPTEgJiYgY29udGludWUKKworICBYPSR7aS9saWJcLy9saWJffQorICBYPSR7WCMjKi99CisgIE9VVD0iZ2VuZXJhdGVkL29iai8ke1glJS5jfS5vIgorICBMTktGSUxFUz0iJExOS0ZJTEVTICRPVVQiCisKKyAgIyAkTElCRklMRVMgZG9lc24ndCBuZWVkIHRvIGJlIHJlYnVpbHQgaWYgbmV3ZXIgdGhhbiAuY29uZmlnLCAkVE9ZRklMRVMgZG9lcworCisgIFsgIiRPVVQiIC1udCAiJGkiIF0gJiYgWyAteiAiJENMSUNLIiAtbyAiJE9VVCIgLW50ICIkS0NPTkZJR19DT05GSUciIF0gJiYKKyAgICBjb250aW51ZQorCisgIGRvX2xvdWRseSAkQlVJTEQgLWMgJGkgLW8gJE9VVCAmCisgIFBFTkRJTkc9IiRQRU5ESU5HICQhIgorICBDT1VOVD0kKCgkQ09VTlQrMSkpCisKKyAgIyByYXRlbGltaXQgdG8gJENQVVMgbWFueSBwYXJhbGxlbCBqb2JzLCBkZXRlY3RpbmcgZXJyb3JzCisKKyAgZm9yIGogaW4gJFBFTkRJTkcKKyAgZG8KKyAgICBbICIkQ09VTlQiIC1sdCAiJENQVVMiIF0gJiYgYnJlYWs7CisKKyAgICB3YWl0ICRqCisgICAgRE9ORT0kKCgkRE9ORSskPykpCisgICAgQ09VTlQ9JCgoJENPVU5ULTEpKQorICAgIFBFTkRJTkc9IiR7UEVORElORyMjICRqfSIKKyAgZG9uZQorICBbICRET05FIC1uZSAwIF0gJiYgYnJlYWsKK2RvbmUKKworIyB3YWl0IGZvciBhbGwgYmFja2dyb3VuZCBqb2JzLCBkZXRlY3RpbmcgZXJyb3JzCisKK2ZvciBpIGluICRQRU5ESU5HCitkbworICB3YWl0ICRpCisgIERPTkU9JCgoJERPTkUrJD8pKQorZG9uZQorCitbICRET05FIC1uZSAwIF0gJiYgZXhpdCAxCisKK2RvX2xvdWRseSAkQlVJTEQgJExOS0ZJTEVTICRMSU5LIHx8IGV4aXQgMQoraWYgWyAhIC16ICIkTk9TVFJJUCIgXSB8fAorICAhIGRvX2xvdWRseSAke0NST1NTX0NPTVBJTEV9c3RyaXAgIiRVTlNUUklQUEVEIiAtbyAiJE9VVE5BTUUiCit0aGVuCisgIGVjaG8gInN0cmlwIGZhaWxlZCwgdXNpbmcgdW5zdHJpcHBlZCIgJiYgY3AgIiRVTlNUUklQUEVEIiAiJE9VVE5BTUUiIHx8CisgIGV4aXQgMQorZmkKKworIyBnY2MgNC40J3Mgc3RyaXAgY29tbWFuZCBpcyBidWdneSwgYW5kIGRvZXNuJ3Qgc2V0IHRoZSBleGVjdXRhYmxlIGJpdCBvbgorIyBpdHMgb3V0cHV0IHRoZSB3YXkgU1VTdjQgc3VnZ2VzdHMgaXQgZG8gc28uIFdoaWxlIHdlJ3JlIGF0IGl0LCBtYWtlIHN1cmUKKyMgd2UgZG9uJ3QgaGF2ZSB0aGUgInciIGJpdCBzZXQgc28gdGhpbmdzIGxpa2UgYnppcDIncyAiY3AgLWYiIGluc3RhbGwgZG9uJ3QKKyMgb3ZlcndyaXRlIG91ciBiaW5hcnkgdGhyb3VnaCB0aGUgc3ltbGluay4KK2RvX2xvdWRseSBjaG1vZCA1NTUgIiRPVVROQU1FIiB8fCBleGl0IDEKKworZWNobwpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvbWluaWNvbS5zaCBiL3RveWJveC9zY3JpcHRzL21pbmljb20uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE5YjBkOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL21pbmljb20uc2gKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL2Jhc2gKKworIyBJZiB5b3Ugd2FudCB0byB1c2UgdG95Ym94IG5ldGNhdCB0byB0YWxrIHRvIGEgc2VyaWFsIHBvcnQsIHVzZSB0aGlzLgorCitpZiBbICEgLWMgIiQxIiBdCit0aGVuCisgIGVjaG8gIlVzYWdlOiBtaW5pY29tLnNoIC9kZXYvdHR5UzAiCisgIGV4aXQgMQorZmkKKworU1BFRUQ9IiQyIgorWyAteiAiJFNQRUVEIiBdICYmIFNQRUVEPTExNTIwMAorCitzdHR5ICRTUEVFRCAtRiAiJDEiCitzdHR5IHJhdyAtZWNobyAtY3RsZWNobyAtRiAiJDEiCitzdHR5IHJhdyAtZWNobyAgIyBOZWVkIHRvIGRvIGl0IG9uIHN0ZGluLCB0b28uCisuL3RveWJveCBuZXRjYXQgLWYgIiQxIgorc3R0eSBjb29rZWQgZWNobyAgIyBQdXQgc3RkaW4gYmFjay4KZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL21rZmxhZ3MuYyBiL3RveWJveC9zY3JpcHRzL21rZmxhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWI5MzViCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3NjcmlwdHMvbWtmbGFncy5jCkBAIC0wLDAgKzEsMjIwIEBACisvLyBUYWtlIHRocmVlIHdvcmQgaW5wdXQgbGluZXMgb24gc3RkaW4gKHRoZSB0aHJlZSBzcGFjZSBzZXBhcmF0ZWQgd29yZHMgYXJlCisvLyBjb21tYW5kIG5hbWUsIG9wdGlvbiBzdHJpbmcgd2l0aCBjdXJyZW50IGNvbmZpZywgb3B0aW9uIHN0cmluZyBmcm9tCisvLyBhbGx5ZXNjb25maWc7IHNwYWNlIHNlcGFyYXRlZCwgdGhlIGxhc3QgdHdvIGFyZSBhbmQgZG91YmxlIHF1b3RlcykKKy8vIGFuZCBwcm9kdWNlIGZsYWcgI2RlZmluZXMgdG8gc3Rkb3V0LgorCisvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgY3JhcHB5IGNvZGUgYmVjYXVzZSB3ZSBjb250cm9sIHRoZSBpbnB1dHMuIEl0IGxlYWtzCisvLyBtZW1vcnkgbGlrZSBhIHNpZXZlIGFuZCBzZWdmYXVsdHMgaWYgbWFsbG9jIHJldHVybnMgbnVsbCwgYnV0IGRvZXMgdGhlIGpvYi4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdHJ1Y3QgZmxhZyB7CisgIHN0cnVjdCBmbGFnICpuZXh0OworICBjaGFyICpjb21tYW5kOworICBzdHJ1Y3QgZmxhZyAqbG9wdDsKK307CisKKy8vIHJlcGxhY2UgY2hvcHBlZCBvdXQgVVNFX0JMQUgoKSBzZWN0aW9ucyB3aXRoIGxvdy1hc2NpaSBjaGFyYWN0ZXJzCisvLyBzaG93aW5nIGhvdyBtYW55IGZsYWdzIGdvdCBza2lwcGVkCisKK2NoYXIgKm1hcmtfZ2FwcyhjaGFyICpmbGFncywgY2hhciAqYWxsKQoreworICBjaGFyICpuLCAqbmV3LCBjOworCisgIC8vIFNoZWxsIGZlZWRzIGluICIgIiBmb3IgYmxhbmsgYXJncywgbGVhZGluZyBzcGFjZSBub3QgbWVhbmluZ2Z1bC4KKyAgd2hpbGUgKGlzc3BhY2UoKmZsYWdzKSkgZmxhZ3MrKzsKKyAgd2hpbGUgKGlzc3BhY2UoKmFsbCkpIGFsbCsrOworCisgIG4gPSBuZXcgPSBzdHJkdXAoYWxsKTsKKyAgd2hpbGUgKCphbGwpIHsKKyAgICBpZiAoKmZsYWdzID09ICphbGwpIHsKKyAgICAgICoobmV3KyspID0gKihhbGwrKyk7CisgICAgICAqZmxhZ3MrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGMgPSAqKGFsbCsrKTsKKyAgICBpZiAoc3RyY2hyKCI/Jl4tOiN8QCo7ICIsIGMpKTsKKyAgICBlbHNlIGlmIChzdHJjaHIoIj08PiIsIGMpKSB3aGlsZSAoaXNkaWdpdCgqYWxsKSkgYWxsKys7CisgICAgZWxzZSBpZiAoYyA9PSAnKCcpIHdoaWxlKCooYWxsKyspICE9ICcpJyk7CisgICAgZWxzZSAqKG5ldysrKSA9IDE7CisgIH0KKyAgKm5ldyA9IDA7CisKKyAgcmV0dXJuIG47Cit9CisKKy8vIEJyZWFrIGRvd24gYSBjb21tYW5kIHN0cmluZyBpbnRvIHN0cnVjdCBmbGFnIGxpc3QuCisKK3N0cnVjdCBmbGFnICpkaWdlc3QoY2hhciAqc3RyaW5nKQoreworICBzdHJ1Y3QgZmxhZyAqbGlzdCA9IE5VTEw7CisgIGNoYXIgKmVyciA9IHN0cmluZzsKKworICB3aGlsZSAoKnN0cmluZykgeworICAgIC8vIEdyb3VwcyBtdXN0IGJlIGF0IGVuZC4KKyAgICBpZiAoKnN0cmluZyA9PSAnWycpIGJyZWFrOworCisgICAgLy8gTG9uZ29wdHMKKyAgICBpZiAoKnN0cmluZyA9PSAnKCcpIHsKKyAgICAgIHN0cnVjdCBmbGFnICpuZXcgPSBjYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbGFnKSwgMSk7CisKKyAgICAgIG5ldy0+Y29tbWFuZCA9ICsrc3RyaW5nOworCisgICAgICAvLyBBdHRhY2ggbG9uZ29wdCB0byBwcmV2aW91cyBzaG9ydCBvcHQsIGlmIGFueS4KKyAgICAgIGlmIChsaXN0ICYmIGxpc3QtPmNvbW1hbmQpIHsKKyAgICAgICAgbmV3LT5uZXh0ID0gbGlzdC0+bG9wdDsKKyAgICAgICAgbGlzdC0+bG9wdCA9IG5ldzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCBmbGFnICpibGFuayA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IGZsYWcpLCAxKTsKKworICAgICAgICBibGFuay0+bmV4dCA9IGxpc3Q7CisgICAgICAgIGJsYW5rLT5sb3B0ID0gbmV3OworICAgICAgICBsaXN0ID0gYmxhbms7CisgICAgICB9CisgICAgICAvLyBBbiBlbXB0eSBsb25nb3B0ICgpIHdvdWxkIGJyZWFrIHRoaXMuCisgICAgICB3aGlsZSAoKisrc3RyaW5nICE9ICcpJykgaWYgKCpzdHJpbmcgPT0gJy0nKSAqc3RyaW5nID0gJ18nOworICAgICAgKihzdHJpbmcrKykgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHN0cmNocigiPyZeLTojfEAqOyAiLCAqc3RyaW5nKSkgc3RyaW5nKys7CisgICAgZWxzZSBpZiAoc3RyY2hyKCI9PD4iLCAqc3RyaW5nKSkgeworICAgICAgaWYgKCFpc2RpZ2l0KHN0cmluZ1sxXSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyB3aXRob3V0IG51bWJlciBpbiAnJXMnIiwgKnN0cmluZywgZXJyKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChpc2RpZ2l0KCorK3N0cmluZykpIHsKKyAgICAgICAgaWYgKCFsaXN0KSB7CisgICAgICAgICAgIHN0cmluZysrOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3QgZmxhZyAqbmV3ID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgZmxhZyksIDEpOworCisgICAgICBuZXctPmNvbW1hbmQgPSBzdHJpbmcrKzsKKyAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICBsaXN0ID0gbmV3OworICAgIH0KKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBjaGFyIGNvbW1hbmRbMjU2XSwgZmxhZ3NbMTAyM10sIGFsbGZsYWdzWzEwMjRdOworICBjaGFyICpvdXQsICpvdXRidWYgPSBtYWxsb2MoMTAyNCoxMDI0KTsKKworICAvLyBZZXMsIHRoZSBvdXRwdXQgYnVmZmVyIGlzIDEgbWVnYWJ5dGUgd2l0aCBubyBib3VuZHMgY2hlY2tpbmcuCisgIC8vIFNlZSAiaW50ZW50aW9uYWxseSBjcmFwcHkiLCBhYm92ZS4KKyAgaWYgKCEob3V0ID0gb3V0YnVmKSkgcmV0dXJuIDE7CisKKyAgcHJpbnRmKCIjdW5kZWYgRk9SQ0VEX0ZMQUdcbiN1bmRlZiBGT1JDRURfRkxBR0xMXG4iCisgICAgIiNpZmRlZiBGT1JDRV9GTEFHU1xuI2RlZmluZSBGT1JDRURfRkxBRyAxXG4jZGVmaW5lIEZPUkNFRF9GTEFHTEwgMUxMXG4iCisgICAgIiNlbHNlXG4jZGVmaW5lIEZPUkNFRF9GTEFHIDBcbiNkZWZpbmUgRk9SQ0VEX0ZMQUdMTCAwXG4jZW5kaWZcblxuIik7CisKKyAgZm9yICg7OykgeworICAgIHN0cnVjdCBmbGFnICpmbGlzdCwgKmFmbGlzdCwgKm9mZmxpc3Q7CisgICAgY2hhciAqbWdhcHMgPSAwOworICAgIHVuc2lnbmVkIGJpdDsKKworICAgICpjb21tYW5kID0gKmZsYWdzID0gKmFsbGZsYWdzID0gMDsKKyAgICBiaXQgPSBmc2NhbmYoc3RkaW4sICIlMjU1cyBcIiUxMDIzW15cIl1cIiBcIiUxMDIzW15cIl1cIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgZmxhZ3MsIGFsbGZsYWdzKTsKKworICAgIGlmIChnZXRlbnYoIkRFQlVHIikpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvbW1hbmQ9JXMsIGZsYWdzPSVzLCBhbGxmbGFncz0lc1xuIiwKKyAgICAgICAgY29tbWFuZCwgZmxhZ3MsIGFsbGZsYWdzKTsKKworICAgIGlmICghKmNvbW1hbmQpIGJyZWFrOworICAgIGlmIChiaXQgIT0gMykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGluICVzIChzZWUgZ2VuZXJhdGVkL2ZsYWdzLnJhdylcbiIsIGNvbW1hbmQpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBiaXQgPSAwOworICAgIHByaW50ZigiLy8gJXMgJXMgJXNcbiIsIGNvbW1hbmQsIGZsYWdzLCBhbGxmbGFncyk7CisgICAgaWYgKCpmbGFncyAhPSAnICcpIG1nYXBzID0gbWFya19nYXBzKGZsYWdzLCBhbGxmbGFncyk7CisgICAgZWxzZSBpZiAoKmFsbGZsYWdzICE9ICcgJykgbWdhcHMgPSBhbGxmbGFnczsKKyAgICAvLyBJZiBjb21tYW5kIGRpc2FibGVkLCB1c2UgYWxsZmxhZ3MgZm9yIE9MRFRPWSgpCisgICAgcHJpbnRmKCIjdW5kZWYgT1BUU1RSXyVzXG4jZGVmaW5lIE9QVFNUUl8lcyAiLCBjb21tYW5kLCBjb21tYW5kKTsKKyAgICBpZiAobWdhcHMpIHByaW50ZigiXCIlc1wiXG4iLCBtZ2Fwcyk7CisgICAgZWxzZSBwcmludGYoIjBcbiIpOworICAgIGlmIChtZ2FwcyAhPSBhbGxmbGFncykgZnJlZShtZ2Fwcyk7CisKKyAgICBmbGlzdCA9IGRpZ2VzdChmbGFncyk7CisgICAgb2ZmbGlzdCA9IGFmbGlzdCA9IGRpZ2VzdChhbGxmbGFncyk7CisKKyAgICBwcmludGYoIiNpZmRlZiBDTEVBTlVQXyVzXG4jdW5kZWYgQ0xFQU5VUF8lc1xuI3VuZGVmIEZPUl8lc1xuIiwKKyAgICAgICAgICAgY29tbWFuZCwgY29tbWFuZCwgY29tbWFuZCk7CisKKyAgICB3aGlsZSAob2ZmbGlzdCkgeworICAgICAgc3RydWN0IGZsYWcgKmYgPSBvZmZsaXN0LT5sb3B0OworICAgICAgd2hpbGUgKGYpIHsKKyAgICAgICAgcHJpbnRmKCIjdW5kZWYgRkxBR18lc1xuIiwgZi0+Y29tbWFuZCk7CisgICAgICAgIGYgPSBmLT5uZXh0OworICAgICAgfQorICAgICAgaWYgKG9mZmxpc3QtPmNvbW1hbmQpIHByaW50ZigiI3VuZGVmIEZMQUdfJWNcbiIsICpvZmZsaXN0LT5jb21tYW5kKTsKKyAgICAgIG9mZmxpc3QgPSBvZmZsaXN0LT5uZXh0OworICAgIH0KKyAgICBwcmludGYoIiNlbmRpZlxuXG4iKTsKKworICAgIHNwcmludGYob3V0LCAiI2lmZGVmIEZPUl8lc1xuI2lmbmRlZiBUVFxuI2RlZmluZSBUVCB0aGlzLiVzXG4jZW5kaWZcbiIsCisgICAgICAgICAgICBjb21tYW5kLCBjb21tYW5kKTsKKyAgICBvdXQgKz0gc3RybGVuKG91dCk7CisKKyAgICB3aGlsZSAoYWZsaXN0KSB7CisgICAgICBjaGFyICpsbHN0ciA9IGJpdD4zMSA/ICJMTCIgOiAiIjsKKworICAgICAgLy8gT3V0cHV0IGZsYWcgbWFjcm8gZm9yIGJhcmUgbG9uZ29wdHMKKyAgICAgIGlmIChhZmxpc3QtPmxvcHQpIHsKKyAgICAgICAgaWYgKGZsaXN0ICYmIGZsaXN0LT5sb3B0ICYmCisgICAgICAgICAgICAhc3RyY21wKGZsaXN0LT5sb3B0LT5jb21tYW5kLCBhZmxpc3QtPmxvcHQtPmNvbW1hbmQpKQorICAgICAgICB7CisgICAgICAgICAgc3ByaW50ZihvdXQsICIjZGVmaW5lIEZMQUdfJXMgKDElczw8JWQpXG4iLCBmbGlzdC0+bG9wdC0+Y29tbWFuZCwKKyAgICAgICAgICAgIGxsc3RyLCBiaXQpOworICAgICAgICAgIGZsaXN0LT5sb3B0ID0gZmxpc3QtPmxvcHQtPm5leHQ7CisgICAgICAgIH0gZWxzZSBzcHJpbnRmKG91dCwgIiNkZWZpbmUgRkxBR18lcyAoRk9SQ0VEX0ZMQUclczw8JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhZmxpc3QtPmxvcHQtPmNvbW1hbmQsIGxsc3RyLCBiaXQpOworICAgICAgICBhZmxpc3QtPmxvcHQgPSBhZmxpc3QtPmxvcHQtPm5leHQ7CisgICAgICAgIGlmICghYWZsaXN0LT5jb21tYW5kKSB7CisgICAgICAgICAgYWZsaXN0ID0gYWZsaXN0LT5uZXh0OworICAgICAgICAgIGJpdCsrOworICAgICAgICAgIGlmIChmbGlzdCkgZmxpc3QgPSBmbGlzdC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgLy8gT3V0cHV0IG5vcm1hbCBmbGFnIG1hY3JvCisgICAgICB9IGVsc2UgaWYgKGFmbGlzdC0+Y29tbWFuZCkgeworICAgICAgICBpZiAoZmxpc3QgJiYgZmxpc3QtPmNvbW1hbmQgJiYgKmFmbGlzdC0+Y29tbWFuZCA9PSAqZmxpc3QtPmNvbW1hbmQpIHsKKyAgICAgICAgICBpZiAoYWZsaXN0LT5jb21tYW5kKQorICAgICAgICAgICAgc3ByaW50ZihvdXQsICIjZGVmaW5lIEZMQUdfJWMgKDElczw8JWQpXG4iLCAqYWZsaXN0LT5jb21tYW5kLAorICAgICAgICAgICAgICBsbHN0ciwgYml0KTsKKyAgICAgICAgICBmbGlzdCA9IGZsaXN0LT5uZXh0OworICAgICAgICB9IGVsc2Ugc3ByaW50ZihvdXQsICIjZGVmaW5lIEZMQUdfJWMgKEZPUkNFRF9GTEFHJXM8PCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKmFmbGlzdC0+Y29tbWFuZCwgbGxzdHIsIGJpdCk7CisgICAgICAgIGJpdCsrOworICAgICAgICBhZmxpc3QgPSBhZmxpc3QtPm5leHQ7CisgICAgICB9CisgICAgICBvdXQgKz0gc3RybGVuKG91dCk7CisgICAgfQorICAgIG91dCA9IHN0cGNweShvdXQsICIjZW5kaWZcblxuIik7CisgIH0KKworICBpZiAoZmZsdXNoKDApICYmIGZlcnJvcihzdGRvdXQpKSByZXR1cm4gMTsKKworICBvdXQgPSBvdXRidWY7CisgIHdoaWxlICgqb3V0KSB7CisgICAgaW50IGkgPSB3cml0ZSgxLCBvdXRidWYsIHN0cmxlbihvdXRidWYpKTsKKworICAgIGlmIChpPDApIHJldHVybiAxOworICAgIG91dCArPSBpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvc2NyaXB0cy9ta3N0YXR1cy5weSBiL3RveWJveC9zY3JpcHRzL21rc3RhdHVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxYjMyNWUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9ta3N0YXR1cy5weQpAQCAtMCwwICsxLDEzMSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBDcmVhdGUgc3RhdHVzLmh0bWwKKworaW1wb3J0IHN1YnByb2Nlc3Msc3lzCisKK2RlZiByZWFkaXQoYXJncywgc2hlbGw9RmFsc2UpOgorICByZXQ9e30KKyAgYXJyPVtdCisgIGJsb2I9c3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1zaGVsbCkKKyAgZm9yIGkgaW4gYmxvYi5zdGRvdXQucmVhZCgpLnNwbGl0KCJcbiIpOgorICAgIGlmIG5vdCBpOiBjb250aW51ZQorICAgIGk9aS5zcGxpdCgpCisgICAgdHJ5OiByZXRbaVswXV0uZXh0ZW5kKGlbMTpdKQorICAgIGV4Y2VwdDogcmV0W2lbMF1dPWlbMTpdCisgICAgYXJyLmV4dGVuZChpKQorICByZXR1cm4gcmV0LGFycgorCisjIFJ1biBzZWQgb24gcm9hZG1hcCBhbmQgc291cmNlIHRvIGdldCBjb21tYW5kIGxpc3RzLCBhbmQgcnVuIHRveWJveCB0b28KKyMgVGhpcyBnaXZlcyB1cyBhIGRpY3Rpb25hcnkgb2YgdHlwZXMsIGVhY2ggd2l0aCBhIGxpc3Qgb2YgY29tbWFuZHMKKworcHJpbnQgIkNvbGxlY3RpbmcgZGF0YS4uLiIKKworc3R1ZmYsYmxhaD1yZWFkaXQoWyJzZWQiLCItbiIsICdzLzxzcGFuIGlkPVxcKFthLXpfXSpcXCk+L1xcMSAvO3QgZ29vZDtkOzpnb29kO2g7Omxvb3A7bjtzQDwvc3Bhbj5AQDt0IG91dDtIO2IgbG9vcDs6b3V0O2c7cy9cXG4vIC9nO3AnLCAid3d3L3JvYWRtYXAuaHRtbCIsICJ3d3cvc3RhdHVzLmh0bWwiXSkKK2JsYWgsdG95c3R1ZmY9cmVhZGl0KFsiLi90b3lib3giXSkKK2JsYWgscGVuZGluZz1yZWFkaXQoWyJzZWQgLW4gJ3MvW14gXFx0XS4qVE9ZKFxcKFteLF0qXFwpLC4qL1xcMS9wJyB0b3lzL3BlbmRpbmcvKi5jIl0sIDEpCitibGFoLHZlcnNpb249cmVhZGl0KFsiZ2l0IiwiZGVzY3JpYmUiLCItLXRhZ3MiXSkKKworcHJpbnQgIkFuYWx5emluZy4uLiIKKworIyBDcmVhdGUgcmV2ZXJzZSBtYXBwaW5nczogcmV2ZXJzZVsiY29tbWFuZCJdIGdpdmVzIGxpc3Qgb2YgY2F0ZWdvcmllcyBpdCdzIGluCisKK3JldmVyc2U9e30KK2ZvciBpIGluIHN0dWZmOgorICBmb3IgaiBpbiBzdHVmZltpXToKKyAgICB0cnk6IHJldmVyc2Vbal0uYXBwZW5kKGkpCisgICAgZXhjZXB0OiByZXZlcnNlW2pdPVtpXQorcHJpbnQgImFsbCBjb21tYW5kcz0lcyIgJSBsZW4ocmV2ZXJzZSkKKworIyBSdW4gYSBjb3VwbGUgc2FuaXR5IGNoZWNrcyBvbiBpbnB1dAorCitmb3IgaSBpbiB0b3lzdHVmZjoKKyAgaWYgKGkgaW4gcGVuZGluZyk6IHByaW50ICJiYXJmICVzIiAlIGkKKwordW5rbm93bnM9W10KK2ZvciBpIGluIHRveXN0dWZmICsgcGVuZGluZzoKKyAgaWYgbm90IGkgaW4gcmV2ZXJzZTogdW5rbm93bnMuYXBwZW5kKGkpCisKK2lmIHVua25vd25zOiBwcmludCAidW5jYXRlZ29yaXplZDogJXMiICUgIiAiLmpvaW4odW5rbm93bnMpCisKK2NvbnYgPSBbKCJwb3NpeCIsICc8YSBocmVmPSJodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvJXMuaHRtbCI+JSVzPC9hPicsICJbJXNdIiksCisgICAgICAgICgibHNiIiwgJzxhIGhyZWY9Imh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvJXMuaHRtbCI+JSVzPC9hPicsICcmbHQ7JXMmZ3Q7JyksCisgICAgICAgICgiZGV2ZWxvcG1lbnQiLCAnPGEgaHJlZj0iaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzEvJXMiPiUlczwvYT4nLCAnKCVzKScpLAorICAgICAgICAoInRvb2xib3giLCAiIiwgJ3slc30nKSwgKCJrbGliY19jbWQiLCAiIiwgJz0lcz0nKSwKKyAgICAgICAgKCJzYXNoX2NtZCIsICIiLCAnIyVzIycpLCAoInNiYXNlX2NtZCIsICIiLCAnQCVzQCcpLAorICAgICAgICAoImJlYXN0aWVib3hfY21kIiwgIiIsICcqJXMqJyksICgidGl6ZW4iLCAiIiwgJyQlcyQnKSwKKyAgICAgICAgKCJzaGVsbCIsICIiLCAiJSUlcyUlIiksCisgICAgICAgICgicmVxdWVzdCIsICc8YSBocmVmPSJodHRwOi8vbGludXguZGllLm5ldC9tYW4vMS8lcyI+JSVzPC9hPicsICcrJXMrJyldCisKKworZGVmIGNhdGVnb3JpemUocmV2ZXJzZSwgaSwgc2tpcHB5PSIiKToKKyAgbGlua3kgPSAiJXMiCisgIG91dCA9IGkKKworICBpZiBza2lwcHk6IHR5cGVzID0gZmlsdGVyKGxhbWJkYSBhOiBhICE9IHNraXBweSwgcmV2ZXJzZVtpXSkKKyAgZWxzZTogdHlwZXMgPSByZXZlcnNlW2ldCisKKyAgZm9yIGogaW4gY29udjoKKyAgICBpZiBqWzBdIGluIHR5cGVzOgorICAgICAgaWYgalsxXTogbGlua3kgPSBqWzFdICUgaQorICAgICAgb3V0ID0galsyXSAlIG91dAorICAgICAgaWYgbm90IHNraXBweTogYnJlYWsKKyAgaWYgKG5vdCBza2lwcHkpIGFuZCBvdXQgPT0gaToKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJ1bmtub3duICVzICVzXG4iICUgKGkscmV2ZXJzZVtpXSkpCisKKyAgcmV0dXJuIGxpbmt5ICUgb3V0CisKKyMgU29ydC9hbm5vdGF0ZSBkb25lLCBwZW5kaW5nLCBhbmQgdG9kbyBpdGVtIGxpc3RzCisKK2FsbGNtZD1bXQorZG9uZT1bXQorcGVuZD1bXQordG9kbz1bXQorYmxhaD1saXN0KHJldmVyc2UpCitibGFoLnNvcnQoKQorZm9yIGkgaW4gYmxhaDoKKyAgb3V0PWNhdGVnb3JpemUocmV2ZXJzZSwgaSkKKyAgYWxsY21kLmFwcGVuZChvdXQpCisgIGlmIGkgaW4gdG95c3R1ZmYgb3IgaSBpbiBwZW5kaW5nOgorICAgIGlmIGkgaW4gdG95c3R1ZmY6IGRvbmUuYXBwZW5kKG91dCkKKyAgICBlbHNlOiBwZW5kLmFwcGVuZChvdXQpCisgICAgb3V0PSc8c3RyaWtlPiVzPC9zdHJpa2U+JyAlIG91dAorICBlbHNlOiB0b2RvLmFwcGVuZChvdXQpCisKK3ByaW50ICJpbXBsZW1lbnRlZD0lcyIgJSBsZW4odG95c3R1ZmYpCisKKyMgV3JpdGUgZGF0YSB0byBvdXRwdXQgZmlsZQorCitvdXRmaWxlPW9wZW4oInd3dy9zdGF0dXMuZ2VuIiwgInciKQorb3V0ZmlsZS53cml0ZSgiPGgxPlN0YXR1cyBvZiB0b3lib3ggJXM8L2gxPlxuIiAlIHZlcnNpb25bMF0pOworb3V0ZmlsZS53cml0ZSgiPGgzPkxlZ2VuZDogW3Bvc2l4XSAmbHQ7bHNiJmd0OyAoZGV2ZWxvcG1lbnQpIHthbmRyb2lkfVxuIikKK291dGZpbGUud3JpdGUoIj1rbGliYz0gI3Nhc2gjIEBzYmFzZUAgKmJlYXN0aWVib3gqICR0aXplbiQgJXNoZWxsJSArcmVxdWVzdCsgb3RoZXJcbiIpCitvdXRmaWxlLndyaXRlKCI8c3RyaWtlPnBlbmRpbmc8L3N0cmlrZT48L2gzPlxuIik7CisKK291dGZpbGUud3JpdGUoIjxhIG5hbWU9ZG9uZT48aDI+PGEgaHJlZj0jZG9uZT5Db21wbGV0ZWQ8L2E+PC9oMj48YmxvY2txdW90ZT48cD4lczwvcD48L2Jsb2NrcXVvdGU+XG4iICUgIlxuIi5qb2luKGRvbmUpKQorb3V0ZmlsZS53cml0ZSgiPGEgbmFtZT1wYXJ0PjxoMj48YSBocmVmPSNwYXJ0PlBhcnRpYWxseSBpbXBsZW1lbnRlZDwvYT48L2gyPjxibG9ja3F1b3RlPjxwPiVzPC9wPjwvYmxvY2txdW90ZT5cbiIgJSAiXG4iLmpvaW4ocGVuZCkpCitvdXRmaWxlLndyaXRlKCI8YSBuYW1lPXRvZG8+PGgyPjxhIGhyZWY9I3RvZG8+Tm90IHN0YXJ0ZWQgeWV0PC9hPjwvaDI+PGJsb2NrcXVvdGU+PHA+JXM8L3A+PC9ibG9ja3F1b3RlPlxuIiAlICJcbiIuam9pbih0b2RvKSkKKworIyBPdXRwdXQgdW5maW5pc2hlZCBjb21tYW5kcyBieSBjYXRlZ29yeQorCitvdXRmaWxlLndyaXRlKCI8aHI+PGgyPkNhdGVnb3JpZXMgb2YgcmVtYWluaW5nIHRvZG8gaXRlbXM8L2gyPiIpCisKK2ZvciBpIGluIHN0dWZmOgorICB0b2RvID0gW10KKworICBmb3IgaiBpbiBzdHVmZltpXToKKyAgICBpZiBqIGluIHRveXN0dWZmOiBjb250aW51ZQorICAgIGlmIGogaW4gcGVuZGluZzogdG9kby5hcHBlbmQoJzxzdHJpa2U+JXM8L3N0cmlrZT4nICUgaikKKyAgICBlbHNlOiB0b2RvLmFwcGVuZChjYXRlZ29yaXplKHJldmVyc2UsaixpKSkKKworICBpZiB0b2RvOgorICAgIGsgPSBpCisgICAgZm9yIGogaW4gY29udjoKKyAgICAgIGlmIGpbMF0gPT0gaToKKyAgICAgICAgayA9IGpbMl0gJSBpCisKKyAgICBvdXRmaWxlLndyaXRlKCI8YSBuYW1lPSVzPjxoMj48YSBocmVmPSMlcz4lczxhPjwvaDI+PGJsb2NrcXVvdGU+PHA+IiAlIChpLGksaykpCisgICAgb3V0ZmlsZS53cml0ZSgiICIuam9pbih0b2RvKSkKKyAgICBvdXRmaWxlLndyaXRlKCI8L3A+PC9ibG9ja3F1b3RlPlxuIikKKworb3V0ZmlsZS53cml0ZSgiPGhyPjxhIG5hbWU9YWxsPjxoMj48YSBocmVmPSNhbGw+QWxsIGNvbW1hbmRzIHRvZ2V0aGVyIGluIG9uZSBiaWcgbGlzdDwvYT48L2gyPjxibG9ja3F1b3RlPjxwPiVzPC9wPjwvYmxvY2txdW90ZT5cbiIgJSAiXG4iLmpvaW4oYWxsY21kKSkKZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL21rdGFncy5jIGIvdG95Ym94L3NjcmlwdHMvbWt0YWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyM2NmMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC9zY3JpcHRzL21rdGFncy5jCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb2Nlc3MgVEFHR0VEX0FSUkFZKCkgbWFjcm9zIHRvIGVtaXQgVEFHX1NUUklORyBpbmRleCBtYWNyb3MuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgKnRhZyA9IDA7CisgIGludCBpZHggPSAwOworCisgIGZvciAoOzspIHsKKyAgICBjaGFyICpsaW5lID0gMCwgKnM7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBsZW4gPSBnZXRsaW5lKCZsaW5lLCAmbGVuLCBzdGRpbik7CisgICAgaWYgKGxlbjwwKSBicmVhazsKKyAgICB3aGlsZSAobGVuICYmIGlzc3BhY2UobGluZVtsZW4tMV0pKSBsaW5lWy0tbGVuXT0wOworCisgICAgLy8gVmVyeSBzaW1wbGUgcGFyc2VyOiBJZiB3ZSBoYXZlbid0IGdvdCBhIFRBRyB0aGVuIGZpcnN0IGxpbmUgaXMgVEFHLgorICAgIC8vIFRoZW4gbG9vayBmb3IgeyBmb2xsb3dlZCBieSAic3RyIiAobXVzdCBiZSBvbiBzYW1lIGxpbmUsIG1heSBoYXZlCisgICAgLy8gbW9yZSB0aGFuIG9uZSBwZXIgbGluZSksIGZvciBlYWNoIG9uZSBlbWl0ICNkZWZpbmUuIEN1cnJlbnQgVEFHIGVuZGVkCisgICAgLy8gYnkgKSBhdCBzdGFydCBvZiBsaW5lLgorCisgICAgaWYgKCF0YWcpIHsKKyAgICAgIGlmICghaXNhbHBoYSgqbGluZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgdGFnICVzXG4iLCBsaW5lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIHRhZyA9IHN0cmR1cChsaW5lKTsKKyAgICAgIGlkeCA9IDA7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZvciAocyA9IGxpbmU7IGlzc3BhY2UoKnMpOyBzKyspOworICAgIGlmICgqcyA9PSAnKScpIHRhZyA9IDA7CisgICAgZWxzZSBmb3IgKDs7KSB7CisgICAgICBjaGFyICpzdGFydDsKKworICAgICAgd2hpbGUgKCpzICYmICpzICE9ICd7JykgcysrOworICAgICAgd2hpbGUgKCpzICYmICpzICE9ICciJykgcysrOworICAgICAgaWYgKCEqcykgYnJlYWs7CisKKyAgICAgIHN0YXJ0ID0gKytzOworICAgICAgd2hpbGUgKCpzICYmICpzICE9ICciJykgeworICAgICAgICBpZiAoIWlzYWxwaGEoKnMpICYmICFpc2RpZ2l0KCpzKSkgKnMgPSAnXyc7CisgICAgICAgIHMrKzsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiI2RlZmluZSAlc18lKi4qcyAlZFxuIiwgdGFnLCAtNDAsIChpbnQpKHMtc3RhcnQpLCBzdGFydCwgaWR4KTsKKyAgICAgIHByaW50ZigiI2RlZmluZSBfJXNfJSouKnMgKDElczw8JWQpXG4iLCB0YWcsIC0zOSwgKGludCkocy1zdGFydCksIHN0YXJ0LAorICAgICAgICBpZHg+MzEgPyAiTEwiOiAiIiwgaWR4KTsKKyAgICAgIGlkeCsrOworICAgIH0KKyAgICBmcmVlKGxpbmUpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvc2NyaXB0cy9ydW50ZXN0LnNoIGIvdG95Ym94L3NjcmlwdHMvcnVudGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I4MmYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3NjcmlwdHMvcnVudGVzdC5zaApAQCAtMCwwICsxLDE3NCBAQAorIyBTaW1wbGUgdGVzdCBoYXJuZXNzIGluZnJhc3RydWN0dXJlCisjCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5CisKKyMgVGhpcyBmaWxlIGRlZmluZXMgdHdvIGZ1bmN0aW9ucywgInRlc3RpbmciIGFuZCAib3B0aW9uZmxhZyIKKworIyBUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBlbmFibGUgb3B0aW9uYWwgYmVoYXZpb3IgaW4gInRlc3RpbmciOgorIyAgICBERUJVRyAtIFNob3cgZXZlcnkgY29tbWFuZCBydW4gYnkgdGVzdCBzY3JpcHQuCisjICAgIFZFUkJPU0UgLSBQcmludCB0aGUgZGlmZiAtdSBvZiBlYWNoIGZhaWxlZCB0ZXN0IGNhc2UuCisjICAgICAgICAgICAgICBJZiBlcXVhbCB0byAiZmFpbCIsIHN0b3AgYWZ0ZXIgZmlyc3QgZmFpbGVkIHRlc3QuCisjICAgIFNLSVAgLSBkbyBub3QgcGVyZm9ybSB0aGlzIHRlc3QgKHRoaXMgaXMgc2V0IGJ5ICJvcHRpb25mbGFnIikKKyMKKyMgVGhlICJ0ZXN0aW5nIiBmdW5jdGlvbiB0YWtlcyBmaXZlIGFyZ3VtZW50czoKKyMJJDEpIERlc2NyaXB0aW9uIHRvIGRpc3BsYXkgd2hlbiBydW5uaW5nIGNvbW1hbmQKKyMJJDIpIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gY29tbWFuZAorIwkkMykgRXhwZWN0ZWQgcmVzdWx0IChvbiBzdGRvdXQpCisjCSQ0KSBEYXRhIHdyaXR0ZW4gdG8gZmlsZSAiaW5wdXQiCisjCSQ1KSBEYXRhIHdyaXR0ZW4gdG8gc3RkaW4KKyMKKyMgVGhlIGV4aXQgdmFsdWUgb2YgdGVzdGluZyBpcyB0aGUgZXhpdCB2YWx1ZSBvZiB0aGUgY29tbWFuZCBpdCByYW4uCisjCisjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiRkFJTENPVU5UIiBjb250YWlucyBhIGN1bXVsYXRpdmUgdG90YWwgb2YgdGhlCisjIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisKKyMgVGhlICJvcHRpb25hbCIgZnVuY3Rpb24gaXMgdXNlZCB0byBza2lwIGNlcnRhaW4gdGVzdHMsIGFsYToKKyMgICBvcHRpb25mbGFnIENGR19USElOR1kKKyMKKyMgVGhlICJvcHRpb25hbCIgZnVuY3Rpb24gY2hlY2tzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiT1BUSU9ORkxBR1MiLAorIyB3aGljaCBpcyBlaXRoZXIgZW1wdHkgKGluIHdoaWNoIGNhc2UgaXQgYWx3YXlzIGNsZWFycyBTS0lQKSBvcgorIyBlbHNlIGNvbnRhaW5zIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZXMgKGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uCisjIGNsZWFycyBTS0lQIGlmIHRoZSBmbGFnIHdhcyBmb3VuZCwgb3Igc2V0cyBpdCB0byAxIGlmIHRoZSBmbGFnIHdhcyBub3QgZm91bmQpLgorCitleHBvcnQgRkFJTENPVU5UPTAKK2V4cG9ydCBTS0lQPQorCisjIEhlbHBlciBmdW5jdGlvbnMKKworIyBDaGVjayBjb25maWcgdG8gc2VlIGlmIG9wdGlvbiBpcyBlbmFibGVkLCBzZXQgU0tJUCBpZiBub3QuCisKK1NIT1dQQVNTPVBBU1MKK1NIT1dGQUlMPUZBSUwKK1NIT1dTS0lQPVNLSVAKKworaWYgdHR5IC1zIDwmMQordGhlbgorICBTSE9XUEFTUz0iJChlY2hvIC1lICJcMDMzWzE7MzJtJHtTSE9XUEFTU31cMDMzWzBtIikiCisgIFNIT1dGQUlMPSIkKGVjaG8gLWUgIlwwMzNbMTszMW0ke1NIT1dGQUlMfVwwMzNbMG0iKSIKKyAgU0hPV1NLSVA9IiQoZWNobyAtZSAiXDAzM1sxOzMzbSR7U0hPV1NLSVB9XDAzM1swbSIpIgorZmkKKworb3B0aW9uYWwoKQoreworICBvcHRpb249YGVjaG8gIiRPUFRJT05GTEFHUyIgfCBlZ3JlcCAiKF58OikkMSg6fFwkKSJgCisgICMgTm90IHNldD8KKyAgaWYgWyAteiAiJDEiIF0gfHwgWyAteiAiJE9QVElPTkZMQUdTIiBdIHx8IFsgJHsjb3B0aW9ufSAtbmUgMCBdCisgIHRoZW4KKyAgICBTS0lQPSIiCisgICAgcmV0dXJuCisgIGZpCisgIFNLSVA9MQorfQorCisjIFRoZSB0ZXN0aW5nIGZ1bmN0aW9uCisKK3Rlc3RpbmcoKQoreworICBOQU1FPSIkQ01ETkFNRSAkMSIKKyAgWyAteiAiJDEiIF0gJiYgTkFNRT0kMgorCisgIGlmIFsgJCMgLW5lIDUgXQorICB0aGVuCisgICAgZWNobyAiVGVzdCAkTkFNRSBoYXMgdGhlIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKCQjICQqKSIgPiYyCisgICAgZXhpdAorICBmaQorCisgIFsgLW4gIiRERUJVRyIgXSAmJiBzZXQgLXgKKworICBpZiBbIC1uICIkU0tJUCIgXSB8fCAoIFsgLW4gIiRTS0lQX0hPU1QiIF0gJiYgWyAtbiAiJFRFU1RfSE9TVCIgXSkKKyAgdGhlbgorICAgIFsgISAteiAiJFZFUkJPU0UiIF0gJiYgZWNobyAiJFNIT1dTS0lQOiAkTkFNRSIKKyAgICByZXR1cm4gMAorICBmaQorCisgIGVjaG8gLW5lICIkMyIgPiBleHBlY3RlZAorICBlY2hvIC1uZSAiJDQiID4gaW5wdXQKKyAgZWNobyAtbmUgIiQ1IiB8ICR7RVZBTDotZXZhbH0gIiQyIiA+IGFjdHVhbAorICBSRVRWQUw9JD8KKworICAjIENhdGNoIHNlZ2ZhdWx0cworICBbICRSRVRWQUwgLWd0IDEyOCBdICYmIFsgJFJFVFZBTCAtbHQgMjU1IF0gJiYKKyAgICBlY2hvICJleGl0ZWQgd2l0aCBzaWduYWwgKG9yIHJldHVybmVkICRSRVRWQUwpIiA+PiBhY3R1YWwKKyAKKyAgRElGRj0iJChkaWZmIC1hdSR7Tk9TUEFDRTorYn0gZXhwZWN0ZWQgYWN0dWFsKSIKKyAgaWYgWyAhIC16ICIkRElGRiIgXQorICB0aGVuCisgICAgRkFJTENPVU5UPSRbJEZBSUxDT1VOVCsxXQorICAgIGVjaG8gIiRTSE9XRkFJTDogJE5BTUUiCisgICAgaWYgWyAtbiAiJFZFUkJPU0UiIF0KKyAgICB0aGVuCisgICAgICBbICEgLXogIiQ0IiBdICYmIGVjaG8gImVjaG8gLW5lIFwiJDRcIiA+IGlucHV0IgorICAgICAgZWNobyAiZWNobyAtbmUgJyQ1JyB8JEVWQUwgJDIiCisgICAgICBlY2hvICIkRElGRiIKKyAgICAgIFsgIiRWRVJCT1NFIiA9PSBmYWlsIF0gJiYgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRTSE9XUEFTUzogJE5BTUUiCisgIGZpCisgIHJtIC1mIGlucHV0IGV4cGVjdGVkIGFjdHVhbAorCisgIFsgLW4gIiRERUJVRyIgXSAmJiBzZXQgK3gKKworICByZXR1cm4gJFJFVFZBTAorfQorCisjIFJlY3Vyc2l2ZWx5IGdyYWIgYW4gZXhlY3V0YWJsZSBhbmQgYWxsIHRoZSBsaWJyYXJpZXMgbmVlZGVkIHRvIHJ1biBpdC4KKyMgU291cmNlIHBhdGhzIGJlZ2lubmluZyB3aXRoIC8gd2lsbCBiZSBjb3BpZWQgaW50byBkZXN0cGF0aCwgb3RoZXJ3aXNlCisjIHRoZSBmaWxlIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSB0aGVyZSBhbmQgb25seSBpdHMgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgYXJlIGNvcGllZC4KKworbWtjaHJvb3QoKQoreworICBbICQjIC1sdCAyIF0gJiYgcmV0dXJuCisKKyAgZWNobyAtbiAuCisKKyAgZGVzdD0kMQorICBzaGlmdAorICBmb3IgaSBpbiAiJEAiCisgIGRvCisgICAgWyAiJHtpOjA6MX0iID09ICIvIiBdIHx8IGk9JCh3aGljaCAkaSkKKyAgICBbIC1mICIkZGVzdC8kaSIgXSAmJiBjb250aW51ZQorICAgIGlmIFsgLWUgIiRpIiBdCisgICAgdGhlbgorICAgICAgZD1gZWNobyAiJGkiIHwgZ3JlcCAtbyAnLiovJ2AgJiYKKyAgICAgIG1rZGlyIC1wICIkZGVzdC8kZCIgJiYKKyAgICAgIGNhdCAiJGkiID4gIiRkZXN0LyRpIiAmJgorICAgICAgY2htb2QgK3ggIiRkZXN0LyRpIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIk5vdCBmb3VuZDogJGkiCisgICAgZmkKKyAgICBta2Nocm9vdCAiJGRlc3QiICQobGRkICIkaSIgfCBlZ3JlcCAtbyAnLy4qICcpCisgIGRvbmUKK30KKworIyBTZXQgdXAgYSBjaHJvb3QgZW52aXJvbm1lbnQgYW5kIHJ1biBjb21tYW5kcyB3aXRoaW4gaXQuCisjIE5lZWRlZCBjb21tYW5kcyBsaXN0ZWQgb24gY29tbWFuZCBsaW5lCisjIFNjcmlwdCBmZWQgdG8gc3RkaW4uCisKK2RvY2hyb290KCkKK3sKKyAgbWtkaXIgdG1wZGlyNGNocm9vdAorICBtb3VudCAtdCByYW1mcyB0bXBkaXI0Y2hyb290IHRtcGRpcjRjaHJvb3QKKyAgbWtkaXIgLXAgdG1wZGlyNGNocm9vdC97ZXRjLHN5cyxwcm9jLHRtcCxkZXZ9CisgIGNwIC1MIHRlc3Rpbmcuc2ggdG1wZGlyNGNocm9vdAorCisgICMgQ29weSB1dGlsaXRpZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisKKyAgZWNobyAtbiAiU2V0dXAgY2hyb290IgorICBta2Nocm9vdCB0bXBkaXI0Y2hyb290ICQqCisgIGVjaG8KKworICBta25vZCB0bXBkaXI0Y2hyb290L2Rldi90dHkgYyA1IDAKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvbnVsbCBjIDEgMworICBta25vZCB0bXBkaXI0Y2hyb290L2Rldi96ZXJvIGMgMSA1CisKKyAgIyBDb3B5IHNjcmlwdCBmcm9tIHN0ZGluCisKKyAgY2F0ID4gdG1wZGlyNGNocm9vdC90ZXN0LnNoCisgIGNobW9kICt4IHRtcGRpcjRjaHJvb3QvdGVzdC5zaAorICBjaHJvb3QgdG1wZGlyNGNocm9vdCAvdGVzdC5zaAorICB1bW91bnQgLWwgdG1wZGlyNGNocm9vdAorICBybWRpciB0bXBkaXI0Y2hyb290Cit9CisKZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL3Nob3dhc20gYi90b3lib3gvc2NyaXB0cy9zaG93YXNtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc1YTZlZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9zaG93YXNtCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKKyMgRHVtYiBsaXR0bGUgdXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgdGhlIGFzc2VtYmx5IGR1bXAgb2YgYSBzaW5nbGUKKyMgZnVuY3Rpb24sIG9yIGxpc3QgdGhlIGZ1bmN0aW9ucyBzbyBkdW1wYWJsZSBpbiBhbiBleGVjdXRhYmxlLiAgWW91J2QgdGhpbmsKKyMgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gZ2V0IG9iamR1bXAgdG8gZG8gdGhpcywgYnV0IEkgY2FuJ3QgZmluZCBpdC4KKworWyAkIyAtbHQgMSBdIHx8IFsgJCMgLWd0IDIgXSAmJiB7IGVjaG8gInVzYWdlOiBzaG93YXNtIGZpbGUgZnVuY3Rpb24iOyBleGl0IDE7IH0KKworWyAhIC1mICQxIF0gJiYgeyBlY2hvICJGaWxlICQxIG5vdCBmb3VuZCI7IGV4aXQgMTsgfQorCitpZiBbICQjIC1lcSAxIF0KK3RoZW4KKyAgb2JqZHVtcCAtZCAkMSB8IHNlZCAtbiAtZSAncy9eWzAtOWEtZkEtRl0qIDxcKC4qXCk+OiQvXDEvcCcKKyAgZXhpdCAwCitmaQorCitvYmpkdW1wIC1kICQxIHwgc2VkIC1uIC1lICcvLi97SDskIWR9JyAtZSAieDsvXi5bMC05YS1mQS1GXSogPCQyPjovcCIKKwpkaWZmIC0tZ2l0IGEvdG95Ym94L3NjcmlwdHMvc2luZ2xlLnNoIGIvdG95Ym94L3NjcmlwdHMvc2luZ2xlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhZGIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy9zaW5nbGUuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKworIyBCdWlsZCBhIHN0YW5kYWxvbmUgdG95Ym94IGNvbW1hbmQKKworaWYgWyAteiAiJDEiIF0KK3RoZW4KKyAgZWNobyAidXNhZ2U6IHNpbmdsZS5zaCBjb21tYW5kLi4uIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIEhhcnZlc3QgVE9ZQk9YXyogc3ltYm9scyBmcm9tIC5jb25maWcKK2lmIFsgISAtZSAuY29uZmlnIF0KK3RoZW4KKyAgZWNobyAiTmVlZCAuY29uZmlnIGZvciB0b3lib3ggZ2xvYmFsIHNldHRpbmdzLiBSdW4gZGVmY29uZmlnL21lbnVjb25maWcuIiA+JjIKKyAgZXhpdCAxCitmaQorCitleHBvcnQgS0NPTkZJR19DT05GSUc9LnNpbmdsZWNvbmZpZworZm9yIGkgaW4gIiRAIgorZG8KKyAgZWNobyAtbiAiJGk6IgorICBUT1lGSUxFPSIkKGVncmVwIC1sICJUT1lbKF0oJGkpWyAsXSIgdG95cy8qLyouYykiCisKKyAgaWYgWyAteiAiJFRPWUZJTEUiIF0KKyAgdGhlbgorICAgIGVjaG8gIlVua25vd24gY29tbWFuZCAnJGknIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKworICAjIEVuYWJsZSBzdHVmZiB0aGlzIGNvbW1hbmQgZGVwZW5kcyBvbgorICBERVBFTkRTPSIkKHNlZCAtbiAiL15jb25maWcgKiRpIickLywvXiQve3MvXlsgXHRdKmRlcGVuZHMgb24gLy87VDtzL1shXVtBLVowLTlfXSovL2c7cy8gKiYmICovfC9nO3B9JyAkVE9ZRklMRSB8IHhhcmdzIHwgdHIgJyAnICd8JykiCisKKyAgTkFNRT0kKGVjaG8gJGkgfCB0ciBhLXotIEEtWl8pCisgIG1ha2UgYWxsbm9jb25maWcgPiAvZGV2L251bGwgJiYKKyAgc2VkIC1yaSAtZSAnL0NPTkZJR19UT1lCT1gvZCcgXAorICAgIC1lICJzLyMgKENPTkZJR18oJE5BTUV8JHtOQU1FfV8uKiR7REVQRU5EUzorfCRERVBFTkRTfSkpIGlzIG5vdCBzZXQvXDE9eS8iIFwKKyAgICAiJEtDT05GSUdfQ09ORklHIiAmJgorICBlY2hvICIjIENPTkZJR19UT1lCT1ggaXMgbm90IHNldCIgPj4gIiRLQ09ORklHX0NPTkZJRyIgJiYKKyAgZ3JlcCAiQ09ORklHX1RPWUJPWF8iIC5jb25maWcgPj4gIiRLQ09ORklHX0NPTkZJRyIgJiYKKworICBybSAtZiAiJFBSRUZJWCRpIiAmJgorICBPVVROQU1FPSIkUFJFRklYJGkiIHNjcmlwdHMvbWFrZS5zaCB8fCBleGl0IDEKK2RvbmUKZGlmZiAtLWdpdCBhL3RveWJveC9zY3JpcHRzL3Rlc3Quc2ggYi90b3lib3gvc2NyaXB0cy90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzMzdjNTIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvc2NyaXB0cy90ZXN0LnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMhL2Jpbi9iYXNoCisKK1RPUERJUj0iJFBXRCIKK0ZJTEVTPSIkUFdEIi90ZXN0cy9maWxlcworCit0cmFwICdraWxsICQoam9icyAtcCkgMj4vZGV2L251bGw7IGV4aXQgMScgSU5UCisKK3JtIC1yZiBnZW5lcmF0ZWQvdGVzdGRpcgorbWtkaXIgLXAgZ2VuZXJhdGVkL3Rlc3RkaXIvdGVzdGRpcgorCitpZiBbIC16ICIkVEVTVF9IT1NUIiBdCit0aGVuCisgIGlmIFsgJCMgLW5lIDAgXQorICB0aGVuCisgICAgUFJFRklYPWdlbmVyYXRlZC90ZXN0ZGlyLyBzY3JpcHRzL3NpbmdsZS5zaCAiJEAiIHx8IGV4aXQgMQorICBlbHNlCisgICAgbWFrZSBpbnN0YWxsX2ZsYXQgUFJFRklYPWdlbmVyYXRlZC90ZXN0ZGlyIHx8IGV4aXQgMQorICBmaQorZmkKKworY2QgZ2VuZXJhdGVkL3Rlc3RkaXIKK1BBVEg9IiRQV0Q6JFBBVEgiCitjZCB0ZXN0ZGlyCitleHBvcnQgTENfQ09MTEFURT1DCisKKy4gIiRUT1BESVIiL3NjcmlwdHMvcnVudGVzdC5zaAorWyAtZiAiJFRPUERJUi9nZW5lcmF0ZWQvY29uZmlnLmgiIF0gJiYgZXhwb3J0IE9QVElPTkZMQUdTPTokKGVjaG8gJChzZWQgLW5yICdzL14jZGVmaW5lIENGR18oLiopIDEvXDEvcCcgIiRUT1BESVIvZ2VuZXJhdGVkL2NvbmZpZy5oIikgfCBzZWQgJ3MvIC86L2cnKQorCitpZiBbICQjIC1uZSAwIF0KK3RoZW4KKyAgZm9yIGkgaW4gIiRAIgorICBkbworICAgIENNRE5BTUU9IiR7aSMjKi99IgorICAgIENNRE5BTUU9IiR7Q01ETkFNRSUudGVzdH0iCisgICAgLiAiJFRPUERJUiIvdGVzdHMvJGkudGVzdAorICBkb25lCitlbHNlCisgIGZvciBpIGluICIkVE9QRElSIi90ZXN0cy8qLnRlc3QKKyAgZG8KKyAgICBDTUROQU1FPSIke2kjIyovfSIKKyAgICBDTUROQU1FPSIke0NNRE5BTUUlLnRlc3R9IgorICAgIGlmIFsgLWggLi4vJENNRE5BTUUgXSB8fCBbICEgLXogIiRURVNUX0hPU1QiIF0KKyAgICB0aGVuCisgICAgICBjZCAuLiAmJiBybSAtcmYgdGVzdGRpciAmJiBta2RpciB0ZXN0ZGlyICYmIGNkIHRlc3RkaXIgfHwgZXhpdCAxCisgICAgICAuICRpCisgICAgZWxzZQorICAgICAgZWNobyAiJENNRE5BTUUgZGlzYWJsZWQiCisgICAgZmkKKyAgZG9uZQorZmkKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9iYXNlNjQudGVzdCBiL3RveWJveC90ZXN0cy9iYXNlNjQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMDU4MTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2Jhc2U2NC50ZXN0CkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAic2ltcGxlIiAiYmFzZTY0IiAiYzJsdGNHeGxDZz09XG4iICIiICJzaW1wbGVcbiIKK3Rlc3RpbmcgImZpbGUiICJiYXNlNjQgaW5wdXQiICJjMmx0Y0d4bENnPT1cbiIgInNpbXBsZVxuIiAiIgordGVzdGluZyAic2ltcGxlIC1kIiAiYmFzZTY0IC1kIiAic2ltcGxlXG4iICIiICJjMmx0Y0d4bENnPT1cbiIKK3Rlc3RpbmcgInNpbXBsZSAtZCIgImJhc2U2NCAtZCBpbnB1dCIgInNpbXBsZVxuIiAiYzJsdGNHeGxDZz09IiAiIgordGVzdGluZyAiZGVmYXVsdCB3cmFwIiAiYmFzZTY0IiBcCisgICJWMlVuZG1VZ2NtVndiR0ZqWldRZ2RHaGxJR1JwYkdsMGFHbDFiU0IwYUdWNUlHNXZjbTFoYkd4NUlIVnpaU0IzYVhSb0lFWnZiR2RsXG5jaWR6SUVOeWVYTjBZV3h6TGc9PVxuIiBcCisgICIiICJXZSd2ZSByZXBsYWNlZCB0aGUgZGlsaXRoaXVtIHRoZXkgbm9ybWFsbHkgdXNlIHdpdGggRm9sZ2VyJ3MgQ3J5c3RhbHMuIgordGVzdGluZyAibXVsdGlsaW5lIC1kICIgImJhc2U2NCAtZCIgXAorICJXZSd2ZSByZXBsYWNlZCB0aGUgZGlsaXRoaXVtIHRoZXkgbm9ybWFsbHkgdXNlIHdpdGggRm9sZ2VyJ3MgQ3J5c3RhbHMuIiAiIiBcCisgICJWMlVuZG1VZ2NtVndiR0ZqWldRZ2RHaGxJR1JwYkdsMGFHbDFiU0IwYUdWNUlHNXZjbTFoYkd4NUlIVnpaU0IzYVhSb0lFWnZiR2RsXG5jaWR6SUVOeWVYTjBZV3h6TGc9PVxuIgorCit0ZXN0aW5nICItdyIgImJhc2U2NCAtdyAxMCIgXAorICAiVFdGeVkyaHBibVxuY2dkRzhnZEdobFxuSUdKbFlYUWdiMlxuWWdZU0JrYVdabVxuWlhKbGJuUWdhMlxuVjBkR3hsSUc5bVxuSUdacGMyZ3VDZ1xuPT1cbiIgXAorICAiIiAiTWFyY2hpbmcgdG8gdGhlIGJlYXQgb2YgYSBkaWZmZXJlbnQga2V0dGxlIG9mIGZpc2guXG4iCisKK3Rlc3RpbmcgIi13MCIgImJhc2U2NCAtdzAgaW5wdXQiIFwKKyAgIlZtbHJhVzVuY3o4Z1ZHaGxjbVVnWVdsdUozUWdibThnZG1scmFXNW5jeUJvWlhKbExpQktkWE4wSUhWeklHaHZibVZ6ZENCbVlYSnRaWEp6TGlCVWFHVWdkRzkzYmlCM1lYTWdZblZ5Ym1sdVp5d2dkR2hsSUhacGJHeGhaMlZ5Y3lCM1pYSmxJR1JsWVdRdUlGUm9aWGtnWkdsa2JpZDBJRzVsWldRZ2RHaHZjMlVnYzJobFpYQWdZVzU1ZDJGNUxpQlVhR0YwSjNNZ2IzVnlJSE4wYjNKNUlHRnVaQ0IzWlNkeVpTQnpkR2xqYTJsdVp5QjBieUJwZEM0SyIgXAorICJWaWtpbmdzPyBUaGVyZSBhaW4ndCBubyB2aWtpbmdzIGhlcmUuIEp1c3QgdXMgaG9uZXN0IGZhcm1lcnMuIFRoZSB0b3duIHdhcyBidXJuaW5nLCB0aGUgdmlsbGFnZXJzIHdlcmUgZGVhZC4gVGhleSBkaWRuJ3QgbmVlZCB0aG9zZSBzaGVlcCBhbnl3YXkuIFRoYXQncyBvdXIgc3RvcnkgYW5kIHdlJ3JlIHN0aWNraW5nIHRvIGl0LlxuIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2Jhc2VuYW1lLnRlc3QgYi90b3lib3gvdGVzdHMvYmFzZW5hbWUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYjJjYzIwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2Jhc2VuYW1lLnRlc3QKQEAgLTAsMCArMSwyNiBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIFJlbW92YWwgb2YgZXh0cmEgLydzCit0ZXN0aW5nICIvLW9ubHkiICJiYXNlbmFtZSAvLy8vLy8vIiAiL1xuIiAiIiAiIgordGVzdGluZyAidHJhaWxpbmcgLyIgImJhc2VuYW1lIGEvLy8vLy8iICJhXG4iICIiICIiCit0ZXN0aW5nICJjb21iaW5lZCIgImJhc2VuYW1lIC8vLy8vYS8vL2IvLy9jLy8vZC8vLy8vIiAiZFxuIiAiIiAiIgorCisjIFN0YW5kYXJkIHN1ZmZpeCBiZWhhdmlvci4KK3Rlc3RpbmcgInN1ZmZpeCIgImJhc2VuYW1lIGEvYi9jL2Quc3VmZml4IC5zdWZmaXgiICJkXG4iICIiICIiCisKKyMgQSBzdWZmaXggY2Fubm90IGJlIHRoZSBlbnRpcmUgcmVzdWx0LgordGVzdGluZyAic3VmZml4PXJlc3VsdCIgImJhc2VuYW1lIC50eHQgLnR4dCIgIi50eHRcbiIgIiIgIiIKKworIyBEZWFsIHdpdGggc3VmZml4IGFwcGVhcmluZyBpbiB0aGUgZmlsZW5hbWUKK3Rlc3RpbmcgInJlYXBwZWFyaW5nIHN1ZmZpeCAxIiAiYmFzZW5hbWUgYS50eHQudHh0IC50eHQiICJhLnR4dFxuIiAiIiAiIgordGVzdGluZyAicmVhcHBlYXJpbmcgc3VmZml4IDIiICJiYXNlbmFtZSBhLnR4dC5vbGQgLnR4dCIgImEudHh0Lm9sZFxuIiAiIiAiIgorCisjIEEgc3VmZml4IHNob3VsZCBiZSBhIHJlYWwgc3VmZml4LCBvbmx5IGEgdGhlIGVuZC4KK3Rlc3RpbmcgImludmFsaWQgc3VmZml4IiAiYmFzZW5hbWUgaXN0aGlzYXN1ZmZpeD8gc3VmZml4IiAiaXN0aGlzYXN1ZmZpeD9cbiIgIiIgIiIKKworIyBaZXJvLWxlbmd0aCBzdWZmaXgKK3Rlc3RpbmcgInplcm8tbGVuZ3RoIHN1ZmZpeCIgImJhc2VuYW1lIGEvYi9jICcnIiAiY1xuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2Jsa2lkLnRlc3QgYi90b3lib3gvdGVzdHMvYmxraWQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kM2JmNmExCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2Jsa2lkLnRlc3QKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitCRElSPSIkRklMRVMvYmxraWQiCisKK2J6Y2F0ICIkQkRJUiIvc3F1YXNoZnMuYnoyID4gdGVtcC5pbWcKK3Rlc3RpbmcgImZpbGUiICJibGtpZCB0ZW1wLmltZyIgJ3RlbXAuaW1nOiBUWVBFPSJzcXVhc2hmcyJcbicgIiIgIiIKK3JtIHRlbXAuaW1nCisKK3Rlc3RpbmcgImNyYW1mcyIgJ2J6Y2F0ICIkQkRJUiIvY3JhbWZzLmJ6MiB8IGJsa2lkIC0nIFwKKyAgJy06IExBQkVMPSJteWNyYW1mcyIgVFlQRT0iY3JhbWZzIlxuJyAiIiAiIgordGVzdGluZyAiZXh0MiIgJ2J6Y2F0ICIkQkRJUiIvZXh0Mi5iejIgfCBibGtpZCAtJyBcCisgICctOiBMQUJFTD0ibXlleHQyIiBVVUlEPSJlNTkwOTNiYS00MTM1LTRmZGItYmNjNC1mMjBiZWFlNGRmYWYiIFRZUEU9ImV4dDIiXG4nIFwKKyAgIiIgIiIgCit0ZXN0aW5nICJleHQzIiAnYnpjYXQgIiRCRElSIi9leHQzLmJ6MiB8IGJsa2lkIC0nIFwKKyAgJy06IExBQkVMPSJteWV4dDMiIFVVSUQ9Ijc5ZDFjODc3LTFhMGYtNGU3ZC1iMjFkLWZjMzJhZTNlZjEwMSIgVFlQRT0iZXh0MyJcbicgXAorICAiIiAiIiAKK3Rlc3RpbmcgImV4dDQiICdiemNhdCAiJEJESVIiL2V4dDQuYnoyIHwgYmxraWQgLScgXAorICAnLTogTEFCRUw9Im15ZXh0NCIgVVVJRD0iZGM0YjdjMDAtYzBjMC00NjAwLWFmN2UtMDMzNWYwOTc3MGZhIiBUWVBFPSJleHQ0IlxuJyBcCisgICIiICIiCit0ZXN0aW5nICJmMmZzIiAnYnpjYXQgIiRCRElSIi9mMmZzLmJ6MiB8IGJsa2lkIC0nIFwKKyAgJy06IExBQkVMPSIiIFVVSUQ9ImI1M2QzNjE5LWMyMDQtNGMwYi04NTA0LTM2MzYzNTc4NDkxYyIgVFlQRT0iZjJmcyJcbicgXAorICAiIiAiIgordGVzdGluZyAibXNkb3MiICdiemNhdCAiJEJESVIiL21zZG9zLmJ6MiB8IGJsa2lkIC0nIFwKKyAgJy06IExBQkVMPSJteW1zZG9zIiBVVUlEPSI1MTA4LTFlNmUiIFRZUEU9InZmYXQiXG4nICIiICIiCit0ZXN0aW5nICJudGZzIiAnYnpjYXQgIiRCRElSIi9udGZzLmJ6MiB8IGJsa2lkIC0nIFwKKyAgJy06IFVVSUQ9Ijg1ODU2MDA4MzhiZmUxNmUiIFRZUEU9Im50ZnMiXG4nICIiICIiCit0ZXN0aW5nICJyZWlzZXJmcyIgJ2J6Y2F0ICIkQkRJUiIvcmVpc2VyMy5iejIgfCBibGtpZCAtJyBcCisgICctOiBMQUJFTD0ibXlyZWlzZXIiIFVVSUQ9ImE1Yjk5YmVjLTQ1Y2MtNDFkNy05ODZlLTMyZjRiNmZjMjhmMiIgVFlQRT0icmVpc2VyZnMiXG4nIFwKKyAgIiIgIiIKK3Rlc3RpbmcgInNxdWFzaGZzIiAnYnpjYXQgIiRCRElSIi9zcXVhc2hmcy5iejIgfCBibGtpZCAtJyBcCisgICctOiBUWVBFPSJzcXVhc2hmcyJcbicgIiIgIiIKK3Rlc3RpbmcgInZmYXQiICdiemNhdCAiJEJESVIiL3ZmYXQuYnoyIHwgYmxraWQgLScgXAorICAnLTogTEFCRUw9Im15dmZhdCIgVVVJRD0iMWRiOS01NjczIiBUWVBFPSJ2ZmF0IlxuJyAiIiAiIgordGVzdGluZyAieGZzIiAnYnpjYXQgIiRCRElSIi94ZnMuYnoyIHwgYmxraWQgLScgXAorICAnLTogTEFCRUw9IlhGU190ZXN0IiBVVUlEPSJkNjNhMWRjMy0yN2Q1LTRkZDQtOGIzOC1mNGY5N2Y0OTVjNmYiIFRZUEU9InhmcyJcbicgXAorICAiIiAiIgorCisjdGVzdGluZyAibWluaXgiICdiemNhdCAiJEJESVIiL21pbml4LmJ6MiB8IGJsa2lkIC0nCisjYWRmcyBiZnMgYnRyZnMgY3JhbWZzIGpmcyBuaWxmcyByb21mcworI3ZmYXQgIC8vIGZhdDMyIGZhdDEyIGZhdDE2CmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvYnpjYXQudGVzdCBiL3RveWJveC90ZXN0cy9iemNhdC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NzVmM2QKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvYnpjYXQudGVzdApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCit0ZXN0aW5nICIyIGtub3duIGZpbGVzIiBcCisgJ2J6Y2F0ICIkRklMRVMvYmxraWQvInttaW5peCxudGZzfS5iejIgfCBzaGExc3VtIHwgJyJhd2sgJ3twcmludCBcJDF9JyIgXAorICdjMGI3NDY5Yzk2NjBkNjA1NmE5ODhlZjhhN2ZlNzM5MjVlZmM5MjY2XG4nICcnICcnCisKK3Rlc3RpbmcgIm92ZXJmbG93IiBcCisgICdiemNhdCAiJEZJTEVTL2J6Y2F0L292ZXJmbG93LmJ6MiIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7CisgICBbICQ/IC1uZSAwIF0gJiYgZWNobyBnb29kJyAiZ29vZFxuIiAiIiAiIgorCit0ZXN0aW5nICJiYWRjcmMiIFwKKyAgJ2J6Y2F0ICIkRklMRVMvYnpjYXQvYmFkY3JjLmJ6MiIgPiAvZGV2L251bGwgMj4vZGV2L251bGwgOworICAgWyAkPyAtbmUgMCBdICYmIGVjaG8gZ29vZCcgImdvb2RcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9jYXQudGVzdCBiL3RveWJveC90ZXN0cy9jYXQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODQ1MDcwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2NhdC50ZXN0CkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworZWNobyAib25lIiA+IGZpbGUxCitlY2hvICJ0d28iID4gZmlsZTIKK3Rlc3RpbmcgImNhdCIgImNhdCAmJiBlY2hvIHllcyIgIm9uZXllc1xuIiAiIiAib25lIgordGVzdGluZyAiLSIgImNhdCAtICYmIGVjaG8geWVzIiAib25leWVzXG4iICIiICJvbmUiCit0ZXN0aW5nICJmaWxlMSBmaWxlMiIgImNhdCBmaWxlMSBmaWxlMiIgIm9uZVxudHdvXG4iICAiIiAiIgordGVzdGluZyAiLSBmaWxlIiAgICAgICJjYXQgLSBmaWxlMSIgICAgICJ6ZXJvXG5vbmVcbiIgIiIgInplcm9cbiIKK3Rlc3RpbmcgImZpbGUgLSIgICAgICAiY2F0IGZpbGUxIC0iICAgICAib25lXG56ZXJvXG4iICIiICJ6ZXJvXG4iCisKK3Rlc3RpbmcgImZpbGUxIG5vdGZvdW5kIGZpbGUyIiBcCisgICAgICAgICJjYXQgZmlsZTEgbm90Zm91bmQgZmlsZTIgMj5zdGRlcnIgJiYgZWNobyBvayA7IGNhdCBzdGRlcnI7IHJtIHN0ZGVyciIgXAorICAgICAgICAib25lXG50d29cbmNhdDogbm90Zm91bmQ6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIgIiIgIiIKKworRklMRT0iJChyZWFkbGluayAtZiAvcHJvYy9zZWxmL2V4ZSkiCit0ZXN0aW5nICJmaWxlMSIgXAorICAgICAgICAnY2F0ICIkRklMRSIgPiBmaWxlMSAmJiBjbXAgIiRGSUxFIiBmaWxlMSAmJiBlY2hvIHllcycgXAorICAgICAgICAieWVzXG4iICIiICIiCisKK3Rlc3RpbmcgIi0gZmlsZTEiIFwKKyAgICAgICAgImNhdCAtIGZpbGUxIHwgZGlmZiAtYSAtVSAwIC0gZmlsZTEgfCB0YWlsIC1uIDEiIFwKKyAgICAgICAgIi1oZWxsb1xuIiAiIiAiaGVsbG9cbiIKKwordGVzdGluZyAiPiAvZGV2L2Z1bGwiIFwKKyAgICAgICAgImNhdCAtID4gL2Rldi9mdWxsIDI+c3RkZXJyICYmIGVjaG8gb2s7IGNhdCBzdGRlcnI7IHJtIHN0ZGVyciIgXAorICAgICAgICAiY2F0OiB4d3JpdGU6IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlXG4iICIiICJ6ZXJvXG4iCisKK3JtIGZpbGUxIGZpbGUyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvY2hhdHRyLnRlc3QgYi90b3lib3gvdGVzdHMvY2hhdHRyLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY3MDE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9jaGF0dHIudGVzdApAQCAtMCwwICsxLDEzMyBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitpZiBbICIkKGlkIC11KSIgLW5lIDAgXQordGhlbgorICBlY2hvICIkU0hPV1NLSVA6IGNoYXR0ciAobm90IHJvb3QpIgorICBjb250aW51ZSAyPi9kZXYvbnVsbAorICBleGl0CitmaQorCisjIGNoYXR0ciAtIFRlc3RjYXNlcworCitta2RpciB0ZXN0YXR0cgorSU49ImNkIHRlc3RhdHRyIgorT1VUPSJjZCAuLiIKK190PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKwordGVzdGluZyAiWy0vK11pIEZJTEVbd3JpdGVdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJgorICAgICAgICAgY2hhdHRyICtpIHRlc3RGaWxlICYmIGxzYXR0ciB0ZXN0RmlsZSAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGU7IAorICAgICAgICAgY2hhdHRyIC1pIHRlc3RGaWxlOyBybSAtcmYgdGVzdEZpbGU7ICRPVVQgIiAiLS0tLWktLS0tLS0tLSB0ZXN0RmlsZVxuIiAiIiAiIgordGVzdGluZyAiWy0vK11pIEZJTEVbcmUtd3JpdGVdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciAraSB0ZXN0RmlsZSAmJiBlY2hvIFwiJF90XCIgPiB0ZXN0RmlsZSB8fCBjaGF0dHIgLWkgdGVzdEZpbGUgJiYgCisgICAgICAgICBlY2hvIFwiJF90XCIgPiB0ZXN0RmlsZSAmJiBsc2F0dHIgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgXAorICAgICAgICAgIi0tLS0tLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdaSBGSUxFW2FwcGVuZF0iICIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyICtpIHRlc3RGaWxlICYmIGVjaG8gXCIkX3RcIiA+PiB0ZXN0RmlsZSB8fCBsc2F0dHIgdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgLWkgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIi0tLS1pLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdaSBGSUxFW21vdmVdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciAraSB0ZXN0RmlsZSAmJiBtdiB0ZXN0RmlsZSB0ZXN0RmlsZTEgfHwgbHNhdHRyIHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyIC1pIHRlc3RGaWxlOyBybSAtcmYgdGVzdEZpbGU7ICRPVVQiICItLS0taS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICJbLS8rXWkgRklMRVtkZWxldGVdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciAraSB0ZXN0RmlsZSAmJiBybSAtZiB0ZXN0RmlsZSB8fCBsc2F0dHIgdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgLWkgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIi0tLS1pLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdaSBGSUxFW3JlYWRdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciAraSB0ZXN0RmlsZSAmJiBjYXQgdGVzdEZpbGUgJiYgbHNhdHRyIHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyIC1pIHRlc3RGaWxlOyBybSAtcmYgdGVzdEZpbGU7ICRPVVQiICIkX3Rcbi0tLS1pLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdYSBGSUxFW3dyaXRlXSIgIiRJTiAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgK2EgdGVzdEZpbGUgJiYgZWNobyAkX3QgPiB0ZXN0RmlsZSB8fCBsc2F0dHIgdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgLWEgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIi0tLS0tYS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdYSBGSUxFW3JlLXdyaXRlXSIgIiRJTiAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgK2EgdGVzdEZpbGUgJiYgZWNobyAkX3QgPiB0ZXN0RmlsZSB8fCBsc2F0dHIgdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgLWEgdGVzdEZpbGUgJiYgZWNobyAkX3QgPiB0ZXN0RmlsZSAmJiBjYXQgdGVzdEZpbGUgJiYgCisgICAgICAgICBsc2F0dHIgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgCisgICAgICAgICAkT1VUIiAiLS0tLS1hLS0tLS0tLSB0ZXN0RmlsZVxuJF90XG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICJbLS8rXWEgRklMRVthcHBlbmRdIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciArYSB0ZXN0RmlsZSAmJiBlY2hvICRfdCA+PiB0ZXN0RmlsZSAmJiBjYXQgdGVzdEZpbGUgJiYgCisgICAgICAgICBsc2F0dHIgdGVzdEZpbGUgJiYgY2hhdHRyIC1hIHRlc3RGaWxlOyBybSAtcmYgdGVzdEZpbGU7ICRPVVQiIFwKKyAgICAgICAgICIkX3RcbiRfdFxuLS0tLS1hLS0tLS0tLSB0ZXN0RmlsZVxuIiAiIiAiIgordGVzdGluZyAiWy0vK11hIEZJTEVbbW92ZV0iICIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyICthIHRlc3RGaWxlICYmIG12IHRlc3RGaWxlIHRlc3RGaWxlMSB8fCBsc2F0dHIgdGVzdEZpbGUgJiYgCisgICAgICAgICBjaGF0dHIgLWEgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIi0tLS0tYS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdYSBGSUxFW2RlbGV0ZV0iICIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyICthIHRlc3RGaWxlICYmIHJtIC1mIHRlc3RGaWxlIHx8IGxzYXR0ciB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciAtYSB0ZXN0RmlsZTsgcm0gLXJmIHRlc3RGaWxlOyAkT1VUIiAiLS0tLS1hLS0tLS0tLSB0ZXN0RmlsZVxuIiAiIiAiIgordGVzdGluZyAiWy0vK11hIEZJTEVbcmVhZF0iICIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIAorICAgICAgICAgY2hhdHRyICthIHRlc3RGaWxlICYmIGNhdCB0ZXN0RmlsZSAmJiBsc2F0dHIgdGVzdEZpbGUgJiYgY2hhdHRyIC1hIHRlc3RGaWxlOyAKKyAgICAgICAgIHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIiRfdFxuLS0tLS1hLS0tLS0tLSB0ZXN0RmlsZVxuIiAiIiAiIgorCitmb3IgYXR0ciBpbiAiQSIgImEiICJjIiAiRCIgImQiICJpIiAiaiIgInMiICJTIiAidCIgIlQiICJ1IgorZG8KKyAgdGVzdGluZyAiWy0vK10kYXR0ciBGSUxFIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgICAgY2hhdHRyICskYXR0ciB0ZXN0RmlsZSAmJiBjYXQgdGVzdEZpbGUgJiYgY2hhdHRyIC0kYXR0ciB0ZXN0RmlsZSAmJiAKKyAgICAgICAgICAgbHNhdHRyIHRlc3RGaWxlOyBybSAtcmYgdGVzdEZpbGU7ICRPVVQiICIkX3Rcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK2RvbmUKKworZm9yIGF0dHIgaW4gIkEiICJhIiAiYyIgIkQiICJkIiAiaSIgImoiICJzIiAiUyIgInQiICJUIiAidSIKK2RvCisgIHRlc3RpbmcgIi0kYXR0ciBGSUxFIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiBjaGF0dHIgLSRhdHRyIHRlc3RGaWxlICYmCisgICAgICAgICAgIGNhdCB0ZXN0RmlsZSAmJiBsc2F0dHIgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIiRfdFxuLS0tLS0tLS0tLS0tLSB0ZXN0RmlsZVxuIiAiIiAiIgorZG9uZQorCit0ZXN0aW5nICJbLS8rXUFhY0RkaWpzU3RUdSBGSUxFIiAiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGNoYXR0ciArQWFjRGRpanNTdFR1IHRlc3RGaWxlICYmIGNhdCB0ZXN0RmlsZSAmJiBjaGF0dHIgLUFhY0RkaWpzU3RUdSB0ZXN0RmlsZSAmJiAKKyAgICAgICAgIGxzYXR0ciB0ZXN0RmlsZTsgcm0gLXJmIHRlc3RGaWxlOyAkT1VUIiAiJF90XG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICJbLS8rXUFhY0RkaWpzU3RUdShyYW5kb20pIEZJTEUiIFwKKyAgICAgICAgIiRJTiAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGUgJiYgCisgICAgICAgIGNoYXR0ciArQWFjRGRpanNTdFR1IHRlc3RGaWxlICYmIGNhdCB0ZXN0RmlsZSAmJiBjaGF0dHIgLUEgdGVzdEZpbGUgJiYKKyAgICAgICAgY2hhdHRyIC1hIHRlc3RGaWxlICYmIGNoYXR0ciAtYyB0ZXN0RmlsZSAmJiBjaGF0dHIgLUQgdGVzdEZpbGUgJiYKKyAgICAgICAgY2hhdHRyIC1kIHRlc3RGaWxlICYmIGNoYXR0ciAtaSB0ZXN0RmlsZSAmJiBjaGF0dHIgLWogdGVzdEZpbGUgJiYKKyAgICAgICAgY2hhdHRyIC1zIHRlc3RGaWxlICYmIGNoYXR0ciAtUyB0ZXN0RmlsZSAmJiBjaGF0dHIgLXQgdGVzdEZpbGUgJiYKKyAgICAgICAgY2hhdHRyIC1UIHRlc3RGaWxlICYmIGNoYXR0ciAtdSB0ZXN0RmlsZSAmJiBsc2F0dHIgdGVzdEZpbGUgJiYKKyAgICAgICAgY2hhdHRyIC1BYWNEZGlqc1N0VHUgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgXAorICAgICAgICAiJF90XG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICJbLS8rXUFhY0RkaWpzU3RUdSBGSUxFKiIgIiRJTiAmJiAKKyAgICAgICAgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZTEgJiYKKyAgICAgICAgZWNobyAiJF90IiA+IHRlc3RGaWxlMiAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGUzICYmCisgICAgICAgIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZTQgJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlNSAmJgorICAgICAgICBlY2hvICIkX3QiID4gdGVzdEZpbGU2ICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZTcgJiYKKyAgICAgICAgZWNobyAiJF90IiA+IHRlc3RGaWxlOCAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGU5ICYmCisgICAgICAgIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZTEwICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZTExICYmCisgICAgICAgY2hhdHRyICtBYWNEZGlqc1N0VHUgdGVzdEZpbGUqICYmCisgICAgICAgY2F0IHRlc3RGaWxlOSAmJiBjaGF0dHIgLUFhY0RkaWpzU3RUdSB0ZXN0RmlsZSogJiYgbHNhdHRyIHRlc3RGaWxlKjsgcm0gLXJmIHRlc3RGaWxlKjsgJE9VVCIgXAorICAgICAgICIkX3Rcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGVcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGUxXG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlMTBcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGUxMVxuLS0tLS0tLS0tLS0tLSB0ZXN0RmlsZTJcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGUzXG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlNFxuLS0tLS0tLS0tLS0tLSB0ZXN0RmlsZTVcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGU2XG4tLS0tLS0tLS0tLS0tIHRlc3RGaWxlN1xuLS0tLS0tLS0tLS0tLSB0ZXN0RmlsZThcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGU5XG4iICIiICIiCit0ZXN0aW5nICJbLS8rXUFhY0RkaWpzU3RUdShyYW5kb20pIEZJTEUqIiBcCisgICAgICAgICIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmCisgICAgICAgIGNoYXR0ciArQWFjRGRpanNTdFR1IHRlc3RGaWxlKiAmJiBjYXQgdGVzdEZpbGUgJiYgY2hhdHRyIC1BIHRlc3RGaWxlKiAmJgorCWNoYXR0ciAtYSB0ZXN0RmlsZSogJiYgY2hhdHRyIC1jIHRlc3RGaWxlKiAmJiBjaGF0dHIgLUQgdGVzdEZpbGUqICYmCisJY2hhdHRyIC1kIHRlc3RGaWxlKiAmJiBjaGF0dHIgLWkgdGVzdEZpbGUqICYmIGNoYXR0ciAtaiB0ZXN0RmlsZSogJiYKKwljaGF0dHIgLXMgdGVzdEZpbGUqICYmIGNoYXR0ciAtUyB0ZXN0RmlsZSogJiYgY2hhdHRyIC10IHRlc3RGaWxlKiAmJgorCWNoYXR0ciAtVCB0ZXN0RmlsZSogJiYgY2hhdHRyIC11IHRlc3RGaWxlKiAmJiBsc2F0dHIgdGVzdEZpbGU7CisgICAgICAgIHJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgXAorCSIkX3Rcbi0tLS0tLS0tLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdaSBGSUxFW3dyaXRlXSIgXAorCSIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmCisJY2hhdHRyICtpIHRlc3RGaWxlICYmCisJZWNobyBcIiRfdFwiID4gdGVzdEZpbGUgfHwgbHNhdHRyIHRlc3RGaWxlICYmIGNoYXR0ciAtaSB0ZXN0RmlsZTsKKwlybSAtcmYgdGVzdEZpbGU7ICRPVVQiICItLS0taS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICJbLS8rXUEgRklMRVt3cml0ZV0iIFwKKwkiJElOICYmIGVjaG8gIiRfdCIgPiB0ZXN0RmlsZSAmJiBjaGF0dHIgK0EgdGVzdEZpbGUgJiYKKwllY2hvIFwiJF90XCIgPiB0ZXN0RmlsZSAmJiBsc2F0dHIgdGVzdEZpbGUgJiYgY2hhdHRyIC1BIHRlc3RGaWxlOworCXJtIC1yZiB0ZXN0RmlsZTsgJE9VVCIgIi0tLS0tLS1BLS0tLS0gdGVzdEZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIlstLytdcyBGSUxFW3dyaXRlXSIgXAorCSIkSU4gJiYgZWNobyAiJF90IiA+IHRlc3RGaWxlICYmIGNoYXR0ciArcyB0ZXN0RmlsZSAmJgorCWVjaG8gXCIkX3RcIiA+IHRlc3RGaWxlICYmIGxzYXR0ciB0ZXN0RmlsZSAmJiBjaGF0dHIgLXMgdGVzdEZpbGUKKwlybSAtcmYgdGVzdEZpbGU7ICRPVVQiICJzLS0tLS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCit0ZXN0aW5nICItdiB2ZXJzaW9uIEZJTEVbd3JpdGVdIiBcCisJIiRJTiAmJiBlY2hvICIkX3QiID4gdGVzdEZpbGUgJiYKKwljaGF0dHIgLXYgMTIzNCB0ZXN0RmlsZSAmJiBlY2hvIFwiJF90XCIgPiB0ZXN0RmlsZSAmJiAKKwlsc2F0dHIgLXYgdGVzdEZpbGU7IHJtIC1yZiB0ZXN0RmlsZSIgXAorCSIgMTIzNCAtLS0tLS0tLS0tLS0tIHRlc3RGaWxlXG4iICIiICIiCisKK19hPSItLS0tLS0tQS0tLS0tIgordGVzdGluZyAiLVIgWy0vK11hIEZJTEUiICIkSU4gJiYgdG91Y2ggYWEgJiYgY2hhdHRyIC1SICtBIGFhICYmIGxzYXR0ciBhYSAmJgorCWNoYXR0ciAtUiAtQSBhYTsgcm0gLXJmIGFhOyAkT1VUIiAiJF9hIGFhXG4iICIiICIiCit0ZXN0aW5nICItUiBbLS8rXWEgRklMRS4uIiAiJElOICYmIHRvdWNoIGFhIGJiICYmCisJY2hhdHRyIC1SICtBIGFhIGJiICYmIGxzYXR0ciBhYSBiYiAmJgorCWNoYXR0ciAtUiAtQSBhYSBiYjsgcm0gLXJmIGFhIGJiOyAkT1VUIiAiJF9hIGFhXG4kX2EgYmJcbiIgIiIgIiIKKworIyBDbGVhbiB1cAorcm0gLXJmIHRlc3RhdHRyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvY2hncnAudGVzdCBiL3RveWJveC90ZXN0cy9jaGdycC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2Y2Q3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvY2hncnAudGVzdApAQCAtMCwwICsxLDEwMiBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKK2lmIFsgIiQoaWQgLXUpIiAtbmUgMCBdCit0aGVuCisgIGVjaG8gIiRTSE9XU0tJUDogY2hncnAgKG5vdCByb290KSIKKyAgY29udGludWUgMj4vZGV2L251bGwKKyAgZXhpdAorZmkKKworIyBXZSBjaGdycCBiZXR3ZWVuICJyb290IiBhbmQgdGhlIGxhc3QgZ3JvdXAgaW4gL2V0Yy9ncm91cC4KKworR1JQPSIkKHNlZCAtbiAnJHMvOi4qLy9wJyAvZXRjL2dyb3VwKSIKKworIyBTZXQgdXAgYSBsaXR0bGUgdGVzdGluZyBoaWVyYXJjaHkKKworcm0gLXJmIHRlc3RkaXIgJiYKK21rZGlyIC1wIHRlc3RkaXIvZGlyL2Rpci9kaXIgdGVzdGRpci9kaXIyICYmCit0b3VjaCB0ZXN0ZGlyL2Rpci9maWxlICYmCitsbiAtcyAuLi9kaXIvZGlyIHRlc3RkaXIvZGlyMi9kaXIgJiYKK2xuIC1zIC4uL2Rpci9maWxlIHRlc3RkaXIvZGlyMi9maWxlIHx8IGV4aXQgMQorCisjIFdyYXBwZXIgdG8gcmVzZXQgZ3JvdXBzIGFuZCByZXR1cm4gcmVzdWx0cworCitJTj0iY2QgdGVzdGRpciAmJiBjaGdycCAtUiAkR1JQIGRpciBkaXIyICYmIgorT1VUPSImJiBjZCAuLiAmJiBlY2hvIFwkKGxzIC1sUiB0ZXN0ZGlyIHwgYXdrICd7cHJpbnQgXCQ0fScpIgorCisjIFRoZSBncm91cHMgcmV0dXJuZWQgYnkgJE9VVCBhcmUsIGluIG9yZGVyOgorIyBkaXIgZGlyMiBkaXIvZGlyIGRpci9maWxlIGRpci9kaXIvZGlyIGRpcjIvZGlyIGRpcjIvZmlsZQorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBCYXNpYyBzbW9rZXRlc3QKK3Rlc3RpbmcgImRpciIgIiRJTiBjaGdycCByb290IGRpciAkT1VUIiBcCisJInJvb3QgJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgImZpbGUiICIkSU4gY2hncnAgcm9vdCBkaXIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQIHJvb3QgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgImRpciBhbmQgZmlsZSIgIiRJTiBjaGdycCByb290IGRpciBkaXIvZmlsZSAkT1VUIiBcCisJInJvb3QgJEdSUCAkR1JQIHJvb3QgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKKworIyBzeW1saW5rcyAoYWZmZWN0IHRhcmdldCwgbm90IHN5bWxpbmspCit0ZXN0aW5nICJzeW1saW5rLT5maWxlIiAiJElOIGNoZ3JwIHJvb3QgZGlyMi9maWxlICRPVVQiIFwKKwkiJEdSUCAkR1JQICRHUlAgcm9vdCAkR1JQICRHUlAgJEdSUFxuIiAiIiAiIgordGVzdGluZyAic3ltbGluay0+ZGlyIiAiJElOIGNoZ3JwIHJvb3QgZGlyMi9kaXIgJE9VVCIgXAorCSIkR1JQICRHUlAgcm9vdCAkR1JQICRHUlAgJEdSUCAkR1JQXG4iICIiICIiCit0ZXN0aW5nICItaCBzeW1saW5rLT5kaXIiICIkSU4gY2hncnAgLWggcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQICRHUlAgJEdSUCByb290ICRHUlBcbiIgIiIgIiIKKworIyBXaGF0IGRvZXMgLWggZG8gKGFmZmVjdCBzeW1saW5rLCBub3QgdGFyZ2V0KQordGVzdGluZyAiLWggc3ltbGluay0+ZmlsZSIgIiRJTiBjaGdycCAtaCByb290IGRpcjIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQIHJvb3RcbiIgIiIgIiIKK3Rlc3RpbmcgIi1oIHN5bWxpbmstPmRpciIgIiRJTiBjaGdycCAtaCByb290IGRpcjIvZGlyICRPVVQiIFwKKwkiJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQIHJvb3QgJEdSUFxuIiAiIiAiIgorCisjIGNoZ3JwIC1SIChub3RlLCAtaCBpcyBpbXBsaWVkIGJ5IC1SKQorCit0ZXN0aW5nICItUiBkaXIiICIkSU4gY2hncnAgLVIgcm9vdCBkaXIgJE9VVCIgXAorCSJyb290ICRHUlAgcm9vdCByb290IHJvb3QgJEdSUCAkR1JQXG4iICIiICIiCit0ZXN0aW5nICItUiBkaXIyIiAiJElOIGNoZ3JwIC1SIHJvb3QgZGlyMiAkT1VUIiBcCisJIiRHUlAgcm9vdCAkR1JQICRHUlAgJEdSUCByb290IHJvb3RcbiIgIiIgIiIKK3Rlc3RpbmcgIi1SIHN5bWxpbmstPmRpciIgIiRJTiBjaGdycCAtUiByb290IGRpcjIvZGlyICRPVVQiIFwKKwkiJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQIHJvb3QgJEdSUFxuIiAiIiAiIgordGVzdGluZyAiLVIgc3ltbGluay0+ZmlsZSIgIiRJTiBjaGdycCAtUiByb290IGRpcjIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQIHJvb3RcbiIgIiIgIiIKKworIyBjaGdycCAtUlAgKHNhbWUgYXMgLVIgYnkgaXRzZWxmKQorCit0ZXN0aW5nICItUlAgZGlyMiIgIiRJTiBjaGdycCAtUlAgcm9vdCBkaXIyICRPVVQiIFwKKwkiJEdSUCByb290ICRHUlAgJEdSUCAkR1JQIHJvb3Qgcm9vdFxuIiAiIiAiIgordGVzdGluZyAiLVJQIHN5bWxpbmstPmRpciIgIiRJTiBjaGdycCAtUlAgcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQICRHUlAgJEdSUCByb290ICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1SUCBzeW1saW5rLT5maWxlIiAiJElOIGNoZ3JwIC1SUCByb290IGRpcjIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQICRHUlAgJEdSUCAkR1JQIHJvb3RcbiIgIiIgIiIKKworIyBjaGdycCAtUkggKGNoYW5nZSB0YXJnZXQgYnV0IG9ubHkgcmVjdXJzZSB0aHJvdWdoIHN5bWxpbmstPmRpciBvbiBjbWRsaW5lKQorCit0ZXN0aW5nICItUkggZGlyMiIgIiRJTiBjaGdycCAtUkggcm9vdCBkaXIyICRPVVQiIFwKKwkiJEdSUCByb290IHJvb3Qgcm9vdCAkR1JQICRHUlAgJEdSUFxuIiAiIiAiIgordGVzdGluZyAiLVJIIHN5bWxpbmstPmRpciIgIiRJTiBjaGdycCAtUkggcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCByb290ICRHUlAgcm9vdCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1SSCBzeW1saW5rLT5maWxlIiAiJElOIGNoZ3JwIC1SSCByb290IGRpcjIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQIHJvb3QgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKKworIyBjaGdycCAtUkwgKGNoYW5nZSB0YXJnZXQgYW5kIGFsd2F5cyByZWN1cnNlIHRocm91Z2ggc3ltbGluay0+ZGlyKQorCit0ZXN0aW5nICItUkwgZGlyMiIgIiRJTiBjaGdycCAtUkwgcm9vdCBkaXIyICRPVVQiIFwKKwkiJEdSUCByb290IHJvb3Qgcm9vdCByb290ICRHUlAgJEdSUFxuIiAiIiAiIgordGVzdGluZyAiLVJMIHN5bWxpbmstPmRpciIgIiRJTiBjaGdycCAtUkwgcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCByb290ICRHUlAgcm9vdCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1STCBzeW1saW5rLT5maWxlIiAiJElOIGNoZ3JwIC1STCByb290IGRpcjIvZmlsZSAkT1VUIiBcCisJIiRHUlAgJEdSUCAkR1JQIHJvb3QgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKKworIyAtSExQIGFyZSBOT1BzIHdpdGhvdXQgLVIKK3Rlc3RpbmcgIi1IIHdpdGhvdXQgLVIiICIkSU4gY2hncnAgLUggcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCByb290ICRHUlAgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1MIHdpdGhvdXQgLVIiICIkSU4gY2hncnAgLUwgcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCByb290ICRHUlAgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1QIHdpdGhvdXQgLVIiICIkSU4gY2hncnAgLVAgcm9vdCBkaXIyL2RpciAkT1VUIiBcCisJIiRHUlAgJEdSUCByb290ICRHUlAgJEdSUCAkR1JQICRHUlBcbiIgIiIgIiIKKworcm0gLXJmIHRlc3RkaXIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9jaG1vZC50ZXN0IGIvdG95Ym94L3Rlc3RzL2NobW9kLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiNjRiZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9jaG1vZC50ZXN0CkBAIC0wLDAgKzEsMjQ2IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIFJvYmluIE1pdHRhbCA8cm9iaW5taXR0YWwuaXRAZ21haWwuY29tPgorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordW1hc2sgMDIyCisKK1BFUk09Ii0tLSIiLS14IiItdy0iIi13eCIici0tIiJyLXgiInJ3LSIicnd4IgorCitudW0ycGVybSgpCit7CisgIGZvciBpIGluIDAgMSAyCisgIGRvCisgICAgbnVtPSR7MTokaToxfQorICAgIHByaW50ZiAiJXMiICR7UEVSTTokKCgkbnVtKjMpKTozfQorICBkb25lCisgIGVjaG8KK30KKworIyBDcmVhdGluZyB0ZXN0IGZpbGVzIHRvIHRlc3QgY2htb2QgY29tbWFuZAorbWtkaXIgZGlyCit0b3VjaCBmaWxlCisKKyMgV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGFsbCA1MTIgcGVybWlzc2lvbnMKK2ZvciB1IGluIDAgMSAyIDMgNCA1IDYgNworZG8KKyAgZm9yIGcgaW4gMCAzIDYKKyAgZG8KKyAgICBmb3IgbyBpbiAwIDcKKyAgICBkbworICAgICAgaWYgWyAiJHR5cGUiID09IGZpbGUgXQorICAgICAgdGhlbgorICAgICAgICB0eXBlPWRpcgorICAgICAgICBybSAtcmYgIi4vJHR5cGUiICYmIG1rZGlyICR0eXBlCisgICAgICAgIERBU0g9ZAorICAgICAgZWxzZQorICAgICAgICB0eXBlPWZpbGUKKyAgICAgICAgcm0gLWYgIi4vJHR5cGUiICYmIHRvdWNoICR0eXBlCisgICAgICAgIERBU0g9LQorICAgICAgZmkKKyAgICAgIERBU0hFUz0kKG51bTJwZXJtICR1JGckbykKKyAgICAgIHRlc3RpbmcgIiR1JGckbyAkdHlwZSIgImNobW9kICR1JGckbyAkdHlwZSAmJiAKKyAgICAgICAgbHMgLWxkICR0eXBlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICIkREFTSCREQVNIRVNcbiIgIiIgIiIKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICI3NTAgZGlyIDY0MCBmaWxlIiBcCisgICJjaG1vZCA3NTAgZGlyIDY0MCBmaWxlIDI+L2Rldi9udWxsIHx8CisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXgtLS1cbi1yd3hyLXgtLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICI2NjYgZGlyIGZpbGUiIFwKKyAgImNobW9kIDY2NiBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnctcnctcnctXG4tcnctcnctcnctXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiNzY1ICoiICJjaG1vZCA3NjUgKiAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4cnctci14XG4tcnd4cnctci14XG4iICIiICIiCisKKyMjIyMjIHUsZyxvLGE9cix3LHgKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAidT1yIGRpciBmaWxlIiAiY2htb2QgdT1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyLS1yLXhyLXhcbi1yLS1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJ1PXcgZGlyIGZpbGUiICJjaG1vZCB1PXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZC13LXIteHIteFxuLS13LXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgInU9eCBkaXIgZmlsZSIgImNobW9kIHU9eCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkLS14ci14ci14XG4tLS14ci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAidStyIGRpciBmaWxlIiAiY2htb2QgdStyIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXhyLXhcbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJ1K3cgZGlyIGZpbGUiICJjaG1vZCB1K3cgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHIteHIteFxuLXJ3LXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgInUreCBkaXIgZmlsZSIgImNobW9kIHUreCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnd4ci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAidS1yIGRpciBmaWxlIiAiY2htb2QgdS1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImQtd3hyLXhyLXhcbi0tdy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJ1LXcgZGlyIGZpbGUiICJjaG1vZCB1LXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHIteHIteHIteFxuLXItLXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgInUteCBkaXIgZmlsZSIgImNobW9kIHUteCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnctci14ci14XG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiZz1yIGRpciBmaWxlIiAiY2htb2QgZz1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLS1yLXhcbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJnPXcgZGlyIGZpbGUiICJjaG1vZCBnPXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eC13LXIteFxuLXJ3LS13LXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImc9eCBkaXIgZmlsZSIgImNobW9kIGc9eCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4LS14ci14XG4tcnctLS14ci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiZytyIGRpciBmaWxlIiAiY2htb2QgZytyIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXhyLXhcbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJnK3cgZGlyIGZpbGUiICJjaG1vZCBnK3cgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHJ3eHIteFxuLXJ3LXJ3LXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImcreCBkaXIgZmlsZSIgImNobW9kIGcreCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnctci14ci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiZy1yIGRpciBmaWxlIiAiY2htb2QgZy1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3gtLXhyLXhcbi1ydy0tLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJnLXcgZGlyIGZpbGUiICJjaG1vZCBnLXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHIteHIteFxuLXJ3LXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImcteCBkaXIgZmlsZSIgImNobW9kIGcteCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci0tci14XG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAibz1yIGRpciBmaWxlIiAiY2htb2Qgbz1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXhyLS1cbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJvPXcgZGlyIGZpbGUiICJjaG1vZCBvPXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHIteC13LVxuLXJ3LXItLS13LVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgIm89eCBkaXIgZmlsZSIgImNobW9kIG89eCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14LS14XG4tcnctci0tLS14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAibytyIGRpciBmaWxlIiAiY2htb2QgbytyIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXhyLXhcbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJvK3cgZGlyIGZpbGUiICJjaG1vZCBvK3cgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHIteHJ3eFxuLXJ3LXItLXJ3LVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgIm8reCBkaXIgZmlsZSIgImNobW9kIG8reCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnctci0tci14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiby1yIGRpciBmaWxlIiAiY2htb2Qgby1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXgtLXhcbi1ydy1yLS0tLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJvLXcgZGlyIGZpbGUiICJjaG1vZCBvLXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHIteHIteFxuLXJ3LXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgIm8teCBkaXIgZmlsZSIgImNobW9kIG8teCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci0tXG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiYT1yIGRpciBmaWxlIiAiY2htb2QgYT1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyLS1yLS1yLS1cbi1yLS1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJhPXcgZGlyIGZpbGUiICJjaG1vZCBhPXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZC13LS13LS13LVxuLS13LS13LS13LVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImE9eCBkaXIgZmlsZSIgImNobW9kIGE9eCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkLS14LS14LS14XG4tLS14LS14LS14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiYStyIGRpciBmaWxlIiAiY2htb2QgYStyIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImRyd3hyLXhyLXhcbi1ydy1yLS1yLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJhK3cgZGlyIGZpbGUiICJjaG1vZCBhK3cgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHJ3eHJ3eHJ3eFxuLXJ3LXJ3LXJ3LVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImEreCBkaXIgZmlsZSIgImNobW9kIGEreCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnd4ci14ci14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiYS1yIGRpciBmaWxlIiAiY2htb2QgYS1yIGRpciBmaWxlICYmCisgICBscyAtbGQgZGlyIGZpbGUgfCBjdXQgLWQnICcgLWYgMSB8IGN1dCAtZC4gLWYgMSIgImQtd3gtLXgtLXhcbi0tdy0tLS0tLS1cbiIgIiIgIiIKKworcm0gLXJmIGRpciBmaWxlICYmIG1rZGlyIGRpciAmJiB0b3VjaCBmaWxlCit0ZXN0aW5nICJhLXcgZGlyIGZpbGUiICJjaG1vZCBhLXcgZGlyIGZpbGUgJiYKKyAgIGxzIC1sZCBkaXIgZmlsZSB8IGN1dCAtZCcgJyAtZiAxIHwgY3V0IC1kLiAtZiAxIiAiZHIteHIteHIteFxuLXItLXItLXItLVxuIiAiIiAiIgorCitybSAtcmYgZGlyIGZpbGUgJiYgbWtkaXIgZGlyICYmIHRvdWNoIGZpbGUKK3Rlc3RpbmcgImEteCBkaXIgZmlsZSIgImNobW9kIGEteCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnctci0tci0tXG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiPXIgZGlyIGZpbGUiICJjaG1vZCA9ciBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkci0tci0tci0tXG4tci0tci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiPXcgZGlyIGZpbGUiICJjaG1vZCA9dyBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkLXctLS0tLS0tXG4tLXctLS0tLS0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiPXggZGlyIGZpbGUiICJjaG1vZCA9eCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkLS14LS14LS14XG4tLS14LS14LS14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiK3IgZGlyIGZpbGUiICJjaG1vZCArciBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiK3cgZGlyIGZpbGUiICJjaG1vZCArdyBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnctci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiK3ggZGlyIGZpbGUiICJjaG1vZCAreCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnd4ci14ci14XG4tcnd4ci14ci14XG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiLXIgZGlyIGZpbGUiICJjaG1vZCAtciBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkLXd4LS14LS14XG4tLXctLS0tLS0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiLXcgZGlyIGZpbGUiICJjaG1vZCAtdyBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkci14ci14ci14XG4tci0tci0tci0tXG4iICIiICIiCisKK3JtIC1yZiBkaXIgZmlsZSAmJiBta2RpciBkaXIgJiYgdG91Y2ggZmlsZQordGVzdGluZyAiLXggZGlyIGZpbGUiICJjaG1vZCAteCBkaXIgZmlsZSAmJgorICAgbHMgLWxkIGRpciBmaWxlIHwgY3V0IC1kJyAnIC1mIDEgfCBjdXQgLWQuIC1mIDEiICJkcnctci0tci0tXG4tcnctci0tci0tXG4iICIiICIiCisKKyMgUmVtb3ZpbmcgdGVzdCBmaWxlcyBmb3IgY2xlYW51cCBwdXJwb3NlCitybSAtcmYgZGlyIGZpbGUKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9jaG93bi50ZXN0IGIvdG95Ym94L3Rlc3RzL2Nob3duLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVhZDcyNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9jaG93bi50ZXN0CkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCitpZiBbICIkKGlkIC11KSIgLW5lIDAgXQordGhlbgorICBlY2hvICIkU0hPV1NLSVA6IGNob3duIChub3Qgcm9vdCkiCisgIGNvbnRpbnVlIDI+L2Rldi9udWxsCisgIGV4aXQKK2ZpCisKKyMgV2UgY2hvd24gYmV0d2VlbiB1c2VyICJyb290IiBhbmQgdGhlIGxhc3QgdXNlciBpbiAvZXRjL3Bhc3N3ZCwKKyMgYW5kIGdyb3VwICJyb290IiBhbmQgdGhlIGxhc3QgZ3JvdXAgaW4gL2V0Yy9ncm91cC4KKworVVNSPSIkKHNlZCAtbiAnJHMvOi4qLy9wJyAvZXRjL3Bhc3N3ZCkiCitHUlA9IiQoc2VkIC1uICckcy86LiovL3AnIC9ldGMvZ3JvdXApIgorCisjIFNldCB1cCBhIGxpdHRsZSB0ZXN0aW5nIGhpZXJhcmNoeQorCitybSAtcmYgdGVzdGRpciAmJgorbWtkaXIgdGVzdGRpciAmJgordG91Y2ggdGVzdGRpci9maWxlCitGPXRlc3RkaXIvZmlsZQorCisjIFdyYXBwZXIgdG8gcmVzZXQgZ3JvdXBzIGFuZCByZXR1cm4gcmVzdWx0cworCitPVVQ9IiYmIGVjaG8gXCQobHMgLWwgdGVzdGRpci9maWxlIHwgYXdrICd7cHJpbnQgXCQzLFwkNH0nKSIKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgQmFzaWMgc21va2V0ZXN0Cit0ZXN0aW5nICJpbml0aWFsIiAiY2hvd24gcm9vdDpyb290ICRGICRPVVQiICJyb290IHJvb3RcbiIgIiIgIiIKK3Rlc3RpbmcgInVzcjpncnAiICJjaG93biAkVVNSOiRHUlAgJEYgJE9VVCIgIiRVU1IgJEdSUFxuIiAiIiAiIgordGVzdGluZyAicm9vdCIgICAgImNob3duIHJvb3QgJEYgJE9VVCIgInJvb3QgJEdSUFxuIiAiIiAiIgorIyBUT0RPOiBjYW4gd2UgdGVzdCAib3duZXI6Ij8KK3Rlc3RpbmcgIjpncnAiICAgICJjaG93biByb290OnJvb3QgJEYgJiYgY2hvd24gOiRHUlAgJEYgJE9VVCIgXAorICAgICJyb290ICRHUlBcbiIgIiIgIiIKK3Rlc3RpbmcgIjoiICAgICAgICJjaG93biAkVVNSOiRHUlAgJEYgJiYgY2hvd24gOiAkRiAkT1VUIiBcCisgICAgIiRVU1IgJEdSUFxuIiAiIiAiIgorCitybSAtcmYgdGVzdGRpcgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2Nrc3VtLnRlc3QgYi90b3lib3gvdGVzdHMvY2tzdW0udGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTkzOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2Nrc3VtLnRlc3QKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgRGVmYXVsdCBiZWhhdmlvciBvbiBzdGRpbiBhbmQgb24gZmlsZXMuCit0ZXN0aW5nICJvbiBzdGRpbiIgImVjaG8gLW4gaGVsbG8gfCBja3N1bSIgIjMyODc2NDY1MDkgNVxuIiAiIiAiIgorZWNobyAtbiAiaGVsbG8iID4gdG1wZmlsZQordGVzdGluZyAib24gZmlsZSIgImNrc3VtIHRtcGZpbGUiICIzMjg3NjQ2NTA5IDUgdG1wZmlsZVxuIiAiIiAiIgorcm0gLWYgdG1wZmlsZQordG91Y2ggb25lIHR3bwordGVzdGluZyAib24gbXVsdGlwbGUgZmlsZXMiICJja3N1bSBvbmUgdHdvIiAiNDI5NDk2NzI5NSAwIG9uZVxuNDI5NDk2NzI5NSAwIHR3b1xuIiAiIiAiIgorcm0gLWYgb25lIHR3bworCisjIENoZWNrIHRoZSBsZW5ndGggc3VwcHJlc3Npb24sIGJvdGggY2FsY3VsYXRlIHRoZSBDUkMgb24gJ2FiYycgYnV0IHRoZSBzZWNvbmQKKyMgb3B0aW9uIGhhcyBsZW5ndGggc3VwcHJlc3Npb24gb24gYW5kIGhhcyB0aGUgbGVuZ3RoIGNvbmNhdGVuYXRlZCB0byAnYWJjJy4KK3Rlc3RpbmcgIm9uIGFiYyBpbmNsdWRpbmcgbGVuZ3RoIiAiZWNobyAtbiAnYWJjJyB8IGNrc3VtIiAiMTIxOTEzMTU1NCAzXG4iICIiICIiCit0ZXN0aW5nICJvbiBhYmMgZXhjbHVkaW5nIGxlbmd0aCIgImVjaG8gLW5lICdhYmNceDMnIHwgY2tzdW0gLU4iICIxMjE5MTMxNTU0IDRcbiIgIiIgIiIKKworIyBja3N1bSBvbiBubyBjb250ZW50cyBnaXZlcyAweGZmZmZmZmZmICg9NDI5NDk2NzI5NSkKK3Rlc3RpbmcgIm9uIG5vIGRhdGEgcG9zdC1pbnZlcnNpb24iICJlY2hvIC1uICIiIHwgY2tzdW0iICI0Mjk0OTY3Mjk1IDBcbiIgIiIgIiIKKyMgSWYgd2UgZG8gcHJlaW52ZXJzaW9uIHdlIHdpbGwgdGhlbiBnZXQgMC4KK3Rlc3RpbmcgIm9uIG5vIGRhdGEgcHJlK3Bvc3QtaW52ZXJzaW9uIiAiZWNobyAtbiAiIiB8IGNrc3VtIC1QIiAiMCAwXG4iICIiICIiCisjIElmIHdlIHNraXAgdGhlIHBvc3QtaW52ZXJzaW9uIHdlIGFsc28gZ2V0IDAKK3Rlc3RpbmcgIm9uIG5vIGRhdGEgbm8gaW52ZXJzaW9uIiAiZWNobyAtbiAiIiB8IGNrc3VtIC1JIiAiMCAwXG4iICIiICIiCisjIFR3byB3cm9uZ3MgbWFrZSBhIHJpZ2h0LgordGVzdGluZyAib24gbm8gZGF0YSBwcmUtaW52ZXJzaW9uIiAiZWNobyAtbiAiIiB8IGNrc3VtIC1QSSIgIjQyOTQ5NjcyOTUgMFxuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2NtcC50ZXN0IGIvdG95Ym94L3Rlc3RzL2NtcC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzZThmNWIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvY21wLnRlc3QKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKK3Rlc3RpbmcgIm5vdCBlbm91Z2ggYXJndW1lbnRzIFtmYWlsXSIgImNtcCBpbnB1dCAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiZm9vIiAiIgordGVzdGluZyAibWlzc2luZyBmaWxlMSBbZmFpbF0iICJjbXAgZmlsZTEgaW5wdXQgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgImZvbyIgIiIKKworI21rZGlyIGRpcgorI3Rlc3RpbmcgImRpcmVjdG9yeSBbZmFpbF0iICJjbXAgZGlyIGRpciAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgXAorCSMieWVzXG4iICIiICIiCisjcm1kaXIgZGlyCisKK2VjaG8gImFiCitjIiA+IGlucHV0MgorCit0ZXN0aW5nICJpZGVudGljYWwgZmlsZXMsIHN0ZG91dCIgImNtcCBpbnB1dCBpbnB1dDIiICIiICJhYlxuY1xuIiAiIgordGVzdGluZyAiaWRlbnRpY2FsIGZpbGVzLCByZXR1cm4gY29kZSIgImNtcCBpbnB1dCBpbnB1dDIgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgImFiXG5jXG4iICIiCisKK3Rlc3RpbmcgIkVPRiwgc3RkZXJyIiAiY21wIGlucHV0IGlucHV0MiAyPiYxIiAiY21wOiBFT0Ygb24gaW5wdXQyXG4iICJhYlxuY1xueCIgIiIKK3Rlc3RpbmcgIkVPRiwgcmV0dXJuIGNvZGUiICJjbXAgaW5wdXQgaW5wdXQyIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICJhYlxuY1xueCIgIiIKKyMgVGhlIGdudS9kYW1taXQgdmVyc2lvbiBmYWlscyB0aGlzIGJlY2F1c2UgcG9zaXggc2F5cyAiY2hhciIgYW5kIHRoZXkgZG9uJ3QuCit0ZXN0aW5nICJkaWZmLCBzdGRvdXQiICJjbXAgaW5wdXQgaW5wdXQyIiAiaW5wdXQgaW5wdXQyIGRpZmZlcjogY2hhciA0LCBsaW5lIDJcbiIgImFiXG54XG54IiAiIgordGVzdGluZyAiZGlmZiwgcmV0dXJuIGNvZGUiICJjbXAgaW5wdXQgaW5wdXQyID4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICJhYlxueFxueCIgIiIKKwordGVzdGluZyAiLXMgRU9GLCByZXR1cm4gY29kZSIgImNtcCAtcyBpbnB1dCBpbnB1dDIgfHwgZWNobyB5ZXMiICAieWVzXG4iICJhYlxuY1xueCIgIiIKK3Rlc3RpbmcgIi1zIGRpZmYsIHJldHVybiBjb2RlIiAiY21wIC1zIGlucHV0IGlucHV0MiB8fCBlY2hvIHllcyIgInllc1xuIiAiYWJcbnhcbngiICIiCisKK3Rlc3RpbmcgIi1sIEVPRiwgc3RkZXJyIiAiY21wIC1sIGlucHV0IGlucHV0MiAyPiYxIiAiY21wOiBFT0Ygb24gaW5wdXQyXG4iICJhYlxuY1xueCIgIiIKK3Rlc3RpbmcgIi1sIGRpZmYgYW5kIEVPRiwgc3Rkb3V0IGFuZCBzdGRlcnIiICJjbXAgLWwgaW5wdXQgaW5wdXQyIDI+JjEgfCBzb3J0IiAiNCAxNzAgMTQzXG5jbXA6IEVPRiBvbiBpbnB1dDJcbiIgImFiXG54XG54IiAiIgorCitybSBpbnB1dDIKKwordGVzdGluZyAic3RkaW4gYW5kIGZpbGUiICJjbXAgaW5wdXQgLSIgImlucHV0IC0gZGlmZmVyOiBjaGFyIDQsIGxpbmUgMlxuIiAiYWJcbmNcbiIgImFiXG54XG4iCisjdGVzdGluZyAic3RkaW4gYW5kIHN0ZGluIiAiY21wIGlucHV0IC0iICIiICIiICJhYlxuY1xuIgorCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvY3AudGVzdCBiL3RveWJveC90ZXN0cy9jcC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiODllMmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvY3AudGVzdApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyMgQ3JlYXRlIHRlc3QgZmlsZQorZGQgaWY9L2Rldi91cmFuZG9tIG9mPXJhbmRvbSBicz02NCBjb3VudD0xIDI+IC9kZXYvbnVsbAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAibm90IGVub3VnaCBhcmd1bWVudHMgW2ZhaWxdIiAiY3Agb25lIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgordGVzdGluZyAiLW1pc3Npbmcgc291cmNlIFtmYWlsXSIgImNwIG1pc3NpbmcgdHdvIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgordGVzdGluZyAiZmlsZS0+ZmlsZSIgImNwIHJhbmRvbSB0d28gJiYgY21wIHJhbmRvbSB0d28gJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitybSB0d28KKworbWtkaXIgdHdvCit0ZXN0aW5nICJmaWxlLT5kaXIiICJjcCByYW5kb20gdHdvICYmIGNtcCByYW5kb20gdHdvL3JhbmRvbSAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3JtIHR3by9yYW5kb20KK3Rlc3RpbmcgImZpbGUtPmRpci9maWxlIiBcCisJImNwIHJhbmRvbSB0d28vcmFuZG9tICYmIGNtcCByYW5kb20gdHdvL3JhbmRvbSAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1yIGRpci0+bWlzc2luZyIgXAorCSJjcCAtciB0d28gdGhyZWUgJiYgY21wIHJhbmRvbSB0aHJlZS9yYW5kb20gJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCit0b3VjaCB3YWxydXMKK3Rlc3RpbmcgIi1yIGRpci0+ZmlsZSBbZmFpbF0iIFwKKwkiY3AgLXIgdHdvIHdhbHJ1cyAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordG91Y2ggdHdvL3RocmVlCit0ZXN0aW5nICItciBkaXIgaGl0cyBmaWxlLiIgXAorCSJjcCAtciB0aHJlZSB0d28gMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiB0d28gdGhyZWUgd2FscnVzCisKK3RvdWNoIHR3bworY2htb2QgMDAwIHR3bwordGVzdGluZyAiZmlsZS0+aW5hY2Nlc3NhYmxlIFtmYWlsXSIgXAorCSJjcCByYW5kb20gdHdvIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybSAtZiB0d28KKwordG91Y2ggdHdvCitjaG1vZCAwMDAgdHdvCit0ZXN0aW5nICItZiBmaWxlLT5pbmFjY2Vzc2FibGUiIFwKKwkiY3AgLWYgcmFuZG9tIHR3byAmJiBjbXAgcmFuZG9tIHR3byAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorbWtkaXIgc3ViCitjaG1vZCAwMDAgc3ViCit0ZXN0aW5nICJmaWxlLT5pbmFjY2Vzc2FibGVfZGlyIFtmYWlsXSIgXAorCSJjcCByYW5kb20gc3ViIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybSB0d28KK3JtZGlyIHN1YgorCisjIFRoaXMgdGVzdCBmYWlscyBiZWNhdXNlIG91ciAtcmYgZGVsZXRlcyBleGlzdGluZyB0YXJnZXQgZmlsZXMgd2l0aG91dAorIyByZWdhcmQgdG8gd2hhdCB3ZSdkIGJlIGNvcHlpbmcgb3ZlciBpdC4gUG9zaXggc2F5cyB0byBvbmx5IGRvIHRoYXQgaWYKKyMgd2UnZCBiZSBjb3B5aW5nIGEgZmlsZSBvdmVyIHRoZSBmaWxlLCBidXQgZG9lcyBub3Qgc2F5IF93aHlfLgorCisjbWtkaXIgZGlyCisjdG91Y2ggZmlsZQorI3Rlc3RpbmcgIi1yZiBkaXIgZmlsZSBbZmFpbF0iICJjcCAtcmYgZGlyIGZpbGUgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKyMJInllc1xuIiAiIiAiIgorI3JtIC1yZiBkaXIgZmlsZQorCit0b3VjaCBvbmUgdHdvCit0ZXN0aW5nICJmaWxlMSBmaWxlMiBtaXNzaW5nIFtmYWlsXSIgXAorCSJjcCBvbmUgdHdvIG1pc3NpbmcgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK21rZGlyIGRpcgordGVzdGluZyAiZGlyIGZpbGUgbWlzc2luZyBbZmFpbF0iIFwKKwkiY3AgZGlyIHR3byBtaXNzaW5nIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICItcmYgZGlyIGZpbGUgbWlzc2luZyBbZmFpbF0iIFwKKwkiY3AgZGlyIHR3byBtaXNzaW5nIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJmaWxlMSBmaWxlMiBmaWxlIFtmYWlsXSIgXAorCSJjcCByYW5kb20gb25lIHR3byAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZmlsZTEgZmlsZTIgZGlyIiBcCisJImNwIHJhbmRvbSBvbmUgZGlyICYmIGNtcCByYW5kb20gZGlyL3JhbmRvbSAmJiBjbXAgb25lIGRpci9vbmUgJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitybSBvbmUgdHdvIHJhbmRvbQorcm0gLXJmIGRpcgorCitta2RpciAtcCBvbmUvdHdvL3RocmVlL2ZvdXIKK3RvdWNoIG9uZS90d28vdGhyZWUvZml2ZQordG91Y2ggb25lL3tzaXgsc2V2ZW4sZWlnaHR9Cit0ZXN0aW5nICItciAvYWJzcGF0aCBkZXN0IiBcCisJImNwIC1yIFwiJChyZWFkbGluayAtZiBvbmUpXCIgZGlyICYmIGRpZmYgLXIgb25lIGRpciAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1yIGRpciBhZ2FpbiIgImNwIC1yIG9uZS8uIGRpciAmJiBkaWZmIC1yIG9uZSBkaXIgJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitta2RpciBkaXIyCit0ZXN0aW5nICItciBkaXIxLyogZGlyMiIgXAorCSJjcCAtciBvbmUvKiBkaXIyICYmIGRpZmYgLXIgb25lIGRpcjIgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBvbmUgZGlyIGRpcjIKKworIyBjcCAtciAuLi9zb3VyY2UgZGVzdGRpcgorIyBjcCAtciBvbmUvdHdvL3RocmVlIG1pc3NpbmcKKyMgY3AgLXIgb25lL3R3by90aHJlZSB0d28KKyMgbWtkaXIgb25lOyB0b3VjaCBvbmUvdHdvOyBsbiAtcyB0d28gb25lL3RocmVlCisjIGNwIGZpbGUxIGZpbGUyIGRpcgorIyBjcCBmaWxlMSBtaXNzaW5nIGZpbGUyIC0+IGRpcgorCisjIE1ha2Ugc3VyZSBpdCdzIHRydW5jYXRpbmcgZXhpc3RpbmcgZmlsZQorIyBjb3B5IHdpdGggLWQgYXQgdG9wIGxldmVsLCB3aXRoIC1kIGluIGRpcmVjdG9yeSwgd2l0aG91dCAtZCBhdCB0b3AgbGV2ZWwsCisjICAgICAgd2l0aG91dCAtZCBpbiBkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9jcGlvLnRlc3QgYi90b3lib3gvdGVzdHMvY3Bpby50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxNThlZmEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvY3Bpby50ZXN0CkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjIFdlIG5lZWQgdG8gdGVzdCBuYW1lIGFuZCBmaWxlIHBhZGRpbmcuCisjIFRoaXMgbWVhbnMgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiBzdHJsZW4obmFtZSkrMSAlIDQsCisjIHBsdXMgZmlsZSBzaXplcyBvZiBhdCBsZWFzdCAwLTQuCisKK3RvdWNoIGEgYmIgY2NjIGRkZGQKK3Rlc3RpbmcgIm5hbWUgcGFkZGluZyIgImNwaW8gLW8gLUggbmV3Y3xjcGlvIC1pdCIgImFcbmJiXG5jY2NcbmRkZGRcbiIgIiIgImFcbmJiXG5jY2NcbmRkZGRcbiIKK3JtIGEgYmIgY2NjIGRkZGQKKwordG91Y2ggYQorcHJpbnRmICcxJyA+YgorcHJpbnRmICcyMicgPmMKK3ByaW50ZiAnMzMzJyA+ZAordGVzdGluZyAiZmlsZSBwYWRkaW5nIiAiY3BpbyAtbyAtSCBuZXdjfGNwaW8gLWl0IiAiYVxuYlxuY1xuZFxuIiAiIiAiYVxuYlxuY1xuZFxuIgorcm0gYSBiIGMgZAorCit0b3VjaCBhCitwcmludGYgJzEnID5iYgorcHJpbnRmICcyMicgPmNjYworcHJpbnRmICczMzMnID5kZGRkCisjIFdpdGggdGhlIHByb3BlciBwYWRkaW5nLCBoZWFkZXIgbGVuZ3RoLCBhbmQgZmlsZSBsZW5ndGgsIAorIyB0aGUgcmVsZXZhbnQgYml0IHNob3VsZCBiZSBoZXJlOgorIyAxMTAqNSArIDQqMyArIDIgKyA2KjMgPSA1NTAgKyAxMiArIDIwID0gNTgyCisjIGZpbGVzIGFyZSBwYWRkZWQgdG8gbio0LCBuYW1lcyBhcmUgcGFkZGVkIHRvIDIgKyBuKjQgZHVlIHRvIHRoZSBoZWFkZXIgbGVuZ3RoCit0ZXN0aW5nICJhcmNoaXZlIGxlbmd0aCIgImNwaW8gLW8gLUggbmV3Y3xkZCBpYnM9MiBza2lwPTI5MSBjb3VudD01IDI+L2Rldi9udWxsIiAiVFJBSUxFUiEhISIgIiIgImFcbmJiXG5jY2NcbmRkZGRcbiIKK3Rlc3RpbmcgImFyY2hpdmUgbWFnaWMiICJjcGlvIC1vIC1IIG5ld2N8ZGQgaWJzPTIgY291bnQ9MyAyPi9kZXYvbnVsbCIgIjA3MDcwMSIgIiIgImFcbiIKKyMgY2hlY2sgbmFtZSBsZW5ndGggKDggYnl0ZXMgYmVmb3JlIHRoZSBlbXB0eSAiY3JjIikKK3Rlc3RpbmcgIm5hbWUgbGVuZ3RoIiAiY3BpbyAtbyAtSCBuZXdjfGRkIGlicz0yIHNraXA9NDcgY291bnQ9NCAyPi9kZXYvbnVsbCIgIjAwMDAwMDAyIiAiIiAiYVxuIgorcm0gYSBiYiBjY2MgZGRkZAorCisjIGFyY2hpdmUgZGFuZ2xpbmcgc3ltbGlua3MgYW5kIGVtcHR5IGZpbGVzIGV2ZW4gaWYgd2UgY2Fubm90IG9wZW4gdGhlbQordG91Y2ggYTsgY2htb2QgYS1yd3ggYTsgbG4gLXMgYS9jYW50IGIKK3Rlc3RpbmcgImFyY2hpdmVzIHVucmVhZGFibGUgZW1wdHkgZmlsZXMiICJjcGlvIC1vIC1IIG5ld2N8Y3BpbyAtaXQiICJhXG5iXG4iICIiICJhXG5iXG4iCitjaG1vZCB1K3J3IGE7IHJtIC1mIGEgYgorCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9jdXQudGVzdCBiL3RveWJveC90ZXN0cy9jdXQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODRhY2VhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2N1dC50ZXN0CkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTMgUm9iaW4gTWl0dGFsIDxyb2Jpbm1pdHRhbC5pdEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzICBLeXVuZ3dhbi5IYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorI3NldCAteAorCisjIENyZWF0aW5nIHRlc3QgZmlsZSBmb3IgdGVzdGluZyBjdXQKK2VjaG8gIm9uZTp0d286dGhyZWU6Zm91cjpmaXZlOnNpeDpzZXZlbgorYWxwaGE6YmV0YTpnYW1tYTpkZWx0YTplcHNpbG9uOnpldGE6ZXRhOnRldGE6aW90YTprYXBwYTpsYW1iZGE6bXUKK3RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2ciID5hYmMudHh0CisKK3Rlc3RpbmcgIndpdGggLWMgKGEtYikiICJjdXQgLWMgNC0xMCBhYmMudHh0IiAiOnR3bzp0aFxuaGE6YmV0YVxuIHF1aWNrIFxuIiAiIiAiIgordGVzdGluZyAid2l0aCAtZiAoYS0pIiAiY3V0IC1kICc6JyAtZiA1LSBhYmMudHh0IiAiZml2ZTpzaXg6c2V2ZW5cbmVwc2lsb246emV0YTpldGE6dGV0YTppb3RhOmthcHBhOmxhbWJkYTptdVxudGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ1xuIiAiIiAiIgorCit0ZXN0aW5nICJ3aXRoIC1mIChhKSIgImN1dCAtZCAnICcgLWYgMyBhYmMudHh0IiAib25lOnR3bzp0aHJlZTpmb3VyOmZpdmU6c2l4OnNldmVuXG5hbHBoYTpiZXRhOmdhbW1hOmRlbHRhOmVwc2lsb246emV0YTpldGE6dGV0YTppb3RhOmthcHBhOmxhbWJkYTptdVxuYnJvd25cbiIgIiIgIiIKKwordGVzdGluZyAid2l0aCBlY2hvLCAtYyAoYS1iKSIgImVjaG8gJ3JlZl9jYXRlZ29yaWU9dGVzdCcgfCBjdXQgLWMgMS0xNSAiICJyZWZfY2F0ZWdvcmllPXRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggZWNobywgLWMgKGEpIiAiZWNobyAncmVmX2NhdGVnb3JpZT10ZXN0JyB8IGN1dCAtYyAxNCIgIj1cbiIgIiIgIiIKKworIyBNb2RpZnlpbmcgYWJjLnR4dCBkYXRhIGFzIHBlciBuZXcgdGVzdGNhc2UKK2VjaG8gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiA+YWJjLnR4dAorCit0ZXN0aW5nICJ3aXRoIC1jIChhLGIsYykiICJjdXQgLWMgNCw1LDIwIGFiYy50eHQiICJkZXRcbiIgIiIgIiIKKwordGVzdGluZyAid2l0aCAtYiAoYSxiLGMpIiAiY3V0IC1iIDQsNSwyMCBhYmMudHh0IiAiZGV0XG4iICIiICIiCisKKyMgTW9kaWZ5aW5nIGFiYy50eHQgZGF0YSBhcyBwZXIgdGVzdGNhc2UKK2VjaG8gIjQwNjM3ODpTYWxlczpJdG9ycmU6SmFuCiswMzE3NjI6TWFya2V0aW5nOk5hc2l1bTpKaW0KKzYzNjQ5NjpSZXNlYXJjaDpBbmNob2xpZTpNZWwKKzM5NjA4MjpTYWxlczpKdWNhY2lvbjpFZCIgPmFiYy50eHQKKwordGVzdGluZyAid2l0aCAtZCAtZig6KSAtcyIgImN1dCAtZDogLWYzIC1zIGFiYy50eHQiICJJdG9ycmVcbk5hc2l1bVxuQW5jaG9saWVcbkp1Y2FjaW9uXG4iICIiICIiCisKK3Rlc3RpbmcgIndpdGggLWQgLWYoICkgLXMiICJjdXQgLWQnICcgLWYzIC1zIGFiYy50eHQgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKKwordGVzdGluZyAid2l0aCAtZCAtZihhKSAtcyIgImN1dCAtZGEgLWYzIC1zIGFiYy50eHQiICJuXG5zaXVtOkppbVxuXG5jaW9uOkVkXG4iICIiICIiCisKK3Rlc3RpbmcgIndpdGggLWQgLWYoYSkgLXMgLW4iICJjdXQgLWRhIC1mMyAtcyAtbiBhYmMudHh0IiAiblxuc2l1bTpKaW1cblxuY2lvbjpFZFxuIiAiIiAiIgorCisjIFJlbW92aW5nIGFiYy50eHQgZmlsZSBmb3IgY2xlYW51cCBwdXJwb3NlCitybSBhYmMudHh0CmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZGF0ZS50ZXN0IGIvdG95Ym94L3Rlc3RzL2RhdGUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMxNzRlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2RhdGUudGVzdApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgVGVzdCBVbml4IGRhdGUgcGFyc2luZy4KK3Rlc3RpbmcgIi1kIEAwIiAiVFo9VVRDIGRhdGUgLWQgQDAgMj4mMSIgIlRodSBKYW4gIDEgMDA6MDA6MDAgR01UIDE5NzBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIEAweDEyMyIgIlRaPVVUQyBkYXRlIC1kIEAweDEyMyAyPiYxIiAiZGF0ZTogYmFkIGRhdGUgJ0AweDEyMydcbiIgIiIgIiIKKworIyBUZXN0IGJhc2ljIGRhdGUgcGFyc2luZy4KKyMgTm90ZSB0aGF0IHRveWJveCdzIC1kIGZvcm1hdCBpcyBub3QgdGhlIHNhbWUgYXMgY29yZXV0aWxzJy4KK3Rlc3RpbmcgIi1kIDA2MDIxMjM0IiAiVFo9VVRDIGRhdGUgLWQgMDYwMjEyMzQgMj4mMSIgIlN1biBKdW4gIDIgMTI6MzQ6MDAgVVRDIDE5MDBcbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIDA2MDIxMjM0MTk4MiIgIlRaPVVUQyBkYXRlIC1kIDA2MDIxMjM0MTk4MiAyPiYxIiAiU3VuIEp1biAgMiAxMjozNDowMCBVVEMgMTk4MlxuIiAiIiAiIgordGVzdGluZyAiLWQgMTIzIiAiVFo9VVRDIGRhdGUgLWQgMTIzIDI+JjEiICJkYXRlOiBiYWQgZGF0ZSAnMTIzJ1xuIiAiIiAiIgorCisjIFRlc3QgcGFyc2luZyAyLSBhbmQgNC1kaWdpdCB5ZWFycy4KK3Rlc3RpbmcgIi1kIDExMTAxNDMxMTUuMzAiICJUWj1VVEMgZGF0ZSAtZCAxMTEwMTQzMTE1LjMwIDI+JjEiICJTdW4gTm92IDEwIDE0OjMxOjMwIFVUQyAxOTE1XG4iICIiICIiCit0ZXN0aW5nICItZCAxMTEwMTQzMTIwMTUuMzAiICJUWj1VVEMgZGF0ZSAtZCAxMTEwMTQzMTIwMTUuMzAgMj4mMSIgIlN1biBOb3YgMTAgMTQ6MzE6MzAgVVRDIDIwMTVcbiIgIiIgIiIKKworIyBBY2NpZGVudGFsbHkgZ2l2ZW4gYSBVbml4IHRpbWUsIHdlIHNob3VsZCB0cml2aWFsbHkgcmVqZWN0IHRoYXQuCit0ZXN0aW5nICJVbml4IHRpbWUgbWlzc2luZyBAIiAiVFo9VVRDIGRhdGUgMTQzODA1MzE1NyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vIiBcCisgICJub1xuIiAiIiAiIgorIyBCdXQgc29tZSBpbnZhbGlkIGRhdGVzIGFyZSBtb3JlIHN1YnRsZSwgbGlrZSBGZWJ1YXJ5IDI5dGggaW4gYSBub24tbGVhcCB5ZWFyLgordGVzdGluZyAiRmViIDI5dGgiICJUWj1VVEMgZGF0ZSAwMjI5MDAwMDE5NzUgMj4vZGV2L251bGwgfHwgZWNobyBubyIgXAorICAibm9cbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9kZC50ZXN0IGIvdG95Ym94L3Rlc3RzL2RkLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRhMjEwOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9kZC50ZXN0CkBAIC0wLDAgKzEsOTMgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTMgUm9iaW4gTWl0dGFsIDxyb2Jpbm1pdHRhbC5pdEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjICdkZCcgY29tbWFuZCwgc3RkZXJyIHByaW50cyByZWRpcmVjdGluZyB0byAvZGV2L251bGwKK29wdD0iMj4vZGV2L251bGwiCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIFRlc3Qgc3VmZml4ZWQgbnVtYmVyIHBhcnNpbmc7IGBjb3VudGAgaXMgcmVwcmVzZW50YXRpdmUuCit0ZXN0aW5nICJjb3VudD0yIiAiZGQgaWY9aW5wdXQgY291bnQ9MiBpYnM9MSAkb3B0IiAiaGkiICJoaWdoXG4iICIiCit0ZXN0aW5nICJjb3VudD0gMiIgImRkIGlmPWlucHV0ICdjb3VudD0gMicgaWJzPTEgJG9wdCIgImhpIiAiaGlnaFxuIiAiIgordGVzdGluZyAiY291bnQ9MHgyIiAiZGQgaWY9aW5wdXQgJ2NvdW50PTB4MicgaWJzPTEgJG9wdCIgImhpIiAiaGlnaFxuIiAiIgordGVzdGluZyAiY291bnQ9LTIiICJkZCBpZj1pbnB1dCAnY291bnQ9LTInIGlicz0xIDI+JjEiICJkZDogaW52YWxpZCBudW1iZXIgJy0yJ1xuIiAiIiAiIgorCit0ZXN0aW5nICJpZj0oZmlsZSkiICJkZCBpZj1pbnB1dCAkb3B0IiAiSSBXQU5UXG4iICJJIFdBTlRcbiIgIiIKK3Rlc3RpbmcgIm9mPShmaWxlKSIgImRkIG9mPWZpbGUgJG9wdCAmJiBjYXQgZmlsZSIgIkkgV0FOVFxuIiAiIiAiSSBXQU5UXG4iCit0ZXN0aW5nICJpZj1maWxlIG9mPWZpbGUiICJkZCBpZj1pbnB1dCBvZj1mb28gJG9wdCAmJiBjYXQgZm9vICYmIHJtIC1mIGZvbyIgXAorICAiSSBXQU5UXG4iICJJIFdBTlRcbiIgIiIKK3Rlc3RpbmcgImlmPWZpbGUgfCBkZCBvZj1maWxlIiAiZGQgaWY9aW5wdXQgJG9wdCB8IGRkIG9mPWZvbyAkb3B0ICYmCisgICBjYXQgZm9vICYmIHJtIC1mIGZvbyIgIkkgV0FOVFxuIiAiSSBXQU5UXG4iICIiCit0ZXN0aW5nICIoc3Rkb3V0KSIgImRkICRvcHQiICJJIFdBTlRcbiIgIiIgIkkgV0FOVFxuIgordGVzdGluZyAic3luYyxub2Vycm9yIiBcCisgICJkZCBpZj1pbnB1dCBvZj1vdXRGaWxlIHNlZWs9ODg2MCBicz0xTSBjb252PXN5bmMsbm9lcnJvciAkb3B0ICYmCisgICBzdGF0IC1jIFwiJXNcIiBvdXRGaWxlICYmIHJtIC1mIG91dEZpbGUiICI5MjkxNDMxOTM2XG4iICJJIFdBTlRcbiIgIiIKK3Rlc3RpbmcgImlmPWZpbGUgb2Y9KG51bGwpIiBcCisgICJkZCBpZj1pbnB1dCBvZj0vZGV2L251bGwgJG9wdCAmJiBlY2hvICd5ZXMnIiAieWVzXG4iICJJIFdBTlRcbiIgIiIKK3Rlc3RpbmcgIndpdGggaWYgb2YgYnMiIFwKKyAgImRkIGlmPS9kZXYvemVybyBvZj1zZGEudHh0IGJzPTUxMiBjb3VudD0xICRvcHQgJiYKKyAgIHN0YXQgLWMgJyVzJyBzZGEudHh0ICYmIHJtIC1mIHNkYS50eHQiICI1MTJcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggaWYgb2YgaWJzIG9icyIgXAorICAiZGQgaWY9L2Rldi96ZXJvIG9mPXNkYS50eHQgaWJzPTUxMiBvYnM9MjU2IGNvdW50PTEgJG9wdCAmJgorICAgc3RhdCAtYyAnJXMnIHNkYS50eHQgJiYgcm0gLWYgc2RhLnR4dCIgIjUxMlxuIiAiIiAiIgordGVzdGluZyAid2l0aCBpZiBvZiBpYnMgb2JzIGNvdW50IiBcCisgICJkZCBpZj0vZGV2L3plcm8gb2Y9c2RhLnR4dCBpYnM9NTEyIG9icz0yNTYgY291bnQ9MyAkb3B0ICYmCisgICBzdGF0IC1jICclcycgc2RhLnR4dCAmJiBybSAtZiBzZGEudHh0IiAiMTUzNlxuIiAiIiAiIgorCitsbiAtcyBpbnB1dCBzb2Z0bGluawordGVzdGluZyAiaWY9c29mdGxpbmsiICJkZCBpZj1zb2Z0bGluayAkb3B0IiAiSSBXQU5UXG4iICJJIFdBTlRcbiIgIiIKK3VubGluayBzb2Z0bGluaworCitsbiAtcyBmaWxlIHNvZnRsaW5rCit0ZXN0aW5nICJpZj1maWxlIG9mPXNvZnRsaW5rIiAiZGQgaWY9aW5wdXQgb2Y9c29mdGxpbmsgJG9wdCAmJgorICAgWyAtZiBmaWxlIC1hIC1MIHNvZnRsaW5rIF0gJiYgY2F0IHNvZnRsaW5rIiAiSSBXQU5UXG4iICJJIFdBTlRcbiIgIiIKK3VubGluayBzb2Z0bGluayAmJiBybSAtZiBmaWxlCisKK3Rlc3RpbmcgImlmPWZpbGUgb2Y9ZmlsZSAoc2FtZSBmaWxlKSIgImRkIGlmPWlucHV0IG9mPWlucHV0ICRvcHQgJiYKKyAgIFsgLWYgaW5wdXQgXSAmJiBjYXQgaW5wdXQgJiYgZWNobyAneWVzJyIgInllc1xuIiAiSSBXQU5UXG4iICIiCit0ZXN0aW5nICJzYW1lIGZpbGUgbm90cnVuYyIgXAorICAiZGQgaWY9aW5wdXQgb2Y9aW5wdXQgY29udj1ub3RydW5jICRvcHQgJiYgY2F0IGlucHV0IiBcCisgICJJIFdBTlRcbiIgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJ3aXRoIGlicyBvYnMgYnMiICJkZCBpYnM9MiBvYnM9NSBicz05ICRvcHQiICJJIFdBTlRcbiIgIiIgIkkgV0FOVFxuIgordGVzdGluZyAid2l0aCBpYnMgb2JzIGJzIGlmIiAiZGQgaWJzPTIgb2JzPTUgYnM9OSBpZj1pbnB1dCAkb3B0IiBcCisgICJJIFdBTlRcbiIgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJ3aXRoIGlicyBvYnMgY291bnQiICJkZCBpYnM9MSBvYnM9MSBjb3VudD0xICRvcHQiICJJIiAiIiAiSSBXQU5UXG4iCit0ZXN0aW5nICJ3aXRoIGlicyBvYnMgY291bnQgaWYiICJkZCBpYnM9MSBvYnM9MSBjb3VudD0zIGlmPWlucHV0ICRvcHQiIFwKKyAgIkkgVyIgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJ3aXRoIGNvdW50IiAiZGQgY291bnQ9MSAkb3B0IiAiSSBXQU5UXG4iICIiICJJIFdBTlRcbiIKK3Rlc3RpbmcgIndpdGggY291bnQgaWYiICJkZCBjb3VudD0xIGlmPWlucHV0ICRvcHQiICJJIFdBTlRcbiIgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJ3aXRoIHNraXAiICJkZCBza2lwPTAgJG9wdCIgIkkgV0FOVFxuIiAiIiAiSSBXQU5UXG4iCit0ZXN0aW5nICJ3aXRoIHNraXAgaWYiICJkZCBza2lwPTAgaWY9aW5wdXQgJG9wdCIgIkkgV0FOVFxuIiAiSSBXQU5UXG4iICIiCisKK3Rlc3RpbmcgIndpdGggc2VlayIgImRkIHNlZWs9MCAkb3B0IiAiSSBXQU5UXG4iICIiICJJIFdBTlRcbiIKK3Rlc3RpbmcgIndpdGggc2VlayBpZiIgImRkIHNlZWs9MCBpZj1pbnB1dCAkb3B0IiAiSSBXQU5UXG4iICJJIFdBTlRcbiIgIiIKKworIyBUZXN0aW5nIG9ubHkgJ25vdHJ1bmMnLCAnbm9lcnJvcicsICdmc3luYycsICdzeW5jJworCit0ZXN0aW5nICJjb252PW5vdHJ1bmMiICJkZCBjb252PW5vdHJ1bmMgJG9wdCIgIkkgV0FOVFxuIiAiIiAiSSBXQU5UXG4iCit0ZXN0aW5nICJjb252PW5vdHJ1bmMgd2l0aCBJRiIgImRkIGNvbnY9bm90cnVuYyBpZj1pbnB1dCAkb3B0IiAiSSBXQU5UXG4iIFwKKyAgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJjb252PW5vZXJyb3IiICJkZCBjb252PW5vZXJyb3IgJG9wdCIgIkkgV0FOVFxuIiAiIiAiSSBXQU5UXG4iCit0ZXN0aW5nICJjb252PW5vZXJyb3Igd2l0aCBJRiIgImRkIGNvbnY9bm9lcnJvciBpZj1pbnB1dCAkb3B0IiAiSSBXQU5UXG4iIFwKKyAgIkkgV0FOVFxuIiAiIgorCit0ZXN0aW5nICJjb252PWZzeW5jIiAiZGQgY29udj1mc3luYyAkb3B0IiAiSSBXQU5UXG4iICIiICJJIFdBTlRcbiIKK3Rlc3RpbmcgImNvbnY9ZnN5bmMgd2l0aCBJRiIgImRkIGNvbnY9ZnN5bmMgaWY9aW5wdXQgJG9wdCIgIkkgV0FOVFxuIiBcCisgICJJIFdBTlRcbiIgIiIKKwordGVzdGluZyAiY29udj1zeW5jIiAiZGQgY29udj1zeW5jICRvcHQgfCBoZWFkIC1uIDEiICJJIFdBTlRcbiIgIiIgIkkgV0FOVFxuIgordGVzdGluZyAiY29udj1zeW5jIHdpdGggSUYiICJkZCBjb252PXN5bmMgaWY9aW5wdXQgJG9wdCB8IGhlYWQgLW4gMSIgIkkgV0FOVFxuIiBcCisgICJJIFdBTlRcbiIgIiIKKworIyBzdGF0dXM9bm94ZmVyfG5vbmUKK3Rlc3RpbmcgInN0YXR1cz1ub3hmZXIiICJkZCBpZj1pbnB1dCBzdGF0dXM9bm94ZmVyIGlicz0xIDI+JjEiICJpbnB1dFxuNiswIHJlY29yZHMgaW5cbjArMSByZWNvcmRzIG91dFxuIiAiaW5wdXRcbiIgIiIKK3Rlc3RpbmcgInN0YXR1cz1ub25lIiAiZGQgaWY9aW5wdXQgc3RhdHVzPW5vbmUgaWJzPTEgMj4mMSIgImlucHV0XG4iICJpbnB1dFxuIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2RpZmYudGVzdCBiL3RveWJveC90ZXN0cy9kaWZmLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2EwYjY4MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9kaWZmLnRlc3QKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3NlcSAxMCA+IGxlZnQKK3NlcSAxMSA+IHJpZ2h0CisKK2V4cGVjdGVkPSctLS0gbGVmdAorKysrIHJpZ2h0CitAQCAtOCwzICs4LDQgQEAKKyA4CisgOQorIDEwCisrMTEKKycKKyMgSG0gdGhpcyBvbmx5IGdpdmVzIHVuaWZpZWQgZGlmZnM/Cit0ZXN0aW5nICJzaW1wbGUiICJkaWZmIGxlZnQgcmlnaHQiICIkZXhwZWN0ZWQiICIiICIiCisKKworZXhwZWN0ZWQ9Jy0tLSB0cmVlMS9maWxlCisrKysgdHJlZTIvZmlsZQorQEAgLTEgKzEgQEAKKy1mb28KKytmb29kCisnCitta2RpciAtcCB0cmVlMSB0cmVlMgorZWNobyBmb28gPiB0cmVlMS9maWxlCitlY2hvIGZvb2QgPiB0cmVlMi9maWxlCisKK3Rlc3RpbmcgInNpbXBsZSIgImRpZmYgLXIgdHJlZTEgdHJlZTIgfHRlZSBvdXQiICIkZXhwZWN0ZWQiICIiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZGlybmFtZS50ZXN0IGIvdG95Ym94L3Rlc3RzL2Rpcm5hbWUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZWE4OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2Rpcm5hbWUudGVzdApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgIi8tb25seSIgImRpcm5hbWUgLy8vLy8vLyIgIi9cbiIgIiIgIiIKK3Rlc3RpbmcgInRyYWlsaW5nIC8iICJkaXJuYW1lIGEvLy8vLy8iICIuXG4iICIiICIiCit0ZXN0aW5nICJjb21iaW5lZCIgImRpcm5hbWUgLy8vLy9hLy8vYi8vL2MvLy9kLy8vLy8iICIvLy8vL2EvLy9iLy8vY1xuIiAiIiAiIgordGVzdGluZyAiL2EvIiAiZGlybmFtZSAvLy8vL2EvLy8iICIvXG4iICIiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZHUudGVzdCBiL3RveWJveC90ZXN0cy9kdS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwOTYwNzQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZHUudGVzdApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgd2Ugb25seSB0ZXN0IHdpdGggLWsgc2luY2UgZ2V0dGluZyBQT1NJWCB2ZXJzaW9uIGlzIHZhcmlhYmxlCisjIFBPU0lYTFlfQ09SUkVDVCBpcyBzb21ldGltZXMgbmVlZGVkLCBzb21ldGltZXMgLVAgaXMgbmVlZGVkLAorIyB3aGlsZSAtayBpcyB0aGUgZGVmYXVsdCBvbiBtb3N0IExpbnV4IHN5c3RlbXMKKworbWtkaXIgLXAgZHVfdGVzdC90ZXN0IGR1XzIvZm9vCit0ZXN0aW5nICIobm8gb3B0aW9ucykiICJkdSAtayBkdV90ZXN0IiAiNFx0ZHVfdGVzdC90ZXN0XG44XHRkdV90ZXN0XG4iICIiICIiCit0ZXN0aW5nICItcyIgImR1IC1rIC1zIGR1X3Rlc3QiICI4XHRkdV90ZXN0XG4iICIiICIiCitsbiAtcyAuLi9kdV8yIGR1X3Rlc3QveHl6CisjICJkdSBzaGFsbCBjb3VudCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9saWMgbGluayIKKyMgVGhlIHRlc3RzIGFzc3VtZSB0aGF0IGxpa2UgZm9yIG1vc3QgUE9TSVggc3lzdGVtcyBzeW1ib2xpYworIyBsaW5rcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBpbm9kZSBzbyB0aGF0IHRoZQorIyBhbGxvY2F0ZWQgZmlsZSBzcGFjZSBpcyB6ZXJvLgordGVzdGluZyAiY291bnRzIHN5bWxpbmtzIHdpdGhvdXQgZm9sbG93aW5nIiAiZHUgLWtzIGR1X3Rlc3QiICI4XHRkdV90ZXN0XG4iICIiICIiCit0ZXN0aW5nICItTCBmb2xsb3dzIHN5bWxpbmtzIiAiZHUgLWtzTCBkdV90ZXN0IiAiMTZcdGR1X3Rlc3RcbiIgIiIgIiIKK2xuIC1zIC4gZHVfdGVzdC91cAordGVzdGluZyAiLUwgYXZvaWQgZW5kbGVzcyBsb29wIiAiZHUgLWtzTCBkdV90ZXN0IiAiMTZcdGR1X3Rlc3RcbiIgIiIgIiIKK3JtIGR1X3Rlc3QvdXAKKyMgaWYgLUggYW5kIC1MIGFyZSBzcGVjaWZpZWQsIHRoZSBsYXN0IHRha2VzIHByaW9yaXR5Cit0ZXN0aW5nICItSEwgZm9sbG93cyBzeW1saW5rcyIgImR1IC1rc0hMIGR1X3Rlc3QiICIxNlx0ZHVfdGVzdFxuIiAiIiAiIgordGVzdGluZyAiLUggZG9lcyBub3QgZm9sbG93IHVuc3BlY2lmaWVkIHN5bWxpbmtzIiAiZHUgLWtzSCBkdV90ZXN0IiAiOFx0ZHVfdGVzdFxuIiAiIiAiIgordGVzdGluZyAiLUxIIGRvZXMgbm90IGZvbGxvdyB1bnNwZWNpZmllZCBzeW1saW5rcyIgImR1IC1rc0xIIGR1X3Rlc3QiICI4XHRkdV90ZXN0XG4iICIiICIiCit0ZXN0aW5nICItSCBmb2xsb3dzIHNwZWNpZmllZCBzeW1saW5rcyIgImR1IC1rc0ggZHVfdGVzdC94eXoiICI4XHRkdV90ZXN0L3h5elxuIiAiIiAiIgorCitybSAtcmYgZHVfdGVzdCBkdV8yCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9lY2hvLnRlc3QgYi90b3lib3gvdGVzdHMvZWNoby50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4NDk5NjQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZWNoby50ZXN0CkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjIFRoaXMgb25lJ3MgdHJpY2t5IGJvdGggYmVjYXVzZSBlY2hvIGlzIGEgc2hlbGwgYnVpbHRpbiAoc28gJFBBVEggaXMKKyMgaXJyZWxldmFudCkgYW5kIGJlY2F1c2UgdGhlICJyZXN1bHQiIGZpZWxkIGlzIHBhcnNlZCB3aXRoIGVjaG8gLWUuCisjIFRvIG1ha2UgaXQgd29yaywgIiRDTUQiIGlzIGFuIGV4cGxpY2l0IHBhdGggdG8gdGhlIGNvbW1hbmQgYmVpbmcgdGVzdGVkLAorIyBzbyAicmVzdWx0IiBrZWVwcyB1c2luZyB0aGUgc2hlbGwgYnVpbHRpbiBidXQgd2UgdGVzdCB0aGUgb25lIGluIHRveWJveC4KKworQ01EPSIkKHdoaWNoIGVjaG8pIgorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAiZWNobyIgIiRDTUQgJiYgZWNobyB5ZXMiICJcbnllc1xuIiAiIiAiIgordGVzdGluZyAiMSAyIDMiICIkQ01EIG9uZSAgdHdvCXRocmVlIiAib25lIHR3byB0aHJlZVxuIiAiIiAiIgordGVzdGluZyAid2l0aCBzcGFjZXMiICIkQ01EICdvbmUgIHR3bwl0aHJlZSciIFwKKwkib25lICB0d28JdGhyZWVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1uIiAiJENNRCAtbiIgIiIgIiIgIiIKK3Rlc3RpbmcgIi1uIG9uZSIgIiRDTUQgLW4gb25lIiAib25lIiAiIiAiIgordGVzdGluZyAib25lIC1uIiAiJENNRCBvbmUgLW4iICJvbmUgLW5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1lbiIgIiRDTUQgLWVuICdvbmVcbnR3byciICJvbmVcbnR3byIgIiIgIiIKK3Rlc3RpbmcgIi0taGVsbG8iICIkQ01EIC0taGVsbG8iICItLWhlbGxvXG4iICIiICIiCit0ZXN0aW5nICItZSBhbGwiICIkQ01EIC1lICdcYVxiXGNcZlxuXHJcdFx2XFxcMDEyMyciIFwKKwkiXGFcYlxjXGZcblxyXHRcdlxcXDAxMjNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1uZXggaGVsbG8iICIkQ01EIC1uZXggaGVsbG8iICItbmV4IGhlbGxvXG4iICIiICIiCisKKyMgT2N0YWwgZm9ybWF0dGluZyB0ZXN0cwordGVzdGluZyAiLWUgb2N0YWwgdmFsdWVzIiBcCisJIiRDTUQgLW5lICdcMDEyMzQgXDAwNjAgXDA2MCBcMDEzMFwwMTMxXDAxMzIgXDA3N1wwMTInIiBcCisJIlM0IDAgMCBYWVogP1xuIiAiIiAiIgorCisjIEhleGFkZWNpbWFsIHZhbHVlIHRlc3RzCit0ZXN0aW5nICItZSBoZXhhZGVjaW1hbCB2YWx1ZXMiIFwKKwkiJENNRCAtbmUgJ1x4NTM0IFx4MzAgXHg1OFx4NTlceDVhIFx4M0ZceDBBJyJcCisJIlM0IDAgWFlaID9cbiIgIiIgIiIKKwordGVzdGluZyAiLWUgXHAiICIkQ01EIC1lICdcXHAnIiAiXFxwXG4iICIiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZXhwYW5kLnRlc3QgYi90b3lib3gvdGVzdHMvZXhwYW5kLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDkzZDA3MAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9leHBhbmQudGVzdApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vYmFzaAorCisjIFBPU0lYIDIwMDggY29tcGxpYW50IGV4cGFuZCB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMTIgYnkgSm9uYXRoYW4gQ2xhaXJlbWJhdWx0IDxqb25hdGhhbkBjbGFpcmVtYmF1bHQuZnI+CisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjIHNvbWUgYmFzaWMgdGVzdHMKKwordGVzdGluZyAiZGVmYXVsdCIgImV4cGFuZCBpbnB1dCIgIiAgICAgICAgZm9vICAgICBiYXJcbiIgIlx0Zm9vXHRiYXJcbiIgIiIKK3Rlc3RpbmcgImRlZmF1bHQgc3RkaW4iICJleHBhbmQiICAiICAgICAgICBmb28gICAgIGJhclxuIiAiIiAiXHRmb29cdGJhclxuIgordGVzdGluZyAic2luZ2xlIiAiZXhwYW5kIC10IDIgaW5wdXQiICIgIGZvbyBiYXJcbiIgIlx0Zm9vXHRiYXJcbiIgIiIKK3Rlc3RpbmcgInRhYmxpc3QiICJleHBhbmQgLXQgNSwxMCwxMiBpbnB1dCIgIiAgICAgZm9vICBiYXIgZm9vXG4iICJcdGZvb1x0YmFyXHRmb29cbiIgIiIKK3Rlc3RpbmcgImJhY2tzcGFjZSIgImV4cGFuZCBpbnB1dCIgImZvb2JhcmZvb1xiXGIgYmFyXG4iICJmb29iYXJmb29cYlxiXHRiYXJcbiIgIiIKKworIyBhZHZhbmNlZCB0ZXN0cworCitQT1c9MTUKK1RBQlNUT1A9MQorQklHVEFCPSIgIgorZm9yIGkgaW4gJChzZXEgJFBPVyk7IGRvCisgICAgQklHVEFCPSRCSUdUQUIkQklHVEFCCisgICAgVEFCU1RPUD0kWyRUQUJTVE9QKjJdCitkb25lCit0ZXN0aW5nICJsb25nIHRhYiBzaW5nbGUiICJleHBhbmQgLXQgJFRBQlNUT1AgaW5wdXQiICIke0JJR1RBQn1mb29cbiIgIlx0Zm9vXG4iICIiCit0ZXN0aW5nICJsb25nIHRhYiB0YWJsaXN0IiAiZXhwYW5kIC10ICRUQUJTVE9QLCRbVEFCU1RPUCs1XSBpbnB1dCIgXAorICAgICAgICAiJHtCSUdUQUJ9Zm9vICBiYXJcbiIgIlx0Zm9vXHRiYXJcbiIgIiIKKwordGVzdGluZyAibXVsdGlsaW5lIHNpbmdsZSIgImV4cGFuZCAtdCA0IGlucHV0IiAiZm9vIFxuICAgIGJhclxuIiAiZm9vXHRcblx0YmFyXG4iICIiCit0ZXN0aW5nICJtdWx0aWxpbmUgdGFibGlzdCIgImV4cGFuZCAtdCA0LDggaW5wdXQiIFwKKyAgICAgICAgImZvbyAgICAgYmFyXG4gICAgYmFyIGZvb1xuIiAiZm9vXHRcdGJhclxuXHRiYXJcdGZvb1xuIiAiIgorUE9XPTE1CitCSUdMSU5FPSJmb28gIgorZm9yIGkgaW4gJChzZXEgJFBPVyk7IGRvCisgICAgQklHTElORT0kQklHTElORSRCSUdMSU5FCitkb25lCitpZiBbICRQT1cgLWd0IDAgXTsgdGhlbgorICAgIEVYUEFORExJTkU9IiR7QklHTElORX0gICAgICAgIGZvb1xuIgorZWxzZQorICAgIEVYUEFORExJTkU9IiR7QklHTElORX0gICAgZm9vXG4iCitmaQorQklHTElORT0iJHtCSUdMSU5FfVx0Zm9vXG4iCit0ZXN0aW5nICJsb25nIGxpbmUgc2luZ2xlIiAiZXhwYW5kIGlucHV0IiBcCisgICAgICAgICIke0VYUEFORExJTkV9IiAiJEJJR0xJTkUiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZXhwci50ZXN0IGIvdG95Ym94L3Rlc3RzL2V4cHIudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYTNmZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2V4cHIudGVzdApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKwordGVzdGluZyAiaW50ZWdlciIgImV4cHIgNSIgIjVcbiIgIiIgIiIKK3Rlc3RpbmcgImludGVnZXIgbmVnYXRpdmUiICJleHByIC01IiAiLTVcbiIgIiIgIiIKK3Rlc3RpbmcgInN0cmluZyIgImV4cHIgYXN0cmluZyIgImFzdHJpbmdcbiIgIiIgIiIKK3Rlc3RpbmcgImFkZGl0aW9uIiAiZXhwciAxICsgMyIgIjRcbiIgIiIgIiIKK3Rlc3RpbmcgIjUgKyA2ICogMyIgImV4cHIgNSArIDYgXCogMyIgIjIzXG4iICIiICIiCit0ZXN0aW5nICIoIDUgKyA2ICkgKiAzIiAiZXhwciBcKCA1ICsgNiBcKSBcKiAzIiAiMzNcbiIgIiIgIiIKK3Rlc3RpbmcgIj4iICJleHByIDMgXD4gMiIgIjFcbiIgIiIgIiIKK3Rlc3RpbmcgIiogLyBzYW1lIHByaW9yaXR5IiAiZXhwciA0IFwqIDMgLyAyIiAgIjZcbiIgIiIgIiIKK3Rlc3RpbmcgIi8gKiBzYW1lIHByaW9yaXR5IiAiZXhwciAzIC8gMiBcKiA0IiAiNFxuIiAiIiAiIgordGVzdGluZyAiJiBiZWZvcmUgfCIgImV4cHIgMCBcfCAxIFwmIDAiICIwXG4iICIiICIiCit0ZXN0aW5nICJ8IGFmdGVyICYiICJleHByIDEgXHwgMCBcJiAwIiAiMVxuIiAiIiAiIgordGVzdGluZyAifCAmIHNhbWUgcHJpb3JpdHkiICJleHByIDAgXCYgMCBcfCAxIiAiMVxuIiAiIiAiIgordGVzdGluZyAiJSAqIHNhbWUgcHJpb3JpdHkiICJleHByIDMgJSAyIFwqIDQiICI0XG4iICIiICIiCit0ZXN0aW5nICIqICUgc2FtZSBwcmlvcml0eSIgImV4cHIgMyBcKiAyICUgNCIgIjJcbiIgIiIgIiIKK3Rlc3RpbmcgIj0gPiBzYW1lIHByaW9yaXR5IiAiZXhwciAwID0gMiBcPiAzIiAiMFxuIiAiIiAiIgordGVzdGluZyAiPiA9IHNhbWUgcHJpb3JpdHkiICJleHByIDMgXD4gMiA9IDEiICIxXG4iICIiICIiCisKK3Rlc3RpbmcgIjAwIHwgMSIgImV4cHIgMDAgXHwgMSIgIjFcbiIgIiIgIiIKK3Rlc3RpbmcgIi0wIHwgMSIgImV4cHIgLTAgXHwgMiIgIjJcbiIgIiIgIiIKK3Rlc3RpbmcgJyIiIHwgMScgJ2V4cHIgIiIgXHwgMycgIjNcbiIgIiIgIiIKK3Rlc3RpbmcgIi8gYnkgemVybyIgImV4cHIgMSAvIDAgMj4vZGV2L251bGw7IGVjaG8gXCQ/IiAiMlxuIiAiIiAiIgordGVzdGluZyAiJSBieSB6ZXJvIiAiZXhwciAxICUgMCAyPi9kZXYvbnVsbDsgZWNobyBcJD8iICIyXG4iICIiICIiCisKK3Rlc3RpbmcgInJlZ2V4IHBvc2l0aW9uIiAiZXhwciBhYjIxeHggOiAnW14wLTldKlswLTldKiciICI0XG4iICIiICIiCit0ZXN0aW5nICJyZWdleCBleHRyYWN0aW9uIiAiZXhwciBhYjIxeHggOiAnW14wLTldKlwoWzAtOV0qXCkuKiciICIyMVxuIiAiIiAiIgordGVzdGluZyAicmVnZXggbm8gbWF0Y2giICJleHByIGFiMjF4eCA6IHgiICIwXG4iICIiICIiCit0ZXN0aW5nICJsb25nIHN0ciIgImV4cHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogOiAnXCguKlwpJyA9IGEiICIwXG4iICIiICIiCisKKyMgcmVzdWx0IG9mICc6JyByZWdleCBtYXRjaCBjYW4gc3Vic2VxdWVudGx5IGJlIHVzZWQgZm9yIGFyaXRobWV0aWMKK3Rlc3RpbmcgInN0cmluZyBiZWNvbWVzIGludGVnZXIiICJleHByIGFiMjF4eCA6ICdbXjAtOV0qXChbMC05XSpcKScgKyAzIiBcCisJIjI0XG4iICIiICIiCisKK3Rlc3RpbmcgImludGVnZXIgY29tcGFyaXNvbiIgImV4cHIgLTMgXDwgLTIiICIxXG4iICIiICIiCit0ZXN0aW5nICJzdHJpbmcgY29tcGFyaXNvbiIgImV4cHIgLTMgXDwgLTJzIiAiMFxuIiAiIiAiIgordGVzdGluZyAiaW50ZWdlciBleHByZXNzaW9uIGNvbXBhcmlzb24iICJleHByIDIgLSA1IFw8IC0yIiAiMVxuIiAiIiAiIgorIyByZXN1bHQgb2YgYXJpdGhtZXRpYyBjYW4gc3Vic2VxdWVudGx5IGJlIGNvbXBhcmVkIGFzIGEgc3RyaW5nCit0ZXN0aW5nICJzdHJpbmcgZXhwciBjb21wYXJpc29uIiAiZXhwciAyIC0gNSBcPCAtMnMiICIwXG4iICIiICIiCisKK3Rlc3RpbmcgInBhcmVucyBhcm91bmQgbGl0ZXJhbCIgImV4cHIgXCggYSBcKSIgImFcbiIgIiIgIiIKKwordGVzdGluZyAiZXhpdCBjb2RlIHdoZW4gdHJ1ZSIgImV4cHIgYTsgZWNobyBcJD8iICJhXG4wXG4iICIiICIiCit0ZXN0aW5nICJleGl0IGNvZGUgd2hlbiBmYWxzZSIgImV4cHIgMDsgZWNobyBcJD8iICIwXG4xXG4iICIiICIiCit0ZXN0aW5nICJleGl0IGNvZGUgd2l0aCBzeW50YXggZXJyb3IiICJleHByIFwoIDI+L2Rldi9udWxsOyBlY2hvIFwkPyIgXAorCSIyXG4iICIiICIiCit0ZXN0aW5nICJleGl0IGNvZGUgd2hlbiBldmFsdWF0aW5nIHRvIDAiICJleHByIC0xICsgMTsgZWNobyBcJD8iICIwXG4xXG4iICIiICIiCisKKyMgQlVHOiBzZWdmYXVsdHMgYmVjYXVzZSAnMycgaXMgY29lcmNlZCB0byBpbnRlZ2VyIGFuZCByZWdleGMgZ2V0cyBOVUxMCit0ZXN0aW5nICJyZWdleCBzZWdmYXVsdCIgImV4cHIgMyA6ICdcKC5cKSciICIzXG4iICIiICIiCisKKyMgc3ludGF4IGVycm9ycwordGVzdGluZyAibm8gZXhwcmVzc2lvbiIgImV4cHIgMj4vZGV2L251bGw7IGVjaG8gXCQ/IiAiMlxuIiAiIiAiIgordGVzdGluZyAiZW1wdHkgKCkiICJleHByIFwoIFwpIDI+L2Rldi9udWxsOyBlY2hvIFwkPyIgIjJcbiIgIiIgIiIKK3Rlc3RpbmcgIm1pc3NpbmcgKSIgImV4cHIgXCggMSAyPi9kZXYvbnVsbDsgZWNobyBcJD8iICIyXG4iICIiICIiCit0ZXN0aW5nICJtaXNzaW5nIG91dGVyICkiICJleHByIFwoIDEgKyBcKCAyIFwqIDMgXCkgMj4vZGV2L251bGw7IGVjaG8gXCQ/IiBcCisJIjJcbiIgIiIgIiIKK3Rlc3RpbmcgImJhZCBvcGVyYXRvciIgImV4cHIgMSBAIDIgMj4vZGV2L251bGw7IGVjaG8gXCQ/IiAiMlxuIiAiIiAiIgordGVzdGluZyAiYWRqYWNlbnQgbGl0ZXJhbHMiICJleHByIDEgMiAyPi9kZXYvbnVsbDsgZWNobyBcJD8iICIyXG4iICIiICIiCit0ZXN0aW5nICJub24taW50ZWdlciBhcmd1bWVudCIgImV4cHIgMSArIGEgMj4vZGV2L251bGw7IGVjaG8gXCQ/IiAiMlxuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2ZhY3Rvci50ZXN0IGIvdG95Ym94L3Rlc3RzL2ZhY3Rvci50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlYzU1N2EKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmFjdG9yLnRlc3QKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICItMzIiICJmYWN0b3IgLTMyIiAiLTMyOiAtMSAyIDIgMiAyIDJcbiIgIiIgIiIKK3Rlc3RpbmcgIjAiICJmYWN0b3IgMCIgIjA6IDBcbiIgIiIgIiIKK3Rlc3RpbmcgIjEiICJmYWN0b3IgMSIgIjE6IDFcbiIgIiIgIiIKK3Rlc3RpbmcgIjIiICJmYWN0b3IgMiIgIjI6IDJcbiIgIiIgIiIKK3Rlc3RpbmcgIjMiICJmYWN0b3IgMyIgIjM6IDNcbiIgIiIgIiIKK3Rlc3RpbmcgIjQiICJmYWN0b3IgNCIgIjQ6IDIgMlxuIiAiIiAiIgordGVzdGluZyAiMTAwMDAwMDAwMTciICJmYWN0b3IgMTAwMDAwMDAwMTciIFwKKyAgICAgICAgIjEwMDAwMDAwMDE3OiAzIDMgMyA3IDcgNyAxMDc5Nzk3XG4iICIiICIiCit0ZXN0aW5nICIxMDAwMDAwMDAxOCIgImZhY3RvciAxMDAwMDAwMDAxOCIgXAorICAgICAgICAiMTAwMDAwMDAwMTg6IDIgMTMxIDUyMSA3MzI1OVxuIiAiIiAiIgordGVzdGluZyAiMTAwMDAwMDAwMTkiICJmYWN0b3IgMTAwMDAwMDAwMTkiIFwKKyAgICAgICAgIjEwMDAwMDAwMDE5OiAxMDAwMDAwMDAxOVxuIiAiIiAiIgorCit0ZXN0aW5nICIzIDYgZnJvbSBzdGRpbiIgImZhY3RvciIgIjM6IDNcbjY6IDIgM1xuIiAiIiAiMyA2IgordGVzdGluZyAic3RkaW4gbmV3bGluZSIgImZhY3RvciIgIjM6IDNcbjY6IDIgM1xuIiAiIiAiM1xuNlxuIgorCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZS50ZXN0IGIvdG95Ym94L3Rlc3RzL2ZpbGUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQyODJmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGUudGVzdApAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3RvdWNoIGVtcHR5CitlY2hvICIjIS9iaW4vYmFzaCIgPiBiYXNoLnNjcmlwdAorZWNobyAiIyEgIC9iaW4vYmFzaCIgPiBiYXNoLnNjcmlwdDIKK2VjaG8gIiMhICAvdXNyL2Jpbi9lbnYgcHl0aG9uIiA+IGVudi5weXRob24uc2NyaXB0CitlY2hvICJIZWxsbywgd29ybGQhIiA+IGFzY2lpCitlY2hvICJjYWZlYmFiZTAwMDAwMDMxMDAwMCIgfCB4eGQgLXIgLXAgPiBqYXZhLmNsYXNzCisKK3Rlc3RpbmcgImVtcHR5IiAiZmlsZSBlbXB0eSIgImVtcHR5OiBlbXB0eVxuIiAiIiAiIgordGVzdGluZyAiYmFzaC5zY3JpcHQiICJmaWxlIGJhc2guc2NyaXB0IiAiYmFzaC5zY3JpcHQ6IC9iaW4vYmFzaCBzY3JpcHRcbiIgIiIgIiIKK3Rlc3RpbmcgImJhc2guc2NyaXB0IHdpdGggc3BhY2VzIiAiZmlsZSBiYXNoLnNjcmlwdDIiICJiYXNoLnNjcmlwdDI6IC9iaW4vYmFzaCBzY3JpcHRcbiIgIiIgIiIKK3Rlc3RpbmcgImVudiBweXRob24gc2NyaXB0IiAiZmlsZSBlbnYucHl0aG9uLnNjcmlwdCIgImVudi5weXRob24uc2NyaXB0OiBweXRob24gc2NyaXB0XG4iICIiICIiCit0ZXN0aW5nICJhc2NpaSIgImZpbGUgYXNjaWkiICJhc2NpaTogQVNDSUkgdGV4dFxuIiAiIiAiIgordGVzdGluZyAiamF2YSBjbGFzcyIgImZpbGUgamF2YS5jbGFzcyIgImphdmEuY2xhc3M6IEphdmEgY2xhc3MgZmlsZSwgdmVyc2lvbiA0OS4wXG4iICIiICIiCisKK3JtIGVtcHR5IGJhc2guc2NyaXB0IGJhc2guc2NyaXB0MiBlbnYucHl0aG9uLnNjcmlwdCBhc2NpaSBqYXZhLmNsYXNzCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvY3JhbWZzLmJ6MiBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9jcmFtZnMuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDM4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvY3JhbWZzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0Mi5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0Mi5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3YzRkNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9leHQyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0My5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0My5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZjExZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9leHQzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0NC5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZXh0NC5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9leHQ0LmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZjJmcy5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvZjJmcy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExMWU4NwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9mMmZzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvbWluaXguYnoyIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL21pbml4LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmYwMjJlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL21pbml4LmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvbXNkb3MuYnoyIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL21zZG9zLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmM5YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL21zZG9zLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvbnRmcy5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvbnRmcy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NGVjZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9udGZzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvcmVpc2VyMy5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvcmVpc2VyMy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhZGZjOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC9yZWlzZXIzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvc3F1YXNoZnMuYnoyIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL3NxdWFzaGZzLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFiNzkzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2Jsa2lkL3NxdWFzaGZzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvdmZhdC5iejIgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQvdmZhdC5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmOGI4OQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC92ZmF0LmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQveGZzLmJ6MiBiL3RveWJveC90ZXN0cy9maWxlcy9ibGtpZC94ZnMuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTcxOTYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmlsZXMvYmxraWQveGZzLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvYnpjYXQvb3ZlcmZsb3cuYnoyIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2J6Y2F0L292ZXJmbG93LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM3OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL2J6Y2F0L292ZXJmbG93LmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvdXRmOC8weGFiYWQxZGVhLnR4dCBiL3RveWJveC90ZXN0cy9maWxlcy91dGY4LzB4YWJhZDFkZWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTM0NWQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmlsZXMvdXRmOC8weGFiYWQxZGVhLnR4dApAQCAtMCwwICsxIEBACivigK4gzrHPg8+DzrnOu86tzpwg4oCtCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZmlsZXMvdXRmOC9hcmFiaWMudHh0IGIvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvYXJhYmljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNmNjZjCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvYXJhYmljLnR4dApAQCAtMCwwICsxLDIgQEAKK9io2YTYr9mKINin2YTYrdmI2KfZhdin2Kog2YXZhNmK2KEg2KfZhNir2LnYp9io2YrZhgor2YjYo9mG2Kcg2YTZhiDYtNix2KfYoSDZh9iw2Ycg2KfZhNiz2KzYp9im2LEg2YXYrtiv2YjYtCDYsNmE2YMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvYmFkLnR4dCBiL3RveWJveC90ZXN0cy9maWxlcy91dGY4L2JhZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5MWU4YQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9maWxlcy91dGY4L2JhZC50eHQKQEAgLTAsMCArMSBAQAorAcHvv78KZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9maWxlcy91dGY4L2phcGFuLnR4dCBiL3RveWJveC90ZXN0cy9maWxlcy91dGY4L2phcGFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M0NDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvamFwYW4udHh0CkBAIC0wLDAgKzEgQEAKK+engeOBr+OCrOODqeOCueOCkumjn+OBueOCieOCjOOBvuOBmeOAguOBneOCjOOBr+engeOCkuWCt+OBpOOBkeOBvuOBm+OCk+OAggpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9maWxlcy91dGY4L3Rlc3QxLnR4dCBiL3RveWJveC90ZXN0cy9maWxlcy91dGY4L3Rlc3QxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQxYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvdGVzdDEudHh0CkBAIC0wLDAgKzEgQEAKK2zMtMyXzJ7MoGXMuMynzKnMpXTMtMytzY3MuyDMtMyyzZzNhXTMt82HzJfMrmjMtcylzYnMnWXMtMyhzLrMvCDMuM2czKTMnHLMtMynzZPNiWnMts2JzZPNjnTMt8yezJ3Mu3XMtsy7zKvMl2HMtMy6zY7Mr2zMtM2NzZzNhSDMtcypzLLMsWPMt8ypzJ/Mlm/MtMygzY3Mu23MuM2azKzMmG3Mt8yjzKLNnGXMtcyXzY7Mq27MuMymzKjMlmPMt8ywzKnNjmXMtMyxzJ7MlwpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvdGVzdDIudHh0IGIvdG95Ym94L3Rlc3RzL2ZpbGVzL3V0ZjgvdGVzdDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjZjNWUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmlsZXMvdXRmOC90ZXN0Mi50eHQKQEAgLTAsMCArMSwyIEBACitszLTMl8yezKBlzLjMp8ypzKV0zLTMrc2NzLsgzLTMss2czYV0zLfNh8yXzK5ozLXMpc2JzJ1lzLTMocy6zLwgzLjNnMykzJxyzLTMp82TzYlpzLbNic2TzY50zLfMnsydzLt1zLbMu8yrzJdhzLTMus2OzK9szLTNjc2czYUgzLXMqcyyzLFjzLfMqcyfzJZvzLTMoM2NzLttzLjNmsyszJhtzLfMo8yizZxlzLXMl82OzKtuzLjMpsyozJZjzLfMsMypzY5lzLTMscyezJcKK3RoZcyhINKJzLdyzaDNoc2BacyozZ50zKd1zaDMqGFszZggzJvNj2nNmNKJc8ybIM2czZ5jzKfNgc2Pb23Mts2PcGzMtc2cZcyodMy0zaBlzJsKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9maW5kLnRlc3QgYi90b3lib3gvdGVzdHMvZmluZC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1YzI0NDAKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvZmluZC50ZXN0CkBAIC0wLDAgKzEsOTcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCitta2RpciBkaXIKK2NkIGRpcgordG91Y2ggZmlsZQorbWtmaWZvIGZpZm8KK2xuIC1zIGZpZm8gbGluaworY2QgLi4KK3RvdWNoIGIKKworbWtkaXIgcGVybQordG91Y2ggcGVybS9hbGwtcmVhZC1vbmx5CitjaG1vZCBhPXIgcGVybS9hbGwtcmVhZC1vbmx5CisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIFRlc3Rpbmcgb3BlcmF0b3JzCisKK3Rlc3RpbmcgIi10eXBlIGwgLWEgLXR5cGUgZCAtbyAtdHlwZSBwIiBcCisJImZpbmQgZGlyIC10eXBlIGwgLWEgLXR5cGUgZCAtbyAtdHlwZSBwIiAiZGlyL2ZpZm9cbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgLXR5cGUgZCAtbyAtdHlwZSBwIiAiZmluZCBkaXIgLXR5cGUgbCAtdHlwZSBkIC1vIC10eXBlIHAiIFwKKwkiZGlyL2ZpZm9cbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgLW8gLXR5cGUgZCAtYSAtdHlwZSBwIiBcCisJImZpbmQgZGlyIC10eXBlIGwgLW8gLXR5cGUgZCAtYSAtdHlwZSBwIiAiZGlyL2xpbmtcbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgLW8gLXR5cGUgZCAtdHlwZSBwIiAiZmluZCBkaXIgLXR5cGUgbCAtbyAtdHlwZSBkIC10eXBlIHAiIFwKKwkiZGlyL2xpbmtcbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgKCAtdHlwZSBkIC1vIC10eXBlIGwgKSIgXAorCSJmaW5kIGRpciAtdHlwZSBsIFwoIC10eXBlIGQgLW8gLXR5cGUgbCBcKSIgImRpci9saW5rXG4iICIiICIiCit0ZXN0aW5nICJleHRyYSBwYXJlbnRoZXNlcyIgXAorCSJmaW5kIGRpciBcKCBcKCAtdHlwZSBsIFwpIFwoIC10eXBlIGQgLW8gXCggXCggLXR5cGUgbCBcKSBcKSBcKSBcKSIgXAorCSJkaXIvbGlua1xuIiAiIiAiIgordGVzdGluZyAiKCAtdHlwZSBwIC1vIC10eXBlIGQgKSAtdHlwZSBwIiBcCisJImZpbmQgZGlyIFwoIC10eXBlIHAgLW8gLXR5cGUgZCBcKSAtdHlwZSBwIiAiZGlyL2ZpZm9cbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgLW8gLXR5cGUgZCAtdHlwZSBwIC1vIC10eXBlIGYiIFwKKwkiZmluZCBkaXIgLXR5cGUgbCAtbyAtdHlwZSBkIC10eXBlIHAgLW8gLXR5cGUgZiB8IHNvcnQiIFwKKwkiZGlyL2ZpbGVcbmRpci9saW5rXG4iICIiICIiCisKKyMgVGVzdGluZyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb25zCisKK3Rlc3RpbmcgIi10eXBlIGYgLWEgLXByaW50IiBcCisJImZpbmQgZGlyIC10eXBlIGYgLWEgLXByaW50IiAiZGlyL2ZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1wcmludCAtbyAtcHJpbnQiIFwKKwkiZmluZCBkaXIgLXR5cGUgZiAtYSBcKCAtcHJpbnQgLW8gLXByaW50IFwpIiAiZGlyL2ZpbGVcbiIgIiIgIiIKKworIyB0aGVzZSB3ZXJlIGVycm9yaW5nIG9yIHNlZ2ZhdWx0aW5nOgorIyBmaW5kIC10eXBlIGYgLXVzZXIgbm9ib2R5IC1leGVjIDogXDsKKyMgZmluZCAtdHlwZSBmIC11c2VyIG5vYm9keSAtZXhlYyA6IC1leGVjIDogXDsKKworIyBUZXN0aW5nIHByZXZpb3VzIGZhaWx1cmVzCisKK3Rlc3RpbmcgIi10eXBlIGYgLXVzZXIgLWV4ZWMiIFwKKyAgImZpbmQgZGlyIC10eXBlIGYgLXVzZXIgJFVTRVIgLWV4ZWMgbHMge30gXFw7IiAiZGlyL2ZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIi10eXBlIGwgLW5ld2VyIC1leGVjIiBcCisgICJmaW5kIGRpciAtdHlwZSBsIC1uZXdlciBkaXIvZmlsZSAtZXhlYyBscyB7fSBcXDsiICJkaXIvbGlua1xuIiAiIiAiIgordGVzdGluZyAiLXBlcm0gKGV4YWN0IHN1Y2Nlc3MpIiBcCisgICJmaW5kIHBlcm0gLXR5cGUgZiAtcGVybSAwNDQ0IiAicGVybS9hbGwtcmVhZC1vbmx5XG4iICIiICIiCit0ZXN0aW5nICItcGVybSAoZXhhY3QgZmFpbHVyZSkiIFwKKyAgImZpbmQgcGVybSAtdHlwZSBmIC1wZXJtIDA0MDAiICIiICIiICIiCit0ZXN0aW5nICItcGVybSAobWluIHN1Y2Nlc3MpIiBcCisgICJmaW5kIHBlcm0gLXR5cGUgZiAtcGVybSAtMDQwMCIgInBlcm0vYWxsLXJlYWQtb25seVxuIiAiIiAiIgordGVzdGluZyAiLXBlcm0gKG1pbiBmYWlsdXJlKSIgXAorICAiZmluZCBwZXJtIC10eXBlIGYgLXBlcm0gLTA2MDAiICIiICIiICIiCit0ZXN0aW5nICItcGVybSAoYW55IHN1Y2Nlc3MpIiBcCisgICJmaW5kIHBlcm0gLXR5cGUgZiAtcGVybSAtMDQ0NCIgInBlcm0vYWxsLXJlYWQtb25seVxuIiAiIiAiIgordGVzdGluZyAiLXBlcm0gKGFueSBmYWlsdXJlKSIgXAorICAiZmluZCBwZXJtIC10eXBlIGYgLXBlcm0gLTAyMjIiICIiICIiICIiCisKKyMgU3RpbGwgZmFpbHMKKwordGVzdGluZyAidW50ZXJtaW5hdGVkIC1leGVjIHt9IiBcCisgICJmaW5kIGRpciAtdHlwZSBmIC1leGVjIGxzIHt9IDI+L2Rldi9udWxsIHx8IGVjaG8gYmFkIiAiYmFkXG4iICIiICIiCit0ZXN0aW5nICItZXhlYyB7fSArIiBcCisgICJmaW5kIGRpciAtdHlwZSBmIC1leGVjIGxzIHt9ICsiICJkaXIvZmlsZVxuIiAiIiAiIgorCisjIGBmaW5kIC4gLWluYW1lYCB3YXMgc2VnZmF1bHRpbmcKK3Rlc3RpbmcgIi1uYW1lIGZpbGUiIFwKKyAgImZpbmQgZGlyIC1uYW1lIGZpbGUiICJkaXIvZmlsZVxuIiAiIiAiIgordGVzdGluZyAiLW5hbWUgRklMRSIgXAorICAiZmluZCBkaXIgLW5hbWUgRklMRSIgIiIgIiIgIiIKKwordGVzdGluZyAiLWluYW1lIGZpbGUiIFwKKyAgImZpbmQgZGlyIC1pbmFtZSBGSUxFIiAiZGlyL2ZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1pbmFtZSBGSUxFIiBcCisgICJmaW5kIGRpciAtaW5hbWUgRklMRSIgImRpci9maWxlXG4iICIiICIiCisKKwordGVzdGluZyAiLW5hbWUgKG5vIGFyZ3VtZW50cykiIFwKKyAgImZpbmQgZGlyIC1uYW1lIDI+JjEgfCBncmVwIC1vICdbLV1uYW1lJyIgIi1uYW1lXG4iICIiICIiCit0ZXN0aW5nICItaW5hbWUgKG5vIGFyZ3VtZW50cykiIFwKKyAgImZpbmQgZGlyIC1pbmFtZSAyPiYxIHwgZ3JlcCAtbyAnWy1daW5hbWUnIiAiLWluYW1lXG4iICIiICIiCisKK3Rlc3RpbmcgIiIgImZpbmQgZGlyIFwoIC1pbmFtZSBmaWxlIC1vIC1pbmFtZSBtaXNzaW5nIFwpIC1leGVjIGVjaG8ge30gXDsiIFwKKyAgImRpci9maWxlXG4iICIiICIiCisKK3JtIC1yZiBkaXIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9mc3R5cGUudGVzdCBiL3RveWJveC90ZXN0cy9mc3R5cGUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGYyNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2ZzdHlwZS50ZXN0CkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworQkRJUj0iJEZJTEVTL2Jsa2lkIgorCitiemNhdCAiJEJESVIiL3NxdWFzaGZzLmJ6MiA+IHRlbXAuaW1nCit0ZXN0aW5nICJmaWxlIiAiZnN0eXBlIHRlbXAuaW1nIiAnc3F1YXNoZnNcbicgIiIgIiIKK3JtIHRlbXAuaW1nCisKK2ZvciBpIGluIGNyYW1mcyBleHQyIGV4dDMgZXh0NCBmMmZzIG50ZnMgc3F1YXNoZnMgdmZhdCB4ZnMKK2RvCisgIHRlc3RpbmcgIiRpIiAnYnpjYXQgIiRCRElSIi8kaS5iejIgfCBmc3R5cGUgLScgIiRpXG4iICIiICIiCitkb25lCisKK3Rlc3RpbmcgIm1zZG9zIiAnYnpjYXQgIiRCRElSIi9tc2Rvcy5iejIgfCBmc3R5cGUgLScgJ3ZmYXRcbicgIiIgIiIKK3Rlc3RpbmcgInJlaXNlcmZzIiAnYnpjYXQgIiRCRElSIi9yZWlzZXIzLmJ6MiB8IGZzdHlwZSAtJyAncmVpc2VyZnNcbicgIiIgIiIKKworI3Rlc3RpbmcgImJsa2lkIG1pbml4IiAnYnpjYXQgIiRCRElSIi9taW5peC5iejIgfCBibGtpZCAtJworI2FkZnMgYmZzIGJ0cmZzIGNyYW1mcyBqZnMgbmlsZnMgcm9tZnMKKyN2ZmF0ICAvLyBmYXQzMiBmYXQxMiBmYXQxNgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2dldGZhdHRyLnRlc3QgYi90b3lib3gvdGVzdHMvZ2V0ZmF0dHIudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjBmOTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2dldGZhdHRyLnRlc3QKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitta2RpciBhdHRycwordG91Y2ggYXR0cnMvZmlsZQorc2V0ZmF0dHIgLW4gdXNlci5lbXB0eSBhdHRycy9maWxlCitzZXRmYXR0ciAtbiB1c2VyLmRhdGEgLXYgaGVsbG8gYXR0cnMvZmlsZQorCit0ZXN0aW5nICIiICJnZXRmYXR0ciBhdHRycy9maWxlIiBcCisgICAgIiMgZmlsZTogYXR0cnMvZmlsZVxudXNlci5kYXRhXG51c2VyLmVtcHR5XG5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIiAiZ2V0ZmF0dHIgLWQgYXR0cnMvZmlsZSIgXAorICAgICIjIGZpbGU6IGF0dHJzL2ZpbGVcbnVzZXIuZGF0YT1cImhlbGxvXCJcbnVzZXIuZW1wdHlcblxuIiAiIiAiIgordGVzdGluZyAiLW4iICJnZXRmYXR0ciAtbiB1c2VyLmVtcHR5IGF0dHJzL2ZpbGUiIFwKKyAgICAiIyBmaWxlOiBhdHRycy9maWxlXG51c2VyLmVtcHR5XG5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIC1uIiAiZ2V0ZmF0dHIgLWQgLW4gdXNlci5kYXRhIGF0dHJzL2ZpbGUiIFwKKyAgICAiIyBmaWxlOiBhdHRycy9maWxlXG51c2VyLmRhdGE9XCJoZWxsb1wiXG5cbiIgIiIgIiIKKworcm0gLXJmIGF0dHJzCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvZ3JlcC50ZXN0IGIvdG95Ym94L3Rlc3RzL2dyZXAudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTRmMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2dyZXAudGVzdApAQCAtMCwwICsxLDE0NSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyMgQ29weXJpZ2h0IDIwMTMgYnkgS3l1bmdzdSBLaW0gPGthc3B5eEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIGJ5IEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAiLWMiICJncmVwIC1jIDEyMyBpbnB1dCIgIjNcbiIgIjEyM1xuY291bnQgMTIzXG4xMjNcbmZhc2RmYXNkZiIgIiIKKworZWNobyAtZSAidGhpcyBpcyB0ZXN0IiA+IGZvbworZWNobyAtZSAidGhpcyBpcyB0ZXN0MiIgPiBmb28yCitlY2hvIC1lICJ0aGlzIGlzIGZvbzMiID4gZm9vMwordGVzdGluZyAiLWwiICJncmVwIC1sIHRlc3QgZm9vIGZvbzIgZm9vMyIgImZvb1xuZm9vMlxuIiAiIiAiIgorcm0gZm9vIGZvbzIgZm9vMworCit0ZXN0aW5nICItcSIgImdyZXAgLXEgdGVzdCBpbnB1dCAmJiBlY2hvIHllcyIgInllc1xuIiAidGhpcyBpcyBhIHRlc3RcbiIgIiIKK3Rlc3RpbmcgIi1FIiAiZ3JlcCAtRSAnWzAtOV0nIGlucHV0IiAiMTIzNDEyM2FzZGZhczEyMzEyM1xuMVxuIiBcCisgICIxMjM0MTIzYXNkZmFzMTIzMTIzXG5hYmNcbjFcbmFiY2RlIiAiIgordGVzdGluZyAiLWUiICJncmVwIC1lICdbMC05XScgaW5wdXQiICIxMjM0MTIzYXNkZmFzMTIzMTIzXG4xXG4iIFwKKyAgIjEyMzQxMjNhc2RmYXMxMjMxMjNcbmFiY1xuMVxuYWJjZGUiICIiCit0ZXN0aW5nICItZSAtZSIgImdyZXAgLWUgb25lIC1lIHR3byAtZSB0aHJlZSBpbnB1dCIgXAorICAidHdvXG50d29cbnRocmVlXG5vbmVcbiIgInR3b1xudHdvXG50aHJlZVxuYW5kXG5vbmVcbiIgIiIKK3Rlc3RpbmcgIi1GIiAiZ3JlcCAtRiBpcyBpbnB1dCIgInRoaXMgaXMgdGVzdFxudGhpcyBpcyB0ZXN0MlxuIiBcCisgICJ0aGlzIGlzIHRlc3RcbnRoaXMgaXMgdGVzdDJcbnRlc3QgY2FzZSIgIiIKKworZWNobyAtZSAidGhpcyBpcyB0ZXN0XG50aGlzIGlzIHRlc3QyXG50ZXN0IGNhc2UiID4gZm9vCitlY2hvIC1lICJoZWxsbyB0aGlzIGlzIHRlc3QiID4gZm9vMgorZWNobyAtZSAiaGkgaGVsbG8iID4gZm9vMwordGVzdGluZyAiLUgiICJncmVwIC1IIGlzIGZvbyBmb28yIGZvbzMiICJmb286dGhpcyBpcyB0ZXN0XG5mb286dGhpcyBpcyB0ZXN0MlxuZm9vMjpoZWxsbyB0aGlzIGlzIHRlc3RcbiIgIiIgIiIKK3JtIGZvbyBmb28yIGZvbzMKKwordGVzdGluZyAiLWIiICJncmVwIC1iIGlzIGlucHV0IiAiMDp0aGlzIGlzIHRlc3RcbjEzOnRoaXMgaXMgdGVzdDJcbiIgXAorICAidGhpcyBpcyB0ZXN0XG50aGlzIGlzIHRlc3QyXG50ZXN0IGNhc2UiICIiCit0ZXN0aW5nICItaSIgImdyZXAgLWkgaXMgaW5wdXQiICJ0aGlzSXMgdGVzdFxudGhpcyBpcyB0ZXN0MlxuIiBcCisgICJ0aGlzSXMgdGVzdFxudGhpcyBpcyB0ZXN0MlxudGVzdCBjYXNlIiAiIgordGVzdGluZyAiLW4iICJncmVwIC1uIGlzIGlucHV0IiAiMTp0aGlzIGlzIHRlc3RcbjI6dGhpcyBpcyB0ZXN0MlxuIiBcCisgICJ0aGlzIGlzIHRlc3RcbnRoaXMgaXMgdGVzdDJcbnRlc3QgY2FzZSIgIiIKK3Rlc3RpbmcgIi1vIiAiZ3JlcCAtbyBpcyBpbnB1dCIgImlzXG5pc1xuaXNcbmlzXG4iIFwKKyAgInRoaXMgaXMgdGVzdFxudGhpcyBpcyB0ZXN0MlxudGVzdCBjYXNlIiAiIgordGVzdGluZyAiLXMiICJncmVwIC1ocyBoZWxsbyBhc2RmIGlucHV0IDI+JjEiICJoZWxsb1xuIiAiaGVsbG9cbiIgIiIKK3Rlc3RpbmcgIi12IiAiZ3JlcCAtdiBhYmMgaW5wdXQiICIxMjM0MTIzYXNkZmFzMTIzMTIzXG4xQUJhXG4iIFwKKyAgIjEyMzQxMjNhc2RmYXMxMjMxMjNcbjFBQmFiY1xuYWJjXG4xQUJhXG5hYmNkZSIgIiIKK3Rlc3RpbmcgIi13IiAiZ3JlcCAtdyBhYmMgaW5wdXQiICJhYmNcbjEyMyBhYmNcbmFiYyAxMjNcbjEyMyBhYmMgNDU2XG4iIFwKKyAgIjEyMzQxMjNhc2RmYXMxMjMxMjNcbjFBQmFiY1xuYWJjXG4xQUJhXG5hYmNkZVxuMTIzIGFiY1xuYWJjIDEyM1xuMTIzIGFiYyA0NTZcbiIgIiIKK3Rlc3RpbmcgIi14IiAiZ3JlcCAteCBhYmMgaW5wdXQiICJhYmNcbiIgXAorICAiYWFiY2NcbmFiY1xuIiAiIgorCit0ZXN0aW5nICItSCAoc3RhbmRhcmQgaW5wdXQpIiAiZ3JlcCAtSCBhYmMiICIoc3RhbmRhcmQgaW5wdXQpOmFiY1xuIiBcCisgICIiICJhYmNcbiIKK3Rlc3RpbmcgIi1sIChzdGFuZGFyZCBpbnB1dCkiICJncmVwIC1sIGFiYyIgIihzdGFuZGFyZCBpbnB1dClcbiIgXAorICAiIiAiYWJjXG4iCit0ZXN0aW5nICItbiB0d28gaW5wdXRzIiAiZ3JlcCAtaG4gZGVmIC0gaW5wdXQiICIyOmRlZlxuMjpkZWZcbiIgXAorICAiYWJjXG5kZWZcbiIgImFiY1xuZGVmXG4iCisKK3Rlc3RpbmcgInBhdHRlcm4gd2l0aCBuZXdsaW5lIiAiZ3JlcCAnYWJjCitkZWYnIGlucHV0IiAiYWFiY2NcbmRkZWZmXG4iIFwKKyAgImFhYWFcbmFhYmNjXG5cZGRkZFxuZGRlZmZcbmZmZmZcbiIgIiIKKwordGVzdGluZyAiLWxIIiAiZ3JlcCAtbEggYWJjIGlucHV0IiAiaW5wdXRcbiIgImFiY1xuIiAiIgordGVzdGluZyAiLWNuIiAiZ3JlcCAtY24gYWJjIGlucHV0IiAiMVxuIiAiYWJjXG4iICIiCit0ZXN0aW5nICItY0giICJncmVwIC1jSCBhYmMgaW5wdXQiICJpbnB1dDoxXG4iICJhYmNcbiIgIiIKK3Rlc3RpbmcgIi1xcyIgImdyZXAgLXFzIGFiYyBub25lIGlucHV0ICYmIGVjaG8geWVzIiAieWVzXG4iICJhYmNcbiIgIiIKK3Rlc3RpbmcgIi1obCIgImdyZXAgLWhsIGFiYyBpbnB1dCIgImlucHV0XG4iICJhYmNcbiIgIiIKK3Rlc3RpbmcgIi1iIHN0ZGluIiAiZ3JlcCAtYiBvbmUiICIwOm9uZVxuNDpvbmVcbjg6b25lXG4iICIiICJvbmVcbm9uZVxub25lXG4iCit0ZXN0aW5nICItbyBvdmVybGFwIiAiZ3JlcCAtYm8gYWFhIiAiMTphYWFcbiIgIiIgImJhYWFhXG4iCisjIG5vbm9idmlvdXM6IC1jbyBjb3VudHMgbGluZXMsIG5vdCBtYXRjaGVzCit0ZXN0aW5nICItY28iICJncmVwIC1jbyBvbmUgaW5wdXQiICIxXG4iICJvbmUgb25lIG9uZVxuIiAiIgordGVzdGluZyAiLW5vbSIgImdyZXAgLW5vbSAyIG9uZSIgIjE6b25lXG4xOm9uZVxuMTpvbmVcbjI6b25lXG4yOm9uZVxuIiBcCisgICIiICJvbmUgb25lIG9uZVxub25lIG9uZVxub25lIgordGVzdGluZyAiLXZvIiAiZ3JlcCAtdm8gb25lIGlucHV0IiAidHdvXG50aHJlZVxuIiAib25ldHdvb25ldGhyZWVvbmVcbiIgIiIKK3Rlc3RpbmcgIm5vIG5ld2xpbmUiICJncmVwIC1oIG9uZSBpbnB1dCAtIiBcCisgICJoZWxsbyBvbmVcbnRoZXJlIG9uZVxuIiAiaGVsbG8gb25lIiAidGhlcmUgb25lIgorCit0ZXN0aW5nICItZSBtdWx0aSIgImdyZXAgLWUgb25lIC1ldGhyZWUgaW5wdXQiIFwKKyAgInRocmVlXG5vbmVcbiIgInRocmVlXG50d29cbm9uZVxuIiAiIgorIyBTdXBwcmVzcyBmaWxlbmFtZXMgZm9yIHJlY3Vyc2l2ZSB0ZXN0IGJlY2F1c2UgZHVubm8gb3JkZXIgdGhleSdkIG9jY3VyIGluCitta2RpciBzdWIKK2VjaG8gLWUgIm9uZVxudHdvXG50aHJlZSIgPiBzdWIvb25lCitlY2hvIC1lICJ0aHJlZVxudHdvXG5vbmUiID4gc3ViL3R3bwordGVzdGluZyAiLWhyIiAiZ3JlcCAtaHIgb25lIHN1YiIgIm9uZVxub25lXG4iICIiICIiCit0ZXN0aW5nICItciBmaWxlIiAiZ3JlcCAtciB0aHJlZSBzdWIvdHdvIiAidGhyZWVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1yIGRpciIgImdyZXAgLXIgb25lIHN1YiB8IHNvcnQiICJzdWIvb25lOm9uZVxuc3ViL3R3bzpvbmVcbiIgXAorICAiIiAiIgorcm0gLXJmIHN1YgorCisjIC14IGV4YWN0IG1hdGNoIHRydW1wcyAtRidzICJlbXB0eSBzdHJpbmcgbWF0Y2hlcyB3aG9sZSBsaW5lIiBiZWhhdmlvcgordGVzdGluZyAiLUZ4ICcnIiAiZ3JlcCAtRnggJycgaW5wdXQiICIiICJvbmUgb25lIG9uZVxuIiAiIgordGVzdGluZyAiLUYgJyciICJncmVwIC1GICcnIGlucHV0IiAib25lIG9uZSBvbmVcbiIgIm9uZSBvbmUgb25lXG4iICIiCit0ZXN0aW5nICItRiAtZSBibGFoIC1lICcnIiAiZ3JlcCAtRiAtZSBibGFoIC1lICcnIGlucHV0IiAib25lIG9uZSBvbmVcbiIgXAorICAib25lIG9uZSBvbmVcbiIgIiIKK3Rlc3RpbmcgIi1lIGJsYWggLWUgJyciICJncmVwIC1lIGJsYWggLWUgJycgaW5wdXQiICJvbmUgb25lIG9uZVxuIiBcCisgICJvbmUgb25lIG9uZVxuIiAiIgordGVzdGluZyAiLXcgJyciICJncmVwIC13ICcnIGlucHV0IiAiIiAib25lIG9uZSBvbmVcbiIgIiIKK3Rlc3RpbmcgIi13ICcnIDIiICJncmVwIC13ICcnIGlucHV0IiAib25lICB0d29cbiIgIm9uZSAgdHdvXG4iICIiCit0ZXN0aW5nICItdyBcXDEiICJncmVwIC13byAnXFwoeFxcKVxcMSciICJ4eFxuIiAiIiAieHgiCit0ZXN0aW5nICItbyAnJyIgImdyZXAgLW8gJycgaW5wdXQiICIiICJvbmUgb25lIG9uZVxuIiAiIgordGVzdGluZyAiYmFja3JlZiIgJ2dyZXAgLWUgImFcKGJcKSIgLWUgImJcKGNcKVwxIicgImJjY1xuYWJcbiIgXAorICAiIiAiYmNjXG5iY2JcbmFiXG4iCisKK3Rlc3RpbmcgIi1BIiAiZ3JlcCAtQSAyIHllcyIgInllc1xubm9cbm5vXG4tLVxueWVzXG5ub1xubm9cbnllc1xubm9cbiIgXAorICAiIiAieWVzXG5ub1xubm9cbm5vXG55ZXNcbm5vXG5ub1xueWVzXG5ubyIKK3Rlc3RpbmcgIi1CIiAiZ3JlcCAtQiAxIHllcyIgIm5vXG55ZXNcbi0tXG5ub1xueWVzXG5ub1xueWVzXG4iIFwKKyAgIiIgIm5vXG5ub1xubm9cbnllc1xubm9cbm5vXG55ZXNcbm5vXG55ZXMiCit0ZXN0aW5nICItQyIgImdyZXAgLUMgMSB5ZXMiIFwKKyAgInllc1xubm9cbi0tXG5ub1xueWVzXG5ub1xubm9cbnllc1xubm9cbnllc1xubm9cbiIgXAorICAiIiAieWVzXG5ub1xubm9cbm5vXG55ZXNcbm5vXG5ub1xueWVzXG5ub1xueWVzXG5ub1xubm8iCit0ZXN0aW5nICItSG5DIiAiZ3JlcCAtSG5DMSB0d28iIFwKKyAgIihzdGFuZGFyZCBpbnB1dCktMS1vbmVcbihzdGFuZGFyZCBpbnB1dCk6Mjp0d29cbihzdGFuZGFyZCBpbnB1dCktMy10aHJlZVxuIiBcCisgICIiICJvbmVcbnR3b1xudGhyZWUiCisKKyMgQ29udGV4dCBsaW5lcyB3ZXJlbid0IHNob3dpbmcgLWIKK3Rlc3RpbmcgIi1IbmJCMSIgImdyZXAgLUhuYkIxIGYgaW5wdXQiIFwKKyAgImlucHV0LTMtOC10aHJlZVxuaW5wdXQ6NDoxNDpmb3VyXG5pbnB1dDo1OjE5OmZpdmVcbiIgXAorICAib25lXG50d29cbnRocmVlXG5mb3VyXG5maXZlXG4iICIiCisKK3Rlc3RpbmcgIi1xIG1hdGNoIG92ZXJyaWRlcyBlcnJvciIgXAorICAiZ3JlcCAtcSBoZWxsbyBtaXNzaW5nIGlucHV0IDI+L2Rldi9udWxsICYmIGVjaG8geWVzIiAieWVzXG4iICJoZWxsb1xuIiAiIgordGVzdGluZyAiLXEgbm90IGZvdW5kIGlzIDEiIFwKKyAgJ2dyZXAgLXEgaGVsbG8gaW5wdXQgfHwgZWNobyAkPycgIjFcbiIgIiIgIiIKK3Rlc3RpbmcgIi1xIG1pc3NpbmcgaXMgMiIgXAorICAnZ3JlcCAtcSBoZWxsbyBtaXNzaW5nIG1pc3NpbmcgMj4vZGV2L251bGwgfHwgZWNobyAkPycgIjJcbiIgIiIgIiIKK3Rlc3RpbmcgIi1xIG1pc3Npbmcgc3Vydml2ZXMgZXhpc3RzIGJ1dCBub3QgZm91bmQiIFwKKyAgJ2dyZXAgLXEgaGVsbG8gbWlzc2luZyBtaXNzaW5nIGlucHV0IDI+L2Rldi9udWxsIHx8IGVjaG8gJD8nICIyXG4iICIiICIiCit0ZXN0aW5nICJub3QgZm91bmQgcmV0YWluZWQgcGFzdCBtYXRjaCIgXAorICAnZ3JlcCBoZWxsbyBtaXNzaW5nIGlucHV0IDI+L2Rldi9udWxsIHx8IGVjaG8gJD8nIFwKKyAgImlucHV0OmhlbGxvXG4yXG4iICJoZWxsb1xuIiAiIgordG91Y2ggZW1wdHkKK3Rlc3RpbmcgIm9uZSBtYXRjaCBnb29kIGVub3VnaCBmb3IgMCIgXAorICAnZ3JlcCBoZWxsbyBpbnB1dCBlbXB0eSAmJiBlY2hvICQ/JyAnaW5wdXQ6aGVsbG9cbjBcbicgJ2hlbGxvXG4nICcnCitybSBlbXB0eQorCit0ZXN0aW5nICItbyAnJyIgImdyZXAgLW8gJyciICIiICIiICJvbmUgdHdvIHRocmVlXG5vbmUgdHdvXG5vbmVcbiIKK3Rlc3RpbmcgJycgImdyZXAgLW8gLWUgJycgLWUgdHdvIiAidHdvXG50d29cbiIgIiIgXAorICAib25lIHR3byB0aHJlZVxub25lIHR3b1xub25lXG4iCisKK2VjaG8gIm9uZVxudHdvXG50aHJlZSIgPiB0ZXN0Cit0ZXN0aW5nICItbCB0cnVtcHMgLUMiICJncmVwIC1sIC1DMSB0d28gdGVzdCBpbnB1dCIgInRlc3RcbmlucHV0XG4iIFwKKyAgInRocmVlXG50d29cbm9uZVxuIiAiIgorcm0gdGVzdAorCisjIG1hdGNoIGFmdGVyIE5VTCBieXRlCit0ZXN0aW5nICJtYXRjaCBhZnRlciBOVUwgYnl0ZSIgImdyZXAgLWEgdHdvIiAib25lXDBhbmQgdHdvIHRocmVlXG4iIFwKKyAgIiIgJ29uZVwwYW5kIHR3byB0aHJlZScKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9ncm91cGFkZC50ZXN0IGIvdG95Ym94L3Rlc3RzL2dyb3VwYWRkLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDkxZGNjZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9ncm91cGFkZC50ZXN0CkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIFJvYmluIE1pdHRhbCA8cm9iaW5taXR0YWwuaXRAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworIyA3MCBjaGFyYWN0ZXJzIGxvbmcgc3RyaW5nOyBoZXJlYWZ0ZXIsIHdlIHdpbGwgdXNlIGl0IGFzIHBlciBvdXIgbmVlZC4KK19zNzA9ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkiCisKK2VjaG8gIiMgdXNhZ2U6IGFkZGdyb3VwIFstZyBHSURdIFtVU0VSXSBHUk9VUAorIyBBZGQgYSBncm91cCBvciBhZGQgYSB1c2VyIHRvIGEgZ3JvdXAuIgorCisjIFJlZGlyZWN0aW5nIGFsbCBvdXRwdXQgdG8gL2Rldi9udWxsIGZvciBncmVwIGFuZCBkZWxncm91cAorYXJnPSImPi9kZXYvbnVsbCIKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgImdyb3VwX25hbWUgKHRleHQpIiAiZ3JvdXBhZGQgdG95VGVzdEdyb3VwICYmCisgICBncmVwICdedG95VGVzdEdyb3VwOicgL2V0Yy9ncm91cCAkYXJnICYmIGdyb3VwZGVsIHRveVRlc3RHcm91cCAkYXJnICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJncm91cF9uYW1lIChhbHBoYW51bWVyaWMpIiAiZ3JvdXBhZGQgdG95MVRlc3QyR3JvdXAzICYmCisgICBncmVwICdedG95MVRlc3QyR3JvdXAzOicgL2V0Yy9ncm91cCAkYXJnICYmIGdyb3VwZGVsIHRveTFUZXN0Mkdyb3VwMyAkYXJnICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJncm91cF9uYW1lIChudW1lcmljKSIgImdyb3VwYWRkIDk4NzY1NDMyMSAmJgorICAgZ3JlcCAnXjk4NzY1NDMyMTonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGRlbCA5ODc2NTQzMjEgJGFyZyAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZ3JvdXBfbmFtZSAod2l0aCAuLy0pIiAiZ3JvdXBhZGQgdG95LjFUZXN0LTJHcm91cC4zICYmCisgICBncmVwICdedG95LjFUZXN0LTJHcm91cC4zOicgL2V0Yy9ncm91cCAkYXJnICYmCisgICBncm91cGRlbCB0b3kuMVRlc3QtMkdyb3VwLjMgJGFyZyAmJiBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCisKK19zMjEwPWBlY2hvICRfczcwJF9zNzAkX3M3MGAKK3Rlc3RpbmcgImdyb3VwX25hbWUgKGxvbmcgc3RyaW5nKSIgImdyb3VwYWRkICRfczIxMCAmJgorICAgZ3JlcCAnXiRfczIxMDonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGRlbCAkX3MyMTAgJGFyZyAmJiBlY2hvICd5ZXMnIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgImdyb3VwX25hbWUgd2l0aCBncm91cF9pZCIgImdyb3VwYWRkIC1nIDQ5OTk5IHRveVRlc3RHcm91cCAmJgorICAgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGRlbCB0b3lUZXN0R3JvdXAgJGFyZyAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZ3JvdXBfbmFtZSB3aXRoIGdyb3VwX2lkIChzeXN0ZW1fZ3JvdXApIiBcCisgICJncm91cGFkZCAtZyA0OTk5OSAtUyB0b3lUZXN0R3JvdXAgJiYgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyAmJgorICAgZ3JvdXBkZWwgdG95VGVzdEdyb3VwICRhcmcgJiYgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZ3JvdXBfbmFtZSAoc3lzdGVtX2dyb3VwKSIgImdyb3VwYWRkIC1TIHRveVRlc3RHcm91cCAmJgorICAgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGRlbCB0b3lUZXN0R3JvdXAgJGFyZyAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZ3JvdXBfbmFtZSAoYWRkL2RlbCB1c2VyKSIgImdyb3VwYWRkIHRveVRlc3RHcm91cCAmJgorICAgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGFkZCAkVVNFUiB0b3lUZXN0R3JvdXAgJiYKKyAgIGdyZXAgJ150b3lUZXN0R3JvdXA6Lio6Lio6LiokVVNFUi4qJyAvZXRjL2dyb3VwICRhcmcgJiYKKyAgIGdyb3VwZGVsICRVU0VSIHRveVRlc3RHcm91cCAkYXJnIHx8IGdyb3VwZGVsIHRveVRlc3RHcm91cCAmJgorICAgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyB8fCBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCisKKyBlY2hvICJUZXN0aW5nIHRvIGFkZCBzaW5nbGUgZ3JvdXAgbXVsdGlwbGUgdGltZXMgYWZ0ZXIgcmVtb3ZpbmcgaXQuLi4iCisgZm9yIGVhY2ggaW4gezAxLi4yMH0KKyBkbworICAgdGVzdGluZyAiZ3JvdXBfbmFtZSAoJGVhY2gpIiAiZ3JvdXBhZGQgdG95VGVzdEdyb3VwICYmCisgICAgICBncmVwICdedG95VGVzdEdyb3VwOicgL2V0Yy9ncm91cCAkYXJnICYmIGdyb3VwZGVsIHRveVRlc3RHcm91cCAkYXJnICYmCisgICAgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCisgZG9uZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2dyb3VwZGVsLnRlc3QgYi90b3lib3gvdGVzdHMvZ3JvdXBkZWwudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTllZTlhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2dyb3VwZGVsLnRlc3QKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyMgUmVkaXJlY3RpbmcgYWxsIG91dHB1dCB0byAvZGV2L251bGwgZm9yIGdyZXAgYW5kIGRlbGdyb3VwCithcmc9IiY+L2Rldi9udWxsIgorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAiZ3JvdXBfbmFtZSAodGV4dCkiICJncm91cGFkZCB0b3lUZXN0R3JvdXAgJiYKKyAgIGdyZXAgJ150b3lUZXN0R3JvdXA6JyAvZXRjL2dyb3VwICRhcmcgJiYgZ3JvdXBkZWwgdG95VGVzdEdyb3VwICRhcmcgJiYKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgImdyb3VwX25hbWUgKGFscGhhbnVtZXJpYykiICJncm91cGFkZCB0b3kxVGVzdDJHcm91cDMgJiYKKyAgIGdyZXAgJ150b3kxVGVzdDJHcm91cDM6JyAvZXRjL2dyb3VwICRhcmcgJiYgZ3JvdXBkZWwgdG95MVRlc3QyR3JvdXAzICRhcmcgJiYKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgImdyb3VwX25hbWUgKG51bWVyaWMpIiAiZ3JvdXBhZGQgOTg3NjU0MzIxICYmCisgICBncmVwICdeOTg3NjU0MzIxOicgL2V0Yy9ncm91cCAkYXJnICYmIGdyb3VwZGVsIDk4NzY1NDMyMSAkYXJnICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJncm91cF9uYW1lICh3aXRoIC4vLSkiICJncm91cGFkZCB0b3kuMVRlc3QtMkdyb3VwLjMgJiYKKyAgIGdyZXAgJ150b3kuMVRlc3QtMkdyb3VwLjM6JyAvZXRjL2dyb3VwICRhcmcgJiYKKyAgIGdyb3VwZGVsIHRveS4xVGVzdC0yR3JvdXAuMyAkYXJnICYmIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgImdyb3VwX25hbWUgd2l0aCBncm91cF9pZCIgImdyb3VwYWRkIC1nIDQ5OTk5IHRveVRlc3RHcm91cCAmJgorICAgZ3JlcCAnXnRveVRlc3RHcm91cDonIC9ldGMvZ3JvdXAgJGFyZyAmJiBncm91cGRlbCB0b3lUZXN0R3JvdXAgJGFyZyAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2hlYWQudGVzdCBiL3RveWJveC90ZXN0cy9oZWFkLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNkOTM5OQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9oZWFkLnRlc3QKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJoZWFkLCBzdGRpbiIgImhlYWQgLW4gMSAmJiBlY2hvIHllcyIgIm9uZVxueWVzXG4iICIiICJvbmVcbnR3byIKK3Rlc3RpbmcgImhlYWQsIHN0ZGluIHZpYSAtIiAiaGVhZCAtbiAxIC0gJiYgZWNobyB5ZXMiICJvbmVcbnllc1xuIiAiIiAib25lXG50d28iCit0ZXN0aW5nICJoZWFkLCBmaWxlIiAiaGVhZCBpbnB1dCAtbiAxICYmIGVjaG8geWVzIiAib25lXG55ZXNcbiIgIm9uZVxudHdvIiAiIgordGVzdGluZyAiLW51bWJlciIgImhlYWQgLTIgaW5wdXQgJiYgZWNobyB5ZXMiICJvbmVcbnR3b1xueWVzXG4iIFwKKwkib25lXG50d29cbnRocmVlXG5mb3VyIiAiIgordGVzdGluZyAiaGVhZCwgZGVmYXVsdCBsaW5lcyIgImhlYWQiICIxXG4yXG4zXG40XG41XG42XG43XG44XG45XG4xMFxuIiAiIiAiMVxuMlxuM1xuNFxuNVxuNlxuN1xuOFxuOVxuMTBcbjExXG4xMiIKKworZWNobyAiZm9vCitiYXIKK2JheiIgPiBmaWxlMQordGVzdGluZyAiaGVhZCwgbXVsdGlwbGUgZmlsZXMiICJoZWFkIC1uIDIgaW5wdXQgZmlsZTEiICI9PT4gaW5wdXQgPD09XG5vbmVcbnR3b1xuXG49PT4gZmlsZTEgPD09XG5mb29cbmJhclxuIiAib25lXG50d29cbnRocmVlXG4iICIiCitybSBmaWxlMQorCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvaG9zdG5hbWUudGVzdCBiL3RveWJveC90ZXN0cy9ob3N0bmFtZS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMDdjZTIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvaG9zdG5hbWUudGVzdApAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDE0IERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDE0IE5haGEgTWFnZ3UgPG1hZ2d1Lm5laGFAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgR2V0IHN5c3RlbSBob3N0bmFtZQoraG9zdG5hbWVFeGU9YHdoaWNoIGhvc3RuYW1lYAoraG9zdG5hbWVPdXQ9YCRob3N0bmFtZUV4ZWAKKworIyBOZXcgaG9zdG5hbWUKK05ld0hvc3RuYW1lPSJOZXdIb3N0TmFtZS5zeXN0ZW0iCisKK3Rlc3RpbmcgImdldCIgImhvc3RuYW1lIiAiJGhvc3RuYW1lT3V0XG4iICIiICIiCit0ZXN0aW5nICJzZXQsIEdldCBhbmQgdGhlbiBSZXNldCIgImhvc3RuYW1lICROZXdIb3N0bmFtZTsgaG9zdG5hbWU7IGhvc3RuYW1lICRob3N0bmFtZU91dDsgaG9zdG5hbWUiICIkTmV3SG9zdG5hbWVcbiRob3N0bmFtZU91dFxuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2lmY29uZmlnLnRlc3QgYi90b3lib3gvdGVzdHMvaWZjb25maWcudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGZjZGUwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2lmY29uZmlnLnRlc3QKQEAgLTAsMCArMSwxOTIgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDE0IEN5bnRoaWEgUmVtcGVsIDxjeW50aGlhQHJ0ZW1zLm9yZz4KKyMKKyMgQnJpZWY6IFNvbWUgY3Vyc2VyeSBjb3ZlcmFnZSB0ZXN0cyBvZiBpZmNvbmZpZy4uLgorIyBOb3RlOiByZXF1aXJlcyBwZXJtaXNzaW9ucyB0byBydW4gbW9kcHJvYmUgYW5kIGFsbCBpZmNvbmZpZyBvcHRpb25zCisjIENvbW1hbmRzIHVzZWQ6IGdyZXAsIGdyZXAgLWksIGlwIGxpbmssIGlwIHR1bnRhcCwgd2MgLWwKKyMKKyMgUG9zc2libGUgaW1wcm92ZW1lbnRzOgorIyAxLiBWZXJpZnkgdGhlIGR1bW15IGludGVyZmFjZSBhY3R1YWxseSBoYXMgdGhlIG1vZGlmaWVkIGNoYXJhY3RlcmlzdGljcworIyAgICBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gaWZjb25maWcgb3V0cHV0CisjIDIuIEludHJvZHVjZSBtb3JlIGVycm9yIGNhc2VzLCB0byB2ZXJpZnkgaWZjb25maWcgZmFpbHMgZ3JhY2VmdWxseQorIyAzLiBEbyBtb3JlIGNvbXBsZXggY2FsbHMgdG8gaWZjb25maWcsIHdoaWxlIG1peGluZyB0aGUgb3JkZXIgb2YgdGhlCisjICAgIGFyZ3VtZW50cworIyA0LiBDb3ZlciBtb3JlIGlmY29uZmlnIG9wdGlvbnM6CisjICAgIGh3IGV0aGVyfGluZmluaWJhbmQgQUREUkVTUyAtIHNldCBMQU4gaGFyZHdhcmUgYWRkcmVzcyAoQUE6QkI6Q0MuLi4pCisjICAgIHR4cXVldWVsZW4gTEVOIC0gbnVtYmVyIG9mIGJ1ZmZlcmVkIHBhY2tldHMgYmVmb3JlIG91dHB1dCBibG9ja3MKKyMgICAgT2Jzb2xldGUgZmllbGRzIGluY2x1ZGVkIGZvciBoaXN0b3JpY2FsIHB1cnBvc2VzOgorIyAgICBpcnF8aW9fYWRkcnxtZW1fc3RhcnQgQUREUiAtIG1pY3JvbWFuYWdlIG9ic29sZXRlIGhhcmR3YXJlCisjICAgIG91dGZpbGx8a2VlcGFsaXZlIElOVEVHRVIgLSBTTElQIGFuYWxvZyBkaWFsdXAgbGluZSBxdWFsaXR5IG1vbml0b3JpbmcKKyMgICAgbWV0cmljIElOVEVHRVIgLSBhZGRlZCB0byBMaW51eCAwLjkuMTAgd2l0aCBjb21tZW50ICJuZXZlciB1c2VkIiwgc3RpbGwgdHJ1ZQorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworaWYgWyAiJChpZCAtdSkiIC1uZSAwIF0KK3RoZW4KKyAgZWNobyAiJFNIT1dTS0lQOiBpZmNvbmZpZyAobm90IHJvb3QpIgorICBjb250aW51ZSAyPi9kZXYvbnVsbAorICBleGl0CitmaQorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBBZGQgYSBkdW1teSBpbnRlcmZhY2UgdG8gdGVzdCB3aXRoCitpZmNvbmZpZyBkdW1teTAgdXAKKworIyBUZXN0IERlc2NyaXB0aW9uOiBEaXNhYmxlIHRoZSBkdW1teTAgaW50ZXJmYWNlCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcsIG5vIGxpbmVzIHdpdGggZHVtbXkwIGFyZSBkaXNwbGF5ZWQKK3Rlc3RpbmcgImR1bW15MCBkb3duIGFuZCBpZiBjb25maWcgLy1vbmx5IiBcCisiaWZjb25maWcgZHVtbXkwIGRvd24gJiYgaWZjb25maWcgZHVtbXkwIHwgZ3JlcCBkdW1teSB8IHdjIC1sIiBcCisiMFxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgZHVtbXkwIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnLCBvbmUgbGluZSB3aXRoIGR1bW15MCBpcyBkaXNwbGF5ZWQKK3Rlc3RpbmcgImR1bW15MCB1cCIgXAorImlmY29uZmlnIGR1bW15MCB1cCAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIGR1bW15IHwgd2MgLWwiIFwKKyIxXG4iICIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogU2V0IHRoZSBpcCBhZGRyZXNzIG9mIHRoZSBkdW1teTAgaW50ZXJmYWNlCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCBvbmUgbGluZSBkaXNwbGF5cyB0aGUgaXAKKyMgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzZWxlY3RlZAordGVzdGluZyAiZHVtbXkwIDEwLjI0MC4yNDAuMjQwIiBcCisiaWZjb25maWcgZHVtbXkwIDEwLjI0MC4yNDAuMjQwICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgMTBcLjI0MFwuMjQwXC4yNDAgfCB3YyAtbCIgXAorIjFcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBDaGFuZ2UgdGhlIG5ldG1hc2sgdG8gdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgb25lIGxpbmUgZGlzcGxheXMgdGhlCisjICAgICAgICAgICAgICAgICAgIG5ldG1hc2sgc2VsZWN0ZWQKK3Rlc3RpbmcgImR1bW15MCBuZXRtYXNrIDI1NS4yNTUuMjQwLjAiIFwKKyJpZmNvbmZpZyBkdW1teTAgbmV0bWFzayAyNTUuMjU1LjI0MC4wICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgMjU1XC4yNTVcLjI0MFwuMCB8IHdjIC1sIiBcCisiMVxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IENoYW5nZSB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgdG8gdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgb25lIGxpbmUgZGlzcGxheXMgdGhlCisjICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdCBhZGRyZXNzIHNlbGVjdGVkCit0ZXN0aW5nICJkdW1teTAgYnJvYWRjYXN0IDEwLjI0MC4yNDAuMjU1IiBcCisiaWZjb25maWcgZHVtbXkwIGJyb2FkY2FzdCAxMC4yNDAuMjQwLjI1NSAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIDEwXC4yNDBcLjI0MFwuMjU1IHwgd2MgLWwiIFwKKyIxXG4iICIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogUmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IGlwIGFkZHJlc3MKKyMgUmVzdWx0cyBFeHBlY3RlZDogQWZ0ZXIgY2FsbGluZyBpZmNvbmZpZyBkdW1teTAsIHRoZXJlIGFyZSBubyBsaW5lcworIyAgICAgICAgICAgICAgICAgICBkaXNwbGF5aW5nIHRoZSBpcCBhZGRyZXNzIHByZXZpb3VzbHkgc2VsZWN0ZWQKK3Rlc3RpbmcgImR1bW15MCBkZWZhdWx0IiBcCisiaWZjb25maWcgZHVtbXkwIGRlZmF1bHQgJiYgaWZjb25maWcgZHVtbXkwIHwgZ3JlcCAxMFwuMjQwXC4yNDBcLjI0MCB8IHdjIC1sIiBcCisiMFxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IENoYW5nZSB0aGUgTWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCAoTVRVKSBvZiB0aGUgaW50ZXJmYWNlCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBpcyBvbmUgbGluZSB3aXRoIHRoZQorIyAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBNVFUKK3Rlc3RpbmcgImR1bW15MCBtdHUgMTI2OSIgXAorImlmY29uZmlnIGR1bW15MCBtdHUgMTI2OSAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIDEyNjkgfCB3YyAtbCIgXAorIjFcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBWZXJpZnkgaWZjb25maWcgYWRkIGZhaWxzIHdpdGggc3VjaCBhIHNtYWxsIG10dQorIyBSZXN1bHRzIEV4cGVjdGVkOiBUaGVyZSBpcyBvbmUgbGluZSBvZiBlcnJvciBtZXNzYWdlIGNvbnRhaW5pbmcKKyMgICAgICAgICAgICAgICAgICAgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiCit0ZXN0aW5nICJkdW1teTAgYWRkIDo6MiAtLSB0b28gc21hbGwgbXR1IiBcCisiaWZjb25maWcgZHVtbXkwIGFkZCA6OjIgMj4mMSB8IGdyZXAgTm9cIGJ1ZmZlclwgc3BhY2VcIGF2YWlsYWJsZSB8IHdjIC1sIiBcCisiMVxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IENoYW5nZSB0aGUgTWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCAoTVRVKSBvZiB0aGUgaW50ZXJmYWNlCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBpcyBvbmUgbGluZSB3aXRoIHRoZQorIyAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBNVFUKK3Rlc3RpbmcgImR1bW15MCBtdHUgMjAwMCIgXAorImlmY29uZmlnIGR1bW15MCBtdHUgMjAwMCAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIDIwMDAgfCB3YyAtbCIgXAorIjFcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBWZXJpZnkgaWZjb25maWcgYWRkIHN1Y2NlZWRzIHdpdGggYSBsYXJnZXIgbXR1CisjIFJlc3VsdHMgRXhwZWN0ZWQ6IGFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBpcyBvbmUgbGluZSB3aXRoIHRoZQorIyAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBpcCBhZGRyZXNzCit0ZXN0aW5nICJkdW1teTAgYWRkIDo6MiIgXAorImlmY29uZmlnIGR1bW15MCBhZGQgOjoyLzEyNiAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIFw6XDoyXC8xMjYgfCB3YyAtbCIgXAorIjFcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBWZXJpZnkgaWZjb25maWcgZGVsIHJlbW92ZXMgdGhlIHNlbGVjdGVkIGlwNiBhZGRyZXNzCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IGFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBhcmUgbm8gbGluZXMgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgaXAgYWRkcmVzcwordGVzdGluZyAiZHVtbXkwIGRlbCA6OjIiIFwKKyJpZmNvbmZpZyBkdW1teTAgZGVsIDo6Mi8xMjYgJiYgaWZjb25maWcgZHVtbXkwIHwgZ3JlcCBcOlw6MiB8IHdjIC1sIiBcCisiMFxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IFJlbW92ZSB0aGUgbm9hcnAgZmxhZyBhbmQgYnJpbmcgdGhlIGludGVyZmFjZSBkb3duIGluCisjICAgICAgICAgICAgICAgICAgIHByZXBhcmF0aW9uIGZvciB0aGUgbmV4dCB0ZXN0CisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBhcmUgbm8gbGluZXMgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgTk9BUlAgZmxhZwordGVzdGluZyAiZHVtbXkwIGFycCBkb3duIiBcCisiaWZjb25maWcgZHVtbXkwIGFycCBkb3duICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgLWkgTk9BUlAgfCB3YyAtbCIgXAorIjBcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBDYWxsIHRoZSBwb2ludHRvcG9pbnQgb3B0aW9uIHdpdGggbm8gYXJndW1lbnQKKyMgUmVzdWx0cyBFeHBlY3RlZDogQWZ0ZXIgY2FsbGluZyBpZmNvbmZpZyBkdW1teTAsIHRoZXJlIGlzIG9uZSBsaW5lIHdpdGggdGhlCisjICAgICAgICAgICAgICAgICAgIE5PQVJQIGFuZCBVUCBmbGFncwordGVzdGluZyAiZHVtbXkwIHBvaW50dG9wb2ludCIgXAorImlmY29uZmlnIGR1bW15MCBwb2ludHRvcG9pbnQgJiYgaWZjb25maWcgZHVtbXkwIHwgZ3JlcCAtaSBOT0FSUCB8IGdyZXAgLWkgVVAgfCB3YyAtbCIgXAorIjFcbiIgIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBUZXN0IHRoZSBwb2ludHRvcG9pbnQgb3B0aW9uIGFuZCBzZXQgdGhlIGlwYWRkcmVzcworIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgdGhlcmUgaXMgb25lIGxpbmUgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgd29yZCBpbmV0IGFuZCB0aGUgc2VsZWN0ZWQgaXAgYWRkcmVzcwordGVzdGluZyAiZHVtbXkwIHBvaW50dG9wb2ludCAxMjcuMC4wLjIiIFwKKyJpZmNvbmZpZyBkdW1teTAgcG9pbnR0b3BvaW50IDEyNy4wLjAuMiAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIC1pIGluZXQgfCBncmVwIC1pIDEyN1wuMFwuMFwuMiB8IHdjIC1sIiBcCisiMVxuIiAiIiAiIgorCisjIyMjIyMjIEZsYWdzIHlvdSBjYW4gc2V0IG9uIGFuIGludGVyZmFjZSAob3IgLXJlbW92ZSBieSBwcmVmaXhpbmcgd2l0aCAtKTogIyMjIyMjIyMjIyMjIyMjCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogRW5hYmxlIGFsbG11bHRpIG1vZGUgb24gdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgdGhlcmUgaXMgb25lIGxpbmUgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgYWxsbXVsdGkgZmxhZwordGVzdGluZyAiZHVtbXkwIGFsbG11bHRpIiBcCisiaWZjb25maWcgZHVtbXkwIGFsbG11bHRpICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgLWkgYWxsbXVsdGkgfCB3YyAtbCIgIjFcbiIgXAorIiIgIiIKKworIyBUZXN0IERlc2NyaXB0aW9uOiBEaXNhYmxlIG11bHRpY2FzdCBtb2RlIHRoZSBpbnRlcmZhY2UKKyMgUmVzdWx0cyBFeHBlY3RlZDogQWZ0ZXIgY2FsbGluZyBpZmNvbmZpZyBkdW1teTAsIHRoZXJlIGFyZSBubyBsaW5lcyB3aXRoIHRoZQorIyAgICAgICAgICAgICAgICAgICBhbGxtdWx0aSBmbGFnCit0ZXN0aW5nICJkdW1teTAgLWFsbG11bHRpIiBcCisiaWZjb25maWcgZHVtbXkwIC1hbGxtdWx0aSAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIC1pIGFsbG11bHRpIHwgd2MgLWwiICIwXG4iIFwKKyIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogRGlzYWJsZSBOT0FSUCBtb2RlIG9uIHRoZSBpbnRlcmZhY2UKKyMgUmVzdWx0cyBFeHBlY3RlZDogQWZ0ZXIgY2FsbGluZyBpZmNvbmZpZyBkdW1teTAsIHRoZXJlIGFyZSBubyBsaW5lcyB3aXRoIHRoZQorIyAgICAgICAgICAgICAgICAgICBOT0FSUCBmbGFnCit0ZXN0aW5nICJkdW1teTAgYXJwIiBcCisiaWZjb25maWcgZHVtbXkwIGFycCAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIC1pIE5PQVJQIHwgd2MgLWwiICIwXG4iIFwKKyIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogRW5hYmxlIE5PQVJQIG1vZGUgb24gdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgdGhlcmUgaXMgb25lIGxpbmUgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgTk9BUlAgZmxhZwordGVzdGluZyAiZHVtbXkwIC1hcnAiIFwKKyJpZmNvbmZpZyBkdW1teTAgLWFycCAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIC1pIE5PQVJQIHwgd2MgLWwiICIxXG4iIFwKKyIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogRW5hYmxlIG11bHRpY2FzdCBtb2RlIG9uIHRoZSBpbnRlcmZhY2UKKyMgUmVzdWx0cyBFeHBlY3RlZDogQWZ0ZXIgY2FsbGluZyBpZmNvbmZpZyBkdW1teTAsIHRoZXJlIGlzIG9uZSBsaW5lIHdpdGggdGhlCisjICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdCBmbGFnCit0ZXN0aW5nICJkdW1teTAgbXVsdGljYXN0IiBcCisiaWZjb25maWcgZHVtbXkwIG11bHRpY2FzdCAmJiBpZmNvbmZpZyBkdW1teTAgfCBncmVwIC1pIG11bHRpY2FzdCB8IHdjIC1sIiBcCisiMVxuIiAiIiAiIgorCisjIFRlc3QgRGVzY3JpcHRpb246IERpc2FibGUgbXVsdGljYXN0IG1vZGUgdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgdGhlcmUgYXJlIG5vIGxpbmVzIHdpdGggdGhlCisjICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdCBmbGFnCit0ZXN0aW5nICJkdW1teTAgLW11bHRpY2FzdCIgXAorImlmY29uZmlnIGR1bW15MCAtbXVsdGljYXN0ICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgLWkgbXVsdGljYXN0IHwgd2MgLWwiIFwKKyIwXG4iICIiICIiCisKKyMgVGVzdCBEZXNjcmlwdGlvbjogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgdGhlIGludGVyZmFjZQorIyBSZXN1bHRzIEV4cGVjdGVkOiBBZnRlciBjYWxsaW5nIGlmY29uZmlnIGR1bW15MCwgdGhlcmUgaXMgb25lIGxpbmUgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgcHJvbWlzYyBmbGFnCit0ZXN0aW5nICJkdW1teTAgcHJvbWlzYyIgXAorImlmY29uZmlnIGR1bW15MCBwcm9taXNjICYmIGlmY29uZmlnIGR1bW15MCB8IGdyZXAgLWkgcHJvbWlzYyB8IHdjIC1sIiAiMVxuIiBcCisiIiAiIgorCisjIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSB0aGUgaW50ZXJmYWNlCisjIFJlc3VsdHMgRXhwZWN0ZWQ6IEFmdGVyIGNhbGxpbmcgaWZjb25maWcgZHVtbXkwLCB0aGVyZSBhcmUgbm8gbGluZXMgd2l0aCB0aGUKKyMgICAgICAgICAgICAgICAgICAgcHJvbWlzYyBmbGFnCit0ZXN0aW5nICJkdW1teTAgLXByb21pc2MiIFwKKyJpZmNvbmZpZyBkdW1teTAgLXByb21pc2MgJiYgaWZjb25maWcgZHVtbXkwIHwgZ3JlcCAtaSBwcm9taXNjIHwgd2MgLWwiICIwXG4iIFwKKyIiICIiCisKKyMgRGlzYWJsZSB0aGUgZHVtbXkgaW50ZXJmYWNlCitpZmNvbmZpZyBkdW1teTAgZG93bgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2xpbmsudGVzdCBiL3RveWJveC90ZXN0cy9saW5rLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDkxYjc5NAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9saW5rLnRlc3QKQEAgLTAsMCArMSwyNiBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxNCBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxNCBOYWhhIE1hZ2d1IDxtYWdndS5uZWhhQGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitlY2hvICIiID5mb28KK3Rlc3RpbmcgImZhaWxzIG9uIG5vbi1leGlzdGVudCBmaWxlIiAibGluayBmb28vZm9vIGJheiB8fCBlY2hvIEdPT0QiICJHT09EXG4iICIiICIiCitybSAtZiBmb28gYmFyCisKK2VjaG8gZmlsZTEgPiBmaWxlCit0ZXN0aW5nICJjcmVhdGVfaGFyZGxpbmsiICJsaW5rIGZpbGUgaGxpbmsgJiYgWyBmaWxlIC1lZiBobGluayBdICYmCisgICAgICAgICAgZWNobyAneWVzJzsgcm0gIC1yZiBobGluayIgInllc1xuIiAiIiAiIgorCitlY2hvIGhsaW5rMSA+IGhsaW5rCitzZXQgK2UKK3Rlc3RpbmcgInByZXNlcnZlc19oYXJkbGlua3MiICJsaW5rIGZpbGUgaGxpbmsgMj4vZGV2L251bGwgfHwgZWNobyAneWVzJzsgcm0gLXJmIGhsaW5rIiBcCisgICAgICAgICAgInllc1xuIiAiIiAiIgorCitlY2hvIGZpbGUxID4gZmlsZQordGVzdGluZyAiY3JlYXRlX2hhcmRsaW5rX2FuZF9yZW1vdmVfc291cmNlZmlsZSIgImxpbmsgZmlsZSBobGluayAmJgorICAgICAgICAgIFsgZmlsZSAtZWYgaGxpbmsgXSAmJiBybSAtcmYgZmlsZSAmJiBbIC1mIGhsaW5rIF0gJiYgZWNobyAneWVzJzsgcm0gLWYgZmlsZSBobGluayIgXAorICAgICAgICAgICJ5ZXNcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9sbi50ZXN0IGIvdG95Ym94L3Rlc3RzL2xuLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2U3MGNkOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9sbi50ZXN0CkBAIC0wLDAgKzEsNzAgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTMgUm9iaW4gTWl0dGFsIDxyb2Jpbm1pdHRhbC5pdEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKyNzZXQgLXgKKworZWNobyBmaWxlMSA+IGZpbGUKK3Rlc3RpbmcgImNyZWF0ZV9oYXJkbGluayIgImxuIGZpbGUgaGxpbmsgJiYgWyBmaWxlIC1lZiBobGluayBdICYmCisgICAgICAgICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiY3JlYXRlX3NvZnRsaW5rIiAibG4gLXMgZmlsZSBzbGluayAmJiBbIC1MIHNsaW5rIF0gJiYKKyAgICAgICAgICByZWFkbGluayBzbGluayIgImZpbGVcbiIgIiIgIiIKK3JtIHNsaW5rIGhsaW5rCisKK2VjaG8gaGxpbmsxID4gaGxpbmsKK3Rlc3RpbmcgImZvcmNlX2NyZWF0ZV9oYXJkbGluayIgImxuIC1mIGZpbGUgaGxpbmsgJiYKKyAgICAgICAgICBbIGZpbGUgLWVmIGhsaW5rIF0gJiYgY2F0IGhsaW5rIDI+L2Rldi9udWxsIiAiZmlsZTFcbiIgIiIgIiIKKworZWNobyBzbGluazEgPiBzbGluawordGVzdGluZyAiZm9yY2VfY3JlYXRlX3NvZnRsaW5rIiAibG4gLWYgLXMgZmlsZSBzbGluayAmJgorICAgICAgICAgIFsgLUwgc2xpbmsgXSAmJiByZWFkbGluayBzbGluayIgImZpbGVcbiIgIiIgIiIKK3JtIHNsaW5rIGhsaW5rCisKK2VjaG8gaGxpbmsxID4gaGxpbmsKK3NldCArZQordGVzdGluZyAicHJlc2VydmVzX2hhcmRsaW5rcyIgImxuIGZpbGUgaGxpbmsgMj4vZGV2L251bGwgfHwgZWNobyAneWVzJyIgXAorICAgICAgICAgICJ5ZXNcbiIgIiIgIiIKKworZWNobyBzbGluazEgPiBzbGluaworc2V0ICtlCit0ZXN0aW5nICJwcmVzZXJ2ZXNfc29mdGxpbmtzIiAibG4gLXMgZmlsZSBzbGluayAyPi9kZXYvbnVsbCB8fCBlY2hvICd5ZXMnIiBcCisgICAgICAgICAgInllc1xuIiAiIiAiIgorcm0gc2xpbmsgaGxpbmsKKworbWtkaXIgZGlyCit0ZXN0aW5nICJtdWx0aWxldmVsX3N5bWJvbGljX2xpbmtzIiAibG4gLXMgZGlyIHNsaW5rICYmCisgICAgICAgICAgbG4gLXMgZmlsZSBzbGluayAmJiBbIC1MIHNsaW5rIC1hIC1MIHNsaW5rL2ZpbGUgXSAmJgorICAgICAgICAgIHJlYWRsaW5rIHNsaW5rICYmIHJlYWRsaW5rIHNsaW5rL2ZpbGUiICJkaXJcbmZpbGVcbiIgIiIgIiIKK3JtIHNsaW5rCisKK3Rlc3RpbmcgIm5vX2RlcmVmZXJlbmNlIiAibG4gLXMgZGlyIHNsaW5rICYmCisgICAgICAgICAgbG4gLW4gLXMgZmlsZSBzbGluayAyPi9kZXYvbnVsbCB8fCBbIC1MIHNsaW5rIF0gJiYgcmVhZGxpbmsgc2xpbmsiIFwKKyAgICAgICAgICAiZGlyXG4iICIiICIiCitybSAtcmYgZmlsZSBkaXIgc2xpbmsKKwordG91Y2ggZmlsZTEgZmlsZTIgJiYgbWtkaXIgZGlyCit0ZXN0aW5nICJjcmVhdGVfbXVsdGlwbGVfaGFyZGxpbmtzIiAibG4gZmlsZSogZGlyLyAmJgorICAgWyBmaWxlMSAtZWYgZGlyL2ZpbGUxIC1hIGZpbGUyIC1lZiBkaXIvZmlsZTIgXSAmJiBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIiCitybSAtcmYgZmlsZSogZGlyCisKK3RvdWNoIGZpbGUxIGZpbGUyICYmIG1rZGlyIGRpcgordGVzdGluZyAiY3JlYXRlX211bHRpcGxlX3NvZnRsaW5rcyIgImxuIC1zIGZpbGUqIGRpci8gJiYKKyAgICAgICAgICBbIC1MIGRpci9maWxlMSAtYSAtTCBkaXIvZmlsZTIgXSAmJiByZWFkbGluayBkaXIvZmlsZTEgJiYKKyAgICAgICAgICByZWFkbGluayBkaXIvZmlsZTIiICJmaWxlMVxuZmlsZTJcbiIgIiIgIiIKK3JtIC1yZiBmaWxlKiBkaXIKKworZWNobyBmaWxlMSA+IGZpbGUKK3Rlc3RpbmcgImNyZWF0ZV9zb2Z0bGlua19hbmRfcmVtb3ZlX3NvdXJjZWZpbGUiICJsbiAtcyBmaWxlIHNsaW5rICYmCisgICAgICAgICAgWyAtTCBzbGluayBdICYmIHJtIGZpbGUgJiYgY2F0IHNsaW5rIDI+L2Rldi9udWxsIHx8IGVjaG8gJ3llcycgIiBcCisgICAgICAgICAgInllc1xuIiAiIiAiIgorcm0gLWYgZmlsZSBzbGluaworCitlY2hvIGZpbGUxID4gZmlsZQordGVzdGluZyAiY3JlYXRlX2hhcmRsaW5rX2FuZF9yZW1vdmVfc291cmNlZmlsZSIgImxuIGZpbGUgaGxpbmsgJiYKKyAgICAgICAgICBbIGZpbGUgLWVmIGhsaW5rIF0gJiYgcm0gZmlsZSAmJiBbIC1mIGhsaW5rIF0gJiYgZWNobyAneWVzJyIgXAorICAgICAgICAgICJ5ZXNcbiIgIiIgIiIKK3JtIC1mIGZpbGUgaGxpbmsKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9sb3NldHVwLnRlc3QgYi90b3lib3gvdGVzdHMvbG9zZXR1cC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MWM2OTMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvbG9zZXR1cC50ZXN0CkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCitpZiBbICIkKGlkIC11KSIgLW5lIDAgXQordGhlbgorICBlY2hvICIkU0hPV1NLSVA6IGxvc2V0dXAgKG5vdCByb290KSIKKyAgY29udGludWUgMj4vZGV2L251bGwKKyAgZXhpdAorZmkKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3RydW5jYXRlIC1zIDFNIGJsYWguaW1nICYmCitGSUxFPSIkKHJlYWRsaW5rIC1mIGJsYWguaW1nKSIKK0RFVj0iJChwcmludGYgJyUwNGQnICQoc3RhdCAtdCBibGFoLmltZyB8IGF3ayAne3ByaW50ICQ3fScpKSIKK05PREU9IiQoYXdrICd7cHJpbnQgJDd9JykiCisKK2xvc2V0dXAgLWYgCitsb3NldHVwIC1mIC1zCitsb3NldHVwIC1mIGZpbGUKKworbG9zZXR1cCAtZAorCitybSBibGFoLmltZwpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL2xzLnRlc3QgYi90b3lib3gvdGVzdHMvbHMudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzg1MGRlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2xzLnRlc3QKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMTMgRGl2eWEgS290aGFyaSA8ZGl2eWEucy5rb3RoYXJpQGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorI3NldCAteAorCisjIENyZWF0aW5nIHRlc3QtZmlsZS9kaXIgZm9yIHRlc3RpbmcgbHMKK21rZGlyIC1wIGxzdGVzdC9kaXIxIGxzdGVzdC9kaXIyIHx8IGV4aXQgMQorZWNobyAidGVzdCBmaWxlMSIgPiBsc3Rlc3QvZmlsZTEudHh0CitlY2hvICJ0ZXN0IGZpbGUyIiA+IGxzdGVzdC9maWxlMi50eHQKK2VjaG8gImhpZGRlbiBmaWxlMSIgPiBsc3Rlc3QvLmhmaWxlMQorCitJTj0iY2QgbHN0ZXN0IgorT1VUPSJjZCAuLiAiCisKK3Rlc3RpbmcgIm5vIGFyZ3VtZW50IiAiJElOICYmIGxzOyAkT1VUIiAiZGlyMVxuZGlyMlxuZmlsZTEudHh0XG5maWxlMi50eHRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggd2lsZCBjaGFyIiAiJElOICYmIGxzIGZpbGUqOyAkT1VUIiAiZmlsZTEudHh0XG5maWxlMi50eHRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggd2lsZCBjaGFyIC0gbG9uZyBsaXN0aW5nIiAiJElOICYmIGxzIC0xIGZpbGUqOyAkT1VUIiAiZmlsZTEudHh0XG5maWxlMi50eHRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggLXAiICIkSU4gJiYgbHMgLXA7ICRPVVQiICJkaXIxL1xuZGlyMi9cbmZpbGUxLnR4dFxuZmlsZTIudHh0XG4iICIiICIiCit0ZXN0aW5nICJ3aXRoIC1hIiAiJElOICYmIGxzIC1hOyAkT1VUIiBcCisgICAgICAgICIuXG4uLlxuZGlyMVxuZGlyMlxuZmlsZTEudHh0XG5maWxlMi50eHRcbi5oZmlsZTFcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggLUEiICIkSU4gJiYgbHMgLUE7ICRPVVQiIFwKKyAgICAgICAgImRpcjFcbmRpcjJcbmZpbGUxLnR4dFxuZmlsZTIudHh0XG4uaGZpbGUxXG4iICIiICIiCit0ZXN0aW5nICJ3aXRoIC1kIiAiJElOICYmIGxzIC1kOyAkT1VUIiAiLlxuIiAiIiAiIgordGVzdGluZyAid2l0aCB3aWxkIGNoYXIgYW5kIC1kICoiICIkSU4gJiYgbHMgLWQgKjsgJE9VVCIgImRpcjFcbmRpcjJcbmZpbGUxLnR4dFxuZmlsZTIudHh0XG4iICIiICIiCit0ZXN0aW5nICJ3aXRoIC1rIiAiJElOICYmIGxzIC1rOyAkT1VUIiAiZGlyMVxuZGlyMlxuZmlsZTEudHh0XG5maWxlMi50eHRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggLW0iICIkSU4gJiYgbHMgLW07ICRPVVQiICJkaXIxLCBkaXIyLCBmaWxlMS50eHQsIGZpbGUyLnR4dFxuIiAiIiAiIgordGVzdGluZyAid2l0aCAtRiIgIiRJTiAmJiBscyAtRjsgJE9VVCIgImRpcjEvXG5kaXIyL1xuZmlsZTEudHh0XG5maWxlMi50eHRcbiIgIiIgIiIKK3Rlc3RpbmcgIndpdGggLWRrICoiICIkSU4gJiYgbHMgLWRrICo7ICRPVVQiICJkaXIxXG5kaXIyXG5maWxlMS50eHRcbmZpbGUyLnR4dFxuIiAiIiAiIgorCitsbiAtcyBmaWxlMS50eHQgbHN0ZXN0L3NsaW5rCit0ZXN0aW5nICJzb2Z0bGluayAtIGxvbmcgbGlzdGluZyIgIiRJTiAmJiBscyAtbCBzbGluayB8IGF3ayAneyBwcmludCBcJE5GIH0nIDsgJE9VVCIgXAorICAgICAgICAgICJmaWxlMS50eHRcbiIgIiIgIiIKK3JtIC1mIGxzdGVzdC9zbGluaworCitsbiAtcyAvZGV2L251bGwvbm9zdWNoZmlsZSBsc3Rlc3Qvbm9zdWNoZmlsZQordGVzdGluZyAid2l0aCAtZCAtIGJyb2tlbiBzb2Z0bGluayIgIiRJTiAmJiBscyAtZCBub3N1Y2hmaWxlOyAkT1VUIiAibm9zdWNoZmlsZVxuIiAiIiAiIgorcm0gLWYgbHN0ZXN0L25vc3VjaGZpbGUKKworcm0gLXJmIGxzdGVzdC8qICYmIG1rZGlyIC1wIGxzdGVzdC9kaXIxICYmIHRvdWNoIGxzdGVzdC9maWxlMS50eHQKK3Rlc3RpbmcgIm5lc3RlZCByZWN1cnNpdmVseSIgIiRJTiAmJiBscyAtUjsgJE9VVCIgXAorICAgICAgICAgICIuOlxuZGlyMVxuZmlsZTEudHh0XG5cbi4vZGlyMTpcbiIgIiIgIiIKKworcm0gLXJmIGxzdGVzdC8qICYmIHRvdWNoIGxzdGVzdC9maWxlMS50eHQgJiYgSU5PREU9YHN0YXQgLWMgJWkgbHN0ZXN0L2ZpbGUxLnR4dGAKK3Rlc3RpbmcgIndpdGggLWkiICIkSU4gJiYgbHMgLWkgMj4vZGV2L251bGw7ICRPVVQiICIkSU5PREUgZmlsZTEudHh0XG4iICIiICIiCit1bnNldCBJTk9ERQorCisjIFJlbW92aW5nIHRlc3QgZGlyIGZvciBjbGVhbnVwIHB1cnBvc2UKK3JtIC1yZiBsc3Rlc3QKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9sc2F0dHIudGVzdCBiL3RveWJveC90ZXN0cy9sc2F0dHIudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmM3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL2xzYXR0ci50ZXN0CkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBsc2F0dHIgLSBUZXN0Y2FzZXMKK21rZGlyIGRpciAmJiBjZCBkaXIgJiYgdG91Y2ggZmlsZQorY2hhdHRyICtBIGZpbGUgJj4vZGV2L251bGwKKworX3A9JFBXRAorX2I9Ii0tLS0tLS0tLS0tLS0iCitfQT0iLS0tLS0tLUEtLS0tLSIKKwordGVzdGluZyAiZmlsZSIgImxzYXR0ciBmaWxlIiAiJF9BIGZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgImZpbGVfcGF0aCIgImxzYXR0ciAkX3AvZmlsZSIgIiRfQSAkX3AvZmlsZVxuIiAiIiAiIgordGVzdGluZyAiLVIgZmlsZSIgImxzYXR0ciAtUiBmaWxlIiAiJF9BIGZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1SIGZpbGVfcGF0aCIgImxzYXR0ciAtUiAkX3AvZmlsZSIgIiRfQSAkX3AvZmlsZVxuIiAiIiAiIgordGVzdGluZyAiLWEgZmlsZSIgImxzYXR0ciAtYSBmaWxlIiAiJF9BIGZpbGVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1hIGZpbGVfcGF0aCIgImxzYXR0ciAtYSAkX3AvZmlsZSIgIiRfQSAkX3AvZmlsZVxuIiAiIiAiIgordGVzdGluZyAiLWQgLiIgImxzYXR0ciAtZCAuIiAiJF9iIC5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIGRpcl9wYXRoIiAibHNhdHRyIC1kICRfcCIgIiRfYiAkX3BcbiIgIiIgIiIKK3Rlc3RpbmcgIi1kIGZpbGUiICJsc2F0dHIgLWQgZmlsZSIgIiRfQSBmaWxlXG4iICIiICIiCit0ZXN0aW5nICItZCBmaWxlX3BhdGgiICJsc2F0dHIgLWQgJF9wL2ZpbGUiICIkX0EgJF9wL2ZpbGVcbiIgIiIgIiIKK3NwXzQ0PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKK3Rlc3RpbmcgIi1sIGZpbGUiICJsc2F0dHIgLWwgZmlsZSIgImZpbGUgICRzcF80NCBOb19BdGltZVxuIiAiIiAiIgorX3Y9IjEyMzQ1IgordGVzdGluZyAiLXYgZmlsZSIgImNoYXR0ciAtdiAkX3YgKiAmJiBsc2F0dHIgLXYgZmlsZSIgXAorICAiJF92ICRfQSBmaWxlXG4iICIiICIiCit0ZXN0aW5nICItdiBmaWxlX3BhdGgiICJjaGF0dHIgLXYgJF92ICogJiYgbHNhdHRyIC12ICRfcC9maWxlIiBcCisgICIkX3YgJF9BICRfcC9maWxlXG4iICIiICIiCit0ZXN0aW5nICItUmFkbHYgZmlsZTEgZmlsZTIiICJjaGF0dHIgLXYgJF92ICogJiYKKyAgIGxzYXR0ciAtUmFkbHYgZmlsZSBpbnB1dCIgXAorICAiJF92IGZpbGUgICRzcF80NCBOb19BdGltZVxuJF92IGlucHV0ICRzcF80NCAtLS1cbiIgIiIgIiIKKworIyBDbGVhbnVwCitjaGF0dHIgLUFhY0RkaWpzU3RUdSBmaWxlICYmIGNkIC4uCitybSAtcmYgZGlyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvbWQ1c3VtLnRlc3QgYi90b3lib3gvdGVzdHMvbWQ1c3VtLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjE1OWQxZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9tZDVzdW0udGVzdApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgVGhlc2UgdGVzdHMgYXJlIGZyb20gUkZDIDEzMjEgYXBwZW5kaXggNSwgcmVzaHVmZmxlZCBzbGlnaHRseSB0byB0ZXN0CisjIHZhcnlpbmcgYXJndW1lbnQgbnVtYmVycworCit0ZXN0aW5nICInJyIgIm1kNXN1bSIgImQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlICAtXG4iICIiICIiCit0ZXN0aW5nICJpbmZpbGUiICJtZDVzdW0gaW5wdXQiIFwKKyAgIjBjYzE3NWI5YzBmMWI2YTgzMWMzOTllMjY5NzcyNjYxICBpbnB1dFxuIiAiYSIgIiIKK3Rlc3RpbmcgInR3byBmaWxlcyIgIm1kNXN1bSAtIGlucHV0IiBcCisgICI5MDAxNTA5ODNjZDI0ZmIwZDY5NjNmN2QyOGUxN2Y3MiAgLVxuZjk2YjY5N2Q3Y2I3OTM4ZDUyNWEyZjMxYWFmMTYxZDAgIGlucHV0XG4iIFwKKyAgIm1lc3NhZ2UgZGlnZXN0IiAiYWJjIgordGVzdGluZyAiNCIgIm1kNXN1bSIgImMzZmNkM2Q3NjE5MmU0MDA3ZGZiNDk2Y2NhNjdlMTNiICAtXG4iIFwKKyAgIiIgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgordGVzdGluZyAiNSIgIm1kNXN1bSIgImQxNzRhYjk4ZDI3N2Q5ZjVhNTYxMWMyYzlmNDE5ZDlmICAtXG4iIFwKKyAgIiIgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IgordGVzdGluZyAiNiIgIm1kNXN1bSIgIjU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhICAtXG4iIFwKKyAgIiIgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorCitlY2hvIC1uICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIgPiAidGUgc3QiCit0b3VjaCBlbXB0eQordGVzdGluZyAiLWMgc3BhY2VzIiAibWQ1c3VtIC1jIGlucHV0IHx8IGVjaG8gb2siIFwKKyAgInRlIHN0OiBPS1xuZW1wdHk6IEZBSUxFRFxuLTogT0tcbm9rXG4iIFwKKyIkKHByaW50ZiAiZDE3NGFiOThkMjc3ZDlmNWE1NjExYzJjOWY0MTlkOWYgdGUgc3RcbjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyIGVtcHR5XG5kNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSAtXG4iKSIgIiIKK3JtICJ0ZSBzdCIgZW1wdHkKKwordGVzdGluZyAiLWMgbm9saW5lcyIgIm1kNXN1bSAtYyBpbnB1dCAyPi9kZXYvbnVsbCB8fCBlY2hvIG9rIiAib2tcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9ta2Rpci50ZXN0IGIvdG95Ym94L3Rlc3RzL21rZGlyLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTFiZGI4OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9ta2Rpci50ZXN0CkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAibWtkaXIiICJta2RpciBvbmUgJiYgWyAtZCBvbmUgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorcm1kaXIgb25lCisKK3RvdWNoIGV4aXN0aW5nCit0ZXN0aW5nICJleGlzdGluZyIgXAorCSJta2RpciBleGlzdGluZyAyPiAvZGV2L251bGwgfHwgWyAtZiBleGlzdGluZyBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybSBleGlzdGluZworCit0ZXN0aW5nICJvbmUgdHdvIiBcCisJIm1rZGlyIG9uZSB0d28gJiYgWyAtZCBvbmUgXSAmJiBbIC1kIHR3byBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybWRpciBvbmUgdHdvCisKK3Rlc3RpbmcgIm1pc3Npbmcvb25lIiBcCisJIm1rZGlyIG1pc3Npbmcvb25lIDI+IC9kZXYvbnVsbCB8fCBbICEgLWQgbWlzc2luZyBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKK3Rlc3RpbmcgIi1wIiBcCisJIm1rZGlyIC1wIG9uZS90d28vdGhyZWUgJiYgWyAtZCBvbmUvdHdvL3RocmVlIF0gJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBvbmUKKworbWtkaXIgZXhpc3RpbmcKK3Rlc3RpbmcgIi1wIGV4aXN0aW5nIiAibWtkaXIgLXAgZXhpc3RpbmcgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3JtZGlyIGV4aXN0aW5nCisKK3VtYXNrIDEyMwordGVzdGluZyAiKGRlZmF1bHQgcGVybWlzc2lvbnMpIiBcCisJIm1rZGlyIG9uZSAmJiBzdGF0IC1jICVhIG9uZSIgIjY1NFxuIiAiIiAiIgorcm1kaXIgb25lCisKK3Rlc3RpbmcgIi1tIDEyNCIgXAorCSJta2RpciAtbSAxMjQgb25lICYmIHN0YXQgLWMgJWEgb25lIiAiMTI0XG4iICIiICIiCitybWRpciBvbmUKKwordW1hc2sgMDAwCit0ZXN0aW5nICItcCAtbSA2NTMiIFwKKwkibWtkaXIgLXAgLW0gNjUzIG9uZS90d28gJiYgc3RhdCAtYyAlYSBvbmUgJiYgc3RhdCAtYyAlYSBvbmUvdHdvIiBcCisJIjc3N1xuNjUzXG4iICIiICIiCitybSAtcmYgb25lCisKK3Rlc3RpbmcgIi1wIG9uZS90d28vICh0cmFpbGluZyBzbGFzaCkiIFwKKwkibWtkaXIgLXAgb25lL3R3by8gJiYgIFsgLWQgb25lL3R3byBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybSAtcmYgb25lCisKK3VtYXNrIDAyMgordGVzdGluZyAiLXAgLW0gNzc3ICgwMjIgdW1hc2spIiBcCisJIm1rZGlyIC1wIC1tIDc3NyBvbmUvdHdvICYmIHN0YXQgLWMgJWEgb25lICYmIHN0YXQgLWMgJWEgb25lL3R3byIgXAorCSI3NTVcbjc3N1xuIiAiIiAiIgorcm0gLXJmIG9uZQorCit1bWFzayAzNzcKK3Rlc3RpbmcgIi1wIC1tIDc3NyAoMzc3IHVtYXNrKSIgXAorCSJta2RpciAtcCAtbSA3Nzcgb25lL3R3byAmJiBzdGF0IC1jICVhIG9uZSAmJiBzdGF0IC1jICVhIG9uZS90d28iIFwKKwkiNzAwXG43NzdcbiIgIiIgIiIKK3VtYXNrIDAwMgorcm0gLXJmIG9uZQorCit0ZXN0aW5nICItdnAiICJta2RpciAtdnAgd2FscnVzIDI+JjEiIFwKKwkibWtkaXI6IGNyZWF0ZWQgZGlyZWN0b3J5ICd3YWxydXMnXG4iICIiICIiCisKK3Rlc3RpbmcgIi12cCBleGlzdHMiICJta2RpciAtdnAgd2FscnVzIDI+JjEiIFwKKwkiIiAiIiAiIgorcm0gLXJmIHdhbHJ1cworCit0b3VjaCB0d28KK3Rlc3RpbmcgImNvbnRpbnVlIGFmdGVyIGZhaWwiIFwKKwkibWtkaXIgLW0gNzc3IG9uZSB0d28gdGhyZWUgMj4vZGV2L251bGwgfHwgc3RhdCAtYyAlYSB0aHJlZSIgXAorCSI3NzdcbiIgIiIgIiIKK3JtIC1yZiBvbmUgdHdvIHRocmVlCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvbWtmaWZvLnRlc3QgYi90b3lib3gvdGVzdHMvbWtmaWZvLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmFhYWQxZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9ta2ZpZm8udGVzdApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgIm1rZmlmbyIgIm1rZmlmbyBvbmUgJiYgWyAtcCBvbmUgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorcm0gb25lCisKK3RvdWNoIGV4aXN0aW5nCit0ZXN0aW5nICJleGlzdGluZyIgXAorCSJta2ZpZm8gZXhpc3RpbmcgMj4gL2Rldi9udWxsIHx8IFsgLWYgZXhpc3RpbmcgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorcm0gZXhpc3RpbmcKKwordGVzdGluZyAib25lIHR3byIgXAorCSJta2ZpZm8gb25lIHR3byAmJiBbIC1wIG9uZSBdICYmIFsgLXAgdHdvIF0gJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3JtIG9uZSB0d28KKwordW1hc2sgMTIzCit0ZXN0aW5nICIoZGVmYXVsdCBwZXJtaXNzaW9ucykiIFwKKwkibWtmaWZvIG9uZSAmJiBzdGF0IC1jICVhIG9uZSIgIjY0NFxuIiAiIiAiIgorcm0gb25lCisKK3VtYXNrIDAwMAorCit0ZXN0aW5nICItbSAxMjQiIFwKKwkibWtmaWZvIC1tIDEyNCBvbmUgJiYgc3RhdCAtYyAlYSBvbmUiICIxMjRcbiIgIiIgIiIKK3JtIC1mIG9uZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL21vZGluZm8udGVzdCBiL3RveWJveC90ZXN0cy9tb2RpbmZvLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE4YzJiZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9tb2RpbmZvLnRlc3QKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitbIC1lIC9wcm9jL21vZHVsZXMgXSB8fCB7IGVjaG8gIlNraXBwaW5nIHRlc3QgYmVjYXVzZSBtb2R1bGVzIGFyZSBub3Qgc3VwcG9ydGVkIjsgZXhpdCAxOyB9CisKKyMgbW9kaW5mbyBkb2VzIG5vdCBuZWVkIHRvIG91dHB1dCBmaWVsZHMgaW4gYSBzcGVjaWZpZWQgb3JkZXIuCisjIEluc3RlYWQsIHRoZXJlIGFyZSBsYWJlbGxlZCBmaWVsZHMuICBXZSBjYW4gdXNlIHNvcnQgdG8gbWFrZSB1cCBmb3IgdGhpcy4KKyMgT3RoZXIgaXNzdWVzIHRvIGJld2FyZSBvZiBhcmUgdGhlIHZvbGF0aWxlIG5hdHVyZSBvZiBzcmN2ZXJzaW9uIGFuZCB2ZXJtYWdpYywKKyMgd2hpY2ggY2hhbmdlIGZyb20ga2VybmVsIHRvIGtlcm5lbCBhbmQgY2FuIGJlIGRpc2FibGVkLiAKKyMgV2UgZ3JlcCB0byByZW1vdmUgdGhlc2UuCisKKyNXZSBleHBlY3QgdGhleSBoYXZlIG5lMmstcGNpIGFzIGEgbW9kdWxlLgorCit0ZXN0aW5nICJnZXRzIHJpZ2h0IG51bWJlciBvZiBmaWVsZHMiICJtb2RpbmZvIG5lMmstcGNpIHxjdXQgLWQ6IC1mMSB8Z3JlcCAtdiB2ZXJ8c29ydCIgImFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYXV0aG9yXG5kZXBlbmRzXG5kZXNjcmlwdGlvblxuZmlsZW5hbWVcbmxpY2Vuc2VcbnBhcm1cbnBhcm1cbnBhcm1cbiIgIiIgIiIKK3Rlc3RpbmcgInRyZWF0cyAtIGFuZCBfIGFzIGVxdWl2YWxlbnQiICJtb2RpbmZvIG5lMmtfcGNpIHxjdXQgLWQ6IC1mMSB8Z3JlcCAtdiB2ZXJ8c29ydCIgImFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYWxpYXNcbmFsaWFzXG5hbGlhc1xuYXV0aG9yXG5kZXBlbmRzXG5kZXNjcmlwdGlvblxuZmlsZW5hbWVcbmxpY2Vuc2VcbnBhcm1cbnBhcm1cbnBhcm1cbiIgIiIgIiIKKworIyBPdXRwdXQgb2YgLUYgZmlsZW5hbWUgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1vZHVsZS4KKyMgT3RoZXJ3aXNlLCBpbml0cmQgZ2VuZXJhdGluZyBzY3JpcHRzIHdpbGwgYnJlYWsuCisKK3Rlc3RpbmcgIi1GIGZpbGVuYW1lIGdldHMgYWJzb2x1dGUgcGF0aCIgIlsgLWUgYG1vZGluZm8gLUYgZmlsZW5hbWUgbmUyay1wY2lgIF0gJiYgZWNobyBuZTJrLXBjaSAiICJuZTJrLXBjaVxuIiAiIiAiIgorCit0ZXN0aW5nICJzdXBwb3J0cyBtdWx0aXBsZSBtb2R1bGVzIiAibW9kaW5mbyAtRiBmaWxlbmFtZSBuZTJrLXBjaSA4MzkwIHwgd2MgLWwiICIyXG4iICIiICIiCisKK3Rlc3RpbmcgImRvZXMgbm90IG91dHB1dCBmaWxlbmFtZSBmb3IgYmFkIG1vZHVsZSIgIm1vZGluZm8gLUYgZmlsZW5hbWUgenhjdmJubV9fOTc1MyIgIiIgIiIgIiIKKworCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9tb3JlLnRlc3QgYi90b3lib3gvdGVzdHMvbW9yZS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkY2Y2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvbW9yZS50ZXN0CkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworY2F0ID5maWxlMSA8PEVPRgorbGluZTEKK2xpbmUyCitFT0YKKwordGVzdGluZyAibm9uLXR0eSIgIm1vcmUgZmlsZTEgfCBjYXQgLSIgImxpbmUxXG5saW5lMlxuIiAiIiAiIgorCitybSBmaWxlMQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL21vdW50LnRlc3QgYi90b3lib3gvdGVzdHMvbW91bnQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTkwYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL21vdW50LnRlc3QKQEAgLTAsMCArMSw5MSBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCityb290X2ZzPWBkZiB8IGdyZXAgIlwvJCIgfCBhd2sgJ3twcmludCAkMX0nYAorcm9vdF9mc190eXBlPWBmaWxlIC1zTCAkcm9vdF9mcyB8IGF3ayAne3ByaW50ICQ1fSdgCisKK3RtcF9iX2ZzPSJ0bXBfYl9mcyIKK3RtcF9iX2ZzX3R5cGU9ImV4dDMiCisKK3JlQ3JlYXRlVG1wRnMoKSB7CisgIHJtIC1yZiAkdG1wX2JfZnMKKyAgbWtub2QgJHRtcF9iX2ZzIGIgMSAwCisgIG1rZnMuZXh0MyAkdG1wX2JfZnMgPi9kZXYvbnVsbCAyPiYxCit9CityZUNyZWF0ZVRtcEZzCisKK3Rlc3RpbmcgIiRyb290X2ZzIC9tbnQiIFwKKyAgIm1vdW50ICRyb290X2ZzIC9tbnQgPi9kZXYvbnVsbCAyPiYxICYmIG1rZGlyIC9tbnQvdGVzdERpciAmJgorICAgc2xlZXAgMSAmJiB1bW91bnQgL21udCAmJiB0ZXN0IC1lIC90ZXN0RGlyICYmIHJtZGlyIC90ZXN0RGlyIiAiIiAiIiAiIgordGVzdGluZyAiJHRtcF9iX2ZzIC9tbnQiIFwKKyAgIm1vdW50ICR0bXBfYl9mcyAvbW50ID4vZGV2L251bGwgMj4mMSAmJiBta2RpciAvbW50L3Rlc3REaXIgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IC9tbnQgJiYgISB0ZXN0IC1lIC9tbnQvdGVzdERpciIgIiIgIiIgIiIKK3JlQ3JlYXRlVG1wRnMKKworY2htb2QgNDQ0IC9tbnQKK3Rlc3RpbmcgIiRyb290X2ZzIC9tbnQgKHJlYWRfb25seSBkaXIpIiBcCisgICJtb3VudCAkcm9vdF9mcyAvbW50ID4vZGV2L251bGwgMj4mMSAmJiBta2RpciAvbW50L3Rlc3REaXIgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IC9tbnQgJiYgdGVzdCAtZSAvdGVzdERpciAmJiBybWRpciAvdGVzdERpciIgIiIgIiIgIiIKK3Rlc3RpbmcgIiR0bXBfYl9mcyAvbW50IChyZWFkX29ubHkgZGlyKSIgXAorICAibW91bnQgJHRtcF9iX2ZzIC9tbnQgPi9kZXYvbnVsbCAyPiYxICYmIG1rZGlyIC9tbnQvdGVzdERpciAmJgorICAgc2xlZXAgMSAmJiB1bW91bnQgL21udCAmJiAhIHRlc3QgLWUgL21udC90ZXN0RGlyIiAiIiAiIiAiIgorcmVDcmVhdGVUbXBGcworY2htb2QgNzU1IC9tbnQKK3Rlc3RpbmcgIi13ICRyb290X2ZzIC9tbnQgKHdyaXRlX29ubHkgbW9kZSkiIFwKKyAgIm1vdW50IC13ICRyb290X2ZzIC9tbnQgPi9kZXYvbnVsbCAyPiYxICYmIG1rZGlyIC9tbnQvdGVzdERpciAmJgorICAgc2xlZXAgMSAmJiB1bW91bnQgL21udCAmJiB0ZXN0IC1lIC90ZXN0RGlyICYmIHJtZGlyIC90ZXN0RGlyIiAiIiAiIiAiIgordGVzdGluZyAiLXcgJHRtcF9iX2ZzIC9tbnQgKHdyaXRlX29ubHkgbW9kZSkiIFwKKyAgIm1vdW50IC13ICR0bXBfYl9mcyAvbW50ID4vZGV2L251bGwgMj4mMSAmJiBta2RpciAvbW50L3Rlc3REaXIgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IC9tbnQgJiYgISB0ZXN0IC1lIC9tbnQvdGVzdERpciIgIiIgIiIgIiIKK3JlQ3JlYXRlVG1wRnMKK3Rlc3RpbmcgIi1ydyAkdG1wX2JfZnMgL21udCAocmVhZF93cml0ZSBtb2RlKSIgXAorICAnbW91bnQgLXJ3ICR0bXBfYl9mcyAvbW50ID4vZGV2L251bGwgJiYgbWtkaXIgL21udC90ZXN0RGlyICYmIFwKKyAgIHNsZWVwIDEgJiYgISB0ZXN0IC1lIC9tbnQvdGVzdERpciAmJiB1bW91bnQgL21udCcgIiIgIiIgIiIKK3JlQ3JlYXRlVG1wRnMKK3Rlc3RpbmcgIiR0bXBfYl9mcyAvbW50IC10IGZzX3R5cGUiIFwKKyAgIm1vdW50ICR0bXBfYl9mcyAvbW50IC10ICR0bXBfYl9mc190eXBlID4vZGV2L251bGwgMj4mMSAmJgorICAgbWtkaXIgL21udC90ZXN0RGlyICYmIHNsZWVwIDEgJiYgdW1vdW50IC9tbnQgJiYKKyAgICEgdGVzdCAtZSAvbW50L3Rlc3REaXIiICIiICIiICIiCityZUNyZWF0ZVRtcEZzCitta2RpciAtcCB0ZXN0RGlyMS90ZXN0RGlyMiB0ZXN0RGlyCitlY2hvICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgPiB0ZXN0RGlyMS90ZXN0RGlyMi90ZXN0RmlsZQordGVzdGluZyAiLW8gYmluZCBkaXIxIGRpcjIiIFwKKyAgJ21vdW50IC1vIGJpbmQgdGVzdERpcjEgdGVzdERpciA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgY2F0IHRlc3REaXIvdGVzdERpcjIvdGVzdEZpbGUgJiYgc2xlZXAgMSAmJiB1bW91bnQgdGVzdERpcicgXAorICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiIgIiIgIiIKK3Rlc3RpbmcgIi1vIHJiaW5kIGRpcjEgZGlyMiIgXAorICAnbW91bnQgLW8gcmJpbmQgdGVzdERpcjEgdGVzdERpciA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgY2F0IHRlc3REaXIvdGVzdERpcjIvdGVzdEZpbGUgJiYgc2xlZXAgMSAmJiB1bW91bnQgdGVzdERpcicgXAorICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiIgIiIgIiIKK3Rlc3RpbmcgIi1vIGxvb3AgJHRtcF9iX2ZzIC9tbnQiIFwKKyAgIm1vdW50IC1vIGxvb3AgJHRtcF9iX2ZzIC9tbnQgPi9kZXYvbnVsbCAyPiYxICYmIG1rZGlyIC9tbnQvdGVzdERpcnAgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IC1kIC9tbnQgJiYgISB0ZXN0IC1lIC9tbnQvdGVzdERpcnAiICIiICIiICIiCityZUNyZWF0ZVRtcEZzCisKK21rZGlyIHRlc3REaXIyCit0ZXN0aW5nICItbyBtb3ZlIG1vdW50XzEgbW91bnRfMiIgXAorICAibW91bnQgJHRtcF9iX2ZzIHRlc3REaXIxICYmIG1rZGlyIHRlc3REaXIxL3Rlc3REaXJyICYmCisgICBtb3VudCAtbyBtb3ZlIHRlc3REaXIxIHRlc3REaXIyICYmIHRlc3QgLXIgdGVzdERpcjIvdGVzdERpcnIgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IHRlc3REaXIyIiAiIiAiIiAiIgorcmVDcmVhdGVUbXBGcwordGVzdGluZyAiLW8gcncgJHRtcF9iX2ZzIC9tbnQiIFwKKyAgIm1vdW50IC1vIHJ3ICR0bXBfYl9mcyAvbW50ID4vZGV2L251bGwgMj4mMSAmJiBta2RpciAvbW50L3Rlc3REaXIgJiYKKyAgIHNsZWVwIDEgJiYgdW1vdW50IC9tbnQgJiYgISB0ZXN0IC1lIC9tbnQvdGVzdERpciIgIiIgIiIgIiIKK3JlQ3JlYXRlVG1wRnMKK3Rlc3RpbmcgIi1vIHJvICR0bXBfYl9mcyAvbW50IiBcCisgICJtb3VudCAtbyBybyAkdG1wX2JfZnMgL21udCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIG1rZGlyIC9tbnQvdGVzdERpciAyPi9kZXYvbnVsbCB8fCBzbGVlcCAxICYmIHVtb3VudCAvbW50IiAiIiAiIiAiIgorcmVDcmVhdGVUbXBGcwordGVzdGluZyAiLW8gcm8scmVtb3VudCAkdG1wX2JfZnMgL21udCIgXAorICAibW91bnQgLW8gcm8gJHRtcF9iX2ZzIC9tbnQgPi9kZXYvbnVsbCAyPiYxICYmCisgICBta2RpciAvbW50L3Rlc3REaXIgMj4vZGV2L251bGwgfHwgc2xlZXAgMSAmJiB1bW91bnQgL21udCIgIiIgIiIgIiIKK3JlQ3JlYXRlVG1wRnMKKwordW1vdW50IHRlc3REaXIxCitybSAtZiAkdG1wX2JfZnMKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9tdi50ZXN0IGIvdG95Ym94L3Rlc3RzL212LnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM2ZmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9tdi50ZXN0CkBAIC0wLDAgKzEsMTU3IEBACisjIS9iaW4vYmFzaAorCisjIFRPRE86IG5lZWRzIHJvb3QgdG8gbW91bnQgdG1wZnMgdG8gdGVzdCBtb3ZpbmcgYWNyb3NzIGZpbGVzeXN0ZW1zLgorIyBjaGVjayBoYW5kbGluZyBvZiBjaGF0dHIgK2kgaW1tdXRhYmxlIGJpdAorIyAidG91Y2ggdHdvOyBjaG1vZCAtdyB0d287IG12IG9uZSB0d28iIHNob3VsZG4ndCBwcm9tcHQgdG8gZGVsZXRlIHR3byBpZgorIyAgIG9uZSBkb2Vzbid0IGV4aXN0LgorCisjIENvcHlyaWdodCAyMDEzIFJvYmluIE1pdHRhbCA8cm9iaW5taXR0YWwuaXRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3RvdWNoIGZpbGUKK3Rlc3RpbmcgImZpbGUgdG8gZmlsZSIgXAorICAibXYgZmlsZSBmaWxlMSAmJiBbICEgLWUgZmlsZSAtYSAtZiBmaWxlMSBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUKK21rZGlyIGRpcgordGVzdGluZyAiZmlsZSB0byBkaXIiIFwKKyAgIm12IGZpbGUgZGlyICYmIFsgISAtZSBmaWxlIC1hIC1mIGRpci9maWxlIF0gJiYgZWNobyB5ZXMiIFwKKyAgInllc1xuIiAiIiAiIgorcm0gLXJmIGZpbGUqIGRpcioKKworbWtkaXIgZGlyCit0ZXN0aW5nICJkaXIgdG8gZGlyIiBcCisgICJtdiBkaXIgZGlyMSAmJiBbICEgLWUgZGlyIC1hIC1kIGRpcjEgXSAmJiBlY2hvIHllcyIgXAorICAieWVzXG4iICIiICIiCitybSAtcmYgZGlyKgorCitta2RpciBkaXIxIGRpcjIKK3RvdWNoIGZpbGUxIGZpbGUyIGRpcjEvZmlsZTMKK2xuIC1zIGZpbGUxIGxpbmsxCit0ZXN0aW5nICJtdWx0aXBsZSBmaWxlcy9kaXJzIHRvIGEgZGlyIiBcCisgICJtdiBmaWxlMSBmaWxlMiBsaW5rMSBkaXIxIGRpcjIgJiYKKyAgWyAhIC1lIGZpbGUxIC1hICEgLWUgZmlsZTIgLWEgISAtZSBsaW5rMSAtYSAhIC1lIGRpcjEgXSAmJgorICBbIC1mIGRpcjIvZmlsZTEgLWEgLWYgZGlyMi9maWxlMiAtYSAtTCBkaXIyL2xpbmsxIC1hIC1kIGRpcjIvZGlyMSBdICYmCisgIFsgLWYgZGlyMi9kaXIxL2ZpbGUzIF0gJiYgcmVhZGxpbmsgZGlyMi9saW5rMSIgXAorICAiZmlsZTFcbiIgIiIgIiIKK3JtIC1yZiBmaWxlKiBsaW5rKiBkaXIqCisKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlMSBzZWVrPTEwayBjb3VudD0xID4vZGV2L251bGwgMj4mMQordGVzdGluZyAicmFuZG9tIGZpbGUgdG8gbmV3IGZpbGUiIFwKKyAgIm12IGZpbGUxIGZpbGUyICYmIFsgISAtZSBmaWxlMSAtYSAtZiBmaWxlMiBdICYmIHN0YXQgLWMgJXMgZmlsZTIiIFwKKyAgIjUyNDMzOTJcbiIgIiIgIiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUxCitsbiAtcyBmaWxlMSBsaW5rMQordGVzdGluZyAic3ltbGluayB0byBuZXcgc3ltbGluayIgXAorICAibXYgbGluazEgbGluazIgJiYgWyAhIC1lIGxpbmsxIC1hIC1MIGxpbmsyIF0gJiYgcmVhZGxpbmsgbGluazIiIFwKKyAgImZpbGUxXG4iICIiICIiCit1bmxpbmsgdExpbmsyICY+L2Rldi9udWxsCitybSAtZiBmaWxlKiBsaW5rKgorCit0b3VjaCBmaWxlMQorbG4gZmlsZTEgbGluazEKK3Rlc3RpbmcgImhhcmQgbGluayB0byBuZXcgaGFyZGxpbmsiIFwKKyAgIm12IGxpbmsxIGxpbmsyICYmIFsgISAtZSBsaW5rMSAtYSAtZiBsaW5rMiAtYSBmaWxlMSAtZWYgbGluazIgXSAmJiBlY2hvIHllcyIgXAorICAieWVzXG4iICIiICIiCit1bmxpbmsgbGluazIgJj4vZGV2L251bGwKK3JtIC1mIGZpbGUqIGxpbmsqCisKK3RvdWNoIGZpbGUxCitjaG1vZCBhLXIgZmlsZTEKK3Rlc3RpbmcgImZpbGUgdG8gdW5yZWFkYWJsZSBmaWxlIiBcCisgICJtdiBmaWxlMSBmaWxlMiAmJiBbICEgLWUgZmlsZTEgLWEgLWYgZmlsZTIgXSAmJiBlY2hvIHllcyIgXAorICAieWVzXG4iICIiICIiCitybSAtZiBmaWxlKgorCit0b3VjaCBmaWxlMQorbG4gZmlsZTEgbGluazEKK21rZGlyIGRpcjEKK3Rlc3RpbmcgImZpbGUgaGFyZGxpbmsgZGlyIiBcCisgICJtdiBmaWxlMSBsaW5rMSBkaXIxICYmCisgIFsgISAtZSBmaWxlMSAtYSAhIC1lIGxpbmsxIC1hIC1mIGRpcjEvZmlsZTEgLWEgLWYgZGlyMS9saW5rMSBdICYmCisgIFsgZGlyMS9maWxlMSAtZWYgZGlyMS9saW5rMSBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBmaWxlKiBsaW5rKiBkaXIqCisKK21rZGlyIC1wIGRpcjEvZGlyMiBkaXIzCit0b3VjaCBkaXIxL2RpcjIvZmlsZTEgZGlyMS9kaXIyL2ZpbGUyCit0ZXN0aW5nICJkaXIgdG8gbmV3IGRpciIgXAorICAibXYgZGlyMS9kaXIyIGRpcjMvbmV3ICYmCisgIFsgISAtZSBkaXIxL2RpcjIgLWEgLWQgZGlyMy9uZXcgLWEgLWYgZGlyMy9uZXcvZmlsZTEgXSAmJgorICBbIC1mIGRpcjMvbmV3L2ZpbGUyIF0gJiYgZWNobyB5ZXMiIFwKKyAgInllc1xuIiAiIiAiIgorcm0gLXJmIGZpbGUqIGRpcioKKworbWtkaXIgZGlyMSBkaXIyCit0ZXN0aW5nICJkaXIgdG8gZXhpc3RpbmcgZGlyIiBcCisgICJtdiBkaXIxIGRpcjIgJiYgWyAhIC1lIGRpcjEgLWEgLWQgZGlyMi9kaXIxIF0gJiYgZWNobyB5ZXMiIFwKKyAgInllc1xuIiAiIiAiIgorcm0gLXJmIGRpcioKKwordG91Y2ggZmlsZTEgZmlsZTIKK2NobW9kIDQwMCBmaWxlMSBmaWxlMgordGVzdGluZyAiZm9yY2Ugb3ZlciB1bndyaXRhYmxlIiBcCisgICJtdiAtZiBmaWxlMSBmaWxlMiAmJiBbICEgLWUgZmlsZTEgLWEgLWUgZmlsZTIgXSAmJiBlY2hvIHllcyIgXAorICAieWVzXG4iICIiICIiCitybSAtZiBmaWxlKgorCit0b3VjaCBmaWxlMSBmaWxlMgordGVzdGluZyAibm8gY2xvYmJlciAoZGVzdCBleGlzdHMpIiBcCisgICJtdiAtbiBmaWxlMSBmaWxlMiAmJiBbIC1lIGZpbGUxIC1hIC1lIGZpbGUyIF0gJiYgZWNobyB5ZXMiXAorICAieWVzXG4iICIiICIiCitybSAtZiBmaWxlKgorCit0b3VjaCBmaWxlMQordGVzdGluZyAibm8gY2xvYmJlciAoZGVzdCBkb2Vzbid0IGV4aXN0KSIgXAorICAibXYgLW4gZmlsZTEgbmV3LWRlc3QgJiYgWyAhIC1lIGZpbGUxIC1hIC1lIG5ldy1kZXN0IF0gJiYgZWNobyB5ZXMiXAorICAieWVzXG4iICIiICIiCitybSAtZiBmaWxlKgorCisjIElmIHRoZXJlIGlzIHN0ZGluLCBpdCBwcm9tcHRzLiAgSWYgbm8gc3RkaW4sIGl0IG1vdmVzIGFueXdheSBhbmQgZmlsZTIgd29uJ3QKKyMgZXhpc3QuCit0b3VjaCBmaWxlMSBmaWxlMgorY2htb2QgNDAwIGZpbGUxIGZpbGUyCit0ZXN0aW5nICJtdiBvdmVyIHVud3JpdGFibGUgZmlsZTogbm8gc3RkaW4iIFwKKyAgIm12IGZpbGUyIGZpbGUxICYmIFsgLWUgZmlsZTEgLWEgISAtZSBmaWxlMiBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUxIGZpbGUyCitjaG1vZCA0MDAgZmlsZTEgZmlsZTIKK3Rlc3RpbmcgIm12IG92ZXIgdW53cml0YWJsZSBmaWxlOiBhbnN3ZXJlZCBZRVMiIFwKKyAgIm12IGZpbGUyIGZpbGUxICYmIFsgLWUgZmlsZTEgLWEgISAtZSBmaWxlMiBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgInlcbiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUxIGZpbGUyCitjaG1vZCA0MDAgZmlsZTEgZmlsZTIKK3Rlc3RpbmcgIm12IG92ZXIgdW53cml0YWJsZSBmaWxlOiBhbnN3ZXJlZCBOTyIgXAorICAibXYgZmlsZTIgZmlsZTEgJiYgWyAtZSBmaWxlMSAtYSAtZSBmaWxlMiBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgIm5cbiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUxIGZpbGUyCit0ZXN0aW5nICJpbnRlcmFjdGl2ZTogbm8gc3RkaW4iIFwKKyAgIm12IC1pIGZpbGUyIGZpbGUxICYmIFsgLWUgZmlsZTEgLWEgISAtZSBmaWxlMiBdICYmIGVjaG8geWVzIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1mIGZpbGUqCisKK3RvdWNoIGZpbGUxIGZpbGUyCit0ZXN0aW5nICJpbnRlcmFjdGl2ZTogYW5zd2VyZWQgWUVTIiBcCisgICJtdiAtaSBmaWxlMiBmaWxlMSAmJiBbIC1lIGZpbGUxIC1hICEgLWUgZmlsZTIgXSAmJiBlY2hvIHllcyIgXAorICAieWVzXG4iICIiICJ5XG4iCitybSAtZiBmaWxlKgorCit0b3VjaCBmaWxlMSBmaWxlMgordGVzdGluZyAiaW50ZXJhY3RpdmU6IGFuc3dlcmVkIE5PIiBcCisgICJtdiAtaSBmaWxlMiBmaWxlMSAmJiBbIC1lIGZpbGUxIC1hIC1lIGZpbGUyIF0gJiYgZWNobyB5ZXMiIFwKKyAgInllc1xuIiAiIiAiblxuIgorcm0gLWYgZmlsZSoKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9ubC50ZXN0IGIvdG95Ym94L3Rlc3RzL25sLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk5NzM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9ubC50ZXN0CkBAIC0wLDAgKzEsNTAgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAibmwiICJubCIgIiAgICAgMVx0b25lXG4gICAgIDJcdHR3b1xuICAgICAzXHR0aHJlZVxuIiBcCisgICIiICJvbmVcbnR3b1xudGhyZWVcbiIKKwordGVzdGluZyAiZXhwbGljaXQgZGVmYXVsdHMiICJubCAtbnJuIC1iIGEiIFwKKyAgIiAgICAgMVx0b25lXG4gICAgIDJcdHR3b1xuICAgICAzXHR0aHJlZVxuIiAiIiAib25lXG50d29cbnRocmVlXG4iCisKKyMgLW4gbG4gcm4gcnoKKwordGVzdGluZyAiLW5sbiIgIm5sIC1ubG4iICIxICAgICBcdG9uZVxuMiAgICAgXHR0d29cbjMgICAgIFx0dGhyZWVcbiIgXAorICAiIiAib25lXG50d29cbnRocmVlXG4iCit0ZXN0aW5nICItbmxuIC13IiAibmwgLW5sbiAtdyA4IiBcCisgICIxICAgICAgIFx0b25lXG4yICAgICAgIFx0dHdvXG4zICAgICAgIFx0dGhyZWVcbiIgIiIgIm9uZVxudHdvXG50aHJlZVxuIgorCit0ZXN0aW5nICItbnJ6IiAibmwgLW5yeiIgIjAwMDAwMVx0b25lXG4wMDAwMDJcdHR3b1xuMDAwMDAzXHR0aHJlZVxuIiBcCisgICIiICJvbmVcbnR3b1xudGhyZWVcbiIKKwordGVzdGluZyAiLW5yeiAtdyIgIm5sIC13MyAtbnJ6IiAiMDAxXHRvbmVcbjAwMlx0dHdvXG4wMDNcdHRocmVlXG4iIFwKKyAgIiIgIm9uZVxudHdvXG50aHJlZVxuIgorCisKKyMgRm9yIG5vbi1tYXRjaGluZyBsaW5lcyB0aGUgc2VwYXJhdG9yIGlzICJzdXBwcmVzc2VkIiBtZWFuaW5nIGl0Li4uCisjIHR1cm5zIGludG8gc3BhY2VzISBBbmQgdGhlIHRhYiB0dXJucyBpbnRvIG9uZSBzcGFjZSwgYW5kIC1kIGJvb20gdHVybnMKKyMgaW50byA0IHNwYWNlcywgYnV0IHRoZXNlOgorIyAgIG5sIC1zIiQoZWNobyAtZSAnYm9cdG9tJykiIC1icGFuZCBSRUFETUUKKyMgICBubCAtdyAzIC1icHRoZSBSRUFETUUKKyMgWWVhaC4gQW5kIEkgZG91YnQgdXRmOCBmb250bWV0cmljcyBhcmUgdXNlZCBlaXRoZXIuCisKK3Rlc3RpbmcgIi1iIHQiICJubCAtYiB0IiAiICAgICAgIFxuICAgICAxXHRvbmVcbiAgICAgICBcbiAgICAgMlx0dHdvXG4iIFwKKyAgIiIgIlxub25lXG5cbnR3b1xuIgordGVzdGluZyAiLWIgbiIgIm5sIC1iIG4iICIgICAgICAgb25lXG4gICAgICAgdHdvXG4gICAgICAgdGhyZWVcbiIgXAorICAiIiAib25lXG50d29cbnRocmVlXG4iCit0ZXN0aW5nICItc29vayAtYiBwIiAibmwgLXNvb2sgLWJwb2luZyIgXAorICAiICAgICAgICAgb25lXG4gICAgIDFvb2tib2luZ1xuICAgICAyb29rc3Byb2luZ3lcbiIgXAorICAiIiAib25lXG5ib2luZ1xuc3Byb2luZ3lcbiIKKwordGVzdGluZyAiLXYiICJubCAtdiA0MiIgIiAgICA0Mlx0b25lXG4gICAgNDNcdHR3b1xuICAgIDQ0XHR0aHJlZVxuIiBcCisgICIiICJvbmVcbnR3b1xudGhyZWVcbiIKK3Rlc3RpbmcgIi1sIiAibmwgLWJhIC1sMiAtdzIgLSBpbnB1dCIgXAorICAiIDFcdG9uZVxuICAgXG4gMlx0XG4gM1x0dHdvXG4gICBcbiA0XHRcbiAgIFxuIDVcdHRocmVlXG4gNlx0Zm91clxuICAgXG4gN1x0XG4gICBcbiA4XHRiYW5nXG4gICBcbiIgXAorICAiXG5cbmJhbmdcblxuIiAib25lXG5cblxudHdvXG5cblxuXG50aHJlZVxuZm91clxuXG4iCit0ZXN0aW5nICJubyBzcGFjZSIgIm5sIC13IDEgLXYgNDIiICI0Mlx0bGluZVxuIiAiIiAibGluZVxuIgorCisjIFNob3VsZCB0ZXN0IGZvciAtRSBidXQgbm8gb3RoZXIgaW1wbGVtZW50YXRpb24gc2VlbXMgdG8gaGF2ZSBpdD8KKyN0ZXN0aW5nICItRSIgIm5sIC13MiAtc3ggLUVicCcob25lfHR3byknIiAiIDF4IiAib25lXG5hbmRcbnR3b1xuIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3BncmVwLnRlc3QgYi90b3lib3gvdGVzdHMvcGdyZXAudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzE5Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3BncmVwLnRlc3QKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKworI2NsZWFuaW5nICd5ZXMnIHByb2Nlc3Nlcwora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBTdGFydGluZyBwcm9jZXNzZXMgdG8gdGVzdCBwZ3JlcCBjb21tYW5kCit5ZXMgPi9kZXYvbnVsbCAmCitwcm9jPSQhCisjZWNobyAiIyBQcm9jZXNzIGNyZWF0ZWQgd2l0aCBpZDogJHByb2MiCitzbGVlcCAuMQorc2Vzc2lvbl9pZD0wCitwcm9jX3BhcmVudD1gY2F0IC9wcm9jLyR7cHJvY30vc3RhdCB8IGF3ayAneyBwcmludCAkNCB9J2AKKyNlY2hvICIjIFBhcmVudCBQcm9jZXNzIGlkIG9mICRwcm9jIGlzICRwcm9jX3BhcmVudCIKKworIyBUZXN0Y2FzZXMgZm9yIHBncmVwIGNvbW1hbmQKK3Rlc3RpbmcgInBhdHRlcm4iICJwZ3JlcCB5ZXMiICIkcHJvY1xuIiAiIiAiIgordGVzdGluZyAid2lsZENhcmRQYXR0ZXJuIiAicGdyZXAgXnkuKnMkIiAiJHByb2NcbiIgIiIgIiIKK3Rlc3RpbmcgIi1sIHBhdHRlcm4iICJwZ3JlcCAtbCB5ZXMiICIkcHJvYyB5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1mIHBhdHRlcm4iICJwZ3JlcCAtZiB5ZXMiICIkcHJvY1xuIiAiIiAiIgordGVzdGluZyAiLW4gcGF0dGVybiIgInBncmVwIC1uIHllcyIgIiRwcm9jXG4iICIiICIiCit0ZXN0aW5nICItbyBwYXR0ZXJuIiAicGdyZXAgLW8geWVzIiAiJHByb2NcbiIgIiIgIiIKK3Rlc3RpbmcgIi1zIiAicGdyZXAgLXMgJHNlc3Npb25faWQgeWVzIiAiJHByb2NcbiIgIiIgIiIKK3Rlc3RpbmcgIi1QIiAicGdyZXAgLVAgJHByb2NfcGFyZW50IHllcyIgIiRwcm9jXG4iICIiICIiCisKK3Rlc3RpbmcgInJldHVybiBzdWNjZXNzIiAicGdyZXAgeWVzICYmIGVjaG8gc3VjY2VzcyIgIiRwcm9jXG5zdWNjZXNzXG4iICIiICIiCit0ZXN0aW5nICJyZXR1cm4gZmFpbHVyZSIgInBncmVwIGFsbW9zdC1jZXJ0YWlubHktbm90IHx8IGVjaG8gZmFpbHVyZSIgXAorICAgICJmYWlsdXJlXG4iICIiICIiCisKKyNDbGVhbi11cAora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvcGtpbGwudGVzdCBiL3RveWJveC90ZXN0cy9wa2lsbC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMjBkMjYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvcGtpbGwudGVzdApAQCAtMCwwICsxLDEwNyBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKworI2NsZWFuaW5nICd5ZXMnIHByb2Nlc3Nlcwora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBUZXN0Y2FzZXMgZm9yIHBraWxsIGNvbW1hbmQKKworeWVzID4vZGV2L251bGwgJgorc2xlZXAgMQordGVzdGluZyAicGF0dGVybiIgInBraWxsIHllcyAmJiBzbGVlcCAxICYmIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiIFwKKyAgInllc1xuIiAiIiAiIgora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK3llcyA+L2Rldi9udWxsICYKK3llcyBwcmludDEgPi9kZXYvbnVsbCAmCit5ZXMgcHJpbnQyID4vZGV2L251bGwgJgorc2xlZXAgMQordGVzdGluZyAicGF0dGVybiAobXVsdGlwbGUpIiAicGtpbGwgeWVzICYmIHNsZWVwIDEgJiYKKyAgIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiICJ5ZXNcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgPi9kZXYvbnVsbCAmCitzbGVlcCAxCit0ZXN0aW5nICItZiBwYXR0ZXJuIChvbmUpIiAicGtpbGwgLWYgeWVzICYmIHNsZWVwIDEgJiYKKyAgIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiICJ5ZXNcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgcHJpbnQxID4vZGV2L251bGwgJgorc2xlZXAgMQordGVzdGluZyAiLWYgcGF0dGVybiBhcmdzIiAicGtpbGwgLWYgXCJ5ZXMgcHJpbnQxXCIgJiYgc2xlZXAgMSAmJgorICAgKHBncmVwIHllcyB8fCBlY2hvICd5ZXMnKSIgInllc1xuIiAiIiAiIgora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK3llcyA+L2Rldi9udWxsICYKK3llcyBwcmludDEgPi9kZXYvbnVsbCAmCit5ZXMgcHJpbnQyID4vZGV2L251bGwgJgorc2xlZXAgMQordGVzdGluZyAiLWYgcGF0dGVybiAobXVsdGlwbGUpIiAicGtpbGwgLWYgeWVzICYmIHNsZWVwIDEgJiYKKyAgIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiICJ5ZXNcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgPi9kZXYvbnVsbCAmCitzbGVlcCAxCit0ZXN0aW5nICItcyAwIC1mIHBhdHRlcm4gKHJlZ2V4cCkiICJwa2lsbCAtcyAwIC1mIHllKiAmJiBzbGVlcCAxICYmCisgICAocGdyZXAgeWVzIHx8IGVjaG8gJ3llcycpIiAieWVzXG4iICIiICIiCitraWxsYWxsIHllcyA+L2Rldi9udWxsIDI+JjEKKworeWVzID4vZGV2L251bGwgJgorcHJvYzE9JCEKK3llcyA+L2Rldi9udWxsICYKK3Byb2MyPSQhCitzbGVlcCAxCit0ZXN0aW5nICItbiBwYXR0ZXJuIiAicGtpbGwgLW4geWVzICYmIHNsZWVwIDEgJiYgcGdyZXAgeWVzIiBcCisgICIkcHJvYzFcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgPi9kZXYvbnVsbCAmCitwcm9jMT0kIQorc2xlZXAgMQoreWVzID4vZGV2L251bGwgJgorcHJvYzI9JCEKK3NsZWVwIDEKK3Rlc3RpbmcgIi1vIHBhdHRlcm4iICJwa2lsbCAtbyB5ZXMgJiYgc2xlZXAgMSAmJiBwZ3JlcCB5ZXMiIFwKKyAgIiRwcm9jMlxuIiAiIiAiIgora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK3llcyA+L2Rldi9udWxsICYKK3NsZWVwIDEKK3Rlc3RpbmcgIi1zIChibGFuaykgcGF0dGVybiIgInBraWxsIC1zICcnIHllcyAmJiBzbGVlcCAxICYmCisgICAocGdyZXAgeWVzIHx8IGVjaG8gJ3llcycpIiAieWVzXG4iICIiICIiCitraWxsYWxsIHllcyA+L2Rldi9udWxsIDI+JjEKKworeWVzID4vZGV2L251bGwgJgorc2xlZXAgMQordGVzdGluZyAiLXMgMCBwYXR0ZXJuIiAicGtpbGwgLXMgMCB5ZXMgJiYgc2xlZXAgMSAmJgorICAgKHBncmVwIHllcyB8fCBlY2hvICd5ZXMnKSIgInllc1xuIiAiIiAiIgora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCisKK3llcyA+L2Rldi9udWxsICYKK3Byb2M9JCEKK3Byb2NfcD1gY2F0IC9wcm9jLyR7cHJvY30vc3RhdCB8IGF3ayAneyBwcmludCAkNCB9J2AKK3NsZWVwIDEKK3Rlc3RpbmcgIi1QIHBhcmVudF9wcm9kSWQgcGF0dGVybiIgInBraWxsIC1QICRwcm9jX3AgeWVzICYmIHNsZWVwIDEgJiYKKyAgIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiICJ5ZXNcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgPi9kZXYvbnVsbCAmCitzbGVlcCAxCit0ZXN0aW5nICItOSBwYXR0ZXJuIiAicGtpbGwgLTkgeWVzICYmIHNsZWVwIDEgJiYKKyAgIChwZ3JlcCB5ZXMgfHwgZWNobyAneWVzJykiICJ5ZXNcbiIgIiIgIiIKK2tpbGxhbGwgeWVzID4vZGV2L251bGwgMj4mMQorCit5ZXMgPi9kZXYvbnVsbCAmCitzbGVlcCAxCit0ZXN0aW5nICJyZXR1cm4gc3VjY2VzcyIgInBraWxsIHllcyAmJiBlY2hvIHN1Y2Nlc3MiICJzdWNjZXNzXG4iICIiICIiCitraWxsYWxsIHllcyA+L2Rldi9udWxsIDI+JjEKKwordGVzdGluZyAicmV0dXJuIGZhaWx1cmUiICJwa2lsbCBhbG1vc3QtY2VydGFpbmx5LW5vdCB8fCBlY2hvIGZhaWx1cmUiIFwKKyAgICAiZmFpbHVyZVxuIiAiIiAiIgorCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvcHJpbnRmLnRlc3QgYi90b3lib3gvdGVzdHMvcHJpbnRmLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTMzMzE3NAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9wcmludGYudGVzdApAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDEzIFJvYmluIE1pdHRhbCA8cm9iaW5taXR0YWwuaXRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgMjAxMyBEaXZ5YSBLb3RoYXJpIDxkaXZ5YS5zLmtvdGhhcmlAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgRGlzYWJsZSBzaGVsbCBidWlsdGluCitQUklOVEY9IiQod2hpY2ggcHJpbnRmKSIKKwordGVzdGluZyAidGV4dCIgIiRQUklOVEYgVEVYVCIgIlRFWFQiICIiICIiCit0ZXN0aW5nICJlc2NhcGVzIiAiJFBSSU5URiAnb25lXG50d29cblx2XHRcclxmXGVcYlxhdGhyZWUnIiBcCisgICJvbmVcbnR3b1xuXHZcdFxyXGZcZVxiXGF0aHJlZSIgIiIgIiIKK3Rlc3RpbmcgIiViIGVzY2FwZXMiICIkUFJJTlRGICViICdvbmVcbnR3b1xuXHZcdFxyXGZcZVxiXGF0aHJlZSciIFwKKyAgIm9uZVxudHdvXG5cdlx0XHJcZlxlXGJcYXRocmVlIiAiIiAiIgordGVzdGluZyAibnVsbCIgIiRQUklOVEYgJ3hcMHknIHwgb2QgLUFuIC10eDEiICcgNzggMDAgNzlcbicgIiIgIiIKK3Rlc3RpbmcgInRyYWlsaW5nIHNsYXNoIiAiJFBSSU5URiAnYWJjXCciICdhYmNcJyAiIiAiIgordGVzdGluZyAib2N0YWwiICIkUFJJTlRGICcgXDFcMDAyXDQyOVwwNDV4JyIgJyBcMDAxXDAwMiI5JXgnICIiICIiCit0ZXN0aW5nICJub3Qgb2N0YWwiICIkUFJJTlRGICdcOSciICdcOScgIiIgIiIKK3Rlc3RpbmcgImhleCIgIiRQUklOVEYgJ0FceDFiXHgyQlx4M1FceGEnIHwgb2QgLUFuIC10eDEiIFwKKyAgJyA0MSAxYiAyYiAwMyA1MSAwYVxuJyAiIiAiIgordGVzdGluZyAiJXgiICIkUFJJTlRGICcleFxuJyAweDJhIiAiMmFcbiIgIiIgIiIKKwordGVzdGluZyAiJWQgNDIiICIkUFJJTlRGICVkIDQyIiAiNDIiICIiICIiCit0ZXN0aW5nICIlZCAweDJhIiAiJFBSSU5URiAlZCAweDJhIiAiNDIiICIiICIiCit0ZXN0aW5nICIlZCAwNTIiICIkUFJJTlRGICVkIDA1MiIgIjQyIiAiIiAiIgorCit0ZXN0aW5nICIlcyB3aWR0aCBwcmVjaXNpb24iIFwKKyAgIiRQUklOVEYgJyUzcywlLjNzLCUxMHMsJTEwLjNzJyBhYmNkZSBmZ2hpaiBrbG1ubyBwcXJzdCIgXAorICAiYWJjZGUsZmdoLCAgICAga2xtbm8sICAgICAgIHBxciIgIiIgIiIKKworIyBwb3NpeDogIlRoZSBmb3JtYXQgb3BlcmFuZCBzaGFsbCBiZSByZXVzZWQgYXMgb2Z0ZW4gYXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkKKyMgdGhlIGFyZ3VtZW50IG9wZXJhbmRzLiIKKwordGVzdGluZyAiZXh0cmEgYXJncyIgIiRQUklOVEYgJ2FiYyVzISVkZGVmXG4nIFggNDIgQVJHIDM2IiBcCisJImFiY1ghNDJkZWZcbmFiY0FSRyEzNmRlZlxuIiAiIiAiIgorCit0ZXN0aW5nICInJTNjJyIgIiRQUklOVEYgJyUzYycgeCIgIiAgeCIgIiIgIiIKK3Rlc3RpbmcgIiclLTNjJyIgIiRQUklOVEYgJyUtM2MnIHgiICJ4ICAiICIiICIiCit0ZXN0aW5nICInJStkJyIgIiRQUklOVEYgJyUrZCcgNSIgIis1IiAiIiAiIgorCisKK3Rlc3RpbmcgIiclNWQlNGQnIDEgMjEgMzIxIDQzMjEgNTQzMjEiIFwKKyAgIiRQUklOVEYgJyU1ZCU0ZCcgMSAyMSAzMjEgNDMyMSA1NDMyMSIgIiAgICAxICAyMSAgMzIxNDMyMTU0MzIxICAgMCIgIiIgIiIKK3Rlc3RpbmcgIiclYyAlYycgNzggNzkiICIkUFJJTlRGICclYyAlYycgNzggNzkiICI3IDciICIiICIiCit0ZXN0aW5nICInJWQgJWQnIDc4IDc5IiAiJFBSSU5URiAnJWQgJWQnIDc4IDc5IiAiNzggNzkiICIiICIiCit0ZXN0aW5nICInJWYgJWYnIDc4IDc5IiAiJFBSSU5URiAnJWYgJWYnIDc4IDc5IiBcCisgICI3OC4wMDAwMDAgNzkuMDAwMDAwIiAiIiAiIgordGVzdGluZyAiJ2YgZicgNzggNzkiICIkUFJJTlRGICdmIGYnIDc4IDc5IiAiZiBmIiAiIiAiIgordGVzdGluZyAiJyVpICVpJyA3OCA3OSIgIiRQUklOVEYgJyVpICVpJyA3OCA3OSIgIjc4IDc5IiAiIiAiIgordGVzdGluZyAiJyVvICVvJyA3OCA3OSIgIiRQUklOVEYgJyVvICVvJyA3OCA3OSIgIjExNiAxMTciICIiICIiCit0ZXN0aW5nICInJXUgJXUnIDc4IDc5IiAiJFBSSU5URiAnJXUgJXUnIDc4IDc5IiAiNzggNzkiICIiICIiCit0ZXN0aW5nICInJXUgJXUnIC0xIC0yIiAiJFBSSU5URiAnJXUgJXUnIC0xIC0yIiBcCisgICIxODQ0Njc0NDA3MzcwOTU1MTYxNSAxODQ0Njc0NDA3MzcwOTU1MTYxNCIgIiIgIiIKK3Rlc3RpbmcgIicleCAlWCcgNzggNzkiICIkUFJJTlRGICcleCAlWCcgNzggNzkiICI0ZSA0RiIgIiIgIiIKK3Rlc3RpbmcgIiclZyAlRycgNzggNzkiICIkUFJJTlRGICclZyAlRycgNzggNzkiICI3OCA3OSIgIiIgIiIKK3Rlc3RpbmcgIiclcyAlcycgNzggNzkiICIkUFJJTlRGICclcyAlcycgNzggNzkiICI3OCA3OSIgIiIgIiIKKwordGVzdGluZyAiJS5zIGFjdHMgbGlrZSAlLjBzIiAiJFBSSU5URiAlLnNfIDEgMiAzIDQgNSIgIl9fX19fIiAiIiAiIgordGVzdGluZyAiY29ybmVyIGNhc2UiICIkUFJJTlRGICdcXDgnIiAnXDgnICcnICcnCisKKyMgVGhlIHBvc2l4IHNwZWMgZXhwbGljaXRseSBzcGVjaWZpZXMgaW5jb25zaXN0ZW50IGJlaGF2aW9yLAorIyBzbyB0cmVhdGluZyB0aGUgXDAwNjYgaW4gJWIgbGlrZSB0aGUgXDAwNjYgbm90IGluICViIGlzIHdyb25nIGJlY2F1c2UgcG9zaXguCit0ZXN0aW5nICJwcmludGYgcG9zaXggaW5jb25zaXN0ZW5jeSIgIiRQUklOVEYgJ1xcMDA2Ni0lYicgJ1xcMDA2NiciICJceDA2Ni02IiBcCisgICIiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvcHdkLnRlc3QgYi90b3lib3gvdGVzdHMvcHdkLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhkMjJlMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9wd2QudGVzdApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyNUT0RPOiBGaW5kIGJldHRlciB0ZXN0cworCit0ZXN0aW5nICJwd2QiICJbICQoc3RhdCAtYyAlaSAiJChwd2QpIikgPSAkKHN0YXQgLWMgJWkgLikgXSAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1QIiAiWyAkKHN0YXQgLWMgJWkgIiQocHdkIC1QKSIpID0gJChzdGF0IC1jICVpIC4pIF0gJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCisKKworbG4gLXMgLiBzeW0KK2NkIHN5bQordGVzdGluZyAicHdkIiAiWyAkKHN0YXQgLWMgJWkgIiQocHdkKSIpID0gJChzdGF0IC1jICVpICIkUFdEIikgXSAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1QIiAiWyAkKHN0YXQgLWMgJWkgIiQocHdkIC1QKSIpID0gJChzdGF0IC1jICVpICIkUFdEIikgXSB8fCBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK2NkIC4uCitybSBzeW0KKworZXhwb3J0IFBXRD13YWxydXMKK3Rlc3RpbmcgIihiYWQgUFdEKSIgIlsgIiQocHdkKSIgPSAiJChjZCAuIDsgcHdkKSIgXSAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9yZWFkbGluay50ZXN0IGIvdG95Ym94L3Rlc3RzL3JlYWRsaW5rLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmIyNTk4NQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9yZWFkbGluay50ZXN0CkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworQVBXRD0iJChwd2QgLVApIgorCit0ZXN0aW5nICJtaXNzaW5nIiAicmVhZGxpbmsgbm90Zm91bmQgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKKworIyBzaW1wbGUgdGVzdHMgb24gYSBmaWxlCisKK3RvdWNoIGZpbGUKK3Rlc3RpbmcgImZpbGUiICJyZWFkbGluayBmaWxlIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICItZiBkaXIiICJyZWFkbGluayAtZiAuIiAiJEFQV0RcbiIgIiIgIiIKK3Rlc3RpbmcgIi1mIG1pc3NpbmciICJyZWFkbGluayAtZiBub3Rmb3VuZCIgIiRBUFdEL25vdGZvdW5kXG4iICIiICIiCisKK2xuIC1zZiBub3Rmb3VuZCBsaW5rCit0ZXN0aW5nICJsaW5rIiAicmVhZGxpbmsgbGluayIgIm5vdGZvdW5kXG4iICIiICIiCit0ZXN0aW5nICJsaW5rLT5taXNzaW5nIiAicmVhZGxpbmsgLWYgbGluayIgIiRBUFdEL25vdGZvdW5kXG4iICIiICIiCitsbiAtc2YgLi4vLi4vIGxpbmsKK3Rlc3RpbmcgInN0YXlzIHJlbGF0aXZlIiAicmVhZGxpbmsgbGluayIgIi4uLy4uL1xuIiAiIiAiIgorcm0gbGluaworbG4gLXNmIGZpbGUgbGluawordGVzdGluZyAiLWYgbGluay0+ZmlsZSIgInJlYWRsaW5rIC1mIGxpbmsiICIkQVBXRC9maWxlXG4iICIiICIiCitsbiAtc2YgLiBsaW5rCit0ZXN0aW5nICItZiBsaW5rLT5kaXIiICJyZWFkbGluayAtZiBsaW5rIiAiJEFQV0RcbiIgIiIgIiIKK2xuIC1zbmYgbGluayBsaW5rCit0ZXN0aW5nICJsaW5rLT5saW5rIChyZWN1cnNpdmUpIiAicmVhZGxpbmsgbGluayIgImxpbmtcbiIgIiIgIiIKK3Rlc3RpbmcgIi1mIGxpbmstPmxpbmsgKHJlY3Vyc2l2ZSkiIFwKKyAgInJlYWRsaW5rIC1mIGxpbmsgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKKwordGVzdGluZyAiLXEgbm90bGluayIgInJlYWRsaW5rIC1xIGZpbGUgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1xIGxpbmsiICJyZWFkbGluayAtcSBsaW5rICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICItcSBub3Rmb3VuZCIgInJlYWRsaW5rIC1xIG5vdGZvdW5kIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICItZSBmb3VuZCIgInJlYWRsaW5rIC1lIGZpbGUiICIkQVBXRC9maWxlXG4iICIiICIiCit0ZXN0aW5nICItZSBub3Rmb3VuZCIgXAorICAicmVhZGxpbmsgLWUgbm90Zm91bmQgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIi1uZiAuIiAicmVhZGxpbmsgLW5mIC4iICIkQVBXRCIgIiIgIiIKKworbWtkaXIgc3ViICYmCitsbiAtcyAuIGhlcmUgJiYKK2xuIC1zIC4vc3ViIGRpciAmJgordG91Y2ggc3ViL2JhbmcgfHwgZXhpdCAxCit0ZXN0aW5nICItZiBtdWx0aSIgInJlYWRsaW5rIC1mIGRpci8uLi9oZXJlL2Rpci9iYW5nIiBcCisgICIkQVBXRC9zdWIvYmFuZ1xuIiAiIiAiIgordGVzdGluZyAiLWYgbGluay9taXNzaW5nIiAicmVhZGxpbmsgLWYgZGlyL2JvaW5nIiBcCisgICIkQVBXRC9zdWIvYm9pbmdcbiIgIiIgIiIKK3Rlc3RpbmcgIi1mIC9kZXYvbnVsbC9maWxlIiBcCisgICJyZWFkbGluayAtZiAvZGV2L251bGwvZmlsZSAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorbG4gLXNmIC8gbGluayB8fCBleGl0IDEKK3Rlc3RpbmcgIi1mIGxpbmstPi8iICJyZWFkbGluayAtZSBsaW5rL2RldiIgIi9kZXZcbiIgIiIgIiIKK3Rlc3RpbmcgIi1mIC9kZXYvbnVsbC8uLiIgXAorICAicmVhZGxpbmsgLWYgbGluay9udWxsLy4uIDI+L2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCitybSAtZiBsaW5rICYmIGxuIC1zZiBsaW5rIGxpbmsgfHwgZXhpdCAxCit0ZXN0aW5nICJyZWN1cnNlIiAicmVhZGxpbmsgbGluayIgImxpbmtcbiIgIiIgIiIKKworcm0gZmlsZSBsaW5rIHN1Yi9iYW5nIGRpciBoZXJlCitybWRpciBzdWIKKworIyBNYWtlIHN1cmUgY2lyY3VsYXIgbGlua3MgZG9uJ3QgcnVuIGF3YXkuCisKK2xuIC1zIGxpbmsxIGxpbmsyCitsbiAtcyBsaW5rMiBsaW5rMQordGVzdGluZyAiZm9sbG93IHJlY3Vyc2l2ZTIiICJyZWFkbGluayAtZiBsaW5rMSB8fCBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK3JtIGxpbmsxIGxpbmsyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvcmVuaWNlLnRlc3QgYi90b3lib3gvdGVzdHMvcmVuaWNlLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM1MGMyNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9yZW5pY2UudGVzdApAQCAtMCwwICsxLDExMCBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMTMgRGl2eWEgS290aGFyaSA8ZGl2eWEucy5rb3RoYXJpQGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitmdW5fbmljZV92YWwoKSAKK3sKKyAgZm9yIGVhY2hfcHJvYyBpbiAkQAorICBkbworICAgIGVjaG8gYGF3ayAneyBwcmludCAkMTggfScgL3Byb2MvJHtlYWNoX3Byb2N9L3N0YXRgCisgIGRvbmUKK30KKworIyBjcmVhdGluZyBwcm9jZXNzZXMgYXMgYSB0ZXN0IGRhdGEKK3llcyA+L2Rldi9udWxsICYKK3Byb2MxPSQhCit5ZXMgPi9kZXYvbnVsbCAmCitwcm9jMj0kIQoreWVzID4vZGV2L251bGwgJgorcHJvYzM9JCEKK3llcyA+L2Rldi9udWxsICYKK3Byb2M0PSQhCit5ZXMgPi9kZXYvbnVsbCAmCitwcm9jNT0kIQorCituX3ZhbDE9YGZ1bl9uaWNlX3ZhbCAkcHJvYzFgCituX3ZhbDI9YGZ1bl9uaWNlX3ZhbCAkcHJvYzJgCituX3ZhbDM9YGZ1bl9uaWNlX3ZhbCAkcHJvYzNgCituX3ZhbDQ9YGZ1bl9uaWNlX3ZhbCAkcHJvYzRgCituX3ZhbDU9YGZ1bl9uaWNlX3ZhbCAkcHJvYzVgCisKKyMgUmVkaXJlY3RpbmcgZXJyb3JzIHRvIC9kZXYvbnVsbAorYXJnPSIyPi9kZXYvbnVsbCIKKworZm9yIG5fdiBpbiAiLTEiICIxIgorZG8KKyAgZm9yIG5fbyBpbiAiIiAiIC1wIgorICBkbworICAgIG5pY2VfdmFsMT0kKChgZnVuX25pY2VfdmFsICRwcm9jMWAgKyAkbl92KSkKKyAgICBuaWNlX3ZhbDI9JCgoYGZ1bl9uaWNlX3ZhbCAkcHJvYzJgICsgJG5fdikpCisgICAgbmljZV92YWwzPSQoKGBmdW5fbmljZV92YWwgJHByb2MzYCArICRuX3YpKQorICAgIG5pY2VfdmFsND0kKChgZnVuX25pY2VfdmFsICRwcm9jNGAgKyAkbl92KSkKKyAgICBuaWNlX3ZhbDU9JCgoYGZ1bl9uaWNlX3ZhbCAkcHJvYzVgICsgJG5fdikpCisgICAgdGVzdGluZyAid2l0aCAtbj0kbl92IGFuZCB3aXRoJG5fbyBtdWx0aXBsZV9waWRzIiBcCisgICAgICAicmVuaWNlIC1uICRuX3Ykbl9vICRwcm9jMSAkcHJvYzIgJHByb2MzICRwcm9jNCAkcHJvYzUgJiYKKyAgICAgICBmdW5fbmljZV92YWwgJHByb2MxICRwcm9jMiAkcHJvYzMgJHByb2M0ICRwcm9jNSIgXAorICAgICAgIiRuaWNlX3ZhbDFcbiRuaWNlX3ZhbDJcbiRuaWNlX3ZhbDNcbiRuaWNlX3ZhbDRcbiRuaWNlX3ZhbDVcbiIgIiIgIiIKKyAgCisgICAgbmljZV92YWwxPSQoKGBmdW5fbmljZV92YWwgJHByb2MxYCArICRuX3YpKQorICAgIG5pY2VfdmFsMj0kKChgZnVuX25pY2VfdmFsICRwcm9jMmAgKyAkbl92KSkKKyAgICBuaWNlX3ZhbDM9JCgoYGZ1bl9uaWNlX3ZhbCAkcHJvYzNgICsgJG5fdikpCisgICAgbmljZV92YWw0PSQoKGBmdW5fbmljZV92YWwgJHByb2M0YCArICRuX3YpKQorICAgIG5pY2VfdmFsNT0kKChgZnVuX25pY2VfdmFsICRwcm9jNWAgKyAkbl92KSkKKyAgICB0ZXN0aW5nICJ3aXRoIC1uPSRuX3YgYW5kIHdpdGgkbl9vIG11bHRpcGxlX3BpZHMgKHNvbWUgaW52YWxpZCkiIFwKKyAgICAgICJyZW5pY2UgLW4gJG5fdiRuX28gJHByb2MxICRwcm9jMiA4ODg4OCA5OTk5OSAkcHJvYzMgJHByb2M0ICRwcm9jNSAkYXJnIHx8CisgICAgICAgZnVuX25pY2VfdmFsICRwcm9jMSAkcHJvYzIgJHByb2MzICRwcm9jNCAkcHJvYzUiIFwKKyAgICAgICIkbmljZV92YWwxXG4kbmljZV92YWwyXG4kbmljZV92YWwzXG4kbmljZV92YWw0XG4kbmljZV92YWw1XG4iICIiICIiCisgIGRvbmUKK2RvbmUKKworIyBTdGFydGluZyBCb3VuZGFyeSBUZXN0IEhlcmUgLi4gCitsb29wX2NudD0yCitlY2hvIC1uICJURVNUOiBCb3VuZGFyeSB2YWx1ZSB0ZXN0IGZvciBJZCgkcHJvYzEpLi5bb2xkX25pY2VfdmFsL25ld19uaWNlX3ZhbF06IgorY250PTAKK25fdmFsPTEKK3doaWxlIFsgJGNudCAtZ3QgLTEgXQorZG8KKyAgb2xkX25pY2VfdmFsPWBmdW5fbmljZV92YWwgJHByb2MxYAorICBuZXdfbmljZV92YWw9YHJlbmljZSAtbiAkbl92YWwgJHByb2MxID4vZGV2L251bGwgMj4mMSAmJiBmdW5fbmljZV92YWwgJHByb2MxYAorICBlY2hvIC1uICJbJG9sZF9uaWNlX3ZhbC8kbmV3X25pY2VfdmFsXSwiCisgIGlmIFsgJG9sZF9uaWNlX3ZhbCAtZXEgMzkgLWEgJG9sZF9uaWNlX3ZhbCAtZXEgJG5ld19uaWNlX3ZhbCBdCisgIHRoZW4KKyAgICBlY2hvIC1uICIgW0VxdWFscyAzOSxkb2luZyAtMV0gIgorICAgIG5fdmFsPSItMSIKKyAgZWxpZiBbICRvbGRfbmljZV92YWwgLWVxIDAgLWEgJG9sZF9uaWNlX3ZhbCAtZXEgJG5ld19uaWNlX3ZhbCBdCisgIHRoZW4KKyAgICBlY2hvIC1uICIgW0VxdWFscyAwLGRvaW5nICsxXSAiCisgICAgbl92YWw9IjEiCisgIGVsaWYgWyAkbmV3X25pY2VfdmFsIC1ndCAzOSAtbyAkbmV3X25pY2VfdmFsIC1sdCAwIF0KKyAgdGhlbgorICAgIGVjaG8gIiBbVGVzdCBGYWlsXSAiCisgICAgZWNobyAiRkFJTDogcmVuaWNlIHdpdGggc3RlcCAxICgkcHJvYzEpIChib3VuZGFyeSB2YWx1ZSkiCisgICAgY250PSItMSIKKyAgZWxpZiBbICRuZXdfbmljZV92YWwgLWVxICRuX3ZhbDEgLWEgJG5ld19uaWNlX3ZhbCAtZXEgJCgoJG9sZF9uaWNlX3ZhbCsxKSkgXQorICB0aGVuCisgICAgY250PSQoKCRjbnQgKyAxKSkKKyAgICBpZiBbICRjbnQgLWVxICRsb29wX2NudCBdCisgICAgdGhlbgorICAgICAgZWNobyAiIFtUZXN0IFBhc3NdICIKKyAgICAgIGVjaG8gIlBBU1M6IHJlbmljZSB3aXRoIHN0ZXAgMSAoJHByb2MxKSAoYm91bmRhcnkgdmFsdWUpIgorICAgICAgY250PSItMSIKKyAgICBmaQorICBlbHNlCisgICAgZGlmPWBlY2hvICQoKCRuZXdfbmljZV92YWwtJG9sZF9uaWNlX3ZhbCkpYAorICAgIGRpZj1gZWNobyAke2RpZi8tfWAKKyAgICBpZiBbICRkaWYgLW5lIDEgXQorICAgIHRoZW4KKyAgICAgIGVjaG8gIiBbVGVzdCBGYWlsXSAiCisgICAgICBlY2hvICJGQUlMOiByZW5pY2Ugd2l0aCBzdGVwIDEgKCRwcm9jMSkgKGJvdW5kYXJ5IHZhbHVlKSIKKyAgICAgIGNudD0iLTEiCisgICAgZmkKKyAgZmkKK2RvbmUKKyMgQm91bmRhcnkgdGVzdCBFbmQKKwora2lsbGFsbCB5ZXMgPi9kZXYvbnVsbCAyPiYxCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvcmV2LnRlc3QgYi90b3lib3gvdGVzdHMvcmV2LnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRlNzhjMgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9yZXYudGVzdApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2VjaG8gLWUgIm9uZSIgPiBmaWxlMSAKK2VjaG8gLWUgInR3byIgPiBmaWxlMgordGVzdGluZyAicmV2IiAicmV2ICYmIGVjaG8geWVzIiAib3JlelxueWVzXG4iICIiICJ6ZXJvXG4iCit0ZXN0aW5nICItIiAicmV2IC0gJiYgZWNobyB5ZXMiICJvcmV6XG55ZXNcbiIgIiIgInplcm9cbiIKK3Rlc3RpbmcgImZpbGUxIGZpbGUyIiAicmV2IGZpbGUxIGZpbGUyIiAiZW5vXG5vd3RcbiIgIiIgIiIKK3Rlc3RpbmcgIi0gZmlsZSIgICAgICAicmV2IC0gZmlsZTEiICAgICAib3JlelxuZW5vXG4iICIiICJ6ZXJvXG4iCit0ZXN0aW5nICJmaWxlIC0iICAgICAgInJldiBmaWxlMSAtIiAgICAgImVub1xub3JlelxuIiAiIiAiemVyb1xuIgordGVzdGluZyAibm8gdHJhaWxpbmcgbmV3bGluZSIgInJldiAtIiAiY2JhXG5mZWRcbiIgIiIgImFiY1xuZGVmIgorCit0ZXN0aW5nICJmaWxlMSBub3Rmb3VuZCBmaWxlMiIgXAorICAgICAgICAicmV2IGZpbGUxIG5vdGZvdW5kIGZpbGUyIDI+c3RkZXJyICYmIGVjaG8gb2sgOyBjYXQgc3RkZXJyOyBybSBzdGRlcnIiIFwKKyAgICAgICAgImVub1xub3d0XG5yZXY6IG5vdGZvdW5kOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iICIiICIiCisKK3Rlc3RpbmcgImRpZmZlcmVudCBpbnB1dCBzaXplcyJcCisgICAgICAgICJyZXYiXAorICAgICAgICAiXG4xXG4yMVxuMzIxXG40MzIxXG41NDMyMVxuNDMyMVxuMzIxXG4yMVxuMVxuXG4iXAorICAgICAgICAiIiAiXG4xXG4xMlxuMTIzXG4xMjM0XG4xMjM0NVxuMTIzNFxuMTIzXG4xMlxuMVxuXG4iCisKK3JtIGZpbGUxIGZpbGUyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3JtLnRlc3QgYi90b3lib3gvdGVzdHMvcm0udGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MjRkNjBmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3JtLnRlc3QKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAxMyBSb2JpbiBNaXR0YWwgPHJvYmlubWl0dGFsLml0QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMTMgRGl2eWEgS290aGFyaSA8ZGl2eWEucy5rb3RoYXJpQGdtYWlsLmNvbT4KKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitlY2hvICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgPiBmaWxlLnR4dAordGVzdGluZyAidGV4dC1maWxlIiAicm0gZmlsZS50eHQgJiYgWyAhIC1lIGZpbGUudHh0IF0gJiYgZWNobyAneWVzJyIgInllc1xuIiAiIiAiIgorcm0gLWYgZmlsZSoKKworbWtkaXIgZGlyCit0ZXN0aW5nICJlbXB0eSBkaXJlY3RvcnkiICJybSAtciBkaXIgJiYgWyAhIC1kIGRpciBdICYmIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBkaXIKKworZWNobyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiID4gZmlsZS50eHQgJiYgY2htb2QgMDAwIGZpbGUudHh0Cit0ZXN0aW5nICJ0ZXh0IGZpbGUobW9kZSAwMDApIiAicm0gLWYgZmlsZS50eHQgJiYgWyAhIC1lIGZpbGUudHh0IF0gJiYgZWNobyAneWVzJyIgXAorICAieWVzXG4iICIiICIiCitybSAtZiBmaWxlKgorCit0b3VjaCBmaWxlMS50eHQgZmlsZTIudHh0Citta2RpciBkaXIxIGRpcjIKK3Rlc3RpbmcgIi1yIChtdWx0aXBsZSBmaWxlcyBhbmQgZGlycykiIFwKKyAgInJtIC1yIGZpbGUxLnR4dCBmaWxlMi50eHQgZGlyMSBkaXIyIDI+L2Rldi9udWxsICYmCisgICBbICEgLWUgZmlsZTEudHh0IC1hICEgLWUgZmlsZTIudHh0IC1hICEgLWQgZGlyMSAtYSAhIC1kIGRpcjIgXSAmJiBlY2hvICd5ZXMnIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBmaWxlKiBkaXIqCisKK3RvdWNoIGZpbGUxLnR4dCBmaWxlMi50eHQKK21rZGlyIGRpcjEgZGlyMgordGVzdGluZyAiLXJmIChwcmVzZW50ICsgbWlzc2luZyBmaWxlcyBhbmQgZGlycykiIFwKKyAgInJtIC1yZiBmaWxlMS50eHQgZmlsZTIudHh0IGZpbGUzLnR4dCBkaXIxIGRpcjIgZGlyMyAyPi9kZXYvbnVsbCAmJgorICBbICEgLWUgZmlsZTEudHh0IC1hICEgLWUgZmlsZTIudHh0IC1hICEgLWQgZGlyMSAtYSAhIC1kIGRpcjIgXSAmJiBlY2hvICd5ZXMnIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBmaWxlKiBkaXIqCisKKyMgdGVzdGluZyB3aXRoIG5lc3RlZCBkaXJzLgorbWtkaXIgLXAgZGlyMS9kaXIyL2RpcjMgZGlyMS9kaXIyL2RpcjQKK3RvdWNoIGRpcjEvZmlsZTEudHh0IGRpcjEvZGlyMi9maWxlMi50eHQgZGlyMS9kaXIyL2RpcjMvZmlsZTMudHh0Cit0ZXN0aW5nICItciBuZXN0ZWRfZGlyIiAicm0gLXIgZGlyMS9kaXIyLyAyPi9kZXYvbnVsbCAmJgorICBbIC1kIGRpcjEgLWEgLWYgZGlyMS9maWxlMS50eHQgLWEgISAtZCBkaXIxL2RpcjIgXSAmJiBlY2hvICd5ZXMnIiBcCisgICJ5ZXNcbiIgIiIgIiIKK3JtIC1yZiBkaXIqCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9ybWRpci50ZXN0IGIvdG95Ym94L3Rlc3RzL3JtZGlyLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWIzNmJiYwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9ybWRpci50ZXN0CkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworbWtkaXIgb25lCit0ZXN0aW5nICJybWRpciIgInJtZGlyIG9uZSAmJiBbICEgLWQgb25lIF0gJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKKwordG91Y2ggd2FscnVzCit0ZXN0aW5nICJmaWxlIiBcCisJInJtZGlyIHdhbHJ1cyAyPiAvZGV2L251bGwgfHwgWyAtZiB3YWxydXMgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCitta2RpciBvbmUgdHdvCit0ZXN0aW5nICJvbmUgdHdvIiBcCisJInJtZGlyIG9uZSB0d28gMj4gL2Rldi9udWxsICYmIFsgISAtZCBvbmUgXSAmJiBbICEgLWQgdHdvIF0gJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCisKK21rZGlyIG9uZSB0d28gdGhyZWUKK3Rlc3RpbmcgIm9uZSBtaXNzaW5nIHR3byBmaWxlIHRocmVlIiBcCisJInJtZGlyIG9uZSBtaXNzaW5nIHR3byB3YWxydXMgdGhyZWUgMj4gL2Rldi9udWxsIHx8IFsgISAtZCB0aHJlZSBdICYmIGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgorcm0gd2FscnVzCisKK21rZGlyIG9uZQorY2htb2QgMDAwIG9uZQordGVzdGluZyAibW9kZSAwMDAiICJybWRpciBvbmUgJiYgWyAhIC1kIG9uZSBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKK21rZGlyIHRlbXAKK3RvdWNoIHRlbXAvdGhpbmcKK3Rlc3RpbmcgIm5vbi1lbXB0eSIgXAorCSJybWRpciB0ZW1wIDI+L2Rldi9udWxsIHx8IFsgLWQgdGVtcCBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICItcCBkaXIvZmlsZSIgXAorCSJybWRpciAtcCB0ZW1wL3RoaW5nIDI+L2Rldi9udWxsIHx8IFsgLWYgdGVtcC90aGluZyBdICYmIGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgorCitta2RpciAtcCB0ZW1wL29uZS90d28vdGhyZWUKK3Rlc3RpbmcgIi1wIHBhcnQgb2YgcGF0aCIgXAorCSJybWRpciAtcCB0ZW1wL29uZS90d28vdGhyZWUgMj4vZGV2L251bGwgfHwgWyAtZCB0ZW1wIF0gJiYgWyAhIC1lIHRlbXAvb25lIF0gJiYgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitybSAtcmYgdGVtcAorCisKK21rZGlyIC1wIG9uZS90d28vdGhyZWUKK3Rlc3RpbmcgIi1wIG9uZS90d28vdGhyZWUiIFwKKwkicm1kaXIgLXAgb25lL3R3by90aHJlZSAmJiBbICEgLWUgb25lIF0gJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKKworbWtkaXIgLXAgb25lL3R3by90aHJlZQordGVzdGluZyAiLXAgb25lL3R3by90aHJlZS8iIFwKKwkicm1kaXIgLXAgb25lL3R3by90aHJlZS8gJiYgWyAhIC1lIG9uZSBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKKyNta2RpciAtcCBvbmUvdHdvL3RocmVlCisjY2htb2QgMDAwIG9uZS90d28vdGhyZWUgb25lL3R3byBvbmUKKyN0ZXN0aW5nICItcCBvbmUvdHdvL3RocmVlIiBcCisjCSJybWRpciAtcCBvbmUvdHdvL3RocmVlICYmIFsgISAtZSBvbmUgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3NlZC50ZXN0IGIvdG95Ym94L3Rlc3RzL3NlZC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNTE0OGUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvc2VkLnRlc3QKQEAgLTAsMCArMSwxNTggQEAKKyMhL2Jpbi9lY2hvIFJ1biBzY3JpcHRzL3Rlc3Quc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgJ2FzIGNhdCcgJ3NlZCAiIicgIm9uZVxudHdvXG50aHJlZSIgIiIgIm9uZVxudHdvXG50aHJlZSIKKyMgVGhpcyBzZWdmYXVsdHMgdWJ1bnR1IDEyLjA0J3Mgc2VkLiBObyByZWFsbHkuCitTS0lQX0hPU1Q9MSB0ZXN0aW5nICdzZWQgLSAtIHR3aWNlJyAnc2VkICIiIC0gLScgImhlbGxvXG4iICIiICJoZWxsb1xuIgordGVzdGluZyAnLW4nICdzZWQgLW4gIiInICIiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICctbiBwJyAnc2VkIC1uIHAnICJvbmVcbnR3b1xudGhyZWUiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICdleHBsaWNpdCBwYXR0ZXJuJyAnc2VkIC1lIHAgLW4nICJvbmVcbnR3b1xudGhyZWUiICIiIFwKKwkib25lXG50d29cbnRocmVlIgorCisjIEV4cGxvcmluZyB0aGUgd29uZGVycyBvZiBzZWQgYWRkcmVzc2luZyBtb2RlcwordGVzdGluZyAnJyAnc2VkIC1uIDFwJyAib25lXG4iICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICcnICdzZWQgMnAnICJvbmVcbnR3b1xudHdvXG50aHJlZSIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJycgJ3NlZCAtbiAycCcgInR3b1xuIiAiIiAib25lXG50d29cbnRocmVlIgordGVzdGluZyAnLW4gJHAnICdzZWQgLW4gXCRwJyAidGhyZWUiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICdhcyBjYXQgIzInICJzZWQgLW4gJzEsXCRwJyIgIm9uZVxudHdvXG50aHJlZSIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJ25vIGlucHV0IG1lYW5zIG5vIGxhc3QgbGluZScgInNlZCAnXCRhIGJvaW5nJyIgIiIgIiIgIiIKK3Rlc3RpbmcgJy1uICQsJHAnICdzZWQgLW4gXCQsXCRwJyAndGhyZWUnICcnICdvbmVcbnR3b1xudGhyZWUnCit0ZXN0aW5nICcnICdzZWQgLW4gMSwycCcgIm9uZVxudHdvXG4iICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICcnICdzZWQgLW4gMiwzcCcgInR3b1xudGhyZWUiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICcnICdzZWQgLW4gMiwxcCcgInR3b1xuIiAiIiAib25lXG50d29cbnRocmVlIgordGVzdGluZyAnJCB3aXRoIDIgaW5wdXRzJyAnc2VkIC1uIFwkcCAtIGlucHV0JyAiZm91clxuIiAiZm91clxuIiBcCisJIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJycgJ3NlZCAtbiAvdHdvL3AnICJ0d29cbiIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJycgJ3NlZCAtbiAxLC90d28vcCcgJ29uZVxudHdvXG4nICcnICdvbmVcbnR3b1xudGhyZWUnCit0ZXN0aW5nICcnICdzZWQgLW4gL29uZS8sMnAnICdvbmVcbnR3b1xuJyAnJyAnb25lXG50d29cbnRocmVlJwordGVzdGluZyAnJyAnc2VkIC1uIDEsL29uZS9wJyAnb25lXG50d29cbnRocmVlJyAnJyAnb25lXG50d29cbnRocmVlJwordGVzdGluZyAnJyAnc2VkIC1uIC9vbmUvLDFwJyAnb25lXG4nICcnICdvbmVcbnR3b1xudGhyZWUnCit0ZXN0aW5nICdzZWQgLW4gL3R3by8sJHAnICdzZWQgLW4gL3R3by8sXCRwJyAndHdvXG50aHJlZScgJycgJ29uZVxudHdvXG50aHJlZScKKworCisjIEZ1biB3aXRoIG5ld2xpbmVzIQordGVzdGluZyAnJyAnc2VkIC1uIDNwJyAidGhyZWUiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICdwcm9kaWdhbCBuZXdsaW5lJyAic2VkIC1uICcxLFwkcCcgLSBpbnB1dCIgXAorCSJvbmVcbnR3b1xudGhyZWVcbmZvdXJcbiIgImZvdXJcbiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJ05ld2xpbmUgb25seSBhZGRlZCBpZiBmdXJ0aGVyIG91dHB1dCcgInNlZCAtbiAzcCAtIGlucHV0IiAidGhyZWUiIFwKKwkiZm91clxuIiAib25lXG50d29cbnRocmVlIgorCisjIEZ1biB3aXRoIG1hdGNoIGRlbGltaXRlcnMgYW5kIGVzY2FwZXMKK3Rlc3RpbmcgJ21hdGNoIFx0IHRhYicgInNlZCAtbiAnL1x0L3AnIiAiXHR4XG4iICIiICJcdHhcbiIKK3Rlc3RpbmcgJ21hdGNoIHQgZGVsaW0gZGlzYWJsZXMgXHQgdGFiJyAic2VkIC1uICdcdFx0eHRwJyIgIiIgIiIgIlx0eFxuIgordGVzdGluZyAnbWF0Y2ggdCBkZWxpbSBtYWtlcyBcdCBsaXRlcmFsIHQnIFwKKwkic2VkIC1uICdcdFx0eHRwJyIgInR4XG4iICIiICJ0eFxuIgordGVzdGluZyAnbWF0Y2ggbiBkZWxpbScgInNlZCAtbiAnXG5cdHhucCciICJcdHhcbiIgIiIgIlx0eFxuIgordGVzdGluZyAnbWF0Y2ggbiBkZWxpbSBkaXNhYmxlcyBcbiBuZXdsaW5lJyAic2VkIC1uICdcblxueG5wJyIgIiIgIiIgIlxueFxuIgorU0tJUF9IT1NUPTEgdGVzdGluZyAnbWF0Y2ggXG4gbGl0ZXJhbCBuJyAic2VkIC1uICdcblxueG5wJyIgIm54XG4iICIiICJueFxuIgordGVzdGluZyAnZW5kIG1hdGNoIGRvZXMgbm90IGNoZWNrIHN0YXJ0aW5nIG1hdGNoIGxpbmUnIFwKKwkic2VkIC1uICcvdHdvLywvdHdvL3AnIiAidHdvXG50aHJlZSIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJ2VuZCBtYXRjaC9zdGFydCBtYXRjaCBtaXhpbmcgbnVtYmVyL2xldHRlcicgXAorCSJzZWQgLW4gJzIsL3R3by9wJyIgInR3b1xudGhyZWUiICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICdudW0gdGhlbiByZWdleCcgJ3NlZCAtbiAyLC9kL3AnICdiXG5jXG5kXG4nICcnICdhXG5iXG5jXG5kXG5lXG5mXG4nCit0ZXN0aW5nICdyZWdleCB0aGVuIG51bScgJ3NlZCAtbiAvYi8sNHAnICdiXG5jXG5kXG4nICcnICdhXG5iXG5jXG5kXG5lXG5mXG4nCit0ZXN0aW5nICdtdWx0aXBsZSByZWdleCBhZGRyZXNzIG1hdGNoJyAnc2VkIC1uIC9vbi8sL29mZi9wJyBcCisJJ2JvbmVcbnR1cnRsZVxzY29mZlxudHJvblxubHVyaWRcbm9mZmVyXG4nICAiIiBcCisJJ3phcFxuYm9uZVxudHVydGxlXHNjb2ZmXG5mcmVkXG50cm9uXG5sdXJpZFxub2ZmZXJcbmJlY2F1c2VcbicKK3Rlc3RpbmcgJ3JlZ2V4IGFkZHJlc3Mgb3ZlcmxhcCcgJ3NlZCAtbiAvb24vLC9vZmYvcCcgIm9uXG56YXBcbm9mZm9uXG4iICIiIFwKKwknb25cbnphcFxub2Zmb25cbnBpbmdcbm9mZlxuJworCisjIGdHaEhsbk5wUHFyc3R3eHk6PQorIyBzLy8vI2NvbW1lbnQKKyMgYWJjZERpCisKK3Rlc3RpbmcgJ3Byb2RpZ2FsZXIgbmV3bGluZScgJ3NlZCAtZSBhXFwgLWUgd29vJyAnb25lXG53b29cbicgJycgJ29uZScKK3Rlc3RpbmcgImFjaSIgXAorCSJzZWQgLWUgJzNhIGJvb20nIC1lICcvaHJlL2kgYmFuZycgLWUgJzNhIHdoYWNrJyAtZSAnM2MgYm9uZyciIFwKKwkib25lXG50d29cbmJhbmdcbmJvbmdcbmJvb21cbndoYWNrXG5mb3VyXG4iICIiIFwKKwkib25lXG50d29cbnRocmVlXG5mb3VyXG4iCit0ZXN0aW5nICJiIGxvb3AiICJzZWQgJzp3b287PTtiIHdvbycgfCBoZWFkIC1uIDUiICcxXG4xXG4xXG4xXG4xXG4nICIiICJYIgordGVzdGluZyAiYiBza2lwIiAic2VkIC1uICcyYiB6YXA7ZDs6emFwO3AnIiAidHdvXG4iICIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICJiIGVuZCIgInNlZCAtbiAnMmI7cCciICJvbmVcbnRocmVlIiAiIiAib25lXG50d29cbnRocmVlIgordGVzdGluZyAiYyByYW5nZSIgInNlZCAnMiw0YyBibGFoJyIgIm9uZVxuYmxhaFxuZml2ZVxuc2l4IiAiIiBcCisJIm9uZVxudHdvXG50aHJlZVxuZm91clxuZml2ZVxuc2l4IgordGVzdGluZyAiYyB7cmFuZ2V9IiAic2VkIC1lICcyLDR7YyBibGFoJyAtZSAnfSciIFwKKwkib25lXG5ibGFoXG5ibGFoXG5ibGFoXG5maXZlXG5zaXgiIFwKKyAgICAgICAgIiIgIm9uZVxudHdvXG50aHJlZVxuZm91clxuZml2ZVxuc2l4IgordGVzdGluZyAiYyBtdWx0aXBsZSBjb250aW51YXRpb24iIFwKKwkic2VkIC1lICdjXFwnIC1lICd0d29cXCcgLWUgJyciICJ0d29cblxuIiAiIiAiaGVsbG8iCitTS0lQX0hPU1Q9MSB0ZXN0aW5nICJjIGVtcHR5IGNvbnRpbnVhdGlvbiIgInNlZCAtZSAnY1xcJyIgIlxuIiAiIiAiaGVsbG8iCit0ZXN0aW5nICJEIGZ1cnRoZXIgcHJvY2Vzc2luZyBkZXBlbmRzIG9uIHdoZXRoZXIgbGluZSBpcyBibGFuayIgXAorCSJzZWQgLWUgJy9vbmUvLC90aHJlZS97JyAtZSAnaSBtZWVwJyAtZSdOOzJEO30nIiBcCisJIm1lZXBcbm1lZXBcbnR3b1xudGhyZWVcbiIgIiIgIm9uZVxudHdvXG50aHJlZVxuIgordGVzdGluZyAnbmV3bGluZSBzdGF5aW5nIGF3YXknICdzZWQgcy9vL3gvJyAneG5lXG50d3gnICcnICdvbmVcbnR3bycKKworIyBXaHkgb24gX2VhcnRoXyBpcyB0aGlzIG5vdCBhbiBlcnJvcj8gVGhlcmUncyBhIFwgd2l0aCBubyBjb250aW51YXRpb24hCisjdGVzdGluZyAnc2VkIHdoYXQsIF9yZWFsbHlfPycgJ3NlZCAtZSBhXFwgJiYgZWNobyB5ZXMgcmVhbGx5JyBcCisjCSdvbmVcbnllcyByZWFsbHlcbicgJycgJ29uZVxuJworCisjIGFsbCB0aGUgcy8vLyB0ZXN0CisKK3Rlc3RpbmcgIm1hdGNoIGVtcHR5IGxpbmUiICJzZWQgLWUgJ3MvXlwkL0AvJyIgIkBcbiIgIiIgIlxuIgorCit0ZXN0aW5nICdcMScgInNlZCAncy90XFwod1xcKW8vemFcXDFweS8nIiAib25lXG56YXdweVxudGhyZWUiICIiIFwKKwkib25lXG50d29cbnRocmVlIgordGVzdGluZyAnXDEgcCcgInNlZCAncy90XFwod1xcKW8vemFcXDFweS9wJyIgIm9uZVxuemF3cHlcbnphd3B5XG50aHJlZSIgXAorCSIiICJvbmVcbnR3b1xudGhyZWUiCit0ZXN0aW5nICdcMSBubyBuZXdsaW5lJyAic2VkICdzL3RcXCh3XFwpby96YVxcMXB5LyciICJvbmVcbnphd3B5IiAiIiBcCisJIm9uZVxudHdvIgordGVzdGluZyAnXDEgcCBubyBuZXdsaW5lJyAic2VkICdzL3RcXCh3XFwpby96YVxcMXB5L3AnIiBcCisJIm9uZVxuemF3cHlcbnphd3B5IiAiIiAib25lXG50d28iCit0ZXN0aW5nICctbiBzLy9cMS9wJyAic2VkIC1uICdzL3RcXCh3XFwpby96YVxcMXB5L3AnIiAiemF3cHkiICIiICJvbmVcbnR3byIKK3Rlc3RpbmcgJy1uIHMvL1wxL3Agbm8gbmV3bGluZScgInNlZCAtbiAncy90XFwod1xcKW8vemFcXDFweS9wJyIgInphd3B5IiBcCisJIiIgIm9uZVxudHdvIgordGVzdGluZyAnYmFja3JlZiBlcnJvcicgXAorCSJzZWQgJ3Mvdy9hbGUgXDIgaGEvJyA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IGVjaG8gbm8iIFwKKwkibm9cbiIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgJ2VtcHR5IG1hdGNoIGFmdGVyIG5vbmVtcHR5IG1hdGNoJyAic2VkIC1lICdzL2EqL2MvZyciICdjYmNuY2djJyBcCisJJycgJ2JhYWFuZycKK3Rlc3RpbmcgJ2VtcHR5IG1hdGNoJyAic2VkIC1lICdzL1teYWNdKi9BL2cnIiAnQWFBY0EnICcnICdhYmNkZScKK3Rlc3RpbmcgJ3MvLy8jY29tbWVudCcgInNlZCAtZSAncy9UV08vZm91ci9pI2NvbW1lbnQnIiAib25lXG5mb3VyXG50aHJlZSIgXAorCSIiICJvbmVcbnR3b1xudGhyZWUiCisKK3Rlc3RpbmcgJ04gZmx1c2hlcyBwZW5kaW5nIGEgYW5kIGFkdmFuY2VzIG1hdGNoIGNvdW50ZXInIFwKKwkic2VkIC1lICdhIHdvbycgLWUgJ047XCRwJyIgJ3dvb1xub25lXG50d29cbm9uZVxudHdvJyAiIiAnb25lXG50d28nCit0ZXN0aW5nICJkZWxpbWl0ZXIgaW4gcmVnZXggW2NoYXIgcmFuZ2VdIGRvZXNuJ3QgY291bnQiICJzZWQgLWUgJ3MvWy9dLy8nIiBcCisJIm9uZXR3b1xuIiAiIiAnb25lL3R3b1xuJwordGVzdGluZyAiZGVsZXRlIHJlZ2V4IHJhbmdlIHN0YXJ0IGxpbmUgYWZ0ZXIgdHJpZ2dlciIgXAorCSJzZWQgLWUgJy9vbmUvLC90aHJlZS97JyAtZSAnaSBtZWVwJyAtZSAnMUQ7fSciIFwKKwkibWVlcFxubWVlcFxudHdvXG5tZWVwXG50aHJlZSIgIiIgIm9uZVxudHdvXG50aHJlZSIKK3Rlc3RpbmcgImJsYW5rIHBhdHRlcm4gcmVwZWF0cyBsYXN0IHBhdHRlcm4iIFwKKwkic2VkIC1lICcvXnRocmVlL3MvL2FiYyZkZWYvJyIgXAorCSJvbmUgdHdvIHRocmVlXG5hYmN0aHJlZWRlZiBmb3VyIGZpdmVcbmZpdmUgc2l4IHNldmVuXG4iICIiIFwKKwkib25lIHR3byB0aHJlZVxudGhyZWUgZm91ciBmaXZlXG5maXZlIHNpeCBzZXZlblxuIgorCisjIERpZmZlcmVudCB3YXlzIG9mIHBhcnNpbmcgbGluZSBjb250aW51YXRpb25zCisKK3Rlc3RpbmcgIiIgInNlZCAtZSAnMWFcJyAtZSAnaHVoJyIgIm1lZXBcbmh1aFxuIiAiIiAibWVlcCIKK3Rlc3RpbmcgIiIgInNlZCAtZiBpbnB1dCIgImJsYWhcbmJvb21cbiIgJzFhXFxcbmJvb20nICdibGFoJwordGVzdGluZyAiIiAic2VkIC1mIC0gaW5wdXQiICJibGFoXG5ib29tXG4iICdibGFoJyAnMWFcXFxuYm9vbScKK3Rlc3RpbmcgIiIgInNlZCAnMWFcCitoZWxsbyciICJtZXJwXG5oZWxsb1xuIiAiIiAibWVycCIKKwordGVzdGluZyAiIiAic2VkIC1lICcveC9jXCcgLWUgJ3knIiAneVxuJyAnJyAneFxuJwordGVzdGluZyAiIiAic2VkIC1lICdzL2FbKFtdKmIvWC8nIiAnWCcgJycgJ2FbKGInCit0ZXN0aW5nICIiICJzZWQgJ3kvYVxcYmMvZGVcZi8nIiAiZGJcZiIgIiIgImFiYyIKK3Rlc3RpbmcgIlthLWFdIChmb3IgcGVybCkiICJzZWQgJyIncy9cKFteYS16QS1aMC05LjpfXC1cL11cKS9cXFwxL2cnIiciIFwKKyAgJ2hlXCBsbG8nICIiICJoZSBsbG8iCisKKyMgRGViaWFuIGJ1ZyBodHRwczovL2J1Z3MuZGViaWFuLm9yZy82MzU1NzAgYWRkZWQgY29kZSB0byBlbnN1cmUgYSBmaWxlCisjIGVuZHMgd2l0aCBhIG5ld2xpbmUgdmlhICJzZWQgLWUgJyRhXCciLiBBcHBhcmVudGx5IGFsbCBhXCB3aXRoIG5vIGFkZGl0aW9uYWwKKyMgcGF0dGVybiBsaW5lcyBhZnRlciBpdCBkb2VzIChvdGhlciB0aGFuIG1ha2luZyBwb3NpeCB0aHJvdyB1cCkgaXMKKyMgZmx1c2ggdGhlIHBlbmRpbmcgbmV3bGluZSBhcyBfaWZfIGl0IGhhZCBhZGRlZCBhbm90aGVyIGxpbmUuICpzaHJ1ZyogT2s/Cit0ZXN0aW5nICJ0cmFpbGluZyBhXCAoZm9yIGRlYmlhbikiICJzZWQgJ2FcXCciICJoZWxsb1xuIiAiIiAiaGVsbG8iCisKKyMgWW91IGhhdmUgdG8gbWF0Y2ggdGhlIGZpcnN0IGxpbmUgb2YgYSByYW5nZSBpbiBvcmRlciB0byBhY3RpdmF0ZQorIyB0aGUgcmFuZ2UsIG51bWVyaWMgYW5kIGFzY2lpIHdvcmsgdGhlIHNhbWUgd2F5Cit0ZXN0aW5nICJza2lwIHN0YXJ0IG9mIHJhbmdlIiAic2VkIC1lIG4gLWUgJzEsMnMvYi9jLyciICJhXG5iXG4iICIiICJhXG5iXG4iCisKKyNlY2hvIG1lZXAgfCBzZWQvc2VkIC1lICcxYVwnIC1lICdodWgnCisjZWNobyBibGFoIHwgc2VkL3NlZCAtZiA8KGVjaG8gLWUgIjFhXFxcXFxuYm9vbSIpCisjZWNobyBtZXJwIHwgc2VkL3NlZCAiMWFcXAorI2hlbGxvIgorCit0ZXN0aW5nICJib251cyBiYWNrc2xhc2hlcyIgXAorICAic2VkIC1lICdhIFxsIFx4XCcgLWUgXCJcJChlY2hvIC1lICdhYlxcXG5jJylcIiIgXAorICAiaGVsbG9cbmwgeFxuYWJcbmNcbiIgIiIgImhlbGxvXG4iCisjIC1pIHdpdGggJCBsYXN0IGxpbmUgdGVzdApkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3NlcS50ZXN0IGIvdG95Ym94L3Rlc3RzL3NlcS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxMDc5NzgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvc2VxLnRlc3QKQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICIoZXhpdCB3aXRoIGVycm9yKSIgInNlcSAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIihleGl0IHdpdGggZXJyb3IpIiAic2VxIDEgMiAzIDQgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisgICAgICAgICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIm9uZSBhcmd1bWVudCIgInNlcSAzIiAiMVxuMlxuM1xuIiAiIiAiIgordGVzdGluZyAidHdvIGFyZ3VtZW50cyIgInNlcSA1IDciICI1XG42XG43XG4iICIiICIiCit0ZXN0aW5nICJ0d28gYXJndW1lbnRzIHJldmVyc2VkIiAic2VxIDcgNSIgIiIgIiIgIiIKK3Rlc3RpbmcgInR3byBhcmd1bWVudHMgZXF1YWwiICJzZXEgMyAzIiAiM1xuIiAiIiAiIgordGVzdGluZyAidHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IG5lZ2F0aXZlIHN0ZXAiICJzZXEgMSAtMTUgMSIgXAorICAgICAgICAiMVxuIiAiIiAiIgordGVzdGluZyAidHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IHBvc2l0aXZlIHN0ZXAiICJzZXEgMSArMTUgMSIgXAorICAgICAgICAiMVxuIiAiIiAiIgordGVzdGluZyAiY291bnQgdXAgYnkgMiIgInNlcSA0IDIgOCIgIjRcbjZcbjhcbiIgIiIgIiIKK3Rlc3RpbmcgImNvdW50IGRvd24gYnkgMiIgInNlcSA4IC0yIDQiICI4XG42XG40XG4iICIiICIiCit0ZXN0aW5nICJjb3VudCB3cm9uZyB3YXkgIzEiICJzZXEgNCAtMiA4IiAiIiAiIiAiIgordGVzdGluZyAiY291bnQgd3Jvbmcgd2F5ICMyIiAic2VxIDggMiA0IiAiIiAiIiAiIgordGVzdGluZyAiY291bnQgYnkgLjMiICJzZXEgMyAuMyA0IiAiM1xuMy4zXG4zLjZcbjMuOVxuIiAiIiAiIgordGVzdGluZyAiY291bnQgYnkgLS45IiAic2VxIC43IC0uOSAtMi4yIiAiMC43XG4tMC4yXG4tMS4xXG4tMlxuIiAiIiAiIgordGVzdGluZyAiY291bnQgYnkgemVybyIgInNlcSA0IDAgOCB8IGhlYWQgLW4gMTAiICIiICIiICIiCit0ZXN0aW5nICJzZXBhcmF0b3IgLSIgInNlcSAtcyAtIDEgMyIgIjEtMi0zXG4iICIiICIiCit0ZXN0aW5nICJmb3JtYXQgc3RyaW5nIiAnc2VxIC1mICUrMDFnIC0xMCA1IDEwJyAiLTEwXG4tNVxuKzBcbis1XG4rMTBcbiIgXAorICAiIiAiIgordGVzdGluZyAic2VwYXJhdG9yIGFuZCBmb3JtYXQgc3RyaW5nIiAic2VxIC1mIFwlMDNnIC1zIFw7IDUgLTEgMCIgIjAwNTswMDQ7MDAzOzAwMjswMDE7MDAwXG4iICIiICIiCit0ZXN0aW5nICJwYWRkaW5nIiAic2VxIC1zLCAtdyAtMiAxOSAxMjAiICItMDIsMDE3LDAzNiwwNTUsMDc0LDA5MywxMTJcbiIgXAorICAiIiAiIgordGVzdGluZyAicGFkZGluZyIgInNlcSAtcywgLXcgLTIgMyAxMiIgIi0yLDAxLDA0LDA3LDEwXG4iICIiICIiCit0ZXN0aW5nICJwYWRkaW5nIiAic2VxIC1zLCAtdyAtMi4yIDMuMyAxMiIgIi0yLjIsMDEuMSwwNC40LDA3LjcsMTEuMFxuIiBcCisgICIiICIiCisKKyMgVGVzdCAtZiBmb3JtYXQgZmlsdGVyaW5nCitmb3IgaSBpbiAlZiAlZSAlZyAiYm9vICVmIHlhaCIgIiUgZiIgJS0xLjJmICUrLWYgIiUrIC0gZiIgJS4yZiAlMy5mICIlJy4yZiIgXAorCSUlJWYlJQorZG8KKyAgdGVzdGluZyAiZmlsdGVyIC1mIFwiJGlcIiIgInNlcSAtZiBcIiRpXCIgMSAzID4gL2Rldi9udWxsICYmIGVjaG8geWVzIiBcCisgICAgInllc1xuIiAiIiAiIgorZG9uZQorIyBUZXN0IC1mIGZvcm1hdCBmaWx0ZXJpbmcgZmFpbHVyZXMKK2ZvciBpIGluICVkICVzICIiICJib28gJWYgJWYgeWFoIiAiJSpmIiAlLTEuMi4zZiAnJTIkZicgJTEtZiAiJTEgZiIgXAorCSUyLi4yZiAlJSVmJSUlCitkbworICB0ZXN0aW5nICJmaWx0ZXIgcmVqZWN0IC1mICckaSciIFwKKyAgICAic2VxIC1mICckaScgMSAzIDI+L2Rldi9udWxsIHx8IGVjaG8gbm8iICJub1xuIiAiIiAiIgorZG9uZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3NldGZhdHRyLnRlc3QgYi90b3lib3gvdGVzdHMvc2V0ZmF0dHIudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTA0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3NldGZhdHRyLnRlc3QKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitta2RpciBhdHRycwordG91Y2ggYXR0cnMvZmlsZQorc2V0ZmF0dHIgLW4gdXNlci5lbXB0eSBhdHRycy9maWxlCitzZXRmYXR0ciAtbiB1c2VyLmRhdGEgLXYgaGVsbG8gYXR0cnMvZmlsZQorc2V0ZmF0dHIgLW4gdXNlci5kZWxldGUtbWUgLXYgaGVsbG8gYXR0cnMvZmlsZQorCit0ZXN0aW5nICIteCIgXAorICAgICJzZXRmYXR0ciAteCB1c2VyLmRlbGV0ZS1tZSBhdHRycy9maWxlICYmIGdldGZhdHRyIGF0dHJzL2ZpbGUiIFwKKyAgICAiIyBmaWxlOiBhdHRycy9maWxlXG51c2VyLmRhdGFcbnVzZXIuZW1wdHlcblxuIiAiIiAiIgordGVzdGluZyAiLW4iICJzZXRmYXR0ciAtbiB1c2VyLm5ldyBhdHRycy9maWxlICYmIGdldGZhdHRyIC1kIGF0dHJzL2ZpbGUiIFwKKyAgICAiIyBmaWxlOiBhdHRycy9maWxlXG51c2VyLmRhdGE9XCJoZWxsb1wiXG51c2VyLmVtcHR5XG51c2VyLm5ld1xuXG4iICIiICIiCit0ZXN0aW5nICItbiAtdiIgInNldGZhdHRyIC1uIHVzZXIubmV3IC12IGRhdGEgYXR0cnMvZmlsZSAmJiBnZXRmYXR0ciAtZCBhdHRycy9maWxlIiBcCisgICAgIiMgZmlsZTogYXR0cnMvZmlsZVxudXNlci5kYXRhPVwiaGVsbG9cIlxudXNlci5lbXB0eVxudXNlci5uZXc9XCJkYXRhXCJcblxuIiAiIiAiIgorCitybSAtcmYgYXR0cnMKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9zaC50ZXN0IGIvdG95Ym94L3Rlc3RzL3NoLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGYxZWNiMgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy9zaC50ZXN0CkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworc2hlbGxpdCgpCit7CisgIEVWQUw9ImJhc2ggLWMiIHRlc3RpbmcgIiQyIiAiJDEgcHJpbnRmICVzICQyIiAiJDMiICIkNCIgIiQ1IgorfQorCisjICQnJyBleHBhbmRzIHNwZWNpYWwgY2hhcnMgYnV0IGRvZXNuJ3QgZG8gc28gaW5zaWRlIGRvdWJsZSBxdW90ZXMuCisKK3NoZWxsaXQgIiIgIlwkJ2FcXHRiJyIgImFcdGIiICIiICIiCitzaGVsbGl0ICIiICJcIlwkJ2FcXHRiJ1wiIiAnJCciJyInYVxcdGInIiciICIiICIiIAorCisjICQoKCApKSB0ZXN0cworCitzaGVsbGl0ICd4PTE7JyAnJCgoLXgpKScgJy0xJyAnJyAnJworc2hlbGxpdCAneD0wOycgJyQoKHgrKykpOyBlY2hvICR4JyAnMDFcbicgJycgJycKK3NoZWxsaXQgJ3g9MDsnICckKCgrK3gpKScgJzEnICcnICcnCitzaGVsbGl0ICd4PTA7JyAnJCgofngpKScgJy0xJyAnJyAnJworc2hlbGxpdCAneD0xOycgJyQoKCF4KSknICcwJyAnJyAnJworc2hlbGxpdCAneD0wOycgJyQoKCF4KSknICcxJyAnJyAnJworc2hlbGxpdCAneD0yOycgJyQoKDIqeCkpJyAnNCcgJycgJycKK3NoZWxsaXQgJ3g9OTsnICckKCh4LzQpKScgJzInICcnICcnCitzaGVsbGl0ICd4PTk7JyAnJCgoeCU0KSknICcxJyAnJyAnJworc2hlbGxpdCAneD00OycgJyQoKHgrMikpJyAnNicgJycgJycKK3NoZWxsaXQgJ3g9NDsnICckKCh4LTIpKScgJzInICcnICcnCitzaGVsbGl0ICd4PTQ7JyAnJCgoMTw8eCkpJyAnMTYnICcnICcnCitzaGVsbGl0ICd4PTQ7JyAnJCgoeD4+MSkpJyAnMicgJycgJycKK3NoZWxsaXQgJycgJyQoKDMqKjQpKScgJzgxJyAnJyAnJworc2hlbGxpdCAnJyAnJCgoMzw9NCkpJyAnMScgJycgJycKK3NoZWxsaXQgJycgJyQoKDM+PTQpKScgJzAnICcnICcnCitzaGVsbGl0ICcnICckKCgzPDQpKScgJzEnICcnICcnCitzaGVsbGl0ICcnICckKCgzPjQpKScgJzAnICcnICcnCitzaGVsbGl0ICcnICckKCgzPT00KSknICcwJyAnJyAnJworc2hlbGxpdCAnJyAnJCgoMyE9NCkpJyAnMScgJycgJycKK3NoZWxsaXQgJycgJyQoKDYmNCkpJyAnNCcgJycgJycKK3NoZWxsaXQgJycgJyQoKDR8MikpJyAnNicgJycgJycKK3NoZWxsaXQgJycgJyQoKDYmJjIpKScgJzEnICcnICcnCitzaGVsbGl0ICcnICckKCg2fHw0KSknICcxJyAnJyAnJworc2hlbGxpdCAnJyAnJCgoMT8yOjMpKScgJzInICcnICcnCitzaGVsbGl0ICd4PTI7JyAnJCgoeD0zKSk7IGVjaG8gJHgnICczM1xuJyAnJyAnJworc2hlbGxpdCAneD0yOycgJyQoKHgqPTMpKTsgZWNobyAkeCcgJzY2XG4nICcnICcnCitzaGVsbGl0ICd4PTU7JyAnJCgoeC89MikpOyBlY2hvICR4JyAnMjJcbicgJycgJycKK3NoZWxsaXQgJ3g9OTsnICckKCh4JT01KSk7IGVjaG8gJHgnICc0NFxuJyAnJyAnJworc2hlbGxpdCAneD05OycgJyQoKHgtPTMpKTsgZWNobyAkeCcgJzY2XG4nICcnICcnCitzaGVsbGl0ICd4PTM7JyAnJCgoeCs9MikpOyBlY2hvICR4JyAnNTVcbicgJycgJycKK3NoZWxsaXQgJ3g9NzsnICckKCh4Jj0xMykpOyBlY2hvICR4JyAnNTVcbicgJycgJycKK3NoZWxsaXQgJ3g9NTsnICckKCh4fD0xMikpOyBlY2hvICR4JyAnMTMxM1xuJyAnJyAnJworc2hlbGxpdCAneD01OycgJyQoKHhePTEyKSk7IGVjaG8gJHgnICc5OVxuJyAnJyAnJworc2hlbGxpdCAneD0yOycgJyQoKHg8PD0yKSk7IGVjaG8gJHgnICc4OFxuJyAnJyAnJworc2hlbGxpdCAneD0xMjsnICckKCh4Pj49MikpOyBlY2hvICR4JyAnMzNcbicgJycgJycKK3NoZWxsaXQgJ3g9MjsnICckKCh4KyssNSkpOyBlY2hvICR4JyAnNTNcbicgJycgJycKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9zaGExc3VtLnRlc3QgYi90b3lib3gvdGVzdHMvc2hhMXN1bS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0ZDRiNzUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvc2hhMXN1bS50ZXN0CkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBUaGVzZSB0ZXN0cyBhcmUgYmFzZWQgb24gUkZDMzE3NCB3aGljaCB3ZXJlIGJhc2VkIG9uIEZJUFMgUFVCIDE4MC0xCisKK3Rlc3RpbmcgIlRFU1QxIiBcCisgICAgICAgICJzaGExc3VtIiBcCisgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkICAtXG4iIFwKKyAgICAgICAgIiIgImFiYyIKKwordGVzdGluZyAiVEVTVDIiIFwKKyAgICAgICAgInNoYTFzdW0iIFwKKyAgICAgICAgIjg0OTgzZTQ0MWMzYmQyNmViYWFlNGFhMWY5NTEyOWU1ZTU0NjcwZjEgIC1cbiIgXAorICAgICAgICAiIiAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiCisKK3Rlc3RpbmcgIlRFU1QzIiBcCisgICAgICAgICdkZCBpZj0vZGV2L3plcm8gYnM9MTAwMCBjb3VudD0xMDAwIDI+L2Rldi9udWxsIHwgdHIgXFwwIGEgfCBzaGExc3VtJyBcCisgICAgICAgICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmICAtXG4iIFwKKyAgICAgICAgIiIgIiIKKwordGVzdGluZyAiVEVTVDQiIFwKKyAgICAgICAgJ2ZvciBpIGluIGBzZXEgMSAxMGA7IGRvIGVjaG8gLW4gMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NyA7IGRvbmUgfCBzaGExc3VtJyBcCisgICAgICAgICJkZWEzNTZhMmNkZGQ5MGM3YTdlY2VkYzVlYmI1NjM5MzRmNDYwNDUyICAtXG4iIFwKKyAgICAgICAgIiIgIiIKKworZWNobyAtbiAiYWJjIiA+IGZpbGUxCitlY2hvIC1uICJkZWYiID4gZmlsZTIKK3Rlc3RpbmcgInNoYTFzdW0iIFwKKyAgICAgICAgInNoYTFzdW0iIFwKKyAgICAgICAgImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQgIC1cbiIgXAorICAgICAgICAiIiAiYWJjIgorCit0ZXN0aW5nICItIiBcCisgICAgICAgICJzaGExc3VtIC0iIFwKKyAgICAgICAgImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQgIC1cbiIgXAorICAgICAgICAiIiAiYWJjIgorCit0ZXN0aW5nICJmaWxlIiBcCisgICAgICAgICJzaGExc3VtIGZpbGUxIiBcCisgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkICBmaWxlMVxuIiBcCisgICAgICAgICIiICIiCisKK3Rlc3RpbmcgImZpbGUxIGZpbGUyIiBcCisgICAgICAgICJzaGExc3VtIGZpbGUxIGZpbGUyIiBcCisgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkICBmaWxlMVxuNTg5YzIyMzM1YTM4MWYxMjJkMTI5MjI1ZjVjMGJhMzA1NmVkNTgxMSAgZmlsZTJcbiIgXAorICAgICAgICAiIiAiIgorCit0ZXN0aW5nICJmaWxlMSBmaWxlMiAtIiBcCisgICAgICAgICJzaGExc3VtIGZpbGUxIGZpbGUyIC0iIFwKKyAgICAgICAgImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQgIGZpbGUxXG41ODljMjIzMzVhMzgxZjEyMmQxMjkyMjVmNWMwYmEzMDU2ZWQ1ODExICBmaWxlMlxuYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCAgLVxuIiBcCisgICAgICAgICIiICJhYmMiCisKK3JtIC1mIGZpbGUxIGZpbGUyCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy9zb3J0LnRlc3QgYi90b3lib3gvdGVzdHMvc29ydC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkYTNkYjUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvc29ydC50ZXN0CkBAIC0wLDAgKzEsMTA2IEBACisjIS9iaW4vYmFzaAorCisjIFNVU3Y0IGNvbXBsaWFudCBzb3J0IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSwgMjAxMiBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworIyBUaGUgYmFzaWMgdGVzdHMuICBUaGVzZSBzaG91bGQgd29yayBldmVuIHdpdGggdGhlIHNtYWxsIGNvbmZpZy4KKwordGVzdGluZyAic29ydCIgInNvcnQgaW5wdXQiICJhXG5iXG5jXG4iICJjXG5hXG5iXG4iICIiCit0ZXN0aW5nICIjMiIgInNvcnQgaW5wdXQiICIwMTBcbjFcbjNcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic3RkaW4iICJzb3J0IiAiYVxuYlxuY1xuIiAiIiAiYlxuYVxuY1xuIgordGVzdGluZyAibnVtZXJpYyIgInNvcnQgLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAicmV2ZXJzZSIgInNvcnQgLXIgaW5wdXQiICJ3b29rXG53YWxydXNcbnBvaW50XG5wYWJzdFxuYWFyZ2hcbiIgXAorCSJwb2ludFxud29va1xucGFic3RcbmFhcmdoXG53YWxydXNcbiIgIiIKKworIyBUaGVzZSB0ZXN0cyByZXF1aXJlIHRoZSBmdWxsIG9wdGlvbiBzZXQuCisKK29wdGlvbmFsIFNPUlRfQklHCisjIExvbmdpc2ggY2h1bmsgb2YgZGF0YSByZS11c2VkIGJ5IHRoZSBuZXh0IGZldyB0ZXN0cy4gIFRoZSBleHBlY3RlZCBvdXRwdXQKKyMgdmFyaWVzLCBidXQgdGhlIGlucHV0ICh0aGlzKSBpcyB0aGUgc2FtZS4KKworZGF0YT0iNDIJMQkzCXdvb3QKKzQyCTEJMDEwCXpvb2xvZ3kKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzk5OQkzCTAJYWxnZWJyYQorIgorCisjIFNvcnRpbmcgd2l0aCBrZXlzCisKK3Rlc3RpbmcgIm9uZSBrZXkiICJzb3J0IC1rNCw0IGlucHV0IiBcCisiOTk5CTMJMAlhbGdlYnJhCitlZ2cJMQkyCXBhcHlydXMKKzcJMwk0Mglzb3VwCis0MgkxCTMJd29vdAorNDIJMQkwMTAJem9vbG9neQorIiAiJGRhdGEiICIiCisKKyMgVGhlIG51bWVyaWMgc29ydCBvcmRlcnMgZmllbGQgMiwgaWdub3JlcyBmaWVsZCAzIChiZWNhdXNlIG51bWVyaWMgc29ydCBzdG9wcworIyBhdCB0aGUgd2hpdGVzcGFjZSksIHRoZW4gdGhlIGdsb2JhbCBmYWxsYmFjayBzb3J0IGRvZXMgYW4gYWxwaGEgc29ydCBvbgorIyB0aGUgd2hvbGUgc3RyaW5nIChzdGFydGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lKS4KKwordGVzdGluZyAia2V5IHJhbmdlIHdpdGggbnVtZXJpYyBvcHRpb24iICJzb3J0IC1rMiwzbiBpbnB1dCIgXAorIjQyCTEJMDEwCXpvb2xvZ3kKKzQyCTEJMwl3b290CitlZ2cJMQkyCXBhcHlydXMKKzcJMwk0Mglzb3VwCis5OTkJMwkwCWFsZ2VicmEKKyIgIiRkYXRhIiAiIgorCisjIE51bWVyaWMgc29ydCBvbiBmaWVsZCAyIChhZ2FpbiwgaWdub3JlIGZpZWxkIDMgYmVjYXVzZSBpdCdzIG51bWVyaWMpLAorIyB0aGVuIGRvIGEgX3JldmVyc2VkXyBhbHBoYSBzb3J0IG9uIHRoZSB3aG9sZSBsaW5lIGFzIGEgdGllYnJlYWtlci4KKwordGVzdGluZyAia2V5IHJhbmdlIHdpdGggbnVtZXJpYyBvcHRpb24gYW5kIGdsb2JhbCByZXZlcnNlIiBcCisic29ydCAtazIsM24gLXIgaW5wdXQiIFwKKyJlZ2cJMQkyCXBhcHlydXMKKzQyCTEJMwl3b290Cis0MgkxCTAxMAl6b29sb2d5Cis5OTkJMwkwCWFsZ2VicmEKKzcJMwk0Mglzb3VwCisiICIkZGF0YSIgIiIKKworIyBSZXZlcnNlZCBudW1lcmljIHNvcnQgb24gZmllbGQgMiAobnVtZXJpYyBpZ25vcmVzIGZpZWxkIDMpLCB0aGVuCisjIGJyZWFrIHRpZXMgd2l0aCBhbHBoYSBzb3J0IG9uIHdob2xlIGxpbmUuCisKK3Rlc3RpbmcgImtleSByYW5nZSB3aXRoIG11bHRpcGxlIG9wdGlvbnMiICJzb3J0IC1rMiwzcm4gaW5wdXQiIFwKKyI3CTMJNDIJc291cAorOTk5CTMJMAlhbGdlYnJhCis0MgkxCTAxMAl6b29sb2d5Cis0MgkxCTMJd29vdAorZWdnCTEJMglwYXB5cnVzCisiICIkZGF0YSIgIiIKKwordGVzdGluZyAia2V5IGRvZXNuJ3Qgc3RyaXAgbGVhZGluZyBibGFua3MsIGRpc2FibGVzIGZhbGxiYWNrIGdsb2JhbCBzb3J0IiBcCisic29ydCAtbiAtazIgLXQgJyAnIiAiIGEgXG4gMSBcbiAyIFxuIiAiIiAiIDIgXG4gMSBcbiBhIFxuIgorCisjIFRlc3QgY2FzZSBjb250cmlidXRlZCBieSBKb2V5IEhlc3M6CisKK3Rlc3RpbmcgImtleSBlZGdlIGNhc2Ugd2l0aCAtdCIgInNvcnQgLW4gLWs0IC10LyIgXAorIi91c3IvbGliL2ZpbmlzaC1pbnN0YWxsLmQvMQorL3Vzci9saWIvZmluaXNoLWluc3RhbGwuZC80CisvdXNyL2xpYi9wcmViYXNlY29uZmlnLmQvMgorL3Vzci9saWIvcHJlYmFzZWNvbmZpZy5kLzYKKyIgIiIgIi91c3IvbGliL2ZpbmlzaC1pbnN0YWxsLmQvMQorL3Vzci9saWIvcHJlYmFzZWNvbmZpZy5kLzIKKy91c3IvbGliL2ZpbmlzaC1pbnN0YWxsLmQvNAorL3Vzci9saWIvcHJlYmFzZWNvbmZpZy5kLzYKKyIKKwordGVzdGluZyAiLXgiICJzb3J0IC14IiAiMDEwXG5hMFxuIDBjMFxuIiAiIiAiYTBcbjAxMFxuIDBjMFxuIgorCisjIFRlc3QgdGhhdCAtZiBhcHBsaWVzIHRvIGtleSBvciBmYWxsYmFjayBpbmRlcGVuZGVudGx5CisKK3Rlc3RpbmcgIiIgInNvcnQgLWsyLDJmIiAiQSBiIGJcbmEgQiBDXG5hIEIgYVxuIiAiIiAiYSBCIGFcbkEgYiBiXG5hIEIgQ1xuIgordGVzdGluZyAiIiAic29ydCAtazIsMiIgImEgQiBDXG5hIEIgYVxuQSBiIGJcbiIgIiIgImEgQiBhXG5BIGIgYlxuYSBCIENcbiIKK3Rlc3RpbmcgIiIgInNvcnQgLWYgLWsyLDIiICJBIGIgYlxuYSBCIENcbmEgQiBhXG4iICIiICJhIEIgYVxuQSBiIGJcbmEgQiBDXG4iIAorCitvcHRpb25hbCBTT1JUX0ZMT0FUCisKKyMgbm90IG51bWJlcnMgPCBOYU4gPCAtaW5maW5pdHkgPCBudW1iZXJzIDwgK2luZmluaXR5Cit0ZXN0aW5nICItZyIgInNvcnQgLWciIFwKKyAgImJvcmtcbk5hTlxuLWluZlxuMC40XG4xLjIyMlxuMDEuMzdcbjIuMVxuK2luZmluaXR5XG4iICIiIFwKKyAgIjAxLjM3XG4xLjIyMlxuMi4xXG4wLjRcbk5hTlxuYm9ya1xuLWluZlxuK2luZmluaXR5XG4iCisKKwpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3NwbGl0LnRlc3QgYi90b3lib3gvdGVzdHMvc3BsaXQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTI3YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3NwbGl0LnRlc3QKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJzcGxpdCIgInNlcSAxIDEyMzQ1IHwgc3BsaXQgJiYgbHMgeGFbYS16XSB8IHdjIC1sIiAiMTNcbiIgIiIgIiIKK3JtIHhhW2Etel0KKwordGVzdGluZyAiLSIgInNlcSAxIDEyMzQ1IHwgc3BsaXQgLSAmJiBscyB4YVthLXpdIHwgd2MgLWwiICIxM1xuIiAiIiAiIgorcm0geGFbYS16XQorCitzZXEgMSAxMjM0NSA+IGZpbGUKK3Rlc3RpbmcgImZpbGUiICJzcGxpdCBmaWxlICYmIGxzIHhhW2Etel0gfCB3YyAtbCIgIjEzXG4iICIiICIiCitybSB4YVthLXpdCisKK3Rlc3RpbmcgIi1sIiAic3BsaXQgZmlsZSAtbCAxMGsgJiYgd2MgLWwgeGFiIiAiMjEwNSB4YWJcbiIgIiIgIiIKK3JtIHhhW2FiXQorCit0ZXN0aW5nICJzdWZmaXggZXhoYXVzdGlvbiIgXAorICAic3BsaXQgZmlsZSAtbCAxMCAtYSAxIHdhbHJ1cyAyPi9kZXYvbnVsbCB8fCBscyB3YWxydXMqIHwgd2MgLWwiICIyNlxuIiAiIiAiIgorcm0gd2FscnVzKgorCit0ZXN0aW5nICJieXRlcyIgXAorICAidG95Ym94IHNlcSAxIDIwMDAwIHwgc3BsaXQgLWIgMTAwIC1hIDMgLSB3aGFuZyAmJiBscyB3aGFuZyogfCB3YyAtbCAmJiB3YyAtYyB3aGFuZ2JwdyIgIjEwODlcbjk0IHdoYW5nYnB3XG4iICIiICIiCisKK3Rlc3RpbmcgInJlYXNzZW1ibHkiIFwKKyAgJ2RpZmYgLXUgPChscyB3aGFuZyogfCBzb3J0IHwgeGFyZ3MgY2F0KSA8KHNlcSAxIDIwMDAwKSAmJiBlY2hvIHllcycgXAorICAieWVzXG4iICIiICIiCisKK3JtIGZpbGUgd2hhbmcqCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvdGFjLnRlc3QgYi90b3lib3gvdGVzdHMvdGFjLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWMwOTViNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy90YWMudGVzdApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKworZWNobyAtZSAib25lLUFcbm9uZS1CIiA+IGZpbGUxIAorZWNobyAtZSAidHdvLUFcbnR3by1CIiA+IGZpbGUyCit0ZXN0aW5nICJ0YWMiICJ0YWMgJiYgZWNobyB5ZXMiICJvbmUtQlxub25lLUFcbnllc1xuIiAiIiAib25lLUFcbm9uZS1CXG4iCit0ZXN0aW5nICItIiAidGFjIC0gJiYgZWNobyB5ZXMiICJvbmUtQlxub25lLUFcbnllc1xuIiAiIiAib25lLUFcbm9uZS1CXG4iCit0ZXN0aW5nICJmaWxlMSBmaWxlMiIgInRhYyBmaWxlMSBmaWxlMiIgIm9uZS1CXG5vbmUtQVxudHdvLUJcbnR3by1BXG4iICAiIiAiIgordGVzdGluZyAiLSBmaWxlIiAgICAgICJ0YWMgLSBmaWxlMSIgICAgICJ6ZXJvLUJcbnplcm8tQVxub25lLUJcbm9uZS1BXG4iICIiICJ6ZXJvLUFcbnplcm8tQlxuIgordGVzdGluZyAiZmlsZSAtIiAgICAgICJ0YWMgZmlsZTEgLSIgICAgICJvbmUtQlxub25lLUFcbnplcm8tQlxuemVyby1BXG4iICIiICJ6ZXJvLUFcbnplcm8tQlxuIgorCit0ZXN0aW5nICJmaWxlMSBub3Rmb3VuZCBmaWxlMiIgXAorICAgICAgICAidGFjIGZpbGUxIG5vdGZvdW5kIGZpbGUyIDI+c3RkZXJyICYmIGVjaG8gb2sgOyB0YWMgc3RkZXJyOyBybSBzdGRlcnIiIFwKKyAgICAgICAgIm9uZS1CXG5vbmUtQVxudHdvLUJcbnR3by1BXG50YWM6IG5vdGZvdW5kOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iICIiICIiCisKK3Rlc3RpbmcgIm5vIHRyYWlsaW5nIG5ld2xpbmUiICJ0YWMgLSIgImRlZmFiY1xuIiAiIiAiYWJjXG5kZWYiCisKKyMgeHB1dHMgdXNlZCBieSB0YWMgZG9lcyBub3QgcHJvcGFnYXRlIHRoaXMgZXJyb3IgY29uZGl0aW9uIHByb3Blcmx5LiAKKyN0ZXN0aW5nICI+IC9kZXYvZnVsbCIgXAorIyAgICAgICAgInRhYyAtID4gL2Rldi9mdWxsIDI+c3RkZXJyICYmIGVjaG8gb2s7IGNhdCBzdGRlcnI7IHJtIHN0ZGVyciIgXAorIyAgICAgICAgInRhYzogd3JpdGU6IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlXG4iICIiICJ6ZXJvXG4iCisKKyMgCisKK3JtIGZpbGUxIGZpbGUyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG95Ym94L3Rlc3RzL3RhaWwudGVzdCBiL3RveWJveC90ZXN0cy90YWlsLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFkYzg3MQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy90YWlsLnRlc3QKQEAgLTAsMCArMSw3NyBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCitCSUdURVNUPSJvbmVcbnR3b1xudGhyZWVcbmZvdXJcbmZpdmVcbnNpeFxuc2V2ZW5cbmVpZ2h0XG5uaW5lXG50ZW5cbmVsZXZlblxuIgorZWNobyAtbmUgIiRCSUdURVNUIiA+IGZpbGUxCit0ZXN0aW5nICJ0YWlsIiAidGFpbCAmJiBlY2hvIHllcyIgIm9uZXllc1xuIiAiIiAib25lIgordGVzdGluZyAiZmlsZSIgInRhaWwgZmlsZTEiIFwKKwkidHdvXG50aHJlZVxuZm91clxuZml2ZVxuc2l4XG5zZXZlblxuZWlnaHRcbm5pbmVcbnRlblxuZWxldmVuXG4iICIiICIiCit0ZXN0aW5nICItbiBpbiBib3VuZHMiICJ0YWlsIC1uIDMgZmlsZTEiICJuaW5lXG50ZW5cbmVsZXZlblxuIiAiIiAiIgordGVzdGluZyAiLW4gb3V0IG9mIGJvdW5kcyIgInRhaWwgLW4gOTk5IGZpbGUxIiAiJEJJR1RFU1QiICIiICIiCit0ZXN0aW5nICItbisgaW4gYm91bmRzIiAidGFpbCAtbiArMyBmaWxlMSIgXAorCSJ0aHJlZVxuZm91clxuZml2ZVxuc2l4XG5zZXZlblxuZWlnaHRcbm5pbmVcbnRlblxuZWxldmVuXG4iICIiICIiCit0ZXN0aW5nICItbisgb3V0b2YgYm91bmRzIiAidGFpbCAtbiArOTk5IGZpbGUxIiAiIiAiIiAiIgordGVzdGluZyAiLWMgaW4gYm91bmRzIiAidGFpbCAtYyAyNyBmaWxlMSIgXAorCSJldmVuXG5laWdodFxubmluZVxudGVuXG5lbGV2ZW5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1jIG91dCBvZiBib3VuZHMiICJ0YWlsIC1jIDk5OSBmaWxlMSIgIiRCSUdURVNUIiAiIiAiIgordGVzdGluZyAiLWMrIGluIGJvdW5kcyIgInRhaWwgLWMgKzI3IGZpbGUxIiBcCisJInhcbnNldmVuXG5laWdodFxubmluZVxudGVuXG5lbGV2ZW5cbiIgIiIgIiIKK3Rlc3RpbmcgIi1jKyBvdXQgb2YgYm9uZHMiICJ0YWlsIC1jICs5OTkgZmlsZTEiICIiICIiICIiCit0ZXN0aW5nICItTiIgInRhaWwgLTEgZmlsZTEiICJlbGV2ZW5cbiIgIiIgIiIKK3JtIGZpbGUxCisKK3Rlc3RpbmcgInN0ZGluIG5vIHRyYWlsaW5nIG5ld2xpbmUiICJ0YWlsIC1uIDEgLSAiICJjIiAiIiAiYVxuYlxuYyIKK3Rlc3RpbmcgImZpbGUgbm8gdHJhaWxpbmcgbmV3bGluZSIgInRhaWwgLW4gMSBpbnB1dCIgImMiICJhXG5iXG5jIiAiIgorCitvcHRpb25hbCBUQUlMX1NFRUsKK3Rlc3RpbmcgIm5vc2VlayAtbiBpbiBib3VuZHMiICJ0YWlsIC1uIDMiICJuaW5lXG50ZW5cbmVsZXZlblxuIiBcCisJIiIgIiRCSUdURVNUIgordGVzdGluZyAibm9zZWVrIC1uIG91dCBvZiBib3VuZHMiICJ0YWlsIC1uIDk5OSIgIiRCSUdURVNUIiAiIiAiJEJJR1RFU1QiCit0ZXN0aW5nICJub3NlZWsgLW4rIGluIGJvdW5kcyIgInRhaWwgLW4gKzMiIFwKKwkidGhyZWVcbmZvdXJcbmZpdmVcbnNpeFxuc2V2ZW5cbmVpZ2h0XG5uaW5lXG50ZW5cbmVsZXZlblxuIiAiIiBcCisJIiRCSUdURVNUIgordGVzdGluZyAibm9zZWVrIC1uKyBvdXRvZiBib3VuZHMiICJ0YWlsIC1uICs5OTkiICIiICIiICIkQklHVEVTVCIKK3Rlc3RpbmcgIm5vc2VlayAtYyBpbiBib3VuZHMiICJ0YWlsIC1jIDI3IiBcCisJImV2ZW5cbmVpZ2h0XG5uaW5lXG50ZW5cbmVsZXZlblxuIiAiIiAiJEJJR1RFU1QiCit0ZXN0aW5nICJub3NlZWsgLWMgb3V0IG9mIGJvdW5kcyIgInRhaWwgLWMgOTk5IiAiJEJJR1RFU1QiICIiICIkQklHVEVTVCIKK3Rlc3RpbmcgIm5vc2VlayAtYysgaW4gYm91bmRzIiAidGFpbCAtYyArMjciIFwKKwkieFxuc2V2ZW5cbmVpZ2h0XG5uaW5lXG50ZW5cbmVsZXZlblxuIiAiIiAiJEJJR1RFU1QiCit0ZXN0aW5nICJub3NlZWsgLWMrIG91dCBvZiBib25kcyIgInRhaWwgLWMgKzk5OSIgIiIgIiIgIiRCSUdURVNUIgorCittYWtlYmlnZmlsZSgpCit7CisKKyAgZm9yIGogaW4gJChzZXEgMSAxMDApCisgIGRvCisgICAgcHJpbnRmICIlcyAiICRqCisgICAgZm9yIGkgaW4gJChzZXEgMSAxMDApCisgICAgZG8KKyAgICAgIHByaW50ZiAlcyAxMjM0NTY3ODlhYmNlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoKKyAgICBkb25lCisgICAgZWNobworICBkb25lCit9CittYWtlYmlnZmlsZSA+IGJpZ2ZpbGUKKwordGVzdGluZyAiLWMgMTIzNDUgLW4gMyBiaWdmaWxlIiAidGFpbCAtYyAxMjM0NSAtbiAzIGJpZ2ZpbGUgfCBtZDVzdW0iIFwKKyAgIjM0N2JiZGNiYWQ4YTMxM2Y0ZGM3YmQ1NThjNWJmY2I4ICAtXG4iICIiICIiCit0ZXN0aW5nICItbiAzIC1jIDEyMzQ1IGJpZ2ZpbGUiICJ0YWlsIC1uIDMgLWMgMTIzNDUgYmlnZmlsZSB8IG1kNXN1bSIgXAorICAiMTY5ODgyNWE3NTAyODgyODRlYzNiYTdkOGE1OWYzMDIgIC1cbiIgIiIgIiIKK3JtIGJpZ2ZpbGUKKworZWNobyAxMTEgPiBvbmUKK3Rlc3RpbmcgIi1mIG9uZSIgXAorICAndGFpbCAtZiBvbmUgJiBzbGVlcCAuMjUgOyBlY2hvIHR3byA+PiBvbmU7IHNsZWVwIC4yNTsgZWNobyB0aHJlZSA+PiBvbmU7IHNsZWVwIC4yNTsga2lsbCAkISA+L2Rldi9udWxsJyBcCisgICIxMTFcbnR3b1xudGhyZWVcbiIgIiIgIiIKK3JtIG9uZQorCitlY2hvIHVubyA+IG9uZQorZWNobyBkb3MgPiB0d28KK2VjaG8gdHJlcyA+IHRocmVlCit0ZXN0aW5nICItZiBvbmUgdHdvIHRocmVlIiBcCisgICd0YWlsIC1mIG9uZSB0d28gdGhyZWUgJiBzbGVlcCAuMjUgOyBlY2hvIG1vcmUgPj4gdGhyZWUgOyBlY2hvIGFsc28gPj4gb25lOyBzbGVlcCAuMjU7IGtpbGwgJCEgPi9kZXYvbnVsbCcgXAorICAiPT0+IG9uZSA8PT1cbnVub1xuXG49PT4gdHdvIDw9PVxuZG9zXG5cbj09PiB0aHJlZSA8PT1cbnRyZXNcbm1vcmVcblxuPT0+IG9uZSA8PT1cbmFsc29cbiIgIiIgIiIKK3JtIG9uZSB0d28gdGhyZWUKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90YXIudGVzdCBiL3RveWJveC90ZXN0cy90YXIudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MGJhNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3Rhci50ZXN0CkBAIC0wLDAgKzEsOTAgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTQgRGl2eWEgS290aGFyaSA8ZGl2eWEucy5rb3RoYXJpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMTQgTmFoYSBNYWdndSA8bWFnZ3UubmVoYUBnbWFpbC5jb20+CisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworI0NyZWF0aW5nICBkaXIKK21rZGlyIGRpci9kaXIxIC1wCitlY2hvICJUaGlzIGlzIHRlc3RkYXRhIiA+IGRpci9kaXIxL2ZpbGUKK3Rlc3RpbmcgInRneiAtIGNvbXBlc3Npb24sIGV4dHJhY3Rpb24gYW5kIGRhdGEgdmFsaWRhdGlvbiIgInRhciAtY3pmIGRpci50Z3ogZGlyLyAmJiBbIC1lIGRpci50Z3ogXSAmJiBlY2hvICd5ZXMnOyBybSAtcmYgZGlyOyB0YXIgLXhmIGRpci50Z3ogJiYgWyAtZiBkaXIvZGlyMS9maWxlIF0gJiYgY2F0IGRpci9kaXIxL2ZpbGU7IHJtIC1yZiBkaXIudGd6IiAieWVzXG5UaGlzIGlzIHRlc3RkYXRhXG4iICIiICIiCisKKyNDcmVhdGluZyAgZGlyCitta2RpciBkaXIvZGlyMSAtcAorZWNobyAiVGhpcyBpcyB0ZXN0ZGF0YSIgPiBkaXIvZGlyMS9maWxlCit0ZXN0aW5nICJ0YXIuZ3ogLSBjb21wZXNzaW9uLCBleHRyYWN0aW9uIGFuZCBkYXRhIHZhbGlkYXRpb24iICJ0YXIgLWN6ZiBkaXIudGFyLmd6IGRpci8gJiYgWyAtZSBkaXIudGFyLmd6IF0gJiYgZWNobyAneWVzJzsgcm0gLXJmIGRpcjsgdGFyIC14ZiBkaXIudGFyLmd6ICYmIFsgLWYgZGlyL2RpcjEvZmlsZSBdICYmIGNhdCBkaXIvZGlyMS9maWxlOyBybSAtcmYgZGlyLnRhci5neiIgInllc1xuVGhpcyBpcyB0ZXN0ZGF0YVxuIiAiIiAiIgorCisjQ3JlYXRpbmcgIGRpcgorbWtkaXIgZGlyL2RpcjEgLXAKK2VjaG8gIlRoaXMgaXMgdGVzdGRhdGEiID4gZGlyL2RpcjEvZmlsZQordGVzdGluZyAidmVyYm9zZSBjb21wcmVzc2lvbiIgInRhciAtY3Z6ZiBkaXIudGd6IGRpci87IHJtIC1yZiBkaXIudGd6IiAiZGlyL1xuZGlyL2RpcjEvXG5kaXIvZGlyMS9maWxlXG4iICIiICIiCitybSAtcmYgZGlyLworCisjY3JlYXRpbmcgdGVzdCBmaWxlCitkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdEZpbGUgaWJzPTQwOTYgb2JzPTQwOTYgY291bnQ9MTAwMCAyPi9kZXYvbnVsbAordGVzdGluZyAiLSBjb21wZXNzaW9uIGFuZCBleHRyYWN0aW9uIG9mIGEgZmlsZSIgInRhciAtY3pmIHRlc3RGaWxlLnRneiB0ZXN0RmlsZSAmJiBbIC1lIHRlc3RGaWxlLnRneiBdICYmIGVjaG8gJ3llcyc7IHJtIC1yZiB0ZXN0RmlsZTsgdGFyIC14ZiB0ZXN0RmlsZS50Z3ogJiYgWyAtZiB0ZXN0RmlsZSBdICYmIGVjaG8gJ3llcyc7IHJtIC1yZiB0ZXN0RmlsZS50Z3oiICJ5ZXNcbnllc1xuIiAiIiAiIgorCisjY3JlYXRpbmcgZW1wdHkgdGVzdCBmaWxlCit0b3VjaCB0ZXN0RmlsZQordGVzdGluZyAiLSBjb21wZXNzaW9uIGFuZCBleHRyYWN0aW9uIG9mIGEgZW1wdHkgZmlsZSIgInRhciAtY3pmIHRlc3RGaWxlLnRneiB0ZXN0RmlsZSAmJiBbIC1lIHRlc3RGaWxlLnRneiBdICYmIGVjaG8gJ3llcyc7IHJtIC1yZiB0ZXN0RmlsZTsgdGFyIC14ZiB0ZXN0RmlsZS50Z3ogJiYgWyAtZiB0ZXN0RmlsZSBdICYmIGVjaG8gJ3llcyc7IHJtIC1yZiB0ZXN0RmlsZS50Z3oiICJ5ZXNcbnllc1xuIiAiIiAiIgorCisjQ3JlYXRpbmcgIGRpcgorbWtkaXIgZGlyL2RpcjEgLXAKK3RvdWNoIGRpci9kaXIxL2ZpbGUxIGRpci9kaXIxL2ZpbGUyIGRpci9kaXIxL2ZpbGUzIGRpci9kaXIxL2ZpbGU0Cit0ZXN0aW5nICItdCBvcHRpb24iICJ0YXIgLWN6ZiBkaXIudGFyLmd6IGRpci87IHJtIC1yZiBkaXI7IHRhciAtdGYgZGlyLnRhci5neiB8IHNvcnQ7IHJtIC1yZiBkaXIudGFyLmd6IiAiZGlyL1xuZGlyL2RpcjEvXG5kaXIvZGlyMS9maWxlMVxuZGlyL2RpcjEvZmlsZTJcbmRpci9kaXIxL2ZpbGUzXG5kaXIvZGlyMS9maWxlNFxuIiAiIiAiIgorcm0gLXJmIGRpci8KKworI0NyZWF0aW5nIG5lc3RlZCBkaXJlY3RvcnkgCitta2RpciAtcCBkaXIvZGlyMSBkaXIvZGlyMiBkaXIvZGlyMyBkaXIvZGlyNAorZWNobyAiVGhpcyBpcyB0ZXN0ZGF0YSIgPiBkaXIvZGlyMS9maWxlOyBlY2hvICJEb250IGV4Y2x1ZGUgbWUiID4gIGRpci9kaXIzL2ZpbGUxIDsgCitlY2hvICJFeGNsdWRlIG1lIiA+ICBkaXIvZGlyMy9maWxlMiA7IGVjaG8gIllPIiA+IGRpci9kaXI0L2ZpbGUxIDsgZWNobyAiSGVsbG8iID5kaXIvZGlyNC9maWxlMjsgZWNobyAiRG9udCIgPiBkaXIvZGlyMi9maWxlMQorZWNobyAtbmUgImRpci9kaXI0XG5kaXIvZGlyMy9maWxlMlxuIiA+IGV4Y2x1ZGVfZmlsZQordGVzdGluZyAiY3JlYXRlIHdpdGggZmlsZXMgZXhjbHVkZWQgOiAtWCIgInRhciAtY3pmIGRpci50Z3ogZGlyLyAtWCBleGNsdWRlX2ZpbGUgOyBybSAtcmYgZGlyIDsgdGFyIC10ZiBkaXIudGd6IHwgc29ydDsgcm0gLXJmIGRpci50Z3ogIiAiZGlyL1xuZGlyL2RpcjEvXG5kaXIvZGlyMS9maWxlXG5kaXIvZGlyMi9cbmRpci9kaXIyL2ZpbGUxXG5kaXIvZGlyMy9cbmRpci9kaXIzL2ZpbGUxXG4iICIiICIiCitybSAtcmYgZXhjbHVkZV9maWxlCisKKyNDcmVhdGluZyBuZXN0ZWQgZGlyZWN0b3J5Citta2RpciBkaXIvZGlyMSAtcCA7ICBta2RpciBkaXIvZGlyMiA7ICBta2RpciBkaXIvZGlyMyA7IG1rZGlyIGRpci9kaXI0CitlY2hvICJUaGlzIGlzIHRlc3RkYXRhIiA+IGRpci9kaXIxL2ZpbGUKK2VjaG8gIkRvbnQgZXhjbHVkZSBtZSIgPiAgZGlyL2RpcjMvZmlsZTEgOyBlY2hvICJFeGNsdWRlIG1lIiA+ICBkaXIvZGlyMy9maWxlMiA7IGVjaG8gIllPIiA+IGRpci9kaXI0L2ZpbGUxIDsgZWNobyAiSGVsbG8iID5kaXIvZGlyNC9maWxlMjsgZWNobyAiRG9udCIgPiBkaXIvZGlyMi9maWxlMQordGVzdGluZyAid2l0aCBwYXR0ZXJuIC0tZXhjbHVkZSIgInRhciAtLWV4Y2x1ZGU9ZGlyL2RpcjMvKiAtY3pmIGRpci50Z3ogZGlyLyA7IHJtIC1yZiBkaXIgOyB0YXIgLXRmIGRpci50Z3ogfCBzb3J0OyBybSAtcmYgZGlyLnRneiAiICJkaXIvXG5kaXIvZGlyMS9cbmRpci9kaXIxL2ZpbGVcbmRpci9kaXIyL1xuZGlyL2RpcjIvZmlsZTFcbmRpci9kaXIzL1xuZGlyL2RpcjQvXG5kaXIvZGlyNC9maWxlMVxuZGlyL2RpcjQvZmlsZTJcbiIgIiIgIiIKKworI0NyZWF0aW5nIGRpcmVjdG9yeSB0byBiZSBjb21wcmVzc2VkCitta2RpciBkaXIvZGlyMSAtcAorZWNobyAiVGhpcyBpcyB0ZXN0ZGF0YSIgPiBkaXIvZGlyMS9maWxlCitta2RpciB0ZW1wCit0ZXN0aW5nICJleHRyYWN0IHdpdGggLUMgRGlyIiAidGFyIC1jemYgZGlyLnRneiBkaXIvIDtybSAtcmYgZGlyIDt0YXIgLXhmIGRpci50Z3ogLUMgdGVtcC8gOyBbIC1lIHRlbXAvZGlyIF0gJiYgZWNobyAneWVzJyA7IHJtIC1yZiBkaXIgZGlyLnRneiIgInllc1xuIiAiIiAiIgorcm0gLXJmIHRlbXAKKworI0NyZWF0aW5nIG5lc3RlZCBkaXJlY3RvcnkgCitta2RpciBkaXIvZGlyMSAtcCA7ICBta2RpciBkaXIvZGlyMiA7ICBta2RpciBkaXIvZGlyMyA7IG1rZGlyIGRpci9kaXI0IDsgbWtkaXIgdGVtcF9kaXIKK2VjaG8gImRpcjEvZmlsZSIgPiBkaXIvZGlyMS9maWxlIDsgZWNobyAidGVtcF9kaXIvZmlsZSIgPiB0ZW1wX2Rpci9maWxlIAorZWNobyAiZGlyMy9maWxlMSIgPiAgZGlyL2RpcjMvZmlsZTEgOyBlY2hvICJkaXIzL2ZpbGUyIiA+ICBkaXIvZGlyMy9maWxlMiA7IGVjaG8gIllPIiA+IGRpci9kaXI0L2ZpbGUxIDsgZWNobyAiSGVsbG8iID5kaXIvZGlyNC9maWxlMjsgZWNobyAiZGlyMi9maWxlMSIgPiBkaXIvZGlyMi9maWxlMQorZWNobyAgInRlbXBfZGlyL2ZpbGUiID4gZXhjbHVkZV9maWxlCit0ZXN0aW5nICJjcmVhdGUgd2l0aCBleHRyYSBmaWxlcy9kaXJlY3RvcnkgaW5jbHVkZWQgOiAtVCIgInRhciAtY3pmIGRpci50Z3ogZGlyLyAtVCBleGNsdWRlX2ZpbGUgOyBybSAtcmYgZGlyIDsgdGFyIC10ZiBkaXIudGd6IHwgc29ydDsgcm0gLXJmIGRpci50Z3ogIiAiZGlyL1xuZGlyL2RpcjEvXG5kaXIvZGlyMS9maWxlXG5kaXIvZGlyMi9cbmRpci9kaXIyL2ZpbGUxXG5kaXIvZGlyMy9cbmRpci9kaXIzL2ZpbGUxXG5kaXIvZGlyMy9maWxlMlxuZGlyL2RpcjQvXG5kaXIvZGlyNC9maWxlMVxuZGlyL2RpcjQvZmlsZTJcbnRlbXBfZGlyL2ZpbGVcbiIgIiIgIiIKK3JtIC1yZiBleGNsdWRlX2ZpbGUKK3JtIC1yZiB0ZW1wX2RpcgorCisjQ3JlYXRpbmcgZGlyCitta2RpciBkaXIvZGlyMSAtcCAKK2VjaG8gIkluc2lkZSBkaXIvZGlyMSIgPiBkaXIvZGlyMS9maWxlIDsgZWNobyAiSGVsbG8gSW5zaWRlIGRpciIgPiBkaXIvZmlsZQordGVzdGluZyAiZXh0cmFjdCB0byBTVERPVVQgOiAtTyIgIiB0YXIgLWN6ZiBkaXIudGd6IGRpci8gOyBybSAtcmYgZGlyIDsgdGFyIC14ZiBkaXIudGd6IC1PIDsgWyAtZSAnSW5zaWRlIGRpci9kaXIxL1xuSGVsbG8gSW5zaWRlIGRpclxuJyBdICYmIGVjaG8gJ3llcyc7IHJtIC1yZiBkaXIudGd6ICIgICIiICIiICIiCisKKyNDcmVhdGluZyBzaG9ydCBmaWxlbmFtZQorZj0iZmlsZW5hbWVfd2l0aF8xMDBfY2hhcnNfeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIKK2VjaG8gIlRoaXMgaXMgdGVzdGRhdGEiID4gJGYKK3Rlc3RpbmcgInNob3J0bmFtZSBmaWxlbmFtZSIgInRhciAtY2YgdGVzdEZpbGUudGFyICRmICYmIFsgLWUgdGVzdEZpbGUudGFyIF0gJiYgZWNobyAneWVzJzsgcm0gLWYgJGY7IHRhciAteGYgdGVzdEZpbGUudGFyICYmIFsgLWYgJGYgXSAmJiBjYXQgJGYgJiYgc3RyaW5ncyB0ZXN0RmlsZS50YXIgfCBncmVwIC1vIExvbmdMaW5rOyBybSAtZiB0ZXN0RmlsZS50YXI7IHJtIC1mICRmIiAieWVzXG5UaGlzIGlzIHRlc3RkYXRhXG4iICIiICIiCisKKyNDcmVhdGluZyBsb25nIGZpbGVuYW1lCitmPSJmaWxlbmFtZV93aXRoXzEwMV9jaGFyc194eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIKK2VjaG8gIlRoaXMgaXMgdGVzdGRhdGEiID4gJGYKK3Rlc3RpbmcgImxvbmduYW1lIGZpbGVuYW1lIiAidGFyIC1jZiB0ZXN0RmlsZS50YXIgJGYgJiYgWyAtZSB0ZXN0RmlsZS50YXIgXSAmJiBlY2hvICd5ZXMnOyBybSAtZiAkZjsgdGFyIC14ZiB0ZXN0RmlsZS50YXIgJiYgWyAtZiAkZiBdICYmIGNhdCAkZiAmJiBzdHJpbmdzIHRlc3RGaWxlLnRhciB8IGdyZXAgLW8gTG9uZ0xpbms7IHJtIC1mIHRlc3RGaWxlLnRhcjsgcm0gLWYgJGYiICJ5ZXNcblRoaXMgaXMgdGVzdGRhdGFcbkxvbmdMaW5rXG4iICIiICIiCisKKyNDcmVhdGluZyBsb25nIHBhdGhuYW1lCitkPSJkaXJuYW1lX3dpdGhfNTBfY2hhcnNfeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIKK2Y9ImZpbGVuYW1lX3dpdGhfNTBfY2hhcnNfeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IgorbWtkaXIgJGQKK2VjaG8gIlRoaXMgaXMgdGVzdGRhdGEiID4gJGQvJGYKK3Rlc3RpbmcgImxvbmduYW1lIHBhdGhuYW1lIiAidGFyIC1jZiB0ZXN0RmlsZS50YXIgJGQvJGYgJiYgWyAtZSB0ZXN0RmlsZS50YXIgXSAmJiBlY2hvICd5ZXMnOyBybSAtcmYgJGQ7IHRhciAteGYgdGVzdEZpbGUudGFyICYmIFsgLWYgJGQvJGYgXSAmJiBjYXQgJGQvJGYgJiYgc3RyaW5ncyB0ZXN0RmlsZS50YXIgfCBncmVwIC1vIExvbmdMaW5rOyBybSAtZiB0ZXN0RmlsZS50YXI7IHJtIC1yZiAkZCIgInllc1xuVGhpcyBpcyB0ZXN0ZGF0YVxuTG9uZ0xpbmtcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90ZXN0LnRlc3QgYi90b3lib3gvdGVzdHMvdGVzdC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwYTkwODYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvdGVzdC50ZXN0CkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBUT0RPOiBTaG91bGQgYWxzbyBoYXZlIGRldmljZSBhbmQgc29ja2V0IGZpbGVzCisKK21rZGlyIGQKK3RvdWNoIGYKK2xuIC1zIC9kZXYvbnVsbCBMCitlY2hvIG5vbmVtcHR5ID4gcworbWtmaWZvIHAKKwordHlwZV90ZXN0KCkKK3sKKyAgcmVzdWx0PSIiCisgIGZvciBpIGluIGQgZiBMIHMgcCBuCisgIGRvCisgICAgaWYgdGVzdCAkKiAkaQorICAgIHRoZW4KKyAgICAgIHJlc3VsdD0kcmVzdWx0JGkKKyAgICBmaQorICBkb25lCisgIHByaW50ZiAiJXMiICRyZXN1bHQKK30KKwordGVzdGluZyAiLWIiICJ0eXBlX3Rlc3QgLWIiICIiICIiICIiCit0ZXN0aW5nICItYyIgInR5cGVfdGVzdCAtYyIgIkwiICIiICIiCit0ZXN0aW5nICItZCIgInR5cGVfdGVzdCAtZCIgImQiICIiICIiCit0ZXN0aW5nICItZiIgInR5cGVfdGVzdCAtZiIgImZzIiAiIiAiIgordGVzdGluZyAiLWgiICJ0eXBlX3Rlc3QgLWgiICJMIiAiIiAiIgordGVzdGluZyAiLUwiICJ0eXBlX3Rlc3QgLUwiICJMIiAiIiAiIgordGVzdGluZyAiLXMiICJ0eXBlX3Rlc3QgLXMiICJkcyIgIiIgIiIKK3Rlc3RpbmcgIi1TIiAidHlwZV90ZXN0IC1TIiAiIiAiIiAiIgordGVzdGluZyAiLXAiICJ0eXBlX3Rlc3QgLXAiICJwIiAiIiAiIgordGVzdGluZyAiLWUiICJ0eXBlX3Rlc3QgLWUiICJkZkxzcCIgIiIgIiIKK3Rlc3RpbmcgIiEgLWUiICJ0eXBlX3Rlc3QgISAtZSIgIm4iICIiICIiCisKK3JtIGYgTCBzIHAKK3JtZGlyIGQKKworIyBUT0RPOiBUZXN0IHJ3eCBndSB0CisKK3Rlc3RpbmcgInRlc3QiICJ0ZXN0ICIiIHx8IHRlc3QgYSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiLW4iICJ0ZXN0IC1uICIiIHx8IHRlc3QgLW4gYSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiLXoiICJ0ZXN0IC1uIGEgfHwgdGVzdCAtbiAiIiAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiYSA9IGIiICJ0ZXN0IGEgPSBiIHx8IHRlc3QgIiIgPSAiIiAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiYSAhPSBiIiAidGVzdCAiIiAhPSAiIiB8fCB0ZXN0IGEgPSBiICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKK2FyaXRoX3Rlc3QoKQoreworICB0ZXN0IC0xICQxIDEgJiYgZWNobyBsCisgIHRlc3QgMCAkMSAwICYmIGVjaG8gZQorICB0ZXN0IC0zICQxIC01ICYmIGVjaG8gZworfQorCit0ZXN0aW5nICItZXEiICJhcml0aF90ZXN0IC1lcSIgImVcbiIgIiIgIiIKK3Rlc3RpbmcgIi1uZSIgImFyaXRoX3Rlc3QgLW5lIiAibFxuZ1xuIiAiIiAiIgordGVzdGluZyAiLWd0IiAiYXJpdGhfdGVzdCAtZ3QiICJnXG4iICIiICIiCit0ZXN0aW5nICItZ2UiICJhcml0aF90ZXN0IC1nZSIgImVcbmdcbiIgIiIgIiIKK3Rlc3RpbmcgIi1sdCIgImFyaXRoX3Rlc3QgLWx0IiAibFxuIiAiIiAiIgordGVzdGluZyAiLWxlIiAiYXJpdGhfdGVzdCAtbGUiICJsXG5lXG4iICIiICIiCisKKyMgdGVzdCAhID0gLW8gYQorIyB0ZXN0ICEgXCggPSAtbyBhIFwpCisjIHRlc3QgXCggISA9IFwpIC1vIGEKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90ZXN0X2h1bWFuX3JlYWRhYmxlLnRlc3QgYi90b3lib3gvdGVzdHMvdGVzdF9odW1hbl9yZWFkYWJsZS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMWJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvdGVzdF9odW1hbl9yZWFkYWJsZS50ZXN0CkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAibCAxMDI0IiAidGVzdF9odW1hbl9yZWFkYWJsZSAxMjM0NTY3ODkiICIxMThNXG4iICIiICIiCit0ZXN0aW5nICJsIDEwMDAiICJ0ZXN0X2h1bWFuX3JlYWRhYmxlIC1pIDEyMzQ1Njc4OSIgIjEyM01cbiIgIiIgIiIKK3Rlc3RpbmcgInMgMTAyNCIgInRlc3RfaHVtYW5fcmVhZGFibGUgNTY3NSIgIjUuNUtcbiIgIiIgIiIKK3Rlc3RpbmcgInMgMTAwMCIgInRlc3RfaHVtYW5fcmVhZGFibGUgLWkgNTY3NSIgIjUuNmtcbiIgIiIgIiIKKworIyBBbiBleGFtcGxlIGlucHV0IHdoZXJlIHdlIGdpdmUgYSBiZXR0ZXIgcmVzdWx0IHRoYW4gY29yZXV0aWxzLgorIyAyNjczNTAvMTAyND0yNjEuMDguIFdlIHNheSAyNjFLIGFuZCBjb3JldXRpbHMgc2F5cyAyNjJLLgordGVzdGluZyAidGVzdF9odW1hbl9yZWFkYWJsZSIgInRlc3RfaHVtYW5fcmVhZGFibGUgMjY3MzUwIiAiMjYxS1xuIiAiIiAiIgorCit0ZXN0aW5nICItYiIgInRlc3RfaHVtYW5fcmVhZGFibGUgLWIgMTIzIiAiMTIzQlxuIiAiIiAiIgordGVzdGluZyAiLWIiICJ0ZXN0X2h1bWFuX3JlYWRhYmxlIC1iIDEyMzQ1Njc4OSIgIjExOE1cbiIgIiIgIiIKK3Rlc3RpbmcgIi1zIiAidGVzdF9odW1hbl9yZWFkYWJsZSAtcyAxMjM0NTY3ODkiICIxMTggTVxuIiAiIiAiIgordGVzdGluZyAiLWJzIiAidGVzdF9odW1hbl9yZWFkYWJsZSAtYnMgMTIzNDU2Nzg5IiAiMTE4IE1cbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90b3AudGVzdCBiL3RveWJveC90ZXN0cy90b3AudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMWVlYTMzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3RvcC50ZXN0CkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL2Jhc2gKKworWyAtZiB0ZXN0aW5nLnNoIF0gJiYgLiB0ZXN0aW5nLnNoCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJiYXRjaCB0ZXJtaW5hdGlvbiIgInRvcCAtYiAtbjEgfCB0YWlsIC1jIDEiICJcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90b3VjaC50ZXN0IGIvdG95Ym94L3Rlc3RzL3RvdWNoLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDE5M2Q3YwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy90b3VjaC50ZXN0CkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAidG91Y2giICJ0b3VjaCB3YWxydXMgJiYgWyAtZSB3YWxydXMgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiMSAyIDMiICJ0b3VjaCBvbmUgdHdvIHRocmVlICYmIHJtIG9uZSB0d28gdGhyZWUgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgXAorICAiIiAiIgordGVzdGluZyAiLWMiICJ0b3VjaCAtYyB3YWxydXMgJiYgWyAtZSB3YWxydXMgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiLWMgbWlzc2luZyIgInRvdWNoIC1jIHdhcnJ1cyAmJiBbICEgLWUgd2FycnVzIF0gJiYgZWNobyB5ZXMiIFwKKyAgInllc1xuIiAiIiAiIgorCit0ZXN0aW5nICItdCIgXAorICAidG91Y2ggLXQgMjAxMjAxMjMxMjM0IHdhbHJ1cyAmJiBkYXRlIC1yIHdhbHJ1cyArJVklbSVkLSVIJU0lUy4lTiIgXAorICAiMjAxMjAxMjMtMTIzNDAwLjAwMDAwMDAwMFxuIiAiIiAiIgorCit0ZXN0aW5nICItdCBzZWNvbmRzIiBcCisgICJ0b3VjaCAtdCAyMDEyMDEyMzEyMzQuNTYgd2FscnVzICYmIGRhdGUgLXIgd2FscnVzICslWSVtJWQtJUglTSVTLiVOIiBcCisgICIyMDEyMDEyMy0xMjM0NTYuMDAwMDAwMDAwXG4iICIiICIiCisKK3Rlc3RpbmcgIi10IG5hbm9zZWNvbmRzIiBcCisgICJ0b3VjaCAtdCAyMDEyMDEyMzEyMzQuNTYxMjM0NTY3ODkgd2FscnVzICYmIGRhdGUgLXIgd2FscnVzICslWSVtJWQtJUglTSVTLiVOIiBcCisgICIyMDEyMDEyMy0xMjM0NTYuMTIzNDU2Nzg5XG4iICIiICIiCisKK3Rlc3RpbmcgIi1kIiBcCisgICJ0b3VjaCAtZCAyMDA5LTAyLTEzVDIzOjMxOjMwWiB3YWxydXMgJiYgZGF0ZSAtciB3YWxydXMgKyVzIiBcCisgICIxMjM0NTY3ODkwXG4iICIiICIiCisKK3Rlc3RpbmcgIi1kIG5hbm9zZWNvbmRzIiBcCisgICJ0b3VjaCAtZCAyMDA5LTAyLTEzVDIzOjMxOjMwLjEyMzQ1Njc4OVogd2FscnVzICYmIGRhdGUgLXIgd2FscnVzICslcy4lTiIgXAorICAiMTIzNDU2Nzg5MC4xMjM0NTY3ODlcbiIgIiIgIiIKKwordGVzdGluZyAiLXIiIFwKKyAgInRvdWNoIC1yIHdhbHJ1cyB3YWxydXMyICYmIGRhdGUgLXIgd2FscnVzMiArJXMuJU4iIFwKKyAgICIxMjM0NTY3ODkwLjEyMzQ1Njc4OVxuIiAiIiAiIgorCisjdGVzdGluZyAiLWEiCisjdGVzdGluZyAiLW0iCisjdGVzdGluZyAiLWFtIgorI3Rlc3RpbmcgIi10Igorcm0gd2FscnVzIHdhbHJ1czIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy90cnVuY2F0ZS50ZXN0IGIvdG95Ym94L3Rlc3RzL3RydW5jYXRlLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQxOWFhMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy90cnVuY2F0ZS50ZXN0CkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworU0laRT0nJiYgc3RhdCAtYyAlcyBmcmVlcCcKK3Rlc3RpbmcgIjAiICJ0cnVuY2F0ZSAtcyAwIGZyZWVwICRTSVpFIiAiMFxuIiAiIiAiIgordGVzdGluZyAiMTIzNDUiICJ0cnVuY2F0ZSAtcyAxMjM0NSBmcmVlcCAkU0laRSIgIjEyMzQ1XG4iICIiICIiCit0ZXN0aW5nICIxbSIgInRydW5jYXRlIC1zIDFtIGZyZWVwICRTSVpFIiAiMTA0ODU3NlxuIiAiIiAiIgordGVzdGluZyAiaXMgc3BhcnNlIiAidHJ1bmNhdGUgLXMgMWcgZnJlZXAgJiYgc3RhdCAtYyAlYiBmcmVlcCIgXAorCSIwXG4iICIiICIiCit0ZXN0aW5nICIrIiAidHJ1bmNhdGUgLXMgMWsgZnJlZXAgJiYgdHJ1bmNhdGUgLXMgKzFrIGZyZWVwICRTSVpFIiBcCisJIjIwNDhcbiIgIiIgIiIKK3Rlc3RpbmcgIi0iICJ0cnVuY2F0ZSAtcyA0ayBmcmVlcCAmJiB0cnVuY2F0ZSAtcyAtMWsgZnJlZXAgJFNJWkUiIFwKKwkiMzA3MlxuIiAiIiAiIgordGVzdGluZyAiPCBoaXQiIFwKKwkidHJ1bmNhdGUgLXMgNWsgZnJlZXAgJiYgdHJ1bmNhdGUgLXMgXDw0ayBmcmVlcCAkU0laRSIgIjQwOTZcbiIgIiIgIiIKK3Rlc3RpbmcgIjwgbWlzcyIgXAorCSJ0cnVuY2F0ZSAtcyA0ayBmcmVlcCAmJiB0cnVuY2F0ZSAtcyBcPDZrIGZyZWVwICRTSVpFIiAiNDA5NlxuIiAiIiAiIgordGVzdGluZyAiPiBoaXQiIFwKKwkidHJ1bmNhdGUgLXMgM2sgZnJlZXAgJiYgdHJ1bmNhdGUgLXMgXD40ayBmcmVlcCAkU0laRSIgIjQwOTZcbiIgIiIgIiIKK3Rlc3RpbmcgIj4gbWlzcyIgXAorCSJ0cnVuY2F0ZSAtcyA0ayBmcmVlcCAmJiB0cnVuY2F0ZSAtcyBcPjJrIGZyZWVwICRTSVpFIiAiNDA5NlxuIiAiIiAiIgordGVzdGluZyAiLyIgInRydW5jYXRlIC1zIDdrIGZyZWVwICYmIHRydW5jYXRlIC1zIC8zayBmcmVlcCAkU0laRSIgXAorCSI2MTQ0XG4iICIiICIiCit0ZXN0aW5nICIlIiAidHJ1bmNhdGUgLXMgN2sgZnJlZXAgJiYgdHJ1bmNhdGUgLXMgJTNrIGZyZWVwICRTSVpFIiBcCisJIjkyMTZcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy91c2VyYWRkLnRlc3QgYi90b3lib3gvdGVzdHMvdXNlcmFkZC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwYjY4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvdXNlcmFkZC50ZXN0CkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDEzIERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDEzIFJvYmluIE1pdHRhbCA8cm9iaW5taXR0YWwuaXRAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworaWYgWyAiJChpZCAtdSkiIC1uZSAwIF0KK3RoZW4KKyAgZWNobyAiJFNIT1dTS0lQOiB1c2VyYWRkIChub3Qgcm9vdCkiCisgIGNvbnRpbnVlIDI+L2Rldi9udWxsCisgIGV4aXQKK2ZpCisKKyMgUmVkaXJlY3RpbmcgYWxsIG91dHB1dCB0byAvZGV2L251bGwgZm9yIGdyZXAsIGFkZHVzZXIgYW5kIGRlbHVzZXIKK2FyZz0iJj4vZGV2L251bGwiCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIERlZmF1bHQgcGFzc3dvcmQgZm9yIGFkZGluZyB1c2VyIGlzOiAncGFzc3dvcmQnCitwYXNzPWBlY2hvIC1uZSAncGFzc3dvcmRcbnBhc3N3b3JkXG4nYAorCit1c2VyPSJ0b3lUZXN0VXNlciIKK3Rlc3RpbmcgIih0ZXh0KSIgInVzZXJhZGQgJHVzZXIgJGFyZyB8fCAKKyAgIGdyZXAgJ14kdXNlcjonIC9ldGMvcGFzc3dkICRhcmcgJiYgWyAtZCAvaG9tZS8kdXNlciBdICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIkcGFzcyIKK3VzZXJkZWwgLXIgJHVzZXIgJGFyZworCit1c2VyPSJ0b3kxVGVzdDJVc2VyMyIKK3Rlc3RpbmcgIihhbHBoYW51bWVyaWMpIiAidXNlcmFkZCAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6JyAvZXRjL3Bhc3N3ZCAkYXJnICYmIFsgLWQgL2hvbWUvJHVzZXIgXSAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiJHBhc3MiCit1c2VyZGVsIC1yICR1c2VyICRhcmcKKwordXNlcj0iOTg3NjU0MzIxIgordGVzdGluZyAiKG51bWVyaWMpIiAidXNlcmFkZCAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6JyAvZXRjL3Bhc3N3ZCAkYXJnICYmIFsgLWQgL2hvbWUvJHVzZXIgXSAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiJHBhc3MiCit1c2VyZGVsIC1yICR1c2VyICRhcmcKKwordXNlcj0idG95LjFUZXN0LTJVc2VyXzMiCit0ZXN0aW5nICIod2l0aCAuLy0vXykiICJ1c2VyYWRkICR1c2VyICRhcmcgfHwKKyAgIGdyZXAgJ14kdXNlcjonIC9ldGMvcGFzc3dkICRhcmcgJiYgWyAtZCAvaG9tZS8kdXNlciBdICYmIAorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiJHBhc3MiCit1c2VyZGVsIC1yICR1c2VyICRhcmcKKworIyA3MCBjaGFyYWN0ZXJzIGxvbmcgc3RyaW5nOyBoZXJlYWZ0ZXIsIHdlIHdpbGwgdXNlIGl0IGFzIHBlciBvdXIgbmVlZC4KK3VzZXI9ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkiCit0ZXN0aW5nICIobG9uZyBzdHJpbmcpIiAidXNlcmFkZCAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6JyAvZXRjL3Bhc3N3ZCAkYXJnICYmIFsgLWQgL2hvbWUvJHVzZXIgXSAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiJHBhc3MiCit1c2VyZGVsIC1yICR1c2VyICRhcmcKKwordXNlcj0idG95VGVzdFVzZXIiCit0ZXN0aW5nICJkaXIiICJ1c2VyYWRkIC1oICRQV0QvZGlyICR1c2VyICRhcmcgfHwKKyAgIGdyZXAgJ14kdXNlcjouKmRpcicgL2V0Yy9wYXNzd2QgJGFyZyAmJiBbIC1kICRQV0QvZGlyIF0gJiYKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiRwYXNzIgordXNlcmRlbCAtciAkdXNlciAkYXJnCitybSAtcmYgJFBXRC9kaXIKKworZ2Vjb3M9ImFhYSxiYmIsY2NjLGRkZCxlZWUiCit0ZXN0aW5nICJnZWNvcyIgInVzZXJhZGQgLWcgJyRnZWNvcycgJHVzZXIgJGFyZyB8fAorICAgZ3JlcCAnXiR1c2VyOi4qJGdlY29zJyAvZXRjL3Bhc3N3ZCAkYXJnICYmIFsgLWQgL2hvbWUvJHVzZXIgXSAmJgorICAgZWNobyAneWVzJyIgInllc1xuIiAiIiAiJHBhc3MiCit1c2VyZGVsIC1yICR1c2VyICRhcmcKKworc2hsPSIvYmluL3NoIgordGVzdGluZyAic2hlbGwiICJ1c2VyYWRkIC1zICRzaGwgJHVzZXIgJGFyZyB8fAorICAgZ3JlcCAnXiR1c2VyOi4qJHNobCQnIC9ldGMvcGFzc3dkICRhcmcgJiYgWyAtZCAvaG9tZS8kdXNlciBdICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIkcGFzcyIKK3VzZXJkZWwgLXIgJHVzZXIgJGFyZworCitnX25hbWU9InJvb3QiCitnX2lkPWBncmVwICRnX25hbWUnOi4qOi4qJyAvZXRjL2dyb3VwIHwgY3V0IC1kIDogLWYgM2AKK3Rlc3RpbmcgImdyb3VwIiAidXNlcmFkZCAtRyAkZ19uYW1lICR1c2VyICRhcmcgfHwKKyAgIGdyZXAgJ14kdXNlcjouKjouKjokZ19pZDouKicgL2V0Yy9wYXNzd2QgJGFyZyAmJiBbIC1kIC9ob21lLyR1c2VyIF0gJiYKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiRwYXNzIgordXNlcmRlbCAtciAkdXNlciAkYXJnCisKK3Rlc3RpbmcgIihzeXN0ZW0gdXNlcikiICJ1c2VyYWRkIC1TICR1c2VyICRhcmcgfHwKKyAgIGdyZXAgJ14kdXNlcjouKjouKjouKicgL2V0Yy9wYXNzd2QgJGFyZyAmJiBbICEgLWUgL2hvbWUvJHVzZXIgXSAmJiAKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiRwYXNzIiAgIAordXNlcmRlbCAtciAkdXNlciAkYXJnCisKK3Rlc3RpbmcgIi1EIiAidXNlcmFkZCAtRCAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6Lio6Lio6LionIC9ldGMvcGFzc3dkICRhcmcgJiYgWyAtZCAvaG9tZS8kdXNlciBdICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIkcGFzcyIKK3VzZXJkZWwgLXIgJHVzZXIgJGFyZworCit0ZXN0aW5nICItSCIgInVzZXJhZGQgLUggJHVzZXIgJGFyZyB8fAorICAgZ3JlcCAnXiR1c2VyOi4qOi4qOi4qJyAvZXRjL3Bhc3N3ZCAkYXJnICYmIFsgISAtZSAvaG9tZS8kdXNlciBdICYmCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIkcGFzcyIKK3VzZXJkZWwgLXIgJHVzZXIgJGFyZworCit0ZXN0aW5nICJkaXIgYW5kIC1IIiAidXNlcmFkZCAtSCAtaCAkUFdEL2RpciAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6LipkaXInIC9ldGMvcGFzc3dkICRhcmcgJiYgWyAhIC1lICRQV0QvZGlyIF0gJiYKKyAgIGVjaG8gJ3llcyciICJ5ZXNcbiIgIiIgIiRwYXNzIgordXNlcmRlbCAtciAkdXNlciAkYXJnCisKK3Rlc3RpbmcgIi11IiAidXNlcmFkZCAtdSA0OTk5OSAkdXNlciAkYXJnIHx8CisgICBncmVwICdeJHVzZXI6eDo0OTk5OTouKicgL2V0Yy9wYXNzd2QgJGFyZyAmJiBbIC1kIC9ob21lLyR1c2VyIF0gJiYgCisgICBlY2hvICd5ZXMnIiAieWVzXG4iICIiICIkcGFzcyIKK3VzZXJkZWwgLXIgJHVzZXIgJGFyZworCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvdXVkZWNvZGUudGVzdCBiL3RveWJveC90ZXN0cy91dWRlY29kZS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjM2JiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvdXVkZWNvZGUudGVzdApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgInV1IGVtcHR5IGZpbGUiICJ1dWRlY29kZSAtbyAvZGV2L3N0ZG91dCAmJiBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgImJlZ2luIDc0NCB0ZXN0XG5cYFxuZW5kXG4iCit0ZXN0aW5nICJ1dSAxLWNoYXIiICJ1dWRlY29kZSAtbyAvZGV2L3N0ZG91dCIgImEiICIiIFwKKwkiYmVnaW4gNzQ0IHRlc3RcbiE4MCAgXG5cYFxuZW5kXG4iCit0ZXN0aW5nICJ1dSAyLWNoYXIiICJ1dWRlY29kZSAtbyAvZGV2L3N0ZG91dCIgImFiIiAiIiBcCisJImJlZ2luIDc0NCB0ZXN0XG5cIjg2KCBcblxgXG5lbmRcbiIKK3Rlc3RpbmcgInV1IDMtY2hhciIgInV1ZGVjb2RlIC1vIC9kZXYvc3Rkb3V0IiAiYWJjIiAiIiBcCisJImJlZ2luIDc0NCB0ZXN0XG4jODYpQ1xuXGBcbmVuZFxuIiAKKwordGVzdGluZyAiYjY0IGVtcHR5IGZpbGUiICJ1dWRlY29kZSAtbyAvZGV2L3N0ZG91dCAmJiBlY2hvIHllcyIgXAorICAgICAgICAieWVzXG4iICIiICJiZWdpbi1iYXNlNjQgNzQ0IHRlc3Rcbj09PT1cbiIgCit0ZXN0aW5nICJiNjQgMS1jaGFyIiAidXVkZWNvZGUgLW8gL2Rldi9zdGRvdXQiICJhIiAiIiBcCisJImJlZ2luLWJhc2U2NCA3NDQgdGVzdFxuWVE9PVxuPT09PVxuIgordGVzdGluZyAiYjY0IDItY2hhciIgInV1ZGVjb2RlIC1vIC9kZXYvc3Rkb3V0IiAiYWIiICIiIFwKKwkiYmVnaW4tYmFzZTY0IDc0NCB0ZXN0XG5ZV0k9XG49PT09XG4iCit0ZXN0aW5nICJiNjQgMy1jaGFyIiAidXVkZWNvZGUgLW8gL2Rldi9zdGRvdXQiICJhYmMiICIiIFwKKwkiYmVnaW4tYmFzZTY0IDc0NCB0ZXN0XG5ZV0pqXG49PT09XG4iCisKK3Rlc3RpbmcgImZpbGVuYW1lIiAidXVkZWNvZGUgJiYgZWNobyAtbmUgJ2FiYycgfCBjbXAgdXVkZWNvZGUtZm4tdGVzdCAvZGV2L3N0ZGluICYmIGVjaG8gLW5lIHllcyAmJiBybSB1dWRlY29kZS1mbi10ZXN0IiBcCisJInllcyIgIiIgImJlZ2luLWJhc2U2NCA3NDQgdXVkZWNvZGUtZm4tdGVzdFxuWVdKalxuPT09PVxuIgorCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMvdXVlbmNvZGUudGVzdCBiL3RveWJveC90ZXN0cy91dWVuY29kZS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyYTYxZGMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvdXVlbmNvZGUudGVzdApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgIm5vdCBlbm91Z2ggYXJncyBbZmFpbF0iICJ1dWVuY29kZSAyPi9kZXYvbnVsbCIgIiIgIiIgIiIKKwordGVzdGluZyAidXUgZW1wdHkgZmlsZSIgInV1ZW5jb2RlIHRlc3QiIFwKKwkiYmVnaW4gNzQ0IHRlc3RcbmVuZFxuIiAiIiAiIiAKK3Rlc3RpbmcgInV1IDEtY2hhciIgInV1ZW5jb2RlIHRlc3QiIFwKKwkiYmVnaW4gNzQ0IHRlc3RcbiE4MFxgXGBcbmVuZFxuIiAiIiAiYSIgCit0ZXN0aW5nICJ1dSAyLWNoYXIiICJ1dWVuY29kZSB0ZXN0IiBcCisJImJlZ2luIDc0NCB0ZXN0XG5cIjg2KFxgXG5lbmRcbiIgIiIgImFiIiAKK3Rlc3RpbmcgInV1IDMtY2hhciIgInV1ZW5jb2RlIHRlc3QiIFwKKwkiYmVnaW4gNzQ0IHRlc3RcbiM4NilDXG5lbmRcbiIgIiIgImFiYyIgCisKK3Rlc3RpbmcgImI2NCBlbXB0eSBmaWxlIiAidXVlbmNvZGUgLW0gdGVzdCIgXAorCSJiZWdpbi1iYXNlNjQgNzQ0IHRlc3Rcbj09PT1cbiIgIiIgIiIgCit0ZXN0aW5nICJiNjQgMS1jaGFyIiAidXVlbmNvZGUgLW0gdGVzdCIgXAorCSJiZWdpbi1iYXNlNjQgNzQ0IHRlc3RcbllRPT1cbj09PT1cbiIgIiIgImEiIAordGVzdGluZyAiYjY0IDItY2hhciIgInV1ZW5jb2RlIC1tIHRlc3QiIFwKKwkiYmVnaW4tYmFzZTY0IDc0NCB0ZXN0XG5ZV0k9XG49PT09XG4iICIiICJhYiIgCit0ZXN0aW5nICJiNjQgMy1jaGFyIiAidXVlbmNvZGUgLW0gdGVzdCIgXAorCSJiZWdpbi1iYXNlNjQgNzQ0IHRlc3RcbllXSmpcbj09PT1cbiIgIiIgImFiYyIgCisKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy93Yy50ZXN0IGIvdG95Ym94L3Rlc3RzL3djLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDIyN2I5YwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90ZXN0cy93Yy50ZXN0CkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworY2F0ID5maWxlMSA8PEVPRgorc29tZSB3b3JkcwkuIAorCitzb21lCitsaW5lcworRU9GCisKK3Rlc3RpbmcgIndjIiAid2MgPi9kZXYvbnVsbCAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgordGVzdGluZyAiZW1wdHkgZmlsZSIgIndjIiAiICAgICAgMCAgICAgICAwICAgICAgIDBcbiIgIiIgIiIKK3Rlc3RpbmcgInN0YW5kYXJkIGlucHV0IiAid2MiICIgICAgICAxICAgICAgIDMgICAgICAgNVxuIiAiIiAiYSBiXG5jIgordGVzdGluZyAiLWMiICJ3YyAtYyBmaWxlMSIgIjI2IGZpbGUxXG4iICIiICIiCit0ZXN0aW5nICItbCIgIndjIC1sIGZpbGUxIiAiNCBmaWxlMVxuIiAiIiAiIgordGVzdGluZyAiLXciICJ3YyAtdyBmaWxlMSIgIjUgZmlsZTFcbiIgIiIgIiIKK05PU1BBQ0U9MSB0ZXN0aW5nICJmb3JtYXQiICJ3YyBmaWxlMSIgIiA0IDUgMjYgZmlsZTFcbiIgIiIgIiIKK3Rlc3RpbmcgIm11bHRpcGxlIGZpbGVzIiAid2MgaW5wdXQgLSBmaWxlMSIgXAorICAgICAgICAiICAgICAgMSAgICAgICAyICAgICAgIDMgaW5wdXRcbiAgICAgIDAgICAgICAgMiAgICAgICAzIC1cbiAgICAgIDQgICAgICAgNSAgICAgIDI2IGZpbGUxXG4gICAgICA1ICAgICAgIDkgICAgICAzMiB0b3RhbFxuIiAiYVxuYiIgImEgYiIKKworI1Rlc3RzIGZvciB3YyAtbQoraWYgcHJpbnRmICIlcyIgIiRMQU5HIiB8IGdyZXAgLXEgVVRGLTgKK3RoZW4KKworcHJpbnRmICIgIiA+IGZpbGUxCitmb3IgaSBpbiAkKHNlcSAxIDgxOTIpCitkbworICBwcmludGYgIsO8IiA+PiBmaWxlMQorZG9uZQordGVzdGluZyAiLW0iICJ3YyAtbSBmaWxlMSIgIjgxOTMgZmlsZTFcbiIgIiIgIiIKK3Rlc3RpbmcgIi1tIDIiICdjYXQgIiRGSUxFUy91dGY4L3Rlc3QyLnR4dCIgfCB3YyAtbScgIjE2OVxuIiAiIiAiIgorcHJpbnRmICIgIiA+IGZpbGUxCitmb3IgaSBpbiAkKHNlcSAxIDgxOTIpCitkbworICBwcmludGYgIsO8IiA+PiBmaWxlMQorZG9uZQordGVzdGluZyAiLW0gKGludmFsaWQgY2hhcnMpIiAid2MgLW0gZmlsZTEiICI4MTkzIGZpbGUxXG4iICIiICIiCitOT1NQQUNFPTEgdGVzdGluZyAiLW1sdyIgIndjIC1tbHcgaW5wdXQiICIgMSAyIDExIGlucHV0XG4iICJoZWxsbywg5LiW55WMIVxuIiAiIgorCitlbHNlCitwcmludGYgInNraXBwaW5nIHRlc3RzIGZvciB3YyAtbSIKK2ZpCisKK3JtIGZpbGUxCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMveGFyZ3MudGVzdCBiL3RveWJveC90ZXN0cy94YXJncy50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2NmJjNWQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMveGFyZ3MudGVzdApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgInhhcmdzIiAieGFyZ3MgJiYgZWNobyB5ZXMiICJoZWxsb1xueWVzXG4iICIiICJoZWxsbyIKK3Rlc3RpbmcgInNwYWNlcyIgInhhcmdzIiBcCisJIm9uZSB0d28gdGhyZWUgZm91clxuIiAiIiAib25lIHR3b1x0dGhyZWUgIFxuZm91clxuXG4iCisKK3Rlc3RpbmcgIi1uIDAiICJ4YXJncyAtbiAwIDI+L2Rldi9udWxsIHx8IGVjaG8gb2siICJva1xuIiBcCisJIiIgIm9uZSBcbnR3b1xuIHRocmVlIgordGVzdGluZyAiLW4gMiIgInhhcmdzIC1uIDIiICJvbmUgdHdvXG50aHJlZVxuIiAiIiAib25lIFxudHdvXG4gdGhyZWUiCit0ZXN0aW5nICItbiBleGFjdCBtYXRjaCIgInhhcmdzIC1uIDMiICJvbmUgdHdvIHRocmVlXG4iICIiICJvbmUgdHdvIHRocmVlIgordGVzdGluZyAieGFyZ3MyIiAieGFyZ3MgLW4yIiAib25lIHR3b1xudGhyZWUgZm91clxuZml2ZVxuIiAiIiBcCisJIm9uZSB0d28gdGhyZWUgZm91ciBmaXZlIgordGVzdGluZyAiLXMgdG9vIGxvbmciICJ4YXJncyAtcyA5IGVjaG8gMj4vZGV2L251bGwgfHwgZWNobyBvayIgXAorCSJvbmVcbnR3b1xub2tcbiIgIiIgIm9uZSB0d28gdGhyZWUiCit0ZXN0aW5nICItcyAxMyIgInhhcmdzIC1zIDEzIGVjaG8iICJvbmUgdHdvXG50aHJlZVxuIiAiIiAib25lIFxudHdvXG4gdGhyZWUiCit0ZXN0aW5nICItcyAxMiIgInhhcmdzIC1zIDEyIGVjaG8iICJvbmVcbnR3b1xudGhyZWVcbiIgIiIgIm9uZSBcbnR3b1xuIHRocmVlIgorCit0b3VjaCBvbmUgdHdvIHRocmVlCit0ZXN0aW5nICJjb21tYW5kIC1vcHQiICJ4YXJncyAtbjIgbHMgLTEiICJvbmVcbnR3b1xudGhyZWVcbiIgIiIgXAorCSJvbmUgdHdvIHRocmVlIgorcm0gb25lIHR3byB0aHJlZQorCisjdGVzdGluZyAiLW4gZXhhY3QgbWF0Y2giCisjdGVzdGluZyAiLXMgZXhhY3QgbWF0Y2giCisjdGVzdGluZyAiLXMgMCIKKyN0ZXN0aW5nICItcyBpbXBvc3NpYmxlIgorCisjIHhhcmdzIGNvbW1hbmRfbm90X2ZvdW5kIC0gcmV0dXJucyAxMjcKKyMgeGFyZ3MgZmFsc2UgLSByZXR1cm5zIDEKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy94eGQudGVzdCBiL3RveWJveC90ZXN0cy94eGQudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQzYjhiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3Rlc3RzL3h4ZC50ZXN0CkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9iYXNoCisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworZWNobyAidGhpcyBpcyBzb21lIHRleHQiID4gZmlsZTEKK2VjaG8gLW4gPiBmaWxlMgorCisjIE5vdGUgdGhhdCB0aGUgeHhkIGluIHZpbS1jb21tb24gb24gVWJ1bnR1IDE0IHVzZXMgJTA3eCBmb3IgdGhlIGZpbGUgb2Zmc2V0LgorCit0ZXN0aW5nICJmaWxlMSIgInh4ZCBmaWxlMSIgXAorICAgICIwMDAwMDAwMDogNzQ2OCA2OTczIDIwNjkgNzMyMCA3MzZmIDZkNjUgMjA3NCA2NTc4ICB0aGlzIGlzIHNvbWUgdGV4XG4wMDAwMDAxMDogNzQwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LlxuIiBcCisgICAgIiIgIiIKK3Rlc3RpbmcgImZpbGUxIC1sIiAieHhkIC1sIDIgZmlsZTEiIFwKKyAgICAiMDAwMDAwMDA6IDc0NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhcbiIgXAorICAgICIiICIiCit0ZXN0aW5nICJmaWxlMiIgInh4ZCBmaWxlMiIgIiIgIiIgIiIKK3Rlc3RpbmcgIi0iICJ4eGQgLSIgXAorICAgICIwMDAwMDAwMDogNjg2NSA2YzZjIDZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxsb1xuIiAiIiAiaGVsbG8iCit0ZXN0aW5nICJ4eGQiICJ4eGQiIFwKKyAgICAiMDAwMDAwMDA6IDc3NmYgNzI2YyA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRcbiIgIiIgIndvcmxkIgordGVzdGluZyAiLWMgOCAtZyA0IGZpbGUxIiAieHhkIC1jIDggLWcgNCBmaWxlMSIgXAorICAgICIwMDAwMDAwMDogNzQ2ODY5NzMgMjA2OTczMjAgIHRoaXMgaXMgXG4wMDAwMDAwODogNzM2ZjZkNjUgMjA3NDY1NzggIHNvbWUgdGV4XG4wMDAwMDAxMDogNzQwYSAgICAgICAgICAgICAgIHQuXG4iICIiICIiCit0ZXN0aW5nICItYyA4IC1nIDMgZmlsZTEiICJ4eGQgLWMgOCAtZyAzIGZpbGUxIiBcCisgICAgIjAwMDAwMDAwOiA3NDY4NjkgNzMyMDY5IDczMjAgdGhpcyBpcyBcbjAwMDAwMDA4OiA3MzZmNmQgNjUyMDc0IDY1Nzggc29tZSB0ZXhcbjAwMDAwMDEwOiA3NDBhICAgICAgICAgICAgICAgdC5cbiIgIiIgIiIKKwordGVzdGluZyAiLXAiICJ4eGQgLXAgZmlsZTEiICI3NDY4Njk3MzIwNjk3MzIwNzM2ZjZkNjUyMDc0NjU3ODc0MGFcbiIgIiIgIiIKKwordGVzdGluZyAiLXMiICJ4eGQgLXMgMTMgZmlsZTEiICIwMDAwMDAwZDogNzQ2NSA3ODc0IDBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LlxuIiAiIiAiIgorCit0ZXN0aW5nICItciIgInh4ZCBmaWxlMSB8IHh4ZCAtciIgInRoaXMgaXMgc29tZSB0ZXh0XG4iICIiICIiCit0ZXN0aW5nICItciAtcCIgInh4ZCAtcCBmaWxlMSB8IHh4ZCAtciAtcCIgInRoaXMgaXMgc29tZSB0ZXh0XG4iICIiICIiCisKK3Rlc3RpbmcgIi1yIGdhcmJhZ2UiICJlY2hvICcwMDAwOiA2OCA2NSA2YzZjIDZmeHh4eCcgfCB4eGQgLXIgLSIgImhlbGxvIiAiIiAiIgorCisjIC1yIHdpbGwgb25seSByZWFkIC1jIGJ5dGVzIChkZWZhdWx0IDE2KSBiZWZvcmUgc2tpcHBpbmcgdG8gdGhlIG5leHQgbGluZSwKKyMgaWdub3JpbmcgdGhlIHJlc3QuCit0ZXN0aW5nICItciBsb25nIiBcCisgICAgImVjaG8gJzAwMDA6IDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwJyB8IHh4ZCAtciAtIiBcCisgICAgIkBAQEBAQEBAQEBAQEBAQEAiICIiICIiCisKKyMgLXIgLXAgaWdub3JlcyB0aGUgdXN1YWwgLXAgMzAtYnl0ZS9saW5lIGxpbWl0IChvciBhbnkgbGltaXQgc2V0IGJ5IC1jKSBhbmQKKyMgd2lsbCB0YWtlIGFzIG1hbnkgYnl0ZXMgYXMgeW91IGdpdmUgaXQuCit0ZXN0aW5nICItciAtcCBsb25nIiBcCisgICAgImVjaG8gJzQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwJyB8IHh4ZCAtciAtcCAtIiBcCisgICAgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAiICIiICIiCisKK3JtIGZpbGUxIGZpbGUyCmRpZmYgLS1naXQgYS90b3lib3gvdGVzdHMveHpjYXQudGVzdCBiL3RveWJveC90ZXN0cy94emNhdC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhYWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMveHpjYXQudGVzdApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDE0IERpdnlhIEtvdGhhcmkgPGRpdnlhLnMua290aGFyaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAyMDE0IE5haGEgTWFnZ3UgPG1hZ2d1Lm5laGFAZ21haWwuY29tPgorCitbIC1mIHRlc3Rpbmcuc2ggXSAmJiAuIHRlc3Rpbmcuc2gKKworI3Rlc3RpbmcgIm5hbWUiICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCitlY2hvICJoZWxsbyIgPiBmaWxlCit0YXIgLWNKZiBmaWxlLnh6IGZpbGUKKyMgR2V0IHN5c3RlbSB4emNhdAoreHpjYXRFeGU9YHdoaWNoIHh6Y2F0YAorJHh6Y2F0RXhlIGZpbGUueHogPiB4emNhdE91dAordGVzdGluZyAiLSBkZWNvbXByZXNzZXMgYSBzaW5nbGUgZmlsZSIgInh6Y2F0IGZpbGUueHogPiBUZW1wZmlsZSAmJiBlY2hvICJ5ZXMiOyBkaWZmIFRlbXBmaWxlIHh6Y2F0T3V0ICYmIGVjaG8gInllcyI7IHJtIC1yZiBmaWxlKiB4emNhdE91dCBUZW1wZmlsZSIgInllc1xueWVzXG4iICIiICIiCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorZWNobyAiaGVsbG8iID4gZmlsZTEKK2VjaG8gImhpIiA+IGZpbGUyCitlY2hvICJIaSwgR29vZCBtb3JuaW5nICEhIEkgYW0gYSB4emNhdCB0ZXN0ZXIiID4gZmlsZTMKK3RhciAtY0pmIGZpbGUxLnh6IGZpbGUxCit0YXIgLWNKZiBmaWxlMi54eiBmaWxlMgordGFyIC1jSmYgZmlsZTMueHogZmlsZTMKKyMgR2V0IHN5c3RlbSB4emNhdAoreHpjYXRFeGU9YHdoaWNoIHh6Y2F0YAorJHh6Y2F0RXhlIGZpbGUxLnh6IGZpbGUyLnh6IGZpbGUzLnh6ID4geHpjYXRPdXQKK3Rlc3RpbmcgIi0gZGVjb21wcmVzc2VzIG11bHRpcGxlIGZpbGVzIiAieHpjYXQgZmlsZTEueHogZmlsZTIueHogZmlsZTMueHogPiBUZW1wZmlsZSAmJiBlY2hvICJ5ZXMiIDsgZGlmZiBUZW1wZmlsZSB4emNhdE91dCAmJiBlY2hvICJ5ZXMiOyBybSAtcmYgZmlsZSogeHpjYXRPdXQgVGVtcGZpbGUgIiAieWVzXG55ZXNcbiIgIiIgIiIKZGlmZiAtLWdpdCBhL3RveWJveC90ZXN0cy96Y2F0LnRlc3QgYi90b3lib3gvdGVzdHMvemNhdC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjZDQ3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdGVzdHMvemNhdC50ZXN0CkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMTQgRGl2eWEgS290aGFyaSA8ZGl2eWEucy5rb3RoYXJpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMTQgTmFoYSBNYWdndSA8bWFnZ3UubmVoYUBnbWFpbC5jb20+CisKK1sgLWYgdGVzdGluZy5zaCBdICYmIC4gdGVzdGluZy5zaAorCisjdGVzdGluZyAibmFtZSIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKK2VjaG8gImhlbGxvIiA+IGZpbGUKK3RhciAtY3pmIGZpbGUuZ3ogZmlsZQorIyBHZXQgc3lzdGVtIHpjYXQKK3pjYXRFeGU9YHdoaWNoIHpjYXRgCiskemNhdEV4ZSBmaWxlLmd6ID4gemNhdE91dAordGVzdGluZyAiLSBkZWNvbXByZXNzZXMgYSBzaW5nbGUgZmlsZSIgInpjYXQgZmlsZS5neiA+IFRlbXBmaWxlICYmIGVjaG8gInllcyI7IGRpZmYgVGVtcGZpbGUgemNhdE91dCAmJiBlY2hvICJ5ZXMiOyBybSAtcmYgZmlsZSogemNhdE91dCBUZW1wZmlsZSIgInllc1xueWVzXG4iICIiICIiCisKKyN0ZXN0aW5nICJuYW1lIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorZWNobyAiaGVsbG8iID4gZmlsZTEKK2VjaG8gImhpIiA+IGZpbGUyCitlY2hvICJIaSwgR29vZCBtb3JuaW5nICEhIEkgYW0gYSBiemNhdCB0ZXN0ZXIiID4gZmlsZTMKK3RhciAtY3pmIGZpbGUxLmd6IGZpbGUxCit0YXIgLWN6ZiBmaWxlMi5neiBmaWxlMgordGFyIC1jemYgZmlsZTMuZ3ogZmlsZTMKKyMgR2V0IHN5c3RlbSB6Y2F0Cit6Y2F0RXhlPWB3aGljaCB6Y2F0YAorJHpjYXRFeGUgZmlsZTEuZ3ogZmlsZTIuZ3ogZmlsZTMuZ3ogPiB6Y2F0T3V0Cit0ZXN0aW5nICItIGRlY29tcHJlc3NlcyBtdWx0aXBsZSBmaWxlcyIgInpjYXQgZmlsZTEuZ3ogZmlsZTIuZ3ogZmlsZTMuZ3ogPiBUZW1wZmlsZSAmJiBlY2hvICJ5ZXMiIDsgZGlmZiBUZW1wZmlsZSB6Y2F0T3V0ICYmIGVjaG8gInllcyI7IHJtIC1yZiBmaWxlKiB6Y2F0T3V0IFRlbXBmaWxlICIgInllc1xueWVzXG4iICIiICIiCmRpZmYgLS1naXQgYS90b3lib3gvdG95cy5oIGIvdG95Ym94L3RveXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRmNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMuaApAQCAtMCwwICsxLDEyOCBAQAorLyogVG95Ym94IGluZnJhc3RydWN0dXJlLgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKi8KKworLy8gU3R1ZmYgdGhhdCBuZWVkcyB0byBnbyBiZWZvcmUgdGhlIHN0YW5kYXJkIGhlYWRlcnMKKworI2luY2x1ZGUgImdlbmVyYXRlZC9jb25maWcuaCIKKyNpbmNsdWRlICJsaWIvcG9ydGFiaWxpdHkuaCIKKworLy8gR2VuZXJhbCBwb3NpeC0yMDA4IGhlYWRlcnMKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKworLy8gUG9zaXggbmV0d29ya2luZworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisvLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0IChhbHNvIGluIFBPU0lYIGFuZCBMU0IpCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorCisvLyBMU0IgNC4xIGhlYWRlcnMKKyNpbmNsdWRlIDxwdHkuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKworI2luY2x1ZGUgImxpYi9saWIuaCIKKyNpbmNsdWRlICJsaWIvbHNtLmgiCisjaW5jbHVkZSAibGliL3RveWZsYWdzLmgiCisjaW5jbHVkZSAidG95cy9lMmZzLmgiCisKKy8vIEdldCBsaXN0IG9mIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGFsbCBlbmFibGVkIGNvbW1hbmRfbWFpbigpIGZ1bmN0aW9ucy4KKworI2RlZmluZSBORVdUT1kobmFtZSwgb3B0cywgZmxhZ3MpIHZvaWQgbmFtZSMjX21haW4odm9pZCk7CisjZGVmaW5lIE9MRFRPWShuYW1lLCBvbGRuYW1lLCBmbGFncykgdm9pZCBvbGRuYW1lIyNfbWFpbih2b2lkKTsKKyNpbmNsdWRlICJnZW5lcmF0ZWQvbmV3dG95cy5oIgorI2luY2x1ZGUgImdlbmVyYXRlZC9mbGFncy5oIgorI2luY2x1ZGUgImdlbmVyYXRlZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiZ2VuZXJhdGVkL3RhZ3MuaCIKKworLy8gVGhlc2UgbGl2ZSBpbiBtYWluLmMKKworc3RydWN0IHRveV9saXN0ICp0b3lfZmluZChjaGFyICpuYW1lKTsKK3ZvaWQgdG95X2luaXQoc3RydWN0IHRveV9saXN0ICp3aGljaCwgY2hhciAqYXJndltdKTsKK3ZvaWQgdG95X2V4ZWMoY2hhciAqYXJndltdKTsKKworLy8gQXJyYXkgb2YgYXZhaWxhYmxlIGNvbW1hbmRzCisKK2V4dGVybiBzdHJ1Y3QgdG95X2xpc3QgeworICBjaGFyICpuYW1lOworICB2b2lkICgqdG95X21haW4pKHZvaWQpOworICBjaGFyICpvcHRpb25zOworICBpbnQgZmxhZ3M7Cit9IHRveV9saXN0W107CisKKy8vIEdsb2JhbCBjb250ZXh0IHNoYXJlZCBieSBhbGwgY29tbWFuZHMuCisKK2V4dGVybiBzdHJ1Y3QgdG95X2NvbnRleHQgeworICBzdHJ1Y3QgdG95X2xpc3QgKndoaWNoOyAgLy8gV2hpY2ggZW50cnkgaW4gdG95X2xpc3QgaXMgdGhpcyBvbmU/CisgIGNoYXIgKiphcmd2OyAgICAgICAgICAgICAvLyBPcmlnaW5hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgIGNoYXIgKipvcHRhcmdzOyAgICAgICAgICAvLyBBcmd1bWVudHMgbGVmdCBvdmVyIGZyb20gZ2V0X29wdGZsYWdzKCkKKyAgdW5zaWduZWQgbG9uZyBsb25nIG9wdGZsYWdzOyAvLyBDb21tYW5kIGxpbmUgb3B0aW9uIGZsYWdzIGZyb20gZ2V0X29wdGZsYWdzKCkKKyAgaW50IGV4aXR2YWw7ICAgICAgICAgICAgIC8vIFZhbHVlIGVycm9yX2V4aXQgZmVlZHMgdG8gZXhpdCgpCisgIGludCBvcHRjOyAgICAgICAgICAgICAgICAvLyBDb3VudCBvZiBvcHRhcmdzCisgIGludCBvbGRfdW1hc2s7ICAgICAgICAgICAvLyBPbGQgdW1hc2sgcHJlc2VydmVkIGJ5IFRPWUZMQUdfVU1BU0sKKyAgc2hvcnQgdG95Y291bnQ7ICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBjb21tYW5kcyBpbiB0aGlzIGJ1aWxkCisgIHNob3J0IHNpZ25hbDsgICAgICAgICAgICAvLyBnZW5lcmljX3NpZ25hbCgpIHJlY29yZHMgd2hhdCBzaWduYWwgaXQgc2F3IGhlcmUKKyAgaW50IHNpZ25hbGZkOyAgICAgICAgICAgIC8vIGFuZCB3cml0ZXMgc2lnbmFsIHRvIHRoaXMgZmQsIGlmIHNldAorICBpbnQgd2Fzcm9vdDsgICAgICAgICAgICAgLy8gZHJvcHBlZCBzZXR1aWQKKworICAvLyBUaGlzIGlzIGF0IHRoZSBlbmQgc28gdG95X2luaXQoKSBkb2Vzbid0IHplcm8gaXQuCisgIGptcF9idWYgKnJlYm91bmQ7ICAgICAgICAvLyBsb25nam1wIGhlcmUgaW5zdGVhZCBvZiBleGl0IHdoZW4gZG9fcmVib3VuZCBzZXQKKyAgc3RydWN0IGFyZ19saXN0ICp4ZXhpdDsgIC8vIGF0ZXhpdCgpIGZ1bmN0aW9ucyBmb3IgeGV4aXQoKSwgc2V0IGJ5IHNpZ2F0ZXhpdCgpCisgIHZvaWQgKnN0YWNrdG9wOyAgICAgICAgICAvLyBuZXN0ZWQgdG95X2V4ZWMoKSBjYWxsIGNvdW50LCBvciAwIGlmIHZmb3JrZWQKK30gdG95czsKKworLy8gVHdvIGJpZyB0ZW1wb3JhcnkgYnVmZmVyczogb25lIGZvciB1c2UgYnkgY29tbWFuZHMsIG9uZSBmb3IgbGlicmFyeSBmdW5jdGlvbnMKKworZXh0ZXJuIGNoYXIgdG95YnVmWzQwOTZdLCBsaWJidWZbNDA5Nl07CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworI2RlZmluZSBHTE9CQUxTKC4uLikKKyNkZWZpbmUgQVJSQVlfTEVOKGFycmF5KSAoc2l6ZW9mKGFycmF5KS9zaXplb2YoKmFycmF5KSkKKyNkZWZpbmUgVEFHR0VEX0FSUkFZKFgsIC4uLikge19fVkFfQVJHU19ffQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvYW5kcm9pZC9SRUFETUUgYi90b3lib3gvdG95cy9hbmRyb2lkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDcxYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvYW5kcm9pZC9SRUFETUUKQEAgLTAsMCArMSw1IEBACitBbmRyb2lkCisKK0NvbW1hbmRzIHByaW1hcmlseSB1c2VkIGJ5IEFuZHJvaWQsIG5vdCB2YW5pbGxhIExpbnV4LiAoQWxzbyBTRUxpbnV4IHN0dWZmLikKKworQnVnIEVsbGlvdHQgSHVnaGVzIDxlbmhAZ29vZ2xlLmNvbT4gYWJvdXQgdGhpcy4KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvZ2V0ZW5mb3JjZS5jIGIvdG95Ym94L3RveXMvYW5kcm9pZC9nZXRlbmZvcmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyOGNlNQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2FuZHJvaWQvZ2V0ZW5mb3JjZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGdldGVuZm9yY2UuYyAtIEdldCB0aGUgY3VycmVudCBTRUxpbnV4IG1vZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9HRVRFTkZPUkNFKE5FV1RPWShnZXRlbmZvcmNlLCAiPjAiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgR0VURU5GT1JDRQorICBib29sICJnZXRlbmZvcmNlIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfU0VMSU5VWAorICBoZWxwCisgICAgdXNhZ2U6IGdldGVuZm9yY2UKKworICAgIFNob3dzIHdoZXRoZXIgU0VMaW51eCBpcyBkaXNhYmxlZCwgZW5mb3JjaW5nLCBvciBwZXJtaXNzaXZlLgorKi8KKworI2RlZmluZSBGT1JfZ2V0ZW5mb3JjZQorI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBnZXRlbmZvcmNlX21haW4odm9pZCkKK3sKKyAgaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkgcHV0cygiRGlzYWJsZWQiKTsKKyAgZWxzZSB7CisgICAgaW50IHJldCA9IHNlY3VyaXR5X2dldGVuZm9yY2UoKTsKKworICAgIGlmIChyZXQgPT0gLTEpIHBlcnJvcl9leGl0KCJDb3VsZG4ndCBnZXQgZW5mb3JjaW5nIHN0YXR1cyIpOworICAgIGVsc2UgcHV0cyhyZXQgPyAiRW5mb3JjaW5nIiA6ICJQZXJtaXNzaXZlIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvZ2V0cHJvcC5jIGIvdG95Ym94L3RveXMvYW5kcm9pZC9nZXRwcm9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2FuZHJvaWQvZ2V0cHJvcC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBnZXRwcm9wLmMgLSBHZXQgYW4gQW5kcm9pZCBzeXN0ZW0gcHJvcGVydHkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9HRVRQUk9QKE5FV1RPWShnZXRwcm9wLCAiPjJaIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKKworY29uZmlnIEdFVFBST1AKKyAgYm9vbCAiZ2V0cHJvcCIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX09OX0FORFJPSUQKKyAgaGVscAorICAgIHVzYWdlOiBnZXRwcm9wIFtOQU1FIFtERUZBVUxUXV0KKworICAgIEdldHMgYW4gQW5kcm9pZCBzeXN0ZW0gcHJvcGVydHksIG9yIGxpc3RzIHRoZW0gYWxsLgorKi8KKworI2RlZmluZSBGT1JfZ2V0cHJvcAorI2luY2x1ZGUgInRveXMuaCIKKworI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CisjaW5jbHVkZSA8c2VsaW51eC9sYWJlbC5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorCitHTE9CQUxTKAorICBzaXplX3Qgc2l6ZTsKKyAgY2hhciAqKm52OyAvLyBuYW1lL3ZhbHVlIHBhaXJzOiBldmVuPW5hbWUsIG9kZD12YWx1ZQorICBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhhbmRsZTsKKykKKworc3RhdGljIGNoYXIgKmdldF9wcm9wZXJ0eV9jb250ZXh0KGNoYXIgKnByb3BlcnR5KQoreworICBjaGFyICpjb250ZXh0ID0gTlVMTDsKKworICBpZiAoc2VsYWJlbF9sb29rdXAoVFQuaGFuZGxlLCAmY29udGV4dCwgcHJvcGVydHksIDEpKSB7CisgICAgcGVycm9yX2V4aXQoInVuYWJsZSB0byBsb29rdXAgbGFiZWwgZm9yIFwiJXNcIiIsIHByb3BlcnR5KTsKKyAgfQorICByZXR1cm4gY29udGV4dDsKK30KKworc3RhdGljIHZvaWQgYWRkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCB2b2lkICp1bnVzZWQpCit7CisgIGlmICghKFRULnNpemUmMzEpKSBUVC5udiA9IHhyZWFsbG9jKFRULm52LCAoVFQuc2l6ZSszMikqMipzaXplb2YoY2hhciAqKSk7CisKKyAgVFQubnZbMipUVC5zaXplXSA9IHhzdHJkdXAobmFtZSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKSB7CisgICAgVFQubnZbMSsyKlRULnNpemUrK10gPSBnZXRfcHJvcGVydHlfY29udGV4dChuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBUVC5udlsxKzIqVFQuc2l6ZSsrXSA9IHhzdHJkdXAodmFsdWUpOworICB9Cit9CisKKy8vIE5lZWRlZCB0byBzdXByZXNzIGV4dHJhbmVvdXMgIkxvYWRlZCBwcm9wZXJ0eV9jb250ZXh0cyBmcm9tIiBtZXNzYWdlCitzdGF0aWMgaW50IHNlbGludXhfbG9nX2NhbGxiYWNrX2xvY2FsKGludCB0eXBlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKworICBpZiAodHlwZSA9PSBTRUxJTlVYX0lORk8pIHJldHVybiAwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdmVycm9yX21zZyhmbXQsIDAsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2V0cHJvcF9tYWluKHZvaWQpCit7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKSB7CisgICAgdW5pb24gc2VsaW51eF9jYWxsYmFjayBjYjsKKworICAgIGNiLmZ1bmNfbG9nID0gc2VsaW51eF9sb2dfY2FsbGJhY2tfbG9jYWw7CisgICAgc2VsaW51eF9zZXRfY2FsbGJhY2soU0VMSU5VWF9DQl9MT0csIGNiKTsKKyAgICBUVC5oYW5kbGUgPSBzZWxpbnV4X2FuZHJvaWRfcHJvcF9jb250ZXh0X2hhbmRsZSgpOworICAgIGlmICghVFQuaGFuZGxlKSBlcnJvcl9leGl0KCJ1bmFibGUgdG8gZ2V0IHNlbGludXggcHJvcGVydHkgY29udGV4dCBoYW5kbGUiKTsKKyAgfQorCisgIGlmICgqdG95cy5vcHRhcmdzKSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1opIHsKKyAgICAgIGNoYXIgKmNvbnRleHQgPSBnZXRfcHJvcGVydHlfY29udGV4dCgqdG95cy5vcHRhcmdzKTsKKworICAgICAgcHV0cyhjb250ZXh0KTsKKyAgICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3BlcnR5X2dldCgqdG95cy5vcHRhcmdzLCB0b3lidWYsIHRveXMub3B0YXJnc1sxXSA/IHRveXMub3B0YXJnc1sxXSA6ICIiKTsKKyAgICAgIHB1dHModG95YnVmKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAocHJvcGVydHlfbGlzdCgodm9pZCAqKWFkZF9wcm9wZXJ0eSwgMCkpIGVycm9yX2V4aXQoInByb3BlcnR5X2xpc3QiKTsKKyAgICBxc29ydChUVC5udiwgVFQuc2l6ZSwgMipzaXplb2YoY2hhciAqKSwgcXN0cmNtcCk7CisgICAgZm9yIChpID0gMDsgaTxUVC5zaXplOyBpKyspIHByaW50ZigiWyVzXTogWyVzXVxuIiwgVFQubnZbaSoyXSxUVC5udlsxK2kqMl0pOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGk8VFQuc2l6ZTsgaSsrKSB7CisgICAgICAgIGZyZWUoVFQubnZbaSoyXSk7CisgICAgICAgIGZyZWUoVFQubnZbMStpKjJdKTsKKyAgICAgIH0KKyAgICAgIGZyZWUoVFQubnYpOworICAgIH0KKyAgfQorICBpZiAoQ0ZHX1RPWUJPWF9GUkVFICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKSkgc2VsYWJlbF9jbG9zZShUVC5oYW5kbGUpOworfQorCisjZWxzZQorCit2b2lkIGdldHByb3BfbWFpbih2b2lkKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvbG9hZF9wb2xpY3kuYyBiL3RveWJveC90b3lzL2FuZHJvaWQvbG9hZF9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZmMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvYW5kcm9pZC9sb2FkX3BvbGljeS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGxvYWRfcG9saWN5LmMgLSBMb2FkIGEgcG9saWN5IGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9MT0FEX1BPTElDWShORVdUT1kobG9hZF9wb2xpY3ksICI8MT4xIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKKworY29uZmlnIExPQURfUE9MSUNZCisgIGJvb2wgImxvYWRfcG9saWN5IgorICBkZXBlbmRzIG9uIFRPWUJPWF9TRUxJTlVYCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGxvYWRfcG9saWN5IEZJTEUKKworICAgIExvYWQgdGhlIHNwZWNpZmllZCBwb2xpY3kgZmlsZS4KKyovCisKKyNkZWZpbmUgRk9SX2xvYWRfcG9saWN5CisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIGxvYWRfcG9saWN5X21haW4odm9pZCkKK3sKKyAgaW50IGZkID0geG9wZW5ybygqdG95cy5vcHRhcmdzKTsKKyAgb2ZmX3QgcG9saWN5X2xlbiA9IGZkbGVuZ3RoKGZkKTsKKyAgY2hhciAqcG9saWN5X2RhdGEgPSBtbWFwKDAsIHBvbGljeV9sZW4sIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKworICBjbG9zZShmZCk7CisgIGlmICghcG9saWN5X2RhdGEgfHwgc2VjdXJpdHlfbG9hZF9wb2xpY3kocG9saWN5X2RhdGEsIHBvbGljeV9sZW4pIDwgMCkKKyAgICBwZXJyb3JfZXhpdCgiQ291bGRuJ3QgJXMgJXMiLCBwb2xpY3lfZGF0YSA/ICJsb2FkIiA6ICJyZWFkIiwgKnRveXMub3B0YXJncyk7CisKKyAgbXVubWFwKHBvbGljeV9kYXRhLCBwb2xpY3lfbGVuKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvbG9nLmMgYi90b3lib3gvdG95cy9hbmRyb2lkL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTM3YjYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9hbmRyb2lkL2xvZy5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIGxvZy5jIC0gTG9nIHRvIGxvZ2NhdC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9MT0coTkVXVE9ZKGxvZywgIjwxcDp0OiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBMT0cKKyAgYm9vbCAibG9nIgorICBkZXBlbmRzIG9uIFRPWUJPWF9PTl9BTkRST0lECisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGxvZyBbLXAgUFJJXSBbLXQgVEFHXSBNRVNTQUdFLi4uCisKKyAgICBMb2dzIG1lc3NhZ2UgdG8gbG9nY2F0LgorCisgICAgLXAJdXNlIHRoZSBnaXZlbiBwcmlvcml0eSBpbnN0ZWFkIG9mIElORk86CisgICAgCWQ6IERFQlVHICBlOiBFUlJPUiAgZjogRkFUQUwgIGk6IElORk8gIHY6IFZFUkJPU0UgIHc6IFdBUk4gIHM6IFNJTEVOVAorICAgIC10CXVzZSB0aGUgZ2l2ZW4gdGFnIGluc3RlYWQgb2YgImxvZyIKKyovCisKKyNkZWZpbmUgRk9SX2xvZworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorCitHTE9CQUxTKAorICBjaGFyICp0YWc7CisgIGNoYXIgKnByaTsKKykKKwordm9pZCBsb2dfbWFpbih2b2lkKQoreworICBhbmRyb2lkX0xvZ1ByaW9yaXR5IHByaSA9IEFORFJPSURfTE9HX0lORk87CisgIGNoYXIgKnMgPSB0b3lidWY7CisgIGludCBpOworCisgIGlmIChUVC5wcmkpIHsKKyAgICBpID0gc3RyaWR4KCJkZWZpc3Z3IiwgdG9sb3dlcigqVFQucHJpKSk7CisgICAgaWYgKGk9PS0xIHx8IHN0cmxlbihUVC5wcmkpIT0xKSBlcnJvcl9leGl0KCJiYWQgLXAgJyVzJyIsIFRULnByaSk7CisgICAgcHJpID0gKGFuZHJvaWRfTG9nUHJpb3JpdHkgW10pe0FORFJPSURfTE9HX0RFQlVHLCBBTkRST0lEX0xPR19FUlJPUiwKKyAgICAgIEFORFJPSURfTE9HX0ZBVEFMLCBBTkRST0lEX0xPR19JTkZPLCBBTkRST0lEX0xPR19TSUxFTlQsCisgICAgICBBTkRST0lEX0xPR19WRVJCT1NFLCBBTkRST0lEX0xPR19XQVJOfVtpXTsKKyAgfQorICBpZiAoIVRULnRhZykgVFQudGFnID0gImxvZyI7CisKKyAgZm9yIChpID0gMDsgdG95cy5vcHRhcmdzW2ldOyBpKyspIHsKKyAgICBpZiAoaSkgKnMrKyA9ICcgJzsKKyAgICBpZiAoKHMtdG95YnVmKStzdHJsZW4odG95cy5vcHRhcmdzW2ldKT49MTAyNCkgeworICAgICAgbWVtY3B5KHMsIHRveXMub3B0YXJnc1tpXSwgMTAyNC0ocy10b3lidWYpKTsKKyAgICAgIHRveWJ1ZlsxMDI0XSA9IDA7CisgICAgICBwZXJyb3JfbXNnKCJsb2cgY3V0IGF0IDEwMjQgYnl0ZXMiKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIHMgPSBzdHBjcHkocywgdG95cy5vcHRhcmdzW2ldKTsKKyAgfQorCisgIF9fYW5kcm9pZF9sb2dfd3JpdGUocHJpLCBUVC50YWcsIHRveWJ1Zik7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9hbmRyb2lkL3Jlc3RvcmVjb24uYyBiL3RveWJveC90b3lzL2FuZHJvaWQvcmVzdG9yZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTZiM2YKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9hbmRyb2lkL3Jlc3RvcmVjb24uYwpAQCAtMCwwICsxLDQ3IEBACisvKiByZXN0b3JlY29uLmMgLSBSZXN0b3JlIGRlZmF1bHQgc2VjdXJpdHkgY29udGV4dHMgZm9yIGZpbGVzCisgKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitVU0VfUkVTVE9SRUNPTihORVdUT1kocmVzdG9yZWNvbiwgIjwxREZuUnJ2IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKKworY29uZmlnIFJFU1RPUkVDT04KKyAgYm9vbCAicmVzdG9yZWNvbiIKKyAgZGVwZW5kcyBvbiBUT1lCT1hfU0VMSU5VWAorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiByZXN0b3JlY29uIFstRF0gWy1GXSBbLVJdIFstbl0gWy12XSBGSUxFLi4uCisKKyAgICBSZXN0b3JlcyB0aGUgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0cyBmb3IgdGhlIGdpdmVuIGZpbGVzLgorCisgICAgLUQJYXBwbHkgdG8gL2RhdGEvZGF0YSB0b28KKyAgICAtRglmb3JjZSByZXNldAorICAgIC1SCXJlY3Vyc2UgaW50byBkaXJlY3RvcmllcworICAgIC1uCWRvbid0IG1ha2UgYW55IGNoYW5nZXM7IHVzZWZ1bCB3aXRoIC12IHRvIHNlZSB3aGF0IHdvdWxkIGNoYW5nZQorICAgIC12CXZlcmJvc2U6IHNob3cgYW55IGNoYW5nZXMKKyovCisKKyNkZWZpbmUgRk9SX3Jlc3RvcmVjb24KKyNpbmNsdWRlICJ0b3lzLmgiCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgorI2VuZGlmCisKK3ZvaWQgcmVzdG9yZWNvbl9tYWluKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyAgY2hhciAqKnM7CisgIGludCBmbGFncyA9IDA7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpIGZsYWdzIHw9IFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX0RBVEFEQVRBOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRikgZmxhZ3MgfD0gU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fRk9SQ0U7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgKEZMQUdfUnxGTEFHX3IpKQorICAgIGZsYWdzIHw9IFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0U7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSBmbGFncyB8PSBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9OT0NIQU5HRTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIGZsYWdzIHw9IFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1ZFUkJPU0U7CisKKyAgZm9yIChzID0gdG95cy5vcHRhcmdzOyAqczsgcysrKQorICAgIGlmIChzZWxpbnV4X2FuZHJvaWRfcmVzdG9yZWNvbigqcywgZmxhZ3MpIDwgMCkKKyAgICAgIHBlcnJvcl9tc2coInJlc3RvcmVjb24gZmFpbGVkOiAlcyIsICpzKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvYW5kcm9pZC9ydW5jb24uYyBiL3RveWJveC90b3lzL2FuZHJvaWQvcnVuY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMWNiZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2FuZHJvaWQvcnVuY29uLmMKQEAgLTAsMCArMSwyOCBAQAorLyogcnVuY29uLmMgLSBSdW4gY29tbWFuZCBpbiBzcGVjaWZpZWQgc2VjdXJpdHkgY29udGV4dAorICoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworVVNFX1JVTkNPTihORVdUT1kocnVuY29uLCAiPDIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgUlVOQ09OCisgIGJvb2wgInJ1bmNvbiIKKyAgZGVwZW5kcyBvbiBUT1lCT1hfU0VMSU5VWAorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBydW5jb24gQ09OVEVYVCBDT01NQU5EIFtBUkdTLi4uXQorCisgICAgUnVuIGEgY29tbWFuZCBpbiBhIHNwZWNpZmllZCBzZWN1cml0eSBjb250ZXh0LgorKi8KKworI2RlZmluZSBGT1JfcnVuY29uCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHJ1bmNvbl9tYWluKHZvaWQpCit7CisgIGNoYXIgKmNvbnRleHQgPSAqdG95cy5vcHRhcmdzOworCisgIGlmIChzZXRleGVjY29uKGNvbnRleHQpKSBwZXJyb3JfZXhpdCgiQ291bGQgbm90IHNldCBjb250ZXh0IHRvICVzIiwgY29udGV4dCk7CisKKyAgdG95cy5zdGFja3RvcCA9IDA7CisgIHhleGVjKCsrdG95cy5vcHRhcmdzKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvc2VuZGV2ZW50LmMgYi90b3lib3gvdG95cy9hbmRyb2lkL3NlbmRldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTgyZTAKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9hbmRyb2lkL3NlbmRldmVudC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIHNlbmRldmVudC5jIC0gU2VuZCBMaW51eCBpbnB1dCBldmVudHMuCisgKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitVU0VfU0VOREVWRU5UKE5FV1RPWShzZW5kZXZlbnQsICI8ND40IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19TQklOKSkKKworY29uZmlnIFNFTkRFVkVOVAorICBib29sICJzZW5kZXZlbnQiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9PTl9BTkRST0lECisgIGhlbHAKKyAgICB1c2FnZTogc2VuZGV2ZW50IERFVklDRSBUWVBFIENPREUgVkFMVUUKKworICAgIFNlbmRzIGEgTGludXggaW5wdXQgZXZlbnQuCisqLworCisjZGVmaW5lIEZPUl9zZW5kZXZlbnQKKyNpbmNsdWRlICJ0b3lzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCit2b2lkIHNlbmRldmVudF9tYWluKHZvaWQpCit7CisgIGludCBmZCA9IHhvcGVuKCp0b3lzLm9wdGFyZ3MsIE9fUkRXUik7CisgIGludCB2ZXJzaW9uOworICBzdHJ1Y3QgaW5wdXRfZXZlbnQgZXY7CisKKyAgaWYgKGlvY3RsKGZkLCBFVklPQ0dWRVJTSU9OLCAmdmVyc2lvbikpCisgICAgcGVycm9yX2V4aXQoIkVWSU9DR1ZFUlNJT04gZmFpbGVkIGZvciAlcyIsICp0b3lzLm9wdGFyZ3MpOworICAKKyAgbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisgIC8vIFRPRE86IGVycm9yIGNoZWNraW5nIGFuZCBzdXBwb3J0IGZvciBuYW1lZCBjb25zdGFudHMuCisgIGV2LnR5cGUgPSBhdG9pKHRveXMub3B0YXJnc1sxXSk7CisgIGV2LmNvZGUgPSBhdG9pKHRveXMub3B0YXJnc1syXSk7CisgIGV2LnZhbHVlID0gYXRvaSh0b3lzLm9wdGFyZ3NbM10pOworICB4d3JpdGUoZmQsICZldiwgc2l6ZW9mKGV2KSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9hbmRyb2lkL3NldGVuZm9yY2UuYyBiL3RveWJveC90b3lzL2FuZHJvaWQvc2V0ZW5mb3JjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTQ0ODQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9hbmRyb2lkL3NldGVuZm9yY2UuYwpAQCAtMCwwICsxLDMyIEBACisvKiBzZXRlbmZvcmNlLmMgLSBTZXQgdGhlIGN1cnJlbnQgU0VMaW51eCBtb2RlCisgKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitVU0VfU0VURU5GT1JDRShORVdUT1koc2V0ZW5mb3JjZSwgIjwxPjEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgU0VURU5GT1JDRQorICBib29sICJzZXRlbmZvcmNlIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfU0VMSU5VWAorICBoZWxwCisgICAgdXNhZ2U6IHNldGVuZm9yY2UgW2VuZm9yY2luZ3xwZXJtaXNzaXZlfDF8MF0KKworICAgIFNldHMgd2hldGhlciBTRUxpbnV4IGlzIGVuZm9yY2luZyAoMSkgb3IgcGVybWlzc2l2ZSAoMCkuCisqLworCisjZGVmaW5lIEZPUl9zZXRlbmZvcmNlCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHNldGVuZm9yY2VfbWFpbih2b2lkKQoreworICBjaGFyICpuZXcgPSAqdG95cy5vcHRhcmdzOworICBpbnQgc3RhdGUsIHJldDsKKworICBpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKSBlcnJvcl9leGl0KCJTRUxpbnV4IGlzIGRpc2FibGVkIik7CisgIGVsc2UgaWYgKCFzdHJjbXAobmV3LCAiMSIpIHx8ICFzdHJjYXNlY21wKG5ldywgImVuZm9yY2luZyIpKSBzdGF0ZSA9IDE7CisgIGVsc2UgaWYgKCFzdHJjbXAobmV3LCAiMCIpIHx8ICFzdHJjYXNlY21wKG5ldywgInBlcm1pc3NpdmUiKSkgc3RhdGUgPSAwOworICBlbHNlIGVycm9yX2V4aXQoIkludmFsaWQgc3RhdGU6ICVzIiwgbmV3KTsKKworICByZXQgPSBzZWN1cml0eV9zZXRlbmZvcmNlKHN0YXRlKTsKKyAgaWYgKHJldCA9PSAtMSkgcGVycm9yX21zZygiQ291bGRuJ3Qgc2V0IGVuZm9yY2luZyBzdGF0dXMgdG8gJyVzJyIsIG5ldyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9hbmRyb2lkL3NldHByb3AuYyBiL3RveWJveC90b3lzL2FuZHJvaWQvc2V0cHJvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTBkZTQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9hbmRyb2lkL3NldHByb3AuYwpAQCAtMCwwICsxLDU5IEBACisvKiBzZXRwcm9wLmMgLSBTZXQgYW4gQW5kcm9pZCBzeXN0ZW0gcHJvcGVydHkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9TRVRQUk9QKE5FV1RPWShzZXRwcm9wLCAiPDI+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBTRVRQUk9QCisgIGJvb2wgInNldHByb3AiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9PTl9BTkRST0lECisgIGhlbHAKKyAgICB1c2FnZTogc2V0cHJvcCBOQU1FIFZBTFVFCisKKyAgICBTZXRzIGFuIEFuZHJvaWQgc3lzdGVtIHByb3BlcnR5LgorKi8KKworI2RlZmluZSBGT1Jfc2V0cHJvcAorI2luY2x1ZGUgInRveXMuaCIKKworI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCit2b2lkIHNldHByb3BfbWFpbih2b2lkKQoreworICBjaGFyICpuYW1lID0gdG95cy5vcHRhcmdzWzBdLCAqdmFsdWUgPSB0b3lzLm9wdGFyZ3NbMV07CisgIGNoYXIgKnA7CisgIHNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKSwgdmFsdWVfbGVuID0gc3RybGVuKHZhbHVlKTsKKworICAvLyBwcm9wZXJ0eV9zZXQgZG9lc24ndCB0ZWxsIHVzIHdoeSBpdCBmYWlsZWQsIGFuZCBhY3R1YWxseSBjYW4ndAorICAvLyByZWNvZ25pemUgbW9zdCBmYWlsdXJlcyAoYmVjYXVzZSBpdCBkb2Vzbid0IHdhaXQgZm9yIGluaXQpLCBzbworICAvLyB3ZSBkdXBsaWNhdGUgYWxsIG9mIGluaXQncyBjaGVja3MgaGVyZSB0byBoZWxwIHRoZSB1c2VyLgorCisgIGlmIChuYW1lX2xlbiA+PSBQUk9QX05BTUVfTUFYKQorICAgIGVycm9yX2V4aXQoIm5hbWUgJyVzJyB0b28gbG9uZzsgdHJ5ICclLipzJyIsCisgICAgICAgICAgICAgICBuYW1lLCBQUk9QX05BTUVfTUFYIC0gMSwgbmFtZSk7CisgIGlmICh2YWx1ZV9sZW4gPj0gUFJPUF9WQUxVRV9NQVgpCisgICAgZXJyb3JfZXhpdCgidmFsdWUgJyVzJyB0b28gbG9uZzsgdHJ5ICclLipzJyIsCisgICAgICAgICAgICAgICB2YWx1ZSwgUFJPUF9WQUxVRV9NQVggLSAxLCB2YWx1ZSk7CisKKyAgaWYgKCpuYW1lID09ICcuJyB8fCBuYW1lW25hbWVfbGVuIC0gMV0gPT0gJy4nKQorICAgIGVycm9yX2V4aXQoInByb3BlcnR5IG5hbWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoICcuJyIpOworICBpZiAoc3Ryc3RyKG5hbWUsICIuLiIpKQorICAgIGVycm9yX2V4aXQoIicuLicgaXMgbm90IGFsbG93ZWQgaW4gYSBwcm9wZXJ0eSBuYW1lIik7CisgIGZvciAocCA9IG5hbWU7ICpwOyArK3ApCisgICAgaWYgKCFpc2FsbnVtKCpwKSAmJiAhc3RyY2hyKCJfLi0iLCAqcCkpCisgICAgICBlcnJvcl9leGl0KCJpbnZhbGlkIGNoYXJhY3RlciAnJWMnIGluIG5hbWUgJyVzJyIsICpwLCBuYW1lKTsKKworICBpZiAocHJvcGVydHlfc2V0KG5hbWUsIHZhbHVlKSkKKyAgICBlcnJvcl9tc2coImZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyB0byAnJXMnIiwgbmFtZSwgdmFsdWUpOworfQorCisjZWxzZQorCit2b2lkIHNldHByb3BfbWFpbih2b2lkKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2FuZHJvaWQvc3RhcnQuYyBiL3RveWJveC90b3lzL2FuZHJvaWQvc3RhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZhMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvYW5kcm9pZC9zdGFydC5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIHN0YXJ0LmMgLSBTdGFydC9zdG9wIHN5c3RlbSBzZXJ2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9TVEFSVChORVdUT1koc3RhcnQsICIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX1NUT1AoTkVXVE9ZKHN0b3AsICIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgU1RBUlQKKyAgYm9vbCAic3RhcnQiCisgIGRlcGVuZHMgb24gVE9ZQk9YX09OX0FORFJPSUQKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc3RhcnQgW1NFUlZJQ0UuLi5dCisKKyAgICBTdGFydHMgdGhlIGdpdmVuIHN5c3RlbSBzZXJ2aWNlLCBvciBuZXRkL3N1cmZhY2VmbGluZ2VyL3p5Z290ZXMuCisKK2NvbmZpZyBTVE9QCisgIGJvb2wgInN0b3AiCisgIGRlcGVuZHMgb24gVE9ZQk9YX09OX0FORFJPSUQKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc3RvcCBbU0VSVklDRS4uLl0KKworICAgIFN0b3AgdGhlIGdpdmVuIHN5c3RlbSBzZXJ2aWNlLCBvciBuZXRkL3N1cmZhY2VmbGluZ2VyL3p5Z290ZXMuCisqLworCisjZGVmaW5lIEZPUl9zdGFydAorI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3N0b3AoaW50IHN0YXJ0KQoreworICBjaGFyICpwcm9wZXJ0eSA9IHN0YXJ0ID8gImN0bC5zdGFydCIgOiAiY3RsLnN0b3AiOworICAvLyBudWxsIHRlcm1pbmF0ZWQgaW4gYm90aCBkaXJlY3Rpb25zCisgIGNoYXIgKnNlcnZpY2VzW10gPSB7MCwibmV0ZCIsInN1cmZhY2VmbGluZ2VyIiwienlnb3RlIiwienlnb3RlX3NlY29uZGFyeSIsMH0sCisgICAgICAgKipzcyA9IHRveXMub3B0YXJnczsKKyAgaW50IGRpcmVjdGlvbiA9IDE7CisKKyAgaWYgKGdldHVpZCgpKSBlcnJvcl9leGl0KCJtdXN0IGJlIHJvb3QiKTsKKworICBpZiAoISpzcykgeworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgb3B0YXJncywgaXRlcmF0ZSB0aHJvdWdoIHNlcnZpY2VzIGZvcndhcmQvYmFja3dhcmQuCisgICAgc3MgPSBzZXJ2aWNlcysxOworICAgIGlmICghc3RhcnQpIHNzID0gc2VydmljZXMrQVJSQVlfTEVOKHNlcnZpY2VzKS0yLCBkaXJlY3Rpb24gPSAtMTsKKyAgfQorCisgIGZvciAoOyAqc3M7IHNzICs9IGRpcmVjdGlvbikKKyAgICBpZiAocHJvcGVydHlfc2V0KHByb3BlcnR5LCAqc3MpKQorICAgICAgZXJyb3JfZXhpdCgiZmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIHRvICclcyciLCBwcm9wZXJ0eSwgKnNzKTsKK30KKwordm9pZCBzdGFydF9tYWluKHZvaWQpCit7CisgIHN0YXJ0X3N0b3AoMSk7Cit9CisKK3ZvaWQgc3RvcF9tYWluKHZvaWQpCit7CisgIHN0YXJ0X3N0b3AoMCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9lMmZzLmggYi90b3lib3gvdG95cy9lMmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1OTQxMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2UyZnMuaApAQCAtMCwwICsxLDE0MiBAQAorLyogbWtlMmZzLmggLSBIZWFkZXJzIGZvciBleHQyCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqLworCisvLyBTdHVmZiBkZWZpbmVkIGluIGxpbnV4L2V4dDJfZnMuaAorCisjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMgIDB4RUY1MworCitzdHJ1Y3QgZXh0Ml9zdXBlcmJsb2NrIHsKKyAgdWludDMyX3QgaW5vZGVzX2NvdW50OyAgICAgIC8vIElub2RlcyBjb3VudAorICB1aW50MzJfdCBibG9ja3NfY291bnQ7ICAgICAgLy8gQmxvY2tzIGNvdW50CisgIHVpbnQzMl90IHJfYmxvY2tzX2NvdW50OyAgICAvLyBSZXNlcnZlZCBibG9ja3MgY291bnQKKyAgdWludDMyX3QgZnJlZV9ibG9ja3NfY291bnQ7IC8vIEZyZWUgYmxvY2tzIGNvdW50CisgIHVpbnQzMl90IGZyZWVfaW5vZGVzX2NvdW50OyAvLyBGcmVlIGlub2RlcyBjb3VudAorICB1aW50MzJfdCBmaXJzdF9kYXRhX2Jsb2NrOyAgLy8gRmlyc3QgRGF0YSBCbG9jaworICB1aW50MzJfdCBsb2dfYmxvY2tfc2l6ZTsgICAgLy8gQmxvY2sgc2l6ZQorICB1aW50MzJfdCBsb2dfZnJhZ19zaXplOyAgICAgLy8gRnJhZ21lbnQgc2l6ZQorICB1aW50MzJfdCBibG9ja3NfcGVyX2dyb3VwOyAgLy8gQmxvY2tzIHBlciBncm91cAorICB1aW50MzJfdCBmcmFnc19wZXJfZ3JvdXA7ICAgLy8gRnJhZ21lbnRzIHBlciBncm91cAorICB1aW50MzJfdCBpbm9kZXNfcGVyX2dyb3VwOyAgLy8gSW5vZGVzIHBlciBncm91cAorICB1aW50MzJfdCBtdGltZTsgICAgICAgICAgICAgLy8gTW91bnQgdGltZQorICB1aW50MzJfdCB3dGltZTsgICAgICAgICAgICAgLy8gV3JpdGUgdGltZQorICB1aW50MTZfdCBtbnRfY291bnQ7ICAgICAgICAgLy8gTW91bnQgY291bnQKKyAgdWludDE2X3QgbWF4X21udF9jb3VudDsgICAgIC8vIE1heGltYWwgbW91bnQgY291bnQKKyAgdWludDE2X3QgbWFnaWM7ICAgICAgICAgICAgIC8vIE1hZ2ljIHNpZ25hdHVyZQorICB1aW50MTZfdCBzdGF0ZTsgICAgICAgICAgICAgLy8gRmlsZSBzeXN0ZW0gc3RhdGUKKyAgdWludDE2X3QgZXJyb3JzOyAgICAgICAgICAgIC8vIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAgdWludDE2X3QgbWlub3JfcmV2X2xldmVsOyAgIC8vIG1pbm9yIHJldmlzaW9uIGxldmVsCisgIHVpbnQzMl90IGxhc3RjaGVjazsgICAgICAgICAvLyB0aW1lIG9mIGxhc3QgY2hlY2sKKyAgdWludDMyX3QgY2hlY2tpbnRlcnZhbDsgICAgIC8vIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcworICB1aW50MzJfdCBjcmVhdG9yX29zOyAgICAgICAgLy8gT1MKKyAgdWludDMyX3QgcmV2X2xldmVsOyAgICAgICAgIC8vIFJldmlzaW9uIGxldmVsCisgIHVpbnQxNl90IGRlZl9yZXN1aWQ7ICAgICAgICAvLyBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzCisgIHVpbnQxNl90IGRlZl9yZXNnaWQ7ICAgICAgICAvLyBEZWZhdWx0IGdpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzCisgIHVpbnQzMl90IGZpcnN0X2lubzsgICAgICAgICAvLyBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUKKyAgdWludDE2X3QgaW5vZGVfc2l6ZTsgICAgICAgIC8vIHNpemUgb2YgaW5vZGUgc3RydWN0dXJlCisgIHVpbnQxNl90IGJsb2NrX2dyb3VwX25yOyAgICAvLyBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jaworICB1aW50MzJfdCBmZWF0dXJlX2NvbXBhdDsgICAgLy8gY29tcGF0aWJsZSBmZWF0dXJlIHNldAorICB1aW50MzJfdCBmZWF0dXJlX2luY29tcGF0OyAgLy8gaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0CisgIHVpbnQzMl90IGZlYXR1cmVfcm9fY29tcGF0OyAvLyByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0CisgIGNoYXIgICAgIHV1aWRbMTZdOyAgICAgICAgICAvLyAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZQorICBjaGFyICAgICB2b2x1bWVfbmFtZVsxNl07ICAgLy8gdm9sdW1lIG5hbWUKKyAgY2hhciAgICAgbGFzdF9tb3VudGVkWzY0XTsgIC8vIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQKKyAgdWludDMyX3QgYWxnX3VzYWdlX2JpdG1hcDsgIC8vIEZvciBjb21wcmVzc2lvbgorICAvLyBGb3IgRVhUMl9DT01QQVRfUFJFQUxMT0MKKyAgdWludDhfdCAgcHJlYWxsb2NfYmxvY2tzOyAgIC8vIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUKKyAgdWludDhfdCAgcHJlYWxsb2NfZGlyX2Jsb2NrczsgLy9OciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycworICB1aW50MTZfdCBwYWRkaW5nMTsKKyAgLy8gRm9yIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwKKyAgdWludDhfdCAgam91cm5hbF91dWlkWzE2XTsgICAvLyB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jaworICB1aW50MzJfdCBqb3VybmFsX2ludW07ICAgICAgIC8vIGlub2RlIG51bWJlciBvZiBqb3VybmFsIGZpbGUKKyAgdWludDMyX3Qgam91cm5hbF9kZXY7ICAgICAgICAvLyBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZQorICB1aW50MzJfdCBsYXN0X29ycGhhbjsgICAgICAgIC8vIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZQorICB1aW50MzJfdCBoYXNoX3NlZWRbNF07ICAgICAgIC8vIEhUUkVFIGhhc2ggc2VlZAorICB1aW50OF90ICBkZWZfaGFzaF92ZXJzaW9uOyAgIC8vIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZQorICB1aW50OF90ICBwYWRkaW5nMlszXTsKKyAgdWludDMyX3QgZGVmYXVsdF9tb3VudF9vcHRzOworICB1aW50MzJfdCBmaXJzdF9tZXRhX2JnOyAgICAgIC8vIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cAorICB1aW50MzJfdCBta2ZzX3RpbWU7ICAgICAgICAgIC8vIENyZWF0aW9uIHRpbWVzdGFtcAorICB1aW50MzJfdCBqbmxfYmxvY2tzWzE3XTsgICAgIC8vIEJhY2t1cCBvZiBqb3VybmFsIGlub2RlCisgIC8vIHVpbnQzMl90IHJlc2VydmVkWzE3Ml07ICAgICAgLy8gUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jaworfTsKKworc3RydWN0IGV4dDJfZ3JvdXAKK3sKKyAgdWludDMyX3QgYmxvY2tfYml0bWFwOyAgICAgICAvLyBCbG9jayBudW1iZXIgb2YgYmxvY2sgYml0bWFwCisgIHVpbnQzMl90IGlub2RlX2JpdG1hcDsgICAgICAgLy8gQmxvY2sgbnVtYmVyIG9mIGlub2RlIGJpdG1hcAorICB1aW50MzJfdCBpbm9kZV90YWJsZTsgICAgICAgIC8vIEJsb2NrIG51bWJlciBvZiBpbm9kZSB0YWJsZQorICB1aW50MTZfdCBmcmVlX2Jsb2Nrc19jb3VudDsgIC8vIEhvdyBtYW55IGZyZWUgYmxvY2tzIGluIHRoaXMgZ3JvdXA/CisgIHVpbnQxNl90IGZyZWVfaW5vZGVzX2NvdW50OyAgLy8gSG93IG1hbnkgZnJlZSBpbm9kZXMgaW4gdGhpcyBncm91cD8KKyAgdWludDE2X3QgdXNlZF9kaXJzX2NvdW50OyAgICAvLyBIb3cgbWFueSBkaXJlY3Rvcmllcz8KKyAgdWludDE2X3QgcmVzZXJ2ZWRbN107ICAgICAgICAvLyBwYWQgdG8gMzIgYnl0ZXMKK307CisKK3N0cnVjdCBleHQyX2RlbnRyeSB7CisgIHVpbnQzMl90IGlub2RlOyAgICAgICAgIC8vIElub2RlIG51bWJlcgorICB1aW50MTZfdCByZWNfbGVuOyAgICAgICAvLyBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoCisgIHVpbnQ4X3QgIG5hbWVfbGVuOyAgICAgIC8vIE5hbWUgbGVuZ3RoCisgIHVpbnQ4X3QgIGZpbGVfdHlwZTsKKyAgY2hhciAgICAgbmFtZVswXTsgICAgIC8vIEZpbGUgbmFtZQorfTsKKworc3RydWN0IGV4dDJfaW5vZGUgeworICB1aW50MTZfdCBtb2RlOyAgICAgICAgLy8gRmlsZSBtb2RlCisgIHVpbnQxNl90IHVpZDsgICAgICAgICAvLyBMb3cgMTYgYml0cyBvZiBPd25lciBVaWQKKyAgdWludDMyX3Qgc2l6ZTsgICAgICAgIC8vIFNpemUgaW4gYnl0ZXMKKyAgdWludDMyX3QgYXRpbWU7ICAgICAgIC8vIEFjY2VzcyB0aW1lCisgIHVpbnQzMl90IGN0aW1lOyAgICAgICAvLyBDcmVhdGlvbiB0aW1lCisgIHVpbnQzMl90IG10aW1lOyAgICAgICAvLyBNb2RpZmljYXRpb24gdGltZQorICB1aW50MzJfdCBkdGltZTsgICAgICAgLy8gRGVsZXRpb24gVGltZQorICB1aW50MTZfdCBnaWQ7ICAgICAgICAgLy8gTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQKKyAgdWludDE2X3QgbGlua3NfY291bnQ7IC8vIExpbmtzIGNvdW50CisgIHVpbnQzMl90IGJsb2NrczsgICAgICAvLyBCbG9ja3MgY291bnQKKyAgdWludDMyX3QgZmxhZ3M7ICAgICAgIC8vIEZpbGUgZmxhZ3MKKyAgdWludDMyX3QgcmVzZXJ2ZWQxOworICB1aW50MzJfdCBibG9ja1sxNV07ICAgLy8gUG9pbnRlcnMgdG8gYmxvY2tzCisgIHVpbnQzMl90IGdlbmVyYXRpb247ICAvLyBGaWxlIHZlcnNpb24gKGZvciBORlMpCisgIHVpbnQzMl90IGZpbGVfYWNsOyAgICAvLyBGaWxlIEFDTAorICB1aW50MzJfdCBkaXJfYWNsOyAgICAgLy8gRGlyZWN0b3J5IEFDTCAob3IgdG9wIGJpdHMgb2YgZmlsZSBsZW5ndGgpCisgIHVpbnQzMl90IGZhZGRyOyAgICAgICAvLyBMYXN0IGJsb2NrIGluIGZpbGUKKyAgdWludDhfdCAgZnJhZzsgICAgICAgIC8vIEZyYWdtZW50IG51bWJlcgorICB1aW50OF90ICBmc2l6ZTsgICAgICAgLy8gRnJhZ21lbnQgc2l6ZQorICB1aW50MTZfdCBwYWQxOworICB1aW50MTZfdCB1aWRfaGlnaDsgICAgLy8gSGlnaCBiaXRzIG9mIHVpZAorICB1aW50MTZfdCBnaWRfaGlnaDsgICAgLy8gSGlnaCBiaXRzIG9mIGdpZAorICB1aW50MzJfdCByZXNlcnZlZDI7Cit9OworCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0lNQUdJQ19JTk9ERVMJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PCQkweDAwMTAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgJCTB4MDAyMAorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNAorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHCQkweDAwMTAKKworI2RlZmluZSBFWFQyX05BTUVfTEVOIDI1NQorCisvLyBFeHQyIGRpcmVjdG9yeSBmaWxlIHR5cGVzLiAgT25seSB0aGUgbG93IDMgYml0cyBhcmUgdXNlZC4gIFRoZQorLy8gb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIG5vdy4KKworZW51bSB7CisgIEVYVDJfRlRfVU5LTk9XTiwKKyAgRVhUMl9GVF9SRUdfRklMRSwKKyAgRVhUMl9GVF9ESVIsCisgIEVYVDJfRlRfQ0hSREVWLAorICBFWFQyX0ZUX0JMS0RFViwKKyAgRVhUMl9GVF9GSUZPLAorICBFWFQyX0ZUX1NPQ0ssCisgIEVYVDJfRlRfU1lNTElOSywKKyAgRVhUMl9GVF9NQVgKK307CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9leGFtcGxlL1JFQURNRSBiL3RveWJveC90b3lzL2V4YW1wbGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjY2MzEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9leGFtcGxlL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0V4YW1wbGUgY29tbWFuZHMKKworWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gZGVwbG95IHRoaXMsIGJ1dCBpdCBzaG93cyBob3cgdG8gdXNlIHRoZQordG95Ym94IGluZnJhc3RydWN0dXJlIGFuZCBwcm92aWRlcyB0ZW1wbGF0ZXMgZm9yIG5ldyBjb21tYW5kcy4KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2V4YW1wbGUvaGVsbG8uYyBiL3RveWJveC90b3lzL2V4YW1wbGUvaGVsbG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdkMjdiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvZXhhbXBsZS9oZWxsby5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGhlbGxvLmMgLSBBIGhlbGxvIHdvcmxkIHByb2dyYW0uIChTaW1wbGUgdGVtcGxhdGUgZm9yIG5ldyBjb21tYW5kcy4pCisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzLworICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvY21kYmVoYXYuaHRtbAorCitVU0VfSEVMTE8oTkVXVE9ZKGhlbGxvLCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBIRUxMTworICBib29sICJoZWxsbyIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogaGVsbG8gWy1zXQorCisgICAgQSBoZWxsbyB3b3JsZCBwcm9ncmFtLiAgWW91IGRvbid0IG5lZWQgdGhpcy4KKworICAgIE1vc3RseSB1c2VkIGFzIGEgc2ltcGxlIHRlbXBsYXRlIGZvciBhZGRpbmcgbmV3IGNvbW1hbmRzLgorICAgIE9jY2FzaW9uYWxseSBuaWNlIHRvIHNtb2tldGVzdCBrZXJuZWwgYm9vdGluZyB2aWEgImluaXQ9L3Vzci9iaW4vaGVsbG8iLgorKi8KKworI2RlZmluZSBGT1JfaGVsbG8KKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGludCB1bnVzZWQ7CispCisKK3ZvaWQgaGVsbG9fbWFpbih2b2lkKQoreworICB4cHJpbnRmKCJIZWxsbyB3b3JsZFxuIik7CisKKyAgLy8gQXZvaWQga2VybmVsIHBhbmljIGlmIHJ1biBhcyBpbml0LgorICBpZiAoZ2V0cGlkKCkgPT0gMSkgd2FpdCgmVFQudW51c2VkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2V4YW1wbGUvc2tlbGV0b24uYyBiL3RveWJveC90b3lzL2V4YW1wbGUvc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY3YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvZXhhbXBsZS9za2VsZXRvbi5jCkBAIC0wLDAgKzEsMTA0IEBACisvKiBza2VsZXRvbi5jIC0gRXhhbXBsZSBwcm9ncmFtIHRvIGFjdCBhcyB0ZW1wbGF0ZSBmb3IgbmV3IGNvbW1hbmRzLgorICogICAgICAgICAgICAgIChBbHRob3VnaCByZWFsbHksIGhhbGYgdGhlIHRpbWUgY29weWluZyBoZWxsby5jIGlzIGVhc2llci4pCisgKgorICogQ29weXJpZ2h0IDIwMTQgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzLworICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvY21kYmVoYXYuaHRtbAorCisvLyBBY2NlcHQgbWFueSBkaWZmZXJlbnQga2luZHMgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChzZWUgdG9wIG9mIGxpYi9hcmdzLmMpCisvLyBEZW1vbnN0cmF0ZSB0d28gY29tbWFuZHMgaW4gdGhlIHNhbWUgZmlsZSAoc2VlIHd3dy9kb2N1bWVudGF0aW9uLmh0bWwpCisKK1VTRV9TS0VMRVRPTihORVdUT1koc2tlbGV0b24sICIod2FscnVzKShibHViYmVyKTo7KGFsc28pOmVAZCpjI2I6YSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TS0VMRVRPTl9BTElBUyhORVdUT1koc2tlbGV0b25fYWxpYXMsICJiI2RxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgU0tFTEVUT04KKyAgYm9vbCAic2tlbGV0b24iCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHNrZWxldG9uIFstYV0gWy1iIFNUUklOR10gWy1jIE5VTUJFUl0gWy1kIExJU1RdIFstZSBDT1VOVF0gWy4uLl0KKworICAgIFRlbXBsYXRlIGZvciBuZXcgY29tbWFuZHMuIFlvdSBkb24ndCBuZWVkIHRoaXMuCisKKyAgICBXaGVuIGNyZWF0aW5nIGEgbmV3IGNvbW1hbmQsIGNvcHkgdGhpcyBmaWxlIGFuZCBkZWxldGUgdGhlIHBhcnRzIHlvdQorICAgIGRvbid0IG5lZWQuIEJlIHN1cmUgdG8gcmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mICJza2VsZXRvbiIgKHVwcGVyIGFuZCBsb3dlcgorICAgIGNhc2UpIHdpdGggeW91ciBuZXcgY29tbWFuZCBuYW1lLgorCisgICAgRm9yIHNpbXBsZSBjb21tYW5kcywgImhlbGxvLmMiIGlzIHByb2JhYmx5IGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgorCitjb25maWcgU0tFTEVUT05fQUxJQVMKKyAgYm9vbCAic2tlbGV0b25fYWxpYXMiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHNrZWxldG9uX2FsaWFzIFstZHFdIFstYiBOVU1CRVJdCisKKyAgICBFeGFtcGxlIG9mIGEgc2Vjb25kIGNvbW1hbmQgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzIGluIHRoZSBzYW1lIHNvdXJjZQorICAgIGZpbGUgYXMgdGhlIGZpcnN0LiBUaGlzIGFsbG93cyBzaGFyZWQgaW5mcmFzdHJ1Y3R1cmUgbm90IGFkZGVkIHRvIGxpYi8uCisqLworCisjZGVmaW5lIEZPUl9za2VsZXRvbgorI2luY2x1ZGUgInRveXMuaCIKKworLy8gVGhlIHVuaW9uIGxldHMgbGliL2FyZ3MuYyBzdG9yZSBhcmd1bWVudHMgZm9yIGVpdGhlciBjb21tYW5kLgorLy8gSXQncyBjdXN0b21hcnkgdG8gcHV0IGEgc3BhY2UgYmV0d2VlbiBhcmd1bWVudCB2YXJpYWJsZXMgYW5kIG90aGVyIGdsb2JhbHMuCitHTE9CQUxTKAorICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgKmJfc3RyaW5nOworICAgICAgbG9uZyBjX251bWJlcjsKKyAgICAgIHN0cnVjdCBhcmdfbGlzdCAqZF9saXN0OworICAgICAgbG9uZyBlX2NvdW50OworICAgICAgY2hhciAqYWxzb19zdHJpbmc7CisgICAgICBjaGFyICpibHViYmVyX3N0cmluZzsKKyAgICB9IHM7CisgICAgc3RydWN0IHsKKyAgICAgIGxvbmcgYl9udW1iZXI7CisgICAgfSBhOworICB9OworCisgIGludCBtb3JlX2dsb2JhbHM7CispCisKKy8vIERvbid0IGJsaW5kbHkgYnVpbGQgYWxseWVzY29uZmlnLiBUaGUgbWF4aW11bSBfc2FuZV8gY29uZmlnIGlzIGRlZmNvbmZpZy4KKyN3YXJuaW5nIHNrZWxldG9uLmMgaXMganVzdCBhbiBleGFtcGxlLCBub3Qgc29tZXRoaW5nIHRvIGRlcGxveS4KKworLy8gUGFyc2UgbWFueSBkaWZmZXJlbnQga2luZHMgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ogordm9pZCBza2VsZXRvbl9tYWluKHZvaWQpCit7CisgIGNoYXIgKipvcHRhcmdzOworCisgIHByaW50ZigiUmFuICVzXG4iLCB0b3lzLndoaWNoLT5uYW1lKTsKKworICAvLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBwYXJzaW5nIGlzIGRvbmUgZm9yIHlvdSBieSBsaWIvYXJncy5jIGNhbGxlZAorICAvLyBmcm9tIG1haW4uYyB1c2luZyB0aGUgb3B0c3RyaW5nIGluIHRoZSBORVdUT1kgbWFjcm9zLiBEaXNwbGF5IHJlc3VsdHMuCisgIGlmICh0b3lzLm9wdGZsYWdzKSBwcmludGYoImZsYWdzPSVsbHhcbiIsIHRveXMub3B0ZmxhZ3MpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgcHJpbnRmKCJTYXcgYVxuIik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSBwcmludGYoImI9JXNcbiIsIFRULnMuYl9zdHJpbmcpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgcHJpbnRmKCJjPSVsZFxuIiwgVFQucy5jX251bWJlcik7CisgIHdoaWxlIChUVC5zLmRfbGlzdCkgeworICAgIHByaW50ZigiZD0lc1xuIiwgVFQucy5kX2xpc3QtPmFyZyk7CisgICAgVFQucy5kX2xpc3QgPSBUVC5zLmRfbGlzdC0+bmV4dDsKKyAgfQorICBpZiAoVFQucy5lX2NvdW50KSBwcmludGYoImUgd2FzIHNlZW4gJWxkIHRpbWVzXG4iLCBUVC5zLmVfY291bnQpOworICBmb3IgKG9wdGFyZ3MgPSB0b3lzLm9wdGFyZ3M7ICpvcHRhcmdzOyBvcHRhcmdzKyspCisgICAgcHJpbnRmKCJvcHRhcmc9JXNcbiIsICpvcHRhcmdzKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3dhbHJ1cykgcHJpbnRmKCJTYXcgLS13YWxydXNcbiIpOworICBpZiAoVFQucy5ibHViYmVyX3N0cmluZykgcHJpbnRmKCItLWJsdWJiZXI9JXNcbiIsIFRULnMuYmx1YmJlcl9zdHJpbmcpOworCisgIHByaW50ZigiT3RoZXIgZ2xvYmFscyBzaG91bGQgc3RhcnQgemVyb2VkOiAlZFxuIiwgVFQubW9yZV9nbG9iYWxzKTsKK30KKworLy8gU3dpdGNoIGdlYXJzIGZyb20gc2tlbGV0b24gdG8gc2tlbGV0b25fYWxpYXMgKHN3YXAgRkxBRyBtYWNyb3MpLgorI2RlZmluZSBDTEVBTlVQX3NrZWxldG9uCisjZGVmaW5lIEZPUl9za2VsZXRvbl9hbGlhcworI2luY2x1ZGUgImdlbmVyYXRlZC9mbGFncy5oIgorCit2b2lkIHNrZWxldG9uX2FsaWFzX21haW4odm9pZCkKK3sKKyAgcHJpbnRmKCJSYW4gJXNcbiIsIHRveXMud2hpY2gtPm5hbWUpOworICBwcmludGYoImZsYWdzPSVsbHhcbiIsIHRveXMub3B0ZmxhZ3MpOworCisgIC8vIE5vdGUsIHRoaXMgRkxBR19iIGlzIGEgZGlmZmVyZW50IGJpdCBwb3NpdGlvbiB0aGFuIHRoZSBvdGhlciBGTEFHX2IsCisgIC8vIGFuZCBmaWxscyBvdXQgYSBkaWZmZXJlbnQgdmFyaWFibGUgb2YgYSBkaWZmZXJlbnQgdHlwZS4KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpIHByaW50ZigiYj0lbGQiLCBUVC5hLmJfbnVtYmVyKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2V4YW1wbGUvdGVzdF9odW1hbl9yZWFkYWJsZS5jIGIvdG95Ym94L3RveXMvZXhhbXBsZS90ZXN0X2h1bWFuX3JlYWRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmZjI2MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2V4YW1wbGUvdGVzdF9odW1hbl9yZWFkYWJsZS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHRlc3RfaHVtYW5fcmVhZGFibGUuYyAtIEV4cG9zZSBsaWIvbGliLmMgaHVtYW5fcmVhZGFibGUoKSBmb3IgdGVzdGluZy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitVU0VfVEVTVF9IVU1BTl9SRUFEQUJMRShORVdUT1kodGVzdF9odW1hbl9yZWFkYWJsZSwgIjwxPjFpYnMiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBURVNUX0hVTUFOX1JFQURBQkxFCisgIGJvb2wgInRlc3RfaHVtYW5fcmVhZGFibGUiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHRlc3RfaHVtYW5fcmVhZGFibGUgWy1zYmldIE5VTUJFUgorKi8KKworI2RlZmluZSBGT1JfdGVzdF9odW1hbl9yZWFkYWJsZQorI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB0ZXN0X2h1bWFuX3JlYWRhYmxlX21haW4odm9pZCkKK3sKKyAgY2hhciAqYzsKKworICBodW1hbl9yZWFkYWJsZSh0b3lidWYsIHN0cnRvbGwoKnRveXMub3B0YXJncywgJmMsIDApLCB0b3lzLm9wdGZsYWdzKTsKKyAgcHJpbnRmKCIlc1xuIiwgdG95YnVmKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2V4YW1wbGUvdGVzdF9tYW55X29wdGlvbnMuYyBiL3RveWJveC90b3lzL2V4YW1wbGUvdGVzdF9tYW55X29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcxZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvZXhhbXBsZS90ZXN0X21hbnlfb3B0aW9ucy5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHRlc3RfbWFueV9vcHRpb25zLmMgLSB0ZXN0IG1vcmUgdGhhbiAzMiBiaXRzIHdvcnRoIG9mIG9wdGlvbiBmbGFncworICoKKyAqIENvcHlyaWdodCAyMDE1IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKK1VTRV9URVNUX01BTllfT1BUSU9OUyhORVdUT1kodGVzdF9tYW55X29wdGlvbnMsICJaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQXp5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgVEVTVF9NQU5ZX09QVElPTlMKKyAgYm9vbCAidGVzdF9tYW55X29wdGlvbnMiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHRlc3RfbWFueV9vcHRpb25zIC1bYS16QS1aXQorCisgICAgUHJpbnQgdGhlIG9wdGZsYWdzIHZhbHVlIG9mIHRoZSBjb21tYW5kIGFyZ3VtZW50cywgaW4gaGV4LgorKi8KKworI2RlZmluZSBGT1JfdGVzdF9tYW55X29wdGlvbnMKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgdGVzdF9tYW55X29wdGlvbnNfbWFpbih2b2lkKQoreworICB4cHJpbnRmKCJvcHRmbGFncz0lbGx4XG4iLCB0b3lzLm9wdGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2V4YW1wbGUvdGVzdF9zY2Fua2V5LmMgYi90b3lib3gvdG95cy9leGFtcGxlL3Rlc3Rfc2NhbmtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTAwMjcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9leGFtcGxlL3Rlc3Rfc2NhbmtleS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIHRlc3Rfc2NhbmtleS5jIC0gY29sbGF0ZSBpbmNvbWluZyBhbnNpIGVzY2FwZSBzZXF1ZW5jZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBUT0RPIHNpZ3dpbmNoCisKK1VTRV9URVNUX1NDQU5LRVkoTkVXVE9ZKHRlc3Rfc2NhbmtleSwgMCwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgVEVTVF9TQ0FOS0VZCisgIGJvb2wgInRlc3Rfc2NhbmtleSIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogdGVzdF9zY2Fua2V5CisKKyAgICBNb3ZlIGEgbGV0dGVyIGFyb3VuZCB0aGUgc2NyZWVuLiBIaXQgRVNDIHRvIGV4aXQuCisqLworCisjZGVmaW5lIEZPUl90ZXN0X3NjYW5rZXkKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgdGVzdF9zY2Fua2V5X21haW4odm9pZCkKK3sKKyAgdGltZV90IHRbMl07CisgIHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQsIHRpY2s7CisgIGNoYXIgYyA9ICdYJywgc2NyYXRjaFsxNl07CisgIGludCBrZXksIHgsIHk7CisKKyAgdFswXSA9IHRbMV0gPSB4ID0gdGljayA9IDA7CisgIG1lbXNldChzY3JhdGNoLCAwLCAxNik7CisgIHkgPSAxOworCisgIHNpZ2F0ZXhpdCh0dHlfc2lncmVzZXQpOyAgLy8gTWFrZSBjdHJsLWMgcmVzdG9yZSB0dHkKKyAgdHR5X2VzYygiPzI1bCIpOyAgICAgICAgICAvLyBoaWRlIGN1cnNvcgorICB0dHlfZXNjKCIwbSIpOyAgICAgICAgICAgIC8vIHJlc2V0IGNvbG9yIHRvIGRlZmF1bHQKKyAgdHR5X2VzYygiMkoiKTsgICAgICAgICAgICAvLyBDbGVhciBzY3JlZW4KKyAgeHNldF90ZXJtaW5hbCgxLCAxLCAwKTsgICAgLy8gUmF3IG1vZGUKKworICBmb3IgKDs7KSB7CisgICAgdHR5X2p1bXAoeCwgeSk7CisgICAgeHB1dGMoYyk7CisgICAgdFsxJisrdGlja10gPSB0aW1lKDApOworICAgIGlmICh0WzBdICE9IHRbMV0pIHRlcm1pbmFsX3Byb2Jlc2l6ZSgmd2lkdGgsICZoZWlnaHQpOworICAgIC8vIERvbid0IGJsb2NrIGZpcnN0IHRpbWUgdGhyb3VnaCwgdG8gZm9yY2UgaGVhZGVyIHByaW50CisgICAga2V5ID0gc2Nhbl9rZXlfZ2V0c2l6ZShzY3JhdGNoLCAtMSohIXRbMF0sICZ3aWR0aCwgJmhlaWdodCk7CisgICAgdHR5X2p1bXAoMCwgMCk7CisgICAgcHJpbnRmKCJFU0MgdG8gZXhpdDogIik7CisgICAgLy8gUHJpbnQgdW5rbm93biBlc2NhcGUgc2VxdWVuY2UKKyAgICBpZiAoKnNjcmF0Y2gpIHsKKyAgICAgIHByaW50Zigia2V5PVtFU0MiKTsKKyAgICAgIC8vIEZldGNoIHJlc3Qgb2Ygc2VxdWVuY2UgYWZ0ZXIgZGV2aWF0aW9uLCB0aW1lIGdhcCBkZXRlcm1pbmVzIGVuZAorICAgICAgd2hpbGUgKDA8KGtleSA9IHNjYW5fa2V5X2dldHNpemUoc2NyYXRjaCwgMCwgJndpZHRoLCAmaGVpZ2h0KSkpCisgICAgICAgIHByaW50ZigiJWMiLCBrZXkpOworICAgICAgcHJpbnRmKCJdICIpOworICAgIH0gZWxzZSBwcmludGYoImtleT0lZCAiLCBrZXkpOworICAgIHByaW50ZigieD0lZCB5PSVkIHdpZHRoPSVkIGhlaWdodD0lZFwwMzNbSyIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIGZmbHVzaCgwKTsKKworICAgIGlmIChrZXkgPT0gLTIpIGNvbnRpbnVlOworICAgIGlmIChrZXkgPD0gJyAnKSBicmVhazsKKyAgICBpZiAoa2V5Pj0yNTYpIHsKKyAgICAgIHR0eV9qdW1wKHgsIHkpOworICAgICAgeHB1dGMoJyAnKTsKKworICAgICAga2V5IC09IDI1NjsKKyAgICAgIGlmIChrZXk9PUtFWV9VUCkgeS0tOworICAgICAgZWxzZSBpZiAoa2V5PT1LRVlfRE9XTikgeSsrOworICAgICAgZWxzZSBpZiAoa2V5PT1LRVlfUklHSFQpIHgrKzsKKyAgICAgIGVsc2UgaWYgKGtleT09S0VZX0xFRlQpIHgtLTsKKyAgICAgIGVsc2UgaWYgKGtleT09S0VZX1BHVVApIHkgPSAwOworICAgICAgZWxzZSBpZiAoa2V5PT1LRVlfUEdETikgeSA9IDk5OTsKKyAgICAgIGVsc2UgaWYgKGtleT09S0VZX0hPTUUpIHggPSAwOworICAgICAgZWxzZSBpZiAoa2V5PT1LRVlfRU5EKSB4ID0gOTk5OworICAgICAgaWYgKHk8MSkgeSA9IDE7CisgICAgICBpZiAoeT49aGVpZ2h0KSB5ID0gaGVpZ2h0LTE7CisgICAgICBpZiAoeDwwKSB4ID0gMDsKKyAgICAgIGlmICh4Pj13aWR0aCkgeCA9IHdpZHRoLTE7CisgICAgfSBlbHNlIGMgPSBrZXk7CisgIH0KKyAgdHR5X3Jlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2IvUkVBRE1FIGIvdG95Ym94L3RveXMvbHNiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRkMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL1JFQURNRQpAQCAtMCwwICsxLDcgQEAKK0xpbnV4IFN0YW5kYXJkIEJhc2UgY29tbWFuZHMKKworQ29tbWFuZHMgZGVmaW5lZCBpbiB0aGUgTGludXggU3RhbmRhcmQgQmFzZSA0LjE6CitodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL2NtZGJlaGF2Lmh0bWwKKworRG93bmxvYWRhYmxlIGFzIG9uZSBiaWcgZmlsZSBmcm9tOgoraHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy5odG1sCmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2IvZG1lc2cuYyBiL3RveWJveC90b3lzL2xzYi9kbWVzZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDg0NDYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9sc2IvZG1lc2cuYwpAQCAtMCwwICsxLDcxIEBACisvKiBkbWVzZy5jIC0gZGlzcGxheS9jb250cm9sIGtlcm5lbCByaW5nIGJ1ZmZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvZG1lc2cuaHRtbAorCisvLyBXZSBjYXJlIHRoYXQgRkxBR19jIGlzIDEsIHNvIGtlZXAgYyBhdCB0aGUgZW5kLgorVVNFX0RNRVNHKE5FV1RPWShkbWVzZywgInRycyM8MW4jY1shdHJdIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgRE1FU0cKKyAgYm9vbCAiZG1lc2ciCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGRtZXNnIFstY10gWy1yfC10XSBbLW4gTEVWRUxdIFstcyBTSVpFXQorCisgICAgUHJpbnQgb3IgY29udHJvbCB0aGUga2VybmVsIHJpbmcgYnVmZmVyLgorCisgICAgLWMJQ2xlYXIgdGhlIHJpbmcgYnVmZmVyIGFmdGVyIHByaW50aW5nCisgICAgLW4JU2V0IGtlcm5lbCBsb2dnaW5nIExFVkVMICgxLTkpCisgICAgLXIJUmF3IG91dHB1dCAod2l0aCA8bGV2ZWwgbWFya2Vycz4pCisgICAgLXMJU2hvdyB0aGUgbGFzdCBTSVpFIG1hbnkgYnl0ZXMKKyAgICAtdAlEb24ndCBwcmludCBrZXJuZWwncyB0aW1lc3RhbXBzCisqLworCisjZGVmaW5lIEZPUl9kbWVzZworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxzeXMva2xvZy5oPgorCitHTE9CQUxTKAorICBsb25nIGxldmVsOworICBsb25nIHNpemU7CispCisKK3ZvaWQgZG1lc2dfbWFpbih2b2lkKQoreworICAvLyBGb3IgLW4ganVzdCB0ZWxsIGtlcm5lbCB0byB3aGljaCBtZXNzYWdlcyB0byBrZWVwLgorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfbikgeworICAgIGlmIChrbG9nY3RsKDgsIE5VTEwsIFRULmxldmVsKSkgcGVycm9yX2V4aXQoImtsb2djdGwiKTsKKyAgfSBlbHNlIHsKKyAgICBjaGFyICpkYXRhLCAqdG8sICpmcm9tOworICAgIGludCBzaXplOworCisgICAgLy8gRmlndXJlIG91dCBob3cgbXVjaCBkYXRhIHdlIG5lZWQsIGFuZCBmZXRjaCBpdC4KKyAgICBzaXplID0gVFQuc2l6ZTsKKyAgICBpZiAoIXNpemUgJiYgMT4oc2l6ZSA9IGtsb2djdGwoMTAsIDAsIDApKSkgcGVycm9yX2V4aXQoImtsb2djdGwiKTs7CisgICAgZGF0YSA9IHRvID0gZnJvbSA9IHhtYWxsb2Moc2l6ZSsxKTsKKyAgICBzaXplID0ga2xvZ2N0bCgzICsgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpLCBkYXRhLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA8IDApIHBlcnJvcl9leGl0KCJrbG9nY3RsIik7CisgICAgZGF0YVtzaXplXSA9IDA7CisKKyAgICAvLyBGaWx0ZXIgb3V0IGxldmVsIG1hcmtlcnMgYW5kIG9wdGlvbmFsbHkgdGltZSBtYXJrZXJzCisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfcikpIHdoaWxlICgoZnJvbSAtIGRhdGEpIDwgc2l6ZSkgeworICAgICAgaWYgKGZyb20gPT0gZGF0YSB8fCBmcm9tWy0xXSA9PSAnXG4nKSB7CisgICAgICAgIGNoYXIgKnRvOworCisgICAgICAgIGlmICgqZnJvbSA9PSAnPCcgJiYgKHRvID0gc3RyY2hyKGZyb20sICc+JykpKSBmcm9tID0gKyt0bzsKKyAgICAgICAgaWYgKCh0b3lzLm9wdGZsYWdzJkZMQUdfdCkgJiYgKmZyb20gPT0gJ1snICYmICh0byA9IHN0cmNocihmcm9tLCAnXScpKSkKKyAgICAgICAgICBmcm9tID0gdG8rMSsodG9bMV09PScgJyk7CisgICAgICB9CisgICAgICAqKHRvKyspID0gKihmcm9tKyspOworICAgIH0gZWxzZSB0byA9IGRhdGErc2l6ZTsKKworICAgIC8vIFdyaXRlIHJlc3VsdC4gVGhlIG9kZHMgb2Ygc29tZWJvZHkgcmVxdWVzdGluZyBhIGJ1ZmZlciBvZiBzaXplIDMgYW5kCisgICAgLy8gZ2V0dGluZyAiPDE+IiBhcmUgcmVtb3RlLCBidXQgZG9uJ3Qgc2VnZmF1bHQgaWYgdGhleSBkby4KKyAgICBpZiAodG8gIT0gZGF0YSkgeworICAgICAgeHdyaXRlKDEsIGRhdGEsIHRvLWRhdGEpOworICAgICAgaWYgKHRvWy0xXSAhPSAnXG4nKSB4cHV0YygnXG4nKTsKKyAgICB9CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShkYXRhKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbHNiL2hvc3RuYW1lLmMgYi90b3lib3gvdG95cy9sc2IvaG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBkMWZiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL2hvc3RuYW1lLmMKQEAgLTAsMCArMSw1MSBAQAorLyogaG9zdG5hbWUuYyAtIEdldC9TZXQgdGhlIGhvc3RuYW1lCisgKgorICogQ29weXJpZ2h0IDIwMTIgQW5kcmUgUmVuYXVkIDxhbmRyZUBibHVld2F0ZXJzeXMuY29tPgorICoKKyAqIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvaG9zdG5hbWUuaHRtbAorCitVU0VfSE9TVE5BTUUoTkVXVE9ZKGhvc3RuYW1lLCAiYkY6IiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgSE9TVE5BTUUKKyAgYm9vbCAiaG9zdG5hbWUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGhvc3RuYW1lIFstYl0gWy1GIEZJTEVOQU1FXSBbbmV3bmFtZV0KKworICAgIEdldC9TZXQgdGhlIGN1cnJlbnQgaG9zdG5hbWUKKworICAgIC1iICBTZXQgaG9zdG5hbWUgdG8gJ2xvY2FsaG9zdCcgaWYgb3RoZXJ3aXNlIHVuc2V0CisgICAgLUYgIFNldCBob3N0bmFtZSB0byBjb250ZW50cyBvZiBGSUxFTkFNRQorKi8KKworI2RlZmluZSBGT1JfaG9zdG5hbWUKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmZuYW1lOworKQorCit2b2lkIGhvc3RuYW1lX21haW4odm9pZCkKK3sKKyAgY2hhciAqaG9zdG5hbWUgPSAqdG95cy5vcHRhcmdzOworCisgIGlmIChUVC5mbmFtZSAmJiAoaG9zdG5hbWUgPSB4cmVhZGZpbGUoVFQuZm5hbWUsIDAsIDApKSkgeworICAgIGlmICghKmNob21wKGhvc3RuYW1lKSkgeworICAgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShob3N0bmFtZSk7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzJkZMQUdfYikpIGVycm9yX2V4aXQoImVtcHR5ICclcyciLCBUVC5mbmFtZSk7CisgICAgICBob3N0bmFtZSA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKCFob3N0bmFtZSAmJiAodG95cy5vcHRmbGFncyZGTEFHX2IpKQorICAgIGlmIChnZXRob3N0bmFtZSh0b3lidWYsIHNpemVvZih0b3lidWYpLTEpIHx8ICEqdG95YnVmKQorICAgICAgaG9zdG5hbWUgPSAibG9jYWxob3N0IjsKKworICBpZiAoaG9zdG5hbWUpIHsKKyAgICBpZiAoc2V0aG9zdG5hbWUoaG9zdG5hbWUsIHN0cmxlbihob3N0bmFtZSkpKQorICAgICAgcGVycm9yX2V4aXQoInNldCAnJXMnIiwgaG9zdG5hbWUpOworICB9IGVsc2UgeworICAgIGlmIChnZXRob3N0bmFtZSh0b3lidWYsIHNpemVvZih0b3lidWYpLTEpKSBwZXJyb3JfZXhpdCgiZ2V0aG9zdG5hbWUiKTsKKyAgICB4cHV0cyh0b3lidWYpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2Iva2lsbGFsbC5jIGIvdG95Ym94L3RveXMvbHNiL2tpbGxhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzcyYjQzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL2tpbGxhbGwuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoga2lsbGFsbC5jIC0gU2VuZCBzaWduYWwgKGRlZmF1bHQ6IFRFUk0pIHRvIGFsbCBwcm9jZXNzZXMgd2l0aCBnaXZlbiBuYW1lcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBbmRyZWFzIEhlY2sgPGFoZWNrQGdteC5kZT4KKyAqCisgKiBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL2tpbGxhbGwuaHRtbAorCitVU0VfS0lMTEFMTChORVdUT1koa2lsbGFsbCwgIj9zOmxxdmkiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBLSUxMQUxMCisgIGJvb2wgImtpbGxhbGwiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGtpbGxhbGwgWy1sXSBbLWlxdl0gWy1TSUdOQUx8LXMgU0lHTkFMXSBQUk9DRVNTX05BTUUuLi4KKworICAgIFNlbmQgYSBzaWduYWwgKGRlZmF1bHQ6IFRFUk0pIHRvIGFsbCBwcm9jZXNzZXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZXMuCisKKyAgICAtaQlhc2sgZm9yIGNvbmZpcm1hdGlvbiBiZWZvcmUga2lsbGluZworICAgIC1sCXByaW50IGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBzaWduYWxzCisgICAgLXEJZG9uJ3QgcHJpbnQgYW55IHdhcm5pbmdzIG9yIGVycm9yIG1lc3NhZ2VzCisgICAgLXMJc2VuZCBTSUdOQUwgaW5zdGVhZCBvZiBTSUdURVJNCisgICAgLXYJcmVwb3J0IGlmIHRoZSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBzZW50CisqLworCisjZGVmaW5lIEZPUl9raWxsYWxsCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpzaWc7CisKKyAgaW50IHNpZ251bTsKKyAgcGlkX3QgY3VyX3BpZDsKKyAgY2hhciAqKm5hbWVzOworICBzaG9ydCAqZXJyOworKQorCitzdGF0aWMgaW50IGtpbGxfcHJvY2VzcyhwaWRfdCBwaWQsIGNoYXIgKm5hbWUpCit7CisgIGludCBvZmZzZXQgPSAwOworCisgIGlmIChwaWQgPT0gVFQuY3VyX3BpZCkgcmV0dXJuIDA7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNpZ25hbCAlcyglZCkiLCBuYW1lLCAoaW50KXBpZCk7CisgICAgaWYgKCF5ZXNubygwKSkgcmV0dXJuIDA7CisgIH0KKworICBlcnJubyA9IDA7CisgIGtpbGwocGlkLCBUVC5zaWdudW0pOworICBmb3IgKDs7KSB7CisgICAgaWYgKFRULm5hbWVzW29mZnNldF0gPT0gbmFtZSkgeworICAgICAgVFQuZXJyW29mZnNldF0gPSBlcnJubzsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBvZmZzZXQrKzsKKyAgfQorICBpZiAoZXJybm8pIHsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkgcGVycm9yX21zZygicGlkICVkIiwgKGludClwaWQpOworICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpCisgICAgcHJpbnRmKCJLaWxsZWQgJXMoJWQpIHdpdGggc2lnbmFsICVkXG4iLCBuYW1lLCBwaWQsIFRULnNpZ251bSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga2lsbGFsbF9tYWluKHZvaWQpCit7CisgIGludCBpOworCisgIFRULm5hbWVzID0gdG95cy5vcHRhcmdzOworICBUVC5zaWdudW0gPSBTSUdURVJNOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSB7CisgICAgc2lnX3RvX251bShOVUxMKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoVFQuc2lnIHx8ICgqVFQubmFtZXMgJiYgKipUVC5uYW1lcyA9PSAnLScpKSB7CisgICAgaWYgKDAgPiAoVFQuc2lnbnVtID0gc2lnX3RvX251bShUVC5zaWcgPyBUVC5zaWcgOiAoKlRULm5hbWVzKSsxKSkpIHsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSBleGl0KDEpOworICAgICAgZXJyb3JfZXhpdCgiSW52YWxpZCBzaWduYWwiKTsKKyAgICB9CisgICAgaWYgKCFUVC5zaWcpIHsKKyAgICAgIFRULm5hbWVzKys7CisgICAgICB0b3lzLm9wdGMtLTsKKyAgICB9CisgIH0KKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSAmJiAhdG95cy5vcHRjKSBoZWxwX2V4aXQoIm5vIG5hbWUiKTsKKworICBUVC5jdXJfcGlkID0gZ2V0cGlkKCk7CisKKyAgVFQuZXJyID0geG1hbGxvYygyKnRveXMub3B0Yyk7CisgIGZvciAoaT0wOyBpPHRveXMub3B0YzsgaSsrKSBUVC5lcnJbaV0gPSBFU1JDSDsKKyAgbmFtZXNfdG9fcGlkKFRULm5hbWVzLCBraWxsX3Byb2Nlc3MpOworICBmb3IgKGk9MDsgaTx0b3lzLm9wdGM7IGkrKykgeworICAgIGlmIChUVC5lcnJbaV0pIHsKKyAgICAgIHRveXMuZXhpdHZhbCA9IDE7CisgICAgICBlcnJubyA9IFRULmVycltpXTsKKyAgICAgIHBlcnJvcl9tc2dfcmF3KFRULm5hbWVzW2ldKTsKKyAgICB9CisgIH0KKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShUVC5lcnIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbHNiL21kNXN1bS5jIGIvdG95Ym94L3RveXMvbHNiL21kNXN1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmRjODcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9sc2IvbWQ1c3VtLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qIG1kNXN1bS5jIC0gQ2FsY3VsYXRlIFJGQyAxMzIxIG1kNSBoYXNoIGFuZCBzaGExIGhhc2guCisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy9tZDVzdW0uaHRtbAorICogYW5kIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgKgorICogVGhleSdyZSBjb21iaW5lZCB0aGlzIHdheSB0byBzaGFyZSBpbmZyYXN0cnVjdHVyZSwgYW5kIGJlY2F1c2UgbWQ1c3VtIGlzCisgKiBhbmQgTFNCIHN0YW5kYXJkIGNvbW1hbmQgKGJ1dCBzaGExc3VtIGFuZCBuZXdlciBoYXNoZXMgYXJlIGEgZ29vZCBpZGVhLAorICogc2VlIGh0dHA6Ly92YWxlcmllYXVyb3JhLm9yZy9oYXNoLmh0bWwpLgorICoKKyAqIFdlIG9wdGlvbmFsbHkgdXNlIG9wZW5zc2wgKG9yIGVxdWl2YWxlbnQpIHRvIGFjY2VzcyBhc3NlbWJseSBvcHRpbWl6ZWQKKyAqIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucywgYnV0IHByb3ZpZGUgYSBidWlsdC1pbiB2ZXJzaW9uIHRvIHJlZHVjZQorICogcmVxdWlyZWQgZGVwZW5kZW5jaWVzLgorCitVU0VfTUQ1U1VNKE5FV1RPWShtZDVzdW0sICJiYypbIWJjXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TSEExU1VNKE5FV1RPWShzaGExc3VtLCAiYmMqWyFiY10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0hBMjI0U1VNKE9MRFRPWShzaGEyMjRzdW0sIHNoYTFzdW0sIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9TSEEyNTZTVU0oT0xEVE9ZKHNoYTI1NnN1bSwgc2hhMXN1bSwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1NIQTM4NFNVTShPTERUT1koc2hhMzg0c3VtLCBzaGExc3VtLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfU0hBNTEyU1VNKE9MRFRPWShzaGE1MTJzdW0sIHNoYTFzdW0sIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIE1ENVNVTQorICBib29sICJtZDVzdW0iCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG1kNXN1bSBbLWJdIFstYyBGSUxFXSBbRklMRV0uLi4KKworICAgIENhbGN1bGF0ZSBtZDUgaGFzaCBmb3IgZWFjaCBpbnB1dCBmaWxlLCByZWFkaW5nIGZyb20gc3RkaW4gaWYgbm9uZS4KKyAgICBPdXRwdXQgb25lIGhhc2ggKDMyIGhleCBkaWdpdHMpIGZvciBlYWNoIGlucHV0IGZpbGUsIGZvbGxvd2VkIGJ5IGZpbGVuYW1lLgorCisgICAgLWIJYnJpZWYgKGhhc2ggb25seSwgbm8gZmlsZW5hbWUpCisgICAgLWMJQ2hlY2sgZWFjaCBsaW5lIG9mIEZJTEUgaXMgdGhlIHNhbWUgaGFzaCtmaWxlbmFtZSB3ZSdkIG91dHB1dC4KKworY29uZmlnIFNIQTFTVU0KKyAgYm9vbCAic2hhMXN1bSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc2hhP3N1bSBbLWJdIFstYyBGSUxFXSBbRklMRV0uLi4KKworICAgIGNhbGN1bGF0ZSBzaGEgaGFzaCBmb3IgZWFjaCBpbnB1dCBmaWxlLCByZWFkaW5nIGZyb20gc3RkaW4gaWYgbm9uZS4gT3V0cHV0CisgICAgb25lIGhhc2ggKDQwIGhleCBkaWdpdHMgZm9yIHNoYTEsIDU2IGZvciBzaGEyMjQsIDY0IGZvciBzaGEyNTYsIDk2IGZvciBzaGEzODQsCisgICAgYW5kIDEyOCBmb3Igc2hhNTEyKSBmb3IgZWFjaCBpbnB1dCBmaWxlLCBmb2xsb3dlZCBieSBmaWxlbmFtZS4KKworICAgIC1iCWJyaWVmIChoYXNoIG9ubHksIG5vIGZpbGVuYW1lKQorICAgIC1jCUNoZWNrIGVhY2ggbGluZSBvZiBGSUxFIGlzIHRoZSBzYW1lIGhhc2grZmlsZW5hbWUgd2UnZCBvdXRwdXQuCisKK2NvbmZpZyBTSEEyMjRTVU0KKyAgYm9vbCAic2hhMjI0c3VtIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfTElCQ1JZUFRPCisgIGhlbHAKKyAgICBTZWUgc2hhMXN1bQorCitjb25maWcgU0hBMjU2U1VNCisgIGJvb2wgInNoYTI1NnN1bSIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX0xJQkNSWVBUTworICBoZWxwCisgICAgU2VlIHNoYTFzdW0KKworY29uZmlnIFNIQTM4NFNVTQorICBib29sICJzaGEzODRzdW0iCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9MSUJDUllQVE8KKyAgaGVscAorICAgIFNlZSBzaGExc3VtCisKK2NvbmZpZyBTSEE1MTJTVU0KKyAgYm9vbCAic2hhNTEyc3VtIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfTElCQ1JZUFRPCisgIGhlbHAKKyAgICBTZWUgc2hhMXN1bQorKi8KKworI2RlZmluZSBGT1JDRV9GTEFHUworI2RlZmluZSBGT1JfbWQ1c3VtCisjaW5jbHVkZSAidG95cy5oIgorCisjaWYgQ0ZHX1RPWUJPWF9MSUJDUllQVE8KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjZWxzZQordHlwZWRlZiBpbnQgU0hBNTEyX0NUWDsKKyNlbmRpZgorCitHTE9CQUxTKAorICBzdHJ1Y3QgYXJnX2xpc3QgKmM7CisKKyAgaW50IHNhd2xpbmU7CisKKyAgLy8gQ3J5cHRvIHZhcmlhYmxlcyBibGFua2VkIGFmdGVyIHN1bW1pbmcKKyAgdW5zaWduZWQgc3RhdGVbNV07CisgIHVuc2lnbmVkIG9sZHN0YXRlWzVdOworICB1aW50NjRfdCBjb3VudDsKKyAgdW5pb24geworICAgIGNoYXIgY1s2NF07CisgICAgdW5zaWduZWQgaVsxNl07CisgIH0gYnVmZmVyOworKQorCisjZGVmaW5lIHJvbCh2YWx1ZSwgYml0cykgKCgodmFsdWUpIDw8IChiaXRzKSkgfCAoKHZhbHVlKSA+PiAoMzIgLSAoYml0cykpKSkKKworLy8gZm9yKGk9MDsgaTw2NDsgaSsrKSBtZDV0YWJsZVtpXSA9IGFicyhzaW4oaSsxKSkqKDE8PDMyKTsgIEJ1dCBjYWxjdWxhdGluZworLy8gdGhhdCBpbnZvbHZlcyBub3QganVzdCBmbG9hdGluZyBwb2ludCBidXQgcHVsbGluZyBpbiAtbG0gKGFuZCBhcmd1aW5nIHdpdGgKKy8vIEMgYWJvdXQgd2hldGhlciAxPDwzMiBpcyBhIHZhbGlkIHRoaW5nIHRvIGRvIG9uIDMyIGJpdCBwbGF0Zm9ybXMpIHNvOgorCitzdGF0aWMgdWludDMyX3QgbWQ1dGFibGVbNjRdID0geworICAweGQ3NmFhNDc4LCAweGU4YzdiNzU2LCAweDI0MjA3MGRiLCAweGMxYmRjZWVlLCAweGY1N2MwZmFmLCAweDQ3ODdjNjJhLAorICAweGE4MzA0NjEzLCAweGZkNDY5NTAxLCAweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLAorICAweDZiOTAxMTIyLCAweGZkOTg3MTkzLCAweGE2Nzk0MzhlLCAweDQ5YjQwODIxLCAweGY2MWUyNTYyLCAweGMwNDBiMzQwLAorICAweDI2NWU1YTUxLCAweGU5YjZjN2FhLCAweGQ2MmYxMDVkLCAweDAyNDQxNDUzLCAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LAorICAweDIxZTFjZGU2LCAweGMzMzcwN2Q2LCAweGY0ZDUwZDg3LCAweDQ1NWExNGVkLCAweGE5ZTNlOTA1LCAweGZjZWZhM2Y4LAorICAweDY3NmYwMmQ5LCAweDhkMmE0YzhhLCAweGZmZmEzOTQyLCAweDg3NzFmNjgxLCAweDZkOWQ2MTIyLCAweGZkZTUzODBjLAorICAweGE0YmVlYTQ0LCAweDRiZGVjZmE5LCAweGY2YmI0YjYwLCAweGJlYmZiYzcwLCAweDI4OWI3ZWM2LCAweGVhYTEyN2ZhLAorICAweGQ0ZWYzMDg1LCAweDA0ODgxZDA1LCAweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LAorICAweGY0MjkyMjQ0LCAweDQzMmFmZjk3LCAweGFiOTQyM2E3LCAweGZjOTNhMDM5LCAweDY1NWI1OWMzLCAweDhmMGNjYzkyLAorICAweGZmZWZmNDdkLCAweDg1ODQ1ZGQxLCAweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLAorICAweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBtZDVyb3RbNjRdID0geworICA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLAorICA1LCAgOSwgMTQsIDIwLCA1LCAgOSwgMTQsIDIwLCA1LCAgOSwgMTQsIDIwLCA1LCAgOSwgMTQsIDIwLAorICA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLAorICA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxCit9OworCisvLyBNaXggbmV4dCA2NCBieXRlcyBvZiBkYXRhIGludG8gbWQ1IGhhc2gKKworc3RhdGljIHZvaWQgbWQ1X3RyYW5zZm9ybSh2b2lkKQoreworICB1bnNpZ25lZCB4WzRdLCAqYiA9IFRULmJ1ZmZlci5pOworICBpbnQgaTsKKworICBtZW1jcHkoeCwgVFQuc3RhdGUsIHNpemVvZih4KSk7CisKKyAgZm9yIChpPTA7IGk8NjQ7IGkrKykgeworICAgIHVuc2lnbmVkIGludCBpbiwgdGVtcCwgc3dhcDsKKyAgICBpZiAoaTwxNikgeworICAgICAgaW4gPSBpOworICAgICAgdGVtcCA9IHhbMV07CisgICAgICB0ZW1wID0gKHRlbXAgJiB4WzJdKSB8ICgofnRlbXApICYgeFszXSk7CisgICAgfSBlbHNlIGlmIChpPDMyKSB7CisgICAgICBpbiA9ICgxKyg1KmkpKSYxNTsKKyAgICAgIHRlbXAgPSB4WzNdOworICAgICAgdGVtcCA9ICh4WzFdICYgdGVtcCkgfCAoeFsyXSAmIH50ZW1wKTsKKyAgICB9IGVsc2UgaWYgKGk8NDgpIHsKKyAgICAgIGluID0gKDMqaSs1KSYxNTsKKyAgICAgIHRlbXAgPSB4WzFdIF4geFsyXSBeIHhbM107CisgICAgfSBlbHNlIHsKKyAgICAgIGluID0gKDcqaSkmMTU7CisgICAgICB0ZW1wID0geFsyXSBeICh4WzFdIHwgfnhbM10pOworICAgIH0KKyAgICB0ZW1wICs9IHhbMF0gKyBiW2luXSArIG1kNXRhYmxlW2ldOworICAgIHN3YXAgPSB4WzNdOworICAgIHhbM10gPSB4WzJdOworICAgIHhbMl0gPSB4WzFdOworICAgIHhbMV0gKz0gcm9sKHRlbXAsIG1kNXJvdFtpXSk7CisgICAgeFswXSA9IHN3YXA7CisgIH0KKyAgZm9yIChpPTA7IGk8NDsgaSsrKSBUVC5zdGF0ZVtpXSArPSB4W2ldOworfQorCisvLyBNaXggbmV4dCA2NCBieXRlcyBvZiBkYXRhIGludG8gc2hhMSBoYXNoLgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcmNvbnN0c1tdPXsweDVBODI3OTk5LDB4NkVEOUVCQTEsMHg4RjFCQkNEQywweENBNjJDMUQ2fTsKKworc3RhdGljIHZvaWQgc2hhMV90cmFuc2Zvcm0odm9pZCkKK3sKKyAgaW50IGksIGosIGssIGNvdW50OworICB1bnNpZ25lZCAqYmxvY2sgPSBUVC5idWZmZXIuaTsKKyAgdW5zaWduZWQgKnJvdFs1XSwgKnRlbXA7CisKKyAgLy8gQ29weSBjb250ZXh0LT5zdGF0ZVtdIHRvIHdvcmtpbmcgdmFycworICBmb3IgKGk9MDsgaTw1OyBpKyspIHsKKyAgICBUVC5vbGRzdGF0ZVtpXSA9IFRULnN0YXRlW2ldOworICAgIHJvdFtpXSA9IFRULnN0YXRlICsgaTsKKyAgfQorICAvLyA0IHJvdW5kcyBvZiAyMCBvcGVyYXRpb25zIGVhY2guCisgIGZvciAoaT1jb3VudD0wOyBpPDQ7IGkrKykgeworICAgIGZvciAoaj0wOyBqPDIwOyBqKyspIHsKKyAgICAgIHVuc2lnbmVkIHdvcms7CisKKyAgICAgIHdvcmsgPSAqcm90WzJdIF4gKnJvdFszXTsKKyAgICAgIGlmICghaSkgd29yayA9ICh3b3JrICYgKnJvdFsxXSkgXiAqcm90WzNdOworICAgICAgZWxzZSB7CisgICAgICAgIGlmIChpPT0yKSB3b3JrID0gKCgqcm90WzFdfCpyb3RbMl0pJipyb3RbM10pfCgqcm90WzFdJipyb3RbMl0pOworICAgICAgICBlbHNlIHdvcmsgXj0gKnJvdFsxXTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpICYmIGo8MTYpCisgICAgICAgIHdvcmsgKz0gYmxvY2tbY291bnRdID0gKHJvbChibG9ja1tjb3VudF0sMjQpJjB4RkYwMEZGMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHJvbChibG9ja1tjb3VudF0sOCkmMHgwMEZGMDBGRik7CisgICAgICBlbHNlCisgICAgICAgIHdvcmsgKz0gYmxvY2tbY291bnQmMTVdID0gcm9sKGJsb2NrWyhjb3VudCsxMykmMTVdCisgICAgICAgICAgICAgIF4gYmxvY2tbKGNvdW50KzgpJjE1XSBeIGJsb2NrWyhjb3VudCsyKSYxNV0gXiBibG9ja1tjb3VudCYxNV0sIDEpOworICAgICAgKnJvdFs0XSArPSB3b3JrICsgcm9sKCpyb3RbMF0sNSkgKyByY29uc3RzW2ldOworICAgICAgKnJvdFsxXSA9IHJvbCgqcm90WzFdLDMwKTsKKworICAgICAgLy8gUm90YXRlIGJ5IG9uZSBmb3IgbmV4dCB0aW1lLgorICAgICAgdGVtcCA9IHJvdFs0XTsKKyAgICAgIGZvciAoaz00OyBrOyBrLS0pIHJvdFtrXSA9IHJvdFtrLTFdOworICAgICAgKnJvdCA9IHRlbXA7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICAvLyBBZGQgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiBzdGF0ZVtdCisgIGZvciAoaT0wOyBpPDU7IGkrKykgVFQuc3RhdGVbaV0gKz0gVFQub2xkc3RhdGVbaV07Cit9CisKKy8vIEZpbGwgdGhlIDY0LWJ5dGUgd29ya2luZyBidWZmZXIgYW5kIGNhbGwgdHJhbnNmb3JtKCkgd2hlbiBmdWxsLgorCitzdGF0aWMgdm9pZCBoYXNoX3VwZGF0ZShjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICgqdHJhbnNmb3JtKSh2b2lkKSkKK3sKKyAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgaiA9IFRULmNvdW50ICYgNjM7CisgIFRULmNvdW50ICs9IGxlbjsKKworICBmb3IgKDs7KSB7CisgICAgLy8gR3JhYiBuZXh0IGNodW5rIG9mIGRhdGEsIHJldHVybiBpZiBpdCdzIG5vdCBlbm91Z2ggdG8gcHJvY2VzcyBhIGZyYW1lCisgICAgaSA9IDY0IC0gajsKKyAgICBpZiAoaT5sZW4pIGkgPSBsZW47CisgICAgbWVtY3B5KFRULmJ1ZmZlci5jK2osIGRhdGEsIGkpOworICAgIGlmIChqK2kgIT0gNjQpIGJyZWFrOworCisgICAgLy8gUHJvY2VzcyBhIGZyYW1lCisgICAgaWYgKElTX0JJR19FTkRJQU4pCisgICAgICBmb3IgKGo9MDsgajwxNjsgaisrKSBUVC5idWZmZXIuaVtqXSA9IFNXQVBfTEUzMihUVC5idWZmZXIuaVtqXSk7CisgICAgdHJhbnNmb3JtKCk7CisgICAgaj0wOworICAgIGRhdGEgKz0gaTsKKyAgICBsZW4gLT0gaTsKKyAgfQorfQorCisvLyBJbml0aWFsaXplIGFycmF5IHRlcnNlbHkKKyNkZWZpbmUgSEFTSF9JTklUKG5hbWUsIHByZWZpeCkgeyBuYW1lLCAodm9pZCAqKXByZWZpeCMjX0luaXQsIFwKKyAgKHZvaWQgKilwcmVmaXgjI19VcGRhdGUsICh2b2lkICopcHJlZml4IyNfRmluYWwsIFwKKyAgcHJlZml4IyNfRElHRVNUX0xFTkdUSCwgfQorI2RlZmluZSBTSEExX0RJR0VTVF9MRU5HVEggU0hBX0RJR0VTVF9MRU5HVEgKKworLy8gQ2FsbCB0aGUgYXNzZW1ibHkgb3B0aW1pemVkIGxpYnJhcnkgY29kZSB3aGVuIENGR19UT1lCT1hfTElCQ1JZUFRPCitzdGF0aWMgdm9pZCBkb19saWJfaGFzaChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIC8vIExhcmdlc3QgY29udGV4dAorICBTSEE1MTJfQ1RYIGN0eDsKKyAgc3RydWN0IGhhc2ggeworICAgIGNoYXIgKm5hbWU7CisgICAgaW50ICgqaW5pdCkodm9pZCAqKTsKKyAgICBpbnQgKCp1cGRhdGUpKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOworICAgIGludCAoKmZpbmFsKSh2b2lkICosIHZvaWQgKik7CisgICAgaW50IGRpZ2VzdF9sZW5ndGg7CisgIH0gYWxnb3JpdGhtc1tdID0geworICAgIFVTRV9UT1lCT1hfTElCQ1JZUFRPKAorICAgICAgVVNFX01ENVNVTShIQVNIX0lOSVQoIm1kNXN1bSIsIE1ENSksKQorICAgICAgVVNFX1NIQTFTVU0oSEFTSF9JTklUKCJzaGExc3VtIiwgU0hBMSksKQorICAgICAgVVNFX1NIQTIyNFNVTShIQVNIX0lOSVQoInNoYTIyNHN1bSIsIFNIQTIyNCksKQorICAgICAgVVNFX1NIQTI1NlNVTShIQVNIX0lOSVQoInNoYTI1NnN1bSIsIFNIQTI1NiksKQorICAgICAgVVNFX1NIQTM4NFNVTShIQVNIX0lOSVQoInNoYTM4NHN1bSIsIFNIQTM4NCksKQorICAgICAgVVNFX1NIQTUxMlNVTShIQVNIX0lOSVQoInNoYTUxMnN1bSIsIFNIQTUxMiksKQorICAgICkKKyAgfSwgKiBoYXNoOworICBpbnQgaTsKKworICAvLyBUaGlzIHNob3VsZCBuZXZlciBOT1QgbWF0Y2gsIHNvIG5vIG5lZWQgdG8gY2hlY2sKKyAgZm9yIChpID0gMDsgaTxBUlJBWV9MRU4oYWxnb3JpdGhtcyk7IGkrKykKKyAgICBpZiAoIXN0cmNtcCh0b3lzLndoaWNoLT5uYW1lLCBhbGdvcml0aG1zW2ldLm5hbWUpKSBicmVhazsKKyAgaGFzaCA9IGFsZ29yaXRobXMraTsKKworICBoYXNoLT5pbml0KCZjdHgpOworICBmb3IgKDs7KSB7CisgICAgICBpID0gcmVhZChmZCwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgICBpZiAoaTwxKSBicmVhazsKKyAgICAgIGhhc2gtPnVwZGF0ZSgmY3R4LCB0b3lidWYsIGkpOworICB9CisgIGhhc2gtPmZpbmFsKHRveWJ1ZisxMjgsICZjdHgpOworCisgIGZvciAoaSA9IDA7IGk8aGFzaC0+ZGlnZXN0X2xlbmd0aDsgaSsrKQorICAgIHNwcmludGYodG95YnVmKzIqaSwgIiUwMngiLCB0b3lidWZbaSsxMjhdKTsKK30KKworLy8gQ2FsbGJhY2sgZm9yIGxvb3BmaWxlcygpCisKK3N0YXRpYyB2b2lkIGRvX2J1aWx0aW5faGFzaChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHVpbnQ2NF90IGNvdW50OworICBpbnQgaSwgc2hhMT10b3lzLndoaWNoLT5uYW1lWzBdPT0ncyc7CisgIGNoYXIgYnVmOworICB2b2lkICgqdHJhbnNmb3JtKSh2b2lkKTsKKworICAvKiBTSEExIGluaXRpYWxpemF0aW9uIGNvbnN0YW50cyAgKG1kNXN1bSB1c2VzIGZpcnN0IDQpICovCisgIFRULnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKyAgVFQuc3RhdGVbMV0gPSAweEVGQ0RBQjg5OworICBUVC5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgIFRULnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKKyAgVFQuc3RhdGVbNF0gPSAweEMzRDJFMUYwOworICBUVC5jb3VudCA9IDA7CisKKyAgdHJhbnNmb3JtID0gc2hhMSA/IHNoYTFfdHJhbnNmb3JtIDogbWQ1X3RyYW5zZm9ybTsKKyAgZm9yICg7OykgeworICAgIGkgPSByZWFkKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAoaTwxKSBicmVhazsKKyAgICBoYXNoX3VwZGF0ZSh0b3lidWYsIGksIHRyYW5zZm9ybSk7CisgIH0KKworICBjb3VudCA9IFRULmNvdW50IDw8IDM7CisKKyAgLy8gRW5kIHRoZSBtZXNzYWdlIGJ5IGFwcGVuZGluZyBhICIxIiBiaXQgdG8gdGhlIGRhdGEsIGVuZGluZyB3aXRoIHRoZQorICAvLyBtZXNzYWdlIHNpemUgKGluIGJpdHMsIGJpZyBlbmRpYW4pLCBhbmQgYWRkaW5nIGVub3VnaCB6ZXJvIGJpdHMgaW4KKyAgLy8gYmV0d2VlbiB0byBwYWQgdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCA2NC1ieXRlIGZyYW1lLgorICAvLworICAvLyBTaW5jZSBvdXIgaW5wdXQgdXAgdG8gbm93IGhhcyBiZWVuIGluIHdob2xlIGJ5dGVzLCB3ZSBjYW4gZGVhbCB3aXRoCisgIC8vIGJ5dGVzIGhlcmUgdG9vLgorCisgIGJ1ZiA9IDB4ODA7CisgIGRvIHsKKyAgICBoYXNoX3VwZGF0ZSgmYnVmLCAxLCB0cmFuc2Zvcm0pOworICAgIGJ1ZiA9IDA7CisgIH0gd2hpbGUgKChUVC5jb3VudCAmIDYzKSAhPSA1Nik7CisgIGNvdW50ID0gc2hhMSA/IFNXQVBfQkU2NChjb3VudCkgOiBTV0FQX0xFNjQoY291bnQpOworICBoYXNoX3VwZGF0ZSgodm9pZCAqKSZjb3VudCwgOCwgdHJhbnNmb3JtKTsKKworICBpZiAoc2hhMSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICAgIHNwcmludGYodG95YnVmKzIqaSwgIiUwMngiLCAyNTUmKFRULnN0YXRlW2k+PjJdID4+ICgoMy0oaSAmIDMpKSAqIDgpKSk7CisgIGVsc2UgZm9yIChpPTA7IGk8NDsgaSsrKSBzcHJpbnRmKHRveWJ1Zis4KmksICIlMDh4IiwgYnN3YXBfMzIoVFQuc3RhdGVbaV0pKTsKKworICAvLyBXaXBlIHZhcmlhYmxlcy4gQ3J5cHRvZ3JhcGhlciBwYXJhbm9pYS4KKyAgbWVtc2V0KFRULnN0YXRlLCAwLCBzaXplb2YoVFQpLSgobG9uZylUVC5zdGF0ZS0obG9uZykmVFQpKTsKKyAgaSA9IHN0cmxlbih0b3lidWYpKzE7CisgIG1lbXNldCh0b3lidWYraSwgMCwgc2l6ZW9mKHRveWJ1ZiktaSk7Cit9CisKKy8vIENhbGwgYnVpbHRpbiBvciBsaWIgaGFzaCBmdW5jdGlvbiwgdGhlbiBkaXNwbGF5IG91dHB1dCBpZiBuZWNlc3NhcnkKK3N0YXRpYyB2b2lkIGRvX2hhc2goaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpZiAoQ0ZHX1RPWUJPWF9MSUJDUllQVE8pIGRvX2xpYl9oYXNoKGZkLCBuYW1lKTsKKyAgZWxzZSBkb19idWlsdGluX2hhc2goZmQsbmFtZSk7CisKKyAgaWYgKG5hbWUpCisgICAgcHJpbnRmKCh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSA/ICIlc1xuIiA6ICIlcyAgJXNcbiIsIHRveWJ1ZiwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fYyhjaGFyICpsaW5lLCBzaXplX3QgbGVuKQoreworICBpbnQgc3BhY2UgPSAwLCBmYWlsID0gMDsKKyAgY2hhciAqbmFtZTsKKworICBmb3IgKG5hbWUgPSBsaW5lOyAqbmFtZTsgbmFtZSsrKSB7CisgICAgaWYgKGlzc3BhY2UoKm5hbWUpKSB7CisgICAgICBzcGFjZSsrOworICAgICAgKm5hbWUgPSAwOworICAgIH0gZWxzZSBpZiAoc3BhY2UpIGJyZWFrOworICB9CisKKyAgaWYgKCFzcGFjZSB8fCAhKmxpbmUgfHwgISpuYW1lKSBlcnJvcl9tc2coImJhZCBsaW5lICVzIiwgbGluZSk7CisgIGVsc2UgeworICAgIGludCBmZCA9ICFzdHJjbXAobmFtZSwgIi0iKSA/IDAgOiBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKworICAgIFRULnNhd2xpbmUgPSAxOworICAgIGlmIChmZD09LTEpIHsKKyAgICAgIHBlcnJvcl9tc2dfcmF3KG5hbWUpOworICAgICAgKnRveWJ1ZiA9IDA7CisgICAgfSBlbHNlIGRvX2hhc2goZmQsIDApOworICAgIGlmIChzdHJjYXNlY21wKGxpbmUsIHRveWJ1ZikpIHRveXMuZXhpdHZhbCA9IGZhaWwgPSAxOworICAgIHByaW50ZigiJXM6ICVzXG4iLCBuYW1lLCBmYWlsID8gIkZBSUxFRCIgOiAiT0siKTsKKyAgICBpZiAoZmQ+MCkgY2xvc2UoZmQpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIE9wZW4gZmlsZSwgcmVhZCBlYWNoIGxpbmUsIGFuZCBjYWxsIGRvX2xpbmUoKS4gUmV0dXJucyAwIGlmIGZpbGUgZXhpc3RlZAorLy8gYW5kIHdlIHJlYWQgaXQgdG8gdGhlIGVuZCwgMSBpZiBpbnRlcnJ1cHRlZCBieSBjYWxsYmFjaywgMiBvZiBkaWRuJ3QgZXhpc3QKKy8vIGRvX2xpbmUgcmV0dXJucyAwIHRvIGZyZWUgbGluZSwgMSB0byBrZWVwIGxpbmUsIDIgdG8gZW5kIGxvb3AKK2ludCBsb29wbGluZXMoY2hhciAqbmFtZSwgaW50IHRyaW0sIGludCAoKmRvX2xpbmUpKGNoYXIgKmxpbmUsIHNpemVfdCBsZW4pKQoreworICBGSUxFICpmcCA9ICFzdHJjbXAobmFtZSwgIi0iKSA/IHN0ZGluIDogZm9wZW4obmFtZSwgInIiKTsKKyAgaW50IHJjID0gMDsKKworICBpZiAoIWZwKSB7CisgICAgcGVycm9yX21zZ19yYXcobmFtZSk7CisKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBjaGFyICpsaW5lID0gMDsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGlmICgobGVuID0gZ2V0bGluZSgmbGluZSwgKHZvaWQgKikmbGVuLCBmcCkpPDEpIGJyZWFrOworICAgIGlmIChsaW5lW2xlbi0xXT09J1xuJykgbGVuLS07CisgICAgaWYgKHRyaW0pIGxpbmVbbGVuXSA9IDA7CisgICAgbGVuID0gZG9fbGluZShsaW5lLCBsZW4pOworICAgIGlmICghbGVuKSBmcmVlKGxpbmUpOworICAgIGlmIChsZW49PTIpIHsKKyAgICAgIHJjID0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoZnAhPXN0ZGluKSBmY2xvc2UoZnApOworCisgIHJldHVybiByYzsKK30KKwordm9pZCBtZDVzdW1fbWFpbih2b2lkKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmFsOworCisgIGlmICghVFQuYykgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9faGFzaCk7CisgIGVsc2UgZm9yIChhbCA9IFRULmM7IGFsOyBhbCA9IGFsLT5uZXh0KSB7CisgICAgVFQuc2F3bGluZSA9IDA7CisgICAgbG9vcGxpbmVzKGFsLT5hcmcsIDEsIGRvX2MpOworICAgIGlmICghVFQuc2F3bGluZSkgZXJyb3JfbXNnKCIlczogbm8gbGluZXMiLCBhbC0+YXJnKTsKKyAgfQorfQorCit2b2lkIHNoYTFzdW1fbWFpbih2b2lkKQoreworICBtZDVzdW1fbWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbHNiL21rbm9kLmMgYi90b3lib3gvdG95cy9sc2IvbWtub2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ4Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL21rbm9kLmMKQEAgLTAsMCArMSw1OCBAQAorLyogbWtub2QuYyAtIG1ha2UgYmxvY2sgb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZQorICoKKyAqIENvcHlyaWdodCAyMDEyIEVsaWUgRGUgQnJhdXdlciA8ZWxpZWRlYnJhdXdlckBnbWFpbC5jb20+CisgKgorICogaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy9ta25vZC5odG1sCisKK1VTRV9NS05PRChORVdUT1kobWtub2QsICI8Mj40bShtb2RlKToiVVNFX01LTk9EX1ooIlo6IiksIFRPWUZMQUdfQklOfFRPWUZMQUdfVU1BU0spKQorCitjb25maWcgTUtOT0QKKyAgYm9vbCAibWtub2QiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG1rbm9kIFstbSBNT0RFXSBOQU1FIFRZUEUgW01BSk9SIE1JTk9SXQorCisgICAgQ3JlYXRlIGEgc3BlY2lhbCBmaWxlIE5BTUUgd2l0aCBhIGdpdmVuIHR5cGUuIFRZUEUgaXMgYiBmb3IgYmxvY2sgZGV2aWNlLAorICAgIGMgb3IgdSBmb3IgY2hhcmFjdGVyIGRldmljZSwgcCBmb3IgbmFtZWQgcGlwZSAod2hpY2ggaWdub3JlcyBNQUpPUi9NSU5PUikuCisKKyAgICAtbQlNb2RlIChmaWxlIHBlcm1pc3Npb25zKSBvZiBuZXcgZGV2aWNlLCBpbiBvY3RhbCBvciB1K3ggZm9ybWF0CisKK2NvbmZpZyBNS05PRF9aCisgIGJvb2wKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gTUtOT0QgJiYgIVRPWUJPWF9MU01fTk9ORQorICBoZWxwCisgICAgdXNhZ2U6IG1rbm9kIFstWiBDT05URVhUXSAuLi4KKworICAgIC1aCVNldCBzZWN1cml0eSBjb250ZXh0IHRvIGNyZWF0ZWQgZmlsZQorKi8KKworI2RlZmluZSBGT1JfbWtub2QKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmFyZ19jb250ZXh0OworICBjaGFyICptOworKQorCit2b2lkIG1rbm9kX21haW4odm9pZCkKK3sKKyAgbW9kZV90IG1vZGVzW10gPSB7U19JRklGTywgU19JRkNIUiwgU19JRkNIUiwgU19JRkJMS307CisgIGludCBtYWpvcj0wLCBtaW5vcj0wLCB0eXBlOworICBpbnQgbW9kZSA9IFRULm0gPyBzdHJpbmdfdG9fbW9kZShUVC5tLCAwNzc3KSA6IDA2NjA7CisKKyAgdHlwZSA9IHN0cmlkeCgicGN1YiIsICp0b3lzLm9wdGFyZ3NbMV0pOworICBpZiAodHlwZSA9PSAtMSkgcGVycm9yX2V4aXQoImJhZCB0eXBlICclYyciLCAqdG95cy5vcHRhcmdzWzFdKTsKKyAgaWYgKHR5cGUpIHsKKyAgICBpZiAodG95cy5vcHRjICE9IDQpIHBlcnJvcl9leGl0KCJuZWVkIG1ham9yL21pbm9yIik7CisKKyAgICBtYWpvciA9IGF0b2kodG95cy5vcHRhcmdzWzJdKTsKKyAgICBtaW5vciA9IGF0b2kodG95cy5vcHRhcmdzWzNdKTsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKQorICAgIGlmICgtMSA9PSBsc21fc2V0X2NyZWF0ZShUVC5hcmdfY29udGV4dCkpCisgICAgICBwZXJyb3JfZXhpdCgiLVogJyVzJyBmYWlsZWQiLCBUVC5hcmdfY29udGV4dCk7CisgIGlmIChta25vZCgqdG95cy5vcHRhcmdzLCBtb2RlfG1vZGVzW3R5cGVdLCBkZXZfbWFrZWRldihtYWpvciwgbWlub3IpKSkKKyAgICBwZXJyb3JfZXhpdF9yYXcoKnRveXMub3B0YXJncyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2IvbWt0ZW1wLmMgYi90b3lib3gvdG95cy9sc2IvbWt0ZW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ZGFjYwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2xzYi9ta3RlbXAuYwpAQCAtMCwwICsxLDU3IEBACisvKiBta3RlbXAuYyAtIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIG9yIGRpcmVjdG9yeS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBFbGllIERlIEJyYXV3ZXIgPGVsaWVkZWJyYXV3ZXJAZ21haWwuY29tPgorICoKKyAqIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvbWt0ZW1wLmh0bWwKKworVVNFX01LVEVNUChORVdUT1kobWt0ZW1wLCAiPjF1cWQoZGlyZWN0b3J5KXAodG1wZGlyKToiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBNS1RFTVAKKyAgYm9vbCAibWt0ZW1wIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBta3RlbXAgWy1kcXVdIFstcCBESVJdIFtURU1QTEFURV0KKworICAgIFNhZmVseSBjcmVhdGUgYSBuZXcgZmlsZSAiRElSL1RFTVBMQVRFIiBhbmQgcHJpbnQgaXRzIG5hbWUuCisKKyAgICAtZAlDcmVhdGUgZGlyZWN0b3J5IGluc3RlYWQgb2YgZmlsZSAoLS1kaXJlY3RvcnkpCisgICAgLXAJUHV0IG5ldyBmaWxlIGluIERJUiAoLS10bXBkaXIpCisgICAgLXEJUXVpZXQsIG5vIGVycm9yIG1lc3NhZ2VzCisgICAgLXUJRG9uJ3QgY3JlYXRlIGFueXRoaW5nLCBqdXN0IHByaW50IHdoYXQgd291bGQgYmUgY3JlYXRlZAorCisgICAgRWFjaCBYIGluIFRFTVBMQVRFIGlzIHJlcGxhY2VkIHdpdGggYSByYW5kb20gcHJpbnRhYmxlIGNoYXJhY3Rlci4gVGhlCisgICAgZGVmYXVsdCBURU1QTEFURSBpcyB0bXAuWFhYWFhYLCBhbmQgdGhlIGRlZmF1bHQgRElSIGlzICRUTVBESVIgaWYgc2V0LAorICAgIGVsc2UgIi90bXAiLgorKi8KKworI2RlZmluZSBGT1JfbWt0ZW1wCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICp0bXBkaXI7CispCisKK3ZvaWQgbWt0ZW1wX21haW4odm9pZCkKK3sKKyAgaW50IGRfZmxhZyA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX2Q7CisgIGNoYXIgKnRlbXBsYXRlID0gKnRveXMub3B0YXJnczsKKworICBpZiAoIXRlbXBsYXRlKSB0ZW1wbGF0ZSA9ICJ0bXAuWFhYWFhYIjsKKworICBpZiAoIVRULnRtcGRpcikgVFQudG1wZGlyID0gZ2V0ZW52KCJUTVBESVIiKTsKKyAgaWYgKCFUVC50bXBkaXIgfHwgISpUVC50bXBkaXIpIFRULnRtcGRpciA9ICIvdG1wIjsKKworICB0ZW1wbGF0ZSA9IHN0cmNocih0ZW1wbGF0ZSwgJy8nKSA/IHhzdHJkdXAodGVtcGxhdGUpCisgICAgICAgICAgICAgOiB4bXByaW50ZigiJXMvJXMiLCBUVC50bXBkaXIsIHRlbXBsYXRlKTsKKworICBpZiAoZF9mbGFnID8gIW1rZHRlbXAodGVtcGxhdGUpIDogbWtzdGVtcCh0ZW1wbGF0ZSkgPT0gLTEpIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcSkgdG95cy5leGl0dmFsID0gMTsKKyAgICBlbHNlIHBlcnJvcl9leGl0KCJGYWlsZWQgdG8gY3JlYXRlICVzICVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGRfZmxhZyA/ICJkaXJlY3RvcnkiIDogImZpbGUiLCBUVC50bXBkaXIsIHRlbXBsYXRlKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgdW5saW5rKHRlbXBsYXRlKTsKKyAgICB4cHV0cyh0ZW1wbGF0ZSk7CisgIH0KKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBmcmVlKHRlbXBsYXRlKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2xzYi9tb3VudC5jIGIvdG95Ym94L3RveXMvbHNiL21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ZDBhYgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2xzYi9tb3VudC5jCkBAIC0wLDAgKzEsMzgzIEBACisvKiBtb3VudC5jIC0gbW91bnQgZmlsZXN5c3RlbXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL21vdW50Lmh0bWwKKyAqIE5vdGU6IC1oViBpcyBiYWQgc3BlYywgaGF2ZW4ndCBpbXBsZW1lbnRlZCAtRnNMVSB5ZXQKKyAqIG5vIG10YWIgKC9wcm9jL21vdW50cyBkb2VzIGl0KSBzbyAtbiBpcyBOT1AuCisgKiBUT0RPIG1vdW50IC1vIGxvb3AsYXV0b2NsZWFyIChsaW51eCBnaXQgOTZjNTg2NTU1OWNlKQorCitVU0VfTU9VTlQoTkVXVE9ZKG1vdW50LCAiP086YWZucnZ3dDpvKlstcnddIiwgVE9ZRkxBR19CSU58VE9ZRkxBR19TVEFZUk9PVCkpCisvL1VTRV9ORlNNT1VOVChORVdUT1kobmZzbW91bnQsICI/PDI+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfU1RBWVJPT1QpKQorCitjb25maWcgTU9VTlQKKyAgYm9vbCAibW91bnQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG1vdW50IFstYWZGcnN2d10gWy10IFRZUEVdIFstbyBPUFRJT04sXSBbW0RFVklDRV0gRElSXQorCisgICAgTW91bnQgbmV3IGZpbGVzeXN0ZW0ocykgb24gZGlyZWN0b3JpZXMuIFdpdGggbm8gYXJndW1lbnRzLCBkaXNwbGF5IGV4aXN0aW5nCisgICAgbW91bnRzLgorCisgICAgLWEJbW91bnQgYWxsIGVudHJpZXMgaW4gL2V0Yy9mc3RhYiAod2l0aCAtdCwgb25seSBlbnRyaWVzIG9mIHRoYXQgVFlQRSkKKyAgICAtTwlvbmx5IG1vdW50IC1hIGVudHJpZXMgdGhhdCBoYXZlIHRoaXMgb3B0aW9uCisgICAgLWYJZmFrZSBpdCAoZG9uJ3QgYWN0dWFsbHkgbW91bnQpCisgICAgLXIJcmVhZCBvbmx5IChzYW1lIGFzIC1vIHJvKQorICAgIC13CXJlYWQvd3JpdGUgKGRlZmF1bHQsIHNhbWUgYXMgLW8gcncpCisgICAgLXQJc3BlY2lmeSBmaWxlc3lzdGVtIHR5cGUKKyAgICAtdgl2ZXJib3NlCisKKyAgICBPUFRJT05TIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9ucywgd2hpY2ggY2FuIGFsc28gYmUgc3VwcGxpZWQKKyAgICBhcyAtLWxvbmdvcHRzLgorCisgICAgVGhpcyBtb3VudCBhdXRvZGV0ZWN0cyBsb29wYmFjayBtb3VudHMgKGEgZmlsZSBvbiBhIGRpcmVjdG9yeSkgYW5kCisgICAgYmluZCBtb3VudHMgKGZpbGUgb24gZmlsZSwgZGlyZWN0b3J5IG9uIGRpcmVjdG9yeSksIHNvIHlvdSBkb24ndCBuZWVkCisgICAgdG8gc2F5IC0tYmluZCBvciAtLWxvb3AuIFlvdSBjYW4gYWxzbyAibW91bnQgLWEgL3BhdGgiIHRvIG1vdW50IGV2ZXJ5dGhpbmcKKyAgICBpbiAvZXRjL2ZzdGFiIHVuZGVyIC9wYXRoLCBldmVuIGlmIGl0J3Mgbm9hdXRvLgorCisjY29uZmlnIE5GU01PVU5UCisjICBib29sICJuZnNtb3VudCIKKyMgIGRlZmF1bHQgbgorIyAgaGVscAorIyAgICB1c2FnZTogbmZzbW91bnQgU0hBUkUgRElSCisjCisjICAgIEludm9rZSBhbiBlbGRyaWNoIGhvcnJvciBmcm9tIHRoZSBkYXduIG9mIHRpbWUuCisqLworCisjZGVmaW5lIEZPUl9tb3VudAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgc3RydWN0IGFyZ19saXN0ICpvcHRsaXN0OworICBjaGFyICp0eXBlOworICBjaGFyICpiaWdPOworCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGNoYXIgKm9wdHM7CisgIGludCBva3VzZXI7CispCisKKy8vIG1vdW50LnRlc3RzIHNob3VsZCBjaGVjayBmb3IgYWxsIG9mIHRoaXM6CisvLyBUT0RPIGRldGVjdCBleGlzdGluZyBpZGVudGljYWwgbW91bnQgKHByb2NmcyB3aXRoIGRpZmZlcmVudCBkZXYgbmFtZT8pCisvLyBUT0RPIHVzZXIsIHVzZXJzLCBvd25lciwgZ3JvdXAsIG5vZmFpbAorLy8gVE9ETyAtcCAocGFzc2ZkKQorLy8gVE9ETyAtYSAtdCBub3R5cGUsdHlwZTIKKy8vIFRPRE8gLS1zdWJ0cmVlCisvLyBUT0RPIC0tcmJpbmQsIC1SCisvLyBUT0RPIG1ha2UgIm1vdW50IC0tYmluZCxybyBvbGQgbmV3IiB3b3JrIChpbXBsaWNpdCAtbyByZW1vdW50KQorLy8gVE9ETyBtb3VudCAtYQorLy8gVE9ETyBtb3VudCAtbyByZW1vdW50CisvLyBUT0RPIGZzdGFiOiBsb29rdXAgZGVmYXVsdCBvcHRpb25zIGZvciBtb3VudAorLy8gVE9ETyBpbXBsZW1lbnQgLXYKKy8vIFRPRE8gIm1vdW50IC1hIC1vIHJlbW91bnQscm8iIHNob3VsZCBkZXRlY3Qgb3Zlcm1vdW50cworLy8gVE9ETyB3b3JrIG91dCBob3cgdGhhdCBkaWZmZXJzIGZyb20gIm1vdW50IC1hciIKKy8vIFRPRE8gd2hhdCBpZiB5b3UgLS1iaW5kIG1vdW50IGEgYmxvY2sgZGV2aWNlIHNvbWV3aGVyZSAoZmlsZSwgZGlyLCBkZXYpCisvLyBUT0RPICJ0b3VjaCBzZXJ2ZXJuYW1lOyBtb3VudCAtdCBjaWZzIHNlcnZlcm5hbWUgcGF0aCIKKy8vIFRPRE8gbW91bnQgLW8gcmVtb3VudCBhIHVzZXIgbW91bnQKKy8vIFRPRE8gbW91bnQgaW1hZ2UuaW1nIHN1YiAoYXV0by1sb29wYmFjaykgdGhlbiB1bW91bnQgaW1hZ2UuaW1nCisKKy8vIFN0cmlwIGZsYWdzIG91dCBvZiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb25zLCByZXR1cm4gZmxhZ3MsLgorc3RhdGljIGxvbmcgZmxhZ19vcHRzKGNoYXIgKm5ldywgbG9uZyBmbGFncywgY2hhciAqKm1vcmUpCit7CisgIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsKKyAgICBsb25nIGZsYWdzOworICB9IG9wdHNbXSA9IHsKKyAgICAvLyBOT1BzICh3ZSBhdXRvZGV0ZWN0IC0tbG9vcCBhbmQgLS1iaW5kKQorICAgIHsibG9vcCIsIDB9LCB7ImJpbmQiLCAwfSwgeyJkZWZhdWx0cyIsIDB9LCB7InF1aWV0IiwgMH0sCisgICAgeyJ1c2VyIiwgMH0sIHsibm91c2VyIiwgMH0sIC8vIGNoZWNrZWQgaW4gZnN0YWIsIGlnbm9yZWQgaW4gLW8KKyAgICB7InJvIiwgTVNfUkRPTkxZfSwgeyJydyIsIH5NU19SRE9OTFl9LAorICAgIHsibm9zdWlkIiwgTVNfTk9TVUlEfSwgeyJzdWlkIiwgfk1TX05PU1VJRH0sCisgICAgeyJub2RldiIsIE1TX05PREVWfSwgeyJkZXYiLCB+TVNfTk9ERVZ9LAorICAgIHsibm9leGVjIiwgTVNfTk9FWEVDfSwgeyJleGVjIiwgfk1TX05PRVhFQ30sCisgICAgeyJzeW5jIiwgTVNfU1lOQ0hST05PVVN9LCB7ImFzeW5jIiwgfk1TX1NZTkNIUk9OT1VTfSwKKyAgICB7Im5vYXRpbWUiLCBNU19OT0FUSU1FfSwgeyJhdGltZSIsIH5NU19OT0FUSU1FfSwKKyAgICB7Im5vcmVsYXRpbWUiLCB+TVNfUkVMQVRJTUV9LCB7InJlbGF0aW1lIiwgTVNfUkVMQVRJTUV9LAorICAgIHsibm9kaXJhdGltZSIsIE1TX05PRElSQVRJTUV9LCB7ImRpcmF0aW1lIiwgfk1TX05PRElSQVRJTUV9LAorICAgIHsibG91ZCIsIH5NU19TSUxFTlR9LAorICAgIHsic2hhcmVkIiwgTVNfU0hBUkVEfSwgeyJyc2hhcmVkIiwgTVNfU0hBUkVEfE1TX1JFQ30sCisgICAgeyJzbGF2ZSIsIE1TX1NMQVZFfSwgeyJyc2xhdmUiLCBNU19TTEFWRXxNU19SRUN9LAorICAgIHsicHJpdmF0ZSIsIE1TX1BSSVZBVEV9LCB7InJwcml2YXRlIiwgTVNfU0xBVkV8TVNfUkVDfSwKKyAgICB7InVuYmluZGFibGUiLCBNU19VTkJJTkRBQkxFfSwgeyJydW5iaW5kYWJsZSIsIE1TX1VOQklOREFCTEV8TVNfUkVDfSwKKyAgICB7InJlbW91bnQiLCBNU19SRU1PVU5UfSwgeyJtb3ZlIiwgTVNfTU9WRX0sCisgICAgLy8gbWFuZCBkaXJzeW5jIHJlYyBpdmVyc2lvbiBzdHJpY3RhdGltZQorICB9OworCisgIGlmIChuZXcpIGZvciAoOzspIHsKKyAgICBjaGFyICpjb21tYSA9IHN0cmNocihuZXcsICcsJyk7CisgICAgaW50IGk7CisKKyAgICBpZiAoY29tbWEpICpjb21tYSA9IDA7CisKKyAgICAvLyBJZiB3ZSByZWNvZ25pemUgYW4gb3B0aW9uLCBhcHBseSBmbGFncworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9MRU4ob3B0cyk7IGkrKykgaWYgKCFzdHJjYXNlY21wKG9wdHNbaV0ubmFtZSwgbmV3KSkgeworICAgICAgbG9uZyBsbCA9IG9wdHNbaV0uZmxhZ3M7CisKKyAgICAgIGlmIChsbCA8IDApIGZsYWdzICY9IGxsOworICAgICAgZWxzZSBmbGFncyB8PSBsbDsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSWYgd2UgZGlkbid0IHJlY29nbml6ZSBpdCwga2VlcCBzdHJpbmcgdmVyc2lvbgorICAgIGlmIChtb3JlICYmIGkgPT0gQVJSQVlfTEVOKG9wdHMpKSB7CisgICAgICBpID0gKm1vcmUgPyBzdHJsZW4oKm1vcmUpIDogMDsKKyAgICAgICptb3JlID0geHJlYWxsb2MoKm1vcmUsIGkgKyBzdHJsZW4obmV3KSArIDIpOworICAgICAgaWYgKGkpICgqbW9yZSlbaSsrXSA9ICcsJzsKKyAgICAgIHN0cmNweShpKyptb3JlLCBuZXcpOworICAgIH0KKworICAgIGlmICghY29tbWEpIGJyZWFrOworICAgICpjb21tYSA9ICcsJzsKKyAgICBuZXcgPSBjb21tYSArIDE7CisgIH0KKworICByZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIG1vdW50X2ZpbGVzeXN0ZW0oY2hhciAqZGV2LCBjaGFyICpkaXIsIGNoYXIgKnR5cGUsCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNoYXIgKm9wdHMpCit7CisgIEZJTEUgKmZwID0gMDsKKyAgaW50IHJjID0gRUlOVkFMOworICBjaGFyICpidWYgPSAwOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSByZXR1cm47CisKKyAgaWYgKGdldHVpZCgpKSB7CisgICAgaWYgKFRULm9rdXNlcikgVFQub2t1c2VyID0gMDsKKyAgICBlbHNlIHsKKyAgICAgIGVycm9yX21zZygiJyVzJyBub3QgdXNlciBtb3VudGFibGUgaW4gZnN0YWIiLCBkZXYpOworCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gQXV0b2RldGVjdCBiaW5kIG1vdW50IG9yIGZpbGVzeXN0ZW0gdHlwZQorCisgIGlmICh0eXBlICYmICFzdHJjbXAodHlwZSwgImF1dG8iKSkgdHlwZSA9IDA7CisgIGlmIChmbGFncyAmIE1TX01PVkUpIHsKKyAgICBpZiAodHlwZSkgZXJyb3JfZXhpdCgiLS1tb3ZlIHdpdGggLXQiKTsKKyAgfSBlbHNlIGlmICghdHlwZSkgeworICAgIHN0cnVjdCBzdGF0IHN0ZGV2LCBzdGRpcjsKKworICAgIC8vIGZpbGUgb24gZmlsZSBvciBkaXIgb24gZGlyIGlzIGEgLS1iaW5kIG1vdW50LgorICAgIGlmICghc3RhdChkZXYsICZzdGRldikgJiYgIXN0YXQoZGlyLCAmc3RkaXIpCisgICAgICAgICYmICgoU19JU1JFRyhzdGRldi5zdF9tb2RlKSAmJiBTX0lTUkVHKHN0ZGlyLnN0X21vZGUpKQorICAgICAgICAgICAgfHwgKFNfSVNESVIoc3RkZXYuc3RfbW9kZSkgJiYgU19JU0RJUihzdGRpci5zdF9tb2RlKSkpKQorICAgIHsKKyAgICAgIGZsYWdzIHw9IE1TX0JJTkQ7CisgICAgfSBlbHNlIGZwID0geGZvcGVuKCIvcHJvYy9maWxlc3lzdGVtcyIsICJyIik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaWdub3JlIikpIHJldHVybjsKKyAgZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAic3dhcCIpKQorICAgIHRveXMuZXhpdHZhbCB8PSB4cnVuKChjaGFyICpbXSl7InN3YXBvbiIsICItLSIsIGRldiwgMH0pOworCisgIGZvciAoOzspIHsKKyAgICBpbnQgZmQgPSAtMSwgcm8gPSAwOworCisgICAgLy8gSWYgdHlwZSB3YXNuJ3Qgc3BlY2lmaWVkLCB0cnkgYWxsIG9mIHRoZW0gaW4gb3JkZXIuCisgICAgaWYgKGZwICYmICFidWYpIHsKKyAgICAgIHNpemVfdCBpOworCisgICAgICBpZiAoZ2V0bGluZSgmYnVmLCAmaSwgZnApPDApIGJyZWFrOworICAgICAgdHlwZSA9IGJ1ZjsKKyAgICAgIC8vIHNraXAgbm9kZXYgZGV2aWNlcworICAgICAgaWYgKCFpc3NwYWNlKCp0eXBlKSkgeworICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIGJ1ZiA9IDA7CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyB0cmltIHdoaXRlc3BhY2UKKyAgICAgIHdoaWxlIChpc3NwYWNlKCp0eXBlKSkgdHlwZSsrOworICAgICAgaSA9IHN0cmxlbih0eXBlKTsKKyAgICAgIGlmIChpKSB0eXBlW2ktMV0gPSAwOworICAgIH0KKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikKKyAgICAgIHByaW50ZigidHJ5ICclcycgdHlwZSAnJXMnIG9uICclcydcbiIsIGRldiwgdHlwZSwgZGlyKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICByYyA9IG1vdW50KGRldiwgZGlyLCB0eXBlLCBmbGFncywgb3B0cyk7CisgICAgICAvLyBEaWQgd2Ugc3VjY2VlZCwgZmFpbCB1bnJlY292ZXJhYmx5LCBvciBhbHJlYWR5IHRyeSByZWFkLW9ubHk/CisgICAgICBpZiAoIXJjIHx8IChlcnJubyAhPSBFQUNDRVMgJiYgZXJybm8gIT0gRVJPRlMpIHx8IChmbGFncyZNU19SRE9OTFkpKQorICAgICAgICBicmVhazsKKyAgICAgIC8vIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSB0cmllZCBpdCwgdXNlIHRoZSBCTEtST1NFVCBpb2N0bCB0byBlbnN1cmUKKyAgICAgIC8vIHRoYXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGlzbid0IHJlYWQtb25seS4KKyAgICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikKKyAgICAgICAgICBwcmludGYoInRyeWluZyBCTEtST1NFVCBpb2N0bCBvbiAnJXMnXG4iLCBkZXYpOworICAgICAgICBpZiAoLTEgIT0gKGZkID0gb3BlbihkZXYsIE9fUkRPTkxZKSkpIHsKKyAgICAgICAgICByYyA9IGlvY3RsKGZkLCBCTEtST1NFVCwgJnJvKTsKKyAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgaWYgKCFyYykgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJyVzJyBpcyByZWFkLW9ubHlcbiIsIGRldik7CisgICAgICBmbGFncyB8PSBNU19SRE9OTFk7CisgICAgfQorCisgICAgLy8gVHJ5aW5nIHRvIGF1dG9kZXRlY3QgbG9vcCBtb3VudHMgbGlrZSBiaW5kIG1vdW50cyBhYm92ZSAoZmlsZSBvbiBkaXIpCisgICAgLy8gaXNuJ3QgZ29vZCBlbm91Z2ggYmVjYXVzZSAibW91bnQgLXQgZXh0MiBmcy5pbWcgZGlyIiBpcyB2YWxpZCwgYnV0IGlmCisgICAgLy8geW91IF9kb18gYWNjZXB0IGxvb3AgbW91bnRzIHdpdGggLXQgaG93IGRvIHlvdSB0ZWxsICItdCBjaWZzIiBpc24ndAorICAgIC8vIGxvb2tpbmcgZm9yIGEgYmxvY2sgZGV2aWNlIGlmIGl0J3Mgbm90IGluIC9wcm9jL2ZpbGVzeXN0ZW1zIHlldAorICAgIC8vIGJlY2F1c2UgdGhlIG1vZHVsZSB0aGF0IHdvbid0IGJlIGxvYWRlZCB1bnRpbCB5b3UgdHJ5IHRoZSBtb3VudCwgYW5kCisgICAgLy8gaWYgeW91IGNhbid0IHRoZW4gREVWSUNFIGV4aXN0aW5nIGFzIGEgZmlsZSB3b3VsZCBjYXVzZSBhIGZhbHNlCisgICAgLy8gcG9zaXRpdmUgbG9vcGJhY2sgbW91bnQgKHNvICJ0b3VjaCBzZXJ2ZXJuYW1lIiBiZWNvbWVzIGEgcG90ZW50aWFsCisgICAgLy8gZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLi4uKQorICAgIC8vCisgICAgLy8gU29sdXRpb246IHRyeSB0aGUgbW91bnQsIGxldCB0aGUga2VybmVsIHRlbGwgdXMgaXQgd2FudGVkIGEgYmxvY2sKKyAgICAvLyBkZXZpY2UsIHRoZW4gZG8gdGhlIGxvb3BiYWNrIHNldHVwIGFuZCByZXRyeSB0aGUgbW91bnQuCisKKyAgICBpZiAocmMgJiYgZXJybm8gPT0gRU5PVEJMSykgeworICAgICAgY2hhciAqbG9zZXR1cFtdID0geyJsb3NldHVwIiwgIi1mcyIsIGRldiwgMH07CisgICAgICBpbnQgcGlwZSwgbGVuOworICAgICAgcGlkX3QgcGlkOworCisgICAgICBpZiAoZmxhZ3MgJiBNU19SRE9OTFkpIGxvc2V0dXBbMV0gPSAiLWZzciI7CisgICAgICBwaWQgPSB4cG9wZW4obG9zZXR1cCwgJnBpcGUsIDEpOworICAgICAgbGVuID0gcmVhZGFsbChwaXBlLCB0b3lidWYsIHNpemVvZih0b3lidWYpLTEpOworICAgICAgcmMgPSB4cGNsb3NlKHBpZCwgcGlwZSk7CisgICAgICBpZiAoIXJjICYmIGxlbiA+IDEpIHsKKyAgICAgICAgaWYgKHRveWJ1ZltsZW4tMV0gPT0gJ1xuJykgLS1sZW47CisgICAgICAgIHRveWJ1ZltsZW5dID0gMDsKKyAgICAgICAgZGV2ID0gdG95YnVmOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZXJyb3JfbXNnKCJsb3NldHVwIGZhaWxlZCAlZCIsIHJjKTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZnJlZShidWYpOworICAgIGJ1ZiA9IDA7CisgICAgaWYgKCFyYykgYnJlYWs7CisgICAgaWYgKGZwICYmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRUJVU1kpKSBjb250aW51ZTsKKworICAgIHBlcnJvcl9tc2coIiclcyctPiclcyciLCBkZXYsIGRpcik7CisKKyAgICBicmVhazsKKyAgfQorICBpZiAoZnApIGZjbG9zZShmcCk7Cit9CisKK3ZvaWQgbW91bnRfbWFpbih2b2lkKQoreworICBjaGFyICpvcHRzID0gMCwgKmRldiA9IDAsICpkaXIgPSAwLCAqKnNzOworICBsb25nIGZsYWdzID0gTVNfU0lMRU5UOworICBzdHJ1Y3QgYXJnX2xpc3QgKm87CisgIHN0cnVjdCBtdGFiX2xpc3QgKm10bCwgKm10bDIgPSAwLCAqbW0sICpyZW1vdW50OworCisvLyBUT0RPCisvLyByZW1vdW50CisvLyAgIC0gb3Zlcm1vdW50cworLy8gc2hhcmVkIHN1YnRyZWUKKy8vIC1vIHBhcnNlZCBhZnRlciBmc3RhYiBvcHRpb25zCisvLyB0ZXN0IGlmIG1vdW50cG9pbnQgYWxyZWFkeSBleGlzdHMgKC1vIG5vcmVtb3VudD8pCisKKyAgLy8gRmlyc3QgcGFzczsganVzdCBhY2N1bXVsYXRlIHN0cmluZywgZG9uJ3QgcGFyc2UgZmxhZ3MgeWV0LiAoVGhpcyBpcyBzbworICAvLyB3ZSBjYW4gbW9kaWZ5IGZzdGFiIGVudHJpZXMgd2l0aCAtYSwgb3IgbXRhYiB3aXRoIHJlbW91bnQuKQorICBmb3IgKG8gPSBUVC5vcHRsaXN0OyBvOyBvID0gby0+bmV4dCkgY29tbWFfY29sbGF0ZSgmb3B0cywgby0+YXJnKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpIGNvbW1hX2NvbGxhdGUoJm9wdHMsICJybyIpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdykgY29tbWFfY29sbGF0ZSgmb3B0cywgInJ3Iik7CisKKyAgLy8gVHJlYXQgZWFjaCAtLW9wdGlvbiBhcyAtbyBvcHRpb24KKyAgZm9yIChzcyA9IHRveXMub3B0YXJnczsgKnNzOyBzcysrKSB7CisgICAgY2hhciAqc3NzID0gKnNzOworCisgICAgLy8gSWYgeW91IHJlYWx5LCByZWFsbHkgd2FudCB0byBtb3VudCBhIGZpbGUgbmFtZWQgIi0tIiwgd2Ugc3VwcG9ydCBpdC4KKyAgICBpZiAoc3NzWzBdPT0nLScgJiYgc3NzWzFdPT0nLScgJiYgc3NzWzJdKSBjb21tYV9jb2xsYXRlKCZvcHRzLCBzc3MrMik7CisgICAgZWxzZSBpZiAoIWRldikgZGV2ID0gc3NzOworICAgIGVsc2UgaWYgKCFkaXIpIGRpciA9IHNzczsKKyAgICAvLyBzYW1lIG1lc3NhZ2UgYXMgbGliL2FyZ3MuYyAiPjIiIHdoaWNoIHdlIGNhbid0IHVzZSBiZWNhdXNlIC0tb3B0cyBjb3VudAorICAgIGVsc2UgZXJyb3JfZXhpdCgiTWF4IDIgYXJndW1lbnRzXG4iKTsKKyAgfQorCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgJiYgZGlyKSBlcnJvcl9leGl0KCItYSB3aXRoID4xIGFyZyIpOworCisgIC8vIEZvciByZW1vdW50IHdlIG5lZWQgX2xhc3RfIG1hdGNoIChpbiBjYXNlIG9mIG92ZXJtb3VudHMpLCBzbyB0cmF2ZXJzZQorICAvLyBpbiByZXZlcnNlIG9yZGVyLiAoWWVzIEknbSB1c2luZyByZW1vdW50IGFzIGEgYm9vbGVhbiBmb3IgYSBiaXQgaGVyZSwKKyAgLy8gdGhlIGRvdWJsZSBjYXN0IGlzIHRvIGdldCBnY2MgdG8gc2h1dCB1cCBhYm91dCBpdC4pCisgIHJlbW91bnQgPSAodm9pZCAqKShsb25nKWNvbW1hX3NjYW4ob3B0cywgInJlbW91bnQiLCAxKTsKKyAgaWYgKCgodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgJiYgIWFjY2VzcygiL3Byb2MvbW91bnRzIiwgUl9PSykpIHx8IHJlbW91bnQpIHsKKyAgICBtbSA9IGRsaXN0X3Rlcm1pbmF0ZShtdGwgPSBtdGwyID0geGdldG1vdW50bGlzdCgwKSk7CisgICAgaWYgKHJlbW91bnQpIHJlbW91bnQgPSBtbTsKKyAgfQorCisgIC8vIERvIHdlIG5lZWQgdG8gZG8gYW4gL2V0Yy9mc3RhYiB0cmF3bD8KKyAgLy8gVGhpcyBjb3ZlcnMgLWEsIC1vIHJlbW91bnQsIG9uZSBhcmd1bWVudCwgYWxsIHVzZXIgbW91bnRzCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgfHwgKGRldiAmJiAoIWRpciB8fCBnZXR1aWQoKSB8fCByZW1vdW50KSkpIHsKKyAgICBpZiAoIXJlbW91bnQpIGRsaXN0X3Rlcm1pbmF0ZShtdGwgPSB4Z2V0bW91bnRsaXN0KCIvZXRjL2ZzdGFiIikpOworCisgICAgZm9yIChtbSA9IHJlbW91bnQgPyByZW1vdW50IDogbXRsOyBtbTsgbW0gPSAocmVtb3VudCA/IG1tLT5wcmV2IDogbW0tPm5leHQpKQorICAgIHsKKyAgICAgIGNoYXIgKmFvcHRzID0gMDsKKyAgICAgIHN0cnVjdCBtdGFiX2xpc3QgKm1tbSA9IDA7CisgICAgICBpbnQgYWZsYWdzLCBub2F1dG8sIGxlbjsKKworICAgICAgLy8gQ2hlY2sgZm9yIG5vYXV0byBhbmQgZ2V0IGl0IG91dCBvZiB0aGUgb3B0aW9uIGxpc3QuIChVbmtub3duIG9wdGlvbnMKKyAgICAgIC8vIHRoYXQgbWFrZSBpdCB0byB0aGUga2VybmVsIGdpdmUgZmlsZXN5c3RlbSBkcml2ZXJzIGluZGlnZXN0aW9uLikKKyAgICAgIG5vYXV0byA9IGNvbW1hX3NjYW4obW0tPm9wdHMsICJub2F1dG8iLCAxKTsKKworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpIHsKKyAgICAgICAgLy8gIm1vdW50IC1hIC9wYXRoIiB0byBtb3VudCBhbGwgZW50cmllcyB1bmRlciAvcGF0aAorICAgICAgICBpZiAoZGV2KSB7CisgICAgICAgICAgIGxlbiA9IHN0cmxlbihkZXYpOworICAgICAgICAgICBpZiAoc3RybmNtcChkZXYsIG1tLT5kaXIsIGxlbikKKyAgICAgICAgICAgICAgIHx8IChtbS0+ZGlyW2xlbl0gJiYgbW0tPmRpcltsZW5dICE9ICcvJykpIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKG5vYXV0bykgY29udGludWU7IC8vIG5ldmVyIHByZXNlbnQgaW4gdGhlIHJlbW91bnQgY2FzZQorICAgICAgICBpZiAoIW1vdW50bGlzdF9pc3R5cGUobW0sVFQudHlwZSkgfHwgIWNvbW1hX3NjYW5hbGwobW0tPm9wdHMsVFQuYmlnTykpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGlyICYmIHN0cmNtcChkaXIsIG1tLT5kaXIpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGRldiAmJiBzdHJjbXAoZGV2LCBtbS0+ZGV2aWNlKSAmJiAoZGlyIHx8IHN0cmNtcChkZXYsIG1tLT5kaXIpKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gRG9uJ3Qgb3Zlcm1vdW50IHRoZSBzYW1lIGRldiBvbiB0aGUgc2FtZSBkaXJlY3RvcnkKKyAgICAgIC8vIChVbmxlc3Mgcm9vdCBleHBsaWNpdGx5IHNheXMgdG8gaW4gbm9uIC1hIG1vZGUuKQorICAgICAgaWYgKG10bDIgJiYgIXJlbW91bnQpCisgICAgICAgIGZvciAobW1tID0gbXRsMjsgbW1tOyBtbW0gPSBtbW0tPm5leHQpCisgICAgICAgICAgaWYgKCFzdHJjbXAobW0tPmRpciwgbW1tLT5kaXIpICYmICFzdHJjbXAobW0tPmRldmljZSwgbW1tLT5kZXZpY2UpKQorICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAvLyB1c2VyIG9ubHkgY291bnRzIGZyb20gZnN0YWIsIG5vdCBvcHRzLgorICAgICAgaWYgKCFtbW0pIHsKKyAgICAgICAgVFQub2t1c2VyID0gY29tbWFfc2NhbihtbS0+b3B0cywgInVzZXIiLCAxKTsKKyAgICAgICAgYWZsYWdzID0gZmxhZ19vcHRzKG1tLT5vcHRzLCBmbGFncywgJmFvcHRzKTsKKyAgICAgICAgYWZsYWdzID0gZmxhZ19vcHRzKG9wdHMsIGFmbGFncywgJmFvcHRzKTsKKworICAgICAgICBtb3VudF9maWxlc3lzdGVtKG1tLT5kZXZpY2UsIG1tLT5kaXIsIG1tLT50eXBlLCBhZmxhZ3MsIGFvcHRzKTsKKyAgICAgIH0gLy8gVE9ETyBlbHNlIGlmIChnZXR1aWQoKSkgZXJyb3JfbXNnKCJhbHJlYWR5IHRoZXJlIikgPworICAgICAgZnJlZShhb3B0cyk7CisKKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpKSBicmVhazsKKyAgICB9CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgICAgbGxpc3RfdHJhdmVyc2UobXRsLCBmcmVlKTsKKyAgICAgIGxsaXN0X3RyYXZlcnNlKG10bDIsIGZyZWUpOworICAgIH0KKyAgICBpZiAoIW1tICYmICEodG95cy5vcHRmbGFncyAmIEZMQUdfYSkpCisgICAgICBlcnJvcl9leGl0KCInJXMnIG5vdCBpbiAlcyIsIGRpciA/IGRpciA6IGRldiwKKyAgICAgICAgICAgICAgICAgcmVtb3VudCA/ICIvcHJvYy9tb3VudHMiIDogImZzdGFiIik7CisKKyAgLy8gc2hvdyBtb3VudHMgZnJvbSAvcHJvYy9tb3VudHMKKyAgfSBlbHNlIGlmICghZGV2KSB7CisgICAgZm9yIChtdGwgPSB4Z2V0bW91bnRsaXN0KDApOyBtdGwgJiYgKG1tID0gZGxpc3RfcG9wKCZtdGwpKTsgZnJlZShtbSkpIHsKKyAgICAgIGNoYXIgKnMgPSAwOworCisgICAgICBpZiAoVFQudHlwZSAmJiBzdHJjbXAoVFQudHlwZSwgbW0tPnR5cGUpKSBjb250aW51ZTsKKyAgICAgIGlmICgqbW0tPmRldmljZSA9PSAnLycpIHMgPSB4YWJzcGF0aChtbS0+ZGV2aWNlLCAwKTsKKyAgICAgIHhwcmludGYoIiVzIG9uICVzIHR5cGUgJXMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgcyA/IHMgOiBtbS0+ZGV2aWNlLCBtbS0+ZGlyLCBtbS0+dHlwZSwgbW0tPm9wdHMpOworICAgICAgZnJlZShzKTsKKyAgICB9CisKKyAgLy8gdHdvIGFyZ3VtZW50cworICB9IGVsc2UgeworICAgIGNoYXIgKm1vcmUgPSAwOworCisgICAgZmxhZ3MgPSBmbGFnX29wdHMob3B0cywgZmxhZ3MsICZtb3JlKTsKKyAgICBtb3VudF9maWxlc3lzdGVtKGRldiwgZGlyLCBUVC50eXBlLCBmbGFncywgbW9yZSk7CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShtb3JlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbHNiL3Bhc3N3ZC5jIGIvdG95Ym94L3RveXMvbHNiL3Bhc3N3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4N2Q0YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9sc2IvcGFzc3dkLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIHBhc3N3ZC5jIC0gUHJvZ3JhbSB0byB1cGRhdGUgdXNlciBwYXNzd29yZC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqIE1vZGlmaWVkIDIwMTIgSmFzb24gS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy9wYXNzd2QuaHRtbAorCitVU0VfUEFTU1dEKE5FV1RPWShwYXNzd2QsICI+MWE6ZGx1IiwgVE9ZRkxBR19TVEFZUk9PVHxUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQQVNTV0QKKyAgYm9vbCAicGFzc3dkIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfU0hBRE9XCisgIGhlbHAKKyAgICB1c2FnZTogcGFzc3dkIFstYSBBTEdPXSBbLWRsdV0gPGFjY291bnQgbmFtZT4KKworICAgIHVwZGF0ZSB1c2VyJ3MgYXV0aGVudGljYXRpb24gdG9rZW5zLiBEZWZhdWx0IDogY3VycmVudCB1c2VyCisKKyAgICAtYSBBTEdPCUVuY3J5cHRpb24gbWV0aG9kIChkZXMsIG1kNSwgc2hhMjU2LCBzaGE1MTIpIGRlZmF1bHQ6IGRlcworICAgIC1kCQlTZXQgcGFzc3dvcmQgdG8gJycKKyAgICAtbAkJTG9jayAoZGlzYWJsZSkgYWNjb3VudAorICAgIC11CQlVbmxvY2sgKGVuYWJsZSkgYWNjb3VudAorCitjb25maWcgUEFTU1dEX1NBRAorICBib29sICJBZGQgc2FkIHBhc3N3b3JkIGNoZWNraW5nIGhldXJpc3RpY3MiCisgIGRlZmF1bHQgbgorICBkZXBlbmRzIG9uIFBBU1NXRAorICBoZWxwCisgICAgUGFzc3dvcmQgY2hhbmdlcyBhcmUgY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhleSBkb24ndCBpbmNsdWRlIHRoZSBlbnRpcmUKKyAgICB1c2VybmFtZSAoYnV0IG5vdCBhIHN1YnNldCBvZiBpdCksIGFuZCB0aGUgZW50aXJlIHByZXZpb3VzIHBhc3N3b3JkCisgICAgKGJ1dCBjaGFuZ2luZyBwYXNzd29yZDEsIHBhc3N3b3JkMiwgcGFzc3dvcmQzIGlzIGZpbmUpLiBUaGlzIGhldXJpc3RpYworICAgIGFjY2VwdHMgImFhYWFhYSIgYXMgYSBwYXNzd29yZC4KKyovCisKKyNkZWZpbmUgRk9SX3Bhc3N3ZAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqYWxnbzsKKykKKworc3RhdGljIGludCBzdHJfY2hlY2soY2hhciAqcywgY2hhciAqcCkKK3sKKyAgaWYgKHN0cm5zdHIocywgcCkgfHwgc3RybnN0cihwLCBzKSkgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvLyBJbnNhbmUgaGV1cmlzdGljIHdvbid0IGZpbmQgcGFzc3dvcmQxIHBhc3N3b3JkMiBwYXNzd29yZDMuLi4/CitzdGF0aWMgdm9pZCBzdHJlbmd0aF9jaGVjayhjaGFyICpuZXdwLCBjaGFyICpvbGRwLCBjaGFyICp1c2VyKQoreworICBjaGFyICptc2cgPSBOVUxMOworCisgIGlmIChzdHJsZW4obmV3cCkgPCA2KSB7IC8vTWluIHBhc3N3ZCBsZW4KKyAgICBtc2cgPSAidG9vIHNob3J0IjsKKyAgICB4cHJpbnRmKCJCQUQgUEFTU1dPUkQ6ICVzXG4iLG1zZyk7CisgIH0KKyAgaWYgKCFuZXdwWzBdKSByZXR1cm47IC8vcGFzc3dkIGlzIGVtcHR5CisKKyAgaWYgKHN0cl9jaGVjayhuZXdwLCB1c2VyKSkgeworICAgIG1zZyA9ICJ1c2VyIGJhc2VkIHBhc3N3b3JkIjsKKyAgICB4cHJpbnRmKCJCQUQgUEFTU1dPUkQ6ICVzXG4iLG1zZyk7CisgIH0KKworICBpZiAob2xkcFswXSAmJiBzdHJfY2hlY2sobmV3cCwgb2xkcCkpIHsKKyAgICBtc2cgPSAiYmFzZWQgb24gb2xkIHBhc3N3ZCI7CisgICAgeHByaW50ZigiQkFEIFBBU1NXT1JEOiAlc1xuIixtc2cpOworICB9Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X3Bhc3N3ZChjaGFyICogcHdkKQoreworICBjaGFyICogcGFzczsKKworICBpZiAoIXB3ZCkgcmV0dXJuIDE7CisgIGlmIChwd2RbMF0gPT0gJyEnIHx8IHB3ZFswXSA9PSAnKicpIHJldHVybiAxOworCisgIHBhc3MgPSBjcnlwdCh0b3lidWYsIHB3ZCk7CisgIGlmIChwYXNzICAmJiAhc3RyY21wKHBhc3MsIHB3ZCkpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgY2hhciAqbmV3X3Bhc3N3b3JkKGNoYXIgKm9sZHAsIGNoYXIgKnVzZXIpCit7CisgIGNoYXIgKm5ld3AgPSBOVUxMOworCisgIGlmIChyZWFkX3Bhc3N3b3JkKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICJOZXcgcGFzc3dvcmQ6IikpCisgICAgcmV0dXJuIE5VTEw7IC8vbWF5IGJlIGR1ZSB0byBDdHJsLUMKKworICBuZXdwID0geHN0cmR1cCh0b3lidWYpOworICBpZiAoQ0ZHX1BBU1NXRF9TQUQpIHN0cmVuZ3RoX2NoZWNrKG5ld3AsIG9sZHAsIHVzZXIpOworICBpZiAocmVhZF9wYXNzd29yZCh0b3lidWYsIHNpemVvZih0b3lidWYpLCAiUmV0eXBlIHBhc3N3b3JkOiIpKSB7CisgICAgZnJlZShuZXdwKTsKKyAgICByZXR1cm4gTlVMTDsgLy9tYXkgYmUgZHVlIHRvIEN0cmwtQworICB9CisKKyAgaWYgKCFzdHJjbXAobmV3cCwgdG95YnVmKSkgcmV0dXJuIG5ld3A7CisgIGVsc2UgZXJyb3JfbXNnKCJQYXNzd29yZHMgZG8gbm90IG1hdGNoLlxuIik7CisgIC8vIEZhaWx1cmUgQ2FzZQorICBmcmVlKG5ld3ApOworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBwYXNzd2RfbWFpbih2b2lkKQoreworICB1aWRfdCBteXVpZDsKKyAgc3RydWN0IHBhc3N3ZCAqcHc7CisgIHN0cnVjdCBzcHdkICpzcDsKKyAgY2hhciAqbmFtZSA9IE5VTEwsICpwYXNzID0gTlVMTCwgKmVuY3J5cHRlZCA9IE5VTEwsICpuZXdwID0gTlVMTCwKKyAgICAgICAqb3JpZyA9IChjaGFyICopIiIsIHNhbHRbTUFYX1NBTFRfTEVOXTsKKyAgaW50IHJldCA9IC0xOworCisgIG15dWlkID0gZ2V0dWlkKCk7CisgIGlmIChteXVpZCAmJiAodG95cy5vcHRmbGFncyAmIChGTEFHX2wgfCBGTEFHX3UgfCBGTEFHX2QpKSkKKyAgICBlcnJvcl9leGl0KCJOb3Qgcm9vdCIpOworCisgIHB3ID0geGdldHB3dWlkKG15dWlkKTsKKworICBpZiAoKnRveXMub3B0YXJncykgbmFtZSA9IHRveXMub3B0YXJnc1swXTsKKyAgZWxzZSBuYW1lID0geHN0cmR1cChwdy0+cHdfbmFtZSk7CisKKyAgcHcgPSB4Z2V0cHduYW0obmFtZSk7CisKKyAgaWYgKG15dWlkICYmIChteXVpZCAhPSBwdy0+cHdfdWlkKSkgZXJyb3JfZXhpdCgiTm90IHJvb3QiKTsKKworICBwYXNzID0gcHctPnB3X3Bhc3N3ZDsKKyAgaWYgKHB3LT5wd19wYXNzd2RbMF0gPT0gJ3gnKSB7CisgICAgLy9nZXQgc2hhZG93IHBhc3N3ZAorICAgIHNwID0gZ2V0c3BuYW0obmFtZSk7CisgICAgaWYgKHNwKSBwYXNzID0gc3AtPnNwX3B3ZHA7CisgIH0KKworCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19sIHwgRkxBR191IHwgRkxBR19kKSkpIHsKKyAgICAKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSkgVFQuYWxnbyA9ICJkZXMiOworICAgIGlmIChnZXRfc2FsdChzYWx0LCBUVC5hbGdvKSA9PSAtMSkKKyAgICAgIGVycm9yX2V4aXQoIkVycm9yOiBVbmtvd24gZW5jcnlwdGlvbiBhbGdvcml0aG1cbiIpOworCisgICAgcHJpbnRmKCJDaGFuZ2luZyBwYXNzd29yZCBmb3IgJXNcbiIsbmFtZSk7CisgICAgaWYgKG15dWlkICYmIHBhc3NbMF0gPT0gJyEnKQorICAgICAgZXJyb3JfZXhpdCgiQ2FuJ3QgY2hhbmdlLCBwYXNzd29yZCBpcyBsb2NrZWQgZm9yICVzIixuYW1lKTsKKyAgICBpZiAobXl1aWQpIHsKKyAgICAgIC8vVmFsaWRhdGUgdXNlciAKKworICAgICAgaWYgKHJlYWRfcGFzc3dvcmQodG95YnVmLCBzaXplb2YodG95YnVmKSwgIk9yaWdpYWwgcGFzc3dvcmQ6IikpIHsKKyAgICAgICAgaWYgKCF0b3lzLm9wdGFyZ3NbMF0pIGZyZWUobmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG9yaWcgPSB0b3lidWY7CisgICAgICBpZiAodmVyaWZ5X3Bhc3N3ZChwYXNzKSkgZXJyb3JfZXhpdCgiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBvcmlnID0geHN0cmR1cChvcmlnKTsKKworICAgIC8vIEdldCBuZXcgcGFzc3dvcmQKKyAgICBuZXdwID0gbmV3X3Bhc3N3b3JkKG9yaWcsIG5hbWUpOworICAgIGlmICghbmV3cCkgeworICAgICAgZnJlZShvcmlnKTsKKyAgICAgIGlmICghdG95cy5vcHRhcmdzWzBdKSBmcmVlKG5hbWUpOworICAgICAgcmV0dXJuOyAvL25ldyBwYXNzd29yZCBpcyBub3Qgc2V0IHdlbGwuCisgICAgfQorCisgICAgZW5jcnlwdGVkID0gY3J5cHQobmV3cCwgc2FsdCk7CisgICAgZnJlZShuZXdwKTsKKyAgICBmcmVlKG9yaWcpOworICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHsKKyAgICBpZiAocGFzc1swXSA9PSAnIScpIGVycm9yX2V4aXQoInBhc3N3b3JkIGlzIGFscmVhZHkgbG9ja2VkIGZvciAlcyIsbmFtZSk7CisgICAgcHJpbnRmKCJMb2NraW5nIHBhc3N3b3JkIGZvciAlc1xuIixuYW1lKTsKKyAgICBlbmNyeXB0ZWQgPSB4bXByaW50ZigiISVzIixwYXNzKTsKKyAgfSBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR191KSB7CisgICAgaWYgKHBhc3NbMF0gIT0gJyEnKSBlcnJvcl9leGl0KCJwYXNzd29yZCBpcyBhbHJlYWR5IHVubG9ja2VkIGZvciAlcyIsbmFtZSk7CisKKyAgICBwcmludGYoIlVubG9ja2luZyBwYXNzd29yZCBmb3IgJXNcbiIsbmFtZSk7CisgICAgZW5jcnlwdGVkID0geHN0cmR1cCgmcGFzc1sxXSk7CisgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZCkgeworICAgIHByaW50ZigiRGVsZXRpbmcgcGFzc3dvcmQgZm9yICVzXG4iLG5hbWUpOworICAgIGVuY3J5cHRlZCA9IHhzdHJkdXAoIiIpOyAvLzEgPSAiIiwgMiA9ICdcMCcKKyAgfQorCisgIC8vIFVwZGF0ZSB0aGUgcGFzc3dkCisgIGlmIChwdy0+cHdfcGFzc3dkWzBdID09ICd4JykKKyAgICByZXQgPSB1cGRhdGVfcGFzc3dvcmQoIi9ldGMvc2hhZG93IiwgbmFtZSwgZW5jcnlwdGVkKTsKKyAgZWxzZSByZXQgPSB1cGRhdGVfcGFzc3dvcmQoIi9ldGMvcGFzc3dkIiwgbmFtZSwgZW5jcnlwdGVkKTsKKworICBpZiAoKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19sIHwgRkxBR191IHwgRkxBR19kKSkpIGZyZWUoZW5jcnlwdGVkKTsKKworICBpZiAoIXRveXMub3B0YXJnc1swXSkgZnJlZShuYW1lKTsKKyAgaWYgKCFyZXQpIGVycm9yX21zZygiU3VjY2VzcyIpOworICBlbHNlIGVycm9yX21zZygiRmFpbHVyZSIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbHNiL3BpZG9mLmMgYi90b3lib3gvdG95cy9sc2IvcGlkb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZhY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL3BpZG9mLmMKQEAgLTAsMCArMSw0NCBAQAorLyogcGlkb2YuYyAtIFByaW50IHRoZSBQcm9jZXNzIElEcyBvZiBhbGwgcHJvY2Vzc2VzIHdpdGggdGhlIGdpdmVuIG5hbWVzLgorICoKKyAqIENvcHlyaWdodCAyMDEyIEFuZHJlYXMgSGVjayA8YWhlY2tAZ214LmRlPgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKyAqCisgKiBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL3BpZG9mLmh0bWwKKworVVNFX1BJRE9GKE5FV1RPWShwaWRvZiwgIjwxc286IiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgUElET0YKKyAgYm9vbCAicGlkb2YiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHBpZG9mIFstc10gWy1vIG9taXRwaWRbLG9taXRwaWQuLi5dXSBbTkFNRV0uLi4KKworICAgIFByaW50IHRoZSBQSURzIG9mIGFsbCBwcm9jZXNzZXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZXMuCisKKyAgICAtcwlzaW5nbGUgc2hvdCwgb25seSByZXR1cm4gb25lIHBpZC4KKyAgICAtbwlvbWl0IFBJRChzKQorKi8KKworI2RlZmluZSBGT1JfcGlkb2YKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKm9taXQ7CispCisKK3N0YXRpYyBpbnQgcHJpbnRfcGlkKHBpZF90IHBpZCwgY2hhciAqbmFtZSkKK3sKKyAgc3ByaW50Zih0b3lidWYsICIlZCIsIChpbnQpcGlkKTsKKyAgaWYgKGNvbW1hX3NjYW4oVFQub21pdCwgdG95YnVmLCAwKSkgcmV0dXJuIDA7CisgIHhwcmludGYoIiAlcyIrISF0b3lzLmV4aXR2YWwsIHRveWJ1Zik7CisgIHRveXMuZXhpdHZhbCA9IDA7CisKKyAgcmV0dXJuIHRveXMub3B0ZmxhZ3MgJiBGTEFHX3M7Cit9CisKK3ZvaWQgcGlkb2ZfbWFpbih2b2lkKQoreworICB0b3lzLmV4aXR2YWwgPSAxOworICBuYW1lc190b19waWQodG95cy5vcHRhcmdzLCBwcmludF9waWQpOworICBpZiAoIXRveXMuZXhpdHZhbCkgeHB1dGMoJ1xuJyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2Ivc2VxLmMgYi90b3lib3gvdG95cy9sc2Ivc2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwZjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL2xzYi9zZXEuYwpAQCAtMCwwICsxLDkzIEBACisvKiBzZXEuYyAtIENvdW50IGZyb20gZmlyc3QgdG8gbGFzdCwgYnkgaW5jcmVtZW50LgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy9zZXEuaHRtbAorCitVU0VfU0VRKE5FV1RPWShzZXEsICI8MT4zP2Y6czp3WyFmd10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBTRVEKKyAgYm9vbCAic2VxIgorICBkZXBlbmRzIG9uIFRPWUJPWF9GTE9BVAorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzZXEgWy13fC1mIGZtdF9zdHJdIFstcyBzZXBfc3RyXSBbZmlyc3RdIFtpbmNyZW1lbnRdIGxhc3QKKworICAgIENvdW50IGZyb20gZmlyc3QgdG8gbGFzdCwgYnkgaW5jcmVtZW50LiBPbWl0dGVkIGFyZ3VtZW50cyBkZWZhdWx0CisgICAgdG8gMS4gVHdvIGFyZ3VtZW50cyBhcmUgdXNlZCBhcyBmaXJzdCBhbmQgbGFzdC4gQXJndW1lbnRzIGNhbiBiZQorICAgIG5lZ2F0aXZlIG9yIGZsb2F0aW5nIHBvaW50LgorCisgICAgLWYJVXNlIGZtdF9zdHIgYXMgYSBwcmludGYtc3R5bGUgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IHN0cmluZworICAgIC1zCVVzZSBzZXBfc3RyIGFzIHNlcGFyYXRvciwgZGVmYXVsdCBpcyBhIG5ld2xpbmUgY2hhcmFjdGVyCisgICAgLXcJUGFkIHRvIGVxdWFsIHdpZHRoIHdpdGggbGVhZGluZyB6ZXJvZXMuCisqLworCisjZGVmaW5lIEZPUl9zZXEKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnNlcDsKKyAgY2hhciAqZm10OworKQorCisvLyBFbnN1cmUgdGhlcmUncyBvbmUgJWYgZXNjYXBlIHdpdGggY29ycmVjdCBhdHRyaWJ1dGVzCitzdGF0aWMgdm9pZCBpbnNhbml0aXplKGNoYXIgKmYpCit7CisgIGNoYXIgKnMgPSBuZXh0X3ByaW50ZihmLCAwKTsKKworICBpZiAoIXMpIGVycm9yX2V4aXQoImJhZCAtZiBubyAlJWYiKTsKKyAgaWYgKC0xID09IHN0cmlkeCgiYUFlRWZGZ0ciLCAqcykgfHwgKHMgPSBuZXh0X3ByaW50ZihzLCAwKSkpIHsKKyAgICAvLyBUaGUgQCBpcyBhIGJ5dGUgb2Zmc2V0LCBub3QgdXRmOCBjaGFycy4gV2FpdGluZyBmb3Igc29tZWJvZHkgdG8gY29tcGxhaW4uCisgICAgZXJyb3JfZXhpdCgiYmFkIC1mICclcydAJWQiLCBmLCAoaW50KShzLWYrMSkpOworICB9Cit9CisKK3ZvaWQgc2VxX21haW4odm9pZCkKK3sKKyAgZG91YmxlIGZpcnN0LCBpbmNyZW1lbnQsIGxhc3QsIGRkOworICBjaGFyICpzZXBfc3RyID0gIlxuIiwgKmZtdF9zdHIgPSAiJWciOworICBpbnQgb3V0cHV0ID0gMDsKKworICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB3aXRoIGFwcHJvcHJpYXRlIGRlZmF1bHRzLgorICAvLyBOb3RlIHRoYXQgYW55IG5vbi1udW1lcmljIGFyZ3VtZW50cyBhcmUgdHJlYXRlZCBhcyB6ZXJvLgorICBmaXJzdCA9IGluY3JlbWVudCA9IDE7CisgIHN3aXRjaCAodG95cy5vcHRjKSB7CisgICAgY2FzZSAzOiBpbmNyZW1lbnQgPSBhdG9mKHRveXMub3B0YXJnc1sxXSk7CisgICAgY2FzZSAyOiBmaXJzdCA9IGF0b2YoKnRveXMub3B0YXJncyk7CisgICAgZGVmYXVsdDogbGFzdCA9IGF0b2YodG95cy5vcHRhcmdzW3RveXMub3B0Yy0xXSk7CisgIH0KKworICAvLyBQYWQgdG8gbGFyZ2VzdCB3aWR0aAorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdykgeworICAgIGNoYXIgKnM7CisgICAgaW50IGksIGxlbiwgZG90LCBsZWZ0ID0gMCwgcmlnaHQgPSAwOworCisgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7CisgICAgICBkZCA9IChkb3VibGUgW10pe2ZpcnN0LCBpbmNyZW1lbnQsIGxhc3R9W2ldOworCisgICAgICBsZW4gPSBzcHJpbnRmKHRveWJ1ZiwgIiVnIiwgZGQpOworICAgICAgaWYgKChzID0gc3RyY2hyKHRveWJ1ZiwgJy4nKSkpIHsKKyAgICAgICAgZG90ID0gcy10b3lidWY7CisgICAgICAgIGlmIChsZWZ0PGRvdCkgbGVmdCA9IGRvdDsKKyAgICAgICAgZG90ID0gbGVuLWRvdC0xOworICAgICAgICBpZiAocmlnaHQ8ZG90KSByaWdodCA9IGRvdDsKKyAgICAgIH0gZWxzZSBpZiAobGVuPmxlZnQpIGxlZnQgPSBsZW47CisgICAgfQorCisgICAgc3ByaW50ZihmbXRfc3RyID0gdG95YnVmLCAiJSUwJWQuJWRmIiwgbGVmdCtyaWdodCshIXJpZ2h0LCByaWdodCk7CisgIH0KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpIGluc2FuaXRpemUoZm10X3N0ciA9IFRULmZtdCk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSBzZXBfc3RyID0gVFQuc2VwOworCisgIC8vIFllcywgd2UncmUgbG9vcGluZyBvbiBhIGRvdWJsZS4gIFllcyByb3VuZGluZyBlcnJvcnMgY2FuIGFjY3VtdWxhdGUgaWYKKyAgLy8geW91IHVzZSBhIG5vbi1pbnRlZ2VyIGluY3JlbWVudC4gIERlYWwgd2l0aCBpdC4KKyAgZm9yIChkZD1maXJzdDsgKGluY3JlbWVudD4wICYmIGRkPD1sYXN0KSB8fCAoaW5jcmVtZW50PDAgJiYgZGQ+PWxhc3QpOworICAgIGRkKz1pbmNyZW1lbnQpCisgIHsKKyAgICBpZiAoZGQgIT0gZmlyc3QpIHByaW50ZigiJXMiLCBzZXBfc3RyKTsKKyAgICBwcmludGYoZm10X3N0ciwgZGQpOworICAgIG91dHB1dCA9IDE7CisgIH0KKworICBpZiAob3V0cHV0KSBwcmludGYoIlxuIik7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2Ivc3UuYyBiL3RveWJveC90b3lzL2xzYi9zdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjI0ODcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9sc2Ivc3UuYwpAQCAtMCwwICsxLDk5IEBACisvKiBzdS5jIC0gc3dpdGNoIHVzZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBDRSBTdHJha2UgPHN0cmFrZTg4OEBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvc3UuaHRtbAorICogVE9ETzogbG9nIHN1IGF0dGVtcHRzCisKK1VTRV9TVShORVdUT1koc3UsICJsbXBjOnM6IiwgVE9ZRkxBR19CSU58VE9ZRkxBR19ST09UT05MWSkpCisKK2NvbmZpZyBTVQorICBib29sICJzdSIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX1NIQURPVworICBoZWxwCisgICAgdXNhZ2U6IHN1IFstbG1wXSBbLWMgQ01EXSBbLXMgU0hFTExdIFtVU0VSIFtBUkdTLi4uXV0KKworICAgIFN3aXRjaCB0byB1c2VyIChvciByb290KSBhbmQgcnVuIHNoZWxsICh3aXRoIG9wdGlvbmFsIGNvbW1hbmQgbGluZSkuCisKKyAgICAtcwlzaGVsbCB0byB1c2UKKyAgICAtYwljb21tYW5kIHRvIHBhc3MgdG8gc2hlbGwgd2l0aCAtYworICAgIC1sCWxvZ2luIHNoZWxsCisgICAgLShtfHApCXByZXNlcnZlIGVudmlyb25tZW50CisqLworCisjZGVmaW5lIEZPUl9zdQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqczsKKyAgY2hhciAqYzsKKykKKworc3RhdGljIGNoYXIgKnNuYXBzaG90X2VudihjaGFyICpuYW1lKQoreworICBjaGFyICpzID0gZ2V0ZW52KG5hbWUpOworCisgIGlmIChzKSByZXR1cm4geG1wcmludGYoIiVzPSVzIiwgbmFtZSwgcyk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3VfbWFpbigpCit7CisgIGNoYXIgKm5hbWUsICpwYXNzaGFzaCA9IDAsICoqYXJndSwgKiphcmd2OworICBzdHJ1Y3QgcGFzc3dkICp1cDsKKyAgc3RydWN0IHNwd2QgKnNocDsKKworICBpZiAoKnRveXMub3B0YXJncyAmJiAhc3RyY21wKCItIiwgKnRveXMub3B0YXJncykpIHsKKyAgICB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfbDsKKyAgICB0b3lzLm9wdGFyZ3MrKzsKKyAgfQorCisgIGlmICgqdG95cy5vcHRhcmdzKSBuYW1lID0gKih0b3lzLm9wdGFyZ3MrKyk7CisgIGVsc2UgbmFtZSA9ICJyb290IjsKKworICBpZiAoIShzaHAgPSBnZXRzcG5hbShuYW1lKSkpIHBlcnJvcl9leGl0KCJubyAnJXMnIiwgbmFtZSk7CisgIGlmIChnZXR1aWQoKSkgeworICAgIGlmICgqc2hwLT5zcF9wd2RwICE9ICckJykgZ290byBkZW55OworICAgIGlmIChyZWFkX3Bhc3N3b3JkKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICJQYXNzd29yZDogIikpIGdvdG8gZGVueTsKKyAgICBwYXNzaGFzaCA9IGNyeXB0KHRveWJ1Ziwgc2hwLT5zcF9wd2RwKTsKKyAgICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgICAgaWYgKCFwYXNzaGFzaCB8fCBzdHJjbXAocGFzc2hhc2gsIHNocC0+c3BfcHdkcCkpIGdvdG8gZGVueTsKKyAgfQorCisgIHVwID0geGdldHB3bmFtKG5hbWUpOworICB4c2V0dXNlcih1cCk7CisKKyAgYXJndiA9IGFyZ3UgPSB4bWFsbG9jKHNpemVvZihjaGFyICopKih0b3lzLm9wdGMgKyA0KSk7CisgICooYXJndisrKSA9IFRULnMgPyBUVC5zIDogdXAtPnB3X3NoZWxsOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSB7CisgICAgaW50IGk7CisgICAgY2hhciAqc3R1ZmZbXSA9IHtzbmFwc2hvdF9lbnYoIlRFUk0iKSwgc25hcHNob3RfZW52KCJESVNQTEFZIiksCisgICAgICBzbmFwc2hvdF9lbnYoIkNPTE9SVEVSTSIpLCBzbmFwc2hvdF9lbnYoIlhBVVRIT1JJVFkiKX07CisKKyAgICBjbGVhcmVudigpOworICAgIGZvciAoaT0wOyBpIDwgQVJSQVlfTEVOKHN0dWZmKTsgaSsrKSBpZiAoc3R1ZmZbaV0pIHB1dGVudihzdHVmZltpXSk7CisgICAgKihhcmd2KyspID0gIi1sIjsKKyAgICB4Y2hkaXIodXAtPnB3X2Rpcik7CisgIH0gZWxzZSB1bnNldGVudigiSUZTIik7CisgIHNldGVudigiUEFUSCIsICIvc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiIsIDEpOworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgKEZMQUdfbXxGTEFHX3ApKSkgeworICAgIHNldGVudigiSE9NRSIsIHVwLT5wd19kaXIsIDEpOworICAgIHNldGVudigiU0hFTEwiLCB1cC0+cHdfc2hlbGwsIDEpOworICAgIHNldGVudigiVVNFUiIsIHVwLT5wd19uYW1lLCAxKTsKKyAgICBzZXRlbnYoIkxPR05BTUUiLCB1cC0+cHdfbmFtZSwgMSk7CisgIH0gZWxzZSB1bnNldGVudigiSUZTIik7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIHsKKyAgICAqKGFyZ3YrKykgPSAiLWMiOworICAgICooYXJndisrKSA9IFRULmM7CisgIH0KKyAgd2hpbGUgKCgqKGFyZ3YrKykgPSAqKHRveXMub3B0YXJncysrKSkpOworICB4ZXhlYyhhcmd1KTsKKworZGVueToKKyAgcHV0cygiTm8uIik7CisgIHRveXMuZXhpdHZhbCA9IDE7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9sc2Ivc3luYy5jIGIvdG95Ym94L3RveXMvbHNiL3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJhOGNjCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL3N5bmMuYwpAQCAtMCwwICsxLDIzIEBACisvKiBzeW5jLmMgLSBXcml0ZSBhbGwgcGVuZGluZyBkYXRhIHRvIGRpc2suCisgKgorICogQ29weXJpZ2h0IDIwMDcgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL3N5bmMuaHRtbAorCitVU0VfU1lOQyhORVdUT1koc3luYywgTlVMTCwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgU1lOQworICBib29sICJzeW5jIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzeW5jCisKKyAgICBXcml0ZSBwZW5kaW5nIGNhY2hlZCBkYXRhIHRvIGRpc2sgKHN5bmNocm9uaXplKSwgYmxvY2tpbmcgdW50aWwgZG9uZS4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgc3luY19tYWluKHZvaWQpCit7CisgIHN5bmMoKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL2xzYi91bW91bnQuYyBiL3RveWJveC90b3lzL2xzYi91bW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjk5NGYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvbHNiL3Vtb3VudC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiB1bW91bnQuYyAtIFVubW91bnQgYSBtb3VudCBwb2ludC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL3Vtb3VudC5odG1sCisgKgorICogTm90ZTogLW4gKC9ldGMvbXRhYikgaXMgb2Jzb2xldGUsIC9wcm9jL21vdW50cyByZXBsYWNlZCBpdC4gTmVpdGhlciBjaHJvb3QKKyAqIG5vciBwZXItcHJvY2VzcyBtb3VudCBuYW1lc3BhY2VzIGNhbiB3b3JrIHNhbmVseSB3aXRoIG10YWIuIFRoZSBrZXJuZWwKKyAqIHRyYWNrcyBtb3VudCBwb2ludHMgbm93LCBhIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBjYW4ndCBkbyBzbyBhbnltb3JlLgorCitVU0VfVU1PVU5UKE5FV1RPWSh1bW91bnQsICJuZERmbHJhdCp2WyFuYV0iLCBUT1lGTEFHX0JJTnxUT1lGTEFHX1NUQVlST09UKSkKKworY29uZmlnIFVNT1VOVAorICBib29sICJ1bW91bnQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHVtb3VudCBbLWEgWy10IFRZUEVbLFRZUEUuLi5dXV0gWy12cmZEXSBbRElSLi4uXQorCisgICAgVW5tb3VudCB0aGUgbGlzdGVkIGZpbGVzeXN0ZW1zLgorCisgICAgLWEJVW5tb3VudCBhbGwgbW91bnRzIGluIC9wcm9jL21vdW50cyBpbnN0ZWFkIG9mIGNvbW1hbmQgbGluZSBsaXN0CisgICAgLUQgIERvbid0IGZyZWUgbG9vcGJhY2sgZGV2aWNlKHMpLgorICAgIC1mICBGb3JjZSB1bm1vdW50LgorICAgIC1sICBMYXp5IHVubW91bnQgKGRldGFjaCBmcm9tIGZpbGVzeXN0ZW0gbm93LCBjbG9zZSB3aGVuIGxhc3QgdXNlciBkb2VzKS4KKyAgICAtbglEb24ndCB1c2UgL3Byb2MvbW91bnRzCisgICAgLXIgIFJlbW91bnQgcmVhZCBvbmx5IGlmIHVubW91bnRpbmcgZmFpbHMuCisgICAgLXQJUmVzdHJpY3QgImFsbCIgdG8gbW91bnRzIG9mIFRZUEUgKG9yIHVzZSAibm9UWVBFIiB0byBza2lwKQorICAgIC12CVZlcmJvc2UKKyovCisKKyNkZWZpbmUgRk9SX3Vtb3VudAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgc3RydWN0IGFyZ19saXN0ICp0OworCisgIGNoYXIgKnR5cGVzOworKQorCisvLyB0b2RvIChkb25lPykKKy8vICAgYm9ycm93IGRmIGNvZGUgdG8gaWRlbnRpZnkgZmlsZXN5c3RlbT8KKy8vICAgdW1vdW50IC1hIGZyb20gZnN0YWIKKy8vICAgdW1vdW50IHdoZW4gZ2V0cGlkKCkgbm90IDAsIGFjY29yZGluZyB0byBmc3RhYgorLy8gICBsb29rdXAgbW91bnQ6IGxvc2V0dXAgLWQsIGJpbmQsIGZpbGUsIGJsb2NrCisvLyAgIGxvb3BiYWNrIGRlbGV0ZQorLy8gICBmc3RhYiAtbyB1c2VyCisKKy8vIFRPRE8KKy8vIHN3YXBvbiwgc3dhcG9mZgorCitzdGF0aWMgdm9pZCBkb191bW91bnQoY2hhciAqZGlyLCBjaGFyICpkZXYsIGludCBmbGFncykKK3sKKyAgLy8gaXMgaXQgb2sgZm9yIHRoaXMgdXNlciB0byB1bW91bnQgdGhpcyBtb3VudD8KKyAgaWYgKENGR19UT1lCT1hfU1VJRCAmJiBnZXR1aWQoKSkgeworICAgIHN0cnVjdCBtdGFiX2xpc3QgKm10ID0gZGxpc3RfdGVybWluYXRlKHhnZXRtb3VudGxpc3QoIi9ldGMvZnN0YWIiKSk7CisgICAgaW50IGxlbiwgdXNlciA9IDA7CisKKyAgICB3aGlsZSAobXQpIHsKKyAgICAgIHN0cnVjdCBtdGFiX2xpc3QgKm10ZW1wID0gbXQ7CisgICAgICBjaGFyICpzOworCisgICAgICBpZiAoIXN0cmNtcChtdC0+ZGlyLCBkaXIpKSB3aGlsZSAoKHMgPSBjb21tYV9pdGVyYXRlKCZtdC0+b3B0cywgJmxlbikpKSB7CisgICAgICAgIGlmIChsZW4gPT0gNCAmJiBzdHJuY21wKHMsICJ1c2VyIiwgNCkpIHVzZXIgPSAxOworICAgICAgICBlbHNlIGlmIChsZW4gPT0gNiAmJiBzdHJuY21wKHMsICJub3VzZXIiLCA2KSkgdXNlciA9IDA7ICAKKyAgICAgIH0KKworICAgICAgbXQgPSBtdC0+bmV4dDsKKyAgICAgIGZyZWUobXRlbXApOworICAgIH0KKworICAgIGlmICghdXNlcikgeworICAgICAgZXJyb3JfbXNnKCJub3Qgcm9vdCIpOworCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYgKCF1bW91bnQyKGRpciwgZmxhZ3MpKSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIHhwcmludGYoIiVzIHVubW91bnRlZFxuIiwgZGlyKTsKKworICAgIC8vIEF0dGVtcHQgdG8gZGlzYXNzb2NpYXRlIGxvb3BiYWNrIGRldmljZS4gVGhpcyBpb2N0bCBzaG91bGQgYmUgaWdub3JlZAorICAgIC8vIGZvciBhbnl0aGluZyBlbHNlLCBiZWNhdXNlIGxhbmFuYSBhbGxvY2F0ZWQgaW9jdGwgcmFuZ2UgJ0wnIHRvIGxvb3BiYWNrCisgICAgaWYgKGRldiAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpKSB7CisgICAgICBpbnQgbGZkID0gb3BlbihkZXYsIE9fUkRPTkxZKTsKKworICAgICAgaWYgKGxmZCAhPSAtMSkgeworICAgICAgICAvLyBUaGlzIGlzIExPT1BfQ0xSX0ZELCBmZXRjaGluZyBpdCBmcm9tIGhlYWRlcnMgaXMgYXdrd2FyZAorICAgICAgICBpZiAoIWlvY3RsKGxmZCwgMHg0QzAxKSAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikpCisgICAgICAgICAgeHByaW50ZigiJXMgY2xlYXJlZFxuIiwgZGV2KTsKKyAgICAgICAgY2xvc2UobGZkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcikgeworICAgIGlmICghbW91bnQoIiIsIGRpciwgIiIsIE1TX1JFTU9VTlR8TVNfUkRPTkxZLCAiIikpIHsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB4cHJpbnRmKCIlcyByZW1vdW50ZWQgcm9cbiIsIGRpcik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgcGVycm9yX21zZ19yYXcoZGlyKTsKK30KKwordm9pZCB1bW91bnRfbWFpbih2b2lkKQoreworICBjaGFyICoqb3B0YXJncywgKnBtID0gIi9wcm9jL21vdW50cyI7CisgIHN0cnVjdCBtdGFiX2xpc3QgKm1sc2F2ZSA9IDAsICptbHJldiA9IDAsICptbDsKKyAgaW50IGZsYWdzPTA7CisKKyAgaWYgKCF0b3lzLm9wdGMgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSkKKyAgICBlcnJvcl9leGl0KCJOZWVkIDEgYXJnIG9yIC1hIik7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpIGZsYWdzIHw9IE1OVF9GT1JDRTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIGZsYWdzIHw9IE1OVF9ERVRBQ0g7CisKKyAgLy8gTG9hZCAvcHJvYy9tb3VudHMgYW5kIGdldCBhIHJldmVyc2VkIGxpc3QgKG5ld2VzdCBmaXJzdCkKKyAgLy8gV2UgdXNlIHRoZSBsaXN0IGJvdGggZm9yIC1hLCBhbmQgdG8gdW1vdW50IC9kZXYvbmFtZSBvciBkbyBsb3NldHVwIC1kCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pICYmICFhY2Nlc3MocG0sIFJfT0spKQorICAgIG1scmV2ID0gZGxpc3RfdGVybWluYXRlKG1sc2F2ZSA9IHhnZXRtb3VudGxpc3QocG0pKTsKKworICAvLyBVbm1vdW50IGFsbDogbG9vcCB0aHJvdWdoIG1vdW50ZWQgZmlsZXN5c3RlbXMsIHNraXAgLXQsIHVubW91bnQgdGhlIHJlc3QKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpIHsKKyAgICBjaGFyICp0eXBlc3RyID0gMDsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKnRhbDsKKyAgICAKKyAgICBmb3IgKHRhbCA9IFRULnQ7IHRhbDsgdGFsID0gdGFsLT5uZXh0KSBjb21tYV9jb2xsYXRlKCZ0eXBlc3RyLCB0YWwtPmFyZyk7CisgICAgZm9yIChtbCA9IG1scmV2OyBtbDsgbWwgPSBtbC0+cHJldikKKyAgICAgIGlmIChtb3VudGxpc3RfaXN0eXBlKG1sLCB0eXBlc3RyKSkgZG9fdW1vdW50KG1sLT5kaXIsIG1sLT5kZXZpY2UsIGZsYWdzKTsKKyAgICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSB7CisgICAgICBmcmVlKHR5cGVzdHIpOworICAgICAgbGxpc3RfdHJhdmVyc2UobWxzYXZlLCBmcmVlKTsKKyAgICB9CisgIC8vIFRPRE86IHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBkbyB3ZSB1bW91bnQgbm9uLWFic29sdXRlIHBhdGg/CisgIH0gZWxzZSBmb3IgKG9wdGFyZ3MgPSB0b3lzLm9wdGFyZ3M7ICpvcHRhcmdzOyBvcHRhcmdzKyspIHsKKyAgICBjaGFyICphYnMgPSB4YWJzcGF0aCgqb3B0YXJncywgMCk7CisKKyAgICBmb3IgKG1sID0gYWJzID8gbWxyZXYgOiAwOyBtbDsgbWwgPSBtbC0+cHJldikgeworICAgICAgaWYgKCFzdHJjbXAobWwtPmRpciwgYWJzKSkgYnJlYWs7CisgICAgICBpZiAoIXN0cmNtcChtbC0+ZGV2aWNlLCBhYnMpKSB7CisgICAgICAgIGZyZWUoYWJzKTsKKyAgICAgICAgYWJzID0gbWwtPmRpcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgZG9fdW1vdW50KGFicyA/IGFicyA6ICpvcHRhcmdzLCBtbCA/IG1sLT5kZXZpY2UgOiAwLCBmbGFncyk7CisgICAgaWYgKG1sICYmIGFicyAhPSBtbC0+ZGlyKSBmcmVlKGFicyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL25ldC9SRUFETUUgYi90b3lib3gvdG95cy9uZXQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDhlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9uZXQvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK05ldHdvcmtpbmcKZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL25ldC9pZmNvbmZpZy5jIGIvdG95Ym94L3RveXMvbmV0L2lmY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyYTQxZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL25ldC9pZmNvbmZpZy5jCkBAIC0wLDAgKzEsNTE3IEBACisvKiBpZmNvbmZpZy5jIC0gQ29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAyMDEyIFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEyIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ2FtaWwuY29tPgorICogUmV2aWV3ZWQgYnkgS3l1bmdzdSBLaW0gPGthc3B5eEBnbWFpbC5jb20+CisgKgorICogTm90IGluIFNVU3Y0LgorCitVU0VfSUZDT05GSUcoTkVXVE9ZKGlmY29uZmlnLCAiXj9hIiwgVE9ZRkxBR19TQklOKSkKKworY29uZmlnIElGQ09ORklHCisgIGJvb2wgImlmY29uZmlnIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBpZmNvbmZpZyBbLWFdIFtJTlRFUkZBQ0UgW0FDVElPTi4uLl1dCisKKyAgICBEaXNwbGF5IG9yIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFdpdGggbm8gYXJndW1lbnRzLCBkaXNwbGF5IGFjdGl2ZSBpbnRlcmZhY2VzLiBGaXJzdCBhcmd1bWVudCBpcyBpbnRlcmZhY2UKKyAgICB0byBvcGVyYXRlIG9uLCBvbmUgYXJndW1lbnQgYnkgaXRzZWxmIGRpc3BsYXlzIHRoYXQgaW50ZXJmYWNlLgorCisgICAgLWEJU2hvdyBhbGwgaW50ZXJmYWNlcywgbm90IGp1c3QgYWN0aXZlIG9uZXMKKworICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIGludGVyZmFjZToKKworICAgIEFERFJFU1NbL05FVE1BU0tdIC0gc2V0IElQdjQgYWRkcmVzcyAoMS4yLjMuNC81KQorICAgIGRlZmF1bHQgLSB1bnNldCBpcHY0IGFkZHJlc3MKKyAgICBhZGR8ZGVsIEFERFJFU1NbL1BSRUZJWExFTl0gLSBhZGQvcmVtb3ZlIElQdjYgYWRkcmVzcyAoMTExMTo6ODg4OC8xMjgpCisgICAgdXAgLSBlbmFibGUgaW50ZXJmYWNlCisgICAgZG93biAtIGRpc2FibGUgaW50ZXJmYWNlCisKKyAgICBuZXRtYXNrfGJyb2FkY2FzdHxwb2ludG9wb2ludCBBRERSRVNTIC0gc2V0IG1vcmUgSVB2NCBjaGFyYWN0ZXJpc3RpY3MKKyAgICBodyBldGhlcnxpbmZpbmliYW5kIEFERFJFU1MgLSBzZXQgTEFOIGhhcmR3YXJlIGFkZHJlc3MgKEFBOkJCOkNDLi4uKQorICAgIHR4cXVldWVsZW4gTEVOIC0gbnVtYmVyIG9mIGJ1ZmZlcmVkIHBhY2tldHMgYmVmb3JlIG91dHB1dCBibG9ja3MKKyAgICBtdHUgTEVOIC0gc2l6ZSBvZiBvdXRnb2luZyBwYWNrZXRzIChNYXhpbXVtIFRyYW5zbWlzc2lvbiBVbml0KQorCisgICAgRmxhZ3MgeW91IGNhbiBzZXQgb24gYW4gaW50ZXJmYWNlIChvciAtcmVtb3ZlIGJ5IHByZWZpeGluZyB3aXRoIC0pOgorICAgIGFycCAtIGRvbid0IHVzZSBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgdG8gbWFwIExBTiByb3V0ZXMKKyAgICBwcm9taXNjIC0gZG9uJ3QgZGlzY2FyZCBwYWNrZXRzIHRoYXQgYXJlbid0IHRvIHRoaXMgTEFOIGhhcmR3YXJlIGFkZHJlc3MKKyAgICBtdWx0aWNhc3QgLSBmb3JjZSBpbnRlcmZhY2UgaW50byBtdWx0aWNhc3QgbW9kZSBpZiB0aGUgZHJpdmVyIGRvZXNuJ3QKKyAgICBhbGxtdWx0aSAtIHByb21pc2MgZm9yIG11bHRpY2FzdCBwYWNrZXRzCisKKyAgICBPYnNvbGV0ZSBmaWVsZHMgaW5jbHVkZWQgZm9yIGhpc3RvcmljYWwgcHVycG9zZXM6CisgICAgaXJxfGlvX2FkZHJ8bWVtX3N0YXJ0IEFERFIgLSBtaWNyb21hbmFnZSBvYnNvbGV0ZSBoYXJkd2FyZQorICAgIG91dGZpbGx8a2VlcGFsaXZlIElOVEVHRVIgLSBTTElQIGFuYWxvZyBkaWFsdXAgbGluZSBxdWFsaXR5IG1vbml0b3JpbmcKKyAgICBtZXRyaWMgSU5URUdFUiAtIGFkZGVkIHRvIExpbnV4IDAuOS4xMCB3aXRoIGNvbW1lbnQgIm5ldmVyIHVzZWQiLCBzdGlsbCB0cnVlCisqLworCisjZGVmaW5lIEZPUl9pZmNvbmZpZworI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKworR0xPQkFMUygKKyAgaW50IHNvY2tmZDsKKykKKworLy8gQ29udmVydCBob3N0bmFtZSB0byBiaW5hcnkgYWRkcmVzcyBmb3IgQUZfSU5FVCBvciBBRl9JTkVUNgorLy8gcmV0dXJuIC9wcmVmaXggKG9yIHJhbmdlIG1heCBpZiBub25lKQoraW50IGdldF9hZGRyaW5mbyhjaGFyICpob3N0LCBzYV9mYW1pbHlfdCBhZiwgdm9pZCAqYWRkcikKK3sKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzdWx0LCAqcnAgPSAwOworICBpbnQgc3RhdHVzLCBsZW47CisgIGNoYXIgKmZyb20sICpzbGFzaDsKKworICBtZW1zZXQoJmhpbnRzLCAwICwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBhZjsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworICBzbGFzaCA9IHN0cmNocihob3N0LCAnLycpOworICBpZiAoc2xhc2gpICpzbGFzaCA9IDA7CisKKyAgc3RhdHVzID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgJmhpbnRzLCAmcmVzdWx0KTsKKyAgaWYgKCFzdGF0dXMpCisgICAgZm9yIChycCA9IHJlc3VsdDsgcnA7IHJwID0gcnAtPmFpX25leHQpCisgICAgICBpZiAocnAtPmFpX2ZhbWlseSA9PSBhZikgYnJlYWs7CisgIGlmICghcnApIGVycm9yX2V4aXQoImJhZCBhZGRyZXNzICclcycgOiAlcyIsIGhvc3QsIGdhaV9zdHJlcnJvcihzdGF0dXMpKTsKKworICAvLyBhaV9hZGRyIGlzbid0IHN0cnVjdCBpbl9hZGRyIG9yIGluNl9hZGRyLCBpdCdzIHN0cnVjdCBzb2NrYWRkci4gT2YgY291cnNlLgorICAvLyBZb3UnZCB0aGluayBpcHY0IGFuZCBpcHY2IHdvdWxkIGhhdmUgc29tZSBiYXNpYyBjb21wYXRpYmlsaXR5LCBidXQgbm8uCisgIGZyb20gPSAoKGNoYXIgKilycC0+YWlfYWRkcikgKyA0OworICBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKyAgICBsZW4gPSAxNjsKKyAgICBmcm9tICs9IDQ7ICAvLyBza2lwICJmbG93aW5mbyIgZmllbGQgaXB2NiBwdXRzIGJlZm9yZSBhZGRyZXNzCisgIH0gZWxzZSBsZW4gPSA0OworICBtZW1jcHkoYWRkciwgZnJvbSwgbGVuKTsKKyAgZnJlZWFkZHJpbmZvKHJlc3VsdCk7CisKKyAgbGVuID0gLTE7CisgIGlmIChzbGFzaCkgbGVuID0gYXRvbHhfcmFuZ2Uoc2xhc2grMSwgMCwgKGFmID09IEFGX0lORVQpID8gMzIgOiAxMjgpOworCisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfaWZjb25maWcoY2hhciAqbmFtZSwgaW50IGFsd2F5cywgdW5zaWduZWQgbG9uZyBsb25nIHZhbFtdKQoreworICBzdHJ1Y3QgaWZyZXEgaWZyZTsKKyAgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsKKyAgICBjaGFyICp0aXRsZTsKKyAgfSB0eXBlc1tdID0geworICAgIHtBUlBIUkRfTE9PUEJBQ0ssICJMb2NhbCBMb29wYmFjayJ9LCB7QVJQSFJEX0VUSEVSLCAiRXRoZXJuZXQifSwKKyAgICB7QVJQSFJEX1BQUCwgIlBvaW50LXRvLVBvaW50IFByb3RvY29sIn0sIHtBUlBIUkRfSU5GSU5JQkFORCwgIkluZmluaUJhbmQifSwKKyAgICB7QVJQSFJEX1NJVCwgIklQdjYtaW4tSVB2NCJ9LCB7LTEsICJVTlNQRUMifQorICB9OworICBpbnQgaTsKKyAgY2hhciAqcHA7CisgIEZJTEUgKmZwOworICBzaG9ydCBmbGFnczsKKworICB4c3RybmNweShpZnJlLmlmcl9uYW1lLCBuYW1lLCBJRk5BTVNJWik7CisgIGlmIChpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZGTEFHUywgJmlmcmUpPDApIHBlcnJvcl9leGl0X3JhdyhuYW1lKTsKKyAgZmxhZ3MgPSBpZnJlLmlmcl9mbGFnczsKKyAgaWYgKCFhbHdheXMgJiYgIShmbGFncyAmIElGRl9VUCkpIHJldHVybjsKKworICAvLyBxdWVyeSBoYXJkd2FyZSB0eXBlIGFuZCBoYXJkd2FyZSBhZGRyZXNzCisgIGkgPSBpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZIV0FERFIsICZpZnJlKTsKKworICBmb3IgKGk9MDsgaSA8IChzaXplb2YodHlwZXMpL3NpemVvZigqdHlwZXMpKS0xOyBpKyspCisgICAgaWYgKGlmcmUuaWZyX2h3YWRkci5zYV9mYW1pbHkgPT0gdHlwZXNbaV0udHlwZSkgYnJlYWs7CisKKyAgeHByaW50ZigiJS05cyBMaW5rIGVuY2FwOiVzICAiLCBuYW1lLCB0eXBlc1tpXS50aXRsZSk7CisgIGlmKGkgPj0gMCAmJiBpZnJlLmlmcl9od2FkZHIuc2FfZmFtaWx5ID09IEFSUEhSRF9FVEhFUikgeworICAgIHhwcmludGYoIkhXYWRkciAiKTsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspIHhwcmludGYoIjolMDJ4IishaSwgaWZyZS5pZnJfaHdhZGRyLnNhX2RhdGFbaV0pOworICB9CisgIHhwdXRjKCdcbicpOworCisgIC8vIElmIGFuIGFkZHJlc3MgaXMgYXNzaWduZWQgcmVjb3JkIHRoYXQuCisKKyAgaWZyZS5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworICBtZW1zZXQoJmlmcmUuaWZyX2FkZHIsIDAsIHNpemVvZihpZnJlLmlmcl9hZGRyKSk7CisgIGlvY3RsKFRULnNvY2tmZCwgU0lPQ0dJRkFERFIsICZpZnJlKTsKKyAgcHAgPSAoY2hhciAqKSZpZnJlLmlmcl9hZGRyOworICBmb3IgKGkgPSAwOyBpPHNpemVvZihpZnJlLmlmcl9hZGRyKTsgaSsrKSBpZiAocHBbaV0pIGJyZWFrOworCisgIGlmIChpICE9IHNpemVvZihpZnJlLmlmcl9hZGRyKSkgeworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2kgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmcmUuaWZyX2FkZHI7CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBpbnQgZmxhZywgaW9jdGw7CisgICAgfSBhZGRyW10gPSB7CisgICAgICB7ImFkZHIiLCAwLCAwfSwKKyAgICAgIHsiUC10LVAiLCBJRkZfUE9JTlRPUE9JTlQsIFNJT0NHSUZEU1RBRERSfSwKKyAgICAgIHsiQmNhc3QiLCBJRkZfQlJPQURDQVNULCBTSU9DR0lGQlJEQUREUn0sCisgICAgICB7Ik1hc2siLCAwLCBTSU9DR0lGTkVUTUFTS30KKyAgICB9OworCisgICAgeHByaW50ZigiJTEwYyVzIiwgJyAnLCAoc2ktPnNpbl9mYW1pbHkgPT0gQUZfSU5FVCkgPyAiaW5ldCIgOgorICAgICAgICAoc2ktPnNpbl9mYW1pbHkgPT0gQUZfSU5FVDYpID8gImluZXQ2IiA6ICJ1bnNwZWMiKTsKKworICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKGFkZHIpL3NpemVvZigqYWRkcik7IGkrKykgeworICAgICAgaWYgKCFhZGRyW2ldLmZsYWcgfHwgKGZsYWdzICYgYWRkcltpXS5mbGFnKSkgeworICAgICAgICBpZiAoYWRkcltpXS5pb2N0bCAmJiBpb2N0bChUVC5zb2NrZmQsIGFkZHJbaV0uaW9jdGwsICZpZnJlKSkKKyAgICAgICAgICBzaS0+c2luX2ZhbWlseSA9IDA7CisgICAgICAgIHhwcmludGYoIiAlczolcyAiLCBhZGRyW2ldLm5hbWUsCisgICAgICAgICAgKHNpLT5zaW5fZmFtaWx5ID09IDB4RkZGRiB8fCAhc2ktPnNpbl9mYW1pbHkpCisgICAgICAgICAgICA/ICJbTk9UIFNFVF0iIDogaW5ldF9udG9hKHNpLT5zaW5fYWRkcikpOworICAgICAgfQorICAgIH0KKworICAgIHhwdXRjKCdcbicpOworICB9CisKKyAgZnAgPSBmb3BlbihwcCA9ICIvcHJvYy9uZXQvaWZfaW5ldDYiLCAiciIpOworICBpZiAoZnApIHsKKyAgICBjaGFyIGlmYWNlX25hbWVbSUZOQU1TSVpdOworICAgIGludCBwbGVuLCBpc2NvcGU7CisKKyAgICB3aGlsZSAoZmdldHModG95YnVmLCBzaXplb2YodG95YnVmKSwgZnApKSB7CisgICAgICBpbnQgbml0ZW1zOworICAgICAgY2hhciBpcHY2X2FkZHJbNDBdOworCisgICAgICBuaXRlbXMgPSBzc2NhbmYodG95YnVmLCAiJTMycyAlKjA4eCAlMDJ4ICUwMnggJSowMnggJTE1c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpcHY2X2FkZHIsICZwbGVuLCAmaXNjb3BlLCBpZmFjZV9uYW1lKTsKKyAgICAgIGlmIChuaXRlbXM8MCAmJiBmZW9mKGZwKSkgYnJlYWs7CisgICAgICBpZiAobml0ZW1zICE9IDQpIHBlcnJvcl9leGl0KCJiYWQgJXMiLCBwcCk7CisKKyAgICAgIGlmICghc3RyY21wKG5hbWUsIGlmYWNlX25hbWUpKSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgczY7CisgICAgICAgIGNoYXIgKnB0ciA9IGlwdjZfYWRkcitzaXplb2YoaXB2Nl9hZGRyKS0xOworCisgICAgICAgIC8vIGNvbnZlcnQgZ2lhbnQgaGV4IHN0cmluZyBpbnRvIGNvbG9uLXNwZWFyYXRlZCBpcHY2IGFkZHJlc3MgYnkKKyAgICAgICAgLy8gaW5zZXJ0aW5nICc6JyBldmVyeSA0IGNoYXJhY3RlcnMuIAorICAgICAgICBmb3IgKGkgPSAzMjsgaTsgaS0tKQorICAgICAgICAgIGlmICgoKihwdHItLSkgPSBpcHY2X2FkZHJbaV0pKSBpZiAoIShpJjMpKSAqKHB0ci0tKSA9ICc6JzsKKworICAgICAgICAvLyBDb252ZXJ0IHRvIGJpbmFyeSBhbmQgYmFjayB0byBnZXQgYWJicmV2aWF0ZWQgOjogdmVyc2lvbgorICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBpcHY2X2FkZHIsICh2b2lkICopJnM2LnNpbjZfYWRkcikgPiAwKSB7CisgICAgICAgICAgaWYgKGluZXRfbnRvcChBRl9JTkVUNiwgJnM2LnNpbjZfYWRkciwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnNjb3Blc1tdID0geyJHbG9iYWwiLCJIb3N0IiwiTGluayIsIlNpdGUiLCJDb21wYXQifSwKKyAgICAgICAgICAgICAgICAgKnNjb3BlID0gIlVua25vd24iOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZihzY29wZXMpL3NpemVvZigqc2NvcGVzKTsgaSsrKQorICAgICAgICAgICAgICBpZiAoaXNjb3BlID09ICghIWkpPDwoaSszKSkgc2NvcGUgPSBzY29wZXNbaV07CisgICAgICAgICAgICB4cHJpbnRmKCIlMTBjaW5ldDYgYWRkcjogJXMvJWQgU2NvcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAnICcsIHRveWJ1ZiwgcGxlbiwgc2NvcGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmY2xvc2UoZnApOworICB9CisKKyAgeHByaW50ZigiJTEwYyIsICcgJyk7CisKKyAgaWYgKGZsYWdzKSB7CisgICAgdW5zaWduZWQgc2hvcnQgbWFzayA9IDE7CisgICAgY2hhciAqKnMsICpzdHJbXSA9IHsKKyAgICAgICJVUCIsICJCUk9BRENBU1QiLCAiREVCVUciLCAiTE9PUEJBQ0siLCAiUE9JTlRPUE9JTlQiLCAiTk9UUkFJTEVSUyIsCisgICAgICAiUlVOTklORyIsICJOT0FSUCIsICJQUk9NSVNDIiwgIkFMTE1VTFRJIiwgIk1BU1RFUiIsICJTTEFWRSIsICJNVUxUSUNBU1QiLAorICAgICAgIlBPUlRTRUwiLCAiQVVUT01FRElBIiwgIkRZTkFNSUMiLCBOVUxMCisgICAgfTsKKworICAgIGZvciAocyA9IHN0cjsgKnM7IHMrKykgeworICAgICAgaWYgKGZsYWdzICYgbWFzaykgeHByaW50ZigiJXMgIiwgKnMpOworICAgICAgbWFzayA9IG1hc2sgPDwgMTsKKyAgICB9CisgIH0gZWxzZSB4cHJpbnRmKCJbTk8gRkxBR1NdICIpOworCisgIGlmIChpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZNVFUsICZpZnJlKSA8IDApIGlmcmUuaWZyX210dSA9IDA7CisgIHhwcmludGYoIiBNVFU6JWQiLCBpZnJlLmlmcl9tdHUpOworICBpZiAoaW9jdGwoVFQuc29ja2ZkLCBTSU9DR0lGTUVUUklDLCAmaWZyZSkgPCAwKSBpZnJlLmlmcl9tZXRyaWMgPSAwOworICBpZiAoIWlmcmUuaWZyX21ldHJpYykgaWZyZS5pZnJfbWV0cmljID0gMTsKKyAgeHByaW50ZigiICBNZXRyaWM6JWQiLCBpZnJlLmlmcl9tZXRyaWMpOworCisgIC8vIG5vbi12aXJ0dWFsIGludGVyZmFjZQorCisgIGlmICh2YWwpIHsKKyAgICBjaGFyICpsYWJlbFtdID0geyJSWCBieXRlcyIsICJSWCBwYWNrZXRzIiwgImVycm9ycyIsICJkcm9wcGVkIiwgIm92ZXJydW5zIiwKKyAgICAgICJmcmFtZSIsIDAsIDAsICJUWCBieXRlcyIsICJUWCBwYWNrZXRzIiwgImVycm9ycyIsICJkcm9wcGVkIiwgIm92ZXJydW5zIiwKKyAgICAgICJjb2xsaXNpb25zIiwgImNhcnJpZXIiLCAwLCAidHhxdWV1ZWxlbiJ9OworICAgIHNpZ25lZCBjaGFyIG9yZGVyW10gPSB7LTEsIDEsIDIsIDMsIDQsIDUsIC0xLCA5LCAxMCwgMTEsIDEyLCAxNCwgLTEsCisgICAgICAxMywgMTYsIC0xLCAwLCA4fTsKKyAgICBpbnQgaTsKKworICAgIC8vIFF1ZXJ5IHR4cXVldWVsZW4KKyAgICBpZiAoaW9jdGwoVFQuc29ja2ZkLCBTSU9DR0lGVFhRTEVOLCAmaWZyZSkgPj0gMCkgdmFsWzE2XSA9IGlmcmUuaWZyX3FsZW47CisgICAgZWxzZSB2YWxbMTZdID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG9yZGVyKTsgaSsrKSB7CisgICAgICBpbnQgaiA9IG9yZGVyW2ldOworCisgICAgICBpZiAoaiA8IDApIHhwcmludGYoIlxuJTEwYyIsICcgJyk7CisgICAgICBlbHNlIHhwcmludGYoIiVzOiVsbHUgIiwgbGFiZWxbal0sIHZhbFtqXSk7CisgICAgfQorICB9CisgIHhwdXRjKCdcbicpOworCisgIGlmKCFpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZNQVAsICZpZnJlKSAmJiAoaWZyZS5pZnJfbWFwLmlycSB8fAorICAgICAgaWZyZS5pZnJfbWFwLm1lbV9zdGFydCB8fCBpZnJlLmlmcl9tYXAuZG1hIHx8IGlmcmUuaWZyX21hcC5iYXNlX2FkZHIpKQorICB7CisgICAgeHByaW50ZigiJTEwYyIsICcgJyk7CisgICAgaWYoaWZyZS5pZnJfbWFwLmlycSkgeHByaW50ZigiSW50ZXJydXB0OiVkICIsIGlmcmUuaWZyX21hcC5pcnEpOworICAgIGlmKGlmcmUuaWZyX21hcC5iYXNlX2FkZHIgPj0gMHgxMDApIC8vIElPX01BUF9JTkRFWAorICAgICAgeHByaW50ZigiQmFzZSBhZGRyZXNzOjB4JXggIiwgaWZyZS5pZnJfbWFwLmJhc2VfYWRkcik7CisgICAgaWYoaWZyZS5pZnJfbWFwLm1lbV9zdGFydCkKKyAgICAgIHhwcmludGYoIk1lbW9yeTolbHgtJWx4ICIsIGlmcmUuaWZyX21hcC5tZW1fc3RhcnQsIGlmcmUuaWZyX21hcC5tZW1fZW5kKTsKKyAgICBpZihpZnJlLmlmcl9tYXAuZG1hKSB4cHJpbnRmKCJETUEgY2hhbjoleCAiLCBpZnJlLmlmcl9tYXAuZG1hKTsKKyAgICB4cHV0YygnXG4nKTsKKyAgfQorICB4cHV0YygnXG4nKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19pZmFjZShjaGFyICppZmFjZV9uYW1lKQoreworICBjaGFyICpuYW1lOworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmlmYWNlcyA9IDAsICpzbDsKKyAgaW50IGksIGo7CisgIEZJTEUgKmZwOworCisgIGZwID0geGZvcGVuKCIvcHJvYy9uZXQvZGV2IiwgInIiKTsKKworICBmb3IgKGk9MDsgZmdldHModG95YnVmLCBzaXplb2YodG95YnVmKSwgZnApOyBpKyspIHsKKyAgICBjaGFyICpidWYgPSB0b3lidWY7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbFsxN107CisKKyAgICBpZiAoaTwyKSBjb250aW51ZTsKKworICAgIHdoaWxlIChpc3NwYWNlKCpidWYpKSBidWYrKzsKKyAgICBuYW1lID0gc3Ryc2VwKCZidWYsICI6Iik7CisgICAgaWYoIWJ1ZikgZXJyb3JfZXhpdCgiYmFkIG5hbWUgJXMiLCBuYW1lKTsKKworICAgIGVycm5vID0gMDsKKyAgICBmb3IgKGo9MDsgajwxNiAmJiAhZXJybm87IGorKykgdmFsW2pdID0gc3RydG9sbChidWYsICZidWYsIDApOworICAgIGlmIChlcnJubykgcGVycm9yX2V4aXQoImJhZCAlcyBhdCAlcyIsIG5hbWUsIGJ1Zik7CisKKyAgICBpZiAoaWZhY2VfbmFtZSkgeworICAgICAgaWYgKCFzdHJjbXAoaWZhY2VfbmFtZSwgbmFtZSkpIHsKKyAgICAgICAgZGlzcGxheV9pZmNvbmZpZyhpZmFjZV9uYW1lLCAxLCB2YWwpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2wgPSB4bWFsbG9jKHNpemVvZigqc2wpK3N0cmxlbihuYW1lKSsxKTsKKyAgICAgIHN0cmNweShzbC0+c3RyLCBuYW1lKTsKKyAgICAgIHNsLT5uZXh0ID0gaWZhY2VzOworICAgICAgaWZhY2VzID0gc2w7CisKKyAgICAgIGRpc3BsYXlfaWZjb25maWcoc2wtPnN0ciwgdG95cy5vcHRmbGFncyAmIEZMQUdfYSwgdmFsKTsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGZwKTsKKworICBpZiAoaWZhY2VfbmFtZSkgZGlzcGxheV9pZmNvbmZpZyhpZmFjZV9uYW1lLCAxLCAwKTsKKyAgZWxzZSB7CisgICAgc3RydWN0IGlmY29uZiBpZmNvbjsKKyAgICBzdHJ1Y3QgaWZyZXEgKmlmcmU7CisgICAgaW50IG51bTsKKworICAgIC8vIExvb3AgdW50aWwgYnVmZmVyJ3MgYmlnIGVub3VnaAorICAgIGlmY29uLmlmY19idWYgPSBOVUxMOworICAgIGZvciAobnVtID0gMzA7O251bSArPSAxMCkgeworICAgICAgaWZjb24uaWZjX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWZyZXEpKm51bTsKKyAgICAgIGlmY29uLmlmY19idWYgPSB4cmVhbGxvYyhpZmNvbi5pZmNfYnVmLCBpZmNvbi5pZmNfbGVuKTsKKyAgICAgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZDT05GLCAmaWZjb24pOworICAgICAgaWYgKGlmY29uLmlmY19sZW4gIT0gc2l6ZW9mKHN0cnVjdCBpZnJlcSkqbnVtKSBicmVhazsKKyAgICB9CisKKyAgICBpZnJlID0gaWZjb24uaWZjX3JlcTsKKyAgICBmb3IobnVtID0gMDsgbnVtIDwgaWZjb24uaWZjX2xlbiAmJiBpZnJlOyBudW0gKz0gc2l6ZW9mKHN0cnVjdCBpZnJlcSksIGlmcmUrKykKKyAgICB7CisgICAgICAvLyBTa2lwIGR1cGxpY2F0ZXMKKyAgICAgIGZvcihzbCA9IGlmYWNlczsgc2w7IHNsID0gc2wtPm5leHQpCisgICAgICAgIGlmKCFzdHJjbXAoc2wtPnN0ciwgaWZyZS0+aWZyX25hbWUpKSBicmVhazsKKworICAgICAgaWYoIXNsKSBkaXNwbGF5X2lmY29uZmlnKGlmcmUtPmlmcl9uYW1lLCB0b3lzLm9wdGZsYWdzICYgRkxBR19hLCAwKTsKKyAgICB9CisKKyAgICBmcmVlKGlmY29uLmlmY19idWYpOworICB9CisKKyAgbGxpc3RfdHJhdmVyc2UoaWZhY2VzLCBmcmVlKTsKK30KKworLy8gRW5jb2RlIG9mZnNldCBhbmQgc2l6ZSBvZiBmaWVsZCBpbnRvIGFuIGludCwgYW5kIG1ha2UgcmVzdWx0IG5lZ2F0aXZlCisjZGVmaW5lIElGUkVRX09GRlNaKHgpIC0oaW50KSgob2Zmc2V0b2Yoc3RydWN0IGlmcmVxLCB4KTw8MTYpICsgc2l6ZW9mKGlmcmUueCkpCisKK3ZvaWQgaWZjb25maWdfbWFpbih2b2lkKQoreworICBjaGFyICoqYXJndiA9IHRveXMub3B0YXJnczsKKyAgc3RydWN0IGlmcmVxIGlmcmU7CisgIGludCBpOworCisgIFRULnNvY2tmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGlmKHRveXMub3B0YyA8IDIpIHsKKyAgICBzaG93X2lmYWNlKCphcmd2KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBPcGVuIGludGVyZmFjZQorICBtZW1zZXQoJmlmcmUsIDAsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKyAgeHN0cm5jcHkoaWZyZS5pZnJfbmFtZSwgKmFyZ3YsIElGTkFNU0laKTsKKworICAvLyBQZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJmYWNlCisgIHdoaWxlKCorK2FyZ3YpIHsKKyAgICAvLyBUYWJsZSBvZiBrbm93biBvcGVyYXRpb25zCisgICAgc3RydWN0IGFyZ2ggeworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGludCBvbiwgb2ZmOyAvLyBzZXQsIGNsZWFyCisgICAgfSB0cnlbXSA9IHsKKyAgICAgIHswLCBJRkZfVVB8SUZGX1JVTk5JTkcsIFNJT0NTSUZBRERSfSwKKyAgICAgIHsidXAiLCBJRkZfVVB8SUZGX1JVTk5JTkcsIDB9LAorICAgICAgeyJkb3duIiwgMCwgSUZGX1VQfSwKKyAgICAgIHsiYXJwIiwgMCwgSUZGX05PQVJQfSwKKyAgICAgIHsicHJvbWlzYyIsIElGRl9QUk9NSVNDLCAwfSwKKyAgICAgIHsiYWxsbXVsdGkiLCBJRkZfQUxMTVVMVEksIDB9LAorICAgICAgeyJtdWx0aWNhc3QiLCBJRkZfTVVMVElDQVNULCAwfSwKKyAgICAgIHsicG9pbnRvcG9pbnQiLCBJRkZfUE9JTlRPUE9JTlQsIFNJT0NTSUZEU1RBRERSfSwKKyAgICAgIHsiYnJvYWRjYXN0IiwgSUZGX0JST0FEQ0FTVCwgU0lPQ1NJRkJSREFERFJ9LAorICAgICAgeyJuZXRtYXNrIiwgMCwgU0lPQ1NJRk5FVE1BU0t9LAorICAgICAgeyJkc3RhZGRyIiwgMCwgU0lPQ1NJRkRTVEFERFJ9LAorICAgICAgeyJtdHUiLCBJRlJFUV9PRkZTWihpZnJfbXR1KSwgU0lPQ1NJRk1UVX0sCisgICAgICB7ImtlZXBhbGl2ZSIsIElGUkVRX09GRlNaKGlmcl9kYXRhKSwgU0lPQ0RFVlBSSVZBVEV9LCAvLyBTSU9DU0tFRVBBTElWRQorICAgICAgeyJvdXRmaWxsIiwgSUZSRVFfT0ZGU1ooaWZyX2RhdGEpLCBTSU9DREVWUFJJVkFURSsyfSwgLy8gU0lPQ1NPVVRGSUxMCisgICAgICB7Im1ldHJpYyIsIElGUkVRX09GRlNaKGlmcl9tZXRyaWMpLCBTSU9DU0lGTUVUUklDfSwKKyAgICAgIHsidHhxdWV1ZWxlbiIsIElGUkVRX09GRlNaKGlmcl9xbGVuKSwgU0lPQ1NJRlRYUUxFTn0sCisgICAgICB7Im1lbV9zdGFydCIsIElGUkVRX09GRlNaKGlmcl9tYXAubWVtX3N0YXJ0KSwgU0lPQ1NJRk1BUH0sCisgICAgICB7ImlvX2FkZHIiLCBJRlJFUV9PRkZTWihpZnJfbWFwLmJhc2VfYWRkciksIFNJT0NTSUZNQVB9LAorICAgICAgeyJpcnEiLCBJRlJFUV9PRkZTWihpZnJfbWFwLmlycSksIFNJT0NTSUZNQVB9LAorICAgICAgeyJpbmV0IiwgMCwgMH0sCisgICAgICB7ImluZXQ2IiwgMCwgMH0KKyAgICB9OworICAgIGNoYXIgKnMgPSAqYXJndjsKKyAgICBpbnQgcmV2ID0gKCpzID09ICctJyk7CisKKyAgICBzICs9IHJldjsKKworICAgIC8vICJzZXQgaGFyZHdhcmUgYWRkcmVzcyIgaXMgb2RkYmFsbCBlbm91Z2ggdG8gc3BlY2lhbCBjYXNlCisgICAgaWYgKCFzdHJjbXAoKmFyZ3YsICJodyIpKSB7CisgICAgICBjaGFyICpod19hZGRyLCAqcHRyLCAqcDsKKyAgICAgIHN0cnVjdCBzb2NrYWRkciAqc29jayA9ICZpZnJlLmlmcl9od2FkZHI7CisgICAgICBpbnQgY291bnQgPSA2OworCisgICAgICBwdHIgPSBwID0gKGNoYXIgKilzb2NrLT5zYV9kYXRhOworICAgICAgbWVtc2V0KHNvY2ssIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKyAgICAgIGlmIChhcmd2WzFdKSB7CisgICAgICAgIGlmICghc3RyY21wKCJldGhlciIsICorK2FyZ3YpKSBzb2NrLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoImluZmluaWJhbmQiLCAqYXJndikpIHsKKyAgICAgICAgICBzb2NrLT5zYV9mYW1pbHkgPSBBUlBIUkRfSU5GSU5JQkFORDsKKyAgICAgICAgICBjb3VudCA9IDIwOworICAgICAgICAgIHAgPSBwdHIgPSB0b3lidWY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghc29jay0+c2FfZmFtaWx5IHx8ICFhcmd2WzFdKSBoZWxwX2V4aXQoImJhZCBodyAnJXMnIiwgKmFyZ3YpOworICAgICAgaHdfYWRkciA9ICorK2FyZ3Y7CisKKyAgICAgIC8vIFBhcnNlIGFuZCB2ZXJpZnkgYWRkcmVzcy4KKyAgICAgIHdoaWxlICgqaHdfYWRkciAmJiAocC1wdHIpIDwgY291bnQpIHsKKyAgICAgICAgaW50IHZhbCwgbGVuID0gMDsKKworICAgICAgICBpZiAoKmh3X2FkZHIgPT0gJzonKSBod19hZGRyKys7CisgICAgICAgIHNzY2FuZihod19hZGRyLCAiJTJ4JW4iLCAmdmFsLCAmbGVuKTsKKyAgICAgICAgaWYgKCFsZW4gfHwgbGVuID4gMikgYnJlYWs7IC8vIDEgbmliYmxlIGNhbiBiZSBzZXQgZS5nLiBDMjo3OTozODo5NTpEOkEgCisgICAgICAgIGh3X2FkZHIgKz0gbGVuOworICAgICAgICAqcCsrID0gdmFsOworICAgICAgfQorCisgICAgICBpZiAoKHAtcHRyKSAhPSBjb3VudCB8fCAqaHdfYWRkcikKKyAgICAgICAgZXJyb3JfZXhpdCgiYmFkIGh3LWFkZHIgJyVzJyIsICphcmd2KTsKKworICAgICAgLy8gdGhlIGxpbnV4IGtlcm5lbCdzICJzdHJ1Y3Qgc29ja2FkZHIiIChpbmNsdWRlL2xpbnV4L3NvY2tldC5oIGluIHRoZQorICAgICAgLy8ga2VybmVsIHNvdXJjZSkgb25seSBoYXMgMTQgYnl0ZXMgb2Ygc2FfZGF0YSwgYW5kIGFuIGluZmluaWJhbmQgYWRkcmVzcworICAgICAgLy8gaXMgMjAuIFNvIGlmIHdlIGdvIHRocm91Z2ggdGhlIGlvY3RsLCB0aGUga2VybmVsIHdpbGwgdHJ1bmNhdGUKKyAgICAgIC8vIGluZmluaWJhbmQgYWRkcmVzc2VzLCBtZWFuaW5nIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBzeXNmcyBpbnN0ZWFkLgorICAgICAgaWYgKHNvY2stPnNhX2ZhbWlseSA9PSBBUlBIUkRfSU5GSU5JQkFORCAmJiAhc3RyY2hyKGlmcmUuaWZyX25hbWUsICcvJykpIHsKKyAgICAgICAgaW50IGZkOworCisgICAgICAgIHNwcmludGYodG95YnVmLCAiL3N5cy9jbGFzcy9uZXQvJXMvYWRkcmVzcyIsIGlmcmUuaWZyX25hbWUpOworICAgICAgICBmZCA9IHhvcGVuKHRveWJ1ZiwgT19SRFdSKTsKKyAgICAgICAgeHdyaXRlKGZkLCAqYXJndiwgc3RybGVuKCphcmd2KSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgIH0gZWxzZSB4aW9jdGwoVFQuc29ja2ZkLCBTSU9DU0lGSFdBRERSLCAmaWZyZSk7CisgICAgICBjb250aW51ZTsKKworICAgIC8vIEFkZC9yZW1vdmUgaXB2NiBhZGRyZXNzIHRvIGludGVyZmFjZQorCisgICAgfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiYWRkIikgfHwgIXN0cmNtcCgqYXJndiwgImRlbCIpKSB7CisgICAgICBzdHJ1Y3QgaWZyZXFfaW5ldDYgeworICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKyAgICAgICAgdW5zaWduZWQgcHJlZml4OworICAgICAgICBpbnQgaW5kZXg7CisgICAgICB9IGlmcmU2OworICAgICAgaW50IHBsZW4sIGZkNiA9IHhzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworCisgICAgICBpZiAoIWFyZ3ZbMV0pIGhlbHBfZXhpdCgiJXMiLCAqYXJndik7CisKKyAgICAgIHBsZW4gPSBnZXRfYWRkcmluZm8oYXJndlsxXSwgQUZfSU5FVDYsICZpZnJlNi5hZGRyKTsKKyAgICAgIGlmIChwbGVuIDwgMCkgcGxlbiA9IDEyODsKKyAgICAgIHhpb2N0bChmZDYsIFNJT0NHSUZJTkRFWCwgJmlmcmUpOworICAgICAgaWZyZTYuaW5kZXggPSBpZnJlLmlmcl9pZmluZGV4OworICAgICAgaWZyZTYucHJlZml4ID0gcGxlbjsKKyAgICAgIHhpb2N0bChmZDYsICoqKGFyZ3YrKyk9PSdhJyA/IFNJT0NTSUZBRERSIDogU0lPQ0RJRkFERFIsICZpZnJlNik7CisKKyAgICAgIGNsb3NlKGZkNik7CisgICAgICBjb250aW51ZTsKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGFibGUgdG8gZmluZC9wZXJmb3JtIG9wZXJhdGlvbgorICAgIH0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfTEVOKHRyeSk7IGkrKykgeworICAgICAgc3RydWN0IGFyZ2ggKnQgPSB0cnkraTsKKyAgICAgIGludCBvbiA9IHQtPm9uLCBvZmYgPSB0LT5vZmY7CisKKyAgICAgIGlmICghdC0+bmFtZSkgeworICAgICAgICBpZiAoaXNkaWdpdCgqKmFyZ3YpIHx8ICFzdHJjbXAoKmFyZ3YsICJkZWZhdWx0IikpIGFyZ3YtLTsKKyAgICAgICAgZWxzZSBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHQtPm5hbWUsIHMpKSBjb250aW51ZTsKKworICAgICAgLy8gSXMgdGhpcyBhbiBTSU9DU0kgZW50cnk/CisgICAgICBpZiAoKG9mZnwweGZmKSA9PSAweDg5ZmYpIHsKKyAgICAgICAgaWYgKCFyZXYpIHsKKyAgICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoIiVzIG5lZWRzIGFyZ3VtZW50IiwgdC0+bmFtZSk7CisKKyAgICAgICAgICAvLyBBc3NpZ24gdmFsdWUgdG8gaWZyZSBmaWVsZCBhbmQgY2FsbCBpb2N0bD8gKHZpYSBJRlJFUV9PRkZTWi4pCisgICAgICAgICAgaWYgKG9uIDwgMCkgeworICAgICAgICAgICAgbG9uZyBsID0gc3RydG91bCgqYXJndiwgMCwgMCk7CisKKyAgICAgICAgICAgIGlmIChvZmYgPT0gU0lPQ1NJRk1BUCkgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0dJRk1BUCwgJmlmcmUpOworICAgICAgICAgICAgb24gPSAtb247CisgICAgICAgICAgICBwb2tlKChvbj4+MTYpICsgKGNoYXIgKikmaWZyZSwgbCwgb24mMTUpOworICAgICAgICAgICAgeGlvY3RsKFRULnNvY2tmZCwgb2ZmLCAmaWZyZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpzaSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZyZS5pZnJfYWRkcjsKKyAgICAgICAgICAgIGludCBtYXNrID0gLTE7CisKKyAgICAgICAgICAgIHNpLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgICAgICAgICAgaWYgKCFzdHJjbXAoKmFyZ3YsICJkZWZhdWx0IikpIHNpLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICAgICAgZWxzZSBtYXNrID0gZ2V0X2FkZHJpbmZvKCphcmd2LCBBRl9JTkVULCAmc2ktPnNpbl9hZGRyKTsKKyAgICAgICAgICAgIHhpb2N0bChUVC5zb2NrZmQsIG9mZiwgJmlmcmUpOworCisgICAgICAgICAgICAvLyBIYW5kbGUgL25ldG1hc2sKKyAgICAgICAgICAgIGlmIChtYXNrID49IDApIHsKKyAgICAgICAgICAgICAgLy8gc2luX2FkZHIgcHJvYmFibHkgaXNuJ3QgdW5hbGlnbmVkLCBidXQganVzdCBpbiBjYXNlLi4uCisgICAgICAgICAgICAgIG1hc2sgPSBodG9ubCgofjApPDwoMzItbWFzaykpOworICAgICAgICAgICAgICBtZW1jcHkoJnNpLT5zaW5fYWRkciwgJm1hc2ssIDQpOworICAgICAgICAgICAgICB4aW9jdGwoVFQuc29ja2ZkLCBTSU9DU0lGTkVUTUFTSywgJmlmcmUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvZmYgPSAwOworICAgICAgfQorCisgICAgICAvLyBTZXQgZmxhZ3MKKyAgICAgIGlmIChvbiB8fCBvZmYpIHsKKyAgICAgICAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyZSk7CisgICAgICAgIGlmcmUuaWZyX2ZsYWdzICY9IH4ocmV2ID8gb24gOiBvZmYpOworICAgICAgICBpZnJlLmlmcl9mbGFncyB8PSAocmV2ID8gb2ZmIDogb24pOworICAgICAgICB4aW9jdGwoVFQuc29ja2ZkLCBTSU9DU0lGRkxBR1MsICZpZnJlKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IHNpemVvZih0cnkpL3NpemVvZigqdHJ5KSkgaGVscF9leGl0KCJiYWQgYXJndW1lbnQgJyVzJyIsICphcmd2KTsKKyAgfQorICBjbG9zZShUVC5zb2NrZmQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbmV0L25ldGNhdC5jIGIvdG95Ym94L3RveXMvbmV0L25ldGNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzVlYjIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9uZXQvbmV0Y2F0LmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qIG5ldGNhdC5jIC0gRm9yd2FyZCBzdGRpbi9zdGRvdXQgdG8gYSBmaWxlIG9yIG5ldHdvcmsgY29ubmVjdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFRPRE86IHVkcCwgaXB2NiwgZ2VuZXJpY2l6ZSBmb3IgdGVsbmV0L21pY3JvY29tL3RhaWwtZgorCitVU0VfTkVUQ0FUKE9MRFRPWShuYywgbmV0Y2F0LCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTkVUQ0FUKE5FV1RPWShuZXRjYXQsIFVTRV9ORVRDQVRfTElTVEVOKCJedGxMIikidyNwI3M6cSNmOiIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIE5FVENBVAorICBib29sICJuZXRjYXQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG5ldGNhdCBbLXVdIFstd3BxICNdIFstcyBhZGRyXSB7SVBBRERSIFBPUlROVU18LWYgRklMRU5BTUV9CisKKyAgICAtZgl1c2UgRklMRU5BTUUgKGFsYSAvZGV2L3R0eVMwKSBpbnN0ZWFkIG9mIG5ldHdvcmsKKyAgICAtcAlsb2NhbCBwb3J0IG51bWJlcgorICAgIC1xCVNFQ09ORFMgcXVpdCB0aGlzIG1hbnkgc2Vjb25kcyBhZnRlciBFT0Ygb24gc3RkaW4uCisgICAgLXMJbG9jYWwgaXB2NCBhZGRyZXNzCisgICAgLXcJU0VDT05EUyB0aW1lb3V0IGZvciBjb25uZWN0aW9uCisKKyAgICBVc2UgInN0dHkgMTE1MjAwIC1GIC9kZXYvdHR5UzAgJiYgc3R0eSByYXcgLWVjaG8gLWN0bGVjaG8iIHdpdGgKKyAgICBuZXRjYXQgLWYgdG8gY29ubmVjdCB0byBhIHNlcmlhbCBwb3J0LgorCitjb25maWcgTkVUQ0FUX0xJU1RFTgorICBib29sICJuZXRjYXQgc2VydmVyIG9wdGlvbnMgKC1sZXQpIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBORVRDQVQKKyAgZGVwZW5kcyBvbiBUT1lCT1hfRk9SSworICBoZWxwCisgICAgdXNhZ2U6IG5ldGNhdCBbLWxMIENPTU1BTkQuLi5dCisKKyAgICAtbAlsaXN0ZW4gZm9yIG9uZSBpbmNvbWluZyBjb25uZWN0aW9uLgorICAgIC1MCWxpc3RlbiBmb3IgbXVsdGlwbGUgaW5jb21pbmcgY29ubmVjdGlvbnMgKHNlcnZlciBtb2RlKS4KKworICAgIFRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgLWwgb3IgLUwgaXMgZXhlY3V0ZWQgdG8gaGFuZGxlIGVhY2ggaW5jb21pbmcKKyAgICBjb25uZWN0aW9uLiBJZiBub25lLCB0aGUgY29ubmVjdGlvbiBpcyBmb3J3YXJkZWQgdG8gc3RkaW4vc3Rkb3V0LgorCisgICAgRm9yIGEgcXVpY2stYW5kLWRpcnR5IHNlcnZlciwgdHJ5IHNvbWV0aGluZyBsaWtlOgorICAgIG5ldGNhdCAtcyAxMjcuMC4wLjEgLXAgMTIzNCAtdEwgL2Jpbi9iYXNoIC1sCisKK2NvbmZpZyBORVRDQVRfTElTVEVOX1RUWQorICBib29sCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIE5FVENBVF9MSVNURU4KKyAgZGVwZW5kcyBvbiBUT1lCT1hfRk9SSworICBoZWxwCisgICAgdXNhZ2U6IG5ldGNhdCBbLXRdCisKKyAgICAtdAlhbGxvY2F0ZSB0dHkgKG11c3QgY29tZSBiZWZvcmUgLWwgb3IgLUwpCisqLworCisjZGVmaW5lIEZPUl9uZXRjYXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgLy8gLWYgcmVhZCBmcm9tIGZpbGVuYW1lIGluc3RlYWQgb2YgbmV0d29yaworICBsb25nIHF1aXRfZGVsYXk7ICAgICAgIC8vIC1xIEV4aXQgYWZ0ZXIgRU9GIGZyb20gc3RkaW4gYWZ0ZXIgIyBzZWNvbmRzLgorICBjaGFyICpzb3VyY2VfYWRkcmVzczsgIC8vIC1zIEJpbmQgdG8gYSBzcGVjaWZpYyBzb3VyY2UgYWRkcmVzcy4KKyAgbG9uZyBwb3J0OyAgICAgICAgICAgICAvLyAtcCBCaW5kIHRvIGEgc3BlY2lmaWMgc291cmNlIHBvcnQuCisgIGxvbmcgd2FpdDsgICAgICAgICAgICAgLy8gLXcgV2FpdCAjIHNlY29uZHMgZm9yIGEgY29ubmVjdGlvbi4KKykKKworc3RhdGljIHZvaWQgdGltZW91dChpbnQgc2lnbnVtKQoreworICBpZiAoVFQud2FpdCkgZXJyb3JfZXhpdCgiVGltZW91dCIpOworICAvLyBUaGlzIHNob3VsZCBiZSB4ZXhpdCgpIGJ1dCB3b3VsZCBuZWVkIHNpZ2xvbmdqbXAoKS4uLgorICBleGl0KDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWxhcm0oaW50IHNlY29uZHMpCit7CisgIHhzaWduYWwoU0lHQUxSTSwgc2Vjb25kcyA/IHRpbWVvdXQgOiBTSUdfREZMKTsKKyAgYWxhcm0oc2Vjb25kcyk7Cit9CisKKy8vIFRyYW5zbGF0ZSB4LngueC54IG51bWVyaWMgSVB2NCBhZGRyZXNzLCBvciBlbHNlIEROUyBsb29rdXAgYW4gSVB2NCBuYW1lLgorc3RhdGljIHZvaWQgbG9va3VwX25hbWUoY2hhciAqbmFtZSwgdWludDMyX3QgKnJlc3VsdCkKK3sKKyAgc3RydWN0IGhvc3RlbnQgKmhvc3RieW5hbWU7CisKKyAgaG9zdGJ5bmFtZSA9IGdldGhvc3RieW5hbWUobmFtZSk7IC8vIGdldGFkZHJpbmZvCisgIGlmICghaG9zdGJ5bmFtZSkgZXJyb3JfZXhpdCgibm8gaG9zdCAnJXMnIiwgbmFtZSk7CisgICpyZXN1bHQgPSAqKHVpbnQzMl90ICopKmhvc3RieW5hbWUtPmhfYWRkcl9saXN0OworfQorCisvLyBXb3JyeSBhYm91dCBhIGZhbmN5IGxvb2t1cCBsYXRlci4KK3N0YXRpYyB2b2lkIGxvb2t1cF9wb3J0KGNoYXIgKnN0ciwgdWludDE2X3QgKnBvcnQpCit7CisgICpwb3J0ID0gU1dBUF9CRTE2KGF0b2koc3RyKSk7Cit9CisKK3ZvaWQgbmV0Y2F0X21haW4odm9pZCkKK3sKKyAgaW50IHNvY2tmZD0tMSwgcG9sbGNvdW50PTI7CisgIHN0cnVjdCBwb2xsZmQgcG9sbGZkc1syXTsKKworICBtZW1zZXQocG9sbGZkcywgMCwgMipzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworICBwb2xsZmRzWzBdLmV2ZW50cyA9IHBvbGxmZHNbMV0uZXZlbnRzID0gUE9MTElOOworICBzZXRfYWxhcm0oVFQud2FpdCk7CisKKyAgLy8gVGhlIGFyZ3VtZW50IHBhcnNpbmcgbG9naWMgY2FuJ3QgbWFrZSAiPDIiIGNvbmRpdGlvbmFsIG9uIG90aGVyCisgIC8vIGFyZ3VtZW50cyBsaWtlIC1mIGFuZCAtbCwgc28gd2UgZG8gaXQgYnkgaGFuZCBoZXJlLgorICBpZiAoKHRveXMub3B0ZmxhZ3MmRkxBR19mKSA/IHRveXMub3B0YyA6CisgICAgICAoISh0b3lzLm9wdGZsYWdzJihGTEFHX2x8RkxBR19MKSkgJiYgdG95cy5vcHRjIT0yKSkKKyAgICAgICAgaGVscF9leGl0KCJBcmd1bWVudCBjb3VudCB3cm9uZyIpOworCisgIGlmIChUVC5maWxlbmFtZSkgcG9sbGZkc1swXS5mZCA9IHhvcGVuKFRULmZpbGVuYW1lLCBPX1JEV1IpOworICBlbHNlIHsKKyAgICBpbnQgdGVtcDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcmVzczsKKworICAgIC8vIFNldHVwIHNvY2tldAorICAgIHNvY2tmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGZjbnRsKHNvY2tmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisgICAgdGVtcCA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnRlbXAsIHNpemVvZih0ZW1wKSk7CisgICAgbWVtc2V0KCZhZGRyZXNzLCAwLCBzaXplb2YoYWRkcmVzcykpOworICAgIGFkZHJlc3Muc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaWYgKFRULnNvdXJjZV9hZGRyZXNzIHx8IFRULnBvcnQpIHsKKyAgICAgIGFkZHJlc3Muc2luX3BvcnQgPSBTV0FQX0JFMTYoVFQucG9ydCk7CisgICAgICBpZiAoVFQuc291cmNlX2FkZHJlc3MpCisgICAgICAgIGxvb2t1cF9uYW1lKFRULnNvdXJjZV9hZGRyZXNzLCAodWludDMyX3QgKikmYWRkcmVzcy5zaW5fYWRkcik7CisgICAgICBpZiAoYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKSkKKyAgICAgICAgcGVycm9yX2V4aXQoImJpbmQiKTsKKyAgICB9CisKKyAgICAvLyBEaWFsIG91dAorCisgICAgaWYgKCFDRkdfTkVUQ0FUX0xJU1RFTiB8fCAhKHRveXMub3B0ZmxhZ3MmKEZMQUdfTHxGTEFHX2wpKSkgeworICAgICAgLy8gRmlndXJlIG91dCB3aGVyZSB0byBkaWFsIG91dCB0by4KKyAgICAgIGxvb2t1cF9uYW1lKCp0b3lzLm9wdGFyZ3MsICh1aW50MzJfdCAqKSZhZGRyZXNzLnNpbl9hZGRyKTsKKyAgICAgIGxvb2t1cF9wb3J0KHRveXMub3B0YXJnc1sxXSwgJmFkZHJlc3Muc2luX3BvcnQpOworICAgICAgdGVtcCA9IGNvbm5lY3Qoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisgICAgICBpZiAodGVtcDwwKSBwZXJyb3JfZXhpdCgiY29ubmVjdCIpOworICAgICAgcG9sbGZkc1swXS5mZCA9IHNvY2tmZDsKKworICAgIC8vIExpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKworICAgIH0gZWxzZSB7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGFkZHJlc3MpOworCisgICAgICBpZiAobGlzdGVuKHNvY2tmZCwgNSkpIGVycm9yX2V4aXQoImxpc3RlbiIpOworICAgICAgaWYgKCFUVC5wb3J0KSB7CisgICAgICAgIGdldHNvY2tuYW1lKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzLCAmbGVuKTsKKyAgICAgICAgcHJpbnRmKCIlZFxuIiwgU1dBUF9CRTE2KGFkZHJlc3Muc2luX3BvcnQpKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICB9CisgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHJldHVybiBpbW1lZGlhdGVseSBiZWNhdXNlIC1sIGhhcyBhcmd1bWVudHM/CisKKyAgICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfbCkgJiYgdG95cy5vcHRjKSB7CisgICAgICAgIGlmIChDRkdfVE9ZQk9YX0ZPUksgJiYgeGZvcmsoKSkgZ290byBjbGVhbnVwOworICAgICAgICBjbG9zZSgwKTsKKyAgICAgICAgY2xvc2UoMSk7CisgICAgICAgIGNsb3NlKDIpOworICAgICAgfQorCisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIHBpZF90IGNoaWxkID0gMDsKKworICAgICAgICAvLyBGb3IgLWwsIGNhbGwgYWNjZXB0IGZyb20gdGhlIF9uZXdfIHByb2Nlc3MuCisKKyAgICAgICAgcG9sbGZkc1swXS5mZCA9IGFjY2VwdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgJmxlbik7CisgICAgICAgIGlmIChwb2xsZmRzWzBdLmZkPDApIHBlcnJvcl9leGl0KCJhY2NlcHQiKTsKKworICAgICAgICAvLyBEbyB3ZSBuZWVkIGEgdHR5PworCisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfdCkKKyAgICAgICAgICBjaGlsZCA9IGZvcmtwdHkoJihwb2xsZmRzWzFdLmZkKSwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBmb3JrIGFuZC9vciByZWRpcmVjdCBmb3IgZXhlYz8KKworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyZGTEFHX0wpIHsKKyAgICAgICAgICAgIHRveXMuc3RhY2t0b3AgPSAwOworICAgICAgICAgICAgY2hpbGQgPSB2Zm9yaygpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWNoaWxkICYmIHRveXMub3B0YykgeworICAgICAgICAgICAgaW50IGZkID0gcG9sbGZkc1swXS5mZDsKKworICAgICAgICAgICAgZHVwMihmZCwgMCk7CisgICAgICAgICAgICBkdXAyKGZkLCAxKTsKKyAgICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfTCkgZHVwMihmZCwgMik7CisgICAgICAgICAgICBpZiAoZmQ+MikgY2xvc2UoZmQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGlsZDwwKSBlcnJvcl9tc2coIkZvcmsgZmFpbGVkXG4iKTsKKyAgICAgICAgaWYgKGNoaWxkPDEpIGJyZWFrOworICAgICAgICBjbG9zZShwb2xsZmRzWzBdLmZkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBXZSBoYXZlIGEgY29ubmVjdGlvbi4gIERpc2FybSB0aW1lb3V0LgorICAvLyAoRG9lcyBub3QgcGxheSB3ZWxsIHdpdGggLUwsIGJ1dCB3aGF0IF9zaG91bGRfIHRoYXQgZG8/KQorICBzZXRfYWxhcm0oMCk7CisKKyAgaWYgKENGR19ORVRDQVRfTElTVEVOICYmICgodG95cy5vcHRmbGFncyYoRkxBR19MfEZMQUdfbCkpICYmIHRveXMub3B0YykpCisgICAgeGV4ZWModG95cy5vcHRhcmdzKTsKKworICAvLyBQb2xsIGxvb3AgY29weWluZyBzdGRpbi0+c29ja2V0IGFuZCBzb2NrZXQtPnN0ZG91dC4KKyAgZm9yICg7OykgeworICAgIGludCBpOworCisgICAgaWYgKDA+cG9sbChwb2xsZmRzLCBwb2xsY291bnQsIC0xKSkgcGVycm9yX2V4aXQoInBvbGwiKTsKKworICAgIGZvciAoaT0wOyBpPHBvbGxjb3VudDsgaSsrKSB7CisgICAgICBpZiAocG9sbGZkc1tpXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgIGludCBsZW4gPSByZWFkKHBvbGxmZHNbaV0uZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgICAgICBpZiAobGVuPDEpIGdvdG8gZG9odXBub3c7CisgICAgICAgIHh3cml0ZShpID8gcG9sbGZkc1swXS5mZCA6IDEsIHRveWJ1ZiwgbGVuKTsKKyAgICAgIH0gZWxzZSBpZiAocG9sbGZkc1tpXS5yZXZlbnRzICYgUE9MTEhVUCkgeworZG9odXBub3c6CisgICAgICAgIC8vIENsb3NlIGhhbGYtY29ubmVjdGlvbi4gIFRoaXMgaXMgbmVlZGVkIGZvciB0aGluZ3MgbGlrZQorICAgICAgICAvLyAiZWNobyBHRVQgLyB8IG5ldGNhdCBsYW5kbGV5Lm5ldCA4MCIKKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICBzaHV0ZG93bihwb2xsZmRzWzBdLmZkLCBTSFVUX1dSKTsKKyAgICAgICAgICBwb2xsY291bnQtLTsKKyAgICAgICAgICBzZXRfYWxhcm0oVFQucXVpdF9kZWxheSk7CisgICAgICAgIH0gZWxzZSBnb3RvIGNsZWFudXA7CisgICAgICB9CisgICAgfQorICB9CitjbGVhbnVwOgorICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSB7CisgICAgY2xvc2UocG9sbGZkc1swXS5mZCk7CisgICAgY2xvc2Uoc29ja2ZkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvbmV0L25ldHN0YXQuYyBiL3RveWJveC90b3lzL25ldC9uZXRzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1Yzg4NAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL25ldC9uZXRzdGF0LmMKQEAgLTAsMCArMSwzODMgQEAKKy8qIG5ldHN0YXQuYyAtIERpc3BsYXkgTGludXggbmV0d29ya2luZyBzdWJzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IDIwMTIgUmFuamFuIEt1bWFyIDxyYW5qYW5rdW1hci5idGhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm90IGluIFNVU3Y0LgorICoKK1VTRV9ORVRTVEFUKE5FV1RPWShuZXRzdGF0LCAicFdyeHd1dG5lYWwiLCBUT1lGTEFHX0JJTikpCitjb25maWcgTkVUU1RBVAorICBib29sICJuZXRzdGF0IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBuZXRzdGF0IFstcFdyeHd1dG5lYWxdCisKKyAgICBEaXNwbGF5IG5ldHdvcmtpbmcgaW5mb3JtYXRpb24uIERlZmF1bHQgaXMgbmV0c2F0IC10dXd4CisKKyAgICAtciAgcm91dGluZyB0YWJsZQorICAgIC1hICBhbGwgc29ja2V0cyAobm90IGp1c3QgY29ubmVjdGVkKQorICAgIC1sICBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldHMKKyAgICAtdCAgVENQIHNvY2tldHMKKyAgICAtdSAgVURQIHNvY2tldHMKKyAgICAtdyAgcmF3IHNvY2tldHMKKyAgICAteCAgdW5peCBzb2NrZXRzCisgICAgLWUgIGV4dGVuZGVkIGluZm8KKyAgICAtbiAgZG9uJ3QgcmVzb2x2ZSBuYW1lcworICAgIC1XICB3aWRlIGRpc3BsYXkKKyAgICAtcCAgUElEL1Byb2dyYW0gbmFtZSBvZiBzb2NrZXRzCisqLworCisjZGVmaW5lIEZPUl9uZXRzdGF0CisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCitHTE9CQUxTKAorICBzdHJ1Y3QgbnVtX2NhY2hlICppbm9kZXM7CisgIGludCB3cGFkOworKTsKKworLy8gY29udmVydCBhZGRyZXNzIGludG8gdGV4dCBmb3JtYXQuCitzdGF0aWMgdm9pZCBhZGRyMnN0cihpbnQgYWYsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHBvcnQsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKyAgY2hhciAqcHJvdG8pCit7CisgIGludCBwb3MsIGNvdW50OworICBzdHJ1Y3Qgc2VydmVudCAqc2VyID0gMDsKKworICAvLyBDb252ZXJ0IHRvIG51bWVyaWMgYWRkcmVzcworICBpZiAoIWluZXRfbnRvcChhZiwgYWRkciwgYnVmLCAyNTYpKSB7CisgICAgKmJ1ZiA9IDA7CisKKyAgICByZXR1cm47CisgIH0KKyAgYnVmW2xlbl0gPSAwOworICBwb3MgPSBzdHJsZW4oYnVmKTsKKworICAvLyBJZiB0aGVyZSdzIG5vIHBvcnQgbnVtYmVyLCBpdCdzIGEgbG9jYWwgOiogYmluZGluZywgbm90aGluZyB0byBsb29rIHVwLgorICBpZiAoIXBvcnQpIHsKKyAgICBpZiAobGVuLXBvczwyKSBwb3MgPSBsZW4tMjsKKyAgICBzdHJjcHkoYnVmK3BvcywgIjoqIik7CisKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSkgeworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlc3VsdCwgKnJwOworICAgIGNoYXIgY3V0WzRdOworCisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IGFmOworCisgICAgaWYgKCFnZXRhZGRyaW5mbyhidWYsIE5VTEwsICZoaW50cywgJnJlc3VsdCkpIHsKKyAgICAgIHNvY2tsZW5fdCBzb2NrX2xlbiA9IChhZiA9PSBBRl9JTkVUKSA/IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pCisgICAgICAgIDogc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCisgICAgICAvLyBXZSBhc3N1bWUgdGhhdCBhIGZhaWxpbmcgZ2V0bmFtZWluZm8gZG9zbid0IHN0b21wICJidWYiIGhlcmUuCisgICAgICBmb3IgKHJwID0gcmVzdWx0OyBycDsgcnAgPSBycC0+YWlfbmV4dCkKKyAgICAgICAgaWYgKCFnZXRuYW1laW5mbyhycC0+YWlfYWRkciwgc29ja19sZW4sIGJ1ZiwgMjU2LCAwLCAwLCAwKSkgYnJlYWs7CisgICAgICBmcmVlYWRkcmluZm8ocmVzdWx0KTsKKyAgICAgIGJ1ZltsZW5dID0gMDsKKyAgICAgIHBvcyA9IHN0cmxlbihidWYpOworICAgIH0KKworICAgIC8vIERvZXNuJ3QgdW5kZXJzdGFuZCBwcm90byAidGNwNiIsIHNvIHRydW5jYXRlCisgICAgbWVtY3B5KGN1dCwgcHJvdG8sIDMpOworICAgIGN1dFszXSA9IDA7CisgICAgc2VyID0gZ2V0c2VydmJ5cG9ydChodG9ucyhwb3J0KSwgY3V0KTsKKyAgfQorCisgIC8vIEFwcGVuZCA6c2VydmljZQorICBjb3VudCA9IHNucHJpbnRmKDAsIDAsICI6JXUiLCBwb3J0KTsKKyAgaWYgKHNlcikgeworICAgIGNvdW50ID0gc25wcmludGYoMCwgMCwgIjolcyIsIHNlci0+c19uYW1lKTsKKyAgICAvLyBzaGVlciBwYXJhbm9pYQorICAgIGlmIChjb3VudD49bGVuKSB7CisgICAgICBjb3VudCA9IGxlbi0xOworICAgICAgc2VyLT5zX25hbWVbY291bnRdID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKGxlbi1wb3M8Y291bnQpIHBvcyA9IGxlbi1jb3VudDsKKyAgaWYgKHNlcikgc3ByaW50ZihidWYrcG9zLCAiOiVzIiwgc2VyLT5zX25hbWUpOworICBlbHNlIHNwcmludGYoYnVmK3BvcywgIjoldSIsIHBvcnQpOworfQorCisvLyBEaXNwbGF5IGluZm8gZm9yIHRjcC91ZHAvcmF3CitzdGF0aWMgdm9pZCBzaG93X2lwKGNoYXIgKmZuYW1lKQoreworICBjaGFyICpzc19zdGF0ZSA9ICJVTktOT1dOIiwgYnVmWzEyXSwgKnMsICpsYWJlbCA9IHN0cnJjaHIoZm5hbWUsICcvJykrMTsKKyAgY2hhciAqc3RhdGVfbGFiZWxbXSA9IHsiIiwgIkVTVEFCTElTSEVEIiwgIlNZTl9TRU5UIiwgIlNZTl9SRUNWIiwgIkZJTl9XQUlUMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZJTl9XQUlUMiIsICJUSU1FX1dBSVQiLCAiQ0xPU0UiLCAiQ0xPU0VfV0FJVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkxBU1RfQUNLIiwgIkxJU1RFTiIsICJDTE9TSU5HIiwgIlVOS05PV04ifTsKKyAgc3RydWN0IHBhc3N3ZCAqcHc7CisgIEZJTEUgKmZwID0gZm9wZW4oZm5hbWUsICJyIik7CisKKyAgaWYgKCFmcCkgeworICAgICBwZXJyb3JfbXNnKCInJXMnIiwgZm5hbWUpOworICAgICByZXR1cm47CisgIH0KKworICBpZighZmdldHModG95YnVmLCBzaXplb2YodG95YnVmKSwgZnApKSByZXR1cm47IC8vc2tpcCBoZWFkZXIuCisKKyAgd2hpbGUgKGZnZXRzKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIGZwKSkgeworICAgIGNoYXIgbGlwWzI1Nl0sIHJpcFsyNTZdOworICAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7dW5zaWduZWQgdTsgdW5zaWduZWQgY2hhciBiWzRdO30gaTQ7CisgICAgICBzdHJ1Y3Qge3N0cnVjdCB7dW5zaWduZWQgYSwgYiwgYywgZDt9IHU7IHVuc2lnbmVkIGNoYXIgYlsxNl07fSBpNjsKKyAgICB9IGxhZGRyLCByYWRkcjsKKyAgICB1bnNpZ25lZCBscG9ydCwgcnBvcnQsIHN0YXRlLCB0eHEsIHJ4cSwgbnVtLCB1aWQsIG5pdGVtczsKKyAgICB1bnNpZ25lZCBsb25nIGlub2RlOworCisgICAgLy8gVHJ5IGlwdjYsIHRoZW4gdHJ5IGlwdjQKKyAgICBuaXRlbXMgPSBzc2NhbmYodG95YnVmLAorICAgICAgIiAlZDogJTh4JTh4JTh4JTh4OiV4ICU4eCU4eCU4eCU4eDoleCAleCAleDoleCAlKlg6JSpYICUqWCAlZCAlKmQgJWxkIiwKKyAgICAgICZudW0sICZsYWRkci5pNi51LmEsICZsYWRkci5pNi51LmIsICZsYWRkci5pNi51LmMsCisgICAgICAmbGFkZHIuaTYudS5kLCAmbHBvcnQsICZyYWRkci5pNi51LmEsICZyYWRkci5pNi51LmIsCisgICAgICAmcmFkZHIuaTYudS5jLCAmcmFkZHIuaTYudS5kLCAmcnBvcnQsICZzdGF0ZSwgJnR4cSwgJnJ4cSwKKyAgICAgICZ1aWQsICZpbm9kZSk7CisKKyAgICBpZiAobml0ZW1zIT0xNikgeworICAgICAgbml0ZW1zID0gc3NjYW5mKHRveWJ1ZiwKKyAgICAgICAgIiAlZDogJXg6JXggJXg6JXggJXggJXg6JXggJSpYOiUqWCAlKlggJWQgJSpkICVsZCIsCisgICAgICAgICZudW0sICZsYWRkci5pNC51LCAmbHBvcnQsICZyYWRkci5pNC51LCAmcnBvcnQsICZzdGF0ZSwgJnR4cSwKKyAgICAgICAgJnJ4cSwgJnVpZCwgJmlub2RlKTsKKworICAgICAgaWYgKG5pdGVtcyE9MTApIGNvbnRpbnVlOworICAgICAgbml0ZW1zID0gQUZfSU5FVDsKKyAgICB9IGVsc2Ugbml0ZW1zID0gQUZfSU5FVDY7CisKKyAgICAvLyBTaG91bGQgd2UgZGlzcGxheSB0aGlzPyAobGlzdGVuaW5nIG9yIGFsbCBvciBUQ1AvVURQL1JBVykKKyAgICBpZiAoISgodG95cy5vcHRmbGFncyAmIEZMQUdfbCkgJiYgKCFycG9ydCAmJiAoc3RhdGUgJiAweEEpKSkKKyAgICAgICYmICEodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgJiYgIShycG9ydCAmICgweDEwIHwgMHgyMCB8IDB4NDApKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICBhZGRyMnN0cihuaXRlbXMsICZsYWRkciwgbHBvcnQsIGxpcCwgVFQud3BhZCwgbGFiZWwpOworICAgIGFkZHIyc3RyKG5pdGVtcywgJnJhZGRyLCBycG9ydCwgcmlwLCBUVC53cGFkLCBsYWJlbCk7CisKKyAgICAvLyBEaXNwbGF5IGRhdGEKKyAgICBzID0gbGFiZWw7CisgICAgaWYgKHN0cnN0YXJ0KCZzLCAidGNwIikpIHsKKyAgICAgIGludCBzeiA9IEFSUkFZX0xFTihzdGF0ZV9sYWJlbCk7CisgICAgICBpZiAoIXN0YXRlIHx8IHN0YXRlID49IHN6KSBzdGF0ZSA9IHN6LTE7CisgICAgICBzc19zdGF0ZSA9IHN0YXRlX2xhYmVsW3N0YXRlXTsKKyAgICB9IGVsc2UgaWYgKHN0cnN0YXJ0KCZzLCAidWRwIikpIHsKKyAgICAgIGlmIChzdGF0ZSA9PSAxKSBzc19zdGF0ZSA9IHN0YXRlX2xhYmVsW3N0YXRlXTsKKyAgICAgIGVsc2UgaWYgKHN0YXRlID09IDcpIHNzX3N0YXRlID0gIiI7CisgICAgfSBlbHNlIGlmIChzdHJzdGFydCgmcywgInJhdyIpKSBzcHJpbnRmKHNzX3N0YXRlID0gYnVmLCAiJXUiLCBzdGF0ZSk7CisKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSAmJiAocHcgPSBidWZnZXRwd3VpZCh1aWQpKSkKKyAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlcyIsIHB3LT5wd19uYW1lKTsKKyAgICBlbHNlIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlZCIsIHVpZCk7CisKKyAgICBwcmludGYoIiUtNnMlNmQlN2QgIiwgbGFiZWwsIHJ4cSwgdHhxKTsKKyAgICBwcmludGYoIiUqLipzICUqLipzICIsIC1UVC53cGFkLCBUVC53cGFkLCBsaXAsIC1UVC53cGFkLCBUVC53cGFkLCByaXApOworICAgIHByaW50ZigiJS0xMXMiLCBzc19zdGF0ZSk7CisgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19lKSkgcHJpbnRmKCIgJS0xMHMgJS0xMWxkIiwgdG95YnVmLCBpbm9kZSk7CisgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSkgeworICAgICAgc3RydWN0IG51bV9jYWNoZSAqbmMgPSBnZXRfbnVtX2NhY2hlKFRULmlub2RlcywgaW5vZGUpOworCisgICAgICBwcmludGYoIiAlcyIsIG5jID8gbmMtPmRhdGEgOiAiLSIpOworICAgIH0KKyAgICB4cHV0YygnXG4nKTsKKyAgfQorICBmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBzaG93X3VuaXhfc29ja2V0cyh2b2lkKQoreworICBjaGFyICp0eXBlc1tdID0geyIiLCJTVFJFQU0iLCJER1JBTSIsIlJBVyIsIlJETSIsIlNFUVBBQ0tFVCIsIkRDQ1AiLCJQQUNLRVQifSwKKyAgICAgICAqc3RhdGVzW10gPSB7IiIsIkxJU1RFTklORyIsIkNPTk5FQ1RJTkciLCJDT05ORUNURUQiLCJESVNDT05ORUNUSU5HIn0sCisgICAgICAgKnMsICpzczsKKyAgdW5zaWduZWQgbG9uZyByZWZjb3VudCwgZmxhZ3MsIHR5cGUsIHN0YXRlLCBpbm9kZTsKKyAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL25ldC91bml4IiwgInIiKTsKKworICBpZighZmdldHModG95YnVmLCBzaXplb2YodG95YnVmKSwgZnApKSByZXR1cm47IC8vc2tpcCBoZWFkZXIuCisKKyAgd2hpbGUgKGZnZXRzKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIGZwKSkgeworICAgIHVuc2lnbmVkIG9mZnNldCA9IDA7CisKKyAgICAvLyBjb3VudCA9IDYgb3IgNyAoZmlyc3QgZmllbGQgaWdub3JlZCwgc29ja2V0cyBkb24ndCBhbHdheXMgaGF2ZSBmaWxlbmFtZXMpCisgICAgaWYgKDY8c3NjYW5mKHRveWJ1ZiwgIiUqcDogJWxYICUqWCAlbFggJWxYICVsWCAlbHUgJW4iLAorICAgICAgJnJlZmNvdW50LCAmZmxhZ3MsICZ0eXBlLCAmc3RhdGUsICZpbm9kZSwgJm9mZnNldCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgLy8gTGludXggZXhwb3J0cyBvbmx5IFNPX0FDQ0VQVENPTiBzaW5jZSAyLjMuMTVwcmUzIGluIDE5OTksIGJ1dCBsZXQncworICAgIC8vIGZpbHRlciBpbiBjYXNlIHRoZXkgYWRkIG1vcmUgc29tZWRheS4KKyAgICBmbGFncyAmPSAxPDwxNjsKKworICAgIC8vIE9ubHkgc2hvdyB1bmNvbm5lY3RlZCBsaXN0ZW5pbmcgc29ja2V0cyB3aXRoIC1hCisgICAgaWYgKHN0YXRlPT0xICYmIGZsYWdzICYmICEodG95cy5vcHRmbGFncyZGTEFHX2EpKSBjb250aW51ZTsKKworICAgIGlmICh0eXBlPT0xMCkgdHlwZSA9IDc7IC8vIG1vdmUgU09DS19QQUNLRVQgaW50byBsaW5lCisgICAgaWYgKHR5cGU+QVJSQVlfTEVOKHR5cGVzKSkgdHlwZSA9IDA7CisgICAgaWYgKHN0YXRlPkFSUkFZX0xFTihzdGF0ZXMpIHx8IChzdGF0ZT09MSAmJiAhZmxhZ3MpKSBzdGF0ZSA9IDA7CisgICAgc3ByaW50Zih0b3lidWYsICJbICVzXSIsIGZsYWdzID8gIkFDQyAiIDogIiIpOworCisgICAgcHJpbnRmKCJ1bml4ICAlLTZsZCAlLTExcyAlLTEwcyAlLTEzcyAlOGx1ICIsCisgICAgICByZWZjb3VudCwgdG95YnVmLCB0eXBlc1t0eXBlXSwgc3RhdGVzW3N0YXRlXSwgaW5vZGUpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSB7CisgICAgICBzdHJ1Y3QgbnVtX2NhY2hlICpuYyA9IGdldF9udW1fY2FjaGUoVFQuaW5vZGVzLCBpbm9kZSk7CisKKyAgICAgIHByaW50ZigiJS0xOS4xOXMiLCBuYyA/IG5jLT5kYXRhIDogIi0iKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICBpZiAoKHNzID0gc3RycmNocihzID0gdG95YnVmK29mZnNldCwgJ1xuJykpKSAqc3MgPSAwOworICAgICAgcHJpbnRmKCIlcyIsIHMpOworICAgIH0KKyAgICB4cHV0YygnXG4nKTsKKyAgfQorCisgIGZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyBpbnQgc2Nhbl9waWRzKHN0cnVjdCBkaXJ0cmVlICpub2RlKQoreworICBjaGFyICpzID0gdG95YnVmKzI1NjsKKyAgc3RydWN0IGRpcmVudCAqZW50cnk7CisgIERJUiAqZHA7CisgIGludCBwaWQsIGRpcmZkOworCisgIGlmICghbm9kZS0+cGFyZW50KSByZXR1cm4gRElSVFJFRV9SRUNVUlNFOworICBpZiAoIShwaWQgPSBhdG9sKG5vZGUtPm5hbWUpKSkgcmV0dXJuIDA7CisKKyAgc3ByaW50Zih0b3lidWYsICIvcHJvYy8lZC9jbWRsaW5lIiwgcGlkKTsKKyAgaWYgKCEocmVhZGZpbGUodG95YnVmLCB0b3lidWYsIDI1NikpKSByZXR1cm4gMDsKKworICBzcHJpbnRmKHMsICIlZC9mZCIsIHBpZCk7CisgIGlmICgtMT09KGRpcmZkID0gb3BlbmF0KGRpcnRyZWVfcGFyZW50ZmQobm9kZSksIHMsIE9fUkRPTkxZKSkpIHJldHVybiAwOworICBpZiAoIShkcCA9IGZkb3BlbmRpcihkaXJmZCkpKSB7CisgICAgY2xvc2UoZGlyZmQpOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkcCkpKSB7CisgICAgcyA9IHRveWJ1ZisyNTY7CisgICAgaWYgKCFyZWFkbGlua2F0MChkaXJmZCwgZW50cnktPmRfbmFtZSwgcywgc2l6ZW9mKHRveWJ1ZiktMjU2KSkgY29udGludWU7CisgICAgLy8gQ2FuIHRoZSAiWzAwMDBdOiIgaGFwcGVuIGluIGEgbW9kZXJuIGtlcm5lbD8KKyAgICBpZiAoc3Ryc3RhcnQoJnMsICJzb2NrZXQ6WyIpIHx8IHN0cnN0YXJ0KCZzLCAiWzAwMDBdOiIpKSB7CisgICAgICBsb25nIGxvbmcgbGwgPSBhdG9sbChzKTsKKworICAgICAgc3ByaW50ZihzLCAiJWQvJXMiLCBwaWQsIGdldGJhc2VuYW1lKHRveWJ1ZikpOworICAgICAgYWRkX251bV9jYWNoZSgmVFQuaW5vZGVzLCBsbCwgcywgc3RybGVuKHMpKzEpOworICAgIH0KKyAgfQorICBjbG9zZWRpcihkcCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBleHRyYWN0IGluZXQ0IHJvdXRlIGluZm8gZnJvbSAvcHJvYy9uZXQvcm91dGUgZmlsZSBhbmQgZGlzcGxheSBpdC4KKyAqLworc3RhdGljIHZvaWQgZGlzcGxheV9yb3V0ZXModm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgZmxhZ2NoYXJzW10gPSAiR0hSRE1EQUMiOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgZmxhZ2FycmF5W10gPSB7CisgICAgUlRGX0dBVEVXQVksIFJURl9IT1NULCBSVEZfUkVJTlNUQVRFLCBSVEZfRFlOQU1JQywgUlRGX01PRElGSUVECisgIH07CisgIHVuc2lnbmVkIGxvbmcgZGVzdCwgZ2F0ZSwgbWFzazsKKyAgaW50IGZsYWdzLCByZWYsIHVzZSwgbWV0cmljLCBtc3MsIHdpbiwgaXJ0dDsKKyAgY2hhciAqb3V0ID0gdG95YnVmLCAqZmxhZ192YWw7CisgIGNoYXIgaWZhY2VbNjRdPXswfTsKKyAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL25ldC9yb3V0ZSIsICJyIik7CisKKyAgaWYoIWZnZXRzKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIGZwKSkgcmV0dXJuOyAvL3NraXAgaGVhZGVyLgorCisgIHByaW50ZigiS2VybmVsIElQIHJvdXRpbmcgdGFibGVcbiIKKyAgICAgICAgICAiRGVzdGluYXRpb25cdEdhdGV3YXkgXHRHZW5tYXNrIFx0RmxhZ3MgJXMgSWZhY2VcbiIsCisgICAgICAgICAgISh0b3lzLm9wdGZsYWdzJkZMQUdfZSkgPyAiICBNU1MgV2luZG93ICBpcnR0IiA6ICJNZXRyaWMgUmVmICAgIFVzZSIpOworCisgIHdoaWxlIChmZ2V0cyh0b3lidWYsIHNpemVvZih0b3lidWYpLCBmcCkpIHsKKyAgICAgY2hhciAqZGVzdGlwID0gMCwgKmdhdGVpcCA9IDAsICptYXNraXAgPSAwOworCisgICAgIGlmICgxMSAhPSBzc2NhbmYodG95YnVmLCAiJTYzcyVseCVseCVYJWQlZCVkJWx4JWQlZCVkIiwgaWZhY2UsICZkZXN0LAorICAgICAgICZnYXRlLCAmZmxhZ3MsICZyZWYsICZ1c2UsICZtZXRyaWMsICZtYXNrLCAmbXNzLCAmd2luLCAmaXJ0dCkpCisgICAgICAgICBicmVhazsKKworICAgIC8vIHNraXAgZG93biBpbnRlcmZhY2VzLgorICAgIGlmICghKGZsYWdzICYgUlRGX1VQKSkgY29udGludWU7CisKKy8vIFRPRE8gL3Byb2MvbmV0L2lwdjZfcm91dGUKKworICAgIGlmIChkZXN0KSB7CisgICAgICBpZiAoaW5ldF9udG9wKEFGX0lORVQsICZkZXN0LCBvdXQsIDE2KSkgZGVzdGlwID0gb3V0OworICAgIH0gZWxzZSBkZXN0aXAgPSAodG95cy5vcHRmbGFncyZGTEFHX24pID8gIjAuMC4wLjAiIDogImRlZmF1bHQiOworICAgIG91dCArPSAxNjsKKworICAgIGlmIChnYXRlKSB7CisgICAgICBpZiAoaW5ldF9udG9wKEFGX0lORVQsICZnYXRlLCBvdXQsIDE2KSkgZ2F0ZWlwID0gb3V0OworICAgIH0gZWxzZSBnYXRlaXAgPSAodG95cy5vcHRmbGFncyZGTEFHX24pID8gIjAuMC4wLjAiIDogIioiOworICAgIG91dCArPSAxNjsKKworLy8gVE9ETyAvMjQKKyAgICAvL0ZvciBNYXNrCisgICAgaWYgKGluZXRfbnRvcChBRl9JTkVULCAmbWFzaywgb3V0LCAxNikpIG1hc2tpcCA9IG91dDsKKyAgICBlbHNlIG1hc2tpcCA9ICI/IjsKKyAgICBvdXQgKz0gMTY7CisKKyAgICAvL0dldCBmbGFnIFZhbHVlcworICAgIGZsYWdfdmFsID0gb3V0OworICAgICpvdXQrKyA9ICdVJzsKKyAgICBmb3IgKGRlc3QgPSAwOyBkZXN0IDwgQVJSQVlfTEVOKGZsYWdhcnJheSk7IGRlc3QrKykKKyAgICAgIGlmIChmbGFncyZmbGFnYXJyYXlbZGVzdF0pICpvdXQrKyA9IGZsYWdjaGFyc1tkZXN0XTsKKyAgICAqb3V0ID0gMDsKKyAgICBpZiAoZmxhZ3MgJiBSVEZfUkVKRUNUKSAqZmxhZ192YWwgPSAnISc7CisKKyAgICBwcmludGYoIiUtMTUuMTVzICUtMTUuMTVzICUtMTZzJS02cyIsIGRlc3RpcCwgZ2F0ZWlwLCBtYXNraXAsIGZsYWdfdmFsKTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19lKSkKKyAgICAgIHByaW50ZigiJTVkICUtNWQgJTZkICVzXG4iLCBtc3MsIHdpbiwgaXJ0dCwgaWZhY2UpOworICAgIGVsc2UgcHJpbnRmKCIlLTZkICUtMmQgJTdkICVzXG4iLCBtZXRyaWMsIHJlZiwgdXNlLCBpZmFjZSk7CisgIH0KKworICBmY2xvc2UoZnApOworfQorCit2b2lkIG5ldHN0YXRfbWFpbih2b2lkKQoreworICBpbnQgdHV3eCA9IEZMQUdfdHxGTEFHX3V8RkxBR193fEZMQUdfeDsKKyAgY2hhciAqdHlwZSA9ICJ3L28iOworCisgIFRULndwYWQgPSAodG95cy5vcHRmbGFncyZGTEFHX1cpID8gNTEgOiAyMzsKKyAgaWYgKCEodG95cy5vcHRmbGFncyYoRkxBR19yfHR1d3gpKSkgdG95cy5vcHRmbGFncyB8PSB0dXd4OworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcikgZGlzcGxheV9yb3V0ZXMoKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyZ0dXd4KSkgcmV0dXJuOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSB0eXBlID0gImVzdGFibGlzaGVkIGFuZCI7CisgIGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHR5cGUgPSAib25seSI7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIGRpcnRyZWVfcmVhZCgiL3Byb2MiLCBzY2FuX3BpZHMpOworCisgIGlmICh0b3lzLm9wdGZsYWdzJihGTEFHX3R8RkxBR191fEZMQUdfdykpIHsKKyAgICBwcmludGYoIkFjdGl2ZSAlcyAoJXMgc2VydmVycylcbiIsICJJbnRlcm5ldCBjb25uZWN0aW9ucyIsIHR5cGUpOworICAgIHByaW50ZigiUHJvdG8gUmVjdi1RIFNlbmQtUSAlKnMgJSpzIFN0YXRlICAgICAgIiwgLVRULndwYWQsICJMb2NhbCBBZGRyZXNzIiwKKyAgICAgIC1UVC53cGFkLCAiRm9yZWlnbiBBZGRyZXNzIik7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2UpIHByaW50ZigiIFVzZXIgICAgICAgSW5vZGUgICAgICAiKTsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgcHJpbnRmKCIgUElEL1Byb2dyYW0gTmFtZSIpOworICAgIHhwdXRjKCdcbicpOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3QpIHsKKyAgICAgIHNob3dfaXAoIi9wcm9jL25ldC90Y3AiKTsKKyAgICAgIHNob3dfaXAoIi9wcm9jL25ldC90Y3A2Iik7CisgICAgfQorICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR191KSB7CisgICAgICBzaG93X2lwKCIvcHJvYy9uZXQvdWRwIik7CisgICAgICBzaG93X2lwKCIvcHJvYy9uZXQvdWRwNiIpOworICAgIH0KKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdykgeworICAgICAgc2hvd19pcCgiL3Byb2MvbmV0L3JhdyIpOworICAgICAgc2hvd19pcCgiL3Byb2MvbmV0L3JhdzYiKTsKKyAgICB9CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfeCkgeworICAgIHByaW50ZigiQWN0aXZlICVzICglcyBzZXJ2ZXJzKVxuIiwgIlVOSVggZG9tYWluIHNvY2tldHMiLCB0eXBlKTsKKworICAgIHByaW50ZigiUHJvdG8gUmVmQ250IEZsYWdzXHQgVHlwZVx0ICAgIFN0YXRlXHQgICAgJXMgUGF0aFxuIiwKKyAgICAgICh0b3lzLm9wdGZsYWdzJkZMQUdfcCkgPyAiUElEL1Byb2dyYW0gTmFtZSIgOiAiSS1Ob2RlIik7CisgICAgc2hvd191bml4X3NvY2tldHMoKTsKKyAgfQorCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgJiYgQ0ZHX1RPWUJPWF9GUkVFKQorICAgIGxsaXN0X3RyYXZlcnNlKFRULmlub2RlcywgZnJlZSk7CisgIHRveXMuZXhpdHZhbCA9IDA7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9uZXQvcmZraWxsLmMgYi90b3lib3gvdG95cy9uZXQvcmZraWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlNTc2OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL25ldC9yZmtpbGwuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogcmZraWxsLmMgLSBFbmFibGUvZGlzYWJsZSB3aXJlbGVzcyBkZXZpY2VzLgorICoKKyAqIENvcHlyaWdodCAyMDE0IFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9SRktJTEwoTkVXVE9ZKHJma2lsbCwgIjwxPjIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgUkZLSUxMCisgIGJvb2wgInJma2lsbCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICBVc2FnZTogcmZraWxsIENPTU1BTkQgW0RFVklDRV0KKworICAgIEVuYWJsZS9kaXNhYmxlIHdpcmVsZXNzIGRldmljZXMuCisKKyAgICBDb21tYW5kczoKKyAgICBsaXN0IFtERVZJQ0VdICAgTGlzdCBjdXJyZW50IHN0YXRlCisgICAgYmxvY2sgREVWSUNFICAgIERpc2FibGUgZGV2aWNlCisgICAgdW5ibG9jayBERVZJQ0UgIEVuYWJsZSBkZXZpY2UKKworICAgIERFVklDRSBpcyBhbiBpbmRleCBudW1iZXIsIG9yIG9uZSBvZjoKKyAgICBhbGwsIHdsYW4od2lmaSksIGJsdWV0b290aCwgdXdiKHVsdHJhd2lkZWJhbmQpLCB3aW1heCwgd3dhbiwgZ3BzLCBmbS4KKyovCisKKyNkZWZpbmUgRk9SX3Jma2lsbAorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKwordm9pZCByZmtpbGxfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgcmZraWxsX2V2ZW50IHJmZXZlbnQ7CisgIGludCBmZCwgdHZhciwgaWR4ID0gLTEsIHRpZCA9IFJGS0lMTF9UWVBFX0FMTDsKKyAgY2hhciAqKm9wdGFyZ3MgPSB0b3lzLm9wdGFyZ3M7CisKKyAgLy8gUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAgZm9yICh0dmFyID0gMDsgdHZhciA8IDM7IHR2YXIrKykKKyAgICBpZiAoIXN0cmNtcCgoY2hhciAqW10peyJsaXN0IiwgImJsb2NrIiwgInVuYmxvY2sifVt0dmFyXSwgKm9wdGFyZ3MpKSBicmVhazsKKyAgaWYgKHR2YXIgPT0gMykgZXJyb3JfZXhpdCgidW5rbm93biBjbWQgJyVzJyIsICpvcHRhcmdzKTsKKyAgaWYgKHR2YXIpIHsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYXJnbGlzdCB7CisgICAgICBjaGFyICpuYW1lOworICAgICAgaW50IGlkeDsKKyAgICB9IHJmdHlwZXNbXSA9IHt7ImFsbCIsIFJGS0lMTF9UWVBFX0FMTH0sIHsid2lmaSIsIFJGS0lMTF9UWVBFX1dMQU59LAorICAgICAgeyJ3bGFuIiwgUkZLSUxMX1RZUEVfV0xBTn0sIHsiYmx1ZXRvb3RoIiwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIfSwKKyAgICAgIHsidXdiIiwgUkZLSUxMX1RZUEVfVVdCfSwgeyJ1bHRyYXdpZGViYW5kIiwgUkZLSUxMX1RZUEVfVVdCfSwKKyAgICAgIHsid2ltYXgiLCBSRktJTExfVFlQRV9XSU1BWH0sIHsid3dhbiIsIFJGS0lMTF9UWVBFX1dXQU59LAorICAgICAgeyJncHMiLCBSRktJTExfVFlQRV9HUFN9LCB7ImZtIiwgN319OyAvLyBSRktJTExfVFlQRV9GTSA9IDcKKworICAgIGlmICghKisrb3B0YXJncykgZXJyb3JfZXhpdCgiJyVzJyBuZWVkcyBJREVOVElGSUVSIiwgb3B0YXJnc1stMV0pOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9MRU4ocmZ0eXBlcyk7IGkrKykKKyAgICAgIGlmICghc3RyY21wKHJmdHlwZXNbaV0ubmFtZSwgKm9wdGFyZ3MpKSBicmVhazsKKyAgICBpZiAoaSA9PSBBUlJBWV9MRU4ocmZ0eXBlcykpIGlkeCA9IGF0b2x4X3JhbmdlKCpvcHRhcmdzLCAwLCBJTlRfTUFYKTsKKyAgICBlbHNlIHRpZCA9IHJmdHlwZXNbaV0uaWR4OworICB9CisKKyAgLy8gUGVyZm9ybSByZXF1ZXN0ZWQgYWN0aW9uCisgIGZkID0geG9wZW4oIi9kZXYvcmZraWxsIiwgKHR2YXIgPyBPX1JEV1IgOiBPX1JET05MWSl8T19OT05CTE9DSyk7CisgIGlmICh0dmFyKSB7CisgICAgLy8gYmxvY2svdW5ibG9jaworICAgIG1lbXNldCgmcmZldmVudCwgMCwgc2l6ZW9mKHJmZXZlbnQpKTsKKyAgICByZmV2ZW50LnNvZnQgPSB0dmFyID09IDE7CisgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICByZmV2ZW50LmlkeCA9IGlkeDsKKyAgICAgIHJmZXZlbnQub3AgPSBSRktJTExfT1BfQ0hBTkdFOworICAgIH0gZWxzZSB7CisgICAgICByZmV2ZW50LnR5cGUgPSB0aWQ7CisgICAgICByZmV2ZW50Lm9wID0gUkZLSUxMX09QX0NIQU5HRV9BTEw7CisgICAgfQorICAgIHh3cml0ZShmZCwgJnJmZXZlbnQsIHNpemVvZihyZmV2ZW50KSk7CisgIH0gZWxzZSB7CisgICAgLy8gc2hvdyBsaXN0LgorICAgIHdoaWxlIChzaXplb2YocmZldmVudCkgPT0gcmVhZGFsbChmZCwgJnJmZXZlbnQsIHNpemVvZihyZmV2ZW50KSkpIHsKKyAgICAgIGNoYXIgKmxpbmUsICpuYW1lID0gMCwgKnR5cGUgPSAwOworCisgICAgICAvLyBmaWx0ZXIgbGlzdCBpdGVtcworICAgICAgaWYgKCh0aWQgPiAwICYmIHRpZCAhPSByZmV2ZW50LnR5cGUpIHx8IChpZHggIT0gLTEgJiYgaWR4ICE9IHJmZXZlbnQuaWR4KSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNwcmludGYodG95YnVmLCAiL3N5cy9jbGFzcy9yZmtpbGwvcmZraWxsJXUvdWV2ZW50IiwgcmZldmVudC5pZHgpOworICAgICAgdHZhciA9IHhvcGVucm8odG95YnVmKTsKKyAgICAgIHdoaWxlICgobGluZSA9IGdldF9saW5lKHR2YXIpKSkgeworICAgICAgICBjaGFyICpzID0gbGluZTsKKworICAgICAgICBpZiAoc3Ryc3RhcnQoJnMsICJSRktJTExfTkFNRT0iKSkgbmFtZSA9IHhzdHJkdXAocyk7CisgICAgICAgIGVsc2UgaWYgKHN0cnN0YXJ0KCZzLCAiUkZLSUxMX1RZUEU9IikpIHR5cGUgPSB4c3RyZHVwKHMpOworCisgICAgICAgIGZyZWUobGluZSk7CisgICAgICB9CisgICAgICB4Y2xvc2UodHZhcik7CisKKyAgICAgIHhwcmludGYoIiV1OiAlczogJXNcbiIsIHJmZXZlbnQuaWR4LCBuYW1lLCB0eXBlKTsKKyAgICAgIHhwcmludGYoIlx0U29mdCBibG9ja2VkOiAlc1xuIiwgcmZldmVudC5zb2Z0ID8gInllcyIgOiAibm8iKTsKKyAgICAgIHhwcmludGYoIlx0SGFyZCBibG9ja2VkOiAlc1xuIiwgcmZldmVudC5oYXJkID8gInllcyIgOiAibm8iKTsKKyAgICAgIGZyZWUobmFtZSk7CisgICAgICBmcmVlKHR5cGUpOworICAgIH0KKyAgfQorICB4Y2xvc2UoZmQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvUkVBRE1FIGIvdG95Ym94L3RveXMvb3RoZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmNkNmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9SRUFETUUKQEAgLTAsMCArMSwxMyBAQAorT3RoZXIgY29tbWFuZHMKKworVGhlc2UgYXJlIGNvbW1hbmRzIG5vdCBwcmVzZW50IGluIFBvc2l4IG9yIExTQi4KKworTW9zdCBvZiB0aGVtIGFyZSBuZWNlc3NhcnkgdG8gcHJvdmlkZSBhIGRldmVsb3BtZW50IGVudmlyb25tZW50IGNhcGFibGUgb2YKK2Jvb3RpbmcgYSBzeXN0ZW0gaW1hZ2UgYW5kIGJ1aWxkaW5nIExpbnV4IEZyb20gU2NyYXRjaCB1bmRlciBpdC4KKworVGVzdGVkIHdpdGggQWJvcmlnaW5hbCBMaW51eCBzeXN0ZW0gaW1hZ2UgYW5kIHRoZSBsZnMtYm9vdHN0cmFwLmhkYyBhdXRvbWF0ZWQKK2J1aWxkIGNvbnRyb2wgaW1hZ2UgZm9yIExpbnV4IEZyb20gU2NyYXRjaCA2LjgpOgorCisgIGh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsCisKKyAgaHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvY29udHJvbC1pbWFnZXMKZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2FjcGkuYyBiL3RveWJveC90b3lzL290aGVyL2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E1MzgxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvYWNwaS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiBhY3BpLmMgLSBzaG93IHBvd2VyIHN0YXRlCisgKgorICogV3JpdHRlbiBieSBJc2FhYyBEdW5oYW0sIDIwMTMKKyAqCisgKiBObyBzdGFuZGFyZC4KKworVVNFX0FDUEkoTkVXVE9ZKGFjcGksICJhYmN0ViIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEFDUEkKKyAgYm9vbCAiYWNwaSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogYWNwaSBbLWFiY3RWXQorICAgIAorICAgIFNob3cgc3RhdHVzIG9mIHBvd2VyIHNvdXJjZXMgYW5kIHRoZXJtYWwgZGV2aWNlcy4KKworICAgIC1hCXNob3cgcG93ZXIgYWRhcHRlcnMKKyAgICAtYglzaG93IGJhdHRlcmllcworICAgIC1jCXNob3cgY29vbGluZyBkZXZpY2Ugc3RhdGUKKyAgICAtdAlzaG93IHRlbXBlcmF0dXJlcworICAgIC1WCXNob3cgZXZlcnl0aGluZworKi8KKworI2RlZmluZSBGT1JfYWNwaQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgaW50IGFjLCBiYXQsIHRoZXJtLCBjb29sOworICBjaGFyICpjcGF0aDsKKykKKworaW50IHJlYWRfaW50X2F0KGludCBkaXJmZCwgY2hhciAqbmFtZSkKK3sKKyAgaW50IGZkLCByZXQ9MDsKKyAgRklMRSAqZmlsOworCisgIGlmICgoZmQgPSBvcGVuYXQoZGlyZmQsIG5hbWUsIE9fUkRPTkxZKSkgPCAwKSByZXR1cm4gLTE7CisgIGlmICghZnNjYW5mKGZpbCA9IHhmZG9wZW4oZmQsICJyIiksICIlZCIsICZyZXQpKSBwZXJyb3JfZXhpdF9yYXcobmFtZSk7CisgIGZjbG9zZShmaWwpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9jYWxsYmFjayhzdHJ1Y3QgZGlydHJlZSAqdHJlZSkKK3sKKyAgaW50IGRmZCwgZmQsIGxlbiwgb247CisKKyAgZXJybm8gPSAwOworCisgIGlmICh0cmVlLT5uYW1lWzBdPT0nLicpIHJldHVybiAwOworCisgIGlmICghdHJlZS0+cGFyZW50KQorICAgIHJldHVybiBESVJUUkVFX1JFQ1VSU0V8RElSVFJFRV9TWU1GT0xMT1c7CisKKyAgaWYgKDAgPD0gKGRmZCA9IG9wZW4oKFRULmNwYXRoPWRpcnRyZWVfcGF0aCh0cmVlLCBOVUxMKSksIE9fUkRPTkxZKSkpIHsKKyAgICBpZiAoKGZkID0gb3BlbmF0KGRmZCwgInR5cGUiLCBPX1JET05MWSkpIDwgMCkgZ290byBkb25lOworICAgIGxlbiA9IHJlYWRhbGwoZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgIGNsb3NlKGZkKTsKKyAgICBpZiAobGVuIDwgMSkgZ290byBkb25lOworCisgICAgaWYgKCFzdHJuY21wKHRveWJ1ZiwgIkJhdHRlcnkiLCA3KSkgeworICAgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSB8fCAoIXRveXMub3B0ZmxhZ3MpKSB7CisgICAgICAgIGludCBjYXAgPSAwLCBjdXJyID0gMCwgbWF4ID0gMDsKKworICAgICAgICBpZiAoKGNhcCA9IHJlYWRfaW50X2F0KGRmZCwgImNhcGFjaXR5IikpIDwgMCkgeworICAgICAgICAgIGlmICgobWF4ID0gcmVhZF9pbnRfYXQoZGZkLCAiY2hhcmdlX2Z1bGwiKSkgPiAwKQorICAgICAgICAgICAgY3VyciA9IHJlYWRfaW50X2F0KGRmZCwgImNoYXJnZV9ub3ciKTsKKyAgICAgICAgICBlbHNlIGlmICgobWF4ID0gcmVhZF9pbnRfYXQoZGZkLCAiZW5lcmd5X2Z1bGwiKSkgPiAwKQorICAgICAgICAgICAgY3VyciA9IHJlYWRfaW50X2F0KGRmZCwgImVuZXJneV9ub3ciKTsKKyAgICAgICAgICBpZiAobWF4ID4gMCAmJiBjdXJyID49IDApIGNhcCA9IDEwMCAqIGN1cnIgLyBtYXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhcCA+PSAwKSBwcmludGYoIkJhdHRlcnkgJWQ6ICVkJSVcbiIsIFRULmJhdCsrLCBjYXApOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYSkgeworICAgICAgaWYgKChvbiA9IHJlYWRfaW50X2F0KGRmZCwgIm9ubGluZSIpKSA+PSAwKQorICAgICAgICBwcmludGYoIkFkYXB0ZXIgJWQ6ICVzLWxpbmVcbiIsIFRULmFjKyssIChvbiA/ICJvbiIgOiAib2ZmIikpOworICAgIH0KK2RvbmU6CisgICAgY2xvc2UoZGZkKTsKKyAgfQorICBmcmVlKFRULmNwYXRoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVtcF9jYWxsYmFjayhzdHJ1Y3QgZGlydHJlZSAqdHJlZSkKK3sKKyAgaW50IGRmZCwgdGVtcDsKKworICBpZiAoKnRyZWUtPm5hbWU9PScuJykgcmV0dXJuIDA7CisgIGlmICghdHJlZS0+cGFyZW50IHx8ICF0cmVlLT5wYXJlbnQtPnBhcmVudCkKKyAgICByZXR1cm4gRElSVFJFRV9SRUNVUlNFfERJUlRSRUVfU1lNRk9MTE9XOworICBlcnJubyA9IDA7CisKKyAgaWYgKDAgPD0gKGRmZCA9IG9wZW4oKFRULmNwYXRoPWRpcnRyZWVfcGF0aCh0cmVlLCBOVUxMKSksIE9fUkRPTkxZKSkpIHsKKyAgICBpZiAoKDAgPCAodGVtcCA9IHJlYWRfaW50X2F0KGRmZCwgInRlbXAiKSkpIHx8ICFlcnJubykgeworICAgICAgLy9zb21lIHRlbXBlcnR1cmVzIGFyZSBpbiBtaWxsaS1DLCBzb21lIGluIGRlY2ktQworICAgICAgLy9yZXB1dGVkbHkgc29tZSBhcmUgaW4gZGVjaS1LLCBidXQgSSBoYXZlIG5vdCBzZWVuIHRoZW0KKyAgICAgIGlmICgoKHRlbXAgPj0gMTAwMCkgfHwgKHRlbXAgPD0gLTEwMDApKSAmJiAodGVtcCUxMDAgPT0gMCkpIHRlbXAgLz0gMTAwOworICAgICAgcHJpbnRmKCJUaGVybWFsICVkOiAlZC4lZCBkZWdyZWVzIENcbiIsIFRULnRoZXJtKyssIHRlbXAvMTAsIHRlbXAlMTApOworICAgIH0KKyAgICBjbG9zZShkZmQpOworICB9CisgIGZyZWUoVFQuY3BhdGgpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvb2xfY2FsbGJhY2soc3RydWN0IGRpcnRyZWUgKnRyZWUpCit7CisgIGludCBkZmQ9NSwgY3VyLCBtYXg7CisKKyAgZXJybm8gPSAwOworICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisKKyAgaWYgKCp0cmVlLT5uYW1lID09ICcuJykgcmV0dXJuIDA7CisgIGlmICghdHJlZS0+cGFyZW50KSByZXR1cm4gRElSVFJFRV9SRUNVUlNFfERJUlRSRUVfU1lNRk9MTE9XOworCisKKyAgaWYgKDAgPD0gKGRmZCA9IG9wZW4oKFRULmNwYXRoPWRpcnRyZWVfcGF0aCh0cmVlLCAmZGZkKSksIE9fUkRPTkxZKSkpIHsKKyAgICBUVC5jcGF0aCA9IHN0cmNhdChUVC5jcGF0aCwgIi90eXBlIik7CisgICAgaWYgKHJlYWRmaWxlKFRULmNwYXRoLCB0b3lidWYsIDI1NikgJiYgIWVycm5vKSB7CisgICAgICB0b3lidWZbc3RybGVuKHRveWJ1ZikgLTFdID0gMDsKKyAgICAgIGN1cj1yZWFkX2ludF9hdChkZmQsICJjdXJfc3RhdGUiKTsKKyAgICAgIG1heD1yZWFkX2ludF9hdChkZmQsICJtYXhfc3RhdGUiKTsKKyAgICAgIGlmIChlcnJubykKKyAgICAgICAgcHJpbnRmKCJDb29saW5nICVkOiAlcyBubyBzdGF0ZSBpbmZvcm1hdGlvblxuIiwgVFQuY29vbCsrLCB0b3lidWYpOworICAgICAgZWxzZSBwcmludGYoIkNvb2xpbmcgJWQ6ICVzICVkIG9mICVkXG4iLCBUVC5jb29sKyssIHRveWJ1ZiwgY3VyLCBtYXgpOworICAgIH0KKyAgICBjbG9zZShkZmQpOworICB9CisgIGZyZWUoVFQuY3BhdGgpOworICByZXR1cm4gMDsKK30KKwordm9pZCBhY3BpX21haW4odm9pZCkKK3sKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1YpIHRveXMub3B0ZmxhZ3MgPSBGTEFHX2F8RkxBR19ifEZMQUdfY3xGTEFHX3Q7CisgIGlmICghdG95cy5vcHRmbGFncykgdG95cy5vcHRmbGFncyA9IEZMQUdfYjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19hfEZMQUdfYikpCisgICAgZGlydHJlZV9yZWFkKCIvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseSIsIGFjcGlfY2FsbGJhY2spOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgZGlydHJlZV9yZWFkKCIvc3lzL2NsYXNzIiwgdGVtcF9jYWxsYmFjayk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSBkaXJ0cmVlX3JlYWQoIi9zeXMvY2xhc3MvdGhlcm1hbCIsIGNvb2xfY2FsbGJhY2spOworCit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9iYXNlNjQuYyBiL3RveWJveC90b3lzL290aGVyL2Jhc2U2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9iYXNlNjQuYwpAQCAtMCwwICsxLDk0IEBACisvKiBiYXNlNjQuYyAtIEVuY29kZSBhbmQgZGVjb2RlIGJhc2U2NAorICoKKyAqIENvcHlyaWdodCAyMDE0IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm8gc3RhbmRhcmQKKworVVNFX0JBU0U2NChORVdUT1koYmFzZTY0LCAiZGl3IzwwPTc2WyFkd10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBCQVNFNjQKKyAgYm9vbCAiYmFzZTY0IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBiYXNlNjQgWy1kaV0gWy13IENPTFVNTlNdIFtGSUxFLi4uXQorCisgICAgRW5jb2RlIG9yIGRlY29kZSBpbiBiYXNlNjQuCisKKyAgICAtZAlkZWNvZGUKKyAgICAtaQlpZ25vcmUgbm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycworICAgIC13CXdyYXAgb3V0cHV0IGF0IENPTFVNTlMgKGRlZmF1bHQgNzYgb3IgMCBmb3Igbm8gd3JhcCkKKyovCisKKyNkZWZpbmUgRk9SX2Jhc2U2NAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgbG9uZyBjb2x1bW5zOworCisgIHVuc2lnbmVkIHRvdGFsOworKQorCitzdGF0aWMgdm9pZCB3cmFwdXRjaGFyKGludCBjLCBpbnQgKngpCit7CisgIHB1dGNoYXIoYyk7CisgIFRULnRvdGFsKys7CisgIGlmIChUVC5jb2x1bW5zICYmICsrKnggPT0gVFQuY29sdW1ucykgeworICAgICp4ID0gMDsKKyAgICB4cHV0YygnXG4nKTsKKyAgfTsKK30KKworc3RhdGljIHZvaWQgZG9fYmFzZTY0KGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgaW50IG91dCA9IDAsIGJpdHMgPSAwLCB4ID0gMCwgaSwgbGVuOworICBjaGFyICpidWYgPSB0b3lidWYrMTI4OworCisgIFRULnRvdGFsID0gMDsKKworICBmb3IgKDs7KSB7CisgICAgLy8gSWYgbm8gbW9yZSBkYXRhLCBmbHVzaCBidWZmZXIKKyAgICBpZiAoIShsZW4gPSB4cmVhZChmZCwgYnVmLCBzaXplb2YodG95YnVmKS0xMjgpKSkgeworICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZCkpIHsKKyAgICAgICAgaWYgKGJpdHMpIHdyYXB1dGNoYXIodG95YnVmW291dDw8KDYtYml0cyldLCAmeCk7CisgICAgICAgIHdoaWxlIChUVC50b3RhbCYzKSB3cmFwdXRjaGFyKCc9JywgJngpOworICAgICAgICBpZiAoeCkgeHB1dGMoJ1xuJyk7CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2QpIHsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAnPScpIHJldHVybjsKKworICAgICAgICBpZiAoKHggPSBzdHJpZHgodG95YnVmLCBidWZbaV0pKSAhPSAtMSkgeworICAgICAgICAgIG91dCA9IChvdXQ8PDYpICsgeDsKKyAgICAgICAgICBiaXRzICs9IDY7CisgICAgICAgICAgaWYgKGJpdHMgPj0gOCkgeworICAgICAgICAgICAgcHV0Y2hhcihvdXQgPj4gKGJpdHMgLT0gOCkpOworICAgICAgICAgICAgb3V0ICY9ICgxPDxiaXRzKS0xOworICAgICAgICAgICAgaWYgKGZlcnJvcihzdGRvdXQpKSBwZXJyb3JfZXhpdCgwKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmW2ldID09ICdcbicgfHwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpKSBjb250aW51ZTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IChvdXQ8PDgpICsgYnVmW2ldOworICAgICAgICBiaXRzICs9IDg7CisgICAgICAgIHdoaWxlIChiaXRzID49IDYpIHsKKyAgICAgICAgICB3cmFwdXRjaGFyKHRveWJ1ZltvdXQgPj4gKGJpdHMgLT0gNildLCAmeCk7CisgICAgICAgICAgb3V0ICY9ICgxPDxiaXRzKS0xOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgYmFzZTY0X21haW4odm9pZCkKK3sKKyAgYmFzZTY0X2luaXQodG95YnVmKTsKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fYmFzZTY0KTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2Jsa2lkLmMgYi90b3lib3gvdG95cy9vdGhlci9ibGtpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzliNWYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9ibGtpZC5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBibGtpZC5jIC0gUHJpbnRzIHR5cGUsIGxhYmVsIGFuZCBVVUlEIG9mIGZpbGVzeXN0ZW0ocykuCisgKgorICogQ29weXJpZ2h0IDIwMTMgQnJhZCBDb25yb3kgPGJjb25yb3lAdWlzLmVkdT4KKyAqCisgKiBTZWUgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3V0aWwtbGludXgvdjIuMjQvbGliYmxraWQtZG9jcy9hcGktaW5kZXgtZnVsbC5odG1sCisKK1VTRV9CTEtJRChORVdUT1koYmxraWQsIDAsIFRPWUZMQUdfQklOKSkKK1VTRV9GU1RZUEUoTkVXVE9ZKGZzdHlwZSwgIjwxIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgQkxLSUQKKyAgYm9vbCAiYmxraWQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGJsa2lkIERFVi4uLgorCisgICAgUHJpbnRzIHR5cGUsIGxhYmVsIGFuZCBVVUlEIG9mIGZpbGVzeXN0ZW0gb24gYSBibG9jayBkZXZpY2Ugb3IgaW1hZ2UuCisKK2NvbmZpZyBGU1RZUEUKKyAgYm9vbCAiZnN0eXBlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBmc3R5cGUgREVWLi4uCisKKyAgICBQcmludHMgdHlwZSBvZiBmaWxlc3lzdGVtIG9uIGEgYmxvY2sgZGV2aWNlIG9yIGltYWdlLgorKi8KKworI2RlZmluZSBGT1JfYmxraWQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0cnVjdCBmc3R5cGUgeworICBjaGFyICpuYW1lOworICB1aW50NjRfdCBtYWdpYzsKKyAgaW50IG1hZ2ljX2xlbiwgbWFnaWNfb2Zmc2V0LCB1dWlkX29mZiwgbGFiZWxfbGVuLCBsYWJlbF9vZmY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZzdHlwZSBmc3R5cGVzW10gPSB7CisgIHsiZXh0MiIsIDB4RUY1MywgMiwgMTA4MCwgMTEyOCwgMTYsIDExNDR9LCAvLyBrZWVwIHRoaXMgZmlyc3QgZm9yIGV4dDMvNCBjaGVjaworICB7InN3YXAiLCAweDQzNDE1MDUzNTA0MTU3NTNMTCwgOCwgNDA4NiwgMTAzNiwgMTUsIDEwNTJ9LAorICAvLyBOVEZTIGxhYmVsIGFjdHVhbGx5IDgvMTYgMHg0ZDgwIGJ1dCBob3JyaWJsZTogMTYgYml0IHdpZGUgY2hhcmFjdGVycyB2aWEKKyAgLy8gY29kZXBhZ2UsIHNvbWV0aGluZyBjYWxsZWQgYSB1dWlkIHRoYXQncyBvbmx5IDggYnl0ZXMgbG9uZy4uLgorICB7Im50ZnMiLCAweDUzNDY1NDRlLCA0LCAzLCAweDQ4Kyg4PDwyNCksIDAsIDB9LAorCisgIHsiYWRmcyIsIDB4YWRmNSwgMiwgMHhjMDAsIDAsMCwwfSwKKyAgeyJiZnMiLCAweDFiYWRmYWNlLCA0LCAwLCAwLDAsMH0sCisgIHsiYnRyZnMiLCAweDRENUY1MzY2NTI0ODQyNUZVTEwsIDgsIDY1NjAwLCA2NTgwMywgMjU2LCA2NTgxOX0sCisgIHsiY3JhbWZzIiwgMHgyOGNkM2Q0NSwgNCwgMCwgMCwgMTYsIDQ4fSwKKyAgeyJmMmZzIiwgMHhGMkY1MjAxMCwgNCwgMTAyNCwgMTEzMiwgMTYsIDExMTB9LAorICB7ImpmcyIsIDB4MzE1MzQ2NGEsIDQsIDMyNzY4LCAzMjkyMCwgMTYsIDMyOTA0fSwKKyAgeyJuaWxmcyIsIDB4MzQzNCwgMiwgMTAzMCwgMTE3NiwgODAsIDExOTJ9LAorICB7InJlaXNlcmZzIiwgMHg3MjQ1NzM0OTY1NTJVTEwsIDYsIDgyNDQsIDgyNzYsIDE2LCA4MjkyfSwKKyAgeyJyZWlzZXJmcyIsIDB4NzI0NTczNDk2NTUyVUxMLCA2LCA2NTU4OCwgNjU2MjAsIDE2LCA2NTYzNn0sCisgIHsicm9tZnMiLCAweDJkNmQ2ZjcyLCA0LCAwLCAwLDAsMH0sCisgIHsic3F1YXNoZnMiLCAweDczNzE3MzY4LCA0LCAwLCAwLDAsMH0sCisgIHsieGlhZnMiLCAweDAxMmZkMTZkLCA0LCA1NzIsIDAsMCwwfSwKKyAgeyJ4ZnMiLCAweDQyNTM0NjU4LCA0LCAwLCAzMiwgMTIsIDEwOH0sCisgIHsidmZhdCIsIDB4MzIzMzU0NDE0NlVMTCwgNSwgODIsIDY3Kyg0PDwyNCksIDExLCA3MX0sICAvLyBmYXQzMgorICB7InZmYXQiLCAweDMxNTQ0MTQ2LCA0LCA1NCwgMzkrKDQ8PDI0KSwgMTEsIDQzfSAgICAgLy8gZmF0MQorfTsKKworc3RhdGljIHZvaWQgZG9fYmxraWQoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpbnQgb2ZmLCBpLCBqLCBsZW47CisgIGNoYXIgKnR5cGU7CisKKyAgb2ZmID0gaSA9IDA7CisKKyAgZm9yICg7OykgeworICAgIGludCBwYXNzID0gMDsKKworICAgIC8vIFJlYWQgbmV4dCBibG9jayBvZiBkYXRhCisgICAgbGVuID0gcmVhZGFsbChmZCwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgaWYgKGxlbiAhPSBzaXplb2YodG95YnVmKSkgcmV0dXJuOworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHR5cGVzIGluIHJhbmdlCisgICAgZm9yIChpPTA7IGkgPCBzaXplb2YoZnN0eXBlcykvc2l6ZW9mKHN0cnVjdCBmc3R5cGUpOyBpKyspIHsKKyAgICAgIHVpbnQ2NF90IHRlc3Q7CisKKyAgICAgIC8vIFNraXAgdGVzdHMgbm90IGluIHRoaXMgNGsgYmxvY2sKKyAgICAgIGlmIChmc3R5cGVzW2ldLm1hZ2ljX29mZnNldCA+IG9mZitzaXplb2YodG95YnVmKSkgeworICAgICAgICBwYXNzKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGZzdHlwZXNbaV0ubWFnaWNfb2Zmc2V0IDwgb2ZmKSBjb250aW51ZTsKKworICAgICAgLy8gUG9wdWxhdGUgNjQgYml0IGxpdHRsZSBlbmRpYW4gbWFnaWMgdmFsdWUKKyAgICAgIHRlc3QgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IGZzdHlwZXNbaV0ubWFnaWNfbGVuOyBqKyspCisgICAgICAgIHRlc3QgKz0gKCh1aW50NjRfdCl0b3lidWZbaitmc3R5cGVzW2ldLm1hZ2ljX29mZnNldC1vZmZdKTw8KDgqaik7CisgICAgICBpZiAodGVzdCA9PSBmc3R5cGVzW2ldLm1hZ2ljKSBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBBUlJBWV9MRU4oZnN0eXBlcykpIHsKKyAgICAgIG9mZiArPSBsZW47CisgICAgICBpZiAocGFzcykgY29udGludWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgLy8gZGlzdGluZ3Vpc2ggZXh0Mi8zLzQKKyAgdHlwZSA9IGZzdHlwZXNbaV0ubmFtZTsKKyAgaWYgKCFpKSB7CisgICAgaWYgKHRveWJ1ZlsxMTE2XSY0KSB0eXBlID0gImV4dDMiOworICAgIGlmICh0b3lidWZbMTEyMF0mNjQpIHR5cGUgPSAiZXh0NCI7CisgIH0KKworICAvLyBDb3VsZCBzcGVjaWFsIGNhc2UgTlRGUyBoZXJlLi4uCisKKyAgLy8gT3V0cHV0IGZvciBmc3R5cGUKKyAgaWYgKCp0b3lzLndoaWNoLT5uYW1lID09ICdmJykgeworICAgIHB1dHModHlwZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gb3V0cHV0IGZvciBibGtpZAorICBwcmludGYoIiVzOiIsbmFtZSk7CisKKyAgaWYgKGZzdHlwZXNbaV0ubGFiZWxfbGVuKSB7CisgICAgY2hhciAqcyA9IHRveWJ1Zitmc3R5cGVzW2ldLmxhYmVsX29mZi1vZmY7OworCisgICAgbGVuID0gZnN0eXBlc1tpXS5sYWJlbF9sZW47CisgICAgaWYgKCFzdHJjbXAodHlwZSwgInZmYXQiKSkgeworICAgICAgd2hpbGUgKGxlbiAmJiBzW2xlbi0xXT09JyAnKSBsZW4tLTsKKyAgICAgIGlmIChzdHJzdGFydCgmcywgIk5PIE5BTUUiKSkgbGVuPTA7CisgICAgfQorICAgIGlmIChsZW4pIHByaW50ZigiIExBQkVMPVwiJS4qc1wiIiwgbGVuLCBzKTsKKyAgfQorCisgIGlmIChmc3R5cGVzW2ldLnV1aWRfb2ZmKSB7CisgICAgaW50IGJpdHMgPSAweDU1MCwgc2l6ZSA9IGZzdHlwZXNbaV0udXVpZF9vZmYgPj4gMjQsCisgICAgICAgIHVvZmYgPSAoZnN0eXBlc1tpXS51dWlkX29mZiAmICgoMTw8MjQpLTEpKS1vZmY7CisKKyAgICBpZiAoc2l6ZSkgYml0cyA9IDQqKHNpemUgPT0gNCk7CisgICAgZWxzZSBzaXplID0gMTY7CisKKyAgICBwcmludGYoIiBVVUlEPVwiIik7CisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgcHJpbnRmKCItJTAyeCIrIShiaXRzICYgKDE8PGopKSwgdG95YnVmW3VvZmYral0pOworICAgIHByaW50ZigiXCIiKTsKKyAgfQorCisgIHByaW50ZigiIFRZUEU9XCIlc1wiXG4iLCB0eXBlKTsKK30KKwordm9pZCBibGtpZF9tYWluKHZvaWQpCit7CisgIGlmICgqdG95cy5vcHRhcmdzKSBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19ibGtpZCk7CisgIGVsc2UgeworICAgIHVuc2lnbmVkIGludCBtYSwgbWksIHN6LCBmZDsKKyAgICBjaGFyICpuYW1lID0gdG95YnVmLCAqYnVmZmVyID0gdG95YnVmKzEwMjQsIGRldmljZVszMl07CisgICAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL3BhcnRpdGlvbnMiLCAiciIpOworCisgICAgd2hpbGUgKGZnZXRzKGJ1ZmZlciwgMTAyNCwgZnApKSB7CisgICAgICAqbmFtZSA9IDA7CisgICAgICBpZiAoc3NjYW5mKGJ1ZmZlciwgIiAldSAldSAldSAlW15cbiBdIiwgJm1hLCAmbWksICZzeiwgbmFtZSkgIT0gNCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNwcmludGYoZGV2aWNlLCAiL2Rldi8lLjIwcyIsIG5hbWUpOworICAgICAgaWYgKC0xID09IChmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSkpKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFTk9NRURJVU0pIHBlcnJvcl9tc2dfcmF3KGRldmljZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb19ibGtpZChmZCwgZGV2aWNlKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBmY2xvc2UoZnApOworICB9Cit9CisKK3ZvaWQgZnN0eXBlX21haW4odm9pZCkKK3sKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fYmxraWQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvYmxvY2tkZXYuYyBiL3RveWJveC90b3lzL290aGVyL2Jsb2NrZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlMDk5MwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2Jsb2NrZGV2LmMKQEAgLTAsMCArMSw2NyBAQAorLyogYmxvY2tkZXYuYyAtc2hvdy9zZXQgYmxvY2tkZXYgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTQgU2FtZWVyIFByYWthc2ggUHJhZGhhbiA8c2FtZWVyLnAucHJhZGhhbkBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQuCisKK1VTRV9CTE9DS0RFVihORVdUT1koYmxvY2tkZXYsICI8MT4xKHNldHJvKShzZXRydykoZ2V0cm8pKGdldHNzKShnZXRic3opKHNldGJzeikjPDAoZ2V0c3opKGdldHNpemUpKGdldHNpemU2NCkoZmx1c2hidWZzKShyZXJlYWRwdCkiLFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEJMT0NLREVWCisgIGJvb2wgImJsb2NrZGV2IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBibG9ja2RldiAtLU9QVElPTi4uLiBCTE9DS0RFVi4uLgorCisgICAgQ2FsbCBpb2N0bChzKSBvbiBlYWNoIGxpc3RlZCBibG9jayBkZXZpY2UKKworICAgIE9QVElPTnM6CisgICAgLS1zZXRybwkJU2V0IHJlYWQgb25seQorICAgIC0tc2V0cncJCVNldCByZWFkIHdyaXRlCisgICAgLS1nZXRybwkJR2V0IHJlYWQgb25seQorICAgIC0tZ2V0c3MJCUdldCBzZWN0b3Igc2l6ZQorICAgIC0tZ2V0YnN6CUdldCBibG9jayBzaXplCisgICAgLS1zZXRic3oJQllURVMJU2V0IGJsb2NrIHNpemUKKyAgICAtLWdldHN6CQlHZXQgZGV2aWNlIHNpemUgaW4gNTEyLWJ5dGUgc2VjdG9ycworICAgIC0tZ2V0c2l6ZQlHZXQgZGV2aWNlIHNpemUgaW4gc2VjdG9ycyAoZGVwcmVjYXRlZCkKKyAgICAtLWdldHNpemU2NAlHZXQgZGV2aWNlIHNpemUgaW4gYnl0ZXMKKyAgICAtLWZsdXNoYnVmcwlGbHVzaCBidWZmZXJzCisgICAgLS1yZXJlYWRwdAlSZXJlYWQgcGFydGl0aW9uIHRhYmxlCisqLworCisjZGVmaW5lIEZPUl9ibG9ja2RldgorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCitHTE9CQUxTKAorICBsb25nIGJzejsKKykKKwordm9pZCBibG9ja2Rldl9tYWluKHZvaWQpCit7CisgIGludCBjbWRzW10gPSB7QkxLUlJQQVJULCBCTEtGTFNCVUYsIEJMS0dFVFNJWkU2NCwgQkxLR0VUU0laRSwgQkxLR0VUU0laRTY0LAorICAgICAgICAgICAgICAgIEJMS0JTWlNFVCwgQkxLQlNaR0VULCBCTEtTU1pHRVQsIEJMS1JPR0VULCBCTEtST1NFVCwgQkxLUk9TRVR9OworICBjaGFyICoqc3M7CisgIGxvbmcgbG9uZyB2YWwgPSAwOworCisgIGlmICghdG95cy5vcHRmbGFncykgaGVscF9leGl0KCJuZWVkIC0tb3B0aW9uIik7CisKKyAgZm9yIChzcyA9IHRveXMub3B0YXJnczsgICpzczsgc3MrKykgeworICAgIGludCBmZCA9IHhvcGVucm8oKnNzKSwgaTsKKworICAgIC8vIENvbW1hbmQgbGluZSBvcmRlciBkaXNjYXJkZWQgc28gcGVyZm9ybSBtdWx0aXBsZSBvcGVyYXRpb25zIGluIGZsYWcgb3JkZXIKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgbG9uZyBmbGFnID0gdG95cy5vcHRmbGFncyAmICgxPDxpKTsKKworICAgICAgaWYgKCFmbGFnKSBjb250aW51ZTsKKworICAgICAgaWYgKGZsYWcgJiBGTEFHX3NldGJzeikgdmFsID0gVFQuYnN6OworICAgICAgZWxzZSB2YWwgPSAhIShmbGFnICYgRkxBR19zZXRybyk7CisKKyAgICAgIHhpb2N0bChmZCwgY21kc1tpXSwgJnZhbCk7CisKKyAgICAgIGZsYWcgJj0gRkxBR19zZXRic3p8RkxBR19zZXRyb3xGTEFHX2ZsdXNoYnVmc3xGTEFHX3JlcmVhZHB0fEZMQUdfc2V0cnc7CisgICAgICBpZiAoIWZsYWcpIHByaW50ZigiJWxsZFxuIiwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2dldHN6KSA/IHZhbCA+PiA5OiB2YWwpOworICAgIH0KKyAgICB4Y2xvc2UoZmQpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9iemNhdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvYnpjYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjU5ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvYnpjYXQuYwpAQCAtMCwwICsxLDcyMyBAQAorLyogYnpjYXQuYyAtIGJ6aXAyIGRlY29tcHJlc3Npb24KKyAqCisgKiBDb3B5cmlnaHQgMjAwMywgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIEJhc2VkIG9uIGEgY2xvc2UgcmVhZGluZyAoYnV0IG5vdCB0aGUgYWN0dWFsIGNvZGUpIG9mIHRoZSBvcmlnaW5hbCBiemlwMgorICogZGVjb21wcmVzc2lvbiBjb2RlIGJ5IEp1bGlhbiBSIFNld2FyZCAoanNld2FyZEBhY20ub3JnKSwgd2hpY2ggYWxzbworICogYWNrbm93bGVkZ2VzIGNvbnRyaWJ1dGlvbnMgYnkgTWlrZSBCdXJyb3dzLCBEYXZpZCBXaGVlbGVyLCBQZXRlciBGZW53aWNrLAorICogQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwsIElhbiBILiBXaXR0ZW4sIFJvYmVydCBTZWRnZXdpY2ssIGFuZAorICogSm9uIEwuIEJlbnRsZXkuCisgKgorICogTm8gc3RhbmRhcmQuCisKKworVVNFX0JaQ0FUKE5FV1RPWShiemNhdCwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0JVTlpJUDIoTkVXVE9ZKGJ1bnppcDIsICJjZnRrdiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEJVTlpJUDIKKyAgYm9vbCAiYnVuemlwMiIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogYnVuemlwMiBbLWNmdGt2XSBbRklMRS4uLl0KKworICAgIERlY29tcHJlc3MgbGlzdGVkIGZpbGVzIChmaWxlLmJ6IGJlY29tZXMgZmlsZSkgZGVsZXRpbmcgYXJjaGl2ZSBmaWxlKHMpLgorICAgIFJlYWQgZnJvbSBzdGRpbiBpZiBubyBmaWxlcyBsaXN0ZWQuCisKKyAgICAtYwlmb3JjZSBvdXRwdXQgdG8gc3Rkb3V0CisgICAgLWYJZm9yY2UgZGVjb21wcmVzc2lvbi4gKElmIEZJTEUgZG9lc24ndCBlbmQgaW4gLmJ6LCByZXBsYWNlIG9yaWdpbmFsLikKKyAgICAtawlrZWVwIGlucHV0IGZpbGVzICgtYyBhbmQgLXQgaW1wbHkgdGhpcykKKyAgICAtdCAgdGVzdCBpbnRlZ3JpdHkKKyAgICAtdgl2ZXJib3NlCisKK2NvbmZpZyBCWkNBVAorICBib29sICJiemNhdCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogYnpjYXQgW0ZJTEUuLi5dCisKKyAgICBEZWNvbXByZXNzIGxpc3RlZCBmaWxlcyB0byBzdGRvdXQuIFVzZSBzdGRpbiBpZiBubyBmaWxlcyBsaXN0ZWQuCisqLworCisjZGVmaW5lIEZPUl9idW56aXAyCisjaW5jbHVkZSAidG95cy5oIgorCisjZGVmaW5lIFRIUkVBRFMgMQorCisvLyBDb25zdGFudHMgZm9yIGh1ZmZtYW4gY29kaW5nCisjZGVmaW5lIE1BWF9HUk9VUFMgICAgICAgICAgICAgICA2CisjZGVmaW5lIEdST1VQX1NJWkUgICAgICAgICAgICAgICA1MCAgICAgLyogNjQgd291bGQgaGF2ZSBiZWVuIG1vcmUgZWZmaWNpZW50ICovCisjZGVmaW5lIE1BWF9IVUZDT0RFX0JJVFMgICAgICAgICAyMCAgICAgLyogTG9uZ2VzdCBodWZmbWFuIGNvZGUgYWxsb3dlZCAqLworI2RlZmluZSBNQVhfU1lNQk9MUyAgICAgICAgICAgICAgMjU4ICAgIC8qIDI1NiBsaXRlcmFscyArIFJVTkEgKyBSVU5CICovCisjZGVmaW5lIFNZTUJPTF9SVU5BICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZTUJPTF9SVU5CICAgICAgICAgICAgICAxCisKKy8vIE90aGVyIGhvdXNla2VlcGluZyBjb25zdGFudHMKKyNkZWZpbmUgSU9CVUZfU0laRSAgICAgICAgICAgICAgIDQwOTYKKworLy8gU3RhdHVzIHJldHVybiB2YWx1ZXMKKyNkZWZpbmUgUkVUVkFMX0xBU1RfQkxPQ0sgICAgICAgICgtMTAwKQorI2RlZmluZSBSRVRWQUxfTk9UX0JaSVBfREFUQSAgICAgKC0xKQorI2RlZmluZSBSRVRWQUxfREFUQV9FUlJPUiAgICAgICAgKC0yKQorI2RlZmluZSBSRVRWQUxfT0JTT0xFVEVfSU5QVVQgICAgKC0zKQorCisvLyBUaGlzIGlzIHdoYXQgd2Uga25vdyBhYm91dCBlYWNoIGh1ZmZtYW4gY29kaW5nIGdyb3VwCitzdHJ1Y3QgZ3JvdXBfZGF0YSB7CisgIGludCBsaW1pdFtNQVhfSFVGQ09ERV9CSVRTKzFdLCBiYXNlW01BWF9IVUZDT0RFX0JJVFNdLCBwZXJtdXRlW01BWF9TWU1CT0xTXTsKKyAgY2hhciBtaW5MZW4sIG1heExlbjsKK307CisKKy8vIERhdGEgZm9yIGJ1cnJvd3Mgd2hlZWxlciB0cmFuc2Zvcm0KKworc3RydWN0IGJ3ZGF0YSB7CisgIHVuc2lnbmVkIGludCBvcmlnUHRyOworICBpbnQgYnl0ZUNvdW50WzI1Nl07CisgIC8vIFN0YXRlIHNhdmVkIHdoZW4gaW50ZXJydXB0aW5nIG91dHB1dAorICBpbnQgd3JpdGVQb3MsIHdyaXRlUnVuLCB3cml0ZUNvdW50LCB3cml0ZUN1cnJlbnQ7CisgIHVuc2lnbmVkIGludCBkYXRhQ1JDLCBoZWFkZXJDUkM7CisgIHVuc2lnbmVkIGludCAqZGJ1ZjsKK307CisKKy8vIFN0cnVjdHVyZSBob2xkaW5nIGFsbCB0aGUgaG91c2VrZWVwaW5nIGRhdGEsIGluY2x1ZGluZyBJTyBidWZmZXJzIGFuZAorLy8gbWVtb3J5IHRoYXQgcGVyc2lzdHMgYmV0d2VlbiBjYWxscyB0byBidW56aXAKK3N0cnVjdCBidW56aXBfZGF0YSB7CisgIC8vIElucHV0IHN0cmVhbSwgaW5wdXQgYnVmZmVyLCBpbnB1dCBiaXQgYnVmZmVyCisgIGludCBpbl9mZCwgaW5idWZDb3VudCwgaW5idWZQb3M7CisgIGNoYXIgKmluYnVmOworICB1bnNpZ25lZCBpbnQgaW5idWZCaXRDb3VudCwgaW5idWZCaXRzOworCisgIC8vIE91dHB1dCBidWZmZXIKKyAgY2hhciBvdXRidWZbSU9CVUZfU0laRV07CisgIGludCBvdXRidWZQb3M7CisKKyAgdW5zaWduZWQgaW50IHRvdGFsQ1JDOworCisgIC8vIEZpcnN0IHBhc3MgZGVjb21wcmVzc2lvbiBkYXRhIChIdWZmbWFuIGFuZCBNVEYgZGVjb2RpbmcpCisgIGNoYXIgc2VsZWN0b3JzWzMyNzY4XTsgICAgICAgICAgICAgICAgICAvLyBuU2VsZWN0b3JzPTE1IGJpdHMKKyAgc3RydWN0IGdyb3VwX2RhdGEgZ3JvdXBzW01BWF9HUk9VUFNdOyAgIC8vIGh1ZmZtYW4gY29kaW5nIHRhYmxlcworICBpbnQgc3ltVG90YWwsIGdyb3VwQ291bnQsIG5TZWxlY3RvcnM7CisgIHVuc2lnbmVkIGNoYXIgc3ltVG9CeXRlWzI1Nl0sIG10ZlN5bWJvbFsyNTZdOworCisgIC8vIFRoZSBDUkMgdmFsdWVzIHN0b3JlZCBpbiB0aGUgYmxvY2sgaGVhZGVyIGFuZCBjYWxjdWxhdGVkIGZyb20gdGhlIGRhdGEKKyAgdW5zaWduZWQgaW50IGNyYzMyVGFibGVbMjU2XTsKKworICAvLyBTZWNvbmQgcGFzcyBkZWNvbXByZXNzaW9uIGRhdGEgKGJ1cnJvd3Mtd2hlZWxlciB0cmFuc2Zvcm0pCisgIHVuc2lnbmVkIGludCBkYnVmU2l6ZTsKKyAgc3RydWN0IGJ3ZGF0YSBid2RhdGFbVEhSRUFEU107Cit9OworCisvLyBSZXR1cm4gdGhlIG5leHQgbm5uIGJpdHMgb2YgaW5wdXQuICBBbGwgcmVhZHMgZnJvbSB0aGUgY29tcHJlc3NlZCBpbnB1dAorLy8gYXJlIGRvbmUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLiAgQWxsIHJlYWRzIGFyZSBiaWcgZW5kaWFuLgorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfYml0cyhzdHJ1Y3QgYnVuemlwX2RhdGEgKmJkLCBjaGFyIGJpdHNfd2FudGVkKQoreworICB1bnNpZ25lZCBpbnQgYml0cyA9IDA7CisKKyAgLy8gSWYgd2UgbmVlZCB0byBnZXQgbW9yZSBkYXRhIGZyb20gdGhlIGJ5dGUgYnVmZmVyLCBkbyBzby4gIChMb29wIGdldHRpbmcKKyAgLy8gb25lIGJ5dGUgYXQgYSB0aW1lIHRvIGVuZm9yY2UgZW5kaWFubmVzcyBhbmQgYXZvaWQgdW5hbGlnbmVkIGFjY2Vzcy4pCisgIHdoaWxlIChiZC0+aW5idWZCaXRDb3VudCA8IGJpdHNfd2FudGVkKSB7CisKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhIGZyb20gZmlsZSBpbnRvIGJ5dGUgYnVmZmVyLCBkbyBzbworICAgIGlmIChiZC0+aW5idWZQb3MgPT0gYmQtPmluYnVmQ291bnQpIHsKKyAgICAgIGlmICgwID49IChiZC0+aW5idWZDb3VudCA9IHJlYWQoYmQtPmluX2ZkLCBiZC0+aW5idWYsIElPQlVGX1NJWkUpKSkKKyAgICAgICAgZXJyb3JfZXhpdCgiaW5wdXQgRU9GIik7CisgICAgICBiZC0+aW5idWZQb3MgPSAwOworICAgIH0KKworICAgIC8vIEF2b2lkIDMyLWJpdCBvdmVyZmxvdyAoZHVtcCBiaXQgYnVmZmVyIHRvIHRvcCBvZiBvdXRwdXQpCisgICAgaWYgKGJkLT5pbmJ1ZkJpdENvdW50Pj0yNCkgeworICAgICAgYml0cyA9IGJkLT5pbmJ1ZkJpdHMmKCgxPDxiZC0+aW5idWZCaXRDb3VudCktMSk7CisgICAgICBiaXRzX3dhbnRlZCAtPSBiZC0+aW5idWZCaXRDb3VudDsKKyAgICAgIGJpdHMgPDw9IGJpdHNfd2FudGVkOworICAgICAgYmQtPmluYnVmQml0Q291bnQgPSAwOworICAgIH0KKworICAgIC8vIEdyYWIgbmV4dCA4IGJpdHMgb2YgaW5wdXQgZnJvbSBidWZmZXIuCisgICAgYmQtPmluYnVmQml0cyA9IChiZC0+aW5idWZCaXRzPDw4KSB8IGJkLT5pbmJ1ZltiZC0+aW5idWZQb3MrK107CisgICAgYmQtPmluYnVmQml0Q291bnQgKz0gODsKKyAgfQorCisgIC8vIENhbGN1bGF0ZSByZXN1bHQKKyAgYmQtPmluYnVmQml0Q291bnQgLT0gYml0c193YW50ZWQ7CisgIGJpdHMgfD0gKGJkLT5pbmJ1ZkJpdHM+PmJkLT5pbmJ1ZkJpdENvdW50KSAmICgoMTw8Yml0c193YW50ZWQpLTEpOworCisgIHJldHVybiBiaXRzOworfQorCisvKiBSZWFkIGJsb2NrIGhlYWRlciBhdCBzdGFydCBvZiBhIG5ldyBjb21wcmVzc2VkIGRhdGEgYmxvY2suICBDb25zaXN0cyBvZjoKKyAqCisgKiA0OCBiaXRzIDogQmxvY2sgc2lnbmF0dXJlLCBlaXRoZXIgcGkgKGRhdGEgYmxvY2spIG9yIGUgKEVPRiBibG9jaykuCisgKiAzMiBiaXRzIDogYnctPmhlYWRlckNSQworICogMSAgYml0ICA6IG9ic29sZXRlIGZlYXR1cmUgZmxhZy4KKyAqIDI0IGJpdHMgOiBvcmlnUHRyIChCdXJyb3dzLXdoZWVsZXIgdW53aW5kIGluZGV4LCBvbmx5IDIwIGJpdHMgZXZlciB1c2VkKQorICogMTYgYml0cyA6IE1hcHBpbmcgdGFibGUgaW5kZXguCisgKlsxNiBiaXRzXTogc3ltVG9CeXRlW3N5bVRvdGFsXSAoTWFwcGluZyB0YWJsZS4gIEZvciBlYWNoIGJpdCBzZXQgaW4gbWFwcGluZworICogICAgICAgICAgIHRhYmxlIGluZGV4IGFib3ZlLCByZWFkIGFub3RoZXIgMTYgYml0cyBvZiBtYXBwaW5nIHRhYmxlIGRhdGEuCisgKiAgICAgICAgICAgSWYgY29ycmVzcG9uZGlnIGJpdCBpcyB1bnNldCwgYWxsIGJpdHMgaW4gdGhhdCBtYXBwaW5nIHRhYmxlCisgKiAgICAgICAgICAgc2VjdGlvbiBhcmUgMC4pCisgKiAgMyBiaXRzIDogZ3JvdXBDb3VudCAoaG93IG1hbnkgaHVmZm1hbiB0YWJsZXMgdXNlZCB0byBlbmNvZGUsIGFueXdoZXJlCisgKiAgICAgICAgICAgZnJvbSAyIHRvIE1BWF9HUk9VUFMpCisgKiB2YXJpYWJsZTogaHVmR3JvdXBbZ3JvdXBDb3VudF0gKE1URiBlbmNvZGVkIGh1ZmZtYW4gdGFibGUgZGF0YS4pCisgKi8KKworc3RhdGljIGludCByZWFkX2Jsb2NrX2hlYWRlcihzdHJ1Y3QgYnVuemlwX2RhdGEgKmJkLCBzdHJ1Y3QgYndkYXRhICpidykKK3sKKyAgc3RydWN0IGdyb3VwX2RhdGEgKmh1Zkdyb3VwOworICBpbnQgaGgsIGlpLCBqaiwga2ssIHN5bUNvdW50LCAqYmFzZSwgKmxpbWl0OworICB1bnNpZ25lZCBjaGFyIHVjOworCisgIC8vIFJlYWQgaW4gaGVhZGVyIHNpZ25hdHVyZSBhbmQgQ1JDICh3aGljaCBpcyBzdG9yZWQgYmlnIGVuZGlhbikKKyAgaWkgPSBnZXRfYml0cyhiZCwgMjQpOworICBqaiA9IGdldF9iaXRzKGJkLCAyNCk7CisgIGJ3LT5oZWFkZXJDUkMgPSBnZXRfYml0cyhiZCwzMik7CisKKyAgLy8gSXMgdGhpcyB0aGUgRU9GIGJsb2NrIHdpdGggQ1JDIGZvciB3aG9sZSBmaWxlPyAgKENvbnN0YW50IGlzICJlIikKKyAgaWYgKGlpPT0weDE3NzI0NSAmJiBqaj09MHgzODUwOTApIHJldHVybiBSRVRWQUxfTEFTVF9CTE9DSzsKKworICAvLyBJcyB0aGlzIGEgdmFsaWQgZGF0YSBibG9jaz8gIChDb25zdGFudCBpcyAicGkiLikKKyAgaWYgKGlpIT0weDMxNDE1OSB8fCBqaiE9MHgyNjUzNTkpIHJldHVybiBSRVRWQUxfTk9UX0JaSVBfREFUQTsKKworICAvLyBXZSBjYW4gYWRkIHN1cHBvcnQgZm9yIGJsb2NrUmFuZG9taXNlZCBpZiBhbnlib2R5IGNvbXBsYWlucy4KKyAgaWYgKGdldF9iaXRzKGJkLDEpKSByZXR1cm4gUkVUVkFMX09CU09MRVRFX0lOUFVUOworICBpZiAoKGJ3LT5vcmlnUHRyID0gZ2V0X2JpdHMoYmQsMjQpKSA+IGJkLT5kYnVmU2l6ZSkgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisgIC8vIG1hcHBpbmcgdGFibGU6IGlmIHNvbWUgYnl0ZSB2YWx1ZXMgYXJlIG5ldmVyIHVzZWQgKGVuY29kaW5nIHRoaW5ncworICAvLyBsaWtlIGFzY2lpIHRleHQpLCB0aGUgY29tcHJlc3Npb24gY29kZSByZW1vdmVzIHRoZSBnYXBzIHRvIGhhdmUgZmV3ZXIKKyAgLy8gc3ltYm9scyB0byBkZWFsIHdpdGgsIGFuZCB3cml0ZXMgYSBzcGFyc2UgYml0ZmllbGQgaW5kaWNhdGluZyB3aGljaAorICAvLyB2YWx1ZXMgd2VyZSBwcmVzZW50LiAgV2UgbWFrZSBhIHRyYW5zbGF0aW9uIHRhYmxlIHRvIGNvbnZlcnQgdGhlIHN5bWJvbHMKKyAgLy8gYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBieXRlcy4KKyAgaGggPSBnZXRfYml0cyhiZCwgMTYpOworICBiZC0+c3ltVG90YWwgPSAwOworICBmb3IgKGlpPTA7IGlpPDE2OyBpaSsrKSB7CisgICAgaWYgKGhoICYgKDEgPDwgKDE1IC0gaWkpKSkgeworICAgICAga2sgPSBnZXRfYml0cyhiZCwgMTYpOworICAgICAgZm9yIChqaj0wOyBqajwxNjsgamorKykKKyAgICAgICAgaWYgKGtrICYgKDEgPDwgKDE1IC0gamopKSkKKyAgICAgICAgICBiZC0+c3ltVG9CeXRlW2JkLT5zeW1Ub3RhbCsrXSA9ICgxNiAqIGlpKSArIGpqOworICAgIH0KKyAgfQorCisgIC8vIEhvdyBtYW55IGRpZmZlcmVudCBodWZmbWFuIGNvZGluZyBncm91cHMgZG9lcyB0aGlzIGJsb2NrIHVzZT8KKyAgYmQtPmdyb3VwQ291bnQgPSBnZXRfYml0cyhiZCwzKTsKKyAgaWYgKGJkLT5ncm91cENvdW50PDIgfHwgYmQtPmdyb3VwQ291bnQ+TUFYX0dST1VQUykgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisgIC8vIG5TZWxlY3RvcnM6IEV2ZXJ5IEdST1VQX1NJWkUgbWFueSBzeW1ib2xzIHdlIHN3aXRjaCBodWZmbWFuIGNvZGluZworICAvLyB0YWJsZXMuICBFYWNoIGdyb3VwIGhhcyBhIHNlbGVjdG9yLCB3aGljaCBpcyBhbiBpbmRleCBpbnRvIHRoZSBodWZmbWFuCisgIC8vIGNvZGluZyB0YWJsZSBhcnJheXMuCisgIC8vCisgIC8vIFJlYWQgaW4gdGhlIGdyb3VwIHNlbGVjdG9yIGFycmF5LCB3aGljaCBpcyBzdG9yZWQgYXMgTVRGIGVuY29kZWQKKyAgLy8gYml0IHJ1bnMuICAoTVRGID0gTW92ZSBUbyBGcm9udC4gIEV2ZXJ5IHRpbWUgYSBzeW1ib2wgb2NjdXJzIGl0J3MgbW92ZWQKKyAgLy8gdG8gdGhlIGZyb250IG9mIHRoZSB0YWJsZSwgc28gaXQgaGFzIGEgc2hvcnRlciBlbmNvZGluZyBuZXh0IHRpbWUuKQorICBpZiAoIShiZC0+blNlbGVjdG9ycyA9IGdldF9iaXRzKGJkLCAxNSkpKSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisgIGZvciAoaWk9MDsgaWk8YmQtPmdyb3VwQ291bnQ7IGlpKyspIGJkLT5tdGZTeW1ib2xbaWldID0gaWk7CisgIGZvciAoaWk9MDsgaWk8YmQtPm5TZWxlY3RvcnM7IGlpKyspIHsKKworICAgIC8vIEdldCBuZXh0IHZhbHVlCisgICAgZm9yKGpqPTA7Z2V0X2JpdHMoYmQsMSk7amorKykKKyAgICAgIGlmIChqaj49YmQtPmdyb3VwQ291bnQpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKworICAgIC8vIERlY29kZSBNVEYgdG8gZ2V0IHRoZSBuZXh0IHNlbGVjdG9yLCBhbmQgbW92ZSBpdCB0byB0aGUgZnJvbnQuCisgICAgdWMgPSBiZC0+bXRmU3ltYm9sW2pqXTsKKyAgICBtZW1tb3ZlKGJkLT5tdGZTeW1ib2wrMSwgYmQtPm10ZlN5bWJvbCwgamopOworICAgIGJkLT5tdGZTeW1ib2xbMF0gPSBiZC0+c2VsZWN0b3JzW2lpXSA9IHVjOworICB9CisKKyAgLy8gUmVhZCB0aGUgaHVmZm1hbiBjb2RpbmcgdGFibGVzIGZvciBlYWNoIGdyb3VwLCB3aGljaCBjb2RlIGZvciBzeW1Ub3RhbAorICAvLyBsaXRlcmFsIHN5bWJvbHMsIHBsdXMgdHdvIHJ1biBzeW1ib2xzIChSVU5BLCBSVU5CKQorICBzeW1Db3VudCA9IGJkLT5zeW1Ub3RhbCsyOworICBmb3IgKGpqPTA7IGpqPGJkLT5ncm91cENvdW50OyBqaisrKSB7CisgICAgdW5zaWduZWQgY2hhciBsZW5ndGhbTUFYX1NZTUJPTFNdOworICAgIHVuc2lnbmVkIHRlbXBbTUFYX0hVRkNPREVfQklUUysxXTsKKyAgICBpbnQgbWluTGVuLCBtYXhMZW4sIHBwOworCisgICAgLy8gUmVhZCBsZW5ndGhzCisgICAgaGggPSBnZXRfYml0cyhiZCwgNSk7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgc3ltQ291bnQ7IGlpKyspIHsKKyAgICAgIGZvcig7OykgeworICAgICAgICAvLyAhaGggfHwgaGggPiBNQVhfSFVGQ09ERV9CSVRTIGluIG9uZSB0ZXN0LgorICAgICAgICBpZiAoTUFYX0hVRkNPREVfQklUUy0xIDwgKHVuc2lnbmVkKWhoLTEpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKyAgICAgICAgLy8gR3JhYiAyIGJpdHMgaW5zdGVhZCBvZiAxIChzbGlnaHRseSBzbWFsbGVyL2Zhc3RlcikuICBTdG9wIGlmCisgICAgICAgIC8vIGZpcnN0IGJpdCBpcyAwLCBvdGhlcndpc2Ugc2Vjb25kIGJpdCBzYXlzIHdoZXRoZXIgdG8KKyAgICAgICAgLy8gaW5jcmVtZW50IG9yIGRlY3JlbWVudC4KKyAgICAgICAga2sgPSBnZXRfYml0cyhiZCwgMik7CisgICAgICAgIGlmIChrayAmIDIpIGhoICs9IDEgLSAoKGtrJjEpPDwxKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYmQtPmluYnVmQml0Q291bnQrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGVuZ3RoW2lpXSA9IGhoOworICAgIH0KKworICAgIC8vIEZpbmQgbGFyZ2VzdCBhbmQgc21hbGxlc3QgbGVuZ3RocyBpbiB0aGlzIGdyb3VwCisgICAgbWluTGVuID0gbWF4TGVuID0gbGVuZ3RoWzBdOworICAgIGZvciAoaWkgPSAxOyBpaSA8IHN5bUNvdW50OyBpaSsrKSB7CisgICAgICBpZihsZW5ndGhbaWldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5ndGhbaWldOworICAgICAgZWxzZSBpZihsZW5ndGhbaWldIDwgbWluTGVuKSBtaW5MZW4gPSBsZW5ndGhbaWldOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBwZXJtdXRlW10sIGJhc2VbXSwgYW5kIGxpbWl0W10gdGFibGVzIGZyb20gbGVuZ3RoW10uCisgICAgICoKKyAgICAgKiBwZXJtdXRlW10gaXMgdGhlIGxvb2t1cCB0YWJsZSBmb3IgY29udmVydGluZyBodWZmbWFuIGNvZGVkIHN5bWJvbHMKKyAgICAgKiBpbnRvIGRlY29kZWQgc3ltYm9scy4gIEl0IGNvbnRhaW5zIHN5bWJvbCB2YWx1ZXMgc29ydGVkIGJ5IGxlbmd0aC4KKyAgICAgKgorICAgICAqIGJhc2VbXSBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdGhlIHZhbHVlIG9mIGEgaHVmZm1hbiBzeW1ib2wKKyAgICAgKiBvZiBhIGdpdmVuIGxlbmd0aCB3aGVuIHVzaW5nIHBlcm11dGVbXS4KKyAgICAgKgorICAgICAqIGxpbWl0W10gaW5kaWNhdGVzIHRoZSBsYXJnZXN0IG51bWVyaWNhbCB2YWx1ZSBhIHN5bWJvbCB3aXRoIGEgZ2l2ZW4KKyAgICAgKiBudW1iZXIgb2YgYml0cyBjYW4gaGF2ZS4gIEl0IGxldHMgdXMga25vdyB3aGVuIHRvIHN0b3AgcmVhZGluZy4KKyAgICAgKgorICAgICAqIFRvIHVzZSB0aGVzZSwga2VlcCByZWFkaW5nIGJpdHMgdW50aWwgdmFsdWUgPD0gbGltaXRbYml0Y291bnRdIG9yCisgICAgICogeW91J3ZlIHJlYWQgb3ZlciAyMCBiaXRzIChlcnJvcikuICBUaGVuIHRoZSBkZWNvZGVkIHN5bWJvbAorICAgICAqIGVxdWFscyBwZXJtdXRlW2h1ZmNvZGVfdmFsdWUgLSBiYXNlW2h1ZmNvZGVfYml0Y291bnRdXS4KKyAgICAgKi8KKyAgICBodWZHcm91cCA9IGJkLT5ncm91cHMramo7CisgICAgaHVmR3JvdXAtPm1pbkxlbiA9IG1pbkxlbjsKKyAgICBodWZHcm91cC0+bWF4TGVuID0gbWF4TGVuOworCisgICAgLy8gTm90ZSB0aGF0IG1pbkxlbiBjYW4ndCBiZSBzbWFsbGVyIHRoYW4gMSwgc28gd2UgYWRqdXN0IHRoZSBiYXNlCisgICAgLy8gYW5kIGxpbWl0IGFycmF5IHBvaW50ZXJzIHNvIHdlJ3JlIG5vdCBhbHdheXMgd2FzdGluZyB0aGUgZmlyc3QKKyAgICAvLyBlbnRyeS4gIFdlIGRvIHRoaXMgYWdhaW4gd2hlbiB1c2luZyB0aGVtIChkdXJpbmcgc3ltYm9sIGRlY29kaW5nKS4KKyAgICBiYXNlID0gaHVmR3JvdXAtPmJhc2UtMTsKKyAgICBsaW1pdCA9IGh1Zkdyb3VwLT5saW1pdC0xOworCisgICAgLy8gemVybyB0ZW1wW10gYW5kIGxpbWl0W10sIGFuZCBjYWxjdWxhdGUgcGVybXV0ZVtdCisgICAgcHAgPSAwOworICAgIGZvciAoaWkgPSBtaW5MZW47IGlpIDw9IG1heExlbjsgaWkrKykgeworICAgICAgdGVtcFtpaV0gPSBsaW1pdFtpaV0gPSAwOworICAgICAgZm9yIChoaCA9IDA7IGhoIDwgc3ltQ291bnQ7IGhoKyspCisgICAgICAgIGlmIChsZW5ndGhbaGhdID09IGlpKSBodWZHcm91cC0+cGVybXV0ZVtwcCsrXSA9IGhoOworICAgIH0KKworICAgIC8vIENvdW50IHN5bWJvbHMgY29kZWQgZm9yIGF0IGVhY2ggYml0IGxlbmd0aAorICAgIGZvciAoaWkgPSAwOyBpaSA8IHN5bUNvdW50OyBpaSsrKSB0ZW1wW2xlbmd0aFtpaV1dKys7CisKKyAgICAvKiBDYWxjdWxhdGUgbGltaXRbXSAodGhlIGxhcmdlc3Qgc3ltYm9sLWNvZGluZyB2YWx1ZSBhdCBlYWNoIGJpdAorICAgICAqIGxlbmd0aCwgd2hpY2ggaXMgKHByZXZpb3VzIGxpbWl0PDwxKStzeW1ib2xzIGF0IHRoaXMgbGV2ZWwpLCBhbmQKKyAgICAgKiBiYXNlW10gKG51bWJlciBvZiBzeW1ib2xzIHRvIGlnbm9yZSBhdCBlYWNoIGJpdCBsZW5ndGgsIHdoaWNoIGlzCisgICAgICogbGltaXQgbWludXMgdGhlIGN1bXVsYXRpdmUgY291bnQgb2Ygc3ltYm9scyBjb2RlZCBmb3IgYWxyZWFkeSkuICovCisgICAgcHAgPSBoaCA9IDA7CisgICAgZm9yIChpaSA9IG1pbkxlbjsgaWkgPCBtYXhMZW47IGlpKyspIHsKKyAgICAgIHBwICs9IHRlbXBbaWldOworICAgICAgbGltaXRbaWldID0gcHAtMTsKKyAgICAgIHBwIDw8PSAxOworICAgICAgYmFzZVtpaSsxXSA9IHBwLShoaCs9dGVtcFtpaV0pOworICAgIH0KKyAgICBsaW1pdFttYXhMZW5dID0gcHArdGVtcFttYXhMZW5dLTE7CisgICAgbGltaXRbbWF4TGVuKzFdID0gSU5UX01BWDsKKyAgICBiYXNlW21pbkxlbl0gPSAwOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZpcnN0IHBhc3MsIHJlYWQgYmxvY2sncyBzeW1ib2xzIGludG8gZGJ1ZltkYnVmQ291bnRdLgorICoKKyAqIFRoaXMgdW5kb2VzIHRocmVlIHR5cGVzIG9mIGNvbXByZXNzaW9uOiBodWZmbWFuIGNvZGluZywgcnVuIGxlbmd0aCBlbmNvZGluZywKKyAqIGFuZCBtb3ZlIHRvIGZyb250IGVuY29kaW5nLiAgV2UgaGF2ZSB0byB1bmRvIGFsbCB0aG9zZSB0byBrbm93IHdoZW4gd2UndmUKKyAqIHJlYWQgZW5vdWdoIGlucHV0LgorICovCisKK3N0YXRpYyBpbnQgcmVhZF9odWZmbWFuX2RhdGEoc3RydWN0IGJ1bnppcF9kYXRhICpiZCwgc3RydWN0IGJ3ZGF0YSAqYncpCit7CisgIHN0cnVjdCBncm91cF9kYXRhICpodWZHcm91cDsKKyAgaW50IGlpLCBqaiwga2ssIHJ1blBvcywgZGJ1ZkNvdW50LCBzeW1Db3VudCwgc2VsZWN0b3IsIG5leHRTeW0sCisgICAgKmJ5dGVDb3VudCwgKmJhc2UsICpsaW1pdDsKKyAgdW5zaWduZWQgaGgsICpkYnVmID0gYnctPmRidWY7CisgIHVuc2lnbmVkIGNoYXIgdWM7CisKKyAgLy8gV2UndmUgZmluaXNoZWQgcmVhZGluZyBhbmQgZGlnZXN0aW5nIHRoZSBibG9jayBoZWFkZXIuICBOb3cgcmVhZCB0aGlzCisgIC8vIGJsb2NrJ3MgaHVmZm1hbiBjb2RlZCBzeW1ib2xzIGZyb20gdGhlIGZpbGUgYW5kIHVuZG8gdGhlIGh1ZmZtYW4gY29kaW5nCisgIC8vIGFuZCBydW4gbGVuZ3RoIGVuY29kaW5nLCBzYXZpbmcgdGhlIHJlc3VsdCBpbnRvIGRidWZbZGJ1ZkNvdW50KytdID0gdWMKKworICAvLyBJbml0aWFsaXplIHN5bWJvbCBvY2N1cnJlbmNlIGNvdW50ZXJzIGFuZCBzeW1ib2wgbXRmIHRhYmxlCisgIGJ5dGVDb3VudCA9IGJ3LT5ieXRlQ291bnQ7CisgIGZvcihpaT0wOyBpaTwyNTY7IGlpKyspIHsKKyAgICBieXRlQ291bnRbaWldID0gMDsKKyAgICBiZC0+bXRmU3ltYm9sW2lpXSA9IGlpOworICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGNvbXByZXNzZWQgc3ltYm9scy4gIFRoaXMgaXMgdGhlIGZpcnN0ICJ0aWdodCBpbm5lciBsb29wIgorICAvLyB0aGF0IG5lZWRzIHRvIGJlIG1pY3JvLW9wdGltaXplZCBmb3Igc3BlZWQuICAoVGhpcyBvbmUgZmlsbHMgb3V0IGRidWZbXQorICAvLyBsaW5lYXJseSwgc3RheWluZyBpbiBjYWNoZSBtb3JlLCBzbyBpc24ndCBhcyBsaW1pdGVkIGJ5IERSQU0gYWNjZXNzLikKKyAgcnVuUG9zID0gZGJ1ZkNvdW50ID0gc3ltQ291bnQgPSBzZWxlY3RvciA9IDA7CisgIC8vIFNvbWUgdW5uZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIHRvIHNodXQgZ2NjIHVwLgorICBiYXNlID0gbGltaXQgPSAwOworICBodWZHcm91cCA9IDA7CisgIGhoID0gMDsKKworICBmb3IgKDs7KSB7CisgICAgLy8gSGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhpcyBodWZmbWFuIGdyb3VwPworICAgIGlmICghKHN5bUNvdW50LS0pKSB7CisgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaHVmZm1hbiBjb2RpbmcgZ3JvdXAgdG8gdXNlLgorICAgICAgc3ltQ291bnQgPSBHUk9VUF9TSVpFLTE7CisgICAgICBpZiAoc2VsZWN0b3IgPj0gYmQtPm5TZWxlY3RvcnMpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKyAgICAgIGh1Zkdyb3VwID0gYmQtPmdyb3VwcyArIGJkLT5zZWxlY3RvcnNbc2VsZWN0b3IrK107CisgICAgICBiYXNlID0gaHVmR3JvdXAtPmJhc2UtMTsKKyAgICAgIGxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0LTE7CisgICAgfQorCisgICAgLy8gUmVhZCBuZXh0IGh1ZmZtYW4tY29kZWQgc3ltYm9sIChpbnRvIGpqKS4KKyAgICBpaSA9IGh1Zkdyb3VwLT5taW5MZW47CisgICAgamogPSBnZXRfYml0cyhiZCwgaWkpOworICAgIHdoaWxlIChqaiA+IGxpbWl0W2lpXSkgeworICAgICAgLy8gaWYgKGlpID4gaHVmR3JvdXAtPm1heExlbikgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworICAgICAgaWkrKzsKKworICAgICAgLy8gVW5yb2xsIGdldF9iaXRzKCkgdG8gYXZvaWQgYSBmdW5jdGlvbiBjYWxsIHdoZW4gdGhlIGRhdGEncyBpbgorICAgICAgLy8gdGhlIGJ1ZmZlciBhbHJlYWR5LgorICAgICAga2sgPSBiZC0+aW5idWZCaXRDb3VudAorICAgICAgICA/IChiZC0+aW5idWZCaXRzID4+IC0tKGJkLT5pbmJ1ZkJpdENvdW50KSkgJiAxIDogZ2V0X2JpdHMoYmQsIDEpOworICAgICAgamogPSAoamogPDwgMSkgfCBrazsKKyAgICB9CisgICAgLy8gSHVmZm1hbiBkZWNvZGUgamogaW50byBuZXh0U3ltICh3aXRoIGJvdW5kcyBjaGVja2luZykKKyAgICBqai09YmFzZVtpaV07CisKKyAgICBpZiAoaWkgPiBodWZHcm91cC0+bWF4TGVuIHx8ICh1bnNpZ25lZClqaiA+PSBNQVhfU1lNQk9MUykKKyAgICAgIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKyAgICBuZXh0U3ltID0gaHVmR3JvdXAtPnBlcm11dGVbampdOworCisgICAgLy8gSWYgdGhpcyBpcyBhIHJlcGVhdGVkIHJ1biwgbG9vcCBjb2xsZWN0aW5nIGRhdGEKKyAgICBpZiAoKHVuc2lnbmVkKW5leHRTeW0gPD0gU1lNQk9MX1JVTkIpIHsKKyAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHJ1biwgemVybyBvdXQgY291bnRlcgorICAgICAgaWYoIXJ1blBvcykgeworICAgICAgICBydW5Qb3MgPSAxOworICAgICAgICBoaCA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIE5lYXQgdHJpY2sgdGhhdCBzYXZlcyAxIHN5bWJvbDogaW5zdGVhZCBvZiBvci1pbmcgMCBvciAxIGF0CisgICAgICAgICBlYWNoIGJpdCBwb3NpdGlvbiwgYWRkIDEgb3IgMiBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgIDEwMTEgaXMgMTw8MCArIDE8PDEgKyAyPDwyLiAxMDEwIGlzIDI8PDAgKyAyPDwxICsgMTw8Mi4KKyAgICAgICAgIFlvdSBjYW4gbWFrZSBhbnkgYml0IHBhdHRlcm4gdGhhdCB3YXkgdXNpbmcgMSBsZXNzIHN5bWJvbCB0aGFuCisgICAgICAgICB0aGUgYmFzaWMgb3IgMC8xIG1ldGhvZCAoZXhjZXB0IGFsbCBiaXRzIDAsIHdoaWNoIHdvdWxkIHVzZSBubworICAgICAgICAgc3ltYm9scywgYnV0IGEgcnVuIG9mIGxlbmd0aCAwIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBpbiB0aGlzCisgICAgICAgICBjb250ZXh0KS4gVGh1cyBzcGFjZSBpcyBzYXZlZC4gKi8KKyAgICAgIGhoICs9IChydW5Qb3MgPDwgbmV4dFN5bSk7IC8vICtydW5Qb3MgaWYgUlVOQTsgKzIqcnVuUG9zIGlmIFJVTkIKKyAgICAgIHJ1blBvcyA8PD0gMTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIFdoZW4gd2UgaGl0IHRoZSBmaXJzdCBub24tcnVuIHN5bWJvbCBhZnRlciBhIHJ1biwgd2Ugbm93IGtub3cKKyAgICAgICBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIGxhc3QgbGl0ZXJhbCwgc28gYXBwZW5kIHRoYXQgbWFueQorICAgICAgIGNvcGllcyB0byBvdXIgYnVmZmVyIG9mIGRlY29kZWQgc3ltYm9scyAoZGJ1Zikgbm93LiAoVGhlIGxhc3QKKyAgICAgICBsaXRlcmFsIHVzZWQgaXMgdGhlIG9uZSBhdCB0aGUgaGVhZCBvZiB0aGUgbXRmU3ltYm9sIGFycmF5LikgKi8KKyAgICBpZiAocnVuUG9zKSB7CisgICAgICBydW5Qb3MgPSAwOworICAgICAgLy8gQ2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgIGlmIChoaD5iZC0+ZGJ1ZlNpemUgfHwgZGJ1ZkNvdW50K2hoPmJkLT5kYnVmU2l6ZSkKKyAgICAgICAgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisgICAgICB1YyA9IGJkLT5zeW1Ub0J5dGVbYmQtPm10ZlN5bWJvbFswXV07CisgICAgICBieXRlQ291bnRbdWNdICs9IGhoOworICAgICAgd2hpbGUgKGhoLS0pIGRidWZbZGJ1ZkNvdW50KytdID0gdWM7CisgICAgfQorCisgICAgLy8gSXMgdGhpcyB0aGUgdGVybWluYXRpbmcgc3ltYm9sPworICAgIGlmIChuZXh0U3ltPmJkLT5zeW1Ub3RhbCkgYnJlYWs7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgc3ltYm9sIHdlIGp1c3QgZGVjb2RlZCBpbmRpY2F0ZXMgYSBuZXcgbGl0ZXJhbAorICAgICAgIGNoYXJhY3Rlci4gU3VidHJhY3Qgb25lIHRvIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlIE1URiBhcnJheQorICAgICAgIGF0IHdoaWNoIHRoaXMgbGl0ZXJhbCBpcyBjdXJyZW50bHkgdG8gYmUgZm91bmQuIChOb3RlIHRoYXQgdGhlCisgICAgICAgcmVzdWx0IGNhbid0IGJlIC0xIG9yIDAsIGJlY2F1c2UgMCBhbmQgMSBhcmUgUlVOQSBhbmQgUlVOQi4KKyAgICAgICBBbm90aGVyIGluc3RhbmNlIG9mIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG10ZiBhcnJheSwgcG9zaXRpb24gMCwKKyAgICAgICB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhcyBwYXJ0IG9mIGEgcnVuLikgKi8KKyAgICBpZiAoZGJ1ZkNvdW50Pj1iZC0+ZGJ1ZlNpemUpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKyAgICBpaSA9IG5leHRTeW0gLSAxOworICAgIHVjID0gYmQtPm10ZlN5bWJvbFtpaV07CisgICAgLy8gT24gbXkgbGFwdG9wLCB1bnJvbGxpbmcgdGhpcyBtZW1tb3ZlKCkgaW50byBhIGxvb3Agc2hhdmVzIDMuNSUgb2ZmCisgICAgLy8gdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4KKyAgICB3aGlsZShpaS0tKSBiZC0+bXRmU3ltYm9sW2lpKzFdID0gYmQtPm10ZlN5bWJvbFtpaV07CisgICAgYmQtPm10ZlN5bWJvbFswXSA9IHVjOworICAgIHVjID0gYmQtPnN5bVRvQnl0ZVt1Y107CisKKyAgICAvLyBXZSBoYXZlIG91ciBsaXRlcmFsIGJ5dGUuICBTYXZlIGl0IGludG8gZGJ1Zi4KKyAgICBieXRlQ291bnRbdWNdKys7CisgICAgZGJ1ZltkYnVmQ291bnQrK10gPSAodW5zaWduZWQgaW50KXVjOworICB9CisKKyAgLy8gTm93IHdlIGtub3cgd2hhdCBkYnVmQ291bnQgaXMsIGRvIGEgYmV0dGVyIHNhbml0eSBjaGVjayBvbiBvcmlnUHRyLgorICBpZiAoYnctPm9yaWdQdHIgPj0gKGJ3LT53cml0ZUNvdW50ID0gZGJ1ZkNvdW50KSkgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisgIHJldHVybiAwOworfQorCisvLyBGbHVzaCBvdXRwdXQgYnVmZmVyIHRvIGRpc2sKK3N0YXRpYyB2b2lkIGZsdXNoX2J1bnppcF9vdXRidWYoc3RydWN0IGJ1bnppcF9kYXRhICpiZCwgaW50IG91dF9mZCkKK3sKKyAgaWYgKGJkLT5vdXRidWZQb3MpIHsKKyAgICBpZiAod3JpdGUob3V0X2ZkLCBiZC0+b3V0YnVmLCBiZC0+b3V0YnVmUG9zKSAhPSBiZC0+b3V0YnVmUG9zKQorICAgICAgZXJyb3JfZXhpdCgib3V0cHV0IEVPRiIpOworICAgIGJkLT5vdXRidWZQb3MgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ1cnJvd3Nfd2hlZWxlcl9wcmVwKHN0cnVjdCBidW56aXBfZGF0YSAqYmQsIHN0cnVjdCBid2RhdGEgKmJ3KQoreworICBpbnQgaWksIGpqOworICB1bnNpZ25lZCBpbnQgKmRidWYgPSBidy0+ZGJ1ZjsKKyAgaW50ICpieXRlQ291bnQgPSBidy0+Ynl0ZUNvdW50OworCisgIC8vIFR1cm4gYnl0ZUNvdW50IGludG8gY3VtdWxhdGl2ZSBvY2N1cnJlbmNlIGNvdW50cyBvZiAwIHRvIG4tMS4KKyAgamogPSAwOworICBmb3IgKGlpPTA7IGlpPDI1NjsgaWkrKykgeworICAgIGludCBrayA9IGpqICsgYnl0ZUNvdW50W2lpXTsKKyAgICBieXRlQ291bnRbaWldID0gamo7CisgICAgamogPSBrazsKKyAgfQorCisgIC8vIFVzZSBvY2N1cnJlbmNlIGNvdW50cyB0byBxdWlja2x5IGZpZ3VyZSBvdXQgd2hhdCBvcmRlciBkYnVmIHdvdWxkIGJlIGluCisgIC8vIGlmIHdlIHNvcnRlZCBpdC4KKyAgZm9yIChpaT0wOyBpaSA8IGJ3LT53cml0ZUNvdW50OyBpaSsrKSB7CisgICAgdW5zaWduZWQgY2hhciB1YyA9IGRidWZbaWldOworICAgIGRidWZbYnl0ZUNvdW50W3VjXV0gfD0gKGlpIDw8IDgpOworICAgIGJ5dGVDb3VudFt1Y10rKzsKKyAgfQorCisgIC8vIGJsb2NrUmFuZG9taXNlZCBzdXBwb3J0IHdvdWxkIGdvIGhlcmUuCisKKyAgLy8gVXNpbmcgaWkgYXMgcG9zaXRpb24sIGpqIGFzIHByZXZpb3VzIGNoYXJhY3RlciwgaGggYXMgY3VycmVudCBjaGFyYWN0ZXIsCisgIC8vIGFuZCB1YyBhcyBydW4gY291bnQuCisgIGJ3LT5kYXRhQ1JDID0gMHhmZmZmZmZmZkw7CisKKyAgLyogRGVjb2RlIGZpcnN0IGJ5dGUgYnkgaGFuZCB0byBpbml0aWFsaXplICJwcmV2aW91cyIgYnl0ZS4gTm90ZSB0aGF0IGl0CisgICAgIGRvZXNuJ3QgZ2V0IG91dHB1dCwgYW5kIGlmIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGFyZSBpZGVudGljYWwKKyAgICAgaXQgZG9lc24ndCBxdWFsaWZ5IGFzIGEgcnVuIChoZW5jZSB1Yz0yNTUsIHdoaWNoIHdpbGwgZWl0aGVyIHdyYXAKKyAgICAgdG8gMSBvciBnZXQgcmVzZXQpLiAqLworICBpZiAoYnctPndyaXRlQ291bnQpIHsKKyAgICBidy0+d3JpdGVQb3MgPSBkYnVmW2J3LT5vcmlnUHRyXTsKKyAgICBidy0+d3JpdGVDdXJyZW50ID0gKHVuc2lnbmVkIGNoYXIpYnctPndyaXRlUG9zOworICAgIGJ3LT53cml0ZVBvcyA+Pj0gODsKKyAgICBidy0+d3JpdGVSdW4gPSAtMTsKKyAgfQorfQorCisvLyBEZWNvbXByZXNzIGEgYmxvY2sgb2YgdGV4dCB0byBpbnRlcm1lZGlhdGUgYnVmZmVyCitzdGF0aWMgaW50IHJlYWRfYnVuemlwX2RhdGEoc3RydWN0IGJ1bnppcF9kYXRhICpiZCkKK3sKKyAgaW50IHJjID0gcmVhZF9ibG9ja19oZWFkZXIoYmQsIGJkLT5id2RhdGEpOworICBpZiAoIXJjKSByYz1yZWFkX2h1ZmZtYW5fZGF0YShiZCwgYmQtPmJ3ZGF0YSk7CisKKyAgLy8gRmlyc3QgdGhpbmcgdGhhdCBjYW4gYmUgZG9uZSBieSBhIGJhY2tncm91bmQgdGhyZWFkLgorICBidXJyb3dzX3doZWVsZXJfcHJlcChiZCwgYmQtPmJ3ZGF0YSk7CisKKyAgcmV0dXJuIHJjOworfQorCisvLyBVbmRvIGJ1cnJvd3Mtd2hlZWxlciB0cmFuc2Zvcm0gb24gaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byBwcm9kdWNlIG91dHB1dC4KKy8vIElmICFsZW4sIHdyaXRlIHVwIHRvIGxlbiBieXRlcyBvZiBkYXRhIHRvIGJ1Zi4gIE90aGVyd2lzZSB3cml0ZSB0byBvdXRfZmQuCisvLyBSZXR1cm5zIGxlbiA/IGJ5dGVzIHdyaXR0ZW4gOiAwLiAgTm90aWNlIGFsbCBlcnJvcnMgYXJlIG5lZ2F0aXZlICMncy4KKy8vCisvLyBCdXJyb3dzLXdoZWVsZXIgdHJhbnNmb3JtIGlzIGRlc2NyaWJlZCBhdDoKKy8vIGh0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvYnd0L2J3dC5odG0KKy8vIGh0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTYvMDkvMDEvYnd0LworCitzdGF0aWMgaW50IHdyaXRlX2J1bnppcF9kYXRhKHN0cnVjdCBidW56aXBfZGF0YSAqYmQsIHN0cnVjdCBid2RhdGEgKmJ3LAorICBpbnQgb3V0X2ZkLCBjaGFyICpvdXRidWYsIGludCBsZW4pCit7CisgIHVuc2lnbmVkIGludCAqZGJ1ZiA9IGJ3LT5kYnVmOworICBpbnQgY291bnQsIHBvcywgY3VycmVudCwgcnVuLCBjb3BpZXMsIG91dGJ5dGUsIHByZXZpb3VzLCBnb3Rjb3VudCA9IDA7CisKKyAgZm9yICg7OykgeworICAgIC8vIElmIGxhc3QgcmVhZCB3YXMgc2hvcnQgZHVlIHRvIGVuZCBvZiBmaWxlLCByZXR1cm4gbGFzdCBibG9jayBub3cKKyAgICBpZiAoYnctPndyaXRlQ291bnQgPCAwKSByZXR1cm4gYnctPndyaXRlQ291bnQ7CisKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlZmlsbCBkYnVmLCBkbyBpdC4KKyAgICBpZiAoIWJ3LT53cml0ZUNvdW50KSB7CisgICAgICBpbnQgaSA9IHJlYWRfYnVuemlwX2RhdGEoYmQpOworICAgICAgaWYgKGkpIHsKKyAgICAgICAgaWYgKGkgPT0gUkVUVkFMX0xBU1RfQkxPQ0spIHsKKyAgICAgICAgICBidy0+d3JpdGVDb3VudCA9IGk7CisgICAgICAgICAgcmV0dXJuIGdvdGNvdW50OworICAgICAgICB9IGVsc2UgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gbG9vcCBnZW5lcmF0aW5nIG91dHB1dAorICAgIGNvdW50ID0gYnctPndyaXRlQ291bnQ7CisgICAgcG9zID0gYnctPndyaXRlUG9zOworICAgIGN1cnJlbnQgPSBidy0+d3JpdGVDdXJyZW50OworICAgIHJ1biA9IGJ3LT53cml0ZVJ1bjsKKyAgICB3aGlsZSAoY291bnQpIHsKKworICAgICAgLy8gSWYgc29tZWJvZHkgKGxpa2UgdGFyKSB3YW50cyBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCisgICAgICAvLyBkYXRhIGZyb20gbWVtb3J5IGluc3RlYWQgb2Ygd3JpdHRlbiB0byBhIGZpbGUsIGh1bW9yIHRoZW0uCisgICAgICBpZiAobGVuICYmIGJkLT5vdXRidWZQb3MgPj0gbGVuKSBnb3RvIGRhdGF1c19pbnRlcnJ1cHR1czsKKyAgICAgIGNvdW50LS07CisKKyAgICAgIC8vIEZvbGxvdyBzZXF1ZW5jZSB2ZWN0b3IgdG8gdW5kbyBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtLgorICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgcG9zID0gZGJ1Zltwb3NdOworICAgICAgY3VycmVudCA9IHBvcyYweGZmOworICAgICAgcG9zID4+PSA4OworCisgICAgICAvLyBXaGVuZXZlciB3ZSBzZWUgMyBjb25zZWN1dGl2ZSBjb3BpZXMgb2YgdGhlIHNhbWUgYnl0ZSwKKyAgICAgIC8vIHRoZSA0dGggaXMgYSByZXBlYXQgY291bnQKKyAgICAgIGlmIChydW4rKyA9PSAzKSB7CisgICAgICAgIGNvcGllcyA9IGN1cnJlbnQ7CisgICAgICAgIG91dGJ5dGUgPSBwcmV2aW91czsKKyAgICAgICAgY3VycmVudCA9IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29waWVzID0gMTsKKyAgICAgICAgb3V0Ynl0ZSA9IGN1cnJlbnQ7CisgICAgICB9CisKKyAgICAgIC8vIE91dHB1dCBieXRlcyB0byBidWZmZXIsIGZsdXNoaW5nIHRvIGZpbGUgaWYgbmVjZXNzYXJ5CisgICAgICB3aGlsZSAoY29waWVzLS0pIHsKKyAgICAgICAgaWYgKGJkLT5vdXRidWZQb3MgPT0gSU9CVUZfU0laRSkgZmx1c2hfYnVuemlwX291dGJ1ZihiZCwgb3V0X2ZkKTsKKyAgICAgICAgYmQtPm91dGJ1ZltiZC0+b3V0YnVmUG9zKytdID0gb3V0Ynl0ZTsKKyAgICAgICAgYnctPmRhdGFDUkMgPSAoYnctPmRhdGFDUkMgPDwgOCkKKyAgICAgICAgICAgICAgICBeIGJkLT5jcmMzMlRhYmxlWyhidy0+ZGF0YUNSQyA+PiAyNCkgXiBvdXRieXRlXTsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSBydW49MDsKKyAgICB9CisKKyAgICAvLyBkZWNvbXByZXNzaW9uIG9mIHRoaXMgYmxvY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgIGJ3LT5kYXRhQ1JDID0gfihidy0+ZGF0YUNSQyk7CisgICAgYmQtPnRvdGFsQ1JDID0gKChiZC0+dG90YWxDUkMgPDwgMSkgfCAoYmQtPnRvdGFsQ1JDID4+IDMxKSkgXiBidy0+ZGF0YUNSQzsKKworICAgIC8vIGlmIHRoaXMgYmxvY2sgaGFkIGEgY3JjIGVycm9yLCBmb3JjZSBmaWxlIGxldmVsIGNyYyBlcnJvci4KKyAgICBpZiAoYnctPmRhdGFDUkMgIT0gYnctPmhlYWRlckNSQykgeworICAgICAgYmQtPnRvdGFsQ1JDID0gYnctPmhlYWRlckNSQysxOworCisgICAgICByZXR1cm4gUkVUVkFMX0xBU1RfQkxPQ0s7CisgICAgfQorZGF0YXVzX2ludGVycnVwdHVzOgorICAgIGJ3LT53cml0ZUNvdW50ID0gY291bnQ7CisgICAgaWYgKGxlbikgeworICAgICAgZ290Y291bnQgKz0gYmQtPm91dGJ1ZlBvczsKKyAgICAgIG1lbWNweShvdXRidWYsIGJkLT5vdXRidWYsIGxlbik7CisKKyAgICAgIC8vIElmIHdlIGdvdCBlbm91Z2ggZGF0YSwgY2hlY2twb2ludCBsb29wIHN0YXRlIGFuZCByZXR1cm4KKyAgICAgIGlmICgobGVuIC09IGJkLT5vdXRidWZQb3MpPDEpIHsKKyAgICAgICAgYmQtPm91dGJ1ZlBvcyAtPSBsZW47CisgICAgICAgIGlmIChiZC0+b3V0YnVmUG9zKSBtZW1tb3ZlKGJkLT5vdXRidWYsIGJkLT5vdXRidWYrbGVuLCBiZC0+b3V0YnVmUG9zKTsKKyAgICAgICAgYnctPndyaXRlUG9zID0gcG9zOworICAgICAgICBidy0+d3JpdGVDdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgYnctPndyaXRlUnVuID0gcnVuOworCisgICAgICAgIHJldHVybiBnb3Rjb3VudDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSwgcmVhZCBmaWxlIGhlYWRlci4gSWYgIWxlbiwgc3JjX2ZkIGNvbnRhaW5zCisvLyBmaWxlaGFuZGxlIHRvIHJlYWQgZnJvbS4gRWxzZSBpbmJ1ZiBjb250YWlucyBkYXRhLgorc3RhdGljIGludCBzdGFydF9idW56aXAoc3RydWN0IGJ1bnppcF9kYXRhICoqYmRwLCBpbnQgc3JjX2ZkLCBjaGFyICppbmJ1ZiwKKyAgaW50IGxlbikKK3sKKyAgc3RydWN0IGJ1bnppcF9kYXRhICpiZDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLy8gRmlndXJlIG91dCBob3cgbXVjaCBkYXRhIHRvIGFsbG9jYXRlLgorICBpID0gc2l6ZW9mKHN0cnVjdCBidW56aXBfZGF0YSk7CisgIGlmICghbGVuKSBpICs9IElPQlVGX1NJWkU7CisKKyAgLy8gQWxsb2NhdGUgYnVuemlwX2RhdGEuIE1vc3QgZmllbGRzIGluaXRpYWxpemUgdG8gemVyby4KKyAgYmQgPSAqYmRwID0geHphbGxvYyhpKTsKKyAgaWYgKGxlbikgeworICAgIGJkLT5pbmJ1ZiA9IGluYnVmOworICAgIGJkLT5pbmJ1ZkNvdW50ID0gbGVuOworICAgIGJkLT5pbl9mZCA9IC0xOworICB9IGVsc2UgeworICAgIGJkLT5pbmJ1ZiA9IChjaGFyICopKGJkKzEpOworICAgIGJkLT5pbl9mZCA9IHNyY19mZDsKKyAgfQorCisgIGNyY19pbml0KGJkLT5jcmMzMlRhYmxlLCAwKTsKKworICAvLyBFbnN1cmUgdGhhdCBmaWxlIHN0YXJ0cyB3aXRoICJCWmgiLgorICBmb3IgKGk9MDtpPDM7aSsrKSBpZiAoZ2V0X2JpdHMoYmQsOCkhPSJCWmgiW2ldKSByZXR1cm4gUkVUVkFMX05PVF9CWklQX0RBVEE7CisKKyAgLy8gTmV4dCBieXRlIGFzY2lpICcxJy0nOScsIGluZGljYXRlcyBibG9jayBzaXplIGluIHVuaXRzIG9mIDEwMGsgb2YKKyAgLy8gdW5jb21wcmVzc2VkIGRhdGEuIEFsbG9jYXRlIGludGVybWVkaWF0ZSBidWZmZXIgZm9yIGJsb2NrLgorICBpID0gZ2V0X2JpdHMoYmQsIDgpOworICBpZiAoaTwnMScgfHwgaT4nOScpIHJldHVybiBSRVRWQUxfTk9UX0JaSVBfREFUQTsKKyAgYmQtPmRidWZTaXplID0gMTAwMDAwKihpLScwJykqVEhSRUFEUzsKKyAgZm9yIChpPTA7IGk8VEhSRUFEUzsgaSsrKQorICAgIGJkLT5id2RhdGFbaV0uZGJ1ZiA9IHhtYWxsb2MoYmQtPmRidWZTaXplICogc2l6ZW9mKGludCkpOworCisgIHJldHVybiAwOworfQorCisvLyBFeGFtcGxlIHVzYWdlOiBkZWNvbXByZXNzIHNyY19mZCB0byBkc3RfZmQuIChTdG9wcyBhdCBlbmQgb2YgYnppcCBkYXRhLAorLy8gbm90IGVuZCBvZiBmaWxlLikKK3N0YXRpYyBjaGFyICpidW56aXBTdHJlYW0oaW50IHNyY19mZCwgaW50IGRzdF9mZCkKK3sKKyAgc3RydWN0IGJ1bnppcF9kYXRhICpiZDsKKyAgY2hhciAqYnVuemlwX2Vycm9yc1tdID0gezAsICJub3QgYnppcCIsICJiYWQgZGF0YSIsICJvbGQgZm9ybWF0In07CisgIGludCBpLCBqOworCisgIGlmICghKGkgPSBzdGFydF9idW56aXAoJmJkLHNyY19mZCwgMCwgMCkpKSB7CisgICAgaSA9IHdyaXRlX2J1bnppcF9kYXRhKGJkLGJkLT5id2RhdGEsIGRzdF9mZCwgMCwgMCk7CisgICAgaWYgKGk9PVJFVFZBTF9MQVNUX0JMT0NLKSB7CisgICAgICBpZiAoYmQtPmJ3ZGF0YVswXS5oZWFkZXJDUkM9PWJkLT50b3RhbENSQykgaSA9IDA7CisgICAgICBlbHNlIGkgPSBSRVRWQUxfREFUQV9FUlJPUjsKKyAgICB9CisgIH0KKyAgZmx1c2hfYnVuemlwX291dGJ1ZihiZCwgZHN0X2ZkKTsKKworICBmb3IgKGo9MDsgajxUSFJFQURTOyBqKyspIGZyZWUoYmQtPmJ3ZGF0YVtqXS5kYnVmKTsKKyAgZnJlZShiZCk7CisKKyAgcmV0dXJuIGJ1bnppcF9lcnJvcnNbLWldOworfQorCitzdGF0aWMgdm9pZCBkb19iemNhdChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKmVyciA9IGJ1bnppcFN0cmVhbShmZCwgMSk7CisKKyAgaWYgKGVycikgZXJyb3JfZXhpdF9yYXcoZXJyKTsKK30KKwordm9pZCBiemNhdF9tYWluKHZvaWQpCit7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX2J6Y2F0KTsKK30KKworc3RhdGljIHZvaWQgZG9fYnVuemlwMihpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGludCBvdXRmZCA9IDEsIHJlbmFtZSA9IDAsIGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgY2hhciAqdG1wLCAqZXJyLCAqZG90YnogPSAwOworCisgIC8vIFRyaW0gb2ZmIC5ieiBvciAuYnoyIGV4dGVuc2lvbgorICBkb3RieiA9IG5hbWUrbGVuLTM7CisgIGlmICgobGVuPjMgJiYgIXN0cmNtcChkb3RieiwgIi5ieiIpKSB8fCAobGVuPjQgJiYgIXN0cmNtcCgtLWRvdGJ6LCAiLmJ6MiIpKSkKKyAgICBkb3RieiA9IDA7CisKKyAgLy8gRm9yIC0gbm8gcmVwbGFjZQorICBpZiAodG95cy5vcHRmbGFncyZGTEFHX3QpIG91dGZkID0geG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKTsKKyAgZWxzZSBpZiAoKGZkIHx8IHN0cmNtcChuYW1lLCAiLSIpKSAmJiAhKHRveXMub3B0ZmxhZ3MmRkxBR19jKSkgeworICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfaykgeworICAgICAgaWYgKCFkb3RieiB8fCAhYWNjZXNzKG5hbWUsIFhfT0spKSB7CisgICAgICAgIGVycm9yX21zZygiJXMgZXhpc3RzIiwgbmFtZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBvdXRmZCA9IGNvcHlfdGVtcGZpbGUoZmQsIG5hbWUsICZ0bXApOworICAgIHJlbmFtZSsrOworICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR192KSBwcmludGYoIiVzOiIsIG5hbWUpOworICBlcnIgPSBidW56aXBTdHJlYW0oZmQsIG91dGZkKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR192KSB7CisgICAgcHJpbnRmKCIlc1xuIiwgZXJyID8gZXJyIDogIm9rIik7CisgICAgdG95cy5leGl0dmFsIHw9ICEhZXJyOworICB9IGVsc2UgaWYgKGVycikgZXJyb3JfbXNnX3JhdyhlcnIpOworCisgIC8vIGNhbid0IHRlc3Qgb3V0ZmQ9PTEgYmVjYXVzZSBtYXkgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoIHN0ZGluK3N0ZG91dCBjbG9zZWQKKyAgaWYgKHJlbmFtZSkgeworICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfaykgeworICAgICAgZnJlZSh0bXApOworICAgICAgdG1wID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRvdGJ6KSAqZG90YnogPSAnLic7CisgICAgICBpZiAoIXVubGluayhuYW1lKSkgcGVycm9yX21zZ19yYXcobmFtZSk7CisgICAgfQorICAgIChlcnIgPyBkZWxldGVfdGVtcGZpbGUgOiByZXBsYWNlX3RlbXBmaWxlKSgtMSwgb3V0ZmQsICZ0bXApOworICB9Cit9CisKK3ZvaWQgYnVuemlwMl9tYWluKHZvaWQpCit7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX2J1bnppcDIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvY2hjb24uYyBiL3RveWJveC90b3lzL290aGVyL2NoY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiZGQxMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2NoY29uLmMKQEAgLTAsMCArMSw0NCBAQAorLyogY2hjb24uYyAtIENoYW5nZSBmaWxlIHNlY3VyaXR5IGNvbnRleHQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK1VTRV9DSENPTihORVdUT1koY2hjb24sICI8Mmh2UiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIENIQ09OCisgIGJvb2wgImNoY29uIgorICBkZXBlbmRzIG9uIFRPWUJPWF9TRUxJTlVYCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNoY29uIFstaFJ2XSBDT05URVhUIEZJTEUuLi4KKworICAgIENoYW5nZSB0aGUgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IG9mIGxpc3RlZCBmaWxlW3NdLgorCisgICAgLWggY2hhbmdlIHN5bWxpbmtzIGluc3RlYWQgb2Ygd2hhdCB0aGV5IHBvaW50IHRvLgorICAgIC1SIHJlY3Vyc2UgaW50byBzdWJkaXJlY3Rvcmllcy4KKyAgICAtdiB2ZXJib3NlIG91dHB1dC4KKyovCisKKyNkZWZpbmUgRk9SX2NoY29uCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgaW50IGRvX2NoY29uKHN0cnVjdCBkaXJ0cmVlICp0cnkpCit7CisgIGNoYXIgKnBhdGgsICpjb24gPSAqdG95cy5vcHRhcmdzOworCisgIGlmICghZGlydHJlZV9ub3Rkb3Rkb3QodHJ5KSkgcmV0dXJuIDA7CisKKyAgcGF0aCA9IGRpcnRyZWVfcGF0aCh0cnksIDApOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgcHJpbnRmKCJjaGNvbiAnJXMnIHRvICVzXG4iLCBwYXRoLCBjb24pOworICBpZiAoLTEgPT0gKCh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSA/IGxzZXRmaWxlY29uIDogc2V0ZmlsZWNvbikocGF0aCwgY29uKSkKKyAgICBwZXJyb3JfbXNnKCInJXMnIHRvICVzIiwgcGF0aCwgY29uKTsKKyAgZnJlZShwYXRoKTsKKworICByZXR1cm4gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1IpKkRJUlRSRUVfUkVDVVJTRTsKK30KKwordm9pZCBjaGNvbl9tYWluKHZvaWQpCit7CisgIGNoYXIgKipmaWxlOworCisgIGZvciAoZmlsZSA9IHRveXMub3B0YXJncysxOyAqZmlsZTsgZmlsZSsrKSBkaXJ0cmVlX3JlYWQoKmZpbGUsIGRvX2NoY29uKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2Nocm9vdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvY2hyb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlZjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2Nocm9vdC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIGNocm9vdC5jIC0gUnVuIGNvbW1hbmQgaW4gbmV3IHJvb3QgZGlyZWN0b3J5LgorICoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogVE9ETzogVGhlIHRlc3QgZm9yIHJvb3QgaXMgIj09IiBzbyByb290IGNhbiB0cml2aWFsbHkgZXNjYXBlIGEgY2hyb290IGJ5CisgKiBtb3ZpbmcgaXQgYmVsb3cgY3dkLCBhbGEgbWtkaXIoInN1YiIpOyBjaHJvb3QoInN1YiIpOyBjaGRpcigiLi4vLi4vLi4vLi4iKQorICogVGhlIGNvbnRhaW5lciBndXlzIHVzZSBwaXZvdF9yb290KCkgdG8gZGVhbCB3aXRoIHRoaXMsIHdoaWNoIGRvZXMgYWN0dWFsbHkKKyAqIGVkaXQgbW91bnQgdHJlZS4gKE5ldyBvcHRpb24/IEtlcm5lbCBwYXRjaD8pCisKK1VTRV9DSFJPT1QoTkVXVE9ZKGNocm9vdCwgIl48MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBDSFJPT1QKKyAgYm9vbCAiY2hyb290IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBjaHJvb3QgTkVXUEFUSCBbY29tbWFuZGxpbmUuLi5dCisKKyAgICBSdW4gY29tbWFuZCB3aXRoaW4gYSBuZXcgcm9vdCBkaXJlY3RvcnkuIElmIG5vIGNvbW1hbmQsIHJ1biAvYmluL3NoLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBjaHJvb3RfbWFpbih2b2lkKQoreworICBjaGFyICpiaW5zaFtdID0geyIvYmluL3NoIiwgIi1pIiwgMH07CisKKyAgaWYgKGNoZGlyKCp0b3lzLm9wdGFyZ3MpIHx8IGNocm9vdCgiLiIpKSBwZXJyb3JfZXhpdF9yYXcoKnRveXMub3B0YXJncyk7CisgIGlmICh0b3lzLm9wdGFyZ3NbMV0pIHhleGVjKHRveXMub3B0YXJncysxKTsKKyAgZWxzZSB4ZXhlYyhiaW5zaCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9jaHZ0LmMgYi90b3lib3gvdG95cy9vdGhlci9jaHZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzMzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2NodnQuYwpAQCAtMCwwICsxLDM0IEBACisvKiBjaHZ0LmMgLSBzd2l0Y2ggdmlydHVhbCB0ZXJtaW5hbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgQW5kZXJzIDxkYW5kZXJzQGFtbHRkLmNvbT4KKworVVNFX0NIVlQoTkVXVE9ZKGNodnQsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIENIVlQKKyAgYm9vbCAiY2h2dCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogY2h2dCBOCisKKyAgICBDaGFuZ2UgdG8gdmlydHVhbCB0ZXJtaW5hbCBudW1iZXIgTi4gKFRoaXMgb25seSB3b3JrcyBpbiB0ZXh0IG1vZGUuKQorCisgICAgVmlydHVhbCB0ZXJtaW5hbHMgYXJlIHRoZSBMaW51eCBWR0EgdGV4dCBtb2RlIGRpc3BsYXlzLCBvcmRpbmFyaWx5CisgICAgc3dpdGNoZWQgYmV0d2VlbiB2aWEgYWx0LUYxLCBhbHQtRjIsIGV0Yy4gVXNlIGN0cmwtYWx0LUYxIHRvIHN3aXRjaAorICAgIGZyb20gWCB0byBhIHZpcnR1YWwgdGVybWluYWwsIGFuZCBhbHQtRjYgKG9yIEY3LCBvciBGOCkgdG8gZ2V0IGJhY2suCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIGNodnRfbWFpbih2b2lkKQoreworICBpbnQgdnRudW0sIGZkID0gZmQ7CisgIGNoYXIgKmNvbnNvbGVzW109eyIvZGV2L2NvbnNvbGUiLCAiL2Rldi92Yy8wIiwgIi9kZXYvdHR5IiwgTlVMTH0sICoqY2M7CisKKyAgdnRudW09YXRvaSgqdG95cy5vcHRhcmdzKTsKKyAgZm9yIChjYyA9IGNvbnNvbGVzOyAqY2M7IGNjKyspCisgICAgaWYgKC0xICE9IChmZCA9IG9wZW4oKmNjLCBPX1JEV1IpKSkgYnJlYWs7CisKKyAgLy8gVGhlc2UgbnVtYmVycyBhcmUgVlRfQUNUSVZBVEUgYW5kIFZUX1dBSVRBQ1RJVkUgZnJvbSBsaW51eC92dC5oCisgIGlmICghKmNjIHx8IGZkIDwgMCB8fCBpb2N0bChmZCwgMHg1NjA2LCB2dG51bSkgfHwgaW9jdGwoZmQsIDB4NTYwNywgdnRudW0pKQorICAgIHBlcnJvcl9leGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvY2xlYXIuYyBiL3RveWJveC90b3lzL290aGVyL2NsZWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2MWVhOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2NsZWFyLmMKQEAgLTAsMCArMSwxOSBAQAorLyogY2xlYXIuYyAtIGNsZWFyIHRoZSBzY3JlZW4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitVU0VfQ0xFQVIoTkVXVE9ZKGNsZWFyLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBDTEVBUgorICBib29sICJjbGVhciIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICBDbGVhciB0aGUgc2NyZWVuLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBjbGVhcl9tYWluKHZvaWQpCit7CisgIHh3cml0ZSgxLCAiXGVbMkpcZVtIIiwgNyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9jb3VudC5jIGIvdG95Ym94L3RveXMvb3RoZXIvY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I2ZjgyCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvY291bnQuYwpAQCAtMCwwICsxLDMyIEBACisvKiBjb3VudC5jIC0gUHJvZ3Jlc3MgaW5kaWNhdG9yIGZyb20gc3RkaW4gdG8gc3Rkb3V0CisgKgorICogQ29weXJpZ2h0IDIwMDIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworVVNFX0NPVU5UKE5FV1RPWShjb3VudCwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgQ09VTlQKKyAgYm9vbCAiY291bnQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNvdW50CisKKyAgICBDb3B5IHN0ZGluIHRvIHN0ZG91dCwgZGlzcGxheWluZyBzaW1wbGUgcHJvZ3Jlc3MgaW5kaWNhdG9yIHRvIHN0ZGVyci4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgY291bnRfbWFpbih2b2lkKQoreworICB1aW50NjRfdCBzaXplID0gMDsKKyAgaW50IGxlbjsKKyAgY2hhciBidWZbMzJdOworCisgIGZvciAoOzspIHsKKyAgICBsZW4gPSB4cmVhZCgwLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAoIWxlbikgYnJlYWs7CisgICAgc2l6ZSArPSBsZW47CisgICAgeHdyaXRlKDEsIHRveWJ1ZiwgbGVuKTsKKyAgICB4d3JpdGUoMiwgYnVmLCBzcHJpbnRmKGJ1ZiwgIiUiUFJJdTY0IiBieXRlc1xyIiwgc2l6ZSkpOworICB9CisgIHh3cml0ZSgyLCAiXG4iLCAxKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2RvczJ1bml4LmMgYi90b3lib3gvdG95cy9vdGhlci9kb3MydW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2E4MTQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9kb3MydW5peC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIGRvczJ1bml4LmMgLSBjb252ZXJ0IG5ld2xpbmUgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworVVNFX0RPUzJVTklYKE5FV1RPWShkb3MydW5peCwgMCwgVE9ZRkxBR19CSU4pKQorVVNFX1VOSVgyRE9TKE5FV1RPWSh1bml4MmRvcywgMCwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgRE9TMlVOSVgKKyAgYm9vbCAiZG9zMnVuaXgvdW5peDJkb3MiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGRvczJ1bml4IFtGSUxFLi4uXQorCisgICAgQ29udmVydCBuZXdsaW5lIGZvcm1hdCBmcm9tIGRvcyAiXHJcbiIgdG8gdW5peCAiXG4iLgorICAgIElmIG5vIGZpbGVzIGxpc3RlZCBjb3B5IGZyb20gc3RkaW4sICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLgorCitjb25maWcgVU5JWDJET1MKKyAgYm9vbCAidW5peDJkb3MiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHVuaXgyZG9zIFtGSUxFLi4uXQorCisgICAgQ29udmVydCBuZXdsaW5lIGZvcm1hdCBmcm9tIHVuaXggIlxuIiB0byBkb3MgIlxyXG4iLgorICAgIElmIG5vIGZpbGVzIGxpc3RlZCBjb3B5IGZyb20gc3RkaW4sICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLgorKi8KKworI2RlZmluZSBGT1JfZG9zMnVuaXgKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnRlbXBmaWxlOworKQorCitzdGF0aWMgdm9pZCBkb19kb3MydW5peChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgYyA9IHRveXMud2hpY2gtPm5hbWVbMF07CisgIGludCBvdXRmZCA9IDEsIGNhdGNoID0gMDsKKworICBpZiAoZmQpIG91dGZkID0gY29weV90ZW1wZmlsZShmZCwgbmFtZSwgJlRULnRlbXBmaWxlKTsKKworICBmb3IgKDs7KSB7CisgICAgaW50IGxlbiwgaW4sIG91dDsKKworICAgIGxlbiA9IHJlYWQoZmQsIHRveWJ1Zisoc2l6ZW9mKHRveWJ1ZikvMiksIHNpemVvZih0b3lidWYpLzIpOworICAgIGlmIChsZW48MCkgcGVycm9yX21zZ19yYXcobmFtZSk7CisgICAgaWYgKGxlbjwxKSBicmVhazsKKworICAgIGZvciAoaW4gPSBvdXQgPSAwOyBpbiA8IGxlbjsgaW4rKykgeworICAgICAgY2hhciB4ID0gdG95YnVmW2luK3NpemVvZih0b3lidWYpLzJdOworCisgICAgICAvLyBEcm9wIFxyIG9ubHkgaWYgZm9sbG93ZWQgYnkgXG4gaW4gZG9zMnVuaXggbW9kZQorICAgICAgaWYgKGNhdGNoKSB7CisgICAgICAgIGlmIChjID09ICd1JyB8fCB4ICE9ICdcbicpIHRveWJ1ZltvdXQrK10gPSAnXHInOworICAgICAgICBjYXRjaCA9IDA7CisgICAgICAvLyBBZGQgXHIgb25seSBpZiBcbiBub3QgYWZ0ZXIgXHIgaW4gdW5peDJkb3MgbW9kZQorICAgICAgfSBlbHNlIGlmIChjID09ICd1JyAmJiB4ID09ICdcbicpIHRveWJ1ZltvdXQrK10gPSAnXHInOworCisgICAgICBpZiAoeCA9PSAnXHInKSBjYXRjaCsrOworICAgICAgZWxzZSB0b3lidWZbb3V0KytdID0geDsKKyAgICB9CisgICAgeHdyaXRlKG91dGZkLCB0b3lidWYsIG91dCk7CisgIH0KKyAgaWYgKGNhdGNoKSB4d3JpdGUob3V0ZmQsICJcciIsIDEpOworCisgIGlmIChmZCkgcmVwbGFjZV90ZW1wZmlsZSgtMSwgb3V0ZmQsICZUVC50ZW1wZmlsZSk7Cit9CisKK3ZvaWQgZG9zMnVuaXhfbWFpbih2b2lkKQoreworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19kb3MydW5peCk7Cit9CisKK3ZvaWQgdW5peDJkb3NfbWFpbih2b2lkKQoreworICBkb3MydW5peF9tYWluKCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9lamVjdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvZWplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWVhYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvZWplY3QuYwpAQCAtMCwwICsxLDc4IEBACisvKiBlamVjdC5jIC0gZWplY3QgZGV2aWNlLgorICoKKyAqIENvcHlyaWdodCAyMDEyIEhhcnZpbmQgU2luZ2ggPGhhcnZpbmRzaW5naDE5ODFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnYW1pbC5jb20+CisgKgorICogTm8gc3RhbmRhcmQuCisKK1VTRV9FSkVDVChORVdUT1koZWplY3QsICI+MXN0VFshdFRdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRUpFQ1QKKyAgYm9vbCAiZWplY3QiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGVqZWN0IFstc3RUXSBbREVWSUNFXQorCisgICAgRWplY3QgREVWSUNFIG9yIGRlZmF1bHQgL2Rldi9jZHJvbQorCisgICAgLXMJU0NTSSBkZXZpY2UKKyAgICAtdAlDbG9zZSB0cmF5CisgICAgLVQJT3Blbi9jbG9zZSB0cmF5ICh0b2dnbGUpLgorKi8KKworI2RlZmluZSBGT1JfZWplY3QKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8c2NzaS9zZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisvLyBUaGUgU0NTSSB3YXkgb2YgcmVxdWVzdGluZyBlamVjdAorc3RhdGljIHZvaWQgcmVtb3ZlX3Njc2koaW50IGZkKQoreworICB1bnNpZ25lZCBpOworICBzZ19pb19oZHJfdCAqaGVhZGVyID0gKHNnX2lvX2hkcl90ICopKHRveWJ1Zis2NCk7CisgIGNoYXIgc2dfZHJpdmVyX2NtZFszXVs2XSA9IHsKKyAgICB7IEFMTE9XX01FRElVTV9SRU1PVkFMLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyBTVEFSVF9TVE9QLCAwLCAwLCAwLCAxLCAwIH0sIC8vc3RhcnQgdGhlIG1vdG9yCisgICAgeyBTVEFSVF9TVE9QLCAwLCAwLCAwLCAyLCAwIH0gLy9lamVjdCB0aGUgbWVkaWEKKyAgfTsKKworICBoZWFkZXItPmludGVyZmFjZV9pZCA9ICdTJzsKKyAgaGVhZGVyLT5jbWRfbGVuID0gNjsKKyAgaGVhZGVyLT5teF9zYl9sZW4gPSAzMjsKKyAgaGVhZGVyLT5keGZlcl9kaXJlY3Rpb24gPSBTR19EWEZFUl9OT05FOworICBoZWFkZXItPmR4ZmVycCA9IHRveWJ1ZiArIDMyOworICBoZWFkZXItPnNicCA9ICh2b2lkICopdG95YnVmOworICBoZWFkZXItPnRpbWVvdXQgPSAyMDAwOworCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBoZWFkZXItPmNtZHAgPSAodm9pZCAqKXNnX2RyaXZlcl9jbWRbaV07CisgICAgeGlvY3RsKGZkLCBTR19JTywgKHZvaWQgKiloZWFkZXIpOworICB9CisKKyAgLy8gZm9yY2Uga2VybmVsIHRvIHJlcmVhZCBwYXJ0aXRpb24gdGFibGUgd2hlbiBuZXcgZGlzYyBpcyBpbnNlcnRlZAorICBpb2N0bChmZCwgQkxLUlJQQVJUKTsKK30KKworLyoKKyAqIGVqZWN0IG1haW4gZnVuY3Rpb24uCisgKi8KK3ZvaWQgZWplY3RfbWFpbih2b2lkKQoreworICBpbnQgZmQsIG91dCA9IDA7CisgIGNoYXIgKmRldmljZV9uYW1lID0gIi9kZXYvY2Ryb20iOworCisgIGlmICgqdG95cy5vcHRhcmdzKSBkZXZpY2VfbmFtZSA9ICp0b3lzLm9wdGFyZ3M7CisKKyAgZmQgPSB4b3BlbihkZXZpY2VfbmFtZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKyAgaWYgKCF0b3lzLm9wdGZsYWdzKSB4aW9jdGwoZmQsIDB4NTMwOSwgJm91dCk7CQkvLyBDRFJPTV9FSkVDVAorICBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSByZW1vdmVfc2NzaShmZCk7CisgIGVsc2UgeworICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfVCkgfHwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3QpKSB7CisgICAgICBpbnQgcmMgPSBpb2N0bChmZCwgMHg1MzI2LCAmb3V0KTsJCQkvLyBDRFJPTV9EUklWRV9TVEFUVVMKKyAgICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgfHwgcmMgPT0gMikJCS8vIENEU19UUkFZX09QRU4KKyAgICAgICAgeGlvY3RsKGZkLCAweDUzMTksICZvdXQpOwkJCS8vIENEUk9NX0NMT1NFX1RSQVkKKyAgICAgIGVsc2UgeGlvY3RsKGZkLCAweDUzMDksICZvdXQpOwkJCS8vIENEUk9NX0VKRUNUCisgICAgfQorICB9CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHhjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9mYWN0b3IuYyBiL3RveWJveC90b3lzL290aGVyL2ZhY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDdkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9mYWN0b3IuYwpAQCAtMCwwICsxLDg2IEBACisvKiBmYWN0b3IuYyAtIEZhY3RvciBpbnRlZ2VycworICoKKyAqIENvcHlyaWdodCAyMDE0IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm8gc3RhbmRhcmQsIGJ1dCBpdCdzIGluIGNvcmV1dGlscworCitVU0VfRkFDVE9SKE5FV1RPWShmYWN0b3IsIDAsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEZBQ1RPUgorICBib29sICJmYWN0b3IiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGZhY3RvciBOVU1CRVIuLi4KKworICAgIEZhY3RvciBpbnRlZ2Vycy4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0YXRpYyB2b2lkIGZhY3RvcihjaGFyICpzKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgbCwgbGw7CisKKyAgZm9yICg7OykgeworICAgIGNoYXIgKmVyciA9IHM7CisgICAgaW50IGRhc2ggPSAwOworCisgICAgd2hpbGUoaXNzcGFjZSgqcykpIHMrKzsKKyAgICBpZiAoKnM9PSctJykgZGFzaCA9ICpzKys7CisgICAgaWYgKCEqcykgcmV0dXJuOworCisgICAgbCA9IHN0cnRvdWxsKHMsICZzLCAwKTsKKyAgICBpZiAoKnMgJiYgIWlzc3BhY2UoKnMpKSB7CisgICAgICBlcnJvcl9tc2coIiVzOiBub3QgaW50ZWdlciIsIGVycik7CisgICAgICB3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwcmludGYoIi0lbGx1OiIrIWRhc2gsIGwpOworCisgICAgLy8gTmVnYXRpdmUgbnVtYmVycyBoYXZlIC0xIGFzIGEgZmFjdG9yCisgICAgaWYgKGRhc2gpIHByaW50ZigiIC0xIik7CisKKyAgICAvLyBOb3RoaW5nIGJlbG93IDQgaGFzIGZhY3RvcnMKKyAgICBpZiAobCA8IDQpIHsKKyAgICAgIHByaW50ZigiICVsbHVcbiIsIGwpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gU3BlY2lhbCBjYXNlIGZhY3RvcnMgb2YgMgorICAgIHdoaWxlIChsICYmICEobCYxKSkgeworICAgICAgcHJpbnRmKCIgMiIpOworICAgICAgbCA+Pj0gMTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IG9kZCBudW1iZXJzIHVudGlsIHNxdWFyZSBpcyA+IHJlbWFpbmRlciBvciBpbnRlZ2VyIHdyYXAuCisgICAgZm9yIChsbD0zOyA7bGwgKz0gMikgeworICAgICAgbG9uZyBsbGwgPSBsbCpsbDsKKworICAgICAgaWYgKGxsbD5sIHx8IGxsbDxsbCkgeworICAgICAgICBpZiAobD4xKSBwcmludGYoIiAlbGx1IiwgbCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgd2hpbGUgKCEobCVsbCkpIHsKKyAgICAgICAgcHJpbnRmKCIgJWxsdSIsIGxsKTsKKyAgICAgICAgbCAvPSBsbDsKKyAgICAgIH0KKyAgICB9CisgICAgeHB1dGMoJ1xuJyk7CisgIH0KK30KKwordm9pZCBmYWN0b3JfbWFpbih2b2lkKQoreworICBpZiAodG95cy5vcHRjKSB7CisgICAgY2hhciAqKnNzOworCisgICAgZm9yIChzcyA9IHRveXMub3B0YXJnczsgKnNzOyBzcysrKSBmYWN0b3IoKnNzKTsKKyAgfSBlbHNlIGZvciAoOzspIHsKKyAgICBjaGFyICpzID0gMDsKKyAgICBzaXplX3QgbGVuID0gMDsKKworICAgIGlmICgtMSA9PSBnZXRsaW5lKCZzLCAmbGVuLCBzdGRpbikpIGJyZWFrOworICAgIGZhY3RvcihzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvZmFsbG9jYXRlLmMgYi90b3lib3gvdG95cy9vdGhlci9mYWxsb2NhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTIyNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvZmFsbG9jYXRlLmMKQEAgLTAsMCArMSwzMSBAQAorLyogZmFsbG9jYXRlLmMgLSBQcmVhbGxvY2F0ZSBzcGFjZSB0byBhIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBGZWxpeCBKYW5kYSA8ZmVsaXguamFuZGFAcG9zdGVvLmRlPgorICoKKyAqIE5vIHN0YW5kYXJkCisKK1VTRV9GQUxMT0NBVEUoTkVXVE9ZKGZhbGxvY2F0ZSwgIj4xbCN8IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRkFMTE9DQVRFCisgIGJvb2wgImZhbGxvY2F0ZSIKKyAgZGVwZW5kcyBvbiBUT1lCT1hfRkFMTE9DQVRFCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGZhbGxvY2F0ZSBbLWwgc2l6ZV0gZmlsZQorCisgICAgVGVsbCB0aGUgZmlsZXN5c3RlbSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBmaWxlLgorKi8KKworI2RlZmluZSBGT1JfZmFsbG9jYXRlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBsb25nIHNpemU7CispCisKK3ZvaWQgZmFsbG9jYXRlX21haW4odm9pZCkKK3sKKyAgaW50IGZkID0geGNyZWF0ZSgqdG95cy5vcHRhcmdzLCBPX1JEV1IgfCBPX0NSRUFULCAwNjQ0KTsKKyAgaWYgKHBvc2l4X2ZhbGxvY2F0ZShmZCwgMCwgVFQuc2l6ZSkpIGVycm9yX2V4aXQoIk5vdCBlbm91Z2ggc3BhY2UiKTsKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgY2xvc2UoZmQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvZmxvY2suYyBiL3RveWJveC90b3lzL290aGVyL2Zsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwMTkwYQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2Zsb2NrLmMKQEAgLTAsMCArMSwzOSBAQAorLyogZmxvY2suYyAtIG1hbmFnZSBhZHZpc29yeSBmaWxlIGxvY2tzCisgKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitVU0VfRkxPQ0soTkVXVE9ZKGZsb2NrLCAiPDE+MW5zdXhbLXN1eF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBGTE9DSworICBib29sICJmbG9jayIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZmxvY2sgWy1zeHVuXSBmZAorCisgICAgTWFuYWdlIGFkdmlzb3J5IGZpbGUgbG9ja3MuCisKKyAgICAtcwlTaGFyZWQgbG9jay4KKyAgICAteAlFeGNsdXNpdmUgbG9jayAoZGVmYXVsdCkuCisgICAgLXUJVW5sb2NrLgorICAgIC1uCU5vbi1ibG9ja2luZzogZmFpbCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgbG9jay4KKyovCisKKyNkZWZpbmUgRk9SX2Zsb2NrCisjaW5jbHVkZSAidG95cy5oIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKwordm9pZCBmbG9ja19tYWluKHZvaWQpCit7CisgIGludCBmZCA9IHhzdHJ0b2woKnRveXMub3B0YXJncywgTlVMTCwgMTApLCBvcDsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgb3AgPSBMT0NLX1VOOworICBlbHNlIG9wID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpID8gTE9DS19TSCA6IExPQ0tfRVg7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pIG9wIHw9IExPQ0tfTkI7CisKKyAgaWYgKGZsb2NrKGZkLCBvcCkpIHsKKyAgICBpZiAoKG9wICYgTE9DS19OQikgJiYgZXJybm8gPT0gRUFHQUlOKSB0b3lzLmV4aXR2YWwgPSAxOworICAgIGVsc2UgcGVycm9yX2V4aXQoImZsb2NrIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2ZyZWUuYyBiL3RveWJveC90b3lzL290aGVyL2ZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTRkNjliCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvZnJlZS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIGZyZWUuYyAtIERpc3BsYXkgYW1vdW50IG9mIGZyZWUgYW5kIHVzZWQgbWVtb3J5IGluIHRoZSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKworLy8gRmxhZyBvcmRlciBpcyBzaWduaWZjYW50OiBiLXQgYXJlIHVuaXRzIGluIG9yZGVyLCBGTEFHX2gtMSBpcyB1bml0IG1hc2sKK1VTRV9GUkVFKE5FV1RPWShmcmVlLCAiaHRnbWtiWyFodGdta2JdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRlJFRQorICBib29sICJmcmVlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBmcmVlIFstYmttZ3RdCisKKyAgICBEaXNwbGF5IHRoZSB0b3RhbCwgZnJlZSBhbmQgdXNlZCBhbW91bnQgb2YgcGh5c2ljYWwgbWVtb3J5IGFuZCBzd2FwIHNwYWNlLgorCisgICAgLWJrbWd0CU91dHB1dCB1bml0cyAoZGVmYXVsdCBpcyBieXRlcykKKyAgICAtaAlIdW1hbiByZWFkYWJsZQorKi8KKworI2RlZmluZSBGT1JfZnJlZQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgdW5zaWduZWQgYml0czsKKyAgdW5zaWduZWQgbG9uZyBsb25nIHVuaXRzOworICBjaGFyICpidWY7CispCisKK3N0YXRpYyBjaGFyICpjb252ZXJ0KHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgbG9uZyBsb25nIGxsID0gZCpUVC51bml0czsKKyAgY2hhciAqcyA9IFRULmJ1ZjsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgaHVtYW5fcmVhZGFibGUocywgbGwsIDApOworICBlbHNlIHNwcmludGYocywgIiVsbHUiLGxsPj5UVC5iaXRzKTsKKyAgVFQuYnVmICs9IHN0cmxlbihUVC5idWYpKzE7CisKKyAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgZnJlZV9tYWluKHZvaWQpCit7CisgIHN0cnVjdCBzeXNpbmZvIGluOworCisgIHN5c2luZm8oJmluKTsKKyAgVFQudW5pdHMgPSBpbi5tZW1fdW5pdCA/IGluLm1lbV91bml0IDogMTsKKyAgd2hpbGUgKCh0b3lzLm9wdGZsYWdzJihGTEFHX2gtMSkpICYmICEodG95cy5vcHRmbGFncyYoMTw8VFQuYml0cykpKSBUVC5iaXRzKys7CisgIFRULmJpdHMgKj0gMTA7CisgIFRULmJ1ZiA9IHRveWJ1ZjsKKworICB4cHJpbnRmKCJcdFx0dG90YWwgICAgICAgIHVzZWQgICAgICAgIGZyZWUgICAgICBzaGFyZWQgICAgIGJ1ZmZlcnNcbiIKKyAgICAiTWVtOiUxN3MlMTJzJTEycyUxMnMlMTJzXG4tLysgYnVmZmVycy9jYWNoZTolMTVzJTEyc1xuIgorICAgICJTd2FwOiUxNnMlMTJzJTEyc1xuIiwgY29udmVydChpbi50b3RhbHJhbSksCisgICAgY29udmVydChpbi50b3RhbHJhbS1pbi5mcmVlcmFtKSwgY29udmVydChpbi5mcmVlcmFtKSwgY29udmVydChpbi5zaGFyZWRyYW0pLAorICAgIGNvbnZlcnQoaW4uYnVmZmVycmFtKSwgY29udmVydChpbi50b3RhbHJhbSAtIGluLmZyZWVyYW0gLSBpbi5idWZmZXJyYW0pLAorICAgIGNvbnZlcnQoaW4uZnJlZXJhbSArIGluLmJ1ZmZlcnJhbSksIGNvbnZlcnQoaW4udG90YWxzd2FwKSwKKyAgICBjb252ZXJ0KGluLnRvdGFsc3dhcCAtIGluLmZyZWVzd2FwKSwgY29udmVydChpbi5mcmVlc3dhcCkpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvZnJlZXJhbWRpc2suYyBiL3RveWJveC90b3lzL290aGVyL2ZyZWVyYW1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYjdmOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2ZyZWVyYW1kaXNrLmMKQEAgLTAsMCArMSwyNyBAQAorLyogZnJlZXJhbWRpc2suYyAtIEZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgdG8gcmFtZGlzaworICoKKyAqIENvcHlyaWdodCAyMDE0IFZpdmVrIEt1bWFyIEJoYWdhdCA8dml2ZWsuYmhhZ2F0ODlAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9GUkVFUkFNRElTSyhORVdUT1koZnJlZXJhbWRpc2ssICI8MT4xIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorCitjb25maWcgRlJFRVJBTURJU0sKKyAgYm9vbCAiZnJlZXJhbWRpc2siCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGZyZWVyYW1kaXNrIFtSQU0gZGV2aWNlXQorCisgICAgRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCB0byBzcGVjaWZpZWQgcmFtZGlzaworKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBmcmVlcmFtZGlza19tYWluKHZvaWQpCit7CisgIGludCBmZDsKKworICBmZCA9IHhvcGVuKHRveXMub3B0YXJnc1swXSwgT19SRFdSKTsKKyAgeGlvY3RsKGZkLCBCTEtGTFNCVUYsIHRveXMub3B0YXJnc1swXSk7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHhjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9mc2ZyZWV6ZS5jIGIvdG95Ym94L3RveXMvb3RoZXIvZnNmcmVlemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUxN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvZnNmcmVlemUuYwpAQCAtMCwwICsxLDMxIEBACisvKiBmc2ZyZWV6ZS5jIC0gZnJlZXplIG9yIHRoYXcgZmlsZXN5c3RlbQorICoKKyAqIE5vIHN0YW5kYXJkLgorCitVU0VfRlNGUkVFWkUoTkVXVE9ZKGZzZnJlZXplLCAiPDE+MWZ8dXxbIWZ1XSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBGU0ZSRUVaRQorICBib29sICJmc2ZyZWV6ZSIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX0ZJRlJFRVpFCisgIGhlbHAKKyAgICB1c2FnZTogZnNmcmVlemUgey1mIHwgLXV9IE1PVU5UUE9JTlQKKworICAgIEZyZWV6ZSBvciB1bmZyZWV6ZSBhIGZpbGVzeXN0ZW0uCisKKyAgICAtZglmcmVlemUKKyAgICAtdQl1bmZyZWV6ZQorKi8KKworI2RlZmluZSBGT1JfZnNmcmVlemUKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKwordm9pZCBmc2ZyZWV6ZV9tYWluKHZvaWQpCit7CisgIGludCBmZCA9IHhvcGVucm8oKnRveXMub3B0YXJncyk7IAorICBsb25nIHAgPSAxOworCisgIHhpb2N0bChmZCwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpID8gRklGUkVFWkUgOiBGSVRIQVcsICZwKTsKKyAgeGNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2ZzeW5jLmMgYi90b3lib3gvdG95cy9vdGhlci9mc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjZjOGQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9mc3luYy5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGZzeW5jLmMgLSBTeW5jaHJvbml6ZSBhIGZpbGUncyBpbi1jb3JlIHN0YXRlIHdpdGggc3RvcmFnZSBkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IDIwMTUgUmFuamFuIEt1bWFyIDxyYW5qYW5rdW1hci5idGhAZ21haWwuY29taT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKworVVNFX0ZTWU5DKE5FV1RPWShmc3luYywgIjwxZCIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIEZTWU5DCisgIGJvb2wgImZzeW5jIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBmc3luYyBbLWRdIFtGSUxFLi4uXQorCisgICAgU3luY2hyb25pemUgYSBmaWxlJ3MgaW4tY29yZSBzdGF0ZSB3aXRoIHN0b3JhZ2UgZGV2aWNlLgorCisgICAgLWQJQXZvaWQgc3luY2luZyBtZXRhZGF0YS4KKyovCisKKyNkZWZpbmUgRk9SX2ZzeW5jCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgdm9pZCBkb19mc3luYyhpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGlmICgoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2QpID8gZmRhdGFzeW5jKGZkKSA6IGZzeW5jKGZkKSkpCisgICAgcGVycm9yX21zZygiY2FuJ3Qgc3luYyAnJXMnIiwgbmFtZSk7Cit9CisKK3ZvaWQgZnN5bmNfbWFpbih2b2lkKQoreworICBsb29wZmlsZXNfcncodG95cy5vcHRhcmdzLCBPX1JET05MWXxPX05PQVRJTUV8T19OT0NUVFl8T19DTE9FWEVDLAorICAgICAgMCwgMCwgZG9fZnN5bmMpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvaGVscC5jIGIvdG95Ym94L3RveXMvb3RoZXIvaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjI1MjgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9oZWxwLmMKQEAgLTAsMCArMSw3NiBAQAorLyogaGVscC5jIC0gU2hvdyBoZWxwIGZvciB0b3lib3ggY29tbWFuZHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIE9mdGVuIGEgc2hlbGwgYnVpbHRpbi4KKworVVNFX0hFTFAoTkVXVE9ZKGhlbHAsICIiVVNFX0hFTFBfRVhUUkFTKCJhaCIpLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBIRUxQCisgIGJvb2wgImhlbHAiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9IRUxQCisgIGhlbHAKKyAgICB1c2FnZTogaGVscCBbY29tbWFuZF0KKworICAgIFNob3cgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRveWJveCBjb21tYW5kcy4KKyAgICBSdW4gInRveWJveCIgd2l0aCBubyBhcmd1bWVudHMgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuCisKK2NvbmZpZyBIRUxQX0VYVFJBUworICBib29sICJoZWxwIC1haCIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YCisgIGRlcGVuZHMgb24gSEVMUAorICBoZWxwCisgICAgdXNhZ2U6IGhlbHAgWy1haF0KKworICAgIC1hCUFsbCBjb21tYW5kcworICAgIC1oCUhUTUwgb3V0cHV0CisqLworCisjZGVmaW5lIEZPUl9oZWxwCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgdm9pZCBkb19oZWxwKHN0cnVjdCB0b3lfbGlzdCAqdCkKK3sKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2gpIAorICAgIHhwcmludGYoIjxhIG5hbWU9XCIlc1wiPjxoMT4lczwvaDE+PGJsb2NrcXVvdGU+PHByZT5cbiIsIHQtPm5hbWUsIHQtPm5hbWUpOworCisgIHRveXMud2hpY2ggPSB0OworICBzaG93X2hlbHAoc3Rkb3V0KTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeHByaW50ZigiPC9ibG9ja3F1b3RlPjwvcHJlPlxuIik7Cit9CisKKy8vIFRoZSBzaW1wbGUgaGVscCBpcyBqdXN0IHRveXMud2hpY2ggPSB0b3lfZmluZCgibmFtZSIpOyBzaG93X2hlbHAoc3Rkb3V0KTsKKy8vIEJ1dCBpdGVyYXRpbmcgdGhyb3VnaCBodG1sIG91dHB1dCBhbmQgYWxsIGNvbW1hbmRzIGlzIGEgYmlnIG1vcmUgCisKK3ZvaWQgaGVscF9tYWluKHZvaWQpCit7CisgIGludCBpOworICAKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfYSkpIHsKKyAgICBzdHJ1Y3QgdG95X2xpc3QgKnQgPSB0b3lzLndoaWNoOworCisgICAgaWYgKCp0b3lzLm9wdGFyZ3MgJiYgISh0ID0gdG95X2ZpbmQoKnRveXMub3B0YXJncykpKQorICAgICAgZXJyb3JfZXhpdCgiVW5rbm93biBjb21tYW5kICclcyciLCAqdG95cy5vcHRhcmdzKTsKKyAgICBkb19oZWxwKHQpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSB7CisgICAgeHByaW50ZigiPGh0bWw+XG48dGl0bGU+VG95Ym94IGNvbW1hbmQgbGlzdDwvdGl0bGU+XG48Ym9keT5cbjxwPlxuIik7CisgICAgZm9yIChpPTA7IGkgPCB0b3lzLnRveWNvdW50OyBpKyspCisgICAgICB4cHJpbnRmKCI8YSBocmVmPVwiIyVzXCI+JXM8L2E+XG4iLCB0b3lfbGlzdFtpXS5uYW1lLAorICAgICAgICAgICAgICB0b3lfbGlzdFtpXS5uYW1lKTsKKyAgICB4cHJpbnRmKCI8L3A+XG4iKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCB0b3lzLnRveWNvdW50OyBpKyspIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeHByaW50ZigiPGhyPlxuPHByZT5cbiIpOworICAgIGRvX2hlbHAodG95X2xpc3QraSk7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2gpIHhwcmludGYoIjwvcHJlPlxuIik7CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeHByaW50ZigiPC9odG1sPiIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvaGV4ZWRpdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvaGV4ZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTMwNGMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9oZXhlZGl0LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qIGhleGVkaXQuYyAtIEhleGFkZWNpbWFsIGZpbGUgZWRpdG9yCisgKgorICogQ29weXJpZ2h0IDIwMTUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBObyBzdGFuZGFyZAorCitVU0VfSEVYRURJVChORVdUT1koaGV4ZWRpdCwgIjwxPjFyIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorCitjb25maWcgSEVYRURJVAorICBib29sICJoZXhlZGl0IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBoZXhlZGl0IEZJTEVOQU1FCisKKyAgICBIZXhhZGVjaW1hbCBmaWxlIGVkaXRvci4gQWxsIGNoYW5nZXMgYXJlIHdyaXR0ZW4gdG8gZGlzayBpbW1lZGlhdGVseS4KKworICAgIC1yCVJlYWQgb25seSAoZGlzcGxheSBidXQgZG9uJ3QgZWRpdCkKKworICAgIEtleXM6CisgICAgQXJyb3dzICAgICAgICBNb3ZlIGxlZnQvcmlnaHQvdXAvZG93biBieSBvbmUgbGluZS9jb2x1bW4KKyAgICBQZyBVcC9QZyBEbiAgIE1vdmUgdXAvZG93biBieSBvbmUgcGFnZQorICAgIDAtOSwgYS1mICAgICAgQ2hhbmdlIGN1cnJlbnQgaGFsZi1ieXRlIHRvIGhleGFkZWNpbWFsIHZhbHVlCisgICAgdSAgICAgICAgICAgICBVbmRvCisgICAgcS9eYy9eZC88ZXNjPiBRdWl0CisqLworCisjZGVmaW5lIEZPUl9oZXhlZGl0CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpkYXRhOworICBsb25nIGxvbmcgbGVuLCBiYXNlOworICBpbnQgbnVtbGVuLCB1bmRvLCB1bmRvbGVuOworICB1bnNpZ25lZCBoZWlnaHQ7CispCisKKyNkZWZpbmUgVU5ET19MRU4gKHNpemVvZih0b3lidWYpLyhzaXplb2YobG9uZyBsb25nKSsxKSkKKworLy8gUmVuZGVyIGFsbCBjaGFyYWN0ZXJzIHByaW50YWJsZSwgdXNpbmcgY29sb3IgdG8gZGlzdGluZ3Vpc2guCitzdGF0aWMgaW50IGRyYXdfY2hhcihGSUxFICpmcCwgd2NoYXJfdCBicm9pbGVkKQoreworICBpZiAoZnApIHsKKyAgICBpZiAoYnJvaWxlZDwzMiB8fCBicm9pbGVkPj0xMjcpIHsKKyAgICAgIGlmIChicm9pbGVkPjEyNykgeworICAgICAgICB0dHlfZXNjKCIybSIpOworICAgICAgICBicm9pbGVkICY9IDEyNzsKKyAgICAgIH0KKyAgICAgIGlmIChicm9pbGVkPDMyIHx8IGJyb2lsZWQ9PTEyNykgeworICAgICAgICB0dHlfZXNjKCI3bSIpOworICAgICAgICBpZiAoYnJvaWxlZD09MTI3KSBicm9pbGVkID0gMzI7CisgICAgICAgIGVsc2UgYnJvaWxlZCArPSA2NDsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiJWMiLCAoaW50KWJyb2lsZWQpOworICAgICAgdHR5X2VzYygiMG0iKTsKKyAgICB9IGVsc2UgcHJpbnRmKCIlYyIsIChpbnQpYnJvaWxlZCk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZHJhd190YWlsKHZvaWQpCit7CisgIHR0eV9qdW1wKDAsIFRULmhlaWdodCk7CisgIHR0eV9lc2MoIksiKTsKKworICBkcmF3X3RyaW0oKnRveXMub3B0YXJncywgLTEsIDcxKTsKK30KKworc3RhdGljIHZvaWQgZHJhd19saW5lKGxvbmcgbG9uZyB5eSkKK3sKKyAgaW50IHgsIHh4ID0gMTY7CisKKyAgeXkgPSAoVFQuYmFzZSt5eSkqMTY7CisgIGlmICh5eSt4eD49VFQubGVuKSB4eCA9IFRULmxlbi15eTsKKworICBpZiAoeXk8VFQubGVuKSB7CisgICAgcHJpbnRmKCJcciUwKmxsWCAiLCBUVC5udW1sZW4sIHl5KTsKKyAgICBmb3IgKHg9MDsgeDx4eDsgeCsrKSBwcmludGYoIiAlMDJYIiwgVFQuZGF0YVt5eSt4XSk7CisgICAgcHJpbnRmKCIlKnMiLCAyKzMqKDE2LXh4KSwgIiIpOworICAgIGZvciAoeD0wOyB4PHh4OyB4KyspIGRyYXdfY2hhcihzdGRvdXQsIFRULmRhdGFbeXkreF0pOworICAgIHByaW50ZigiJSpzIiwgMTYteHgsICIiKTsKKyAgfQorICB0dHlfZXNjKCJLIik7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfcGFnZSh2b2lkKQoreworICBpbnQgeTsKKworICB0dHlfanVtcCgwLCAwKTsKKyAgZm9yICh5ID0gMDsgeTxUVC5oZWlnaHQ7IHkrKykgeworICAgIGlmICh5KSBwcmludGYoIlxyXG4iKTsKKyAgICBkcmF3X2xpbmUoeSk7CisgIH0KKyAgZHJhd190YWlsKCk7Cit9CisKKy8vIHNpZGU6IDAgPSBlZGl0aW5nIGxlZnQsIDEgPSBlZGl0aW5nIHJpZ2h0LCAyID0gY2xlYXIsIDMgPSByZWFkIG9ubHkKK3N0YXRpYyB2b2lkIGhpZ2hsaWdodChpbnQgeHgsIGludCB5eSwgaW50IHNpZGUpCit7CisgIGNoYXIgY2MgPSBUVC5kYXRhWzE2KihUVC5iYXNlK3l5KSt4eF07CisgIGludCBpOworCisgIC8vIERpc3BsYXkgY3Vyc29yCisgIHR0eV9qdW1wKDIrVFQubnVtbGVuKzMqeHgsIHl5KTsKKyAgdHR5X2VzYygiMG0iKTsKKyAgaWYgKHNpZGUhPTIpIHR0eV9lc2MoIjdtIik7CisgIGlmIChzaWRlPjEpIHByaW50ZigiJTAyWCIsIGNjKTsKKyAgZWxzZSBmb3IgKGk9MDsgaTwyOykgeworICAgIGlmIChzaWRlPT1pKSB0dHlfZXNjKCIzMm0iKTsKKyAgICBwcmludGYoIiVYIiwgKGNjPj4oNCooMSYrK2kpKSkmMTUpOworICB9CisgIHR0eV9lc2MoIjBtIik7CisgIHR0eV9qdW1wKFRULm51bWxlbisxNyozK3h4LCB5eSk7CisgIGRyYXdfY2hhcihzdGRvdXQsIGNjKTsKK30KKwordm9pZCBoZXhlZGl0X21haW4odm9pZCkKK3sKKyAgbG9uZyBsb25nIHBvcyA9IDAsIHk7CisgIGludCB4LCBpLCBzaWRlID0gMCwga2V5LCBybyA9IHRveXMub3B0ZmxhZ3MmRkxBR19yLAorICAgICAgZmQgPSB4b3BlbigqdG95cy5vcHRhcmdzLCBybyA/IE9fUkRPTkxZIDogT19SRFdSKTsKKyAgY2hhciBrZXlidWZbMTZdOworCisgICprZXlidWYgPSAwOworCisgIC8vIFRlcm1pbmFsIHNldHVwCisgIFRULmhlaWdodCA9IDI1OworICB0ZXJtaW5hbF9zaXplKDAsICZUVC5oZWlnaHQpOworICBpZiAoVFQuaGVpZ2h0KSBUVC5oZWlnaHQtLTsKKyAgc2lnYXRleGl0KHR0eV9zaWdyZXNldCk7CisgIHR0eV9lc2MoIjBtIik7CisgIHR0eV9lc2MoIj8yNWwiKTsKKyAgZmZsdXNoKDApOworICB4c2V0X3Rlcm1pbmFsKDEsIDEsIDApOworCisgIGlmICgoVFQubGVuID0gZmRsZW5ndGgoZmQpKTwxKSBlcnJvcl9leGl0KCJiYWQgbGVuZ3RoIik7CisgIGlmIChzaXplb2YobG9uZyk9PTMyICYmIFRULmxlbj5TSVpFX01BWCkgVFQubGVuID0gU0laRV9NQVg7CisgIC8vIGNvdW50IGZpbGUgbGVuZ3RoIGhleCBpbiBkaWdpdHMsIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGUgb2YgNAorICBmb3IgKHBvcyA9IFRULmxlbiwgVFQubnVtbGVuID0gMDsgcG9zOyBwb3MgPj49IDQsIFRULm51bWxlbisrKTsKKyAgVFQubnVtbGVuICs9ICg0LVRULm51bWxlbikmMzsKKworICBUVC5kYXRhID0gbW1hcCgwLCBUVC5sZW4sIFBST1RfUkVBRHwoUFJPVF9XUklURSohcm8pLCBNQVBfU0hBUkVELCBmZCwgMCk7CisgIGRyYXdfcGFnZSgpOworCisgIGZvciAoOzspIHsKKyAgICAvLyBTY3JvbGwgZGlzcGxheSBpZiBuZWNlc3NhcnkKKyAgICBpZiAocG9zPDApIHBvcyA9IDA7CisgICAgaWYgKHBvcz49VFQubGVuKSBwb3MgPSBUVC5sZW4tMTsKKyAgICB4ID0gcG9zJjE1OworICAgIHkgPSBwb3MvMTY7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoeTxUVC5iYXNlKSB7CisgICAgICBpZiAoVFQuYmFzZS15PihUVC5oZWlnaHQvMikpIHsKKyAgICAgICAgVFQuYmFzZSA9IHk7CisgICAgICAgIGRyYXdfcGFnZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVFQuYmFzZS0tOworICAgICAgICBpKys7CisgICAgICAgIHR0eV9lc2MoIjFUIik7CisgICAgICAgIHR0eV9qdW1wKDAsIDApOworICAgICAgICBkcmF3X2xpbmUoMCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlICh5Pj1UVC5iYXNlK1RULmhlaWdodCkgeworICAgICAgaWYgKHktKFRULmJhc2UrVFQuaGVpZ2h0KT4oVFQuaGVpZ2h0LzIpKSB7CisgICAgICAgIFRULmJhc2UgPSB5LVRULmhlaWdodC0xOworICAgICAgICBkcmF3X3BhZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRULmJhc2UrKzsKKyAgICAgICAgaSsrOworICAgICAgICB0dHlfZXNjKCIxUyIpOworICAgICAgICB0dHlfanVtcCgwLCBUVC5oZWlnaHQtMSk7CisgICAgICAgIGRyYXdfbGluZShUVC5oZWlnaHQtMSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChpKSBkcmF3X3RhaWwoKTsKKyAgICB5IC09IFRULmJhc2U7CisKKyAgICAvLyBEaXNwbGF5IGN1cnNvciBhbmQgZmx1c2ggb3V0cHV0CisgICAgaGlnaGxpZ2h0KHgsIHksIHJvID8gMyA6IHNpZGUpOworICAgIHhmbHVzaCgpOworCisgICAgLy8gV2FpdCBmb3IgbmV4dCBrZXkKKyAgICBrZXkgPSBzY2FuX2tleShrZXlidWYsIC0xKTsKKyAgICAvLyBFeGl0IGZvciBxLCBjdHJsLWMsIGN0cmwtZCwgZXNjYXBlLCBvciBFT0YKKyAgICBpZiAoa2V5PT0tMSB8fCBrZXk9PTMgfHwga2V5PT00IHx8IGtleT09MjcgfHwga2V5PT0ncScpIGJyZWFrOworICAgIGhpZ2hsaWdodCh4LCB5LCAyKTsKKworICAgIC8vIEhleCBkaWdpdD8KKyAgICBpZiAoa2V5Pj0nYScgJiYga2V5PD0nZicpIGtleS09MzI7CisgICAgaWYgKCFybyAmJiAoKGtleT49JzAnICYmIGtleTw9JzknKSB8fCAoa2V5Pj0nQScgJiYga2V5PD0nRicpKSkgeworICAgICAgaWYgKCFzaWRlKSB7CisgICAgICAgIGxvbmcgbG9uZyAqbGwgPSAobG9uZyBsb25nICopdG95YnVmOworCisgICAgICAgIGxsW1RULnVuZG9dID0gcG9zOworICAgICAgICB0b3lidWZbKHNpemVvZihsb25nIGxvbmcpKlVORE9fTEVOKStUVC51bmRvKytdID0gVFQuZGF0YVtwb3NdOworICAgICAgICBpZiAoVFQudW5kb2xlbiA8IFVORE9fTEVOKSBUVC51bmRvbGVuKys7CisgICAgICAgIFRULnVuZG8gJT0gVU5ET19MRU47CisgICAgICB9CisKKyAgICAgIGkgPSBrZXkgLSAnMCc7CisgICAgICBpZiAoaT45KSBpIC09IDc7CisgICAgICBUVC5kYXRhW3Bvc10gJj0gMTU8PCg0KnNpZGUpOworICAgICAgVFQuZGF0YVtwb3NdIHw9IGk8PCg0KiFzaWRlKTsKKworICAgICAgaWYgKCsrc2lkZT09MikgeworICAgICAgICBoaWdobGlnaHQoeCwgeSwgc2lkZSk7CisgICAgICAgIHNpZGUgPSAwOworICAgICAgICArK3BvczsKKyAgICAgIH0KKyAgICB9IGVsc2Ugc2lkZSA9IDA7CisgICAgaWYgKGtleT09J3UnKSB7CisgICAgICBpZiAoVFQudW5kb2xlbikgeworICAgICAgICBsb25nIGxvbmcgKmxsID0gKGxvbmcgbG9uZyAqKXRveWJ1ZjsKKworICAgICAgICBUVC51bmRvbGVuLS07CisgICAgICAgIGlmICghVFQudW5kbykgVFQudW5kbyA9IFVORE9fTEVOOworICAgICAgICBwb3MgPSBsbFstLVRULnVuZG9dOworICAgICAgICBUVC5kYXRhW3Bvc10gPSB0b3lidWZbc2l6ZW9mKGxvbmcgbG9uZykqVU5ET19MRU4rVFQudW5kb107CisgICAgICB9CisgICAgfQorICAgIGlmIChrZXk+PTI1NikgeworICAgICAga2V5IC09IDI1NjsKKworICAgICAgaWYgKGtleT09S0VZX1VQKSBwb3MgLT0gMTY7CisgICAgICBlbHNlIGlmIChrZXk9PUtFWV9ET1dOKSBwb3MgKz0gMTY7CisgICAgICBlbHNlIGlmIChrZXk9PUtFWV9SSUdIVCkgeworICAgICAgICBpZiAoeDwxNSkgcG9zKys7CisgICAgICB9IGVsc2UgaWYgKGtleT09S0VZX0xFRlQpIHsKKyAgICAgICAgaWYgKHgpIHBvcy0tOworICAgICAgfSBlbHNlIGlmIChrZXk9PUtFWV9QR1VQKSBwb3MgLT0gMTYqVFQuaGVpZ2h0OworICAgICAgZWxzZSBpZiAoa2V5PT1LRVlfUEdETikgcG9zICs9IDE2KlRULmhlaWdodDsKKyAgICAgIGVsc2UgaWYgKGtleT09S0VZX0hPTUUpIHBvcyA9IDA7CisgICAgICBlbHNlIGlmIChrZXk9PUtFWV9FTkQpIHBvcyA9IFRULmxlbi0xOworICAgIH0KKyAgfQorICBtdW5tYXAoVFQuZGF0YSwgVFQubGVuKTsKKyAgY2xvc2UoZmQpOworICB0dHlfcmVzZXQoKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2hvc3RpZC5jIGIvdG95Ym94L3RveXMvb3RoZXIvaG9zdGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzYWMzYwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2hvc3RpZC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIGhvc3RpZC5jIC0gUHJpbnQgdGhlIG51bWVyaWMgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgaG9zdC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSYW5qYW4gS3VtYXIgPHJhbmphbmt1bWFyLmJ0aEBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQuCisKK1VTRV9IT1NUSUQoTkVXVE9ZKGhvc3RpZCwgIj4wIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgSE9TVElECisgIGJvb2wgImhvc3RpZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogaG9zdGlkCisKKyAgICBQcmludCB0aGUgbnVtZXJpYyBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBob3N0LgorKi8KKyNkZWZpbmUgRk9SX2hvc3RpZAorI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBob3N0aWRfbWFpbih2b2lkKQoreworICB4cHJpbnRmKCIlMDhseFxuIiwgZ2V0aG9zdGlkKCkpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvaHdjbG9jay5jIGIvdG95Ym94L3RveXMvb3RoZXIvaHdjbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTA2NDEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9od2Nsb2NrLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIGh3Y2xvY2suYyAtIGdldCBhbmQgc2V0IHRoZSBod2Nsb2NrCisgKgorICogQ29weXJpZ2h0IDIwMTQgQmlsYWwgUXVyZXNoaSA8YmlsYWwuam1pQGdtYWlsLmNvbT4KKyAqCisgKiBObyBzdGFuZGFyZCwgYnV0IHNlZSBEb2N1bWVudGF0aW9uL3J0Yy50eHQgaW4gdGhlIGxpbnV4IGtlcm5lbCBzb3VyY2UuLgorICoKK1VTRV9IV0NMT0NLKE5FV1RPWShod2Nsb2NrLCAiPjAoZmFzdClmKHJ0Yyk6dSh1dGMpbChsb2NhbHRpbWUpdChzeXN0eilzKGhjdG9zeXMpcihzaG93KXcoc3lzdG9oYylbLXVsXVshcnRzd10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBIV0NMT0NLCisgIGJvb2wgImh3Y2xvY2siCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGh3Y2xvY2sgWy1yc3d0bHVmXQorCisgICAgLWYgRklMRSBVc2Ugc3BlY2lmaWVkIGRldmljZSBmaWxlIGluc3RlYWQgb2YgL2Rldi9ydGMgKC0tcnRjKQorICAgIC1sICAgICAgSGFyZHdhcmUgY2xvY2sgdXNlcyBsb2NhbHRpbWUgKC0tbG9jYWx0aW1lKQorICAgIC1yICAgICAgU2hvdyBoYXJkd2FyZSBjbG9jayB0aW1lICgtLXNob3cpCisgICAgLXMgICAgICBTZXQgc3lzdGVtIHRpbWUgZnJvbSBoYXJkd2FyZSBjbG9jayAoLS1oY3Rvc3lzKQorICAgIC10ICAgICAgU2V0IHRoZSBzeXN0ZW0gdGltZSBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lem9uZSAoLS1zeXN0eikKKyAgICAtdSAgICAgIEhhcmR3YXJlIGNsb2NrIHVzZXMgVVRDICgtLXV0YykKKyAgICAtdyAgICAgIFNldCBoYXJkd2FyZSBjbG9jayBmcm9tIHN5c3RlbSB0aW1lICgtLXN5c3RvaGMpCisqLworCisjZGVmaW5lIEZPUl9od2Nsb2NrCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCitHTE9CQUxTKAorICBjaGFyICpmbmFtZTsKKworICBpbnQgdXRjOworKQorCitzdGF0aWMgaW50IHJ0Y19maW5kKHN0cnVjdCBkaXJ0cmVlKiBub2RlKQoreworICBGSUxFICpmcDsKKworICBpZiAoIW5vZGUtPnBhcmVudCkgcmV0dXJuIERJUlRSRUVfUkVDVVJTRTsKKworICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiL3N5cy9jbGFzcy9ydGMvJXMvaGN0b3N5cyIsIG5vZGUtPm5hbWUpOworICBmcCA9IGZvcGVuKHRveWJ1ZiwgInIiKTsKKyAgaWYgKGZwKSB7CisgICAgaW50IGhjdG9zeXMgPSAwLCBpdGVtcyA9IGZzY2FuZihmcCwgIiVkIiwgJmhjdG9zeXMpOworCisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAoaXRlbXMgPT0gMSAmJiBoY3Rvc3lzID09IDEpIHsKKyAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvZGV2LyVzIiwgbm9kZS0+bmFtZSk7CisgICAgICBUVC5mbmFtZSA9IHRveWJ1ZjsKKworICAgICAgcmV0dXJuIERJUlRSRUVfQUJPUlQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHdjbG9ja19tYWluKCkKK3sKKyAgc3RydWN0IHRpbWV6b25lIHR6b25lOworICBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOworICBzdHJ1Y3QgdG0gdG07CisgIHRpbWVfdCB0aW1lOworICBpbnQgZmQgPSAtMTsKKworICAvLyBjaGVjayBmb3IgR3JlbmljaCBNZWFuIFRpbWUKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpIFRULnV0YyA9IDE7CisgIGVsc2UgeworICAgIEZJTEUgKmZwOworICAgIGNoYXIgKnMgPSAwOworCisgICAgZm9yIChmcCA9IGZvcGVuKCIvZXRjL2FkanRpbWUiLCAiciIpOworICAgICAgICAgZnAgJiYgZ2V0bGluZSgmcywgKHZvaWQgKil0b3lidWYsIGZwKT4wOworICAgICAgICAgZnJlZShzKSwgcyA9IDApIFRULnV0YyArPSAhc3RybmNtcChzLCAiVVRDIiwgMyk7CisgICAgaWYgKGZwKSBmY2xvc2UoZnApOworICB9CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3QpKSB7CisgICAgaW50IHcgPSB0b3lzLm9wdGZsYWdzICYgRkxBR193LCBmbGFnID0gT19XUk9OTFkqdzsKKworICAgIC8vIE9wZW4gL2Rldi9ydGMgKGlmIHlvdXIgc3lzdGVtIGhhcyBubyAvZGV2L3J0YyBzeW1saW5rLCBzZWFyY2ggZm9yIGl0KS4KKyAgICBpZiAoIVRULmZuYW1lICYmIChmZCA9IG9wZW4oIi9kZXYvcnRjIiwgZmxhZykpID09IC0xKSB7CisgICAgICBkaXJ0cmVlX3JlYWQoIi9zeXMvY2xhc3MvcnRjIiwgcnRjX2ZpbmQpOworICAgICAgaWYgKCFUVC5mbmFtZSkgVFQuZm5hbWUgPSAiL2Rldi9taXNjL3J0YyI7CisgICAgfQorICAgIGlmIChmZCA9PSAtMSkgZmQgPSB4b3BlbihUVC5mbmFtZSwgZmxhZyk7CisKKyAgICAvLyBHZXQgY3VycmVudCB0aW1lIGluIHNlY29uZHMgZnJvbSBydGMgZGV2aWNlLiB0b2RvOiBnZXQgc3Vic2Vjb25kIHRpbWUKKyAgICBpZiAoIXcpIHsKKyAgICAgIGNoYXIgKnMgPSBzOworCisgICAgICB4aW9jdGwoZmQsIFJUQ19SRF9USU1FLCAmdG0pOworICAgICAgaWYgKFRULnV0YykgcyA9IHh0enNldCgiVVRDMCIpOworICAgICAgaWYgKCh0aW1lID0gbWt0aW1lKCZ0bSkpIDwgMCkgZXJyb3JfZXhpdCgibWt0aW1lIGZhaWxlZCIpOworICAgICAgaWYgKFRULnV0YykgeworICAgICAgICBmcmVlKHh0enNldChzKSk7CisgICAgICAgIGZyZWUocyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiAoRkxBR193fEZMQUdfdCkpIHsKKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0aW1ldmFsLCAwKSkgcGVycm9yX2V4aXQoImdldHRpbWVvZmRheSBmYWlsZWQiKTsKKyAgICBpZiAoIShUVC51dGMgPyBnbXRpbWVfciA6IGxvY2FsdGltZV9yKSgmdGltZXZhbC50dl9zZWMsICZ0bSkpCisgICAgICBlcnJvcl9leGl0KFRULnV0YyA/ICJnbXRpbWVfciBmYWlsZWQiIDogImxvY2FsdGltZV9yIGZhaWxlZCIpOworICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpIHsKKyAgICAvKiBUaGUgdmFsdWUgb2YgdG1faXNkc3Qgd2lsbCBwb3NpdGl2ZSBpZiBkYXlsaWdodCBzYXZpbmcgdGltZSBpcyBpbiBlZmZlY3QsCisgICAgICogemVybyBpZiBpdCBpcyBub3QgYW5kIG5lZ2F0aXZlIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAKKyAgICAgKiB0b2RvOiBzbyB3aHkgaXNuJ3QgdGhpcyBuZWdhdGl2ZS4uLj8gKi8KKyAgICB0bS50bV9pc2RzdCA9IDA7CisgICAgeGlvY3RsKGZkLCBSVENfU0VUX1RJTUUsICZ0bSk7CisgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgeworICAgIHR6b25lLnR6X21pbnV0ZXN3ZXN0ID0gdGltZXpvbmUgLyA2MCAtIDYwICogZGF5bGlnaHQ7CisgICAgdGltZXZhbC50dl9zZWMgPSB0aW1lOworICAgIHRpbWV2YWwudHZfdXNlYyA9IDA7IC8vIHRvZG86IGZpeGl0CisgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgeworICAgIC8vIEFkanVzdCBzZWNvbmRzIGZvciB0aW1lem9uZSBhbmQgZGF5bGlnaHQgc2F2aW5nIHRpbWUKKyAgICAvLyBleHRlcm4gbG9uZyB0aW1lem9uZSBpcyBkZWZpbmVkIGluIGhlYWRlciBzeXMvdGltZS5oCisgICAgdHpvbmUudHpfbWludXRlc3dlc3QgPSB0aW1lem9uZSAvIDYwOworICAgIGlmICh0bS50bV9pc2RzdCkgdHpvbmUudHpfbWludXRlc3dlc3QgLT0gNjA7CisgICAgaWYgKCFUVC51dGMpIHRpbWV2YWwudHZfc2VjICs9IHR6b25lLnR6X21pbnV0ZXN3ZXN0ICogNjA7CisgIH0gZWxzZSB7CisgICAgY2hhciAqYyA9IGN0aW1lKCZ0aW1lKSwgKnMgPSBzdHJyY2hyKGMsICdcbicpOworCisgICAgaWYgKHMpICpzID0gJ1wwJzsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KKyAgICB4cHJpbnRmKCIlcyAgMC4wMDAwMDAgc2Vjb25kc1xuIiwgYyk7CisgIH0KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiAoRkxBR190fEZMQUdfcykpIHsKKyAgICB0em9uZS50el9kc3R0aW1lID0gMDsKKyAgICBpZiAoc2V0dGltZW9mZGF5KCZ0aW1ldmFsLCAmdHpvbmUpKSBwZXJyb3JfZXhpdCgic2V0dGltZW9mZGF5IGZhaWxlZCIpOworICB9CisKKyAgaWYgKGZkICE9IC0xKSBjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9pbm90aWZ5ZC5jIGIvdG95Ym94L3RveXMvb3RoZXIvaW5vdGlmeWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQxZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvaW5vdGlmeWQuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogaW5vdGlmeWQuYyAtIGlub3RpZnkgZGFlbW9uLiAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pMTk4MUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKworVVNFX0lOT1RJRllEKE5FV1RPWShpbm90aWZ5ZCwgIjwyIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgSU5PVElGWUQKKyAgYm9vbCAiaW5vdGlmeWQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGlub3RpZnlkIFBST0cgRklMRVs6TUFTS10gLi4uCisKKyAgICBXaGVuIGEgZmlsZXN5c3RlbSBldmVudCBtYXRjaGluZyBNQVNLIG9jY3VycyB0byBhIEZJTEUsIHJ1biBQUk9HIGFzOgorCisgICAgICBQUk9HIEVWRU5UUyBGSUxFIFtESVJGSUxFXQorCisgICAgSWYgUFJPRyBpcyAiLSIgZXZlbnRzIGFyZSBzZW50IHRvIHN0ZG91dC4KKworICAgIFRoaXMgZmlsZSBpczoKKyAgICAgIGEgIGFjY2Vzc2VkICAgIGMgIG1vZGlmaWVkICAgIGUgIG1ldGFkYXRhIGNoYW5nZSAgdyAgY2xvc2VkICh3cml0YWJsZSkKKyAgICAgIHIgIG9wZW5lZCAgICAgIEQgIGRlbGV0ZWQgICAgIE0gIG1vdmVkICAgICAgICAgICAgMCAgY2xvc2VkICh1bndyaXRhYmxlKQorICAgICAgdSAgdW5tb3VudGVkICAgbyAgb3ZlcmZsb3cgICAgeCAgdW53YXRjaGFibGUKKworICAgIEEgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBpczoKKyAgICAgIG0gIG1vdmVkIGluICAgIHkgIG1vdmVkIG91dCAgIG4gIGNyZWF0ZWQgICAgICAgICAgZCAgZGVsZXRlZAorCisgICAgV2hlbiB4IGV2ZW50IGhhcHBlbnMgZm9yIGFsbCBGSUxFcywgaW5vdGlmeWQgZXhpdHMgKGFmdGVyIHdhaXRpbmcgZm9yIFBST0cpLgorKi8KKworI2RlZmluZSBGT1JfaW5vdGlmeWQKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKwordm9pZCBpbm90aWZ5ZF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCBwb2xsZmQgZmRzOworICBjaGFyICpwcm9nX2FyZ3NbNV0sICoqc3MgPSB0b3lzLm9wdGFyZ3M7CisgIGNoYXIgKm1hc2tsaXN0ID0iYWNldzBybXluZERNIHVveCI7CisKKyAgZmRzLmV2ZW50cyA9IFBPTExJTjsKKworICAqcHJvZ19hcmdzID0gKnRveXMub3B0YXJnczsKKyAgcHJvZ19hcmdzWzRdID0gMDsKKyAgaWYgKChmZHMuZmQgPSBpbm90aWZ5X2luaXQoKSkgPT0gLTEpIHBlcnJvcl9leGl0KDApOworCisgIC8vIFRyYWNrIG51bWJlciBvZiB3YXRjaGVkIGZpbGVzLiBGaXJzdCBvbmUgd2FzIHByb2dyYW0gdG8gcnVuLgorICB0b3lzLm9wdGMtLTsKKworICB3aGlsZSAoKisrc3MpIHsKKyAgICBjaGFyICpwYXRoID0gKnNzLCAqbWFza3MgPSBzdHJjaHIoKnNzLCAnOicpOworICAgIGludCBpLCBtYXNrID0gMDsKKworICAgIGlmICghbWFza3MpIG1hc2sgPSAweGZmZjsgLy8gZGVmYXVsdCB0byBhbGwKKyAgICBlbHNleworICAgICAgKm1hc2tzKysgPSAwOworICAgICAgZm9yICgqbWFza3MrKyA9IDA7ICptYXNrczsgbWFza3MrKykgeworICAgICAgICBpID0gc3RyaWR4KG1hc2tsaXN0LCAqbWFza3MpOzsKKyAgICAgICAgaWYgKGkgPT0gLTEpIGVycm9yX2V4aXQoImJhZCBtYXNrICclYyciLCAqbWFza3MpOworICAgICAgICBtYXNrIHw9IDE8PGk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyByZXR1cm5zIGluY3JlYXNpbmcgbnVtYmVycyBzdGFydGluZyBmcm9tIDEsIHdoaWNoIGNvaW5jaWRlbnRhbGx5CisgICAgLy8gaXMgdGhlIHRveXMub3B0YXJncyBwb3NpdGlvbiBvZiB0aGUgZmlsZS4gKDAgaXMgcHJvZ3JhbSB0byBydW4uKQorICAgIGlmIChpbm90aWZ5X2FkZF93YXRjaChmZHMuZmQsIHBhdGgsIG1hc2spIDwgMCkgcGVycm9yX2V4aXRfcmF3KHBhdGgpOworICB9CisKKyAgZm9yICg7OykgeworICAgIGludCByZXQgPSAwLCBsZW47CisgICAgdm9pZCAqYnVmID0gMDsKKyAgICBzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqZXZlbnQ7CisKKyAgICAvLyBSZWFkIG5leHQgZXZlbnQocykKKyAgICByZXQgPSBwb2xsKCZmZHMsIDEsIC0xKTsKKyAgICBpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUikgY29udGludWU7CisgICAgaWYgKHJldCA8PSAwKSBicmVhazsKKyAgICB4aW9jdGwoZmRzLmZkLCBGSU9OUkVBRCwgJmxlbik7CisgICAgZXZlbnQgPSBidWYgPSB4bWFsbG9jKGxlbik7CisgICAgbGVuID0gcmVhZGFsbChmZHMuZmQsIGJ1ZiwgbGVuKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBzZXQgb2YgZXZlbnRzLgorICAgIGZvciAoOzspIHsKKyAgICAgIGludCBsZWZ0ID0gbGVuIC0gKCgoY2hhciAqKWV2ZW50KS0oY2hhciAqKWJ1ZiksCisgICAgICAgICAgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7CisKKyAgICAgIC8vIERvbid0IGRlcmVmZXJlbmNlIGV2ZW50IGlmIC0+bGVuIGlzIG9mZiBlbmQgb2YgYnVmZXIKKyAgICAgIGlmIChsZWZ0ID49IHNpemUpIHNpemUgKz0gZXZlbnQtPmxlbjsKKyAgICAgIGlmIChsZWZ0IDwgc2l6ZSkgYnJlYWs7CisKKyAgICAgIGlmIChldmVudC0+bWFzaykgeworICAgICAgICBjaGFyICpzID0gdG95YnVmLCAqbTsKKworICAgICAgICBmb3IgKG0gPSBtYXNrbGlzdDsgKm07IG0rKykKKyAgICAgICAgICBpZiAoZXZlbnQtPm1hc2sgJiAoMTw8KG0tbWFza2xpc3QpKSkgKnMrKyA9ICptOworICAgICAgICAqcyA9IDA7CisKKyAgICAgICAgaWYgKCoqcHJvZ19hcmdzID09ICctJyAmJiAhcHJvZ19hcmdzWzBdWzFdKSB7CisgICAgICAgICAgeHByaW50ZigiJXNcdCVzXHQlc1xuIiArIDMqIWV2ZW50LT5sZW4sIHRveWJ1ZiwKKyAgICAgICAgICAgICAgdG95cy5vcHRhcmdzW2V2ZW50LT53ZF0sIGV2ZW50LT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9nX2FyZ3NbMV0gPSB0b3lidWY7CisgICAgICAgICAgcHJvZ19hcmdzWzJdID0gdG95cy5vcHRhcmdzW2V2ZW50LT53ZF07CisgICAgICAgICAgcHJvZ19hcmdzWzNdID0gZXZlbnQtPmxlbiA/IGV2ZW50LT5uYW1lIDogMDsKKyAgICAgICAgICB4cnVuKHByb2dfYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXZlbnQtPm1hc2sgJiBJTl9JR05PUkVEKSB7CisgICAgICAgICAgaWYgKC0tdG95cy5vcHRjIDw9IDApIHsKKyAgICAgICAgICAgIGZyZWUoYnVmKTsKKworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgIH0KKyAgICAgICAgICBpbm90aWZ5X3JtX3dhdGNoKGZkcy5mZCwgZXZlbnQtPndkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZXZlbnQgPSAodm9pZCopKHNpemUgKyAoY2hhciopZXZlbnQpOworICAgIH0KKyAgICBmcmVlKGJ1Zik7CisgIH0KKworZG9uZToKKyAgdG95cy5leGl0dmFsID0gISF0b3lzLnNpZ25hbDsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2luc21vZC5jIGIvdG95Ym94L3RveXMvb3RoZXIvaW5zbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZjU5NQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2luc21vZC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIGluc21vZC5jIC0gTG9hZCBhIG1vZHVsZSBpbnRvIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKworVVNFX0lOU01PRChORVdUT1koaW5zbW9kLCAiPDEiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBJTlNNT0QKKyAgYm9vbCAiaW5zbW9kIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBpbnNtb2QgTU9EVUxFIFtNT0RVTEVfT1BUSU9OU10KKworICAgIExvYWQgdGhlIG1vZHVsZSBuYW1lZCBNT0RVTEUgcGFzc2luZyBvcHRpb25zIGlmIGdpdmVuLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaWZkZWYgU1lTX2Zpbml0X21vZHVsZQorI2RlZmluZSBmaW5pdF9tb2R1bGUoZmQsIG9wdHMsIGZsYWdzKSBzeXNjYWxsKFNZU19maW5pdF9tb2R1bGUsIGZkLCBvcHRzLCBmbGFncykKKyNlbHNlCisjZGVmaW5lIGZpbml0X21vZHVsZShhLCBiLCBjKSAoZXJybm8gPSBFTk9TWVMpCisjZW5kaWYKKyNkZWZpbmUgaW5pdF9tb2R1bGUobW9kLCBsZW4sIG9wdHMpIHN5c2NhbGwoU1lTX2luaXRfbW9kdWxlLCBtb2QsIGxlbiwgb3B0cykKKwordm9pZCBpbnNtb2RfbWFpbih2b2lkKQoreworICBpbnQgZmQgPSB4b3BlbnJvKCp0b3lzLm9wdGFyZ3MpOworICBpbnQgaSwgcmM7CisKKyAgaSA9IDE7CisgIHdoaWxlICh0b3lzLm9wdGFyZ3NbaV0gJiYKKyAgICBzdHJsZW4odG95YnVmKSArIHN0cmxlbih0b3lzLm9wdGFyZ3NbaV0pICsgMiA8IHNpemVvZih0b3lidWYpKQorICB7CisgICAgc3RyY2F0KHRveWJ1ZiwgdG95cy5vcHRhcmdzW2krK10pOworICAgIHN0cmNhdCh0b3lidWYsICIgIik7CisgIH0KKworICAvLyBmaW5pdF9tb2R1bGUgd2FzIG5ldyBpbiBMaW51eCAzLjgsIGFuZCBkb2Vzbid0IHdvcmsgb24gc3RkaW4sCisgIC8vIHNvIHdlIGZhbGwgYmFjayB0byBpbml0X21vZHVsZSBpZiBuZWNlc3NhcnkuCisgIHJjID0gZmluaXRfbW9kdWxlKGZkLCB0b3lidWYsIDApOworICBpZiAocmMgJiYgKGZkID09IDAgfHwgZXJybm8gPT0gRU5PU1lTKSkgeworICAgIG9mZl90IGxlbiA9IDA7CisgICAgY2hhciAqcGF0aCA9ICFzdHJjbXAoKnRveXMub3B0YXJncywgIi0iKSA/ICIvZGV2L3N0ZGluIiA6ICp0b3lzLm9wdGFyZ3M7CisgICAgY2hhciAqYnVmID0gcmVhZGZpbGVhdChBVF9GRENXRCwgcGF0aCwgTlVMTCwgJmxlbik7CisKKyAgICByYyA9IGluaXRfbW9kdWxlKGJ1ZiwgbGVuLCB0b3lidWYpOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoYnVmKTsKKyAgfQorCisgIGlmIChyYykgcGVycm9yX2V4aXQoImZhaWxlZCB0byBsb2FkICVzIiwgdG95cy5vcHRhcmdzWzBdKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9pb25pY2UuYyBiL3RveWJveC90b3lzL290aGVyL2lvbmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDM1NDUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9pb25pY2UuYwpAQCAtMCwwICsxLDk3IEBACisvKiBpb25pY2UuYyAtIHNldCBvciBnZXQgcHJvY2VzcyBJL08gc2NoZWR1bGluZyBjbGFzcyBhbmQgcHJpb3JpdHkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHRoZXJlIHdhcyBhIHN0YW5kYXJkLCBidXQgbm8uIFRoZXJlIGlzCisgKiBEb2N1bWVudGF0aW9uL2Jsb2NrL2lvcHJpby50eHQgaW4gdGhlIGxpbnV4IHNvdXJjZS4KKworVVNFX0lPTklDRShORVdUT1koaW9uaWNlLCAiXnRjIzwwPjM9Mm4jPDA+Nz01cCMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfSU9SRU5JQ0UoTkVXVE9ZKGlvcmVuaWNlLCAiPzwxPjMiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBJT05JQ0UKKyAgYm9vbCAiaW9uaWNlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBpb25pY2UgWy10XSBbLWMgQ0xBU1NdIFstbiBMRVZFTF0gW0NPTU1BTkQuLi58LXAgUElEXQorCisgICAgQ2hhbmdlIHRoZSBJL08gc2NoZWR1bGluZyBwcmlvcml0eSBvZiBhIHByb2Nlc3MuIFdpdGggbm8gYXJndW1lbnRzCisgICAgKG9yIGp1c3QgLXApLCBkaXNwbGF5IHByb2Nlc3MnIGV4aXN0aW5nIEkvTyBjbGFzcy9wcmlvcml0eS4KKworICAgIC1jCUNMQVNTID0gMS0zOiAxKHJlYWx0aW1lKSwgMihiZXN0LWVmZm9ydCwgZGVmYXVsdCksIDMod2hlbi1pZGxlKQorICAgIC1uCUxFVkVMID0gMC03OiAoMCBpcyBoaWdoZXN0IHByaW9yaXR5LCBkZWZhdWx0ID0gNSkKKyAgICAtcAlBZmZlY3QgZXhpc3RpbmcgUElEIGluc3RlYWQgb2Ygc3Bhd25pbmcgbmV3IGNoaWxkCisgICAgLXQJSWdub3JlIGZhaWx1cmUgdG8gc2V0IEkvTyBwcmlvcml0eQorCisgICAgU3lzdGVtIGRlZmF1bHQgaW9wcmlvcml0eSBpcyBnZW5lcmFsbHkgLWMgMiAtbiA0LgorCitjb25maWcgSU9SRU5JQ0UKKyAgYm9vbCAiaW9yZW5pY2UiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGlvcmVuaWNlIFBJRCBbQ0xBU1NdIFtQUklPUklUWV0KKworICAgIERpc3BsYXkgb3IgY2hhbmdlIEkvTyBwcmlvcml0eSBvZiBleGlzdGluZyBwcm9jZXNzLiBDTEFTUyBjYW4gYmUKKyAgICAicnQiIGZvciByZWFsdGltZSwgImJlIiBmb3IgYmVzdCBlZmZvcnQsICJpZGxlIiBmb3Igb25seSB3aGVuIGlkbGUsIG9yCisgICAgIm5vbmUiIHRvIGxlYXZlIGl0IGFsb25lLiBQUklPUklUWSBjYW4gYmUgMC03ICgwIGlzIGhpZ2hlc3QsIGRlZmF1bHQgNCkuCisqLworCisjZGVmaW5lIEZPUl9pb25pY2UKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworR0xPQkFMUygKKyAgbG9uZyBwaWQ7CisgIGxvbmcgbGV2ZWw7CisgIGxvbmcgY2xhc3M7CispCisKK3N0YXRpYyBpbnQgaW9wcmlvX2dldCh2b2lkKQoreworICByZXR1cm4gc3lzY2FsbChfX05SX2lvcHJpb19nZXQsIDEsIChpbnQpVFQucGlkKTsKK30KKworc3RhdGljIGludCBpb3ByaW9fc2V0KHZvaWQpCit7CisgIGludCBwcmlvID0gKChpbnQpVFQuY2xhc3MgPDwgMTMpIHwgKGludClUVC5sZXZlbDsKKworICByZXR1cm4gc3lzY2FsbChfX05SX2lvcHJpb19zZXQsIDEsIChpbnQpVFQucGlkLCBwcmlvKTsKK30KKwordm9pZCBpb25pY2VfbWFpbih2b2lkKQoreworICBpZiAoIVRULnBpZCAmJiAhdG95cy5vcHRjKSBlcnJvcl9leGl0KCJOZWVkIC1wIG9yIENPTU1BTkQiKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgPT0gRkxBR19wKSB7CisgICAgaW50IHAgPSBpb3ByaW9fZ2V0KCk7CisgICAgeHByaW50ZigiJXM6IHByaW8gJWRcbiIsCisgICAgICAoY2hhciAqW10peyJ1bmtub3duIiwgIlJlYWx0aW1lIiwgIkJlc3QtZWZmb3J0IiwgIklkbGUifVsocD4+MTMpJjNdLAorICAgICAgcCY3KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoLTEgPT0gaW9wcmlvX3NldCgpICYmICEodG95cy5vcHRmbGFncyZGTEFHX3QpKSBwZXJyb3JfZXhpdCgic2V0Iik7CisgICAgaWYgKCFUVC5waWQpIHhleGVjKHRveXMub3B0YXJncyk7CisgIH0KK30KKwordm9pZCBpb3JlbmljZV9tYWluKHZvaWQpCit7CisgIGNoYXIgKmNsYXNzZXNbXSA9IHsibm9uZSIsICJydCIsICJiZSIsICJpZGxlIn07CisKKyAgVFQucGlkID0gYXRvbHgoKnRveXMub3B0YXJncyk7CisgIGlmICh0b3lzLm9wdGMgPT0gMSkgeworICAgIGludCBwID0gaW9wcmlvX2dldCgpOworCisgICAgaWYgKHAgPT0gLTEpIHBlcnJvcl9leGl0KCJyZWFkIHByaW9yaXR5Iik7CisgICAgVFQuY2xhc3MgPSAocD4+MTMpJjM7CisgICAgcCAmPSA3OworICAgIHhwcmludGYoIlBpZCAlbGQsIGNsYXNzICVzICglbGQpLCBwcmlvICVkXG4iLAorICAgICAgICAgICAgVFQucGlkLCBjbGFzc2VzW1RULmNsYXNzXSwgVFQuY2xhc3MsIHApOworICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoVFQuY2xhc3MgPSAwOyBUVC5jbGFzczw0OyBUVC5jbGFzcysrKQorICAgIGlmICghc3RyY21wKHRveXMub3B0YXJnc1t0b3lzLm9wdGMtMV0sIGNsYXNzZXNbVFQuY2xhc3NdKSkgYnJlYWs7CisgIGlmICh0b3lzLm9wdGMgPT0gMyB8fCBUVC5jbGFzcyA9PSA0KSBUVC5sZXZlbCA9IGF0b2x4KHRveXMub3B0YXJnc1sxXSk7CisgIGVsc2UgVFQubGV2ZWwgPSA0OworICBUVC5jbGFzcyAmPSAzOworCisgIGlmICgtMSA9PSBpb3ByaW9fc2V0KCkpIHBlcnJvcl9leGl0KCJzZXQiKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2xvZ2luLmMgYi90b3lib3gvdG95cy9vdGhlci9sb2dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTU1OWEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9sb2dpbi5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiBsb2dpbi5jIC0gU3RhcnQgYSBzZXNzaW9uIG9uIHRoZSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKyAqCisgKiBObyBzdXBwb3J0IGZvciBQQU0vc2VjdXJldHR5L3NlbGludXgvbG9naW4gc2NyaXB0L2lzc3VlL3V0bXAKKyAqIFJlbGllcyBvbiBsaWJjcnlwdCBmb3IgaGFzaCBjYWxjdWxhdGlvbi4KKyAqCisgKiBUT0RPOiB0aGlzIGNvbW1hbmQgcHJlZGF0ZXMgInBlbmRpbmciIGJ1dCBuZWVkcyBjbGVhbnVwLiBJdCAjZGVmaW5lcworICogcmFuZG9tIHN0dWZmLCBjYWxscyBleGl0KCkgZm9ybSBhIHNpZ25hbCBoYW5kbGVyLi4uIHllYWguCisKK1VTRV9MT0dJTihORVdUT1kobG9naW4sICI+MWY6cGg6IiwgVE9ZRkxBR19CSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBMT0dJTgorICBib29sICJsb2dpbiIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX1NIQURPVworICBoZWxwCisgICAgdXNhZ2U6IGxvZ2luIFstcF0gWy1oIGhvc3RdIFstZiBVU0VSTkFNRV0gW1VTRVJOQU1FXQorCisgICAgTG9nIGluIGFzIGEgdXNlciwgcHJvbXB0aW5nIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgbmVjZXNzYXJ5LgorCisgICAgLXAJUHJlc2VydmUgZW52aXJvbm1lbnQKKyAgICAtaAlUaGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QgZm9yIHRoaXMgbG9naW4KKyAgICAtZglsb2dpbiBhcyBVU0VSTkFNRSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uCisqLworCisjZGVmaW5lIEZPUl9sb2dpbgorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqaG9zdG5hbWU7CisgIGNoYXIgKnVzZXJuYW1lOworCisgIGludCBsb2dpbl90aW1lb3V0LCBsb2dpbl9mYWlsX3RpbWVvdXQ7CispCisKK3N0YXRpYyB2b2lkIGxvZ2luX3RpbWVvdXRfaGFuZGxlcihpbnQgc2lnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworICBwcmludGYoIlxuTG9naW4gdGltZWQgb3V0IGFmdGVyICVkIHNlY29uZHMuXG4iLCBUVC5sb2dpbl90aW1lb3V0KTsKKyAgZXhpdCgwKTsKK30KKwordm9pZCBsb2dpbl9tYWluKHZvaWQpCit7CisgIGNoYXIgKmZvcmJpZFtdID0geworICAgICJCQVNIX0VOViIsICJFTlYiLCAiSE9NRSIsICJJRlMiLCAiTERfTElCUkFSWV9QQVRIIiwgIkxEX1BSRUxPQUQiLAorICAgICJMRF9UUkFDRV9MT0FERURfT0JKRUNUUyIsICJMRF9CSU5EX05PVyIsICJMRF9BT1VUX0xJQlJBUllfUEFUSCIsCisgICAgIkxEX0FPVVRfUFJFTE9BRCIsICJMRF9OT1dBUk4iLCAiTERfS0VFUERJUiIsICJTSEVMTCIKKyAgfTsKKyAgaW50IGhoID0gdG95cy5vcHRmbGFncyZGTEFHX2gsIGNvdW50LCB0dHk7CisgIGNoYXIgdXVbMzNdLCAqdXNlcm5hbWUsICpwYXNzID0gMCwgKnNzOworICBzdHJ1Y3QgcGFzc3dkICpwd2QgPSAwOworCisgIGZvciAodHR5PTA7IHR0eTwzOyB0dHkrKykgaWYgKGlzYXR0eSh0dHkpKSBicmVhazsKKyAgaWYgKHR0eSA9PSAzKSBlcnJvcl9leGl0KCJubyB0dHkiKTsKKworICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBUlJBWV9MRU4oZm9yYmlkKTsgY291bnQrKykgdW5zZXRlbnYoZm9yYmlkW2NvdW50XSk7CisKKyAgb3BlbmxvZygibG9naW4iLCBMT0dfUElEIHwgTE9HX0NPTlMsIExPR19BVVRIKTsKKyAgeHNpZ25hbChTSUdBTFJNLCBsb2dpbl90aW1lb3V0X2hhbmRsZXIpOworCisgIGlmIChUVC51c2VybmFtZSkgdXNlcm5hbWUgPSBUVC51c2VybmFtZTsKKyAgZWxzZSB1c2VybmFtZSA9ICp0b3lzLm9wdGFyZ3M7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspIHsKKyAgICBhbGFybShUVC5sb2dpbl90aW1lb3V0ID0gNjApOworICAgIHRjZmx1c2goMCwgVENJRkxVU0gpOworCisgICAgaWYgKCF1c2VybmFtZSkgeworICAgICAgaW50IGk7CisKKyAgICAgIG1lbXNldCh1c2VybmFtZSA9IHV1LCAwLCBzaXplb2YodXUpKTsKKyAgICAgIGdldGhvc3RuYW1lKHV1LCBzaXplb2YodXUpLTEpOworICAgICAgcHJpbnRmKCIlcyVzbG9naW46ICIsICp1dSA/IHV1IDogIiIsICp1dSA/ICIgIiA6ICIiKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICBpZighZmdldHModXUsIHNpemVvZih1dSktMSwgc3RkaW4pKSBfZXhpdCgxKTsKKworICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIFxuIGFuZCBzbyBvbgorICAgICAgZm9yIChpID0gMDsgaTxzaXplb2YodXUpOyBpKyspIGlmICh1dVtpXTw9JyAnIHx8IHV1W2ldPT0nOicpIHV1W2ldPTA7CisgICAgICBpZiAoISp1dSkgeworICAgICAgICB1c2VybmFtZSA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHVzZXIgZXhpc3RzIGFuZCBpc24ndCBsb2NrZWQKKyAgICBwd2QgPSBnZXRwd25hbSh1c2VybmFtZSk7CisgICAgaWYgKHB3ZCAmJiAqcHdkLT5wd19wYXNzd2QgIT0gJyEnICYmICpwd2QtPnB3X3Bhc3N3ZCAhPSAnKicpIHsKKworICAgICAgLy8gUHJlLWF1dGhlbnRpY2F0ZWQgb3IgcGFzc3dvcmRsZXNzCisgICAgICBpZiAoVFQudXNlcm5hbWUgfHwgISpwd2QtPnB3X3Bhc3N3ZCkgYnJlYWs7CisKKyAgICAgIC8vIGZldGNoIHNoYWRvdyBwYXNzd29yZCBpZiBuZWNlc3NhcnkKKyAgICAgIGlmICgqKHBhc3MgPSBwd2QtPnB3X3Bhc3N3ZCkgPT0gJ3gnKSB7CisgICAgICAgIHN0cnVjdCBzcHdkICpzcHdkID0gZ2V0c3BuYW0gKHVzZXJuYW1lKTsKKworICAgICAgICBpZiAoc3B3ZCkgcGFzcyA9IHNwd2QtPnNwX3B3ZHA7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChUVC51c2VybmFtZSkgZXJyb3JfZXhpdCgiYmFkIC1mICclcyciLCBUVC51c2VybmFtZSk7CisKKyAgICAvLyBWZXJpZnkgcGFzc3dvcmQuIChQcm9tcHQgZm9yIHBhc3N3b3JkIF9iZWZvcmVfIGNoZWNraW5nIGRpc2FibGUgc3RhdGUuKQorICAgIGlmICghcmVhZF9wYXNzd29yZCh0b3lidWYsIHNpemVvZih0b3lidWYpLCAiUGFzc3dvcmQ6ICIpKSB7CisgICAgICBpbnQgeCA9IHBhc3MgJiYgKHNzID0gY3J5cHQodG95YnVmLCBwYXNzKSkgJiYgIXN0cmNtcChwYXNzLCBzcyk7CisKKyAgICAgIC8vIHBhc3N3b3JkIGdvIGJ5ZS1ieWUgbm93LgorICAgICAgbWVtc2V0KHRveWJ1ZiwgMCwgc2l6ZW9mKHRveWJ1ZikpOworICAgICAgaWYgKHgpIGJyZWFrOworICAgIH0KKworICAgIHN5c2xvZyhMT0dfV0FSTklORywgImludmFsaWQgcGFzc3dvcmQgZm9yICclcycgb24gJXMgJXMlcyIsIHB3ZC0+cHdfbmFtZSwKKyAgICAgIHR0eW5hbWUodHR5KSwgaGggPyAiZnJvbSAiIDogIiIsIGhoID8gVFQuaG9zdG5hbWUgOiAiIik7CisKKyAgICBzbGVlcCgzKTsKKyAgICBwdXRzKCJMb2dpbiBpbmNvcnJlY3QiKTsKKworICAgIHVzZXJuYW1lID0gMDsKKyAgICBwd2QgPSAwOworICB9CisKKyAgYWxhcm0oMCk7CisgIC8vIFRoaXMgaGFkIHBhc3N3b3JkIGRhdGEgaW4gaXQsIGFuZCB3ZSByZXVzZSBmb3IgbW90ZCBiZWxvdworICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisKKyAgaWYgKCFwd2QpIGVycm9yX2V4aXQoIm1heCByZXRyaWVzICgzKSIpOworCisgIC8vIENoZWNrIHR3aWNlIGJlY2F1c2UgInRoaXMgZmlsZSBleGlzdHMiIGlzIGEgc2VjdXJpdHkgdGVzdCwgYW5kIGluCisgIC8vIHRoZW9yeSBmaWxlaGFuZGxlIGV4aGF1c3Rpb24gb3Igb3RoZXIgZXJyb3IgY291bGQgbWFrZSBvcGVuL3JlYWQgZmFpbC4KKyAgaWYgKHB3ZC0+cHdfdWlkICYmICFhY2Nlc3MoIi9ldGMvbm9sb2dpbiIsIFJfT0spKSB7CisgICAgc3MgPSByZWFkZmlsZSgiL2V0Yy9ub2xvZ2luIiwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgcHV0cyAoKHNzICYmICpzcykgPyBzcyA6ICJub2xvZ2luIik7CisgICAgZnJlZShzcyk7CisgICAgdG95cy5leGl0dmFsID0gMTsKKworICAgIHJldHVybjsKKyAgfQorCisgIHhzZXR1c2VyKHB3ZCk7CisKKyAgaWYgKGNoZGlyKHB3ZC0+cHdfZGlyKSkgcHJpbnRmKCJiYWQgJEhPTUU6ICVzXG4iLCBwd2QtPnB3X2Rpcik7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3ApKSB7CisgICAgY2hhciAqdGVybSA9IGdldGVudigiVEVSTSIpOworCisgICAgY2xlYXJlbnYoKTsKKyAgICBpZiAodGVybSkgc2V0ZW52KCJURVJNIiwgdGVybSwgMSk7CisgIH0KKworICBzZXRlbnYoIlVTRVIiLCBwd2QtPnB3X25hbWUsIDEpOworICBzZXRlbnYoIkxPR05BTUUiLCBwd2QtPnB3X25hbWUsIDEpOworICBzZXRlbnYoIkhPTUUiLCBwd2QtPnB3X2RpciwgMSk7CisgIHNldGVudigiU0hFTEwiLCBwd2QtPnB3X3NoZWxsLCAxKTsKKworICAvLyBNZXNzYWdlIG9mIHRoZSBkYXkKKyAgaWYgKChzcyA9IHJlYWRmaWxlKCIvZXRjL21vdGQiLCAwLCAwKSkpIHsKKyAgICBwdXRzKHNzKTsKKyAgICBmcmVlKHNzKTsKKyAgfQorCisgIHN5c2xvZyhMT0dfSU5GTywgIiVzIGxvZ2dlZCBpbiBvbiAlcyAlcyAlcyIsIHB3ZC0+cHdfbmFtZSwKKyAgICB0dHluYW1lKHR0eSksIGhoID8gImZyb20iIDogIiIsIGhoID8gVFQuaG9zdG5hbWUgOiAiIik7CisKKyAgLy8gbm90IHVzaW5nIHhleGVjKCksIGxvZ2luIGNhbGxzIGFic29sdXRlIHBhdGggZnJvbSBmaWxlc3lzdGVtIHNvIG11c3QgZXhlYygpCisgIGV4ZWNsKHB3ZC0+cHdfc2hlbGwsIHhtcHJpbnRmKCItJXMiLCBwd2QtPnB3X3NoZWxsKSwgKGNoYXIgKikwKTsKKyAgcGVycm9yX2V4aXQoImV4ZWMgc2hlbGwgJyVzJyIsIHB3ZC0+cHdfc2hlbGwpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbG9zZXR1cC5jIGIvdG95Ym94L3RveXMvb3RoZXIvbG9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDY3YTkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9sb3NldHVwLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIGxvc2V0dXAuYyAtIExvb3BiYWNrIHNldHVwCisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBObyBzdGFuZGFyZC4gKFNpZ2guKQorCitVU0VfTE9TRVRVUChORVdUT1kobG9zZXR1cCwgIj4yUyhzaXplbGltaXQpI3Moc2hvdylybyNqOmZkY2FbIWFmal0iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgTE9TRVRVUAorICBib29sICJsb3NldHVwIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBsb3NldHVwIFstY2Ryc10gWy1vIE9GRlNFVF0gWy1TIFNJWkVdIHstZCBERVZJQ0UuLi58LWogRklMRXwtYWZ8e0RFVklDRSBGSUxFfX0KKworICAgIEFzc29jaWF0ZSBhIGxvb3BiYWNrIGRldmljZSB3aXRoIGEgZmlsZSwgb3Igc2hvdyBjdXJyZW50IGZpbGUgKGlmIGFueSkKKyAgICBhc3NvY2lhdGVkIHdpdGggYSBsb29wIGRldmljZS4KKworICAgIEluc3RlYWQgb2YgYSBkZXZpY2U6CisgICAgLWEJSXRlcmF0ZSB0aHJvdWdoIGFsbCBsb29wYmFjayBkZXZpY2VzCisgICAgLWYJRmluZCBmaXJzdCB1bnVzZWQgbG9vcCBkZXZpY2UgKG1heSBjcmVhdGUgb25lKQorICAgIC1qCUl0ZXJhdGUgdGhyb3VnaCBhbGwgbG9vcGJhY2sgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggRklMRQorCisgICAgZXhpc3Rpbmc6CisgICAgLWMJQ2hlY2sgY2FwYWNpdHkgKGZpbGUgc2l6ZSBjaGFuZ2VkKQorICAgIC1kCURldGFjaCBsb29wYmFjayBkZXZpY2UKKworICAgIG5ldzoKKyAgICAtcwlTaG93IGRldmljZSBuYW1lIChhbGlhcyAtLXNob3cpCisgICAgLW8JU3RhcnQgYXNzb2NhdGlvbiBhdCBPRkZTRVQgaW50byBGSUxFCisgICAgLXIJUmVhZCBvbmx5CisgICAgLVMJTGltaXQgU0laRSBvZiBsb29wYmFjayBhc3NvY2lhdGlvbiAoYWxpYXMgLS1zaXplbGltaXQpCisqLworCisjZGVmaW5lIEZPUl9sb3NldHVwCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPGxpbnV4L2xvb3AuaD4KKworR0xPQkFMUygKKyAgY2hhciAqamZpbGU7CisgIGxvbmcgb2Zmc2V0OworICBsb25nIHNpemU7CisKKyAgaW50IG9wZW5mbGFnczsKKyAgZGV2X3QgamRldjsKKyAgaW5vX3QgamlubzsKKykKKworLyoKK3RvZG86IGJhc2ljIC9kZXYgZmlsZSBhc3NvY2lhdGlvbgorICBhc3NvY2lhdGUgREVWIEZJTEUKKyAgIy1hCisgIGNkZmpvc1MKKyAgYWxsb2NhdGUgbmV3IGxvb3AgZGV2aWNlOgorICAgIC9kZXYvbG9vcC1jb250cm9sCisgICAgaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTEvNy8yNi8xNDgKKyovCisKKy8vIC1mOiAqZGV2aWNlIGlzIE5VTEwKKworLy8gUGVyZm9ybSByZXF1ZXN0ZWQgb3BlcmF0aW9uIG9uIG9uZSBkZXZpY2UuIFJldHVybnMgMSBpZiBoYW5kbGVkLCAwIGlmIGVycm9yCitzdGF0aWMgdm9pZCBsb29wYmFja19zZXR1cChjaGFyICpkZXZpY2UsIGNoYXIgKmZpbGUpCit7CisgIHN0cnVjdCBsb29wX2luZm82NCAqbG9vcCA9ICh2b2lkICopKHRveWJ1ZiszMik7CisgIGludCBsZmQgPSAtMSwgZmZkID0gZmZkOworICB1bnNpZ25lZCBmbGFncyA9IHRveXMub3B0ZmxhZ3M7CisKKyAgLy8gT3BlbiBmaWxlIChmZmQpIGFuZCBsb29wIGRldmljZSAobGZkKQorCisgIGlmIChmaWxlKSBmZmQgPSB4b3BlbihmaWxlLCBUVC5vcGVuZmxhZ3MpOworICBpZiAoIWRldmljZSkgeworICAgIGludCBpLCBjZmQgPSBvcGVuKCIvZGV2L2xvb3AtY29udHJvbCIsIE9fUkRXUik7CisKKyAgICAvLyBXZSBhc3N1bWUgL2RldiBpcyBkZXZ0bXBmcyBzbyBkZXZpY2UgY3JlYXRpb24gaGFzIG5vIGxhZy4gT3RoZXJ3aXNlCisgICAgLy8ganVzdCBwcmVhbGxvY2F0ZSBsb29wIGRldmljZXMgYW5kIHN0YXkgd2l0aGluIHRoZW0uCisKKyAgICAvLyBtb3VudCAtbyBsb29wIGRlcGVuZHMgb24gZm91bmQgZGV2aWNlIGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0b3lidWYuCisgICAgaWYgKGNmZCAhPSAtMSkgeworICAgICAgaWYgKDAgPD0gKGkgPSBpb2N0bChjZmQsIDB4NEM4MikpKSAvLyBMT09QX0NUTF9HRVRfRlJFRQorICAgICAgICBzcHJpbnRmKGRldmljZSA9IHRveWJ1ZiwgIi9kZXYvbG9vcCVkIiwgaSk7CisgICAgICBjbG9zZShjZmQpOworICAgIH0KKyAgfQorCisgIGlmIChkZXZpY2UpIGxmZCA9IG9wZW4oZGV2aWNlLCBUVC5vcGVuZmxhZ3MpOworCisgIC8vIFN0YXQgdGhlIGxvb3AgZGV2aWNlIHRvIHNlZSBpZiB0aGVyZSdzIGEgY3VycmVudCBhc3NvY2lhdGlvbi4KKyAgbWVtc2V0KGxvb3AsIDAsIHNpemVvZihzdHJ1Y3QgbG9vcF9pbmZvNjQpKTsKKyAgaWYgKC0xID09IGxmZCB8fCBpb2N0bChsZmQsIExPT1BfR0VUX1NUQVRVUzY0LCBsb29wKSkgeworICAgIGlmIChlcnJubyA9PSBFTlhJTyAmJiAoZmxhZ3MgJiAoRkxBR19hfEZMQUdfaikpKSBnb3RvIGRvbmU7CisgICAgaWYgKGVycm5vICE9IEVOWElPIHx8ICFmaWxlKSB7CisgICAgICBwZXJyb3JfbXNnX3JhdyhkZXZpY2UgPyBkZXZpY2UgOiAiLWYiKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIH0KKworICAvLyBTa2lwIC1qIGZpbHRlcmVkIGRldmljZXMKKyAgaWYgKFRULmpmaWxlICYmIChsb29wLT5sb19kZXZpY2UgIT0gVFQuamRldiB8fCBsb29wLT5sb19pbm9kZSAhPSBUVC5qaW5vKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLy8gQ2hlY2sgc2l6ZSBvZiBmaWxlIG9yIGRlbGV0ZSBleGlzdGluZyBhc3NvY2lhdGlvbgorICBpZiAoZmxhZ3MgJiAoRkxBR19jfEZMQUdfZCkpIHsKKyAgICAvLyBUaGUgY29uc3RhbnQgaXMgTE9PUF9TRVRfQ0FQQUNJVFkKKyAgICBpZiAoaW9jdGwobGZkLCAoZmxhZ3MgJiBGTEFHX2MpID8gMHg0QzA3IDogTE9PUF9DTFJfRkQsIDApKSB7CisgICAgICBwZXJyb3JfbXNnX3JhdyhkZXZpY2UpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgLy8gQXNzb2NpYXRlIGZpbGUgd2l0aCB0aGlzIGRldmljZT8KKyAgfSBlbHNlIGlmIChmaWxlKSB7CisgICAgY2hhciAqcyA9IHhhYnNwYXRoKGZpbGUsIDEpOworCisgICAgaWYgKCFzKSBwZXJyb3JfZXhpdCgiZmlsZSIpOyAvLyBhbHJlYWR5IG9wZW5lZCwgYnV0IGlmIGRlbGV0ZWQgc2luY2UuLi4KKyAgICBpZiAoaW9jdGwobGZkLCBMT09QX1NFVF9GRCwgZmZkKSkgcGVycm9yX2V4aXQoIiVzPSVzIiwgZGV2aWNlLCBmaWxlKTsKKyAgICBsb29wLT5sb19vZmZzZXQgPSBUVC5vZmZzZXQ7CisgICAgbG9vcC0+bG9fc2l6ZWxpbWl0ID0gVFQuc2l6ZTsKKyAgICB4c3RybmNweSgoY2hhciAqKWxvb3AtPmxvX2ZpbGVfbmFtZSwgcywgTE9fTkFNRV9TSVpFKTsKKyAgICBzW0xPX05BTUVfU0laRS0xXSA9IDA7CisgICAgaWYgKGlvY3RsKGxmZCwgTE9PUF9TRVRfU1RBVFVTNjQsIGxvb3ApKSBwZXJyb3JfZXhpdCgiJXM9JXMiLCBkZXZpY2UsIGZpbGUpOworICAgIGlmIChmbGFncyAmIEZMQUdfcykgcHJpbnRmKCIlcyIsIGRldmljZSk7CisgICAgZnJlZShzKTsKKyAgfSBlbHNlIGlmIChmbGFncyAmIEZMQUdfZikgcHJpbnRmKCIlcyIsIGRldmljZSk7CisgIGVsc2UgeworICAgIHhwcmludGYoIiVzOiBbJTA0bGx4XTolbGx1ICglcykiLCBkZXZpY2UsIGxvb3AtPmxvX2RldmljZSwgbG9vcC0+bG9faW5vZGUsCisgICAgICBsb29wLT5sb19maWxlX25hbWUpOworICAgIGlmIChsb29wLT5sb19vZmZzZXQpIHhwcmludGYoIiwgb2Zmc2V0ICVsbHUiLCBsb29wLT5sb19vZmZzZXQpOworICAgIGlmIChsb29wLT5sb19zaXplbGltaXQpIHhwcmludGYoIiwgc2l6ZWxpbWl0ICVsbHUiLCBsb29wLT5sb19zaXplbGltaXQpOworICAgIHhwdXRjKCdcbicpOworICB9CisKK2RvbmU6CisgIGlmIChmaWxlKSBjbG9zZShmZmQpOworICBpZiAobGZkICE9IC0xKSBjbG9zZShsZmQpOworfQorCisvLyBQZXJmb3JtIGFuIGFjdGlvbiBvbiBhbGwgY3VycmVudGx5IGV4aXN0aW5nIGxvb3AgZGV2aWNlcworc3RhdGljIGludCBkYXNoX2Eoc3RydWN0IGRpcnRyZWUgKm5vZGUpCit7CisgIGNoYXIgKnMgPSBub2RlLT5uYW1lOworCisgIC8vIEluaXRpYWwgL2RldiBub2RlIG5lZWRzIHRvIHJlY3Vyc2UgZG93biBvbmUgbGV2ZWwsIHRoZW4gb25seSBsb29wWzAtOV0qCisgIGlmICgqcyA9PSAnLycpIHJldHVybiBESVJUUkVFX1JFQ1VSU0U7CisgIGlmIChzdHJuY21wKHMsICJsb29wIiwgNCkgfHwgIWlzZGlnaXQoc1s0XSkpIHJldHVybiAwOworCisgIHMgPSBkaXJ0cmVlX3BhdGgobm9kZSwgMCk7CisgIGxvb3BiYWNrX3NldHVwKHMsIDApOworICBmcmVlKHMpOworCisgIHJldHVybiAwOworfQorCit2b2lkIGxvc2V0dXBfbWFpbih2b2lkKQoreworICBjaGFyICoqczsKKworICBUVC5vcGVuZmxhZ3MgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfcikgPyBPX1JET05MWSA6IE9fUkRXUjsKKworICBpZiAoVFQuamZpbGUpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHhzdGF0KFRULmpmaWxlLCAmc3QpOworICAgIFRULmpkZXYgPSBzdC5zdF9kZXY7CisgICAgVFQuamlubyA9IHN0LnN0X2lubzsKKyAgfQorCisgIC8vIFdpdGgganVzdCBkZXZpY2UsIGRpc3BsYXkgY3VycmVudCBhc3NvY2lhdGlvbgorICAvLyAtYSwgLWYgc3Vic3RpdHV0ZSBmb3IgZGV2aWNlCisgIC8vIC1qIHN1YnN0aXR1dGUgZm9yIGRldmljZQorCisgIC8vIG5ldyBhc3NvY2lhdGlvbjogUyBzaXplIG8gb2Zmc2V0IHJzIC0gbmVlZCBhIGZpbGUKKyAgLy8gZXhpc3RpbmcgYXNzb2NpYXRpb246IGNkCisKKyAgLy8gLWYoZGMgRklMRSkKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZikgeworICAgIGlmICh0b3lzLm9wdGMgPiAxKSBwZXJyb3JfZXhpdCgibWF4IDEgYXJnIik7CisgICAgbG9vcGJhY2tfc2V0dXAoTlVMTCwgKnRveXMub3B0YXJncyk7CisgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIChGTEFHX2F8RkxBR19qKSkgeworICAgIGlmICh0b3lzLm9wdGMpIGVycm9yX2V4aXQoImJhZCBhcmdzIik7CisgICAgZGlydHJlZV9yZWFkKCIvZGV2IiwgZGFzaF9hKTsKKyAgLy8gRG8gd2UgbmVlZCBvbmUgREVWSUNFIGFyZ3VtZW50PworICB9IGVsc2UgeworICAgIGNoYXIgKmZpbGUgPSAodG95cy5vcHRmbGFncyAmIChGTEFHX2R8RkxBR19jKSkgPyBOVUxMIDogdG95cy5vcHRhcmdzWzFdOworCisgICAgaWYgKCF0b3lzLm9wdGMgfHwgKGZpbGUgJiYgdG95cy5vcHRjICE9IDIpKSAKKyAgICAgIGhlbHBfZXhpdCgibmVlZHMgJWQgYXJnJXMiLCAxKyEhZmlsZSwgZmlsZSA/ICJzIiA6ICIiKTsKKyAgICBmb3IgKHMgPSB0b3lzLm9wdGFyZ3M7ICpzOyBzKyspIHsKKyAgICAgIGxvb3BiYWNrX3NldHVwKCpzLCBmaWxlKTsKKyAgICAgIGlmIChmaWxlKSBicmVhazsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL2xzYXR0ci5jIGIvdG95Ym94L3RveXMvb3RoZXIvbHNhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViMTRiZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2xzYXR0ci5jCkBAIC0wLDAgKzEsMzEzIEBACisvKiBsc2F0dHIuYyAtIExpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAyMDEzIFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkLgorCitVU0VfTFNBVFRSKE5FV1RPWShsc2F0dHIsICJ2bGRhUiIsIFRPWUZMQUdfQklOKSkKK1VTRV9DSEFUVFIoTkVXVE9ZKGNoYXR0ciwgTlVMTCwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgTFNBVFRSCisgIGJvb2wgImxzYXR0ciIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbHNhdHRyIFstUmFkbHZdIFtGaWxlcy4uLl0KKworICAgIExpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCisgICAgLVIgUmVjdXJzaXZlbHkgbGlzdCBhdHRyaWJ1dGVzIG9mIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBjb250ZW50cy4KKyAgICAtYSBMaXN0IGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcywgaW5jbHVkaW5nIGZpbGVzIHRoYXQgc3RhcnQgd2l0aCAnLicuCisgICAgLWQgTGlzdCBkaXJlY3RvcmllcyBsaWtlIG90aGVyIGZpbGVzLCByYXRoZXIgdGhhbiBsaXN0aW5nIHRoZWlyIGNvbnRlbnRzLgorICAgIC1sIExpc3QgbG9uZyBmbGFnIG5hbWVzLgorICAgIC12IExpc3QgdGhlIGZpbGUncyB2ZXJzaW9uL2dlbmVyYXRpb24gbnVtYmVyLgorCitjb25maWcgQ0hBVFRSCisgIGJvb2wgImNoYXR0ciIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogY2hhdHRyIFstUl0gWy0rPUFhY0RkaWpzU3RUdV0gWy12IHZlcnNpb25dIFtGaWxlLi4uXQorCisgICAgQ2hhbmdlIGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKworICAgIE9wZXJhdG9yczoKKyAgICAgICctJyBSZW1vdmUgYXR0cmlidXRlcy4KKyAgICAgICcrJyBBZGQgYXR0cmlidXRlcy4KKyAgICAgICc9JyBTZXQgYXR0cmlidXRlcy4KKworICAgIEF0dHJpYnV0ZXM6CisgICAgICBBICBEb24ndCB0cmFjayBhdGltZS4KKyAgICAgIGEgIEFwcGVuZCBtb2RlIG9ubHkuCisgICAgICBjICBFbmFibGUgY29tcHJlc3MuCisgICAgICBEICBXcml0ZSBkaXIgY29udGVudHMgc3luY2hyb25vdXNseS4KKyAgICAgIGQgIERvbid0IGJhY2t1cCB3aXRoIGR1bXAuCisgICAgICBpICBDYW5ub3QgYmUgbW9kaWZpZWQgKGltbXV0YWJsZSkuCisgICAgICBqICBXcml0ZSBhbGwgZGF0YSB0byBqb3VybmFsIGZpcnN0LgorICAgICAgcyAgWmVybyBkaXNrIHN0b3JhZ2Ugd2hlbiBkZWxldGVkLgorICAgICAgUyAgV3JpdGUgZmlsZSBjb250ZW50cyBzeW5jaHJvbm91c2x5LgorICAgICAgdCAgRGlzYWJsZSB0YWlsLW1lcmdpbmcgb2YgcGFydGlhbCBibG9ja3Mgd2l0aCBvdGhlciBmaWxlcy4KKyAgICAgIHUgIEFsbG93IGZpbGUgdG8gYmUgdW5kZWxldGVkLgorICAgICAgLVIgUmVjdXJzZS4KKyAgICAgIC12IFNldCB0aGUgZmlsZSdzIHZlcnNpb24vZ2VuZXJhdGlvbiBudW1iZXIuCisKKyovCisjZGVmaW5lIEZPUl9sc2F0dHIKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworc3RhdGljIHN0cnVjdCBleHQyX2F0dHIgeworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBsb25nIGZsYWc7CisgIGNoYXIgb3B0OworfSBlMmF0dHJzW10gPSB7CisgIHsiU2VjdXJlX0RlbGV0aW9uIiwgICAgICAgICAgICAgICBGU19TRUNSTV9GTCwgICAgICAgICdzJ30sIC8vIFNlY3VyZSBkZWxldGlvbgorICB7IlVuZGVsZXRlIiwgICAgICAgICAgICAgICAgICAgICAgRlNfVU5STV9GTCwgICAgICAgICAndSd9LCAvLyBVbmRlbGV0ZQorICB7IkNvbXByZXNzaW9uX1JlcXVlc3RlZCIsICAgICAgICAgRlNfQ09NUFJfRkwsICAgICAgICAnYyd9LCAvLyBDb21wcmVzcyBmaWxlCisgIHsiU3luY2hyb25vdXNfVXBkYXRlcyIsICAgICAgICAgICBGU19TWU5DX0ZMLCAgICAgICAgICdTJ30sIC8vIFN5bmNocm9ub3VzIHVwZGF0ZXMKKyAgeyJJbW11dGFibGUiLCAgICAgICAgICAgICAgICAgICAgIEZTX0lNTVVUQUJMRV9GTCwgICAgJ2knfSwgLy8gSW1tdXRhYmxlIGZpbGUKKyAgeyJBcHBlbmRfT25seSIsICAgICAgICAgICAgICAgICAgIEZTX0FQUEVORF9GTCwgICAgICAgJ2EnfSwgLy8gd3JpdGVzIHRvIGZpbGUgbWF5IG9ubHkgYXBwZW5kCisgIHsiTm9fRHVtcCIsICAgICAgICAgICAgICAgICAgICAgICBGU19OT0RVTVBfRkwsICAgICAgICdkJ30sIC8vIGRvIG5vdCBkdW1wIGZpbGUKKyAgeyJOb19BdGltZSIsICAgICAgICAgICAgICAgICAgICAgIEZTX05PQVRJTUVfRkwsICAgICAgJ0EnfSwgLy8gZG8gbm90IHVwZGF0ZSBhdGltZQorICB7IkluZGV4ZWRfZGlyZWN0b3J5IiwgICAgICAgICAgICAgRlNfSU5ERVhfRkwsICAgICAgICAnSSd9LCAvLyBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5CisgIHsiSm91cm5hbGVkX0RhdGEiLCAgICAgICAgICAgICAgICBGU19KT1VSTkFMX0RBVEFfRkwsICdqJ30sIC8vIGZpbGUgZGF0YSBzaG91bGQgYmUgam91cm5hbGVkCisgIHsiTm9fVGFpbG1lcmdpbmciLCAgICAgICAgICAgICAgICBGU19OT1RBSUxfRkwsICAgICAgICd0J30sIC8vIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZAorICB7IlN5bmNocm9ub3VzX0RpcmVjdG9yeV9VcGRhdGVzIiwgRlNfRElSU1lOQ19GTCwgICAgICAnRCd9LCAvLyBkaXJzeW5jIGJlaGF2aW91ciAoZGlyZWN0b3JpZXMgb25seSkKKyAgeyJUb3Bfb2ZfRGlyZWN0b3J5X0hpZXJhcmNoaWVzIiwgIEZTX1RPUERJUl9GTCwgICAgICAgJ1QnfSwgLy8gVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcworICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAgIDB9LAorfTsKKworLy8gR2V0IGZpbGUgZmxhZ3Mgb24gYSBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCitzdGF0aWMgaW50IGV4dDJfZ2V0ZmxhZyhpbnQgZmQsIHN0cnVjdCBzdGF0ICpzYiwgdW5zaWduZWQgbG9uZyAqZmxhZykKK3sKKyAgaWYoIVNfSVNSRUcoc2ItPnN0X21vZGUpICYmICFTX0lTRElSKHNiLT5zdF9tb2RlKSkgeworICAgIGVycm5vID0gRU9QTk9UU1VQUDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIChpb2N0bChmZCwgRlNfSU9DX0dFVEZMQUdTLCAodm9pZCopZmxhZykpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9maWxlX2F0dHIoY2hhciAqcGF0aCkKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnID0gMCwgdmVyc2lvbiA9IDA7CisgIGludCBmZDsKKyAgc3RydWN0IHN0YXQgc2I7CisKKyAgaWYgKCFzdGF0KHBhdGgsICZzYikgJiYgIVNfSVNSRUcoc2Iuc3RfbW9kZSkgJiYgIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICBlcnJubyA9IEVPUE5PVFNVUFA7CisgICAgZ290byBMQUJFTDE7CisgIH0KKyAgaWYgKC0xID09IChmZD1vcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19OT05CTE9DSykpKSBnb3RvIExBQkVMMTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgeyAKKyAgICBpZiAoaW9jdGwoZmQsIEZTX0lPQ19HRVRWRVJTSU9OLCAodm9pZCopJnZlcnNpb24pIDwgMCkgZ290byBMQUJFTDI7CisgICAgeHByaW50ZigiJTVsdSAiLCB2ZXJzaW9uKTsKKyAgfQorCisgIGlmIChleHQyX2dldGZsYWcoZmQsICZzYiwgJmZsYWcpIDwgMCkgcGVycm9yX21zZygicmVhZGluZyBmbGFncyAnJXMnIiwgcGF0aCk7CisgIGVsc2UgeworICAgIHN0cnVjdCBleHQyX2F0dHIgKnB0ciA9IGUyYXR0cnM7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfbCkgeworICAgICAgaW50IG5hbWVfZm91bmQgPSAwOworCisgICAgICB4cHJpbnRmKCIlLTUwcyAiLCBwYXRoKTsKKyAgICAgIGZvciAoOyBwdHItPm5hbWU7IHB0cisrKSB7CisgICAgICAgIGlmIChmbGFnICYgcHRyLT5mbGFnKSB7CisgICAgICAgICAgaWYgKG5hbWVfZm91bmQpIHhwcmludGYoIiwgIik7IC8vZm9yIGZvcm1hdHRpbmcuCisgICAgICAgICAgeHByaW50ZigiJXMiLCBwdHItPm5hbWUpOworICAgICAgICAgIG5hbWVfZm91bmQgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIW5hbWVfZm91bmQpIHhwcmludGYoIi0tLSIpOworICAgICAgeHB1dGMoJ1xuJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgIGZvciAoOyBwdHItPm5hbWU7IHB0cisrKQorICAgICAgICB0b3lidWZbaW5kZXgrK10gPSAoZmxhZyAmIHB0ci0+ZmxhZykgPyBwdHItPm9wdCA6ICctJzsKKyAgICAgIHRveWJ1ZltpbmRleF0gPSAnXDAnOworICAgICAgeHByaW50ZigiJXMgJXNcbiIsIHRveWJ1ZiwgcGF0aCk7CisgICAgfQorICB9CisgIHhjbG9zZShmZCk7CisgIHJldHVybjsKK0xBQkVMMjogeGNsb3NlKGZkKTsKK0xBQkVMMTogcGVycm9yX21zZygicmVhZGluZyAnJXMnIiwgcGF0aCk7Cit9CisKKy8vIEdldCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCitzdGF0aWMgaW50IHJldGVsbF9kaXIoc3RydWN0IGRpcnRyZWUgKnJvb3QpCit7CisgIGNoYXIgKmZwYXRoID0gTlVMTDsKKyAgCisgIGlmIChyb290LT5hZ2FpbikgeworICAgIHhwdXRjKCdcbicpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChTX0lTRElSKHJvb3QtPnN0LnN0X21vZGUpICYmICFyb290LT5wYXJlbnQpIAorICAgIHJldHVybiAoRElSVFJFRV9SRUNVUlNFIHwgRElSVFJFRV9DT01FQUdBSU4pOworCisgIGZwYXRoID0gZGlydHJlZV9wYXRoKHJvb3QsIE5VTEwpOworICAvL1NwZWNpYWwgY2FzZTogd2l0aCAnLWEnIG9wdGlvbiBhbmQgJy4nLycuLicgYWxzbyBpbmNsdWRlZCBpbiBwcmludGluZyBsaXN0LgorICBpZiAoKHJvb3QtPm5hbWVbMF0gIT0gJy4nKSB8fCAodG95cy5vcHRmbGFncyAmIEZMQUdfYSkpIHsKKyAgICBwcmludF9maWxlX2F0dHIoZnBhdGgpOworICAgIGlmIChTX0lTRElSKHJvb3QtPnN0LnN0X21vZGUpICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19SKQorICAgICAgICAmJiBkaXJ0cmVlX25vdGRvdGRvdChyb290KSkgeworICAgICAgeHByaW50ZigiXG4lczpcbiIsIGZwYXRoKTsKKyAgICAgIGZyZWUoZnBhdGgpOworICAgICAgcmV0dXJuIChESVJUUkVFX1JFQ1VSU0UgfCBESVJUUkVFX0NPTUVBR0FJTik7CisgICAgfQorICB9CisgIGZyZWUoZnBhdGgpOworICByZXR1cm4gMDsKK30KKwordm9pZCBsc2F0dHJfbWFpbih2b2lkKQoreworICBpZiAoISp0b3lzLm9wdGFyZ3MpIGRpcnRyZWVfcmVhZCgiLiIsIHJldGVsbF9kaXIpOworICBlbHNlCisgICAgZm9yICg7ICp0b3lzLm9wdGFyZ3M7ICB0b3lzLm9wdGFyZ3MrKykgeworICAgICAgc3RydWN0IHN0YXQgc2I7CisKKyAgICAgIGlmIChsc3RhdCgqdG95cy5vcHRhcmdzLCAmc2IpKSBwZXJyb3JfbXNnKCJzdGF0ICclcyciLCAqdG95cy5vcHRhcmdzKTsKKyAgICAgIGVsc2UgaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSkKKyAgICAgICAgZGlydHJlZV9yZWFkKCp0b3lzLm9wdGFyZ3MsIHJldGVsbF9kaXIpOworICAgICAgZWxzZSBwcmludF9maWxlX2F0dHIoKnRveXMub3B0YXJncyk7Ly8gdG8gaGFuZGxlICIuL0ZpbGVuYW1lIiBvciAiLi9EaXIiCisgICAgfQorfQorCisvLyBTd2l0Y2ggZ2VhcnMgZnJvbSBsc2F0dHIgdG8gY2hhdHRyLgorI2RlZmluZSBDTEVBTlVQX2xzYXR0cgorI2RlZmluZSBGT1JfY2hhdHRyCisjaW5jbHVkZSAiZ2VuZXJhdGVkL2ZsYWdzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgX2NoYXR0ciB7CisgIHVuc2lnbmVkIGxvbmcgYWRkLCBybSwgc2V0LCB2ZXJzaW9uOworICB1bnNpZ25lZCBjaGFyIHZmbGFnLCByZWN1cnNpdmU7Cit9IGNoYXR0cjsKKworLy8gU2V0IGZpbGUgZmxhZ3Mgb24gYSBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCitzdGF0aWMgaW5saW5lIGludCBleHQyX3NldGZsYWcoaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc2IsIHVuc2lnbmVkIGxvbmcgZmxhZykKK3sKKyAgaWYgKCFTX0lTUkVHKHNiLT5zdF9tb2RlKSAmJiAhU19JU0RJUihzYi0+c3RfbW9kZSkpIHsKKyAgICBlcnJubyA9IEVPUE5PVFNVUFA7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAoaW9jdGwoZmQsIEZTX0lPQ19TRVRGTEFHUywgKHZvaWQqKSZmbGFnKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9mbGFnX3ZhbChjaGFyIGNoKQoreworICBzdHJ1Y3QgZXh0Ml9hdHRyICpwdHIgPSBlMmF0dHJzOworCisgIGZvciAoOyBwdHItPm5hbWU7IHB0cisrKQorICAgIGlmIChwdHItPm9wdCA9PSBjaCkgcmV0dXJuIHB0ci0+ZmxhZzsKKyAgaGVscF9leGl0KCJiYWQgJyVjJyIsIGNoKTsKK30KKworLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFuZCBmaWxsIHRoZSBjaGF0dHIgc3RydWN0dXJlLgorc3RhdGljIHZvaWQgcGFyc2VfY21kbGluZV9hcmcoY2hhciAqKiphcmd2KQoreworICBjaGFyICphcmcgPSAqKmFyZ3YsICpwdHIgPSBOVUxMOworCisgIHdoaWxlIChhcmcpIHsKKyAgICBzd2l0Y2ggKGFyZ1swXSkgeworICAgICAgY2FzZSAnLSc6CisgICAgICAgIGZvciAocHRyID0gKythcmc7ICpwdHI7IHB0cisrKSB7CisgICAgICAgICAgaWYgKCpwdHIgPT0gJ1InKSB7CisgICAgICAgICAgICBjaGF0dHIucmVjdXJzaXZlID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoKnB0ciA9PSAndicpIHsvLyBnZXQgdmVyc2lvbiBmcm9tIG5leHQgYXJndi4KKyAgICAgICAgICAgIGNoYXIgKmVuZHB0cjsKKworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgYXJnID0gKigqYXJndiArPSAxKTsKKyAgICAgICAgICAgIGlmICghYXJnKSBoZWxwX2V4aXQoImJhZCAtdiIpOworICAgICAgICAgICAgaWYgKCphcmcgPT0gJy0nKSBwZXJyb3JfZXhpdCgiSW52YWxpZCBOdW1iZXIgJyVzJyIsIGFyZyk7CisgICAgICAgICAgICBjaGF0dHIudmVyc2lvbiA9IHN0cnRvdWwoYXJnLCAmZW5kcHRyLCAwKTsKKyAgICAgICAgICAgIGlmIChlcnJubyB8fCAqZW5kcHRyKSBwZXJyb3JfZXhpdCgiYmFkIHZlcnNpb24gJyVzJyIsIGFyZyk7CisgICAgICAgICAgICBjaGF0dHIudmZsYWcgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIGNoYXR0ci5ybSB8PSBnZXRfZmxhZ192YWwoKnB0cik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcrJzoKKyAgICAgICAgZm9yIChwdHIgPSArK2FyZzsgKnB0cjsgcHRyKyspCisgICAgICAgICAgY2hhdHRyLmFkZCB8PSBnZXRfZmxhZ192YWwoKnB0cik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPSc6CisgICAgICAgIGZvciAocHRyID0gKythcmc7ICpwdHI7IHB0cisrKQorICAgICAgICAgIGNoYXR0ci5zZXQgfD0gZ2V0X2ZsYWdfdmFsKCpwdHIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IHJldHVybjsKKyAgICB9CisgICAgYXJnID0gKigqYXJndiArPSAxKTsKKyAgfQorfQorCisvLyBVcGRhdGUgYXR0cmlidXRlIG9mIGdpdmVuIGZpbGUuCitzdGF0aWMgaW50IHVwZGF0ZV9hdHRyKHN0cnVjdCBkaXJ0cmVlICpyb290KQoreworICB1bnNpZ25lZCBsb25nIGZ2YWwgPSAwOworICBjaGFyICpmcGF0aCA9IE5VTEw7CisgIGludCBmZDsKKworICBpZiAoIWRpcnRyZWVfbm90ZG90ZG90KHJvb3QpKSByZXR1cm4gMDsKKworICAvKgorICAgKiBpZiBmaWxlIGlzIGEgbGluayBhbmQgcmVjdXJzaXZlIGlzIHNldCBvciBmaWxlIGlzIG5vdCByZWd1bGFyK2xpbmsrZGlyCisgICAqIChsaWtlIGZpZm8gb3IgZGV2IGZpbGUpIHRoZW4gZXNjYXBlIHRoZSBmaWxlLgorICAgKi8KKyAgaWYgKChTX0lTTE5LKHJvb3QtPnN0LnN0X21vZGUpICYmIGNoYXR0ci5yZWN1cnNpdmUpCisgICAgfHwgKCFTX0lTUkVHKHJvb3QtPnN0LnN0X21vZGUpICYmICFTX0lTTE5LKHJvb3QtPnN0LnN0X21vZGUpCisgICAgICAmJiAhU19JU0RJUihyb290LT5zdC5zdF9tb2RlKSkpCisgICAgcmV0dXJuIDA7CisKKyAgZnBhdGggPSBkaXJ0cmVlX3BhdGgocm9vdCwgTlVMTCk7CisgIGlmICgtMSA9PSAoZmQ9b3BlbihmcGF0aCwgT19SRE9OTFkgfCBPX05PTkJMT0NLKSkpIHsKKyAgICBmcmVlKGZwYXRoKTsKKyAgICByZXR1cm4gRElSVFJFRV9BQk9SVDsKKyAgfQorICAvLyBHZXQgY3VycmVudCBhdHRyIG9mIGZpbGUuCisgIGlmIChleHQyX2dldGZsYWcoZmQsICYocm9vdC0+c3QpLCAmZnZhbCkgPCAwKSB7CisgICAgcGVycm9yX21zZygicmVhZCBmbGFncyBvZiAnJXMnIiwgZnBhdGgpOworICAgIGZyZWUoZnBhdGgpOworICAgIHhjbG9zZShmZCk7CisgICAgcmV0dXJuIERJUlRSRUVfQUJPUlQ7CisgIH0KKyAgaWYgKGNoYXR0ci5zZXQpIHsgLy8gZm9yICc9JyBvcGVyYXRvci4KKyAgICBpZiAoZXh0Ml9zZXRmbGFnKGZkLCAmKHJvb3QtPnN0KSwgY2hhdHRyLnNldCkgPCAwKQorICAgICAgcGVycm9yX21zZygic2V0dGluZyBmbGFncyAnJXMnIiwgZnBhdGgpOworICB9IGVsc2UgeyAvLyBmb3IgJy0nIC8gJysnIG9wZXJhdG9yLgorICAgIGZ2YWwgJj0gfihjaGF0dHIucm0pOworICAgIGZ2YWwgfD0gY2hhdHRyLmFkZDsKKyAgICBpZiAoIVNfSVNESVIocm9vdC0+c3Quc3RfbW9kZSkpIGZ2YWwgJj0gfkZTX0RJUlNZTkNfRkw7CisgICAgaWYgKGV4dDJfc2V0ZmxhZyhmZCwgJihyb290LT5zdCksIGZ2YWwpIDwgMCkKKyAgICAgIHBlcnJvcl9tc2coInNldHRpbmcgZmxhZ3MgJyVzJyIsIGZwYXRoKTsKKyAgfQorICBpZiAoY2hhdHRyLnZmbGFnKSB7IC8vIHNldCBmaWxlIHZlcnNpb24KKyAgICBpZiAoaW9jdGwoZmQsIEZTX0lPQ19TRVRWRVJTSU9OLCAodm9pZCopJmNoYXR0ci52ZXJzaW9uKSA8IDApCisgICAgICBwZXJyb3JfbXNnKCJ3aGlsZSBzZXR0aW5nIHZlcnNpb24gb24gJyVzJyIsIGZwYXRoKTsKKyAgfQorICBmcmVlKGZwYXRoKTsKKyAgeGNsb3NlKGZkKTsKKworICBpZiAoU19JU0RJUihyb290LT5zdC5zdF9tb2RlKSAmJiBjaGF0dHIucmVjdXJzaXZlKSByZXR1cm4gRElSVFJFRV9SRUNVUlNFOworICByZXR1cm4gMDsKK30KKwordm9pZCBjaGF0dHJfbWFpbih2b2lkKQoreworICBjaGFyICoqYXJndiA9IHRveXMub3B0YXJnczsKKworICBtZW1zZXQoJmNoYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBfY2hhdHRyKSk7CisgIHBhcnNlX2NtZGxpbmVfYXJnKCZhcmd2KTsKKyAgaWYgKCEqYXJndikgaGVscF9leGl0KCJubyBmaWxlIik7CisgIGlmIChjaGF0dHIuc2V0ICYmIChjaGF0dHIuYWRkIHx8IGNoYXR0ci5ybSkpCisgICAgZXJyb3JfZXhpdCgibm8gJz0nIHdpdGggJy0nIG9yICcrJyIpOworICBpZiAoY2hhdHRyLnJtICYgY2hhdHRyLmFkZCkgZXJyb3JfZXhpdCgic2V0L3Vuc2V0IHNhbWUgZmxhZyIpOworICBpZiAoIShjaGF0dHIuYWRkIHx8IGNoYXR0ci5ybSB8fCBjaGF0dHIuc2V0IHx8IGNoYXR0ci52ZmxhZykpCisgICAgZXJyb3JfZXhpdCgibmVlZCAnLXYnLCAnPScsICctJyBvciAnKyciKTsKKyAgZm9yICg7ICphcmd2OyBhcmd2KyspIGRpcnRyZWVfcmVhZCgqYXJndiwgdXBkYXRlX2F0dHIpOworICB0b3lzLmV4aXR2YWwgPSAwOyAvL2Fsd2F5cyBzZXQgc3VjY2VzcyBhdCB0aGlzIHBvaW50LgorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbHNtb2QuYyBiL3RveWJveC90b3lzL290aGVyL2xzbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxNjA0OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL2xzbW9kLmMKQEAgLTAsMCArMSwzNiBAQAorLyogbHNtb2QuYyAtIFNob3cgdGhlIHN0YXR1cyBvZiBtb2R1bGVzIGluIHRoZSBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBFbGllIERlIEJyYXV3ZXIgPGVsaWVkZWJyYXV3ZXJAZ21haWwuY29tPgorCitVU0VfTFNNT0QoTkVXVE9ZKGxzbW9kLCBOVUxMLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgTFNNT0QKKyAgYm9vbCAibHNtb2QiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGxzbW9kCisKKyAgICBEaXNwbGF5IHRoZSBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMsIHRoZWlyIHNpemVzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIGxzbW9kX21haW4odm9pZCkKK3sKKyAgY2hhciAqbW9kZmlsZSA9ICIvcHJvYy9tb2R1bGVzIjsKKyAgRklMRSAqIGZpbGUgPSB4Zm9wZW4obW9kZmlsZSwgInIiKTsKKworICB4cHJpbnRmKCIlLTIzcyBTaXplICBVc2VkIGJ5XG4iLCAiTW9kdWxlIik7CisKKyAgd2hpbGUgKGZnZXRzKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIGZpbGUpKSB7CisgICAgY2hhciAqbmFtZSA9IHN0cnRvayh0b3lidWYsICIgIiksICpzaXplID0gc3RydG9rKE5VTEwsICIgIiksCisgICAgICAgICAqcmVmY250ID0gc3RydG9rKE5VTEwsICIgIiksICp1c2VycyA9IHN0cnRvayhOVUxMLCAiICIpOworCisgICAgaWYodXNlcnMpIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4odXNlcnMpLTE7CisgICAgICBpZiAodXNlcnNbbGVuXSA9PSAnLCcgfHwgdXNlcnNbbGVuXSA9PSAnLScpIHVzZXJzW2xlbl0gPSAwOworICAgICAgeHByaW50ZigiJS0xOXMgJThzICAlcyAlc1xuIiwgbmFtZSwgc2l6ZSwgcmVmY250LCB1c2Vycyk7CisgICAgfSBlbHNlIHBlcnJvcl9leGl0KCJiYWQgJXMiLCBtb2RmaWxlKTsKKyAgfQorICBmY2xvc2UoZmlsZSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9sc3BjaS5jIGIvdG95Ym94L3RveXMvb3RoZXIvbHNwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY3MTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvbHNwY2kuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIGxzcGNpIC0gd3JpdHRlbiBieSBJc2FhYyBEdW5oYW0KKworVVNFX0xTUENJKE5FV1RPWShsc3BjaSwgImVta24iVVNFX0xTUENJX1RFWFQoIkBpOiIpLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBMU1BDSQorICBib29sICJsc3BjaSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbHNwY2kgWy1la21dCisKKyAgICBMaXN0IFBDSSBkZXZpY2VzLgorCisgICAgLWUJUHJpbnQgYWxsIDYgZGlnaXRzIGluIGNsYXNzCisgICAgLWsJUHJpbnQga2VybmVsIGRyaXZlcgorICAgIC1tCU1hY2hpbmUgcGFyc2VhYmxlIGZvcm1hdAorCitjb25maWcgTFNQQ0lfVEVYVAorICBib29sICJsc3BjaSByZWFkYWJsZSBvdXRwdXQiCisgIGRlcGVuZHMgb24gTFNQQ0kKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbHNwY2kgWy1uXSBbLWkgRklMRSBdCisKKyAgICAtbglOdW1lcmljIG91dHB1dCAocmVwZWF0IGZvciByZWFkYWJsZSBhbmQgbnVtZXJpYykKKyAgICAtaQlQQ0kgSUQgZGF0YWJhc2UgKGRlZmF1bHQgL3Vzci9zaGFyZS9taXNjL3BjaS5pZHMpCisKKyovCisKKyNkZWZpbmUgRk9SX2xzcGNpCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICppZHM7CisgIGxvbmcgbnVtZXJpYzsKKworICBGSUxFICpkYjsKKykKKworc3RhdGljIGludCBkb19sc3BjaShzdHJ1Y3QgZGlydHJlZSAqbmV3KQoreworICBjaGFyICpwID0gdG95YnVmLCAqdmVuZG9yID0gdG95YnVmKzksICpkZXZpY2UgPSB0b3lidWYrMTgsCisgICAgICAgZHJpdmVyWzI1Nl0sICp2YmlnID0gMCwgKmRiaWcgPSAwLCAqKmZpZWxkczsKKyAgaW50IGRpcmZkOworCisgIGlmICghbmV3LT5wYXJlbnQpIHJldHVybiBESVJUUkVFX1JFQ1VSU0U7CisKKyAgLy8gUGFyc2UgZGF0YSBvdXQgb2YgL3Byb2MKKworICBpZiAoLTEgPT0gKGRpcmZkID0gb3BlbmF0KGRpcnRyZWVfcGFyZW50ZmQobmV3KSwgbmV3LT5uYW1lLCBPX1JET05MWSkpKQorICAgIHJldHVybiAwOworCisgICpkcml2ZXIgPSAwOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaykKKyAgICByZWFkbGlua2F0MChkaXJmZCwgImRyaXZlciIsIGRyaXZlciwgc2l6ZW9mKGRyaXZlcikpOworCisgIGZvciAoZmllbGRzID0gKGNoYXIqW10peyJjbGFzcyIsICJ2ZW5kb3IiLCAiZGV2aWNlIiwgMH07ICpmaWVsZHM7IGZpZWxkcysrKSB7CisgICAgaW50IGZkLCBzaXplID0gNiArIDIqKCh0b3lzLm9wdGZsYWdzICYgRkxBR19lKSAmJiBwID09IHRveWJ1Zik7CisgICAgKnAgPSAwOworCisgICAgaWYgKC0xID09IChmZCA9IG9wZW5hdChkaXJmZCwgKmZpZWxkcywgT19SRE9OTFkpKSkgeworICAgICAgY2xvc2UoZGlyZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHhyZWFkYWxsKGZkLCBwLCBzaXplKTsKKyAgICBtZW1tb3ZlKHAsIHArMiwgc2l6ZSAtPSAyKTsKKyAgICBwW3NpemVdID0gMDsKKyAgICBjbG9zZShmZCk7CisgICAgcCArPSA5OworICB9CisKKyAgY2xvc2UoZGlyZmQpOworCisgIC8vIExvb2t1cC9kaXNwbGF5IGRhdGEgZnJvbSBwY2kuaWRzPworCisgIGlmIChDRkdfTFNQQ0lfVEVYVCAmJiBUVC5kYikgeworICAgIGlmIChUVC5udW1lcmljICE9IDEpIHsKKyAgICAgIGNoYXIgKnM7CisKKyAgICAgIGZzZWVrKFRULmRiLCAwLCBTRUVLX1NFVCk7CisgICAgICB3aGlsZSAoIXZiaWcgfHwgIWRiaWcpIHsKKyAgICAgICAgcyA9IHA7CisgICAgICAgIGlmICghZmdldHMocywgc2l6ZW9mKHRveWJ1ZiktKHAtdG95YnVmKS0xLCBUVC5kYikpIGJyZWFrOworICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHMrKzsKKyAgICAgICAgaWYgKCpzID09ICcjJykgY29udGludWU7CisgICAgICAgIGlmICh2YmlnICYmIHMgPT0gcCkgYnJlYWs7CisgICAgICAgIGlmIChzdHJzdGFydCgmcywgdmJpZyA/IGRldmljZSA6IHZlbmRvcikpIHsKKyAgICAgICAgICBpZiAodmJpZykgZGJpZyA9IHMrMjsKKyAgICAgICAgICBlbHNlIHZiaWcgPSBzKzI7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgICAgc1stMV0gPSAwOyAvLyB0cmltIGVuZGluZyBuZXdsaW5lCisgICAgICAgICAgcCA9IHMgKyAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKFRULm51bWVyaWMgPiAxKSB7CisgICAgICBwcmludGYoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX20pCisgICAgICAgID8gIiVzLCBcIiVzXCIgXCIlcyBbJXNdXCIgXCIlcyBbJXNdXCIiCisgICAgICAgIDogIiVzIENsYXNzICVzOiAlcyBbJXNdICVzIFslc10iLAorICAgICAgICBuZXctPm5hbWUrNSwgdG95YnVmLCB2YmlnID8gdmJpZyA6ICIiLCB2ZW5kb3IsCisgICAgICAgIGRiaWcgPyBkYmlnIDogIiIsIGRldmljZSk7CisKKyAgICAgIGdvdG8gZHJpdmVyOworICAgIH0KKyAgfQorCisgIHByaW50ZigodG95cy5vcHRmbGFncyAmIEZMQUdfbSkgPyAiJXMgXCIlc1wiIFwiJXNcIiBcIiVzXCIiCisgICAgOiAiJXMgQ2xhc3MgJXM6ICVzOiVzIiwgbmV3LT5uYW1lKzUsIHRveWJ1ZiwgCisgICAgdmJpZyA/IHZiaWcgOiB2ZW5kb3IsIGRiaWcgPyBkYmlnIDogZGV2aWNlKTsKKworZHJpdmVyOgorICBpZiAoKmRyaXZlcikKKyAgICBwcmludGYoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX20pID8gIiBcIiVzXCIiIDogIiAlcyIsIGJhc2VuYW1lKGRyaXZlcikpOworICB4cHV0YygnXG4nKTsKKworICByZXR1cm4gMDsKK30KKwordm9pZCBsc3BjaV9tYWluKHZvaWQpCit7CisgIGlmIChDRkdfTFNQQ0lfVEVYVCAmJiBUVC5udW1lcmljICE9IDEpIHsKKyAgICBpZiAoIVRULmlkcykgVFQuaWRzID0gIi91c3Ivc2hhcmUvbWlzYy9wY2kuaWRzIjsKKyAgICBpZiAoIShUVC5kYiA9IGZvcGVuKFRULmlkcywgInIiKSkpIHBlcnJvcl9tc2coIiVzIiwgVFQuaWRzKTsKKyAgfQorCisgIGRpcnRyZWVfcmVhZCgiL3N5cy9idXMvcGNpL2RldmljZXMiLCBkb19sc3BjaSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9sc3VzYi5jIGIvdG95Ym94L3RveXMvb3RoZXIvbHN1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg4NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvbHN1c2IuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBsc3VzYi5jIC0gbGlzdCBhdmFpbGFibGUgVVNCIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBbmRyZSBSZW5hdWQgPGFuZHJlQGJsdWV3YXRlcnN5cy5jb20+CisKK1VTRV9MU1VTQihORVdUT1kobHN1c2IsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIExTVVNCCisgIGJvb2wgImxzdXNiIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBsc3VzYgorCisgICAgTGlzdCBVU0IgaG9zdHMvZGV2aWNlcy4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0YXRpYyBpbnQgbGlzdF9kZXZpY2Uoc3RydWN0IGRpcnRyZWUgKm5ldykKK3sKKyAgRklMRSAqZmlsZTsKKyAgY2hhciAqbmFtZTsKKyAgaW50IGJ1c251bSA9IDAsIGRldm51bSA9IDAsIHBpZCA9IDAsIHZpZCA9IDA7CisKKyAgaWYgKCFuZXctPnBhcmVudCkgcmV0dXJuIERJUlRSRUVfUkVDVVJTRTsKKyAgaWYgKG5ldy0+bmFtZVswXSA9PSAnLicpIHJldHVybiAwOworICBuYW1lID0gZGlydHJlZV9wYXRoKG5ldywgMCk7CisgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlcy8lcyIsIG5hbWUsICIvdWV2ZW50Iik7CisgIGZpbGUgPSBmb3Blbih0b3lidWYsICJyIik7CisgIGlmIChmaWxlKSB7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIHdoaWxlIChmZ2V0cyh0b3lidWYsIHNpemVvZih0b3lidWYpLCBmaWxlKSkKKyAgICAgIGlmIChzc2NhbmYodG95YnVmLCAiQlVTTlVNPSV1XG4iLCAmYnVzbnVtKQorICAgICAgICAgIHx8IHNzY2FuZih0b3lidWYsICJERVZOVU09JXVcbiIsICZkZXZudW0pCisgICAgICAgICAgfHwgc3NjYW5mKHRveWJ1ZiwgIlBST0RVQ1Q9JXgvJXgvIiwgJnBpZCwgJnZpZCkpIGNvdW50Kys7CisKKyAgICBpZiAoY291bnQgPT0gMykKKyAgICAgIHByaW50ZigiQnVzICUwM2QgRGV2aWNlICUwM2Q6IElEICUwNHg6JTA0eFxuIiwgYnVzbnVtLCBkZXZudW0sIHBpZCwgdmlkKTsKKyAgICBmY2xvc2UoZmlsZSk7CisgIH0KKyAgZnJlZShuYW1lKTsKKworICByZXR1cm4gMDsKK30KKwordm9pZCBsc3VzYl9tYWluKHZvaWQpCit7CisgIGRpcnRyZWVfcmVhZCgiL3N5cy9idXMvdXNiL2RldmljZXMvIiwgbGlzdF9kZXZpY2UpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbWFrZWRldnMuYyBiL3RveWJveC90b3lzL290aGVyL21ha2VkZXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2YTk4MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL21ha2VkZXZzLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIG1ha2VkZXZzLmMgLSBNYWtlIHJhbmdlcyBvZiBkZXZpY2UgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTQgQmlsYWwgUXVyZXNoaSA8YmlsYWwuam1pQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisgCitVU0VfTUFLRURFVlMoTkVXVE9ZKG1ha2VkZXZzLCAiPDE+MWQ6IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTUFLRURFVlMKKyAgYm9vbCAibWFrZWRldnMiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG1ha2VkZXZzIFstZCBkZXZpY2VfdGFibGVdIHJvb3RkaXIKKworICAgIENyZWF0ZSBhIHJhbmdlIG9mIHNwZWNpYWwgZmlsZXMgYXMgc3BlY2lmaWVkIGluIGEgZGV2aWNlIHRhYmxlLgorCisgICAgLWQJZmlsZSBjb250YWluaW5nIGRldmljZSB0YWJsZSAoZGVmYXVsdCByZWFkcyBmcm9tIHN0ZGluKQorCisgICAgRWFjaCBsaW5lIG9mIG9mIHRoZSBkZXZpY2UgdGFibGUgaGFzIHRoZSBmaWVsZHM6CisgICAgPG5hbWU+IDx0eXBlPiA8bW9kZT4gPHVpZD4gPGdpZD4gPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluY3JlbWVudD4gPGNvdW50PgorICAgIFdoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgYW5kIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBiCUJsb2NrIGRldmljZQorICAgIGMJQ2hhcmFjdGVyIGRldmljZQorICAgIGQJRGlyZWN0b3J5CisgICAgZglSZWd1bGFyIGZpbGUKKyAgICBwCU5hbWVkIHBpcGUgKGZpZm8pCisKKyAgICBPdGhlciBmaWVsZHMgc3BlY2lmeSBwZXJtaXNzaW9ucywgdXNlciBhbmQgZ3JvdXAgaWQgb3duaW5nIHRoZSBmaWxlLAorICAgIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgZGV2aWNlIHNwZWNpYWwgZmlsZXMuIFVzZSAnLScgZm9yIGJsYW5rIGVudHJpZXMsCisgICAgdW5zcGVjaWZpZWQgZmllbGRzIGFyZSB0cmVhdGVkIGFzICctJy4KKyovCisKKyNkZWZpbmUgRk9SX21ha2VkZXZzCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpmbmFtZTsKKykKKwordm9pZCBtYWtlZGV2c19tYWluKCkKK3sKKyAgaW50IGZkID0gMCwgbGluZV9ubywgaTsKKyAgY2hhciAqbGluZSA9IE5VTEw7CisKKyAgLy8gT3BlbiBmaWxlIGFuZCBjaGRpciwgdmVyYm9zZWx5CisgIHhwcmludGYoInJvb3RkaXIgPSAlc1xuIiwgKnRveXMub3B0YXJncyk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19kICYmIHN0cmNtcChUVC5mbmFtZSwgIi0iKSkgeworICAgIGZkID0geG9wZW5ybyhUVC5mbmFtZSk7CisgICAgeHByaW50ZigidGFibGUgPSAlc1xuIiwgVFQuZm5hbWUpOworICB9IGVsc2UgeHByaW50ZigidGFibGUgPSA8c3RkaW4+XG4iKTsKKyAgeGNoZGlyKCp0b3lzLm9wdGFyZ3MpOworCisgIGZvciAobGluZV9ubyA9IDA7IChsaW5lID0gZ2V0X2xpbmUoZmQpKTsgZnJlZShsaW5lKSkgeworICAgIGNoYXIgdHlwZT0wLCB1c2VyWzY0XSwgZ3JvdXBbNjRdLCAqbm9kZSwgKnB0ciA9IGxpbmU7CisgICAgdW5zaWduZWQgaW50IG1vZGUgPSAwNzU1LCBtYWpvciA9IDAsIG1pbm9yID0gMCwgY250ID0gMCwgaW5jciA9IDAsIAorICAgICAgICAgICAgICAgICBzdF92YWwgPSAwOworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICBsaW5lX25vKys7CisgICAgd2hpbGUgKGlzc3BhY2UoKnB0cikpIHB0cisrOworICAgIGlmICghKnB0ciB8fCAqcHRyID09ICcjJykgY29udGludWU7CisgICAgbm9kZSA9IHB0cjsKKworICAgIHdoaWxlICgqcHRyICYmICFpc3NwYWNlKCpwdHIpKSBwdHIrKzsKKyAgICBpZiAoKnB0cikgKihwdHIrKykgPSAwOworICAgICp1c2VyID0gKmdyb3VwID0gMDsKKyAgICBzc2NhbmYocHRyLCAiJWMgJW8gJTYzcyAlNjNzICV1ICV1ICV1ICV1ICV1IiwgJnR5cGUsICZtb2RlLAorICAgICAgICAgICB1c2VyLCBncm91cCwgJm1ham9yLCAmbWlub3IsICZzdF92YWwsICZpbmNyLCAmY250KTsKKworICAgIC8vIHR5cGUgb3JkZXIgaGVyZSBuZWVkcyB0byBsaW5lIHVwIHdpdGggYWN0aW9uc1tdIG9yZGVyLgorICAgIGkgPSBzdHJpZHgoInBjYmRmIiwgdHlwZSk7CisgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgIGVycm9yX21zZygibGluZSAlZDogYmFkIHR5cGUgJWMiLCBsaW5lX25vLCB0eXBlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBtb2RlIHw9IChtb2RlX3RbXSl7U19JRklGTywgU19JRkNIUiwgU19JRkJMSywgMCwgMH1baV07CisKKyAgICB1aWQgPSAqdXNlciA/IHhnZXR1aWQodXNlcikgOiBnZXR1aWQoKTsKKyAgICBnaWQgPSAqZ3JvdXAgPyB4Z2V0Z2lkKGdyb3VwKSA6IGdldGdpZCgpOworCisgICAgd2hpbGUgKCpub2RlID09ICcvJykgbm9kZSsrOyAvLyB1c2luZyByZWxhdGl2ZSBwYXRoCisKKyAgICBmb3IgKGkgPSAwOyAoIWNudCAmJiAhaSkgfHwgaSA8IGNudDsgaSsrKSB7CisgICAgICBpZiAoY250PjEpIHsKKyAgICAgICAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIiUuOTk5cyV1Iiwgbm9kZSwgc3RfdmFsICsgaSk7CisgICAgICAgIHB0ciA9IHRveWJ1ZjsKKyAgICAgIH0gZWxzZSBwdHIgPSBub2RlOworCisgICAgICBpZiAodHlwZSA9PSAnZCcpIHsKKyAgICAgICAgaWYgKG1rcGF0aGF0KEFUX0ZEQ1dELCBwdHIsIG1vZGUsIDMpKSAgeworICAgICAgICAgIHBlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBkaXJlY3RvcnkgJyVzJyIsIHB0cik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZicpIHsKKyAgICAgICAgaWYgKHN0YXQocHRyLCAmc3QpIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisgICAgICAgICAgcGVycm9yX21zZygibGluZSAlZDogZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0IiwgbGluZV9ubywgcHRyKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChta25vZChwdHIsIG1vZGUsIGRldl9tYWtlZGV2KG1ham9yLCBtaW5vciArIGkqaW5jcikpKSB7CisgICAgICAgIHBlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNyZWF0ZSBub2RlICclcyciLCBsaW5lX25vLCBwdHIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNob3duKHB0ciwgdWlkLCBnaWQpIHx8IGNobW9kKHB0ciwgbW9kZSkpIAorICAgICAgICBwZXJyb3JfbXNnKCJsaW5lICVkOiBjYW4ndCBjaG93bi9jaG1vZCAnJXMnIiwgbGluZV9ubywgcHRyKTsKKyAgICB9CisgIH0KKyAgeGNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL21peC5jIGIvdG95Ym94L3RveXMvb3RoZXIvbWl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1YWFjMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL21peC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIG1peC5jIC0gQSB2ZXJ5IGJhc2ljIG1peGVyLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEJyYWQgQ29ucm95LCBkZWRpY2F0ZWQgdG8gdGhlIFB1YmxpYyBEb21haW4uCisgKgorCitVU0VfTUlYKE5FV1RPWShtaXgsICJjOmQ6bCNyIyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIE1JWAorICBib29sICJtaXgiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICB1c2FnZTogbWl4IFstZCBERVZdIFstYyBDSEFOTkVMXSBbLWwgVk9MXSBbLXIgUklHSFRdCisKKyAgIExpc3QgT1NTIHNvdW5kIGNoYW5uZWxzIChtb2R1bGUgc25kLW1peGVyLW9zcyksIG9yIHNldCB2b2x1bWUocykuCisKKyAgIC1jIENIQU5ORUwJU2V0L3Nob3cgdm9sdW1lIG9mIENIQU5ORUwgKGRlZmF1bHQgZmlyc3QgY2hhbm5lbCBmb3VuZCkKKyAgIC1kIERFVgkJRGV2aWNlIG5vZGUgKGRlZmF1bHQgL2Rldi9taXhlcikKKyAgIC1sIFZPTAkJVm9sdW1lIGxldmVsCisgICAtciBSSUdIVAlWb2x1bWUgb2YgcmlnaHQgc3RlcmVvIGNoYW5uZWwgKHdpdGggLXIsIC1sIHNldHMgbGVmdCB2b2x1bWUpCisqLworCisjZGVmaW5lIEZPUl9taXgKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisKK0dMT0JBTFMoCisgICBsb25nIHJpZ2h0OworICAgbG9uZyBsZXZlbDsKKyAgIGNoYXIgKmRldjsKKyAgIGNoYXIgKmNoYW47CispCisKK3ZvaWQgbWl4X21haW4odm9pZCkKK3sKKyAgY29uc3QgY2hhciAqY2hhbm5lbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IFNPVU5EX0RFVklDRV9OQU1FUzsKKyAgaW50IG1hc2ssIGNoYW5uZWwgPSAtMSwgbGV2ZWwsIGZkOworCisgIGlmICghVFQuZGV2KSBUVC5kZXYgPSAiL2Rldi9taXhlciI7CisgIGZkID0geG9wZW4oVFQuZGV2LCBPX1JEV1J8T19OT05CTE9DSyk7CisgIHhpb2N0bChmZCwgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLLCAmbWFzayk7CisKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgY2hhbm5lbCsrKSB7CisgICAgaWYgKCgxPDxjaGFubmVsKSAmIG1hc2spIHsKKyAgICAgIGlmIChUVC5jaGFuKSB7CisgICAgICAgIGlmICghc3RyY21wKGNoYW5uZWxzW2NoYW5uZWxdLCBUVC5jaGFuKSkgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIGJyZWFrOworICAgICAgZWxzZSBwcmludGYoIiVzXG4iLCBjaGFubmVsc1tjaGFubmVsXSk7CisgICAgfQorICB9CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIChGTEFHX2N8RkxBR19sKSkpIHJldHVybjsKKyAgZWxzZSBpZiAoY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpIGVycm9yX2V4aXQoImJhZCAtYyAnJXMnIiwgVFQuY2hhbik7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbCkpIHsKKyAgICB4aW9jdGwoZmQsIE1JWEVSX1JFQUQoY2hhbm5lbCksICZsZXZlbCk7CisgICAgaWYgKGxldmVsID4gMHhGRikKKyAgICAgIHhwcmludGYoIiVzOiVzID0gbGVmdDolZFx0IHJpZ2h0OiVkXG4iLAorICAgICAgICAgICAgICBUVC5kZXYsIGNoYW5uZWxzW2NoYW5uZWxdLCBsZXZlbD4+OCwgbGV2ZWwgJiAweEZGKTsKKyAgICBlbHNlIHhwcmludGYoIiVzOiVzID0gJWRcbiIsIFRULmRldiwgY2hhbm5lbHNbY2hhbm5lbF0sIGxldmVsKTsKKyAgfSBlbHNlIHsKKyAgICBsZXZlbCA9IFRULmxldmVsOworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpKSBsZXZlbCA9IFRULnJpZ2h0IHwgKGxldmVsPDw4KTsKKworICAgIHhpb2N0bChmZCwgTUlYRVJfV1JJVEUoY2hhbm5lbCksICZsZXZlbCk7CisgIH0KKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9ta3Bhc3N3ZC5jIGIvdG95Ym94L3RveXMvb3RoZXIvbWtwYXNzd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFjMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvbWtwYXNzd2QuYwpAQCAtMCwwICsxLDc3IEBACisvKiBta3Bhc3N3ZC5jIC0gZW5jcnlwdCB0aGUgZ2l2ZW4gcGFzc3dkIHVzaW5nIHNhbHQKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9NS1BBU1NXRChORVdUT1kobWtwYXNzd2QsICI+MlM6bTpQIz0wPDAiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBNS1BBU1NXRAorICBib29sICJta3Bhc3N3ZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbWtwYXNzd2QgWy1QIEZEXSBbLW0gVFlQRV0gWy1TIFNBTFRdIFtQQVNTV09SRF0gW1NBTFRdCisKKyAgICBDcnlwdCBQQVNTV09SRCB1c2luZyBjcnlwdCgzKQorCisgICAgLVAgRkQgICBSZWFkIHBhc3N3b3JkIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZECisgICAgLW0gVFlQRSBFbmNyeXB0aW9uIG1ldGhvZCAoZGVzLCBtZDUsIHNoYTI1Niwgb3Igc2hhNTEyOyBkZWZhdWx0IGlzIGRlcykKKyAgICAtUyBTQUxUCisqLworCisjZGVmaW5lIEZPUl9ta3Bhc3N3ZAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgbG9uZyBwZmQ7CisgIGNoYXIgKm1ldGhvZDsKKyAgY2hhciAqc2FsdDsKKykKKwordm9pZCBta3Bhc3N3ZF9tYWluKHZvaWQpCit7CisgIGNoYXIgc2FsdFtNQVhfU0FMVF9MRU5dID0gezAsfTsKKyAgaW50IGk7CisKKyAgaWYgKCFUVC5tZXRob2QpIFRULm1ldGhvZCA9ICJkZXMiOworICBpZiAodG95cy5vcHRjID09IDIpIHsKKyAgICBpZiAoVFQuc2FsdCkgZXJyb3JfZXhpdCgiZHVwbGljYXRlIHNhbHQiKTsKKyAgICBUVC5zYWx0ID0gdG95cy5vcHRhcmdzWzFdOworICB9CisKKyAgaWYgKC0xID09IChpID0gZ2V0X3NhbHQoc2FsdCwgVFQubWV0aG9kKSkpIGVycm9yX2V4aXQoImJhZCAtbSIpOworICBpZiAoVFQuc2FsdCkgeworICAgIGNoYXIgKnMgPSBUVC5zYWx0OworCisgICAgLy8gSW4gQyBsb2NhbGUsIGlzYWxudW0oKSBtZWFucyBbQS1aYS1aMC0wXQorICAgIHdoaWxlIChpc2FsbnVtKCpzKSB8fCAqcyA9PSAnLicgfHwgKnMgPT0gJy8nKSBzKys7CisgICAgaWYgKCpzKSBlcnJvcl9leGl0KCJzYWx0IG5vdCBpbiBbLi9BLVphLXowLTldIik7CisKKyAgICBzbnByaW50ZihzYWx0K2ksIHNpemVvZihzYWx0KS1pLCAiJXMiLCBUVC5zYWx0KTsKKyAgfQorCisgIC8vIEJlY2F1c2UgcmVhZF9wYXNzd29yZCgpIGRvZXNuJ3QgaGF2ZSBhbiBmZCBhcmd1bWVudAorICBpZiAoVFQucGZkKSB7CisgICAgaWYgKGR1cDIoVFQucGZkLCAwKSA9PSAtMSkgcGVycm9yX2V4aXQoImZkIik7CisgICAgY2xvc2UoVFQucGZkKTsKKyAgfQorCisgIC8vIElmIHdlIGhhdmVuJ3QgZ290IGEgcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZSwgcmVhZCBpdCBmcm9tIHR0eSBvciBGRAorICBpZiAoISp0b3lzLm9wdGFyZ3MpIHsKKyAgICAvLyBQcm9tcHQgYW5kIHJlYWQgaW50ZXJhY3RpdmVseT8KKyAgICBpZiAoaXNhdHR5KDApKSB7CisgICAgICBpZiAocmVhZF9wYXNzd29yZCh0b3lidWYsIHNpemVvZih0b3lidWYpLCAiUGFzc3dvcmQ6ICIpKSAKKyAgICAgICAgcGVycm9yX2V4aXQoInBhc3N3b3JkIHJlYWQgZmFpbGVkIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGk8c2l6ZW9mKHRveWJ1ZiktMTsgaSsrKSB7CisgICAgICAgIGlmICgheHJlYWQoMCwgdG95YnVmK2ksIDEpKSBicmVhazsKKyAgICAgICAgaWYgKHRveWJ1ZltpXSA9PSAnXG4nIHx8IHRveWJ1ZltpXSA9PSAnXHInKSBicmVhazsKKyAgICAgIH0KKyAgICAgIHRveWJ1ZltpXSA9IDA7CisgICAgfQorICB9CisKKyAgLy8gZW5jcnlwdCAmIHByaW50IHRoZSBwYXNzd29yZAorICB4cHJpbnRmKCIlc1xuIixjcnlwdCgqdG95cy5vcHRhcmdzID8gKnRveXMub3B0YXJncyA6IHRveWJ1Ziwgc2FsdCkpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbWtzd2FwLmMgYi90b3lib3gvdG95cy9vdGhlci9ta3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUwYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvbWtzd2FwLmMKQEAgLTAsMCArMSw1MCBAQAorLyogbWtzd2FwLmMgLSBGb3JtYXQgc3dhcCBkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IDIwMDkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworVVNFX01LU1dBUChORVdUT1kobWtzd2FwLCAiPDE+MUw6IiwgVE9ZRkxBR19TQklOKSkKKworY29uZmlnIE1LU1dBUAorICBib29sICJta3N3YXAiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG1rc3dhcCBbLUwgTEFCRUxdIERFVklDRQorCisgICAgU2V0cyB1cCBhIExpbnV4IHN3YXAgYXJlYSBvbiBhIGRldmljZSBvciBmaWxlLgorKi8KKworI2RlZmluZSBGT1JfbWtzd2FwCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpMOworKQorCit2b2lkIG1rc3dhcF9tYWluKHZvaWQpCit7CisgIGludCBmZCA9IHhvcGVuKCp0b3lzLm9wdGFyZ3MsIE9fUkRXUiksIHBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKyAgb2ZmX3QgbGVuID0gZmRsZW5ndGgoZmQpOworICB1bnNpZ25lZCBpbnQgcGFnZXMgPSAobGVuL3BhZ2VzaXplKS0xLCAqc3dhcCA9ICh1bnNpZ25lZCBpbnQgKil0b3lidWY7CisgIGNoYXIgKmxhYmVsID0gKGNoYXIgKikoc3dhcCs3KSwgKnV1aWQgPSAoY2hhciAqKShzd2FwKzMpOworCisgIC8vIFdyaXRlIGhlYWRlci4gTm90ZSB0aGF0IG9sZGVyIGtlcm5lbCB2ZXJzaW9ucyBjaGVja2VkIHNpZ25hdHVyZQorICAvLyBvbiBkaXNrIChub3QgaW4gY2FjaGUpIGR1cmluZyBzd2Fwb24sIHNvIHN5bmMgYWZ0ZXIgd3JpdGluZy4KKworICBzd2FwWzBdID0gMTsKKyAgc3dhcFsxXSA9IHBhZ2VzOworICB4bHNlZWsoZmQsIDEwMjQsIFNFRUtfU0VUKTsKKyAgY3JlYXRlX3V1aWQodXVpZCk7CisgIGlmIChUVC5MKSBzdHJuY3B5KGxhYmVsLCBUVC5MLCAxNSk7CisgIHh3cml0ZShmZCwgc3dhcCwgMTI5KnNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgeGxzZWVrKGZkLCBwYWdlc2l6ZS0xMCwgU0VFS19TRVQpOworICB4d3JpdGUoZmQsICJTV0FQU1BBQ0UyIiwgMTApOworICBmc3luYyhmZCk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgY2xvc2UoZmQpOworCisgIGlmIChUVC5MKSBzcHJpbnRmKHRveWJ1ZiwgIiwgTEFCRUw9JXMiLCBsYWJlbCk7CisgIGVsc2UgKnRveWJ1ZiA9IDA7CisgIHByaW50ZigiU3dhcHNwYWNlIHNpemU6ICVsdWslcywgVVVJRD0lc1xuIiwKKyAgICBwYWdlcyoodW5zaWduZWQgbG9uZykocGFnZXNpemUvMTAyNCksCisgICAgdG95YnVmLCBzaG93X3V1aWQodXVpZCkpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbW9kaW5mby5jIGIvdG95Ym94L3RveXMvb3RoZXIvbW9kaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTU1YjQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9tb2RpbmZvLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIG1vZGluZm8uYyAtIERpc3BsYXkgbW9kdWxlIGluZm8KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBbmRyZSBSZW5hdWQgPGFuZHJlQGJsdWV3YXRlcnN5cy5jb20+CisgKgorICogVE9ETzogY2xlYW51cAorCitVU0VfTU9ESU5GTyhORVdUT1kobW9kaW5mbywgIjwxYjprOkY6MCIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIE1PRElORk8KKyAgYm9vbCAibW9kaW5mbyIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbW9kaW5mbyBbLTBdIFstYiBiYXNlZGlyXSBbLWsga2VybnJlbGVhc2VdIFstRiBmaWVsZF0gW21vZHVsZW5hbWUuLi5dCisKKyAgICBEaXNwbGF5IG1vZHVsZSBmaWVsZHMgZm9yIGFsbCBzcGVjaWZpZWQgbW9kdWxlcywgbG9va2luZyBpbgorICAgIDxiYXNlZGlyPi9saWIvbW9kdWxlcy88a2VybnJlbGVhc2U+LyAoa2VybnJlbGVhc2UgZGVmYXVsdHMgdG8gdW5hbWUgLXIpLgorKi8KKworI2RlZmluZSBGT1JfbW9kaW5mbworI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqZmllbGQ7CisgIGNoYXIgKmtuYW07CisgIGNoYXIgKmJhc2U7CisKKyAgbG9uZyBtb2Q7CispCisKK3N0YXRpYyB2b2lkIG91dHB1dF9maWVsZChjaGFyICpmaWVsZCwgY2hhciAqdmFsdWUpCit7CisgIGlmICghVFQuZmllbGQpIHhwcmludGYoIiVzOiUqYyIsIGZpZWxkLCAxNS0oaW50KXN0cmxlbihmaWVsZCksICcgJyk7CisgIGVsc2UgaWYgKHN0cmNtcChUVC5maWVsZCwgZmllbGQpKSByZXR1cm47CisgIHhwcmludGYoIiVzIiwgdmFsdWUpOworICB4cHV0YygodG95cy5vcHRmbGFncyAmIEZMQUdfMCkgPyAwIDogJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGluZm9fZmlsZShjaGFyICpmdWxsX25hbWUpCit7CisgIGludCBmZCwgbGVuLCBpOworICBjaGFyICpidWYgPSAwLCAqcG9zLCAqbW9kaW5mb190YWdzW10gPSB7CisgICAgImFsaWFzIiwgImxpY2Vuc2UiLCAiZGVzY3JpcHRpb24iLCAiYXV0aG9yIiwgImZpcm13YXJlIiwKKyAgICAidmVybWFnaWMiLCAic3JjdmVyc2lvbiIsICJpbnRyZWUiLCAiZGVwZW5kcyIsICJwYXJtIiwKKyAgICAicGFybXR5cGUiLAorICB9OworCisgIGlmICgtMSAhPSAoZmQgPSBvcGVuKGZ1bGxfbmFtZSwgT19SRE9OTFkpKSkgeworICAgIGxlbiA9IGZkbGVuZ3RoKGZkKTsKKyAgICBpZiAoIShidWYgPSBtbWFwKDAsIGxlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCkpKSBjbG9zZShmZCk7CisgIH0KKworICBpZiAoIWJ1ZikgeworICAgIHBlcnJvcl9tc2dfcmF3KGZ1bGxfbmFtZSk7CisgICAgcmV0dXJuOworICB9IAorCisgIG91dHB1dF9maWVsZCgiZmlsZW5hbWUiLCBmdWxsX25hbWUpOworCisgIGZvciAocG9zID0gYnVmOyBwb3MgPCBidWYrbGVuOyBwb3MrKykgeworICAgIGlmICgqcG9zKSBjb250aW51ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobW9kaW5mb190YWdzKSAvIHNpemVvZigqbW9kaW5mb190YWdzKTsgaSsrKSB7CisgICAgICBjaGFyICpzdHIgPSBtb2RpbmZvX3RhZ3NbaV07CisgICAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7CisKKyAgICAgIGlmICghc3RybmNtcChwb3MrMSwgc3RyLCBsZW4pICYmIHBvc1tsZW4rMV0gPT0gJz0nKSAKKyAgICAgICAgb3V0cHV0X2ZpZWxkKHN0ciwgcG9zK2xlbisyKTsKKyAgICB9CisgIH0KKworICBtdW5tYXAoYnVmLCBsZW4pOworICBjbG9zZShmZCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbW9kdWxlKHN0cnVjdCBkaXJ0cmVlICpuZXcpCit7CisgIGlmIChTX0lTUkVHKG5ldy0+c3Quc3RfbW9kZSkpIHsKKyAgICBjaGFyICpzOworCisgICAgZm9yIChzID0gdG95cy5vcHRhcmdzW1RULm1vZF07ICpzOyBzKyspIHsKKyAgICAgIGludCBsZW4gPSAwOworCisgICAgICAvLyBUaGUga2VybmVsIHRyZWF0cyAtIGFuZCBfIHRoZSBzYW1lLCBzbyB3ZSBzaG91bGQgdG9vLgorICAgICAgZm9yIChsZW4gPSAwOyBzW2xlbl07IGxlbisrKSB7CisgICAgICAgIGlmIChzW2xlbl0gPT0gJy0nICYmIG5ldy0+bmFtZVtsZW5dID09ICdfJykgY29udGludWU7CisgICAgICAgIGlmIChzW2xlbl0gPT0gJ18nICYmIG5ldy0+bmFtZVtsZW5dID09ICctJykgY29udGludWU7CisgICAgICAgIGlmIChzW2xlbl0gIT0gbmV3LT5uYW1lW2xlbl0pIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHNbbGVuXSB8fCBzdHJjbXAobmV3LT5uYW1lK2xlbiwgIi5rbyIpKSBicmVhazsKKworICAgICAgbW9kaW5mb19maWxlKHMgPSBkaXJ0cmVlX3BhdGgobmV3LCBOVUxMKSk7CisgICAgICBmcmVlKHMpOworCisgICAgICByZXR1cm4gRElSVFJFRV9BQk9SVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gZGlydHJlZV9ub3Rkb3Rkb3QobmV3KTsKK30KKwordm9pZCBtb2RpbmZvX21haW4odm9pZCkKK3sKKyAgZm9yKFRULm1vZCA9IDA7IFRULm1vZDx0b3lzLm9wdGM7IFRULm1vZCsrKSB7CisgICAgY2hhciAqcyA9IHN0cnN0cih0b3lzLm9wdGFyZ3NbVFQubW9kXSwgIi5rbyIpOworCisgICAgaWYgKHMgJiYgIXNbM10pIG1vZGluZm9fZmlsZSh0b3lzLm9wdGFyZ3NbVFQubW9kXSk7CisgICAgZWxzZSB7CisgICAgICBzdHJ1Y3QgdXRzbmFtZSB1dHM7CisKKyAgICAgIGlmICh1bmFtZSgmdXRzKSA8IDApIHBlcnJvcl9leGl0KCJiYWQgdW5hbWUiKTsKKyAgICAgIGlmIChzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiJXMvbGliL21vZHVsZXMvJXMiLAorICAgICAgICAgICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSA/IFRULmJhc2UgOiAiIiwKKyAgICAgICAgICAodG95cy5vcHRmbGFncyAmIEZMQUdfaykgPyBUVC5rbmFtIDogdXRzLnJlbGVhc2UpID49IHNpemVvZih0b3lidWYpKQorICAgICAgICAgICAgcGVycm9yX2V4aXQoImJhc2VkaXIva2VybnJlbGVhc2UgdG9vIGxvbmciKTsKKyAgICAgIGRpcnRyZWVfcmVhZCh0b3lidWYsIGNoZWNrX21vZHVsZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9tb3VudHBvaW50LmMgYi90b3lib3gvdG95cy9vdGhlci9tb3VudHBvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlMWQzMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL21vdW50cG9pbnQuYwpAQCAtMCwwICsxLDY0IEBACisvKiBtb3VudHBvaW50LmMgLSBDaGVjayBpZiBhIGRpcmVjdG9yeSBpcyBhIG1vdW50cG9pbnQuCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKworVVNFX01PVU5UUE9JTlQoTkVXVE9ZKG1vdW50cG9pbnQsICI8MXFkeFstZHhdIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgTU9VTlRQT0lOVAorICBib29sICJtb3VudHBvaW50IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBtb3VudHBvaW50IFstcV0gWy1kXSBkaXJlY3RvcnkKKyAgICAgICAgICAgbW91bnRwb2ludCBbLXFdIFsteF0gZGV2aWNlCisKKyAgICAtcQlCZSBxdWlldCwgcmV0dXJuIHplcm8gaWYgZGlyZWN0b3J5IGlzIGEgbW91bnRwb2ludAorICAgIC1kCVByaW50IG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgb2YgdGhlIGRpcmVjdG9yeQorICAgIC14CVByaW50IG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgb2YgdGhlIGJsb2NrIGRldmljZQorKi8KKworI2RlZmluZSBGT1JfbW91bnRwb2ludAorI2luY2x1ZGUgInRveXMuaCIKKworc3RhdGljIHZvaWQgZGllKGNoYXIgKmdyaXBlKQoreworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkgcHJpbnRmKCIlczogbm90IGEgJXNcbiIsICp0b3lzLm9wdGFyZ3MsIGdyaXBlKTsKKworICB0b3lzLmV4aXR2YWwrKzsKKyAgeGV4aXQoKTsKK30KKwordm9pZCBtb3VudHBvaW50X21haW4odm9pZCkKK3sKKyAgc3RydWN0IHN0YXQgc3QxLCBzdDI7CisgIGNoYXIgKmFyZyA9ICp0b3lzLm9wdGFyZ3M7CisgIGludCBxdWlldCA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX3E7CisKKyAgaWYgKGxzdGF0KGFyZywgJnN0MSkpIHBlcnJvcl9leGl0X3JhdyhhcmcpOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSB7CisgICAgaWYgKFNfSVNCTEsoc3QxLnN0X21vZGUpKSB7CisgICAgICBpZiAoIXF1aWV0KQorICAgICAgICBwcmludGYoIiV1OiV1XG4iLCBkZXZfbWFqb3Ioc3QxLnN0X3JkZXYpLCBkZXZfbWlub3Ioc3QxLnN0X3JkZXYpKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkaWUoImJsb2NrIGRldmljZSIpOworICB9CisKKyAgLy8gVE9ETzogSWdub3JlIHRoZSBmYWN0IGEgZmlsZSBjYW4gYmUgYSBtb3VudHBvaW50IGZvciAtLWJpbmQgbW91bnRzLgorICBpZiAoIVNfSVNESVIoc3QxLnN0X21vZGUpKSBkaWUoImRpcmVjdG9yeSIpOworCisgIGFyZyA9IHhtcHJpbnRmKCIlcy8uLiIsIGFyZyk7CisgIHhzdGF0KGFyZywgJnN0Mik7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoYXJnKTsKKworICAvLyBJZiB0aGUgZGV2aWNlIGlzIGRpZmZlcmVudCwgaXQncyBhIG1vdW50IHBvaW50LiBJZiB0aGUgZGV2aWNlIF9hbmRfCisgIC8vIGlub2RlIGFyZSB0aGUgc2FtZSwgaXQncyBwcm9iYWJseSAiLyIuIFRoaXMgbWlzc2VzIC0tYmluZCBtb3VudHMgZnJvbQorICAvLyBlbHNld2hlcmUgaW4gdGhlIHNhbWUgZmlsZXN5c3RlbSwgYnV0IHNvIGRvZXMgdGhlIG90aGVyIG9uZSBhbmQgaW4gdGhlCisgIC8vIGFic2VuY2Ugb2YgYSBzcGVjIEkgZ3Vlc3MgdGhhdCdzIHRoZSBleHBlY3RlZCBiZWhhdmlvcj8KKyAgdG95cy5leGl0dmFsID0gIShzdDEuc3RfZGV2ICE9IHN0Mi5zdF9kZXYgfHwgc3QxLnN0X2lubyA9PSBzdDIuc3RfaW5vKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2QpCisgICAgcHJpbnRmKCIldToldVxuIiwgZGV2X21ham9yKHN0MS5zdF9kZXYpLCBkZXZfbWlub3Ioc3QxLnN0X2RldikpOworICBlbHNlIGlmICghcXVpZXQpCisgICAgcHJpbnRmKCIlcyBpcyAlc2EgbW91bnRwb2ludFxuIiwgKnRveXMub3B0YXJncywgdG95cy5leGl0dmFsID8gIm5vdCAiIDogIiIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvbmJkX2NsaWVudC5jIGIvdG95Ym94L3RveXMvb3RoZXIvbmJkX2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDM2NmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9uYmRfY2xpZW50LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIG5iZC1jbGllbnQuYyAtIG5ldHdvcmsgYmxvY2sgZGV2aWNlIGNsaWVudAorICoKKyAqIENvcHlyaWdodCAyMDEwIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm90IGluIFNVU3Y0LgorCisvLyBUaGlzIGxpdHRsZSBkYW5jZSBpcyBiZWNhdXNlIGEgTkVXVE9ZIHdpdGggLSBpbiB0aGUgbmFtZSB0cmllcyB0byBkbworLy8gdGhpbmdzIGxpa2UgcHJvdG90eXBlICJuYmQtY2xpZW50X21haW4iIHdoaWNoIGlzbid0IGEgdmFsaWQgc3ltYm9sLiBTbworLy8gd2UgaGlkZSB0aGUgdW5kZXJzY29yZSBuYW1lIGFuZCBPTERUT1kgdGhlIG5hbWUgd2Ugd2FudC4KK1VTRV9OQkRfQ0xJRU5UKE5FV1RPWShuYmRfY2xpZW50LCAiPDM+M25zIiwgMCkpCitVU0VfTkJEX0NMSUVOVChPTERUT1kobmJkLWNsaWVudCwgbmJkX2NsaWVudCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTkJEX0NMSUVOVAorICBib29sICJuYmQtY2xpZW50IgorICBkZXBlbmRzIG9uIFRPWUJPWF9GT1JLCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG5iZC1jbGllbnQgWy1uc10gSE9TVCBQT1JUIERFVklDRQorCisgICAgLW4JRG8gbm90IGZvcmsgaW50byBiYWNrZ3JvdW5kCisgICAgLXMJbmJkIHN3YXAgc3VwcG9ydCAobG9jayBzZXJ2ZXIgaW50byBtZW1vcnkpCisqLworCisvKiAgVE9ETzoKKyAgICB1c2FnZTogbmJkLWNsaWVudCBbLXNTcG5dIFstYiBCTEtTWl0gWy10IFNFQ1NdIFstTiBuYW1lXSBIT1NUIFBPUlQgREVWSUNFCisKKyAgICAtYglibG9jayBzaXplCisgICAgLXQJdGltZW91dCBpbiBzZWNvbmRzCisgICAgLVMJc2RwCisgICAgLXAJcGVyc2lzdAorICAgIC1uCW5vZm9yaworICAgIC1kCURFVklDRQorICAgIC1jCURFVklDRQorKi8KKworI2RlZmluZSBGT1JfbmJkX2NsaWVudAorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9uYmQuaD4KKwordm9pZCBuYmRfY2xpZW50X21haW4odm9pZCkKK3sKKyAgaW50IHNvY2sgPSAtMSwgbmJkLCBmbGFnczsKKyAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMDsKKyAgY2hhciAqaG9zdD10b3lzLm9wdGFyZ3NbMF0sICpwb3J0PXRveXMub3B0YXJnc1sxXSwgKmRldmljZT10b3lzLm9wdGFyZ3NbMl07CisgIHVpbnQ2NF90IGRldnNpemU7CisKKyAgLy8gUmVwZWF0IHVudGlsIHNwYW5rZWQKKworICBuYmQgPSB4b3BlbihkZXZpY2UsIE9fUkRXUik7CisgIGZvciAoOzspIHsKKyAgICBpbnQgdGVtcDsKKworICAgIC8vIEZpbmQgYW5kIGNvbm5lY3QgdG8gc2VydmVyCisKKyAgICBzb2NrID0geGNvbm5lY3QoaG9zdCwgcG9ydCwgQUZfVU5TUEVDLCBTT0NLX1NUUkVBTSwgMCwgMCk7CisgICAgdGVtcCA9IDE7CisgICAgc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZ0ZW1wLCBzaXplb2YoaW50KSk7CisKKyAgICAvLyBSZWFkIGxvZ2luIGRhdGEKKworICAgIHhyZWFkYWxsKHNvY2ssIHRveWJ1ZiwgMTUyKTsKKyAgICBpZiAobWVtY21wKHRveWJ1ZiwgIk5CRE1BR0lDXHgwMFx4MDBceDQyXHgwMlx4ODFceDg2XHgxMlx4NTMiLCAxNikpCisgICAgICBlcnJvcl9leGl0KCJiYWQgbG9naW4gJXM6JXMiLCBob3N0LCBwb3J0KTsKKyAgICBkZXZzaXplID0gU1dBUF9CRTY0KCoodWludDY0X3QgKikodG95YnVmKzE2KSk7CisgICAgZmxhZ3MgPSBTV0FQX0JFMzIoKihpbnQgKikodG95YnVmKzI0KSk7CisKKyAgICAvLyBTZXQgNGsgYmxvY2sgc2l6ZS4gIEV2ZXJ5dGhpbmcgdXNlcyB0aGF0IHRoZXNlIGRheXMuCisgICAgaW9jdGwobmJkLCBOQkRfU0VUX0JMS1NJWkUsIDQwOTYpOworICAgIGlvY3RsKG5iZCwgTkJEX1NFVF9TSVpFX0JMT0NLUywgZGV2c2l6ZS80MDk2KTsKKyAgICBpb2N0bChuYmQsIE5CRF9DTEVBUl9TT0NLKTsKKworICAgIC8vIElmIHRoZSBzdWNrZXIgd2FzIGV4cG9ydGVkIHJlYWQgb25seSwgcmVzcGVjdCB0aGF0IGxvY2FsbHkuCisgICAgdGVtcCA9IChmbGFncyAmIDIpID8gMSA6IDA7CisgICAgeGlvY3RsKG5iZCwgQkxLUk9TRVQsICZ0ZW1wKTsKKworICAgIGlmICh0aW1lb3V0ICYmIGlvY3RsKG5iZCwgTkJEX1NFVF9USU1FT1VULCB0aW1lb3V0KTwwKSBicmVhazsKKyAgICBpZiAoaW9jdGwobmJkLCBOQkRfU0VUX1NPQ0ssIHNvY2spIDwgMCkgYnJlYWs7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgbWxvY2thbGwoTUNMX0NVUlJFTlR8TUNMX0ZVVFVSRSk7CisKKyAgICAvLyBPcGVuIHRoZSBkZXZpY2UgdG8gZm9yY2UgcmVyZWFkIG9mIHRoZSBwYXJ0aXRpb24gdGFibGUuCisgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSB8fCAheGZvcmsoKSkgeworICAgICAgY2hhciAqcyA9IHN0cnJjaHIoZGV2aWNlLCAnLycpOworICAgICAgaW50IGk7CisKKyAgICAgIHNwcmludGYodG95YnVmLCAiL3N5cy9ibG9jay8lLjMycy9waWQiLCBzID8gcysxIDogZGV2aWNlKTsKKyAgICAgIC8vIElzIGl0IHVwIHlldD8gKEdpdmUgaXQgMTAgc2Vjb25kcy4pCisgICAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykgeworICAgICAgICB0ZW1wID0gb3Blbih0b3lidWYsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gLTEpIG1zbGVlcCgxMDApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBjbG9zZSh0ZW1wKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2xvc2Uob3BlbihkZXZpY2UsIE9fUkRPTkxZKSk7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSkgZXhpdCgwKTsKKyAgICB9CisKKyAgICAvLyBEYWVtb25pemUgaGVyZS4KKworICAgIGlmIChkYWVtb24oMCwwKSkgcGVycm9yX2V4aXQoImRhZW1vbml6ZSIpOworCisgICAgLy8gUHJvY2VzcyBOQkQgcmVxdWVzdHMgdW50aWwgZnVydGhlciBub3RpY2UuCisKKyAgICBpZiAoaW9jdGwobmJkLCBOQkRfRE9fSVQpPj0wIHx8IGVycm5vPT1FQkFEUikgYnJlYWs7CisgICAgY2xvc2Uoc29jayk7CisgIH0KKworICAvLyBGbHVzaCBxdWV1ZSBhbmQgZXhpdC4KKyAgaW9jdGwobmJkLCBOQkRfQ0xFQVJfUVVFKTsKKyAgaW9jdGwobmJkLCBOQkRfQ0xFQVJfU09DSyk7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGNsb3NlKG5iZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9uc2VudGVyLmMgYi90b3lib3gvdG95cy9vdGhlci9uc2VudGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhOWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL25zZW50ZXIuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogbnNlbnRlci5jIC0gRW50ZXIgZXhpc3RpbmcgbmFtZXNwYWNlcworICoKKyAqIENvcHlyaWdodCAyMDE0IEFuZHkgTHV0b21pcnNraSA8bHV0b0BhbWFjYXBpdGFsLm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW4xL25zZW50ZXIuMS5odG1sCisgKgorICogdW5zaGFyZS5jIC0gcnVuIGNvbW1hbmQgaW4gbmV3IGNvbnRleHQKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjEvdW5zaGFyZS4xLmh0bWwKKyAqCisKKy8vIE5vdGU6IGZsYWdzIGdvIGluIHNhbWUgb3JkZXIgKHJpZ2h0IHRvIGxlZnQpIGZvciBzaGFyZWQgc3Vic2V0CitVU0VfTlNFTlRFUihORVdUT1kobnNlbnRlciwgIjwxRihuby1mb3JrKXQjPDEodGFyZ2V0KWk6KGlwYyk7bToobW91bnQpO246KG5ldCk7cDoocGlkKTt1Oih1dHMpO1U6KHVzZXIpOyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9VTlNIQVJFKE5FV1RPWSh1bnNoYXJlLCAiPDFeZihmb3JrKTtyKG1hcC1yb290LXVzZXIpO2k6KGlwYyk7bToobW91bnQpO246KG5ldCk7cDoocGlkKTt1Oih1dHMpO1U6KHVzZXIpOyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFVOU0hBUkUKKyAgYm9vbCAidW5zaGFyZSIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX0NPTlRBSU5FUgorICBoZWxwCisgICAgdXNhZ2U6IHVuc2hhcmUgWy1pbW5wdVVyXSBDT01NQU5ELi4uCisKKyAgICBDcmVhdGUgbmV3IGNvbnRhaW5lciBuYW1lc3BhY2UocykgZm9yIHRoaXMgcHJvY2VzcyBhbmQgaXRzIGNoaWxkcmVuLCBzbworICAgIHNvbWUgYXR0cmlidXRlIGlzIG5vdCBzaGFyZWQgd2l0aCB0aGUgcGFyZW50IHByb2Nlc3MuCisKKyAgICAtZiAgRm9yayBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kICgtLWZvcmspCisgICAgLWkJU3lzViBJUEMgKG1lc3NhZ2UgcXVldWVzLCBzZW1hcGhvcmVzLCBzaGFyZWQgbWVtb3J5KSAoLS1pcGMpCisgICAgLW0JTW91bnQvdW5tb3VudCB0cmVlICgtLW1vdW50KQorICAgIC1uCU5ldHdvcmsgYWRkcmVzcywgc29ja2V0cywgcm91dGluZywgaXB0YWJsZXMgKC0tbmV0KQorICAgIC1wCVByb2Nlc3MgSURzIGFuZCBpbml0ICgtLXBpZCkKKyAgICAtcglCZWNvbWUgcm9vdCAobWFwIGN1cnJlbnQgZXVpZC9lZ2lkIHRvIDAvMCwgaW1wbGllcyAtVSkgKC0tbWFwLXJvb3QtdXNlcikKKyAgICAtdQlIb3N0IGFuZCBkb21haW4gbmFtZXMgKC0tdXRzKQorICAgIC1VCVVJRHMsIEdJRHMsIGNhcGFiaWxpdGllcyAoLS11c2VyKQorCisgICAgQSBuYW1lc3BhY2UgYWxsb3dzIGEgc2V0IG9mIHByb2Nlc3NlcyB0byBoYXZlIGEgZGlmZmVyZW50IHZpZXcgb2YgdGhlCisgICAgc3lzdGVtIHRoYW4gb3RoZXIgc2V0cyBvZiBwcm9jZXNzZXMuCisKK2NvbmZpZyBOU0VOVEVSCisgIGJvb2wgIm5zZW50ZXIiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG5zZW50ZXIgWy10IHBpZF0gWy1GXSBbLWldIFstbV0gWy1uXSBbLXBdIFstdV0gWy1VXSBDT01NQU5ELi4uCisKKyAgICBSdW4gQ09NTUFORCBpbiBhbiBleGlzdGluZyAoc2V0IG9mKSBuYW1lc3BhY2UocykuCisKKyAgICAtdCAgUElEIHRvIHRha2UgbmFtZXNwYWNlcyBmcm9tICAgICgtLXRhcmdldCkKKyAgICAtRiAgZG9uJ3QgZm9yaywgZXZlbiBpZiAtcCBpcyB1c2VkICgtLW5vLWZvcmspCisKKyAgICBUaGUgbmFtZXNwYWNlcyB0byBzd2l0Y2ggYXJlOgorCisgICAgLWkJU3lzViBJUEM6IG1lc3NhZ2UgcXVldWVzLCBzZW1hcGhvcmVzLCBzaGFyZWQgbWVtb3J5ICgtLWlwYykKKyAgICAtbQlNb3VudC91bm1vdW50IHRyZWUgKC0tbW91bnQpCisgICAgLW4JTmV0d29yayBhZGRyZXNzLCBzb2NrZXRzLCByb3V0aW5nLCBpcHRhYmxlcyAoLS1uZXQpCisgICAgLXAJUHJvY2VzcyBJRHMgYW5kIGluaXQsIHdpbGwgZm9yayB1bmxlc3MgLUYgaXMgdXNlZCAoLS1waWQpCisgICAgLXUJSG9zdCBhbmQgZG9tYWluIG5hbWVzICgtLXV0cykKKyAgICAtVQlVSURzLCBHSURzLCBjYXBhYmlsaXRpZXMgKC0tdXNlcikKKworICAgIElmIC10IGlzbid0IHNwZWNpZmllZCwgZWFjaCBuYW1lc3BhY2UgYXJndW1lbnQgbXVzdCBwcm92aWRlIGEgcGF0aAorICAgIHRvIGEgbmFtZXNwYWNlIGZpbGUsIGFsYSAiLWk9L3Byb2MvJFBJRC9ucy9pcGMiCisqLworCisjZGVmaW5lIEZPUl9uc2VudGVyCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CitpbnQgdW5zaGFyZShpbnQgZmxhZ3MpOworaW50IHNldG5zKGludCBmZCwgaW50IG5zdHlwZSk7IAorCitHTE9CQUxTKAorICBjaGFyICpuc25hbWVzWzZdOworICBsb25nIHRhcmdldHBpZDsKKykKKworLy8gQ29kZSB0aGF0IG11c3QgcnVuIGluIHVuc2hhcmUncyBmbGFnIGNvbnRleHQKKyNkZWZpbmUgQ0xFQU5VUF9uc2VudGVyCisjZGVmaW5lIEZPUl91bnNoYXJlCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2ZsYWdzLmg+CisKK3N0YXRpYyB2b2lkIHdyaXRlX3VnaWRfbWFwKGNoYXIgKm1hcCwgdW5zaWduZWQgZXVnaWQpCit7CisgIGludCBieXRlcyA9IHNwcmludGYodG95YnVmLCAiMCAldSAxIiwgZXVnaWQpLCBmZCA9IHhvcGVuKG1hcCwgT19XUk9OTFkpOworCisgIHh3cml0ZShmZCwgdG95YnVmLCBieXRlcyk7CisgIHhjbG9zZShmZCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yKGludCBldWlkLCBpbnQgZWdpZCkKK3sKKyAgaW50IGZkOworCisgIGlmICgoZmQgPSBvcGVuKCIvcHJvYy9zZWxmL3NldGdyb3VwcyIsIE9fV1JPTkxZKSkgPj0gMCkgeworICAgIHh3cml0ZShmZCwgImRlbnkiLCA0KTsKKyAgICBjbG9zZShmZCk7CisgIH0KKworICB3cml0ZV91Z2lkX21hcCgiL3Byb2Mvc2VsZi91aWRfbWFwIiwgZXVpZCk7CisgIHdyaXRlX3VnaWRfbWFwKCIvcHJvYy9zZWxmL2dpZF9tYXAiLCBlZ2lkKTsKK30KKworc3RhdGljIGludCB0ZXN0X3IoKQoreworICByZXR1cm4gdG95cy5vcHRmbGFncyAmIEZMQUdfcjsKK30KKworc3RhdGljIGludCB0ZXN0X2YoKQoreworICByZXR1cm4gdG95cy5vcHRmbGFncyAmIEZMQUdfZjsKK30KKworLy8gU2hpZnQgYmFjayB0byB0aGUgY29udGV4dCBHTE9CQUxTIGxpdmVzIGluIChJLkUuIG1hdGNoaW5nIHRoZSBmaWxlbmFtZSkuCisjZGVmaW5lIENMRUFOVVBfdW5zaGFyZQorI2RlZmluZSBGT1JfbnNlbnRlcgorI2luY2x1ZGUgPGdlbmVyYXRlZC9mbGFncy5oPgorCit2b2lkIHVuc2hhcmVfbWFpbih2b2lkKQoreworICB1bnNpZ25lZCBmbGFnc1tdPXtDTE9ORV9ORVdVU0VSLCBDTE9ORV9ORVdVVFMsIENMT05FX05FV1BJRCwgQ0xPTkVfTkVXTkVULAorICAgICAgICAgICAgICAgICAgICBDTE9ORV9ORVdOUywgQ0xPTkVfTkVXSVBDfSwgZiA9IDA7CisgIGludCBpLCBmZDsKKworICAvLyBDcmVhdGUgbmV3IG5hbWVzcGFjZShzKT8KKyAgaWYgKENGR19VTlNIQVJFICYmICp0b3lzLndoaWNoLT5uYW1lPT0ndScpIHsKKyAgICAvLyBGb3IgLXIsIHdlIGhhdmUgdG8gc2F2ZSBvdXIgb3JpZ2luYWwgW3VnXWlkIGJlZm9yZSBjYWxsaW5nIHVuc2hhcmUoKQorICAgIGludCBldWlkID0gZ2V0ZXVpZCgpLCBlZ2lkID0gZ2V0ZWdpZCgpOworCisgICAgLy8gdW5zaGFyZSAtVSBkb2VzIG5vdCBpbXBseSAtciwgc28gd2UgY2Fubm90IHVzZSBbK3JVXQorICAgIGlmICh0ZXN0X3IoKSkgdG95cy5vcHRmbGFncyB8PSBGTEFHX1U7CisKKyAgICBmb3IgKGkgPSAwOyBpPEFSUkFZX0xFTihmbGFncyk7IGkrKykKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgKDE8PGkpKSBmIHw9IGZsYWdzW2ldOworCisgICAgaWYgKHVuc2hhcmUoZikpIHBlcnJvcl9leGl0KDApOworICAgIGlmICh0ZXN0X3IoKSkgaGFuZGxlX3IoZXVpZCwgZWdpZCk7CisKKyAgICBpZiAodGVzdF9mKCkpIHsKKyAgICAgIHRveXMuZXhpdHZhbCA9IHhydW4odG95cy5vcHRhcmdzKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgLy8gQmluZCB0byBleGlzdGluZyBuYW1lc3BhY2Uocyk/CisgIH0gZWxzZSBpZiAoQ0ZHX05TRU5URVIpIHsKKyAgICBjaGFyICpuc25hbWVzID0gInVzZXJcMHV0c1wwcGlkXDBuZXRcMG1udFwwaXBjIjsKKworICAgIGZvciAoaSA9IDA7IGk8QVJSQVlfTEVOKGZsYWdzKTsgaSsrKSB7CisgICAgICBjaGFyICpmaWxlbmFtZSA9IFRULm5zbmFtZXNbaV07CisKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgKDE8PGkpKSB7CisgICAgICAgIGlmICghZmlsZW5hbWUgfHwgISpmaWxlbmFtZSkgeworICAgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3QpKSBlcnJvcl9leGl0KCJuZWVkIC10IG9yID1maWxlbmFtZSIpOworICAgICAgICAgIHNwcmludGYodG95YnVmLCAiL3Byb2MvJWxkL25zLyVzIiwgVFQudGFyZ2V0cGlkLCBuc25hbWVzKTsKKyAgICAgICAgICBmaWxlbmFtZSA9IHRveWJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXRucyhmZCA9IHhvcGVucm8oZmlsZW5hbWUpLCBmbGFnc1tpXSkpIHBlcnJvcl9leGl0KCJzZXRucyIpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICB9CisgICAgICBuc25hbWVzICs9IHN0cmxlbihuc25hbWVzKSsxOworICAgIH0KKworICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19GKSkgeworICAgICAgdG95cy5leGl0dmFsID0geHJ1bih0b3lzLm9wdGFyZ3MpOworCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgeGV4ZWModG95cy5vcHRhcmdzKTsKK30KKwordm9pZCBuc2VudGVyX21haW4odm9pZCkKK3sKKyAgdW5zaGFyZV9tYWluKCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9vbmVpdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvb25laXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU2N2MwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvb25laXQuYwpAQCAtMCwwICsxLDExNCBAQAorLyogb25laXQuYyAtIHRpbnkgaW5pdCByZXBsYWNlbWVudCB0byBsYXVuY2ggYSBzaW5nbGUgY2hpbGQgcHJvY2Vzcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSwgMjAwNyBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0Pi4KKworVVNFX09ORUlUKE5FV1RPWShvbmVpdCwgIl48MW5jOnAzWyFwbl0iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgT05FSVQKKyAgYm9vbCAib25laXQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG9uZWl0IFstcF0gWy1jIC9kZXYvdHR5MF0gY29tbWFuZCBbLi4uXQorCisgICAgU2ltcGxlIGluaXQgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzaW5nbGUgc3VwcGxpZWQgY29tbWFuZCBsaW5lIHdpdGggYQorICAgIGNvbnRyb2xsaW5nIHR0eSAoc28gQ1RSTC1DIGNhbiBraWxsIGl0KS4KKworICAgIC1jCVdoaWNoIGNvbnNvbGUgZGV2aWNlIHRvIHVzZSAoL2Rldi9jb25zb2xlIGRvZXNuJ3QgZG8gQ1RSTC1DLCBldGMpLgorICAgIC1wCVBvd2VyIG9mZiBpbnN0ZWFkIG9mIHJlYm9vdGluZyB3aGVuIGNvbW1hbmQgZXhpdHMuCisgICAgLXIJUmVzdGFydCBjaGlsZCB3aGVuIGl0IGV4aXRzLgorICAgIC0zCVdyaXRlIDMyIGJpdCBQSUQgb2YgZWFjaCBleGl0aW5nIHJlcGFyZW50ZWQgcHJvY2VzcyB0byBmZCAzIG9mIGNoaWxkLgorICAgIAkoQmxvY2tpbmcgd3JpdGVzLCBjaGlsZCBtdXN0IHJlYWQgdG8gYXZvaWQgZXZlbnR1YWwgZGVhZGxvY2suKQorCisgICAgU3Bhd25zIGEgc2luZ2xlIGNoaWxkIHByb2Nlc3MgKGJlY2F1c2UgUElEIDEgaGFzIHNpZ25hbHMgYmxvY2tlZCkKKyAgICBpbiBpdHMgb3duIHNlc3Npb24sIHJlYXBzIHpvbWJpZXMgdW50aWwgdGhlIGNoaWxkIGV4aXRzLCB0aGVuCisgICAgcmVib290cyB0aGUgc3lzdGVtIChvciBwb3dlcnMgb2ZmIHdpdGggLXAsIG9yIHJlc3RhcnRzIHRoZSBjaGlsZCB3aXRoIC1yKS4KKworICAgIFJlc3BvbmRzIHRvIFNJR1VTUjEgYnkgaGFsdGluZyB0aGUgc3lzdGVtLCBTSUdVU1IyIGJ5IHBvd2VyaW5nIG9mZiwKKyAgICBhbmQgU0lHVEVSTSBvciBTSUdJTlQgcmVib290LgorKi8KKworI2RlZmluZSBGT1Jfb25laXQKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorCitHTE9CQUxTKAorICBjaGFyICpjb25zb2xlOworKQorCisvLyBUaGUgbWluaW11bSBhbW91bnQgb2Ygd29yayBuZWNlc3NhcnkgdG8gZ2V0IGN0cmwtYyBhbmQgc3VjaCB0byB3b3JrIGlzOgorLy8KKy8vIC0gRm9yayBhIGNoaWxkIChQSUQgMSBpcyBzcGVjaWFsOiBjYW4ndCBleGl0LCBoYXMgdmFyaW91cyBzaWduYWxzIGJsb2NrZWQpLgorLy8gLSBEbyBhIHNldHNpZCgpIChzbyB3ZSBoYXZlIG91ciBvd24gc2Vzc2lvbikuCisvLyAtIEluIHRoZSBjaGlsZCwgYXR0YWNoIHN0ZGlvIHRvIC9kZXYvdHR5MCAoL2Rldi9jb25zb2xlIGlzIHNwZWNpYWwpCisvLyAtIEV4ZWMgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZS4KKy8vCisvLyBQSUQgMSB0aGVuIHJlYXBzIHpvbWJpZXMgdW50aWwgdGhlIGNoaWxkIHByb2Nlc3MgaXQgc3Bhd25lZCBleGl0cywgYXQgd2hpY2gKKy8vIHBvaW50IGl0IGNhbGxzIHN5bmMoKSBhbmQgcmVib290KCkuICBJIGNvdWxkIHN0aWNrIGEga2lsbCAtMSBpbiB0aGVyZS4KKworLy8gUGVyZm9ybSBhY3Rpb25zIGluIHJlc3BvbnNlIHRvIHNpZ25hbHMuIChPbmx5IHJvb3QgY2FuIHNlbmQgdXMgc2lnbmFscy4pCitzdGF0aWMgdm9pZCBvbmVpdF9zaWduYWxlZChpbnQgc2lnbmFsKQoreworICBpbnQgYWN0aW9uID0gUkJfQVVUT0JPT1Q7CisKKyAgdG95cy5zaWduYWwgPSBzaWduYWw7CisgIGlmIChzaWduYWwgPT0gU0lHVVNSMSkgYWN0aW9uID0gUkJfSEFMVF9TWVNURU07CisgIGlmIChzaWduYWwgPT0gU0lHVVNSMikgYWN0aW9uID0gUkJfUE9XRVJfT0ZGOworCisgIC8vIFBJRCAxIGNhbid0IGNhbGwgcmVib290KCkgYmVjYXVzZSBpdCBraWxscyB0aGUgdGFzayB0aGF0IGNhbGxzIGl0LAorICAvLyB3aGljaCBjYXVzZXMgdGhlIGtlcm5lbCB0byBwYW5pYyBiZWZvcmUgdGhlIGFjdHVhbCByZWJvb3QgaGFwcGVucy4KKyAgc3luYygpOworICBpZiAoIXZmb3JrKCkpIHJlYm9vdChhY3Rpb24pOworfQorCit2b2lkIG9uZWl0X21haW4odm9pZCkKK3sKKyAgaW50IGksIHBpZCwgcGlwZXNbXSA9IHtTSUdVU1IxLCBTSUdVU1IyLCBTSUdURVJNLCBTSUdJTlR9OworCisgIC8vIFNldHVwIHNpZ25hbCBoYW5kbGVycyBmb3Igc2lnbmFscyBvZiBpbnRlcmVzdAorICBmb3IgKGkgPSAwOyBpPEFSUkFZX0xFTihwaXBlcyk7IGkrKykgeHNpZ25hbChwaXBlc1tpXSwgb25laXRfc2lnbmFsZWQpOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR18zKSB7CisgICAgLy8gRW5zdXJlIG5leHQgYXZhaWxhYmxlIGZpbGVoYW5kbGVzIGFyZSAjMyBhbmQgIzQKKyAgICB3aGlsZSAoeG9wZW5fc3RkaW8oIi8iLCAwKSA8IDMpOworICAgIGNsb3NlKDMpOworICAgIGNsb3NlKDQpOworICAgIHhwaXBlKHBpcGVzKTsKKyAgICBmY250bCg0LCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgfQorCisgIHdoaWxlICghdG95cy5zaWduYWwpIHsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBjaGlsZCBwcm9jZXNzLgorICAgIHBpZCA9IHZmb3JrKCk7CisgICAgaWYgKHBpZCkgeworCisgICAgICAvLyBwaWQgMSByZWFwcyB6b21iaWVzIHVudGlsIGl0IGdldHMgaXRzIGNoaWxkLCB0aGVuIGhhbHRzIHN5c3RlbS4KKyAgICAgIC8vIFdlIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHdyaXRlICh3aGF0IHdvdWxkIHdlIGRvIHdpdGggaXQ/KQorICAgICAgLy8gYnV0IHNhdmUgaXQgaW4gYSB2YXJpYWJsZSB3ZSBuZXZlciByZWFkIHRvIG1ha2UgZm9ydGlmeSBzaHV0IHVwLgorICAgICAgLy8gKFJlYWwgcHJvYmxlbSBpcyBpZiBwaWQyIG5ldmVyIHJlYWRzLCB3cml0ZSgpIGZpbGxzIHBpcGUgYW5kIGJsb2Nrcy4pCisgICAgICB3aGlsZSAocGlkICE9IHdhaXQoJmkpKSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfMykgaSA9IHdyaXRlKDQsICZwaWQsIDQpOworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pIGNvbnRpbnVlOworCisgICAgICBvbmVpdF9zaWduYWxlZCgodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgPyBTSUdVU1IyIDogU0lHVEVSTSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlZGlyZWN0IHN0ZGlvIHRvIC9kZXYvdHR5MCwgd2l0aCBuZXcgc2Vzc2lvbiBJRCwgc28gY3RybC1jIHdvcmtzLgorICAgICAgc2V0c2lkKCk7CisgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKKyAgICAgICAgY2xvc2UoaSk7CisgICAgICAgIC8vIFJlbWVtYmVyLCBPX0NMT0VYRUMgaXMgYmFja3dhcmRzIGZvciB4b3BlbigpCisgICAgICAgIHhvcGVuKFRULmNvbnNvbGUgPyBUVC5jb25zb2xlIDogIi9kZXYvdHR5MCIsIE9fUkRXUnxPX0NMT0VYRUMpOworICAgICAgfQorCisgICAgICAvLyBDYW4ndCB4ZXhlYygpIGhlcmUsIHdlIHZmb3JrZWQgc28gd2UgZG9uJ3Qgd2FudCB0byBlcnJvcl9leGl0KCkuCisgICAgICB0b3lfZXhlYyh0b3lzLm9wdGFyZ3MpOworICAgICAgZXhlY3ZwKCp0b3lzLm9wdGFyZ3MsIHRveXMub3B0YXJncyk7CisgICAgICBwZXJyb3JfbXNnKCIlcyBub3QgaW4gUEFUSD0lcyIsICp0b3lzLm9wdGFyZ3MsIGdldGVudigiUEFUSCIpKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gR2l2ZSByZWJvb3QoKSB0aW1lIHRvIGtpY2sgaW4sIG9yIGF2b2lkIHJhcGlkIHNwaW5uaW5nIGlmIGV4ZWMgZmFpbGVkCisgIHNsZWVwKDUpOworICBfZXhpdCgxMjcpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcGFydHByb2JlLmMgYi90b3lib3gvdG95cy9vdGhlci9wYXJ0cHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ0Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvcGFydHByb2JlLmMKQEAgLTAsMCArMSwzMCBAQAorLyogcGFydHByb2JlLmMgLSBUZWxsIHRoZSBrZXJuZWwgYWJvdXQgcGFydGl0aW9uIHRhYmxlIGNoYW5nZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBCZXJ0b2xkIFZhbiBkZW4gQmVyZ2ggPHZhbmRlbmJlcmdoQGJlcnRvbGQub3JnPgorICoKKyAqIHNlZSBodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjgvcGFydHByb2JlLjguaHRtbAorCitVU0VfUEFSVFBST0JFKE5FV1RPWShwYXJ0cHJvYmUsICI8MSIsIFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBQQVJUUFJPQkUKKyAgYm9vbCAicGFydHByb2JlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBwYXJ0cHJvYmUgREVWSUNFLi4uCisKKyAgICBUZWxsIHRoZSBrZXJuZWwgYWJvdXQgcGFydGl0aW9uIHRhYmxlIGNoYW5nZXMKKworICAgIEFzayB0aGUga2VybmVsIHRvIHJlLXJlYWQgdGhlIHBhcnRpdGlvbiB0YWJsZSBvbiB0aGUgc3BlY2lmaWVkIGRldmljZXMuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgdm9pZCBkb19wYXJ0cHJvYmUoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpZiAoaW9jdGwoZmQsIEJMS1JSUEFSVCwgMCkpIHBlcnJvcl9tc2coImlvY3RsIGZhaWxlZCIpOworfQorCit2b2lkIHBhcnRwcm9iZV9tYWluKHZvaWQpCit7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX3BhcnRwcm9iZSk7IAorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcGl2b3Rfcm9vdC5jIGIvdG95Ym94L3RveXMvb3RoZXIvcGl2b3Rfcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDgwMzIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9waXZvdF9yb290LmMKQEAgLTAsMCArMSwzMiBAQAorLyogcGl2b3Rfcm9vdC5jIC0gZWRpdCBzeXN0ZW0gbW91bnQgdHJlZQorICoKKyAqIENvcHlyaWdodCAyMDEyIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKK1VTRV9QSVZPVF9ST09UKE5FV1RPWShwaXZvdF9yb290LCAiPDI+MiIsIFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBQSVZPVF9ST09UCisgIGJvb2wgInBpdm90X3Jvb3QiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHBpdm90X3Jvb3QgT0xEIE5FVworCisgICAgU3dhcCBPTEQgYW5kIE5FVyBmaWxlc3lzdGVtcyAoYXMgaWYgYnkgc2ltdWx0YW5lb3VzIG1vdW50IC0tbW92ZSksIGFuZAorICAgIG1vdmUgYWxsIHByb2Nlc3NlcyB3aXRoIGNoZGlyIG9yIGNocm9vdCB1bmRlciBPTEQgaW50byBORVcgKGluY2x1ZGluZworICAgIGtlcm5lbCB0aHJlYWRzKSBzbyBPTEQgbWF5IGJlIHVubW91bnRlZC4KKworICAgIFRoZSBkaXJlY3RvcnkgTkVXIG11c3QgZXhpc3QgdW5kZXIgT0xELiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpbml0cmFtZnMsCisgICAgd2hpY2ggY2FuJ3QgYmUgbW92ZWQgKGFib3V0IHRoZSBzYW1lIHdheSBQSUQgMSBjYW4ndCBiZSBraWxsZWQ7IHNlZQorICAgIHN3aXRjaF9yb290IGluc3RlYWQpLgorKi8KKworI2RlZmluZSBGT1JfcGl2b3Rfcm9vdAorI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3ZvaWQgcGl2b3Rfcm9vdF9tYWluKHZvaWQpCit7CisgIGlmIChzeXNjYWxsKF9fTlJfcGl2b3Rfcm9vdCwgdG95cy5vcHRhcmdzWzBdLCB0b3lzLm9wdGFyZ3NbMV0pKQorICAgIHBlcnJvcl9leGl0KCInJXMnIC0+ICclcyciLCB0b3lzLm9wdGFyZ3NbMF0sIHRveXMub3B0YXJnc1sxXSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9wbWFwLmMgYi90b3lib3gvdG95cy9vdGhlci9wbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzZWEzZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3BtYXAuYwpAQCAtMCwwICsxLDExMyBAQAorLyogcG1hcC5jIC0gUmVwb3J0cyB0aGUgbWVtb3J5IG1hcCBvZiBhIHByb2Nlc3Mgb3IgcHJvY2Vzc2VzLgorICoKKyAqIENvcHlyaWdodCAyMDEzIFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkLgorCitVU0VfUE1BUChORVdUT1kocG1hcCwgIjwxeHEiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQTUFQCisgIGJvb2wgInBtYXAiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHBtYXAgWy14cV0gW3BpZHMuLi5dCisKKyAgICBSZXBvcnRzIHRoZSBtZW1vcnkgbWFwIG9mIGEgcHJvY2VzcyBvciBwcm9jZXNzZXMuCisKKyAgICAteCBTaG93IHRoZSBleHRlbmRlZCBmb3JtYXQuCisgICAgLXEgRG8gbm90IGRpc3BsYXkgc29tZSBoZWFkZXIvZm9vdGVyIGxpbmVzLgorKi8KKworI2RlZmluZSBGT1JfcG1hcAorI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBwbWFwX21haW4odm9pZCkKK3sKKyAgY2hhciAqKm9wdGFyZ3M7CisKKyAgZm9yIChvcHRhcmdzID0gdG95cy5vcHRhcmdzOyAqb3B0YXJnczsgb3B0YXJncysrKSB7CisgICAgcGlkX3QgcGlkID0gYXRvbHgoKm9wdGFyZ3MpOworICAgIEZJTEUgKmZwOworICAgIGNoYXIgKmxpbmUsICpvbGRsaW5lID0gMCwgKm5hbWUgPSAwLAorICAgICAgICAgKmsgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfeCkgPyAiIiA6ICJLIjsKKyAgICBzaXplX3QgbGVuOworICAgIGxvbmcgbG9uZyBzdGFydCwgZW5kLCBwc3MsIHRwc3MgPSAwLCBkaXJ0eSwgdGRpcnR5ID0gMCwgc3dhcCwgdHN3YXAgPSAwLAorICAgICAgICAgICAgICB0b3RhbCA9IDA7CisgICAgaW50IHh4ID0gMDsKKworICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvcHJvYy8ldS9jbWRsaW5lIiwgcGlkKTsKKyAgICBsaW5lID0gcmVhZGZpbGUodG95YnVmLCAwLCAwKTsKKyAgICBpZiAoIWxpbmUpIGVycm9yX21zZygiTm8gJWx1IiwgKGxvbmcpcGlkKTsKKyAgICB4cHJpbnRmKCIldTogJXNcbiIsIChpbnQpcGlkLCBsaW5lKTsKKyAgICBmcmVlKGxpbmUpOworCisgICAgLy8gSGVhZGVyCisgICAgLy8gT25seSB1c2UgdGhlIG1vcmUgdmVyYm9zZSBmaWxlIGluIC14IG1vZGUKKyAgICBzcHJpbnRmKHRveWJ1ZiwgIi9wcm9jLyV1LyVzbWFwcyIsIHBpZCwKKyAgICAgICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSA/ICJzIiA6ICIiKTsKKyAgICBpZiAoIShmcCA9IGZvcGVuKHRveWJ1ZiwgInIiKSkpIHsKKyAgICAgIGVycm9yX21zZygiTm8gJWxkXG4iLCAobG9uZylwaWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgodG95cy5vcHRmbGFncyAmIChGTEFHX3F8RkxBR194KSkgPT0gRkxBR194KQorICAgICAgeHByaW50ZigiQWRkcmVzcyUqY0tieXRlcyAgICAgUFNTICAgRGlydHkgICAgU3dhcCAgTW9kZSAgTWFwcGluZ1xuIiwKKyAgICAgICAgKGludCkoc2l6ZW9mKGxvbmcpKjIpLTQsICcgJyk7CisKKyAgICAvLyBMb29wIHRocm91Z2ggbWFwcGluZ3MKKyAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgb2ZmLCBjb3VudDsKKworICAgICAgbGluZSA9IDA7CisgICAgICBpZiAoMCA+PSBnZXRsaW5lKCZsaW5lLCAmbGVuLCBmcCkpIGJyZWFrOworICAgICAgY291bnQgPSBzc2NhbmYobGluZSwgIiVsbHgtJWxseCAlcyAlKnMgJSpzICUqcyAlbiIsCisgICAgICAgICZzdGFydCwgJmVuZCwgdG95YnVmLCAmb2ZmKTsKKworICAgICAgaWYgKGNvdW50ID09IDMpIHsKKyAgICAgICAgbmFtZSA9IGxpbmVbb2ZmXSA/IGxpbmUrb2ZmIDogIiAgW2Fub25dXG4iOworICAgICAgICBpZiAodG95YnVmWzNdID09ICdwJykgdG95YnVmWzNdID0gJy0nOworICAgICAgICB0b3RhbCArPSBlbmQgPSAoZW5kLXN0YXJ0KS8xMDI0OworICAgICAgICBwcmludGYoIiUwKmxseCAlICpsbGQlcyAiLCAoaW50KSgyKnNpemVvZihsb25nKSksIHN0YXJ0LAorICAgICAgICAgIDYrISEodG95cy5vcHRmbGFncyAmIEZMQUdfeCksIGVuZCwgayk7CisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSB7CisgICAgICAgICAgb2xkbGluZSA9IGxpbmU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgwPHNzY2FuZihsaW5lLCAiUHNzOiAlbGxkIiwgJnBzcykKKyAgICAgICAgICAgIHx8IDA8c3NjYW5mKGxpbmUsICJQcml2YXRlX0RpcnR5OiAlbGxkIiwgJmRpcnR5KQorICAgICAgICAgICAgfHwgMDxzc2NhbmYobGluZSwgIlN3YXA6ICVsbGQiLCAmc3dhcCkpIHh4Kys7CisgICAgICAgIGZyZWUobGluZSk7CisgICAgICAgIGlmICh4eDwzKSBjb250aW51ZTsKKyAgICAgICAgbGluZSA9IG9sZGxpbmU7CisgICAgICAgIG5hbWUgPSBiYXNlbmFtZShuYW1lKTsKKyAgICAgICAgeHggPSAwOworICAgICAgICBwcmludGYoIiUgN2xsZCAlN2xsZCAlN2xsZCAiLCBwc3MsIGRpcnR5LCBzd2FwKTsKKyAgICAgICAgdHBzcyArPSBwc3M7CisgICAgICAgIHRkaXJ0eSArPSBkaXJ0eTsKKyAgICAgICAgdHN3YXAgKz0gc3dhcDsKKyAgICAgIH0KKworICAgICAgeHByaW50ZigiJXMtICAlcyVzIiwgdG95YnVmLCBsaW5lW29mZl09PSdbJyA/ICIgICIgOiAiIiwgbmFtZSk7CisKKyAgICAgIGZyZWUobGluZSk7CisgICAgICBsaW5lID0gMDsKKyAgICB9CisKKyAgICAvLyBUcmFpbGVyCisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfcSkpIHsKKyAgICAgIGludCB4ID0gISEodG95cy5vcHRmbGFncyAmIEZMQUdfeCk7CisgICAgICBpZiAoeCkgeworICAgICAgICBtZW1zZXQodG95YnVmLCAnLScsIDE2KTsKKyAgICAgICAgeHByaW50ZigiJS4qcyAgLS0tLS0tICAtLS0tLS0gIC0tLS0tLSAgLS0tLS0tXG4iLCAoaW50KShzaXplb2YobG9uZykqMiksCisgICAgICAgICAgdG95YnVmKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigidG90YWwlICpsbGQlcyIsIDIqKGludCkoc2l6ZW9mKGxvbmcpKzEpK3gsIHRvdGFsLCBrKTsKKyAgICAgIGlmICh4KSBwcmludGYoIiUgOGxsZCUgOGxsZCUgOGxsZCIsIHRwc3MsIHRkaXJ0eSwgdHN3YXApOworICAgICAgeHB1dGMoJ1xuJyk7CisgICAgfQorIAorICAgIGZjbG9zZShmcCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3ByaW50ZW52LmMgYi90b3lib3gvdG95cy9vdGhlci9wcmludGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmNmMjkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9wcmludGVudi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHByaW50ZW52LmMgLSBQcmludCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTIgR2VvcmdpIENob3JiYWR6aGl5c2tpIDxnZW9yZ2lAdW5peHNvbC5vcmc+CisKK1VTRV9QUklOVEVOVihORVdUT1kocHJpbnRlbnYsICIwKG51bGwpIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgUFJJTlRFTlYKKyAgYm9vbCAicHJpbnRlbnYiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHByaW50ZW52IFstMF0gW2Vudl92YXIuLi5dCisKKyAgICBQcmludCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKyAgICAtMAlVc2UgXDAgYXMgZGVsaW1pdGVyIGluc3RlYWQgb2YgXG4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKwordm9pZCBwcmludGVudl9tYWluKHZvaWQpCit7CisgIGNoYXIgKiplbnYsICoqdmFyID0gdG95cy5vcHRhcmdzOworICBjaGFyIGRlbGltID0gJ1xuJzsKKworICBpZiAodG95cy5vcHRmbGFncykgZGVsaW0gPSAwOworCisgIGRvIHsKKyAgICBpbnQgY2F0Y2ggPSAwLCBsZW4gPSAqdmFyID8gc3RybGVuKCp2YXIpIDogMDsKKworICAgIGZvciAoZW52ID0gZW52aXJvbjsgKmVudjsgZW52KyspIHsKKyAgICAgIGNoYXIgKm91dCA9ICplbnY7CisgICAgICBpZiAoKnZhcikgeworICAgICAgICBpZiAoIXN0cm5jbXAob3V0LCAqdmFyLCBsZW4pICYmIG91dFtsZW5dID09ICc9Jykgb3V0ICs9IGxlbiArMTsKKyAgICAgICAgZWxzZSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHhwcmludGYoIiVzJWMiLCBvdXQsIGRlbGltKTsKKyAgICAgIGNhdGNoKys7CisgICAgfQorICAgIGlmICgqdmFyICYmICFjYXRjaCkgdG95cy5leGl0dmFsID0gMTsKKyAgfSB3aGlsZSAoKnZhciAmJiAqKCsrdmFyKSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9wd2R4LmMgYi90b3lib3gvdG95cy9vdGhlci9wd2R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MmRiYQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3B3ZHguYwpAQCAtMCwwICsxLDMzIEBACisvKiBwd2R4LmMgLSByZXBvcnQgY3VycmVudCBkaXJlY3Rvcnkgb2YgYSBwcm9jZXNzLiAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBMdWthc3ogU2thbHNraSA8bC5za2Fsc2tpQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKK1VTRV9QV0RYKE5FV1RPWShwd2R4LCAiPDFhIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgUFdEWAorICBib29sICJwd2R4IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBwd2R4IFBJRC4uLgorCisgICAgUHJpbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgcHJvY2Vzc2VzIGxpc3RlZCBvbiBjb21tYW5kIGxpbmUuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHB3ZHhfbWFpbih2b2lkKQoreworICBjaGFyICoqb3B0YXJnczsKKworICBmb3IgKG9wdGFyZ3MgPSB0b3lzLm9wdGFyZ3M7ICpvcHRhcmdzOyBvcHRhcmdzKyspIHsKKyAgICBjaGFyICpwYXRoID0gdG95YnVmOworCisgICAgc3ByaW50Zih0b3lidWYsICIvcHJvYy8lZC9jd2QiLCBhdG9pKCpvcHRhcmdzKSk7CisgICAgaWYgKCFyZWFkbGluazAocGF0aCwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpIHsKKyAgICAgIHBhdGggPSBzdHJlcnJvcihlcnJubyk7CisgICAgICB0b3lzLmV4aXR2YWwgPSAxOworICAgIH0KKworICAgIHhwcmludGYoIiVzOiAlc1xuIiwgKm9wdGFyZ3MsIHBhdGgpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9yZWFkYWhlYWQuYyBiL3RveWJveC90b3lzL290aGVyL3JlYWRhaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGQ2NTEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9yZWFkYWhlYWQuYwpAQCAtMCwwICsxLDM3IEBACisvKiByZWFkYWhlYWQuYyAtIHByZWxvYWQgZmlsZXMgaW50byBkaXNrIGNhY2hlLgorICoKKyAqIENvcHlyaWdodCAyMDEzIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm8gc3RhbmRhcmQuCisKK1VTRV9SRUFEQUhFQUQoTkVXVE9ZKHJlYWRhaGVhZCwgTlVMTCwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgUkVBREFIRUFECisgIGJvb2wgInJlYWRhaGVhZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcmVhZGFoZWFkIEZJTEUuLi4KKworICAgIFByZWxvYWQgZmlsZXMgaW50byBkaXNrIGNhY2hlLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKK3N0YXRpYyB2b2lkIGRvX3JlYWRhaGVhZChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGludCByYzsKKworICAvLyBTaW5jZSBpbmNsdWRpbmcgZmNudGwuaCBkb2Vzbid0IGdpdmUgdXMgdGhlIHdyYXBwZXIsIHVzZSB0aGUgc3lzY2FsbC4KKyAgLy8gMzIgYml0cyB0YWtlcyBMTy9ISSBvZmZzZXQgKHdlIGRvbid0IGNhcmUgYWJvdXQgZW5kaWFubmVzcyBvZiAwKS4KKyAgaWYgKHNpemVvZihsb25nKSA9PSA0KSByYyA9IHN5c2NhbGwoX19OUl9yZWFkYWhlYWQsIGZkLCAwLCAwLCBJTlRfTUFYKTsKKyAgZWxzZSByYyA9IHN5c2NhbGwoX19OUl9yZWFkYWhlYWQsIGZkLCAwLCBJTlRfTUFYKTsKKworICBpZiAocmMpIHBlcnJvcl9tc2coInJlYWRhaGVhZDogJXMiLCBuYW1lKTsKK30KKwordm9pZCByZWFkYWhlYWRfbWFpbih2b2lkKQoreworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19yZWFkYWhlYWQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcmVhZGxpbmsuYyBiL3RveWJveC90b3lzL290aGVyL3JlYWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjZDFlZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3JlYWRsaW5rLmMKQEAgLTAsMCArMSw0MSBAQAorLyogcmVhZGxpbmsuYyAtIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzeW1ib2xpYyBsaW5rLgorICoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKK1VTRV9SRUFETElOSyhORVdUT1kocmVhZGxpbmssICI8MT4xZmVucVstZmVdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgUkVBRExJTksKKyAgYm9vbCAicmVhZGxpbmsiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHJlYWRsaW5rIEZJTEUKKworICAgIFdpdGggbm8gb3B0aW9ucywgc2hvdyB3aGF0IHN5bWxpbmsgcG9pbnRzIHRvLCByZXR1cm4gZXJyb3IgaWYgbm90IHN5bWxpbmsuCisKKyAgICBPcHRpb25zIGZvciBwcm9kdWNpbmcgY2Fubm9uaWNhbCBwYXRocyAoYWxsIHN5bWxpbmtzLy4vLi4gcmVzb2x2ZWQpOgorCisgICAgLWUJY2Fubm9uaWNhbCBwYXRoIHRvIGV4aXN0aW5nIGVudHJ5IChmYWlsIGlmIG1pc3NpbmcpCisgICAgLWYJZnVsbCBwYXRoIChmYWlsIGlmIGRpcmVjdG9yeSBtaXNzaW5nKQorICAgIC1uCW5vIHRyYWlsaW5nIG5ld2xpbmUKKyAgICAtcQlxdWlldCAobm8gb3V0cHV0LCBqdXN0IGVycm9yIGNvZGUpCisqLworCisjZGVmaW5lIEZPUl9yZWFkbGluaworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCByZWFkbGlua19tYWluKHZvaWQpCit7CisgIGNoYXIgKnM7CisKKyAgLy8gQ2FsY3VsYXRpbmcgZnVsbCBjYW5ub25pY2FsIHBhdGg/CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19mfEZMQUdfZSkpCisgICAgcyA9IHhhYnNwYXRoKCp0b3lzLm9wdGFyZ3MsIHRveXMub3B0ZmxhZ3MgJiBGTEFHX2UpOworICBlbHNlIHMgPSB4cmVhZGxpbmsoKnRveXMub3B0YXJncyk7CisKKyAgaWYgKHMpIHsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkKKyAgICAgIHhwcmludGYoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pID8gIiVzIiA6ICIlc1xuIiwgcyk7CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShzKTsKKyAgfSBlbHNlIHRveXMuZXhpdHZhbCA9IDE7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9yZWFscGF0aC5jIGIvdG95Ym94L3RveXMvb3RoZXIvcmVhbHBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc1ZDNmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvcmVhbHBhdGguYwpAQCAtMCwwICsxLDI2IEBACisvKiByZWFscGF0aC5jIC0gUmV0dXJuIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiBhIHBhdGhuYW1lCisgKgorICogQ29weXJpZ2h0IDIwMTIgQW5kcmUgUmVuYXVkIDxhbmRyZUBibHVld2F0ZXJzeXMuY29tPgorCitVU0VfUkVBTFBBVEgoTkVXVE9ZKHJlYWxwYXRoLCAiPDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBSRUFMUEFUSAorICBib29sICJyZWFscGF0aCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcmVhbHBhdGggRklMRS4uLgorCisgICAgRGlzcGxheSB0aGUgY2Fub25pY2FsIGFic29sdXRlIHBhdGhuYW1lCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHJlYWxwYXRoX21haW4odm9pZCkKK3sKKyAgY2hhciAqKnMgPSB0b3lzLm9wdGFyZ3M7CisKKyAgZm9yIChzID0gdG95cy5vcHRhcmdzOyAqczsgcysrKSB7CisgICAgaWYgKCFyZWFscGF0aCgqcywgdG95YnVmKSkgcGVycm9yX21zZ19yYXcoKnMpOworICAgIGVsc2UgeHB1dHModG95YnVmKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcmVib290LmMgYi90b3lib3gvdG95cy9vdGhlci9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVlYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvcmVib290LmMKQEAgLTAsMCArMSwzNSBAQAorLyogcmVib290LmMgLSBSZXN0YXJ0LCBoYWx0IG9yIHBvd2VyZG93biB0aGUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAyMDEzIEVsaWUgRGUgQnJhdXdlciA8ZWxpZWRlYnJhdXdlckBnbWFpbC5jb20+CisKK1VTRV9SRUJPT1QoTkVXVE9ZKHJlYm9vdCwgImZuIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorVVNFX1JFQk9PVChPTERUT1koaGFsdCwgcmVib290LCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfUkVCT09UKE9MRFRPWShwb3dlcm9mZiwgcmVib290LCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBSRUJPT1QKKyAgYm9vbCAicmVib290IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiByZWJvb3QvaGFsdC9wb3dlcm9mZiBbLWZuXQorCisgICAgUmVzdGFydCwgaGFsdCBvciBwb3dlcmRvd24gdGhlIHN5c3RlbS4KKworICAgIC1mCURvbid0IHNpZ25hbCBpbml0CisgICAgLW4JRG9uJ3Qgc3luYyBiZWZvcmUgc3RvcHBpbmcgdGhlIHN5c3RlbS4KKyovCisKKyNkZWZpbmUgRk9SX3JlYm9vdAorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxzeXMvcmVib290Lmg+CisKK3ZvaWQgcmVib290X21haW4odm9pZCkKK3sKKyAgaW50IHR5cGVzW10gPSB7UkJfQVVUT0JPT1QsIFJCX0hBTFRfU1lTVEVNLCBSQl9QT1dFUl9PRkZ9LAorICAgICAgc2lnc1tdID0ge1NJR1RFUk0sIFNJR1VTUjEsIFNJR1VTUjJ9LCBpZHg7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbikpIHN5bmMoKTsKKworICBpZHggPSBzdHJpZHgoImhwIiwgKnRveXMud2hpY2gtPm5hbWUpKzE7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSB0b3lzLmV4aXR2YWwgPSByZWJvb3QodHlwZXNbaWR4XSk7CisgIGVsc2UgdG95cy5leGl0dmFsID0ga2lsbCgxLCBzaWdzW2lkeF0pOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcmVzZXQuYyBiL3RveWJveC90b3lzL290aGVyL3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyMDg5YwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3Jlc2V0LmMKQEAgLTAsMCArMSwyMyBAQAorLyogcmVzZXQuYyAtIHJlc2V0IHRoZSB0ZXJtaW5hbC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIE5vIHN0YW5kYXJkLgorCitVU0VfUkVTRVQoTkVXVE9ZKHJlc2V0LCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBSRVNFVAorICBib29sICJyZXNldCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcmVzZXQKKworICAgIHJlc2V0IHRoZSB0ZXJtaW5hbAorKi8KKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgcmVzZXRfbWFpbih2b2lkKQoreworICAvLyBtYW4gNCBjb25zb2xlIGNvZGVzOiByZXNldCB0ZXJtaW5hbCBpcyBFU0MgKG5vIGxlZnQgYnJhY2tldCkgYworICB4d3JpdGUoeGdldHR0eSgpLCAiXDAzM2MiLCAyKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3Jldi5jIGIvdG95Ym94L3RveXMvb3RoZXIvcmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwNjYzMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3Jldi5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHJldi5jIC0gcmV2ZXJzZSBsaW5lcyBvZiBhIHNldCBvZiBnaXZlbiBpbnB1dCBmaWxlcworICoKKyAqIENvcHlyaWdodCAyMDEyIEVsaWUgRGUgQnJhdXdlciA8ZWxpZWRlYnJhdXdlckBnbWFpbC5jb20+CisKK1VTRV9SRVYoTkVXVE9ZKHJldiwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgUkVWCisgIGJvb2wgInJldiIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcmV2IFtGSUxFLi4uXQorCisgICAgT3V0cHV0IGVhY2ggbGluZSByZXZlcnNlZCwgd2hlbiBubyBmaWxlcyBhcmUgZ2l2ZW4gc3RkaW4gaXMgdXNlZC4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0YXRpYyB2b2lkIGRvX3JldihpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKmM7CisKKyAgZm9yICg7OykgeworICAgIHVuc2lnbmVkIGxlbiwgaTsKKworICAgIGlmICghKGMgPSBnZXRfbGluZShmZCkpKSBicmVhazsKKyAgICBsZW4gPSBzdHJsZW4oYyk7CisgICAgaWYgKGxlbi0tKSBmb3IgKGkgPSAwOyBpIDw9IGxlbi8yOyBpKyspIHsKKyAgICAgIGNoYXIgdG1wID0gY1tpXTsKKworICAgICAgY1tpXSA9IGNbbGVuLWldOworICAgICAgY1tsZW4taV0gPSB0bXA7CisgICAgfQorICAgIHhwdXRzKGMpOworICAgIGZyZWUoYyk7CisgIH0KK30KKwordm9pZCByZXZfbWFpbih2b2lkKQoreworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19yZXYpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvcm1tb2QuYyBiL3RveWJveC90b3lzL290aGVyL3JtbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjMTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3JtbW9kLmMKQEAgLTAsMCArMSw0MyBAQAorLyogcm1tb2QuYyAtIFJlbW92ZSBhIG1vZHVsZSBmcm9tIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKworVVNFX1JNTU9EKE5FV1RPWShybW1vZCwgIjwxd2YiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBSTU1PRAorICBib29sICJybW1vZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcm1tb2QgWy13Zl0gW01PRFVMRV0KKworICAgIFVubG9hZCB0aGUgbW9kdWxlIG5hbWVkIE1PRFVMRSBmcm9tIHRoZSBMaW51eCBrZXJuZWwuCisgICAgLWYJRm9yY2UgdW5sb2FkIG9mIGEgbW9kdWxlCisgICAgLXcJV2FpdCB1bnRpbCB0aGUgbW9kdWxlIGlzIG5vIGxvbmdlciB1c2VkLgorCisqLworCisjZGVmaW5lIEZPUl9ybW1vZAorI2luY2x1ZGUgInRveXMuaCIKKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjZGVmaW5lIGRlbGV0ZV9tb2R1bGUobW9kLCBmbGFncykgc3lzY2FsbChfX05SX2RlbGV0ZV9tb2R1bGUsIG1vZCwgZmxhZ3MpCisKK3ZvaWQgcm1tb2RfbWFpbih2b2lkKQoreworICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBPX05PTkJMT0NLfE9fRVhDTDsKKyAgY2hhciAqIG1vZF9uYW1lOworICBpbnQgbGVuOworCisgIC8vIEJhc2VuYW1lCisgIG1vZF9uYW1lID0gYmFzZW5hbWUoKnRveXMub3B0YXJncyk7CisKKyAgLy8gUmVtb3ZlIC5rbyBpZiBwcmVzZW50CisgIGxlbiA9IHN0cmxlbihtb2RfbmFtZSk7CisgIGlmIChsZW4gPiAzICYmICFzdHJjbXAoJm1vZF9uYW1lW2xlbi0zXSwgIi5rbyIgKSkgbW9kX25hbWVbbGVuLTNdID0gMDsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZikgZmxhZ3MgfD0gT19UUlVOQzsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpIGZsYWdzICY9IH5PX05PTkJMT0NLOworCisgIGlmIChkZWxldGVfbW9kdWxlKG1vZF9uYW1lLCBmbGFncykpCisgICAgcGVycm9yX2V4aXQoImZhaWxlZCB0byB1bmxvYWQgJXMiLCBtb2RfbmFtZSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9zZXRmYXR0ci5jIGIvdG95Ym94L3RveXMvb3RoZXIvc2V0ZmF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA5OTFmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvc2V0ZmF0dHIuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBzZXRmYXR0ci5jIC0gV3JpdGUgUE9TSVggZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuCisgKgorICogTm8gc3RhbmRhcmQKKworVVNFX1NFVEZBVFRSKE5FV1RPWShzZXRmYXR0ciwgImhuOnx2Ong6fFsheHZdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgU0VURkFUVFIKKyAgYm9vbCAic2V0ZmF0dHIiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHNldGZhdHRyIFstaF0gWy14fC1uIE5BTUVdIFstdiBWQUxVRV0gRklMRS4uLgorCisgICAgV3JpdGUgUE9TSVggZXh0ZW5kZWQgYXR0cmlidXRlcy4KKworICAgIC1oCURvIG5vdCBkZXJlZmVyZW5jZSBzeW1saW5rLgorICAgIC1uCVNldCBnaXZlbiBhdHRyaWJ1dGUuCisgICAgLXgJUmVtb3ZlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgICAtdglTZXQgdmFsdWUgZm9yIGF0dHJpYnV0ZSAtbiAoZGVmYXVsdCBpcyBlbXB0eSkuCisqLworCisjZGVmaW5lIEZPUl9zZXRmYXR0cgorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqeCwgKnYsICpuOworKQorCitzdGF0aWMgdm9pZCBkb19zZXRmYXR0cihjaGFyICpmaWxlKQoreworICBpbnQgaCA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX2g7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR194KSB7CisgICAgaWYgKChoID8gbHJlbW92ZXhhdHRyIDogcmVtb3ZleGF0dHIpKGZpbGUsIFRULngpKQorICAgICAgcGVycm9yX21zZygicmVtb3ZleGF0dHIgZmFpbGVkIik7CisgIH0gZWxzZSAKKyAgICBpZiAoKGggPyBsc2V0eGF0dHIgOiBzZXR4YXR0cikoZmlsZSwgVFQubiwgVFQudiwgVFQudj9zdHJsZW4oVFQudik6MCwgMCkpCisgICAgICBwZXJyb3JfbXNnKCJzZXR4YXR0ciBmYWlsZWQiKTsKK30KKwordm9pZCBzZXRmYXR0cl9tYWluKHZvaWQpCit7CisgIGNoYXIgKipzOworCisgIGZvciAocz10b3lzLm9wdGFyZ3M7ICpzOyBzKyspIGRvX3NldGZhdHRyKCpzKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3NldHNpZC5jIGIvdG95Ym94L3RveXMvb3RoZXIvc2V0c2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2OTgyNgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3NldHNpZC5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIHNldHNpZC5jIC0gUnVuIHByb2dyYW0gaW4gYSBuZXcgc2Vzc2lvbiBJRC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitVU0VfU0VUU0lEKE5FV1RPWShzZXRzaWQsICJePDF0IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgU0VUU0lECisgIGJvb2wgInNldHNpZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc2V0c2lkIFstdF0gY29tbWFuZCBbYXJncy4uLl0KKworICAgIFJ1biBwcm9jZXNzIGluIGEgbmV3IHNlc3Npb24uCisKKyAgICAtdAlHcmFiIHR0eSAoYmVjb21lIGZvcmVncm91bmQgcHJvY2VzcywgcmVjZWl2aW5nIGtleWJvYXJkIHNpZ25hbHMpCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHNldHNpZF9tYWluKHZvaWQpCit7CisgIHdoaWxlIChzZXRzaWQoKTwwKSBpZiAoWFZGT1JLKCkpIF9leGl0KDApOworICBpZiAodG95cy5vcHRmbGFncykgeworICAgIHNldHBnaWQoMCwgMCk7CisgICAgdGNzZXRwZ3JwKDAsIGdldHBpZCgpKTsKKyAgfQorICB4ZXhlYyh0b3lzLm9wdGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvc2hyZWQuYyBiL3RveWJveC90b3lzL290aGVyL3NocmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3NocmVkLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIHNocmVkLmMgLSBPdmVyd3JpdGUgYSBmaWxlIHRvIHNlY3VyZWx5IGRlbGV0ZQorICoKKyAqIENvcHlyaWdodCAyMDE0IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm8gc3RhbmRhcmQKKworVVNFX1NIUkVEKE5FV1RPWShzaHJlZCwgIjwxenh1cyM8MW4jPDFvIzwwZiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFNIUkVECisgIGJvb2wgInNocmVkIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzaHJlZCBbLWZ1el0gWy1uIENPVU5UXSBbLXMgU0laRV0gRklMRS4uLgorCisgICAgU2VjdXJlbHkgZGVsZXRlIGEgZmlsZSBieSBvdmVyd3JpdGluZyBpdHMgY29udGVudHMgd2l0aCByYW5kb20gZGF0YS4KKworICAgIC1mICAgICAgICBGb3JjZSAoY2htb2QgaWYgbmVjZXNzYXJ5KQorICAgIC1uIENPVU5UICBSYW5kb20gb3ZlcndyaXRlIGl0ZXJhdGlvbnMgKGRlZmF1bHQgMSkKKyAgICAtbyBPRkZTRVQgU3RhcnQgYXQgT0ZGU0VUCisgICAgLXMgU0laRSAgIFVzZSBTSVpFIGluc3RlYWQgb2YgZGV0ZWN0aW5nIGZpbGUgc2l6ZQorICAgIC11ICAgICAgICB1bmxpbmsgKGFjdHVhbGx5IGRlbGV0ZSBmaWxlIHdoZW4gZG9uZSkKKyAgICAteCAgICAgICAgVXNlIGV4YWN0IHNpemUgKGRlZmF1bHQgd2l0aG91dCAtcyByb3VuZHMgdXAgdG8gbmV4dCA0aykKKyAgICAteiAgICAgICAgemVybyBhdCBlbmQKKworICAgIE5vdGU6IGRhdGEgam91cm5hbGluZyBmaWxlc3lzdGVtcyByZW5kZXIgdGhpcyBjb21tYW5kIHVzZWxlc3MsIHlvdSBtdXN0CisgICAgb3ZlcndyaXRlIGFsbCBmcmVlIHNwYWNlIChmaWxsIHVwIGRpc2spIHRvIGVyYXNlIG9sZCBkYXRhIG9uIHRob3NlLgorKi8KKworI2RlZmluZSBGT1Jfc2hyZWQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgb2Zmc2V0OworICBsb25nIGl0ZXJhdGlvbnM7CisgIGxvbmcgc2l6ZTsKKworICBpbnQgdWZkOworKQorCit2b2lkIHNocmVkX21haW4odm9pZCkKK3sKKyAgY2hhciAqKnRyeTsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSkgVFQuaXRlcmF0aW9ucysrOworICBUVC51ZmQgPSB4b3BlbnJvKCIvZGV2L3VyYW5kb20iKTsKKworICAvLyBXZSBkb24ndCB1c2UgbG9vcGZpbGVzKCkgaGVyZSBiZWNhdXNlICItIiBpc24ndCBzdGRpbiwgYW5kIHdhbnQgdG8KKyAgLy8gcmVzcG9uZCB0byBmaWxlcyB3ZSBjYW4ndCBvcGVuIHZpYSBjaG1vZC4KKworICBmb3IgKHRyeSA9IHRveXMub3B0YXJnczsgKnRyeTsgdHJ5KyspIHsKKyAgICBvZmZfdCBwb3MgPSAwLCBsZW4gPSBUVC5zaXplOworICAgIGludCBmZCA9IG9wZW4oKnRyeSwgT19SRFdSKSwgaXRlciA9IDAsIHRocm93OworCisgICAgLy8gZG8gLWYgY2htb2QgaWYgbmVjZXNzYXJ5CisgICAgaWYgKGZkID09IC0xICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSkgeworICAgICAgY2htb2QoKnRyeSwgMDYwMCk7CisgICAgICBmZCA9IG9wZW4oKnRyeSwgT19SRFdSKTsKKyAgICB9CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICBwZXJyb3JfbXNnX3JhdygqdHJ5KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBsZW5ndGgKKyAgICBpZiAoIWxlbikgbGVuID0gZmRsZW5ndGgoZmQpOworICAgIGlmIChsZW48MSkgeworICAgICAgZXJyb3JfbXNnKCIlczogbmVlZHMgLXMiLCAqdHJ5KTsKKyAgICAgIGNsb3NlKGZkKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIExvb3AgdGhyb3VnaCwgd3JpdGluZyB0byB0aGlzIGZpbGUKKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBBZHZhbmNlIHRvIG5leHQgLW4gb3IgLXo/CisKKyAgICAgIGlmIChwb3MgPj0gbGVuKSB7CisgICAgICAgIHBvcyA9IC0xOworICAgICAgICBpZiAoKytpdGVyID09IFRULml0ZXJhdGlvbnMgJiYgKHRveXMub3B0YXJncyAmJiBGTEFHX3opKSB7CisgICAgICAgICAgbWVtc2V0KHRveWJ1ZiwgMCwgc2l6ZW9mKHRveWJ1ZikpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyID49IFRULml0ZXJhdGlvbnMpIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAocG9zIDwgVFQub2Zmc2V0KSB7CisgICAgICAgIGlmIChUVC5vZmZzZXQgIT0gbHNlZWsoZmQsIFRULm9mZnNldCwgU0VFS19TRVQpKSB7CisgICAgICAgICAgcGVycm9yX21zZ19yYXcoKnRyeSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gVFQub2Zmc2V0OworICAgICAgfQorCisgICAgICAvLyBEZXRlcm1pbmUgbGVuZ3RoLCByZWFkIHJhbmRvbSBkYXRhIGlmIG5vdCB6ZXJvaW5nLCB3cml0ZS4KKworICAgICAgdGhyb3cgPSBzaXplb2YodG95YnVmKTsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KQorICAgICAgICBpZiAobGVuLXBvcyA8IHRocm93KSB0aHJvdyA9IGxlbi1wb3M7CisKKyAgICAgIGlmIChpdGVyICE9IFRULml0ZXJhdGlvbnMpIHhyZWFkKFRULnVmZCwgdG95YnVmLCB0aHJvdyk7CisgICAgICBpZiAodGhyb3cgIT0gd3JpdGVhbGwoZmQsIHRveWJ1ZiwgdGhyb3cpKSBwZXJyb3JfbXNnX3JhdygqdHJ5KTsKKyAgICAgIHBvcyArPSB0aHJvdzsKKyAgICB9CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpCisgICAgICBpZiAodW5saW5rKCp0cnkpKSBwZXJyb3JfbXNnKCJ1bmxpbmsgJyVzJyIsICp0cnkpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci9zdGF0LmMgYi90b3lib3gvdG95cy9vdGhlci9zdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5OGEwZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3N0YXQuYwpAQCAtMCwwICsxLDIxOCBAQAorLyogc3RhdC5jIDogZGlzcGxheSBmaWxlIG9yIGZpbGUgc3lzdGVtIHN0YXR1cworICogQ29weXJpZ2h0IDIwMTIgPHdhcmlvci5saW51eEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyA8YW5hbmQuc2luaGE4NUBnbWFpbC5jb20+CisKK1VTRV9TVEFUKE5FV1RPWShzdGF0LCAiPDFjOmZMdCIsIFRPWUZMQUdfQklOKSkgCisKK2NvbmZpZyBTVEFUCisgIGJvb2wgc3RhdAorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzdGF0IFstdGZMXSBbLWMgRk9STUFUXSBGSUxFLi4uCisKKyAgICBEaXNwbGF5IHN0YXR1cyBvZiBmaWxlcyBvciBmaWxlc3lzdGVtcy4KKworICAgIC1jCU91dHB1dCBzcGVjaWZpZWQgRk9STUFUIHN0cmluZyBpbnN0ZWFkIG9mIGRlZmF1bHQKKyAgICAtZglkaXNwbGF5IGZpbGVzeXN0ZW0gc3RhdHVzIGluc3RlYWQgb2YgZmlsZSBzdGF0dXMKKyAgICAtTAlGb2xsb3cgc3ltbGlua3MKKyAgICAtdAl0ZXJzZSAoLWMgIiVuICVzICViICVmICV1ICVnICVEICVpICVoICV0ICVUICVYICVZICVaICVvIikKKyAgICAJICAgICAgKHdpdGggLWYgPSAtYyAiJW4gJWkgJWwgJXQgJXMgJVMgJWIgJWYgJWEgJWMgJWQiKQorCisgICAgVGhlIHZhbGlkIGZvcm1hdCBlc2NhcGUgc2VxdWVuY2VzIGZvciBmaWxlczoKKyAgICAlYSAgQWNjZXNzIGJpdHMgKG9jdGFsKSB8JUEgIEFjY2VzcyBiaXRzIChmbGFncyl8JWIgIFNpemUvNTEyCisgICAgJUIgIEJ5dGVzIHBlciAlYiAoNTEyKSAgfCVkICBEZXZpY2UgSUQgKGRlYykgICAgfCVEICBEZXZpY2UgSUQgKGhleCkKKyAgICAlZiAgQWxsIG1vZGUgYml0cyAoaGV4KSB8JUYgIEZpbGUgdHlwZSAgICAgICAgICB8JWcgIEdyb3VwIElECisgICAgJUcgIEdyb3VwIG5hbWUgICAgICAgICAgfCVoICBIYXJkIGxpbmtzICAgICAgICAgfCVpICBJbm9kZQorICAgICVtICBNb3VudCBwb2ludCAgICAgICAgIHwlbiAgRmlsZW5hbWUgICAgICAgICAgIHwlTiAgTG9uZyBmaWxlbmFtZQorICAgICVvICBJL08gYmxvY2sgc2l6ZSAgICAgIHwlcyAgU2l6ZSAoYnl0ZXMpICAgICAgIHwldCAgRGV2dHlwZSBtYWpvciAoaGV4KQorICAgICVUICBEZXZ0eXBlIG1pbm9yIChoZXgpIHwldSAgVXNlciBJRCAgICAgICAgICAgIHwlVSAgVXNlciBuYW1lCisgICAgJXggIEFjY2VzcyB0aW1lICAgICAgICAgfCVYICBBY2Nlc3MgdW5peCB0aW1lICAgfCV5ICBGaWxlIHdyaXRlIHRpbWUKKyAgICAlWSAgRmlsZSB3cml0ZSB1bml4IHRpbWV8JXogIERpciBjaGFuZ2UgdGltZSAgICB8JVogIERpciBjaGFuZ2UgdW5peCB0aW1lCisKKyAgICBUaGUgdmFsaWQgZm9ybWF0IGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGZpbGVzeXN0ZW1zOgorICAgICVhICBBdmFpbGFibGUgYmxvY2tzICAgIHwlYiAgVG90YWwgYmxvY2tzICAgICAgIHwlYyAgVG90YWwgaW5vZGVzCisgICAgJWQgIEZyZWUgaW5vZGVzICAgICAgICAgfCVmICBGcmVlIGJsb2NrcyAgICAgICAgfCVpICBGaWxlIHN5c3RlbSBJRAorICAgICVsICBNYXggZmlsZW5hbWUgbGVuZ3RoIHwlbiAgRmlsZSBuYW1lICAgICAgICAgIHwlcyAgRnJhZ21lbnQgc2l6ZQorICAgICVTICBCZXN0IHRyYW5zZmVyIHNpemUgIHwldCAgRlMgdHlwZSAoaGV4KSAgICAgIHwlVCAgRlMgdHlwZSAoZHJpdmVyIG5hbWUpCisqLworCisjZGVmaW5lIEZPUl9zdGF0CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpmbXQ7CisKKyAgdW5pb24geworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIHN0cnVjdCBzdGF0ZnMgc2Y7CisgIH0gc3RhdDsKKyAgY2hhciAqZmlsZSwgKnBhdHRlcm47CisgIGludCBwYXRsZW47CispCisKKy8vIEZvcmNlIG51bWVyaWMgb3V0cHV0IHRvIGxvbmcgbG9uZyBpbnN0ZWFkIG9mIG1hbnVhbGx5IHR5cGVjYXN0aW5nIGV2ZXJ5dGhpbmcKKy8vIGFuZCBzYWZlbHkgcGFyc2UgbGVuZ3RoIHByZWZpeAorc3RhdGljIHZvaWQgb3V0KGNoYXIgYywgbG9uZyBsb25nIHZhbCkKK3sKKyAgc3ByaW50Zih0b3lidWYsICIlLipzbGwlYyIsIFRULnBhdGxlbiwgVFQucGF0dGVybiwgYyk7CisgIHByaW50Zih0b3lidWYsIHZhbCk7Cit9CisKKy8vIE91dHB1dCBzdHJpbmcgd2l0aCBwYXJzZWQgbGVuZ3RoIHByZWZpeAorc3RhdGljIHZvaWQgc3Ryb3V0KGNoYXIgKnZhbCkKK3sKKyAgc3ByaW50Zih0b3lidWYsICIlLipzcyIsIFRULnBhdGxlbiwgVFQucGF0dGVybik7CisgIHByaW50Zih0b3lidWYsIHZhbCk7Cit9CisKKy8vIE5vdGU6IHRoZSBhdGltZSwgbXRpbWUsIGFuZCBjdGltZSBmaWVsZHMgaW4gc3RydWN0IHN0YXQgYXJlIHRoZSBzdGFydAorLy8gb2YgZW1iZWRkZWQgc3RydWN0IHRpbWVzcGVjLCBidXQgcG9zaXggd29uJ3QgbGV0IHRoZW0gdXNlIHRoYXQKKy8vIHN0cnVjdCBkZWZpbml0aW9uIGZvciBsZWdhY3kvbmFtZXNwYWNlIHJlYXNvbnMuCisKK3N0YXRpYyB2b2lkIGRhdGVfc3RhdF9mb3JtYXQoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKyAgY2hhciAqcyA9IHRveWJ1ZisxMjg7CisgIHN0cmZ0aW1lKHMsIHNpemVvZih0b3lidWYpLCAiJVktJW0tJWQgJUg6JU06JVMiLAorICAgIGxvY2FsdGltZSgmKHRzLT50dl9zZWMpKSk7CisgIHNwcmludGYocytzdHJsZW4ocyksICIuJTA5bGQiLCB0cy0+dHZfbnNlYyk7CisgIHN0cm91dChzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdChjaGFyIHR5cGUpCit7CisgIHN0cnVjdCBzdGF0ICpzdGF0ID0gKHN0cnVjdCBzdGF0ICopJlRULnN0YXQ7CisKKyAgaWYgKHR5cGUgPT0gJ2EnKSBvdXQoJ28nLCBzdGF0LT5zdF9tb2RlJn5TX0lGTVQpOworICBlbHNlIGlmICh0eXBlID09ICdBJykgeworICAgIGNoYXIgc3RyWzExXTsKKworICAgIG1vZGVfdG9fc3RyaW5nKHN0YXQtPnN0X21vZGUsIHN0cik7CisgICAgc3Ryb3V0KHN0cik7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAnYicpIG91dCgndScsIHN0YXQtPnN0X2Jsb2Nrcyk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ0InKSBvdXQoJ2QnLCA1MTIpOworICBlbHNlIGlmICh0eXBlID09ICdkJykgb3V0KCdkJywgc3RhdC0+c3RfZGV2KTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnRCcpIG91dCgneCcsIHN0YXQtPnN0X2Rldik7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ2YnKSBvdXQoJ3gnLCBzdGF0LT5zdF9tb2RlKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnRicpIHsKKyAgICBjaGFyICp0ID0gImNoYXJhY3RlciBkZXZpY2VcMGRpcmVjdG9yeVwwYmxvY2sgZGV2aWNlXDAiIFwKKyAgICAgICAgICAgICAgInJlZ3VsYXIgZmlsZVwwc3ltYm9saWMgbGlua1wwc29ja2V0XDBGSUZPIChuYW1lZCBwaXBlKSI7CisgICAgaW50IGksIGZpbGV0eXBlID0gc3RhdC0+c3RfbW9kZSAmIFNfSUZNVDsKKworICAgIGZvciAoaSA9IDE7IGZpbGV0eXBlICE9IChpKjgxOTIpICYmIGkgPCA3OyBpKyspIHQgKz0gc3RybGVuKHQpKzE7CisgICAgaWYgKCFzdGF0LT5zdF9zaXplICYmIGZpbGV0eXBlID09IFNfSUZSRUcpIHQgPSAicmVndWxhciBlbXB0eSBmaWxlIjsKKyAgICBzdHJvdXQodCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIG91dCgndScsIHN0YXQtPnN0X2dpZCk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ0cnKSBzdHJvdXQoZ2V0Z3JvdXBuYW1lKHN0YXQtPnN0X2dpZCkpOworICBlbHNlIGlmICh0eXBlID09ICdoJykgb3V0KCd1Jywgc3RhdC0+c3RfbmxpbmspOworICBlbHNlIGlmICh0eXBlID09ICdpJykgb3V0KCd1Jywgc3RhdC0+c3RfaW5vKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnbScpIHsKKyAgICBzdHJ1Y3QgbXRhYl9saXN0ICptdCA9IHhnZXRtb3VudGxpc3QoMCk7CisgICAgZGV2X3QgZGV2ID0gc3RhdC0+c3RfcmRldiA/IHN0YXQtPnN0X3JkZXYgOiBzdGF0LT5zdF9kZXY7CisKKyAgICAvLyBUaGlzIG1vdW50IHBvaW50IGNvdWxkIGV4aXN0IG11bHRpcGxlIHRpbWVzLCBzbyBzaG93IG9sZGVzdC4KKyAgICBmb3IgKGRsaXN0X3Rlcm1pbmF0ZShtdCk7IG10OyBtdCA9IG10LT5uZXh0KSBpZiAobXQtPnN0YXQuc3RfZGV2ID09IGRldikgeworICAgICAgc3Ryb3V0KG10LT5kaXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGxsaXN0X3RyYXZlcnNlKG10LCBmcmVlKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICdOJykgeworICAgIHhwcmludGYoImAlcyciLCBUVC5maWxlKTsKKyAgICBpZiAoU19JU0xOSyhzdGF0LT5zdF9tb2RlKSkKKyAgICAgIGlmIChyZWFkbGluazAoVFQuZmlsZSwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpCisgICAgICAgIHhwcmludGYoIiAtPiBgJXMnIiwgdG95YnVmKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICdvJykgb3V0KCd1Jywgc3RhdC0+c3RfYmxrc2l6ZSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSBvdXQoJ3UnLCBzdGF0LT5zdF9zaXplKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAndCcpIG91dCgneCcsIGRldl9tYWpvcihzdGF0LT5zdF9yZGV2KSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ1QnKSBvdXQoJ3gnLCBkZXZfbWlub3Ioc3RhdC0+c3RfcmRldikpOworICBlbHNlIGlmICh0eXBlID09ICd1Jykgb3V0KCd1Jywgc3RhdC0+c3RfdWlkKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnVScpIHN0cm91dChnZXR1c2VybmFtZShzdGF0LT5zdF91aWQpKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAneCcpIGRhdGVfc3RhdF9mb3JtYXQoKHZvaWQgKikmc3RhdC0+c3RfYXRpbWUpOworICBlbHNlIGlmICh0eXBlID09ICdYJykgb3V0KCd1Jywgc3RhdC0+c3RfYXRpbWUpOworICBlbHNlIGlmICh0eXBlID09ICd5JykgZGF0ZV9zdGF0X2Zvcm1hdCgodm9pZCAqKSZzdGF0LT5zdF9tdGltZSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ1knKSBvdXQoJ3UnLCBzdGF0LT5zdF9tdGltZSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ3onKSBkYXRlX3N0YXRfZm9ybWF0KCh2b2lkICopJnN0YXQtPnN0X2N0aW1lKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnWicpIG91dCgndScsIHN0YXQtPnN0X2N0aW1lKTsKKyAgZWxzZSB4cHJpbnRmKCI/Iik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRmcyhjaGFyIHR5cGUpIHsKKyAgc3RydWN0IHN0YXRmcyAqc3RhdGZzID0gKHN0cnVjdCBzdGF0ZnMgKikmVFQuc3RhdDsKKworICBpZiAodHlwZSA9PSAnYScpIG91dCgndScsIHN0YXRmcy0+Zl9iYXZhaWwpOworICBlbHNlIGlmICh0eXBlID09ICdiJykgb3V0KCd1Jywgc3RhdGZzLT5mX2Jsb2Nrcyk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ2MnKSBvdXQoJ3UnLCBzdGF0ZnMtPmZfZmlsZXMpOworICBlbHNlIGlmICh0eXBlID09ICdkJykgb3V0KCd1Jywgc3RhdGZzLT5mX2ZmcmVlKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnZicpIG91dCgndScsIHN0YXRmcy0+Zl9iZnJlZSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ2wnKSBvdXQoJ2QnLCBzdGF0ZnMtPmZfbmFtZWxlbik7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSBvdXQoJ3gnLCBzdGF0ZnMtPmZfdHlwZSk7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ1QnKSB7CisgICAgY2hhciAqcyA9ICJ1bmtub3duIjsKKyAgICBzdHJ1Y3Qge3Vuc2lnbmVkIG51bTsgY2hhciAqbmFtZTt9IG5uW10gPSB7CisgICAgICB7MHhBREZGLCAiYWZmcyJ9LCB7MHg1MzQ2NTQ0ZSwgIm50ZnMifSwgezB4MUNkMSwgImRldnB0cyJ9LAorICAgICAgezB4MTM3RCwgImV4dCJ9LCB7MHhFRjUxLCAiZXh0MiJ9LCB7MHhFRjUzLCAiZXh0MyJ9LAorICAgICAgezB4MUJBREZBQ0UsICJiZnMifSwgezB4OTEyMzY4M0UsICJidHJmcyJ9LCB7MHgyOGNkM2Q0NSwgImNyYW1mcyJ9LAorICAgICAgezB4MzE1MzQ2NGEsICJqZnMifSwgezB4NzI3NSwgInJvbWZzIn0sIHsweDAxMDIxOTk0LCAidG1wZnMifSwKKyAgICAgIHsweDM0MzQsICJuaWxmcyJ9LCB7MHg2OTY5LCAibmZzIn0sIHsweDlmYTAsICJwcm9jIn0sCisgICAgICB7MHg1MzRGNDM0QiwgInNvY2tmcyJ9LCB7MHg2MjY1NjU3MiwgInN5c2ZzIn0sIHsweDUxN0IsICJzbWIifSwKKyAgICAgIHsweDRkNDQsICJtc2RvcyJ9LCB7MHg0MDA2LCAiZmF0In0sIHsweDQzNDE1ZDUzLCAic21hY2tmcyJ9LAorICAgICAgezB4NzM3MTczNjgsICJzcXVhc2hmcyJ9CisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPEFSUkFZX0xFTihubik7IGkrKykKKyAgICAgIGlmIChubltpXS5udW0gPT0gc3RhdGZzLT5mX3R5cGUpIHMgPSBubltpXS5uYW1lOworICAgIHN0cm91dChzKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICdpJykgeworICAgIGNoYXIgYnVmWzMyXTsKKworICAgIHNwcmludGYoYnVmLCAiJTA4eCUwOHgiLCBzdGF0ZnMtPmZfZnNpZC5fX3ZhbFswXSwgc3RhdGZzLT5mX2ZzaWQuX192YWxbMV0pOworICAgIHN0cm91dChidWYpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSBvdXQoJ2QnLCBzdGF0ZnMtPmZfZnJzaXplKTsKKyAgZWxzZSBpZiAodHlwZSA9PSAnUycpIG91dCgnZCcsIHN0YXRmcy0+Zl9ic2l6ZSk7CisgIGVsc2Ugc3Ryb3V0KCI/Iik7Cit9CisKK3ZvaWQgc3RhdF9tYWluKHZvaWQpCit7CisgIGludCBmbGFnZiA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YsIGk7CisgIGNoYXIgKmZvcm1hdCwgKmY7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR190KSB7CisgICAgZm9ybWF0ID0gZmxhZ2YgPyAiJW4gJWkgJWwgJXQgJXMgJVMgJWIgJWYgJWEgJWMgJWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICIlbiAlcyAlYiAlZiAldSAlZyAlRCAlaSAlaCAldCAlVCAlWCAlWSAlWiAlbyI7CisgIH0gZWxzZSBmb3JtYXQgPSBmbGFnZgorICAgID8gIiAgRmlsZTogXCIlblwiXG4gICAgSUQ6ICVpIE5hbWVsZW46ICVsICAgIFR5cGU6ICV0XG4iCisgICAgICAiQmxvY2sgU2l6ZTogJXMgICAgRnVuZGFtZW50YWwgYmxvY2sgc2l6ZTogJVNcbiIKKyAgICAgICJCbG9ja3M6IFRvdGFsOiAlYlx0RnJlZTogJWZcdEF2YWlsYWJsZTogJWFcbiIKKyAgICAgICJJbm9kZXM6IFRvdGFsOiAlY1x0RnJlZTogJWQiCisgICAgOiAiICBGaWxlOiAlTlxuICBTaXplOiAlc1x0IEJsb2NrczogJWJcdCBJTyBCbG9ja3M6ICVCXHQlRlxuIgorICAgICAgIkRldmljZTogJURoLyVkZFx0IElub2RlOiAlaVx0IExpbmtzOiAlaFxuIgorICAgICAgIkFjY2VzczogKCVhLyVBKVx0VWlkOiAoJTV1LyU4VSlcdEdpZDogKCU1Zy8lOEcpXG4iCisgICAgICAiQWNjZXNzOiAleFxuTW9kaWZ5OiAleVxuQ2hhbmdlOiAleiI7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIGZvcm1hdCA9IFRULmZtdDsKKworICBmb3IgKGkgPSAwOyB0b3lzLm9wdGFyZ3NbaV07IGkrKykgeworICAgIGludCBMID0gdG95cy5vcHRmbGFncyAmIEZMQUdfTDsKKworICAgIFRULmZpbGUgPSB0b3lzLm9wdGFyZ3NbaV07CisgICAgaWYgKGZsYWdmICYmICFzdGF0ZnMoVFQuZmlsZSwgKHZvaWQgKikmVFQuc3RhdCkpOworICAgIGVsc2UgaWYgKGZsYWdmIHx8IChMID8gc3RhdCA6IGxzdGF0KShUVC5maWxlLCAodm9pZCAqKSZUVC5zdGF0KSkgeworICAgICAgcGVycm9yX21zZygiJyVzJyIsIFRULmZpbGUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7CisgICAgICBpZiAoKmYgIT0gJyUnKSBwdXRjaGFyKCpmKTsKKyAgICAgIGVsc2UgeworICAgICAgICBmID0gbmV4dF9wcmludGYoZiwgJlRULnBhdHRlcm4pOworICAgICAgICBUVC5wYXRsZW4gPSBmLVRULnBhdHRlcm47CisgICAgICAgIGlmIChUVC5wYXRsZW4+OTkpIGVycm9yX2V4aXQoImJhZCAlcyIsIFRULnBhdHRlcm4pOworICAgICAgICBpZiAoKmYgPT0gJ24nKSBzdHJvdXQoVFQuZmlsZSk7CisgICAgICAgIGVsc2UgaWYgKGZsYWdmKSBwcmludF9zdGF0ZnMoKmYpOworICAgICAgICBlbHNlIHByaW50X3N0YXQoKmYpOworICAgICAgfQorICAgIH0KKyAgICB4cHV0YygnXG4nKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvc3dhcG9mZi5jIGIvdG95Ym94L3RveXMvb3RoZXIvc3dhcG9mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTcxMzAKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci9zd2Fwb2ZmLmMKQEAgLTAsMCArMSwyMSBAQAorLyogc3dhcG9mZi5jIC0gRGlzYWJsZSByZWdpb24gZm9yIHN3YXBwaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKworVVNFX1NXQVBPRkYoTkVXVE9ZKHN3YXBvZmYsICI8MT4xIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorCitjb25maWcgU1dBUE9GRgorICBib29sICJzd2Fwb2ZmIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzd2Fwb2ZmIHN3YXByZWdpb24KKworICAgIERpc2FibGUgc3dhcHBpbmcgb24gYSBnaXZlbiBzd2FwcmVnaW9uLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBzd2Fwb2ZmX21haW4odm9pZCkKK3sKKyAgaWYgKHN3YXBvZmYodG95cy5vcHRhcmdzWzBdKSkgcGVycm9yX2V4aXQoImZhaWxlZCB0byByZW1vdmUgc3dhcGFyZWEiKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3N3YXBvbi5jIGIvdG95Ym94L3RveXMvb3RoZXIvc3dhcG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2NTA0MAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3N3YXBvbi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHN3YXBvbi5jIC0gRW5hYmxlIHJlZ2lvbiBmb3Igc3dhcHBpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBFbGllIERlIEJyYXV3ZXIgPGVsaWVkZWJyYXV3ZXJAZ21haWwuY29tPgorCitVU0VfU1dBUE9OKE5FV1RPWShzd2Fwb24sICI8MT4xcCM8MD4zMjc2N2QiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBTV0FQT04KKyAgYm9vbCAic3dhcG9uIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBzd2Fwb24gWy1kXSBbLXAgcHJpb3JpdHldIGZpbGVuYW1lCisKKyAgICBFbmFibGUgc3dhcHBpbmcgb24gYSBnaXZlbiBkZXZpY2UvZmlsZS4KKworICAgIC1kCURpc2NhcmQgZnJlZWQgU1NEIHBhZ2VzCisqLworCisjZGVmaW5lIEZPUl9zd2Fwb24KKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgcHJpb3JpdHk7CispCisKK3ZvaWQgc3dhcG9uX21haW4odm9pZCkKK3sKKyAgLy8gMHg3MDAwMCA9IFNXQVBfRkxBR19ESVNDQVJEfFNXQVBfRkxBR19ESVNDQVJEX09OQ0V8U1dBUF9GTEFHX0RJU0NBUkRfUEFHRVMKKyAgaW50IGZsYWdzID0gKHRveXMub3B0ZmxhZ3MmRkxBR19kKSoweDcwMDAwOworCisgIGlmICh0b3lzLm9wdGZsYWdzKQorICAgIGZsYWdzIHw9IFNXQVBfRkxBR19QUkVGRVIgfCAoVFQucHJpb3JpdHkgPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpOworCisgIGlmIChzd2Fwb24oKnRveXMub3B0YXJncywgZmxhZ3MpKQorICAgIHBlcnJvcl9leGl0KCJDb3VsZG4ndCBzd2Fwb24gJyVzJyIsICp0b3lzLm9wdGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvc3dpdGNoX3Jvb3QuYyBiL3RveWJveC90b3lzL290aGVyL3N3aXRjaF9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYWUyYgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3N3aXRjaF9yb290LmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIHN3aXRjaF9yb290LmMgLSBTd2l0Y2ggZnJvbSByb290ZnMvaW5pdHJhbWZzIHRvIGFub3RoZXIgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAyMDA1IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKK1VTRV9TV0lUQ0hfUk9PVChORVdUT1koc3dpdGNoX3Jvb3QsICI8MmM6aCIsIFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBTV0lUQ0hfUk9PVAorICBib29sICJzd2l0Y2hfcm9vdCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc3dpdGNoX3Jvb3QgWy1jIC9kZXYvY29uc29sZV0gTkVXX1JPT1QgTkVXX0lOSVQuLi4KKworICAgIFVzZSBmcm9tIFBJRCAxIHVuZGVyIGluaXRyYW1mcyB0byBmcmVlIGluaXRyYW1mcywgY2hyb290IHRvIE5FV19ST09ULAorICAgIGFuZCBleGVjIE5FV19JTklULgorCisgICAgLWMJUmVkaXJlY3QgY29uc29sZSB0byBkZXZpY2UgaW4gTkVXX1JPT1QKKyAgICAtaAlIYW5nIGluc3RlYWQgb2YgZXhpdGluZyBvbiBmYWlsdXJlIChhdm9pZHMga2VybmVsIHBhbmljKQorKi8KKworI2RlZmluZSBGT1Jfc3dpdGNoX3Jvb3QKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCitHTE9CQUxTKAorICBjaGFyICpjb25zb2xlOworCisgIGRldl90IHJvb3RkZXY7CispCisKK3N0YXRpYyBpbnQgZGVsX25vZGUoc3RydWN0IGRpcnRyZWUgKm5vZGUpCit7CisgIGlmIChub2RlLT5zdC5zdF9kZXYgPT0gVFQucm9vdGRldiAmJiBkaXJ0cmVlX25vdGRvdGRvdChub2RlKSkgeworICAgIGludCBmbGFnID0gMDsKKyAgICBpZiAoU19JU0RJUihub2RlLT5zdC5zdF9tb2RlKSkgeworICAgICAgaWYgKCFub2RlLT5hZ2FpbikgcmV0dXJuIERJUlRSRUVfQ09NRUFHQUlOOworICAgICAgZmxhZyA9IEFUX1JFTU9WRURJUjsKKyAgICB9CisgICAgdW5saW5rYXQoZGlydHJlZV9wYXJlbnRmZChub2RlKSwgbm9kZS0+bmFtZSwgZmxhZyk7CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBzd2l0Y2hfcm9vdF9tYWluKHZvaWQpCit7CisgIGNoYXIgKm5ld3Jvb3QgPSAqdG95cy5vcHRhcmdzLCAqKmNtZGxpbmUgPSB0b3lzLm9wdGFyZ3MrMTsKKyAgc3RydWN0IHN0YXQgc3QxLCBzdDI7CisgIHN0cnVjdCBzdGF0ZnMgc3RmczsKKyAgaW50IGNvbnNvbGUgPSBjb25zb2xlOyAvLyBnY2MncyAibWF5IGJlIHVzZWQiIHdhcm5pbmdzIGFyZSBicm9rZW4uCisKKyAgaWYgKGdldHBpZCgpICE9IDEpIGVycm9yX2V4aXQoIm5vdCBwaWQgMSIpOworCisgIC8vIFJvb3QgZmlsZXN5c3RlbSB3ZSdyZSBsZWF2aW5nIG11c3QgYmUgcmFtZnMgb3IgdG1wZnMKKyAgaWYgKHN0YXRmcygiLyIsICZzdGZzKSB8fAorICAgIChzdGZzLmZfdHlwZSAhPSAweDg1ODQ1OGY2ICYmIHN0ZnMuZl90eXBlICE9IDB4MDEwMjE5OTQpKQorICB7CisgICAgZXJyb3JfbXNnKCJub3QgcmFtZnMiKTsKKyAgICBnb3RvIHBhbmljOworICB9CisKKyAgLy8gTmV3IGRpcmVjdG9yeSBtdXN0IGJlIGRpZmZlcmVudCBmaWxlc3lzdGVtIGluc3RhbmNlCisgIGlmIChjaGRpcihuZXdyb290KSB8fCBzdGF0KCIuIiwgJnN0MSkgfHwgc3RhdCgiLyIsICZzdDIpIHx8CisgICAgc3QxLnN0X2RldiA9PSBzdDIuc3RfZGV2KQorICB7CisgICAgZXJyb3JfbXNnKCJiYWQgbmV3cm9vdCAnJXMnIiwgbmV3cm9vdCk7CisgICAgZ290byBwYW5pYzsKKyAgfQorICBUVC5yb290ZGV2PXN0Mi5zdF9kZXY7CisKKyAgLy8gdHJpbSBhbnkgLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGluaXQgY21kbGluZSwgYXMgd2Ugd2FudCB0byB0ZXN0IGl0IHdpdGgKKyAgLy8gc3RhdCgpLCByZWxhdGl2ZSB0byBuZXdyb290LiAqY21kbGluZSBpcyBhbHNvIHVzZWQgYmVsb3csIGJ1dCBieSB0aGF0CisgIC8vIHBvaW50IHdlIGFyZSBpbiB0aGUgY2hyb290LCBzbyBhIHJlbGF0aXZlIHBhdGggaXMgc3RpbGwgT0suCisgIHdoaWxlICgqKmNtZGxpbmUgPT0gJy8nKSAoKmNtZGxpbmUpKys7CisKKyAgLy8gaW5pdCBwcm9ncmFtIG11c3QgZXhpc3QgYW5kIGJlIGFuIGV4ZWN1dGFibGUgZmlsZQorICBpZiAoc3RhdCgqY21kbGluZSwgJnN0MSkgfHwgIVNfSVNSRUcoc3QxLnN0X21vZGUpIHx8ICEoc3QxLnN0X21vZGUmMDEwMCkpIHsKKyAgICBlcnJvcl9tc2coImJhZCBpbml0Iik7CisgICAgZ290byBwYW5pYzsKKyAgfQorCisgIGlmIChUVC5jb25zb2xlICYmIC0xID09IChjb25zb2xlID0gb3BlbihUVC5jb25zb2xlLCBPX1JEV1IpKSkgeworICAgIHBlcnJvcl9tc2coImJhZCBjb25zb2xlICclcyciLCBUVC5jb25zb2xlKTsKKyAgICBnb3RvIHBhbmljOworICB9CisgCisgIC8vIE9rLCBlbm91Z2ggc2FmZXR5IGNoZWNrczogd2lwZSByb290IHBhcnRpdGlvbi4KKyAgZGlydHJlZV9yZWFkKCIvIiwgZGVsX25vZGUpOworCisgIC8vIEZpeCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgbW91bnQgdGFibGUgaW4gdGhlIG5ld3Jvb3QgY2hyb290CisgIGlmIChtb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpIHsKKyAgICBwZXJyb3JfbXNnKCJtb3VudCIpOworICAgIGdvdG8gcGFuaWM7CisgIH0KKworICAvLyBFbnRlciB0aGUgbmV3IHJvb3QgYmVmb3JlIHN0YXJ0aW5nIGluaXQKKyAgaWYgKGNocm9vdCgiLiIpKSB7CisgICAgcGVycm9yX21zZygiY2hyb290Iik7CisgICAgZ290byBwYW5pYzsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBjd2QgZG9lcyBub3QgcG9pbnQgb3V0c2lkZSBvZiB0aGUgY2hyb290CisgIGlmIChjaGRpcigiLyIpKSB7CisgICAgcGVycm9yX21zZygiY2hkaXIiKTsKKyAgICBnb3RvIHBhbmljOworICB9CisKKyAgaWYgKFRULmNvbnNvbGUpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTwzOyBpKyspIGlmIChjb25zb2xlICE9IGkpIGR1cDIoY29uc29sZSwgaSk7CisgICAgaWYgKGNvbnNvbGU+MikgY2xvc2UoY29uc29sZSk7CisgIH0KKyAgZXhlY3YoKmNtZGxpbmUsIGNtZGxpbmUpOworICBwZXJyb3JfbXNnKCJGYWlsZWQgdG8gZXhlYyAnJXMnIiwgKmNtZGxpbmUpOworcGFuaWM6CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSBmb3IgKDs7KSB3YWl0KE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvc3lzY3RsLmMgYi90b3lib3gvdG95cy9vdGhlci9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY0M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvc3lzY3RsLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIHN5c2N0bC5jIC0gQSB1dGlsaXR5IHRvIHJlYWQgYW5kIG1hbmlwdWxhdGUgdGhlIHN5c2N0bCBwYXJhbWV0ZXJzLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEJpbGFsIFF1cmVzaGkgPGJpbGFsLmptaUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxNCBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZAorIAorVVNFX1NZU0NUTChORVdUT1koc3lzY3RsLCAiXm5lTnF3cGFBWyFhcF1bIWFxXVshYXddWythQV0iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgU1lTQ1RMCisgIGJvb2wgInN5c2N0bCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc3lzY3RsIFstYUFlTm5xd10gWy1wIFtGSUxFXSB8IEtFWVs9VkFMVUVdLi4uXQorCisgICAgUmVhZC93cml0ZSBzeXN0ZW0gY29udHJvbCBkYXRhICh1bmRlciAvcHJvYy9zeXMpLgorCisgICAgLWEsQQlTaG93IGFsbCB2YWx1ZXMKKyAgICAtZQlEb24ndCB3YXJuIGFib3V0IHVua25vd24ga2V5cworICAgIC1OCURvbid0IHByaW50IGtleSB2YWx1ZXMKKyAgICAtbglEb24ndCBwcmludCBrZXkgbmFtZXMKKyAgICAtcAlSZWFkIHZhbHVlcyBmcm9tIEZJTEUgKGRlZmF1bHQgL2V0Yy9zeXNjdGwuY29uZikKKyAgICAtcQlEb24ndCBzaG93IHZhbHVlIGFmdGVyIHdyaXRlCisgICAgLXcJT25seSB3cml0ZSB2YWx1ZXMgKG9iamVjdCB0byByZWFkaW5nKQorKi8KKyNkZWZpbmUgRk9SX3N5c2N0bAorI2luY2x1ZGUgInRveXMuaCIKKworLy8gTnVsbCB0ZXJtaW5hdGUgYXQgPSwgcmV0dXJuIHZhbHVlCitzdGF0aWMgY2hhciAqc3BsaXRfa2V5KGNoYXIgKmtleSkKK3sKKyAgY2hhciAqdmFsdWUgPSBzdHJjaHIoa2V5LCAnPScpOworCisgIGlmICh2YWx1ZSkgKih2YWx1ZSsrKT0wOworCisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcmVwbGFjZV9jaGFyKGNoYXIgKnN0ciwgY2hhciBvbGQsIGNoYXIgbmV3KQoreworICBmb3IgKDsgKnN0cjsgc3RyKyspIGlmICgqc3RyID09IG9sZCkgKnN0ciA9IG5ldzsKK30KKworc3RhdGljIHZvaWQga2V5X2Vycm9yKGNoYXIgKmtleSkKK3sKKyAgaWYgKGVycm5vID09IEVOT0VOVCkgeworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2UpKSBlcnJvcl9tc2coInVua25vd24ga2V5ICclcyciLCBrZXkpOworICB9IGVsc2UgcGVycm9yX21zZygia2V5ICclcyciLCBrZXkpOworfQorCitzdGF0aWMgaW50IHdyaXRlX2tleShjaGFyICpwYXRoLCBjaGFyICprZXksIGNoYXIgKnZhbHVlKQoreworICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKKworICBpZiAoZmQgPCAwKSB7CisgICAga2V5X2Vycm9yKGtleSk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorICB4d3JpdGUoZmQsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKyAgeGNsb3NlKGZkKTsKKworICByZXR1cm4gMTsKK30KKworLy8gRGlzcGxheSBhbGwga2V5cyB1bmRlciBhIHBhdGgKK3N0YXRpYyBpbnQgZG9fc2hvd19rZXlzKHN0cnVjdCBkaXJ0cmVlICpkdCkKK3sKKyAgY2hhciAqcGF0aCwgKmRhdGEsICprZXk7CisKKyAgaWYgKCFkaXJ0cmVlX25vdGRvdGRvdChkdCkpIHJldHVybiAwOyAvLyBTa2lwIC4gYW5kIC4uCisgIGlmIChTX0lTRElSKGR0LT5zdC5zdF9tb2RlKSkgcmV0dXJuIERJUlRSRUVfUkVDVVJTRTsKKworICBwYXRoID0gZGlydHJlZV9wYXRoKGR0LCAwKTsKKyAgZGF0YSA9IHJlYWRmaWxlKHBhdGgsIDAsIDApOworICByZXBsYWNlX2NoYXIoa2V5ID0gcGF0aCArIDEwLCAnLycsICcuJyk7IC8vIHNraXAgIi9wcm9jL3N5cy8iCisgIGlmICghZGF0YSkga2V5X2Vycm9yKGtleSk7CisgIGVsc2UgeworICAgIC8vIFByaW50IHRoZSBwYXJ0cyB0aGF0IGFyZW4ndCBzd2l0Y2hlZCBvZmYgYnkgZmxhZ3MuCisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbikpIHhwcmludGYoIiVzIiwga2V5KTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgKEZMQUdfTnxGTEFHX24pKSkgeHByaW50ZigiID0gIik7CisgICAgZm9yIChrZXkgPSBkYXRhK3N0cmxlbihkYXRhKTsga2V5ID4gZGF0YSAmJiBpc3NwYWNlKCotLWtleSk7ICprZXkgPSAwKTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19OKSkgeHByaW50ZigiJXMiLCBkYXRhKTsKKyAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19OfEZMQUdfbikpICE9IChGTEFHX058RkxBR19uKSkgeHB1dGMoJ1xuJyk7CisgIH0KKworICBmcmVlKGRhdGEpOworICBmcmVlKHBhdGgpOworCisgIHJldHVybiAwOworfQorCisvLyBSZWFkL3dyaXRlIGVudHJpZXMgdW5kZXIgYSBrZXkuIEFjY2VwdHMgImtleT12YWx1ZSIgaW4ga2V5IGlmICF2YWx1ZQorc3RhdGljIHZvaWQgcHJvY2Vzc19rZXkoY2hhciAqa2V5LCBjaGFyICp2YWx1ZSkKK3sKKyAgY2hhciAqcGF0aDsKKworICBpZiAoIXZhbHVlKSB2YWx1ZSA9IHNwbGl0X2tleShrZXkpOworICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpICYmICF2YWx1ZSkgeworICAgIGVycm9yX21zZygiJyVzJyBub3Qga2V5PXZhbHVlIiwga2V5KTsKKworICAgIHJldHVybjsKKyAgfQorCisgIHBhdGggPSB4bXByaW50ZigiL3Byb2Mvc3lzLyVzIiwga2V5KTsKKyAgcmVwbGFjZV9jaGFyKHBhdGgsICcuJywgJy8nKTsKKyAgLy8gTm90ZTogZmFpbHVyZSB0byBhc3NpZ24gdG8gYSBub24tbGVhZiBub2RlIHN1cHByZXNzZXMgdGhlIGRpc3BsYXkuCisgIGlmICghKHZhbHVlICYmICghd3JpdGVfa2V5KHBhdGgsIGtleSwgdmFsdWUpIHx8ICh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkpKSB7CisgICAgaWYgKCFhY2Nlc3MocGF0aCwgUl9PSykpIGRpcnRyZWVfcmVhZChwYXRoLCBkb19zaG93X2tleXMpOworICAgIGVsc2Uga2V5X2Vycm9yKGtleSk7CisgIH0KKyAgZnJlZShwYXRoKTsKK30KKwordm9pZCBzeXNjdGxfbWFpbigpCit7CisgIGNoYXIgKiphcmdzID0gMDsKKworICAvLyBEaXNwbGF5IGFsbCBrZXlzCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSBkaXJ0cmVlX3JlYWQoIi9wcm9jL3N5cyIsIGRvX3Nob3dfa2V5cyk7CisKKyAgLy8gcmVhZCBmaWxlCisgIGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIHsKKyAgICBGSUxFICpmcCA9IHhmb3BlbigqdG95cy5vcHRhcmdzID8gKnRveXMub3B0YXJncyA6ICIvZXRjL3N5c2N0bC5jb25mIiwgInIiKTsKKyAgICBzaXplX3QgbGVuOworCisgICAgZm9yICg7OykgeworICAgICAgY2hhciAqbGluZSA9IDAsICprZXksICp2YWw7CisKKyAgICAgIGlmICgtMSA9PSAobGVuID0gZ2V0bGluZSgmbGluZSwgJmxlbiwgZnApKSkgYnJlYWs7CisgICAgICBrZXkgPSBsaW5lOworICAgICAgd2hpbGUgKGlzc3BhY2UoKmtleSkpIGtleSsrOworICAgICAgaWYgKCprZXkgPT0gJyMnIHx8ICprZXkgPT0gJzsnIHx8ICEqa2V5KSBjb250aW51ZTsKKyAgICAgIHdoaWxlIChsZW4gJiYgaXNzcGFjZShsaW5lW2xlbi0xXSkpIGxpbmVbLS1sZW5dID0gMDsKKyAgICAgIGlmICghKHZhbCA9IHNwbGl0X2tleShsaW5lKSkpIHsKKyAgICAgICAgZXJyb3JfbXNnKCInJXMnIG5vdCBrZXk9dmFsdWUiLCBsaW5lKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFRyaW0gd2hpdGVzcGFjZSBhcm91bmQgPQorICAgICAgbGVuID0gKHZhbC1saW5lKS0xOworICAgICAgd2hpbGUgKGxlbiAmJiBpc3NwYWNlKGxpbmVbbGVuLTFdKSkgbGluZVstLWxlbl0gPSAwOworICAgICAgd2hpbGUgKGlzc3BhY2UoKnZhbCkpIHZhbCsrOzsKKworICAgICAgcHJvY2Vzc19rZXkoa2V5LCB2YWwpOworICAgICAgZnJlZShsaW5lKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKworICAvLyBMb29wIHRocm91Z2ggYXJndW1lbnRzLCBkaXNwbGF5aW5nIG9yIGFzc2lnbmluZyBhcyBhcHByb3ByaWF0ZQorICB9IGVsc2UgeworICAgIGlmICghKnRveXMub3B0YXJncykgaGVscF9leGl0KDApOworICAgIGZvciAoYXJncyA9IHRveXMub3B0YXJnczsgKmFyZ3M7IGFyZ3MrKykgcHJvY2Vzc19rZXkoKmFyZ3MsIDApOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci90YWMuYyBiL3RveWJveC90b3lzL290aGVyL3RhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjcyZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9vdGhlci90YWMuYwpAQCAtMCwwICsxLDQ5IEBACisvKiB0YWMuYyAtIG91dHB1dCBsaW5lcyBpbiByZXZlcnNlIG9yZGVyCisgKgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworVVNFX1RBQyhORVdUT1kodGFjLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBUQUMKKyAgYm9vbCAidGFjIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB0YWMgW0ZJTEUuLi5dCisKKyAgICBPdXRwdXQgbGluZXMgaW4gcmV2ZXJzZSBvcmRlci4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0YXRpYyB2b2lkIGRvX3RhYyhpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBhcmdfbGlzdCAqbGlzdCA9IE5VTEw7CisgIGNoYXIgKmM7CisKKyAgLy8gUmVhZCBpbiBsaW5lcworICBmb3IgKDs7KSB7CisgICAgc3RydWN0IGFyZ19saXN0ICp0ZW1wOworICAgIGxvbmcgbGVuOworCisgICAgaWYgKCEoYyA9IGdldF9yYXdsaW5lKGZkLCAmbGVuLCAnXG4nKSkpIGJyZWFrOworCisgICAgdGVtcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICAgIHRlbXAtPm5leHQgPSBsaXN0OworICAgIHRlbXAtPmFyZyA9IGM7CisgICAgbGlzdCA9IHRlbXA7CisgIH0KKworICAvLyBQbGF5IHRoZW0gYmFjay4KKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKnRlbXAgPSBsaXN0LT5uZXh0OworICAgIHhwcmludGYoIiVzIiwgbGlzdC0+YXJnKTsKKyAgICBmcmVlKGxpc3QtPmFyZyk7CisgICAgZnJlZShsaXN0KTsKKyAgICBsaXN0ID0gdGVtcDsKKyAgfQorfQorCit2b2lkIHRhY19tYWluKHZvaWQpCit7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX3RhYyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci90YXNrc2V0LmMgYi90b3lib3gvdG95cy9vdGhlci90YXNrc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjMzg3MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3Rhc2tzZXQuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogdGFza3NldC5jIC0gUmV0cmlldmUgb3Igc2V0IHRoZSBDUFUgYWZmaW5pdHkgb2YgYSBwcm9jZXNzLgorICoKKyAqIENvcHlyaWdodCAyMDEyIEVsaWUgRGUgQnJhdXdlciA8ZWxpZWRlYnJhdXdlckBnbWFpbC5jb20+CisKK1VTRV9UQVNLU0VUKE5FV1RPWSh0YXNrc2V0LCAiPDFecGEiLCBUT1lGTEFHX0JJTnxUT1lGTEFHX1NUQVlST09UKSkKK1VTRV9OUFJPQyhORVdUT1kobnByb2MsICIoYWxsKSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIE5QUk9DCisgIGJvb2wgIm5wcm9jIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBucHJvYyBbLS1hbGxdCisKKyAgICBQcmludCBudW1iZXIgb2YgcHJvY2Vzc29ycy4KKworICAgIC0tYWxsCVNob3cgYWxsIHByb2Nlc3NvcnMsIG5vdCBqdXN0IG9uZXMgdGhpcyB0YXNrIGNhbiBydW4gb24uCisKK2NvbmZpZyBUQVNLU0VUCisgIGJvb2wgInRhc2tzZXQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHRhc2tzZXQgWy1hcF0gW21hc2tdIFtQSUQgfCBjbWQgW2FyZ3MuLi5dXQorCisgICAgTGF1bmNoIGEgbmV3IHRhc2sgd2hpY2ggbWF5IG9ubHkgcnVuIG9uIGNlcnRhaW4gcHJvY2Vzc29ycywgb3IgY2hhbmdlCisgICAgdGhlIHByb2Nlc3NvciBhZmZpbml0eSBvZiBhbiBleGlzaXRuZyBQSUQuCisKKyAgICBNYXNrIGlzIGEgaGV4IHN0cmluZyB3aGVyZSBlYWNoIGJpdCByZXByZXNlbnRzIGEgcHJvY2Vzc29yIHRoZSBwcm9jZXNzCisgICAgaXMgYWxsb3dlZCB0byBydW4gb24uIFBJRCB3aXRob3V0IGEgbWFzayBkaXNwbGF5cyBleGlzdGluZyBhZmZpbml0eS4KKworICAgIC1wCVNldC9nZXQgdGhlIGFmZmluaXR5IG9mIGdpdmVuIFBJRCBpbnN0ZWFkIG9mIGEgbmV3IGNvbW1hbmQuCisgICAgLWEJU2V0L2dldCB0aGUgYWZmaW5pdHkgb2YgYWxsIHRocmVhZHMgb2YgdGhlIFBJRC4KKyovCisKKyNkZWZpbmUgRk9SX3Rhc2tzZXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2RlZmluZSBzY2hlZF9zZXRhZmZpbml0eShwaWQsIHNpemUsIGNwdXNldCkgXAorICBzeXNjYWxsKF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIChwaWRfdClwaWQsIChzaXplX3Qpc2l6ZSwgKHZvaWQgKiljcHVzZXQpCisjZGVmaW5lIHNjaGVkX2dldGFmZmluaXR5KHBpZCwgc2l6ZSwgY3B1c2V0KSBcCisgIHN5c2NhbGwoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgKHBpZF90KXBpZCwgKHNpemVfdClzaXplLCAodm9pZCAqKWNwdXNldCkKKworLy8gbWFzayBpcyBhbiBhcnJheSBvZiBsb25nLCB3aGljaCBtYWtlcyB0aGUgbGF5b3V0IGEgYml0IHdlaXJkIG9uIGJpZworLy8gZW5kaWFuIHN5c3RlbXMgYnV0IGFzIGxvbmcgYXMgaXQncyBjb25zaXN0ZW50Li4uCisKK3N0YXRpYyB2b2lkIGRvX3Rhc2tzZXQocGlkX3QgcGlkLCBpbnQgcXVpZXQpCit7CisgIHVuc2lnbmVkIGxvbmcgKm1hc2sgPSAodW5zaWduZWQgbG9uZyAqKXRveWJ1ZjsKKyAgY2hhciAqcyA9ICp0b3lzLm9wdGFyZ3MsICpmYWlsZWQgPSAiZmFpbGVkIHRvICVzICVkJ3MgYWZmaW5pdHkiOworICBpbnQgaSwgaiwgazsKKworICBmb3IgKGk9MDsgOyBpKyspIHsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBpbnQgaiA9IHNpemVvZih0b3lidWYpLCBmbGFnID0gMDsKKworICAgICAgaWYgKC0xID09IHNjaGVkX2dldGFmZmluaXR5KHBpZCwgc2l6ZW9mKHRveWJ1ZiksICh2b2lkICopbWFzaykpCisgICAgICAgIHBlcnJvcl9leGl0KGZhaWxlZCwgImdldCIsIHBpZCk7CisKKyAgICAgIHByaW50ZigicGlkICVkJ3MgJXMgYWZmaW5pdHkgbWFzazogIiwgcGlkLCBpID8gIm5ldyIgOiAiY3VycmVudCIpOworCisgICAgICB3aGlsZSAoai0tKSB7CisgICAgICAgIGludCB4ID0gMjU1ICYgKG1hc2tbai9zaXplb2YobG9uZyldID4+ICg4KihqJihzaXplb2YobG9uZyktMSkpKSk7CisKKyAgICAgICAgaWYgKGZsYWcpIHByaW50ZigiJTAyeCIsIHgpOworICAgICAgICBlbHNlIGlmICh4KSB7CisgICAgICAgICAgZmxhZysrOworICAgICAgICAgIHByaW50ZigiJXgiLCB4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICB9CisKKyAgICBpZiAoaSB8fCB0b3lzLm9wdGMgPCAyKSByZXR1cm47CisKKyAgICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgICAgayA9IHN0cmxlbihzID0gKnRveXMub3B0YXJncyk7CisgICAgcyArPSBrOworICAgIGZvciAoaiA9IDA7IGo8azsgaisrKSB7CisgICAgICB1bnNpZ25lZCBsb25nIGRpZ2l0ID0gKigtLXMpIC0gJzAnOworCisgICAgICBpZiAoZGlnaXQgPiA5KSBkaWdpdCA9IDEwICsgdG9sb3dlcigqcyktJ2EnOworICAgICAgaWYgKGRpZ2l0ID4gMTUpIGVycm9yX2V4aXQoImJhZCBtYXNrICclcyciLCAqdG95cy5vcHRhcmdzKTsKKyAgICAgIG1hc2tbai8oMipzaXplb2YobG9uZykpXSB8PSBkaWdpdCA8PCA0KihqJigoMipzaXplb2YobG9uZykpLTEpKTsKKyAgICB9CisKKyAgICBpZiAoLTEgPT0gc2NoZWRfc2V0YWZmaW5pdHkocGlkLCBzaXplb2YodG95YnVmKSwgKHZvaWQgKiltYXNrKSkKKyAgICAgIHBlcnJvcl9leGl0KGZhaWxlZCwgInNldCIsIHBpZCk7CisgIH0KK30KKworc3RhdGljIGludCB0YXNrX2NhbGxiYWNrKHN0cnVjdCBkaXJ0cmVlICpuZXcpCit7CisgIGlmICghbmV3LT5wYXJlbnQpIHJldHVybiBESVJUUkVFX1JFQ1VSU0U7CisgIGlmIChpc2RpZ2l0KCpuZXctPm5hbWUpKSBkb190YXNrc2V0KGF0b2kobmV3LT5uYW1lKSwgMCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdGFza3NldF9tYWluKHZvaWQpCit7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApKSB7CisgICAgaWYgKHRveXMub3B0YyA8IDIpIGVycm9yX2V4aXQoIk5lZWRzIDIgYXJncyIpOworICAgIGRvX3Rhc2tzZXQoZ2V0cGlkKCksIDEpOworICAgIHhleGVjKHRveXMub3B0YXJncysxKTsKKyAgfSBlbHNlIHsKKyAgICBjaGFyICpjOworICAgIHBpZF90IHBpZCA9IHN0cnRvbCh0b3lzLm9wdGFyZ3NbdG95cy5vcHRjLTFdLCAmYywgMTApOworCisgICAgaWYgKCpjKSBlcnJvcl9leGl0KCJOb3QgaW50ICVzIiwgdG95cy5vcHRhcmdzWzFdKTsKKworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSB7CisgICAgICBjaGFyIGJ1ZlszM107CisgICAgICBzcHJpbnRmKGJ1ZiwgIi9wcm9jLyVsZC90YXNrLyIsIChsb25nKXBpZCk7CisgICAgICBkaXJ0cmVlX3JlYWQoYnVmLCB0YXNrX2NhbGxiYWNrKTsKKyAgICB9IGVsc2UgZG9fdGFza3NldChwaWQsIDApOworICB9Cit9CisKK3ZvaWQgbnByb2NfbWFpbih2b2lkKQoreworICB1bnNpZ25lZCBpLCBqLCBucHJvYyA9IDA7CisKKyAgLy8gVGhpcyBjYW4gb25seSBkZXRlY3QgMzI3NjggcHJvY2Vzc29ycy4gQ2FsbCBnZXRhZmZpbml0eSBhbmQgY291bnQgYml0cy4KKyAgaWYgKCF0b3lzLm9wdGZsYWdzICYmIC0xIT1zY2hlZF9nZXRhZmZpbml0eShnZXRwaWQoKSwgNDA5NiwgdG95YnVmKSkgeworICAgIGZvciAoaSA9IDA7IGk8NDA5NjsgaSsrKQorICAgICAgaWYgKHRveWJ1ZltpXSkgZm9yIChqPTA7IGo8ODsgaisrKSBpZiAodG95YnVmW2ldJigxPDxqKSkgbnByb2MrKzsKKyAgfQorCisgIC8vIElmIGdldGFmZmluaXR5IGZhaWxlZCBvciAtLWFsbCwgY291bnQgY3B1IGVudHJpZXMgaW4gcHJvYworICBpZiAoIW5wcm9jKSBucHJvYyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX0NPTkYpOworCisgIHhwcmludGYoIiV1XG4iLCBucHJvYyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci90aW1lb3V0LmMgYi90b3lib3gvdG95cy9vdGhlci90aW1lb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5ZGM3YQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3RpbWVvdXQuYwpAQCAtMCwwICsxLDcyIEBACisvKiB0aW1lb3V0LmMgLSBSdW4gY29tbWFuZCBsaW5lIHdpdGggYSB0aW1lb3V0CisgKgorICogQ29weXJpZ2h0IDIwMTMgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBObyBzdGFuZGFyZAorCitVU0VfVElNRU9VVChORVdUT1kodGltZW91dCwgIjwyXnZrOnM6ICIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRJTUVPVVQKKyAgYm9vbCAidGltZW91dCIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX0ZMT0FUCisgIGhlbHAKKyAgICB1c2FnZTogdGltZW91dCBbLWsgTEVOR1RIXSBbLXMgU0lHTkFMXSBMRU5HVEggQ09NTUFORC4uLgorCisgICAgUnVuIGNvbW1hbmQgbGluZSBhcyBhIGNoaWxkIHByb2Nlc3MsIHNlbmRpbmcgY2hpbGQgYSBzaWduYWwgaWYgdGhlCisgICAgY29tbWFuZCBkb2Vzbid0IGV4aXQgc29vbiBlbm91Z2guCisKKyAgICBMZW5ndGggY2FuIGJlIGEgZGVjaW1hbCBmcmFjdGlvbi4gQW4gb3B0aW9uYWwgc3VmZml4IGNhbiBiZSAibSIKKyAgICAobWludXRlcyksICJoIiAoaG91cnMpLCAiZCIgKGRheXMpLCBvciAicyIgKHNlY29uZHMsIHRoZSBkZWZhdWx0KS4KKworICAgIC1zCVNlbmQgc3BlY2lmaWVkIHNpZ25hbCAoZGVmYXVsdCBURVJNKQorICAgIC1rCVNlbmQgS0lMTCBzaWduYWwgaWYgY2hpbGQgc3RpbGwgcnVubmluZyB0aGlzIGxvbmcgYWZ0ZXIgZmlyc3Qgc2lnbmFsLgorICAgIC12CVZlcmJvc2UKKyovCisKKyNkZWZpbmUgRk9SX3RpbWVvdXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnNfc2lnbmFsOworICBjaGFyICprX3RpbWVvdXQ7CisKKyAgaW50IG5leHRzaWc7CisgIHBpZF90IHBpZDsKKyAgc3RydWN0IHRpbWV2YWwga3R2OworICBzdHJ1Y3QgaXRpbWVydmFsIGl0djsKKykKKworc3RhdGljIHZvaWQgaGFuZGxlcihpbnQgaSkKK3sKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpCisgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lb3V0IHBpZCAlZCBzaWduYWwgJWRcbiIsIFRULnBpZCwgVFQubmV4dHNpZyk7CisgIGtpbGwoVFQucGlkLCBUVC5uZXh0c2lnKTsKKyAgCisgIGlmIChUVC5rX3RpbWVvdXQpIHsKKyAgICBUVC5rX3RpbWVvdXQgPSAwOworICAgIFRULm5leHRzaWcgPSBTSUdLSUxMOworICAgIHhzaWduYWwoU0lHQUxSTSwgaGFuZGxlcik7CisgICAgVFQuaXR2Lml0X3ZhbHVlID0gVFQua3R2OworICAgIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJlRULml0diwgKHZvaWQgKil0b3lidWYpOworICB9Cit9CisKK3ZvaWQgdGltZW91dF9tYWluKHZvaWQpCit7CisgIC8vIFBhcnNlIGVhcmx5IHRvIGdldCBhbnkgZXJyb3JzIG91dCBvZiB0aGUgd2F5LgorICBUVC5pdHYuaXRfdmFsdWUudHZfc2VjID0geHBhcnNldGltZSgqdG95cy5vcHRhcmdzLCAxMDAwMDAwLCAmVFQuaXR2Lml0X3ZhbHVlLnR2X3VzZWMpOworCisgIGlmIChUVC5rX3RpbWVvdXQpCisgICAgVFQua3R2LnR2X3NlYyA9IHhwYXJzZXRpbWUoVFQua190aW1lb3V0LCAxMDAwMDAwLCAmVFQua3R2LnR2X3VzZWMpOworICBUVC5uZXh0c2lnID0gU0lHVEVSTTsKKyAgaWYgKFRULnNfc2lnbmFsICYmIC0xID09IChUVC5uZXh0c2lnID0gc2lnX3RvX251bShUVC5zX3NpZ25hbCkpKQorICAgIGVycm9yX2V4aXQoImJhZCAtczogJyVzJyIsIFRULnNfc2lnbmFsKTsKKworICBpZiAoIShUVC5waWQgPSBYVkZPUksoKSkpIHhleGVjKHRveXMub3B0YXJncysxKTsKKyAgZWxzZSB7CisgICAgeHNpZ25hbChTSUdBTFJNLCBoYW5kbGVyKTsKKyAgICBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZUVC5pdHYsICh2b2lkICopdG95YnVmKTsKKyAgICB0b3lzLmV4aXR2YWwgPSB4d2FpdHBpZChUVC5waWQpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci90cnVuY2F0ZS5jIGIvdG95Ym94L3RveXMvb3RoZXIvdHJ1bmNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmUxZjEwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvdHJ1bmNhdGUuYwpAQCAtMCwwICsxLDY1IEBACisvKiB0cnVuY2F0ZS5jIC0gc2V0IGZpbGUgbGVuZ3RoLCBleHRlbmRpbmcgc3BhcnNlbHkgaWYgbmVjZXNzYXJ5CisgKgorICogQ29weXJpZ2h0IDIwMTEgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKworVVNFX1RSVU5DQVRFKE5FV1RPWSh0cnVuY2F0ZSwgIjwxczp8YyIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRSVU5DQVRFCisgIGJvb2wgInRydW5jYXRlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB0cnVuY2F0ZSBbLWNdIC1zIFNJWkUgZmlsZS4uLgorCisgICAgU2V0IGxlbmd0aCBvZiBmaWxlKHMpLCBleHRlbmRpbmcgc3BhcnNlbHkgaWYgbmVjZXNzYXJ5LgorCisgICAgLWMJRG9uJ3QgY3JlYXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAtcwlOZXcgc2l6ZSAod2l0aCBvcHRpb25hbCBwcmVmaXggYW5kIHN1ZmZpeCkKKworICAgIFNJWkUgcHJlZml4OiArIGFkZCwgLSBzdWJ0cmFjdCwgPCBzaHJpbmsgdG8sID4gZXhwYW5kIHRvLAorICAgICAgICAgICAgICAgICAvIG11bHRpcGxlIHJvdW5kaW5nIGRvd24sICUgbXVsdGlwbGUgcm91bmRpbmcgdXAKKyAgICBTSVpFIHN1ZmZpeDogaz0xMDI0LCBtPTEwMjReMiwgZz0xMDI0XjMsIHQ9MTAyNF40LCBwPTEwMjReNSwgZT0xMDI0XjYKKyovCisKKyNkZWZpbmUgRk9SX3RydW5jYXRlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpzOworCisgIGxvbmcgc2l6ZTsKKyAgaW50IHR5cGU7CispCisKK3N0YXRpYyB2b2lkIGRvX3RydW5jYXRlKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgbG9uZyBsb25nIHNpemU7CisKKyAgaWYgKGZkPDApIHJldHVybjsKKworICBpZiAoVFQudHlwZSA9PSAtMSkgc2l6ZSA9IFRULnNpemU7CisgIGVsc2UgeworICAgIHNpemUgPSBmZGxlbmd0aChmZCk7CisgICAgaWYgKFRULnR5cGU8Mikgc2l6ZSArPSBUVC5zaXplKigxLSgyKlRULnR5cGUpKTsKKyAgICBlbHNlIGlmIChUVC50eXBlPDQpIHsKKyAgICAgIGlmICgoVFQudHlwZT09MikgPyAoc2l6ZSA8PSBUVC5zaXplKSA6IChzaXplID49IFRULnNpemUpKSByZXR1cm47CisgICAgICBzaXplID0gVFQuc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IChzaXplKyhUVC50eXBlLTQpKihUVC5zaXplLTEpKS9UVC5zaXplOworICAgICAgc2l6ZSAqPSBUVC5zaXplOworICAgIH0KKyAgfQorICBpZiAoZnRydW5jYXRlKGZkLCBzaXplKSkgcGVycm9yX21zZygiJyVzJyB0byAnJWxsZCciLCBuYW1lLCBzaXplKTsKK30KKwordm9pZCB0cnVuY2F0ZV9tYWluKHZvaWQpCit7CisgIGludCBjciA9ICEodG95cy5vcHRmbGFncyYxKTsKKworICBpZiAoLTEgIT0gKFRULnR5cGUgPSBzdHJpZHgoIistPD4vJSIsICpUVC5zKSkpIFRULnMrKzsKKyAgVFQuc2l6ZSA9IGF0b2x4KFRULnMpOworCisgIC8vIENyZWF0ZSBmaWxlcyB3aXRoIG1hc2sgcndyd3J3LgorICAvLyBOb25leGlzdGVudCBmaWxlcyBhcmUgb25seSBhbiBlcnJvciBpZiB3ZSdyZSBzdXBwb3NlZCB0byBjcmVhdGUgdGhlbS4KKyAgbG9vcGZpbGVzX3J3KHRveXMub3B0YXJncywgT19XUk9OTFl8T19DTE9FWEVDfChjciA/IE9fQ1JFQVQgOiAwKSwgMDY2NiwgY3IsCisgICAgZG9fdHJ1bmNhdGUpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvdXB0aW1lLmMgYi90b3lib3gvdG95cy9vdGhlci91cHRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg4N2RmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvdXB0aW1lLmMKQEAgLTAsMCArMSw1NiBAQAorLyogdXB0aW1lLmMgLSBUZWxsIGhvdyBsb25nIHRoZSBzeXN0ZW0gaGFzIGJlZW4gcnVubmluZy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBFbGllIERlIEJyYXV3ZXIgPGVsaWVkZWJyYXV3ZXJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTIgTHVpcyBGZWxpcGUgU3RyYW5vIE1vcmFlcyA8bGZlbGlwZUBwcm9mdXNpb24ubW9iaT4KKyAqIENvcHlyaWdodCAyMDEzIEplcm9lbiB2YW4gUmlqbiA8anZybml4QGdtYWlsLmNvbT4KKworCitVU0VfVVBUSU1FKE5FV1RPWSh1cHRpbWUsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFVQVElNRQorICBib29sICJ1cHRpbWUiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9VVE1QWAorICBoZWxwCisgICAgdXNhZ2U6IHVwdGltZQorCisgICAgVGVsbCBob3cgbG9uZyB0aGUgc3lzdGVtIGhhcyBiZWVuIHJ1bm5pbmcgYW5kIHRoZSBzeXN0ZW0gbG9hZAorICAgIGF2ZXJhZ2VzIGZvciB0aGUgcGFzdCAxLCA1IGFuZCAxNSBtaW51dGVzLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB1cHRpbWVfbWFpbih2b2lkKQoreworICBzdHJ1Y3Qgc3lzaW5mbyBpbmZvOworICB0aW1lX3QgdG1wdGltZTsKKyAgc3RydWN0IHRtICogbm93OworICB1bnNpZ25lZCBpbnQgZGF5cywgaG91cnMsIG1pbnV0ZXM7CisgIHN0cnVjdCB1dG1weCAqZW50cnk7CisgIGludCB1c2VycyA9IDA7CisKKyAgLy8gT2J0YWluIHRoZSBkYXRhIHdlIG5lZWQuCisgIHN5c2luZm8oJmluZm8pOworICB0aW1lKCZ0bXB0aW1lKTsKKyAgbm93ID0gbG9jYWx0aW1lKCZ0bXB0aW1lKTsKKworICAvLyBPYnRhaW4gaW5mbyBhYm91dCBsb2dnZWQgb24gdXNlcnMKKyAgc2V0dXR4ZW50KCk7CisgIHdoaWxlICgoZW50cnkgPSBnZXR1dHhlbnQoKSkpIGlmIChlbnRyeS0+dXRfdHlwZSA9PSBVU0VSX1BST0NFU1MpIHVzZXJzKys7CisgIGVuZHV0eGVudCgpOworCisgIC8vIFRpbWUKKyAgeHByaW50ZigiICUwMmQ6JTAyZDolMDJkIHVwICIsIG5vdy0+dG1faG91ciwgbm93LT50bV9taW4sIG5vdy0+dG1fc2VjKTsKKyAgLy8gVXB0aW1lCisgIGluZm8udXB0aW1lIC89IDYwOworICBtaW51dGVzID0gaW5mby51cHRpbWUlNjA7CisgIGluZm8udXB0aW1lIC89IDYwOworICBob3VycyA9IGluZm8udXB0aW1lJTI0OworICBkYXlzID0gaW5mby51cHRpbWUvMjQ7CisgIGlmIChkYXlzKSB4cHJpbnRmKCIlZCBkYXklcywgIiwgZGF5cywgKGRheXMhPTEpPyJzIjoiIik7CisgIGlmIChob3VycykgeHByaW50ZigiJTJkOiUwMmQsICIsIGhvdXJzLCBtaW51dGVzKTsKKyAgZWxzZSBwcmludGYoIiVkIG1pbiwgIiwgbWludXRlcyk7CisgIHByaW50ZigiICVkIHVzZXIlcywgIiwgdXNlcnMsICh1c2VycyE9MSkgPyAicyIgOiAiIik7CisgIHByaW50ZigiIGxvYWQgYXZlcmFnZTogJS4wMmYsICUuMDJmLCAlLjAyZlxuIiwgaW5mby5sb2Fkc1swXS82NTUzNi4wLAorICAgIGluZm8ubG9hZHNbMV0vNjU1MzYuMCwgaW5mby5sb2Fkc1syXS82NTUzNi4wKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3VzbGVlcC5jIGIvdG95Ym94L3RveXMvb3RoZXIvdXNsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MGNjMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3VzbGVlcC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIHVzbGVlcC5jIC0gV2FpdCBmb3IgYSBudW1iZXIgb2YgbWljcm9zZWNvbmRzLgorICoKKyAqIENvcHlyaWdodCAyMDEyIEVsaWUgRGUgQnJhdXdlciA8ZWxpZWRlYnJhdXdlckBnbWFpbC5jb20+CisKK1VTRV9VU0xFRVAoTkVXVE9ZKHVzbGVlcCwgIjwxIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgVVNMRUVQCisgIGJvb2wgInVzbGVlcCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogdXNsZWVwIE1JQ1JPU0VDT05EUworCisgICAgUGF1c2UgZm9yIE1JQ1JPU0VDT05EUyBtaWNyb3NlY29uZHMuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHVzbGVlcF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgbG9uZyBkZWxheSA9IGF0b2woKnRveXMub3B0YXJncyk7CisKKyAgdHYudHZfc2VjID0gZGVsYXkvMTAwMDAwMDsKKyAgdHYudHZfbnNlYyA9IChkZWxheSUxMDAwMDAwKSAqIDEwMDA7CisgIHRveXMuZXhpdHZhbCA9ICEhbmFub3NsZWVwKCZ0diwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci92Y29uZmlnLmMgYi90b3lib3gvdG95cy9vdGhlci92Y29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3ODUyNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3Zjb25maWcuYwpAQCAtMCwwICsxLDkwIEBACisvKiB2Y29uZmlnLmMgLSBDcmVhdGVzIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMiBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBzdGFuZGFyZAorICoKKyAqIFRPRE86IGNsZWFudXAKKworVVNFX1ZDT05GSUcoTkVXVE9ZKHZjb25maWcsICI8Mj40IiwgVE9ZRkxBR19ORUVEUk9PVHxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgVkNPTkZJRworICBib29sICJ2Y29uZmlnIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB2Y29uZmlnIENPTU1BTkQgW09QVElPTlNdCisKKyAgICBDcmVhdGUgYW5kIHJlbW92ZSB2aXJ0dWFsIGV0aGVybmV0IGRldmljZXMKKworICAgIGFkZCAgICAgICAgICAgICBbaW50ZXJmYWNlLW5hbWVdIFt2bGFuX2lkXQorICAgIHJlbSAgICAgICAgICAgICBbdmxhbi1uYW1lXQorICAgIHNldF9mbGFnICAgICAgICBbaW50ZXJmYWNlLW5hbWVdIFtmbGFnLW51bV0gICAgICAgWzAgfCAxXQorICAgIHNldF9lZ3Jlc3NfbWFwICBbdmxhbi1uYW1lXSAgICAgIFtza2JfcHJpb3JpdHldICAgW3ZsYW5fcW9zXQorICAgIHNldF9pbmdyZXNzX21hcCBbdmxhbi1uYW1lXSAgICAgIFtza2JfcHJpb3JpdHldICAgW3ZsYW5fcW9zXQorICAgIHNldF9uYW1lX3R5cGUgICBbbmFtZS10eXBlXQorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCit2b2lkIHZjb25maWdfbWFpbih2b2lkKQoreworICBzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIHJlcXVlc3Q7CisgIGNoYXIgKmNtZDsKKyAgaW50IGZkOworCisgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIG1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MpKTsKKyAgY21kID0gdG95cy5vcHRhcmdzWzBdOworCisgIGlmICghc3RyY21wKGNtZCwgInNldF9uYW1lX3R5cGUiKSkgeworICAgIGNoYXIgKnR5cGVzW10gPSB7IlZMQU5fUExVU19WSUQiLCAiREVWX1BMVVNfVklEIiwgIlZMQU5fUExVU19WSURfTk9fUEFEIiwKKyAgICAgICAgICAgICAgICAgICAgICJERVZfUExVU19WSURfTk9fUEFEIn07CisgICAgaW50IGksIGogPSBzaXplb2YodHlwZXMpL3NpemVvZigqdHlwZXMpOworCisgICAgZm9yIChpPTA7IGk8ajsgaSsrKSBpZiAoIXN0cmNtcCh0b3lzLm9wdGFyZ3NbMV0sIHR5cGVzW2ldKSkgYnJlYWs7CisgICAgaWYgKGkgPT0gaikgeworICAgICAgZm9yIChpPTA7IGk8ajsgaSsrKSBwdXRzKHR5cGVzW2ldKTsKKyAgICAgIGVycm9yX2V4aXQoIiVzOiB1bmtub3duICclcyciLCBjbWQsIHRveXMub3B0YXJnc1sxXSk7CisgICAgfQorCisgICAgcmVxdWVzdC51Lm5hbWVfdHlwZSA9IGk7CisgICAgcmVxdWVzdC5jbWQgPSBTRVRfVkxBTl9OQU1FX1RZUEVfQ01EOworICAgIHhpb2N0bChmZCwgU0lPQ1NJRlZMQU4sICZyZXF1ZXN0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTdG9yZSBpbnRlcmZhY2UgbmFtZQorICB4c3RybmNweShyZXF1ZXN0LmRldmljZTEsIHRveXMub3B0YXJnc1sxXSwgMTYpOworCisgIGlmICghc3RyY21wKGNtZCwgImFkZCIpKSB7CisgICAgcmVxdWVzdC5jbWQgPSBBRERfVkxBTl9DTUQ7CisgICAgaWYgKHRveXMub3B0YXJnc1syXSkgcmVxdWVzdC51LlZJRCA9IGF0b2x4X3JhbmdlKHRveXMub3B0YXJnc1syXSwgMCwgNDA5NCk7CisgICAgaWYgKHJlcXVlc3QudS5WSUQgPT0gMSkKKyAgICAgIHhwcmludGYoIldBUk5JTkc6IFZMQU4gMSBkb2VzIG5vdCB3b3JrIHdpdGggbWFueSBzd2l0Y2hlcy5cbiIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicmVtIikpIHJlcXVlc3QuY21kID0gREVMX1ZMQU5fQ01EOworICBlbHNlIGlmICghc3RyY21wKGNtZCwgInNldF9mbGFnIikpIHsKKyAgICByZXF1ZXN0LmNtZCA9IFNFVF9WTEFOX0ZMQUdfQ01EOworICAgIGlmICh0b3lzLm9wdGFyZ3NbMl0pIHJlcXVlc3QudS5mbGFnID0gYXRvbHhfcmFuZ2UodG95cy5vcHRhcmdzWzJdLCAwLCAxKTsKKyAgICBpZiAodG95cy5vcHRhcmdzWzNdKSByZXF1ZXN0LnZsYW5fcW9zID0gYXRvbHhfcmFuZ2UodG95cy5vcHRhcmdzWzNdLCAwLCA3KTsKKyAgfSBlbHNlIGlmKHN0cmNtcChjbWQsICJzZXRfZWdyZXNzX21hcCIpID09IDApIHsKKyAgICByZXF1ZXN0LmNtZCA9IFNFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQ7CisgICAgaWYgKHRveXMub3B0YXJnc1syXSkKKyAgICAgIHJlcXVlc3QudS5za2JfcHJpb3JpdHkgPSBhdG9seF9yYW5nZSh0b3lzLm9wdGFyZ3NbMl0sIDAsIElOVF9NQVgpOworICAgIGlmICh0b3lzLm9wdGFyZ3NbM10pIHJlcXVlc3Qudmxhbl9xb3MgPSBhdG9seF9yYW5nZSh0b3lzLm9wdGFyZ3NbM10sIDAsIDcpOworICB9IGVsc2UgaWYoc3RyY21wKGNtZCwgInNldF9pbmdyZXNzX21hcCIpID09IDApIHsKKyAgICByZXF1ZXN0LmNtZCA9IFNFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01EOworICAgIGlmICh0b3lzLm9wdGFyZ3NbMl0pCisgICAgICByZXF1ZXN0LnUuc2tiX3ByaW9yaXR5ID0gYXRvbHhfcmFuZ2UodG95cy5vcHRhcmdzWzJdLCAwLCBJTlRfTUFYKTsKKyAgICAvL1RvIHNldCBmbGFnIHdlIG11c3QgaGF2ZSB0byBzZXQgdmxhbl9xb3MKKyAgICBpZiAodG95cy5vcHRhcmdzWzNdKSByZXF1ZXN0LnZsYW5fcW9zID0gYXRvbHhfcmFuZ2UodG95cy5vcHRhcmdzWzNdLCAwLCA3KTsKKyAgfSBlbHNlIHsKKyAgICB4Y2xvc2UoZmQpOworICAgIHBlcnJvcl9leGl0KCJVbmtub3duIGNvbW1hbmQgJXMiLCBjbWQpOworICB9CisKKyAgeGlvY3RsKGZkLCBTSU9DU0lGVkxBTiwgJnJlcXVlc3QpOworICB4cHJpbnRmKCJTdWNjZXNzZnVsICVzIG9uIGRldmljZSAlc1xuIiwgY21kLCB0b3lzLm9wdGFyZ3NbMV0pOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIvdm1zdGF0LmMgYi90b3lib3gvdG95cy9vdGhlci92bXN0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg1NmNmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvdm1zdGF0LmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIHZtc3RhdC5jIC0gUmVwb3J0IHZpcnR1YWwgbWVtb3J5IHN0YXRpc3RpY3MuCisgKgorICogQ29weXJpZ2h0IDIwMTIgRWxpZSBEZSBCcmF1d2VyIDxlbGllZGVicmF1d2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUT0RPOiBJIGhhdmUgbm8gaWRlYSBob3cgInN5c3RlbSIgY2F0ZWdvcnkgaXMgY2FsY3VsYXRlZC4KKyAqIHdoYXRldmVyIHdlJ3JlIGRvaW5nIGlzbid0IG1hdGNoaW5nIHdoYXQgb3RoZXIgaW1wbGVtZW50YXRpb25zIGFyZSBkb2luZy4KKworVVNFX1ZNU1RBVChORVdUT1kodm1zdGF0LCAiPjJuIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgVk1TVEFUCisgIGJvb2wgInZtc3RhdCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogdm1zdGF0IFstbl0gW0RFTEFZIFtDT1VOVF1dCisKKyAgICBQcmludCB2aXJ0dWFsIG1lbW9yeSBzdGF0aXN0aWNzLCByZXBlYXRpbmcgZWFjaCBERUxBWSBzZWNvbmRzLCBDT1VOVCB0aW1lcy4KKyAgICAoV2l0aCBubyBERUxBWSwgcHJpbnRzIG9uZSBsaW5lLiBXaXRoIG5vIENPVU5ULCByZXBlYXRzIHVudGlsIGtpbGxlZC4pCisKKyAgICBTaG93IHByb2Nlc3NlcyBydW5uaW5nIGFuZCBibG9ja2VkLCBraWxvYnl0ZXMgc3dhcHBlZCwgZnJlZSwgYnVmZmVyZWQsIGFuZAorICAgIGNhY2hlZCwga2lsb2J5dGVzIHN3YXBwZWQgaW4gYW5kIG91dCBwZXIgc2Vjb25kLCBmaWxlIGRpc2sgYmxvY2tzIGlucHV0IGFuZAorICAgIG91dHB1dCBwZXIgc2Vjb25kLCBpbnRlcnJ1cHRzIGFuZCBjb250ZXh0IHN3aXRjaGVzIHBlciBzZWNvbmQsIHBlcmNlbnQKKyAgICBvZiBDUFUgdGltZSBzcGVudCBydW5uaW5nIHVzZXIgY29kZSwgc3lzdGVtIGNvZGUsIGlkbGUsIGFuZCBhd2FpdGluZyBJL08uCisgICAgRmlyc3QgbGluZSBpcyBzaW5jZSBzeXN0ZW0gc3RhcnRlZCwgbGF0ZXIgbGluZXMgYXJlIHNpbmNlIGxhc3QgbGluZS4KKworICAgIC1uCURpc3BsYXkgdGhlIGhlYWRlciBvbmx5IG9uY2UKKyovCisKKyNkZWZpbmUgRk9SX3Ztc3RhdAorI2luY2x1ZGUgInRveXMuaCIKKworc3RydWN0IHZtc3RhdF9wcm9jIHsKKyAgLy8gRnJvbSAvcHJvYy9zdGF0IChqaWZmaWVzKQorICB1aW50NjRfdCB1c2VyLCBuaWNlLCBzeXMsIGlkbGUsIHdhaXQsIGlycSwgc2lycSwgaW50ciwgY3R4dCwgcnVubmluZywgYmxvY2tlZDsKKyAgLy8gRnJvbSAvcHJvYy9tZW1pbmZvICh1bml0cyBhcmUga2IpCisgIHVpbnQ2NF90IG1lbWZyZWUsIGJ1ZmZlcnMsIGNhY2hlZCwgc3dhcGZyZWUsIHN3YXB0b3RhbDsKKyAgLy8gRnJvbSAvcHJvYy92bXN0YXQgKHVuaXRzIGFyZSBrYikKKyAgdWludDY0X3QgaW9faW4sIGlvX291dDsKKyAgLy8gRnJvbSAvcHJvYy92bXN0YXQgKHVuaXRzIGFyZSBwYWdlcykKKyAgdWludDY0X3Qgc3dhcF9pbiwgc3dhcF9vdXQ7Cit9OworCisvLyBBbGwgdGhlIGVsZW1lbnRzIG9mIHZtc3RhdF9wcm9jIGFyZSB0aGUgc2FtZSBzaXplLCBzbyB3ZSBjYW4gcG9wdWxhdGUgaXQgYXMKKy8vIGEgYmlnIGFycmF5LCB0aGVuIHJlYWQgdGhlIGVsZW1lbnRzIGJhY2sgb3V0IGJ5IG5hbWUKK3N0YXRpYyB2b2lkIGdldF92bXN0YXRfcHJvYyhzdHJ1Y3Qgdm1zdGF0X3Byb2MgKnZtc3RhdF9wcm9jKQoreworICBjaGFyICp2bXN0dWZmW10gPSB7ICIvcHJvYy9zdGF0IiwgImNwdSAiLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICJpbnRyICIsICJjdHh0ICIsICJwcm9jc19ydW5uaW5nICIsICJwcm9jc19ibG9ja2VkICIsICIvcHJvYy9tZW1pbmZvIiwKKyAgICAiTWVtRnJlZTogIiwgIkJ1ZmZlcnM6ICIsICJDYWNoZWQ6ICIsICJTd2FwRnJlZTogIiwgIlN3YXBUb3RhbDogIiwKKyAgICAiL3Byb2Mvdm1zdGF0IiwgInBncGdpbiAiLCAicGdwZ291dCAiLCAicHN3cGluICIsICJwc3dwb3V0ICIgfTsKKyAgdWludDY0X3QgKm5ldyA9ICh1aW50NjRfdCAqKXZtc3RhdF9wcm9jOworICBjaGFyICpwID0gcCwgKm5hbWUgPSBuYW1lOworICBpbnQgaSwgajsKKworICAvLyBXZSB1c2Ugdm1zdHVmZiB0byBmaWxsIG91dCB2bXN0YXRfcHJvYyBhcyBhbiBhcnJheSBvZiB1aW50NjRfdDoKKyAgLy8gICBTdHJpbmdzIHN0YXJ0aW5nIHdpdGggLyBhcmUgdGhlIGZpbGUgdG8gZmluZCBuZXh0IGVudHJpZXMgaW4KKyAgLy8gICBBbnkgb3RoZXIgc3RyaW5nIGlzIGEga2V5IHRvIHNlYXJjaCBmb3IsIHdpdGggZGVjaW1hbCB2YWx1ZSByaWdodCBhZnRlcgorICAvLyAgIDAgbWVhbnMgcGFyc2UgYW5vdGhlciB2YWx1ZSBvbiBzYW1lIGxpbmUgYXMgbGFzdCBrZXkKKworICBmb3IgKGkgPSAwOyBpPHNpemVvZih2bXN0dWZmKS9zaXplb2YoY2hhciAqKTsgaSsrKSB7CisgICAgaWYgKCF2bXN0dWZmW2ldKSBwKys7CisgICAgZWxzZSBpZiAoKnZtc3R1ZmZbaV0gPT0gJy8nKSB7CisgICAgICB4cmVhZGZpbGUobmFtZSA9IHZtc3R1ZmZbaV0sIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworCisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKCEocCA9IHN0cmFmdGVyKHRveWJ1Ziwgdm1zdHVmZltpXSkpKSBnb3RvIGVycm9yOworICAgIGlmICgxICE9IHNzY2FuZihwLCAiJSJQUkl1NjQiJW4iLCBuZXcrKywgJmopKSBnb3RvIGVycm9yOworICAgIHAgKz0gajsKKyAgfQorCisgIHJldHVybjsKKworZXJyb3I6CisgIGVycm9yX2V4aXQoIk5vICVzaW4gJXNcbiIsIHZtc3R1ZmZbaV0sIG5hbWUpOworfQorCit2b2lkIHZtc3RhdF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB2bXN0YXRfcHJvYyB0b3BbMl07CisgIGludCBpLCBsb29wX2RlbGF5ID0gMCwgbG9vcF9tYXggPSAwOworICB1bnNpZ25lZCBsb29wLCByb3dzID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pID8gMCA6IDI1LAorICAgICAgICAgICBwYWdlX2tiID0gc3lzY29uZihfU0NfUEFHRVNJWkUpLzEwMjQ7CisgIGNoYXIgKmhlYWRlcnM9InJcMGJcMHN3cGRcMGZyZWVcMGJ1ZmZcMGNhY2hlXDBzaVwwc29cMGJpXDBib1wwaW5cMGNzXDB1c1wwIgorICAgICAgICAgICAgICAgICJzeVwwaWRcMHdhIiwgbGVuZ3Roc1tdID0gezIsMiw2LDYsNiw2LDQsNCw1LDUsNCw0LDIsMiwyLDJ9OworCisgIG1lbXNldCh0b3AsIDAsIHNpemVvZih0b3ApKTsKKyAgaWYgKHRveXMub3B0YykgbG9vcF9kZWxheSA9IGF0b2x4X3JhbmdlKHRveXMub3B0YXJnc1swXSwgMCwgSU5UX01BWCk7CisgIGlmICh0b3lzLm9wdGMgPiAxKSBsb29wX21heCA9IGF0b2x4X3JhbmdlKHRveXMub3B0YXJnc1sxXSwgMSwgSU5UX01BWCkgLSAxOworCisgIGZvciAobG9vcCA9IDA7ICFsb29wX21heCB8fCBsb29wIDw9IGxvb3BfbWF4OyBsb29wKyspIHsKKyAgICB1bnNpZ25lZCBpZHggPSBsb29wJjEsIG9mZnNldCA9IDAsIGV4cGVjdGVkID0gMDsKKyAgICB1aW50NjRfdCB1bml0cywgdG90YWxfaHosICpwdHIgPSAodWludDY0X3QgKikodG9wK2lkeCksCisgICAgICAgICAgICAgKm9sZHB0ciA9ICh1aW50NjRfdCAqKSh0b3ArIWlkeCk7CisKKyAgICBpZiAobG9vcCAmJiBsb29wX2RlbGF5KSBzbGVlcChsb29wX2RlbGF5KTsKKworICAgIC8vIFByaW50IGhlYWRlcnMKKyAgICBpZiAocm93cz4zICYmICEobG9vcCAlIChyb3dzLTMpKSkgeworICAgICAgY2hhciAqaGVhZGVyID0gaGVhZGVyczsKKworICAgICAgaWYgKGlzYXR0eSgxKSkgdGVybWluYWxfc2l6ZSgwLCAmcm93cyk7CisgICAgICBlbHNlIHJvd3MgPSAwOworCisgICAgICBwcmludGYoInByb2NzIC0tLS0tLS0tLS0tbWVtb3J5LS0tLS0tLS0tLSAtLS1zd2FwLS0gLS0tLS1pby0tLS0gLXN5c3RlbS0tIC0tLS1jcHUtLS0tXG4iKTsKKyAgICAgIGZvciAoaT0wOyBpPHNpemVvZihsZW5ndGhzKTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiICUqcyIrIWksIGxlbmd0aHNbaV0sIGhlYWRlcik7CisgICAgICAgIGhlYWRlciArPSBzdHJsZW4oaGVhZGVyKSsxOworICAgICAgfQorICAgICAgeHB1dGMoJ1xuJyk7CisgICAgfQorCisgICAgLy8gUmVhZCBkYXRhIGFuZCBjb21iaW5lIHNvbWUgZmllbGRzIHdlIGRpc3BsYXkgYXMgYWdncmVnYXRlcworICAgIGdldF92bXN0YXRfcHJvYyh0b3AraWR4KTsKKyAgICB0b3BbaWR4XS5ydW5uaW5nLS07IC8vIERvbid0IGluY2x1ZGUgb3Vyc2VsdmVzCisgICAgdG9wW2lkeF0udXNlciArPSB0b3BbaWR4XS5uaWNlOworICAgIHRvcFtpZHhdLnN5cyArPSB0b3BbaWR4XS5pcnEgKyB0b3BbaWR4XS5zaXJxOworICAgIHRvcFtpZHhdLnN3YXB0b3RhbCAtPSB0b3BbaWR4XS5zd2FwZnJlZTsKKworICAgIC8vIENvbGxlY3QgdW5pdCBhZGp1c3RtZW50cyAob3V0c2lkZSB0aGUgaW5uZXIgbG9vcCB0byBzYXZlIHRpbWUpCisKKyAgICBpZiAoIWxvb3ApIHsKKyAgICAgIGNoYXIgKnMgPSB0b3lidWY7CisKKyAgICAgIHhyZWFkZmlsZSgiL3Byb2MvdXB0aW1lIiwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgICB3aGlsZSAoKihzKyspID4gJyAnKTsKKyAgICAgIHNzY2FuZihzLCAiJSJQUkl1NjQsICZ1bml0cyk7CisgICAgfSBlbHNlIHVuaXRzID0gbG9vcF9kZWxheTsKKworICAgIC8vIGFkZCB1cCB1c2VyLCBzeXMsIGlkbGUsIGFuZCB3YWl0IHRpbWUgdXNlZCBzaW5jZSBsYXN0IHRpbWUKKyAgICAvLyAoQWxyZWFkeSBhcHBlbmRlZCBuaWNlIHRvIHVzZXIpCisgICAgdG90YWxfaHogPSAwOworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgdG90YWxfaHogKz0gcHRyW2krISFpXSAtIG9sZHB0cltpKyEhaV07CisKKyAgICAvLyBPdXRwdXQgdmFsdWVzIGluIG9yZGVyW106IHJ1bm5pbmcsIGJsb2NrZWQsIHN3YXB0b3RhbCwgbWVtZnJlZSwgYnVmZmVycywKKyAgICAvLyBjYWNoZSwgc3dhcF9pbiwgc3dhcF9vdXQsIGlvX2luLCBpb19vdXQsIHNpcnEsIGN0eHQsIHVzZXIsIHN5cywgaWRsZSx3YWl0CisKKyAgICBmb3IgKGk9MDsgaTxzaXplb2YobGVuZ3Rocyk7IGkrKykgeworICAgICAgY2hhciBvcmRlcltdID0gezksIDEwLCAxNSwgMTEsIDEyLCAxMywgMTgsIDE5LCAxNiwgMTcsIDYsIDgsIDAsIDIsIDMsIDR9OworICAgICAgdWludDY0X3Qgb3V0ID0gcHRyW29yZGVyW2ldXTsKKyAgICAgIGludCBsZW47CisKKyAgICAgIC8vIEFkanVzdCByYXRlIGFuZCB1bml0cworICAgICAgaWYgKGk+NSkgb3V0IC09IG9sZHB0cltvcmRlcltpXV07CisgICAgICBpZiAob3JkZXJbaV08Nykgb3V0ID0gKChvdXQqMTAwKSArICh0b3RhbF9oei8yKSkgLyB0b3RhbF9oejsKKyAgICAgIGVsc2UgaWYgKG9yZGVyW2ldPjE3KSBvdXQgPSAoKG91dCAqIHBhZ2Vfa2IpKyh1bml0cy0xKSkvdW5pdHM7CisgICAgICBlbHNlIGlmIChvcmRlcltpXT4xNSkgb3V0ID0gKChvdXQpKyh1bml0cy0xKSkvdW5pdHM7CisgICAgICBlbHNlIGlmIChvcmRlcltpXTw5KSBvdXQgPSAob3V0Kyh1bml0cy0xKSkgLyB1bml0czsKKworICAgICAgLy8gSWYgYSBmaWVsZCB3YXMgdG9vIGJpZyB0byBmaXQgaW4gaXRzIHNsb3QsIHRyeSB0byBjb21wZW5zYXRlIGxhdGVyCisgICAgICBleHBlY3RlZCArPSBsZW5ndGhzW2ldICsgISFpOworICAgICAgbGVuID0gZXhwZWN0ZWQgLSBvZmZzZXQgLSAhIWk7CisgICAgICBpZiAobGVuIDwgMCkgbGVuID0gMDsKKyAgICAgIG9mZnNldCArPSBwcmludGYoIiAlKiJQUkl1NjQrIWksIGxlbiwgb3V0KTsKKyAgICB9CisgICAgeHB1dGMoJ1xuJyk7CisKKyAgICBpZiAoIWxvb3BfZGVsYXkpIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci93LmMgYi90b3lib3gvdG95cy9vdGhlci93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2YzgyZgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3cuYwpAQCAtMCwwICsxLDM0IEBACisvKiB3LmMgLSBzaG93cyBsb2dnZWQgaW4gdXNlcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBHYXVyYW5nIFNoYXN0cmkgPGdtc2hhc3RyaUBnbWFpbC5jb20+CisKK1VTRV9XKE5FV1RPWSh3LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBXCisgIGJvb2wgInciCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9VVE1QWAorICBoZWxwCisgICAgdXNhZ2U6IHcKKworICAgIFNob3cgd2hvIGlzIGxvZ2dlZCBvbiBhbmQgc2luY2UgaG93IGxvbmcgdGhleSBsb2dnZWQgaW4uCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHdfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgdXRtcHggKng7CisKKyAgeHByaW50ZigiVVNFUiAgICAgVFRZICAgICAgICAgICAgIExPR0lOQCAgICAgICAgICAgICAgRlJPTSIpOworICBzZXR1dHhlbnQoKTsKKyAgd2hpbGUgKCh4PWdldHV0eGVudCgpKSAhPSBOVUxMKSB7CisgICAgaWYgKHgtPnV0X3R5cGU9PTcpIHsKKyAgICAgIHRpbWVfdCB0dCA9IHgtPnV0X3R2LnR2X3NlYzsKKworICAgICAgeHByaW50ZigiXG4lLTkuOHMlLTkuOHMgJS00LjI0cyAoJS0xLjEycykiLCB4LT51dF91c2VyLCB4LT51dF9saW5lLAorICAgICAgICBjdGltZSgmdHQpLCB4LT51dF9ob3N0KTsKKyAgICB9CisgIH0KKyAgeHB1dGMoJ1xuJyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9vdGhlci93aGljaC5jIGIvdG95Ym94L3RveXMvb3RoZXIvd2hpY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY1ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIvd2hpY2guYwpAQCAtMCwwICsxLDY4IEBACisvKiB3aGljaC5jIC0gRmluZCBleGVjdXRhYmxlIGZpbGVzIGluICRQQVRILgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBsYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisKK1VTRV9XSElDSChORVdUT1kod2hpY2gsICI8MWEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBXSElDSAorICBib29sICJ3aGljaCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogd2hpY2ggWy1hXSBmaWxlbmFtZSAuLi4KKworICAgIFNlYXJjaCAkUEFUSCBmb3IgZXhlY3V0YWJsZSBmaWxlcyBtYXRjaGluZyBmaWxlbmFtZShzKS4KKworICAgIC1hCVNob3cgYWxsIG1hdGNoZXMKKyovCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBGaW5kIGFuIGV4ZWN0dWFibGUgZmlsZSBlaXRoZXIgYXQgYSBwYXRoIHdpdGggYSBzbGFzaCBpbiBpdCAoYWJzb2x1dGUgb3IKKy8vIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5KSwgb3IgaW4gJFBBVEguICBSZXR1cm5zIGFic29sdXRlIHBhdGggdG8gZmlsZSwKKy8vIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorCitzdGF0aWMgaW50IHdoaWNoX2luX3BhdGgoY2hhciAqZmlsZW5hbWUpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdDsKKworICAvLyBJZiB0aGV5IGdhdmUgdXMgYSBwYXRoLCBkb24ndCB3b3JyeSBhYm91dCAkUEFUSCBvciAtYQorCisgIGlmIChzdHJjaHIoZmlsZW5hbWUsICcvJykpIHsKKyAgICAvLyBDb25maXJtIGl0IGhhcyB0aGUgZXhlY3V0YWJsZSBiaXQgc2V0LCBhbmQgaXQncyBub3QgYSBkaXJlY3RvcnkuCisgICAgaWYgKCFhY2Nlc3MoZmlsZW5hbWUsIFhfT0spKSB7CisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgICAgaWYgKCFzdGF0KGZpbGVuYW1lLCAmc3QpICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgcHV0cyhmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgLy8gU2VhcmNoICRQQVRIIGZvciBtYXRjaGVzLgorICBsaXN0ID0gZmluZF9pbl9wYXRoKGdldGVudigiUEFUSCIpLCBmaWxlbmFtZSk7CisgIGlmICghbGlzdCkgcmV0dXJuIDE7CisKKyAgLy8gUHJpbnQgb3V0IG1hdGNoZXMKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBpZiAoIWFjY2VzcyhsaXN0LT5zdHIsIFhfT0spKSB7CisgICAgICBwdXRzKGxpc3QtPnN0cik7CisgICAgICAvLyBJZiB3ZSBzaG91bGQgc3RvcCBhdCBvbmUgbWF0Y2gsIGRvIHNvCisgICAgICBpZiAoIXRveXMub3B0ZmxhZ3MpIHsKKyAgICAgICAgbGxpc3RfdHJhdmVyc2UobGlzdCwgZnJlZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBmcmVlKGxsaXN0X3BvcCgmbGlzdCkpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgd2hpY2hfbWFpbih2b2lkKQoreworICBpbnQgaTsKKworICBmb3IgKGk9MDsgdG95cy5vcHRhcmdzW2ldOyBpKyspCisgICAgdG95cy5leGl0dmFsIHw9IHdoaWNoX2luX3BhdGgodG95cy5vcHRhcmdzW2ldKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL290aGVyL3h4ZC5jIGIvdG95Ym94L3RveXMvb3RoZXIveHhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkZTJlZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL290aGVyL3h4ZC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiB4eGQuYyAtIGhleGR1bXAuCisgKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIE5vIG9idmlvdXMgc3RhbmRhcmQsIG91dHB1dCBsb29rcyBsaWtlOgorICogMDAwMDAwMDogNGM2OSA2ZTc1IDc4MjAgNzY2NSA3MjczIDY5NmYgNmUyMCAzMzJlICBMaW51eCB2ZXJzaW9uIDMuCisKK1VTRV9YWEQoTkVXVE9ZKHh4ZCwgIj4xYyM8MT40MDk2PTE2bCNnIzwxPTJwcnMjWyFyc10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBYWEQKKyAgYm9vbCAieHhkIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB4eGQgWy1jIG5dIFstZyBuXSBbLWwgbl0gWy1wXSBbLXJdIFstcyBuXSBbZmlsZV0KKworICAgIEhleGR1bXAgYSBmaWxlIHRvIHN0ZG91dC4gIElmIG5vIGZpbGUgaXMgbGlzdGVkLCBjb3B5IGZyb20gc3RkaW4uCisgICAgRmlsZW5hbWUgIi0iIGlzIGEgc3lub255bSBmb3Igc3RkaW4uCisKKyAgICAtYyBuCVNob3cgbiBieXRlcyBwZXIgbGluZSAoZGVmYXVsdCAxNikuCisgICAgLWcgbglHcm91cCBieXRlcyBieSBhZGRpbmcgYSAnICcgZXZlcnkgbiBieXRlcyAoZGVmYXVsdCAyKS4KKyAgICAtbCBuCUxpbWl0IG9mIG4gYnl0ZXMgYmVmb3JlIHN0b3BwaW5nIChkZWZhdWx0IGlzIG5vIGxpbWl0KS4KKyAgICAtcAlQbGFpbiBoZXhkdW1wICgzMCBieXRlcy9saW5lLCBubyBncm91cGluZykuCisgICAgLXIJUmV2ZXJzZSBvcGVyYXRpb246IHR1cm4gYSBoZXhkdW1wIGludG8gYSBiaW5hcnkgZmlsZS4KKyAgICAtcyBuCVNraXAgdG8gb2Zmc2V0IG4uCisqLworCisjZGVmaW5lIEZPUl94eGQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgczsKKyAgbG9uZyBnOworICBsb25nIGw7CisgIGxvbmcgYzsKKykKKworc3RhdGljIHZvaWQgZG9feHhkKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgbG9uZyBsb25nIHBvcyA9IDA7CisgIGxvbmcgbG9uZyBsaW1pdCA9IFRULmw7CisgIGludCBpLCBsZW4sIHNwYWNlOworCisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfcykgeworICAgIHhsc2VlayhmZCwgVFQucywgU0VFS19TRVQpOworICAgIHBvcyA9IFRULnM7CisgICAgaWYgKGxpbWl0KSBsaW1pdCArPSBUVC5zOworICB9CisKKyAgd2hpbGUgKDA8KGxlbiA9IHJlYWRhbGwoZmQsIHRveWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbWl0ICYmIGxpbWl0LXBvczxUVC5jKT9saW1pdC1wb3M6VFQuYykpKSB7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3ApKSBwcmludGYoIiUwOGxseDogIiwgcG9zKTsKKyAgICBwb3MgKz0gbGVuOworICAgIHNwYWNlID0gMipUVC5jK1RULmMvVFQuZysxOworCisgICAgZm9yIChpPTA7IGk8bGVuOykgeworICAgICAgc3BhY2UgLT0gcHJpbnRmKCIlMDJ4IiwgdG95YnVmW2ldKTsKKyAgICAgIGlmICghKCsraSVUVC5nKSkgeworICAgICAgICBwdXRjaGFyKCcgJyk7CisgICAgICAgIHNwYWNlLS07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3ApKSB7CisgICAgICBwcmludGYoIiUqcyIsIHNwYWNlLCAiIik7CisgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKKyAgICAgICAgcHV0Y2hhcigodG95YnVmW2ldPj0nICcgJiYgdG95YnVmW2ldPD0nficpID8gdG95YnVmW2ldIDogJy4nKTsKKyAgICB9CisgICAgcHV0Y2hhcignXG4nKTsKKyAgfQorICBpZiAobGVuPDApIHBlcnJvcl9leGl0KCJyZWFkIik7Cit9CisKK3N0YXRpYyBpbnQgZGVoZXgoY2hhciBjaCkKK3sKKyAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHJldHVybiBjaCAtICcwJzsKKyAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiBjaCAtICdhJyArIDEwOworICBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgIHJldHVybiAoY2ggPT0gJ1xuJykgPyAtMiA6IC0xOworfQorCitzdGF0aWMgdm9pZCBkb194eGRfcmV2ZXJzZShpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIEZJTEUgKmZwID0geGZkb3BlbihmZCwgInIiKTsKKworICB3aGlsZSAoIWZlb2YoZnApKSB7CisgICAgaW50IGNvbCA9IDA7CisgICAgaW50IHRtcDsKKworICAgIC8vIEVhY2ggbGluZSBvZiBhIG5vbi1wbGFpbiBoZXhkdW1wIHN0YXJ0cyB3aXRoIGFuIG9mZnNldC9hZGRyZXNzLgorICAgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19wKSkgeworICAgICAgbG9uZyBsb25nIHBvczsKKworICAgICAgaWYgKGZzY2FuZihmcCwgIiVsbHg6ICIsICZwb3MpID09IDEpIHsKKyAgICAgICAgaWYgKGZzZWVrKHN0ZG91dCwgcG9zLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAgIC8vIFRPRE86IGp1c3Qgd3JpdGUgb3V0IHplcm9zIGlmIG5vbi1zZWVrYWJsZT8KKyAgICAgICAgICBwZXJyb3JfZXhpdCgiJXM6IHNlZWsgZmFpbGVkIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHBsYWluIGhleGR1bXAgY2FuIGhhdmUgYXMgbWFueSBieXRlcyBwZXIgbGluZSBhcyB5b3UgbGlrZSwKKyAgICAvLyBidXQgYSBub24tcGxhaW4gaGV4ZHVtcCBhc3N1bWVzIGdhcmJhZ2UgYWZ0ZXIgaXQncyBzZWVuIHRoZQorICAgIC8vIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCisgICAgd2hpbGUgKHRveXMub3B0ZmxhZ3MmRkxBR19wIHx8IGNvbCA8IFRULmMpIHsKKyAgICAgIGludCBuMSwgbjI7CisKKyAgICAgIC8vIElmIHdlJ3JlIGF0IEVPRiBvciBFT0wgb3Igd2UgcmVhZCBzb21lIG5vbi1oZXguLi4KKyAgICAgIGlmICgobjEgPSBuMiA9IGRlaGV4KGZnZXRjKGZwKSkpIDwgMCB8fCAobjIgPSBkZWhleChmZ2V0YyhmcCkpKSA8IDApIHsKKyAgICAgICAgLy8gSWYgd2UncmUgYXQgRU9MLCBzdGFydCBvbiB0aGF0IGxpbmUuCisgICAgICAgIGlmIChuMSA9PSAtMiB8fCBuMiA9PSAtMikgY29udGludWU7CisgICAgICAgIC8vIE90aGVyd2lzZSwgc2tpcCB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZnB1dGMoKG4xIDw8IDQpIHwgKG4yICYgMHhmKSwgc3Rkb3V0KTsKKyAgICAgIGNvbCsrOworCisgICAgICAvLyBJcyB0aGVyZSBhbnkgZ3JvdXBpbmcgZ29pbmcgb24/IElnbm9yZSBhIHNpbmdsZSBzcGFjZS4KKyAgICAgIHRtcCA9IGZnZXRjKGZwKTsKKyAgICAgIGlmICh0bXAgIT0gJyAnKSB1bmdldGModG1wLCBmcCk7CisgICAgfQorCisgICAgLy8gU2tpcCBhbnl0aGluZyBlbHNlIG9uIHRoaXMgbGluZSAoc3VjaCBhcyB0aGUgQVNDSUkgZHVtcCkuCisgICAgd2hpbGUgKCh0bXAgPSBmZ2V0YyhmcCkpICE9IEVPRiAmJiB0bXAgIT0gJ1xuJykKKyAgICAgIDsKKyAgfQorICBpZiAoZmVycm9yKGZwKSkgcGVycm9yX21zZ19yYXcobmFtZSk7CisKKyAgZmNsb3NlKGZwKTsKK30KKwordm9pZCB4eGRfbWFpbih2b2lkKQoreworICAvLyBQbGFpbiBzdHlsZSBpcyAzMCBieXRlcy9saW5lLCBubyBncm91cGluZy4KKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19wKSBUVC5jID0gVFQuZyA9IDMwOworCisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIHRveXMub3B0ZmxhZ3MmRkxBR19yID8gZG9feHhkX3JldmVyc2UgOiBkb194eGQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvb3RoZXIveWVzLmMgYi90b3lib3gvdG95cy9vdGhlci95ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNhNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvb3RoZXIveWVzLmMKQEAgLTAsMCArMSwyOSBAQAorLyogeWVzLmMgLSBSZXBlYXRlZGx5IG91dHB1dCBhIHN0cmluZy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCitVU0VfWUVTKE5FV1RPWSh5ZXMsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFlFUworICBib29sICJ5ZXMiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHllcyBbYXJncy4uLl0KKworICAgIFJlcGVhdGVkbHkgb3V0cHV0IGxpbmUgdW50aWwga2lsbGVkLiBJZiBubyBhcmdzLCBvdXRwdXQgJ3knLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB5ZXNfbWFpbih2b2lkKQoreworICBmb3IgKDs7KSB7CisgICAgaW50IGk7CisgICAgZm9yIChpPTA7IHRveXMub3B0YXJnc1tpXTsgaSsrKSB7CisgICAgICBpZiAoaSkgeHB1dGMoJyAnKTsKKyAgICAgIHhwcmludGYoIiVzIiwgdG95cy5vcHRhcmdzW2ldKTsKKyAgICB9CisgICAgaWYgKCFpKSB4cHV0YygneScpOworICAgIHhwdXRjKCdcbicpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL1JFQURNRSBiL3RveWJveC90b3lzL3BlbmRpbmcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjgzZTEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL1JFQURNRQpAQCAtMCwwICsxLDE1IEBACitwZW5kaW5nIChzZWUgdG95cy9wZW5kaW5nL1JFQURNRSkKKworQ29tbWFuZHMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGV4dGVybmFsIHN1Ym1pc3Npb25zIGF3YWl0aW5nIHJldmlldyBhbmQvb3IKK2NsZWFudXAgYmVmb3JlIGJlaW5nICJwcm9tb3RlZCIgdG8gb25lIG9mIHRoZSBvdGhlciBkaXJlY3Rvcmllcy4KKworQ29kZSBpbiB0aGlzIGRpcmVjdG9yeSBtYXkgb3IgbWF5IG5vdCB3b3JrLCBzb21lIG9mIHRoZSBjb21tYW5kcyBoZXJlIGFyZQordW5maW5pc2hlZCBzdHVicywgb3RoZXJzIGp1c3QgbmVlZCBhIG1vcmUgdGhvcm91Z2ggaW5zcGVjdGlvbiB0aGFuIHdlJ3ZlIGhhZAordGltZSBmb3IgeWV0LiBFdmVyeXRoaW5nIGluIGhlcmUgZGVmYXVsdHMgdG8gIm4iIGluIGRlZmNvbmZpZy4KKworT3V0c2lkZSBvZiB0aGlzIGRpcmVjdG9yeSwgc2V2ZXJhbCBjb21tYW5kcyAoYW5kIHNvbWUgbGlicmFyeSBjb2RlKSBoYXZlCitUT0RPIGFubm90YXRpb25zLgorCitUaGlzIGRpcmVjdG9yeSBzaG91bGQgZ28gYXdheSBiZWZvcmUgdGhlIDEuMCByZWxlYXNlLiBJdCdzIGp1c3QgYSBzdGFnaW5nCithcmVhIHNvIGNvZGUgc3VibWlzc2lvbnMgZG9uJ3QgZ2V0IGxvc3Qgd2hpbGUgYXdhaXRpbmcgbW9yZSB0aG9yb3VnaCAoYW5kCit2ZXJ5IHRpbWUgY29uc3VtaW5nKSBzY3J1dGlueSBhcyBkZXNjcmliZWQgaW4gd3d3L2NsZWFudXAuaHRtbC4KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvYXJwLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTdjM2MKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2FycC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiBhcnAuYyAtIG1hbmlwdWxhdGUgdGhlIHN5c3RlbSBBUlAgY2FjaGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxNCBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdhbWlsLmNvbT4KKyAqIE5vIFN0YW5kYXJkIAorCitVU0VfQVJQKE5FV1RPWShhcnAsICJ2aTpuRHNkYXA6QTpIOlsrQXBdWyFzZF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBBUlAKKyAgYm9vbCAiYXJwIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIFVzYWdlOiBhcnAgCisgICAgWy12bl0gWy1IIEhXVFlQRV0gWy1pIElGXSAtYSBbSE9TVE5BTUVdCisgICAgWy12XSAgICAgICAgICAgICAgWy1pIElGXSAtZCBIT1NUTkFNRSBbcHViXQorICAgIFstdl0gIFstSCBIV1RZUEVdIFstaSBJRl0gLXMgSE9TVE5BTUUgSFdBRERSIFt0ZW1wXQorICAgIFstdl0gIFstSCBIV1RZUEVdIFstaSBJRl0gLXMgSE9TVE5BTUUgSFdBRERSIFtuZXRtYXNrIE1BU0tdIHB1YgorICAgIFstdl0gIFstSCBIV1RZUEVdIFstaSBJRl0gLURzIEhPU1ROQU1FIElGQUNFIFtuZXRtYXNrIE1BU0tdIHB1YgorCisgICAgTWFuaXB1bGF0ZSBBUlAgY2FjaGUKKworICAgIC1hICAgIERpc3BsYXkgKGFsbCkgaG9zdHMKKyAgICAtcyAgICBTZXQgbmV3IEFSUCBlbnRyeQorICAgIC1kICAgIERlbGV0ZSBhIHNwZWNpZmllZCBlbnRyeQorICAgIC12ICAgIFZlcmJvc2UKKyAgICAtbiAgICBEb24ndCByZXNvbHZlIG5hbWVzCisgICAgLWkgSUYgTmV0d29yayBpbnRlcmZhY2UKKyAgICAtRCAgICBSZWFkIDxod2FkZHI+IGZyb20gZ2l2ZW4gZGV2aWNlCisgICAgLUEsLXAgQUYgIFByb3RvY29sIGZhbWlseQorICAgIC1IICAgIEhXVFlQRSBIYXJkd2FyZSBhZGRyZXNzIHR5cGUKKworKi8KKworI2RlZmluZSBGT1JfYXJwCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKworR0xPQkFMUygKKyAgICBjaGFyICpod190eXBlOworICAgIGNoYXIgKmFmX3R5cGVfQTsKKyAgICBjaGFyICphZl90eXBlX3A7CisgICAgY2hhciAqaW50ZXJmYWNlOworICAgIAorICAgIGludCBzb2NrZmQ7CisgICAgY2hhciAqZGV2aWNlOworKQorCitzdHJ1Y3QgYXJwcmVxIHJlcTsgLy9HbG9iYWwgcmVxdWVzdCBzdHJ1Y3R1cmUgCisKK3N0cnVjdCB0eXBlIHsKKyAgY2hhciAqbmFtZTsKKyAgaW50IHZhbDsKK307CisKK3N0cnVjdCB0eXBlIGh3dHlwZVtdID0geworICB7ImV0aGVyIiwgQVJQSFJEX0VUSEVSIH0sIAorICB7Imxvb3AiICxBUlBIUkRfTE9PUEJBQ0t9LAorICB7InBwcCIgLEFSUEhSRF9QUFB9LAorICB7ImluZmluaWJhbmQiICxBUlBIUkRfSU5GSU5JQkFORH0sCisgIHtOVUxMLCAtMX0sCit9OworCitzdHJ1Y3QgdHlwZSBhZnR5cGVbXSA9IHsKKyAgeyJpbmV0IiwgQUZfSU5FVCB9LCAKKyAgeyJpbmV0NiIgLEFGX0lORVQ2fSwKKyAgeyJ1bnNwZWMiICxBRl9VTlNQRUN9LAorICB7TlVMTCwgLTF9LAorfTsKKworc3RydWN0IHR5cGUgZmxhZ190eXBlW10gPSB7CisgIHsiUEVSTSIsIEFURl9QRVJNIH0sIAorICB7IlBVQiIgLEFURl9QVUJMfSwKKyAgeyJET05UUFVCIiAsQVRGX0RPTlRQVUJ9LAorICB7IlRSQUlMIiAsQVRGX1VTRVRSQUlMRVJTfSwKKyAge05VTEwsIC0xfSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2luZGV4KHN0cnVjdCB0eXBlIGFycltdLCBjaGFyICpuYW1lKQoreworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7IGFycltpXS5uYW1lOyBpKyspIAorICAgIGlmICghc3RyY21wKGFycltpXS5uYW1lLCBuYW1lKSkgYnJlYWs7CisgIHJldHVybiBhcnJbaV0udmFsOworfQorCisKK3ZvaWQgZ2V0X2h3X2FkZChjaGFyICpod19hZGRyLCBjaGFyICpwdHIpIAoreworICBjaGFyICpwID0gcHRyLCAqaHcgPSBod19hZGRyOworCisgIHdoaWxlICgqaHdfYWRkciAmJiAocC1wdHIpIDwgNikgeworICAgIGludCB2YWwsIGxlbiA9IDA7CisKKyAgICBpZiAoKmh3X2FkZHIgPT0gJzonKSBod19hZGRyKys7CisgICAgc3NjYW5mKGh3X2FkZHIsICIlMnglbiIsICZ2YWwsICZsZW4pOworICAgIGlmICghbGVuIHx8IGxlbiA+IDIpIGJyZWFrOworICAgIGh3X2FkZHIgKz0gbGVuOworICAgICpwKysgPSB2YWw7CisgIH0KKworICBpZiAoKHAtcHRyKSAhPSA2IHx8ICpod19hZGRyKQorICAgIGVycm9yX2V4aXQoImJhZCBodyBhZGRyICclcyciLCBodyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmVfaG9zdChjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMgPSBOVUxMOworICBpbnQgcmV0OworCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZiBoaW50cyk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGlmICgocmV0ID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgJmhpbnRzLCAmcmVzKSkpIAorICAgIHBlcnJvcl9leGl0KCIlcyIsIGdhaV9zdHJlcnJvcihyZXQpKTsKKworICBtZW1jcHkoc2EsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKKyAgZnJlZWFkZHJpbmZvKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2ZsYWdzKGludCAqaSwgY2hhcioqIGFyZ3YpCit7CisgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgaW50IGZsYWcgPSAqaSwgajsKKyAgc3RydWN0IGZsYWdzIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBvciwgZmxhZzsKKyAgfSBmW10gPSB7CisgICAgeyJwdWIiLCAgMSAsQVRGX1BVQkx9LAorICAgIHsicHJpdiIsIDAgLH5BVEZfUFVCTH0sCisgICAgeyJ0cmFpbCIsIDEsIEFURl9VU0VUUkFJTEVSU30sCisgICAgeyJ0ZW1wIiwgMCwgfkFURl9QRVJNfSwKKyAgICB7ImRvbnRwdWIiLDEsIEFURl9ET05UUFVCfSwKKyAgfTsKKyAgCisgIGZvciAoOyphcmd2OyBhcmd2KyspIHsKKyAgICBmb3IgKGogPSAwOyAgaiA8IEFSUkFZX0xFTihmKTsgaisrKSB7IAorICAgICAgaWYgKCFzdHJjbXAoKmFyZ3YsIGZbal0ubmFtZSkpIHsKKyAgICAgICAgKGZbal0ub3IpID8oZmxhZyB8PSBmW2pdLmZsYWcpOihmbGFnICY9IGZbal0uZmxhZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaiA+IDQgJiYgIXN0cmNtcCgqYXJndiwgIm5ldG1hc2siKSkgeworICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJOVUxMIG5ldG1hc2siKTsKKyAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICIyNTUuMjU1LjI1NS4yNTUiKSkgeworICAgICAgICByZXNvbHZlX2hvc3QodG95cy5vcHRhcmdzWzBdLCAmc2EpOworICAgICAgICBtZW1jcHkoJnJlcS5hcnBfbmV0bWFzaywgJnNhLCBzaXplb2Yoc2EpKTsKKyAgICAgICAgZmxhZyB8PSBBVEZfTkVUTUFTSzsKKyAgICAgIH0gZWxzZSBhcmd2Kys7IAorICAgIH0gZWxzZSBpZiAoaiA+IDQgJiYgIXN0cmNtcCgqYXJndiwgImRldiIpKSB7CisgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoIk5VTEwgZGV2Iik7CisgICAgICBUVC5kZXZpY2UgPSAqYXJndjsKKyAgICB9IGVsc2UgaWYgKGogPiA0KSBlcnJvcl9leGl0KCJpbnZhbGlkIGFyZyIpOworICB9CisgICppID0gZmxhZzsKK30KKworc3RhdGljIGludCBzZXRfZW50cnkodm9pZCkgCit7CisgIGludCBmbGFncyA9IDA7CisgIAorICBpZiAoIXRveXMub3B0YXJnc1sxXSkgZXJyb3JfZXhpdCgiYmFkIHN5bnRheCIpOworCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpKSBnZXRfaHdfYWRkKHRveXMub3B0YXJnc1sxXSwgKGNoYXIqKSZyZXEuYXJwX2hhLnNhX2RhdGEpOworICBlbHNlIHsKKyAgICBzdHJ1Y3QgaWZyZXEgaWZyZTsKKworICAgIHhzdHJuY3B5KGlmcmUuaWZyX25hbWUsIHRveXMub3B0YXJnc1sxXSwgSUZOQU1TSVopOworICAgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZIV0FERFIsICZpZnJlKTsKKyAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0gpICYmIChpZnJlLmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikpIAorICAgICAgZXJyb3JfZXhpdCgicHJvdG9jb2wgdHlwZSBtaXNtYXRjaCIpOworICAgIG1lbWNweSgmcmVxLmFycF9oYSwgJihpZnJlLmlmcl9od2FkZHIpLCBzaXplb2YocmVxLmFycF9oYSkpOworICB9CisKKyAgZmxhZ3MgPSBBVEZfUEVSTSB8IEFURl9DT007CisgIGlmICh0b3lzLm9wdGFyZ3NbMl0pIGNoZWNrX2ZsYWdzKCZmbGFncywgKHRveXMub3B0YXJncysyKSk7CisgIHJlcS5hcnBfZmxhZ3MgPSBmbGFnczsKKyAgeHN0cm5jcHkocmVxLmFycF9kZXYsIFRULmRldmljZSwgc2l6ZW9mKHJlcS5hcnBfZGV2KSk7CisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NTQVJQLCAmcmVxKTsKKyAgCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB4cHJpbnRmKCJFbnRyeSBzZXQgZm9yICVzXG4iLCB0b3lzLm9wdGFyZ3NbMF0pOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcF90b19ob3N0KHN0cnVjdCBzb2NrYWRkciAqc2EsIGludCBmbGFnKSAKK3sKKyAgaW50IHN0YXR1cyA9IDA7CisgIGNoYXIgaGJ1ZltOSV9NQVhIT1NUXSA9IHswLH0sIHNidWZbTklfTUFYU0VSVl0gPSB7MCx9OyAKKyAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgCisgICp0b3lidWYgPSAwOworICBpZiAoIShzdGF0dXMgPSBnZXRuYW1laW5mbyhzYSwgbGVuLCBoYnVmLCBzaXplb2YoaGJ1ZiksIHNidWYsIAorICAgICAgICAgIHNpemVvZihzYnVmKSwgZmxhZykpKSB7CisgICAgc3RyY3B5KHRveWJ1ZiwgaGJ1Zik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX2VudHJ5KHZvaWQpCit7CisgIGludCBmbGFnczsKKyAgCisgIGZsYWdzID0gQVRGX1BFUk07CisgIGlmICh0b3lzLm9wdGFyZ3NbMV0pIGNoZWNrX2ZsYWdzKCZmbGFncywgKHRveXMub3B0YXJncysxKSk7CisgIHJlcS5hcnBfZmxhZ3MgPSBmbGFnczsKKyAgeHN0cm5jcHkocmVxLmFycF9kZXYsIFRULmRldmljZSwgc2l6ZW9mKHJlcS5hcnBfZGV2KSk7CisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NEQVJQLCAmcmVxKTsKKyAgCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB4cHJpbnRmKCJEZWxldGUgZW50cnkgZm9yICAlc1xuIiwgdG95cy5vcHRhcmdzWzBdKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXJwX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHNvY2thZGRyIHNhOworICBjaGFyIGlwWzEyOF0sIGh3X2FkZHJbMTI4XSwgbWFza1sxMl0sIGRldlsxMjhdLCAqaG9zdF9pcCA9IE5VTEwsICpidWY7CisgIGludCBoX3R5cGUsIHR5cGUsIGZsYWcsIGksIGZkLCBlbnRyaWVzID0gMCwgZGlzcCA9IDA7CisKKyAgVFQuZGV2aWNlID0gIiI7CisgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworICBUVC5zb2NrZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKworICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0EpIHx8ICh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSkgeworICAgIGlmICgodHlwZSA9IGdldF9pbmRleChhZnR5cGUsIAorICAgICAgICAgICAgKFRULmFmX3R5cGVfQSk/VFQuYWZfdHlwZV9BOlRULmFmX3R5cGVfcCkpICE9IEFGX0lORVQpIAorICAgICAgZXJyb3JfZXhpdCgodHlwZSAhPSAtMSk/Im9ubHkgaW5ldCBzdXBwb3J0ZWQgYnkga2VybmVsIjoidW5rbm93biBmYW1pbHkiKTsKKyAgfSAKKworICByZXEuYXJwX2hhLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0gpIHsKKyAgICBpZiAoKHR5cGUgPSBnZXRfaW5kZXgoaHd0eXBlLCBUVC5od190eXBlKSkgIT0gQVJQSFJEX0VUSEVSKSAKKyAgICAgIGVycm9yX2V4aXQoKHR5cGUgIT0gLTEpPyJoL3cgdHlwZSBub3Qgc3VwcG9ydGVkIjoidW5rbm93biBoL3cgdHlwZSIpOworICAgIHJlcS5hcnBfaGEuc2FfZmFtaWx5ID0gdHlwZTsKKyAgfQorCisgIGlmICgoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHx8IHRveXMub3B0ZmxhZ3MgJiBGTEFHX2QpKSB7IAorICAgIGlmICghdG95cy5vcHRhcmdzWzBdKSBlcnJvcl9leGl0KCJob3N0IG5hbWUgcmVxIik7CisgICAgcmVzb2x2ZV9ob3N0KHRveXMub3B0YXJnc1swXSwgJnNhKTsKKyAgICBtZW1jcHkoJnJlcS5hcnBfcGEsICZzYSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworICB9CisKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSAmJiAhc2V0X2VudHJ5KCkpIHJldHVybjsKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSAmJiAhZGVsZXRlX2VudHJ5KCkpIHJldHVybjsgCisKKyAgLy9zaG93IGFycCBjaGFjaGUKKyAgZmQgPSB4b3BlbnJvKCIvcHJvYy9uZXQvYXJwIik7CisgIGJ1ZiA9IGdldF9saW5lKGZkKTsKKyAgZnJlZShidWYpOyAvL3NraXAgZmlyc3QgbGluZQorCisgIGlmICh0b3lzLm9wdGFyZ3NbMF0pIHsKKyAgICByZXNvbHZlX2hvc3QodG95cy5vcHRhcmdzWzBdLCAmc2EpOworICAgIGlwX3RvX2hvc3QoJnNhLCBOSV9OVU1FUklDSE9TVCk7CisgICAgaG9zdF9pcCA9IHhzdHJkdXAodG95YnVmKTsKKyAgfQorCisgIHdoaWxlICgoYnVmID0gZ2V0X2xpbmUoZmQpKSkgeworICAgIGNoYXIgKmhvc3RfbmFtZSA9ICI/IjsKKyAgICAKKyAgICBpZiAoKHNzY2FuZihidWYsICIlcyAweCV4IDB4JXggJXMgJXMgJXNcbiIsIGlwLAorICAgICAgICAmaF90eXBlLCAmZmxhZywgaHdfYWRkciwgbWFzaywgZGV2ICkpICE9IDYpIGJyZWFrOworICAgIGVudHJpZXMrKzsKKyAgICBpZiAoKCh0b3lzLm9wdGZsYWdzICYgRkxBR19IKSAmJiAoZ2V0X2luZGV4KGh3dHlwZSwgVFQuaHdfdHlwZSkgIT0gaF90eXBlKSkKKyAgICAgfHwgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19pKSAmJiBzdHJjbXAoVFQuaW50ZXJmYWNlLCBkZXYpKQorICAgICB8fCAodG95cy5vcHRhcmdzWzBdICYmIHN0cmNtcChob3N0X2lwLCBpcCkpKSB7CisgICAgICBmcmVlKGJ1Zik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICByZXNvbHZlX2hvc3QoYnVmLCAmc2EpOworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSB7IAorICAgICAgaWYgKCFpcF90b19ob3N0KCZzYSwgTklfTkFNRVJFUUQpKSBob3N0X25hbWUgPSB0b3lidWY7CisgICAgfSBlbHNlIGlwX3RvX2hvc3QoJnNhLCBOSV9OVU1FUklDSE9TVCk7CisgICAgCisgICAgZGlzcCsrOworICAgIHByaW50ZigiJXMgKCVzKSBhdCIgLCBob3N0X25hbWUsIGlwKTsKKworICAgIGZvciAoaSA9IDA7IGh3dHlwZVtpXS5uYW1lOyBpKyspIAorICAgICAgaWYgKGh3dHlwZVtpXS52YWwgJiBoX3R5cGUpIGJyZWFrOworICAgIGlmICghaHd0eXBlW2ldLm5hbWUpIGVycm9yX2V4aXQoInVua25vd24gaC93IHR5cGUiKTsKKworICAgIGlmICghKGZsYWcgJiBBVEZfQ09NKSkgeworICAgICAgaWYgKChmbGFnICYgQVRGX1BVQkwpKSBwcmludGYoIiAqIik7CisgICAgICBlbHNlIHByaW50ZigiIDxpbmNvbXBsZXRlPiIpOworICAgIH0gZWxzZSBwcmludGYoIiAlcyBbJXNdIiwgaHdfYWRkciwgaHd0eXBlW2ldLm5hbWUpOworCisgICAgaWYgKGZsYWcgJiBBVEZfTkVUTUFTSykgcHJpbnRmKCJuZXRtYXNrICVzICIsIG1hc2spOworCisgICAgZm9yIChpID0gMDsgZmxhZ190eXBlW2ldLm5hbWU7IGkrKykgCisgICAgICBpZiAoZmxhZ190eXBlW2ldLnZhbCAmIGZsYWcpIHByaW50ZigiICVzIiwgZmxhZ190eXBlW2ldLm5hbWUpOworCisgICAgcHJpbnRmKCIgb24gJXNcbiIsIGRldik7CisgICAgZnJlZShidWYpOworICB9CisgIAorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgCisgICAgeHByaW50ZigiRW50cmllczogJWRcdFNraXBwZWQ6ICVkXHRGb3VuZDogJWRcbiIsCisgICAgICAgIGVudHJpZXMsIGVudHJpZXMgLSBkaXNwLCBkaXNwKTsKKyAgaWYgKCFkaXNwKSB4cHJpbnRmKCJObyBNYXRjaCBmb3VuZCBpbiAlZCBlbnRyaWVzXG4iLCBlbnRyaWVzKTsKKyAgCisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHsKKyAgICBmcmVlKGhvc3RfaXApOworICAgIGZyZWUoYnVmKTsKKyAgICB4Y2xvc2UoZmQpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2FycGluZy5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9hcnBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQzY2FiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9hcnBpbmcuYwpAQCAtMCwwICsxLDI5MiBAQAorLyogYXJwaW5nIC0gc2VuZCBBUlAgUkVRVUVTVCB0byBhIG5laWdoYm91ciBob3N0LgorICoKKyAqIENvcHlyaWdodCAyMDEzIFNhbmRlZXAgU2hhcm1hIDxzYW5kZWVwLmphY2syNzU2QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkLgorCitVU0VfQVJQSU5HKE5FV1RPWShhcnBpbmcsICI8MT4xczpJOncjPDBjIzwwQVVEYnFmWytBVV1bK0RmXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBBUlBJTkcKKyAgYm9vbCAiYXJwaW5nIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBhcnBpbmcgWy1mcWJEVUFdIFstYyBDTlRdIFstdyBUSU1FT1VUXSBbLUkgSUZBQ0VdIFstcyBTUkNfSVBdIERTVF9JUAorCisgICAgU2VuZCBBUlAgcmVxdWVzdHMvcmVwbGllcworCisgICAgLWYgICAgICAgICBRdWl0IG9uIGZpcnN0IEFSUCByZXBseQorICAgIC1xICAgICAgICAgUXVpZXQKKyAgICAtYiAgICAgICAgIEtlZXAgYnJvYWRjYXN0aW5nLCBkb24ndCBnbyB1bmljYXN0CisgICAgLUQgICAgICAgICBEdXBsaWNhdGVkIGFkZHJlc3MgZGV0ZWN0aW9uIG1vZGUKKyAgICAtVSAgICAgICAgIFVuc29saWNpdGVkIEFSUCBtb2RlLCB1cGRhdGUgeW91ciBuZWlnaGJvcnMKKyAgICAtQSAgICAgICAgIEFSUCBhbnN3ZXIgbW9kZSwgdXBkYXRlIHlvdXIgbmVpZ2hib3JzCisgICAgLWMgTiAgICAgICBTdG9wIGFmdGVyIHNlbmRpbmcgTiBBUlAgcmVxdWVzdHMKKyAgICAtdyBUSU1FT1VUIFRpbWUgdG8gd2FpdCBmb3IgQVJQIHJlcGx5LCBzZWNvbmRzCisgICAgLUkgSUZBQ0UgICBJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApCisgICAgLXMgU1JDX0lQICBTZW5kZXIgSVAgYWRkcmVzcworICAgIERTVF9JUCAgICAgVGFyZ2V0IElQIGFkZHJlc3MKKyovCisjZGVmaW5lIEZPUl9hcnBpbmcKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKworR0xPQkFMUygKKyAgICBsb25nIGNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgdGltZV9vdXQ7CisgICAgY2hhciAqaWZhY2U7CisgICAgY2hhciAqc3JjX2lwOworCisgICAgaW50IHNvY2tmZDsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisgICAgdW5zaWduZWQgc2VudF9hdCwgc2VudF9uciwgcmN2ZF9uciwgYnJkX3NlbnQsIHJjdmRfcmVxLCBicmRfcmN2LAorICAgICAgICAgICAgIHVuaWNhc3RfZmxhZzsKKykKKworc3RydWN0IHNvY2thZGRyX2xsIHNyY19waywgZHN0X3BrOyAKK3N0cnVjdCBpbl9hZGRyIHNyY19hZGRyLCBkZXN0X2FkZHI7CitleHRlcm4gdm9pZCAqbWVtcGNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKKworLy8gR2V0cyBpbmZvcm1hdGlvbiBvZiBJTlRFUkZBQ0UgYW5kIHVwZGF0ZXMgSUZJTkRFWCwgTUFDIGFuZCBJUC4KK3N0YXRpYyB2b2lkIGdldF9pbnRlcmZhY2UoY2hhciAqaW50ZXJmYWNlLCBpbnQgKmlmaW5kZXgsIHVpbnQzMl90ICpvaXAsIAorICAgIHVpbnQ4X3QgKm1hYykKK3sKKyAgc3RydWN0IGlmcmVxIHJlcTsKKyAgc3RydWN0IHNvY2thZGRyX2luICppcDsKKyAgaW50IGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworCisgIHJlcS5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworICB4c3RybmNweShyZXEuaWZyX25hbWUsIGludGVyZmFjZSwgSUZOQU1TSVopOworICByZXEuaWZyX25hbWVbSUZOQU1TSVotMV0gPSAnXDAnOworCisgIHhpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmcmVxKTsKKyAgaWYgKCEocmVxLmlmcl9mbGFncyAmIElGRl9VUCkpIHJldHVybjsKKworICBpZiAob2lwKSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGQUREUiwgJnJlcSk7CisgICAgaXAgPSAoc3RydWN0IHNvY2thZGRyX2luKikgJnJlcS5pZnJfYWRkcjsKKyAgICAqb2lwID0gbnRvaGwoaXAtPnNpbl9hZGRyLnNfYWRkcik7CisgIH0KKyAgaWYgKGlmaW5kZXgpIHsKKyAgICB4aW9jdGwoZmQsIFNJT0NHSUZJTkRFWCwgJnJlcSk7CisgICAgKmlmaW5kZXggPSByZXEuaWZyX2lmaW5kZXg7CisgIH0KKyAgaWYgKG1hYykgeworICAgIHhpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJnJlcSk7CisgICAgbWVtY3B5KG1hYywgcmVxLmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CisgIH0KKyAgeGNsb3NlKGZkKTsKK30KKworLy8gU0lHSU5UIGhhbmRsZXIsIFByaW50IE51bWJlciBvZiBQYWNrZXRzIHNlbmQgb3IgcmVjZWl2ZSBkZXRhaWxzLgorc3RhdGljIHZvaWQgZG9uZShpbnQgc2lnKQoreworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkgeworICAgIHhwcmludGYoIlNlbnQgJXUgcHJvYmUocykgKCV1IGJyb2FkY2FzdChzKSlcbiIsIFRULnNlbnRfbnIsIFRULmJyZF9zZW50KTsKKyAgICB4cHJpbnRmKCJSZWNlaXZlZCAldSByZXBsJXMgKCV1IHJlcXVlc3QocyksICV1IGJyb2FkY2FzdChzKSlcbiIsIAorICAgICAgICBUVC5yY3ZkX25yLCBUVC5yY3ZkX25yID09IDEgPyAieSI6ImllcyIsIFRULnJjdmRfcmVxLCBUVC5icmRfcmN2KTsKKyAgfQorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRCkgZXhpdCghIVRULnJjdmRfbnIpOworICAvL0luIC1VIG1vZGUsIE5vIHJlcGx5IGlzIGV4cGVjdGVkLgorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfVSkgZXhpdChFWElUX1NVQ0NFU1MpOyAKKyAgZXhpdCghVFQucmN2ZF9ucik7Cit9CisKKy8vIENyZWF0ZSBhbmQgU2VuZCBQYWNrZXQgCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldCgpCit7CisgIGludCByZXQ7CisgIHVuc2lnbmVkIGNoYXIgc2J1ZlsyNTZdID0gezAsfTsKKyAgc3RydWN0IGFycGhkciAqYXJwX2ggPSAoc3RydWN0IGFycGhkciAqKSBzYnVmOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKShhcnBfaCArIDEpOworCisgIGFycF9oLT5hcl9ocmQgPSBodG9ucyhBUlBIUkRfRVRIRVIpOworICBhcnBfaC0+YXJfcHJvID0gaHRvbnMoRVRIX1BfSVApOworICBhcnBfaC0+YXJfaGxuID0gc3JjX3BrLnNsbF9oYWxlbjsKKyAgYXJwX2gtPmFyX3BsbiA9IDQ7ICAKKyAgYXJwX2gtPmFyX29wID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0EpID8gaHRvbnMoQVJQT1BfUkVQTFkpIAorICAgIDogaHRvbnMoQVJQT1BfUkVRVUVTVCk7CisKKyAgcHRyID0gbWVtcGNweShwdHIsICZzcmNfcGsuc2xsX2FkZHIsIHNyY19way5zbGxfaGFsZW4pOworICBwdHIgPSBtZW1wY3B5KHB0ciwgJnNyY19hZGRyLCA0KTsKKyAgcHRyID0gbWVtcGNweShwdHIsCisgICAgICAgICAgICAgICAgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0EpID8gJnNyY19way5zbGxfYWRkciA6ICZkc3RfcGsuc2xsX2FkZHIsCisgICAgICAgICAgICAgICAgc3JjX3BrLnNsbF9oYWxlbik7CisgIHB0ciA9IG1lbXBjcHkocHRyLCAmZGVzdF9hZGRyLCA0KTsKKworICByZXQgPSBzZW5kdG8oVFQuc29ja2ZkLCBzYnVmLCBwdHIgLSBzYnVmLCAwLCAKKyAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZHN0X3BrLCBzaXplb2YoZHN0X3BrKSk7CisgIGlmIChyZXQgPT0gcHRyIC0gc2J1ZikgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisKKyAgICBnZXR0aW1lb2ZkYXkoJnR2YWwsIE5VTEwpOworICAgIFRULnNlbnRfYXQgPSB0dmFsLnR2X3NlYyAqIDEwMDAwMDBVTEwgKyB0dmFsLnR2X3VzZWM7CisgICAgVFQuc2VudF9ucisrOworICAgIGlmICghVFQudW5pY2FzdF9mbGFnKSBUVC5icmRfc2VudCsrOworICB9Cit9CisKKy8vIFJlY2VpdmUgUGFja2V0IGFuZCBmaWx0ZXIgd2l0aCB2YWxpZCBjaGVja3MuCitzdGF0aWMgdm9pZCByZWN2X2Zyb20oc3RydWN0IHNvY2thZGRyX2xsICpmcm9tLCBpbnQgKnJlY3ZfbGVuKQoreworICBzdHJ1Y3QgaW5fYWRkciBzX2lwLCBkX2lwOworICBzdHJ1Y3QgYXJwaGRyICphcnBfaGRyID0gKHN0cnVjdCBhcnBoZHIgKil0b3lidWY7CisgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKShhcnBfaGRyICsgMSk7CisKKyAgaWYgKGFycF9oZHItPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUVVFU1QpICYmIAorICAgICAgYXJwX2hkci0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVQTFkpKSByZXR1cm47IAorCisgIGlmIChmcm9tLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfSE9TVCAmJiBmcm9tLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfQlJPQURDQVNUCisgICAgICAmJiBmcm9tLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfTVVMVElDQVNUKSByZXR1cm47IAorCisgIGlmIChhcnBfaGRyLT5hcl9wcm8gIT0gaHRvbnMoRVRIX1BfSVApIHx8IChhcnBfaGRyLT5hcl9wbG4gIT0gNCkgCisgICAgICB8fCAoYXJwX2hkci0+YXJfaGxuICE9IHNyY19way5zbGxfaGFsZW4pIAorICAgICAgfHwgKCpyZWN2X2xlbiA8IChpbnQpKHNpemVvZigqYXJwX2hkcikgKyAyICogKDQgKyBhcnBfaGRyLT5hcl9obG4pKSkpCisgICAgcmV0dXJuOyAKKworICBtZW1jcHkoJnNfaXAuc19hZGRyLCBwICsgYXJwX2hkci0+YXJfaGxuLCA0KTsKKyAgbWVtY3B5KCZkX2lwLnNfYWRkciwgcCArIGFycF9oZHItPmFyX2hsbiArIDQgKyBhcnBfaGRyLT5hcl9obG4sIDQpOyAKKworICBpZiAoZGVzdF9hZGRyLnNfYWRkciAhPSBzX2lwLnNfYWRkcikgcmV0dXJuOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRCkgeworICAgIGlmIChzcmNfYWRkci5zX2FkZHIgJiYgc3JjX2FkZHIuc19hZGRyICE9IGRfaXAuc19hZGRyKSByZXR1cm47CisgICAgaWYgKCFtZW1jbXAocCwgJnNyY19way5zbGxfYWRkciwgc3JjX3BrLnNsbF9oYWxlbikpIHJldHVybjsKKyAgfSBlbHNlIGlmIChzcmNfYWRkci5zX2FkZHIgIT0gZF9pcC5zX2FkZHIgKSByZXR1cm47CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfcSkpIHsKKyAgICBwcmludGYoIiVzY2FzdCByZSVzIGZyb20gJXMgWyVzXSIsCisgICAgICAgIGZyb20tPnNsbF9wa3R0eXBlID09IFBBQ0tFVF9IT1NUID8gIlVuaSIgOiAiQnJvYWQiLAorICAgICAgICBhcnBfaGRyLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVBMWSkgPyAicGx5IiA6ICJxdWVzdCIsCisgICAgICAgIGluZXRfbnRvYShzX2lwKSwgZXRoZXJfbnRvYSgoc3RydWN0IGV0aGVyX2FkZHIgKikgcCkpOworICAgIGlmIChUVC5zZW50X2F0KSB7ICAKKyAgICAgIHVuc2lnbmVkIGRlbHRhOworICAgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKworICAgICAgZ2V0dGltZW9mZGF5KCZ0dmFsLCBOVUxMKTsKKyAgICAgIGRlbHRhID0gKHR2YWwudHZfc2VjICogMTAwMDAwMFVMTCArICh0dmFsLnR2X3VzZWMpKSAtIFRULnNlbnRfYXQ7CisgICAgICB4cHJpbnRmKCIgJXUuJTAzdW1zXG4iLCBkZWx0YSAvIDEwMDAsIGRlbHRhICUgMTAwMCk7CisgICAgICB4Zmx1c2goKTsKKyAgICB9CisgIH0KKyAgVFQucmN2ZF9ucisrOworICBpZiAoZnJvbS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX0hPU1QpIFRULmJyZF9yY3YrKzsKKyAgaWYgKGFycF9oZHItPmFyX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpKSBUVC5yY3ZkX3JlcSsrOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZikgZG9uZSgwKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfYikpIHsKKyAgICBtZW1jcHkoZHN0X3BrLnNsbF9hZGRyLCBwLCBzcmNfcGsuc2xsX2hhbGVuKTsKKyAgICBUVC51bmljYXN0X2ZsYWcgPSAxOworICB9Cit9CisKKy8vIEFsYXJtIHNpZ25hbCBIYW5kbGUsIHNlbmQgcGFja2V0cyBpbiBvbmUgc2Vjb25kIGludGVydmFsLgorc3RhdGljIHZvaWQgc2VuZF9zaWduYWwoaW50IHNpZykKK3sKKyAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7CisKKyAgZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisgIGlmICghVFQuc3RhcnQpIAorICAgIFRULmVuZCA9IFRULnN0YXJ0ID0gc3RhcnQudHZfc2VjICogMTAwMCArIHN0YXJ0LnR2X3VzZWMgLyAxMDAwOworICBlbHNlIFRULmVuZCA9IHN0YXJ0LnR2X3NlYyoxMDAwICsgc3RhcnQudHZfdXNlYyAvIDEwMDA7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSB7CisgICAgaWYgKCFUVC5jb3VudCkgZG9uZSgwKTsKKyAgICBUVC5jb3VudC0tOyAKKyAgfQorICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpICYmICgoVFQuZW5kIC0gVFQuc3RhcnQpID4gCisgICAgICAgICgoVFQudGltZV9vdXQpKjEwMDApKSkgZG9uZSgwKTsKKyAgc2VuZF9wYWNrZXQoKTsKKyAgYWxhcm0oMSk7Cit9CisKK3ZvaWQgYXJwaW5nX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGlmcmVxIGlmcjsKKyAgc3RydWN0IHNvY2thZGRyX2xsIGZyb207CisgIHNvY2tsZW5fdCBsZW47CisgIGludCBpZl9pbmRleCwgcmVjdl9sZW47CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfSSkpIFRULmlmYWNlID0gImV0aDAiOworICBUVC5zb2NrZmQgPSB4c29ja2V0KEFGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisKKyAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKyAgeHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBUVC5pZmFjZSwgSUZOQU1TSVopOworICBnZXRfaW50ZXJmYWNlKFRULmlmYWNlLCAmaWZfaW5kZXgsIE5VTEwsIE5VTEwpOworICBzcmNfcGsuc2xsX2lmaW5kZXggPSBpZl9pbmRleDsKKworICB4aW9jdGwoVFQuc29ja2ZkLCBTSU9DR0lGRkxBR1MsIChjaGFyKikmaWZyKTsKKyAgaWYgKCEoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkKKyAgICBlcnJvcl9leGl0KCJJbnRlcmZhY2UgXCIlc1wiIGlzIGRvd24iLCBUVC5pZmFjZSk7CisgIGlmICgoaWZyLmlmcl9mbGFncyAmIChJRkZfTk9BUlAgfCBJRkZfTE9PUEJBQ0spKQorICAgICAgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSkgeworICAgIHhwcmludGYoIkludGVyZmFjZSBcIiVzXCIgaXMgbm90IEFSUGFibGVcbiIsIFRULmlmYWNlKTsKKyAgICB0b3lzLmV4aXR2YWwgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfRCkgPyAwIDogMjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFpbmV0X2F0b24oKnRveXMub3B0YXJncywgJmRlc3RfYWRkcikpIHsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBnZXRob3N0YnluYW1lMigqdG95cy5vcHRhcmdzLCBBRl9JTkVUKTsKKworICAgIGlmICghaHApIHBlcnJvcl9leGl0KCJiYWQgYWRkcmVzcyAnJXMnIiwgKnRveXMub3B0YXJncyk7CisgICAgbWVtY3B5KCZkZXN0X2FkZHIsIGhwLT5oX2FkZHIsIDQpOworICB9CisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcykgJiYgIShpbmV0X2F0b24oVFQuc3JjX2lwLCAmc3JjX2FkZHIpKSkgCisgICAgcGVycm9yX2V4aXQoImludmFsaWQgc291cmNlIGFkZHJlc3MgJyVzJyIsVFQuc3JjX2lwKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfRCkgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1UpIAorICAgICAgJiYgIXNyY19hZGRyLnNfYWRkcikgc3JjX2FkZHIgPSBkZXN0X2FkZHI7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpIHx8IHNyY19hZGRyLnNfYWRkcikgeworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyAgICBpbnQgcF9mZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKKyAgICBpZiAoc2V0c29ja29wdChwX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIFRULmlmYWNlLAorICAgICAgICAgIHN0cmxlbihUVC5pZmFjZSkpKSBwZXJyb3JfZXhpdCgic2V0c29ja29wdCIpOworCisgICAgbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisgICAgc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaWYgKHNyY19hZGRyLnNfYWRkcikgeworICAgICAgc2FkZHIuc2luX2FkZHIgPSBzcmNfYWRkcjsKKyAgICAgIGlmIChiaW5kKHBfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYWRkciwgc2l6ZW9mKHNhZGRyKSkpIAorICAgICAgICBwZXJyb3JfZXhpdCgiYmluZCIpOworICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBvaXA7CisKKyAgICAgIHNhZGRyLnNpbl9wb3J0ID0gaHRvbnMoMTAyNSk7CisgICAgICBzYWRkci5zaW5fYWRkciA9IGRlc3RfYWRkcjsKKyAgICAgIGlmIChjb25uZWN0KHBfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSkKKyAgICAgICAgcGVycm9yX2V4aXQoImNhbm5vdCBjb25uZWN0IHRvIHJlbW90ZSBob3N0Iik7CisgICAgICBnZXRfaW50ZXJmYWNlKFRULmlmYWNlLCBOVUxMLCAmb2lwLCBOVUxMKTsKKyAgICAgIHNyY19hZGRyLnNfYWRkciA9IGh0b25sKG9pcCk7CisgICAgfQorICAgIHhjbG9zZShwX2ZkKTsKKyAgfQorCisgIHNyY19way5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworICBzcmNfcGsuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKyAgaWYgKGJpbmQoVFQuc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnNyY19waywgc2l6ZW9mKHNyY19waykpKSAKKyAgICBwZXJyb3JfZXhpdCgiYmluZCIpOworCisgIHNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHNyY19wayk7CisgIGdldHNvY2tuYW1lKFRULnNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzcmNfcGssICZhbGVuKTsKKyAgaWYgKCFzcmNfcGsuc2xsX2hhbGVuKSB7CisgICAgcGVycm9yX21zZygic3JjIGlzIG5vdCBhcnBhYmxlIik7CisgICAgdG95cy5leGl0dmFsID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpID8gMCA6IDI7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3EpKSB7CisgICAgeHByaW50ZigiQVJQSU5HIHRvICVzIiwgaW5ldF9udG9hKGRlc3RfYWRkcikpOworICAgIHhwcmludGYoIiBmcm9tICVzIHZpYSAlc1xuIiwgaW5ldF9udG9hKHNyY19hZGRyKSwgVFQuaWZhY2UpOworICB9CisKKyAgZHN0X3BrID0gc3JjX3BrOworICAvL0ZpcnN0IHBhY2tldCBhbHdheXMgYnJvYWRjYXN0cy4KKyAgbWVtc2V0KGRzdF9way5zbGxfYWRkciwgLTEsIGRzdF9way5zbGxfaGFsZW4pOworICBzaWduYWwoU0lHSU5ULCBkb25lKTsKKyAgc2lnbmFsKFNJR0FMUk0sIHNlbmRfc2lnbmFsKTsKKworICBzZW5kX3NpZ25hbCgwKTsgLy8gU2VuZCBmaXJzdCBCcm9hZGNhc3QgbWVzc2FnZS4KKyAgd2hpbGUgKDEpIHsKKyAgICBsZW4gPSBzaXplb2YoZnJvbSk7CisgICAgcmVjdl9sZW4gPSByZWN2ZnJvbShUVC5zb2NrZmQsIHRveWJ1ZiwgNDA5NiwgMCwKKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tLCAmbGVuKTsKKyAgICBpZiAocmVjdl9sZW4gPCAwKSBjb250aW51ZTsKKyAgICByZWN2X2Zyb20oJmZyb20sICZyZWN2X2xlbik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvYm9vdGNoYXJ0ZC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9ib290Y2hhcnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1YTEzNgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvYm9vdGNoYXJ0ZC5jCkBAIC0wLDAgKzEsMzE3IEBACisvKiBib290Y2hhcnRkLmMgLSBib290Y2hhcnRkIGlzIGNvbW1vbmx5IHVzZWQgdG8gcHJvZmlsZSB0aGUgYm9vdCBwcm9jZXNzLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEJpbGFsIFF1cmVzaGkgPGJpbGFsLmptaUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxNCBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4gCisgKgorICogTm8gU3RhbmRhcmQKKyAKK1VTRV9CT09UQ0hBUlREKE5FV1RPWShib290Y2hhcnRkLCAwLCBUT1lGTEFHX1NUQVlST09UfFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEJPT1RDSEFSVEQKKyAgYm9vbCAiYm9vdGNoYXJ0ZCIKKyAgZGVmYXVsdCBuCisgIGRlcGVuZHMgb24gVE9ZQk9YX0ZPUksKKyAgaGVscAorICAgIHVzYWdlOiBib290Y2hhcnRkIHtzdGFydCBbUFJPRyBBUkdTXX18c3RvcHxpbml0CisKKyAgICBDcmVhdGUgL3Zhci9sb2cvYm9vdGxvZy50Z3ogd2l0aCBib290IGNoYXJ0IGRhdGEKKworICAgIHN0YXJ0OiBzdGFydCBiYWNrZ3JvdW5kIGxvZ2dpbmc7IHdpdGggUFJPRywgcnVuIFBST0csCisgICAgICAgICAgIHRoZW4ga2lsbCBsb2dnaW5nIHdpdGggVVNSMQorICAgIHN0b3A6ICBzZW5kIFVTUjEgdG8gYWxsIGJvb3RjaGFydGQgcHJvY2Vzc2VzCisgICAgaW5pdDogIHN0YXJ0IGJhY2tncm91bmQgbG9nZ2luZzsgc3RvcCB3aGVuIGdldHR5L3hkbSBpcyBzZWVuCisgICAgICAgICAgKGZvciBpbml0IHNjcmlwdHMpCisKKyAgICBVbmRlciBQSUQgMTogYXMgaW5pdCwgdGhlbiBleGVjICRib290Y2hhcnRfaW5pdCwgL2luaXQsIC9zYmluL2luaXQKKyovCisKKyNkZWZpbmUgRk9SX2Jvb3RjaGFydGQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgYnVmWzMyXTsKKyAgbG9uZyBzbXBsX3BlcmlvZF91c2VjOworICBpbnQgcHJvY19hY2NvdW50aW5nOworICBpbnQgaXNfbG9naW47CisKKyAgdm9pZCAqaGVhZDsKKykKKworc3RydWN0IHBpZF9saXN0IHsKKyAgc3RydWN0IHBpZF9saXN0ICpuZXh0LCAqcHJldjsKKyAgaW50IHBpZDsKK307CisKK3N0YXRpYyBpbnQgcHVzaF9waWRzX2luX2xpc3QocGlkX3QgcGlkLCBjaGFyICpuYW1lKQoreworICBzdHJ1Y3QgcGlkX2xpc3QgKm5ldyA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwaWRfbGlzdCkpOworCisgIG5ldy0+cGlkID0gcGlkOworICBkbGlzdF9hZGRfbm9tYWxsb2MoKHZvaWQgKikmVFQuaGVhZCwgKHZvaWQgKiluZXcpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGFfaW5fZmlsZShjaGFyICpmbmFtZSwgaW50IHdmZCkKK3sKKyAgaW50IHJmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKworICBpZiAocmZkICE9IC0xKSB7CisgICAgeHdyaXRlKHdmZCwgVFQuYnVmLCBzdHJsZW4oVFQuYnVmKSk7CisgICAgeHNlbmRmaWxlKHJmZCwgd2ZkKTsKKyAgICBjbG9zZShyZmQpOworICAgIHh3cml0ZSh3ZmQsICJcbiIsIDEpOworICB9Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9wcm9jX2RhdGEoRklMRSAqZnApCit7CisgIHN0cnVjdCBkaXJlbnQgKnBpZF9kaXI7CisgIGludCBsb2dpbl9mbGFnID0gMDsKKyAgcGlkX3QgcGlkOworICBESVIgKnByb2NfZGlyID0gb3BlbmRpcigiL3Byb2MiKTsKKworICBmcHV0cyhUVC5idWYsIGZwKTsKKyAgd2hpbGUgKChwaWRfZGlyID0gcmVhZGRpcihwcm9jX2RpcikpKSB7CisgICAgY2hhciBmaWxlbmFtZVs2NF07CisgICAgaW50IGZkOworCisgICAgaWYgKCFpc2RpZ2l0KHBpZF9kaXItPmRfbmFtZVswXSkpIGNvbnRpbnVlOworICAgIHNzY2FuZihwaWRfZGlyLT5kX25hbWUsICIlZCIsICZwaWQpOworICAgIHNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8lZC9zdGF0IiwgcGlkKTsKKyAgICBpZiAoKGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpKSAhPSAtMSApIHsKKyAgICAgIGNoYXIgKnB0cjsKKyAgICAgIHNzaXplX3QgbGVuOworCisgICAgICBpZiAoKGxlbiA9IHJlYWRhbGwoZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiktMSkpIDwgMCkgeworICAgICAgICB4Y2xvc2UoZmQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHRveWJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgIGNsb3NlKGZkKTsKKyAgICAgIGZwdXRzKHRveWJ1ZiwgZnApOworICAgICAgaWYgKCFUVC5pc19sb2dpbikgY29udGludWU7CisgICAgICBpZiAoKHB0ciA9IHN0cmNocih0b3lidWYsICcoJykpKSB7CisgICAgICAgIGNoYXIgKnRtcCA9IHN0cmNocigrK3B0ciwgJyknKTsKKworICAgICAgICBpZiAodG1wKSAqdG1wID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIC8vIENoZWNrcyBmb3IgZ2RtLCBrZG0gb3IgZ2V0dHkKKyAgICAgIGlmICgoKHB0clswXSA9PSAnZycgfHwgcHRyWzBdID09ICdrJyB8fCBwdHJbMF0gPT0gJ3gnKSAmJiBwdHJbMV0gPT0gJ2QnCisgICAgICAgICAgICAmJiBwdHJbMl0gPT0gJ20nKSB8fCBzdHJzdHIocHRyLCAiZ2V0dHkiKSkgbG9naW5fZmxhZyA9IDE7CisgICAgfQorICB9CisgIGNsb3NlZGlyKHByb2NfZGlyKTsKKyAgZnB1dGMoJ1xuJywgZnApOworICByZXR1cm4gbG9naW5fZmxhZzsKK30KKworc3RhdGljIGludCBwYXJzZV9jb25maWdfZmlsZShjaGFyICpmbmFtZSkKK3sKKyAgc2l6ZV90IGxlbiA9IDA7CisgIGNoYXIgICpsaW5lID0gTlVMTDsKKyAgRklMRSAqZnAgPSBmb3BlbihmbmFtZSwgInIiKTsKKworICBpZiAoIWZwKSByZXR1cm4gMDsKKyAgZm9yICg7Z2V0bGluZSgmbGluZSwgJmxlbiwgZnApICE9IC0xOyBsaW5lID0gTlVMTCkgeworICAgIGNoYXIgKnB0ciA9IGxpbmU7CisKKyAgICB3aGlsZSAoKnB0ciA9PSAnICcgfHwgKnB0ciA9PSAnXHQnKSBwdHIrKzsKKyAgICBpZiAoISpwdHIgfHwgKnB0ciA9PSAnIycgfHwgKnB0ciA9PSAnXG4nKSBjb250aW51ZTsKKyAgICBpZiAoIXN0cm5jbXAocHRyLCAiU0FNUExFX1BFUklPRCIsIHN0cmxlbigiU0FNUExFX1BFUklPRCIpKSkgeworICAgICAgZG91YmxlIHNtcGxfdmFsOworCisgICAgICBpZiAoKHB0ciA9IHN0cmNocihwdHIsICc9JykpKSBwdHIgKz0gMTsKKyAgICAgIGVsc2UgY29udGludWU7CisgICAgICBzc2NhbmYocHRyLCAiJWxmIiwgJnNtcGxfdmFsKTsKKyAgICAgIFRULnNtcGxfcGVyaW9kX3VzZWMgPSBzbXBsX3ZhbCAqIDEwMDAwMDA7CisgICAgICBpZiAoVFQuc21wbF9wZXJpb2RfdXNlYyA8PSAwKSBUVC5zbXBsX3BlcmlvZF91c2VjID0gMTsKKyAgICB9CisgICAgaWYgKCFzdHJuY21wKHB0ciwgIlBST0NFU1NfQUNDT1VOVElORyIsIHN0cmxlbigiUFJPQ0VTU19BQ0NPVU5USU5HIikpKSB7CisgICAgICBpZiAoKHB0ciA9IHN0cmNocihwdHIsICc9JykpKSBwdHIgKz0gMTsKKyAgICAgIGVsc2UgY29udGludWU7CisgICAgICBzc2NhbmYocHRyLCAiJXMiLCB0b3lidWYpOyAgLy8gc3RyaW5nIHdpbGwgY29tZSB3aXRoIGRvdWJsZSBxdW90ZXMuCisgICAgICBpZiAoIShzdHJuY21wKHRveWJ1ZisxLCAib24iLCBzdHJsZW4oIm9uIikpKSB8fAorICAgICAgICAgICEoc3RybmNtcCh0b3lidWYrMSwgInllcyIsIHN0cmxlbigieWVzIikpKSkgVFQucHJvY19hY2NvdW50aW5nID0gMTsKKyAgICB9CisgICAgZnJlZShsaW5lKTsKKyAgfQorICBmY2xvc2UoZnApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmNyZWF0ZV90bXBfZGlyKCkKK3sKKyAgY2hhciAqZGlyX2xpc3RbXSA9IHsiL3RtcCIsICIvbW50IiwgIi9ib290IiwgIi9wcm9jIn0sICoqdGFyZ2V0ID0gZGlyX2xpc3Q7CisgIGNoYXIgKmRpciwgZGlyX3BhdGhbXSA9ICIvdG1wL2Jvb3RjaGFydC5YWFhYWFgiOworCisgIGlmICgoZGlyID0gbWtkdGVtcChkaXJfcGF0aCkpKSB7CisgICAgeGNoZGlyKChkaXIgPSB4c3RyZHVwKGRpcikpKTsKKyAgICByZXR1cm4gZGlyOworICB9CisgIHdoaWxlIChtb3VudCgibm9uZSIsICp0YXJnZXQsICJ0bXBmcyIsICgxPDwxNSksICJzaXplPTE2bSIpKSAvL01TX1NJTEVOVAorICAgIGlmICghKyt0YXJnZXQpIHBlcnJvcl9leGl0KCJjYW4ndCBtb3VudCB0bXBmcyIpOworICB4Y2hkaXIoKnRhcmdldCk7CisgIGlmICh1bW91bnQyKCp0YXJnZXQsIE1OVF9ERVRBQ0gpKSBwZXJyb3JfZXhpdCgiQ2FuJ3QgdW5tb3VudCB0bXBmcyIpOworICByZXR1cm4gKnRhcmdldDsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfbG9nZ2luZygpCit7CisgIGludCBwcm9jX3N0YXRfZmQgPSB4Y3JlYXRlKCJwcm9jX3N0YXQubG9nIiwgIAorICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7CisgIGludCBwcm9jX2Rpc2tzdGF0c19mZCA9IHhjcmVhdGUoInByb2NfZGlza3N0YXRzLmxvZyIsICAKKyAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworICBGSUxFICpwcm9jX3BzX2ZwID0geGZvcGVuKCJwcm9jX3BzLmxvZyIsICJ3Iik7CisgIGxvbmcgdGNudCA9IDYwICogMTAwMCAqIDEwMDAgLyBUVC5zbXBsX3BlcmlvZF91c2VjOworCisgIGlmICh0Y250IDw9IDApIHRjbnQgPSAxOworICBpZiAoVFQucHJvY19hY2NvdW50aW5nKSB7CisgICAgaW50IGtwX2ZkID0geGNyZWF0ZSgia2VybmVsX3Byb2NzX2FjY3QiLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLDA2NjYpOworCisgICAgeGNsb3NlKGtwX2ZkKTsKKyAgICBhY2N0KCJrZXJuZWxfcHJvY3NfYWNjdCIpOworICB9CisgIG1lbXNldChUVC5idWYsIDAsIHNpemVvZihUVC5idWYpKTsKKyAgd2hpbGUgKC0tdGNudCAmJiAhdG95cy5zaWduYWwpIHsKKyAgICBpbnQgaSA9IDAsIGogPSAwLCBmZCA9IG9wZW4oIi9wcm9jL3VwdGltZSIsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSBnb3RvIHdhaXRfdXNlYzsKKyAgICBjaGFyICpsaW5lID0gZ2V0X2xpbmUoZmQpOworCisgICAgaWYgKCFsaW5lKSAgZ290byB3YWl0X3VzZWM7CisgICAgd2hpbGUgKGxpbmVbaV0gIT0gJyAnKSB7CisgICAgICBpZiAobGluZVtpXSA9PSAnLicpIHsKKyAgICAgICAgaSsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFRULmJ1ZltqKytdID0gbGluZVtpKytdOworICAgIH0KKyAgICBUVC5idWZbaisrXSA9ICdcbic7CisgICAgVFQuYnVmW2pdID0gJ1wwJzsKKyAgICBmcmVlKGxpbmUpOworICAgIGNsb3NlKGZkKTsKKyAgICBkdW1wX2RhdGFfaW5fZmlsZSgiL3Byb2Mvc3RhdCIsIHByb2Nfc3RhdF9mZCk7CisgICAgZHVtcF9kYXRhX2luX2ZpbGUoIi9wcm9jL2Rpc2tzdGF0cyIsIHByb2NfZGlza3N0YXRzX2ZkKTsKKyAgICAvLyBzdG9wIHByb2MgZHVtcGluZyBpbiAyIHNlY3MgaWYgZ2V0dHkgb3IgZ2RtLCBrZG0sIHhkbSBmb3VuZCAKKyAgICBpZiAoZHVtcF9wcm9jX2RhdGEocHJvY19wc19mcCkpCisgICAgICBpZiAodGNudCA+IDIgKiAxMDAwICogMTAwMCAvIFRULnNtcGxfcGVyaW9kX3VzZWMpCisgICAgICAgIHRjbnQgPSAyICogMTAwMCAqIDEwMDAgLyBUVC5zbXBsX3BlcmlvZF91c2VjOworICAgIGZmbHVzaChOVUxMKTsKK3dhaXRfdXNlYzoKKyAgICB1c2xlZXAoVFQuc21wbF9wZXJpb2RfdXNlYyk7CisgIH0KKyAgeGNsb3NlKHByb2Nfc3RhdF9mZCk7CisgIHhjbG9zZShwcm9jX2Rpc2tzdGF0c19mZCk7CisgIGZjbG9zZShwcm9jX3BzX2ZwKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF9sb2dnaW5nKGNoYXIgKnRtcF9kaXIsIGNoYXIgKnByb2cpCit7CisgIGNoYXIgaG9zdF9uYW1lWzMyXTsKKyAgaW50IGtjbWRfbGluZV9mZDsKKyAgdGltZV90IHQ7CisgIHN0cnVjdCB0bSBzdDsKKyAgc3RydWN0IHV0c25hbWUgdXRzOworICBGSUxFICpoZHJfZnAgPSB4Zm9wZW4oImhlYWRlciIsICJ3Iik7CisKKyAgaWYgKFRULnByb2NfYWNjb3VudGluZykgYWNjdChOVUxMKTsKKyAgaWYgKHByb2cpIGZwcmludGYoaGRyX2ZwLCAicHJvZmlsZS5wcm9jZXNzID0gJXNcbiIsIHByb2cpOworICBnZXRob3N0bmFtZShob3N0X25hbWUsIHNpemVvZihob3N0X25hbWUpKTsKKyAgdGltZSgmdCk7CisgIGxvY2FsdGltZV9yKCZ0LCAmc3QpOworICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgIHN0cmZ0aW1lKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlYSAlYiAlZSAlSDolTTolUyAlWiAlWSIsICZzdCk7CisgIGZwcmludGYoaGRyX2ZwLCAidmVyc2lvbiA9IFRCWF9CQ0hBUlREX1ZFUiAxLjAuMFxuIik7CisgIGZwcmludGYoaGRyX2ZwLCAidGl0bGUgPSBCb290IGNoYXJ0IGZvciAlcyAoJXMpXG4iLCBob3N0X25hbWUsIHRveWJ1Zik7CisgIGlmICh1bmFtZSgmdXRzKSA8IDApIHBlcnJvcl9leGl0KCJ1bmFtZSIpOworICBmcHJpbnRmKGhkcl9mcCwgInN5c3RlbS51bmFtZSA9ICVzICVzICVzICVzXG4iLCB1dHMuc3lzbmFtZSwgdXRzLnJlbGVhc2UsCisgICAgICB1dHMudmVyc2lvbiwgdXRzLm1hY2hpbmUpOworICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgIGlmICgoa2NtZF9saW5lX2ZkID0gb3BlbigiL3Byb2MvY21kbGluZSIsIE9fUkRPTkxZKSkgIT0gLTEpIHsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGlmICgobGVuID0gcmVhZGFsbChrY21kX2xpbmVfZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiktMSkpID4gMCkgeworICAgICAgdG95YnVmW2xlbl0gPSAwOworICAgICAgd2hpbGUgKC0tbGVuID49IDAgJiYgIXRveWJ1ZltsZW5dKSBjb250aW51ZTsKKyAgICAgIGZvciAoOyBsZW4gPiAwOyBsZW4tLSkgaWYgKHRveWJ1ZltsZW5dIDwgJyAnKSB0b3lidWZbbGVuXSA9ICcgJzsKKyAgICB9IGVsc2UgKnRveWJ1ZiA9IDA7CisgIH0KKyAgZnByaW50ZihoZHJfZnAsICJzeXN0ZW0ua2VybmVsLm9wdGlvbnMgPSAlcyIsIHRveWJ1Zik7CisgIGNsb3NlKGtjbWRfbGluZV9mZCk7CisgIGZjbG9zZShoZHJfZnApOworICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICJ0YXIgLXpjZiAvdmFyL2xvZy9ib290bG9nLnRneiBoZWFkZXIgJXMgKi5sb2ciLCAKKyAgICAgIFRULnByb2NfYWNjb3VudGluZyA/ICJrZXJuZWxfcHJvY3NfYWNjdCIgOiAiIik7CisgIHN5c3RlbSh0b3lidWYpOworICBpZiAodG1wX2RpcikgeworICAgIHVubGluaygiaGVhZGVyIik7CisgICAgdW5saW5rKCJwcm9jX3N0YXQubG9nIik7CisgICAgdW5saW5rKCJwcm9jX2Rpc2tzdGF0cy5sb2ciKTsKKyAgICB1bmxpbmsoInByb2NfcHMubG9nIik7CisgICAgaWYgKFRULnByb2NfYWNjb3VudGluZykgdW5saW5rKCJrZXJuZWxfcHJvY3NfYWNjdCIpOworICAgIHJtZGlyKHRtcF9kaXIpOworICB9Cit9CisKK3ZvaWQgYm9vdGNoYXJ0ZF9tYWluKCkKK3sKKyAgcGlkX3QgbGdyX3BpZCwgc2VsZl9waWQgPSBnZXRwaWQoKTsKKyAgaW50IGJjaGFydGRfb3B0ID0gMDsgLy8gMD1QSUQxLCAxPXN0YXJ0LCAyPXN0b3AsIDM9aW5pdAorICBUVC5zbXBsX3BlcmlvZF91c2VjID0gMjAwICogMTAwMDsKKworICBUVC5pc19sb2dpbiA9IChzZWxmX3BpZCA9PSAxKTsKKyAgaWYgKCp0b3lzLm9wdGFyZ3MpIHsKKyAgICBpZiAoIXN0cmNtcCgic3RhcnQiLCAqdG95cy5vcHRhcmdzKSkgYmNoYXJ0ZF9vcHQgPSAxOworICAgIGVsc2UgaWYgKCFzdHJjbXAoInN0b3AiLCAqdG95cy5vcHRhcmdzKSkgYmNoYXJ0ZF9vcHQgPSAyOworICAgIGVsc2UgaWYgKCFzdHJjbXAoImluaXQiLCAqdG95cy5vcHRhcmdzKSkgYmNoYXJ0ZF9vcHQgPSAzOworICAgIGVsc2UgZXJyb3JfZXhpdCgiVW5rbm93biBvcHRpb24gJyVzJyIsICp0b3lzLm9wdGFyZ3MpOworCisgICAgaWYgKGJjaGFydGRfb3B0ID09IDIpIHsKKyAgICAgIHN0cnVjdCBwaWRfbGlzdCAqdGVtcDsKKyAgICAgIGNoYXIgKnByb2Nlc3NfbmFtZVtdID0geyJib290Y2hhcnRkIiwgTlVMTH07CisKKyAgICAgIG5hbWVzX3RvX3BpZChwcm9jZXNzX25hbWUsIHB1c2hfcGlkc19pbl9saXN0KTsKKyAgICAgIHRlbXAgPSBUVC5oZWFkOworICAgICAgaWYgKHRlbXApIHRlbXAtPnByZXYtPm5leHQgPSAwOworICAgICAgZm9yICg7IHRlbXA7IHRlbXAgPSB0ZW1wLT5uZXh0KSAKKyAgICAgICAgaWYgKHRlbXAtPnBpZCAhPSBzZWxmX3BpZCkga2lsbCh0ZW1wLT5waWQsIFNJR1VTUjEpOworICAgICAgbGxpc3RfdHJhdmVyc2UoVFQuaGVhZCwgZnJlZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAoIVRULmlzX2xvZ2luKSBlcnJvcl9leGl0KCJub3QgUElEIDEiKTsKKworICAvLyBFeGVjdXRlIHRoZSBjb2RlIGJlbG93IGZvciBzdGFydCBvciBpbml0IG9yIFBJRDEgCisgIGlmICghcGFyc2VfY29uZmlnX2ZpbGUoImJvb3RjaGFydGQuY29uZiIpKQorICAgIHBhcnNlX2NvbmZpZ19maWxlKCIvZXRjL2Jvb3RjaGFydGQuY29uZiIpOworCisgIG1lbXNldCh0b3lidWYsIDAsIHNpemVvZih0b3lidWYpKTsKKyAgaWYgKCEobGdyX3BpZCA9IHhmb3JrKCkpKSB7CisgICAgY2hhciAqdG1wX2RpciA9IGNyZWF0ZV90bXBfZGlyKCk7CisKKyAgICBzaWdhdGV4aXQoZ2VuZXJpY19zaWduYWwpOworICAgIHJhaXNlKFNJR1NUT1ApOworICAgIGlmICghYmNoYXJ0ZF9vcHQgJiYgIWdldGVudigiUEFUSCIpKSAKKyAgICAgIHB1dGVudigiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIpOworICAgIHN0YXJ0X2xvZ2dpbmcoKTsKKyAgICBzdG9wX2xvZ2dpbmcodG1wX2RpciwgYmNoYXJ0ZF9vcHQgPT0gMSA/IHRveXMub3B0YXJnc1sxXSA6IE5VTEwpOworICAgIHJldHVybjsKKyAgfSAKKyAgd2FpdHBpZChsZ3JfcGlkLCBOVUxMLCBXVU5UUkFDRUQpOworICBraWxsKGxncl9waWQsIFNJR0NPTlQpOworCisgIGlmICghYmNoYXJ0ZF9vcHQpIHsgCisgICAgY2hhciAqcGJjaGFydF9pbml0ID0gZ2V0ZW52KCJib290Y2hhcnRfaW5pdCIpOworCisgICAgaWYgKHBiY2hhcnRfaW5pdCkgZXhlY2wocGJjaGFydF9pbml0LCBwYmNoYXJ0X2luaXQsIE5VTEwpOworICAgIGV4ZWNsKCIvaW5pdCIsICJpbml0IiwgKHZvaWQgKikwKTsKKyAgICBleGVjbCgiL3NiaW4vaW5pdCIsICJpbml0IiwgKHZvaWQgKikwKTsKKyAgfQorICBpZiAoYmNoYXJ0ZF9vcHQgPT0gMSAmJiB0b3lzLm9wdGFyZ3NbMV0pIHsgCisgICAgcGlkX3QgcHJvZ19waWQ7CisKKyAgICBpZiAoIShwcm9nX3BpZCA9IHhmb3JrKCkpKSB4ZXhlYyh0b3lzLm9wdGFyZ3MrMSk7CisgICAgd2FpdHBpZChwcm9nX3BpZCwgTlVMTCwgMCk7CisgICAga2lsbChsZ3JfcGlkLCBTSUdVU1IxKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9icmN0bC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9icmN0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTc4NTEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2JyY3RsLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qIGJyY3RsLmMgLSBldGhlcm5ldCBicmlkZ2UgY29udHJvbAorICoKKyAqIENvcHlyaWdodCAyMDEzIEFzaHdpbmkgS3VtYXIgPGFrLmFzaHdpbmkxOTgxQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9CUkNUTChORVdUT1koYnJjdGwsICI8MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBCUkNUTAorICBib29sICJicmN0bCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogYnJjdGwgQ09NTUFORCBbQlJJREdFIFtJTlRFUkZBQ0VdXQorCisgICAgTWFuYWdlIGV0aGVybmV0IGJyaWRnZXMKKworICAgIENvbW1hbmRzOgorICAgIHNob3cgICAgICAgICAgICAgICAgICBTaG93IGEgbGlzdCBvZiBicmlkZ2VzCisgICAgYWRkYnIgQlJJREdFICAgICAgICAgIENyZWF0ZSBCUklER0UKKyAgICBkZWxiciBCUklER0UgICAgICAgICAgRGVsZXRlIEJSSURHRQorICAgIGFkZGlmIEJSSURHRSBJRkFDRSAgICBBZGQgSUZBQ0UgdG8gQlJJREdFCisgICAgZGVsaWYgQlJJREdFIElGQUNFICAgIERlbGV0ZSBJRkFDRSBmcm9tIEJSSURHRQorICAgIHNldGFnZWluZyBCUklER0UgVElNRSBTZXQgYWdlaW5nIHRpbWUKKyAgICBzZXRmZCBCUklER0UgVElNRSAgICAgU2V0IGJyaWRnZSBmb3J3YXJkIGRlbGF5CisgICAgc2V0aGVsbG8gQlJJREdFIFRJTUUgIFNldCBoZWxsbyB0aW1lCisgICAgc2V0bWF4YWdlIEJSSURHRSBUSU1FIFNldCBtYXggbWVzc2FnZSBhZ2UKKyAgICBzZXRwYXRoY29zdCBCUklER0UgUE9SVCBDT1NUICAgU2V0IHBhdGggY29zdAorICAgIHNldHBvcnRwcmlvIEJSSURHRSBQT1JUIFBSSU8gICBTZXQgcG9ydCBwcmlvcml0eQorICAgIHNldGJyaWRnZXByaW8gQlJJREdFIFBSSU8gICAgICBTZXQgYnJpZGdlIHByaW9yaXR5CisgICAgc3RwIEJSSURHRSBbMS95ZXMvb258MC9uby9vZmZdIFNUUCBvbi9vZmYKKyovCisKKyNkZWZpbmUgRk9SX2JyY3RsCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorCitHTE9CQUxTKAorICAgIGludCBzb2NrZmQ7CispCisjZGVmaW5lIE1BWF9CUklER0VTIDEwMjQgLy9zYW1lIGlzIG5vIG9mIHBvcnRzIHN1cHBvcnRlZAorCitzdGF0aWMgdm9pZCBnZXRfcG9ydHMoY2hhciAqYnJpZGdlLCBpbnQgKmluZGljZXMpCit7CisgIHN0cnVjdCBpZnJlcSBpZnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGludCBpZmluZGljZXNbTUFYX0JSSURHRVNdOworICB1bnNpZ25lZCBsb25nIGFyZ3NbNF0gPSB7IEJSQ1RMX0dFVF9QT1JUX0xJU1QsCisgICAgKHVuc2lnbmVkIGxvbmcpIGlmaW5kaWNlcywgTUFYX0JSSURHRVMsIDAgfTsKKworICBtZW1zZXQoaWZpbmRpY2VzLCAwLCBNQVhfQlJJREdFUyk7CisgIGFyZ3NbMV0gPSAodW5zaWduZWQgbG9uZylpZmluZGljZXM7CisgIHhzdHJuY3B5KGlmci5pZnJfbmFtZSwgYnJpZGdlLCBJRk5BTVNJWik7CisgIGlmci5pZnJfZGF0YSA9IChjaGFyICopYXJnczsKKyAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworICBpZiAoaW5kaWNlcykgbWVtY3B5KGluZGljZXMsIGlmaW5kaWNlcywgc2l6ZW9mKGlmaW5kaWNlcykpOworfQorCit2b2lkIGdldF9icl9pbmZvKGNoYXIgKmJyaWRnZSwgc3RydWN0IF9fYnJpZGdlX2luZm8gKmluZm8pCit7CisgIHN0cnVjdCBpZnJlcSBpZnI7CisgIHVuc2lnbmVkIGxvbmcgYXJnc1s0XSA9IHsgQlJDVExfR0VUX0JSSURHRV9JTkZPLAorICAgICh1bnNpZ25lZCBsb25nKSBpbmZvLCAwLCAwIH07CisKKyAgbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworICB4c3RybmNweShpZnIuaWZyX25hbWUsIGJyaWRnZSwgSUZOQU1TSVopOworICBpZnIuaWZyX2RhdGEgPSAoY2hhciAqKWFyZ3M7CisKKyAgaWYgKGlvY3RsKFRULnNvY2tmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpIDwgMCkgeworICAgIHBlcnJvcl9tc2coIiVzOiBjYW4ndCBnZXQgaW5mbyAlc1xuIiwgYnJpZGdlLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIGJyX3Nob3coY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBfX2JyaWRnZV9pbmZvIGluZm87CisgIGludCBudW0sIGNudCwgaSwgaiwgaWZpbmRpY2VzW01BWF9CUklER0VTXSwgcGluZGljZXNbTUFYX0JSSURHRVNdOworICB1bnNpZ25lZCBsb25nIGFyZ3NbNF0gPSB7IEJSQ1RMX0dFVF9CUklER0VTLAorICAgICh1bnNpZ25lZCBsb25nKWlmaW5kaWNlcywgTUFYX0JSSURHRVMsMCB9OworICBjaGFyIGJyW0lGX05BTUVTSVpFXSwgaWZuW0lGX05BTUVTSVpFXTsKKworICBudW0gPSBpb2N0bChUVC5zb2NrZmQsIFNJT0NHSUZCUiwgYXJncyk7IC8vcmV0IGlzIG51bSBvZiBicmlkZ2VzIGZvdW5kCisgIGlmIChudW0gPCAwKSBlcnJvcl9leGl0KCJnZXQgYnJpZGdlcyBmYWlsIik7CisgIHByaW50ZigiYnJpZGdlIG5hbWVcdGJyaWRnZSBpZFx0XHRTVFAgZW5hYmxlZFx0aW50ZXJmYWNlc1xuIik7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgdW5zaWduZWQgY2hhciAqaWQ7CisKKyAgICBpZiAoIWlmX2luZGV4dG9uYW1lKGlmaW5kaWNlc1tpXSwgYnIpKSBwZXJyb3JfZXhpdCgiaW50ZXJmYWNlIG5vdCBmb3VuZCIpOworICAgIGdldF9icl9pbmZvKGJyLCAmaW5mbyk7CisgICAgaWQgPSAodW5zaWduZWQgY2hhciopJihpbmZvLmJyaWRnZV9pZCk7CisgICAgcHJpbnRmKCIlc1x0XHQiLGJyKTsKKyAgICBwcmludGYoIiUuMnglLjJ4LiUuMnglLjJ4JS4yeCUuMnglLjJ4JS4yeCIsIGlkWzBdLCBpZFsxXSwgCisgICAgICAgIGlkWzJdLCBpZFszXSwgaWRbNF0sIGlkWzVdLCBpZFs2XSwgaWRbN10pOworICAgIHByaW50ZigiXHQlc1x0XHQiLChpbmZvLnN0cF9lbmFibGVkKT8ieWVzIiA6ICJubyIpOworCisgICAgbWVtc2V0KHBpbmRpY2VzLCAwLCBzaXplb2YocGluZGljZXMpKTsKKyAgICBnZXRfcG9ydHMoYnIsIHBpbmRpY2VzKTsKKyAgICBmb3IgKGogPSAwLCBjbnQgPSAwOyBqIDwgTUFYX0JSSURHRVM7IGorKykgeworICAgICAgaWYgKCFwaW5kaWNlc1tqXSkgY29udGludWU7CisgICAgICBpZiAoIWlmX2luZGV4dG9uYW1lKHBpbmRpY2VzW2pdLCBpZm4pKSB7CisgICAgICAgIGVycm9yX21zZygibm8gbmFtZSBmb3IgaW5kZXggOiVkIiwgcGluZGljZXNbal0pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjbnQpIHByaW50ZigiXG5cdFx0XHRcdFx0XHRcdCIpOworICAgICAgcHJpbnRmKCIlcyIsIGlmbik7CisgICAgICBjbnQrKzsKKyAgICB9CisgICAgeHB1dGMoJ1xuJyk7CisgIH0KK30KKwordm9pZCBicl9hZGRicihjaGFyICoqYXJndikKK3sKKyAgY2hhciBicltJRk5BTVNJWl07ICAgICAgICAgICAgICAgIAorICB1bnNpZ25lZCBsb25nIGFyZ3NbNF0gPSB7QlJDVExfQUREX0JSSURHRSwgKHVuc2lnbmVkIGxvbmcpIGJyLCAwLCAwfTsKKworI2lmZGVmIFNJT0NCUkFEREJSCisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NCUkFEREJSLCBhcmd2WzBdKTsKKyNlbHNlICAgICAgICAgICAgCisgIHhzdHJuY3B5KGJyLCBhcmd2WzBdLCBJRk5BTVNJWik7ICAgCisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NTSUZCUiwgYXJncyk7CisjZW5kaWYKK30KKwordm9pZCBicl9kZWxicihjaGFyICoqYXJndikKK3sKKyAgY2hhciBicltJRk5BTVNJWl07CisgIHVuc2lnbmVkIGxvbmcgYXJnc1s0XSA9IHtCUkNUTF9ERUxfQlJJREdFLCAodW5zaWduZWQgbG9uZykgYnIsIDAsIDB9OworCisjaWZkZWYgU0lPQ0JSREVMQlIKKyAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0JSREVMQlIsIGFyZ3ZbMF0pOworI2Vsc2UKKyAgeHN0cm5jcHkoYnIsIGFyZ3ZbMF0sIElGTkFNU0laKTsKKyAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ1NJRkJSLCBhcmdzKTsKKyNlbmRpZgorfQorCit2b2lkIGJyX2FkZGlmKGNoYXIgKiphcmd2KQoreworICBpbnQgaW5kZXg7CisgIHN0cnVjdCBpZnJlcSBpZnI7CisgIHVuc2lnbmVkIGxvbmcgYXJnc1s0XSA9IHtCUkNUTF9BRERfSUYsIDAsIDAsIDB9OworCisgIGlmICghKGluZGV4ID0gaWZfbmFtZXRvaW5kZXgoYXJndlsxXSkpKSBwZXJyb3JfZXhpdCgiaW50ZXJmYWNlICVzIiwgYXJndlsxXSk7CisjaWZkZWYgU0lPQ0JSQURESUYKKyAgaWZyLmlmcl9pZmluZGV4ID0gaW5kZXg7CisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NCUkFERElGLCAmaWZyKTsKKyNlbHNlCisgIGFyZ3NbMV0gPSBpbmRleDsKKyAgeHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBhcmd2WzBdLCBJRk5BTVNJWik7CisgIGlmci5pZnJfZGF0YSA9IChjaGFyICopYXJnczsKKyAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworI2VuZGlmCit9CisKK3ZvaWQgYnJfZGVsaWYoY2hhciAqKmFyZ3YpCit7CisgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzdHJ1Y3QgaWZyZXEgaWZyOyAgICAgICAgICAgICAgICAgICAgICAKKyAgdW5zaWduZWQgbG9uZyBhcmdzWzRdID0ge0JSQ1RMX0RFTF9JRiwgMCwgMCwgMH07CisKKyAgaWYgKCEoaW5kZXggPSBpZl9uYW1ldG9pbmRleChhcmd2WzFdKSkpIHBlcnJvcl9leGl0KCJpbnRlcmZhY2UgJXMiLGFyZ3ZbMV0pOworI2lmZGVmIFNJT0NCUkRFTElGCisgIGlmci5pZnJfaWZpbmRleCA9IGlmaW5kZXg7CisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NCUkRFTElGLCAmaWZyKTsKKyNlbHNlCisgIGFyZ3NbMV0gPSBpbmRleDsgICAgIAorICB4c3RybmNweShpZnIuaWZyX25hbWUsIGFyZ3ZbMF0sIElGTkFNU0laKTsKKyAgaWZyLmlmcl9kYXRhID0gKGNoYXIgKilhcmdzOyAgCisgIHhpb2N0bChUVC5zb2NrZmQsIFNJT0NERVZQUklWQVRFLCAmaWZyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzdHJ0b3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKnR2LCBjaGFyICp0aW1lKQoreworICBkb3VibGUgc2VjczsKKworICBpZiAoc3NjYW5mKHRpbWUsICIlbGYiLCAmc2VjcykgIT0gMSkgZXJyb3JfZXhpdCgidGltZSBmb3JtYXQgbm90IHByb3BlciIpOworICB0di0+dHZfc2VjID0gc2VjczsKKyAgdHYtPnR2X3VzZWMgPSAxMDAwMDAwICogKHNlY3MgLSB0di0+dHZfc2VjKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHZfdG9famlmeShzdHJ1Y3QgdGltZXZhbCAqdHYpCit7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgdW5zaWduZWQgbG9uZyBsb25nIGppZnk7CisKKyAgamlmeSA9IDEwMDAwMDBVTEwgKiB0di0+dHZfc2VjICsgdHYtPnR2X3VzZWM7CisgIHJldHVybiAoamlmeS8xMDAwMCk7Cit9ICAgICAgICAgICAgICAgICAgCisKK3ZvaWQgc2V0X3RpbWUoY2hhciAqYnIsIHVuc2lnbmVkIGxvbmcgY21kLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKyAgc3RydWN0IGlmcmVxIGlmcjsKKyAgdW5zaWduZWQgbG9uZyBhcmdzWzRdID0ge2NtZCwgdmFsLCAwLCAwfTsKKworICB4c3RybmNweShpZnIuaWZyX25hbWUsIGJyLCBJRk5BTVNJWik7CisgIGlmci5pZnJfZGF0YSA9IChjaGFyICopYXJnczsKKyAgeGlvY3RsKFRULnNvY2tmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworfQorCit2b2lkIGJyX3NldF9hZ2VpbmdfdGltZShjaGFyICoqYXJndikgICAgIAoreworICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICBzdHJ0b3RpbWV2YWwoJnR2LCBhcmd2WzFdKTsKKyAgc2V0X3RpbWUoYXJndlswXSwgQlJDVExfU0VUX0FHRUlOR19USU1FLCB0dl90b19qaWZ5KCZ0dikpOworfQorCit2b2lkIGJyX3NldF9md2RfZGVsYXkoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgIHN0cnRvdGltZXZhbCgmdHYsIGFyZ3ZbMV0pOworICBzZXRfdGltZShhcmd2WzBdLCBCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVksIHR2X3RvX2ppZnkoJnR2KSk7Cit9CisKK3ZvaWQgYnJfc2V0X2hlbGxvX3RpbWUoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCB0aW1ldmFsIHR2OyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHN0cnRvdGltZXZhbCgmdHYsIGFyZ3ZbMV0pOyAgICAgICAgICAgICAgIAorICBzZXRfdGltZShhcmd2WzBdLCBCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUUsIHR2X3RvX2ppZnkoJnR2KSk7Cit9CisKK3ZvaWQgYnJfc2V0X21heF9hZ2UoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCB0aW1ldmFsIHR2OyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHN0cnRvdGltZXZhbCgmdHYsIGFyZ3ZbMV0pOyAgICAgICAgICAgICAgIAorICBzZXRfdGltZShhcmd2WzBdLCBCUkNUTF9TRVRfQlJJREdFX01BWF9BR0UsIHR2X3RvX2ppZnkoJnR2KSk7Cit9CisKK3ZvaWQgYnJfc2V0X2JyaWRnZV9wcmlvKGNoYXIgKiphcmd2KQoreworICBpbnQgcHJpbzsKKworICBpZiAoc3NjYW5mKGFyZ3ZbMV0sICIlaSIsICZwcmlvKSAhPSAxKSBlcnJvcl9leGl0KCJwcmlvIG5vdCBwcm9wZXIiKTsKKyAgc2V0X3RpbWUoYXJndlswXSwgQlJDVExfU0VUX0JSSURHRV9QUklPUklUWSwgcHJpbyk7Cit9CisKK3ZvaWQgYnJfc2V0X3N0cChjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBzdHAgeworICAgIGNoYXIgKm47CisgICAgaW50IHNldDsKKyAgfSBzc1tdID0ge3siMSIsIDF9LCB7InllcyIsIDF9LHsib24iLCAxfSwKKyAgICB7IjAiLCAwfSwgeyJubyIsIDB9LHsib2ZmIiwgMH19OworCisgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9MRU4oc3MpOyBpKyspIHsKKyAgICBpZiAoIXN0cmNtcChzc1tpXS5uLCBhcmd2WzFdKSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPj0gQVJSQVlfTEVOKHNzKSkgZXJyb3JfZXhpdCgiaW52YWxpZCBzdHAgc3RhdGUiKTsKKyAgc2V0X3RpbWUoYXJndlswXSwgQlJDVExfU0VUX0JSSURHRV9TVFBfU1RBVEUsIHNzW2ldLnNldCk7Cit9CisKK3ZvaWQgc2V0X2Nvc3RfcHJpbyhjaGFyICpiciwgY2hhciAqcG9ydCwgdW5zaWduZWQgbG9uZyBjbWQsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworICBzdHJ1Y3QgaWZyZXEgaWZyOworICBpbnQgaSwgaW5kZXgsIHBpbmRpY2VzW01BWF9CUklER0VTXTsKKyAgdW5zaWduZWQgbG9uZyBhcmdzWzRdID0ge2NtZCwgMCwgdmFsLCAwfTsKKyAgCisgIGlmICghKGluZGV4ID0gaWZfbmFtZXRvaW5kZXgocG9ydCkpKSBlcnJvcl9leGl0KCJpbnZhbGlkIHBvcnQiKTsKKyAgCisgIG1lbXNldChwaW5kaWNlcywgMCwgc2l6ZW9mKHBpbmRpY2VzKSk7CisgIGdldF9wb3J0cyhiciwgcGluZGljZXMpOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JSSURHRVM7IGkrKykgeworICAgIGlmIChpbmRleCA9PSBwaW5kaWNlc1tpXSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPj0gTUFYX0JSSURHRVMpIGVycm9yX2V4aXQoIiVzIG5vdCBpbiBicmlkZ2UiLCBwb3J0KTsKKyAgYXJnc1sxXSA9IGk7CisgIHhzdHJuY3B5KGlmci5pZnJfbmFtZSwgYnIsIElGTkFNU0laKTsKKyAgaWZyLmlmcl9kYXRhID0gKGNoYXIgKilhcmdzOworICB4aW9jdGwoVFQuc29ja2ZkLCBTSU9DREVWUFJJVkFURSwgJmlmcik7Cit9CisKK3ZvaWQgYnJfc2V0X3BhdGhfY29zdChjaGFyICoqYXJndikKK3sKKyAgaW50IGNvc3Q7CisKKyAgY29zdCA9IGF0b2x4X3JhbmdlKGFyZ3ZbMl0sIDAsIElOVF9NQVgpOworICBzZXRfY29zdF9wcmlvKGFyZ3ZbMF0sIGFyZ3ZbMV0sIEJSQ1RMX1NFVF9QQVRIX0NPU1QsIGNvc3QpOworfQorCit2b2lkIGJyX3NldF9wb3J0X3ByaW8oY2hhciAqKmFyZ3YpCit7IAorICBpbnQgcHJpbzsKKworICBwcmlvID0gYXRvbHhfcmFuZ2UoYXJndlsyXSwgMCwgSU5UX01BWCk7CisgIHNldF9jb3N0X3ByaW8oYXJndlswXSwgYXJndlsxXSwgQlJDVExfU0VUX1BPUlRfUFJJT1JJVFksIHByaW8pOworCit9CisKK3ZvaWQgYnJjdGxfbWFpbih2b2lkKQoreworICBpbnQgaTsKKyAgc3RydWN0IGNtZHMgeworICAgIGNoYXIgKmNtZDsKKyAgICBpbnQgbmFyZ3M7CisgICAgdm9pZCAoKmYpKGNoYXIgKiphcmd2KTsKKyAgfSBjY1tdID0ge3sic2hvdyIsIDAsIGJyX3Nob3d9LAorICAgIHsiYWRkYnIiLCAxLCBicl9hZGRicn0sIHsiZGVsYnIiLCAxLCBicl9kZWxicn0sCisgICAgeyJhZGRpZiIsIDIsIGJyX2FkZGlmfSwgeyJkZWxpZiIsIDIsIGJyX2RlbGlmfSwKKyAgICB7InNldGFnZWluZyIsIDIsIGJyX3NldF9hZ2VpbmdfdGltZX0sCisgICAgeyJzZXRmZCIsIDIsIGJyX3NldF9md2RfZGVsYXl9LAorICAgIHsic2V0aGVsbG8iLCAyLCBicl9zZXRfaGVsbG9fdGltZX0sCisgICAgeyJzZXRtYXhhZ2UiLCAyLCBicl9zZXRfbWF4X2FnZX0sCisgICAgeyJzZXRwYXRoY29zdCIsIDMsIGJyX3NldF9wYXRoX2Nvc3R9LAorICAgIHsic2V0cG9ydHByaW8iLCAzLCBicl9zZXRfcG9ydF9wcmlvfSwKKyAgICB7InNldGJyaWRnZXByaW8iLCAyLCBicl9zZXRfYnJpZGdlX3ByaW99LAorICAgIHsic3RwIiwgMiwgYnJfc2V0X3N0cH0sCisgIH07CisKKyAgVFQuc29ja2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIHdoaWxlICgqdG95cy5vcHRhcmdzKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX0xFTihjYyk7IGkrKykgeworICAgICAgc3RydWN0IGNtZHMgKnQgPSBjYyArIGk7CisKKyAgICAgIGlmIChzdHJjbXAodC0+Y21kLCAqdG95cy5vcHRhcmdzKSkgY29udGludWU7CisKKyAgICAgIHRveXMub3B0YXJncysrLCB0b3lzLm9wdGMtLTsKKyAgICAgIGlmICh0b3lzLm9wdGMgPCB0LT5uYXJncykgaGVscF9leGl0KCJjaGVjayBhcmdzIik7CisgICAgICB0LT5mKHRveXMub3B0YXJncyk7CisgICAgICB0b3lzLm9wdGFyZ3MgKz0gdC0+bmFyZ3M7CisgICAgICB0b3lzLm9wdGMgLT0gdC0+bmFyZ3M7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBBUlJBWV9MRU4oY2MpKSBoZWxwX2V4aXQoImludmFsaWQgb3B0aW9uICclcyciLCAqdG95cy5vcHRhcmdzKTsKKyAgfQorICB4Y2xvc2UoVFQuc29ja2ZkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvY29tcHJlc3MuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQ5ZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKiBjb21wcmVzcy5jIC0gZGVmbGF0ZS9pbmZsYXRlIGNvZGUgZm9yIHppcCwgZ3ppcCwgemxpYiwgYW5kIHJhdworICoKKyAqIENvcHlyaWdodCAyMDE0IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogVGhlIGluZmxhdGUvZGVmbGF0ZSBjb2RlIGxpdmVzIGhlcmUsIHNvIHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IHVzZSBpdAorICogZWl0aGVyIGxpdmUgaGVyZSBvciBjYWxsIHRoZXNlIGNvbW1hbmRzIHRvIHBpcGUgZGF0YSB0aHJvdWdoIHRoZW0uCisgKgorICogRGl2ZXJnZW5jZSBmcm9tIHBvc2l4OiByZXBsYWNlIG9ic29sZXRlL3BhdGVudGVkICJjb21wcmVzcyIgd2l0aCBtdXRpcGxleGVyLgorICogKGd6aXAgYWxyZWFkeSByZXBsYWNlcyAidW5jb21wcmVzcyIuKQorICoKKyAqIFNlZSBSRkNzIDE5NTAgKHpsaWIpLCAxOTUxIChkZWZsYXRlKSwgYW5kIDE5NTIgKGd6aXApCisgKiBMU0IgNC4xIGhhcyBnemlwLCBndW56aXAsIGFuZCB6Y2F0CisgKiBUT0RPOiB6aXAgLWQgRElSIC14IExJU1QgLWxpc3QgLXF1aWV0IC1ubyBvdmVyd3JpdGUgLW92ZXJ3cml0ZSAtcCB0byBzdGRvdXQKKworLy8gQWNjZXB0IG1hbnkgZGlmZmVyZW50IGtpbmRzIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudC4KKy8vIExlYXZlIExyZyBhdCBlbmQgc28gZmxhZyB2YWx1ZXMgbGluZSB1cC4KKworVVNFX0NPTVBSRVNTKE5FV1RPWShjb21wcmVzcywgInpjZDlscmdbLWNkXVshemdMcl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfR1pJUChORVdUT1koZ3ppcCwgVVNFX0daSVBfRCgiZCIpIjE5ZGNmbHFTdHZnTFJ6WyFnTFJ6XSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9aQ0FUKE5FV1RPWSh6Y2F0LCAwLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfR1VOWklQKE5FV1RPWShndW56aXAsICJjZmxxU3R2IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCisvL3ppcCB1bnppcCBnemlwIGd1bnppcCB6Y2F0CisKK2NvbmZpZyBDT01QUkVTUworICBib29sICJjb21wcmVzcyIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogY29tcHJlc3MgWy16Z0xSMTldIFtGSUxFXQorCisgICAgQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlIChvciBzdGRpbikgdXNpbmcgImRlZmxhdGUiIGFsZ29yaXRobS4KKworICAgIC0xCW1pbiBjb21wcmVzc2lvbgorICAgIC05CW1heCBjb21wcmVzc2lvbiAoZGVmYXVsdCkKKyAgICAtZwlnemlwIChkZWZhdWx0KQorICAgIC1MCXpsaWIKKyAgICAtUglyYXcKKyAgICAtegl6aXAKKworY29uZmlnIEdaSVAKKyAgYm9vbCAiZ3ppcCIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gQ09NUFJFU1MKKyAgaGVscAorICAgIHVzYWdlOiBnemlwIFstMTljZnFTdHZ6Z0xSXSBbRklMRS4uLl0KKworICAgIENvbXBlc3MgKGRlZmxhdGUpIGZpbGUocykuIFdpdGggbm8gZmlsZXMsIGNvbXByZXNzIHN0ZGluIHRvIHN0ZG91dC4KKworICAgIE9uIHN1Y2Nlc3NmdWwgZGVjb21wcmVzc2lvbiwgY29tcHJlc3NlZCBmaWxlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUKKyAgICB1bmNvbXByZXNzZWQgdmVyc2lvbi4gVGhlIGlucHV0IGZpbGUgaXMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aAorICAgIGEgbmV3IGZpbGUgd2l0aG91dCB0aGUgLmd6IGV4dGVuc2lvbiAod2l0aCBzYW1lIG93bmVyc2hpcC9wZXJtaXNzaW9ucykuCisKKyAgICAtMQlNaW5pbWFsIGNvbXByZXNzaW9uIChmYXN0ZXN0KQorICAgIC05CU1heCBjb21wcmVzc2lvbiAoZGVmYXVsdCkKKyAgICAtYwljYXQgdG8gc3Rkb3V0IChhY3QgYXMgemNhdCkKKyAgICAtZglmb3JjZSAoaWYgb3V0cHV0IGZpbGUgZXhpc3RzLCBpbnB1dCBpcyB0dHksIHVucmVjb2duaXplZCBleHRlbnNpb24pCisgICAgLXEJcXVpZXQgKG5vIHdhcm5pbmdzKQorICAgIC1TCXNwZWNpZnkgZXhlbnNpb24gKGRlZmF1bHQgLiopCisgICAgLXQJdGVzdCBjb21wcmVzc2VkIGZpbGUocykKKyAgICAtdgl2ZXJib3NlIChsaWtlIC1sLCBidXQgY29tcHJlc3MgZmlsZXMpCisKKyAgICBDb21wcmVzc2lvbiB0eXBlOgorICAgIC1nIGd6aXAgKGRlZmF1bHQpICAgIC1MIHpsaWIgICAgLVIgcmF3ICAgIC16IHppcAorCitjb25maWcgR1pJUF9ECisgIGJvb2wKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gR1pJUCAmJiBERUNPTVBSRVNTCisgIGhlbHAKKyAgICB1c2FnZTogZ3ppcCBbLWRdCisKKyAgICAtZAlkZWNvbXByZXNzIChhY3QgYXMgZ3VuemlwKQorCitjb25maWcgREVDT01QUkVTUworICBib29sICJkZWNvbXByZXNzIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBjb21wcmVzcyBbLXpnbHJjZDldIFtGSUxFXQorCisgICAgQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlIChvciBzdGRpbikgdXNpbmcgImRlZmxhdGUiIGFsZ29yaXRobS4KKworICAgIC1jCWNvbXByZXNzIHdpdGggLWcgZ3ppcCAoZGVmYXVsdCkgIC1sIHpsaWIgIC1yIHJhdyAgLXogemlwCisgICAgLWQJZGVjb21wcmVzcyAoYXV0b2RldGVjdHMgdHlwZSkKKworCitjb25maWcgWkNBVAorICBib29sICJ6Y2F0IgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBERUNPTVBSRVNTCisgIGhlbHAKKyAgICB1c2FnZTogemNhdCBbRklMRS4uLl0KKworICAgIERlY29tcHJlc3MgZGVmbGF0ZWQgZmlsZShzKSB0byBzdGRvdXQKKworY29uZmlnIEdVTlpJUAorICBib29sICJndW56aXAiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIERFQ09NUFJFU1MKKyAgaGVscAorICAgIHVzYWdlOiBndW56aXAgWy1jZmxxU3R2XSBbRklMRS4uLl0KKworICAgIERlY29tcGVzcyAoZGVmbGF0ZSkgZmlsZShzKS4gV2l0aCBubyBmaWxlcywgY29tcHJlc3Mgc3RkaW4gdG8gc3Rkb3V0LgorCisgICAgT24gc3VjY2Vzc2Z1bCBkZWNvbXByZXNzaW9uLCBjb21wcmVzc2VkIGZpbGVzIGFyZSByZXBsYWNlZCB3aXRoIHRoZQorICAgIHVuY29tcHJlc3NlZCB2ZXJzaW9uLiBUaGUgaW5wdXQgZmlsZSBpcyByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoCisgICAgYSBuZXcgZmlsZSB3aXRob3V0IHRoZSAuZ3ogZXh0ZW5zaW9uICh3aXRoIHNhbWUgb3duZXJzaGlwL3Blcm1pc3Npb25zKS4KKworICAgIC1jCWNhdCB0byBzdGRvdXQgKGFjdCBhcyB6Y2F0KQorICAgIC1mCWZvcmNlIChvdXRwdXQgZmlsZSBleGlzdHMsIGlucHV0IGlzIHR0eSwgdW5yZWNvZ25pemVkIGV4dGVuc2lvbikKKyAgICAtbAlsaXN0IGNvbXByZXNzZWQvdW5jb21wcmVzc2VkL3JhdGlvL25hbWUgZm9yIGVhY2ggaW5wdXQgZmlsZS4KKyAgICAtcQlxdWlldCAobm8gd2FybmluZ3MpCisgICAgLVMJc3BlY2lmeSBleGVuc2lvbiAoZGVmYXVsdCAuKikKKyAgICAtdAl0ZXN0IGNvbXByZXNzZWQgZmlsZShzKQorICAgIC12CXZlcmJvc2UgKGxpa2UgLWwsIGJ1dCBkZWNvbXByZXNzIGZpbGVzKQorKi8KKworI2RlZmluZSBGT1JfY29tcHJlc3MKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIC8vIEh1ZmZtYW4gY29kZXM6IGJhc2Ugb2Zmc2V0IGFuZCBleHRyYSBiaXRzIHRhYmxlcyAobGVuZ3RoIGFuZCBkaXN0YW5jZSkKKyAgY2hhciBsZW5iaXRzWzI5XSwgZGlzdGJpdHNbMzBdOworICB1bnNpZ25lZCBzaG9ydCBsZW5iYXNlWzI5XSwgZGlzdGJhc2VbMzBdOworICB2b2lkICpmaXhkaXN0aHVmZiwgKmZpeGxpdGh1ZmY7CisKKyAgLy8gQ1JDCisgIHZvaWQgKCpjcmNmdW5jKShjaGFyICpkYXRhLCBpbnQgbGVuKTsKKyAgdW5zaWduZWQgY3JjOworCisgIC8vIENvbXByZXNzZWQgZGF0YSBidWZmZXIKKyAgY2hhciAqZGF0YTsKKyAgdW5zaWduZWQgcG9zLCBsZW47CisgIGludCBpbmZkLCBvdXRmZDsKKworICAvLyBUYWJsZXMgb25seSB1c2VkIGZvciBkZWZsYXRpb24KKyAgdW5zaWduZWQgc2hvcnQgKmhhc2hoZWFkLCAqaGFzaGNoYWluOworKQorCisvLyBsaXR0bGUgZW5kaWFuIGJpdCBidWZmZXIKK3N0cnVjdCBiaXRidWYgeworICBpbnQgZmQsIGJpdHBvcywgbGVuLCBtYXg7CisgIGNoYXIgYnVmW107Cit9OworCisvLyBtYWxsb2MgYSBzdHJ1Y3QgYml0YnVmCitzdHJ1Y3QgYml0YnVmICpiaXRidWZfaW5pdChpbnQgZmQsIGludCBzaXplKQoreworICBzdHJ1Y3QgYml0YnVmICpiYiA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiaXRidWYpK3NpemUpOworCisgIGJiLT5tYXggPSBzaXplOworICBiYi0+ZmQgPSBmZDsKKworICByZXR1cm4gYmI7Cit9CisKKy8vIEFkdmFuY2UgYml0cG9zIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHJlY29yZGluZyBiaXRzCit2b2lkIGJpdGJ1Zl9za2lwKHN0cnVjdCBiaXRidWYgKmJiLCBpbnQgYml0cykKK3sKKyAgaW50IHBvcyA9IGJiLT5iaXRwb3MgKyBiaXRzLCBsZW4gPSBiYi0+bGVuIDw8IDM7CisKKyAgd2hpbGUgKHBvcyA+PSBsZW4pIHsKKyAgICBwb3MgLT0gbGVuOworICAgIGxlbiA9IChiYi0+bGVuID0gcmVhZChiYi0+ZmQsIGJiLT5idWYsIGJiLT5tYXgpKSA8PCAzOworICAgIGlmIChiYi0+bGVuIDwgMSkgcGVycm9yX2V4aXQoImluZmxhdGUgRU9GIik7CisgIH0KKyAgYmItPmJpdHBvcyA9IHBvczsKK30KKworLy8gT3B0aW1pemVkIHNpbmdsZSBiaXQgaW5saW5lZCB2ZXJzaW9uCitzdGF0aWMgaW5saW5lIGludCBiaXRidWZfYml0KHN0cnVjdCBiaXRidWYgKmJiKQoreworICBpbnQgYnVmcG9zID0gYmItPmJpdHBvcz4+MzsKKworICBpZiAoYnVmcG9zID09IGJiLT5sZW4pIHsKKyAgICBiaXRidWZfc2tpcChiYiwgMCk7CisgICAgYnVmcG9zID0gMDsKKyAgfQorCisgIHJldHVybiAoYmItPmJ1ZltidWZwb3NdPj4oYmItPmJpdHBvcysrJjcpKSYxOworfQorCisvLyBGZXRjaCB0aGUgbmV4dCBYIGJpdHMgZnJvbSB0aGUgYml0YnVmLCBsaXR0bGUgZW5kaWFuCit1bnNpZ25lZCBiaXRidWZfZ2V0KHN0cnVjdCBiaXRidWYgKmJiLCBpbnQgYml0cykKK3sKKyAgaW50IHJlc3VsdCA9IDAsIG9mZnNldCA9IDA7CisKKyAgd2hpbGUgKGJpdHMpIHsKKyAgICBpbnQgY2xpY2sgPSBiYi0+Yml0cG9zID4+IDMsIGJsb3csIGJsZW47CisKKyAgICAvLyBMb2FkIG1vcmUgZGF0YSBpZiBidWZmZXIgZW1wdHkKKyAgICBpZiAoY2xpY2sgPT0gYmItPmxlbikgYml0YnVmX3NraXAoYmIsIGNsaWNrID0gMCk7CisKKyAgICAvLyBncmFiIGJpdHMgZnJvbSBuZXh0IGJ5dGUKKyAgICBibG93ID0gYmItPmJpdHBvcyAmIDc7CisgICAgYmxlbiA9IDgtYmxvdzsKKyAgICBpZiAoYmxlbiA+IGJpdHMpIGJsZW4gPSBiaXRzOworICAgIHJlc3VsdCB8PSAoKGJiLT5idWZbY2xpY2tdID4+IGJsb3cpICYgKCgxPDxibGVuKS0xKSkgPDwgb2Zmc2V0OworICAgIG9mZnNldCArPSBibGVuOworICAgIGJpdHMgLT0gYmxlbjsKKyAgICBiYi0+Yml0cG9zICs9IGJsZW47CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGJpdGJ1Zl9mbHVzaChzdHJ1Y3QgYml0YnVmICpiYikKK3sKKyAgaWYgKCFiYi0+Yml0cG9zKSByZXR1cm47CisKKyAgeHdyaXRlKGJiLT5mZCwgYmItPmJ1ZiwgKGJiLT5iaXRwb3MrNykvOCk7CisgIG1lbXNldChiYi0+YnVmLCAwLCBiYi0+bWF4KTsKKyAgYmItPmJpdHBvcyA9IDA7Cit9CisKK3ZvaWQgYml0YnVmX3B1dChzdHJ1Y3QgYml0YnVmICpiYiwgaW50IGRhdGEsIGludCBsZW4pCit7CisgIHdoaWxlIChsZW4pIHsKKyAgICBpbnQgY2xpY2sgPSBiYi0+Yml0cG9zID4+IDMsIGJsb3csIGJsZW47CisKKyAgICAvLyBGbHVzaCBidWZmZXIgaWYgbmVjZXNzYXJ5CisgICAgaWYgKGNsaWNrID09IGJiLT5tYXgpIHsKKyAgICAgIGJpdGJ1Zl9mbHVzaChiYik7CisgICAgICBjbGljayA9IDA7CisgICAgfQorICAgIGJsb3cgPSBiYi0+Yml0cG9zICYgNzsKKyAgICBibGVuID0gOC1ibG93OworICAgIGlmIChibGVuID4gbGVuKSBibGVuID0gbGVuOworICAgIGJiLT5idWZbY2xpY2tdIHw9IGRhdGEgPDwgYmxvdzsKKyAgICBiYi0+Yml0cG9zICs9IGJsZW47CisgICAgZGF0YSA+Pj0gYmxlbjsKKyAgICBsZW4gLT0gYmxlbjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfYnl0ZShjaGFyIHN5bSkKK3sKKyAgaW50IHBvcyA9IFRULnBvcysrICYgMzI3Njc7CisKKyAgVFQuZGF0YVtwb3NdID0gc3ltOworCisgIGlmICghcG9zKSB7CisgICAgeHdyaXRlKFRULm91dGZkLCBUVC5kYXRhLCAzMjc2OCk7CisgICAgaWYgKFRULmNyY2Z1bmMpIFRULmNyY2Z1bmMoVFQuZGF0YSwgMzI3NjgpOworICB9Cit9CisKKy8vIEh1ZmZtYW4gY29kaW5nIHVzZXMgYml0cyB0byB0cmF2ZXJzZSBhIGJpbmFyeSB0cmVlIHRvIGEgbGVhZiBub2RlLAorLy8gQnkgcGxhY2luZyBmcmVxdWVudGx5IG9jY3VycmluZyBzeW1ib2xzIGF0IHNob3J0ZXIgcGF0aHMsIGZyZXF1ZW50bHkKKy8vIHVzZWQgc3ltYm9scyBtYXkgYmUgcmVwcmVzZW50ZWQgaW4gZmV3ZXIgYml0cyB0aGFuIHVuY29tbW9uIHN5bWJvbHMuCisKK3N0cnVjdCBodWZmIHsKKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoWzE2XTsKKyAgdW5zaWduZWQgc2hvcnQgc3ltYm9sWzI4OF07Cit9OworCisvLyBDcmVhdGUgc2ltcGxlIGh1ZmZtYW4gdHJlZSBmcm9tIGFycmF5IG9mIGJpdCBsZW5ndGhzLgorCisvLyBUaGUgc3ltYm9scyBpbiB0aGUgaHVmZm1hbiB0cmVlcyBhcmUgc29ydGVkIChmaXJzdCBieSBiaXQgbGVuZ3RoCisvLyBvZiB0aGUgY29kZSB0byByZWFjaCB0aGVtLCB0aGVuIGJ5IHN5bWJvbCBudW1iZXIpLiBUaGlzIG1lYW5zIHRoYXQgZ2l2ZW4KKy8vIHRoZSBiaXQgbGVuZ3RoIG9mIGVhY2ggc3ltYm9sLCB3ZSBjYW4gY29uc3RydWN0IGEgdW5pcXVlIHRyZWUuCitzdGF0aWMgdm9pZCBsZW4yaHVmZihzdHJ1Y3QgaHVmZiAqaHVmZiwgY2hhciBiaXRsZW5bXSwgaW50IGxlbikKK3sKKyAgaW50IG9mZnNldFsxNl07CisgIGludCBpOworCisgIC8vIENvdW50IG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGgKKyAgbWVtc2V0KGh1ZmYsIDAsIHNpemVvZihzdHJ1Y3QgaHVmZikpOworICBmb3IgKGkgPSAwOyBpPGxlbjsgaSsrKSBodWZmLT5sZW5ndGhbYml0bGVuW2ldXSsrOworCisgIC8vIFNvcnQgc3ltYm9scyBieSBiaXQgbGVuZ3RoLiAoVGhleSdsbCByZW1haW4gc29ydGVkIGJ5IHN5bWJvbCB3aXRoaW4gdGhhdC4pCisgICpodWZmLT5sZW5ndGggPSAqb2Zmc2V0ID0gMDsKKyAgZm9yIChpID0gMTsgaTwxNjsgaSsrKSBvZmZzZXRbaV0gPSBvZmZzZXRbaS0xXSArIGh1ZmYtPmxlbmd0aFtpLTFdOworCisgIGZvciAoaSA9IDA7IGk8bGVuOyBpKyspIGlmIChiaXRsZW5baV0pIGh1ZmYtPnN5bWJvbFtvZmZzZXRbYml0bGVuW2ldXSsrXSA9IGk7Cit9CisKKy8vIEZldGNoIGFuZCBkZWNvZGUgbmV4dCBodWZmbWFuIGNvZGVkIHN5bWJvbCBmcm9tIGJpdGJ1Zi4KKy8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzb3J0aW5nIHRvIG5hdmlnYXRlIHRoZSB0cmVlIGFzIGFuIGFycmF5OgorLy8gZWFjaCB0aW1lIHdlIGZldGNoIGEgYml0IHdlIGhhdmUgYWxsIHRoZSBjb2RlcyBhdCB0aGF0IGJpdCBsZXZlbCBpbgorLy8gb3JkZXIgd2l0aCBubyBnYXBzLgorc3RhdGljIHVuc2lnbmVkIGh1ZmZfYW5kX3B1ZmYoc3RydWN0IGJpdGJ1ZiAqYmIsIHN0cnVjdCBodWZmICpodWZmKQoreworICB1bnNpZ25lZCBzaG9ydCAqbGVuZ3RoID0gaHVmZi0+bGVuZ3RoOworICBpbnQgc3RhcnQgPSAwLCBvZmZzZXQgPSAwOworCisgIC8vIFRyYXZlcnNlIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIHVudGlsIG91ciBjb2RlIGlzIGluIHRoaXMgcmFuZ2UKKyAgZm9yICg7OykgeworICAgIG9mZnNldCA9IChvZmZzZXQgPDwgMSkgfCBiaXRidWZfYml0KGJiKTsKKyAgICBzdGFydCArPSAqKytsZW5ndGg7CisgICAgaWYgKChvZmZzZXQgLT0gKmxlbmd0aCkgPCAwKSBicmVhazsKKyAgICBpZiAoKGxlbmd0aCAtIGh1ZmYtPmxlbmd0aCkgJiAxNikgZXJyb3JfZXhpdCgiYmFkIHN5bWJvbCIpOworICB9CisKKyAgcmV0dXJuIGh1ZmYtPnN5bWJvbFtzdGFydCArIG9mZnNldF07Cit9CisKKy8vIERlY29tcHJlc3MgZGVmbGF0ZWQgZGF0YSBmcm9tIGJpdGJ1ZiB0byBUVC5vdXRmZC4KK3N0YXRpYyB2b2lkIGluZmxhdGUoc3RydWN0IGJpdGJ1ZiAqYmIpCit7CisgIFRULmNyYyA9IH4wOworICAvLyByZXBlYXQgdW50aWwgc3BhbmtlZAorICBmb3IgKDs7KSB7CisgICAgaW50IGZpbmFsLCB0eXBlOworCisgICAgZmluYWwgPSBiaXRidWZfZ2V0KGJiLCAxKTsKKyAgICB0eXBlID0gYml0YnVmX2dldChiYiwgMik7CisKKyAgICBpZiAodHlwZSA9PSAzKSBlcnJvcl9leGl0KCJiYWQgdHlwZSIpOworCisgICAgLy8gVW5jb21wcmVzc2VkIGJsb2NrPworICAgIGlmICghdHlwZSkgeworICAgICAgaW50IGxlbiwgbmxlbjsKKworICAgICAgLy8gQWxpZ24gdG8gYnl0ZSwgcmVhZCBsZW5ndGgKKyAgICAgIGJpdGJ1Zl9za2lwKGJiLCAoOC1iYi0+Yml0cG9zKSY3KTsKKyAgICAgIGxlbiA9IGJpdGJ1Zl9nZXQoYmIsIDE2KTsKKyAgICAgIG5sZW4gPSBiaXRidWZfZ2V0KGJiLCAxNik7CisgICAgICBpZiAobGVuICE9ICgweGZmZmYgJiB+bmxlbikpIGVycm9yX2V4aXQoImJhZCBsZW4iKTsKKworICAgICAgLy8gRHVtcCBsaXRlcmFsIG91dHB1dCBkYXRhCisgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgIGludCBwb3MgPSBiYi0+Yml0cG9zID4+IDMsIGJibGVuID0gYmItPmxlbiAtIHBvczsKKyAgICAgICAgY2hhciAqcCA9IGJiLT5idWYrcG9zOworCisgICAgICAgIC8vIGR1bXAgYnl0ZXMgdW50aWwgZG9uZSBvciBlbmQgb2YgY3VycmVudCBiaXRidWYgY29udGVudHMKKyAgICAgICAgaWYgKGJibGVuID4gbGVuKSBiYmxlbiA9IGxlbjsKKyAgICAgICAgcG9zID0gYmJsZW47CisgICAgICAgIHdoaWxlIChwb3MtLSkgb3V0cHV0X2J5dGUoKihwKyspKTsKKyAgICAgICAgYml0YnVmX3NraXAoYmIsIGJibGVuIDw8IDMpOworICAgICAgICBsZW4gLT0gYmJsZW47CisgICAgICB9CisKKyAgICAvLyBDb21wcmVzc2VkIGJsb2NrCisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBodWZmICpkaXN0aHVmZiwgKmxpdGh1ZmY7CisKKyAgICAgIC8vIER5bmFtaWMgaHVmZm1hbiBjb2Rlcz8KKyAgICAgIGlmICh0eXBlID09IDIpIHsKKyAgICAgICAgc3RydWN0IGh1ZmYgKmgyID0gKChzdHJ1Y3QgaHVmZiAqKXRveWJ1ZikrMTsKKyAgICAgICAgaW50IGksIGxpdGxlbiwgZGlzdGxlbiwgaHVmZmxlbjsKKyAgICAgICAgY2hhciAqaHVmZmxlbl9vcmRlciA9ICJceDEwXHgxMVx4MTJcMFx4MDhceDA3XHgwOVx4MDZceDBhXHgwNVx4MGIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwNFx4MGNceDAzXHgwZFx4MDJceDBlXHgwMVx4MGYiLCAqYml0czsKKworICAgICAgICAvLyBUaGUgaHVmZm1hbiB0cmVlcyBhcmUgc3RvcmVkIGFzIGEgc2VyaWVzIG9mIGJpdCBsZW5ndGhzCisgICAgICAgIGxpdGxlbiA9IGJpdGJ1Zl9nZXQoYmIsIDUpKzI1NzsgIC8vIG1heCAyODgKKyAgICAgICAgZGlzdGxlbiA9IGJpdGJ1Zl9nZXQoYmIsIDUpKzE7ICAgLy8gbWF4IDMyCisgICAgICAgIGh1ZmZsZW4gPSBiaXRidWZfZ2V0KGJiLCA0KSs0OyAgIC8vIG1heCAxOQorCisgICAgICAgIC8vIFRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlcyBhcmUgdGhlbXNlbHZlcyBjb21wcmVzc2VkLCBpbgorICAgICAgICAvLyBhIGNvbXBsaWNhdGVkIHdheTogYW4gYXJyYXkgb2YgYml0IGxlbmd0aHMgKGh1ZmZsZW4gbWFueQorICAgICAgICAvLyBlbnRyaWVzLCBlYWNoIDMgYml0cykgaXMgdXNlZCB0byBmaWxsIG91dCBhbiBhcnJheSBvZiAxOSBlbnRyaWVzCisgICAgICAgIC8vIGluIGEgbWFnaWMgb3JkZXIsIGxlYXZpbmcgdGhlIHJlc3QgMC4gVGhlbiBtYWtlIGEgdHJlZSBvdXQgb2YgaXQ6CisgICAgICAgIG1lbXNldChiaXRzID0gdG95YnVmKzEsIDAsIDE5KTsKKyAgICAgICAgZm9yIChpPTA7IGk8aHVmZmxlbjsgaSsrKSBiaXRzW2h1ZmZsZW5fb3JkZXJbaV1dID0gYml0YnVmX2dldChiYiwgMyk7CisgICAgICAgIGxlbjJodWZmKGgyLCBiaXRzLCAxOSk7CisKKyAgICAgICAgLy8gVXNlIHRoYXQgdHJlZSB0byByZWFkIGluIHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSBiaXQgbGVuZ3RocworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGl0bGVuICsgZGlzdGxlbjspIHsKKyAgICAgICAgICBpbnQgc3ltID0gaHVmZl9hbmRfcHVmZihiYiwgaDIpOworCisgICAgICAgICAgLy8gMC0xNSBhcmUgbGl0ZXJhbHMsIDE2ID0gcmVwZWF0IHByZXZpb3VzIGNvZGUgMy02IHRpbWVzLAorICAgICAgICAgIC8vIDE3ID0gMy0xMCB6ZXJvZXMgKDMgYml0KSwgMTggPSAxMS0xMzggemVyb2VzICg3IGJpdCkKKyAgICAgICAgICBpZiAoc3ltIDwgMTYpIGJpdHNbaSsrXSA9IHN5bTsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzeW0gJiAyOworCisgICAgICAgICAgICBsZW4gPSBiaXRidWZfZ2V0KGJiLCBzeW0tMTQrbGVuKyhsZW4+PjEpKSArIDMgKyAobGVuPDwyKTsKKyAgICAgICAgICAgIG1lbXNldChiaXRzK2ksIGJpdHNbaS0xXSAqICEoc3ltJjMpLCBsZW4pOworICAgICAgICAgICAgaSArPSBsZW47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID4gbGl0bGVuK2Rpc3RsZW4pIGVycm9yX2V4aXQoImJhZCB0cmVlIik7CisKKyAgICAgICAgbGVuMmh1ZmYobGl0aHVmZiA9IGgyLCBiaXRzLCBsaXRsZW4pOworICAgICAgICBsZW4yaHVmZihkaXN0aHVmZiA9ICgoc3RydWN0IGh1ZmYgKil0b3lidWYpKzIsIGJpdHMrbGl0bGVuLCBkaXN0bGVuKTsKKworICAgICAgLy8gU3RhdGljIGh1ZmZtYW4gY29kZXMKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpdGh1ZmYgPSBUVC5maXhsaXRodWZmOworICAgICAgICBkaXN0aHVmZiA9IFRULmZpeGRpc3RodWZmOworICAgICAgfQorCisgICAgICAvLyBVc2UgaHVmZm1hbiB0YWJsZXMgdG8gZGVjb2RlIGJsb2NrIG9mIGNvbXByZXNzZWQgc3ltYm9scworICAgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3ltID0gaHVmZl9hbmRfcHVmZihiYiwgbGl0aHVmZik7CisKKyAgICAgICAgLy8gTGl0ZXJhbD8KKyAgICAgICAgaWYgKHN5bSA8IDI1Nikgb3V0cHV0X2J5dGUoc3ltKTsKKworICAgICAgICAvLyBDb3B5IHJhbmdlPworICAgICAgICBlbHNlIGlmIChzeW0gPiAyNTYpIHsKKyAgICAgICAgICBpbnQgbGVuLCBkaXN0OworCisgICAgICAgICAgc3ltIC09IDI1NzsKKyAgICAgICAgICBsZW4gPSBUVC5sZW5iYXNlW3N5bV0gKyBiaXRidWZfZ2V0KGJiLCBUVC5sZW5iaXRzW3N5bV0pOworICAgICAgICAgIHN5bSA9IGh1ZmZfYW5kX3B1ZmYoYmIsIGRpc3RodWZmKTsKKyAgICAgICAgICBkaXN0ID0gVFQuZGlzdGJhc2Vbc3ltXSArIGJpdGJ1Zl9nZXQoYmIsIFRULmRpc3RiaXRzW3N5bV0pOworICAgICAgICAgIHN5bSA9IFRULnBvcyAmIDMyNzY3OworCisgICAgICAgICAgd2hpbGUgKGxlbi0tKSBvdXRwdXRfYnl0ZShUVC5kYXRhWyhUVC5wb3MtZGlzdCkgJiAzMjc2N10pOworCisgICAgICAgIC8vIEVuZCBvZiBibG9jaworICAgICAgICB9IGVsc2UgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gV2FzIHRoYXQgdGhlIGxhc3QgYmxvY2s/CisgICAgaWYgKGZpbmFsKSBicmVhazsKKyAgfQorCisgIGlmIChUVC5wb3MgJiAzMjc2NykgeworICAgIHh3cml0ZShUVC5vdXRmZCwgVFQuZGF0YSwgVFQucG9zICYgMzI3NjcpOworICAgIGlmIChUVC5jcmNmdW5jKSBUVC5jcmNmdW5jKFRULmRhdGEsIFRULnBvcyAmIDMyNzY3KTsKKyAgfQorfQorCisvLyBEZWZsYXRlIGZyb20gVFQuaW5mZCB0byBiaXRidWYKKy8vIEZvciBkZWZsYXRlLCBUVC5sZW4gPSBpbnB1dCByZWFkLCBUVC5wb3MgPSBpbnB1dCBjb25zdW1lZAorc3RhdGljIHZvaWQgZGVmbGF0ZShzdHJ1Y3QgYml0YnVmICpiYikKK3sKKyAgY2hhciAqZGF0YSA9IFRULmRhdGE7CisgIGludCBsZW4sIGZpbmFsID0gMDsKKworICBUVC5jcmMgPSB+MDsKKworICB3aGlsZSAoIWZpbmFsKSB7CisgICAgLy8gUmVhZCBuZXh0IGhhbGYtd2luZG93IG9mIGRhdGEgaWYgd2UgaGF2ZW4ndCBoaXQgRU9GIHlldC4KKyAgICBsZW4gPSByZWFkYWxsKFRULmluZmQsIGRhdGErKFRULmxlbiYzMjc2OCksIDMyNzY4KTsKKyAgICBpZiAobGVuIDwgMCkgcGVycm9yX2V4aXQoInJlYWQiKTsgLy8gdG9kbzogYWRkIGZpbGVuYW1lCisgICAgaWYgKGxlbiAhPSAzMjc2OCkgZmluYWwrKzsKKyAgICBpZiAoVFQuY3JjZnVuYykgVFQuY3JjZnVuYyhkYXRhKyhUVC5sZW4mMzI3NjgpLCBsZW4pOworICAgIC8vIFRULmxlbiArPSBsZW47ICBjcmNmdW5jIGFkdmFuY2VzIGxlbgorCisgICAgLy8gc3RvcmUgYmxvY2sgYXMgbGl0ZXJhbAorICAgIGJpdGJ1Zl9wdXQoYmIsIGZpbmFsLCAxKTsKKyAgICBiaXRidWZfcHV0KGJiLCAwLCAxKTsKKworICAgIGJpdGJ1Zl9wdXQoYmIsIDAsICg4LWJiLT5iaXRwb3MpJjcpOworICAgIGJpdGJ1Zl9wdXQoYmIsIGxlbiwgMTYpOworICAgIGJpdGJ1Zl9wdXQoYmIsIDB4ZmZmZiAmIH5sZW4sIDE2KTsKKworICAgIC8vIHJlcGVhdCB1bnRpbCBzcGFua2VkCisgICAgd2hpbGUgKFRULnBvcyAhPSBUVC5sZW4pIHsKKyAgICAgIHVuc2lnbmVkIHBvcyA9IFRULnBvcyAmIDY1NTM1OworCisgICAgICBiaXRidWZfcHV0KGJiLCBkYXRhW3Bvc10sIDgpOworCisgICAgICAvLyBuZWVkIHRvIHJlZmlsbCBidWZmZXI/CisgICAgICBpZiAoISgzMjc2NyAmICsrVFQucG9zKSAmJiAhZmluYWwpIGJyZWFrOworICAgIH0KKyAgfQorICBiaXRidWZfZmx1c2goYmIpOworfQorCisvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGRlZmxhdGUvaW5mbGF0ZS4KK3N0YXRpYyB2b2lkIGluaXRfZGVmbGF0ZShpbnQgY29tcHJlc3MpCit7CisgIGludCBpLCBuID0gMTsKKworICAvLyBjb21wcmVzcyBuZWVkcyA2NGsgZGF0YSBhbmQgMzJrIGVhY2ggZm9yIGhhc2hoZWFkIGFuZCBoYXNoY2hhaW4uCisgIC8vIGRlY29tcHJlc3MganVzdCBuZWVkcyAzMmsgZGF0YS4KKyAgVFQuZGF0YSA9IHhtYWxsb2MoMzI3NjgqKGNvbXByZXNzID8gNCA6IDEpKTsKKyAgaWYgKGNvbXByZXNzKSB7CisgICAgVFQuaGFzaGhlYWQgPSAodW5zaWduZWQgc2hvcnQgKikoVFQuZGF0YSArIDY1NTM2KTsKKyAgICBUVC5oYXNoY2hhaW4gPSAodW5zaWduZWQgc2hvcnQgKikoVFQuZGF0YSArIDY1NTM2ICsgMzI3NjgpOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIGxlbmJpdHMsIGxlbmJhc2UsIGRpc3RiaXRzLCBkaXN0YmFzZQorICAqVFQubGVuYmFzZSA9IDM7CisgIGZvciAoaSA9IDA7IGk8c2l6ZW9mKFRULmxlbmJpdHMpLTE7IGkrKykgeworICAgIGlmIChpPjQpIHsKKyAgICAgIGlmICghKGkmMykpIHsKKyAgICAgICAgVFQubGVuYml0c1tpXSsrOworICAgICAgICBuIDw8PSAxOworICAgICAgfQorICAgICAgaWYgKGkgPT0gMjcpIG4tLTsKKyAgICAgIGVsc2UgVFQubGVuYml0c1tpKzFdID0gVFQubGVuYml0c1tpXTsKKyAgICB9CisgICAgVFQubGVuYmFzZVtpKzFdID0gbiArIFRULmxlbmJhc2VbaV07CisgIH0KKyAgbiA9IDA7CisgIGZvciAoaSA9IDA7IGk8c2l6ZW9mKFRULmRpc3RiaXRzKTsgaSsrKSB7CisgICAgVFQuZGlzdGJhc2VbaV0gPSAxPDxuOworICAgIGlmIChpKSBUVC5kaXN0YmFzZVtpXSArPSBUVC5kaXN0YmFzZVtpLTFdOworICAgIGlmIChpPjMgJiYgIShpJjEpKSBuKys7CisgICAgVFQuZGlzdGJpdHNbaV0gPSBuOworICB9CisKKyAgLy8gSW5pdCBmaXhlZCBodWZmbWFuIHRhYmxlcworICBmb3IgKGk9MDsgaTwyODg7IGkrKykgdG95YnVmW2ldID0gOCArIChpPjE0MykgLSAoKGk+MjU1KTw8MSkgKyAoaT4yNzkpOworICBsZW4yaHVmZihUVC5maXhsaXRodWZmID0gKChzdHJ1Y3QgaHVmZiAqKXRveWJ1ZikrMywgdG95YnVmLCAyODgpOworICBtZW1zZXQodG95YnVmLCA1LCAzMCk7CisgIGxlbjJodWZmKFRULmZpeGRpc3RodWZmID0gKChzdHJ1Y3QgaHVmZiAqKXRveWJ1ZikrNCwgdG95YnVmLCAzMCk7Cit9CisKKy8vIFJldHVybiB0cnVlL2ZhbHNlIHdoZXRoZXIgd2UgY29uc3VtZWQgYSBnemlwIGhlYWRlci4KK3N0YXRpYyBpbnQgaXNfZ3ppcChzdHJ1Y3QgYml0YnVmICpiYikKK3sKKyAgaW50IGZsYWdzOworCisgIC8vIENvbmZpcm0gc2lnbmF0dXJlCisgIGlmIChiaXRidWZfZ2V0KGJiLCAyNCkgIT0gMHgwODhiMWYgfHwgKGZsYWdzID0gYml0YnVmX2dldChiYiwgOCkpID4gMzEpCisgICAgcmV0dXJuIDA7CisgIGJpdGJ1Zl9za2lwKGJiLCA2KjgpOworCisgIC8vIFNraXAgZXh0cmEsIG5hbWUsIGNvbW1lbnQsIGhlYWRlciBDUkMgZmllbGRzCisgIGlmIChmbGFncyAmIDQpIGJpdGJ1Zl9za2lwKGJiLCAxNik7CisgIGlmIChmbGFncyAmIDgpIHdoaWxlIChiaXRidWZfZ2V0KGJiLCA4KSk7CisgIGlmIChmbGFncyAmIDE2KSB3aGlsZSAoYml0YnVmX2dldChiYiwgOCkpOworICBpZiAoZmxhZ3MgJiAyKSBiaXRidWZfc2tpcChiYiwgMTYpOworCisgIHJldHVybiAxOworfQorCit2b2lkIGd6aXBfY3JjKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisgIGludCBpOworICB1bnNpZ25lZCBjcmMsICpjcmNfdGFibGUgPSAodW5zaWduZWQgKikodG95YnVmK3NpemVvZih0b3lidWYpLTEwMjQpOworCisgIGNyYyA9IFRULmNyYzsKKyAgZm9yIChpPTA7IGk8bGVuOyBpKyspIGNyYyA9IGNyY190YWJsZVsoY3JjXmRhdGFbaV0pJjB4ZmZdIF4gKGNyYz4+OCk7CisgIFRULmNyYyA9IGNyYzsKKyAgVFQubGVuICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgZG9fZ3ppcChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBiaXRidWYgKmJiID0gYml0YnVmX2luaXQoMSwgc2l6ZW9mKHRveWJ1ZikpOworCisgIC8vIEhlYWRlciBmcm9tIFJGQyAxOTUyIHNlY3Rpb24gMi4yOgorICAvLyAyIElEIGJ5dGVzICgxRiwgOGIpLCBnemlwIG1ldGhvZCBieXRlICg4PWRlZmxhdGUpLCBGTEFHIGJ5dGUgKG5vbmUpLAorICAvLyA0IGJ5dGUgTVRJTUUgKHplcm9lZCksIEV4dHJhIEZsYWdzICgyPW1heGltdW0gY29tcHJlc3Npb24pLAorICAvLyBPcGVyYXRpbmcgU3lzdGVtIChGRj11bmtub3duKQorIAorICBUVC5pbmZkID0gZmQ7CisgIHh3cml0ZShiYi0+ZmQsICJceDFmXHg4Ylx4MDhcMFwwXDBcMFwwXHgwMlx4ZmYiLCAxMCk7CisKKyAgLy8gVXNlIGxhc3QgMWsgb2YgdG95YnVmIGZvciBsaXR0bGUgZW5kaWFuIGNyYyB0YWJsZQorICBjcmNfaW5pdCgodW5zaWduZWQgKikodG95YnVmK3NpemVvZih0b3lidWYpLTEwMjQpLCAxKTsKKyAgVFQuY3JjZnVuYyA9IGd6aXBfY3JjOworCisgIGRlZmxhdGUoYmIpOworCisgIC8vIHRhaWw6IGNyYzMyLCBsZW4zMgorCisgIGJpdGJ1Zl9wdXQoYmIsIDAsICg4LWJiLT5iaXRwb3MpJjcpOworICBiaXRidWZfcHV0KGJiLCB+VFQuY3JjLCAzMik7CisgIGJpdGJ1Zl9wdXQoYmIsIFRULmxlbiwgMzIpOworCisgIGJpdGJ1Zl9mbHVzaChiYik7CisgIGZyZWUoYmIpOworfQorCitzdGF0aWMgdm9pZCBkb196Y2F0KGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IGJpdGJ1ZiAqYmIgPSBiaXRidWZfaW5pdChmZCwgc2l6ZW9mKHRveWJ1ZikpOworCisgIGlmICghaXNfZ3ppcChiYikpIGVycm9yX2V4aXQoIm5vdCBnemlwIik7CisgIFRULm91dGZkID0gMTsKKworICAvLyBVc2UgbGFzdCAxayBvZiB0b3lidWYgZm9yIGxpdHRsZSBlbmRpYW4gY3JjIHRhYmxlCisgIGNyY19pbml0KCh1bnNpZ25lZCAqKSh0b3lidWYrc2l6ZW9mKHRveWJ1ZiktMTAyNCksIDEpOworICBUVC5jcmNmdW5jID0gZ3ppcF9jcmM7CisKKyAgaW5mbGF0ZShiYik7CisKKyAgLy8gdGFpbDogY3JjMzIsIGxlbjMyCisKKyAgYml0YnVmX3NraXAoYmIsICg4LWJiLT5iaXRwb3MpJjcpOworICBpZiAoflRULmNyYyAhPSBiaXRidWZfZ2V0KGJiLCAzMikgfHwgVFQubGVuICE9IGJpdGJ1Zl9nZXQoYmIsIDMyKSkKKyAgICBlcnJvcl9leGl0KCJiYWQgY3JjIik7CisgIGZyZWUoYmIpOworfQorCisvLyBQYXJzZSBtYW55IGRpZmZlcmVudCBraW5kcyBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnQ6CisKK3ZvaWQgY29tcHJlc3NfbWFpbih2b2lkKQoreworICAvLyB0b2RvOiB0aGlzCisgIHByaW50ZigiaGVsbG8gd29ybGQiKTsKK30KKworLy8jZGVmaW5lIENMRUFOVVBfY29tcHJlc3MKKy8vI2RlZmluZSBGT1JfemNhdAorLy8jaW5jbHVkZSAiZ2VuZXJhdGVkL2ZsYWdzLmgiCisKK3ZvaWQgemNhdF9tYWluKHZvaWQpCit7CisgIGluaXRfZGVmbGF0ZSgwKTsKKworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb196Y2F0KTsKK30KKwordm9pZCBndW56aXBfbWFpbih2b2lkKQoreworICBpbml0X2RlZmxhdGUoMCk7CisKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9femNhdCk7Cit9CisKK3ZvaWQgZ3ppcF9tYWluKHZvaWQpCit7CisgIGluaXRfZGVmbGF0ZSgxKTsKKworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19nemlwKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvY3JvbmQuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvY3JvbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjhiNWYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9jcm9uZC5jCkBAIC0wLDAgKzEsNjgyIEBACisvKiBjcm9uZC5jIC0gZGFlbW9uIHRvIGV4ZWN1dGUgc2NoZWR1bGVkIGNvbW1hbmRzLgorICoKKyAqIENvcHlyaWdodCAyMDE0IFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZAorCitVU0VfQ1JPTkQoTkVXVE9ZKGNyb25kLCAiZmJTbCM8MD04ZCM8MEw6YzpbLWJmXVstTFNdWy1sZF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBDUk9ORAorICBib29sICJjcm9uZCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogY3JvbmQgWy1mYlNdIFstbCBOXSBbLWQgTl0gWy1MIExPR0ZJTEVdIFstYyBESVJdCisKKyAgICBBIGRhZW1vbiB0byBleGVjdXRlIHNjaGVkdWxlZCBjb21tYW5kcy4KKworICAgIC1iIEJhY2tncm91bmQgKGRlZmF1bHQpCisgICAgLWMgY3JvbnRhYiBkaXIKKyAgICAtZCBTZXQgbG9nIGxldmVsLCBsb2cgdG8gc3RkZXJyCisgICAgLWYgRm9yZWdyb3VuZAorICAgIC1sIFNldCBsb2cgbGV2ZWwuIDAgaXMgdGhlIG1vc3QgdmVyYm9zZSwgZGVmYXVsdCA4CisgICAgLVMgTG9nIHRvIHN5c2xvZyAoZGVmYXVsdCkKKyAgICAtTCBMb2cgdG8gZmlsZQorKi8KKworI2RlZmluZSBGT1JfY3JvbmQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmNyb250YWJzX2RpcjsKKyAgY2hhciAqbG9nZmlsZTsKKyAgaW50IGxvZ2xldmVsX2Q7CisgIGludCBsb2dsZXZlbDsKKworICB0aW1lX3QgY3JvbnRhYnNfZGlyX210aW1lOworICB1aW50OF90IGZsYWdkOworKQorCit0eXBlZGVmIHN0cnVjdCBfdmFyIHsKKyAgc3RydWN0IF92YXIgKm5leHQsICpwcmV2OworICBjaGFyICpuYW1lLCAqdmFsOworfSBWQVI7CisKK3R5cGVkZWYgc3RydWN0IF9qb2IgeworICBzdHJ1Y3QgX2pvYiAqbmV4dCwgKnByZXY7CisgIGNoYXIgbWluWzYwXSwgaG91clsyNF0sIGRvbVszMV0sIG1vblsxMl0sIGRvd1s3XSwgKmNtZDsKKyAgaW50IGlzcnVubmluZywgbmVlZHN0YXJ0LCBtYWlsc2l6ZTsKKyAgcGlkX3QgcGlkOworfSBKT0I7CisKK3R5cGVkZWYgc3RydWN0IF9jcm9uZmlsZSB7CisgIHN0cnVjdCBfY3JvbmZpbGUgKm5leHQsICpwcmV2OworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmpvYiwgKnZhcjsKKyAgY2hhciAqdXNlcm5hbWUsICptYWlsdG87CisgIGludCBpbnZhbGlkOworfSBDUk9ORklMRTsKKworc3RhdGljIGNoYXIgZGF5c1tdPXsic3VuIiJtb24iInR1ZSIid2VkIiJ0aHUiImZyaSIic2F0In07CitzdGF0aWMgY2hhciBtb250aHNbXT17ImphbiIiZmViIiJtYXIiImFwciIibWF5IiJqdW4iImp1bCIKKyAgImF1ZyIic2VwIiJvY3QiIm5vdiIiZGVjIn07CitDUk9ORklMRSAqZ2NsaXN0OworCisjZGVmaW5lIExPR19FWElUIDAKKyNkZWZpbmUgTE9HX0xFVkVMNSA1CisjZGVmaW5lIExPR19MRVZFTDcgNworI2RlZmluZSBMT0dfTEVWRUw4IDgKKyNkZWZpbmUgTE9HX0xFVkVMOSA5IC8vIHdhcm5pbmcKKyNkZWZpbmUgTE9HX0VSUk9SIDIwCisKK3N0YXRpYyB2b2lkIGxvZ2luZm8odWludDhfdCBsb2dsZXZlbCwgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgcywgZDsKKworICB2YV9zdGFydChzLCBtc2cpOworICB2YV9jb3B5KGQsIHMpOworICBpZiAobG9nbGV2ZWwgPj0gVFQubG9nbGV2ZWwpIHsKKyAgICBpbnQgdXNlZDsKKyAgICBjaGFyICpzbXNnOworCisgICAgaWYgKCFUVC5mbGFnZCAmJiBUVC5sb2dmaWxlKSB7CisgICAgICBpbnQgZmQgPSBvcGVuKFRULmxvZ2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjY2KTsKKyAgICAgIGlmIChmZD09LTEpIHBlcnJvcl9tc2coIiclcyIsIFRULmxvZ2ZpbGUpOworICAgICAgZWxzZSB7CisgICAgICAgIGR1cDIoZmQsIDIpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICB9CisgICAgfQorICAgIHVzZWQgPSB2c25wcmludGYoTlVMTCwgMCwgbXNnLCBkKTsKKyAgICBzbXNnID0geHphbGxvYygrK3VzZWQpOworICAgIHZzbnByaW50ZihzbXNnLCB1c2VkLCBtc2csIHMpOworICAgIGlmIChUVC5mbGFnZCB8fCBUVC5sb2dmaWxlKSB7CisgICAgICBmZmx1c2goTlVMTCk7CisgICAgICBzbXNnW3VzZWQtMV0gPSAnXG4nOworICAgICAgd3JpdGVhbGwoKGxvZ2xldmVsID4gOCkgPyAyIDogMSwgc21zZywgdXNlZCk7CisgICAgfSBlbHNlIHN5c2xvZygobG9nbGV2ZWwgPiA4KSA/IExPR19FUlIgOiBMT0dfSU5GTywgIiVzIiwgc21zZyk7CisgICAgZnJlZShzbXNnKTsKKyAgfQorICB2YV9lbmQoZCk7CisgIHZhX2VuZChzKTsKKyAgaWYgKCFsb2dsZXZlbCkgZXhpdCgyMCk7Cit9CisKKy8qCisgKiBOYW1lcyBjYW4gYWxzbyBiZSB1c2VkIGZvciB0aGUgJ21vbnRoJyBhbmQgJ2RheSBvZiB3ZWVrJyBmaWVsZHMKKyAqIChGaXJzdCB0aHJlZSBsZXR0ZXJzIG9mIHRoZSBwYXJ0aWN1bGFyIGRheSBvciBtb250aCkuCisgKi8KK3N0YXRpYyBpbnQgZ2V0aW5kZXgoY2hhciAqc3JjLCBpbnQgc2l6ZSkKK3sKKyAgaW50IGk7CisgIGNoYXIgKmZpZWxkID0gKHNpemUgPT0gMTIpID8gbW9udGhzIDogZGF5czsKKworICAvLyBzdHJpbmdzIGFyZSBub3QgYWxsb3dlZCBmb3IgbWluLCBob3VyIGFuZCBkb20gZmllbGRzLgorICBpZiAoIShzaXplID09IDcgfHwgc2l6ZSA9PSAxMikpIHJldHVybiAtMTsKKworICBmb3IgKGkgPSAwOyBmaWVsZFtpXTsgaSArPSAzKSB7CisgICAgaWYgKCFzdHJuY2FzZWNtcChzcmMsICZmaWVsZFtpXSwgMykpCisgICAgICByZXR1cm4gKGkvMyk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvLyBzZXQgZWxlbWVudHMgb2YgbWludXRlLCBob3VyLCBkYXkgb2YgbW9udGgsIG1vbnRoIGFuZCBkYXkgb2Ygd2VlayBhcnJheXMuCitzdGF0aWMgdm9pZCBmaWxsYXJyYXkoY2hhciAqZHN0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBza2lwKQoreworICBpbnQgc2sgPSAxOworCisgIGlmIChlbmQgPCAwKSB7CisgICAgZHN0W3N0YXJ0XSA9IDE7CisgICAgcmV0dXJuOworICB9CisgIGlmICghc2tpcCkgc2tpcCA9IDE7CisgIGRvIHsKKyAgICBpZiAoIS0tc2spIHsKKyAgICAgIGRzdFtzdGFydF0gPSAxOworICAgICAgc2sgPSBza2lwOworICAgIH0KKyAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorCitzdGF0aWMgbG9uZyBnZXR2YWwoY2hhciAqbnVtLCBsb25nIGxvdywgbG9uZyBoaWdoKQoreworICBsb25nIHZhbCA9IHN0cnRvbChudW0sICZudW0sIDEwKTsKKworICBpZiAoKm51bSB8fCAodmFsIDwgbG93KSB8fCAodmFsID4gaGlnaCkpIHJldHVybiAtMTsKKyAgcmV0dXJuIHZhbDsKK30KKworLy9zdGF0aWMgaW50IHBhcnNlX2FuZF9maWxsYXJyYXkoY2hhciAqZHN0LCBpbnQgc2l6ZSwgY2hhciAqc3JjKQorc3RhdGljIGludCBwYXJzZV9hbmRfZmlsbGFycmF5KGNoYXIgKmRzdCwgaW50IG1pbiwgaW50IG1heCwgY2hhciAqc3JjKQoreworICBpbnQgc3RhcnQsIGVuZCwgc2tpcCA9IDA7CisgIGNoYXIgKnB0ciA9IHN0cmNocihzcmMsICcvJyk7CisKKyAgaWYgKHB0cikgeworICAgICpwdHIrKyA9IDA7CisgICAgaWYgKChza2lwID0gZ2V0dmFsKHB0ciwgbWluLCAobWluID8gbWF4OiBtYXgtMSkpKSA8IDApIGdvdG8gRVJST1I7CisgIH0KKworICBpZiAoKnNyYyA9PSAnLScgfHwgKnNyYyA9PSAnLCcpIGdvdG8gRVJST1I7CisgIGlmICgqc3JjID09ICcqJykgeworICAgIGlmICgqKHNyYysxKSkgZ290byBFUlJPUjsKKyAgICBmaWxsYXJyYXkoZHN0LCAwLCBtYXgtMSwgc2tpcCk7CisgIH0gZWxzZSB7CisgICAgZm9yICg7OykgeworICAgICAgY2hhciAqY3Rva2VuID0gc3Ryc2VwKCZzcmMsICIsIiksICpkdG9rZW47CisKKyAgICAgIGlmICghY3Rva2VuKSBicmVhazsKKyAgICAgIGlmICghKmN0b2tlbikgZ290byBFUlJPUjsKKworICAgICAgLy8gR2V0IHN0YXJ0IHBvc2l0aW9uLgorICAgICAgZHRva2VuID0gc3Ryc2VwKCZjdG9rZW4sICItIik7CisgICAgICBpZiAoaXNkaWdpdCgqZHRva2VuKSkgeworICAgICAgICBpZiAoKHN0YXJ0ID0gZ2V0dmFsKGR0b2tlbiwgbWluLCAobWluID8gbWF4IDogbWF4LTEpKSkgPCAwKSBnb3RvIEVSUk9SOworICAgICAgICBzdGFydCA9IG1pbiA/IChzdGFydC0xKSA6IHN0YXJ0OworICAgICAgfSBlbHNlIGlmICgoc3RhcnQgPSBnZXRpbmRleChkdG9rZW4sIG1heCkpIDwgMCkgZ290byBFUlJPUjsKKworICAgICAgLy8gR2V0IGVuZCBwb3NpdGlvbi4KKyAgICAgIGlmICghY3Rva2VuKSBlbmQgPSAtMTsgLy8gZS5nLiBOMSxOMixOMworICAgICAgZWxzZSBpZiAoKmN0b2tlbikgey8vIGUuZy4gTi1NCisgICAgICAgIGlmIChpc2RpZ2l0KCpjdG9rZW4pKSB7CisgICAgICAgICAgaWYgKChlbmQgPSBnZXR2YWwoY3Rva2VuLCBtaW4sIChtaW4gPyBtYXggOiBtYXgtMSkpKSA8IDApIGdvdG8gRVJST1I7CisgICAgICAgICAgZW5kID0gbWluID8gKGVuZC0xKSA6IGVuZDsKKyAgICAgICAgfSBlbHNlIGlmICgoZW5kID0gZ2V0aW5kZXgoY3Rva2VuLCBtYXgpKSA8IDApIGdvdG8gRVJST1I7CisgICAgICAgIGlmIChlbmQgPT0gc3RhcnQpIGVuZCA9IC0xOworICAgICAgfSBlbHNlIGdvdG8gRVJST1I7IC8vIGVycm9yIGNvbmRpdGlvbiAnTi0nCisgICAgICBmaWxsYXJyYXkoZHN0LCBzdGFydCwgZW5kLCBza2lwKTsKKyAgICB9CisgIH0KKworICBpZiAoVFQuZmxhZ2QgJiYgKFRULmxvZ2xldmVsIDw9IDUpKSB7CisgICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgbWF4OyBzdGFydCsrKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlZCIsICh1bnNpZ25lZCBjaGFyKWRzdFtzdGFydF0pOworICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgIH0KKyAgcmV0dXJuIDA7CitFUlJPUjoKKyAgbG9naW5mbyhMT0dfTEVWRUw5LCAicGFyc2UgZXJyb3IgYXQgJXMiLCBzcmMpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjaGFyICpvbWl0c3BhY2UoY2hhciAqbGluZSkKK3sKKyAgd2hpbGUgKCpsaW5lID09ICcgJyB8fCAqbGluZSA9PSAnXHQnKSBsaW5lKys7CisgIHJldHVybiBsaW5lOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9saW5lKGNoYXIgKmxpbmUsIENST05GSUxFICpjZmlsZSkKK3sKKyAgaW50IGNvdW50ID0gMDsKKyAgY2hhciAqbmFtZSwgKnZhbCwgKnRva2Vuc1s1XSA9IHswLH07CisgIFZBUiAqdjsKKyAgSk9CICpqOworCisgIGxpbmUgPSBvbWl0c3BhY2UobGluZSk7CisgIGlmICghKmxpbmUgfHwgKmxpbmUgPT0gJyMnKSByZXR1cm47CisKKyAgLyoKKyAgICogVE9ETzogRW5oYW5jZW1lbnQgdG8gc3VwcG9ydCA4IHNwZWNpYWwgc3RyaW5ncworICAgKiBAcmVib290IC0+IFJ1biBvbmNlIGF0IHN0YXJ0dXAuCisgICAqIEB5ZWFybHkgLT4gUnVuIG9uY2UgYSB5ZWFyICgwIDAgMSAxICopLgorICAgKiBAYW5udWFsbHkgLT4gU2FtZSBhcyBhYm92ZS4KKyAgICogQG1vbnRobHkgLT4gUnVuIG9uY2UgYSBtb250aCAoMCAwIDEgKiAqKS4KKyAgICogQHdlZWtseSAtPiBSdW4gb25jZSBhIHdlZWsgKDAgMCAqICogMCkuCisgICAqIEBkYWlseSAtPiBSdW4gb25jZSBhIGRheSAoMCAwICogKiAqKS4KKyAgICogQG1pZG5pZ2h0IC0+IHNhbWUgYXMgYWJvdmUuCisgICAqIEBob3VybHkgLT4gUnVuIG9uY2UgYW4gaG91ciAoMCAqICogKiAqKS4KKyAgICovCisgIGlmICgqbGluZSA9PSAnQCcpIHJldHVybjsKKyAgaWYgKFRULmZsYWdkKSBsb2dpbmZvKExPR19MRVZFTDUsICJ1c2VyOiVzIGVudHJ5OiVzIiwgY2ZpbGUtPnVzZXJuYW1lLCBsaW5lKTsKKyAgd2hpbGUgKGNvdW50PDUpIHsKKyAgICBpbnQgbGVuID0gc3RyY3NwbihsaW5lLCAiIFx0Iik7CisKKyAgICBpZiAobGluZVtsZW5dKSBsaW5lW2xlbisrXSA9ICdcMCc7CisgICAgdG9rZW5zW2NvdW50KytdID0gbGluZTsKKyAgICBsaW5lICs9IGxlbjsKKyAgICBsaW5lID0gb21pdHNwYWNlKGxpbmUpOworICAgIGlmICghKmxpbmUpIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChjb3VudCkgeworICAgIGNhc2UgMTogLy8gZm9ybSBTSEVMTD0vYmluL3NoCisgICAgICBuYW1lID0gdG9rZW5zWzBdOworICAgICAgaWYgKCh2YWwgPSBzdHJjaHIobmFtZSwgJz0nKSkpICp2YWwrKyA9IDA7CisgICAgICBpZiAoIXZhbCB8fCAhKnZhbCkgcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvLyBmb3JtIFNIRUxMID0vYmluL3NoIG9yIFNIRUxMPSAvYmluL3NoCisgICAgICBuYW1lID0gdG9rZW5zWzBdOworICAgICAgaWYgKCh2YWwgPSBzdHJjaHIobmFtZSwgJz0nKSkpIHsKKyAgICAgICAgKnZhbCA9IDA7CisgICAgICAgIHZhbCA9IHRva2Vuc1sxXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqKHRva2Vuc1sxXSkgIT0gJz0nKSByZXR1cm47CisgICAgICAgIHZhbCA9IHRva2Vuc1sxXSArIDE7CisgICAgICB9CisgICAgICBpZiAoISp2YWwpIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLy8gTkFNRSA9IFZBTAorICAgICAgbmFtZSA9IHRva2Vuc1swXTsKKyAgICAgIHZhbCA9IHRva2Vuc1syXTsKKyAgICAgIGlmICgqKHRva2Vuc1sxXSkgIT0gJz0nKSByZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAvLyBkb24ndCBoYXZlIGFueSBjbWQgdG8gZXhlY3V0ZS4KKyAgICAgIGlmICghKmxpbmUpIHJldHVybjsKKyAgICAgIGogPSB4emFsbG9jKHNpemVvZihKT0IpKTsKKworICAgICAgaWYgKHBhcnNlX2FuZF9maWxsYXJyYXkoai0+bWluLCAwLCBzaXplb2Yoai0+bWluKSwgdG9rZW5zWzBdKSkKKyAgICAgICAgZ290byBTVE9QX1BBUlNJTkc7CisgICAgICBpZiAocGFyc2VfYW5kX2ZpbGxhcnJheShqLT5ob3VyLCAwLCBzaXplb2Yoai0+aG91ciksIHRva2Vuc1sxXSkpCisgICAgICAgIGdvdG8gU1RPUF9QQVJTSU5HOworICAgICAgaWYgKHBhcnNlX2FuZF9maWxsYXJyYXkoai0+ZG9tLCAxLCBzaXplb2Yoai0+ZG9tKSwgdG9rZW5zWzJdKSkKKyAgICAgICAgZ290byBTVE9QX1BBUlNJTkc7CisgICAgICBpZiAocGFyc2VfYW5kX2ZpbGxhcnJheShqLT5tb24sIDEsIHNpemVvZihqLT5tb24pLCB0b2tlbnNbM10pKQorICAgICAgICBnb3RvIFNUT1BfUEFSU0lORzsKKyAgICAgIGlmIChwYXJzZV9hbmRfZmlsbGFycmF5KGotPmRvdywgMCwgc2l6ZW9mKGotPmRvdyksIHRva2Vuc1s0XSkpCisgICAgICAgIGdvdG8gU1RPUF9QQVJTSU5HOworICAgICAgai0+Y21kID0geHN0cmR1cChsaW5lKTsKKworICAgICAgaWYgKFRULmZsYWdkKSBsb2dpbmZvKExPR19MRVZFTDUsICIgY29tbWFuZDolcyIsIGotPmNtZCk7CisgICAgICBkbGlzdF9hZGRfbm9tYWxsb2MoKHN0cnVjdCBkb3VibGVfbGlzdCAqKikmY2ZpbGUtPmpvYiwgKHN0cnVjdCBkb3VibGVfbGlzdCAqKWopOworICAgICAgcmV0dXJuOworU1RPUF9QQVJTSU5HOgorICAgICAgZnJlZShqKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OiByZXR1cm47CisgIH0KKyAgaWYgKCFzdHJjbXAobmFtZSwgIk1BSUxUTyIpKSBjZmlsZS0+bWFpbHRvID0geHN0cmR1cCh2YWwpOworICBlbHNlIHsKKyAgICB2ID0geHphbGxvYyhzaXplb2YoVkFSKSk7CisgICAgdi0+bmFtZSA9IHhzdHJkdXAobmFtZSk7CisgICAgdi0+dmFsID0geHN0cmR1cCh2YWwpOworICAgIGRsaXN0X2FkZF9ub21hbGxvYygoc3RydWN0IGRvdWJsZV9saXN0ICoqKSZjZmlsZS0+dmFyLCAoc3RydWN0IGRvdWJsZV9saXN0ICopdik7CisgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9qb2JzKEpPQiAqKmpsaXN0KQoreworICBKT0IgKmogPSBkbGlzdF9wb3Aoamxpc3QpOworICBmcmVlKGotPmNtZCk7CisgIGZyZWUoaik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY3JvbmZpbGUoQ1JPTkZJTEUgKipsaXN0KQoreworICBDUk9ORklMRSAqbCA9IGRsaXN0X3BvcChsaXN0KTsKKyAgVkFSICp2LCAqdm5vZGUgPSAoVkFSICopbC0+dmFyOworCisgIGlmIChsLT51c2VybmFtZSAhPSBsLT5tYWlsdG8pIGZyZWUobC0+bWFpbHRvKTsKKyAgZnJlZShsLT51c2VybmFtZSk7CisgIHdoaWxlICh2bm9kZSAmJiAodiA9IGRsaXN0X3BvcCgmdm5vZGUpKSkgeworICAgIGZyZWUodi0+bmFtZSk7CisgICAgZnJlZSh2LT52YWwpOworICAgIGZyZWUodik7CisgIH0KKyAgZnJlZShsKTsKK30KKworLyoKKyAqIEl0ZXJhdGUgYWxsIGNyb25maWxlcyB0byBpZGVudGlmeSB0aGUgY29tcGxldGVkIGpvYnMgYW5kIGZyZWVkIHRoZW0uCisgKiBJZiBhbGwgam9icyBnb3QgY29tcGxldGVkIGZvciBhIGNyb25maWxlLCBmcmVlZCBjcm9uZmlsZSB0b28uCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9jb21wbGV0ZWRfam9icygpCit7CisgIENST05GSUxFICpsc3RhcnQsICpsaXN0ID0gZ2NsaXN0OworCisgIGxzdGFydCA9IGxpc3Q7CisgIHdoaWxlIChsaXN0KSB7CisgICAgaW50IGRlbGV0ZSA9IDE7CisgICAgSk9CICpqc3RhcnQsICpqbGlzdCA9IChKT0IgKilsaXN0LT5qb2I7CisKKyAgICBsaXN0LT5pbnZhbGlkID0gMTsKKyAgICBqc3RhcnQgPSBqbGlzdDsKKyAgICB3aGlsZSAoamxpc3QpIHsKKyAgICAgIGpsaXN0LT5pc3J1bm5pbmcgPSAwOworICAgICAgaWYgKGpsaXN0LT5waWQgPiAwKSB7CisgICAgICAgIGpsaXN0LT5pc3J1bm5pbmcgPSAxOworICAgICAgICBkZWxldGUgPSAwOworICAgICAgICBqbGlzdCA9IGpsaXN0LT5uZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGpsaXN0ID09IGpzdGFydCkgeyAvLyBpZiAxc3Qgbm9kZSBoYXMgdG8gZGVsZXRlLgorICAgICAgICAgIGpzdGFydCA9IGpzdGFydC0+bmV4dDsKKyAgICAgICAgICBmcmVlX2pvYnMoJmpsaXN0KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGZyZWVfam9icygmamxpc3QpOworICAgICAgfQorICAgICAgaWYgKGpsaXN0ID09IGpzdGFydCkgYnJlYWs7CisgICAgfQorICAgIGxpc3QtPmpvYiA9IChzdHJ1Y3QgZG91YmxlX2xpc3QgKilqbGlzdDsKKworICAgIGlmIChkZWxldGUpIHsKKyAgICAgIGlmIChsc3RhcnQgPT0gbGlzdCkgeworICAgICAgICBsc3RhcnQgPSBsc3RhcnQtPm5leHQ7CisgICAgICAgIGZyZWVfY3JvbmZpbGUoJmxpc3QpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBmcmVlX2Nyb25maWxlKCZsaXN0KTsKKyAgICB9CisgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgaWYgKGxzdGFydCA9PSBsaXN0KSBicmVhazsKKyAgfQorICBnY2xpc3QgPSBsaXN0OworfQorCisvLyBTY2FuIGNyb25maWxlcyBhbmQgcHJlcGFyZSB0aGUgbGlzdCBvZiBjcm9uZmlsZXMgd2l0aCB0aGVpciBqb2JzLgorc3RhdGljIHZvaWQgc2Nhbl9jcm9uZmlsZXMoKQoreworICBESVIgKmRwOworICBzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKworICByZW1vdmVfY29tcGxldGVkX2pvYnMoKTsKKyAgaWYgKGNoZGlyKFRULmNyb250YWJzX2RpcikpIGxvZ2luZm8oTE9HX0VYSVQsICJjaGRpciglcykiLCBUVC5jcm9udGFic19kaXIpOworICBpZiAoIShkcCA9IG9wZW5kaXIoIi4iKSkpIGxvZ2luZm8oTE9HX0VYSVQsICJjaGRpciglcykiLCAiLiIpOworCisgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRwKSkpIHsKKyAgICBpbnQgZmQ7CisgICAgY2hhciAqbGluZTsKKyAgICBDUk9ORklMRSAqY2ZpbGU7CisKKyAgICBpZiAoZW50cnktPmRfbmFtZVswXSA9PSAnLicgJiYgKCFlbnRyeS0+ZF9uYW1lWzFdIHx8CisgICAgICAgICAgKGVudHJ5LT5kX25hbWVbMV0gPT0gJy4nICYmICFlbnRyeS0+ZF9uYW1lWzJdKSkpIAorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIWdldHB3bmFtKGVudHJ5LT5kX25hbWUpKSB7CisgICAgICBsb2dpbmZvKExPR19MRVZFTDcsICJpZ25vcmluZyBmaWxlICclcycgKG5vIHN1Y2ggdXNlcikiLCBlbnRyeS0+ZF9uYW1lKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoKGZkID0gb3BlbihlbnRyeS0+ZF9uYW1lLCBPX1JET05MWSkpIDwgMCkgY29udGludWU7CisKKyAgICAvLyBvbmUgbm9kZSBmb3IgZWFjaCB1c2VyCisgICAgY2ZpbGUgPSB4emFsbG9jKHNpemVvZihDUk9ORklMRSkpOworICAgIGNmaWxlLT51c2VybmFtZSA9IHhzdHJkdXAoZW50cnktPmRfbmFtZSk7CisKKyAgICBmb3IgKDsgKGxpbmUgPSBnZXRfbGluZShmZCkpOyBmcmVlKGxpbmUpKQorICAgICAgcGFyc2VfbGluZShsaW5lLCBjZmlsZSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBqb2IgZm9yIGEgY3JvbiwgcmVtb3ZlIHRoZSBWQVIgbGlzdC4KKyAgICBpZiAoIWNmaWxlLT5qb2IpIHsKKyAgICAgIFZBUiAqdiwgKnZub2RlID0gKFZBUiAqKWNmaWxlLT52YXI7CisKKyAgICAgIGZyZWUoY2ZpbGUtPnVzZXJuYW1lKTsKKyAgICAgIGlmIChjZmlsZS0+bWFpbHRvKSBmcmVlKGNmaWxlLT5tYWlsdG8pOworCisgICAgICB3aGlsZSAodm5vZGUgJiYgKHYgPSBkbGlzdF9wb3AoJnZub2RlKSkpIHsKKyAgICAgICAgZnJlZSh2LT5uYW1lKTsKKyAgICAgICAgZnJlZSh2LT52YWwpOworICAgICAgICBmcmVlKHYpOworICAgICAgfQorICAgICAgZnJlZShjZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghY2ZpbGUtPm1haWx0bykgY2ZpbGUtPm1haWx0byA9IGNmaWxlLT51c2VybmFtZTsKKyAgICAgIGRsaXN0X2FkZF9ub21hbGxvYygoc3RydWN0IGRvdWJsZV9saXN0ICoqKSZnY2xpc3QsCisgICAgICAgICAgKHN0cnVjdCBkb3VibGVfbGlzdCAqKWNmaWxlKTsKKyAgICB9CisgICAgY2xvc2UoZmQpOworICB9CisgIGNsb3NlZGlyKGRwKTsKK30KKworLyoKKyAqIFNldCBlbnYgdmFyaWFibGVzLCBpZiBhbnkgaW4gdGhlIGNyb25maWxlLiBFeGVjdXRlIGdpdmVuIGpvYiB3aXRoIHRoZSBnaXZlbgorICogU0hFTEwgb3IgRGVmYXVsdCBTSEVMTCBhbmQgc2VuZCBhbiBlLW1haWwgd2l0aCByZXNwZWN0IHRvIGV2ZXJ5IHN1Y2Nlc3NmdWxseQorICogY29tcGxldGVkIGpvYiAoYXMgcGVyIHRoZSBnaXZlbiBwYXJhbSAncHJvZycpLgorICovCitzdGF0aWMgdm9pZCBkb19mb3JrKENST05GSUxFICpjZmlsZSwgSk9CICpqb2IsIGludCBmZCwgY2hhciAqcHJvZykKK3sKKyAgcGlkX3QgcGlkID0gdmZvcmsoKTsKKworICBpZiAocGlkID09IDApIHsKKyAgICBWQVIgKnYsICp2c3RhcnQgPSAoVkFSICopY2ZpbGUtPnZhcjsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwd2QgPSBnZXRwd25hbShjZmlsZS0+dXNlcm5hbWUpOworCisgICAgaWYgKCFwd2QpIGxvZ2luZm8oTE9HX0xFVkVMOSwgImNhbid0IGdldCB1aWQgZm9yICVzIiwgY2ZpbGUtPnVzZXJuYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgIGNoYXIgKmZpbGUgPSAiL2Jpbi9zaCI7CisKKyAgICAgIGlmIChzZXRlbnYoIlVTRVIiLCBwd2QtPnB3X25hbWUsIDEpKSBfZXhpdCgxKTsKKyAgICAgIGZvciAodiA9IHZzdGFydDsgdjspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoIlNIRUxMIiwgdi0+bmFtZSkpIGZpbGUgPSB2LT52YWw7CisgICAgICAgIGlmIChzZXRlbnYodi0+bmFtZSwgdi0+dmFsLCAxKSkgX2V4aXQoMSk7CisgICAgICAgIGlmICgodj12LT5uZXh0KSA9PSB2c3RhcnQpIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFnZXRlbnYoIkhPTUUiKSkgeworICAgICAgICBpZiAoc2V0ZW52KCJIT01FIiwgcHdkLT5wd19kaXIsIDEpKQorICAgICAgICAgIF9leGl0KDEpOworICAgICAgfQorICAgICAgeHNldHVzZXIocHdkKTsKKyAgICAgIGlmIChjaGRpcihwd2QtPnB3X2RpcikpIGxvZ2luZm8oTE9HX0xFVkVMOSwgImNoZGlyKCVzKSIsIHB3ZC0+cHdfZGlyKTsKKyAgICAgIGlmIChwcm9nKSBmaWxlID0gcHJvZzsKKyAgICAgIGlmIChUVC5mbGFnZCkgbG9naW5mbyhMT0dfTEVWRUw1LCAiY2hpbGQgcnVubmluZyAlcyIsIGZpbGUpOworCisgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBpbnQgbmV3ZmQgPSBwcm9nID8gMCA6IDE7CisgICAgICAgIGlmIChmZCAhPSBuZXdmZCkgeworICAgICAgICAgIGR1cDIoZmQsIG5ld2ZkKTsKKyAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKyAgICAgICAgZHVwMigxLCAyKTsKKyAgICAgIH0KKyAgICAgIHNldHBncnAoKTsKKyAgICAgIGV4ZWNscChmaWxlLCBmaWxlLCAocHJvZyA/ICItdGkiIDogIi1jIiksIChwcm9nID8gTlVMTCA6IGpvYi0+Y21kKSwgKGNoYXIgKikgTlVMTCk7CisgICAgICBsb2dpbmZvKExPR19FUlJPUiwgImNhbid0IGV4ZWN1dGUgJyVzJyBmb3IgdXNlciAlcyIsIGZpbGUsIGNmaWxlLT51c2VybmFtZSk7CisKKyAgICAgIGlmICghcHJvZykgZHByaW50ZigxLCAiRXhlYyBmYWlsZWQ6ICVzIC1jICVzXG4iLCBmaWxlLCBqb2ItPmNtZCk7CisgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOworICAgIH0KKyAgfQorICBpZiAocGlkIDwgMCkgeworICAgIGxvZ2luZm8oTE9HX0VSUk9SLCAiY2FuJ3QgdmZvcmsiKTsKKyAgICBwaWQgPSAwOworICB9CisgIGlmIChmZCA+PTApIGNsb3NlKGZkKTsKKyAgam9iLT5waWQgPSBwaWQ7Cit9CisKKy8vIFNlbmQgYW4gZS1tYWlsIGZvciBlYWNoIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgam9icy4KK3N0YXRpYyB2b2lkIHNlbmRtYWlsKENST05GSUxFICpjZmlsZSwgSk9CICpqb2IpCit7CisgIHBpZF90IHBpZCA9IGpvYi0+cGlkOworICBpbnQgbWFpbGZkOworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBqb2ItPnBpZCA9IDA7CisgIGlmIChwaWQgPD0wIHx8IGpvYi0+bWFpbHNpemUgPD0wKSB7CisgICAgam9iLT5pc3J1bm5pbmcgPSAwOworICAgIGpvYi0+bmVlZHN0YXJ0ID0gMTsKKyAgICByZXR1cm47CisgIH0KKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIi92YXIvc3Bvb2wvY3Jvbi9jcm9uLiVzLiVkIiwKKyAgICAgIGNmaWxlLT51c2VybmFtZSwgKGludClwaWQpOworCisgIG1haWxmZCA9IG9wZW4odG95YnVmLCBPX1JET05MWSk7CisgIHVubGluayh0b3lidWYpOworICBpZiAobWFpbGZkIDwgMCkgcmV0dXJuOworCisgIGlmIChmc3RhdChtYWlsZmQsICZzYikgPT0gLTEgfHwgc2Iuc3RfdWlkICE9IDAgfHwgc2Iuc3RfbmxpbmsgIT0gMAorICAgICAgfHwgc2Iuc3Rfc2l6ZSA9PSBqb2ItPm1haWxzaXplIHx8ICFTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisgICAgeGNsb3NlKG1haWxmZCk7CisgICAgcmV0dXJuOworICB9CisgIGpvYi0+bWFpbHNpemUgPSAwOworICBkb19mb3JrKGNmaWxlLCBqb2IsIG1haWxmZCwgInNlbmRtYWlsIik7Cit9CisKKy8vIENvdW50IHRoZSBudW1iZXIgb2Ygam9icywgd2hpY2ggYXJlIG5vdCBjb21wbGV0ZWQuCitzdGF0aWMgaW50IGNvdW50X3J1bm5pbmdfam9icygpCit7CisgIENST05GSUxFICpjZmlsZSA9IGdjbGlzdDsKKyAgSk9CICpqb2IsICpqc3RhcnQ7CisgIGludCBjb3VudCA9IDA7CisKKyAgd2hpbGUgKGNmaWxlKSB7CisgICAgam9iID0ganN0YXJ0ID0gKEpPQiAqKWNmaWxlLT5qb2I7CisgICAgd2hpbGUgKGpvYikgeworICAgICAgaW50IHJldDsKKworICAgICAgaWYgKCFqb2ItPmlzcnVubmluZyB8fCBqb2ItPnBpZDw9MCkgZ290byBORVhUX0pPQjsKKyAgICAgIGpvYi0+aXNydW5uaW5nID0gMDsKKyAgICAgIHJldCA9IHdhaXRwaWQoam9iLT5waWQsIE5VTEwsIFdOT0hBTkcpOworICAgICAgaWYgKHJldCA8IDAgfHwgcmV0ID09IGpvYi0+cGlkKSB7CisgICAgICAgIHNlbmRtYWlsKGNmaWxlLCBqb2IpOworICAgICAgICBpZiAoam9iLT5waWQpIGNvdW50ICs9IChqb2ItPmlzcnVubmluZz0xKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgam9iLT5pc3J1bm5pbmcgPSAwOworICAgICAgICAgIGpvYi0+bmVlZHN0YXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBjb3VudCArPSAoam9iLT5pc3J1bm5pbmc9MSk7CisKK05FWFRfSk9COgorICAgICAgaWYgKChqb2IgPSBqb2ItPm5leHQpID09IGpzdGFydCkgYnJlYWs7CisgICAgfQorICAgIGlmICgoY2ZpbGUgPSBjZmlsZS0+bmV4dCkgPT0gZ2NsaXN0KSBicmVhazsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKy8vIEV4ZWN1dGUgam9icyBvbmUgYnkgb25lIGFuZCBwcmVwYXJlIGZvciB0aGUgZS1tYWlsIHNlbmRpbmcuCitzdGF0aWMgdm9pZCBleGVjdXRlX2pvYnModm9pZCkKK3sKKyAgQ1JPTkZJTEUgKmNmaWxlID0gZ2NsaXN0OworICBKT0IgKmpvYiwgKmpzdGFydDsKKworICB3aGlsZSAoY2ZpbGUpIHsKKyAgICBqb2IgPSBqc3RhcnQgPSAoSk9CICopY2ZpbGUtPmpvYjsKKyAgICB3aGlsZSAoam9iKSB7CisgICAgICBpZiAoam9iLT5uZWVkc3RhcnQpIHsKKyAgICAgICAgam9iLT5uZWVkc3RhcnQgPSAwOworICAgICAgICBpZiAoam9iLT5waWQgPCAwKSB7CisgICAgICAgICAgaW50IG1haWxmZCA9IC0xOworCisgICAgICAgICAgam9iLT5tYWlsc2l6ZSA9IGpvYi0+cGlkID0gMDsKKyAgICAgICAgICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiL3Zhci9zcG9vbC9jcm9uL2Nyb24uJXMuJWQiLAorICAgICAgICAgICAgICBjZmlsZS0+dXNlcm5hbWUsIGdldHBpZCgpKTsKKyAgICAgICAgICBpZiAoKG1haWxmZCA9IG9wZW4odG95YnVmLCBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFl8T19FWENMfE9fQVBQRU5ELAorICAgICAgICAgICAgICAgICAgMDYwMCkpIDwgMCkgeworICAgICAgICAgICAgbG9naW5mbyhMT0dfRVJST1IsICJjYW4ndCBjcmVhdGUgbWFpbCBmaWxlICVzIGZvciB1c2VyICVzLCAiCisgICAgICAgICAgICAgICAgImRpc2NhcmRpbmcgb3V0cHV0IiwgdG95YnVmLCBjZmlsZS0+dXNlcm5hbWUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcHJpbnRmKG1haWxmZCwgIlRvOiAlc1xuU3ViamVjdDogY3JvbjogJXNcblxuIiwgY2ZpbGUtPm1haWx0bywgam9iLT5jbWQpOworICAgICAgICAgICAgam9iLT5tYWlsc2l6ZSA9IGxzZWVrKG1haWxmZCwgMCwgU0VFS19DVVIpOworICAgICAgICAgIH0KKyAgICAgICAgICBkb19mb3JrKGNmaWxlLCBqb2IsIG1haWxmZCwgTlVMTCk7CisgICAgICAgICAgaWYgKG1haWxmZCA+PSAwKSB7CisgICAgICAgICAgICBpZiAoam9iLT5waWQgPD0gMCkgdW5saW5rKHRveWJ1Zik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgY2hhciAqbWFpbGZpbGUgPSB4bXByaW50ZigiL3Zhci9zcG9vbC9jcm9uL2Nyb24uJXMuJWQiLAorICAgICAgICAgICAgICAgICAgY2ZpbGUtPnVzZXJuYW1lLCAoaW50KWpvYi0+cGlkKTsKKyAgICAgICAgICAgICAgcmVuYW1lKHRveWJ1ZiwgbWFpbGZpbGUpOworICAgICAgICAgICAgICBmcmVlKG1haWxmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbG9naW5mbyhMT0dfTEVWRUw4LCAiVVNFUiAlcyBwaWQgJTNkIGNtZCAlcyIsIAorICAgICAgICAgICAgICBjZmlsZS0+dXNlcm5hbWUsIGpvYi0+cGlkLCBqb2ItPmNtZCk7CisgICAgICAgICAgaWYgKGpvYi0+cGlkIDwgMCkgam9iLT5uZWVkc3RhcnQgPSAxOworICAgICAgICAgIGVsc2Ugam9iLT5pc3J1bm5pbmcgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKGpvYiA9IGpvYi0+bmV4dCkgPT0ganN0YXJ0KSBicmVhazsKKyAgICB9CisgICAgaWYgKChjZmlsZSA9IGNmaWxlLT5uZXh0KSA9PSBnY2xpc3QpIGJyZWFrOworICB9Cit9CisKKy8vIElkZW50aWZ5IGpvYnMsIHdoaWNoIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYXQgdGhlIGdpdmVuIHRpbWUgaW50ZXJ2YWwuCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9qb2JzKHRpbWVfdCBjdGltZSwgdGltZV90IHB0aW1lKQoreworICB0aW1lX3QgdG0gPSBwdGltZS1wdGltZSU2MDsKKworICBmb3IgKDsgdG0gPD0gY3RpbWU7IHRtICs9IDYwKSB7CisgICAgc3RydWN0IHRtICpsdDsKKyAgICBDUk9ORklMRSAqY2ZpbGUgPSBnY2xpc3Q7CisgICAgSk9CICpqb2IsICpqc3RhcnQ7CisKKyAgICBpZiAodG0gPD0gcHRpbWUpIGNvbnRpbnVlOworICAgIGx0ID0gbG9jYWx0aW1lKCZ0bSk7CisKKyAgICB3aGlsZSAoY2ZpbGUpIHsKKyAgICAgIGlmIChUVC5mbGFnZCkgbG9naW5mbyhMT0dfTEVWRUw1LCAiZmlsZSAlczoiLCBjZmlsZS0+dXNlcm5hbWUpOworICAgICAgaWYgKGNmaWxlLT5pbnZhbGlkKSBnb3RvIE5FWFRfQ1JPTkZJTEU7CisgICAgICBqb2IgPSBqc3RhcnQgPSAoSk9CICopY2ZpbGUtPmpvYjsKKworICAgICAgd2hpbGUgKGpvYikgeworICAgICAgICBpZiAoVFQuZmxhZ2QpIGxvZ2luZm8oTE9HX0xFVkVMNSwgIiBsaW5lICVzIiwgam9iLT5jbWQpOworCisgICAgICAgIGlmIChqb2ItPm1pbltsdC0+dG1fbWluXSAmJiBqb2ItPmhvdXJbbHQtPnRtX2hvdXJdCisgICAgICAgICAgICAmJiAoam9iLT5kb21bbHQtPnRtX21kYXldIHx8IGpvYi0+ZG93W2x0LT50bV93ZGF5XSkKKyAgICAgICAgICAgICYmIGpvYi0+bW9uW2x0LT50bV9tb24tMV0pIHsKKyAgICAgICAgICBpZiAoVFQuZmxhZ2QpCisgICAgICAgICAgICBsb2dpbmZvKExPR19MRVZFTDUsICIgam9iOiAlZCAlc1xuIiwgKGludClqb2ItPnBpZCwgam9iLT5jbWQpOworICAgICAgICAgIGlmIChqb2ItPnBpZCA+IDApIHsKKyAgICAgICAgICAgIGxvZ2luZm8oTE9HX0xFVkVMOCwgInVzZXIgJXM6IHByb2Nlc3MgYWxyZWFkeSBydW5uaW5nOiAlcyIsCisgICAgICAgICAgICAgICAgY2ZpbGUtPnVzZXJuYW1lLCBqb2ItPmNtZCk7CisgICAgICAgICAgfSBlbHNlIGlmICgham9iLT5waWQpIHsKKyAgICAgICAgICAgIGpvYi0+cGlkID0gLTE7CisgICAgICAgICAgICBqb2ItPm5lZWRzdGFydCA9IDE7CisgICAgICAgICAgICBqb2ItPmlzcnVubmluZyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoam9iID0gam9iLT5uZXh0KSA9PSBqc3RhcnQpIGJyZWFrOworICAgICAgfQorTkVYVF9DUk9ORklMRToKKyAgICAgIGlmICgoY2ZpbGUgPSBjZmlsZS0+bmV4dCkgPT0gZ2NsaXN0KSBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBjcm9uZF9tYWluKHZvaWQpCit7CisgIHRpbWVfdCBjdGltZSwgcHRpbWU7CisgIGludCBzbGVlcGZvciA9IDYwOworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBUVC5mbGFnZCA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19kKTsKKworICAvLyBTZXR0aW5nIGRlZmF1bHQgcGFyYW1zLgorICBpZiAoVFQuZmxhZ2QpIFRULmxvZ2xldmVsID0gVFQubG9nbGV2ZWxfZDsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIChGTEFHX2YgfCBGTEFHX2IpKSkgdG95cy5vcHRmbGFncyB8PSBGTEFHX2I7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19TIHwgRkxBR19MKSkpIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19TOworCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfYykKKyAgICAgICYmIChUVC5jcm9udGFic19kaXJbc3RybGVuKFRULmNyb250YWJzX2RpciktMV0gIT0gJy8nKSkKKyAgICBUVC5jcm9udGFic19kaXIgPSB4bXByaW50ZigiJXMvIiwgVFQuY3JvbnRhYnNfZGlyKTsKKworICBpZiAoIVRULmNyb250YWJzX2RpcikgVFQuY3JvbnRhYnNfZGlyID0geHN0cmR1cCgiL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyIpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYikgZGFlbW9uKDAsMCk7CisKKyAgaWYgKCFUVC5mbGFnZCAmJiAhVFQubG9nZmlsZSkKKyAgICBvcGVubG9nKHRveXMud2hpY2gtPm5hbWUsIExPR19DT05TIHwgTE9HX1BJRCwgTE9HX0NST04pOworCisgIC8vIFNldCBkZWZhdWx0IHNoZWxsIG9uY2UuCisgIGlmIChzZXRlbnYoIlNIRUxMIiwgIi9iaW4vc2giLCAxKSkgZXJyb3JfZXhpdCgiQ2FuJ3Qgc2V0IGRlZmF1bHQgc2hlbGwiKTsKKyAgeGNoZGlyKFRULmNyb250YWJzX2Rpcik7CisgIGxvZ2luZm8oTE9HX0xFVkVMOCwgImNyb25kIHN0YXJ0ZWQsIGxvZyBsZXZlbCAlZCIsIFRULmxvZ2xldmVsKTsKKworICBpZiAoc3RhdChUVC5jcm9udGFic19kaXIsICZzYikpIHNiLnN0X210aW1lID0gMDsKKyAgVFQuY3JvbnRhYnNfZGlyX210aW1lID0gc2Iuc3RfbXRpbWU7CisgIHNjYW5fY3JvbmZpbGVzKCk7CisgIGN0aW1lID0gdGltZShOVUxMKTsKKworICB3aGlsZSAoMSkgeworICAgIGxvbmcgdGRpZmY7CisKKyAgICBwdGltZSA9IGN0aW1lOworICAgIHNsZWVwKHNsZWVwZm9yIC0gKHB0aW1lJXNsZWVwZm9yKSArMSk7CisgICAgdGRpZmYgPShsb25nKSAoKGN0aW1lID0gdGltZShOVUxMKSkgLSBwdGltZSk7CisKKyAgICBpZiAoc3RhdChUVC5jcm9udGFic19kaXIsICZzYikpIHNiLnN0X210aW1lID0gMDsKKyAgICBpZiAoVFQuY3JvbnRhYnNfZGlyX210aW1lICE9IHNiLnN0X210aW1lKSB7CisgICAgICBUVC5jcm9udGFic19kaXJfbXRpbWUgPSBzYi5zdF9tdGltZTsKKyAgICAgIHNjYW5fY3JvbmZpbGVzKCk7CisgICAgfQorCisgICAgaWYgKFRULmZsYWdkKSBsb2dpbmZvKExPR19MRVZFTDUsICJ3YWtldXAgZGlmZj0lbGRcbiIsIHRkaWZmKTsKKyAgICBpZiAodGRpZmYgPCAtNjAgKiA2MCB8fCB0ZGlmZiA+IDYwICogNjApCisgICAgICBsb2dpbmZvKExPR19MRVZFTDksICJ0aW1lIGRpc3Bhcml0eSBvZiAlbGQgbWludXRlcyBkZXRlY3RlZCIsIHRkaWZmIC8gNjApOworICAgIGVsc2UgaWYgKHRkaWZmID4gMCkgeworICAgICAgc2NoZWR1bGVfam9icyhjdGltZSwgcHRpbWUpOworICAgICAgZXhlY3V0ZV9qb2JzKCk7CisgICAgICBpZiAoY291bnRfcnVubmluZ19qb2JzKCkpIHNsZWVwZm9yID0gMTA7CisgICAgICBlbHNlIHNsZWVwZm9yID0gNjA7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2Nyb250YWIuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvY3JvbnRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWM0N2QKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2Nyb250YWIuYwpAQCAtMCwwICsxLDM2MSBAQAorLyogY3JvbnRhYi5jIC0gZmlsZXMgdXNlZCB0byBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIHByb2dyYW1zLgorICoKKyAqIENvcHlyaWdodCAyMDE0IFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqCisgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvY3JvbnRhYi5odG1sCisKK1VTRV9DUk9OVEFCKE5FV1RPWShjcm9udGFiLCAiYzp1OmVsclshZWxyXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfU1RBWVJPT1QpKQorCitjb25maWcgQ1JPTlRBQgorICBib29sICJjcm9udGFiIgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBUT1lCT1hfRk9SSworICBoZWxwCisgICAgdXNhZ2U6IGNyb250YWIgWy11IHVzZXJdIEZJTEUKKyAgICAgICAgICAgICAgICAgICBbLXUgdXNlcl0gWy1lIHwgLWwgfCAtcl0KKyAgICAgICAgICAgICAgICAgICBbLWMgZGlyXQorCisgICAgRmlsZXMgdXNlZCB0byBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIHByb2dyYW1zLgorCisgICAgLWMgY3JvbnRhYiBkaXIKKyAgICAtZSBlZGl0IHVzZXIncyBjcm9udGFiCisgICAgLWwgbGlzdCB1c2VyJ3MgY3JvbnRhYgorICAgIC1yIGRlbGV0ZSB1c2VyJ3MgY3JvbnRhYgorICAgIC11IHVzZXIKKyAgICBGSUxFIFJlcGxhY2UgY3JvbnRhYiBieSBGSUxFICgnLSc6IHN0ZGluKQorKi8KKyNkZWZpbmUgRk9SX2Nyb250YWIKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnVzZXI7CisgIGNoYXIgKmNkaXI7CispCisKK3N0YXRpYyBjaGFyICpvbWl0c3BhY2UoY2hhciAqbGluZSkKK3sKKyAgd2hpbGUgKCpsaW5lID09ICcgJyB8fCAqbGluZSA9PSAnXHQnKSBsaW5lKys7CisgIHJldHVybiBsaW5lOworfQorCisvKgorICogTmFtZXMgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhlICdtb250aCcgYW5kICdkYXkgb2Ygd2VlaycgZmllbGRzCisgKiAoRmlyc3QgdGhyZWUgbGV0dGVycyBvZiB0aGUgcGFydGljdWxhciBkYXkgb3IgbW9udGgpLgorICovCitzdGF0aWMgaW50IGdldGluZGV4KGNoYXIgKnNyYywgaW50IHNpemUpCit7CisgIGludCBpOworICBjaGFyIGRheXNbXT17InN1biIibW9uIiJ0dWUiIndlZCIidGh1IiJmcmkiInNhdCJ9OworICBjaGFyIG1vbnRoc1tdPXsiamFuIiJmZWIiIm1hciIiYXByIiJtYXkiImp1biIianVsIgorICAgICJhdWciInNlcCIib2N0IiJub3YiImRlYyJ9OworICBjaGFyICpmaWVsZCA9IChzaXplID09IDEyKSA/IG1vbnRocyA6IGRheXM7CisKKyAgLy8gc3RyaW5ncyBhcmUgbm90IGFsbG93ZWQgZm9yIG1pbiwgaG91ciBhbmQgZG9tIGZpZWxkcy4KKyAgaWYgKCEoc2l6ZSA9PSA3IHx8IHNpemUgPT0gMTIpKSByZXR1cm4gLTE7CisKKyAgZm9yIChpID0gMDsgZmllbGRbaV07IGkgKz0gMykgeworICAgIGlmICghc3RybmNhc2VjbXAoc3JjLCAmZmllbGRbaV0sIDMpKQorICAgICAgcmV0dXJuIChpLzMpOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGxvbmcgZ2V0dmFsKGNoYXIgKm51bSwgbG9uZyBsb3csIGxvbmcgaGlnaCkKK3sKKyAgbG9uZyB2YWwgPSBzdHJ0b2wobnVtLCAmbnVtLCAxMCk7CisKKyAgaWYgKCpudW0gfHwgKHZhbCA8IGxvdykgfHwgKHZhbCA+IGhpZ2gpKSByZXR1cm4gLTE7CisgIHJldHVybiB2YWw7Cit9CisKKy8vIFZhbGlkYXRlIG1pbnV0ZSwgaG91ciwgZGF5IG9mIG1vbnRoLCBtb250aCBhbmQgZGF5IG9mIHdlZWsgZmllbGRzLgorc3RhdGljIGludCB2YWxpZGF0ZV9jb21wb25lbnQoaW50IG1pbiwgaW50IG1heCwgY2hhciAqc3JjKQoreworICBpbnQgc2tpcCA9IDA7CisgIGNoYXIgKnB0cjsKKworICBpZiAoIXNyYykgcmV0dXJuIDE7CisgIGlmICgocHRyID0gc3RyY2hyKHNyYywgJy8nKSkpIHsKKyAgICAqcHRyKysgPSAwOworICAgIGlmICgoc2tpcCA9IGdldHZhbChwdHIsIG1pbiwgKG1pbiA/IG1heDogbWF4LTEpKSkgPCAwKSByZXR1cm4gMTsKKyAgfQorCisgIGlmICgqc3JjID09ICctJyB8fCAqc3JjID09ICcsJykgcmV0dXJuIDE7CisgIGlmICgqc3JjID09ICcqJykgeworICAgIGlmICgqKHNyYysxKSkgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgZm9yICg7OykgeworICAgICAgY2hhciAqY3Rva2VuID0gc3Ryc2VwKCZzcmMsICIsIiksICpkdG9rZW47CisKKyAgICAgIGlmICghY3Rva2VuKSBicmVhazsKKyAgICAgIGlmICghKmN0b2tlbikgcmV0dXJuIDE7CisKKyAgICAgIC8vIHZhbGlkYXRlIHN0YXJ0IHBvc2l0aW9uLgorICAgICAgZHRva2VuID0gc3Ryc2VwKCZjdG9rZW4sICItIik7CisgICAgICBpZiAoaXNkaWdpdCgqZHRva2VuKSkgeworICAgICAgICBpZiAoZ2V0dmFsKGR0b2tlbiwgbWluLCAobWluID8gbWF4IDogbWF4LTEpKSA8IDApIHJldHVybiAxOworICAgICAgfSBlbHNlIGlmIChnZXRpbmRleChkdG9rZW4sIG1heCkgPCAwKSByZXR1cm4gMTsKKworICAgICAgLy8gdmFsaWRhdGUgZW5kIHBvc2l0aW9uLgorICAgICAgaWYgKCFjdG9rZW4pIHsKKyAgICAgICAgaWYgKHNraXApIHJldHVybiAxOyAvLyBjYXNlIDEwLzIwIG9yIDEsMiw0LzMKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCpjdG9rZW4pIHsvLyBlLmcuIE4tTQorICAgICAgICBpZiAoaXNkaWdpdCgqY3Rva2VuKSkgeworICAgICAgICAgIGlmIChnZXR2YWwoY3Rva2VuLCBtaW4sIChtaW4gPyBtYXggOiBtYXgtMSkpIDwgMCkgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0aW5kZXgoY3Rva2VuLCBtYXgpIDwgMCkgcmV0dXJuIDE7CisgICAgICB9IGVsc2UgcmV0dXJuIDE7IC8vIGVycm9yIGNvbmRpdGlvbiAnTi0nCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2Nyb250YWIoY2hhciAqZm5hbWUpCit7CisgIGNoYXIgKmxpbmU7CisgIGludCBsbm8sIGZkID0geG9wZW5ybyhmbmFtZSk7CisgIGxvbmcgcGxlbiA9IDA7CisKKyAgZm9yIChsbm8gPSAxOyAobGluZSA9IGdldF9yYXdsaW5lKGZkLCAmcGxlbiwgJ1xuJykpOyBsbm8rKyxmcmVlKGxpbmUpKSB7CisgICAgY2hhciAqbmFtZSwgKnZhbCwgKnRva2Vuc1s1XSA9IHswLH0sICpwdHIgPSBsaW5lOworICAgIGludCBjb3VudCA9IDA7CisKKyAgICBpZiAobGluZVtwbGVuIC0gMV0gPT0gJ1xuJykgbGluZVstLXBsZW5dID0gJ1wwJzsKKyAgICBlbHNlIHsKKyAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiBwcmVtYXR1cmUgRU9GXG4iLCBsbm8pOworICAgICAgZ290byBPVVQ7CisgICAgfQorCisgICAgcHRyID0gb21pdHNwYWNlKHB0cik7CisgICAgaWYgKCEqcHRyIHx8ICpwdHIgPT0gJyMnIHx8ICpwdHIgPT0gJ0AnKSBjb250aW51ZTsKKyAgICB3aGlsZSAoY291bnQ8NSkgeworICAgICAgaW50IGxlbiA9IHN0cmNzcG4ocHRyLCAiIFx0Iik7CisKKyAgICAgIGlmIChwdHJbbGVuXSkgcHRyW2xlbisrXSA9ICdcMCc7CisgICAgICB0b2tlbnNbY291bnQrK10gPSBwdHI7CisgICAgICBwdHIgKz0gbGVuOworICAgICAgcHRyID0gb21pdHNwYWNlKHB0cik7CisgICAgICBpZiAoISpwdHIpIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGNvdW50KSB7CisgICAgICBjYXNlIDE6IC8vIGZvcm0gU0hFTEw9L2Jpbi9zaAorICAgICAgICBuYW1lID0gdG9rZW5zWzBdOworICAgICAgICBpZiAoKHZhbCA9IHN0cmNocihuYW1lLCAnPScpKSkgKnZhbCsrID0gMDsKKyAgICAgICAgaWYgKCF2YWwgfHwgISp2YWwpIHsKKyAgICAgICAgICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiJyVkJzogJXNcbiIsIGxubywgbGluZSk7CisgICAgICAgICAgZ290byBPVVQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IC8vIGZvcm0gU0hFTEwgPS9iaW4vc2ggb3IgU0hFTEw9IC9iaW4vc2gKKyAgICAgICAgbmFtZSA9IHRva2Vuc1swXTsKKyAgICAgICAgaWYgKCh2YWwgPSBzdHJjaHIobmFtZSwgJz0nKSkpIHsKKyAgICAgICAgICAqdmFsID0gMDsKKyAgICAgICAgICB2YWwgPSB0b2tlbnNbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCoodG9rZW5zWzFdKSAhPSAnPScpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiAlc1xuIiwgbG5vLCBsaW5lKTsKKyAgICAgICAgICAgIGdvdG8gT1VUOworICAgICAgICAgIH0KKyAgICAgICAgICB2YWwgPSB0b2tlbnNbMV0gKyAxOworICAgICAgICB9CisgICAgICAgIGlmICghKnZhbCkgeworICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiAlc1xuIiwgbG5vLCBsaW5lKTsKKyAgICAgICAgICBnb3RvIE9VVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogLy8gTkFNRSA9IFZBTAorICAgICAgICBuYW1lID0gdG9rZW5zWzBdOworICAgICAgICB2YWwgPSB0b2tlbnNbMl07CisgICAgICAgIGlmICgqKHRva2Vuc1sxXSkgIT0gJz0nKSB7CisgICAgICAgICAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIiclZCc6ICVzXG4iLCBsbm8sIGxpbmUpOworICAgICAgICAgIGdvdG8gT1VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHZhbGlkYXRlX2NvbXBvbmVudCgwLCA2MCwgdG9rZW5zWzBdKSkgeworICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiBiYWQgbWludXRlXG4iLCBsbm8pOworICAgICAgICAgIGdvdG8gT1VUOworICAgICAgICB9CisgICAgICAgIGlmICh2YWxpZGF0ZV9jb21wb25lbnQoMCwgMjQsIHRva2Vuc1sxXSkpIHsKKyAgICAgICAgICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiJyVkJzogYmFkIGhvdXJcbiIsIGxubyk7CisgICAgICAgICAgZ290byBPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbGlkYXRlX2NvbXBvbmVudCgxLCAzMSwgdG9rZW5zWzJdKSkgeworICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiBiYWQgZGF5LW9mLW1vbnRoXG4iLCBsbm8pOworICAgICAgICAgIGdvdG8gT1VUOworICAgICAgICB9CisgICAgICAgIGlmICh2YWxpZGF0ZV9jb21wb25lbnQoMSwgMTIsIHRva2Vuc1szXSkpIHsKKyAgICAgICAgICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiJyVkJzogYmFkIG1vbnRoXG4iLCBsbm8pOworICAgICAgICAgIGdvdG8gT1VUOworICAgICAgICB9CisgICAgICAgIGlmICh2YWxpZGF0ZV9jb21wb25lbnQoMCwgNywgdG9rZW5zWzRdKSkgeworICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiBiYWQgZGF5LW9mLXdlZWtcbiIsIGxubyk7CisgICAgICAgICAgZ290byBPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqcHRyKSB7IC8vIGRvbid0IGhhdmUgYW55IGNtZCB0byBleGVjdXRlLgorICAgICAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICInJWQnOiBiYWQgY29tbWFuZFxuIiwgbG5vKTsKKyAgICAgICAgICBnb3RvIE9VVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgeGNsb3NlKGZkKTsKKyAgcmV0dXJuIDA7CitPVVQ6CisgIGZyZWUobGluZSk7CisgIHByaW50ZigiRXJyb3IgYXQgbGluZSBubyAlcyIsIHRveWJ1Zik7CisgIHhjbG9zZShmZCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkb19saXN0KGNoYXIgKm5hbWUpCit7CisgIGludCBmZGluOworCisgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlcyVzIiwgVFQuY2RpciwgbmFtZSk7CisgIGZkaW4gPSB4b3BlbnJvKHRveWJ1Zik7CisgIHhzZW5kZmlsZShmZGluLCAxKTsKKyAgeGNsb3NlKGZkaW4pOworfQorCitzdGF0aWMgdm9pZCBkb19yZW1vdmUoY2hhciAqbmFtZSkKK3sKKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIiVzJXMiLCBUVC5jZGlyLCBuYW1lKTsKKyAgaWYgKHVubGluayh0b3lidWYpKQorICAgIGVycm9yX2V4aXQoIk5vIGNyb250YWIgZm9yICclcyciLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2Nyb250YWIoY2hhciAqc3JjLCBjaGFyICpkZXN0KQoreworICBpbnQgZmRpbiwgZmRvdXQ7CisKKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIiVzJXMiLCBUVC5jZGlyLCBkZXN0KTsKKyAgZmRvdXQgPSB4Y3JlYXRlKHRveWJ1ZiwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjAwKTsKKyAgZmRpbiA9IHhvcGVucm8oc3JjKTsKKyAgeHNlbmRmaWxlKGZkaW4sIGZkb3V0KTsKKyAgeGNsb3NlKGZkaW4pOworCisgIGZjaG93bihmZG91dCwgZ2V0dWlkKCksIGdldGV1aWQoKSk7CisgIHhjbG9zZShmZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlcGxhY2UoY2hhciAqbmFtZSkKK3sKKyAgY2hhciAqZm5hbWUgPSAqdG95cy5vcHRhcmdzID8gKnRveXMub3B0YXJncyA6ICItIjsKKyAgY2hhciB0bmFtZVtdID0gIi90bXAvY3JvbnRhYi5YWFhYWFgiOworCisgIGlmICgoKmZuYW1lID09ICctJykgJiYgISooZm5hbWUrMSkpIHsKKyAgICBpbnQgdGZkID0gbWtzdGVtcCh0bmFtZSk7CisKKyAgICBpZiAodGZkIDwgMCkgcGVycm9yX2V4aXQoIm1rc3RlbXAiKTsKKyAgICB4c2VuZGZpbGUoMCwgdGZkKTsKKyAgICB4Y2xvc2UodGZkKTsKKyAgICBmbmFtZSA9IHRuYW1lOworICB9CisKKyAgaWYgKHBhcnNlX2Nyb250YWIoZm5hbWUpKQorICAgIGVycm9yX2V4aXQoImVycm9ycyBpbiBjcm9udGFiIGZpbGUgJyVzJywgY2FuJ3QgaW5zdGFsbC4iLCBmbmFtZSk7CisgIHVwZGF0ZV9jcm9udGFiKGZuYW1lLCBuYW1lKTsKKyAgdW5saW5rKHRuYW1lKTsKK30KKworc3RhdGljIHZvaWQgZG9fZWRpdChzdHJ1Y3QgcGFzc3dkICpwd2QpCit7CisgIHN0cnVjdCBzdGF0IHNiOworICB0aW1lX3QgbXRpbWUgPSAwOworICBpbnQgc3JjZmQsIGRlc3RmZCwgc3RhdHVzOworICBwaWRfdCBwaWQsIGNwaWQ7CisgIGNoYXIgdG5hbWVbXSA9ICIvdG1wL2Nyb250YWIuWFhYWFhYIjsKKworICBpZiAoKGRlc3RmZCA9IG1rc3RlbXAodG5hbWUpKSA8IDApCisgICAgcGVycm9yX2V4aXQoIkNhbid0IG9wZW4gdG1wIGZpbGUiKTsKKworICBmY2htb2QoZGVzdGZkLCAwNjY2KTsKKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIiVzJXMiLCBUVC5jZGlyLCBwd2QtPnB3X25hbWUpOworCisgIGlmICghc3RhdCh0b3lidWYsICZzYikpIHsgLy8gZmlsZSBleGlzdHMgYW5kIGhhdmUgc29tZSBjb250ZW50LgorICAgIGlmIChzYi5zdF9zaXplKSB7CisgICAgICBzcmNmZCA9IHhvcGVucm8odG95YnVmKTsKKyAgICAgIHhzZW5kZmlsZShzcmNmZCwgZGVzdGZkKTsKKyAgICAgIHhjbG9zZShzcmNmZCk7CisgICAgfQorICB9IGVsc2UgcHJpbnRmKCJObyBjcm9udGFiIGZvciAnJXMnLSB1c2luZyBhbiBlbXB0eSBvbmVcbiIsIHB3ZC0+cHdfbmFtZSk7CisgIHhjbG9zZShkZXN0ZmQpOworCisgIGlmICghc3RhdCh0bmFtZSwgJnNiKSkgbXRpbWUgPSBzYi5zdF9tdGltZTsKKworUkVUUlk6CisgIGlmICghKHBpZCA9IHhmb3JrKCkpKSB7CisgICAgY2hhciAqcHJvZyA9IHB3ZC0+cHdfc2hlbGw7CisKKyAgICB4c2V0dXNlcihwd2QpOworICAgIGlmIChwd2QtPnB3X3VpZCkgeworICAgICAgaWYgKHNldGVudigiVVNFUiIsIHB3ZC0+cHdfbmFtZSwgMSkpIF9leGl0KDEpOworICAgICAgaWYgKHNldGVudigiTE9HTkFNRSIsIHB3ZC0+cHdfbmFtZSwgMSkpIF9leGl0KDEpOworICAgIH0KKyAgICBpZiAoc2V0ZW52KCJIT01FIiwgcHdkLT5wd19kaXIsIDEpKSBfZXhpdCgxKTsKKyAgICBpZiAoc2V0ZW52KCJTSEVMTCIsKCghcHJvZyB8fCAhKnByb2cpID8gIi9iaW4vc2giIDogcHJvZyksIDEpKSBfZXhpdCgxKTsKKworICAgIGlmICghKHByb2cgPSBnZXRlbnYoIlZJU1VBTCIpKSkgeworICAgICAgaWYgKCEocHJvZyA9IGdldGVudigiRURJVE9SIikpKQorICAgICAgICBwcm9nID0gInZpIjsKKyAgICB9CisgICAgZXhlY2xwKHByb2csIHByb2csIHRuYW1lLCAoY2hhciAqKSBOVUxMKTsKKyAgICBwZXJyb3JfZXhpdCgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgcHJvZyk7CisgIH0KKworICAvLyBQYXJlbnQgUHJvY2Vzcy4KKyAgZG8geworICAgIGNwaWQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CisgIH0gd2hpbGUgKChjcGlkID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKworICBpZiAoIXN0YXQodG5hbWUsICZzYikgJiYgKG10aW1lID09IHNiLnN0X210aW1lKSkgeworICAgIHByaW50ZigiJXM6IG5vIGNoYW5nZXMgbWFkZSB0byBjcm9udGFiXG4iLCB0b3lzLndoaWNoLT5uYW1lKTsKKyAgICB1bmxpbmsodG5hbWUpOworICAgIHJldHVybjsKKyAgfQorICBwcmludGYoIiVzOiBpbnN0YWxsaW5nIG5ldyBjcm9udGFiXG4iLCB0b3lzLndoaWNoLT5uYW1lKTsKKyAgaWYgKHBhcnNlX2Nyb250YWIodG5hbWUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcnMgaW4gY3JvbnRhYiBmaWxlLCBjYW4ndCBpbnN0YWxsLlxuIgorICAgICAgICAiRG8geW91IHdhbnQgdG8gcmV0cnkgdGhlIHNhbWUgZWRpdD8gIik7CisgICAgaWYgKCF5ZXNubygwKSkgeworICAgICAgZXJyb3JfbXNnKCJlZGl0cyBsZWZ0IGluICclcyciLCB0bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGdvdG8gUkVUUlk7CisgIH0KKyAgLy8gcGFyc2luZyBvZiBjcm9udGFiIHN1Y2Nlc3M7IHVwZGF0ZSB0aGUgY3JvbnRhYi4KKyAgdXBkYXRlX2Nyb250YWIodG5hbWUsIHB3ZC0+cHdfbmFtZSk7CisgIHVubGluayh0bmFtZSk7Cit9CisKK3ZvaWQgY3JvbnRhYl9tYWluKHZvaWQpCit7CisgIHN0cnVjdCBwYXNzd2QgKnB3ZCA9IE5VTEw7CisgIGxvbmcgRkxBR19lbHIgPSB0b3lzLm9wdGZsYWdzICYgKEZMQUdfZXxGTEFHX2x8RkxBR19yKTsKKworICBpZiAoVFQuY2RpciAmJiAoVFQuY2RpcltzdHJsZW4oVFQuY2RpciktMV0gIT0gJy8nKSkKKyAgICBUVC5jZGlyID0geG1wcmludGYoIiVzLyIsIFRULmNkaXIpOworICBpZiAoIVRULmNkaXIpIFRULmNkaXIgPSB4c3RyZHVwKCIvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvIik7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpIHsKKyAgICBpZiAoZ2V0dWlkKCkpIGVycm9yX2V4aXQoIm11c3QgYmUgcHJpdmlsZWdlZCB0byB1c2UgLXUiKTsKKyAgICBwd2QgPSB4Z2V0cHduYW0oVFQudXNlcik7CisgIH0gZWxzZSBwd2QgPSB4Z2V0cHd1aWQoZ2V0dWlkKCkpOworCisgIGlmICghdG95cy5vcHRjKSB7CisgICAgaWYgKCFGTEFHX2VscikgeworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpIAorICAgICAgICBoZWxwX2V4aXQoImZpbGUgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgcmVwbGFjZSIpOworICAgICAgZG9fcmVwbGFjZShwd2QtPnB3X25hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19lKSBkb19lZGl0KHB3ZCk7CisgICAgZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfbCkgZG9fbGlzdChwd2QtPnB3X25hbWUpOworICAgIGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpIGRvX3JlbW92ZShwd2QtPnB3X25hbWUpOworICB9IGVsc2UgeworICAgIGlmIChGTEFHX2VscikgaGVscF9leGl0KCJubyBhcmd1bWVudHMgcGVybWl0dGVkIGFmdGVyIHRoaXMgb3B0aW9uIik7CisgICAgZG9fcmVwbGFjZShwd2QtPnB3X25hbWUpOworICB9CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpKSBmcmVlKFRULmNkaXIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9kZC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9kZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTUxY2YKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2RkLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qIGRkLmMgLSBwcm9ncmFtIHRvIGNvbnZlcnQgYW5kIGNvcHkgYSBmaWxlLgorICoKKyAqIENvcHlyaWdodCAyMDEzIEFzaHdpbmkgS3VtYXIgPGFrLmFzaHdpbmlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogU2VlICBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2RkLmh0bWwKKworVVNFX0REKE5FV1RPWShkZCwgTlVMTCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgREQKKyAgYm9vbCAiZGQiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGRkIFtpZj1GSUxFXSBbb2Y9RklMRV0gW2licz1OXSBbb2JzPU5dIFticz1OXSBbY291bnQ9Tl0gW3NraXA9Tl0KKyAgICAgICAgICAgIFtzZWVrPU5dIFtjb252PW5vdHJ1bmN8bm9lcnJvcnxzeW5jfGZzeW5jXSBbc3RhdHVzPW5veGZlcnxub25lXQorCisgICAgT3B0aW9uczoKKyAgICBpZj1GSUxFICAgUmVhZCBmcm9tIEZJTEUgaW5zdGVhZCBvZiBzdGRpbgorICAgIG9mPUZJTEUgICBXcml0ZSB0byBGSUxFIGluc3RlYWQgb2Ygc3Rkb3V0CisgICAgYnM9TiAgICAgIFJlYWQgYW5kIHdyaXRlIE4gYnl0ZXMgYXQgYSB0aW1lCisgICAgaWJzPU4gICAgIFJlYWQgTiBieXRlcyBhdCBhIHRpbWUKKyAgICBvYnM9TiAgICAgV3JpdGUgTiBieXRlcyBhdCBhIHRpbWUKKyAgICBjb3VudD1OICAgQ29weSBvbmx5IE4gaW5wdXQgYmxvY2tzCisgICAgc2tpcD1OICAgIFNraXAgTiBpbnB1dCBibG9ja3MKKyAgICBzZWVrPU4gICAgU2tpcCBOIG91dHB1dCBibG9ja3MKKyAgICBjb252PW5vdHJ1bmMgIERvbid0IHRydW5jYXRlIG91dHB1dCBmaWxlCisgICAgY29udj1ub2Vycm9yICBDb250aW51ZSBhZnRlciByZWFkIGVycm9ycworICAgIGNvbnY9c3luYyAgICAgUGFkIGJsb2NrcyB3aXRoIHplcm9zCisgICAgY29udj1mc3luYyAgICBQaHlzaWNhbGx5IHdyaXRlIGRhdGEgb3V0IGJlZm9yZSBmaW5pc2hpbmcKKyAgICBzdGF0dXM9bm94ZmVyIERvbid0IHNob3cgdHJhbnNmZXIgcmF0ZQorICAgIHN0YXR1cz1ub25lICAgRG9uJ3Qgc2hvdyB0cmFuc2ZlciByYXRlIG9yIHJlY29yZHMgaW4vb3V0CisKKyAgICBOdW1iZXJzIG1heSBiZSBzdWZmaXhlZCBieSBjICgqMSksIHcgKCoyKSwgYiAoKjUxMiksIGtEICgqMTAwMCksIGsgKCoxMDI0KSwKKyAgICBNRCAoKjEwMDAqMTAwMCksIE0gKCoxMDI0KjEwMjQpLCBHRCAoKjEwMDAqMTAwMCoxMDAwKSBvciBHICgqMTAyNCoxMDI0KjEwMjQpLgorKi8KKworI2RlZmluZSBGT1JfZGQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGludCBzaG93X3hmZXI7CisgIGludCBzaG93X3JlY29yZHM7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlcywgY19jb3VudCwgaW5fZnVsbCwgaW5fcGFydCwgb3V0X2Z1bGwsIG91dF9wYXJ0OworICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKKyAgc3RydWN0IHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBmZDsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmLCAqYnA7CisgICAgbG9uZyBzeiwgY291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldDsKKyAgfSBpbiwgb3V0OworKTsKKworI2RlZmluZSBDX0NPTlYgICAgMHgwMDAwCisjZGVmaW5lIENfQlMgICAgICAweDAwMDEKKyNkZWZpbmUgQ19DT1VOVCAgIDB4MDAwMgorI2RlZmluZSBDX0lCUyAgICAgMHgwMDA0CisjZGVmaW5lIENfT0JTICAgICAweDAwMDgKKyNkZWZpbmUgQ19JRiAgICAgIDB4MDAxMAorI2RlZmluZSBDX09GICAgICAgMHgwMDIwCisjZGVmaW5lIENfU0VFSyAgICAweDAwNDAKKyNkZWZpbmUgQ19TS0lQICAgIDB4MDA4MAorI2RlZmluZSBDX1NZTkMgICAgMHgwMTAwCisjZGVmaW5lIENfRlNZTkMgICAweDAyMDAKKyNkZWZpbmUgQ19OT0VSUk9SIDB4MDQwMAorI2RlZmluZSBDX05PVFJVTkMgMHgwODAwCisjZGVmaW5lIENfU1RBVFVTICAweDEwMDAKKworc3RydWN0IHBhaXIgeworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCB2YWw7Cit9OworCitzdGF0aWMgc3RydWN0IHBhaXIgc3VmZml4ZXNbXSA9IHsKKyAgeyAiYyIsIDEgfSwgeyAidyIsIDIgfSwgeyAiYiIsIDUxMiB9LAorICB7ICJrRCIsIDEwMDAgfSwgeyAiayIsIDEwMjQgfSwgeyAiSyIsIDEwMjQgfSwKKyAgeyAiTUQiLCAxMDAwMDAwIH0sIHsgIk0iLCAxMDQ4NTc2IH0sCisgIHsgIkdEIiwgMTAwMDAwMDAwMCB9LCB7ICJHIiwgMTA3Mzc0MTgyNCB9Cit9OworCitzdGF0aWMgc3RydWN0IHBhaXIgY2xpc3RbXSA9IHsKKyAgeyAiZnN5bmMiLCAgICBDX0ZTWU5DIH0sCisgIHsgIm5vZXJyb3IiLCAgQ19OT0VSUk9SIH0sCisgIHsgIm5vdHJ1bmMiLCAgQ19OT1RSVU5DIH0sCisgIHsgInN5bmMiLCAgICAgQ19TWU5DIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBhaXIgb3BlcmFuZHNbXSA9IHsKKyAgLy8ga2VlcCB0aGUgYXJyYXkgc29ydGVkIGJ5IG5hbWUsIGJzZWFyY2goKSBjYW4gYmUgdXNlZC4KKyAgeyAiYnMiLCAgICAgIENfQlMgICAgfSwKKyAgeyAiY29udiIsICAgIENfQ09OViAgfSwKKyAgeyAiY291bnQiLCAgIENfQ09VTlQgfSwKKyAgeyAiaWJzIiwgICAgIENfSUJTICAgfSwKKyAgeyAiaWYiLCAgICAgIENfSUYgICAgfSwKKyAgeyAib2JzIiwgICAgIENfT0JTICAgfSwKKyAgeyAib2YiLCAgICAgIENfT0YgICAgfSwKKyAgeyAic2VlayIsICAgIENfU0VFSyAgfSwKKyAgeyAic2tpcCIsICAgIENfU0tJUCAgfSwKKyAgeyAic3RhdHVzIiwgIENfU1RBVFVTfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3Ryc3VmdG9sbChjaGFyICphcmcsIGludCBkZWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXgpCit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQ7CisgIGNoYXIgKnAgPSBhcmc7CisgIGludCBpLCBpZHggPSAtMTsKKworICB3aGlsZSAoaXNzcGFjZSgqcCkpIHArKzsKKyAgaWYgKCpwID09ICctJykgZXJyb3JfZXhpdCgiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisKKyAgZXJybm8gPSAwOworICByZXN1bHQgPSBzdHJ0b3VsbChwLCAmcCwgMCk7CisgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgcmVzdWx0ID4gbWF4IHx8IHJlc3VsdCA8IGRlZikKKyAgICBwZXJyb3JfZXhpdCgiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisgIGlmICgqcCAhPSAnXDAnKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX0xFTihzdWZmaXhlcyk7IGkrKykKKyAgICAgIGlmICghc3RyY21wKHAsIHN1ZmZpeGVzW2ldLm5hbWUpKSBpZHggPSBpOworICAgIGlmIChpZHggPT0gLTEgfHwgKG1heC9zdWZmaXhlc1tpZHhdLnZhbCA8IHJlc3VsdCkpIAorICAgICAgZXJyb3JfZXhpdCgiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisgICAgcmVzdWx0ICo9IHN1ZmZpeGVzW2lkeF0udmFsOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXR1cygpCit7CisgIGRvdWJsZSBzZWNvbmRzOworICBzdHJ1Y3QgdGltZXZhbCBub3c7CisKKyAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICBzZWNvbmRzID0gKChub3cudHZfc2VjICogMTAwMDAwMCArIG5vdy50dl91c2VjKSAtCisgICAgICAoVFQuc3RhcnQudHZfc2VjICogMTAwMDAwMCArIFRULnN0YXJ0LnR2X3VzZWMpKS8xMDAwMDAwLjA7CisKKyAgaWYgKFRULnNob3dfcmVjb3JkcykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVsbHUrJWxsdSByZWNvcmRzIGluXG4lbGx1KyVsbHUgcmVjb3JkcyBvdXRcbiIsCisgICAgICAgICAgICBUVC5pbl9mdWxsLCBUVC5pbl9wYXJ0LCBUVC5vdXRfZnVsbCwgVFQub3V0X3BhcnQpOworCisgIGlmIChUVC5zaG93X3hmZXIpIHsKKyAgICBodW1hbl9yZWFkYWJsZSh0b3lidWYsIFRULmJ5dGVzLCBIUl9TUEFDRXxIUl9CKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVsbHUgYnl0ZXMgKCVzKSBjb3BpZWQsICIsIFRULmJ5dGVzLCB0b3lidWYpOworICAgIGh1bWFuX3JlYWRhYmxlKHRveWJ1ZiwgVFQuYnl0ZXMvc2Vjb25kcywgSFJfU1BBQ0V8SFJfQik7CisgICAgZnByaW50ZihzdGRlcnIsICIlZiBzLCAlcy9zXG4iLCBzZWNvbmRzLCB0b3lidWYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX291dChpbnQgYWxsKQoreworICBUVC5vdXQuYnAgPSBUVC5vdXQuYnVmZjsKKyAgd2hpbGUgKFRULm91dC5jb3VudCkgeworICAgIHNzaXplX3QgbncgPSB3cml0ZWFsbChUVC5vdXQuZmQsIFRULm91dC5icCwgKChhbGwpPyBUVC5vdXQuY291bnQgOiBUVC5vdXQuc3opKTsKKworICAgIGFsbCA9IDA7IC8vZnVydGhlciB3cml0ZXMgd2lsbCBiZSBvbiBvYnMKKyAgICBpZiAobncgPD0gMCkgcGVycm9yX2V4aXQoIiVzOiB3cml0ZSBlcnJvciIsIFRULm91dC5uYW1lKTsKKyAgICBpZiAobncgPT0gVFQub3V0LnN6KSBUVC5vdXRfZnVsbCsrOworICAgIGVsc2UgVFQub3V0X3BhcnQrKzsKKyAgICBUVC5vdXQuY291bnQgLT0gbnc7CisgICAgVFQub3V0LmJwICs9IG53OworICAgIFRULmJ5dGVzICs9IG53OworICAgIGlmIChUVC5vdXQuY291bnQgPCBUVC5vdXQuc3opIGJyZWFrOworICB9CisgIGlmIChUVC5vdXQuY291bnQpIG1lbW1vdmUoVFQub3V0LmJ1ZmYsIFRULm91dC5icCwgVFQub3V0LmNvdW50KTsgLy9tb3ZlIHJlbWFpbmRlciB0byBmcm9udAorfQorCitzdGF0aWMgaW50IGNvbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgLy9jb25zdCB0byBzaHV0IGNvbXBpbGVyIHVwCit7CisgIHJldHVybiBzdHJjbXAoKChzdHJ1Y3QgcGFpciopYSktPm5hbWUsICgoc3RydWN0IHBhaXIqKWIpLT5uYW1lKTsKK30KKwordm9pZCBkZF9tYWluKCkKK3sKKyAgc3RydWN0IHBhaXIgKnJlcywga2V5OworICBjaGFyICphcmc7CisgIGxvbmcgc3o7CisKKyAgVFQuc2hvd194ZmVyID0gVFQuc2hvd19yZWNvcmRzID0gMTsKKworICBUVC5pbi5zeiA9IFRULm91dC5zeiA9IDUxMjsgLy9kZWZhdWx0IGlvIGJsb2NrIHNpemUKKyAgd2hpbGUgKCp0b3lzLm9wdGFyZ3MpIHsKKyAgICBpZiAoIShhcmcgPSBzdHJjaHIoKnRveXMub3B0YXJncywgJz0nKSkpIGVycm9yX2V4aXQoInVua25vd24gYXJnICVzIiwgKnRveXMub3B0YXJncyk7CisgICAgKmFyZysrID0gJ1wwJzsKKyAgICBpZiAoISphcmcpIGhlbHBfZXhpdCgwKTsKKyAgICBrZXkubmFtZSA9ICp0b3lzLm9wdGFyZ3M7CisgICAgaWYgKCEocmVzID0gYnNlYXJjaCgma2V5LCBvcGVyYW5kcywgQVJSQVlfTEVOKG9wZXJhbmRzKSwgc2l6ZW9mKHN0cnVjdCBwYWlyKSwKKyAgICAgICAgICAgIGNvbXApKSkgZXJyb3JfZXhpdCgidW5rbm93biBhcmcgJXMiLCBrZXkubmFtZSk7CisKKyAgICB0b3lzLm9wdGZsYWdzIHw9IHJlcy0+dmFsOworICAgIHN3aXRjaCAocmVzLT52YWwpIHsKKyAgICAgIGNhc2UgQ19CUzoKKyAgICAgICAgVFQuaW4uc3ogPSBUVC5vdXQuc3ogPSBzdHJzdWZ0b2xsKGFyZywgMSwgTE9OR19NQVgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ19JQlM6CisgICAgICAgIHN6ID0gc3Ryc3VmdG9sbChhcmcsIDEsIExPTkdfTUFYKTsKKyAgICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIENfQlMpKSBUVC5pbi5zeiA9IHN6OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ19PQlM6CisgICAgICAgIHN6ID0gc3Ryc3VmdG9sbChhcmcsIDEsIExPTkdfTUFYKTsKKyAgICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIENfQlMpKSBUVC5vdXQuc3ogPSBzejsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENfQ09VTlQ6CisgICAgICAgIFRULmNfY291bnQgPSBzdHJzdWZ0b2xsKGFyZywgMCwgVUxMT05HX01BWCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDX0lGOgorICAgICAgICBUVC5pbi5uYW1lID0gYXJnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ19PRjoKKyAgICAgICAgVFQub3V0Lm5hbWUgPSBhcmc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDX1NFRUs6CisgICAgICAgIFRULm91dC5vZmZzZXQgPSBzdHJzdWZ0b2xsKGFyZywgMCwgVUxMT05HX01BWCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDX1NLSVA6CisgICAgICAgIFRULmluLm9mZnNldCA9IHN0cnN1ZnRvbGwoYXJnLCAwLCBVTExPTkdfTUFYKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENfU1RBVFVTOgorICAgICAgICBpZiAoIXN0cmNtcChhcmcsICJub3hmZXIiKSkgVFQuc2hvd194ZmVyID0gMDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICJub25lIikpIFRULnNob3dfeGZlciA9IFRULnNob3dfcmVjb3JkcyA9IDA7CisgICAgICAgIGVsc2UgZXJyb3JfZXhpdCgidW5rbm93biBzdGF0dXMgJyVzJyIsIGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDX0NPTlY6CisgICAgICAgIHdoaWxlIChhcmcpIHsKKyAgICAgICAgICBrZXkubmFtZSA9IHN0cnNlcCgmYXJnLCAiLCIpOworICAgICAgICAgIGlmICghKHJlcyA9IGJzZWFyY2goJmtleSwgY2xpc3QsIEFSUkFZX0xFTihjbGlzdCksIAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBwYWlyKSwgY29tcCkpKQorICAgICAgICAgICAgZXJyb3JfZXhpdCgidW5rbm93biBjb252ZXJzaW9uICVzIiwga2V5Lm5hbWUpOworCisgICAgICAgICAgdG95cy5vcHRmbGFncyB8PSByZXMtPnZhbDsKKyAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgdG95cy5vcHRhcmdzKys7CisgIH0KKworICBzaWduYWwoU0lHSU5ULCBnZW5lcmljX3NpZ25hbCk7CisgIHNpZ25hbChTSUdVU1IxLCBnZW5lcmljX3NpZ25hbCk7CisgIGdldHRpbWVvZmRheSgmVFQuc3RhcnQsIE5VTEwpOworCisgIC8qIGZvciBDX0JTLCBpbi9vdXQgaXMgZG9uZSBhcyBpdCBpcy4gc28gb25seSBpbi5zeiBpcyBlbm91Z2guCisgICAqIFdpdGggU2luZ2xlIGJ1ZmZlciB0aGVyZSB3aWxsIGJlIG92ZXJmbG93IGluIGEgcmVhZCBmb2xsb3dpbmcgcGFydGlhbCByZWFkCisgICAqLworICBUVC5pbi5idWZmID0gVFQub3V0LmJ1ZmYgPSB4bWFsbG9jKFRULmluLnN6CisgICAgKyAoKHRveXMub3B0ZmxhZ3MgJiBDX0JTKSA/IDAgOiBUVC5vdXQuc3opKTsKKyAgVFQuaW4uYnAgPSBUVC5vdXQuYnAgPSBUVC5pbi5idWZmOworICAvL3NldHVwIGlucHV0CisgIGlmICghVFQuaW4ubmFtZSkgVFQuaW4ubmFtZSA9ICJzdGRpbiI7CisgIGVsc2UgVFQuaW4uZmQgPSB4b3BlbnJvKFRULmluLm5hbWUpOworCisgIC8vc2V0dXAgb3V0cHV0CisgIGlmICghVFQub3V0Lm5hbWUpIHsKKyAgICBUVC5vdXQubmFtZSA9ICJzdGRvdXQiOworICAgIFRULm91dC5mZCA9IDE7CisgIH0gZWxzZSBUVC5vdXQuZmQgPSB4Y3JlYXRlKFRULm91dC5uYW1lLAorICAgICAgT19XUk9OTFl8T19DUkVBVHwoT19UUlVOQyohKHRveXMub3B0ZmxhZ3MmQ19OT1RSVU5DKSksIDA2NjYpOworCisgIC8vIEltcGxlbWVudCBza2lwPQorICBpZiAoVFQuaW4ub2Zmc2V0KSB7CisgICAgaWYgKGxzZWVrKFRULmluLmZkLCAob2ZmX3QpKFRULmluLm9mZnNldCAqIFRULmluLnN6KSwgU0VFS19DVVIpIDwgMCkgeworICAgICAgd2hpbGUgKFRULmluLm9mZnNldC0tKSB7CisgICAgICAgIHNzaXplX3QgbiA9IHJlYWQoVFQuaW4uZmQsIFRULmluLmJwLCBUVC5pbi5zeik7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgcGVycm9yX21zZygiJXMiLCBUVC5pbi5uYW1lKTsKKyAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIENfTk9FUlJPUikgc3RhdHVzKCk7CisgICAgICAgICAgZWxzZSByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoIW4pIHsKKyAgICAgICAgICB4cHJpbnRmKCIlczogQ2FuJ3Qgc2tpcFxuIiwgVFQuaW4ubmFtZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKFRULm91dC5vZmZzZXQpCisgICAgeGxzZWVrKFRULm91dC5mZCwgVFQub3V0Lm9mZnNldCAqIChvZmZfdClUVC5vdXQuc3osIFNFRUtfQ1VSKTsKKworICBpZiAoKHRveXMub3B0ZmxhZ3MmQ19TRUVLKSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBDX05PVFJVTkMpKQorICAgIGlmIChmdHJ1bmNhdGUoVFQub3V0LmZkLCBUVC5vdXQub2Zmc2V0ICogVFQub3V0LnN6KSkKKyAgICAgIHBlcnJvcl9leGl0KCJmdHJ1bmNhdGUiKTsKKworICB3aGlsZSAoISh0b3lzLm9wdGZsYWdzICYgQ19DT1VOVCkgfHwgKFRULmluX2Z1bGwgKyBUVC5pbl9wYXJ0KSA8IFRULmNfY291bnQpIHsKKyAgICBzc2l6ZV90IG47CisKKyAgICAvLyBTaG93IHByb2dyZXNzIGFuZCBleGl0IG9uIFNJR0lOVCBvciBqdXN0IGNvbnRpbnVlIG9uIFNJR1VTUjEuCisgICAgaWYgKHRveXMuc2lnbmFsKSB7CisgICAgICBzdGF0dXMoKTsKKyAgICAgIGlmICh0b3lzLnNpZ25hbD09U0lHSU5UKSBleGl0X3NpZ25hbCh0b3lzLnNpZ25hbCk7CisgICAgICB0b3lzLnNpZ25hbCA9IDA7CisgICAgfQorCisgICAgVFQuaW4uYnAgPSBUVC5pbi5idWZmICsgVFQuaW4uY291bnQ7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBDX1NZTkMpIG1lbXNldChUVC5pbi5icCwgMCwgVFQuaW4uc3opOworICAgIGlmICghKG4gPSByZWFkKFRULmluLmZkLCBUVC5pbi5icCwgVFQuaW4uc3opKSkgYnJlYWs7CisgICAgaWYgKG4gPCAwKSB7IAorICAgICAgaWYgKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgIC8vcmVhZCBlcnJvciBjYXNlLgorICAgICAgcGVycm9yX21zZygiJXM6IHJlYWQgZXJyb3IiLCBUVC5pbi5uYW1lKTsKKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBDX05PRVJST1IpKSBleGl0KDEpOworICAgICAgc3RhdHVzKCk7CisgICAgICB4bHNlZWsoVFQuaW4uZmQsIFRULmluLnN6LCBTRUVLX0NVUik7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgQ19TWU5DKSkgY29udGludWU7CisgICAgICAvLyBpZiBTWU5DLCB0aGVuIHRyZWF0IGFzIGZ1bGwgYmxvY2sgb2YgbnVscworICAgICAgbiA9IFRULmluLnN6OworICAgIH0KKyAgICBpZiAobiA9PSBUVC5pbi5zeikgeworICAgICAgVFQuaW5fZnVsbCsrOworICAgICAgVFQuaW4uY291bnQgKz0gbjsKKyAgICB9IGVsc2UgeworICAgICAgVFQuaW5fcGFydCsrOworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBDX1NZTkMpIFRULmluLmNvdW50ICs9IFRULmluLnN6OworICAgICAgZWxzZSBUVC5pbi5jb3VudCArPSBuOworICAgIH0KKworICAgIFRULm91dC5jb3VudCA9IFRULmluLmNvdW50OworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgQ19CUykgeworICAgICAgd3JpdGVfb3V0KDEpOworICAgICAgVFQuaW4uY291bnQgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKFRULmluLmNvdW50ID49IFRULm91dC5zeikgeworICAgICAgd3JpdGVfb3V0KDApOworICAgICAgVFQuaW4uY291bnQgPSBUVC5vdXQuY291bnQ7CisgICAgfQorICB9CisgIGlmIChUVC5vdXQuY291bnQpIHdyaXRlX291dCgxKTsgLy93cml0ZSBhbnkgcmVtYWluaW5nIGlucHV0IGJsb2NrcworICBpZiAodG95cy5vcHRmbGFncyAmIENfRlNZTkMgJiYgZnN5bmMoVFQub3V0LmZkKSA8IDApIAorICAgIHBlcnJvcl9leGl0KCIlczogZnN5bmMgZmFpbCIsIFRULm91dC5uYW1lKTsKKworICBjbG9zZShUVC5pbi5mZCk7CisgIGNsb3NlKFRULm91dC5mZCk7CisgIGlmIChUVC5pbi5idWZmKSBmcmVlKFRULmluLmJ1ZmYpOworCisgIHN0YXR1cygpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9kaGNwLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2RoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTliYjRjCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9kaGNwLmMKQEAgLTAsMCArMSwxNTI0IEBACisvKiBkaGNwLmMgLSBESENQIGNsaWVudCBmb3IgZHluYW1pYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTIgTWFkaHVyIFZlcm1hIDxtYWQuZmxleGlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm90IGluIFNVU3Y0LgorVVNFX0RIQ1AoTkVXVE9ZKGRoY3AsICJWOkg6Rjp4KnI6TypBIzwwPTIwVCM8MD0zdCM8MD0zczpwOmk6U0JSQ2FvdnFuYmYiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ST09UT05MWSkpCisKK2NvbmZpZyBESENQCisgIGJvb2wgImRoY3AiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICB1c2FnZTogZGhjcCBbLWZibnF2b0NSQl0gWy1pIElGQUNFXSBbLXIgSVBdIFstcyBQUk9HXSBbLXAgUElERklMRV0KKyAgICAgICAgICAgICAgIFstSCBIT1NUTkFNRV0gWy1WIFZFTkRPUl0gWy14IE9QVDpWQUxdIFstTyBPUFRdCisKKyAgICAgICAgQ29uZmlndXJlIG5ldHdvcmsgZHluYW1pY2FseSB1c2luZyBESENQLgorCisgICAgICAtaSBJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApCisgICAgICAtcCBDcmVhdGUgcGlkZmlsZQorICAgICAgLXMgUnVuIFBST0cgYXQgREhDUCBldmVudHMgKGRlZmF1bHQgL3Vzci9zaGFyZS9kaGNwL2RlZmF1bHQuc2NyaXB0KQorICAgICAgLUIgUmVxdWVzdCBicm9hZGNhc3QgcmVwbGllcworICAgICAgLXQgU2VuZCB1cCB0byBOIGRpc2NvdmVyIHBhY2tldHMKKyAgICAgIC1UIFBhdXNlIGJldHdlZW4gcGFja2V0cyAoZGVmYXVsdCAzIHNlY29uZHMpCisgICAgICAtQSBXYWl0IE4gc2Vjb25kcyBhZnRlciBmYWlsdXJlIChkZWZhdWx0IDIwKQorICAgICAgLWYgUnVuIGluIGZvcmVncm91bmQKKyAgICAgIC1iIEJhY2tncm91bmQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkCisgICAgICAtbiBFeGl0IGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZAorICAgICAgLXEgRXhpdCBhZnRlciBvYnRhaW5pbmcgbGVhc2UKKyAgICAgIC1SIFJlbGVhc2UgSVAgb24gZXhpdAorICAgICAgLVMgTG9nIHRvIHN5c2xvZyB0b28KKyAgICAgIC1hIFVzZSBhcnBpbmcgdG8gdmFsaWRhdGUgb2ZmZXJlZCBhZGRyZXNzCisgICAgICAtTyBSZXF1ZXN0IG9wdGlvbiBPUFQgZnJvbSBzZXJ2ZXIgKGN1bXVsYXRpdmUpCisgICAgICAtbyBEb24ndCByZXF1ZXN0IGFueSBvcHRpb25zICh1bmxlc3MgLU8gaXMgZ2l2ZW4pCisgICAgICAtciBSZXF1ZXN0IHRoaXMgSVAgYWRkcmVzcworICAgICAgLXggT1BUOlZBTCAgSW5jbHVkZSBvcHRpb24gT1BUIGluIHNlbnQgcGFja2V0cyAoY3VtdWxhdGl2ZSkKKyAgICAgIC1GIEFzayBzZXJ2ZXIgdG8gdXBkYXRlIEROUyBtYXBwaW5nIGZvciBOQU1FCisgICAgICAtSCBTZW5kIE5BTUUgYXMgY2xpZW50IGhvc3RuYW1lIChkZWZhdWx0IG5vbmUpCisgICAgICAtViBWRU5ET1IgVmVuZG9yIGlkZW50aWZpZXIgKGRlZmF1bHQgJ3RveWJveCBWRVJTSU9OJykKKyAgICAgIC1DIERvbid0IHNlbmQgTUFDIGFzIGNsaWVudCBpZGVudGlmaWVyCisgICAgICAtdiBWZXJib3NlCisKKyAgICAgIFNpZ25hbHM6CisgICAgICBVU1IxICBSZW5ldyBjdXJyZW50IGxlYXNlCisgICAgICBVU1IyICBSZWxlYXNlIGN1cnJlbnQgbGVhc2UKKworKi8KKworI2RlZmluZSBGT1JfZGhjcAorI2luY2x1ZGUgInRveXMuaCIKKworLy8gVE9ETzogaGVhZGVycyBub3QgaW4gcG9zaXg6CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorCisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+IC8vRklYTUU6IGxpbnV4IHNwZWNpZmljLiBmaXggZm9yIG90aGVyIE9TIHBvcnRzCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworR0xPQkFMUygKKyAgICBjaGFyICppZmFjZTsKKyAgICBjaGFyICpwaWRmaWxlOworICAgIGNoYXIgKnNjcmlwdDsKKyAgICBsb25nIHJldHJpZXM7CisgICAgbG9uZyB0aW1lb3V0OworICAgIGxvbmcgdHJ5YWdhaW47CisgICAgc3RydWN0IGFyZ19saXN0ICpyZXFfb3B0OworICAgIGNoYXIgKnJlcV9pcDsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKnBrdF9vcHQ7CisgICAgY2hhciAqZmRuX25hbWU7CisgICAgY2hhciAqaG9zdG5hbWU7CisgICAgY2hhciAqdmVuZG9yX2NsczsKKykKKworI2RlZmluZSBTVEFURV9JTklUICAgICAgICAgICAgMAorI2RlZmluZSBTVEFURV9SRVFVRVNUSU5HICAgICAgMQorI2RlZmluZSBTVEFURV9CT1VORCAgICAgICAgICAgMgorI2RlZmluZSBTVEFURV9SRU5FV0lORyAgICAgICAgMworI2RlZmluZSBTVEFURV9SRUJJTkRJTkcgICAgICAgNAorI2RlZmluZSBTVEFURV9SRU5FV19SRVFVRVNURUQgNQorI2RlZmluZSBTVEFURV9SRUxFQVNFRCAgICAgICAgNgorCisjZGVmaW5lIEJPT1RQX0JST0FEQ0FTVCAgIDB4ODAwMAorI2RlZmluZSBESENQX01BR0lDICAgICAgICAweDYzODI1MzYzCisKKyNkZWZpbmUgREhDUF9SRVFVRVNUICAgICAgICAgIDEKKyNkZWZpbmUgREhDUF9SRVBMWSAgICAgICAgICAgIDIKKyNkZWZpbmUgREhDUF9IVFlQRV9FVEhFUk5FVCAgIDEKKworI2RlZmluZSBESENQQ19TRVJWRVJfUE9SVCAgICAgNjcKKyNkZWZpbmUgREhDUENfQ0xJRU5UX1BPUlQgICAgIDY4CisKKyNkZWZpbmUgREhDUERJU0NPVkVSICAgICAgMQorI2RlZmluZSBESENQT0ZGRVIgICAgICAgICAyCisjZGVmaW5lIERIQ1BSRVFVRVNUICAgICAgIDMKKyNkZWZpbmUgREhDUEFDSyAgICAgICAgICAgNQorI2RlZmluZSBESENQTkFLICAgICAgICAgICA2CisjZGVmaW5lIERIQ1BSRUxFQVNFICAgICAgIDcKKworI2RlZmluZSBESENQX09QVElPTl9QQURESU5HICAgICAweDAwCisjZGVmaW5lIERIQ1BfT1BUSU9OX1NVQk5FVF9NQVNLIDB4MDEKKyNkZWZpbmUgREhDUF9PUFRJT05fUk9VVEVSICAgICAgMHgwMworI2RlZmluZSBESENQX09QVElPTl9ETlNfU0VSVkVSICAweDA2CisjZGVmaW5lIERIQ1BfT1BUSU9OX0hPU1RfTkFNRSAgIDB4MGMKKyNkZWZpbmUgREhDUF9PUFRJT05fQlJPQURDQVNUICAgMHgxYworI2RlZmluZSBESENQX09QVElPTl9SRVFfSVBBRERSICAweDMyCisjZGVmaW5lIERIQ1BfT1BUSU9OX0xFQVNFX1RJTUUgIDB4MzMKKyNkZWZpbmUgREhDUF9PUFRJT05fT1ZFUkxPQUQgICAgMHgzNAorI2RlZmluZSBESENQX09QVElPTl9NU0dfVFlQRSAgICAweDM1CisjZGVmaW5lIERIQ1BfT1BUSU9OX1NFUlZFUl9JRCAgIDB4MzYKKyNkZWZpbmUgREhDUF9PUFRJT05fUkVRX0xJU1QgICAgMHgzNworI2RlZmluZSBESENQX09QVElPTl9NQVhfU0laRSAgICAweDM5CisjZGVmaW5lIERIQ1BfT1BUSU9OX0NMSUVOVElEICAgIDB4M0QKKyNkZWZpbmUgREhDUF9PUFRJT05fVkVORE9SICAgICAgMHgzQworI2RlZmluZSBESENQX09QVElPTl9GUUROICAgICAgICAweDUxCisjZGVmaW5lIERIQ1BfT1BUSU9OX0VORCAgICAgICAgIDB4RkYKKworI2RlZmluZSBESENQX05VTTggICAgICAgICAgICgxPDw4KQorI2RlZmluZSBESENQX05VTTE2ICAgICAgICAgICgxPDw5KQorI2RlZmluZSBESENQX05VTTMyICAgICAgICAgIERIQ1BfTlVNMTYgfCBESENQX05VTTgKKyNkZWZpbmUgREhDUF9TVFJJTkcgICAgICAgICAoMTw8MTApCisjZGVmaW5lIERIQ1BfU1RSTFNUICAgICAgICAgKDE8PDExKQorI2RlZmluZSBESENQX0lQICAgICAgICAgICAgICgxPDwxMikKKyNkZWZpbmUgREhDUF9JUExJU1QgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIERIQ1BfSVBQTFNUICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBESENQX1NUQ1JUUyAgICAgICAgICgxPDwxNSkKKworI2RlZmluZSBMT0dfU0lMRU5UICAgICAgICAgIDB4MAorI2RlZmluZSBMT0dfQ09OU09MRSAgICAgICAgIDB4MQorI2RlZmluZSBMT0dfU1lTVEVNICAgICAgICAgIDB4MgorCisjZGVmaW5lIE1PREVfT0ZGICAgICAgICAwCisjZGVmaW5lIE1PREVfUkFXICAgICAgICAxCisjZGVmaW5lIE1PREVfQVBQICAgICAgICAyCisKK3N0YXRpYyB2b2lkICgqZGJnKShjaGFyICpmb3JtYXQsIC4uLik7CitzdGF0aWMgdm9pZCBkdW1teShjaGFyICpmb3JtYXQsIC4uLil7CisJcmV0dXJuOworfQorCit0eXBlZGVmIHN0cnVjdCBkaGNwY19yZXN1bHRfcyB7CisgIHN0cnVjdCBpbl9hZGRyIHNlcnZlcmlkOworICBzdHJ1Y3QgaW5fYWRkciBpcGFkZHI7CisgIHN0cnVjdCBpbl9hZGRyIG5ldG1hc2s7CisgIHN0cnVjdCBpbl9hZGRyIGRuc2FkZHI7CisgIHN0cnVjdCBpbl9hZGRyIGRlZmF1bHRfcm91dGVyOworICB1aW50MzJfdCBsZWFzZV90aW1lOworfSBkaGNwY19yZXN1bHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGhjcF9tc2dfcyB7CisgIHVpbnQ4X3Qgb3A7CisgIHVpbnQ4X3QgaHR5cGU7CisgIHVpbnQ4X3QgaGxlbjsKKyAgdWludDhfdCBob3BzOworICB1aW50MzJfdCB4aWQ7CisgIHVpbnQxNl90IHNlY3M7CisgIHVpbnQxNl90IGZsYWdzOworICB1aW50MzJfdCBjaWFkZHI7CisgIHVpbnQzMl90IHlpYWRkcjsKKyAgdWludDMyX3QgbnNpYWRkcjsKKyAgdWludDMyX3QgbmdpYWRkcjsKKyAgdWludDhfdCBjaGFkZHJbMTZdOworICB1aW50OF90IHNuYW1lWzY0XTsKKyAgdWludDhfdCBmaWxlWzEyOF07CisgIHVpbnQzMl90IGNvb2tpZTsKKyAgdWludDhfdCBvcHRpb25zWzMwOF07Cit9IGRoY3BfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGRoY3BfcmF3X3MgeworICBzdHJ1Y3QgaXBoZHIgaXBoOworICBzdHJ1Y3QgdWRwaGRyIHVkcGg7CisgIGRoY3BfbXNnX3QgZGhjcDsKK30gZGhjcF9yYXdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGhjcGNfc3RhdGVfcyB7CisgIHVpbnQ4X3QgbWFjYWRkcls2XTsKKyAgIGNoYXIgKmlmYWNlOworICBpbnQgaWZpbmRleDsKKyAgaW50IHNvY2tmZDsKKyAgaW50IHN0YXR1czsKKyAgaW50IG1vZGU7CisgIHVpbnQzMl90IG1hc2s7CisgIHN0cnVjdCBpbl9hZGRyIGlwYWRkcjsKKyAgc3RydWN0IGluX2FkZHIgc2VydmVyaWQ7CisgIGRoY3BfbXNnX3QgcGRoY3A7Cit9IGRoY3BjX3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9wdGlvbl92YWxfcyB7CisgIGNoYXIgKmtleTsKKyAgdWludDE2X3QgY29kZTsKKyAgdm9pZCAqdmFsOworICBzaXplX3QgbGVuOworfSBvcHRpb25fdmFsX3Q7CisKK3N0cnVjdCBmZF9wYWlyIHsgaW50IHJkOyBpbnQgd3I7IH07CitzdGF0aWMgdWludDMyX3QgeGlkOworc3RhdGljIGRoY3BjX3N0YXRlX3QgKnN0YXRlOworc3RhdGljIHN0cnVjdCBmZF9wYWlyIHNpZ2ZkOwordWludDhfdCBibWFjYWRkcls2XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyBpbnQgc2V0ID0gMTsKK3VpbnQ4X3QgaW5mb21vZGUgPSBMT0dfQ09OU09MRTsKK3VpbnQ4X3QgcmF3X29wdFsyOV07CitpbnQgcmF3X29wdGNvdW50ID0gMDsKK3N0cnVjdCBhcmdfbGlzdCAqeF9vcHQ7Citpbl9hZGRyX3Qgc2VydmVyID0gMDsKKworc3RhdGljIG9wdGlvbl92YWxfdCAqbXNnb3B0X2xpc3QgPSBOVUxMOworc3RhdGljIG9wdGlvbl92YWxfdCBvcHRpb25zX2xpc3RbXSA9IHsKKyAgICB7ImxlYXNlIiAgICAgICAgICAsIERIQ1BfTlVNMzIgIHwgMHgzMywgTlVMTCwgMH0sCisgICAgeyJzdWJuZXQiICAgICAgICAgLCBESENQX0lQICAgICB8IDB4MDEsIE5VTEwsIDB9LAorICAgIHsiYnJvYWRjYXN0IiAgICAgICwgREhDUF9JUCAgICAgfCAweDFjLCBOVUxMLCAwfSwKKyAgICB7InJvdXRlciIgICAgICAgICAsIERIQ1BfSVAgICAgIHwgMHgwMywgTlVMTCwgMH0sCisgICAgeyJpcHR0bCIgICAgICAgICAgLCBESENQX05VTTggICB8IDB4MTcsIE5VTEwsIDB9LAorICAgIHsibXR1IiAgICAgICAgICAgICwgREhDUF9OVU0xNiAgfCAweDFhLCBOVUxMLCAwfSwKKyAgICB7Imhvc3RuYW1lIiAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHgwYywgTlVMTCwgMH0sCisgICAgeyJkb21haW4iICAgICAgICAgLCBESENQX1NUUklORyB8IDB4MGYsIE5VTEwsIDB9LAorICAgIHsic2VhcmNoIiAgICAgICAgICwgREhDUF9TVFJMU1QgfCAweDc3LCBOVUxMLCAwfSwKKyAgICB7Im5pc2RvbWFpbiIgICAgICAsIERIQ1BfU1RSSU5HIHwgMHgyOCwgTlVMTCwgMH0sCisgICAgeyJ0aW1lem9uZSIgICAgICAgLCBESENQX05VTTMyICB8IDB4MDIsIE5VTEwsIDB9LAorICAgIHsidGZ0cCIgICAgICAgICAgICwgREhDUF9TVFJJTkcgfCAweDQyLCBOVUxMLCAwfSwKKyAgICB7ImJvb3RmaWxlIiAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHg0MywgTlVMTCwgMH0sCisgICAgeyJib290c2l6ZSIgICAgICAgLCBESENQX05VTTE2ICB8IDB4MGQsIE5VTEwsIDB9LAorICAgIHsicm9vdHBhdGgiICAgICAgICwgREhDUF9TVFJJTkcgfCAweDExLCBOVUxMLCAwfSwKKyAgICB7IndwYWQiICAgICAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHhmYywgTlVMTCwgMH0sCisgICAgeyJzZXJ2ZXJpZCIgICAgICAgLCBESENQX0lQICAgICB8IDB4MzYsIE5VTEwsIDB9LAorICAgIHsibWVzc2FnZSIgICAgICAgICwgREhDUF9TVFJJTkcgfCAweDM4LCBOVUxMLCAwfSwKKyAgICB7InZsYW5pZCIgICAgICAgICAsIERIQ1BfTlVNMzIgIHwgMHg4NCwgTlVMTCwgMH0sCisgICAgeyJ2bGFucHJpb3JpdHkiICAgLCBESENQX05VTTMyICB8IDB4ODUsIE5VTEwsIDB9LAorICAgIHsiZG5zIiAgICAgICAgICAgICwgREhDUF9JUExJU1QgfCAweDA2LCBOVUxMLCAwfSwKKyAgICB7IndpbnMiICAgICAgICAgICAsIERIQ1BfSVBMSVNUIHwgMHgyYywgTlVMTCwgMH0sCisgICAgeyJuaXNzcnYiICAgICAgICAgLCBESENQX0lQTElTVCB8IDB4MjksIE5VTEwsIDB9LAorICAgIHsibnRwc3J2IiAgICAgICAgICwgREhDUF9JUExJU1QgfCAweDJhLCBOVUxMLCAwfSwKKyAgICB7ImxwcnNydiIgICAgICAgICAsIERIQ1BfSVBMSVNUIHwgMHgwOSwgTlVMTCwgMH0sCisgICAgeyJzd2Fwc3J2IiAgICAgICAgLCBESENQX0lQICAgICB8IDB4MTAsIE5VTEwsIDB9LAorICAgIHsicm91dGVzIiAgICAgICAgICwgREhDUF9TVENSVFMgfCAweDIxLCBOVUxMLCAwfSwKKyAgICB7InN0YXRpY3JvdXRlcyIgICAsIERIQ1BfU1RDUlRTIHwgMHg3OSwgTlVMTCwgMH0sCisgICAgeyJtc3N0YXRpY3JvdXRlcyIgLCBESENQX1NUQ1JUUyB8IDB4ZjksIE5VTEwsIDB9LAorfTsKKworc3RhdGljICBzdHJ1Y3Qgc29ja19maWx0ZXIgZmlsdGVyX2luc3RyW10gPSB7CisgICAgQlBGX1NUTVQoQlBGX0xEfEJQRl9CfEJQRl9BQlMsIDkpLAorICAgIEJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgSVBQUk9UT19VRFAsIDAsIDYpLAorICAgIEJQRl9TVE1UKEJQRl9MRHxCUEZfSHxCUEZfQUJTLCA2KSwKKyAgICBCUEZfSlVNUChCUEZfSk1QfEJQRl9KU0VUfEJQRl9LLCAweDFmZmYsIDQsIDApLAorICAgIEJQRl9TVE1UKEJQRl9MRFh8QlBGX0J8QlBGX01TSCwgMCksIEJQRl9TVE1UKEJQRl9MRHxCUEZfSHxCUEZfSU5ELCAyKSwKKyAgICBCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIDY4LCAwLCAxKSwKKyAgICBCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAweGZmZmZmZmZmKSwgQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMCksCit9OworCitzdGF0aWMgIHN0cnVjdCBzb2NrX2Zwcm9nIGZpbHRlcl9wcm9nID0geworICAgIC5sZW4gPSBBUlJBWV9MRU4oZmlsdGVyX2luc3RyKSwgCisgICAgLmZpbHRlciA9IChzdHJ1Y3Qgc29ja19maWx0ZXIgKikgZmlsdGVyX2luc3RyLAorfTsKKworLy8gY2FsY3VsYXRlIG9wdGlvbnMgc2l6ZS4KK3N0YXRpYyBpbnQgZGhjcF9vcHRfc2l6ZSh1aW50OF90ICpvcHRpb25wdHIpCit7CisgIGludCBpID0gMDsKKyAgZm9yKDtvcHRpb25wdHJbaV0gIT0gMHhmZjsgaSsrKSBpZihvcHRpb25wdHJbaV0gIT0gMHgwMCkgaSArPSBvcHRpb25wdHJbaSArIDFdICsgMiAtMTsKKyAgcmV0dXJuIGk7Cit9CisKKy8vIGNhbGN1bGF0ZXMgY2hlY2tzdW0gZm9yIGRoY3AgbWVzc2FnZXMuCitzdGF0aWMgdWludDE2X3QgZGhjcF9jaGVja3N1bSh2b2lkICphZGRyLCBpbnQgY291bnQpCit7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgdWludDE2X3QgdG1wID0gMCwgKnNvdXJjZSA9ICh1aW50MTZfdCAqKWFkZHI7CisKKyAgd2hpbGUgKGNvdW50ID4gMSkgIHsKKyAgICBzdW0gKz0gKnNvdXJjZSsrOworICAgIGNvdW50IC09IDI7CisgIH0KKyAgaWYgKGNvdW50ID4gMCkgeworICAgICoodWludDhfdCopJnRtcCA9ICoodWludDhfdCopc291cmNlOworICAgIHN1bSArPSB0bXA7CisgIH0KKyAgd2hpbGUgKHN1bSA+PiAxNikgc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKKyAgcmV0dXJuIH5zdW07Cit9CisKKy8vIGdldHMgaW5mb3JtYXRpb24gb2YgSU5URVJGQUNFIGFuZCB1cGRhdGVzIElGSU5ERVgsIE1BQyBhbmQgSVAKK3N0YXRpYyBpbnQgZ2V0X2ludGVyZmFjZSggY2hhciAqaW50ZXJmYWNlLCBpbnQgKmlmaW5kZXgsIHVpbnQzMl90ICpvaXAsIHVpbnQ4X3QgKm1hYykKK3sKKyAgc3RydWN0IGlmcmVxIHJlcTsKKyAgc3RydWN0IHNvY2thZGRyX2luICppcDsKKyAgaW50IGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworCisgIHJlcS5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworICB4c3RybmNweShyZXEuaWZyX25hbWUsIGludGVyZmFjZSwgSUZOQU1TSVopOworICByZXEuaWZyX25hbWVbSUZOQU1TSVotMV0gPSAnXDAnOworCisgIHhpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmcmVxKTsKKyAgaWYgKCEocmVxLmlmcl9mbGFncyAmIElGRl9VUCkpIHJldHVybiAtMTsKKworICBpZiAob2lwKSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGQUREUiwgJnJlcSk7CisgICAgaXAgPSAoc3RydWN0IHNvY2thZGRyX2luKikgJnJlcS5pZnJfYWRkcjsKKyAgICBkYmcoIklQICVzXG4iLCBpbmV0X250b2EoaXAtPnNpbl9hZGRyKSk7CisgICAgKm9pcCA9IG50b2hsKGlwLT5zaW5fYWRkci5zX2FkZHIpOworICB9CisgIGlmIChpZmluZGV4KSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZyZXEpOworICAgIGRiZygiQWRhcHRlciBpbmRleCAlZFxuIiwgcmVxLmlmcl9pZmluZGV4KTsKKyAgICAqaWZpbmRleCA9IHJlcS5pZnJfaWZpbmRleDsKKyAgfQorICBpZiAobWFjKSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmcmVxKTsKKyAgICBtZW1jcHkobWFjLCByZXEuaWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKKyAgICBkYmcoIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisgIH0KKyAgY2xvc2UoZmQpOworICByZXR1cm4gMDsKK30KKworLyoKKyAqbG9ncyBtZXNzZWdlcyB0byBzeXNsb2cgb3IgY29uc29sZQorICpvcGVuaW5nIHRoZSBsb2cgaXMgc3RpbGwgbGVmdCB3aXRoIGFwcGxldC4KKyAqRklYTUU6IG1vdmUgdG8gbW9yZSByZWxldmVudCBsaWIuIHByb2JhYmx5IGxpYmMuYworICovCitzdGF0aWMgdm9pZCBpbmZvbXNnKHVpbnQ4X3QgaW5mb21vZGUsICBjaGFyICpzLCAuLi4pCit7CisgIGludCB1c2VkOworICBjaGFyICptc2c7CisgIHZhX2xpc3QgcCwgdDsKKworICBpZiAoaW5mb21vZGUgPT0gTE9HX1NJTEVOVCkgcmV0dXJuOworICB2YV9zdGFydChwLCBzKTsKKyAgdmFfY29weSh0LCBwKTsKKyAgdXNlZCA9IHZzbnByaW50ZihOVUxMLCAwLCBzLCB0KTsKKyAgdXNlZCsrOworICB2YV9lbmQodCk7CisKKyAgbXNnID0geG1hbGxvYyh1c2VkKTsKKyAgdnNucHJpbnRmKG1zZywgdXNlZCwgcywgcCk7CisgIHZhX2VuZChwKTsKKworICBpZiAoaW5mb21vZGUgJiBMT0dfU1lTVEVNKSBzeXNsb2coTE9HX0lORk8sICIlcyIsIG1zZyk7CisgIGlmIChpbmZvbW9kZSAmIExPR19DT05TT0xFKSBwcmludGYoIiVzXG4iLCBtc2cpOworICBmcmVlKG1zZyk7Cit9CisKKy8qCisgKiBXcml0ZXMgc2VsZiBQSUQgaW4gZmlsZSBQQVRICisgKiBGSVhNRTogbGliYyBpbXBsZW1lbnRhdGlvbiBvbmx5IHdyaXRlcyBpbiAvdmFyL3J1bgorICogdGhpcyBpcyBtb3JlIGdlbmVyaWMgYXMgc29tZSBpbXBsZW1lbmF0aW9uIG1heSBwcm92aWRlCisgKiBhcmd1bWVudHMgdG8gd3JpdGUgaW4gc3BlY2lmaWMgZmlsZS4gYXMgZGhjcGQgZG9lcy4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcGlkKGNoYXIgKnBhdGgpCit7CisgIGludCBwaWRmaWxlID0gb3BlbihwYXRoLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DLCAwNjY2KTsKKyAgaWYgKHBpZGZpbGUgPiAwKSB7CisgICAgY2hhciBwaWRidWZbMTJdOworCisgICAgc3ByaW50ZihwaWRidWYsICIldSIsICh1bnNpZ25lZClnZXRwaWQoKSk7CisgICAgd3JpdGUocGlkZmlsZSwgcGlkYnVmLCBzdHJsZW4ocGlkYnVmKSk7CisgICAgY2xvc2UocGlkZmlsZSk7CisgIH0KK30KKworLy8gU3RyaW5nIFNUUiB0byBVSU5UMzIgY29udmVyc2lvbiBzdHJvcmVkIGluIFZBUgorc3RhdGljIGxvbmcgc3RydG91MzIoIGNoYXIgKnN0cikKK3sKKyAgY2hhciAqZW5kcHRyID0gTlVMTDsKKyAgaW50IGJhc2UgPSAxMDsKKyAgZXJybm89MDsKKyAgaWYgKHN0clswXT09JzAnICYmIChzdHJbMV09PSd4JyB8fCBzdHJbMV09PSdYJykpIHsKKyAgICBiYXNlID0gMTY7CisgICAgc3RyKz0yOworICB9CisgIGxvbmcgcmV0X3ZhbCA9IHN0cnRvbChzdHIsICZlbmRwdHIsIGJhc2UpOworICBpZiAoZXJybm8pIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoZW5kcHRyICYmICgqZW5kcHRyIT0nXDAnfHxlbmRwdHIgPT0gc3RyKSkgcmV0dXJuIC0xOworICByZXR1cm4gcmV0X3ZhbDsKK30KKworLy8gSVAgU3RyaW5nIFNUUiB0byBiaW5hcnkgZGF0YS4KK3N0YXRpYyBpbnQgc3RyaXB0b3ZhciggY2hhciAqc3RyLCB2b2lkICp2YXIpCit7CisgIGluX2FkZHJfdCBhZGRyOworICBpZighc3RyKSBlcnJvcl9leGl0KCJOVUxMIGFkZHJlc3Mgc3RyaW5nLiIpOworICBhZGRyID0gaW5ldF9hZGRyKHN0cik7CisgIGlmKGFkZHIgPT0gLTEpIGVycm9yX2V4aXQoIldyb25nIGFkZHJlc3MgJXMuIixzdHIgKTsKKyAgKigodWludDMyX3QqKSh2YXIpKSA9ICh1aW50MzJfdClhZGRyOworICByZXR1cm4gMDsKK30KKworLy8gU3RyaW5nIHRvIGRoY3Agb3B0aW9uIGNvbnZlcnNpb24KK3N0YXRpYyBpbnQgc3RydG9vcHQoIGNoYXIgKnN0ciwgdWludDhfdCBvcHRvbmx5KQoreworICBjaGFyICpvcHRpb24sICp2YWxzdHIsICpncnAsICp0cDsKKyAgbG9uZyBvcHRjb2RlID0gMCwgY29udnRtcDsKKyAgdWludDE2X3QgZmxhZyA9IDA7CisgIHVpbnQzMl90IG1hc2ssIG5pcCwgcm91dGVyOworICBpbnQgY291bnQsIHNpemUgPSBBUlJBWV9MRU4ob3B0aW9uc19saXN0KTsKKworICBpZiAoISpzdHIpIHJldHVybiAwOworICBvcHRpb24gPSBzdHJ0b2soKGNoYXIqKXN0ciwgIjoiKTsKKyAgaWYgKCFvcHRpb24pIHJldHVybiAtMTsKKworICBkYmcoIi14IG9wdGlvbiA6ICVzICIsIG9wdGlvbik7CisgIG9wdGNvZGUgPSBzdHJ0b3UzMihvcHRpb24pOworCisgIGlmIChvcHRjb2RlID4gMCAmJiBvcHRjb2RlIDwgMjU2KSB7ICAgICAgICAgLy8gcmF3IG9wdGlvbgorICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspIHsKKyAgICAgIGlmICgob3B0aW9uc19saXN0W2NvdW50XS5jb2RlICYgMFgwMEZGKSA9PSBvcHRjb2RlKSB7CisgICAgICAgIGZsYWcgPSAob3B0aW9uc19saXN0W2NvdW50XS5jb2RlICYgMFhGRjAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChjb3VudCA9PSBzaXplKSBlcnJvcl9leGl0KCJPYnNvbGV0ZSBPUiBVbmtub3duIE9wdGlvbiA6ICVzIiwgb3B0aW9uKTsKKyAgfSBlbHNlIHsgICAgLy8gc3RyaW5nIG9wdGlvbgorICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspIHsKKyAgICAgIGlmICghc3RyY21wKG9wdGlvbnNfbGlzdFtjb3VudF0ua2V5LCBvcHRpb24pKSB7CisgICAgICAgIGZsYWcgPSAob3B0aW9uc19saXN0W2NvdW50XS5jb2RlICYgMFhGRjAwKTsKKyAgICAgICAgb3B0Y29kZSA9IChvcHRpb25zX2xpc3RbY291bnRdLmNvZGUgJiAwWDAwRkYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvdW50ID09IHNpemUpIGVycm9yX2V4aXQoIk9ic29sZXRlIE9SIFVua25vd24gT3B0aW9uIDogJXMiLCBvcHRpb24pOworICB9CisgIGlmICghZmxhZyB8fCAhb3B0Y29kZSkgcmV0dXJuIC0xOworICBpZiAob3B0b25seSkgcmV0dXJuIG9wdGNvZGU7CisKKyAgdmFsc3RyID0gc3RydG9rKE5VTEwsICJcbiIpOworICBpZiAoIXZhbHN0cikgZXJyb3JfZXhpdCgib3B0aW9uICVzIGhhcyBubyB2YWx1ZSBkZWZpbmVkLlxuIiwgb3B0aW9uKTsKKyAgZGJnKCIgdmFsdWUgOiAlLTIwcyBcbiAiLCB2YWxzdHIpOworICBzd2l0Y2ggKGZsYWcpIHsKKyAgY2FzZSBESENQX05VTTMyOgorICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHhtYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY29udnRtcCA9IHN0cnRvdTMyKHZhbHN0cik7CisgICAgaWYgKGNvbnZ0bXAgPCAwKSBlcnJvcl9leGl0KCJJbnZhbGlkL3dyb25nIGZvcm1hdGVkIG51bWJlciAlcyIsIHZhbHN0cik7CisgICAgY29udnRtcCA9IGh0b25sKGNvbnZ0bXApOworICAgIG1lbWNweShvcHRpb25zX2xpc3RbY291bnRdLnZhbCwgJmNvbnZ0bXAsIHNpemVvZih1aW50MzJfdCkpOworICAgIGJyZWFrOworICBjYXNlIERIQ1BfTlVNMTY6CisgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gPSBzaXplb2YodWludDE2X3QpOworICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0geG1hbGxvYyhzaXplb2YodWludDE2X3QpKTsKKyAgICBjb252dG1wID0gc3RydG91MzIodmFsc3RyKTsKKyAgICBpZiAoY29udnRtcCA8IDApIGVycm9yX2V4aXQoIkludmFsaWQvbWFsZm9ybWVkIG51bWJlciAlcyIsIHZhbHN0cik7CisgICAgY29udnRtcCA9IGh0b25zKGNvbnZ0bXApOworICAgIG1lbWNweShvcHRpb25zX2xpc3RbY291bnRdLnZhbCwgJmNvbnZ0bXAsIHNpemVvZih1aW50MTZfdCkpOworICAgIGJyZWFrOworICBjYXNlIERIQ1BfTlVNODoKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLmxlbiA9IHNpemVvZih1aW50OF90KTsKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHhtYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBjb252dG1wID0gc3RydG91MzIodmFsc3RyKTsKKyAgICBpZiAoY29udnRtcCA8IDApIGVycm9yX2V4aXQoIkludmFsaWQvbWFsZm9ybWVkIG51bWJlciAlcyIsIHZhbHN0cik7CisgICAgbWVtY3B5KG9wdGlvbnNfbGlzdFtjb3VudF0udmFsLCAmY29udnRtcCwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBicmVhazsKKyAgY2FzZSBESENQX0lQOgorICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHhtYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgc3RyaXB0b3Zhcih2YWxzdHIsIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsKTsKKyAgICBicmVhazsKKyAgY2FzZSBESENQX1NUUklORzoKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLmxlbiA9IHN0cmxlbih2YWxzdHIpOworICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0gc3RyZHVwKHZhbHN0cik7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9JUExJU1Q6CisgICAgd2hpbGUodmFsc3RyKXsKKyAgICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0geHJlYWxsb2Mob3B0aW9uc19saXN0W2NvdW50XS52YWwsIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBzdHJpcHRvdmFyKHZhbHN0ciwgKCh1aW50OF90KilvcHRpb25zX2xpc3RbY291bnRdLnZhbCkrb3B0aW9uc19saXN0W2NvdW50XS5sZW4pOworICAgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgIHZhbHN0ciA9IHN0cnRvayhOVUxMLCIgXHQiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9TVFJMU1Q6IAorICBjYXNlIERIQ1BfSVBQTFNUOgorICAgIGJyZWFrOworICBjYXNlIERIQ1BfU1RDUlRTOgorICAgIC8qIE9wdGlvbiBiaW5hcnkgZm9ybWF0OgorICAgICAqIG1hc2sgW29uZSBieXRlLCAwLi4zMl0KKyAgICAgKiBpcCBbMC4uNCBieXRlcyBkZXBlbmRpbmcgb24gbWFza10KKyAgICAgKiByb3V0ZXIgWzQgYnl0ZXNdCisgICAgICogbWF5IGJlIHJlcGVhdGVkCisgICAgICogc3RhdGljcm91dGVzIDEwLjAuMC4wLzggMTAuMTI3LjAuMSwgMTAuMTEuMTIuMC8yNCAxMC4xMS4xMi4xCisgICAgICovCisgICAgZ3JwID0gc3RydG9rKHZhbHN0ciwgIiwiKTs7CisgICAgd2hpbGUoZ3JwKXsKKyAgICAgIHdoaWxlKCpncnAgPT0gJyAnIHx8ICpncnAgPT0gJ1x0JykgZ3JwKys7CisgICAgICB0cCA9IHN0cmNocihncnAsICcvJyk7CisgICAgICBpZiAoIXRwKSBlcnJvcl9leGl0KCJtYWxmb3JtZWQgc3RhdGljIHJvdXRlIG9wdGlvbiIpOworICAgICAgKnRwID0gJ1wwJzsKKyAgICAgIG1hc2sgPSBzdHJ0b2woKyt0cCwgJnRwLCAxMCk7CisgICAgICBpZiAoc3RyaXB0b3ZhcihncnAsICh1aW50OF90KikmbmlwKSA8IDApIGVycm9yX2V4aXQoIm1hbGZvcm1lZCBzdGF0aWMgcm91dGUgb3B0aW9uIik7CisgICAgICB3aGlsZSgqdHAgPT0gJyAnIHx8ICp0cCA9PSAnXHQnIHx8ICp0cCA9PSAnLScpIHRwKys7CisgICAgICBpZiAoc3RyaXB0b3Zhcih0cCwgKHVpbnQ4X3QqKSZyb3V0ZXIpIDwgMCkgZXJyb3JfZXhpdCgibWFsZm9ybWVkIHN0YXRpYyByb3V0ZSBvcHRpb24iKTsKKyAgICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0geHJlYWxsb2Mob3B0aW9uc19saXN0W2NvdW50XS52YWwsIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuICsgMSArIG1hc2svOCArIDQpOworICAgICAgbWVtY3B5KCgodWludDhfdCopb3B0aW9uc19saXN0W2NvdW50XS52YWwpK29wdGlvbnNfbGlzdFtjb3VudF0ubGVuLCAmbWFzaywgMSk7CisgICAgICBvcHRpb25zX2xpc3RbY291bnRdLmxlbiArPSAxOworICAgICAgbWVtY3B5KCgodWludDhfdCopb3B0aW9uc19saXN0W2NvdW50XS52YWwpK29wdGlvbnNfbGlzdFtjb3VudF0ubGVuLCAmbmlwLCBtYXNrLzgpOworICAgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gKz0gbWFzay84OworICAgICAgbWVtY3B5KCgodWludDhfdCopb3B0aW9uc19saXN0W2NvdW50XS52YWwpK29wdGlvbnNfbGlzdFtjb3VudF0ubGVuLCAmcm91dGVyLCA0KTsKKyAgICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuICs9IDQ7CisgICAgICB0cCA9IE5VTEw7CisgICAgICBncnAgPSBzdHJ0b2soTlVMTCwgIiwiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIENyZWF0ZXMgZW52aXJvbm1lbnQgcG9pbnRlcnMgZnJvbSBSRVMgdG8gdXNlIGluIHNjcmlwdAorc3RhdGljIGludCBmaWxsX2VudnAoZGhjcGNfcmVzdWx0X3QgKnJlcykKK3sKKyAgc3RydWN0IGluX2FkZHIgdGVtcDsKKyAgaW50IHNpemUgPSBBUlJBWV9MRU4ob3B0aW9uc19saXN0KSwgY291bnQsIHJldCA9IC0xOworCisgIHJldCA9IHNldGVudigiaW50ZXJmYWNlIiwgc3RhdGUtPmlmYWNlLCAxKTsKKyAgaWYgKCFyZXMpIHJldHVybiByZXQ7CisgIGlmIChyZXMtPmlwYWRkci5zX2FkZHIpIHsKKyAgICAgIHRlbXAuc19hZGRyID0gaHRvbmwocmVzLT5pcGFkZHIuc19hZGRyKTsKKyAgICAgIHJldCA9IHNldGVudigiaXAiLCBpbmV0X250b2EodGVtcCksIDEpOworICAgICAgaWYgKHJldCkgcmV0dXJuIHJldDsKKyAgfQorICBpZiAobXNnb3B0X2xpc3QpIHsKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgICAgIGlmICgobXNnb3B0X2xpc3RbY291bnRdLmxlbiA9PSAwKSB8fCAobXNnb3B0X2xpc3RbY291bnRdLnZhbCA9PSBOVUxMKSkgY29udGludWU7CisgICAgICAgIHJldCA9IHNldGVudihtc2dvcHRfbGlzdFtjb3VudF0ua2V5LCAoY2hhciopbXNnb3B0X2xpc3RbY291bnRdLnZhbCwgMSk7CisgICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gRXhlY3V0ZXMgU2NyaXB0IE5BTUUuCitzdGF0aWMgdm9pZCBydW5fc2NyaXB0KGRoY3BjX3Jlc3VsdF90ICpyZXMsICBjaGFyICpuYW1lKQoreworICB2b2xhdGlsZSBpbnQgZXJyb3IgPSAwOworICBwaWRfdCBwaWQ7CisgIGNoYXIgKmFyZ3ZbM107CisgIHN0cnVjdCBzdGF0IHN0czsKKyAgY2hhciAqc2NyaXB0ID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpID8gVFQuc2NyaXB0CisgICAgOiAiL3Vzci9zaGFyZS9kaGNwL2RlZmF1bHQuc2NyaXB0IjsKKworICBpZiAoc3RhdChzY3JpcHQsICZzdHMpID09IC0xICYmIGVycm5vID09IEVOT0VOVCkgcmV0dXJuOworICBpZiAoZmlsbF9lbnZwKHJlcykpIHsKKyAgICBkYmcoIkZhaWxlZCB0byBjcmVhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiIpOworICAgIHJldHVybjsKKyAgfQorICBkYmcoIkV4ZWN1dGluZyAlcyAlc1xuIiwgc2NyaXB0LCBuYW1lKTsKKyAgYXJndlswXSA9IChjaGFyKikgc2NyaXB0OworICBhcmd2WzFdID0gKGNoYXIqKSBuYW1lOworICBhcmd2WzJdID0gTlVMTDsKKyAgZmZsdXNoKE5VTEwpOworCisgIHBpZCA9IHZmb3JrKCk7CisgIGlmIChwaWQgPCAwKSB7CisgICAgZGJnKCJGb3JrIGZhaWxlZC5cbiIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBpZCkgeworICAgIGV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKyAgICBlcnJvciA9IGVycm5vOworICAgIF9leGl0KDExMSk7CisgIH0KKyAgaWYgKGVycm9yKSB7CisgICAgd2FpdHBpZChwaWQsIE5VTEwsMCk7CisgICAgZXJybm8gPSBlcnJvcjsKKyAgICBwZXJyb3JfbXNnKCJzY3JpcHQgZXhlYyBmYWlsZWQiKTsKKyAgfQorICBkYmcoInNjcmlwdCBjb21wbGV0ZS5cbiIpOworfQorCisvLyByZXR1cm5zIGEgcmFuZG9tZSBJRAorc3RhdGljIHVpbnQzMl90IGdldHhpZCh2b2lkKQoreworICB1aW50MzJfdCByYW5kbnVtOworICBpbnQgZmQgPSB4b3BlbnJvKCIvZGV2L3VyYW5kb20iKTsKKworLy8gVE9ETyB4cmVhZGZpbGUKKyAgeHJlYWRhbGwoZmQsICZyYW5kbnVtLCBzaXplb2YocmFuZG51bSkpOworICB4Y2xvc2UoZmQpOworICByZXR1cm4gcmFuZG51bTsKK30KKworLy8gb3BlbnMgc29ja2V0IGluIHJhdyBtb2RlLgorc3RhdGljIGludCBtb2RlX3Jhdyh2b2lkKQoreworICBzdGF0ZS0+bW9kZSA9IE1PREVfT0ZGOworICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc29jazsKKworICBpZiAoc3RhdGUtPnNvY2tmZCA+IDApIGNsb3NlKHN0YXRlLT5zb2NrZmQpOworICBkYmcoIk9wZW5pbmcgcmF3IHNvY2tldCBvbiBpZmluZGV4ICVkXG4iLCBzdGF0ZS0+aWZpbmRleCk7CisKKyAgc3RhdGUtPnNvY2tmZCA9IHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0lQKSk7CisgIGlmIChzdGF0ZS0+c29ja2ZkIDwgMCkgeworICAgIGRiZygiTU9ERSBSQVcgOiBzb2NrZXQgZmFpbCBFUlJPUiA6ICVkXG4iLCBzdGF0ZS0+c29ja2ZkKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZGJnKCJHb3QgcmF3IHNvY2tldCBmZCAlZFxuIiwgc3RhdGUtPnNvY2tmZCk7CisgIG1lbXNldCgmc29jaywgMCwgc2l6ZW9mKHNvY2spKTsKKyAgc29jay5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworICBzb2NrLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgc29jay5zbGxfaWZpbmRleCA9IHN0YXRlLT5pZmluZGV4OworCisgIGlmIChiaW5kKHN0YXRlLT5zb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2ssIHNpemVvZihzb2NrKSkpIHsKKyAgICBkYmcoIk1PREUgUkFXIDogYmluZCBmYWlsLlxuIik7CisgICAgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHN0YXRlLT5tb2RlID0gTU9ERV9SQVc7CisgIGlmIChzZXRzb2Nrb3B0KHN0YXRlLT5zb2NrZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9GSUxURVIsICZmaWx0ZXJfcHJvZywgc2l6ZW9mKGZpbHRlcl9wcm9nKSkgPCAwKQorICAgIGRiZygiTU9ERSBSQVcgOiBmaWx0ZXIgYXR0YWNoIGZhaWwuXG4iKTsKKworICBkYmcoIk1PREUgUkFXIDogc3VjY2Vzc1xuIik7CisgIHJldHVybiAwOworfQorCisvLyBvcGVucyBVRFAgc29ja2V0CitzdGF0aWMgaW50IG1vZGVfYXBwKHZvaWQpCit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICBzdHJ1Y3QgaWZyZXEgaWZyOworCisgIHN0YXRlLT5tb2RlID0gTU9ERV9PRkY7CisgIGlmIChzdGF0ZS0+c29ja2ZkID4gMCkgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisKKyAgZGJnKCJPcGVuaW5nIGxpc3RlbiBzb2NrZXQgb24gKjolZCAlc1xuIiwgREhDUENfQ0xJRU5UX1BPUlQsIHN0YXRlLT5pZmFjZSk7CisgIHN0YXRlLT5zb2NrZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworICBpZiAoc3RhdGUtPnNvY2tmZCA8IDApIHsKKyAgICBkYmcoIk1PREUgQVBQIDogc29ja2V0IGZhaWwgRVJST1I6ICVkXG4iLCBzdGF0ZS0+c29ja2ZkKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgc2V0c29ja29wdChzdGF0ZS0+c29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZzZXQsIHNpemVvZihzZXQpKTsKKyAgaWYgKHNldHNvY2tvcHQoc3RhdGUtPnNvY2tmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmc2V0LCBzaXplb2Yoc2V0KSkgPT0gLTEpIHsKKyAgICBkYmcoIk1PREUgQVBQIDogYnJvZGNhc3QgZmFpbGVkLlxuIik7CisgICAgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhzdHJuY3B5KGlmci5pZnJfbmFtZSwgc3RhdGUtPmlmYWNlLCBJRk5BTVNJWik7CisgIGlmci5pZnJfbmFtZVtJRk5BTVNJWiAtMV0gPSAnXDAnOworICBzZXRzb2Nrb3B0KHN0YXRlLT5zb2NrZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgJmlmciwgc2l6ZW9mKGlmcikpOworCisgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYWRkci5zaW5fcG9ydCA9IGh0b25zKERIQ1BDX0NMSUVOVF9QT1JUKTsKKyAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZIDsKKworICBpZiAoYmluZChzdGF0ZS0+c29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpKSB7CisgICAgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisgICAgZGJnKCJNT0RFIEFQUCA6IGJpbmQgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHN0YXRlLT5tb2RlID0gTU9ERV9BUFA7CisgIGRiZygiTU9ERSBBUFAgOiBzdWNjZXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yYXcodm9pZCkKK3sKKyAgZGhjcF9yYXdfdCBwYWNrZXQ7CisgIHVpbnQxNl90IGNoZWNrOworICBpbnQgYnl0ZXMgPSAwOworCisgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YocGFja2V0KSk7CisgIGlmICgoYnl0ZXMgPSByZWFkKHN0YXRlLT5zb2NrZmQsICZwYWNrZXQsIHNpemVvZihwYWNrZXQpKSkgPCAwKSB7CisgICAgZGJnKCJcdFBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZ1xuIik7CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisgIGlmIChieXRlcyA8IChpbnQpIChzaXplb2YocGFja2V0LmlwaCkgKyBzaXplb2YocGFja2V0LnVkcGgpKSkgeworICAgIGRiZygiXHRQYWNrZXQgaXMgdG9vIHNob3J0LCBpZ25vcmluZ1xuIik7CisgICAgcmV0dXJuIC0yOworICB9CisgIGlmIChieXRlcyA8IG50b2hzKHBhY2tldC5pcGgudG90X2xlbikpIHsKKyAgICBkYmcoIlx0T3ZlcnNpemVkIHBhY2tldCwgaWdub3JpbmdcbiIpOworICAgIHJldHVybiAtMjsKKyAgfQorICAvLyBpZ25vcmUgYW55IGV4dHJhIGdhcmJhZ2UgYnl0ZXMKKyAgYnl0ZXMgPSBudG9ocyhwYWNrZXQuaXBoLnRvdF9sZW4pOworICAvLyBtYWtlIHN1cmUgaXRzIHRoZSByaWdodCBwYWNrZXQgZm9yIHVzLCBhbmQgdGhhdCBpdCBwYXNzZXMgc2FuaXR5IGNoZWNrcyAKKyAgaWYgKHBhY2tldC5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgfHwgcGFja2V0LmlwaC52ZXJzaW9uICE9IElQVkVSU0lPTgorICAgfHwgcGFja2V0LmlwaC5paGwgIT0gKHNpemVvZihwYWNrZXQuaXBoKSA+PiAyKQorICAgfHwgcGFja2V0LnVkcGguZGVzdCAhPSBodG9ucyhESENQQ19DTElFTlRfUE9SVCkKKyAgIHx8IG50b2hzKHBhY2tldC51ZHBoLmxlbikgIT0gKHVpbnQxNl90KShieXRlcyAtIHNpemVvZihwYWNrZXQuaXBoKSkpIHsKKyAgICBkYmcoIlx0VW5yZWxhdGVkL2JvZ3VzIHBhY2tldCwgaWdub3JpbmdcbiIpOworICAgIHJldHVybiAtMjsKKyAgfQorICAvLyB2ZXJpZnkgSVAgY2hlY2tzdW0KKyAgY2hlY2sgPSBwYWNrZXQuaXBoLmNoZWNrOworICBwYWNrZXQuaXBoLmNoZWNrID0gMDsKKyAgaWYgKGNoZWNrICE9IGRoY3BfY2hlY2tzdW0oJnBhY2tldC5pcGgsIHNpemVvZihwYWNrZXQuaXBoKSkpIHsKKyAgICBkYmcoIlx0QmFkIElQIGhlYWRlciBjaGVja3N1bSwgaWdub3JpbmdcbiIpOworICAgIHJldHVybiAtMjsKKyAgfQorICBtZW1zZXQoJnBhY2tldC5pcGgsIDAsICgoc2l6ZV90KSAmKChzdHJ1Y3QgaXBoZHIgKikwKS0+cHJvdG9jb2wpKTsKKyAgcGFja2V0LmlwaC50b3RfbGVuID0gcGFja2V0LnVkcGgubGVuOworICBjaGVjayA9IHBhY2tldC51ZHBoLmNoZWNrOworICBwYWNrZXQudWRwaC5jaGVjayA9IDA7CisgIGlmIChjaGVjayAmJiBjaGVjayAhPSBkaGNwX2NoZWNrc3VtKCZwYWNrZXQsIGJ5dGVzKSkgeworICAgIGRiZygiXHRQYWNrZXQgd2l0aCBiYWQgVURQIGNoZWNrc3VtIHJlY2VpdmVkLCBpZ25vcmluZ1xuIik7CisgICAgcmV0dXJuIC0yOworICB9CisgIG1lbWNweSgmc3RhdGUtPnBkaGNwLCAmcGFja2V0LmRoY3AsIGJ5dGVzIC0gKHNpemVvZihwYWNrZXQuaXBoKSArIHNpemVvZihwYWNrZXQudWRwaCkpKTsKKyAgaWYgKHN0YXRlLT5wZGhjcC5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKyAgICBkYmcoIlx0UGFja2V0IHdpdGggYmFkIG1hZ2ljLCBpZ25vcmluZ1xuIik7CisgICAgcmV0dXJuIC0yOworICB9CisgIHJldHVybiBieXRlcyAtIHNpemVvZihwYWNrZXQuaXBoKSAtIHNpemVvZihwYWNrZXQudWRwaCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hcHAodm9pZCkKK3sKKyAgaW50IHJldDsKKworICBtZW1zZXQoJnN0YXRlLT5wZGhjcCwgMCwgc2l6ZW9mKGRoY3BfbXNnX3QpKTsKKyAgaWYgKChyZXQgPSByZWFkKHN0YXRlLT5zb2NrZmQsICZzdGF0ZS0+cGRoY3AsIHNpemVvZihkaGNwX21zZ190KSkpIDwgMCkgeworICAgIGRiZygiUGFja2V0IHJlYWQgZXJyb3IsIGlnbm9yaW5nXG4iKTsKKyAgICByZXR1cm4gcmV0OyAvKiByZXR1cm5zIC0xICovCisgIH0KKyAgaWYgKHN0YXRlLT5wZGhjcC5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKyAgICBkYmcoIlBhY2tldCB3aXRoIGJhZCBtYWdpYywgaWdub3JpbmdcbiIpOworICAgIHJldHVybiAtMjsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBTZW5kcyBkYXRhIHRocm91Z2ggcmF3IHNvY2tldC4KK3N0YXRpYyBpbnQgc2VuZF9yYXcodm9pZCkKK3sKKyAgc3RydWN0IHNvY2thZGRyX2xsIGRlc3Rfc2xsOworICBkaGNwX3Jhd190IHBhY2tldDsKKyAgdW5zaWduZWQgcGFkZGluZzsKKyAgaW50IGZkLCByZXN1bHQgPSAtMTsKKworICBtZW1zZXQoJnBhY2tldCwgMCwgc2l6ZW9mKGRoY3BfcmF3X3QpKTsKKyAgbWVtY3B5KCZwYWNrZXQuZGhjcCwgJnN0YXRlLT5wZGhjcCwgc2l6ZW9mKGRoY3BfbXNnX3QpKTsKKworICBpZiAoKGZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfSVApKSkgPCAwKSB7CisgICAgZGJnKCJTRU5EIFJBVzogc29ja2V0IGZhaWxlZFxuIik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBtZW1zZXQoJmRlc3Rfc2xsLCAwLCBzaXplb2YoZGVzdF9zbGwpKTsKKyAgZGVzdF9zbGwuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKyAgZGVzdF9zbGwuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworICBkZXN0X3NsbC5zbGxfaWZpbmRleCA9IHN0YXRlLT5pZmluZGV4OworICBkZXN0X3NsbC5zbGxfaGFsZW4gPSA2OworICBtZW1jcHkoZGVzdF9zbGwuc2xsX2FkZHIsIGJtYWNhZGRyICwgNik7CisKKyAgaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmRlc3Rfc2xsLCBzaXplb2YoZGVzdF9zbGwpKSA8IDApIHsKKyAgICBkYmcoIlNFTkQgUkFXOiBiaW5kIGZhaWxlZFxuIik7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcGFkZGluZyA9IDMwOCAtIDEgLSBkaGNwX29wdF9zaXplKHN0YXRlLT5wZGhjcC5vcHRpb25zKTsKKyAgcGFja2V0LmlwaC5wcm90b2NvbCA9IElQUFJPVE9fVURQOworICBwYWNrZXQuaXBoLnNhZGRyID0gSU5BRERSX0FOWTsKKyAgcGFja2V0LmlwaC5kYWRkciA9IElOQUREUl9CUk9BRENBU1Q7CisgIHBhY2tldC51ZHBoLnNvdXJjZSA9IGh0b25zKERIQ1BDX0NMSUVOVF9QT1JUKTsKKyAgcGFja2V0LnVkcGguZGVzdCA9IGh0b25zKERIQ1BDX1NFUlZFUl9QT1JUKTsKKyAgcGFja2V0LnVkcGgubGVuID0gaHRvbnMoc2l6ZW9mKGRoY3BfcmF3X3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSBwYWRkaW5nKTsKKyAgcGFja2V0LmlwaC50b3RfbGVuID0gcGFja2V0LnVkcGgubGVuOworICBwYWNrZXQudWRwaC5jaGVjayA9IGRoY3BfY2hlY2tzdW0oJnBhY2tldCwgc2l6ZW9mKGRoY3BfcmF3X3QpIC0gcGFkZGluZyk7CisgIHBhY2tldC5pcGgudG90X2xlbiA9IGh0b25zKHNpemVvZihkaGNwX3Jhd190KSAtIHBhZGRpbmcpOworICBwYWNrZXQuaXBoLmlobCA9IHNpemVvZihwYWNrZXQuaXBoKSA+PiAyOworICBwYWNrZXQuaXBoLnZlcnNpb24gPSBJUFZFUlNJT047CisgIHBhY2tldC5pcGgudHRsID0gSVBERUZUVEw7CisgIHBhY2tldC5pcGguY2hlY2sgPSBkaGNwX2NoZWNrc3VtKCZwYWNrZXQuaXBoLCBzaXplb2YocGFja2V0LmlwaCkpOworCisgIHJlc3VsdCA9IHNlbmR0byhmZCwgJnBhY2tldCwgc2l6ZW9mKGRoY3BfcmF3X3QpIC0gcGFkZGluZywgMCwKKyAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmRlc3Rfc2xsLCBzaXplb2YoZGVzdF9zbGwpKTsKKworICBjbG9zZShmZCk7CisgIGlmIChyZXN1bHQgPCAwKSBkYmcoIlNFTkQgUkFXOiBQQUNLRVQgc2VuZCBlcnJvclxuIik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNlbmRzIGRhdGEgdGhyb3VnaCBVRFAgc29ja2V0Lgorc3RhdGljIGludCBzZW5kX2FwcCh2b2lkKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpOworICBpbnQgZmQsIHJldCA9IC0xOworCisgIGlmICgoZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApKSA8IDApIHsKKyAgICBkYmcoIlNFTkQgQVBQOiBzb2NrIGZhaWxlZC5cbiIpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmc2V0LCBzaXplb2Yoc2V0KSk7CisKKyAgbWVtc2V0KCZjbGksIDAsIHNpemVvZihjbGkpKTsKKyAgY2xpLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBjbGkuc2luX3BvcnQgPSBodG9ucyhESENQQ19DTElFTlRfUE9SVCk7CisgIGNsaS5zaW5fYWRkci5zX2FkZHIgPSBzdGF0ZS0+cGRoY3AuY2lhZGRyOworICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGksIHNpemVvZihjbGkpKSA9PSAtMSkgeworICAgIGRiZygiU0VORCBBUFA6IGJpbmQgZmFpbGVkLlxuIik7CisgICAgZ290byBlcnJvcl9mZDsKKyAgfQorICBtZW1zZXQoJmNsaSwgMCwgc2l6ZW9mKGNsaSkpOworICBjbGkuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIGNsaS5zaW5fcG9ydCA9IGh0b25zKERIQ1BDX1NFUlZFUl9QT1JUKTsKKyAgY2xpLnNpbl9hZGRyLnNfYWRkciA9IHN0YXRlLT5zZXJ2ZXJpZC5zX2FkZHI7CisgIGlmIChjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJmNsaSwgc2l6ZW9mKGNsaSkpID09IC0xKSB7CisgICAgZGJnKCJTRU5EIEFQUDogY29ubmVjdCBmYWlsZWQuXG4iKTsKKyAgICBnb3RvIGVycm9yX2ZkOworICB9CisgIGludCBwYWRkaW5nID0gMzA4IC0gMSAtIGRoY3Bfb3B0X3NpemUoc3RhdGUtPnBkaGNwLm9wdGlvbnMpOworICBpZigocmV0ID0gd3JpdGUoZmQsICZzdGF0ZS0+cGRoY3AsIHNpemVvZihkaGNwX21zZ190KSAtIHBhZGRpbmcpKSA8IDApIHsKKyAgICBkYmcoIlNFTkQgQVBQOiB3cml0ZSBmYWlsZWQgZXJyb3IgJWRcbiIsIHJldCk7CisgICAgZ290byBlcnJvcl9mZDsKKyAgfQorICBkYmcoIlNFTkQgQVBQOiB3cml0ZSBzdWNjZXNzIHdyb3RlICVkXG4iLCByZXQpOworZXJyb3JfZmQ6CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gR2VuZXJpYyBzaWduYWwgaGFuZGxlciByZWFsIGhhbmRsaW5nIGlzIGRvbmUgaW4gbWFpbiBmdW5jcmlvbi4KK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisgIHVuc2lnbmVkIGNoYXIgY2ggPSBzaWc7CisgIGlmICh3cml0ZShzaWdmZC53ciwgJmNoLCAxKSAhPSAxKSBkYmcoImNhbid0IHNlbmQgc2lnbmFsXG4iKTsKK30KKworLy8gc2lnbmFsIHNldHVwIGZvciBTSUdVU1IxIFNJR1VTUjIgU0lHVEVSTQorc3RhdGljIGludCBzZXR1cF9zaWduYWwoKQoreworICBpZiAocGlwZSgoaW50ICopJnNpZ2ZkKSA8IDApIHsKKyAgICBkYmcoInNpZ25hbCBwaXBlIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZjbnRsKHNpZ2ZkLndyICwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisgIGZjbnRsKHNpZ2ZkLnJkICwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisgIGludCBmbGFncyA9IGZjbnRsKHNpZ2ZkLndyLCBGX0dFVEZMKTsKKyAgZmNudGwoc2lnZmQud3IsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7CisgIHNpZ25hbChTSUdVU1IxLCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdVU1IyLCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdURVJNLCBzaWduYWxfaGFuZGxlcik7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGFkZHMgY2xpZW50IGlkIHRvIGRoY3AgcGFja2V0CitzdGF0aWMgdWludDhfdCAqZGhjcGNfYWRkY2xpZW50aWQodWludDhfdCAqb3B0cHRyKQoreworICAqb3B0cHRyKysgPSBESENQX09QVElPTl9DTElFTlRJRDsKKyAgKm9wdHB0cisrID0gNzsKKyAgKm9wdHB0cisrID0gMTsKKyAgbWVtY3B5KG9wdHB0ciwgJnN0YXRlLT5tYWNhZGRyLCA2KTsKKyAgcmV0dXJuIG9wdHB0ciArIDY7Cit9CisKKy8vIGFkZHMgbWVzc2VnZSB0eXBlIHRvIGRoY3AgcGFja2V0CitzdGF0aWMgdWludDhfdCAqZGhjcGNfYWRkbXNndHlwZSh1aW50OF90ICpvcHRwdHIsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgKm9wdHB0cisrID0gREhDUF9PUFRJT05fTVNHX1RZUEU7CisgICpvcHRwdHIrKyA9IDE7CisgICpvcHRwdHIrKyA9IHR5cGU7CisgIHJldHVybiBvcHRwdHI7Cit9CisKKy8vIGFkZHMgbWF4IHNpemUgdG8gZGhjcCBwYWNrZXQKK3N0YXRpYyB1aW50OF90ICpkaGNwY19hZGRtYXhzaXplKHVpbnQ4X3QgKm9wdHB0ciwgdWludDE2X3Qgc2l6ZSkKK3sKKyAgKm9wdHB0cisrID0gREhDUF9PUFRJT05fTUFYX1NJWkU7CisgICpvcHRwdHIrKyA9IDI7CisgIG1lbWNweShvcHRwdHIsICZzaXplLCAyKTsKKyAgcmV0dXJuIG9wdHB0ciArIDI7Cit9CisKK3N0YXRpYyB1aW50OF90ICpkaGNwY19hZGRzdHJvcHQodWludDhfdCAqb3B0cHRyLCB1aW50OF90IG9wY29kZSwgY2hhciogc3RyLCBpbnQgbGVuKQoreworICAqb3B0cHRyKysgPSBvcGNvZGU7CisgICpvcHRwdHIrKyA9IGxlbjsKKyAgbWVtY3B5KG9wdHB0ciwgc3RyLCBsZW4pOworICByZXR1cm4gb3B0cHRyICsgbGVuOworfQorCisvLyBhZGRzIHNlcnZlciBpZCB0byBkaGNwIHBhY2tldC4KK3N0YXRpYyB1aW50OF90ICpkaGNwY19hZGRzZXJ2ZXJpZChzdHJ1Y3QgaW5fYWRkciAqc2VydmVyaWQsIHVpbnQ4X3QgKm9wdHB0cikKK3sKKyAgKm9wdHB0cisrID0gREhDUF9PUFRJT05fU0VSVkVSX0lEOworICAqb3B0cHRyKysgPSA0OworICBtZW1jcHkob3B0cHRyLCAmc2VydmVyaWQtPnNfYWRkciwgNCk7CisgIHJldHVybiBvcHRwdHIgKyA0OworfQorCisvLyBhZGRzIHJlcXVlc3RlZCBpcCBhZGRyZXNzIHRvIGRoY3AgcGFja2V0Lgorc3RhdGljIHVpbnQ4X3QgKmRoY3BjX2FkZHJlcWlwYWRkcihzdHJ1Y3QgaW5fYWRkciAqaXBhZGRyLCB1aW50OF90ICpvcHRwdHIpCit7CisgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX1JFUV9JUEFERFI7CisgICpvcHRwdHIrKyA9IDQ7CisgIG1lbWNweShvcHRwdHIsICZpcGFkZHItPnNfYWRkciwgNCk7CisgIHJldHVybiBvcHRwdHIgKyA0OworfQorCisvLyBhZGRzIGhvc3RuYW1lIHRvIGRoY3AgcGFja2V0Lgorc3RhdGljIHVpbnQ4X3QgKmRoY3BjX2FkZGZkbm5hbWUodWludDhfdCAqb3B0cHRyLCBjaGFyICpobmFtZSkKK3sKKyAgaW50IHNpemUgPSBzdHJsZW4oaG5hbWUpOworCisgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX0ZRRE47CisgICpvcHRwdHIrKyA9IHNpemUgKyAzOworICAqb3B0cHRyKysgPSAweDE7ICAvL2ZsYWdzCisgIG9wdHB0ciArPSAyOyAgICAgIC8vIHR3byBibGFuayBieXRlcworICBzdHJjcHkoKGNoYXIqKW9wdHB0ciwgaG5hbWUpOyAvLyBuYW1lCisKKyAgcmV0dXJuIG9wdHB0ciArIHNpemU7Cit9CisKKy8vIGFkZHMgcmVxdWVzdCBvcHRpb25zIHVzaW5nIC1vLC1PIGZsYWcgdG8gZGhjcCBwYWNrZXQKK3N0YXRpYyB1aW50OF90ICpkaGNwY19hZGRyZXFvcHRpb25zKHVpbnQ4X3QgKm9wdHB0cikKK3sKKyAgdWludDhfdCAqbGVuOworCisgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX1JFUV9MSVNUOworICBsZW4gPSBvcHRwdHI7CisgICpsZW4gPSAwOworICBvcHRwdHIrKzsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSkgeworICAgICpsZW4gPSA0OworICAgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX1NVQk5FVF9NQVNLOworICAgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX1JPVVRFUjsKKyAgICAqb3B0cHRyKysgPSBESENQX09QVElPTl9ETlNfU0VSVkVSOworICAgICpvcHRwdHIrKyA9IERIQ1BfT1BUSU9OX0JST0FEQ0FTVDsKKyAgfQorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfTykgeworICAgIG1lbWNweShvcHRwdHIrKywgcmF3X29wdCwgcmF3X29wdGNvdW50KTsKKyAgICAqbGVuICs9IHJhd19vcHRjb3VudDsKKyAgfQorICByZXR1cm4gb3B0cHRyOworfQorCitzdGF0aWMgdWludDhfdCAqZGhjcGNfYWRkZW5kKHVpbnQ4X3QgKm9wdHB0cikKK3sKKyAgKm9wdHB0cisrID0gREhDUF9PUFRJT05fRU5EOworICByZXR1cm4gb3B0cHRyOworfQorCisvLyBTZXRzIHZhbHVlcyBvZiAteCBvcHRpb25zIGluIGRoY3AgZGlzY292ZXIgYW5kIHJlcXVlc3QgcGFja2V0Lgorc3RhdGljIHVpbnQ4X3QqIHNldF94b3B0KHVpbnQ4X3QgKm9wdHB0cikKK3sKKyAgaW50IGNvdW50OworICBpbnQgc2l6ZSA9IEFSUkFZX0xFTihvcHRpb25zX2xpc3QpOworICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgaWYgKChvcHRpb25zX2xpc3RbY291bnRdLmxlbiA9PSAwKSB8fCAob3B0aW9uc19saXN0W2NvdW50XS52YWwgPT0gTlVMTCkpIGNvbnRpbnVlOworICAgICpvcHRwdHIrKyA9ICh1aW50OF90KSAob3B0aW9uc19saXN0W2NvdW50XS5jb2RlICYgMHgwMEZGKTsKKyAgICAqb3B0cHRyKysgPSAodWludDhfdCkgb3B0aW9uc19saXN0W2NvdW50XS5sZW47CisgICAgbWVtY3B5KG9wdHB0ciwgb3B0aW9uc19saXN0W2NvdW50XS52YWwsIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuKTsKKyAgICBvcHRwdHIgKz0gb3B0aW9uc19saXN0W2NvdW50XS5sZW47CisgIH0KKyAgcmV0dXJuIG9wdHB0cjsKK30KKworc3RhdGljIHVpbnQzMl90IGdldF9vcHRpb25fc2VydmVyaWQgKHVpbnQ4X3QgKm9wdCwgZGhjcGNfcmVzdWx0X3QgKnByZXN1bHQpCit7CisgIHVpbnQzMl90IHZhciA9IDA7CisgIHdoaWxlICgqb3B0ICE9IERIQ1BfT1BUSU9OX1NFUlZFUl9JRCkgeworICAgIGlmICgqb3B0ID09IERIQ1BfT1BUSU9OX0VORCkgcmV0dXJuIHZhcjsKKyAgICBvcHQgKz0gb3B0WzFdICsgMjsKKyAgfQorICBtZW1jcHkoJnZhciwgb3B0KzIsIHNpemVvZih1aW50MzJfdCkpOworICBzdGF0ZS0+c2VydmVyaWQuc19hZGRyID0gdmFyOworICBwcmVzdWx0LT5zZXJ2ZXJpZC5zX2FkZHIgPSBzdGF0ZS0+c2VydmVyaWQuc19hZGRyOworICBwcmVzdWx0LT5zZXJ2ZXJpZC5zX2FkZHIgPSBudG9obChwcmVzdWx0LT5zZXJ2ZXJpZC5zX2FkZHIpOworICByZXR1cm4gdmFyOworfQorCitzdGF0aWMgdWludDhfdCBnZXRfb3B0aW9uX21zZ3R5cGUodWludDhfdCAqb3B0KQoreworICB1aW50MzJfdCB2YXIgPSAwOworICB3aGlsZSAoKm9wdCAhPSBESENQX09QVElPTl9NU0dfVFlQRSkgeworICAgIGlmICgqb3B0ID09IERIQ1BfT1BUSU9OX0VORCkgcmV0dXJuIHZhcjsKKyAgICBvcHQgKz0gb3B0WzFdICsgMjsKKyAgfQorICBtZW1jcHkoJnZhciwgb3B0KzIsIHNpemVvZih1aW50OF90KSk7CisgIHJldHVybiB2YXI7Cit9CisKK3N0YXRpYyB1aW50OF90IGdldF9vcHRpb25fbGVhc2UodWludDhfdCAqb3B0LCBkaGNwY19yZXN1bHRfdCAqcHJlc3VsdCkKK3sKKyAgdWludDMyX3QgdmFyID0gMDsKKyAgd2hpbGUgKCpvcHQgIT0gREhDUF9PUFRJT05fTEVBU0VfVElNRSkgeworICAgIGlmICgqb3B0ID09IERIQ1BfT1BUSU9OX0VORCkgcmV0dXJuIHZhcjsKKyAgICBvcHQgKz0gb3B0WzFdICsgMjsKKyAgfQorICBtZW1jcHkoJnZhciwgb3B0KzIsIHNpemVvZih1aW50MzJfdCkpOworICB2YXIgPSBodG9ubCh2YXIpOworICBwcmVzdWx0LT5sZWFzZV90aW1lID0gdmFyOworICByZXR1cm4gdmFyOworfQorCisKKy8vIHNlbmRzIGRoY3AgbXNnIG9mIE1TR1RZUEUKK3N0YXRpYyBpbnQgZGhjcGNfc2VuZG1zZyhpbnQgbXNndHlwZSkKK3sKKyAgdWludDhfdCAqcGVuZDsKKyAgc3RydWN0IGluX2FkZHIgcnFzZDsKKyAgY2hhciAqdmVuZG9yOworCisgIC8vIENyZWF0ZSB0aGUgY29tbW9uIG1lc3NhZ2UgaGVhZGVyIHNldHRpbmdzCisgIG1lbXNldCgmc3RhdGUtPnBkaGNwLCAwLCBzaXplb2YoZGhjcF9tc2dfdCkpOworICBzdGF0ZS0+cGRoY3Aub3AgPSBESENQX1JFUVVFU1Q7CisgIHN0YXRlLT5wZGhjcC5odHlwZSA9IERIQ1BfSFRZUEVfRVRIRVJORVQ7CisgIHN0YXRlLT5wZGhjcC5obGVuID0gNjsKKyAgc3RhdGUtPnBkaGNwLnhpZCA9IHhpZDsKKyAgbWVtY3B5KHN0YXRlLT5wZGhjcC5jaGFkZHIsIHN0YXRlLT5tYWNhZGRyLCA2KTsKKyAgbWVtc2V0KCZzdGF0ZS0+cGRoY3AuY2hhZGRyWzZdLCAwLCAxMCk7CisgIHN0YXRlLT5wZGhjcC5jb29raWUgPSBodG9ubChESENQX01BR0lDKTs7CisKKyAgLy8gQWRkIHRoZSBjb21tb24gaGVhZGVyIG9wdGlvbnMKKyAgcGVuZCA9IHN0YXRlLT5wZGhjcC5vcHRpb25zOworICBwZW5kID0gZGhjcGNfYWRkbXNndHlwZShwZW5kLCBtc2d0eXBlKTsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19DKSkgcGVuZCA9IGRoY3BjX2FkZGNsaWVudGlkKHBlbmQpOworICAvLyBIYW5kbGUgdGhlIG1lc3NhZ2Ugc3BlY2lmaWMgc2V0dGluZ3MKKyAgc3dpdGNoIChtc2d0eXBlKSB7CisgIGNhc2UgREhDUERJU0NPVkVSOiAvLyBCcm9hZGNhc3QgRElTQ09WRVIgbWVzc2FnZSB0byBhbGwgc2VydmVycworICAgIHN0YXRlLT5wZGhjcC5mbGFncyA9IGh0b25zKEJPT1RQX0JST0FEQ0FTVCk7IC8vICBCcm9hZGNhc3QgYml0LgorICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19yKSB7CisgICAgICBpbmV0X2F0b24oVFQucmVxX2lwLCAmcnFzZCk7CisgICAgICBwZW5kID0gZGhjcGNfYWRkcmVxaXBhZGRyKCZycXNkLCBwZW5kKTsKKyAgICB9CisgICAgcGVuZCA9IGRoY3BjX2FkZG1heHNpemUocGVuZCwgaHRvbnMoc2l6ZW9mKGRoY3BfcmF3X3QpKSk7CisgICAgdmVuZG9yID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1YpID8gVFQudmVuZG9yX2NscyA6ICJ0b3lib3hcMCI7CisgICAgcGVuZCA9IGRoY3BjX2FkZHN0cm9wdChwZW5kLCBESENQX09QVElPTl9WRU5ET1IsIHZlbmRvciwgc3RybGVuKHZlbmRvcikpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19IKSBwZW5kID0gZGhjcGNfYWRkc3Ryb3B0KHBlbmQsIERIQ1BfT1BUSU9OX0hPU1RfTkFNRSwgVFQuaG9zdG5hbWUsIHN0cmxlbihUVC5ob3N0bmFtZSkpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19GKSBwZW5kID0gZGhjcGNfYWRkZmRubmFtZShwZW5kLCBUVC5mZG5fbmFtZSk7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbykgfHwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX08pKQorICAgICAgcGVuZCA9IGRoY3BjX2FkZHJlcW9wdGlvbnMocGVuZCk7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIHBlbmQgPSBzZXRfeG9wdChwZW5kKTsKKyAgICBicmVhazsKKyAgY2FzZSBESENQUkVRVUVTVDogLy8gU2VuZCBSRVFVRVNUIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB0aGF0IHNlbnQgdGhlICpmaXJzdCogT0ZGRVIKKyAgICBzdGF0ZS0+cGRoY3AuZmxhZ3MgPSBodG9ucyhCT09UUF9CUk9BRENBU1QpOyAvLyAgQnJvYWRjYXN0IGJpdC4KKyAgICBpZiAoc3RhdGUtPnN0YXR1cyA9PSBTVEFURV9SRU5FV0lORykgbWVtY3B5KCZzdGF0ZS0+cGRoY3AuY2lhZGRyLCAmc3RhdGUtPmlwYWRkci5zX2FkZHIsIDQpOworICAgIHBlbmQgPSBkaGNwY19hZGRtYXhzaXplKHBlbmQsIGh0b25zKHNpemVvZihkaGNwX3Jhd190KSkpOworICAgIHJxc2Quc19hZGRyID0gaHRvbmwoc2VydmVyKTsKKyAgICBwZW5kID0gZGhjcGNfYWRkc2VydmVyaWQoJnJxc2QsIHBlbmQpOworICAgIHBlbmQgPSBkaGNwY19hZGRyZXFpcGFkZHIoJnN0YXRlLT5pcGFkZHIsIHBlbmQpOworICAgIHZlbmRvciA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19WKSA/IFRULnZlbmRvcl9jbHMgOiAidG95Ym94XDAiOworICAgIHBlbmQgPSBkaGNwY19hZGRzdHJvcHQocGVuZCwgREhDUF9PUFRJT05fVkVORE9SLCB2ZW5kb3IsIHN0cmxlbih2ZW5kb3IpKTsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfSCkgcGVuZCA9IGRoY3BjX2FkZHN0cm9wdChwZW5kLCBESENQX09QVElPTl9IT1NUX05BTUUsIFRULmhvc3RuYW1lLCBzdHJsZW4oVFQuaG9zdG5hbWUpKTsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRikgcGVuZCA9IGRoY3BjX2FkZGZkbm5hbWUocGVuZCwgVFQuZmRuX25hbWUpOworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX28pIHx8ICh0b3lzLm9wdGZsYWdzICYgRkxBR19PKSkKKyAgICAgIHBlbmQgPSBkaGNwY19hZGRyZXFvcHRpb25zKHBlbmQpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSBwZW5kID0gc2V0X3hvcHQocGVuZCk7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUFJFTEVBU0U6IC8vIFNlbmQgUkVMRUFTRSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCisgICAgbWVtY3B5KCZzdGF0ZS0+cGRoY3AuY2lhZGRyLCAmc3RhdGUtPmlwYWRkci5zX2FkZHIsIDQpOworICAgIHJxc2Quc19hZGRyID0gaHRvbmwoc2VydmVyKTsKKyAgICBwZW5kID0gZGhjcGNfYWRkc2VydmVyaWQoJnJxc2QsIHBlbmQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiAtMTsKKyAgfQorICBwZW5kID0gZGhjcGNfYWRkZW5kKHBlbmQpOworCisgIGlmIChzdGF0ZS0+bW9kZSA9PSBNT0RFX0FQUCkgcmV0dXJuIHNlbmRfYXBwKCk7CisgIHJldHVybiBzZW5kX3JhdygpOworfQorCisvKgorICogcGFyc2VzIG9wdGlvbnMgZnJvbSByZWNlaXZlZCBkaGNwIHBhY2tldCBhdCBPUFRQVFIgYW5kCisgKiBzdG9yZXMgcmVzdWx0IGluIFBSRVNVTFQgb3IgTVNHT1BUX0xJU1QKKyAqLworc3RhdGljIHVpbnQ4X3QgZGhjcGNfcGFyc2VvcHRpb25zKGRoY3BjX3Jlc3VsdF90ICpwcmVzdWx0LCB1aW50OF90ICpvcHRwdHIpCit7CisgIHVpbnQ4X3QgdHlwZSA9IDAsICpvcHRpb25zLCBvdmVybG9hZGVkID0gMDs7CisgIHVpbnQxNl90IGZsYWcgPSAwOworICB1aW50MzJfdCBjb252dG1wID0gMDsKKyAgY2hhciAqZGVzdCwgKnBmeDsKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKKyAgaW50IGNvdW50LCBvcHRsZW4sIHNpemUgPSBBUlJBWV9MRU4ob3B0aW9uc19saXN0KTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfeCkgeworICAgIGlmKG1zZ29wdF9saXN0KXsKKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspeworICAgICAgICBpZihtc2dvcHRfbGlzdFtjb3VudF0udmFsKSBmcmVlKG1zZ29wdF9saXN0W2NvdW50XS52YWwpOworICAgICAgICBtc2dvcHRfbGlzdFtjb3VudF0udmFsID0gTlVMTDsKKyAgICAgICAgbXNnb3B0X2xpc3RbY291bnRdLmxlbiA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgbXNnb3B0X2xpc3QgPSB4bWFsbG9jKHNpemVvZihvcHRpb25zX2xpc3QpKTsKKyAgICAgbWVtY3B5KG1zZ29wdF9saXN0LCBvcHRpb25zX2xpc3QsIHNpemVvZihvcHRpb25zX2xpc3QpKTsKKyAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2l6ZTsgY291bnQrKykgeworICAgICAgICAgbXNnb3B0X2xpc3RbY291bnRdLmxlbiA9IDA7CisgICAgICAgICBtc2dvcHRfbGlzdFtjb3VudF0udmFsID0gTlVMTDsKKyAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtc2dvcHRfbGlzdCA9IG9wdGlvbnNfbGlzdDsKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgICBtc2dvcHRfbGlzdFtjb3VudF0ubGVuID0gMDsKKyAgICAgIGlmKG1zZ29wdF9saXN0W2NvdW50XS52YWwpIGZyZWUobXNnb3B0X2xpc3RbY291bnRdLnZhbCk7CisgICAgICBtc2dvcHRfbGlzdFtjb3VudF0udmFsID0gTlVMTDsKKyAgICB9CisgIH0KKworICB3aGlsZSAoKm9wdHB0ciAhPSBESENQX09QVElPTl9FTkQpIHsKKyAgICBpZiAoKm9wdHB0ciA9PSBESENQX09QVElPTl9QQURESU5HKSB7CisgICAgICBvcHRwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoKm9wdHB0ciA9PSBESENQX09QVElPTl9PVkVSTE9BRCkgeworICAgICAgb3ZlcmxvYWRlZCA9IG9wdHB0clsyXTsKKyAgICAgIG9wdHB0ciArPSBvcHRwdHJbMV0gKyAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoY291bnQgPSAwLCBmbGFnID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgICBpZiAoKG1zZ29wdF9saXN0W2NvdW50XS5jb2RlICYgMFgwMEZGKSA9PSAqb3B0cHRyKSB7CisgICAgICAgIGZsYWcgPSAobXNnb3B0X2xpc3RbY291bnRdLmNvZGUgJiAwWEZGMDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgY2FzZSBESENQX05VTTMyOgorICAgICAgbWVtY3B5KCZjb252dG1wLCAmb3B0cHRyWzJdLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgIGNvbnZ0bXAgPSBodG9ubChjb252dG1wKTsKKyAgICAgIHNwcmludGYodG95YnVmLCAiJXUiLCBjb252dG1wKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS52YWwgPSBzdHJkdXAodG95YnVmKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS5sZW4gPSBzdHJsZW4odG95YnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREhDUF9OVU0xNjoKKyAgICAgIG1lbWNweSgmY29udnRtcCwgJm9wdHB0clsyXSwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICBjb252dG1wID0gaHRvbnMoY29udnRtcCk7CisgICAgICBzcHJpbnRmKHRveWJ1ZiwgIiV1IiwgY29udnRtcCk7CisgICAgICBtc2dvcHRfbGlzdFtjb3VudF0udmFsID0gc3RyZHVwKHRveWJ1Zik7CisgICAgICBtc2dvcHRfbGlzdFtjb3VudF0ubGVuID0gc3RybGVuKHRveWJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERIQ1BfTlVNODoKKyAgICAgIG1lbWNweSgmY29udnRtcCwgJm9wdHB0clsyXSwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgIHNwcmludGYodG95YnVmLCAiJXUiLCBjb252dG1wKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS52YWwgPSBzdHJkdXAodG95YnVmKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS5sZW4gPSBzdHJsZW4odG95YnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREhDUF9JUDoKKyAgICAgIG1lbWNweSgmY29udnRtcCwgJm9wdHB0clsyXSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBhZGRyLnNfYWRkciA9IGNvbnZ0bXA7CisgICAgICBzcHJpbnRmKHRveWJ1ZiwgIiVzIiwgaW5ldF9udG9hKGFkZHIpKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS52YWwgPSBzdHJkdXAodG95YnVmKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS5sZW4gPSBzdHJsZW4odG95YnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREhDUF9TVFJJTkc6CisgICAgICBzcHJpbnRmKHRveWJ1ZiwgIiUuKnMiLCBvcHRwdHJbMV0sICZvcHRwdHJbMl0pOworICAgICAgbXNnb3B0X2xpc3RbY291bnRdLnZhbCA9IHN0cmR1cCh0b3lidWYpOworICAgICAgbXNnb3B0X2xpc3RbY291bnRdLmxlbiA9IHN0cmxlbih0b3lidWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESENQX0lQTElTVDoKKyAgICAgIG9wdGxlbiA9IG9wdHB0clsxXTsKKyAgICAgIGRlc3QgPSB0b3lidWY7CisgICAgICB3aGlsZSAob3B0bGVuKSB7CisgICAgICAgIG1lbWNweSgmY29udnRtcCwgJm9wdHB0clsyXSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGFkZHIuc19hZGRyID0gY29udnRtcDsKKyAgICAgICAgZGVzdCArPSBzcHJpbnRmKGRlc3QsICIlcyAiLCBpbmV0X250b2EoYWRkcikpOworICAgICAgICBvcHRsZW4gLT0gNDsKKyAgICAgIH0KKyAgICAgICooZGVzdCAtIDEpID0gJ1wwJzsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS52YWwgPSBzdHJkdXAodG95YnVmKTsKKyAgICAgIG1zZ29wdF9saXN0W2NvdW50XS5sZW4gPSBzdHJsZW4odG95YnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREhDUF9TVFJMU1Q6IC8vRklYTUU6IGRvIHNtdGhpbmcuCisgICAgY2FzZSBESENQX0lQUExTVDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREhDUF9TVENSVFM6CisgICAgICBwZnggPSAiIjsKKyAgICAgIGRlc3QgPSB0b3lidWY7CisgICAgICBvcHRpb25zID0gJm9wdHB0clsyXTsKKyAgICAgIG9wdGxlbiA9IG9wdHB0clsxXTsKKworICAgICAgd2hpbGUgKG9wdGxlbiA+PSAxICsgNCkgeworICAgICAgICB1aW50MzJfdCBuaXAgPSAwOworICAgICAgICBpbnQgYnl0ZXM7CisgICAgICAgIHVpbnQ4X3QgKnBfdG1wOworICAgICAgICB1bnNpZ25lZCBtYXNrID0gKm9wdGlvbnM7CisKKyAgICAgICAgaWYgKG1hc2sgPiAzMikgYnJlYWs7CisgICAgICAgIG9wdGxlbi0tOworICAgICAgICBwX3RtcCA9ICh2b2lkKikgJm5pcDsKKyAgICAgICAgYnl0ZXMgPSAobWFzayArIDcpIC8gODsKKyAgICAgICAgd2hpbGUgKC0tYnl0ZXMgPj0gMCkgeworICAgICAgICAgICpwX3RtcCsrID0gKm9wdGlvbnMrKzsKKyAgICAgICAgICBvcHRsZW4tLTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0bGVuIDwgNCkgYnJlYWs7CisgICAgICAgIGRlc3QgKz0gc3ByaW50ZihkZXN0LCAiJXMldS4ldS4ldS4ldSIsIHBmeCwgKCh1aW50OF90KikgJm5pcClbMF0sCisgICAgICAgICAgICAoKHVpbnQ4X3QqKSAmbmlwKVsxXSwgKCh1aW50OF90KikgJm5pcClbMl0sICgodWludDhfdCopICZuaXApWzNdKTsKKyAgICAgICAgcGZ4ID0gIiAiOworICAgICAgICBkZXN0ICs9IHNwcmludGYoZGVzdCwgIi8ldSAiLCBtYXNrKTsKKyAgICAgICAgZGVzdCArPSBzcHJpbnRmKGRlc3QsICIldS4ldS4ldS4ldSIsIG9wdGlvbnNbMF0sIG9wdGlvbnNbMV0sIG9wdGlvbnNbMl0sIG9wdGlvbnNbM10pOworICAgICAgICBvcHRpb25zICs9IDQ7CisgICAgICAgIG9wdGxlbiAtPSA0OworICAgICAgfQorICAgICAgbXNnb3B0X2xpc3RbY291bnRdLnZhbCA9IHN0cmR1cCh0b3lidWYpOworICAgICAgbXNnb3B0X2xpc3RbY291bnRdLmxlbiA9IHN0cmxlbih0b3lidWYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIG9wdHB0ciArPSBvcHRwdHJbMV0gKyAyOworICB9CisgIGlmICgob3ZlcmxvYWRlZCA9PSAxKSB8fCAob3ZlcmxvYWRlZCA9PSAzKSkgZGhjcGNfcGFyc2VvcHRpb25zKHByZXN1bHQsIG9wdHB0cik7CisgIGlmICgob3ZlcmxvYWRlZCA9PSAyKSB8fCAob3ZlcmxvYWRlZCA9PSAzKSkgZGhjcGNfcGFyc2VvcHRpb25zKHByZXN1bHQsIG9wdHB0cik7CisgIHJldHVybiB0eXBlOworfQorCisvLyBwYXJzZXMgcmVjdmQgbWVzc2VnZSB0byBjaGVjayB0aGF0IGl0IHdhcyBmb3IgdXMuCitzdGF0aWMgdWludDhfdCBkaGNwY19wYXJzZW1zZyhkaGNwY19yZXN1bHRfdCAqcHJlc3VsdCkKK3sKKyAgaWYgKHN0YXRlLT5wZGhjcC5vcCA9PSBESENQX1JFUExZCisgICAgICAmJiAhbWVtY21wKHN0YXRlLT5wZGhjcC5jaGFkZHIsIHN0YXRlLT5tYWNhZGRyLCA2KQorICAgICAgJiYgIW1lbWNtcCgmc3RhdGUtPnBkaGNwLnhpZCwgJnhpZCwgc2l6ZW9mKHhpZCkpKSB7CisgICAgbWVtY3B5KCZwcmVzdWx0LT5pcGFkZHIuc19hZGRyLCAmc3RhdGUtPnBkaGNwLnlpYWRkciwgNCk7CisgICAgcHJlc3VsdC0+aXBhZGRyLnNfYWRkciA9IG50b2hsKHByZXN1bHQtPmlwYWRkci5zX2FkZHIpOworICAgIHJldHVybiBnZXRfb3B0aW9uX21zZ3R5cGUoc3RhdGUtPnBkaGNwLm9wdGlvbnMpOworICB9CisgIHJldHVybiAwOworfQorCisvLyBTZW5kcyBhIElQIHJlbmV3IHJlcXVlc3QuCitzdGF0aWMgdm9pZCByZW5ldyh2b2lkKQoreworICBpbmZvbXNnKGluZm9tb2RlLCAiUGVyZm9ybWluZyBhIERIQ1AgcmVuZXciKTsKKyAgc3dpdGNoIChzdGF0ZS0+c3RhdHVzKSB7CisgIGNhc2UgU1RBVEVfSU5JVDoKKyAgICBicmVhazsKKyAgY2FzZSBTVEFURV9CT1VORDoKKyAgICBtb2RlX3JhdygpOworICBjYXNlIFNUQVRFX1JFTkVXSU5HOiAgICAvLyBGQUxMVEhST1VHSCAKKyAgY2FzZSBTVEFURV9SRUJJTkRJTkc6ICAgLy8gRkFMTFRIUk9VR0ggCisgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX1JFTkVXX1JFUVVFU1RFRDsKKyAgICBicmVhazsKKyAgY2FzZSBTVEFURV9SRU5FV19SRVFVRVNURUQ6CisgICAgcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKyAgY2FzZSBTVEFURV9SRVFVRVNUSU5HOiAgICAgICAgICAgLy8gRkFMTFRIUk9VR0ggCisgIGNhc2UgU1RBVEVfUkVMRUFTRUQ6ICAgICAgICAgICAgIC8vIEZBTExUSFJPVUdIIAorICAgIG1vZGVfcmF3KCk7CisgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX0lOSVQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6IGJyZWFrOworICB9Cit9CisKKy8vIFNlbmRzIGEgSVAgcmVsZWFzZSByZXF1ZXN0Lgorc3RhdGljIHZvaWQgcmVsZWFzZSh2b2lkKQoreworICBjaGFyIGJ1ZmZlcltzaXplb2YoIjI1NS4yNTUuMjU1LjI1NVwwIildOworICBzdHJ1Y3QgaW5fYWRkciB0ZW1wX2FkZHI7CisKKyAgbW9kZV9hcHAoKTsKKyAgLy8gc2VuZCByZWxlYXNlIHBhY2tldAorICBpZiAoc3RhdGUtPnN0YXR1cyA9PSBTVEFURV9CT1VORCB8fCBzdGF0ZS0+c3RhdHVzID09IFNUQVRFX1JFTkVXSU5HIHx8IHN0YXRlLT5zdGF0dXMgPT0gU1RBVEVfUkVCSU5ESU5HKSB7CisgICAgdGVtcF9hZGRyLnNfYWRkciA9IGh0b25sKHNlcnZlcik7CisgICAgeHN0cm5jcHkoYnVmZmVyLCBpbmV0X250b2EodGVtcF9hZGRyKSwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHRlbXBfYWRkci5zX2FkZHIgPSBzdGF0ZS0+aXBhZGRyLnNfYWRkcjsKKyAgICBpbmZvbXNnKCBpbmZvbW9kZSwgIlVuaWNhc3RpbmcgYSByZWxlYXNlIG9mICVzIHRvICVzIiwgaW5ldF9udG9hKHRlbXBfYWRkciksIGJ1ZmZlcik7CisgICAgZGhjcGNfc2VuZG1zZyhESENQUkVMRUFTRSk7CisgICAgcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKyAgfQorICBpbmZvbXNnKGluZm9tb2RlLCAiRW50ZXJpbmcgcmVsZWFzZWQgc3RhdGUiKTsKKyAgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisgIHN0YXRlLT5zb2NrZmQgPSAtMTsKKyAgc3RhdGUtPm1vZGUgPSBNT0RFX09GRjsKKyAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX1JFTEVBU0VEOworfQorCitzdGF0aWMgdm9pZCBmcmVlX29wdGlvbl9zdG9yZXModm9pZCkKK3sKKyAgaW50IGNvdW50LCBzaXplID0gQVJSQVlfTEVOKG9wdGlvbnNfbGlzdCk7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspCisgICAgaWYgKG9wdGlvbnNfbGlzdFtjb3VudF0udmFsKSBmcmVlKG9wdGlvbnNfbGlzdFtjb3VudF0udmFsKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIHsKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKQorICAgICAgICBpZiAobXNnb3B0X2xpc3RbY291bnRdLnZhbCkgZnJlZShtc2dvcHRfbGlzdFtjb3VudF0udmFsKTsKKyAgICBmcmVlKG1zZ29wdF9saXN0KTsKKyAgfQorfQorCit2b2lkIGRoY3BfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgaW50IHJldHZhbCwgYnVmZmxlbiA9IDA7CisgIGRoY3BjX3Jlc3VsdF90IHJlc3VsdDsKKyAgdWludDhfdCBwYWNrZXRzID0gMCwgcmV0cmllcyA9IDA7CisgIHVpbnQzMl90IHRpbWVvdXQgPSAwLCB3YWl0ZWQgPSAwOworICBmZF9zZXQgcmZkczsKKworICB4aWQgPSAwOworICBzZXRsaW5lYnVmKHN0ZG91dCk7CisgIGRiZyA9IGR1bW15OworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgZGJnID0geHByaW50ZjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIHdyaXRlX3BpZChUVC5waWRmaWxlKTsKKyAgcmV0cmllcyA9IFRULnJldHJpZXM7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19TKSB7CisgICAgICBvcGVubG9nKCJVREhDUEMgOiIsIExPR19QSUQsIExPR19EQUVNT04pOworICAgICAgaW5mb21vZGUgfD0gTE9HX1NZU1RFTTsKKyAgfQorICBpbmZvbXNnKGluZm9tb2RlLCAiZGhjcCBzdGFydGVkIik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19PKSB7CisgICAgd2hpbGUgKFRULnJlcV9vcHQpIHsKKyAgICAgIHJhd19vcHRbcmF3X29wdGNvdW50XSA9ICh1aW50OF90KSBzdHJ0b29wdChUVC5yZXFfb3B0LT5hcmcsIDEpOworICAgICAgcmF3X29wdGNvdW50Kys7CisgICAgICBUVC5yZXFfb3B0ID0gVFQucmVxX29wdC0+bmV4dDsKKyAgICB9CisgIH0KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIHsKKyAgICB3aGlsZSAoVFQucGt0X29wdCkgeworICAgICAgKHZvaWQpIHN0cnRvb3B0KFRULnBrdF9vcHQtPmFyZywgMCk7CisgICAgICBUVC5wa3Rfb3B0ID0gVFQucGt0X29wdC0+bmV4dDsKKyAgICB9CisgIH0KKyAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihkaGNwY19yZXN1bHRfdCkpOworICBzdGF0ZSA9IChkaGNwY19zdGF0ZV90KikgeG1hbGxvYyhzaXplb2YoZGhjcGNfc3RhdGVfdCkpOworICBtZW1zZXQoc3RhdGUsIDAsIHNpemVvZihkaGNwY19zdGF0ZV90KSk7CisgIHN0YXRlLT5pZmFjZSA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19pKSA/IFRULmlmYWNlIDogImV0aDAiOworCisgIGlmIChnZXRfaW50ZXJmYWNlKHN0YXRlLT5pZmFjZSwgJnN0YXRlLT5pZmluZGV4LCBOVUxMLCBzdGF0ZS0+bWFjYWRkcikpCisgICAgcGVycm9yX2V4aXQoIkZhaWxlZCB0byBnZXQgaW50ZXJmYWNlICVzIiwgc3RhdGUtPmlmYWNlKTsKKworICBydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworICBzZXR1cF9zaWduYWwoKTsKKyAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX0lOSVQ7CisgIG1vZGVfcmF3KCk7CisgIGZjbnRsKHN0YXRlLT5zb2NrZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCisgIGZvciAoOzspIHsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBpZiAoc3RhdGUtPnNvY2tmZCA+PSAwKSBGRF9TRVQoc3RhdGUtPnNvY2tmZCwgJnJmZHMpOworICAgIEZEX1NFVChzaWdmZC5yZCwgJnJmZHMpOworICAgIHR2LnR2X3NlYyA9IHRpbWVvdXQgLSB3YWl0ZWQ7CisgICAgdHYudHZfdXNlYyA9IDA7CisgICAgcmV0dmFsID0gMDsKKworICAgIGludCBtYXhmZCA9IChzaWdmZC5yZCA+IHN0YXRlLT5zb2NrZmQpPyBzaWdmZC5yZCA6IHN0YXRlLT5zb2NrZmQ7CisgICAgZGJnKCJzZWxlY3Qgd2FpdCAuLi4uXG4iKTsKKyAgICB1aW50MzJfdCB0aW1lc3RtcCA9IHRpbWUoTlVMTCk7CisgICAgaWYoKHJldHZhbCA9IHNlbGVjdChtYXhmZCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpKSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICB3YWl0ZWQgKz0gKHVuc2lnbmVkKSB0aW1lKE5VTEwpIC0gdGltZXN0bXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcGVycm9yX2V4aXQoIkVycm9yIGluIHNlbGVjdCIpOworICAgIH0KKyAgICBpZiAoIXJldHZhbCkgeyAvLyBUaW1lZCBvdXQKKyAgICAgIGlmIChnZXRfaW50ZXJmYWNlKHN0YXRlLT5pZmFjZSwgJnN0YXRlLT5pZmluZGV4LCBOVUxMLCBzdGF0ZS0+bWFjYWRkcikpCisgICAgICAgIGVycm9yX2V4aXQoIkludGVyZmFjZSBsb3N0ICVzXG4iLCBzdGF0ZS0+aWZhY2UpOworCisgICAgICBzd2l0Y2ggKHN0YXRlLT5zdGF0dXMpIHsKKyAgICAgIGNhc2UgU1RBVEVfSU5JVDoKKyAgICAgICAgaWYgKHBhY2tldHMgPCByZXRyaWVzKSB7CisgICAgICAgICAgaWYgKCFwYWNrZXRzKSB4aWQgPSBnZXR4aWQoKTsKKyAgICAgICAgICBydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworICAgICAgICAgIGluZm9tc2coaW5mb21vZGUsICJTZW5kaW5nIGRpc2NvdmVyLi4uIik7CisgICAgICAgICAgZGhjcGNfc2VuZG1zZyhESENQRElTQ09WRVIpOworICAgICAgICAgIHNlcnZlciA9IDA7CisgICAgICAgICAgdGltZW91dCA9IFRULnRpbWVvdXQ7CisgICAgICAgICAgd2FpdGVkID0gMDsKKyAgICAgICAgICBwYWNrZXRzKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KK2xlYXNlX2ZhaWw6CisgICAgICAgIHJ1bl9zY3JpcHQoTlVMTCwibGVhc2VmYWlsIik7CisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSB7CisgICAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIkxlYXNlIGZhaWxlZC4gRXhpdGluZyIpOworICAgICAgICAgIGdvdG8gcmV0X3dpdGhfc29ja2ZkOworICAgICAgICB9CisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSB7CisgICAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIkxlYXNlIGZhaWxlZC4gR29pbmcgRGFlbW9uIG1vZGUiKTsKKyAgICAgICAgICBkYWVtb24oMCwgMCk7CisgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIHdyaXRlX3BpZChUVC5waWRmaWxlKTsKKyAgICAgICAgICB0b3lzLm9wdGZsYWdzICY9IH5GTEFHX2I7CisgICAgICAgICAgdG95cy5vcHRmbGFncyB8PSBGTEFHX2Y7CisgICAgICAgIH0KKyAgICAgICAgdGltZW91dCA9IFRULnRyeWFnYWluOworICAgICAgICB3YWl0ZWQgPSAwOworICAgICAgICBwYWNrZXRzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIFNUQVRFX1JFUVVFU1RJTkc6CisgICAgICAgIGlmIChwYWNrZXRzIDwgcmV0cmllcykgeworICAgICAgICAgIG1lbWNweSgmc3RhdGUtPmlwYWRkci5zX2FkZHIsJnN0YXRlLT5wZGhjcC55aWFkZHIsIDQpOworICAgICAgICAgIGRoY3BjX3NlbmRtc2coREhDUFJFUVVFU1QpOworICAgICAgICAgIGluZm9tc2coaW5mb21vZGUsICJTZW5kaW5nIHNlbGVjdCBmb3IgJWQuJWQuJWQuJWQuLi4iLAorICAgICAgICAgICAgICAocmVzdWx0LmlwYWRkci5zX2FkZHIgPj4gMjQpICYgMHhmZiwgKHJlc3VsdC5pcGFkZHIuc19hZGRyID4+IDE2KSAmIDB4ZmYsIChyZXN1bHQuaXBhZGRyLnNfYWRkciA+PiA4KSAmIDB4ZmYsIChyZXN1bHQuaXBhZGRyLnNfYWRkcikgJiAweGZmKTsKKyAgICAgICAgICB0aW1lb3V0ID0gVFQudGltZW91dDsKKyAgICAgICAgICB3YWl0ZWQgPSAwOworICAgICAgICAgIHBhY2tldHMrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtb2RlX3JhdygpOworICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVEVfSU5JVDsKKyAgICAgICAgZ290byBsZWFzZV9mYWlsOworICAgICAgY2FzZSBTVEFURV9CT1VORDoKKyAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX1JFTkVXSU5HOworICAgICAgICBkYmcoIkVudGVyaW5nIHJlbmV3IHN0YXRlXG4iKTsKKyAgICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgU1RBVEVfUkVORVdfUkVRVUVTVEVEOiAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIFNUQVRFX1JFTkVXSU5HOgorcmVuZXdfcmVxdWVzdGVkOgorICAgICAgICBpZiAodGltZW91dCA+IDYwKSB7CisgICAgICAgICAgZGhjcGNfc2VuZG1zZyhESENQUkVRVUVTVCk7CisgICAgICAgICAgdGltZW91dCA+Pj0gMTsKKyAgICAgICAgICB3YWl0ZWQgPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRiZygiRW50ZXJpbmcgcmViaW5kaW5nIHN0YXRlXG4iKTsKKyAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX1JFQklORElORzsKKyAgICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgU1RBVEVfUkVCSU5ESU5HOgorICAgICAgICBtb2RlX3JhdygpOworICAgICAgICBpZiAodGltZW91dCA+IDApIHsKKyAgICAgICAgICBkaGNwY19zZW5kbXNnKERIQ1BSRVFVRVNUKTsKKyAgICAgICAgICB0aW1lb3V0ID4+PSAxOworICAgICAgICAgIHdhaXRlZCA9IDA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIkxlYXNlIGxvc3QsIGVudGVyaW5nIElOSVQgc3RhdGUiKTsKKyAgICAgICAgcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKyAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRFX0lOSVQ7CisgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgICB3YWl0ZWQgPSAwOworICAgICAgICBwYWNrZXRzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICAgIHRpbWVvdXQgPSBJTlRfTUFYOworICAgICAgd2FpdGVkID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoRkRfSVNTRVQoc2lnZmQucmQsICZyZmRzKSkgeyAvLyBTb21lIEFjdGl2aXR5IG9uIFJERkRzIDogaXMgc2lnbmFsCisgICAgICB1bnNpZ25lZCBjaGFyIHNpZzsKKyAgICAgIGlmIChyZWFkKHNpZ2ZkLnJkLCAmc2lnLCAxKSAhPSAxKSB7CisgICAgICAgIGRiZygic2lnbmFsIHJlYWQgZmFpbGVkLlxuIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3dpdGNoIChzaWcpIHsKKyAgICAgIGNhc2UgU0lHVVNSMToKKyAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIlJlY2VpdmVkIFNJR1VTUjEiKTsKKyAgICAgICAgcmVuZXcoKTsKKyAgICAgICAgcGFja2V0cyA9IDA7CisgICAgICAgIHdhaXRlZCA9IDA7CisgICAgICAgIGlmIChzdGF0ZS0+c3RhdHVzID09IFNUQVRFX1JFTkVXX1JFUVVFU1RFRCkgZ290byByZW5ld19yZXF1ZXN0ZWQ7CisgICAgICAgIGlmIChzdGF0ZS0+c3RhdHVzID09IFNUQVRFX0lOSVQpIHRpbWVvdXQgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgU0lHVVNSMjoKKyAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIlJlY2VpdmVkIFNJR1VTUjIiKTsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICB0aW1lb3V0ID0gSU5UX01BWDsKKyAgICAgICAgd2FpdGVkID0gMDsKKyAgICAgICAgcGFja2V0cyA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBTSUdURVJNOgorICAgICAgICBpbmZvbXNnKGluZm9tb2RlLCAiUmVjZWl2ZWQgU0lHVEVSTSIpOworICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUikgcmVsZWFzZSgpOworICAgICAgICBnb3RvIHJldF93aXRoX3NvY2tmZDsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRkRfSVNTRVQoc3RhdGUtPnNvY2tmZCwgJnJmZHMpKSB7IC8vIFNvbWUgQWN0aXZpdHkgb24gUkRGRHMgOiBpcyBzb2NrZXQKKyAgICAgIGRiZygibWFpbiBzb2NrIHJlYWRcbiIpOworICAgICAgdWludDhfdCBtc2dUeXBlOworICAgICAgaWYgKHN0YXRlLT5tb2RlID09IE1PREVfUkFXKSBidWZmbGVuID0gcmVhZF9yYXcoKTsKKyAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBNT0RFX0FQUCkgYnVmZmxlbiA9IHJlYWRfYXBwKCk7CisgICAgICBpZiAoYnVmZmxlbiA8IDApIHsKKyAgICAgICAgaWYgKHN0YXRlLT5tb2RlID09IE1PREVfUkFXKSBtb2RlX3JhdygpOworICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gTU9ERV9BUFApIG1vZGVfYXBwKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgd2FpdGVkICs9IHRpbWUoTlVMTCkgLSB0aW1lc3RtcDsKKyAgICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YoZGhjcGNfcmVzdWx0X3QpKTsKKyAgICAgIG1zZ1R5cGUgPSBkaGNwY19wYXJzZW1zZygmcmVzdWx0KTsKKyAgICAgIGlmIChtc2dUeXBlICE9IERIQ1BOQUsgJiYgcmVzdWx0LmlwYWRkci5zX2FkZHIgPT0gMCApIGNvbnRpbnVlOyAgICAgICAvLyBubyBpcCBmb3IgbWUgaWdub3JlCisgICAgICBpZiAoIW1zZ1R5cGUgfHwgIWdldF9vcHRpb25fc2VydmVyaWQoc3RhdGUtPnBkaGNwLm9wdGlvbnMsICZyZXN1bHQpKSBjb250aW51ZTsgLy9ubyBzZXJ2ZXIgaWQgaWdub3JlCisgICAgICBpZiAobXNnVHlwZSA9PSBESENQT0ZGRVIgJiYgc2VydmVyID09IDApIHNlcnZlciA9IHJlc3VsdC5zZXJ2ZXJpZC5zX2FkZHI7IC8vIHNlbGVjdCB0aGUgc2VydmVyCisgICAgICBpZiAocmVzdWx0LnNlcnZlcmlkLnNfYWRkciAhPSBzZXJ2ZXIpIGNvbnRpbnVlOyAvLyBub3QgZnJvbSB0aGUgc2VydmVyIHdlIHJlcXVlc3RlZCBpZ25vcmUKKyAgICAgIGRoY3BjX3BhcnNlb3B0aW9ucygmcmVzdWx0LCBzdGF0ZS0+cGRoY3Aub3B0aW9ucyk7CisgICAgICBnZXRfb3B0aW9uX2xlYXNlKHN0YXRlLT5wZGhjcC5vcHRpb25zLCAmcmVzdWx0KTsKKworICAgICAgc3dpdGNoIChzdGF0ZS0+c3RhdHVzKSB7CisgICAgICBjYXNlIFNUQVRFX0lOSVQ6CisgICAgICAgIGlmIChtc2dUeXBlID09IERIQ1BPRkZFUikgeworICAgICAgICAgIHN0YXRlLT5zdGF0dXMgPSBTVEFURV9SRVFVRVNUSU5HOworICAgICAgICAgIG1vZGVfcmF3KCk7CisgICAgICAgICAgdGltZW91dCA9IDA7CisgICAgICAgICAgd2FpdGVkID0gMDsKKyAgICAgICAgICBwYWNrZXRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgU1RBVEVfUkVRVUVTVElORzogICAgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgY2FzZSBTVEFURV9SRU5FV0lORzogICAgICAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIFNUQVRFX1JFTkVXX1JFUVVFU1RFRDogICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGNhc2UgU1RBVEVfUkVCSU5ESU5HOgorICAgICAgICBpZiAobXNnVHlwZSA9PSBESENQQUNLKSB7CisgICAgICAgICAgdGltZW91dCA9IHJlc3VsdC5sZWFzZV90aW1lIC8gMjsKKyAgICAgICAgICBydW5fc2NyaXB0KCZyZXN1bHQsIHN0YXRlLT5zdGF0dXMgPT0gU1RBVEVfUkVRVUVTVElORyA/ICJib3VuZCIgOiAicmVuZXciKTsKKyAgICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVEVfQk9VTkQ7CisgICAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIkxlYXNlIG9mICVkLiVkLiVkLiVkIG9idGFpbmVkLCBsZWFzZSB0aW1lICVkIGZyb20gc2VydmVyICVkLiVkLiVkLiVkIiwKKyAgICAgICAgICAgICAgKHJlc3VsdC5pcGFkZHIuc19hZGRyID4+IDI0KSAmIDB4ZmYsIChyZXN1bHQuaXBhZGRyLnNfYWRkciA+PiAxNikgJiAweGZmLCAocmVzdWx0LmlwYWRkci5zX2FkZHIgPj4gOCkgJiAweGZmLCAocmVzdWx0LmlwYWRkci5zX2FkZHIpICYgMHhmZiwKKyAgICAgICAgICAgICAgcmVzdWx0LmxlYXNlX3RpbWUsCisgICAgICAgICAgICAgIChyZXN1bHQuc2VydmVyaWQuc19hZGRyID4+IDI0KSAmIDB4ZmYsIChyZXN1bHQuc2VydmVyaWQuc19hZGRyID4+IDE2KSAmIDB4ZmYsIChyZXN1bHQuc2VydmVyaWQuc19hZGRyID4+IDgpICYgMHhmZiwgKHJlc3VsdC5zZXJ2ZXJpZC5zX2FkZHIpICYgMHhmZik7CisgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3EpIHsKKyAgICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19SKSByZWxlYXNlKCk7CisgICAgICAgICAgICBnb3RvIHJldF93aXRoX3NvY2tmZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdG95cy5vcHRmbGFncyAmPSB+RkxBR19uOworICAgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSB7CisgICAgICAgICAgICBkYWVtb24oMCwgMCk7CisgICAgICAgICAgICB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfZjsKKyAgICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSB3cml0ZV9waWQoVFQucGlkZmlsZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHdhaXRlZCA9IDA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAobXNnVHlwZSA9PSBESENQTkFLKSB7CisgICAgICAgICAgZGJnKCJOQUNLIHJlY2VpdmVkLlxuIik7CisgICAgICAgICAgcnVuX3NjcmlwdCgmcmVzdWx0LCAibmFrIik7CisgICAgICAgICAgaWYgKHN0YXRlLT5zdGF0dXMgIT0gU1RBVEVfUkVRVUVTVElORykgcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKyAgICAgICAgICBtb2RlX3JhdygpOworICAgICAgICAgIHNsZWVwKDMpOworICAgICAgICAgIHN0YXRlLT5zdGF0dXMgPSBTVEFURV9JTklUOworICAgICAgICAgIHN0YXRlLT5pcGFkZHIuc19hZGRyID0gMDsKKyAgICAgICAgICBzZXJ2ZXIgPSAwOworICAgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgICAgIHBhY2tldHMgPSAwOworICAgICAgICAgIHdhaXRlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK3JldF93aXRoX3NvY2tmZDoKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGZyZWVfb3B0aW9uX3N0b3JlcygpOworICAgIGlmIChzdGF0ZS0+c29ja2ZkID4gMCkgY2xvc2Uoc3RhdGUtPnNvY2tmZCk7CisgICAgZnJlZShzdGF0ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvZGhjcDYuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZGhjcDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTVjMTUxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9kaGNwNi5jCkBAIC0wLDAgKzEsNjkyIEBACisvKiBkaGNwNi5jIC0gREhDUDYgY2xpZW50IGZvciBkeW5hbWljIG5ldHdvcmsgY29uZmlndXJhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSYWpuaSBLYW50IDxyYWpuaWthbnQxMjM0NUBnbWFpbC5jb20+CisgKgorICogTm90IGluIFNVU3Y0LgorVVNFX0RIQ1A2KE5FV1RPWShkaGNwNiwgInI6QSM8MFQjPDB0IzwwczpwOmk6U1J2cW5iZiIsIFRPWUZMQUdfU0JJTnxUT1lGTEFHX1JPT1RPTkxZKSkKKworY29uZmlnIERIQ1A2CisgIGJvb2wgImRoY3A2IgorICBkZWZhdWx0IG4KKyAgaGVscAorICB1c2FnZTogZGhjcDYgWy1mYm5xdlJdIFstaSBJRkFDRV0gWy1yIElQXSBbLXMgUFJPR10gWy1wIFBJREZJTEVdCisKKyAgICAgICAgQ29uZmlndXJlIG5ldHdvcmsgZHluYW1pY2FseSB1c2luZyBESENQLgorCisgICAgICAtaSBJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApCisgICAgICAtcCBDcmVhdGUgcGlkZmlsZQorICAgICAgLXMgUnVuIFBST0cgYXQgREhDUCBldmVudHMgCisgICAgICAtdCBTZW5kIHVwIHRvIE4gU29saWNpdCBwYWNrZXRzCisgICAgICAtVCBQYXVzZSBiZXR3ZWVuIHBhY2tldHMgKGRlZmF1bHQgMyBzZWNvbmRzKQorICAgICAgLUEgV2FpdCBOIHNlY29uZHMgYWZ0ZXIgZmFpbHVyZSAoZGVmYXVsdCAyMCkKKyAgICAgIC1mIFJ1biBpbiBmb3JlZ3JvdW5kCisgICAgICAtYiBCYWNrZ3JvdW5kIGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZAorICAgICAgLW4gRXhpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQKKyAgICAgIC1xIEV4aXQgYWZ0ZXIgb2J0YWluaW5nIGxlYXNlCisgICAgICAtUiBSZWxlYXNlIElQIG9uIGV4aXQKKyAgICAgIC1TIExvZyB0byBzeXNsb2cgdG9vCisgICAgICAtciBSZXF1ZXN0IHRoaXMgSVAgYWRkcmVzcworICAgICAgLXYgVmVyYm9zZQorCisgICAgICBTaWduYWxzOgorICAgICAgVVNSMSAgUmVuZXcgY3VycmVudCBsZWFzZQorICAgICAgVVNSMiAgUmVsZWFzZSBjdXJyZW50IGxlYXNlCisqLworI2RlZmluZSBGT1JfZGhjcDYKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPiAKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisKK0dMT0JBTFMoCisgIGNoYXIgKmludGVyZmFjZV9uYW1lLCAqcGlkZmlsZSwgKnNjcmlwdDsKKyAgbG9uZyByZXRyeSwgdGltZW91dCwgZXJyb3J0aW1lb3V0OworICBjaGFyICpyZXFfaXA7CisgIGludCBsZW5ndGgsIHN0YXRlLCByZXF1ZXN0X2xlbmd0aCwgc29jaywgc29jazEsIHN0YXR1cywgcmV0dmFsLCByZXRyaWVzOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgdWludDhfdCB0cmFuc2N0aW9uX2lkWzNdOworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGlucHV0X3NvY2tldDY7CispCisKKyNkZWZpbmUgREhDUDZTT0xJQ0lUICAgICAgICAxCisjZGVmaW5lIERIQ1A2QURWRVJUSVNFICAgICAgMiAgIC8vIHNlcnZlciAtPiBjbGllbnQKKyNkZWZpbmUgREhDUDZSRVFVRVNUICAgICAgICAzCisjZGVmaW5lIERIQ1A2Q09ORklSTSAgICAgICAgNAorI2RlZmluZSBESENQNlJFTkVXICAgICAgICAgIDUKKyNkZWZpbmUgREhDUDZSRUJJTkQgICAgICAgICA2CisjZGVmaW5lIERIQ1A2UkVQTFkgICAgICAgICAgNyAgIC8vIHNlcnZlciAtPiBjbGllbnQKKyNkZWZpbmUgREhDUDZSRUxFQVNFICAgICAgICA4CisjZGVmaW5lIERIQ1A2REVDTElORSAgICAgICAgOQorI2RlZmluZSBESENQNlJFQ09ORklHVVJFICAgIDEwICAvLyBzZXJ2ZXIgLT4gY2xpZW50CisjZGVmaW5lIERIQ1A2SU5GT1JFUVVFU1QgICAgMTEKKyNkZWZpbmUgREhDUDZSRUxBWUZMT1cgICAgICAxMiAgLy8gcmVsYXkgLT4gcmVsYXkvc2VydmVyCisjZGVmaW5lIERIQ1A2UkVMQVlSRVBMWSAgICAgMTMgIC8vIHNlcnZlci9yZWxheSAtPiByZWxheQorCisvLyBESENQdjYgb3B0aW9uIGNvZGVzIChwYXJ0aWFsKS4gU2VlIFJGQyAzMzE1CisjZGVmaW5lIERIQ1A2X09QVF9DTElFTlRJRCAgICAgIDEKKyNkZWZpbmUgREhDUDZfT1BUX1NFUlZFUklEICAgICAgMgorI2RlZmluZSBESENQNl9PUFRfSUFfTkEgICAgICAgICAzCisjZGVmaW5lIERIQ1A2X09QVF9JQV9BRERSICAgICAgIDUKKyNkZWZpbmUgREhDUDZfT1BUX09STyAgICAgICAgICAgNgorI2RlZmluZSBESENQNl9PUFRfUFJFRkVSRU5DRSAgICA3CisjZGVmaW5lIERIQ1A2X09QVF9FTEFQU0VEX1RJTUUgIDgKKyNkZWZpbmUgREhDUDZfT1BUX1JFTEFZX01TRyAgICAgOQorI2RlZmluZSBESENQNl9PUFRfU1RBVFVTX0NPREUgICAxMworI2RlZmluZSBESENQNl9PUFRfSUFfUEQgICAgICAgICAyNQorI2RlZmluZSBESENQNl9PUFRfSUFfUFJFRklYICAgICAyNgorCisjZGVmaW5lIERIQ1A2X1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIERIQ1A2X1NUQVRVU19OT0FERFJTQVZBSUwgICAyCisKKyNkZWZpbmUgREhDUDZfRFVJRF9MTFQgICAgMQorI2RlZmluZSBESENQNl9EVUlEX0VOICAgICAyCisjZGVmaW5lIERIQ1A2X0RVSURfTEwgICAgIDMKKyNkZWZpbmUgREhDUDZfRFVJRF9VVUlEICAgNAorCisjZGVmaW5lIERIQ1BDX1NFUlZFUl9QT1JUICAgICA1NDcKKyNkZWZpbmUgREhDUENfQ0xJRU5UX1BPUlQgICAgIDU0NgorICAKKyNkZWZpbmUgTE9HX1NJTEVOVCAgICAgICAgICAweDAKKyNkZWZpbmUgTE9HX0NPTlNPTEUgICAgICAgICAweDEKKyNkZWZpbmUgTE9HX1NZU1RFTSAgICAgICAgICAweDIKKyAgCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBkaGNwNl9tc2dfcyB7CisgIHVpbnQ4X3QgbXNndHlwZSwgdHJhbnNhY3Rpb25faWRbM10sIG9wdGlvbnNbNTI0XTsKK30gZGhjcDZfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG9wdHZhbF9kdWlkX2xsdCB7CisgIHVpbnQxNl90IHR5cGU7CisgIHVpbnQxNl90IGh3dHlwZTsKKyAgdWludDMyX3QgdGltZTsKKyAgdWludDhfdCBsbGFkZHJbNl07Cit9IERVSUQ7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG9wdHZhbF9pYV9uYSB7CisgIHVpbnQzMl90IGlhaWQsIHQxLCB0MjsKK30gSUFfTkE7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGRoY3A2X3Jhd19zIHsKKyAgc3RydWN0IGlwNl9oZHIgaXBoOworICBzdHJ1Y3QgdWRwaGRyIHVkcGg7CisgIGRoY3A2X21zZ190IGRoY3A2OworfSBkaGNwNl9yYXdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGhjcF9kYXRhX2NsaWVudCB7CisgIHVpbnQxNl90ICBzdGF0dXNfY29kZTsKKyAgdWludDMyX3QgaWFpZCAsIHQxLHQyLCBwZl9sZiwgdmFfbGY7CisgIHVpbnQ4X3QgaXBhZGRyWzE3XSA7Cit9IERIQ1BfREFUQTsKKworc3RhdGljIERIQ1BfREFUQSBkaGNwX2RhdGE7CitzdGF0aWMgZGhjcDZfcmF3X3QgKm15bXNnOworc3RhdGljIGRoY3A2X21zZ190IG1lc2c7CitzdGF0aWMgRFVJRCAqZHVpZDsKKworc3RhdGljIHZvaWQgKCpkYmcpKGNoYXIgKmZvcm1hdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGR1bW15KGNoYXIgKmZvcm1hdCwgLi4uKQoreworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2l0KGNoYXIgKmZvcm1hdCwgLi4uKQoreworICBpbnQgdXNlZDsKKyAgY2hhciAqbXNnOworICB2YV9saXN0IHAsIHQ7CisgIHVpbnQ4X3QgaW5mb21vZGUgPSBMT0dfU0lMRU5UOworICAKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1MpIGluZm9tb2RlIHw9IExPR19TWVNURU07CisgIGlmKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIGluZm9tb2RlIHw9IExPR19DT05TT0xFOworICB2YV9zdGFydChwLCBmb3JtYXQpOworICB2YV9jb3B5KHQsIHApOworICB1c2VkID0gdnNucHJpbnRmKE5VTEwsIDAsIGZvcm1hdCwgdCk7CisgIHVzZWQrKzsKKyAgdmFfZW5kKHQpOworCisgIG1zZyA9IHhtYWxsb2ModXNlZCk7CisgIHZzbnByaW50Zihtc2csIHVzZWQsIGZvcm1hdCwgcCk7CisgIHZhX2VuZChwKTsKKworICBpZiAoaW5mb21vZGUgJiBMT0dfU1lTVEVNKSBzeXNsb2coTE9HX0lORk8sICIlcyIsIG1zZyk7CisgIGlmIChpbmZvbW9kZSAmIExPR19DT05TT0xFKSBwcmludGYoIiVzIiwgbXNnKTsKKyAgZnJlZShtc2cpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdldF9tYWModWludDhfdCAqbWFjLCBjaGFyICppbnRlcmZhY2UpCit7CisgIGludCBmZDsKKyAgc3RydWN0IGlmcmVxIHJlcTsKKyAgICAgICAgICAKKyAgaWYgKCFtYWMpIHJldHVybjsKKyAgZmQgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworICByZXEuaWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDY7CisgIHhzdHJuY3B5KHJlcS5pZnJfbmFtZSwgaW50ZXJmYWNlLCBJRk5BTVNJWik7CisgIHhpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJnJlcSk7CisgIG1lbWNweShtYWMsIHJlcS5pZnJfaHdhZGRyLnNhX2RhdGEsIDYpOworICB4Y2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29wdGlvbih1aW50MTZfdCBvcHRpb25faWQsIHVpbnQxNl90IG9wdGlvbl9sZW4sIHVpbnQ4X3QgKipkaG1lc2cpCit7CisgIHVpbnQ4X3QgKnRtcCA9ICpkaG1lc2c7CisgIAorICAqKCh1aW50MTZfdCopdG1wKSA9IGh0b25zKG9wdGlvbl9pZCk7CisgICoodWludDE2X3QqKSh0bXArMikgPSBodG9ucyhvcHRpb25fbGVuKTsKKyAgKmRobWVzZyArPSA0OworICBUVC5sZW5ndGggKz0gNDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9jbGllbnRJRCgpIAoreyAgCisgIHVpbnQ4X3QgKnRtcCA9ICZtZXNnLm9wdGlvbnNbVFQubGVuZ3RoXTsKKyAgCisgIGlmKCFkdWlkKSB7CisgICAgdWludDhfdCBtYWNbN10gPSB7MCx9OworICAgIGR1aWQgPSAoRFVJRCopbWFsbG9jKHNpemVvZihEVUlEKSk7CisgICAgZHVpZC0+dHlwZSA9IGh0b25zKDEpOworICAgIGR1aWQtPmh3dHlwZSA9IGh0b25zKDEpOworICAgIGR1aWQtPnRpbWUgPSBodG9ubCgodWludDMyX3QpKHRpbWUoTlVMTCkgLSA5NDY2ODQ4MDApICYgMHhmZmZmZmZmZik7CisgICAgZmlsbF9vcHRpb24oREhDUDZfT1BUX0NMSUVOVElELDE0LCZ0bXApOworICAgIGdldF9tYWMobWFjLCBUVC5pbnRlcmZhY2VfbmFtZSk7CisgICAgbWVtY3B5KGR1aWQtPmxsYWRkcixtYWMsIDYpOworICAgIG1lbWNweSh0bXAsKHVpbnQ4X3QqKWR1aWQsc2l6ZW9mKERVSUQpKTsKKyAgfQorICBlbHNlIHsKKyAgICBmaWxsX29wdGlvbihESENQNl9PUFRfQ0xJRU5USUQsMTQsJnRtcCk7CisgICAgbWVtY3B5KHRtcCwodWludDhfdCopZHVpZCxzaXplb2YoRFVJRCkpOworICB9CisgIFRULmxlbmd0aCArPSBzaXplb2YoRFVJRCk7Cit9CisKKy8vIFRPRE86IG1ha2UgaXQgZ2VuZXJpYyBmb3IgbXVsdGlwbGUgb3B0aW9ucy4KK3N0YXRpYyB2b2lkIGZpbGxfb3B0aW9uUmVxdWVzdCgpIAoreworICB1aW50OF90ICp0bXAgPSAmbWVzZy5vcHRpb25zW1RULmxlbmd0aF07CisgIAorICBmaWxsX29wdGlvbihESENQNl9PUFRfT1JPLDQsJnRtcCk7CisgICoodWludDE2X3QqKSh0bXArNCkgPSBodG9ucygyMyk7CisgICoodWludDE2X3QqKSh0bXArNikgPSBodG9ucygyNCk7CisgIFRULmxlbmd0aCArPSA0OworfQorCitzdGF0aWMgdm9pZCBmaWxsX2VsYXBzZWRUaW1lKCkKK3sKKyAgdWludDhfdCAqdG1wID0gJm1lc2cub3B0aW9uc1tUVC5sZW5ndGhdOworICAKKyAgZmlsbF9vcHRpb24oREhDUDZfT1BUX0VMQVBTRURfVElNRSwgMiwgJnRtcCk7CisgICoodWludDE2X3QqKSh0bXArNikgPSBodG9ucygwKTsKKyAgVFQubGVuZ3RoICs9IDI7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfaWFpZCgpIAoreworICBJQV9OQSBpYW5hOworICB1aW50OF90ICp0bXAgPSAmbWVzZy5vcHRpb25zW1RULmxlbmd0aF07CisgIAorICBmaWxsX29wdGlvbihESENQNl9PUFRfSUFfTkEsIDEyLCAmdG1wKTsKKyAgaWFuYS5pYWlkID0gcmFuZCgpOworICBpYW5hLnQxID0gMHhmZmZmZmZmZjsKKyAgaWFuYS50MiA9IDB4ZmZmZmZmZmY7CisgIG1lbWNweSh0bXAsICh1aW50OF90KikmaWFuYSwgc2l6ZW9mKElBX05BKSk7CisgIFRULmxlbmd0aCArPSBzaXplb2YoSUFfTkEpOworfQorCisvL3N0YXRpYyB2b2lkIG1vZGVfcmF3KGludCAqc29ja190KQorc3RhdGljIHZvaWQgbW9kZV9yYXcoKQoreworICBpbnQgY29uc3RvbmUgPSAxOworICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc29ja2xsOworICAKKyAgaWYgKFRULnNvY2sgPiAwKSB4Y2xvc2UoVFQuc29jayk7CisgIFRULnNvY2sgPSB4c29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfSVBWNikpOworICAKKyAgbWVtc2V0KCZzb2NrbGwsIDAsIHNpemVvZihzb2NrbGwpKTsKKyAgc29ja2xsLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisgIHNvY2tsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKyAgc29ja2xsLnNsbF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFQuaW50ZXJmYWNlX25hbWUpOworICBpZiAoYmluZChUVC5zb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzb2NrbGwsIHNpemVvZihzb2NrbGwpKSkgeworICAgIHhjbG9zZShUVC5zb2NrKTsKKyAgICBlcnJvcl9leGl0KCJNT0RFIFJBVyA6IEJpbmQgZmFpbC5cbiIpOworICB9IAorICBpZiAoc2V0c29ja29wdChUVC5zb2NrLCBTT0xfUEFDS0VULCBQQUNLRVRfSE9TVCwmY29uc3RvbmUsIHNpemVvZihpbnQpKSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT1BST1RPT1BUKSBlcnJvcl9leGl0KCJNT0RFIFJBVyA6IEJpbmQgZmFpbC5cbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfdHJhbnNlY3Rpb25faWQoKSAKK3sKKyAgaW50IGksIHIgPSByYW5kKCkgJSAweGZmZmZmZjsKKyAgCisgIGZvciAoaT0wOyBpPDM7IGkrKykgeworICAgIFRULnRyYW5zY3Rpb25faWRbaV0gPSByJTB4ZmY7CisgICAgciA9IHIvMTA7CisgIH0gIAorfQorCitzdGF0aWMgdm9pZCBzZXRfdGltZW91dChpbnQgc2Vjb25kcykgCit7CisgIFRULnR2LnR2X3NlYyA9IHNlY29uZHM7CisgIFRULnR2LnR2X3VzZWMgPSAxMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkICBzZW5kX21zZyhpbnQgdHlwZSkKK3sKKyAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNjsKKyAgaW50IHNlbmRsZW5ndGggPSAwOworICAKKyAgbWVtc2V0KCZhZGRyNiwgMCwgc2l6ZW9mKGFkZHI2KSk7CisgIGFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKERIQ1BDX1NFUlZFUl9QT1JUKTsgLy9TRVJWRVJfUE9SVAorICBpbmV0X3B0b24oQUZfSU5FVDYsICJmZjAyOjoxOjIiLCAmYWRkcjYuc2luNl9hZGRyKTsKKyAgbWVzZy5tc2d0eXBlID0gdHlwZTsKKyAgZ2VuZXJhdGVfdHJhbnNlY3Rpb25faWQoKTsKKyAgbWVtY3B5KG1lc2cudHJhbnNhY3Rpb25faWQsIFRULnRyYW5zY3Rpb25faWQsIDMpOworICAKKyAgaWYgKHR5cGUgID09IERIQ1A2U09MSUNJVCkgeworICAgIFRULmxlbmd0aCA9IDA7CisgICAgZmlsbF9jbGllbnRJRCgpOworICAgIGZpbGxfb3B0aW9uUmVxdWVzdCgpOworICAgIGZpbGxfZWxhcHNlZFRpbWUoKTsKKyAgICBmaWxsX2lhaWQoKTsKKyAgICBzZW5kbGVuZ3RoID0gc2l6ZW9mKGRoY3A2X21zZ190KSAtIDUyNCArIFRULmxlbmd0aDsKKyAgfSBlbHNlIGlmICh0eXBlID09IERIQ1A2UkVRVUVTVCB8fCB0eXBlID09IERIQ1A2UkVMRUFTRSB8fCB0eXBlID09IERIQ1A2UkVORVcpIAorICAgIHNlbmRsZW5ndGggPSBUVC5yZXF1ZXN0X2xlbmd0aDsKKyAgZGJnKCJTZW5kaW5nIG1lc3NhZ2UgdHlwZTogJWRcbiIsIHR5cGUpOworICBzZW5kbGVuZ3RoID0gc2VuZHRvKFRULnNvY2sxLCAmbWVzZywgc2VuZGxlbmd0aCAsIDAsKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNiwKKyAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiApKTsKKyAgaWYgKHNlbmRsZW5ndGggPD0gMCkgZGJnKCJFcnJvciBpbiBzZW5kaW5nIG1lc3NhZ2UgdHlwZTogJWRcbiIsIHR5cGUpOworfQorCit1aW50OF90ICpnZXRfbXNnX3B0cih1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9sZW5ndGgsIGludCBtc2d0eXBlKQoreworICB1aW50MTZfdCB0eXBlID0gICooKHVpbnQxNl90KilkYXRhKSwgbGVuZ3RoID0gKigodWludDE2X3QqKShkYXRhKzIpKTsKKyAgCisgIHR5cGUgPSBudG9ocyh0eXBlKTsKKyAgaWYgKHR5cGUgPT0gbXNndHlwZSkgcmV0dXJuIGRhdGE7CisgIGxlbmd0aCA9IG50b2hzKGxlbmd0aCk7CisgIHdoaWxlICh0eXBlICE9IG1zZ3R5cGUpIHsKKyAgICBkYXRhX2xlbmd0aCAtPSAoNCArIGxlbmd0aCk7CisgICAgaWYgKGRhdGFfbGVuZ3RoIDw9IDApIGJyZWFrOworICAgIGRhdGEgPSBkYXRhICsgNCArIGxlbmd0aDsKKyAgICB0eXBlID0gbnRvaHMoKigodWludDE2X3QqKWRhdGEpKTsKKyAgICBsZW5ndGggPSBudG9ocygqKCh1aW50MTZfdCopKGRhdGErMikpKTsKKyAgICBpZiAodHlwZSA9PSBtc2d0eXBlKSByZXR1cm4gZGF0YTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVpbnQ4X3QgKmNoZWNrX3NlcnZlcl9pZCh1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9sZW5ndGgpCit7CisgIHJldHVybiBnZXRfbXNnX3B0cihkYXRhLCAgZGF0YV9sZW5ndGgsIERIQ1A2X09QVF9TRVJWRVJJRCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfY2xpZW50X2lkKHVpbnQ4X3QgKmRhdGEsIGludCBkYXRhX2xlbmd0aCkKK3sKKyAgaWYgKChkYXRhID0gZ2V0X21zZ19wdHIoZGF0YSwgIGRhdGFfbGVuZ3RoLCBESENQNl9PUFRfQ0xJRU5USUQpKSkgeworICAgIERVSUQgb25lID0gKigoRFVJRCopKGRhdGErNCkpOworICAgIERVSUQgdHdvID0gKigoRFVJRCopJm1lc2cub3B0aW9uc1s0XSk7CisgICAgCisgICAgaWYgKCFtZW1jbXAoJm9uZSwgJnR3bywgc2l6ZW9mKERVSUQpKSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfaWRzKCkgCit7CisgIGlmICghY2hlY2tfc2VydmVyX2lkKG15bXNnLT5kaGNwNi5vcHRpb25zLCAKKyAgICBUVC5zdGF0dXMgLSAoKGNoYXIqKSZteW1zZy0+ZGhjcDYub3B0aW9uc1swXSAtIChjaGFyKilteW1zZykgKSkgeworICAgIGRiZygiSW52YWxpZCBzZXJ2ZXIgaWQ6ICVkXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWNoZWNrX2NsaWVudF9pZChteW1zZy0+ZGhjcDYub3B0aW9ucywgCisgICAgVFQuc3RhdHVzIC0gKChjaGFyKikmbXltc2ctPmRoY3A2Lm9wdGlvbnNbMF0gLSAoY2hhciopbXltc2cpICkpIHsKKyAgICBkYmcoIkludmFsaWQgY2xpZW50IGlkOiAlZFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2lhX25hKHVpbnQ4X3QgKmRhdGEsIGludCBkYXRhX2xlbmd0aCkgCit7CisgIHVpbnQ4X3QgKnQgPSBnZXRfbXNnX3B0cihkYXRhLCBkYXRhX2xlbmd0aCwgREhDUDZfT1BUX0lBX05BKTsKKyAgdWludDE2X3QgaWFuYV9sZW4sIGNvbnRlbnRfbGVuID0gMDsKKyAgCisgIG1lbXNldCgmZGhjcF9kYXRhLDAsc2l6ZW9mKGRoY3BfZGF0YSkpOworICBpZiAoIXQpIHJldHVybjsKKyAgCisgIGlhbmFfbGVuID0gbnRvaHMoKigodWludDE2X3QqKSh0KzIpKSk7CisgIGRoY3BfZGF0YS5pYWlkID0gbnRvaGwoKigodWludDMyX3QqKSh0KzQpKSk7CisgIGRoY3BfZGF0YS50MSA9IG50b2hsKCooKHVpbnQzMl90KikodCs4KSkpOworICBkaGNwX2RhdGEudDIgPSBudG9obCgqKCh1aW50MzJfdCopKHQrMTIpKSk7CisgIHQgKz0gMTY7CisgIGlhbmFfbGVuIC09IDEyOworICAKKyAgd2hpbGUoaWFuYV9sZW4gPiAwKSB7CisgICAgdWludDE2X3Qgc3ViX3R5cGUgPSBudG9ocygqKCh1aW50MTZfdCopKHQpKSk7CisgICAgCisgICAgc3dpdGNoIChzdWJfdHlwZSkgeworICAgICAgY2FzZSBESENQNl9PUFRfSUFfQUREUjoKKyAgICAgICAgY29udGVudF9sZW4gPSBudG9ocygqKCh1aW50MTZfdCopKHQrMikpKTsKKyAgICAgICAgbWVtY3B5KGRoY3BfZGF0YS5pcGFkZHIsdCs0LDE2KTsKKyAgICAgICAgaWYgKFRULnN0YXRlID09IERIQ1A2U09MSUNJVCkgeworICAgICAgICAgIGlmIChUVC5yZXFfaXApIHsKKyAgICAgICAgICAgIHN0cnVjdCBhZGRyaW5mbyAqcmVzID0gTlVMTDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIWdldGFkZHJpbmZvKFRULnJlcV9pcCwgTlVMTCwgTlVMTCwmcmVzKSkgeworICAgICAgICAgICAgICBkYmcoIlJlcXVlc3RpbmcgSVA6ICVzXG4iLCBUVC5yZXFfaXApOworICAgICAgICAgICAgICBtZW1jcHkgKCZUVC5pbnB1dF9zb2NrZXQ2LCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7CisgICAgICAgICAgICAgIG1lbWNweSh0KzQsIFRULmlucHV0X3NvY2tldDYuc2luNl9hZGRyLl9faW42X3UuX191Nl9hZGRyOCwgMTYpOworICAgICAgICAgICAgfSBlbHNlIHhwcmludGYoIkludmFsaWQgSVA6ICVzXG4iLFRULnJlcV9pcCk7CisgICAgICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGhjcF9kYXRhLnBmX2xmID0gbnRvaGwoKigodWludDMyX3QqKSh0KzIwKSkpOworICAgICAgICBkaGNwX2RhdGEudmFfbGYgPSBudG9obCgqKCh1aW50MzJfdCopKHQrMjQpKSk7CisgICAgICAgIGlhbmFfbGVuIC09IChjb250ZW50X2xlbiArIDQpOworICAgICAgICB0ICs9IChjb250ZW50X2xlbiArIDQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREhDUDZfT1BUX1NUQVRVU19DT0RFOgorICAgICAgICBjb250ZW50X2xlbiA9IG50b2hzKCooKHVpbnQxNl90KikodCsyKSkpOworICAgICAgICBkaGNwX2RhdGEuc3RhdHVzX2NvZGUgPSBudG9ocygqKCh1aW50MTZfdCopKHQrNCkpKTsKKyAgICAgICAgaWFuYV9sZW4gLT0gKGNvbnRlbnRfbGVuICsgNCk7CisgICAgICAgIHQgKz0gKGNvbnRlbnRfbGVuICsgNCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29udGVudF9sZW4gPSBudG9ocygqKCh1aW50MTZfdCopKHQrMikpKTsKKyAgICAgICAgaWFuYV9sZW4gLT0gKGNvbnRlbnRfbGVuICsgNCk7CisgICAgICAgIHQgKz0gKGNvbnRlbnRfbGVuICsgNCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9waWQoY2hhciAqcGF0aCkKK3sKKyAgaW50IHBpZGZpbGUgPSBvcGVuKHBhdGgsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMsIDA2NjYpOworICAKKyAgaWYgKHBpZGZpbGUgPiAwKSB7CisgICAgY2hhciBwaWRidWZbMTJdOworCisgICAgc3ByaW50ZihwaWRidWYsICIldSIsICh1bnNpZ25lZClnZXRwaWQoKSk7CisgICAgd3JpdGUocGlkZmlsZSwgcGlkYnVmLCBzdHJsZW4ocGlkYnVmKSk7CisgICAgY2xvc2UocGlkZmlsZSk7CisgIH0KK30KKworLy8gQ3JlYXRlcyBlbnZpcm9ubWVudCBwb2ludGVycyBmcm9tIFJFUyB0byB1c2UgaW4gc2NyaXB0CitzdGF0aWMgaW50IGZpbGxfZW52cChESENQX0RBVEEgKnJlcykKK3sKKyAgaW50IHJldCA9IHNldGVudigiaW50ZXJmYWNlIiwgVFQuaW50ZXJmYWNlX25hbWUsIDEpOworICAKKyAgaWYgKHJldCkgcmV0dXJuIHJldDsKKyAgaW5ldF9udG9wKEFGX0lORVQ2LCByZXMtPmlwYWRkciwgdG95YnVmLCBJTkVUNl9BRERSU1RSTEVOKTsKKyAgcmV0ID0gc2V0ZW52KCJpcCIsKGNvbnN0IGNoYXIqKXRveWJ1ZiAsIDEpOworICByZXR1cm4gcmV0OworfQorCisvLyBFeGVjdXRlcyBTY3JpcHQgTkFNRS4KK3N0YXRpYyB2b2lkIHJ1bl9zY3JpcHQoREhDUF9EQVRBICpyZXMsICBjaGFyICpuYW1lKQoreworICB2b2xhdGlsZSBpbnQgZXJyb3IgPSAwOworICBzdHJ1Y3Qgc3RhdCBzdHM7CisgIHBpZF90IHBpZDsKKyAgY2hhciAqYXJndlszXTsgIAorICBjaGFyICpzY3JpcHQgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgPyBUVC5zY3JpcHQKKyAgICA6ICIvdXNyL3NoYXJlL2RoY3AvZGVmYXVsdC5zY3JpcHQiOworCisgIGlmIChzdGF0KHNjcmlwdCwgJnN0cykgPT0gLTEgJiYgZXJybm8gPT0gRU5PRU5UKSByZXR1cm47CisgIGlmICghcmVzIHx8IGZpbGxfZW52cChyZXMpKSB7CisgICAgZGJnKCJGYWlsZWQgdG8gY3JlYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiIpOworICAgIHJldHVybjsKKyAgfQorICBkYmcoIkV4ZWN1dGluZyAlcyAlc1xuIiwgc2NyaXB0LCBuYW1lKTsKKyAgYXJndlswXSA9IChjaGFyKilzY3JpcHQ7CisgIGFyZ3ZbMV0gPSAoY2hhciopbmFtZTsKKyAgYXJndlsyXSA9IE5VTEw7CisgIGZmbHVzaChOVUxMKTsKKworICBwaWQgPSB2Zm9yaygpOworICBpZiAocGlkIDwgMCkgeworICAgIGRiZygiRm9yayBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwaWQpIHsKKyAgICBleGVjdnAoYXJndlswXSwgYXJndik7CisgICAgZXJyb3IgPSBlcnJubzsKKyAgICBfZXhpdCgxMTEpOworICB9CisgIGlmIChlcnJvcikgeworICAgIHdhaXRwaWQocGlkLCBOVUxMLCAwKTsKKyAgICBlcnJubyA9IGVycm9yOworICAgIHBlcnJvcl9tc2coInNjcmlwdCBleGVjIGZhaWxlZCIpOworICB9CisgIGRiZygic2NyaXB0IGNvbXBsZXRlLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGxlYXNlX2ZhaWwoKQoreworICBkYmcoIkxlYXNlIGZhaWxlZC5cbiIpOworICBydW5fc2NyaXB0KE5VTEwsICJsZWFzZWZhaWwiKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pIHsKKyAgICB4Y2xvc2UoVFQuc29jayk7CisgICAgeGNsb3NlKFRULnNvY2sxKTsKKyAgICBlcnJvcl9leGl0KCJMZWFzZSBGYWlsZWQsIEV4aXRpbmcuIik7CisgIH0KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpIHsKKyAgICBkYmcoIkxlYXNlIGZhaWxlZC4gR29pbmcgdG8gZGFlbW9uIG1vZGUuXG4iKTsKKyAgICBpZiAoZGFlbW9uKDAsMCkpIHBlcnJvcl9leGl0KCJkYWVtb25pemUiKTsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgd3JpdGVfcGlkKFRULnBpZGZpbGUpOworICAgIHRveXMub3B0ZmxhZ3MgJj0gfkZMQUdfYjsKKyAgICB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfZjsKKyAgfQorfQorCisvLyBHZW5lcmljIHNpZ25hbCBoYW5kbGVyIHJlYWwgaGFuZGxpbmcgaXMgZG9uZSBpbiBtYWluIGZ1bmNyaW9uLgorc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKyAgICBkYmcoIkNhdWdodCBzaWduYWw6ICVkXG4iLCBzaWcpOworICAgIHN3aXRjaCAoc2lnKSB7CisgICAgY2FzZSBTSUdVU1IxOgorICAgICAgZGJnKCJTSUdVU1IxLlxuIik7CisgICAgICBpZiAoVFQuc3RhdGUgPT0gREhDUDZSRUxFQVNFIHx8IFRULnN0YXRlID09IERIQ1A2UkVRVUVTVCApIHsKKyAgICAgICAgVFQuc3RhdGUgPSBESENQNlNPTElDSVQ7CisgICAgICAgIHNldF90aW1lb3V0KDApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBkYmcoIlNJR1VTUjEgc2VuZGluZyByZW5ldy5cbiIpOworICAgICAgc2VuZF9tc2coREhDUDZSRU5FVyk7CisgICAgICBUVC5zdGF0ZSA9IERIQ1A2UkVORVc7CisgICAgICBUVC5yZXRyaWVzID0gMDsKKyAgICAgIHNldF90aW1lb3V0KDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSUdVU1IyOgorICAgICAgZGJnKCJTSUdVU1IyLlxuIik7CisgICAgICBpZiAoVFQuc3RhdGUgPT0gREhDUDZSRUxFQVNFKSByZXR1cm47CisgICAgICBpZiAoVFQuc3RhdGUgIT0gREhDUDZDT05GSVJNICkgcmV0dXJuOworICAgICAgZGJnKCJTSUdVU1IyIHNlbmRpbmcgcmVsZWFzZS5cbiIpOworICAgICAgc2VuZF9tc2coREhDUDZSRUxFQVNFKTsKKyAgICAgIFRULnN0YXRlID0gREhDUDZSRUxFQVNFOworICAgICAgVFQucmV0cmllcyA9IDA7CisgICAgICBzZXRfdGltZW91dCgwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lHVEVSTToKKyAgICBjYXNlIFNJR0lOVDoKKyAgICAgIGRiZygoc2lnID09IFNJR1RFUk0pPyJTSUdURVJNLlxuIjoiU0lHSU5ULlxuIik7CisgICAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1IpICYmIFRULnN0YXRlID09IERIQ1A2Q09ORklSTSkKKyAgICAgICAgc2VuZF9tc2coREhDUDZSRUxFQVNFKTsKKyAgICAgIGlmKHNpZyA9PSBTSUdJTlQpIGV4aXQoMCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorfQorCisvLyBzaWduYWwgc2V0dXAgZm9yIFNJR1VTUjEgU0lHVVNSMiBTSUdURVJNCitzdGF0aWMgaW50IHNldHVwX3NpZ25hbCgpCit7CisgIHNpZ25hbChTSUdVU1IxLCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdVU1IyLCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdURVJNLCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGhjcDZfbWFpbih2b2lkKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICBzaW5hZGRyNjsKKyAgaW50IGNvbnN0b25lID0gMTsKKyAgZmRfc2V0IHJmZHM7CisgIAorICBzcmFuZCh0aW1lKE5VTEwpKTsgIAorICBzZXRsaW5lYnVmKHN0ZG91dCk7CisgIGRiZyA9IGR1bW15OworICBUVC5zdGF0ZSA9IERIQ1A2U09MSUNJVDsKKyAgCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSBkYmcgPSBsb2dpdDsKKyAgaWYgKCFUVC5pbnRlcmZhY2VfbmFtZSkgVFQuaW50ZXJmYWNlX25hbWUgPSAiZXRoMCI7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSB3cml0ZV9waWQoVFQucGlkZmlsZSk7CisgIGlmICghVFQucmV0cnkpIFRULnJldHJ5ID0gMzsKKyAgaWYgKCFUVC50aW1lb3V0KSBUVC50aW1lb3V0ID0gMzsKKyAgaWYgKCFUVC5lcnJvcnRpbWVvdXQpIFRULmVycm9ydGltZW91dCA9IDIwOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUykgeworICAgIG9wZW5sb2coIkRIQ1A2IDoiLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKyAgICBkYmcgPSBsb2dpdDsKKyAgfQorICAKKyAgZGJnKCJJbnRlcmZhY2U6ICVzXG4iLCBUVC5pbnRlcmZhY2VfbmFtZSk7CisgIGRiZygicGlkIGZpbGU6ICVzXG4iLCBUVC5waWRmaWxlKTsKKyAgZGJnKCJSZXRyeSBjb3VudDogJWRcbiIsIFRULnJldHJ5KTsKKyAgZGJnKCJUaW1lb3V0IDogJWRcbiIsIFRULnRpbWVvdXQpOworICBkYmcoIkVycm9yIHRpbWVvdXQ6ICVkXG4iLCBUVC5lcnJvcnRpbWVvdXQpOworICAKKyAgCisgIAorICBzZXR1cF9zaWduYWwoKTsKKyAgVFQuc29jazEgPSB4c29ja2V0KFBGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsgIAorICBtZW1zZXQoJnNpbmFkZHI2LCAwLCBzaXplb2Yoc2luYWRkcjYpKTsKKyAgc2luYWRkcjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgc2luYWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoREhDUENfQ0xJRU5UX1BPUlQpOworICBzaW5hZGRyNi5zaW42X3Njb3BlX2lkID0gaWZfbmFtZXRvaW5kZXgoVFQuaW50ZXJmYWNlX25hbWUpOworICBzaW5hZGRyNi5zaW42X2FkZHIgPSBpbjZhZGRyX2FueSA7CisgIAorICB4c2V0c29ja29wdChUVC5zb2NrMSwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmY29uc3RvbmUsIHNpemVvZihjb25zdG9uZSkpOworICAKKyAgaWYgKGJpbmQoVFQuc29jazEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luYWRkcjYsIHNpemVvZihzaW5hZGRyNikpKSB7CisgICAgeGNsb3NlKFRULnNvY2sxKTsKKyAgICBlcnJvcl9leGl0KCJiaW5kIGZhaWxlZCIpOworICB9CisgIAorICBtb2RlX3JhdygpOworICBzZXRfdGltZW91dCgwKTsKKyAgZm9yICg7OykgeworICAgIGludCBtYXhmZCA9IFRULnNvY2s7CisgICAgCisgICAgaWYgKFRULnNvY2sgPj0gMCkgRkRfU0VUKFRULnNvY2ssICZyZmRzKTsKKyAgICBUVC5yZXR2YWwgPSAwOyAgICAKKyAgICBpZiAoKFRULnJldHZhbCA9IHNlbGVjdChtYXhmZCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmVFQudHYpKSA8IDApIHsKKyAgICAgIGlmKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgIHBlcnJvcl9leGl0KCJFcnJvciBpbiBzZWxlY3QiKTsKKyAgICB9CisgICAgaWYgKCFUVC5yZXR2YWwpIHsKKyAgICAgIGlmIChUVC5zdGF0ZSA9PSBESENQNlNPTElDSVQgfHwgVFQuc3RhdGUgPT0gREhDUDZDT05GSVJNKSB7CisgICAgICAgIGRiZygiU3RhdGUgaXMgc29saWNpdCwgc2VuZGluZyBzb2xpY2l0IHBhY2tldFxuIik7CisgICAgICAgIHJ1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisgICAgICAgIHNlbmRfbXNnKERIQ1A2U09MSUNJVCk7CisgICAgICAgIFRULnN0YXRlID0gREhDUDZTT0xJQ0lUOworICAgICAgICBUVC5yZXRyaWVzKys7CisgICAgICAgIGlmKFRULnJldHJpZXMgPiBUVC5yZXRyeSkgc2V0X3RpbWVvdXQoVFQuZXJyb3J0aW1lb3V0KTsKKyAgICAgICAgZWxzZSBpZiAoVFQucmV0cmllcyA9PSBUVC5yZXRyeSkgeworICAgICAgICAgIGRiZygiU3RhdGUgaXMgc29saWNpdCwgcmV0cnkgY291bnQgaXMgbWF4LlxuIik7CisgICAgICAgICAgbGVhc2VfZmFpbCgpOworICAgICAgICAgIHNldF90aW1lb3V0KFRULmVycm9ydGltZW91dCk7CisgICAgICAgIH0gZWxzZSBzZXRfdGltZW91dChUVC50aW1lb3V0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKFRULnN0YXRlID09IERIQ1A2UkVRVUVTVCB8fCBUVC5zdGF0ZSA9PSBESENQNlJFTkVXIHx8IAorICAgICAgICAgICAgICBUVC5zdGF0ZSA9PSBESENQNlJFTEVBU0UpIHsKKyAgICAgICAgZGJnKCJTdGF0ZSBpcyAlZCAsIHNlbmRpbmcgcGFja2V0XG4iLCBUVC5zdGF0ZSk7CisgICAgICAgIHNlbmRfbXNnKFRULnN0YXRlKTsKKyAgICAgICAgVFQucmV0cmllcysrOworICAgICAgICBpZiAoVFQucmV0cmllcyA+IFRULnJldHJ5KSBzZXRfdGltZW91dChUVC5lcnJvcnRpbWVvdXQpOworICAgICAgICBlbHNlIGlmIChUVC5yZXRyaWVzID09IFRULnJldHJ5KSB7CisgICAgICAgICAgbGVhc2VfZmFpbCgpOworICAgICAgICAgIHNldF90aW1lb3V0KFRULmVycm9ydGltZW91dCk7CisgICAgICAgIH0gZWxzZSBzZXRfdGltZW91dChUVC50aW1lb3V0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChGRF9JU1NFVChUVC5zb2NrLCAmcmZkcykpIHsKKyAgICAgIGlmICgoVFQuc3RhdHVzID0gcmVhZChUVC5zb2NrLCB0b3lidWYsIHNpemVvZih0b3lidWYpKSkgPD0gMCkgY29udGludWU7CisgICAgICBteW1zZyA9IChkaGNwNl9yYXdfdCopdG95YnVmOworICAgICAgaWYgKG50b2hzKG15bXNnLT51ZHBoLmRlc3QpID09IDU0NiAmJiAKKyAgICAgICAgICAgICAgIW1lbWNtcChteW1zZy0+ZGhjcDYudHJhbnNhY3Rpb25faWQsIFRULnRyYW5zY3Rpb25faWQsIDMpKSB7CisgICAgICAgIGlmIChUVC5zdGF0ZSA9PSBESENQNlNPTElDSVQpIHsKKyAgICAgICAgICBpZiAobXltc2ctPmRoY3A2Lm1zZ3R5cGUgPT0gREhDUDZBRFZFUlRJU0UgKSB7CisgICAgICAgICAgICBpZiAoIXZhbGlkYXRlX2lkcygpKSB7CisgICAgICAgICAgICAgIGRiZygiSW52YWxpZCBpZCByZWNpZXZlZCwgc29saWNpdC5cbiIpOworICAgICAgICAgICAgICBUVC5zdGF0ZSA9IERIQ1A2U09MSUNJVDsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYmcoIkdvdCByZXBseSB0byByZXF1ZXN0IG9yIHNvbGljaXQuXG4iKTsKKyAgICAgICAgICAgIFRULnJldHJpZXMgPSAwOworICAgICAgICAgICAgc2V0X3RpbWVvdXQoMCk7CisgICAgICAgICAgICBUVC5yZXF1ZXN0X2xlbmd0aCA9IFRULnN0YXR1cyAtICgoY2hhciopJm15bXNnLT5kaGNwNiAtIChjaGFyKilteW1zZyk7CisgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKSZtZXNnLCAmbXltc2ctPmRoY3A2LCBUVC5yZXF1ZXN0X2xlbmd0aCk7CisgICAgICAgICAgICBwYXJzZV9pYV9uYShtZXNnLm9wdGlvbnMsIFRULnJlcXVlc3RfbGVuZ3RoKTsKKyAgICAgICAgICAgIGRiZygiU3RhdHVzIGNvZGU6JWRcbiIsIGRoY3BfZGF0YS5zdGF0dXNfY29kZSk7CisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsIGRoY3BfZGF0YS5pcGFkZHIsIHRveWJ1ZiwgSU5FVDZfQUREUlNUUkxFTik7CisgICAgICAgICAgICBkYmcoIkFkdmVydGllc2VkIElQOiAlc1xuIiwgdG95YnVmKTsKKyAgICAgICAgICAgIFRULnN0YXRlID0gREhDUDZSRVFVRVNUOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYmcoIkludmFsaWQgc29saWNpdC5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKFRULnN0YXRlID09IERIQ1A2UkVRVUVTVCB8fCBUVC5zdGF0ZSA9PSBESENQNlJFTkVXICkgeworICAgICAgICAgIGlmIChteW1zZy0+ZGhjcDYubXNndHlwZSA9PSBESENQNlJFUExZKSB7CisgICAgICAgICAgICBpZiAoIXZhbGlkYXRlX2lkcygpKSB7CisgICAgICAgICAgICAgIGRiZygiSW52YWxpZCBpZCByZWNpZXZlZCwgJWQuXG4iLCBUVC5zdGF0ZSk7CisgICAgICAgICAgICAgIFRULnN0YXRlID0gREhDUDZSRVFVRVNUOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRiZygiR290IHJlcGx5IHRvIHJlcXVlc3Qgb3IgcmVuZXcuXG4iKTsKKyAgICAgICAgICAgIFRULnJlcXVlc3RfbGVuZ3RoID0gVFQuc3RhdHVzIC0gKChjaGFyKikmbXltc2ctPmRoY3A2IC0gKGNoYXIqKW15bXNnKTsKKyAgICAgICAgICAgIG1lbWNweSgodWludDhfdCopJm1lc2csICZteW1zZy0+ZGhjcDYsIFRULnJlcXVlc3RfbGVuZ3RoKTsKKyAgICAgICAgICAgIHBhcnNlX2lhX25hKG15bXNnLT5kaGNwNi5vcHRpb25zLCBUVC5yZXF1ZXN0X2xlbmd0aCk7CisgICAgICAgICAgICBkYmcoIlN0YXR1cyBjb2RlOiVkXG4iLCBkaGNwX2RhdGEuc3RhdHVzX2NvZGUpOworICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCBkaGNwX2RhdGEuaXBhZGRyLCB0b3lidWYsIElORVQ2X0FERFJTVFJMRU4pOworICAgICAgICAgICAgZGJnKCJHb3QgSVA6ICVzXG4iLCB0b3lidWYpOworICAgICAgICAgICAgVFQucmV0cmllcyA9IDA7CisgICAgICAgICAgICBydW5fc2NyaXB0KCZkaGNwX2RhdGEsIChUVC5zdGF0ZSA9PSBESENQNlJFUVVFU1QpID8KKyAgICAgICAgICAgICAgInJlcXVlc3QiIDogInJlbmV3Iik7CisgICAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcSkgeworICAgICAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUikgc2VuZF9tc2coREhDUDZSRUxFQVNFKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVC5zdGF0ZSA9IERIQ1A2Q09ORklSTTsKKyAgICAgICAgICAgIHNldF90aW1lb3V0KChkaGNwX2RhdGEudmFfbGYpP2RoY3BfZGF0YS52YV9sZjpJTlRfTUFYKTsKKyAgICAgICAgICAgIGRiZygiU2V0dGluZyB0aW1lb3V0IHRvIGludG1heC4iKTsKKyAgICAgICAgICAgIGlmIChUVC5zdGF0ZSA9PSBESENQNlJFUVVFU1QgfHwgISh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSkgeworICAgICAgICAgICAgICBkYmcoIk1ha2luZyBpdCBhIGRhZW1vblxuIik7CisgICAgICAgICAgICAgIGlmIChkYWVtb24oMCwwKSkgcGVycm9yX2V4aXQoImRhZW1vbml6ZSIpOworICAgICAgICAgICAgICB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfZjsKKyAgICAgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIHdyaXRlX3BpZChUVC5waWRmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRiZygiTWFraW5nIGl0IGEgZm9yZWdyb3VuZC5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRiZygiSW52YWxpZCByZXBseS5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIGlmIChUVC5zdGF0ZSA9PSBESENQNlJFTEVBU0UpIHsKKyAgICAgICAgICBkYmcoIkdvdCByZXBseSB0byByZWxlYXNlLlxuIik7CisgICAgICAgICAgcnVuX3NjcmlwdChOVUxMLCAicmVsZWFzZSIpOworICAgICAgICAgIHNldF90aW1lb3V0KElOVF9NQVgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IAorICB4Y2xvc2UoVFQuc29jazEpOworICB4Y2xvc2UoVFQuc29jayk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2RoY3BkLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2RoY3BkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNDMxNgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvZGhjcGQuYwpAQCAtMCwwICsxLDIwNzQgQEAKKy8qIGRoY3BkLmMgLSBESENQIHNlcnZlciBmb3IgZHluYW1pYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTMgTWFkaHVyIFZlcm1hIDxtYWQuZmxleGlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnYW1pbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxNSBZZW9uZ2Rlb2sgU3VoIDxza3lkdWNrczExMUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQKK1VTRV9ESENQRChORVdUT1koZGhjcGQsICI+MVAjPDA+NjU1MzVmaTpTNDZbITQ2XSIsIFRPWUZMQUdfU0JJTnxUT1lGTEFHX1JPT1RPTkxZKSkKKworY29uZmlnIERIQ1BECisgIGJvb2wgImRoY3BkIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgdXNhZ2U6IGRoY3BkIFstNDZmU10gWy1pIElGQUNFXSBbLVAgTl0gW0NPTkZGSUxFXQorCisgICAgLWYgICAgUnVuIGluIGZvcmVncm91bmQKKyAgICAtaSBJbnRlcmZhY2UgdG8gdXNlCisgICAgLVMgICAgTG9nIHRvIHN5c2xvZyB0b28KKyAgICAtUCBOICBVc2UgcG9ydCBOIChkZWZhdWx0IGlwdjQgNjcsIGlwdjYgNTQ3KQorICAgIC00LCAtNiAgICBSdW4gYXMgYSBESENQdjQgb3IgREhDUHY2IHNlcnZlcgorCitjb25maWcgREVCVUdfREhDUAorICBib29sICJkZWJ1Z2dpbmcgbWVzc2VnZXMgT04vT0ZGIgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBESENQRAorKi8KKworLyoKKyAqIFRPRE8KKyAqIC0gV29ya2luZyBhcyBhbiByZWxheSBhZ2VudAorICogLSBSYXBpZCBjb21taXQgb3B0aW9uIHN1cHBvcnQKKyAqIC0gQWRkaXRpb25hbCBwYWNrZXQgb3B0aW9ucyAoY29tbWVudGVkIG9uIHRoZSBtaWRkbGUgb2Ygc291cmNlcykKKyAqIC0gQ3JlYXRlIGNvbW1vbiBtb2R1bGVzCisgKi8KKworI2RlZmluZSBGT1JfZGhjcGQKKworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+IAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKy8vIFRvZG86IGhlYWRlcnMgbm90IGluIHBvc2l4CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisKKyNpZiBDRkdfREVCVUdfREhDUD09MQorIyBkZWZpbmUgZGJnKGZtdCwgYXJnLi4uKSAgIHByaW50ZihmbXQsICMjYXJnKQorI2Vsc2UKKyMgZGVmaW5lIGRiZyhmbXQsIGFyZy4uLikKKyNlbmRpZgorCisjZGVmaW5lIExPR19TSUxFTlQgICAgICAgICAgMHgwCisjZGVmaW5lIExPR19DT05TT0xFICAgICAgICAgMHgxCisjZGVmaW5lIExPR19TWVNURU0gICAgICAgICAgMHgyCisKKyNkZWZpbmUgREhDUF9NQUdJQyAgICAgICAgICAweDYzODI1MzYzCisKKyNkZWZpbmUgREhDUERJU0NPVkVSICAgICAgICAxCisjZGVmaW5lIERIQ1BPRkZFUiAgICAgICAgICAgMgorI2RlZmluZSBESENQUkVRVUVTVCAgICAgICAgIDMKKyNkZWZpbmUgREhDUERFQ0xJTkUgICAgICAgICA0CisjZGVmaW5lIERIQ1BBQ0sgICAgICAgICAgICAgNQorI2RlZmluZSBESENQTkFLICAgICAgICAgICAgIDYKKyNkZWZpbmUgREhDUFJFTEVBU0UgICAgICAgICA3CisjZGVmaW5lIERIQ1BJTkZPUk0gICAgICAgICAgOAorCisjZGVmaW5lIERIQ1A2U09MSUNJVCAgICAgICAgMQorI2RlZmluZSBESENQNkFEVkVSVElTRSAgICAgIDIgICAvLyBzZXJ2ZXIgLT4gY2xpZW50CisjZGVmaW5lIERIQ1A2UkVRVUVTVCAgICAgICAgMworI2RlZmluZSBESENQNkNPTkZJUk0gICAgICAgIDQKKyNkZWZpbmUgREhDUDZSRU5FVyAgICAgICAgICA1CisjZGVmaW5lIERIQ1A2UkVCSU5EICAgICAgICAgNgorI2RlZmluZSBESENQNlJFUExZICAgICAgICAgIDcgICAvLyBzZXJ2ZXIgLT4gY2xpZW50CisjZGVmaW5lIERIQ1A2UkVMRUFTRSAgICAgICAgOAorI2RlZmluZSBESENQNkRFQ0xJTkUgICAgICAgIDkKKyNkZWZpbmUgREhDUDZSRUNPTkZJR1VSRSAgICAxMCAgLy8gc2VydmVyIC0+IGNsaWVudAorI2RlZmluZSBESENQNklORk9SRVFVRVNUICAgIDExCisjZGVmaW5lIERIQ1A2UkVMQVlGTE9XICAgICAgMTIgIC8vIHJlbGF5IC0+IHJlbGF5L3NlcnZlcgorI2RlZmluZSBESENQNlJFTEFZUkVQTFkgICAgIDEzICAvLyBzZXJ2ZXIvcmVsYXkgLT4gcmVsYXkKKworI2RlZmluZSBESENQX05VTTggICAgICAgICAgICgxPDw4KQorI2RlZmluZSBESENQX05VTTE2ICAgICAgICAgICgxPDw5KQorI2RlZmluZSBESENQX05VTTMyICAgICAgICAgIERIQ1BfTlVNMTYgfCBESENQX05VTTgKKyNkZWZpbmUgREhDUF9TVFJJTkcgICAgICAgICAoMTw8MTApCisjZGVmaW5lIERIQ1BfU1RSTFNUICAgICAgICAgKDE8PDExKQorI2RlZmluZSBESENQX0lQICAgICAgICAgICAgICgxPDwxMikKKyNkZWZpbmUgREhDUF9JUExJU1QgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIERIQ1BfSVBQTFNUICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBESENQX1NUQ1JUUyAgICAgICAgICgxPDwxNSkKKworLy8gREhDUCBvcHRpb24gY29kZXMgKHBhcnRpYWwgbGlzdCkuIFNlZSBSRkMgMjEzMiBhbmQKKyNkZWZpbmUgREhDUF9PUFRfUEFERElORyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBESENQX09QVF9IT1NUX05BTUUgICAgICAgICAgREhDUF9TVFJJTkcgfCAweDBjIC8vIGVpdGhlciBjbGllbnQgaW5mb3JtcyBzZXJ2ZXIgb3Igc2VydmVyIGdpdmVzIG5hbWUgdG8gY2xpZW50CisjZGVmaW5lIERIQ1BfT1BUX1JFUVVFU1RFRF9JUCAgICAgICBESENQX0lQICAgICB8IDB4MzIgLy8gc2VudCBieSBjbGllbnQgaWYgc3BlY2lmaWMgSVAgaXMgd2FudGVkCisjZGVmaW5lIERIQ1BfT1BUX0xFQVNFX1RJTUUgICAgICAgICBESENQX05VTTMyICB8IDB4MzMKKyNkZWZpbmUgREhDUF9PUFRfT1BUSU9OX09WRVJMT0FEICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBESENQX09QVF9NRVNTQUdFX1RZUEUgICAgICAgREhDUF9OVU04ICAgfCAweDM1CisjZGVmaW5lIERIQ1BfT1BUX1NFUlZFUl9JRCAgICAgICAgICBESENQX0lQICAgICB8IDB4MzYgLy8gYnkgZGVmYXVsdCBzZXJ2ZXIncyBJUAorI2RlZmluZSBESENQX09QVF9QQVJBTV9SRVEgICAgICAgICAgREhDUF9TVFJJTkcgfCAweDM3IC8vIGxpc3Qgb2Ygb3B0aW9ucyBjbGllbnQgd2FudHMKKyNkZWZpbmUgREhDUF9PUFRfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZgorCisvLyBESENQdjYgb3B0aW9uIGNvZGVzIChwYXJ0aWFsKS4gU2VlIFJGQyAzMzE1CisjZGVmaW5lIERIQ1A2X09QVF9DTElFTlRJRCAgICAgIDEKKyNkZWZpbmUgREhDUDZfT1BUX1NFUlZFUklEICAgICAgMgorI2RlZmluZSBESENQNl9PUFRfSUFfTkEgICAgICAgICAzCisjZGVmaW5lIERIQ1A2X09QVF9JQV9BRERSICAgICAgIDUKKyNkZWZpbmUgREhDUDZfT1BUX09STyAgICAgICAgICAgNgorI2RlZmluZSBESENQNl9PUFRfUFJFRkVSRU5DRSAgICA3CisjZGVmaW5lIERIQ1A2X09QVF9FTEFQU0VEX1RJTUUgIDgKKyNkZWZpbmUgREhDUDZfT1BUX1JFTEFZX01TRyAgICAgOQorI2RlZmluZSBESENQNl9PUFRfU1RBVFVTX0NPREUgICAxMworI2RlZmluZSBESENQNl9PUFRfSUFfUEQgICAgICAgICAyNQorI2RlZmluZSBESENQNl9PUFRfSUFfUFJFRklYICAgICAyNgorCisjZGVmaW5lIERIQ1A2X1NUQVRVU19TVUNDRVNTICAgICAgICAwCisjZGVmaW5lIERIQ1A2X1NUQVRVU19OT0FERFJTQVZBSUwgICAyCisKKyNkZWZpbmUgREhDUDZfRFVJRF9MTFQgICAgMQorI2RlZmluZSBESENQNl9EVUlEX0VOICAgICAyCisjZGVmaW5lIERIQ1A2X0RVSURfTEwgICAgIDMKKyNkZWZpbmUgREhDUDZfRFVJRF9VVUlEICAgNAorCitHTE9CQUxTKAorICAgIGNoYXIgKmlmYWNlOworICAgIGxvbmcgcG9ydDsKKyk7CisKK3N0cnVjdCBjb25maWdfa2V5d29yZCB7CisgIGNoYXIgKmtleXdvcmQ7CisgIGludCAoKmhhbmRsZXIpKGNvbnN0IGNoYXIgKnN0ciwgdm9pZCAqdmFyKTsKKyAgdm9pZCAqdmFyOworICBjaGFyICpkZWY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBkaGNwX21zZ19zIHsKKyAgdWludDhfdCBvcDsKKyAgdWludDhfdCBodHlwZTsKKyAgdWludDhfdCBobGVuOworICB1aW50OF90IGhvcHM7CisgIHVpbnQzMl90IHhpZDsKKyAgdWludDE2X3Qgc2VjczsKKyAgdWludDE2X3QgZmxhZ3M7CisgIHVpbnQzMl90IGNpYWRkcjsKKyAgdWludDMyX3QgeWlhZGRyOworICB1aW50MzJfdCBuc2lhZGRyOworICB1aW50MzJfdCBuZ2lhZGRyOworICB1aW50OF90IGNoYWRkclsxNl07CisgIHVpbnQ4X3Qgc25hbWVbNjRdOworICB1aW50OF90IGZpbGVbMTI4XTsKKyAgdWludDMyX3QgY29va2llOworICB1aW50OF90IG9wdGlvbnNbMzA4XTsKK30gZGhjcF9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGhjcDZfbXNnX3MgeworICB1aW50OF90IG1zZ3R5cGU7CisgIHVpbnQ4X3QgdHJhbnNhY3Rpb25faWRbM107CisgIHVpbnQ4X3Qgb3B0aW9uc1s1MjRdOworfSBkaGNwNl9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGhjcF9yYXdfcyB7CisgIHN0cnVjdCBpcGhkciBpcGg7CisgIHN0cnVjdCB1ZHBoZHIgdWRwaDsKKyAgZGhjcF9tc2dfdCBkaGNwOworfSBkaGNwX3Jhd190OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBkaGNwNl9yYXdfcyB7CisgIHN0cnVjdCBpcDZfaGRyIGlwaDsKKyAgc3RydWN0IHVkcGhkciB1ZHBoOworICBkaGNwNl9tc2dfdCBkaGNwNjsKK30gZGhjcDZfcmF3X3Q7CisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY19sZWFzZV9zIHsKKyAgc3RydWN0IHN0YXRpY19sZWFzZV9zICpuZXh0OworICB1aW50MzJfdCBuaXA7CisgIGludCBtYWNbNl07Cit9IHN0YXRpY19sZWFzZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGljX2xlYXNlNl9zIHsKKyAgc3RydWN0IHN0YXRpY19sZWFzZTZfcyAqbmV4dDsKKyAgdWludDE2X3QgZHVpZF9sZW47CisgIHVpbnQxNl90IGlhX3R5cGU7CisgIHVpbnQzMl90IGlhaWQ7CisgIHVpbnQ4X3QgbmlwNlsxNl07CisgIHVpbnQ4X3QgZHVpZFsyMF07Cit9IHN0YXRpY19sZWFzZTY7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgZXhwaXJlczsKKyAgdWludDMyX3QgbGVhc2VfbmlwOworICB1aW50OF90IGxlYXNlX21hY1s2XTsKKyAgY2hhciBob3N0bmFtZVsyMF07CisgIHVpbnQ4X3QgcGFkWzJdOworfSBkeW5fbGVhc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDE2X3QgZHVpZF9sZW47CisgIHVpbnQxNl90IGlhX3R5cGU7CisgIHVpbnQzMl90IGV4cGlyZXM7CisgIHVpbnQzMl90IGlhaWQ7CisgIHVpbnQ4X3QgbGVhc2VfbmlwNlsxNl07CisgIHVpbnQ4X3QgZHVpZFsyMF07Cit9IGR5bl9sZWFzZTY7CisKK3R5cGVkZWYgc3RydWN0IG9wdGlvbl92YWxfcyB7CisgIGNoYXIgKmtleTsKKyAgdWludDE2X3QgY29kZTsKKyAgdm9pZCAqdmFsOworICBzaXplX3QgbGVuOworfSBvcHRpb25fdmFsX3Q7CisKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBvcHR2YWxfZHVpZF9sbHQgeworICB1aW50MTZfdCB0eXBlOworICB1aW50MTZfdCBod3R5cGU7CisgIHVpbnQzMl90IHRpbWU7CisgIHVpbnQ4X3QgbGxhZGRyW107ICAgLy9mbGV4aWJsZQorfTsKKworc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG9wdHZhbF9pYV9uYSB7CisgIHVpbnQzMl90IGlhaWQ7CisgIHVpbnQzMl90IHQxLCB0MjsKKyAgdWludDhfdCBvcHR2YWxbXTsgICAvL2ZsZXhpYmxlCit9Oworc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG9wdHZhbF9pYV9hZGRyIHsKKyAgdWludDhfdCBpcHY2X2FkZHJbMTZdOworICB1aW50MzJfdCBwcmVmX2xpZmV0aW1lOworICB1aW50MzJfdCB2YWxpZF9saWZldGltZTsKK307CitzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgb3B0dmFsX3N0YXR1c19jb2RlIHsKKyAgdWludDE2X3Qgc3RhdHVzX2NvZGU7CisgIHVpbnQ4X3Qgc3RhdHVzX21zZ1tdOyAvL2ZsZXhpYmxlCit9OworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkgc2VydmVyX2NvbmZpZ19zIHsKKyAgY2hhciAqaW50ZXJmYWNlOyAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UgdG8gdXNlCisgIGludCBpZmluZGV4OworICB1aW50OF90IHNlcnZlcl9uaXA2WzE2XTsKKyAgdWludDMyX3Qgc2VydmVyX25pcDsKKyAgdWludDMyX3QgcG9ydDsKKyAgdWludDhfdCBzZXJ2ZXJfbWFjWzZdOyAgICAgICAgICAvLyBvdXIgTUFDIGFkZHJlc3MgKHVzZWQgb25seSBmb3IgQVJQIHByb2JpbmcpCisgIHZvaWQgKm9wdGlvbnNbMjU2XTsgICAgICAgICAgICAgLy8gbGlzdCBvZiBESENQIG9wdGlvbnMgbG9hZGVkIGZyb20gdGhlIGNvbmZpZyBmaWxlCisgIC8qIHN0YXJ0LGVuZCBhcmUgaW4gaG9zdCBvcmRlcjogd2UgbmVlZCB0byBjb21wYXJlIHN0YXJ0IDw9IGlwIDw9IGVuZCovCisgIHVpbnQzMl90IHN0YXJ0X2lwOyAgICAgICAgICAgICAgLy8gc3RhcnQgYWRkcmVzcyBvZiBsZWFzZXMsIGluIGhvc3Qgb3JkZXIKKyAgdWludDMyX3QgZW5kX2lwOyAgICAgICAgICAgICAgICAvLyBlbmQgb2YgbGVhc2VzLCBpbiBob3N0IG9yZGVyCisgIHVpbnQ4X3Qgc3RhcnRfaXA2WzE2XTsgICAgICAgICAgLy8gc3RhcnQgYWRkcmVzcyBvZiBsZWFzZXMsIGluIElQdjYgbW9kZQorICB1aW50OF90IGVuZF9pcDZbMTZdOyAgICAgICAgICAgIC8vIGVuZCBvZiBsZWFzZXMsIGluIElQdjYgbW9kZQorICB1aW50MzJfdCBtYXhfbGVhc2Vfc2VjOyAgICAgICAgIC8vIG1heGltdW0gbGVhc2UgdGltZSAoaG9zdCBvcmRlcikKKyAgdWludDMyX3QgbWluX2xlYXNlX3NlYzsgICAgICAgICAvLyBtaW5pbXVtIGxlYXNlIHRpbWUgYSBjbGllbnQgY2FuIHJlcXVlc3QKKyAgdWludDMyX3QgbWF4X2xlYXNlczsgICAgICAgICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsZWFzZXMgKGluY2x1ZGluZyByZXNlcnZlZCBhZGRyZXNzZXMpCisgIHVpbnQzMl90IGF1dG9fdGltZTsgICAgICAgICAgICAgLy8gaG93IGxvbmcgc2hvdWxkIGRoY3BkIHdhaXQgYmVmb3JlIHdyaXRpbmcgYSBjb25maWcgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHplcm8sIGl0IHdpbGwgb25seSB3cml0ZSBvbmUgb24gU0lHVVNSMQorICB1aW50MzJfdCBkZWNsaW5lX3RpbWU7ICAgICAgICAgIC8vIGhvdyBsb25nIGFuIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgaWYgYSBjbGllbnQgcmV0dXJucyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGluZSBtZXNzYWdlCisgIHVpbnQzMl90IGNvbmZsaWN0X3RpbWU7ICAgICAgICAgLy8gaG93IGxvbmcgYW4gYXJwIGNvbmZsaWN0IG9mZmVuZGVyIGlzIGxlYXNlZCBmb3IKKyAgdWludDMyX3Qgb2ZmZXJfdGltZTsgICAgICAgICAgICAvLyBob3cgbG9uZyBhbiBvZmZlcmVkIGFkZHJlc3MgaXMgcmVzZXJ2ZWQKKyAgdWludDMyX3Qgc2lhZGRyX25pcDsgICAgICAgICAgICAvLyAibmV4dCBzZXJ2ZXIiIGJvb3RwIG9wdGlvbgorICBjaGFyICpsZWFzZV9maWxlOworICBjaGFyICpsZWFzZTZfZmlsZTsKKyAgY2hhciAqcGlkZmlsZTsKKyAgY2hhciAqbm90aWZ5X2ZpbGU7ICAgICAgICAgICAgICAvLyB3aGF0IHRvIHJ1biB3aGVuZXZlciBsZWFzZXMgYXJlIHdyaXR0ZW4KKyAgY2hhciAqc25hbWU7ICAgICAgICAgICAgICAgICAgICAvLyBib290cCBzZXJ2ZXIgbmFtZQorICBjaGFyICpib290X2ZpbGU7ICAgICAgICAgICAgICAgIC8vIGJvb3RwIGJvb3QgZmlsZSBvcHRpb24KKyAgdWludDMyX3QgcHJlZl9saWZldGltZTsKKyAgdWludDMyX3QgdmFsaWRfbGlmZXRpbWU7CisgIHVpbnQzMl90IHQxLHQyOworICBzdHJ1Y3Qgc3RhdGljX2xlYXNlICpzdGF0aWNfbGVhc2VzOyAvLyBMaXN0IG9mIGlwL21hYyBwYWlycyB0byBhc3NpZ24gc3RhdGljIGxlYXNlcworfSBzZXJ2ZXJfY29uZmlnX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKSBzZXJ2ZXJfc3RhdGVfcyB7CisgIHVpbnQ4X3QgY2xpZW50X25pcDZbMTZdOworICB1aW50MzJfdCBjbGllbnRfcG9ydDsKKyAgdWludDhfdCBycWNvZGU7CisgIGludCBsaXN0ZW5zb2NrOworICB1bmlvbiB7CisgICAgZGhjcF9tc2dfdCByY3ZkX3BrdDsKKyAgICBkaGNwNl9tc2dfdCByY3ZkX3BrdDY7CisgIH0gcmN2ZDsKKyAgdWludDhfdCogcnFvcHQ7CisgIHVuaW9uIHsKKyAgICBkaGNwX21zZ190IHNlbmRfcGt0OworICAgIGRoY3A2X21zZ190IHNlbmRfcGt0NjsKKyAgfSBzZW5kOworICB1bmlvbiB7CisgICAgc3RhdGljX2xlYXNlICpzbGVhc2VzOworICAgIHN0YXRpY19sZWFzZTYgKnNsZWFzZXM2OworICB9IGxlYXNlczsKKyAgc3RydWN0IGFyZ19saXN0ICpkbGVhc2VzOworfSBzZXJ2ZXJfc3RhdGVfdDsKKworc3RhdGljIG9wdGlvbl92YWxfdCBvcHRpb25zX2xpc3RbXSA9IHsKKyAgICB7ImxlYXNlIiAgICAgICAgICAsIERIQ1BfTlVNMzIgIHwgMHgzMywgTlVMTCwgMH0sCisgICAgeyJzdWJuZXQiICAgICAgICAgLCBESENQX0lQICAgICB8IDB4MDEsIE5VTEwsIDB9LAorICAgIHsiYnJvYWRjYXN0IiAgICAgICwgREhDUF9JUCAgICAgfCAweDFjLCBOVUxMLCAwfSwKKyAgICB7InJvdXRlciIgICAgICAgICAsIERIQ1BfSVAgICAgIHwgMHgwMywgTlVMTCwgMH0sCisgICAgeyJpcHR0bCIgICAgICAgICAgLCBESENQX05VTTggICB8IDB4MTcsIE5VTEwsIDB9LAorICAgIHsibXR1IiAgICAgICAgICAgICwgREhDUF9OVU0xNiAgfCAweDFhLCBOVUxMLCAwfSwKKyAgICB7Imhvc3RuYW1lIiAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHgwYywgTlVMTCwgMH0sCisgICAgeyJkb21haW4iICAgICAgICAgLCBESENQX1NUUklORyB8IDB4MGYsIE5VTEwsIDB9LAorICAgIHsic2VhcmNoIiAgICAgICAgICwgREhDUF9TVFJMU1QgfCAweDc3LCBOVUxMLCAwfSwKKyAgICB7Im5pc2RvbWFpbiIgICAgICAsIERIQ1BfU1RSSU5HIHwgMHgyOCwgTlVMTCwgMH0sCisgICAgeyJ0aW1lem9uZSIgICAgICAgLCBESENQX05VTTMyICB8IDB4MDIsIE5VTEwsIDB9LAorICAgIHsidGZ0cCIgICAgICAgICAgICwgREhDUF9TVFJJTkcgfCAweDQyLCBOVUxMLCAwfSwKKyAgICB7ImJvb3RmaWxlIiAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHg0MywgTlVMTCwgMH0sCisgICAgeyJib290c2l6ZSIgICAgICAgLCBESENQX05VTTE2ICB8IDB4MGQsIE5VTEwsIDB9LAorICAgIHsicm9vdHBhdGgiICAgICAgICwgREhDUF9TVFJJTkcgfCAweDExLCBOVUxMLCAwfSwKKyAgICB7IndwYWQiICAgICAgICAgICAsIERIQ1BfU1RSSU5HIHwgMHhmYywgTlVMTCwgMH0sCisgICAgeyJzZXJ2ZXJpZCIgICAgICAgLCBESENQX0lQICAgICB8IDB4MzYsIE5VTEwsIDB9LAorICAgIHsibWVzc2FnZSIgICAgICAgICwgREhDUF9TVFJJTkcgfCAweDM4LCBOVUxMLCAwfSwKKyAgICB7InZsYW5pZCIgICAgICAgICAsIERIQ1BfTlVNMzIgIHwgMHg4NCwgTlVMTCwgMH0sCisgICAgeyJ2bGFucHJpb3JpdHkiICAgLCBESENQX05VTTMyICB8IDB4ODUsIE5VTEwsIDB9LAorICAgIHsiZG5zIiAgICAgICAgICAgICwgREhDUF9JUExJU1QgfCAweDA2LCBOVUxMLCAwfSwKKyAgICB7IndpbnMiICAgICAgICAgICAsIERIQ1BfSVBMSVNUIHwgMHgyYywgTlVMTCwgMH0sCisgICAgeyJuaXNzcnYiICAgICAgICAgLCBESENQX0lQTElTVCB8IDB4MjksIE5VTEwsIDB9LAorICAgIHsibnRwc3J2IiAgICAgICAgICwgREhDUF9JUExJU1QgfCAweDJhLCBOVUxMLCAwfSwKKyAgICB7ImxwcnNydiIgICAgICAgICAsIERIQ1BfSVBMSVNUIHwgMHgwOSwgTlVMTCwgMH0sCisgICAgeyJzd2Fwc3J2IiAgICAgICAgLCBESENQX0lQICAgICB8IDB4MTAsIE5VTEwsIDB9LAorICAgIHsicm91dGVzIiAgICAgICAgICwgREhDUF9TVENSVFMgfCAweDIxLCBOVUxMLCAwfSwKKyAgICB7InN0YXRpY3JvdXRlcyIgICAsIERIQ1BfU1RDUlRTIHwgMHg3OSwgTlVMTCwgMH0sCisgICAgeyJtc3N0YXRpY3JvdXRlcyIgLCBESENQX1NUQ1JUUyB8IDB4ZjksIE5VTEwsIDB9LAorfTsKKworc3RydWN0IGZkX3BhaXIgeyBpbnQgcmQ7IGludCB3cjsgfTsKK3N0YXRpYyBzZXJ2ZXJfY29uZmlnX3QgZ2NvbmZpZzsKK3N0YXRpYyBzZXJ2ZXJfc3RhdGVfdCBnc3RhdGU7CitzdGF0aWMgdWludDhfdCBpbmZvbW9kZTsKK3N0YXRpYyBzdHJ1Y3QgZmRfcGFpciBzaWdmZDsKK3N0YXRpYyBpbnQgY29uc3RvbmUgPSAxOworc3RhdGljIHNhX2ZhbWlseV90IGFkZHJfdmVyc2lvbiA9IEFGX0lORVQ7CisKKy8vIGNhbGN1bGF0ZSBvcHRpb25zIHNpemUuCitzdGF0aWMgaW50IGRoY3Bfb3B0X3NpemUodWludDhfdCAqb3B0aW9ucHRyKQoreworICBpbnQgaSA9IDA7CisgIGZvcig7b3B0aW9ucHRyW2ldICE9IDB4ZmY7IGkrKykKKyAgICBpZihvcHRpb25wdHJbaV0gIT0gMHgwMCkgaSArPSBvcHRpb25wdHJbaSArIDFdICsgMiAtMTsKKyAgcmV0dXJuIGk7Cit9CisKKy8vIGNhbGN1bGF0ZXMgY2hlY2tzdW0gZm9yIGRoY3AgbWVzc2VnZXMuCitzdGF0aWMgdWludDE2X3QgZGhjcF9jaGVja3N1bSh2b2lkICphZGRyLCBpbnQgY291bnQpCit7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgdWludDE2X3QgdG1wID0gMCwgKnNvdXJjZSA9ICh1aW50MTZfdCAqKWFkZHI7CisKKyAgd2hpbGUgKGNvdW50ID4gMSkgIHsKKyAgICBzdW0gKz0gKnNvdXJjZSsrOworICAgIGNvdW50IC09IDI7CisgIH0KKyAgaWYgKGNvdW50ID4gMCkgeworICAgICoodWludDhfdCopJnRtcCA9ICoodWludDhfdCopc291cmNlOworICAgIHN1bSArPSB0bXA7CisgIH0KKyAgd2hpbGUgKHN1bSA+PiAxNikgc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKKyAgcmV0dXJuIH5zdW07Cit9CisKKy8vIGdldHMgaW5mb3JtYXRpb24gb2YgSU5URVJGQUNFIGFuZCB1cGRhdGVzIElGSU5ERVgsIE1BQyBhbmQgSVAKK3N0YXRpYyBpbnQgZ2V0X2ludGVyZmFjZShjb25zdCBjaGFyICppbnRlcmZhY2UsIGludCAqaWZpbmRleCwgdm9pZCAqb2lwLAorICAgIHVpbnQ4X3QgKm1hYykKK3sKKyAgc3RydWN0IGlmcmVxIHJlcTsKKyAgc3RydWN0IHNvY2thZGRyX2luICppcDsKKyAgc3RydWN0IHNvY2thZGRyX2luNiBpcDY7CisgIGludCBmZCA9IHhzb2NrZXQoYWRkcl92ZXJzaW9uLCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworICBjaGFyIGlwdjZfYWRkcls0MF0gPSB7MCx9OworCisgIHJlcS5pZnJfYWRkci5zYV9mYW1pbHkgPSBhZGRyX3ZlcnNpb247CisgIHhzdHJuY3B5KHJlcS5pZnJfbmFtZSwgKGNoYXIgKilpbnRlcmZhY2UsIElGTkFNU0laKTsKKworICB4aW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgJnJlcSk7CisKKyAgaWYgKCEocmVxLmlmcl9mbGFncyAmIElGRl9VUCkpIHJldHVybiAtMTsKKworICBpZiAoYWRkcl92ZXJzaW9uID09IEFGX0lORVQ2KSB7CisKKyAgICBGSUxFICpmZDYgPSBmb3BlbigiL3Byb2MvbmV0L2lmX2luZXQ2IiwgInIiKTsKKyAgICB1aW50OF90ICpvaXA2ID0gKHVpbnQ4X3QqKW9pcDsKKyAgICBpbnQgaTsKKworICAgIHdoaWxlKGZnZXRzKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIGZkNikpIHsKKyAgICAgIGlmICghc3Ryc3RyKHRveWJ1ZiwgaW50ZXJmYWNlKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChzc2NhbmYodG95YnVmLCAiJTMycyBcbiIsIGlwdjZfYWRkcikgPT0gMSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGZjbG9zZShmZDYpOworCisgICAgaWYgKG9pcDYpIHsKKyAgICAgIGNoYXIgKnB0ciA9IGlwdjZfYWRkcitzaXplb2YoaXB2Nl9hZGRyKS0xOworCisgICAgICAvLyBjb252ZXJ0IGdpYW50IGhleCBzdHJpbmcgaW50byBjb2xvbi1zcGVhcmF0ZWQgaXB2NiBhZGRyZXNzIGJ5CisgICAgICAvLyBpbnNlcnRpbmcgJzonIGV2ZXJ5IDQgY2hhcmFjdGVycy4KKyAgICAgIGZvciAoaSA9IDMyOyBpOyBpLS0pCisgICAgICAgIGlmICgoKihwdHItLSkgPSBpcHY2X2FkZHJbaV0pKSBpZiAoIShpJjMpKSAqKHB0ci0tKSA9ICc6JzsKKworICAgICAgZGJnKCJpcHY2ICVzXG4iLCBpcHY2X2FkZHIpOworICAgICAgaWYoaW5ldF9wdG9uKEFGX0lORVQ2LCBpcHY2X2FkZHIsICZpcDYuc2luNl9hZGRyKSA8PSAwKQorICAgICAgICBlcnJvcl9tc2coImluZXQgOiB0aGUgaXB2NiBhZGRyZXNzIGlzIG5vdCBwcm9wZXIiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWVtY3B5KG9pcDYsIGlwNi5zaW42X2FkZHIuczZfYWRkcjMyLCBzaXplb2YodWludDMyX3QpKjQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCAqb2lwNCA9ICh1aW50MzJfdCopb2lwOworICAgIGlmIChvaXA0KSB7CisgICAgICB4aW9jdGwoZmQsIFNJT0NHSUZBRERSLCAmcmVxKTsKKyAgICAgIGlwID0gKHN0cnVjdCBzb2NrYWRkcl9pbiopICZyZXEuaWZyX2FkZHI7CisgICAgICBkYmcoIklQICVzXG4iLCBpbmV0X250b2EoaXAtPnNpbl9hZGRyKSk7CisgICAgICAqb2lwNCA9IG50b2hsKGlwLT5zaW5fYWRkci5zX2FkZHIpOworICAgIH0KKyAgfQorCisgIGlmIChpZmluZGV4KSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZyZXEpOworICAgIGRiZygiQWRhcHRlciBpbmRleCAlZFxuIiwgcmVxLmlmcl9pZmluZGV4KTsKKyAgICAqaWZpbmRleCA9IHJlcS5pZnJfaWZpbmRleDsKKyAgfQorICBpZiAobWFjKSB7CisgICAgeGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmcmVxKTsKKyAgICBtZW1jcHkobWFjLCByZXEuaWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKKyAgICBkYmcoIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisgIH0KKworICBjbG9zZShmZCk7CisgIHJldHVybiAwOworfQorCisvKgorICpsb2dzIG1lc3NlZ2VzIHRvIHN5c2xvZyBvciBjb25zb2xlCisgKm9wZW5pbmcgdGhlIGxvZyBpcyBzdGlsbCBsZWZ0IHdpdGggYXBwbGV0LgorICpGSVhNRTogbW92ZSB0byBtb3JlIHJlbGV2ZW50IGxpYi4gcHJvYmFibHkgbGliYy5jCisgKi8KK3N0YXRpYyB2b2lkIGluZm9tc2codWludDhfdCBpbmZvbW9kZSwgY2hhciAqcywgLi4uKQoreworICBpbnQgdXNlZDsKKyAgY2hhciAqbXNnOworICB2YV9saXN0IHAsIHQ7CisKKyAgaWYgKGluZm9tb2RlID09IExPR19TSUxFTlQpIHJldHVybjsKKyAgdmFfc3RhcnQocCwgcyk7CisgIHZhX2NvcHkodCwgcCk7CisgIHVzZWQgPSB2c25wcmludGYoTlVMTCwgMCwgcywgdCk7CisgIHVzZWQrKzsKKyAgdmFfZW5kKHQpOworCisgIG1zZyA9IHhtYWxsb2ModXNlZCk7CisgIHZzbnByaW50Zihtc2csIHVzZWQsIHMsIHApOworICB2YV9lbmQocCk7CisKKyAgaWYgKGluZm9tb2RlICYgTE9HX1NZU1RFTSkgc3lzbG9nKExPR19JTkZPLCAiJXMiLCBtc2cpOworICBpZiAoaW5mb21vZGUgJiBMT0dfQ09OU09MRSkgcHJpbnRmKCIlc1xuIiwgbXNnKTsKKyAgZnJlZShtc2cpOworfQorCisvKgorICogV3JpdGVzIHNlbGYgUElEIGluIGZpbGUgUEFUSAorICogRklYTUU6IGxpYmMgaW1wbGVtZW50YXRpb24gb25seSB3cml0ZXMgaW4gL3Zhci9ydW4KKyAqIHRoaXMgaXMgbW9yZSBnZW5lcmljIGFzIHNvbWUgaW1wbGVtZW5hdGlvbiBtYXkgcHJvdmlkZQorICogYXJndW1lbnRzIHRvIHdyaXRlIGluIHNwZWNpZmljIGZpbGUuIGFzIGRoY3BkIGRvZXMuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3BpZChjaGFyICpwYXRoKQoreworICBpbnQgcGlkZmlsZSA9IG9wZW4ocGF0aCwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgMDY2Nik7CisgIGlmIChwaWRmaWxlID4gMCkgeworICAgIGNoYXIgcGlkYnVmWzEyXTsKKworICAgIHNwcmludGYocGlkYnVmLCAiJXUiLCAodW5zaWduZWQpZ2V0cGlkKCkpOworICAgIHdyaXRlKHBpZGZpbGUsIHBpZGJ1Ziwgc3RybGVuKHBpZGJ1ZikpOworICAgIGNsb3NlKHBpZGZpbGUpOworICB9Cit9CisKKy8vIEdlbmVyaWMgc2lnbmFsIGhhbmRsZXIgcmVhbCBoYW5kbGluZyBpcyBkb25lIGluIG1haW4gZnVuY3Jpb24uCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnKQoreworICB1bnNpZ25lZCBjaGFyIGNoID0gc2lnOworICBpZiAod3JpdGUoc2lnZmQud3IsICZjaCwgMSkgIT0gMSkgZGJnKCJjYW4ndCBzZW5kIHNpZ25hbFxuIik7Cit9CisKKy8vIHNpZ25hbCBzZXR1cCBmb3IgU0lHVVNSMSBTSUdURVJNCitzdGF0aWMgaW50IHNldHVwX3NpZ25hbCgpCit7CisgIGlmIChwaXBlKChpbnQgKikmc2lnZmQpIDwgMCkgeworICAgIGRiZygic2lnbmFsIHBpcGUgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZmNudGwoc2lnZmQud3IgLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgZmNudGwoc2lnZmQucmQgLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgaW50IGZsYWdzID0gZmNudGwoc2lnZmQud3IsIEZfR0VURkwpOworICBmY250bChzaWdmZC53ciwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKyAgc2lnbmFsKFNJR1VTUjEsIHNpZ25hbF9oYW5kbGVyKTsKKyAgc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9oYW5kbGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFN0cmluZyBTVFIgdG8gVUlOVDMyIGNvbnZlcnNpb24gc3Ryb3JlZCBpbiBWQVIKK3N0YXRpYyBpbnQgc3RydG91MzIoY29uc3QgY2hhciAqc3RyLCB2b2lkICp2YXIpCit7CisgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisgIGludCBiYXNlID0gMTA7CisgIGVycm5vPTA7CisgICooKHVpbnQzMl90KikodmFyKSkgPSAwOworICBpZiAoc3RyWzBdPT0nMCcgJiYgKHN0clsxXT09J3gnIHx8IHN0clsxXT09J1gnKSkgeworICAgIGJhc2UgPSAxNjsKKyAgICBzdHIrPTI7CisgIH0KKworICBsb25nIHJldF92YWwgPSBzdHJ0b2woc3RyLCAmZW5kcHRyLCBiYXNlKTsKKyAgaWYgKGVycm5vKSBpbmZvbXNnKGluZm9tb2RlLCAiY29uZmlnIDogSW52YWxpZCBudW0gJXMiLHN0cik7CisgIGVsc2UgaWYgKGVuZHB0ciAmJiAoKmVuZHB0ciE9J1wwJ3x8ZW5kcHRyID09IHN0cikpCisgICAgICBpbmZvbXNnKGluZm9tb2RlLCAiY29uZmlnIDogTm90IGEgdmFsaWQgbnVtICVzIixzdHIpOworICBlbHNlICooKHVpbnQzMl90KikodmFyKSkgPSAodWludDMyX3QpcmV0X3ZhbDsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGNvcHkgc3RyaW5nIFNUUiBpbiB2YXJpYWJsZSBWQVIKK3N0YXRpYyBpbnQgc3RyaW52YXIoY29uc3QgY2hhciAqc3RyLCB2b2lkICp2YXIpCit7CisgIGNoYXIgKipkZXN0ID0gdmFyOworICBpZiAoKmRlc3QpIGZyZWUoKmRlc3QpOworICAqZGVzdCA9IHN0cmR1cChzdHIpOworICByZXR1cm4gMDsKK30KKworLy8gSVAgU3RyaW5nIFNUUiB0byBiaW5hcnkgZGF0YS4KK3N0YXRpYyBpbnQgc3RyaXB0b3Zhcihjb25zdCBjaGFyICpzdHIsIHZvaWQgKnZhcikKK3sKKyAgKigodWludDMyX3QqKSh2YXIpKSA9IDA7CisgIGlmKCFzdHIpIHsKKyAgICBlcnJvcl9tc2coImNvbmZpZyA6IE5VTEwgYWRkcmVzcyBzdHJpbmcgXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYoKGluZXRfcHRvbihBRl9JTkVUNiwgc3RyLCB2YXIpPD0wKSAmJiAoaW5ldF9wdG9uKEFGX0lORVQsIHN0ciwgdmFyKTw9MCkpIHsKKyAgICBlcnJvcl9tc2coImNvbmZpZyA6IHdyb25nIGFkZHJlc3MgJXMgXG4iLCBzdHIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gU3RyaW5nIHRvIGRoY3Agb3B0aW9uIGNvbnZlcnNpb24KK3N0YXRpYyBpbnQgc3RydG9vcHQoY29uc3QgY2hhciAqc3RyLCB2b2lkICp2YXIpCit7CisgIGNoYXIgKm9wdGlvbiwgKnZhbHN0ciwgKmdycCwgKnRwOworICB1aW50MzJfdCBvcHRjb2RlID0gMCwgaW5mID0gaW5mb21vZGUsIGNvbnZ0bXAsIG1hc2ssIG5pcCwgcm91dGVyOworICB1aW50MTZfdCBmbGFnID0gMDsKKyAgaW50IGNvdW50LCBzaXplID0gQVJSQVlfTEVOKG9wdGlvbnNfbGlzdCk7CisKKyAgaWYgKCEqc3RyKSByZXR1cm4gMDsKKyAgaWYgKCEob3B0aW9uID0gc3RydG9rKChjaGFyKilzdHIsICIgXHQ9IikpKSByZXR1cm4gLTE7CisKKyAgaW5mb21vZGUgPSBMT0dfU0lMRU5UOworICBzdHJ0b3UzMihvcHRpb24sICh1aW50MzJfdCopJm9wdGNvZGUpOworICBpbmZvbW9kZSA9IGluZjsKKworICBpZiAob3B0Y29kZSA+IDAgJiYgb3B0Y29kZSA8IDI1NikgeyAvLyByYXcgb3B0aW9uCisgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2l6ZTsgY291bnQrKykgeworICAgICAgaWYgKChvcHRpb25zX2xpc3RbY291bnRdLmNvZGUgJiAwWDAwRkYpID09IG9wdGNvZGUpIHsKKyAgICAgICAgZmxhZyA9IChvcHRpb25zX2xpc3RbY291bnRdLmNvZGUgJiAwWEZGMDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7IC8vc3RyaW5nIG9wdGlvbgorICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspIHsKKyAgICAgIGlmICghc3RybmNtcChvcHRpb25zX2xpc3RbY291bnRdLmtleSwgb3B0aW9uLCBzdHJsZW4ob3B0aW9uc19saXN0W2NvdW50XS5rZXkpKSkgeworICAgICAgICBmbGFnID0gKG9wdGlvbnNfbGlzdFtjb3VudF0uY29kZSAmIDBYRkYwMCk7CisgICAgICAgIG9wdGNvZGUgPSAob3B0aW9uc19saXN0W2NvdW50XS5jb2RlICYgMFgwMEZGKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChjb3VudCA9PSBzaXplKSB7CisgICAgaW5mb21zZyhpbmYsICJjb25maWcgOiBPYnNvbGV0ZSBPUiBVbmtub3duIE9wdGlvbiA6ICVzIiwgb3B0aW9uKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIWZsYWcgfHwgIW9wdGNvZGUpIHJldHVybiAtMTsKKworICBpZiAoISh2YWxzdHIgPSBzdHJ0b2soTlVMTCwgIiBcdCIpKSkgeworICAgIGRiZygiY29uZmlnIDogb3B0aW9uICVzIGhhcyBubyB2YWx1ZSBkZWZpbmVkLlxuIiwgb3B0aW9uKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZGJnKCIgdmFsdWUgOiAlLTIwcyA6ICIsIHZhbHN0cik7CisgIHN3aXRjaCAoZmxhZykgeworICBjYXNlIERIQ1BfTlVNMzI6CisgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gPSBzaXplb2YodWludDMyX3QpOworICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0geG1hbGxvYyhzaXplb2YodWludDMyX3QpKTsKKyAgICBzdHJ0b3UzMih2YWxzdHIsICZjb252dG1wKTsKKyAgICBtZW1jcHkob3B0aW9uc19saXN0W2NvdW50XS52YWwsICZjb252dG1wLCBzaXplb2YodWludDMyX3QpKTsKKyAgICBicmVhazsKKyAgY2FzZSBESENQX05VTTE2OgorICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuID0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHhtYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgc3RydG91MzIodmFsc3RyLCAmY29udnRtcCk7CisgICAgbWVtY3B5KG9wdGlvbnNfbGlzdFtjb3VudF0udmFsLCAmY29udnRtcCwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9OVU04OgorICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuID0gc2l6ZW9mKHVpbnQ4X3QpOworICAgIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsID0geG1hbGxvYyhzaXplb2YodWludDhfdCkpOworICAgIHN0cnRvdTMyKHZhbHN0ciwgJmNvbnZ0bXApOworICAgIG1lbWNweShvcHRpb25zX2xpc3RbY291bnRdLnZhbCwgJmNvbnZ0bXAsIHNpemVvZih1aW50OF90KSk7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9JUDoKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLmxlbiA9IHNpemVvZih1aW50MzJfdCk7CisgICAgb3B0aW9uc19saXN0W2NvdW50XS52YWwgPSB4bWFsbG9jKHNpemVvZih1aW50MzJfdCkpOworICAgIHN0cmlwdG92YXIodmFsc3RyLCBvcHRpb25zX2xpc3RbY291bnRdLnZhbCk7CisgICAgYnJlYWs7CisgIGNhc2UgREhDUF9TVFJJTkc6CisgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gPSBzdHJsZW4odmFsc3RyKTsKKyAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHN0cmR1cCh2YWxzdHIpOworICAgIGJyZWFrOworICBjYXNlIERIQ1BfSVBMSVNUOgorICAgIHdoaWxlKHZhbHN0cil7CisgICAgICBvcHRpb25zX2xpc3RbY291bnRdLnZhbCA9IHhyZWFsbG9jKG9wdGlvbnNfbGlzdFtjb3VudF0udmFsLCBvcHRpb25zX2xpc3RbY291bnRdLmxlbiArIHNpemVvZih1aW50MzJfdCkpOworICAgICAgc3RyaXB0b3Zhcih2YWxzdHIsICgodWludDhfdCopb3B0aW9uc19saXN0W2NvdW50XS52YWwpK29wdGlvbnNfbGlzdFtjb3VudF0ubGVuKTsKKyAgICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICB2YWxzdHIgPSBzdHJ0b2soTlVMTCwiIFx0Iik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIERIQ1BfSVBQTFNUOgorICAgIGJyZWFrOworICBjYXNlIERIQ1BfU1RDUlRTOgorICAgIC8qIE9wdGlvbiBiaW5hcnkgZm9ybWF0OgorICAgICAqIG1hc2sgW29uZSBieXRlLCAwLi4zMl0KKyAgICAgKiBpcCBbMC4uNCBieXRlcyBkZXBlbmRpbmcgb24gbWFza10KKyAgICAgKiByb3V0ZXIgWzQgYnl0ZXNdCisgICAgICogbWF5IGJlIHJlcGVhdGVkCisgICAgICogc3RhdGljcm91dGVzIDEwLjAuMC4wLzggMTAuMTI3LjAuMSwgMTAuMTEuMTIuMC8yNCAxMC4xMS4xMi4xCisgICAgICovCisgICAgZ3JwID0gc3RydG9rKHZhbHN0ciwgIiwiKTs7CisgICAgd2hpbGUoZ3JwKXsKKyAgICAgIHdoaWxlKCpncnAgPT0gJyAnIHx8ICpncnAgPT0gJ1x0JykgZ3JwKys7CisgICAgICB0cCA9IHN0cmNocihncnAsICcvJyk7CisgICAgICBpZiAoIXRwKSBlcnJvcl9leGl0KCJ3cm9uZyBmb3JtYXRlZCBzdGF0aWMgcm91dGUgb3B0aW9uIik7CisgICAgICAqdHAgPSAnXDAnOworICAgICAgbWFzayA9IHN0cnRvbCgrK3RwLCAmdHAsIDEwKTsKKyAgICAgIGlmIChzdHJpcHRvdmFyKGdycCwgKHVpbnQ4X3QqKSZuaXApPDApIGVycm9yX2V4aXQoIndyb25nIGZvcm1hdGVkIHN0YXRpYyByb3V0ZSBvcHRpb24iKTsKKyAgICAgIHdoaWxlKCp0cCA9PSAnICcgfHwgKnRwID09ICdcdCcgfHwgKnRwID09ICctJykgdHArKzsKKyAgICAgIGlmIChzdHJpcHRvdmFyKHRwLCAodWludDhfdCopJnJvdXRlcik8MCkgZXJyb3JfZXhpdCgid3JvbmcgZm9ybWF0ZWQgc3RhdGljIHJvdXRlIG9wdGlvbiIpOworICAgICAgb3B0aW9uc19saXN0W2NvdW50XS52YWwgPSB4cmVhbGxvYyhvcHRpb25zX2xpc3RbY291bnRdLnZhbCwgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gKyAxICsgbWFzay84ICsgNCk7CisgICAgICBtZW1jcHkoKCh1aW50OF90KilvcHRpb25zX2xpc3RbY291bnRdLnZhbCkrb3B0aW9uc19saXN0W2NvdW50XS5sZW4sICZtYXNrLCAxKTsKKyAgICAgIG9wdGlvbnNfbGlzdFtjb3VudF0ubGVuICs9IDE7CisgICAgICBtZW1jcHkoKCh1aW50OF90KilvcHRpb25zX2xpc3RbY291bnRdLnZhbCkrb3B0aW9uc19saXN0W2NvdW50XS5sZW4sICZuaXAsIG1hc2svOCk7CisgICAgICBvcHRpb25zX2xpc3RbY291bnRdLmxlbiArPSBtYXNrLzg7CisgICAgICBtZW1jcHkoKCh1aW50OF90KilvcHRpb25zX2xpc3RbY291bnRdLnZhbCkrb3B0aW9uc19saXN0W2NvdW50XS5sZW4sICZyb3V0ZXIsIDQpOworICAgICAgb3B0aW9uc19saXN0W2NvdW50XS5sZW4gKz0gNDsKKyAgICAgIHRwID0gTlVMTDsKKyAgICAgIGdycCA9IHN0cnRvayhOVUxMLCAiLCIpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gUmVhZHMgU3RhdGljIGxlYXNlcyBmcm9tIFNUUiBhbmQgdXBkYXRlcyBpbm5lciBzdHJ1Y3R1cmVzLgorc3RhdGljIGludCBnZXRfc3RhdGljbGVhc2UoY29uc3QgY2hhciAqc3RyLCB2b2lkICp2YXIpCit7CisgIHN0cnVjdCBzdGF0aWNfbGVhc2VfcyAqc2x0bXA7CisgIGNoYXIgKnRrbWFjLCAqdGtpcDsKKyAgaW50IGNvdW50OworCisgIGlmICghKnN0cikgcmV0dXJuIDA7CisKKyAgaWYgKCEodGttYWMgPSBzdHJ0b2soKGNoYXIqKXN0ciwgIiBcdCIpKSkgeworICAgIGluZm9tc2coaW5mb21vZGUsICJjb25maWcgOiBzdGF0aWMgbGVhc2UgOiBtYWMgbm90IGZvdW5kIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCEodGtpcCA9IHN0cnRvayhOVUxMLCAiIFx0IikpKSB7CisgICAgaW5mb21zZyhpbmZvbW9kZSwgImNvbmZpZyA6IHN0YXRpYyBsZWFzZSA6IG5vIGlwIGJpbmQgdG8gbWFjICVzIiwgdGttYWMpOworICAgIHJldHVybiAwOworICB9CisgIHNsdG1wID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHN0YXRpY19sZWFzZV9zKSk7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDY7IGNvdW50KyssIHRrbWFjKyspIHsKKyAgICBlcnJubyA9IDA7CisgICAgc2x0bXAtPm1hY1tjb3VudF0gPSBzdHJ0b2wodGttYWMsICZ0a21hYywgMTYpOworICAgIGlmIChzbHRtcC0+bWFjW2NvdW50XT4yNTUgfHwgc2x0bXAtPm1hY1tjb3VudF08MCB8fCAoKnRrbWFjICYmICp0a21hYyE9JzonKSB8fCBlcnJubykgeworICAgICAgaW5mb21zZyhpbmZvbW9kZSwgImNvbmZpZyA6IHN0YXRpYyBsZWFzZSA6IG1hYyBhZGRyZXNzIHdyb25nIGZvcm1hdCIpOworICAgICAgZnJlZShzbHRtcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgc3RyaXB0b3Zhcih0a2lwLCAmc2x0bXAtPm5pcCk7CisgIHNsdG1wLT5uZXh0ID0gZ3N0YXRlLmxlYXNlcy5zbGVhc2VzOworICBnc3RhdGUubGVhc2VzLnNsZWFzZXMgPSBzbHRtcDsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb25maWdfa2V5d29yZCBrZXl3b3Jkc1tdID0geworLy8ga2V5d29yZCAgICAgICAgICBoYW5kbGVyICAgICAgICAgICB2YXJpYWJsZSBhZGRyZXNzICAgICAgICAgICAgICAgIGRlZmF1bHQKKyAgeyJzdGFydCIgICAgICAgICwgc3RyaXB0b3ZhciAgICAgICwgKHZvaWQqKSZnY29uZmlnLnN0YXJ0X2lwICAgICAsICIxOTIuMTY4LjAuMjAifSwKKyAgeyJlbmQiICAgICAgICAgICwgc3RyaXB0b3ZhciAgICAgICwgKHZvaWQqKSZnY29uZmlnLmVuZF9pcCAgICAgICAsICIxOTIuMTY4LjAuMjU0In0sCisgIHsiaW50ZXJmYWNlIiAgICAsIHN0cmludmFyICAgICAgICAsICh2b2lkKikmZ2NvbmZpZy5pbnRlcmZhY2UgICAgLCAiZXRoMCJ9LAorICB7InBvcnQiICAgICAgICAgLCBzdHJ0b3UzMiAgICAgICAgLCAodm9pZCopJmdjb25maWcucG9ydCAgICAgICAgICwgIjY3In0sCisgIHsibWluX2xlYXNlIiAgICAsIHN0cnRvdTMyICAgICAgICAsICh2b2lkKikmZ2NvbmZpZy5taW5fbGVhc2Vfc2VjLCAiNjAifSwKKyAgeyJtYXhfbGVhc2VzIiAgICwgc3RydG91MzIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLm1heF9sZWFzZXMgICAsICIyMzUifSwKKyAgeyJhdXRvX3RpbWUiICAgICwgc3RydG91MzIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLmF1dG9fdGltZSAgICAsICI3MjAwIn0sCisgIHsiZGVjbGluZV90aW1lIiAsIHN0cnRvdTMyICAgICAgICAsICh2b2lkKikmZ2NvbmZpZy5kZWNsaW5lX3RpbWUgLCAiMzYwMCJ9LAorICB7ImNvbmZsaWN0X3RpbWUiLCBzdHJ0b3UzMiAgICAgICAgLCAodm9pZCopJmdjb25maWcuY29uZmxpY3RfdGltZSwgIjM2MDAifSwKKyAgeyJvZmZlcl90aW1lIiAgICwgc3RydG91MzIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLm9mZmVyX3RpbWUgICAsICI2MCJ9LAorICB7ImxlYXNlX2ZpbGUiICAgLCBzdHJpbnZhciAgICAgICAgLCAodm9pZCopJmdjb25maWcubGVhc2VfZmlsZSAgICwgIi92YXIvbGliL21pc2MvZGhjcGQubGVhc2VzIn0sIC8vTEVBU0VTX0ZJTEUKKyAgeyJsZWFzZTZfZmlsZSIgICwgc3RyaW52YXIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLmxlYXNlNl9maWxlICAsICIvdmFyL2xpYi9taXNjL2RoY3BkNi5sZWFzZXMifSwgLy9MRUFTRVNfRklMRQorICB7InBpZGZpbGUiICAgICAgLCBzdHJpbnZhciAgICAgICAgLCAodm9pZCopJmdjb25maWcucGlkZmlsZSAgICAgICwgIi92YXIvcnVuL2RoY3BkLnBpZCJ9LCAvL0RQSURfRklMRQorICB7InNpYWRkciIgICAgICAgLCBzdHJpcHRvdmFyICAgICAgLCAodm9pZCopJmdjb25maWcuc2lhZGRyX25pcCAgICwgIjAuMC4wLjAifSwKKyAgeyJvcHRpb24iICAgICAgICwgc3RydG9vcHQgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLm9wdGlvbnMgICAgICAsICIifSwKKyAgeyJvcHQiICAgICAgICAgICwgc3RydG9vcHQgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLm9wdGlvbnMgICAgICAsICIifSwKKyAgeyJub3RpZnlfZmlsZSIgICwgc3RyaW52YXIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLm5vdGlmeV9maWxlICAsICIifSwKKyAgeyJzbmFtZSIgICAgICAgICwgc3RyaW52YXIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLnNuYW1lICAgICAgICAsICIifSwKKyAgeyJib290X2ZpbGUiICAgICwgc3RyaW52YXIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLmJvb3RfZmlsZSAgICAsICIifSwKKyAgeyJzdGF0aWNfbGVhc2UiICwgZ2V0X3N0YXRpY2xlYXNlICwgKHZvaWQqKSZnY29uZmlnLnN0YXRpY19sZWFzZXMsICIifSwKKyAgeyJzdGFydDYiICAgICAgICwgc3RyaXB0b3ZhciAgICAgICwgKHZvaWQqKSZnY29uZmlnLnN0YXJ0X2lwNiAgICAsICIyMDAxOjYyMDo0MGI6NTU1OjoxMDAifSwKKyAgeyJlbmQ2IiAgICAgICAgICwgc3RyaXB0b3ZhciAgICAgICwgKHZvaWQqKSZnY29uZmlnLmVuZF9pcDYgICAgICAsICIyMDAxOjYyMDo0MGI6NTU1OjoyMDAifSwKKyAgeyJwcmVmZXJyZWRfbGlmZXRpbWUiICwgc3RydG91MzIgICwgKHZvaWQqKSZnY29uZmlnLnByZWZfbGlmZXRpbWUsICIzNjAwIn0sCisgIHsidmFsaWRfbGlmZXRpbWUiICAgICAsIHN0cnRvdTMyICAsICh2b2lkKikmZ2NvbmZpZy52YWxpZF9saWZldGltZSwgIjcyMDAifSwKKyAgeyJ0MSIgICAgICAgICAgICwgc3RydG91MzIgICAgICAgICwgKHZvaWQqKSZnY29uZmlnLnQxICAgICAgICAgICAsICIzNjAwIn0sCisgIHsidDIiICAgICAgICAgICAsIHN0cnRvdTMyICAgICAgICAsICh2b2lkKikmZ2NvbmZpZy50MiAgICAgICAgICAgLCAiNTQwMCJ9LAorfTsKKworLy8gUGFyc2VzIHRoZSBzZXJ2ZXIgY29uZmlnIGZpbGUgYW5kIHVwZGF0ZXMgdGhlIGdsb2JhbCBzZXJ2ZXIgY29uZmlnIGFjY29yZGluZ2x5Lgorc3RhdGljIGludCBwYXJzZV9zZXJ2ZXJfY29uZmlnKGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgY29uZmlnX2tleXdvcmQgKmNvbmZrZXkpCit7CisgIEZJTEUgKmZzID0gTlVMTDsKKyAgY2hhciAqY29uZmxpbmVfdGVtcCA9IE5VTEwsKmNvbmZsaW5lID0gTlVMTCwgKnRrID0gTlVMTCwgKnRva2Vuc1syXSA9IHtOVUxMLCBOVUxMfTsKKyAgaW50IGxlbiwgbGluZWxlbiwgdGNvdW50LCBjb3VudCwgc2l6ZSA9IEFSUkFZX0xFTihrZXl3b3Jkcyk7CisKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2l6ZTsgY291bnQrKykKKyAgICBpZiAoY29uZmtleVtjb3VudF0uaGFuZGxlcikKKyAgICAgIGNvbmZrZXlbY291bnRdLmhhbmRsZXIoY29uZmtleVtjb3VudF0uZGVmLCBjb25ma2V5W2NvdW50XS52YXIpOworCisgIGlmICghKGZzID0gZm9wZW4oY29uZmlnX2ZpbGUsICJyIikpKSBwZXJyb3JfbXNnKCIlcyIsIGNvbmZpZ19maWxlKTsKKyAgZm9yIChsZW4gPSAwLCBsaW5lbGVuID0gMDsgZnM7KSB7CisgICAgbGVuID0gZ2V0bGluZSgmY29uZmxpbmVfdGVtcCwgKHNpemVfdCopICZsaW5lbGVuLCBmcyk7CisgICAgY29uZmxpbmUgPSBjb25mbGluZV90ZW1wOworICAgIGlmIChsZW4gPD0gMCkgYnJlYWs7CisgICAgZm9yICg7ICpjb25mbGluZSA9PSAnICc7IGNvbmZsaW5lKyssIGxlbi0tKTsKKyAgICBpZiAoKGNvbmZsaW5lWzBdID09ICcjJykgfHwgKGNvbmZsaW5lWzBdID09ICdcbicpKSBnb3RvIGZyZWVfY29uZl9jb250aW51ZTsKKyAgICB0ayA9IHN0cmNocihjb25mbGluZSwgJyMnKTsKKyAgICBpZiAodGspIHsKKyAgICAgIGZvciAoOyAqKHRrLTEpPT0nICcgfHwgKih0ay0xKT09J1x0JzsgdGstLSk7CisgICAgICAqdGsgPSAnXDAnOworICAgIH0KKyAgICB0ayA9IHN0cmNocihjb25mbGluZSwgJ1xuJyk7CisgICAgaWYgKHRrKSB7CisgICAgICBmb3IgKDsgKih0ay0xKT09JyAnIHx8ICoodGstMSk9PSdcdCc7IHRrLS0pOworICAgICAgKnRrID0gJ1wwJzsKKyAgICB9CisgICAgZm9yICh0Y291bnQ9MCwgdGs9c3RydG9rKGNvbmZsaW5lLCAiIFx0Iik7IHRrICYmICh0Y291bnQgPCAyKTsKKyAgICAgICAgdGNvdW50KyssIHRrPXN0cnRvayhOVUxMLCh0Y291bnQ9PTEpPyIiOiIgXHQiKSkgeworICAgICAgd2hpbGUgKCgqdGsgPT0gJ1x0JykgfHwgKCp0ayA9PSAnICcpKSB0aysrOworICAgICAgdG9rZW5zW3Rjb3VudF0gPSB4c3RyZHVwKHRrKTsKKyAgICB9CisgICAgaWYgKHRjb3VudDw9MSkgZ290byBmcmVlX3RrMF9jb250aW51ZTsKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgICBpZiAoIXN0cmNtcChjb25ma2V5W2NvdW50XS5rZXl3b3JkLHRva2Vuc1swXSkpIHsKKyAgICAgICAgZGJnKCJnb3QgY29uZmlnIDogJTE1cyA6ICIsIGNvbmZrZXlbY291bnRdLmtleXdvcmQpOworICAgICAgICBpZiAoY29uZmtleVtjb3VudF0uaGFuZGxlcih0b2tlbnNbMV0sIGNvbmZrZXlbY291bnRdLnZhcikgPT0gMCkKKyAgICAgICAgICBkYmcoIiVzIFxuIiwgdG9rZW5zWzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICh0b2tlbnNbMV0pIHsgZnJlZSh0b2tlbnNbMV0pOyB0b2tlbnNbMV0gPSBOVUxMOyB9CitmcmVlX3RrMF9jb250aW51ZToKKyAgICBpZiAodG9rZW5zWzBdKSB7IGZyZWUodG9rZW5zWzBdKTsgdG9rZW5zWzBdID0gTlVMTDsgfQorZnJlZV9jb25mX2NvbnRpbnVlOgorICAgIGZyZWUoY29uZmxpbmVfdGVtcCk7CisgICAgY29uZmxpbmVfdGVtcCA9IE5VTEw7CisgIH0KKyAgaWYgKGZzKSBmY2xvc2UoZnMpOworICByZXR1cm4gMDsKK30KKworLy8gb3BlbnMgVURQIHNvY2tldCBmb3IgbGlzdGVuIGlwdjYgcGFja2V0cworc3RhdGljIGludCBvcGVuX2xpc3RlbnNvY2s2KHZvaWQpCit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjY7CisgIHN0cnVjdCBpcHY2X21yZXEgbXJlcTsKKworICBpZiAoZ3N0YXRlLmxpc3RlbnNvY2sgPiAwKSBjbG9zZShnc3RhdGUubGlzdGVuc29jayk7CisKKyAgZGJnKCJPcGVuaW5nIGxpc3RlbiBzb2NrZXQgb24gKjolZCAlc1xuIiwgZ2NvbmZpZy5wb3J0LCBnY29uZmlnLmludGVyZmFjZSk7CisKKyAgZ3N0YXRlLmxpc3RlbnNvY2sgPSB4c29ja2V0KFBGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKyAgc2V0c29ja29wdChnc3RhdGUubGlzdGVuc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmY29uc3RvbmUsIHNpemVvZihjb25zdG9uZSkpOworICBzZXRzb2Nrb3B0KGdzdGF0ZS5saXN0ZW5zb2NrLCBJUFBST1RPX0lQVjYsIElQVjZfQ0hFQ0tTVU0sICZjb25zdG9uZSwgc2l6ZW9mKGNvbnN0b25lKSk7CisKKyAgaWYgKHNldHNvY2tvcHQoZ3N0YXRlLmxpc3RlbnNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9SRUNWUEtUSU5GTywgJmNvbnN0b25lLAorICAgICAgICBzaXplb2YoY29uc3RvbmUpKSA9PSAtMSkgeworICAgIGVycm9yX21zZygiZmFpbGVkIHRvIHJlY2VpdmUgaXB2NiBwYWNrZXRzLlxuIik7CisgICAgY2xvc2UoZ3N0YXRlLmxpc3RlbnNvY2spOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHNldHNvY2tvcHQoZ3N0YXRlLmxpc3RlbnNvY2ssIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgZ2NvbmZpZy5pbnRlcmZhY2UsIHN0cmxlbihnY29uZmlnLmludGVyZmFjZSkrMSk7CisKKyAgbWVtc2V0KCZhZGRyNiwgMCwgc2l6ZW9mKGFkZHI2KSk7CisgIGFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKGdjb25maWcucG9ydCk7IC8vU0VSVkVSX1BPUlQKKyAgYWRkcjYuc2luNl9zY29wZV9pZCA9IGlmX25hbWV0b2luZGV4KGdjb25maWcuaW50ZXJmYWNlKTsKKyAgLy9MaXN0ZW5pbmcgZm9yIG11bHRpY2FzdCBwYWNrZXQKKyAgaW5ldF9wdG9uKEFGX0lORVQ2LCAiZmYwMjo6MToyIiwgJmFkZHI2LnNpbjZfYWRkcik7CisKKyAgaWYgKGJpbmQoZ3N0YXRlLmxpc3RlbnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHI2LCBzaXplb2YoYWRkcjYpKSA9PSAtMSkgeworICAgIGNsb3NlKGdzdGF0ZS5saXN0ZW5zb2NrKTsKKyAgICBwZXJyb3JfZXhpdCgiYmluZCBmYWlsZWQiKTsKKyAgfQorCisgIG1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKKyAgbXJlcS5pcHY2bXJfaW50ZXJmYWNlID0gaWZfbmFtZXRvaW5kZXgoZ2NvbmZpZy5pbnRlcmZhY2UpOworICBtZW1jcHkoJm1yZXEuaXB2Nm1yX211bHRpYWRkciwgJmFkZHI2LnNpbjZfYWRkciwgc2l6ZW9mKGFkZHI2LnNpbjZfYWRkcikpOworCisgIGlmKHNldHNvY2tvcHQoZ3N0YXRlLmxpc3RlbnNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9KT0lOX0dST1VQLCAmbXJlcSwgc2l6ZW9mKG1yZXEpKSA9PSAtMSkgeworICAgIGVycm9yX21zZygiZmFpbGVkIHRvIGpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAuXG4iKTsKKyAgICBjbG9zZShnc3RhdGUubGlzdGVuc29jayk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZGJnKCJPUEVOIDogc3VjY2Vzc1xuIik7CisgIHJldHVybiAwOworfQorCisvLyBvcGVucyBVRFAgc29ja2V0IGZvciBsaXN0ZW4KK3N0YXRpYyBpbnQgb3Blbl9saXN0ZW5zb2NrKHZvaWQpCit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICBzdHJ1Y3QgaWZyZXEgaWZyOworCisgIGlmIChnc3RhdGUubGlzdGVuc29jayA+IDApIGNsb3NlKGdzdGF0ZS5saXN0ZW5zb2NrKTsKKworICBkYmcoIk9wZW5pbmcgbGlzdGVuIHNvY2tldCBvbiAqOiVkICVzXG4iLCBnY29uZmlnLnBvcnQsIGdjb25maWcuaW50ZXJmYWNlKTsKKyAgZ3N0YXRlLmxpc3RlbnNvY2sgPSB4c29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKyAgc2V0c29ja29wdChnc3RhdGUubGlzdGVuc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmY29uc3RvbmUsIHNpemVvZihjb25zdG9uZSkpOworICBpZiAoc2V0c29ja29wdChnc3RhdGUubGlzdGVuc29jaywgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmY29uc3RvbmUsIHNpemVvZihjb25zdG9uZSkpID09IC0xKSB7CisgICAgZXJyb3JfbXNnKCJmYWlsZWQgdG8gcmVjZWl2ZSBicm9kY2FzdCBwYWNrZXRzLlxuIik7CisgICAgY2xvc2UoZ3N0YXRlLmxpc3RlbnNvY2spOworICAgIHJldHVybiAtMTsKKyAgfQorICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworICB4c3RybmNweShpZnIuaWZyX25hbWUsIGdjb25maWcuaW50ZXJmYWNlLCBJRk5BTVNJWik7CisgIHNldHNvY2tvcHQoZ3N0YXRlLmxpc3RlbnNvY2ssIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgJmlmciwgc2l6ZW9mKGlmcikpOworCisgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYWRkci5zaW5fcG9ydCA9IGh0b25zKGdjb25maWcucG9ydCk7IC8vU0VSVkVSX1BPUlQKKyAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZIDsKKworICBpZiAoYmluZChnc3RhdGUubGlzdGVuc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSkgeworICAgIGNsb3NlKGdzdGF0ZS5saXN0ZW5zb2NrKTsKKyAgICBwZXJyb3JfZXhpdCgiYmluZCBmYWlsZWQiKTsKKyAgfQorICBkYmcoIk9QRU4gOiBzdWNjZXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9wYWNrZXQ2KHVpbnQ4X3QgcmVsYXksIHVpbnQ4X3QgKmNsaWVudF9sbGEsIHVpbnQxNl90IG9wdGxlbikKK3sKKyAgc3RydWN0IHNvY2thZGRyX2xsIGRlc3Rfc2xsOworICBkaGNwNl9yYXdfdCBwYWNrZXQ7CisgIHVuc2lnbmVkIHBhZGRpbmc7CisgIGludCBmZCwgcmVzdWx0ID0gLTE7CisKKyAgbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihkaGNwNl9yYXdfdCkpOworICBtZW1jcHkoJnBhY2tldC5kaGNwNiwgJmdzdGF0ZS5zZW5kLnNlbmRfcGt0Niwgc2l6ZW9mKGRoY3A2X21zZ190KSk7CisgIHBhZGRpbmcgPSBzaXplb2YocGFja2V0LmRoY3A2Lm9wdGlvbnMpIC0gb3B0bGVuOworCisgIGlmICgoZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9JUFY2KSkpIDwgMCkgeworICAgIGRiZygiU0VORCA6IGlwdjYgc29ja2V0IGZhaWxlZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1lbXNldCgmZGVzdF9zbGwsIDAsIHNpemVvZihkZXN0X3NsbCkpOworICBkZXN0X3NsbC5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworICBkZXN0X3NsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKyAgZGVzdF9zbGwuc2xsX2lmaW5kZXggPSBnY29uZmlnLmlmaW5kZXg7CisgIGRlc3Rfc2xsLnNsbF9oYWxlbiA9IEVUSF9BTEVOOworICBtZW1jcHkoZGVzdF9zbGwuc2xsX2FkZHIsIGNsaWVudF9sbGEsIHNpemVvZih1aW50OF90KSo2KTsKKworICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZGVzdF9zbGwsIHNpemVvZihkZXN0X3NsbCkpIDwgMCkgeworICAgIGRiZygiU0VORCA6IGJpbmQgZmFpbGVkXG4iKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1lbWNweSgmcGFja2V0LmlwaC5pcDZfc3JjLCAmZ2NvbmZpZy5zZXJ2ZXJfbmlwNiwgc2l6ZW9mKHVpbnQzMl90KSo0KTsKKyAgbWVtY3B5KCZwYWNrZXQuaXBoLmlwNl9kc3QsICZnc3RhdGUuY2xpZW50X25pcDYsIHNpemVvZih1aW50MzJfdCkqNCk7CisKKyAgcGFja2V0LnVkcGguc291cmNlID0gaHRvbnMoZ2NvbmZpZy5wb3J0KTsgLy9TRVJWRVJfUE9SVAorICBwYWNrZXQudWRwaC5kZXN0ID0gZ3N0YXRlLmNsaWVudF9wb3J0OyAvL0NMSUVOVF9QT1JUCisgIHBhY2tldC51ZHBoLmxlbiA9IGh0b25zKHNpemVvZihkaGNwNl9yYXdfdCkgLSBzaXplb2Yoc3RydWN0IGlwNl9oZHIpIC0gcGFkZGluZyk7CisgIHBhY2tldC5pcGguaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9wbGVuID0gaHRvbnMobnRvaHMocGFja2V0LnVkcGgubGVuKSArIDB4MTEpOworICBwYWNrZXQudWRwaC5jaGVjayA9IGRoY3BfY2hlY2tzdW0oJnBhY2tldCwgc2l6ZW9mKGRoY3A2X3Jhd190KSAtIHBhZGRpbmcpOworICBwYWNrZXQuaXBoLmlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfZmxvdyA9IGh0b25sKDB4NjAwMDAwMDApOworICBwYWNrZXQuaXBoLmlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfcGxlbiA9IHBhY2tldC51ZHBoLmxlbjsKKyAgcGFja2V0LmlwaC5pcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX254dCA9IElQUFJPVE9fVURQOworICBwYWNrZXQuaXBoLmlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbSA9IDB4NjQ7CisKKyAgcmVzdWx0ID0gc2VuZHRvKGZkLCAmcGFja2V0LCBzaXplb2YoZGhjcDZfcmF3X3QpLXBhZGRpbmcsCisgICAgICAwLCAoc3RydWN0IHNvY2thZGRyICopICZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSk7CisKKyAgZGJnKCJzZW5kdG8gJWRcbiIsIHJlc3VsdCk7CisgIGNsb3NlKGZkKTsKKyAgaWYgKHJlc3VsdCA8IDApIGRiZygiUEFDS0VUIHNlbmQgZXJyb3JcbiIpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTZW5kcyBkYXRhIHRocm91Z2ggcmF3IHNvY2tldC4KK3N0YXRpYyBpbnQgc2VuZF9wYWNrZXQodWludDhfdCBicm9hZGNhc3QpCit7CisgIHN0cnVjdCBzb2NrYWRkcl9sbCBkZXN0X3NsbDsKKyAgZGhjcF9yYXdfdCBwYWNrZXQ7CisgIHVuc2lnbmVkIHBhZGRpbmc7CisgIGludCBmZCwgcmVzdWx0ID0gLTE7CisgIHVpbnQ4X3QgYm1hY2FkZHJbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisKKyAgbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihkaGNwX3Jhd190KSk7CisgIG1lbWNweSgmcGFja2V0LmRoY3AsICZnc3RhdGUuc2VuZC5zZW5kX3BrdCwgc2l6ZW9mKGRoY3BfbXNnX3QpKTsKKworICBpZiAoKGZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfSVApKSkgPCAwKSB7CisgICAgZGJnKCJTRU5EIDogc29ja2V0IGZhaWxlZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1lbXNldCgmZGVzdF9zbGwsIDAsIHNpemVvZihkZXN0X3NsbCkpOworICBkZXN0X3NsbC5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworICBkZXN0X3NsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisgIGRlc3Rfc2xsLnNsbF9pZmluZGV4ID0gZ2NvbmZpZy5pZmluZGV4OworICBkZXN0X3NsbC5zbGxfaGFsZW4gPSA2OworICBtZW1jcHkoZGVzdF9zbGwuc2xsX2FkZHIsIChicm9hZGNhc3QpP2JtYWNhZGRyOmdzdGF0ZS5yY3ZkLnJjdmRfcGt0LmNoYWRkciAsIDYpOworCisgIGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSkgPCAwKSB7CisgICAgZGJnKCJTRU5EIDogYmluZCBmYWlsZWRcbiIpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcGFkZGluZyA9IDMwOCAtIDEgLSBkaGNwX29wdF9zaXplKGdzdGF0ZS5zZW5kLnNlbmRfcGt0Lm9wdGlvbnMpOworICBwYWNrZXQuaXBoLnByb3RvY29sID0gSVBQUk9UT19VRFA7CisgIHBhY2tldC5pcGguc2FkZHIgPSBnY29uZmlnLnNlcnZlcl9uaXA7CisgIHBhY2tldC5pcGguZGFkZHIgPSAoYnJvYWRjYXN0IHx8IChnc3RhdGUucmN2ZC5yY3ZkX3BrdC5jaWFkZHIgPT0gMCkpPworICAgIElOQUREUl9CUk9BRENBU1QgOiBnc3RhdGUucmN2ZC5yY3ZkX3BrdC5jaWFkZHI7CisgIHBhY2tldC51ZHBoLnNvdXJjZSA9IGh0b25zKGdjb25maWcucG9ydCk7Ly9TRVJWRVJfUE9SVAorICBwYWNrZXQudWRwaC5kZXN0ID0gZ3N0YXRlLmNsaWVudF9wb3J0OyAvL0NMSUVOVF9QT1JUCisgIHBhY2tldC51ZHBoLmxlbiA9IGh0b25zKHNpemVvZihkaGNwX3Jhd190KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0gcGFkZGluZyk7CisgIHBhY2tldC5pcGgudG90X2xlbiA9IHBhY2tldC51ZHBoLmxlbjsKKyAgcGFja2V0LnVkcGguY2hlY2sgPSBkaGNwX2NoZWNrc3VtKCZwYWNrZXQsIHNpemVvZihkaGNwX3Jhd190KSAtIHBhZGRpbmcpOworICBwYWNrZXQuaXBoLnRvdF9sZW4gPSBodG9ucyhzaXplb2YoZGhjcF9yYXdfdCkgLSBwYWRkaW5nKTsKKyAgcGFja2V0LmlwaC5paGwgPSBzaXplb2YocGFja2V0LmlwaCkgPj4gMjsKKyAgcGFja2V0LmlwaC52ZXJzaW9uID0gSVBWRVJTSU9OOworICBwYWNrZXQuaXBoLnR0bCA9IElQREVGVFRMOworICBwYWNrZXQuaXBoLmNoZWNrID0gZGhjcF9jaGVja3N1bSgmcGFja2V0LmlwaCwgc2l6ZW9mKHBhY2tldC5pcGgpKTsKKworICByZXN1bHQgPSBzZW5kdG8oZmQsICZwYWNrZXQsIHNpemVvZihkaGNwX3Jhd190KSAtIHBhZGRpbmcsIDAsCisgICAgICAoc3RydWN0IHNvY2thZGRyICopICZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSk7CisKKyAgZGJnKCJzZW5kdG8gJWRcbiIsIHJlc3VsdCk7CisgIGNsb3NlKGZkKTsKKyAgaWYgKHJlc3VsdCA8IDApIGRiZygiUEFDS0VUIHNlbmQgZXJyb3JcbiIpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0Nih2b2lkKQoreworICBpbnQgcmV0OworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGNfYWRkcjsKKyAgc29ja2xlbl90IGNfYWRkcl9zaXplID0gc2l6ZW9mKGNfYWRkcik7CisKKyAgbWVtc2V0KCZnc3RhdGUucmN2ZC5yY3ZkX3BrdDYsIDAsIHNpemVvZihkaGNwNl9tc2dfdCkpOworICByZXQgPSByZWN2ZnJvbShnc3RhdGUubGlzdGVuc29jaywgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Niwgc2l6ZW9mKGRoY3A2X21zZ190KSwKKyAgICAgIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmY19hZGRyLCAmY19hZGRyX3NpemUpOworICBtZW1jcHkoZ3N0YXRlLmNsaWVudF9uaXA2LCAmY19hZGRyLnNpbjZfYWRkciwgc2l6ZW9mKHVpbnQzMl90KSo0KTsKKyAgbWVtY3B5KCZnc3RhdGUuY2xpZW50X3BvcnQsICZjX2FkZHIuc2luNl9wb3J0LCBzaXplb2YodWludDMyX3QpKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICBkYmcoIlBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZy4gXG4iKTsKKyAgICByZXR1cm4gcmV0OyAvLyByZXR1cm5zIC0xCisgIH0KKyAgaWYgKGdzdGF0ZS5yY3ZkLnJjdmRfcGt0Ni5tc2d0eXBlIDwgMSkgeworICAgIGRiZygiQmFkIG1lc3NhZ2UgdHlwZSwgaWdyb25pbmcuIFxuIik7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgZGJnKCJSZWNlaXZlZCBhbiBpcHY2IHBhY2tldC4gU2l6ZSA6ICVkIFxuIiwgcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gUmVhZHMgZnJvbSBVRFAgc29ja2V0CitzdGF0aWMgaW50IHJlYWRfcGFja2V0KHZvaWQpCit7CisgIGludCByZXQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBjX2FkZHI7CisgIHNvY2tsZW5fdCBjX2FkZHJfc2l6ZSA9IHNpemVvZihjX2FkZHIpOworCisgIG1lbXNldCgmZ3N0YXRlLnJjdmQucmN2ZF9wa3QsIDAsIHNpemVvZihkaGNwX21zZ190KSk7CisgIHJldCA9IHJlY3Zmcm9tKGdzdGF0ZS5saXN0ZW5zb2NrLCAmZ3N0YXRlLnJjdmQucmN2ZF9wa3QsIHNpemVvZihkaGNwX21zZ190KSwKKyAgICAgIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmY19hZGRyLCAmY19hZGRyX3NpemUpOworICBtZW1jcHkoJmdzdGF0ZS5jbGllbnRfcG9ydCwgJmNfYWRkci5zaW5fcG9ydCwgc2l6ZW9mKHVpbnQzMl90KSk7CisgIC8qcmV0ID0gcmVhZChnc3RhdGUubGlzdGVuc29jaywgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0LCBzaXplb2YoZGhjcF9tc2dfdCkpOyovCisgIGlmIChyZXQgPCAwKSB7CisgICAgZGJnKCJQYWNrZXQgcmVhZCBlcnJvciwgaWdub3JpbmcuIFxuIik7CisgICAgcmV0dXJuIHJldDsgLy8gcmV0dXJucyAtMQorICB9CisgIGlmIChnc3RhdGUucmN2ZC5yY3ZkX3BrdC5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKyAgICBkYmcoIlBhY2tldCB3aXRoIGJhZCBtYWdpYywgaWdub3JpbmcuIFxuIik7CisgICAgcmV0dXJuIC0yOworICB9CisgIGlmIChnc3RhdGUucmN2ZC5yY3ZkX3BrdC5vcCAhPSAxKSB7IC8vQk9PVFBSRVFVRVNUCisgICAgZGJnKCJOb3QgYSBCT09UIFJFUVVFU1QgaWdub3JpbmcuIFxuIik7CisgICAgcmV0dXJuIC0yOworICB9CisgIGlmIChnc3RhdGUucmN2ZC5yY3ZkX3BrdC5obGVuICE9IDYpIHsKKyAgICBkYmcoImhsZW4gIT0gNiBpZ25vcmluZy4gXG4iKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKyAgZGJnKCJSZWNlaXZlZCBhIHBhY2tldC4gU2l6ZSA6ICVkIFxuIiwgcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gUHJlYXByZXMgYSBkaGNwIHBhY2tldCB3aXRoIGRlZmF1bHRzIGFuZCBjb25maWdzCitzdGF0aWMgdWludDhfdCogcHJlcGFyZV9zZW5kX3BrdCh2b2lkKQoreworICBtZW1zZXQoKHZvaWQqKSZnc3RhdGUuc2VuZC5zZW5kX3BrdCwgMCwgc2l6ZW9mKGdzdGF0ZS5zZW5kLnNlbmRfcGt0KSk7CisgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0Lm9wID0gMjsgLy9CT09UUFJFUExZCisgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0Lmh0eXBlID0gMTsKKyAgZ3N0YXRlLnNlbmQuc2VuZF9wa3QuaGxlbiA9IDY7CisgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0LnhpZCA9IGdzdGF0ZS5yY3ZkLnJjdmRfcGt0LnhpZDsKKyAgZ3N0YXRlLnNlbmQuc2VuZF9wa3QuY29va2llID0gaHRvbmwoREhDUF9NQUdJQyk7CisgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0Lm5zaWFkZHIgPSBnY29uZmlnLnNlcnZlcl9uaXA7CisgIG1lbWNweShnc3RhdGUuc2VuZC5zZW5kX3BrdC5jaGFkZHIsIGdzdGF0ZS5yY3ZkLnJjdmRfcGt0LmNoYWRkciwgMTYpOworICBnc3RhdGUuc2VuZC5zZW5kX3BrdC5vcHRpb25zWzBdID0gREhDUF9PUFRfRU5EOworICByZXR1cm4gZ3N0YXRlLnNlbmQuc2VuZF9wa3Qub3B0aW9uczsKK30KKworc3RhdGljIHVpbnQ4X3QqIHByZXBhcmVfc2VuZF9wa3Q2KHVpbnQxNl90IG9wdCkKK3sKKyAgbWVtc2V0KCh2b2lkKikmZ3N0YXRlLnNlbmQuc2VuZF9wa3Q2LCAwLCBzaXplb2YoZ3N0YXRlLnNlbmQuc2VuZF9wa3Q2KSk7CisgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0Ni5tc2d0eXBlID0gb3B0OworICBtZW1jcHkoZ3N0YXRlLnNlbmQuc2VuZF9wa3Q2LnRyYW5zYWN0aW9uX2lkLCBnc3RhdGUucmN2ZC5yY3ZkX3BrdDYudHJhbnNhY3Rpb25faWQsIDMpOworICByZXR1cm4gZ3N0YXRlLnNlbmQuc2VuZF9wa3Q2Lm9wdGlvbnM7Cit9CisKKy8vIFNldHMgYSBvcHRpb24gdmFsdWUgaW4gZGhjcCBwYWNrZXQncyBvcHRpb24gZmllbGQKK3N0YXRpYyB1aW50OF90KiBzZXRfb3B0dmFsKHVpbnQ4X3QgKm9wdHB0ciwgdWludDE2X3Qgb3B0LCB2b2lkICp2YXIsIHNpemVfdCBsZW4pCit7CisgIHdoaWxlICgqb3B0cHRyICE9IERIQ1BfT1BUX0VORCkgb3B0cHRyKys7CisgICpvcHRwdHIrKyA9ICh1aW50OF90KShvcHQgJiAweDAwRkYpOworICAqb3B0cHRyKysgPSAodWludDhfdCkgbGVuOworICBtZW1jcHkob3B0cHRyLCB2YXIsIGxlbik7CisgIG9wdHB0ciArPSBsZW47CisgICpvcHRwdHIgPSBESENQX09QVF9FTkQ7CisgIHJldHVybiBvcHRwdHI7Cit9CisKK3N0YXRpYyB1aW50OF90KiBzZXRfb3B0dmFsNih1aW50OF90ICpvcHRwdHIsIHVpbnQxNl90IG9wdCwgdm9pZCAqdmFyLCBzaXplX3QgbGVuKQoreworICAqKCh1aW50MTZfdCopb3B0cHRyKSA9IGh0b25zKG9wdCk7CisgICoodWludDE2X3QqKShvcHRwdHIrMikgPSBodG9ucyhsZW4pOworICBtZW1jcHkob3B0cHRyKzQsIHZhciwgbGVuKTsKKyAgb3B0cHRyICs9IGxlbis0OworICByZXR1cm4gb3B0cHRyOworfQorCisvLyBHZXRzIGEgb3B0aW9uIHZhbHVlIGZyb20gZGhjcCBwYWNrZXQncyBvcHRpb24gZmllbGQKK3N0YXRpYyB1aW50OF90KiBnZXRfb3B0dmFsKHVpbnQ4X3QgKm9wdHB0ciwgdWludDE2X3Qgb3B0LCB2b2lkICp2YXIpCit7CisgIHNpemVfdCBsZW47CisgIHVpbnQ4X3Qgb3ZlcmxvYWRlZCA9IDA7CisKKyAgd2hpbGUgKDEpIHsKKyAgICB3aGlsZSAoKm9wdHB0ciA9PSBESENQX09QVF9QQURESU5HKSBvcHRwdHIrKzsKKyAgICBpZiAoKCpvcHRwdHIgJiAweDAwRkYpID09IERIQ1BfT1BUX0VORCkgYnJlYWs7CisgICAgaWYgKCgqb3B0cHRyICYgMHgwMEZGKSA9PSBESENQX09QVF9PUFRJT05fT1ZFUkxPQUQpIHsKKyAgICAgIG92ZXJsb2FkZWQgPSBvcHRwdHJbMl07CisgICAgICBvcHRwdHIgKz0gb3B0cHRyWzFdICsgMjsKKyAgICB9CisgICAgbGVuID0gb3B0cHRyWzFdOworICAgIGlmICgqb3B0cHRyID09IChvcHQgJiAweDAwRkYpKQorICAgICAgc3dpdGNoIChvcHQgJiAweEZGMDApIHsKKyAgICAgICAgY2FzZSBESENQX05VTTMyOiAvLyBGQUxMVEhST1VHSAorICAgICAgICBjYXNlIERIQ1BfSVA6CisgICAgICAgICAgbWVtY3B5KHZhciwgb3B0cHRyKzIsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgIG9wdHB0ciArPSBsZW4gKyAyOworICAgICAgICAgIHJldHVybiBvcHRwdHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREhDUF9OVU0xNjoKKyAgICAgICAgICBtZW1jcHkodmFyLCBvcHRwdHIrMiwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgb3B0cHRyICs9IGxlbiArIDI7CisgICAgICAgICAgcmV0dXJuIG9wdHB0cjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESENQX05VTTg6CisgICAgICAgICAgbWVtY3B5KHZhciwgb3B0cHRyKzIsIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgb3B0cHRyICs9IGxlbiArIDI7CisgICAgICAgICAgcmV0dXJuIG9wdHB0cjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESENQX1NUUklORzoKKyAgICAgICAgICB2YXIgPSB4c3RybmR1cCgoY2hhciopIG9wdHB0ciwgbGVuKTsKKyAgICAgICAgICBvcHRwdHIgKz0gbGVuICsgMjsKKyAgICAgICAgICByZXR1cm4gb3B0cHRyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIG9wdHB0ciArPSBsZW4gKyAyOworICB9CisgIGlmICgob3ZlcmxvYWRlZCA9PSAxKSB8IChvdmVybG9hZGVkID09IDMpKSBnZXRfb3B0dmFsKCh1aW50OF90KikmZ3N0YXRlLnJjdmQucmN2ZF9wa3QuZmlsZSwgb3B0LCB2YXIpOworICBpZiAoKG92ZXJsb2FkZWQgPT0gMikgfCAob3ZlcmxvYWRlZCA9PSAzKSkgZ2V0X29wdHZhbCgodWludDhfdCopJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0LnNuYW1lLCBvcHQsIHZhcik7CisgIHJldHVybiBvcHRwdHI7Cit9CisKK3N0YXRpYyB1aW50OF90KiBnZXRfb3B0dmFsNih1aW50OF90ICpvcHRwdHIsIHVpbnQxNl90IG9wdCwgdWludDE2X3QgKmRhdGFsZW4sIHZvaWQgKip2YXIpCit7CisgIHVpbnQxNl90IG9wdGNvZGU7CisgIHVpbnQxNl90IGxlbjsKKworICBtZW1jcHkoJm9wdGNvZGUsIG9wdHB0ciwgc2l6ZW9mKHVpbnQxNl90KSk7CisgIG1lbWNweSgmbGVuLCBvcHRwdHIrMiwgc2l6ZW9mKHVpbnQxNl90KSk7CisgIGlmKCFvcHRjb2RlKSB7CisgICAgZGJnKCJPcHRpb24gJWQgaXMgbm90IGV4aXN0LlxuIiwgb3B0KTsKKyAgICByZXR1cm4gb3B0cHRyOworICB9CisgIG9wdGNvZGUgPSBudG9ocyhvcHRjb2RlKTsKKyAgbGVuID0gbnRvaHMobGVuKTsKKworICBpZiAob3B0ID09IG9wdGNvZGUpIHsKKyAgICAqdmFyID0geG1hbGxvYyhsZW4pOworICAgIG1lbWNweSgqdmFyLCBvcHRwdHIrNCwgbGVuKTsKKyAgICBvcHRwdHIgPSBvcHRwdHIgKyBsZW4gKyA0OworICAgIG1lbWNweShkYXRhbGVuLCAmbGVuLCBzaXplb2YodWludDE2X3QpKTsKKyAgfQorICBlbHNlIHsKKyAgICBvcHRwdHIgPSBnZXRfb3B0dmFsNihvcHRwdHIrbGVuKzQsIG9wdCwgZGF0YWxlbiwgdmFyKTsKKyAgfQorCisgIHJldHVybiBvcHRwdHI7Cit9CisKKy8vIFJldHJpdmVzIFJlcXVlc3RlZCBQYXJhbWV0ZXIgbGlzdCBmcm9tIGRoY3AgcmVxIHBhY2tldC4KK3N0YXRpYyB1aW50OF90IGdldF9yZXFwYXJhbSh1aW50OF90ICoqbGlzdCkKK3sKKyAgdWludDhfdCBsZW4sICpvcHRwdHI7CisgIGlmKCpsaXN0KSBmcmVlKCpsaXN0KTsKKyAgZm9yIChvcHRwdHIgPSBnc3RhdGUucmN2ZC5yY3ZkX3BrdC5vcHRpb25zOworICAgICAgKm9wdHB0ciAmJiAqb3B0cHRyIT0oKERIQ1BfT1BUX1BBUkFNX1JFUSkgJiAweDAwRkYpOyBvcHRwdHIrPW9wdHB0clsxXSsyKTsKKyAgbGVuID0gKisrb3B0cHRyOworICAqbGlzdCA9IHh6YWxsb2MobGVuKzEpOworICBtZW1jcHkoKmxpc3QsICsrb3B0cHRyLCBsZW4pOworICByZXR1cm4gbGVuOworfQorCisvLyBTZXRzIHZhbHVlcyBvZiByZXEgcGFyYW0gaW4gZGhjcCBvZmZlciBwYWNrZXQuCitzdGF0aWMgdWludDhfdCogc2V0X3JlcXBhcmFtKHVpbnQ4X3QgKm9wdHB0ciwgdWludDhfdCAqbGlzdCkKK3sKKyAgdWludDhfdCByZXFjb2RlOworICBpbnQgY291bnQsIHNpemUgPSBBUlJBWV9MRU4ob3B0aW9uc19saXN0KTsKKworICB3aGlsZSAoKmxpc3QpIHsKKyAgICByZXFjb2RlID0gKmxpc3QrKzsKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzaXplOyBjb3VudCsrKSB7CisgICAgICBpZiAoKG9wdGlvbnNfbGlzdFtjb3VudF0uY29kZSAmIDBYMDBGRik9PXJlcWNvZGUpIHsKKyAgICAgICAgaWYgKCEob3B0aW9uc19saXN0W2NvdW50XS5sZW4pIHx8ICEob3B0aW9uc19saXN0W2NvdW50XS52YWwpKSBicmVhazsKKyAgICAgICAgZm9yICg7ICpvcHRwdHIgJiYgKm9wdHB0ciE9REhDUF9PUFRfRU5EOyBvcHRwdHIrPW9wdHB0clsxXSsyKTsKKyAgICAgICAgKm9wdHB0cisrID0gKHVpbnQ4X3QpIChvcHRpb25zX2xpc3RbY291bnRdLmNvZGUgJiAweDAwRkYpOworICAgICAgICAqb3B0cHRyKysgPSAodWludDhfdCkgb3B0aW9uc19saXN0W2NvdW50XS5sZW47CisgICAgICAgIG1lbWNweShvcHRwdHIsIG9wdGlvbnNfbGlzdFtjb3VudF0udmFsLCBvcHRpb25zX2xpc3RbY291bnRdLmxlbik7CisgICAgICAgIG9wdHB0ciArPSBvcHRpb25zX2xpc3RbY291bnRdLmxlbjsKKyAgICAgICAgKm9wdHB0ciA9IERIQ1BfT1BUX0VORDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvcHRwdHI7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9ub3RpZnkoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBzdGF0IHN0czsKKyAgdm9sYXRpbGUgaW50IGVycm9yID0gMDsKKyAgcGlkX3QgcGlkOworCisgIGlmIChzdGF0KGFyZ3ZbMF0sICZzdHMpID09IC0xICYmIGVycm5vID09IEVOT0VOVCkgeworICAgIGluZm9tc2coaW5mb21vZGUsICJub3RpZnkgZmlsZTogJXMgOiBub3QgZXhpc3QuIiwgYXJndlswXSk7CisgICAgcmV0dXJuOworICB9CisgIGZmbHVzaChOVUxMKTsKKworICBwaWQgPSB2Zm9yaygpOworICBpZiAocGlkIDwgMCkgeworICAgIGRiZygiRm9yayBmYWlsZWQuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwaWQpIHsKKyAgICBleGVjdnAoYXJndlswXSwgYXJndik7CisgICAgZXJyb3IgPSBlcnJubzsKKyAgICBfZXhpdCgxMTEpOworICB9CisgIGlmIChlcnJvcikgeworICAgIHdhaXRwaWQocGlkLCBOVUxMLCAwKTsKKyAgICBlcnJubyA9IGVycm9yOworICB9CisgIGRiZygic2NyaXB0IGNvbXBsZXRlLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xlYXNlZmlsZSh2b2lkKQoreworICBpbnQgZmQ7CisgIHVpbnQzMl90IGN1cnIsIHRtcF90aW1lOworICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgc3RydWN0IGFyZ19saXN0ICpsaXN0ZGxzID0gZ3N0YXRlLmRsZWFzZXM7CisgIGR5bl9sZWFzZSAqZGxzOworCisgIGlmICgoZmQgPSBvcGVuKGdjb25maWcubGVhc2VfZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDYwMCkpIDwgMCkgeworICAgIHBlcnJvcl9tc2coImNhbid0IG9wZW4gJXMgIiwgZ2NvbmZpZy5sZWFzZV9maWxlKTsKKyAgfSBlbHNlIHsKKyAgICBjdXJyID0gdGltZXN0YW1wID0gdGltZShOVUxMKTsKKyAgICB0aW1lc3RhbXAgPSBTV0FQX0JFNjQodGltZXN0YW1wKTsKKyAgICB3cml0ZWFsbChmZCwgJnRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCkpOworCisgICAgd2hpbGUgKGxpc3RkbHMpIHsKKyAgICAgIGRscyA9IChkeW5fbGVhc2UqKWxpc3RkbHMtPmFyZzsKKyAgICAgIHRtcF90aW1lID0gZGxzLT5leHBpcmVzOworICAgICAgZGxzLT5leHBpcmVzIC09IGN1cnI7CisgICAgICBpZiAoKGludDMyX3QpIGRscy0+ZXhwaXJlcyA8IDApIGdvdG8gc2tpcDsKKyAgICAgIGRscy0+ZXhwaXJlcyA9IGh0b25sKGRscy0+ZXhwaXJlcyk7CisgICAgICB3cml0ZWFsbChmZCwgZGxzLCBzaXplb2YoZHluX2xlYXNlKSk7Citza2lwOgorICAgICAgZGxzLT5leHBpcmVzID0gdG1wX3RpbWU7CisgICAgICBsaXN0ZGxzID0gbGlzdGRscy0+bmV4dDsKKyAgICB9CisgICAgY2xvc2UoZmQpOworICAgIGlmIChnY29uZmlnLm5vdGlmeV9maWxlKSB7CisgICAgICBjaGFyICphcmd2WzNdOworICAgICAgYXJndlswXSA9IGdjb25maWcubm90aWZ5X2ZpbGU7CisgICAgICBhcmd2WzFdID0gZ2NvbmZpZy5sZWFzZV9maWxlOworICAgICAgYXJndlsyXSA9IE5VTEw7CisgICAgICBydW5fbm90aWZ5KGFyZ3YpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sZWFzZTZmaWxlKHZvaWQpCit7CisgIGludCBmZDsKKyAgdWludDMyX3QgY3VyciwgdG1wX3RpbWU7CisgIGludDY0X3QgdGltZXN0YW1wOworICBzdHJ1Y3QgYXJnX2xpc3QgKmxpc3RkbHMgPSBnc3RhdGUuZGxlYXNlczsKKyAgZHluX2xlYXNlNiAqZGxzNjsKKworICBpZiAoKGZkID0gb3BlbihnY29uZmlnLmxlYXNlNl9maWxlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjAwKSkgPCAwKSB7CisgICAgcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAlcyAiLCBnY29uZmlnLmxlYXNlNl9maWxlKTsKKyAgfSBlbHNlIHsKKyAgICBjdXJyID0gdGltZXN0YW1wID0gdGltZShOVUxMKTsKKyAgICB0aW1lc3RhbXAgPSBTV0FQX0JFNjQodGltZXN0YW1wKTsKKyAgICB3cml0ZWFsbChmZCwgJnRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCkpOworCisgICAgd2hpbGUgKGxpc3RkbHMpIHsKKyAgICAgIGRsczYgPSAoZHluX2xlYXNlNiopbGlzdGRscy0+YXJnOworICAgICAgdG1wX3RpbWUgPSBkbHM2LT5leHBpcmVzOworICAgICAgZGxzNi0+ZXhwaXJlcyAtPSBjdXJyOworICAgICAgaWYgKChpbnQzMl90KSBkbHM2LT5leHBpcmVzIDwgMCkgZ290byBza2lwOworICAgICAgZGxzNi0+ZXhwaXJlcyA9IGh0b25sKGRsczYtPmV4cGlyZXMpOworICAgICAgd3JpdGVhbGwoZmQsIGRsczYsIHNpemVvZihkeW5fbGVhc2U2KSk7Citza2lwOgorICAgICAgZGxzNi0+ZXhwaXJlcyA9IHRtcF90aW1lOworICAgICAgbGlzdGRscyA9IGxpc3RkbHMtPm5leHQ7CisgICAgfQorICAgIGNsb3NlKGZkKTsKKyAgICBpZiAoZ2NvbmZpZy5ub3RpZnlfZmlsZSkgeworICAgICAgY2hhciAqYXJndlszXTsKKyAgICAgIGFyZ3ZbMF0gPSBnY29uZmlnLm5vdGlmeV9maWxlOworICAgICAgYXJndlsxXSA9IGdjb25maWcubGVhc2U2X2ZpbGU7CisgICAgICBhcmd2WzJdID0gTlVMTDsKKyAgICAgIHJ1bl9ub3RpZnkoYXJndik7CisgICAgfQorICB9Cit9CisKKy8vIFVwZGF0ZSBtYXggbGVhc2UgdGltZSBmcm9tIG9wdGlvbnMuCitzdGF0aWMgdm9pZCBzZXRfbWF4bGVhc2Uodm9pZCkKK3sKKyAgaW50IGNvdW50LCBzaXplID0gQVJSQVlfTEVOKG9wdGlvbnNfbGlzdCk7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemU7IGNvdW50KyspCisgICAgaWYgKG9wdGlvbnNfbGlzdFtjb3VudF0udmFsICYmIG9wdGlvbnNfbGlzdFtjb3VudF0uY29kZSA9PSAoREhDUF9PUFRfTEVBU0VfVElNRSkpIHsKKyAgICAgIGdjb25maWcubWF4X2xlYXNlX3NlYyA9ICooKHVpbnQzMl90KilvcHRpb25zX2xpc3RbY291bnRdLnZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmICghZ2NvbmZpZy5tYXhfbGVhc2Vfc2VjKSBnY29uZmlnLm1heF9sZWFzZV9zZWMgPSAoNjAqNjAqMjQqMTApOy8vIERFRkFVTFRfTEVBU0VfVElNRTsKK30KKworLy8gUmV0dXJucyBsZWFzZSB0aW1lIGZvciBjbGllbnQuCitzdGF0aWMgdWludDMyX3QgZ2V0X2xlYXNlKHVpbnQzMl90IHJlcV9leHApCit7CisgIHVpbnQzMl90IG5vdyA9IHRpbWUoTlVMTCk7CisgIHJlcV9leHAgPSByZXFfZXhwIC0gbm93OworICBpZihhZGRyX3ZlcnNpb24gPT0gQUZfSU5FVDYpIHsKKyAgICBpZiAoKHJlcV9leHAgPD0gMCkgfHwgcmVxX2V4cCA+IGdjb25maWcucHJlZl9saWZldGltZSB8fAorICAgICAgICByZXFfZXhwID4gZ2NvbmZpZy52YWxpZF9saWZldGltZSkgeworICAgICAgaWYgKChnY29uZmlnLnByZWZfbGlmZXRpbWUgPiBnY29uZmlnLnZhbGlkX2xpZmV0aW1lKSkgeworICAgICAgICBlcnJvcl9tc2coIlRoZSB2YWxpZCBsaWZldGltZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJlZmVycmVkIGxpZmV0aW1lLCBcCisgICAgICAgICAgICBzZXR0aW5nIHRvIHZhbGlkIGxpZmV0aW1lIiwgZ2NvbmZpZy52YWxpZF9saWZldGltZSk7CisgICAgICAgIHJldHVybiBnY29uZmlnLnZhbGlkX2xpZmV0aW1lOworICAgICAgfQorICAgICAgcmV0dXJuIGdjb25maWcucHJlZl9saWZldGltZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXFfZXhwIDw9IDApIHx8IChyZXFfZXhwID4gZ2NvbmZpZy5tYXhfbGVhc2Vfc2VjKSkKKyAgICAgIHJldHVybiBnY29uZmlnLm1heF9sZWFzZV9zZWM7CisKKyAgICBpZiAocmVxX2V4cCA8IGdjb25maWcubWluX2xlYXNlX3NlYykKKyAgICAgIHJldHVybiBnY29uZmlnLm1pbl9sZWFzZV9zZWM7CisgIH0KKworICByZXR1cm4gcmVxX2V4cDsKK30KKworc3RhdGljIGludCB2ZXJpZnlpcDZfaW5fbGVhc2UodWludDhfdCAqbmlwNiwgdWludDhfdCAqZHVpZCwgdWludDE2X3QgaWFfdHlwZSwgdWludDMyX3QgaWFpZCkKK3sKKyAgc3RhdGljX2xlYXNlNiAqc2xzNjsKKyAgc3RydWN0IGFyZ19saXN0ICpsaXN0ZGxzOworCisgIGZvciAobGlzdGRscyA9IGdzdGF0ZS5kbGVhc2VzOyBsaXN0ZGxzOyBsaXN0ZGxzID0gbGlzdGRscy0+bmV4dCkgeworICAgIGlmICghbWVtY21wKCgoZHluX2xlYXNlNiopIGxpc3RkbHMtPmFyZyktPmxlYXNlX25pcDYsIG5pcDYsIHNpemVvZih1aW50MzJfdCkqNCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIW1lbWNtcCgoKGR5bl9sZWFzZTYqKSBsaXN0ZGxzLT5hcmcpLT5kdWlkLCBkdWlkLCAoKGR5bl9sZWFzZTYqKSBsaXN0ZGxzLT5hcmcpLT5kdWlkX2xlbikKKyAgICAgICAgJiYgKChkeW5fbGVhc2U2KikgbGlzdGRscy0+YXJnKS0+aWFfdHlwZSA9PSBpYV90eXBlKSAKKyAgICAgIHJldHVybiAtMTsKKyAgfQorICBmb3IgKHNsczYgPSBnc3RhdGUubGVhc2VzLnNsZWFzZXM2OyBzbHM2OyBzbHM2ID0gc2xzNi0+bmV4dCkKKyAgICBpZiAobWVtY21wKHNsczYtPm5pcDYsIG5pcDYsIHNpemVvZih1aW50MzJfdCkqNCk9PTApIHJldHVybiAtMjsKKworICBpZiAobWVtY21wKG5pcDYsIGdjb25maWcuc3RhcnRfaXA2LCBzaXplb2YodWludDMyX3QpKjQpIDwgMCB8fAorICAgICAgbWVtY21wKG5pcDYsIGdjb25maWcuZW5kX2lwNiwgc2l6ZW9mKHVpbnQzMl90KSo0KSA+IDApCisgICAgcmV0dXJuIC0zOworCisgIHJldHVybiAwOworfQorCisvLyBWZXJpZnkgaXAgTklQIGluIGN1cnJlbnQgbGVhc2VzICggYXNzaWduZWQgb3Igbm90KQorc3RhdGljIGludCB2ZXJpZnlpcF9pbl9sZWFzZSh1aW50MzJfdCBuaXAsIHVpbnQ4X3QgbWFjWzZdKQoreworICBzdGF0aWNfbGVhc2UgKnNsczsKKyAgc3RydWN0IGFyZ19saXN0ICpsaXN0ZGxzOworCisgIGZvciAobGlzdGRscyA9IGdzdGF0ZS5kbGVhc2VzOyBsaXN0ZGxzOyBsaXN0ZGxzID0gbGlzdGRscy0+bmV4dCkgeworICAgIGlmICgoKGR5bl9sZWFzZSopIGxpc3RkbHMtPmFyZyktPmxlYXNlX25pcCA9PSBuaXApIHsKKyAgICAgIGlmICgoKGludDMyX3QpKCgoZHluX2xlYXNlKikgbGlzdGRscy0+YXJnKS0+ZXhwaXJlcykgLSB0aW1lKE5VTEwpKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIW1lbWNtcCgoKGR5bl9sZWFzZSopIGxpc3RkbHMtPmFyZyktPmxlYXNlX21hYywgbWFjLCA2KSkgcmV0dXJuIC0xOworICB9CisgIGZvciAoc2xzID0gZ3N0YXRlLmxlYXNlcy5zbGVhc2VzOyBzbHM7IHNscyA9IHNscy0+bmV4dCkKKyAgICBpZiAoc2xzLT5uaXAgPT0gbmlwKSByZXR1cm4gLTI7CisKKyAgaWYgKChudG9obChuaXApIDwgZ2NvbmZpZy5zdGFydF9pcCkgfHwgKG50b2hsKG5pcCkgPiBnY29uZmlnLmVuZF9pcCkpCisgICAgcmV0dXJuIC0zOworCisgIHJldHVybiAwOworfQorCisvLyBhZGQgaXAgYXNzaWduZWRfbmlwIHRvIGR5bmFtaWMgbGVhc2UuCitzdGF0aWMgaW50IGFkZGlwX3RvX2xlYXNlKHVpbnQzMl90IGFzc2lnbmVkX25pcCwgdWludDhfdCBtYWNbNl0sIHVpbnQzMl90ICpyZXFfZXhwLCBjaGFyICpob3N0bmFtZSwgdWludDhfdCB1cGRhdGUpCit7CisgIGR5bl9sZWFzZSAqZGxzOworICBzdHJ1Y3QgYXJnX2xpc3QgKmxpc3RkbHMgPSBnc3RhdGUuZGxlYXNlczsKKyAgdWludDMyX3Qgbm93ID0gdGltZShOVUxMKTsKKworICB3aGlsZSAobGlzdGRscykgeworICAgIGlmICghbWVtY21wKCgoZHluX2xlYXNlKikgbGlzdGRscy0+YXJnKS0+bGVhc2VfbWFjLCBtYWMsIDYpKSB7CisgICAgICBpZiAodXBkYXRlKSAqcmVxX2V4cCA9IGdldF9sZWFzZSgqcmVxX2V4cCArICgoZHluX2xlYXNlKikgbGlzdGRscy0+YXJnKS0+ZXhwaXJlcyk7CisgICAgICAoKGR5bl9sZWFzZSopIGxpc3RkbHMtPmFyZyktPmV4cGlyZXMgPSAqcmVxX2V4cCArIG5vdzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsaXN0ZGxzID0gbGlzdGRscy0+bmV4dDsKKyAgfQorCisgIGRscyA9IHh6YWxsb2Moc2l6ZW9mKGR5bl9sZWFzZSkpOworICBtZW1jcHkoZGxzLT5sZWFzZV9tYWMsIG1hYywgNik7CisgIGRscy0+bGVhc2VfbmlwID0gYXNzaWduZWRfbmlwOworICBpZiAoaG9zdG5hbWUpIG1lbWNweShkbHMtPmhvc3RuYW1lLCBob3N0bmFtZSwgMjApOworCisgIGlmICh1cGRhdGUpICpyZXFfZXhwID0gZ2V0X2xlYXNlKCpyZXFfZXhwICsgbm93KTsKKyAgZGxzLT5leHBpcmVzID0gKnJlcV9leHAgKyBub3c7CisKKyAgbGlzdGRscyA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICBsaXN0ZGxzLT5uZXh0ID0gZ3N0YXRlLmRsZWFzZXM7CisgIGxpc3RkbHMtPmFyZyA9IChjaGFyKilkbHM7CisgIGdzdGF0ZS5kbGVhc2VzID0gbGlzdGRsczsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRpcDZfdG9fbGVhc2UodWludDhfdCAqYXNzaWduZWRfbmlwLCB1aW50OF90ICpkdWlkLCB1aW50MTZfdCBkdWlkX2xlbiwgdWludDE2X3QgaWFfdHlwZSwgdWludDMyX3QgaWFpZCwgdWludDMyX3QgKmxpZmV0aW1lLCB1aW50OF90IHVwZGF0ZSkKK3sKKyAgZHluX2xlYXNlNiAqZGxzNjsKKyAgc3RydWN0IGFyZ19saXN0ICpsaXN0ZGxzID0gZ3N0YXRlLmRsZWFzZXM7CisgIHVpbnQzMl90IG5vdyA9IHRpbWUoTlVMTCk7CisKKyAgd2hpbGUgKGxpc3RkbHMpIHsKKyAgICBpZiAoIW1lbWNtcCgoKGR5bl9sZWFzZTYqKSBsaXN0ZGxzLT5hcmcpLT5kdWlkLCBkdWlkLCAoKGR5bl9sZWFzZTYqKSBsaXN0ZGxzLT5hcmcpLT5kdWlkX2xlbikpIHsKKyAgICAgIGlmICh1cGRhdGUpICpsaWZldGltZSA9IGdldF9sZWFzZSgqbGlmZXRpbWUgKyAoKGR5bl9sZWFzZTYqKSBsaXN0ZGxzLT5hcmcpLT5leHBpcmVzKTsKKyAgICAgICgoZHluX2xlYXNlNiopIGxpc3RkbHMtPmFyZyktPmV4cGlyZXMgPSAqbGlmZXRpbWUgKyBub3c7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGlzdGRscyA9IGxpc3RkbHMtPm5leHQ7CisgIH0KKworICBkbHM2ID0geHphbGxvYyhzaXplb2YoZHluX2xlYXNlNikpOworICBkbHM2LT5kdWlkX2xlbiA9IGR1aWRfbGVuOyAKKyAgbWVtY3B5KGRsczYtPmR1aWQsIGR1aWQsIGR1aWRfbGVuKTsKKyAgZGxzNi0+aWFfdHlwZSA9IGlhX3R5cGU7CisgIGRsczYtPmlhaWQgPSBpYWlkOworICBtZW1jcHkoZGxzNi0+bGVhc2VfbmlwNiwgYXNzaWduZWRfbmlwLCBzaXplb2YodWludDMyX3QpKjQpOworICAKKyAgaWYgKHVwZGF0ZSkgKmxpZmV0aW1lID0gZ2V0X2xlYXNlKCpsaWZldGltZSArIG5vdyk7CisgIGRsczYtPmV4cGlyZXMgPSAqbGlmZXRpbWUgKyBub3c7CisKKyAgbGlzdGRscyA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICBsaXN0ZGxzLT5uZXh0ID0gZ3N0YXRlLmRsZWFzZXM7CisgIGxpc3RkbHMtPmFyZyA9IChjaGFyKilkbHM2OworICBnc3RhdGUuZGxlYXNlcyA9IGxpc3RkbHM7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGRlbGV0ZSBpcCBhc3NpZ25lZF9uaXAgZnJvbSBkeW5hbWljIGxlYXNlLgorc3RhdGljIGludCBkZWxpcF9mcm9tX2xlYXNlKHVpbnQzMl90IGFzc2lnbmVkX25pcCwgdWludDhfdCBtYWNbNl0sIHVpbnQzMl90IGRlbF90aW1lKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmxpc3RkbHMgPSBnc3RhdGUuZGxlYXNlczsKKworICB3aGlsZSAobGlzdGRscykgeworICAgIGlmICghbWVtY21wKCgoZHluX2xlYXNlKikgbGlzdGRscy0+YXJnKS0+bGVhc2VfbWFjLCBtYWMsIDYpKSB7CisgICAgICAoKGR5bl9sZWFzZSopIGxpc3RkbHMtPmFyZyktPmV4cGlyZXMgPSBkZWxfdGltZSArIHRpbWUoTlVMTCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbGlzdGRscyA9IGxpc3RkbHMtPm5leHQ7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvLyByZXR1cm5zIGEgSVAgZnJvbSBzdGF0aWMsIGR5bmFtaWMgbGVhc2VzIG9yIGZyZWUgaXAgcG9vbCwgMCBvdGhlcndpc2UuCitzdGF0aWMgdWludDMyX3QgZ2V0aXBfZnJvbV9wb29sKHVpbnQzMl90IHJlcV9uaXAsIHVpbnQ4X3QgbWFjWzZdLCB1aW50MzJfdCAqcmVxX2V4cCwgY2hhciAqaG9zdG5hbWUpCit7CisgIHVpbnQzMl90IG5pcCA9IDA7CisgIHN0YXRpY19sZWFzZSAqc2xzID0gZ3N0YXRlLmxlYXNlcy5zbGVhc2VzOworICBzdHJ1Y3QgYXJnX2xpc3QgKmxpc3RkbHMgPSBnc3RhdGUuZGxlYXNlcywgKnRtcCA9IE5VTEw7CisKKyAgaWYgKHJlcV9uaXAgJiYgKCF2ZXJpZnlpcF9pbl9sZWFzZShyZXFfbmlwLCBtYWMpKSkgbmlwID0gcmVxX25pcDsKKworICBpZiAoIW5pcCkgeworICAgIHdoaWxlIChsaXN0ZGxzKSB7CisgICAgICBpZiAoIW1lbWNtcCgoKGR5bl9sZWFzZSopbGlzdGRscy0+YXJnKS0+bGVhc2VfbWFjLCBtYWMsIDYpKSB7CisgICAgICAgIG5pcCA9ICgoZHluX2xlYXNlKilsaXN0ZGxzLT5hcmcpLT5sZWFzZV9uaXA7CisgICAgICAgIGlmICh0bXApIHRtcC0+bmV4dCA9IGxpc3RkbHMtPm5leHQ7CisgICAgICAgIGVsc2UgZ3N0YXRlLmRsZWFzZXMgPSBsaXN0ZGxzLT5uZXh0OworICAgICAgICBmcmVlKGxpc3RkbHMtPmFyZyk7CisgICAgICAgIGZyZWUobGlzdGRscyk7CisgICAgICAgIGlmICh2ZXJpZnlpcF9pbl9sZWFzZShuaXAsIG1hYykgPCAwKSBuaXAgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRtcCA9IGxpc3RkbHM7CisgICAgICBsaXN0ZGxzID0gbGlzdGRscy0+bmV4dDsKKyAgICB9CisgIH0KKyAgaWYgKCFuaXApIHsKKyAgICB3aGlsZSAoc2xzKSB7CisgICAgICBpZiAobWVtY21wKHNscy0+bWFjLCBtYWMsIDYpID09IDApIHsKKyAgICAgICAgbmlwID0gc2xzLT5uaXA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2xzID0gc2xzLT5uZXh0OworICAgIH0KKyAgfQorICBpZiAoIW5pcCkgeworICAgIGZvciAobmlwID0gaHRvbmwoZ2NvbmZpZy5zdGFydF9pcCk7IG50b2hsKG5pcCkgPD0gZ2NvbmZpZy5lbmRfaXA7ICkgeworICAgICAgaWYgKCF2ZXJpZnlpcF9pbl9sZWFzZShuaXAsIG1hYykpIGJyZWFrOworICAgICAgbmlwID0gbnRvaGwobmlwKTsKKyAgICAgIG5pcCA9IGh0b25sKCsrbmlwKTsKKyAgICB9CisgICAgaWYgKG50b2hsKG5pcCkgPiBnY29uZmlnLmVuZF9pcCkgeworICAgICAgbmlwID0gMDsKKyAgICAgIGluZm9tc2coaW5mb21vZGUsICJjYW4ndCBmaW5kIGZyZWUgSVAgaW4gSVAgUG9vbC4iKTsKKyAgICB9CisgIH0KKyAgaWYgKG5pcCkgYWRkaXBfdG9fbGVhc2UobmlwLCBtYWMsIHJlcV9leHAsIGhvc3RuYW1lLCAxKTsKKyAgcmV0dXJuIG5pcDsKK30KKworc3RhdGljIHVpbnQ4X3QgKmdldGlwNl9mcm9tX3Bvb2wodWludDhfdCAqZHVpZCwgdWludDE2X3QgZHVpZF9sZW4sIHVpbnQxNl90IGlhX3R5cGUsIHVpbnQzMl90IGlhaWQsIHVpbnQzMl90ICpsaWZldGltZSkKK3sKKyAgc3RhdGljIHVpbnQ4X3QgbmlwNlsxNl0gPSB7MCwgfTsKKyAgc3RhdGljX2xlYXNlNiAqc2xzNiA9IGdzdGF0ZS5sZWFzZXMuc2xlYXNlczY7CisgIHN0cnVjdCBhcmdfbGlzdCAqbGlzdGRsczYgPSBnc3RhdGUuZGxlYXNlcywgKnRtcCA9IE5VTEw7CisKKyAgd2hpbGUobGlzdGRsczYpIHsKKyAgICBpZiAoIW1lbWNtcCgoKGR5bl9sZWFzZTYqKWxpc3RkbHM2LT5hcmcpLT5kdWlkLCBkdWlkLCBkdWlkX2xlbikpIHsKKyAgICAgIG1lbWNweShuaXA2LCAoKGR5bl9sZWFzZTYqKWxpc3RkbHM2LT5hcmcpLT5sZWFzZV9uaXA2LCBzaXplb2YobmlwNikpOworICAgICAgaWYodG1wKSB0bXAtPm5leHQgPSBsaXN0ZGxzNi0+bmV4dDsKKyAgICAgIGVsc2UgZ3N0YXRlLmRsZWFzZXMgPSBsaXN0ZGxzNi0+bmV4dDsKKyAgICAgIGZyZWUobGlzdGRsczYtPmFyZyk7CisgICAgICBmcmVlKGxpc3RkbHM2KTsKKworICAgICAgaWYodmVyaWZ5aXA2X2luX2xlYXNlKG5pcDYsIGR1aWQsIGlhX3R5cGUsIGlhaWQpIDwgMCkKKyAgICAgICAgbWVtc2V0KG5pcDYsIDAsIHNpemVvZihuaXA2KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdG1wID0gbGlzdGRsczY7CisgICAgbGlzdGRsczYgPSBsaXN0ZGxzNi0+bmV4dDsKKyAgfQorCisgIGlmKCFtZW1jbXAobmlwNiwgKHVpbnQ4X3RbMTZdKXswfSwgc2l6ZW9mKHVpbnQzMl90KSo0KSkgeworICAgIHdoaWxlKHNsczYpIHsKKyAgICAgIGlmKCFtZW1jbXAoc2xzNi0+ZHVpZCwgZHVpZCwgNikpIHsKKyAgICAgICAgbWVtY3B5KG5pcDYsIHNsczYtPm5pcDYsIHNpemVvZihuaXA2KSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2xzNiA9IHNsczYtPm5leHQ7CisgICAgfQorICB9CisKKyAgaWYoIW1lbWNtcChuaXA2LCAodWludDhfdFsxNl0pezB9LCBzaXplb2YodWludDMyX3QpKjQpKSB7CisgICAgbWVtY3B5KG5pcDYsIGdjb25maWcuc3RhcnRfaXA2LCBzaXplb2YobmlwNikpOworICAgIHdoaWxlKG1lbWNtcChuaXA2LCBnY29uZmlnLmVuZF9pcDYsIHNpemVvZihuaXA2KSkgPCAwKSB7CisgICAgICBpZighdmVyaWZ5aXA2X2luX2xlYXNlKG5pcDYsIGR1aWQsIGlhX3R5cGUsIGlhaWQpKSBicmVhazsKKyAgICAgIGludCBpPXNpemVvZihuaXA2KTsKKyAgICAgIHdoaWxlKGktLSkgeworICAgICAgICArK25pcDZbaV07CisgICAgICAgIGlmICghbmlwNltpXSkgeworICAgICAgICAgIGlmKGk9PShzaXplb2YobmlwNiktMSkpICsrbmlwNltpXTsKKyAgICAgICAgICArK25pcDZbaS0xXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWNtcChuaXA2LCBnY29uZmlnLmVuZF9pcDYsIHNpemVvZihuaXA2KSkgPiAwKSB7CisgICAgICBtZW1zZXQobmlwNiwgMCwgc2l6ZW9mKG5pcDYpKTsKKyAgICAgIGluZm9tc2coaW5mb21vZGUsICJjYW4ndCBmaW5kIGZyZWUgSVAgaW4gSVB2NiBQb29sLiIpOworICAgIH0KKyAgfQorCisgIGlmKG1lbWNtcChuaXA2LCAodWludDhfdFsxNl0pezB9LCBzaXplb2YodWludDMyX3QpKjQpKSB7CisgICAgYWRkaXA2X3RvX2xlYXNlKG5pcDYsIGR1aWQsIGR1aWRfbGVuLCBpYV90eXBlLCBpYWlkLCBsaWZldGltZSwgMSk7CisgICAgaW5mb21zZyhpbmZvbW9kZSwgIkFzc2lnbmVkIElQdjYgJTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlg6JTAyWCUwMlgiLAorICAgICAgICBuaXA2WzBdLCBuaXA2WzFdLCBuaXA2WzJdLCBuaXA2WzNdLCBuaXA2WzRdLCBuaXA2WzVdLCBuaXA2WzZdLCBuaXA2WzddLCBuaXA2WzhdLAorICAgICAgICBuaXA2WzldLCBuaXA2WzEwXSwgbmlwNlsxMV0sIG5pcDZbMTJdLCBuaXA2WzEzXSwgbmlwNlsxNF0sIG5pcDZbMTVdKTsKKyAgfQorICByZXR1cm4gbmlwNjsKK30KKworc3RhdGljIHZvaWQgcmVhZF9sZWFzZWZpbGUodm9pZCkKK3sKKyAgdWludDMyX3QgcGFzc2VkLCBpcDsKKyAgaW50MzJfdCB0bXBfdGltZTsKKyAgaW50NjRfdCB0aW1lc3RhbXA7CisgIGR5bl9sZWFzZSAqZGxzOworICBpbnQgZmQgPSBvcGVuKGdjb25maWcubGVhc2VfZmlsZSwgT19SRE9OTFkpOworCisgIGRscyA9IHh6YWxsb2Moc2l6ZW9mKGR5bl9sZWFzZSkpOworCisgIGlmIChyZWFkKGZkLCAmdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSkgIT0gc2l6ZW9mKHRpbWVzdGFtcCkpCisgICAgZ290byBsZWFzZV9lcnJvcl9leGl0OworCisgIHRpbWVzdGFtcCA9IFNXQVBfQkU2NCh0aW1lc3RhbXApOworICBwYXNzZWQgPSB0aW1lKE5VTEwpIC0gdGltZXN0YW1wOworICBpZiAoKHVpbnQ2NF90KXBhc3NlZCA+IDEyICogNjAgKiA2MCkgZ290byBsZWFzZV9lcnJvcl9leGl0OworCisgIHdoaWxlIChyZWFkKGZkLCBkbHMsIHNpemVvZihkeW5fbGVhc2UpKSA9PSBzaXplb2YoZHluX2xlYXNlKSkgeworICAgIGlwID0gbnRvaGwoZGxzLT5sZWFzZV9uaXApOworICAgIGlmIChpcCA+PSBnY29uZmlnLnN0YXJ0X2lwICYmIGlwIDw9IGdjb25maWcuZW5kX2lwKSB7CisgICAgICB0bXBfdGltZSA9IG50b2hsKGRscy0+ZXhwaXJlcykgLSBwYXNzZWQ7CisgICAgICBpZiAodG1wX3RpbWUgPCAwKSBjb250aW51ZTsKKyAgICAgIGFkZGlwX3RvX2xlYXNlKGRscy0+bGVhc2VfbmlwLCBkbHMtPmxlYXNlX21hYywKKyAgICAgICAgICAodWludDMyX3QqKSZ0bXBfdGltZSwgZGxzLT5ob3N0bmFtZSwgMCk7CisgICAgfQorICB9CitsZWFzZV9lcnJvcl9leGl0OgorICBmcmVlKGRscyk7CisgIGNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9sZWFzZTZmaWxlKHZvaWQpCit7CisgIHVpbnQzMl90IHBhc3NlZDsKKyAgdWludDMyX3QgdG1wX3RpbWU7CisgIGludDY0X3QgdGltZXN0YW1wOworICBkeW5fbGVhc2U2ICpkbHM2OworICBpbnQgZmQgPSBvcGVuKGdjb25maWcubGVhc2U2X2ZpbGUsIE9fUkRPTkxZKTsKKworICBkbHM2ID0geHphbGxvYyhzaXplb2YoZHluX2xlYXNlNikpOworCisgIGlmIChyZWFkKGZkLCAmdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSkgIT0gc2l6ZW9mKHRpbWVzdGFtcCkpCisgICAgZ290byBsZWFzZTZfZXJyb3JfZXhpdDsKKworICB0aW1lc3RhbXAgPSBTV0FQX0JFNjQodGltZXN0YW1wKTsKKyAgcGFzc2VkID0gdGltZShOVUxMKSAtIHRpbWVzdGFtcDsKKyAgaWYgKCh1aW50NjRfdClwYXNzZWQgPiAxMiAqIDYwICogNjApIGdvdG8gbGVhc2U2X2Vycm9yX2V4aXQ7CisKKyAgd2hpbGUgKHJlYWQoZmQsIGRsczYsIHNpemVvZihkeW5fbGVhc2U2KSkgPT0gc2l6ZW9mKGR5bl9sZWFzZTYpKSB7CisgICAgaWYgKG1lbWNtcChkbHM2LT5sZWFzZV9uaXA2LCBnY29uZmlnLnN0YXJ0X2lwNiwgc2l6ZW9mKHVpbnQzMl90KSo0KSA+IDAgJiYKKyAgICAgICAgbWVtY21wKGRsczYtPmxlYXNlX25pcDYsIGdjb25maWcuZW5kX2lwNiwgc2l6ZW9mKHVpbnQzMl90KSo0KSA8IDApIHsKKyAgICAgIHRtcF90aW1lID0gbnRvaGwoZGxzNi0+ZXhwaXJlcykgLSBwYXNzZWQ7CisgICAgICBpZiAodG1wX3RpbWUgPCAwVSkgY29udGludWU7CisgICAgICBhZGRpcDZfdG9fbGVhc2UoZGxzNi0+bGVhc2VfbmlwNiwgZGxzNi0+ZHVpZCwgZGxzNi0+ZHVpZF9sZW4sIGRsczYtPmlhX3R5cGUsIGRsczYtPmlhaWQsCisgICAgICAgICAgKHVpbnQzMl90KikmdG1wX3RpbWUsIDApOworICAgIH0KKyAgfQorCitsZWFzZTZfZXJyb3JfZXhpdDoKKyAgZnJlZShkbHM2KTsKKyAgY2xvc2UoZmQpOworfQorCit2b2lkIGRoY3BkX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZXR2YWwsIGk7CisgIHVpbnQ4X3QgKm9wdHB0ciwgbXNndHlwZSA9IDA7CisgIHVpbnQxNl90IG9wdGxlbiA9IDA7CisgIHVpbnQzMl90IHdhaXRlZCA9IDAsIHNlcnZlcmlkID0gMCwgcmVxdWVzdGVkX25pcCA9IDA7CisgIHVpbnQ4X3QgdHJhbnNhY3Rpb25pZFszXSA9IHswLH07CisgIHVpbnQzMl90IHJlcWVzdGVkX2xlYXNlID0gMCwgaXBfcG9vbF9zaXplID0gMDsKKyAgY2hhciAqaHN0bmFtZSA9IE5VTEw7CisgIGZkX3NldCByZmRzOworCisgIGluZm9tb2RlID0gTE9HX0NPTlNPTEU7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSB7CisgICAgZGFlbW9uKDAsMCk7CisgICAgaW5mb21vZGUgPSBMT0dfU0lMRU5UOworICB9CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19TKSB7CisgICAgICAgIG9wZW5sb2coIlVESENQRCA6IiwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisgICAgICAgIGluZm9tb2RlIHw9IExPR19TWVNURU07CisgIH0KKyAgc2V0bGluZWJ1ZihzdGRvdXQpOworICAvL0RIQ1BEX0NPTkZfRklMRQorICBwYXJzZV9zZXJ2ZXJfY29uZmlnKCh0b3lzLm9wdGM9PTEpP3RveXMub3B0YXJnc1swXToiL2V0Yy9kaGNwZC5jb25mIiwga2V5d29yZHMpOworICBpbmZvbXNnKGluZm9tb2RlLCAidG95Ym94IGRoY3BkIHN0YXJ0ZWQiKTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfNil7CisgICAgYWRkcl92ZXJzaW9uID0gQUZfSU5FVDY7CisgICAgZ2NvbmZpZy50MSA9IG50b2hsKGdjb25maWcudDEpOworICAgIGdjb25maWcudDIgPSBudG9obChnY29uZmlnLnQyKTsKKyAgICBnY29uZmlnLnByZWZfbGlmZXRpbWUgPSBudG9obChnY29uZmlnLnByZWZfbGlmZXRpbWUpOworICAgIGdjb25maWcudmFsaWRfbGlmZXRpbWUgPSBudG9obChnY29uZmlnLnZhbGlkX2xpZmV0aW1lKTsKKyAgICBnY29uZmlnLnBvcnQgPSA1NDc7CisgICAgZm9yKGk9MDtpPDQ7aSsrKQorICAgICAgaXBfcG9vbF9zaXplICs9IChnY29uZmlnLmVuZF9pcDZbaV0tZ2NvbmZpZy5zdGFydF9pcDZbaV0pPDwoKDMtaSkqOCk7CisgIH0gZWxzZSB7CisgICAgZ2NvbmZpZy5zdGFydF9pcCA9IG50b2hsKGdjb25maWcuc3RhcnRfaXApOworICAgIGdjb25maWcuZW5kX2lwID0gbnRvaGwoZ2NvbmZpZy5lbmRfaXApOworICAgIGlwX3Bvb2xfc2l6ZSA9IGdjb25maWcuZW5kX2lwIC0gZ2NvbmZpZy5zdGFydF9pcCArIDE7CisgIH0KKworICBpZiAoZ2NvbmZpZy5tYXhfbGVhc2VzID4gaXBfcG9vbF9zaXplKSB7CisgICAgZXJyb3JfbXNnKCJtYXhfbGVhc2VzPSV1IGlzIHRvbyBiaWcsIHNldHRpbmcgdG8gJXUiLAorICAgICAgICAodW5zaWduZWQpIGdjb25maWcubWF4X2xlYXNlcywgaXBfcG9vbF9zaXplKTsKKyAgICBnY29uZmlnLm1heF9sZWFzZXMgPSBpcF9wb29sX3NpemU7CisgIH0KKyAgd3JpdGVfcGlkKGdjb25maWcucGlkZmlsZSk7CisgIHNldF9tYXhsZWFzZSgpOworICBpZihUVC5pZmFjZSkgZ2NvbmZpZy5pbnRlcmZhY2UgPSBUVC5pZmFjZTsKKyAgaWYoVFQucG9ydCkgZ2NvbmZpZy5wb3J0ID0gVFQucG9ydDsKKyAgKGFkZHJfdmVyc2lvbj09QUZfSU5FVDYpID8gcmVhZF9sZWFzZTZmaWxlKCkgOiByZWFkX2xlYXNlZmlsZSgpOworCisKKyAgaWYgKGdldF9pbnRlcmZhY2UoZ2NvbmZpZy5pbnRlcmZhY2UsICZnY29uZmlnLmlmaW5kZXgsCisgICAgICAgIChhZGRyX3ZlcnNpb249PUFGX0lORVQ2KT8gKHZvaWQqKWdjb25maWcuc2VydmVyX25pcDYgOgorICAgICAgICAodm9pZCopJmdjb25maWcuc2VydmVyX25pcCwgZ2NvbmZpZy5zZXJ2ZXJfbWFjKSA8IDApCisgICAgcGVycm9yX2V4aXQoIkZhaWxlZCB0byBnZXQgaW50ZXJmYWNlICVzIiwgZ2NvbmZpZy5pbnRlcmZhY2UpOworICBzZXR1cF9zaWduYWwoKTsKKyAgaWYgKGFkZHJfdmVyc2lvbj09QUZfSU5FVDYpIHsKKyAgICBvcGVuX2xpc3RlbnNvY2s2KCk7CisgIH0gZWxzZSB7CisgICAgZ2NvbmZpZy5zZXJ2ZXJfbmlwID0gaHRvbmwoZ2NvbmZpZy5zZXJ2ZXJfbmlwKTsKKyAgICBvcGVuX2xpc3RlbnNvY2soKTsKKyAgfQorCisgIGZjbnRsKGdzdGF0ZS5saXN0ZW5zb2NrLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworICBmb3IgKDs7KSB7CisgICAgdWludDMyX3QgdGltZXN0bXAgPSB0aW1lKE5VTEwpOworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1NFVChnc3RhdGUubGlzdGVuc29jaywgJnJmZHMpOworICAgIEZEX1NFVChzaWdmZC5yZCwgJnJmZHMpOworICAgIHR2LnR2X3NlYyA9IGdjb25maWcuYXV0b190aW1lIC0gd2FpdGVkOworICAgIHR2LnR2X3VzZWMgPSAwOworICAgIHJldHZhbCA9IDA7CisgICAgc2VydmVyaWQgPSAwOworICAgIG1zZ3R5cGUgPSAwOworCisgICAgaW50IG1heGZkID0gKHNpZ2ZkLnJkID4gZ3N0YXRlLmxpc3RlbnNvY2spPyBzaWdmZC5yZCA6IGdzdGF0ZS5saXN0ZW5zb2NrOworICAgIGRiZygic2VsZWN0IHdhaXRpbmcgLi4uLlxuIik7CisgICAgcmV0dmFsID0gc2VsZWN0KG1heGZkICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsIChnY29uZmlnLmF1dG9fdGltZT8mdHY6TlVMTCkpOworICAgIGlmIChyZXR2YWwgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgd2FpdGVkICs9ICh1bnNpZ25lZCkgdGltZShOVUxMKSAtIHRpbWVzdG1wOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRiZygiRXJyb3IgaW4gc2VsZWN0IHdhaXQgYWdhaW4uLi5cbiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghcmV0dmFsKSB7IC8vIFRpbWVkIG91dCAKKyAgICAgIGRiZygic2VsZWN0IHdhaXQgVGltZWQgT3V0Li4uXG4iKTsKKyAgICAgIHdhaXRlZCA9IDA7CisgICAgICAoYWRkcl92ZXJzaW9uID09IEFGX0lORVQ2KT8gd3JpdGVfbGVhc2U2ZmlsZSgpIDogd3JpdGVfbGVhc2VmaWxlKCk7CisgICAgICBpZiAoZ2V0X2ludGVyZmFjZShnY29uZmlnLmludGVyZmFjZSwgJmdjb25maWcuaWZpbmRleCwKKyAgICAgICAgICAgIChhZGRyX3ZlcnNpb249PUFGX0lORVQ2KT8gKHZvaWQqKWdjb25maWcuc2VydmVyX25pcDYgOgorICAgICAgICAgICAgKHZvaWQqKSZnY29uZmlnLnNlcnZlcl9uaXAsIGdjb25maWcuc2VydmVyX21hYyk8MCkKKyAgICAgICAgcGVycm9yX2V4aXQoIkZhaWxlZCB0byBnZXQgaW50ZXJmYWNlICVzIiwgZ2NvbmZpZy5pbnRlcmZhY2UpOworICAgICAgaWYoYWRkcl92ZXJzaW9uICE9IEFGX0lORVQ2KSB7CisgICAgICAgIGdjb25maWcuc2VydmVyX25pcCA9IGh0b25sKGdjb25maWcuc2VydmVyX25pcCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKEZEX0lTU0VUKHNpZ2ZkLnJkLCAmcmZkcykpIHsgLy8gU29tZSBBY3Rpdml0eSBvbiBSREZEcyA6IGlzIHNpZ25hbCAKKyAgICAgIHVuc2lnbmVkIGNoYXIgc2lnOworICAgICAgaWYgKHJlYWQoc2lnZmQucmQsICZzaWcsIDEpICE9IDEpIHsKKyAgICAgICAgZGJnKCJzaWduYWwgcmVhZCBmYWlsZWQuXG4iKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzd2l0Y2ggKHNpZykgeworICAgICAgICBjYXNlIFNJR1VTUjE6CisgICAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgIlJlY2VpdmVkIFNJR1VTUjEiKTsKKyAgICAgICAgICAoYWRkcl92ZXJzaW9uPT1BRl9JTkVUNik/IHdyaXRlX2xlYXNlNmZpbGUoKSA6IHdyaXRlX2xlYXNlZmlsZSgpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIFNJR1RFUk06CisgICAgICAgICAgaW5mb21zZyhpbmZvbW9kZSwgInJlY2VpdmVkIHNpZ3Rlcm0iKTsKKyAgICAgICAgICAoYWRkcl92ZXJzaW9uPT1BRl9JTkVUNik/IHdyaXRlX2xlYXNlNmZpbGUoKSA6IHdyaXRlX2xlYXNlZmlsZSgpOworICAgICAgICAgIHVubGluayhnY29uZmlnLnBpZGZpbGUpOworICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRkRfSVNTRVQoZ3N0YXRlLmxpc3RlbnNvY2ssICZyZmRzKSkgeyAvLyBTb21lIEFjdGl2aXR5IG9uIFJERkRzIDogaXMgc29ja2V0CisgICAgICBkYmcoInNlbGVjdCBsaXN0ZW4gc29jayByZWFkXG4iKTsKKyAgICAgIGlmKGFkZHJfdmVyc2lvbj09QUZfSU5FVDYpIHsKKyAgICAgICAgdm9pZCAqY2xpZW50X2R1aWQsICpzZXJ2ZXJfZHVpZCwgKmNsaWVudF9pYV9uYSwgKnNlcnZlcl9pYV9uYSwKKyAgICAgICAgICAgICAqY2xpZW50X2lhX3BkOworICAgICAgICB1aW50OF90IGNsaWVudF9sbGFbNl0gPSB7MCx9OworICAgICAgICB1aW50MTZfdCBjbGllbnRfZHVpZF9sZW4gPSAwLCBzZXJ2ZXJfZHVpZF9sZW4gPSAwLCBzZXJ2ZXJfaWFfbmFfbGVuID0gMCwKKyAgICAgICAgICAgICAgICAgY2xpZW50X2lhX25hX2xlbiA9IDAsIGNsaWVudF9pYV9wZF9sZW4gPSAwOworCisgICAgICAgIGlmKHJlYWRfcGFja2V0NigpIDwgMCkgeworICAgICAgICAgIG9wZW5fbGlzdGVuc29jazYoKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB3YWl0ZWQgKz0gdGltZShOVUxMKSAtIHRpbWVzdG1wOworCisgICAgICAgIG1lbWNweSgmZ3N0YXRlLnJxY29kZSwgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Ni5tc2d0eXBlLCBzaXplb2YodWludDhfdCkpOworICAgICAgICBtZW1jcHkoJnRyYW5zYWN0aW9uaWQsICZnc3RhdGUucmN2ZC5yY3ZkX3BrdDYudHJhbnNhY3Rpb25faWQsCisgICAgICAgICAgICBzaXplb2YodHJhbnNhY3Rpb25pZCkpOworCisgICAgICAgIGlmICghZ3N0YXRlLnJxY29kZSB8fCBnc3RhdGUucnFjb2RlIDwgREhDUDZTT0xJQ0lUIHx8CisgICAgICAgICAgICBnc3RhdGUucnFjb2RlID4gREhDUDZSRUxBWVJFUExZKSB7CisgICAgICAgICAgZGJnKCJubyBvciBiYWQgbWVzc2FnZSB0eXBlIG9wdGlvbiwgaWdub3JpbmcgcGFja2V0LlxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnc3RhdGUucmN2ZC5yY3ZkX3BrdDYudHJhbnNhY3Rpb25faWQgfHwgCisgICAgICAgICAgICBtZW1jbXAoZ3N0YXRlLnJjdmQucmN2ZF9wa3Q2LnRyYW5zYWN0aW9uX2lkLCB0cmFuc2FjdGlvbmlkLCAzKSkgeworICAgICAgICAgIGRiZygibm8gb3IgYmFkIHRyYW5zYWN0aW9uIGlkLCBpZ25vcmluZyBwYWNrZXQuXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdhaXRlZCArPSB0aW1lKE5VTEwpIC0gdGltZXN0bXA7CisgICAgICAgIHN3aXRjaCAoZ3N0YXRlLnJxY29kZSkgeworICAgICAgICAgIGNhc2UgREhDUDZTT0xJQ0lUOgorICAgICAgICAgICAgZGJnKCJNZXNzYWdlIFR5cGU6IERIQ1A2U09MSUNJVFxuIik7CisgICAgICAgICAgICBvcHRwdHIgPSBwcmVwYXJlX3NlbmRfcGt0NihESENQNkFEVkVSVElTRSk7CisgICAgICAgICAgICBvcHRsZW4gPSAwOworCisgICAgICAgICAgICAvL1RPRE8gcG9saWN5IGNoZWNrCisgICAgICAgICAgICAvL1RPRE8gUmVjZWl2ZTogT1JPIGNoZWNrIChlLmcuIEROUykKKworICAgICAgICAgICAgLy9SZWNlaXZlOiBDbGllbnQgSWRlbnRpZmllciAoRFVJRCkKKyAgICAgICAgICAgIGdldF9vcHR2YWw2KCh1aW50OF90KikmZ3N0YXRlLnJjdmQucmN2ZF9wa3Q2Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUDZfT1BUX0NMSUVOVElELCAmY2xpZW50X2R1aWRfbGVuLCAmY2xpZW50X2R1aWQpOworCisgICAgICAgICAgICAvL1JlY2VpdmU6IElkZW50aXR5IEFzc29jaWF0aW9uIGZvciBOb24tdGVtcG9yYXJ5IEFkZHJlc3MKKyAgICAgICAgICAgIGlmKGdldF9vcHR2YWw2KCh1aW50OF90KikmZ3N0YXRlLnJjdmQucmN2ZF9wa3Q2Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBESENQNl9PUFRfSUFfTkEsICZjbGllbnRfaWFfbmFfbGVuLCAmY2xpZW50X2lhX25hKSkgeworICAgICAgICAgICAgICB1aW50MTZfdCBpYV9hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgb3B0dmFsX2lhX2FkZHIpOworICAgICAgICAgICAgICB2b2lkICppYV9hZGRyLCAqc3RhdHVzX2NvZGU7CisgICAgICAgICAgICAgIGNoYXIgKnN0YXR1c19jb2RlX21zZzsKKyAgICAgICAgICAgICAgdWludDE2X3Qgc3RhdHVzX2NvZGVfbGVuID0gMDsKKyAgICAgICAgICAgICAgc2VydmVyX2lhX25hX2xlbiA9IHNpemVvZihzdHJ1Y3Qgb3B0dmFsX2lhX25hKTsKKworICAgICAgICAgICAgICAvL0lBIEFkZHJlc3MKKyAgICAgICAgICAgICAgaWFfYWRkciA9IHh6YWxsb2MoaWFfYWRkcl9sZW4pOworICAgICAgICAgICAgICBzdHJ1Y3Qgb3B0dmFsX2lhX2FkZHIgKmlhX2FkZHJfcCA9IChzdHJ1Y3Qgb3B0dmFsX2lhX2FkZHIqKWlhX2FkZHI7CisgICAgICAgICAgICAgICgqaWFfYWRkcl9wKS5wcmVmX2xpZmV0aW1lID0gZ2NvbmZpZy5wcmVmX2xpZmV0aW1lOworICAgICAgICAgICAgICAoKmlhX2FkZHJfcCkudmFsaWRfbGlmZXRpbWUgPSBnY29uZmlnLnZhbGlkX2xpZmV0aW1lOworICAgICAgICAgICAgICBtZW1jcHkoJigqaWFfYWRkcl9wKS5pcHY2X2FkZHIsCisgICAgICAgICAgICAgICAgICBnZXRpcDZfZnJvbV9wb29sKGNsaWVudF9kdWlkLCBjbGllbnRfZHVpZF9sZW4sCisgICAgICAgICAgICAgICAgICAgIERIQ1A2X09QVF9JQV9OQSwgKCooc3RydWN0IG9wdHZhbF9pYV9uYSopIGNsaWVudF9pYV9uYSkuaWFpZCwKKyAgICAgICAgICAgICAgICAgICAgJigqaWFfYWRkcl9wKS5wcmVmX2xpZmV0aW1lKSwgc2l6ZW9mKHVpbnQzMl90KSo0KTsKKyAgICAgICAgICAgICAgc2VydmVyX2lhX25hX2xlbiArPSAoaWFfYWRkcl9sZW4rNCk7CisKKyAgICAgICAgICAgICAgLy9TdGF0dXMgQ29kZQorICAgICAgICAgICAgICBpZihtZW1jbXAoKCppYV9hZGRyX3ApLmlwdjZfYWRkciwgKHVpbnQ4X3RbMTZdKXswfSwgc2l6ZW9mKHVpbnQzMl90KSo0KSkgeworICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlX21zZyA9IHhzdHJkdXAoIkFzc2lnbmVkIGFuIGFkZHJlc3MuIik7CisgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGVfbGVuID0gc3RybGVuKHN0YXR1c19jb2RlX21zZykrMTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfY29kZSA9IHh6YWxsb2Moc3RhdHVzX2NvZGVfbGVuKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3B0dmFsX3N0YXR1c19jb2RlICpzdGF0dXNfY29kZV9wID0KKyAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgb3B0dmFsX3N0YXR1c19jb2RlKilzdGF0dXNfY29kZTsKKyAgICAgICAgICAgICAgICAoKnN0YXR1c19jb2RlX3ApLnN0YXR1c19jb2RlID0gaHRvbnMoREhDUDZfU1RBVFVTX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIG1lbWNweSgoKnN0YXR1c19jb2RlX3ApLnN0YXR1c19tc2csIHN0YXR1c19jb2RlX21zZywKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGVfbGVuKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaWFfbmFfbGVuICs9IChzdGF0dXNfY29kZV9sZW4rNCk7CisgICAgICAgICAgICAgICAgZnJlZShzdGF0dXNfY29kZV9tc2cpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlX21zZyA9IHhzdHJkdXAoIlRoZXJlJ3Mgbm8gYXZhaWxhYmxlIGFkZHJlc3MuIik7CisgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGVfbGVuID0gc3RybGVuKHN0YXR1c19jb2RlX21zZykrMTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfY29kZSA9IHh6YWxsb2Moc3RhdHVzX2NvZGVfbGVuKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3B0dmFsX3N0YXR1c19jb2RlICpzdGF0dXNfY29kZV9wID0KKyAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgb3B0dmFsX3N0YXR1c19jb2RlKilzdGF0dXNfY29kZTsKKyAgICAgICAgICAgICAgICAoKnN0YXR1c19jb2RlX3ApLnN0YXR1c19jb2RlID0gaHRvbnMoREhDUDZfU1RBVFVTX05PQUREUlNBVkFJTCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCgqc3RhdHVzX2NvZGVfcCkuc3RhdHVzX21zZywgc3RhdHVzX2NvZGVfbXNnLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY29kZV9sZW4pOworICAgICAgICAgICAgICAgIHNlcnZlcl9pYV9uYV9sZW4gKz0gKHN0YXR1c19jb2RlX2xlbis0KTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaWFfbmFfbGVuIC09IChpYV9hZGRyX2xlbis0KTsKKyAgICAgICAgICAgICAgICBpYV9hZGRyX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgZnJlZShpYV9hZGRyKTsKKyAgICAgICAgICAgICAgICBmcmVlKHN0YXR1c19jb2RlX21zZyk7CisgICAgICAgICAgICAgICAgLy9UT0RPIHNlbmQgZmFpbGVkIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvL2NvbWJpbmUgb3B0aW9ucworICAgICAgICAgICAgICBzZXJ2ZXJfaWFfbmEgPSB4emFsbG9jKHNlcnZlcl9pYV9uYV9sZW4pOworICAgICAgICAgICAgICBzdHJ1Y3Qgb3B0dmFsX2lhX25hICppYV9uYV9wID0gKHN0cnVjdCBvcHR2YWxfaWFfbmEqKXNlcnZlcl9pYV9uYTsKKyAgICAgICAgICAgICAgKCppYV9uYV9wKS5pYWlkID0gKCooc3RydWN0IG9wdHZhbF9pYV9uYSopY2xpZW50X2lhX25hKS5pYWlkOworICAgICAgICAgICAgICAoKmlhX25hX3ApLnQxID0gZ2NvbmZpZy50MTsKKyAgICAgICAgICAgICAgKCppYV9uYV9wKS50MiA9IGdjb25maWcudDI7CisKKyAgICAgICAgICAgICAgdWludDhfdCogaWFfbmFfb3B0cHRyID0gKCppYV9uYV9wKS5vcHR2YWw7CisgICAgICAgICAgICAgIGlmKGlhX2FkZHJfbGVuKSB7CisgICAgICAgICAgICAgICAgc2V0X29wdHZhbDYoaWFfbmFfb3B0cHRyLCBESENQNl9PUFRfSUFfQUREUiwgaWFfYWRkciwgaWFfYWRkcl9sZW4pOworICAgICAgICAgICAgICAgIGlhX25hX29wdHB0ciArPSAoaWFfYWRkcl9sZW4gKyA0KTsKKyAgICAgICAgICAgICAgICBmcmVlKGlhX2FkZHIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKHN0YXR1c19jb2RlX2xlbikgeworICAgICAgICAgICAgICAgIHNldF9vcHR2YWw2KGlhX25hX29wdHB0ciwgREhDUDZfT1BUX1NUQVRVU19DT0RFLCBzdGF0dXNfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGVfbGVuKTsKKyAgICAgICAgICAgICAgICBpYV9uYV9vcHRwdHIgKz0gKHN0YXR1c19jb2RlX2xlbik7CisgICAgICAgICAgICAgICAgZnJlZShzdGF0dXNfY29kZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvL1Jlc3BvbnNlOiBJZGVudGl0eSBBc3NvY2lhdGlvbiBmb3IgTm9uLXRlbXBvcmFyeSBBZGRyZXNzCisgICAgICAgICAgICAgIG9wdHB0ciA9IHNldF9vcHR2YWw2KG9wdHB0ciwgREhDUDZfT1BUX0lBX05BLCBzZXJ2ZXJfaWFfbmEsCisgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaWFfbmFfbGVuKTsKKyAgICAgICAgICAgICAgb3B0bGVuICs9IChzZXJ2ZXJfaWFfbmFfbGVuICsgNCk7CisgICAgICAgICAgICAgIGZyZWUoY2xpZW50X2lhX25hKTtmcmVlKHNlcnZlcl9pYV9uYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1JlY2VpdmU6IElkZW50aXR5IEFzc29jaWF0aW9uIGZvciBQcmVmaXggRGVsZWdhdGlvbgorICAgICAgICAgICAgZWxzZSBpZihnZXRfb3B0dmFsNigodWludDhfdCopJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Ni5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgREhDUDZfT1BUX0lBX1BELCAmY2xpZW50X2lhX3BkX2xlbiwgJmNsaWVudF9pYV9wZCkpIHsKKworICAgICAgICAgICAgICAvL1RPRE8KKyAgICAgICAgICAgICAgLy9SZXNwb25zZTogSWRlbnRpdHkgQXNzb2NpYXRpb24gZm9yIFByZWZpeCBEZWxlZ2F0aW9uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRFVJRCB0eXBlOiBsaW5rLWxheWVyIGFkZHJlc3MgcGx1cyB0aW1lCisgICAgICAgICAgICBpZihudG9ocygoKihzdHJ1Y3Qgb3B0dmFsX2R1aWRfbGx0KiljbGllbnRfZHVpZCkudHlwZSkgPT0KKyAgICAgICAgICAgICAgICBESENQNl9EVUlEX0xMVCkgeworICAgICAgICAgICAgICBzZXJ2ZXJfZHVpZF9sZW4gPSA4K3NpemVvZihnY29uZmlnLnNlcnZlcl9tYWMpOworICAgICAgICAgICAgICBzZXJ2ZXJfZHVpZCA9IHh6YWxsb2Moc2VydmVyX2R1aWRfbGVuKTsKKyAgICAgICAgICAgICAgc3RydWN0IG9wdHZhbF9kdWlkX2xsdCAqc2VydmVyX2R1aWRfcCA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBvcHR2YWxfZHVpZF9sbHQqKXNlcnZlcl9kdWlkOworICAgICAgICAgICAgICAoKnNlcnZlcl9kdWlkX3ApLnR5cGUgPSBodG9ucygxKTsKKyAgICAgICAgICAgICAgKCpzZXJ2ZXJfZHVpZF9wKS5od3R5cGUgPSBodG9ucygxKTsKKyAgICAgICAgICAgICAgKCpzZXJ2ZXJfZHVpZF9wKS50aW1lID0gaHRvbmwoKHVpbnQzMl90KQorICAgICAgICAgICAgICAgICAgKHRpbWUoTlVMTCkgLSA5NDY2ODQ4MDApICYgMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgIG1lbWNweSgoKnNlcnZlcl9kdWlkX3ApLmxsYWRkciwgZ2NvbmZpZy5zZXJ2ZXJfbWFjLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdjb25maWcuc2VydmVyX21hYykpOworICAgICAgICAgICAgICBtZW1jcHkoJmNsaWVudF9sbGEsICgqKHN0cnVjdCBvcHR2YWxfZHVpZF9sbHQqKWNsaWVudF9kdWlkKS5sbGFkZHIsCisgICAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50X2xsYSkpOworCisgICAgICAgICAgICAgIC8vUmVzcG9uc2U6IFNlcnZlciBJZGVudGlmaWVyIChEVUlEKQorICAgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsNihvcHRwdHIsIERIQ1A2X09QVF9TRVJWRVJJRCwgc2VydmVyX2R1aWQsCisgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZHVpZF9sZW4pOworICAgICAgICAgICAgICBvcHRsZW4gKz0gKHNlcnZlcl9kdWlkX2xlbiArIDQpOworICAgICAgICAgICAgICAvL1Jlc3BvbnNlOiBDbGllbnQgSWRlbnRpZmllcgorICAgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsNihvcHRwdHIsIERIQ1A2X09QVF9DTElFTlRJRCwgY2xpZW50X2R1aWQsCisgICAgICAgICAgICAgICAgICBjbGllbnRfZHVpZF9sZW4pOworICAgICAgICAgICAgICBvcHRsZW4gKz0gKGNsaWVudF9kdWlkX2xlbiArIDQpOworICAgICAgICAgICAgICBmcmVlKGNsaWVudF9kdWlkKTtmcmVlKHNlcnZlcl9kdWlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VuZF9wYWNrZXQ2KDAsIGNsaWVudF9sbGEsIG9wdGxlbik7CisgICAgICAgICAgICB3cml0ZV9sZWFzZTZmaWxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERIQ1A2UkVRVUVTVDoKKyAgICAgICAgICAgIGRiZygiTWVzc2FnZSBUeXBlOiBESENQNlJFUVVFU1RcbiIpOworICAgICAgICAgICAgb3B0cHRyID0gcHJlcGFyZV9zZW5kX3BrdDYoREhDUDZSRVBMWSk7CisgICAgICAgICAgICBvcHRsZW4gPSAwOworCisgICAgICAgICAgICAvL1JlY2VpdmU6IENsaWVudCBJZGVudGlmaWVyIChEVUlEKQorICAgICAgICAgICAgZ2V0X29wdHZhbDYoKHVpbnQ4X3QqKSZnc3RhdGUucmN2ZC5yY3ZkX3BrdDYub3B0aW9ucywKKyAgICAgICAgICAgICAgICBESENQNl9PUFRfQ0xJRU5USUQsICZjbGllbnRfZHVpZF9sZW4sICZjbGllbnRfZHVpZCk7CisgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsNihvcHRwdHIsIERIQ1A2X09QVF9DTElFTlRJRCwgY2xpZW50X2R1aWQsCisgICAgICAgICAgICAgICAgY2xpZW50X2R1aWRfbGVuKTsKKyAgICAgICAgICAgIG9wdGxlbiArPSAoY2xpZW50X2R1aWRfbGVuICsgNCk7CisgICAgICAgICAgICBtZW1jcHkoY2xpZW50X2xsYSwgKCooc3RydWN0IG9wdHZhbF9kdWlkX2xsdCopY2xpZW50X2R1aWQpLmxsYWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50X2xsYSkpOworCisgICAgICAgICAgICAvL1JlY2VpdmU6IElkZW50aXR5IEFzc29jaWF0aW9uIGZvciBOb24tdGVtcG9yYXJ5IEFkZHJlc3MKKyAgICAgICAgICAgIGlmKGdldF9vcHR2YWw2KCh1aW50OF90KikmZ3N0YXRlLnJjdmQucmN2ZF9wa3Q2Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBESENQNl9PUFRfSUFfTkEsICZjbGllbnRfaWFfbmFfbGVuLCAmY2xpZW50X2lhX25hKSkgeworICAgICAgICAgICAgICB1aW50MTZfdCBpYV9hZGRyX2xlbiA9IDAsIHN0YXR1c19jb2RlX2xlbiA9IDA7CisgICAgICAgICAgICAgIHZvaWQgKmlhX2FkZHIsICpzdGF0dXNfY29kZTsKKyAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmVyX2lhX25hX2xlbiA9IHNpemVvZihzdHJ1Y3Qgb3B0dmFsX2lhX25hKTsKKyAgICAgICAgICAgICAgY2hhciAqc3RhdHVzX2NvZGVfbXNnOworCisgICAgICAgICAgICAgIC8vQ2hlY2sgSUEgQWRkcmVzcworICAgICAgICAgICAgICBnZXRfb3B0dmFsNigodWludDhfdCopKCooc3RydWN0IG9wdHZhbF9pYV9uYSopY2xpZW50X2lhX25hKS5vcHR2YWwsCisgICAgICAgICAgICAgICAgICBESENQNl9PUFRfSUFfQUREUiwgJmlhX2FkZHJfbGVuLCAmaWFfYWRkcik7CisgICAgICAgICAgICAgIHN0cnVjdCBvcHR2YWxfaWFfYWRkciAqaWFfYWRkcl9wID0gKHN0cnVjdCBvcHR2YWxfaWFfYWRkciopaWFfYWRkcjsKKyAgICAgICAgICAgICAgaWYodmVyaWZ5aXA2X2luX2xlYXNlKCgqaWFfYWRkcl9wKS5pcHY2X2FkZHIsIGNsaWVudF9kdWlkLAorICAgICAgICAgICAgICAgICAgICBESENQNl9PUFRfSUFfTkEsICgqKHN0cnVjdCBvcHR2YWxfaWFfbmEqKWNsaWVudF9pYV9uYSkuaWFpZCkKKyAgICAgICAgICAgICAgICAgID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VydmVyX2lhX25hX2xlbiArPSAoaWFfYWRkcl9sZW4gKyA0KTsKKyAgICAgICAgICAgICAgICAvL0FkZCBTdGF0dXMgQ29kZQorICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlX21zZyA9IHhzdHJkdXAoIkFzc2lnbmVkIGFuIGFkZHJlc3MuIik7CisgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGVfbGVuID0gc3RybGVuKHN0YXR1c19jb2RlX21zZykgKyAxOworICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlID0geHphbGxvYyhzdGF0dXNfY29kZV9sZW4pOworICAgICAgICAgICAgICAgIHN0cnVjdCBvcHR2YWxfc3RhdHVzX2NvZGUgKnN0YXR1c19jb2RlX3AgPQorICAgICAgICAgICAgICAgICAgKHN0cnVjdCBvcHR2YWxfc3RhdHVzX2NvZGUqKXN0YXR1c19jb2RlOworICAgICAgICAgICAgICAgICgqc3RhdHVzX2NvZGVfcCkuc3RhdHVzX2NvZGUgPSBodG9ucyhESENQNl9TVEFUVVNfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCgqc3RhdHVzX2NvZGVfcCkuc3RhdHVzX21zZywgc3RhdHVzX2NvZGVfbXNnLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY29kZV9sZW4pOworICAgICAgICAgICAgICAgIHNlcnZlcl9pYV9uYV9sZW4gKz0gKHN0YXR1c19jb2RlX2xlbis0KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL1RPRE8gc2VuZCBmYWlsZWQgc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vY29tYmluZSBvcHRpb25zCisgICAgICAgICAgICAgIHNlcnZlcl9pYV9uYSA9IHh6YWxsb2Moc2VydmVyX2lhX25hX2xlbik7CisgICAgICAgICAgICAgIHN0cnVjdCBvcHR2YWxfaWFfbmEgKmlhX25hX3AgPSAoc3RydWN0IG9wdHZhbF9pYV9uYSopc2VydmVyX2lhX25hOworICAgICAgICAgICAgICAoKmlhX25hX3ApLmlhaWQgPSAoKihzdHJ1Y3Qgb3B0dmFsX2lhX25hKiljbGllbnRfaWFfbmEpLmlhaWQ7CisgICAgICAgICAgICAgICgqaWFfbmFfcCkudDEgPSBnY29uZmlnLnQxOworICAgICAgICAgICAgICAoKmlhX25hX3ApLnQyID0gZ2NvbmZpZy50MjsKKworICAgICAgICAgICAgICB1aW50OF90KiBpYV9uYV9vcHRwdHIgPSAoKmlhX25hX3ApLm9wdHZhbDsKKyAgICAgICAgICAgICAgaWFfbmFfb3B0cHRyID0gc2V0X29wdHZhbDYoaWFfbmFfb3B0cHRyLCBESENQNl9PUFRfSUFfQUREUiwKKyAgICAgICAgICAgICAgICAgIGlhX2FkZHIsIGlhX2FkZHJfbGVuKTsKKyAgICAgICAgICAgICAgZnJlZShpYV9hZGRyKTsKKworICAgICAgICAgICAgICBpZihzdGF0dXNfY29kZV9sZW4pIHsKKyAgICAgICAgICAgICAgICBpYV9uYV9vcHRwdHIgPSBzZXRfb3B0dmFsNihpYV9uYV9vcHRwdHIsIERIQ1A2X09QVF9TVEFUVVNfQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGUsIHN0YXR1c19jb2RlX2xlbik7CisgICAgICAgICAgICAgICAgZnJlZShzdGF0dXNfY29kZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvL1Jlc3BvbnNlOiBJZGVudGl0eSBBc3NvY2lhdGlvbiBmb3IgTm9uLXRlbXBvcmFyeSBBZGRyZXNzCisgICAgICAgICAgICAgIC8vKFN0YXR1cyBDb2RlIGFkZGVkKQorICAgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsNihvcHRwdHIsIERIQ1A2X09QVF9JQV9OQSwKKyAgICAgICAgICAgICAgICAgIHNlcnZlcl9pYV9uYSwgc2VydmVyX2lhX25hX2xlbik7CisgICAgICAgICAgICAgIG9wdGxlbiArPSAoc2VydmVyX2lhX25hX2xlbiArIDQpOworICAgICAgICAgICAgICBmcmVlKGNsaWVudF9pYV9uYSk7ZnJlZShzZXJ2ZXJfaWFfbmEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL1JlY2VpdmU6IFNlcnZlciBJZGVudGlmaWVyIChEVUlEKQorICAgICAgICAgICAgZ2V0X29wdHZhbDYoKHVpbnQ4X3QqKSZnc3RhdGUucmN2ZC5yY3ZkX3BrdDYub3B0aW9ucywKKyAgICAgICAgICAgICAgICBESENQNl9PUFRfU0VSVkVSSUQsICZzZXJ2ZXJfZHVpZF9sZW4sICZzZXJ2ZXJfZHVpZCk7CisgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsNihvcHRwdHIsIERIQ1A2X09QVF9TRVJWRVJJRCwKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfZHVpZCwgc2VydmVyX2R1aWRfbGVuKTsKKyAgICAgICAgICAgIG9wdGxlbiArPSAoc2VydmVyX2R1aWRfbGVuICsgNCk7CisKKyAgICAgICAgICAgIGZyZWUoY2xpZW50X2R1aWQpOyBmcmVlKHNlcnZlcl9kdWlkKTsKKworICAgICAgICAgICAgc2VuZF9wYWNrZXQ2KDAsIGNsaWVudF9sbGEsIG9wdGxlbik7CisgICAgICAgICAgICB3cml0ZV9sZWFzZTZmaWxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERIQ1A2REVDTElORTogIC8vVE9ETworICAgICAgICAgIGNhc2UgREhDUDZSRU5FVzogICAgLy9UT0RPCisgICAgICAgICAgY2FzZSBESENQNlJFQklORDogICAvL1RPRE8KKyAgICAgICAgICBjYXNlIERIQ1A2UkVMRUFTRToKKyAgICAgICAgICAgIGRiZygiTWVzc2FnZSBUeXBlOiBESENQNlJFTEVBU0VcbiIpOworICAgICAgICAgICAgb3B0cHRyID0gcHJlcGFyZV9zZW5kX3BrdDYoREhDUDZSRVBMWSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZGJnKCJNZXNzYWdlIFR5cGUgOiAldVxuIiwgZ3N0YXRlLnJxY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmKHJlYWRfcGFja2V0KCkgPCAwKSB7CisgICAgICAgICAgb3Blbl9saXN0ZW5zb2NrKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgd2FpdGVkICs9IHRpbWUoTlVMTCkgLSB0aW1lc3RtcDsKKworICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikmZ3N0YXRlLnJjdmQucmN2ZF9wa3Qub3B0aW9ucywKKyAgICAgICAgICAgIERIQ1BfT1BUX01FU1NBR0VfVFlQRSwgJmdzdGF0ZS5ycWNvZGUpOworICAgICAgICBpZiAoZ3N0YXRlLnJxY29kZSA9PSAwIHx8IGdzdGF0ZS5ycWNvZGUgPCBESENQRElTQ09WRVIgCisgICAgICAgICAgICB8fCBnc3RhdGUucnFjb2RlID4gREhDUElORk9STSkgeworICAgICAgICAgIGRiZygibm8gb3IgYmFkIG1lc3NhZ2UgdHlwZSBvcHRpb24sIGlnbm9yaW5nIHBhY2tldC5cbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGdldF9vcHR2YWwoKHVpbnQ4X3QqKSAmZ3N0YXRlLnJjdmQucmN2ZF9wa3Qub3B0aW9ucywKKyAgICAgICAgICAgIERIQ1BfT1BUX1NFUlZFUl9JRCwgJnNlcnZlcmlkKTsKKyAgICAgICAgaWYgKHNlcnZlcmlkICYmIChzZXJ2ZXJpZCAhPSBnY29uZmlnLnNlcnZlcl9uaXApKSB7CisgICAgICAgICAgZGJnKCJzZXJ2ZXIgSUQgZG9lc24ndCBtYXRjaCwgaWdub3JpbmcgcGFja2V0LlxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB3YWl0ZWQgKz0gdGltZShOVUxMKSAtIHRpbWVzdG1wOworICAgICAgICBzd2l0Y2ggKGdzdGF0ZS5ycWNvZGUpIHsKKyAgICAgICAgICBjYXNlIERIQ1BESVNDT1ZFUjoKKyAgICAgICAgICAgIG1zZ3R5cGUgPSBESENQT0ZGRVI7CisgICAgICAgICAgICBkYmcoIk1lc3NhZ2UgVHlwZSA6IERIQ1BESVNDT1ZFUlxuIik7CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfUkVRVUVTVEVEX0lQLCAmcmVxdWVzdGVkX25pcCk7CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfSE9TVF9OQU1FLCAmaHN0bmFtZSk7CisgICAgICAgICAgICByZXFlc3RlZF9sZWFzZSA9IGdjb25maWcub2ZmZXJfdGltZTsKKyAgICAgICAgICAgIGdldF9yZXFwYXJhbSgmZ3N0YXRlLnJxb3B0KTsKKyAgICAgICAgICAgIG9wdHB0ciA9IHByZXBhcmVfc2VuZF9wa3QoKTsKKyAgICAgICAgICAgIGdzdGF0ZS5zZW5kLnNlbmRfcGt0LnlpYWRkciA9IGdldGlwX2Zyb21fcG9vbChyZXF1ZXN0ZWRfbmlwLAorICAgICAgICAgICAgICAgIGdzdGF0ZS5yY3ZkLnJjdmRfcGt0LmNoYWRkciwgJnJlcWVzdGVkX2xlYXNlLCBoc3RuYW1lKTsKKyAgICAgICAgICAgIGlmKCFnc3RhdGUuc2VuZC5zZW5kX3BrdC55aWFkZHIpeworICAgICAgICAgICAgICBtc2d0eXBlID0gREhDUE5BSzsKKyAgICAgICAgICAgICAgb3B0cHRyID0gc2V0X29wdHZhbChvcHRwdHIsIERIQ1BfT1BUX01FU1NBR0VfVFlQRSwgJm1zZ3R5cGUsIDEpOworICAgICAgICAgICAgICBzZW5kX3BhY2tldCgxKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfTEVBU0VfVElNRSwgJnJlcWVzdGVkX2xlYXNlKTsKKyAgICAgICAgICAgIHJlcWVzdGVkX2xlYXNlID0gaHRvbmwoZ2V0X2xlYXNlKHJlcWVzdGVkX2xlYXNlICsgdGltZShOVUxMKSkpOworICAgICAgICAgICAgb3B0cHRyID0gc2V0X29wdHZhbChvcHRwdHIsIERIQ1BfT1BUX01FU1NBR0VfVFlQRSwgJm1zZ3R5cGUsIDEpOworICAgICAgICAgICAgb3B0cHRyID0gc2V0X29wdHZhbChvcHRwdHIsIERIQ1BfT1BUX1NFUlZFUl9JRCwgJmdjb25maWcuc2VydmVyX25pcCwgNCk7CisgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsKG9wdHB0ciwgREhDUF9PUFRfTEVBU0VfVElNRSwgJnJlcWVzdGVkX2xlYXNlLCA0KTsKKyAgICAgICAgICAgIG9wdHB0ciA9IHNldF9yZXFwYXJhbShvcHRwdHIsIGdzdGF0ZS5ycW9wdCk7CisgICAgICAgICAgICBzZW5kX3BhY2tldCgxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREhDUFJFUVVFU1Q6CisgICAgICAgICAgICBtc2d0eXBlID0gREhDUEFDSzsKKyAgICAgICAgICAgIGRiZygiTWVzc2FnZSBUeXBlIDogREhDUFJFUVVFU1RcbiIpOworICAgICAgICAgICAgb3B0cHRyID0gcHJlcGFyZV9zZW5kX3BrdCgpOworICAgICAgICAgICAgZ2V0X29wdHZhbCgodWludDhfdCopICZnc3RhdGUucmN2ZC5yY3ZkX3BrdC5vcHRpb25zLAorICAgICAgICAgICAgICAgIERIQ1BfT1BUX1JFUVVFU1RFRF9JUCwgJnJlcXVlc3RlZF9uaXApOworICAgICAgICAgICAgZ2V0X29wdHZhbCgodWludDhfdCopICZnc3RhdGUucmN2ZC5yY3ZkX3BrdC5vcHRpb25zLAorICAgICAgICAgICAgICAgIERIQ1BfT1BUX0xFQVNFX1RJTUUsICZyZXFlc3RlZF9sZWFzZSk7CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfSE9TVF9OQU1FLCAmaHN0bmFtZSk7CisgICAgICAgICAgICBnc3RhdGUuc2VuZC5zZW5kX3BrdC55aWFkZHIgPSBnZXRpcF9mcm9tX3Bvb2wocmVxdWVzdGVkX25pcCwKKyAgICAgICAgICAgICAgICBnc3RhdGUucmN2ZC5yY3ZkX3BrdC5jaGFkZHIsICZyZXFlc3RlZF9sZWFzZSwgaHN0bmFtZSk7CisgICAgICAgICAgICBpZiAoIXNlcnZlcmlkKSByZXFlc3RlZF9sZWFzZSA9IGdjb25maWcubWF4X2xlYXNlX3NlYzsKKyAgICAgICAgICAgIGlmICghZ3N0YXRlLnNlbmQuc2VuZF9wa3QueWlhZGRyKSB7CisgICAgICAgICAgICAgIG1zZ3R5cGUgPSBESENQTkFLOworICAgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsKG9wdHB0ciwgREhDUF9PUFRfTUVTU0FHRV9UWVBFLCAmbXNndHlwZSwgMSk7CisgICAgICAgICAgICAgIHNlbmRfcGFja2V0KDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdHB0ciA9IHNldF9vcHR2YWwob3B0cHRyLCBESENQX09QVF9NRVNTQUdFX1RZUEUsICZtc2d0eXBlLCAxKTsKKyAgICAgICAgICAgIG9wdHB0ciA9IHNldF9vcHR2YWwob3B0cHRyLCBESENQX09QVF9TRVJWRVJfSUQsICZnY29uZmlnLnNlcnZlcl9uaXAsIDQpOworICAgICAgICAgICAgcmVxZXN0ZWRfbGVhc2UgPSBodG9ubChyZXFlc3RlZF9sZWFzZSk7CisgICAgICAgICAgICBvcHRwdHIgPSBzZXRfb3B0dmFsKG9wdHB0ciwgREhDUF9PUFRfTEVBU0VfVElNRSwgJnJlcWVzdGVkX2xlYXNlLCA0KTsKKyAgICAgICAgICAgIHNlbmRfcGFja2V0KDEpOworICAgICAgICAgICAgd3JpdGVfbGVhc2VmaWxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERIQ1BERUNMSU5FOi8vIEZBTEwgVEhST1VHSAorICAgICAgICAgIGNhc2UgREhDUFJFTEVBU0U6CisgICAgICAgICAgICBkYmcoIk1lc3NhZ2UgVHlwZSA6IERIQ1BERUNMSU5FIG9yIERIQ1BSRUxFQVNFIFxuIik7CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfU0VSVkVSX0lELCAmc2VydmVyaWQpOworICAgICAgICAgICAgaWYgKHNlcnZlcmlkICE9IGdjb25maWcuc2VydmVyX25pcCkgYnJlYWs7CisgICAgICAgICAgICBnZXRfb3B0dmFsKCh1aW50OF90KikgJmdzdGF0ZS5yY3ZkLnJjdmRfcGt0Lm9wdGlvbnMsCisgICAgICAgICAgICAgICAgREhDUF9PUFRfUkVRVUVTVEVEX0lQLCAmcmVxdWVzdGVkX25pcCk7CisgICAgICAgICAgICBkZWxpcF9mcm9tX2xlYXNlKHJlcXVlc3RlZF9uaXAsIGdzdGF0ZS5yY3ZkLnJjdmRfcGt0LmNoYWRkciwKKyAgICAgICAgICAgICAgICAoZ3N0YXRlLnJxY29kZT09REhDUFJFTEVBU0UpPzA6Z2NvbmZpZy5kZWNsaW5lX3RpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRiZygiTWVzc2FnZSBUeXBlIDogJXVcbiIsIGdzdGF0ZS5ycWNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvZGlmZi5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiZGJjZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvZGlmZi5jCkBAIC0wLDAgKzEsODM3IEBACisvKiBkaWZmLmMgLSBjb21wYXJlIGZpbGVzIGxpbmUgYnkgbGluZQorICoKKyAqIENvcHlyaWdodCAyMDE0IFNhbmRlZXAgU2hhcm1hIDxzYW5kZWVwLmphY2syNzU2QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEFzaHdpbmkgS3VtYXIgPGFrLmFzaHdpbmkxOTgxQGdtYWlsLmNvbT4KKyAqCisgKiBTZWU6IGh0dHA6Ly9jbS5iZWxsLWxhYnMuY29tL2NtL2NzL2NzdHIvNDEucGRmCisKK1VTRV9ESUZGKE5FV1RPWShkaWZmLCAiPDI+MkIoaWdub3JlLWJsYW5rLWxpbmVzKWQobWluaW1hbCliKGlnbm9yZS1zcGFjZS1jaGFuZ2UpdXQoZXhwYW5kLXRhYnMpdyhpZ25vcmUtYWxsLXNwYWNlKWkoaWdub3JlLWNhc2UpVChpbml0aWFsLXRhYilzKHJlcG9ydC1pZGVudGljYWwtZmlsZXMpcShicmllZilhKHRleHQpTChsYWJlbCkqUyhzdGFydGluZy1maWxlKTpOKG5ldy1maWxlKXIocmVjdXJzaXZlKVUodW5pZmllZCkjPDA9MyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIERJRkYKKyAgYm9vbCAiZGlmZiIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgdXNhZ2U6IGRpZmYgWy1hYkJkaU5xclRzdHddIFstTCBMQUJFTF0gWy1TIEZJTEVdIFstVSBMSU5FU10gRklMRTEgRklMRTIKKworICAtYSAgVHJlYXQgYWxsIGZpbGVzIGFzIHRleHQKKyAgLWIgIElnbm9yZSBjaGFuZ2VzIGluIHRoZSBhbW91bnQgb2Ygd2hpdGVzcGFjZQorICAtQiAgSWdub3JlIGNoYW5nZXMgd2hvc2UgbGluZXMgYXJlIGFsbCBibGFuaworICAtZCAgVHJ5IGhhcmQgdG8gZmluZCBhIHNtYWxsZXIgc2V0IG9mIGNoYW5nZXMKKyAgLWkgIElnbm9yZSBjYXNlIGRpZmZlcmVuY2VzCisgIC1MICBVc2UgTEFCRUwgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUgaW4gdGhlIHVuaWZpZWQgaGVhZGVyCisgIC1OICBUcmVhdCBhYnNlbnQgZmlsZXMgYXMgZW1wdHkKKyAgLXEgIE91dHB1dCBvbmx5IHdoZXRoZXIgZmlsZXMgZGlmZmVyCisgIC1yICBSZWN1cnNlCisgIC1TICBTdGFydCB3aXRoIEZJTEUgd2hlbiBjb21wYXJpbmcgZGlyZWN0b3JpZXMKKyAgLVQgIE1ha2UgdGFicyBsaW5lIHVwIGJ5IHByZWZpeGluZyBhIHRhYiB3aGVuIG5lY2Vzc2FyeQorICAtcyAgUmVwb3J0IHdoZW4gdHdvIGZpbGVzIGFyZSB0aGUgc2FtZQorICAtdCAgRXhwYW5kIHRhYnMgdG8gc3BhY2VzIGluIG91dHB1dAorICAtVSAgT3V0cHV0IExJTkVTIGxpbmVzIG9mIGNvbnRleHQKKyAgLXcgIElnbm9yZSBhbGwgd2hpdGVzcGFjZQorKi8KKworI2RlZmluZSBGT1JfZGlmZgorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgbG9uZyBjdDsKKyAgY2hhciAqc3RhcnQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqTF9saXN0OworCisgIGludCBkaXJfbnVtLCBzaXplLCBpc19iaW5hcnksIHN0YXR1cywgY2hhbmdlLCBsZW5bMl07CisgIGludCAqb2Zmc2V0WzJdOworKQorCisjZGVmaW5lIE1JTih4LHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIE1BWCh4LHkpICgoeCkgPiAoeSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIElTX1NURElOKHMpICAgICAoKHMpWzBdID09ICctJyAmJiAhKHMpWzFdKQorCitzdHJ1Y3Qgdl92ZWN0b3IgeworICB1bnNpZ25lZCBzZXJpYWw6MzE7CisgIHVuc2lnbmVkIGxhc3Q6MTsKKyAgdW5pb24geworICAgIHVuc2lnbmVkIGhhc2g7CisgICAgdW5zaWduZWQgcDsKKyAgfTsKK307CisKK3N0cnVjdCBkaWZmIHsKKyAgbG9uZyBhLCBiLCBjLCBkLCBwcmV2LCBzdWZmOworfTsKKworc3RhdGljIHN0cnVjdCBkaXJfdCB7CisgIGNoYXIgKipsaXN0OworICBpbnQgbnJfZWxtOworfSBkaXJbMl07CisKK3N0cnVjdCBjYW5kaWRhdGUgeworICBpbnQgYSwgYjsKKyAgc3RydWN0IGNhbmRpZGF0ZSAqcHJldiwgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfdCB7CisgIEZJTEUgKmZwOworICBpbnQgbGVuOworfSBmaWxlWzJdOworCitlbnVtIHsKKyAgU0FNRSwKKyAgRElGRkVSLAorfTsKKworZW51bSB7CisgIGVtcHR5ID0gMSA8PCA5LAorICBlb2wgPSAxIDw8IDEwLAorICBlb2YgPSAxIDw8IDExLAorICBzcGFjZSA9IDEgPDwgMTIKK307CisKK3N0YXRpYyBpbnQgY29tcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkKiBiKQoreworICBpbnQgaSA9ICgoc3RydWN0IHZfdmVjdG9yICopYSktPmhhc2ggLQorICAgICgoc3RydWN0IHZfdmVjdG9yICopYiktPmhhc2g7CisKKyAgaWYgKCFpKSBpID0gKChzdHJ1Y3Qgdl92ZWN0b3IgKilhKS0+c2VyaWFsIC0KKyAgICAoKHN0cnVjdCB2X3ZlY3RvciAqKWIpLT5zZXJpYWw7CisgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IHNlYXJjaCAoc3RydWN0IGNhbmRpZGF0ZSAqKkssIGludCByLCBpbnQgaywgaW50IGopCit7CisgIGludCBsb3cgPSByLCB1cHBlciA9IGssIG1pZDsKKworICBtaWQgPSAobG93ICsgdXBwZXIpIC8gMjsKKyAgd2hpbGUgKGxvdyA8PSBtaWQpIHsKKyAgICBpZiAoKChzdHJ1Y3QgY2FuZGlkYXRlKikoS1ttaWRdKSktPmIgPCBqICYmCisgICAgICAgICgoc3RydWN0IGNhbmRpZGF0ZSopKEtbbWlkICsgMV0pKS0+YiA+IGopCisgICAgICByZXR1cm4gbWlkOworCisgICAgaWYgKCgoc3RydWN0IGNhbmRpZGF0ZSopKEtbbWlkXSkpLT5iIDwgaikgbG93ID0gbWlkICsgMTsKKyAgICBlbHNlIGlmICgoKHN0cnVjdCBjYW5kaWRhdGUqKShLW21pZF0pKS0+YiA+IGopIHVwcGVyID0gbWlkIC0gMTsKKyAgICBlbHNlIHJldHVybiAtMTsKKworICAgIG1pZCA9IChsb3cgKyB1cHBlcikgLyAyOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBjYW5kaWRhdGUgKiBuZXdfY2FuZGlkYXRlIChpbnQgaSwgaW50IGosIHN0cnVjdCBjYW5kaWRhdGUqIHByZXYpCit7CisgIHN0cnVjdCBjYW5kaWRhdGUgKmMgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgY2FuZGlkYXRlKSk7CisKKyAgYy0+YSA9IGk7CisgIGMtPmIgPSBqOworICBjLT5wcmV2ID0gcHJldjsKKyAgcmV0dXJuIGM7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9jYW5kaWRhdGVzKHN0cnVjdCBjYW5kaWRhdGUgKmMpCit7CisgIHN0cnVjdCBjYW5kaWRhdGUgKnQgPSBjOworICAKKyAgd2hpbGUgKCh0ID0gYykpIHsKKyAgICBjID0gYy0+bmV4dDsKKyAgICBmcmVlKHQpOworICB9Cit9CisvKgorICogMS4gU2VhcmNoIEtbcjoga10gZm9yIGFuIGVsZW1lbnQgS1tzXSBzdWNoIHRoYXQgS1tzXS0+IGIgPCBqIGFuZCBLW3MgKyAxXS0+YiA+IGoKKyAqIDIuIGlmIGZvdW5kIGRvCisgKiAgMi5hLiBJZiBLW3MgKyAxXS0+YiA+IGogZG8gS1tyXSA9IGM7IHIgPSBzKzEgYW5kIGMgPSBjYW5kaWRhdGUoaSwgaiwgS1tzXSkgLy93ZSBoYXZlIGEgY2FuZGlkYXRlCisgKiAgMi5iLiBpZiBzID0gayAoZmVuY2UgcmVhY2hlZCBtb3ZlIGl0IGZ1cnRoZXIpIGRvIEtbayArIDJdID0gS1trICsgMV0sIGsrKworICogMy4gaWYgRVtwXS5sYXN0IHRydWUgYnJlYWsgaS5lIHdlIGhhdmUgcmVhY2hlZCBhdCB0aGUgZW5kIG9mIGFuIGVxdWl2IGNsYXNzCisgKiAgICBlbHNlIHAgPSBwICsgMSAvL2tlZXAgdHJhdmVyc2luZyB0aGUgZXF1aXYgY2xhc3MuCisgKiA0LiBLW3JdID0gYyAvL1NhdmUgdGhlIHN1Y2Vzc2Z1bGx5IGZpbGxlZCBrLWNhbmRpZGF0ZS4KKyAqLworc3RhdGljIHZvaWQgIGRvX21lcmdlKHN0cnVjdCBjYW5kaWRhdGUgKipLLCBpbnQgKmssIGludCBpLAorICAgIHN0cnVjdCB2X3ZlY3RvciAqRSwgaW50IHApCit7CisgIGludCByID0gMCwgcywgajsKKyAgc3RydWN0IGNhbmRpZGF0ZSAqcHIgPSAwLCAqYyA9IEtbMF07CisKKyAgd2hpbGUgKDEpIHsKKyAgICBqID0gRVtwXS5zZXJpYWw7CisgICAgcyA9IHNlYXJjaChLLCByLCAqaywgaik7CisgICAgaWYgKHMgPj0gMCAmJiAoKChzdHJ1Y3QgY2FuZGlkYXRlKikoS1tzXSkpLT5iIDwgaiAmJgorICAgICAgICAgICgoc3RydWN0IGNhbmRpZGF0ZSopKEtbcyArIDFdKSktPmIgPiBqKSkgeworCisgICAgICBpZiAoKChzdHJ1Y3QgY2FuZGlkYXRlKikoS1tzICsgMV0pKS0+YiA+IGopIHsKKyAgICAgICAgcHIgPSBLW3NdOworICAgICAgICBpZiAociAmJiBLW3JdKSBjLT5uZXh0ID0gS1tyXTsKKyAgICAgICAgS1tyXSA9IGM7CisgICAgICAgIHIgPSBzICsgMTsKKyAgICAgICAgYyA9IG5ld19jYW5kaWRhdGUoaSAsIGosIHByKTsKKyAgICAgIH0KKyAgICAgIGlmIChzID09ICprKSB7CisgICAgICAgIEtbKmsgKyAyXSA9IEtbKmsgKyAxXTsKKyAgICAgICAgKmsgPSAqayArIDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRVtwXS5sYXN0KSBicmVhazsKKyAgICBlbHNlIHAgPSBwICsgMTsKKyAgfQorICBLW3JdID0gYzsKK30KKworc3RhdGljIEZJTEUqIHJlYWRfc3RkaW4oKQoreworICBjaGFyIHRtcF9uYW1lW10gPSAiL3RtcC9kaWZmWFhYWFhYIjsKKyAgaW50IHJkLCB3ciwgdG1wZmQgPSBta3N0ZW1wKHRtcF9uYW1lKTsKKworICBpZiAodG1wZmQgPT0gLTEpIHBlcnJvcl9leGl0KCJta3N0ZW1wIik7CisgIHVubGluayh0bXBfbmFtZSk7CisKKyAgd2hpbGUgKDEpIHsKKyAgICByZCA9IHhyZWFkKFNURElOX0ZJTEVOTywgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisKKyAgICBpZiAoIXJkKSBicmVhazsKKyAgICBpZiAocmQgPCAwKSBwZXJyb3JfZXhpdCgicmVhZCBlcnJvciIpOworICAgIHdyID0gd3JpdGVhbGwodG1wZmQsIHRveWJ1ZiwgcmQpOworICAgIGlmICh3ciA8IDApIHBlcnJvcl9leGl0KCJ3cml0ZSIpOworICB9CisgIHJldHVybiBmZG9wZW4odG1wZmQsICJyIik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90b2soRklMRSAqZnAsIG9mZl90ICpvZmYsIGludCB0b2spCit7CisgIGludCB0ID0gMCwgaXNfc3BhY2U7CisKKyAgdG9rIHw9IGVtcHR5OworICB3aGlsZSAoISh0b2sgJiBlb2wpKSB7CisKKyAgICB0ID0gZmdldGMoZnApOworICAgIGlmIChvZmYgJiYgdCAhPSBFT0YpICpvZmYgKz0gMTsKKyAgICBpc19zcGFjZSA9IGlzc3BhY2UodCkgfHwgKHQgPT0gRU9GKTsKKyAgICB0b2sgfD0gKHQgJiAoZW9mICsgZW9sKSk7IC8vc2V0IHRvayBlb2YrZW9sIHdoZW4gdCBpcyBlb2YKKworICAgIGlmICh0ID09ICdcbicpIHRvayB8PSBlb2w7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpCisgICAgICBpZiAodCA+PSAnQScgJiYgdCA8PSAnWicpIHQgPSB0b2xvd2VyKHQpOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cgJiYgaXNfc3BhY2UpIGNvbnRpbnVlOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpIHsKKyAgICAgIGlmICh0b2sgJiBzcGFjZSkgeworICAgICAgICBpZiAoaXNfc3BhY2UpIGNvbnRpbnVlOworICAgICAgICB0b2sgJj0gfnNwYWNlOworICAgICAgfSBlbHNlIGlmIChpc19zcGFjZSkgdCA9IHNwYWNlICsgJyAnOworICAgIH0KKyAgICB0b2sgJj0gfihlbXB0eSArIDB4ZmYpOyAgLy9yZW1vdmUgZW1wdHkgYW5kIGNoYXIgdG9vLgorICAgIHRvayB8PSB0OyAvL2FkZCBtb3N0IHJlY2VudCBjaGFyCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdG9rOworfQorCitpbnQgYmNvbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgCit7CisgIHN0cnVjdCB2X3ZlY3RvciAqbCA9IChzdHJ1Y3Qgdl92ZWN0b3IqKWEsCisgICAgICAgICAgICAgICAgICAqciA9IChzdHJ1Y3Qgdl92ZWN0b3IqKWI7CisgIGludCByZXQgPSBsLT5oYXNoIC0gci0+aGFzaDsKKworICBpZiAoIXJldCkgeworICAgIGlmICgociAtMSktPmxhc3QpIHJldHVybiAwOworICAgIGVsc2UgcmV0dXJuIC0xOworICB9CisgIHJldHVybiByZXQ7Cit9CisvKiAgZmlsZVswXSBjb3JyZXNwb25kcyBmaWxlIDEgYW5kIGZpbGVbMV0gY29ycmVzcG9uZCBmaWxlIDIuCisgKiAxLiBjYWxjIGhhc2hlcyBmb3IgYm90aCB0aGUgZmlsZXMgYW5kIHN0b3JlIHRoZW0gaW4gdmVjdG9yKHZbMF0sIHZbMV0pCisgKiAyLiBzb3J0IGZpbGVbMV0gd2l0aCBoYXNoIGFzIHByaW1hcnkgYW5kIHNlcmlhbCBhcyBzZWMuIGtleQorICogMy4gRm9ybSB0aGUgZXF1aXZhbGFuY2UgY2xhc3Mgb2YgZmlsZVsxXSBzdG9yZWQgaW4gZSB2ZWN0b3IuIEl0IGxpc3RzIGFsbCB0aGUgZXF1aXZhbGVuY2UKKyAqICAgIGNsYXNzZXMgb2YgbGluZXMgaW4gZmlsZVsxXSwgd2l0aCBlLmxhc3QgPSB0cnVlIG9uIHRoZSBsYXN0IGVsZW1lbnQgb2YgZWFjaCBjbGFzcy4KKyAqICAgIFRoZSBlbGVtZW50cyBhcmUgb3JkZXJlZCBieSBzZXJpYWwgd2l0aGluIGNsYXNzZXMuCisgKiA0LiBGb3JtIHRoZSBwIHZlY3RvciBzdG9yZWQgaW4gIHBfdmVjdG9yLiBwX3ZlY3RvcltpXSwgaWYgbm9uLXplcm8sIG5vdyBwb2ludHMgaW4gZSB2ZWN0b3IKKyAqICAgIHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgZXF1aXYgY2xhc3Mgb2YgbGluZXMgaW4gZmlsZVsxXSBlcXVpdmFsZW50IHRvIGxpbmUKKyAqICAgIGkgaW4gZmlsZVswXS4KKyAqIDUuIEZvcm0gdGhlIGstY2FuZGlkYXRlcyBhcyBkaXNjcmliZWQgaW4gZG9fbWVyZ2UuCisgKiA2LiBDcmVhdGUgYSB2ZWN0b3IgSltpXSA9IGosIHN1Y2ggdGhhdCBpJ3RoIGxpbmUgaW4gZmlsZVswXSBpcyBqJ3RoIGxpbmUgb2YKKyAqICAgIGZpbGVbMV0sIGkuZSBKIGNvbXByaXNlcyBMQ1MKKyAqLworc3RhdGljIGludCAqIGNyZWF0ZV9qX3ZlY3RvcigpCit7CisgIGludCB0b2ssIGksIGosIHNpemUgPSAxMDAsIGs7CisgIG9mZl90IG9mZjsKKyAgbG9uZyBoYXNoOworICBpbnQgKnBfdmVjdG9yLCAqSjsKKyAgc3RydWN0IHZfdmVjdG9yICp2WzJdLCAqZTsKKyAgc3RydWN0IGNhbmRpZGF0ZSAqKmtjYW5kLCAqcHI7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIHRvayA9IG9mZiA9IDA7CisgICAgaGFzaCA9IDU4MzE7CisgICAgdltpXSA9IHh6YWxsb2Moc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgdl92ZWN0b3IpKTsKKyAgICBUVC5vZmZzZXRbaV0gPSB4emFsbG9jKHNpemUgKiBzaXplb2YoaW50KSk7CisgICAgZmlsZVtpXS5sZW4gPSAwOworICAgIGZzZWVrKGZpbGVbaV0uZnAsIDAsIFNFRUtfU0VUKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICB0b2sgID0gcmVhZF90b2soZmlsZVtpXS5mcCwgJm9mZiwgdG9rKTsKKyAgICAgIGlmICghKHRvayAmIGVtcHR5KSkgeworICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAodG9rICYgMHhmZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc2l6ZSA9PSArK2ZpbGVbaV0ubGVuKSB7CisgICAgICAgIHNpemUgPSBzaXplICogMTEgLyAxMDsKKyAgICAgICAgdltpXSA9IHhyZWFsbG9jKHZbaV0sIHNpemUqc2l6ZW9mKHN0cnVjdCB2X3ZlY3RvcikpOworICAgICAgICBUVC5vZmZzZXRbaV0gPSB4cmVhbGxvYyhUVC5vZmZzZXRbaV0sIHNpemUqc2l6ZW9mKGludCkpOworICAgICAgfQorCisgICAgICB2W2ldW2ZpbGVbaV0ubGVuXS5oYXNoID0gaGFzaCAmIElOVF9NQVg7CisgICAgICBUVC5vZmZzZXRbaV1bZmlsZVtpXS5sZW5dID0gb2ZmOworICAgICAgaWYgKCh0b2sgJiBlb2YpKSB7CisgICAgICAgIFRULm9mZnNldFtpXVtmaWxlW2ldLmxlbl0gPSArK29mZjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoYXNoID0gNTgzMTsgIC8vbmV4dCBsaW5lCisgICAgICB0b2sgPSAwOworICAgIH0KKyAgICBpZiAoVFQub2Zmc2V0W2ldW2ZpbGVbaV0ubGVuXSAtIFRULm9mZnNldFtpXVtmaWxlW2ldLmxlbiAtIDFdID09IDEpCisgICAgICBmaWxlW2ldLmxlbi0tOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8PSBmaWxlWzFdLmxlbjsgaSsrKSB2WzFdW2ldLnNlcmlhbCA9IGk7CisgIHFzb3J0KHZbMV0gKyAxLCBmaWxlWzFdLmxlbiwgc2l6ZW9mKHN0cnVjdCB2X3ZlY3RvciksIGNvbXApOworCisgIGUgPSB2WzFdOworICBlWzBdLnNlcmlhbCA9IDA7CisgIGVbMF0ubGFzdCA9IDE7CisgIGZvciAoIGkgPSAxOyBpIDw9IGZpbGVbMV0ubGVuOyBpKyspIHsKKyAgICBpZiAoKGkgPT0gZmlsZVsxXS5sZW4pIHx8ICh2WzFdW2ldLmhhc2ggIT0gdlsxXVtpKzFdLmhhc2gpKSBlW2ldLmxhc3QgPSAxOworICAgIGVsc2UgZVtpXS5sYXN0ID0gMDsKKyAgfQorCisgIHBfdmVjdG9yID0geHphbGxvYygoZmlsZVswXS5sZW4gKyAyKSAqIHNpemVvZihpbnQpKTsKKyAgZm9yIChpID0gMTsgaSA8PSBmaWxlWzBdLmxlbjsgaSsrKSB7CisgICAgdm9pZCAqciA9IGJzZWFyY2goJnZbMF1baV0sIChlICsgMSksIGZpbGVbMV0ubGVuLCBzaXplb2YoZVswXSksIGJjb21wKTsKKyAgICBpZiAocikgcF92ZWN0b3JbaV0gPSAoc3RydWN0IHZfdmVjdG9yKilyIC0gZTsKKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPD0gZmlsZVswXS5sZW47IGkrKykKKyAgICBlW2ldLnAgPSBwX3ZlY3RvcltpXTsKKyAgZnJlZShwX3ZlY3Rvcik7CisKKyAgc2l6ZSA9IDEwMDsKKyAga2NhbmQgPSB4emFsbG9jKHNpemUgKiBzaXplb2Yoc3RydWN0IGNhbmRpZGF0ZSopKTsKKworICBrY2FuZFswXSA9IG5ld19jYW5kaWRhdGUoMCAsIDAsIE5VTEwpOworICBrY2FuZFsxXSA9IG5ld19jYW5kaWRhdGUoZmlsZVswXS5sZW4rMSwgZmlsZVsxXS5sZW4rMSwgTlVMTCk7IC8vdGhlIGZlbmNlCisKKyAgayA9IDA7ICAvL2xhc3Qgc3VjY2Vzc2Z1bGx5IGZpbGxlZCBrIGNhbmRpZGF0ZS4KKyAgZm9yIChpID0gMTsgaSA8PSBmaWxlWzBdLmxlbjsgaSsrKSB7CisKKyAgICBpZiAoIWVbaV0ucCkgY29udGludWU7CisgICAgaWYgKChzaXplIC0gMikgPT0gaykgeworICAgICAgc2l6ZSA9IHNpemUgKiAxMSAvIDEwOworICAgICAga2NhbmQgPSB4cmVhbGxvYyhrY2FuZCwgKHNpemUgKiBzaXplb2Yoc3RydWN0IGNhbmRpZGF0ZSopKSk7CisgICAgfQorICAgIGRvX21lcmdlKGtjYW5kLCAmaywgaSwgZSwgZVtpXS5wKTsKKyAgfQorICBmcmVlKHZbMF0pOyAvL25vIG5lZWQgZm9yIHZfdmVjdG9yIG5vdy4KKyAgZnJlZSh2WzFdKTsKKworICBKID0geHphbGxvYygoZmlsZVswXS5sZW4gKyAyKSAqIHNpemVvZihpbnQpKTsKKworICBmb3IgKHByID0ga2NhbmRba107IHByOyBwciA9IHByLT5wcmV2KQorICAgIEpbcHItPmFdID0gcHItPmI7CisgIEpbZmlsZVswXS5sZW4gKyAxXSA9IGZpbGVbMV0ubGVuKzE7IC8vbWFyayBib3VuZGFyeQorCisgIGZvciAoaSA9IGsgKyAxOyBpID49IDA7IGktLSkgZnJlZV9jYW5kaWRhdGVzKGtjYW5kW2ldKTsKKyAgZnJlZShrY2FuZCk7CisKKyAgZm9yIChpID0gMTsgaSA8PSBmaWxlWzBdLmxlbjsgaSsrKSB7IC8vIGphY2twb3Q/CisgICAgaWYgKCFKW2ldKSBjb250aW51ZTsKKworICAgIGZzZWVrKGZpbGVbMF0uZnAsIFRULm9mZnNldFswXVtpIC0gMV0sIFNFRUtfU0VUKTsKKyAgICBmc2VlayhmaWxlWzFdLmZwLCBUVC5vZmZzZXRbMV1bSltpXSAtIDFdLCBTRUVLX1NFVCk7CisKKyAgICBmb3IgKGogPSBKW2ldOyBpIDw9IGZpbGVbMF0ubGVuICYmIEpbaV0gPT0gajsgaSsrLCBqKyspIHsKKyAgICAgIGludCB0b2swID0gMCwgdG9rMSA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgdG9rMCA9IHJlYWRfdG9rKGZpbGVbMF0uZnAsIE5VTEwsIHRvazApOworICAgICAgICB0b2sxID0gcmVhZF90b2soZmlsZVsxXS5mcCwgTlVMTCwgdG9rMSk7CisgICAgICAgIGlmICgoKHRvazAgXiB0b2sxKSAmIGVtcHR5KSB8fCAoKHRvazAgJiAweGZmKSAhPSAodG9rMSAmIDB4ZmYpKSkKKyAgICAgICAgICBKW2ldID0gMDsKKyAgICAgIH0gd2hpbGUgKCEodG9rMCAmIHRvazEgJiBlbXB0eSkpOworICAgIH0KKyAgfQorICByZXR1cm4gSjsKK30KKworc3RhdGljIGludCAqZGlmZihjaGFyICoqZmlsZXMpCit7CisgIHNpemVfdCBpICxqOworICBpbnQgcywgdDsKKyAgY2hhciAqYnVmaSwgKmJ1Zmo7CisKKyAgVFQuaXNfYmluYXJ5ID0gMDsgLy9sb29wIGNhbGxzIHRvIGRpZmYKKyAgVFQuc3RhdHVzID0gU0FNRTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgaWYgKElTX1NURElOKGZpbGVzW2ldKSkgZmlsZVtpXS5mcCA9IHJlYWRfc3RkaW4oKTsKKyAgICBlbHNlIGZpbGVbaV0uZnAgPSBmb3BlbihmaWxlc1tpXSwgInIiKTsKKworICAgIGlmICghZmlsZVtpXS5mcCl7CisgICAgICBwZXJyb3JfbXNnKCIlcyIsZmlsZXNbaV0pOworICAgICAgVFQuc3RhdHVzID0gMjsKKyAgICAgIHJldHVybiBOVUxMOyAvL3JldHVybiBTQU1FCisgICAgfQorICB9CisKKyAgcyA9IHNpemVvZih0b3lidWYpLzI7CisgIGJ1ZmkgPSB0b3lidWY7CisgIGJ1ZmogPSAodG95YnVmICsgcyk7CisKKyAgZnNlZWsoZmlsZVswXS5mcCwgMCwgU0VFS19TRVQpOworICBmc2VlayhmaWxlWzFdLmZwLCAwLCBTRUVLX1NFVCk7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpIHJldHVybiBjcmVhdGVfal92ZWN0b3IoKTsKKworICB3aGlsZSAoMSkgeworICAgIGkgPSBmcmVhZChidWZpLCAxLCBzLCBmaWxlWzBdLmZwKTsKKyAgICBqID0gZnJlYWQoYnVmaiwgMSwgcywgZmlsZVsxXS5mcCk7CisKKyAgICBpZiAoaSAhPSBqKSBUVC5zdGF0dXMgPSBESUZGRVI7CisKKyAgICBmb3IgKHQgPSAwOyB0IDwgaSAmJiAhVFQuaXNfYmluYXJ5OyB0KyspCisgICAgICBpZiAoIWJ1ZmlbdF0pIFRULmlzX2JpbmFyeSA9IDE7CisgICAgZm9yICh0ID0gMDsgdCA8IGogJiYgIVRULmlzX2JpbmFyeTsgdCsrKQorICAgICAgaWYgKCFidWZqW3RdKSBUVC5pc19iaW5hcnkgPSAxOworCisgICAgaSA9IE1JTihpLCBqKTsKKyAgICBmb3IgKHQgPSAwOyB0IDwgaTsgdCsrKQorICAgICAgaWYgKGJ1ZmlbdF0gIT0gYnVmalt0XSkgVFQuc3RhdHVzID0gRElGRkVSOworCisgICAgaWYgKCFpIHx8ICFqKSBicmVhazsKKyAgfQorICBpZiAoVFQuaXNfYmluYXJ5IHx8IChUVC5zdGF0dXMgPT0gU0FNRSkpIHJldHVybiBOVUxMOworICByZXR1cm4gY3JlYXRlX2pfdmVjdG9yKCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RpZmYoaW50IGEsIGludCBiLCBjaGFyIGMsIGludCAqb2ZmX3NldCwgRklMRSAqZnApCit7CisgIGludCBpLCBqLCBjYywgY2w7CisKKyAgZm9yIChpID0gYTsgaSA8PSBiOyBpKyspIHsKKyAgICBmc2VlayhmcCwgb2ZmX3NldFtpIC0gMV0sIFNFRUtfU0VUKTsKKyAgICBwdXRjaGFyKGMpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19UKSBwdXRjaGFyKCdcdCcpOworICAgIGZvciAoaiA9IDAsIGNsID0gMDsgaiA8ICAob2ZmX3NldFtpXSAtIG9mZl9zZXRbaSAtIDFdKTsgaisrKSB7CisgICAgICBjYyA9IGZnZXRjKGZwKTsKKyAgICAgIGlmIChjYyA9PSBFT0YpIHsKKyAgICAgICAgcHJpbnRmKCJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoKGNjID09ICdcdCcpICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR190KSkKKyAgICAgICAgZG8gcHV0Y2hhcignICcpOyB3aGlsZSAoKytjbCAmIDcpOworICAgICAgZWxzZSB7CisgICAgICAgIHB1dGNoYXIoY2MpOyAvL3hwdXRjIGhhcyBjYWxscyB0byBmZmx1c2gsIGl0IGh1cnRzIHBlcmZvcm1hbmNlIGJhZGx5LgorICAgICAgICBjbCsrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgY2hhciAqY29uY2F0X2ZpbGVfcGF0aChjaGFyICpwYXRoLCBjaGFyICpkZWZhdWx0X3BhdGgpCit7CisgIGNoYXIgKmZpbmFsX3BhdGg7CisKKyAgaWYgKCcvJyA9PSBwYXRoW3N0cmxlbihwYXRoKSAtIDFdKSB7CisgICAgd2hpbGUgKCpkZWZhdWx0X3BhdGggPT0gJy8nKSArK2RlZmF1bHRfcGF0aDsKKyAgICBmaW5hbF9wYXRoID0geG1wcmludGYoIiVzJXMiLCBwYXRoLCBkZWZhdWx0X3BhdGgpOworICB9CisgIGVsc2UgaWYgKCpkZWZhdWx0X3BhdGggIT0gJy8nKQorICAgIGZpbmFsX3BhdGggPSB4bXByaW50ZigiJXMvJXMiLCBwYXRoLCBkZWZhdWx0X3BhdGgpOworICBlbHNlIGZpbmFsX3BhdGggPSB4bXByaW50ZigiJXMlcyIsIHBhdGgsIGRlZmF1bHRfcGF0aCk7CisgIHJldHVybiBmaW5hbF9wYXRoOworfQorCitzdGF0aWMgaW50IHNraXAoc3RydWN0IGRpcnRyZWUgKm5vZGUpCit7CisgIGludCBsZW4gPSBzdHJsZW4odG95cy5vcHRhcmdzW1RULmRpcl9udW1dKSwgcmV0ID0gMDsKKyAgY2hhciAqdG1wID0gTlVMTCwgKnB0ciwgKmZfcGF0aCA9IGRpcnRyZWVfcGF0aChub2RlLCBOVUxMKTsKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgcHRyID0gZl9wYXRoOworICBwdHIgKz0gbGVuOworICBpZiAocHRyWzBdKSB7CisgICAgdG1wID0gY29uY2F0X2ZpbGVfcGF0aCh0b3lzLm9wdGFyZ3NbMSAtIFRULmRpcl9udW1dLCBwdHIpOworICAgIGlmICh0bXAgJiYgIXN0YXQodG1wLCAmc3QpKSByZXQgPSAwOyAvL2l0IGlzIHRoZXJlIG9uIG90aGVyIHNpZGUKKyAgICBlbHNlIHJldCA9IDE7IC8vbm90IHByZXNlbnQgb24gb3RoZXIgc2lkZS4KKyAgfQorICBmcmVlKGZfcGF0aCk7CisgIGlmICh0bXApIGZyZWUodG1wKTsKKyAgcmV0dXJuIHJldDsgLy9hZGQgb3RoZXJ3aXNlCit9CisKK3N0YXRpYyB2b2lkIGFkZF90b19saXN0KHN0cnVjdCBkaXJ0cmVlICpub2RlKQoreworICBjaGFyICpmdWxsX3BhdGg7CisKKyAgZGlyW1RULmRpcl9udW1dLmxpc3QgPSB4cmVhbGxvYyhkaXJbVFQuZGlyX251bV0ubGlzdCwKKyAgICAgIChUVC5zaXplICsgMSkqc2l6ZW9mKGNoYXIqKSk7CisgIFRULnNpemUrKzsKKyAgZnVsbF9wYXRoID0gZGlydHJlZV9wYXRoKG5vZGUsIE5VTEwpOworICBkaXJbVFQuZGlyX251bV0ubGlzdFtUVC5zaXplIC0gMV0gPSBmdWxsX3BhdGg7Cit9CisKK3N0YXRpYyBpbnQgbGlzdF9kaXIgKHN0cnVjdCBkaXJ0cmVlICpub2RlKQoreworICBpbnQgcmV0ID0gMDsKKworICBpZiAobm9kZS0+cGFyZW50ICYmICFkaXJ0cmVlX25vdGRvdGRvdChub2RlKSkgcmV0dXJuIDA7CisKKyAgaWYgKFNfSVNESVIobm9kZS0+c3Quc3RfbW9kZSkgJiYgIW5vZGUtPnBhcmVudCkgeyAvL2FkZCByb290IGRpcnMuCisgICAgYWRkX3RvX2xpc3Qobm9kZSk7CisgICAgcmV0dXJuIChESVJUUkVFX1JFQ1VSU0V8RElSVFJFRV9TWU1GT0xMT1cpOworICB9CisKKyAgaWYgKFNfSVNESVIobm9kZS0+c3Quc3RfbW9kZSkgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpKSB7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfTikpIHJldCA9IHNraXAobm9kZSk7CisgICAgaWYgKCFyZXQpIHJldHVybiAoRElSVFJFRV9SRUNVUlNFfERJUlRSRUVfU1lNRk9MTE9XKTsKKyAgICBlbHNlIHsKKyAgICAgIGFkZF90b19saXN0KG5vZGUpOyAvL29ubHkgYXQgb25lIHNpZGUuCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYWRkX3RvX2xpc3Qobm9kZSk7CisgICAgcmV0dXJuIFNfSVNESVIobm9kZS0+c3Quc3RfbW9kZSkgPyAwIDogKERJUlRSRUVfUkVDVVJTRXxESVJUUkVFX1NZTUZPTExPVyk7CisgIH0KK30KKworc3RhdGljIGludCBjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworICAgcmV0dXJuIHN0cmNtcCgqIChjaGFyICogY29uc3QgKilwMSwgKiAoY2hhciAqIGNvbnN0ICopcDIpOworfQorCitzdGF0aWMgdm9pZCBkb19kaWZmKGNoYXIgKipmaWxlcykKK3sKKworICBsb25nIGkgPSAxLCBzaXplID0gMSwgeCA9IDAsIGNoYW5nZSA9IDAsIGlnbm9yZV93aGl0ZSwKKyAgIHN0YXJ0MSwgZW5kMSwgc3RhcnQyLCBlbmQyOworICBzdHJ1Y3QgZGlmZiAqZDsKKyAgc3RydWN0IGFyZ19saXN0ICpsbGlzdCA9IFRULkxfbGlzdDsKKyAgaW50ICpKOworICAKKyAgVFQub2Zmc2V0WzBdID0gVFQub2Zmc2V0WzFdID0gTlVMTDsKKyAgSiA9IGRpZmYoZmlsZXMpOworCisgIGlmICghSikgcmV0dXJuOyAvL05vIG5lZWQgdG8gY29tcGFyZSwgaGF2ZSB0byBzdGF0dXMgb25seQorCisgIGQgPSB4emFsbG9jKHNpemUgKnNpemVvZihzdHJ1Y3QgZGlmZikpOworICBkbyB7CisgICAgaWdub3JlX3doaXRlID0gMDsKKyAgICBmb3IgKGRbeF0uYSA9IGk7IGRbeF0uYSA8PSBmaWxlWzBdLmxlbjsgZFt4XS5hKyspIHsKKyAgICAgIGlmIChKW2RbeF0uYV0gIT0gKEpbZFt4XS5hIC0gMV0gKyAxKSkgYnJlYWs7CisgICAgICBlbHNlIGNvbnRpbnVlOworICAgIH0KKyAgICBkW3hdLmMgPSAoSltkW3hdLmEgLSAxXSArIDEpOworCisgICAgZm9yIChkW3hdLmIgPSAoZFt4XS5hIC0gMSk7IGRbeF0uYiA8PSBmaWxlWzBdLmxlbjsgZFt4XS5iKyspIHsKKyAgICAgIGlmIChKW2RbeF0uYiArIDFdKSBicmVhazsKKyAgICAgIGVsc2UgY29udGludWU7CisgICAgfQorICAgIGRbeF0uZCA9IChKW2RbeF0uYiArIDFdIC0gMSk7CisKKyAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0IpKSB7CisgICAgICBpZiAoZFt4XS5hIDw9IGRbeF0uYikgeworICAgICAgICBpZiAoKFRULm9mZnNldFswXVtkW3hdLmJdIC0gVFQub2Zmc2V0WzBdW2RbeF0uYSAtIDFdKQorICAgICAgICAgICAgPT0gKGRbeF0uYiAtIGRbeF0uYSArIDEpKQorICAgICAgICAgIGlnbm9yZV93aGl0ZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKGRbeF0uYyA8PSBkW3hdLmQpeworICAgICAgICBpZiAoKFRULm9mZnNldFsxXVtkW3hdLmRdIC0gVFQub2Zmc2V0WzFdW2RbeF0uYyAtIDFdKQorICAgICAgICAgICAgPT0gKGRbeF0uZCAtIGRbeF0uYyArIDEpKQorICAgICAgICAgIGlnbm9yZV93aGl0ZSA9IDE7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChkW3hdLmEgPD0gZFt4XS5iIHx8IGRbeF0uYyA8PSBkW3hdLmQpICYmICFpZ25vcmVfd2hpdGUpCisgICAgICBjaGFuZ2UgPSAxOyAvL2lzIHdlIGhhdmUgZGlmZiA/CisKKyAgICBpZiAoIWlnbm9yZV93aGl0ZSkgZCA9IHhyZWFsbG9jKGQsICh4ICsgMikgKnNpemVvZihzdHJ1Y3QgZGlmZikpOworICAgIGkgPSBkW3hdLmIgKyAxOworICAgIGlmIChpID4gZmlsZVswXS5sZW4pIGJyZWFrOworICAgIEpbZFt4XS5iXSA9IGRbeF0uZDsKKyAgICBpZiAoIWlnbm9yZV93aGl0ZSkgeCsrOworICB9IHdoaWxlIChpIDw9IGZpbGVbMF0ubGVuKTsKKworICBpID0geCsxOworICBUVC5zdGF0dXMgPSBjaGFuZ2U7IC8vdXBkYXRlIHN0YXR1cywgbWF5IGNoYW5nZSBiY296IG9mIC13IGV0Yy4KKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSAmJiBjaGFuZ2UpIHsgIC8vc3RhcnQgb2YgIUZMQUdfcQorCisgICAgICB4cHJpbnRmKCItLS0gJXNcbiIsICh0b3lzLm9wdGZsYWdzICYgRkxBR19MKSA/IGxsaXN0LT5hcmcgOiBmaWxlc1swXSk7CisgICAgICBpZiAoKCh0b3lzLm9wdGZsYWdzICYgRkxBR19MKSAmJiAhbGxpc3QtPm5leHQpIHx8ICEodG95cy5vcHRmbGFncyAmIEZMQUdfTCkpCisgICAgICAgIHhwcmludGYoIisrKyAlc1xuIiwgZmlsZXNbMV0pOworICAgICAgZWxzZSB7CisgICAgICAgIHdoaWxlIChsbGlzdC0+bmV4dCkgbGxpc3QgPSBsbGlzdC0+bmV4dDsKKyAgICAgICAgeHByaW50ZigiKysrICVzXG4iLCBsbGlzdC0+YXJnKTsKKyAgICAgIH0KKworICAgIHN0cnVjdCBkaWZmICp0LCAqcHRyMSA9IGQsICpwdHIyID0gZDsKKyAgICB3aGlsZSAoaSkgeworICAgICAgbG9uZyBhLGI7CisKKyAgICAgIGlmIChUVC5jdCA+IGZpbGVbMF0ubGVuKSBUVC5jdCA9IGZpbGVbMF0ubGVuOyAvL3RyaW0gY29udGV4dCB0byBmaWxlIGxlbi4KKyAgICAgIGlmIChwdHIxLT5iIDwgcHRyMS0+YSAmJiBwdHIxLT5kIDwgcHRyMS0+YykgeworICAgICAgICBpLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy9IYW5kbGUgdGhlIGNvbnRleHQgc3R1ZmYKKyAgICAgIGEgPSAgcHRyMS0+YTsKKyAgICAgIGIgPSAgcHRyMS0+YjsKKworICAgICAgYiAgPSBNSU4oZmlsZVswXS5sZW4sIGIpOworICAgICAgaWYgKGkgPT0geCArIDEpIHB0cjEtPnN1ZmYgPSBNQVgoMSxhIC0gVFQuY3QpOworICAgICAgZWxzZSB7CisgICAgICAgIGlmICgocHRyMSAtIDEpLT5wcmV2ID49IChwdHIxLT5hIC0gVFQuY3QpKQorICAgICAgICAgIHB0cjEtPnN1ZmYgPSAocHRyMSAtIDEpLT5wcmV2ICsgMTsKKyAgICAgICAgZWxzZSBwdHIxLT5zdWZmID0gIHB0cjEtPmEgLSBUVC5jdDsKKyAgICAgIH0KK2NhbGNfY3Q6CisgICAgICBpZiAoaSA+IDEpIHsKKyAgICAgICAgaWYgKChwdHIyLT5iICsgVFQuY3QpID49IChwdHIyICArIDEpLT5hKSB7CisgICAgICAgICAgcHRyMisrOworICAgICAgICAgIGktLTsKKyAgICAgICAgICBnb3RvIGNhbGNfY3Q7CisgICAgICAgIH0gZWxzZSBwdHIyLT5wcmV2ID0gcHRyMi0+YiArIFRULmN0OworICAgICAgfSBlbHNlIHB0cjItPnByZXYgPSBwdHIyLT5iOworICAgICAgc3RhcnQxID0gKHB0cjItPnByZXYgLSBwdHIxLT5zdWZmICsgMSk7CisgICAgICBlbmQxID0gKHN0YXJ0MSA9PSAxKSA/IC0xIDogc3RhcnQxOworICAgICAgc3RhcnQyID0gTUFYKDEsIHB0cjEtPmMgLSAocHRyMS0+YSAtIHB0cjEtPnN1ZmYpKTsKKyAgICAgIGVuZDIgPSBwdHIyLT5wcmV2IC0gcHRyMi0+YiArIHB0cjItPmQ7CisKKyAgICAgIHByaW50ZigiQEAgLSVsZCIsIHN0YXJ0MSA/IHB0cjEtPnN1ZmY6IChwdHIxLT5zdWZmIC0xKSk7CisgICAgICBpZiAoZW5kMSAhPSAtMSkgcHJpbnRmKCIsJWxkICIsIHB0cjItPnByZXYtcHRyMS0+c3VmZiArIDEpOworICAgICAgZWxzZSBwdXRjaGFyKCcgJyk7CisKKyAgICAgIHByaW50ZigiKyVsZCIsIChlbmQyIC0gc3RhcnQyICsgMSkgPyBzdGFydDI6IChzdGFydDIgLTEpKTsKKyAgICAgIGlmICgoZW5kMiAtIHN0YXJ0MiArMSkgIT0gMSkgcHJpbnRmKCIsJWxkICIsIChlbmQyIC0gc3RhcnQyICsxKSk7CisgICAgICBlbHNlIHB1dGNoYXIoJyAnKTsKKyAgICAgIHByaW50ZigiQEBcbiIpOworCisgICAgICBmb3IgKHQgPSBwdHIxOyB0IDw9IHB0cjI7IHQrKykgeworICAgICAgICBpZiAodD09IHB0cjEpIHByaW50X2RpZmYodC0+c3VmZiwgdC0+YS0xLCAnICcsIFRULm9mZnNldFswXSwgZmlsZVswXS5mcCk7CisgICAgICAgIHByaW50X2RpZmYodC0+YSwgdC0+YiwgJy0nLCBUVC5vZmZzZXRbMF0sIGZpbGVbMF0uZnApOworICAgICAgICBwcmludF9kaWZmKHQtPmMsIHQtPmQsICcrJywgVFQub2Zmc2V0WzFdLCBmaWxlWzFdLmZwKTsKKyAgICAgICAgaWYgKHQgPT0gcHRyMikKKyAgICAgICAgICBwcmludF9kaWZmKHQtPmIrMSwgKHQpLT5wcmV2LCAnICcsIFRULm9mZnNldFswXSwgZmlsZVswXS5mcCk7CisgICAgICAgIGVsc2UgcHJpbnRfZGlmZih0LT5iKzEsICh0KzEpLT5hLTEsICcgJywgVFQub2Zmc2V0WzBdLCBmaWxlWzBdLmZwKTsKKyAgICAgIH0KKyAgICAgIHB0cjIrKzsKKyAgICAgIHB0cjEgPSBwdHIyOworICAgICAgaS0tOworICAgIH0gLy9lbmQgb2Ygd2hpbGUKKyAgfSAvL0VuZCBvZiAhRkxBR19xCisgIGZyZWUoZCk7CisgIGZyZWUoSik7CisgIGZyZWUoVFQub2Zmc2V0WzBdKTsKKyAgZnJlZShUVC5vZmZzZXRbMV0pOworfQorCitzdGF0aWMgdm9pZCBzaG93X3N0YXR1cyhjaGFyICoqZmlsZXMpCit7CisgIHN3aXRjaCAoVFQuc3RhdHVzKSB7CisgICAgY2FzZSBTQU1FOgorICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpCisgICAgICAgIHByaW50ZigiRmlsZXMgJXMgYW5kICVzIGFyZSBpZGVudGljYWxcbiIsZmlsZXNbMF0sIGZpbGVzWzFdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElGRkVSOgorICAgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19xKSB8fCBUVC5pc19iaW5hcnkpCisgICAgICAgIHByaW50ZigiRmlsZXMgJXMgYW5kICVzIGRpZmZlclxuIixmaWxlc1swXSwgZmlsZXNbMV0pOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2VtcHR5X2VudHJ5KGludCBsICwgaW50IHIsIGludCBqKQoreworICBzdHJ1Y3Qgc3RhdCBzdFsyXTsKKyAgY2hhciAqZlsyXSwgKnBhdGhbMl07CisgIGludCBpOworCisgIGlmIChqID4gMCAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfTikpIHsKKyAgICBwYXRoWzBdID0gY29uY2F0X2ZpbGVfcGF0aChkaXJbMF0ubGlzdFswXSwgZGlyWzFdLmxpc3Rbcl0gKyBUVC5sZW5bMV0pOworICAgIGZbMF0gPSAiL2Rldi9udWxsIjsKKyAgICBwYXRoWzFdID0gZlsxXSA9IGRpclsxXS5saXN0W3JdOworICAgIHN0YXQoZlsxXSwgJnN0WzBdKTsKKyAgICBzdFsxXSA9IHN0WzBdOworICB9CisgIGVsc2UgaWYgKGogPCAwICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19OKSkgeworICAgIHBhdGhbMV0gPSBjb25jYXRfZmlsZV9wYXRoKGRpclsxXS5saXN0WzBdLCBkaXJbMF0ubGlzdFtsXSArIFRULmxlblswXSk7CisgICAgZlsxXSA9ICIvZGV2L251bGwiOworICAgIHBhdGhbMF0gPSBmWzBdID0gZGlyWzBdLmxpc3RbbF07CisgICAgc3RhdChmWzBdLCAmc3RbMF0pOworICAgIHN0WzFdID0gc3RbMF07CisgIH0KKworICBpZiAoIWopIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBwYXRoW2ldID0gZltpXSA9IGRpcltpXS5saXN0WyFpID8gbDogcl07CisgICAgICBzdGF0KGZbaV0sICZzdFtpXSk7CisgICAgfQorICB9CisKKyAgaWYgKFNfSVNESVIoc3RbMF0uc3RfbW9kZSkgJiYgU19JU0RJUihzdFsxXS5zdF9tb2RlKSkKKyAgICBwcmludGYoIkNvbW1vbiBzdWJkaXJlY3RvcmllczogJXMgYW5kICVzXG4iLCBwYXRoWzBdLCBwYXRoWzFdKTsKKyAgZWxzZSBpZiAoIVNfSVNSRUcoc3RbMF0uc3RfbW9kZSkgJiYgIVNfSVNESVIoc3RbMF0uc3RfbW9kZSkpCisgICAgcHJpbnRmKCJGaWxlICVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnkgIgorICAgICAgICAiYW5kIHdhcyBza2lwcGVkXG4iLCBwYXRoWzBdKTsKKyAgZWxzZSBpZiAoIVNfSVNSRUcoc3RbMV0uc3RfbW9kZSkgJiYgIVNfSVNESVIoc3RbMV0uc3RfbW9kZSkpCisgICAgcHJpbnRmKCJGaWxlICVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnkgIgorICAgICAgICAiYW5kIHdhcyBza2lwcGVkXG4iLCBwYXRoWzFdKTsKKyAgZWxzZSBpZiAoU19JU0RJUihzdFswXS5zdF9tb2RlKSAhPSBTX0lTRElSKHN0WzFdLnN0X21vZGUpKSB7CisgICAgaWYgKFNfSVNESVIoc3RbMF0uc3RfbW9kZSkpCisgICAgICBwcmludGYoIkZpbGUgJXMgaXMgYSAlcyB3aGlsZSBmaWxlICVzIGlzIGEiCisgICAgICAgICAgIiAlc1xuIiwgcGF0aFswXSwgImRpcmVjdG9yeSIsIHBhdGhbMV0sICJyZWd1bGFyIGZpbGUiKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIkZpbGUgJXMgaXMgYSAlcyB3aGlsZSBmaWxlICVzIGlzIGEiCisgICAgICAgICAgIiAlc1xuIiwgcGF0aFswXSwgInJlZ3VsYXIgZmlsZSIsIHBhdGhbMV0sICJkaXJlY3RvcnkiKTsKKyAgfSBlbHNlIHsKKyAgICBkb19kaWZmKGYpOworICAgIHNob3dfc3RhdHVzKHBhdGgpOworICAgIGlmIChmaWxlWzBdLmZwKSBmY2xvc2UoZmlsZVswXS5mcCk7CisgICAgaWYgKGZpbGVbMV0uZnApIGZjbG9zZShmaWxlWzFdLmZwKTsKKyAgfQorCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfTikgJiYgaikgeworICAgIGlmIChqID4gMCkgZnJlZShwYXRoWzBdKTsKKyAgICBlbHNlIGZyZWUocGF0aFsxXSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZGlmZl9kaXIoaW50ICpzdGFydCkKK3sKKyAgaW50IGwsIHIsIGogPSAwOworCisgIGwgPSBzdGFydFswXTsgLy9sZWZ0IHNpZGUgZmlsZSBzdGFydAorICByID0gc3RhcnRbMV07IC8vcmlnaHQgc2lkZSBmaWxlIHN0YXJ0CisgIHdoaWxlIChsIDwgZGlyWzBdLm5yX2VsbSAmJiByIDwgZGlyWzFdLm5yX2VsbSkgeworICAgIGlmICgoaiA9IHN0cmNtcCAoKGRpclswXS5saXN0W2xdICsgVFQubGVuWzBdKSwKKyAgICAgICAgICAgIChkaXJbMV0ubGlzdFtyXSArIFRULmxlblsxXSkpKSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX04pKSB7CisgICAgICBpZiAoaiA+IDApIHsKKyAgICAgICAgcHJpbnRmICgiT25seSBpbiAlczogJXNcbiIsIGRpclsxXS5saXN0WzBdLCBkaXJbMV0ubGlzdFtyXSArIFRULmxlblsxXSk7CisgICAgICAgIGZyZWUoZGlyWzFdLmxpc3Rbcl0pOworICAgICAgICByKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCJPbmx5IGluICVzOiAlc1xuIiwgZGlyWzBdLmxpc3RbMF0sIGRpclswXS5saXN0W2xdICsgVFQubGVuWzBdKTsKKyAgICAgICAgZnJlZShkaXJbMF0ubGlzdFtsXSk7CisgICAgICAgIGwrKzsKKyAgICAgIH0KKyAgICAgIFRULnN0YXR1cyA9IERJRkZFUjsKKyAgICB9IGVsc2UgeworICAgICAgY3JlYXRlX2VtcHR5X2VudHJ5KGwsIHIsIGopOyAvL2NyZWF0ZSBub24gZW1wdHkgZGlycy9maWxlcyBpZiAtTi4KKyAgICAgIGlmIChqID4gMCkgeworICAgICAgICBmcmVlKGRpclsxXS5saXN0W3JdKTsKKyAgICAgICAgcisrOworICAgICAgfSBlbHNlIGlmIChqIDwgMCkgeworICAgICAgICBmcmVlKGRpclswXS5saXN0W2xdKTsKKyAgICAgICAgbCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJlZShkaXJbMV0ubGlzdFtyXSk7CisgICAgICAgIGZyZWUoZGlyWzBdLmxpc3RbbF0pOworICAgICAgICBsKys7CisgICAgICAgIHIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobCA9PSBkaXJbMF0ubnJfZWxtKSB7CisgICAgd2hpbGUgKHIgPCBkaXJbMV0ubnJfZWxtKSB7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19OKSkgeworICAgICAgICBwcmludGYgKCJPbmx5IGluICVzOiAlc1xuIiwgZGlyWzFdLmxpc3RbMF0sIGRpclsxXS5saXN0W3JdICsgVFQubGVuWzFdKTsKKyAgICAgICAgVFQuc3RhdHVzID0gRElGRkVSOworICAgICAgfSBlbHNlIGNyZWF0ZV9lbXB0eV9lbnRyeShsLCByLCAxKTsKKyAgICAgIGZyZWUoZGlyWzFdLmxpc3Rbcl0pOworICAgICAgcisrOworICAgIH0KKyAgfSBlbHNlIGlmIChyID09IGRpclsxXS5ucl9lbG0pIHsKKyAgICB3aGlsZSAobCA8IGRpclswXS5ucl9lbG0pIHsKKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX04pKSB7CisgICAgICAgIHByaW50ZiAoIk9ubHkgaW4gJXM6ICVzXG4iLCBkaXJbMF0ubGlzdFswXSwgZGlyWzBdLmxpc3RbbF0gKyBUVC5sZW5bMF0pOworICAgICAgICBUVC5zdGF0dXMgPSBESUZGRVI7CisgICAgICB9IGVsc2UgY3JlYXRlX2VtcHR5X2VudHJ5KGwsIHIsIC0xKTsKKyAgICAgIGZyZWUoZGlyWzBdLmxpc3RbbF0pOworICAgICAgbCsrOworICAgIH0KKyAgfQorICBmcmVlKGRpclswXS5saXN0WzBdKTsgLy93ZSBhcmUgZG9uZSwgZnJlZSByb290IG5vZGVzIHRvbworICBmcmVlKGRpclsxXS5saXN0WzBdKTsKK30KKwordm9pZCBkaWZmX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHN0YXQgc3RbMl07CisgIGludCBqID0gMCwgayA9IDEsIHN0YXJ0WzJdID0gezEsIDF9OworICBjaGFyICpmaWxlc1syXTsKKworICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgZmlsZXNbal0gPSB0b3lzLm9wdGFyZ3Nbal07CisgICAgaWYgKElTX1NURElOKGZpbGVzW2pdKSkgeworICAgICAgaWYgKGZzdGF0KDAsICZzdFtqXSkgPT0gLTEpCisgICAgICAgIHBlcnJvcl9leGl0KCJjYW4gZnN0YXQgJXMiLCBmaWxlc1tqXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdGF0KGZpbGVzW2pdLCAmc3Rbal0pID09IC0xKQorICAgICAgICBwZXJyb3JfZXhpdCgiY2FuJ3Qgc3RhdCAlcyIsIGZpbGVzW2pdKTsKKyAgICB9CisgIH0KKworICBpZiAoSVNfU1RESU4oZmlsZXNbMF0pICYmIElTX1NURElOKGZpbGVzWzFdKSkgeyAvL2NvbXBhdCA6KAorICAgIHNob3dfc3RhdHVzKGZpbGVzKTsgIC8vY2hlY2sgQVNBUAorICAgIHJldHVybjsKKyAgfQorCisgIGlmICgoSVNfU1RESU4oZmlsZXNbMF0pIHx8IElTX1NURElOKGZpbGVzWzFdKSkKKyAgICAgICYmIChTX0lTRElSKHN0WzBdLnN0X21vZGUpIHx8IFNfSVNESVIoc3RbMV0uc3RfbW9kZSkpKQorICAgIGVycm9yX2V4aXQoImNhbid0IGNvbXBhcmUgc3RkaW4gdG8gZGlyZWN0b3J5Iik7CisKKyAgaWYgKChzdFswXS5zdF9pbm8gPT0gc3RbMV0uc3RfaW5vKSAvL3BoeXNpY2FseSBzYW1lIGRldmljZQorICAgICAgJiYoc3RbMF0uc3RfZGV2ID09IHN0WzFdLnN0X2RldikpIHsKKyAgICBzaG93X3N0YXR1cyhmaWxlcyk7CisgICAgcmV0dXJuIDsKKyAgfQorCisgIGlmIChTX0lTRElSKHN0WzBdLnN0X21vZGUpICYmIFNfSVNESVIoc3RbMV0uc3RfbW9kZSkpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICBtZW1zZXQoJmRpcltqXSwgMCwgc2l6ZW9mKHN0cnVjdCBkaXJfdCkpOworICAgICAgZGlydHJlZV9mbGFncmVhZChmaWxlc1tqXSwgRElSVFJFRV9TWU1GT0xMT1csIGxpc3RfZGlyKTsKKyAgICAgIGRpcltqXS5ucl9lbG0gPSBUVC5zaXplOyAvL3NpemUgdXBkYXRlZCBpbiBsaXN0X2RpcgorICAgICAgcXNvcnQoJihkaXJbal0ubGlzdFsxXSksIChUVC5zaXplIC0gMSksIHNpemVvZihjaGFyKiksIGNtcCk7CisKKyAgICAgIFRULmxlbltqXSA9IHN0cmxlbihkaXJbal0ubGlzdFswXSk7IC8vY2FsYyByb290IG5vZGUgbGVuCisgICAgICBUVC5sZW5bal0gKz0gKGRpcltqXS5saXN0WzBdW1RULmxlbltqXSAtMV0gIT0gJy8nKTsKKworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1MpIHsKKyAgICAgICAgd2hpbGUgKGsgPCBUVC5zaXplICYmIHN0cmNtcChkaXJbal0ubGlzdFtrXSArCisgICAgICAgICAgICAgIFRULmxlbltqXSwgVFQuc3RhcnQpIDwgMCkgeworICAgICAgICAgIHN0YXJ0W2pdICs9IDE7CisgICAgICAgICAgaysrOworICAgICAgICB9CisgICAgICB9CisgICAgICBUVC5kaXJfbnVtKys7CisgICAgICBUVC5zaXplID0gMDsKKyAgICAgIGsgPSAxOworICAgIH0KKyAgICBkaWZmX2RpcihzdGFydCk7CisgICAgZnJlZShkaXJbMF0ubGlzdCk7IC8vZnJlZSBhcnJheQorICAgIGZyZWUoZGlyWzFdLmxpc3QpOworICB9IGVsc2UgeworICAgIGlmIChTX0lTRElSKHN0WzBdLnN0X21vZGUpIHx8IFNfSVNESVIoc3RbMV0uc3RfbW9kZSkpIHsKKyAgICAgIGludCBkID0gU19JU0RJUihzdFswXS5zdF9tb2RlKTsKKyAgICAgIGNoYXIgKnNsYXNoID0gc3RycmNocihmaWxlc1tkXSwgJy8nKTsKKworICAgICAgZmlsZXNbMSAtIGRdID0gY29uY2F0X2ZpbGVfcGF0aChmaWxlc1sxIC0gZF0sIHNsYXNoID8gc2xhc2ggKyAxIDogZmlsZXNbZF0pOworICAgICAgaWYgKChzdGF0KGZpbGVzWzEgLSBkXSwgJnN0WzEgLSBkXSkpID09IC0xKQorICAgICAgICBwZXJyb3JfZXhpdCgiJXMiLCBmaWxlc1sxIC0gZF0pOworICAgIH0KKyAgICBkb19kaWZmKGZpbGVzKTsKKyAgICBzaG93X3N0YXR1cyhmaWxlcyk7CisgICAgaWYgKGZpbGVbMF0uZnApIGZjbG9zZShmaWxlWzBdLmZwKTsKKyAgICBpZiAoZmlsZVsxXS5mcCkgZmNsb3NlKGZpbGVbMV0uZnApOworICB9CisgIHRveXMuZXhpdHZhbCA9IFRULnN0YXR1czsgLy9leGl0IHN0YXR1cyB3aWxsIGJlIHRoZSBzdGF0dXMKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvZHVtcGxlYXNlcy5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9kdW1wbGVhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxN2FhYgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvZHVtcGxlYXNlcy5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIGR1bXBsZWFzZXMuYyAtIER1bXAgdGhlIGxlYXNlcyBncmFudGVkIGJ5IHVkaGNwZC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisKK1VTRV9EVU1QTEVBU0VTKE5FV1RPWShkdW1wbGVhc2VzLCAiPjBhcmY6WyFhcl0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBEVU1QTEVBU0VTCisgIGJvb2wgImR1bXBsZWFzZXMiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGR1bXBsZWFzZXMgWy1yfC1hXSBbLWYgTEVBU0VGSUxFXQorCisgICAgRGlzcGxheSBESENQIGxlYXNlcyBncmFudGVkIGJ5IHVkaGNwZAorICAgIC1mIEZJTEUsICBMZWFzZSBmaWxlCisgICAgLXIgICAgICAgIFNob3cgcmVtYWluaW5nIHRpbWUKKyAgICAtYSAgICAgICAgU2hvdyBleHBpcmF0aW9uIHRpbWUKKyovCisKKyNkZWZpbmUgRk9SX2R1bXBsZWFzZXMKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgICAgY2hhciAqZmlsZTsKKykKKworLy9sZWFzZSBzdHJ1Y3R1cmUKK3N0cnVjdCBsZWFzZSB7IAorICB1aW50MzJfdCBleHBpcmVzOworICB1aW50MzJfdCBsZWFzZV9uaXA7CisgIHVpbnQ4X3QgbGVhc2VfbWFjWzZdOworICBjaGFyIGhvc3RuYW1lWzIwXTsKKyAgdWludDhfdCBwYWRbMl07IC8vUGFkZGluZworfTsKKwordm9pZCBkdW1wbGVhc2VzX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKKyAgc3RydWN0IGxlYXNlIGxlYXNlX3N0cnVjdDsKKyAgaW50NjRfdCB3cml0dGVuX3RpbWUgLCBjdXJyZW50X3RpbWUsIGV4cDsKKyAgaW50IGksIGZkOyAKKyAgCisgIGlmKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZikpIFRULmZpbGUgPSAiL3Zhci9saWIvbWlzYy9kaGNwZC5sZWFzZXMiOyAvL0RFRl9MRUFTRV9GSUxFCisgIGZkID0geG9wZW5ybyhUVC5maWxlKTsKKyAgeHByaW50ZigiTWFjIEFkZHJlc3MgICAgICAgSVAgQWRkcmVzcyAgICAgIEhvc3QgTmFtZSAgICAgICAgICAgRXhwaXJlcyAlc1xuIiwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpID8gImF0IiA6ICJpbiIpOworICB4cmVhZChmZCwgJndyaXR0ZW5fdGltZSwgc2l6ZW9mKHdyaXR0ZW5fdGltZSkpOworICBjdXJyZW50X3RpbWUgPSB0aW1lKE5VTEwpOworICB3cml0dGVuX3RpbWUgPSBTV0FQX0JFNjQod3JpdHRlbl90aW1lKTsKKyAgaWYoY3VycmVudF90aW1lIDwgd3JpdHRlbl90aW1lKSB3cml0dGVuX3RpbWUgPSBjdXJyZW50X3RpbWU7CisKKyAgd2hpbGUoc2l6ZW9mKGxlYXNlX3N0cnVjdCkgPT0gCisgICAgICAocmVhZGFsbChmZCwgJmxlYXNlX3N0cnVjdCwgc2l6ZW9mKGxlYXNlX3N0cnVjdCkpKSkgeworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHByaW50ZigiOiUwMngiKyAhaSwgbGVhc2Vfc3RydWN0LmxlYXNlX21hY1tpXSk7CisgICAgCisgICAgYWRkci5zX2FkZHIgPSBsZWFzZV9zdHJ1Y3QubGVhc2VfbmlwOworICAgIGxlYXNlX3N0cnVjdC5ob3N0bmFtZVsxOV0gPSAnXDAnOworICAgIHhwcmludGYoIiAlLTE2cyUtMjBzIiwgaW5ldF9udG9hKGFkZHIpLCBsZWFzZV9zdHJ1Y3QuaG9zdG5hbWUgKTsKKyAgICBleHAgPSBudG9obChsZWFzZV9zdHJ1Y3QuZXhwaXJlcykgKyB3cml0dGVuX3RpbWU7CisgICAgaWYgKGV4cCA8PSBjdXJyZW50X3RpbWUpIHsKKyAgICAgIHhwdXRzKCJleHBpcmVkIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfYSkpIHsgCisgICAgICB1bnNpZ25lZCBkdCwgaHIsIG07CisgICAgICB1bnNpZ25lZCBleHBpcmVzID0gZXhwIC0gY3VycmVudF90aW1lOworICAgICAgZHQgPSBleHBpcmVzIC8gKDI0KjYwKjYwKTsgZXhwaXJlcyAlPSAoMjQqNjAqNjApOworICAgICAgaHIgPSBleHBpcmVzIC8gKDYwKjYwKTsgZXhwaXJlcyAlPSAoNjAqNjApOworICAgICAgbSA9IGV4cGlyZXMgLyA2MDsgZXhwaXJlcyAlPSA2MDsKKyAgICAgIGlmIChkdCkgeHByaW50ZigiJXUgZGF5cyAiLCBkdCk7CisgICAgICB4cHJpbnRmKCIlMDJ1OiUwMnU6JTAydVxuIiwgaHIsIG0sICh1bnNpZ25lZClleHBpcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgZnB1dHMoY3RpbWUoKGNvbnN0IHRpbWVfdCopJmV4cCksIHN0ZG91dCk7CisgICAgfQorICB9CisgIHhjbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2V4cHIuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2E5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2V4cHIuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogZXhwci5jIC0gZXZhbHVhdGUgZXhwcmVzc2lvbgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMyBEYW5pZWwgVmVya2FtcCA8ZGFuaWVsQGRydi5udT4KKyAqCisgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZXhwci5odG1sCisgKgorICogVGhlIHdlYiBzdGFuZGFyZCBpcyBpbmNvbXBsZXRlIChwcmVjZWRlbmNlIGdyb3VwaW5nIG1pc3NpbmcpLCBzZWU6CisgKiBodHRwOi8vcGVybWFsaW5rLmdtYW5lLm9yZy9nbWFuZS5jb21wLnN0YW5kYXJkcy5wb3NpeC5hdXN0aW4uZ2VuZXJhbC8xMDE0MQorICoKKyAqIGV2YWxfZXhwcigpIHVzZXMgdGhlIHJlY3Vyc2l2ZSAiUHJlY2VkZW5jZSBDbGltYmluZyIgYWxnb3JpdGhtOgorICoKKyAqIENsYXJrZSwgS2VpdGguICJUaGUgdG9wLWRvd24gcGFyc2luZyBvZiBleHByZXNzaW9ucy4iIFVuaXZlcnNpdHkgb2YgTG9uZG9uLgorICogUXVlZW4gTWFyeSBDb2xsZWdlLiBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgYW5kIFN0YXRpc3RpY3MsIDE5ODYuCisgKgorICogaHR0cDovL3d3dy5hbnRsci5vcmcvcGFwZXJzL0NsYXJrZS1leHByLXBhcnNpbmctMTk4Ni5wZGYKKyAqCisgKiBOaWNlIGV4cGxhbmF0aW9uIGFuZCBQeXRob24gaW1wbGVtZW50YXRpb246CisgKiBodHRwOi8vZWxpLnRoZWdyZWVucGxhY2UubmV0LzIwMTIvMDgvMDIvcGFyc2luZy1leHByZXNzaW9ucy1ieS1wcmVjZWRlbmNlLWNsaW1iaW5nCisKK1VTRV9FWFBSKE5FV1RPWShleHByLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBFWFBSCisgIGJvb2wgImV4cHIiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGV4cHIgQVJHMSBPUEVSQVRPUiBBUkcyLi4uCisKKyAgICBFdmFsdWF0ZSBleHByZXNzaW9uIGFuZCBwcmludCByZXN1bHQuIEZvciBleGFtcGxlLCAiZXhwciAxICsgMiIuCisKKyAgICBUaGUgc3VwcG9ydGVkIG9wZXJhdG9ycyBhcmUgKGdyb3VwZWQgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBwcmlvcml0eSk6CisKKyAgICAgICggKSAgICA6ICAgICogLyAlICAgICsgLSAgICAhPSA8PSA8ID49ID4gPSAgICAmICAgIHwKKworICAgIEVhY2ggY29uc3RhbnQgYW5kIG9wZXJhdG9yIG11c3QgYmUgYSBzZXBhcmF0ZSBjb21tYW5kIGxpbmUgYXJndW1lbnQuCisgICAgQWxsIG9wZXJhdG9ycyBhcmUgaW5maXgsIG1lYW5pbmcgdGhleSBleHBlY3QgYSBjb25zdGFudCAob3IgZXhwcmVzc2lvbgorICAgIHRoYXQgcmVzb2x2ZXMgdG8gYSBjb25zdGFudCkgb24gZWFjaCBzaWRlIG9mIHRoZSBvcGVyYXRvci4gT3BlcmF0b3JzIG9mCisgICAgdGhlIHNhbWUgcHJpb3JpdHkgKHdpdGhpbiBlYWNoIGdyb3VwIGFib3ZlKSBhcmUgZXZhbHVhdGVkIGxlZnQgdG8gcmlnaHQuCisgICAgUGFyZW50aGVzZXMgbWF5IGJlIHVzZWQgKGFzIHNlcGFyYXRlIGFyZ3VtZW50cykgdG8gZWxldmF0ZSB0aGUgcHJpb3JpdHkKKyAgICBvZiBleHByZXNzaW9ucy4KKworICAgIENhbGxpbmcgZXhwciBmcm9tIGEgY29tbWFuZCBzaGVsbCByZXF1aXJlcyBhIGxvdCBvZiBcKCBvciAnKicgZXNjYXBpbmcKKyAgICB0byBhdm9pZCBpbnRlcnByZXRpbmcgc2hlbGwgY29udHJvbCBjaGFyYWN0ZXJzLgorCisgICAgVGhlICYgYW5kIHwgb3BlcmF0b3JzIGFyZSBsb2dpY2FsIChub3QgYml0d2lzZSkgYW5kIG1heSBvcGVyYXRlIG9uCisgICAgc3RyaW5ncyAoYSBibGFuayBzdHJpbmcgaXMgImZhbHNlIikuIENvbXBhcmlzb24gb3BlcmF0b3JzIG1heSBhbHNvCisgICAgb3BlcmF0ZSBvbiBzdHJpbmdzIChhbHBoYWJldGljYWwgc29ydCkuCisKKyAgICBDb25zdGFudHMgbWF5IGJlIHN0cmluZ3Mgb3IgaW50ZWdlcnMuIENvbXBhcmlzb24sIGxvZ2ljYWwsIGFuZCByZWdleAorICAgIG9wZXJhdG9ycyBtYXkgb3BlcmF0ZSBvbiBzdHJpbmdzIChhIGJsYW5rIHN0cmluZyBpcyAiZmFsc2UiKSwgb3RoZXIKKyAgICBvcGVyYXRvcnMgcmVxdWlyZSBpbnRlZ2Vycy4KKyovCisKKy8vIFRPRE86IGludCBvdmVyZmxvdyBjaGVja2luZworCisjZGVmaW5lIEZPUl9leHByCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICoqdG9rOyAvLyBjdXJyZW50IHRva2VuLCBub3Qgb24gdGhlIHN0YWNrIHNpbmNlIHJlY3Vyc2l2ZSBjYWxscyBtdXRhdGUgaXQKKworICBjaGFyICpyZWZyZWU7CispCisKKy8vIFNjYWxhciB2YWx1ZS4gIElmIHMgIT0gTlVMTCwgaXQncyBhIHN0cmluZywgb3RoZXJ3aXNlIGl0J3MgYW4gaW50Lgorc3RydWN0IHZhbHVlIHsKKyAgY2hhciAqczsKKyAgbG9uZyBsb25nIGk7Cit9OworCisvLyBHZXQgdGhlIHZhbHVlIGFzIGEgc3RyaW5nLgorY2hhciAqZ2V0X3N0cihzdHJ1Y3QgdmFsdWUgKnYpCit7CisgIGlmICh2LT5zKSByZXR1cm4gdi0+czsKKyAgZWxzZSByZXR1cm4geG1wcmludGYoIiVsbGQiLCB2LT5pKTsKK30KKworLy8gR2V0IHRoZSB2YWx1ZSBhcyBhbiBpbnRlZ2VyIGFuZCByZXR1cm4gMSwgb3IgcmV0dXJuIDAgb24gZXJyb3IuCitpbnQgZ2V0X2ludChzdHJ1Y3QgdmFsdWUgKnYsIGxvbmcgbG9uZyAqcmV0KQoreworICBpZiAodi0+cykgeworICAgIGNoYXIgKmVuZHA7CisKKyAgICAqcmV0ID0gc3RydG9sbCh2LT5zLCAmZW5kcCwgMTApOworCisgICAgaWYgKCplbmRwKSByZXR1cm4gMDsgLy8gSWYgZW5kcCBwb2ludHMgdG8gTlVMLCBhbGwgY2hhcnMgd2VyZSBjb252ZXJ0ZWQKKyAgfSBlbHNlICpyZXQgPSB2LT5pOworCisgIHJldHVybiAxOworfQorCisvLyBQcmVzZXJ2ZSB0aGUgaW52YXJpYW50IHRoYXQgdi5zIGlzIE5VTEwgd2hlbiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlci4KK3ZvaWQgYXNzaWduX2ludChzdHJ1Y3QgdmFsdWUgKnYsIGxvbmcgbG9uZyBpKQoreworICB2LT5pID0gaTsKKyAgdi0+cyA9IE5VTEw7Cit9CisKKy8vIENoZWNrIGlmIHYgaXMgMCBvciB0aGUgZW1wdHkgc3RyaW5nLgorc3RhdGljIGludCBpc19mYWxzZShzdHJ1Y3QgdmFsdWUgKnYpCit7CisgIHJldHVybiBnZXRfaW50KHYsICZ2LT5pKSAmJiAhdi0+aTsKK30KKworLy8gJ3JldCcgaXMgZmlsbGVkIHdpdGggYSBzdHJpbmcgY2FwdHVyZSBvciBpbnQgbWF0Y2ggcG9zaXRpb24uCitzdGF0aWMgdm9pZCByZShjaGFyICp0YXJnZXQsIGNoYXIgKnBhdHRlcm4sIHN0cnVjdCB2YWx1ZSAqcmV0KQoreworICByZWdleF90IHBhdDsKKyAgcmVnbWF0Y2hfdCBtWzJdOworCisgIHhyZWdjb21wKCZwYXQsIHBhdHRlcm4sIDApOworICAvLyBtdXN0IG1hdGNoIGF0IHBvcyAwCisgIGlmICghcmVnZXhlYygmcGF0LCB0YXJnZXQsIDIsIG0sIDApICYmICFtWzBdLnJtX3NvKSB7CisgICAgLy8gUmV0dXJuIGZpcnN0IHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbiBhcyBzdHJpbmcsIG9yIGxlbmd0aCBvZiBtYXRjaAorICAgIGlmIChwYXQucmVfbnN1Yj4wKSB7CisgICAgICByZXQtPnMgPSB4bXByaW50ZigiJS4qcyIsIG1bMV0ucm1fZW8tbVsxXS5ybV9zbywgdGFyZ2V0K21bMV0ucm1fc28pOworICAgICAgaWYgKFRULnJlZnJlZSkgZnJlZShUVC5yZWZyZWUpOworICAgICAgVFQucmVmcmVlID0gcmV0LT5zOworICAgIH0gZWxzZSBhc3NpZ25faW50KHJldCwgbVswXS5ybV9lbyk7CisgIH0gZWxzZSB7CisgICAgaWYgKHBhdC5yZV9uc3ViPjApIHJldC0+cyA9ICIiOworICAgIGVsc2UgYXNzaWduX2ludChyZXQsIDApOworICB9CisgIHJlZ2ZyZWUoJnBhdCk7Cit9CisKKy8vIDQgZGlmZmVyZW50IHNpZ25hdHVyZXMgb2Ygb3BlcmF0b3JzLiAgUyA9IHN0cmluZywgSSA9IGludCwgU0kgPSBzdHJpbmcgb3IKKy8vIGludC4KK2VudW0geyBTSV9UT19TSSA9IDEsIFNJX1RPX0ksIElfVE9fSSwgU19UT19TSSB9OworCitlbnVtIHsgT1IgPSAxLCBBTkQsIEVRLCBORSwgR1QsIEdURSwgTFQsIExURSwgQURELCBTVUIsIE1VTCwgRElWSSwgTU9ELCBSRSB9OworCisvLyBvcGVyYXRvcnMgZ3JvdXBlZCBieSBwcmVjZWRlbmNlCitzdGF0aWMgc3RydWN0IG9wX2RlZiB7CisgIGNoYXIgKnRvazsKKyAgY2hhciBwcmVjLCBzaWcsIG9wOyAvLyBwcmVjZWRlbmNlLCBzaWduYXR1cmUgZm9yIHR5cGUgY29lcmNpb24sIG9wZXJhdG9yIElECit9IE9QU1tdID0geworICAvLyBsb2dpY2FsIG9wcywgcHJlY2VkZW5jZSAxIGFuZCAyLCBzaWduYXR1cmUgU0lfVE9fU0kKKyAgeyJ8IiwgMSwgU0lfVE9fU0ksIE9SICB9LAorICB7IiYiLCAyLCBTSV9UT19TSSwgQU5EIH0sCisgIC8vIGNvbXBhcmlzb24gb3BzLCBwcmVjZWRlbmNlIDMsIHNpZ25hdHVyZSBTSV9UT19JCisgIHsiPSIsIDMsIFNJX1RPX0ksIEVRIH0sIHsiPT0iLCAzLCBTSV9UT19JLCBFUSAgfSwgeyIhPSIsIDMsIFNJX1RPX0ksIE5FIH0sCisgIHsiPiIsIDMsIFNJX1RPX0ksIEdUIH0sIHsiPj0iLCAzLCBTSV9UT19JLCBHVEUgfSwKKyAgeyI8IiwgMywgU0lfVE9fSSwgTFQgfSwgeyI8PSIsIDMsIFNJX1RPX0ksIExURSB9LCAKKyAgLy8gYXJpdGhtZXRpYyBvcHMsIHByZWNlZGVuY2UgNCBhbmQgNSwgc2lnbmF0dXJlIElfVE9fSQorICB7IisiLCA0LCBJX1RPX0ksIEFERCB9LCB7Ii0iLCAgNCwgSV9UT19JLCBTVUIgfSwKKyAgeyIqIiwgNSwgSV9UT19JLCBNVUwgfSwgeyIvIiwgIDUsIElfVE9fSSwgRElWSSB9LCB7IiUiLCA1LCBJX1RPX0ksIE1PRCB9LAorICAvLyByZWdleCBtYXRjaCwgcHJlY2VkZW5jZSA2LCBzaWduYXR1cmUgU19UT19TSQorICB7IjoiLCA2LCBTX1RPX1NJLCBSRSB9LAorICB7TlVMTCwgMCwgMCwgMH0sIC8vIHNlbnRpbmVsCit9OworCit2b2lkIGV2YWxfb3Aoc3RydWN0IG9wX2RlZiAqbywgc3RydWN0IHZhbHVlICpyZXQsIHN0cnVjdCB2YWx1ZSAqcmhzKQoreworICBsb25nIGxvbmcgYSwgYiwgeCA9IDA7IC8vIHggPSBhIE9QIGIgZm9yIGludHMuCisgIGNoYXIgKnMsICp0OyAvLyBzdHJpbmcgb3BlcmFuZHMKKyAgaW50IGNtcDsKKworICBzd2l0Y2ggKG8tPnNpZykgeworCisgIGNhc2UgU0lfVE9fU0k6CisgICAgc3dpdGNoIChvLT5vcCkgeworICAgIGNhc2UgT1I6ICBpZiAoaXNfZmFsc2UocmV0KSkgKnJldCA9ICpyaHM7IGJyZWFrOworICAgIGNhc2UgQU5EOiBpZiAoaXNfZmFsc2UocmV0KSB8fCBpc19mYWxzZShyaHMpKSBhc3NpZ25faW50KHJldCwgMCk7IGJyZWFrOworICAgIH0KKyAgICBicmVhazsgIAorCisgIGNhc2UgU0lfVE9fSToKKyAgICBpZiAoZ2V0X2ludChyZXQsICZhKSAmJiBnZXRfaW50KHJocywgJmIpKSB7IC8vIGJvdGggYXJlIGludHMKKyAgICAgIGNtcCA9IGEgLSBiOworICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb21wYXJlIGJvdGggYXMgc3RyaW5ncworICAgICAgY21wID0gc3RyY21wKHMgPSBnZXRfc3RyKHJldCksIHQgPSBnZXRfc3RyKHJocykpOworICAgICAgaWYgKHJldC0+cyAhPSBzKSBmcmVlKHMpOworICAgICAgaWYgKHJocy0+cyAhPSB0KSBmcmVlKHQpOworICAgIH0KKyAgICBzd2l0Y2ggKG8tPm9wKSB7CisgICAgY2FzZSBFUTogIHggPSBjbXAgPT0gMDsgYnJlYWs7CisgICAgY2FzZSBORTogIHggPSBjbXAgIT0gMDsgYnJlYWs7CisgICAgY2FzZSBHVDogIHggPSBjbXAgPiAgMDsgYnJlYWs7CisgICAgY2FzZSBHVEU6IHggPSBjbXAgPj0gMDsgYnJlYWs7CisgICAgY2FzZSBMVDogIHggPSBjbXAgPCAgMDsgYnJlYWs7CisgICAgY2FzZSBMVEU6IHggPSBjbXAgPD0gMDsgYnJlYWs7CisgICAgfQorICAgIGFzc2lnbl9pbnQocmV0LCB4KTsKKyAgICBicmVhazsKKworICBjYXNlIElfVE9fSToKKyAgICBpZiAoIWdldF9pbnQocmV0LCAmYSkgfHwgIWdldF9pbnQocmhzLCAmYikpCisgICAgICBlcnJvcl9leGl0KCJub24taW50ZWdlciBhcmd1bWVudCIpOworICAgIHN3aXRjaCAoby0+b3ApIHsKKyAgICBjYXNlIEFERDogeCA9IGEgKyBiOyBicmVhazsKKyAgICBjYXNlIFNVQjogeCA9IGEgLSBiOyBicmVhazsKKyAgICBjYXNlIE1VTDogeCA9IGEgKiBiOyBicmVhazsKKyAgICBjYXNlIERJVkk6IGlmIChiID09IDApIGVycm9yX2V4aXQoImRpdmlzaW9uIGJ5IHplcm8iKTsgeCA9IGEgLyBiOyBicmVhazsKKyAgICBjYXNlIE1PRDogIGlmIChiID09IDApIGVycm9yX2V4aXQoImRpdmlzaW9uIGJ5IHplcm8iKTsgeCA9IGEgJSBiOyBicmVhazsKKyAgICB9CisgICAgYXNzaWduX2ludChyZXQsIHgpOworICAgIGJyZWFrOworCisgIGNhc2UgU19UT19TSTogLy8gb3AgPT0gUkUKKyAgICBzID0gZ2V0X3N0cihyZXQpOworICAgIGNtcCA9IHJldC0+cyE9czsgLy8gcmV0IG92ZXJ3cml0dGVuIGJ5IHJlIHNvIGNoZWNrIG5vdworICAgIHJlKHMsIHQgPSBnZXRfc3RyKHJocyksIHJldCk7CisgICAgaWYgKGNtcCkgZnJlZShzKTsKKyAgICBpZiAocmhzLT5zIT10KSBmcmVlKHQpOworICAgIGJyZWFrOworICB9Cit9CisKKy8vIEV2YWx1dGUgYSBjb21wb3VuZCBleHByZXNzaW9uIHVzaW5nIHJlY3Vyc2l2ZSAiUHJlY2VkZW5jZSBDbGltYmluZyIKKy8vIGFsZ29yaXRobSwgc2V0dGluZyAncmV0Jy4KK3N0YXRpYyB2b2lkIGV2YWxfZXhwcihzdHJ1Y3QgdmFsdWUgKnJldCwgaW50IG1pbl9wcmVjKQoreworICBpZiAoISpUVC50b2spIGVycm9yX2V4aXQoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7CisKKyAgLy8gRXZhbHVhdGUgTEhTIGF0b20sIHNldHRpbmcgJ3JldCcuCisgIGlmICghc3RyY21wKCpUVC50b2ssICIoIikpIHsgLy8gcGFyZW50aGVzaXplZCBleHByZXNzaW9uCisgICAgVFQudG9rKys7ICAvLyBjb25zdW1lICgKKworICAgIGV2YWxfZXhwcihyZXQsIDEpOyAgICAgICAgLy8gV2UncmUgaW5zaWRlICggKSwgc28gbWluX3ByZWMgPSAxCisgICAgaWYgKHJldC0+cyAmJiAhc3RyY21wKHJldC0+cywgIikiKSkgZXJyb3JfZXhpdCgiZW1wdHkgKCApIik7CisgICAgaWYgKCEqVFQudG9rKSBlcnJvcl9leGl0KCJFeHBlY3RlZCApIik7CisgICAgaWYgKHN0cmNtcCgqVFQudG9rLCAiKSIpKSBlcnJvcl9leGl0KCJFeHBlY3RlZCApIGJ1dCBnb3QgJXMiLCAqVFQudG9rKTsKKyAgfSBlbHNlIHJldC0+cyA9ICpUVC50b2s7ICAvLyBzaW1wbGUgbGl0ZXJhbCwgYWxsIHZhbHVlcyBzdGFydCBhcyBzdHJpbmdzCisgIFRULnRvaysrOworCisgIC8vIEV2YWx1YXRlIFJIUyBhbmQgYXBwbHkgb3BlcmF0b3IgdW50aWwgcHJlY2VkZW5jZSBpcyB0b28gbG93LgorICBzdHJ1Y3QgdmFsdWUgcmhzOworICB3aGlsZSAoKlRULnRvaykgeworICAgIHN0cnVjdCBvcF9kZWYgKm8gPSBPUFM7CisKKyAgICB3aGlsZSAoby0+dG9rKSB7IC8vIExvb2sgdXAgb3BlcmF0b3IKKyAgICAgIGlmICghc3RyY21wKCpUVC50b2ssIG8tPnRvaykpIGJyZWFrOworICAgICAgbysrOworICAgIH0KKyAgICBpZiAoIW8tPnRvaykgYnJlYWs7IC8vIE5vdCBhbiBvcGVyYXRvciAoZXh0cmEgaW5wdXQgd2lsbCBmYWlsIGxhdGVyKQorICAgIGlmIChvLT5wcmVjIDwgbWluX3ByZWMpIGJyZWFrOyAvLyBQcmVjZWRlbmNlIHRvbyBsb3csIHBvcCBhIHN0YWNrIGZyYW1lCisgICAgVFQudG9rKys7CisKKyAgICBldmFsX2V4cHIoJnJocywgby0+cHJlYyArIDEpOyAvLyBFdmFsdWF0ZSBSSFMsIHdpdGggaGlnaGVyIG1pbiBwcmVjZWRlbmNlCisgICAgZXZhbF9vcChvLCByZXQsICZyaHMpOyAvLyBBcHBseSBvcGVyYXRvciwgc2V0dGluZyAncmV0JworICB9Cit9CisKK3ZvaWQgZXhwcl9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB2YWx1ZSByZXQgPSB7MH07CisKKyAgdG95cy5leGl0dmFsID0gMjsgLy8gaWYgZXhpdGluZyBlYXJseSwgaW5kaWNhdGUgZXJyb3IKKyAgVFQudG9rID0gdG95cy5vcHRhcmdzOyAvLyBpbml0aWFsaXplIGdsb2JhbCB0b2tlbgorICBldmFsX2V4cHIoJnJldCwgMSk7CisgIGlmICgqVFQudG9rKSBlcnJvcl9leGl0KCJVbmV4cGVjdGVkIGV4dHJhIGlucHV0ICclcydcbiIsICpUVC50b2spOworCisgIGlmIChyZXQucykgcHJpbnRmKCIlc1xuIiwgcmV0LnMpOworICBlbHNlIHByaW50ZigiJWxsZFxuIiwgcmV0LmkpOworCisgIHRveXMuZXhpdHZhbCA9IGlzX2ZhbHNlKCZyZXQpOworCisgIGlmIChUVC5yZWZyZWUpIGZyZWUoVFQucmVmcmVlKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvZmRpc2suYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZmRpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9mZGlzay5jCkBAIC0wLDAgKzEsMTU1NyBAQAorLyogZmRpc2suYyAtICBmZGlzayBwcm9ncmFtIHRvIG1vZGlmeSBwYXJ0aXRpb25zIG9uIGRpc2suCisgKgorICogQ29weXJpZ2h0IDIwMTIgQXNod2luaSBLdW1hciA8YWsuYXNod2luaUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKworVVNFX0ZESVNLKE5FV1RPWShmZGlzaywgIkMjPDBIIzwwUyM8MGIjPDUxMnVsIiwgVE9ZRkxBR19TQklOKSkKKworY29uZmlnIEZESVNLCisgIGJvb2wgImZkaXNrIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBmZGlzayBbLWx1XSBbLUMgQ1lMSU5ERVJTXSBbLUggSEVBRFNdIFstUyBTRUNUT1JTXSBbLWIgU0VDVFNaXSBESVNLCisKKyAgICBDaGFuZ2UgcGFydGl0aW9uIHRhYmxlCisKKyAgICAtdSAgICAgICAgICAgIFN0YXJ0IGFuZCBFbmQgYXJlIGluIHNlY3RvcnMgKGluc3RlYWQgb2YgY3lsaW5kZXJzKQorICAgIC1sICAgICAgICAgICAgU2hvdyBwYXJ0aXRpb24gdGFibGUgZm9yIGVhY2ggRElTSywgdGhlbiBleGl0CisgICAgLWIgc2l6ZSAgICAgICBzZWN0b3Igc2l6ZSAoNTEyLCAxMDI0LCAyMDQ4IG9yIDQwOTYpCisgICAgLUMgQ1lMSU5ERVJTICBTZXQgbnVtYmVyIG9mIGN5bGluZGVycy9oZWFkcy9zZWN0b3JzCisgICAgLUggSEVBRFMKKyAgICAtUyBTRUNUT1JTCisqLworCisjZGVmaW5lIEZPUl9mZGlzaworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorCitHTE9CQUxTKAorICBsb25nIHNlY3Rfc3o7CisgIGxvbmcgc2VjdG9yczsKKyAgbG9uZyBoZWFkczsKKyAgbG9uZyBjeWxpbmRlcnM7CispCisKKyNkZWZpbmUgRVhURU5ERUQgICAgICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFdJTjk4X0VYVEVOREVEICAweDBmCisjZGVmaW5lIExJTlVYX05BVElWRSAgICAweDgzCisjZGVmaW5lIExJTlVYX0VYVEVOREVEICAweDg1CisKKyNkZWZpbmUgU0VDVE9SX1NJWkUgNTEyCisjZGVmaW5lIE9ORV9LICAgICAgIDEwMjQKKyNkZWZpbmUgUEFSVElUSU9OX01BWCAgNjAgIC8vcGFydGl0aW9uIG1heCBpcyBtb2RpZmlhYmxlCisjZGVmaW5lIElTX0VYVEVOREVEKGkpICgoaSkgPT0gRVhURU5ERUQgfHwgKGkpID09IFdJTjk4X0VYVEVOREVEIHx8IChpKSA9PSBMSU5VWF9FWFRFTkRFRCkKKyNkZWZpbmUgc2VjdG9yKHMpICgocykgJiAweDNmKQorI2RlZmluZSBjeWxpbmRlcihzLCBjKSAoKGMpIHwgKCgocykgJiAweGMwKSA8PCAyKSkKKwordHlwZWRlZiBvZmZfdCBzZWN0b3JfdDsKKworc3RydWN0IHBhcnRpdGlvbiB7CisgIHVuc2lnbmVkIGNoYXIgYm9vdF9pbmQsIGhlYWQsIHNlY3RvciwgY3lsLCBzeXNfaW5kLCBlbmRfaGVhZCwKKyAgICAgICAgICAgICAgICBlbmRfc2VjdG9yLCBlbmRfY3lsLCBzdGFydDRbNF0sIHNpemU0WzRdOworfTsKKworc3RydWN0IHBhcnRfZW50cnkgeworICBzdHJ1Y3QgcGFydGl0aW9uICpwYXJ0OworICBjaGFyICpzZWNfYnVmZmVyOworICBzZWN0b3JfdCAgc3RhcnRfb2Zmc2V0OworICBpbnQgbW9kaWZpZWQ7Cit9OworCitzdHJ1Y3QgcGFydF90eXBlcyB7CisgIGludCBpZDsKKyAgY2hhciB0eXBlWzI0XTsKK30gc3lzX3R5cGVzW10gPSB7CisgIHsweDAwLCAiRW1wdHkifSwgezB4MDEsICJGQVQxMiJ9LCB7MHgwNCwgIkZBVDE2IDwzMk0ifSwgezB4MDUsICJFeHRlbmRlZCJ9LAorICB7MHgwNiwgIkZBVDE2In0sIHsweDA3LCAiSFBGUy9OVEZTIn0sIHsweDBhLCAiT1MvMiBCb290IE1hbmFnZXIifSwKKyAgezB4MGIsICJXaW45NSBGQVQzMiJ9LCB7MHgwYywgIldpbjk1IEZBVDMyIChMQkEpIn0sIHsweDBlLCAiV2luOTUgRkFUMTYgKExCQSkifSwKKyAgezB4MGYsICJXaW45NSBFeHQnZCAoTEJBKSJ9LCB7MHgxMSwgIkhpZGRlbiBGQVQxMiJ9LCB7MHgxMiwgIkNvbXBhcSBkaWFnbm9zdGljcyJ9LAorICB7MHgxNCwgIkhpZGRlbiBGQVQxNiA8MzJNIn0sIHsweDE2LCAiSGlkZGVuIEZBVDE2In0sIHsweDE3LCAiSGlkZGVuIEhQRlMvTlRGUyJ9LAorICB7MHgxYiwgIkhpZGRlbiBXaW45NSBGQVQzMiJ9LCB7MHgxYywgIkhpZGRlbiBXOTUgRkFUMzIgKExCQSkifSwgezB4MWUsICJIaWRkZW4gVzk1IEZBVDE2IChMQkEpIn0sCisgIHsweDNjLCAiUGFydC5NYWdpYyByZWNvdmVyeSJ9LCB7MHg0MSwgIlBQQyBQUmVQIEJvb3QifSwgezB4NDIsICJTRlMifSwKKyAgezB4NjMsICJHTlUgSFVSRCBvciBTeXNWIn0sIHsweDgwLCAiT2xkIE1pbml4In0sIHsweDgxLCAiTWluaXggLyBvbGQgTGludXgifSwKKyAgezB4ODIsICJMaW51eCBzd2FwIn0sIHsweDgzLCAiTGludXgifSwgezB4ODQsICJPUy8yIGhpZGRlbiBDOiBkcml2ZSJ9LAorICB7MHg4NSwgIkxpbnV4IGV4dGVuZGVkIn0sIHsweDg2LCAiTlRGUyB2b2x1bWUgc2V0In0sIHsweDg3LCAiTlRGUyB2b2x1bWUgc2V0In0sCisgIHsweDhlLCAiTGludXggTFZNIn0sIHsweDlmLCAiQlNEL09TIn0sIHsweGEwLCAiVGhpbmtwYWQgaGliZXJuYXRpb24ifSwKKyAgezB4YTUsICJGcmVlQlNEIn0sIHsweGE2LCAiT3BlbkJTRCJ9LCB7MHhhOCwgIkRhcndpbiBVRlMifSwgezB4YTksICJOZXRCU0QifSwKKyAgezB4YWIsICJEYXJ3aW4gYm9vdCJ9LCB7MHhiNywgIkJTREkgZnMifSwgezB4YjgsICJCU0RJIHN3YXAifSwKKyAgezB4YmUsICJTb2xhcmlzIGJvb3QifSwgezB4ZWIsICJCZU9TIGZzIn0sIHsweGVlLCAiRUZJIEdQVCJ9LAorICB7MHhlZiwgIkVGSSAoRkFULTEyLzE2LzMyKSJ9LCB7MHhmMCwgIkxpbnV4L1BBLVJJU0MgYm9vdCJ9LAorICB7MHhmMiwgIkRPUyBzZWNvbmRhcnkifSwgezB4ZmQsICJMaW51eCByYWlkIGF1dG9kZXRlY3QifSwKK307CisKK3N0YXRpYyBpbnQgbnVtX3BhcnRzLCBkaXNwX3VuaXRfY3lsLCBkb3NfZmxhZywgZGV2X2ZkID0gMzsKK3N0YXRpYyBsb25nIGdfY3lsaW5kZXJzLCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfc2VjdF9zaXplOworc3RhdGljIHNlY3Rvcl90IHRvdGFsX251bWJlcl9zZWN0b3JzLCBleHRlbmRlZF9vZmZzZXQ7CitzdGF0aWMgY2hhciBNQlJidWZbMjA0OF0sICpkaXNrX2RldmljZTsKK3N0cnVjdCBwYXJ0X2VudHJ5IHBhcnRpdGlvbnNbUEFSVElUSU9OX01BWF07CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGl0aW9uKiBwYXJ0X29mZnNldChjaGFyICpzZWNidWYsIGludCBpKQoreworICByZXR1cm4gKHN0cnVjdCBwYXJ0aXRpb24qKShzZWNidWYgKyAweDFiZSArIGkqKHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGV2YWx1ZSh1bnNpZ25lZCBjaGFyICpjcCwgc2VjdG9yX3QgdmFsdWUgKQoreworICB1aW50MzJfdCB2YWwgPSBTV0FQX0xFMzIodmFsdWUpOworICBtZW1jcHkoY3AsICh2b2lkKikmdmFsLCA0KTsKK30KKworc3RhdGljIHZvaWQgc2V0X2hzYyhzdHJ1Y3QgcGFydGl0aW9uICpwLCBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgZW5kKQoreworICBpZiAoZG9zX2ZsYWcgJiYgKHN0YXJ0IC8gKGdfc2VjdG9ycyAqIGdfaGVhZHMpID4gMTAyMykpCisgICAgc3RhcnQgPSBnX2hlYWRzICogZ19zZWN0b3JzICogT05FX0sgLSAxOworICBwLT5zZWN0b3IgPSAoc3RhcnQgJSBnX3NlY3RvcnMpICsgMTsKKyAgc3RhcnQgLz0gZ19zZWN0b3JzOworICBwLT5oZWFkID0gc3RhcnQgJSBnX2hlYWRzOworICBzdGFydCAvPSBnX2hlYWRzOworICBwLT5jeWwgPSBzdGFydCAmIDB4RkY7CisgIHAtPnNlY3RvciB8PSAoc3RhcnQgPj4gMikgJiAweGMwOworCisgIGlmIChkb3NfZmxhZyAmJiAoZW5kIC8gKGdfc2VjdG9ycyAqIGdfaGVhZHMpID4gMTAyMykpCisgICAgZW5kID0gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIE9ORV9LIC0gMTsKKyAgcC0+ZW5kX3NlY3RvciA9IChlbmQgJSBnX3NlY3RvcnMpICsgMTsKKyAgZW5kIC89IGdfc2VjdG9yczsKKyAgcC0+ZW5kX2hlYWQgPSBlbmQgJSBnX2hlYWRzOworICBlbmQgLz0gZ19oZWFkczsKKyAgcC0+ZW5kX2N5bCA9IGVuZCAmIDB4RkY7CisgIHAtPmVuZF9zZWN0b3IgfD0gKGVuZCA+PiAyKSAmIDB4YzA7Cit9CisKK3N0YXRpYyBpbnQgY2hzX3dhcm4odm9pZCkKK3sKKyAgaWYgKGdfaGVhZHMgJiYgZ19zZWN0b3JzICYmIGdfY3lsaW5kZXJzKQorICAgIHJldHVybiAwOworCisgIHByaW50ZigiVW5rbm93biB2YWx1ZShzKSBmb3I6Iik7CisgIGlmICghZ19oZWFkcykgcHJpbnRmKCIgaGVhZHMiKTsKKyAgaWYgKCFnX3NlY3RvcnMpIHByaW50ZigiIHNlY3RvcnMiKTsKKyAgaWYgKCFnX2N5bGluZGVycykgcHJpbnRmKCIgY3lsaW5kZXJzIik7CisgIHByaW50ZigiLiBjYW4gc2V0IGluIHRoZSBleHBlcnQgbWVudS5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbGlzdF90eXBlcyh2b2lkKQoreworICBpbnQgaSwgYWRqdXN0ID0gMCwgc2l6ZSA9IEFSUkFZX0xFTihzeXNfdHlwZXMpOworIAorICBpZihzaXplICUgMikgYWRqdXN0ID0gMTsKKyAgZm9yIChpID0gMDsgaSA8IChzaXplIC0gYWRqdXN0KTsgaSs9MikKKyAgICB4cHJpbnRmKCIlMnggJS0yMnNcdFx0JTJ4ICUtMjIuMjJzXG4iLCBzeXNfdHlwZXNbaV0uaWQsIHN5c190eXBlc1tpXS50eXBlLAorICAgICAgICBzeXNfdHlwZXNbaSsxXS5pZCwgc3lzX3R5cGVzW2krMV0udHlwZSk7CisgIGlmIChhZGp1c3QpIHhwcmludGYoIiUyeCAlLTIyc1xuIixzeXNfdHlwZXNbc2l6ZS0xXS5pZCwgc3lzX3R5cGVzW3NpemUtMV0udHlwZSk7CisgIHhwdXRjKCdcbicpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3NlY19zeigpCit7CisgIGludCBhcmc7ICAgICAgIAorICBpZiAoaW9jdGwoZGV2X2ZkLCBCTEtTU1pHRVQsICZhcmcpID09IDApIGdfc2VjdF9zaXplID0gYXJnOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYikgeworICAgIGlmIChUVC5zZWN0X3N6ICE9ICA1MTIgJiYgVFQuc2VjdF9zeiAhPSAxMDI0ICYmIFRULnNlY3Rfc3ogIT0gMjA0OCAmJgorICAgICAgICBUVC5zZWN0X3N6ICE9IDQwOTYpCisgICAgeworICAgICAgaGVscF9leGl0KCJiYWQgc2VjdG9yIHNpemUiKTsKKyAgICB9CisgICAgZ19zZWN0X3NpemUgPSBUVC5zZWN0X3N6OworICB9Cit9CisKK3N0YXRpYyBzZWN0b3JfdCByZWFkX3NpemUoKQoreworICB1aW50NjRfdCBzZWM2NCA9IDA7CisgIHVuc2lnbmVkIGxvbmcgc2VjdG9ycyA9IDA7CisgIGlmIChpb2N0bChkZXZfZmQsIEJMS0dFVFNJWkU2NCwgJnNlYzY0KSA9PSAwKSB7CisgICAgc2VjNjQgPSBzZWM2NCA+PiA5OyAvL2NvbnZlcnQgdG8gNTEyIGJsb2NrIHNpemUuCisgICAgaWYgKHNlYzY0ICE9ICh1aW50MzJfdCkgc2VjNjQpIHsKKyAgICAgIHBlcnJvcl9tc2coImRldmljZSBoYXMgbW9yZSB0aGFuIDJeMzIgc2VjdG9ycywgY2FuJ3QgdXNlIGFsbCBvZiB0aGVtIik7CisgICAgICBzZWM2NCA9ICh1aW50MzJfdCkgLSAxTDsKKyAgICB9CisgICAgcmV0dXJuIHNlYzY0OworICB9CisgIGlmIChpb2N0bChkZXZfZmQsIEJMS0dFVFNJWkUsICZzZWN0b3JzKSA9PSAwKQorICAgIGlmIChzaXplb2YobG9uZykgPiBzaXplb2Yoc2VjdG9yX3QpICYmIHNlY3RvcnMgIT0gKHNlY3Rvcl90KXNlY3RvcnMpCisgICAgICBzZWN0b3JzID0gKHVpbnQzMl90KSAtIDFMOworICByZXR1cm4gc2VjdG9yczsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9wYXJ0X2J1ZmYoY2hhciAqYnVmZmVyKQoreworICBpZiAoKGJ1ZmZlcls1MTBdICE9IDB4NTUpIHx8IChidWZmZXJbNTExXSAhPSAweEFBKSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlzX3BhcnRpdGlvbl9jbGVhcihzdHJ1Y3QgcGFydGl0aW9uKiBwKQoreworICBpbnQgaSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgcmVzID0gMDsKKyAgY29uc3QgY2hhciAqcHRyID0gKGNvbnN0IGNoYXIqKXA7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKTsgaSsrKSByZXMgfD0gKHVuc2lnbmVkIGNoYXIpcHRyW2ldOworICByZXR1cm4gKHJlcyA9PSAweDAwKTsKK30KKworc3RhdGljIHVpbnQzMl90IHN3YXBfbGUzMnRvaCh1bnNpZ25lZCBjaGFyICpjcCkKK3sKKyAgdWludDMyX3QgdmFsOworICBtZW1jcHkoKHZvaWQqKSZ2YWwsIGNwLCA0KTsKKyAgcmV0dXJuIGxlMzJ0b2godmFsKTsKK30KKworc3RhdGljIGludCBjaGVja19vcmRlcih2b2lkKSAgICAKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2VjdG9yX3QgZmlyc3RbbnVtX3BhcnRzXSwgbGFzdF9zZWVuX3ZhbCA9IDA7CisgIGludCBpOworICBzdHJ1Y3QgcGFydF9lbnRyeSAqcGU7ICAgICAgIAorICBzdHJ1Y3QgcGFydGl0aW9uICpweDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcnRzOyBpKyspIHsKKyAgICBpZiAoaSA9PSA0KSBsYXN0X3NlZW5fdmFsID0gMDsKKyAgICBwZSA9ICZwYXJ0aXRpb25zW2ldOyAgICAgICAKKyAgICBweCA9IHBlLT5wYXJ0OyAgICAgICAgICAgICAKKyAgICBpZiAocHgtPnN5c19pbmQpIHsKKyAgICAgIGZpcnN0W2ldID0gc3dhcF9sZTMydG9oKHB4LT5zdGFydDQpICsgcGUtPnN0YXJ0X29mZnNldDsKKyAgICAgIGlmIChsYXN0X3NlZW5fdmFsID4gZmlyc3RbaV0pIHJldHVybiAxOworICAgICAgbGFzdF9zZWVuX3ZhbCA9IGZpcnN0W2ldOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9nZW9tZXRyeShzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmRpc2spCit7CisgIHN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKworICBpZiAoaW9jdGwoZGV2X2ZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSkgcmV0dXJuOworICBkaXNrLT5oZWFkcyA9IGdlb21ldHJ5LmhlYWRzOworICBkaXNrLT5zZWN0b3JzID0gZ2VvbWV0cnkuc2VjdG9yczsKK30KKworLyogUmVhZCB0aGUgZXh0ZW5kZWQgYm9vdCByZWNvcmQgZm9yIHRoZSAKKyAqIGxvZ2ljYWwgcGFydGlvbiBkZXRhaWxzLgorICovCitzdGF0aWMgdm9pZCByZWFkX2VicihpbnQgaWR4KQoreworICBjaGFyICpzZWNfYnVmID0gTlVMTDsKKyAgc2VjdG9yX3Qgb2Zmc2V0ID0gMCwgbG9jYWxfc3RhcnRfb2ZmID0gMDsKKyAgc3RydWN0IHBhcnRpdGlvbiAqcCwgKnE7CisKKyAgcSA9IHAgPSBwYXJ0aXRpb25zW2lkeF0ucGFydDsKKyAgbG9jYWxfc3RhcnRfb2ZmID0gc3dhcF9sZTMydG9oKHAtPnN0YXJ0NCk7CisKKyAgaWYgKCFleHRlbmRlZF9vZmZzZXQpIGV4dGVuZGVkX29mZnNldCA9IGxvY2FsX3N0YXJ0X29mZjsKKyAgZG8geworICAgIGlmIChudW1fcGFydHMgPj0gNjApIHsKKyAgICAgIHhwcmludGYoIldhcm5pbmc6IGRlbGV0aW5nIHBhcnRpdGlvbnMgYWZ0ZXIgNjBcbiIpOworICAgICAgbWVtc2V0KHEsIDAsIHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSk7IC8vY2xlYXJfcGFydGl0aW9uCisgICAgICBwYXJ0aXRpb25zW251bV9wYXJ0cy0xXS5tb2RpZmllZCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZWNfYnVmID0geHphbGxvYyhnX3NlY3Rfc2l6ZSk7CisgICAgcGFydGl0aW9uc1tudW1fcGFydHNdLnBhcnQgPSBwYXJ0X29mZnNldChzZWNfYnVmLCAwKTsKKyAgICBwYXJ0aXRpb25zW251bV9wYXJ0c10uc2VjX2J1ZmZlciA9IHNlY19idWY7CisgICAgb2Zmc2V0ID0gc3dhcF9sZTMydG9oKHEtPnN0YXJ0NCk7CisKKyAgICBpZiAobnVtX3BhcnRzID4gNCkgb2Zmc2V0ICs9IGxvY2FsX3N0YXJ0X29mZjsKKyAgICBwYXJ0aXRpb25zW251bV9wYXJ0c10uc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIHhsc2VlayhkZXZfZmQsIChvZmZfdCkob2Zmc2V0ICogZ19zZWN0X3NpemUpLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoZ19zZWN0X3NpemUgIT0gcmVhZGFsbChkZXZfZmQsIHNlY19idWYsIGdfc2VjdF9zaXplKSkgeworICAgICAgY2xvc2UoZGV2X2ZkKTsKKyAgICAgIGVycm9yX2V4aXQoIkNvdWxkbid0IHJlYWQgc2VjdG9yIHplcm9cbiIpOworICAgIH0KKyAgICBudW1fcGFydHMrKzsgLy9leHRlbmRlZCBwYXJ0aW9ucyBwcmVzZW50LgorICAgIHEgPSBwYXJ0X29mZnNldChzZWNfYnVmLCAxKTsKKyAgfSB3aGlsZSAoIWlzX3BhcnRpdGlvbl9jbGVhcihxKSAmJiBJU19FWFRFTkRFRChxLT5zeXNfaW5kKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBoeXNpY2FsX0hTKGludCogaCwgaW50ICpzKQoreyAgCisgIHN0cnVjdCBwYXJ0aXRpb24gKnA7CisgIGludCBpLCBlbmRfaCwgZW5kX3MsIGVfaGggPSAwLCBlX3NzID0gMCwgaW5pID0gMSwgZGlydHkgPSAwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilNQlJidWY7CisKKyAgaWYgKCEodmFsaWRhdGVfcGFydF9idWZmKChjaGFyKilidWZwKSkpIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgcCA9IHBhcnRfb2Zmc2V0KChjaGFyKilidWZwLCBpKTsKKyAgICBpZiAocC0+c3lzX2luZCkgeworICAgICAgZW5kX2ggPSBwLT5lbmRfaGVhZCArIDE7CisgICAgICBlbmRfcyA9IChwLT5lbmRfc2VjdG9yICYgMDc3KTsKKyAgICAgIGlmIChpbmkpIHsKKyAgICAgICAgZV9oaCA9IGVuZF9oOworICAgICAgICBlX3NzID0gZW5kX3M7CisgICAgICAgIGluaSA9IDA7CisgICAgICB9IGVsc2UgaWYgKGVfaGggIT1lbmRfaCB8fCBlX3NzICE9IGVuZF9zKQorICAgICAgICBkaXJ0eSA9IDE7CisgICAgfQorICB9CisgIGlmICghZGlydHkgJiYgIWluaSkgeworICAgICpoID0gZV9oaDsKKyAgICAqcyA9IGVfc3M7CisgIH0KK30KKworLy9SZXNldCB0aGUgcHJpbWFyeSBwYXJ0aXRpb24gdGFibGUKK3N0YXRpYyB2b2lkIHJlc2V0X2Jvb3QoaW50IGNoYW5nZSkKK3sKKyAgaW50IGk7CisgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwZSA9ICZwYXJ0aXRpb25zW2ldOworICAgIHBlLT5wYXJ0ID0gcGFydF9vZmZzZXQoTUJSYnVmLCBpKTsKKyAgICBwZS0+c3RhcnRfb2Zmc2V0ID0gMDsKKyAgICBwZS0+c2VjX2J1ZmZlciA9IE1CUmJ1ZjsKKyAgICBwZS0+bW9kaWZpZWQgPSBjaGFuZ2U7CisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3RhYmxlX2ZsYWcoY2hhciAqYnVmKQoreworICBidWZbNTEwXSA9IDB4NTU7CisgIGJ1Zls1MTFdID0gMHhhYTsKK30KKworLyogZnJlZSB0aGUgYnVmZmVycyB1c2VkIGZvciBob2xkaW5nIGRldGFpbHMgb2YKKyAqIGV4dGVuZGVkIGxvZ2ljYWwgcGFydGlvbnMKKyovCitzdGF0aWMgdm9pZCBmcmVlX2J1ZnModm9pZCkKK3sKKyAgaW50IGkgPSA0OworICBmb3IgKDsgaSA8IG51bV9wYXJ0czsgaSsrKSBmcmVlKHBhcnRpdGlvbnNbaV0uc2VjX2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9lbXB0eV9kb3NsYWJlbCh2b2lkKQoreworICB4cHJpbnRmKCJCdWlsZGluZyBhIG5ldyBET1MgRGlza2xhYmVsLiBUaGUgY2hhbmdlcyB3aWxsXG4iCisgICAgICAicmVtYWluIGluIG1lbW9yeSBvbmx5LCB1bnRpbCB5b3Ugd3JpdGUgaXQuXG4iKTsKKworICBudW1fcGFydHMgPSA0OworICBleHRlbmRlZF9vZmZzZXQgPSAwOworICBtZW1zZXQoJk1CUmJ1Zls1MTAgLSA0KjE2XSwgMCwgNCoxNik7CisgIHdyaXRlX3RhYmxlX2ZsYWcoTUJSYnVmKTsKKyAgcGFydGl0aW9uc1swXS5tb2RpZmllZCA9IDE7CisgIHJlc2V0X2Jvb3QoMSk7Cit9CisKKy8qIFJlYWQgdGhlIE1hc3RlciBCb290IHNlY3RvciBvZiB0aGUgZGV2aWNlIGZvciB0aGUgCisgKiBwYXJ0aXRpb24gdGFibGUgZW50cmllcy9kZXRhaWxzLgorICogSWYgYW55IGV4dGVuZGVkIHBhcnRpdGlvbiBpcyBmb3VuZCB0aGVuIHJlYWQgdGhlIEVCUgorICogZm9yIGxvZ2ljYWwgcGFydGl0aW9uIGRldGFpbHMKKyAqLworc3RhdGljIGludCByZWFkX21icihjaGFyICpkZXZpY2UsIGludCB2YWxpZGF0ZSkKK3sKKyAgaW50IGZkLCBzZWN0b3JfZmFjLCBpLCBoID0gMCwgcyA9IDA7CisgIHN0cnVjdCBoZF9nZW9tZXRyeSBkaXNrOworICBmZCA9IG9wZW4oZGV2aWNlLCBPX1JEV1IpOworICBpZihmZCA8IDApIHsKKyAgICBwZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLGRldmljZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBkaXNrX2RldmljZSA9IHN0cmR1cChkZXZpY2UpOworICBpZihmZCAhPSBkZXZfZmQpIHsKKyAgICBpZihkdXAyKGZkLCBkZXZfZmQpICE9IGRldl9mZCkgcGVycm9yX2V4aXQoIkNhbid0IGR1cDIiKTsKKyAgICBjbG9zZShmZCk7CisgIH0KKworICAvL3JlYWQgcGFydGl0aW9uIHRhYmxlIC0gTUJSCisgIGlmIChTRUNUT1JfU0laRSAhPSByZWFkYWxsKGRldl9mZCwgTUJSYnVmLCBTRUNUT1JfU0laRSkpIHsKKyAgICBjbG9zZShkZXZfZmQpOworICAgIHBlcnJvcl9leGl0KCJDb3VsZG4ndCByZWFkIHNlY3RvciB6ZXJvXG4iKTsKKyAgfQorICBpZiAodmFsaWRhdGUgJiYgIXZhbGlkYXRlX3BhcnRfYnVmZihNQlJidWYpKSB7CisgICAgeHByaW50ZigiRGV2aWNlIGNvbnRhaW5zIG5laXRoZXIgYSB2YWxpZCBET1MgIgorICAgICAgICAicGFydGl0aW9uIHRhYmxlLCBub3IgU3VuLCBTR0ksIE9TRiBvciBHUFQgIgorICAgICAgICAiZGlza2xhYmVsXG4iKTsKKyAgICBjcmVhdGVfZW1wdHlfZG9zbGFiZWwoKTsKKyAgfQorCisgIGRpc2suaGVhZHMgPSBkaXNrLnNlY3RvcnMgPSAwOworICByZWFkX2dlb21ldHJ5KCZkaXNrKTsgLy9DSFMgdmFsdWVzCisgIHRvdGFsX251bWJlcl9zZWN0b3JzID0gcmVhZF9zaXplKCk7IC8vRGV2aWNlIHNpemUKKyAgcmVhZF9zZWNfc3ooKTsKKyAgc2VjdG9yX2ZhYyA9IGdfc2VjdF9zaXplL1NFQ1RPUl9TSVpFOyAvLzUxMiBpcyBoYXJkd2FyZSBzZWN0b3Igc2l6ZS4KKyAgcGh5c2ljYWxfSFMoJmgsICZzKTsgLy9waHlzaWNhbCBkaW1lbnNpb25zIG1heSBiZSBkaWZlcmVudCBmcm9tIEhESU9fR0VUR0VPCisgIGdfc2VjdG9ycyA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19TICYmIFRULnNlY3RvcnMpPyBUVC5zZWN0b3JzIDogIHM/IHMgOiBkaXNrLnNlY3RvcnM/ZGlzay5zZWN0b3JzIDogNjM7CisgIGdfaGVhZHMgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfSCAmJiBUVC5oZWFkcyk/IFRULmhlYWRzIDogaD8gaCA6IGRpc2suaGVhZHM/IGRpc2suaGVhZHMgOiAyNTU7CisgIGdfY3lsaW5kZXJzID0gdG90YWxfbnVtYmVyX3NlY3RvcnMvKGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBzZWN0b3JfZmFjKTsKKworICBpZiAoIWdfY3lsaW5kZXJzKSBnX2N5bGluZGVycyA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX0M/IFRULmN5bGluZGVycyA6IDA7CisgIGlmICgoZ19jeWxpbmRlcnMgPiBPTkVfSykgJiYgISh0b3lzLm9wdGZsYWdzICYgKEZMQUdfbCB8IEZMQUdfUykpKQorICAgIHhwcmludGYoIlxuVGhlIG51bWJlciBvZiBjeWxpbmRlcnMgZm9yIHRoaXMgZGlzayBpcyBzZXQgdG8gJWx1LlxuIgorICAgICAgICAiVGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHRoYXQsIGJ1dCB0aGlzIGlzIGxhcmdlciB0aGFuIDEwMjQsXG4iCisgICAgICAgICJhbmQgY291bGQgaW4gY2VydGFpbiBzZXR1cHMgY2F1c2UgcHJvYmxlbXMuXG4iLCBnX2N5bGluZGVycyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIGlmIChJU19FWFRFTkRFRChwYXJ0aXRpb25zW2ldLnBhcnQtPnN5c19pbmQpKSB7CisgICAgICByZWFkX2VicihpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBjaHNfd2FybigpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgY2hhciogZ2V0X3R5cGUoaW50IHN5c19pbmQpCit7CisgIGludCBpLCBzaXplID0gQVJSQVlfTEVOKHN5c190eXBlcyk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHN5c19pbmQgPT0gc3lzX3R5cGVzW2ldLmlkKQorICAgICAgcmV0dXJuIHN5c190eXBlc1tpXS50eXBlOworICByZXR1cm4gIlVua25vd24iOworfQorCitzdGF0aWMgdm9pZCBjb25zaXN0ZW5jeV9jaGVjayhjb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwLCBpbnQgcGFydGl0aW9uKQoreyAgICAgICAgCisgIHVuc2lnbmVkIHBoeXNiYywgcGh5c2JoLCBwaHlzYnMsIHBoeXNlYywgcGh5c2VoLCBwaHlzZXM7CisgIHVuc2lnbmVkIGxiYywgbGJoLCBsYnMsIGxlYywgbGVoLCBsZXM7CisgIHNlY3Rvcl90IHN0YXJ0LCBlbmQ7CisKKyAgaWYgKCFnX2hlYWRzIHx8ICFnX3NlY3RvcnMgfHwgKHBhcnRpdGlvbiA+PSA0KSkgcmV0dXJuOworICAvLyBwaHlzaWNhbCBiZWdpbm5pbmcgYywgaCwgcyAKKyAgcGh5c2JjID0gY3lsaW5kZXIocC0+c2VjdG9yLHAtPmN5bCk7CisgIHBoeXNiaCA9IHAtPmhlYWQ7CisgIHBoeXNicyA9IHNlY3RvcihwLT5zZWN0b3IpOworICAvLyBwaHlzaWNhbCBlbmRpbmcgYywgaCwgcyAKKyAgcGh5c2VjID0gY3lsaW5kZXIocC0+ZW5kX3NlY3RvciwgcC0+ZW5kX2N5bCk7CisgIHBoeXNlaCA9IHAtPmVuZF9oZWFkOworICBwaHlzZXMgPSBzZWN0b3IocC0+ZW5kX3NlY3Rvcik7CisgIC8vIGxvZ2ljYWwgYmVnaW4gYW5kIGVuZCBDSFMgdmFsdWVzIAorICBzdGFydCA9IHN3YXBfbGUzMnRvaCgodW5zaWduZWQgY2hhciopKHAtPnN0YXJ0NCkpOworICBlbmQgPSBzdGFydCArIHN3YXBfbGUzMnRvaCgodW5zaWduZWQgY2hhciopKHAtPnNpemU0KSkgLTE7CisKKyAgbGJjID0gc3RhcnQvKGdfc2VjdG9ycyAqIGdfaGVhZHMpOworICBsYmggPSAoc3RhcnQvZ19zZWN0b3JzKSAlIGdfaGVhZHM7CisgIGxicyA9IChzdGFydCAlIGdfc2VjdG9ycykgKyAxOworCisgIGxlYyA9IGVuZC8oZ19zZWN0b3JzICogZ19oZWFkcyk7CisgIGxlaCA9IChlbmQvZ19zZWN0b3JzKSAlIGdfaGVhZHM7CisgIGxlcyA9IChlbmQgJSBnX3NlY3RvcnMpICsgMTsKKworICAvL0xvZ2ljYWwgYW5kIFBoeXNpY2FsIGRpZmYgCisgIGlmIChnX2N5bGluZGVycyA8PSBPTkVfSyAmJiAocGh5c2JjICE9IGxiYyB8fCBwaHlzYmggIT0gbGJoIHx8IHBoeXNicyAhPSBsYnMpKSB7CisgICAgeHByaW50ZigiUGFydGl0aW9uICV1IGhhcyBkaWZmZXJlbnQgcGh5c2ljYWwvbG9naWNhbCBiZWdpbmluZ3MgKE5vbi1MaW51eD8pOiBcbiIsIHBhcnRpdGlvbisxKTsKKyAgICB4cHJpbnRmKCJwaHlzID0gKCV1ICV1ICV1KSAiLHBoeXNiYywgcGh5c2JoLCBwaHlzYnMpOworICAgIHhwcmludGYoImxvZ2ljYWwgPSAoJXUgJXUgJXUpXG4iLCBsYmMsIGxiaCwgbGJzKTsKKyAgfQorICBpZiAoZ19jeWxpbmRlcnMgPD0gT05FX0sgJiYgKHBoeXNlYyAhPSBsZWMgfHwgcGh5c2VoICE9IGxlaCB8fCBwaHlzZXMgIT0gbGVzKSkgeworICAgIHhwcmludGYoIlBhcnRpdGlvbiAldSBoYXMgZGlmZmVyZW50IHBoeXNpY2FsL2xvZ2ljYWwgZW5kaW5nczogXG4iLCBwYXJ0aXRpb24rMSk7CisgICAgeHByaW50ZigicGh5cyA9ICgldSAldSAldSkgIixwaHlzZWMsIHBoeXNlaCwgcGh5c2VzKTsKKyAgICB4cHJpbnRmKCJsb2dpY2FsID0gKCV1ICV1ICV1KVxuIiwgbGVjLCBsZWgsIGxlcyk7CisgIH0KKyAgLy8gRW5kaW5nIG9uIGN5bGluZGVyIGJvdW5kYXJ5PyAKKyAgaWYgKHBoeXNlaCAhPSAoZ19oZWFkcyAtIDEpIHx8IHBoeXNlcyAhPSBnX3NlY3RvcnMpCisgICAgeHByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwgcGFydGl0aW9uICsgMSk7Cit9CisKKy8vIExpc3QgdGhlIHBhcnRpdGlvbiBkZXRhaWxzCitzdGF0aWMgdm9pZCBsaXN0X3BhcnRpdGlvbnMoaW50IHZhbGlkYXRlKQoreworICBzdHJ1Y3QgcGFydGl0aW9uICpwOworICB1aW50MzJfdCBzdGFydF9jeWwsIGVuZF9jeWwsIHN0YXJ0X3NlYywgZW5kX3NlYywgYmxvY2tzLCBzZWNzOworICBjaGFyIGJvb3QsIGxhc3RjaGFyID0gJ1wwJywgKmRldiA9IGRpc2tfZGV2aWNlOworICBpbnQgaSA9IDAsIGxlbiA9IHN0cmxlbihkaXNrX2RldmljZSksIG9kZHMgPSAwOworCisgIGlmICh2YWxpZGF0ZSAmJiAhdmFsaWRhdGVfcGFydF9idWZmKE1CUmJ1ZikpIHsKKyAgICBjbG9zZShkZXZfZmQpOworICAgIHRveXMuZXhpdHZhbCA9IDE7CisgICAgeHByaW50ZigiRGV2aWNlICVzOiBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBwYXJ0aXRpb24gdGFibGVcbiIsIGRpc2tfZGV2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlzZGlnaXQoZGV2W2xlbiAtIDFdKSkgbGFzdGNoYXIgPSAncCc7CisKKyAgeHByaW50ZigiJSpzIEJvb3QgICAgICBTdGFydCAgICAgICAgIEVuZCAgICAgIEJsb2NrcyAgSWQgU3lzdGVtXG4iLCBsZW4rMSwgIkRldmljZSIpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcnRzOyBpKyspIHsKKyAgICBwID0gcGFydGl0aW9uc1tpXS5wYXJ0OworICAgIGlmIChpc19wYXJ0aXRpb25fY2xlYXIocCkpIGNvbnRpbnVlOworCisgICAgYm9vdCA9ICgocC0+Ym9vdF9pbmQgPT0gMHg4MCk/JyonOighcC0+Ym9vdF9pbmQpPycgJzonPycpOworICAgIHN0YXJ0X3NlYyA9IHN3YXBfbGUzMnRvaChwLT5zdGFydDQpICsgcGFydGl0aW9uc1tpXS5zdGFydF9vZmZzZXQ7CisgICAgc2VjcyA9IHN3YXBfbGUzMnRvaChwLT5zaXplNCk7CisKKyAgICBpZiAoKHN0YXJ0X3NlYyArIHNlY3MpID09IDApIGVuZF9zZWMgPSAwOworICAgIGVsc2UgZW5kX3NlYyA9IHN0YXJ0X3NlYyArIHNlY3MgLTE7CisgICAgc3RhcnRfY3lsID0gc3RhcnRfc2VjLyhnX2hlYWRzICogZ19zZWN0b3JzKSArIDE7CisgICAgZW5kX2N5bCA9IGVuZF9zZWMvKGdfaGVhZHMgKiBnX3NlY3RvcnMpICsgMTsKKyAgICBibG9ja3MgPSBzZWNzOworICAgIGlmIChnX3NlY3Rfc2l6ZSA8IE9ORV9LKSB7CisgICAgICBibG9ja3MgLz0gKE9ORV9LL2dfc2VjdF9zaXplKTsKKyAgICAgIG9kZHMgPSBzZWNzICUoT05FX0svZ19zZWN0X3NpemUpOworICAgIH0gZWxzZSBpZiAoZ19zZWN0X3NpemUgPiBPTkVfSykgYmxvY2tzICo9IChnX3NlY3Rfc2l6ZS9PTkVfSyk7CisKKyAgICBpZiAobGFzdGNoYXIpIHhwcmludGYoIiVzJWMlZCIsZGV2LCBsYXN0Y2hhciwgaSsxKTsKKyAgICBlbHNlIHhwcmludGYoIiVzJWQiLGRldiwgaSsxKTsKKworICAgIHhwcmludGYoIiAgICVjICUxMXUgJTExdSAlMTF1JWMgJTJ4ICVzXG4iLAorICAgICAgICBib290LAorICAgICAgICBkaXNwX3VuaXRfY3lsID09IDA/IHN0YXJ0X3NlYzogc3RhcnRfY3lsLAorICAgICAgICBkaXNwX3VuaXRfY3lsID09IDA/IGVuZF9zZWM6IGVuZF9jeWwsCisgICAgICAgIGJsb2NrcyxvZGRzPycrJzonICcsIHAtPnN5c19pbmQsIGdldF90eXBlKHAtPnN5c19pbmQpKTsKKworICAgIGNvbnNpc3RlbmN5X2NoZWNrKHAsIGkpOworICB9CisgIGlmIChjaGVja19vcmRlcigpKSB4cHJpbnRmKCJcblBhcnRpdGlvbiB0YWJsZSBlbnRyaWVzIGFyZSBub3QgaW4gZGlzayBvcmRlciIpOworfQorCisvL1ByaW50IGRldmljZSBkZXRhaWxzCitzdGF0aWMgdm9pZCBwcmludF9tYnIoaW50IHZhbGlkYXRlKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXMgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9udW1iZXJfc2VjdG9ycyA8PCA5KTsKKyAgbG9uZyBtYnl0ZXMgPSBieXRlcy8xMDAwMDAwOworCisgIGlmIChtYnl0ZXMgPCAxMDAwMCkgeHByaW50ZigiRGlzayAlczogJWx1IE1CLCAlbGx1IGJ5dGVzXG4iLCBkaXNrX2RldmljZSwgbWJ5dGVzLCBieXRlcyk7CisgIGVsc2UgeHByaW50ZigiRGlzayAlczogJWx1LiVsdSBHQiwgJWxsdSBieXRlc1xuIiwgZGlza19kZXZpY2UsIG1ieXRlcy8xMDAwLCAobWJ5dGVzLzEwMCklMTAsIGJ5dGVzKTsKKyAgeHByaW50ZigiJWxkIGhlYWRzLCAlbGQgc2VjdG9ycy90cmFjaywgJWxkIGN5bGluZGVycyIsIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMpOworICBpZiAoIWRpc3BfdW5pdF9jeWwpIHsKKyAgICB4cHJpbnRmKCIsIHRvdGFsICVsbGQgc2VjdG9yc1xuIiwgdG90YWxfbnVtYmVyX3NlY3RvcnMvKGdfc2VjdF9zaXplL1NFQ1RPUl9TSVpFKSk7CisgICAgeHByaW50ZigiVW5pdHMgPSBzZWN0b3JzIG9mIDEgKiAlbGQgPSAlbGQgYnl0ZXNcbiIsZ19zZWN0X3NpemUsIGdfc2VjdF9zaXplKTsKKyAgfSBlbHNlIHhwcmludGYoIlxuVW5pdHMgPSBjeWxpbmRlcnMgb2YgJWxkICogJWxkID0gJWxkIGJ5dGVzXG5cbiIsCisgICAgICBnX2hlYWRzICogZ19zZWN0b3JzLCBnX3NlY3Rfc2l6ZSwgZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfc2VjdF9zaXplKTsKKyAgbGlzdF9wYXJ0aXRpb25zKHZhbGlkYXRlKTsKKyAgeHB1dGMoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbWVtYmVycyh2b2lkKQoreworICBpbnQgaSA9IDA7CisgIG51bV9wYXJ0cyA9IDQ7IC8vbWF4IG9mIHByaW1hcmllcyBpbiBhIHBhcnQgdGFibGUKKyAgZGlzcF91bml0X2N5bCA9IGRvc19mbGFnID0gMTsKKyAgZXh0ZW5kZWRfb2Zmc2V0ID0gMDsKKyAgZ19zZWN0X3NpemUgPSBTRUNUT1JfU0laRTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJ0czsgaSsrKSB7CisgICAgcGFydGl0aW9uc1tpXS5wYXJ0ID0gcGFydF9vZmZzZXQoTUJSYnVmLCBpKTsKKyAgICBwYXJ0aXRpb25zW2ldLnNlY19idWZmZXIgPSBNQlJidWY7CisgICAgcGFydGl0aW9uc1tpXS5tb2RpZmllZCA9IDA7CisgICAgcGFydGl0aW9uc1tpXS5zdGFydF9vZmZzZXQgPSAwOworICB9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9pbnB1dChjaGFyICptZXNnLCBjaGFyICpvdXRwKQoreworICBjaGFyICpwOworICBpbnQgc2l6ZSA9IDA7CisgIGRvIHsKKyAgICB4cHJpbnRmKCIlcyIsIG1lc2cpOworICAgIHAgPSBmZ2V0cyh0b3lidWYsIDgwLCBzdGRpbik7CisgIAorICAgIGlmICghcCB8fCAhKHNpemUgPSBzdHJsZW4ocCkpKSBleGl0KDApOworICAgIGlmIChwW3NpemUtMV0gPT0gJ1xuJykgcFstLXNpemVdID0gJ1wwJzsKKyAgfSB3aGlsZSAoIXNpemUpOworCisgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwIDw9ICcgJykgcCsrOworICBpZiAob3V0cCkgbWVtY3B5KG91dHAsIHAsIHN0cmxlbihwKSArIDEpOyAvLzEgZm9yIG51bAorICByZXR1cm4gKnA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZXgoY2hhciAqbWVzZykKK3sKKyAgaW50IHZhbDsKKyAgY2hhciBpbnB1dFs4MF0sICplbmRwOworICB3aGlsZSAoMSkgeworICAgIHJlYWRfaW5wdXQobWVzZywgaW5wdXQpOworICAgIGlmICgoKmlucHV0IHwgMHgyMCkgPT0gJ2wnKSB7CisgICAgICBsaXN0X3R5cGVzKCk7CisgICAgICBtZW1zZXQoaW5wdXQsIDAsIDgwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB2YWwgPSBzdHJ0b3VsKGlucHV0LCAmZW5kcCwgMTYpOworICAgIGlmIChlbmRwICYmICplbmRwKSBjb250aW51ZTsKKyAgICBpZiAodmFsIDw9IDB4ZmYpIHJldHVybiB2YWw7CisgIH0KK30KKworLyogRGVsZXRlIGFuIGV4aXRpbmcgcGFydGl0aW9uLAorICogaWYgaXRzIHByaW1hcnksIHRoZW4ganVzdCBjbGVhciB0aGUgcGFydGl0aW9uIGRldGFpbHMKKyAqIGlmIGV4dGVuZGVkLCB0aGVuIGNsZWFyIHRoZSBwYXJ0aXRpb24gZGV0YWlscywgYWxzbyBmb3IgbG9naWNhbAorICogaWYgb25seSBsb2dpY2FsLCB0aGVuIG1vdmUgdGhlIGxhdGVyIHBhcnRpdGlvbnMgYmFja3dhcmRzIDEgc3RlcAorICovCit2b2lkIGRlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisgIGludCBzeXNfaWQsIGxvb3BlciA9IDA7CisgIHN0cnVjdCBwYXJ0aXRpb24gKnAsICpxLCAqZXh0X3AsICpleHRfcTsKKyAgc2VjdG9yX3QgbmV3X3N0YXJ0OworICBzdHJ1Y3QgcGFydF9lbnRyeSAqcGUgPSAmcGFydGl0aW9uc1tpXTsKKyAgCisgIGlmIChjaHNfd2FybigpKSByZXR1cm47CisgIHAgPSBwZS0+cGFydDsKKyAgc3lzX2lkID0gcC0+c3lzX2luZDsKKyAgaWYgKCFzeXNfaWQpIHhwcmludGYoIlBhcnRpdGlvbiAldSBpcyBlbXB0eVxuIiwgaSsxKTsKKworICBpZiAoaSA8IDQgJiYgIUlTX0VYVEVOREVEKHN5c19pZCkpIHsKKyAgICBtZW1zZXQocCwgMCwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pKTsgLy9jbGVhcl9wYXJ0aXRpb24KKyAgICBwZS0+bW9kaWZpZWQgPSAxOworICB9IGVsc2UgaWYgKGkgPCA0ICYmIElTX0VYVEVOREVEKHN5c19pZCkpIHsKKyAgICBtZW1zZXQocCwgMCwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pKTsgLy9jbGVhcl9wYXJ0aXRpb24KKyAgICBwZS0+bW9kaWZpZWQgPSAxOworICAgIGZvciAobG9vcGVyID0gNDsgbG9vcGVyIDwgbnVtX3BhcnRzOyBsb29wZXIrKykgeworICAgICAgcGUgPSAmcGFydGl0aW9uc1tsb29wZXJdOworICAgICAgcCA9IHBlLT5wYXJ0OyAKKyAgICAgIGlmIChpc19wYXJ0aXRpb25fY2xlYXIocCkpIGJyZWFrOworICAgICAgZWxzZSB7CisgICAgICAgIG1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOyAvL2NsZWFyX3BhcnRpdGlvbgorICAgICAgICBwZS0+bW9kaWZpZWQgPSAxOworICAgICAgICBmcmVlKHBlLT5zZWNfYnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZXh0ZW5kZWRfb2Zmc2V0ID0gMDsKKyAgICBudW1fcGFydHMgPSA0OworICB9IGVsc2UgeworICAgIC8vb25seSBsb2dpY2FsIGlzIGRlbGV0ZSwgbmVlZCB0byBtb3ZlIHRoZSByZXN0IG9mIHRoZW0gYmFja3dhcmRzCisgICAgaWYgKGkgPT0gNCkgeyAvL21vdmUgcGFydGl0b24jIDYgdG8gNS4KKyAgICAgIHBhcnRpdGlvbnNbaV0ubW9kaWZpZWQgPSAxOworICAgICAgaWYgKG51bV9wYXJ0cyA+IGkrMSkgeworICAgICAgICBxID0gcGFydGl0aW9uc1tpICsgMV0ucGFydDsKKyAgICAgICAgKnAgPSAqcTsgLy9jb3B5IHRoZSBwYXJ0IHRhYmxlCisgICAgICAgIGV4dF9wID0gcGFydF9vZmZzZXQocGFydGl0aW9uc1tpXS5zZWNfYnVmZmVyLCAxKTsKKyAgICAgICAgZXh0X3EgPSBwYXJ0X29mZnNldChwYXJ0aXRpb25zW2kgKyAxXS5zZWNfYnVmZmVyLCAxKTsKKyAgICAgICAgKmV4dF9wID0gKmV4dF9xOyAvL2NvcHkgdGhlIGV4dGVuZGVkIGluZm8gcG9pbnRlcgorICAgICAgICAvLyBjaGFuZ2UgdGhlIHN0YXJ0IG9mIHRoZSA0dGggcGFydGl0b24uIAorICAgICAgICBuZXdfc3RhcnQgPSBwYXJ0aXRpb25zW2kgKyAxXS5zdGFydF9vZmZzZXQgKyBzd2FwX2xlMzJ0b2gocS0+c3RhcnQ0KSAtIGV4dGVuZGVkX29mZnNldDsKKyAgICAgICAgbmV3X3N0YXJ0ID0gU1dBUF9MRTMyKG5ld19zdGFydCk7CisgICAgICAgIG1lbWNweShwLT5zdGFydDQsICh2b2lkICopJm5ld19zdGFydCwgNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQocGFydGl0aW9uc1tpXS5wYXJ0LCAwLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworICAgICAgICByZXR1cm47IC8vb25seSBsb2dpY2FsCisgICAgICB9CisgICAgfSBlbHNlIGlmIChpID4gNCkgeworICAgICAgZXh0X3AgPSBwYXJ0X29mZnNldChwYXJ0aXRpb25zW2ktMV0uc2VjX2J1ZmZlciwgMSk7CisgICAgICBleHRfcSA9IHBhcnRfb2Zmc2V0KHBhcnRpdGlvbnNbaV0uc2VjX2J1ZmZlciwgMSk7CisgICAgICBtZW1jcHkoKHZvaWQqKWV4dF9wLCAodm9pZCAqKWV4dF9xLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworICAgICAgcGFydGl0aW9uc1tpLTFdLm1vZGlmaWVkID0gMTsKKyAgICB9CisgICAgaWYgKGkgPT0gNCkgbG9vcGVyID0gaSsyOworICAgIGVsc2UgaWYgKGkgPiA0KSBsb29wZXIgPSBpKzE7CisgICAgZm9yICg7IGxvb3BlciA8IG51bV9wYXJ0czsgbG9vcGVyKyspCisgICAgICBwYXJ0aXRpb25zW2xvb3Blci0xXSA9IHBhcnRpdGlvbnNbbG9vcGVyXTsKKyAgICBudW1fcGFydHMtLTsKKyAgfQorfQorCitzdGF0aWMgaW50IGFza19wYXJ0aXRpb24oaW50IG51bV9wYXJ0cykKK3sKKyAgaW50IHZhbDsKKyAgd2hpbGUgKDEpIHsKKyAgICBkbyB7CisgICAgICB4cHJpbnRmKCJQYXJ0aXRpb24gKCV1IC0gJXUpOiIsIDEsIG51bV9wYXJ0cyk7CisgICAgICBmZ2V0cyh0b3lidWYsIDgwLCBzdGRpbik7CisgICAgfSB3aGlsZSAoIWlzZGlnaXQoKnRveWJ1ZikpOworICAgIHZhbCA9IGF0b2kodG95YnVmKTsKKyAgICBpZiAodmFsID4gMCAmJiB2YWwgPD0gbnVtX3BhcnRzKSByZXR1cm4gdmFsOworICAgIGVsc2UgeHByaW50ZigiSW52YWxpZCBudW1iZXIgZW50ZXJlZFxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2FjdGl2ZV9mbGFnKGludCBpKQoreworICBzdHJ1Y3QgcGFydGl0aW9uICpwID0gcGFydGl0aW9uc1tpXS5wYXJ0OworICBpZiAoaXNfcGFydGl0aW9uX2NsZWFyKHApKSB4cHJpbnRmKCJQYXJ0aXRpb24gJXUgaXMgZW1wdHlcbiIsIGkrMSk7CisgIAorICBpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkgJiYgIXAtPmJvb3RfaW5kKQorICAgIHhwcmludGYoIldBUk5JTkc6IFBhcnRpdGlvbiAldSBpcyBhbiBleHRlbmRlZCBwYXJ0aXRpb25cbiIsIGkgKyAxKTsKKyAgcC0+Ym9vdF9pbmQgPSBwLT5ib290X2luZCA9PSAweDgwPzAgOiAweDgwOworICBwYXJ0aXRpb25zW2ldLm1vZGlmaWVkID0gMTsKK30KKworLy9Xcml0ZSB0aGUgcGFydGl0aW9uIGRldGFpbHMgZnJvbSBCdWZmZXIgdG8gRGlzay4KK3ZvaWQgd3JpdGVfdGFibGUodm9pZCkKK3sKKyAgaW50IGkgPTA7CisgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwZTsKKyAgc2VjdG9yX3Qgb2Zmc2V0OworCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgaWYgKHBhcnRpdGlvbnNbaV0ubW9kaWZpZWQpIHBhcnRpdGlvbnNbM10ubW9kaWZpZWQgPSAxOworCisgIGZvciAoaSA9IDM7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIHBlID0gJnBhcnRpdGlvbnNbaV07CisgICAgd3JpdGVfdGFibGVfZmxhZyhwZS0+c2VjX2J1ZmZlcik7CisgICAgb2Zmc2V0ID0gcGUtPnN0YXJ0X29mZnNldDsKKyAgICBpZiAocGUtPm1vZGlmaWVkID09IDEpIHsKKyAgICAgIHhsc2VlayhkZXZfZmQsIG9mZnNldCAqIGdfc2VjdF9zaXplLCBTRUVLX1NFVCk7CisgICAgICB4d3JpdGUoZGV2X2ZkLCBwZS0+c2VjX2J1ZmZlciwgZ19zZWN0X3NpemUpOworICAgIH0KKyAgfQorICB4cHJpbnRmKCJUaGUgcGFydGl0aW9uIHRhYmxlIGhhcyBiZWVuIGFsdGVyZWQuXG4iKTsKKyAgeHByaW50ZigiQ2FsbGluZyBpb2N0bCgpIHRvIHJlLXJlYWQgcGFydGl0aW9uIHRhYmxlXG4iKTsKKyAgc3luYygpOworICBmb3IgKGkgPSA0OyBpIDwgbnVtX3BhcnRzOyBpKyspIGZyZWUocGFydGl0aW9uc1tpXS5zZWNfYnVmZmVyKTsKKyAgaWYoaW9jdGwoZGV2X2ZkLCBCTEtSUlBBUlQsIE5VTEwpIDwgMCkKKyAgICBwZXJyb3JfZXhpdCgiV0FSTklORzogcmVyZWFkaW5nIHBhcnRpdGlvbiB0YWJsZSBmYWlsZWQsIGtlcm5lbCBzdGlsbCB1c2VzIG9sZCB0YWJsZSIpOworCit9CisKKy8qIHRyeSB0byBmaW5kIGEgcGFydGl0aW9uIGZvciBkZWxldGlvbiwgaWYgb25seQorICogb25lLCB0aGVuIHNlbGVjdCB0aGUgc2FtZSwgZWxzZSBhc2sgZnJvbSBVU0VSCisgKi8KK3N0YXRpYyBpbnQgZ2V0X25vbl9mcmVlX3BhcnRpdGlvbihpbnQgbWF4KQoreyAgICAgICAKKyAgaW50IG51bSA9IC0xLCBpID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKyAgICBpZiAoIWlzX3BhcnRpdGlvbl9jbGVhcihwYXJ0aXRpb25zW2ldLnBhcnQpKSB7CisgICAgICBpZiAobnVtID49IDApCisgICAgICAgIHJldHVybiBhc2tfcGFydGl0aW9uKG51bV9wYXJ0cyktMTsKKyAgICAgIG51bSA9IGk7CisgICAgfQorICB9CisgIChudW0gPj0gMCkgPyB4cHJpbnRmKCJTZWxlY3RlZCBwYXJ0aXRpb24gJWRcbiIsbnVtKzEpOgorICAgIHhwcmludGYoIk5vIHBhcnRpdGlvbiBpcyBkZWZpbmVkIHlldCFcbiIpOworICByZXR1cm4gbnVtOworfQorCisvKiBhIHRyeSBhdCBhdXRvZGV0ZWN0aW5nIGFuIGVtcHR5IHBhcnRpdGlvbiB0YWJsZSBlbnRyeSwKKyAqIGlmIG11bHRpcGxlIG9wdGlvbnMgdGhlbiBnZXQgVVNFUidzIGNob2NlLgorICovCitzdGF0aWMgaW50IGdldF9mcmVlX3BhcnRpdGlvbihpbnQgbWF4KQoreworICBpbnQgbnVtID0gLTEsIGkgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworICAgIGlmIChpc19wYXJ0aXRpb25fY2xlYXIocGFydGl0aW9uc1tpXS5wYXJ0KSkgeworICAgICAgaWYgKG51bSA+PSAwKQorICAgICAgICByZXR1cm4gYXNrX3BhcnRpdGlvbig0KS0xOworICAgICAgbnVtID0gaTsKKyAgICB9CisgIH0KKyAgKG51bSA+PSAwKSA/IHhwcmludGYoIlNlbGVjdGVkIHBhcnRpdGlvbiAlZFxuIixudW0rMSk6CisgICAgeHByaW50ZigiQWxsIHByaW1hcnkgcGFydGl0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCBhbHJlYWR5IVxuIik7CisgIHJldHVybiBudW07Cit9CisKKy8vdGFraW5nIHVzZXIgaW5wdXQgZm9yIHBhcnRpdGlvbiBzdGFydC9lbmQgc2VjdG9ycy9jeWluZGVycworc3RhdGljIHVpbnQzMl90IGFza192YWx1ZShjaGFyICptZXNnLCBzZWN0b3JfdCBsZWZ0LCBzZWN0b3JfdCByaWdodCwgc2VjdG9yX3QgZGVmYWx0KQoreyAKKyAgY2hhciAqc3RyID0gdG95YnVmOworICB1aW50MzJfdCB2YWw7CisgIGludCB1c2VfZGVmYXVsdCA9IDE7CisKKyAgd2hpbGUgKDEpIHsKKyAgICB1c2VfZGVmYXVsdCA9IDE7CisgICAgZG8geworICAgICAgeHByaW50ZigiJXMiLG1lc2cpOworICAgICAgZmdldHMoc3RyLCA4MCwgc3RkaW4pOworICAgIH0gd2hpbGUgKCFpc2RpZ2l0KCpzdHIpICYmICgqc3RyICE9ICdcbicpCisgICAgICAgICYmICgqc3RyICE9ICctJykgJiYgKCpzdHIgIT0gJysnKSAmJiAoIWlzYmxhbmsoKnN0cikpKTsKKyAgICB3aGlsZSAoaXNibGFuaygqc3RyKSkgc3RyKys7IC8vcmVtb3ZlIGxlYWRpbmcgd2hpdGUgc3BhY2VzCisgICAgaWYgKCpzdHIgPT0gJysnIHx8ICpzdHIgPT0gJy0nKSB7CisgICAgICBpbnQgbWludXMgPSAoKnN0ciA9PSAnLScpOworICAgICAgaW50IGFic29sdXRlID0gMDsKKworICAgICAgdmFsID0gYXRvaShzdHIgKyAxKTsKKyAgICAgIHdoaWxlIChpc2RpZ2l0KCorK3N0cikpIHVzZV9kZWZhdWx0ID0gMDsKKworICAgICAgc3dpdGNoICgqc3RyKSB7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICBpZiAoIWRpc3BfdW5pdF9jeWwpIHZhbCAqPSBnX2hlYWRzICogZ19zZWN0b3JzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdLJzoKKyAgICAgICAgICBhYnNvbHV0ZSA9IE9ORV9LOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICBhYnNvbHV0ZSA9IDEwMDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgorICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICBhYnNvbHV0ZSA9IDEwMDAwMDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICBhYnNvbHV0ZSA9IDEwMDAwMDAwMDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYWJzb2x1dGUpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsICogYWJzb2x1dGU7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdW5pdCA9IChkaXNwX3VuaXRfY3lsICYmIChnX2hlYWRzICogZ19zZWN0b3JzKSk/IGdfaGVhZHMgKiBnX3NlY3RvcnMgOiAxOworCisgICAgICAgIHVuaXQgPSB1bml0ICogZ19zZWN0X3NpemU7CisgICAgICAgIGJ5dGVzICs9IHVuaXQvMjsgLy8gcm91bmRpbmcKKyAgICAgICAgYnl0ZXMgLz0gdW5pdDsKKyAgICAgICAgdmFsID0gYnl0ZXM7CisgICAgICB9CisgICAgICBpZiAobWludXMpCisgICAgICAgIHZhbCA9IC12YWw7CisgICAgICB2YWwgKz0gbGVmdDsKKyAgICB9IGVsc2UgeworICAgICAgdmFsID0gYXRvaShzdHIpOworICAgICAgd2hpbGUgKGlzZGlnaXQoKnN0cikpIHsKKyAgICAgICAgc3RyKys7CisgICAgICAgIHVzZV9kZWZhdWx0ID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYodXNlX2RlZmF1bHQpIHsKKyAgICAgIHZhbCA9IGRlZmFsdDsKKyAgICAgIHhwcmludGYoIlVzaW5nIGRlZmF1bHQgdmFsdWUgJWxsZFxuIiwgZGVmYWx0KTsKKyAgICB9CisgICAgaWYgKHZhbCA+PSBsZWZ0ICYmIHZhbCA8PSByaWdodCkgcmV0dXJuIHZhbDsKKyAgICBlbHNlIHhwcmludGYoIlZhbHVlIG91dCBvZiByYW5nZVxuIik7CisgIH0KK30KKworLy92YWxpZGF0aW5nIGlmIHRoZSBzdGFydCBnaXZlbiBmYWxscyBpbiBhIGxpbWl0IG9yIG5vdAorc3RhdGljIGludCB2YWxpZGF0ZShpbnQgc3RhcnRfaW5kZXgsIHNlY3Rvcl90KiBiZWdpbixzZWN0b3JfdCogZW5kLCBzZWN0b3JfdCBzdGFydAorICAgICwgaW50IGFza2VkKQoreworICBpbnQgaSwgdmFsaWQgPSAwOworICBmb3IgKGkgPSBzdGFydF9pbmRleDsgaSA8IG51bV9wYXJ0czsgaSsrKSB7CisgICAgaWYgKHN0YXJ0ID49IGJlZ2luW2ldICYmIHN0YXJ0IDw9IGVuZFtpXSkgeworICAgICAgaWYgKGFza2VkKSB4cHJpbnRmKCJTZWN0b3IgJWxsZCBpcyBhbHJlYWR5IGFsbG9jYXRlZFxuIixzdGFydCk7CisgICAgICB2YWxpZCA9IDA7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgdmFsaWQgPSAxOworICB9CisgIHJldHVybiB2YWxpZDsKK30KKworLy9nZXQgdGhlIHN0YXJ0IHNlY3Rvci9jeWxpbmRlciBvZiBhIG5ldyBwYXJ0aXRpb24KK3N0YXRpYyBzZWN0b3JfdCBhc2tfc3RhcnRfc2VjdG9yKGludCBpZHgsIHNlY3Rvcl90KiBiZWdpbiwgc2VjdG9yX3QqIGVuZCwgaW50IGV4dF9pZHgpCit7CisgIHNlY3Rvcl90IHN0YXJ0LCBsaW1pdCwgdGVtcCA9IDAsIHN0YXJ0X2N5bCwgbGltaXRfY3lsLCBvZmZzZXQgPSAxOworICBjaGFyIG1lc2dbMjU2XTsKKyAgaW50IGksIGFza2VkID0gMCwgdmFsaWQgPSAwLCBzdGFydF9pbmRleCA9IDA7CisKKyAgaWYgKGRvc19mbGFnKSBvZmZzZXQgPSBnX3NlY3RvcnM7CisgIHN0YXJ0ID0gb2Zmc2V0OworICBpZiAoZGlzcF91bml0X2N5bCkgbGltaXQgPSAoc2VjdG9yX3QpZ19zZWN0b3JzICogZ19oZWFkcyAqIGdfY3lsaW5kZXJzIC0gMTsKKyAgZWxzZSBsaW1pdCA9IHRvdGFsX251bWJlcl9zZWN0b3JzIC0gMTsKKworICBpZiAoZGlzcF91bml0X2N5bCkgLy9tYWtlIHRoZSBiZWdpbiBvZiBldmVyeSBwYXJ0aXRpb24gdG8gY3lsbmRlciBib3VuZGFyeSAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcnRzOyBpKyspCisgICAgICBiZWdpbltpXSA9IChiZWdpbltpXS8oZ19oZWFkcyogZ19zZWN0b3JzKSkgKiAoZ19oZWFkcyogZ19zZWN0b3JzKTsKKworICBpZiAoaWR4ID49IDQpIHsKKyAgICBpZiAoIWJlZ2luW2V4dF9pZHhdICYmIGV4dGVuZGVkX29mZnNldCkgYmVnaW5bZXh0X2lkeF0gPSBleHRlbmRlZF9vZmZzZXQ7CisgICAgc3RhcnQgPSBiZWdpbltleHRfaWR4XSArIG9mZnNldDsKKyAgICBsaW1pdCA9IGVuZFtleHRfaWR4XTsKKyAgICBzdGFydF9pbmRleCA9IDQ7CisgIH0KKyAgZG8geworICAgIGlmIChhc2tlZCkgdmFsaWQgPSB2YWxpZGF0ZShzdGFydF9pbmRleCwgYmVnaW4sIGVuZCwgc3RhcnQsIGFza2VkKTsKKyAgICBpZiAodmFsaWQpIGJyZWFrOworCisgICAgZG8geworICAgICAgZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBudW1fcGFydHM7IGkrKykgCisgICAgICAgIGlmIChzdGFydCA+PSBiZWdpbltpXSAmJiBzdGFydCA8PSBlbmRbaV0pCisgICAgICAgICAgc3RhcnQgPSBlbmRbaV0gKyAxICsgKChpZHggPj0gNCk/IG9mZnNldCA6IDApOworICAgIH0gd2hpbGUgKCF2YWxpZGF0ZShzdGFydF9pbmRleCwgYmVnaW4sIGVuZCwgc3RhcnQsIDApKTsKKworICAgIHN0YXJ0X2N5bCA9IHN0YXJ0LyhnX3NlY3RvcnMgKiBnX2hlYWRzKSArIDE7CisgICAgbGltaXRfY3lsID0gbGltaXQvKGdfc2VjdG9ycyAqIGdfaGVhZHMpICsgMTsKKworICAgIGlmIChzdGFydCA+IGxpbWl0KSBicmVhazsKKyAgICBzcHJpbnRmKG1lc2csICJGaXJzdCAlcyAoJWxsZCAtICVsbGQsIGRlZmF1bHQgJWxsZCk6ICIsIGRpc3BfdW5pdF9jeWw/ICJjeWxpbmRlciIgOiAic2VjdG9yIiwKKyAgICAgICAgKGxvbmcgbG9uZyBpbnQpKGRpc3BfdW5pdF9jeWw/IHN0YXJ0X2N5bCA6IHN0YXJ0KSwgCisgICAgICAgIChsb25nIGxvbmcgaW50KShkaXNwX3VuaXRfY3lsPyBsaW1pdF9jeWwgOiBsaW1pdCksCisgICAgICAgIChsb25nIGxvbmcgaW50KShkaXNwX3VuaXRfY3lsPyBzdGFydF9jeWwgOiBzdGFydCkpOworICAgIHRlbXAgPSBhc2tfdmFsdWUobWVzZywgZGlzcF91bml0X2N5bD8gc3RhcnRfY3lsIDogc3RhcnQsIAorICAgICAgICBkaXNwX3VuaXRfY3lsPyBsaW1pdF9jeWwgOiBsaW1pdCwgZGlzcF91bml0X2N5bD8gc3RhcnRfY3lsIDogc3RhcnQpOworICAgIGFza2VkID0gMTsKKworICAgIGlmIChkaXNwX3VuaXRfY3lsKSB7CisgICAgICAvLyBwb2ludCB0byB0aGUgY3lsaW5kZXIgc3RhcnQgc2VjdG9yCisgICAgICB0ZW1wID0gKHRlbXAtMSkgKiBnX2hlYWRzICogZ19zZWN0b3JzOworICAgICAgaWYgKHRlbXAgPCBzdGFydCkgLy90aGUgYm91bmRhcnkgaXMgZmFsbGluZyBpbiB0aGUgYWxyZWFkeSB1c2VkIHNlY3RvcnMuCisgICAgICAgIHRlbXAgPSBzdGFydDsKKyAgICB9CisgICAgc3RhcnQgPSB0ZW1wOworICB9IHdoaWxlIChhc2tlZCAmJiAhdmFsaWQpOworICByZXR1cm4gc3RhcnQ7Cit9CisKKy8vZ2V0IHRoZSBlbmQgc2VjdG9yL2N5bGluZGVyIG9mIGEgbmV3IHBhcnRpdGlvbgorc3RhdGljIHNlY3Rvcl90IGFza19lbmRfc2VjdG9yKGludCBpZHgsIHNlY3Rvcl90KiBiZWdpbiwgc2VjdG9yX3QqIGVuZCwgaW50IGV4dF9pZHgsIHNlY3Rvcl90IHN0YXJ0X3NlYykKK3sKKyAgc2VjdG9yX3QgbGltaXQsIHRlbXAgPSAwLCBzdGFydF9jeWwsIGxpbWl0X2N5bCwgc3RhcnQgPSBzdGFydF9zZWM7CisgIGNoYXIgbWVzZ1syNTZdOworICBpbnQgaTsKKworICBpZiAoZGlzcF91bml0X2N5bCkgbGltaXQgPSAoc2VjdG9yX3QpZ19zZWN0b3JzICogZ19oZWFkcyAqIGdfY3lsaW5kZXJzIC0gMTsKKyAgZWxzZSBsaW1pdCA9IHRvdGFsX251bWJlcl9zZWN0b3JzIC0gMTsKKworICBpZiAoZGlzcF91bml0X2N5bCkgLy9tYWtlIHRoZSBiZWdpbiBvZiBldmVyeSBwYXJ0aXRpb24gdG8gY3lsbmRlciBib3VuZGFyeQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykKKyAgICAgIGJlZ2luW2ldID0gKGJlZ2luW2ldLyhnX2hlYWRzKiBnX3NlY3RvcnMpKSAqIChnX2hlYWRzKiBnX3NlY3RvcnMpOworCisgIGlmIChpZHggPj0gNCkgbGltaXQgPSBlbmRbZXh0X2lkeF07CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJ0czsgaSsrKSB7CisgICAgc3RydWN0IHBhcnRfZW50cnkgKnBlID0gJnBhcnRpdGlvbnNbaV07CisgICAgaWYgKHN0YXJ0IDwgcGUtPnN0YXJ0X29mZnNldCAmJiBsaW1pdCA+PSBwZS0+c3RhcnRfb2Zmc2V0KSBsaW1pdCA9IHBlLT5zdGFydF9vZmZzZXQgLSAxOworICAgIGlmIChzdGFydCA8IGJlZ2luW2ldICYmIGxpbWl0ID49IGJlZ2luW2ldKSBsaW1pdCA9IGJlZ2luW2ldIC0gMTsKKyAgfQorCisgIHN0YXJ0X2N5bCA9IHN0YXJ0LyhnX3NlY3RvcnMgKiBnX2hlYWRzKSArIDE7CisgIGxpbWl0X2N5bCA9IGxpbWl0LyhnX3NlY3RvcnMgKiBnX2hlYWRzKSArIDE7CisgIGlmIChsaW1pdCA8IHN0YXJ0KSB7IC8vdGhlIGJvdW5kYXJ5IGlzIGZhbGxpbmcgaW4gdGhlIGFscmVhZHkgdXNlZCBzZWN0b3JzLgorICAgIHhwcmludGYoIk5vIEZyZWUgc2VjdG9ycyBhdmFpbGFibGVcbiIpOworICAgIHJldHVybiAwOworICB9CisgIHNwcmludGYobWVzZywgIkxhc3QgJXMgb3IgK3NpemUgb3IgK3NpemVNIG9yICtzaXplSyAoJWxsZCAtICVsbGQsIGRlZmF1bHQgJWxsZCk6ICIsCisgICAgICBkaXNwX3VuaXRfY3lsPyAiY3lsaW5kZXIiIDogInNlY3RvciIsCisgICAgICAobG9uZyBsb25nIGludCkoZGlzcF91bml0X2N5bD8gc3RhcnRfY3lsIDogc3RhcnQpLCAKKyAgICAgIChsb25nIGxvbmcgaW50KShkaXNwX3VuaXRfY3lsPyBsaW1pdF9jeWwgOiBsaW1pdCksCisgICAgICAobG9uZyBsb25nIGludCkoZGlzcF91bml0X2N5bD8gbGltaXRfY3lsIDogbGltaXQpKTsKKyAgdGVtcCA9IGFza192YWx1ZShtZXNnLCBkaXNwX3VuaXRfY3lsPyBzdGFydF9jeWwgOiBzdGFydCwgCisgICAgICBkaXNwX3VuaXRfY3lsPyBsaW1pdF9jeWwgOiBsaW1pdCwgZGlzcF91bml0X2N5bD8gbGltaXRfY3lsIDogbGltaXQpOworCisgIGlmIChkaXNwX3VuaXRfY3lsKSB7IC8vIHBvaW50IHRvIHRoZSBjeWxpbmRlciBzdGFydCBzZWN0b3IKKyAgICB0ZW1wID0gdGVtcCAqIGdfaGVhZHMgKiBnX3NlY3RvcnMgLSAxOworICAgIGlmICh0ZW1wID4gbGltaXQpIHRlbXAgPSBsaW1pdDsKKyAgfQorICBpZiAodGVtcCA8IHN0YXJ0KSB7IC8vdGhlIGJvdW5kYXJ5IGlzIGZhbGxpbmcgaW4gdGhlIGFscmVhZHkgdXNlZCBzZWN0b3JzLgorICAgIHhwcmludGYoIk5vIEZyZWUgc2VjdG9ycyBhdmFpbGFibGVcbiIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiB0ZW1wOworfQorCisvLyBhZGQgYSBuZXcgcGFydGl0aW9uIHRvIHRoZSBwYXJ0aXRpb24gdGFibGUKK3N0YXRpYyBpbnQgYWRkX3BhcnRpdGlvbihpbnQgaWR4LCBpbnQgc3lzX2lkKQoreworICBpbnQgaSwgZXh0X2lkeCA9IC0xOworICBzZWN0b3JfdCBzdGFydCwgZW5kLCBiZWdpbl9zZWNbbnVtX3BhcnRzXSwgZW5kX3NlY1tudW1fcGFydHNdOworICBzdHJ1Y3QgcGFydF9lbnRyeSAqcGUgPSAmcGFydGl0aW9uc1tpZHhdOworICBzdHJ1Y3QgcGFydGl0aW9uICpwID0gcGUtPnBhcnQ7CisKKyAgaWYgKHAgJiYgIWlzX3BhcnRpdGlvbl9jbGVhcihwKSkgeworICAgIHhwcmludGYoIlBhcnRpdGlvbiAldSBpcyBhbHJlYWR5IGRlZmluZWQsIGRlbGV0ZSBpdCB0byByZS1hZGRcbiIsIGlkeCsxKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcnRzOyBpKyspIHsKKyAgICBwZSA9ICZwYXJ0aXRpb25zW2ldOworICAgIHAgPSBwZS0+cGFydDsKKyAgICBpZiAoaXNfcGFydGl0aW9uX2NsZWFyKHApKSB7CisgICAgICBiZWdpbl9zZWNbaV0gPSAweGZmZmZmZmZmOworICAgICAgZW5kX3NlY1tpXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGJlZ2luX3NlY1tpXSA9IHN3YXBfbGUzMnRvaChwLT5zdGFydDQpICsgcGUtPnN0YXJ0X29mZnNldDsKKyAgICAgIGVuZF9zZWNbaV0gPSBiZWdpbl9zZWNbaV0gKyBzd2FwX2xlMzJ0b2gocC0+c2l6ZTQpIC0gMTsKKyAgICB9CisgICAgaWYgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSBleHRfaWR4ID0gaTsKKyAgfQorICBzdGFydCA9IGFza19zdGFydF9zZWN0b3IoaWR4LCBiZWdpbl9zZWMsIGVuZF9zZWMsIGV4dF9pZHgpOworICBlbmQgPSBhc2tfZW5kX3NlY3RvcihpZHgsIGJlZ2luX3NlYywgZW5kX3NlYywgZXh0X2lkeCwgc3RhcnQpOworICBpZiAoIWVuZCkgcmV0dXJuIDA7CisgIC8vUG9wdWxhdGUgcGFydGl0aW9uIHRhYmxlIGVudHJ5ICAtIDE2IGJ5dGVzCisgIHBlID0gJnBhcnRpdGlvbnNbaWR4XTsKKyAgcCA9IHBlLT5wYXJ0OworCisgIGlmIChpZHggPiA0KSB7CisgICAgaWYgKGRvc19mbGFnKSBwZS0+c3RhcnRfb2Zmc2V0ID0gc3RhcnQgLSAoc2VjdG9yX3QpZ19zZWN0b3JzOworICAgIGVsc2UgcGUtPnN0YXJ0X29mZnNldCA9IHN0YXJ0IC0gMTsKKyAgICBpZiAocGUtPnN0YXJ0X29mZnNldCA9PSBleHRlbmRlZF9vZmZzZXQpIHBlLT5zdGFydF9vZmZzZXQrKzsKKyAgICBpZiAoIWRvc19mbGFnKSBzdGFydCsrOworICB9CisgCisgIHNldF9sZXZhbHVlKHAtPnN0YXJ0NCwgc3RhcnQgLSBwZS0+c3RhcnRfb2Zmc2V0KTsKKyAgc2V0X2xldmFsdWUocC0+c2l6ZTQsIGVuZCAtIHN0YXJ0ICsgMSk7CisgIHNldF9oc2MocCwgc3RhcnQsIGVuZCk7CisgIHAtPmJvb3RfaW5kID0gMDsKKyAgcC0+c3lzX2luZCA9IHN5c19pZDsKKyAgcGUtPm1vZGlmaWVkID0gMTsKKworICBpZiAoaWR4ID4gNCkgeworICAgIHAgPSBwYXJ0aXRpb25zW2lkeC0xXS5wYXJ0ICsgMTsgLy9leHRlbmRlZCBwb2ludGVyIGZvciBsb2dpY2FsIHBhcnRpdGlvbnMKKyAgICBzZXRfbGV2YWx1ZShwLT5zdGFydDQsIHBlLT5zdGFydF9vZmZzZXQgLSBleHRlbmRlZF9vZmZzZXQpOworICAgIHNldF9sZXZhbHVlKHAtPnNpemU0LCBlbmQgLSBzdGFydCArIDEgKyAoZG9zX2ZsYWc/IGdfc2VjdG9yczogMSkpOworICAgIHNldF9oc2MocCwgcGUtPnN0YXJ0X29mZnNldCwgZW5kKTsKKyAgICBwLT5ib290X2luZCA9IDA7ICAKKyAgICBwLT5zeXNfaW5kID0gRVhURU5ERUQ7CisgICAgcGFydGl0aW9uc1tpZHgtMV0ubW9kaWZpZWQgPSAxOyAgIAorICB9CisgIGlmIChJU19FWFRFTkRFRChzeXNfaWQpKSB7CisgICAgcGUgPSAmcGFydGl0aW9uc1s0XTsKKyAgICBwZS0+bW9kaWZpZWQgPSAxOyAKKyAgICBwZS0+c2VjX2J1ZmZlciA9IHh6YWxsb2MoZ19zZWN0X3NpemUpOworICAgIHBlLT5wYXJ0ID0gcGFydF9vZmZzZXQocGUtPnNlY19idWZmZXIsIDApOworICAgIHBlLT5zdGFydF9vZmZzZXQgPSBleHRlbmRlZF9vZmZzZXQgPSBzdGFydDsKKyAgICBudW1fcGFydHMgPSA1OworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhZGRfbG9naWNhbF9wYXJ0aXRpb24odm9pZCkKK3sKKyAgc3RydWN0IHBhcnRfZW50cnkgKnBlOworICBpZiAobnVtX3BhcnRzID4gNSB8fCAhaXNfcGFydGl0aW9uX2NsZWFyKHBhcnRpdGlvbnNbNF0ucGFydCkpIHsKKyAgICBwZSA9ICZwYXJ0aXRpb25zW251bV9wYXJ0c107CisgICAgcGUtPm1vZGlmaWVkID0gMTsKKyAgICBwZS0+c2VjX2J1ZmZlciA9IHh6YWxsb2MoZ19zZWN0X3NpemUpOworICAgIHBlLT5wYXJ0ID0gcGFydF9vZmZzZXQocGUtPnNlY19idWZmZXIsIDApOworICAgIHBlLT5zdGFydF9vZmZzZXQgPSAwOworICAgIG51bV9wYXJ0cysrOworICAgIGlmICghYWRkX3BhcnRpdGlvbihudW1fcGFydHMgLSAxLCBMSU5VWF9OQVRJVkUpKSB7CisgICAgICBudW1fcGFydHMtLTsKKyAgICAgIGZyZWUocGUtPnNlY19idWZmZXIpOworICAgIH0KKyAgfSAKKyAgZWxzZSBhZGRfcGFydGl0aW9uKG51bV9wYXJ0cyAtMSwgTElOVVhfTkFUSVZFKTsKK30KKworLyogQWRkIGEgbmV3IHBhcnRpdG9uIHRvIHRoZSBwYXJ0aXRpb24gdGFibGUuCisgKiBNQVggcGFydGl0aW9ucyBsaW1pdCBpcyB0YWtlbiB0byBiZSA2MCwgY2FuIGJlIGNoYW5nZWQKKyAqLworc3RhdGljIHZvaWQgYWRkX25ld19wYXJ0aXRpb24odm9pZCkKK3sKKyAgaW50IGNob2ljZSwgaWR4LCBpLCBmcmVlX3BhcnQgPSAwOworICBjaGFyICptc2cgPSBOVUxMOworICAKKyAgaWYgKGNoc193YXJuKCkpIHJldHVybjsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgaWYoaXNfcGFydGl0aW9uX2NsZWFyKHBhcnRpdGlvbnNbaV0ucGFydCkpIGZyZWVfcGFydCsrOworCisgIGlmICghZnJlZV9wYXJ0ICYmIG51bV9wYXJ0cyA+PSA2MCkgeworICAgIHhwcmludGYoIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0aXRpb25zIGhhcyBiZWVuIGNyZWF0ZWRcbiIpOworICAgIHJldHVybjsgICAgICAgCisgIH0KKyAgaWYgKCFmcmVlX3BhcnQpIHsKKyAgICBpZiAoZXh0ZW5kZWRfb2Zmc2V0KSBhZGRfbG9naWNhbF9wYXJ0aXRpb24oKTsKKyAgICBlbHNlIHhwcmludGYoIllvdSBtdXN0IGRlbGV0ZSBzb21lIHBhcnRpdGlvbiBhbmQgYWRkICIKKyAgICAgICAgICAiYW4gZXh0ZW5kZWQgcGFydGl0aW9uIGZpcnN0XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBtc2cgPSB4bXByaW50ZigiICAlc1xuICBwICBwcmltYXJ5IHBhcnRpdGlvbigxLTQpXG4iLAorICAgICAgICAgIGV4dGVuZGVkX29mZnNldD8gImwgIGxvZ2ljYWwgKDUgb3Igb3ZlcikiIDogImUgIGV4dGVuZGVkIik7CisKKyAgY2hvaWNlID0gMHgyMCB8IHJlYWRfaW5wdXQobXNnLCBOVUxMKTsKKyAgZnJlZShtc2cpOworICBpZiAoY2hvaWNlID09ICdwJykgeworICAgIGlkeCA9IGdldF9mcmVlX3BhcnRpdGlvbig0KTsKKyAgICBpZiAoaWR4ID49IDApIGFkZF9wYXJ0aXRpb24oaWR4LCBMSU5VWF9OQVRJVkUpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY2hvaWNlID09J2wnICYmIGV4dGVuZGVkX29mZnNldCkgeworICAgIGFkZF9sb2dpY2FsX3BhcnRpdGlvbigpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY2hvaWNlID09ICdlJyAmJiAhZXh0ZW5kZWRfb2Zmc2V0KSB7CisgICAgaWR4ID0gZ2V0X2ZyZWVfcGFydGl0aW9uKDQpOyAgIAorICAgIGlmIChpZHggPj0gMCkgYWRkX3BhcnRpdGlvbihpZHgsIEVYVEVOREVEKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQgY2hhbmdlX3N5c3R5cGUodm9pZCApCit7CisgIGludCBpLCBzeXNfaWQ7CisgIHN0cnVjdCBwYXJ0aXRpb24gKnA7CisgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwZTsKKworICBpID0gYXNrX3BhcnRpdGlvbihudW1fcGFydHMpOworICBwZSA9ICZwYXJ0aXRpb25zW2ktMV07CisgIHAgPSBwZS0+cGFydDsKKyAgaWYgKGlzX3BhcnRpdGlvbl9jbGVhcihwKSkgeworICAgIHhwcmludGYoIlBhcnRpdGlvbiAlZCBkb2Vzbid0IGV4aXN0IHlldCFcbiIsIGkpOworICAgIHJldHVybjsKKyAgfQorICBzeXNfaWQgPSByZWFkX2hleCgiSGV4IGNvZGUgKEwgdG8gbGlzdCBjb2Rlcyk6ICIpOworICBpZiAoKElTX0VYVEVOREVEKHAtPnN5c19pbmQpICYmICFJU19FWFRFTkRFRChzeXNfaWQpKSB8fAorICAgICAgKCFJU19FWFRFTkRFRChwLT5zeXNfaW5kKSAmJiBJU19FWFRFTkRFRChzeXNfaWQpKSkgeworICAgIHhwcmludGYoInlvdSBjYW4ndCBjaGFuZ2UgYSAgcGFydGl0aW9uIHRvIGFuIGV4dGVuZGVkIG9yIHZpY2UtdmVyc2FcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHhwcmludGYoIkNoYW5nZWQgc3lzdGVtIHR5cGUgb2YgcGFydGl0aW9uICV1IHRvICUweCAoJXMpXG4iLGksIHN5c19pZCwgZ2V0X3R5cGUoc3lzX2lkKSk7CisgIHAtPnN5c19pbmQgPSBzeXNfaWQ7CisgIHBlLT5tb2RpZmllZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrKGludCBuLCB1bnNpZ25lZCBoLCB1bnNpZ25lZCBzLCB1bnNpZ25lZCBjLCBzZWN0b3JfdCBzdGFydCkKK3sgICAKKyAgc2VjdG9yX3QgdG90YWwsIHJlYWxfcywgcmVhbF9jOworCisgIHJlYWxfcyA9IHNlY3RvcihzKSAtIDE7CisgIHJlYWxfYyA9IGN5bGluZGVyKHMsIGMpOworICB0b3RhbCA9IChyZWFsX2MgKiBnX3NlY3RvcnMgKyByZWFsX3MpICogZ19oZWFkcyArIGg7CisgIGlmICghdG90YWwpIHhwcmludGYoIlBhcnRpdGlvbiAldSBjb250YWlucyBzZWN0b3IgMFxuIiwgbik7CisgIGlmIChoID49IGdfaGVhZHMpCisgICAgeHByaW50ZigiUGFydGl0aW9uICV1OiBoZWFkICV1IGdyZWF0ZXIgdGhhbiBtYXhpbXVtICVsdVxuIiwgbiwgaCArIDEsIGdfaGVhZHMpOworICBpZiAocmVhbF9zID49IGdfc2VjdG9ycykKKyAgICB4cHJpbnRmKCJQYXJ0aXRpb24gJXU6IHNlY3RvciAldSBncmVhdGVyIHRoYW4gbWF4aW11bSAlbHVcbiIsIG4sIHMsIGdfc2VjdG9ycyk7CisgIGlmIChyZWFsX2MgPj0gZ19jeWxpbmRlcnMpCisgICAgeHByaW50ZigiUGFydGl0aW9uICV1OiBjeWxpbmRlciAlbGxkIGdyZWF0ZXIgdGhhbiBtYXhpbXVtICVsdVxuIiwgbiwgcmVhbF9jICsgMSwgZ19jeWxpbmRlcnMpOworICBpZiAoZ19jeWxpbmRlcnMgPD0gT05FX0sgJiYgc3RhcnQgIT0gdG90YWwpCisgICAgeHByaW50ZigiUGFydGl0aW9uICV1OiBwcmV2aW91cyBzZWN0b3JzICVsbGQgZGlzYWdyZWVzIHdpdGggdG90YWwgJWxsZFxuIiwgbiwgc3RhcnQsIHRvdGFsKTsKK30KKworc3RhdGljIHZvaWQgdmVyaWZ5X3RhYmxlKHZvaWQpCit7CisgIGludCBpLCBqLCBleHRfaWR4ID0gLTE7CisgIHNlY3Rvcl90IGJlZ2luX3NlY1tudW1fcGFydHNdLCBlbmRfc2VjW251bV9wYXJ0c10sIHRvdGFsID0gMTsKKyAgc3RydWN0IHBhcnRfZW50cnkgKnBlOworICBzdHJ1Y3QgcGFydGl0aW9uICpwOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIHBlID0gJnBhcnRpdGlvbnNbaV07CisgICAgcCA9IHBlLT5wYXJ0OworICAgIGlmIChpc19wYXJ0aXRpb25fY2xlYXIocCkgfHwgSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKyAgICAgIGJlZ2luX3NlY1tpXSA9IDB4ZmZmZmZmZmY7CisgICAgICBlbmRfc2VjW2ldID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgYmVnaW5fc2VjW2ldID0gc3dhcF9sZTMydG9oKHAtPnN0YXJ0NCkgKyBwZS0+c3RhcnRfb2Zmc2V0OworICAgICAgZW5kX3NlY1tpXSA9IGJlZ2luX3NlY1tpXSArIHN3YXBfbGUzMnRvaChwLT5zaXplNCkgLSAxOworICAgIH0KKyAgICBpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIGV4dF9pZHggPSBpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIHBlID0gJnBhcnRpdGlvbnNbaV07CisgICAgcCA9IHBlLT5wYXJ0OworICAgIGlmIChwLT5zeXNfaW5kICYmICFJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworICAgICAgY29uc2lzdGVuY3lfY2hlY2socCwgaSk7CisgICAgICBpZiAoKHN3YXBfbGUzMnRvaChwLT5zdGFydDQpICsgcGUtPnN0YXJ0X29mZnNldCkgPCBiZWdpbl9zZWNbaV0pCisgICAgICAgIHhwcmludGYoIldhcm5pbmc6IGJhZCBzdGFydC1vZi1kYXRhIGluIHBhcnRpdGlvbiAldVxuIiwgaSArIDEpOworICAgICAgY2hlY2soaSArIDEsIHAtPmVuZF9oZWFkLCBwLT5lbmRfc2VjdG9yLCBwLT5lbmRfY3lsLCBlbmRfc2VjW2ldKTsKKyAgICAgIHRvdGFsICs9IGVuZF9zZWNbaV0gKyAxIC0gYmVnaW5fc2VjW2ldOworICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICBpZiAoKGJlZ2luX3NlY1tpXSA+PSBiZWdpbl9zZWNbal0gJiYgYmVnaW5fc2VjW2ldIDw9IGVuZF9zZWNbal0pCisgICAgICAgICAgICB8fCAoKGVuZF9zZWNbaV0gPD0gZW5kX3NlY1tqXSAmJiBlbmRfc2VjW2ldID49IGJlZ2luX3NlY1tqXSkpKSB7CisgICAgICAgICAgeHByaW50ZigiV2FybmluZzogcGFydGl0aW9uICV1IG92ZXJsYXBzIHBhcnRpdGlvbiAldVxuIiwgaiArIDEsIGkgKyAxKTsKKyAgICAgICAgICB0b3RhbCArPSBiZWdpbl9zZWNbaV0gPj0gYmVnaW5fc2VjW2pdID8gYmVnaW5fc2VjW2ldIDogYmVnaW5fc2VjW2pdOworICAgICAgICAgIHRvdGFsIC09IGVuZF9zZWNbaV0gPD0gZW5kX3NlY1tqXSA/IGVuZF9zZWNbaV0gOiBlbmRfc2VjW2pdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9ICAKKyAgaWYgKGV4dGVuZGVkX29mZnNldCkgeworICAgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwZXggPSAmcGFydGl0aW9uc1tleHRfaWR4XTsKKyAgICBzZWN0b3JfdCBlX2xhc3QgPSBzd2FwX2xlMzJ0b2gocGV4LT5wYXJ0LT5zdGFydDQpICsKKyAgICAgIHN3YXBfbGUzMnRvaChwZXgtPnBhcnQtPnNpemU0KSAtIDE7CisKKyAgICBmb3IgKGkgPSA0OyBpIDwgbnVtX3BhcnRzOyBpKyspIHsKKyAgICAgIHRvdGFsKys7CisgICAgICBwID0gcGFydGl0aW9uc1tpXS5wYXJ0OworICAgICAgaWYgKCFwLT5zeXNfaW5kKSB7CisgICAgICAgIGlmIChpICE9IDQgfHwgaSArIDEgPCBudW1fcGFydHMpCisgICAgICAgICAgeHByaW50ZigiV2FybmluZzogcGFydGl0aW9uICV1IGlzIGVtcHR5XG4iLCBpICsgMSk7CisgICAgICB9IGVsc2UgaWYgKGJlZ2luX3NlY1tpXSA8IGV4dGVuZGVkX29mZnNldCB8fCBlbmRfc2VjW2ldID4gZV9sYXN0KQorICAgICAgICB4cHJpbnRmKCJMb2dpY2FsIHBhcnRpdGlvbiAldSBub3QgZW50aXJlbHkgaW4gcGFydGl0aW9uICV1XG4iLCBpICsgMSwgZXh0X2lkeCArIDEpOworICAgIH0KKyAgfQorICBpZiAodG90YWwgPiBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMpCisgICAgeHByaW50ZigiVG90YWwgYWxsb2NhdGVkIHNlY3RvcnMgJWxsZCBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gIgorICAgICAgICAiJWx1XG4iLCB0b3RhbCwgZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzKTsKKyAgZWxzZSB7CisgICAgdG90YWwgPSBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMgLSB0b3RhbDsKKyAgICBpZiAodG90YWwpIHhwcmludGYoIiVsbGQgdW5hbGxvY2F0ZWQgc2VjdG9yc1xuIiwgdG90YWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfYmVnbmluZyhpbnQgaWR4KQoreworICBzZWN0b3JfdCBzdGFydCwgbnVtLCBuZXdfc3RhcnQsIGVuZDsKKyAgY2hhciBtZXNnWzI1Nl07CisgIHN0cnVjdCBwYXJ0X2VudHJ5ICpwZSA9ICZwYXJ0aXRpb25zW2lkeF07CisgIHN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydDsKKworICBpZiAoY2hzX3dhcm4oKSkgcmV0dXJuOworICBzdGFydCA9IHN3YXBfbGUzMnRvaChwLT5zdGFydDQpICsgcGUtPnN0YXJ0X29mZnNldDsKKyAgbnVtID0gc3dhcF9sZTMydG9oKHAtPnNpemU0KTsKKyAgZW5kID0gc3RhcnQgKyBudW0gLTE7CisKKyAgaWYgKCFudW0gfHwgSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKyAgICB4cHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lc24ndCBoYXZlIGRhdGEgYXJlYVxuIiwgaWR4KzEpOworICAgIHJldHVybjsKKyAgfQorICBzcHJpbnRmKG1lc2csICJOZXcgYmVnaW5pbmcgb2YgZGF0YSAoMCAtICVsbGQsIGRlZmF1bHQgJWxsZCk6ICIsIAorICAgICAgKGxvbmcgbG9uZyBpbnQpKGVuZCksIChsb25nIGxvbmcgaW50KShzdGFydCkpOworICBuZXdfc3RhcnQgPSBhc2tfdmFsdWUobWVzZywgMCwgZW5kLCBzdGFydCk7CisgIGlmIChuZXdfc3RhcnQgIT0gc3RhcnQpIHsKKyAgICBzZXRfbGV2YWx1ZShwLT5zdGFydDQsIG5ld19zdGFydCAtIHBlLT5zdGFydF9vZmZzZXQpOworICAgIHNldF9sZXZhbHVlKHAtPnNpemU0LCBlbmQgLSBuZXdfc3RhcnQgKzEpOworICAgIGlmICgocmVhZF9pbnB1dCgiUmVjYWxjdWxhdGUgQy9IL1MgKFkvbik6ICIsIE5VTEwpIHwgMHgyMCkgPT0gJ3knKQorICAgICAgc2V0X2hzYyhwLCBuZXdfc3RhcnQsIGVuZCk7CisgICAgcGUtPm1vZGlmaWVkID0gMTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9yYXdfc2VjdG9ycygpCit7CisgIGludCBpLCBqOworICBzdHJ1Y3QgcGFydF9lbnRyeSAqcGU7CisKKyAgeHByaW50ZigiRGV2aWNlOiAlc1xuIiwgZGlza19kZXZpY2UpOworICBmb3IgKGkgPSAzOyBpIDwgbnVtX3BhcnRzOyBpKyspIHsKKyAgICBwZSA9ICZwYXJ0aXRpb25zW2ldOworICAgIGZvciAoaiA9IDA7IGogPCBnX3NlY3Rfc2l6ZTsgaisrKSB7CisgICAgICBpZiAoIShqICUgMTYpKSB4cHJpbnRmKCJcbjB4JTAzWDogIixqKTsKKyAgICAgIHhwcmludGYoIiUwMlggIixwZS0+c2VjX2J1ZmZlcltqXSk7CisgICAgfQorICAgIHhwdXRjKCdcbicpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3BhcnRpdGlvbnNfbGlzdChpbnQgZXh0KQoreworICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RydWN0IHBhcnRfZW50cnkgKnBlOworICBzdHJ1Y3QgcGFydGl0aW9uICpwOworCisgIHhwcmludGYoIkRpc2sgJXM6ICVsdSBoZWFkcywgJWx1IHNlY3RvcnMsICVsdSBjeWxpbmRlcnNcblxuIiwgZGlza19kZXZpY2UsIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMpOworICB4cHJpbnRmKCJOciBBRiAgSGQgU2VjICBDeWwgIEhkIFNlYyAgQ3lsICAgICAgU3RhcnQgICAgICAgU2l6ZSBJRFxuIik7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJ0czsgaSsrKSB7CisgICAgcGUgPSAmcGFydGl0aW9uc1tpXTsKKyAgICBwID0gcGUtPnBhcnQ7CisgICAgaWYgKHApIHsKKyAgICAgIGlmIChleHQgJiYgKGkgPj0gNCkpIHAgPSBwZS0+cGFydCArIDE7CisgICAgICBpZihleHQgJiYgaSA8IDQgJiYgIUlTX0VYVEVOREVEKHAtPnN5c19pbmQpKSBjb250aW51ZTsKKworICAgICAgeHByaW50ZigiJTJ1ICUwMnglNHUlNHUlNXUlNHUlNHUlNXUlMTF1JTExdSAlMDJ4XG4iLAorICAgICAgICAgIGkrMSwgcC0+Ym9vdF9pbmQsIHAtPmhlYWQsCisgICAgICAgICAgc2VjdG9yKHAtPnNlY3RvciksIGN5bGluZGVyKHAtPnNlY3RvciwgcC0+Y3lsKSwKKyAgICAgICAgICBwLT5lbmRfaGVhZCwgICAgICAgICAgIAorICAgICAgICAgIHNlY3RvcihwLT5lbmRfc2VjdG9yKSwgY3lsaW5kZXIocC0+ZW5kX3NlY3RvciwgcC0+ZW5kX2N5bCksCisgICAgICAgICAgc3dhcF9sZTMydG9oKHAtPnN0YXJ0NCksCisgICAgICAgICAgc3dhcF9sZTMydG9oKHAtPnNpemU0KSwKKyAgICAgICAgICBwLT5zeXNfaW5kKTsKKyAgICAgIGlmIChwLT5zeXNfaW5kKSBjb25zaXN0ZW5jeV9jaGVjayhwLCBpKTsKKyAgICB9CisgIH0KK30KKworLy9maXggdGhlIHBhcnRpdGlvbiB0YWJsZSBvcmRlciB0byBhc2NlbmRpbmcKK3N0YXRpYyB2b2lkIGZpeF9vcmRlcih2b2lkKQoreworICBzZWN0b3JfdCBmaXJzdFtudW1fcGFydHNdLCBtaW47CisgIGludCBpLCBqLCBvaiwgb2pqLCBzaiwgc2pqOworICBzdHJ1Y3QgcGFydF9lbnRyeSAqcGU7CisgIHN0cnVjdCBwYXJ0aXRpb24gKnB4LCAqcHksIHRlbXAsICpwaiwgKnBqaiwgdG1wOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIHBlID0gJnBhcnRpdGlvbnNbaV07CisgICAgcHggPSBwZS0+cGFydDsKKyAgICBpZiAoaXNfcGFydGl0aW9uX2NsZWFyKHB4KSkgZmlyc3RbaV0gPSAweGZmZmZmZmZmOworICAgIGVsc2UgZmlyc3RbaV0gPSBzd2FwX2xlMzJ0b2gocHgtPnN0YXJ0NCkgKyBwZS0+c3RhcnRfb2Zmc2V0OworICB9CisgIAorICBpZiAoIWNoZWNrX29yZGVyKCkpIHsKKyAgICB4cHJpbnRmKCJPcmRlcmluZyBpcyBhbHJlYWR5IGNvcnJlY3RcblxuIik7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICBpZiAoZmlyc3Rbal0gPiBmaXJzdFtqKzFdKSB7CisgICAgICAgIHB5ID0gcGFydGl0aW9uc1tqKzFdLnBhcnQ7CisgICAgICAgIHB4ID0gcGFydGl0aW9uc1tqXS5wYXJ0OworICAgICAgICBtZW1jcHkoJnRlbXAsIHB5LCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworICAgICAgICBtZW1jcHkocHksIHB4LCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworICAgICAgICBtZW1jcHkocHgsICZ0ZW1wLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworICAgICAgICBtaW4gPSBmaXJzdFtqKzFdOworICAgICAgICBmaXJzdFtqKzFdID0gZmlyc3Rbal07CisgICAgICAgIGZpcnN0W2pdID0gbWluOworICAgICAgICBwYXJ0aXRpb25zW2pdLm1vZGlmaWVkID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChpID0gNTsgaSA8IG51bV9wYXJ0czsgaSsrKSB7CisgICAgZm9yIChqID0gNTsgaiA8IG51bV9wYXJ0cyAtIDE7IGorKykgeworICAgICAgb2ogPSBwYXJ0aXRpb25zW2pdLnN0YXJ0X29mZnNldDsKKyAgICAgIG9qaiA9IHBhcnRpdGlvbnNbaisxXS5zdGFydF9vZmZzZXQ7CisgICAgICBpZiAob2ogPiBvamopIHsKKyAgICAgICAgcGFydGl0aW9uc1tqXS5zdGFydF9vZmZzZXQgPSBvamo7CisgICAgICAgIHBhcnRpdGlvbnNbaisxXS5zdGFydF9vZmZzZXQgPSBvajsKKyAgICAgICAgcGogPSBwYXJ0aXRpb25zW2pdLnBhcnQ7CisgICAgICAgIHNldF9sZXZhbHVlKHBqLT5zdGFydDQsIHN3YXBfbGUzMnRvaChwai0+c3RhcnQ0KStvai1vamopOworICAgICAgICBwamogPSBwYXJ0aXRpb25zW2orMV0ucGFydDsKKyAgICAgICAgc2V0X2xldmFsdWUocGpqLT5zdGFydDQsIHN3YXBfbGUzMnRvaChwamotPnN0YXJ0NCkrb2pqLW9qKTsKKyAgICAgICAgc2V0X2xldmFsdWUoKHBhcnRpdGlvbnNbai0xXS5wYXJ0KzEpLT5zdGFydDQsIG9qai1leHRlbmRlZF9vZmZzZXQpOworICAgICAgICBzZXRfbGV2YWx1ZSgocGFydGl0aW9uc1tqXS5wYXJ0KzEpLT5zdGFydDQsIG9qLWV4dGVuZGVkX29mZnNldCk7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaSA9IDQ7IGkgPCBudW1fcGFydHM7IGkrKykgeworICAgIGZvciAoaiA9IDQ7IGogPCBudW1fcGFydHMgLSAxOyBqKyspIHsKKyAgICAgIHBqID0gcGFydGl0aW9uc1tqXS5wYXJ0OworICAgICAgcGpqID0gcGFydGl0aW9uc1tqKzFdLnBhcnQ7CisgICAgICBzaiA9IHN3YXBfbGUzMnRvaChwai0+c3RhcnQ0KTsKKyAgICAgIHNqaiA9IHN3YXBfbGUzMnRvaChwamotPnN0YXJ0NCk7CisgICAgICBvaiA9IHBhcnRpdGlvbnNbal0uc3RhcnRfb2Zmc2V0OworICAgICAgb2pqID0gcGFydGl0aW9uc1tqKzFdLnN0YXJ0X29mZnNldDsKKyAgICAgIGlmIChvaitzaiA+IG9qaitzamopIHsKKyAgICAgICAgdG1wID0gKnBqOworICAgICAgICAqcGogPSAqcGpqOworICAgICAgICAqcGpqID0gdG1wOworICAgICAgICBzZXRfbGV2YWx1ZShwai0+c3RhcnQ0LCBvamorc2pqLW9qKTsKKyAgICAgICAgc2V0X2xldmFsdWUocGpqLT5zdGFydDQsIG9qK3NqLW9qaik7CisgICAgICB9ICAKKyAgICB9ICAgIAorICB9CisgIC8vIElmIGFueXRoaW5nIGNoYW5nZWQgCisgIGZvciAoaiA9IDQ7IGogPCBudW1fcGFydHM7IGorKykgcGFydGl0aW9uc1tqXS5tb2RpZmllZCA9IDE7CisgIHhwcmludGYoIkRvbmUhXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVudSh2b2lkKQoreworICB4cHJpbnRmKCJhXHR0b2dnbGUgYSBib290YWJsZSBmbGFnXG4iCisgICJiXHRlZGl0IGJzZCBkaXNrbGFiZWxcbiIKKyAgImNcdHRvZ2dsZSB0aGUgZG9zIGNvbXBhdGliaWxpdHkgZmxhZ1xuIgorICAiZFx0ZGVsZXRlIGEgcGFydGl0aW9uXG4iCisgICJsXHRsaXN0IGtub3duIHBhcnRpdGlvbiB0eXBlc1xuIgorICAiblx0YWRkIGEgbmV3IHBhcnRpdGlvblxuIgorICAib1x0Y3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb24gdGFibGVcbiIKKyAgInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGVcbiIKKyAgInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlc1xuIgorICAic1x0Y3JlYXRlIGEgbmV3IGVtcHR5IFN1biBkaXNrbGFiZWxcbiIKKyAgInRcdGNoYW5nZSBhIHBhcnRpdGlvbidzIHN5c3RlbSBpZFxuIgorICAidVx0Y2hhbmdlIGRpc3BsYXkvZW50cnkgdW5pdHNcbiIKKyAgInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlXG4iCisgICJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0XG4iCisgICJ4XHRleHRyYSBmdW5jdGlvbmFsaXR5IChleHBlcnRzIG9ubHkpXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfeG1lbnUodm9pZCkKK3sKKyAgeHByaW50ZigiYlx0bW92ZSBiZWdpbm5pbmcgb2YgZGF0YSBpbiBhIHBhcnRpdGlvblxuIgorICAiY1x0Y2hhbmdlIG51bWJlciBvZiBjeWxpbmRlcnNcbiIKKyAgImRcdHByaW50IHRoZSByYXcgZGF0YSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlXG4iCisgICJlXHRsaXN0IGV4dGVuZGVkIHBhcnRpdGlvbnNcbiIKKyAgImZcdGZpeCBwYXJ0aXRpb24gb3JkZXJcbiIgIAorICAiaFx0Y2hhbmdlIG51bWJlciBvZiBoZWFkc1xuIgorICAicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZVxuIgorICAicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzXG4iCisgICJyXHRyZXR1cm4gdG8gbWFpbiBtZW51XG4iCisgICJzXHRjaGFuZ2UgbnVtYmVyIG9mIHNlY3RvcnMvdHJhY2tcbiIKKyAgInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlXG4iCisgICJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0XG4iKTsKK30KKworc3RhdGljIHZvaWQgZXhwZXJ0X21lbnUodm9pZCkKK3sKKyAgaW50IGNob2ljZSwgaWR4OworICBzZWN0b3JfdCB2YWx1ZTsKKyAgY2hhciBtZXNnWzI1Nl07CisKKyAgd2hpbGUgKDEpIHsKKyAgICB4cHV0YygnXG4nKTsKKyAgICBjaGFyICptc2cgPSAiRXhwZXJ0IENvbW1hbmQgKCdtJyBmb3IgaGVscCk6ICI7CisgICAgY2hvaWNlID0gMHgyMCB8IHJlYWRfaW5wdXQobXNnLCBOVUxMKTsKKyAgICBzd2l0Y2ggKGNob2ljZSkgeworICAgICAgY2FzZSAnYic6IC8vbW92ZSBkYXRhIGJlZ2luaW5nIGluIHBhcnRpdGlvbgorICAgICAgICBpZHggPSBhc2tfcGFydGl0aW9uKG51bV9wYXJ0cyk7CisgICAgICAgIG1vdmVfYmVnbmluZyhpZHggLSAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzogLy9jaGFuZ2UgY3lsaW5kZXJzCisgICAgICAgICAgc3ByaW50ZihtZXNnLCAiTnVtYmVyIG9mIGN5bGluZGVycyAoMSAtIDEwNDg1NzYsIGRlZmF1bHQgJWx1KTogIiwgZ19jeWxpbmRlcnMpOworICAgICAgICAgIHZhbHVlID0gYXNrX3ZhbHVlKG1lc2csIDEsIDEwNDg1NzYsIGdfY3lsaW5kZXJzKTsKKyAgICAgICAgICBnX2N5bGluZGVycyA9IFRULmN5bGluZGVycyA9IHZhbHVlOworICAgICAgICAgIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19DOworICAgICAgICAgIGlmKGdfY3lsaW5kZXJzID4gT05FX0spCisgICAgICAgICAgICB4cHJpbnRmKCJcblRoZSBudW1iZXIgb2YgY3lsaW5kZXJzIGZvciB0aGlzIGRpc2sgaXMgc2V0IHRvICVsdS5cbiIKKyAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHRoYXQsIGJ1dCB0aGlzIGlzIGxhcmdlciB0aGFuIDEwMjQsXG4iCisgICAgICAgICAgICAgICAgImFuZCBjb3VsZCBpbiBjZXJ0YWluIHNldHVwcyBjYXVzZSBwcm9ibGVtcy5cbiIsIGdfY3lsaW5kZXJzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJzogLy9wcmludCByYXcgZGF0YSBpbiBwYXJ0IHRhYmxlcworICAgICAgICBwcmludF9yYXdfc2VjdG9ycygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2UnOiAvL2xpc3QgZXh0ZW5kZWQgcGFydGl0aW9ucworICAgICAgICBwcmludF9wYXJ0aXRpb25zX2xpc3QoMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZic6IC8vZml4IHBhcnQgb3JkZXIKKyAgICAgICAgZml4X29yZGVyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaCc6IC8vY2hhbmdlIG51bWJlciBvZiBoZWFkcworICAgICAgICAgIHNwcmludGYobWVzZywgIk51bWJlciBvZiBoZWFkcyAoMSAtIDI1NiwgZGVmYXVsdCAlbHUpOiAiLCBnX2hlYWRzKTsKKyAgICAgICAgICB2YWx1ZSA9IGFza192YWx1ZShtZXNnLCAxLCAyNTYsIGdfaGVhZHMpOworICAgICAgICAgIGdfaGVhZHMgPSBUVC5oZWFkcyA9IHZhbHVlOworICAgICAgICAgIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19IOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3AnOiAvL3ByaW50IHBhcnRpdGlvbiB0YWJsZQorICAgICAgICBwcmludF9wYXJ0aXRpb25zX2xpc3QoMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncSc6CisgICAgICAgIGZyZWVfYnVmcygpOworICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICB4cHV0YygnXG4nKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdyJzoKKyAgICAgICAgcmV0dXJuOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiAvL2NoYW5nZSBzZWN0b3IvdHJhY2sKKyAgICAgICAgICBzcHJpbnRmKG1lc2csICJOdW1iZXIgb2Ygc2VjdG9ycyAoMSAtIDYzLCBkZWZhdWx0ICVsdSk6ICIsIGdfc2VjdG9ycyk7CisgICAgICAgICAgdmFsdWUgPSBhc2tfdmFsdWUobWVzZywgMSwgNjMsIGdfc2VjdG9ycyk7CisgICAgICAgICAgZ19zZWN0b3JzID0gVFQuc2VjdG9ycyA9IHZhbHVlOworICAgICAgICAgIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19IOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3YnOgorICAgICAgICB2ZXJpZnlfdGFibGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd3JzoKKyAgICAgICAgd3JpdGVfdGFibGUoKTsKKyAgICAgICAgdG95cy5leGl0dmFsID0gMDsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdtJzoKKyAgICAgICAgcHJpbnRfeG1lbnUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB4cHJpbnRmKCJVbmtub3duIGNvbW1hbmQgJyVjJ1xuIixjaG9pY2UpOworICAgICAgICBwcmludF94bWVudSgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gLy93aGlsZSgxKQorfQorCitzdGF0aWMgaW50IGRpc2tfcHJvcGVyKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyAgdW5zaWduZWQgbGVuZ3RoOworICBpbnQgZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpOworCisgIGlmIChmZCAhPSAtMSkgeworICAgIHN0cnVjdCBoZF9nZW9tZXRyeSBkZXZfZ2VvOworICAgIGRldl9nZW8uaGVhZHMgPSAwOworICAgIGRldl9nZW8uc2VjdG9ycyA9IDA7CisgICAgaW50IGVyciA9IGlvY3RsKGZkLCBIRElPX0dFVEdFTywgJmRldl9nZW8pOworICAgIGNsb3NlKGZkKTsKKyAgICBpZiAoIWVycikgcmV0dXJuIChkZXZfZ2VvLnN0YXJ0ID09IDApOworICB9CisgIGxlbmd0aCA9IHN0cmxlbihkZXZpY2UpOworICBpZiAobGVuZ3RoICE9IDAgJiYgaXNkaWdpdChkZXZpY2VbbGVuZ3RoIC0gMV0pKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2VudHJpZXMoKQoreworICBpbnQgaTsKKworICBtZW1zZXQoTUJSYnVmLCAwLCBzaXplb2YoTUJSYnVmKSk7CisgIGZvciAoaSA9IDQ7IGkgPCBudW1fcGFydHM7IGkrKykKKyAgICBtZW1zZXQoJnBhcnRpdGlvbnNbaV0sIDAsIHNpemVvZihzdHJ1Y3QgcGFydF9lbnRyeSkpOworfQorCisvL3RoaXMgd2lsbCBrZWVwIGRldl9mZCA9IDMgYWx3YXlzIGFsaXZlCitzdGF0aWMgdm9pZCBtb3ZlX2ZkKCkKK3sKKyAgaW50IGZkID0geG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKKyAgaWYoZmQgIT0gZGV2X2ZkKSB7CisgICAgaWYoZHVwMihmZCwgZGV2X2ZkKSAhPSBkZXZfZmQpIHBlcnJvcl9leGl0KCJDYW4ndCBkdXAyIik7CisgICAgY2xvc2UoZmQpOworICB9Cit9CisKKy8qIFJlYWQgcHJvYy9wYXJ0aXRpb25zIGFuZCB0aGVuIHByaW50IHRoZSBkZXRhaWxzCisgKiBmb3IgcGFydGl0aW9ucyBvbiBlYWNoIGRldmljZQorICovCitzdGF0aWMgdm9pZCByZWFkX2FuZF9wcmludF9wYXJ0cygpCit7CisgIHVuc2lnbmVkIGludCBtYSwgbWksIHN6OworICBjaGFyICpuYW1lID0gdG95YnVmLCAqYnVmZmVyID0gdG95YnVmICsgT05FX0ssICpkZXZpY2UgPSB0b3lidWYgKyAyMDQ4OworICBGSUxFKiBmcCA9IHhmb3BlbigiL3Byb2MvcGFydGl0aW9ucyIsICJyIik7CisKKyAgd2hpbGUgKGZnZXRzKGJ1ZmZlciwgT05FX0ssIGZwKSkgeworICAgIHJlc2V0X2VudHJpZXMoKTsKKyAgICBudW1fcGFydHMgPSA0OworICAgIG1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworICAgIGlmIChzc2NhbmYoYnVmZmVyLCAiICV1ICV1ICV1ICVbXlxuIF0iLCAmbWEsICZtaSwgJnN6LCBuYW1lKSAhPSA0KQorICAgICAgY29udGludWU7CisgICAgICAKKyAgICBzcHJpbnRmKGRldmljZSwiL2Rldi8lcyIsbmFtZSk7CisgICAgaWYgKGRpc2tfcHJvcGVyKGRldmljZSkpIHsKKyAgICAgIGlmIChyZWFkX21icihkZXZpY2UsIDApKSBjb250aW51ZTsKKyAgICAgIHByaW50X21icigxKTsKKyAgICAgIG1vdmVfZmQoKTsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGZwKTsKK30KKwordm9pZCBmZGlza19tYWluKHZvaWQpCit7CisgIGludCBjaG9pY2UsIHA7CisKKyAgaW5pdF9tZW1iZXJzKCk7CisgIG1vdmVfZmQoKTsKKyAgaWYgKFRULmhlYWRzID49IDI1NikgVFQuaGVhZHMgPSAwOworICBpZiAoVFQuc2VjdG9ycyA+PSA2NCkgVFQuc2VjdG9ycyA9IDA7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR191KSBkaXNwX3VuaXRfY3lsID0gMDsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHsKKyAgICBpZiAoIXRveXMub3B0YykgcmVhZF9hbmRfcHJpbnRfcGFydHMoKTsKKyAgICBlbHNlIHsKKyAgICAgIHdoaWxlKCp0b3lzLm9wdGFyZ3MpeworICAgICAgICBpZiAocmVhZF9tYnIoKnRveXMub3B0YXJncywgMCkpIHsKKyAgICAgICAgICB0b3lzLm9wdGFyZ3MrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcmludF9tYnIoMSk7CisgICAgICAgIG1vdmVfZmQoKTsKKyAgICAgICAgdG95cy5vcHRhcmdzKys7CisgICAgICB9CisgICAgfQorICAgIHRveXMuZXhpdHZhbCA9IDA7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGlmICh0b3lzLm9wdGMgIT0gMSkgaGVscF9leGl0KHN0ZG91dCk7CisgICAgaWYgKHJlYWRfbWJyKHRveXMub3B0YXJnc1swXSwgMSkpIHJldHVybjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgeHB1dGMoJ1xuJyk7CisgICAgICBjaGFyICptc2cgPSAiQ29tbWFuZCAoJ20nIGZvciBoZWxwKTogIjsKKyAgICAgIGNob2ljZSA9IDB4MjAgfCByZWFkX2lucHV0KG1zZywgTlVMTCk7CisgICAgICBzd2l0Y2ggKGNob2ljZSkgeworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICBwID0gYXNrX3BhcnRpdGlvbihudW1fcGFydHMpOworICAgICAgICAgIHRvZ2dsZV9hY3RpdmVfZmxhZyhwIC0gMSk7IC8vcGFydGl0aW9uIHRhYmxlIGluZGV4IHN0YXJ0IGZyb20gMC4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgIGRvc19mbGFnID0gIWRvc19mbGFnOworICAgICAgICAgIHhwcmludGYoIkRvcyBjb21wYXRpYmxlIGZsYWcgaXMgJXNcbiIsIGRvc19mbGFnPyJTZXQiIDogIk5vdCBzZXQiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgcCA9IGdldF9ub25fZnJlZV9wYXJ0aXRpb24obnVtX3BhcnRzKTsgLy80IHdhcyBoZXJlCisgICAgICAgICAgaWYocCA+PSAwKSBkZWxldGVfcGFydGl0aW9uKHApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICBsaXN0X3R5cGVzKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOiAvL2FkZCBuZXcgcGFydGl0aW9uCisgICAgICAgICAgYWRkX25ld19wYXJ0aXRpb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgY3JlYXRlX2VtcHR5X2Rvc2xhYmVsKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIHByaW50X21icigwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgZnJlZV9idWZzKCk7CisgICAgICAgICAgY2xvc2UoZGV2X2ZkKTsKKyAgICAgICAgICB4cHV0YygnXG4nKTsKKyAgICAgICAgICBleGl0KDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgY2hhbmdlX3N5c3R5cGUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgZGlzcF91bml0X2N5bCA9ICFkaXNwX3VuaXRfY3lsOworICAgICAgICAgIHhwcmludGYoIkNoYW5naW5nIERpc3BsYXkvRW50cnkgdW5pdHMgdG8gJXNcbiIsZGlzcF91bml0X2N5bD8iY3lsaW5kZXJzIiA6ICJzZWN0b3JzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgIHZlcmlmeV90YWJsZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICB3cml0ZV90YWJsZSgpOworICAgICAgICAgIHRveXMuZXhpdHZhbCA9IDA7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICBleHBlcnRfbWVudSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICBwcmludF9tZW51KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeHByaW50ZigiJWM6IFVua25vd24gY29tbWFuZFxuIixjaG9pY2UpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gLy93aGlsZSgxKQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2ZvbGQuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZm9sZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWNlNjQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2ZvbGQuYwpAQCAtMCwwICsxLDk3IEBACisvKiBmb2xkLmMgLSBmb2xkIHRleHQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTYW11ZWwgSG9sbGFuZCA8c2FtdWVsQHNob2xsYW5kLm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2ZvbGQuaHRtbAorCitVU0VfRk9MRChORVdUT1koZm9sZCwgImJzdXcjPDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBGT0xECisgIGJvb2wgImZvbGQiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGZvbGQgWy1ic3VdIFstdyBXSURUSF0gW0ZJTEUuLi5dCisKKyAgICBGb2xkcyAod3JhcHMpIG9yIHVuZm9sZHMgYXNjaWkgdGV4dCBieSBhZGRpbmcgb3IgcmVtb3ZpbmcgbmV3bGluZXMuCisgICAgRGVmYXVsdCBsaW5lIHdpZHRoIGlzIDgwIGNvbHVtbnMgZm9yIGZvbGRpbmcgYW5kIGluZmluaXRlIGZvciB1bmZvbGRpbmcuCisKKyAgICAtYglGb2xkIGJhc2VkIG9uIGJ5dGVzIGluc3RlYWQgb2YgY29sdW1ucworICAgIC1zCUZvbGQvdW5mb2xkIGF0IHdoaXRlc3BhY2UgYm91bmRhcmllcyBpZiBwb3NzaWJsZQorICAgIC11CVVuZm9sZCB0ZXh0IChhbmQgcmVmb2xkIGlmIC13IGlzIGdpdmVuKQorICAgIC13CVNldCBsaW5lcyB0byBXSURUSCBjb2x1bW5zIG9yIGJ5dGVzCisqLworCisjZGVmaW5lIEZPUl9mb2xkCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBpbnQgd2lkdGg7CispCisKKy8vIHdjd2lkdGggbWJydG93Ywordm9pZCBkb19mb2xkKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgaW50IGJ1ZnN6LCBsZW4gPSAwLCBtYXhsZW47CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpIG1heGxlbiA9IFRULndpZHRoOworICBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR191KSBtYXhsZW4gPSAwOworICBlbHNlIG1heGxlbiA9IDgwOworCisgIHdoaWxlICgoYnVmc3ogPSByZWFkKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKSkgPiAwKSB7CisgICAgY2hhciAqYnVmID0gdG95YnVmOworICAgIGludCBwb3MgPSAwLCBzcGxpdCA9IC0xOworCisgICAgd2hpbGUgKHBvcyA8IGJ1ZnN6KSB7CisgICAgICBzd2l0Y2ggKGJ1Zltwb3NdKSB7CisgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAvLyBwcmludCBldmVyeXRoaW5nIGJ1dCB0aGUgXG4sIHRoZW4gbW92ZSBvbiB0byB0aGUgbmV4dCBidWZmZXIKKyAgICAgICAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpICYmIGJ1Zltwb3MtMV0gIT0gJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYnVmW3BvcysxXSAhPSAnXG4nKSB7CisgICAgICAgICAgICAgIHh3cml0ZSgxLCBidWYsIHBvcyk7CisgICAgICAgICAgICAgIGJ1ZnN6IC09IHBvcyArIDE7CisgICAgICAgICAgICAgIGJ1ZiArPSBwb3MgKyAxOworICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgICBzcGxpdCA9IC0xOworICAgICAgICAgIC8vIHJlc2V0IGxlbiwgRkxBR19iIG9yIG5vdDsganVzdCBwcmludCBtdWx0aXBsZSBsaW5lcyBhdCBvbmNlCisgICAgICAgICAgfSBlbHNlIGxlbiA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAvLyBsZW4gY2Fubm90IGJlIG5lZ2F0aXZlOyBub3QgYWxsb3dlZCB0byB3cmFwIGFmdGVyIGJhY2tzcGFjZQorICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSBsZW4rKzsKKyAgICAgICAgICBlbHNlIGlmIChsZW4gPiAwKSBsZW4tLTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgIC8vIG5vdCBhbGxvd2VkIHRvIHdyYXAgYWZ0ZXIgY2FycmlhZ2UgcmV0dXJuCisgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpIGxlbisrOworICAgICAgICAgIGVsc2UgbGVuID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgIC8vIHJvdW5kIHRvIDgsIGJ1dCB3ZSBhZGQgb25lIGFmdGVyIGZhbGxpbmcgdGhyb3VnaAorICAgICAgICAgIC8vIChiZWNhdXNlIG9mIHdoaXRlc3BhY2UsIGJ1dCBpdCBhbHNvIHRha2VzIGNhcmUgb2YgRkxBR19iKQorICAgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpKSBsZW4gPSAobGVuICYgfjcpICsgNzsKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgc3BsaXQgPSBwb3M7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbGVuKys7CisgICAgICB9CisKKyAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gZG91YmxlIHVwIFxuOyBub3QgYWxsb3dlZCB0byB3cmFwIGJlZm9yZSBcYgorICAgICAgaWYgKG1heGxlbiA+IDAgJiYgbGVuID49IG1heGxlbiAmJiBidWZbcG9zKzFdICE9ICdcbicgJiYgYnVmW3BvcysxXSAhPSAnXGInKSB7CisgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHx8IHNwbGl0IDwgMCkgc3BsaXQgPSBwb3M7CisgICAgICAgIHh3cml0ZSgxLCBidWYsIHNwbGl0ICsgMSk7CisgICAgICAgIHhwdXRjKCdcbicpOworICAgICAgICBidWZzeiAtPSBzcGxpdCArIDE7CisgICAgICAgIGJ1ZiArPSBzcGxpdCArIDE7CisgICAgICAgIGxlbiA9IHBvcyA9IDA7CisgICAgICAgIHNwbGl0ID0gLTE7CisgICAgICB9IGVsc2UgcG9zKys7CisgICAgfQorICAgIHh3cml0ZSgxLCBidWYsIGJ1ZnN6KTsKKyAgfQorICB4cHV0YygnXG4nKTsKK30KKwordm9pZCBmb2xkX21haW4odm9pZCkKK3sKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fZm9sZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2ZzY2suYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZnNjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2Y3N2QKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2ZzY2suYwpAQCAtMCwwICsxLDQzNCBAQAorLyogZnNjay5jIC0gIGNoZWNrIGFuZCByZXBhaXIgYSBMaW51eCBmaWxlc3lzdGVtCisgKgorICogQ29weXJpZ2h0IDIwMTMgU2FuZGVlcCBTaGFybWEgPHNhbmRlZXAuamFjazI3NTZAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisKK1VTRV9GU0NLKE5FV1RPWShmc2NrLCAiP3Q6QU5QUlRWc0MjIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRlNDSworICBib29sICJmc2NrIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBmc2NrIFstQU5QUlRWXSBbLUMgRkRdIFstdCBGU1RZUEVdIFtGU19PUFRTXSBbQkxPQ0tERVZdLi4uIAorICAgIAorICAgIENoZWNrIGFuZCByZXBhaXIgZmlsZXN5c3RlbXMKKworICAgIC1BICAgICAgV2FsayAvZXRjL2ZzdGFiIGFuZCBjaGVjayBhbGwgZmlsZXN5c3RlbXMKKyAgICAtTiAgICAgIERvbid0IGV4ZWN1dGUsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmUKKyAgICAtUCAgICAgIFdpdGggLUEsIGNoZWNrIGZpbGVzeXN0ZW1zIGluIHBhcmFsbGVsCisgICAgLVIgICAgICBXaXRoIC1BLCBza2lwIHRoZSByb290IGZpbGVzeXN0ZW0KKyAgICAtVCAgICAgIERvbid0IHNob3cgdGl0bGUgb24gc3RhcnR1cAorICAgIC1WICAgICAgVmVyYm9zZQorICAgIC1DIG4gICAgV3JpdGUgc3RhdHVzIGluZm9ybWF0aW9uIHRvIHNwZWNpZmllZCBmaWxlZGVzY3JpcHRvcgorICAgIC10IFRZUEUgTGlzdCBvZiBmaWxlc3lzdGVtIHR5cGVzIHRvIGNoZWNrCisKKyovCisKKyNkZWZpbmUgRk9SX2ZzY2sKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bW50ZW50Lmg+CisKKyNkZWZpbmUgRkxBR19XSVRIT1VUX05PX1BSRlggMQorI2RlZmluZSBGTEFHX1dJVEhfTk9fUFJGWCAyCisjZGVmaW5lIEZMQUdfRE9ORSAxCisKK0dMT0JBTFMoCisgIGludCBmZF9udW07CisgIGNoYXIgKnRfbGlzdDsKKworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRldmljZXM7CisgIGNoYXIgKmFycl9mbGFnOworICBjaGFyICoqYXJyX3R5cGU7CisgIGludCBuZWdhdGU7CisgIGludCBzdW1fc3RhdHVzOworICBpbnQgbnJfcnVuOworICBpbnQgc2lnX251bTsKKyAgbG9uZyBtYXhfbnJfcnVuOworKQorCitzdHJ1Y3QgZl9zeXNfaW5mbyB7CisgIGNoYXIgKmRldmljZSwgKm1vdW50cHQsICp0eXBlLCAqb3B0czsKKyAgaW50IHBhc3NubywgZmxhZzsKKyAgc3RydWN0IGZfc3lzX2luZm8gKm5leHQ7Cit9OworCitzdHJ1Y3QgY2hpbGRfbGlzdCB7CisgIHN0cnVjdCBjaGlsZF9saXN0ICpuZXh0OworICBwaWRfdCBwaWQ7CisgIGNoYXIgKnByb2dfbmFtZSwgKmRldl9uYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBmX3N5c19pbmZvICpmaWxlc3lzX2luZm8gPSBOVUxMOyAvL2ZzdGFiIGVudHJ5IGxpc3QKK3N0YXRpYyBzdHJ1Y3QgY2hpbGRfbGlzdCAqY19saXN0ID0gTlVMTDsgLy9mc2NrLnR5cGUgY2hpbGQgbGlzdC4KKworc3RhdGljIHZvaWQga2lsbF9hbGwodm9pZCkgCit7CisgIHN0cnVjdCBjaGlsZF9saXN0ICpjaGlsZDsKKworICBmb3IgKGNoaWxkID0gY19saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgCisgICAga2lsbChjaGlsZC0+cGlkLCBTSUdURVJNKTsKKyAgX2V4aXQoMCk7Cit9CisKK3N0YXRpYyBsb25nIHN0cnRvbF9yYW5nZShjaGFyICpzdHIsIGludCBtaW4sIGludCBtYXgpCit7CisgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisgIGVycm5vID0gMDsKKyAgbG9uZyByZXRfdmFsdWUgPSBzdHJ0b2woc3RyLCAmZW5kcHRyLCAxMCk7CisKKyAgaWYoZXJybm8pIHBlcnJvcl9leGl0KCJJbnZhbGlkIG51bSAlcyIsIHN0cik7CisgIGVsc2UgaWYoZW5kcHRyICYmICgqZW5kcHRyICE9ICdcMCcgfHwgZW5kcHRyID09IHN0cikpCisgICAgcGVycm9yX2V4aXQoIk5vdCBhIHZhbGlkIG51bSAlcyIsIHN0cik7CisgIGlmKHJldF92YWx1ZSA+PSBtaW4gJiYgcmV0X3ZhbHVlIDw9IG1heCkgcmV0dXJuIHJldF92YWx1ZTsKKyAgZWxzZSBwZXJyb3JfZXhpdCgiTnVtYmVyICVzIGlzIG5vdCBpbiB2YWxpZCBbJWQtJWRdIFJhbmdlIiwgc3RyLCBtaW4sIG1heCk7Cit9CisKKy8vY3JlYXRlIGZzdGFiIGVudHJpZXMgbGlzdC4KK3N0YXRpYyBzdHJ1Y3QgZl9zeXNfaW5mbyogY3JlYXRlX2RiKHN0cnVjdCBtbnRlbnQgKmZfaW5mbykKK3sKKyAgc3RydWN0IGZfc3lzX2luZm8gKnRlbXAgPSBmaWxlc3lzX2luZm87CisgIGlmICh0ZW1wKSB7CisgICAgd2hpbGUgKHRlbXAtPm5leHQpIHRlbXAgPSB0ZW1wLT5uZXh0OworICAgIHRlbXAtPm5leHQgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgZl9zeXNfaW5mbykpOworICAgIHRlbXAgPSB0ZW1wLT5uZXh0OworICB9IGVsc2UgZmlsZXN5c19pbmZvID0gdGVtcCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmX3N5c19pbmZvKSk7CisKKyAgdGVtcC0+ZGV2aWNlID0geHN0cmR1cChmX2luZm8tPm1udF9mc25hbWUpOworICB0ZW1wLT5tb3VudHB0ID0geHN0cmR1cChmX2luZm8tPm1udF9kaXIpOworICBpZiAoc3RyY2hyKGZfaW5mby0+bW50X3R5cGUsICcsJykpIHRlbXAtPnR5cGUgPSB4c3RyZHVwKCJhdXRvIik7CisgIGVsc2UgIHRlbXAtPnR5cGUgPSB4c3RyZHVwKGZfaW5mby0+bW50X3R5cGUpOworICB0ZW1wLT5vcHRzID0geHN0cmR1cChmX2luZm8tPm1udF9vcHRzKTsKKyAgdGVtcC0+cGFzc25vID0gZl9pbmZvLT5tbnRfcGFzc25vOworICByZXR1cm4gdGVtcDsKK30KKworLy9pcyB3ZSBoYXZlICdubycgb3IgISBiZWZvcmUgdHlwZS4KK3N0YXRpYyBpbnQgaXNfbm9fcHJlZml4KGNoYXIgKipwKQoreworICBpbnQgbm8gPSAwOworCisgIGlmICgoKnBbMF0gPT0gJ24nICYmICooKnAgKyAxKSA9PSAnbycpKSBubyA9IDI7IAorICBlbHNlIGlmICgqcFswXSA9PSAnIScpIG5vID0gMTsKKyAgKnAgKz0gbm87CisgIHJldHVybiAoKG5vKSA/IDEgOjApOworfQorCitzdGF0aWMgdm9pZCBmaXhfdGxpc3Qodm9pZCkKK3sKKyAgY2hhciAqcCwgKnMgPSBUVC50X2xpc3Q7CisgIGludCBuID0gMSwgbm87CisKKyAgd2hpbGUgKChzID0gc3RyY2hyKHMsICcsJykpKSB7CisgICAgcysrOworICAgIG4rKzsKKyAgfQorCisgIFRULmFycl9mbGFnID0geHphbGxvYyhuICsgMSk7CisgIFRULmFycl90eXBlID0geHphbGxvYygobiArIDEpICogc2l6ZW9mKGNoYXIgKikpOworICBzID0gVFQudF9saXN0OworICBuID0gMDsKKyAgd2hpbGUgKChwID0gc3Ryc2VwKCZzLCAiLCIpKSkgeworICAgIG5vID0gaXNfbm9fcHJlZml4KCZwKTsKKyAgICBpZiAoIXN0cmNtcChwLCAibG9vcCIpKSB7CisgICAgICBUVC5hcnJfZmxhZ1tuXSA9IG5vID8gRkxBR19XSVRIX05PX1BSRlggOkZMQUdfV0lUSE9VVF9OT19QUkZYOworICAgICAgVFQubmVnYXRlID0gbm87CisgICAgfSBlbHNlIGlmICghc3RybmNtcChwLCAib3B0cz0iLCA1KSkgeworICAgICAgcCs9NTsKKyAgICAgIFRULmFycl9mbGFnW25dID0gaXNfbm9fcHJlZml4KCZwKSA/RkxBR19XSVRIX05PX1BSRlggOkZMQUdfV0lUSE9VVF9OT19QUkZYOworICAgICAgVFQubmVnYXRlID0gbm87CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghbikgVFQubmVnYXRlID0gbm87CisgICAgICBpZiAobiAmJiBUVC5uZWdhdGUgIT0gbm8pIGVycm9yX2V4aXQoImVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGUgZmlsZXN5c3RlbSIKKyAgICAgICAgICAiIHR5cGVzIHBhc3NlZCB0byAtdCBtdXN0IGJlIHByZWZpeGVkIHdpdGggJ25vJyBvciAnISciKTsKKyAgICB9CisgICAgVFQuYXJyX3R5cGVbbisrXSA9IHA7CisgIH0KK30KKworLy9pZ25vcmUgdGhlc2UgdHlwZXMuLi4KK3N0YXRpYyBpbnQgaWdub3JlX3R5cGUoY2hhciAqdHlwZSkKK3sKKyAgaW50IGkgPSAwOworICBjaGFyICpzdHI7CisgIGNoYXIgKmlnbm9yZWRfdHlwZXNbXSA9IHsKKyAgICAiaWdub3JlIiwiaXNvOTY2MCIsICJuZnMiLCJwcm9jIiwKKyAgICAic3ciLCJzd2FwIiwgInRtcGZzIiwiZGV2cHRzIixOVUxMCisgIH07CisgIHdoaWxlICgoc3RyID0gaWdub3JlZF90eXBlc1tpKytdKSkgeworICAgIGlmICghc3RyY21wKHN0ciwgdHlwZSkpIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLyByZXR1cm4gdHJ1ZSBpZiBoYXMgdG8gaWdub3JlIHRoZSBmaWxlc3lzdGVtLgorc3RhdGljIGludCB0b19iZV9pZ25vcmVkKHN0cnVjdCBmX3N5c19pbmZvICpmaW5mbykgCit7CisgIGludCBpLCByZXQgPSAwLCB0eXBlX3ByZXNlbnQgPSAwOworCisgIGlmICghZmluZm8tPnBhc3NubykgcmV0dXJuIDE7IC8vSWdub3JlIHdpdGggcGFzcyBudW0gPSAwCisgIGlmIChUVC5hcnJfdHlwZSkgeworICAgIGZvciAoaSA9IDA7IFRULmFycl90eXBlW2ldOyBpKyspIHsKKyAgICAgIGlmICghVFQuYXJyX2ZsYWdbaV0pIHsgLy9pdCBpcyB0eXBlIG9mIGZpbGVzeXMuCisgICAgICAgIHR5cGVfcHJlc2VudCA9IDI7CisgICAgICAgIGlmICghc3RyY21wKFRULmFycl90eXBlW2ldLCBmaW5mby0+dHlwZSkpIHJldCA9IDA7CisgICAgICAgIGVsc2UgcmV0ID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoVFQuYXJyX2ZsYWdbaV0gPT0gRkxBR19XSVRIX05PX1BSRlgpIHsgLy9pdCBpcyBvcHRpb24gb2YgZmlsZXN5cworICAgICAgICBpZiAoaGFzbW50b3B0KChjb25zdCBzdHJ1Y3QgbW50ZW50ICopZmluZm8sIFRULmFycl90eXBlW2ldKSkgcmV0dXJuIDE7CisgICAgICB9IGVsc2UgeyAvL0ZMQUdfV0lUSE9VVF9OT19QUkZYCisgICAgICAgIGlmICghaGFzbW50b3B0KChjb25zdCBzdHJ1Y3QgbW50ZW50ICopZmluZm8sIFRULmFycl90eXBlW2ldKSkgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChpZ25vcmVfdHlwZShmaW5mby0+dHlwZSkpIHJldHVybiAxOworICBpZiAoVFQuYXJyX3R5cGUgJiYgdHlwZV9wcmVzZW50ICE9IDIpIHJldHVybiAwOworICByZXR1cm4gKChUVC5uZWdhdGUpID8gIXJldCA6IHJldCk7Cit9CisKKy8vIGZpbmQgdHlwZSBhbmQgZXhlY3V0ZSBjb3JyZXNwb25kaW5nIGZzY2sudHlwZSBwcm9nLgorc3RhdGljIHZvaWQgZG9fZnNjayhzdHJ1Y3QgZl9zeXNfaW5mbyAqZmluZm8pIAoreworICBzdHJ1Y3QgY2hpbGRfbGlzdCAqY2hpbGQ7CisgIGNoYXIgKiphcmdzOworICBjaGFyICp0eXBlOworICBwaWRfdCBwaWQ7CisgIGludCBpID0gMSwgaiA9IDA7CisKKyAgaWYgKHN0cmNtcChmaW5mby0+dHlwZSwgImF1dG8iKSkgdHlwZSA9IGZpbmZvLT50eXBlOworICBlbHNlIGlmIChUVC50X2xpc3QgJiYgKFRULnRfbGlzdFswXSAhPSAnbicgfHwgVFQudF9saXN0WzFdICE9ICdvJyB8fCBUVC50X2xpc3RbMF0gIT0gJyEnKQorICAgICAgJiYgc3RybmNtcChUVC50X2xpc3QsICJvcHRzPSIsIDUpICYmIHN0cm5jbXAoVFQudF9saXN0ICwgImxvb3AiLCA0KQorICAgICAgJiYgIVRULmFycl90eXBlWzFdKSB0eXBlID0gVFQudF9saXN0OyAvL29uZSBmaWxlIHN5cyBhdCBjbWRsaW5lCisgIGVsc2UgdHlwZSA9ICJhdXRvIjsKKworICBhcmdzID0geHphbGxvYygodG95cy5vcHRjICsgMiArIDEgKyAxKSAqIHNpemVvZihjaGFyKikpOyAvLysxLCBmb3IgTlVMTCwgKzEgaWYgLUMKKyAgYXJnc1swXSA9IHhtcHJpbnRmKCJmc2NrLiVzIiwgdHlwZSk7CisgIAorICBpZih0b3lzLm9wdGZsYWdzICYgRkxBR19DKSBhcmdzW2krK10gPSB4bXByaW50ZigiJXMgJWQiLCItQyIsIFRULmZkX251bSk7CisgIHdoaWxlKHRveXMub3B0YXJnc1tqXSkgeworICAgIGlmKCp0b3lzLm9wdGFyZ3Nbal0pIGFyZ3NbaSsrXSA9IHhzdHJkdXAodG95cy5vcHRhcmdzW2pdKTsKKyAgICBqKys7CisgIH0KKyAgYXJnc1tpXSA9IGZpbmZvLT5kZXZpY2U7CisKKyAgVFQubnJfcnVuKys7CisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfVikgfHwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX04pKSB7CisgICAgcHJpbnRmKCJbJXMgKCVkKSAtLSAlc10iLCBhcmdzWzBdLCBUVC5ucl9ydW4sCisgICAgICAgIGZpbmZvLT5tb3VudHB0ID8gZmluZm8tPm1vdW50cHQgOiBmaW5mby0+ZGV2aWNlKTsKKyAgICBmb3IgKGkgPSAwOyBhcmdzW2ldOyBpKyspIHhwcmludGYoIiAlcyIsIGFyZ3NbaV0pOworICAgIHhwdXRjKCdcbicpOworICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX04pIHsKKyAgICBmb3IgKGo9MDtqPGk7aisrKSBmcmVlKGFyZ3NbaV0pOworICAgIGZyZWUoYXJncyk7CisgICAgcmV0dXJuOworICB9IGVsc2UgeyAKKyAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPCAwKSB7CisgICAgICBwZXJyb3JfbXNnKGFyZ3NbMF0pOworICAgICAgZm9yIChqPTA7ajxpO2orKykgZnJlZShhcmdzW2ldKTsKKyAgICAgIGZyZWUoYXJncyk7CisgICAgICByZXR1cm47IAorICAgIH0KKyAgICBpZiAoIXBpZCkgeGV4ZWMoYXJncyk7IC8vY2hpbGQsIGV4ZWN1dGVzIGZzY2sudHlwZQorICB9IAorCisgIGNoaWxkID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGNoaWxkX2xpc3QpKTsgLy9QYXJlbnQsIGFkZCB0byBjaGlsZCBsaXN0LgorICBjaGlsZC0+ZGV2X25hbWUgPSB4c3RyZHVwKGZpbmZvLT5kZXZpY2UpOworICBjaGlsZC0+cHJvZ19uYW1lID0gYXJnc1swXTsKKyAgY2hpbGQtPnBpZCA9IHBpZDsKKworICBpZiAoY19saXN0KSB7CisgICAgY2hpbGQtPm5leHQgPSBjX2xpc3Q7CisgICAgY19saXN0ID0gY2hpbGQ7CisgIH0gZWxzZSB7CisgICAgY19saXN0ID0gY2hpbGQ7CisgICAgY2hpbGQtPm5leHQgPU5VTEw7CisgIH0KK30KKworLy8gZm9yX2FsbCA9IDE7IHdhaXQgZm9yIGFsbCBjaGlsZCB0byBleGl0CisvLyBmb3JfYWxsID0gMDsgd2FpdCBmb3IgYW55IG9uZSB0byBleGl0CitzdGF0aWMgaW50IHdhaXRfZm9yKGludCBmb3JfYWxsKQoreworICBwaWRfdCBwaWQ7CisgIGludCBzdGF0dXMgPSAwLCBjaGlsZF9leGl0ZWQ7CisgIHN0cnVjdCBjaGlsZF9saXN0ICpwcmV2LCAqdGVtcDsKKworICBlcnJubyA9IDA7CisgIGlmICghY19saXN0KSByZXR1cm4gMDsKKyAgd2hpbGUgKChwaWQgPSB3YWl0KCZzdGF0dXMpKSkgeworICAgIHRlbXAgPSBjX2xpc3Q7CisgICAgcHJldiA9IHRlbXA7CisgICAgaWYgKFRULnNpZ19udW0pIGtpbGxfYWxsKCk7CisgICAgY2hpbGRfZXhpdGVkID0gMDsKKyAgICBpZiAocGlkIDwgMCkgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKSBjb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKGVycm5vID09IEVDSElMRCkgYnJlYWs7IC8vTm8gY2hpbGQgdG8gd2FpdCwgYnJlYWsgYW5kIHJldHVybiBzdGF0dXMuCisgICAgICBlbHNlIHBlcnJvcl9leGl0KCJvcHRpb24gYXJnIEludmFsaWRcbiIpOyAvL3BhcmFub2lkLgorICAgIH0KKyAgICB3aGlsZSAodGVtcCkgeworICAgICAgaWYgKHRlbXAtPnBpZCA9PSBwaWQpIHsKKyAgICAgICAgY2hpbGRfZXhpdGVkID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwcmV2ID0gdGVtcDsKKyAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OworICAgIH0KKyAgICBpZiAoY2hpbGRfZXhpdGVkKSB7CisgICAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIFRULnN1bV9zdGF0dXMgfD0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICAgIGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsgCisgICAgICAgIFRULnN1bV9zdGF0dXMgfD0gNDsgLy9VbmNvcnJlY3RlZC4KKyAgICAgICAgaWYgKFdURVJNU0lHKHN0YXR1cykgIT0gU0lHSU5UKQorICAgICAgICAgIHBlcnJvcl9tc2coImNoaWxkIFRlcm0uIGJ5IHNpZzogJWRcbiIsKFdURVJNU0lHKHN0YXR1cykpKTsKKyAgICAgICAgVFQuc3VtX3N0YXR1cyB8PSA4OyAvL09wZXJhdGluYWwgZXJyb3IKKyAgICAgIH0gZWxzZSB7IAorICAgICAgICBUVC5zdW1fc3RhdHVzIHw9IDQ7IC8vVW5jb3JyZWN0ZWQuCisgICAgICAgIHBlcnJvcl9tc2coIiVzICVzOiBzdGF0dXMgaXMgJXgsIHNob3VsZCBuZXZlciBoYXBwZW5cbiIsIAorICAgICAgICAgICAgdGVtcC0+cHJvZ19uYW1lLCB0ZW1wLT5kZXZfbmFtZSwgc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIFRULm5yX3J1bi0tOworICAgICAgaWYgKHByZXYgPT0gdGVtcCkgY19saXN0ID0gY19saXN0LT5uZXh0OyAvL2ZpcnN0IG5vZGUgCisgICAgICBlbHNlIHByZXYtPm5leHQgPSB0ZW1wLT5uZXh0OworICAgICAgZnJlZSh0ZW1wLT5wcm9nX25hbWUpOworICAgICAgZnJlZSh0ZW1wLT5kZXZfbmFtZSk7CisgICAgICBmcmVlKHRlbXApOworICAgICAgaWYgKCFmb3JfYWxsKSBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRULnN1bV9zdGF0dXM7Cit9CisKKy8vc2NhbiBhbGwgdGhlIGZzdGFiIGVudHJpZXMgb3IgLXQgbWF0Y2hlcyB3aXRoIGZzdGFiLgorc3RhdGljIGludCBzY2FuX2FsbCh2b2lkKQoreworICBzdHJ1Y3QgZl9zeXNfaW5mbyAqZmluZm8gPSBmaWxlc3lzX2luZm87CisgIGludCByZXQgPSAwLCBwYXNzbm87CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1YpIHhwcmludGYoIkNoZWNraW5nIGFsbCBmaWxlc3lzdGVtXG4iKTsKKyAgd2hpbGUgKGZpbmZvKSB7CisgICAgaWYgKHRvX2JlX2lnbm9yZWQoZmluZm8pKSBmaW5mby0+ZmxhZyB8PSBGTEFHX0RPTkU7CisgICAgZmluZm8gPSBmaW5mby0+bmV4dDsKKyAgfQorICBmaW5mbyA9IGZpbGVzeXNfaW5mbzsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19QKSkgeworICAgIHdoaWxlIChmaW5mbykgeworICAgICAgaWYgKCFzdHJjbXAoZmluZm8tPm1vdW50cHQsICIvIikpIHsgLy8gbWFuIHNheXM6IGNoZWNrIC8gaW4gcGFyYWxsZWwgd2l0aCBvdGhlcnMgaWYgLVAgaXMgYWJzZW50LgorICAgICAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1IpIHx8IHRvX2JlX2lnbm9yZWQoZmluZm8pKSB7CisgICAgICAgICAgZmluZm8tPmZsYWcgfD0gRkxBR19ET05FOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRvX2ZzY2soZmluZm8pOworICAgICAgICAgIGZpbmZvLT5mbGFnIHw9IEZMQUdfRE9ORTsKKyAgICAgICAgICBpZiAoVFQuc2lnX251bSkga2lsbF9hbGwoKTsKKyAgICAgICAgICBpZiAoKHJldCB8PSB3YWl0X2ZvcigxKSkgPiA0KSByZXR1cm4gcmV0OyAvL2Rlc3RydWN0aW9uIGluIGZpbGVzeXMuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpbmZvID0gZmluZm8tPm5leHQ7CisgICAgfQorICB9CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19SKSB7IC8vIHdpdGggLVBSIHdlIGNob29zZSB0byBza2lwIHJvb3QuCisgICAgZm9yIChmaW5mbyA9IGZpbGVzeXNfaW5mbzsgZmluZm87IGZpbmZvID0gZmluZm8tPm5leHQpIHsKKyAgICAgIGlmKCFzdHJjbXAoZmluZm8tPm1vdW50cHQsICIvIikpIGZpbmZvLT5mbGFnIHw9IEZMQUdfRE9ORTsKKyAgICB9CisgIH0KKyAgcGFzc25vID0gMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBmb3IgKGZpbmZvID0gZmlsZXN5c19pbmZvOyBmaW5mbzsgZmluZm8gPSBmaW5mby0+bmV4dCkgCisgICAgICBpZiAoIWZpbmZvLT5mbGFnKSBicmVhazsKKyAgICBpZiAoIWZpbmZvKSBicmVhazsKKworICAgIGZvciAoZmluZm8gPSBmaWxlc3lzX2luZm87IGZpbmZvOyBmaW5mbyA9IGZpbmZvLT5uZXh0KSB7CisgICAgICBpZiAoZmluZm8tPmZsYWcpIGNvbnRpbnVlOworICAgICAgaWYgKGZpbmZvLT5wYXNzbm8gPT0gcGFzc25vKSB7CisgICAgICAgIGRvX2ZzY2soZmluZm8pOworICAgICAgICBmaW5mby0+ZmxhZyB8PSBGTEFHX0RPTkU7CisgICAgICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcykgfHwgKFRULm5yX3J1biAKKyAgICAgICAgICAgICAgJiYgKFRULm5yX3J1biA+PSBUVC5tYXhfbnJfcnVuKSkpIHJldCB8PSB3YWl0X2ZvcigwKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFRULnNpZ19udW0pIGtpbGxfYWxsKCk7CisgICAgcmV0IHw9IHdhaXRfZm9yKDEpOworICAgIHBhc3NubysrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgcmVjb3JkX3NpZ19udW0oaW50IHNpZykgCit7CisgIFRULnNpZ19udW0gPSBzaWc7Cit9CisKK3ZvaWQgZnNja19tYWluKHZvaWQpCit7CisgIHN0cnVjdCBtbnRlbnQgbXQ7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqZGV2OworICBzdHJ1Y3QgZl9zeXNfaW5mbyAqZmluZm87CisgIEZJTEUgKmZwOworICBjaGFyICp0bXAsICoqYXJnID0gdG95cy5vcHRhcmdzOworCisgIHNpZ2F0ZXhpdChyZWNvcmRfc2lnX251bSk7CisgIHdoaWxlICgqYXJnKSB7CisgICAgaWYgKCgqKmFyZyA9PSAnLycpIHx8IHN0cmNocigqYXJnLCAnPScpKSB7CisgICAgICBkbGlzdF9hZGQoJlRULmRldmljZXMsIHhzdHJkdXAoKmFyZykpOworICAgICAgKiphcmcgPSAnXDAnOworICAgIH0KKyAgICBhcmcrKzsKKyAgfQorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgZml4X3RsaXN0KCk7CisgIGlmICghKHRtcCA9IGdldGVudigiRlNUQUJfRklMRSIpKSkgdG1wID0gIi9ldGMvZnN0YWIiOworICBpZiAoIShmcCA9IHNldG1udGVudCh0bXAsICJyIikpKSBwZXJyb3JfZXhpdCgic2V0bW50ZW50IGZhaWxlZDoiKTsKKyAgd2hpbGUgKGdldG1udGVudF9yKGZwLCAmbXQsIHRveWJ1ZiwgNDA5NikpIGNyZWF0ZV9kYigmbXQpOworICBlbmRtbnRlbnQoZnApOworCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1QpKSB4cHJpbnRmKCJmc2NrIC0tLS0tIChUb3lib3gpXG4iKTsKKworICBpZiAoKHRtcCA9IGdldGVudigiRlNDS19NQVhfSU5TVCIpKSkKKyAgICBUVC5tYXhfbnJfcnVuID0gc3RydG9sX3JhbmdlKHRtcCwgMCwgSU5UX01BWCk7CisgIGlmICghVFQuZGV2aWNlcyB8fCAodG95cy5vcHRmbGFncyAmIEZMQUdfQSkpIHsKKyAgICB0b3lzLmV4aXR2YWwgPSBzY2FuX2FsbCgpOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGdvdG8gZnJlZV9hbGw7CisgICAgcmV0dXJuOyAvL2lmIENGR19UT1lCT1hfRlJFRSBpcyBub3Qgc2V0LCBleGl0LgorICB9CisKKyAgZGV2ID0gVFQuZGV2aWNlczsKKyAgZGV2LT5wcmV2LT5uZXh0ID0gTlVMTDsgLy9icmVhayBkb3VibGUgbGlzdCB0byB0cmF2ZXJzZS4KKyAgZm9yICg7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisgICAgZm9yIChmaW5mbyA9IGZpbGVzeXNfaW5mbzsgZmluZm87IGZpbmZvID0gZmluZm8tPm5leHQpCisgICAgICBpZiAoIXN0cmNtcChmaW5mby0+ZGV2aWNlLCBkZXYtPmRhdGEpIAorICAgICAgICAgIHx8ICFzdHJjbXAoZmluZm8tPm1vdW50cHQsIGRldi0+ZGF0YSkpIGJyZWFrOworICAgIGlmICghZmluZm8pIHsgLy9pZiBub3QgcHJlc2VudCwgZmlsbCBkZWYgdmFsdWVzLgorICAgICAgbXQubW50X2ZzbmFtZSA9IGRldi0+ZGF0YTsKKyAgICAgIG10Lm1udF9kaXIgPSAiIjsKKyAgICAgIG10Lm1udF90eXBlID0gImF1dG8iOworICAgICAgbXQubW50X29wdHMgPSAiIjsKKyAgICAgIG10Lm1udF9wYXNzbm8gPSAtMTsKKyAgICAgIGZpbmZvID0gY3JlYXRlX2RiKCZtdCk7CisgICAgfQorICAgIGRvX2ZzY2soZmluZm8pOworICAgIGZpbmZvLT5mbGFnIHw9IEZMQUdfRE9ORTsKKyAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHx8IChUVC5ucl9ydW4gJiYgKFRULm5yX3J1biA+PSBUVC5tYXhfbnJfcnVuKSkpIAorICAgICAgdG95cy5leGl0dmFsIHw9IHdhaXRfZm9yKDApOworICB9CisgIGlmIChUVC5zaWdfbnVtKSBraWxsX2FsbCgpOworICB0b3lzLmV4aXR2YWwgfD0gd2FpdF9mb3IoMSk7CisgIGZpbmZvID0gZmlsZXN5c19pbmZvOworCitmcmVlX2FsbDoKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIHN0cnVjdCBmX3N5c19pbmZvICpmaW5mbywgKnRlbXA7CisKKyAgICBsbGlzdF90cmF2ZXJzZShUVC5kZXZpY2VzLCBsbGlzdF9mcmVlX2RvdWJsZSk7CisgICAgZnJlZShUVC5hcnJfdHlwZSk7CisgICAgZnJlZShUVC5hcnJfZmxhZyk7CisgICAgZm9yIChmaW5mbyA9IGZpbGVzeXNfaW5mbzsgZmluZm87KSB7CisgICAgICB0ZW1wID0gZmluZm8tPm5leHQ7CisgICAgICBmcmVlKGZpbmZvLT5kZXZpY2UpOworICAgICAgZnJlZShmaW5mby0+bW91bnRwdCk7CisgICAgICBmcmVlKGZpbmZvLT50eXBlKTsKKyAgICAgIGZyZWUoZmluZm8tPm9wdHMpOworICAgICAgZnJlZShmaW5mbyk7CisgICAgICBmaW5mbyA9IHRlbXA7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2Z0cGdldC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9mdHBnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ0NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9mdHBnZXQuYwpAQCAtMCwwICsxLDI5MyBAQAorLyogZnRwZ2V0LmMgLSBHZXQgYSByZW1vdGUgZmlsZSBmcm9tIEZUUC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBSYW5qYW4gS3VtYXIgPHJhbmphbmt1bWFyLmJ0aEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKyAqIAorVVNFX0ZUUEdFVChORVdUT1koZnRwZ2V0LCAiPDJjdnU6cDpQIzwwPTIxPjY1NTM1IiwgVE9ZRkxBR19CSU4pKQorVVNFX0ZUUEdFVChPTERUT1koZnRwcHV0LCBmdHBnZXQsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIEZUUEdFVAorICBib29sICJmdHBnZXQvZnRwcHV0IgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBmdHBnZXQgWy1jdl0gWy11IFVTRVIgLXAgUEFTU1dPUkQgLVAgUE9SVF0gSE9TVF9OQU1FIFtMT0NBTF9GSUxFTkFNRV0gUkVNT1RFX0ZJTEVOQU1FCisgICAgdXNhZ2U6IGZ0cHB1dCBbLXZdIFstdSBVU0VSIC1wIFBBU1NXT1JEIC1QIFBPUlRdIEhPU1RfTkFNRSBbUkVNT1RFX0ZJTEVOQU1FXSBMT0NBTF9GSUxFTkFNRQorCisgICAgZnRwZ2V0IC0gR2V0IGEgcmVtb3RlIGZpbGUgZnJvbSBGVFAuCisgICAgZnRwcHV0IC0gVXBsb2FkIGEgbG9jYWwgZmlsZSBvbiByZW1vdGUgbWFjaGluZSB0aHJvdWdoIEZUUC4KKworICAgIC1jIENvbnRpbnVlIHByZXZpb3VzIHRyYW5zZmVyLgorICAgIC12IFZlcmJvc2UuCisgICAgLXUgVXNlciBuYW1lLgorICAgIC1wIFBhc3N3b3JkLgorICAgIC1QIFBvcnQgTnVtYmVyIChkZWZhdWx0IDIxKS4KKyovCisjZGVmaW5lIEZPUl9mdHBnZXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgcG9ydDsgLy8gIGNoYXIgKnBvcnQ7CisgIGNoYXIgKnBhc3N3b3JkOworICBjaGFyICp1c2VybmFtZTsKKworICBGSUxFICpzb2NrZnA7CisgIGludCBjOworICBpbnQgaXNnZXQ7CisgIGNoYXIgYnVmW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSldOworKQorCisjZGVmaW5lIERBVEFDT05ORUNUSU9OX09QRU5FRCAgIDEyNQorI2RlZmluZSBGVFBGSUxFX1NUQVRVU09LQVkgICAgICAxNTAKKyNkZWZpbmUgRlRQX0NPTU1BTkRfT0tBWSAgICAgICAgMjAwCisjZGVmaW5lIEZUUEZJTEVfU1RBVFVTICAgICAgICAgIDIxMworI2RlZmluZSBGVFBTRVJWRVJfUkVBRFkgICAgICAgICAyMjAKKyNkZWZpbmUgQ0xPU0VfREFUQUNPTkVDVElPTiAgICAgMjI2CisjZGVmaW5lIFBBU1NJVkVfTU9ERSAgICAgICAgICAgIDIyNworI2RlZmluZSBVU0VSTE9HR0VEX1NVQ0NFU1MgICAgICAyMzAKKyNkZWZpbmUgUEFTU1dPUkRfUkVRVUVTVCAgICAgICAgMzMxCisjZGVmaW5lIFJFUVVFU1RFRF9QRU5ESU5HQUNUSU9OIDM1MAorCisKK3N0YXRpYyB2b2lkIHNldHBvcnQodW5zaWduZWQgcG9ydF9udW0pCit7CisgIGludCBhZiA9ICgoc3RydWN0IHNvY2thZGRyICopVFQuYnVmKS0+c2FfZmFtaWx5OworCisgIGlmIChhZiA9PSBBRl9JTkVUKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopVFQuYnVmKS0+c2luX3BvcnQgPSBwb3J0X251bTsKKyAgZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpICgoc3RydWN0IHNvY2thZGRyX2luNiopVFQuYnVmKS0+c2luNl9wb3J0ID0gcG9ydF9udW07Cit9CisKK3N0YXRpYyBpbnQgY29ubmVjdF90b19zdHJlYW0oKQoreworICBpbnQgc29ja2ZkLCBhZiA9ICgoc3RydWN0IHNvY2thZGRyICopVFQuYnVmKS0+c2FfZmFtaWx5OworCisgIHNvY2tmZCA9IHhzb2NrZXQoYWYsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKGNvbm5lY3Qoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyKilUVC5idWYsKChhZiA9PSBBRl9JTkVUKT8gCisgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik6c2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKSkgPCAwKSB7CisgICAgY2xvc2Uoc29ja2ZkKTsKKyAgICBwZXJyb3JfZXhpdCgiY2FuJ3QgY29ubmVjdCB0byByZW1vdGUgaG9zdCIpOworICB9CisgIHJldHVybiBzb2NrZmQ7Cit9CisKKy8vY2xvc2UgZnRwIGNvbm5lY3Rpb24gYW5kIHByaW50IHRoZSBtZXNzYWdlLgorc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtKGNoYXIgKm1zZ19zdHIpCit7CisgIGNoYXIgKnN0ciA9IHRveWJ1ZjsgLy90b3lidWYgaG9sZHMgcmVzcG9uc2UgZGF0YS4KKworICAvL1JlbW92ZSBnYXJiYWdlIGNoYXJzIChmcm9tICcgJyBzcGFjZSB0byAnXHg3ZicpIERFTCByZW1vdGUgc2VydmVyIHJlc3BvbnNlLgorICB3aGlsZSAoKCpzdHIgPj0gMHgyMCkgJiYgKCpzdHIgPCAweDdmKSkgc3RyKys7IAorICAqc3RyID0gJ1wwJzsKKyAgaWYgKFRULnNvY2tmcCkgZmNsb3NlKFRULnNvY2tmcCk7CisgIGVycm9yX2V4aXQoIiVzIHNlcnZlciByZXNwb25zZTogJXMiLCAobXNnX3N0cikgPyBtc2dfc3RyOiIiLCB0b3lidWYpOworfQorCisvL3NlbmQgY29tbWFuZCB0byBmdHAgYW5kIGdldCByZXR1cm4gc3RhdHVzLgorc3RhdGljIGludCBnZXRfZnRwX3Jlc3BvbnNlKGNoYXIgKmNvbW1hbmQsIGNoYXIgKnBhcmFtKQoreworICB1bnNpZ25lZCBjbWRfc3RhdHVzID0gMDsKKyAgY2hhciAqZm10ID0gIiVzICVzXHJcbiI7CisKKyAgaWYgKGNvbW1hbmQpIHsKKyAgICBpZiAoIXBhcmFtKSBmbXQgKz0gMzsKKyAgICBmcHJpbnRmKFRULnNvY2tmcCwgZm10LCBjb21tYW5kLCBwYXJhbSk7CisgICAgZmZsdXNoKFRULnNvY2tmcCk7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIAorICAgICAgZnByaW50ZihzdGRlcnIsICJGVFAgUmVxdWVzdDogJXMgJXNcclxuIiwgY29tbWFuZCwgcGFyYW0pOworICB9CisKKyAgZG8geworICAgIGlmICghZmdldHModG95YnVmLCBzaXplb2YodG95YnVmKS0xLCBUVC5zb2NrZnApKSBjbG9zZV9zdHJlYW0oTlVMTCk7CisgIH0gd2hpbGUgKCFpc2RpZ2l0KHRveWJ1ZlswXSkgfHwgdG95YnVmWzNdICE9ICcgJyk7CisKKyAgdG95YnVmWzNdID0gJ1wwJzsKKyAgY21kX3N0YXR1cyA9IGF0b2x4X3JhbmdlKHRveWJ1ZiwgMCwgSU5UX01BWCk7CisgIHRveWJ1ZlszXSA9ICcgJzsKKyAgcmV0dXJuIGNtZF9zdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcmVxdWVzdHModm9pZCkKK3sKKyAgaW50IGNtZF9zdGF0dXMgPSAwOworCisgIC8vRlRQIGNvbm5lY3Rpb24gcmVxdWVzdC4KKyAgaWYgKGdldF9mdHBfcmVzcG9uc2UoTlVMTCwgTlVMTCkgIT0gRlRQU0VSVkVSX1JFQURZKSBjbG9zZV9zdHJlYW0oTlVMTCk7CisKKyAgLy8yMzAgVXNlciBhdXRoZW50aWNhdGVkLCBwYXNzd29yZCBwbGVhc2U7IDMzMSBQYXNzd29yZCByZXF1ZXN0LgorICBjbWRfc3RhdHVzID0gZ2V0X2Z0cF9yZXNwb25zZSgiVVNFUiIsIFRULnVzZXJuYW1lKTsKKyAgaWYgKGNtZF9zdGF0dXMgPT0gUEFTU1dPUkRfUkVRVUVTVCkgeyAvL3VzZXIgbG9nZ2VkIGluLiBOZWVkIFBhc3N3b3JkLgorICAgIGlmIChnZXRfZnRwX3Jlc3BvbnNlKCJQQVNTIiwgVFQucGFzc3dvcmQpICE9IFVTRVJMT0dHRURfU1VDQ0VTUykgCisgICAgICBjbG9zZV9zdHJlYW0oIlBBU1MiKTsKKyAgfSBlbHNlIGlmIChjbWRfc3RhdHVzID09IFVTRVJMT0dHRURfU1VDQ0VTUyk7IC8vZG8gbm90aGluZworICBlbHNlIGNsb3NlX3N0cmVhbSgiVVNFUiIpOworICAvLzIwMCBUeXBlIEJpbmFyeS4gQ29tbWFuZCBva2F5LgorICBpZiAoZ2V0X2Z0cF9yZXNwb25zZSgiVFlQRSBJIiwgTlVMTCkgIT0gRlRQX0NPTU1BTkRfT0tBWSkgCisgICAgY2xvc2Vfc3RyZWFtKCJUWVBFIEkiKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3NvY2thZGRyKGNoYXIgKmhvc3QpCit7ICAKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzdWx0OworICBjaGFyIHBvcnRbNl07CisgIGludCBzdGF0dXM7CisgIAorICBlcnJubyA9IDA7CisgIHNucHJpbnRmKHBvcnQsIDYsICIlbGQiLCBUVC5wb3J0KTsKKworICBtZW1zZXQoJmhpbnRzLCAwICwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKyAgc3RhdHVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmcmVzdWx0KTsgCisgIGlmIChzdGF0dXMpIGVycm9yX2V4aXQoImJhZCBhZGRyZXNzICclcycgOiAlcyIsIGhvc3QsIGdhaV9zdHJlcnJvcihzdGF0dXMpKTsKKworICBtZW1jcHkoVFQuYnVmLCByZXN1bHQtPmFpX2FkZHIsIHJlc3VsdC0+YWlfYWRkcmxlbik7CisgIGZyZWVhZGRyaW5mbyhyZXN1bHQpOworfSAKKworLy8gc2VuZCBjb21tYW5kcyB0byBmdHAgZm8gUEFTViBtb2RlLgorc3RhdGljIHZvaWQgdmVyaWZ5X3Bhc3ZfbW9kZShjaGFyICpyX2ZpbGVuYW1lKQoreworICBjaGFyICpwY2g7CisgIHVuc2lnbmVkIHBvcnRudW07CisKKyAgLy92c2Z0cGQgcmVwbHkgbGlrZTotICIyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICgxMjUsMTksMzksMTE3LDQzLDM5KSIuCisgIGlmIChnZXRfZnRwX3Jlc3BvbnNlKCJQQVNWIiwgTlVMTCkgIT0gUEFTU0lWRV9NT0RFKSBnb3RvIGNsb3NlX3N0cmVhbTsKKworICAvL1Jlc3BvbnNlIGlzICJOTk4gPHNvbWUgdGV4dD4gKE4xLE4yLE4zLE40LFAxLFAyKSBnYXJiYWdlLgorICAvL1NlcnZlcidzIElQIGlzIE4xLk4yLk4zLk40CisgIC8vU2VydmVyJ3MgcG9ydCBmb3IgZGF0YSBjb25uZWN0aW9uIGlzIFAxKjI1NitQMi4KKyAgaWYgKCEocGNoID0gc3RycmNocih0b3lidWYsICcpJykpKSBnb3RvIGNsb3NlX3N0cmVhbTsKKyAgKnBjaCA9ICdcMCc7CisgIGlmICghKHBjaCA9IHN0cnJjaHIodG95YnVmLCAnLCcpKSkgZ290byBjbG9zZV9zdHJlYW07CisgICpwY2ggPSAnXDAnOworCisgIHBvcnRudW0gPSBhdG9seF9yYW5nZShwY2ggKyAxLCAwLCAyNTUpOworCisgIGlmICghKHBjaCA9IHN0cnJjaHIodG95YnVmLCAnLCcpKSkgZ290byBjbG9zZV9zdHJlYW07CisgICpwY2ggPSAnXDAnOworICBwb3J0bnVtID0gcG9ydG51bSArIChhdG9seF9yYW5nZShwY2ggKyAxLCAwLCAyNTUpICogMjU2KTsKKyAgc2V0cG9ydChodG9ucyhwb3J0bnVtKSk7CisKKyAgaWYgKFRULmlzZ2V0ICYmIGdldF9mdHBfcmVzcG9uc2UoIlNJWkUiLCByX2ZpbGVuYW1lKSAhPSBGVFBGSUxFX1NUQVRVUykKKyAgICBUVC5jID0gMDsKKyAgcmV0dXJuOworCitjbG9zZV9zdHJlYW06CisgIGNsb3NlX3N0cmVhbSgiUEFTViIpOworfQorCisvKgorICogdmVyaWZ5IHRoZSBsb2NhbCBmaWxlIHByZXNlbmNlLgorICogaWYgcHJlc2VudCwgZ2V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLgorICovCitzdGF0aWMgdm9pZCBpc19sb2NhbGZpbGVfcHJlc2VudChjaGFyICpsX2ZpbGVuYW1lKQoreworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBpZiAoc3RhdChsX2ZpbGVuYW1lLCAmc2IpIDwgMCkgcGVycm9yX2V4aXQoInN0YXQiKTsKKyAgLy9pZiBsb2NhbCBmaWxlIHByZXNlbnQsIHRoZW4gcmVxdWVzdCBmb3IgcGVuZGluZyBmaWxlIGFjdGlvbi4KKyAgaWYgKHNiLnN0X3NpemUgPiAwKSB7CisgICAgc3ByaW50Zih0b3lidWYsICJSRVNUICVsdSIsICh1bnNpZ25lZCBsb25nKSBzYi5zdF9zaXplKTsKKyAgICBpZiAoZ2V0X2Z0cF9yZXNwb25zZSh0b3lidWYsIE5VTEwpICE9IFJFUVVFU1RFRF9QRU5ESU5HQUNUSU9OKSBUVC5jID0gMDsKKyAgfSBlbHNlIFRULmMgPSAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zlcl9maWxlKGludCBsb2NhbF9mZCwgaW50IHJlbW90ZV9mZCkKK3sKKyAgaW50IGxlbiwgcmZkID0gKFRULmlzZ2V0KT9yZW1vdGVfZmQ6bG9jYWxfZmQsCisgICAgICB3ZmQgPSAoVFQuaXNnZXQpP2xvY2FsX2ZkOnJlbW90ZV9mZDsKKworICBpZiAocmZkIDwgMCB8fCB3ZmQgPCAwKSBlcnJvcl9leGl0KCJFcnJvciBpbiBmaWxlIGNyZWF0aW9uOiIpOworICB3aGlsZSAoKGxlbiA9IHhyZWFkKHJmZCwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpKSB4d3JpdGUod2ZkLCB0b3lidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9maWxlKGNoYXIgKmxfZmlsZW5hbWUsIGNoYXIgKnJfZmlsZW5hbWUpCit7CisgIGludCBsb2NhbF9mZCA9IC0xLCByZW1vdGVfZmQ7CisKKyAgdmVyaWZ5X3Bhc3ZfbW9kZShyX2ZpbGVuYW1lKTsKKyAgcmVtb3RlX2ZkID0gY29ubmVjdF90b19zdHJlYW0oKTsgLy9Db25uZWN0IHRvIGRhdGEgc29ja2V0LgorCisgIC8vaWYgbG9jYWwgZmlsZSBuYW1lIHdpbGwgYmUgJy0nIHRoZW4gbG9jYWwgZmQgd2lsbCBiZSBzdGRvdXQuCisgIGlmICgobF9maWxlbmFtZVswXSA9PSAnLScpICYmICFsX2ZpbGVuYW1lWzFdKSB7CisgICAgbG9jYWxfZmQgPSAxOyAvL2ZpbGUgZGVzY3JpcHRvciB3aWxsIGJlY29tZSBzdGRvdXQuCisgICAgVFQuYyA9IDA7CisgIH0KKworICAvL2lmIGNvbnRpbnVlLCBjaGVjayBmb3IgbG9jYWwgZmlsZSBleGlzdGFuY2UuCisgIGlmIChUVC5jKSBpc19sb2NhbGZpbGVfcHJlc2VudChsX2ZpbGVuYW1lKTsKKworICAvL3ZlcmlmeSB0aGUgcmVtb3RlIGZpbGUgcHJlc2VuY2UuCisgIGlmIChnZXRfZnRwX3Jlc3BvbnNlKCJSRVRSIiwgcl9maWxlbmFtZSkgPiBGVFBGSUxFX1NUQVRVU09LQVkpIAorICAgIGNsb3NlX3N0cmVhbSgiUkVUUiIpOworCisgIC8vaWYgbG9jYWwgZmQgaXMgbm90IHN0ZG91dCwgY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yLgorICBpZiAobG9jYWxfZmQgPT0gLTEpIHsKKyAgICBpbnQgZmxhZ3MgPSBPX1dST05MWTsKKworICAgIGZsYWdzIHw9IChUVC5jKT8gT19BUFBFTkQgOiAoT19DUkVBVCB8IE9fVFJVTkMpOworICAgIGxvY2FsX2ZkID0geGNyZWF0ZSgoY2hhciAqKWxfZmlsZW5hbWUsIGZsYWdzLCAwNjY2KTsKKyAgfQorICB0cmFuc2Zlcl9maWxlKGxvY2FsX2ZkLCByZW1vdGVfZmQpOworICB4Y2xvc2UocmVtb3RlX2ZkKTsKKyAgeGNsb3NlKGxvY2FsX2ZkKTsKKyAgaWYgKGdldF9mdHBfcmVzcG9uc2UoTlVMTCwgTlVMTCkgIT0gQ0xPU0VfREFUQUNPTkVDVElPTikgY2xvc2Vfc3RyZWFtKE5VTEwpOworICBnZXRfZnRwX3Jlc3BvbnNlKCJRVUlUIiwgTlVMTCk7CisgIHRveXMuZXhpdHZhbCA9IEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgcHV0X2ZpbGUoY2hhciAqcl9maWxlbmFtZSwgY2hhciAqbF9maWxlbmFtZSkKK3sKKyAgaW50IGxvY2FsX2ZkID0gMCwgcmVtb3RlX2ZkOworICB1bnNpZ25lZCBjbWRfc3RhdHVzID0gMDsKKworICB2ZXJpZnlfcGFzdl9tb2RlKHJfZmlsZW5hbWUpOworICByZW1vdGVfZmQgPSBjb25uZWN0X3RvX3N0cmVhbSgpOyAvL0Nvbm5lY3QgdG8gZGF0YSBzb2NrZXQuCisKKyAgLy9vcGVuIHRoZSBsb2NhbCBmaWxlIGZvciB0cmFuc2Zlci4KKyAgaWYgKChsX2ZpbGVuYW1lWzBdICE9ICctJykgfHwgbF9maWxlbmFtZVsxXSkgCisgICAgbG9jYWxfZmQgPSB4Y3JlYXRlKChjaGFyICopbF9maWxlbmFtZSwgT19SRE9OTFksIDA2NjYpOworCisgIC8vdmVyaWZ5IGZvciB0aGUgcmVtb3RlIGZpbGUgc3RhdHVzLCBPayBvciBPcGVuOiB0cmFuc2ZlciBGaWxlLgorICBjbWRfc3RhdHVzID0gZ2V0X2Z0cF9yZXNwb25zZSgiU1RPUiIsIHJfZmlsZW5hbWUpOworICBpZiAoIChjbWRfc3RhdHVzID09IERBVEFDT05ORUNUSU9OX09QRU5FRCkgfHwgCisgICAgICAoY21kX3N0YXR1cyA9PSBGVFBGSUxFX1NUQVRVU09LQVkpKSB7CisgICAgdHJhbnNmZXJfZmlsZShsb2NhbF9mZCwgcmVtb3RlX2ZkKTsKKyAgICBpZiAoZ2V0X2Z0cF9yZXNwb25zZShOVUxMLCBOVUxMKSAhPSBDTE9TRV9EQVRBQ09ORUNUSU9OKSBjbG9zZV9zdHJlYW0oTlVMTCk7CisgICAgZ2V0X2Z0cF9yZXNwb25zZSgiUVVJVCIsIE5VTEwpOworICAgIHRveXMuZXhpdHZhbCA9IEVYSVRfU1VDQ0VTUzsKKyAgfSBlbHNlIHsKKyAgICB0b3lzLmV4aXR2YWwgPSBFWElUX0ZBSUxVUkU7CisgICAgY2xvc2Vfc3RyZWFtKCJTVE9SIik7CisgIH0KKyAgeGNsb3NlKHJlbW90ZV9mZCk7CisgIHhjbG9zZShsb2NhbF9mZCk7Cit9CisKK3ZvaWQgZnRwZ2V0X21haW4odm9pZCkKK3sKKyAgY2hhciAqKmFyZ3YgPSB0b3lzLm9wdGFyZ3M7IC8vaG9zdCBuYW1lICsgZmlsZSBuYW1lLgorCisgIFRULmlzZ2V0ID0gdG95cy53aGljaC0+bmFtZVszXSA9PSAnZyc7CisgIFRULmMgPSAxOworICAvL2lmIHVzZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLgorICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR191KSAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkpIAorICAgIGVycm9yX2V4aXQoIk1pc3NpbmcgdXNlcm5hbWU6Iik7CisgIC8vaWYgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpcyBub3Qgc3BlY2lmaWVkIGluIGNvbW1hbmQgbGluZS4KKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSkKKyAgICBUVC51c2VybmFtZSA9IFRULnBhc3N3b3JkID0iYW5vbnltb3VzIjsKKworICAvL2lmIGNvbnRpbnVlIGlzIG5vdCBpbiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LgorICBpZiAoVFQuaXNnZXQgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSkgVFQuYyA9IDA7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGluZyB0byAlc1xuIiwgYXJndlswXSk7CisgIGdldF9zb2NrYWRkcihhcmd2WzBdKTsKKworICBUVC5zb2NrZnAgPSB4ZmRvcGVuKGNvbm5lY3RfdG9fc3RyZWFtKCksICJyKyIpOworICBzZW5kX3JlcXVlc3RzKCk7CisKKyAgaWYgKFRULmlzZ2V0KSBnZXRfZmlsZShhcmd2WzFdLCBhcmd2WzJdID8gYXJndlsyXSA6IGFyZ3ZbMV0pOyAKKyAgZWxzZSBwdXRfZmlsZShhcmd2WzFdLCBhcmd2WzJdID8gYXJndlsyXSA6IGFyZ3ZbMV0pOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9nZXRmYXR0ci5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9nZXRmYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWM1M2EKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2dldGZhdHRyLmMKQEAgLTAsMCArMSw5NSBAQAorLyogZ2V0ZmF0dHIuYyAtIFJlYWQgUE9TSVggZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuCisgKgorICogTm8gc3RhbmRhcmQKKworVVNFX0dFVEZBVFRSKE5FV1RPWShnZXRmYXR0ciwgImRobjoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBHRVRGQVRUUgorICBib29sICJnZXRmYXR0ciIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZ2V0ZmF0dHIgWy1kXSBbLWhdIFstbiBOQU1FXSBGSUxFLi4uCisKKyAgICBSZWFkIFBPU0lYIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisKKyAgICAtZAlTaG93IHZhbHVlcyBhcyB3ZWxsIGFzIG5hbWVzLgorICAgIC1oCURvIG5vdCBkZXJlZmVyZW5jZSBzeW1ib2xpYyBsaW5rcy4KKyAgICAtbglTaG93IG9ubHkgYXR0cmlidXRlcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorKi8KKworI2RlZmluZSBGT1JfZ2V0ZmF0dHIKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKm47CispCisKKy8vIFRPRE86IGZhY3RvciBvdXQgdGhlIGxpc3RlciBhbmQgZ2V0dGVyIGxvb3BzIGFuZCB1c2UgdGhlbSBpbiBjcCB0b28uCitzdGF0aWMgdm9pZCBkb19nZXRmYXR0cihjaGFyICpmaWxlKQoreworICBzc2l6ZV90ICgqZ2V0dGVyKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpID0gZ2V0eGF0dHI7CisgIHNzaXplX3QgKCpsaXN0ZXIpKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpID0gbGlzdHhhdHRyOworICBjaGFyICoqc29ydGVkX2tleXM7CisgIHNzaXplX3Qga2V5c19sZW47CisgIGNoYXIgKmtleXMsICprZXk7CisgIGludCBpLCBrZXlfY291bnQ7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19oKSB7CisgICAgZ2V0dGVyID0gbGdldHhhdHRyOworICAgIGxpc3RlciA9IGxsaXN0eGF0dHI7CisgIH0KKworICAvLyBDb2xsZWN0IHRoZSBrZXlzLgorICB3aGlsZSAoKGtleXNfbGVuID0gbGlzdGVyKGZpbGUsIE5VTEwsIDApKSkgeworICAgIGlmIChrZXlzX2xlbiA9PSAtMSkgcGVycm9yX21zZygibGlzdHhhdHRyIGZhaWxlZCIpOworICAgIGtleXMgPSB4bWFsbG9jKGtleXNfbGVuKTsKKyAgICBpZiAobGlzdGVyKGZpbGUsIGtleXMsIGtleXNfbGVuKSA9PSBrZXlzX2xlbikgYnJlYWs7CisgICAgZnJlZShrZXlzKTsKKyAgfQorCisgIGlmIChrZXlzX2xlbiA9PSAwKSByZXR1cm47CisKKyAgLy8gU29ydCB0aGUga2V5cy4KKyAgZm9yIChrZXkgPSBrZXlzLCBrZXlfY291bnQgPSAwOyBrZXkta2V5cyA8IGtleXNfbGVuOyBrZXkgKz0gc3RybGVuKGtleSkrMSkKKyAgICBrZXlfY291bnQrKzsKKyAgc29ydGVkX2tleXMgPSB4bWFsbG9jKGtleV9jb3VudCAqIHNpemVvZihjaGFyICopKTsKKyAgZm9yIChrZXkgPSBrZXlzLCBpID0gMDsga2V5LWtleXMgPCBrZXlzX2xlbjsga2V5ICs9IHN0cmxlbihrZXkpKzEpCisgICAgc29ydGVkX2tleXNbaSsrXSA9IGtleTsKKyAgcXNvcnQoc29ydGVkX2tleXMsIGtleV9jb3VudCwgc2l6ZW9mKGNoYXIgKiksIHFzdHJjbXApOworCisgIHByaW50ZigiIyBmaWxlOiAlc1xuIiwgZmlsZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgaSsrKSB7CisgICAga2V5ID0gc29ydGVkX2tleXNbaV07CisKKyAgICBpZiAoVFQubiAmJiBzdHJjbXAoVFQubiwga2V5KSkgY29udGludWU7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyZGTEFHX2QpIHsKKyAgICAgIHNzaXplX3QgdmFsdWVfbGVuOworICAgICAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgICB3aGlsZSAoKHZhbHVlX2xlbiA9IGdldHRlcihmaWxlLCBrZXksIE5VTEwsIDApKSkgeworICAgICAgICBpZiAodmFsdWVfbGVuID09IC0xKSBwZXJyb3JfbXNnKCJnZXR4YXR0ciBmYWlsZWQiKTsKKyAgICAgICAgdmFsdWUgPSB4emFsbG9jKHZhbHVlX2xlbisxKTsKKyAgICAgICAgaWYgKGdldHRlcihmaWxlLCBrZXksIHZhbHVlLCB2YWx1ZV9sZW4pID09IHZhbHVlX2xlbikgYnJlYWs7CisgICAgICAgIGZyZWUodmFsdWUpOworICAgICAgfQorCisgICAgICBpZiAoIXZhbHVlKSBwdXRzKGtleSk7CisgICAgICBlbHNlIHByaW50ZigiJXM9XCIlc1wiXG4iLCBrZXksIHZhbHVlKTsKKyAgICAgIGZyZWUodmFsdWUpOworICAgIH0gZWxzZSBwdXRzKGtleSk7IC8vIEp1c3QgbGlzdCBuYW1lcy4KKyAgfQorCisgIHhwdXRjKCdcbicpOworICBmcmVlKHNvcnRlZF9rZXlzKTsKK30KKwordm9pZCBnZXRmYXR0cl9tYWluKHZvaWQpCit7CisgIGNoYXIgKipzOworCisgIGZvciAocz10b3lzLm9wdGFyZ3M7ICpzOyBzKyspIGRvX2dldGZhdHRyKCpzKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvZ2V0dHkuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvZ2V0dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQwNGVhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9nZXR0eS5jCkBAIC0wLDAgKzEsMzM2IEBACisvKiBnZXR0eS5jIC0gQSBnZXR0eSBwcm9ncmFtIHRvIGdldCBjb250cm9sbGluZyB0ZXJtaW5hbC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnYW1pbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKworVVNFX0dFVFRZKE5FV1RPWShnZXR0eSwgIjwydCM8MEg6STpsOmY6aXdubUxoIixUT1lGTEFHX1NCSU4pKQorCitjb25maWcgR0VUVFkKKyAgYm9vbCAiZ2V0dHkiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGdldHR5IFtPUFRJT05TXSBCQVVEX1JBVEVbLEJBVURfUkFURV0uLi4gVFRZIFtURVJNVFlQRV0KKworICAgIC1oICAgIEVuYWJsZSBoYXJkd2FyZSBSVFMvQ1RTIGZsb3cgY29udHJvbAorICAgIC1MICAgIFNldCBDTE9DQUwgKGlnbm9yZSBDYXJyaWVyIERldGVjdCBzdGF0ZSkKKyAgICAtbSAgICBHZXQgYmF1ZCByYXRlIGZyb20gbW9kZW0ncyBDT05ORUNUIHN0YXR1cyBtZXNzYWdlCisgICAgLW4gICAgRG9uJ3QgcHJvbXB0IGZvciBsb2dpbiBuYW1lCisgICAgLXcgICAgV2FpdCBmb3IgQ1Igb3IgTEYgYmVmb3JlIHNlbmRpbmcgL2V0Yy9pc3N1ZQorICAgIC1pICAgIERvbid0IGRpc3BsYXkgL2V0Yy9pc3N1ZQorICAgIC1mIElTU1VFX0ZJTEUgIERpc3BsYXkgSVNTVUVfRklMRSBpbnN0ZWFkIG9mIC9ldGMvaXNzdWUKKyAgICAtbCBMT0dJTiAgSW52b2tlIExPR0lOIGluc3RlYWQgb2YgL2Jpbi9sb2dpbgorICAgIC10IFNFQyAgICBUZXJtaW5hdGUgYWZ0ZXIgU0VDIGlmIG5vIGxvZ2luIG5hbWUgaXMgcmVhZAorICAgIC1JIElOSVRTVFIgIFNlbmQgSU5JVFNUUiBiZWZvcmUgYW55dGhpbmcgZWxzZQorICAgIC1IIEhPU1QgICAgTG9nIEhPU1QgaW50byB0aGUgdXRtcCBmaWxlIGFzIHRoZSBob3N0bmFtZQorKi8KKyNkZWZpbmUgRk9SX2dldHR5CisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPHV0bXAuaD4KKworR0xPQkFMUygKKyAgY2hhciAqaXNzdWVfc3RyOworICBjaGFyICpsb2dpbl9zdHI7CisgIGNoYXIgKmluaXRfc3RyOworICBjaGFyICpob3N0X3N0cjsgCisgIGxvbmcgdGltZW91dDsKKyAgCisgIGNoYXIgKnR0eV9uYW1lOyAgCisgIGludCAgc3BlZWRzWzIwXTsKKyAgaW50ICBzYzsgICAgICAgICAgICAgIAorICBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOworICBjaGFyIGJ1ZmZbMTI4XTsKKykKKworI2RlZmluZSBDVEwoeCkgICAgICAgICgoeCkgXiAwMTAwKSAKKyNkZWZpbmUgSE9TVE5BTUVfU0laRSAzMgorCit0eXBlZGVmIHZvaWQgKCpzaWdoYW5kbGVyX3QpKGludCk7CitzdHJ1Y3Qgc3BlZWRfbWFwcGVyIHsKKyAgbG9uZyBzcGVlZDsKKyAgc3BlZWRfdCBjb2RlOworfTsKKworc3RydWN0IHNwZWVkX21hcHBlciBzcGVlZHRhYltdID0geworICB7NTAsIEI1MH0sIHs3NSwgQjc1fSwgezExMCwgQjExMH0sIHsxMzQsIEIxMzR9LCB7MTUwLCBCMTUwfSwgezIwMCwgQjIwMH0sCisgIHszMDAsIEIzMDB9LCB7NjAwLCBCNjAwfSwgezEyMDAsIEIxMjAwfSwgezE4MDAsIEIxODAwfSwgezI0MDAsIEIyNDAwfSwKKyAgezQ4MDAsIEI0ODAwfSwgezk2MDAsIEI5NjAwfSwKKyNpZmRlZiAgQjE5MjAwCisgIHsxOTIwMCwgQjE5MjAwfSwKKyNlbmRpZgorI2lmZGVmICBCMzg0MDAKKyAgezM4NDAwLCBCMzg0MDB9LAorI2VuZGlmCisjaWZkZWYgIEVYVEEKKyAgezE5MjAwLCBFWFRBfSwKKyNlbmRpZgorI2lmZGVmICBFWFRCCisgIHszODQwMCwgQjM4NDAwfSwKKyNlbmRpZgorI2lmZGVmIEI1NzYwMAorICB7NTc2MDAsIEI1NzYwMH0sCisjZW5kaWYKKyNpZmRlZiBCMTE1MjAwCisgIHsxMTUyMDAsIEIxMTUyMDB9LAorI2VuZGlmCisjaWZkZWYgQjIzMDQwMAorICB7MjMwNDAwLCBCMjMwNDAwfSwKKyNlbmRpZgorICB7MCwgMH0sCit9OworCisvLyBGaW5kIHNwZWVkIGZyb20gbWFwcGVyIGFycmF5IAorc3RhdGljIHNwZWVkX3QgZW5jb2RlKGNoYXIgKnMpCit7CisgIHN0cnVjdCBzcGVlZF9tYXBwZXIgKnNwOworICBsb25nIHNwZWVkID0gYXRvbHgocyk7CisKKyAgaWYgKCFzcGVlZCkgcmV0dXJuIDA7CisgIGZvciAoc3AgPSBzcGVlZHRhYjsgc3AtPnNwZWVkOyBzcCsrKSBpZiAoc3AtPnNwZWVkID09IHNwZWVkKSByZXR1cm4gc3AtPmNvZGU7CisgIHJldHVybiAoc3BlZWRfdCkgLTE7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zcGVlZChjaGFyICpzcCkKK3sKKyAgY2hhciAqcHRyOworCisgIFRULnNjID0gMDsKKyAgd2hpbGUgKChwdHIgPSBzdHJzZXAoJnNwLCAiLCIpKSkgeworICAgIFRULnNwZWVkc1tUVC5zY10gPSBlbmNvZGUocHRyKTsKKyAgICBpZiAoVFQuc3BlZWRzW1RULnNjXSA8IDApIHBlcnJvcl9leGl0KCJiYWQgc3BlZWQiKTsKKyAgICBpZiAoKytUVC5zYyA+IDEwKSBwZXJyb3JfZXhpdCgidG9vIG1hbnkgc3BlZWRzLCBtYXggaXMgMTAiKTsKKyAgfQorfQorCisvLyBQYXJzZSBhcmdzIGFuZCBzZXQgVEVSTSBlbnYuIHZhcmlhYmxlCitzdGF0aWMgdm9pZCBwYXJzZV9hcmd1bWVudHModm9pZCkKK3sKKyAgaWYgKGlzZGlnaXQoKip0b3lzLm9wdGFyZ3MpKSB7CisgICAgZ2V0X3NwZWVkKCp0b3lzLm9wdGFyZ3MpOworICAgIGlmICgqKyt0b3lzLm9wdGFyZ3MpIFRULnR0eV9uYW1lID0geG1wcmludGYoIiVzIiwgKnRveXMub3B0YXJncyk7CisgIH0gZWxzZSB7CisgICAgVFQudHR5X25hbWUgPSB4bXByaW50ZigiJXMiLCAqdG95cy5vcHRhcmdzKTsKKyAgICBpZiAoKisrdG95cy5vcHRhcmdzKSBnZXRfc3BlZWQoKnRveXMub3B0YXJncyk7CisgIH0gCisgIGlmICgqKyt0b3lzLm9wdGFyZ3MpIHNldGVudigiVEVSTSIsICp0b3lzLm9wdGFyZ3MsIDEpOworfQorCisvLyBHZXQgY29udHJvbGxpbmcgdGVybWluYWwgYW5kIHJlZGlyZWN0IHN0ZGlvIAorc3RhdGljIHZvaWQgb3Blbl90dHkodm9pZCkKK3sKKyAgaWYgKHN0cmNtcChUVC50dHlfbmFtZSwgIi0iKSkgeworICAgIGlmICgqKFRULnR0eV9uYW1lKSAhPSAnLycpIFRULnR0eV9uYW1lID0geG1wcmludGYoIi9kZXYvJXMiLCBUVC50dHlfbmFtZSk7CisgICAgLy8gU2VuZHMgU0lHSFVQIHRvIGFsbCBmb3JlZ3JvdW5kIHByb2Nlc3MgaWYgU2Vzc2lvbiBsZWFkZXIgZG9uJ3QgZGllLElnbm9yZQorICAgIHNpZ2hhbmRsZXJfdCBzaWcgPSBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsgCisgICAgaW9jdGwoMCwgVElPQ05PVFRZLCAwKTsgLy8gR2l2ZXVwIGlmIHRoZXJlIGlzIGFueSBjb250cm9sbGluZyB0ZXJtaW5hbAorICAgIHNpZ25hbChTSUdIVVAsIHNpZyk7CisgICAgaWYgKChzZXRzaWQoKSA8IDApICYmIChnZXRwaWQoKSAhPSBnZXRzaWQoMCkpKSAKKyAgICAgIHBlcnJvcl9leGl0KCJzZXRzaWQiKTsKKyAgICB4Y2xvc2UoMCk7CisgICAgeG9wZW5fc3RkaW8oVFQudHR5X25hbWUsIE9fUkRXUnxPX05ERUxBWXxPX0NMT0VYRUMpOworICAgIGZjbnRsKDAsIEZfU0VURkwsIGZjbnRsKDAsIEZfR0VURkwpICYgfk9fTk9OQkxPQ0spOyAvLyBCbG9jayByZWFkCisgICAgZHVwMigwLCAxKTsKKyAgICBkdXAyKDAsIDIpOworICAgIGlmIChpb2N0bCgwLCBUSU9DU0NUVFksIDEpIDwgMCkgcGVycm9yX21zZygiaW9jdGwoVElPQ1NDVFRZKSIpOworICAgIGlmICghaXNhdHR5KDApKSBwZXJyb3JfZXhpdCgiL2Rldi8lczogbm90IGEgdHR5IiwgVFQudHR5X25hbWUpOworICAgIGNob3duKFRULnR0eV9uYW1lLCAwLCAwKTsgLy8gY2hhbmdlIG93bmVyc2hpcCwgSG9wZSBsb2dpbiB3aWxsIGNoYW5nZSB0aGlzCisgICAgY2htb2QoVFQudHR5X25hbWUsIDA2MjApOworICB9IGVsc2UgeyAvLyBXZSBhbHJlYWR5IGhhdmUgb3BlbmVkIFRUWQorICAgIGlmIChzZXRzaWQoKSA8IDApIHBlcnJvcl9tc2coInNldHNpZCBmYWlsZWQiKTsKKyAgICBpZiAoKGZjbnRsKDAsIEZfR0VURkwpICYgKE9fUkRXUnxPX1JET05MWXxPX1dST05MWSkpICE9IE9fUkRXUikKKyAgICAgIHBlcnJvcl9leGl0KCJubyByZWFkL3dyaXRlIHBlcm1pc3Npb24iKTsKKyAgfQorfQorCisvLyBJbnRpYWxpc2UgdGVybWluYWwgc2V0dGluZ3MKK3N0YXRpYyB2b2lkIHRlcm1pb3NfaW5pdCh2b2lkKQoreworICBpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJlRULnRlcm1pb3MpIDwgMCkgcGVycm9yX2V4aXQoInRjZ2V0YXR0ciIpOworICAvLyBGbHVzaCBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcywgaW1wb3J0YW50IGZvciBtb2RlbXMhCisgIHRjZmx1c2goU1RESU5fRklMRU5PLCBUQ0lPRkxVU0gpOyAKKyAgVFQudGVybWlvcy5jX2NmbGFnICY9ICgwfENTVE9QQnxQQVJFTkJ8UEFST0REKTsKKyNpZmRlZiBDUlRTQ1RTCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSBUVC50ZXJtaW9zLmNfY2ZsYWcgfD0gQ1JUU0NUUzsKKyNlbmRpZgorICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfTCkgVFQudGVybWlvcy5jX2NmbGFnIHw9IENMT0NBTDsKKyAgVFQudGVybWlvcy5jX2NjW1ZUSU1FXSA9IDA7CisgIFRULnRlcm1pb3MuY19jY1tWTUlOXSA9IDE7CisgIFRULnRlcm1pb3MuY19vZmxhZyA9IE9QT1NUfE9OTENSOworICBUVC50ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M4fENSRUFEfEhVUENMfENCQVVERVg7CisgIC8vIGxvZ2luIHdpbGwgZGlzYWJsZSBlY2hvIGZvciBwYXNzd2QuCisgIFRULnRlcm1pb3MuY19sZmxhZyB8PSBJU0lHfElDQU5PTnxFQ0hPfEVDSE9FfEVDSE9LfEVDSE9LRTsKKyAgVFQudGVybWlvcy5jX2NjW1ZJTlRSXSA9IENUTCgnQycpOworICBUVC50ZXJtaW9zLmNfY2NbVlFVSVRdID0gQ1RMKCdcXCcpOworICBUVC50ZXJtaW9zLmNfY2NbVkVPRl0gPSBDVEwoJ0QnKTsKKyAgVFQudGVybWlvcy5jX2NjW1ZFT0xdID0gJ1xuJzsKKyAgVFQudGVybWlvcy5jX2NjW1ZLSUxMXSA9IENUTCgnVScpOworICBUVC50ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IDEyNzsgLy8gQ0VSQVNFCisgIFRULnRlcm1pb3MuY19pZmxhZyA9IElDUk5MfElYT058SVhPRkY7CisgIC8vIHNldCBub24temVybyBiYXVkIHJhdGUuIFplcm8gYmF1ZCByYXRlIGxlZnQgaXQgdW5jaGFuZ2VkLgorICBpZiAoVFQuc3BlZWRzWzBdICE9IEIwKSBjZnNldHNwZWVkKCZUVC50ZXJtaW9zLCBUVC5zcGVlZHNbMF0pOyAKKyAgaWYgKHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZUVC50ZXJtaW9zKSA8IDApIAorICAgIHBlcnJvcl9leGl0KCJ0Y3NldGF0dHIiKTsKK30KKworLy8gR2V0IHRoZSBiYXVkIHJhdGUgZnJvbSBtb2RlbXMgQ09OTkVDVCBtZXNhZ2UsIEl0cyBvZiBmb3JtIDxqdW5rPjxCQVVEPjxKdW5rPgorc3RhdGljIHZvaWQgc2Vuc2VfYmF1ZCh2b2lkKQoreworICBpbnQgdm1pbjsKKyAgc3NpemVfdCBzaXplOworICBjaGFyICpwdHI7CisgIHNwZWVkX3Qgc3BlZWQ7CisKKyAgdm1pbiA9IFRULnRlcm1pb3MuY19jY1tWTUlOXTsgLy8gU3RvcmUgb2xkCisgIFRULnRlcm1pb3MuY19jY1tWTUlOXSA9IDA7IC8vIE5vIGJsb2NrIGV2ZW4gcXVldWUgaXMgZW1wdHkuCisgIGlmICh0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBTk9XLCAmVFQudGVybWlvcykgPCAwKSAKKyAgICBwZXJyb3JfZXhpdCgidGNzZXRhdHRyIik7CisgIHNpemUgPSByZWFkYWxsKFNURElOX0ZJTEVOTywgVFQuYnVmZiwgc2l6ZW9mKFRULmJ1ZmYpLTEpOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBmb3IgKHB0ciA9IFRULmJ1ZmY7IHB0ciA8IFRULmJ1ZmYrc2l6ZTsgcHRyKyspIHsKKyAgICAgIGlmIChpc2RpZ2l0KCpwdHIpKSB7CisgICAgICAgIHNwZWVkID0gZW5jb2RlKHB0cik7CisgICAgICAgIGlmIChzcGVlZCA+IDApIGNmc2V0c3BlZWQoJlRULnRlcm1pb3Msc3BlZWQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IAorICB9CisgIFRULnRlcm1pb3MuY19jY1tWTUlOXSA9IHZtaW47IC8vcmVzdG9yZSBvbGQgdmFsdWUKKyAgaWYgKHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZUVC50ZXJtaW9zKSA8IDApCisgICAgcGVycm9yX2V4aXQoInRjc2V0YXR0ciIpOworfQorCisvLyBKdXN0IHByb21wdCBmb3IgbG9naW4gbmFtZSAKK3ZvaWQgcHJpbnRfcHJvbXB0KHZvaWQpCit7CisgIGNoYXIgKmhvc3RuYW1lOworICBzdHJ1Y3QgdXRzbmFtZSB1dHM7CisKKyAgdW5hbWUoJnV0cyk7CisgIGhvc3RuYW1lID0geHN0cmR1cCh1dHMubm9kZW5hbWUpOworICBmcHV0cyhob3N0bmFtZSwgc3Rkb3V0KTsKKyAgZnB1dHMoIiBsb2dpbjogIiwgc3Rkb3V0KTsKKyAgZmZsdXNoKE5VTEwpOworICBmcmVlKGhvc3RuYW1lKTsKKyAgaG9zdG5hbWUgPSBOVUxMOworfQorCisvLyBQcmludCAvZXRjL2lzdXVlIHdpdGggdGFraW5nIGNhcmUgb2YgZWFjaCBlc2NhcGUgc2VxdWVuY2UKK3ZvaWQgd3JpdGVfaXNzdWUoY2hhciAqZmlsZSkKK3sKKyAgY2hhciBidWZmWzIwXSA9IHswLH07CisgIHN0cnVjdCB1dHNuYW1lIHU7CisgIHVuYW1lKCZ1KTsKKyAgaW50IHNpemUsIGZkID0gb3BlbihUVC5pc3N1ZV9zdHIsIE9fUkRPTkxZKTsKKworICBpZiAoZmQgPCAwKSByZXR1cm47CisgIHdoaWxlICgoc2l6ZSA9IHJlYWRhbGwoZmQsIGJ1ZmYsIDEpKSA+IDApIHsKKyAgICBjaGFyICpjaCA9IGJ1ZmY7CisKKyAgICBpZiAoKmNoID09ICdcXCcgfHwgKmNoID09ICclJykgeworICAgICAgaWYgKHJlYWRhbGwoZmQsIGJ1ZmYsIDEpIDw9IDApIHBlcnJvcl9leGl0KCJyZWFkYWxsIik7CisgICAgICBpZiAoKmNoID09ICdzJykgZnB1dHModS5zeXNuYW1lLCBzdGRvdXQpOworICAgICAgaWYgKCpjaCA9PSAnbid8fCAqY2ggPT0gJ2gnKSBmcHV0cyh1Lm5vZGVuYW1lLCBzdGRvdXQpOworICAgICAgaWYgKCpjaCA9PSAncicpIGZwdXRzKHUucmVsZWFzZSwgc3Rkb3V0KTsKKyAgICAgIGlmICgqY2ggPT0gJ20nKSBmcHV0cyh1Lm1hY2hpbmUsIHN0ZG91dCk7CisgICAgICBpZiAoKmNoID09ICdsJykgZnB1dHMoVFQudHR5X25hbWUsIHN0ZG91dCk7CisgICAgfSBlbHNlIHhwdXRjKCpjaCk7CisgIH0KK30KKworLy8gUmVhZCBsb2dpbiBuYW1lIGFuZCBwcmludCBwcm9tcHQgYW5kIElzc3VlIGZpbGUuIAorc3RhdGljIGludCByZWFkX2xvZ2luX25hbWUodm9pZCkKK3sKKyAgdGNmbHVzaChTVERJTl9GSUxFTk8sIFRDSUZMVVNIKTsgLy8gRmx1c2ggcGVuZGluZyBzcGVlZCBzd2l0Y2hlcworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKDEpIHsgLy8gT3B0aW9uIC1pIHdpbGwgb3ZlcmlkZSAtZgorICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpKSB3cml0ZV9pc3N1ZShUVC5pc3N1ZV9zdHIpOyAKKyAgICBwcmludF9wcm9tcHQoKTsKKyAgICBUVC5idWZmWzBdID0gZ2V0Y2hhcigpOworICAgIGlmICghVFQuYnVmZlswXSAmJiBUVC5zYyA+IDEpIHJldHVybiAwOyAvLyBTd2l0Y2ggc3BlZWQKKyAgICBpZiAoVFQuYnVmZlswXSA9PSAnXG4nKSBjb250aW51ZTsKKyAgICBpZiAoVFQuYnVmZlswXSAhPSAnXG4nKQorICAgICAgaWYgKCFmZ2V0cygmVFQuYnVmZlsxXSwgSE9TVE5BTUVfU0laRS0xLCBzdGRpbikpIF9leGl0KDEpOworICAgIHdoaWxlIChpIDwgSE9TVE5BTUVfU0laRS0xICYmIGlzZ3JhcGgoVFQuYnVmZltpXSkpIGkrKzsKKyAgICBUVC5idWZmW2ldID0gMDsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUHV0IGhvc3RuYW1lIGVudHJ5IGluIHV0bXAgZmlsZQorc3RhdGljIHZvaWQgdXRtcF9lbnRyeSh2b2lkKQoreworICBzdHJ1Y3QgdXRtcCBlbnRyeTsKKyAgc3RydWN0IHV0bXAgKnV0cF9wdHI7CisgIHBpZF90IHBpZCA9IGdldHBpZCgpOworICBjaGFyICp1dG1wZXJyID0gImNhbid0IG1ha2UgdXRtcCBlbnRyeSwgaG9zdCBsZW5ndGggZ3JlYXRlciB0aGFuIFVUX0hPU1RTSVpFKDI1NikiOworCisgIHV0bXBuYW1lKF9QQVRIX1VUTVApOworICBzZXR1dGVudCgpOyAvLyBTdGFydHMgZnJvbSBzdGFydAorICB3aGlsZSAoKHV0cF9wdHIgPSBnZXR1dGVudCgpKSkgCisgICAgaWYgKHV0cF9wdHItPnV0X3BpZCA9PSBwaWQgJiYgdXRwX3B0ci0+dXRfdHlwZSA+PSBJTklUX1BST0NFU1MpIGJyZWFrOworICBpZiAoIXV0cF9wdHIpIHsgCisgICAgZW50cnkudXRfdHlwZSA9IExPR0lOX1BST0NFU1M7CisgICAgZW50cnkudXRfcGlkID0gZ2V0cGlkKCk7CisgICAgeHN0cm5jcHkoZW50cnkudXRfbGluZSwgdHR5bmFtZShTVERJTl9GSUxFTk8pICsgCisgICAgICAgIHN0cmxlbigiL2Rldi8iKSwgVVRfTElORVNJWkUpOworICAgIHRpbWUoKHRpbWVfdCAqKSZlbnRyeS51dF90aW1lKTsKKyAgICB4c3RybmNweShlbnRyeS51dF91c2VyLCAiTE9HSU4iLCBVVF9OQU1FU0laRSk7CisgICAgaWYgKHN0cmxlbihUVC5ob3N0X3N0cikgPiBVVF9IT1NUU0laRSkgCisgICAgICBwZXJyb3JfbXNnKHV0bXBlcnIpOworICAgIGVsc2UgeHN0cm5jcHkoZW50cnkudXRfaG9zdCwgVFQuaG9zdF9zdHIsIFVUX0hPU1RTSVpFKTsKKyAgICBzZXR1dGVudCgpOworICAgIHB1dHV0bGluZSgmZW50cnkpOworICAgIHJldHVybjsKKyAgfQorICB4c3RybmNweShlbnRyeS51dF9saW5lLCB0dHluYW1lKFNURElOX0ZJTEVOTykgKyBzdHJsZW4oIi9kZXYvIiksIFVUX0xJTkVTSVpFKTsKKyAgeHN0cm5jcHkoZW50cnkudXRfdXNlciwgIkxPR0lOIiwgVVRfTkFNRVNJWkUpOworICBpZiAoc3RybGVuKFRULmhvc3Rfc3RyKSA+IFVUX0hPU1RTSVpFKSAKKyAgICBwZXJyb3JfbXNnKHV0bXBlcnIpOworICBlbHNlIHhzdHJuY3B5KGVudHJ5LnV0X2hvc3QsIFRULmhvc3Rfc3RyLCBVVF9IT1NUU0laRSk7CisgIHRpbWUoKHRpbWVfdCAqKSZlbnRyeS51dF90aW1lKTsKKyAgc2V0dXRlbnQoKTsKKyAgcHV0dXRsaW5lKCZlbnRyeSk7Cit9CisKK3ZvaWQgZ2V0dHlfbWFpbih2b2lkKQoreworICBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKyAgY2hhciAqcHRyWzNdID0geyIvYmluL2xvZ2luIiwgTlVMTCwgTlVMTH07IC8vMiBOVUxMcyBzbyB3ZSBjYW4gYWRkIHVzZXJuYW1lCisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZikpIFRULmlzc3VlX3N0ciA9ICIvZXRjL2lzc3VlIjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHB0clswXSA9IFRULmxvZ2luX3N0cjsKKyAgcGFyc2VfYXJndW1lbnRzKCk7CisgIG9wZW5fdHR5KCk7CisgIHRlcm1pb3NfaW5pdCgpOworICB0Y3NldHBncnAoU1RESU5fRklMRU5PLCBwaWQpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfSCkgdXRtcF9lbnRyeSgpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfSSkgCisgICAgd3JpdGVhbGwoU1RET1VUX0ZJTEVOTyxUVC5pbml0X3N0cixzdHJsZW4oVFQuaW5pdF9zdHIpKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX20pIHNlbnNlX2JhdWQoKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3QpIGFsYXJtKFRULnRpbWVvdXQpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdykgeworICAgIGNoYXIgY2g7CisKKyAgICB3aGlsZSAocmVhZGFsbChTVERJTl9GSUxFTk8sICZjaCwgMSkgIT0gMSkgIAorICAgICAgaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJykgYnJlYWs7CisgIH0KKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbikpIHsKKyAgICBpbnQgaW5kZXggPSAxOyAvLyAwdGggd2UgYWxyZWFkeSBzZXQuCisKKyAgICB3aGlsZSAoMSkgeworICAgICAgaW50IGwgPSByZWFkX2xvZ2luX25hbWUoKTsKKworICAgICAgaWYgKGwpIGJyZWFrOworICAgICAgaW5kZXggPSBpbmRleCAlIFRULnNjOworICAgICAgY2ZzZXRzcGVlZCgmVFQudGVybWlvcywgVFQuc3BlZWRzW2luZGV4XSk7IC8vIFNlbGVjdCBmcm9tIG11bHRpcGxlIHNwZWVkcworICAgICAgLy9OZWNlc3NhcnkgYWZ0ZXIgY2ZzZXRzcGVlZAorICAgICAgaWYgKHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZUVC50ZXJtaW9zKSA8IDApIAorICAgICAgICBwZXJyb3JfZXhpdCgidGNzZXRhdHRyIik7IAorICAgIH0KKyAgICBwdHJbMV09VFQuYnVmZjsgLy9wdXQgdGhlIHVzZXJuYW1lIGluIHRoZSBsb2dpbiBjb21tYW5kIGxpbmUKKyAgfQorICB4ZXhlYyhwdHIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9ncm91cGFkZC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9ncm91cGFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDY4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2dyb3VwYWRkLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIGdyb3VwYWRkLmMgLSBjcmVhdGUgYSBuZXcgZ3JvdXAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL2dyb3VwYWRkLmh0bWwKKworVVNFX0dST1VQQUREKE5FV1RPWShncm91cGFkZCwgIjwxPjJnIzwwUyIsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19TQklOKSkKK1VTRV9HUk9VUEFERChPTERUT1koYWRkZ3JvdXAsIGdyb3VwYWRkLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBHUk9VUEFERAorICBib29sICJncm91cGFkZCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogZ3JvdXBhZGQgWy1TXSBbLWcgR0lEXSBbVVNFUl0gR1JPVVAKKworICAgIEFkZCBhIGdyb3VwIG9yIGFkZCBhIHVzZXIgdG8gYSBncm91cAorICAgIAorICAgICAgLWcgR0lEIEdyb3VwIGlkCisgICAgICAtUyAgICAgQ3JlYXRlIGEgc3lzdGVtIGdyb3VwCisqLworCisjZGVmaW5lIEZPUl9ncm91cGFkZAorI2luY2x1ZGUgInRveXMuaCIKKworI2RlZmluZSBHUk9VUF9QQVRIICAgICAgICAiL2V0Yy9ncm91cCIKKyNkZWZpbmUgU0VDVVJFX0dST1VQX1BBVEggIi9ldGMvZ3NoYWRvdyIKKworR0xPQkFMUygKKyAgbG9uZyBnaWQ7CispCisKKy8qIEFkZCBhIG5ldyBncm91cCB0byB0aGUgc3lzdGVtLCBpZiBHSUQgaXMgZ2l2ZW4gdGhlbiB0aGF0IGlzIHZhbGlkYXRlZAorICogdG8gYmUgZnJlZSwgZWxzZSBhIGZyZWUgR0lEIGlzIGNob29zZW4gYnkgc2VsZi4KKyAqIFNZU1RFTSBJRHMgYXJlIGNvbnNpZGVyZWQgaW4gdGhlIHJhbmdlIDEwMCAuLi4gOTk5CisgKiB1cGRhdGVfZ3JvdXAoKSwgdXBkYXRlcyB0aGUgZW50cmllcyBpbiAvZXRjL2dyb3VwLCAvZXRjL2dzaGFkb3cgZmlsZXMKKyAqLworc3RhdGljIHZvaWQgbmV3X2dyb3VwKCkKK3sKKyAgY2hhciAqZW50cnkgPSBOVUxMOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19nKSB7CisgICAgaWYgKFRULmdpZCA+IElOVF9NQVgpIGVycm9yX2V4aXQoImdpZCBzaG91bGQgYmUgbGVzcyB0aGFuICAnJWQnICIsIElOVF9NQVgpOworICAgIGlmIChnZXRncmdpZChUVC5naWQpKSBlcnJvcl9leGl0KCJncm91cCAnJWxkJyBpcyBpbiB1c2UiLCBUVC5naWQpOworICB9IGVsc2UgeworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19TKSBUVC5naWQgPSBDRkdfVE9ZQk9YX1VJRF9TWVM7CisgICAgZWxzZSBUVC5naWQgPSBDRkdfVE9ZQk9YX1VJRF9VU1I7CisgICAgLy9maW5kIHVudXNlZCBnaWQKKyAgICB3aGlsZSAoZ2V0Z3JnaWQoVFQuZ2lkKSkgVFQuZ2lkKys7CisgIH0KKworICBlbnRyeSA9IHhtcHJpbnRmKCIlczolczolZDoiLCAqdG95cy5vcHRhcmdzLCAieCIsIFRULmdpZCk7CisgIHVwZGF0ZV9wYXNzd29yZChHUk9VUF9QQVRILCAqdG95cy5vcHRhcmdzLCBlbnRyeSk7CisgIGZyZWUoZW50cnkpOworICBlbnRyeSA9IHhtcHJpbnRmKCIlczolczo6IiwgKnRveXMub3B0YXJncywgIiEiKTsKKyAgdXBkYXRlX3Bhc3N3b3JkKFNFQ1VSRV9HUk9VUF9QQVRILCAqdG95cy5vcHRhcmdzLCBlbnRyeSk7CisgIGZyZWUoZW50cnkpOworfQorCit2b2lkIGdyb3VwYWRkX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGdyb3VwICpncnAgPSBOVUxMOworICBjaGFyICplbnRyeSA9IE5VTEw7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiYgdG95cy5vcHRjID09IDIpCisgICAgaGVscF9leGl0KCJvcHRpb25zLCB1c2VyIGFuZCBncm91cCBjYW4ndCBiZSB0b2dldGhlciIpOworCisgIGlmICh0b3lzLm9wdGMgPT0gMikgeyAgLy9hZGQgdXNlciB0byBncm91cAorICAgIC8vdG95cy5vcHRhcmdzWzBdLSB1c2VyLCB0b3lzLm9wdGFyZ3NbMV0gLSBncm91cAorICAgIHhnZXRwd25hbSgqdG95cy5vcHRhcmdzKTsKKyAgICBpZiAoIShncnAgPSBnZXRncm5hbSh0b3lzLm9wdGFyZ3NbMV0pKSkgCisgICAgICBlcnJvcl9leGl0KCJncm91cCAnJXMnIGRvZXMgbm90IGV4aXN0IiwgdG95cy5vcHRhcmdzWzFdKTsKKyAgICBpZiAoIWdycC0+Z3JfbWVtKSBlbnRyeSA9IHhtcHJpbnRmKCIlcyIsICp0b3lzLm9wdGFyZ3MpOworICAgIGVsc2UgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGdycC0+Z3JfbWVtW2ldOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKGdycC0+Z3JfbWVtW2ldLCAqdG95cy5vcHRhcmdzKSkgcmV0dXJuOworCisgICAgICBlbnRyeSA9IHhzdHJkdXAoIiIpOworICAgICAgZm9yIChpPTA7IGdycC0+Z3JfbWVtW2ldOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSB4cmVhbGxvYyhlbnRyeSwgc3RybGVuKGVudHJ5KSArIHN0cmxlbihncnAtPmdyX21lbVtpXSkgKyAyKTsKKyAgICAgICAgc3RyY2F0KGVudHJ5LCBncnAtPmdyX21lbVtpXSk7CisgICAgICAgIHN0cmNhdChlbnRyeSwgIiwiKTsKKyAgICAgIH0KKyAgICAgIGVudHJ5ID0geHJlYWxsb2MoZW50cnksIHN0cmxlbihlbnRyeSkgKyBzdHJsZW4oKnRveXMub3B0YXJncykgKyAxKTsKKyAgICAgIHN0cmNhdChlbnRyeSwgKnRveXMub3B0YXJncyk7CisgICAgfQorICAgIHVwZGF0ZV9wYXNzd29yZChHUk9VUF9QQVRILCBncnAtPmdyX25hbWUsIGVudHJ5KTsKKyAgICB1cGRhdGVfcGFzc3dvcmQoU0VDVVJFX0dST1VQX1BBVEgsIGdycC0+Z3JfbmFtZSwgZW50cnkpOworICAgIGZyZWUoZW50cnkpOworICB9IGVsc2UgeyAgICAvL25ldyBncm91cCB0byBiZSBjcmVhdGVkCisgICAgY2hhciAqcyA9ICp0b3lzLm9wdGFyZ3M7CisKKyAgICAvKiBpbnZlc3RpZ2F0ZSB0aGUgZ3JvdXAgdG8gYmUgY3JlYXRlZCAqLworICAgIGlmIChnZXRncm5hbShzKSkgZXJyb3JfZXhpdCgiJyVzJyBpbiB1c2UiLCBzKTsKKyAgICBpZiAoc1tzdHJjc3BuKHMsICI6L1xuIildIHx8IHN0cmxlbihzKSA+IExPR0lOX05BTUVfTUFYKQorICAgICAgZXJyb3JfZXhpdCgiYmFkIG5hbWUiKTsKKyAgICBuZXdfZ3JvdXAoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9ncm91cGRlbC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9ncm91cGRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2FjNTkKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2dyb3VwZGVsLmMKQEAgLTAsMCArMSw2MSBAQAorLyogZ3JvdXBkZWwuYyAtIGRlbGV0ZSBhIGdyb3VwCisgKgorICogQ29weXJpZ2h0IDIwMTMgQXNod2luaSBLdW1hciA8YWsuYXNod2luaTE5ODFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvZ3JvdXBkZWwuaHRtbAorCitVU0VfR1JPVVBERUwoTkVXVE9ZKGdyb3VwZGVsLCAiPDE+MiIsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19TQklOKSkKK1VTRV9HUk9VUERFTChPTERUT1koZGVsZ3JvdXAsIGdyb3VwZGVsLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCisKK2NvbmZpZyBHUk9VUERFTAorICBib29sICJncm91cGRlbCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogZ3JvdXBkZWwgW1VTRVJdIEdST1VQCisKKyAgICBEZWxldGUgYSBncm91cCBvciByZW1vdmUgYSB1c2VyIGZyb20gYSBncm91cAorKi8KKworI2RlZmluZSBGT1JfZ3JvdXBkZWwKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgZ3JvdXBkZWxfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgZ3JvdXAgKmdycCA9IHhnZXRncm5hbSh0b3lzLm9wdGFyZ3NbdG95cy5vcHRjLTFdKTsKKyAgY2hhciAqZW50cnkgPSAwOworCisgIC8vIGRlbGV0ZSB1c2VyIGZyb20gZ3JvdXAKKyAgaWYgKHRveXMub3B0YyA9PSAyKSB7CisgICAgaW50IGksIGxlbiA9IDAsIGZvdW5kID0gMDsKKyAgICBjaGFyICpzOworCisgICAgeGdldHB3bmFtKCp0b3lzLm9wdGFyZ3MpOworICAgIGlmIChncnAtPmdyX21lbSkgZm9yIChpID0gMDsgZ3JwLT5ncl9tZW1baV07IGkrKykgeworICAgICAgaWYgKCFmb3VuZCAmJiAhc3RyY21wKCp0b3lzLm9wdGFyZ3MsIGdycC0+Z3JfbWVtW2ldKSkgZm91bmQrKzsKKyAgICAgIGVsc2UgbGVuICs9IHN0cmxlbihncnAtPmdyX21lbVtpXSkgKyAxOworICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgZXJyb3JfZXhpdCgidXNlciAnJXMnIG5vdCBpbiBncm91cCAnJXMnIiwgKnRveXMub3B0YXJncywgdG95cy5vcHRhcmdzWzFdKTsKKworICAgIGVudHJ5ID0gcyA9IHhtYWxsb2MobGVuKTsKKyAgICBmb3IgKGkgPSAwOyBncnAtPmdyX21lbVtpXTsgKSB7CisgICAgICBpZiAoaSkgKihzKyspID0gJywnOworICAgICAgcyA9IHN0cGNweShzLCBncnAtPmdyX21lbVtpXSk7CisgICAgfQorCisgIC8vIGRlbGV0ZSBncm91cAorICB9IGVsc2UgeworICAgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgICAgZm9yIChlbmRwd2VudCgpOyAocHcgPSBnZXRwd2VudCgpKTspCisgICAgICBpZiAocHctPnB3X2dpZCA9PSBncnAtPmdyX2dpZCkgYnJlYWs7CisKKyAgICBpZiAocHcpIGVycm9yX2V4aXQoImNhbid0IHJlbW92ZSBwcmltYXJ5IGdyb3VwIG9mIHVzZXIgJyVzJyIsIHB3LT5wd19uYW1lKTsKKyAgICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBlbmRwd2VudCgpOworICB9CisKKyAgdXBkYXRlX3Bhc3N3b3JkKCIvZXRjL2dyb3VwIiwgZ3JwLT5ncl9uYW1lLCBlbnRyeSk7CisgIHVwZGF0ZV9wYXNzd29yZCgiL2V0Yy9nc2hhZG93IiwgZ3JwLT5ncl9uYW1lLCBlbnRyeSk7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoZW50cnkpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9ob3N0LmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2hvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlMWQzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9ob3N0LmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qIGhvc3QuYyAtIEROUyBsb29rdXAgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAyMDE0IFJpY2ggRmVsa2VyIDxkYWxpYXNAYWVyaWZhbC5jeD4KKyAqCisgKiBObyBzdGFuZGFyZCwgYnV0IHRoZXJlJ3MgYSB2ZXJzaW9uIGluIGJpbmQ5CisKK1VTRV9IT1NUKE5FV1RPWShob3N0LCAiPDE+MmF2dDoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBIT1NUCisgIGJvb2wgImhvc3QiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGhvc3QgWy1hdl0gWy10IFRZUEVdIE5BTUUgW1NFUlZFUl0KKworICAgIFBlcmZvcm0gRE5TIGxvb2t1cCBvbiBOQU1FLCB3aGljaCBjYW4gYmUgYSBkb21haW4gbmFtZSB0byBsb29rdXAsCisgICAgb3IgYW4gaXB2NCBkb3R0ZWQgb3IgaXB2NiBjb2xvbiBzZXByYXRlZCBhZGRyZXNzIHRvIHJldmVyc2UgbG9va3VwLgorICAgIFNFUlZFUiAoaWYgcHJlc2VudCkgaXMgdGhlIEROUyBzZXJ2ZXIgdG8gdXNlLgorCisgICAgLWEJbm8gaWRlYQorICAgIC10CW5vdCBhIGNsdWUKKyAgICAtdgl2ZXJib3NlCisqLworCisjZGVmaW5lIEZPUl9ob3N0CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICp0eXBlX3N0cjsKKykKKworI2luY2x1ZGUgPHJlc29sdi5oPgorCisjZGVmaW5lIFBMX0lQIDEKKyNkZWZpbmUgUExfTkFNRSAyCisjZGVmaW5lIFBMX0RBVEEgMworI2RlZmluZSBQTF9URVhUIDQKKyNkZWZpbmUgUExfU09BIDUKKyNkZWZpbmUgUExfTVggNgorI2RlZmluZSBQTF9TUlYgNworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJydCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKm1zZzsKKyAgaW50IHBsOworICBpbnQgYWY7Cit9IHJydFtdID0geworICBbMV0gPSB7ICJBIiwgImhhcyBhZGRyZXNzIiwgUExfSVAsIEFGX0lORVQgfSwKKyAgWzI4XSA9IHsgIkFBQUEiLCAiaGFzIGFkZHJlc3MiLCBQTF9JUCwgQUZfSU5FVDYgfSwKKyAgWzJdID0geyAiTlMiLCAibmFtZSBzZXJ2ZXIiLCBQTF9OQU1FIH0sCisgIFs1XSA9IHsgIkNOQU1FIiwgImlzIGEgbmlja25hbWUgZm9yIiwgUExfTkFNRSB9LAorICBbMTZdID0geyAiVFhUIiwgImRlc2NyaXB0aXZlIHRleHQiLCBQTF9URVhUIH0sCisgIFs2XSA9IHsgIlNPQSIsICJzdGFydCBvZiBhdXRob3JpdHkiLCBQTF9TT0EgfSwKKyAgWzEyXSA9IHsgIlBUUiIsICJkb21haW4gbmFtZSBwb2ludGVyIiwgUExfTkFNRSB9LAorICBbMTVdID0geyAiTVgiLCAibWFpbCBpcyBoYW5kbGVkIiwgUExfTVggfSwKKyAgWzMzXSA9IHsgIlNSViIsICJtYWlsIGlzIGhhbmRsZWQiLCBQTF9TUlYgfSwKKyAgWzI1NV0gPSB7ICIqIiwgMCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmN0WzE2XVszMl0gPSB7CisgICJTdWNjZXNzIiwKKyAgIkZvcm1hdCBlcnJvciIsCisgICJTZXJ2ZXIgZmFpbHVyZSIsCisgICJOb24tZXhpc3RhbnQgZG9tYWluIiwKKyAgIk5vdCBpbXBsZW1lbnRlZCIsCisgICJSZWZ1c2VkIiwKK307CisKK3ZvaWQgaG9zdF9tYWluKHZvaWQpCit7CisgIGludCB2ZXJib3NlPSh0b3lzLm9wdGZsYWdzICYgKEZMQUdfYXxGTEFHX3YpKSwgdHlwZSwKKyAgICAgIGksIGosIHJldCwgc2VjLCBjb3VudCwgcmNvZGUsIHFsZW4sIGFsZW4sIHBsbGVuID0gMDsKKyAgdW5zaWduZWQgdHRsLCBwcmksIHZbNV07CisgIHVuc2lnbmVkIGNoYXIgcWJ1ZlsyODBdLCBhYnVmWzUxMl0sICpwOworICBjaGFyICpuYW1lLCAqbnNuYW1lLCBycm5hbWVbMjU2XSwgcGxuYW1lWzY0MF0sIHB0cmJ1Zls2NF07CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksIGlwbGl0X2hpbnRzID0geyAuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVCB9OworCisgIG5hbWUgPSAqdG95cy5vcHRhcmdzOworICBuc25hbWUgPSB0b3lzLm9wdGFyZ3NbMV07CisKKyAgaWYgKCFUVC50eXBlX3N0ciAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfYSkpIFRULnR5cGVfc3RyID0gIjI1NSI7CisgIGlmICghZ2V0YWRkcmluZm8obmFtZSwgMCwgJmlwbGl0X2hpbnRzLCAmYWkpKSB7CisgICAgdW5zaWduZWQgY2hhciAqYTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciB4ZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisKKyAgICBpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICBhID0gKHZvaWQgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9hZGRyOworICAgICAgc25wcmludGYocHRyYnVmLCBzaXplb2YocHRyYnVmKSwgIiVkLiVkLiVkLiVkLmluLWFkZHIuYXJwYSIsCisgICAgICAgIGFbM10sIGFbMl0sIGFbMV0sIGFbMF0pOworICAgIH0gZWxzZSBpZiAoYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgYSA9ICh2b2lkICopJigoc3RydWN0IHNvY2thZGRyX2luNiAqKWFpLT5haV9hZGRyKS0+c2luNl9hZGRyOworICAgICAgZm9yIChqPTAsIGk9MTU7IGk+PTA7IGktLSkgeworICAgICAgICBwdHJidWZbaisrXSA9IHhkaWdpdHNbYVtpXSYxNV07CisgICAgICAgIHB0cmJ1ZltqKytdID0gJy4nOworICAgICAgICBwdHJidWZbaisrXSA9IHhkaWdpdHNbYVtpXT4+NF07CisgICAgICAgIHB0cmJ1ZltqKytdID0gJy4nOworICAgICAgfQorICAgICAgc3RyY3B5KHB0cmJ1ZitqLCAiaXA2LmFycGEiKTsKKyAgICB9CisgICAgbmFtZSA9IHB0cmJ1ZjsKKyAgICBpZiAoIVRULnR5cGVfc3RyKSBUVC50eXBlX3N0cj0iMTIiOworICB9IGVsc2UgaWYgKCFUVC50eXBlX3N0cikgVFQudHlwZV9zdHI9IjEiOworCisgIGlmIChUVC50eXBlX3N0clswXS0nMCcgPCAxMHUpIHR5cGUgPSBhdG9pKFRULnR5cGVfc3RyKTsKKyAgZWxzZSB7CisgICAgdHlwZSA9IC0xOworICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mIHJydCAvIHNpemVvZiAqcnJ0OyBpKyspIHsKKyAgICAgIGlmIChycnRbaV0ubmFtZSAmJiAhc3RyY2FzZWNtcChUVC50eXBlX3N0ciwgcnJ0W2ldLm5hbWUpKSB7CisgICAgICAgIHR5cGUgPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdHJjYXNlY21wKFRULnR5cGVfc3RyLCAiYW55IikpIHR5cGUgPSAyNTU7CisgICAgaWYgKHR5cGUgPCAwKSBlcnJvcl9leGl0KCJJbnZhbGlkIHF1ZXJ5IHR5cGU6ICVzIiwgVFQudHlwZV9zdHIpOworICB9CisKKyAgcWxlbiA9IHJlc19ta3F1ZXJ5KDAsIG5hbWUsIDEsIHR5cGUsIDAsIDAsIDAsIHFidWYsIHNpemVvZiBxYnVmKTsKKyAgaWYgKHFsZW4gPCAwKSBlcnJvcl9leGl0KCJJbnZhbGlkIHF1ZXJ5IHBhcmFtZXRlcnM6ICVzIiwgbmFtZSk7CisKKyAgaWYgKG5zbmFtZSkgeworICAgIHN0cnVjdCBhZGRyaW5mbyBuc19oaW50cyA9IHsgLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTSB9OworCisgICAgaWYgKChyZXQgPSBnZXRhZGRyaW5mbyhuc25hbWUsICI1MyIsICZuc19oaW50cywgJmFpKSkgPCAwKQorICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgbG9va2luZyB1cCBzZXJ2ZXIgbmFtZTogJXMiLCBnYWlfc3RyZXJyb3IocmV0KSk7CisgICAgaW50IHMgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworICAgIGlmIChzIDwgMCB8fCBjb25uZWN0KHMsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPCAwKQorICAgICAgcGVycm9yX2V4aXQoIlNvY2tldCBlcnJvciIpOworICAgIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICYoc3RydWN0IHRpbWV2YWwpeyAudHZfc2VjID0gNSB9LAorICAgICAgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisgICAgcHJpbnRmKCJVc2luZyBkb21haW4gc2VydmVyICVzOlxuIiwgbnNuYW1lKTsKKyAgICBzZW5kKHMsIHFidWYsIHFsZW4sIDApOworICAgIGFsZW4gPSByZWN2KHMsIGFidWYsIHNpemVvZiBhYnVmLCAwKTsKKyAgfSBlbHNlIGFsZW4gPSByZXNfc2VuZChxYnVmLCBxbGVuLCBhYnVmLCBzaXplb2YgYWJ1Zik7CisKKyAgaWYgKGFsZW4gPCAxMikgZXJyb3JfZXhpdCgiSG9zdCBub3QgZm91bmQuIik7CisKKyAgcmNvZGUgPSBhYnVmWzNdICYgMTU7CisKKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBwcmludGYoInJjb2RlID0gJWQgKCVzKSwgYW5jb3VudCA9ICVkXG4iLAorICAgICAgcmNvZGUsIHJjdFtyY29kZV0sIDI1NiphYnVmWzZdICsgYWJ1Zls3XSk7CisgICAgaWYgKCEoYWJ1ZlsyXSAmIDQpKSBwcmludGYoIlRoZSBmb2xsb3dpbmcgYW5zd2VyIGlzIG5vdCBhdXRob3JpdGF0aXZlOlxuIik7CisgIH0KKworICBpZiAocmNvZGUpIGVycm9yX2V4aXQoIkhvc3Qgbm90IGZvdW5kLiIpOworCisgIHAgPSBhYnVmICsgMTI7CisgIGZvciAoc2VjPTA7IHNlYzw0OyBzZWMrKykgeworICAgIGNvdW50ID0gMjU2KmFidWZbNCsyKnNlY10gKyBhYnVmWzUrMipzZWNdOworICAgIGlmICh2ZXJib3NlICYmIGNvdW50PjAgJiYgc2VjPjEpIAorICAgICAgcHV0cyhzZWM9PTIgPyAiRm9yIGF1dGhvcml0YXRpdmUgYW5zd2Vycywgc2VlOiIKKyAgICAgICAgOiAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbjoiKTsKKworICAgIGZvciAoOyBjb3VudC0tOyBwICs9IHBsbGVuKSB7CisgICAgICBwICs9IGRuX2V4cGFuZChhYnVmLCBhYnVmK2FsZW4sIHAsIHJybmFtZSwgc2l6ZW9mKHJybmFtZSkpOworICAgICAgdHlwZSA9IChwWzBdPDw4KSArIHBbMV07CisgICAgICBwICs9IDQ7CisgICAgICBpZiAoIXNlYykgY29udGludWU7CisgICAgICB0dGwgPSAocFswXTw8MjQpKyhwWzFdPDwxNikrKHBbMl08PDgpK3BbM107CisgICAgICBwICs9IDQ7CisgICAgICBwbGxlbiA9IChwWzBdPDw4KSArIHBbMV07CisgICAgICBwICs9IDI7CisKKyAgICAgIHN3aXRjaCAodHlwZTxzaXplb2YocnJ0KS9zaXplb2YoKnJydCkgPyBycnRbdHlwZV0ucGwgOiAwKSB7CisgICAgICBjYXNlIFBMX0lQOgorICAgICAgICBpbmV0X250b3AocnJ0W3R5cGVdLmFmLCBwLCBwbG5hbWUsIHNpemVvZiBwbG5hbWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUExfTkFNRToKKyAgICAgICAgZG5fZXhwYW5kKGFidWYsIGFidWYrYWxlbiwgcCwgcGxuYW1lLCBzaXplb2YgcGxuYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBMX1RFWFQ6CisgICAgICAgIHNucHJpbnRmKHBsbmFtZSwgc2l6ZW9mIHBsbmFtZSwgIlwiJS4qc1wiIiwgcGxsZW4sIHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUExfU09BOgorICAgICAgICBpID0gZG5fZXhwYW5kKGFidWYsIGFidWYrYWxlbiwgcCwgcGxuYW1lLCBzaXplb2YgcGxuYW1lIC0gMSk7CisgICAgICAgIHN0cmNhdChwbG5hbWUsICIgIik7CisgICAgICAgIGkgKz0gZG5fZXhwYW5kKGFidWYsIGFidWYrYWxlbiwgcCtpLCBwbG5hbWUrc3RybGVuKHBsbmFtZSksCisgICAgICAgICAgc2l6ZW9mKHBsbmFtZSktc3RybGVuKHBsbmFtZSkpOworICAgICAgICBmb3IgKGo9MDsgajw1OyBqKyspCisgICAgICAgICAgdltqXSA9IChwW2krNCpqXTw8MjQpKyhwWzEraSs0KmpdPDwxNikrKHBbMitpKzQqal08PDgpK3BbMytpKzQqal07CisgICAgICAgIHNucHJpbnRmKHBsbmFtZStzdHJsZW4ocGxuYW1lKSwgc2l6ZW9mKHBsbmFtZSktc3RybGVuKHBsbmFtZSksCisgICAgICAgICAgIihcblx0XHQldVx0O3NlcmlhbCAodmVyc2lvbilcbiIKKyAgICAgICAgICAiXHRcdCV1XHQ7cmVmcmVzaCBwZXJpb2RcbiIKKyAgICAgICAgICAiXHRcdCV1XHQ7cmV0cnkgaW50ZXJ2YWxcbiIKKyAgICAgICAgICAiXHRcdCV1XHQ7ZXhwaXJlIHRpbWVcbiIKKyAgICAgICAgICAiXHRcdCV1XHQ7ZGVmYXVsdCB0dGxcbiIKKyAgICAgICAgICAiXHRcdCkiLCB2WzBdLCB2WzFdLCB2WzJdLCB2WzNdLCB2WzRdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBMX01YOgorICAgICAgICBwcmkgPSAocFswXTw8OCkrcFsxXTsKKyAgICAgICAgc25wcmludGYocGxuYW1lLCBzaXplb2YocGxuYW1lKSwgdmVyYm9zZSA/ICIlZCAiIDogIihwcmk9JWQpIGJ5ICIsIHByaSk7CisgICAgICAgIGRuX2V4cGFuZChhYnVmLCBhYnVmK2FsZW4sIHArMiwgcGxuYW1lK3N0cmxlbihwbG5hbWUpLAorICAgICAgICAgIHNpemVvZiBwbG5hbWUgLSBzdHJsZW4ocGxuYW1lKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQTF9TUlY6CisgICAgICAgIGZvciAoaj0wOyBqPDM7IGorKykgdltqXSA9IChwWzIqal08PDgpICsgcFsxKzIqal07CisgICAgICAgIHNucHJpbnRmKHBsbmFtZSwgc2l6ZW9mKHBsbmFtZSksICIldSAldSAldSAiLCB2WzBdLCB2WzFdLCB2WzJdKTsKKyAgICAgICAgZG5fZXhwYW5kKGFidWYsIGFidWYrYWxlbiwgcCs2LCBwbG5hbWUrc3RybGVuKHBsbmFtZSksCisgICAgICAgICAgc2l6ZW9mIHBsbmFtZSAtIHN0cmxlbihwbG5hbWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIiVzIHVuc3VwcG9ydGVkIFJSIHR5cGUgJXVcbiIsIHJybmFtZSwgdHlwZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgcHJpbnRmKCIlc1x0JXVcdElOICVzXHQlc1xuIiwgcnJuYW1lLCB0dGwsIHJydFt0eXBlXS5uYW1lLCBwbG5hbWUpOworICAgICAgZWxzZSBpZiAocnJ0W3R5cGVdLm1zZykKKyAgICAgICAgcHJpbnRmKCIlcyAlcyAlc1xuIiwgcnJuYW1lLCBycnRbdHlwZV0ubXNnLCBwbG5hbWUpOworICAgIH0KKyAgICBpZiAoIXZlcmJvc2UgJiYgc2VjPT0xKSBicmVhazsKKyAgfQorCisgIHRveXMuZXhpdHZhbCA9IHJjb2RlOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9pY29udi5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9pY29udi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjgwMzgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2ljb252LmMKQEAgLTAsMCArMSw3NCBAQAorLyogaWNvbnYuYyAtIENvbnZlcnQgY2hhcmFjdGVyIGVuY29kaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTQgRmVsaXggSmFuZGEgPGZlbGl4LmphbmRhQHBvc3Rlby5kZT4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2ljb252Lmh0bWwKKworVVNFX0lDT05WKE5FV1RPWShpY29udiwgImNzdDpmOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIElDT05WCisgIGJvb2wgImljb252IgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBUT1lCT1hfSUNPTlYKKyAgaGVscAorICAgIHVzYWdlOiBpY29udiBbLWYgRlJPTV0gWy10IFRPXSBbRklMRS4uLl0KKworICAgIENvbnZlcnQgY2hhcmFjdGVyIGVuY29kaW5nIG9mIGZpbGVzLgorCisgICAgLWYgIGNvbnZlcnQgZnJvbSAoZGVmYXVsdCB1dGY4KQorICAgIC10ICBjb252ZXJ0IHRvICAgKGRlZmF1bHQgdXRmOCkKKyovCisKKyNkZWZpbmUgRk9SX2ljb252CisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPGljb252Lmg+CisKK0dMT0JBTFMoCisgIGNoYXIgKmZyb207CisgIGNoYXIgKnRvOworCisgIHZvaWQgKmljOworKQorCitzdGF0aWMgdm9pZCBkb19pY29udihpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKm91dHN0YXJ0ID0gdG95YnVmKzIwNDg7CisgIHNpemVfdCBpbmxlZnQgPSAwOworICBpbnQgbGVuID0gMTsKKworICBkbyB7CisgICAgc2l6ZV90IG91dGxlZnQgPSAyMDQ4OworICAgIGNoYXIgKmluID0gdG95YnVmK2lubGVmdCwgKm91dCA9IG91dHN0YXJ0OworCisgICAgbGVuID0gcmVhZChmZCwgaW4sIDIwNDgtaW5sZWZ0KTsKKworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICBwZXJyb3JfbXNnKCJyZWFkICclcyciKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5sZWZ0ICs9IGxlbjsKKworICAgIGRvIHsKKyAgICAgIGlmIChpY29udihUVC5pYywgJmluLCAmaW5sZWZ0LCAmb3V0LCAmb3V0bGVmdCkgPT0gLTEKKyAgICAgICAgICAmJiAoZXJybm8gPT0gRUlMU0VRIHx8IChpbiA9PSB0b3lidWYraW5sZWZ0LWxlbiAmJiBlcnJubyA9PSBFSU5WQUwpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKG91dGxlZnQpIHsKKyAgICAgICAgICAvLyBTa2lwIGZpcnN0IGJ5dGUgb2YgaWxsZWdhbCBzZXF1ZW5jZSB0byBhdm9pZCBlbmRsZXNzIGxvb3BzCisgICAgICAgICAgKihvdXQrKykgPSAqKGluKyspOworICAgICAgICAgIGlubGVmdC0tOworICAgICAgICB9CisgICAgICB9CisgICAgICB4d3JpdGUoMSwgb3V0c3RhcnQsIG91dC1vdXRzdGFydCk7CisgICAgICAvLyBUb3Agb2ZmIGlucHV0IGJ1ZmZlcgorICAgICAgbWVtbW92ZShpbiwgdG95YnVmLCBpbmxlZnQpOworICAgIH0gd2hpbGUgKGxlbiA8IDEgJiYgaW5sZWZ0KTsKKyAgfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK3ZvaWQgaWNvbnZfbWFpbih2b2lkKQoreworICBUVC5pYyA9IGljb252X29wZW4oVFQudG8gPyBUVC50byA6ICJ1dGY4IiwgVFQuZnJvbSA/IFRULmZyb20gOiAidXRmOCIpOworICBpZiAoVFQuaWMgPT0gKGljb252X3QpLTEpIGVycm9yX2V4aXQoImJhZCBlbmNvZGluZyIpOworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19pY29udik7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGljb252X2Nsb3NlKFRULmljKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvaW5pdC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNjE0OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvaW5pdC5jCkBAIC0wLDAgKzEsNDk4IEBACisvKiBpbml0LmMgLSBpbml0IHByb2dyYW0uCisgKgorICogQ29weXJpZ2h0IDIwMTIgSGFydmluZCBTaW5naCA8aGFydmluZHNpbmdoMTk4MUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQKKworVVNFX0lOSVQoTkVXVE9ZKGluaXQsICIiLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgSU5JVAorICBib29sICJpbml0IgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBpbml0CisKKyAgICBTeXN0ZW0gViBzdHlsZSBpbml0LgorCisgICAgRmlyc3QgcHJvZ3JhbSB0byBydW4gKGFzIFBJRCAxKSB3aGVuIHRoZSBzeXN0ZW0gY29tZXMgdXAsIHJlYWRpbmcKKyAgICAvZXRjL2luaXR0YWIgdG8gZGV0ZXJtaW5lIGFjdGlvbnMuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPHN5cy9yZWJvb3QuaD4KKworc3RydWN0IGFjdGlvbl9saXN0X3NlZWQgeworICBzdHJ1Y3QgYWN0aW9uX2xpc3Rfc2VlZCAqbmV4dDsKKyAgcGlkX3QgcGlkOworICB1aW50OF90IGFjdGlvbjsKKyAgY2hhciAqdGVybWluYWxfbmFtZTsKKyAgY2hhciAqY29tbWFuZDsKK30gKmFjdGlvbl9saXN0X3BvaW50ZXIgPSBOVUxMOworaW50IGNhdWdodF9zaWduYWw7CisKKy8vSU5JVFRBQiBhY3Rpb24gZGVmaW5hdGlvbgorI2RlZmluZSBTWVNJTklUICAgICAweDAxCisjZGVmaW5lIFdBSVQgICAgICAgIDB4MDIKKyNkZWZpbmUgT05DRSAgICAgICAgMHgwNAorI2RlZmluZSBSRVNQQVdOICAgICAweDA4CisjZGVmaW5lIEFTS0ZJUlNUICAgIDB4MTAKKyNkZWZpbmUgQ1RSTEFMVERFTCAgMHgyMAorI2RlZmluZSBTSFVURE9XTiAgICAweDQwCisjZGVmaW5lIFJFU1RBUlQgICAgIDB4ODAKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jb25zb2xlKHZvaWQpCit7CisgIGludCBmZDsKKyAgY2hhciAqcCA9IGdldGVudigiQ09OU09MRSIpOworCisgIGlmICghcCkgcCA9IGdldGVudigiY29uc29sZSIpOworICBpZiAoIXApIHsKKyAgICBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgIHdoaWxlIChmZCA8IDIpIGZkID0gZHVwKGZkKTsKKyAgICAgIHdoaWxlIChmZCA+IDIpIGNsb3NlKGZkLS0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmZCA9IG9wZW4ocCwgT19SRFdSIHwgT19OT05CTE9DSyB8IE9fTk9DVFRZKTsKKyAgICBpZiAoZmQgPCAwKSBwcmludGYoIlVuYWJsZSB0byBvcGVuIGNvbnNvbGUgJXNcbiIscCk7CisgICAgZWxzZSB7CisgICAgICBkdXAyKGZkLDApOworICAgICAgZHVwMihmZCwxKTsKKyAgICAgIGR1cDIoZmQsMik7CisgICAgfQorICB9CisKKyAgaWYgKCFnZXRlbnYoIlRFUk0iKSkgcHV0ZW52KCJURVJNPWxpbnV4Iik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Rlcm0oaW50IGZkKQoreworICBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW5hbDsKKyAKKyAgdGNnZXRhdHRyKGZkLCAmdGVybWluYWwpOworICB0ZXJtaW5hbC5jX2NjW1ZJTlRSXSA9IDM7ICAgIC8vY3RybC1jCisgIHRlcm1pbmFsLmNfY2NbVlFVSVRdID0gMjg7ICAgLypjdHJsLVwqLworICB0ZXJtaW5hbC5jX2NjW1ZFUkFTRV0gPSAxMjc7IC8vY3RybC0/CisgIHRlcm1pbmFsLmNfY2NbVktJTExdID0gMjE7ICAgLy9jdHJsLXUKKyAgdGVybWluYWwuY19jY1tWRU9GXSA9IDQ7ICAgICAvL2N0cmwtZAorICB0ZXJtaW5hbC5jX2NjW1ZTVEFSVF0gPSAxNzsgIC8vY3RybC1xCisgIHRlcm1pbmFsLmNfY2NbVlNUT1BdID0gMTk7ICAgLy9jdHJsLXMKKyAgdGVybWluYWwuY19jY1tWU1VTUF0gPSAyNjsgICAvL2N0cmwtegorCisgIHRlcm1pbmFsLmNfbGluZSA9IDA7CisgIHRlcm1pbmFsLmNfY2ZsYWcgJj0gQ1JUU0NUU3xQQVJPRER8UEFSRU5CfENTVE9QQnxDU0laRXxDQkFVREVYfENCQVVEOworICB0ZXJtaW5hbC5jX2NmbGFnIHw9IENMT0NBTHxIVVBDTHxDUkVBRDsKKworICAvL2VuYWJsZSBzdGFydC9zdG9wIGlucHV0IGFuZCBvdXRwdXQgY29udHJvbCArIG1hcCBDUiB0byBOTCBvbiBpbnB1dAorICB0ZXJtaW5hbC5jX2lmbGFnID0gSVhPTnxJWE9GRnxJQ1JOTDsKKworICAvL01hcCBOTCB0byBDUi1OTCBvbiBvdXRwdXQKKyAgdGVybWluYWwuY19vZmxhZyA9IE9OTENSfE9QT1NUOworICB0ZXJtaW5hbC5jX2xmbGFnID0gSUVYVEVOfEVDSE9LRXxFQ0hPQ1RMfEVDSE9LfEVDSE9FfEVDSE98SUNBTk9OfElTSUc7CisgIHRjc2V0YXR0cihmZCwgVENTQU5PVywgJnRlcm1pbmFsKTsKK30KKworc3RhdGljIHZvaWQgYWRkX25ld19hY3Rpb24odWludDhfdCBhY3Rpb24sY2hhciAqY29tbWFuZCxjaGFyICp0ZXJtKQoreworICBzdHJ1Y3QgYWN0aW9uX2xpc3Rfc2VlZCAqeCwqKnk7CisKKyAgeSA9ICZhY3Rpb25fbGlzdF9wb2ludGVyOworICB4ID0gKnk7CisgIHdoaWxlICh4KSB7CisgICAgaWYgKCEoc3RyY21wKHgtPmNvbW1hbmQsIGNvbW1hbmQpKSAmJiAhKHN0cmNtcCh4LT50ZXJtaW5hbF9uYW1lLCB0ZXJtKSkpIHsKKyAgICAgICp5ID0geC0+bmV4dDsgLy9yZW1vdmUgZnJvbSB0aGUgbGlzdAorICAgICAgd2hpbGUoKnkpIHkgPSAmKCp5KS0+bmV4dDsgLy90cmF2ZXJzZSB0aHJvdWdoIGxpc3QgdGlsbCBlbmQKKyAgICAgIHgtPm5leHQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHkgPSAmKHgpLT5uZXh0OworICAgIHggPSAqeTsKKyAgfQorCisgIC8vY3JlYXRlIGEgbmV3IG5vZGUKKyAgaWYgKCF4KSB7CisgICAgeCA9IHh6YWxsb2Moc2l6ZW9mKCp4KSk7CisgICAgeC0+Y29tbWFuZCA9IHhzdHJkdXAoY29tbWFuZCk7CisgICAgeC0+dGVybWluYWxfbmFtZSA9IHhzdHJkdXAodGVybSk7CisgIH0KKyAgeC0+YWN0aW9uID0gYWN0aW9uOworICAqeSA9IHg7Cit9CisKK3N0YXRpYyB2b2lkIGluaXR0YWJfcGFyc2luZyh2b2lkKQoreworICBpbnQgaSwgZmQsIGxpbmVfbnVtYmVyID0gMCwgdG9rZW5fY291bnQgPSAwOworICBjaGFyICpwLCAqcSwgKmV4dHJhY3RlZF90b2tlbiwgKnR0eV9uYW1lID0gTlVMTCwgKmNvbW1hbmQgPSBOVUxMLCAqdG1wOworICB1aW50OF90IGFjdGlvbiA9IDA7CisgIGNoYXIgKmFjdF9uYW1lID0gInN5c2luaXRcMHdhaXRcMG9uY2VcMHJlc3Bhd25cMGFza2ZpcnN0XDBjdHJsYWx0ZGVsXDAiCisgICAgICAgICAgICAgICAgICAgICJzaHV0ZG93blwwcmVzdGFydFwwIjsKKworICBmZCA9IG9wZW4oIi9ldGMvaW5pdHRhYiIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIGVycm9yX21zZygiVW5hYmxlIHRvIG9wZW4gL2V0Yy9pbml0dGFiLiBVc2luZyBEZWZhdWx0IGluaXR0YWIiKTsKKyAgICBhZGRfbmV3X2FjdGlvbihTWVNJTklULCAiL2V0Yy9pbml0LmQvcmNTIiwgIiIpOworICAgIGFkZF9uZXdfYWN0aW9uKFJFU1BBV04sICIvc2Jpbi9nZXR0eSAtbiAtbCAvYmluL3NoIC1MIDExNTIwMCB0dHkxIHZ0MTAwIiwgIiIpOworICB9IGVsc2UgeworICAgIHdoaWxlKChxID0gcCA9IGdldF9saW5lKGZkKSkpIHsgLy9yZWFkIHNpbmdsZSBsaW5lIGZyb20gL2V0Yy9pbml0dGFiCisgICAgICBjaGFyICp4OworCisgICAgICBpZiAoKHggPSBzdHJjaHIocCwgJyMnKSkpICp4ID0gJ1wwJzsKKyAgICAgIGxpbmVfbnVtYmVyKys7CisgICAgICB0b2tlbl9jb3VudCA9IDA7CisgICAgICBhY3Rpb24gPSAwOworICAgICAgdHR5X25hbWUgPSBjb21tYW5kID0gTlVMTDsKKworICAgICAgd2hpbGUgKChleHRyYWN0ZWRfdG9rZW4gPSBzdHJzZXAoJnAsIjoiKSkpIHsKKyAgICAgICAgdG9rZW5fY291bnQrKzsKKyAgICAgICAgc3dpdGNoICh0b2tlbl9jb3VudCkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmICgqZXh0cmFjdGVkX3Rva2VuKSB7CisgICAgICAgICAgICAgIGlmICghc3RybmNtcChleHRyYWN0ZWRfdG9rZW4sICIvZGV2LyIsIDUpKQorICAgICAgICAgICAgICAgIHR0eV9uYW1lID0geG1wcmludGYoIiVzIixleHRyYWN0ZWRfdG9rZW4pOworICAgICAgICAgICAgICBlbHNlIHR0eV9uYW1lID0geG1wcmludGYoIi9kZXYvJXMiLGV4dHJhY3RlZF90b2tlbik7CisgICAgICAgICAgICB9IGVsc2UgdHR5X25hbWUgPSB4c3RyZHVwKCIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGZvciAodG1wID0gYWN0X25hbWUsIGkgPSAwOyAqdG1wOyBpKyssIHRtcCArPSBzdHJsZW4odG1wKSArMSkgeworICAgICAgICAgICAgICBpZiAoIXN0cmNtcCh0bXAsIGV4dHJhY3RlZF90b2tlbikpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSAxIDw8IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKnRtcCkgZXJyb3JfbXNnKCJJbnZhbGlkIGFjdGlvbiBhdCBsaW5lIG51bWJlciAlZCAtLS0tIGlnbm9yaW5nIixsaW5lX251bWJlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjb21tYW5kID0geHN0cmR1cChleHRyYWN0ZWRfdG9rZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVycm9yX21zZygiQmFkIGluaXR0YWIgZW50cnkgYXQgbGluZSAlZCIsIGxpbmVfbnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9ICAvL3doaWxlIHRva2VuCisKKyAgICAgIGlmIChxKSBmcmVlKHEpOworICAgICAgaWYgKHRva2VuX2NvdW50ICE9IDQpIHsKKyAgICAgICAgZnJlZSh0dHlfbmFtZSk7CisgICAgICAgIGZyZWUoY29tbWFuZCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGFjdGlvbikgYWRkX25ld19hY3Rpb24oYWN0aW9uLCBjb21tYW5kLCB0dHlfbmFtZSk7CisgICAgICBmcmVlKHR0eV9uYW1lKTsKKyAgICAgIGZyZWUoY29tbWFuZCk7CisgICAgfSAvL3doaWxlIGxpbmUKKworICAgIGNsb3NlKGZkKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBydW5fY29tbWFuZChjaGFyICpjb21tYW5kKQoreworICBjaGFyICpmaW5hbF9jb21tYW5kWzEyOF07CisgIGludCBoeXBoZW4gPSAoY29tbWFuZFswXT09Jy0nKTsKKworICBjb21tYW5kID0gY29tbWFuZCArIGh5cGhlbjsKKyAgaWYgKCFzdHJwYnJrKGNvbW1hbmQsICI/PD4nXCI7W117fVxcfD0oKSomXiQhYH4iKSkgeworICAgIGNoYXIgKm5leHRfY29tbWFuZDsKKyAgICBjaGFyICpleHRyYWN0ZWRfY29tbWFuZDsKKyAgICBpbnQgeCA9IDA7CisKKyAgICBuZXh0X2NvbW1hbmQgPSBzdHJuY3B5KHRveWJ1ZiwgY29tbWFuZCAtIGh5cGhlbiwgc2l6ZW9mKHRveWJ1ZikpOworICAgIG5leHRfY29tbWFuZFtzaXplb2YodG95YnVmKSAtIDFdID0gdG95YnVmW3NpemVvZih0b3lidWYpIC0gMSBdID0gJ1wwJzsKKyAgICBjb21tYW5kID0gbmV4dF9jb21tYW5kICsgaHlwaGVuOworICAgIHdoaWxlICgoZXh0cmFjdGVkX2NvbW1hbmQgPSBzdHJzZXAoJm5leHRfY29tbWFuZCwiIFx0IikpKSB7CisgICAgICBpZiAoKmV4dHJhY3RlZF9jb21tYW5kKSB7CisgICAgICAgIGZpbmFsX2NvbW1hbmRbeF0gPSBleHRyYWN0ZWRfY29tbWFuZDsKKyAgICAgICAgeCsrOworICAgICAgfQorICAgIH0KKyAgICBmaW5hbF9jb21tYW5kW3hdID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiZXhlYyAlcyIsIGNvbW1hbmQpOworICAgIGNvbW1hbmQgPSAiLS9iaW4vc2giKzE7CisgICAgZmluYWxfY29tbWFuZFswXSA9ICgiLS9iaW4vc2giKyFoeXBoZW4pOworICAgIGZpbmFsX2NvbW1hbmRbMV0gPSAiLWMiOworICAgIGZpbmFsX2NvbW1hbmRbMl0gPSB0b3lidWY7CisgICAgZmluYWxfY29tbWFuZFszXSA9IE5VTEw7CisgIH0KKyAgaWYgKGh5cGhlbikgaW9jdGwoMCwgVElPQ1NDVFRZLCAwKTsKKyAgZXhlY3ZwKGNvbW1hbmQsIGZpbmFsX2NvbW1hbmQpOworICBlcnJvcl9tc2coInVuYWJsZSB0byBydW4gJXMiLGNvbW1hbmQpOworfQorCisvL3J1bnMgYWxsIHNhbWUgdHlwZSBvZiBhY3Rpb25zCitzdGF0aWMgcGlkX3QgZmluYWxfcnVuKHN0cnVjdCBhY3Rpb25fbGlzdF9zZWVkICp4KQoreworICBwaWRfdCBwaWQ7CisgIGludCBmZDsKKyAgc2lnc2V0X3Qgc2lnbmFsX3NldDsKKworICBzaWdmaWxsc2V0KCZzaWduYWxfc2V0KTsKKyAgc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc2lnbmFsX3NldCwgTlVMTCk7CisgIGlmICh4LT5hY3Rpb24gJiBBU0tGSVJTVCkgcGlkID0gZm9yaygpOworICBlbHNlIHBpZCA9IHZmb3JrKCk7CisKKyAgaWYgKHBpZCA+IDApIHsKKyAgICAvL3BhcmVudCBwcm9jZXNzIG9yIGVycm9yCisgICAgLy91bmJsb2NrIHRoZSBzaWduYWxzCisgICAgc2lnZmlsbHNldCgmc2lnbmFsX3NldCk7CisgICAgc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzaWduYWxfc2V0LCBOVUxMKTsKKworICAgIHJldHVybiBwaWQ7ICAgICAgCisgIH0gZWxzZSBpZiAocGlkIDwgMCkgeworICAgIHBlcnJvcl9tc2coImZvcmsgZmFpbCIpOworICAgIHNsZWVwKDEpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy9uZXcgYm9ybiBjaGlsZCBwcm9jZXNzCisgIHNpZ3NldF90IHNpZ25hbF9zZXRfYzsKKyAgc2lnZmlsbHNldCgmc2lnbmFsX3NldF9jKTsKKyAgc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzaWduYWxfc2V0X2MsIE5VTEwpOworICBzZXRzaWQoKTsgLy9uZXcgc2Vzc2lvbgorCisgIGlmICh4LT50ZXJtaW5hbF9uYW1lWzBdKSB7CisgICAgY2xvc2UoMCk7CisgICAgZmQgPSBvcGVuKHgtPnRlcm1pbmFsX25hbWUsIChPX1JEV1J8T19OT05CTE9DSyksMDYwMCk7CisgICAgaWYgKGZkICE9IDApIHsKKyAgICAgIGVycm9yX21zZygiVW5hYmxlIHRvIG9wZW4gJXMsJXNcbiIsIHgtPnRlcm1pbmFsX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICBfZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0gZWxzZSB7CisgICAgICBkdXAyKDAsIDEpOworICAgICAgZHVwMigwLCAyKTsKKyAgICB9CisgIH0KKyAgcmVzZXRfdGVybSgwKTsKKyAgcnVuX2NvbW1hbmQoeC0+Y29tbWFuZCk7CisgIF9leGl0KC0xKTsKK30KKworc3RhdGljIHN0cnVjdCBhY3Rpb25fbGlzdF9zZWVkKiBtYXJrX2FzX3Rlcm1pbmF0ZWRfcHJvY2VzcyhwaWRfdCBwaWQpCit7CisgIHN0cnVjdCBhY3Rpb25fbGlzdF9zZWVkICp4OworCisgIGlmIChwaWQgPiAwKSB7CisgICAgZm9yICh4ID0gYWN0aW9uX2xpc3RfcG9pbnRlcjsgeDsgeCA9IHgtPm5leHQpIHsKKyAgICAgIGlmICh4LT5waWQgPT0gcGlkKSB7CisgICAgICAgIHgtPnBpZCA9IDA7CisgICAgICAgIHJldHVybiB4OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB3YWl0Zm9ycGlkKHBpZF90IHBpZCkKK3sKKyAgaWYgKHBpZCA8PSAwKSByZXR1cm47CisKKyAgZm9yKDs7KSB7CisgICAgcGlkX3QgeSA9IHdhaXQoTlVMTCk7CisgICAgbWFya19hc190ZXJtaW5hdGVkX3Byb2Nlc3MoeSk7CisgICAgaWYgKGtpbGwoeSwgMCkpIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9hY3Rpb25fZnJvbV9saXN0KGludCBhY3Rpb24pCit7CisgIHBpZF90IHBpZDsKKyAgc3RydWN0IGFjdGlvbl9saXN0X3NlZWQgKnggPSBhY3Rpb25fbGlzdF9wb2ludGVyOworCisgIGZvciAoOyB4OyB4ID0geC0+bmV4dCkgeworICAgIGlmICghKHgtPmFjdGlvbiAmIGFjdGlvbikpIGNvbnRpbnVlOworICAgIGlmICh4LT5hY3Rpb24gJiAoU0hVVERPV058T05DRXxTWVNJTklUfENUUkxBTFRERUx8V0FJVCkpIHsKKyAgICAgIHBpZCA9IGZpbmFsX3J1bih4KTsKKyAgICAgIGlmICghcGlkKSByZXR1cm47CisgICAgICBpZiAoeC0+YWN0aW9uICYgKFNIVVRET1dOfFNZU0lOSVR8Q1RSTEFMVERFTHxXQUlUKSkgd2FpdGZvcnBpZChwaWQpOworICAgIH0KKyAgICBpZiAoeC0+YWN0aW9uICYgKEFTS0ZJUlNUfFJFU1BBV04pKQorICAgICAgaWYgKCEoeC0+cGlkKSkgeC0+cGlkID0gZmluYWxfcnVuKHgpOworICB9CisgfQorCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdCh2b2lkKQoreworICBzaWdzZXRfdCBzaWduYWxfc2V0X2M7CisKKyAgc2lnYXRleGl0KFNJR19ERkwpOworICBzaWdmaWxsc2V0KCZzaWduYWxfc2V0X2MpOworICBzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywmc2lnbmFsX3NldF9jLCBOVUxMKTsKKworICBydW5fYWN0aW9uX2Zyb21fbGlzdChTSFVURE9XTik7CisgIGVycm9yX21zZygiVGhlIHN5c3RlbSBpcyBnb2luZyBkb3duIE5PVyEiKTsKKyAga2lsbCgtMSwgU0lHVEVSTSk7CisgIGVycm9yX21zZygiU2VudCBTSUdURVJNIHRvIGFsbCBwcm9jZXNzZXMiKTsKKyAgc3luYygpOworICBzbGVlcCgxKTsKKyAga2lsbCgtMSxTSUdLSUxMKTsKKyAgc3luYygpOworfQorCitzdGF0aWMgdm9pZCBoYWx0X3Bvd2Vyb2ZmX3JlYm9vdF9oYW5kbGVyKGludCBzaWdfbm8pCit7CisgIHVuc2lnbmVkIGludCByZWJvb3RfbWFnaWNfbm8gPSAwOworICBwaWRfdCBwaWQ7CisKKyAgc2V0X2RlZmF1bHQoKTsKKworICBzd2l0Y2ggKHNpZ19ubykgeworICAgIGNhc2UgU0lHVVNSMToKKyAgICAgIGVycm9yX21zZygiUmVxdWVzdGluZyBzeXN0ZW0gaGFsdCIpOworICAgICAgcmVib290X21hZ2ljX25vPVJCX0hBTFRfU1lTVEVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSUdVU1IyOgorICAgICAgZXJyb3JfbXNnKCJSZXF1ZXN0aW5nIHN5c3RlbSBwb3dlcm9mZiIpOworICAgICAgcmVib290X21hZ2ljX25vPVJCX1BPV0VSX09GRjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lHVEVSTTogIAorICAgICAgZXJyb3JfbXNnKCJSZXF1ZXN0aW5nIHN5c3RlbSByZWJvb3QiKTsKKyAgICAgIHJlYm9vdF9tYWdpY19ubz1SQl9BVVRPQk9PVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHNsZWVwKDEpOworICBwaWQgPSB2Zm9yaygpOworCisgIGlmIChwaWQgPT0gMCkgeworICAgIHJlYm9vdChyZWJvb3RfbWFnaWNfbm8pOworICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgIH0KKworICB3aGlsZSgxKSBzbGVlcCgxKTsKK30KKworc3RhdGljIHZvaWQgcmVzdGFydF9pbml0X2hhbmRsZXIoaW50IHNpZ19ubykKK3sKKyAgc3RydWN0IGFjdGlvbl9saXN0X3NlZWQgKng7CisgIHBpZF90IHBpZDsKKyAgaW50IGZkOworCisgIGZvciAoeCA9IGFjdGlvbl9saXN0X3BvaW50ZXI7IHg7IHggPSB4LT5uZXh0KSB7CisgICAgaWYgKCEoeC0+YWN0aW9uICYgUkVTVEFSVCkpIGNvbnRpbnVlOworCisgICAgc2V0X2RlZmF1bHQoKTsKKworICAgIGlmICh4LT50ZXJtaW5hbF9uYW1lWzBdKSB7CisgICAgICBjbG9zZSgwKTsKKyAgICAgIGZkID0gb3Blbih4LT50ZXJtaW5hbF9uYW1lLCAoT19SRFdSfE9fTk9OQkxPQ0spLDA2MDApOworCisgICAgICBpZiAoZmQgIT0gMCkgeworICAgICAgICBlcnJvcl9tc2coIlVuYWJsZSB0byBvcGVuICVzLCVzXG4iLCB4LT50ZXJtaW5hbF9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgcGlkID0gdmZvcmsoKTsKKworICAgICAgICBpZiAocGlkID09IDApIHsKKyAgICAgICAgICByZWJvb3QoUkJfSEFMVF9TWVNURU0pOworICAgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSgxKSBzbGVlcCgxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR1cDIoMCwgMSk7CisgICAgICAgIGR1cDIoMCwgMik7CisgICAgICAgIHJlc2V0X3Rlcm0oMCk7CisgICAgICAgIHJ1bl9jb21tYW5kKHgtPmNvbW1hbmQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBjYXRjaF9zaWduYWwoaW50IHNpZ19ubykKK3sKKyAgY2F1Z2h0X3NpZ25hbCA9IHNpZ19ubzsKKyAgZXJyb3JfbXNnKCJzaWduYWwgc2VlbiIpOworfQorCitzdGF0aWMgdm9pZCBwYXVzZV9oYW5kbGVyKGludCBzaWdfbm8pCit7CisgIGludCBzaWduYWxfYmFja3VwLGVycm5vX2JhY2t1cDsKKyAgcGlkX3QgcGlkOworCisgIGVycm5vX2JhY2t1cCA9IGVycm5vOworICBzaWduYWxfYmFja3VwID0gY2F1Z2h0X3NpZ25hbDsKKyAgeHNpZ25hbChTSUdDT05ULCBjYXRjaF9zaWduYWwpOworCisgIHdoaWxlKDEpIHsKKyAgICBpZiAoY2F1Z2h0X3NpZ25hbCA9PSBTSUdDT05UKSBicmVhazsKKyAgICBkbyBwaWQgPSB3YWl0cGlkKC0xLE5VTEwsV05PSEFORyk7IHdoaWxlKChwaWQ9PS0xKSAmJiAoZXJybm89RUlOVFIpKTsKKyAgICBtYXJrX2FzX3Rlcm1pbmF0ZWRfcHJvY2VzcyhwaWQpOworICAgIHNsZWVwKDEpOworICB9CisKKyAgc2lnbmFsKFNJR0NPTlQsIFNJR19ERkwpOworICBlcnJubyA9IGVycm5vX2JhY2t1cDsKKyAgY2F1Z2h0X3NpZ25hbCA9IHNpZ25hbF9iYWNrdXA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaWZfcGVuZGluZ19zaWduYWxzKHZvaWQpCit7CisgIGludCBzaWduYWxfY2F1Z2h0ID0gMDsKKworICB3aGlsZSgxKSB7CisgICAgaW50IHNpZyA9IGNhdWdodF9zaWduYWw7CisgICAgaWYgKCFzaWcpIHJldHVybiBzaWduYWxfY2F1Z2h0OworICAgIGNhdWdodF9zaWduYWwgPSAwOworICAgIHNpZ25hbF9jYXVnaHQgPSAxOworICAgIGlmIChzaWcgPT0gU0lHSU5UKSBydW5fYWN0aW9uX2Zyb21fbGlzdChDVFJMQUxUREVMKTsKKyAgfQorfQorCit2b2lkIGluaXRfbWFpbih2b2lkKQoreworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ19hY3Q7CisKKyAgaWYgKGdldHBpZCgpICE9IDEpIGVycm9yX2V4aXQoIkFscmVhZHkgcnVubmluZyIpOyAKKyAgcHJpbnRmKCJTdGFydGVkIGluaXRcbiIpOyAKKyAgaW5pdGlhbGl6ZV9jb25zb2xlKCk7CisgIHJlc2V0X3Rlcm0oMCk7CisKKyAgaWYgKGNoZGlyKCIvIikpIHBlcnJvcl9leGl0KCJDYW4ndCBjZCB0byAvIik7CisgIHNldHNpZCgpOworCisgIHB1dGVudigiSE9NRT0vIik7CisgIHB1dGVudigiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIpOworICBwdXRlbnYoIlNIRUxMPS9iaW4vc2giKTsKKyAgcHV0ZW52KCJVU0VSPXJvb3QiKTsKKworICBpbml0dGFiX3BhcnNpbmcoKTsgIAorICB4c2lnbmFsKFNJR1VTUjEsIGhhbHRfcG93ZXJvZmZfcmVib290X2hhbmRsZXIpOy8vaGFsdAorICB4c2lnbmFsKFNJR1VTUjIsIGhhbHRfcG93ZXJvZmZfcmVib290X2hhbmRsZXIpOy8vcG93ZXJvZmYKKyAgeHNpZ25hbChTSUdURVJNLCBoYWx0X3Bvd2Vyb2ZmX3JlYm9vdF9oYW5kbGVyKTsvL3JlYm9vdAorICB4c2lnbmFsKFNJR1FVSVQsIHJlc3RhcnRfaW5pdF9oYW5kbGVyKTsvL3Jlc3RhcnQgaW5pdAorICBtZW1zZXQoJnNpZ19hY3QsIDAsIHNpemVvZihzaWdfYWN0KSk7CisgIHNpZ2ZpbGxzZXQoJnNpZ19hY3Quc2FfbWFzayk7CisgIHNpZ2RlbHNldCgmc2lnX2FjdC5zYV9tYXNrLCBTSUdDT05UKTsKKyAgc2lnX2FjdC5zYV9oYW5kbGVyID0gcGF1c2VfaGFuZGxlcjsKKyAgc2lnYWN0aW9uKFNJR1RTVFAsICZzaWdfYWN0LCBOVUxMKTsKKyAgbWVtc2V0KCZzaWdfYWN0LCAwLCBzaXplb2Yoc2lnX2FjdCkpOworICBzaWdfYWN0LnNhX2hhbmRsZXIgPSBjYXRjaF9zaWduYWw7CisgIHNpZ2FjdGlvbihTSUdJTlQsICZzaWdfYWN0LCBOVUxMKTsgIAorICBzaWdhY3Rpb24oU0lHSFVQLCAmc2lnX2FjdCwgTlVMTCk7ICAKKyAgcnVuX2FjdGlvbl9mcm9tX2xpc3QoU1lTSU5JVCk7CisgIGNoZWNrX2lmX3BlbmRpbmdfc2lnbmFscygpOworICBydW5fYWN0aW9uX2Zyb21fbGlzdChXQUlUKTsKKyAgY2hlY2tfaWZfcGVuZGluZ19zaWduYWxzKCk7CisgIHJ1bl9hY3Rpb25fZnJvbV9saXN0KE9OQ0UpOworICB3aGlsZSAoMSkgeworICAgIGludCBzdXNwZWN0ZWRfV05PSEFORyA9IGNoZWNrX2lmX3BlbmRpbmdfc2lnbmFscygpOworCisgICAgcnVuX2FjdGlvbl9mcm9tX2xpc3QoUkVTUEFXTiB8IEFTS0ZJUlNUKTsKKyAgICBzdXNwZWN0ZWRfV05PSEFORyA9IHN1c3BlY3RlZF9XTk9IQU5HfGNoZWNrX2lmX3BlbmRpbmdfc2lnbmFscygpOworICAgIHNsZWVwKDEpOy8vbGV0IGNwdSBicmVhdGgKKyAgICBzdXNwZWN0ZWRfV05PSEFORyA9IHN1c3BlY3RlZF9XTk9IQU5HfGNoZWNrX2lmX3BlbmRpbmdfc2lnbmFscygpOworICAgIGlmIChzdXNwZWN0ZWRfV05PSEFORykgc3VzcGVjdGVkX1dOT0hBTkc9V05PSEFORzsKKworICAgIHdoaWxlKDEpIHsKKyAgICAgIHBpZF90IHBpZCA9IHdhaXRwaWQoLTEsIE5VTEwsIHN1c3BlY3RlZF9XTk9IQU5HKTsKKworICAgICAgaWYgKHBpZCA8PSAwKSBicmVhazsKKyAgICAgIG1hcmtfYXNfdGVybWluYXRlZF9wcm9jZXNzKHBpZCk7CisgICAgICBzdXNwZWN0ZWRfV05PSEFORyA9IFdOT0hBTkc7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2lwLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmNzMzMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvaXAuYwpAQCAtMCwwICsxLDI3OTUgQEAKKy8qIGlwLmMgLSBTaG93IC8gbWFuaXB1bGF0ZSByb3V0aW5nLCBkZXZpY2VzLCBwb2xpY3kgcm91dGluZyBhbmQgdHVubmVscy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTYW1lZXIgUHJha2FzaCBQcmFkaGFuIDxzYW1lZXIucC5wcmFkaGFuQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IFJham5pIEthbnQgPHJham5pa2FudDEyMzQ1QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEJpbGFsIFF1cmVzaGkgPGJpbGFsLmptaUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQuCisgKgorVVNFX0lQKE5FV1RPWShpcCwgTlVMTCwgVE9ZRkxBR19TQklOKSkKK1VTRV9JUChPTERUT1koaXBhZGRyLCBpcCwgVE9ZRkxBR19TQklOKSkKK1VTRV9JUChPTERUT1koaXBsaW5rLCBpcCwgVE9ZRkxBR19TQklOKSkKK1VTRV9JUChPTERUT1koaXByb3V0ZSwgaXAsIFRPWUZMQUdfU0JJTikpCitVU0VfSVAoT0xEVE9ZKGlwcnVsZSwgaXAsIFRPWUZMQUdfU0JJTikpCitVU0VfSVAoT0xEVE9ZKGlwdHVubmVsLCBpcCwgVE9ZRkxBR19TQklOKSkKKworY29uZmlnIElQCisgIGJvb2wgImlwIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBpcCBbIE9QVElPTlMgXSBPQkpFQ1QgeyBDT01NQU5EIH0KKworICAgIFNob3cgLyBtYW5pcHVsYXRlIHJvdXRpbmcsIGRldmljZXMsIHBvbGljeSByb3V0aW5nIGFuZCB0dW5uZWxzLgorCisgICAgd2hlcmUgT0JKRUNUIDo9IHthZGRyZXNzIHwgbGluayB8IHJvdXRlIHwgcnVsZSB8IHR1bm5lbH0KKyAgICBPUFRJT05TIDo9IHsgLWZbYW1pbHldIHsgaW5ldCB8IGluZXQ2IHwgbGluayB9IHwgLW9bbmVsaW5lXSB9CisqLworI2RlZmluZSBGT1JfaXAKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxpZmFkZHJzLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKworR0xPQkFMUygKKyAgY2hhciBzdGF0cywgc2luZ2xlbGluZSwgZmx1c2gsICpmaWx0ZXJfZGV2LCBnYnVmWzgxOTJdOworICBpbnQgc29ja2ZkLCBjb25uZWN0ZWQsIGZyb21fb2ssIHJvdXRlX2NtZDsKKyAgaW50OF90IGFkZHJlc3NmYW1pbHksIGlzX2FkZHI7CispCisKK3N0cnVjdCBhcmdsaXN0IHsKKyAgY2hhciAqbmFtZTsKKyAgaW50IGlkeDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgCit7CisgIGludCBpZmluZGV4LCBzY29wZSwgc2NvcGVtYXNrLCB1cCwgdG87CisgIGNoYXIgKmxhYmVsLCAqYWRkcjsKK30gYWRkcmluZm87CisKK3N0cnVjdCBsaW5rZGF0YSAgeworICBzdHJ1Y3QgbGlua2RhdGEgKm5leHQsICpwcmV2OworICBpbnQgZmxhZ3MsIGlmYWNlX2lkeCwgbXR1LCB0eHF1ZXVlbGVuLCBwYXJlbnQsaWZhY2VfdHlwZTsKKyAgY2hhciBxZGlzY3BsaW5lW0lGTkFNU0laKzFdLCBzdGF0ZVtJRk5BTVNJWisxXSwgdHlwZVtJRk5BTVNJWisxXSwKKyAgICAgICBpZmFjZVtJRk5BTVNJWisxXSwgbGFkZHJbNjRdLCBiY2FzdFs2NF07CisgIHN0cnVjdCAgcnRubF9saW5rX3N0YXRzIHJ0X3N0YXQ7Cit9KmxpbmZvOworCit0eXBlZGVmIGludCAoKmNtZG9iaikoY2hhciAqKmFyZ3YpOworCisjZGVmaW5lIE1FU0dfTEVOIDgxOTIKKworLy8gRm9yICIvZXRjL2lwcm91dGUyL1JQREJfdGFibGVzIgorZW51bSB7CisgIFJQREJfcnRkc2ZpZWxkID0gMSwKKyAgUlBEQl9ydHByb3RvcyA9IDIsCisgIFJQREJfcnRyZWFsbXMgPSAzLAorICBSUERCX3J0c2NvcGVzID0gNCwKKyAgUlBEQl9ydHRhYmxlcyA9IDUKK307CisKKyNkZWZpbmUgUlBEQl9FTlRSSUVTIDI1Ngorc3RhdGljIGludDhfdCBydHRhYmxlX2luaXQ7CitzdGF0aWMgaW50OF90IHJ0cHJvdG9zX2luaXQ7CitzdGF0aWMgaW50OF90IHJ0ZHNmaWVsZF9pbml0Oworc3RhdGljIGludDhfdCBydHNjb3BlX2luaXQ7CitzdGF0aWMgaW50OF90IHJ0cmVhbG1zX2luaXQ7CisKK3N0YXRpYyBzdHJ1Y3QgYXJnbGlzdCAqcnRfZHNmaWVsZFtSUERCX0VOVFJJRVNdOworc3RhdGljIHN0cnVjdCBhcmdsaXN0ICpydF9wcm90b3NbUlBEQl9FTlRSSUVTXTsKK3N0YXRpYyBzdHJ1Y3QgYXJnbGlzdCAqcnRfdGFibGVzW1JQREJfRU5UUklFU107CitzdGF0aWMgc3RydWN0IGFyZ2xpc3QgKnJ0X3JlYWxtc1tSUERCX0VOVFJJRVNdOworc3RhdGljIHN0cnVjdCBhcmdsaXN0ICpydF9zY29wZVtSUERCX0VOVFJJRVNdOworCitzdGF0aWMgc3RydWN0IGFyZ2xpc3QgcnRtdHlwZXNbXSA9IHsgeyJub25lIiwgUlROX1VOU1BFQ30sCisgIHsidW5pY2FzdCIsIFJUTl9VTklDQVNUfSwgeyJsb2NhbCIsIFJUTl9MT0NBTH0sCisgIHsiYnJvYWRjYXN0IiwgUlROX0JST0FEQ0FTVH0sIHsiYW55Y2FzdCIsIFJUTl9BTllDQVNUfSwKKyAgeyJtdWx0aWNhc3QiLCBSVE5fTVVMVElDQVNUfSwgeyJibGFja2hvbGUiLCBSVE5fQkxBQ0tIT0xFfSwKKyAgeyJ1bnJlYWNoYWJsZSIsIFJUTl9VTlJFQUNIQUJMRX0sIHsicHJvaGliaXQiLCBSVE5fUFJPSElCSVR9LAorICB7InRocm93IiwgUlROX1RIUk9XfSwgeyJuYXQiLCBSVE5fTkFUfSwKKyAgeyJ4cmVzb2x2ZSIsIFJUTl9YUkVTT0xWRX0sIHtOVUxMLCAtMX0KK307CisKK3N0YXRpYyBpbnQgZmlsdGVyX25sbWVzZyhpbnQgKCpmdW4pKHN0cnVjdCBubG1zZ2hkciAqbWhkciwgY2hhciAqKiksIGNoYXIgKiopOworc3RhdGljIGludCAgaXBhZGRyX3ByaW50KHN0cnVjdCBsaW5rZGF0YSAqLCBpbnQgZmxnKTsKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbW1vbiBDb2RlIGZvciBJUCBPcHRpb25zIChsaWtlOiBhZGRyLCBsaW5rLCByb3V0ZSBldGMuKQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgaW50IHN1YnN0cmluZ190b19pZHgoY2hhciAqc3RyLCBzdHJ1Y3QgYXJnbGlzdCAqbGlzdCkKK3sKKyAgc3RydWN0IGFyZ2xpc3QgKmFsaXN0OworICBpbnQgbGVuOworCisgIGlmICghc3RyKSByZXR1cm4gLTE7CisgIGxlbiA9IHN0cmxlbihzdHIpOworCisgIGZvciAoYWxpc3QgPSBsaXN0OyBhbGlzdC0+bmFtZTsgYWxpc3QrKykKKyAgICBpZiAoIW1lbWNtcChzdHIsIGFsaXN0LT5uYW1lLCBsZW4pKSByZXR1cm4gYWxpc3QtPmlkeDsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHN0cmluZ190b19pZHgoY2hhciAqc3RyLCBzdHJ1Y3QgYXJnbGlzdCAqbGlzdCkKK3sKKyAgc3RydWN0IGFyZ2xpc3QgKmFsaXN0OworCisgIGlmICghc3RyKSByZXR1cm4gLTE7CisgIGZvciAoYWxpc3QgPSBsaXN0OyBhbGlzdC0+bmFtZTsgYWxpc3QrKykKKyAgICBpZiAoIXN0cmNtcChzdHIsIGFsaXN0LT5uYW1lKSkgcmV0dXJuIGFsaXN0LT5pZHg7CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNoYXIgKmlkeF90b19zdHJpbmcoaW50IGlkeCwgc3RydWN0IGFyZ2xpc3QgKmxpc3QpCit7CisgIHN0cnVjdCBhcmdsaXN0ICphbGlzdDsKKworICBpZiAoaWR4IDwgMCkgcmV0dXJuIE5VTEw7CisgIGZvciAoYWxpc3QgPSBsaXN0OyBhbGlzdC0+bmFtZTsgYWxpc3QrKykKKyAgICBpZiAoaWR4ID09IGFsaXN0LT5pZHgpIHJldHVybiBhbGlzdC0+bmFtZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfbmxtZXNnKGludCB0eXBlLCBpbnQgZmxhZ3MsIGludCBmYW1pbHksCisgICAgdm9pZCAqYnVmLCBpbnQgYmxlbikKK3sKKyAgc3RydWN0IHsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIgbmxoOworICAgIHN0cnVjdCBydGdlbm1zZyBnOworICB9IHJlcTsKKworICBpZiAoIWJ1ZikgeworICAgIG1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisgICAgcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKyAgICByZXEubmxoLm5sbXNnX3R5cGUgPSB0eXBlOworICAgIHJlcS5ubGgubmxtc2dfZmxhZ3MgPSBmbGFnczsKKyAgICByZXEuZy5ydGdlbl9mYW1pbHkgPSBmYW1pbHk7CisgICAgYnVmID0gJnJlcTsKKyAgICBibGVuID0gc2l6ZW9mKHJlcSk7CisgIH0KKyAgaWYgKHNlbmQoVFQuc29ja2ZkICwgKHZvaWQqKWJ1ZiwgYmxlbiwgMCkgPCAwKQorICAgIHBlcnJvcl9leGl0KCJVbmFibGUgdG8gc2VuZCBkYXRhIG9uIHNvY2tldC4iKTsKK30KKworLy8gUGFyc2UgL2V0Yy9pcHJvdXRlMi9SUERCX3RhYmxlcyBhbmQgcHJlcGFyZSBsaXN0Lgorc3RhdGljIHZvaWQgcGFyc2VSUERCKGNoYXIgKmZuYW1lLCBzdHJ1Y3QgYXJnbGlzdCAqKmxpc3QsIGludDMyX3Qgc2l6ZSkKK3sKKyAgY2hhciAqbGluZTsKKyAgaW50IGZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCisgIGlmIChmZCA8IDApIHJldHVybjsKKyAgZm9yICg7IChsaW5lID0gZ2V0X2xpbmUoZmQpKTsgZnJlZShsaW5lKSkgeworICAgIGNoYXIgKnB0ciA9IGxpbmU7CisgICAgaW50MzJfdCBpZHg7CisKKyAgICB3aGlsZSAoKnB0ciA9PSAnICcgfHwgKnB0ciA9PSAnXHQnKSBwdHIrKzsKKyAgICBpZiAoKnB0ciA9PSAwIHx8ICpwdHIgPT0gJyMnIHx8ICpwdHIgPT0gJ1xuJykgY29udGludWU7CisgICAgaWYgKChzc2NhbmYocHRyLCAiMHgleCAlc1xuIiwgJmlkeCwgdG95YnVmKSAhPSAyKSAmJgorICAgICAgICAoc3NjYW5mKHB0ciwgIjB4JXggJXMgIyIsICZpZHgsIHRveWJ1ZikgIT0gMikgJiYKKyAgICAgICAgKHNzY2FuZihwdHIsICIlZCAlc1xuIiwgJmlkeCwgdG95YnVmKSAhPSAyKSAmJgorICAgICAgICAoc3NjYW5mKHB0ciwgIiVkICVzICMiLCAmaWR4LCB0b3lidWYpICE9IDIpKSB7CisgICAgICBlcnJvcl9tc2coIkNvcnJ1cHRlZCAnJXMnIGZpbGUiLCBmbmFtZSk7CisgICAgICB4Y2xvc2UoZmQpOworICAgICAgZnJlZShsaW5lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHNpemUpIHsKKyAgICAgIGludCBpbmRleCA9IGlkeCAmIChzaXplLTEpOworICAgICAgaWYgKGxpc3RbaW5kZXhdKSBmcmVlKGxpc3RbaW5kZXhdLT5uYW1lKTsKKyAgICAgIGVsc2UgbGlzdFtpbmRleF0gPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgYXJnbGlzdCkpOworICAgICAgbGlzdFtpbmRleF0tPmlkeCA9IGlkeDsKKyAgICAgIGxpc3RbaW5kZXhdLT5uYW1lID0geHN0cmR1cCh0b3lidWYpOworICAgIH0KKyAgfQorICB4Y2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2FsaXN0KHN0cnVjdCBhcmdsaXN0ICoqbGlzdCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7aTxSUERCX0VOVFJJRVM7aSsrKSB7CisgICAgaWYgKGxpc3RbaV0pIHsKKyAgICAgIGZyZWUobGlzdFtpXS0+bmFtZSk7CisgICAgICBmcmVlKGxpc3RbaV0pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2FyZ2xpc3Qoc3RydWN0IGFyZ2xpc3QgKipsaXN0LGludCB2YWx1ZSwgY2hhciogbmFtZSkKK3sKKyAgaWYgKCFsaXN0W3ZhbHVlXSkgbGlzdFt2YWx1ZV0gPSAgeHphbGxvYyhzaXplb2Yoc3RydWN0IGFyZ2xpc3QpKTsKKyAgbGlzdFt2YWx1ZV0tPmlkeCA9IHZhbHVlOworICBsaXN0W3ZhbHVlXS0+bmFtZSA9IHhzdHJkdXAobmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJnbGlzdCAqKmdldGxpc3QodV9pbnQ4X3Qgd2hpY2hEQikKK3sKKyAgc3RydWN0IGFyZ2xpc3QgKiphbGlzdDsKKworICBzd2l0Y2ggKHdoaWNoREIpIHsKKyAgICBjYXNlIFJQREJfcnRkc2ZpZWxkOgorICAgICAgYWxpc3QgPSBydF9kc2ZpZWxkOworICAgICAgaWYgKCFydGRzZmllbGRfaW5pdCkgeworICAgICAgICBydGRzZmllbGRfaW5pdCA9IDE7CisgICAgICAgIHBhcnNlUlBEQigiL2V0Yy9pcHJvdXRlMi9ydF9kc2ZpZWxkIiwgYWxpc3QsIEFSUkFZX0xFTihydF9kc2ZpZWxkKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFJQREJfcnRwcm90b3M6CisgICAgICBhbGlzdCA9IHJ0X3Byb3RvczsKKyAgICAgIGlmICghcnR0YWJsZV9pbml0KSB7CisgICAgICAgIHJ0cHJvdG9zX2luaXQgPSAxOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDAsIm5vbmUiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3Byb3RvcywxLCJyZWRpcmVjdCIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDIsImtlcm5lbCIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDMsImJvb3QiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3Byb3Rvcyw0LCJzdGF0aWMiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3Byb3Rvcyw4LCJnYXRlZCIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDksInJhIik7CisgICAgICAgIGluaXRfYXJnbGlzdChydF9wcm90b3MsMTAsIm1ydCIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDExLCJ6ZWJyYSIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfcHJvdG9zLDEyLCJiaXJkIik7CisgICAgICAgIHBhcnNlUlBEQigiL2V0Yy9pcHJvdXRlMi9ydF9wcm90b3MiLCBhbGlzdCwgQVJSQVlfTEVOKHJ0X3Byb3RvcykpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSUERCX3J0cmVhbG1zOgorICAgICAgYWxpc3QgPSBydF9yZWFsbXM7CisgICAgICBpZiAoIXJ0cmVhbG1zX2luaXQpIHsKKyAgICAgICAgcnRyZWFsbXNfaW5pdCA9IDE7CisgICAgICAgIGluaXRfYXJnbGlzdChydF9yZWFsbXMsMCwidW5zcGVjIik7CisgICAgICAgIHBhcnNlUlBEQigiL2V0Yy9pcHJvdXRlMi9ydF9yZWFsbXMiLCBhbGlzdCwgQVJSQVlfTEVOKHJ0X3JlYWxtcykpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSUERCX3J0c2NvcGVzOgorICAgICAgYWxpc3QgPSBydF9zY29wZTsKKyAgICAgIGlmICghcnRzY29wZV9pbml0KSB7CisgICAgICAgIHJ0c2NvcGVfaW5pdCA9IDE7CisgICAgICAgIGluaXRfYXJnbGlzdChydF9zY29wZSwwLCJnbG9iYWwiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3Njb3BlLDIwMCwic2l0ZSIpOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfc2NvcGUsMjUzLCJsaW5rIik7CisgICAgICAgIGluaXRfYXJnbGlzdChydF9zY29wZSwyNTQsImhvc3QiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3Njb3BlLDI1NSwibm93aGVyZSIpOworICAgICAgICBwYXJzZVJQREIoIi9ldGMvaXByb3V0ZTIvcnRfc2NvcGVzIiwgYWxpc3QsIEFSUkFZX0xFTihydF9zY29wZSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSUERCX3J0dGFibGVzOgorICAgICAgYWxpc3QgPSBydF90YWJsZXM7CisgICAgICBpZiAoIXJ0dGFibGVfaW5pdCkgeworICAgICAgICBydHRhYmxlX2luaXQgPSAxOworICAgICAgICBpbml0X2FyZ2xpc3QocnRfdGFibGVzLFJUX1RBQkxFX0RFRkFVTFQsImRlZmF1bHQiKTsKKyAgICAgICAgaW5pdF9hcmdsaXN0KHJ0X3RhYmxlcyxSVF9UQUJMRV9NQUlOLCJtYWluIik7CisgICAgICAgIGluaXRfYXJnbGlzdChydF90YWJsZXMsUlRfVEFCTEVfTE9DQUwsImxvY2FsIik7CisgICAgICAgIHBhcnNlUlBEQigiL2V0Yy9pcHJvdXRlMi9ydF90YWJsZXMiLCBhbGlzdCwgQVJSQVlfTEVOKHJ0X3RhYmxlcykpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogCisgICAgICBlcnJvcl9leGl0KCJ3cm9uZyBkYXRhYmFzZSIpOworICAgICAgYnJlYWs7IC8vIFVucmVhY2hhYmxlIGNvZGUuCisgIH0KKyAgcmV0dXJuIGFsaXN0OworfQorCisvKgorICogUGFyc2UgUlBCRCB0YWJsZXMgKGlmIG5vdCBwYXJzZWQgYWxyZWFkeSkuCisgKiByZXR1cm4gUlBEQiB0YWJsZSBuYW1lIGFzIHBlciBpZHguCisgKi8KK3N0YXRpYyBjaGFyICpuYW1lZnJvbVJQREIoaW50IGlkeCwgdV9pbnQ4X3Qgd2hpY2hEQikKK3sKKyAgc3RydWN0IGFyZ2xpc3QgKiphbGlzdDsKKworICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gUlBEQl9FTlRSSUVTKSB7CisgICAgc25wcmludGYodG95YnVmLCBSUERCX0VOVFJJRVMsICIldSIsIGlkeCk7CisgICAgcmV0dXJuIHRveWJ1ZjsKKyAgfQorCisgIGFsaXN0ID0gZ2V0bGlzdCh3aGljaERCKTsKKworICBpZiAoYWxpc3RbaWR4XSAmJiBhbGlzdFtpZHhdLT5uYW1lKSByZXR1cm4gYWxpc3RbaWR4XS0+bmFtZTsKKworICBpZiAod2hpY2hEQiA9PSBSUERCX3J0ZHNmaWVsZCkgc25wcmludGYodG95YnVmLCBSUERCX0VOVFJJRVMsICIweCUwMngiLCBpZHgpOworICBlbHNlIHNucHJpbnRmKHRveWJ1ZiwgUlBEQl9FTlRSSUVTLCAiJXUiLCBpZHgpOworCisgIHJldHVybiB0b3lidWY7Cit9CisKK3N0YXRpYyBpbnQgaWR4ZnJvbVJQREIoY2hhciAqbmFtZSwgdV9pbnQ4X3Qgd2hpY2hEQikKK3sKKyAgc3RydWN0IGFyZ2xpc3QgKiphbGlzdDsKKyAgbG9uZyBpID0gMDsKKyAgY2hhciAqcHRyID0gTlVMTDsKKworICBmb3IgKGFsaXN0ID0gZ2V0bGlzdCh3aGljaERCKTsgaSA8IFJQREJfRU5UUklFUzsgaSsrKSB7CisgICAgaWYgKCFhbGlzdFtpXSB8fCAhYWxpc3RbaV0tPm5hbWUpIGNvbnRpbnVlOworICAgIGlmICghc3RyY21wKGFsaXN0W2ldLT5uYW1lLCBuYW1lKSkgcmV0dXJuIGk7CisgIH0KKyAgaSA9IHN0cnRvbChuYW1lLCAmcHRyLCAwKTsKKyAgaWYgKGVycm5vIHx8IChwdHIgJiYgKnB0cikgfHwgaSA8IDAgfHwgaSA+IDI1NSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBpOworfQorCitzdGF0aWMgY2hhciAqcnRtdHlwZV9pZHgyc3RyKHVfaW50OF90IGlkeCkKK3sKKyAgY2hhciAqbmFtZSA9IGlkeF90b19zdHJpbmcoaWR4LCBydG10eXBlcyk7CisKKyAgaWYgKCFuYW1lKSBzbnByaW50Zih0b3lidWYsIFJQREJfRU5UUklFUywgIiV1IiwgaWR4KTsKKyAgZWxzZSBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiJXMiLCBuYW1lKTsKKyAgcmV0dXJuIHRveWJ1ZjsKK30KKworc3RhdGljIGludCBydG10eXBlX3N0cjJpZHgoY2hhciAqbmFtZSkKK3sKKyAgaW50IGlkeCA9IHN0cmluZ190b19pZHgobmFtZSwgcnRtdHlwZXMpOworCisgIGlmIChpZHggPCAwKSByZXR1cm4gYXRvbHhfcmFuZ2UobmFtZSwgMCwgMjU1KTsKKyAgcmV0dXJuIGlkeDsKK30KKworLyoKKyAqIFVzZWQgdG8gZ2V0IHRoZSBwcmVmaXggdmFsdWUgaW4gYmluYXJ5IGZvcm0uCisgKiBGb3IgSVB2NDogbm9uLXN0YW5kYXJkIHBhcnNpbmcgdXNlZDsgYXMgMTAuMTAgd2lsbCBiZSB0cmVhdGVkIGFzIDEwLjEwLjAuMAorICogdW5saWtlIGluZXRfYXRvbiB3aGljaCBpcyAxMC4wLjAuMTAKKyAqLworc3RhdGljIGludCBnZXRfcHJlZml4KHVpbnQzMl90ICphZGRyLCB1aW50OF90ICphZiwgY2hhciAqbmFtZSwgaW50IGZhbWlseSkKK3sKKyAgaWYgKGZhbWlseSA9PSBBRl9QQUNLRVQpIGVycm9yX2V4aXQoIiclcycgbWF5IGJlIGluZXQgcHJlZml4IiwgbmFtZSk7CisgIGlmICghbWVtY21wKG5hbWUsICJkZWZhdWx0Iiwgc3RybGVuKG5hbWUpKQorICAgICAgfHwgIW1lbWNtcChuYW1lLCAiYWxsIiwgc3RybGVuKG5hbWUpKQorICAgICAgfHwgIW1lbWNtcChuYW1lLCAiYW55Iiwgc3RybGVuKG5hbWUpKSkgeworICAgICphZiA9IGZhbWlseTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc3RyY2hyKG5hbWUsICc6JykpIHsKKyAgICAqYWYgPSBBRl9JTkVUNjsKKyAgICBpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVDYpIHJldHVybiAxOworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIG5hbWUsICh2b2lkICopYWRkcikgIT0gMSkgCisgICAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsgLy8gZm9yIElQdjQuCisgICAgY2hhciAqcHRyID0gbmFtZTsKKyAgICB1aW50OF90IGNvdW50ID0gMDsKKworICAgICphZiA9IEFGX0lORVQ7CisgICAgaWYgKGZhbWlseSAhPSBBRl9VTlNQRUMgJiYgZmFtaWx5ICE9IEFGX0lORVQpIHJldHVybiAxOworICAgIHdoaWxlICgqcHRyKSB7CisgICAgICBpbnQgdmFsLCBsZW4gPSAwOworCisgICAgICBpZiAoKnB0ciA9PSAnLicpIHB0cisrOworICAgICAgc3NjYW5mKHB0ciwgIiVkJW4iLCAmdmFsLCAmbGVuKTsKKyAgICAgIGlmICghbGVuIHx8IGxlbiA+IDMgfHwgdmFsIDwgMCB8fCB2YWwgPiAyNTUgfHwgY291bnQgPiAzKSByZXR1cm4gMTsKKyAgICAgIHB0ciArPSBsZW47CisgICAgICAoKHVpbnQ4X3QqKWFkZHIpW2NvdW50KytdID0gdmFsOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAqIFVzZWQgdG8gY2FsY3VsYXRlIG5ldG1hc2ssIHdoaWNoIGNhbiBiZSBpbiB0aGUgZm9ybSBvZgorICogZWl0aGVyIDI1NS4yNTUuMjU1LjAgb3IgMjQgb3IgZGVmYXVsdCBvciBhbnkgb3IgYWxsIHN0cmluZ3MuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X25tYXNrX3ByZWZpeCh1aW50MzJfdCAqbmV0bWFzaywgdWludDhfdCBhZiwKKyAgICBjaGFyICpuYW1lLCB1aW50OF90IGZhbWlseSkKK3sKKyAgY2hhciAqcHRyOworICB1aW50MzJfdCBuYWRkcls0XSA9IHswLH07CisgIHVpbnQ2NF90IHBsZW47CisgIHVpbnQ4X3QgbmFmID0gQUZfVU5TUEVDOworCisgICpuZXRtYXNrID0gKGFmID09IEFGX0lORVQ2KSA/IDEyOCA6IDMyOyAvLyBzZXQgZGVmYXVsdCBuZXRtYXNrCisgIHBsZW4gPSBzdHJ0b3VsKG5hbWUsICZwdHIsIDApOworCisgIGlmICghcHRyIHx8IHB0ciA9PSBuYW1lIHx8ICpwdHIgfHwgIXBsZW4gfHwgcGxlbiA+ICpuZXRtYXNrKSB7CisgICAgaWYgKGdldF9wcmVmaXgobmFkZHIsICZuYWYsIG5hbWUsIGZhbWlseSkpIHJldHVybiAtMTsKKyAgICBpZiAobmFmID09IEFGX0lORVQpIHsKKyAgICAgIHVpbnQzMl90IG1hc2sgPSBodG9ubCgqbmFkZHIpLCBob3N0ID0gfm1hc2s7CisgICAgICBpZiAoaG9zdCAmIChob3N0ICsgMSkpIHJldHVybiAtMTsKKyAgICAgIGZvciAocGxlbiA9IDA7IG1hc2s7IG1hc2sgPDw9IDEpICsrcGxlbjsKKyAgICAgIGlmIChwbGVuID4gMzIpIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgKm5ldG1hc2sgPSBwbGVuOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIHByZWZpeCwgd2hpY2ggd2lsbCBiZSBpbiBmb3JtIG9mCisgKiBlaXRoZXIgZGVmYXVsdCBvciBkZWZhdWx0L2RlZmF1bHQgb3IgZGVmYXVsdC8yNCBvciBkZWZhdWx0LzI1NS4yNTUuMjU1LjAKKyAqIG9yIDEwLjIwLjMwLjQwIG9yIDEwLjIwLjMwLjQwL2RlZmF1bHQgb3IgMTAuMjAuMzAuNDAvMjQKKyAqIG9yIDEwLjIwLjMwLjQwLzI1NS4yNTUuMjU1LjAKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfcHJlZml4KHVpbnQzMl90ICphZGRyLCB1aW50MzJfdCAqbmV0bWFzaywgdWludDhfdCAqbGVuLAorICAgIGNoYXIgKm5hbWUsIGludCBmYW1pbHkpCit7CisgIHVpbnQ4X3QgYWYgPSBBRl9VTlNQRUM7CisgIGNoYXIgKnNsYXNoID0gc3RyY2hyKG5hbWUsICcvJyk7CisKKyAgaWYgKHNsYXNoKSAqc2xhc2ggPSAwOworICBpZiAoZ2V0X3ByZWZpeChhZGRyLCAmYWYsIG5hbWUsIGZhbWlseSkpIGVycm9yX2V4aXQoIkludmFsaWQgcHJlZml4Iik7CisKKyAgaWYgKHNsYXNoKSB7IC8vIGdyYWIgbmV0bWFzay4KKyAgICBpZiAoZ2V0X25tYXNrX3ByZWZpeChuZXRtYXNrLCBhZiwgc2xhc2grMSwgZmFtaWx5KSkKKyAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgcHJlZml4Iik7CisgICAgKnNsYXNoID0nLyc7CisgIH0KKyAgZWxzZSBpZiAoYWYgPT0gQUZfSU5FVCAmJiAqYWRkcikgKm5ldG1hc2sgPSAzMjsKKyAgZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYgJiYgKCphZGRyIHx8ICooYWRkciszKSkpICpuZXRtYXNrID0gMTI4OworCisgIGlmICghKmFkZHIgJiYgIXNsYXNoICYmICFhZikgKmxlbiA9IDA7CisgIGVsc2UgKmxlbiA9IChhZiA9PSBBRl9JTkVUNikgPyAxNiA6IDQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9zdHJpbmdfdG9fcnRhdHRyKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwKKyAgICBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGFsZW4pCit7CisgIGludCBsZW4gPSBSVEFfTEVOR1RIKGFsZW4pOworICBzdHJ1Y3QgcnRhdHRyICpydGE7CisKKyAgaWYgKChpbnQpKE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW4pID4gbWF4bGVuKSByZXR1cm47CisgIHJ0YSA9IChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKiluKSArIE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikpOworICBydGEtPnJ0YV90eXBlID0gdHlwZTsKKyAgcnRhLT5ydGFfbGVuID0gbGVuOworICBtZW1jcHkoUlRBX0RBVEEocnRhKSwgZGF0YSwgYWxlbik7CisgIG4tPm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW47Cit9CisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvZGUgZm9yIGlwIGxpbmsuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgTkxNU0dfVEFJTAorI2RlZmluZSBOTE1TR19UQUlMKG5tc2cpIFwKKyAgKChzdHJ1Y3QgcnRhdHRyICopICgoKHZvaWQgKikgKG5tc2cpKSArIE5MTVNHX0FMSUdOKChubXNnKS0+bmxtc2dfbGVuKSkpCisjZW5kaWYKKworc3RhdGljIHVpbnQzMl90IGdldF9pZmFjZWluZGV4KGNoYXIgKm5hbWUsIGludCBleHQpCit7CisgIHN0cnVjdCBpZl9uYW1laW5kZXggKmlmX25pLCAqaTsKKyAgaW50IGluZGV4ID0gLTE7CisKKyAgaWZfbmkgPSBpZl9uYW1laW5kZXgoKTsKKyAgaWYgKCFpZl9uaSkgcGVycm9yX2V4aXQoImlmX25hbWVpbmRleCIpOworCisgIGZvciAoaSA9IGlmX25pOyBpLT5pZl9pbmRleCAmJiBpLT5pZl9uYW1lOyBpKyspCisgICAgaWYgKCFzdHJjbXAobmFtZSwgaS0+aWZfbmFtZSkpIHsgCisgICAgICBpbmRleCA9IGktPmlmX2luZGV4OyAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWZfZnJlZW5hbWVpbmRleChpZl9uaSk7CisgIGlmIChpbmRleCA9PSAtMSAmJiBleHQpIHBlcnJvcl9leGl0KCJjYW4ndCBmaW5kIGRldmljZSAnJXMnIiwgbmFtZSk7CisgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9od2FkZHIoY2hhciAqYXJnLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICphZGRyZXNzKQoreworICBpbnQgY291bnQgPSAwLCB2YWwsIGxlbmd0aDsKKworICB3aGlsZSAoY291bnQgPCBsZW4pIHsKKyAgICB2YWwgPSBsZW5ndGggPSAwOworICAgIGlmICghYXJnKSBlcnJvcl9leGl0KCJiYWQgaHctYWRkciAnJXMnIiwgIiIpOworICAgIGlmICgqYXJnID09ICc6JykgYXJnKyssIGNvdW50Kys7CisgICAgc3NjYW5mKGFyZywgIiUyeCVuIiwgJnZhbCwgJmxlbmd0aCk7CisgICAgaWYgKCFsZW5ndGggfHwgbGVuZ3RoID4gMikKKyAgICAgIGVycm9yX2V4aXQoImJhZCBody1hZGRyICclcyciLCBhcmcpOworICAgIGFyZyArPSBsZW5ndGg7CisgICAgY291bnQgKz0gbGVuZ3RoOworICAgICphZGRyZXNzKysgPSB2YWw7CisgIH0KK30KKworLy8gTXVsdGltYWNoID0gMSwgc2luZ2xlIG1hdGNoID0gMAorc3RhdGljIGNoYXIgKmdldF9mbGFnX3N0cmluZyhzdHJ1Y3QgYXJnbGlzdCAqYWZsYWdzLCBpbnQgZmxhZ3MsIGludCBpc211bHRpKQoreworICBzdHJ1Y3QgYXJnbGlzdCAqcCA9IGFmbGFnczsKKyAgY2hhciAqb3V0ID0gTlVMTCwgKnRtcCA9IE5VTEw7CisKKyAgZm9yICg7IHAtPm5hbWU7IHArKykgeworICAgIGludCB0ZXN0ID0gKGlzbXVsdGkgPyBwLT5pZHggJiBmbGFncyA6IDApIHx8IHAtPmlkeCA9PSBmbGFnczsKKyAgICBpZiAodGVzdCkgeyAvLyBmbGFncyBjYW4gYmUgemVybworICAgICAgdG1wID0gb3V0ID8geG1wcmludGYoIiVzLCVzIiwgb3V0LCBwLT5uYW1lKSA6IHhtcHJpbnRmKCIlcyIsIHAtPm5hbWUpOworICAgICAgaWYgKG91dCkgZnJlZShvdXQpOworICAgICAgb3V0ID0gdG1wOworICAgIH0KKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgdm9pZCB2bGFuX3BhcnNlX29wdChjaGFyICoqYXJndiwgc3RydWN0IG5sbXNnaGRyICpuLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgc3RydWN0IGFyZ2xpc3Qgdmxhbl9vcHRsaXN0W10gPSB7eyJpZCIsIDB9LCB7InByb3RvY29sIiwgMX0sIAorICAgIHsicmVvcmRlcl9oZHIiLCAyfSwgeyJndnJwIiwgM30sIHtOVUxMLC0xfX07CisgIHN0cnVjdCBhcmdsaXN0IHZsYW5fcHJvdG9saXN0W10gPSB7eyI4MDIuMXEiLCAwfSwgeyI4MDIuMWFkIiwgMX0sIHtOVUxMLC0xfX07CisgIHN0cnVjdCBhcmdsaXN0IG9uX29mZltdID0geyB7Im9uIiwgMH0sIHsib2ZmIiwgMX0sIHtOVUxMLC0xfX07CisgIGludCBpZHg7CisgIHN0cnVjdCBpZmxhX3ZsYW5fZmxhZ3MgZmxhZ3M7CisKKyAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKGZsYWdzKSk7CisgIGZvciAoOyAqYXJndjsgYXJndisrKSB7CisgICAgaW50IHBhcmFtLCBwcm90bzsKKworICAgIGlmICgoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndisrLCB2bGFuX29wdGxpc3QpKSA9PSAtMSkgaGVscF9leGl0KDApOworICAgIHN3aXRjaCAoaWR4KSB7CisgICAgICBjYXNlIDA6IC8vIEFSR19pZAorICAgICAgICBpZiAoISphcmd2KSBoZWxwX2V4aXQoMCk7CisgICAgICAgIHBhcmFtID0gYXRvbHgoKmFyZ3YpOworICAgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cihuLCBzaXplLCBJRkxBX1ZMQU5fSUQsICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOiAvLyBBUkdfcHJvdG9jb2wKKyAgICAgICAgaWYgKCEqYXJndikgZXJyb3JfZXhpdCgiSW52YWxpZCB2bGFuIGlkLiIpOworICAgICAgICBpZiAoKGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YsIHZsYW5fcHJvdG9saXN0KSkgPT0gLTEpIGhlbHBfZXhpdCgwKTsKKyAgICAgICAgaWYgKCFpZHgpIHByb3RvID0gRVRIX1BfODAyMVE7IC8vIFBST1RPXzgwMjFRIC0gMAorICAgICAgICBlbHNlIGlmIChpZHggPT0gMSkgcHJvdG8gPSAweDg4QTg7IC8vIEVUSCBQcm90b2NvbCAtIDgwMjFBRAorICAgICAgICAvLyBJRkxBIFZMQU4gUFJPVE9DT0wgLSA1CisgICAgICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKG4sIHNpemUsIDUsICZwcm90bywgc2l6ZW9mKHByb3RvKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvLyBBUkdfcmVvcmRlcl9oZHIKKyAgICAgIGNhc2UgMzogLy8gQVJHX2d2cnAKKyAgICAgICAgaWYgKChwYXJhbSA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YsIG9uX29mZikpID09IC0xKSBoZWxwX2V4aXQoMCk7CisKKyAgICAgICAgZmxhZ3MubWFzayB8PSAoaWR4IC0xKTsgLy8gVkxBTiBGTEFHIFJFT1JERVIgSGVhZGVyICAgICAgICAgICAgICAKKyAgICAgICAgZmxhZ3MuZmxhZ3MgJj0gfihpZHggLTEpOyAvLyBWTEFOIEZMQUcgUkVPUkRFUiBIZWFkZXIgICAgICAgICAgICAKKyAgICAgICAgaWYgKCFwYXJhbSkgZmxhZ3MuZmxhZ3MgfD0gKGlkeCAtMSk7IC8vIFZMQU4gRkxBRyBSRU9SREVSIEhlYWRlcgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGZsYWdzLm1hc2spIAorICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKG4sIHNpemUsIElGTEFfVkxBTl9GTEFHUywgJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKK30KKworc3RhdGljIGludCBsaW5rdXBkYXRlKGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgeworICAgIHN0cnVjdCBubG1zZ2hkciBtaGRyOworICAgIHN0cnVjdCBpZmluZm9tc2cgaW5mbzsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgfSByZXF1ZXN0OyAgCisgIGNoYXIgKm5hbWUsICpkZXYsICp0eXBlLCAqbGluaywgKmFkZHI7CisgIHN0cnVjdCBydGF0dHIgKmF0dHIgPSBOVUxMOworICBpbnQgbGVuID0gMCwgYWRkID0gKCphcmd2Wy0xXSA9PSAnYScpID8gMSA6IDA7CisKKyAgbmFtZSA9IGRldiA9IHR5cGUgPSBsaW5rID0gYWRkciA9IE5VTEw7CisgIGZvciAoOyAqYXJndjsgYXJndisrKSB7CisgICAgc3RydWN0IGFyZ2xpc3Qgb2JqZWN0bGlzdFtdID0geyB7InR5cGUiLCAwfSwgeyJuYW1lIiwgMX0sIHsibGluayIsIDJ9LCAKKyAgICAgIHsiYWRkcmVzcyIsIDN9LCB7TlVMTCwtMX19OworICAgIHVpbnQ4X3QgaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndiwgb2JqZWN0bGlzdCk7CisKKyAgICBpZiAoIWlkeCkgeworICAgICAgdHlwZSA9ICorK2FyZ3Y7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoaWR4ID09IDEpIGRldiA9IG5hbWUgPSAqKythcmd2OworICAgIGVsc2UgaWYgKGlkeCA9PSAyKSBsaW5rID0gKisrYXJndjsKKyAgICBlbHNlIGlmIChpZHggPT0gMykgYWRkciA9ICorK2FyZ3Y7CisgICAgZWxzZSBpZiAoIWRldikgbmFtZSA9IGRldiA9ICphcmd2OworICB9CisKKyAgaWYgKCFuYW1lICYmICFhZGQpCisgICAgZXJyb3JfZXhpdCgiTm90IGVub3VnaCBpbmZvcm1hdGlvbjogXCJkZXZcIiBhcmd1bWVudCBpcyByZXF1aXJlZC5cbiIpOworICBlbHNlIGlmICghdHlwZSAgJiYgYWRkKQorICAgIGVycm9yX2V4aXQoIk5vdCBlbm91Z2ggaW5mb3JtYXRpb246IFwidHlwZVwiIGFyZ3VtZW50IGlzIHJlcXVpcmVkLlxuIik7CisKKyAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworICByZXF1ZXN0Lm1oZHIubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisgIHJlcXVlc3QubWhkci5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8TkxNX0ZfQUNLOworICBpZiAoYWRkKSB7CisgICAgcmVxdWVzdC5taGRyLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOworICAgIHJlcXVlc3QubWhkci5ubG1zZ190eXBlID0gUlRNX05FV0xJTks7CisgIH0gZWxzZSB7CisgICAgcmVxdWVzdC5taGRyLm5sbXNnX3R5cGUgPSBSVE1fREVMTElOSzsKKyAgICByZXF1ZXN0LmluZm8uaWZpX2luZGV4ID0gZ2V0X2lmYWNlaW5kZXgobmFtZSwgMSk7CisgIH0KKyAgcmVxdWVzdC5pbmZvLmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGF0dHIgPSBOTE1TR19UQUlMKCZyZXF1ZXN0Lm1oZHIpOworICBpZiAodHlwZSkgeworICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKCZyZXF1ZXN0Lm1oZHIsIHNpemVvZihyZXF1ZXN0KSwKKyAgICAgICAgSUZMQV9MSU5LSU5GTywgTlVMTCwgMCk7CisgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcXVlc3QubWhkciwgc2l6ZW9mKHJlcXVlc3QpLAorICAgICAgICBJRkxBX0lORk9fS0lORCwgdHlwZSwgc3RybGVuKHR5cGUpKTsKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAidmxhbiIpKSB7CisgICAgICBzdHJ1Y3QgcnRhdHRyICpkYXRhID0gTkxNU0dfVEFJTCgmcmVxdWVzdC5taGRyKTsKKyAgICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKCZyZXF1ZXN0Lm1oZHIsIHNpemVvZihyZXF1ZXN0KSwgCisgICAgICAgICAgSUZMQV9JTkZPX0RBVEEsIE5VTEwsIDApOworICAgICAgdmxhbl9wYXJzZV9vcHQoKythcmd2LCAmcmVxdWVzdC5taGRyLCBzaXplb2YocmVxdWVzdCkpOworICAgICAgZGF0YS0+cnRhX2xlbiA9ICh2b2lkICopTkxNU0dfVEFJTCgmcmVxdWVzdC5taGRyKSAtICh2b2lkICopZGF0YTsKKyAgICB9CisgICAgYXR0ci0+cnRhX2xlbiA9ICh2b2lkICopTkxNU0dfVEFJTCgmcmVxdWVzdC5taGRyKSAtICh2b2lkICopYXR0cjsKKyAgfQorCisgIGlmIChsaW5rKSB7CisgICAgdWludDMyX3QgaWR4ID0gZ2V0X2lmYWNlaW5kZXgobGluaywgMSk7CisgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcXVlc3QubWhkciwgc2l6ZW9mKHJlcXVlc3QpLCAKKyAgICAgICAgSUZMQV9MSU5LLCAmaWR4LCBzaXplb2YodWludDMyX3QpKTsKKyAgfQorICBpZiAoYWRkcikgeworICAgIGNoYXIgYWJ1ZltJRl9OQU1FU0laRV0gPSB7MCx9OworCisgICAgZmlsbF9od2FkZHIoYWRkciwgSUZfTkFNRVNJWkUsICh1bnNpZ25lZCBjaGFyICopYWJ1Zik7CisgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcXVlc3QubWhkciwgc2l6ZW9mKHJlcXVlc3QpLCAKKyAgICAgICAgSUZMQV9BRERSRVNTLCBhYnVmLCBzdHJsZW4oYWJ1ZikpOworICB9CisgIGlmICghbmFtZSkgeworICAgIHNucHJpbnRmKHRveWJ1ZiwgSUZOQU1TSVosICIlcyVkIiwgdHlwZSwgMCk7CisgICAgZm9yIChsZW4gPSAxOyA7IGxlbisrKSB7CisgICAgICBpZiAoIWdldF9pZmFjZWluZGV4KHRveWJ1ZiwgMCkpIGJyZWFrOworICAgICAgc25wcmludGYodG95YnVmLCBJRk5BTVNJWiwgIiVzJWQiLCB0eXBlLCBsZW4pOworICAgIH0KKyAgICBuYW1lID0gdG95YnVmOworICB9CisgIGxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisgIGlmIChsZW4gPCAyIHx8IGxlbiA+IElGTkFNU0laKSBlcnJvcl9leGl0KCJJbnZhbGlkIGRldmljZSBuYW1lLiIpOworICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxdWVzdC5taGRyLCBzaXplb2YocmVxdWVzdCksIElGTEFfSUZOQU1FLCBuYW1lLCBsZW4pOworCisgIHNlbmRfbmxtZXNnKDAsIDAsIDAsICh2b2lkICopJnJlcXVlc3QsIHJlcXVlc3QubWhkci5ubG1zZ19sZW4pOworICByZXR1cm4gKGZpbHRlcl9ubG1lc2coTlVMTCxOVUxMKSk7Cit9CisKK3N0YXRpYyBpbnQgbGlua19zZXQoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBhcmdsaXN0IGNtZF9vYmplY3RsaXN0W10gPSB7eyJ1cCIsIDB9LCB7ImRvd24iLCAxfSwgeyJhcnAiLCAyfSwgCisgICAgeyJtdWx0aWNhc3QiLCAzfSwgeyJkeW5hbWljIiwgNH0sIHsibmFtZSIsIDV9LCB7InR4cXVldWVsZW4iLCA2fSwgCisgICAgeyJtdHUiLCA3fSx7ImFkZHJlc3MiLCA4fSwgeyJicm9hZGNhc3QiLCA5fSwge05VTEwsLTF9fTsKKyAgaW50IGNhc2VfZmxhZ3NbXSA9IHtJRkZfTk9BUlAsSUZGX01VTFRJQ0FTVCxJRkZfRFlOQU1JQ307CisgIHN0cnVjdCBpZnJlcSByZXE7CisgIGludCBpZHgsIGZsYWdzID0gMCwgbWFza3MgPSAweGZmZmYsIGZkOworCisgIG1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisgIGlmICghKmFyZ3YpIGVycm9yX2V4aXQoIlwiZGV2XCIgbWlzc2luZyIpOworICB4c3RybmNweShyZXEuaWZyX25hbWUsICphcmd2LCBJRl9OQU1FU0laRSk7CisgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgeGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZyZXEpOworICBmb3IgKCsrYXJndjsgKmFyZ3Y7KSB7CisgICAgaWYgKChpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2KyssIGNtZF9vYmplY3RsaXN0KSkgPT0gLTEpIGhlbHBfZXhpdCgwKTsKKyAgICBzd2l0Y2goaWR4KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGZsYWdzIHw9IElGRl9VUDsgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIG1hc2tzICY9IH5JRkZfVVA7IGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAzOgorICAgICAgY2FzZSA0OgorICAgICAgICBpZiAoISphcmd2KSBoZWxwX2V4aXQoMCk7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJvbiIpKSB7CisgICAgICAgICAgaWYgKGlkeCA9PSAyKSB7CisgICAgICAgICAgICBtYXNrcyAmPSB+Y2FzZV9mbGFnc1tpZHgtMl07CisgICAgICAgICAgICBmbGFncyAmPSB+Y2FzZV9mbGFnc1tpZHgtMl07CisgICAgICAgICAgfSBlbHNlIGZsYWdzIHw9IGNhc2VfZmxhZ3NbaWR4LTJdOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsIm9mZiIpKSB7CisgICAgICAgICAgaWYgKGlkeCA9PSAyKSB7CisgICAgICAgICAgICBtYXNrcyB8PSBjYXNlX2ZsYWdzW2lkeC0yXTsKKyAgICAgICAgICAgIGZsYWdzIHw9IGNhc2VfZmxhZ3NbaWR4LTJdOworICAgICAgICAgIH0gZWxzZSBtYXNrcyAmPSB+Y2FzZV9mbGFnc1tpZHgtMl07CisgICAgICAgIH0gZWxzZSBoZWxwX2V4aXQoMCk7CisgICAgICAgICsrYXJndjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgIHhzdHJuY3B5KHJlcS5pZnJfaWZydS5pZnJ1X25ld25hbWUsICphcmd2LCBJRl9OQU1FU0laRSk7CisgICAgICAgIHhpb2N0bChmZCwgU0lPQ1NJRk5BTUUsICZyZXEpOworICAgICAgICB4c3RybmNweShyZXEuaWZyX25hbWUsICphcmd2KyssIElGX05BTUVTSVpFKTsKKyAgICAgICAgeGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZyZXEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgcmVxLmlmcl9pZnJ1LmlmcnVfaXZhbHVlID0gYXRvbHgoKmFyZ3YrKyk7CisgICAgICAgIHhpb2N0bChmZCwgU0lPQ1NJRlRYUUxFTiwgJnJlcSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICByZXEuaWZyX2lmcnUuaWZydV9tdHUgPSBhdG9seCgqYXJndisrKTsKKyAgICAgICAgeGlvY3RsKGZkLCBTSU9DU0lGTVRVLCAmcmVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIHhpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJnJlcSk7CisgICAgICAgIGZpbGxfaHdhZGRyKCphcmd2KyssIElGX05BTUVTSVpFLCAKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopKHJlcS5pZnJfaHdhZGRyLnNhX2RhdGEpKTsKKyAgICAgICAgeGlvY3RsKGZkLCBTSU9DU0lGSFdBRERSLCAmcmVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIHhpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJnJlcSk7CisgICAgICAgIGZpbGxfaHdhZGRyKCphcmd2KyssIElGX05BTUVTSVpFLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikocmVxLmlmcl9od2FkZHIuc2FfZGF0YSkpOworICAgICAgICB4aW9jdGwoZmQsIFNJT0NTSUZIV0JST0FEQ0FTVCwgJnJlcSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICB4aW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgJnJlcSk7CisgIHJlcS5pZnJfaWZydS5pZnJ1X2ZsYWdzIHw9IGZsYWdzOworICByZXEuaWZyX2lmcnUuaWZydV9mbGFncyAmPSBtYXNrczsKKyAgeGlvY3RsKGZkLCBTSU9DU0lGRkxBR1MsICZyZXEpOworICB4Y2xvc2UoZmQpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMoc3RydWN0ICBydG5sX2xpbmtfc3RhdHMgKnJ0c3RhdCkKK3sKKyAgY2hhciAqbGluZV9mZWVkID0gKCFUVC5zaW5nbGVsaW5lID8gIlxuICAgICIgOiAiICIpOworCisgIGlmIChUVC5zdGF0cyA+IDApIHsKKyAgICB4cHJpbnRmKCIgICAgUlg6IGJ5dGVzICBwYWNrZXRzICBlcnJvcnMgICIKKyAgICAgICAgImRyb3BwZWQgIG92ZXJydW4gIG1jYXN0JXMlLTEwdSAlLTh1ICUtN3UgJS04dSAlLTh1ICUtOHVcbiIsCisgICAgICAgIGxpbmVfZmVlZCwgcnRzdGF0LT5yeF9ieXRlcywgcnRzdGF0LT5yeF9wYWNrZXRzLCBydHN0YXQtPnJ4X2Vycm9ycywKKyAgICAgICAgcnRzdGF0LT5yeF9kcm9wcGVkLCBydHN0YXQtPnJ4X292ZXJfZXJyb3JzLCBydHN0YXQtPm11bHRpY2FzdCk7CisgICAgaWYgKFRULnN0YXRzID4gMSkgeworICAgICAgeHByaW50ZigiICAgIFJYOiBlcnJvcnMgIGxlbmd0aCAgY3JjICAiCisgICAgICAgICAgImZyYW1lICBmaWZvICBtaXNzZWQlcyUtMTB1ICUtOHUgJS03dSAlLTh1ICUtOHUgJS04dVxuIiwKKyAgICAgICAgICBsaW5lX2ZlZWQsIHJ0c3RhdC0+cnhfZXJyb3JzLCBydHN0YXQtPnJ4X2xlbmd0aF9lcnJvcnMsCisgICAgICAgICAgcnRzdGF0LT5yeF9jcmNfZXJyb3JzLCBydHN0YXQtPnJ4X2ZyYW1lX2Vycm9ycywKKyAgICAgICAgICBydHN0YXQtPnJ4X2ZpZm9fZXJyb3JzLCBydHN0YXQtPnJ4X21pc3NlZF9lcnJvcnMpOworICAgIH0KKyAgICB4cHJpbnRmKCIgICAgVFg6IGJ5dGVzICBwYWNrZXRzICBlcnJvcnMgICIKKyAgICAgICAgImRyb3BwZWQgIGNhcnJpZXIgIGNvbGxzbnMlcyUtMTB1ICUtOHUgJS03dSAlLTh1ICUtOHUgJS04dVxuIiwKKyAgICAgICAgbGluZV9mZWVkLCBydHN0YXQtPnR4X2J5dGVzLCBydHN0YXQtPnR4X3BhY2tldHMsIHJ0c3RhdC0+dHhfZXJyb3JzLAorICAgICAgICBydHN0YXQtPnR4X2Ryb3BwZWQsIHJ0c3RhdC0+dHhfY2Fycmllcl9lcnJvcnMsIHJ0c3RhdC0+Y29sbGlzaW9ucyk7CisgICAgaWYgKFRULnN0YXRzID4gMSkgeworICAgICAgeHByaW50ZigiICAgIFRYOiBlcnJvcnMgIGFib3J0ZWQgIGZpZm8gIHdpbmRvdyAgIgorICAgICAgICAgICJoZWFydGJlYXQlcyUtMTB1ICUtOHUgJS03dSAlLTh1ICUtOHVcbiIsCisgICAgICAgICAgbGluZV9mZWVkLCBydHN0YXQtPnR4X2Vycm9ycywgcnRzdGF0LT50eF9hYm9ydGVkX2Vycm9ycywKKyAgICAgICAgICBydHN0YXQtPnR4X2ZpZm9fZXJyb3JzLCBydHN0YXQtPnR4X3dpbmRvd19lcnJvcnMsIAorICAgICAgICAgIHJ0c3RhdC0+dHhfaGVhcnRiZWF0X2Vycm9ycyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfbGlua19vdXRwdXQoc3RydWN0IGxpbmtkYXRhICpsaW5rKQoreworICBjaGFyICpsaW5lX2ZlZWQgPSAiICIsICpmbGFncywqcGVlciA9ICJicmQiOworICBzdHJ1Y3QgYXJnbGlzdCBpZmFjZV9mbGFnc1tdID0ge3siIiwwfSx7IlVQIiwgSUZGX1VQfSwgCisgICAgeyJCUk9BRENBU1QiLCBJRkZfQlJPQURDQVNUfSwgeyJERUJVRyIsIElGRl9ERUJVR30sCisgICAgeyJMT09QQkFDSyIsIElGRl9MT09QQkFDS30sIHsiUE9JTlRPUE9JTlQiLCBJRkZfUE9JTlRPUE9JTlR9LAorICAgIHsiTk9UUkFJTEVSUyIsIElGRl9OT1RSQUlMRVJTfSwgeyJSVU5OSU5HIiwgSUZGX1JVTk5JTkd9LAorICAgIHsiTk9BUlAiLCBJRkZfTk9BUlB9LCB7IlBST01JU0MiLElGRl9QUk9NSVNDfSwKKyAgICB7IkFMTE1VTFRJIiwgSUZGX0FMTE1VTFRJfSwgeyJNQVNURVIiLCBJRkZfTUFTVEVSfSwgeyJTTEFWRSIsIElGRl9TTEFWRX0sCisgICAgeyJNVUxUSUNBU1QiLCBJRkZfTVVMVElDQVNUfSwgeyJQT1JUU0VMIiwgSUZGX1BPUlRTRUx9LAorICAgIHsiQVVUT01FRElBIiwgSUZGX0FVVE9NRURJQX0sIHsiRFlOQU1JQyIsIElGRl9EWU5BTUlDfSwge05VTEwsLTF9fTsKKworICBpZiAobGluay0+cGFyZW50ICE9IC0xKSB7CisgICAgaW50IGZkID0gMDsKKyAgICBzdHJ1Y3QgaWZyZXEgcmVxOworCisgICAgbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKyAgICBpZl9pbmRleHRvbmFtZSggbGluay0+cGFyZW50LHJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworICAgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZUWFFMRU4sICZyZXEpKSBwZXJyb3IoIiIpOworICAgIGVsc2UgbGluay0+dHhxdWV1ZWxlbiA9IHJlcS5pZnJfaWZydS5pZnJ1X2l2YWx1ZTsKKyAgICB4Y2xvc2UoZmQpOworICB9CisKKyAgaWYgKFRULmlzX2FkZHIgJiYgYWRkcmluZm8ubGFiZWwgJiYgZm5tYXRjaChhZGRyaW5mby5sYWJlbCwgbGluay0+aWZhY2UsIDApKQorICAgIHJldHVybiAwOworCisKKyAgaWYgKCEoZmxhZ3MgPSBnZXRfZmxhZ19zdHJpbmcoaWZhY2VfZmxhZ3MsIGxpbmstPmZsYWdzLCAxKSkpCisgICAgZXJyb3JfZXhpdCgiSW52YWxpZCBkYXRhLiIpOyAgICAKKyAgaWYgKCFUVC5zaW5nbGVsaW5lKSBsaW5lX2ZlZWQ9IlxuICAgICI7CisgIGlmIChsaW5rLT5wYXJlbnQgIT0gLTEpIHsKKyAgICBjaGFyIGlmYWNlW0lGX05BTUVTSVpFXTsKKworICAgIGlmICghaWZfaW5kZXh0b25hbWUobGluay0+cGFyZW50LCBpZmFjZSkpIHBlcnJvcl9leGl0KE5VTEwpOworICAgIHNwcmludGYodG95YnVmLCIlc0AlcyIsIGxpbmstPmlmYWNlLCBpZmFjZSk7CisgIH0KKyAgaWYgKGxpbmstPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSBwZWVyID0gInBlZXIiOworICBpZiAoVFQuaXNfYWRkciAmJiBUVC5zaW5nbGVsaW5lICYmIFRULmFkZHJlc3NmYW1pbHkpCisgICAgeHByaW50ZigiJWQ6ICVzIiwgbGluay0+aWZhY2VfaWR4LAorICAgICAgICAoKGxpbmstPnBhcmVudCA9PSAtMSkgPyBsaW5rLT5pZmFjZSA6IHRveWJ1ZikpOworICBlbHNlIHhwcmludGYoIiVkOiAlczogPCVzPiBtdHUgJWQgcWRpc2MgJXMgc3RhdGUgJXMgcWxlbiAlZCIsCisgICAgICBsaW5rLT5pZmFjZV9pZHgsICgobGluay0+cGFyZW50ID09IC0xKSA/IGxpbmstPmlmYWNlIDogdG95YnVmKSwgZmxhZ3MsCisgICAgICBsaW5rLT5tdHUsIGxpbmstPnFkaXNjcGxpbmUsIGxpbmstPnN0YXRlLCBsaW5rLT50eHF1ZXVlbGVuKTsKKworICBpZiAoIVRULmFkZHJlc3NmYW1pbHkgfHwgVFQuYWRkcmVzc2ZhbWlseSA9PSBBRl9QQUNLRVQpCisgICAgeHByaW50ZigiJXNsaW5rLyVzICVzICVzICVzIiwKKyAgICAgICAgbGluZV9mZWVkLCBsaW5rLT50eXBlLCBsaW5rLT5sYWRkciwgcGVlciAsbGluay0+YmNhc3QpOworCisgIHhwdXRjKCdcbicpOworCisgIC8vdXNlciBjYW4gc3BlY2lmeSBzdGF0cyBmbGFnIHR3byB0aW1lcworICAvL29uZSBmb3Igc3RhdHMgYW5kIG90aGVyIGZvciBlcnJvcyBlLmcuIC1zIGFuZCAtcyAtcworICBwcmludF9zdGF0cygmbGluay0+cnRfc3RhdCk7CisgIGZyZWUoZmxhZ3MpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FkZHJlc3Modm9pZCAqcCwgY2hhciAqaXApCit7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyKilwOworICBzbnByaW50ZihpcCwgNjQsICIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgcHRyWzBdLCBwdHJbMV0sIHB0clsyXSwgcHRyWzNdLCBwdHJbNF0sIHB0cls1XSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xpbmtfaW5mbyhzdHJ1Y3Qgbmxtc2doZHIqIGgsc3RydWN0IGxpbmtkYXRhKiBsaW5rLGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgaWZpbmZvbXNnICppZmFjZSA9IE5MTVNHX0RBVEEoaCk7CisgIHN0cnVjdCBydGF0dHIgKmF0dHIgPSBJRkxBX1JUQShpZmFjZSk7CisgIGludCBsZW4gPSBoLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmFjZSkpOworICBzdHJ1Y3QgYXJnbGlzdCBod3R5cGVzW109e3siZ2VuZXJpYyIsMH0seyJldGhlciIsQVJQSFJEX0VUSEVSfSwKKyAgICB7Imxvb3BiYWNrIiwgQVJQSFJEX0xPT1BCQUNLfSx7InNpdCIsQVJQSFJEX1NJVH0sCisjaWZkZWYgQVJQSFJEX0lORklOSUJBTkQKKyAgICB7ImluZmluaWJhbmQiLEFSUEhSRF9JTkZJTklCQU5EfSwKKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyX1RSCisgICAgeyJpZWVlODAyIixBUlBIUkRfSUVFRTgwMn0sIHsidHIiLEFSUEhSRF9JRUVFODAyX1RSfSwKKyNlbHNlCisgICAgeyJ0ciIsQVJQSFJEX0lFRUU4MDJ9LAorI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUU4MDIxMQorICAgIHsiaWVlZTgwMi4xMSIsQVJQSFJEX0lFRUU4MDIxMX0sCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTEzOTQKKyAgICB7ImllZWUxMzk0IixBUlBIUkRfSUVFRTEzOTR9LAorI2VuZGlmCisgICAgeyJpcmRhIixBUlBIUkRfSVJEQX0seyJzbGlwIixBUlBIUkRfU0xJUH0seyJjc2xpcCIsQVJQSFJEX0NTTElQfSwKKyAgICB7InNsaXA2IixBUlBIUkRfU0xJUDZ9LCB7ImNzbGlwNiIsQVJQSFJEX0NTTElQNn0sIHsicHBwIixBUlBIUkRfUFBQfSwKKyAgICB7ImlwaXAiLEFSUEhSRF9UVU5ORUx9LCB7InR1bm5lbDYiLEFSUEhSRF9UVU5ORUw2fSwKKyAgICB7ImdyZSIsQVJQSFJEX0lQR1JFfSwKKyNpZmRlZiBBUlBIUkRfVk9JRAorICAgIHsidm9pZCIsQVJQSFJEX1ZPSUR9LAorI2VuZGlmCisgICAge05VTEwsLTF9fTsKKyAgY2hhciAqbG5hbWUgPSBnZXRfZmxhZ19zdHJpbmcoaHd0eXBlcywgaWZhY2UtPmlmaV90eXBlLCAwKTsKKworICBsaW5rLT5uZXh0ID0gbGluay0+cHJldiA9IDA7CisgIGxpbmstPmlmYWNlX3R5cGUgPSBpZmFjZS0+aWZpX3R5cGU7CisgIGlmICghbG5hbWUpIGVycm9yX2V4aXQoIkludmFsaWQgbGluay4iKTsKKyAgeHN0cm5jcHkobGluay0+dHlwZSwgbG5hbWUsIElGTkFNU0laKTsKKyAgZnJlZShsbmFtZSk7CisgIGxpbmstPmlmYWNlX2lkeCA9IGlmYWNlLT5pZmlfaW5kZXg7CisgIGxpbmstPmZsYWdzID0gaWZhY2UtPmlmaV9mbGFnczsKKyAgaWYgKCphcmd2ICYmICFzdHJjYXNlY21wKCJ1cCIsKmFyZ3YpICYmICEobGluay0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm4gMTsKKyAgbGluay0+cGFyZW50ID0gIC0xOworICBmb3IgKDsgUlRBX09LKGF0dHIsIGxlbik7IGF0dHIgPSBSVEFfTkVYVChhdHRyLCBsZW4pKSB7CisgICAgc3dpdGNoKGF0dHItPnJ0YV90eXBlKSB7CisgICAgICBjYXNlIElGTEFfSUZOQU1FOgorICAgICAgICBzbnByaW50ZihsaW5rLT5pZmFjZSwgSUZOQU1TSVosICIlcyIsKGNoYXIgKikgUlRBX0RBVEEoYXR0cikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUZMQV9BRERSRVNTOgorICAgICAgICBpZiAoIGlmYWNlLT5pZmlfdHlwZT09IEFSUEhSRF9UVU5ORUwgfHwKKyAgICAgICAgICAgIGlmYWNlLT5pZmlfdHlwZSA9PSBBUlBIUkRfU0lUIHx8CisgICAgICAgICAgICBpZmFjZS0+aWZpX3R5cGUgPT0gQVJQSFJEX0lQR1JFKQorICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVULCBSVEFfREFUQShhdHRyKSwgbGluay0+bGFkZHIsIDY0KTsKKyAgICAgICAgZWxzZSBmaWxsX2FkZHJlc3MoUlRBX0RBVEEoYXR0ciksIGxpbmstPmxhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElGTEFfQlJPQURDQVNUOgorICAgICAgICBpZiAoaWZhY2UtPmlmaV90eXBlPT0gQVJQSFJEX1RVTk5FTCB8fAorICAgICAgICAgICAgaWZhY2UtPmlmaV90eXBlID09IEFSUEhSRF9TSVQgfHwKKyAgICAgICAgICAgIGlmYWNlLT5pZmlfdHlwZSA9PSBBUlBIUkRfSVBHUkUpCisgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQsIFJUQV9EQVRBKGF0dHIpLCBsaW5rLT5iY2FzdCwgNjQpOworICAgICAgICBlbHNlICBmaWxsX2FkZHJlc3MoUlRBX0RBVEEoYXR0ciksIGxpbmstPmJjYXN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElGTEFfTVRVOgorICAgICAgICBsaW5rLT5tdHUgPSAqKChpbnQqKShSVEFfREFUQShhdHRyKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSUZMQV9RRElTQzoKKyAgICAgICAgc25wcmludGYobGluay0+cWRpc2NwbGluZSwgSUZOQU1TSVosICIlcyIsIChjaGFyICopIFJUQV9EQVRBKGF0dHIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElGTEFfU1RBVFMgIDoKKyAgICAgICAgbGluay0+cnRfc3RhdCA9ICooKHN0cnVjdCBydG5sX2xpbmtfc3RhdHMqKSBSVEFfREFUQShhdHRyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRkxBX0xJTks6CisgICAgICAgIGxpbmstPnBhcmVudCA9ICooKGludCopKFJUQV9EQVRBKGF0dHIpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRkxBX1RYUUxFTjoKKyAgICAgICAgbGluay0+dHhxdWV1ZWxlbiA9ICooKGludCopKFJUQV9EQVRBKGF0dHIpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRkxBX09QRVJTVEFURTogCisgICAgICAgIHsKKyAgICAgICAgICBzdHJ1Y3QgYXJnbGlzdCBmbGFnc1tdPXt7IlVOS05PV04iLCAwfSwgeyJOT1RQUkVTRU5UIiwgMX0sIAorICAgICAgICAgICAgeyJET1dOIiwgMn0sIHsiTE9XRVJMQVlFUkRPV04iLCAzfSwgeyJURVNUSU5HIiwgNH0sIAorICAgICAgICAgICAgeyJET1JNQU5UIiwgNX0sIHsiVVAiLCA2fSwge05VTEwsIC0xfX07CisgICAgICAgICAgaWYgKCEobG5hbWUgPSBnZXRfZmxhZ19zdHJpbmcoZmxhZ3MsICooKGludCopKFJUQV9EQVRBKGF0dHIpKSksIDApKSkKKyAgICAgICAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgc3RhdGUuIik7CisgICAgICAgICAgeHN0cm5jcHkobGluay0+c3RhdGUsIGxuYW1lLElGTkFNU0laKTsKKyAgICAgICAgICBmcmVlKGxuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXNwbGF5X2xpbmtfaW5mbyhzdHJ1Y3Qgbmxtc2doZHIgKm1oZHIsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgbGlua2RhdGEgbGluazsKKworICBpZiAoIWdldF9saW5rX2luZm8obWhkciwgJmxpbmssIGFyZ3YpKSB7CisgICAgaWYgKFRULmlzX2FkZHIpIHsKKyAgICAgIHN0cnVjdCBsaW5rZGF0YSAqbG5rID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGxpbmtkYXRhKSk7CisgICAgICBtZW1jcHkobG5rLCAmbGluaywgc2l6ZW9mKHN0cnVjdCBsaW5rZGF0YSkpOworICAgICAgZGxpc3RfYWRkX25vbWFsbG9jKChzdHJ1Y3QgZG91YmxlX2xpc3QgKiopJmxpbmZvLAorICAgICAgICAgIChzdHJ1Y3QgZG91YmxlX2xpc3QgKilsbmspOworICAgIH0KKyAgICBlbHNlIHByaW50X2xpbmtfb3V0cHV0KCZsaW5rKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaW5rX3Nob3coY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCB7CisgICAgc3RydWN0IG5sbXNnaGRyIG1oZHI7CisgICAgc3RydWN0IGlmaW5mb21zZyBpbmZvOworICB9IHJlcXVlc3Q7CisgIHVpbnQzMl90IGluZGV4ID0gMDsKKworICBpZiAoKmFyZ3YgJiYgc3RyY2FzZWNtcCgidXAiLCphcmd2KSkgaW5kZXggPSBnZXRfaWZhY2VpbmRleCgqYXJndiwgMSk7CisgIG1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworICByZXF1ZXN0Lm1oZHIubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfE5MTV9GX0FDSzsKKyAgaWYgKCFpbmRleCkgcmVxdWVzdC5taGRyLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0g7CisgIGVsc2UgcmVxdWVzdC5pbmZvLmlmaV9jaGFuZ2UgPSAgMHhmZmZmZmZmZjsgLy8gdXNlZCBpbiBzaW5nbGUgb3BlcmF0aW9uCisgIHJlcXVlc3QubWhkci5ubG1zZ190eXBlID0gUlRNX0dFVExJTks7CisgIHJlcXVlc3QuaW5mby5pZmlfaW5kZXggPSBpbmRleDsKKyAgcmVxdWVzdC5pbmZvLmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIHNlbmRfbmxtZXNnKDAsIDAsIDAsICh2b2lkKikmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpKTsKKyAgcmV0dXJuIChmaWx0ZXJfbmxtZXNnKGRpc3BsYXlfbGlua19pbmZvLCBhcmd2KSk7Cit9CisKK3N0YXRpYyBpbnQgaXBsaW5rKGNoYXIgKiphcmd2KQoreworICBpbnQgaWR4OworICBjbWRvYmogaXBjbWQsIGNtZG9iamxpc3RbXSA9IHtsaW5rdXBkYXRlLCBsaW5rX3NldCwgbGlua19zaG93fTsKKyAgc3RydWN0IGFyZ2xpc3QgY21kX29iamVjdGxpc3RbXSA9IHt7ImFkZCIsIDB9LCB7ImRlbGV0ZSIsIDB9LAorICAgIHsic2V0IiwgMX0sIHsic2hvdyIsIDJ9LCB7Imxpc3QiLCAyfSwgeyJsc3QiLCAyfSwge05VTEwsLTF9fTsKKworICBpZiAoISphcmd2KSBpZHggPSAyOworICBlbHNlIGlmICgoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndisrLCBjbWRfb2JqZWN0bGlzdCkpID09IC0xKQorICAgIGhlbHBfZXhpdCgwKTsKKyAgaXBjbWQgPSBjbWRvYmpsaXN0W2lkeF07CisgIHJldHVybiBpcGNtZChhcmd2KTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb2RlIGZvciBpcCBhZGRyLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgcHJpbnRfYWRkcmluZm8oc3RydWN0IG5sbXNnaGRyICpoLCBpbnQgZmxhZ19sKQoreworICBzdHJ1Y3QgcnRhdHRyICpydGEsICpydGFfdGJbSUZBX01BWCsxXSA9IHswLH07CisgIGNoYXIgKmZhbWlseSA9IHRveWJ1ZiwgKnNjb3BlID0gdG95YnVmKzI1NiwgKmxhYmVsID0gdG95YnVmKzUxMiwKKyAgICAgICAqYnJkID0gdG95YnVmKzc2OCwgKnBlZXIgPSB0b3lidWYrMTAyNCwgKmFueSA9IHRveWJ1ZisxMjgwLAorICAgICAgIGxidWZbSU5FVDZfQUREUlNUUkxFTl0gPSB7MCx9LCBsYnVmX2lmYVtJTkVUNl9BRERSU1RSTEVOXSA9IHswLH07CisgIHN0cnVjdCBpZmFkZHJtc2cgKmlmYSA9IE5MTVNHX0RBVEEoaCk7CisgIGludCBsZW47CisKKyAgaWYgKChsZW4gPSBoLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmEpKSkgPCAwKSB7CisgICAgZXJyb3JfbXNnKCJ3cm9uZyBubG1zZyBsZW4gJWQiLCBsZW4pOworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChydGEgPSBJRkFfUlRBKGlmYSk7IFJUQV9PSyhydGEsIGxlbik7IHJ0YT1SVEFfTkVYVChydGEsIGxlbikpCisgICAgaWYgKHJ0YS0+cnRhX3R5cGUgPD0gSUZBX01BWCkgcnRhX3RiW3J0YS0+cnRhX3R5cGVdID0gcnRhOworCisgIGlmICghcnRhX3RiW0lGQV9MT0NBTF0pIHJ0YV90YltJRkFfTE9DQUxdID0gcnRhX3RiW0lGQV9BRERSRVNTXTsKKyAgaWYgKCFydGFfdGJbSUZBX0FERFJFU1NdKSBydGFfdGJbSUZBX0FERFJFU1NdID0gcnRhX3RiW0lGQV9MT0NBTF07CisgIGlmICgoYWRkcmluZm8uc2NvcGUgXiBpZmEtPmlmYV9zY29wZSkmYWRkcmluZm8uc2NvcGVtYXNrKSByZXR1cm4gMDsKKyAgaWYgKGFkZHJpbmZvLmlmaW5kZXggJiYgYWRkcmluZm8uaWZpbmRleCAhPSBpZmEtPmlmYV9pbmRleCkgcmV0dXJuIDA7CisKKyAgaWYgKGZsYWdfbCAmJiBhZGRyaW5mby5sYWJlbCAmJiBpZmEtPmlmYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHJldHVybiAwOworICBpZiAoKHJ0YV90YltJRkFfTEFCRUxdKSkgeworICAgIHhzdHJuY3B5KGxhYmVsLCBSVEFfREFUQShydGFfdGJbSUZBX0xBQkVMXSksIDI1Nik7CisgICAgbGFiZWxbMjU1XSA9ICdcMCc7CisgICAgaWYgKGFkZHJpbmZvLmxhYmVsICYmIGZubWF0Y2goYWRkcmluZm8ubGFiZWwsIGxhYmVsLCAwKSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKFRULmZsdXNoKSB7CisgICAgaWYgKGlmYS0+aWZhX2luZGV4ID09IGFkZHJpbmZvLmlmaW5kZXgpIHsKKyAgICAgIGgtPm5sbXNnX3R5cGUgPSBSVE1fREVMQUREUjsKKyAgICAgIGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKyAgICAgIHNlbmRfbmxtZXNnKFJUTV9ERUxBRERSLCAwLCAwLCBoLCBoLT5ubG1zZ19sZW4pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGgtPm5sbXNnX3R5cGUgPT0gUlRNX0RFTEFERFIpIHByaW50ZigiRGVsZXRlZCAiKTsKKworICBpZiAoVFQuc2luZ2xlbGluZSkgeworICAgIGlmICghaWZfaW5kZXh0b25hbWUoaWZhLT5pZmFfaW5kZXgsIGxidWYpKSBwZXJyb3JfZXhpdChOVUxMKTsKKyAgICBwcmludGYoIiV1OiAlcyIsaWZhLT5pZmFfaW5kZXgsIGxidWYpOworICB9CisKKyAgc3ByaW50ZihzY29wZSwgIiBzY29wZSAlcyAiLCBuYW1lZnJvbVJQREIoaWZhLT5pZmFfc2NvcGUsIFJQREJfcnRzY29wZXMpKTsKKworICBpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQpIHN0cmNweShmYW1pbHksICIgICAgaW5ldCAiKTsKKyAgZWxzZSBpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQ2KSBzdHJjcHkoZmFtaWx5LCAiICAgIGluZXQ2ICIpOworICBlbHNlIHNwcmludGYoZmFtaWx5LCAiICAgIGZhbWlseSAlZCIsIGlmYS0+aWZhX2ZhbWlseSk7CisKKyAgaWYgKHJ0YV90YltJRkFfTE9DQUxdKSB7CisgICAgaWYgKCFpbmV0X250b3AoaWZhLT5pZmFfZmFtaWx5LCBSVEFfREFUQShydGFfdGJbSUZBX0xPQ0FMXSksCisgICAgICAgICAgbGJ1Ziwgc2l6ZW9mKGxidWYpKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKworICAgIHNwcmludGYoZmFtaWx5K3N0cmxlbihmYW1pbHkpLCBsYnVmLCBzdHJsZW4obGJ1ZikpOworICAgIGlmICghcnRhX3RiW0lGQV9BRERSRVNTXSB8fCAhbWVtY21wKFJUQV9EQVRBKHJ0YV90YltJRkFfQUREUkVTU10pLAorICAgICAgICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwgNCkpCisgICAgICBzcHJpbnRmKGZhbWlseStzdHJsZW4oZmFtaWx5KSwgIi8lZCAiLCBpZmEtPmlmYV9wcmVmaXhsZW4pOworICAgIGVsc2UgeworICAgICAgaWYgKCFpbmV0X250b3AoaWZhLT5pZmFfZmFtaWx5LCBSVEFfREFUQShydGFfdGJbSUZBX0FERFJFU1NdKSwKKyAgICAgICAgICAgIGxidWZfaWZhLCBzaXplb2YobGJ1Zl9pZmEpKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKyAgICAgIHNwcmludGYocGVlciwgIiBwZWVyICVzLyVkICIsIGxidWZfaWZhLCBpZmEtPmlmYV9wcmVmaXhsZW4pOworICAgIH0KKyAgfQorCisgIGlmIChhZGRyaW5mby50byAmJiBzdHJjbXAoYWRkcmluZm8uYWRkciwgbGJ1ZikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHJ0YV90YltJRkFfQlJPQURDQVNUXSkgeworICAgIGlmICghaW5ldF9udG9wKGlmYS0+aWZhX2ZhbWlseSwgUlRBX0RBVEEocnRhX3RiW0lGQV9CUk9BRENBU1RdKSwKKyAgICAgICAgICBsYnVmLCBzaXplb2YobGJ1ZikpKSBwZXJyb3JfZXhpdCgiaW5ldCIpOworICAgIHNwcmludGYoYnJkLCAiIGJyZCAlcyIsIGxidWYpOworICB9ZWxzZSBicmQgPSAiIjsKKworICBpZiAocnRhX3RiW0lGQV9BTllDQVNUXSkgeworICAgIGlmICghaW5ldF9udG9wKGlmYS0+aWZhX2ZhbWlseSwgUlRBX0RBVEEocnRhX3RiW0lGQV9BTllDQVNUXSksCisgICAgICAgICAgbGJ1Ziwgc2l6ZW9mKGxidWYpKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKyAgICBzcHJpbnRmKGFueSwgIiBhbnkgJXMiLCBsYnVmKTsKKyAgfQorCisgIGlmIChpZmEtPmlmYV9mYW1pbHkgPT0gQUZfSU5FVCkKKyAgICBwcmludGYoIiVzJXMlcyVzJXMgJWMiLCBmYW1pbHksIGJyZCwgcGVlciwgc2NvcGUsIGxhYmVsLAorICAgICAgICAoVFQuc2luZ2xlbGluZT8gJ1wwJyA6ICdcbicpKTsKKyAgZWxzZSBwcmludGYoIiVzJXMgJWMiLCBmYW1pbHksIHNjb3BlLCAoVFQuc2luZ2xlbGluZT8gJ1wwJyA6ICdcbicpKTsKKyAgaWYgKFRULnNpbmdsZWxpbmUgJiYgKGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUKSkgeHB1dGMoJ1xuJyk7CisKKyAgaWYgKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSkgeworICAgIHN0cnVjdCBpZmFfY2FjaGVpbmZvICpjaSA9IFJUQV9EQVRBKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSk7CisKKyAgICBwcmludGYoIiVjICAgICAgdmFsaWRfbGZ0ICIsIChUVC5zaW5nbGVsaW5lPyAnXFwnIDogJ1wwJykpOworICAgIGlmIChjaS0+aWZhX3ZhbGlkID09ICAweEZGRkZGRkZGVSkgcHJpbnRmKCJmb3JldmVyIik7CisgICAgZWxzZSBwcmludGYoIiV1c2VjIiwgY2ktPmlmYV92YWxpZCk7CisgICAgcHJpbnRmKCIgcHJlZmVycmVkX2xmdCAiKTsKKyAgICBpZiAoY2ktPmlmYV9wcmVmZXJlZCA9PSAgMHhGRkZGRkZGRlUpIHByaW50ZigiZm9yZXZlciIpOworICAgIGVsc2UgcHJpbnRmKCIlZHNlYyIsIGNpLT5pZmFfcHJlZmVyZWQpOworICAgIHhwdXRjKCdcbicpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcnVwZGF0ZShjaGFyICoqYXJndikKK3sKKyAgaW50IGxlbmd0aCwgY21kID0gIW1lbWNtcCgiYWRkIiwgYXJndlstMV0sIHN0cmxlbihhcmd2Wy0xXSkpCisgICAgPyBSVE1fTkVXQUREUjogUlRNX0RFTEFERFI7CisgIGludCBpZHggPSAwLGxlbmd0aF9icmQgPSAwLCBsZW5ndGhfcGVlciA9IDAsbGVuZ3RoX2FueSA9IDAsbGVuZ3RoX2xvY2FsID0gMCwKKyAgICAgIHNjb3BlZCA9IDA7CisgIGNoYXIgKmRldiA9IE5VTEwsKmxhYmVsID0gTlVMTCwgcmVwbHlbODE5Ml07CisKKyAgc3RydWN0IG5sbXNnaGRyICphZGRyX3B0ciA9IE5VTEw7CisgIHN0cnVjdCBubG1zZ2VyciAqZXJyID0gTlVMTDsKKyAgc3RydWN0IGFyZ2xpc3QgY21kX29iamVjdGxpc3RbXSA9IHt7ImRldiIsMH0sIHsicGVlciIsIDF9LAorICAgIHsicmVtb3RlIiwgMn0sIHsiYnJvYWRjYXN0IiwgM30sIHsiYnJkIiwgNH0sIHsibGFiZWwiLCA1fSwKKyAgICB7ImFueWNhc3QiLCA2fSx7InNjb3BlIiwgN30sIHsibG9jYWwiLCA4fSwge05VTEwsIC0xfX07CisgIHN0cnVjdCB7CisgICAgc3RydWN0IG5sbXNnaGRyIG5sbTsKKyAgICBzdHJ1Y3QgaWZhZGRybXNnIGlmYWRkOworICAgIGNoYXIgYnVmWzI1Nl07CisgIH0gcmVxOworICB0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZhbWlseSwgYnl0ZWxlbiwgYml0bGVuOworICAgIF9fdTMyICBkYXRhWzhdOworICB9IG9wdGlvbl9kYXRhOworICBvcHRpb25fZGF0YSBsb2NhbDsKKworICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworICByZXEubmxtLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpOworICByZXEubmxtLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVHxOTE1fRl9BQ0s7CisgIHJlcS5ubG0ubmxtc2dfdHlwZSA9IGNtZDsKKyAgcmVxLmlmYWRkLmlmYV9mYW1pbHkgPSBUVC5hZGRyZXNzZmFtaWx5OworCisgIHdoaWxlICgqYXJndikgeworICAgIGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YsIGNtZF9vYmplY3RsaXN0KTsKKyAgICBpZiAoaWR4ID49IDApCisgICAgICBpZiAoISorK2FyZ3YpCisgICAgICAgIGVycm9yX2V4aXQoIkluY29tcGxldGUgQ29tbWFuZCBsaW5lIik7CisgICAgc3dpdGNoKGlkeCkgeworICAgICAgY2FzZSAwOgorICAgICAgICBkZXYgPSAqYXJndjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICB1aW50MzJfdCBhZGRyWzRdID0gezAsfSwgbmV0bWFzayA9IDA7CisgICAgICAgICAgdWludDhfdCBsZW4gPSAwOworICAgICAgICAgIHBhcnNlX3ByZWZpeChhZGRyLCAmbmV0bWFzaywgJmxlbiwgKmFyZ3YsCisgICAgICAgICAgICAgIHJlcS5pZmFkZC5pZmFfZmFtaWx5KTsKKyAgICAgICAgICBpZiAobGVuKQorICAgICAgICAgICAgcmVxLmlmYWRkLmlmYV9mYW1pbHkgPSAoKGxlbiA9PSA0KSA/IEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICAgICAgbGVuZ3RoX3BlZXIgPSBsZW47CisgICAgICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5ubG0sIHNpemVvZihyZXEpLAorICAgICAgICAgICAgICBJRkFfQUREUkVTUywgYWRkciwgbGVuKTsKKyAgICAgICAgICByZXEuaWZhZGQuaWZhX3ByZWZpeGxlbiA9IG5ldG1hc2s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmICgqYXJndlswXSA9PSAnKycpIHsKKyAgICAgICAgICBsZW5ndGhfYnJkID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoKmFyZ3ZbMF0gPT0gJy0nKSB7CisgICAgICAgICAgbGVuZ3RoX2JyZCA9IC0yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVpbnQzMl90IGFkZHJbNF0gPSB7MCx9OworICAgICAgICAgIHVpbnQ4X3QgYWYgPSBBRl9VTlNQRUM7CisKKyAgICAgICAgICBpZiAoZ2V0X3ByZWZpeChhZGRyLCAmYWYsICphcmd2LCByZXEuaWZhZGQuaWZhX2ZhbWlseSkpCisgICAgICAgICAgICBlcnJvcl9leGl0KCJJbnZhbGlkIHByZWZpeCIpOworCisgICAgICAgICAgbGVuZ3RoX2JyZCA9ICgoYWYgPT0gQUZfSU5FVDYpID8gMTYgOiA0KTsKKyAgICAgICAgICBpZiAocmVxLmlmYWRkLmlmYV9mYW1pbHkgPT0gQUZfVU5TUEVDKQorICAgICAgICAgICAgcmVxLmlmYWRkLmlmYV9mYW1pbHkgPSBhZjsKKyAgICAgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLm5sbSwgc2l6ZW9mKHJlcSksCisgICAgICAgICAgICAgIElGQV9CUk9BRENBU1QsICZhZGRyLCBsZW5ndGhfYnJkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgbGFiZWwgPSAqYXJndjsKKyAgICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5ubG0sIHNpemVvZihyZXEpLAorICAgICAgICAgICAgSUZBX0xBQkVMLCBsYWJlbCwgc3RybGVuKGxhYmVsKSArIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgeworICAgICAgICAgIHVpbnQzMl90IGFkZHJbNF0gPSB7MCx9OworICAgICAgICAgIHVpbnQ4X3QgYWYgPSBBRl9VTlNQRUM7CisKKyAgICAgICAgICBpZiAoZ2V0X3ByZWZpeChhZGRyLCAmYWYsICphcmd2LCByZXEuaWZhZGQuaWZhX2ZhbWlseSkpCisgICAgICAgICAgICBlcnJvcl9leGl0KCJJbnZhbGlkIHByZWZpeCIpOworICAgICAgICAgIGxlbmd0aF9hbnkgPSAoKGFmID09IEFGX0lORVQ2KSA/IDE2IDogNCk7CisgICAgICAgICAgaWYgKHJlcS5pZmFkZC5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykKKyAgICAgICAgICAgIHJlcS5pZmFkZC5pZmFfZmFtaWx5ID0gYWY7CisgICAgICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5ubG0sIHNpemVvZihyZXEpLAorICAgICAgICAgICAgICBJRkFfQU5ZQ0FTVCwgJmFkZHIsIGxlbmd0aF9hbnkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICB7CisgICAgICAgICAgaW50IHNjb3BlID0gaWR4ZnJvbVJQREIoKmFyZ3YsIFJQREJfcnRzY29wZXMpOworICAgICAgICAgIGlmIChzY29wZSA8IDApIGVycm9yX2V4aXQoIndyb25nIHNjb3BlICclcyciLCAqYXJndik7CisgICAgICAgICAgcmVxLmlmYWRkLmlmYV9zY29wZSA9IHNjb3BlOworICAgICAgICAgIHNjb3BlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgLy9sb2NhbCBpcyBieSBkZWZhdWx0CisgICAgICAgICAgdWludDMyX3QgYWRkcls4XSA9IHswLH0sIG5ldG1hc2sgPSAwOworICAgICAgICAgIHVpbnQ4X3QgbGVuID0gMDsKKworICAgICAgICAgIHBhcnNlX3ByZWZpeChhZGRyLCAmbmV0bWFzaywgJmxlbiwgKmFyZ3YsCisgICAgICAgICAgICAgIHJlcS5pZmFkZC5pZmFfZmFtaWx5KTsKKyAgICAgICAgICBpZiAobGVuKQorICAgICAgICAgICAgcmVxLmlmYWRkLmlmYV9mYW1pbHkgPSAoKGxlbiA9PSA0KSA/IEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICAgICAgbGVuZ3RoX2xvY2FsID0gbGVuOworICAgICAgICAgIGxvY2FsLmJpdGxlbiA9IG5ldG1hc2s7CisgICAgICAgICAgbG9jYWwuYnl0ZWxlbiA9IGxlbjsKKyAgICAgICAgICBtZW1jcHkobG9jYWwuZGF0YSwgYWRkciwgc2l6ZW9mKGxvY2FsLmRhdGEpKTsKKyAgICAgICAgICBsb2NhbC5mYW1pbHkgPSByZXEuaWZhZGQuaWZhX2ZhbWlseTsKKyAgICAgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLm5sbSwgc2l6ZW9mKHJlcSksCisgICAgICAgICAgICAgIElGQV9MT0NBTCwgJmxvY2FsLmRhdGEsIGxvY2FsLmJ5dGVsZW4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhcmd2Kys7CisgIH0KKyAgaWYgKCFkZXYpIGVycm9yX2V4aXQoIm5lZWQgXCJkZXYgXCIgYXJndW1lbnQiKTsKKyAgaWYgKGxhYmVsICYmIHN0cm5jbXAoZGV2LCBsYWJlbCwgc3RybGVuKGRldikpICE9IDApCisgICAgZXJyb3JfZXhpdCgiXCJkZXZcIiAoJXMpIG11c3QgbWF0Y2ggXCJsYWJlbFwiICglcykiLCBkZXYsIGxhYmVsKTsKKworICBpZiAobGVuZ3RoX3BlZXIgPT0gMCAmJiBsZW5ndGhfbG9jYWwgJiYgY21kICE9IFJUTV9ERUxBRERSKXsKKyAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLm5sbSwgc2l6ZW9mKHJlcSksCisgICAgICAgIElGQV9BRERSRVNTLCAmbG9jYWwuZGF0YSwgbG9jYWwuYnl0ZWxlbik7CisgIH0KKworICBpZiAobGVuZ3RoX2JyZCA8IDAgJiYgY21kICE9IFJUTV9ERUxBRERSKXsKKyAgICBpbnQgaTsKKworICAgIGlmIChyZXEuaWZhZGQuaWZhX2ZhbWlseSAhPSBBRl9JTkVUKQorICAgICAgZXJyb3JfZXhpdCgiYnJvYWRjYXN0IGNhbiBiZSBzZXQgb25seSBmb3IgSVB2NCBhZGRyZXNzZXMiKTsKKworICAgIGlmIChsb2NhbC5iaXRsZW4gPD0gMzApIHsKKyAgICAgIGZvciAoaSA9IDMxOyBpID49IGxvY2FsLmJpdGxlbjsgaS0tKSB7CisgICAgICAgIGlmIChsZW5ndGhfYnJkID09IC0xKQorICAgICAgICAgIGxvY2FsLmRhdGFbMF0gfD0gaHRvbmwoMTw8KDMxLWkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxvY2FsLmRhdGFbMF0gJj0gfmh0b25sKDE8PCgzMS1pKSk7CisgICAgICB9CisgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLm5sbSwgc2l6ZW9mKHJlcSksCisgICAgICAgICAgSUZBX0JST0FEQ0FTVCwgJmxvY2FsLmRhdGEsIGxvY2FsLmJ5dGVsZW4pOworICAgICAgbGVuZ3RoX2JyZCA9IGxvY2FsLmJ5dGVsZW47CisgICAgfQorICB9CisgIGlmIChyZXEuaWZhZGQuaWZhX3ByZWZpeGxlbiA9PSAwKQorICAgIHJlcS5pZmFkZC5pZmFfcHJlZml4bGVuID0gbG9jYWwuYml0bGVuOworICBpZiAoIXNjb3BlZCAmJiAoY21kICE9IFJUTV9ERUxBRERSKSAmJiAobG9jYWwuZmFtaWx5ID09IEFGX0lORVQpCisgICAgICAmJiAobG9jYWwuYnl0ZWxlbiA+PSAxICYmICoodWludDhfdCopJmxvY2FsLmRhdGEgPT0gMTI3KSkKKyAgICByZXEuaWZhZGQuaWZhX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKyAgcmVxLmlmYWRkLmlmYV9pbmRleCA9IGdldF9pZmFjZWluZGV4KGRldiwgMSk7CisKKyAgc2VuZF9ubG1lc2coUlRNX05FV0FERFIsIDAsIEFGX1VOU1BFQywgKHZvaWQgKikmcmVxLCByZXEubmxtLm5sbXNnX2xlbik7CisgIGxlbmd0aCA9IHJlY3YoVFQuc29ja2ZkLCByZXBseSwgc2l6ZW9mKHJlcGx5KSwgMCk7CisgIGFkZHJfcHRyID0gKHN0cnVjdCBubG1zZ2hkciAqKSByZXBseTsKKyAgZm9yICg7IE5MTVNHX09LKGFkZHJfcHRyLCBsZW5ndGgpOyBhZGRyX3B0ciA9IE5MTVNHX05FWFQoYWRkcl9wdHIsIGxlbmd0aCkpIHsKKyAgICBpZiAoYWRkcl9wdHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSkKKyAgICAgIHJldHVybiAxOworICAgIGlmIChhZGRyX3B0ci0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKKyAgICAgIGVyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKSBOTE1TR19EQVRBKGFkZHJfcHRyKTsKKyAgICBpZiAoZXJyICYmIGVyci0+ZXJyb3IpIHsKKyAgICAgIGVycm5vID0gLWVyci0+ZXJyb3I7CisgICAgICBwZXJyb3JfZXhpdCgiUlRORVRMSU5LIGFuc3dlcnM6Iik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9saXN0Zmx1c2goY2hhciAqKmFyZ3YpCit7CisgIGludCBpZHg7IHVpbnQzMl90IG5ldG1hc2sgPSAwLCBmb3VuZCA9IDA7CisgIGNoYXIgKnRtcCA9IE5VTEwsICpuYW1lID0gTlVMTDsKKyAgc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdDsKKyAgc3RydWN0IGFyZ2xpc3QgY21kX29iamVjdGxpc3RbXSA9IHt7InRvIiwgMH0sIHsic2NvcGUiLCAxfSwgeyJ1cCIsIDJ9LAorICAgIHsibGFiZWwiLCAzfSwgeyJkZXYiLCA0fSwge05VTEwsIC0xfX07CisKKyAgVFQuZmx1c2ggPSAqYXJndlstMV0gPT0gJ2YnID8gMSA6IDA7CisgIG1lbXNldCgmYWRkcmluZm8sIDAsIHNpemVvZihhZGRyaW5mbykpOworCisgIGlmIChUVC5mbHVzaCkgeworICAgIGlmICghKmFyZ3YpCisgICAgICBlcnJvcl9leGl0KCJJbmNvbXBsZXRlIGNvbW1hbmQgZm9yIFwiZmx1c2hcIiIpOworICAgIGlmIChUVC5hZGRyZXNzZmFtaWx5ID09IEFGX1BBQ0tFVCkKKyAgICAgIGVycm9yX2V4aXQoIkNhbid0IGZsdXNoIGxpbmsgQWRkcmVzc2VzcyIpOworICB9CisgIGFkZHJpbmZvLnNjb3BlID0gLTE7CisgIHdoaWxlICgqYXJndikgeworICAgIHN3aXRjaCAoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndiwgY21kX29iamVjdGxpc3QpKSB7CisgICAgICBjYXNlIDA6IAorICAgICAgICB7Ly8gQUREUl9UTworICAgICAgICAgIGlmICghKisrYXJndikgZXJyb3JfZXhpdCgiSW5jb21wbGV0ZSBDb21tYW5kIGxpbmUiKTsKKyAgICAgICAgICBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiMCIpKSByZXR1cm4gMDsKKyAgICAgICAgICB1aW50MzJfdCBhZGRyWzRdID0gezAsfTsKKyAgICAgICAgICB1aW50OF90IGxlbiA9IDA7CisKKyAgICAgICAgICBhZGRyaW5mby50byA9IDE7CisgICAgICAgICAgcGFyc2VfcHJlZml4KGFkZHIsICZuZXRtYXNrLCAmbGVuLCAqYXJndiwgVFQuYWRkcmVzc2ZhbWlseSk7CisgICAgICAgICAgaWYgKGxlbikKKyAgICAgICAgICAgIFRULmFkZHJlc3NmYW1pbHkgPSAoKGxlbiA9PSA0KSA/IEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICAgICAgYWRkcmluZm8uYWRkciAgPSBzdHJ0b2soKmFyZ3YsICIvIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6IC8vIEFERFJfU0NPUEUKKyAgICAgICAgeworICAgICAgICAgIGludCBzY29wZSA9IDA7CisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJJbmNvbXBsZXRlIENvbW1hbmQgbGluZSIpOworICAgICAgICAgIG5hbWUgPSAqYXJndjsKKworICAgICAgICAgIGFkZHJpbmZvLnNjb3BlbWFzayA9IC0xOworICAgICAgICAgIGlmIChpc2RpZ2l0KCoqYXJndikpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBhdG9seCgqYXJndik7CisKKyAgICAgICAgICAgIG5hbWUgPSB4c3RyZHVwKG5hbWVmcm9tUlBEQihpZHgsIFJQREJfcnRzY29wZXMpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChzY29wZSA9IGlkeGZyb21SUERCKG5hbWUsIFJQREJfcnRzY29wZXMpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgImFsbCIpKQorICAgICAgICAgICAgICBlcnJvcl9leGl0KCJ3cm9uZyBzY29wZSAnJXMnIiwgbmFtZSk7CisgICAgICAgICAgICBzY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisgICAgICAgICAgICBhZGRyaW5mby5zY29wZW1hc2sgPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpc2RpZ2l0KCoqYXJndikpCisgICAgICAgICAgICBmcmVlKG5hbWUpOworICAgICAgICAgIGFkZHJpbmZvLnNjb3BlID0gc2NvcGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7ICAgICAgIAorICAgICAgY2FzZSAyOiAvLyBBRERSX1VQCisgICAgICAgIGFkZHJpbmZvLnVwID0gMTsKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICBjYXNlIDM6IC8vIEFERFJfTEFCRUwKKyAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJJbmNvbXBsZXRlIENvbW1hbmQgbGluZSIpOworICAgICAgICBhZGRyaW5mby5sYWJlbCA9ICphcmd2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDogLy8gQUREUl9ERVYKKyAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJJbmNvbXBsZXRlIENvbW1hbmQgbGluZSIpOworCisgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKFRULmZpbHRlcl9kZXYpCisgICAgICAgICAgZXJyb3JfZXhpdCgiRWl0aGVyIFwiZGV2XCIgaXMgZHVwbGljYXRlIG9yICVzIGlzIGdhcmJhZ2UiLAorICAgICAgICAgICAgICAqYXJndik7CisgICAgICAgIFRULmZpbHRlcl9kZXYgPSAqYXJndjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGFyZ3YrKzsKKyAgfQorCisgIGxpbmtfc2hvdygmdG1wKTsKKyAgd2hpbGUgKCBsaW5mbyAmJiAoZGxpc3QgPSBkbGlzdF9wb3AoJmxpbmZvKSkpeyAgICAKKyAgICBzdHJ1Y3QgbGlua2RhdGEgKnRtcCAgPSAoc3RydWN0IGxpbmtkYXRhKikgZGxpc3Q7CisgICAgY2hhciAqdGVtcCA9ICZ0bXAtPmlmYWNlWzBdOworCisgICAgaWYgKFRULmZpbHRlcl9kZXYgJiYgc3RyY21wKFRULmZpbHRlcl9kZXYsIHRlbXApKQorICAgICAgY29udGludWU7CisgICAgZm91bmQgPSAxOworICAgIGlmIChUVC5mbHVzaCAmJiBhZGRyaW5mby5sYWJlbCkgaXBhZGRyX3ByaW50KCB0bXAsIDApOworICAgIGlmIChhZGRyaW5mby51cCAmJiAhKHRtcC0+ZmxhZ3MgJiBJRkZfVVApKXsKKyAgICAgIGlwYWRkcl9wcmludCh0bXAsIDApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChhZGRyaW5mby5sYWJlbCl7CisgICAgICBpZiAoIGZubWF0Y2goYWRkcmluZm8ubGFiZWwsIHRlbXAsIDApKSB7CisgICAgICAgIGlwYWRkcl9wcmludCh0bXAsIDEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gICAgICAKKyAgICB9CisgICAgaWYgKCFUVC5hZGRyZXNzZmFtaWx5ICYmICEgVFQuZmx1c2ggKSBwcmludF9saW5rX291dHB1dCh0bXApOworCisgICAgaXBhZGRyX3ByaW50KHRtcCwgMCk7CisgICAgZnJlZSh0bXApOworICB9CisgIGlmIChUVC5maWx0ZXJfZGV2ICYmICFmb3VuZCkKKyAgICBlcnJvcl9leGl0KCJEZXZpY2UgXCIlc1wiIGRvZXNuJ3QgZXhpc3QuIFxuIiwgVFQuZmlsdGVyX2Rldik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9wcmludCggc3RydWN0IGxpbmtkYXRhICpsaW5rLCBpbnQgZmxhZ19sKQoreworICBzdHJ1Y3Qgbmxtc2doZHIgKmFkZHJfcHRyOworICBpbnQgaXBfbWF0Y2ggPSAwOworCisgIGFkZHJpbmZvLmlmaW5kZXggPSBsaW5rLT5pZmFjZV9pZHg7CisgIHNlbmRfbmxtZXNnKFJUTV9HRVRBRERSLCBOTE1fRl9ST09UfE5MTV9GX01BVENIfE5MTV9GX1JFUVVFU1QsCisgICAgICBBRl9VTlNQRUMsIE5VTEwsIDApOworICBpZiAoVFQuYWRkcmVzc2ZhbWlseSA9PSBBRl9QQUNLRVQpIHByaW50X2xpbmtfb3V0cHV0KGxpbmspOworCisgIGlmIChhZGRyaW5mby5sYWJlbCl7CisgICAgY2hhciAqY29sID0gc3RyY2hyKGFkZHJpbmZvLmxhYmVsLCAnOicpOworICAgIGlmICghY29sICYmIChmbm1hdGNoKGFkZHJpbmZvLmxhYmVsLCAmbGluay0+aWZhY2VbMF0sIDApKSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKDEpeworICAgIGludCBsZW4gPSByZWN2KFRULnNvY2tmZCwgVFQuZ2J1Ziwgc2l6ZW9mKFRULmdidWYpLCAwKTsKKyAgICBhZGRyX3B0ciA9IChzdHJ1Y3Qgbmxtc2doZHIgKilUVC5nYnVmOworICAgIHN0cnVjdCBpZmFkZHJtc2cgKmFkZHJlc3NJbmZvID0gTkxNU0dfREFUQShhZGRyX3B0cik7CisgICAgY2hhciBsYnVmW0lORVQ2X0FERFJTVFJMRU5dOworICAgIHN0cnVjdCBydGF0dHIgKnJ0YSwgKnJ0YV90YltJRkFfTUFYKzFdID0gezAsfTsKKworICAgIGludCBsZW4xID0gYWRkcl9wdHItPm5sbXNnX2xlbiAtIE5MTVNHX0xFTkdUSChzaXplb2YoKmFkZHJlc3NJbmZvKSk7CisgICAgaWYgKGxlbjEgPiAwKSB7CisgICAgICBmb3IgKDsgTkxNU0dfT0soYWRkcl9wdHIsIGxlbik7IGFkZHJfcHRyID0gTkxNU0dfTkVYVChhZGRyX3B0ciwgbGVuKSkgeworICAgICAgICBhZGRyZXNzSW5mbyA9IE5MTVNHX0RBVEEoYWRkcl9wdHIpOworICAgICAgICBpZiAoVFQuYWRkcmVzc2ZhbWlseSAmJiBUVC5hZGRyZXNzZmFtaWx5ICE9IGFkZHJlc3NJbmZvLT5pZmFfZmFtaWx5KQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYWRkcmluZm8uaWZpbmRleCAmJiBhZGRyaW5mby5pZmluZGV4ICE9IGFkZHJlc3NJbmZvLT5pZmFfaW5kZXgpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGFkZHJpbmZvLnRvKSB7ICAgICAgICAKKyAgICAgICAgICBtZW1zZXQocnRhX3RiLCAwLCBzaXplb2YocnRhX3RiKSk7CisgICAgICAgICAgaW50IHJ0X2xlbiA9IElGQV9QQVlMT0FEKGFkZHJfcHRyKTsKKyAgICAgICAgICBmb3IgKHJ0YSA9IElGQV9SVEEoYWRkcmVzc0luZm8pOyBSVEFfT0socnRhLCBydF9sZW4pOyBydGE9UlRBX05FWFQocnRhLCBydF9sZW4pKSB7CisgICAgICAgICAgICBpZiAocnRhLT5ydGFfdHlwZSA8PSBJRkFfTUFYKSBydGFfdGJbcnRhLT5ydGFfdHlwZV0gPSBydGE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghcnRhX3RiW0lGQV9MT0NBTF0pIHJ0YV90YltJRkFfTE9DQUxdID0gcnRhX3RiW0lGQV9BRERSRVNTXTsKKyAgICAgICAgICBpZiAocnRhX3RiW0lGQV9MT0NBTF0pIHsKKyAgICAgICAgICAgIGlmICghaW5ldF9udG9wKFRULmFkZHJlc3NmYW1pbHksIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwKKyAgICAgICAgICAgICAgICAgIGxidWYsIHNpemVvZihsYnVmKSkpIHBlcnJvcl9leGl0KCJpbmV0Iik7CisgICAgICAgICAgICBpZiAoc3RyY21wKGFkZHJpbmZvLmFkZHIsIGxidWYpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlwX21hdGNoPTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghaXBfbWF0Y2gpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghVFQuZmx1c2gpeworICAgICAgICAgIGlmIChhZGRyaW5mby5zY29wZSAhPSAtMSAmJiBUVC5hZGRyZXNzZmFtaWx5ICYmIFRULmFkZHJlc3NmYW1pbHkgPT0KKyAgICAgICAgICAgICAgYWRkcmVzc0luZm8tPmlmYV9mYW1pbHkgJiYKKyAgICAgICAgICAgICAgKGFkZHJpbmZvLmlmaW5kZXggPT0gYWRkcmVzc0luZm8tPmlmYV9pbmRleCkpIHsKKyAgICAgICAgICAgIGlmICgoYWRkcmluZm8uc2NvcGUgXiBhZGRyZXNzSW5mby0+aWZhX3Njb3BlKSAmIGFkZHJpbmZvLnNjb3BlbWFzaykKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlbHNlIGlmIChhZGRyaW5mby51cCAmJiAobGluay0+ZmxhZ3MgJiBJRkZfVVApKQorICAgICAgICAgICAgICBwcmludF9saW5rX291dHB1dChsaW5rKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFhZGRyaW5mby51cCkgcHJpbnRfbGlua19vdXRwdXQobGluayk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChUVC5hZGRyZXNzZmFtaWx5ICYmCisgICAgICAgICAgICAgIChhZGRyaW5mby5pZmluZGV4ID09IGFkZHJlc3NJbmZvLT5pZmFfaW5kZXgpICYmCisgICAgICAgICAgICAgIChhZGRyaW5mby5zY29wZSA9PSAtMSkpeworICAgICAgICAgICAgaWYgKGFkZHJpbmZvLnVwICYmIChsaW5rLT5mbGFncyAmIElGRl9VUCkpCisgICAgICAgICAgICAgIHByaW50X2xpbmtfb3V0cHV0KGxpbmspOworICAgICAgICAgICAgZWxzZSBpZiAoIWFkZHJpbmZvLnVwKSBwcmludF9saW5rX291dHB1dChsaW5rKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgTkxNU0dfT0soYWRkcl9wdHIsIGxlbik7IGFkZHJfcHRyID0gTkxNU0dfTkVYVChhZGRyX3B0ciwgbGVuKSkgeworICAgICAgICAgIGlmICgoYWRkcl9wdHItPm5sbXNnX3R5cGUgPT0gUlRNX05FV0FERFIpKQorICAgICAgICAgICAgcHJpbnRfYWRkcmluZm8oYWRkcl9wdHIsIGZsYWdfbCk7CisgICAgICAgICAgaWYgKChhZGRyX3B0ci0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB8fAorICAgICAgICAgICAgICAoYWRkcl9wdHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpIHx8CisgICAgICAgICAgICAgIChUVC5mbHVzaCAmJiBhZGRyaW5mby50bykpCisgICAgICAgICAgICBnb3RvIHJldF9zdG9wOyAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFkZHJfcHRyLT5ubG1zZ190eXBlID09IE5MTVNHX0RPTkUpIHx8CisgICAgICAgICAgICAoYWRkcl9wdHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorCityZXRfc3RvcDoKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhZGRyKGNoYXIgKiphcmd2KQoreworICBpbnQgICAgaWR4OworICBjbWRvYmogaXBjbWQsIGNtZG9iamxpc3RbXSA9IHtpcGFkZHJ1cGRhdGUsIGlwYWRkcl9saXN0Zmx1c2h9OworICBzdHJ1Y3QgYXJnbGlzdCBjbWRfb2JqZWN0bGlzdFtdID0geyB7ImFkZCIsIDB9LCB7ImRlbGV0ZSIsIDB9LAorICAgIHsibGlzdCIsIDF9LHsic2hvdyIsIDF9LHsibHN0IiwgMX0sIHsiZmx1c2giLCAxfSwge05VTEwsLTF9fTsKKworICBUVC5pc19hZGRyKys7CisgIGlmICghKmFyZ3YpIGlkeCA9IDE7CisgIGVsc2UgaWYgKChpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2KyssIGNtZF9vYmplY3RsaXN0KSkgPT0gLTEpCisgICAgaGVscF9leGl0KDApOworCisgIGlwY21kID0gY21kb2JqbGlzdFtpZHhdOworICByZXR1cm4gaXBjbWQoYXJndik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29kZSBmb3IgaXAgcm91dGUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RydWN0IElfZGF0YSB7CisgIHVuc2lnbmVkIGNoYXIgZmFtaWx5OworICB1aW50MzJfdCBhZGRyWzhdICwgbmV0bWFzayA7CisgIHVpbnQ4X3QgbGVuIDsKK307CisKK3N0cnVjdCB7CisgIGludCB0YixpZGV2LG9kZXYscHJvdG87CisgIHN0cnVjdCBJX2RhdGEgcnZpYSwgcmRzdCwgbWRzdCwgcnNyYywgbXNyYzsKK30gZ2ZpbHRlcjsKKworc3RhdGljIHZvaWQgc2hvd19pcHJvdXRlX2hlbHAodm9pZCkKK3sKKyAgY2hhciAqZXJybXNnID0gIlxuXG4iIFwKKyAgICAgICAiaXByb3V0ZSB7IGxpc3QgfCBmbHVzaCB9IFNFTEVDVE9SXG4iIFwKKyAgICAgICAiaXByb3V0ZSBnZXQgQUREUkVTUyBbZnJvbSBBRERSRVNTIGlpZiBTVFJJTkddXG4iIFwKKyAgICAgICAiCVtvaWYgU1RSSU5HXVxuIiBcCisgICAgICAgImlwcm91dGUgeyBhZGQgfCBkZWwgfCBjaGFuZ2UgfCBhcHBlbmQgfCByZXBsYWNlIHwgdGVzdCB9IFJPVVRFXG4iIFwKKyAgICAgICAiCVNFTEVDVE9SIDo9IFtyb290IFBSRUZJWF0gW21hdGNoIFBSRUZJWF0gW3Byb3RvIFJUUFJPVE9dXG4iIFwKKyAgICAgICAiCVJPVVRFIDo9IFtUWVBFXSBQUkVGSVggW3Byb3RvIFJUUFJPVE9dIFttZXRyaWMgTUVUUklDXSI7CisKKyAgZXJyb3JfZXhpdChlcnJtc2cpOworfQorCitzdGF0aWMgaW50IGRpc3BsYXlfcm91dGVfaW5mbyhzdHJ1Y3Qgbmxtc2doZHIgKm1oZHIsIGNoYXIgKiphcmd2KQoreworICBjaGFyICppbmV0dmFsID0gTlVMTCwgb3V0WzEwMjRdID0gezB9OworICBzdHJ1Y3QgcnRtc2cgKm1zZyA9IE5MTVNHX0RBVEEobWhkcik7CisgIHN0cnVjdCBydGF0dHIgKnJ0YSwgKmF0dHJbUlRBX01BWCsxXSA9IHswLH07CisgIGludDMyX3QgdHZhciwgbXNnbGVuID0gbWhkci0+bmxtc2dfbGVuIC0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKyAgaW50IGhsZW4gPSAoKG1zZy0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUKSA/IDMyCisgICAgICA6ICgobXNnLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KSA/IDEyOCA6IC0xKSk7CisKKyAgaWYgKG1oZHItPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFKSByZXR1cm4gMDsKKyAgaWYgKG1zZ2xlbiA8IDApIHJldHVybiAxOworCisgIGlmIChtc2ctPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICBpZiAoZ2ZpbHRlci50YikgeworICAgICAgaWYgKGdmaWx0ZXIudGIgPCAwKSB7CisgICAgICAgIGlmICghKG1zZy0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKSkgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobXNnLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHJldHVybiAwOworICAgICAgICBpZiAoZ2ZpbHRlci50YiA9PSBSVF9UQUJMRV9MT0NBTCAmJiBtc2ctPnJ0bV90eXBlICE9IFJUTl9MT0NBTCkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZSBpZiAoZ2ZpbHRlci50YiA9PSBSVF9UQUJMRV9NQUlOICYmIG1zZy0+cnRtX3R5cGUgPT0gUlROX0xPQ0FMKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmIChnZmlsdGVyLnRiID4gMCAmJiBnZmlsdGVyLnRiICE9IG1zZy0+cnRtX3RhYmxlKSByZXR1cm4gMDsKKworICBpZiAoZ2ZpbHRlci5wcm90byAmJiAobXNnLT5ydG1fcHJvdG9jb2wgIT0gZ2ZpbHRlci5wcm90bykpIHJldHVybiAwOworCisKKyAgaWYgKGdmaWx0ZXIucmRzdC5mYW1pbHkgJiYgKG1zZy0+cnRtX2ZhbWlseSAhPSBnZmlsdGVyLnJkc3QuZmFtaWx5IHx8CisgICAgICAgIGdmaWx0ZXIucmRzdC5uZXRtYXNrID4gbXNnLT5ydG1fZHN0X2xlbikpIHJldHVybiAwOworICBpZiAoZ2ZpbHRlci5tZHN0LmZhbWlseSAmJiAobXNnLT5ydG1fZmFtaWx5ICE9IGdmaWx0ZXIubWRzdC5mYW1pbHkKKyAgICAgICAgfHwgKGdmaWx0ZXIubWRzdC5uZXRtYXNrIDwgbXNnLT5ydG1fZHN0X2xlbikpKSByZXR1cm4gMDsKKyAgaWYgKGdmaWx0ZXIucnNyYy5mYW1pbHkgJiYgKG1zZy0+cnRtX2ZhbWlseSAhPSBnZmlsdGVyLnJzcmMuZmFtaWx5CisgICAgICAgIHx8IGdmaWx0ZXIucnNyYy5uZXRtYXNrID4gbXNnLT5ydG1fc3JjX2xlbikpIHJldHVybiAwOworICBpZiAoZ2ZpbHRlci5tc3JjLmZhbWlseSAmJiAobXNnLT5ydG1fZmFtaWx5ICE9IGdmaWx0ZXIubXNyYy5mYW1pbHkKKyAgICAgICAgfHwgKGdmaWx0ZXIubXNyYy5uZXRtYXNrIDwgbXNnLT5ydG1fc3JjX2xlbikpKSByZXR1cm4gMDsKKyAgdHZhciA9IG1zZ2xlbjsKKworICBmb3IgKHJ0YSA9IFJUTV9SVEEobXNnKTsgUlRBX09LKHJ0YSwgdHZhcik7IHJ0YT1SVEFfTkVYVChydGEsIHR2YXIpKQorICAgIGlmIChydGEtPnJ0YV90eXBlIDw9IFJUQV9NQVgpIGF0dHJbcnRhLT5ydGFfdHlwZV0gPSBydGE7CisKKyAgaWYgKG1zZy0+cnRtX3R5cGUgIT0gUlROX1VOSUNBU1QpCisgICAgc3ByaW50ZihvdXQsIiVzJXMgIiwgb3V0LHJ0bXR5cGVfaWR4MnN0cihtc2ctPnJ0bV90eXBlKSk7CisgIGlmIChhdHRyW1JUQV9EU1RdKSB7CisgICAgaW5ldHZhbCA9IChjaGFyICopaW5ldF9udG9wKG1zZy0+cnRtX2ZhbWlseSwgUlRBX0RBVEEoYXR0cltSVEFfRFNUXSksCisgICAgICAgIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgIGlmIChnZmlsdGVyLnJkc3QuZmFtaWx5ICYmCisgICAgICAgIG1lbWNtcChSVEFfREFUQShhdHRyW1JUQV9EU1RdKSwgJmdmaWx0ZXIucmRzdC5hZGRyLCBnZmlsdGVyLnJkc3QubGVuKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChnZmlsdGVyLm1kc3QuZmFtaWx5ICYmCisgICAgICAgIG1lbWNtcChSVEFfREFUQShhdHRyW1JUQV9EU1RdKSwgJmdmaWx0ZXIubWRzdC5hZGRyLCBnZmlsdGVyLm1kc3QubGVuKSkKKyAgICAgIHJldHVybiAwOworICAgIHNwcmludGYob3V0LCIlcyVzIixvdXQsaW5ldHZhbCk7CisgIH0KKyAgaWYgKG1zZy0+cnRtX2RzdF9sZW4pIHNwcmludGYob3V0LCIlcy8lZCAiLCBvdXQsbXNnLT5ydG1fZHN0X2xlbik7CisgIGVsc2Ugc3ByaW50ZihvdXQsIiVzJXMiLG91dCwiZGVmYXVsdCAiKTsKKworICBpZiAoYXR0cltSVEFfU1JDXSkgeworICAgIGluZXR2YWwgPSAoY2hhciAqKWluZXRfbnRvcChtc2ctPnJ0bV9mYW1pbHksIFJUQV9EQVRBKGF0dHJbUlRBX1NSQ10pLAorICAgICAgICB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAoZ2ZpbHRlci5yc3JjLmZhbWlseSAmJgorICAgICAgICBtZW1jbXAoUlRBX0RBVEEoYXR0cltSVEFfU1JDXSksICZnZmlsdGVyLnJzcmMuYWRkciwgZ2ZpbHRlci5yc3JjLmxlbikpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZ2ZpbHRlci5tc3JjLmZhbWlseSAmJgorICAgICAgICBtZW1jbXAoUlRBX0RBVEEoYXR0cltSVEFfU1JDXSksICZnZmlsdGVyLm1zcmMuYWRkciwgZ2ZpbHRlci5tc3JjLmxlbikpCisgICAgICByZXR1cm4gMDsKKyAgICBzcHJpbnRmKG91dCwgIiVzIGZyb20gJXMiLCBvdXQsIGluZXR2YWwpOworICB9CisgIGlmIChtc2ctPnJ0bV9zcmNfbGVuKSBzcHJpbnRmKG91dCwgIiVzLyVkICIsIG91dCwgbXNnLT5ydG1fc3JjX2xlbik7CisKKyAgaWYgKGF0dHJbUlRBX0dBVEVXQVldKSB7CisgICAgaW5ldHZhbCA9IChjaGFyICopaW5ldF9udG9wKG1zZy0+cnRtX2ZhbWlseSwgUlRBX0RBVEEoYXR0cltSVEFfR0FURVdBWV0pLAorICAgICAgICB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBzcHJpbnRmKG91dCwgIiVzIHZpYSAlcyAiLCBvdXQsIGluZXR2YWwpOworICB9CisgIGlmIChnZmlsdGVyLnJ2aWEuZmFtaWx5KSB7CisgICAgY2hhciB0bXBbMjU2XTsKKworICAgIGlmICghYXR0cltSVEFfR0FURVdBWV0pIHJldHVybiAwOworICAgIGlmIChzdHJjbXAoKGNoYXIgKilpbmV0X250b3AobXNnLT5ydG1fZmFtaWx5LCBnZmlsdGVyLnJ2aWEuYWRkciwKKyAgICAgICAgICAgIHRtcCwgc2l6ZW9mKHRtcCkpLCBpbmV0dmFsKSkgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZ2ZpbHRlci5vZGV2ICE9IDApIGlmICghYXR0cltSVEFfT0lGXSkgcmV0dXJuIDA7CisgIGlmIChhdHRyW1JUQV9PSUZdKSB7CisgICAgaWYgKGdmaWx0ZXIub2RldiAhPTAgJiYgZ2ZpbHRlci5vZGV2ICE9ICooaW50KilSVEFfREFUQShhdHRyW1JUQV9PSUZdKSkKKyAgICAgIHJldHVybiAwOworICAgIHNwcmludGYob3V0LCAiJXMgZGV2ICVzICIsIG91dCwgCisgICAgICAgIGlmX2luZGV4dG9uYW1lKCooaW50KilSVEFfREFUQShhdHRyW1JUQV9PSUZdKSwgdG95YnVmKSk7CisgIH0KKworICBpZiAoYXR0cltSVEFfUFJFRlNSQ10gJiYgaGxlbikgeworICAgIGluZXR2YWwgPSAoY2hhciAqKWluZXRfbnRvcChtc2ctPnJ0bV9mYW1pbHksIFJUQV9EQVRBKGF0dHJbUlRBX1BSRUZTUkNdKSwKKyAgICAgICAgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgc3ByaW50ZihvdXQsICIlcyBzcmMgJXMgIiwgb3V0LCBpbmV0dmFsKTsKKyAgfQorICBpZiAoYXR0cltSVEFfUFJJT1JJVFldKQorICAgIHNwcmludGYob3V0LCAiJXMgbWV0cmljICVkICIsIG91dCwgKih1aW50MzJfdCopUlRBX0RBVEEoYXR0cltSVEFfUFJJT1JJVFldKSk7CisgIGlmIChtc2ctPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICBzdHJ1Y3QgcnRhX2NhY2hlaW5mbyAqY2kgPSBOVUxMOworICAgIGlmIChhdHRyW1JUQV9DQUNIRUlORk9dKSBjaSA9IFJUQV9EQVRBKGF0dHJbUlRBX0NBQ0hFSU5GT10pOworICAgIGlmICgobXNnLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHx8IChjaSAmJiBjaS0+cnRhX2V4cGlyZXMpKSB7CisgICAgICBpZiAobXNnLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHNwcmludGYob3V0LCAiJXMlcyAgICBjYWNoZSAiLAorICAgICAgICAgIG91dCwgKCFUVC5zaW5nbGVsaW5lID8gIlxuIiA6ICIgIikpOworICAgICAgaWYgKGNpICYmIGNpLT5ydGFfZXhwaXJlcykgeworICAgICAgICBpbnQgaHogPSAwOworICAgICAgICBGSUxFICpmcCA9IHhmb3BlbigiL3Byb2MvbmV0L3BzY2hlZCIsInIiKTsKKworICAgICAgICBpZiAoZnApIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbm9tLCBkZW5vbTsKKworICAgICAgICAgIGlmIChmc2NhbmYoZnAsICIlKjA4eCUqMDh4JTA4eCUwOHgiLCAmbm9tLCAmZGVub20pID09IDIpCisgICAgICAgICAgICBpZiAobm9tID09IDEwMDAwMDApCisgICAgICAgICAgICAgIGh6ID0gZGVub207CisgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWh6KSBoeiA9IHN5c2NvbmYoX1NDX0NMS19UQ0spOworICAgICAgICBzcHJpbnRmKG91dCwgIiVzIGV4cGlyZXMgJWRzZWMiLCBvdXQsIGNpLT5ydGFfZXhwaXJlcyAvaHopOworICAgICAgfQorICAgICAgaWYgKGNpICYmIGNpLT5ydGFfZXJyb3IpIHNwcmludGYob3V0LCAiJXMgZXJyb3IgJWQiLCBvdXQsIGNpLT5ydGFfZXJyb3IpOworICAgIH0KKyAgICBlbHNlIGlmIChjaSAmJiBjaS0+cnRhX2Vycm9yKQorICAgICAgc3ByaW50ZihvdXQsICIlcyBlcnJvciAlZCIsIG91dCwgY2ktPnJ0YV9lcnJvcik7CisgIH0KKyAgaWYgKGF0dHJbUlRBX0lJRl0gJiYgIWdmaWx0ZXIuaWRldikKKyAgICBzcHJpbnRmKG91dCwgIiVzIGlpZiAlcyIsIG91dCwgCisgICAgICAgIGlmX2luZGV4dG9uYW1lKCooaW50KilSVEFfREFUQShhdHRyW1JUQV9JSUZdKSwgdG95YnVmKSk7CisgIGlmIChUVC5mbHVzaCB8fCAoVFQuY29ubmVjdGVkICYmICFUVC5mcm9tX29rKSkgCisgICAgbWVtY3B5KHRveWJ1ZiwgKHZvaWQqKW1oZHIsbWhkci0+bmxtc2dfbGVuKTsKKworICBpZiAoVFQuZmx1c2gpIHsKKyAgICBpbnQgc29ja2ZkID0gMDsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIqIG1oZHIgPSAoc3RydWN0IG5sbXNnaGRyKil0b3lidWY7CisgICAgc3RydWN0IHJ0bXNnICptc2cgPSBOTE1TR19EQVRBKG1oZHIpOworICAgIGludCB0dmFyLCBtc2dsZW4gPSBtaGRyLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworICAgIHN0cnVjdCBydGF0dHIgKnJ0YSwgKmF0dHJbUlRBX01BWCsxXSA9IHswLH07CisKKyAgICB0dmFyID0gbXNnbGVuOworICAgIGZvciAocnRhID0gUlRNX1JUQShtc2cpOyBSVEFfT0socnRhLCB0dmFyKTsgcnRhPVJUQV9ORVhUKHJ0YSwgdHZhcikpCisgICAgICBpZiAocnRhLT5ydGFfdHlwZSA8PSBSVEFfTUFYKSBhdHRyW3J0YS0+cnRhX3R5cGVdID0gcnRhOworCisgICAgaWYgKG1zZy0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNgorICAgICAgICAmJiAhbXNnLT5ydG1fZHN0X2xlbgorICAgICAgICAmJiBtc2ctPnJ0bV90eXBlID09IFJUTl9VTlJFQUNIQUJMRQorICAgICAgICAmJiBhdHRyW1JUQV9QUklPUklUWV0KKyAgICAgICAgJiYgKihpbnQqKVJUQV9EQVRBKGF0dHJbUlRBX1BSSU9SSVRZXSkgPT0gLTEpCisgICAgICByZXR1cm4gMDsKKworICAgIG1oZHItPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKyAgICBtaGRyLT5ubG1zZ190eXBlICA9IFJUTV9ERUxST1VURTsKKyAgICBtaGRyLT5ubG1zZ19waWQgPSAwOworICAgIHNvY2tmZCA9IHhzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfUk9VVEUpOworICAgIGlmIChzZW5kKHNvY2tmZCAsICh2b2lkKiltaGRyLCBtaGRyLT5ubG1zZ19sZW4sIDApIDwgMCkKKyAgICAgIHBlcnJvcl9leGl0KCJVbmFibGUgdG8gc2VuZCBkYXRhIG9uIHNvY2tldC4iKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm1oZHI7CisgICAgICBpbnQgbXNnbGVuID0gcmVjdihzb2NrZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksIDApOworCisgICAgICBpZiAoKG1zZ2xlbiA8IDApICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSBjb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKG1zZ2xlbiA8IDApIHsKKyAgICAgICAgZXJyb3JfbXNnKCJuZXRsaW5rIHJlY2VpdmUgZXJyb3IgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB4Y2xvc2Uoc29ja2ZkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9IGVsc2UgaWYgKCFtc2dsZW4pIHsKKyAgICAgICAgZXJyb3JfbXNnKCJFT0Ygb24gbmV0bGluayIpOworICAgICAgICB4Y2xvc2Uoc29ja2ZkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIGZvciAobWhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKXRveWJ1ZjsgTkxNU0dfT0sobWhkciwgbXNnbGVuKTsKKyAgICAgICAgICBtaGRyID0gTkxNU0dfTkVYVChtaGRyLCBtc2dsZW4pKSB7CisgICAgICAgIHN3aXRjaCAobWhkci0+bmxtc2dfdHlwZSkgeworICAgICAgICAgIGNhc2UgTkxNU0dfRE9ORToKKyAgICAgICAgICAgIHhjbG9zZShzb2NrZmQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgY2FzZSBOTE1TR19FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RydWN0IG5sbXNnZXJyICptZXJyID0gKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShtaGRyKTsKKworICAgICAgICAgICAgICBpZiAobWVyci0+ZXJyb3IgPT0gMCkgIHsgeGNsb3NlKHNvY2tmZCk7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgIGlmIChtaGRyLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKQorICAgICAgICAgICAgICAgIGVycm9yX21zZygiRVJST1IgdHJ1bmNhdGVkIik7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGVycm5vID0gLW1lcnItPmVycm9yOworICAgICAgICAgICAgICAgIHBlcnJvcl9tc2coIlJUTkVUTElOSyBhbnN3ZXJzIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgeGNsb3NlKHNvY2tmZCk7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSAvLyBFbmQgb2YgZm9yIGxvb3AuCisgICAgfSAvLyBFbmQgb2Ygd2hpbGUgbG9vcC4KKworICAgIHhjbG9zZShzb2NrZmQpOworICB9IGVsc2UgcHJpbnRmKCIlc1xuIixvdXQpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb3V0ZV9nZXQoY2hhciAqKmFyZ3YpCit7CisgIGludCBpZHgsIGZsYWc7CisgIHN0cnVjdCBhcmdsaXN0IGNtZF9vYmplY3RsaXN0W10gPSB7eyJmcm9tIiwgMH0sIHsiaWlmIiwgMX0sIHsib2lmIiwgMn0sIAorICAgIHsiZGV2IiwgM30sIHsibm90aWZ5IiwgNH0sIHsiY29ubmVjdGVkIiwgNX0sIHsidG8iLCA2fSwge05VTEwsIC0xfX07CisgIGNoYXIgKmlkZXYgPSBOVUxMLCAqb2RldiA9IE5VTEw7CisgIHN0cnVjdCB7CisgICAgc3RydWN0IG5sbXNnaGRyIG1oZHI7CisgICAgc3RydWN0IHJ0bXNnIG1zZzsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgfSByZXF1ZXN0OworCisgIG1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisgIHJlcXVlc3QubWhkci5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0s7CisgIHJlcXVlc3QubWhkci5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOworICByZXF1ZXN0Lm1zZy5ydG1fZmFtaWx5ID0gQUZfVU5TUEVDOworCisgIGZvciAoOyAqYXJndjsgYXJndisrKSB7CisgICAgc3dpdGNoKGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YsIGNtZF9vYmplY3RsaXN0KSkgeworICAgICAgY2FzZSAwOiBUVC5mcm9tX29rID0gMTsgLy8gZHN0IGFkZHJlc3MKKyAgICAgIGNhc2UgNjogYXJndisrOyAvL2ZhbGx0aHJvdWdoCisgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJbOF0gPSB7MCx9LCBuZXRtYXNrID0gMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbiA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoISphcmd2KSBlcnJvcl9leGl0KCInJXMnOiBNaXNzaW5nIFByZWZpeCIsIGFyZ3ZbLTFdKTsKKyAgICAgICAgICAgICAgICBwYXJzZV9wcmVmaXgoYWRkciwgJm5ldG1hc2ssICZsZW4sICphcmd2LCByZXF1ZXN0Lm1zZy5ydG1fZmFtaWx5KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSByZXF1ZXN0Lm1zZy5ydG1fZmFtaWx5ID0gKChsZW4gPT0gNCkgPyBBRl9JTkVUIDogQUZfSU5FVDYpOworICAgICAgICAgICAgICAgIG5ldG1hc2sgPSAocmVxdWVzdC5tc2cucnRtX2ZhbWlseSA9PSBBRl9JTkVUNikgPyAxMjggOiAzMjsKKyAgICAgICAgICAgICAgICBpZiAoIWlkeCkgcmVxdWVzdC5tc2cucnRtX3NyY19sZW4gPSBuZXRtYXNrOworICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdC5tc2cucnRtX2RzdF9sZW4gPSBuZXRtYXNrOworICAgICAgICAgICAgICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKCZyZXF1ZXN0Lm1oZHIsIHNpemVvZihyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgKCFpZHggPyBSVEFfU1JDIDogUlRBX0RTVCksIGFkZHIsIGxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgaWYgKCEqKythcmd2KSBzaG93X2lwcm91dGVfaGVscCgpOworICAgICAgICAgICAgICBpZiAoaWR4ID09IDEpIGlkZXYgPSAqYXJndiwgZmxhZyA9IFJUQV9JSUY7CisgICAgICAgICAgICAgIGVsc2Ugb2RldiA9ICphcmd2LCBmbGFnID0gUlRBX09JRjsKKyAgICAgICAgICAgICAgaWR4ID0gZ2V0X2lmYWNlaW5kZXgoKmFyZ3YsIDEpOworICAgICAgICAgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxdWVzdC5taGRyLCBzaXplb2YocmVxdWVzdCksCisgICAgICAgICAgICAgICAgICBmbGFnLCAoY2hhciopJmlkeCwgc2l6ZW9mKGlkeCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgcmVxdWVzdC5tc2cucnRtX2ZsYWdzIHw9IFJUTV9GX05PVElGWTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgIFRULmNvbm5lY3RlZCA9IDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIXJlcXVlc3QubXNnLnJ0bV9kc3RfbGVuKSAKKyAgICBlcnJvcl9leGl0KCJuZWVkIGF0IGxlYXN0IGRlc3RpbmF0aW9uIGFkZHJlc3MiKTsKKworICBzZW5kX25sbWVzZygwLCAwLCAwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpKTsKKyAgZmlsdGVyX25sbWVzZyhkaXNwbGF5X3JvdXRlX2luZm8sIE5VTEwpOworCisgIGlmIChUVC5jb25uZWN0ZWQgJiYgIVRULmZyb21fb2spIHsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIgKm1oZHIgPSAoc3RydWN0IG5sbXNnaGRyKil0b3lidWY7CisgICAgc3RydWN0IHJ0bXNnICptc2cgPSBOTE1TR19EQVRBKG1oZHIpOworICAgIGludCB0dmFyLCBtc2dsZW4gPSBtaGRyLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworICAgIHN0cnVjdCBydGF0dHIgKnJ0YSwgKmF0dHJbUlRBX01BWCsxXSA9IHswLH07CisKKyAgICBpZiAobWhkci0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUk9VVEUpIGVycm9yX2V4aXQoIm5vdCBhIHJvdXRlPyIpOworICAgIGlmIChtc2dsZW4gPCAwKSBlcnJvcl9leGl0KCJ3cm9uZyBsZW4gJWQiLCBtc2dsZW4pOworCisgICAgdHZhciA9IG1zZ2xlbjsKKyAgICBmb3IgKHJ0YSA9IFJUTV9SVEEobXNnKTsgUlRBX09LKHJ0YSwgdHZhcik7IHJ0YT1SVEFfTkVYVChydGEsIHR2YXIpKQorICAgICAgaWYgKHJ0YS0+cnRhX3R5cGUgPD0gUlRBX01BWCkgYXR0cltydGEtPnJ0YV90eXBlXSA9IHJ0YTsKKworICAgIGlmIChhdHRyW1JUQV9QUkVGU1JDXSkgeworICAgICAgYXR0cltSVEFfUFJFRlNSQ10tPnJ0YV90eXBlID0gUlRBX1NSQzsKKyAgICAgIG1zZy0+cnRtX3NyY19sZW4gPSA4KlJUQV9QQVlMT0FEKGF0dHJbUlRBX1BSRUZTUkNdKTsKKyAgICB9IGVsc2UgaWYgKCFhdHRyW1JUQV9TUkNdKSBlcnJvcl9leGl0KCJjYW4ndCBjb25uZWN0IHRoZSByb3V0ZSIpOworCisgICAgaWYgKCFvZGV2ICYmIGF0dHJbUlRBX09JRl0pIGF0dHJbUlRBX09JRl0tPnJ0YV90eXBlID0gMDsKKyAgICBpZiAoYXR0cltSVEFfR0FURVdBWV0pIGF0dHJbUlRBX0dBVEVXQVldLT5ydGFfdHlwZSA9IDA7CisgICAgaWYgKCFpZGV2ICYmIGF0dHJbUlRBX0lJRl0pIGF0dHJbUlRBX0lJRl0tPnJ0YV90eXBlID0gMDsKKyAgICBtaGRyLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0s7CisgICAgbWhkci0+bmxtc2dfdHlwZSAgPSBSVE1fR0VUUk9VVEU7CisgICAgbWhkci0+bmxtc2dfcGlkID0gMDsKKyAgICB4Y2xvc2UoVFQuc29ja2ZkKTsKKyAgICBUVC5zb2NrZmQgPSB4c29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX1JPVVRFKTsKKyAgICBzZW5kX25sbWVzZygwLCAwLCAwLCBtaGRyLCBtaGRyLT5ubG1zZ19sZW4pOworICAgIGZpbHRlcl9ubG1lc2coZGlzcGxheV9yb3V0ZV9pbmZvLCBOVUxMKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb3V0ZV9zaG93X2ZsdXNoKGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgYXJnbGlzdCBjbWRfb2JqZWN0bGlzdFtdID0ge3sicHJvdG9jb2wiLCAwfSwgeyJkZXYiLCAxfSwgeyJvaWYiLCAyfSwKKyAgICB7ImlpZiIsIDN9LCB7InZpYSIsIDR9LCB7InRhYmxlIiwgNX0sIHsiY2FjaGUiLCA2fSwgeyJmcm9tIiwgN30sIAorICAgIHsidG8iLCA4fSwgeyJhbGwiLCA5fSwgeyJyb290IiwgMTB9LCB7Im1hdGNoIiwgMTF9LCB7ImV4YWN0IiwgMTJ9LCAKKyAgICB7Im1haW4iLCAxM30sIHtOVUxMLC0xfX07CisgIGludCBmYW1pbHkgPSBUVC5hZGRyZXNzZmFtaWx5LCBpZHg7CisgIHN0cnVjdCB7CisgICAgc3RydWN0IG5sbXNnaGRyIG1oZHI7CisgICAgc3RydWN0IHJ0bXNnIG1zZzsKKyAgfSByZXF1ZXN0OworCisgIGlmICgqYXJndlstMV0gPT0gJ2YnKSBUVC5mbHVzaCA9IDE7CisgIGlmIChUVC5mbHVzaCAmJiAhKmFyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisKKyAgZ2ZpbHRlci50YiA9IFJUX1RBQkxFX01BSU47CisgIGZvciAoOyAqYXJndjsgYXJndisrKSB7CisgICAgc3dpdGNoIChpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2LCBjbWRfb2JqZWN0bGlzdCkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKCEqKythcmd2KSBzaG93X2lwcm91dGVfaGVscCgpOworICAgICAgICBpZiAoKGlkeCA9IGlkeGZyb21SUERCKCphcmd2LFJQREJfcnRwcm90b3MpKSA8IDApCisgICAgICAgICAgZXJyb3JfZXhpdCgiSW52YWxpZCBhcmd1bWVudCBwcm90b2NvbC4iKTsKKyAgICAgICAgZ2ZpbHRlci5wcm90byA9IGlkeDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICAgICAgaW50IGRldiA9IGdldF9pZmFjZWluZGV4KCphcmd2LCAxKTsKKworICAgICAgICAgIGlmIChpZHggPT0gMykgZ2ZpbHRlci5pZGV2ID0gZGV2OworICAgICAgICAgIGVsc2UgZ2ZpbHRlci5vZGV2ID0gZGV2OyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgICAgcGFyc2VfcHJlZml4KGdmaWx0ZXIucnZpYS5hZGRyLCAmZ2ZpbHRlci5ydmlhLm5ldG1hc2ssCisgICAgICAgICAgICAmZ2ZpbHRlci5ydmlhLmxlbiwgKmFyZ3YsIGdmaWx0ZXIucnZpYS5mYW1pbHkpOworICAgICAgICBpZiAoZ2ZpbHRlci5ydmlhLmxlbikKKyAgICAgICAgICBnZmlsdGVyLnJ2aWEuZmFtaWx5ID0gKChnZmlsdGVyLnJ2aWEubGVuID09IDQpID8KKyAgICAgICAgICAgICAgQUZfSU5FVCA6IEFGX0lORVQ2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgICAgaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndiwgY21kX29iamVjdGxpc3QpOworICAgICAgICBpZiAoaWR4ID09IDYpIGdmaWx0ZXIudGIgPSAtMTsKKyAgICAgICAgZWxzZSBpZiAoaWR4ID09IDkpIGdmaWx0ZXIudGIgPSAwOworICAgICAgICBlbHNlIGlmIChpZHggIT0gMTMpIHsKKyAgICAgICAgICBpZiAoKGdmaWx0ZXIudGIgPSBpZHhmcm9tUlBEQigqYXJndiwgUlBEQl9ydHRhYmxlcykpIDwgMCkKKyAgICAgICAgICAgIGVycm9yX2V4aXQoInRhYmxlICVzIGlzIGludmFsaWQuIiwgKmFyZ3YpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OgorICAgICAgICBnZmlsdGVyLnRiID0gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICAgIGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YsIGNtZF9vYmplY3RsaXN0KTsKKyAgICAgICAgaWYgKGlkeCA8IDApICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICAgIGlmIChpZHggPT0gMTApCisgICAgICAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgICAgICBwYXJzZV9wcmVmaXgoZ2ZpbHRlci5yc3JjLmFkZHIsICZnZmlsdGVyLnJzcmMubmV0bWFzaywKKyAgICAgICAgICAgICAgJmdmaWx0ZXIucnNyYy5sZW4sICphcmd2LCBnZmlsdGVyLnJzcmMuZmFtaWx5KTsKKyAgICAgICAgaWYgKGdmaWx0ZXIucnNyYy5sZW4pCisgICAgICAgICAgZ2ZpbHRlci5yc3JjLmZhbWlseSA9ICgoZ2ZpbHRlci5yc3JjLmxlbiA9PSA0KSA/CisgICAgICAgICAgICAgIEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgoaWR4ID09IDEyIHx8aWR4ID09IDExKSAmJiAhKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgICAgICBwYXJzZV9wcmVmaXgoZ2ZpbHRlci5tc3JjLmFkZHIsICZnZmlsdGVyLm1zcmMubmV0bWFzaywKKyAgICAgICAgICAgICAgJmdmaWx0ZXIubXNyYy5sZW4sICphcmd2LCBnZmlsdGVyLm1zcmMuZmFtaWx5KTsKKyAgICAgICAgICBpZiAoZ2ZpbHRlci5tc3JjLmxlbikKKyAgICAgICAgICAgIGdmaWx0ZXIubXNyYy5mYW1pbHkgPSAoKGdmaWx0ZXIubXNyYy5sZW4gPT0gNCkgPworICAgICAgICAgICAgICAgIEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICAgICAgaWYgKGlkeCAhPSAxMSkgZ2ZpbHRlci5yc3JjID0gZ2ZpbHRlci5tc3JjOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2LCBjbWRfb2JqZWN0bGlzdCk7CisgICAgICAgIGlmIChpZHggIT0gLTEgJiYgISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICBkZWZhdWx0OiAvLyBmYWxsdGhyb3VnaAorICAgICAgICBpZiAoaWR4ID09IDEwKSB7CisgICAgICAgICAgaWYgKCEqKythcmd2KSBzaG93X2lwcm91dGVfaGVscCgpOworICAgICAgICAgIHBhcnNlX3ByZWZpeChnZmlsdGVyLnJkc3QuYWRkciwgJmdmaWx0ZXIucmRzdC5uZXRtYXNrLAorICAgICAgICAgICAgICAmZ2ZpbHRlci5yZHN0LmxlbiwgKmFyZ3YsIGdmaWx0ZXIucmRzdC5mYW1pbHkpOworICAgICAgICBpZiAoZ2ZpbHRlci5yZHN0LmxlbikKKyAgICAgICAgICBnZmlsdGVyLnJkc3QuZmFtaWx5ID0gKChnZmlsdGVyLnJkc3QubGVuID09IDQpID8KKyAgICAgICAgICAgICAgQUZfSU5FVCA6IEFGX0lORVQ2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoKGlkeCA9PSAxMiB8fGlkeCA9PSAxMSkgJiYgISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICAgICAgcGFyc2VfcHJlZml4KGdmaWx0ZXIubWRzdC5hZGRyLCAmZ2ZpbHRlci5tZHN0Lm5ldG1hc2ssCisgICAgICAgICAgICAgICZnZmlsdGVyLm1kc3QubGVuLCAqYXJndiwgZ2ZpbHRlci5tZHN0LmZhbWlseSk7CisgICAgICAgICAgaWYgKGdmaWx0ZXIubWRzdC5sZW4pCisgICAgICAgICAgICBnZmlsdGVyLm1kc3QuZmFtaWx5ID0gKChnZmlsdGVyLm1kc3QubGVuID09IDQpID8KKyAgICAgICAgICAgICAgICBBRl9JTkVUIDogQUZfSU5FVDYpOworICAgICAgICAgIGlmIChpZHggIT0gMTEpIGdmaWx0ZXIucmRzdCA9IGdmaWx0ZXIubWRzdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGZhbWlseSA9PSBBRl9VTlNQRUMgJiYgZ2ZpbHRlci50YikgZmFtaWx5ID0gQUZfSU5FVDsKKworICBpZiAoVFQuZmx1c2gpIHsKKyAgICBpZiAoZ2ZpbHRlci50YiA8IDApIHsgLy8gZmx1c2ggdGFibGUgY2FjaGUKKyAgICAgIGlmIChmYW1pbHkgIT0gQUZfSU5FVDYpIHsKKyAgICAgICAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL3N5cy9uZXQvaXB2NC9yb3V0ZS9mbHVzaCIsICJ3Iik7CisKKyAgICAgICAgaWYgKGZ3cml0ZSgiLTEiLDEsMixmcCkgPCAyKSBlcnJvcl9leGl0KCJjYW4ndCBmbHVzaCByb3V0aW5nIGNhY2hlIik7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICB9CisgICAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQpIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIG1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mIChyZXF1ZXN0KSk7CisgIHJlcXVlc3QubWhkci5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mIChzdHJ1Y3QgcnRtc2cpKTsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX1JPT1QgfCBOTE1fRl9NQVRDSDsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisgIHJlcXVlc3QubXNnLnJ0bV9mYW1pbHkgPSBmYW1pbHk7CisgIGlmIChnZmlsdGVyLnRiIDwgMCkgcmVxdWVzdC5tc2cucnRtX2ZsYWdzID0gUlRNX0ZfQ0xPTkVEOworICBzZW5kX25sbWVzZygwLCAwLCAwLCAodm9pZCopJnJlcXVlc3QsIHNpemVvZiAocmVxdWVzdCkpOworICByZXR1cm4gKGZpbHRlcl9ubG1lc2coZGlzcGxheV9yb3V0ZV9pbmZvLCBOVUxMKSk7Cit9CisKK3N0YXRpYyBpbnQgcm91dGVfdXBkYXRlKGNoYXIgKiphcmd2LCB1bnNpZ25lZCBpbnQgcm91dGVfZmxhZ3MpCit7CisgIGNoYXIgbXhidWZbMjU2XSwgKmQgPSBOVUxMOworICBzdHJ1Y3QgcnRhdHRyICpteHJ0YSA9ICh2b2lkKilteGJ1ZjsKKyAgdW5zaWduZWQgbXhsb2NrID0gMCwgb2sgPSAwOworICBpbnQgaWR4OworICB1aW50MzJfdCBhZGRyWzhdID0gezAsfSwgbmV0bWFzayA9IDA7CisgIHVpbnQ4X3QgbGVuID0gMDsKKworICBzdHJ1Y3QgYXJnbGlzdCBjbWRfb2JqZWN0bGlzdFtdID0ge3sic3JjIiwgMH0sIHsidmlhIiwgMX0sIHsibXR1IiwgMn0sCisgICAgeyJsb2NrIiwgM30sIHsicHJvdG9jb2wiLCA0fSwgeyJ0YWJsZSIsIDV9LCB7ImRldiIsIDZ9LCB7Im9pZiIsIDd9LAorICAgIHsidG8iLCA4fSwgeyJtZXRyaWMiLCA5fSwge05VTEwsLTF9CisgIH07CisgIGVudW0geworICAgIGd0d3lfb2sgPSAxLAorICAgIGRzdF9vayA9IDIsCisgICAgcHJvdG9fb2sgPSA0LAorICAgIHR5cGVfb2sgPSA4CisgIH07CisgIHN0cnVjdCB7CisgICAgc3RydWN0IG5sbXNnaGRyIGhkcjsKKyAgICBzdHJ1Y3QgcnRtc2cgbXNnOworICAgIGNoYXIgYnVmWzEwMjRdOworICB9IHJlcTsKKworICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworICByZXEuaGRyLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisgIHJlcS5oZHIubmxtc2dfZmxhZ3MgPSBOTE1fRl9BQ0t8IE5MTV9GX1JFUVVFU1QgfCByb3V0ZV9mbGFnczsKKyAgcmVxLmhkci5ubG1zZ190eXBlID0gVFQucm91dGVfY21kOworICByZXEubXNnLnJ0bV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIHJlcS5tc2cucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKyAgcmVxLm1zZy5ydG1fc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworCisgIGlmIChUVC5yb3V0ZV9jbWQgIT0gUlRNX0RFTFJPVVRFKSB7CisgICAgcmVxLm1zZy5ydG1fcHJvdG9jb2wgPSBSVFBST1RfQk9PVDsKKyAgICByZXEubXNnLnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworICAgIHJlcS5tc2cucnRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKyAgfQorCisgIG14cnRhLT5ydGFfdHlwZSA9IFJUQV9NRVRSSUNTOworICBteHJ0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoMCk7CisKKyAgZm9yICg7ICphcmd2OyBhcmd2KyspIHsKKyAgICBpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2LCBjbWRfb2JqZWN0bGlzdCk7CisgICAgaWYgKCFpZHgpIHsKKyAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIHBhcnNlX3ByZWZpeChhZGRyLCAmbmV0bWFzaywgJmxlbiwgKmFyZ3YsIHJlcS5tc2cucnRtX2ZhbWlseSk7CisgICAgICBpZiAobGVuKSByZXEubXNnLnJ0bV9mYW1pbHkgPSAoKGxlbiA9PSA0KSA/IEFGX0lORVQgOiBBRl9JTkVUNik7CisgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLmhkciwgc2l6ZW9mKHJlcSksIFJUQV9QUkVGU1JDLCBhZGRyLCBsZW4pOworICAgIH0gZWxzZSBpZiAoaWR4ID09IDEpIHsKKyAgICAgIG9rIHw9IGd0d3lfb2s7CisgICAgICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICBwYXJzZV9wcmVmaXgoYWRkciwgJm5ldG1hc2ssICZsZW4sICphcmd2LCByZXEubXNnLnJ0bV9mYW1pbHkpOworICAgICAgaWYgKGxlbikgcmVxLm1zZy5ydG1fZmFtaWx5ID0gKChsZW4gPT0gNCkgPyBBRl9JTkVUIDogQUZfSU5FVDYpOworICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5oZHIsIHNpemVvZihyZXEpLFJUQV9HQVRFV0FZLCBhZGRyLCBsZW4pOworICAgIH0gZWxzZSBpZiAoaWR4ID09IDIpIHsKKyAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIGlmIChzdWJzdHJpbmdfdG9faWR4KCphcmd2LCBjbWRfb2JqZWN0bGlzdCApID09IDMpIHsKKyAgICAgICAgbXhsb2NrIHw9ICgxIDw8IFJUQVhfTVRVKTsKKyAgICAgICAgaWYgKCEqKythcmd2KSBzaG93X2lwcm91dGVfaGVscCgpOworICAgICAgfQorICAgICAgaWR4ID0gYXRvbHgoKmFyZ3YpOworICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5oZHIsIHNpemVvZihyZXEpLAorICAgICAgICAgIFJUQVhfTVRVLCAoY2hhciopJmlkeCwgc2l6ZW9mKGlkeCkpOworICAgIH0gZWxzZSBpZiAoaWR4ID09IDQpIHsKKyAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIGlmICgoaWR4ID0gaWR4ZnJvbVJQREIoKmFyZ3YsUlBEQl9ydHByb3RvcykpIDwgMCkKKyAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgYXJndW1lbnQgcHJvdG9jb2wgJXMuIiwqYXJndik7CisgICAgICByZXEubXNnLnJ0bV9wcm90b2NvbCA9IGlkeDsKKyAgICAgIG9rIHw9IHByb3RvX29rOworICAgIH0gZWxzZSBpZiAoaWR4ID09IDUpIHsKKyAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIHJlcS5tc2cucnRtX3RhYmxlID0gaWR4ZnJvbVJQREIoKmFyZ3YsIFJQREJfcnR0YWJsZXMpOworICAgIH0gZWxzZSBpZiAoaWR4ID09IDYgfHwgaWR4ID09IDcpIHsKKyAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIGQgPSAqYXJndjsKKyAgICB9IGVsc2UgaWYgKGlkeCA9PSA5KSB7CisgICAgICB1bnNpZ25lZCBsb25nIG1ldHJpYzsKKyAgICAgIHVuc2lnbmVkIGludCByZXM7CisgICAgICBjaGFyKiBwdHI7CisgICAgICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICBtZXRyaWMgPSBzdHJ0b3VsKCphcmd2LCAmcHRyLCAwKTsKKwkJICBpZiAoISghKnB0ciAmJiBtZXRyaWMgPD0gMHhGRkZGRkZGRlVMKSkgCisgICAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgYXJndW1lbnQgbWV0cmljICVzLiIsKmFyZ3YpOworICAgICAgZWxzZQorICAgICAgICByZXMgPSBtZXRyaWM7CisgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLmhkciwgc2l6ZW9mKHJlcSksCisgICAgICAgICAgUlRBX1BSSU9SSVRZLCAoY2hhciopJnJlcywgc2l6ZW9mKHJlcykpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaWR4ID09IDgpCisgICAgICAgIGlmICghKisrYXJndikgc2hvd19pcHJvdXRlX2hlbHAoKTsKKyAgICAgIGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YscnRtdHlwZXMpOworICAgICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICBpZiAoISorK2FyZ3YpIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgICAgICAgIHJlcS5tc2cucnRtX3R5cGUgPSBpZHg7CisgICAgICAgIG9rIHw9IHR5cGVfb2s7CisgICAgICB9CisgICAgICBpZiAob2sgJiBkc3Rfb2spIGVycm9yX2V4aXQoIkR1cGxpY2F0ZSBhcmd1bWVudCAndG8nIik7CisgICAgICBwYXJzZV9wcmVmaXgoYWRkciwgJm5ldG1hc2ssICZsZW4sICphcmd2LCByZXEubXNnLnJ0bV9mYW1pbHkpOworICAgICAgaWYgKGxlbikgcmVxLm1zZy5ydG1fZmFtaWx5ID0gKChsZW4gPT0gNCkgPyBBRl9JTkVUIDogQUZfSU5FVDYpOworICAgICAgcmVxLm1zZy5ydG1fZHN0X2xlbiA9IG5ldG1hc2s7CisgICAgICBvayB8PSBkc3Rfb2s7CisgICAgICBpZiAobGVuKSBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLmhkciwgc2l6ZW9mKHJlcSksUlRBX0RTVCwgYWRkciwgbGVuKTsKKyAgICB9CisgIH0KKworICBpZiAoZCkgeworICAgIGlkeCA9IGdldF9pZmFjZWluZGV4KGQsMSk7CisgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5oZHIsIHNpemVvZihyZXEpLAorICAgICAgICBSVEFfT0lGLCAoY2hhciopJmlkeCwgc2l6ZW9mKGlkeCkpOworICB9CisgIGlmIChteHJ0YS0+cnRhX2xlbiA+IFJUQV9MRU5HVEgoMCkpIHsKKyAgICBpZiAobXhsb2NrKQorICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcS5oZHIsIHNpemVvZihyZXEpLAorICAgICAgICAgIFJUQVhfTE9DSywgKGNoYXIqKSZteGxvY2ssIHNpemVvZihteGxvY2spKTsKKyAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxLmhkciwgc2l6ZW9mKHJlcSksCisgICAgICAgIFJUQV9NRVRSSUNTLCBSVEFfREFUQShteHJ0YSksIFJUQV9QQVlMT0FEKG14cnRhKSk7CisgIH0KKworICBpZiAocmVxLm1zZy5ydG1fdHlwZSA9PSBSVE5fTE9DQUwgfHwgcmVxLm1zZy5ydG1fdHlwZSA9PSBSVE5fTkFUKQorICAgIHJlcS5tc2cucnRtX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKyAgZWxzZSBpZiAocmVxLm1zZy5ydG1fdHlwZSA9PSBSVE5fQlJPQURDQVNUfHxyZXEubXNnLnJ0bV90eXBlID09IFJUTl9NVUxUSUNBU1QKKyAgICAgIHx8IHJlcS5tc2cucnRtX3R5cGUgPT0gUlROX0FOWUNBU1QpCisgICAgcmVxLm1zZy5ydG1fc2NvcGUgPSBSVF9TQ09QRV9MSU5LOworICBlbHNlIGlmIChyZXEubXNnLnJ0bV90eXBlID09IFJUTl9VTklDQVNUIHx8IHJlcS5tc2cucnRtX3R5cGUgPT0gUlROX1VOU1BFQykgeworICAgIGlmIChUVC5yb3V0ZV9jbWQgPT0gUlRNX0RFTFJPVVRFKQorICAgICAgcmVxLm1zZy5ydG1fc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworICAgIGVsc2UgaWYgKCEob2sgJiBndHd5X29rKSkKKyAgICAgIHJlcS5tc2cucnRtX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKyAgfQorICBpZiAocmVxLm1zZy5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgcmVxLm1zZy5ydG1fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc2VuZF9ubG1lc2coMCwgMCwgMCwgJnJlcSwgc2l6ZW9mKHJlcSkpOworICBmaWx0ZXJfbmxtZXNnKE5VTEwsIE5VTEwpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHJvdXRlKGNoYXIgKiphcmd2KQoreworICBpbnQgaWR4ID0gMTsKKyAgc3RydWN0IGFyZ2xpc3QgY21kX29iamVjdGxpc3QxW10gPSB7eyJhZGQiLCAwfSwgeyJhcHBlbmQiLCAxfSx7ImNoYW5nZSIsIDJ9LAorICAgIHsiY2hnIiwgM30seyJkZWxldGUiLDR9LCB7ImdldCIsIDV9LCB7Imxpc3QiLCA2fSwgeyJzaG93IiwgN30sCisgICAgeyJwcmVwZW5kIiwgOH0seyJyZXBsYWNlIiwgOX0seyJ0ZXN0IiwgMTB9LCB7ImZsdXNoIiwgMTF9LHtOVUxMLC0xfX07CisKKyAgVFQucm91dGVfY21kID0gUlRNX05FV1JPVVRFOworICBzd2l0Y2ggKGlkeCA9IHN1YnN0cmluZ190b19pZHgoKmFyZ3YgLCBjbWRfb2JqZWN0bGlzdDEpKSB7CisgICAgY2FzZSAwOiAvLyBhZGQKKyAgICAgIHJldHVybiByb3V0ZV91cGRhdGUoKythcmd2ICwgTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0wpOworICAgIGNhc2UgMTogLy8gYXBwZW5kCisgICAgICByZXR1cm4gcm91dGVfdXBkYXRlKCsrYXJndiAsIE5MTV9GX0NSRUFURXxOTE1fRl9BUFBFTkQpOworICAgIGNhc2UgMjogLy8gY2hhbmdlCisgICAgY2FzZSAzOiAvLyBjaGcKKyAgICAgIHJldHVybiByb3V0ZV91cGRhdGUoKythcmd2ICwgTkxNX0ZfUkVQTEFDRSk7CisgICAgY2FzZSA0OiAvLyBkZWxldGUKKyAgICAgIFRULnJvdXRlX2NtZCA9IFJUTV9ERUxST1VURTsKKyAgICAgIHJldHVybiByb3V0ZV91cGRhdGUoKythcmd2ICwgUlRNX0RFTFJPVVRFKTsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gcm91dGVfZ2V0KCsrYXJndik7CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiByb3V0ZV9zaG93X2ZsdXNoKCsrYXJndik7CisgICAgY2FzZSA4OiAvLyBwcmVwZW5kCisgICAgICByZXR1cm4gcm91dGVfdXBkYXRlKCsrYXJndiAsIE5MTV9GX0NSRUFURSk7CisgICAgY2FzZSA5OiAvLyByZXBsYWNlCisgICAgICByZXR1cm4gcm91dGVfdXBkYXRlKCsrYXJndiAsICBOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRSk7CisgICAgY2FzZSAxMDogLy8gdGVzdAorICAgICAgcmV0dXJuIHJvdXRlX3VwZGF0ZSgrK2FyZ3YgLCBOTE1fRl9FWENMKTsKKyAgICBjYXNlIDExOiAvLyBmbHVzaAorICAgICAgcmV0dXJuIHJvdXRlX3Nob3dfZmx1c2goKythcmd2KTsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCEqYXJndikgcmV0dXJuIHJvdXRlX3Nob3dfZmx1c2goYXJndik7CisgICAgICBlbHNlIHNob3dfaXByb3V0ZV9oZWxwKCk7CisgIH0KKyAgcmV0dXJuIDA7IC8vIG5vbiByZWFjaGFibGUgY29kZS4KK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvZGUgZm9yIGlwIHJ1bGUuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyB2b2lkIHNob3dfaXBydWxlX2hlbHAodm9pZCkKK3sKKyAgY2hhciAqZXJybXNnID0gIlVzYWdlOiBpcCBydWxlIFsgbGlzdCB8IGFkZCB8IGRlbCBdIFNFTEVDVE9SIEFDVElPTlxuIgorICAgICJTRUxFQ1RPUiA6PSBbIGZyb20gUFJFRklYIF0gWyB0byBQUkVGSVggXSBbcHJlZiBOVU1CRVJdIFsgdG9zIFRPUyBdXG4iCisgICAgIiAgICAgICAgICAgIFsgZndtYXJrIEZXTUFSS10gWyBkZXYvaWlmIFNUUklORyBdIFt0eXBlIFRZUEVdXG4iCisgICAgIkFDVElPTiA6PSBbIHRhYmxlIFRBQkxFX0lEIF0gWyByZWFsbXMgW1NSQ1JFQUxNL11EU1RSRUFMTSBdIjsKKworICBlcnJvcl9leGl0KGVycm1zZyk7Cit9CisKK3N0YXRpYyBpbnQgcnVsZXVwZGF0ZShjaGFyICoqYXJndikKK3sKKyAgaW50OF90IGlkeCwgdGZsYWcgPSAwLCBvcHQgPSAoKmFyZ3ZbLTFdID09ICdhJykgPyBSVE1fTkVXUlVMRSA6IFJUTV9ERUxSVUxFOworICBzdHJ1Y3QgYXJnbGlzdCBvcHRpb25zW10gPSB7eyJmcm9tIiwgMH0sIHsidG8iLCAxfSwgeyJwcmVmZXJlbmNlIiwgMn0sCisgICAgeyJvcmRlciIsIDJ9LCB7InByaW9yaXR5IiwgMn0sIHsidG9zIiwgM30sIHsiZHNmaWVsZCIsIDN9LCB7ImZ3bWFyayIsIDR9LAorICAgIHsicmVhbG1zIiwgNX0sIHsidGFibGUiLCA2fSwgeyJsb29rdXAiLCA2fSwgeyJkZXYiLCA3fSwgeyJpaWYiLCA3fSwKKyAgICB7Im5hdCIsIDh9LCB7Im1hcC10byIsIDh9LCB7InR5cGUiLCA5fSwgeyJoZWxwIiwgMTB9LCB7TlVMTCwgLTF9fTsKKyAgc3RydWN0IHsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIgbWhkcjsKKyAgICBzdHJ1Y3QgcnRtc2cgICAgbXNnOworICAgIGNoYXIgYnVmWzEwMjRdOworICB9IHJlcXVlc3Q7CisKKyAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworICByZXF1ZXN0Lm1oZHIubmxtc2dfdHlwZSA9IG9wdDsKKyAgcmVxdWVzdC5taGRyLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7CisgIHJlcXVlc3QubWhkci5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0sgfAorICAgICgob3B0ID09IFJUTV9ERUxSVUxFKSA/IDAgOiBOTE1fRl9DUkVBVEUgfCBOTE1fRl9FWENMKTsKKyAgcmVxdWVzdC5tc2cucnRtX2ZhbWlseSA9IFRULmFkZHJlc3NmYW1pbHk7CisgIHJlcXVlc3QubXNnLnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9CT09UOworICByZXF1ZXN0Lm1zZy5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKyAgcmVxdWVzdC5tc2cucnRtX3RhYmxlID0gMDsKKyAgcmVxdWVzdC5tc2cucnRtX3R5cGUgPSAoKG9wdCA9PSBSVE1fREVMUlVMRSkgPyBSVE5fVU5TUEVDIDogUlROX1VOSUNBU1QpOworCisgIGZvciAoOyAqYXJndjsgYXJndisrKSB7CisgICAgc3dpdGNoICgoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndiwgb3B0aW9ucykpKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6IAorICAgICAgICB7IC8vIGUuZy4gZnJvbSBJUC9OZXRtYXNrIGFuZCB0byBJUC9OZXRtYXNrLgorICAgICAgICAgIHVpbnQzMl90IGFkZHJbNF0gPSB7MCx9LCBuZXRtYXNrID0gMDsKKyAgICAgICAgICB1aW50OF90IGxlbiA9IDAsICp0bXA7CisKKyAgICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoIiclcyc6IE1pc3NpbmcgUHJlZml4IiwgYXJndlstMV0pOworICAgICAgICAgIHBhcnNlX3ByZWZpeChhZGRyLCAmbmV0bWFzaywgJmxlbiwgKmFyZ3YsIHJlcXVlc3QubXNnLnJ0bV9mYW1pbHkpOworCisgICAgICAgICAgdG1wID0gaWR4ID8gJnJlcXVlc3QubXNnLnJ0bV9kc3RfbGVuIDogJnJlcXVlc3QubXNnLnJ0bV9zcmNfbGVuOworICAgICAgICAgIGlmICghbmV0bWFzaykgKnRtcCA9IDA7CisgICAgICAgICAgZWxzZSAqdG1wID0gbmV0bWFzazsKKworICAgICAgICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKCZyZXF1ZXN0Lm1oZHIsIHNpemVvZihyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgKGlkeCA/IFJUQV9EU1QgOiBSVEFfU1JDKSwgYWRkciwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgNDogCisgICAgICAgIHsgLy8gZS5nLiBQcmVmZXJlbmNlIHAjIGFuZCBmd21hcmsgTUFSSworICAgICAgICAgIHVpbnQzMl90IHByZWY7CisgICAgICAgICAgY2hhciAqcHRyOworCisgICAgICAgICAgaWYgKCEqKythcmd2KQorICAgICAgICAgICAgZXJyb3JfZXhpdCgiTWlzc2luZyAlcyIsIChpZHggPT0gMikgPyAiUHJlZmVyZW5jZSIgOiAiZndtYXJrIik7CisgICAgICAgICAgcHJlZiA9IHN0cnRvdWwoKmFyZ3YsICZwdHIsIDApOworICAgICAgICAgIGlmICghcHRyIHx8IChwdHIgPT0gKmFyZ3YpIHx8ICpwdHIgIHx8IHByZWYgPiAweEZGRkZGRkZGVUwpCisgICAgICAgICAgICBlcnJvcl9leGl0KCJJbnZhbGlkICVzIiwgIChpZHggPT0gMikgPyAiUHJlZmVyZW5jZSIgOiAiZndtYXJrIik7CisgICAgICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcXVlc3QubWhkciwgc2l6ZW9mKHJlcXVlc3QpLAorICAgICAgICAgICAgICAoKGlkeCA9PSAyKSA/IFJUQV9QUklPUklUWSA6IFJUQV9QUk9UT0lORk8pLAorICAgICAgICAgICAgICAodm9pZCAqKSZwcmVmLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgIHVpbnQzMl90IHRvczsKKyAgICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoIk1pc3NpbmcgVE9TIGtleSIpOworICAgICAgICAgIGlmICgodG9zID0gaWR4ZnJvbVJQREIoKmFyZ3YsIFJQREJfcnRkc2ZpZWxkKSkgPCAwKQorICAgICAgICAgICAgZXJyb3JfZXhpdCgiSW52YWxpZCBUT1MiKTsKKyAgICAgICAgICByZXF1ZXN0Lm1zZy5ydG1fdG9zID0gdG9zOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICB7IC8vIGUuZy4gcmVhbG1zIEZST01fcmVhbG0vVE9fcmVhbG0KKyAgICAgICAgICB1aW50MzJfdCByZWFsbXMgPSAwOworICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgY2hhciAqcHRyOworCisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJNaXNzaW5nIFJFQUxNU0lEIik7CisgICAgICAgICAgaWYgKChwdHIgPSBzdHJjaHIoKmFyZ3YsICcvJykpKSB7CisgICAgICAgICAgICAqcHRyID0gMDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gaWR4ZnJvbVJQREIoKmFyZ3YsIFJQREJfcnRyZWFsbXMpKSA8IDApCisgICAgICAgICAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgcmVhbG1zIik7CisgICAgICAgICAgICByZWFsbXMgPSByZXQ7CisgICAgICAgICAgICByZWFsbXMgPDw9IDE2OworICAgICAgICAgICAgKnB0cisrID0gJy8nOworICAgICAgICAgIH0gZWxzZSBwdHIgPSAqYXJndjsKKyAgICAgICAgICBpZiAoKHJldCA9IGlkeGZyb21SUERCKHB0ciwgUlBEQl9ydHJlYWxtcykpIDwgMCkKKyAgICAgICAgICAgIGVycm9yX2V4aXQoIkludmFsaWQgcmVhbG1zIik7CisgICAgICAgICAgcmVhbG1zIHw9IHJldDsKKyAgICAgICAgICBhZGRfc3RyaW5nX3RvX3J0YXR0cigmcmVxdWVzdC5taGRyLCBzaXplb2YocmVxdWVzdCksCisgICAgICAgICAgICAgIFJUQV9GTE9XLCAodm9pZCAqKSZyZWFsbXMsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OgorICAgICAgICB7IC8vIGUuZy4gdGFibGUgdGlkL3RhYmxlTmFtZQorICAgICAgICAgIGludCB0aWQ7CisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJNaXNzaW5nIFRhYmxlSUQiKTsKKyAgICAgICAgICBpZiAoKHRpZCA9IGlkeGZyb21SUERCKCphcmd2LCBSUERCX3J0dGFibGVzKSkgPCAwKQorICAgICAgICAgICAgZXJyb3JfZXhpdCgiSW52YWxpZCBUSUQiKTsKKyAgICAgICAgICByZXF1ZXN0Lm1zZy5ydG1fdGFibGUgPSB0aWQ7CisgICAgICAgICAgdGZsYWcgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICB7CisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJNaXNzaW5nIGRldi9paWYgTkFNRSIpOworICAgICAgICAgIGFkZF9zdHJpbmdfdG9fcnRhdHRyKCZyZXF1ZXN0Lm1oZHIsIHNpemVvZihyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgUlRBX0lJRiwgKmFyZ3YsIHN0cmxlbigqYXJndikrMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIHsKKyAgICAgICAgICB1aW50MzJfdCBhZGRyWzRdID0gezAsfTsKKyAgICAgICAgICB1aW50OF90IGFmID0gQUZfVU5TUEVDOworCisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJNaXNzaW5nIG5hdC9tYXAtdG8gQUREUkVTUyIpOworICAgICAgICAgIGlmIChnZXRfcHJlZml4KGFkZHIsICZhZiAvKiBVbi11c2VkIHZhcmlhYmxlICovLCAqYXJndiwgQUZfSU5FVCkpCisgICAgICAgICAgICBlcnJvcl9leGl0KCJJbnZhbGlkIG1hcHBpbmcgQWRkcmVzcyIpOworCisgICAgICAgICAgYWRkX3N0cmluZ190b19ydGF0dHIoJnJlcXVlc3QubWhkciwgc2l6ZW9mKHJlcXVlc3QpLAorICAgICAgICAgICAgICBSVEFfR0FURVdBWSwgYWRkciwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgcmVxdWVzdC5tc2cucnRtX3R5cGUgPSBSVE5fTkFUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OgorICAgICAgICB7CisgICAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJUWVBFIE1pc3NpbmciKTsKKyAgICAgICAgICByZXF1ZXN0Lm1zZy5ydG1fdHlwZSA9IHJ0bXR5cGVfc3RyMmlkeCgqYXJndik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwOiAKKyAgICAgICAgc2hvd19pcHJ1bGVfaGVscCgpOworICAgICAgICBicmVhazsgLy8gVW5yZWFjaGFibGUgY29kZS4KKyAgICAgIGRlZmF1bHQ6IAorICAgICAgICBlcnJvcl9leGl0KCJJbnZhbGlkIGFyZ3VtZW50ICclcyciLCAqYXJndik7CisgICAgICAgIGJyZWFrOyAvLyBVbnJlYWNoYWJsZSBjb2RlLgorICAgIH0KKyAgfQorCisgIGlmICghcmVxdWVzdC5tc2cucnRtX2ZhbWlseSkgcmVxdWVzdC5tc2cucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisgIGlmICghdGZsYWcgJiYgb3B0ID09IFJUTV9ORVdSVUxFKSByZXF1ZXN0Lm1zZy5ydG1fdGFibGUgPSBSVF9UQUJMRV9NQUlOOworCisgIHNlbmRfbmxtZXNnKDAsIDAsIDAsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpOworICByZXR1cm4gKGZpbHRlcl9ubG1lc2coTlVMTCwgTlVMTCkpOworfQorCitzdGF0aWMgaW50IHNob3dfcnVsZXMoc3RydWN0IG5sbXNnaGRyICptaGRyLAorICAgIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkpCit7CisgIHN0cnVjdCBydG1zZyAqbXNnID0gTkxNU0dfREFUQShtaGRyKTsKKyAgc3RydWN0IHJ0YXR0ciAqcnRhLCAqYXR0cltSVEFfTUFYKzFdID0gezAsfTsKKyAgaW50MzJfdCB0dmFyLCBtc2dsZW4gPSBtaGRyLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworICBpbnQgaGxlbiA9ICgobXNnLT5ydG1fZmFtaWx5ID09IEFGX0lORVQpID8gMzIKKyAgICAgIDogKChtc2ctPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpID8gMTI4IDogLTEpKTsKKworICBpZiAobWhkci0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUlVMRSkgcmV0dXJuIDA7CisgIGlmIChtc2dsZW4gPCAwKSByZXR1cm4gMTsKKworICB0dmFyID0gbXNnbGVuOworICBmb3IgKHJ0YSA9IFJUTV9SVEEobXNnKTsgUlRBX09LKHJ0YSwgdHZhcik7IHJ0YT1SVEFfTkVYVChydGEsIHR2YXIpKQorICAgIGlmIChydGEtPnJ0YV90eXBlIDw9IFJUQV9NQVgpIGF0dHJbcnRhLT5ydGFfdHlwZV0gPSBydGE7CisKKyAgaWYgKHR2YXIpIGVycm9yX21zZygiZGVmaWNpdCAlZCwgcnRhbGVuID0gJWQhIiwgdHZhciwgcnRhLT5ydGFfbGVuKTsKKworICBwcmludGYoIiV1Olx0ZnJvbSAiLCBhdHRyW1JUQV9QUklPUklUWV0gPworICAgICAgKih1bnNpZ25lZCAqKVJUQV9EQVRBKGF0dHJbUlRBX1BSSU9SSVRZXSkgOiAwKTsKKworICBpZiAoYXR0cltSVEFfU1JDXSkgeworICAgIHByaW50ZigiJXMiLCAobXNnLT5ydG1fZmFtaWx5ID09IEFGX0lORVQgfHwgbXNnLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KQorICAgICAgICA/IGluZXRfbnRvcChtc2ctPnJ0bV9mYW1pbHksIFJUQV9EQVRBKGF0dHJbUlRBX1NSQ10pLAorICAgICAgICAgIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpCisgICAgICAgIDogIj8/PyIpOworICAgIChtc2ctPnJ0bV9zcmNfbGVuICE9IGhsZW4pID8gcHJpbnRmKCIvJXUiLCBtc2ctPnJ0bV9zcmNfbGVuKSA6IDA7CisgIH0gZWxzZSBtc2ctPnJ0bV9zcmNfbGVuID8gcHJpbnRmKCIwLyVkIiwgbXNnLT5ydG1fc3JjX2xlbikgOiBwcmludGYoImFsbCIpOworCisgIHhwdXRjKCcgJyk7CisgIGlmIChhdHRyW1JUQV9EU1RdKSB7CisgICAgcHJpbnRmKCJ0byAlcyIsIChtc2ctPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVCB8fCBtc2ctPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpCisgICAgICAgID8gaW5ldF9udG9wKG1zZy0+cnRtX2ZhbWlseSwgUlRBX0RBVEEoYXR0cltSVEFfRFNUXSksCisgICAgICAgICAgdG95YnVmLCBzaXplb2YodG95YnVmKSkgIDogIj8/PyIpOworICAgIChtc2ctPnJ0bV9kc3RfbGVuICE9IGhsZW4pID8gcHJpbnRmKCIvJXUiLCBtc2ctPnJ0bV9kc3RfbGVuKSA6IHhwdXRjKCcgJyk7CisgIH0gZWxzZSBpZiAobXNnLT5ydG1fZHN0X2xlbikKKyAgICBwcmludGYoInRvIDAvJWQgIiwgbXNnLT5ydG1fZHN0X2xlbik7CisKKyAgaWYgKG1zZy0+cnRtX3RvcykKKyAgICBwcmludGYoInRvcyAlcyAiLCBuYW1lZnJvbVJQREIobXNnLT5ydG1fdG9zLCBSUERCX3J0ZHNmaWVsZCkpOworCisgIGlmIChhdHRyW1JUQV9QUk9UT0lORk9dKQorICAgIHByaW50ZigiZndtYXJrICUjeCAiLCAqKHVpbnQzMl90KilSVEFfREFUQShhdHRyW1JUQV9QUk9UT0lORk9dKSk7CisKKyAgaWYgKGF0dHJbUlRBX0lJRl0pIHByaW50ZigiaWlmICVzICIsIChjaGFyKilSVEFfREFUQShhdHRyW1JUQV9JSUZdKSk7CisKKyAgaWYgKG1zZy0+cnRtX3RhYmxlKQorICAgIHByaW50ZigibG9va3VwICVzICIsIG5hbWVmcm9tUlBEQihtc2ctPnJ0bV90YWJsZSwgUlBEQl9ydHRhYmxlcykpOworCisgIGlmIChhdHRyW1JUQV9GTE9XXSkgeworICAgIHVfaW50MzJfdCBmcm9tLCB0byA9ICoodV9pbnQzMl90ICopUlRBX0RBVEEoYXR0cltSVEFfRkxPV10pOworICAgIGNoYXIgKmZvcm1hdCA9ICJyZWFsbXMgJXMvIjsKKworICAgIHRvID0gKGZyb20gPSAodG8gPj4gMTYpKSAmIDB4RkZGRjsKKyAgICBmb3JtYXQgPSAoZnJvbSA/IGZvcm1hdDogIiVzIik7CisgICAgcHJpbnRmKGZvcm1hdCwgbmFtZWZyb21SUERCKChmcm9tID8gZnJvbSA6IHRvKSwgUlBEQl9ydHJlYWxtcykpOworICB9CisKKyAgaWYgKG1zZy0+cnRtX3R5cGUgPT0gUlROX05BVCkgeworICAgIGlmICghYXR0cltSVEFfR0FURVdBWV0pIHByaW50ZigibWFzcXVlcmFkZSIpOworICAgIGVsc2UgcHJpbnRmKCJtYXAtdG8gJXMgIiwgaW5ldF9udG9wKG1zZy0+cnRtX2ZhbWlseSwKKyAgICAgICAgICBSVEFfREFUQShhdHRyW1JUQV9HQVRFV0FZXSksIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpKTsKKyAgfSBlbHNlIGlmIChtc2ctPnJ0bV90eXBlICE9IFJUTl9VTklDQVNUKQorICAgIHByaW50ZigiJXMiLCBydG10eXBlX2lkeDJzdHIobXNnLT5ydG1fdHlwZSkpOworCisgIHhwdXRjKCdcbicpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydWxlbGlzdChjaGFyICoqYXJndikKK3sKKyAgaWYgKCphcmd2KSB7CisgICAgZXJyb3JfbXNnKCInaXAgcnVsZSBzaG93JyBkb2VzIG5vdCB0YWtlIGFueSBhcmd1bWVudHMuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc2VuZF9ubG1lc2coUlRNX0dFVFJVTEUsIE5MTV9GX1JPT1QgfCBOTE1fRl9NQVRDSCB8IE5MTV9GX1JFUVVFU1QsCisgICAgICAoKFRULmFkZHJlc3NmYW1pbHkgIT0gQUZfVU5TUEVDKSA/IFRULmFkZHJlc3NmYW1pbHkgOiBBRl9JTkVUKSwgTlVMTCwgMCk7CisgIHJldHVybiBmaWx0ZXJfbmxtZXNnKHNob3dfcnVsZXMsIGFyZ3YpOworfQorCitzdGF0aWMgaW50IGlwcnVsZShjaGFyICoqYXJndikKK3sKKyAgaW50IGlkeDsKKyAgc3RydWN0IGFyZ2xpc3Qgb3B0aW9uc1tdID0ge3siYWRkIiwgMH0sIHsiZGVsZXRlIiwgMH0sIHsibGlzdCIsIDF9LAorICAgIHsic2hvdyIsIDF9LCB7TlVMTCwgLTF9fTsKKyAgY21kb2JqIGlwY21kLCBjbWRvYmpsaXN0W10gPSB7cnVsZXVwZGF0ZSwgcnVsZWxpc3R9OworCisgIGlmICghKmFyZ3YpIGlkeCA9IDE7CisgIGVsc2UgaWYgKChpZHggPSBzdWJzdHJpbmdfdG9faWR4KCphcmd2KyssIG9wdGlvbnMpKSA9PSAtMSkKKyAgICBzaG93X2lwcnVsZV9oZWxwKCk7CisgIGlwY21kID0gY21kb2JqbGlzdFtpZHhdOworICByZXR1cm4gaXBjbWQoYXJndik7Cit9CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvZGUgZm9yIGlwIHR1bm5lbC4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorc3RhdGljIHZvaWQgc2hvd19pcHR1bm5lbF9oZWxwKHZvaWQpCit7CisgIGNoYXIgKmVycm1zZyA9ICJVc2FnZTogaXB0dW5uZWwgeyBhZGQgfCBjaGFuZ2UgfCBkZWwgfCBzaG93IH0gW05BTUVdXG4iCisgICAgIiAgICAgICAgICAgW21vZGUgeyBpcGlwIHwgZ3JlIHwgc2l0IH1dIFtyZW1vdGUgQUREUl0gW2xvY2FsIEFERFJdXG4iCisgICAgIiAgICAgICAgICAgW1tpfG9dc2VxXSBbW2l8b11rZXkgS0VZXSBbW2l8b11jc3VtXSBbdHRsIFRUTF1cbiIKKyAgICAiICAgICAgICAgICBbdG9zIFRPU10gW1tub11wbXR1ZGlzY10gW2RldiBQSFlTX0RFVl0iOworCisgIGVycm9yX2V4aXQoZXJybXNnKTsKK30KKworc3RhdGljIGludCB0bmxfaW9jdGwoY2hhciAqZGV2LCBpbnQgcnR5cGUsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcHRubCkKK3sKKyAgc3RydWN0IGlmcmVxIHJlcTsKKyAgaW50IGZkLCByZXQgPSAwOworCisgIGlmICgocnR5cGUgPT0gU0lPQ0NIR1RVTk5FTCB8fCBydHlwZSA9PSBTSU9DREVMVFVOTkVMKSAmJiAqcHRubC0+bmFtZSkKKyAgICB4c3RybmNweShyZXEuaWZyX25hbWUsIHB0bmwtPm5hbWUsIElGX05BTUVTSVpFKTsKKyAgZWxzZSB4c3RybmNweShyZXEuaWZyX25hbWUsIGRldiwgSUZfTkFNRVNJWkUpOworCisgIGlmIChydHlwZSAhPSBTSU9DR0lGSFdBRERSKSByZXEuaWZyX2lmcnUuaWZydV9kYXRhID0gKHZvaWQqKXB0bmw7CisgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworICBpZiAocnR5cGUgPT0gU0lPQ0dFVFRVTk5FTCkgcmV0ID0gaW9jdGwoZmQsIHJ0eXBlLCAmcmVxKTsKKyAgZWxzZSBpZiAocnR5cGUgPT0gU0lPQ0dJRkhXQUREUikKKyAgICByZXQgPSAoaW9jdGwoZmQsIHJ0eXBlLCAmcmVxKSA8IDApID8gLTEgOiByZXEuaWZyX2FkZHIuc2FfZmFtaWx5OworICBlbHNlIHhpb2N0bChmZCwgcnR5cGUsICZyZXEpOworCisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkaXNwbGF5X3R1bm5lbChzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnB0bmwpCit7CisgIGNoYXIgcm10X2FkZHJbNjRdLCBsY2xfYWRkcls2NF0sIGlrZXlfc3RyWzY0XSwgb2tleV9zdHJbNjRdOworCisgIHByaW50ZigiJXM6ICVzL2lwIiwgcHRubC0+bmFtZSwgcHRubC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBJUCA/ICJpcCIgOgorICAgICAgKHB0bmwtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0dSRSA/ICJncmUiIDoKKyAgICAgICAocHRubC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBWNiA/ICJpcHY2IiA6ICJ1bmtub3duIikpKTsKKyAgcHJpbnRmKCIgIHJlbW90ZSAlcyAgbG9jYWwgJXMgIiwgcHRubC0+aXBoLmRhZGRyID8KKyAgICAgIGluZXRfbnRvcChBRl9JTkVULCAmcHRubC0+aXBoLmRhZGRyLCBybXRfYWRkciwgc2l6ZW9mKHJtdF9hZGRyKSkgOiAiYW55IiwKKyAgICAgIHB0bmwtPmlwaC5zYWRkciA/IGluZXRfbnRvcChBRl9JTkVULCAmcHRubC0+aXBoLnNhZGRyLCBsY2xfYWRkciwKKyAgICAgICAgc2l6ZW9mKGxjbF9hZGRyKSkgOiAiYW55Iik7CisgIGlmIChwdG5sLT5saW5rKSB7CisgICAgc3RydWN0IGlmcmVxIHJlcTsKKyAgICBpbnQgZmQ7CisKKyAgICByZXEuaWZyX2lmaW5kZXggPSBwdG5sLT5saW5rOworICAgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZOQU1FLCAmcmVxKSA8IDApIHBlcnJvcl9tc2coIlNJT0NHSUZOQU1FIik7CisgICAgZWxzZSBwcmludGYoIiBkZXYgJXMgIiwgcmVxLmlmcl9uYW1lKTsKKyAgICBjbG9zZShmZCk7CisgIH0KKyAgaWYgKHB0bmwtPmlwaC50dGwpIHByaW50ZigiIHR0bCAlZCAiLCBwdG5sLT5pcGgudHRsKTsKKyAgZWxzZSBwcmludGYoIiB0dGwgaW5oZXJpdCAiKTsKKworICBpZiAocHRubC0+aXBoLnRvcykgeworICAgIHByaW50ZigiIHRvcyIpOworICAgIGlmIChwdG5sLT5pcGgudG9zICYgMSkgcHJpbnRmKCIgaW5oZXJpdCIpOworICAgIGlmIChwdG5sLT5pcGgudG9zICYgfjEpIHByaW50ZigiJWMlcyAiLCBwdG5sLT5pcGgudG9zICYgMSA/ICcvJyA6ICcgJywKKyAgICAgICAgbmFtZWZyb21SUERCKChwdG5sLT5pcGgudG9zICYgfjEpLCBSUERCX3J0ZHNmaWVsZCkpOworICB9CisgIGlmICghKHB0bmwtPmlwaC5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHByaW50ZigiIG5vcG10dWRpc2MiKTsKKyAgaW5ldF9udG9wKEFGX0lORVQsICZwdG5sLT5pX2tleSwgaWtleV9zdHIsIHNpemVvZihpa2V5X3N0cikpOworICBpZiAoKHB0bmwtPmlfZmxhZ3MgJiBHUkVfS0VZKSAmJiAocHRubC0+b19mbGFncyAmIEdSRV9LRVkpCisgICAgICAmJiBwdG5sLT5vX2tleSA9PSBwdG5sLT5pX2tleSkgcHJpbnRmKCIga2V5ICVzIiwgaWtleV9zdHIpOworICBlbHNlIGlmICgocHRubC0+aV9mbGFncyB8IHB0bmwtPm9fZmxhZ3MpICYgR1JFX0tFWSkgeworICAgIGluZXRfbnRvcChBRl9JTkVULCAmcHRubC0+b19rZXksIG9rZXlfc3RyLCBzaXplb2Yob2tleV9zdHIpKTsKKyAgICBpZiAocHRubC0+aV9mbGFncyAmIEdSRV9LRVkpIHByaW50ZigiIGlrZXkgJXMgIiwgaWtleV9zdHIpOworICAgIGlmIChwdG5sLT5vX2ZsYWdzICYgR1JFX0tFWSkgcHJpbnRmKCIgb2tleSAlcyAiLCBva2V5X3N0cik7CisgIH0KKyAgaWYgKHB0bmwtPmlfZmxhZ3MgJiBHUkVfU0VRKSBwcmludGYoIlxuICBEcm9wIHBhY2tldHMgb3V0IG9mIHNlcXVlbmNlLlxuIik7CisgIGlmIChwdG5sLT5pX2ZsYWdzICYgR1JFX0NTVU0pCisgICAgcHJpbnRmKCJcbiAgQ2hlY2tzdW0gaW4gcmVjZWl2ZWQgcGFja2V0IGlzIHJlcXVpcmVkLiIpOworICBpZiAocHRubC0+b19mbGFncyAmIEdSRV9TRVEpIHByaW50ZigiXG4gIFNlcXVlbmNlIHBhY2tldHMgb24gb3V0cHV0LiIpOworICBpZiAocHRubC0+b19mbGFncyAmIEdSRV9DU1VNKSBwcmludGYoIlxuICBDaGVja3N1bSBvdXRwdXQgcGFja2V0cy4iKTsKKyAgeHB1dGMoJ1xuJyk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfdHVubmVsKHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcHRubCkKK3sKKyAgaW50IGNvdW50ID0gMDsKKyAgY2hhciBpZmFjZVtJRl9OQU1FU0laRV07CisgIHN0cnVjdCBpcF90dW5uZWxfcGFybSBpcHRubDsKKyAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCisgIHdoaWxlIChmZ2V0cyh0b3lidWYsIHNpemVvZih0b3lidWYpLCBmcCkpIHsKKyAgICBjaGFyICpwdHI7CisgICAgaW50IHJldDsKKworICAgIGlmIChjb3VudCsrIDwgMikgY29udGludWU7IC8vIDFzdCB0d28gbGluZXMgYXJlIGhlYWRlci4KKworICAgIHB0ciA9IHN0cmNocih0b3lidWYsICc6Jyk7CisgICAgaWYgKCFwdHIgfHwgKCpwdHIrKyA9IDAsIHNzY2FuZih0b3lidWYsICIlcyIsIGlmYWNlKSAhPSAxKSkKKyAgICAgIGVycm9yX2V4aXQoImludmFsaWQgZm9ybWF0IG9mICcvcHJvYy9uZXQvZGV2JyIpOworICAgIGlmICgqcHRubC0+bmFtZSAmJiBzdHJjbXAocHRubC0+bmFtZSwgaWZhY2UpKSBjb250aW51ZTsKKyAgICBpZiAoKHJldCA9IHRubF9pb2N0bChpZmFjZSwgU0lPQ0dJRkhXQUREUiwgJmlwdG5sKSkgPCAwKSB7CisgICAgICBlcnJvcl9tc2coImZhaWxlZCB0byBnZXQgdHlwZSBvZiAnJXMnIiwgaWZhY2UpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChyZXQgIT0gQVJQSFJEX1RVTk5FTCAmJiByZXQgIT0gIEFSUEhSRF9TSVQgJiYKKyAgICAgICAgcmV0ICE9IEFSUEhSRF9JUEdSRSkgY29udGludWU7CisKKyAgICBtZW1zZXQoJmlwdG5sLCAwLCBzaXplb2YoaXB0bmwpKTsKKyAgICBpZiAodG5sX2lvY3RsKGlmYWNlLCBTSU9DR0VUVFVOTkVMLCAmaXB0bmwpIDwgMCkgY29udGludWU7CisgICAgaWYgKChwdG5sLT5saW5rICYmIGlwdG5sLmxpbmsgIT0gcHRubC0+bGluaykgfHwgKCpwdG5sLT5uYW1lICYmCisgICAgICAgICAgc3RyY21wKGlwdG5sLm5hbWUsIHB0bmwtPm5hbWUpKSB8fCAocHRubC0+aXBoLmRhZGRyICYmCisgICAgICAgICAgaXB0bmwuaXBoLmRhZGRyICE9IHB0bmwtPmlwaC5kYWRkcikgfHwgKHB0bmwtPmlwaC5zYWRkciAmJgorICAgICAgICAgICAgaXB0bmwuaXBoLnNhZGRyICE9IHB0bmwtPmlwaC5zYWRkcikgfHwgKHB0bmwtPmlfa2V5ICYmCisgICAgICAgICAgICAgIGlwdG5sLmlfa2V5ICE9IHB0bmwtPmlfa2V5KSkgY29udGludWU7CisgICAgZGlzcGxheV90dW5uZWwoJmlwdG5sKTsKKyAgfQorICBmY2xvc2UoZnApOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfaXB0dW5uZWxfYXJncyhzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnB0bmwsIGNoYXIgKiphcmd2LCAKKyAgICBpbnQgaXB0X29wdF9pZHgpCit7CisgIGludCBpZHg7CisgIHVpbnQ4X3QgYWYgPSBBRl9JTkVUOworICB1aW50MzJfdCBhZGRyID0gMDsKKyAgc3RydWN0IGFyZ2xpc3Qgb3B0c1tdID0geyB7Im1vZGUiLCAwfSwgeyJrZXkiLCAxfSwgeyJpa2V5IiwgMn0sCisgICAgeyJva2V5IiwgM30sIHsic2VxIiwgNH0sIHsiaXNlcSIsIDV9LCB7Im9zZXEiLCA2fSwgeyJjc3VtIiwgN30sCisgICAgeyJpY3N1bSIsIDh9LCB7Im9jc3VtIiwgOX0sIHsibm9wbXR1ZGlzYyIsIDEwfSwgeyJwbXR1ZGlzYyIsIDExfSwKKyAgICB7InJlbW90ZSIsIDEyfSwgeyJsb2NhbCIsIDEzfSx7ImRldiIsIDE0fSwgeyJ0dGwiLCAxNX0sIHsidG9zIiwgMTZ9LAorICAgIHsiZHNmaWVsZCIsIDE3fSwgeyJuYW1lIiwgMTh9LCB7TlVMTCwgLTF9IAorICB9OworCisgIHB0bmwtPmlwaC52ZXJzaW9uID0gNDsgLy8gVGhlIHZhbHVlIGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBJUCAoNCBvciA2KQorICBwdG5sLT5pcGguaWhsID0gNTsgLy8gTWluaW11bSBJbnRlcm5ldCBIZWFkZXIgTGVuZ3RoCisgIC8vIGZyYWdfb2ZmIGlzIG1lYXN1cmVkIGluIHVuaXRzIG9mIDggb2N0ZXRzICg2NCBiaXRzKQorICBwdG5sLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisgIGlmICgqYXJndiAmJiBpcHRfb3B0X2lkeCA8PSAyICYmIHN0cmluZ190b19pZHgoKmFyZ3YsIG9wdHMpID09IC0xKSB7CisgICAgeHN0cm5jcHkocHRubC0+bmFtZSwgKmFyZ3YsIElGX05BTUVTSVpFKTsKKyAgICBpZiAoaXB0X29wdF9pZHggPT0gMSkgeworICAgICAgc3RydWN0IGlwX3R1bm5lbF9wYXJtIGlwdG5sX29sZDsKKworICAgICAgbWVtc2V0KCZpcHRubF9vbGQsIDAsIHNpemVvZihpcHRubF9vbGQpKTsKKyAgICAgIHRubF9pb2N0bChwdG5sLT5uYW1lLCBTSU9DR0VUVFVOTkVMLCAmaXB0bmxfb2xkKTsKKyAgICAgICpwdG5sID0gaXB0bmxfb2xkOworICAgIH0KKyAgICBhcmd2Kys7CisgIH0KKyAgZm9yICg7ICphcmd2OyBhcmd2KyssIGFkZHIgPSAwKSB7CisgICAgc3dpdGNoIChpZHggPSBzdHJpbmdfdG9faWR4KCphcmd2LCBvcHRzKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoIm1vZGUgaXMgbWlzc2luZyIpOworICAgICAgICBpZiAoKCFzdHJjbXAoImlwaXAiLCAqYXJndikgfHwgIXN0cmNtcCgiaXAvaXAiLCAqYXJndikpKQorICAgICAgICAgIHB0bmwtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKyAgICAgICAgZWxzZSBpZiAoKCFzdHJjbXAoImdyZSIsICphcmd2KSB8fCAhc3RyY21wKCJncmUvaXAiLCAqYXJndikpKQorICAgICAgICAgIHB0bmwtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fR1JFOworICAgICAgICBlbHNlIGlmICgoIXN0cmNtcCgic2l0IiwgKmFyZ3YpIHx8ICFzdHJjbXAoImlwdjYvaXAiLCAqYXJndikpKQorICAgICAgICAgIHB0bmwtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBWNjsKKyAgICAgICAgZWxzZSBzaG93X2lwdHVubmVsX2hlbHAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKmluZm8sIGhpbnQ7CisgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgIGlmICghKisrYXJndikgZXJyb3JfZXhpdCgia2V5IHZhbHVlIGlzIG1pc3NpbmciKTsKKyAgICAgICAgICBtZW1zZXQoJmhpbnQsIDAsIHNpemVvZihoaW50KSk7CisgICAgICAgICAgaGludC5haV9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICAgIHJldCA9IGdldGFkZHJpbmZvKCphcmd2LCBOVUxMLCAmaGludCwgJmluZm8pOworICAgICAgICAgIGlmIChyZXQgfHwgIWluZm8pIGVycm9yX2V4aXQoImludmFsaWQgYXJndW1lbnQgdG8ga2V5Iik7CisgICAgICAgICAgZnJlZWFkZHJpbmZvKGluZm8pOworCisgICAgICAgICAgaWYgKHN0cmNocigqYXJndiwgJy4nKSkgeworICAgICAgICAgICAgaWYgKGdldF9wcmVmaXgoJmFkZHIsICZhZiwgKmFyZ3YsIEFGX0lORVQpKQorICAgICAgICAgICAgICBlcnJvcl9leGl0KCJpbnZhbGlkIGtleSAnJXMnIiwgKmFyZ3YpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBrZXlfdmFsOworCisgICAgICAgICAgICBzc2NhbmYoKmFyZ3YsICIldSIsICZrZXlfdmFsKTsKKyAgICAgICAgICAgIGFkZHIgPSBodG9ubChrZXlfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlkeCA9PSAxKSB7CisgICAgICAgICAgICBwdG5sLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisgICAgICAgICAgICBwdG5sLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisgICAgICAgICAgICBwdG5sLT5pX2tleSA9IHB0bmwtPm9fa2V5ID0gYWRkcjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGlkeCA9PSAyKSB7CisgICAgICAgICAgICBwdG5sLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisgICAgICAgICAgICBwdG5sLT5pX2tleSA9IGFkZHI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB0bmwtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKyAgICAgICAgICAgIHB0bmwtPm9fa2V5ID0gYWRkcjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHB0bmwtPmlfZmxhZ3MgfD0gR1JFX1NFUTsKKyAgICAgICAgcHRubC0+b19mbGFncyB8PSBHUkVfU0VROworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgcHRubC0+aV9mbGFncyB8PSBHUkVfU0VROworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgcHRubC0+b19mbGFncyB8PSBHUkVfU0VROworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgcHRubC0+aV9mbGFncyB8PSBHUkVfQ1NVTTsKKyAgICAgICAgcHRubC0+b19mbGFncyB8PSBHUkVfQ1NVTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIHB0bmwtPmlfZmxhZ3MgfD0gR1JFX0NTVU07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OgorICAgICAgICBwdG5sLT5vX2ZsYWdzIHw9IEdSRV9DU1VNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIHB0bmwtPmlwaC5mcmFnX29mZiA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMToKKyAgICAgICAgcHRubC0+aXBoLmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI6CisgICAgICBjYXNlIDEzOgorICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoInJlbW90ZS9sb2NhbCBhZGRyZXNzIGlzIG1pc3NpbmciKTsKKyAgICAgICAgaWYgKGdldF9wcmVmaXgoJmFkZHIsICZhZiwgKmFyZ3YsIEFGX0lORVQpKQorICAgICAgICAgIGVycm9yX2V4aXQoImludmFsaWQgcmVtb3RlL2xvY2FsIGFkZHJlc3MgJyVzJyIsICphcmd2KTsKKyAgICAgICAgKGlkeCA9PSAxMikgPyAocHRubC0+aXBoLmRhZGRyID0gYWRkcikgOiAocHRubC0+aXBoLnNhZGRyID0gYWRkcik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNDoKKyAgICAgICAgaWYgKCEqKythcmd2KSBlcnJvcl9leGl0KCJkZXZpY2UgbmFtZSBpcyBtaXNzaW5nIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHN0cnVjdCBpZnJlcSByZXE7CisgICAgICAgICAgaW50IGZkOworCisgICAgICAgICAgeHN0cm5jcHkocmVxLmlmcl9uYW1lLCAqYXJndiwgSUZOQU1TSVopOworICAgICAgICAgIGZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICAgICAgICB4aW9jdGwoZmQsIFNJT0NHSUZJTkRFWCwgJnJlcSk7CisgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgIHB0bmwtPmxpbmsgPSByZXEuaWZyX2lmaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE1OgorICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoInR0bCB2YWx1ZSBpcyBtaXNzaW5nIik7CisgICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICJpbmhlcml0IikpCisgICAgICAgICAgcHRubC0+aXBoLnR0bCA9IGF0b2x4X3JhbmdlKCphcmd2LCAwLCAyNTUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6CisgICAgICBjYXNlIDE3OgorICAgICAgICBpZiAoISorK2FyZ3YpIGVycm9yX2V4aXQoInRvcyB2YWx1ZSBpcyBtaXNzaW5nIik7CisgICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICJpbmhlcml0IikpIHsKKyAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyB0dmFsID0gc3RydG91bCgqYXJndiwgJnB0ciwgMTYpOworCisgICAgICAgICAgaWYgKHR2YWwgPiAyNTUpIGVycm9yX2V4aXQoImludmFsaWQgdG9zIHZhbHVlICclcyciLCAqYXJndik7CisgICAgICAgICAgaWYgKCpwdHIpIHsKKyAgICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gaWR4ZnJvbVJQREIoKmFyZ3YsIFJQREJfcnRkc2ZpZWxkKSkgPCAwKQorICAgICAgICAgICAgICBlcnJvcl9leGl0KCJpbnZhbGlkIHRvcyB2YWx1ZSIpOworICAgICAgICAgICAgcHRubC0+aXBoLnRvcyA9IHJldDsKKyAgICAgICAgICB9IGVsc2UgcHRubC0+aXBoLnRvcyA9IHR2YWw7CisgICAgICAgIH0gZWxzZSBwdG5sLT5pcGgudG9zID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE4OgorICAgICAgICBpZiAoKnB0bmwtPm5hbWUpIGVycm9yX2V4aXQoImludmFsaWQgdHVubmVsIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICghKisrYXJndikgZXJyb3JfZXhpdCgibmFtZSBpcyBtaXNzaW5nIik7CisgICAgICAgICAgeHN0cm5jcHkocHRubC0+bmFtZSwgKmFyZ3YsIElGX05BTUVTSVpFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgqcHRubC0+bmFtZSkgZXJyb3JfZXhpdCgiaW52YWxpZCB0dW5uZWwiKTsKKyAgICAgICAgeHN0cm5jcHkocHRubC0+bmFtZSwgKmFyZ3YsIElGX05BTUVTSVpFKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChwdG5sLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUElQIHx8CisgICAgICBwdG5sLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUFY2KSB7CisgICAgaWYgKChwdG5sLT5pX2ZsYWdzICYgR1JFX0tFWSkgfHwgKHB0bmwtPm9fZmxhZ3MgJiBHUkVfS0VZKSkKKyAgICAgIGVycm9yX2V4aXQoIltpfG9da2V5IGlzIGFsbG93ZWQgd2l0aCBncmUgb25seSIpOworICAgIGlmICgocHRubC0+aV9mbGFncyAmIEdSRV9TRVEpIHx8IChwdG5sLT5vX2ZsYWdzICYgR1JFX1NFUSkpCisgICAgICBlcnJvcl9leGl0KCJbaXxvXXNlcSBpcyBhbGxvd2VkIHdpdGggZ3JlIG9ubHkiKTsKKyAgICBpZiAoKHB0bmwtPmlfZmxhZ3MgJiBHUkVfQ1NVTSkgfHwgKHB0bmwtPm9fZmxhZ3MgJiBHUkVfQ1NVTSkpCisgICAgICBlcnJvcl9leGl0KCJbaXxvXWNzdW0gaXMgYWxsb3dlZCB3aXRoIGdyZSBvbmx5Iik7CisgIH0KKyAgaWYgKCFwdG5sLT5pX2tleSAmJiBJTl9NVUxUSUNBU1QobnRvaGwocHRubC0+aXBoLmRhZGRyKSkpIHsKKyAgICBwdG5sLT5pX2tleSA9IHB0bmwtPmlwaC5kYWRkcjsKKyAgICBwdG5sLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisgIH0KKyAgaWYgKCFwdG5sLT5vX2tleSAmJiBJTl9NVUxUSUNBU1QobnRvaGwocHRubC0+aXBoLmRhZGRyKSkpIHsKKyAgICBwdG5sLT5vX2tleSA9IHB0bmwtPmlwaC5kYWRkcjsKKyAgICBwdG5sLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisgIH0KKyAgaWYgKElOX01VTFRJQ0FTVChudG9obChwdG5sLT5pcGguZGFkZHIpKSAmJiAhcHRubC0+aXBoLnNhZGRyKQorICAgIGVycm9yX2V4aXQoImJyb2FkY2FzdCB0dW5uZWwgcmVxdWlyZXMgYSBzb3VyY2UgYWRkcmVzcyIpOworfQorCitzdGF0aWMgaW50IHR1bm5lbGxpc3QoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBpcF90dW5uZWxfcGFybSBpcHRubDsKKyAgaW50IHJldCA9IDA7CisKKyAgbWVtc2V0KCZpcHRubCwgMCwgc2l6ZW9mKGlwdG5sKSk7CisgIHBhcnNlX2lwdHVubmVsX2FyZ3MoJmlwdG5sLCBhcmd2LCAzKTsKKworICBpZiAoaXB0bmwuaXBoLnByb3RvY29sID09IElQUFJPVE9fSVBJUCkgCisgICAgcmV0ID0gdG5sX2lvY3RsKCppcHRubC5uYW1lID8gaXB0bmwubmFtZSA6ICJ0dW5sMCIsIFNJT0NHRVRUVU5ORUwsICZpcHRubCk7CisgIGVsc2UgaWYgKGlwdG5sLmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0dSRSkgCisgICAgcmV0ID0gdG5sX2lvY3RsKCppcHRubC5uYW1lID8gaXB0bmwubmFtZSA6ICJncmUwIiwgU0lPQ0dFVFRVTk5FTCwgJmlwdG5sKTsKKyAgZWxzZSBpZiAoaXB0bmwuaXBoLnByb3RvY29sID09IElQUFJPVE9fSVBWNikgCisgICAgcmV0ID0gdG5sX2lvY3RsKCppcHRubC5uYW1lID8gaXB0bmwubmFtZSA6ICJzaXQwIiwgU0lPQ0dFVFRVTk5FTCwgJmlwdG5sKTsKKyAgZWxzZSByZXR1cm4gcmVhZF90dW5uZWwoJmlwdG5sKTsKKworICBpZiAocmV0IDwgMCkgeworICAgIHBlcnJvcl9tc2coIlNJT0NHRVRUVU5ORUwiKTsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuIGRpc3BsYXlfdHVubmVsKCZpcHRubCk7Cit9CisKKy8vIFBlcmZvcm1pbmcgYWRkLCBjaGFuZ2UsICYgZGVsZXRlIHR1bm5lbCBhY3Rpb24sIGFjY29yZGluZyB0byBwYXNzZWQgcmVxX3R5cGUKK3N0YXRpYyBpbnQgdHVubmVsdXBkYXRlKGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gaXB0bmw7CisgIGludCBpZHggPSAyLCBydHlwZSA9IFNJT0NERUxUVU5ORUw7CisKKyAgaWYgKCphcmd2Wy0xXSA9PSAnYScpIHsKKyAgICBpZHggPSAwOworICAgIHJ0eXBlID0gU0lPQ0FERFRVTk5FTDsKKyAgfSBlbHNlIGlmICgqYXJndlstMV0gPT0gJ2MnKSB7CisgICAgaWR4ID0gMTsKKyAgICBydHlwZSA9IFNJT0NDSEdUVU5ORUw7CisgIH0KKworICBtZW1zZXQoJmlwdG5sLCAwLCBzaXplb2YoaXB0bmwpKTsKKyAgcGFyc2VfaXB0dW5uZWxfYXJncygmaXB0bmwsIGFyZ3YsIGlkeCk7CisgIGlmIChpZHggIT0gMiAmJiBpcHRubC5pcGgudHRsICYmICEoaXB0bmwuaXBoLmZyYWdfb2ZmKSkKKyAgICBlcnJvcl9leGl0KCJ0dGwgPiAwIGFuZCBub3BtdHVkaXNjIGFyZSBpbmNvbXBhdGlibGUiKTsKKyAgaWYgKGlwdG5sLmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQSVApCisgICAgcmV0dXJuICh0bmxfaW9jdGwoInR1bmwwIiwgcnR5cGUsICZpcHRubCkgPCAwKSA/IDEgOiAwOworICBlbHNlIGlmIChpcHRubC5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19HUkUpCisgICAgcmV0dXJuICh0bmxfaW9jdGwoImdyZTAiLCBydHlwZSwgJmlwdG5sKSA8IDApID8gMSA6IDA7CisgIGVsc2UgaWYgKGlwdG5sLmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQVjYpCisgICAgcmV0dXJuICh0bmxfaW9jdGwoInNpdDAiLCBydHlwZSwgJmlwdG5sKSA8IDApID8gMSA6IDA7CisgIGVsc2UgeworICAgIGlmIChpZHggIT0gMikgZXJyb3JfZXhpdCgiaW52YWxpZCB0dW5uZWwgbW9kZSIpOworICAgIHJldHVybiAodG5sX2lvY3RsKGlwdG5sLm5hbWUsIHJ0eXBlLCAmaXB0bmwpIDwgMCkgPyAxIDogMDsKKyAgfQorfQorCitzdGF0aWMgaW50IGlwdHVubmVsKGNoYXIgKiphcmd2KQoreworICBpbnQgaWR4OworICBzdHJ1Y3QgYXJnbGlzdCBvcHRzW10gPSB7eyJhZGQiLCAwfSwgeyJjaGFuZ2UiLCAwfSwgeyJkZWwiLCAwfSwKKyAgICB7ImRlbGV0ZSIsIDB9LCB7InNob3ciLCAxfSwgeyJsaXN0IiwgMX0sIHsibHN0IiwgMX0sIHtOVUxMLCAtMX0KKyAgfTsKKyAgY21kb2JqIGlwY21kLCBjbWRvYmpsaXN0W10gPSB7dHVubmVsdXBkYXRlLCB0dW5uZWxsaXN0fTsKKworICBpZiAoISphcmd2KSBpZHggPSAxOworICBlbHNlIGlmICgoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqYXJndisrLCBvcHRzKSkgPT0gLTEpCisgICAgc2hvd19pcHR1bm5lbF9oZWxwKCk7CisgIGlwY21kID0gY21kb2JqbGlzdFtpZHhdOworICByZXR1cm4gaXBjbWQoYXJndik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29tbW9uIGNvZGUsIHdoaWNoIGlzIHVzZWQgZm9yIGFsbCBpcCBvcHRpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFBhcnNlIG5ldGxpbmsgbWVzc2FnZXMgYW5kIGNhbGwgaW5wdXQgY2FsbGJhY2sgaGFuZGxlciBmb3IgYWN0aW9uCitzdGF0aWMgaW50IGZpbHRlcl9ubG1lc2coaW50ICgqZnVuKShzdHJ1Y3Qgbmxtc2doZHIgKm1oZHIsIGNoYXIgKiphcmd2KSwKKyAgICBjaGFyICoqYXJndikKK3sKKyAgd2hpbGUgKDEpIHsKKyAgICBzdHJ1Y3Qgbmxtc2doZHIgKm1oZHI7CisgICAgaW50IG1zZ2xlbiA9IHJlY3YoVFQuc29ja2ZkLCBUVC5nYnVmLCBNRVNHX0xFTiwgMCk7CisKKyAgICBpZiAoKG1zZ2xlbiA8IDApICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSBjb250aW51ZTsKKyAgICBlbHNlIGlmIChtc2dsZW4gPCAwKSB7CisgICAgICBlcnJvcl9tc2coIm5ldGxpbmsgcmVjZWl2ZSBlcnJvciAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKCFtc2dsZW4pIHsKKyAgICAgIGVycm9yX21zZygiRU9GIG9uIG5ldGxpbmsiKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZvciAobWhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKVRULmdidWY7IE5MTVNHX09LKG1oZHIsIG1zZ2xlbik7CisgICAgICAgIG1oZHIgPSBOTE1TR19ORVhUKG1oZHIsIG1zZ2xlbikpIHsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAobWhkci0+bmxtc2dfcGlkICE9IGdldHBpZCgpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHN3aXRjaCAobWhkci0+bmxtc2dfdHlwZSkgeworICAgICAgICBjYXNlIE5MTVNHX0RPTkU6CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgTkxNU0dfRVJST1I6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IG5sbXNnZXJyICptZXJyID0gKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShtaGRyKTsKKworICAgICAgICAgICAgaWYgKG1lcnItPmVycm9yID09IDApIHJldHVybiAwOworICAgICAgICAgICAgaWYgKG1oZHItPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkpCisgICAgICAgICAgICAgIGVycm9yX21zZygiRVJST1IgdHJ1bmNhdGVkIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgZXJybm8gPSAtbWVyci0+ZXJyb3I7CisgICAgICAgICAgICAgIHBlcnJvcl9tc2coIlJUTkVUTElOSyBhbnN3ZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKGZ1biAmJiAoZXJyID0gZnVuKG1oZHIsIGFyZ3YpKSkgcmV0dXJuIGVycjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IC8vIEVuZCBvZiBmb3IgbG9vcC4KKyAgfSAvLyBFbmQgb2Ygd2hpbGUgbG9vcC4KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXBfbWFpbih2b2lkKQoreworICBjaGFyICoqb3B0YXJndiA9IHRveXMuYXJndjsKKyAgaW50IGlkeCwgaXNpcCA9ICEodG95cy53aGljaC0+bmFtZVsyXSk7IC8vMSAtPiBpZiBvbmx5IGlwCisgIGNtZG9iaiBpcGNtZCwgY21kb2JqbGlzdFtdID0ge2lwYWRkciwgaXBsaW5rLCBpcHJvdXRlLCBpcHJ1bGUsIGlwdHVubmVsfTsKKworICBmb3IgKCsrb3B0YXJndjsgKm9wdGFyZ3Y7ICsrb3B0YXJndikgeworICAgIGNoYXIgKnB0ciA9ICpvcHRhcmd2OworICAgIHN0cnVjdCBhcmdsaXN0IGlwX29wdGlvbnNbXSA9IHt7Im9uZWxpbmUiLCAwfSwgeyJmYW1pbHkiLCAgMX0sCisgICAgICB7IjQiLCAxfSwgeyI2IiwgMX0sIHsiMCIsIDF9LCB7InN0YXRzIiwgMn0sIHtOVUxMLCAtMX19OworCisgICAgaWYgKCpwdHIgIT0gJy0nKSBicmVhazsKKyAgICBlbHNlIGlmICgoKihwdHIrMSkgPT0gJy0nKSAmJiAoKihwdHIrMikpKSBwdHIgKz0yOworICAgIC8vZXNjYXBlICItLSIgYW5kIHN0b3AgaXAgYXJnIHBhcnNpbmcuCisgICAgZWxzZSBpZiAoKCoocHRyKzEpID09ICctJykgJiYgKCEqKHB0cisyKSkpIHsKKyAgICAgICpwdHIgKz0xOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHB0ciArPTE7CisgICAgc3dpdGNoIChzdWJzdHJpbmdfdG9faWR4KHB0ciwgaXBfb3B0aW9ucykpIHsKKyAgICAgIGNhc2UgMDogVFQuc2luZ2xlbGluZSA9IDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKnB0cikpIHsKKyAgICAgICAgICAgICAgICAgIGxvbmcgbnVtID0gYXRvbHgocHRyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChudW0gPT0gNCkgVFQuYWRkcmVzc2ZhbWlseSAgPSBBRl9JTkVUOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVtID09IDYpIFRULmFkZHJlc3NmYW1pbHkgID0gQUZfSU5FVDY7CisgICAgICAgICAgICAgICAgICBlbHNlIFRULmFkZHJlc3NmYW1pbHkgPSBBRl9QQUNLRVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBhcmdsaXN0IGlwX2FmbGlzdFtdID0ge3siaW5ldCIsIEFGX0lORVR9LAorICAgICAgICAgICAgICAgICAgICB7ImluZXQ2IiwgQUZfSU5FVDZ9LCB7ImxpbmsiLCBBRl9QQUNLRVR9LCB7TlVMTCwgLTF9fTsKKworICAgICAgICAgICAgICAgICAgaWYgKCEqKytvcHRhcmd2KSBoZWxwX2V4aXQoMCk7CisgICAgICAgICAgICAgICAgICBpZiAoKFRULmFkZHJlc3NmYW1pbHkgPSBzdHJpbmdfdG9faWR4KCpvcHRhcmd2LCBpcF9hZmxpc3QpKSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfZXhpdCgid3JvbmcgZmFtaWx5ICclcyciLCAqb3B0YXJndik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBUVC5zdGF0cysrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGhlbHBfZXhpdCgwKTsKKyAgICAgICAgICAgICAgIGJyZWFrOyAvLyB1bnJlYWNoYWJsZSBjb2RlLgorICAgIH0KKyAgfQorCisgIFRULnNvY2tmZCA9IHhzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfUk9VVEUpOworCisgIGlmIChpc2lwKSB7Ly8gb25seSBmb3IgaXAKKyAgICBpZiAoKm9wdGFyZ3YpIHsKKyAgICAgIHN0cnVjdCBhcmdsaXN0IGlwX29iamVjdGxpc3RbXSA9IHsgeyJhZGRyZXNzIiwgMH0sIHsibGluayIsIDF9LAorICAgICAgICB7InJvdXRlIiwgMn0sIHsicnVsZSIsIDN9LCB7InR1bm5lbCIsIDR9LCB7InR1bmwiLCA0fSwge05VTEwsIC0xfX07CisKKyAgICAgIGlmICgoaWR4ID0gc3Vic3RyaW5nX3RvX2lkeCgqb3B0YXJndiwgaXBfb2JqZWN0bGlzdCkpID09IC0xKSBoZWxwX2V4aXQoMCk7CisgICAgICBpcGNtZCA9IGNtZG9iamxpc3RbaWR4XTsKKyAgICAgIHRveXMuZXhpdHZhbCA9IGlwY21kKCsrb3B0YXJndik7CisgICAgfSBlbHNlIGhlbHBfZXhpdCgwKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3QgYXJnbGlzdCBpcF9vYmplY3RsaXN0W10gPSB7IHsiaXBhZGRyIiwgMH0sIHsiaXBsaW5rIiwgMX0sCisgICAgICB7Imlwcm91dGUiLCAyfSwgeyJpcHJ1bGUiLCAzfSwgeyJpcHR1bm5lbCIsIDR9LCB7TlVMTCwgLTF9fTsKKyAgICBpZiAoKGlkeCA9IHN0cmluZ190b19pZHgodG95cy53aGljaC0+bmFtZSwgaXBfb2JqZWN0bGlzdCkpID09IC0xKQorICAgICAgaGVscF9leGl0KDApOworICAgIGlwY21kID0gY21kb2JqbGlzdFtpZHhdOworICAgIHRveXMuZXhpdHZhbCA9IGlwY21kKG9wdGFyZ3YpOworICB9CisgIHhjbG9zZShUVC5zb2NrZmQpOworICBpZiAocnRkc2ZpZWxkX2luaXQpIGZyZWVfYWxpc3QocnRfZHNmaWVsZCk7CisgIGlmIChydHJlYWxtc19pbml0KSBmcmVlX2FsaXN0KHJ0X3JlYWxtcyk7CisgIGlmIChydHNjb3BlX2luaXQpIGZyZWVfYWxpc3QocnRfc2NvcGUpOworICBpZiAocnR0YWJsZV9pbml0KSBmcmVlX2FsaXN0KHJ0X3RhYmxlcyk7CisgIGlmIChydHByb3Rvc19pbml0KSBmcmVlX2FsaXN0KHJ0X3Byb3Rvcyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2lwY3JtLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2lwY3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjMWIxMgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvaXBjcm0uYwpAQCAtMCwwICsxLDg4IEBACisvKiBpcGNybS5jIC0gcmVtb3ZlIG1zZyBxdWUsIHNlbSBvciBzaGFyZWQgbWVtb3J5CisgKgorICogQ29weXJpZ2h0IDIwMTQgQXNod2luaSBLdW1hciA8YWsuYXNod2luaTE5ODFAZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvaXBjcm0uaHRtbAorCisKK1VTRV9JUENSTShORVdUT1koaXBjcm0sICJtKk0qcypTKnEqUSoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBJUENSTQorICBib29sICJpcGNybSIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogaXBjcm0gWyBbLXEgbXNxaWRdIFstbSBzaG1pZF0gWy1zIHNlbWlkXQorICAgICAgICAgICAgICBbLVEgbXNna2V5XSBbLU0gc2hta2V5XSBbLVMgc2Vta2V5XSAuLi4gXQorCisgICAgLW1NIFJlbW92ZSBtZW1vcnkgc2VnbWVudCBhZnRlciBsYXN0IGRldGFjaAorICAgIC1xUSBSZW1vdmUgbWVzc2FnZSBxdWV1ZQorICAgIC1zUyBSZW1vdmUgc2VtYXBob3JlCisqLworCisjZGVmaW5lIEZPUl9pcGNybQorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisKK0dMT0JBTFMoCisgIHN0cnVjdCBhcmdfbGlzdCAqcWtleTsKKyAgc3RydWN0IGFyZ19saXN0ICpxaWQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqc2tleTsKKyAgc3RydWN0IGFyZ19saXN0ICpzaWQ7CisgIHN0cnVjdCBhcmdfbGlzdCAqbWtleTsKKyAgc3RydWN0IGFyZ19saXN0ICptaWQ7CispCisKK3N0YXRpYyB2b2lkIGRvX2lwY3JtKGludCBrZXksIGludCBpcGMsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKmM7CisgIGludCBpZCwgcmV0ID0gMDsKKworICBpZCA9IHN0cnRvbChuYW1lLCAmYywgMCk7CisgIGlmICgqYykgeworICAgIGVycm9yX21zZygiaW52YWxpZCBudW1iZXIgOiVzIiwgbmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGtleSkgeworICAgIGlmIChpZCA9PSBJUENfUFJJVkFURSkgeworICAgICAgZXJyb3JfbXNnKCJpbGxlZ2FsIGtleSAoJXMpIiwgbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlkID0gKChpcGMgPT0gMSk/c2htZ2V0KGlkLCAwLCAwKSA6CisgICAgICAgICAoaXBjID09IDIpPyBtc2dnZXQoaWQsIDApOiBzZW1nZXQoaWQsIDAsIDApKTsKKyAgICBpZiAoaWQgPCAwKSB7CisgICAgICBwZXJyb3JfbXNnKCJrZXkgKCVzKSIsIG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmIChpcGMgPT0gMSkgcmV0ID0gc2htY3RsKGlkLCBJUENfUk1JRCwgTlVMTCk7CisgIGVsc2UgaWYgKGlwYyA9PSAyKSByZXQgPSBtc2djdGwoaWQsIElQQ19STUlELCBOVUxMKTsKKyAgZWxzZSBpZiAoaXBjID09IDMpIHJldCA9IHNlbWN0bChpZCwgMCwgSVBDX1JNSUQsIE5VTEwpOworCisgIGlmIChyZXQgPCAwKSBwZXJyb3JfbXNnKCIlcyAoJXMpIiwgKChrZXkpPyAia2V5IjogImlkIiksIG5hbWUpOworfQorCit2b2lkIGlwY3JtX21haW4odm9pZCkKK3sKKyAgKyt0b3lzLmFyZ3Y7CisgIGlmICh0b3lzLm9wdGMgJiYgKCFzdHJjbXAoKnRveXMuYXJndiwgInNobSIpIHx8CisgICAgICAgICFzdHJjbXAoKnRveXMuYXJndiwgInNlbSIpIHx8ICFzdHJjbXAoKnRveXMuYXJndiwgIm1zZyIpKSkgeworICAgIGludCB0ID0gKHRveXMuYXJndlswXVsxXSA9PSAnaCcpPyAxIDogKHRveXMuYXJndlswXVsxXSA9PSAncycpPyAyOjM7CisKKyAgICB3aGlsZSAoKigrK3RveXMuYXJndikpIGRvX2lwY3JtKDAsIHQsICp0b3lzLmFyZ3YpOyAKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3QgYXJnX2xpc3QgKnRtcDsKKworICAgIGZvciAodG1wID0gVFQubWtleTsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIGRvX2lwY3JtKDEsIDEsIHRtcC0+YXJnKTsKKyAgICBmb3IgKHRtcCA9IFRULm1pZDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIGRvX2lwY3JtKDAsIDEsIHRtcC0+YXJnKTsKKyAgICBmb3IgKHRtcCA9IFRULnFrZXk7IHRtcDsgdG1wID0gdG1wLT5uZXh0KSBkb19pcGNybSgxLCAyLCB0bXAtPmFyZyk7CisgICAgZm9yICh0bXAgPSBUVC5xaWQ7IHRtcDsgdG1wID0gdG1wLT5uZXh0KSBkb19pcGNybSgwLCAyLCB0bXAtPmFyZyk7CisgICAgZm9yICh0bXAgPSBUVC5za2V5OyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgZG9faXBjcm0oMSwgMywgdG1wLT5hcmcpOworICAgIGZvciAodG1wID0gVFQuc2lkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgZG9faXBjcm0oMCwgMywgdG1wLT5hcmcpOworICAgIGlmICh0b3lzLm9wdGMpIGhlbHBfZXhpdCgidW5rbm93biBhcmd1bWVudDogJXMiLCAqdG95cy5vcHRhcmdzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9pcGNzLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2lwY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk4NmFmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9pcGNzLmMKQEAgLTAsMCArMSw0NDcgQEAKKy8qIGlwY3MuYyAtIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gaXBjIGZhY2lsaXRpZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnbWFpbC5jb20+CisgKgorICogc2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9pcGNzLmh0bWwKKworVVNFX0lQQ1MoTkVXVE9ZKGlwY3MsICJhY3B0dWxzcW1pIyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIElQQ1MKKyAgYm9vbCAiaXBjcyIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogaXBjcyBbWy1zbXFdIC1pIHNobWlkXSB8IFtbLWFzbXFdIFstdGNwbHVdXQorCisgICAgLWkgU2hvdyBzcGVjaWZpYyByZXNvdXJjZQorICAgIFJlc291cmNlIHNwZWNpZmljYXRpb246CisgICAgLWEgQWxsIChkZWZhdWx0KQorICAgIC1tIFNoYXJlZCBtZW1vcnkgc2VnbWVudHMKKyAgICAtcSBNZXNzYWdlIHF1ZXVlcworICAgIC1zIFNlbWFwaG9yZSBhcnJheXMKKyAgICBPdXRwdXQgZm9ybWF0OgorICAgIC1jIENyZWF0b3IKKyAgICAtbCBMaW1pdHMKKyAgICAtcCBQaWQKKyAgICAtdCBUaW1lCisgICAgLXUgU3VtbWFyeQorKi8KKworI2RlZmluZSBGT1JfaXBjcworI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisKK0dMT0JBTFMoCisgIGludCBpZDsKKykKKworLy91c2VkIG1hbnkgdGltZXMsIHNvIGdvb2QgdG8gcGFzdGUgaXQKKyNkZWZpbmUgZmxhZyh4KSAodG95cy5vcHRmbGFncyAmIEZMQUdfICMjIHgpCisKK3VuaW9uIHNlbXVuIHsgLy9tYW4gc2F5cyBkZWNsYXJlIGl0IHlvdXJzZWxmCisgIGludCAgICAgICAgICAgICAgdmFsOworICBzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKKyAgdW5zaWduZWQgc2hvcnQgICphcnJheTsKKyAgc3RydWN0IHNlbWluZm8gICpfX2J1ZjsKK307CisKK3N0YXRpYyB2b2lkIHNob3dfbXNnX2lkKHZvaWQpCit7CisgIHN0cnVjdCBtc3FpZF9kcyBidWY7CisgIGludCByZXQ7CisKKyAgaWYgKChyZXQgPSBtc2djdGwoVFQuaWQsIElQQ19TVEFULCAmYnVmKSkgPCAwKSB7CisgICAgcGVycm9yX21zZygibXNnY3RsIik7CisgICAgcmV0dXJuOworICB9CisKKyNkZWZpbmUgaXBjcGVybSBidWYubXNnX3Blcm0KKworICBwcmludGYoIlxuTWVzc2FnZSBRdWV1ZSBtc3FpZD0lZFxuIgorICAgICAgInVpZD0lZFx0Z2lkPSVkXHRjdWlkPSVkXHRjZ2lkPSVkXHRtb2RlPSUjb1xuIiwKKyAgICAgIFRULmlkLCBpcGNwZXJtLnVpZCwgaXBjcGVybS5naWQsIGlwY3Blcm0uY3VpZCwgaXBjcGVybS5jZ2lkLGlwY3Blcm0ubW9kZSk7CisgIHByaW50ZiAoImNieXRlcz0lbGRcdHFieXRlcz0lbGRcdHFudW09JWxkXHRsc3BpZD0lZFx0bHJwaWQ9JWRcbiIsCisgICAgICAobG9uZykgYnVmLm1zZ19jYnl0ZXMsIChsb25nKSBidWYubXNnX3FieXRlcywKKyAgICAgIChsb25nKSBidWYubXNnX3FudW0sIGJ1Zi5tc2dfbHNwaWQsIGJ1Zi5tc2dfbHJwaWQpOworCisgIHByaW50Zigic2VuZF90aW1lPSUtMjYuMjRzXG5yY3ZfdGltZT0lLTI2LjI0c1xuY2hhbmdlX3RpbWU9JS0yNi4yNHNcblxuIiwKKyAgICAgIGJ1Zi5tc2dfc3RpbWUgPyBjdGltZSgmYnVmLm1zZ19zdGltZSkgOiAiTm90IHNldCIsCisgICAgICBidWYubXNnX3J0aW1lID8gY3RpbWUoJmJ1Zi5tc2dfcnRpbWUpIDogIk5vdCBzZXQiLAorICAgICAgYnVmLm1zZ19jdGltZSA/IGN0aW1lKCZidWYubXNnX2N0aW1lKSA6ICJOb3Qgc2V0Iik7CisjdW5kZWYgaXBjcGVybQorfQorCitzdGF0aWMgdm9pZCBzaG93X3NlbV9pZCh2b2lkKQoreworICBzdHJ1Y3Qgc2VtaWRfZHMgYnVmOworICB1bmlvbiBzZW11biBuOworICBpbnQgcmV0LCBpOworCisgIG4uYnVmID0gJmJ1ZjsKKyAgaWYgKChyZXQgPSBzZW1jdGwoVFQuaWQsIDAsIElQQ19TVEFULCBuKSkgPCAwKSB7CisgICAgcGVycm9yX21zZygic2VtY3RsIik7CisgICAgcmV0dXJuOworICB9CisKKyNkZWZpbmUgaXBjcGVybSBidWYuc2VtX3Blcm0KKyAgcHJpbnRmKCJcblNlbWFwaG9yZSBBcnJheSBzZW1pZD0lZFxuIgorICAgICAgInVpZD0lZFx0IGdpZD0lZFx0IGN1aWQ9JWRcdCBjZ2lkPSVkXG4iCisgICAgICAibW9kZT0lI28sIGFjY2Vzc19wZXJtcz0lI29cbiIKKyAgICAgICJuc2VtcyA9ICVsZFxuIgorICAgICAgIm90aW1lID0gJS0yNi4yNHNcbiIsCisgICAgICBUVC5pZCwKKyAgICAgIGlwY3Blcm0udWlkLCBpcGNwZXJtLmdpZCwgaXBjcGVybS5jdWlkLCBpcGNwZXJtLmNnaWQsCisgICAgICBpcGNwZXJtLm1vZGUsIGlwY3Blcm0ubW9kZSAmIDA3NzcsCisgICAgICAobG9uZykgYnVmLnNlbV9uc2VtcywKKyAgICAgIGJ1Zi5zZW1fb3RpbWUgPyBjdGltZSgmYnVmLnNlbV9vdGltZSkgOiAiTm90IHNldCIpOworICBwcmludGYoImN0aW1lID0gJS0yNi4yNHNcbiIKKyAgICAgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKyAgICAgIGN0aW1lKCZidWYuc2VtX2N0aW1lKSwKKyAgICAgICJzZW1udW0iLCAidmFsdWUiLCAibmNvdW50IiwgInpjb3VudCIsICJwaWQiKTsKKyN1bmRlZiBpcGNwZXJtCisKKyAgZm9yIChpID0gMDsgaSA8IGJ1Zi5zZW1fbnNlbXM7IGkrKykgeworICAgIGludCB2YWwsIG5jLCB6YywgcGlkOworICAgIHZhbCA9IHNlbWN0bChUVC5pZCwgaSwgR0VUVkFMLCBuKTsKKyAgICBuYyA9IHNlbWN0bChUVC5pZCwgaSwgR0VUTkNOVCwgbik7CisgICAgemMgPSBzZW1jdGwoVFQuaWQsIGksIEdFVFpDTlQsIG4pOworICAgIHBpZCA9IHNlbWN0bChUVC5pZCwgaSwgR0VUUElELCBuKTsKKyAgICBpZiAodmFsIDwgMCB8fCBuYyA8IDAgfHwgemMgPCAwIHx8IHBpZCA8IDApCisgICAgICBwZXJyb3JfZXhpdCgic2VtY3RsIik7CisgICAgcHJpbnRmKCIlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZFxuIiwgaSwgdmFsLCBuYywgemMsIHBpZCk7CisgIH0KKyAgeHB1dGMoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2htX2lkKHZvaWQpCit7CisgIHN0cnVjdCBzaG1pZF9kcyBidWY7CisgIGludCByZXQ7CisKKyAgaWYgKChyZXQgPSBzaG1jdGwoVFQuaWQsIElQQ19TVEFULCAmYnVmKSkgPCAwKSB7CisgICAgcGVycm9yX21zZygic2htY3RsIik7CisgICAgcmV0dXJuOworICB9CisKKyNkZWZpbmUgaXBjcGVybSBidWYuc2htX3Blcm0KKworICBwcmludGYoIlxuU2hhcmVkIG1lbW9yeSBTZWdtZW50IHNobWlkPSVkXG4iCisgICAgICAidWlkPSVkXHRnaWQ9JWRcdGN1aWQ9JWRcdGNnaWQ9JWRcbiIKKyAgICAgICJtb2RlPSUjb1x0YWNjZXNzX3Blcm1zPSUjb1xuIgorICAgICAgImJ5dGVzPSVsZFx0bHBpZD0lZFx0Y3BpZD0lZFx0bmF0dGNoPSVsZFxuIiwKKyAgICAgIFRULmlkLAorICAgICAgaXBjcGVybS51aWQsIGlwY3Blcm0uZ2lkLCBpcGNwZXJtLmN1aWQsIGlwY3Blcm0uY2dpZCwKKyAgICAgIGlwY3Blcm0ubW9kZSwgKGlwY3Blcm0ubW9kZSAmIDA3NzcpLAorICAgICAgKGxvbmcpIGJ1Zi5zaG1fc2Vnc3osIGJ1Zi5zaG1fbHBpZCwgYnVmLnNobV9jcGlkLAorICAgICAgKGxvbmcpIGJ1Zi5zaG1fbmF0dGNoKTsKKyAgcHJpbnRmKCJhdHRfdGltZT0lLTI2LjI0c1xuIiwKKyAgICAgIGJ1Zi5zaG1fYXRpbWUgPyBjdGltZSgmYnVmLnNobV9hdGltZSkgOiAiTm90IHNldCIpOworICBwcmludGYoImRldF90aW1lPSUtMjYuMjRzXG4iLAorICAgICAgYnVmLnNobV9kdGltZSA/IGN0aW1lKCZidWYuc2htX2R0aW1lKSA6ICJOb3Qgc2V0Iik7CisgIHByaW50ZigiY2hhbmdlX3RpbWU9JS0yNi4yNHNcblxuIiwgY3RpbWUoJmJ1Zi5zaG1fY3RpbWUpKTsKKyN1bmRlZiBpcGNwZXJtCit9CisKK3N0YXRpYyB2b2lkIHNobV9hcnJheSh2b2lkKQoreworICBzdHJ1Y3Qgc2htX2luZm8gc2htX2J1ZjsKKyAgc3RydWN0IHNobWluZm8gaXBjX2J1ZjsKKyAgc3RydWN0IHNobWlkX2RzIGJ1ZjsKKyAgaW50IG1heF9uciwgaSwgc2htaWQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworICBzdHJ1Y3QgZ3JvdXAgKmdyOworCisgIGlmICgobWF4X25yID0gc2htY3RsKDAsIFNITV9JTkZPLCAoc3RydWN0IHNobWlkX2RzKikmc2htX2J1ZikpIDwgMCkgeworICAgIHBlcnJvcl9tc2coImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3Igc2hhcmVkIG1lbW9yeSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmbGFnKHUpKSB7CisgICAgcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBTdGF0dXMgLS0tLS0tLS1cbiIpOworICAgIHByaW50Zigic2VnbWVudHMgYWxsb2NhdGVkICVkXG4iCisgICAgICAgICJwYWdlcyBhbGxvY2F0ZWQgJWxkXG4iCisgICAgICAgICJwYWdlcyByZXNpZGVudCAgJWxkXG4iCisgICAgICAgICJwYWdlcyBzd2FwcGVkICAgJWxkXG4iCisgICAgICAgICJTd2FwIHBlcmZvcm1hbmNlOiAlbGQgYXR0ZW1wdHNcdCVsZCBzdWNjZXNzZXNcbiIsCisgICAgICAgIHNobV9idWYudXNlZF9pZHMsCisgICAgICAgIHNobV9idWYuc2htX3RvdCwKKyAgICAgICAgc2htX2J1Zi5zaG1fcnNzLAorICAgICAgICBzaG1fYnVmLnNobV9zd3AsCisgICAgICAgIHNobV9idWYuc3dhcF9hdHRlbXB0cywgc2htX2J1Zi5zd2FwX3N1Y2Nlc3Nlcyk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmbGFnKGwpKSB7CisgICAgaWYgKChzaG1jdGwoMCwgMywgKHN0cnVjdCBzaG1pZF9kcyopJmlwY19idWYpKSA8IDApIHJldHVybjsgLy9JUENfSU5GTworICAgIHByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgTGltaXRzIC0tLS0tLS0tXG4iKTsKKyAgICBwcmludGYoIm1heCBudW1iZXIgb2Ygc2VnbWVudHMgPSAlbHVcbiIKKyAgICAgICAgIm1heCBzZWcgc2l6ZSAoa2J5dGVzKSA9ICVsdVxuIgorICAgICAgICAibWF4IHRvdGFsIHNoYXJlZCBtZW1vcnkgKHBhZ2VzKSA9ICVsdVxuIgorICAgICAgICAibWluIHNlZyBzaXplIChieXRlcykgPSAlbHVcbiIsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBpcGNfYnVmLnNobW1uaSwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChpcGNfYnVmLnNobW1heCA+PiAxMCksCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBpcGNfYnVmLnNobWFsbCwKKyAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGlwY19idWYuc2htbWluKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmxhZyh0KSkgeworICAgIHByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQXR0YWNoL0RldGFjaC9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiJS0xMHMgJS0xMHMgJS0yMHMgJS0yMHMgJS0yMHNcbiIsCisgICAgICAgICJzaG1pZCIsICJvd25lciIsICJhdHRhY2hlZCIsICJkZXRhY2hlZCIsICJjaGFuZ2VkIik7CisgIH0gZWxzZSBpZiAoZmxhZyhwKSkgeworICAgIHByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQ3JlYXRvci9MYXN0LW9wIC0tLS0tLS0tXG4iKTsKKyAgICBwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAic2htaWQiLCAib3duZXIiLCAiY3BpZCIsICJscGlkIik7CisgIH0gZWxzZSBpZiAoZmxhZyhjKSkgeworICAgIHByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU2VnbWVudCBDcmVhdG9ycy9Pd25lcnMgLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisgICAgICAgICJzaG1pZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU2VnbWVudHMgLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMnNcbiIsCisgICAgICAgICJrZXkiLCAic2htaWQiLCAib3duZXIiLCAicGVybXMiLCAiYnl0ZXMiLCAibmF0dGNoIiwKKyAgICAgICAgInN0YXR1cyIpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8PSBtYXhfbnI7IGkrKykgeworICAgIGlmICgoc2htaWQgPSBzaG1jdGwoaSwgU0hNX1NUQVQsICZidWYpKSA8IDAgKSBjb250aW51ZTsKKyAgICBpZiAoZmxhZyh0KSkgeworICAgICAgaWYgKChwdyA9IGdldHB3dWlkKGJ1Zi5zaG1fcGVybS51aWQpKSkKKyAgICAgICAgcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIHNobWlkLCBwdy0+cHdfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiJS0xMGQgJS0xMC4xMGQiLCBzaG1pZCwgYnVmLnNobV9wZXJtLnVpZCk7CisgICAgICBwcmludGYoIiAlLTIwLjE2cyIsIGJ1Zi5zaG1fYXRpbWUKKyAgICAgICAgICA/IGN0aW1lKCZidWYuc2htX2F0aW1lKSArIDQgOiAiTm90IHNldCIpOworICAgICAgcHJpbnRmKCIgJS0yMC4xNnMiLCBidWYuc2htX2R0aW1lCisgICAgICAgICAgPyBjdGltZSgmYnVmLnNobV9kdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKyAgICAgIHByaW50ZigiICUtMjAuMTZzXG4iLCBidWYuc2htX2N0aW1lCisgICAgICAgICAgPyBjdGltZSgmYnVmLnNobV9jdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKyAgICB9IGVsc2UgaWYgKGZsYWcocCkpIHsKKyAgICAgIGlmICgocHcgPSBnZXRwd3VpZChidWYuc2htX3Blcm0udWlkKSkpCisgICAgICAgIHByaW50ZigiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiUtMTBkICUtMTAuMTBkIiwgc2htaWQsIGJ1Zi5zaG1fcGVybS51aWQpOworICAgICAgcHJpbnRmKCIgJS0xMGQgJS0xMGRcbiIsIGJ1Zi5zaG1fY3BpZCwgYnVmLnNobV9scGlkKTsKKyAgICB9IGVsc2UgaWYgKGZsYWcoYykpIHsKKyAgICAgIHByaW50ZigiJS0xMGQgJS0xMG8iLCBzaG1pZCwgYnVmLnNobV9wZXJtLm1vZGUgJiAwNzc3KTsKKyAgICAgIGlmICgocHcgPSBnZXRwd3VpZChidWYuc2htX3Blcm0uY3VpZCkpKSBwcmludGYoIiAlLTEwcyIsIHB3LT5wd19uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIgJS0xMGQiLCBidWYuc2htX3Blcm0uY3VpZCk7CisgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQoYnVmLnNobV9wZXJtLmNnaWQpKSkgcHJpbnRmKCIgJS0xMHMiLCBnci0+Z3JfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiICUtMTBkIiwgYnVmLnNobV9wZXJtLmNnaWQpOworICAgICAgaWYgKChwdyA9IGdldHB3dWlkKGJ1Zi5zaG1fcGVybS51aWQpKSkgcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiICUtMTBkIiwgYnVmLnNobV9wZXJtLnVpZCk7CisgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQoYnVmLnNobV9wZXJtLmdpZCkpKSBwcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiAlLTEwZFxuIiwgYnVmLnNobV9wZXJtLmdpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiMHglMDh4ICIsIGJ1Zi5zaG1fcGVybS5fX2tleSk7CisgICAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoYnVmLnNobV9wZXJtLnVpZCkpKQorICAgICAgICBwcmludGYoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIlLTEwZCAlLTEwLjEwZCIsIHNobWlkLCBidWYuc2htX3Blcm0udWlkKTsKKyAgICAgIHByaW50ZigiICUtMTBvICUtMTBsdSAlLTEwbGQgJS02cyAlLTZzXG4iLCBidWYuc2htX3Blcm0ubW9kZSAmIDA3NzcsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGJ1Zi5zaG1fc2Vnc3osCisgICAgICAgICAgKGxvbmcpIGJ1Zi5zaG1fbmF0dGNoLAorICAgICAgICAgIGJ1Zi5zaG1fcGVybS5tb2RlICYgU0hNX0RFU1QgPyAiZGVzdCIgOiAiICIsCisgICAgICAgICAgYnVmLnNobV9wZXJtLm1vZGUgJiBTSE1fTE9DS0VEID8gImxvY2tlZCIgOiAiICIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBzZW1fYXJyYXkodm9pZCkKK3sKKyAgc3RydWN0IHNlbWluZm8gaW5mb19idWY7CisgIHN0cnVjdCBzZW1pZF9kcyBidWY7CisgIHVuaW9uIHNlbXVuIHU7CisgIGludCBtYXhfbnIsIGksc2VtaWQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworICBzdHJ1Y3QgZ3JvdXAgKmdyOworCisgIHUuYXJyYXkgPSAodW5zaWduZWQgc2hvcnQgKikmaW5mb19idWY7CisgIGlmICgobWF4X25yID0gc2VtY3RsKDAsIDAsIFNFTV9JTkZPLCB1KSkgPCAwKSB7CisgICAgcGVycm9yX21zZygia2VybmVsIGlzIG5vdCBjb25maWd1cmVkIGZvciBzZW1hcGhvcmVzIik7CisgICAgcmV0dXJuOworICB9CisKKworICBpZiAoZmxhZyh1KSkgeworICAgIHByaW50ZigiLS0tLS0tIFNlbWFwaG9yZSBTdGF0dXMgLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigidXNlZCBhcnJheXMgPSAlZFxuIgorICAgICAgICAiYWxsb2NhdGVkIHNlbWFwaG9yZXMgPSAlZFxuIiwKKyAgICAgICAgaW5mb19idWYuc2VtdXN6LCBpbmZvX2J1Zi5zZW1hZW0pOworICAgIHJldHVybjsKKyAgfSAKKyAgaWYgKGZsYWcobCkpIHsKKyAgICBwcmludGYoIi0tLS0tLSBTZW1hcGhvcmUgTGltaXRzIC0tLS0tLS0tXG4iKTsKKyAgICB1LmFycmF5ID0gKHVuc2lnbmVkIHNob3J0ICopJmluZm9fYnVmOworICAgIGlmICgoc2VtY3RsKDAsIDAsIDMsIHUpKSA8IDApIC8vSVBDX0lORk8KKyAgICAgIHJldHVybjsKKyAgICBwcmludGYoIm1heCBudW1iZXIgb2YgYXJyYXlzID0gJWRcbiIKKyAgICAgICAgIm1heCBzZW1hcGhvcmVzIHBlciBhcnJheSA9ICVkXG4iCisgICAgICAgICJtYXggc2VtYXBob3JlcyBzeXN0ZW0gd2lkZSA9ICVkXG4iCisgICAgICAgICJtYXggb3BzIHBlciBzZW1vcCBjYWxsID0gJWRcbiIKKyAgICAgICAgInNlbWFwaG9yZSBtYXggdmFsdWUgPSAlZFxuIiwKKyAgICAgICAgaW5mb19idWYuc2VtbW5pLAorICAgICAgICBpbmZvX2J1Zi5zZW1tc2wsCisgICAgICAgIGluZm9fYnVmLnNlbW1ucywgaW5mb19idWYuc2Vtb3BtLCBpbmZvX2J1Zi5zZW12bXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmbGFnKHQpKSB7CisgICAgcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlIE9wZXJhdGlvbi9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiJS04cyAlLTEwcyAlLTI2LjI0cyAlLTI2LjI0c1xuIiwKKyAgICAgICAgInNobWlkIiwgIm93bmVyIiwgImxhc3Qtb3AiLCAibGFzdC1jaGFuZ2VkIik7CisgIH0gZWxzZSBpZiAoZmxhZyhjKSkgeworICAgIHByaW50ZigiLS0tLS0tIFNlbWFwaG9yZSAlcyAtLS0tLS0tLVxuIiwgIkFycmF5cyBDcmVhdG9ycy9Pd25lcnMiKTsKKyAgICBwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAic2VtaWQiLCAicGVybXMiLCAiY3VpZCIsICJjZ2lkIiwgInVpZCIsICJnaWQiKTsKKworICB9IGVsc2UgaWYgKGZsYWcocCkpeworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIi0tLS0tLSBTZW1hcGhvcmUgJXMgLS0tLS0tLS1cbiIsICJBcnJheXMiKTsKKyAgICBwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAia2V5IiwgInNlbWlkIiwgIm93bmVyIiwgInBlcm1zIiwgIm5zZW1zIik7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDw9IG1heF9ucjsgaSsrKSB7CisgICAgdS5idWYgPSAmYnVmOworICAgIGlmICgoc2VtaWQgPSBzZW1jdGwoaSwgMCwgU0VNX1NUQVQsIHUpKSA8IDApIGNvbnRpbnVlOworICAgIHB3ID0gZ2V0cHd1aWQoYnVmLnNlbV9wZXJtLnVpZCk7CisgICAgaWYgKGZsYWcodCkpIHsKKyAgICAgIGlmIChwdykgcHJpbnRmKCIlLThkICUtMTAuMTBzIiwgc2VtaWQsIHB3LT5wd19uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIlLThkICUtMTBkIiwgc2VtaWQsIGJ1Zi5zZW1fcGVybS51aWQpOworCisgICAgICBwcmludGYoIiAgJS0yNi4yNHMiLCBidWYuc2VtX290aW1lCisgICAgICAgICAgPyBjdGltZSgmYnVmLnNlbV9vdGltZSkgOiAiTm90IHNldCIpOworICAgICAgcHJpbnRmKCIgJS0yNi4yNHNcbiIsIGJ1Zi5zZW1fY3RpbWUKKyAgICAgICAgICA/IGN0aW1lKCZidWYuc2VtX2N0aW1lKSA6ICJOb3Qgc2V0Iik7CisgICAgfSBlbHNlIGlmIChmbGFnKGMpKSB7CisgICAgICBwcmludGYoIiUtMTBkICUtMTBvIiwgc2VtaWQsIGJ1Zi5zZW1fcGVybS5tb2RlICYgMDc3Nyk7CisgICAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoYnVmLnNlbV9wZXJtLmN1aWQpKSkgcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiICUtMTBkIiwgYnVmLnNlbV9wZXJtLmN1aWQpOworICAgICAgaWYgKChnciA9IGdldGdyZ2lkKGJ1Zi5zZW1fcGVybS5jZ2lkKSkpIHByaW50ZigiICUtMTBzIiwgZ3ItPmdyX25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiAlLTEwZCIsIGJ1Zi5zZW1fcGVybS5jZ2lkKTsKKyAgICAgIGlmICgocHcgPSBnZXRwd3VpZChidWYuc2VtX3Blcm0udWlkKSkpIHByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiAlLTEwZCIsIGJ1Zi5zZW1fcGVybS51aWQpOworICAgICAgaWYgKChnciA9IGdldGdyZ2lkKGJ1Zi5zZW1fcGVybS5naWQpKSkgcHJpbnRmKCIgJS0xMHNcbiIsIGdyLT5ncl9uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIgJS0xMGRcbiIsIGJ1Zi5zZW1fcGVybS5naWQpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIjB4JTA4eCAiLCBidWYuc2VtX3Blcm0uX19rZXkpOworICAgICAgaWYgKHB3KSBwcmludGYoIiUtMTBkICUtMTAuOXMiLCBzZW1pZCwgcHctPnB3X25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiUtMTBkICUtOWQiLCBzZW1pZCwgYnVmLnNlbV9wZXJtLnVpZCk7CisgICAgICBwcmludGYoIiAlLTEwbyAlLTEwbGRcbiIsIGJ1Zi5zZW1fcGVybS5tb2RlICYgMDc3NywKKyAgICAgICAgICAobG9uZykgYnVmLnNlbV9uc2Vtcyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIG1zZ19hcnJheSh2b2lkKQoreworICBzdHJ1Y3QgbXNnaW5mbyBpbmZvX2J1ZjsKKyAgc3RydWN0IG1zcWlkX2RzIGJ1ZjsKKyAgaW50IG1heF9uciwgaSwgbXNxaWQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworICBzdHJ1Y3QgZ3JvdXAgKmdyOworCisgIGlmICgobWF4X25yID0gbXNnY3RsKDAsIE1TR19JTkZPLCAoc3RydWN0IG1zcWlkX2RzKikmaW5mb19idWYpKSA8IDApIHsKKyAgICBwZXJyb3JfbXNnKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yIG1lc3NhZ2UgcXVldWUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmxhZyh1KSkgeworICAgIHByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgInM6IFN0YXR1cyIpOworICAgIHByaW50ZigiYWxsb2NhdGVkIHF1ZXVlcyA9ICVkXG4iCisgICAgICAgICJ1c2VkIGhlYWRlcnMgPSAlZFxuIgorICAgICAgICAidXNlZCBzcGFjZSA9ICVkIGJ5dGVzXG4iLAorICAgICAgICBpbmZvX2J1Zi5tc2dwb29sLCBpbmZvX2J1Zi5tc2dtYXAsIGluZm9fYnVmLm1zZ3RxbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmbGFnKGwpKSB7CisgICAgaWYgKChtc2djdGwoMCwgMywgKHN0cnVjdCBtc3FpZF9kcyopJmluZm9fYnVmKSkgPCAwKSByZXR1cm47IC8vSVBDX0lORk8KKyAgICBwcmludGYoIi0tLS0tLSBNZXNzYWdlczogTGltaXRzIC0tLS0tLS0tXG4iKTsKKyAgICBwcmludGYoIm1heCBxdWV1ZXMgc3lzdGVtIHdpZGUgPSAlZFxuIgorICAgICAgICAibWF4IHNpemUgb2YgbWVzc2FnZSAoYnl0ZXMpID0gJWRcbiIKKyAgICAgICAgImRlZmF1bHQgbWF4IHNpemUgb2YgcXVldWUgKGJ5dGVzKSA9ICVkXG4iLAorICAgICAgICBpbmZvX2J1Zi5tc2dtbmksIGluZm9fYnVmLm1zZ21heCwgaW5mb19idWYubXNnbW5iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmxhZyh0KSkgeworICAgIHByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXMgU2VuZC9SZWN2L0NoYW5nZSBUaW1lcyIpOworICAgIHByaW50ZigiJS04cyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKKyAgICAgICAgIm1zcWlkIiwgIm93bmVyIiwgInNlbmQiLCAicmVjdiIsICJjaGFuZ2UiKTsKKyAgfSBlbHNlIGlmIChmbGFnKHApKSB7CisgICAgcHJpbnRmKCItLS0tLS0gTWVzc2FnZSVzIC0tLS0tLS0tXG4iLCAiIFF1ZXVlcyBQSURzIik7CisgICAgcHJpbnRmKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKyAgICAgICAgIm1zcWlkIiwgIm93bmVyIiwgImxzcGlkIiwgImxycGlkIik7CisgIH0gZWxzZSBpZiAoZmxhZyhjKSkgeworICAgIHByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXM6IENyZWF0b3JzL093bmVycyIpOworICAgIHByaW50ZigiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisgICAgICAgICJtc3FpZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXMiKTsKKyAgICBwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzICUtMTJzXG4iLAorICAgICAgICAia2V5IiwgIm1zcWlkIiwgIm93bmVyIiwgInBlcm1zIiwgInVzZWQtYnl0ZXMiLCAibWVzc2FnZXMiKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPD0gbWF4X25yOyBpKyspIHsKKyAgICBpZiAoKG1zcWlkID0gbXNnY3RsKGksIE1TR19TVEFULCAmYnVmKSkgPCAwICkgY29udGludWU7CisgICAgcHcgPSBnZXRwd3VpZChidWYubXNnX3Blcm0udWlkKTsKKyAgICBpZiAoZmxhZyh0KSkgeworICAgICAgaWYgKHB3KSBwcmludGYoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiUtOGQgJS0xMGQiLCBtc3FpZCwgYnVmLm1zZ19wZXJtLnVpZCk7CisgICAgICBwcmludGYoIiAlLTIwLjE2cyIsIGJ1Zi5tc2dfc3RpbWUKKyAgICAgICAgICA/IGN0aW1lKCZidWYubXNnX3N0aW1lKSArIDQgOiAiTm90IHNldCIpOworICAgICAgcHJpbnRmKCIgJS0yMC4xNnMiLCBidWYubXNnX3J0aW1lCisgICAgICAgICAgPyBjdGltZSgmYnVmLm1zZ19ydGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKyAgICAgIHByaW50ZigiICUtMjAuMTZzXG4iLCBidWYubXNnX2N0aW1lCisgICAgICAgICAgPyBjdGltZSgmYnVmLm1zZ19jdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKyAgICB9IGVsc2UgaWYgKGZsYWcocCkpIHsKKyAgICAgIGlmIChwdykgcHJpbnRmKCIlLThkICUtMTAuMTBzIiwgbXNxaWQsIHB3LT5wd19uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIlLThkICUtMTBkIiwgbXNxaWQsIGJ1Zi5tc2dfcGVybS51aWQpOworICAgICAgcHJpbnRmKCIgICU1ZCAgICAgJTVkXG4iLCBidWYubXNnX2xzcGlkLCBidWYubXNnX2xycGlkKTsKKyAgICB9IGVsc2UgaWYgKGZsYWcoYykpIHsKKyAgICAgIHByaW50ZigiJS0xMGQgJS0xMG8iLCBtc3FpZCwgYnVmLm1zZ19wZXJtLm1vZGUgJiAwNzc3KTsKKyAgICAgIGlmICgocHcgPSBnZXRwd3VpZChidWYubXNnX3Blcm0uY3VpZCkpKSBwcmludGYoIiAlLTEwcyIsIHB3LT5wd19uYW1lKTsKKyAgICAgIGVsc2UgcHJpbnRmKCIgJS0xMGQiLCBidWYubXNnX3Blcm0uY3VpZCk7CisgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQoYnVmLm1zZ19wZXJtLmNnaWQpKSkgcHJpbnRmKCIgJS0xMHMiLCBnci0+Z3JfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiICUtMTBkIiwgYnVmLm1zZ19wZXJtLmNnaWQpOworICAgICAgaWYgKChwdyA9IGdldHB3dWlkKGJ1Zi5tc2dfcGVybS51aWQpKSkgcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CisgICAgICBlbHNlIHByaW50ZigiICUtMTBkIiwgYnVmLm1zZ19wZXJtLnVpZCk7CisgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQoYnVmLm1zZ19wZXJtLmdpZCkpKSBwcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiAlLTEwZFxuIiwgYnVmLm1zZ19wZXJtLmdpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiMHglMDh4ICIsIGJ1Zi5tc2dfcGVybS5fX2tleSk7CisgICAgICBpZiAocHcpIHByaW50ZigiJS0xMGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOworICAgICAgZWxzZSBwcmludGYoIiUtMTBkICUtMTBkIiwgbXNxaWQsIGJ1Zi5tc2dfcGVybS51aWQpOworICAgICAgcHJpbnRmKCIgJS0xMG8gJS0xMmxkICUtMTJsZFxuIiwgYnVmLm1zZ19wZXJtLm1vZGUgJiAwNzc3LAorICAgICAgICAgIChsb25nKSBidWYubXNnX2NieXRlcywgKGxvbmcpIGJ1Zi5tc2dfcW51bSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgaXBjc19tYWluKHZvaWQpCit7CisgIGlmIChmbGFnKGkpKSB7CisgICAgaWYgKGZsYWcobSkpIHNob3dfc2htX2lkKCk7CisgICAgZWxzZSBpZiAoZmxhZyhzKSkgc2hvd19zZW1faWQoKTsKKyAgICBlbHNlIGlmIChmbGFnKHEpKSBzaG93X21zZ19pZCgpOworICAgIGVsc2UgaGVscF9leGl0KDApOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghKGZsYWcobSkgfHwgZmxhZyhzKSB8fCBmbGFnKHEpKSB8fCBmbGFnKGEpKSB0b3lzLm9wdGZsYWdzIHw9IChGTEFHX218RkxBR19zfEZMQUdfcSk7CisKKyAgeHB1dGMoJ1xuJyk7CisgIGlmIChmbGFnKG0pKSB7CisgICAgc2htX2FycmF5KCk7CisgICAgeHB1dGMoJ1xuJyk7CisgIH0KKyAgaWYgKGZsYWcocykpIHsKKyAgICBzZW1fYXJyYXkoKTsKKyAgICB4cHV0YygnXG4nKTsKKyAgfQorICBpZiAoZmxhZyhxKSkgeworICAgIG1zZ19hcnJheSgpOworICAgIHhwdXRjKCdcbicpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2tsb2dkLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL2tsb2dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1MDk4MQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcva2xvZ2QuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoga2xvZ2QuYyAtIEtsb2dkLCBUaGUga2VybmVsIGxvZyBEYW1lb24uCisgKgorICogQ29weXJpZ2h0IDIwMTMgU2FuZGVlcCBTaGFybWEgPHNhbmRlZXAuamFjazI3NTZAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm8gc3RhbmRhcmQKKworVVNFX0tMT0dEKE5FV1RPWShrbG9nZCwgImMjPDE+OG4iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgS0xPR0QKKyAgICBib29sICJrbG9nZCIKKyAgICBkZWZhdWx0IG4KKyAgICBoZWxwCisgICAgdXNhZ2U6IGtsb2dkIFstbl0gWy1jIE5dCisKKyAgICAtYyAgTiAgIFByaW50IHRvIGNvbnNvbGUgbWVzc2FnZXMgbW9yZSB1cmdlbnQgdGhhbiBwcmlvIE4gKDEtOCkiCisgICAgLW4gICAgUnVuIGluIGZvcmVncm91bmQuCisKK2NvbmZpZyBLTE9HRF9TT1VSQ0VfUklOR19CVUZGRVIKKyAgICBib29sICJlbmFibGUga2VybmVsIHJpbmcgYnVmZmVyIGFzIGxvZyBzb3VyY2UuIgorICAgIGRlZmF1bHQgbgorICAgIGRlcGVuZHMgb24gS0xPR0QKKyovCisKKyNkZWZpbmUgRk9SX2tsb2dkCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9rbG9nLmg+CitHTE9CQUxTKAorICBsb25nIGxldmVsOworCisgIGludCBmZDsKKykKKworc3RhdGljIHZvaWQgc2V0X2xvZ19sZXZlbChpbnQgbGV2ZWwpCit7ICAgCisgIGlmIChDRkdfS0xPR0RfU09VUkNFX1JJTkdfQlVGRkVSKQorICAgIGtsb2djdGwoOCwgTlVMTCwgbGV2ZWwpOworICBlbHNlIHsKKyAgICBGSUxFICpmcHRyID0geGZvcGVuKCIvcHJvYy9zeXMva2VybmVsL3ByaW50ayIsICJ3Iik7CisgICAgZnByaW50ZihmcHRyLCAiJXVcbiIsIGxldmVsKTsKKyAgICBmY2xvc2UoZnB0cik7CisgICAgZnB0ciA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnKQoreworICBpZiAoQ0ZHX0tMT0dEX1NPVVJDRV9SSU5HX0JVRkZFUikgeworICAgIGtsb2djdGwoNywgTlVMTCwgMCk7IAorICAgIGtsb2djdGwoMCwgTlVMTCwgMCk7CisgIH0gZWxzZSB7CisgICAgc2V0X2xvZ19sZXZlbCg3KTsKKyAgICB4Y2xvc2UoVFQuZmQpOworICB9CisgIHN5c2xvZyhMT0dfTk9USUNFLCJLTE9HRDogRGFlbW9uIGV4aXRpbmcuLi4uLi4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoKKyAqIFJlYWQga2VybmVsIHJpbmcgYnVmZmVyIGluIGxvY2FsIGJ1ZmYgYW5kIGtlZXAgdHJhY2sgb2YKKyAqICJ1c2VkIiBhbW91bnQgdG8gdHJhY2sgbmV4dCByZWFkIHRvIHN0YXJ0LgorICovCit2b2lkIGtsb2dkX21haW4odm9pZCkKK3sKKyAgaW50IHByaW8sIHNpemUsIHVzZWQgPSAwOworICBjaGFyICpzdGFydCwgKmxpbmVfc3RhcnQsIG1zZ19idWZmZXJbMTYzNDhdOyAvL0xPR19MSU5FX0xFTkdUSCAtIFJpbmcgYnVmZmVyIHNpemUKKworICBzaWdhdGV4aXQoaGFuZGxlX3NpZ25hbCk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSBzZXRfbG9nX2xldmVsKFRULmxldmVsKTsgICAgLy9zZXQgbG9nIGxldmVsCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSBkYWVtb24oMCwgMCk7ICAgICAgICAgICAgLy9NYWtlIGl0IGRhZW1vbgorCisgIGlmIChDRkdfS0xPR0RfU09VUkNFX1JJTkdfQlVGRkVSKSB7CisgICAgc3lzbG9nKExPR19OT1RJQ0UsICJLTE9HRDogc3RhcnRlZCB3aXRoIEtlcm5lbCByaW5nIGJ1ZmZlciBhcyBsb2cgc291cmNlXG4iKTsKKyAgICBrbG9nY3RsKDEsIE5VTEwsIDApOworICB9IGVsc2UgeworICAgIFRULmZkID0geG9wZW5ybygiL3Byb2Mva21zZyIpOyAvL19QQVRIX0tMT0cgaW4gcGF0aHMuaAorICAgIHN5c2xvZyhMT0dfTk9USUNFLCAiS0xPR0Q6IHN0YXJ0ZWQgd2l0aCAvcHJvYy9rbXNnIGFzIGxvZyBzb3VyY2VcbiIpOworICB9CisgIG9wZW5sb2coIktlcm5lbCIsIDAsIExPR19LRVJOKTsgICAgLy9vcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGxvZ2dlci4uCisKKyAgd2hpbGUoMSkgeworICAgIHN0YXJ0ID0gbXNnX2J1ZmZlciArIHVzZWQ7IC8vc3RhcnQgdXBkYXRlZCBmb3IgcmUtcmVhZC4KKyAgICBpZiAoQ0ZHX0tMT0dEX1NPVVJDRV9SSU5HX0JVRkZFUikgeworICAgICAgc2l6ZSA9IGtsb2djdGwoMiwgc3RhcnQsIHNpemVvZihtc2dfYnVmZmVyKSAtIHVzZWQgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IHhyZWFkKFRULmZkLCBzdGFydCwgc2l6ZW9mKG1zZ19idWZmZXIpIC0gdXNlZCAtIDEpOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IDApIHBlcnJvcl9leGl0KCJlcnJvciByZWFkaW5nIGZpbGU6Iik7CisgICAgc3RhcnRbc2l6ZV0gPSAnXDAnOyAgLy9FbnN1cmUgbGFzdCBsaW5lIHRvIGJlIE5VTCB0ZXJtaW5hdGVkLgorICAgIGlmICh1c2VkKSBzdGFydCA9IG1zZ19idWZmZXI7CisgICAgd2hpbGUoc3RhcnQpIHsKKyAgICAgIGlmICgobGluZV9zdGFydCA9IHN0cnNlcCgmc3RhcnQsICJcbiIpKSAhPSBOVUxMICYmIHN0YXJ0ICE9IE5VTEwpIHVzZWQgPSAwOworICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5jb21wbGV0ZSBsaW5lLCBjb3B5IGl0IHRvIHN0YXJ0IG9mIGJ1ZmYuCisgICAgICAgIHVzZWQgPSBzdHJsZW4obGluZV9zdGFydCk7CisgICAgICAgIHN0cmNweShtc2dfYnVmZmVyLCBsaW5lX3N0YXJ0KTsKKyAgICAgICAgaWYgKHVzZWQgPCAoc2l6ZW9mKG1zZ19idWZmZXIpIC0gMSkpIGJyZWFrOworICAgICAgICB1c2VkID0gMDsgLy93ZSBoYXZlIGJ1ZmZlciBmdWxsLCBsb2cgaXQgYXMgaXQgaXMuCisgICAgICB9CisgICAgICBwcmlvID0gTE9HX0lORk87ICAvL3dlIGRvbnQga25vdyBwcmlvcml0eSwgbWFyayBpdCBJTkZPCisgICAgICBpZiAoKmxpbmVfc3RhcnQgPT0gJzwnKSB7ICAvL3dlIGhhdmUgbmV3IGxpbmUgdG8gc3lzbG9nCisgICAgICAgIGxpbmVfc3RhcnQrKzsKKyAgICAgICAgaWYgKGxpbmVfc3RhcnQpIHByaW8gPSAoaW50KXN0cnRvdWwobGluZV9zdGFydCwgJmxpbmVfc3RhcnQsIDEwKTsKKyAgICAgICAgaWYgKCpsaW5lX3N0YXJ0ID09ICc+JykgbGluZV9zdGFydCsrOworICAgICAgfQorICAgICAgaWYgKCpsaW5lX3N0YXJ0KSBzeXNsb2cocHJpbywgIiVzIiwgbGluZV9zdGFydCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2xhc3QuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvbGFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2I0NzIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL2xhc3QuYwpAQCAtMCwwICsxLDE5NiBAQAorLyogbGFzdC5jIC0gU2hvdyBsaXN0aW5nIG9mIGxhc3QgbG9nZ2VkIGluIHVzZXJzLgorICoKKyAqIENvcHlyaWdodCAyMDEzIFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkLgorCitVU0VfTEFTVChORVdUT1kobGFzdCwgImY6VyIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIExBU1QKKyAgYm9vbCAibGFzdCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogbGFzdCBbLVddIFstZiBGSUxFXQorCisgICAgU2hvdyBsaXN0aW5nIG9mIGxhc3QgbG9nZ2VkIGluIHVzZXJzLgorCisgICAgLVcgICAgICBEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiB3aXRob3V0IGhvc3QtY29sdW1uIHRydW5jYXRpb24uCisgICAgLWYgRklMRSBSZWFkIGZyb20gZmlsZSBGSUxFIGluc3RlYWQgb2YgL3Zhci9sb2cvd3RtcC4KKyovCisKKyNkZWZpbmUgRk9SX2xhc3QKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8dXRtcC5oPgorCisjaWZuZGVmIFNIVVRET1dOX1RJTUUKKyNkZWZpbmUgU0hVVERPV05fVElNRSAyNTQKKyNlbmRpZgorCitHTE9CQUxTKAorICBjaGFyICpmaWxlOworCisgIHN0cnVjdCBhcmdfbGlzdCAqbGlzdDsKKykKKworc3RhdGljIHZvaWQgZnJlZV9saXN0KCkKK3sKKyAgaWYgKFRULmxpc3QpIHsKKyAgICBsbGlzdF90cmF2ZXJzZShUVC5saXN0LCBsbGlzdF9mcmVlX2FyZyk7CisgICAgVFQubGlzdCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQgbGxpc3RfYWRkX25vZGUoc3RydWN0IGFyZ19saXN0ICoqb2xkLCB2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICAKKyAgbmV3LT5hcmcgPSAoY2hhciopZGF0YTsKKyAgbmV3LT5uZXh0ID0gKm9sZDsKKyAgKm9sZCA9IG5ldzsKK30KKworLy8gRmluZCBhIG5vZGUgYW5kIGRsaW5rIGl0IGZyb20gdGhlIGxpc3QuCitzdGF0aWMgc3RydWN0IGFyZ19saXN0ICpmaW5kX2FuZF9kbGluayhzdHJ1Y3QgYXJnX2xpc3QgKipsaXN0LCBjaGFyICpkZXZuYW1lKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmwgPSAqbGlzdDsKKyAgCisgIHdoaWxlICgqbGlzdCkgeworICAgIHN0cnVjdCB1dG1wICp1dCA9IChzdHJ1Y3QgdXRtcCAqKWwtPmFyZzsKKworICAgIGlmICghc3RybmNtcCh1dC0+dXRfbGluZSwgZGV2bmFtZSwgVVRfTElORVNJWkUpKSB7CisgICAgICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisgICAgICByZXR1cm4gbDsKKyAgICB9CisgICAgbGlzdCA9ICYoKmxpc3QpLT5uZXh0OworICAgIGwgPSAqbGlzdDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLy8gQ29tcHV0ZSBsb2dpbiwgbG9nb3V0IGFuZCBkdXJhdGlvbiBvZiBsb2dpbi4KK3N0YXRpYyB2b2lkIHNlaXplX2R1cmF0aW9uKHRpbWVfdCB0bTAsIHRpbWVfdCB0bTEpCit7CisgIHVuc2lnbmVkIGRheXMsIGhvdXJzLCBtaW5zOworICBkb3VibGUgZGlmZiA9IGRpZmZ0aW1lKHRtMSwgdG0wKTsKKyAgCisgIGRpZmYgPSAoZGlmZiA+IDApID8gKHRtMSAtIHRtMCkgOiAwOworICB0b3lidWZbMF0gPSB0b3lidWZbMThdID0gdG95YnVmWzI4XSA9ICdcMCc7CisgIHN0cm5jcHkodG95YnVmLCBjdGltZSgmdG0wKSwgMTYpOyAvLyBMb2dpbiBUaW1lLgorICBzbnByaW50Zih0b3lidWYrMTgsIDgsICItICVzIiwgY3RpbWUoJnRtMSkgKyAxMSk7IC8vIExvZ291dCBUaW1lLgorICBkYXlzID0gKG1pbnMgPSBkaWZmLzYwKS8oMjQqNjApOworICBob3VycyA9IChtaW5zID0gKG1pbnMlKDI0KjYwKSkpLzYwOworICBtaW5zID0gbWlucyU2MDsKKyAgc3ByaW50Zih0b3lidWYrMjgsICIoJXUrJTAydTolMDJ1KSIsIGRheXMsIGhvdXJzLCBtaW5zKTsgLy8gRHVyYXRpb24uCit9CisKK3ZvaWQgbGFzdF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB1dG1wIHV0OworICB0aW1lX3QgdG1bM10gPSB7MCx9OyAvL2FycmF5IGZvciB0aW1lIGF2bHVlcywgcHJldmlvdXMsIGN1cnJlbnQKKyAgY2hhciAqZmlsZSA9ICIvdmFyL2xvZy93dG1wIjsKKyAgaW50IGZkLCBwd2lkdGgsIGN1cmxvZ190eXBlID0gRU1QVFk7CisgIG9mZl90IGxvYzsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZikgZmlsZSA9IFRULmZpbGU7CisKKyAgcHdpZHRoID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1cpID8gNDYgOiAxNjsKKyAgKnRtID0gdGltZSh0bSsxKTsKKyAgZmQgPSB4b3BlbnJvKGZpbGUpOworICBsb2MgPSB4bHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKworICAvLyBMb29wIHRocm91Z2ggZmlsZSBzdHJ1Y3R1cmVzIGluIHJldmVyc2Ugb3JkZXIuCisgIGZvciAoOzspIHsKKyAgICBsb2MgLT0gc2l6ZW9mKHV0KTsKKyAgICBpZihsb2MgPCAwKSBicmVhazsKKyAgICB4bHNlZWsoZmQsIGxvYywgU0VFS19TRVQpOworCisgICAgLy8gUmVhZCBuZXh0IHN0cnVjdHVyZSwgZGV0ZXJtaW5lIHR5cGUKKyAgICB4cmVhZGFsbChmZCwgJnV0LCBzaXplb2YodXQpKTsKKyAgICAqdG0gPSB1dC51dF90di50dl9zZWM7CisgICAgaWYgKCp1dC51dF9saW5lID09ICd+JykgeworICAgICAgaWYgKCFzdHJjbXAodXQudXRfdXNlciwgInJ1bmxldmVsIikpIHV0LnV0X3R5cGUgPSBSVU5fTFZMOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCh1dC51dF91c2VyLCAicmVib290IikpIHV0LnV0X3R5cGUgPSBCT09UX1RJTUU7CisgICAgICBlbHNlIGlmICghc3RyY21wKHV0LnV0X3VzZXIsICJzaHV0ZG93biIpKSB1dC51dF90eXBlID0gU0hVVERPV05fVElNRTsKKyAgICB9IGVsc2UgaWYgKCEqdXQudXRfdXNlcikgdXQudXRfdHlwZSA9IERFQURfUFJPQ0VTUzsKKyAgICBlbHNlIGlmICgqdXQudXRfdXNlciAmJiAqdXQudXRfbGluZSAmJiB1dC51dF90eXBlICE9IERFQURfUFJPQ0VTUworICAgICAgICAmJiBzdHJjbXAodXQudXRfdXNlciwgIkxPR0lOIikpIHV0LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisgICAgLyogVGhlIHBhaXIgb2YgdGVybWluYWwgbmFtZXMgJ3wnIC8gJ30nIGxvZ3MgdGhlCisgICAgICogb2xkL25ldyBzeXN0ZW0gdGltZSB3aGVuIGRhdGUgY2hhbmdlcyBpdC4KKyAgICAgKi8gCisgICAgaWYgKCFzdHJjbXAodXQudXRfdXNlciwgImRhdGUiKSkgeworICAgICAgaWYgKHV0LnV0X2xpbmVbMF0gPT0gJ3wnKSB1dC51dF90eXBlID0gT0xEX1RJTUU7CisgICAgICBpZiAodXQudXRfbGluZVswXSA9PSAneycpIHV0LnV0X3R5cGUgPSBORVdfVElNRTsKKyAgICB9CisKKyAgICBpZiAoKHV0LnV0X3R5cGUgPT0gU0hVVERPV05fVElNRSkgfHwgKCh1dC51dF90eXBlID09IFJVTl9MVkwpICYmIAorICAgICAgICAoKCh1dC51dF9waWQgJiAyNTUpID09ICcwJykgfHwgKCh1dC51dF9waWQgJiAyNTUpID09ICc2JykpKSkKKyAgICB7CisgICAgICB0bVsxXSA9IHRtWzJdID0gKHRpbWVfdCl1dC51dF90di50dl9zZWM7CisgICAgICBmcmVlX2xpc3QoKTsKKyAgICAgIGN1cmxvZ190eXBlID0gUlVOX0xWTDsKKyAgICB9IGVsc2UgaWYgKHV0LnV0X3R5cGUgPT0gQk9PVF9USU1FKSB7CisgICAgICBzZWl6ZV9kdXJhdGlvbih0bVswXSwgdG1bMV0pOworICAgICAgc3RyY3B5KHV0LnV0X2xpbmUsICJzeXN0ZW0gYm9vdCIpOworICAgICAgZnJlZV9saXN0KCk7CisgICAgICBwcmludGYoIiUtOC44cyAlLTEyLjEycyAlLSouKnMgJS0xNi4xNnMgJS03LjdzICVzXG4iLCB1dC51dF91c2VyLCAKKyAgICAgICAgICB1dC51dF9saW5lLCBwd2lkdGgsIHB3aWR0aCwgdXQudXRfaG9zdCwgCisgICAgICAgICAgdG95YnVmLCB0b3lidWYrMTgsIHRveWJ1ZisyOCk7CisgICAgICBjdXJsb2dfdHlwZSA9IEJPT1RfVElNRTsKKyAgICAgIHRtWzJdID0gKHRpbWVfdCl1dC51dF90di50dl9zZWM7CisgICAgfSBlbHNlIGlmICh1dC51dF90eXBlID09IFVTRVJfUFJPQ0VTUyAmJiAqdXQudXRfbGluZSkgeworICAgICAgc3RydWN0IGFyZ19saXN0ICpsID0gZmluZF9hbmRfZGxpbmsoJlRULmxpc3QsIHV0LnV0X2xpbmUpOworCisgICAgICBpZiAobCkgeworICAgICAgICBzdHJ1Y3QgdXRtcCAqdSA9IChzdHJ1Y3QgdXRtcCAqKWwtPmFyZzsKKyAgICAgICAgc2VpemVfZHVyYXRpb24odG1bMF0sIHUtPnV0X3R2LnR2X3NlYyk7CisgICAgICAgIHByaW50ZigiJS04LjhzICUtMTIuMTJzICUtKi4qcyAlLTE2LjE2cyAlLTcuN3MgJXNcbiIsIHV0LnV0X3VzZXIsIAorICAgICAgICAgICAgdXQudXRfbGluZSwgcHdpZHRoLCBwd2lkdGgsIHV0LnV0X2hvc3QsIAorICAgICAgICAgICAgdG95YnVmLCB0b3lidWYrMTgsIHRveWJ1ZisyOCk7CisgICAgICAgIGZyZWUobC0+YXJnKTsKKyAgICAgICAgZnJlZShsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCB0eXBlID0gIXRtWzJdID8gRU1QVFkgOiBjdXJsb2dfdHlwZTsKKyAgICAgICAgaWYgKCF0bVsyXSkgeyAvL2NoZWNrIHByb2Nlc3MncyBjdXJyZW50IHN0YXR1cyAoYWxpdmUgb3IgZGVhZCkuCisgICAgICAgICAgaWYgKCh1dC51dF9waWQgPiAwKSAmJiAoa2lsbCh1dC51dF9waWQsIDApIT0wKSAmJiAoZXJybm8gPT0gRVNSQ0gpKQorICAgICAgICAgICAgdHlwZSA9IElOSVRfUFJPQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBzZWl6ZV9kdXJhdGlvbih0bVswXSwgdG1bMl0pOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICBjYXNlIEVNUFRZOgorICAgICAgICAgICAgc3RyY3B5KHRveWJ1ZisxOCwgIiAgc3RpbGwiKTsKKyAgICAgICAgICAgIHN0cmNweSh0b3lidWYrMjgsICJsb2dnZWQgaW4iKTsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJVTl9MVkw6CisgICAgICAgICAgICBzdHJjcHkodG95YnVmKzE4LCAiLSBkb3duICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBCT09UX1RJTUU6CisgICAgICAgICAgICBzdHJjcHkodG95YnVmKzE4LCAiLSBjcmFzaCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBJTklUX1BST0NFU1M6CisgICAgICAgICAgICBzdHJjcHkodG95YnVmKzE4LCAiICAgZ29uZSIpOworICAgICAgICAgICAgc3RyY3B5KHRveWJ1ZisyOCwgIi0gbm8gbG9nb3V0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIlLTguOHMgJS0xMi4xMnMgJS0qLipzICUtMTYuMTZzICUtNy43cyAlc1xuIiwgdXQudXRfdXNlciwgCisgICAgICAgICAgICB1dC51dF9saW5lLCBwd2lkdGgsIHB3aWR0aCwgdXQudXRfaG9zdCwgCisgICAgICAgICAgICB0b3lidWYsIHRveWJ1ZisxOCwgdG95YnVmKzI4KTsKKyAgICAgIH0KKyAgICAgIGxsaXN0X2FkZF9ub2RlKCZUVC5saXN0LCBtZW1jcHkoeG1hbGxvYyhzaXplb2YodXQpKSwgJnV0LCBzaXplb2YodXQpKSk7CisgICAgfSBlbHNlIGlmICh1dC51dF90eXBlID09IERFQURfUFJPQ0VTUyAmJiAqdXQudXRfbGluZSkKKyAgICAgIGxsaXN0X2FkZF9ub2RlKCZUVC5saXN0LCBtZW1jcHkoeG1hbGxvYyhzaXplb2YodXQpKSwgJnV0LCBzaXplb2YodXQpKSk7CisKKyAgICBsb2MgLT0gc2l6ZW9mKHV0KTsKKyAgICBpZihsb2MgPCAwKSBicmVhazsKKyAgICB4bHNlZWsoZmQsIGxvYywgU0VFS19TRVQpOworICB9CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIHhjbG9zZShmZCk7CisgICAgZnJlZV9saXN0KCk7CisgIH0KKworICB4cHJpbnRmKCJcbiVzIGJlZ2lucyAlLTI0LjI0c1xuIiwgYmFzZW5hbWUoZmlsZSksIGN0aW1lKHRtKSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL2xvZ2dlci5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRlNmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9sb2dnZXIuYwpAQCAtMCwwICsxLDczIEBACisvKiBsb2dnZXIuYyAtIExvZyBtZXNzYWdlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBJbHlhIEt1em1pY2ggPGlseWEua3V6bWljaEBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9sb2dnZXIuaHRtbAorCitVU0VfTE9HR0VSKE5FV1RPWShsb2dnZXIsICJzdDpwOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIExPR0dFUgorICBib29sICJsb2dnZXIiCisgIGRlcGVuZHMgb24gU1lTTE9HRAorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBsb2dnZXIgWy1zXSBbLXQgdGFnXSBbLXAgW2ZhY2lsaXR5Ll1wcmlvcml0eV0gW21lc3NhZ2VdCisKKyAgICBMb2cgbWVzc2FnZSAob3Igc3RkaW4pIHRvIHN5c2xvZy4KKyovCisKKyNkZWZpbmUgRk9SX2xvZ2dlcgorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqcHJpb3JpdHlfYXJnOworICBjaGFyICppZGVudDsKKykKKworZXh0ZXJuIGludCBsb2dnZXJfbG9va3VwKGludCB3aGVyZSwgY2hhciAqa2V5KTsKKwordm9pZCBsb2dnZXJfbWFpbih2b2lkKQoreworICBpbnQgZmFjaWxpdHkgPSBMT0dfVVNFUiwgcHJpb3JpdHkgPSBMT0dfTk9USUNFOworICBjaGFyICptZXNzYWdlID0gTlVMTDsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgeworICAgIGNoYXIgKnNlcCA9IHN0cmNocihUVC5wcmlvcml0eV9hcmcsICcuJyk7CisKKyAgICBpZiAoc2VwKSB7CisgICAgICAqc2VwID0gJ1wwJzsKKyAgICAgIGlmICgoZmFjaWxpdHkgPSBsb2dnZXJfbG9va3VwKDAsIFRULnByaW9yaXR5X2FyZykpID09IC0xKQorICAgICAgICBlcnJvcl9leGl0KCJiYWQgZmFjaWxpdHk6ICVzIiwgVFQucHJpb3JpdHlfYXJnKTsKKyAgICAgIFRULnByaW9yaXR5X2FyZyA9IHNlcCsxOworICAgIH0KKworICAgIGlmICgocHJpb3JpdHkgPSBsb2dnZXJfbG9va3VwKDEsIFRULnByaW9yaXR5X2FyZykpID09IC0xKQorICAgICAgZXJyb3JfZXhpdCgiYmFkIHByaW9yaXR5OiAlcyIsIFRULnByaW9yaXR5X2FyZyk7CisgIH0KKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR190KSkgeworICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQoZ2V0ZXVpZCgpKTsKKworICAgIGlmICghcHcpIHBlcnJvcl9leGl0KCJnZXRwd3VpZCIpOworICAgIFRULmlkZW50ID0geHN0cmR1cChwdy0+cHdfbmFtZSk7CisgIH0KKworICBpZiAodG95cy5vcHRjKSB7CisgICAgaW50IGxlbmd0aCA9IDAsIHBvcyA9IDA7CisKKyAgICBmb3IgKDsqdG95cy5vcHRhcmdzOyB0b3lzLm9wdGFyZ3MrKykgeworICAgICAgbGVuZ3RoICs9IHN0cmxlbigqKHRveXMub3B0YXJncykpICsgMTsgLy8gcGx1cyBvbmUgZm9yIHRoZSBhcmdzIHNwYWNpbmcKKyAgICAgIG1lc3NhZ2UgPSB4cmVhbGxvYyhtZXNzYWdlLCBsZW5ndGggKyAxKTsgLy8gYW5vdGhlciBvbmUgZm9yIHRoZSBudWxsIGJ5dGUKKworICAgICAgc3ByaW50ZihtZXNzYWdlICsgcG9zLCAiJXMgIiwgKnRveXMub3B0YXJncyk7CisgICAgICBwb3MgPSBsZW5ndGg7CisgICAgfQorICB9IGVsc2UgeworICAgIHRveWJ1ZltyZWFkYWxsKDAsIHRveWJ1ZiwgNDA5Ni0xKV0gPSAnXDAnOworICAgIG1lc3NhZ2UgPSB0b3lidWY7CisgIH0KKworICBvcGVubG9nKFRULmlkZW50LCAodG95cy5vcHRmbGFncyAmIEZMQUdfcyA/IExPR19QRVJST1IgOiAwKSAsIGZhY2lsaXR5KTsKKyAgc3lzbG9nKHByaW9yaXR5LCAiJXMiLCBtZXNzYWdlKTsKKyAgY2xvc2Vsb2coKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvbHNvZi5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9sc29mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2ZmRkMgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvbHNvZi5jCkBAIC0wLDAgKzEsNDcxIEBACisvKiBsc29mLmMgLSBsaXN0IG9wZW4gZmlsZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitVU0VfTFNPRihORVdUT1kobHNvZiwgImxwKnQiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBMU09GCisgIGJvb2wgImxzb2YiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGxzb2YgWy1sdF0gWy1wIFBJRDEsUElEMiwuLi5dIFtOQU1FXS4uLgorCisgICAgTGlzdHMgb3BlbiBmaWxlcy4gSWYgbmFtZXMgYXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9ubHkKKyAgICB0aG9zZSBmaWxlcyB3aWxsIGJlIHNob3duLgorCisgICAgLWwJbGlzdCB1aWRzIG51bWVyaWNhbGx5CisgICAgLXAJZm9yIGdpdmVuIGNvbW1hLXNlcGFyYXRlZCBwaWRzIG9ubHkgKGRlZmF1bHQgYWxsIHBpZHMpCisgICAgLXQJdGVyc2UgKHBpZCBvbmx5KSBvdXRwdXQKKyovCisKKyNkZWZpbmUgRk9SX2xzb2YKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIHN0cnVjdCBhcmdfbGlzdCAqcDsKKworICBzdHJ1Y3Qgc3RhdCAqc291Z2h0X2ZpbGVzOworCisgIHN0cnVjdCBkb3VibGVfbGlzdCAqYWxsX3NvY2tldHM7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqZmlsZXM7CisgIGludCBsYXN0X3Nob3duX3BpZDsKKyAgaW50IHNob3duX2hlYWRlcjsKKykKKworc3RydWN0IHByb2NfaW5mbyB7CisgIGNoYXIgY21kWzEwXTsKKyAgaW50IHBpZDsKKyAgY2hhciB1c2VyWzEyXTsKK307CisKK3N0cnVjdCBmaWxlX2luZm8geworICBjaGFyICpuZXh0LCAqcHJldjsKKworICAvLyBGb3Igb3V0cHV0LgorICBzdHJ1Y3QgcHJvY19pbmZvIHBpOworICBjaGFyKiBuYW1lOworICBjaGFyIGZkWzhdLCBydywgbG9ja3MsIHR5cGVbMTBdLCBkZXZpY2VbMzJdLCBzaXplX29mZlszMl0sIG5vZGVbMzJdOworCisgIC8vIEZvciBmaWx0ZXJpbmcuCisgIGRldl90IHN0X2RldjsKKyAgaW5vX3Qgc3RfaW5vOworfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaW5mbyh2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgZmlsZV9pbmZvICpmaSA9IGRhdGE7CisKKyAgLy8gRmlsdGVyIG1hdGNoZXMKKyAgaWYgKHRveXMub3B0YykgeworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaTx0b3lzLm9wdGM7IGkrKykKKyAgICAgIGlmIChUVC5zb3VnaHRfZmlsZXNbaV0uc3RfZGV2PT1maS0+c3RfZGV2KQorICAgICAgICBpZiAoVFQuc291Z2h0X2ZpbGVzW2ldLnN0X2lubz09ZmktPnN0X2lubykgYnJlYWs7CisKKyAgICBpZiAoaT09dG95cy5vcHRjKSByZXR1cm47CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyZGTEFHX3QpIHsKKyAgICBpZiAoZmktPnBpLnBpZCAhPSBUVC5sYXN0X3Nob3duX3BpZCkKKyAgICAgIHByaW50ZigiJWRcbiIsIFRULmxhc3Rfc2hvd25fcGlkID0gZmktPnBpLnBpZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFUVC5zaG93bl9oZWFkZXIpIHsKKyAgICAgIC8vIFRPRE86IGxsaXN0X3RyYXZlcnNlIHRvIG1lYXN1cmUgdGhlIGNvbHVtbnMgZmlyc3QuCisgICAgICBwcmludGYoIiUtOXMgJTVzICUxMC4xMHMgJTRzICAgJTdzICUxOHMgJTlzICUxMHMgJXNcbiIsICJDT01NQU5EIiwgIlBJRCIsCisgICAgICAgICJVU0VSIiwgIkZEIiwgIlRZUEUiLCAiREVWSUNFIiwgIlNJWkUvT0ZGIiwgIk5PREUiLCAiTkFNRSIpOworICAgICAgVFQuc2hvd25faGVhZGVyID0gMTsKKyAgICB9CisKKyAgICBwcmludGYoIiUtOXMgJTVkICUxMC4xMHMgJTRzJWMlYyAlN3MgJTE4cyAlOXMgJTEwcyAlc1xuIiwKKyAgICAgICAgICAgZmktPnBpLmNtZCwgZmktPnBpLnBpZCwgZmktPnBpLnVzZXIsCisgICAgICAgICAgIGZpLT5mZCwgZmktPnJ3LCBmaS0+bG9ja3MsIGZpLT50eXBlLCBmaS0+ZGV2aWNlLCBmaS0+c2l6ZV9vZmYsCisgICAgICAgICAgIGZpLT5ub2RlLCBmaS0+bmFtZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9pbmZvKHZvaWQgKmRhdGEpCit7CisgIGZyZWUoKChzdHJ1Y3QgZmlsZV9pbmZvICopZGF0YSktPm5hbWUpOworICBmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2ZsYWdzKHN0cnVjdCBmaWxlX2luZm8gKmZpKQoreworICBGSUxFKiBmcDsKKyAgbG9uZyBsb25nIHBvczsKKyAgdW5zaWduZWQgZmxhZ3M7CisKKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIi9wcm9jLyVkL2ZkaW5mby8lcyIsIGZpLT5waS5waWQsIGZpLT5mZCk7CisgIGZwID0gZm9wZW4odG95YnVmLCAiciIpOworICBpZiAoIWZwKSByZXR1cm47CisKKyAgaWYgKGZzY2FuZihmcCwgInBvczogJWxsZCBmbGFnczogJW8iLCAmcG9zLCAmZmxhZ3MpID09IDIpIHsKKyAgICBmbGFncyAmPSBPX0FDQ01PREU7CisgICAgaWYgKGZsYWdzID09IE9fUkRPTkxZKSBmaS0+cncgPSAncic7CisgICAgZWxzZSBpZiAoZmxhZ3MgPT0gT19XUk9OTFkpIGZpLT5ydyA9ICd3JzsKKyAgICBlbHNlIGZpLT5ydyA9ICd1JzsKKworICAgIHNucHJpbnRmKGZpLT5zaXplX29mZiwgc2l6ZW9mKGZpLT5zaXplX29mZiksICIwdCVsbGQiLCBwb3MpOworICB9CisgIGZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5fcHJvY19uZXRfZmlsZShjaGFyICpwYXRoLCBpbnQgZmFtaWx5LCBjaGFyIHR5cGUsCisgICAgdm9pZCAoKmZuKShjaGFyICosIGludCwgY2hhcikpCit7CisgIEZJTEUgKmZwID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgY2hhciAqbGluZSA9IE5VTEw7CisgIHNpemVfdCBsaW5lX2xlbmd0aCA9IDA7CisKKyAgaWYgKCFmcCkgcmV0dXJuOworCisgIGlmICghZ2V0bGluZSgmbGluZSwgJmxpbmVfbGVuZ3RoLCBmcCkpIHJldHVybjsgLy8gU2tpcCBoZWFkZXIuCisKKyAgd2hpbGUgKGdldGxpbmUoJmxpbmUsICZsaW5lX2xlbmd0aCwgZnApID4gMCkgeworICAgIGZuKGxpbmUsIGZhbWlseSwgdHlwZSk7CisgIH0KKworICBmcmVlKGxpbmUpOworICBmY2xvc2UoZnApOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfaW5mbyAqYWRkX3NvY2tldChpbm9fdCBpbm9kZSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKyAgc3RydWN0IGZpbGVfaW5mbyAqZmkgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgZmlsZV9pbmZvKSk7CisKKyAgZGxpc3RfYWRkX25vbWFsbG9jKCZUVC5hbGxfc29ja2V0cywgKHN0cnVjdCBkb3VibGVfbGlzdCAqKWZpKTsKKyAgZmktPnN0X2lubyA9IGlub2RlOworICBzdHJjcHkoZmktPnR5cGUsIHR5cGUpOworICByZXR1cm4gZmk7Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5fdW5peChjaGFyICpsaW5lLCBpbnQgYWYsIGNoYXIgdHlwZSkKK3sKKyAgbG9uZyBpbm9kZTsKKyAgaW50IHBhdGhfcG9zOworCisgIGlmIChzc2NhbmYobGluZSwgIiUqcDogJSpYICUqWCAlKlggJSpYICUqWCAlbHUgJW4iLCAmaW5vZGUsICZwYXRoX3BvcykgPj0gMSkgeworICAgIHN0cnVjdCBmaWxlX2luZm8gKmZpID0gYWRkX3NvY2tldChpbm9kZSwgInVuaXgiKTsKKyAgICBjaGFyICpuYW1lID0gY2hvbXAobGluZSArIHBhdGhfcG9zKTsKKworICAgIGZpLT5uYW1lID0gc3RyZHVwKCpuYW1lID8gbmFtZSA6ICJzb2NrZXQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzY2FuX25ldGxpbmsoY2hhciAqbGluZSwgaW50IGFmLCBjaGFyIHR5cGUpCit7CisgIHVuc2lnbmVkIHN0YXRlOworICBsb25nIGlub2RlOworICBjaGFyICpuZXRsaW5rX3N0YXRlc1tdID0geworICAgICJST1VURSIsICJVTlVTRUQiLCAiVVNFUlNPQ0siLCAiRklSRVdBTEwiLCAiU09DS19ESUFHIiwgIk5GTE9HIiwgIlhGUk0iLAorICAgICJTRUxJTlVYIiwgIklTQ1NJIiwgIkFVRElUIiwgIkZJQl9MT09LVVAiLCAiQ09OTkVDVE9SIiwgIk5FVEZJTFRFUiIsCisgICAgIklQNl9GVyIsICJETlJUTVNHIiwgIktPQkpFQ1RfVUVWRU5UIiwgIkdFTkVSSUMiLCAiRE0iLCAiU0NTSVRSQU5TUE9SVCIsCisgICAgIkVOQ1JZUFRGUyIsICJSRE1BIiwgIkNSWVBUTyIKKyAgfTsKKworICBpZiAoc3NjYW5mKGxpbmUsICIlKnAgJXUgJSp1ICUqeCAlKnUgJSp1ICUqdSAlKnUgJSp1ICVsdSIsICZzdGF0ZSwgJmlub2RlKQorICAgICAgPCAyKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBhZGRfc29ja2V0KGlub2RlLCAibmV0bGluayIpOworICBmaS0+bmFtZSA9CisgICAgICBzdHJkdXAoc3RhdGUgPCBBUlJBWV9MRU4obmV0bGlua19zdGF0ZXMpID8gbmV0bGlua19zdGF0ZXNbc3RhdGVdIDogIj8iKTsKK30KKworc3RhdGljIHZvaWQgc2Nhbl9pcChjaGFyICpsaW5lLCBpbnQgYWYsIGNoYXIgdHlwZSkKK3sKKyAgY2hhciAqdGNwX3N0YXRlc1tdID0geworICAgICJVTktOT1dOIiwgIkVTVEFCTElTSEVEIiwgIlNZTl9TRU5UIiwgIlNZTl9SRUNWIiwgIkZJTl9XQUlUMSIsICJGSU5fV0FJVDIiLAorICAgICJUSU1FX1dBSVQiLCAiQ0xPU0UiLCAiQ0xPU0VfV0FJVCIsICJMQVNUX0FDSyIsICJMSVNURU4iLCAiQ0xPU0lORyIKKyAgfTsKKyAgY2hhciBsb2NhbF9pcFtJTkVUNl9BRERSU1RSTEVOXSA9IHswfTsKKyAgY2hhciByZW1vdGVfaXBbSU5FVDZfQUREUlNUUkxFTl0gPSB7MH07CisgIHN0cnVjdCBpbjZfYWRkciBsb2NhbCwgcmVtb3RlOworICBpbnQgbG9jYWxfcG9ydCwgcmVtb3RlX3BvcnQsIHN0YXRlOworICBsb25nIGlub2RlOworICBpbnQgb2s7CisKKyAgaWYgKGFmID09IDQpIHsKKyAgICBvayA9IHNzY2FuZihsaW5lLCAiICUqZDogJXg6JXggJXg6JXggJXggJSp4OiUqeCAlKlg6JSpYICUqWCAlKmQgJSpkICVsZCIsCisgICAgICAgICAgICAgICAgJihsb2NhbC5zNl9hZGRyMzJbMF0pLCAmbG9jYWxfcG9ydCwKKyAgICAgICAgICAgICAgICAmKHJlbW90ZS5zNl9hZGRyMzJbMF0pLCAmcmVtb3RlX3BvcnQsCisgICAgICAgICAgICAgICAgJnN0YXRlLCAmaW5vZGUpID09IDY7CisgIH0gZWxzZSB7CisgICAgb2sgPSBzc2NhbmYobGluZSwgIiAlKmQ6ICU4eCU4eCU4eCU4eDoleCAlOHglOHglOHglOHg6JXggJXggIgorICAgICAgICAgICAgICAgICIlKng6JSp4ICUqWDolKlggJSpYICUqZCAlKmQgJWxkIiwKKyAgICAgICAgICAgICAgICAmKGxvY2FsLnM2X2FkZHIzMlswXSksICYobG9jYWwuczZfYWRkcjMyWzFdKSwKKyAgICAgICAgICAgICAgICAmKGxvY2FsLnM2X2FkZHIzMlsyXSksICYobG9jYWwuczZfYWRkcjMyWzNdKSwKKyAgICAgICAgICAgICAgICAmbG9jYWxfcG9ydCwKKyAgICAgICAgICAgICAgICAmKHJlbW90ZS5zNl9hZGRyMzJbMF0pLCAmKHJlbW90ZS5zNl9hZGRyMzJbMV0pLAorICAgICAgICAgICAgICAgICYocmVtb3RlLnM2X2FkZHIzMlsyXSksICYocmVtb3RlLnM2X2FkZHIzMlszXSksCisgICAgICAgICAgICAgICAgJnJlbW90ZV9wb3J0LCAmc3RhdGUsICZpbm9kZSkgPT0gMTI7CisgIH0KKyAgaWYgKCFvaykgcmV0dXJuOworCisgIHN0cnVjdCBmaWxlX2luZm8gKmZpID0gYWRkX3NvY2tldChpbm9kZSwgYWYgPT0gNCA/ICJJUHY0IiA6ICJJUHY2Iik7CisgIGluZXRfbnRvcChhZiwgJmxvY2FsLCBsb2NhbF9pcCwgc2l6ZW9mKGxvY2FsX2lwKSk7CisgIGluZXRfbnRvcChhZiwgJnJlbW90ZSwgcmVtb3RlX2lwLCBzaXplb2YocmVtb3RlX2lwKSk7CisgIGlmICh0eXBlID09ICd0JykgeworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPiBUQ1BfQ0xPU0lORykgc3RhdGUgPSAwOworICAgIGZpLT5uYW1lID0geG1wcmludGYoYWYgPT0gNCA/CisgICAgICAgICAgICAgICAgICAgICAgICAiVENQICVzOiVkLT4lczolZCAoJXMpIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiVENQIFslc106JWQtPlslc106JWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9pcCwgbG9jYWxfcG9ydCwgcmVtb3RlX2lwLCByZW1vdGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9zdGF0ZXNbc3RhdGVdKTsKKyAgfSBlbHNlIHsKKyAgICBmaS0+bmFtZSA9IHhtcHJpbnRmKGFmID09IDQgPyAiJXMgJXM6JWQtPiVzOiVkIiA6ICIlcyBbJXNdOiVkLT5bJXNdOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gJ3UnID8gIlVEUCIgOiAiUkFXIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2lwLCBsb2NhbF9wb3J0LCByZW1vdGVfaXAsIHJlbW90ZV9wb3J0KTsKKyAgfQorfQorCitzdGF0aWMgaW50IGZpbmRfc29ja2V0KHN0cnVjdCBmaWxlX2luZm8gKmZpLCBsb25nIGlub2RlKQoreworICBzdGF0aWMgaW50IGNhY2hlZDsKKyAgaWYgKCFjYWNoZWQpIHsKKyAgICBzY2FuX3Byb2NfbmV0X2ZpbGUoIi9wcm9jL25ldC90Y3AiLCA0LCAndCcsIHNjYW5faXApOworICAgIHNjYW5fcHJvY19uZXRfZmlsZSgiL3Byb2MvbmV0L3RjcDYiLCA2LCAndCcsIHNjYW5faXApOworICAgIHNjYW5fcHJvY19uZXRfZmlsZSgiL3Byb2MvbmV0L3VkcCIsIDQsICd1Jywgc2Nhbl9pcCk7CisgICAgc2Nhbl9wcm9jX25ldF9maWxlKCIvcHJvYy9uZXQvdWRwNiIsIDYsICd1Jywgc2Nhbl9pcCk7CisgICAgc2Nhbl9wcm9jX25ldF9maWxlKCIvcHJvYy9uZXQvcmF3IiwgNCwgJ3InLCBzY2FuX2lwKTsKKyAgICBzY2FuX3Byb2NfbmV0X2ZpbGUoIi9wcm9jL25ldC9yYXc2IiwgNiwgJ3InLCBzY2FuX2lwKTsKKyAgICBzY2FuX3Byb2NfbmV0X2ZpbGUoIi9wcm9jL25ldC91bml4IiwgMCwgMCwgc2Nhbl91bml4KTsKKyAgICBzY2FuX3Byb2NfbmV0X2ZpbGUoIi9wcm9jL25ldC9uZXRsaW5rIiwgMCwgMCwgc2Nhbl9uZXRsaW5rKTsKKyAgICBjYWNoZWQgPSAxOworICB9CisgIHZvaWQqIGxpc3QgPSBUVC5hbGxfc29ja2V0czsKKworICB3aGlsZSAobGlzdCkgeworICAgIHN0cnVjdCBmaWxlX2luZm8gKnMgPSAoc3RydWN0IGZpbGVfaW5mbyopIGxsaXN0X3BvcCgmbGlzdCk7CisKKyAgICBpZiAocy0+c3RfaW5vID09IGlub2RlKSB7CisgICAgICBmaS0+bmFtZSA9IHMtPm5hbWUgPyBzdHJkdXAocy0+bmFtZSkgOiBOVUxMOworICAgICAgc3RyY3B5KGZpLT50eXBlLCBzLT50eXBlKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobGlzdCA9PSBUVC5hbGxfc29ja2V0cykgYnJlYWs7CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9zdGF0KHN0cnVjdCBmaWxlX2luZm8gKmZpLCBjb25zdCBjaGFyICpwYXRoKQoreworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgbG9uZyBkZXY7CisKKyAgaWYgKHN0YXQocGF0aCwgJnNiKSkgcmV0dXJuOworCisgIC8vIEZpbGwgVFlQRS4KKyAgc3dpdGNoICgoc2Iuc3RfbW9kZSAmIFNfSUZNVCkpIHsKKyAgICBjYXNlIFNfSUZCTEs6IHN0cmNweShmaS0+dHlwZSwgIkJMSyIpOyBicmVhazsKKyAgICBjYXNlIFNfSUZDSFI6IHN0cmNweShmaS0+dHlwZSwgIkNIUiIpOyBicmVhazsKKyAgICBjYXNlIFNfSUZESVI6IHN0cmNweShmaS0+dHlwZSwgIkRJUiIpOyBicmVhazsKKyAgICBjYXNlIFNfSUZJRk86IHN0cmNweShmaS0+dHlwZSwgIkZJRk8iKTsgYnJlYWs7CisgICAgY2FzZSBTX0lGTE5LOiBzdHJjcHkoZmktPnR5cGUsICJMSU5LIik7IGJyZWFrOworICAgIGNhc2UgU19JRlJFRzogc3RyY3B5KGZpLT50eXBlLCAiUkVHIik7IGJyZWFrOworICAgIGNhc2UgU19JRlNPQ0s6IHN0cmNweShmaS0+dHlwZSwgInNvY2siKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNucHJpbnRmKGZpLT50eXBlLCBzaXplb2YoZmktPnR5cGUpLCAiMCUwM28iLCBzYi5zdF9tb2RlICYgU19JRk1UKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKFNfSVNTT0NLKHNiLnN0X21vZGUpKSBmaW5kX3NvY2tldChmaSwgc2Iuc3RfaW5vKTsKKworICAvLyBGaWxsIERFVklDRS4KKyAgZGV2ID0gKFNfSVNCTEsoc2Iuc3RfbW9kZSkgfHwgU19JU0NIUihzYi5zdF9tb2RlKSkgPyBzYi5zdF9yZGV2IDogc2Iuc3RfZGV2OworICBpZiAoIVNfSVNTT0NLKHNiLnN0X21vZGUpKQorICAgIHNucHJpbnRmKGZpLT5kZXZpY2UsIHNpemVvZihmaS0+ZGV2aWNlKSwgIiVkLCVkIiwKKyAgICAgICAgICAgICBkZXZfbWFqb3IoZGV2KSwgZGV2X21pbm9yKGRldikpOworCisgIC8vIEZpbGwgU0laRS9PRkYuCisgIGlmIChTX0lTUkVHKHNiLnN0X21vZGUpIHx8IFNfSVNESVIoc2Iuc3RfbW9kZSkpCisgICAgc25wcmludGYoZmktPnNpemVfb2ZmLCBzaXplb2YoZmktPnNpemVfb2ZmKSwgIiVsbGQiLAorICAgICAgICAgICAgIChsb25nIGxvbmcpc2Iuc3Rfc2l6ZSk7CisKKyAgLy8gRmlsbCBOT0RFLgorICBzbnByaW50ZihmaS0+bm9kZSwgc2l6ZW9mKGZpLT5ub2RlKSwgIiVsZCIsIChsb25nKXNiLnN0X2lubyk7CisKKyAgLy8gU3Rhc2ggc3RfZGV2IGFuZCBzdF9pbm8gZm9yIGZpbHRlcmluZy4KKyAgZmktPnN0X2RldiA9IHNiLnN0X2RldjsKKyAgZmktPnN0X2lubyA9IHNiLnN0X2lubzsKK30KKworc3RydWN0IGZpbGVfaW5mbyAqbmV3X2ZpbGVfaW5mbyhzdHJ1Y3QgcHJvY19pbmZvICpwaSwgY29uc3QgY2hhciAqZmQpCit7CisgIHN0cnVjdCBmaWxlX2luZm8gKmZpID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGZpbGVfaW5mbykpOworCisgIGRsaXN0X2FkZF9ub21hbGxvYygmVFQuZmlsZXMsIChzdHJ1Y3QgZG91YmxlX2xpc3QgKilmaSk7CisKKyAgZmktPnBpID0gKnBpOworCisgIC8vIERlZmF1bHRzLgorICBzdHJjcHkoZmktPmZkLCBmZCk7CisgIHN0cmNweShmaS0+dHlwZSwgInVua25vd24iKTsKKyAgZmktPnJ3ID0gZmktPmxvY2tzID0gJyAnOworCisgIHJldHVybiBmaTsKK30KKworc3RhdGljIHZvaWQgdmlzaXRfc3ltbGluayhzdHJ1Y3QgcHJvY19pbmZvICpwaSwgY2hhciAqbmFtZSwgY2hhciAqcGF0aCkKK3sKKyAgc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBuZXdfZmlsZV9pbmZvKHBpLCAiIik7CisKKyAgLy8gR2V0IE5BTUUuCisgIGlmIChuYW1lKSB7IC8vICIvcHJvYy9waWQvW2N3ZF0iLgorICAgIHNucHJpbnRmKGZpLT5mZCwgc2l6ZW9mKGZpLT5mZCksICIlcyIsIG5hbWUpOworICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvcHJvYy8lZC8lcyIsIHBpLT5waWQsIHBhdGgpOworICB9IGVsc2UgeyAvLyAiL3Byb2MvcGlkL2ZkL1szXSIKKyAgICBzbnByaW50ZihmaS0+ZmQsIHNpemVvZihmaS0+ZmQpLCAiJXMiLCBwYXRoKTsKKyAgICBmaWxsX2ZsYWdzKGZpKTsgLy8gQ2xvYmJlcnMgdG95YnVmLgorICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvcHJvYy8lZC9mZC8lcyIsIHBpLT5waWQsIHBhdGgpOworICB9CisgIC8vIFRPRE86IGNvZGUgY2FsbGVkIGJ5IGZpbGxfc3RhdCB3b3VsZCBiZSBlYXNpZXIgdG8gd3JpdGUgaWYgd2UgZGlkbid0CisgIC8vIHJlbHkgb24gdG95YnVmIGJlaW5nIHByZXNlcnZlZCBoZXJlLgorICBmaWxsX3N0YXQoZmksIHRveWJ1Zik7CisgIGlmICghZmktPm5hbWUpIHsgLy8gV2UgYWxyZWFkeSBoYXZlIGEgbmFtZSBmb3IgdGhpbmdzIGxpa2Ugc29ja2V0cy4KKyAgICBmaS0+bmFtZSA9IHhyZWFkbGluayh0b3lidWYpOworICAgIGlmICghZmktPm5hbWUpIHsKKyAgICAgIGZpLT5uYW1lID0geG1wcmludGYoIiVzIChyZWFkbGluazogJXMpIiwgdG95YnVmLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB2aXNpdF9tYXBzKHN0cnVjdCBwcm9jX2luZm8gKnBpKQoreworICBGSUxFICpmcDsKKyAgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldDsKKyAgY2hhciBkZXZpY2VbMTBdOworICBsb25nIGlub2RlOworICBjaGFyICpsaW5lID0gTlVMTDsKKyAgc2l6ZV90IGxpbmVfbGVuZ3RoID0gMDsKKworICBzbnByaW50Zih0b3lidWYsIHNpemVvZih0b3lidWYpLCAiL3Byb2MvJWQvbWFwcyIsIHBpLT5waWQpOworICBmcCA9IGZvcGVuKHRveWJ1ZiwgInIiKTsKKyAgaWYgKCFmcCkgcmV0dXJuOworCisgIHdoaWxlIChnZXRsaW5lKCZsaW5lLCAmbGluZV9sZW5ndGgsIGZwKSA+IDApIHsKKyAgICBpbnQgbmFtZV9wb3M7CisKKyAgICBpZiAoc3NjYW5mKGxpbmUsICIlKngtJSp4ICUqcyAlbGx4ICVzICVsZCAlbiIsCisgICAgICAgICAgICAgICAmb2Zmc2V0LCBkZXZpY2UsICZpbm9kZSwgJm5hbWVfcG9zKSA+PSAzKSB7CisgICAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmaTsKKworICAgICAgLy8gSWdub3JlIG5vbi1maWxlIG1hcHMuCisgICAgICBpZiAoaW5vZGUgPT0gMCB8fCAhc3RyY21wKGRldmljZSwgIjAwOjAwIikpIGNvbnRpbnVlOworICAgICAgLy8gVE9ETzogc2hvdyB1bmlxdWUgbWFwcyBldmVuIGlmIHRoZXkgaGF2ZSBhIG5vbi16ZXJvIG9mZnNldD8KKyAgICAgIGlmIChvZmZzZXQgIT0gMCkgY29udGludWU7CisKKyAgICAgIGZpID0gbmV3X2ZpbGVfaW5mbyhwaSwgIm1lbSIpOworICAgICAgZmktPm5hbWUgPSBzdHJkdXAoY2hvbXAobGluZSArIG5hbWVfcG9zKSk7CisgICAgICBmaWxsX3N0YXQoZmksIGZpLT5uYW1lKTsKKyAgICB9CisgIH0KKyAgZnJlZShsaW5lKTsKKyAgZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgdmlzaXRfZmRzKHN0cnVjdCBwcm9jX2luZm8gKnBpKQoreworICBESVIgKmRpcjsKKyAgc3RydWN0IGRpcmVudCAqZGU7CisKKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIi9wcm9jLyVkL2ZkIiwgcGktPnBpZCk7CisgIGlmICghKGRpciA9IG9wZW5kaXIodG95YnVmKSkpIHsKKyAgICBzdHJ1Y3QgZmlsZV9pbmZvICpmaSA9IG5ld19maWxlX2luZm8ocGksICJOT0ZEIik7CisKKyAgICBmaS0+bmFtZSA9IHhtcHJpbnRmKCIlcyAob3BlbmRpcjogJXMpIiwgdG95YnVmLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7CisgICAgaWYgKCpkZS0+ZF9uYW1lID09ICcuJykgY29udGludWU7CisgICAgdmlzaXRfc3ltbGluayhwaSwgTlVMTCwgZGUtPmRfbmFtZSk7CisgIH0KKworICBjbG9zZWRpcihkaXIpOworfQorCitzdGF0aWMgdm9pZCBsc29mX3BpZChpbnQgcGlkKQoreworICBzdHJ1Y3QgcHJvY19pbmZvIHBpOworICBjaGFyICpsaW5lOworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAvLyBTa2lwIG5vbmV4aXN0ZW50IHBpZHMKKyAgc3ByaW50Zih0b3lidWYsICIvcHJvYy8lZC9zdGF0IiwgcGlkKTsKKyAgaWYgKCEobGluZSA9IHJlYWRmaWxlKHRveWJ1ZiwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpKSByZXR1cm47CisKKyAgLy8gR2V0IENPTU1BTkQuCisgIHN0cmNweShwaS5jbWQsICI/Iik7CisgIGlmIChsaW5lKSB7CisgICAgY2hhciAqb3Blbl9wYXJlbiA9IHN0cmNocih0b3lidWYsICcoJyk7CisgICAgY2hhciAqY2xvc2VfcGFyZW4gPSBzdHJyY2hyKHRveWJ1ZiwgJyknKTsKKworICAgIGlmIChvcGVuX3BhcmVuICYmIGNsb3NlX3BhcmVuKSB7CisgICAgICAqY2xvc2VfcGFyZW4gPSAwOworICAgICAgc25wcmludGYocGkuY21kLCBzaXplb2YocGkuY21kKSwgIiVzIiwgb3Blbl9wYXJlbiArIDEpOworICAgIH0KKyAgfQorCisgIC8vIFdlIGFscmVhZHkga25vdyBQSUQuCisgIHBpLnBpZCA9IHBpZDsKKworICAvLyBHZXQgVVNFUi4KKyAgc25wcmludGYodG95YnVmLCBzaXplb2YodG95YnVmKSwgIi9wcm9jLyVkIiwgcGlkKTsKKyAgaWYgKCFzdGF0KHRveWJ1ZiwgJnNiKSkgeworICAgIHN0cnVjdCBwYXNzd2QgKnB3OworCisgICAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX2wpICYmIChwdyA9IGdldHB3dWlkKHNiLnN0X3VpZCkpKSB7CisgICAgICBzbnByaW50ZihwaS51c2VyLCBzaXplb2YocGkudXNlciksICIlcyIsIHB3LT5wd19uYW1lKTsKKyAgICB9IGVsc2Ugc25wcmludGYocGkudXNlciwgc2l6ZW9mKHBpLnVzZXIpLCAiJXUiLCAodW5zaWduZWQpc2Iuc3RfdWlkKTsKKyAgfQorCisgIHZpc2l0X3N5bWxpbmsoJnBpLCAiY3dkIiwgImN3ZCIpOworICB2aXNpdF9zeW1saW5rKCZwaSwgInJ0ZCIsICJyb290Iik7CisgIHZpc2l0X3N5bWxpbmsoJnBpLCAidHh0IiwgImV4ZSIpOworICB2aXNpdF9tYXBzKCZwaSk7CisgIHZpc2l0X2ZkcygmcGkpOworfQorCitzdGF0aWMgaW50IHNjYW5fcHJvYyhzdHJ1Y3QgZGlydHJlZSAqbm9kZSkKK3sKKyAgaW50IHBpZDsKKworICBpZiAoIW5vZGUtPnBhcmVudCkgcmV0dXJuIERJUlRSRUVfUkVDVVJTRXxESVJUUkVFX1NIVVRVUDsKKyAgaWYgKChwaWQgPSBhdG9sKG5vZGUtPm5hbWUpKSkgbHNvZl9waWQocGlkKTsKKworICByZXR1cm4gMDsKK30KKwordm9pZCBsc29mX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGFyZ19saXN0ICpwcDsKKyAgaW50IGk7CisKKyAgLy8gbHNvZiB3aWxsIG9ubHkgZmlsdGVyIG9uIHBhdGhzIGl0IGNhbiBzdGF0IChiZWNhdXNlIGl0IGZpbHRlcnMgYnkgaW5vZGUpLgorICBUVC5zb3VnaHRfZmlsZXMgPSB4bWFsbG9jKHRveXMub3B0YypzaXplb2Yoc3RydWN0IHN0YXQpKTsKKyAgZm9yIChpID0gMDsgaTx0b3lzLm9wdGM7ICsraSkgeHN0YXQodG95cy5vcHRhcmdzW2ldLCBUVC5zb3VnaHRfZmlsZXMraSk7CisKKyAgaWYgKCFUVC5wKSBkaXJ0cmVlX3JlYWQoIi9wcm9jIiwgc2Nhbl9wcm9jKTsKKyAgZWxzZSBmb3IgKHBwID0gVFQucDsgcHA7IHBwID0gcHAtPm5leHQpIHsKKyAgICBjaGFyICpzdGFydCwgKmVuZCwgKm5leHQgPSBwcC0+YXJnOworICAgIGludCBsZW5ndGgsIHBpZDsKKworICAgIHdoaWxlICgoc3RhcnQgPSBjb21tYV9pdGVyYXRlKCZuZXh0LCAmbGVuZ3RoKSkpIHsKKyAgICAgIHBpZCA9IHN0cnRvbChzdGFydCwgJmVuZCwgMTApOworICAgICAgaWYgKHBpZDwxIHx8ICgqZW5kICYmICplbmQhPScsJykpCisgICAgICAgIGVycm9yX2V4aXQoImJhZCAtcCAnJS4qcyciLCAoaW50KShlbmQtc3RhcnQpLCBzdGFydCk7CisgICAgICBsc29mX3BpZChwaWQpOworICAgIH0KKyAgfQorCisgIGxsaXN0X3RyYXZlcnNlKFRULmZpbGVzLCBwcmludF9pbmZvKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSB7CisgICAgbGxpc3RfdHJhdmVyc2UoVFQuZmlsZXMsIGZyZWVfaW5mbyk7CisgICAgbGxpc3RfdHJhdmVyc2UoVFQuYWxsX3NvY2tldHMsIGZyZWVfaW5mbyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvbWRldi5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9tZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4OGNmMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvbWRldi5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiBtZGV2LmMgLSBQb3B1bGF0ZSAvZGV2IGRpcmVjdG9yeSBhbmQgaGFuZGxlIGhvdHBsdWcgZXZlbnRzCisgKgorICogQ29weXJpZ2h0IDIwMDUsIDIwMDggUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA1IEZyYW5rIFNvcmVuc29uIDxmcmFua0B0dXhyb2Nrcy5jb20+CisKK1VTRV9NREVWKE5FV1RPWShtZGV2LCAicyIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfVU1BU0spKQorCitjb25maWcgTURFVgorICBib29sICJtZGV2IgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBtZGV2IFstc10KKworICAgIENyZWF0ZSBkZXZpY2VzIGluIC9kZXYgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSAvc3lzLgorCisgICAgLXMJU2NhbiBhbGwgZW50cmllcyBpbiAvc3lzIHRvIHBvcHVsYXRlIC9kZXYuCisKK2NvbmZpZyBNREVWX0NPTkYKKyAgYm9vbCAiQ29uZmlndXJhdGlvbiBmaWxlIGZvciBtZGV2IgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBNREVWCisgIGhlbHAKKyAgICBUaGUgbWRldiBjb25maWcgZmlsZSAoL2V0Yy9tZGV2LmNvbmYpIGNvbnRhaW5zIGxpbmVzIHRoYXQgbG9vayBsaWtlOgorICAgIGhkW2Etel1bMC05XSogMDozIDY2MAorCisgICAgRWFjaCBsaW5lIG11c3QgY29udGFpbiB0aHJlZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBmaWVsZHMuIFRoZSBmaXJzdAorICAgIGZpZWxkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG9uZSBvciBtb3JlIGRldmljZSBuYW1lcywKKyAgICB0aGUgc2Vjb25kIGFuZCB0aGlyZCBmaWVsZHMgYXJlIHVpZDpnaWQgYW5kIGZpbGUgcGVybWlzc2lvbnMgZm9yCisgICAgbWF0Y2hpbmcgZGV2aWVzLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKworLy8gbWtub2QgaW4gL2RldiBiYXNlZCBvbiBhIHBhdGggbGlrZSAiL3N5cy9ibG9jay9oZGEvaGRhMSIKK3N0YXRpYyB2b2lkIG1ha2VfZGV2aWNlKGNoYXIgKnBhdGgpCit7CisgIGNoYXIgKmRldmljZV9uYW1lID0gMCwgKnMsICp0ZW1wOworICBpbnQgbWFqb3IgPSAwLCBtaW5vciA9IDAsIHR5cGUsIGxlbiwgZmQsIG1vZGUgPSAwNjYwOworICB1aWRfdCB1aWQgPSAwOworICBnaWRfdCBnaWQgPSAwOworCisgIGlmIChwYXRoKSB7CisKKyAgICAvLyBUcnkgdG8gcmVhZCBtYWpvci9taW5vciBzdHJpbmcsIHJldHVybmluZyBpZiB3ZSBjYW4ndAorICAgIHRlbXAgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisgICAgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKyAgICAqdGVtcCA9IDA7CisgICAgbGVuID0gcmVhZChmZCwgdG95YnVmLCA2NCk7CisgICAgY2xvc2UoZmQpOworICAgIGlmIChsZW48MSkgcmV0dXJuOworICAgIHRveWJ1ZltsZW5dID0gMDsKKworICAgIC8vIERldGVybWluZSBkZXZpY2UgdHlwZSwgbWFqb3IgYW5kIG1pbm9yCisKKyAgICB0eXBlID0gcGF0aFs1XT09J2MnID8gU19JRkNIUiA6IFNfSUZCTEs7CisgICAgc3NjYW5mKHRveWJ1ZiwgIiV1OiV1IiwgJm1ham9yLCAmbWlub3IpOworICB9IGVsc2UgeworICAgIC8vIGlmICghcGF0aCksIGRvIGhvdHBsdWcKKworICAgIGlmICghKHRlbXAgPSBnZXRlbnYoIk1PREFMSUFTIikpKSB4cnVuKChjaGFyICpbXSl7Im1vZHByb2JlIiwgdGVtcCwgMH0pOworICAgIGlmICghKHRlbXAgPSBnZXRlbnYoIlNVQlNZU1RFTSIpKSkgcmV0dXJuOworICAgIHR5cGUgPSBzdHJjbXAodGVtcCwgImJsb2NrIikgPyBTX0lGQ0hSIDogU19JRkJMSzsKKyAgICBpZiAoISh0ZW1wID0gZ2V0ZW52KCJNQUpPUiIpKSkgcmV0dXJuOworICAgIHNzY2FuZih0ZW1wLCAiJXUiLCAmbWFqb3IpOworICAgIGlmICghKHRlbXAgPSBnZXRlbnYoIk1JTk9SIikpKSByZXR1cm47CisgICAgc3NjYW5mKHRlbXAsICIldSIsICZtaW5vcik7CisgICAgaWYgKCEocGF0aCA9IGdldGVudigiREVWUEFUSCIpKSkgcmV0dXJuOworICAgIGRldmljZV9uYW1lID0gZ2V0ZW52KCJERVZOQU1FIik7CisgIH0KKyAgaWYgKCFkZXZpY2VfbmFtZSkKKyAgICBkZXZpY2VfbmFtZSA9IHN0cnJjaHIocGF0aCwgJy8nKSArIDE7CisKKyAgLy8gYXMgaW4gbGludXgvZHJpdmVycy9iYXNlL2NvcmUuYywgZGV2aWNlX2dldF9kZXZub2RlKCkKKyAgd2hpbGUgKCh0ZW1wID0gc3RyY2hyKGRldmljZV9uYW1lLCAnIScpKSkgeworICAgICp0ZW1wID0gJy8nOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGNvbmZpZyBmaWxlLCBsb29rIHVwIHBlcm1pc3Npb25zIGZvciB0aGlzIGRldmljZQorCisgIGlmIChDRkdfTURFVl9DT05GKSB7CisgICAgY2hhciAqY29uZiwgKnBvcywgKmVuZDsKKworICAgIC8vIG1tYXAgdGhlIGNvbmZpZyBmaWxlCisgICAgaWYgKC0xIT0oZmQgPSBvcGVuKCIvZXRjL21kZXYuY29uZiIsIE9fUkRPTkxZKSkpIHsKKyAgICAgIGxlbiA9IGZkbGVuZ3RoKGZkKTsKKyAgICAgIGNvbmYgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworICAgICAgaWYgKGNvbmYpIHsKKyAgICAgICAgaW50IGxpbmUgPSAwOworCisgICAgICAgIC8vIExvb3AgdGhyb3VnaCBsaW5lcyBpbiBtbWFwZWQgZmlsZQorICAgICAgICBmb3IgKHBvcyA9IGNvbmY7IHBvcy1jb25mPGxlbjspIHsKKyAgICAgICAgICBpbnQgZmllbGQ7CisgICAgICAgICAgY2hhciAqZW5kMjsKKworICAgICAgICAgIGxpbmUrKzsKKyAgICAgICAgICAvLyBmaW5kIGVuZCBvZiB0aGlzIGxpbmUKKyAgICAgICAgICBmb3IoZW5kID0gcG9zOyBlbmQtY29uZjxsZW4gJiYgKmVuZCE9J1xuJzsgZW5kKyspOworCisgICAgICAgICAgLy8gVGhyZWUgZmllbGRzOiByZWdleCwgdWlkOmdpZCwgbW9kZQorICAgICAgICAgIGZvciAoZmllbGQgPSAzOyBmaWVsZDsgZmllbGQtLSkgeworICAgICAgICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlCisgICAgICAgICAgICB3aGlsZSAocG9zPGVuZCAmJiBpc3NwYWNlKCpwb3MpKSBwb3MrKzsKKyAgICAgICAgICAgIGlmIChwb3M9PWVuZCB8fCAqcG9zPT0nIycpIGJyZWFrOworICAgICAgICAgICAgZm9yIChlbmQyID0gcG9zOworICAgICAgICAgICAgICBlbmQyPGVuZCAmJiAhaXNzcGFjZSgqZW5kMikgJiYgKmVuZDIhPScjJzsgZW5kMisrKTsKKyAgICAgICAgICAgIHN3aXRjaChmaWVsZCkgeworICAgICAgICAgICAgICAvLyBSZWdleCB0byBtYXRjaCB0aGlzIGRldmljZQorICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpyZWdleCA9IHN0cm5kdXAocG9zLCBlbmQyLXBvcyk7CisgICAgICAgICAgICAgICAgcmVnZXhfdCBtYXRjaDsKKyAgICAgICAgICAgICAgICByZWdtYXRjaF90IG9mZjsKKyAgICAgICAgICAgICAgICBpbnQgcmVzdWx0OworCisgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBpdD8KKyAgICAgICAgICAgICAgICB4cmVnY29tcCgmbWF0Y2gsIHJlZ2V4LCBSRUdfRVhURU5ERUQpOworICAgICAgICAgICAgICAgIHJlc3VsdD1yZWdleGVjKCZtYXRjaCwgZGV2aWNlX25hbWUsIDEsICZvZmYsIDApOworICAgICAgICAgICAgICAgIHJlZ2ZyZWUoJm1hdGNoKTsKKyAgICAgICAgICAgICAgICBmcmVlKHJlZ2V4KTsKKworICAgICAgICAgICAgICAgIC8vIElmIG5vdCB0aGlzIGRldmljZSwgc2tpcCByZXN0IG9mIGxpbmUKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0IHx8IG9mZi5ybV9zbworICAgICAgICAgICAgICAgICAgfHwgb2ZmLnJtX2VvIT1zdHJsZW4oZGV2aWNlX25hbWUpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9saW5lOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gdWlkOmdpZAorICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpzMjsKKworICAgICAgICAgICAgICAgIC8vIEZpbmQgOgorICAgICAgICAgICAgICAgIGZvcihzID0gcG9zOyBzPGVuZDIgJiYgKnMhPSc6JzsgcysrKTsKKyAgICAgICAgICAgICAgICBpZiAocz09ZW5kMikgZ290byBlbmRfbGluZTsKKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIFVJRAorICAgICAgICAgICAgICAgIHVpZCA9IHN0cnRvdWwocG9zLCZzMiwxMCk7CisgICAgICAgICAgICAgICAgaWYgKHMhPXMyKSB7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwYXNzOworICAgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gc3RybmR1cChwb3MsIHMtcG9zKTsKKyAgICAgICAgICAgICAgICAgIHBhc3MgPSBnZXRwd25hbShzdHIpOworICAgICAgICAgICAgICAgICAgZnJlZShzdHIpOworICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSBnb3RvIGVuZF9saW5lOworICAgICAgICAgICAgICAgICAgdWlkID0gcGFzcy0+cHdfdWlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgLy8gcGFyc2UgR0lECisgICAgICAgICAgICAgICAgZ2lkID0gc3RydG91bChzLCZzMiwxMCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZDIhPXMyKSB7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JvdXAgKmdycDsKKyAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciA9IHN0cm5kdXAocywgZW5kMi1zKTsKKyAgICAgICAgICAgICAgICAgIGdycCA9IGdldGdybmFtKHN0cik7CisgICAgICAgICAgICAgICAgICBmcmVlKHN0cik7CisgICAgICAgICAgICAgICAgICBpZiAoIWdycCkgZ290byBlbmRfbGluZTsKKyAgICAgICAgICAgICAgICAgIGdpZCA9IGdycC0+Z3JfZ2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBtb2RlCisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vZGUgPSBzdHJ0b3VsKHBvcywgJnBvcywgOCk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyE9ZW5kMikgZ290byBlbmRfbGluZTsKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2RldmljZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zPWVuZDI7CisgICAgICAgICAgfQorZW5kX2xpbmU6CisgICAgICAgICAgLy8gRGlkIGV2ZXJ5dGhpbmcgcGFyc2UgaGFwcGlseT8KKyAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQhPTMpIGVycm9yX2V4aXQoIkJhZCBsaW5lICVkIiwgbGluZSk7CisKKyAgICAgICAgICAvLyBOZXh0IGxpbmUKKyAgICAgICAgICBwb3MgPSArK2VuZDsKKyAgICAgICAgfQorZm91bmRfZGV2aWNlOgorICAgICAgICBtdW5tYXAoY29uZiwgbGVuKTsKKyAgICAgIH0KKyAgICAgIGNsb3NlKGZkKTsKKyAgICB9CisgIH0KKworICBzcHJpbnRmKHRveWJ1ZiwgIi9kZXYvJXMiLCBkZXZpY2VfbmFtZSk7CisKKyAgaWYgKCh0ZW1wPWdldGVudigiQUNUSU9OIikpICYmICFzdHJjbXAodGVtcCwgInJlbW92ZSIpKSB7CisgICAgdW5saW5rKHRveWJ1Zik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0cmNocihkZXZpY2VfbmFtZSwgJy8nKSkKKyAgICBta3BhdGhhdChBVF9GRENXRCwgdG95YnVmLCAwLCAyKTsKKyAgaWYgKG1rbm9kKHRveWJ1ZiwgbW9kZSB8IHR5cGUsIGRldl9tYWtlZGV2KG1ham9yLCBtaW5vcikpICYmIGVycm5vICE9IEVFWElTVCkKKyAgICBwZXJyb3JfZXhpdCgibWtub2QgJXMgZmFpbGVkIiwgdG95YnVmKTsKKworIAorICBpZiAodHlwZSA9PSBTX0lGQkxLKSBjbG9zZShvcGVuKHRveWJ1ZiwgT19SRE9OTFkpKTsgLy8gc2NhbiBmb3IgcGFydGl0aW9ucworCisgIGlmIChDRkdfTURFVl9DT05GKSBtb2RlPWNob3duKHRveWJ1ZiwgdWlkLCBnaWQpOworfQorCitzdGF0aWMgaW50IGNhbGxiYWNrKHN0cnVjdCBkaXJ0cmVlICpub2RlKQoreworICAvLyBFbnRyaWVzIGluIC9zeXMvY2xhc3MvYmxvY2sgYXJlbid0IGNoYXIgZGV2aWNlcywgc28gc2tpcCAnZW0uICAoV2UnbGwKKyAgLy8gZ2V0IGJsb2NrIGRldmljZXMgb3V0IG9mIC9zeXMvYmxvY2suKQorICBpZighc3RyY21wKG5vZGUtPm5hbWUsICJibG9jayIpKSByZXR1cm4gMDsKKworICAvLyBEb2VzIHRoaXMgZGlyZWN0b3J5IGhhdmUgYSAiZGV2IiBlbnRyeSBpbiBpdD8KKyAgLy8gVGhpcyBpcyBwYXRoIGJhc2VkIGJlY2F1c2UgdGhlIGhvdHBsdWcgY2FsbGJhY2tzIGFyZQorICBpZiAoU19JU0RJUihub2RlLT5zdC5zdF9tb2RlKSB8fCBTX0lTTE5LKG5vZGUtPnN0LnN0X21vZGUpKSB7CisgICAgaW50IGxlbj00OworICAgIGNoYXIgKmRldiA9IGRpcnRyZWVfcGF0aChub2RlLCAmbGVuKTsKKyAgICBzdHJjcHkoZGV2K2xlbiwgIi9kZXYiKTsKKyAgICBpZiAoIWFjY2VzcyhkZXYsIFJfT0spKSBtYWtlX2RldmljZShkZXYpOworICAgIGZyZWUoZGV2KTsKKyAgfQorCisgIC8vIENpcmNhIDIuNi4yNSB0aGUgZW50cmllcyBtb3JlIHRoYW4gMiBkZWVwIGFyZSBhbGwgZWl0aGVyIHJlZHVuZGFudAorICAvLyAobW91c2UjLCBldmVudCMpIG9yIHVubmFtZWQgKGV2ZXJ5IHVzYl8qIGVudHJ5IGlzIGNhbGxlZCAiZGV2aWNlIikuCisKKyAgcmV0dXJuIChub2RlLT5wYXJlbnQgJiYgbm9kZS0+cGFyZW50LT5wYXJlbnQpID8gMCA6IERJUlRSRUVfUkVDVVJTRTsKK30KKwordm9pZCBtZGV2X21haW4odm9pZCkKK3sKKyAgLy8gSGFuZGxlIC1zCisKKyAgaWYgKHRveXMub3B0ZmxhZ3MpIHsKKyAgICBkaXJ0cmVlX3JlYWQoIi9zeXMvY2xhc3MiLCBjYWxsYmFjayk7CisgICAgZGlydHJlZV9yZWFkKCIvc3lzL2Jsb2NrIiwgY2FsbGJhY2spOworICB9IGVsc2UgeyAvLyBob3RwbHVnIHN1cHBvcnQKKyAgICBtYWtlX2RldmljZShOVUxMKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9ta2UyZnMuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvbWtlMmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjODQxYQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvbWtlMmZzLmMKQEAgLTAsMCArMSw2MzEgQEAKKy8qIG1rZTJmcy5jIC0gQ3JlYXRlIGFuIGV4dDIgZmlsZXN5c3RlbSBpbWFnZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorCisvLyBTdGlsbCB0byBnbzogIkU6ako6TDptOk86IgorVVNFX01LRTJGUyhORVdUT1kobWtlMmZzLCAiPDE+Mmc6Rm5xbSNOI2kjYiMiLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgTUtFMkZTCisgIGJvb2wgIm1rZTJmcyIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogbWtlMmZzIFstRm5xXSBbLWIgIyMjXSBbLU58aSAjIyNdIFstbSAjIyNdIGRldmljZQorCisgICAgQ3JlYXRlIGFuIGV4dDIgZmlsZXN5c3RlbSBvbiBhIGJsb2NrIGRldmljZSBvciBmaWxlc3lzdGVtIGltYWdlLgorCisgICAgLUYgICAgICAgICBGb3JjZSB0byBydW4gb24gYSBtb3VudGVkIGRldmljZQorICAgIC1uICAgICAgICAgRG9uJ3Qgd3JpdGUgdG8gZGV2aWNlCisgICAgLXEgICAgICAgICBRdWlldCAobm8gb3V0cHV0KQorICAgIC1iIHNpemUgICAgQmxvY2sgc2l6ZSAoMTAyNCwgMjA0OCwgb3IgNDA5NikKKyAgICAtTiBpbm9kZXMgIEFsbG9jYXRlIHRoaXMgbWFueSBpbm9kZXMKKyAgICAtaSBieXRlcyAgIEFsbG9jYXRlIG9uZSBpbm9kZSBmb3IgZXZlcnkgWFhYIGJ5dGVzIG9mIGRldmljZQorICAgIC1tIHBlcmNlbnQgUmVzZXJ2ZSB0aGlzIHBlcmNlbnQgb2YgZmlsZXN5c3RlbSBzcGFjZSBmb3Igcm9vdCB1c2VyCisKK2NvbmZpZyBNS0UyRlNfSk9VUk5BTAorICBib29sICJKb3VybmFsaW5nIHN1cHBvcnQgKGV4dDMpIgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBNS0UyRlMKKyAgaGVscAorICAgIHVzYWdlOiBta2UyZnMgWy1qXSBbLUogc2l6ZT0jIyMsZGV2aWNlPVhYWF0KKworICAgIC1qICAgICAgICAgQ3JlYXRlIGpvdXJuYWwgKGV4dDMpCisgICAgLUogICAgICAgICBKb3VybmFsIG9wdGlvbnMKKyAgICAgICAgICAgICAgIHNpemU6IE51bWJlciBvZiBibG9ja3MgKDEwMjQtMTAyNDAwKQorICAgICAgICAgICAgICAgZGV2aWNlOiBTcGVjaWZ5IGFuIGV4dGVybmFsIGpvdXJuYWwKKworY29uZmlnIE1LRTJGU19HRU4KKyAgYm9vbCAiR2VuZXJhdGUgKGdlbmUyZnMpIgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBNS0UyRlMKKyAgaGVscAorICAgIHVzYWdlOiBnZW5lMmZzIFtvcHRpb25zXSBkZXZpY2UgZmlsZW5hbWUKKworICAgIFRoZSBbb3B0aW9uc10gYXJlIHRoZSBzYW1lIGFzIG1rZTJmcy4KKworY29uZmlnIE1LRTJGU19MQUJFTAorICBib29sICJMYWJlbCBzdXBwb3J0IgorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBNS0UyRlMKKyAgaGVscAorICAgIHVzYWdlOiBta2UyZnMgWy1MIGxhYmVsXSBbLU0gcGF0aF0gWy1vIHN0cmluZ10KKworICAgIC1MICAgICAgICAgVm9sdW1lIGxhYmVsCisgICAgLU0gICAgICAgICBQYXRoIHRvIG1vdW50IHBvaW50CisgICAgLW8gICAgICAgICBDcmVhdGVkIGJ5CisKK2NvbmZpZyBNS0UyRlNfRVhURU5ERUQKKyAgYm9vbCAiRXh0ZW5kZWQgb3B0aW9ucyIKKyAgZGVmYXVsdCBuCisgIGRlcGVuZHMgb24gTUtFMkZTCisgIGhlbHAKKyAgICB1c2FnZTogbWtlMmZzIFstRSBzdHJpZGU9IyMjXSBbLU8gb3B0aW9uWyxvcHRpb25dXQorCisgICAgLUUgc3RyaWRlPSBTZXQgUkFJRCBzdHJpcGUgc2l6ZSAoaW4gYmxvY2tzKQorICAgIC1PIFtvcHRzXSAgU3BlY2lmeSBmZXdlciBleHQyIG9wdGlvbiBmbGFncyAoZm9yIG9sZCBrZXJuZWxzKQorICAgICAgICAgICAgICAgQWxsIG9mIHRoZXNlIGFyZSBvbiBieSBkZWZhdWx0IChhcyBhcHByb3ByaWF0ZSkKKyAgICAgICBub25lICAgICAgICAgQ2xlYXIgZGVmYXVsdCBvcHRpb25zIChhbGwgYnV0IGpvdXJuYWxpbmcpCisgICAgICAgZGlyX2luZGV4ICAgIFVzZSBodHJlZSBpbmRleGVzIGZvciBsYXJnZSBkaXJlY3RvcmllcworICAgICAgIGZpbGV0eXBlICAgICBTdG9yZSBmaWxlIHR5cGUgaW5mbyBpbiBkaXJlY3RvcnkgZW50cnkKKyAgICAgICBoYXNfam91cm5hbCAgU2V0IGJ5IC1qCisgICAgICAgam91cm5hbF9kZXYgIFNldCBieSAtSiBkZXZpY2U9WFhYCisgICAgICAgc3BhcnNlX3N1cGVyIERvbid0IGFsbG9jYXRlIGh1Z2UgbnVtYmVycyBvZiByZWR1bmRhbnQgc3VwZXJibG9ja3MKKyovCisKKyNkZWZpbmUgRk9SX21rZTJmcworI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgLy8gQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgbG9uZyBibG9ja3NpemU7CisgIGxvbmcgYnl0ZXNfcGVyX2lub2RlOworICBsb25nIGlub2RlczsgICAgICAgICAgIC8vIFRvdGFsIGlub2RlcyBpbiBmaWxlc3lzdGVtLgorICBsb25nIHJlc2VydmVkX3BlcmNlbnQ7IC8vIEludGVnZXIgcHJlY2VudCBvZiBzcGFjZSB0byByZXNlcnZlIGZvciByb290LgorICBjaGFyICpnZW5kaXI7ICAgICAgICAgIC8vIFdoZXJlIHRvIHJlYWQgZGlydHJlZSBmcm9tLgorCisgIC8vIEludGVybmFsIGRhdGEuCisgIHN0cnVjdCBkaXJ0cmVlICpkdDsgICAgLy8gVHJlZSBvZiBmaWxlcyB0byBjb3B5IGludG8gdGhlIG5ldyBmaWxlc3lzdGVtLgorICB1bnNpZ25lZCB0cmVlYmxvY2tzOyAgIC8vIEJsb2NrcyB1c2VkIGJ5IGR0CisgIHVuc2lnbmVkIHRyZWVpbm9kZXM7ICAgLy8gSW5vZGVzIHVzZWQgYnkgZHQKKworICB1bnNpZ25lZCBibG9ja3M7ICAgICAgIC8vIFRvdGFsIGJsb2NrcyBpbiB0aGUgZmlsZXN5c3RlbS4KKyAgdW5zaWduZWQgZnJlZWJsb2NrczsgICAvLyBGcmVlIGJsb2NrcyBpbiB0aGUgZmlsZXN5c3RlbS4KKyAgdW5zaWduZWQgaW5vZGVzcGc7ICAgICAvLyBJbm9kZXMgcGVyIGdyb3VwCisgIHVuc2lnbmVkIGdyb3VwczsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIGJsb2NrIGdyb3Vwcy4KKyAgdW5zaWduZWQgYmxvY2tiaXRzOyAgICAvLyBCaXRzIHBlciBibG9jay4gIChBbHNvIGJsb2NrcyBwZXIgZ3JvdXAuKQorCisgIC8vIEZvciBnZW5lMmZzCisgIHVuc2lnbmVkIG5leHRibG9jazsgICAgLy8gTmV4dCBkYXRhIGJsb2NrIHRvIGFsbG9jYXRlCisgIHVuc2lnbmVkIG5leHRncm91cDsgICAgLy8gTmV4dCBncm91cCB3ZSdsbCBiZSBhbGxvY2F0aW5nIGZyb20KKyAgaW50IGZzZmQ7ICAgICAgICAgICAgICAvLyBGaWxlIGRlc2NyaXB0b3Igb2YgZmlsZXN5c3RlbSAodG8gb3V0cHV0IHRvKS4KKworICBzdHJ1Y3QgZXh0Ml9zdXBlcmJsb2NrIHNiOworKQorCisjZGVmaW5lIElOT0RFU19SRVNFUlZFRCAxMAorCitzdGF0aWMgdWludDMyX3QgZGl2X3JvdW5kX3VwKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgIHVpbnQzMl90IGMgPSBhL2I7CisKKyAgaWYgKGElYikgYysrOworICByZXR1cm4gYzsKK30KKworLy8gQ2FsY3VsYXRlIGRhdGEgYmxvY2tzIHBsdXMgaW5kZXggYmxvY2tzIG5lZWRlZCB0byBob2xkIGEgZmlsZS4KKworc3RhdGljIHVpbnQzMl90IGZpbGVfYmxvY2tzX3VzZWQodWludDY0X3Qgc2l6ZSwgdWludDMyX3QgKmJsb2NrbGlzdCkKK3sKKyAgdWludDMyX3QgZGJsb2NrcyA9ICh1aW50MzJfdCkoKHNpemUrKFRULmJsb2Nrc2l6ZS0xKSkvVFQuYmxvY2tzaXplKTsKKyAgdWludDMyX3QgaWR4PVRULmJsb2Nrc2l6ZS80LCBpYmxvY2tzPTAsIGRpYmxvY2tzPTAsIHRpYmxvY2tzPTA7CisKKyAgLy8gRmlsbCBvdXQgaW5kZXggYmxvY2tzIGluIGlub2RlLgorCisgIGlmIChibG9ja2xpc3QpIHsKKyAgICBpbnQgaTsKKworICAgIC8vIERpcmVjdCBpbmRleCBibG9ja3MKKyAgICBmb3IgKGk9MDsgaTwxMyAmJiBpPGRibG9ja3M7IGkrKykgYmxvY2tsaXN0W2ldID0gaTsKKyAgICAvLyBTaW5nbHkgaW5kaXJlY3QgaW5kZXggYmxvY2tzCisgICAgaWYgKGRibG9ja3MgPiAxMytpZHgpIGJsb2NrbGlzdFsxM10gPSAxMytpZHg7CisgICAgLy8gRG91Ymx5IGluZGlyZWN0IGluZGV4IGJsb2NrcworICAgIGlkeCA9IDEzICsgaWR4ICsgKGlkeCppZHgpOworICAgIGlmIChkYmxvY2tzID4gaWR4KSBibG9ja2xpc3RbMTRdID0gaWR4OworCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBBY2NvdW50IGZvciBkaXJlY3QsIHNpbmdseSwgZG91Ymx5LCBhbmQgdHJpcGx5IGluZGlyZWN0IGluZGV4IGJsb2NrcworCisgIGlmIChkYmxvY2tzID4gMTIpIHsKKyAgICBpYmxvY2tzID0gKChkYmxvY2tzLTEzKS9pZHgpKzE7CisgICAgaWYgKGlibG9ja3MgPiAxKSB7CisgICAgICBkaWJsb2NrcyA9ICgoaWJsb2Nrcy0yKS9pZHgpKzE7CisgICAgICBpZiAoZGlibG9ja3MgPiAxKQorICAgICAgICB0aWJsb2NrcyA9ICgoZGlibG9ja3MtMikvaWR4KSsxOworICAgIH0KKyAgfQorCisgIHJldHVybiBkYmxvY2tzICsgaWJsb2NrcyArIGRpYmxvY2tzICsgdGlibG9ja3M7Cit9CisKKy8vIFVzZSB0aGUgcGFyZW50IHBvaW50ZXIgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0cmVlIG5vbi1yZWN1cnNpdmVseS4KK3N0YXRpYyBzdHJ1Y3QgZGlydHJlZSAqdHJlZW5leHQoc3RydWN0IGRpcnRyZWUgKnRoaXMpCit7CisgIHdoaWxlICh0aGlzICYmICF0aGlzLT5uZXh0KSB0aGlzID0gdGhpcy0+cGFyZW50OworICBpZiAodGhpcykgdGhpcyA9IHRoaXMtPm5leHQ7CisKKyAgcmV0dXJuIHRoaXM7Cit9CisKKy8vIFJlY3Vyc2l2ZWx5IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IGVhY2ggaW5vZGUgaW4gdGhlIHRyZWUuCisvLyBSZXR1cm5zIGJsb2NrcyB1c2VkIGJ5IHRoaXMgZGlyZWN0b3J5LCBhc3NpZ25zIGJ5dGVzIHVzZWQgdG8gKnNpemUuCisvLyBXcml0ZXMgdG90YWwgYmxvY2sgY291bnQgdG8gVFQudHJlZWJsb2NrcyBhbmQgaW5vZGUgY291bnQgdG8gVFQudHJlZWlub2Rlcy4KKworc3RhdGljIGxvbmcgY2hlY2tfdHJlZXNpemUoc3RydWN0IGRpcnRyZWUgKnRoYXQsIG9mZl90ICpzaXplKQoreworICBsb25nIGJsb2NrczsKKworICB3aGlsZSAodGhhdCkgeworICAgICpzaXplICs9IHNpemVvZihzdHJ1Y3QgZXh0Ml9kZW50cnkpICsgc3RybGVuKHRoYXQtPm5hbWUpOworCisgICAgaWYgKHRoYXQtPmNoaWxkKQorICAgICAgdGhhdC0+c3Quc3RfYmxvY2tzID0gY2hlY2tfdHJlZXNpemUodGhhdC0+Y2hpbGQsICZ0aGF0LT5zdC5zdF9zaXplKTsKKyAgICBlbHNlIGlmIChTX0lTUkVHKHRoYXQtPnN0LnN0X21vZGUpKSB7CisgICAgICAgdGhhdC0+c3Quc3RfYmxvY2tzID0gZmlsZV9ibG9ja3NfdXNlZCh0aGF0LT5zdC5zdF9zaXplLCAwKTsKKyAgICAgICBUVC50cmVlYmxvY2tzICs9IHRoYXQtPnN0LnN0X2Jsb2NrczsKKyAgICB9CisgICAgdGhhdCA9IHRoYXQtPm5leHQ7CisgIH0KKyAgVFQudHJlZWJsb2NrcyArPSBibG9ja3MgPSBmaWxlX2Jsb2Nrc191c2VkKCpzaXplLCAwKTsKKyAgVFQudHJlZWlub2RlcysrOworCisgIHJldHVybiBibG9ja3M7Cit9CisKKy8vIENhbGN1bGF0ZSBpbm9kZSBudW1iZXJzIGFuZCBsaW5rIGNvdW50cy4KKy8vCisvLyBUbyBkbyB0aGlzIHJpZ2h0IEkgbmVlZCB0byBjb3B5IHRoZSB0cmVlIGFuZCBzb3J0IGl0LCBidXQgaGVyZSdzIGEgcmVhbGx5CisvLyB1Z2x5IG5eMiB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgZG9lc24ndCBzY2FsZSB3ZWxsIHRvIGxhcmdlCisvLyBudW1iZXJzIG9mIGZpbGVzICg+IDEwMCwwMDApIGJ1dCBjYW4gYmUgZG9uZSBpbiB2ZXJ5IGxpdHRsZSBjb2RlLgorLy8gVGhpcyByZXdyaXRlcyBpbm9kZSBudW1iZXJzIHRvIHRoZWlyIGZpbmFsIHZhbHVlcywgYWxsb2NhdGluZyBkZXB0aCBmaXJzdC4KKworc3RhdGljIHZvaWQgY2hlY2tfdHJlZWxpbmtzKHN0cnVjdCBkaXJ0cmVlICp0cmVlKQoreworICBzdHJ1Y3QgZGlydHJlZSAqY3VycmVudD10cmVlLCAqdGhhdDsKKyAgbG9uZyBpbm9kZSA9IElOT0RFU19SRVNFUlZFRDsKKworICB3aGlsZSAoY3VycmVudCkgeworICAgICsraW5vZGU7CisgICAgLy8gU2luY2Ugd2UgY2FuJ3QgaGFyZGxpbmsgdG8gZGlyZWN0b3JpZXMsIHdlIGtub3cgdGhlaXIgbGluayBjb3VudC4KKyAgICBpZiAoU19JU0RJUihjdXJyZW50LT5zdC5zdF9tb2RlKSkgY3VycmVudC0+c3Quc3RfbmxpbmsgPSAyOworICAgIGVsc2UgeworICAgICAgZGV2X3QgbmV3ID0gY3VycmVudC0+c3Quc3RfZGV2OworCisgICAgICBpZiAoIW5ldykgY29udGludWU7CisKKyAgICAgIC8vIExvb2sgZm9yIG90aGVyIGNvcGllcyBvZiBjdXJyZW50IG5vZGUKKyAgICAgIGN1cnJlbnQtPnN0LnN0X25saW5rID0gMDsKKyAgICAgIGZvciAodGhhdCA9IHRyZWU7IHRoYXQ7IHRoYXQgPSB0cmVlbmV4dCh0aGF0KSkgeworICAgICAgICBpZiAoY3VycmVudC0+c3Quc3RfaW5vID09IHRoYXQtPnN0LnN0X2lubyAmJgorICAgICAgICAgIGN1cnJlbnQtPnN0LnN0X2RldiA9PSB0aGF0LT5zdC5zdF9kZXYpCisgICAgICAgIHsKKyAgICAgICAgICBjdXJyZW50LT5zdC5zdF9ubGluaysrOworICAgICAgICAgIGN1cnJlbnQtPnN0LnN0X2lubyA9IGlub2RlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGN1cnJlbnQtPnN0LnN0X2lubyA9IGlub2RlOworICAgIGN1cnJlbnQgPSB0cmVlbmV4dChjdXJyZW50KTsKKyAgfQorfQorCisvLyBDYWxjdWxhdGUgaW5vZGVzIHBlciBncm91cCBmcm9tIHRvdGFsIGlub2Rlcy4KK3N0YXRpYyB1aW50MzJfdCBnZXRfaW5vZGVzcGcodWludDMyX3QgaW5vZGVzKQoreworICB1aW50MzJfdCB0ZW1wOworCisgIC8vIFJvdW5kIHVwIHRvIGZpbGwgY29tcGxldGUgaW5vZGUgYmxvY2tzLgorICB0ZW1wID0gKGlub2RlcyArIFRULmdyb3VwcyAtIDEpIC8gVFQuZ3JvdXBzOworICBpbm9kZXMgPSBUVC5ibG9ja3NpemUvc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKTsKKyAgcmV0dXJuICgodGVtcCArIGlub2RlcyAtIDEpL2lub2RlcykqaW5vZGVzOworfQorCisvLyBGaWxsIG91dCBzdXBlcmJsb2NrIGFuZCBUVCBzdHJ1Y3R1cmVzLgorCitzdGF0aWMgdm9pZCBpbml0X3N1cGVyYmxvY2soc3RydWN0IGV4dDJfc3VwZXJibG9jayAqc2IpCit7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgLy8gU2V0IGxvZ19ibG9ja19zaXplIGFuZCBsb2dfZnJhZ19zaXplLgorCisgIGZvciAodGVtcCA9IDA7IHRlbXAgPCA0OyB0ZW1wKyspIGlmIChUVC5ibG9ja3NpemUgPT0gMTAyNDw8dGVtcCkgYnJlYWs7CisgIGlmICh0ZW1wPT00KSBlcnJvcl9leGl0KCJiYWQgYmxvY2tzaXplIik7CisgIHNiLT5sb2dfYmxvY2tfc2l6ZSA9IHNiLT5sb2dfZnJhZ19zaXplID0gU1dBUF9MRTMyKHRlbXApOworCisgIC8vIEZpbGwgb3V0IGJsb2Nrc19jb3VudCwgcl9ibG9ja3NfY291bnQsIGZpcnN0X2RhdGFfYmxvY2sKKworICBzYi0+YmxvY2tzX2NvdW50ID0gU1dBUF9MRTMyKFRULmJsb2Nrcyk7CisgIHNiLT5mcmVlX2Jsb2Nrc19jb3VudCA9IFNXQVBfTEUzMihUVC5mcmVlYmxvY2tzKTsKKyAgdGVtcCA9IChUVC5ibG9ja3MgKiAodWludDY0X3QpVFQucmVzZXJ2ZWRfcGVyY2VudCkgLyAxMDA7CisgIHNiLT5yX2Jsb2Nrc19jb3VudCA9IFNXQVBfTEUzMih0ZW1wKTsKKworICBzYi0+Zmlyc3RfZGF0YV9ibG9jayA9IFNXQVBfTEUzMihUVC5ibG9ja3NpemUgPT0gMTAyNCA/IDEgOiAwKTsKKworICAvLyBTZXQgYmxvY2tzX3Blcl9ncm91cCBhbmQgZnJhZ3NfcGVyX2dyb3VwLCB3aGljaCBpcyB0aGUgc2l6ZSBvZiBhbgorICAvLyBhbGxvY2F0aW9uIGJpdG1hcCB0aGF0IGZpdHMgaW4gb25lIGJsb2NrIChJLkUuIGhvdyBtYW55IGJpdHMgcGVyIGJsb2NrKT8KKworICBzYi0+YmxvY2tzX3Blcl9ncm91cCA9IHNiLT5mcmFnc19wZXJfZ3JvdXAgPSBTV0FQX0xFMzIoVFQuYmxvY2tiaXRzKTsKKworICAvLyBTZXQgaW5vZGVzX3Blcl9ncm91cCBhbmQgdG90YWwgaW5vZGVzX2NvdW50CisgIHNiLT5pbm9kZXNfcGVyX2dyb3VwID0gU1dBUF9MRTMyKFRULmlub2Rlc3BnKTsKKyAgc2ItPmlub2Rlc19jb3VudCA9IFNXQVBfTEUzMihUVC5pbm9kZXNwZyAqIFRULmdyb3Vwcyk7CisKKyAgLy8gRGV0ZXJtaW5lIGZyZWUgaW5vZGVzLgorICB0ZW1wID0gVFQuaW5vZGVzcGcqVFQuZ3JvdXBzIC0gSU5PREVTX1JFU0VSVkVEOworICBpZiAodGVtcCA8IFRULnRyZWVpbm9kZXMpIGVycm9yX2V4aXQoIk5vdCBlbm91Z2ggaW5vZGVzLlxuIik7CisgIHNiLT5mcmVlX2lub2Rlc19jb3VudCA9IFNXQVBfTEUzMih0ZW1wIC0gVFQudHJlZWlub2Rlcyk7CisKKyAgLy8gRmlsbCBvdXQgdGhlIHJlc3Qgb2YgdGhlIHN1cGVyYmxvY2suCisgIHNiLT5tYXhfbW50X2NvdW50PTB4RkZGRjsKKyAgc2ItPnd0aW1lID0gc2ItPmxhc3RjaGVjayA9IHNiLT5ta2ZzX3RpbWUgPSBTV0FQX0xFMzIodGltZShOVUxMKSk7CisgIHNiLT5tYWdpYyA9IFNXQVBfTEUzMigweEVGNTMpOworICBzYi0+c3RhdGUgPSBzYi0+ZXJyb3JzID0gU1dBUF9MRTE2KDEpOworCisgIHNiLT5yZXZfbGV2ZWwgPSBTV0FQX0xFMzIoMSk7CisgIHNiLT5maXJzdF9pbm8gPSBTV0FQX0xFMzIoSU5PREVTX1JFU0VSVkVEKzEpOworICBzYi0+aW5vZGVfc2l6ZSA9IFNXQVBfTEUxNihzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKTsKKyAgc2ItPmZlYXR1cmVfaW5jb21wYXQgPSBTV0FQX0xFMzIoRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKTsKKyAgc2ItPmZlYXR1cmVfcm9fY29tcGF0ID0gU1dBUF9MRTMyKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKTsKKworICBjcmVhdGVfdXVpZChzYi0+dXVpZCk7CisKKyAgLy8gVE9ETyBJZiB3ZSdyZSBjYWxsZWQgYXMgbWtlM2ZzIG9yIG1rZnMuZXh0MywgZG8gYSBqb3VybmFsLgorCisgIC8vaWYgKHN0cmNocih0b3lzLndoaWNoLT5uYW1lLCczJykpCisgIC8vCXNiLT5mZWF0dXJlX2NvbXBhdCB8PSBTV0FQX0xFMzIoRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCk7Cit9CisKKy8vIERvZXMgdGhpcyBncm91cCBjb250YWluIGEgc3VwZXJibG9jayBiYWNrdXAgKGFuZCBncm91cCBkZXNjcmlwdG9yIHRhYmxlKT8KK3N0YXRpYyBpbnQgaXNfc2JfZ3JvdXAodWludDMyX3QgZ3JvdXApCit7CisgIGludCBpOworCisgIC8vIFN1cGVyYmxvY2sgYmFja3VwcyBhcmUgb24gZ3JvdXBzIDAsIDEsIGFuZCBwb3dlcnMgb2YgMywgNSwgYW5kIDcuCisgIGlmKCFncm91cCB8fCBncm91cD09MSkgcmV0dXJuIDE7CisgIGZvciAoaT0zOyBpPDk7IGkrPTIpIHsKKyAgICBpbnQgaiA9IGk7CisgICAgd2hpbGUgKGo8Z3JvdXApIGoqPWk7CisgICAgaWYgKGo9PWdyb3VwKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisvLyBOdW1iZXIgb2YgYmxvY2tzIHVzZWQgaW4gZ3JvdXAgYnkgb3B0aW9uYWwgc3VwZXJibG9jay9ncm91cCBsaXN0IGJhY2t1cC4KK3N0YXRpYyBpbnQgZ3JvdXBfc3VwZXJibG9ja19vdmVyaGVhZCh1aW50MzJfdCBncm91cCkKK3sKKyAgaW50IHVzZWQ7CisKKyAgaWYgKCFpc19zYl9ncm91cChncm91cCkpIHJldHVybiAwOworCisgIC8vIEhvdyBtYW55IGJsb2NrcyBkb2VzIHRoZSBncm91cCBkZXNjcmlwdG9yIHRhYmxlIHRha2UgdXA/CisgIHVzZWQgPSBUVC5ncm91cHMgKiBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXApOworICB1c2VkICs9IFRULmJsb2Nrc2l6ZSAtIDE7CisgIHVzZWQgLz0gVFQuYmxvY2tzaXplOworICAvLyBQbHVzIHRoZSBzdXBlcmJsb2NrIGl0c2VsZi4KKyAgdXNlZCsrOworICAvLyBBbmQgYSBjb3JuZXIgY2FzZS4KKyAgaWYgKCFncm91cCAmJiBUVC5ibG9ja3NpemUgPT0gMTAyNCkgdXNlZCsrOworCisgIHJldHVybiB1c2VkOworfQorCisvLyBOdW1iZXIgb2YgYmxvY2tzIHVzZWQgaW4gZ3JvdXAgdG8gc3RvcmUgc3VwZXJibG9jay9ncm91cC9pbm9kZSBsaXN0CitzdGF0aWMgaW50IGdyb3VwX292ZXJoZWFkKHVpbnQzMl90IGdyb3VwKQoreworICAvLyBSZXR1cm4gc3VwZXJibG9jayBiYWNrdXAgb3ZlcmhlYWQgKGlmIGFueSksIHBsdXMgYmxvY2svaW5vZGUKKyAgLy8gYWxsb2NhdGlvbiBiaXRtYXBzLCBwbHVzIGlub2RlIHRhYmxlcy4KKyAgcmV0dXJuIGdyb3VwX3N1cGVyYmxvY2tfb3ZlcmhlYWQoZ3JvdXApICsgMiArIGdldF9pbm9kZXNwZyhUVC5pbm9kZXNwZykKKyAgICAgICAgLyAoVFQuYmxvY2tzaXplL3NpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworfQorCisvLyBJbiBiaXRtYXAgImFycmF5IiBzZXQgImxlbiIgYml0cyBzdGFydGluZyBhdCBwb3NpdGlvbiAic3RhcnQiIChmcm9tIDApLgorc3RhdGljIHZvaWQgYml0c19zZXQoY2hhciAqYXJyYXksIGludCBzdGFydCwgaW50IGxlbikKK3sKKyAgd2hpbGUobGVuKSB7CisgICAgaWYgKChzdGFydCY3KSB8fCBsZW48OCkgeworICAgICAgYXJyYXlbc3RhcnQvOF18PSgxPDwoc3RhcnQmNykpOworICAgICAgc3RhcnQrKzsKKyAgICAgIGxlbi0tOworICAgIH0gZWxzZSB7CisgICAgICBhcnJheVtzdGFydC84XT0yNTU7CisgICAgICBzdGFydCs9ODsKKyAgICAgIGxlbi09ODsKKyAgICB9CisgIH0KK30KKworLy8gU2VlayBwYXN0IGxlbiBieXRlcyAodG8gbWFpbnRhaW4gc3BhcnNlIGZpbGUpLCBvciB3cml0ZSB6ZXJvZXMgaWYgb3V0cHV0CisvLyBub3Qgc2Vla2FibGUKK3N0YXRpYyB2b2lkIHB1dF96ZXJvZXMoaW50IGxlbikKK3sKKyAgaWYoLTEgPT0gbHNlZWsoVFQuZnNmZCwgbGVuLCBTRUVLX1NFVCkpIHsKKyAgICBtZW1zZXQodG95YnVmLCAwLCBzaXplb2YodG95YnVmKSk7CisgICAgd2hpbGUgKGxlbikgeworICAgICAgaW50IG91dCA9IGxlbiA+IHNpemVvZih0b3lidWYpID8gc2l6ZW9mKHRveWJ1ZikgOiBsZW47CisgICAgICB4d3JpdGUoVFQuZnNmZCwgdG95YnVmLCBvdXQpOworICAgICAgbGVuIC09IG91dDsKKyAgICB9CisgIH0KK30KKworLy8gRmlsbCBvdXQgYW4gaW5vZGUgc3RydWN0dXJlIGZyb20gc3RydWN0IHN0YXQgaW5mbyBpbiBkaXJ0cmVlLgorc3RhdGljIHZvaWQgZmlsbF9pbm9kZShzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW4sIHN0cnVjdCBkaXJ0cmVlICp0aGF0KQoreworICB1aW50MzJfdCBmYnVbMTVdOworICBpbnQgdGVtcDsKKworICBmaWxlX2Jsb2Nrc191c2VkKHRoYXQtPnN0LnN0X3NpemUsIGZidSk7CisKKyAgLy8gSWYgdGhhdCBpbm9kZSBuZWVkcyBkYXRhIGJsb2NrcyBhbGxvY2F0ZWQgdG8gaXQuCisgIGlmICh0aGF0LT5zdC5zdF9zaXplKSB7CisgICAgaW50IGksIGdyb3VwID0gVFQubmV4dGJsb2NrL1RULmJsb2NrYml0czsKKworICAgIC8vIFRPRE86IHRlYWNoIHRoaXMgYWJvdXQgaW5kaXJlY3QgYmxvY2tzLgorICAgIGZvciAoaT0wOyBpPDE1OyBpKyspIHsKKyAgICAgIC8vIElmIHdlIGp1c3QganVtcGVkIGludG8gYSBuZXcgZ3JvdXAsIHNraXAgZ3JvdXAgb3ZlcmhlYWQgYmxvY2tzLgorICAgICAgd2hpbGUgKGdyb3VwID49IFRULm5leHRncm91cCkKKyAgICAgICAgVFQubmV4dGJsb2NrICs9IGdyb3VwX292ZXJoZWFkKFRULm5leHRncm91cCsrKTsKKyAgICB9CisgIH0KKyAgLy8gVE9ETyA6ICBTX0lTUkVHL0RJUi9DSFIvQkxLL0ZJRk8vTE5LL1NPQ0sobSkKKyAgaW4tPm1vZGUgPSBTV0FQX0xFMzIodGhhdC0+c3Quc3RfbW9kZSk7CisKKyAgaW4tPnVpZCA9IFNXQVBfTEUxNih0aGF0LT5zdC5zdF91aWQgJiAweEZGRkYpOworICBpbi0+dWlkX2hpZ2ggPSBTV0FQX0xFMTYodGhhdC0+c3Quc3RfdWlkID4+IDE2KTsKKyAgaW4tPmdpZCA9IFNXQVBfTEUxNih0aGF0LT5zdC5zdF9naWQgJiAweEZGRkYpOworICBpbi0+Z2lkX2hpZ2ggPSBTV0FQX0xFMTYodGhhdC0+c3Quc3RfZ2lkID4+IDE2KTsKKyAgaW4tPnNpemUgPSBTV0FQX0xFMzIodGhhdC0+c3Quc3Rfc2l6ZSAmIDB4RkZGRkZGRkYpOworCisgIC8vIENvbnRvcnRpb25zIHRvIG1ha2UgdGhlIGNvbXBpbGVyIG5vdCBnZW5lcmF0ZSBhIHdhcm5pbmcgZm9yIHg+PjMyCisgIC8vIHdoZW4geCBpcyAzMiBiaXRzLiAgVGhlIG9wdGltaXplciBzaG91bGQgY2xlYW4gdGhpcyB1cC4KKyAgaWYgKHNpemVvZih0aGF0LT5zdC5zdF9zaXplKSA+IDQpIHRlbXAgPSAzMjsKKyAgZWxzZSB0ZW1wID0gMDsKKyAgaWYgKHRlbXApIGluLT5kaXJfYWNsID0gU1dBUF9MRTMyKHRoYXQtPnN0LnN0X3NpemUgPj4gdGVtcCk7CisKKyAgaW4tPmF0aW1lID0gU1dBUF9MRTMyKHRoYXQtPnN0LnN0X2F0aW1lKTsKKyAgaW4tPmN0aW1lID0gU1dBUF9MRTMyKHRoYXQtPnN0LnN0X2N0aW1lKTsKKyAgaW4tPm10aW1lID0gU1dBUF9MRTMyKHRoYXQtPnN0LnN0X210aW1lKTsKKworICBpbi0+bGlua3NfY291bnQgPSBTV0FQX0xFMTYodGhhdC0+c3Quc3RfbmxpbmspOworICBpbi0+YmxvY2tzID0gU1dBUF9MRTMyKHRoYXQtPnN0LnN0X2Jsb2Nrcyk7CisgIC8vIGluLT5mYWRkcgorfQorCisvLyBXb3JrcyBsaWtlIGFuIGFyY2hpdmVyLgorLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4gIElmIGl0IGFscmVhZHkKKy8vIGV4aXN0cywgdGhhdCBzaXplIHdpbGwgYmUgdXNlZC4KKwordm9pZCBta2UyZnNfbWFpbih2b2lkKQoreworICBpbnQgaSwgdGVtcDsKKyAgb2ZmX3QgbGVuZ3RoOworICB1aW50MzJfdCB1c2VkYmxvY2tzLCB1c2VkaW5vZGVzLCBkdGlibGssIGR0YmJsazsKKyAgc3RydWN0IGRpcnRyZWUgKmR0aSwgKmR0YjsKKworICAvLyBIYW5kbGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworICBpZiAodG95cy5vcHRhcmdzWzFdKSB7CisgICAgc3NjYW5mKHRveXMub3B0YXJnc1sxXSwgIiV1IiwgJlRULmJsb2Nrcyk7CisgICAgdGVtcCA9IE9fUkRXUnxPX0NSRUFUOworICB9IGVsc2UgdGVtcCA9IE9fUkRXUjsKKyAgaWYgKCFUVC5yZXNlcnZlZF9wZXJjZW50KSBUVC5yZXNlcnZlZF9wZXJjZW50ID0gNTsKKworICAvLyBUT0RPOiBDaGVjayBpZiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgaGVyZQorCisgIC8vIEZvciBta2U/ZnMsIG9wZW4gZmlsZS4gIEZvciBnZW5lP2ZzLCBjcmVhdGUgZmlsZS4KKyAgVFQuZnNmZCA9IHhjcmVhdGUoKnRveXMub3B0YXJncywgdGVtcCwgMDc3Nyk7CisKKyAgLy8gRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGJsb2NrIHNpemUgYW5kIGJsb2NrIGNvdW50IGZyb20gZmlsZSBsZW5ndGguCisgIC8vIChJZiBubyBsZW5ndGgsIGRlZmF1bHQgdG8gNGsuICBUaGV5IGNhbiBvdmVycmlkZSBpdCBvbiB0aGUgY21kbGluZS4pCisKKyAgbGVuZ3RoID0gZmRsZW5ndGgoVFQuZnNmZCk7CisgIGlmICghVFQuYmxvY2tzaXplKSBUVC5ibG9ja3NpemUgPSAobGVuZ3RoICYmIGxlbmd0aCA8IDE8PDI5KSA/IDEwMjQgOiA0MDk2OworICBUVC5ibG9ja2JpdHMgPSA4KlRULmJsb2Nrc2l6ZTsKKyAgaWYgKCFUVC5ibG9ja3MpIFRULmJsb2NrcyA9IGxlbmd0aC9UVC5ibG9ja3NpemU7CisKKyAgLy8gQ29sbGVjdCBnZW5lMmZzIGxpc3Qgb3IgbG9zdCtmb3VuZCwgY2FsY3VsYXRlIHJlcXVpcmVtZW50cy4KKworICBpZiAoVFQuZ2VuZGlyKSB7CisgICAgc3RybmNweSh0b3lidWYsIFRULmdlbmRpciwgc2l6ZW9mKHRveWJ1ZikpOworICAgIGR0aSA9IGRpcnRyZWVfcmVhZCh0b3lidWYsIGRpcnRyZWVfbm90ZG90ZG90KTsKKyAgfSBlbHNlIHsKKyAgICBkdGkgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgZGlydHJlZSkrMTEpOworICAgIHN0cmNweShkdGktPm5hbWUsICJsb3N0K2ZvdW5kIik7CisgICAgZHRpLT5zdC5zdF9tb2RlID0gU19JRkRJUnwwNzU1OworICAgIGR0aS0+c3Quc3RfY3RpbWUgPSBkdGktPnN0LnN0X210aW1lID0gdGltZShOVUxMKTsKKyAgfQorCisgIC8vIEFkZCByb290IGRpcmVjdG9yeSBpbm9kZS4gIFRoaXMgaXMgaXRlcmF0ZWQgdGhyb3VnaCBmb3Igd2hlbiBmaW5kaW5nCisgIC8vIGJsb2NrcywgYnV0IG5vdCB3aGVuIGZpbmRpbmcgaW5vZGVzLiAgVGhlIHRyZWUncyBwYXJlbnQgcG9pbnRlcnMgZG9uJ3QKKyAgLy8gcG9pbnQgYmFjayBpbnRvIHRoaXMuCisKKyAgZHRiID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGRpcnRyZWUpKzEpOworICBkdGItPnN0LnN0X21vZGUgPSBTX0lGRElSfDA3NTU7CisgIGR0Yi0+c3Quc3RfY3RpbWUgPSBkdGItPnN0LnN0X210aW1lID0gdGltZShOVUxMKTsKKyAgZHRiLT5jaGlsZCA9IGR0aTsKKworICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHNwYWNlIGlzIHVzZWQgYnkgcHJlc2V0IGZpbGVzCisgIGxlbmd0aCA9IGNoZWNrX3RyZWVzaXplKGR0YiwgJihkdGItPnN0LnN0X3NpemUpKTsKKyAgY2hlY2tfdHJlZWxpbmtzKGR0Yik7CisKKyAgLy8gRmlndXJlIG91dCBob3cgbWFueSB0b3RhbCBpbm9kZXMgd2UgbmVlZC4KKworICBpZiAoIVRULmlub2RlcykgeworICAgIGlmICghVFQuYnl0ZXNfcGVyX2lub2RlKSBUVC5ieXRlc19wZXJfaW5vZGUgPSA4MTkyOworICAgIFRULmlub2RlcyA9IChUVC5ibG9ja3MgKiAodWludDY0X3QpVFQuYmxvY2tzaXplKSAvIFRULmJ5dGVzX3Blcl9pbm9kZTsKKyAgfQorCisgIC8vIElmIHdlJ3JlIGdlbmVyYXRpbmcgYSBmaWxlc3lzdGVtIGFuZCBoYXZlIG5vIGlkZWEgaG93IG1hbnkgYmxvY2tzIGl0CisgIC8vIG5lZWRzLCBzdGFydCB3aXRoIGEgbWluaW1hbCBndWVzcywgZmluZCB0aGUgb3ZlcmhlYWQgb2YgdGhhdCBtYW55CisgIC8vIGdyb3VwcywgYW5kIGxvb3AgdW50aWwgdGhpcyBpcyBlbm91Z2ggZ3JvdXBzIHRvIHN0b3JlIHRoaXMgbWFueSBibG9ja3MuCisgIGlmICghVFQuYmxvY2tzKSBUVC5ncm91cHMgPSAoVFQudHJlZWJsb2Nrcy9UVC5ibG9ja2JpdHMpKzE7CisgIGVsc2UgVFQuZ3JvdXBzID0gZGl2X3JvdW5kX3VwKFRULmJsb2NrcywgVFQuYmxvY2tiaXRzKTsKKworICBmb3IgKDs7KSB7CisgICAgdGVtcCA9IFRULnRyZWVibG9ja3M7CisKKyAgICBmb3IgKGkgPSAwOyBpPFRULmdyb3VwczsgaSsrKSB0ZW1wICs9IGdyb3VwX292ZXJoZWFkKGkpOworCisgICAgaWYgKFRULmJsb2NrcykgeworICAgICAgaWYgKFRULmJsb2NrcyA8IHRlbXApIGVycm9yX2V4aXQoIk5vdCBlbm91Z2ggc3BhY2UuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodGVtcCA8PSBUVC5ncm91cHMgKiBUVC5ibG9ja2JpdHMpIHsKKyAgICAgIFRULmJsb2NrcyA9IHRlbXA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgVFQuZ3JvdXBzKys7CisgIH0KKyAgVFQuZnJlZWJsb2NrcyA9IFRULmJsb2NrcyAtIHRlbXA7CisKKyAgLy8gTm93IHdlIGtub3cgYWxsIHRoZSBUVCBkYXRhLCBpbml0aWFsaXplIHN1cGVyYmxvY2sgc3RydWN0dXJlLgorCisgIGluaXRfc3VwZXJibG9jaygmVFQuc2IpOworCisgIC8vIFN0YXJ0IHdyaXRpbmcuICBTa2lwIHRoZSBmaXJzdCAxayB0byBhdm9pZCB0aGUgYm9vdCBzZWN0b3IgKGlmIGFueSkuCisgIHB1dF96ZXJvZXMoMTAyNCk7CisKKyAgLy8gTG9vcCB0aHJvdWdoIGJsb2NrIGdyb3Vwcywgd3JpdGUgb3V0IGVhY2ggb25lLgorICBkdGlibGsgPSBkdGJibGsgPSB1c2VkYmxvY2tzID0gdXNlZGlub2RlcyA9IDA7CisgIGZvciAoaT0wOyBpPFRULmdyb3VwczsgaSsrKSB7CisgICAgc3RydWN0IGV4dDJfaW5vZGUgKmluID0gKHN0cnVjdCBleHQyX2lub2RlICopdG95YnVmOworICAgIHVpbnQzMl90IHN0YXJ0LCBpdGFibGUsIHVzZWQsIGVuZDsKKyAgICBpbnQgaiwgc2xvdDsKKworICAgIC8vIFdoZXJlIGRvZXMgdGhpcyBncm91cCBlbmQ/CisgICAgZW5kID0gVFQuYmxvY2tiaXRzOworICAgIGlmICgoaSsxKSpUVC5ibG9ja2JpdHMgPiBUVC5ibG9ja3MpIGVuZCA9IFRULmJsb2NrcyAmIChUVC5ibG9ja2JpdHMtMSk7CisKKyAgICAvLyBCbG9ja3MgdXNlZCBieSBpbm9kZSB0YWJsZQorICAgIGl0YWJsZSA9IChUVC5pbm9kZXNwZypzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKS9UVC5ibG9ja3NpemU7CisKKyAgICAvLyBJZiBhIHN1cGVyYmxvY2sgZ29lcyBoZXJlLCB3cml0ZSBpdCBvdXQuCisgICAgc3RhcnQgPSBncm91cF9zdXBlcmJsb2NrX292ZXJoZWFkKGkpOworICAgIGlmIChzdGFydCkgeworICAgICAgc3RydWN0IGV4dDJfZ3JvdXAgKmJnID0gKHN0cnVjdCBleHQyX2dyb3VwICopdG95YnVmOworICAgICAgaW50IHRyZWVibG9ja3MgPSBUVC50cmVlYmxvY2tzLCB0cmVlaW5vZGVzID0gVFQudHJlZWlub2RlczsKKworICAgICAgVFQuc2IuYmxvY2tfZ3JvdXBfbnIgPSBTV0FQX0xFMTYoaSk7CisKKyAgICAgIC8vIFdyaXRlIHN1cGVyYmxvY2sgYW5kIHBhZCBpdCB1cCB0byBibG9jayBzaXplCisgICAgICB4d3JpdGUoVFQuZnNmZCwgJlRULnNiLCBzaXplb2Yoc3RydWN0IGV4dDJfc3VwZXJibG9jaykpOworICAgICAgdGVtcCA9IFRULmJsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0Ml9zdXBlcmJsb2NrKTsKKyAgICAgIGlmICghaSAmJiBUVC5ibG9ja3NpemUgPiAxMDI0KSB0ZW1wIC09IDEwMjQ7CisgICAgICBtZW1zZXQodG95YnVmLCAwLCBUVC5ibG9ja3NpemUpOworICAgICAgeHdyaXRlKFRULmZzZmQsIHRveWJ1ZiwgdGVtcCk7CisKKyAgICAgIC8vIExvb3AgdGhyb3VnaCBncm91cHMgdG8gd3JpdGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZS4KKyAgICAgIGZvcihqPTA7IGo8VFQuZ3JvdXBzOyBqKyspIHsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgc2VjdG9yIHRoaXMgZ3JvdXAgc3RhcnRzIGluLgorICAgICAgICB1c2VkID0gZ3JvdXBfc3VwZXJibG9ja19vdmVyaGVhZChqKTsKKworICAgICAgICAvLyBGaW5kIG5leHQgYXJyYXkgc2xvdCBpbiB0aGlzIGJsb2NrIChmbHVzaCBibG9jayBpZiBmdWxsKS4KKyAgICAgICAgc2xvdCA9IGogJSAoVFQuYmxvY2tzaXplL3NpemVvZihzdHJ1Y3QgZXh0Ml9ncm91cCkpOworICAgICAgICBpZiAoIXNsb3QpIHsKKyAgICAgICAgICBpZiAoaikgeHdyaXRlKFRULmZzZmQsIGJnLCBUVC5ibG9ja3NpemUpOworICAgICAgICAgIG1lbXNldChiZywgMCwgVFQuYmxvY2tzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhvdyBtYW55IGZyZWUgaW5vZGVzIGluIHRoaXMgZ3JvdXA/CisgICAgICAgIHRlbXAgPSBUVC5pbm9kZXNwZzsKKyAgICAgICAgaWYgKCFpKSB0ZW1wIC09IElOT0RFU19SRVNFUlZFRDsKKyAgICAgICAgaWYgKHRlbXAgPiB0cmVlaW5vZGVzKSB7CisgICAgICAgICAgdHJlZWlub2RlcyAtPSB0ZW1wOworICAgICAgICAgIHRlbXAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRlbXAgLT0gdHJlZWlub2RlczsKKyAgICAgICAgICB0cmVlaW5vZGVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBiZ1tzbG90XS5mcmVlX2lub2Rlc19jb3VudCA9IFNXQVBfTEUxNih0ZW1wKTsKKworICAgICAgICAvLyBIb3cgbWFueSBmcmVlIGJsb2NrcyBpbiB0aGlzIGdyb3VwPworICAgICAgICB0ZW1wID0gVFQuaW5vZGVzcGcvKFRULmJsb2Nrc2l6ZS9zaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKSArIDI7CisgICAgICAgIHRlbXAgPSBlbmQtdXNlZC10ZW1wOworICAgICAgICBpZiAodGVtcCA+IHRyZWVibG9ja3MpIHsKKyAgICAgICAgICB0cmVlYmxvY2tzIC09IHRlbXA7CisgICAgICAgICAgdGVtcCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGVtcCAtPSB0cmVlYmxvY2tzOworICAgICAgICAgIHRyZWVibG9ja3MgPSAwOworICAgICAgICB9CisgICAgICAgIGJnW3Nsb3RdLmZyZWVfYmxvY2tzX2NvdW50ID0gU1dBUF9MRTMyKHRlbXApOworCisgICAgICAgIC8vIEZpbGwgb3V0IHJlc3Qgb2YgZ3JvdXAgc3RydWN0dXJlCisgICAgICAgIHVzZWQgKz0gaipUVC5ibG9ja2JpdHM7CisgICAgICAgIGJnW3Nsb3RdLmJsb2NrX2JpdG1hcCA9IFNXQVBfTEUzMih1c2VkKyspOworICAgICAgICBiZ1tzbG90XS5pbm9kZV9iaXRtYXAgPSBTV0FQX0xFMzIodXNlZCsrKTsKKyAgICAgICAgYmdbc2xvdF0uaW5vZGVfdGFibGUgPSBTV0FQX0xFMzIodXNlZCk7CisgICAgICAgIGJnW3Nsb3RdLnVzZWRfZGlyc19jb3VudCA9IDA7ICAvLyAoVE9ETykKKyAgICAgIH0KKyAgICAgIHh3cml0ZShUVC5mc2ZkLCBiZywgVFQuYmxvY2tzaXplKTsKKyAgICB9CisKKyAgICAvLyBOb3cgd3JpdGUgb3V0IHN0dWZmIHRoYXQgZXZlcnkgYmxvY2sgZ3JvdXAgaGFzLgorCisgICAgLy8gV3JpdGUgYmxvY2sgdXNhZ2UgYml0bWFwCisKKyAgICBzdGFydCArPSAyICsgaXRhYmxlOworICAgIG1lbXNldCh0b3lidWYsIDAsIFRULmJsb2Nrc2l6ZSk7CisgICAgYml0c19zZXQodG95YnVmLCAwLCBzdGFydCk7CisgICAgYml0c19zZXQodG95YnVmLCBlbmQsIFRULmJsb2NrYml0cy1lbmQpOworICAgIHRlbXAgPSBUVC50cmVlYmxvY2tzIC0gdXNlZGJsb2NrczsKKyAgICBpZiAodGVtcCkgeworICAgICAgaWYgKGVuZC1zdGFydCA+IHRlbXApIHRlbXAgPSBlbmQtc3RhcnQ7CisgICAgICBiaXRzX3NldCh0b3lidWYsIHN0YXJ0LCB0ZW1wKTsKKyAgICB9CisgICAgeHdyaXRlKFRULmZzZmQsIHRveWJ1ZiwgVFQuYmxvY2tzaXplKTsKKworICAgIC8vIFdyaXRlIGlub2RlIGJpdG1hcAorICAgIG1lbXNldCh0b3lidWYsIDAsIFRULmJsb2Nrc2l6ZSk7CisgICAgaiA9IDA7CisgICAgaWYgKCFpKSBiaXRzX3NldCh0b3lidWYsIDAsIGogPSBJTk9ERVNfUkVTRVJWRUQpOworICAgIGJpdHNfc2V0KHRveWJ1ZiwgVFQuaW5vZGVzcGcsIHNsb3QgPSBUVC5ibG9ja2JpdHMtVFQuaW5vZGVzcGcpOworICAgIHRlbXAgPSBUVC50cmVlaW5vZGVzIC0gdXNlZGlub2RlczsKKyAgICBpZiAodGVtcCkgeworICAgICAgaWYgKHNsb3QtaiA+IHRlbXApIHRlbXAgPSBzbG90LWo7CisgICAgICBiaXRzX3NldCh0b3lidWYsIGosIHRlbXApOworICAgIH0KKyAgICB4d3JpdGUoVFQuZnNmZCwgdG95YnVmLCBUVC5ibG9ja3NpemUpOworCisgICAgLy8gV3JpdGUgaW5vZGUgdGFibGUgZm9yIHRoaXMgZ3JvdXAgKFRPRE8pCisgICAgZm9yIChqID0gMDsgajxUVC5pbm9kZXNwZzsgaisrKSB7CisgICAgICBzbG90ID0gaiAlIChUVC5ibG9ja3NpemUvc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisgICAgICBpZiAoIXNsb3QpIHsKKyAgICAgICAgaWYgKGopIHh3cml0ZShUVC5mc2ZkLCBpbiwgVFQuYmxvY2tzaXplKTsKKyAgICAgICAgbWVtc2V0KGluLCAwLCBUVC5ibG9ja3NpemUpOworICAgICAgfQorICAgICAgaWYgKCFpICYmIGo8SU5PREVTX1JFU0VSVkVEKSB7CisgICAgICAgIC8vIFdyaXRlIHJvb3QgaW5vZGUKKyAgICAgICAgaWYgKGogPT0gMikgZmlsbF9pbm9kZShpbitzbG90LCBkdGIpOworICAgICAgfSBlbHNlIGlmIChkdGkpIHsKKyAgICAgICAgZmlsbF9pbm9kZShpbitzbG90LCBkdGkpOworICAgICAgICBkdGkgPSB0cmVlbmV4dChkdGkpOworICAgICAgfQorICAgIH0KKyAgICB4d3JpdGUoVFQuZnNmZCwgaW4sIFRULmJsb2Nrc2l6ZSk7CisKKyAgICB3aGlsZSAoZHRiKSB7CisgICAgICAvLyBUT0RPIHdyaXRlIGluZGV4IGRhdGEgYmxvY2sKKyAgICAgIC8vIFRPRE8gd3JpdGUgcm9vdCBkaXJlY3RvcnkgZGF0YSBibG9jaworICAgICAgLy8gVE9ETyB3cml0ZSBkaXJlY3RvcnkgZGF0YSBibG9jaworICAgICAgLy8gVE9ETyB3cml0ZSBmaWxlIGRhdGEgYmxvY2sKKyAgICAgIHB1dF96ZXJvZXMoVFQuYmxvY2tzaXplKTsKKyAgICAgIHN0YXJ0Kys7CisgICAgICBpZiAoc3RhcnQgPT0gZW5kKSBicmVhazsKKyAgICB9CisgICAgLy8gV3JpdGUgZGF0YSBibG9ja3MgKFRPRE8pCisgICAgcHV0X3plcm9lcygoZW5kLXN0YXJ0KSAqIFRULmJsb2Nrc2l6ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvbW9kcHJvYmUuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvbW9kcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYxN2EwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9tb2Rwcm9iZS5jCkBAIC0wLDAgKzEsNTY3IEBACisvKiBtb2Rwcm9iZS5jIC0gbW9kcHJvYmUgdXRpbGl0eS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBNYWRodXIgVmVybWEgPG1hZC5mbGV4aUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMyBLeXVuZ3dhbiBIYW4gPGFzdXJhMzIxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZC4KKworVVNFX01PRFBST0JFKE5FV1RPWShtb2Rwcm9iZSwgImFscnF2c0RiIiwgVE9ZRkxBR19TQklOKSkKKworY29uZmlnIE1PRFBST0JFCisgIGJvb2wgIm1vZHByb2JlIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBtb2Rwcm9iZSBbLWFscnF2c0RiXSBNT0RVTEUgW3N5bWJvbD12YWx1ZV1bLi4uXQorCisgICAgbW9kcHJvYmUgdXRpbGl0eSAtIGluc2VydHMgbW9kdWxlcyBhbmQgZGVwZW5kZW5jaWVzLgorCisgICAgLWEgIExvYWQgbXVsdGlwbGUgTU9EVUxFcworICAgIC1sICBMaXN0IChNT0RVTEUgaXMgYSBwYXR0ZXJuKQorICAgIC1yICBSZW1vdmUgTU9EVUxFIChzdGFja3MpIG9yIGRvIGF1dG9jbGVhbgorICAgIC1xICBRdWlldAorICAgIC12ICBWZXJib3NlCisgICAgLXMgIExvZyB0byBzeXNsb2cKKyAgICAtRCAgU2hvdyBkZXBlbmRlbmNpZXMKKyAgICAtYiAgQXBwbHkgYmxhY2tsaXN0IHRvIG1vZHVsZSBuYW1lcyB0b28KKyovCisjZGVmaW5lIEZPUl9tb2Rwcm9iZQorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCitHTE9CQUxTKAorICBzdHJ1Y3QgYXJnX2xpc3QgKnByb2JlczsKKyAgc3RydWN0IGFyZ19saXN0ICpkYmFzZVsyNTZdOworICBjaGFyICpjbWRvcHRzOworICBpbnQgbnVkZXBzOworICB1aW50OF90IHN5bXJlcTsKKyAgdm9pZCAoKmRiZykoY2hhciAqZm9ybWF0LCAuLi4pOworKQorCisvKiBOb3RlOiBpZiAiI2RlZmluZSBEQkFTRV9TSVpFIiBtb2RpZmllZCwgCisgKiBQbGVhc2UgdXBkYXRlIEdMT0JBTFMgZGJhc2VbMjU2XSBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBEQkFTRV9TSVpFICAyNTYKKyNkZWZpbmUgTU9ETkFNRV9MRU4gMjU2CisKKy8vIE1vZHVsZXMgZmxhZyBkZWZpbmF0aW9ucworI2RlZmluZSBNT0RfQUxPQURFRCAgIDB4MDAwMQorI2RlZmluZSBNT0RfQkxBQ0tMSVNUIDB4MDAwMgorI2RlZmluZSBNT0RfRk5EREVQTU9EIDB4MDAwNAorI2RlZmluZSBNT0RfTkRERVBTICAgIDB4MDAwOAorCisvLyBkdW1teSBpbnRlcmZhY2UgZm9yIGRlYnVnZ2luZy4KK3N0YXRpYyB2b2lkIGR1bW15KGNoYXIgKmZvcm1hdCwgLi4uKQoreworfQorCisvLyBDdXJyZW50IHByb2JpbmcgbW9kdWxlcyBpbmZvCitzdHJ1Y3QgbW9kdWxlX3MgeworICB1aW50MzJfdCBmbGFnczsKKyAgY2hhciAqY21kbmFtZSwgKm5hbWUsICpkZXBlbnQsICpvcHRzOworICBzdHJ1Y3QgYXJnX2xpc3QgKnJuYW1lcywgKmRlcDsKK307CisKKy8vIENvbnZlcnRzIHBhdGggbmFtZSBGSUxFIHRvIG1vZHVsZSBuYW1lLgorc3RhdGljIGNoYXIgKnBhdGgybW9kKGNoYXIgKmZpbGUsIGNoYXIgKm1vZCkKK3sKKyAgaW50IGk7CisgIGNoYXIgKmZyb207CisKKyAgaWYgKCFmaWxlKSByZXR1cm4gTlVMTDsKKyAgaWYgKCFtb2QpIG1vZCA9IHhtYWxsb2MoTU9ETkFNRV9MRU4pOworCQorICBmcm9tID0gZ2V0YmFzZW5hbWUoZmlsZSk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgKE1PRE5BTUVfTEVOLTEpICYmIGZyb21baV0gJiYgZnJvbVtpXSAhPSAnLic7IGkrKykKKyAgICBtb2RbaV0gPSAoZnJvbVtpXSA9PSAnLScpID8gJ18nIDogZnJvbVtpXTsKKyAgbW9kW2ldID0gJ1wwJzsKKyAgcmV0dXJuIG1vZDsKK30KKworLy8gQWRkIG9wdGlvbnMgaW4gb3B0cyBmcm9tIHRvYWRkLgorc3RhdGljIGNoYXIgKmFkZF9vcHRzKGNoYXIgKm9wdHMsIGNoYXIgKnRvYWRkKQoreworICBpZiAodG9hZGQpIHsKKyAgICBpbnQgb3B0bGVuID0gMDsKKworICAgIGlmIChvcHRzKSBvcHRsZW4gPSBzdHJsZW4ob3B0cyk7CisgICAgb3B0cyA9IHhyZWFsbG9jKG9wdHMsIG9wdGxlbiArIHN0cmxlbih0b2FkZCkgKyAyKTsKKyAgICBzcHJpbnRmKG9wdHMgKyBvcHRsZW4sICIgJXMiLCB0b2FkZCk7CisgIH0KKyAgcmV0dXJuIG9wdHM7Cit9CisKKy8vIFJlbW92ZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGxpc3QgYW5kIHJldHVybiBpdC4KK3N0YXRpYyB2b2lkICpsbGlzdF9wb3BtZShzdHJ1Y3QgYXJnX2xpc3QgKipoZWFkKQoreworICBjaGFyICpkYXRhID0gTlVMTDsKKyAgc3RydWN0IGFyZ19saXN0ICp0ZW1wID0gKmhlYWQ7CisKKyAgaWYgKHRlbXApIHsKKyAgICBkYXRhID0gdGVtcC0+YXJnOworICAgICpoZWFkID0gdGVtcC0+bmV4dDsKKyAgICBmcmVlKHRlbXApOworICB9CisgIHJldHVybiBkYXRhOworfQorCisvLyBBZGQgbmV3IG5vZGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KK3N0YXRpYyB2b2lkIGxsaXN0X2FkZChzdHJ1Y3QgYXJnX2xpc3QgKipvbGQsIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBhcmdfbGlzdCAqbmV3ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGFyZ19saXN0KSk7CisKKyAgbmV3LT5hcmcgPSAoY2hhciopZGF0YTsKKyAgbmV3LT5uZXh0ID0gKm9sZDsKKyAgKm9sZCA9IG5ldzsKK30KKworLy8gQWRkIG5ldyBub2RlIGF0IHRhaWwgb2YgbGlzdC4KK3N0YXRpYyB2b2lkIGxsaXN0X2FkZF90YWlsKHN0cnVjdCBhcmdfbGlzdCAqKmhlYWQsIHZvaWQgKmRhdGEpCit7CisgIHdoaWxlICgqaGVhZCkgaGVhZCA9ICYoKmhlYWQpLT5uZXh0OworICAqaGVhZCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpOworICAoKmhlYWQpLT5hcmcgPSAoY2hhciopZGF0YTsKK30KKworLy8gUmV2ZXJzZSBsaXN0IG9yZGVyLgorc3RhdGljIHN0cnVjdCBhcmdfbGlzdCAqbGxpc3RfcmV2KHN0cnVjdCBhcmdfbGlzdCAqbGlzdCkKK3sKKyAgc3RydWN0IGFyZ19saXN0ICpyZXYgPSBOVUxMOworCisgIHdoaWxlIChsaXN0KSB7CisgICAgc3RydWN0IGFyZ19saXN0ICpuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgIGxpc3QtPm5leHQgPSByZXY7CisgICAgcmV2ID0gbGlzdDsKKyAgICBsaXN0ID0gbmV4dDsKKyAgfQorICByZXR1cm4gcmV2OworfQorCisvKgorICogUmV0dXJucyBzdHJ1Y3QgbW9kdWxlX3MgZnJvbSB0aGUgZGF0YSBiYXNlIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqIGlmIGFkZCAtIGNyZWF0ZSBtb2R1bGUgZW50cnksIGFkZCBpdCB0byBkYXRhIGJhc2UgYW5kIHJldHVybiB0aGUgc2FtZSBtb2QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX3MgKmdldF9tb2QoY2hhciAqbW9kLCB1aW50OF90IGFkZCkKK3sKKyAgY2hhciBuYW1lW01PRE5BTUVfTEVOXTsKKyAgc3RydWN0IG1vZHVsZV9zICptb2RlbnRyeTsKKyAgc3RydWN0IGFyZ19saXN0ICp0ZW1wOworICB1bnNpZ25lZCBpLCBoYXNoID0gMDsKKworICBwYXRoMm1vZChtb2QsIG5hbWUpOworICBmb3IgKGkgPSAwOyBuYW1lW2ldOyBpKyspIGhhc2ggPSAoKGhhc2gqMzEpICsgaGFzaCkgKyBuYW1lW2ldOworICBoYXNoICU9IERCQVNFX1NJWkU7CisgIGZvciAodGVtcCA9IFRULmRiYXNlW2hhc2hdOyB0ZW1wOyB0ZW1wID0gdGVtcC0+bmV4dCkgeworICAgIG1vZGVudHJ5ID0gKHN0cnVjdCBtb2R1bGVfcyAqKSB0ZW1wLT5hcmc7CisgICAgaWYgKCFzdHJjbXAobW9kZW50cnktPm5hbWUsIG5hbWUpKSByZXR1cm4gbW9kZW50cnk7CisgIH0KKyAgaWYgKCFhZGQpIHJldHVybiBOVUxMOworICBtb2RlbnRyeSA9IHh6YWxsb2Moc2l6ZW9mKCptb2RlbnRyeSkpOworICBtb2RlbnRyeS0+bmFtZSA9IHhzdHJkdXAobmFtZSk7CisgIGxsaXN0X2FkZCgmVFQuZGJhc2VbaGFzaF0sIG1vZGVudHJ5KTsKKyAgcmV0dXJuIG1vZGVudHJ5OworfQorCisvKgorICogUmVhZCBhIGxpbmUgZnJvbSBmaWxlIHdpdGggXCBjb250aW51YXRpb24gYW5kIGVzY2FwZSBjb21tZW50ZWQgbGluZS4KKyAqIFJldHVybiB0aGUgbGluZSBpbiBhbGxvY2F0ZWQgc3RyaW5nICgqbGkpCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9saW5lKEZJTEUgKmZsLCBjaGFyICoqbGkpCit7CisgIGNoYXIgKm54dGxpbmUgPSBOVUxMLCAqbGluZTsKKyAgaW50IGxlbiwgbnh0bGVuLCBsaW5lbGVuLCBueHRsaW5lbGVuOworCisgIHdoaWxlICgxKSB7CisgICAgbGluZSA9IE5VTEw7CisgICAgbGluZWxlbiA9IG54dGxpbmVsZW4gPSAwOworICAgIGxlbiA9IGdldGxpbmUoJmxpbmUsIChzaXplX3QqKSZsaW5lbGVuLCBmbCk7CisgICAgaWYgKGxlbiA8PSAwKSB7CisgICAgICBmcmVlKGxpbmUpOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgLy8gY2hlY2tpbmcgZm9yIGNvbW1lbnRlZCBsaW5lcy4KKyAgICBpZiAobGluZVswXSAhPSAnIycpIGJyZWFrOworICAgIGZyZWUobGluZSk7CisgIH0KKyAgZm9yICg7OykgeworICAgIGlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpIGxlbi0tOworICAgIGlmICghbGVuKSB7IAorICAgICAgZnJlZShsaW5lKTsKKyAgICAgIHJldHVybiBsZW47CisgICAgfSBlbHNlIGlmIChsaW5lW2xlbiAtIDFdICE9ICdcXCcpIGJyZWFrOworICAgIAorICAgIGxlbi0tOworICAgIG54dGxlbiA9IGdldGxpbmUoJm54dGxpbmUsIChzaXplX3QqKSZueHRsaW5lbGVuLCBmbCk7CisgICAgaWYgKG54dGxlbiA8PSAwKSBicmVhazsKKyAgICBpZiAobGluZWxlbiA8IGxlbiArIG54dGxlbiArIDEpIHsKKyAgICAgIGxpbmVsZW4gPSBsZW4gKyBueHRsZW4gKyAxOworICAgICAgbGluZSA9IHhyZWFsbG9jKGxpbmUsIGxpbmVsZW4pOworICAgIH0KKyAgICBtZW1jcHkoJmxpbmVbbGVuXSwgbnh0bGluZSwgbnh0bGVuKTsKKyAgICBsZW4gKz0gbnh0bGVuOworICB9CisgIGxpbmVbbGVuXSA9ICdcMCc7CisgICpsaSA9IHhzdHJkdXAobGluZSk7CisgIGZyZWUobGluZSk7CisgIGlmIChueHRsaW5lKSBmcmVlKG54dGxpbmUpOworICByZXR1cm4gbGVuOworfQorCisvKgorICogQWN0aW9uIHRvIGJlIHRha2VuIG9uIGFsbCBjb25maWcgZmlsZXMgaW4gZGVmYXVsdCBkaXJlY3RvcmllcworICogY2hlY2tzIGZvciBhbGlhc2VzLCBvcHRpb25zLCBpbnN0YWxsLCByZW1vdmUgYW5kIGJsYWNrbGlzdAorICovCitzdGF0aWMgaW50IGNvbmZpZ19hY3Rpb24oc3RydWN0IGRpcnRyZWUgKm5vZGUpCit7CisgIEZJTEUgKmZjOworICBjaGFyICpmaWxlbmFtZSwgKnRva2Vuc1szXSwgKmxpbmUsICpsaW5lY3A7CisgIHN0cnVjdCBtb2R1bGVfcyAqbW9kZW50OworICBpbnQgdGNvdW50ID0gMDsKKworICBpZiAoIWRpcnRyZWVfbm90ZG90ZG90KG5vZGUpKSByZXR1cm4gMDsKKyAgaWYgKFNfSVNESVIobm9kZS0+c3Quc3RfbW9kZSkpIHJldHVybiBESVJUUkVFX1JFQ1VSU0U7CisKKyAgaWYgKCFTX0lTUkVHKG5vZGUtPnN0LnN0X21vZGUpKSByZXR1cm4gMDsgLy8gcHJvY2VzcyBvbmx5IHJlZ3VsYXIgZmlsZQorICBmaWxlbmFtZSA9IGRpcnRyZWVfcGF0aChub2RlLCBOVUxMKTsKKyAgaWYgKCEoZmMgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkpIHsKKyAgICBmcmVlKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGxpbmUgPSBsaW5lY3AgPSBOVUxMOyByZWFkX2xpbmUoZmMsICZsaW5lKSA+IDA7IAorICAgICAgZnJlZShsaW5lKSwgZnJlZShsaW5lY3ApLCBsaW5lID0gbGluZWNwID0gTlVMTCkgeworICAgIGNoYXIgKnRrID0gTlVMTDsKKworICAgIGlmICghc3RybGVuKGxpbmUpKSBjb250aW51ZTsgCisgICAgbGluZWNwID0geHN0cmR1cChsaW5lKTsKKyAgICBmb3IgKHRrID0gc3RydG9rKGxpbmVjcCwgIiMgXHQiKSwgdGNvdW50ID0gMDsgdGs7CisgICAgICAgIHRrID0gc3RydG9rKE5VTEwsICIjIFx0IiksIHRjb3VudCsrKSB7CisgICAgICB0b2tlbnNbdGNvdW50XSA9IHRrOworICAgICAgaWYgKHRjb3VudCA9PSAyKSB7CisgICAgICAgIHRva2Vuc1syXSA9IGxpbmUgKyBzdHJsZW4odG9rZW5zWzBdKSArIHN0cmxlbih0b2tlbnNbMV0pICsgMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghdGspIGNvbnRpbnVlOyAKKyAgICAvLyBwcm9jZXNzIHRoZSB0b2tlbnNbMF0gY29udGFpbnMgZmlyc3Qgd29yZCBvZiBjb25maWcgbGluZS4KKyAgICBpZiAoIXN0cmNtcCh0b2tlbnNbMF0sICJhbGlhcyIpKSB7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnRlbXA7CisgICAgICBjaGFyIGFsaWFzZVtNT0ROQU1FX0xFTl0sICpyZWFsbmFtZTsKKworICAgICAgaWYgKCF0b2tlbnNbMl0pIGNvbnRpbnVlOworICAgICAgcGF0aDJtb2QodG9rZW5zWzFdLCBhbGlhc2UpOworICAgICAgZm9yICh0ZW1wID0gVFQucHJvYmVzOyB0ZW1wOyB0ZW1wID0gdGVtcC0+bmV4dCkgeworICAgICAgICBtb2RlbnQgPSAoc3RydWN0IG1vZHVsZV9zICopIHRlbXAtPmFyZzsKKyAgICAgICAgaWYgKGZubWF0Y2goYWxpYXNlLCBtb2RlbnQtPm5hbWUsIDApKSBjb250aW51ZTsKKyAgICAgICAgcmVhbG5hbWUgPSBwYXRoMm1vZCh0b2tlbnNbMl0sIE5VTEwpOworICAgICAgICBsbGlzdF9hZGQoJm1vZGVudC0+cm5hbWVzLCByZWFsbmFtZSk7CisgICAgICAgIGlmIChtb2RlbnQtPmZsYWdzICYgTU9EX05EREVQUykgeworICAgICAgICAgIG1vZGVudC0+ZmxhZ3MgJj0gfk1PRF9ORERFUFM7CisgICAgICAgICAgVFQubnVkZXBzLS07CisgICAgICAgIH0KKyAgICAgICAgbW9kZW50ID0gZ2V0X21vZChyZWFsbmFtZSwgMSk7CisgICAgICAgIGlmICghKG1vZGVudC0+ZmxhZ3MgJiBNT0RfTkRERVBTKSkgeworICAgICAgICAgIG1vZGVudC0+ZmxhZ3MgfD0gTU9EX05EREVQUzsKKyAgICAgICAgICBUVC5udWRlcHMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbnNbMF0sICJvcHRpb25zIikpIHsKKyAgICAgIGlmICghdG9rZW5zWzJdKSBjb250aW51ZTsKKyAgICAgIG1vZGVudCA9IGdldF9tb2QodG9rZW5zWzFdLCAxKTsKKyAgICAgIG1vZGVudC0+b3B0cyA9IGFkZF9vcHRzKG1vZGVudC0+b3B0cywgdG9rZW5zWzJdKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW5zWzBdLCAiaW5jbHVkZSIpKQorICAgICAgZGlydHJlZV9yZWFkKHRva2Vuc1sxXSwgY29uZmlnX2FjdGlvbik7CisgICAgZWxzZSBpZiAoIXN0cmNtcCh0b2tlbnNbMF0sICJibGFja2xpc3QiKSkKKyAgICAgIGdldF9tb2QodG9rZW5zWzFdLCAxKS0+ZmxhZ3MgfD0gTU9EX0JMQUNLTElTVDsKKyAgICBlbHNlIGlmICghc3RyY21wKHRva2Vuc1swXSwgImluc3RhbGwiKSkgY29udGludWU7CisgICAgZWxzZSBpZiAoIXN0cmNtcCh0b2tlbnNbMF0sICJyZW1vdmUiKSkgY29udGludWU7CisgICAgZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcSkKKyAgICAgIGVycm9yX21zZygiSW52YWxpZCBvcHRpb24gJXMgZm91bmQgaW4gZmlsZSAlcyIsIHRva2Vuc1swXSwgZmlsZW5hbWUpOworICB9CisgIGZjbG9zZShmYyk7CisgIGZyZWUoZmlsZW5hbWUpOworICByZXR1cm4gMDsKK30KKworLy8gU2hvdyBtYXRjaGVkIG1vZHVsZXMgZWxzZSByZXR1cm4gLTEgb24gZmFpbHVyZS4KK3N0YXRpYyBpbnQgZGVwbW9kZV9yZWFkX2VudHJ5KGNoYXIgKmNtZG5hbWUpCit7CisgIGNoYXIgKmxpbmU7CisgIGludCByZXQgPSAtMTsKKyAgRklMRSAqZmUgPSB4Zm9wZW4oIm1vZHVsZXMuZGVwIiwgInIiKTsKKworICB3aGlsZSAocmVhZF9saW5lKGZlLCAmbGluZSkgPiAwKSB7CisgICAgY2hhciAqdG1wID0gc3RyY2hyKGxpbmUsICc6Jyk7CisKKyAgICBpZiAodG1wKSB7CisgICAgICAqdG1wID0gJ1wwJzsKKyAgICAgY2hhciAqbmFtZSA9IGJhc2VuYW1lKGxpbmUpOworCisgICAgICB0bXAgPSBzdHJjaHIobmFtZSwgJy4nKTsKKyAgICAgIGlmICh0bXApICp0bXAgPSAnXDAnOworICAgICAgaWYgKCFjbWRuYW1lIHx8ICFmbm1hdGNoKGNtZG5hbWUsIG5hbWUsIDApKSB7CisgICAgICAgIGlmICh0bXApICp0bXAgPSAnLic7CisgICAgICAgIFRULmRiZygiJXNcbiIsIGxpbmUpOworICAgICAgICByZXQgPSAwOworICAgICAgfQorICAgIH0KKyAgICBmcmVlKGxpbmUpOworICB9CisgIGZjbG9zZShmZSk7CisgIHJldHVybiByZXQ7Cit9CisKKy8vIEZpbmRzIGRlcGVuZGVuY2llcyBmb3IgbW9kdWxlcyBmcm9tIHRoZSBtb2R1bGVzLmRlcCBmaWxlLgorc3RhdGljIHZvaWQgZmluZF9kZXAodm9pZCkKK3sKKyAgY2hhciAqbGluZSA9IE5VTEw7CisgIHN0cnVjdCBtb2R1bGVfcyAqbW9kOworICBGSUxFICpmZSA9IHhmb3BlbigibW9kdWxlcy5kZXAiLCAiciIpOworCisgIGZvciAoOyByZWFkX2xpbmUoZmUsICZsaW5lKSA+IDA7IGZyZWUobGluZSkpIHsKKyAgICBjaGFyICp0bXAgPSBzdHJjaHIobGluZSwgJzonKTsKKworICAgIGlmICh0bXApIHsKKyAgICAgICp0bXAgPSAnXDAnOworICAgICAgbW9kID0gZ2V0X21vZChsaW5lLCAwKTsKKyAgICAgIGlmICghbW9kKSBjb250aW51ZTsKKyAgICAgIGlmICgobW9kLT5mbGFncyAmIE1PRF9BTE9BREVEKSAmJgorICAgICAgICAgICEodG95cy5vcHRmbGFncyAmIChGTEFHX3IgfCBGTEFHX0QpKSkgY29udGludWU7CisgICAgICAKKyAgICAgIG1vZC0+ZmxhZ3MgfD0gTU9EX0ZORERFUE1PRDsKKyAgICAgIGlmICgobW9kLT5mbGFncyAmIE1PRF9ORERFUFMpICYmICghbW9kLT5kZXApKSB7CisgICAgICAgIFRULm51ZGVwcy0tOworICAgICAgICBsbGlzdF9hZGQoJm1vZC0+ZGVwLCB4c3RyZHVwKGxpbmUpKTsKKyAgICAgICAgdG1wKys7CisgICAgICAgIGlmICgqdG1wKSB7CisgICAgICAgICAgY2hhciAqdG9rOworCisgICAgICAgICAgd2hpbGUgKCh0b2sgPSBzdHJzZXAoJnRtcCwgIiBcdCIpKSkgeworICAgICAgICAgICAgaWYgKCEqdG9rKSBjb250aW51ZTsKKyAgICAgICAgICAgIGxsaXN0X2FkZF90YWlsKCZtb2QtPmRlcCwgeHN0cmR1cCh0b2spKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmNsb3NlKGZlKTsKK30KKworLy8gUmVtb3ZlIGEgbW9kdWxlIGZyb20gdGhlIExpbnV4IEtlcm5lbC4gaWYgIW1vZHVsZXMgZG9lcyBhdXRvIHJlbW92ZS4KK3N0YXRpYyBpbnQgcm1fbW9kKGNoYXIgKm1vZHVsZXMsIHVpbnQzMl90IGZsYWdzKQoreworICBpZiAobW9kdWxlcykgeworICAgIGludCBsZW4gPSBzdHJsZW4obW9kdWxlcyk7CisKKyAgICBpZiAobGVuID4gMyAmJiAhc3RyY21wKG1vZHVsZXMrbGVuLTMsICIua28iICkpIG1vZHVsZXNbbGVuLTNdID0gMDsKKyAgfQorCisgIGVycm5vID0gMDsKKyAgc3lzY2FsbChfX05SX2RlbGV0ZV9tb2R1bGUsIG1vZHVsZXMsIGZsYWdzID8gZmxhZ3MgOiBPX05PTkJMT0NLfE9fRVhDTCk7CisKKyAgcmV0dXJuIGVycm5vOworfQorCisvLyBJbnNlcnQgbW9kdWxlIHNhbWUgYXMgaW5zbW9kIGltcGxlbWVudGF0aW9uLgorc3RhdGljIGludCBpbnNfbW9kKGNoYXIgKm1vZHVsZXMsIGNoYXIgKmZsYWdzKQoreworICBjaGFyICpidWYgPSBOVUxMOworICBpbnQgbGVuLCByZXM7CisgIGludCBmZCA9IHhvcGVucm8obW9kdWxlcyk7CisKKyAgLy8gVE9ETyB4cmVhZGZpbGUoKQorCisgIGxlbiA9IGZkbGVuZ3RoKGZkKTsKKyAgYnVmID0geG1hbGxvYyhsZW4pOworICB4cmVhZGFsbChmZCwgYnVmLCBsZW4pOworICB4Y2xvc2UoZmQpOworCisgIHdoaWxlIChmbGFncyAmJiBzdHJsZW4odG95YnVmKSArIHN0cmxlbihmbGFncykgKyAyIDwgc2l6ZW9mKHRveWJ1ZikpIHsKKyAgICBzdHJjYXQodG95YnVmLCBmbGFncyk7CisgICAgc3RyY2F0KHRveWJ1ZiwgIiAiKTsKKyAgfQorICByZXMgPSBzeXNjYWxsKF9fTlJfaW5pdF9tb2R1bGUsIGJ1ZiwgbGVuLCB0b3lidWYpOworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFICYmIGJ1ZiAhPSB0b3lidWYpIGZyZWUoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworLy8gQWRkIG1vZHVsZSBpbiBwcm9iZXMgbGlzdCwgaWYgbm90IGxvYWRlZC4KK3N0YXRpYyB2b2lkIGFkZF9tb2QoY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IG1vZHVsZV9zICptb2QgPSBnZXRfbW9kKG5hbWUsIDEpOworCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19yIHwgRkxBR19EKSkgJiYgKG1vZC0+ZmxhZ3MgJiBNT0RfQUxPQURFRCkpIHsKKyAgICBUVC5kYmcoInNraXBwaW5nICVzLCBpdCBpcyBhbHJlYWR5IGxvYWRlZFxuIiwgbmFtZSk7CisgICAgcmV0dXJuOworICB9CisgIFRULmRiZygicXVldWluZyAlc1xuIiwgbmFtZSk7CisgIG1vZC0+Y21kbmFtZSA9IG5hbWU7CisgIG1vZC0+ZmxhZ3MgfD0gTU9EX05EREVQUzsKKyAgbGxpc3RfYWRkX3RhaWwoJlRULnByb2JlcywgbW9kKTsKKyAgVFQubnVkZXBzKys7CisgIGlmICghc3RybmNtcChtb2QtPm5hbWUsICJzeW1ib2w6IiwgNykpIFRULnN5bXJlcSA9IDE7Cit9CisKKy8vIFBhcnNlIGNtZGxpbmUgb3B0aW9ucyBzdXBsaWVkIGZvciBtb2R1bGUuCitzdGF0aWMgY2hhciAqYWRkX2NtZG9wdChjaGFyICoqYXJndikKK3sKKyAgY2hhciAqb3B0ID0geHphbGxvYygxKTsKKyAgaW50IGxvcHQgPSAwOworCisgIHdoaWxlICgqKythcmd2KSB7CisgICAgY2hhciAqZm10LCAqdmFyLCAqdmFsOworCisgICAgdmFyID0gKmFyZ3Y7CisgICAgb3B0ID0geHJlYWxsb2Mob3B0LCBsb3B0ICsgMiArIHN0cmxlbih2YXIpICsgMik7CisgICAgLy8gY2hlY2sgZm9yIGtleT12YWwgb3Iga2V5ID0gdmFsLgorICAgIGZtdCA9ICIlLipzJXMgIjsKKyAgICBmb3IgKHZhbCA9IHZhcjsgKnZhbCAmJiAqdmFsICE9ICc9JzsgdmFsKyspOworICAgIGlmICgqdmFsICYmIHN0cmNocigrK3ZhbCwgJyAnKSkgZm10ID0gIiUuKnNcIiVzXCIgIjsKKyAgICBsb3B0ICs9IHNwcmludGYob3B0ICsgbG9wdCwgZm10LCAoaW50KSAodmFsIC0gdmFyKSwgdmFyLCB2YWwpOworICB9CisgIHJldHVybiBvcHQ7Cit9CisKKy8vIFByb2JlcyBhIHNpbmdsZSBtb2R1bGUgYW5kIGxvYWRzIGFsbCBpdHMgZGVwZW5kZW5jaWVzLgorc3RhdGljIGludCBnb19wcm9iZShzdHJ1Y3QgbW9kdWxlX3MgKm0pCit7CisgIGludCByYyA9IDAsIGZpcnN0ID0gMTsKKworICBpZiAoIShtLT5mbGFncyAmIE1PRF9GTkRERVBNT0QpKSB7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfcSkpCisgICAgICBlcnJvcl9tc2coIm1vZHVsZSAlcyBub3QgZm91bmQgaW4gbW9kdWxlcy5kZXAiLCBtLT5uYW1lKTsKKyAgICByZXR1cm4gLUVOT0VOVDsKKyAgfQorICBUVC5kYmcoImdvX3Byb2InaW5nICVzXG4iLCBtLT5uYW1lKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfcikpIG0tPmRlcCA9IGxsaXN0X3JldihtLT5kZXApOworICAKKyAgd2hpbGUgKG0tPmRlcCkgeworICAgIHN0cnVjdCBtb2R1bGVfcyAqbTI7CisgICAgY2hhciAqZm4sICpvcHRpb25zOworCisgICAgcmMgPSAwOworICAgIGZuID0gbGxpc3RfcG9wbWUoJm0tPmRlcCk7CisgICAgbTIgPSBnZXRfbW9kKGZuLCAxKTsKKyAgICAvLyBhcmUgd2UgcmVtb3ZpbmcgPworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19yKSB7CisgICAgICBpZiAobTItPmZsYWdzICYgTU9EX0FMT0FERUQpIHsKKyAgICAgICAgaWYgKChyYyA9IHJtX21vZChtMi0+bmFtZSwgT19FWENMKSkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIHBlcnJvcl9tc2coImNhbid0IHVubG9hZCBtb2R1bGUgJXMiLCBtMi0+bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBtMi0+ZmxhZ3MgJj0gfk1PRF9BTE9BREVEOworICAgICAgfQorICAgICAgZmlyc3QgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIG9wdGlvbnMgPSBtMi0+b3B0czsKKyAgICBtMi0+b3B0cyA9IE5VTEw7CisgICAgaWYgKG0gPT0gbTIpIG9wdGlvbnMgPSBhZGRfb3B0cyhvcHRpb25zLCBUVC5jbWRvcHRzKTsKKworICAgIC8vIGFyZSB3ZSBvbmx5IGNoZWNraW5nIGRlcGVuZGVuY2llcyA/CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpIHsKKyAgICAgIFRULmRiZyhvcHRpb25zID8gImluc21vZCAlcyAlc1xuIiA6ICJpbnNtb2QgJXNcbiIsIGZuLCBvcHRpb25zKTsKKyAgICAgIGlmIChvcHRpb25zKSBmcmVlKG9wdGlvbnMpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChtMi0+ZmxhZ3MgJiBNT0RfQUxPQURFRCkgeworICAgICAgVFQuZGJnKCIlcyBpcyBhbHJlYWR5IGxvYWRlZCwgc2tpcHBpbmdcbiIsIGZuKTsKKyAgICAgIGlmIChvcHRpb25zKSBmcmVlKG9wdGlvbnMpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIG5vbmUgb2YgYWJvdmUgaXMgdHJ1ZSBpbnNlcnQgdGhlIG1vZHVsZS4KKyAgICByYyA9IGluc19tb2QoZm4sIG9wdGlvbnMpOworICAgIFRULmRiZygibG9hZGVkICVzICclcycsIHJjOiVkXG4iLCBmbiwgb3B0aW9ucywgcmMpOworICAgIGlmIChyYyA9PSBFRVhJU1QpIHJjID0gMDsKKyAgICBpZiAob3B0aW9ucykgZnJlZShvcHRpb25zKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIHBlcnJvcl9tc2coImNhbid0IGxvYWQgbW9kdWxlICVzICglcykiLCBtMi0+bmFtZSwgZm4pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIG0yLT5mbGFncyB8PSBNT0RfQUxPQURFRDsKKyAgfQorICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgbW9kcHJvYmVfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgdXRzbmFtZSB1dHM7CisgIGNoYXIgKiphcmd2ID0gdG95cy5vcHRhcmdzLCAqcHJvY2xpbmUgPSBOVUxMOworICBGSUxFICpmczsKKyAgc3RydWN0IG1vZHVsZV9zICptb2R1bGU7CisgIHVuc2lnbmVkIGZsYWdzID0gdG95cy5vcHRmbGFnczsKKworICBUVC5kYmcgPSAoZmxhZ3MgJiBGTEFHX3YpID8geHByaW50ZiA6IGR1bW15OworCisgIGlmICgodG95cy5vcHRjIDwgMSkgJiYgKCgoZmxhZ3MgJiBGTEFHX3IpICYmIChmbGFncyAmIEZMQUdfbCkpCisgICAgICAgIHx8KCEoKGZsYWdzICYgRkxBR19yKXx8KGZsYWdzICYgRkxBR19sKSkpKSkKKyAgeworCSAgaGVscF9leGl0KCJiYWQgc3ludGF4Iik7CisgIH0KKyAgLy8gQ2hlY2sgZm9yIC1yIGZsYWcgd2l0aG91dCBhcmcgaWYgeWVzIHRoZW4gZG8gYXV0byByZW1vdmUuCisgIGlmICgoZmxhZ3MgJiBGTEFHX3IpICYmICF0b3lzLm9wdGMpIHsKKyAgICBpZiAocm1fbW9kKE5VTEwsIE9fTk9OQkxPQ0sgfCBPX0VYQ0wpKSBwZXJyb3JfZXhpdCgicm1tb2QiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBjaGFuZ2UgZGlyZWN0b3J5IHRvIC9saWIvbW9kdWxlcy88cmVsZWFzZT4vIAorICB4Y2hkaXIoIi9saWIvbW9kdWxlcyIpOworICB1bmFtZSgmdXRzKTsKKyAgeGNoZGlyKHV0cy5yZWxlYXNlKTsKKworICAvLyBtb2R1bGVzLmRlcCBwcm9jZXNzaW5nIGZvciBkZXBlbmRlbmN5IGNoZWNrLgorICBpZiAoZmxhZ3MgJiBGTEFHX2wpIHsKKyAgICBpZiAoZGVwbW9kZV9yZWFkX2VudHJ5KHRveXMub3B0YXJnc1swXSkpIGVycm9yX2V4aXQoIm5vIG1vZHVsZSBmb3VuZC4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gUmVhZCAvcHJvYy9tb2R1bGVzIHRvIGdldCBsb2FkZWQgbW9kdWxlcy4KKyAgZnMgPSB4Zm9wZW4oIi9wcm9jL21vZHVsZXMiLCAiciIpOworICAKKyAgd2hpbGUgKHJlYWRfbGluZShmcywgJnByb2NsaW5lKSA+IDApIHsKKyAgICAqKHN0cmNocihwcm9jbGluZSwgJyAnKSkgPSAnXDAnOworICAgIGdldF9tb2QocHJvY2xpbmUsIDEpLT5mbGFncyA9IE1PRF9BTE9BREVEOworICAgIGZyZWUocHJvY2xpbmUpOworICAgIHByb2NsaW5lID0gTlVMTDsKKyAgfQorICBmY2xvc2UoZnMpOworICBpZiAoKGZsYWdzICYgRkxBR19hKSB8fCAoZmxhZ3MgJiBGTEFHX3IpKSB7CisgICAgZG8geworICAgICAgYWRkX21vZCgqYXJndisrKTsKKyAgICB9IHdoaWxlICgqYXJndik7CisgIH0gZWxzZSB7CisgICAgYWRkX21vZChhcmd2WzBdKTsKKyAgICBUVC5jbWRvcHRzID0gYWRkX2NtZG9wdChhcmd2KTsKKyAgfQorICBpZiAoIVRULnByb2JlcykgeworICAgIFRULmRiZygiQWxsIG1vZHVsZXMgbG9hZGVkXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZGlydHJlZV9yZWFkKCIvZXRjL21vZHByb2JlLmNvbmYiLCBjb25maWdfYWN0aW9uKTsKKyAgZGlydHJlZV9yZWFkKCIvZXRjL21vZHByb2JlLmQiLCBjb25maWdfYWN0aW9uKTsKKyAgaWYgKFRULnN5bXJlcSkgZGlydHJlZV9yZWFkKCJtb2R1bGVzLnN5bWJvbHMiLCBjb25maWdfYWN0aW9uKTsKKyAgaWYgKFRULm51ZGVwcykgZGlydHJlZV9yZWFkKCJtb2R1bGVzLmFsaWFzIiwgY29uZmlnX2FjdGlvbik7CisgIGZpbmRfZGVwKCk7CisgIHdoaWxlICgobW9kdWxlID0gbGxpc3RfcG9wbWUoJlRULnByb2JlcykpKSB7CisgICAgaWYgKCFtb2R1bGUtPnJuYW1lcykgeworICAgICAgVFQuZGJnKCJwcm9iaW5nIGJ5IG1vZHVsZSBuYW1lXG4iKTsKKyAgICAgIC8qIFRoaXMgaXMgbm90IGFuIGFsaWFzLiBMaXRlcmFsIG5hbWVzIGFyZSBibGFja2xpc3RlZAorICAgICAgICogb25seSBpZiAnLWInIGlzIGdpdmVuLgorICAgICAgICovCisgICAgICBpZiAoIShmbGFncyAmIEZMQUdfYikgfHwgIShtb2R1bGUtPmZsYWdzICYgTU9EX0JMQUNLTElTVCkpCisgICAgICAgIGdvX3Byb2JlKG1vZHVsZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZG8geyAvLyBQcm9iZSBhbGwgcmVhbCBuYW1lcyBmb3IgdGhlIGFsaWFzLgorICAgICAgY2hhciAqcmVhbCA9ICgoc3RydWN0IGFyZ19saXN0KilsbGlzdF9wb3AoJm1vZHVsZS0+cm5hbWVzKSktPmFyZzsKKyAgICAgIHN0cnVjdCBtb2R1bGVfcyAqbTIgPSBnZXRfbW9kKHJlYWwsIDApOworICAgICAgCisgICAgICBUVC5kYmcoInByb2JpbmcgYWxpYXMgJXMgYnkgcmVhbG5hbWUgJXNcbiIsIG1vZHVsZS0+bmFtZSwgcmVhbCk7CisgICAgICBpZiAoIW0yKSBjb250aW51ZTsKKyAgICAgIGlmICghKG0yLT5mbGFncyAmIE1PRF9CTEFDS0xJU1QpIAorICAgICAgICAgICYmICghKG0yLT5mbGFncyAmIE1PRF9BTE9BREVEKSB8fCAoZmxhZ3MgJiAoRkxBR19yIHwgRkxBR19EKSkpKQorICAgICAgICBnb19wcm9iZShtMik7CisgICAgICBmcmVlKHJlYWwpOworICAgIH0gd2hpbGUgKG1vZHVsZS0+cm5hbWVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy9tb3JlLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL21vcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIzZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9tb3JlLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qIG1vcmUuYyAtIFZpZXcgRklMRSAob3Igc3RkaW4pIG9uZSBzY3JlZW5mdWwgYXQgYSB0aW1lLgorICoKKyAqIENvcHlyaWdodCAyMDEzIEJpbGFsIFF1cmVzaGkgPGJpbGFsLmptaUBnbWFpbC5jb20+CisgKgorICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL21vcmUuaHRtbAorCitVU0VfTU9SRShORVdUT1kobW9yZSwgMCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTU9SRQorICBib29sICJtb3JlIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiBtb3JlIFtGSUxFLi4uXQorCisgICAgVmlldyBGSUxFKHMpIChvciBzdGRpbikgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWUuCisqLworCisjZGVmaW5lIEZPUl9tb3JlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBzdHJ1Y3QgdGVybWlvcyBpbmY7CisgIGludCBjaW5fZmQ7CispCisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisgIC8vIFJlc2V0IHRoZSB0ZXJtaW5hbCB3aGV0aGVyIHdlIHdlcmUgc2lnbmFsbGVkIG9yIGV4aXRlZCBub3JtYWxseS4KKyAgdGNzZXRhdHRyKFRULmNpbl9mZCwgVENTQU5PVywgJlRULmluZik7CisKKyAgaWYgKHNpZyA9PSAwKSBfZXhpdCgwKTsKKworICAvLyBXZSB3ZXJlIGFjdHVhbGx5IHNpZ25hbGxlZCwgc28gbW92ZSB0byBhIG5ldyBsaW5lIGFuZCByZS1yYWlzZSB0aGUgc2lnbmFsLgorICB4cHV0YygnXG4nKTsKKyAgc2lnbmFsKHNpZywgU0lHX0RGTCk7CisgIHJhaXNlKHNpZyk7CisgIF9leGl0KHNpZyB8IDEyOCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZmlsZV9oZWFkZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcHJpbnRmKCI6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OlxuJXNcbjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6XG4iLCBuYW1lKTsKK30KKworc3RhdGljIGludCBwcm9tcHQoRklMRSAqY2luLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKyAgaW50IGlucHV0X2tleTsKKyAgdmFfbGlzdCBhcDsKKworICBwcmludGYoIlwzM1s3bSIpOyAvLyBSZXZlcnNlIHZpZGVvIGJlZm9yZSBwcmludGluZyB0aGUgcHJvbXB0LgorCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICB2ZnByaW50ZihzdGRvdXQsIGZtdCwgYXApOworICB2YV9lbmQoYXApOworCisgIHdoaWxlICgxKSB7CisgICAgZmZsdXNoKE5VTEwpOworICAgIGlucHV0X2tleSA9IHRvbG93ZXIoZ2V0YyhjaW4pKTsKKyAgICBwcmludGYoIlwzM1swbVwzM1sxS1xyIik7IC8vIFJlc2V0IGFsbCBhdHRyaWJ1dGVzLCBlcmFzZSB0byBzdGFydCBvZiBsaW5lLgorICAgIGlmIChzdHJjaHIoIiBcbnJxIiwgaW5wdXRfa2V5KSkgeworICAgICAgZmZsdXNoKE5VTEwpOworICAgICAgcmV0dXJuIGlucHV0X2tleTsKKyAgICB9CisgICAgcHJpbnRmKCJcMzNbN20oRW50ZXI6TmV4dCBsaW5lIFNwYWNlOk5leHQgcGFnZSBROlF1aXQgUjpTaG93IHRoZSByZXN0KSIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhdF9vcGVyYXRpb24oaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpZiAodG95cy5vcHRjID4gMSkgc2hvd19maWxlX2hlYWRlcihuYW1lKTsKKyAgeHNlbmRmaWxlKGZkLCAxKTsKK30KKwordm9pZCBtb3JlX21haW4oKQoreworICBpbnQgY2gsIGlucHV0X2tleSA9IDAsIHNob3dfcHJvbXB0OworICB1bnNpZ25lZCByb3dzID0gMjQsIGNvbHMgPSA4MCwgcm93ID0gMCwgY29sID0gMDsKKyAgc3RydWN0IHN0YXQgc3Q7ICAKKyAgc3RydWN0IHRlcm1pb3MgbmV3ZjsKKyAgRklMRSAqZnAsICpjaW47CisKKyAgaWYgKCFpc2F0dHkoMSkgfHwgIShjaW4gPSBmb3BlbigiL2Rldi90dHkiLCAiciIpKSkgeworICAgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX2NhdF9vcGVyYXRpb24pOworICAgIHJldHVybjsKKyAgfQorCisgIFRULmNpbl9mZCA9IGZpbGVubyhjaW4pOworICB0Y2dldGF0dHIoVFQuY2luX2ZkLCAmVFQuaW5mKTsKKworICAvL1ByZXBhcmUgdGVybWluYWwgZm9yIGlucHV0CisgIG1lbWNweSgmbmV3ZiwgJlRULmluZiwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisgIG5ld2YuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworICBuZXdmLmNfY2NbVk1JTl0gPSAxOworICBuZXdmLmNfY2NbVlRJTUVdID0gMDsKKyAgdGNzZXRhdHRyKFRULmNpbl9mZCwgVENTQU5PVywgJm5ld2YpOworCisgIHNpZ2F0ZXhpdChzaWduYWxfaGFuZGxlcik7CisKKyAgZG8geworICAgIGZwID0gc3RkaW47CisgICAgaWYgKCp0b3lzLm9wdGFyZ3MgJiYgIShmcCA9IGZvcGVuKCp0b3lzLm9wdGFyZ3MsICJyIikpKSB7CisgICAgICAgIHBlcnJvcl9tc2coIiVzIiwgKnRveXMub3B0YXJncyk7CisgICAgICAgIGdvdG8gbmV4dF9maWxlOworICAgIH0KKyAgICBzdC5zdF9zaXplID0gc2hvd19wcm9tcHQgPSBjb2wgPSByb3cgPSAwOworICAgIGZzdGF0KGZpbGVubyhmcCksICZzdCk7CisgICAgdGVybWluYWxfc2l6ZSgmY29scywgJnJvd3MpOworICAgIHJvd3MtLTsKKworICAgIGlmICh0b3lzLm9wdGMgPiAxKSB7CisgICAgICBzaG93X2ZpbGVfaGVhZGVyKCp0b3lzLm9wdGFyZ3MpOworICAgICAgcm93ICs9IDM7CisgICAgfQorCisgICAgd2hpbGUgKChjaCA9IGdldGMoZnApKSAhPSBFT0YpIHsKKyAgICAgIGlmIChpbnB1dF9rZXkgIT0gJ3InICYmIHNob3dfcHJvbXB0KSB7CisgICAgICAgIGlmIChzdC5zdF9zaXplKQorICAgICAgICAgIGlucHV0X2tleSA9IHByb21wdChjaW4sICItLU1vcmUtLSglZCUlIG9mICVsbGQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgKGludCkgKDEwMCAqICggKGRvdWJsZSkgZnRlbGwoZnApIC8gKGRvdWJsZSkgc3Quc3Rfc2l6ZSkpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKXN0LnN0X3NpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgaW5wdXRfa2V5ID0gcHJvbXB0KGNpbiwgIi0tTW9yZS0tIik7CisgICAgICAgIGlmIChpbnB1dF9rZXkgPT0gJ3EnKSBnb3RvIHN0b3A7IAorCisgICAgICAgIGNvbCA9IHJvdyA9IHNob3dfcHJvbXB0ID0gMDsKKyAgICAgICAgdGVybWluYWxfc2l6ZSgmY29scywgJnJvd3MpOworICAgICAgICByb3dzLS07CisgICAgICB9CisKKyAgICAgIHB1dGNoYXIoY2gpOworICAgICAgaWYgKGNoID09ICdcdCcpIGNvbCA9IChjb2wgfCAweDcpICsgMTsKKyAgICAgIGVsc2UgY29sKys7CisgICAgICBpZiAoY29sID09IGNvbHMpIHB1dGNoYXIoY2ggPSAnXG4nKTsKKyAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgIGlmICgrK3JvdyA+PSByb3dzIHx8IGlucHV0X2tleSA9PSAnXG4nKSBzaG93X3Byb21wdCA9IDE7CisgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmcCk7CisKK25leHRfZmlsZToKKyAgICBpZiAoKnRveXMub3B0YXJncyAmJiAqKyt0b3lzLm9wdGFyZ3MpIHsKKyAgICAgIGlucHV0X2tleSA9IHByb21wdChjaW4sICItLU1vcmUtLShOZXh0IGZpbGU6ICVzKSIsICp0b3lzLm9wdGFyZ3MpOworICAgICAgaWYgKGlucHV0X2tleSA9PSAncScpIGdvdG8gc3RvcDsKKyAgICB9CisgIH0gd2hpbGUgKCp0b3lzLm9wdGFyZ3MpOworCitzdG9wOgorICB0Y3NldGF0dHIoVFQuY2luX2ZkLCBUQ1NBTk9XLCAmVFQuaW5mKTsKKyAgZmNsb3NlKGNpbik7CisgIC8vIEV2ZW4gaWYgb3B0YXJnIG5vdCBmb3VuZCwgZXhpdCB2YWx1ZSBzdGlsbCAwCisgIHRveXMuZXhpdHZhbCA9IDA7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL29wZW52dC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9vcGVudnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY4YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy9vcGVudnQuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogb3BlbnZ0LmMgLSBSdW4gYSBwcm9ncmFtIG9uIGEgbmV3IFZUCisgKgorICogQ29weXJpZ2h0IDIwMTQgVml2ZWsgS3VtYXIgQmhhZ2F0IDx2aXZlay5iaGFnYXQ4OUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQKKworVVNFX09QRU5WVChORVdUT1kob3BlbnZ0LCAiYyM8MT42M3N3IiwgVE9ZRkxBR19CSU58VE9ZRkxBR19ORUVEUk9PVCkpCitVU0VfREVBTExPQ1ZUKE5FV1RPWShkZWFsbG9jdnQsICI+MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTkVFRFJPT1QpKQorCitjb25maWcgT1BFTlZUCisgIGJvb2wgIm9wZW52dCIKKyAgZGVmYXVsdCBuCisgIGRlcGVuZHMgb24gVE9ZQk9YX0ZPUksKKyAgaGVscAorICAgIHVzYWdlOiBvcGVudnQgWy1jIE5dIFstc3ddIFtjb21tYW5kIFtjb21tYW5kX29wdGlvbnNdXQorCisgICAgc3RhcnQgYSBwcm9ncmFtIG9uIGEgbmV3IHZpcnR1YWwgdGVybWluYWwgKFZUKQorCisgICAgLWMgTiAgVXNlIFZUIE4KKyAgICAtcyAgICBTd2l0Y2ggdG8gbmV3IFZUCisgICAgLXcgICAgV2FpdCBmb3IgY29tbWFuZCB0byBleGl0CisKKyAgICBpZiAtc3cgdXNlZCB0b2dldGhlciwgc3dpdGNoIGJhY2sgdG8gb3JpZ2luYXRpbmcgVlQgd2hlbiBjb21tYW5kIGNvbXBsZXRlcworCitjb25maWcgREVBTExPQ1ZUCisgIGJvb2wgImRlYWxsb2N2dCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogZGVhbGxvY3Z0IFtOXQorCisgICAgRGVhbGxvY2F0ZSB1bnVzZWQgdmlydHVhbCB0ZXJtaW5hbCAvZGV2L3R0eU4sIG9yIGFsbCB1bnVzZWQgY29uc29sZXMuCisqLworCisjZGVmaW5lIEZPUl9vcGVudnQKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCitHTE9CQUxTKAorICB1bnNpZ25lZCBsb25nIHZ0X251bTsKKykKKworaW50IG9wZW5fY29uc29sZSh2b2lkKQoreworICBjaGFyIGFyZywgKmNvbnNvbGVfbmFtZVtdID0geyIvZGV2L3R0eSIsICIvZGV2L3R0eTAiLCAiL2Rldi9jb25zb2xlIn07CisgIGludCBpLCBmZDsKKworICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfTEVOKGNvbnNvbGVfbmFtZSk7IGkrKykgeworICAgIGZkID0gb3Blbihjb25zb2xlX25hbWVbaV0sIE9fUkRXUik7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgIGFyZyA9IDA7CisgICAgICBpZiAoIWlvY3RsKGZkLCBLREdLQlRZUEUsICZhcmcpKSByZXR1cm4gZmQ7CisgICAgICBjbG9zZShmZCk7CisgICAgfQorICB9CisKKyAgLyogY2hlY2sgc3RkIGZkIDAsIDEgYW5kIDIgKi8KKyAgZm9yIChmZCA9IDA7IGZkIDwgMzsgZmQrKykgeworICAgIGFyZyA9IDA7CisgICAgaWYgKDAgPT0gaW9jdGwoZmQsIEtER0tCVFlQRSwgJmFyZykpIHJldHVybiBmZDsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworaW50IHh2dG51bShpbnQgZmQpCit7CisgIGludCByZXQ7CisKKyAgcmV0ID0gaW9jdGwoZmQsIFZUX09QRU5RUlksIChpbnQgKikmVFQudnRfbnVtKTsKKyAgaWYgKHJldCAhPSAwIHx8IFRULnZ0X251bSA8PSAwKSBwZXJyb3JfZXhpdCgiY2FuJ3QgZmluZCBvcGVuIFZUIik7CisKKyAgcmV0dXJuIFRULnZ0X251bTsKK30KKwordm9pZCBvcGVudnRfbWFpbih2b2lkKQoreworICBpbnQgZmQsIHZ0X2ZkLCByZXQgPSAwOworICBzdHJ1Y3QgdnRfc3RhdCB2c3RhdGU7CisgIHBpZF90IHBpZDsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSkgeworICAgIC8vIGNoZWNrIGlmIGZkIDAsMSBvciAyIGlzIGFscmVhZHkgb3BlbmVkCisgICAgZm9yIChmZCA9IDA7IGZkIDwgMzsgZmQrKykKKyAgICAgIGlmICghaW9jdGwoZmQsIFZUX0dFVFNUQVRFLCAmdnN0YXRlKSkgeworICAgICAgICByZXQgPSB4dnRudW0oZmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIC8vIGZpbmQgVlQgbnVtYmVyIHVzaW5nIC9kZXYvY29uc29sZQorICAgIGlmICghcmV0KSB7CisgICAgICBmZCA9IHhvcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworICAgICAgeGlvY3RsKGZkLCBWVF9HRVRTVEFURSwgJnZzdGF0ZSk7CisgICAgICB4dnRudW0oZmQpOworICAgIH0KKyAgfQorCisgIHNwcmludGYodG95YnVmLCAiL2Rldi90dHklbHUiLCBUVC52dF9udW0pOworICBmZCA9IG9wZW5fY29uc29sZSgpOworICB4aW9jdGwoZmQsIFZUX0dFVFNUQVRFLCAmdnN0YXRlKTsKKworICBjbG9zZSgwKTsgIC8vbmV3IHZ0IGJlY29tZXMgc3RkaW4KKyAgdnRfZmQgPSB4b3Blbl9zdGRpbyh0b3lidWYsIE9fUkRXUik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSB7CisgICAgaW9jdGwodnRfZmQsIFZUX0FDVElWQVRFLCBUVC52dF9udW0pOworICAgIGlvY3RsKHZ0X2ZkLCBWVF9XQUlUQUNUSVZFLCBUVC52dF9udW0pOworICB9CisKKyAgY2xvc2UoMSk7CisgIGNsb3NlKDIpOworICBkdXAyKHZ0X2ZkLCAxKTsKKyAgZHVwMih2dF9mZCwgMik7CisgIHdoaWxlICh2dF9mZCA+IDIpCisgICAgY2xvc2UodnRfZmQtLSk7CisKKyAgcGlkID0geGZvcmsoKTsKKyAgaWYgKCFwaWQpIHsKKyAgICBzZXRzaWQoKTsKKyAgICBpb2N0bCh2dF9mZCwgVElPQ1NDVFRZLCAwKTsKKyAgICB4ZXhlYyh0b3lzLm9wdGFyZ3MpOworICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpIHsKKyAgICB3aGlsZSAoLTEgPT0gd2FpdHBpZChwaWQsIE5VTEwsIDApICYmIGVycm5vID09IEVJTlRSKQorICAgICAgOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSB7CisgICAgICBpb2N0bChmZCwgVlRfQUNUSVZBVEUsIHZzdGF0ZS52X2FjdGl2ZSk7CisgICAgICBpb2N0bChmZCwgVlRfV0FJVEFDVElWRSwgdnN0YXRlLnZfYWN0aXZlKTsKKyAgICAgIC8vY2hlY2sgd2h5IGRlYWxsb2NhdGUgaXNuJ3Qgd29ya2luZyBoZXJlCisgICAgICB4aW9jdGwoZmQsIFZUX0RJU0FMTE9DQVRFLCAodm9pZCAqKShwdHJkaWZmX3QpVFQudnRfbnVtKTsgCisgICAgfQorICB9Cit9CisKK3ZvaWQgZGVhbGxvY3Z0X21haW4odm9pZCkKK3sKKyAgbG9uZyB2dF9udW0gPSAwOyAvLyAwIGRlYWxsb2NhdGVzIGFsbCB1bnVzZWQgY29uc29sZXMKKyAgaW50IGZkOworCisgIGlmICgqdG95cy5vcHRhcmdzKSB2dF9udW0gPSBhdG9seF9yYW5nZSgqdG95cy5vcHRhcmdzLCAxLCA2Myk7CisKKyAgaWYgKChmZCA9IG9wZW5fY29uc29sZSgpKSA8IDApIGVycm9yX2V4aXQoImNhbid0IG9wZW4gY29uc29sZSIpOworICB4aW9jdGwoZmQsIFZUX0RJU0FMTE9DQVRFLCAodm9pZCAqKXZ0X251bSk7CisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvcGluZy5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5Zjk4YgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvcGluZy5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiBwaW5nLmMgLSBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpdml0eQorICoKKyAqIENvcHlyaWdodCAyMDE0IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTm90IGluIFNVU3Y0LgorIAorVVNFX1BJTkcoTkVXVE9ZKHBpbmcsICI8MT4xdCM8MD4yNTVjIzwwcyM8MD42NTUzNUk6VyM8MHcjPDBxNDZbLTQ2XSIsIFRPWUZMQUdfUk9PVE9OTFl8VE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorIAorY29uZmlnIFBJTkcKKyAgYm9vbCAicGluZyIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogcGluZyBbT1BUSU9OU10gSE9TVAorCisgICAgQ2hlY2sgbmV0d29yayBjb25uZWN0aXZpdHkgYnkgc2VuZGluZyBwYWNrZXRzIHRvIGEgaG9zdCBhbmQgcmVwb3J0aW5nCisgICAgaXRzIHJlc3BvbnNlLgorCisgICAgU2VuZCBJQ01QIEVDSE9fUkVRVUVTVCBwYWNrZXRzIHRvIGlwdjQgb3IgaXB2NiBhZGRyZXNzZXMgYW5kIHByaW50cyBlYWNoCisgICAgZWNobyBpdCByZWNlaXZlcyBiYWNrLCB3aXRoIHJvdW5kIHRyaXAgdGltZS4KKworICAgIE9wdGlvbnM6CisgICAgLTQsIC02ICAgICAgRm9yY2UgSVB2NCBvciBJUHY2CisgICAgLWMgQ05UICAgICAgU2VuZCBDTlQgbWFueSBwYWNrZXRzCisgICAgLUkgSUZBQ0UvSVAgU291cmNlIGludGVyZmFjZSBvciBhZGRyZXNzCisgICAgLXEgICAgICAgICAgUXVpZXQsIG9ubHkgZGlzcGxheXMgb3V0cHV0IGF0IHN0YXJ0IGFuZCB3aGVuIGZpbmlzaGVkCisgICAgLXMgU0laRSAgICAgUGFja2V0IFNJWkUgaW4gYnl0ZXMgKGRlZmF1bHQgNTYpCisgICAgLXQgVFRMICAgICAgU2V0IFRpbWUgKG51bWJlciBvZiBob3BzKSBUbyBMaXZlCisgICAgLVcgU0VDICAgICAgU2Vjb25kcyB0byB3YWl0IGZvciByZXNwb25zZSBhZnRlciBhbGwgcGFja2V0cyBzZW50IChkZWZhdWx0IDEwKQorICAgIC13IFNFQyAgICAgIEV4aXQgYWZ0ZXIgdGhpcyBtYW55IHNlY29uZHMKKyovCisKKyNkZWZpbmUgRk9SX3BpbmcgCisjaW5jbHVkZSAidG95cy5oIgorCisjaW5jbHVkZSA8aWZhZGRycy5oPgorCitHTE9CQUxTKAorICBsb25nIHdhaXRfZXhpdDsKKyAgbG9uZyB3YWl0X3Jlc3A7CisgIGNoYXIgKmlmYWNlOworICBsb25nIHNpemU7CisgIGxvbmcgY291bnQ7CisgIGxvbmcgdHRsOworCisgIGludCBzb2NrOworKQorCit2b2lkIHBpbmdfbWFpbih2b2lkKQoreworICBpbnQgZmFtaWx5LCBwcm90b2NvbDsKKyAgdW5pb24geworICAgIHN0cnVjdCBpbl9hZGRyIGluOworICAgIHN0cnVjdCBpbjZfYWRkciBpbjY7CisgIH0gc3JjX2FkZHI7CisgIGNoYXIgKmhvc3QgPSAwOworCisgIC8vIERldGVybWluZSBJUHY0IHZzIElQdjYgdHlwZQorCisgIGlmKCEodG95cy5vcHRmbGFncyAmIChGTEFHXzR8RkxBR182KSkpIHsKKy8vIHRvZG8gZ2V0YWRkcmluZm8gaW5zdGVhZD8KKyAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCB0b3lzLm9wdGFyZ3NbMF0sICh2b2lkKikmc3JjX2FkZHIpKQorICAgICAgdG95cy5vcHRmbGFncyB8PSBGTEFHXzY7CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfNikgeworICAgIGZhbWlseSA9IEFGX0lORVQ2OworICAgIHByb3RvY29sID0gSVBQUk9UT19JQ01QVjY7CisgIH0gZWxzZSB7CisgICAgZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBwcm90b2NvbCA9IElQUFJPVE9fSUNNUDsKKyAgfQorCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpKSBUVC5zaXplID0gNTY7IC8vIDY0LVBIRFJfTEVOCisKKyAgaWYgKFRULmlmYWNlKSB7CisgICAgbWVtc2V0KCZzcmNfYWRkciwgMCwgc2l6ZW9mKHNyY19hZGRyKSk7CisKKyAgICAvLyBJUCBhZGRyZXNzPworICAgIGlmICghaW5ldF9wdG9uKGZhbWlseSwgVFQuaWZhY2UsICZzcmNfYWRkcikpIHsKKyAgICAgIHN0cnVjdCBpZmFkZHJzICppZnNhdmUsICppZmEgPSAwOworCisgICAgICAvLyBJbnRlcmZhY2UgbmFtZT8KKyAgICAgIGlmICghZ2V0aWZhZGRycygmaWZzYXZlKSkgeworICAgICAgICBmb3IgKGlmYSA9IGlmc2F2ZTsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisgICAgICAgICAgaWYgKCFpZmEtPmlmYV9hZGRyIHx8IGlmYS0+aWZhX2FkZHItPnNhX2ZhbWlseSAhPSBmYW1pbHkpIGNvbnRpbnVlOworICAgICAgICAgIGlmICghc3RyY21wKGlmYS0+aWZhX25hbWUsIFRULmlmYWNlKSkgeworICAgICAgICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorICAgICAgICAgICAgICBtZW1jcHkoJnNyY19hZGRyLAorICAgICAgICAgICAgICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWlmYS0+aWZhX2FkZHIpLT5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgICAgIGVsc2UgbWVtY3B5KCZzcmNfYWRkciwKKyAgICAgICAgICAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopaWZhLT5pZmFfYWRkciktPnNpbjZfYWRkciwKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZWlmYWRkcnMoaWZzYXZlKTsKKyAgICAgIH0KKyAgICAgIGlmICghaWZhKQorICAgICAgICBlcnJvcl9leGl0KCJubyB2JWQgYWRkciBmb3IgLUkgJXMiLCA0KzIqKGZhbWlseT09QUZfSU5FVDYpLCBUVC5pZmFjZSk7CisgICAgfQorICAgIGluZXRfbnRvcChmYW1pbHksICZzcmNfYWRkciwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgaG9zdCA9IHhzdHJkdXAodG95YnVmKTsKKyAgfQorCitwcmludGYoImhvc3Q9JXNcbiIsIGhvc3QpOworCisgIC8vIE9wZW4gcmF3IHNvY2tldAorICBUVC5zb2NrID0geHNvY2tldChmYW1pbHksIFNPQ0tfUkFXLCBwcm90b2NvbCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL3JvdXRlLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyNmRjOQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvcm91dGUuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyogcm91dGUuYyAtIERpc3BsYXkvZWRpdCBuZXR3b3JrIHJvdXRpbmcgdGFibGUuCisgKgorICogQ29weXJpZ2h0IDIwMTIgUmFuamFuIEt1bWFyIDxyYW5qYW5rdW1hci5idGhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQKKyAqCitVU0VfUk9VVEUoTkVXVE9ZKHJvdXRlLCAiP25lQToiLCBUT1lGTEFHX0JJTikpCitjb25maWcgUk9VVEUKKyAgYm9vbCAicm91dGUiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHJvdXRlIFstbmVdIFstQSBpbmV0WzZdXSAvIFthZGR8ZGVsXQorCisgICAgRGlzcGxheS9FZGl0IGtlcm5lbCByb3V0aW5nIHRhYmxlcy4KKworICAgIC1uCW5vIG5hbWUgbG9va3VwcworICAgIC1lCWRpc3BsYXkgb3RoZXIvbW9yZSBpbmZvcm1hdGlvbgorICAgIC1BCWluZXR7Nn0gU2VsZWN0IEFkZHJlc3MgRmFtaWx5CisKKyAgICByZWplY3QgbW9kIGR5biByZWluc3RhdGUgbWV0cmljIG5ldG1hc2sgZ3cgbXNzIHdpbmRvdyBpcnR0IGRldgorKi8KKworI2RlZmluZSBGT1Jfcm91dGUKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKK0dMT0JBTFMoCisgIGNoYXIgKmZhbWlseTsKKykKKworI2RlZmluZSBERUZBVUxUX1BSRUZJWExFTiAxMjgKKyNkZWZpbmUgSU5WQUxJRF9BRERSIDB4ZmZmZmZmZmZVTAorI2RlZmluZSBJUFY2X0FERFJfTEVOIDQwIC8vMzIgKyA3ICgnOicpICsgMSAoJ1wwJykKKworc3RydWN0IF9hcmdsaXN0IHsKKyAgY2hhciAqYXJnOworCisgIGludCBhY3Rpb247Cit9OworCitzdGF0aWMgc3RydWN0IF9hcmdsaXN0IGFyZ2xpc3QxW10gPSB7CisgIHsgImFkZCIsIDEgfSwgeyAiZGVsIiwgMiB9LAorICB7ICJkZWxldGUiLCAyIH0sIHsgTlVMTCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IF9hcmdsaXN0IGFyZ2xpc3QyW10gPSB7CisgIHsgIi1uZXQiLCAxIH0sIHsgIi1ob3N0IiwgMiB9LAorICB7IE5VTEwsIDAgfQorfTsKKworLy8gdG8gZ2V0IHRoZSBob3N0IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gaXAuCitzdGF0aWMgaW50IGdldF9ob3N0bmFtZShjaGFyICppcHN0ciwgc3RydWN0IHNvY2thZGRyX2luICpzb2NraW4pCit7CisgIHN0cnVjdCBob3N0ZW50ICpob3N0OworCisgIHNvY2tpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvY2tpbi0+c2luX3BvcnQgPSAwOworCisgIGlmICghc3RyY21wKGlwc3RyLCAiZGVmYXVsdCIpKSB7CisgICAgc29ja2luLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGluZXRfYXRvbihpcHN0ciwgJnNvY2tpbi0+c2luX2FkZHIpKSByZXR1cm4gMDsKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoaXBzdHIpKSkgcmV0dXJuIC0xOworICBtZW1jcHkoJnNvY2tpbi0+c2luX2FkZHIsIGhvc3QtPmhfYWRkcl9saXN0WzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIHVzZWQgdG8gZXh0cmFjdCB0aGUgYWRkcmVzcyBpbmZvIGZyb20gdGhlIGdpdmVuIGlwLgorc3RhdGljIGludCBnZXRfYWRkcmluZm8oY2hhciAqaXAsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNvY2tfaW42KQoreworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXN1bHQ7CisgIGludCBzdGF0dXMgPSAwOworCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGlmICgoc3RhdHVzID0gZ2V0YWRkcmluZm8oaXAsIE5VTEwsICZoaW50cywgJnJlc3VsdCkpKSB7CisgICAgcGVycm9yX21zZygiZ2V0YWRkcmluZm86ICVzIiwgZ2FpX3N0cmVycm9yKHN0YXR1cykpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocmVzdWx0KSB7CisgICAgbWVtY3B5KHNvY2tfaW42LCByZXN1bHQtPmFpX2FkZHIsIHNpemVvZigqc29ja19pbjYpKTsKKyAgICBmcmVlYWRkcmluZm8ocmVzdWx0KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2ZsYWdfdmFsdWUoY2hhciAqc3RyLCBpbnQgZmxhZ3MpCit7CisgIC8vIFJURl8qIGJpdHMgaW4gb3JkZXI6CisgIC8vIFVQLCBHQVRFV0FZLCBIT1NULCBSRUlOU1RBVEUsIERZTkFNSUMsIE1PRElGSUVELCBERUZBVUxULCBBRERSQ09ORiwgQ0FDSEUKKyAgaW50IGkgPSAwLCBtYXNrID0gMHgxMDUwMDNmOworCisgIGZvciAoOyBtYXNrOyBtYXNrPj49MSkgaWYgKG1hc2smMSkgeworICAgIGlmIChmbGFncyYoMTw8aSkpICpzdHIrKyA9ICJVR0hSRE1EQUMiW2ldOworICAgIGkrKzsKKyAgfQorICAqc3RyID0gMDsKK30KKworLy8gZXh0cmFjdCBpbmV0NCByb3V0ZSBpbmZvIGZyb20gL3Byb2MvbmV0L3JvdXRlIGZpbGUgYW5kIGRpc3BsYXkgaXQuCitzdGF0aWMgdm9pZCBkaXNwbGF5X3JvdXRlcyh2b2lkKQoreworICB1bnNpZ25lZCBsb25nIGRlc3QsIGdhdGUsIG1hc2s7CisgIGludCBmbGFncywgcmVmLCB1c2UsIG1ldHJpYywgbXNzLCB3aW4sIGlydHQsIGl0ZW1zOworICBjaGFyIGlmYWNlWzY0XSA9IHswLH0sIGZsYWdfdmFsWzEwXTsgLy90aGVyZSBhcmUgOSBmbGFncyAiVUdIUkRNREFDIiBmb3Igcm91dGUuCisKKyAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL25ldC9yb3V0ZSIsICJyIik7CisKKyAgeHByaW50ZigiS2VybmVsIElQIHJvdXRpbmcgdGFibGVcbiIKKyAgICAgICJEZXN0aW5hdGlvbiAgICAgR2F0ZXdheSAgICAgICAgIEdlbm1hc2sgICAgICAgICBGbGFncyAlcyBJZmFjZVxuIiwKKyAgICAgICh0b3lzLm9wdGZsYWdzICYgRkxBR19lKT8gIiAgTVNTIFdpbmRvdyAgaXJ0dCIgOiAiTWV0cmljIFJlZiAgICBVc2UiKTsKKworICBpZiAoZnNjYW5mKGZwLCAiJSpbXlxuXVxuIikgPCAwKSBwZXJyb3JfZXhpdCgiZnNjYW5mIik7IC8vc2tpcCAxc3QgbGluZQorICB3aGlsZSAoKGl0ZW1zID0gZnNjYW5mKGZwLCAiJTYzcyVseCVseCVYJWQlZCVkJWx4JWQlZCVkXG4iLCBpZmFjZSwgJmRlc3QsIAorICAgICAgICAgICZnYXRlLCAmZmxhZ3MsICZyZWYsICZ1c2UsICZtZXRyaWMsICZtYXNrLCAmbXNzLCAmd2luLCAmaXJ0dCkpID09IDExKQorICB7CisgICAgY2hhciAqZGVzdGlwID0gdG95YnVmLCAqZ2F0ZWlwID0gdG95YnVmKzMyLCAqbWFza2lwID0gdG95YnVmKzY0OyAvL2lwIHN0cmluZyAxNgorCisgICAgaWYgKCEoZmxhZ3MgJiBSVEZfVVApKSBjb250aW51ZTsgLy9za2lwIGRvd24gaW50ZXJmYWNlcy4KKworICAgIGlmICghZGVzdCAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSBzdHJjcHkoIGRlc3RpcCwgImRlZmF1bHQiKTsKKyAgICBlbHNlIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZkZXN0LCBkZXN0aXAsIDMyKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKworICAgIGlmICghZ2F0ZSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSBzdHJjcHkoIGdhdGVpcCwgIioiKTsKKyAgICBlbHNlIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZnYXRlLCBnYXRlaXAsIDMyKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKworICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZtYXNrLCBtYXNraXAsIDMyKSkgcGVycm9yX2V4aXQoImluZXQiKTsKKworICAgIC8vR2V0IGZsYWcgVmFsdWVzCisgICAgZ2V0X2ZsYWdfdmFsdWUoZmxhZ192YWwsIGZsYWdzKTsKKyAgICBpZiAoZmxhZ3MgJiBSVEZfUkVKRUNUKSBmbGFnX3ZhbFswXSA9ICchJzsKKyAgICB4cHJpbnRmKCIlLTE1LjE1cyAlLTE1LjE1cyAlLTE2cyUtNnMiLCBkZXN0aXAsIGdhdGVpcCwgbWFza2lwLCBmbGFnX3ZhbCk7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2UpIHhwcmludGYoIiU1ZCAlLTVkICU2ZCAlc1xuIiwgbXNzLCB3aW4sIGlydHQsIGlmYWNlKTsKKyAgICBlbHNlIHhwcmludGYoIiUtNmQgJS0yZCAlN2QgJXNcbiIsIG1ldHJpYywgcmVmLCB1c2UsIGlmYWNlKTsKKyAgfQorCisgIGlmIChpdGVtcyA+IDAgJiYgZmVvZihmcCkpIHBlcnJvcl9leGl0KCJmc2NhbmYgJWQiLCBpdGVtcyk7CisgIGZjbG9zZShmcCk7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXIgaW4gbGlzdCBsaWtlIGFkZC9kZWwvbmV0L2hvc3QuCisgKiBhbmQgaWYgbWF0Y2ggZm91bmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2FjdGlvbihjaGFyICoqKmFyZ3YsIHN0cnVjdCBfYXJnbGlzdCAqbGlzdCkKK3sKKyAgc3RydWN0IF9hcmdsaXN0ICphbGlzdDsKKworICBpZiAoISoqYXJndikgcmV0dXJuIDA7CisgIGZvciAoYWxpc3QgPSBsaXN0OyBhbGlzdC0+YXJnOyBhbGlzdCsrKSB7IC8vZmluZCB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGluIGxpc3QKKyAgICBpZiAoIXN0cmNtcCgqKmFyZ3YsIGFsaXN0LT5hcmcpKSB7CisgICAgICAqYXJndiArPSAxOworICAgICAgcmV0dXJuIGFsaXN0LT5hY3Rpb247CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKgorICogZ2V0IHByZWZpeCBsZW4gKGlmIGFueSkgYW5kIHJlbW92ZSB0aGUgcHJlZml4IGZyb20gdGFyZ2V0IGlwLgorICogaWYgbm8gcHJlZml4IHRoZW4gc2V0IG5ldG1hc2sgYXMgZGVmYXVsdC4KKyAqLworc3RhdGljIHZvaWQgaXNfcHJlZml4KGNoYXIgKip0aXAsIGNoYXIgKipuZXRtYXNrLCBzdHJ1Y3QgcnRlbnRyeSAqcnQpCit7CisgIGNoYXIgKnByZWZpeCA9IHN0cmNocigqdGlwLCAnLycpOworICBpZiAocHJlZml4KSB7CisgICAgdW5zaWduZWQgbG9uZyBwbGVuOworICAgIHBsZW4gPSBhdG9seF9yYW5nZShwcmVmaXggKyAxLCAwLCAzMik7CisgICAgLy91c2VkIHRvIHZlcmlmeSB0aGUgbmV0bWFzayBhbmQgcm91dGUgY29uZmxpY3QuCisgICAgKCgoc3RydWN0IHNvY2thZGRyX2luICopJigocnQpLT5ydF9nZW5tYXNrKSktPnNpbl9hZGRyLnNfYWRkcikKKyAgICAgID0gaHRvbmwoIH4oSU5WQUxJRF9BRERSID4+IHBsZW4pKTsKKyAgICAqcHJlZml4ID0gJ1wwJzsKKyAgICBydC0+cnRfZ2VubWFzay5zYV9mYW1pbHkgPSBBRl9JTkVUOworICB9IGVsc2UgKm5ldG1hc2sgPSAiZGVmYXVsdCI7IC8vZGVmYXVsdCBuZXRtYXNrLgorfQorCisvKgorICogdXNlZCB0byBnZXQgdGhlIHBhcmFtcyBsaWtlOiBtZXRyaWMsIG5ldG1hc2ssIGd3LCBtc3MsIHdpbmRvdywgaXJ0dCwgZGV2IGFuZCB0aGVpciB2YWx1ZXMuCisgKiBhZGRpdGlvbmFsbHkgc2V0IHRoZSBmbGFnIHZhbHVlcyBmb3IgcmVqZWN0LCBtb2QsIGR5biBhbmQgcmVpbnN0YXRlLgorICovCitzdGF0aWMgdm9pZCBnZXRfbmV4dF9wYXJhbXMoY2hhciAqKmFyZ3YsIHN0cnVjdCBydGVudHJ5ICpydCwgY2hhciAqKm5ldG1hc2spCit7CisgIGZvciAoOyphcmd2O2FyZ3YrKykgeworICAgIGlmICghc3RyY21wKCphcmd2LCAicmVqZWN0IikpIHJ0LT5ydF9mbGFncyB8PSBSVEZfUkVKRUNUOworICAgIGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJtb2QiKSkgcnQtPnJ0X2ZsYWdzIHw9IFJURl9NT0RJRklFRDsKKyAgICBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiZHluIikpIHJ0LT5ydF9mbGFncyB8PSBSVEZfRFlOQU1JQzsKKyAgICBlbHNlIGlmICghc3RyY21wKCphcmd2LCAicmVpbnN0YXRlIikpIHJ0LT5ydF9mbGFncyB8PSBSVEZfUkVJTlNUQVRFOworICAgIGVsc2UgeworICAgICAgaWYgKCFhcmd2WzFdKSBoZWxwX2V4aXQoMCk7CisKKyAgICAgIC8vc2V0IHRoZSBtZXRyaWMgZmllbGQgaW4gdGhlIHJvdXRpbmcgdGFibGUuCisgICAgICBpZiAoIXN0cmNtcCgqYXJndiwgIm1ldHJpYyIpKQorICAgICAgICBydC0+cnRfbWV0cmljID0gYXRvbHhfcmFuZ2UoKmFyZ3YsIDAsIFVMT05HX01BWCkgKyAxOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIm5ldG1hc2siKSkgeworICAgICAgICAvL3doZW4gYWRkaW5nIGEgbmV0d29yayByb3V0ZSwgdGhlIG5ldG1hc2sgdG8gYmUgdXNlZC4KKyAgICAgICAgc3RydWN0IHNvY2thZGRyIHNvY2s7CisgICAgICAgIHVuc2lnbmVkIGludCBhZGRyX21hc2sgPSAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmKChydCktPnJ0X2dlbm1hc2spKS0+c2luX2FkZHIuc19hZGRyKTsKKworICAgICAgICBpZiAoYWRkcl9tYXNrKSBoZWxwX2V4aXQoImR1cCBuZXRtYXNrIik7CisgICAgICAgICpuZXRtYXNrID0gKmFyZ3Y7CisgICAgICAgIGlmIChnZXRfaG9zdG5hbWUoKm5ldG1hc2ssIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNvY2spIDwgMCkKKyAgICAgICAgICBwZXJyb3JfZXhpdCgicmVzb2x2aW5nICclcyciLCAqbmV0bWFzayk7CisgICAgICAgIHJ0LT5ydF9nZW5tYXNrID0gc29jazsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImd3IikpIHsgCisgICAgICAgIC8vcm91dGUgcGFja2V0cyB2aWEgYSBnYXRld2F5LgorICAgICAgICBpZiAoIShydC0+cnRfZmxhZ3MgJiBSVEZfR0FURVdBWSkpIHsKKyAgICAgICAgICBpbnQgaXNob3N0OworCisgICAgICAgICAgaWYgKChpc2hvc3QgPSBnZXRfaG9zdG5hbWUoKmFyZ3YsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJ0LT5ydF9nYXRld2F5KSkgPT0gMCkgeworICAgICAgICAgICAgcnQtPnJ0X2ZsYWdzIHw9IFJURl9HQVRFV0FZOworICAgICAgICAgIH0gZWxzZSBpZiAoaXNob3N0IDwgMCkgcGVycm9yX2V4aXQoInJlc29sdmluZyAnJXMnIiwgKmFyZ3YpOworICAgICAgICAgIGVsc2UgcGVycm9yX2V4aXQoImdhdGV3YXkgJyVzJyBpcyBhIE5FVFdPUksiLCAqYXJndik7CisgICAgICAgIH0gZWxzZSBoZWxwX2V4aXQoImR1cCBndyIpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAibXNzIikpIHsKKyAgICAgICAgLy9zZXQgdGhlIFRDUCBNYXhpbXVtIFNlZ21lbnQgU2l6ZSBmb3IgY29ubmVjdGlvbnMgb3ZlciB0aGlzIHJvdXRlLgorICAgICAgICBydC0+cnRfbXNzID0gYXRvbHhfcmFuZ2UoKmFyZ3YsIDY0LCAzMjc2OCk7IC8vTVNTIGxvdyBhbmQgbWF4CisgICAgICAgIHJ0LT5ydF9mbGFncyB8PSBSVEZfTVNTOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAid2luZG93IikpIHsKKyAgICAgICAgLy9zZXQgdGhlIFRDUCB3aW5kb3cgc2l6ZSBmb3IgY29ubmVjdGlvbnMgb3ZlciB0aGlzIHJvdXRlIHRvIFcgYnl0ZXMuCisgICAgICAgIHJ0LT5ydF93aW5kb3cgPSBhdG9seF9yYW5nZSgqYXJndiwgMTI4LCBJTlRfTUFYKTsgLy93aW4gbG93CisgICAgICAgIHJ0LT5ydF9mbGFncyB8PSBSVEZfV0lORE9XOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiaXJ0dCIpKSB7CisgICAgICAgIHJ0LT5ydF9pcnR0ID0gYXRvbHhfcmFuZ2UoKmFyZ3YsIDAsIElOVF9NQVgpOworICAgICAgICBydC0+cnRfZmxhZ3MgfD0gUlRGX0lSVFQ7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJkZXYiKSAmJiAhcnQtPnJ0X2RldikgcnQtPnJ0X2RldiA9ICphcmd2OworICAgICAgZWxzZSBoZWxwX2V4aXQoIm5vICclcyciLCAqYXJndik7CisgICAgfQorICB9CisKKyAgaWYgKCFydC0+cnRfZGV2ICYmIChydC0+cnRfZmxhZ3MgJiBSVEZfUkVKRUNUKSkgcnQtPnJ0X2RldiA9IChjaGFyICopImxvIjsKK30KKworLy8gdmVyaWZ5IHRoZSBuZXRtYXNrIGFuZCBjb25mbGljdCBpbiBuZXRtYXNrIGFuZCByb3V0ZSBhZGRyZXNzLgorc3RhdGljIHZvaWQgdmVyaWZ5X25ldG1hc2soc3RydWN0IHJ0ZW50cnkgKnJ0LCBjaGFyICpuZXRtYXNrKQoreworICB1bnNpZ25lZCBpbnQgYWRkcl9tYXNrID0gKCgoc3RydWN0IHNvY2thZGRyX2luICopJigocnQpLT5ydF9nZW5tYXNrKSktPnNpbl9hZGRyLnNfYWRkcik7CisgIHVuc2lnbmVkIGludCByb3V0ZXJfYWRkciA9IH4odW5zaWduZWQgaW50KSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSYoKHJ0KS0+cnRfZHN0KSktPnNpbl9hZGRyLnNfYWRkcik7CisKKyAgaWYgKGFkZHJfbWFzaykgeworICAgIGFkZHJfbWFzayA9IH5udG9obChhZGRyX21hc2spOworICAgIGlmICgocnQtPnJ0X2ZsYWdzICYgUlRGX0hPU1QpICYmIGFkZHJfbWFzayAhPSBJTlZBTElEX0FERFIpCisgICAgICBwZXJyb3JfZXhpdCgiY29uZmxpY3RpbmcgbmV0bWFzayBhbmQgaG9zdCByb3V0ZSIpOworICAgIGlmIChhZGRyX21hc2sgJiAoYWRkcl9tYXNrICsgMSkpIHBlcnJvcl9leGl0KCJ3cm9uZyBuZXRtYXNrICclcyciLCBuZXRtYXNrKTsKKyAgICBhZGRyX21hc2sgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnQtPnJ0X2RzdCktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICBpZiAoYWRkcl9tYXNrICYgcm91dGVyX2FkZHIpIHBlcnJvcl9leGl0KCJjb25mbGljdGluZyBuZXRtYXNrIGFuZCByb3V0ZSBhZGRyZXNzIik7CisgIH0KK30KKworLy8gYWRkL2RlbCBhIHJvdXRlLgorc3RhdGljIHZvaWQgc2V0cm91dGUoY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBydGVudHJ5IHJ0OworICBjaGFyICpuZXRtYXNrID0gTlVMTCwgKnRhcmdldGlwOworICBpbnQgaXNfbmV0X29yX2hvc3QgPSAwLCBzb2tmZCwgYXJnMl9hY3Rpb247CisgIGludCBhY3Rpb24gPSBnZXRfYWN0aW9uKCZhcmd2LCBhcmdsaXN0MSk7IC8vdmVyaWZ5IHRoZSBhcmcgZm9yIGFkZC9kZWwuCisKKyAgaWYgKCFhY3Rpb24gfHwgISphcmd2KSBoZWxwX2V4aXQoInNldHJvdXRlIik7CisKKyAgYXJnMl9hY3Rpb24gPSBnZXRfYWN0aW9uKCZhcmd2LCBhcmdsaXN0Mik7IC8vdmVyaWZ5IHRoZSBhcmcgZm9yIC1uZXQgb3IgLWhvc3QKKyAgaWYgKCEqYXJndikgaGVscF9leGl0KCJzZXRyb3V0ZSIpOworCisgIG1lbXNldCgmcnQsIDAsIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOworICB0YXJnZXRpcCA9ICphcmd2Kys7CisKKyAgaXNfcHJlZml4KChjaGFyICoqKSZ0YXJnZXRpcCwgKGNoYXIgKiopJm5ldG1hc2ssICZydCk7CisgIGlmICgoaXNfbmV0X29yX2hvc3QgPSBnZXRfaG9zdG5hbWUodGFyZ2V0aXAsIAorICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJ0LnJ0X2RzdCkpIDwgMCkKKyAgICBwZXJyb3JfZXhpdCgicmVzb2x2aW5nICclcyciLCB0YXJnZXRpcCk7CisKKyAgaWYgKGFyZzJfYWN0aW9uKSBpc19uZXRfb3JfaG9zdCA9IGFyZzJfYWN0aW9uICYgMTsKKyAgcnQucnRfZmxhZ3MgPSAoKGlzX25ldF9vcl9ob3N0KSA/IFJURl9VUCA6IChSVEZfVVAgfCBSVEZfSE9TVCkpOworCisgIGdldF9uZXh0X3BhcmFtcyhhcmd2LCAmcnQsIChjaGFyICoqKSZuZXRtYXNrKTsKKyAgdmVyaWZ5X25ldG1hc2soJnJ0LCAoY2hhciAqKW5ldG1hc2spOworCisgIGlmICgoYWN0aW9uID09IDEpICYmIChydC5ydF9mbGFncyAmIFJURl9IT1NUKSkKKyAgICAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmKChydCkucnRfZ2VubWFzaykpLT5zaW5fYWRkci5zX2FkZHIpID0gSU5WQUxJRF9BRERSOworCisgIHNva2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgaWYgKGFjdGlvbiA9PSAxKSB4aW9jdGwoc29rZmQsIFNJT0NBRERSVCwgJnJ0KTsKKyAgZWxzZSB4aW9jdGwoc29rZmQsIFNJT0NERUxSVCwgJnJ0KTsKKyAgeGNsb3NlKHNva2ZkKTsKK30KKworLyoKKyAqIGdldCBwcmVmaXggbGVuIChpZiBhbnkpIGFuZCByZW1vdmUgdGhlIHByZWZpeCBmcm9tIHRhcmdldCBpcC4KKyAqIGlmIG5vIHByZWZpeCB0aGVuIHNldCBkZWZhdWx0IHByZWZpeCBsZW4uCisgKi8KK3N0YXRpYyB2b2lkIGlzX3ByZWZpeF9pbmV0NihjaGFyICoqdGlwLCBzdHJ1Y3QgaW42X3J0bXNnICpydCkKK3sKKyAgdW5zaWduZWQgbG9uZyBwbGVuOworICBjaGFyICpwcmVmaXggPSBzdHJjaHIoKnRpcCwgJy8nKTsKKworICBpZiAocHJlZml4KSB7CisgICAgKnByZWZpeCA9ICdcMCc7CisgICAgcGxlbiA9IGF0b2x4X3JhbmdlKHByZWZpeCArIDEsIDAsIDEyOCk7IC8vREVGQVVMVF9QUkVGSVhMRU4pOworICB9IGVsc2UgcGxlbiA9IERFRkFVTFRfUFJFRklYTEVOOworCisgIHJ0LT5ydG1zZ19mbGFncyA9IChwbGVuID09IERFRkFVTFRfUFJFRklYTEVOKSA/IChSVEZfVVAgfCBSVEZfSE9TVCkgOiBSVEZfVVA7CisgIHJ0LT5ydG1zZ19kc3RfbGVuID0gcGxlbjsKK30KKworLyoKKyAqIHVzZWQgdG8gZ2V0IHRoZSBwYXJhbXMgbGlrZTogbWV0cmljLCBndywgZGV2IGFuZCB0aGVpciB2YWx1ZXMuCisgKiBhZGRpdGlvbmFsbHkgc2V0IHRoZSBmbGFnIHZhbHVlcyBmb3IgbW9kIGFuZCBkeW4uCisgKi8KK3N0YXRpYyB2b2lkIGdldF9uZXh0X3BhcmFtc19pbmV0NihjaGFyICoqYXJndiwgc3RydWN0IHNvY2thZGRyX2luNiAqc29ja19pbjYsIHN0cnVjdCBpbjZfcnRtc2cgKnJ0LCBjaGFyICoqZGV2X25hbWUpCit7CisgIGZvciAoOyphcmd2O2FyZ3YrKykgeworICAgIGlmICghc3RyY21wKCphcmd2LCAibW9kIikpIHJ0LT5ydG1zZ19mbGFncyB8PSBSVEZfTU9ESUZJRUQ7CisgICAgZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImR5biIpKSBydC0+cnRtc2dfZmxhZ3MgfD0gUlRGX0RZTkFNSUM7CisgICAgZWxzZSB7CisgICAgICBpZiAoIWFyZ3ZbMV0pIGhlbHBfZXhpdCgwKTsKKworICAgICAgaWYgKCFzdHJjbXAoKmFyZ3YsICJtZXRyaWMiKSkgCisgICAgICAgIHJ0LT5ydG1zZ19tZXRyaWMgPSBhdG9seF9yYW5nZSgqYXJndiwgMCwgVUxPTkdfTUFYKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICJndyIpKSB7CisgICAgICAgIC8vcm91dGUgcGFja2V0cyB2aWEgYSBnYXRld2F5LgorICAgICAgICBpZiAoIShydC0+cnRtc2dfZmxhZ3MgJiBSVEZfR0FURVdBWSkpIHsKKyAgICAgICAgICBpZiAoIWdldF9hZGRyaW5mbygqYXJndiwgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNvY2tfaW42KSkgeworICAgICAgICAgICAgbWVtY3B5KCZydC0+cnRtc2dfZ2F0ZXdheSwgc29ja19pbjYtPnNpbjZfYWRkci5zNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisgICAgICAgICAgICBydC0+cnRtc2dfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisgICAgICAgICAgfSBlbHNlIHBlcnJvcl9leGl0KCJyZXNvbHZpbmcgJyVzJyIsICphcmd2KTsKKyAgICAgICAgfSBlbHNlIGhlbHBfZXhpdCgwKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgImRldiIpKSB7CisgICAgICAgIGlmICghKmRldl9uYW1lKSAqZGV2X25hbWUgPSAqYXJndjsKKyAgICAgIH0gZWxzZSBoZWxwX2V4aXQoMCk7CisgICAgfQorICB9Cit9CisKKy8vIGFkZC9kZWwgYSByb3V0ZS4KK3N0YXRpYyB2b2lkIHNldHJvdXRlX2luZXQ2KGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNvY2tfaW42OworICBzdHJ1Y3QgaW42X3J0bXNnIHJ0OworICBjaGFyICp0YXJnZXRpcCwgKmRldl9uYW1lID0gMDsKKyAgaW50IHNvY2tmZCwgYWN0aW9uID0gZ2V0X2FjdGlvbigmYXJndiwgYXJnbGlzdDEpOworCisgIGlmICghYWN0aW9uIHx8ICEqYXJndikgaGVscF9leGl0KDApOworICBtZW1zZXQoJnNvY2tfaW42LCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICBtZW1zZXQoJnJ0LCAwLCBzaXplb2Yoc3RydWN0IGluNl9ydG1zZykpOworICB0YXJnZXRpcCA9ICphcmd2Kys7CisgIGlmICghKmFyZ3YpIGhlbHBfZXhpdCgwKTsKKworICBpZiAoIXN0cmNtcCh0YXJnZXRpcCwgImRlZmF1bHQiKSkgeworICAgIHJ0LnJ0bXNnX2ZsYWdzID0gUlRGX1VQOworICAgIHJ0LnJ0bXNnX2RzdF9sZW4gPSAwOworICB9IGVsc2UgeworICAgIGlzX3ByZWZpeF9pbmV0NigoY2hhciAqKikmdGFyZ2V0aXAsICZydCk7CisgICAgaWYgKGdldF9hZGRyaW5mbyh0YXJnZXRpcCwgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNvY2tfaW42KSkKKyAgICAgIHBlcnJvcl9leGl0KCJyZXNvbHZpbmcgJyVzJyIsIHRhcmdldGlwKTsKKyAgfQorICBydC5ydG1zZ19tZXRyaWMgPSAxOyAvL2RlZmF1bHQgbWV0cmljLgorICBtZW1jcHkoJnJ0LnJ0bXNnX2RzdCwgc29ja19pbjYuc2luNl9hZGRyLnM2X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgZ2V0X25leHRfcGFyYW1zX2luZXQ2KGFyZ3YsICZzb2NrX2luNiwgJnJ0LCAoY2hhciAqKikmZGV2X25hbWUpOworCisgIHNvY2tmZCA9IHhzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworICBpZiAoZGV2X25hbWUpIHsKKyAgICBjaGFyIGlmcmVfYnVmW3NpemVvZihzdHJ1Y3QgaWZyZXEpXSA9IHswLH07CisgICAgc3RydWN0IGlmcmVxICppZnJlID0gKHN0cnVjdCBpZnJlcSopaWZyZV9idWY7CisgICAgeHN0cm5jcHkoaWZyZS0+aWZyX25hbWUsIGRldl9uYW1lLCBJRk5BTVNJWik7CisgICAgeGlvY3RsKHNvY2tmZCwgU0lPR0lGSU5ERVgsIGlmcmUpOworICAgIHJ0LnJ0bXNnX2lmaW5kZXggPSBpZnJlLT5pZnJfaWZpbmRleDsKKyAgfSAgICAgICAgICAKKyAgaWYgKGFjdGlvbiA9PSAxKSB4aW9jdGwoc29ja2ZkLCBTSU9DQUREUlQsICZydCk7CisgIGVsc2UgeGlvY3RsKHNvY2tmZCwgU0lPQ0RFTFJULCAmcnQpOworICB4Y2xvc2Uoc29ja2ZkKTsKK30KKworLyoKKyAqIGZvcm1hdCB0aGUgZGVzdCBhbmQgc3JjIGFkZHJlc3MgaW4gaXB2NiBmb3JtYXQuCisgKiBlLmcuIDIwMDI6NmI2ZDoyNmM4OmQ6ZWEwMzo5YWZmOmZlNjU6OWQ2MgorICovCitzdGF0aWMgdm9pZCBpcHY2X2FkZHJfZm9ybWF0aW5nKGNoYXIgKnB0ciwgY2hhciAqYWRkcikKK3sKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaSA8PSBJUFY2X0FERFJfTEVOKSB7CisgICAgaWYgKCEqcHRyKSB7CisgICAgICBpZiAoaSA9PSBJUFY2X0FERFJfTEVOKSB7CisgICAgICAgIGFkZHJbSVBWNl9BRERSX0xFTiAtIDFdID0gMDsgLy9OVUxMIHRlcm1pbmF0aW5nIHRoZSAnOicgc2VwZXJhdGVkIGFkZHJlc3MuCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJyb3JfZXhpdCgiSVB2NiBpcCBmb3JtYXQgZXJyb3IiKTsKKyAgICB9CisgICAgYWRkcltpKytdID0gKnB0cisrOworICAgIGlmICghKChpKzEpICUgNSkpIGFkZHJbaSsrXSA9ICc6JzsgLy9wdXQgJzonIGFmdGVyIDR0aCBiaXQKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3JvdXRlczYodm9pZCkKK3sKKyAgY2hhciBpZmFjZVsxNl0gPSB7MCx9LCBpcHY2X2Rlc3RfYWRkcls0MV07IAorICBjaGFyIGlwdjZfc3JjX2FkZHJbNDFdLCBmbGFnX3ZhbFsxMF0sIGJ1ZjJbSU5FVDZfQUREUlNUUkxFTl07CisgIGludCBwcmVmaXhsZW4sIG1ldHJpYywgdXNlLCByZWZjb3VudCwgZmxhZywgaXRlbXMgPSAwOworICB1bnNpZ25lZCBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGluNl9hZGRyKV07CisKKyAgRklMRSAqZnAgPSB4Zm9wZW4oIi9wcm9jL25ldC9pcHY2X3JvdXRlIiwgInIiKTsKKworICB4cHJpbnRmKCJLZXJuZWwgSVB2NiByb3V0aW5nIHRhYmxlXG4iCisgICAgICAiJS00M3MlLTQwcyBGbGFncyBNZXRyaWMgUmVmICAgIFVzZSBJZmFjZVxuIiwgIkRlc3RpbmF0aW9uIiwgIk5leHQgSG9wIik7CisKKyAgd2hpbGUgKChpdGVtcyA9IGZzY2FuZihmcCwgIiUzMnMleCUqcyUqeCUzMnMleCV4JXgleCUxMHNcbiIsIGlwdjZfZGVzdF9hZGRyKzgsCisgICAgICAgICAgJnByZWZpeGxlbiwgaXB2Nl9zcmNfYWRkcis4LCAmbWV0cmljLCAmdXNlLCAmcmVmY291bnQsICZmbGFnLCAKKyAgICAgICAgICBpZmFjZSkpID09IDgpCisgIHsKKyAgICBpZiAoIShmbGFnICYgUlRGX1VQKSkgY29udGludWU7IC8vc2tpcCBkb3duIGludGVyZmFjZXMuCisKKyAgICAvL2lwdjZfZGVzdF9hZGRyKzg6IGFzIHRoZSB2YWx1ZXMgYXJlIGZpbGxlZCBmcm9tIHRoZSA4dGggbG9jYXRpb24gb2YgdGhlIGFycmF5LgorICAgIGlwdjZfYWRkcl9mb3JtYXRpbmcoaXB2Nl9kZXN0X2FkZHIrOCwgaXB2Nl9kZXN0X2FkZHIpOworICAgIGlwdjZfYWRkcl9mb3JtYXRpbmcoaXB2Nl9zcmNfYWRkcis4LCBpcHY2X3NyY19hZGRyKTsKKworICAgIGdldF9mbGFnX3ZhbHVlKGZsYWdfdmFsLCBmbGFnKTsKKyAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBpcHY2X2Rlc3RfYWRkciwgYnVmKSA8PSAwKSBwZXJyb3JfZXhpdCgiaW5ldCIpOworICAgIGlmIChpbmV0X250b3AoQUZfSU5FVDYsIGJ1ZiwgYnVmMiwgSU5FVDZfQUREUlNUUkxFTikpCisgICAgICBzcHJpbnRmKHRveWJ1ZiwgIiVzLyVkIiwgYnVmMiwgcHJlZml4bGVuKTsKKworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGlwdjZfc3JjX2FkZHIsIGJ1ZikgPD0gMCkgcGVycm9yX2V4aXQoImluZXQiKTsKKyAgICBpZiAoaW5ldF9udG9wKEFGX0lORVQ2LCBidWYsIGJ1ZjIsIElORVQ2X0FERFJTVFJMRU4pKQorICAgICAgeHByaW50ZigiJS00M3MgJS0zOXMgJS01cyAlLTZkICUtNGQgJTVkICUtOHNcbiIsCisgICAgICAgICAgdG95YnVmLCBidWYyLCBmbGFnX3ZhbCwgbWV0cmljLCByZWZjb3VudCwgdXNlLCBpZmFjZSk7CisgIH0KKyAgaWYgKChpdGVtcyA+IDApICYmIGZlb2YoZnApKSBwZXJyb3JfZXhpdCgiZnNjYW5mIik7CisKKyAgZmNsb3NlKGZwKTsKK30KKwordm9pZCByb3V0ZV9tYWluKHZvaWQpCit7CisgIGlmICghVFQuZmFtaWx5KSBUVC5mYW1pbHkgPSAiaW5ldCI7CisgIGlmICghKnRveXMub3B0YXJncykgeworICAgIGlmICghc3RyY21wKFRULmZhbWlseSwgImluZXQiKSkgZGlzcGxheV9yb3V0ZXMoKTsKKyAgICBlbHNlIGlmICghc3RyY21wKFRULmZhbWlseSwgImluZXQ2IikpIGRpc3BsYXlfcm91dGVzNigpOworICAgIGVsc2UgaGVscF9leGl0KDApOworICB9IGVsc2UgeworICAgIGlmICghc3RyY21wKFRULmZhbWlseSwgImluZXQ2IikpIHNldHJvdXRlX2luZXQ2KHRveXMub3B0YXJncyk7CisgICAgZWxzZSBzZXRyb3V0ZSh0b3lzLm9wdGFyZ3MpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL3NoLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiNGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvc2guYwpAQCAtMCwwICsxLDMzNSBAQAorLyogc2guYyAtIHRveWJveCBzaGVsbAorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogVGhlIFBPU0lYLTIwMDgvU1VTdjQgc3BlYyBmb3IgdGhpcyBpcyBhdDoKKyAqIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwKKyAqIGFuZCBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3NoLmh0bWwKKyAqCisgKiBUaGUgZmlyc3QgbGluayBkZXNjcmliZXMgdGhlIGZvbGxvd2luZyBzaGVsbCBidWlsdGluczoKKyAqCisgKiAgIGJyZWFrIGNvbG9uIGNvbnRpbnVlIGRvdCBldmFsIGV4ZWMgZXhpdCBleHBvcnQgcmVhZG9ubHkgcmV0dXJuIHNldCBzaGlmdAorICogICB0aW1lcyB0cmFwIHVuc2V0CisgKgorICogVGhlIHNlY29uZCBsaW5rICh0aGUgdXRpbGl0aWVzIGRpcmVjdG9yeSkgYWxzbyBjb250YWlucyBzcGVjcyBmb3IgdGhlCisgKiBmb2xsb3dpbmcgc2hlbGwgYnVpbHRpbnM6CisgKgorICogICBhbGlhcyBiZyBjZCBjb21tYW5kIGZjIGZnIGdldG9wdHMgaGFzaCBqb2JzIGtpbGwgcmVhZCB0eXBlIHVsaW1pdAorICogICB1bWFzayB1bmFsaWFzIHdhaXQKKyAqCisgKiBUaGluZ3MgbGlrZSB0aGUgYmFzaCBtYW4gcGFnZSBhcmUgZ29vZCB0byByZWFkIHRvby4KKyAqCisgKiBUT0RPOiAibWFrZSBzaCIgZG9lc24ndCB3b3JrIChub2ZvcmsgYnVpbHRpbnMgbmVlZCB0byBiZSBpbmNsdWRlZCkKKyAqIFRPRE86IHRlc3QgdGhhdCAkUFMxIGNvbG9yIGNoYW5nZXMgd29yayB3aXRob3V0IHN0dXBpZCBcWyBcXSBoYWNrCisgKiBUT0RPOiBtYWtlIGZha2UgcHR5IHdyYXBwZXIgZm9yIHRlc3QgaW5mcmFzdHJ1Y3R1cmUKKyAqIFRPRE86IC8vIEhhbmRsZSBlbWJlZGRlZCBOVUwgYnl0ZXMgaW4gdGhlIGNvbW1hbmQgbGluZS4KKyAqIFRPRE86IHZhcj12YWwgY29tbWFuZAorICogZXhpc3RpbmcgYnV0IGNvbnNpZGVyZWQgYnVpbHRpbnM6IGZhbHNlIGtpbGwgcHdkIHRydWUKKyAqIGJ1aXRpbnM6IGFsaWFzIGJnIGNvbW1hbmQgZmMgZmcgZ2V0b3B0cyBqb2JzIG5ld2dycCByZWFkIHVtYXNrIHVuYWxpYXMgd2FpdAorICogInNwZWNpYWwiIGJ1aWx0aW5zOiBicmVhayBjb250aW51ZSA6IC4gZXZhbCBleGVjIGV4cG9ydCByZWFkb25seSByZXR1cm4gc2V0CisgKiAgIHNoaWZ0IHRpbWVzIHRyYXAgdW5zZXQKKyAqIHwgJiA7IDwgPiAoICkgJCBgIFwgIiAnIDxzcGFjZT4gPHRhYj4gPG5ld2xpbmU+CisgKiAqID8gWyAjIH4gPSAlCisgKiAhIHsgfSBjYXNlIGRvIGRvbmUgZWxpZiBlbHNlIGVzYWMgZmkgZm9yIGlmIGluIHRoZW4gdW50aWwgd2hpbGUKKyAqIFtbIF1dIGZ1bmN0aW9uIHNlbGVjdAorICogJEAgJCogJCMgJD8gJC0gJCQgJCEgJDAKKyAqIEVOViBIT01FIElGUyBMQU5HIExDX0FMTCBMSU5FTk8gUEFUSCBQUElEIFBTMSBQUzIgUFM0IFBXRAorICogbGFiZWw6CisgKiBUT0RPOiB0ZXN0IGV4aXQgZnJvbSAidHJhcCBFWElUIiBkb2Vzbid0IHJlY3Vyc2UKKworVVNFX1NIKE5FV1RPWShjZCwgTlVMTCwgVE9ZRkxBR19OT0ZPUkspKQorVVNFX1NIKE5FV1RPWShleGl0LCBOVUxMLCBUT1lGTEFHX05PRk9SSykpCisKK1VTRV9TSChORVdUT1koc2gsICJjOmkiLCBUT1lGTEFHX0JJTikpCitVU0VfU0goT0xEVE9ZKHRveXNoLCBzaCwgVE9ZRkxBR19CSU4pKQorLy8gTG9naW4gbGllcyBpbiBhcmd2WzBdLCBzbyBhZGQgc29tZSBhbGlhc2VzIHRvIGNhdGNoIHRoYXQKK1VTRV9TSChPTERUT1koLXNoLCBzaCwgMCkpCitVU0VfU0goT0xEVE9ZKC10b3lzaCwgc2gsIDApKQorCitjb25maWcgU0gKKyAgYm9vbCAic2ggKHRveXNoKSIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogc2ggWy1jIGNvbW1hbmRdIFtzY3JpcHRdCisKKyAgICBDb21tYW5kIHNoZWxsLiAgUnVucyBhIHNoZWxsIHNjcmlwdCwgb3IgcmVhZHMgaW5wdXQgaW50ZXJhY3RpdmVseQorICAgIGFuZCByZXNwb25kcyB0byBpdC4KKworICAgIC1jCWNvbW1hbmQgbGluZSB0byBleGVjdXRlCisgICAgLWkJaW50ZXJhY3RpdmUgbW9kZSAoZGVmYXVsdCB3aGVuIFNURElOIGlzIGEgdHR5KQorCitjb25maWcgQ0QKKyAgYm9vbAorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBTSAorICBoZWxwCisgICAgdXNhZ2U6IGNkIFstUExdIFtwYXRoXQorCisgICAgQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5LiAgV2l0aCBubyBhcmd1bWVudHMsIGdvICRIT01FLgorCisgICAgLVAJUGh5c2ljYWwgcGF0aDogcmVzb2x2ZSBzeW1saW5rcyBpbiBwYXRoLgorICAgIC1MCUxvY2FsIHBhdGg6IC4uIHRyaW1zIGRpcmVjdG9yaWVzIG9mZiAkUFdEIChkZWZhdWx0KS4KKworY29uZmlnIEVYSVQKKyAgYm9vbAorICBkZWZhdWx0IG4KKyAgZGVwZW5kcyBvbiBTSAorICBoZWxwCisgICAgdXNhZ2U6IGV4aXQgW3N0YXR1c10KKworICAgIEV4aXQgc2hlbGwuICBJZiBubyByZXR1cm4gdmFsdWUgc3VwcGxpZWQgb24gY29tbWFuZCBsaW5lLCB1c2UgdmFsdWUKKyAgICBvZiBtb3N0IHJlY2VudCBjb21tYW5kLCBvciAwIGlmIG5vbmUuCisqLworCisjZGVmaW5lIEZPUl9zaAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqY29tbWFuZDsKKworICBsb25nIGxpbmVubzsKKykKKworLy8gV2hhdCB3ZSBrbm93IGFib3V0IGEgc2luZ2xlIHByb2Nlc3MuCitzdHJ1Y3QgY29tbWFuZCB7CisgIHN0cnVjdCBjb21tYW5kICpuZXh0OworICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAvLyBleGl0LCBzdXNwZW5kLCAmJiB8fAorICBpbnQgcGlkOyAgICAgICAgICAgICAgICAvLyBwaWQgKG9yIGV4aXQgY29kZSkKKyAgaW50IGFyZ2M7CisgIGNoYXIgKmFyZ3ZbMF07Cit9OworCisvLyBBIGNvbGxlY3Rpb24gb2YgcHJvY2Vzc2VzIHBpcGVkIGludG8vd2FpdGluZyBvbiBlYWNoIG90aGVyLgorc3RydWN0IHBpcGVsaW5lIHsKKyAgc3RydWN0IHBpcGVsaW5lICpuZXh0OworICBpbnQgam9iX2lkOworICBzdHJ1Y3QgY29tbWFuZCAqY21kOworICBjaGFyICpjbWRsaW5lOyAgICAgICAgIC8vIFVucGFyc2VkIGxpbmUgZm9yIGRpc3BsYXkgcHVycG9zZXMKKyAgaW50IGNtZGxpbmVsZW47ICAgICAgICAvLyBIb3cgbG9uZyBpcyBjbWRsaW5lPworfTsKKwordm9pZCBjZF9tYWluKHZvaWQpCit7CisgIGNoYXIgKmRlc3QgPSAqdG95cy5vcHRhcmdzID8gKnRveXMub3B0YXJncyA6IGdldGVudigiSE9NRSIpOworCisgIHhjaGRpcihkZXN0ID8gZGVzdCA6ICIvIik7Cit9CisKK3ZvaWQgZXhpdF9tYWluKHZvaWQpCit7CisgIGV4aXQoKnRveXMub3B0YXJncyA/IGF0b2koKnRveXMub3B0YXJncykgOiAwKTsKK30KKworLy8gUGFyc2Ugb25lIHdvcmQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhcHBlbmRpbmcgb25lIG9yIG1vcmUgYXJndltdIGVudHJpZXMKKy8vIHRvIHN0cnVjdCBjb21tYW5kLiAgSGFuZGxlcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYW5kCisvLyBzdWJzdHJpbmdzLiAgUmV0dXJucyBwb2ludGVyIHRvIG5leHQgdXNlZCBieXRlLCBvciBOVUxMIGlmIGl0CisvLyBoaXQgYW4gZW5kaW5nIHRva2VuLgorc3RhdGljIGNoYXIgKnBhcnNlX3dvcmQoY2hhciAqc3RhcnQsIHN0cnVjdCBjb21tYW5kICoqY21kKQoreworICBjaGFyICplbmQ7CisKKyAgLy8gRGV0ZWN0IGVuZCBvZiBsaW5lIChhbmQgdHJ1bmNhdGUgbGluZSBhdCBjb21tZW50KQorICBpZiAoc3RyY2hyKCI+PCZ8KDsiLCAqc3RhcnQpKSByZXR1cm4gMDsKKworICAvLyBHcmFiIG5leHQgd29yZC4gIChBZGQgZGVxdW90ZSBhbmQgZW52dmFyIGxvZ2ljIGhlcmUpCisgIGVuZCA9IHN0YXJ0OworICB3aGlsZSAoKmVuZCAmJiAhaXNzcGFjZSgqZW5kKSkgZW5kKys7CisgICgqY21kKS0+YXJndlsoKmNtZCktPmFyZ2MrK10gPSB4c3RybmR1cChzdGFydCwgZW5kLXN0YXJ0KTsKKworICAvLyBBbGxvY2F0ZSBtb3JlIHNwYWNlIGlmIHRoZXJlJ3Mgbm8gcm9vbSBmb3IgTlVMTCB0ZXJtaW5hdG9yLgorCisgIGlmICghKCgqY21kKS0+YXJnYyAmIDcpKQorICAgICpjbWQ9eHJlYWxsb2MoKmNtZCwKKyAgICAgICAgc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSArICgoKmNtZCktPmFyZ2MrOCkqc2l6ZW9mKGNoYXIgKikpOworICAoKmNtZCktPmFyZ3ZbKCpjbWQpLT5hcmdjXSA9IDA7CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIFBhcnNlIGEgbGluZSBvZiB0ZXh0IGludG8gYSBwaXBlbGluZS4KKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGxpbmUuCisKK3N0YXRpYyBjaGFyICpwYXJzZV9waXBlbGluZShjaGFyICpjbWRsaW5lLCBzdHJ1Y3QgcGlwZWxpbmUgKmxpbmUpCit7CisgIHN0cnVjdCBjb21tYW5kICoqY21kID0gJihsaW5lLT5jbWQpOworICBjaGFyICpzdGFydCA9IGxpbmUtPmNtZGxpbmUgPSBjbWRsaW5lOworCisgIGlmICghY21kbGluZSkgcmV0dXJuIDA7CisKKyAgbGluZS0+Y21kbGluZSA9IGNtZGxpbmU7CisKKyAgLy8gUGFyc2UgY29tbWFuZCBpbnRvIGFyZ3ZbXQorICBmb3IgKDs7KSB7CisgICAgY2hhciAqZW5kOworCisgICAgLy8gU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGRldGVjdCBlbmQgb2YgbGluZS4KKyAgICB3aGlsZSAoaXNzcGFjZSgqc3RhcnQpKSBzdGFydCsrOworICAgIGlmICghKnN0YXJ0IHx8ICpzdGFydD09JyMnKSB7CisgICAgICBsaW5lLT5jbWRsaW5lbGVuID0gc3RhcnQtY21kbGluZTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG5leHQgY29tbWFuZCBzdHJ1Y3R1cmUgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCEqY21kKSAqY21kID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1hbmQpKzgqc2l6ZW9mKGNoYXIgKikpOworCisgICAgLy8gUGFyc2UgbmV4dCBhcmd1bWVudCBhbmQgYWRkIHRoZSByZXN1bHRzIHRvIGFyZ3ZbXQorICAgIGVuZCA9IHBhcnNlX3dvcmQoc3RhcnQsIGNtZCk7CisKKyAgICAvLyBJZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGlzIGNvbW1hbmQsIGhvdyBkaWQgaXQgZW5kPworICAgIGlmICghZW5kKSB7CisgICAgICBpZiAoKnN0YXJ0KSB7CisgICAgICAgIGlmICgqc3RhcnQ9PSc7JykgeworICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gaGFuZGxlIHwgJiA8ID4gPj4gPDwgfHwgJiYKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdGFydCA9IGVuZDsKKyAgfQorCisgIGxpbmUtPmNtZGxpbmVsZW4gPSBzdGFydC1jbWRsaW5lOworCisgIHJldHVybiBzdGFydDsKK30KKworLy8gRXhlY3V0ZSB0aGUgY29tbWFuZHMgaW4gYSBwaXBlbGluZQorc3RhdGljIHZvaWQgcnVuX3BpcGVsaW5lKHN0cnVjdCBwaXBlbGluZSAqbGluZSkKK3sKKyAgc3RydWN0IHRveV9saXN0ICp0bDsKKyAgc3RydWN0IGNvbW1hbmQgKmNtZCA9IGxpbmUtPmNtZDsKKyAgaWYgKCFjbWQgfHwgIWNtZC0+YXJnYykgcmV0dXJuOworCisgIHRsID0gdG95X2ZpbmQoY21kLT5hcmd2WzBdKTsKKworICAvLyBJcyB0aGlzIGNvbW1hbmQgYSBidWlsdGluIHRoYXQgc2hvdWxkIHJ1biBpbiB0aGlzIHByb2Nlc3M/CisgIGlmICh0bCAmJiAodGwtPmZsYWdzICYgVE9ZRkxBR19OT0ZPUkspKSB7CisgICAgc3RydWN0IHRveV9jb250ZXh0IHRlbXA7CisgICAgam1wX2J1ZiByZWJvdW5kOworCisgICAgLy8gVGhpcyBmYWtlcyBsb3RzIG9mIHdoYXQgdG95Ym94X21haW4oKSBkb2VzLgorICAgIG1lbWNweSgmdGVtcCwgJnRveXMsIHNpemVvZihzdHJ1Y3QgdG95X2NvbnRleHQpKTsKKyAgICBtZW1zZXQoJnRveXMsIDAsIHNpemVvZihzdHJ1Y3QgdG95X2NvbnRleHQpKTsKKworICAgIGlmICghc2V0am1wKHJlYm91bmQpKSB7CisgICAgICB0b3lzLnJlYm91bmQgPSAmcmVib3VuZDsKKyAgICAgIHRveV9pbml0KHRsLCBjbWQtPmFyZ3YpOworICAgICAgdGwtPnRveV9tYWluKCk7CisgICAgfQorICAgIGNtZC0+cGlkID0gdG95cy5leGl0dmFsOworICAgIGlmICh0b3lzLm9wdGFyZ3MgIT0gdG95cy5hcmd2KzEpIGZyZWUodG95cy5vcHRhcmdzKTsKKyAgICBpZiAodG95cy5vbGRfdW1hc2spIHVtYXNrKHRveXMub2xkX3VtYXNrKTsKKyAgICBtZW1jcHkoJnRveXMsICZ0ZW1wLCBzaXplb2Yoc3RydWN0IHRveV9jb250ZXh0KSk7CisgIH0gZWxzZSB7CisgICAgaW50IHN0YXR1czsKKworICAgIGNtZC0+cGlkID0gdmZvcmsoKTsKKyAgICBpZiAoIWNtZC0+cGlkKSB4ZXhlYyhjbWQtPmFyZ3YpOworICAgIGVsc2Ugd2FpdHBpZChjbWQtPnBpZCwgJnN0YXR1cywgMCk7CisKKyAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIGNtZC0+cGlkID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgY21kLT5waWQgPSBXVEVSTVNJRyhzdGF0dXMpOworICB9CisKKyAgcmV0dXJuOworfQorCisvLyBGcmVlIHRoZSBjb250ZW50cyBvZiBhIGNvbW1hbmQgc3RydWN0dXJlCitzdGF0aWMgdm9pZCBmcmVlX2NtZCh2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgY29tbWFuZCAqY21kPShzdHJ1Y3QgY29tbWFuZCAqKWRhdGE7CisKKyAgd2hpbGUoY21kLT5hcmdjKSBmcmVlKGNtZC0+YXJndlstLWNtZC0+YXJnY10pOworfQorCisKKy8vIFBhcnNlIGEgY29tbWFuZCBsaW5lIGFuZCBkbyB3aGF0IGl0IHNheXMgdG8gZG8uCitzdGF0aWMgdm9pZCBoYW5kbGUoY2hhciAqY29tbWFuZCkKK3sKKyAgc3RydWN0IHBpcGVsaW5lIGxpbmU7CisgIGNoYXIgKnN0YXJ0ID0gY29tbWFuZDsKKworICAvLyBMb29wIHRocm91Z2ggY29tbWFuZHMgaW4gdGhpcyBsaW5lCisKKyAgZm9yICg7OykgeworCisgICAgLy8gUGFyc2UgYSBncm91cCBvZiBjb25uZWN0ZWQgY29tbWFuZHMKKworICAgIG1lbXNldCgmbGluZSwwLHNpemVvZihzdHJ1Y3QgcGlwZWxpbmUpKTsKKyAgICBzdGFydCA9IHBhcnNlX3BpcGVsaW5lKHN0YXJ0LCAmbGluZSk7CisgICAgaWYgKCFsaW5lLmNtZCkgYnJlYWs7CisKKyAgICAvLyBSdW4gdGhvc2UgY29tbWFuZHMKKworICAgIHJ1bl9waXBlbGluZSgmbGluZSk7CisgICAgbGxpc3RfdHJhdmVyc2UobGluZS5jbWQsIGZyZWVfY21kKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkb19wcm9tcHQodm9pZCkKK3sKKyAgY2hhciAqcHJvbXB0ID0gZ2V0ZW52KCJQUzEiKSwgKnMsIGMsIGNjOworCisgIGlmICghcHJvbXB0KSBwcm9tcHQgPSAiXFwkICI7CisgIHdoaWxlICgqcHJvbXB0KSB7CisgICAgYyA9ICoocHJvbXB0KyspOworCisgICAgaWYgKGM9PSchJykgeworICAgICAgaWYgKCpwcm9tcHQ9PSchJykgcHJvbXB0Kys7CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlbGQiLCBUVC5saW5lbm8pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGM9PSdcXCcpIHsKKyAgICAgIGNjID0gKihwcm9tcHQrKyk7CisgICAgICBpZiAoIWNjKSBnb3RvIGRvd247CisKKyAgICAgIC8vIFxubm4gXGREe31oSGpsc3RUQEF1dlZ3VyEjJAorICAgICAgLy8gSWdub3JlIGJhc2gncyAibm9ucHJpbnRhYmxlIiBoYWNrOyBxdWVyeSBvdXIgY3Vyc29yIHBvc2l0aW9uIGluc3RlYWQuCisgICAgICBpZiAoY2M9PSdbJyB8fCBjYz09J10nKSBjb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKGNjPT0nJCcpIHB1dGNoYXIoZ2V0dWlkKCkgPyAnJCcgOiAnIycpOworICAgICAgZWxzZSBpZiAoY2M9PSdoJyB8fCBjYz09J0gnKSB7CisgICAgICAgICp0b3lidWYgPSAwOworICAgICAgICBnZXRob3N0bmFtZSh0b3lidWYsIHNpemVvZih0b3lidWYpLTEpOworICAgICAgICBpZiAoY2M9PSdoJyAmJiAocyA9IHN0cmNocih0b3lidWYsICcuJykpKSAqcyA9IDA7CisgICAgICAgIGZwdXRzKHRveWJ1Ziwgc3Rkb3V0KTsKKyAgICAgIH0gZWxzZSBpZiAoY2M9PSdzJykgZnB1dHMoZ2V0YmFzZW5hbWUoKnRveXMuYXJndiksIHN0ZG91dCk7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCEoYyA9IHVuZXNjYXBlKGNjKSkpIHsKKyAgICAgICAgICBjID0gJ1xcJzsKKyAgICAgICAgICBwcm9tcHQtLTsKKyAgICAgICAgfQorCisgICAgICAgIGdvdG8gZG93bjsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KK2Rvd246CisgICAgcHV0Y2hhcihjKTsKKyAgfQorfQorCit2b2lkIHNoX21haW4odm9pZCkKK3sKKyAgRklMRSAqZiA9IDA7CisKKyAgLy8gU2V0IHVwIHNpZ25hbCBoYW5kbGVycyBhbmQgZ3JhYiBjb250cm9sIG9mIHRoaXMgdHR5LgorICBpZiAoaXNhdHR5KDApKSB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfaTsKKworICBpZiAoKnRveXMub3B0YXJncykgZiA9IHhmb3BlbigqdG95cy5vcHRhcmdzLCAiciIpOworICBpZiAoVFQuY29tbWFuZCkgaGFuZGxlKHhzdHJkdXAoVFQuY29tbWFuZCkpOworICBlbHNlIHsKKyAgICBzaXplX3QgY21kbGVuID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBjaGFyICpjb21tYW5kID0gMDsKKworICAgICAgLy8gVE9ETzogcGFyc2UgZXNjYXBlcyBpbiBwcm9tcHQKKyAgICAgIGlmICghZikgZG9fcHJvbXB0KCk7CisgICAgICBpZiAoMSA+IGdldGxpbmUoJmNvbW1hbmQsICZjbWRsZW4sIGYgPyBmIDogc3RkaW4pKSBicmVhazsKKyAgICAgIGhhbmRsZShjb21tYW5kKTsKKyAgICAgIGZyZWUoY29tbWFuZCk7CisgICAgfQorICB9CisKKyAgdG95cy5leGl0dmFsID0gMTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvc3Vsb2dpbi5jIGIvdG95Ym94L3RveXMvcGVuZGluZy9zdWxvZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzNjM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvc3Vsb2dpbi5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBzdWxvZ2luLmMgLSBTaW5nbGUgVXNlciBMb2dpbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBc2hpc2ggS3VtYXIgR3VwdGEgPGFzaGlzaGtndXB0YWlpdC5jc2VAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTQgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogCisgKiBSZWxpZXMgb24gbGliY3J5cHQgZm9yIGhhc2ggY2FsY3VsYXRpb24uIAorICogTm8gc3VwcG9ydCBmb3IgUEFNL3NlY3VyZXR0eS9zZWxpbnV4L2xvZ2luIHNjcmlwdC9pc3N1ZS91dG1wCisKKworVVNFX1NVTE9HSU4oTkVXVE9ZKHN1bG9naW4sICJ0IzwwPTAiLCBUT1lGTEFHX1NCSU58VE9ZRkxBR19ORUVEUk9PVCkpCisKK2NvbmZpZyBTVUxPR0lOCisgIGJvb2wgInN1bG9naW4iCisgIGRlZmF1bHQgbgorICBkZXBlbmRzIG9uIFRPWUJPWF9TSEFET1cKKyAgaGVscAorICAgIHVzYWdlOiBzdWxvZ2luIFstdCB0aW1lXSBbdHR5XQorCisgICAgU2luZ2xlIFVzZXIgTG9naW4uCisgICAgLXQJRGVmYXVsdCBUaW1lIGZvciBTaW5nbGUgVXNlciBMb2dpbgorKi8KKyNkZWZpbmUgRk9SX3N1bG9naW4KKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgdGltZW91dDsKKyAgc3RydWN0IHRlcm1pb3MgY3JudGlvOworKQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X2hhbmRsZShpbnQgc2lnbm8pIAoreworICB0Y3NldGF0dHIoMCwgVENTQU5PVywgJihUVC5jcm50aW8pKTsKKyAgZmZsdXNoKHN0ZG91dCk7CisgIHhwcmludGYoIlxuIFRpbWVkIG91dCAtIE5vcm1hbCBzdGFydHVwXG4iKTsKKyAgZXhpdCgwKTsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9wYXNzd29yZChjaGFyICpwd2QpCit7CisgIHN0cnVjdCBzaWdhY3Rpb24gc2E7CisgIGludCByZXQ7CisgIGNoYXIgKnMgPSAiR2l2ZSByb290IHBhc3N3b3JkIGZvciBzeXN0ZW0gbWFpbnRlbmFuY2VcbiIKKyAgICAiKG9yIHR5cGUgQ29udHJvbC1EIGZvciBub3JtYWwgc3RhcnR1cCk6IiwKKyAgICAqcGFzczsKKworICB0Y2dldGF0dHIoMCwgJihUVC5jcm50aW8pKTsKKyAgc2Euc2FfaGFuZGxlciA9IHRpbWVvdXRfaGFuZGxlOworCisgIGlmKFRULnRpbWVvdXQpIHsKKyAgICBzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKyAgICBhbGFybShUVC50aW1lb3V0KTsKKyAgfQorCisgIHJldCA9IHJlYWRfcGFzc3dvcmQodG95YnVmLCBzaXplb2YodG95YnVmKSwgcyk7CisgIGlmKFRULnRpbWVvdXQpIGFsYXJtKDApOworCisgIGlmICggcmV0ICYmICF0b3lidWZbMF0pIHsgICAKKyAgICB4cHJpbnRmKCJOb3JtYWwgc3RhcnR1cC5cbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHBhc3MgPSBjcnlwdCh0b3lidWYsIHB3ZCk7CisgIHJldCA9IDE7CisgIGlmKCBwYXNzICYmICFzdHJjbXAocGFzcywgcHdkKSkgcmV0ID0gMDsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydW5fc2hlbGwoY2hhciAqc2hlbGwpIAoreworICBzbnByaW50Zih0b3lidWYsc2l6ZW9mKHRveWJ1ZiksICItJXMiLCBzaGVsbCk7CisgIGV4ZWNsKHNoZWxsLCB0b3lidWYsIE5VTEwpOworICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gc3Bhd24gc2hlbGwiKTsKK30KKwordm9pZCBzdWxvZ2luX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHBhc3N3ZCAqcHdkID0gTlVMTDsKKyAgc3RydWN0IHNwd2QgKiBzcHdkID0gTlVMTDsKKyAgY2hhciAqZm9yYmlkW10gPSB7CisgICAgIkJBU0hfRU5WIiwgIkVOViIsICJIT01FIiwgIklGUyIsICJMRF9MSUJSQVJZX1BBVEgiLCAiTERfUFJFTE9BRCIsCisgICAgIkxEX1RSQUNFX0xPQURFRF9PQkpFQ1RTIiwgIkxEX0JJTkRfTk9XIiwgIkxEX0FPVVRfTElCUkFSWV9QQVRIIiwKKyAgICAiTERfQU9VVF9QUkVMT0FEIiwgIkxEX05PV0FSTiIsICJMRF9LRUVQRElSIiwgIlNIRUxMIiwgTlVMTAorICB9OworICBjaGFyICpzaGVsbCA9IE5VTEwsICpwYXNzID0gTlVMTCwgKip0ZW1wID0gZm9yYmlkOworCisgIGlmICh0b3lzLm9wdGFyZ3NbMF0pIHsKKyAgICBpbnQgZmQ7CisKKyAgICBkdXAyKChmZCA9IHhvcGVuX3N0ZGluKHRveXMub3B0YXJnc1swXSwgT19SRFdSKSksIDApOworICAgIGlmICghaXNhdHR5KDApKSBlcnJvcl9leGl0KCIlczogaXQgaXMgbm90IGEgdHR5IiwgdG95cy5vcHRhcmdzWzBdKTsKKyAgICBkdXAyKCBmZCwgMSk7CisgICAgZHVwMiggZmQsIDIpOworICAgIGlmIChmZCA+IDIpIGNsb3NlKGZkKTsKKyAgfSAgCisKKyAgZm9yICh0ZW1wID0gZm9yYmlkOyAqdGVtcDsgdGVtcCsrKSB1bnNldGVudigqdGVtcCk7CisKKyAgaWYgKCEocHdkID0gZ2V0cHd1aWQoMCkpKSBlcnJvcl9leGl0KCJpbnZhbGlkIHVzZXIiKTsKKyAgcGFzcyA9IHB3ZC0+cHdfcGFzc3dkOworCisgIGlmICgocGFzc1swXSA9PSAneCcgfHwgcGFzc1swXSA9PSAnKicpICYmICFwYXNzWzFdKSB7CisgICAgaWYgKChzcHdkID0gZ2V0c3BuYW0gKHB3ZC0+cHdfbmFtZSkpKSBwYXNzID0gc3B3ZC0+c3BfcHdkcDsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgaW50IHIgPSB2YWxpZGF0ZV9wYXNzd29yZChwYXNzKTsKKworICAgIGlmIChyID09IDEpIHhwcmludGYoIkluY29ycmVjdCBMb2dpbi5cbiIpOworICAgIGVsc2UgaWYgKHIgPT0gMCkgYnJlYWs7CisgICAgZWxzZSBpZiAociA9PSAtMSkgcmV0dXJuOworICB9CisKKyAgaWYgKChzaGVsbCA9IGdldGVudigiU1VTSEVMTCIpKSB8fCAoc2hlbGwgPSBnZXRlbnYoInN1c2hlbGwiKSkKKyAgICAgIHx8IChzaGVsbCA9IHB3ZC0+cHdfc2hlbGwpKQorICAgIHJ1bl9zaGVsbCgoc2hlbGwgJiYgKnNoZWxsKT8gc2hlbGw6ICIvYmluL3NoIik7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL3N5c2xvZ2QuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvc3lzbG9nZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTQyY2EKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL3N5c2xvZ2QuYwpAQCAtMCwwICsxLDU0NiBAQAorLyogc3lzbG9nZC5jIC0gYSBzeXN0ZW0gbG9nZ2luZyB1dGlsaXR5LgorICoKKyAqIENvcHlyaWdodCAyMDEzIE1hZGh1ciBWZXJtYSA8bWFkLmZsZXhpQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9TWVNMT0dEKE5FV1RPWShzeXNsb2dkLCI+MGwjPDE+OD04UjpiIzwwPjk5PTFzIzwwPTIwMG0jPDA+NzE1ODI3ODc9MjBPOnA6ZjphOm5TS0xEIiwgVE9ZRkxBR19TQklOfFRPWUZMQUdfU1RBWVJPT1QpKQorCitjb25maWcgU1lTTE9HRAorICBib29sICJzeXNsb2dkIgorICBkZWZhdWx0IG4KKyAgaGVscAorICB1c2FnZTogc3lzbG9nZCAgWy1hIHNvY2tldF0gWy1PIGxvZ2ZpbGVdIFstZiBjb25maWcgZmlsZV0gWy1tIGludGVydmFsXQorICAgICAgICAgICAgICAgICAgWy1wIHNvY2tldF0gWy1zIFNJWkVdIFstYiBOXSBbLVIgSE9TVF0gWy1sIE5dIFstblNMS0RdCisKKyAgU3lzdGVtIGxvZ2dpbmcgdXRpbGl0eQorCisgIC1hICAgICAgRXh0cmEgdW5peCBzb2NrZXQgZm9yIGxpc3RlbgorICAtTyBGSUxFIERlZmF1bHQgbG9nIGZpbGUgPERFRkFVTFQ6IC92YXIvbG9nL21lc3NhZ2VzPgorICAtZiBGSUxFIENvbmZpZyBmaWxlIDxERUZBVUxUOiAvZXRjL3N5c2xvZy5jb25mPgorICAtcCAgICAgIEFsdGVybmF0aXZlIHVuaXggZG9tYWluIHNvY2tldCA8REVGQVVMVCA6IC9kZXYvbG9nPgorICAtbiAgICAgIEF2b2lkIGF1dG8tYmFja2dyb3VuZGluZy4KKyAgLVMgICAgICBTbWFsbGVyIG91dHB1dAorICAtbSBNQVJLIGludGVydmFsIDxERUZBVUxUOiAyMCBtaW51dGVzPiAoUkFOR0U6IDAgdG8gNzE1ODI3ODcpCisgIC1SIEhPU1QgTG9nIHRvIElQIG9yIGhvc3RuYW1lIG9uIFBPUlQgKGRlZmF1bHQgUE9SVD01MTQvVURQKSIKKyAgLUwgICAgICBMb2cgbG9jYWxseSBhbmQgdmlhIG5ldHdvcmsgKGRlZmF1bHQgaXMgbmV0d29yayBvbmx5IGlmIC1SKSIKKyAgLXMgU0laRSBNYXggc2l6ZSAoS0IpIGJlZm9yZSByb3RhdGlvbiAoZGVmYXVsdDoyMDBLQiwgMD1vZmYpCisgIC1iIE4gICAgcm90YXRlZCBsb2dzIHRvIGtlZXAgKGRlZmF1bHQ6MSwgbWF4PTk5LCAwPXB1cmdlKQorICAtSyAgICAgIExvZyB0byBrZXJuZWwgcHJpbnRrIGJ1ZmZlciAodXNlIGRtZXNnIHRvIHJlYWQgaXQpCisgIC1sIE4gICAgTG9nIG9ubHkgbWVzc2FnZXMgbW9yZSB1cmdlbnQgdGhhbiBwcmlvKGRlZmF1bHQ6OCBtYXg6OCBtaW46MSkKKyAgLUQgICAgICBEcm9wIGR1cGxpY2F0ZXMKKyovCisKKyNkZWZpbmUgRk9SX3N5c2xvZ2QKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBVTklYIFNvY2tldHMgZm9yIGxpc3RlbmluZworc3RydWN0IHVuc29ja3MgeworICBzdHJ1Y3QgdW5zb2NrcyAqbmV4dDsKKyAgY2hhciAqcGF0aDsKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNkdTsKKyAgaW50IHNkOworfTsKKworLy8gTG9nIGZpbGUgZW50cnkgdG8gbG9nIGludG8uCitzdHJ1Y3QgbG9nZmlsZSB7CisgIHN0cnVjdCBsb2dmaWxlICpuZXh0OworICBjaGFyICpmaWxlbmFtZTsKKyAgdWludDMyX3QgZmFjaWxpdHlbOF07CisgIHVpbnQ4X3QgbGV2ZWxbTE9HX05GQUNJTElUSUVTXTsKKyAgaW50IGxvZ2ZkOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7Cit9OworCitHTE9CQUxTKAorICBjaGFyICpzb2NrZXQ7CisgIGNoYXIgKmNvbmZpZ19maWxlOworICBjaGFyICp1bml4X3NvY2tldDsKKyAgY2hhciAqbG9nZmlsZTsKKyAgbG9uZyBpbnRlcnZhbDsKKyAgbG9uZyByb3Rfc2l6ZTsKKyAgbG9uZyByb3RfY291bnQ7CisgIGNoYXIgKnJlbW90ZV9sb2c7CisgIGxvbmcgbG9nX3ByaW87CisKKyAgc3RydWN0IHVuc29ja3MgKmxzb2NrczsgIC8vIGxpc3Qgb2YgbGlzdGVuIHNvY2tldHMKKyAgc3RydWN0IGxvZ2ZpbGUgKmxmaWxlczsgIC8vIGxpc3Qgb2Ygd3JpdGUgbG9nZmlsZXMKKyAgaW50IHNpZ2ZkWzJdOworKQorCisvLyBMb29rdXAgbnVtZXJpY2FsIGNvZGUgZnJvbSBuYW1lCisvLyBBbHNvIHVzZWQgaW4gbG9nZ2VyCitpbnQgbG9nZ2VyX2xvb2t1cChpbnQgd2hlcmUsIGNoYXIgKmtleSkKK3sKKyAgQ09ERSAqdyA9ICgoQ09ERSAqW10pe2ZhY2lsaXR5bmFtZXMsIHByaW9yaXR5bmFtZXN9KVt3aGVyZV07CisKKyAgZm9yICg7IHctPmNfbmFtZTsgdysrKQorICAgIGlmICghc3RyY2FzZWNtcChrZXksIHctPmNfbmFtZSkpIHJldHVybiB3LT5jX3ZhbDsKKworICByZXR1cm4gLTE7Cit9CisKKy8vc2VhcmNoIHRoZSBnaXZlbiBuYW1lIGFuZCByZXR1cm4gaXRzIHZhbHVlCitzdGF0aWMgY2hhciAqZGVjKGludCB2YWwsIENPREUgKmNsaXN0LCBjaGFyICpidWYpCit7CisgIGZvciAoOyBjbGlzdC0+Y19uYW1lOyBjbGlzdCsrKSAKKyAgICBpZiAodmFsID09IGNsaXN0LT5jX3ZhbCkgcmV0dXJuIGNsaXN0LT5jX25hbWU7CisgIHNwcmludGYoYnVmLCAiJXUiLCB2YWwpOworCisgIHJldHVybiBidWY7Cit9CisKKy8qCisgKiByZWN1cnNlcyB0aGUgbG9nZmlsZSBsaXN0IGFuZCByZXNvbHZlcyBjb25maWcKKyAqIGZvciBldnJ5IGZpbGUgYW5kIHVwZGF0ZXMgZmFjaWx0eSBhbmQgbG9nIGxldmVsIGJpdHMuCisgKi8KK3N0YXRpYyBpbnQgcmVzb2x2ZV9jb25maWcoc3RydWN0IGxvZ2ZpbGUgKmZpbGUsIGNoYXIgKmNvbmZpZykKK3sKKyAgY2hhciAqdGs7CisKKyAgZm9yICh0ayA9IHN0cnRvayhjb25maWcsICI7IFwwIik7IHRrOyB0ayA9IHN0cnRvayhOVUxMLCAiOyBcMCIpKSB7CisgICAgY2hhciAqZmFjID0gdGssICpsdmw7CisgICAgaW50IGkgPSAwOworICAgIHVuc2lnbmVkIGZhY3ZhbCA9IDA7CisgICAgdWludDhfdCBzZXQsIGxldnZhbCwgYml0cyA9IDA7CisKKyAgICB0ayA9IHN0cmNocihmYWMsICcuJyk7CisgICAgaWYgKCF0aykgcmV0dXJuIC0xOworICAgICp0ayA9ICdcMCc7CisgICAgbHZsID0gdGsgKyAxOworCisgICAgZm9yICg7OykgeworICAgICAgY2hhciAqbmZhYyA9IHN0cmNocihmYWMsICcsJyk7CisKKyAgICAgIGlmIChuZmFjKSAqbmZhYyA9ICdcMCc7CisgICAgICBpZiAoKmZhYyA9PSAnKicpIHsKKyAgICAgICAgZmFjdmFsID0gMHhGRkZGRkZGRjsKKyAgICAgICAgaWYgKGZhY1sxXSkgcmV0dXJuIC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChpID0gbG9nZ2VyX2xvb2t1cCgwLCBmYWMpKSA9PSAtMSkgcmV0dXJuIC0xOworICAgICAgICBmYWN2YWwgfD0gKDEgPDwgTE9HX0ZBQyhpKSk7CisgICAgICB9CisgICAgICBpZiAobmZhYykgZmFjID0gbmZhYyArIDE7CisgICAgICBlbHNlIGJyZWFrOworICAgIH0KKworICAgIGxldnZhbCA9IDA7CisgICAgZm9yICh0ayA9ICIhPSoiOyAqdGs7IHRrKyssIGJpdHMgPDw9IDEpIHsKKyAgICAgIGlmICgqbHZsID09ICp0aykgeworICAgICAgICBiaXRzKys7CisgICAgICAgIGx2bCsrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYml0cyAmIDIpIGxldnZhbCA9IDB4ZmY7CisgICAgaWYgKCpsdmwpIHsKKyAgICAgIGlmICgoaSA9IGxvZ2dlcl9sb29rdXAoMSwgbHZsKSkgPT0gLTEpIHJldHVybiAtMTsKKyAgICAgIGxldnZhbCB8PSAoYml0cyAmIDQpID8gTE9HX01BU0soaSkgOiBMT0dfVVBUTyhpKTsKKyAgICAgIGlmIChiaXRzICYgOCkgbGV2dmFsID0gfmxldnZhbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwLCBzZXQgPSBsZXZ2YWw7IHNldDsgc2V0ID4+PSAxLCBpKyspCisgICAgICBpZiAoc2V0ICYgMHgxKSBmaWxlLT5mYWNpbGl0eVtpXSB8PSB+ZmFjdmFsOworICAgIGZvciAoaSA9IDA7IGkgPCBMT0dfTkZBQ0lMSVRJRVM7IGZhY3ZhbCA+Pj0gMSwgaSsrKQorICAgICAgaWYgKGZhY3ZhbCAmIDB4MSkgZmlsZS0+bGV2ZWxbaV0gfD0gfmxldnZhbDsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyBQYXJzZSBjb25maWcgZmlsZSBhbmQgdXBkYXRlIHRoZSBsb2cgZmlsZSBsaXN0Lgorc3RhdGljIGludCBwYXJzZV9jb25maWdfZmlsZSh2b2lkKQoreworICBzdHJ1Y3QgbG9nZmlsZSAqZmlsZTsKKyAgRklMRSAqZnA7CisgIGNoYXIgKmNvbmZsaW5lLCAqdGtbMl07CisgIGludCBsZW4sIGxpbmVubyA9IDA7CisgIHNpemVfdCBsaW5lbGVuOworICAvKgorICAgKiBpZiAtSyB0aGVuIG9wZW4gb25seSAvZGV2L2ttc2cKKyAgICogYWxsIG90aGVyIGxvZyBmaWxlcyBhcmUgbmVnbGVjdGVkCisgICAqIHRodXMgbm8gbmVlZCB0byBvcGVuIGNvbmZpZyBlaXRoZXIuCisgICAqLworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfSykgeworICAgIGZpbGUgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nZmlsZSkpOworICAgIGZpbGUtPmZpbGVuYW1lID0geHN0cmR1cCgiL2Rldi9rbXNnIik7CisgICAgVFQubGZpbGVzID0gZmlsZTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKgorICAgKiBpZiAtUiB0aGVuIGFkZCByZW1vdGUgaG9zdCB0byBsb2cgbGlzdAorICAgKiBpZiAtTCBpcyBub3QgcHJvdmlkZWQgYWxsIG90aGVyIGxvZworICAgKiBmaWxlcyBhcmUgbmVnbGVjdGVkIHRodXMgbm8gbmVlZCB0bworICAgKiBvcGVuIGNvbmZpZyBlaXRoZXIgc28ganVzdCByZXR1cm4uCisgICAqLworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUikgeworICAgIGZpbGUgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nZmlsZSkpOworICAgIGZpbGUtPmZpbGVuYW1lID0geG1wcmludGYoIkAlcyIsVFQucmVtb3RlX2xvZyk7CisgICAgVFQubGZpbGVzID0gZmlsZTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19MKSkgcmV0dXJuIDA7CisgIH0KKyAgLyoKKyAgICogUmVhZCBjb25maWcgZmlsZSBhbmQgYWRkIGxvZ2ZpbGVzIHRvIHRoZSBsaXN0CisgICAqIHdpdGggdGhlaXIgY29uZmlndXJhdGlvbi4KKyAgICovCisgIGlmICghKGZwID0gZm9wZW4oVFQuY29uZmlnX2ZpbGUsICJyIikpICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSkKKyAgICBwZXJyb3JfZXhpdCgiY2FuJ3Qgb3BlbiAnJXMnIiwgVFQuY29uZmlnX2ZpbGUpOworCisgIGZvciAobGluZWxlbiA9IDA7IGZwOykgeworICAgIGNvbmZsaW5lID0gTlVMTDsKKyAgICBsZW4gPSBnZXRsaW5lKCZjb25mbGluZSwgJmxpbmVsZW4sIGZwKTsKKyAgICBpZiAobGVuIDw9IDApIGJyZWFrOworICAgIGxpbmVubysrOworICAgIGZvciAoOyAqY29uZmxpbmUgPT0gJyAnOyBjb25mbGluZSsrLCBsZW4tLSkgOworICAgIGlmICgoY29uZmxpbmVbMF0gPT0gJyMnKSB8fCAoY29uZmxpbmVbMF0gPT0gJ1xuJykpIGNvbnRpbnVlOworICAgIHRrWzBdID0gY29uZmxpbmU7CisgICAgZm9yICg7IGxlbiAmJiAhKCp0a1swXT09JyAnIHx8ICp0a1swXT09J1x0Jyk7IHRrWzBdKyssIGxlbi0tKTsKKyAgICBmb3IgKHRrWzFdID0gdGtbMF07IGxlbiAmJiAoKnRrWzFdPT0nICcgfHwgKnRrWzFdPT0nXHQnKTsgdGtbMV0rKywgbGVuLS0pOworICAgIGlmICghbGVuIHx8IChsZW4gPT0gMSAmJiAqdGtbMV0gPT0gJ1xuJykpIHsKKyAgICAgIGVycm9yX21zZygiZXJyb3IgaW4gJyVzJyBhdCBsaW5lICVkIiwgVFQuY29uZmlnX2ZpbGUsIGxpbmVubyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCoodGtbMV0gKyBsZW4gLSAxKSA9PSAnXG4nKSAqKHRrWzFdICsgbGVuIC0gMSkgPSAnXDAnOworICAgICp0a1swXSA9ICdcMCc7CisgICAgaWYgKCp0a1sxXSAhPSAnKicpIHsKKyAgICAgIGZpbGUgPSBUVC5sZmlsZXM7CisgICAgICB3aGlsZSAoZmlsZSAmJiBzdHJjbXAoZmlsZS0+ZmlsZW5hbWUsIHRrWzFdKSkgZmlsZSA9IGZpbGUtPm5leHQ7CisgICAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgZmlsZSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dmaWxlKSk7CisgICAgICAgIGZpbGUtPmZpbGVuYW1lID0geHN0cmR1cCh0a1sxXSk7CisgICAgICAgIGZpbGUtPm5leHQgPSBUVC5sZmlsZXM7CisgICAgICAgIFRULmxmaWxlcyA9IGZpbGU7CisgICAgICB9CisgICAgICBpZiAocmVzb2x2ZV9jb25maWcoZmlsZSwgY29uZmxpbmUpID09IC0xKSB7CisgICAgICAgIGVycm9yX21zZygiZXJyb3IgaW4gJyVzJyBhdCBsaW5lICVkIiwgVFQuY29uZmlnX2ZpbGUsIGxpbmVubyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgZnJlZShjb25mbGluZSk7CisgIH0KKyAgLyoKKyAgICogQ2FuJ3Qgb3BlbiBjb25maWcgZmlsZSBvciBzdXBwb3J0IGlzIG5vdCBlbmFibGVkCisgICAqIGFkZGluZyBkZWZhdWx0IGxvZ2ZpbGUgdG8gdGhlIGhlYWQgb2YgbGlzdC4KKyAgICovCisgIGlmICghZnApeworICAgIGZpbGUgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nZmlsZSkpOworICAgIGZpbGUtPmZpbGVuYW1lID0geHN0cmR1cCgodG95cy5vcHRmbGFncyAmIEZMQUdfTykgPworICAgICAgICAgICAgICAgICAgICAgVFQubG9nZmlsZSA6ICIvdmFyL2xvZy9tZXNzYWdlcyIpOyAvL0RFRkxPR0ZJTEUKKyAgICBmaWxlLT5uZXh0ID0gVFQubGZpbGVzOworICAgIFRULmxmaWxlcyA9IGZpbGU7CisgIH0gZWxzZSBmY2xvc2UoZnApOworICByZXR1cm4gMDsKK30KKworLy8gb3BlbiBldmVyeSBsb2cgZmlsZSBpbiBsaXN0Lgorc3RhdGljIHZvaWQgb3Blbl9sb2dmaWxlcyh2b2lkKQoreworICBzdHJ1Y3QgbG9nZmlsZSAqdGZkOworCisgIGZvciAodGZkID0gVFQubGZpbGVzOyB0ZmQ7IHRmZCA9IHRmZC0+bmV4dCkgeworICAgIGNoYXIgKnAsICp0bXBmaWxlOworICAgIGxvbmcgcG9ydCA9IDUxNDsKKworICAgIGlmICgqdGZkLT5maWxlbmFtZSA9PSAnQCcpIHsgLy8gbmV0d29yaworICAgICAgc3RydWN0IGFkZHJpbmZvICppbmZvLCBycDsKKworICAgICAgdG1wZmlsZSA9IHhzdHJkdXAodGZkLT5maWxlbmFtZSArIDEpOworICAgICAgaWYgKChwID0gc3RyY2hyKHRtcGZpbGUsICc6JykpKSB7CisgICAgICAgIGNoYXIgKmVuZHB0cjsKKworICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIHBvcnQgPSBzdHJ0b2woKytwLCAmZW5kcHRyLCAxMCk7CisgICAgICAgIGlmICgqZW5kcHRyIHx8IGVuZHB0ciA9PSBwIHx8IHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkKKyAgICAgICAgICBlcnJvcl9leGl0KCJiYWQgcG9ydCBpbiAlcyIsIHRmZC0+ZmlsZW5hbWUpOworICAgICAgfQorICAgICAgbWVtc2V0KCZycCwgMCwgc2l6ZW9mKHJwKSk7CisgICAgICBycC5haV9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgcnAuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICAgICAgcnAuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKworICAgICAgaWYgKGdldGFkZHJpbmZvKHRtcGZpbGUsIE5VTEwsICZycCwgJmluZm8pIHx8ICFpbmZvKSAKKyAgICAgICAgcGVycm9yX2V4aXQoIkJBRCBBRERSRVNTOiBjYW4ndCBmaW5kIDogJXMgIiwgdG1wZmlsZSk7CisgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiopaW5mby0+YWlfYWRkciktPnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgICAgICBtZW1jcHkoJnRmZC0+c2FkZHIsIGluZm8tPmFpX2FkZHIsIGluZm8tPmFpX2FkZHJsZW4pOworICAgICAgZnJlZWFkZHJpbmZvKGluZm8pOworCisgICAgICB0ZmQtPmxvZ2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisgICAgICBmcmVlKHRtcGZpbGUpOworICAgIH0gZWxzZSB0ZmQtPmxvZ2ZkID0gb3Blbih0ZmQtPmZpbGVuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0FQUEVORCwgMDY2Nik7CisgICAgaWYgKHRmZC0+bG9nZmQgPCAwKSB7CisgICAgICB0ZmQtPmZpbGVuYW1lID0gIi9kZXYvY29uc29sZSI7CisgICAgICB0ZmQtPmxvZ2ZkID0gb3Blbih0ZmQtPmZpbGVuYW1lLCBPX0FQUEVORCk7CisgICAgfQorICB9Cit9CisKKy8vd3JpdGUgdG8gZmlsZSB3aXRoIHJvdGF0aW9uCitzdGF0aWMgaW50IHdyaXRlX3JvdGF0ZShzdHJ1Y3QgbG9nZmlsZSAqdGYsIGludCBsZW4pCit7CisgIGludCBzaXplLCBpc3JlZzsKKyAgc3RydWN0IHN0YXQgc3RhdGY7CisgIGlzcmVnID0gKCFmc3RhdCh0Zi0+bG9nZmQsICZzdGF0ZikgJiYgU19JU1JFRyhzdGF0Zi5zdF9tb2RlKSk7CisgIHNpemUgPSBzdGF0Zi5zdF9zaXplOworCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcykgfHwgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2IpKSB7CisgICAgaWYgKFRULnJvdF9zaXplICYmIGlzcmVnICYmIChzaXplICsgbGVuKSA+IChUVC5yb3Rfc2l6ZSoxMDI0KSkgeworICAgICAgaWYgKFRULnJvdF9jb3VudCkgeyAvKiBhbHdheXMgMC4uOTkgKi8KKyAgICAgICAgaW50IGkgPSBzdHJsZW4odGYtPmZpbGVuYW1lKSArIDMgKyAxOworICAgICAgICBjaGFyIG9sZF9maWxlW2ldOworICAgICAgICBjaGFyIG5ld19maWxlW2ldOworICAgICAgICBpID0gVFQucm90X2NvdW50IC0gMTsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICBzcHJpbnRmKG5ld19maWxlLCAiJXMuJWQiLCB0Zi0+ZmlsZW5hbWUsIGkpOworICAgICAgICAgIGlmICghaSkgYnJlYWs7CisgICAgICAgICAgc3ByaW50ZihvbGRfZmlsZSwgIiVzLiVkIiwgdGYtPmZpbGVuYW1lLCAtLWkpOworICAgICAgICAgIHJlbmFtZShvbGRfZmlsZSwgbmV3X2ZpbGUpOworICAgICAgICB9CisgICAgICAgIHJlbmFtZSh0Zi0+ZmlsZW5hbWUsIG5ld19maWxlKTsKKyAgICAgICAgdW5saW5rKHRmLT5maWxlbmFtZSk7CisgICAgICAgIGNsb3NlKHRmLT5sb2dmZCk7CisgICAgICAgIHRmLT5sb2dmZCA9IG9wZW4odGYtPmZpbGVuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0FQUEVORCwgMDY2Nik7CisgICAgICAgIGlmICh0Zi0+bG9nZmQgPCAwKSB7CisgICAgICAgICAgcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAlcyIsIHRmLT5maWxlbmFtZSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBmdHJ1bmNhdGUodGYtPmxvZ2ZkLCAwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdyaXRlKHRmLT5sb2dmZCwgdG95YnVmLCBsZW4pOworfQorCisvL1BhcnNlIG1lc3NlZ2UgYW5kIHdyaXRlIHRvIGZpbGUuCitzdGF0aWMgdm9pZCBsb2dtc2coY2hhciAqbXNnLCBpbnQgbGVuKQoreworICB0aW1lX3Qgbm93OworICBjaGFyICpwLCAqdHMsICpsdmxzdHIsICpmYWNzdHI7CisgIHN0cnVjdCB1dHNuYW1lIHV0czsKKyAgaW50IHByaSA9IDA7CisgIHN0cnVjdCBsb2dmaWxlICp0ZiA9IFRULmxmaWxlczsKKworICBjaGFyICpvbXNnID0gbXNnOworICBpbnQgb2xlbiA9IGxlbiwgZmFjLCBsdmw7CisgIAorICBpZiAoKm1zZyA9PSAnPCcpIHsgLy8gRXh0cmFjdCB0aGUgcHJpb3JpdHkgbm8uCisgICAgcHJpID0gKGludCkgc3RydG91bChtc2cgKyAxLCAmcCwgMTApOworICAgIGlmICgqcCA9PSAnPicpIG1zZyA9IHAgKyAxOworICB9CisgIC8qIEphbiAxOCAwMDoxMToyMiBtc2cuLi4KKyAgICogMDEyMzQ1Njc4OTAxMjM0NTYKKyAgICovCisgIGlmIChsZW4gPCAxNiB8fCBtc2dbM10gIT0gJyAnIHx8IG1zZ1s2XSAhPSAnICcgfHwgbXNnWzldICE9ICc6JworICAgICAgfHwgbXNnWzEyXSAhPSAnOicgfHwgbXNnWzE1XSAhPSAnICcpIHsKKyAgICB0aW1lKCZub3cpOworICAgIHRzID0gY3RpbWUoJm5vdykgKyA0OyAvKiBza2lwIGRheSBvZiB3ZWVrICovCisgIH0gZWxzZSB7CisgICAgbm93ID0gMDsKKyAgICB0cyA9IG1zZzsKKyAgICBtc2cgKz0gMTY7CisgIH0KKyAgdHNbMTVdID0gJ1wwJzsKKyAgZmFjID0gTE9HX0ZBQyhwcmkpOworICBsdmwgPSBMT0dfUFJJKHByaSk7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0spIGxlbiA9IHNwcmludGYodG95YnVmLCAiPCVkPiAlc1xuIiwgcHJpLCBtc2cpOworICBlbHNlIHsKKyAgICBjaGFyIGZhY2J1ZlsxMl0sIHByaWJ1ZlsxMl07CisKKyAgICBmYWNzdHIgPSBkZWMocHJpICYgTE9HX0ZBQ01BU0ssIGZhY2lsaXR5bmFtZXMsIGZhY2J1Zik7CisgICAgbHZsc3RyID0gZGVjKExPR19QUkkocHJpKSwgcHJpb3JpdHluYW1lcywgcHJpYnVmKTsKKworICAgIHAgPSAibG9jYWwiOworICAgIGlmICghdW5hbWUoJnV0cykpIHAgPSB1dHMubm9kZW5hbWU7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1MpIGxlbiA9IHNwcmludGYodG95YnVmLCAiJXMgJXNcbiIsIHRzLCBtc2cpOworICAgIGVsc2UgbGVuID0gc3ByaW50Zih0b3lidWYsICIlcyAlcyAlcy4lcyAlc1xuIiwgdHMsIHAsIGZhY3N0ciwgbHZsc3RyLCBtc2cpOworICB9CisgIGlmIChsdmwgPj0gVFQubG9nX3ByaW8pIHJldHVybjsKKworICBmb3IgKDsgdGY7IHRmID0gdGYtPm5leHQpIHsKKyAgICBpZiAodGYtPmxvZ2ZkID4gMCkgeworICAgICAgaWYgKCEoKHRmLT5mYWNpbGl0eVtsdmxdICYgKDEgPDwgZmFjKSkgfHwgKHRmLT5sZXZlbFtmYWNdICYgKDE8PGx2bCkpKSkgeworICAgICAgICBpbnQgd2xlbiwgaXNOZXR3b3JrID0gKnRmLT5maWxlbmFtZSA9PSAnQCc7CisgICAgICAgIGlmIChpc05ldHdvcmspCisgICAgICAgICAgd2xlbiA9IHNlbmR0byh0Zi0+bG9nZmQsIG9tc2csIG9sZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSZ0Zi0+c2FkZHIsIHNpemVvZih0Zi0+c2FkZHIpKTsKKyAgICAgICAgZWxzZSB3bGVuID0gd3JpdGVfcm90YXRlKHRmLCBsZW4pOworICAgICAgICBpZiAod2xlbiA8IDApIHBlcnJvcl9tc2coIndyaXRlIGZhaWxlZCBmaWxlIDogJXMgIiwgdGYtPmZpbGVuYW1lICsgaXNOZXR3b3JrKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoKKyAqIGNsb3NlcyBhbGwgcmVhZCBhbmQgd3JpdGUgZmRzCisgKiBhbmQgZnJlZXMgYWxsIG5vZGVzIGFuZCBsaXN0cworICovCitzdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpCit7CisgIHdoaWxlIChUVC5sc29ja3MpIHsKKyAgICBzdHJ1Y3QgdW5zb2NrcyAqZm5vZGUgPSBUVC5sc29ja3M7CisKKyAgICBpZiAoZm5vZGUtPnNkID49IDApIHsKKyAgICAgIGNsb3NlKGZub2RlLT5zZCk7CisgICAgICB1bmxpbmsoZm5vZGUtPnBhdGgpOworICAgIH0KKyAgICBUVC5sc29ja3MgPSBmbm9kZS0+bmV4dDsKKyAgICBmcmVlKGZub2RlKTsKKyAgfQorCisgIHdoaWxlIChUVC5sZmlsZXMpIHsKKyAgICBzdHJ1Y3QgbG9nZmlsZSAqZm5vZGUgPSBUVC5sZmlsZXM7CisKKyAgICBmcmVlKGZub2RlLT5maWxlbmFtZSk7CisgICAgaWYgKGZub2RlLT5sb2dmZCA+PSAwKSBjbG9zZShmbm9kZS0+bG9nZmQpOworICAgIFRULmxmaWxlcyA9IGZub2RlLT5uZXh0OworICAgIGZyZWUoZm5vZGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisgIHVuc2lnbmVkIGNoYXIgY2ggPSBzaWc7CisgIGlmICh3cml0ZShUVC5zaWdmZFsxXSwgJmNoLCAxKSAhPSAxKSBlcnJvcl9tc2coImNhbid0IHNlbmQgc2lnbmFsIik7Cit9CisKK3ZvaWQgc3lzbG9nZF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB1bnNvY2tzICp0c2Q7CisgIGludCBuZmRzLCByZXR2YWwsIGxhc3RfbGVuPTA7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBmZF9zZXQgcmZkczsgICAgICAgIC8vIGZkcyBmb3IgcmVhZGluZworICBjaGFyICp0ZW1wLCAqYnVmZmVyID0gKHRveWJ1ZiArMjA0OCksICpsYXN0X2J1ZiA9ICh0b3lidWYgKyAzMDcyKTsgLy90aGVzZSB0d28gYnVmZnMgYXJlIG9mIDFLIGVhY2gKKworICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApICYmIChzdHJsZW4oVFQudW5peF9zb2NrZXQpID4gMTA4KSkKKyAgICBlcnJvcl9leGl0KCJTb2NrZXQgcGF0aCBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAxMDgiKTsKKworICBUVC5jb25maWdfZmlsZSA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSA/CisgICAgICAgICAgICAgICAgICAgVFQuY29uZmlnX2ZpbGUgOiAiL2V0Yy9zeXNsb2cuY29uZiI7IC8vREVGQ09ORkZJTEUKK2luaXRfanVtcGluOgorICB0c2QgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgdW5zb2NrcykpOworCisgIHRzZC0+cGF0aCA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19wKSA/IFRULnVuaXhfc29ja2V0IDogIi9kZXYvbG9nIjsgLy8gREVGTE9HU09DSworICBUVC5sc29ja3MgPSB0c2Q7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpIHsKKyAgICBmb3IgKHRlbXAgPSBzdHJ0b2soVFQuc29ja2V0LCAiOiIpOyB0ZW1wOyB0ZW1wID0gc3RydG9rKE5VTEwsICI6IikpIHsKKyAgICAgIGlmIChzdHJsZW4odGVtcCkgPiAxMDcpIHRlbXBbMTA4XSA9ICdcMCc7CisgICAgICB0c2QgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgdW5zb2NrcykpOworICAgICAgdHNkLT5wYXRoID0gdGVtcDsKKyAgICAgIHRzZC0+bmV4dCA9IFRULmxzb2NrczsKKyAgICAgIFRULmxzb2NrcyA9IHRzZDsKKyAgICB9CisgIH0KKyAgLyoKKyAgICogaW5pdGlhbGl6ZXMgdW5zb2NrX3Qgc3RydWN0dXJlCisgICAqIGFuZCBvcGVucyBzb2NrZXQgZm9yIHJlYWRpbmcKKyAgICogYW5kIGFkZHMgdG8gZ2xvYmFsIGxzb2NrIGxpc3QuCisgICovCisgIG5mZHMgPSAwOworICBmb3IgKHRzZCA9IFRULmxzb2NrczsgdHNkOyB0c2QgPSB0c2QtPm5leHQpIHsKKyAgICB0c2QtPnNkdS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBzdHJjcHkodHNkLT5zZHUuc3VuX3BhdGgsIHRzZC0+cGF0aCk7CisgICAgdHNkLT5zZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAodHNkLT5zZCA8IDApIHsKKyAgICAgIHBlcnJvcl9tc2coIk9QRU4gU09DS1MgOiBmYWlsZWQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1bmxpbmsodHNkLT5zZHUuc3VuX3BhdGgpOworICAgIGlmIChiaW5kKHRzZC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnRzZC0+c2R1LCBzaXplb2YodHNkLT5zZHUpKSkgeworICAgICAgcGVycm9yX21zZygiQklORCBTT0NLUyA6IGZhaWxlZCBzb2NrIDogJXMiLCB0c2QtPnNkdS5zdW5fcGF0aCk7CisgICAgICBjbG9zZSh0c2QtPnNkKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjaG1vZCh0c2QtPnBhdGgsIDA3NzcpOworICAgIG5mZHMrKzsKKyAgfQorICBpZiAoIW5mZHMpIHsKKyAgICBlcnJvcl9tc2coIkNhbid0IG9wZW4gc2luZ2xlIHNvY2tldCBmb3IgbGlzdGVubmluZy4iKTsKKyAgICBnb3RvIGNsZWFuX2FuZF9leGl0OworICB9CisKKyAgLy8gU2V0dXAgc2lnbmFscworICB4cGlwZShUVC5zaWdmZCk7CisKKyAgZmNudGwoVFQuc2lnZmRbMV0gLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgZmNudGwoVFQuc2lnZmRbMF0gLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgaW50IGZsYWdzID0gZmNudGwoVFQuc2lnZmRbMV0sIEZfR0VURkwpOworICBmY250bChUVC5zaWdmZFsxXSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKyAgc2lnbmFsKFNJR0hVUCwgc2lnbmFsX2hhbmRsZXIpOworICBzaWduYWwoU0lHVEVSTSwgc2lnbmFsX2hhbmRsZXIpOworICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisgIHNpZ25hbChTSUdRVUlULCBzaWduYWxfaGFuZGxlcik7CisKKyAgaWYgKHBhcnNlX2NvbmZpZ19maWxlKCkgPT0gLTEpIGdvdG8gY2xlYW5fYW5kX2V4aXQ7CisgIG9wZW5fbG9nZmlsZXMoKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbikpIHsKKyAgICBkYWVtb24oMCwgMCk7CisgICAgLy9kb24ndCBkYWVtb25pemUgYWdhaW4gaWYgU0lHSFVQIHJlY2VpdmVkLgorICAgIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19uOworICB9CisgIHhwaWRmaWxlKCJzeXNsb2dkIik7CisKKyAgbG9nbXNnKCI8NDY+VG95Ym94OiBzeXNsb2dkIHN0YXJ0ZWQiLCAyNyk7IC8vMjcgOiB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UKKyAgZm9yICg7OykgeworICAgIC8vIEFkZCBvcGVuZWQgc29ja3MgdG8gcmZkcyBmb3Igc2VsZWN0KCkKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBmb3IgKHRzZCA9IFRULmxzb2NrczsgdHNkOyB0c2QgPSB0c2QtPm5leHQpIEZEX1NFVCh0c2QtPnNkLCAmcmZkcyk7CisgICAgRkRfU0VUKFRULnNpZ2ZkWzBdLCAmcmZkcyk7CisgICAgdHYudHZfdXNlYyA9IDA7CisgICAgdHYudHZfc2VjID0gVFQuaW50ZXJ2YWwqNjA7CisKKyAgICByZXR2YWwgPSBzZWxlY3QoVFQuc2lnZmRbMF0gKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgKFRULmludGVydmFsKT8mdHY6TlVMTCk7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgcGVycm9yX21zZygiRXJyb3IgaW4gc2VsZWN0ICIpOworICAgIH0KKyAgICBlbHNlIGlmICghcmV0dmFsKSBsb2dtc2coIjw0Nj4tLSBNQVJLIC0tIiwgMTQpOworICAgIGVsc2UgaWYgKEZEX0lTU0VUKFRULnNpZ2ZkWzBdLCAmcmZkcykpIHsgLyogTWF5IGJlIGEgc2lnbmFsICovCisgICAgICB1bnNpZ25lZCBjaGFyIHNpZzsKKworICAgICAgaWYgKHJlYWQoVFQuc2lnZmRbMF0sICZzaWcsIDEpICE9IDEpIHsKKyAgICAgICAgZXJyb3JfbXNnKCJzaWduYWwgcmVhZCBmYWlsZWQuXG4iKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzd2l0Y2goc2lnKSB7CisgICAgICAgIGNhc2UgU0lHVEVSTTogICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgY2FzZSBTSUdJTlQ6ICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICBjYXNlIFNJR1FVSVQ6CisgICAgICAgICAgbG9nbXNnKCI8NDY+c3lzbG9nZCBleGl0aW5nIiwgMTkpOworICAgICAgICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUgKSBjbGVhbnVwKCk7CisgICAgICAgICAgc2lnbmFsKHNpZywgU0lHX0RGTCk7CisgICAgICAgICAgc2lnc2V0X3Qgc3M7CisgICAgICAgICAgc2lnZW1wdHlzZXQoJnNzKTsKKyAgICAgICAgICBzaWdhZGRzZXQoJnNzLCBzaWcpOworICAgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc3MsIE5VTEwpOworICAgICAgICAgIHJhaXNlKHNpZyk7CisgICAgICAgICAgX2V4aXQoMSk7ICAvKiBTaG91bGQgbm90IHJlYWNoIGl0ICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lHSFVQOgorICAgICAgICAgIGxvZ21zZygiPDQ2PnN5c2xvZ2QgZXhpdGluZyIsIDE5KTsKKyAgICAgICAgICBjbGVhbnVwKCk7IC8vY2xlYW51cCBpcyBkb25lLCBhcyB3ZSByZXN0YXJ0IHN5c2xvZy4KKyAgICAgICAgICBnb3RvIGluaXRfanVtcGluOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBTb21lIGFjdGl2aXR5IG9uIGxpc3RlbiBzb2NrZXRzLiAqLworICAgICAgZm9yICh0c2QgPSBUVC5sc29ja3M7IHRzZDsgdHNkID0gdHNkLT5uZXh0KSB7CisgICAgICAgIGludCBzZCA9IHRzZC0+c2Q7CisgICAgICAgIGlmIChGRF9JU1NFVChzZCwgJnJmZHMpKSB7CisgICAgICAgICAgaW50IGxlbiA9IHJlYWQoc2QsIGJ1ZmZlciwgMTAyMyk7IC8vYnVmZmVyIGlzIG9mIDFLLCBoZW5jZSByZWFkaW5nb25seSAxMDIzIGJ5dGVzLCAxIGZvciBOVUwKKyAgICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgaWYoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpICYmIChsZW4gPT0gbGFzdF9sZW4pKQorICAgICAgICAgICAgICBpZiAoIW1lbWNtcChsYXN0X2J1ZiwgYnVmZmVyLCBsZW4pKSBicmVhazsKKworICAgICAgICAgICAgbWVtY3B5KGxhc3RfYnVmLCBidWZmZXIsIGxlbik7CisgICAgICAgICAgICBsYXN0X2xlbiA9IGxlbjsKKyAgICAgICAgICAgIGxvZ21zZyhidWZmZXIsIGxlbik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CitjbGVhbl9hbmRfZXhpdDoKKyAgbG9nbXNnKCI8NDY+c3lzbG9nZCBleGl0aW5nIiwgMTkpOworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFICkgY2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90YXIuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0MTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvdGFyLmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qIHRhci5jIC0gY3JlYXRlL2V4dHJhY3QgYXJjaGl2ZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pODFAZ21haWwuY29tPgorICoKKyAqIFVTVEFSIGludGVyY2hhbmdlIGZvcm1hdCBpcyBvZiBpbnRlcmVzdCBpbgorICogU2VlIGh0dHA6Ly9odHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcGF4Lmh0bWwKKyAqIEZvciB3cml0aW5nIHRvIGV4dGVybmFsIHByb2dyYW0KKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvbWFudWFsL2h0bWxfbm9kZS9Xcml0aW5nLXRvLWFuLUV4dGVybmFsLVByb2dyYW0uaHRtbAorCitVU0VfVEFSKE5FV1RPWSh0YXIsICImKG5vLXJlY3Vyc2lvbikobnVtZXJpYy1vd25lcikobm8tc2FtZS1wZXJtaXNzaW9ucykob3ZlcndyaXRlKShleGNsdWRlKSoodG8tY29tbWFuZCk6byhuby1zYW1lLW93bmVyKXAoc2FtZS1wZXJtaXNzaW9ucylrKGtlZXAtb2xkKWMoY3JlYXRlKXxoKGRlcmVmZXJlbmNlKXgoZXh0cmFjdCl8dChsaXN0KXx2KHZlcmJvc2UpeihnemlwKU8odG8tc3Rkb3V0KW0odG91Y2gpWChleGNsdWRlLWZyb20pKlQoZmlsZXMtZnJvbSkqQyhkaXJlY3RvcnkpOmYoZmlsZSk6WyF0eGNdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgVEFSCisgIGJvb2wgInRhciIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogdGFyIC1bY3h0emhtdk9dIFstWCBGSUxFXSBbLVQgRklMRV0gWy1mIFRBUkZJTEVdIFstQyBESVJdCisKKyAgICBDcmVhdGUsIGV4dHJhY3QsIG9yIGxpc3QgZmlsZXMgZnJvbSBhIHRhciBmaWxlCisKKyAgICBPcGVyYXRpb246CisgICAgYyBDcmVhdGUKKyAgICBmIE5hbWUgb2YgVEFSRklMRSAoJy0nIGZvciBzdGRpbi9vdXQpCisgICAgaCBGb2xsb3cgc3ltbGlua3MKKyAgICBtIERvbid0IHJlc3RvcmUgbXRpbWUKKyAgICB0IExpc3QKKyAgICB2IFZlcmJvc2UKKyAgICB4IEV4dHJhY3QKKyAgICB6IChEZSljb21wcmVzcyB1c2luZyBnemlwCisgICAgQyBDaGFuZ2UgdG8gRElSIGJlZm9yZSBvcGVyYXRpb24KKyAgICBPIEV4dHJhY3QgdG8gc3Rkb3V0CisgICAgZXhjbHVkZT1GSUxFIEZpbGUgdG8gZXhjbHVkZQorICAgIFggRmlsZSB3aXRoIG5hbWVzIHRvIGV4Y2x1ZGUKKyAgICBUIEZpbGUgd2l0aCBuYW1lcyB0byBpbmNsdWRlCisqLworCisjZGVmaW5lIEZPUl90YXIKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmZuYW1lOworICBjaGFyICpkaXI7CisgIHN0cnVjdCBhcmdfbGlzdCAqaW5jX2ZpbGU7CisgIHN0cnVjdCBhcmdfbGlzdCAqZXhjX2ZpbGU7CisgIGNoYXIgKnRvY21kOworICBzdHJ1Y3QgYXJnX2xpc3QgKmV4YzsKKworICBzdHJ1Y3QgYXJnX2xpc3QgKmluYywgKnBhc3M7CisgIHZvaWQgKmlub2RlcywgKmhhbmRsZTsKKykKKworc3RydWN0IHRhcl9oZHIgeworICBjaGFyIG5hbWVbMTAwXSwgbW9kZVs4XSwgdWlkWzhdLCBnaWRbOF0sc2l6ZVsxMl0sIG10aW1lWzEyXSwgY2hrc3VtWzhdLAorICAgICAgIHR5cGUsIGxpbmtbMTAwXSwgbWFnaWNbOF0sIHVuYW1lWzMyXSwgZ25hbWVbMzJdLCBtYWpvcls4XSwgbWlub3JbOF0sCisgICAgICAgcHJlZml4WzE1NV0sIHBhZGRbMTJdOworfTsKKworc3RydWN0IGZpbGVfaGVhZGVyIHsKKyAgY2hhciAqbmFtZSwgKmxpbmtfdGFyZ2V0LCAqdW5hbWUsICpnbmFtZTsKKyAgb2ZmX3Qgc2l6ZTsKKyAgdWlkX3QgdWlkOworICBnaWRfdCBnaWQ7CisgIG1vZGVfdCBtb2RlOworICB0aW1lX3QgbXRpbWU7CisgIGRldl90IGRldmljZTsKK307CisKK3N0cnVjdCBhcmNoaXZlX2hhbmRsZXIgeworICBpbnQgc3JjX2ZkOworICBzdHJ1Y3QgZmlsZV9oZWFkZXIgZmlsZV9oZHI7CisgIG9mZl90IG9mZnNldDsKKyAgdm9pZCAoKmV4dHJhY3RfaGFuZGxlcikoc3RydWN0IGFyY2hpdmVfaGFuZGxlciopOworfTsKKworc3RydWN0IGlub2RlX2xpc3QgeworICBzdHJ1Y3QgaW5vZGVfbGlzdCAqbmV4dDsKKyAgY2hhciAqYXJnOworICBpbm9fdCBpbm87CisgIGRldl90IGRldjsKK307CisKK3N0YXRpYyB2b2lkIGNvcHlfaW5fb3V0KGludCBzcmMsIGludCBkc3QsIG9mZl90IHNpemUpCit7CisgIGludCBpLCByZCwgcmVtID0gc2l6ZSU1MTIsIGNudDsKKyAgCisgIGNudCA9IHNpemUvNTEyICsgKHJlbT8xOjApOworCisgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgIHJkID0gKGkgPT0gY250LTEgJiYgcmVtKSA/IHJlbSA6IDUxMjsKKyAgICB4cmVhZGFsbChzcmMsIHRveWJ1ZiwgcmQpOworICAgIHdyaXRlYWxsKGRzdCwgdG95YnVmLCByZCk7CisgIH0KK30KKworLy9jb252ZXJ0IHRvIG9jdGFsCitzdGF0aWMgdm9pZCBpdG9vKGNoYXIgKnN0ciwgaW50IGxlbiwgb2ZmX3QgdmFsKQoreworICBjaGFyICp0LCB0bXBbc2l6ZW9mKG9mZl90KSozKzFdOworICBpbnQgY250ICA9IHNwcmludGYodG1wLCAiJTAqbGxvIiwgbGVuLCAodW5zaWduZWQgbG9uZyBsb25nKXZhbCk7CisKKyAgdCA9IHRtcCArIGNudCAtIGxlbjsKKyAgaWYgKCp0ID09ICcwJykgdCsrOworICBtZW1jcHkoc3RyLCB0LCBsZW4pOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX2xpc3QgKnNlZW5faW5vZGUodm9pZCAqKmxpc3QsIHN0cnVjdCBzdGF0ICpzdCwgY2hhciAqbmFtZSkKK3sKKyAgaWYgKCFzdCkgbGxpc3RfdHJhdmVyc2UoKmxpc3QsIGxsaXN0X2ZyZWVfYXJnKTsKKyAgZWxzZSBpZiAoIVNfSVNESVIoc3QtPnN0X21vZGUpICYmIHN0LT5zdF9ubGluayA+IDEpIHsKKyAgICBzdHJ1Y3QgaW5vZGVfbGlzdCAqbmV3OworCisgICAgZm9yIChuZXcgPSAqbGlzdDsgbmV3OyBuZXcgPSBuZXctPm5leHQpCisgICAgICBpZihuZXctPmlubyA9PSBzdC0+c3RfaW5vICYmIG5ldy0+ZGV2ID09IHN0LT5zdF9kZXYpCisgICAgICAgIHJldHVybiBuZXc7CisKKyAgICBuZXcgPSB4emFsbG9jKHNpemVvZigqbmV3KSk7CisgICAgbmV3LT5pbm8gPSBzdC0+c3RfaW5vOworICAgIG5ldy0+ZGV2ID0gc3QtPnN0X2RldjsKKyAgICBuZXctPmFyZyA9IHhzdHJkdXAobmFtZSk7CisgICAgbmV3LT5uZXh0ID0gKmxpc3Q7CisgICAgKmxpc3QgPSBuZXc7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xvbmduYW1lKHN0cnVjdCBhcmNoaXZlX2hhbmRsZXIgKnRhciwgY2hhciAqbmFtZSwgY2hhciB0eXBlKQoreworICBzdHJ1Y3QgdGFyX2hkciB0bXA7CisgIHVuc2lnbmVkIGludCBzdW0gPSAwOworICBpbnQgaSwgc3ogPSBzdHJsZW4obmFtZSkgKzE7CisgIGNoYXIgYnVmWzUxMl0gPSB7MCx9OworCisgIG1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisgIHN0cmNweSh0bXAubmFtZSwgIi4vLi9ATG9uZ0xpbmsiKTsKKyAgc3ByaW50Zih0bXAubW9kZSwgIiUwKmQiLCAoaW50KXNpemVvZih0bXAubW9kZSktMSwgMCk7CisgIHNwcmludGYodG1wLnVpZCwgIiUwKmQiLCAoaW50KXNpemVvZih0bXAudWlkKS0xLCAwKTsKKyAgc3ByaW50Zih0bXAuZ2lkLCAiJTAqZCIsIChpbnQpc2l6ZW9mKHRtcC5naWQpLTEsIDApOworICBzcHJpbnRmKHRtcC5zaXplLCAiJTAqZCIsIChpbnQpc2l6ZW9mKHRtcC5zaXplKS0xLCAwKTsKKyAgc3ByaW50Zih0bXAubXRpbWUsICIlMCpkIiwgKGludClzaXplb2YodG1wLm10aW1lKS0xLCAwKTsKKyAgaXRvbyh0bXAuc2l6ZSwgc2l6ZW9mKHRtcC5zaXplKSwgc3opOworICB0bXAudHlwZSA9IHR5cGU7CisgIG1lbXNldCh0bXAuY2hrc3VtLCAnICcsIDgpOworICBzdHJjcHkodG1wLm1hZ2ljLCAidXN0YXIgICIpOworICBmb3IgKGk9IDA7IGkgPCA1MTI7IGkrKykgc3VtICs9ICh1bnNpZ25lZCBpbnQpKChjaGFyKikmdG1wKVtpXTsKKyAgaXRvbyh0bXAuY2hrc3VtLCBzaXplb2YodG1wLmNoa3N1bSktMSwgc3VtKTsKKworICB3cml0ZWFsbCh0YXItPnNyY19mZCwgKHZvaWQqKSAmdG1wLCBzaXplb2YodG1wKSk7CisgIC8vd3JpdGUgbmFtZSB0byBhcmNoaXZlCisgIHdyaXRlYWxsKHRhci0+c3JjX2ZkLCBuYW1lLCBzeik7CisgIGlmIChzeiU1MTIpIHdyaXRlYWxsKHRhci0+c3JjX2ZkLCBidWYsICg1MTItKHN6JTUxMikpKTsKK30KKworc3RhdGljIGludCBmaWx0ZXIoc3RydWN0IGFyZ19saXN0ICpsc3QsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBhcmdfbGlzdCAqY3VyOworCisgIGZvciAoY3VyID0gbHN0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKyAgICBpZiAoIWZubWF0Y2goY3VyLT5hcmcsIG5hbWUsIDE8PDMpKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9maWxlKHN0cnVjdCBhcmNoaXZlX2hhbmRsZXIgKnRhciwgY2hhciAqKm5hbSwgc3RydWN0IHN0YXQgKnN0KQoreworICBzdHJ1Y3QgdGFyX2hkciBoZHI7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworICBzdHJ1Y3QgZ3JvdXAgKmdyOworICBzdHJ1Y3QgaW5vZGVfbGlzdCAqbm9kZTsKKyAgaW50IGksIGZkID0tMTsKKyAgY2hhciAqYywgKnAsICpuYW1lID0gKm5hbSwgKmxuaywgKmhuYW1lLCBidWZbNTEyXSA9IHswLH07CisgIHVuc2lnbmVkIGludCBzdW0gPSAwOworICBzdGF0aWMgaW50IHdhcm4gPSAxOworCisgIGZvciAocCA9IG5hbWU7ICpwOyBwKyspCisgICAgaWYgKChwID09IG5hbWUgfHwgcFstMV0gPT0gJy8nKSAmJiAqcCAhPSAnLycKKyAgICAgICAgJiYgZmlsdGVyKFRULmV4YywgcCkpIHJldHVybjsKKworICBpZiAoU19JU0RJUihzdC0+c3RfbW9kZSkgJiYgbmFtZVtzdHJsZW4obmFtZSktMV0gIT0gJy8nKSB7CisgICAgbG5rID0geG1wcmludGYoIiVzLyIsbmFtZSk7CisgICAgZnJlZShuYW1lKTsKKyAgICAqbmFtID0gbmFtZSA9IGxuazsKKyAgfQorICBobmFtZSA9IG5hbWU7CisgIC8vcmVtb3ZlIGxlYWRpbmcgJy8nIG9yIHJlbGF0aXZlIHBhdGggJy4uLycgY29tcG9uZW50CisgIGlmICgqaG5hbWUgPT0gJy8nKSBobmFtZSsrOworICBpZiAoISpobmFtZSkgcmV0dXJuOworICB3aGlsZSAoKGMgPSBzdHJzdHIoaG5hbWUsICIuLi8iKSkpIGhuYW1lID0gYyArIDM7CisgIGlmICh3YXJuICYmIGhuYW1lICE9IG5hbWUpIHsKKyAgICBwcmludGYoInJlbW92aW5nIGxlYWRpbmcgJyUuKnMnICIKKyAgICAgICAgImZyb20gbWVtYmVyIG5hbWVzXG4iLCAoaW50KShobmFtZS1uYW1lKSwgbmFtZSk7CisgICAgd2FybiA9IDA7CisgIH0KKworICBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworICBzdHJuY3B5KGhkci5uYW1lLCBobmFtZSwgc2l6ZW9mKGhkci5uYW1lKSk7CisgIGl0b28oaGRyLm1vZGUsIHNpemVvZihoZHIubW9kZSksIHN0LT5zdF9tb2RlICYwNzc3Nyk7CisgIGl0b28oaGRyLnVpZCwgc2l6ZW9mKGhkci51aWQpLCBzdC0+c3RfdWlkKTsKKyAgaXRvbyhoZHIuZ2lkLCBzaXplb2YoaGRyLmdpZCksIHN0LT5zdF9naWQpOworICBpdG9vKGhkci5zaXplLCBzaXplb2YoaGRyLnNpemUpLCAwKTsgLy9zZXQgc2l6ZSBsYXRlcgorICBpdG9vKGhkci5tdGltZSwgc2l6ZW9mKGhkci5tdGltZSksIHN0LT5zdF9tdGltZSk7CisgIGZvciAoaT0wOyBpPHNpemVvZihoZHIuY2hrc3VtKTsgaSsrKSBoZHIuY2hrc3VtW2ldID0gJyAnOworCisgIGlmICgobm9kZSA9IHNlZW5faW5vZGUoJlRULmlub2Rlcywgc3QsIGhuYW1lKSkpIHsKKyAgICAvL3RoaXMgaXMgYSBoYXJkIGxpbmsKKyAgICBoZHIudHlwZSA9ICcxJzsKKyAgICBpZiAoc3RybGVuKG5vZGUtPmFyZykgPiBzaXplb2YoaGRyLmxpbmspKQorICAgICAgd3JpdGVfbG9uZ25hbWUodGFyLCBobmFtZSwgJ0snKTsgLy93cml0ZSBsb25nbmFtZSBMSU5LCisgICAgeHN0cm5jcHkoaGRyLmxpbmssIG5vZGUtPmFyZywgc2l6ZW9mKGhkci5saW5rKSk7CisgIH0gZWxzZSBpZiAoU19JU1JFRyhzdC0+c3RfbW9kZSkpIHsKKyAgICBoZHIudHlwZSA9ICcwJzsKKyAgICBpZiAoc3QtPnN0X3NpemUgPD0gKG9mZl90KTA3Nzc3Nzc3Nzc3NzdMTCkKKyAgICAgIGl0b28oaGRyLnNpemUsIHNpemVvZihoZHIuc2l6ZSksIHN0LT5zdF9zaXplKTsKKyAgICBlbHNlIHsKKyAgICAgIGVycm9yX21zZygiY2FuJ3Qgc3RvcmUgZmlsZSAnJXMnIG9mIHNpemUgJyVsbGQnXG4iLAorICAgICAgICAgICAgICAgIGhuYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXN0LT5zdF9zaXplKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAoU19JU0xOSyhzdC0+c3RfbW9kZSkpIHsKKyAgICBoZHIudHlwZSA9ICcyJzsgLy8nSycgbG9uZyBsaW5rCisgICAgaWYgKCEobG5rID0geHJlYWRsaW5rKG5hbWUpKSkgeworICAgICAgcGVycm9yX21zZygicmVhZGxpbmsiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cmxlbihsbmspID4gc2l6ZW9mKGhkci5saW5rKSkKKyAgICAgIHdyaXRlX2xvbmduYW1lKHRhciwgaG5hbWUsICdLJyk7IC8vd3JpdGUgbG9uZ25hbWUgTElOSworICAgIHhzdHJuY3B5KGhkci5saW5rLCBsbmssIHNpemVvZihoZHIubGluaykpOworICAgIGZyZWUobG5rKTsKKyAgfQorICBlbHNlIGlmIChTX0lTRElSKHN0LT5zdF9tb2RlKSkgaGRyLnR5cGUgPSAnNSc7CisgIGVsc2UgaWYgKFNfSVNGSUZPKHN0LT5zdF9tb2RlKSkgaGRyLnR5cGUgPSAnNic7CisgIGVsc2UgaWYgKFNfSVNCTEsoc3QtPnN0X21vZGUpIHx8IFNfSVNDSFIoc3QtPnN0X21vZGUpKSB7CisgICAgaGRyLnR5cGUgPSAoU19JU0NIUihzdC0+c3RfbW9kZSkpPyczJzonNCc7CisgICAgaXRvbyhoZHIubWFqb3IsIHNpemVvZihoZHIubWFqb3IpLCBkZXZfbWFqb3Ioc3QtPnN0X3JkZXYpKTsKKyAgICBpdG9vKGhkci5taW5vciwgc2l6ZW9mKGhkci5taW5vciksIGRldl9taW5vcihzdC0+c3RfcmRldikpOworICB9IGVsc2UgeworICAgIGVycm9yX21zZygidW5rbm93biBmaWxlIHR5cGUgJyVvJyIsIHN0LT5zdF9tb2RlICYgU19JRk1UKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHN0cmxlbihobmFtZSkgPiBzaXplb2YoaGRyLm5hbWUpKQorICAgICAgICAgIHdyaXRlX2xvbmduYW1lKHRhciwgaG5hbWUsICdMJyk7IC8vd3JpdGUgbG9uZ25hbWUgTkFNRQorICBzdHJjcHkoaGRyLm1hZ2ljLCAidXN0YXIgICIpOworICBpZiAoKHB3ID0gZ2V0cHd1aWQoc3QtPnN0X3VpZCkpKQorICAgIHNucHJpbnRmKGhkci51bmFtZSwgc2l6ZW9mKGhkci51bmFtZSksICIlcyIsIHB3LT5wd19uYW1lKTsKKyAgZWxzZSBzbnByaW50ZihoZHIudW5hbWUsIHNpemVvZihoZHIudW5hbWUpLCAiJWQiLCBzdC0+c3RfdWlkKTsKKworICBpZiAoKGdyID0gZ2V0Z3JnaWQoc3QtPnN0X2dpZCkpKQorICAgIHNucHJpbnRmKGhkci5nbmFtZSwgc2l6ZW9mKGhkci5nbmFtZSksICIlcyIsIGdyLT5ncl9uYW1lKTsKKyAgZWxzZSBzbnByaW50ZihoZHIuZ25hbWUsIHNpemVvZihoZHIuZ25hbWUpLCAiJWQiLCBzdC0+c3RfZ2lkKTsKKworICAvL2NhbGN1bGF0ZSBjaGtzdW0uCisgIGZvciAoaT0gMDsgaSA8IDUxMjsgaSsrKSBzdW0gKz0gKHVuc2lnbmVkIGludCkoKGNoYXIqKSZoZHIpW2ldOworICBpdG9vKGhkci5jaGtzdW0sIHNpemVvZihoZHIuY2hrc3VtKS0xLCBzdW0pOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgcHJpbnRmKCIlc1xuIixobmFtZSk7CisgIHdyaXRlYWxsKHRhci0+c3JjX2ZkLCAodm9pZCopJmhkciwgNTEyKTsKKworICAvL3dyaXRlIGFjdHVhbCBkYXRhIHRvIGFyY2hpdmUKKyAgaWYgKGhkci50eXBlICE9ICcwJykgcmV0dXJuOyAvL25vdGhpbmcgdG8gd3JpdGUKKyAgaWYgKChmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpKSA8IDApIHsKKyAgICBwZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgY29weV9pbl9vdXQoZmQsIHRhci0+c3JjX2ZkLCBzdC0+c3Rfc2l6ZSk7CisgIGlmIChzdC0+c3Rfc2l6ZSU1MTIpIHdyaXRlYWxsKHRhci0+c3JjX2ZkLCBidWYsICg1MTItKHN0LT5zdF9zaXplJTUxMikpKTsKKyAgY2xvc2UoZmQpOworfQorCitzdGF0aWMgaW50IGFkZF90b190YXIoc3RydWN0IGRpcnRyZWUgKm5vZGUpCit7CisgIHN0cnVjdCBzdGF0IHN0OworICBjaGFyICpwYXRoOworICBzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVyICpoZGwgPSAoc3RydWN0IGFyY2hpdmVfaGFuZGxlciopVFQuaGFuZGxlOworCisgIGlmICghZnN0YXQoaGRsLT5zcmNfZmQsICZzdCkgJiYgc3Quc3RfZGV2ID09IG5vZGUtPnN0LnN0X2RldgorICAgICAgJiYgc3Quc3RfaW5vID09IG5vZGUtPnN0LnN0X2lubykgeworICAgIGVycm9yX21zZygiJyVzJyBmaWxlIGlzIHRoZSBhcmNoaXZlOyBub3QgZHVtcGVkIiwgVFQuZm5hbWUpOworICAgIHJldHVybiAoKERJUlRSRUVfUkVDVVJTRSB8ICgodG95cy5vcHRmbGFncyAmIEZMQUdfaCk/RElSVFJFRV9TWU1GT0xMT1c6MCkpKTsKKyAgfQorCisgIGlmIChub2RlLT5wYXJlbnQgJiYgIWRpcnRyZWVfbm90ZG90ZG90KG5vZGUpKSByZXR1cm4gMDsKKyAgcGF0aCA9IGRpcnRyZWVfcGF0aChub2RlLCAwKTsKKyAgYWRkX2ZpbGUoaGRsLCAmcGF0aCwgJihub2RlLT5zdCkpOyAvL3BhdGggbWF5IGJlIG1vZGlmaWVkCisgIGZyZWUocGF0aCk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19ub19yZWN1cnNpb24pIHJldHVybiAwOworICByZXR1cm4gKChESVJUUkVFX1JFQ1VSU0UgfCAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2gpP0RJUlRSRUVfU1lNRk9MTE9XOjApKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXByZXNzX3N0cmVhbShzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVyICp0YXJfaGRsKQoreworICBpbnQgcGlwZWZkWzJdOworICBwaWRfdCBjcGlkOworCisgIHhwaXBlKHBpcGVmZCk7CisKKyAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICBjcGlkID0gZm9yaygpOworICBpZiAoY3BpZCA9PSAtMSkgcGVycm9yX2V4aXQoImZvcmsiKTsKKworICBpZiAoIWNwaWQpIHsgICAgLyogQ2hpbGQgcmVhZHMgZnJvbSBwaXBlICovCisgICAgY2hhciAqYXJndltdID0geyJnemlwIiwgIi1mIiwgTlVMTH07CisgICAgeGNsb3NlKHBpcGVmZFsxXSk7IC8qIENsb3NlIHVudXNlZCB3cml0ZSovCisgICAgZHVwMihwaXBlZmRbMF0sIDApOworICAgIGR1cDIodGFyX2hkbC0+c3JjX2ZkLCAxKTsgLy93cml0ZSB0byB0YXIgZmQKKyAgICB4ZXhlYyhhcmd2KTsKKyAgfSBlbHNlIHsKKyAgICB4Y2xvc2UocGlwZWZkWzBdKTsgICAgICAgICAgLyogQ2xvc2UgdW51c2VkIHJlYWQgZW5kICovCisgICAgZHVwMihwaXBlZmRbMV0sIHRhcl9oZGwtPnNyY19mZCk7IC8vd3JpdGUgdG8gcGlwZQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfdG9fc3Rkb3V0KHN0cnVjdCBhcmNoaXZlX2hhbmRsZXIgKnRhcikKK3sKKyAgc3RydWN0IGZpbGVfaGVhZGVyICpmaWxlX2hkciA9ICZ0YXItPmZpbGVfaGRyOworCisgIGNvcHlfaW5fb3V0KHRhci0+c3JjX2ZkLCAwLCBmaWxlX2hkci0+c2l6ZSk7CisgIHRhci0+b2Zmc2V0ICs9IGZpbGVfaGRyLT5zaXplOworfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X3RvX2NvbW1hbmQoc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyKQoreworICBpbnQgcGlwZWZkWzJdLCBzdGF0dXMgPSAwOworICBwaWRfdCBjcGlkOworICBzdHJ1Y3QgZmlsZV9oZWFkZXIgKmZpbGVfaGRyID0gJnRhci0+ZmlsZV9oZHI7CisKKyAgaWYgKHBpcGUocGlwZWZkKSA9PSAtMSkgZXJyb3JfZXhpdCgicGlwZSIpOworICBpZiAoIVNfSVNSRUcoZmlsZV9oZHItPm1vZGUpKSByZXR1cm47IC8vb25seSByZWd1bGFyIGZpbGVzIGFyZSBzdXBwb3J0ZWQuCisKKyAgY3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNwaWQgPT0gLTEpIHBlcnJvcl9leGl0KCJmb3JrIik7CisKKyAgaWYgKCFjcGlkKSB7ICAgIC8vIENoaWxkIHJlYWRzIGZyb20gcGlwZQorICAgIGNoYXIgYnVmWzY0XSwgKmFyZ3ZbNF0gPSB7InNoIiwgIi1jIiwgVFQudG9jbWQsIE5VTEx9OworCisgICAgc2V0ZW52KCJUQVJfRklMRVRZUEUiLCAiZiIsIDEpOworICAgIHNwcmludGYoYnVmLCAiJTBvIiwgZmlsZV9oZHItPm1vZGUpOworICAgIHNldGVudigiVEFSX01PREUiLCBidWYsIDEpOworICAgIHNwcmludGYoYnVmLCAiJWxkIiwgKGxvbmcpZmlsZV9oZHItPnNpemUpOworICAgIHNldGVudigiVEFSX1NJWkUiLCBidWYsIDEpOworICAgIHNldGVudigiVEFSX0ZJTEVOQU1FIiwgZmlsZV9oZHItPm5hbWUsIDEpOworICAgIHNldGVudigiVEFSX1VOQU1FIiwgZmlsZV9oZHItPnVuYW1lLCAxKTsKKyAgICBzZXRlbnYoIlRBUl9HTkFNRSIsIGZpbGVfaGRyLT5nbmFtZSwgMSk7CisgICAgc3ByaW50ZihidWYsICIlMG8iLCAoaW50KWZpbGVfaGRyLT5tdGltZSk7CisgICAgc2V0ZW52KCJUQVJfTVRJTUUiLCBidWYsIDEpOworICAgIHNwcmludGYoYnVmLCAiJTBvIiwgZmlsZV9oZHItPnVpZCk7CisgICAgc2V0ZW52KCJUQVJfVUlEIiwgYnVmLCAxKTsKKyAgICBzcHJpbnRmKGJ1ZiwgIiUwbyIsIGZpbGVfaGRyLT5naWQpOworICAgIHNldGVudigiVEFSX0dJRCIsIGJ1ZiwgMSk7CisKKyAgICB4Y2xvc2UocGlwZWZkWzFdKTsgLy8gQ2xvc2UgdW51c2VkIHdyaXRlCisgICAgZHVwMihwaXBlZmRbMF0sIDApOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyAgICB4ZXhlYyhhcmd2KTsKKyAgfSBlbHNlIHsKKyAgICB4Y2xvc2UocGlwZWZkWzBdKTsgIC8vIENsb3NlIHVudXNlZCByZWFkIGVuZAorICAgIGNvcHlfaW5fb3V0KHRhci0+c3JjX2ZkLCBwaXBlZmRbMV0sIGZpbGVfaGRyLT5zaXplKTsKKyAgICB0YXItPm9mZnNldCArPSBmaWxlX2hkci0+c2l6ZTsKKyAgICB4Y2xvc2UocGlwZWZkWzFdKTsKKyAgICB3YWl0cGlkKGNwaWQsICZzdGF0dXMsIDApOworICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorICAgICAgeHByaW50ZigidGFyIDogJWQ6IGNoaWxkIHJldHVybmVkICVkXG4iLCBjcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X3RvX2Rpc2soc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyKQoreworICBpbnQgZmxhZ3MsIGRzdF9mZCA9IC0xOworICBjaGFyICpzOworICBzdHJ1Y3Qgc3RhdCBleDsKKyAgc3RydWN0IGZpbGVfaGVhZGVyICpmaWxlX2hkciA9ICZ0YXItPmZpbGVfaGRyOworCisgIGlmIChmaWxlX2hkci0+bmFtZVtzdHJsZW4oZmlsZV9oZHItPm5hbWUpLTFdID09ICcvJykKKyAgICBmaWxlX2hkci0+bmFtZVtzdHJsZW4oZmlsZV9oZHItPm5hbWUpLTFdID0gMDsKKyAgLy9SZWd1bGFyIGZpbGUgd2l0aCBwcmVjZWRpbmcgcGF0aAorICBpZiAoKHMgPSBzdHJyY2hyKGZpbGVfaGRyLT5uYW1lLCAnLycpKSkgeworICAgIGlmIChta3BhdGhhdChBVF9GRENXRCwgZmlsZV9oZHItPm5hbWUsIDAwLCAyKSAmJiBlcnJubyAhPUVFWElTVCkgeworICAgICAgZXJyb3JfbXNnKCI6JXM6IG5vdCBjcmVhdGVkIiwgZmlsZV9oZHItPm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vcmVtb3ZlIG9sZCBmaWxlLCBpZiBleGlzdHMKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfaykgJiYgIVNfSVNESVIoZmlsZV9oZHItPm1vZGUpCisgICAgICAmJiAhbHN0YXQoIGZpbGVfaGRyLT5uYW1lLCAmZXgpKSB7CisgICAgaWYgKHVubGluayhmaWxlX2hkci0+bmFtZSkpIHsKKyAgICAgIHBlcnJvcl9tc2coImNhbid0IHJlbW92ZTogJXMiLGZpbGVfaGRyLT5uYW1lKTsKKyAgICB9CisgIH0KKworICAvL2hhcmQgbGluaworICBpZiAoU19JU1JFRyhmaWxlX2hkci0+bW9kZSkgJiYgZmlsZV9oZHItPmxpbmtfdGFyZ2V0KSB7CisgICAgaWYgKGxpbmsoZmlsZV9oZHItPmxpbmtfdGFyZ2V0LCBmaWxlX2hkci0+bmFtZSkpCisgICAgICBwZXJyb3JfbXNnKCJjYW4ndCBsaW5rICclcycgLT4gJyVzJyIsZmlsZV9oZHItPm5hbWUsIGZpbGVfaGRyLT5saW5rX3RhcmdldCk7CisgICAgZ290byBDT1BZOworICB9CisKKyAgc3dpdGNoIChmaWxlX2hkci0+bW9kZSAmIFNfSUZNVCkgeworICAgIGNhc2UgU19JRlJFRzoKKyAgICAgIGZsYWdzID0gT19XUk9OTFl8T19DUkVBVHxPX0VYQ0w7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfb3ZlcndyaXRlKSBmbGFncyA9IE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQzsKKyAgICAgIGRzdF9mZCA9IG9wZW4oZmlsZV9oZHItPm5hbWUsIGZsYWdzLCBmaWxlX2hkci0+bW9kZSAmIDA3Nzc3KTsKKyAgICAgIGlmIChkc3RfZmQgPT0gLTEpIHBlcnJvcl9tc2coIiVzOiBjYW4ndCBvcGVuIiwgZmlsZV9oZHItPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTX0lGRElSOgorICAgICAgaWYgKChta2RpcihmaWxlX2hkci0+bmFtZSwgZmlsZV9oZHItPm1vZGUpID09IC0xKSAmJiBlcnJubyAhPSBFRVhJU1QpCisgICAgICAgIHBlcnJvcl9tc2coIiVzOiBjYW4ndCBjcmVhdGUiLCBmaWxlX2hkci0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNfSUZMTks6CisgICAgICBpZiAoc3ltbGluayhmaWxlX2hkci0+bGlua190YXJnZXQsIGZpbGVfaGRyLT5uYW1lKSkKKyAgICAgICAgcGVycm9yX21zZygiY2FuJ3QgbGluayAnJXMnIC0+ICclcyciLGZpbGVfaGRyLT5uYW1lLCBmaWxlX2hkci0+bGlua190YXJnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTX0lGQkxLOgorICAgIGNhc2UgU19JRkNIUjoKKyAgICBjYXNlIFNfSUZJRk86CisgICAgICBpZiAobWtub2QoZmlsZV9oZHItPm5hbWUsIGZpbGVfaGRyLT5tb2RlLCBmaWxlX2hkci0+ZGV2aWNlKSkKKyAgICAgICAgcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBmaWxlX2hkci0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKCJ0eXBlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLy9jb3B5IGZpbGUuLi4uCitDT1BZOgorICBjb3B5X2luX291dCh0YXItPnNyY19mZCwgZHN0X2ZkLCBmaWxlX2hkci0+c2l6ZSk7CisgIHRhci0+b2Zmc2V0ICs9IGZpbGVfaGRyLT5zaXplOworICBjbG9zZShkc3RfZmQpOworCisgIGlmIChTX0lTTE5LKGZpbGVfaGRyLT5tb2RlKSkgcmV0dXJuOworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSkgeworICAgIC8vc2V0IG93bmVyc2hpcC4uLiwgLS1uby1zYW1lLW93bmVyLCAtLW51bWVyaWMtb3duZXIKKyAgICB1aWRfdCB1ID0gZmlsZV9oZHItPnVpZDsKKyAgICBnaWRfdCBnID0gZmlsZV9oZHItPmdpZDsKKworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX251bWVyaWNfb3duZXIpKSB7CisgICAgICBzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0oZmlsZV9oZHItPmduYW1lKTsKKyAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHduYW0oZmlsZV9oZHItPnVuYW1lKTsKKyAgICAgIGlmIChwdykgdSA9IHB3LT5wd191aWQ7CisgICAgICBpZiAoZ3IpIGcgPSBnci0+Z3JfZ2lkOworICAgIH0KKyAgICBpZiAoY2hvd24oZmlsZV9oZHItPm5hbWUsIHUsIGcpKQorICAgICAgcGVycm9yX21zZygiY2hvd24gJWQ6JWQgJyVzJyIsIHUsIGcsIGZpbGVfaGRyLT5uYW1lKTs7CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgLy8gfHwgISh0b3lzLm9wdGZsYWdzICYgRkxBR19ub19zYW1lX3Blcm1pc3Npb25zKSkKKyAgICBjaG1vZChmaWxlX2hkci0+bmFtZSwgZmlsZV9oZHItPm1vZGUpOworCisgIC8vYXBwbHkgbXRpbWUKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbSkpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lc1syXSA9IHt7ZmlsZV9oZHItPm10aW1lLCAwfSx7ZmlsZV9oZHItPm10aW1lLCAwfX07CisgICAgdXRpbWVzKGZpbGVfaGRyLT5uYW1lLCB0aW1lcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgYWRkX3RvX2xpc3Qoc3RydWN0IGFyZ19saXN0ICoqbGxpc3QsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBhcmdfbGlzdCAqKmxpc3QgPSBsbGlzdDsKKworICB3aGlsZSAoKmxpc3QpIGxpc3Q9JigoKmxpc3QpLT5uZXh0KTsKKyAgKmxpc3QgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgYXJnX2xpc3QpKTsKKyAgKCpsaXN0KS0+YXJnID0gbmFtZTsKKyAgaWYgKChuYW1lW3N0cmxlbihuYW1lKS0xXSA9PSAnLycpICYmIHN0cmxlbihuYW1lKSAhPSAxKQorICAgIG5hbWVbc3RybGVuKG5hbWUpLTFdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgYWRkX2Zyb21fZmlsZShzdHJ1Y3QgYXJnX2xpc3QgKipsbGlzdCwgc3RydWN0IGFyZ19saXN0ICpmbGlzdCkKK3sKKyAgY2hhciAqbGluZSA9IE5VTEw7CisKKyAgd2hpbGUgKGZsaXN0KSB7CisgICAgaW50IGZkID0gMDsKKworICAgIGlmIChzdHJjbXAoKGNoYXIgKilmbGlzdC0+YXJnLCAiLSIpKQorICAgICAgZmQgPSB4b3BlbigoY2hhciAqKWZsaXN0LT5hcmcsIE9fUkRPTkxZKTsKKworICAgIHdoaWxlICgobGluZSA9IGdldF9saW5lKGZkKSkpIHsKKyAgICAgIGFkZF90b19saXN0KGxsaXN0LCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGZkKSBjbG9zZShmZCk7CisgICAgZmxpc3QgPSBmbGlzdC0+bmV4dDsKKyAgfQorfQorCitzdGF0aWMgc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqaW5pdF9oYW5kbGVyKCkKK3sKKyAgc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyX2hkbCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmNoaXZlX2hhbmRsZXIpKTsKKyAgdGFyX2hkbC0+ZXh0cmFjdF9oYW5kbGVyID0gZXh0cmFjdF90b19kaXNrOworICByZXR1cm4gdGFyX2hkbDsKK30KKworLy9jb252ZXJ0IG9jdGFsIHRvIGludAorc3RhdGljIGludCBvdG9pKGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKyAgbG9uZyB2YWw7CisgIGNoYXIgKmVuZHAsIGlucFtsZW4rMV07IC8vMSBmb3IgTlVMIHRlcm1pbmF0aW9uCisKKyAgbWVtY3B5KGlucCwgc3RyLCBsZW4pOworICBpbnBbbGVuXSA9ICdcMCc7IC8vbnVsLXRlcm1pbmF0aW9uIG1hZGUgc3VyZQorICB2YWwgPSBzdHJ0b2woaW5wLCAmZW5kcCwgOCk7CisgIGlmICgqZW5kcCAmJiAqZW5kcCAhPSAnICcpIGVycm9yX2V4aXQoImludmFsaWQgcGFyYW0iKTsKKyAgcmV0dXJuIChpbnQpdmFsOworfQorCitzdGF0aWMgdm9pZCBleHRyYWN0X3N0cmVhbShzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVyICp0YXJfaGRsKQoreworICBpbnQgcGlwZWZkWzJdOyAgICAgICAgICAgICAgCisgIHBpZF90IGNwaWQ7ICAgICAgICAgICAgICAgICAKKworICBpZiAocGlwZShwaXBlZmQpID09IC0xKSBlcnJvcl9leGl0KCJwaXBlIik7CisKKyAgY3BpZCA9IGZvcmsoKTsKKyAgaWYgKGNwaWQgPT0gLTEpIHBlcnJvcl9leGl0KCJmb3JrIik7CisKKyAgaWYgKCFjcGlkKSB7ICAgIC8qIENoaWxkIHJlYWRzIGZyb20gcGlwZSAqLworICAgIGNoYXIgKmFyZ3ZbXSA9IHsiZ3VuemlwIiwgIi1jZiIsICItIiwgTlVMTH07CisgICAgeGNsb3NlKHBpcGVmZFswXSk7IC8qIENsb3NlIHVudXNlZCByZWFkKi8KKyAgICBkdXAyKHRhcl9oZGwtPnNyY19mZCwgMCk7CisgICAgZHVwMihwaXBlZmRbMV0sIDEpOyAvL3dyaXRlIHRvIHBpcGUKKyAgICB4ZXhlYyhhcmd2KTsKKyAgfSBlbHNlIHsKKyAgICB4Y2xvc2UocGlwZWZkWzFdKTsgICAgICAgICAgLyogQ2xvc2UgdW51c2VkIHJlYWQgZW5kICovCisgICAgZHVwMihwaXBlZmRbMF0sIHRhcl9oZGwtPnNyY19mZCk7IC8vcmVhZCBmcm9tIHBpcGUKKyAgfQorfQorCitzdGF0aWMgY2hhciAqcHJvY2Vzc19leHRlbmRlZF9oZHIoc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyLCBpbnQgc2l6ZSkKK3sKKyAgY2hhciAqdmFsdWUgPSBOVUxMLCAqcCwgKmJ1ZiA9IHh6YWxsb2Moc2l6ZSsxKTsKKworICBpZiAocmVhZGFsbCh0YXItPnNyY19mZCwgYnVmLCBzaXplKSAhPSBzaXplKSBlcnJvcl9leGl0KCJzaG9ydCByZWFkIik7CisgIGJ1ZltzaXplXSA9IDA7CisgIHRhci0+b2Zmc2V0ICs9IHNpemU7CisgIHAgPSBidWY7CisKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBjaGFyICprZXk7CisgICAgaW50IGxlbiwgbjsKKworICAgIC8vIGV4dGVuZGVkIHJlY29yZHMgYXJlIG9mIHRoZSBmb3JtYXQ6ICJMRU4gTkFNRT1WQUxVRVxuIgorICAgIHNzY2FuZihwLCAiJWQgJW4iLCAmbGVuLCAmbik7CisgICAga2V5ID0gcCArIG47CisgICAgcCArPSBsZW47CisgICAgc2l6ZSAtPSBsZW47CisgICAgcFstMV0gPSAwOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgZXJyb3JfbXNnKCJjb3JydXB0ZWQgZXh0ZW5kZWQgaGVhZGVyIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4oInBhdGg9Iik7CisgICAgaWYgKCFzdHJuY21wKGtleSwgInBhdGg9IiwgbGVuKSkgeworICAgICAgdmFsdWUgPSBrZXkgKyBzdHJsZW4oInBhdGg9Iik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHZhbHVlKSB2YWx1ZSA9IHhzdHJkdXAodmFsdWUpOworICBmcmVlKGJ1Zik7CisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgdGFyX3NraXAoc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyLCBpbnQgc3opCit7CisgIGludCB4OworCisgIHdoaWxlICgoeCA9IGxza2lwKHRhci0+c3JjX2ZkLCBzeikpKSB7CisgICAgdGFyLT5vZmZzZXQgKz0gc3ogLSB4OworICAgIHN6ID0geDsKKyAgfQorICB0YXItPm9mZnNldCArPSBzejsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX3RhcihzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVyICp0YXJfaGRsKQoreworICBzdHJ1Y3QgdGFyX2hkciB0YXI7CisgIHN0cnVjdCBmaWxlX2hlYWRlciAqZmlsZV9oZHI7CisgIGludCBpLCBqLCBtYWosIG1pbiwgc3osIGUgPSAwOworICB1bnNpZ25lZCBpbnQgY2tzdW07CisgIHVuc2lnbmVkIGNoYXIgKmd6TWFnaWM7CisgIGNoYXIgKmxvbmduYW1lID0gTlVMTCwgKmxvbmdsaW5rID0gTlVMTDsKKworICB3aGlsZSAoMSkgeworICAgIGNrc3VtID0gMDsKKyAgICBpZiAodGFyX2hkbC0+b2Zmc2V0ICUgNTEyKSB7CisgICAgICBzeiA9IDUxMiAtIHRhcl9oZGwtPm9mZnNldCAlIDUxMjsKKyAgICAgIHRhcl9za2lwKHRhcl9oZGwsIHN6KTsKKyAgICB9CisgICAgaSA9IHJlYWRhbGwodGFyX2hkbC0+c3JjX2ZkLCAmdGFyLCA1MTIpOworICAgIHRhcl9oZGwtPm9mZnNldCArPSBpOworICAgIGlmIChpICE9IDUxMikgeworICAgICAgaWYgKGkgPj0gMikgZ290byBDSEVDS19NQUdJQzsgLy9tYXkgYmUgYSBzbWFsbCAoPDUxMiBieXRlKXppcHBlZCBmaWxlCisgICAgICBlcnJvcl9leGl0KCJyZWFkIGVycm9yIik7CisgICAgfQorCisgICAgaWYgKCF0YXIubmFtZVswXSkgeworICAgICAgaWYgKGUpIHJldHVybjsgLy9lbmQgb2YgdGFyIDIgZW1wdHkgYmxvY2tzCisgICAgICBlID0gMTsvL2VtcHR5IGp1bXAgdG8gbmV4dCBibG9jaworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzdHJuY21wKHRhci5tYWdpYywgInVzdGFyIiwgNSkpIHsKKyAgICAgIC8vdHJ5IGRldGVjdGluZyBieSByZWFkaW5nIG1hZ2ljCitDSEVDS19NQUdJQzoKKyAgICAgIGd6TWFnaWMgPSAodW5zaWduZWQgY2hhciopJnRhcjsKKyAgICAgIGlmICgoZ3pNYWdpY1swXSA9PSAweDFmKSAmJiAoZ3pNYWdpY1sxXSA9PSAweDhiKSAKKyAgICAgICAgICAmJiAhbHNlZWsodGFyX2hkbC0+c3JjX2ZkLCAtaSwgU0VFS19DVVIpKSB7CisgICAgICAgIHRhcl9oZGwtPm9mZnNldCAtPSBpOworICAgICAgICBleHRyYWN0X3N0cmVhbSh0YXJfaGRsKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlcnJvcl9leGl0KCJpbnZhbGlkIHRhciBmb3JtYXQiKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqPDE0ODsgaisrKSBja3N1bSArPSAodW5zaWduZWQgaW50KSgoY2hhciopJnRhcilbal07CisgICAgZm9yIChqID0gMTU2OyBqPDUwMDsgaisrKSBja3N1bSArPSAodW5zaWduZWQgaW50KSgoY2hhciopJnRhcilbal07CisgICAgLy9ja3N1bSBmaWVsZCBpdHNlbGYgdHJlYXRlZCBhcyAnICcKKyAgICBmb3IgKCBqPSAwOyBqPDg7IGorKykgY2tzdW0gKz0gKHVuc2lnbmVkIGludCknICc7CisKKyAgICBpZiAoY2tzdW0gIT0gb3RvaSh0YXIuY2hrc3VtLCBzaXplb2YodGFyLmNoa3N1bSkpKSBlcnJvcl9leGl0KCJ3cm9uZyBja3N1bSIpOworCisgICAgZmlsZV9oZHIgPSAmdGFyX2hkbC0+ZmlsZV9oZHI7CisgICAgbWVtc2V0KGZpbGVfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGZpbGVfaGVhZGVyKSk7CisgICAgZmlsZV9oZHItPm1vZGUgPSBvdG9pKHRhci5tb2RlLCBzaXplb2YodGFyLm1vZGUpKTsKKyAgICBmaWxlX2hkci0+dWlkID0gb3RvaSh0YXIudWlkLCBzaXplb2YodGFyLnVpZCkpOworICAgIGZpbGVfaGRyLT5naWQgPSBvdG9pKHRhci5naWQsIHNpemVvZih0YXIuZ2lkKSk7CisgICAgZmlsZV9oZHItPnNpemUgPSBvdG9pKHRhci5zaXplLCBzaXplb2YodGFyLnNpemUpKTsKKyAgICBmaWxlX2hkci0+bXRpbWUgPSBvdG9pKHRhci5tdGltZSwgc2l6ZW9mKHRhci5tdGltZSkpOworICAgIGZpbGVfaGRyLT51bmFtZSA9IHhzdHJkdXAodGFyLnVuYW1lKTsKKyAgICBmaWxlX2hkci0+Z25hbWUgPSB4c3RyZHVwKHRhci5nbmFtZSk7CisgICAgbWFqID0gb3RvaSh0YXIubWFqb3IsIHNpemVvZih0YXIubWFqb3IpKTsKKyAgICBtaW4gPSBvdG9pKHRhci5taW5vciwgc2l6ZW9mKHRhci5taW5vcikpOworICAgIGZpbGVfaGRyLT5kZXZpY2UgPSBkZXZfbWFrZWRldihtYWosIG1pbik7CisKKyAgICBpZiAodGFyLnR5cGUgPD0gJzcnKSB7CisgICAgICBpZiAodGFyLmxpbmtbMF0pIHsKKyAgICAgICAgc3ogPSBzaXplb2YodGFyLmxpbmspOworICAgICAgICBmaWxlX2hkci0+bGlua190YXJnZXQgPSB4bWFsbG9jKHN6ICsgMSk7CisgICAgICAgIG1lbWNweShmaWxlX2hkci0+bGlua190YXJnZXQsIHRhci5saW5rLCBzeik7CisgICAgICAgIGZpbGVfaGRyLT5saW5rX3RhcmdldFtzel0gPSAnXDAnOworICAgICAgfQorCisgICAgICBmaWxlX2hkci0+bmFtZSA9IHh6YWxsb2MoMjU2KTsvLyBwYXRobmFtZSBzdXBwb3J0ZWQgc2l6ZQorICAgICAgaWYgKHRhci5wcmVmaXhbMF0pIHsKKyAgICAgICAgbWVtY3B5KGZpbGVfaGRyLT5uYW1lLCB0YXIucHJlZml4LCBzaXplb2YodGFyLnByZWZpeCkpOworICAgICAgICBzeiA9IHN0cmxlbihmaWxlX2hkci0+bmFtZSk7CisgICAgICAgIGlmIChmaWxlX2hkci0+bmFtZVtzei0xXSAhPSAnLycpIGZpbGVfaGRyLT5uYW1lW3N6XSA9ICcvJzsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RybGVuKGZpbGVfaGRyLT5uYW1lKTsKKyAgICAgIG1lbWNweShmaWxlX2hkci0+bmFtZSArIHN6LCB0YXIubmFtZSwgc2l6ZW9mKHRhci5uYW1lKSk7CisgICAgICBpZiAoZmlsZV9oZHItPm5hbWVbMjU1XSkgZXJyb3JfZXhpdCgiZmlsZW5hbWUgdG9vIGxvbmciKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRhci50eXBlKSB7CisgICAgICAvLyAgICBjYXNlICdcMCc6CisgICAgICBjYXNlICcwJzoKKyAgICAgIGNhc2UgJzcnOgorICAgICAgY2FzZSAnMSc6IC8vSGFyZCBMaW5rCisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZSRUc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMic6CisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZMTks7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMyc6CisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZDSFI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnNCc6CisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZCTEs7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnNSc6CisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZESVI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnNic6CisgICAgICAgIGZpbGVfaGRyLT5tb2RlIHw9IFNfSUZJRk87CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnSyc6CisgICAgICAgIGxvbmdsaW5rID0geHphbGxvYyhmaWxlX2hkci0+c2l6ZSArMSk7CisgICAgICAgIHhyZWFkKHRhcl9oZGwtPnNyY19mZCwgbG9uZ2xpbmssIGZpbGVfaGRyLT5zaXplKTsKKyAgICAgICAgdGFyX2hkbC0+b2Zmc2V0ICs9IGZpbGVfaGRyLT5zaXplOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgJ0wnOgorICAgICAgICBmcmVlKGxvbmduYW1lKTsKKyAgICAgICAgbG9uZ25hbWUgPSB4emFsbG9jKGZpbGVfaGRyLT5zaXplICsxKTsgICAgICAgICAgIAorICAgICAgICB4cmVhZCh0YXJfaGRsLT5zcmNfZmQsIGxvbmduYW1lLCBmaWxlX2hkci0+c2l6ZSk7CisgICAgICAgIHRhcl9oZGwtPm9mZnNldCArPSBmaWxlX2hkci0+c2l6ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlICdEJzoKKyAgICAgIGNhc2UgJ00nOgorICAgICAgY2FzZSAnTic6CisgICAgICBjYXNlICdTJzoKKyAgICAgIGNhc2UgJ1YnOgorICAgICAgY2FzZSAnZyc6ICAvLyBwYXggZ2xvYmFsIGhlYWRlcgorICAgICAgICB0YXJfc2tpcCh0YXJfaGRsLCBmaWxlX2hkci0+c2l6ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSAneCc6ICAvLyBwYXggZXh0ZW5kZWQgaGVhZGVyCisgICAgICAgIGZyZWUobG9uZ25hbWUpOworICAgICAgICBsb25nbmFtZSA9IHByb2Nlc3NfZXh0ZW5kZWRfaGRyKHRhcl9oZGwsIGZpbGVfaGRyLT5zaXplKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisKKyAgICBpZiAobG9uZ25hbWUpIHsKKyAgICAgIGZyZWUoZmlsZV9oZHItPm5hbWUpOworICAgICAgZmlsZV9oZHItPm5hbWUgPSBsb25nbmFtZTsKKyAgICAgIGxvbmduYW1lID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGxvbmdsaW5rKSB7CisgICAgICBmcmVlKGZpbGVfaGRyLT5saW5rX3RhcmdldCk7CisgICAgICBmaWxlX2hkci0+bGlua190YXJnZXQgPSBsb25nbGluazsKKyAgICAgIGxvbmdsaW5rID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpbGVfaGRyLT5tb2RlICYgU19JRlJFRykgJiYgCisgICAgICAgIGZpbGVfaGRyLT5uYW1lW3N0cmxlbihmaWxlX2hkci0+bmFtZSktMV0gPT0gJy8nKSB7CisgICAgICBmaWxlX2hkci0+bmFtZVtzdHJsZW4oZmlsZV9oZHItPm5hbWUpLTFdID0gJ1wwJzsKKyAgICAgIGZpbGVfaGRyLT5tb2RlICY9IH5TX0lGUkVHOworICAgICAgZmlsZV9oZHItPm1vZGUgfD0gU19JRkRJUjsKKyAgICB9CisKKyAgICBpZiAoKGZpbGVfaGRyLT5saW5rX3RhcmdldCAmJiAqKGZpbGVfaGRyLT5saW5rX3RhcmdldCkpIAorICAgICAgICB8fCBTX0lTTE5LKGZpbGVfaGRyLT5tb2RlKSB8fCBTX0lTRElSKGZpbGVfaGRyLT5tb2RlKSkKKyAgICAgIGZpbGVfaGRyLT5zaXplID0gMDsKKworICAgIGlmIChmaWx0ZXIoVFQuZXhjLCBmaWxlX2hkci0+bmFtZSkgfHwKKyAgICAgICAgKFRULmluYyAmJiAhZmlsdGVyKFRULmluYywgZmlsZV9oZHItPm5hbWUpKSkgZ290byBTS0lQOworICAgIGFkZF90b19saXN0KCZUVC5wYXNzLCB4c3RyZHVwKGZpbGVfaGRyLT5uYW1lKSk7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgeworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIHsKKyAgICAgICAgY2hhciBwZXJtWzExXTsKKyAgICAgICAgc3RydWN0IHRtICpsYyA9IGxvY2FsdGltZSgoY29uc3QgdGltZV90KikmKGZpbGVfaGRyLT5tdGltZSkpOworCisgICAgICAgIG1vZGVfdG9fc3RyaW5nKGZpbGVfaGRyLT5tb2RlLCBwZXJtKTsKKyAgICAgICAgcHJpbnRmKCIlcyAlcy8lcyAlOWxkICVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCAiLHBlcm0sZmlsZV9oZHItPnVuYW1lLAorICAgICAgICAgICAgZmlsZV9oZHItPmduYW1lLCAobG9uZylmaWxlX2hkci0+c2l6ZSwgMTkwMCtsYy0+dG1feWVhciwKKyAgICAgICAgICAgIDErbGMtPnRtX21vbiwgbGMtPnRtX21kYXksIGxjLT50bV9ob3VyLCBsYy0+dG1fbWluLCBsYy0+dG1fc2VjKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiJXMiLGZpbGVfaGRyLT5uYW1lKTsKKyAgICAgIGlmIChmaWxlX2hkci0+bGlua190YXJnZXQpIHByaW50ZigiIC0+ICVzIixmaWxlX2hkci0+bGlua190YXJnZXQpOworICAgICAgeHB1dGMoJ1xuJyk7CitTS0lQOgorICAgICAgdGFyX3NraXAodGFyX2hkbCwgZmlsZV9oZHItPnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgcHJpbnRmKCIlc1xuIixmaWxlX2hkci0+bmFtZSk7CisgICAgICB0YXJfaGRsLT5leHRyYWN0X2hhbmRsZXIodGFyX2hkbCk7CisgICAgfQorICAgIGZyZWUoZmlsZV9oZHItPm5hbWUpOworICAgIGZyZWUoZmlsZV9oZHItPmxpbmtfdGFyZ2V0KTsKKyAgICBmcmVlKGZpbGVfaGRyLT51bmFtZSk7CisgICAgZnJlZShmaWxlX2hkci0+Z25hbWUpOworICB9Cit9CisKK3ZvaWQgdGFyX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGFyY2hpdmVfaGFuZGxlciAqdGFyX2hkbDsKKyAgaW50IGZkID0gMDsKKyAgc3RydWN0IGFyZ19saXN0ICp0bXA7CisgIGNoYXIgKiphcmdzID0gdG95cy5vcHRhcmdzOworCisgIGlmICghZ2V0ZXVpZCgpKSB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfcDsKKworICBmb3IgKHRtcCA9IFRULmV4YzsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCisgICAgdG1wLT5hcmcgPSB4c3RyZHVwKHRtcC0+YXJnKTsgLy9mcmVlaW5nIGF0IHRoZSBlbmQgZmFpbHMgb3RoZXJ3aXNlCisKKyAgd2hpbGUoKmFyZ3MpIGFkZF90b19saXN0KCZUVC5pbmMsIHhzdHJkdXAoKmFyZ3MrKykpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfWCkgYWRkX2Zyb21fZmlsZSgmVFQuZXhjLCBUVC5leGNfZmlsZSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19UKSBhZGRfZnJvbV9maWxlKCZUVC5pbmMsIFRULmluY19maWxlKTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgeworICAgIGlmICghVFQuaW5jKSBlcnJvcl9leGl0KCJlbXB0eSBhcmNoaXZlIik7CisgICAgZmQgPSAxOworICB9CisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfZikgJiYgc3RyY21wKFRULmZuYW1lLCAiLSIpKSAKKyAgICBmZCA9IHhjcmVhdGUoVFQuZm5hbWUsIGZkKihPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpLCAwNjY2KTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0MpIHhjaGRpcihUVC5kaXIpOworCisgIHRhcl9oZGwgPSBpbml0X2hhbmRsZXIoKTsKKyAgdGFyX2hkbC0+c3JjX2ZkID0gZmQ7CisKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR194KSB8fCAodG95cy5vcHRmbGFncyAmIEZMQUdfdCkpIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfTykgdGFyX2hkbC0+ZXh0cmFjdF9oYW5kbGVyID0gZXh0cmFjdF90b19zdGRvdXQ7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3RvX2NvbW1hbmQpIHsKKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy93aWxsIGJlIHVzaW5nIHBpcGUgYmV0d2VlbiBjaGlsZCAmIHBhcmVudAorICAgICAgdGFyX2hkbC0+ZXh0cmFjdF9oYW5kbGVyID0gZXh0cmFjdF90b19jb21tYW5kOworICAgIH0KKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfeikgZXh0cmFjdF9zdHJlYW0odGFyX2hkbCk7CisgICAgdW5wYWNrX3Rhcih0YXJfaGRsKTsKKyAgICBmb3IgKHRtcCA9IFRULmluYzsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCisgICAgICBpZiAoIWZpbHRlcihUVC5leGMsIHRtcC0+YXJnKSAmJiAhZmlsdGVyKFRULnBhc3MsIHRtcC0+YXJnKSkKKyAgICAgICAgZXJyb3JfbXNnKCInJXMnIG5vdCBpbiBhcmNoaXZlIiwgdG1wLT5hcmcpOworICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIHsKKyAgICAvL2NyZWF0ZSB0aGUgdGFyIGhlcmUuCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3opIGNvbXByZXNzX3N0cmVhbSh0YXJfaGRsKTsKKyAgICBmb3IgKHRtcCA9IFRULmluYzsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKyAgICAgIFRULmhhbmRsZSA9IHRhcl9oZGw7CisgICAgICAvL3JlY3Vyc2UgdGhydSBkaXIgYW5kIGFkZCBmaWxlcyB0byBhcmNoaXZlCisgICAgICBkaXJ0cmVlX2ZsYWdyZWFkKHRtcC0+YXJnLCBESVJUUkVFX1NZTUZPTExPVyohISh0b3lzLm9wdGZsYWdzJkZMQUdfaCksCisgICAgICAgIGFkZF90b190YXIpOworICAgIH0KKyAgICBtZW1zZXQodG95YnVmLCAwLCAxMDI0KTsKKyAgICB3cml0ZWFsbCh0YXJfaGRsLT5zcmNfZmQsIHRveWJ1ZiwgMTAyNCk7CisgICAgc2Vlbl9pbm9kZSgmVFQuaW5vZGVzLCAwLCAwKTsKKyAgfQorCisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHsKKyAgICBjbG9zZSh0YXJfaGRsLT5zcmNfZmQpOworICAgIGZyZWUodGFyX2hkbCk7CisgICAgbGxpc3RfdHJhdmVyc2UoVFQuZXhjLCBsbGlzdF9mcmVlX2FyZyk7CisgICAgbGxpc3RfdHJhdmVyc2UoVFQuaW5jLCBsbGlzdF9mcmVlX2FyZyk7CisgICAgbGxpc3RfdHJhdmVyc2UoVFQucGFzcywgbGxpc3RfZnJlZV9hcmcpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL3RjcHN2ZC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy90Y3BzdmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWMyNzYxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90Y3BzdmQuYwpAQCAtMCwwICsxLDQwNCBAQAorLyogdGNwc3ZkLmMgLSBUQ1AoVURQKS9JUCBzZXJ2aWNlIGRhZW1vbiAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIFNhbmRlZXAgU2hhcm1hIDxzYW5kZWVwLmphY2syNzU2QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICogCisgKiBObyBTdGFuZGFyZC4KKworVVNFX1RDUFNWRChORVdUT1kodGNwc3ZkLCAiXjwzYyM9MzA8MUM6YiM9MjA8MHU6bDpoRXYiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVENQU1ZEKE9MRFRPWSh1ZHBzdmQsIHRjcHN2ZCwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgVENQU1ZECisgIGJvb2wgInRjcHN2ZCIKKyAgZGVmYXVsdCBuCisgIGRlcGVuZHMgb24gVE9ZQk9YX0ZPUksKKyAgaGVscAorICAgIHVzYWdlOiB0Y3BzdmQgWy1oRXZdIFstYyBOXSBbLUMgTls6TVNHXV0gWy1iIE5dIFstdSBVc2VyXSBbLWwgTmFtZV0gSVAgUG9ydCBQcm9nCisgICAgdXNhZ2U6IHVkcHN2ZCBbLWhFdl0gWy1jIE5dIFstdSBVc2VyXSBbLWwgTmFtZV0gSVAgUG9ydCBQcm9nCisgICAgCisgICAgQ3JlYXRlIFRDUC9VRFAgc29ja2V0LCBiaW5kIHRvIElQOlBPUlQgYW5kIGxpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbi4gCisgICAgUnVuIFBST0cgZm9yIGVhY2ggY29ubmVjdGlvbi4KKworICAgIElQICAgICAgICAgICAgSVAgdG8gbGlzdGVuIG9uLCAwID0gYWxsCisgICAgUE9SVCAgICAgICAgICBQb3J0IHRvIGxpc3RlbiBvbgorICAgIFBST0cgQVJHUyAgICAgUHJvZ3JhbSB0byBydW4KKyAgICAtbCBOQU1FICAgICAgIExvY2FsIGhvc3RuYW1lIChlbHNlIGxvb2tzIHVwIGxvY2FsIGhvc3RuYW1lIGluIEROUykKKyAgICAtdSBVU0VSWzpHUlBdIENoYW5nZSB0byB1c2VyL2dyb3VwIGFmdGVyIGJpbmQKKyAgICAtYyBOICAgICAgICAgIEhhbmRsZSB1cCB0byBOICg+IDApIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5CisgICAgLWIgTiAgICAgICAgICAoVENQIE9ubHkpIEFsbG93IGEgYmFja2xvZyBvZiBhcHByb3hpbWF0ZWx5IE4gVENQIFNZTnMKKyAgICAtQyBOWzpNU0ddICAgIChUQ1AgT25seSkgQWxsb3cgb25seSB1cCB0byBOICg+IDApIGNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSVAKKyAgICAgICAgICAgICAgICAgIE5ldyBjb25uZWN0aW9ucyBmcm9tIHRoaXMgSVAgYWRkcmVzcyBhcmUgY2xvc2VkCisgICAgICAgICAgICAgICAgICBpbW1lZGlhdGVseS4gTVNHIGlzIHdyaXR0ZW4gdG8gdGhlIHBlZXIgYmVmb3JlIGNsb3NlCisgICAgLWggICAgICAgICAgICBMb29rIHVwIHBlZXIncyBob3N0bmFtZQorICAgIC1FICAgICAgICAgICAgRG9uJ3Qgc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgIC12ICAgICAgICAgICAgVmVyYm9zZQorKi8KKworI2RlZmluZSBGT1JfdGNwc3ZkCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpuYW1lOworICBjaGFyICp1c2VyOworICBsb25nIGJuOworICBjaGFyICpubXNnOworICBsb25nIGNuOworCisgIGludCBtYXhjOworICBpbnQgY291bnRfYWxsOworICBpbnQgdWRwOworKQorCitzdHJ1Y3QgbGlzdF9waWQgeworICBzdHJ1Y3QgbGlzdF9waWQgKm5leHQ7CisgIGNoYXIgKmlwOyAgCisgIGludCBwaWQ7Cit9OworCitzdHJ1Y3QgbGlzdCB7CisgIHN0cnVjdCBsaXN0KiBuZXh0OworICBjaGFyICpkOworICBpbnQgY291bnQ7Cit9OworCitzdHJ1Y3QgaGFzaGVkIHsKKyAgc3RydWN0IGxpc3QgKmhlYWQ7Cit9OworCisjZGVmaW5lIEhBU0hfTlIgMjU2CitzdHJ1Y3QgaGFzaGVkIGhbSEFTSF9OUl07CitzdHJ1Y3QgbGlzdF9waWQgKnBpZHMgPSBOVUxMOworCisvLyBjb252ZXJ0IElQIGFkZHJlc3MgdG8gc3RyaW5nLgorc3RhdGljIGNoYXIgKnNvY2tfdG9fYWRkcmVzcyhzdHJ1Y3Qgc29ja2FkZHIgKnNvY2ssIGludCBmbGFncykKK3sKKyAgY2hhciBoYnVmW05JX01BWEhPU1RdID0gezAsfTsKKyAgY2hhciBzYnVmW05JX01BWFNFUlZdID0gezAsfTsgCisgIGludCBzdGF0dXMgPSAwOworICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCisgIGlmICghKHN0YXR1cyA9IGdldG5hbWVpbmZvKHNvY2ssIGxlbiwgaGJ1Ziwgc2l6ZW9mKGhidWYpLCBzYnVmLCAKKyAgICAgICAgICBzaXplb2Yoc2J1ZiksIGZsYWdzKSkpIHsKKyAgICBpZiAoZmxhZ3MgJiBOSV9OVU1FUklDU0VSVikgcmV0dXJuIHhtcHJpbnRmKCIlczolcyIsaGJ1Ziwgc2J1Zik7CisgICAgcmV0dXJuIHhtcHJpbnRmKCIlcyIsaGJ1Zik7CisgIH0KKyAgZXJyb3JfZXhpdCgiZ2V0bmFtZWluZm86ICVzIiwgZ2FpX3N0cmVycm9yKHN0YXR1cykpOworfQorCisvLyBJbnNlcnQgcGlkLCBpcCBhbmQgZmQgaW4gdGhlIGxpc3QuCitzdGF0aWMgdm9pZCBpbnNlcnQoc3RydWN0IGxpc3RfcGlkICoqbCwgaW50IHBpZCwgY2hhciAqYWRkcikKK3sKKyAgc3RydWN0IGxpc3RfcGlkICpuZXdub2RlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfcGlkKSk7CisgIG5ld25vZGUtPnBpZCA9IHBpZDsKKyAgbmV3bm9kZS0+aXAgPSBhZGRyOworICBuZXdub2RlLT5uZXh0ID0gTlVMTDsKKyAgaWYgKCEqbCkgKmwgPSBuZXdub2RlOworICBlbHNlIHsKKyAgICBuZXdub2RlLT5uZXh0ID0gKCpsKTsKKyAgICpsID0gbmV3bm9kZTsKKyAgfQorfQorCisvLyBIYXNoaW5nIG9mIElQIGFkZHJlc3MuCitzdGF0aWMgaW50IGhhc2hpcCggY2hhciAqYWRkcikKK3sKKyAgdWludDMyX3QgaXBbOF0gPSB7MCx9OworICBpbnQgY291bnQgPSAwLCBpID0gMDsKKworICBpZiAoIWFkZHIpIGVycm9yX2V4aXQoIk5VTEwgaXAiKTsKKyAgd2hpbGUgKGkgPCBzdHJsZW4oYWRkcikpIHsKKyAgICB3aGlsZSAoYWRkcltpXSAmJiAoYWRkcltpXSAhPSAnOicpICYmIChhZGRyW2ldICE9ICcuJykpIHsKKyAgICAgIGlwW2NvdW50XSA9IGlwW2NvdW50XSoxMCArIChhZGRyW2ldLScwJyk7CisgICAgICBpKys7CisgICAgfQorICAgIGlmIChpID49IHN0cmxlbihhZGRyKSkgYnJlYWs7CisgICAgY291bnQrKzsKKyAgICBpKys7CisgIH0KKyAgcmV0dXJuIChpcFswXV5pcFsxXV5pcFsyXV5pcFszXV5pcFs0XV5pcFs1XV5pcFs2XV5pcFs3XSklSEFTSF9OUjsKK30KKworLy8gUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBsaXN0Lgorc3RhdGljIGNoYXIgKmRlbGV0ZShzdHJ1Y3QgbGlzdF9waWQgKipwaWRzLCBpbnQgcGlkKQoreworICBzdHJ1Y3QgbGlzdF9waWQgKnByZXYsICpmcmVlX25vZGUsICpoZWFkID0gKnBpZHM7IAorICBjaGFyICppcCA9IE5VTEw7CisgCisgIGlmICghaGVhZCkgcmV0dXJuIE5VTEw7CisgIHByZXYgPSBmcmVlX25vZGUgPSBOVUxMOworICB3aGlsZSAoaGVhZCkgeworICAgIGlmIChoZWFkLT5waWQgPT0gcGlkKSB7CisgICAgICBpcCA9IGhlYWQtPmlwOworICAgICAgZnJlZV9ub2RlID0gaGVhZDsKKyAgICAgIGlmICghcHJldikgKnBpZHMgPSBoZWFkLT5uZXh0OworICAgICAgZWxzZSBwcmV2LT5uZXh0ID0gaGVhZC0+bmV4dDsKKyAgICAgIGZyZWUoZnJlZV9ub2RlKTsKKyAgICAgIHJldHVybiBpcDsKKyAgICB9CisgICAgcHJldiA9IGhlYWQ7CisgICAgaGVhZCA9IGhlYWQtPm5leHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIGRlY3JlbWVudCB0aGUgcmVmIGNvdW50IGZvcmEgY29ubmVjdGlvbiwgaWYgY291bnQgcmVjaGVzIFpFUk8gdGhlbiByZW1vdmUgdGhlIG5vZGUKK3N0YXRpYyB2b2lkIHJlbW92ZV9jb25uZWN0aW9uKGNoYXIgKmlwKQoreworICBzdHJ1Y3QgbGlzdCAqaGVhZCwgKnByZXYgPSBOVUxMLCAqZnJlZV9ub2RlID0gTlVMTDsKKyAgaW50IGhhc2ggPSBoYXNoaXAoaXApOworCisgIGhlYWQgPSBoW2hhc2hdLmhlYWQ7CisgIHdoaWxlIChoZWFkKSB7CisgICAgaWYgKCFzdHJjbXAoaXAsIGhlYWQtPmQpKSB7CisgICAgICBoZWFkLT5jb3VudC0tOworICAgICAgZnJlZV9ub2RlID0gaGVhZDsKKyAgICAgIGlmICghaGVhZC0+Y291bnQpIHsKKyAgICAgICAgaWYgKCFwcmV2KSBoW2hhc2hdLmhlYWQgPSBoZWFkLT5uZXh0OworICAgICAgICBlbHNlIHByZXYtPm5leHQgPSBoZWFkLT5uZXh0OworICAgICAgICBmcmVlKGZyZWVfbm9kZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgcHJldiA9IGhlYWQ7CisgICAgaGVhZCA9IGhlYWQtPm5leHQ7CisgIH0KKyAgZnJlZShpcCk7Cit9CisKKy8vIEhhbmRsZXIgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBoYW5kbGVfZXhpdChpbnQgc2lnKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWRfbiA9IHdhaXQoJnN0YXR1cyk7CisKKyAgaWYgKHBpZF9uIDw9IDApIHJldHVybjsKKyAgY2hhciAqaXAgPSBkZWxldGUoJnBpZHMsIHBpZF9uKTsKKyAgaWYgKCFpcCkgcmV0dXJuOworICByZW1vdmVfY29ubmVjdGlvbihpcCk7CisgIFRULmNvdW50X2FsbC0tOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgeworICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSkKKyAgICAgIHhwcmludGYoIiVzOiBlbmQgJWQgZXhpdCAlZFxuIix0b3lzLndoaWNoLT5uYW1lLCBwaWRfbiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisgICAgZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKyAgICAgIHhwcmludGYoIiVzOiBlbmQgJWQgc2lnbmFsZWQgJWRcbiIsdG95cy53aGljaC0+bmFtZSwgcGlkX24sIFdURVJNU0lHKHN0YXR1cykpOworICAgIGlmIChUVC5jbiA+IDEpIHhwcmludGYoIiVzOiBzdGF0dXMgJWQvJWRcbiIsdG95cy53aGljaC0+bmFtZSwgVFQuY291bnRfYWxsLCBUVC5jbik7CisgIH0KK30KKworLy8gR3JhYiB1aWQgYW5kIGdpZCAKK3N0YXRpYyB2b2lkIGdldF91aWRnaWQodWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgY2hhciAqdWcpCit7CisgIHN0cnVjdCBwYXNzd2QgKnBhc3MgPSBOVUxMOworICBzdHJ1Y3QgZ3JvdXAgKmdycCA9IE5VTEw7CisgIGNoYXIgKnVzZXIgPSBOVUxMLCAqZ3JvdXAgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbjsKKworICB1c2VyID0gdWc7CisgIGdyb3VwID0gc3RyY2hyKHVnLCc6Jyk7CisgIGlmIChncm91cCkgeworICAgICpncm91cCA9ICdcMCc7CisgICAgZ3JvdXArKzsKKyAgfQorICBpZiAoIShwYXNzID0gZ2V0cHduYW0odXNlcikpKSB7CisgICAgbiA9IGF0b2x4X3JhbmdlKHVzZXIsIDAsIElOVF9NQVgpOworICAgIGlmICghKHBhc3MgPSBnZXRwd3VpZChuKSkpIHBlcnJvcl9leGl0KCJJbnZhbGlkIHVzZXIgJyVzJyIsIHVzZXIpOworICB9CisgICp1aWQgPSBwYXNzLT5wd191aWQ7CisgICpnaWQgPSBwYXNzLT5wd19naWQ7CisKKyAgaWYgKGdyb3VwKSB7CisgICAgaWYgKCEoZ3JwID0gZ2V0Z3JuYW0oZ3JvdXApKSkgeworICAgICAgbiA9IGF0b2x4X3JhbmdlKGdyb3VwLCAwLCBJTlRfTUFYKTsKKyAgICAgIGlmICghKGdycCA9IGdldGdyZ2lkKG4pKSkgcGVycm9yX2V4aXQoIkludmFsaWQgZ3JvdXAgJyVzJyIsZ3JvdXApOworICAgIH0gICAgCisgIH0KKyAgaWYgKGdycCkgKmdpZCA9IGdycC0+Z3JfZ2lkOworfQorCisvLyBCaW5kIHNvY2tldC4KK3N0YXRpYyBpbnQgY3JlYXRlX2JpbmRfc29jayhjaGFyICpob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKmhhZGRyKQoreworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMgPSBOVUxMLCAqcnA7CisgIGludCBzb2NrZmQsIHJldCwgc2V0ID0gMTsKKyAgY2hhciAqcHRyOworICB1bnNpZ25lZCBsb25nIHBvcnQ7CisKKyAgZXJybm8gPSAwOworICBwb3J0ID0gc3RydG91bCh0b3lzLm9wdGFyZ3NbMV0sICZwdHIsIDEwKTsgIAorICBpZiAoZXJybm8gfHwgcG9ydCA+IDY1NTM1KSAKKyAgICBlcnJvcl9leGl0KCJJbnZhbGlkIHBvcnQsIFJhbmdlIGlzIFswLTY1NTM1XSIpOworICBpZiAoKnB0cikgcHRyID0gdG95cy5vcHRhcmdzWzFdOworICBlbHNlIHsKKyAgICBzcHJpbnRmKHRveWJ1ZiwgIiVsdSIsIHBvcnQpOworICAgIHB0ciA9IHRveWJ1ZjsKKyAgfQorCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZiBoaW50cyk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgIAorICBoaW50cy5haV9zb2NrdHlwZSA9ICgoVFQudWRwKSA/U09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNKTsKKyAgaWYgKChyZXQgPSBnZXRhZGRyaW5mbyhob3N0LCBwdHIsICZoaW50cywgJnJlcykpKSAKKyAgICBwZXJyb3JfZXhpdCgiJXMiLCBnYWlfc3RyZXJyb3IocmV0KSk7CisKKyAgZm9yIChycCA9IHJlczsgcnA7IHJwID0gcnAtPmFpX25leHQpIAorICAgIGlmICggKHJwLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkgfHwgKHJwLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpKSBicmVhazsKKworICBpZiAoIXJwKSBlcnJvcl9leGl0KCJJbnZhbGlkIElQICVzIiwgaG9zdCk7CisKKyAgc29ja2ZkID0geHNvY2tldChycC0+YWlfZmFtaWx5LCBUVC51ZHAgP1NPQ0tfREdSQU0gOlNPQ0tfU1RSRUFNLCAwKTsKKyAgc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnNldCwgc2l6ZW9mKHNldCkpOworICBpZiAoVFQudWRwKSBzZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUCwgSVBfUEtUSU5GTywgJnNldCwgc2l6ZW9mKHNldCkpOworICBpZiAoKGJpbmQoc29ja2ZkLCBycC0+YWlfYWRkciwgcnAtPmFpX2FkZHJsZW4pKSA8IDApIHBlcnJvcl9leGl0KCJCaW5kIGZhaWxlZCIpOworICBpZihoYWRkcikgbWVtY3B5KGhhZGRyLCBycC0+YWlfYWRkciwgcnAtPmFpX2FkZHJsZW4pOworICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgcmV0dXJuIHNvY2tmZDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnKQoreworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgeHByaW50ZigiZ290IHNpZ25hbCAlZCwgZXhpdFxuIiwgc2lnKTsKKyAgcmFpc2Uoc2lnKTsKKyAgX2V4aXQoc2lnICsgMTI4KTsgLy9zaG91bGQgbm90IHJlYWNoIGhlcmUKK30gCisKK3ZvaWQgdGNwc3ZkX21haW4odm9pZCkKK3sKKyAgdWlkX3QgdWlkID0gMDsKKyAgZ2lkX3QgZ2lkID0gMDsKKyAgcGlkX3QgcGlkOworICBjaGFyIGhhZGRyW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KV07CisgIHN0cnVjdCBsaXN0ICpoZWFkLCAqbmV3bm9kZTsKKyAgaW50IGhhc2gsIGZkLCBuZXdmZCwgajsKKyAgY2hhciAqcHRyID0gTlVMTCwgKmFkZHIsICpzZXJ2ZXIsIGJ1ZltzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNildOworICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGJ1Zik7CisKKyAgVFQudWRwID0gKCp0b3lzLndoaWNoLT5uYW1lID09ICd1Jyk7CisgIGlmIChUVC51ZHApIHRveXMub3B0ZmxhZ3MgJj0gfkZMQUdfQzsKKyAgbWVtc2V0KGJ1ZiwgMCwgbGVuKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0MpIHsKKyAgICBpZiAoKHB0ciA9IHN0cmNocihUVC5ubXNnLCAnOicpKSkgeworICAgICAgKnB0ciA9ICdcMCc7CisgICAgICBwdHIrKzsKKyAgICB9CisgICAgVFQubWF4YyA9IGF0b2x4X3JhbmdlKFRULm5tc2csIDEsIElOVF9NQVgpOworICB9CisgIAorICBmZCA9IGNyZWF0ZV9iaW5kX3NvY2sodG95cy5vcHRhcmdzWzBdLCAoc3RydWN0IHNvY2thZGRyKikmaGFkZHIpOworICBpZih0b3lzLm9wdGZsYWdzICYgRkxBR191KSB7CisgICAgZ2V0X3VpZGdpZCgmdWlkLCAmZ2lkLCBUVC51c2VyKTsKKyAgICBzZXR1aWQodWlkKTsKKyAgICBzZXRnaWQoZ2lkKTsKKyAgfQorCisgIGlmICghVFQudWRwICYmIChsaXN0ZW4oZmQsIFRULmJuKSA8IDApKSBwZXJyb3JfZXhpdCgiTGlzdGVuIGZhaWxlZCIpOworICBzZXJ2ZXIgPSBzb2NrX3RvX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciopJmhhZGRyLCBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpCisgICAgICB4cHJpbnRmKCIlczogbGlzdGVuaW5nIG9uICVzLCBzdGFydGluZywgdWlkICV1LCBnaWQgJXVcbiIKKyAgICAgICAgICAsdG95cy53aGljaC0+bmFtZSwgc2VydmVyLCB1aWQsIGdpZCk7CisgICAgZWxzZSAKKyAgICAgIHhwcmludGYoIiVzOiBsaXN0ZW5pbmcgb24gJXMsIHN0YXJ0aW5nXG4iLCB0b3lzLndoaWNoLT5uYW1lLCBzZXJ2ZXIpOworICB9CisgIGZvciAoaiA9IDA7IGogPCBIQVNIX05SOyBqKyspIGhbal0uaGVhZCA9IE5VTEw7CisgIHNpZ2F0ZXhpdChoYW5kbGVfc2lnbmFsKTsgIAorICBzaWduYWwoU0lHQ0hMRCwgaGFuZGxlX2V4aXQpOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKFRULmNvdW50X2FsbCAgPCBUVC5jbikgeworICAgICAgaWYgKFRULnVkcCkgeworICAgICAgICBpZihyZWN2ZnJvbShmZCwgTlVMTCwgMCwgTVNHX1BFRUssIChzdHJ1Y3Qgc29ja2FkZHIgKilidWYsICZsZW4pIDwgMCkKKyAgICAgICAgICBwZXJyb3JfZXhpdCgicmVjdmZyb20iKTsKKyAgICAgICAgbmV3ZmQgPSBmZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld2ZkID0gYWNjZXB0KGZkLCAoc3RydWN0IHNvY2thZGRyICopYnVmLCAmbGVuKTsKKyAgICAgICAgaWYgKG5ld2ZkIDwgMCkgcGVycm9yX2V4aXQoIkVycm9yIG9uIGFjY2VwdCIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzaWdzZXRfdCBzczsKKyAgICAgIHNpZ2VtcHR5c2V0KCZzcyk7CisgICAgICBzaWdzdXNwZW5kKCZzcyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgVFQuY291bnRfYWxsKys7CisgICAgYWRkciA9IHNvY2tfdG9fYWRkcmVzcygoc3RydWN0IHNvY2thZGRyKilidWYsIE5JX05VTUVSSUNIT1NUKTsKKworICAgIGhhc2ggPSBoYXNoaXAoYWRkcik7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0MpIHsKKyAgICAgIGZvciAoaGVhZCA9IGhbaGFzaF0uaGVhZDsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpCisgICAgICAgIGlmICghc3RyY21wKGhlYWQtPmQsIGFkZHIpKSBicmVhazsKKworICAgICAgaWYgKGhlYWQgJiYgaGVhZC0+Y291bnQgPj0gVFQubWF4YykgeworICAgICAgICBpZiAocHRyKSB3cml0ZShuZXdmZCwgcHRyLCBzdHJsZW4ocHRyKSsxKTsKKyAgICAgICAgY2xvc2UobmV3ZmQpOworICAgICAgICBUVC5jb3VudF9hbGwtLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgbmV3bm9kZSA9IChzdHJ1Y3QgbGlzdCopeHphbGxvYyhzaXplb2Yoc3RydWN0IGxpc3QpKTsKKyAgICBuZXdub2RlLT5kID0gYWRkcjsKKyAgICBmb3IgKGhlYWQgPSBoW2hhc2hdLmhlYWQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KSB7CisgICAgICBpZiAoIXN0cmNtcChhZGRyLCBoZWFkLT5kKSkgeworICAgICAgICBoZWFkLT5jb3VudCsrOworICAgICAgICBmcmVlKG5ld25vZGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWhlYWQpIHsKKyAgICAgIG5ld25vZGUtPm5leHQgPSBoW2hhc2hdLmhlYWQ7CisgICAgICBoW2hhc2hdLmhlYWQgPSBuZXdub2RlOworICAgICAgaFtoYXNoXS5oZWFkLT5jb3VudCsrOworICAgIH0KKworICAgIGlmICghKHBpZCA9IHhmb3JrKCkpKSB7CisgICAgICBjaGFyICpzZXJ2ID0gTlVMTCwgKmNsaWUgPSBOVUxMOworICAgICAgY2hhciAqY2xpZW50ID0gc29ja190b19hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIqKWJ1ZiwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeyAvL2xvb2t1cCBuYW1lCisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSBzZXJ2ID0geHN0cmR1cChUVC5uYW1lKTsKKyAgICAgICAgZWxzZSBzZXJ2ID0gc29ja190b19hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIqKSZoYWRkciwgMCk7CisgICAgICAgIGNsaWUgPSBzb2NrX3RvX2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciopYnVmLCAwKTsKKyAgICAgIH0KKworICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfRSkpIHsKKyAgICAgICAgc2V0ZW52KCJQUk9UTyIsIFRULnVkcCA/IlVEUCIgOiJUQ1AiLCAxKTsKKyAgICAgICAgc2V0ZW52KCJQUk9UT0xPQ0FMQUREUiIsIHNlcnZlciwgMSk7CisgICAgICAgIHNldGVudigiUFJPVE9SRU1PVEVBRERSIiwgY2xpZW50LCAxKTsKKyAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2gpIHsKKyAgICAgICAgICBzZXRlbnYoIlBST1RPTE9DQUxIT1NUIiwgc2VydiwgMSk7CisgICAgICAgICAgc2V0ZW52KCJQUk9UT1JFTU9URUhPU1QiLCBjbGllLCAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVRULnVkcCkgeworICAgICAgICAgIGNoYXIgbWF4X2NbMzJdOworICAgICAgICAgIHNwcmludGYobWF4X2MsICIlZCIsIFRULm1heGMpOworICAgICAgICAgIHNldGVudigiVENQQ09OQ1VSUkVOQ1kiLCBtYXhfYywgMSk7IC8vTm90IHZhbGlkIGZvciB1ZHAKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIHsKKyAgICAgICAgeHByaW50ZigiJXM6IHN0YXJ0ICVkICVzLSVzIix0b3lzLndoaWNoLT5uYW1lLCBnZXRwaWQoKSwgc2VydmVyLCBjbGllbnQpOworICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeHByaW50ZigiICglcy0lcykiLCBzZXJ2LCBjbGllKTsKKyAgICAgICAgeHB1dGMoJ1xuJyk7CisgICAgICAgIGlmIChUVC5jbiA+IDEpIAorICAgICAgICAgIHhwcmludGYoIiVzOiBzdGF0dXMgJWQvJWRcbiIsdG95cy53aGljaC0+bmFtZSwgVFQuY291bnRfYWxsLCBUVC5jbik7CisgICAgICB9CisgICAgICBmcmVlKGNsaWVudCk7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkgeworICAgICAgICBmcmVlKHNlcnYpOworICAgICAgICBmcmVlKGNsaWUpOworICAgICAgfQorICAgICAgaWYgKFRULnVkcCAmJiAoY29ubmVjdChuZXdmZCwgKHN0cnVjdCBzb2NrYWRkciAqKWJ1Ziwgc2l6ZW9mKGJ1ZikpIDwgMCkpCisgICAgICAgICAgcGVycm9yX2V4aXQoImNvbm5lY3QiKTsKKworICAgICAgY2xvc2UoMCk7CisgICAgICBjbG9zZSgxKTsKKyAgICAgIGR1cDIobmV3ZmQsIDApOworICAgICAgZHVwMihuZXdmZCwgMSk7CisgICAgICB4ZXhlYyh0b3lzLm9wdGFyZ3MrMik7IC8vc2tpcCBJUCBQT1JUCisgICAgfSBlbHNlIHsKKyAgICAgIGluc2VydCgmcGlkcywgcGlkLCBhZGRyKTsKKyAgICAgIHhjbG9zZShuZXdmZCk7IC8vY2xvc2UgYW5kIHJlb3BlbiBmb3IgbmV4dCBjbGllbnQuCisgICAgICBpZiAoVFQudWRwKSBmZCA9IGNyZWF0ZV9iaW5kX3NvY2sodG95cy5vcHRhcmdzWzBdLAorICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIqKSZoYWRkcik7CisgICAgfQorICB9IC8vd2hpbGUoMSkKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvdGVsbmV0LmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3RlbG5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzQ4N2EKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL3RlbG5ldC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKiB0ZWxuZXQuYyAtIFRlbG5ldCBjbGllbnQuCisgKgorICogQ29weXJpZ2h0IDIwMTIgTWFkaHVyIFZlcm1hIDxtYWQuZmxleGlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKiBNb2RpZmllZCBieSBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pMTk4MUBnbWFpbC5jb20+CisgKgorICogTm90IGluIFNVU3Y0LgorCitVU0VfVEVMTkVUKE5FV1RPWSh0ZWxuZXQsICI8MT4yIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgVEVMTkVUCisgIGJvb2wgInRlbG5ldCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICB1c2FnZTogdGVsbmV0IEhPU1QgW1BPUlRdCisKKyAgICBDb25uZWN0IHRvIHRlbG5ldCBzZXJ2ZXIKKyovCisKKyNkZWZpbmUgRk9SX3RlbG5ldAorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlICA8c3lzL3BvbGwuaD4KKworR0xPQkFMUygKKyAgaW50IHBvcnQ7CisgIGludCBzZmQ7CisgIGNoYXIgYnVmZlsxMjhdOworICBpbnQgcGJ1ZmY7CisgIGNoYXIgaWFjWzI1Nl07CisgIGludCBwaWFjOworICBjaGFyICp0dHlwZTsKKyAgc3RydWN0IHRlcm1pb3MgZGVmX3Rlcm07CisgIHN0cnVjdCB0ZXJtaW9zIHJhd190ZXJtOworICB1aW50OF90IHRlcm1fb2s7CisgIHVpbnQ4X3QgdGVybV9tb2RlOworICB1aW50OF90IGZsYWdzOworICB1bnNpZ25lZCB3aW5fd2lkdGg7CisgIHVuc2lnbmVkIHdpbl9oZWlnaHQ7CispCisKKyNkZWZpbmUgREFUQUJVRlNJWkUgMTI4CisjZGVmaW5lIElBQ0JVRlNJWkUgIDI1NgorI2RlZmluZSBDTV9UUlkgICAgICAwCisjZGVmaW5lIENNX09OICAgICAgIDEKKyNkZWZpbmUgQ01fT0ZGICAgICAgMgorI2RlZmluZSBVRl9FQ0hPICAgICAweDAxCisjZGVmaW5lIFVGX1NHQSAgICAgIDB4MDIKKworLy8gc2V0cyB0ZXJtaW5hbCBtb2RlOiBMSU5FIG9yIENIQVJBQ1RFUiBiYXNlZCBvbSBpbnRlcm5hbCBzdGF0Lgorc3RhdGljIGNoYXIgY29uc3QgZXNbXSA9ICJcclxuRXNjYXBlIGNoYXJhY3RlciBpcyAiOworc3RhdGljIHZvaWQgc2V0X21vZGUodm9pZCkKK3sKKyAgaWYgKFRULmZsYWdzICYgVUZfRUNITykgeworICAgIGlmIChUVC50ZXJtX21vZGUgPT0gQ01fVFJZKSB7CisgICAgICBUVC50ZXJtX21vZGUgPSBDTV9PTjsKKyAgICAgIHByaW50ZigiXHJcbkVudGVyaW5nIGNoYXJhY3RlciBtb2RlJXMnXl0nLlxyXG4iLCBlcyk7CisgICAgICBpZiAoVFQudGVybV9vaykgdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJlRULnJhd190ZXJtKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKFRULnRlcm1fbW9kZSAhPSBDTV9PRkYpIHsKKyAgICAgIFRULnRlcm1fbW9kZSA9IENNX09GRjsKKyAgICAgIHByaW50ZigiXHJcbkVudGVyaW5nIGxpbmUgbW9kZSVzJ15DJy5cclxuIiwgZXMpOworICAgICAgaWYgKFRULnRlcm1fb2spIHRjc2V0YXR0cigwLCBUQ1NBRFJBSU4sICZUVC5kZWZfdGVybSk7CisgICAgfQorICB9Cit9CisKKy8vIGZsdXNoZXMgYWxsIGRhdGEgaW4gSUFDIGJ1ZmYgdG8gc2VydmVyLgorc3RhdGljIHZvaWQgZmx1c2hfaWFjKHZvaWQpCit7CisgIGludCB3bGVuID0gd3JpdGUoVFQuc2ZkLCBUVC5pYWMsIFRULnBpYWMpOworCisgIGlmKHdsZW4gPD0gMCkgZXJyb3JfbXNnKCJJQUMgOiBzZW5kIGZhaWxlZC4iKTsKKyAgVFQucGlhYyA9IDA7Cit9CisKKy8vIHB1dHMgREFUQSBpbiBpYWMgYnVmZiBvZiBsZW5ndGggTEVOIGFuZCB1cGRhdGVzIGlhYyBidWZmIHBvaW50ZXIuCitzdGF0aWMgdm9pZCBwdXRfaWFjKGludCBsZW4sIC4uLikKK3sKKyAgdmFfbGlzdCB2YTsgCisKKyAgaWYoVFQucGlhYyArIGxlbiA+PSBJQUNCVUZTSVpFKSBmbHVzaF9pYWMoKTsKKyAgdmFfc3RhcnQodmEsIGxlbik7CisgIGZvcig7bGVuID4gMDsgVFQuaWFjW1RULnBpYWMrK10gPSAodWludDhfdCl2YV9hcmcodmEsIGludCksIGxlbi0tKTsKKyAgdmFfZW5kKHZhKTsKK30KKworLy8gcHV0cyBzdHJpbmcgU1RSIGluIGlhYyBidWZmIGFuZCB1cGRhdGVzIGlhYyBidWZmIHBvaW50ZXIuCitzdGF0aWMgdm9pZCBzdHJfaWFjKGNoYXIgKnN0cikKK3sKKyAgaW50IGxlbiA9IHN0cmxlbihzdHIpOworCisgIGlmKFRULnBpYWMgKyBsZW4gKyAxID49IElBQ0JVRlNJWkUpIGZsdXNoX2lhYygpOworICBzdHJjcHkoJlRULmlhY1tUVC5waWFjXSwgc3RyKTsKKyAgVFQucGlhYyArPSBsZW4rMTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2VzYyh2b2lkKQoreworICBjaGFyIGlucHV0OworCisgIGlmKHRveXMuc2lnbmFsICYmIFRULnRlcm1fb2spIHRjc2V0YXR0cigwLCBUQ1NBRFJBSU4sICZUVC5yYXdfdGVybSk7CisgIHh3cml0ZSgxLCJcclxuQ29uc29sZSBlc2NhcGUuIENvbW1hbmRzIGFyZTpcclxuXG4iCisgICAgICAiIGwgIGdvIHRvIGxpbmUgbW9kZVxyXG4iCisgICAgICAiIGMgIGdvIHRvIGNoYXJhY3RlciBtb2RlXHJcbiIKKyAgICAgICIgeiAgc3VzcGVuZCB0ZWxuZXRcclxuIgorICAgICAgIiBlICBleGl0IHRlbG5ldFxyXG4iLCAxMTQpOworCisgIGlmIChyZWFkKFNURElOX0ZJTEVOTywgJmlucHV0LCAxKSA8PSAwKSB7CisgICAgaWYoVFQudGVybV9vaykgdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJlRULmRlZl90ZXJtKTsKKyAgICBleGl0KDApOworICB9CisKKyAgc3dpdGNoIChpbnB1dCkgeworICBjYXNlICdsJzoKKyAgICBpZiAoIXRveXMuc2lnbmFsKSB7CisgICAgICBUVC50ZXJtX21vZGUgPSBDTV9UUlk7CisgICAgICBUVC5mbGFncyAmPSB+KFVGX0VDSE8gfCBVRl9TR0EpOworICAgICAgc2V0X21vZGUoKTsKKyAgICAgIHB1dF9pYWMoNiwgSUFDLERPTlQsVEVMT1BUX0VDSE8sSUFDLERPTlQsIFRFTE9QVF9TR0EpOworICAgICAgZmx1c2hfaWFjKCk7CisgICAgICBnb3RvIHJldDsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgJ2MnOgorICAgIGlmICh0b3lzLnNpZ25hbCkgeworICAgICAgVFQudGVybV9tb2RlID0gQ01fVFJZOworICAgICAgVFQuZmxhZ3MgfD0gKFVGX0VDSE8gfCBVRl9TR0EpOworICAgICAgc2V0X21vZGUoKTsKKyAgICAgIHB1dF9pYWMoNiwgSUFDLERPLFRFTE9QVF9FQ0hPLElBQyxETyxURUxPUFRfU0dBKTsKKyAgICAgIGZsdXNoX2lhYygpOworICAgICAgZ290byByZXQ7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICd6JzoKKyAgICBpZihUVC50ZXJtX29rKSB0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmVFQuZGVmX3Rlcm0pOworICAgIGtpbGwoMCwgU0lHVFNUUCk7CisgICAgaWYoVFQudGVybV9vaykgdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJlRULnJhd190ZXJtKTsKKyAgICBicmVhazsKKyAgY2FzZSAnZSc6CisgICAgaWYoVFQudGVybV9vaykgdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJlRULmRlZl90ZXJtKTsKKyAgICBleGl0KDApOworICBkZWZhdWx0OiBicmVhazsKKyAgfQorCisgIHh3cml0ZSgxLCAiY29udGludWluZy4uLlxyXG4iLCAxNSk7CisgIGlmICh0b3lzLnNpZ25hbCAmJiBUVC50ZXJtX29rKSB0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmVFQuZGVmX3Rlcm0pOworCityZXQ6CisgIHRveXMuc2lnbmFsID0gMDsKK30KKworLyoKKyAqIGhhbmRsZXMgdGVsbmV0IFNVQiBORUdPVElBVElPTlMKKyAqIG9ubHkgdGVybWluYWwgdHlwZSBpcyBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9uZWdvdGlhdGlvbnModm9pZCkKK3sKKyAgY2hhciBvcHQgPSBUVC5idWZmW1RULnBidWZmKytdOworCisgIHN3aXRjaChvcHQpIHsKKyAgY2FzZSBURUxPUFRfVFRZUEU6CisgICAgb3B0ID0gIFRULmJ1ZmZbVFQucGJ1ZmYrK107CisgICAgaWYob3B0ID09IFRFTFFVQUxfU0VORCkgeworICAgICAgcHV0X2lhYyg0LCBJQUMsU0IsVEVMT1BUX1RUWVBFLFRFTFFVQUxfSVMpOworICAgICAgc3RyX2lhYyhUVC50dHlwZSk7CisgICAgICBwdXRfaWFjKDIsIElBQyxTRSk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OiBicmVhazsKKyAgfQorfQorCisvKgorICogaGFuZGxlcyBzZXJ2ZXIncyBETyBET05UIFdJTEwgV09OVCByZXF1ZXN0cy4KKyAqIHN1cHBvcnRzIEVDSE8sIFNHQSwgVFRZUEUsIE5BV1MKKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2Rkd3coY2hhciBkZHd3KQoreworICBjaGFyIG9wdCA9IFRULmJ1ZmZbVFQucGJ1ZmYrK107CisKKyAgc3dpdGNoIChvcHQpIHsKKyAgY2FzZSBURUxPUFRfRUNITzogLyogRUNITyAqLworICAgIGlmIChkZHd3ID09IERPKSBwdXRfaWFjKDMsIElBQyxXT05ULFRFTE9QVF9FQ0hPKTsKKyAgICBpZihkZHd3ID09IERPTlQpIGJyZWFrOworICAgIGlmIChUVC5mbGFncyAmIFVGX0VDSE8pIHsKKyAgICAgICAgaWYgKGRkd3cgPT0gV0lMTCkgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChkZHd3ID09IFdPTlQpIHJldHVybjsKKyAgICBpZiAoVFQudGVybV9tb2RlICE9IENNX09GRikgVFQuZmxhZ3MgXj0gVUZfRUNITzsKKyAgICAoVFQuZmxhZ3MgJiBVRl9FQ0hPKT8gcHV0X2lhYygzLCBJQUMsRE8sVEVMT1BUX0VDSE8pIDogCisgICAgICBwdXRfaWFjKDMsIElBQyxET05ULFRFTE9QVF9FQ0hPKTsKKyAgICBzZXRfbW9kZSgpOworICAgIHByaW50ZigiXHJcbiIpOworICAgIGJyZWFrOworCisgIGNhc2UgVEVMT1BUX1NHQTogLyogU3VwcmVzcyBHTyBBaGVhZCAqLworICAgIGlmIChUVC5mbGFncyAmIFVGX1NHQSl7IGlmIChkZHd3ID09IFdJTEwpIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGRkd3cgPT0gV09OVCkgcmV0dXJuOworCisgICAgVFQuZmxhZ3MgXj0gVUZfU0dBOworICAgIChUVC5mbGFncyAmIFVGX1NHQSk/IHB1dF9pYWMoMywgSUFDLERPLFRFTE9QVF9TR0EpIDoKKyAgICAgIHB1dF9pYWMoMywgSUFDLERPTlQsVEVMT1BUX1NHQSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBURUxPUFRfVFRZUEU6IC8qIFRlcm1pbmFsIFR5cGUgKi8KKyAgICAoVFQudHR5cGUpPyBwdXRfaWFjKDMsIElBQyxXSUxMLFRFTE9QVF9UVFlQRSk6CisgICAgICBwdXRfaWFjKDMsIElBQyxXT05ULFRFTE9QVF9UVFlQRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBURUxPUFRfTkFXUzogLyogV2luZG93IFNpemUgKi8KKyAgICBwdXRfaWFjKDMsIElBQyxXSUxMLFRFTE9QVF9OQVdTKTsKKyAgICBwdXRfaWFjKDksIElBQyxTQixURUxPUFRfTkFXUywoVFQud2luX3dpZHRoID4+IDgpICYgMHhmZiwKKyAgICAgICAgVFQud2luX3dpZHRoICYgMHhmZiwoVFQud2luX2hlaWdodCA+PiA4KSAmIDB4ZmYsCisgICAgICAgIFRULndpbl9oZWlnaHQgJiAweGZmLElBQyxTRSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDogLyogRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc2F5IE5PICovCisgICAgaWYoZGR3dyA9PSBXSUxMKSBwdXRfaWFjKDMsIElBQyxET05ULG9wdCk7CisgICAgaWYoZGR3dyA9PSBETykgcHV0X2lhYygzLCBJQUMsV09OVCxvcHQpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qCisgKiBwYXJzZXMgZGF0YSB3aGljaCBpcyByZWFkIGZyb20gc2VydmVyIG9mIGxlbmd0aCBMRU4uCisgKiBhbmQgcGFzc2VzIGl0IHRvIGNvbnNvbGUuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9zZXJ2ZXIoaW50IGxlbikKK3sKKyAgaW50IGkgPSAwOworICBjaGFyIGN1cnI7CisgIFRULnBidWZmID0gMDsKKworICBkbyB7CisgICAgY3VyciA9IFRULmJ1ZmZbVFQucGJ1ZmYrK107CisgICAgaWYgKGN1cnIgPT0gSUFDKSB7CisgICAgICBjdXJyID0gVFQuYnVmZltUVC5wYnVmZisrXTsKKyAgICAgIHN3aXRjaCAoY3VycikgeworICAgICAgY2FzZSBETzogICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgRE9OVDogICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgV0lMTDogICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgV09OVDoKKyAgICAgICAgaGFuZGxlX2Rkd3coY3Vycik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQjoKKyAgICAgICAgaGFuZGxlX25lZ290aWF0aW9ucygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0U6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRveWJ1ZltpKytdID0gY3VycjsKKyAgICAgIGlmIChjdXJyID09ICdccicpIHsgY3VyciA9IFRULmJ1ZmZbVFQucGJ1ZmYrK107CisgICAgICAgIGlmIChjdXJyICE9ICdcMCcpIFRULnBidWZmLS07CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChUVC5wYnVmZiA8IGxlbik7CisKKyAgaWYgKGkpIHh3cml0ZShTVERJTl9GSUxFTk8sIHRveWJ1ZiwgaSk7CisgIHJldHVybiAwOworfQorCisvKgorICogcGFyc2VzIGRhdGEgd2hpY2ggaXMgcmVhZCBmcm9tIGNvbnNvbGUgb2YgbGVuZ3RoIExFTgorICogYW5kIHBhc3NlcyBpdCB0byBzZXJ2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3NlcnZlcihpbnQgbGVuKQoreworICBjaGFyICpjID0gKGNoYXIqKVRULmJ1ZmY7CisgIGludCBpID0gMDsKKworICBmb3IgKDsgbGVuID4gMDsgbGVuLS0sIGMrKykgeworICAgIGlmICgqYyA9PSAweDFkKSB7CisgICAgICBoYW5kbGVfZXNjKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHRveWJ1ZltpKytdID0gKmM7CisgICAgaWYgKCpjID09IElBQykgdG95YnVmW2krK10gPSAqYzsgLyogSUFDIC0+IElBQyBJQUMgKi8KKyAgICBlbHNlIGlmICgqYyA9PSAnXHInKSB0b3lidWZbaSsrXSA9ICdcMCc7IC8qIENSIC0+IENSIE5VTCAqLworICB9CisgIGlmKGkpIHh3cml0ZShUVC5zZmQsIHRveWJ1ZiwgaSk7Cit9CisKK3ZvaWQgdGVsbmV0X21haW4odm9pZCkKK3sKKyAgY2hhciAqcG9ydCA9ICIyMyI7CisgIGludCBzZXQgPSAxLCBsZW47CisgIHN0cnVjdCBwb2xsZmQgcGZkc1syXTsKKworICBUVC53aW5fd2lkdGggPSA4MDsgLy9jb2x1bW5zCisgIFRULndpbl9oZWlnaHQgPSAyNDsgLy9yb3dzCisKKyAgaWYgKHRveXMub3B0YyA9PSAyKSBwb3J0ID0gdG95cy5vcHRhcmdzWzFdOworCisgIFRULnR0eXBlID0gZ2V0ZW52KCJURVJNIik7CisgIGlmKCFUVC50dHlwZSkgVFQudHR5cGUgPSAiIjsKKyAgaWYoc3RybGVuKFRULnR0eXBlKSA+IElBQ0JVRlNJWkUtMSkgVFQudHR5cGVbSUFDQlVGU0laRSAtIDFdID0gJ1wwJzsKKworICBpZiAoIXRjZ2V0YXR0cigwLCAmVFQuZGVmX3Rlcm0pKSB7CisgICAgVFQudGVybV9vayA9IDE7CisgICAgVFQucmF3X3Rlcm0gPSBUVC5kZWZfdGVybTsKKyAgICBjZm1ha2VyYXcoJlRULnJhd190ZXJtKTsKKyAgfQorICB0ZXJtaW5hbF9zaXplKCZUVC53aW5fd2lkdGgsICZUVC53aW5faGVpZ2h0KTsKKworICBUVC5zZmQgPSB4Y29ubmVjdCgqdG95cy5vcHRhcmdzLCBwb3J0LCAwLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDApOworICBzZXRzb2Nrb3B0KFRULnNmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmc2V0LCBzaXplb2Yoc2V0KSk7CisgIHNldHNvY2tvcHQoVFQuc2ZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZzZXQsIHNpemVvZihzZXQpKTsKKworICBwZmRzWzBdLmZkID0gU1RESU5fRklMRU5POworICBwZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgcGZkc1sxXS5mZCA9IFRULnNmZDsKKyAgcGZkc1sxXS5ldmVudHMgPSBQT0xMSU47CisKKyAgc2lnbmFsKFNJR0lOVCwgZ2VuZXJpY19zaWduYWwpOworICB3aGlsZSgxKSB7CisgICAgaWYoVFQucGlhYykgZmx1c2hfaWFjKCk7CisgICAgaWYocG9sbChwZmRzLCAyLCAtMSkgPCAwKSB7CisgICAgICBpZiAodG95cy5zaWduYWwpIGhhbmRsZV9lc2MoKTsKKyAgICAgIGVsc2Ugc2xlZXAoMSk7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihwZmRzWzBdLnJldmVudHMpIHsKKyAgICAgIGxlbiA9IHJlYWQoU1RESU5fRklMRU5PLCBUVC5idWZmLCBEQVRBQlVGU0laRSk7CisgICAgICBpZihsZW4gPiAwKSB3cml0ZV9zZXJ2ZXIobGVuKTsKKyAgICAgIGVsc2UgcmV0dXJuOworICAgIH0KKyAgICBpZihwZmRzWzFdLnJldmVudHMpIHsKKyAgICAgIGxlbiA9IHJlYWQoVFQuc2ZkLCBUVC5idWZmLCBEQVRBQlVGU0laRSk7CisgICAgICBpZihsZW4gPiAwKSByZWFkX3NlcnZlcihsZW4pOworICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZigiQ29ubmVjdGlvbiBjbG9zZWQgYnkgZm9yZWlnbiBob3N0XHJcbiIpOworICAgICAgICBpZihUVC50ZXJtX29rKSB0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmVFQuZGVmX3Rlcm0pOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90ZWxuZXRkLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3RlbG5ldGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk4ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90ZWxuZXRkLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qIHRlbG5ldGQuYyAtIFRlbG5ldCBTZXJ2ZXIgCisgKgorICogQ29weXJpZ2h0IDIwMTMgU2FuZGVlcCBTaGFybWEgPHNhbmRlZXAuamFjazI3NTZAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorVVNFX1RFTE5FVEQoTkVXVE9ZKHRlbG5ldGQsICJ3IzwwYjpwIzwwPjY1NTM1PTIzZjpsOkZTS2lbIXdpXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRFTE5FVEQKKyAgYm9vbCAidGVsbmV0ZCIKKyAgZGVmYXVsdCBuCisgIGhlbHAKKyAgICBIYW5kbGUgaW5jb21pbmcgdGVsbmV0IGNvbm5lY3Rpb25zCisKKyAgICAtbCBMT0dJTiAgRXhlYyBMT0dJTiBvbiBjb25uZWN0CisgICAgLWYgSVNTVUVfRklMRSBEaXNwbGF5IElTU1VFX0ZJTEUgaW5zdGVhZCBvZiAvZXRjL2lzc3VlCisgICAgLUsgQ2xvc2UgY29ubmVjdGlvbiBhcyBzb29uIGFzIGxvZ2luIGV4aXRzCisgICAgLXAgUE9SVCAgIFBvcnQgdG8gbGlzdGVuIG9uCisgICAgLWIgQUREUls6UE9SVF0gIEFkZHJlc3MgdG8gYmluZCB0bworICAgIC1GIFJ1biBpbiBmb3JlZ3JvdW5kCisgICAgLWkgSW5ldGQgbW9kZQorICAgIC13IFNFQyAgICBJbmV0ZCAnd2FpdCcgbW9kZSwgbGluZ2VyIHRpbWUgU0VDCisgICAgLVMgTG9nIHRvIHN5c2xvZyAoaW1wbGllZCBieSAtaSBvciB3aXRob3V0IC1GIGFuZCAtdykKKyovCisKKyNkZWZpbmUgRk9SX3RlbG5ldGQKKyNpbmNsdWRlICJ0b3lzLmgiCisjaW5jbHVkZSA8dXRtcC5oPgorR0xPQkFMUygKKyAgICBjaGFyICpsb2dpbl9wYXRoOworICAgIGNoYXIgKmlzc3VlX3BhdGg7CisgICAgaW50IHBvcnQ7CisgICAgY2hhciAqaG9zdF9hZGRyOworICAgIGxvbmcgd19zZWM7CisKKyAgICBpbnQgZ21heF9mZDsKKyAgICBwaWRfdCBmb3JrX3BpZDsKKykKKworCisjIGRlZmluZSBJQUMgICAgICAgICAyNTUgIC8qIGludGVycHJldCBhcyBjb21tYW5kOiAqLworIyBkZWZpbmUgRE9OVCAgICAgICAgMjU0ICAvKiB5b3UgYXJlIG5vdCB0byB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBETyAgICAgICAgICAyNTMgIC8qIHBsZWFzZSwgeW91IHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIFdPTlQgICAgICAgIDI1MiAgLyogSSB3b24ndCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBXSUxMICAgICAgICAyNTEgIC8qIEkgd2lsbCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBTQiAgICAgICAgICAyNTAgIC8qIGludGVycHJldCBhcyBzdWJuZWdvdGlhdGlvbiAqLworIyBkZWZpbmUgU0UgICAgICAgICAgMjQwICAvKiBlbmQgc3ViIG5lZ290aWF0aW9uICovCisjIGRlZmluZSBOT1AgICAgICAgICAyNDEgIC8qIE5vIE9wZXJhdGlvbiAqLworIyBkZWZpbmUgVEVMT1BUX0VDSE8gICAxICAvKiBlY2hvICovCisjIGRlZmluZSBURUxPUFRfU0dBICAgIDMgIC8qIHN1cHByZXNzIGdvIGFoZWFkICovCisjIGRlZmluZSBURUxPUFRfVFRZUEUgMjQgIC8qIHRlcm1pbmFsIHR5cGUgKi8KKyMgZGVmaW5lIFRFTE9QVF9OQVdTICAzMSAgLyogd2luZG93IHNpemUgKi8KKworI2RlZmluZSBCVUZTSVpFIDQqMTAyNAorc3RydWN0IHRlcm1fc2Vzc2lvbiB7CisgIGludCBuZXdfZmQsIHB0eV9mZDsKKyAgcGlkX3QgY2hpbGRfcGlkOworICBpbnQgYnVmZjFfYXZhaWwsIGJ1ZmYyX2F2YWlsOworICBpbnQgYnVmZjFfd3JpdHRlbiwgYnVmZjJfd3JpdHRlbjsKKyAgaW50IHJlbTsgIC8vdW5wcm9jZXNzZWQgZGF0YSBmcm9tIHNvY2tldAorICBjaGFyIGJ1ZmYxW0JVRlNJWkVdLCBidWZmMltCVUZTSVpFXTsKKyAgc3RydWN0IHRlcm1fc2Vzc2lvbiAqbmV4dDsKK307CisKK3N0cnVjdCB0ZXJtX3Nlc3Npb24gKnNlc3Npb25fbGlzdCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGdldF9zb2NrYWRkcihjaGFyICpob3N0LCB2b2lkICpidWYpCit7CisgIGluX3BvcnRfdCBwb3J0X251bSA9IGh0b25zKFRULnBvcnQpOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXN1bHQ7CisgIGludCBzdGF0dXMsIGFmID0gQUZfVU5TUEVDOworICBjaGFyICpzOworCisgIC8vIFtpcHY2XTpwb3J0IG9yIGV4YWN0bHkgb25lIDoKKyAgaWYgKCpob3N0ID09ICdbJykgeworICAgIGhvc3QrKzsKKyAgICBzID0gc3RyY2hyKGhvc3QsICddJyk7CisgICAgaWYgKHMpICpzKysgPSAwOworICAgIGVsc2UgZXJyb3JfZXhpdCgiYmFkIGFkZHJlc3MgJyVzJyIsIGhvc3QtMSk7CisgICAgYWYgPSBBRl9JTkVUNjsKKyAgfSBlbHNlIHsKKyAgICBzID0gc3RycmNocihob3N0LCAnOicpOworICAgIGlmIChzICYmIHN0cmNocihob3N0LCAnOicpID09IHMpIHsKKyAgICAgICpzID0gMDsKKyAgICAgIGFmID0gQUZfSU5FVDsKKyAgICB9IGVsc2UgaWYgKHMgJiYgc3RyY2hyKGhvc3QsICc6JykgIT0gcykgeworICAgICAgYWYgPSBBRl9JTkVUNjsKKyAgICAgIHMgPSAwOworICAgIH0KKyAgfQorCisgIGlmIChzKyspIHsKKyAgICBjaGFyICpzczsKKyAgICB1bnNpZ25lZCBsb25nIHAgPSBzdHJ0b3VsKHMsICZzcywgMCk7CisgICAgaWYgKCEqcyB8fCAqc3MgfHwgcCA+IDY1NTM1KSBlcnJvcl9leGl0KCJiYWQgcG9ydCAnJXMnIiwgcyk7CisgICAgcG9ydF9udW0gPSBodG9ucyhwKTsKKyAgfQorCisgIG1lbXNldCgmaGludHMsIDAgLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IGFmOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisgIHN0YXR1cyA9IGdldGFkZHJpbmZvKGhvc3QsIE5VTEwsICZoaW50cywgJnJlc3VsdCk7CisgIGlmIChzdGF0dXMpIGVycm9yX2V4aXQoImJhZCBhZGRyZXNzICclcycgOiAlcyIsIGhvc3QsIGdhaV9zdHJlcnJvcihzdGF0dXMpKTsKKworICBtZW1jcHkoYnVmLCByZXN1bHQtPmFpX2FkZHIsIHJlc3VsdC0+YWlfYWRkcmxlbik7CisgIGZyZWVhZGRyaW5mbyhyZXN1bHQpOworCisgIGlmIChhZiA9PSBBRl9JTkVUKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopYnVmKS0+c2luX3BvcnQgPSBwb3J0X251bTsKKyAgZWxzZSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWJ1ZiktPnNpbjZfcG9ydCA9IHBvcnRfbnVtOworfQorCitzdGF0aWMgdm9pZCB1dG1wX2VudHJ5KHZvaWQpCit7ICAgICAgICAgICAgICAgCisgIHN0cnVjdCB1dG1wIGVudHJ5OworICBzdHJ1Y3QgdXRtcCAqdXRwX3B0cjsKKyAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisKKyAgdXRtcG5hbWUoX1BBVEhfVVRNUCk7CisgIHNldHV0ZW50KCk7IC8vc3RhcnQgZnJvbSBzdGFydAorICB3aGlsZSAoKHV0cF9wdHIgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CisgICAgaWYgKHV0cF9wdHItPnV0X3BpZCA9PSBwaWQgJiYgdXRwX3B0ci0+dXRfdHlwZSA+PSBJTklUX1BST0NFU1MpIGJyZWFrOworICB9ICAgICAgICAgICAgIAorICBpZiAoIXV0cF9wdHIpIGVudHJ5LnV0X3R5cGUgPSBERUFEX1BST0NFU1M7CisgIHRpbWUoJmVudHJ5LnV0X3RpbWUpOyAgCisgIHNldHV0ZW50KCk7ICAgCisgIHB1dHV0bGluZSgmZW50cnkpOyAgICAgCit9CisKK3N0YXRpYyBpbnQgbGlzdGVuX3NvY2tldCh2b2lkKQoreworICBpbnQgcywgYWYgPSBBRl9JTkVULCB5ZXMgPSAxOworICBjaGFyIGJ1ZltzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpXTsKKworICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSB7CisgICAgZ2V0X3NvY2thZGRyKFRULmhvc3RfYWRkciwgYnVmKTsKKyAgICBhZiA9ICgoc3RydWN0IHNvY2thZGRyICopYnVmKS0+c2FfZmFtaWx5OworICB9IGVsc2UgeworICAgICgoc3RydWN0IHNvY2thZGRyX2luKilidWYpLT5zaW5fcG9ydCA9IGh0b25zKFRULnBvcnQpOworICAgICgoc3RydWN0IHNvY2thZGRyX2luKilidWYpLT5zaW5fZmFtaWx5ID0gYWY7CisgIH0KKyAgcyA9IHhzb2NrZXQoYWYsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY2hhciAqKSZ5ZXMsIHNpemVvZih5ZXMpKSA9PSAtMSkgCisgICAgcGVycm9yX2V4aXQoInNldHNvY2tvcHQiKTsKKworICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopYnVmLCAoKGFmID09IEFGX0lORVQpPworICAgICAgICAgIChzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk6KHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkpKSA9PSAtMSkgeworICAgIGNsb3NlKHMpOworICAgIHBlcnJvcl9leGl0KCJiaW5kIik7CisgIH0KKworICBpZiAobGlzdGVuKHMsIDEpIDwgMCkgcGVycm9yX2V4aXQoImxpc3RlbiIpOworICByZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfaXNzdWUoY2hhciAqdHR5KQoreworICBpbnQgc2l6ZTsKKyAgY2hhciBjaCA9IDA7CisgIHN0cnVjdCB1dHNuYW1lIHU7CisgIGludCBmZCA9IG9wZW4oVFQuaXNzdWVfcGF0aCwgT19SRE9OTFkpOworCisgIGlmIChmZCA8IDApIHJldHVybiA7CisgIHVuYW1lKCZ1KTsKKyAgd2hpbGUgKChzaXplID0gcmVhZGFsbChmZCwgJmNoLCAxKSkgPiAwKSB7CisgICAgaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJyUnKSB7CisgICAgICBpZiAocmVhZGFsbChmZCwgJmNoLCAxKSA8PSAwKSBwZXJyb3JfZXhpdCgicmVhZGFsbCEiKTsKKyAgICAgIGlmIChjaCA9PSAncycpIGZwdXRzKHUuc3lzbmFtZSwgc3Rkb3V0KTsKKyAgICAgIGlmIChjaCA9PSAnbid8fCBjaCA9PSAnaCcpIGZwdXRzKHUubm9kZW5hbWUsIHN0ZG91dCk7CisgICAgICBpZiAoY2ggPT0gJ3InKSBmcHV0cyh1LnJlbGVhc2UsIHN0ZG91dCk7CisgICAgICBpZiAoY2ggPT0gJ20nKSBmcHV0cyh1Lm1hY2hpbmUsIHN0ZG91dCk7CisgICAgICBpZiAoY2ggPT0gJ2wnKSBmcHV0cyh0dHksIHN0ZG91dCk7CisgICAgfQorICAgIGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgIGZwdXRzKCJcblxyXDAiLCBzdGRvdXQpOworICAgIH0gZWxzZSBmcHV0YyhjaCwgc3Rkb3V0KTsKKyAgfQorICBmZmx1c2goTlVMTCk7CisgIGNsb3NlKGZkKTsKK30KKworc3RhdGljIGludCBuZXdfc2Vzc2lvbihpbnQgc29ja2ZkKQoreworICBjaGFyICphcmd2X2xvZ2luWzJdOyAvL2FyZ3VtZW50cyBmb3IgZXhlY3ZwIGNtZCwgTlVMTAorICBjaGFyIHR0eV9uYW1lWzMwXTsgLy90dHkgbmFtZSBsZW5ndGguCisgIGludCBmZCwgZmxhZ3MsIGkgPSAxOworICBjaGFyIGludGlhbF9pYWNzW10gPSB7SUFDLCBETywgVEVMT1BUX0VDSE8sIElBQywgRE8sIFRFTE9QVF9OQVdTLAorICAgIElBQywgV0lMTCwgVEVMT1BUX0VDSE8sIElBQywgV0lMTCwgVEVMT1BUX1NHQSB9OworCisgIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZpLCBzaXplb2YoaSkpOworICBmbGFncyA9IGZjbnRsKHNvY2tmZCwgRl9HRVRGTCk7CisgIGZjbnRsKHNvY2tmZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIGZjbnRsKChzb2NrZmQgKyAxKSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKworICB3cml0ZWFsbCgodG95cy5vcHRmbGFncyAmIEZMQUdfaSk/MTpzb2NrZmQsIGludGlhbF9pYWNzLCBzaXplb2YoaW50aWFsX2lhY3MpKTsKKyAgaWYgKChUVC5mb3JrX3BpZCA9IGZvcmtwdHkoJmZkLCB0dHlfbmFtZSwgTlVMTCwgTlVMTCkpID4gMCkgeworICAgIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwpOworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOworICAgIHJldHVybiBmZDsKKyAgfQorICBpZiAoVFQuZm9ya19waWQgPCAwKSBwZXJyb3JfZXhpdCgiZm9yayIpOworICB3cml0ZV9pc3N1ZSh0dHlfbmFtZSk7CisgIGFyZ3ZfbG9naW5bMF0gPSBzdHJkdXAoVFQubG9naW5fcGF0aCk7CisgIGFyZ3ZfbG9naW5bMV0gPSBOVUxMOworICBleGVjdnAoYXJndl9sb2dpblswXSwgYXJndl9sb2dpbik7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfaWFjcyhzdHJ1Y3QgdGVybV9zZXNzaW9uICp0bSwgaW50IGMsIGludCBmZCkKK3sKKyAgY2hhciAqY3VyciAsKnN0YXJ0LCplbmQ7CisgIGludCBpID0gMDsKKworICBjdXJyID0gc3RhcnQgPSB0bS0+YnVmZjIrdG0tPmJ1ZmYyX2F2YWlsOyAKKyAgZW5kID0gdG0tPmJ1ZmYyICsgYyAtMTsKKyAgdG0tPnJlbSA9IDA7CisgIHdoaWxlIChjdXJyIDw9IGVuZCkgeworICAgIGlmICgqY3VyciAhPSBJQUMpeworCisgICAgICBpZiAoKmN1cnIgIT0gJ1xyJykgeworICAgICAgICB0b3lidWZbaSsrXSA9ICpjdXJyKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG95YnVmW2krK10gPSAqY3VycisrOworICAgICAgICBjdXJyKys7CisgICAgICAgIGlmIChjdXJyIDwgZW5kICYmICgqY3VyciA9PSAnXG4nIHx8ICpjdXJyID09ICdcMCcpKSAKKyAgICAgICAgICBjdXJyKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoY3VyciArIDEpID4gZW5kKSB7CisgICAgICB0bS0+cmVtID0gMTsKKyAgICAgIGJyZWFrOyAKKyAgICB9CisgICAgaWYgKCooY3VycisxKSA9PSBJQUMpIHsgLy9JQUMgYXMgZGF0YSAtLT4gSUFDIElBQworICAgICAgdG95YnVmW2krK10gPSAqKGN1cnIrMSk7CisgICAgICBjdXJyICs9IDI7IC8vSUFDIElBQyAtLT4gMiBieXRlcworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICgqKGN1cnIgKyAxKSA9PSBOT1AgfHwgKihjdXJyICsgMSkgPT0gU0UpIHsKKyAgICAgIGN1cnIgKz0gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICgqKGN1cnIgKyAxKSA9PSBTQiApIHsKKyAgICAgIGlmICgqKGN1cnIrMikgPT0gVEVMT1BUX05BV1MpIHsKKyAgICAgICAgc3RydWN0IHdpbnNpemUgd3M7CisgICAgICAgIGlmICgoY3Vycis4KSA+PSBlbmQpIHsgIC8vZW5zdXJlIHdlIGhhdmUgZGF0YSB0byBwcm9jZXNzLgorICAgICAgICAgIHRtLT5yZW0gPSBlbmQgLSBjdXJyOyAKKyAgICAgICAgICBicmVhazsgIAorICAgICAgICB9CisgICAgICAgIHdzLndzX2NvbCA9IChjdXJyWzNdIDw8IDgpIHwgY3Vycls0XTsKKyAgICAgICAgd3Mud3Nfcm93ID0gKGN1cnJbNV0gPDwgOCkgfCBjdXJyWzZdOworICAgICAgICBpb2N0bChmZCwgVElPQ1NXSU5TWiwgKGNoYXIgKikmd3MpOworICAgICAgICBjdXJyICs9IDk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsgLy9lYXQgbm9uLXN1cHBvcnRlZCBzdWIgbmVnLiBvcHRpb25zLgorICAgICAgICBjdXJyKyssIHRtLT5yZW0rKzsKKyAgICAgICAgd2hpbGUgKCpjdXJyICE9IElBQyAmJiBjdXJyIDw9IGVuZCkgeworICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICB0bS0+cmVtKys7CisgICAgICAgIH0gCisgICAgICAgIGlmICgqY3VyciA9PSBJQUMpIHsKKyAgICAgICAgICB0bS0+cmVtID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBjdXJyICs9IDM7IC8vc2tpcCBub24tc3VwcG9ydGVkIDMgYnl0ZXMuCisgIH0KKyAgbWVtY3B5KHN0YXJ0LCB0b3lidWYsIGkpOworICBtZW1jcHkoc3RhcnQgKyBpLCBlbmQgLSB0bS0+cmVtLCB0bS0+cmVtKTsgLy9wdXQgcmVtYWluaW5nIGlmIHdlIGJyZWFrOworICByZXR1cm4gaTsKK30KKworc3RhdGljIGludCBkdXBfaWFjcyhjaGFyICpzdGFydCwgaW50IGZkLCBpbnQgbGVuKQoreworICBjaGFyIGFycltdID0ge0lBQywgSUFDfTsKKyAgY2hhciAqbmVlZGxlID0gTlVMTDsKKyAgaW50IHJldCA9IDAsIGMsIGNvdW50ID0gMDsKKworICB3aGlsZSAobGVuKSB7CisgICAgaWYgKCpzdGFydCA9PSBJQUMpIHsKKyAgICAgIGNvdW50ID0gd3JpdGVhbGwoZmQsIGFyciwgc2l6ZW9mKGFycikpOworICAgICAgaWYgKGNvdW50ICE9IDIpIGJyZWFrOyAvL3Nob3J0IHdyaXRlCisgICAgICBzdGFydCsrOworICAgICAgcmV0Kys7CisgICAgICBsZW4tLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBuZWVkbGUgPSBtZW1jaHIoc3RhcnQsIElBQywgbGVuKTsKKyAgICBpZiAobmVlZGxlKSBjID0gbmVlZGxlIC0gc3RhcnQ7CisgICAgZWxzZSBjID0gbGVuOworICAgIGNvdW50ID0gd3JpdGVhbGwoZmQsIHN0YXJ0LCBjKTsKKyAgICBpZiAoY291bnQgPCAwKSBicmVhazsgCisgICAgbGVuIC09IGNvdW50OworICAgIHJldCArPSBjb3VudDsKKyAgICBzdGFydCArPSBjb3VudDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit2b2lkIHRlbG5ldGRfbWFpbih2b2lkKQoreworICBlcnJubyA9IDA7CisgIGZkX3NldCByZCwgd3I7CisgIHN0cnVjdCB0ZXJtX3Nlc3Npb24gKnRtID0gTlVMTDsKKyAgc3RydWN0IHRpbWV2YWwgdHYsICp0dl9wdHIgPSBOVUxMOworICBpbnQgcHR5X2ZkLCBuZXdfZmQsIGMgPSAwLCB3LCBtYXN0ZXJfZmQgPSAwOworICBpbnQgaW5ldGRfbSA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX2k7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbCkpIFRULmxvZ2luX3BhdGggPSAiL2Jpbi9sb2dpbiI7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSBUVC5pc3N1ZV9wYXRoID0gIi9ldGMvaXNzdWUubmV0IjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3cpIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19GOworICBpZiAoIWluZXRkX20pIHsKKyAgICBtYXN0ZXJfZmQgPSBsaXN0ZW5fc29ja2V0KCk7CisgICAgZmNudGwobWFzdGVyX2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgICBpZiAobWFzdGVyX2ZkID4gVFQuZ21heF9mZCkgVFQuZ21heF9mZCA9IG1hc3Rlcl9mZDsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19GKSkgZGFlbW9uKDAsIDApOyAKKyAgfSBlbHNlIHsKKyAgICBwdHlfZmQgPSBuZXdfc2Vzc2lvbihtYXN0ZXJfZmQpOyAvL21hc3Rlcl9mZCA9IDAKKyAgICBpZiAocHR5X2ZkID4gVFQuZ21heF9mZCkgVFQuZ21heF9mZCA9IHB0eV9mZDsKKyAgICB0bSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtX3Nlc3Npb24pKTsKKyAgICB0bS0+Y2hpbGRfcGlkID0gVFQuZm9ya19waWQ7CisgICAgdG0tPm5ld19mZCA9IDA7ICAgIAorICAgIHRtLT5wdHlfZmQgPSBwdHlfZmQ7ICAgIAorICAgIGlmIChzZXNzaW9uX2xpc3QpIHsgICAgIAorICAgICAgdG0tPm5leHQgPSBzZXNzaW9uX2xpc3Q7CisgICAgICBzZXNzaW9uX2xpc3QgPSB0bTsgICAgCisgICAgfSBlbHNlIHNlc3Npb25fbGlzdCA9IHRtOworICB9CisKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR193KSAmJiAhc2Vzc2lvbl9saXN0KSB7CisgICAgdHYudHZfc2VjID0gVFQud19zZWM7CisgICAgdHYudHZfdXNlYyA9IDA7CisgICAgdHZfcHRyID0gJnR2OworICB9ICAgICAgICAgICAgICAgIAorICBzaWduYWwoU0lHQ0hMRCwgZ2VuZXJpY19zaWduYWwpOworCisgIGZvciAoOzspIHsKKyAgICBGRF9aRVJPKCZyZCk7CisgICAgRkRfWkVSTygmd3IpOworICAgIGlmICghaW5ldGRfbSkgRkRfU0VUKG1hc3Rlcl9mZCwgJnJkKTsKKworICAgIHRtID0gc2Vzc2lvbl9saXN0OworICAgIHdoaWxlICh0bSkgeworCisgICAgICBpZiAodG0tPnB0eV9mZCA+IDAgJiYgdG0tPmJ1ZmYxX2F2YWlsIDwgQlVGU0laRSkgRkRfU0VUKHRtLT5wdHlfZmQsICZyZCk7CisgICAgICBpZiAodG0tPm5ld19mZCA+PSAwICYmIHRtLT5idWZmMl9hdmFpbCA8IEJVRlNJWkUpIEZEX1NFVCh0bS0+bmV3X2ZkLCAmcmQpOworICAgICAgaWYgKHRtLT5wdHlfZmQgPiAwICYmICh0bS0+YnVmZjJfYXZhaWwgLSB0bS0+YnVmZjJfd3JpdHRlbikgPiAwKSAgCisgICAgICAgIEZEX1NFVCh0bS0+cHR5X2ZkLCAmd3IpOworICAgICAgaWYgKHRtLT5uZXdfZmQgPj0gMCAmJiAodG0tPmJ1ZmYxX2F2YWlsIC0gdG0tPmJ1ZmYxX3dyaXR0ZW4pID4gMCkgIAorICAgICAgICBGRF9TRVQodG0tPm5ld19mZCwgJndyKTsKKyAgICAgIHRtID0gdG0tPm5leHQ7CisgICAgfQorCisKKyAgICBpbnQgciA9IHNlbGVjdChUVC5nbWF4X2ZkICsgMSwgJnJkLCAmd3IsIE5VTEwsIHR2X3B0cik7CisgICAgaWYgKCFyKSByZXR1cm47IC8vdGltZW91dAorICAgIGlmIChyIDwgLTEpIGNvbnRpbnVlOworCisgICAgaWYgKCFpbmV0ZF9tICYmIEZEX0lTU0VUKG1hc3Rlcl9mZCwgJnJkKSkgeyAvL2FjY2VwdCBuZXcgY29ubmVjdGlvbgorICAgICAgbmV3X2ZkID0gYWNjZXB0KG1hc3Rlcl9mZCwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAobmV3X2ZkIDwgMCkgY29udGludWU7CisgICAgICB0dl9wdHIgPSBOVUxMOworICAgICAgZmNudGwobmV3X2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgICAgIGlmIChuZXdfZmQgPiBUVC5nbWF4X2ZkKSBUVC5nbWF4X2ZkID0gbmV3X2ZkOworICAgICAgcHR5X2ZkID0gbmV3X3Nlc3Npb24obmV3X2ZkKTsKKyAgICAgIGlmIChwdHlfZmQgPiBUVC5nbWF4X2ZkKSBUVC5nbWF4X2ZkID0gcHR5X2ZkOworCisgICAgICB0bSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtX3Nlc3Npb24pKTsKKyAgICAgIHRtLT5jaGlsZF9waWQgPSBUVC5mb3JrX3BpZDsKKyAgICAgIHRtLT5uZXdfZmQgPSBuZXdfZmQ7CisgICAgICB0bS0+cHR5X2ZkID0gcHR5X2ZkOworICAgICAgaWYgKHNlc3Npb25fbGlzdCkgeworICAgICAgICB0bS0+bmV4dCA9IHNlc3Npb25fbGlzdDsKKyAgICAgICAgc2Vzc2lvbl9saXN0ID0gdG07CisgICAgICB9IGVsc2Ugc2Vzc2lvbl9saXN0ID0gdG07CisgICAgfQorCisgICAgdG0gPSBzZXNzaW9uX2xpc3Q7CisgICAgZm9yICg7dG07dG09dG0tPm5leHQpIHsKKyAgICAgIGlmIChGRF9JU1NFVCh0bS0+cHR5X2ZkLCAmcmQpKSB7CisgICAgICAgIGlmICgoYyA9IHJlYWQodG0tPnB0eV9mZCwgdG0tPmJ1ZmYxICsgdG0tPmJ1ZmYxX2F2YWlsLAorICAgICAgICAgICAgICAgIEJVRlNJWkUtdG0tPmJ1ZmYxX2F2YWlsKSkgPD0gMCkgYnJlYWs7CisgICAgICAgIHRtLT5idWZmMV9hdmFpbCArPSBjOworICAgICAgICBpZiAoKHcgPSBkdXBfaWFjcyh0bS0+YnVmZjEgKyB0bS0+YnVmZjFfd3JpdHRlbiwgdG0tPm5ld19mZCArIGluZXRkX20sCisgICAgICAgICAgICAgICAgdG0tPmJ1ZmYxX2F2YWlsIC0gdG0tPmJ1ZmYxX3dyaXR0ZW4pKSA8IDApIGJyZWFrOworICAgICAgICB0bS0+YnVmZjFfd3JpdHRlbiArPSB3OworICAgICAgfQorICAgICAgaWYgKEZEX0lTU0VUKHRtLT5uZXdfZmQsICZyZCkpIHsKKyAgICAgICAgaWYgKChjID0gcmVhZCh0bS0+bmV3X2ZkLCB0bS0+YnVmZjIrdG0tPmJ1ZmYyX2F2YWlsLAorICAgICAgICAgICAgICAgIEJVRlNJWkUtdG0tPmJ1ZmYyX2F2YWlsKSkgPD0gMCkgYnJlYWs7CisgICAgICAgIGMgPSBoYW5kbGVfaWFjcyh0bSwgYywgdG0tPnB0eV9mZCk7CisgICAgICAgIHRtLT5idWZmMl9hdmFpbCArPSBjOworICAgICAgICBpZiAoKHcgPSB3cml0ZSh0bS0+cHR5X2ZkLCB0bS0+YnVmZjIrIHRtLT5idWZmMl93cml0dGVuLCAKKyAgICAgICAgICAgICAgICB0bS0+YnVmZjJfYXZhaWwgLSB0bS0+YnVmZjJfd3JpdHRlbikpIDwgMCkgYnJlYWs7CisgICAgICAgIHRtLT5idWZmMl93cml0dGVuICs9IHc7CisgICAgICB9CisgICAgICBpZiAoRkRfSVNTRVQodG0tPnB0eV9mZCwgJndyKSkgeworICAgICAgICBpZiAoKHcgPSB3cml0ZSh0bS0+cHR5X2ZkLCAgdG0tPmJ1ZmYyICsgdG0tPmJ1ZmYyX3dyaXR0ZW4sIAorICAgICAgICAgICAgICAgIHRtLT5idWZmMl9hdmFpbCAtIHRtLT5idWZmMl93cml0dGVuKSkgPCAwKSBicmVhazsKKyAgICAgICAgdG0tPmJ1ZmYyX3dyaXR0ZW4gKz0gdzsKKyAgICAgIH0KKyAgICAgIGlmIChGRF9JU1NFVCh0bS0+bmV3X2ZkLCAmd3IpKSB7CisgICAgICAgIGlmICgodyA9IGR1cF9pYWNzKHRtLT5idWZmMSArIHRtLT5idWZmMV93cml0dGVuLCB0bS0+bmV3X2ZkICsgaW5ldGRfbSwKKyAgICAgICAgICAgICAgICB0bS0+YnVmZjFfYXZhaWwgLSB0bS0+YnVmZjFfd3JpdHRlbikpIDwgMCkgYnJlYWs7CisgICAgICAgIHRtLT5idWZmMV93cml0dGVuICs9IHc7CisgICAgICB9CisgICAgICBpZiAodG0tPmJ1ZmYxX3dyaXR0ZW4gPT0gdG0tPmJ1ZmYxX2F2YWlsKQorICAgICAgICB0bS0+YnVmZjFfd3JpdHRlbiA9IHRtLT5idWZmMV9hdmFpbCA9IDA7CisgICAgICBpZiAodG0tPmJ1ZmYyX3dyaXR0ZW4gPT0gdG0tPmJ1ZmYyX2F2YWlsKQorICAgICAgICB0bS0+YnVmZjJfd3JpdHRlbiA9IHRtLT5idWZmMl9hdmFpbCA9IDA7CisgICAgICBmZmx1c2goTlVMTCk7CisgICAgfQorCisgICAgLy8gTG9vcCB0byBoYW5kbGUgKHVua25vd24gbnVtYmVyIG9mKSBTSUdDSExEIG5vdGlmaWNhdGlvbnMKKyAgICB3aGlsZSAodG95cy5zaWduYWwpIHsKKyAgICAgIGludCBzdGF0dXM7CisgICAgICBzdHJ1Y3QgdGVybV9zZXNzaW9uICpwcmV2ID0gTlVMTDsKKyAgICAgIHBpZF90IHBpZDsKKworICAgICAgLy8gZnVubnkgbGl0dGxlIGRhbmNlIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4KKyAgICAgIHRveXMuc2lnbmFsID0gMDsKKyAgICAgIHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpOworICAgICAgaWYgKHBpZCA8IDApIGJyZWFrOworICAgICAgdG95cy5zaWduYWwrKzsKKworCisgICAgICBmb3IgKHRtID0gc2Vzc2lvbl9saXN0OyB0bTsgdG0gPSB0bS0+bmV4dCkgeworICAgICAgICBpZiAodG0tPmNoaWxkX3BpZCA9PSBwaWQpIGJyZWFrOworICAgICAgICBwcmV2ID0gdG07CisgICAgICB9CisgICAgICBpZiAoIXRtKSByZXR1cm47IC8vIHJlcGFyZW50ZWQgY2hpbGQgd2UgZG9uJ3QgY2FyZSBhYm91dAorCisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfaSkgZXhpdChFWElUX1NVQ0NFU1MpOworICAgICAgaWYgKCFwcmV2KSBzZXNzaW9uX2xpc3QgPSBzZXNzaW9uX2xpc3QtPm5leHQ7CisgICAgICBlbHNlIHByZXYtPm5leHQgPSB0bS0+bmV4dDsKKyAgICAgIHV0bXBfZW50cnkoKTsKKyAgICAgIHhjbG9zZSh0bS0+cHR5X2ZkKTsKKyAgICAgIHhjbG9zZSh0bS0+bmV3X2ZkKTsKKyAgICAgIGZyZWUodG0pOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90ZXN0LmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90ZXN0LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHRlc3QuYyAtIGV2YWx1YXRlIGV4cHJlc3Npb24KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdGVzdC5odG1sCisKK1VTRV9URVNUKE5FV1RPWSh0ZXN0LCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBURVNUCisgIGJvb2wgInRlc3QiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHRlc3QgWy1iY2RlZmdoTFByU3N1d3ggUEFUSF0gWy1ueiBTVFJJTkddIFstdCBGRF0gW1ggPz8gWV0KKworICAgIFJldHVybiB0cnVlIG9yIGZhbHNlIGJ5IHBlcmZvcm1pbmcgdGVzdHMuIChXaXRoIG5vIGFyZ3VtZW50cyByZXR1cm4gZmFsc2UuKQorCisgICAgLS0tIFRlc3RzIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgKGFmdGVyIHRoZSBvcHRpb24pOgorICAgIFBBVEggaXMvaGFzOgorICAgICAgLWIgIGJsb2NrIGRldmljZSAgIC1mICByZWd1bGFyIGZpbGUgICAtcCAgZmlmbyAgICAgICAgICAgLXUgIHNldHVpZCBiaXQKKyAgICAgIC1jICBjaGFyIGRldmljZSAgICAtZyAgc2V0Z2lkICAgICAgICAgLXIgIHJlYWQgYml0ICAgICAgIC13ICB3cml0ZSBiaXQKKyAgICAgIC1kICBkaXJlY3RvcnkgICAgICAtaCAgc3ltbGluayAgICAgICAgLVMgIHNvY2tldCAgICAgICAgIC14ICBleGVjdXRlIGJpdAorICAgICAgLWUgIGV4aXN0cyAgICAgICAgIC1MICBzeW1saW5rICAgICAgICAtcyAgbm9uemVybyBzaXplCisgICAgU1RSSU5HIGlzOgorICAgICAgLW4gIG5vbnplcm8gc2l6ZSAgIC16ICB6ZXJvIHNpemUgICAgICAoU1RSSU5HIGJ5IGl0c2VsZiBpbXBsaWVzIC1uKQorICAgIEZEIChpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvcikgaXM6CisgICAgICAtdCAgYSBUVFkKKworICAgIC0tLSBUZXN0cyB3aXRoIG9uZSBhcmd1bWVudCBvbiBlYWNoIHNpZGUgb2YgYW4gb3BlcmF0b3I6CisgICAgVHdvIHN0cmluZ3M6CisgICAgICA9ICBhcmUgaWRlbnRpY2FsCSAhPSAgZGlmZmVyCisgICAgVHdvIGludGVnZXJzOgorICAgICAgLWVxICBlcXVhbCAgICAgICAgIC1ndCAgZmlyc3QgPiBzZWNvbmQgICAgLWx0ICBmaXJzdCA8IHNlY29uZAorICAgICAgLW5lICBub3QgZXF1YWwgICAgIC1nZSAgZmlyc3QgPj0gc2Vjb25kICAgLWxlICBmaXJzdCA8PSBzZWNvbmQKKworICAgIC0tLSBNb2RpZnkgb3IgY29tYmluZSB0ZXN0czoKKyAgICAgICEgRVhQUiAgICAgbm90IChzd2FwIHRydWUvZmFsc2UpICAgRVhQUiAtYSBFWFBSICAgIGFuZCAoYXJlIGJvdGggdHJ1ZSkKKyAgICAgICggRVhQUiApICAgZXZhbHVhdGUgdGhpcyBmaXJzdCAgICAgRVhQUiAtbyBFWFBSICAgIG9yIChpcyBlaXRoZXIgdHJ1ZSkKKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgdGVzdF9tYWluKHZvaWQpCit7CisgIGludCBpZCwgbm90OworICBjaGFyICpzLCAqZXJyX2ZtdCA9ICJCYWQgZmxhZyAnJXMnIjsKKworICB0b3lzLmV4aXR2YWwgPSAyOworICBpZiAoIXN0cmNtcCgiWyIsIHRveXMud2hpY2gtPm5hbWUpKQorICAgIGlmICghc3RyY21wKCJdIiwgdG95cy5vcHRhcmdzWy0tdG95cy5vcHRjXSkpIGVycm9yX2V4aXQoIk1pc3NpbmcgJ10nIik7CisgIGlmICghc3RyY21wKCIhIiwgdG95cy5vcHRhcmdzWzBdKSkgeworICAgIG5vdCA9IDE7CisgICAgdG95cy5vcHRhcmdzKys7CisgICAgdG95cy5vcHRjLS07CisgIH0KKyAgaWYgKCF0b3lzLm9wdGMpIHRveXMuZXhpdHZhbCA9IDA7CisgIGVsc2UgaWYgKHRveXMub3B0YXJnc1swXVswXSA9PSAnLScpIHsKKyAgICBpZCA9IHN0cmlkeCgiYmNkZWZnaExwU3N1cnd4em50IiwgdG95cy5vcHRhcmdzWzBdWzFdKTsKKyAgICBpZiAoaWQgPT0gLTEgfHwgdG95cy5vcHRhcmdzWzBdWzJdKSBlcnJvcl9leGl0KGVycl9mbXQsIHRveXMub3B0YXJnc1swXSk7CisgICAgaWYgKGlkIDwgMTIpIHsKKyAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgaW50IG5vbGluazsKKworICAgICAgdG95cy5leGl0dmFsID0gMTsKKyAgICAgIGlmIChsc3RhdCh0b3lzLm9wdGFyZ3NbMV0sICZzdCkgPT0gLTEpIHJldHVybjsKKyAgICAgIG5vbGluayA9ICFTX0lTTE5LKHN0LnN0X21vZGUpOworICAgICAgaWYgKCFub2xpbmsgJiYgKHN0YXQodG95cy5vcHRhcmdzWzFdLCAmc3QpID09IC0xKSkgcmV0dXJuOworCisgICAgICBpZiAoaWQgPT0gMCkgdG95cy5leGl0dmFsID0gIVNfSVNCTEsoc3Quc3RfbW9kZSk7IC8vIGIKKyAgICAgIGVsc2UgaWYgKGlkID09IDEpIHRveXMuZXhpdHZhbCA9ICFTX0lTQ0hSKHN0LnN0X21vZGUpOyAvLyBjCisgICAgICBlbHNlIGlmIChpZCA9PSAyKSB0b3lzLmV4aXR2YWwgPSAhU19JU0RJUihzdC5zdF9tb2RlKTsgLy8gZAorICAgICAgZWxzZSBpZiAoaWQgPT0gMykgdG95cy5leGl0dmFsID0gMDsgLy8gZQorICAgICAgZWxzZSBpZiAoaWQgPT0gNCkgdG95cy5leGl0dmFsID0gIVNfSVNSRUcoc3Quc3RfbW9kZSk7IC8vIGYKKyAgICAgIGVsc2UgaWYgKGlkID09IDUpIHRveXMuZXhpdHZhbCA9ICEoc3Quc3RfbW9kZSAmIFNfSVNHSUQpOyAvLyBnCisgICAgICBlbHNlIGlmICgoaWQgPT0gNikgfHwgKGlkID09IDcpKSB0b3lzLmV4aXR2YWwgPSBub2xpbms7IC8vIGhMCisgICAgICBlbHNlIGlmIChpZCA9PSA4KSB0b3lzLmV4aXR2YWwgPSAhU19JU0ZJRk8oc3Quc3RfbW9kZSk7IC8vIHAKKyAgICAgIGVsc2UgaWYgKGlkID09IDkpIHRveXMuZXhpdHZhbCA9ICFTX0lTU09DSyhzdC5zdF9tb2RlKTsgLy8gUworICAgICAgZWxzZSBpZiAoaWQgPT0gMTApIHRveXMuZXhpdHZhbCA9IHN0LnN0X3NpemUgPT0gMDsgLy8gcworICAgICAgZWxzZSB0b3lzLmV4aXR2YWwgPSAhKHN0LnN0X21vZGUgJiBTX0lTVUlEKTsgLy8gdQorICAgIH0KKyAgICBlbHNlIGlmIChpZCA8IDE1KSAvLyByd3gKKyAgICAgIHRveXMuZXhpdHZhbCA9IGFjY2Vzcyh0b3lzLm9wdGFyZ3NbMV0sIDEgPDwgKGlkIC0gMTIpKSA9PSAtMTsKKyAgICBlbHNlIGlmIChpZCA8IDE3KSAvLyB6bgorICAgICAgdG95cy5leGl0dmFsID0gdG95cy5vcHRhcmdzWzFdICYmICEqdG95cy5vcHRhcmdzWzFdIF4gKGlkIC0gMTUpOworICAgIGVsc2UgeyAvLyB0CisgICAgICBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOworICAgICAgdG95cy5leGl0dmFsID0gdGNnZXRhdHRyKGF0b2kodG95cy5vcHRhcmdzWzFdKSwgJnRlcm1pb3MpID09IC0xOworICAgIH0KKyAgfQorICBlbHNlIGlmICh0b3lzLm9wdGMgPT0gMSkgdG95cy5leGl0dmFsID0gKnRveXMub3B0YXJnc1swXSA9PSAwOworICBlbHNlIGlmICh0b3lzLm9wdGMgPT0gMykgeworICAgIGlmICgqdG95cy5vcHRhcmdzWzFdID09ICctJykgeworICAgICAgbG9uZyBhID0gYXRvbCh0b3lzLm9wdGFyZ3NbMF0pLCBiID0gYXRvbCh0b3lzLm9wdGFyZ3NbMl0pOworICAgICAgCisgICAgICBzID0gdG95cy5vcHRhcmdzWzFdICsgMTsKKyAgICAgIGlmICghc3RyY21wKCJlcSIsIHMpKSB0b3lzLmV4aXR2YWwgPSBhICE9IGI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCJuZSIsIHMpKSB0b3lzLmV4aXR2YWwgPSBhID09IGI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCJndCIsIHMpKSB0b3lzLmV4aXR2YWwgPSBhIDwgYjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoImdlIiwgcykpIHRveXMuZXhpdHZhbCA9IGEgPD0gYjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoImx0IiwgcykpIHRveXMuZXhpdHZhbCA9IGEgPiBiOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCgibGUiLCBzKSkgdG95cy5leGl0dmFsID0gYSA+PSBiOworICAgICAgZWxzZSBlcnJvcl9leGl0KGVycl9mbXQsIHRveXMub3B0YXJnc1sxXSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IHJlc3VsdCA9IHN0cmNtcCh0b3lzLm9wdGFyZ3NbMF0sIHRveXMub3B0YXJnc1syXSk7CisKKyAgICAgIHMgPSB0b3lzLm9wdGFyZ3NbMV07CisgICAgICBpZiAoIXN0cmNtcCgiPSIsIHMpKSB0b3lzLmV4aXR2YWwgPSAhIXJlc3VsdDsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoIiE9IiwgcykpIHRveXMuZXhpdHZhbCA9ICFyZXN1bHQ7CisgICAgICBlbHNlIGVycm9yX2V4aXQoZXJyX2ZtdCwgdG95cy5vcHRhcmdzWzFdKTsKKyAgICB9CisgIH0KKyAgdG95cy5leGl0dmFsIF49IG5vdDsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90ZnRwLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3RmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZmZTllCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90ZnRwLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qIHRmdHAuYyAtIFRGVFAgY2xpZW50LgorICoKKyAqIENvcHlyaWdodCAyMDEyIE1hZGh1ciBWZXJtYSA8bWFkLmZsZXhpQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE1IFNhbWVlciBQcmFrYXNoIFByYWRoYW4gPHNhbWVlci5wLnByYWRoYW5AZ21haWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkLgorCitVU0VfVEZUUChORVdUT1kodGZ0cCwgIjwxYiM8OD42NTQ2NHI6bDpnfHB8WyFncF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBURlRQCisgIGJvb2wgInRmdHAiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHRmdHAgW09QVElPTlNdIEhPU1QgW1BPUlRdCisKKyAgICBUcmFuc2ZlciBmaWxlIGZyb20vdG8gdGZ0cCBzZXJ2ZXIuCisKKyAgICAtbCBGSUxFIExvY2FsIEZJTEUKKyAgICAtciBGSUxFIFJlbW90ZSBGSUxFCisgICAgLWcgICAgR2V0IGZpbGUKKyAgICAtcCAgICBQdXQgZmlsZQorICAgIC1iIFNJWkUgVHJhbnNmZXIgYmxvY2tzIG9mIFNJWkUgb2N0ZXRzKDggPD0gU0laRSA8PSA2NTQ2NCkKKyovCisjZGVmaW5lIEZPUl90ZnRwCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpsb2NhbF9maWxlOworICBjaGFyICpyZW1vdGVfZmlsZTsKKyAgbG9uZyBibG9ja19zaXplOworCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGluYWRkcjsKKyAgaW50IGFmOworKQorCisjZGVmaW5lIFRGVFBfQkxLU0laRSAgICA1MTIKKyNkZWZpbmUgVEZUUF9SRVRSSUVTICAgIDMKKyNkZWZpbmUgVEZUUF9EQVRBSEVBREVSU0laRSA0CisjZGVmaW5lIFRGVFBfTUFYUEFDS0VUU0laRSAgKFRGVFBfREFUQUhFQURFUlNJWkUgKyBURlRQX0JMS1NJWkUpCisjZGVmaW5lIFRGVFBfUEFDS0VUU0laRSAgICBURlRQX01BWFBBQ0tFVFNJWkUKKyNkZWZpbmUgVEZUUF9EQVRBU0laRSAgICAoVEZUUF9QQUNLRVRTSVpFLVRGVFBfREFUQUhFQURFUlNJWkUpCisjZGVmaW5lIFRGVFBfSU9CVUZTSVpFICAgIChURlRQX1BBQ0tFVFNJWkUrOCkKKworI2RlZmluZSBURlRQX09QX1JSUSAgICAgIDEgIC8qIFJlYWQgUmVxdWVzdCAgICAgIFJGQyAxMzUwLCBSRkMgMjA5MCAqLworI2RlZmluZSBURlRQX09QX1dSUSAgICAgIDIgIC8qIFdyaXRlIFJlcXVlc3QgICAgIFJGQyAxMzUwICovCisjZGVmaW5lIFRGVFBfT1BfREFUQSAgICAzICAvKiBEYXRhIGNodW5rICAgICAgUkZDIDEzNTAgKi8KKyNkZWZpbmUgVEZUUF9PUF9BQ0sgICAgICA0ICAvKiBBY2tub3dsZWRnZW1lbnQgICAgIFJGQyAxMzUwICovCisjZGVmaW5lIFRGVFBfT1BfRVJSICAgICAgNSAgLyogRXJyb3IgTWVzc2FnZSAgICAgUkZDIDEzNTAgKi8KKyNkZWZpbmUgVEZUUF9PUF9PQUNLICAgIDYgIC8qIE9wdGlvbiBhY2tub3dsZWRnbWVudCBSRkMgMjM0NyAqLworCisjZGVmaW5lIFRGVFBfRVJfSUxMRUdBTE9QICA0ICAvKiBJbGxlZ2FsIFRGVFAgb3BlcmF0aW9uICovCisjZGVmaW5lIFRGVFBfRVJfVU5LSUQgICAgNSAgLyogVW5rbm93biB0cmFuc2ZlciBJRCAqLworCisjZGVmaW5lIFRGVFBfRVNfTk9TVUNIRklMRSAgIkZpbGUgbm90IGZvdW5kIgorI2RlZmluZSBURlRQX0VTX0FDQ0VTUyAgICAiQWNjZXNzIHZpb2xhdGlvbiIKKyNkZWZpbmUgVEZUUF9FU19GVUxMICAgICJEaXNrIGZ1bGwgb3IgYWxsb2NhdGlvbiBleGNlZWRlZCIKKyNkZWZpbmUgVEZUUF9FU19JTExFR0FMT1AgICJJbGxlZ2FsIFRGVFAgb3BlcmF0aW9uIgorI2RlZmluZSBURlRQX0VTX1VOS0lEICAgICJVbmtub3duIHRyYW5zZmVyIElEIgorI2RlZmluZSBURlRQX0VTX0VYSVNUUyAgICAiRmlsZSBhbHJlYWR5IGV4aXN0cyIKKyNkZWZpbmUgVEZUUF9FU19VTktVU0VSICAgICJObyBzdWNoIHVzZXIiCisjZGVmaW5lIFRGVFBfRVNfTkVHT1RJQVRFICAiVGVybWluYXRlIHRyYW5zZmVyIGR1ZSB0byBvcHRpb24gbmVnb3RpYXRpb24iCisKKy8vIEluaXRpYWxpemVzIFNFUlZFUiB3aXRoIEFERFIgYW5kIHJldHVybnMgc29ja2V0Lgorc3RhdGljIGludCBpbml0X3RmdHAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNlcnZlcikKK3sKKyAgc3RydWN0IHRpbWV2YWwgdG8gPSB7IC50dl9zZWMgPSAxMCwgLy9UaW1lIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgLnR2X3VzZWMgPSAwIH07CisgIGNvbnN0IGludCBzZXQgPSAxOworICBpbnQgcG9ydCA9IDY5LCBzZCA9IHhzb2NrZXQoVFQuYWYsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKworICB4c2V0c29ja29wdChzZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICh2b2lkICopJnRvLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKyAgeHNldHNvY2tvcHQoc2QsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmc2V0LCBzaXplb2Yoc2V0KSk7CisKKyAgaWYodG95cy5vcHRjID09IDIpIHBvcnQgPSBhdG9seF9yYW5nZSh0b3lzLm9wdGFyZ3NbMV0sIDEsIDY1NTM1KTsKKyAgbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisgIGlmIChUVC5hZiA9PSBBRl9JTkVUNikgeworICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2VydmVyKS0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNlcnZlciktPnNpbjZfYWRkciA9CisgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZUVC5pbmFkZHIpLT5zaW42X2FkZHI7CisgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzZXJ2ZXIpLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgfQorICBlbHNlIHsKKyAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopc2VydmVyKS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNlcnZlciktPnNpbl9hZGRyLnNfYWRkciA9CisgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopJlRULmluYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopc2VydmVyKS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgfQorICByZXR1cm4gc2Q7Cit9CisKKy8qCisgKiBNYWtlcyBhIHJlcXVlc3QgcGFja2V0IGluIEJVRkZFUiB3aXRoIE9QQ09ERSBhbmQgZmlsZSBQQVRIIG9mIE1PREUKKyAqIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbnQgbWtwa3RfcmVxdWVzdCh1aW50OF90ICpidWZmZXIsIGludCBvcGNvZGUsIGNoYXIgKnBhdGgsIGludCBtb2RlKQoreworICBidWZmZXJbMF0gPSBvcGNvZGUgPj4gODsKKyAgYnVmZmVyWzFdID0gb3Bjb2RlICYgMHhmZjsKKyAgaWYoc3RybGVuKHBhdGgpID4gVEZUUF9CTEtTSVpFKSBlcnJvcl9leGl0KCJwYXRoIHRvbyBsb25nIik7CisgIHJldHVybiBzcHJpbnRmKChjaGFyKikgJmJ1ZmZlclsyXSwgIiVzJWMlcyIsIHBhdGgsIDAsIAorICAgIChtb2RlID8gIm9jdGV0IiA6ICJuZXRhc2NpaSIpKSArIDM7Cit9CisKKy8qCisgKiBNYWtlcyBhbiBhY2tub3dsZWRnZW1lbnQgcGFja2V0IGluIEJVRkZFUiBvZiBCTE9DTk8KKyAqIGFuZCByZXR1cm5zIHBhY2tldCBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgbWtwa3RfYWNrKHVpbnQ4X3QgKmJ1ZmZlciwgdWludDE2X3QgYmxvY2tubykKK3sKKyAgYnVmZmVyWzBdID0gVEZUUF9PUF9BQ0sgPj4gODsKKyAgYnVmZmVyWzFdID0gVEZUUF9PUF9BQ0sgJiAweGZmOworICBidWZmZXJbMl0gPSBibG9ja25vID4+IDg7CisgIGJ1ZmZlclszXSA9IGJsb2Nrbm8gJiAweGZmOworICByZXR1cm4gNDsKK30KKworLyoKKyAqIE1ha2VzIGFuIGVycm9yIHBhY2tldCBpbiBCVUZGRVIgd2l0aCBFUlJPUkNPREUgYW5kIEVSUk9STVNHLgorICogYW5kIHJldHVybnMgcGFja2V0IGxlbmd0aC4KKyAqLworc3RhdGljIGludCBta3BrdF9lcnIodWludDhfdCAqYnVmZmVyLCB1aW50MTZfdCBlcnJvcmNvZGUsIGNoYXIgKmVycm9ybXNnKQoreworICBidWZmZXJbMF0gPSBURlRQX09QX0VSUiA+PiA4OworICBidWZmZXJbMV0gPSBURlRQX09QX0VSUiAmIDB4ZmY7CisgIGJ1ZmZlclsyXSA9IGVycm9yY29kZSA+PiA4OworICBidWZmZXJbM10gPSBlcnJvcmNvZGUgJiAweGZmOworICBzdHJjcHkoKGNoYXIqKSAmYnVmZmVyWzRdLCBlcnJvcm1zZyk7CisgIHJldHVybiBzdHJsZW4oZXJyb3Jtc2cpICsgNTsKK30KKworLyoKKyAqIFJlY2lldmVzIGRhdGEgZnJvbSBzZXJ2ZXIgaW4gQlVGRiB3aXRoIHNvY2tldCBTRCBhbmQgdXBkYXRlcyBGUk9NCisgKiBhbmQgcmV0dXJucyByZWFkIGxlbmd0aC4KKyAqLworc3RhdGljIHNzaXplX3QgcmVhZF9zZXJ2ZXIoaW50IHNkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpmcm9tKQoreworICBzb2NrbGVuX3QgYWxlbjsKKyAgc3NpemVfdCBuYjsKKyAgCisgIGZvciAoOzspIHsKKyAgICBtZW1zZXQoYnVmLCAwLCBsZW4pOworICAgIGFsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworICAgIG5iID0gcmVjdmZyb20oc2QsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopIGZyb20sICZhbGVuKTsKKyAgICBpZiAobmIgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgIHBlcnJvcl9tc2coInNlcnZlciByZWFkIHRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gbmI7CisgICAgICB9ZWxzZSBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgICAgcGVycm9yX21zZygic2VydmVyIHJlYWQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBuYjsKKyAgICAgIH0KKyAgICB9ZWxzZSByZXR1cm4gbmI7CisgIH0KKyAgcmV0dXJuIG5iOworfQorCisvKgorICogc2VuZHMgZGF0YSB0byBzZXJ2ZXIgVE8gZnJvbSBCVUZGIG9mIGxlbmd0aCBMRU4gdGhyb3VnaCBzb2NrZXQgU0QKKyAqIGFuZCByZXR1cm5zIHN1Y2Nlc3NmdWxseSBzZW5kIGJ5dGVzIG51bWJlci4KKyAqLworc3RhdGljIHNzaXplX3Qgd3JpdGVfc2VydmVyKGludCBzZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqdG8pCit7CisgIHNzaXplX3QgbmI7CisgIAorICBmb3IgKDs7KSB7CisgICAgbmIgPSBzZW5kdG8oc2QsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopdG8sCisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKKyAgICBpZiAobmIgPCAwKSB7CisgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgICAgcGVycm9yX21zZygic2VydmVyIHdyaXRlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gbmI7CisgICAgICB9CisgICAgfSBlbHNlIHJldHVybiBuYjsKKyAgfQorICByZXR1cm4gbmI7Cit9CisKKy8vIGNoZWNrcyBwYWNrZXQgZm9yIGRhdGEgYW5kIHVwZGF0ZXMgYmxvY2sgbm8KK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2RhdGEoIHVpbnQ4X3QgKnBhY2tldCwgdWludDE2X3QgKm9wY29kZSwgCisgIHVpbnQxNl90ICpibG9ja25vKQoreworICAqb3Bjb2RlID0gKHVpbnQxNl90KSBwYWNrZXRbMF0gPDwgOCB8ICh1aW50MTZfdCkgcGFja2V0WzFdOworICBpZiAoKm9wY29kZSA9PSBURlRQX09QX0RBVEEpIHsKKyAgICAqYmxvY2tubyA9ICh1aW50MTZfdCkgcGFja2V0WzJdIDw8IDggfCAodWludDE2X3QpIHBhY2tldFszXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8vIE1ha2VzIGRhdGEgcGFja2V0IHRocm91Z2ggRkQgZnJvbSBmaWxlIE9GRlNFVCBpbiBidWZmZXIgUEFDS0VUIG9mIEJMT0NLTk8KK3N0YXRpYyBpbnQgbWtwa3RfZGF0YShpbnQgZmQsIG9mZl90IG9mZnNldCwgdWludDhfdCAqcGFja2V0LCB1aW50MTZfdCBibG9ja25vKQoreworICBvZmZfdCB0bXA7CisgIGludCBuYnl0ZXNyZWFkOworCisgIHBhY2tldFswXSA9IFRGVFBfT1BfREFUQSA+PiA4OworICBwYWNrZXRbMV0gPSBURlRQX09QX0RBVEEgJiAweGZmOworICBwYWNrZXRbMl0gPSBibG9ja25vID4+IDg7CisgIHBhY2tldFszXSA9IGJsb2Nrbm8gJiAweGZmOworICB0bXAgPSBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgIGlmICh0bXAgPT0gKG9mZl90KSAtMSkgeworICAgIHBlcnJvcl9tc2coImxzZWVrIGZhaWxlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBuYnl0ZXNyZWFkID0gcmVhZGFsbChmZCwgJnBhY2tldFtURlRQX0RBVEFIRUFERVJTSVpFXSwgVEZUUF9EQVRBU0laRSk7CisgIGlmIChuYnl0ZXNyZWFkIDwgMCkgcmV0dXJuIC0xOworICByZXR1cm4gbmJ5dGVzcmVhZCArIFRGVFBfREFUQUhFQURFUlNJWkU7Cit9CisKKy8vIFJlY2VpdmVzIEFDSyByZXNwb25zZXMgZnJvbSBzZXJ2ZXIgYW5kIHVwZGF0ZXMgYmxvY2tubworc3RhdGljIGludCByZWFkX2FjayhpbnQgc2QsIHVpbnQ4X3QgKnBhY2tldCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNlcnZlciwKKyAgdWludDE2X3QgKnBvcnQsIHVpbnQxNl90ICpibG9ja25vKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tOworICBzc2l6ZV90IG5ieXRlczsKKyAgdWludDE2X3Qgb3Bjb2RlLCByYmxvY2tubzsKKyAgaW50IHBhY2tldGxlbiwgcmV0cnk7CisKKyAgZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgVEZUUF9SRVRSSUVTOyByZXRyeSsrKSB7CisgICAgZm9yICg7OykgeworICAgICAgbmJ5dGVzID0gcmVhZF9zZXJ2ZXIoc2QsIHBhY2tldCwgVEZUUF9JT0JVRlNJWkUsICZmcm9tKTsKKyAgICAgIGlmIChuYnl0ZXMgPCA0KSB7IC8vIEFjayBoZWFkZXJzaXplID0gNAorICAgICAgICBpZiAobmJ5dGVzID09IDApIGVycm9yX21zZygiQ29ubmVjdGlvbiBsb3N0LiIpOworICAgICAgICBlbHNlIGlmIChuYnl0ZXMgPiAwKSBlcnJvcl9tc2coIlNob3J0IHBhY2tldDogJWQgYnl0ZXMiLCBuYnl0ZXMpOworICAgICAgICBlbHNlIGVycm9yX21zZygiU2VydmVyIHJlYWQgQUNLIGZhaWx1cmUuIik7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCEqcG9ydCkgeworICAgICAgICAgICpwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9wb3J0OworICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopc2VydmVyKS0+c2luX3BvcnQgPQorICAgICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9wb3J0OworICAgICAgICB9CisgICAgICAgIGlmICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNlcnZlciktPnNpbl9hZGRyLnNfYWRkciAhPQorICAgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopJmZyb20pLT5zaW5fYWRkci5zX2FkZHIpIHsKKyAgICAgICAgICBlcnJvcl9tc2coIkludmFsaWQgYWRkcmVzcyBpbiBEQVRBLiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqcG9ydCAhPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNlcnZlciktPnNpbl9wb3J0KSB7CisgICAgICAgICAgZXJyb3JfbXNnKCJJbnZhbGlkIHBvcnQgaW4gREFUQS4iKTsKKyAgICAgICAgICBwYWNrZXRsZW4gPSBta3BrdF9lcnIocGFja2V0LCBURlRQX0VSX1VOS0lELCBURlRQX0VTX1VOS0lEKTsKKyAgICAgICAgICAodm9pZCkgd3JpdGVfc2VydmVyKHNkLCBwYWNrZXQsIHBhY2tldGxlbiwgc2VydmVyKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvcGNvZGUgPSAodWludDE2X3QpIHBhY2tldFswXSA8PCA4IHwgKHVpbnQxNl90KSBwYWNrZXRbMV07CisgICAgICAgIHJibG9ja25vID0gKHVpbnQxNl90KSBwYWNrZXRbMl0gPDwgOCB8ICh1aW50MTZfdCkgcGFja2V0WzNdOworCisgICAgICAgIGlmIChvcGNvZGUgIT0gVEZUUF9PUF9BQ0spIHsKKyAgICAgICAgICBlcnJvcl9tc2coIkJhZCBvcGNvZGUuIik7CisgICAgICAgICAgaWYgKG9wY29kZSA+IDUpIHsKKyAgICAgICAgICAgIHBhY2tldGxlbiA9IG1rcGt0X2VycihwYWNrZXQsIFRGVFBfRVJfSUxMRUdBTE9QLCBURlRQX0VTX0lMTEVHQUxPUCk7CisgICAgICAgICAgICAodm9pZCkgd3JpdGVfc2VydmVyKHNkLCBwYWNrZXQsIHBhY2tldGxlbiwgc2VydmVyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2Nrbm8pICpibG9ja25vID0gcmJsb2Nrbm87CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICBlcnJvcl9tc2coIlRpbWVvdXQsIFdhaXRpbmcgZm9yIEFDSy4iKTsKKyAgcmV0dXJuIC0xOworfQorCisvLyByZWNlaXZlcyBmaWxlIGZyb20gc2VydmVyLgorc3RhdGljIGludCBmaWxlX2dldCh2b2lkKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzZXJ2ZXIsIGZyb207CisgIHVpbnQ4X3QgKnBhY2tldDsKKyAgdWludDE2X3QgYmxvY2tubyA9IDAsIG9wY29kZSwgcmJsb2Nrbm8gPSAwOworICBpbnQgbGVuLCBzZCwgZmQsIHJldHJ5LCBuYnl0ZXNyZWN2ZCA9IDAsIG5kYXRhYnl0ZXMsIHJldCwgcmVzdWx0ID0gLTE7CisKKyAgc2QgPSBpbml0X3RmdHAoJnNlcnZlcik7CisKKyAgcGFja2V0ID0gKHVpbnQ4X3QqKSB4emFsbG9jKFRGVFBfSU9CVUZTSVpFKTsKKyAgZmQgPSB4Y3JlYXRlKFRULmxvY2FsX2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpOworCisgIGxlbiA9IG1rcGt0X3JlcXVlc3QocGFja2V0LCBURlRQX09QX1JSUSwgVFQucmVtb3RlX2ZpbGUsIDEpOworICByZXQgPSB3cml0ZV9zZXJ2ZXIoc2QsIHBhY2tldCwgbGVuLCAmc2VydmVyKTsKKyAgaWYgKHJldCAhPSBsZW4peworICAgIHVubGluayhUVC5sb2NhbF9maWxlKTsKKyAgICBnb3RvIGVycm91dF93aXRoX3NkOworICB9CisgIGlmIChUVC5hZiA9PSBBRl9JTkVUNikgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlciktPnNpbjZfcG9ydCA9IDA7CisgIGVsc2UgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2VydmVyKS0+c2luX3BvcnQgPSAwOworCisgIGRvIHsKKyAgICBibG9ja25vKys7CisgICAgZm9yIChyZXRyeSA9IDAgOyByZXRyeSA8IFRGVFBfUkVUUklFUzsgcmV0cnkrKykgeworICAgICAgbmJ5dGVzcmVjdmQgPSByZWFkX3NlcnZlcihzZCwgcGFja2V0LCBURlRQX0lPQlVGU0laRSwgJmZyb20pOworICAgICAgaWYgKG5ieXRlc3JlY3ZkID4gMCkgeworICAgICAgICBpZiAoICgoVFQuYWYgPT0gQUZfSU5FVCkgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoJigoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlciktPnNpbl9hZGRyLAorICAgICAgICAgICAgICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZmcm9tKS0+c2luX2FkZHIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpIHx8CisgICAgICAgICAgICAgKChUVC5hZiA9PSBBRl9JTkVUNikgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzZXJ2ZXIpLT5zaW42X2FkZHIsCisgICAgICAgICAgICAgICAgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZmcm9tKS0+c2luNl9hZGRyLAorICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkpIHsKKyAgICAgICAgICBlcnJvcl9tc2coIkludmFsaWQgYWRkcmVzcyBpbiBEQVRBLiIpOworICAgICAgICAgIHJldHJ5LS07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoKFRULmFmID09IEFGX0lORVQpICYmICgoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlciktPnNpbl9wb3J0CisgICAgICAgICAgICAgICAgJiYgKCgoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlciktPnNpbl9wb3J0ICE9CisgICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9wb3J0KSkgfHwKKyAgICAgICAgICAgICAoKFRULmFmID09IEFGX0lORVQ2KSAmJiAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2VydmVyKS0+c2luNl9wb3J0CisgICAgICAgICAgICAgICAgJiYgKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzZXJ2ZXIpLT5zaW42X3BvcnQgIT0KKyAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZnJvbSktPnNpbjZfcG9ydCkpKSB7CisgICAgICAgICAgZXJyb3JfbXNnKCJJbnZhbGlkIHBvcnQgaW4gREFUQS4iKTsKKyAgICAgICAgICBsZW4gPSBta3BrdF9lcnIocGFja2V0LCBURlRQX0VSX1VOS0lELCBURlRQX0VTX1VOS0lEKTsKKyAgICAgICAgICByZXQgPSB3cml0ZV9zZXJ2ZXIoc2QsIHBhY2tldCwgbGVuLCAmZnJvbSk7CisgICAgICAgICAgcmV0cnktLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmJ5dGVzcmVjdmQgPCBURlRQX0RBVEFIRUFERVJTSVpFKSB7CisgICAgICAgICAgZXJyb3JfbXNnKCJUaW55IGRhdGEgcGFja2V0IGlnbm9yZWQuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWNrX2RhdGEocGFja2V0LCAmb3Bjb2RlLCAmcmJsb2Nrbm8pICE9IDAKKyAgICAgICAgICAgIHx8IGJsb2Nrbm8gIT0gcmJsb2Nrbm8pIHsKKworICAgICAgICBpZiAob3Bjb2RlID09IFRGVFBfT1BfRVJSKSB7CisgICAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJEQVRBIENoZWNrIGZhaWx1cmUuIjsKKyAgICAgICAgICAgIGNoYXIgKmFycltdID0ge1RGVFBfRVNfTk9TVUNIRklMRSwgVEZUUF9FU19BQ0NFU1MsCisgICAgICAgICAgICAgIFRGVFBfRVNfRlVMTCwgVEZUUF9FU19JTExFR0FMT1AsCisgICAgICAgICAgICAgIFRGVFBfRVNfVU5LSUQsIFRGVFBfRVNfRVhJU1RTLAorICAgICAgICAgICAgICBURlRQX0VTX1VOS1VTRVIsIFRGVFBfRVNfTkVHT1RJQVRFfTsKKyAgICAgICAgICAgIGlmIChyYmxvY2tubyAmJiAocmJsb2Nrbm8gPCA5KSkgbWVzc2FnZSA9IGFycltyYmxvY2tubyAtIDFdOworICAgICAgICAgICAgZXJyb3JfbXNnKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChvcGNvZGUgPiA1KSB7CisgICAgICAgICAgbGVuID0gbWtwa3RfZXJyKHBhY2tldCwgVEZUUF9FUl9JTExFR0FMT1AsIFRGVFBfRVNfSUxMRUdBTE9QKTsKKyAgICAgICAgICByZXQgPSB3cml0ZV9zZXJ2ZXIoc2QsIHBhY2tldCwgbGVuLCAmZnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChUVC5hZiA9PSBBRl9JTkVUNikgJiYgISgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzZXJ2ZXIpLT5zaW42X3BvcnQpCisgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlciktPnNpbjZfcG9ydCA9CisgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZnJvbSktPnNpbjZfcG9ydDsKKyAgICAgICAgZWxzZSBpZiAoKFRULmFmID09IEFGX0lORVQpICYmICEoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzZXJ2ZXIpLT5zaW5fcG9ydCkKKyAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzZXJ2ZXIpLT5zaW5fcG9ydCA9CisgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZmcm9tKS0+c2luX3BvcnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmV0cnkgPT0gVEZUUF9SRVRSSUVTKSB7CisgICAgICBlcnJvcl9tc2coIlJldHJ5IGxpbWl0IGV4Y2VlZGVkLiIpOworICAgICAgdW5saW5rKFRULmxvY2FsX2ZpbGUpOworICAgICAgZ290byBlcnJvdXRfd2l0aF9zZDsKKyAgICB9CisgICAgbmRhdGFieXRlcyA9IG5ieXRlc3JlY3ZkIC0gVEZUUF9EQVRBSEVBREVSU0laRTsKKyAgICBpZiAod3JpdGVhbGwoZmQsIHBhY2tldCArIFRGVFBfREFUQUhFQURFUlNJWkUsIG5kYXRhYnl0ZXMpIDwgMCl7CisgICAgICB1bmxpbmsoVFQubG9jYWxfZmlsZSk7CisgICAgICBnb3RvIGVycm91dF93aXRoX3NkOworICAgIH0KKyAgICBsZW4gPSBta3BrdF9hY2socGFja2V0LCBibG9ja25vKTsKKyAgICByZXQgPSB3cml0ZV9zZXJ2ZXIoc2QsIHBhY2tldCwgbGVuLCAmc2VydmVyKTsKKyAgICBpZiAocmV0ICE9IGxlbil7CisgICAgICB1bmxpbmsoVFQubG9jYWxfZmlsZSk7CisgICAgICBnb3RvIGVycm91dF93aXRoX3NkOworICAgIH0KKyAgfSB3aGlsZSAobmRhdGFieXRlcyA+PSBURlRQX0RBVEFTSVpFKTsKKworICByZXN1bHQgPSAwOworCitlcnJvdXRfd2l0aF9zZDogeGNsb3NlKHNkKTsKKyAgZnJlZShwYWNrZXQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBTZW5kcyBmaWxlIHRvIHNlcnZlci4KK2ludCBmaWxlX3B1dCh2b2lkKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzZXJ2ZXI7CisgIHVpbnQ4X3QgKnBhY2tldDsKKyAgb2ZmX3Qgb2Zmc2V0ID0gMDsKKyAgdWludDE2X3QgYmxvY2tubyA9IDEsIHJibG9ja25vLCBwb3J0ID0gMDsKKyAgaW50IHBhY2tldGxlbiwgc2QsIGZkLCByZXRyeSA9IDAsIHJldCwgcmVzdWx0ID0gLTE7CisKKyAgc2QgPSBpbml0X3RmdHAoJnNlcnZlcik7CisgIHBhY2tldCA9ICh1aW50OF90Kil4emFsbG9jKFRGVFBfSU9CVUZTSVpFKTsKKyAgZmQgPSB4b3BlbnJvKFRULmxvY2FsX2ZpbGUpOworCisgIGZvciAoOzspIHsgIC8vZmlyc3QgbG9vcCBmb3IgcmVxdWVzdCBzZW5kIGFuZCBjb25maXJtYXRpb24gZnJvbSBzZXJ2ZXIuCisgICAgcGFja2V0bGVuID0gbWtwa3RfcmVxdWVzdChwYWNrZXQsIFRGVFBfT1BfV1JRLCBUVC5yZW1vdGVfZmlsZSwgMSk7CisgICAgcmV0ID0gd3JpdGVfc2VydmVyKHNkLCBwYWNrZXQsIHBhY2tldGxlbiwgJnNlcnZlcik7CisgICAgaWYgKHJldCAhPSBwYWNrZXRsZW4pIGdvdG8gZXJyb3V0X3dpdGhfc2Q7CisgICAgaWYgKHJlYWRfYWNrKHNkLCBwYWNrZXQsICZzZXJ2ZXIsICZwb3J0LCBOVUxMKSA9PSAwKSBicmVhazsKKyAgICBpZiAoKytyZXRyeSA+IFRGVFBfUkVUUklFUykgeworICAgICAgZXJyb3JfbXNnKCJSZXRyeSBjb3VudCBleGNlZWRlZC4iKTsKKyAgICAgIGdvdG8gZXJyb3V0X3dpdGhfc2Q7CisgICAgfQorICB9CisgIGZvciAoOzspIHsgIC8vIGxvb3AgZm9yIGRhdGEgc2VuZGluZyBhbmQgcmVjZXZpbmcgYWNrIGZyb20gc2VydmVyLgorICAgIHBhY2tldGxlbiA9IG1rcGt0X2RhdGEoZmQsIG9mZnNldCwgcGFja2V0LCBibG9ja25vKTsKKyAgICBpZiAocGFja2V0bGVuIDwgMCkgZ290byBlcnJvdXRfd2l0aF9zZDsKKworICAgIHJldCA9IHdyaXRlX3NlcnZlcihzZCwgcGFja2V0LCBwYWNrZXRsZW4sICZzZXJ2ZXIpOworICAgIGlmIChyZXQgIT0gcGFja2V0bGVuKSBnb3RvIGVycm91dF93aXRoX3NkOworCisgICAgaWYgKHJlYWRfYWNrKHNkLCBwYWNrZXQsICZzZXJ2ZXIsICZwb3J0LCAmcmJsb2Nrbm8pID09IDApIHsKKyAgICAgIGlmIChyYmxvY2tubyA9PSBibG9ja25vKSB7CisgICAgICAgIGlmIChwYWNrZXRsZW4gPCBURlRQX1BBQ0tFVFNJWkUpIGJyZWFrOworICAgICAgICBibG9ja25vKys7CisgICAgICAgIG9mZnNldCArPSBURlRQX0RBVEFTSVpFOworICAgICAgICByZXRyeSA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoKytyZXRyeSA+IFRGVFBfUkVUUklFUykgeworICAgICAgZXJyb3JfbXNnKCJSZXRyeSBjb3VudCBleGNlZWRlZC4iKTsKKyAgICAgIGdvdG8gZXJyb3V0X3dpdGhfc2Q7CisgICAgfQorICB9CisgIHJlc3VsdCA9IDA7CisKK2Vycm91dF93aXRoX3NkOiBjbG9zZShzZCk7CisgIGZyZWUocGFja2V0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB0ZnRwX21haW4odm9pZCkKK3sKKyAgc3RydWN0IGFkZHJpbmZvICppbmZvLCBycCwgKnJlcz0wOworICBpbnQgcmV0OworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19yKSB7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbCkpIHsKKyAgICAgIGNoYXIgKnNsYXNoID0gc3RycmNocihUVC5yZW1vdGVfZmlsZSwgJy8nKTsKKyAgICAgIFRULmxvY2FsX2ZpbGUgPSAoc2xhc2gpID8gc2xhc2ggKyAxIDogVFQucmVtb3RlX2ZpbGU7CisgICAgfQorICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIFRULnJlbW90ZV9maWxlID0gVFQubG9jYWxfZmlsZTsKKyAgZWxzZSBlcnJvcl9leGl0KCJQbGVhc2UgcHJvdmlkZSBzb21lIGZpbGVzLiIpOworCisgIG1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOworICBycC5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIHJwLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHJldCA9IGdldGFkZHJpbmZvKHRveXMub3B0YXJnc1swXSwgdG95cy5vcHRhcmdzWzFdLCAmcnAsICZpbmZvKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBmb3IgKHJlcyA9IGluZm87IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KQorICAgIGlmICggKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHx8IChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikpIGJyZWFrOworICB9CisgIGlmICghcmVzKQorICAgIGVycm9yX2V4aXQoImJhZCBhZGRyZXNzICclcycgOiAlcyIsIHRveXMub3B0YXJnc1swXSwgZ2FpX3N0cmVycm9yKHJldCkpOworICBUVC5hZiA9IGluZm8tPmFpX2ZhbWlseTsKKworICBtZW1jcHkoKHZvaWQgKikmVFQuaW5hZGRyLCBpbmZvLT5haV9hZGRyLCBpbmZvLT5haV9hZGRybGVuKTsKKyAgZnJlZWFkZHJpbmZvKGluZm8pOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19nKSBmaWxlX2dldCgpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgZmlsZV9wdXQoKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvdGZ0cGQuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvdGZ0cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDYzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90ZnRwZC5jCkBAIC0wLDAgKzEsMzA5IEBACisvKiB0ZnRwZC5jIC0gVEZUUCBzZXJ2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTMgUmFuamFuIEt1bWFyIDxyYW5qYW5rdW1hci5idGhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQuCisKK1VTRV9URlRQRChORVdUT1kodGZ0cGQsICJyY3U6bCIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRGVFBECisgIGJvb2wgInRmdHBkIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB0ZnRwZCBbLWNyXSBbLXUgVVNFUl0gW0RJUl0KKworICAgIFRyYW5zZmVyIGZpbGUgZnJvbS90byB0ZnRwIHNlcnZlci4KKworICAgIC1yCXJlYWQgb25seQorICAgIC1jCUFsbG93IGZpbGUgY3JlYXRpb24gdmlhIHVwbG9hZAorICAgIC11CXJ1biBhcyBVU0VSCisgICAgLWwJTG9nIHRvIHN5c2xvZyAoaW5ldGQgbW9kZSByZXF1aXJlcyB0aGlzKQorKi8KKworI2RlZmluZSBGT1JfdGZ0cGQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnVzZXI7CisKKyAgbG9uZyBzZmQ7CisgIHN0cnVjdCBwYXNzd2QgKnB3OworKQorCisjZGVmaW5lIFRGVFBEX0JMS1NJWkUgNTEyICAvLyBhcyBwZXIgUkZDIDEzNTAuCisKKy8vIG9wY29kZXMKKyNkZWZpbmUgVEZUUERfT1BfUlJRICAxICAvLyBSZWFkIFJlcXVlc3QgICAgICAgICAgUkZDIDEzNTAsIFJGQyAyMDkwCisjZGVmaW5lIFRGVFBEX09QX1dSUSAgMiAgLy8gV3JpdGUgUmVxdWVzdCAgICAgICAgIFJGQyAxMzUwCisjZGVmaW5lIFRGVFBEX09QX0RBVEEgMyAgLy8gRGF0YSBjaHVuayAgICAgICAgICAgIFJGQyAxMzUwCisjZGVmaW5lIFRGVFBEX09QX0FDSyAgNCAgLy8gQWNrbm93bGVkZ2VtZW50ICAgICAgIFJGQyAxMzUwCisjZGVmaW5lIFRGVFBEX09QX0VSUiAgNSAgLy8gRXJyb3IgTWVzc2FnZSAgICAgICAgIFJGQyAxMzUwCisjZGVmaW5lIFRGVFBEX09QX09BQ0sgNiAgLy8gT3B0aW9uIGFja25vd2xlZGdtZW50IFJGQyAyMzQ3CisKKy8vIEVycm9yIENvZGVzOgorI2RlZmluZSBURlRQRF9FUl9OT1NVQ0hGSUxFICAxIC8vIEZpbGUgbm90IGZvdW5kCisjZGVmaW5lIFRGVFBEX0VSX0FDQ0VTUyAgICAgIDIgLy8gQWNjZXNzIHZpb2xhdGlvbgorI2RlZmluZSBURlRQRF9FUl9GVUxMICAgICAgICAzIC8vIERpc2sgZnVsbCBvciBhbGxvY2F0aW9uIGV4Y2VlZGVkCisjZGVmaW5lIFRGVFBEX0VSX0lMTEVHQUxPUCAgIDQgLy8gSWxsZWdhbCBURlRQIG9wZXJhdGlvbgorI2RlZmluZSBURlRQRF9FUl9VTktJRCAgICAgICA1IC8vIFVua25vd24gdHJhbnNmZXIgSUQKKyNkZWZpbmUgVEZUUERfRVJfRVhJU1RTICAgICAgNiAvLyBGaWxlIGFscmVhZHkgZXhpc3RzCisjZGVmaW5lIFRGVFBEX0VSX1VOS1VTRVIgICAgIDcgLy8gTm8gc3VjaCB1c2VyCisjZGVmaW5lIFRGVFBEX0VSX05FR09USUFURSAgIDggLy8gVGVybWluYXRlIHRyYW5zZmVyIGR1ZSB0byBvcHRpb24gbmVnb3RpYXRpb24KKworLyogVEZUUCBQYWNrZXQgRm9ybWF0cworICogIFR5cGUgICBPcCAjICAgICBGb3JtYXQgd2l0aG91dCBoZWFkZXIKKyAqICAgICAgICAgMiBieXRlcyAgICBzdHJpbmcgICAgMSBieXRlICAgIHN0cmluZyAgICAxIGJ5dGUKKyAqICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBSUlEvICB8IDAxLzAyIHwgIEZpbGVuYW1lICB8ICAgMCAgfCAgICBNb2RlICAgIHwgICAwICB8CisgKiAgV1JRICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgIDIgYnl0ZXMgICAgMiBieXRlcyAgICAgIG4gYnl0ZXMKKyAqICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgREFUQSAgfCAwMyAgICB8ICAgQmxvY2sgIyAgfCAgICBEYXRhICAgIHwKKyAqICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgIDIgYnl0ZXMgICAgMiBieXRlcworICogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQUNLICAgfCAwNCAgICB8ICAgQmxvY2sgIyAgfAorICogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAyIGJ5dGVzICAyIGJ5dGVzICAgICAgIHN0cmluZyAgICAgMSBieXRlCisgKiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBFUlJPUiB8IDA1ICAgIHwgIEVycm9yQ29kZSB8ICAgRXJyTXNnICAgfCAgIDAgIHwKKyAqICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBjaGFyICpnX2VycnBrdCA9IHRveWJ1ZiArIFRGVFBEX0JMS1NJWkU7CisKKy8vIENyZWF0ZSBhbmQgc2VuZCBlcnJvciBwYWNrZXQuCitzdGF0aWMgdm9pZCBzZW5kX2VycnBrdChzdHJ1Y3Qgc29ja2FkZHIgKmRzdGFkZHIsCisgICAgc29ja2xlbl90IHNvY2tsZW4sIGNoYXIgKmVycm1zZykKK3sKKyAgZXJyb3JfbXNnKGVycm1zZyk7CisgIGdfZXJycGt0WzFdID0gVEZUUERfT1BfRVJSOworICBzdHJjcHkoZ19lcnJwa3QgKyA0LCBlcnJtc2cpOworICBpZiAoc2VuZHRvKFRULnNmZCwgZ19lcnJwa3QsIHN0cmxlbihlcnJtc2cpKzUsIDAsIGRzdGFkZHIsIHNvY2tsZW4pIDwgMCkKKyAgICBwZXJyb3JfZXhpdCgic2VuZHRvIGZhaWxlZCIpOworfQorCisvLyBVc2VkIHRvIHNlbmQgLyByZWNlaXZlIHBhY2tldHMuCitzdGF0aWMgdm9pZCBkb19hY3Rpb24oc3RydWN0IHNvY2thZGRyICpzcmNhZGRyLCBzdHJ1Y3Qgc29ja2FkZHIgKmRzdGFkZHIsCisgICAgc29ja2xlbl90IHNvY2tsZW4sIGNoYXIgKmZpbGUsIGludCBvcGNvZGUsIGludCB0c2l6ZSwgaW50IGJsa3NpemUpCit7CisgIGludCBmZCwgZG9uZSA9IDAsIHJldHJ5X2NvdW50ID0gMTIsIHRpbWVvdXQgPSAxMDAsIGxlbjsKKyAgdWludDE2X3QgYmxvY2tubyA9IDEsIHBrdG9wY29kZSwgcmJsb2Nrbm87CisgIGNoYXIgKnB0ciwgKnNwa3QsICpycGt0OworICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHNbMV07CisKKyAgc3BrdCA9IHh6YWxsb2MoYmxrc2l6ZSArIDQpOworICBycGt0ID0geHphbGxvYyhibGtzaXplICsgNCk7CisgIHB0ciA9IHNwa3QrMjsgLy9wb2ludCBhZnRlciBvcGNvZGUuCisKKyAgcG9sbGZkc1swXS5mZCA9IFRULnNmZDsKKyAgLy8gaW5pdGlhbGl6ZSBncm91cHMsIHNldGdpZCBhbmQgc2V0dWlkCisgIGlmIChUVC5wdykgeHNldHVzZXIoVFQucHcpOworCisgIGlmIChvcGNvZGUgPT0gVEZUUERfT1BfUlJRKSBmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFksIDA2NjYpOworICBlbHNlIGZkID0gb3BlbihmaWxlLCAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpID8KKyAgICAgICAgKE9fV1JPTkxZfE9fVFJVTkN8T19DUkVBVCkgOiAoT19XUk9OTFl8T19UUlVOQykpICwgMDY2Nik7CisgIGlmIChmZCA8IDApIHsKKyAgICBnX2VycnBrdFszXSA9IFRGVFBEX0VSX05PU1VDSEZJTEU7CisgICAgc2VuZF9lcnJwa3QoZHN0YWRkciwgc29ja2xlbiwgImNhbid0IG9wZW4gZmlsZSIpOworICAgIGdvdG8gQ0xFQU5fQVBQOworICB9CisgIC8vIEZvciBkb3dubG9hZCAtPiBibG9ja25vIHdpbGwgYmUgMS4KKyAgLy8gMXN0IEFDSyB3aWxsIGJlIGZyb20gZHN0LHdoaWNoIHdpbGwgaGF2ZSBibG9ja25vLT0xCisgIC8vIENyZWF0ZSBhbmQgc2VuZCBBQ0sgcGFja2V0LgorICBpZiAoYmxrc2l6ZSAhPSBURlRQRF9CTEtTSVpFIHx8IHRzaXplKSB7CisgICAgcGt0b3Bjb2RlID0gVEZUUERfT1BfT0FDSzsKKyAgICAvLyBhZGQgImJsa3NpemVcMDAwYmxrc2l6ZV92YWxcMDAwIiBpbiBzZW5kIGJ1ZmZlci4KKyAgICBpZiAoYmxrc2l6ZSAhPSBURlRQRF9CTEtTSVpFKSB7CisgICAgICBzdHJjcHkocHRyLCAiYmxrc2l6ZSIpOworICAgICAgcHRyICs9IHN0cmxlbigiYmxrc2l6ZSIpICsgMTsKKyAgICAgIHB0ciArPSBzbnByaW50ZihwdHIsIDYsICIlZCIsIGJsa3NpemUpICsgMTsKKyAgICB9CisgICAgaWYgKHRzaXplKSB7Ly8gYWRkICJ0c2l6ZVwwMDB0c2l6ZV92YWxcMDAwIiBpbiBzZW5kIGJ1ZmZlci4KKyAgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgICBzYi5zdF9zaXplID0gMDsKKyAgICAgIGZzdGF0KGZkLCAmc2IpOworICAgICAgc3RyY3B5KHB0ciwgInRzaXplIik7CisgICAgICBwdHIgKz0gc3RybGVuKCJ0c2l6ZSIpICsgMTsKKyAgICAgIHB0ciArPSBzcHJpbnRmKHB0ciwgIiVsdSIsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpKzE7CisgICAgfQorICAgIGdvdG8gU0VORF9QS1Q7CisgIH0KKyAgLy8gdXBsb2FkIC0+ICBBQ0sgMXN0IHBhY2tldCB3aXRoIGZpbGVuYW1lLCBhcyBpdCBoYXMgYmxvY2tubyAwLgorICBpZiAob3Bjb2RlID09IFRGVFBEX09QX1dSUSkgYmxvY2tubyA9IDA7CisKKyAgLy8gUHJlcGFyZSBEQVRBIGFuZC9vciBBQ0sgcGt0IGFuZCBzZW5kIGl0LgorICBmb3IgKDs7KSB7CisgICAgaW50IHBvbGxfcmV0OworCisgICAgcmV0cnlfY291bnQgPSAxMiwgdGltZW91dCA9IDEwMCwgcGt0b3Bjb2RlID0gVEZUUERfT1BfQUNLOworICAgIHB0ciA9IHNwa3QrMjsKKyAgICAqKCh1aW50MTZfdCopcHRyKSA9IGh0b25zKGJsb2Nrbm8pOworICAgIGJsb2Nrbm8rKzsKKyAgICBwdHIgKz0gMjsKKyAgICBpZiAob3Bjb2RlID09IFRGVFBEX09QX1JSUSkgeworICAgICAgcGt0b3Bjb2RlID0gVEZUUERfT1BfREFUQTsKKyAgICAgIGxlbiA9IHJlYWRhbGwoZmQsIHB0ciwgYmxrc2l6ZSk7CisgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBzZW5kX2VycnBrdChkc3RhZGRyLCBzb2NrbGVuLCAicmVhZC1lcnJvciIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4gIT0gYmxrc2l6ZSkgZG9uZSA9IDE7IC8vbGFzdCBwa3QuCisgICAgICBwdHIgKz0gbGVuOworICAgIH0KK1NFTkRfUEtUOgorICAgIC8vIDFzdCBBQ0sgd2lsbCBiZSBmcm9tIGRzdCwgd2hpY2ggd2lsbCBoYXZlIGJsb2Nrbm8tPTEKKyAgICAqKCh1aW50MTZfdCopc3BrdCkgPSBodG9ucyhwa3RvcGNvZGUpOyAvL2FwcGVuZCBzZW5kIHBrdCdzIG9wY29kZS4KK1JFVFJZX1NFTkQ6CisgICAgaWYgKHNlbmR0byhUVC5zZmQsIHNwa3QsIChwdHIgLSBzcGt0KSwgMCwgZHN0YWRkciwgc29ja2xlbikgPDApCisgICAgICBwZXJyb3JfZXhpdCgic2VuZHRvIGZhaWxlZCIpOworICAgIC8vIGlmICJibG9jayBzaXplIDwgNTEyIiwgc2VuZCBBQ0sgYW5kIGV4aXQuCisgICAgaWYgKChwa3RvcGNvZGUgPT0gVEZUUERfT1BfQUNLKSAmJiBkb25lKSBicmVhazsKKworUE9MTF9JTlBVVDoKKyAgICBwb2xsZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgICBwb2xsZmRzWzBdLmZkID0gVFQuc2ZkOworICAgIHBvbGxfcmV0ID0gcG9sbChwb2xsZmRzLCAxLCB0aW1lb3V0KTsKKyAgICBpZiAocG9sbF9yZXQgPCAwICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFTk9NRU0pKSBnb3RvIFBPTExfSU5QVVQ7CisgICAgaWYgKCFwb2xsX3JldCkgeworICAgICAgaWYgKCEtLXJldHJ5X2NvdW50KSB7CisgICAgICAgIGVycm9yX21zZygidGltZW91dCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRpbWVvdXQgKz0gMTUwOworICAgICAgZ290byBSRVRSWV9TRU5EOworICAgIH0gZWxzZSBpZiAocG9sbF9yZXQgPT0gMSkgeworICAgICAgbGVuID0gcmVhZChwb2xsZmRzWzBdLmZkLCBycGt0LCBibGtzaXplICsgNCk7CisgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBzZW5kX2VycnBrdChkc3RhZGRyLCBzb2NrbGVuLCAicmVhZC1lcnJvciIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4gPCA0KSBnb3RvIFBPTExfSU5QVVQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBlcnJvcl9tc2coInBvbGwiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBWYWxpZGF0ZSByZWNlaXZlIHBhY2tldC4KKyAgICBwa3RvcGNvZGUgPSBudG9ocygoKHVpbnQxNl90KilycGt0KVswXSk7CisgICAgcmJsb2Nrbm8gPSBudG9ocygoKHVpbnQxNl90KilycGt0KVsxXSk7CisgICAgaWYgKHBrdG9wY29kZSA9PSBURlRQRF9PUF9FUlIpIHsKKyAgICAgIGNoYXIgKm1lc3NhZ2UgPSAiREFUQSBDaGVjayBmYWlsdXJlLiI7CisgICAgICBjaGFyICphcnJbXSA9IHsiRmlsZSBub3QgZm91bmQiLCAiQWNjZXNzIHZpb2xhdGlvbiIsCisgICAgICAgICJEaXNrIGZ1bGwgb3IgYWxsb2NhdGlvbiBleGNlZWRlZCIsICJJbGxlZ2FsIFRGVFAgb3BlcmF0aW9uIiwKKyAgICAgICAgIlVua25vd24gdHJhbnNmZXIgSUQiLCAiRmlsZSBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgICJObyBzdWNoIHVzZXIiLCAiVGVybWluYXRlIHRyYW5zZmVyIGR1ZSB0byBvcHRpb24gbmVnb3RpYXRpb24ifTsKKworICAgICAgaWYgKHJibG9ja25vICYmIChyYmxvY2tubyA8IDkpKSBtZXNzYWdlID0gYXJyW3JibG9ja25vIC0gMV07CisgICAgICBlcnJvcl9tc2cobWVzc2FnZSk7CisgICAgICBicmVhazsgLy8gQnJlYWsgdGhlIGZvciBsb29wLgorICAgIH0KKworICAgIC8vIGlmIGRvd25sb2FkIHJlcXVlc3RlZCBieSBjbGllbnQsCisgICAgLy8gc2VydmVyIHdpbGwgc2VuZCBkYXRhIHBrdCBhbmQgd2lsbCByZWNlaXZlIEFDSyBwa3QgZnJvbSBjbGllbnQuCisgICAgaWYgKChvcGNvZGUgPT0gVEZUUERfT1BfUlJRKSAmJiAocGt0b3Bjb2RlID09IFRGVFBEX09QX0FDSykpIHsKKyAgICAgIGlmIChyYmxvY2tubyA9PSAodWludDE2X3QpIChibG9ja25vIC0gMSkpIHsKKyAgICAgICAgaWYgKCFkb25lKSBjb250aW51ZTsgLy8gU2VuZCBuZXh0IGNodW5rIG9mIGRhdGEuCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBzZXJ2ZXIgd2lsbCByZWNlaXZlIERBVEEgcGt0IGFuZCB3cml0ZSB0aGUgZGF0YS4KKyAgICBpZiAoKG9wY29kZSA9PSBURlRQRF9PUF9XUlEpICYmIChwa3RvcGNvZGUgPT0gVEZUUERfT1BfREFUQSkpIHsKKyAgICAgIGlmIChyYmxvY2tubyA9PSBibG9ja25vKSB7CisgICAgICAgIGludCBudyA9IHdyaXRlYWxsKGZkLCAmcnBrdFs0XSwgbGVuLTQpOworICAgICAgICBpZiAobncgIT0gbGVuLTQpIHsKKyAgICAgICAgICBnX2VycnBrdFszXSA9IFRGVFBEX0VSX0ZVTEw7CisgICAgICAgICAgc2VuZF9lcnJwa3QoZHN0YWRkciwgc29ja2xlbiwgIndyaXRlIGVycm9yIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBpZiAobncgIT0gYmxrc2l6ZSkgZG9uZSA9IDE7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZ290byBQT0xMX0lOUFVUOworICB9IC8vIGVuZCBvZiBsb29wCisKK0NMRUFOX0FQUDoKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGZyZWUoc3BrdCk7CisgICAgZnJlZShycGt0KTsKKyAgICBjbG9zZShmZCk7CisgIH0KK30KKwordm9pZCB0ZnRwZF9tYWluKHZvaWQpCit7CisgIGludCBmZCA9IDAsIHJlY3Ztc2dfbGVuLCByYnVmbGVuLCBvcGNvZGUsIGJsa3NpemUgPSBURlRQRF9CTEtTSVpFLCB0c2l6ZSA9IDAsIHNldCA9MTsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3JjYWRkciwgZHN0YWRkcjsKKyAgc29ja2xlbl90IHNvY2tsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworICBjaGFyICpidWYgPSB0b3lidWY7CisKKyAgbWVtc2V0KCZzcmNhZGRyLCAwLCBzaXplb2Yoc3JjYWRkcikpOworICBpZiAoZ2V0c29ja25hbWUoMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzcmNhZGRyLCAmc29ja2xlbikpIGhlbHBfZXhpdCgwKTsKKworICBpZiAoVFQudXNlcikgVFQucHcgPSB4Z2V0cHduYW0oVFQudXNlcik7CisgIGlmICgqdG95cy5vcHRhcmdzKSB4Y2hyb290KCp0b3lzLm9wdGFyZ3MpOworCisgIHJlY3Ztc2dfbGVuID0gcmVjdmZyb20oZmQsIHRveWJ1ZiwgYmxrc2l6ZSwgMCwgKHZvaWQgKikmZHN0YWRkciwgJnNvY2tsZW4pOworCisgIFRULnNmZCA9IHhzb2NrZXQoZHN0YWRkci5zc19mYW1pbHksIFNPQ0tfREdSQU0sIDApOworICBpZiAoc2V0c29ja29wdChUVC5zZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGNvbnN0IHZvaWQgKikmc2V0LAorICAgICAgICBzaXplb2Yoc2V0KSkgPCAwKSBwZXJyb3JfZXhpdCgic2V0c29ja29wdCBmYWlsZWQiKTsKKyAgaWYgKGJpbmQoVFQuc2ZkLCAodm9pZCAqKSZzcmNhZGRyLCBzb2NrbGVuKSkgcGVycm9yX2V4aXQoImJpbmQiKTsKKyAgaWYgKGNvbm5lY3QoVFQuc2ZkLCAodm9pZCAqKSZkc3RhZGRyLCBzb2NrbGVuKSA8IDApCisgICAgcGVycm9yX2V4aXQoImNhbid0IGNvbm5lY3QgdG8gcmVtb3RlIGhvc3QiKTsKKyAgLy8gRXJyb3IgY29uZGl0aW9uLgorICBpZiAocmVjdm1zZ19sZW48NCB8fCByZWN2bXNnX2xlbj5URlRQRF9CTEtTSVpFIHx8IHRveWJ1ZltyZWN2bXNnX2xlbi0xXSkgeworICAgIHNlbmRfZXJycGt0KChzdHJ1Y3Qgc29ja2FkZHIqKSZkc3RhZGRyLCBzb2NrbGVuLCAicGFja2V0IGZvcm1hdCBlcnJvciIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHJlcXVlc3QgaXMgZWl0aGVyIHVwbG9hZCBvciBEb3dubG9hZC4KKyAgb3Bjb2RlID0gYnVmWzFdOworICBpZiAoKChvcGNvZGUgIT0gVEZUUERfT1BfUlJRKSAmJiAob3Bjb2RlICE9IFRGVFBEX09QX1dSUSkpCisgICAgICB8fCAoKG9wY29kZSA9PSBURlRQRF9PUF9XUlEpICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19yKSkpIHsKKyAgICBzZW5kX2VycnBrdCgoc3RydWN0IHNvY2thZGRyKikmZHN0YWRkciwgc29ja2xlbiwKKyAgICAJKG9wY29kZSA9PSBURlRQRF9PUF9XUlEpID8gIndyaXRlIGVycm9yIiA6ICJwYWNrZXQgZm9ybWF0IGVycm9yIik7CisgICAgcmV0dXJuOworICB9CisKKyAgYnVmICs9IDI7CisgIGlmICgqYnVmID09ICcuJyB8fCBzdHJzdHIoYnVmLCAiLy4iKSkgeworICAgIHNlbmRfZXJycGt0KChzdHJ1Y3Qgc29ja2FkZHIqKSZkc3RhZGRyLCBzb2NrbGVuLCAiZG90IGluIGZpbGVuYW1lIik7CisgICAgcmV0dXJuOworICB9CisKKyAgYnVmICs9IHN0cmxlbihidWYpICsgMTsgLy8xICdcMCcuCisgIC8vIEFzIHBlciBSRkMgMTM1MCwgbW9kZSBpcyBjYXNlIGluLXNlbnNpdGl2ZS4KKyAgaWYgKGJ1ZiA+PSB0b3lidWYrcmVjdm1zZ19sZW4gfHwgc3RyY2FzZWNtcChidWYsICJvY3RldCIpKSB7CisgICAgc2VuZF9lcnJwa3QoKHN0cnVjdCBzb2NrYWRkciopJmRzdGFkZHIsIHNvY2tsZW4sICJwYWNrZXQgZm9ybWF0IGVycm9yIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy9SRkMyMzQ4LiBlLmcuIG9mIHNpemUgdHlwZTogInR0eXBlMVwwdHR5cGUxX3ZhbFwwLi4udHR5cGVOXDB0dHlwZU5fdmFsXDAiCisgIGJ1ZiArPSBzdHJsZW4oYnVmKSArIDE7CisgIHJidWZsZW4gPSB0b3lidWYgKyByZWN2bXNnX2xlbiAtIGJ1ZjsKKyAgaWYgKHJidWZsZW4pIHsKKyAgICBpbnQganVtcCA9IDAsIGJmbGFnID0gMDsKKworICAgIGZvciAoOyByYnVmbGVuOyByYnVmbGVuIC09IGp1bXAsIGJ1ZiArPSBqdW1wKSB7CisgICAgICBpZiAoIWJmbGFnICYmICFzdHJjYXNlY21wKGJ1ZiwgImJsa3NpemUiKSkgeyAvL2dldCBibGtzaXplCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgYmxrc2l6ZSA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIGlmIChlcnJubyB8fCBibGtzaXplID4gNjU1NjQgfHwgYmxrc2l6ZSA8IDgpIGJsa3NpemUgPSBURlRQRF9CTEtTSVpFOworICAgICAgICBiZmxhZyBePSAxOworICAgICAgfSBlbHNlIGlmICghdHNpemUgJiYgIXN0cmNhc2VjbXAoYnVmLCAidHNpemUiKSkgdHNpemUgXj0gMTsKKyAgICAgIAorICAgICAganVtcCArPSBzdHJsZW4oYnVmKSArIDE7CisgICAgfQorICAgIHRzaXplICY9IChvcGNvZGUgPT0gVEZUUERfT1BfUlJRKTsKKyAgfQorCisgIC8vZG8gc2VuZCAvIHJlY2VpdmUgZmlsZS4KKyAgZG9fYWN0aW9uKChzdHJ1Y3Qgc29ja2FkZHIqKSZzcmNhZGRyLCAoc3RydWN0IHNvY2thZGRyKikmZHN0YWRkciwKKyAgICAgIHNvY2tsZW4sIHRveWJ1ZiArIDIsIG9wY29kZSwgdHNpemUsIGJsa3NpemUpOworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBjbG9zZShTVERJTl9GSUxFTk8pOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90ci5jIGIvdG95Ym94L3RveXMvcGVuZGluZy90ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODIzZjYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wZW5kaW5nL3RyLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qIHRyLmMgLSB0cmFuc2xhdGUgb3IgZGVsZXRlIGNoYXJhY3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTYW5kZWVwIFNoYXJtYSA8c2FuZGVlcC5qYWNrMjc1NkBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90ci5odG1sCisKK1VTRV9UUihORVdUT1kodHIsICJePjI8MUNjc2RbK2NDXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRSCisgIGJvb2wgInRyIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB0ciBbLWNkc10gU0VUMSBbU0VUMl0KKworICAgIFRyYW5zbGF0ZSwgc3F1ZWV6ZSwgb3IgZGVsZXRlIGNoYXJhY3RlcnMgZnJvbSBzdGRpbiwgd3JpdGluZyB0byBzdGRvdXQKKworICAgIC1jLy1DICBUYWtlIGNvbXBsZW1lbnQgb2YgU0VUMQorICAgIC1kICAgICBEZWxldGUgaW5wdXQgY2hhcmFjdGVycyBjb2RlZCBTRVQxCisgICAgLXMgICAgIFNxdWVlemUgbXVsdGlwbGUgb3V0cHV0IGNoYXJhY3RlcnMgb2YgU0VUMiBpbnRvIG9uZSBjaGFyYWN0ZXIKKyovCisKKyNkZWZpbmUgRk9SX3RyCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBzaG9ydCBtYXBbMjU2XTsgLy9tYXAgb2YgY2hhcnMKKyAgaW50IGxlbjEsIGxlbjI7CispCisKK2VudW0geworICBjbGFzc19hbHBoYSwgY2xhc3NfYWxudW0sIGNsYXNzX2RpZ2l0LAorICBjbGFzc19sb3dlcixjbGFzc191cHBlcixjbGFzc19zcGFjZSxjbGFzc19ibGFuaywKKyAgY2xhc3NfcHVuY3QsY2xhc3NfY250cmwsY2xhc3NfeGRpZ2l0LGNsYXNzX2ludmFsaWQKK307CisKK3N0YXRpYyB2b2lkIG1hcF90cmFuc2xhdGlvbihjaGFyICpzZXQxICwgY2hhciAqc2V0MikKK3sKKyAgaW50IGkgPSBUVC5sZW4xLCBrID0gMDsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZCkKKyAgICBmb3IgKDsgaTsgaS0tLCBrKyspIFRULm1hcFtzZXQxW2tdXSA9IHNldDFba118MHgxMDA7IC8vc2V0IGRlbGV0ZSBiaXQKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgeworICAgIGZvciAoaSA9IFRULmxlbjEsIGsgPSAwOyBpOyBpLS0sIGsrKykKKyAgICAgIFRULm1hcFtzZXQxW2tdXSA9IFRULm1hcFtzZXQxW2tdXXwweDIwMDsKKyAgICBmb3IgKGkgPSBUVC5sZW4yLCBrID0gMDsgaTsgaS0tLCBrKyspCisgICAgICBUVC5tYXBbc2V0MltrXV0gPSBUVC5tYXBbc2V0MltrXV18MHgyMDA7CisgIH0KKyAgaSA9IGsgPSAwOworICB3aGlsZSAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSAmJiBzZXQyICYmIFRULmxlbjEtLSkgeyAvL2lnbm9yZSBzZXQyIGlmIC1kIHByZXNlbnQKKyAgICBUVC5tYXBbc2V0MVtpXV0gPSAoKFRULm1hcFtzZXQxW2ldXSAmIDB4RkYwMCkgfCBzZXQyW2tdKTsKKyAgICBpZiAoc2V0MltrICsgMV0pIGsrKzsKKyAgICBpKys7CisgIH0KK30KKworc3RhdGljIGludCBoYW5kbGVfZXNjYXBlX2NoYXIoY2hhciAqKmVzY192YWwpIC8vdGFrZW4gZnJvbSBwcmludGYKK3sKKyAgY2hhciAqcHRyID0gKmVzY192YWw7CisgIGludCBlc2NfbGVuZ3RoID0gMDsKKyAgdW5zaWduZWQgIGJhc2UgPSAwLCBudW0gPSAwLCByZXN1bHQgPSAwLCBjb3VudCA9IDA7CisKKyAgaWYgKCpwdHIgPT0gJ3gnKSB7CisgICAgcHRyKys7CisgICAgZXNjX2xlbmd0aCsrOworICAgIGJhc2UgPSAxNjsKKyAgfSBlbHNlIGlmIChpc2RpZ2l0KCpwdHIpKSBiYXNlID0gODsKKworICB3aGlsZSAoZXNjX2xlbmd0aCA8IDMgJiYgYmFzZSkgeworICAgIG51bSA9IHRvbG93ZXIoKnB0cikgLSAnMCc7CisgICAgaWYgKG51bSA+IDEwKSBudW0gKz0gKCcwJyAtICdhJyArIDEwKTsKKyAgICBpZiAobnVtID49IGJhc2UpIHsKKyAgICAgIGlmIChiYXNlID09IDE2KSB7CisgICAgICAgIGVzY19sZW5ndGgtLTsKKyAgICAgICAgaWYgKCFlc2NfbGVuZ3RoKSB7Ly8gSW52YWxpZCBoZXggdmFsdWUgZWcuIC94dmQsIHByaW50IGFzIGl0IGlzIC94dmQKKyAgICAgICAgICByZXN1bHQgPSAnXFwnOworICAgICAgICAgIHB0ci0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZXNjX2xlbmd0aCsrOworICAgIGNvdW50ID0gcmVzdWx0ID0gKGNvdW50ICogYmFzZSkgKyBudW07CisgICAgcHRyKys7CisgIH0KKyAgaWYgKGJhc2UpIHsKKyAgICBwdHItLTsKKyAgICAqZXNjX3ZhbCA9IHB0cjsKKyAgICByZXR1cm4gKGNoYXIpcmVzdWx0OworICB9IGVsc2UgeworICAgIHN3aXRjaCAoKnB0cikgeworICAgICAgY2FzZSAnbic6ICByZXN1bHQgPSAnXG4nOyBicmVhazsKKyAgICAgIGNhc2UgJ3QnOiAgcmVzdWx0ID0gJ1x0JzsgYnJlYWs7CisgICAgICBjYXNlICdlJzogIHJlc3VsdCA9IChjaGFyKTI3OyBicmVhazsKKyAgICAgIGNhc2UgJ2InOiAgcmVzdWx0ID0gJ1xiJzsgYnJlYWs7CisgICAgICBjYXNlICdhJzogIHJlc3VsdCA9ICdcYSc7IGJyZWFrOworICAgICAgY2FzZSAnZic6ICByZXN1bHQgPSAnXGYnOyBicmVhazsKKyAgICAgIGNhc2UgJ3YnOiAgcmVzdWx0ID0gJ1x2JzsgYnJlYWs7CisgICAgICBjYXNlICdyJzogIHJlc3VsdCA9ICdccic7IGJyZWFrOworICAgICAgY2FzZSAnXFwnOiByZXN1bHQgPSAnXFwnOyBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICByZXN1bHQgPSAnXFwnOworICAgICAgICBwdHItLTsgLy8gTGV0IHBvaW50ZXIgcG9pbnRpbmcgdG8gLyB3ZSB3aWxsIGluY3JlbWVudCBhZnRlciByZXR1cm5pbmcuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqZXNjX3ZhbCA9IHB0cjsKKyAgcmV0dXJuIChjaGFyKXJlc3VsdDsKK30KKworc3RhdGljIGludCBmaW5kX2NsYXNzKGNoYXIgKmNsYXNzX25hbWUpCit7CisgIGludCBpOworICBzdGF0aWMgY2hhciAqY2xhc3NbXSA9IHsKKyAgICAiWzphbHBoYTpdIiwiWzphbG51bTpdIiwiWzpkaWdpdDpdIiwKKyAgICAiWzpsb3dlcjpdIiwiWzp1cHBlcjpdIiwiWzpzcGFjZTpdIiwKKyAgICAiWzpibGFuazpdIiwiWzpwdW5jdDpdIiwiWzpjbnRybDpdIiwKKyAgICAiWzp4ZGlnaXQ6XSIsIk5VTEwiCisgIH07CisKKyAgZm9yIChpID0gMDsgaSAhPSBjbGFzc19pbnZhbGlkOyBpKyspIHsKKyAgICBpZiAoIW1lbWNtcChjbGFzc19uYW1lLCBjbGFzc1tpXSwgKGNsYXNzX25hbWVbMF0gPT0gJ3gnKT8xMDo5KSkgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBjaGFyICpleHBhbmRfc2V0KGNoYXIgKmFyZywgaW50ICpsZW4pCit7CisgIGludCBpID0gMCwgaiwgaywgc2l6ZSA9IDI1NjsKKyAgY2hhciAqc2V0ID0geHphbGxvYyhzaXplKnNpemVvZihjaGFyKSk7CisKKyAgd2hpbGUgKCphcmcpIHsKKworICAgIGlmIChpID49IHNpemUpIHsKKyAgICAgIHNpemUgKz0gMjU2OworICAgICAgc2V0ID0geHJlYWxsb2Moc2V0LCBzaXplKTsKKyAgICB9CisgICAgaWYgKCphcmcgPT0gJ1xcJykgeworICAgICAgYXJnKys7CisgICAgICBzZXRbaSsrXSA9IChpbnQpaGFuZGxlX2VzY2FwZV9jaGFyKCZhcmcpOworICAgICAgYXJnKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGFyZ1sxXSA9PSAnLScpIHsKKyAgICAgIGlmIChhcmdbMl0gPT0gJ1wwJykgZ290byBzYXZlOworICAgICAgaiA9IGFyZ1swXTsKKyAgICAgIGsgPSBhcmdbMl07CisgICAgICBpZiAoaiA+IGspIHBlcnJvcl9leGl0KCJyZXZlcnNlIGNvbGF0aW5nIG9yZGVyIik7CisgICAgICB3aGlsZSAoaiA8PSBrKSBzZXRbaSsrXSA9IGorKzsKKyAgICAgIGFyZyArPSAzOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChhcmdbMF0gPT0gJ1snICYmIGFyZ1sxXSA9PSAnOicpIHsKKworICAgICAgaWYgKChqID0gZmluZF9jbGFzcyhhcmcpKSA9PSBjbGFzc19pbnZhbGlkKSBnb3RvIHNhdmU7CisKKyAgICAgIGlmICgoaiA9PSBjbGFzc19hbHBoYSkgfHwgKGogPT0gY2xhc3NfdXBwZXIpIHx8IChqID09IGNsYXNzX2FsbnVtKSkgeworICAgICAgZm9yIChrID0gJ0EnOyBrIDw9ICdaJzsgaysrKSBzZXRbaSsrXSA9IGs7CisgICAgICB9CisgICAgICBpZiAoKGogPT0gY2xhc3NfYWxwaGEpIHx8IChqID09IGNsYXNzX2xvd2VyKSB8fCAoaiA9PSBjbGFzc19hbG51bSkpIHsKKyAgICAgICAgZm9yIChrID0gJ2EnOyBrIDw9ICd6JzsgaysrKSBzZXRbaSsrXSA9IGs7CisgICAgICB9CisgICAgICBpZiAoKGogPT0gY2xhc3NfYWxudW0pIHx8IChqID09IGNsYXNzX2RpZ2l0KSB8fCAoaiA9PSBjbGFzc194ZGlnaXQpKSB7CisgICAgICAgIGZvciAoayA9ICcwJzsgayA8PSAnOSc7IGsrKykgc2V0W2krK10gPSBrOworICAgICAgfQorICAgICAgaWYgKGogPT0gY2xhc3Nfc3BhY2UgfHwgaiA9PSBjbGFzc19ibGFuaykgeworICAgICAgICBzZXRbaSsrXSA9ICdcdCc7CisgICAgICAgIGlmIChqID09IGNsYXNzX3NwYWNlKSB7CisgICAgICAgICAgc2V0W2krK10gPSAnXG4nOworICAgICAgICAgIHNldFtpKytdID0gJ1xmJzsKKyAgICAgICAgICBzZXRbaSsrXSA9ICdccic7CisgICAgICAgICAgc2V0W2krK10gPSAnXHYnOworICAgICAgICB9CisgICAgICAgIHNldFtpKytdID0gJyAnOworICAgICAgfQorICAgICAgaWYgKGogPT0gY2xhc3NfcHVuY3QpIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8PSAyNTU7IGsrKykKKyAgICAgICAgICBpZiAoaXNwdW5jdChrKSkgc2V0W2krK10gPSBrOworICAgICAgfQorICAgICAgaWYgKGogPT0gY2xhc3NfY250cmwpIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8PSAyNTU7IGsrKykKKyAgICAgICAgICBpZiAoaXNjbnRybChrKSkgc2V0W2krK10gPSBrOworICAgICAgfQorICAgICAgaWYgKGogPT0gY2xhc3NfeGRpZ2l0KSB7CisgICAgICAgIGZvciAoayA9ICdBJzsgayA8PSAnRic7IGsrKykgeworICAgICAgICAgIHNldFtpICsgNl0gPSBrIHwgMHgyMDsKKyAgICAgICAgICBzZXRbaSsrXSA9IGs7CisgICAgICAgIH0KKyAgICAgICAgaSArPSA2OworICAgICAgICBhcmcgKz0gMTA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhcmcgKz0gOTsgLy9uZXZlciBoZXJlIGZvciBjbGFzc194ZGlnaXQuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGFyZ1swXSA9PSAnWycgJiYgYXJnWzFdID09ICc9JykgeyAvL1s9Y2hhcj1dIG9ubHkKKyAgICAgIGFyZyArPSAyOworICAgICAgaWYgKCphcmcpIHNldFtpKytdID0gKmFyZzsKKyAgICAgIGlmICghYXJnWzFdIHx8IGFyZ1sxXSAhPSAnPScgfHwgYXJnWzJdICE9ICddJykKKyAgICAgICAgZXJyb3JfZXhpdCgiYmFkIGVxdWl2IGNsYXNzIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CitzYXZlOgorICAgIHNldFtpKytdID0gKmFyZysrOworICB9CisgICpsZW4gPSBpOworICByZXR1cm4gc2V0OworfQorCitzdGF0aWMgdm9pZCBwcmludF9tYXAoY2hhciAqc2V0MSwgY2hhciAqc2V0MikKK3sKKyAgaW50IHIgPSAwLCBpLCBwcmV2X2NoYXIgPSAtMTsKKworICB3aGlsZSAoMSkKKyAgeworICAgIGkgPSAwOworICAgIHIgPSByZWFkKFNURElOX0ZJTEVOTywgKHRveWJ1ZiksIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAoIXIpIGJyZWFrOworICAgIGZvciAoO3IgPiBpO2krKykgeworCisgICAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2QpICYmIChUVC5tYXBbKGludCl0b3lidWZbaV1dICYgMHgxMDApKSBjb250aW51ZTsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSB7CisgICAgICAgIGlmICgoVFQubWFwWyhpbnQpdG95YnVmW2ldXSAmIDB4MjAwKSAmJgorICAgICAgICAgICAgKHByZXZfY2hhciA9PSBUVC5tYXBbKGludCl0b3lidWZbaV1dKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB4cHV0YyhUVC5tYXBbKGludCl0b3lidWZbaV1dICYgMHhGRik7CisgICAgICBwcmV2X2NoYXIgPSBUVC5tYXBbKGludCl0b3lidWZbaV1dOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NvbXBsZW1lbnQoY2hhciAqKnNldCkKK3sKKyAgaW50IGksIGo7CisgIGNoYXIgKmNvbXAgPSB4bWFsbG9jKDI1Nik7CisKKyAgZm9yIChpID0gMCwgaiA9IDA7aSA8IDI1NjsgaSsrKSB7CisgICAgaWYgKG1lbWNocigqc2V0LCBpLCBUVC5sZW4xKSkgY29udGludWU7CisgICAgZWxzZSBjb21wW2orK10gPSAoY2hhcilpOworICB9CisgIGZyZWUoKnNldCk7CisgIFRULmxlbjEgPSBqOworICAqc2V0ID0gY29tcDsKK30KKwordm9pZCB0cl9tYWluKHZvaWQpCit7CisgIGNoYXIgKnNldDEsICpzZXQyID0gTlVMTDsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBUVC5tYXBbaV0gPSBpOyAvL2luaXQgbWFwCisKKyAgc2V0MSA9IGV4cGFuZF9zZXQodG95cy5vcHRhcmdzWzBdLCAmVFQubGVuMSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19jKSBkb19jb21wbGVtZW50KCZzZXQxKTsKKyAgaWYgKHRveXMub3B0YXJnc1sxXSkgeworICAgIGlmICh0b3lzLm9wdGFyZ3NbMV1bMF0gPT0gJ1wwJykgZXJyb3JfZXhpdCgic2V0MiBjYW4ndCBiZSBlbXB0eSBzdHJpbmciKTsKKyAgICBzZXQyID0gZXhwYW5kX3NldCh0b3lzLm9wdGFyZ3NbMV0sICZUVC5sZW4yKTsKKyAgfQorICBtYXBfdHJhbnNsYXRpb24oc2V0MSwgc2V0Mik7CisKKyAgcHJpbnRfbWFwKHNldDEsIHNldDIpOworICBmcmVlKHNldDEpOworICBmcmVlKHNldDIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy90cmFjZXJvdXRlLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3RyYWNlcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgxOGViCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy90cmFjZXJvdXRlLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qIHRyYWNlcm91dGUgLSB0cmFjZSB0aGUgcm91dGUgdG8gImhvc3QiLgorICoKKyAqIENvcHlyaWdodCAyMDEyIE1hZGh1ciBWZXJtYSA8bWFkLmZsZXhpQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgQmlsYWwgUXVyZXNoaSA8YmlsYWwuam1pQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEzIEFzaHdpbmkgS3VtYXIgPGFrLmFzaHdpbmkxOTgxQGdtYWlsLmNvbT4KKyAqCisgKiBObyBTdGFuZGFyZAorCitVU0VfVFJBQ0VST1VURShORVdUT1kodHJhY2Vyb3V0ZSwgIjwxPjJpOmYjPDE+MjU1PTF6IzwwPjg2NDAwPTBnKncjPDA+ODY0MDA9NXQjPDA+MjU1PTBzOnEjPDE+MjU1PTNwIzwxPjY1NTM1PTMzNDM0bSM8MT4yNTU9MzBydm5kbElVRjY0IiwgVE9ZRkxBR19TVEFZUk9PVHxUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfVFJBQ0VST1VURShPTERUT1kodHJhY2Vyb3V0ZTYsdHJhY2Vyb3V0ZSwgVE9ZRkxBR19TVEFZUk9PVHxUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitjb25maWcgVFJBQ0VST1VURQorICBib29sICJ0cmFjZXJvdXRlIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB0cmFjZXJvdXRlIFstNDZGVUlsZG52cl0gWy1mIDFTVF9UVExdIFstbSBNQVhUVExdIFstcCBQT1JUXSBbLXEgUFJPQkVTXQorICAgIFstcyBTUkNfSVBdIFstdCBUT1NdIFstdyBXQUlUX1NFQ10gWy1nIEdBVEVXQVldIFstaSBJRkFDRV0gWy16IFBBVVNFX01TRUNdIEhPU1QgW0JZVEVTXQorICAgIAorICAgIHRyYWNlcm91dGU2IFstZG5ydl0gWy1tIE1BWFRUTF0gWy1wIFBPUlRdIFstcSBQUk9CRVNdWy1zIFNSQ19JUF0gWy10IFRPU10gWy13IFdBSVRfU0VDXSAKKyAgICAgIFstaSBJRkFDRV0gSE9TVCBbQllURVNdCisKKyAgICBUcmFjZSB0aGUgcm91dGUgdG8gSE9TVAorCisgICAgLTQsLTYgRm9yY2UgSVAgb3IgSVB2NiBuYW1lIHJlc29sdXRpb24gCisgICAgLUYgICAgU2V0IHRoZSBkb24ndCBmcmFnbWVudCBiaXQgKHN1cHBvcnRzIElQVjQgb25seSkKKyAgICAtVSAgICBVc2UgVURQIGRhdGFncmFtcyBpbnN0ZWFkIG9mIElDTVAgRUNITyAoc3VwcG9ydHMgSVBWNCBvbmx5KQorICAgIC1JICAgIFVzZSBJQ01QIEVDSE8gaW5zdGVhZCBvZiBVRFAgZGF0YWdyYW1zIChzdXBwb3J0cyBJUFY0IG9ubHkpCisgICAgLWwgICAgRGlzcGxheSB0aGUgVFRMIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBwYWNrZXQgKHN1cHBvcnRzIElQVjQgb25seSkKKyAgICAtZCAgICBTZXQgU09fREVCVUcgb3B0aW9ucyB0byBzb2NrZXQKKyAgICAtbiAgICBQcmludCBudW1lcmljIGFkZHJlc3NlcworICAgIC12ICAgIHZlcmJvc2UKKyAgICAtciAgICBCeXBhc3Mgcm91dGluZyB0YWJsZXMsIHNlbmQgZGlyZWN0bHkgdG8gSE9TVAorICAgIC1tICAgIE1heCB0aW1lLXRvLWxpdmUgKG1heCBudW1iZXIgb2YgaG9wcykoUkFOR0UgMSB0byAyNTUpCisgICAgLXAgICAgQmFzZSBVRFAgcG9ydCBudW1iZXIgdXNlZCBpbiBwcm9iZXMoZGVmYXVsdCAzMzQzNCkoUkFOR0UgMSB0byA2NTUzNSkKKyAgICAtcSAgICBOdW1iZXIgb2YgcHJvYmVzIHBlciBUVEwgKGRlZmF1bHQgMykoUkFOR0UgMSB0byAyNTUpCisgICAgLXMgICAgSVAgYWRkcmVzcyB0byB1c2UgYXMgdGhlIHNvdXJjZSBhZGRyZXNzCisgICAgLXQgICAgVHlwZS1vZi1zZXJ2aWNlIGluIHByb2JlIHBhY2tldHMgKGRlZmF1bHQgMCkoUkFOR0UgMCB0byAyNTUpCisgICAgLXcgICAgVGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UgKGRlZmF1bHQgMykoUkFOR0UgMCB0byA4NjQwMCkKKyAgICAtZyAgICBMb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheSAoOCBtYXgpIChzdXBwb3J0cyBJUFY0IG9ubHkpCisgICAgLXogICAgUGF1c2UgVGltZSBpbiBtaWxpc2VjIChkZWZhdWx0IDApKFJBTkdFIDAgdG8gODY0MDApIChzdXBwb3J0cyBJUFY0IG9ubHkpCisgICAgLWYgICAgU3RhcnQgZnJvbSB0aGUgMVNUX1RUTCBob3AgKGluc3RlYWQgZnJvbSAxKShSQU5HRSAxIHRvIDI1NSkgKHN1cHBvcnRzIElQVjQgb25seSkKKyAgICAtaSAgICBTcGVjaWZ5IGEgbmV0d29yayBpbnRlcmZhY2UgdG8gb3BlcmF0ZSB3aXRoCisqLworI2RlZmluZSBGT1JfdHJhY2Vyb3V0ZQorI2luY2x1ZGUgInRveXMuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorCitHTE9CQUxTKAorICBsb25nIG1heF90dGw7CisgIGxvbmcgcG9ydDsKKyAgbG9uZyB0dGxfcHJvYmVzOworICBjaGFyICpzcmNfaXA7CisgIGxvbmcgdG9zOworICBsb25nIHdhaXRfdGltZTsKKyAgc3RydWN0IGFyZ19saXN0ICpsb29zZV9zb3VyY2U7CisgIGxvbmcgcGF1c2VfdGltZTsKKyAgbG9uZyBmaXJzdF90dGw7CisgIGNoYXIgKmlmYWNlOworCisgIHVpbnQzMl90IGd3X2xpc3RbOV07CisgIGludCByZWN2X3NvY2s7CisgIGludCBzbmRfc29jazsKKyAgdW5zaWduZWQgbXNnX2xlbjsKKyAgY2hhciAqcGFja2V0OworICB1aW50MzJfdCBpZGVudDsKKyAgaW50IGlzdHJhY2Vyb3V0ZTY7CispCisKKyNpZm5kZWYgU09MX0lQVjYKKyMgZGVmaW5lIFNPTF9JUFY2IElQUFJPVE9fSVBWNgorI2VuZGlmCisKKyNkZWZpbmUgSUNNUF9IRF9TSVpFNCAgOAorI2RlZmluZSBVU0VDICAgICAgICAgICAxMDAwMDAwVUxMCisKK3N0cnVjdCBwYXlsb2FkX3MgeworICB1aW50MzJfdCBzZXE7CisgIHVpbnQzMl90IGlkZW50OworfTsKKworY2hhciBhZGRyX3N0cltJTkVUNl9BRERSU1RSTEVOXTsKK3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRlc3Q7CisKKy8vQ29tcHV0ZSBjaGVja3N1bSBTVU0gb2YgYnVmZmVyIFAgb2YgbGVuZ3RoIExFTgorc3RhdGljIHVfaW50MTZfdCBpbl9ja3N1bSh1X2ludDE2X3QgKnAsIHVfaW50IGxlbikKK3sKKyAgdV9pbnQzMl90IHN1bSA9IDA7CisgIGludCBud29yZHMgPSBsZW4gPj4gMTsKKworICB3aGlsZSAobndvcmRzLS0gIT0gMCkgc3VtICs9ICpwKys7CisgIGlmIChsZW4gJiAxKSB7CisgICAgdW5pb24geworICAgICAgdV9pbnQxNl90IHc7CisgICAgICB1X2ludDhfdCBjWzJdOworICAgIH0gdTsKKyAgICB1LmNbMF0gPSAqKHVfY2hhciAqKSBwOworICAgIHUuY1sxXSA9IDA7CisgICAgc3VtICs9IHUudzsKKyAgfQorICAvLyBlbmQtYXJvdW5kLWNhcnJ5IAorICBzdW0gPSAoc3VtID4+IDE2KSArIChzdW0gJiAweGZmZmYpOworICBzdW0gKz0gKHN1bSA+PiAxNik7CisgIHJldHVybiAofnN1bSk7Cit9CisKKy8vc2VuZHMgYSBzaW5nbGUgcHJvYmUgcGFja2V0IHdpdGggc2VxdWVuY2UoU0VRKSBhbmQgdGltZS10by1saXZlKFRUTCkKK3N0YXRpYyB2b2lkIHNlbmRfcHJvYmU0KGludCBzZXEsIGludCB0dGwpCit7CisgIGludCByZXMsIGxlbjsKKyAgdm9pZCAqb3V0OworICBzdHJ1Y3QgcGF5bG9hZF9zICpzZW5kX2RhdGE0ID0gKHN0cnVjdCBwYXlsb2FkX3MgKikoVFQucGFja2V0KTsKKyAgc3RydWN0IGljbXAgKnNlbmRfaWNtcDQgPSAoc3RydWN0IGljbXAgKikoVFQucGFja2V0KTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfVSkgeworICAgIHNlbmRfZGF0YTQtPnNlcSA9IHNlcTsKKyAgICBzZW5kX2RhdGE0LT5pZGVudCA9IFRULmlkZW50OworICAgICgoc3RydWN0IHNvY2thZGRyX2luICopJmRlc3QpLT5zaW5fcG9ydCA9IFRULnBvcnQgKyBzZXE7CisgICAgb3V0ID0gc2VuZF9kYXRhNDsKKyAgfSBlbHNlIHsKKyAgICBzZW5kX2ljbXA0LT5pY21wX3R5cGUgPSBJQ01QX0VDSE87CisgICAgc2VuZF9pY21wNC0+aWNtcF9pZCA9IGh0b25zKFRULmlkZW50KTsKKyAgICBzZW5kX2ljbXA0LT5pY21wX3NlcSA9IGh0b25zKHNlcSk7CisgICAgc2VuZF9pY21wNC0+aWNtcF9ja3N1bSA9IDA7CisgICAgc2VuZF9pY21wNC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKCh1aW50MTZfdCAqKSBzZW5kX2ljbXA0LCBUVC5tc2dfbGVuKTsKKyAgICBpZiAoc2VuZF9pY21wNC0+aWNtcF9ja3N1bSA9PSAwKSBzZW5kX2ljbXA0LT5pY21wX2Nrc3VtID0gMHhmZmZmOworICAgIG91dCA9IHNlbmRfaWNtcDQ7CisgIH0KKworICByZXMgPSBzZXRzb2Nrb3B0KFRULnNuZF9zb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsICZ0dGwsIHNpemVvZih0dGwpKTsKKyAgaWYgKHJlcyA8IDApIHBlcnJvcl9leGl0KCJzZXRzb2Nrb3B0IHR0bCAlZCIsIHR0bCk7CisKKyAgbGVuID0gVFQubXNnX2xlbjsKKyAgcmVzID0gc2VuZHRvKFRULnNuZF9zb2NrLCBvdXQsIGxlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZGVzdCwgCisgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgIGlmIChyZXMgIT0gbGVuKSBwZXJyb3JfZXhpdCgiIHNlbmR0byIpOworfQorCisvL3NlbmRzIGEgc2luZ2xlIHByb2JlIHBhY2tldCB3aXRoIHNlcXVlbmNlKFNFUSkgYW5kIHRpbWUtdG8tbGl2ZShUVEwpCitzdGF0aWMgdm9pZCBzZW5kX3Byb2JlNihpbnQgc2VxLCBpbnQgdHRsKQoreworICB2b2lkICpvdXQ7CisgIHN0cnVjdCBwYXlsb2FkX3MgKnNlbmRfZGF0YTYgPSAoc3RydWN0IHBheWxvYWRfcyAqKSAoVFQucGFja2V0KTsKKworICBzZW5kX2RhdGE2LT5zZXEgPSBzZXE7CisgIHNlbmRfZGF0YTYtPmlkZW50ID0gVFQuaWRlbnQ7CisgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSZkZXN0KS0+c2luNl9wb3J0ID0gVFQucG9ydDsKKworICBpZiAoc2V0c29ja29wdChUVC5zbmRfc29jaywgU09MX0lQVjYsIElQVjZfVU5JQ0FTVF9IT1BTLCAmdHRsLCAKKyAgICAgICAgc2l6ZW9mKHR0bCkpIDwgMCkgZXJyb3JfZXhpdCgic2V0c29ja29wdCB0dGwgJWQiLCB0dGwpOworCisgIG91dCA9IHNlbmRfZGF0YTY7CisKKyAgaWYgKHNlbmR0byhUVC5zbmRfc29jaywgb3V0LCBUVC5tc2dfbGVuLCAwLAorICAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZkZXN0LCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpIDwgMCkKKyAgICBwZXJyb3JfZXhpdCgic2VuZHRvIik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbGFnX2RyKGludCBzb2NrKQoreworICBpbnQgc2V0ID0gMTsKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSAmJiAoc2V0c29ja29wdChzb2NrLFNPTF9TT0NLRVQsIFNPX0RFQlVHLAorICAgICAgICAgICZzZXQsIHNpemVvZihzZXQpKSA8IDApKSBwZXJyb3JfZXhpdCgiU09fREVCVUcgZmFpbGVkICIpOworCisgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcikgJiYgKHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAorICAgICAgICAgICZzZXQsIHNpemVvZihzZXQpKSA8IDApKSBwZXJyb3JfZXhpdCgiU09fRE9OVFJPVVRFIGZhaWxlZCAiKTsKK30KKworc3RhdGljIHZvaWQgYmluZF90b19pbnRlcmZhY2UoaW50IHNvY2spCit7CisgIHN0cnVjdCBpZnJlcSBpZnI7CisKKyAgc25wcmludGYoaWZyLmlmcl9uYW1lLCBJRk5BTVNJWiwgIiVzIiwgVFQuaWZhY2UpOworICBpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsICZpZnIsIHNpemVvZihpZnIpKSkKKyAgICAgIHBlcnJvcl9tc2coImNhbid0IGJpbmQgdG8gaW50ZXJmYWNlICVzIiwgVFQuaWZhY2UpOworfQorCitzdGF0aWMgdm9pZCByZXNvbHZlX2FkZHIoY2hhciAqaG9zdCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bywgdm9pZCAqc29jaykKK3sKKyAgc3RydWN0IGFkZHJpbmZvICppbmZvLCBoaW50OworICBpbnQgcmV0OworCisgIG1lbXNldCgmaGludCwgMCwgc2l6ZW9mKGhpbnQpKTsKKyAgaGludC5haV9mYW1pbHkgPSBmYW1pbHk7CisgIGhpbnQuYWlfc29ja3R5cGUgPSB0eXBlOworICBoaW50LmFpX3Byb3RvY29sID0gcHJvdG87CisKKyAgcmV0ID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgJmhpbnQsICZpbmZvKTsKKyAgaWYgKHJldCB8fCAhaW5mbykgZXJyb3JfZXhpdCgiYmFkIGFkZHJlc3M6ICAlcyAiLCBob3N0KTsKKworICBtZW1jcHkoc29jaywgaW5mby0+YWlfYWRkciwgaW5mby0+YWlfYWRkcmxlbik7CisgIGZyZWVhZGRyaW5mbyhpbmZvKTsKK30KKworc3RhdGljIHZvaWQgZG9fdHJhY2UoKQoreworICBpbnQgc2VxLCBmZXhpdCwgdHRsLCB0diA9IFRULndhaXRfdGltZSAqIDEwMDA7CisgIHN0cnVjdCBwb2xsZmQgcGZkWzFdOworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBmcm9tOworCisgIG1lbXNldCgmZnJvbSwgMCwgc2l6ZW9mKGZyb20pKTsKKyAgcGZkWzBdLmZkID0gVFQucmVjdl9zb2NrOworICBwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCisgIGZvciAodHRsID0gVFQuZmlyc3RfdHRsOyB0dGwgPD0gVFQubWF4X3R0bDsgKyt0dGwpIHsKKyAgICBpbnQgcHJvYmUsIGRlc3RfcmVhY2ggPSAwLCBwcmludF92ZXJib3NlID0gMTsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0MSwgdDI7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbGFzdF9hZGRyOworCisgICAgbWVtc2V0KCZsYXN0X2FkZHIsIDAsIHNpemVvZihsYXN0X2FkZHIpKTsKKyAgICBmZXhpdCA9IDA7CisgICAgeHByaW50ZigiJTJkIiwgdHRsKTsKKworICAgIGZvciAocHJvYmUgPSAwLCBzZXEgPSAwOyBwcm9iZSA8IFRULnR0bF9wcm9iZXM7ICsrcHJvYmUpIHsKKyAgICAgIGludCByZXMgPSAwLCB0bGVmdDsKKworICAgICAgZmZsdXNoKE5VTEwpOworICAgICAgaWYgKCFUVC5pc3RyYWNlcm91dGU2KQorICAgICAgICBpZiAocHJvYmUgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3opKSB1c2xlZXAoVFQucGF1c2VfdGltZSAqIDEwMDApOworCisgICAgICBpZiAoIVRULmlzdHJhY2Vyb3V0ZTYpIHNlbmRfcHJvYmU0KCsrc2VxLCB0dGwpOworICAgICAgZWxzZSBzZW5kX3Byb2JlNigrK3NlcSwgdHRsKTsKKyAgICAgIGdldHRpbWVvZmRheSgmdDEsIE5VTEwpOworICAgICAgdDIgPSB0MTsKKworICAgICAgd2hpbGUgKCh0bGVmdCA9IChpbnQpKHR2IC0gKCh1bnNpZ25lZCBsb25nIGxvbmcpKHQyLnR2X3NlYyAqIDEwMDBVTEwgCisgICAgICAgICAgICAgICAgICArIHQyLnR2X3VzZWMvMTAwMCkgLSAodW5zaWduZWQgbG9uZyBsb25nKSh0MS50dl9zZWMgKiAxMDAwVUxMCisgICAgICAgICAgICAgICAgICAgICsgdDEudHZfdXNlYy8xMDAwKSkpKSA+PSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGRlbHRhID0gMDsKKyAgICAgICAgaWYgKCEocmVzID0gcG9sbChwZmQsIDEsIHRsZWZ0KSkpIHsgCisgICAgICAgICAgeHByaW50ZigiICAqIik7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGdldHRpbWVvZmRheSgmdDIsIE5VTEwpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgcGVycm9yX2V4aXQoInBvbGwiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBkZWx0YSA9ICh0Mi50dl9zZWMgKiBVU0VDICsgdDIudHZfdXNlYykKKyAgICAgICAgICAtICh0MS50dl9zZWMgKiBVU0VDICsgdDEudHZfdXNlYyk7CisKKyAgICAgICAgaWYgKHBmZFswXS5yZXZlbnRzKSB7CisgICAgICAgICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworICAgICAgICAgIGludCByY3ZfbGVuLCBpY21wX3JlcyA9IDA7CisKKyAgICAgICAgICByY3ZfbGVuID0gcmVjdmZyb20oVFQucmVjdl9zb2NrLCB0b3lidWYsIHNpemVvZih0b3lidWYpLAorICAgICAgICAgICAgICBNU0dfRE9OVFdBSVQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZhZGRybGVuKTsKKyAgICAgICAgICBpZiAocmN2X2xlbiA8PSAwKSBjb250aW51ZTsKKworICAgICAgICAgIGlmICghVFQuaXN0cmFjZXJvdXRlNikgeworICAgICAgICAgICAgaW50IHBtdHUgPSAwOworICAgICAgICAgICAgc3RydWN0IGlwICpyY3ZfcGt0ID0gKHN0cnVjdCBpcCopIHRveWJ1ZjsKKyAgICAgICAgICAgIHN0cnVjdCBpY21wICpyaWNtcDsKKworICAgICAgICAgICAgcmljbXAgPSAoc3RydWN0IGljbXAgKikgKChjaGFyKilyY3ZfcGt0ICsgKHJjdl9wa3QtPmlwX2hsIDw8IDIpKTsKKyAgICAgICAgICAgIGlmIChyaWNtcC0+aWNtcF9jb2RlID09IElDTVBfVU5SRUFDSF9ORUVERlJBRykKKyAgICAgICAgICAgICAgcG10dSA9IG50b2hzKHJpY21wLT5pY21wX25leHRtdHUpOworCisgICAgICAgICAgICBpZiAoKHJpY21wLT5pY21wX3R5cGUgPT0gSUNNUF9USU1YQ0VFRAorICAgICAgICAgICAgICAgICAgJiYgcmljbXAtPmljbXBfY29kZSA9PSBJQ01QX1RJTVhDRUVEX0lOVFJBTlMpCisgICAgICAgICAgICAgICAgfHwgcmljbXAtPmljbXBfdHlwZSA9PSBJQ01QX1VOUkVBQ0gKKyAgICAgICAgICAgICAgICB8fCByaWNtcC0+aWNtcF90eXBlID09IElDTVBfRUNIT1JFUExZKSB7CisKKyAgICAgICAgICAgICAgc3RydWN0IHVkcGhkciAqaHVkcDsKKyAgICAgICAgICAgICAgc3RydWN0IGljbXAgKmhpY21wOworICAgICAgICAgICAgICBzdHJ1Y3QgaXAgKmhpcCA9ICZyaWNtcC0+aWNtcF9pcDsKKworICAgICAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfVSkgeworICAgICAgICAgICAgICAgIGh1ZHAgPSAoc3RydWN0IHVkcGhkciopICgoY2hhciopaGlwICsgKGhpcC0+aXBfaGwgPDwgMikpOworICAgICAgICAgICAgICAgIGlmICgoaGlwLT5pcF9obCA8PCAyKSArIDEyIDw9KHJjdl9sZW4gLSAocmN2X3BrdC0+aXBfaGwgPDwgMikpCisgICAgICAgICAgICAgICAgICAgICYmIGhpcC0+aXBfcCA9PSBJUFBST1RPX1VEUAorICAgICAgICAgICAgICAgICAgICAmJiBodWRwLT5kZXN0ID09IChUVC5wb3J0ICsgc2VxKSkKKyAgICAgICAgICAgICAgICAgIGljbXBfcmVzID0gKHJpY21wLT5pY21wX3R5cGUgPT0gSUNNUF9USU1YQ0VFRCA/IC0xIDoKKyAgICAgICAgICAgICAgICAgICAgICByaWNtcC0+aWNtcF9jb2RlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoaWNtcCA9IChzdHJ1Y3QgaWNtcCAqKSAoKGNoYXIqKWhpcCArIChoaXAtPmlwX2hsIDw8IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAocmljbXAtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSAKKyAgICAgICAgICAgICAgICAgICAgJiYgcmljbXAtPmljbXBfaWQgPT0gbnRvaHMoVFQuaWRlbnQpCisgICAgICAgICAgICAgICAgICAgICYmIHJpY21wLT5pY21wX3NlcSA9PSBudG9ocyhzZXEpKQorICAgICAgICAgICAgICAgICAgaWNtcF9yZXMgPSBJQ01QX1VOUkVBQ0hfUE9SVDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoaGlwLT5pcF9obCA8PCAyKSArIElDTVBfSERfU0laRTQgCisgICAgICAgICAgICAgICAgICAgIDw9IChyY3ZfbGVuIC0gKHJjdl9wa3QtPmlwX2hsIDw8IDIpKQorICAgICAgICAgICAgICAgICAgICAmJiBoaXAtPmlwX3AgPT0gSVBQUk9UT19JQ01QCisgICAgICAgICAgICAgICAgICAgICYmIGhpY21wLT5pY21wX2lkID09IGh0b25zKFRULmlkZW50KQorICAgICAgICAgICAgICAgICAgICAmJiBoaWNtcC0+aWNtcF9zZXEgPT0gaHRvbnMoc2VxKSkKKyAgICAgICAgICAgICAgICAgIGljbXBfcmVzID0gKHJpY21wLT5pY21wX3R5cGUgPT0gSUNNUF9USU1YQ0VFRCA/IC0xIDogCisgICAgICAgICAgICAgICAgICAgICAgcmljbXAtPmljbXBfY29kZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaWNtcF9yZXMpIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYWRkcmxlbiA+IDApIHsKKyAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmbGFzdF9hZGRyKS0+c2luX2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSkgeworICAgICAgICAgICAgICAgICAgY2hhciBob3N0W05JX01BWEhPU1RdOworICAgICAgICAgICAgICAgICAgaWYgKCFnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCBob3N0LCBOSV9NQVhIT1NULCBOVUxMLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgeHByaW50ZigiICAlcyAoIiwgaG9zdCk7CisgICAgICAgICAgICAgICAgICBlbHNlIHhwcmludGYoIiAlcyAoIiwgaW5ldF9udG9hKAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZmcm9tKS0+c2luX2FkZHIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeHByaW50ZigiICVzIiwgaW5ldF9udG9hKAorICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopJmZyb20pLT5zaW5fYWRkcikpOworICAgICAgICAgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSB4cHJpbnRmKCIpIik7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZsYXN0X2FkZHIsICZmcm9tLCBzaXplb2YoZnJvbSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHhwcmludGYoIiAgJXUuJTAzdSBtcyIsIGRlbHRhIC8gMTAwMCwgZGVsdGEgJSAxMDAwKTsKKyAgICAgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHhwcmludGYoIiAoJWQpIiwgcmN2X3BrdC0+aXBfdHRsKTsKKyAgICAgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIHsKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgJWQgYnl0ZXMgZnJvbSAlcyA6IGljbXAgdHlwZSAlZCBjb2RlICVkXHQiLAorICAgICAgICAgICAgICAgICAgICByY3ZfbGVuLCBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgcmljbXAtPmljbXBfdHlwZSwgcmljbXAtPmljbXBfY29kZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB4cHJpbnRmKCJcdCFIIik7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaWNtcF9yZXMpIHsKKyAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUE9SVDoKKyAgICAgICAgICAgICAgICBpZiAocmN2X3BrdC0+aXBfdHRsIDw9IDEpIHhwcmludGYoIiAhIik7CisgICAgICAgICAgICAgICAgZGVzdF9yZWFjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX05FVDoKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIU4iKTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9IT1NUOgorICAgICAgICAgICAgICAgIHhwcmludGYoIiAhSCIpOworICAgICAgICAgICAgICAgICsrZmV4aXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BST1RPQ09MOgorICAgICAgICAgICAgICAgIHhwcmludGYoIiAhUCIpOworICAgICAgICAgICAgICAgIGRlc3RfcmVhY2ggPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORUVERlJBRzoKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIUYtJWQiLCBwbXR1KTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9TUkNGQUlMOgorICAgICAgICAgICAgICAgIHhwcmludGYoIiAhUyIpOworICAgICAgICAgICAgICAgICsrZmV4aXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUI6CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX05FVF9QUk9ISUI6CisgICAgICAgICAgICAgICAgeHByaW50ZigiICFBIik7CisgICAgICAgICAgICAgICAgKytmZXhpdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUI6CisgICAgICAgICAgICAgICAgeHByaW50ZigiICFDIik7CisgICAgICAgICAgICAgICAgKytmZXhpdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFOgorICAgICAgICAgICAgICAgIHhwcmludGYoIiAhViIpOworICAgICAgICAgICAgICAgICsrZmV4aXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGOgorICAgICAgICAgICAgICAgIHhwcmludGYoIiAhQyIpOworICAgICAgICAgICAgICAgICsrZmV4aXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX05FVF9VTktOT1dOOiAgCisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIVUiKTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9JU09MQVRFRDoKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIUkiKTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9UT1NORVQ6CisgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1RPU0hPU1Q6CisgICAgICAgICAgICAgICAgeHByaW50ZigiICFUIik7CisgICAgICAgICAgICAgICAgKytmZXhpdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJ1Y3QgaWNtcDZfaGRyICpyaWNtcCAgPSAoc3RydWN0IGljbXA2X2hkciAqKSB0b3lidWY7CisKKyAgICAgICAgICAgIGlmICgocmljbXAtPmljbXA2X3R5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRAorICAgICAgICAgICAgICAgICAgJiYgcmljbXAtPmljbXA2X2NvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkKKyAgICAgICAgICAgICAgICB8fCByaWNtcC0+aWNtcDZfdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSAorICAgICAgICAgICAgICAgIHx8IHJpY21wLT5pY21wNl90eXBlID09IElDTVA2X0VDSE9fUkVQTFkpIHsKKworICAgICAgICAgICAgICBzdHJ1Y3QgaXA2X2hkciAqaGlwOworICAgICAgICAgICAgICBzdHJ1Y3QgdWRwaGRyICpodWRwOworICAgICAgICAgICAgICBpbnQgaGRyX25leHQ7CisKKyAgICAgICAgICAgICAgaGlwID0gKHN0cnVjdCBpcDZfaGRyICopKHJpY21wICsgMSk7CisgICAgICAgICAgICAgIGh1ZHAgPSAoc3RydWN0IHVkcGhkciopIChoaXAgKyAxKTsKKyAgICAgICAgICAgICAgaGRyX25leHQgPSBoaXAtPmlwNl9ueHQ7CisgICAgICAgICAgICAgIGlmIChoZHJfbmV4dCA9PSBJUFBST1RPX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICAgICAgaGRyX25leHQgPSAqKHVuc2lnbmVkIGNoYXIqKWh1ZHA7CisgICAgICAgICAgICAgICAgaHVkcCsrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGhkcl9uZXh0ID09IElQUFJPVE9fVURQKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHBheWxvYWRfcyAqcGt0ID0gKHN0cnVjdCBwYXlsb2FkX3MqKShodWRwICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKChwa3QtPmlkZW50ID09IFRULmlkZW50KSAmJiAocGt0LT5zZXEgPT0gc2VxKSkKKyAgICAgICAgICAgICAgICAgIGljbXBfcmVzID0gKHJpY21wLT5pY21wNl90eXBlID09IElDTVA2X1RJTUVfRVhDRUVERUQpID8gLTEgOgorICAgICAgICAgICAgICAgICAgICByaWNtcC0+aWNtcDZfY29kZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWljbXBfcmVzKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChhZGRybGVuID4gMCkgeworICAgICAgICAgICAgICBpZiAobWVtY21wKCYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmbGFzdF9hZGRyKS0+c2luNl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZmcm9tKS0+c2luNl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbikpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXIgaG9zdFtOSV9NQVhIT1NUXTsKKyAgICAgICAgICAgICAgICAgIGlmICghZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmcm9tKSwgaG9zdCwgc2l6ZW9mKGhvc3QpLCBOVUxMLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgeHByaW50ZigiICAlcyAoIiwgaG9zdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbXNldChhZGRyX3N0ciwgJ1wwJywgSU5FVDZfQUREUlNUUkxFTik7CisgICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmZyb20pLT5zaW42X2FkZHIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJfc3RyLCBJTkVUNl9BRERSU1RSTEVOKTsKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgJXMiLCBhZGRyX3N0cik7CisKKyAgICAgICAgICAgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19uKSkgeHByaW50ZigiKSIpOworICAgICAgICAgICAgICAgIG1lbWNweSgmbGFzdF9hZGRyLCZmcm9tLHNpemVvZihmcm9tKSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikgeworICAgICAgICAgICAgICAgIGlmKHByaW50X3ZlcmJvc2UpeworICAgICAgICAgICAgICAgICAgbWVtc2V0KGFkZHJfc3RyLCAnXDAnLCBJTkVUNl9BRERSU1RSTEVOKTsKKyAgICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20pLT5zaW42X2FkZHIsIGFkZHJfc3RyLCBJTkVUNl9BRERSU1RSTEVOKTsKKyAgICAgICAgICAgICAgICAgIHJjdl9sZW4gLT0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKTsKKyAgICAgICAgICAgICAgICAgIHhwcmludGYoIiAlZCBieXRlcyB0byAlcyAiLCByY3ZfbGVuLCBhZGRyX3N0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHhwcmludGYoIiAgJXUuJTAzdSBtcyIsIGRlbHRhIC8gMTAwMCwgZGVsdGEgJSAxMDAwKTsKKyAgICAgICAgICAgICAgZGVsdGEgPSAwOworCisgICAgICAgICAgICB9IGVsc2UgeHByaW50ZigiXHQhSCIpOworCisgICAgICAgICAgICBzd2l0Y2ggKGljbXBfcmVzKSB7CisgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgorICAgICAgICAgICAgICAgICsrZmV4aXQ7CisgICAgICAgICAgICAgICAgZGVzdF9yZWFjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURToKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIU4iKTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFI6CisgICAgICAgICAgICAgICAgeHByaW50ZigiICFIIik7CisgICAgICAgICAgICAgICAgKytmZXhpdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTjoKKyAgICAgICAgICAgICAgICB4cHJpbnRmKCIgIVMiKTsKKyAgICAgICAgICAgICAgICArK2ZleGl0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IC8vcmV2ZW50cworICAgICAgfQorICAgICAgcHJpbnRfdmVyYm9zZSA9IDA7CisgICAgfQorICAgIHhwdXRjKCdcbicpOworICAgIGlmKCFUVC5pc3RyYWNlcm91dGU2KSB7CisgICAgICBpZiAoIW1lbWNtcCgmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZnJvbSktPnNpbl9hZGRyLCAKKyAgICAgICAgICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZkZXN0KS0+c2luX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCisgICAgICAgICAgfHwgZGVzdF9yZWFjaCB8fCAoZmV4aXQgJiYgZmV4aXQgPj0gVFQudHRsX3Byb2JlcyAtMSkpCisgICAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoZGVzdF9yZWFjaCB8fCAoZmV4aXQgPiAwICYmIGZleGl0ID49IFRULnR0bF9wcm9iZXMgLTEpKSBicmVhazsKKyAgfQorfQorCit2b2lkIHRyYWNlcm91dGVfbWFpbih2b2lkKQoreworICB1bnNpZ25lZCBvcHRfbGVuID0gMCwgcGFja19zaXplID0gMCwgdHlzZXIgPSAwOworICBpbnQgbHNyciA9IDAsIHNldCA9IDE7CisgIAorICBpZighKHRveXMub3B0ZmxhZ3MgJiBGTEFHXzQpICYmIAorICAgICAgKGluZXRfcHRvbihBRl9JTkVUNiwgdG95cy5vcHRhcmdzWzBdLCAmZGVzdCkpKQorICAgIHRveXMub3B0ZmxhZ3MgfD0gRkxBR182OworCisgIG1lbXNldCgmZGVzdCwgMCwgc2l6ZW9mKGRlc3QpKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHXzYpIFRULmlzdHJhY2Vyb3V0ZTYgPSAxOworICBlbHNlIFRULmlzdHJhY2Vyb3V0ZTYgPSB0b3lzLndoaWNoLT5uYW1lWzEwXSA9PSAnNic7CisKKyAgaWYoIVRULmlzdHJhY2Vyb3V0ZTYgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2cpKSB7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKm5vZGU7CisKKyAgICAgIGZvciAobm9kZSA9IFRULmxvb3NlX3NvdXJjZTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQsIGxzcnIrKykgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCisgICAgICAgIG1lbXNldCggJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworICAgICAgICBpZiAobHNyciA+PSA4KSBlcnJvcl9leGl0KCJubyBtb3JlIHRoYW4gOCBnYXRld2F5cyIpOyAvLyBOR0FURVdBWVMKKyAgICAgICAgcmVzb2x2ZV9hZGRyKG5vZGUtPmFyZywgQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsICZzaW4pOworICAgICAgICBUVC5nd19saXN0W2xzcnJdID0gc2luLnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgIH0KKyAgICAgIG9wdF9sZW4gPSAobHNyciArIDEpICogc2l6ZW9mKFRULmd3X2xpc3RbMF0pOworICB9IGVsc2UgVFQuZmlyc3RfdHRsID0gMTsKKworICBUVC5tc2dfbGVuID0gcGFja19zaXplID0gSUNNUF9IRF9TSVpFNDsgLy91ZHAgcGF5bG9hZCBpcyBhbHNvIDhieXRlcworICBpZiAodG95cy5vcHRhcmdzWzFdKQorICAgIFRULm1zZ19sZW4gPSBhdG9seF9yYW5nZSh0b3lzLm9wdGFyZ3NbMV0sIHBhY2tfc2l6ZSwgMzI3NjgpOy8vbWF4IHBhY2tldCBzaXplCisKKyAgVFQucmVjdl9zb2NrID0geHNvY2tldCgoVFQuaXN0cmFjZXJvdXRlNiA/IEFGX0lORVQ2IDogQUZfSU5FVCksIFNPQ0tfUkFXLAorICAgICAgKFRULmlzdHJhY2Vyb3V0ZTYgPyBJUFBST1RPX0lDTVBWNiA6IElQUFJPVE9fSUNNUCkpOworCisgIGlmIChUVC5pc3RyYWNlcm91dGU2KSB7CisgICAgaW50IHR3byA9IDI7CisjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworICAgIHNldHNvY2tvcHQoVFQucmVjdl9zb2NrLCBTT0xfSVBWNiwgSVBWNl9SRUNWUEtUSU5GTywgJnNldCwgCisgICAgICAgIHNpemVvZihzZXQpKTsKKyAgICBzZXRzb2Nrb3B0KFRULnJlY3Zfc29jaywgU09MX0lQVjYsIElQVjZfMjI5MlBLVElORk8sICZzZXQsIAorICAgICAgICBzaXplb2Yoc2V0KSk7CisjZWxzZQorICAgIHNldHNvY2tvcHQoVFQucmVjdl9zb2NrLCBTT0xfSVBWNiwgSVBWNl9QS1RJTkZPLCAmc2V0LCBzaXplb2Yoc2V0KSk7CisjZW5kaWYKKworICAgIGlmIChzZXRzb2Nrb3B0KFRULnJlY3Zfc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJnR3bywgCisgICAgICAgICAgc2l6ZW9mKHR3bykpIDwgMCkgIHBlcnJvcl9leGl0KCJzZXRzb2Nrb3B0IFJBV19DSEVDS1NVTSIpOworICB9CisKKyAgc2V0X2ZsYWdfZHIoVFQucmVjdl9zb2NrKTsKKworICBpZiAoIVRULmlzdHJhY2Vyb3V0ZTYpIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfVSkgCisgICAgICBUVC5zbmRfc29jayA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworICAgIGVsc2UgVFQuc25kX3NvY2sgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIGJpbmRfdG9faW50ZXJmYWNlKFRULnNuZF9zb2NrKTsKKworICAgIHJlc29sdmVfYWRkcih0b3lzLm9wdGFyZ3NbMF0sIEFGX0lORVQsICgodG95cy5vcHRmbGFncyAmIEZMQUdfVSkgPyAKKyAgICAgICAgICBTT0NLX0RHUkFNIDogU09DS19SQVcpLCAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1UpID8gSVBQUk9UT19VRFAgOiAKKyAgICAgICAgICAgIElQUFJPVE9fSUNNUCksICZkZXN0KTsKKyAgICBpZiAobHNyciA+IDApIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3B0bGlzdFtNQVhfSVBPUFRMRU5dOworICAgICAgdW5zaWduZWQgc2l6ZTsKKworICAgICAgVFQuZ3dfbGlzdFtsc3JyXSA9ICgoc3RydWN0IHNvY2thZGRyX2luICopJmRlc3QpLT5zaW5fYWRkci5zX2FkZHI7CisgICAgICArK2xzcnI7CisKKyAgICAgIG9wdGxpc3RbMF0gPSBJUE9QVF9OT1A7CisgICAgICBvcHRsaXN0WzFdID0gSVBPUFRfTFNSUjsvLyBsb29zZSBzb3VyY2Ugcm91dGUgb3B0aW9uIAorICAgICAgc2l6ZSA9IGxzcnIgKiBzaXplb2YoVFQuZ3dfbGlzdFswXSk7CisgICAgICBvcHRsaXN0WzJdID0gc2l6ZSArIDM7CisgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOworICAgICAgbWVtY3B5KG9wdGxpc3QgKyA0LCBUVC5nd19saXN0LCBzaXplKTsKKworICAgICAgaWYgKHNldHNvY2tvcHQoVFQuc25kX3NvY2ssIElQUFJPVE9fSVAsIElQX09QVElPTlMsCisgICAgICAgICAgICAoY2hhciAqKW9wdGxpc3QsIHNpemUgKyBzaXplb2YoVFQuZ3dfbGlzdFswXSkpIDwgMCkKKyAgICAgICAgcGVycm9yX2V4aXQoIkxTUlIgSVBfT1BUSU9OUyIpOworICAgIH0KKyAgfSBlbHNlIFRULnNuZF9zb2NrID0geHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCisgIGlmIChzZXRzb2Nrb3B0KFRULnNuZF9zb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZUVC5tc2dfbGVuLCAKKyAgICAgICAgc2l6ZW9mKFRULm1zZ19sZW4pKSA8IDApIHBlcnJvcl9leGl0KCJTT19TTkRCVUYgZmFpbGVkICIpOworCisgIGlmICghVFQuaXN0cmFjZXJvdXRlNikgeworICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfdCkgJiYgCisgICAgICAgIHNldHNvY2tvcHQoVFQuc25kX3NvY2ssIElQUFJPVE9fSVAsIElQX1RPUywgJnR5c2VyLCBzaXplb2YodHlzZXIpKSA8IDApCisgICAgICBwZXJyb3JfZXhpdCgiSVBfVE9TICVsZCBmYWlsZWQgIiwgVFQudG9zKTsKKworI2lmZGVmIElQX0RPTlRGUkFHCisgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19GKSAmJgorICAgICAgICAoc2V0c29ja29wdChUVC5zbmRfc29jaywgSVBQUk9UT19JUCwgSVBfRE9OVEZSQUcsICZzZXQsIAorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2V0KSkgPCAwKSkgcGVycm9yX2V4aXQoIklQX0RPTlRGUkFHIGZhaWxlZCAiKTsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHNldHNvY2tvcHQoVFQuc25kX3NvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9UQ0xBU1MsICZUVC50b3MsCisgICAgICAgIHNpemVvZihUVC50b3MpKSA8IDApIHBlcnJvcl9leGl0KCJJUFY2X1RDTEFTUyAlbGQgZmFpbGVkICIsIFRULnRvcyk7CisKKyAgc2V0X2ZsYWdfZHIoVFQuc25kX3NvY2spOworICBUVC5wYWNrZXQgPSB4emFsbG9jKFRULm1zZ19sZW4pOworICBUVC5pZGVudCA9IGdldHBpZCgpOworCisgIGlmICghVFQuaXN0cmFjZXJvdXRlNikgeworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1UpKSBUVC5pZGVudCB8PSAweDgwMDA7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzb3VyY2U7CisKKyAgICAgIG1lbXNldCgmc291cmNlLCAwLCBzaXplb2Yoc291cmNlKSk7CisgICAgICBpZiAoIWluZXRfYXRvbihUVC5zcmNfaXAsICYoc291cmNlLnNpbl9hZGRyKSkpCisgICAgICAgIGVycm9yX2V4aXQoImJhZCBhZGRyZXNzOiAlcyIsIFRULnNyY19pcCk7CisgICAgICBpZiAoc2V0c29ja29wdChUVC5zbmRfc29jaywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0lGLAorICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciopJnNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKQorICAgICAgICBwZXJyb3JfZXhpdCgiY2FuJ3Qgc2V0IG11bHRpY2FzdCBzb3VyY2UgaW50ZXJmYWNlIik7CisgICAgICBpZiAoYmluZChUVC5zbmRfc29jaywoc3RydWN0IHNvY2thZGRyKikmc291cmNlLCAKKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSA8IDApIHBlcnJvcl9leGl0KCJiaW5kIik7CisgICAgfQorCisgICAgaWYoVFQuZmlyc3RfdHRsID4gVFQubWF4X3R0bCkgCisgICAgICBlcnJvcl9leGl0KCJFUlJPUiA6UmFuZ2UgZm9yIC1mIGlzIDEgdG8gJWxkIChtYXggdHRsKSIsIFRULm1heF90dGwpOworCisgICAgeHByaW50ZigidHJhY2Vyb3V0ZSB0byAlcyglcykiLCB0b3lzLm9wdGFyZ3NbMF0sIAorICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZGVzdCktPnNpbl9hZGRyKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIGJpbmRfdG9faW50ZXJmYWNlKFRULnNuZF9zb2NrKTsKKworICAgIHJlc29sdmVfYWRkcih0b3lzLm9wdGFyZ3NbMF0sIEFGX0lORVQ2LCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJmRlc3QpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNvdXJjZTsKKworICAgICAgbWVtc2V0KCZzb3VyY2UsIDAsIHNpemVvZihzb3VyY2UpKTsKKyAgICAgIGlmKGluZXRfcHRvbihBRl9JTkVUNiwgVFQuc3JjX2lwLCAmKHNvdXJjZS5zaW42X2FkZHIpKSA8PSAwKQorICAgICAgICBlcnJvcl9leGl0KCJiYWQgYWRkcmVzczogJXMiLCBUVC5zcmNfaXApOworCisgICAgICBpZiAoYmluZChUVC5zbmRfc29jaywoc3RydWN0IHNvY2thZGRyKikmc291cmNlLCAKKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkgPCAwKQorICAgICAgICBlcnJvcl9leGl0KCJiaW5kOiBDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgcHJiOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihwcmIpOworICAgICAgaW50IHBfZmQgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19pKSBiaW5kX3RvX2ludGVyZmFjZShwX2ZkKTsKKworICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmRlc3QpLT5zaW42X3BvcnQgPSBodG9ucygxMDI1KTsKKyAgICAgIGlmIChjb25uZWN0KHBfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZGVzdCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKSA8IDApCisgICAgICAgIHBlcnJvcl9leGl0KCJjYW4ndCBjb25uZWN0IHRvIHJlbW90ZSBob3N0Iik7CisgICAgICBpZihnZXRzb2NrbmFtZShwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnByYiwgJmxlbikpIAorICAgICAgICBlcnJvcl9leGl0KCJwcm9iZSBhZGRyIGZhaWxlZCIpOworICAgICAgY2xvc2UocF9mZCk7CisgICAgICBwcmIuc2luNl9wb3J0ID0gMDsKKyAgICAgIGlmIChiaW5kKFRULnNuZF9zb2NrLCAoc3RydWN0IHNvY2thZGRyKikmcHJiLCAKKyAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkpIHBlcnJvcl9leGl0KCJiaW5kIik7CisgICAgICBpZiAoYmluZChUVC5yZWN2X3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZwcmIsIAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKSkgcGVycm9yX2V4aXQoImJpbmQiKTsKKyAgICB9CisKKyAgICBpbmV0X250b3AoQUZfSU5FVDYsICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZGVzdCktPnNpbjZfYWRkciwgCisgICAgICAgICAgICAgIGFkZHJfc3RyLCBJTkVUNl9BRERSU1RSTEVOKTsKKyAgICB4cHJpbnRmKCJ0cmFjZXJvdXRlNiB0byAlcyglcykiLCB0b3lzLm9wdGFyZ3NbMF0sIGFkZHJfc3RyKTsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKSB4cHJpbnRmKCIgZnJvbSAlcyIsVFQuc3JjX2lwKTsKKyAgeHByaW50ZigiLCAlbGQgaG9wcyBtYXgsICV1IGJ5dGUgcGFja2V0c1xuIiwgVFQubWF4X3R0bCwgVFQubXNnX2xlbik7CisKKyAgZG9fdHJhY2UoKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvdXNlcmFkZC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy91c2VyYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhZDAzYQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvdXNlcmFkZC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiB1c2VyYWRkLmMgLSBhZGQgYSBuZXcgdXNlcgorICoKKyAqIENvcHlyaWdodCAyMDEzIEFzaHdpbmkgS3VtYXIgPGFrLmFzaHdpbmlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvdXNlcmFkZC5odG1sCisKK1VTRV9VU0VSQUREKE5FV1RPWSh1c2VyYWRkLCAiPDE+MnUjPDBHOnM6ZzpoOlNESCIsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19VTUFTS3xUT1lGTEFHX1NCSU4pKQorVVNFX1VTRVJBREQoT0xEVE9ZKGFkZHVzZXIsIHVzZXJhZGQsIFRPWUZMQUdfTkVFRFJPT1R8VE9ZRkxBR19VTUFTS3xUT1lGTEFHX1NCSU4pKQorCitjb25maWcgVVNFUkFERAorICBib29sICJ1c2VyYWRkIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB1c2VyYWRkIFstU0RIXSBbLWggRElSXSBbLXMgU0hFTExdIFstRyBHUlBdIFstZyBOQU1FXSBbLXUgVUlEXSBVU0VSIFtHUk9VUF0KKworICAgIENyZWF0ZSBuZXcgdXNlciwgb3IgYWRkIFVTRVIgdG8gR1JPVVAKKworICAgIC1EICAgICAgIERvbid0IGFzc2lnbiBhIHBhc3N3b3JkCisgICAgLWcgTkFNRSAgUmVhbCBuYW1lCisgICAgLUcgR1JQICAgQWRkIHVzZXIgdG8gZXhpc3RpbmcgZ3JvdXAKKyAgICAtaCBESVIgICBIb21lIGRpcmVjdG9yeQorICAgIC1IICAgICAgIERvbid0IGNyZWF0ZSBob21lIGRpcmVjdG9yeQorICAgIC1zIFNIRUxMIExvZ2luIHNoZWxsCisgICAgLVMgICAgICAgQ3JlYXRlIGEgc3lzdGVtIHVzZXIKKyAgICAtdSBVSUQgICBVc2VyIGlkCisqLworCisjZGVmaW5lIEZPUl91c2VyYWRkCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpkaXI7CisgIGNoYXIgKmdlY29zOworICBjaGFyICpzaGVsbDsKKyAgY2hhciAqdV9ncnA7CisgIGxvbmcgdWlkOworCisgIGxvbmcgZ2lkOworKQorCit2b2lkIHVzZXJhZGRfbWFpbih2b2lkKQoreworICBjaGFyICpzID0gKnRveXMub3B0YXJncywgKmVudHJ5OworICBzdHJ1Y3QgcGFzc3dkIHB3ZDsKKworICAvLyBBY3QgbGlrZSBncm91cGFkZD8KKyAgaWYgKHRveXMub3B0YyA9PSAyKSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MpIGhlbHBfZXhpdCgib3B0aW9ucyB3aXRoIFVTRVIgR1JPVVAiKTsKKyAgICB4ZXhlYygoY2hhciAqW10peyJncm91cGFkZCIsIHRveXMub3B0YXJnc1swXSwgdG95cy5vcHRhcmdzWzFdLCAwfSk7CisgIH0KKworICAvLyBTYW5pdHkgY2hlY2sgdXNlciB0byBhZGQKKyAgaWYgKHNbc3RyY3NwbihzLCAiOi9cbiIpXSB8fCBzdHJsZW4ocykgPiBMT0dJTl9OQU1FX01BWCkKKyAgICBlcnJvcl9leGl0KCJiYWQgdXNlcm5hbWUiKTsKKyAgLy8gcmFjZSBjb25kaXRpb246IHR3byBhZGRzIGF0IHNhbWUgdGltZT8KKyAgaWYgKGdldHB3bmFtKHMpKSBlcnJvcl9leGl0KCInJXMnIGluIHVzZSIsIHMpOworCisgIC8vIEFkZCBhIG5ldyBncm91cCB0byB0aGUgc3lzdGVtLCBpZiBVSUQgaXMgZ2l2ZW4gdGhlbiB0aGF0IGlzIHZhbGlkYXRlZAorICAvLyB0byBiZSBmcmVlLCBlbHNlIGEgZnJlZSBVSUQgaXMgY2hvb3NlbiBieSBzZWxmLgorICAvLyBTWVNURU0gSURzIGFyZSBjb25zaWRlcmVkIGluIHRoZSByYW5nZSAxMDAgLi4uIDk5OQorICAvLyBhZGRfdXNlcigpLCBhZGQgYSBuZXcgZW50cnkgaW4gL2V0Yy9wYXNzd2QsIC9ldGMvc2hhZG93IGZpbGVzCisKKyAgcHdkLnB3X25hbWUgPSBzOworICBwd2QucHdfcGFzc3dkID0gIngiOworICBwd2QucHdfZ2Vjb3MgPSBUVC5nZWNvcyA/IFRULmdlY29zIDogIkxpbnV4IFVzZXIsIjsKKyAgcHdkLnB3X2RpciA9IFRULmRpciA/IFRULmRpciA6IHhtcHJpbnRmKCIvaG9tZS8lcyIsICp0b3lzLm9wdGFyZ3MpOworCisgIGlmICghVFQuc2hlbGwpIHsKKyAgICBUVC5zaGVsbCA9IGdldGVudigiU0hFTEwiKTsKKworICAgIGlmICghVFQuc2hlbGwpIHsKKyAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCisgICAgICBpZiAocHcgJiYgcHctPnB3X3NoZWxsICYmICpwdy0+cHdfc2hlbGwpIFRULnNoZWxsID0geHN0cmR1cChwdy0+cHdfc2hlbGwpOworICAgICAgZWxzZSBUVC5zaGVsbCA9ICIvYmluL3NoIjsKKyAgICB9CisgIH0KKyAgcHdkLnB3X3NoZWxsID0gVFQuc2hlbGw7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3UpIHsKKyAgICBpZiAoVFQudWlkID4gSU5UX01BWCkgZXJyb3JfZXhpdCgiYmFkIHVpZCIpOworICAgIGlmIChnZXRwd3VpZChUVC51aWQpKSBlcnJvcl9leGl0KCJ1aWQgJyVsZCcgaW4gdXNlIiwgVFQudWlkKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUykgVFQudWlkID0gQ0ZHX1RPWUJPWF9VSURfU1lTOworICAgIGVsc2UgVFQudWlkID0gQ0ZHX1RPWUJPWF9VSURfVVNSOworICAgIC8vZmluZCB1bnVzZWQgdWlkCisgICAgd2hpbGUgKGdldHB3dWlkKFRULnVpZCkpIFRULnVpZCsrOworICB9CisgIHB3ZC5wd191aWQgPSBUVC51aWQ7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0cpIFRULmdpZCA9IHhnZXRncm5hbShUVC51X2dycCktPmdyX2dpZDsKKyAgZWxzZSB7CisgICAgLy8gU2V0IHRoZSBHSUQgZm9yIHRoZSB1c2VyLCBpZiBub3Qgc3BlY2lmaWVkCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1MpIFRULmdpZCA9IENGR19UT1lCT1hfVUlEX1NZUzsKKyAgICBlbHNlIFRULmdpZCA9IENGR19UT1lCT1hfVUlEX1VTUjsKKyAgICBpZiAoZ2V0Z3JuYW0ocHdkLnB3X25hbWUpKSBlcnJvcl9leGl0KCJncm91cCAnJXMnIGluIHVzZSIsIHB3ZC5wd19uYW1lKTsKKyAgICAvL2ZpbmQgdW51c2VkIGdpZAorICAgIHdoaWxlIChnZXRncmdpZChUVC5naWQpKSBUVC5naWQrKzsKKyAgfQorICBwd2QucHdfZ2lkID0gVFQuZ2lkOworCisgIC8vIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdXNlcgorICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19HKSkgeworICAgIGNoYXIgKnMgPSB4bXByaW50ZigiLWclbGQiLCAobG9uZylwd2QucHdfZ2lkKTsKKworICAgIGlmICh4cnVuKChjaGFyICpbXSl7Imdyb3VwYWRkIiwgKnRveXMub3B0YXJncywgcywgMH0pKQorICAgICAgZXJyb3JfbXNnKCJhZGRncm91cCAtZyVsZCBmYWlsIiwgKGxvbmcpcHdkLnB3X2dpZCk7CisgICAgZnJlZShzKTsKKyAgfQorCisgIC8qYWRkIHVzZXIgdG8gc3lzdGVtIAorICAgKiAxLiBhZGQgYW4gZW50cnkgdG8gL2V0Yy9wYXNzd2QgYW5kIC9ldGNzaGFkb3cgZmlsZQorICAgKiAyLiBDb3B5IC9ldGMvc2tlbCBkaXIgY29udGVudHMgdG8gdXNlIGhvbWUgZGlyCisgICAqIDMuIHVwZGF0ZSB0aGUgdXNlciBwYXNzd2QgYnkgcnVubmluZyAncGFzc3dkJyB1dGlsaXR5CisgICAqLworCisgIC8vIDEuIGFkZCBhbiBlbnRyeSB0byAvZXRjL3Bhc3N3ZCBhbmQgL2V0Yy9zaGFkb3cgZmlsZQorICBlbnRyeSA9IHhtcHJpbnRmKCIlczolczolbGQ6JWxkOiVzOiVzOiVzIiwgcHdkLnB3X25hbWUsIHB3ZC5wd19wYXNzd2QsCisgICAgICAobG9uZylwd2QucHdfdWlkLCAobG9uZylwd2QucHdfZ2lkLCBwd2QucHdfZ2Vjb3MsIHB3ZC5wd19kaXIsCisgICAgICBwd2QucHdfc2hlbGwpOworICBpZiAodXBkYXRlX3Bhc3N3b3JkKCIvZXRjL3Bhc3N3ZCIsIHB3ZC5wd19uYW1lLCBlbnRyeSkpIGVycm9yX2V4aXQoInVwZGF0aW5nIHBhc3N3ZCBmaWxlIGZhaWxlZCIpOworICBmcmVlKGVudHJ5KTsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfUykgCisgIGVudHJ5ID0geG1wcmludGYoIiVzOiEhOiV1Ojo6Ojo6IiwgcHdkLnB3X25hbWUsIAorICAgICAgKHVuc2lnbmVkKSh0aW1lKE5VTEwpKS8oMjQqNjAqNjApKTsgLy9wYXNzd2QgaXMgbm90IHNldCBpbml0aWFsbHkKKyAgZWxzZSBlbnRyeSA9IHhtcHJpbnRmKCIlczohIToldTowOjk5OTk5Ojc6OjoiLCBwd2QucHdfbmFtZSwgCisgICAgICAgICAgICAodW5zaWduZWQpKHRpbWUoMCkpLygyNCo2MCo2MCkpOyAvL3Bhc3N3ZCBpcyBub3Qgc2V0IGluaXRpYWxseQorICB1cGRhdGVfcGFzc3dvcmQoIi9ldGMvc2hhZG93IiwgcHdkLnB3X25hbWUsIGVudHJ5KTsKKyAgZnJlZShlbnRyeSk7CisKKyAgLy8gY3JlYXRlIGhvbWUgZGlyICYgY29weSBza2VsIGRpciB0byBob21lCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19TfEZMQUdfSCkpKSB7CisgICAgY2hhciAqc2tlbCA9ICIvZXRjL3NrZWwiLCAqcCA9IHB3ZC5wd19kaXI7CisKKyAgICAvLyBDb3B5IGFuZCBjaGFuZ2Ugb3duZXJzaGlwCisgICAgaWYgKGFjY2VzcyhwLCBGX09LKSkgeworICAgICAgaWYgKCFhY2Nlc3Moc2tlbCwgUl9PSykpCisgICAgICAgIHRveXMuZXhpdHZhbCA9IHhydW4oKGNoYXIgKltdKXsiY3AiLCAiLVIiLCBza2VsLCBwLCAwfSk7CisgICAgICBlbHNlIHRveXMuZXhpdHZhbCA9IHhydW4oKGNoYXIgKltdKXsibWtkaXIiLCAiLXAiLCBwLCAwfSk7CisgICAgICBpZiAoIXRveXMuZXhpdHZhbCkKKyAgICAgICAgdG95cy5leGl0dmFsIHw9IHhydW4oKGNoYXIgKltdKXsiY2hvd24iLCAiLVIiLAorICAgICAgICAgIHhtcHJpbnRmKCIlbHU6JWx1IiwgVFQudWlkLCBUVC5naWQpLCBwLCAwfSk7CisgICAgICB3ZmNobW9kYXQoQVRfRkRDV0QsIHAsIDA3MDApOworICAgIH0gZWxzZSBmcHJpbnRmKHN0ZGVyciwgIiclcycgZXhpc3RzLCBub3QgY29weWluZyAnJXMnIiwgcCwgc2tlbCk7CisgIH0KKworICAvLzMuIHVwZGF0ZSB0aGUgdXNlciBwYXNzd2QgYnkgcnVubmluZyAncGFzc3dkJyB1dGlsaXR5CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0QpKQorICAgIGlmICh4cnVuKChjaGFyICpbXSl7InBhc3N3ZCIsIHB3ZC5wd19uYW1lLCAwfSkpIGVycm9yX2V4aXQoInBhc3N3ZCIpOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19HKSB7CisgICAgLyphZGQgdXNlciB0byB0aGUgZXhpc3RpbmcgZ3JvdXAsIGludm9rZSBhZGRncm91cCBjb21tYW5kICovCisgICAgaWYgKHhydW4oKGNoYXIgKltdKXsiZ3JvdXBhZGQiLCAqdG95cy5vcHRhcmdzLCBUVC51X2dycCwgMH0pKQorICAgICAgZXJyb3JfZXhpdCgiZ3JvdXBhZGQiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcGVuZGluZy91c2VyZGVsLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3VzZXJkZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzkzYTIxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy91c2VyZGVsLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIHVzZXJkZWwuYyAtIGRlbGV0ZSBhIHVzZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pMTk4MUBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvdXNlcmRlbC5odG1sCisKK1VTRV9VU0VSREVMKE5FV1RPWSh1c2VyZGVsLCAiPDE+MXIiLCBUT1lGTEFHX05FRURST09UfFRPWUZMQUdfU0JJTikpCitVU0VfVVNFUkRFTChPTERUT1koZGVsdXNlciwgdXNlcmRlbCwgVE9ZRkxBR19ORUVEUk9PVHxUT1lGTEFHX1NCSU4pKQorCitjb25maWcgVVNFUkRFTAorICBib29sICJ1c2VyZGVsIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB1c2VyZGVsIFstcl0gVVNFUgorICAgIHVzYWdlOiBkZWx1c2VyIFstcl0gVVNFUgorICAKKyAgICBPcHRpb25zOgorICAgIC1yIHJlbW92ZSBob21lIGRpcmVjdG9yeQorICAgIERlbGV0ZSBVU0VSIGZyb20gdGhlIFNZU1RFTQorKi8KKworI2RlZmluZSBGT1JfdXNlcmRlbAorI2luY2x1ZGUgInRveXMuaCIKKworc3RhdGljIHZvaWQgdXBkYXRlX2dyb3VwZmlsZXMoY2hhciAqZmlsZW5hbWUsIGNoYXIqIHVzZXJuYW1lKQoreworICBjaGFyICpmaWxlbmFtZXNmeCA9IE5VTEwsICpzZnggPSBOVUxMLCAqbGluZSA9IE5VTEw7CisgIEZJTEUgKmV4ZnAsICpuZXdmcDsKKyAgaW50IHVsZW4gPSBzdHJsZW4odXNlcm5hbWUpOworICBzdHJ1Y3QgZmxvY2sgbG9jazsKKworICBmaWxlbmFtZXNmeCA9IHhtcHJpbnRmKCIlcysiLCBmaWxlbmFtZSk7CisgIHNmeCA9IHN0cmNocihmaWxlbmFtZXNmeCwgJysnKTsKKyAgZXhmcCA9IHhmb3BlbihmaWxlbmFtZSwgInIrIik7CisKKyAgKnNmeCA9ICctJzsKKyAgdW5saW5rKGZpbGVuYW1lc2Z4KTsKKyAgaWYgKGxpbmsoZmlsZW5hbWUsIGZpbGVuYW1lc2Z4KSkgZXJyb3JfbXNnKCJDYW4ndCBjcmVhdGUgYmFja3VwIGZpbGUiKTsKKworICAqc2Z4ID0gJysnOworICBsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisgIGxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKyAgbG9jay5sX3N0YXJ0ID0gbG9jay5sX2xlbiA9IDA7CisKKyAgaWYgKGZjbnRsKGZpbGVubyhleGZwKSwgRl9TRVRMSywgJmxvY2spIDwgMCkKKyAgICBwZXJyb3JfbXNnKCJDb3VsZG4ndCBsb2NrIGZpbGUgJXMiLGZpbGVuYW1lKTsKKworICBsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7IC8vdW5sb2NraW5nIGF0IGEgbGF0ZXIgc3RhZ2UKKworICBuZXdmcCA9IHhmb3BlbihmaWxlbmFtZXNmeCwgIncrIik7CisKKyAgd2hpbGUgKChsaW5lID0gZ2V0X2xpbmUoZmlsZW5vKGV4ZnApKSkgIT0gTlVMTCl7CisgICAgc3ByaW50Zih0b3lidWYsICIlczoiLHVzZXJuYW1lKTsKKyAgICBpZiAoIXN0cm5jbXAobGluZSwgdG95YnVmLCB1bGVuKzEpKSBnb3RvIExPT1A7CisgICAgZWxzZSB7CisgICAgICBjaGFyICpuLCAqcCA9IHN0cnJjaHIobGluZSwgJzonKTsKKworICAgICAgaWYgKHAgJiYgKisrcCAmJiAobiA9IHN0cnN0cihwLCB1c2VybmFtZSkpKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAoblt1bGVuXSA9PSAnLCcpIHsKKyAgICAgICAgICAgICpuID0gJ1wwJzsKKyAgICAgICAgICAgIG4gKz0gdWxlbiArIDE7CisgICAgICAgICAgICBmcHJpbnRmKG5ld2ZwLCAiJXMlc1xuIiwgbGluZSwgbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKCFuW3VsZW5dKSB7CisgICAgICAgICAgICBpZiAoblstMV0gPT0gJywnKSBuWy0xXSA9ICpuID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChuWy0xXSA9PSAnOicpICpuID0gJ1wwJzsKKyAgICAgICAgICAgIGZwcmludGYobmV3ZnAsICIlcyVzXG4iLCBsaW5lLCBuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBuICs9IHVsZW47CisgICAgICAgIH0gd2hpbGUgKCpuICYmIChuPXN0cnN0cihuLCB1c2VybmFtZSkpKTsKKyAgICAgICAgaWYgKCFuKSBmcHJpbnRmKG5ld2ZwLCAiJXNcbiIsIGxpbmUpOworICAgICAgfSBlbHNlIGZwcmludGYobmV3ZnAsICIlc1xuIiwgbGluZSk7CisgICAgfQorTE9PUDoKKyAgICBmcmVlKGxpbmUpOworICB9CisgIGZjbnRsKGZpbGVubyhleGZwKSwgRl9TRVRMSywgJmxvY2spOworICBmY2xvc2UoZXhmcCk7CisgIGVycm5vID0gMDsKKyAgZmZsdXNoKG5ld2ZwKTsKKyAgZnN5bmMoZmlsZW5vKG5ld2ZwKSk7CisgIGZjbG9zZShuZXdmcCk7CisgIHJlbmFtZShmaWxlbmFtZXNmeCwgZmlsZW5hbWUpOworICBpZiAoZXJybm8peworICAgIHBlcnJvcl9tc2coIkZpbGUgV3JpdGluZy9TYXZpbmcgZmFpbGVkOiAiKTsKKyAgICB1bmxpbmsoZmlsZW5hbWVzZngpOworICB9CisgIGZyZWUoZmlsZW5hbWVzZngpOworfQorCit2b2lkIHVzZXJkZWxfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgcGFzc3dkICpwd2QgPSBOVUxMOworCisgIHB3ZCA9IHhnZXRwd25hbSgqdG95cy5vcHRhcmdzKTsKKyAgdXBkYXRlX3Bhc3N3b3JkKCIvZXRjL3Bhc3N3ZCIsIHB3ZC0+cHdfbmFtZSwgTlVMTCk7CisgIHVwZGF0ZV9wYXNzd29yZCgiL2V0Yy9zaGFkb3ciLCBwd2QtPnB3X25hbWUsIE5VTEwpOworCisgIC8vIGRlbGV0ZSB0aGUgZ3JvdXAgbmFtZWQgVVNFUiwgYW5kIHJlbW92ZSB1c2VyIGZyb20gZ3JvdXAuCisgIC8vIGNvdWxkIHVwZGF0ZV9wYXNzd29yZCgpIGJlIHVzZWQgZm9yIHRoaXM/IAorICAvLyBub3QgYSBnb29kIGlkZWEsIGFzIHVwZGF0ZV9wYXNzd2QoKSB1cGRhdGVzIG9uZSBlbnRyeSBhdCBhIHRpbWUKKyAgLy8gaW4gdGhpcyBjYXNlIGl0IHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBmaWxlcyBhcyBtYW55IHRpbWVzIHRoZSAKKyAgLy8gVVNFUiBhcHBlYXJzIGluIGdyb3VwIGRhdGFiYXNlIGZpbGVzLiBTbyB0aGUgY3VzdG9taXplZCB2ZXJzaW9uCisgIC8vIG9mIHVwZGF0ZV9wYXNzd2QoKSBpcyBoZXJlLgorICB1cGRhdGVfZ3JvdXBmaWxlcygiL2V0Yy9ncm91cCIsICp0b3lzLm9wdGFyZ3MpOworICB1cGRhdGVfZ3JvdXBmaWxlcygiL2V0Yy9nc2hhZG93IiwgKnRveXMub3B0YXJncyk7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpIHsKKyAgICBjaGFyICphcmdbXSA9IHsicm0iLCAiLWZyIiwgcHdkLT5wd19kaXIsIE5VTEwsIE5VTEx9OworCisgICAgc3ByaW50Zih0b3lidWYsICIvdmFyL3Nwb29sL21haWwvJXMiLHB3ZC0+cHdfbmFtZSk7CisgICAgYXJnWzNdID0gdG95YnVmOworICAgIHhleGVjKGFyZyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvdmkuYyBiL3RveWJveC90b3lzL3BlbmRpbmcvdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhkYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy92aS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIHZpLmMgLSBZb3UgY2FuJ3Qgc3BlbGwgImV2aWwiIHdpdGhvdXQgInZpIi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdmkuaHRtbAorCitVU0VfVkkoTkVXVE9ZKHZpLCAiPDE+MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFZJCisgIGJvb2wgInZpIgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB2aSBGSUxFCisKKyAgICBWaXN1YWwgdGV4dCBlZGl0b3IuIFByZWRhdGVzIHRoZSBleGlzdGVuY2Ugb2Ygc3RhbmRhcmRpemVkIGN1cnNvciBrZXlzLAorICAgIHNvIHRoZSBjb250cm9scyBhcmUgd2VpcmQgYW5kIGhpc3RvcmljYWwuCisqLworCisjZGVmaW5lIEZPUl92aQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgc3RydWN0IGxpbmVzdGFjayAqbHM7CisgIGNoYXIgKnN0YXRsaW5lOworKQorCitzdHJ1Y3QgbGluZXN0YWNrX3Nob3cgeworICBzdHJ1Y3QgbGluZXN0YWNrX3Nob3cgKm5leHQ7CisgIGxvbmcgdG9wLCBsZWZ0OworICBpbnQgeCwgd2lkdGgsIHksIGhlaWdodDsKK307CisKKy8vIGxpbmVzdGFjaywgd2hhdCB0byBzaG93LCB3aGVyZSB0byBzaG93IGl0Cit2b2lkIGxpbmVzdGFja19zaG93KHN0cnVjdCBsaW5lc3RhY2sgKmxzLCBzdHJ1Y3QgbGluZXN0YWNrX3Nob3cgKmxzcykKK3sKKyAgcmV0dXJuOworfQorCit2b2lkIHZpX21haW4odm9pZCkKK3sKKyAgaW50IGk7CisKKyAgaWYgKCEoVFQubHMgPSBsaW5lc3RhY2tfbG9hZCgqdG95cy5vcHRhcmdzKSkpCisgICAgVFQubHMgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgbGluZXN0YWNrKSk7CisgCisgIGZvciAoaT0wOyBpPFRULmxzLT5sZW47IGkrKykKKyAgICBwcmludGYoIiUuKnNcbiIsIChpbnQpVFQubHMtPmlkeFtpXS5sZW4sIChjaGFyICopVFQubHMtPmlkeFtpXS5wdHIpOyAgCit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wZW5kaW5nL3dhdGNoLmMgYi90b3lib3gvdG95cy9wZW5kaW5nL3dhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxYTA3OQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvd2F0Y2guYwpAQCAtMCwwICsxLDcwIEBACisvKiB3YXRjaC5jIC0gRXhlY3V0ZSBhIHByb2dyYW0gcGVyaW9kaWNhbGx5CisgKgorICogQ29weXJpZ2h0IDIwMTMgU2FuZGVlcCBTaGFybWEgPHNhbmRlZXAuamFjazI3NTZAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTMgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorVVNFX1dBVENIKE5FV1RPWSh3YXRjaCwgIl48MW4jPDA9MnRlIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgV0FUQ0gKKyAgYm9vbCAid2F0Y2giCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IHdhdGNoIFstbiBTRUNdIFstdF0gUFJPRyBBUkdTCisKKyAgICBSdW4gUFJPRyBwZXJpb2RpY2FsbHkKKworICAgIC1uICBMb29wIHBlcmlvZCBpbiBzZWNvbmRzIChkZWZhdWx0IDIpCisgICAgLXQgIERvbid0IHByaW50IGhlYWRlcgorICAgIC1lICBGcmVlemUgdXBkYXRlcyBvbiBjb21tYW5kIGVycm9yLCBhbmQgZXhpdCBhZnRlciBlbnRlci4KKyovCisjZGVmaW5lIEZPUl93YXRjaAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgaW50IGludGVydmFsOworKQorCit2b2lkIHdhdGNoX21haW4odm9pZCkKK3sKKyAgaW50IGkgPSAwLCBobGVuOworICB0aW1lX3QgdDsKKyAgdW5zaWduZWQgd2lkdGggPSA4MCwgbGVuID0gc2l6ZW9mKCJXd3cgTW1tIGRkIGhoOm1tOnNzIHl5eXkiKSAtIDEgOworICBjaGFyICpoZWFkZXIsICpjbWQgPSAqdG95cy5vcHRhcmdzOworICBpbnQgcmV0dmFsOworCisgIHdoaWxlKHRveXMub3B0YXJnc1srK2ldKQorICB7CisgICAgY2hhciAqIG9sZGNtZCA9IGNtZDsKKyAgICBjbWQgPSB4bXByaW50ZigiJXMgJXMiLCBvbGRjbWQsIHRveXMub3B0YXJnc1tpXSk7CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShvbGRjbWQpOworICB9CisgIGhlYWRlciA9IHhtcHJpbnRmKCJFdmVyeSAldXM6ICVzIiwgVFQuaW50ZXJ2YWwsIGNtZCk7CisgIGhsZW4gPSBzdHJsZW4oaGVhZGVyKTsKKworICB3aGlsZSgxKSB7CisgICAgeHByaW50ZigiXDAzM1tIXDAzM1tKIik7CisgICAgaWYoISh0b3lzLm9wdGZsYWdzICYgRkxBR190KSkgeworICAgICAgdGVybWluYWxfc2l6ZSgmd2lkdGgsIE5VTEwpOworICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSA4MDsgLy9vbiBzZXJpYWwgaXQgbWF5IHJldHVybiAwLgorICAgICAgdGltZSgmdCk7CisgICAgICBpZiAod2lkdGggPiAoaGxlbiArIGxlbikpIHhwcmludGYoIiVzIiwgaGVhZGVyKTsKKyAgICAgIGlmKHdpZHRoID49IGxlbikKKyAgICAgICAgeHByaW50ZigiJSpzXG4iLHdpZHRoICsgKCh3aWR0aCA+IChobGVuICsgbGVuKSk/LWhsZW46MCkgKyAxLCBjdGltZSgmdCkpOworICAgICAgZWxzZQorICAgICAgICB4cHJpbnRmKCJcblxuIik7CisgICAgfQorICAgIGZmbHVzaChOVUxMKTsgLy9tYWtpbmcgc3VyZSB0aGUgc2NyZWVuIGlzIGNsZWFyCisgICAgcmV0dmFsID0gc3lzdGVtKGNtZCk7CisgICAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19lKSAmJiByZXR2YWwpeworICAgICAgeHByaW50ZigiY29tbWFuZCBleGl0IHdpdGggbm9uLXplcm8gc3RhdHVzLCBwcmVzcyBlbnRlciB0byBleGl0XG4iKTsKKyAgICAgIGdldGNoYXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbGVlcChUVC5pbnRlcnZhbCk7CisgIH0KKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKXsKKyAgICBmcmVlKGhlYWRlcik7CisgICAgaWYgKGNtZCAhPSAqdG95cy5vcHRhcmdzKSBmcmVlKGNtZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcvd2dldC5jIGIvdG95Ym94L3RveXMvcGVuZGluZy93Z2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4M2ZlNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3BlbmRpbmcvd2dldC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiB3Z2V0LmMgLSBTaW1wbGUgZG93bmxvYWRlciB0byBnZXQgdGhlIHJlc291cmNlIGZpbGUgaW4gSFRUUCBzZXJ2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBMaXBpIEMuSC4gTGVlIDxsaXBpc29mdEBnbWFpbC5jb20+CisgKgorCitVU0VfV0dFVChORVdUT1kod2dldCwgImY6IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgV0dFVAorICBib29sICJ3Z2V0IgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB3Z2V0IC1mIGZpbGVuYW1lIFVSTAorICAgIC1mIGZpbGVuYW1lOiBzcGVjaWZ5IHRoZSBmaWxlbmFtZSB0byBiZSBzYXZlZAorICAgIFVSTDogSFRUUCB1bmlmb3JtIHJlc291cmNlIGxvY2F0aW9uIGFuZCBvbmx5IEhUVFAsIG5vdCBIVFRQUworCisgICAgZXhhbXBsZXM6CisgICAgICB3Z2V0IC1mIGluZGV4Lmh0bWwgaHR0cDovL3d3dy5leGFtcGxlLmNvbQorICAgICAgd2dldCAtZiBzYW1wbGUuanBnIGh0dHA6Ly93d3cuZXhhbXBsZS5jb206ODA4MC9zYW1wbGUuanBnCisqLworCisjZGVmaW5lIEZPUl93Z2V0CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpmaWxlbmFtZTsKKykKKworLy8gZXh0cmFjdCBob3N0bmFtZSBmcm9tIHVybAorc3RhdGljIHVuc2lnbmVkIGdldF9obihjb25zdCBjaGFyICp1cmwsIGNoYXIgKmhvc3RuYW1lKSB7CisgIHVuc2lnbmVkIGk7CisKKyAgZm9yIChpID0gMDsgdXJsW2ldICE9ICdcMCcgJiYgdXJsW2ldICE9ICc6JyAmJiB1cmxbaV0gIT0gJy8nOyBpKyspIHsKKyAgICBpZihpID49IDEwMjQpIGVycm9yX2V4aXQoInRvbyBsb25nIGhvc3RuYW1lIGluIFVSTCIpOworICAgIGhvc3RuYW1lW2ldID0gdXJsW2ldOworICB9CisgIGhvc3RuYW1lW2ldID0gJ1wwJzsKKworICByZXR1cm4gaTsKK30KKworLy8gZXh0cmFjdCBwb3J0IG51bWJlcgorc3RhdGljIHVuc2lnbmVkIGdldF9wb3J0KGNvbnN0IGNoYXIgKnVybCwgY2hhciAqcG9ydCwgdW5zaWduZWQgdXJsX2kpIHsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyB1cmxbaV0gIT0gJ1wwJyAmJiB1cmxbaV0gIT0gJy8nOyBpKyssIHVybF9pKyspIHsKKyAgICBpZignMCcgPD0gdXJsW2ldICYmIHVybFtpXSA8PSAnOScpIHBvcnRbaV0gPSB1cmxbaV07CisgICAgZWxzZSBlcnJvcl9leGl0KCJ3cm9uZyBkZWNpbWFsIHBvcnQgbnVtYmVyIik7CisgIH0KKyAgaWYoaSA8PSA2KSBwb3J0W2ldID0gJ1wwJzsKKyAgZWxzZSBlcnJvcl9leGl0KCJ0b28gbG9uZyBwb3J0IG51bWJlciIpOworCisgIHJldHVybiB1cmxfaTsKK30KKworLy8gZ2V0IGh0dHAgaW5mb3MgaW4gVVJMCitzdGF0aWMgdm9pZCBnZXRfaW5mbyhjb25zdCBjaGFyICp1cmwsIGNoYXIqIGhvc3RuYW1lLCBjaGFyICpwb3J0LCBjaGFyICpwYXRoKSB7CisgIHVuc2lnbmVkIGkgPSA3LCBsZW47CisKKyAgaWYgKHN0cm5jbXAodXJsLCAiaHR0cDovLyIsIGkpKSBlcnJvcl9leGl0KCJvbmx5IEhUVFAgc3VwcG9ydCIpOworICBsZW4gPSBnZXRfaG4odXJsK2ksIGhvc3RuYW1lKTsKKyAgaSArPSBsZW47CisKKyAgLy8gZ2V0IHBvcnQgaWYgZXhpc3RzCisgIGlmICh1cmxbaV0gPT0gJzonKSB7CisgICAgaSsrOworICAgIGkgPSBnZXRfcG9ydCh1cmwraSwgcG9ydCwgaSk7CisgIH0gZWxzZSBzdHJjcHkocG9ydCwgIjgwIik7CisKKyAgLy8gZ2V0IHVyaSBpbiBVUkwKKyAgaWYgKHVybFtpXSA9PSAnXDAnKSBzdHJjcHkocGF0aCwgIi8iKTsKKyAgZWxzZSBpZiAodXJsW2ldID09ICcvJykgeworICAgIGlmIChzdHJsZW4odXJsK2kpIDwgMTAyNCkgc3RyY3B5KHBhdGgsIHVybCtpKTsKKyAgICBlbHNlIGVycm9yX2V4aXQoInRvbyBsb25nIHBhdGggaW4gVVJMIik7CisgIH0gZWxzZSBlcnJvcl9leGl0KCJ3cm9uZyBVUkwiKTsKK30KKworLy8gY29ubmVjdCB0byBhbnkgSVB2NCBvciBJUHY2IHNlcnZlcgorc3RhdGljIGludCBjb25uX3N2cihjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqcG9ydCkgeworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXN1bHQsICpycDsKKyAgaW50IHNvY2s7CisKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gMDsKKyAgaGludHMuYWlfcHJvdG9jb2wgPSAwOworCisgIGlmICgoZXJybm8gPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgcG9ydCwgJmhpbnRzLCAmcmVzdWx0KSkpCisgICAgZXJyb3JfZXhpdCgiZ2V0YWRkcmluZm86ICVzIiwgZ2FpX3N0cmVycm9yKGVycm5vKSk7CisKKyAgLy8gdHJ5IGFsbCBhZGRyZXNzIGxpc3QoSVB2NCBvciBJUHY2KSB1bnRpbCBzdWNjZXNzCisgIGZvciAocnAgPSByZXN1bHQ7IHJwOyBycCA9IHJwLT5haV9uZXh0KSB7CisgICAgaWYgKChzb2NrID0gc29ja2V0KHJwLT5haV9mYW1pbHksIHJwLT5haV9zb2NrdHlwZSwgcnAtPmFpX3Byb3RvY29sKSkKKyAgICAgICAgPT0gLTEpIHsKKyAgICAgIHBlcnJvcl9tc2coInNvY2tldCBlcnJvciIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChjb25uZWN0KHNvY2ssIHJwLT5haV9hZGRyLCBycC0+YWlfYWRkcmxlbikgIT0gLTEpCisgICAgICBicmVhazsgLy8gc3VjY2VlZCBpbiBjb25uZWN0aW5nIHRvIGFueSBzZXJ2ZXIgSVAgCisgICAgZWxzZSBwZXJyb3JfbXNnKCJjb25uZWN0IGVycm9yIik7CisgICAgY2xvc2Uoc29jayk7CisgIH0KKyAgZnJlZWFkZHJpbmZvKHJlc3VsdCk7CisgIGlmKCFycCkgZXJyb3JfZXhpdCgiY2FuJ3QgY29ubmVjdCIpOworCisgIHJldHVybiBzb2NrOworfQorCisvLyBtYWtlIEhUVFAgcmVxdWVzdCBoZWFkZXIgZmllbGQKK3N0YXRpYyB2b2lkIG1rX2ZsZChjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSkgeworICBzdHJjYXQodG95YnVmLCBuYW1lKTsKKyAgc3RyY2F0KHRveWJ1ZiwgIjogIik7CisgIHN0cmNhdCh0b3lidWYsIHZhbHVlKTsKKyAgc3RyY2F0KHRveWJ1ZiwgIlxyXG4iKTsKK30KKworLy8gZ2V0IGh0dHAgcmVzcG9uc2UgYm9keSBzdGFydGluZyBhZGRyZXNzIGFuZCBpdHMgbGVuZ3RoCitzdGF0aWMgY2hhciAqZ2V0X2JvZHkoc3NpemVfdCBsZW4sIHNzaXplX3QgKmJvZHlfbGVuKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW4tNDsgaSsrKQorICAgIGlmICghc3RybmNtcCh0b3lidWYraSwgIlxyXG5cclxuIiwgNCkpIGJyZWFrOworCisgICpib2R5X2xlbiA9IGxlbiAtIGkgLSA0OworICByZXR1cm4gdG95YnVmK2krNDsKK30KKwordm9pZCB3Z2V0X21haW4odm9pZCkKK3sKKyAgaW50IHNvY2s7CisgIEZJTEUgKmZwOworICBzc2l6ZV90IGxlbiwgYm9keV9sZW47CisgIGNoYXIgKmJvZHksICpyZXN1bHQsICpyYywgKnJfc3RyOworICBjaGFyIHVhWzE4XSA9ICJ0b3lib3ggd2dldC8iLCB2ZXJbNl0sIGhvc3RuYW1lWzEwMjRdLCBwb3J0WzZdLCBwYXRoWzEwMjRdOworCisgIC8vIFRPRE8gZXh0cmFjdCBmaWxlbmFtZSB0byBiZSBzYXZlZCBmcm9tIFVSTAorICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSkgaGVscF9leGl0KCJubyBmaWxlbmFtZSIpOworICBpZiAoZm9wZW4oVFQuZmlsZW5hbWUsICJyIikpIHBlcnJvcl9leGl0KCJmaWxlIGFscmVhZHkgZXhpc3RzIik7CisKKyAgaWYoIXRveXMub3B0YXJnc1swXSkgaGVscF9leGl0KCJubyBVUkwiKTsKKyAgZ2V0X2luZm8odG95cy5vcHRhcmdzWzBdLCBob3N0bmFtZSwgcG9ydCwgcGF0aCk7CisKKyAgc29jayA9IGNvbm5fc3ZyKGhvc3RuYW1lLCBwb3J0KTsKKworICAvLyBjb21wb3NlIEhUVFAgcmVxdWVzdAorICBzcHJpbnRmKHRveWJ1ZiwgIkdFVCAlcyBIVFRQLzEuMVxyXG4iLCBwYXRoKTsKKyAgbWtfZmxkKCJIb3N0IiwgaG9zdG5hbWUpOworICBzdHJuY3B5KHZlciwgVE9ZQk9YX1ZFUlNJT04sIDUpOworICBzdHJjYXQodWEsIHZlcik7CisgIG1rX2ZsZCgiVXNlci1BZ2VudCIsIHVhKTsgCisgIG1rX2ZsZCgiQ29ubmVjdGlvbiIsICJjbG9zZSIpOworICBzdHJjYXQodG95YnVmLCAiXHJcbiIpOworCisgIC8vIHNlbmQgdGhlIEhUVFAgcmVxdWVzdAorICBsZW4gPSBzdHJsZW4odG95YnVmKTsKKyAgaWYgKHdyaXRlKHNvY2ssIHRveWJ1ZiwgbGVuKSAhPSBsZW4pIHBlcnJvcl9leGl0KCJ3cml0ZSBlcnJvciIpOworCisgIC8vIHJlYWQgSFRUUCByZXNwb25zZQorICBpZiAoKGxlbiA9IHJlYWQoc29jaywgdG95YnVmLCA0MDk2KSkgPT0gLTEpIHBlcnJvcl9leGl0KCJyZWFkIGVycm9yIik7CisgIGlmICghc3Ryc3RyKHRveWJ1ZiwgIlxyXG5cclxuIikpIGVycm9yX2V4aXQoInRvbyBsb25nIEhUVFAgcmVzcG9uc2UiKTsKKyAgYm9keSA9IGdldF9ib2R5KGxlbiwgJmJvZHlfbGVuKTsKKyAgcmVzdWx0ID0gc3RydG9rKHRveWJ1ZiwgIlxyIik7CisgIHN0cnRvayhyZXN1bHQsICIgIik7CisgIHJjID0gc3RydG9rKE5VTEwsICIgIik7CisgIHJfc3RyID0gc3RydG9rKE5VTEwsICIgIik7CisKKyAgLy8gSFRUUCByZXMgY29kZSBjaGVjaworICAvLyBUT0RPIGhhbmRsZSBIVFRQIDMwMiBGb3VuZChSZWRpcmVjdGlvbikKKyAgaWYgKHN0cmNtcChyYywgIjIwMCIpKSBlcnJvcl9leGl0KCJyZXM6ICVzKCVzKSIsIHJjLCByX3N0cik7CisKKyAgaWYgKCEoZnAgPSBmb3BlbihUVC5maWxlbmFtZSwgInciKSkpIHBlcnJvcl9leGl0KCJmb3BlbiBlcnJvciIpOworICBpZiAoZndyaXRlKGJvZHksIDEsIGJvZHlfbGVuLCBmcCkgIT0gYm9keV9sZW4pCisgICAgZXJyb3JfZXhpdCgiZndyaXRlIGVycm9yIik7CisgIHdoaWxlICgobGVuID0gcmVhZChzb2NrLCB0b3lidWYsIDQwOTYpKSA+IDApCisgICAgaWYgKGZ3cml0ZSh0b3lidWYsIDEsIGxlbiwgZnApICE9IGxlbikKKyAgICAgIGVycm9yX2V4aXQoImZ3cml0ZSBlcnJvciIpOworICBpZiAoZmNsb3NlKGZwKSA9PSBFT0YpIHBlcnJvcl9leGl0KCJmY2xvc2UgZXJyb3IiKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3BlbmRpbmcveHpjYXQuYyBiL3RveWJveC90b3lzL3BlbmRpbmcveHpjYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFlYWQwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcGVuZGluZy94emNhdC5jCkBAIC0wLDAgKzEsMzE0MyBAQAorLyoKKyAqIFNpbXBsZSBYWiBkZWNvZGVyIGNvbW1hbmQgbGluZSB0b29sCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICogTW9kaWZpZWQgZm9yIHRveWJveCBieSBJc2FhYyBEdW5oYW0KK1VTRV9YWkNBVChORVdUT1koeHpjYXQsIE5VTEwsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFhaQ0FUCisgIGJvb2wgInh6Y2F0IgorICBkZWZhdWx0IG4KKyAgaGVscAorICAgIHVzYWdlOiB4emNhdCBbZmlsZW5hbWUuLi5dCisgICAgCisgICAgRGVjb21wcmVzcyBsaXN0ZWQgZmlsZXMgdG8gc3Rkb3V0LiBVc2Ugc3RkaW4gaWYgbm8gZmlsZXMgbGlzdGVkLgorCisqLworI2RlZmluZSBGT1JfeHpjYXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKKy8vIEJFR0lOIHh6LmgKKworLyoqCisgKiBlbnVtIHh6X3JldCAtIFJldHVybiBjb2RlcworICogQFhaX09LOiAgICAgICAgICAgICAgICAgIEV2ZXJ5dGhpbmcgaXMgT0sgc28gZmFyLiBNb3JlIGlucHV0IG9yIG1vcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3BhY2UgaXMgcmVxdWlyZWQgdG8gY29udGludWUuCisgKiBAWFpfU1RSRUFNX0VORDogICAgICAgICAgT3BlcmF0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4KKyAqIEBYWl9VTlNVUFBPUlRFRF9DSEVDSzogICBJbnRlZ3JpdHkgY2hlY2sgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiBEZWNvZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN0aWxsIHBvc3NpYmxlIGluIG11bHRpLWNhbGwgbW9kZSBieSBzaW1wbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIHh6X2RlY19ydW4oKSBhZ2Fpbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyByZXR1cm4gdmFsdWUgaXMgdXNlZCBvbmx5IGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFpfREVDX0FOWV9DSEVDSyB3YXMgZGVmaW5lZCBhdCBidWlsZCB0aW1lLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5vdCB1c2VkIGluIHRoZSBrZXJuZWwuIFVuc3VwcG9ydGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgdHlwZXMgcmV0dXJuIFhaX09QVElPTlNfRVJST1IgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9ERUNfQU5ZX0NIRUNLIHdhcyBub3QgZGVmaW5lZCBhdCBidWlsZCB0aW1lLgorICogQFhaX01FTV9FUlJPUjogICAgICAgICAgIEFsbG9jYXRpbmcgbWVtb3J5IGZhaWxlZC4gVGhlIGFtb3VudCBvZiBtZW1vcnkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3YXMgdHJpZWQgdG8gYmUgYWxsb2NhdGVkIHdhcyBubyBtb3JlIHRoYW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdF9tYXggYXJndW1lbnQgZ2l2ZW4gdG8geHpfZGVjX2luaXQoKS4KKyAqIEBYWl9NRU1MSU1JVF9FUlJPUjogICAgICBBIGJpZ2dlciBMWk1BMiBkaWN0aW9uYXJ5IHdvdWxkIGJlIG5lZWRlZCB0aGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBieSB0aGUgZGljdF9tYXggYXJndW1lbnQgZ2l2ZW4gdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB4el9kZWNfaW5pdCgpLgorICogQFhaX0ZPUk1BVF9FUlJPUjogICAgICAgIEZpbGUgZm9ybWF0IHdhcyBub3QgcmVjb2duaXplZCAod3JvbmcgbWFnaWMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcykuCisgKiBAWFpfT1BUSU9OU19FUlJPUjogICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uIG9wdGlvbnMuIEluIHRoZSBkZWNvZGVyIHRoaXMgbWVhbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBoZWFkZXIgQ1JDMzIgbWF0Y2hlcywgYnV0IHRoZSBoZWFkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYgc3BlY2lmaWVzIHNvbWV0aGluZyB0aGF0IHdlIGRvbid0IHN1cHBvcnQuCisgKiBAWFpfREFUQV9FUlJPUjogICAgICAgICAgQ29tcHJlc3NlZCBkYXRhIGlzIGNvcnJ1cHQuCisgKiBAWFpfQlVGX0VSUk9SOiAgICAgICAgICAgQ2Fubm90IG1ha2UgYW55IHByb2dyZXNzLiBEZXRhaWxzIGFyZSBzbGlnaHRseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBiZXR3ZWVuIG11bHRpLWNhbGwgYW5kIHNpbmdsZS1jYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTsgbW9yZSBpbmZvcm1hdGlvbiBiZWxvdy4KKyAqCisgKiBYWl9CVUZfRVJST1IgaXMgcmV0dXJuZWQgd2hlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gWFogY29kZSBjYW5ub3QgCisgKiBjb25zdW1lIGFueSBpbnB1dCBhbmQgY2Fubm90IHByb2R1Y2UgYW55IG5ldyBvdXRwdXQuIFRoaXMgaGFwcGVucyB3aGVuCisgKiB0aGVyZSBpcyBubyBuZXcgaW5wdXQgYXZhaWxhYmxlLCBvciB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIHdoaWxlIGF0CisgKiBsZWFzdCBvbmUgb3V0cHV0IGJ5dGUgaXMgc3RpbGwgcGVuZGluZy4gQXNzdW1pbmcgeW91ciBjb2RlIGlzIG5vdCBidWdneSwKKyAqIHlvdSBjYW4gZ2V0IHRoaXMgZXJyb3Igb25seSB3aGVuIGRlY29kaW5nIGEgY29tcHJlc3NlZCBzdHJlYW0gdGhhdCBpcyAKKyAqIHRydW5jYXRlZCBvciBvdGhlcndpc2UgY29ycnVwdC4KKyAqLworZW51bSB4el9yZXQgeworICBYWl9PSywKKyAgWFpfU1RSRUFNX0VORCwKKyAgWFpfVU5TVVBQT1JURURfQ0hFQ0ssCisgIFhaX01FTV9FUlJPUiwKKyAgWFpfTUVNTElNSVRfRVJST1IsCisgIFhaX0ZPUk1BVF9FUlJPUiwKKyAgWFpfT1BUSU9OU19FUlJPUiwKKyAgWFpfREFUQV9FUlJPUiwKKyAgWFpfQlVGX0VSUk9SCit9OworCisvKioKKyAqIHN0cnVjdCB4el9idWYgLSBQYXNzaW5nIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byBYWiBjb2RlCisgKiBAaW46ICAgICAgICAgQmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBpbl9wb3MgaXMgZXF1YWwgdG8gaW5fc2l6ZS4KKyAqIEBpbl9wb3M6ICAgICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgaW5fc2l6ZS4KKyAqIEBpbl9zaXplOiAgICBTaXplIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBvdXQ6ICAgICAgICBCZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBvdXRfcG9zIGlzIGVxdWFsIHRvIG91dF9zaXplLgorICogQG91dF9wb3M6ICAgIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgb3V0X3NpemUuCisgKiBAb3V0X3NpemU6ICAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICoKKyAqIE9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gb3V0W291dF9wb3NdIG9ud2FyZCwgYW5kCisgKiB0aGUgdmFyaWFibGVzIGluX3BvcyBhbmQgb3V0X3BvcyBhcmUgbW9kaWZpZWQgYnkgdGhlIFhaIGNvZGUuCisgKi8KK3N0cnVjdCB4el9idWYgeworICBjb25zdCB1aW50OF90ICppbjsKKyAgc2l6ZV90IGluX3BvczsKKyAgc2l6ZV90IGluX3NpemU7CisKKyAgdWludDhfdCAqb3V0OworICBzaXplX3Qgb3V0X3BvczsKKyAgc2l6ZV90IG91dF9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgeHpfZGVjIC0gT3BhcXVlIHR5cGUgdG8gaG9sZCB0aGUgWFogZGVjb2RlciBzdGF0ZQorICovCitzdHJ1Y3QgeHpfZGVjOworCisvKioKKyAqIHh6X2RlY19pbml0KCkgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFhaIGRlY29kZXIgc3RhdGUKKyAqIEBtb2RlOiAgICAgICBPcGVyYXRpb24gbW9kZQorICogQGRpY3RfbWF4OiAgIE1heGltdW0gc2l6ZSBvZiB0aGUgTFpNQTIgZGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpIGZvcgorICogICAgICAgICAgICAgIG11bHRpLWNhbGwgZGVjb2RpbmcuIExaTUEyIGRpY3Rpb25hcnkgaXMgYWx3YXlzIDJebiBieXRlcworICogICAgICAgICAgICAgIG9yIDJebiArIDJeKG4tMSkgYnl0ZXMgKHRoZSBsYXR0ZXIgc2l6ZXMgYXJlIGxlc3MgY29tbW9uCisgKiAgICAgICAgICAgICAgaW4gcHJhY3RpY2UpLCBzbyBvdGhlciB2YWx1ZXMgZm9yIGRpY3RfbWF4IGRvbid0IG1ha2Ugc2Vuc2UuCisgKiAgICAgICAgICAgICAgSW4gdGhlIGtlcm5lbCwgZGljdGlvbmFyeSBzaXplcyBvZiA2NCBLaUIsIDEyOCBLaUIsIDI1NiBLaUIsCisgKiAgICAgICAgICAgICAgNTEyIEtpQiwgYW5kIDEgTWlCIGFyZSBwcm9iYWJseSB0aGUgb25seSByZWFzb25hYmxlIHZhbHVlcywKKyAqICAgICAgICAgICAgICBleGNlcHQgZm9yIGtlcm5lbCBhbmQgaW5pdHJhbWZzIGltYWdlcyB3aGVyZSBhIGJpZ2dlcgorICogICAgICAgICAgICAgIGRpY3Rpb25hcnkgY2FuIGJlIGZpbmUgYW5kIHVzZWZ1bC4KKyAqCisgKiBkaWN0X21heCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYWxsb3dlZCBkaWN0aW9uYXJ5IHNpemUgdGhhdCB4el9kZWNfcnVuKCkKKyAqIG1heSBhbGxvY2F0ZSBvbmNlIGl0IGhhcyBwYXJzZWQgdGhlIGRpY3Rpb25hcnkgc2l6ZSBmcm9tIHRoZSBzdHJlYW0KKyAqIGhlYWRlcnMuIFRoaXMgd2F5IGV4Y2Vzc2l2ZSBhbGxvY2F0aW9ucyBjYW4gYmUgYXZvaWRlZCB3aGlsZSBzdGlsbAorICogbGltaXRpbmcgdGhlIG1heGltdW0gbWVtb3J5IHVzYWdlIHRvIGEgc2FuZSB2YWx1ZSB0byBwcmV2ZW50IHJ1bm5pbmcgdGhlCisgKiBzeXN0ZW0gb3V0IG9mIG1lbW9yeSB3aGVuIGRlY29tcHJlc3Npbmcgc3RyZWFtcyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHh6X2RlY19pbml0KCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gc3RydWN0IHh6X2RlYywgd2hpY2ggaXMKKyAqIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB4el9kZWNfcnVuKCkuIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLAorICogeHpfZGVjX2luaXQoKSByZXR1cm5zIE5VTEwuCisgKi8KK3N0cnVjdCB4el9kZWMgKnh6X2RlY19pbml0KHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoqCisgKiB4el9kZWNfcnVuKCkgLSBSdW4gdGhlIFhaIGRlY29kZXIKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpCisgKiBAYjogICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKgorICogVGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZGVwZW5kIG9uIGJ1aWxkIG9wdGlvbnMgYW5kIG9wZXJhdGlvbiBtb2RlLgorICogU2VlIGVudW0geHpfcmV0IGZvciBkZXRhaWxzLgorICoKKyAqIE5vdGUgdGhhdCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gc2luZ2xlLWNhbGwgbW9kZSAocmV0dXJuIHZhbHVlIGlzIG5vdAorICogWFpfU1RSRUFNX0VORCksIGItPmluX3BvcyBhbmQgYi0+b3V0X3BvcyBhcmUgbm90IG1vZGlmaWVkIGFuZCB0aGUKKyAqIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gYi0+b3V0W2ItPm91dF9wb3NdIG9ud2FyZCBhcmUKKyAqIHVuZGVmaW5lZC4gVGhpcyBpcyB0cnVlIGV2ZW4gYWZ0ZXIgWFpfQlVGX0VSUk9SLCBiZWNhdXNlIHdpdGggc29tZSBmaWx0ZXIKKyAqIGNoYWlucywgdGhlcmUgbWF5IGJlIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIHRoaXMgcGFzcworICogY2Fubm90IGJlIHByb3Blcmx5IGRvbmUgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgdHJ1bmNhdGVkLiBUaHVzLCB5b3UKKyAqIGNhbm5vdCBnaXZlIHRoZSBzaW5nbGUtY2FsbCBkZWNvZGVyIGEgdG9vIHNtYWxsIGJ1ZmZlciBhbmQgdGhlbiBleHBlY3QgdG8KKyAqIGdldCB0aGF0IGFtb3VudCB2YWxpZCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiBZb3UgbXVzdCB1c2UKKyAqIHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgaWYgeW91IGRvbid0IHdhbnQgdG8gdW5jb21wcmVzcyB0aGUgd2hvbGUgc3RyZWFtLgorICovCitlbnVtIHh6X3JldCB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpOworCisvKioKKyAqIHh6X2RlY19yZXNldCgpIC0gUmVzZXQgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgZGVjb2RlciBzdGF0ZQorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgc3RhdGUgd2l0aG91dAorICogZnJlZWluZyBhbmQgcmVhbGxvY2F0aW5nIG1lbW9yeSB3aXRoIHh6X2RlY19lbmQoKSBhbmQgeHpfZGVjX2luaXQoKS4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCB4el9kZWNfcmVzZXQoKSBpcyBhbHdheXMgY2FsbGVkIGluIHRoZSBiZWdpbm5pbmcgb2YKKyAqIHh6X2RlY19ydW4oKS4gVGh1cywgZXhwbGljaXQgY2FsbCB0byB4el9kZWNfcmVzZXQoKSBpcyB1c2VmdWwgb25seSBpbgorICogbXVsdGktY2FsbCBtb2RlLgorICovCit2b2lkIHh6X2RlY19yZXNldChzdHJ1Y3QgeHpfZGVjICpzKTsKKworLyoqCisgKiB4el9kZWNfZW5kKCkgLSBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZGVjb2RlciBzdGF0ZQorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkuIElmIHMgaXMgTlVMTCwKKyAqICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4KKyAqLwordm9pZCB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpOworCisvKgorICogVXBkYXRlIENSQzMyIHZhbHVlIHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gSUVFRS04MDIuMy4gVG8gc3RhcnQgYSBuZXcKKyAqIGNhbGN1bGF0aW9uLCB0aGUgdGhpcmQgYXJndW1lbnQgbXVzdCBiZSB6ZXJvLiBUbyBjb250aW51ZSB0aGUgY2FsY3VsYXRpb24sCisgKiB0aGUgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LgorICovCitzdGF0aWMgdWludDMyX3QgeHpfY3JjMzJfdGFibGVbMjU2XTsKKwordWludDMyX3QgeHpfY3JjMzIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgY3JjKQoreworICBjcmMgPSB+Y3JjOworCisgIHdoaWxlIChzaXplICE9IDApIHsKKyAgICBjcmMgPSB4el9jcmMzMl90YWJsZVsqYnVmKysgXiAoY3JjICYgMHhGRildIF4gKGNyYyA+PiA4KTsKKyAgICAtLXNpemU7CisgIH0KKworICByZXR1cm4gfmNyYzsKK30KKworc3RhdGljIHVpbnQ2NF90IHh6X2NyYzY0X3RhYmxlWzI1Nl07CisKKworLy8gRU5EIHh6LmgKKworc3RhdGljIHVpbnQ4X3QgaW5bQlVGU0laXTsKK3N0YXRpYyB1aW50OF90IG91dFtCVUZTSVpdOworCit2b2lkIGRvX3h6Y2F0KGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgc3RydWN0IHh6X2J1ZiBiOworICBzdHJ1Y3QgeHpfZGVjICpzOworICBlbnVtIHh6X3JldCByZXQ7CisgIGNvbnN0IGNoYXIgKm1zZzsKKworICBjcmNfaW5pdCh4el9jcmMzMl90YWJsZSwgMSk7CisgIGNvbnN0IHVpbnQ2NF90IHBvbHkgPSAweEM5NkM1Nzk1RDc4NzBGNDJVTEw7CisgIHVpbnQzMl90IGk7CisgIHVpbnQzMl90IGo7CisgIHVpbnQ2NF90IHI7CisKKyAgLyogaW5pdGlhbGl6ZSBDUkM2NCB0YWJsZSovCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIHIgPSBpOworICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opCisgICAgICByID0gKHIgPj4gMSkgXiAocG9seSAmIH4oKHIgJiAxKSAtIDEpKTsKKworICAgIHh6X2NyYzY0X3RhYmxlW2ldID0gcjsKKyAgfQorCisgIC8qCisgICAqIFN1cHBvcnQgdXAgdG8gNjQgTWlCIGRpY3Rpb25hcnkuIFRoZSBhY3R1YWxseSBuZWVkZWQgbWVtb3J5CisgICAqIGlzIGFsbG9jYXRlZCBvbmNlIHRoZSBoZWFkZXJzIGhhdmUgYmVlbiBwYXJzZWQuCisgICAqLworICBzID0geHpfZGVjX2luaXQoMSA8PCAyNik7CisgIGlmIChzID09IE5VTEwpIHsKKyAgICBtc2cgPSAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBiLmluID0gaW47CisgIGIuaW5fcG9zID0gMDsKKyAgYi5pbl9zaXplID0gMDsKKyAgYi5vdXQgPSBvdXQ7CisgIGIub3V0X3BvcyA9IDA7CisgIGIub3V0X3NpemUgPSBCVUZTSVo7CisKKyAgZm9yICg7OykgeworICAgIGlmIChiLmluX3BvcyA9PSBiLmluX3NpemUpIHsKKyAgICAgIGIuaW5fc2l6ZSA9IHJlYWQoZmQsIGluLCBzaXplb2YoaW4pKTsKKyAgICAgIGIuaW5fcG9zID0gMDsKKyAgICB9CisKKyAgICByZXQgPSB4el9kZWNfcnVuKHMsICZiKTsKKworICAgIGlmIChiLm91dF9wb3MgPT0gc2l6ZW9mKG91dCkpIHsKKyAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBiLm91dF9wb3MsIHN0ZG91dCkgIT0gYi5vdXRfcG9zKSB7CisgICAgICAgIG1zZyA9ICJXcml0ZSBlcnJvclxuIjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKworICAgICAgYi5vdXRfcG9zID0gMDsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IFhaX09LKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAocmV0ID09IFhaX1VOU1VQUE9SVEVEX0NIRUNLKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZndyaXRlKG91dCwgMSwgYi5vdXRfcG9zLCBzdGRvdXQpICE9IGIub3V0X3BvcykgeworICAgICAgbXNnID0gIldyaXRlIGVycm9yXG4iOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJldCkgeworICAgIGNhc2UgWFpfU1RSRUFNX0VORDoKKyAgICAgIHh6X2RlY19lbmQocyk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIFhaX01FTV9FUlJPUjoKKyAgICAgIG1zZyA9ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiI7CisgICAgICBnb3RvIGVycm9yOworCisgICAgY2FzZSBYWl9NRU1MSU1JVF9FUlJPUjoKKyAgICAgIG1zZyA9ICJNZW1vcnkgdXNhZ2UgbGltaXQgcmVhY2hlZFxuIjsKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjYXNlIFhaX0ZPUk1BVF9FUlJPUjoKKyAgICAgIG1zZyA9ICJOb3QgYSAueHogZmlsZVxuIjsKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjYXNlIFhaX09QVElPTlNfRVJST1I6CisgICAgICBtc2cgPSAiVW5zdXBwb3J0ZWQgb3B0aW9ucyBpbiB0aGUgLnh6IGhlYWRlcnNcbiI7CisgICAgICBnb3RvIGVycm9yOworCisgICAgY2FzZSBYWl9EQVRBX0VSUk9SOgorICAgIGNhc2UgWFpfQlVGX0VSUk9SOgorICAgICAgbXNnID0gIkZpbGUgaXMgY29ycnVwdFxuIjsKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBkZWZhdWx0OgorICAgICAgbXNnID0gIkJ1ZyFcbiI7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgfQorCitlcnJvcjoKKyAgeHpfZGVjX2VuZChzKTsKKyAgZXJyb3JfZXhpdCgiJXMiLCBtc2cpOworfQorCit2b2lkIHh6Y2F0X21haW4odm9pZCkKK3sKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9feHpjYXQpOworfQorCisvLyBCRUdJTiB4el9wcml2YXRlLmgKKworCisvKiBVbmNvbW1lbnQgYXMgbmVlZGVkIHRvIGVuYWJsZSBCQ0ogZmlsdGVyIGRlY29kZXJzLiAKKyAqIFRoZXNlIGNvc3QgYWJvdXQgMi41IGsgd2hlbiBhbGwgYXJlIGVuYWJsZWQ7IFNQQVJDIGFuZCBJQTY0IG1ha2UgMC43IGsKKyAqICovCisKKyNkZWZpbmUgWFpfREVDX1g4NgorI2RlZmluZSBYWl9ERUNfUE9XRVJQQworI2RlZmluZSBYWl9ERUNfSUE2NAorI2RlZmluZSBYWl9ERUNfQVJNCisjZGVmaW5lIFhaX0RFQ19BUk1USFVNQgorI2RlZmluZSBYWl9ERUNfU1BBUkMKKworCisjZGVmaW5lIG1lbWVxKGEsIGIsIHNpemUpIChtZW1jbXAoYSwgYiwgc2l6ZSkgPT0gMCkKKworI2lmbmRlZiBtaW4KKyMJZGVmaW5lIG1pbih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorI2VuZGlmCisjZGVmaW5lIG1pbl90KHR5cGUsIHgsIHkpIG1pbih4LCB5KQorCisKKy8qIElubGluZSBmdW5jdGlvbnMgdG8gYWNjZXNzIHVuYWxpZ25lZCB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgKi8KKyNpZm5kZWYgZ2V0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF91bmFsaWduZWRfbGUzMihjb25zdCB1aW50OF90ICpidWYpCit7CisgIHJldHVybiAodWludDMyX3QpYnVmWzBdCisgICAgICB8ICgodWludDMyX3QpYnVmWzFdIDw8IDgpCisgICAgICB8ICgodWludDMyX3QpYnVmWzJdIDw8IDE2KQorICAgICAgfCAoKHVpbnQzMl90KWJ1ZlszXSA8PCAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBnZXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0X3VuYWxpZ25lZF9iZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoYnVmWzBdIDw8IDI0KQorICAgICAgfCAoKHVpbnQzMl90KWJ1ZlsxXSA8PCAxNikKKyAgICAgIHwgKCh1aW50MzJfdClidWZbMl0gPDwgOCkKKyAgICAgIHwgKHVpbnQzMl90KWJ1ZlszXTsKK30KKyNlbmRpZgorCisjaWZuZGVmIHB1dF91bmFsaWduZWRfbGUzMgorc3RhdGljIGlubGluZSB2b2lkIHB1dF91bmFsaWduZWRfbGUzMih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgYnVmWzBdID0gKHVpbnQ4X3QpdmFsOworICBidWZbMV0gPSAodWludDhfdCkodmFsID4+IDgpOworICBidWZbMl0gPSAodWludDhfdCkodmFsID4+IDE2KTsKKyAgYnVmWzNdID0gKHVpbnQ4X3QpKHZhbCA+PiAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBwdXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdW5hbGlnbmVkX2JlMzIodWludDMyX3QgdmFsLCB1aW50OF90ICpidWYpCit7CisgIGJ1ZlswXSA9ICh1aW50OF90KSh2YWwgPj4gMjQpOworICBidWZbMV0gPSAodWludDhfdCkodmFsID4+IDE2KTsKKyAgYnVmWzJdID0gKHVpbnQ4X3QpKHZhbCA+PiA4KTsKKyAgYnVmWzNdID0gKHVpbnQ4X3QpdmFsOworfQorI2VuZGlmCisKKy8qCisgKiBVc2UgZ2V0X3VuYWxpZ25lZF9sZTMyKCkgYWxzbyBmb3IgYWxpZ25lZCBhY2Nlc3MgZm9yIHNpbXBsaWNpdHkuIE9uCisgKiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMsICNkZWZpbmUgZ2V0X2xlMzIocHRyKSAoKihjb25zdCB1aW50MzJfdCAqKShwdHIpKQorICogY291bGQgc2F2ZSBhIGZldyBieXRlcyBpbiBjb2RlIHNpemUuCisgKi8KKyNpZm5kZWYgZ2V0X2xlMzIKKyMJZGVmaW5lIGdldF9sZTMyIGdldF91bmFsaWduZWRfbGUzMgorI2VuZGlmCisKKy8qCisgKiBJZiBhbnkgb2YgdGhlIEJDSiBmaWx0ZXIgZGVjb2RlcnMgYXJlIHdhbnRlZCwgZGVmaW5lIFhaX0RFQ19CQ0ouCisgKiBYWl9ERUNfQkNKIGlzIHVzZWQgdG8gZW5hYmxlIGdlbmVyaWMgc3VwcG9ydCBmb3IgQkNKIGRlY29kZXJzLgorICovCisjaWZuZGVmIFhaX0RFQ19CQ0oKKyMJaWYgZGVmaW5lZChYWl9ERUNfWDg2KSB8fCBkZWZpbmVkKFhaX0RFQ19QT1dFUlBDKSBcCisgICAgICB8fCBkZWZpbmVkKFhaX0RFQ19JQTY0KSB8fCBkZWZpbmVkKFhaX0RFQ19BUk0pIFwKKyAgICAgIHx8IGRlZmluZWQoWFpfREVDX0FSTSkgfHwgZGVmaW5lZChYWl9ERUNfQVJNVEhVTUIpIFwKKyAgICAgIHx8IGRlZmluZWQoWFpfREVDX1NQQVJDKQorIwkJZGVmaW5lIFhaX0RFQ19CQ0oKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBMWk1BMiBkZWNvZGVyLiB4el9kZWNfbHptYTJfcmVzZXQoKSBtdXN0IGJlIHVzZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHh6X2RlY19sem1hMl9ydW4oKS4KKyAqLworc3RydWN0IHh6X2RlY19sem1hMiAqeHpfZGVjX2x6bWEyX2NyZWF0ZSh1aW50MzJfdCBkaWN0X21heCk7CisKKy8qCisgKiBEZWNvZGUgdGhlIExaTUEyIHByb3BlcnRpZXMgKG9uZSBieXRlKSBhbmQgcmVzZXQgdGhlIGRlY29kZXIuIFJldHVybgorICogWFpfT0sgb24gc3VjY2VzcywgWFpfTUVNTElNSVRfRVJST1IgaWYgdGhlIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IGlzIG5vdAorICogYmlnIGVub3VnaCwgYW5kIFhaX09QVElPTlNfRVJST1IgaWYgcHJvcHMgaW5kaWNhdGVzIHNvbWV0aGluZyB0aGF0IHRoaXMKKyAqIGRlY29kZXIgZG9lc24ndCBzdXBwb3J0LgorICovCitlbnVtIHh6X3JldCB4el9kZWNfbHptYTJfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcywKKyAgICAgICAgICAgdWludDhfdCBwcm9wcyk7CisKKy8qIERlY29kZSByYXcgTFpNQTIgc3RyZWFtIGZyb20gYi0+aW4gdG8gYi0+b3V0LiAqLworZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3J1bihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLAorICAgICAgICAgICAgICAgc3RydWN0IHh6X2J1ZiAqYik7CisKKy8vIEVORCAieHpfcHJpdmF0ZS5oIgorCisKKworCisvKgorICogQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXIgZGVjb2RlcnMKKyAqIFRoZSByZXN0IG9mIHRoZSBjb2RlIGlzIGluc2lkZSB0aGlzIGlmZGVmLiBJdCBtYWtlcyB0aGluZ3MgYSBsaXR0bGUgbW9yZQorICogY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc3VwcG9ydCBmb3IgYW55IEJDSiBmaWx0ZXJzLgorICovCisjaWZkZWYgWFpfREVDX0JDSgorCitzdHJ1Y3QgeHpfZGVjX2JjaiB7CisgIC8qIFR5cGUgb2YgdGhlIEJDSiBmaWx0ZXIgYmVpbmcgdXNlZCAqLworICBlbnVtIHsKKyAgICBCQ0pfWDg2ID0gNCwgICAgICAgIC8qIHg4NiBvciB4ODYtNjQgKi8KKyAgICBCQ0pfUE9XRVJQQyA9IDUsICAgIC8qIEJpZyBlbmRpYW4gb25seSAqLworICAgIEJDSl9JQTY0ID0gNiwgICAgICAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gKi8KKyAgICBCQ0pfQVJNID0gNywgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworICAgIEJDSl9BUk1USFVNQiA9IDgsICAgLyogTGl0dGxlIGVuZGlhbiBvbmx5ICovCisgICAgQkNKX1NQQVJDID0gOSAgICAgICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiAqLworICB9IHR5cGU7CisKKyAgLyoKKyAgICogUmV0dXJuIHZhbHVlIG9mIHRoZSBuZXh0IGZpbHRlciBpbiB0aGUgY2hhaW4uIFdlIG5lZWQgdG8gcHJlc2VydmUKKyAgICogdGhpcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMsIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2FsbCB0aGUgbmV4dAorICAgKiBmaWx0ZXIgYW55bW9yZSBvbmNlIGl0IGhhcyByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorICAgKi8KKyAgZW51bSB4el9yZXQgcmV0OworCisgIC8qCisgICAqIEFic29sdXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZAorICAgKiBkYXRhIChpbiBhIHNpbmdsZSAueHogQmxvY2spLiBXZSBjYXJlIG9ubHkgYWJvdXQgdGhlIGxvd2VzdCAzMgorICAgKiBiaXRzIHNvIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHVpbnQ2NF90IGV2ZW4gd2l0aCBiaWcgZmlsZXMuCisgICAqLworICB1aW50MzJfdCBwb3M7CisKKyAgLyogeDg2IGZpbHRlciBzdGF0ZSAqLworICB1aW50MzJfdCB4ODZfcHJldl9tYXNrOworCisgIC8qIFRlbXBvcmFyeSBzcGFjZSB0byBob2xkIHRoZSB2YXJpYWJsZXMgZnJvbSBzdHJ1Y3QgeHpfYnVmICovCisgIHVpbnQ4X3QgKm91dDsKKyAgc2l6ZV90IG91dF9wb3M7CisgIHNpemVfdCBvdXRfc2l6ZTsKKworICBzdHJ1Y3QgeworICAgIC8qIEFtb3VudCBvZiBhbHJlYWR5IGZpbHRlcmVkIGRhdGEgaW4gdGhlIGJlZ2lubmluZyBvZiBidWYgKi8KKyAgICBzaXplX3QgZmlsdGVyZWQ7CisKKyAgICAvKiBUb3RhbCBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgc3RvcmVkIGluIGJ1ZiAgKi8KKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIC8qCisgICAgICogQnVmZmVyIHRvIGhvbGQgYSBtaXggb2YgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQgZGF0YS4gVGhpcworICAgICAqIG5lZWRzIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBBbGlnbm1lbnQgKyAyICogTG9vay1haGVhZDoKKyAgICAgKgorICAgICAqIFR5cGUgICAgICAgICBBbGlnbm1lbnQgICBMb29rLWFoZWFkCisgICAgICogeDg2ICAgICAgICAgICAgICAxICAgICAgICAgICA0CisgICAgICogUG93ZXJQQyAgICAgICAgICA0ICAgICAgICAgICAwCisgICAgICogSUEtNjQgICAgICAgICAgIDE2ICAgICAgICAgICAwCisgICAgICogQVJNICAgICAgICAgICAgICA0ICAgICAgICAgICAwCisgICAgICogQVJNLVRodW1iICAgICAgICAyICAgICAgICAgICAyCisgICAgICogU1BBUkMgICAgICAgICAgICA0ICAgICAgICAgICAwCisgICAgICovCisgICAgdWludDhfdCBidWZbMTZdOworICB9IHRlbXA7Cit9OworCisvKgorICogRGVjb2RlIHRoZSBGaWx0ZXIgSUQgb2YgYSBCQ0ogZmlsdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAqIHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldHMsIHNvIG5vIGRlY29kaW5nIG9mIEZpbHRlciBQcm9wZXJ0aWVzCisgKiBpcyBuZWVkZWQuIFJldHVybnMgWFpfT0sgaWYgdGhlIGdpdmVuIEZpbHRlciBJRCBpcyBzdXBwb3J0ZWQuCisgKiBPdGhlcndpc2UgWFpfT1BUSU9OU19FUlJPUiBpcyByZXR1cm5lZC4KKyAqLworZW51bSB4el9yZXQgeHpfZGVjX2Jjal9yZXNldChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCBpZCk7CisKKy8qCisgKiBEZWNvZGUgcmF3IEJDSiArIExaTUEyIHN0cmVhbS4gVGhpcyBtdXN0IGJlIHVzZWQgb25seSBpZiB0aGVyZSBhY3R1YWxseSBpcworICogYSBCQ0ogZmlsdGVyIGluIHRoZSBjaGFpbi4gSWYgdGhlIGNoYWluIGhhcyBvbmx5IExaTUEyLCB4el9kZWNfbHptYTJfcnVuKCkKKyAqIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5LgorICovCitlbnVtIHh6X3JldCB4el9kZWNfYmNqX3J1bihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKyAgICAgICAgICAgICBzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMiwKKyAgICAgICAgICAgICBzdHJ1Y3QgeHpfYnVmICpiKTsKKworI2lmZGVmIFhaX0RFQ19YODYKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gdGVzdCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIG9mIGEgbWVtb3J5IGFkZHJlc3MKKyAqIGluIGFuIHg4NiBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYmNqX3g4Nl90ZXN0X21zYnl0ZSh1aW50OF90IGIpCit7CisgIHJldHVybiBiID09IDB4MDAgfHwgYiA9PSAweEZGOworfQorCitzdGF0aWMgc2l6ZV90IGJjal94ODYoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgIHN0YXRpYyBjb25zdCBpbnQgbWFza190b19hbGxvd2VkX3N0YXR1c1s4XQorICAgID0geyAxLDEsMSwwLDEsMCwwLDAgfTsKKworICBzdGF0aWMgY29uc3QgdWludDhfdCBtYXNrX3RvX2JpdF9udW1bOF0gPSB7IDAsIDEsIDIsIDIsIDMsIDMsIDMsIDMgfTsKKworICBzaXplX3QgaTsKKyAgc2l6ZV90IHByZXZfcG9zID0gKHNpemVfdCktMTsKKyAgdWludDMyX3QgcHJldl9tYXNrID0gcy0+eDg2X3ByZXZfbWFzazsKKyAgdWludDMyX3Qgc3JjOworICB1aW50MzJfdCBkZXN0OworICB1aW50MzJfdCBqOworICB1aW50OF90IGI7CisKKyAgaWYgKHNpemUgPD0gNCkKKyAgICByZXR1cm4gMDsKKworICBzaXplIC09IDQ7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBpZiAoKGJ1ZltpXSAmIDB4RkUpICE9IDB4RTgpCisgICAgICBjb250aW51ZTsKKworICAgIHByZXZfcG9zID0gaSAtIHByZXZfcG9zOworICAgIGlmIChwcmV2X3BvcyA+IDMpIHsKKyAgICAgIHByZXZfbWFzayA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSkpICYgNzsKKyAgICAgIGlmIChwcmV2X21hc2sgIT0gMCkgeworICAgICAgICBiID0gYnVmW2kgKyA0IC0gbWFza190b19iaXRfbnVtW3ByZXZfbWFza11dOworICAgICAgICBpZiAoIW1hc2tfdG9fYWxsb3dlZF9zdGF0dXNbcHJldl9tYXNrXQorICAgICAgICAgICAgfHwgYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSkgeworICAgICAgICAgIHByZXZfcG9zID0gaTsKKyAgICAgICAgICBwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByZXZfcG9zID0gaTsKKworICAgIGlmIChiY2pfeDg2X3Rlc3RfbXNieXRlKGJ1ZltpICsgNF0pKSB7CisgICAgICBzcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmICsgaSArIDEpOworICAgICAgZm9yICg7OykgeworICAgICAgICBkZXN0ID0gc3JjIC0gKHMtPnBvcyArICh1aW50MzJfdClpICsgNSk7CisgICAgICAgIGlmIChwcmV2X21hc2sgPT0gMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBqID0gbWFza190b19iaXRfbnVtW3ByZXZfbWFza10gKiA4OworICAgICAgICBiID0gKHVpbnQ4X3QpKGRlc3QgPj4gKDI0IC0gaikpOworICAgICAgICBpZiAoIWJjal94ODZfdGVzdF9tc2J5dGUoYikpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3JjID0gZGVzdCBeICgoKHVpbnQzMl90KTEgPDwgKDMyIC0gaikpIC0gMSk7CisgICAgICB9CisKKyAgICAgIGRlc3QgJj0gMHgwMUZGRkZGRjsKKyAgICAgIGRlc3QgfD0gKHVpbnQzMl90KTAgLSAoZGVzdCAmIDB4MDEwMDAwMDApOworICAgICAgcHV0X3VuYWxpZ25lZF9sZTMyKGRlc3QsIGJ1ZiArIGkgKyAxKTsKKyAgICAgIGkgKz0gNDsKKyAgICB9IGVsc2UgeworICAgICAgcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAxKSB8IDE7CisgICAgfQorICB9CisKKyAgcHJldl9wb3MgPSBpIC0gcHJldl9wb3M7CisgIHMtPng4Nl9wcmV2X21hc2sgPSBwcmV2X3BvcyA+IDMgPyAwIDogcHJldl9tYXNrIDw8IChwcmV2X3BvcyAtIDEpOworICByZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKK3N0YXRpYyBzaXplX3QgYmNqX3Bvd2VycGMoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgIHNpemVfdCBpOworICB1aW50MzJfdCBpbnN0cjsKKworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKyAgICBpbnN0ciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyBpKTsKKyAgICBpZiAoKGluc3RyICYgMHhGQzAwMDAwMykgPT0gMHg0ODAwMDAwMSkgeworICAgICAgaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKyAgICAgIGluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworICAgICAgaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKyAgICAgIGluc3RyIHw9IDB4NDgwMDAwMDE7CisgICAgICBwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfSUE2NAorc3RhdGljIHNpemVfdCBiY2pfaWE2NChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnJhbmNoX3RhYmxlWzMyXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgNCwgNCwgNiwgNiwgMCwgMCwgNywgNywKKyAgICA0LCA0LCAwLCAwLCA0LCA0LCAwLCAwCisgIH07CisKKyAgLyoKKyAgICogVGhlIGxvY2FsIHZhcmlhYmxlcyB0YWtlIGEgbGl0dGxlIGJpdCBzdGFjayBzcGFjZSwgYnV0IGl0J3MgbGVzcworICAgKiB0aGFuIHdoYXQgTFpNQTIgZGVjb2RlciB0YWtlcywgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlZHVjZQorICAgKiBzdGFjayB1c2FnZSBoZXJlIHdpdGhvdXQgZG9pbmcgdGhhdCBmb3IgdGhlIExaTUEyIGRlY29kZXIgdG9vLgorICAgKi8KKworICAvKiBMb29wIGNvdW50ZXJzICovCisgIHNpemVfdCBpOworICBzaXplX3QgajsKKworICAvKiBJbnN0cnVjdGlvbiBzbG90ICgwLCAxLCBvciAyKSBpbiB0aGUgMTI4LWJpdCBpbnN0cnVjdGlvbiB3b3JkICovCisgIHVpbnQzMl90IHNsb3Q7CisKKyAgLyogQml0d2lzZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIGluZGljYXRlZCBieSBzbG90ICovCisgIHVpbnQzMl90IGJpdF9wb3M7CisKKyAgLyogYml0X3BvcyBzcGxpdCBpbnRvIGJ5dGUgYW5kIGJpdCBwYXJ0cyAqLworICB1aW50MzJfdCBieXRlX3BvczsKKyAgdWludDMyX3QgYml0X3JlczsKKworICAvKiBBZGRyZXNzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKyAgdWludDMyX3QgYWRkcjsKKworICAvKiBNYXNrIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIGluc3RydWN0aW9ucyB0byBjb252ZXJ0ICovCisgIHVpbnQzMl90IG1hc2s7CisKKyAgLyogNDEtYml0IGluc3RydWN0aW9uIHN0b3JlZCBzb21ld2hlcmUgaW4gdGhlIGxvd2VzdCA0OCBiaXRzICovCisgIHVpbnQ2NF90IGluc3RyOworCisgIC8qIEluc3RydWN0aW9uIG5vcm1hbGl6ZWQgd2l0aCBiaXRfcmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uICovCisgIHVpbnQ2NF90IG5vcm07CisKKyAgZm9yIChpID0gMDsgaSArIDE2IDw9IHNpemU7IGkgKz0gMTYpIHsKKyAgICBtYXNrID0gYnJhbmNoX3RhYmxlW2J1ZltpXSAmIDB4MUZdOworICAgIGZvciAoc2xvdCA9IDAsIGJpdF9wb3MgPSA1OyBzbG90IDwgMzsgKytzbG90LCBiaXRfcG9zICs9IDQxKSB7CisgICAgICBpZiAoKChtYXNrID4+IHNsb3QpICYgMSkgPT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGJ5dGVfcG9zID0gYml0X3BvcyA+PiAzOworICAgICAgYml0X3JlcyA9IGJpdF9wb3MgJiA3OworICAgICAgaW5zdHIgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IDY7ICsraikKKyAgICAgICAgaW5zdHIgfD0gKHVpbnQ2NF90KShidWZbaSArIGogKyBieXRlX3Bvc10pCisgICAgICAgICAgICA8PCAoOCAqIGopOworCisgICAgICBub3JtID0gaW5zdHIgPj4gYml0X3JlczsKKworICAgICAgaWYgKCgobm9ybSA+PiAzNykgJiAweDBGKSA9PSAweDA1CisgICAgICAgICAgJiYgKChub3JtID4+IDkpICYgMHgwNykgPT0gMCkgeworICAgICAgICBhZGRyID0gKG5vcm0gPj4gMTMpICYgMHgwRkZGRkY7CisgICAgICAgIGFkZHIgfD0gKCh1aW50MzJfdCkobm9ybSA+PiAzNikgJiAxKSA8PCAyMDsKKyAgICAgICAgYWRkciA8PD0gNDsKKyAgICAgICAgYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKyAgICAgICAgYWRkciA+Pj0gNDsKKworICAgICAgICBub3JtICY9IH4oKHVpbnQ2NF90KTB4OEZGRkZGIDw8IDEzKTsKKyAgICAgICAgbm9ybSB8PSAodWludDY0X3QpKGFkZHIgJiAweDBGRkZGRikgPDwgMTM7CisgICAgICAgIG5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgxMDAwMDApCisgICAgICAgICAgICA8PCAoMzYgLSAyMCk7CisKKyAgICAgICAgaW5zdHIgJj0gKDEgPDwgYml0X3JlcykgLSAxOworICAgICAgICBpbnN0ciB8PSBub3JtIDw8IGJpdF9yZXM7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykKKyAgICAgICAgICBidWZbaSArIGogKyBieXRlX3Bvc10KKyAgICAgICAgICAgID0gKHVpbnQ4X3QpKGluc3RyID4+ICg4ICogaikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNCitzdGF0aWMgc2l6ZV90IGJjal9hcm0oc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgIHNpemVfdCBpOworICB1aW50MzJfdCBhZGRyOworCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworICAgIGlmIChidWZbaSArIDNdID09IDB4RUIpIHsKKyAgICAgIGFkZHIgPSAodWludDMyX3QpYnVmW2ldIHwgKCh1aW50MzJfdClidWZbaSArIDFdIDw8IDgpCisgICAgICAgICAgfCAoKHVpbnQzMl90KWJ1ZltpICsgMl0gPDwgMTYpOworICAgICAgYWRkciA8PD0gMjsKKyAgICAgIGFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWkgKyA4OworICAgICAgYWRkciA+Pj0gMjsKKyAgICAgIGJ1ZltpXSA9ICh1aW50OF90KWFkZHI7CisgICAgICBidWZbaSArIDFdID0gKHVpbnQ4X3QpKGFkZHIgPj4gOCk7CisgICAgICBidWZbaSArIDJdID0gKHVpbnQ4X3QpKGFkZHIgPj4gMTYpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKK3N0YXRpYyBzaXplX3QgYmNqX2FybXRodW1iKHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworICBzaXplX3QgaTsKKyAgdWludDMyX3QgYWRkcjsKKworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDIpIHsKKyAgICBpZiAoKGJ1ZltpICsgMV0gJiAweEY4KSA9PSAweEYwCisgICAgICAgICYmIChidWZbaSArIDNdICYgMHhGOCkgPT0gMHhGOCkgeworICAgICAgYWRkciA9ICgoKHVpbnQzMl90KWJ1ZltpICsgMV0gJiAweDA3KSA8PCAxOSkKKyAgICAgICAgICB8ICgodWludDMyX3QpYnVmW2ldIDw8IDExKQorICAgICAgICAgIHwgKCgodWludDMyX3QpYnVmW2kgKyAzXSAmIDB4MDcpIDw8IDgpCisgICAgICAgICAgfCAodWludDMyX3QpYnVmW2kgKyAyXTsKKyAgICAgIGFkZHIgPDw9IDE7CisgICAgICBhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpICsgNDsKKyAgICAgIGFkZHIgPj49IDE7CisgICAgICBidWZbaSArIDFdID0gKHVpbnQ4X3QpKDB4RjAgfCAoKGFkZHIgPj4gMTkpICYgMHgwNykpOworICAgICAgYnVmW2ldID0gKHVpbnQ4X3QpKGFkZHIgPj4gMTEpOworICAgICAgYnVmW2kgKyAzXSA9ICh1aW50OF90KSgweEY4IHwgKChhZGRyID4+IDgpICYgMHgwNykpOworICAgICAgYnVmW2kgKyAyXSA9ICh1aW50OF90KWFkZHI7CisgICAgICBpICs9IDI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19TUEFSQworc3RhdGljIHNpemVfdCBiY2pfc3BhcmMoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgIHNpemVfdCBpOworICB1aW50MzJfdCBpbnN0cjsKKworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKyAgICBpbnN0ciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyBpKTsKKyAgICBpZiAoKGluc3RyID4+IDIyKSA9PSAweDEwMCB8fCAoaW5zdHIgPj4gMjIpID09IDB4MUZGKSB7CisgICAgICBpbnN0ciA8PD0gMjsKKyAgICAgIGluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworICAgICAgaW5zdHIgPj49IDI7CisgICAgICBpbnN0ciA9ICgodWludDMyX3QpMHg0MDAwMDAwMCAtIChpbnN0ciAmIDB4NDAwMDAwKSkKKyAgICAgICAgICB8IDB4NDAwMDAwMDAgfCAoaW5zdHIgJiAweDNGRkZGRik7CisgICAgICBwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpOworfQorI2VuZGlmCisKKy8qCisgKiBBcHBseSB0aGUgc2VsZWN0ZWQgQkNKIGZpbHRlci4gVXBkYXRlICpwb3MgYW5kIHMtPnBvcyB0byBtYXRjaCB0aGUgYW1vdW50CisgKiBvZiBkYXRhIHRoYXQgZ290IGZpbHRlcmVkLgorICoKKyAqIE5PVEU6IFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBzd2l0Y2ggc3RhdGVtZW50IHRvIGF2b2lkIHVzaW5nIGZ1bmN0aW9uCisgKiBwb2ludGVycywgd2hpY2ggY291bGQgYmUgcHJvYmxlbWF0aWMgaW4gdGhlIGtlcm5lbCBib290IGNvZGUsIHdoaWNoIG11c3QKKyAqIGF2b2lkIHBvaW50ZXJzIHRvIHN0YXRpYyBkYXRhIChhdCBsZWFzdCBvbiB4ODYpLgorICovCitzdGF0aWMgdm9pZCBiY2pfYXBwbHkoc3RydWN0IHh6X2RlY19iY2ogKnMsCisgICAgICAgICAgdWludDhfdCAqYnVmLCBzaXplX3QgKnBvcywgc2l6ZV90IHNpemUpCit7CisgIHNpemVfdCBmaWx0ZXJlZDsKKworICBidWYgKz0gKnBvczsKKyAgc2l6ZSAtPSAqcG9zOworCisgIHN3aXRjaCAocy0+dHlwZSkgeworI2lmZGVmIFhaX0RFQ19YODYKKyAgY2FzZSBCQ0pfWDg2OgorICAgIGZpbHRlcmVkID0gYmNqX3g4NihzLCBidWYsIHNpemUpOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKyAgY2FzZSBCQ0pfUE9XRVJQQzoKKyAgICBmaWx0ZXJlZCA9IGJjal9wb3dlcnBjKHMsIGJ1Ziwgc2l6ZSk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfSUE2NAorICBjYXNlIEJDSl9JQTY0OgorICAgIGZpbHRlcmVkID0gYmNqX2lhNjQocywgYnVmLCBzaXplKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk0KKyAgY2FzZSBCQ0pfQVJNOgorICAgIGZpbHRlcmVkID0gYmNqX2FybShzLCBidWYsIHNpemUpOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisgIGNhc2UgQkNKX0FSTVRIVU1COgorICAgIGZpbHRlcmVkID0gYmNqX2FybXRodW1iKHMsIGJ1Ziwgc2l6ZSk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfU1BBUkMKKyAgY2FzZSBCQ0pfU1BBUkM6CisgICAgZmlsdGVyZWQgPSBiY2pfc3BhcmMocywgYnVmLCBzaXplKTsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIC8qIE5ldmVyIHJlYWNoZWQgYnV0IHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuICovCisgICAgZmlsdGVyZWQgPSAwOworICAgIGJyZWFrOworICB9CisKKyAgKnBvcyArPSBmaWx0ZXJlZDsKKyAgcy0+cG9zICs9IGZpbHRlcmVkOworfQorCisvKgorICogRmx1c2ggcGVuZGluZyBmaWx0ZXJlZCBkYXRhIGZyb20gdGVtcCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqIE1vdmUgdGhlIHJlbWFpbmluZyBtaXh0dXJlIG9mIHBvc3NpYmx5IGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkCisgKiBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGVtcC4KKyAqLworc3RhdGljIHZvaWQgYmNqX2ZsdXNoKHN0cnVjdCB4el9kZWNfYmNqICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworICBzaXplX3QgY29weV9zaXplOworCisgIGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgcy0+dGVtcC5maWx0ZXJlZCwgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zKTsKKyAgbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBjb3B5X3NpemUpOworICBiLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKworICBzLT50ZW1wLmZpbHRlcmVkIC09IGNvcHlfc2l6ZTsKKyAgcy0+dGVtcC5zaXplIC09IGNvcHlfc2l6ZTsKKyAgbWVtbW92ZShzLT50ZW1wLmJ1Ziwgcy0+dGVtcC5idWYgKyBjb3B5X3NpemUsIHMtPnRlbXAuc2l6ZSk7Cit9CisKKy8qCisgKiBUaGUgQkNKIGZpbHRlciBmdW5jdGlvbnMgYXJlIHByaW1pdGl2ZSBpbiBzZW5zZSB0aGF0IHRoZXkgcHJvY2VzcyB0aGUKKyAqIGRhdGEgaW4gY2h1bmtzIG9mIDEtMTYgYnl0ZXMuIFRvIGhpZGUgdGhpcyBpc3N1ZSwgdGhpcyBmdW5jdGlvbiBkb2VzCisgKiBzb21lIGJ1ZmZlcmluZy4KKyAqLworZW51bSB4el9yZXQgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisgICAgICAgICAgICAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsCisgICAgICAgICAgICAgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgc2l6ZV90IG91dF9zdGFydDsKKworICAvKgorICAgKiBGbHVzaCBwZW5kaW5nIGFscmVhZHkgZmlsdGVyZWQgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gUmV0dXJuCisgICAqIGltbWVkaWF0ZWxseSBpZiB3ZSBjb3VsZG4ndCBmbHVzaCBldmVyeXRoaW5nLCBvciBpZiB0aGUgbmV4dAorICAgKiBmaWx0ZXIgaW4gdGhlIGNoYWluIGhhZCBhbHJlYWR5IHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisgICAqLworICBpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApIHsKKyAgICBiY2pfZmx1c2gocywgYik7CisgICAgaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorICAgICAgcmV0dXJuIFhaX09LOworCisgICAgaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorICAgICAgcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisgIH0KKworICAvKgorICAgKiBJZiB3ZSBoYXZlIG1vcmUgb3V0cHV0IHNwYWNlIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgcGVuZGluZyBpbgorICAgKiB0ZW1wLCBjb3B5IHRoZSB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisgICAqIGFuZCB0cnkgdG8gZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciBieSBkZWNvZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUKKyAgICogbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0aGUgbmV3IGRhdGEKKyAgICogaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIGV2ZXJ5dGhpbmcgY2Fubm90IGJlIGZpbHRlcmVkLCBjb3B5IGl0CisgICAqIHRvIHRlbXAgYW5kIHJld2luZCB0aGUgb3V0cHV0IGJ1ZmZlciBwb3NpdGlvbiBhY2NvcmRpbmdseS4KKyAgICoKKyAgICogVGhpcyBuZWVkcyB0byBiZSBhbHdheXMgcnVuIHdoZW4gdGVtcC5zaXplID09IDAgdG8gaGFuZGxlIGEgc3BlY2lhbAorICAgKiBjYXNlIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgYW5kIHRoZSBuZXh0IGZpbHRlciBoYXMgbm8KKyAgICogbW9yZSBvdXRwdXQgY29taW5nIGJ1dCBoYXNuJ3QgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCB5ZXQuCisgICAqLworICBpZiAocy0+dGVtcC5zaXplIDwgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zIHx8IHMtPnRlbXAuc2l6ZSA9PSAwKSB7CisgICAgb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKyAgICBtZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSk7CisgICAgYi0+b3V0X3BvcyArPSBzLT50ZW1wLnNpemU7CisKKyAgICBzLT5yZXQgPSB4el9kZWNfbHptYTJfcnVuKGx6bWEyLCBiKTsKKyAgICBpZiAocy0+cmV0ICE9IFhaX1NUUkVBTV9FTkQKKyAgICAgICAgJiYgKHMtPnJldCAhPSBYWl9PSyApKQorICAgICAgcmV0dXJuIHMtPnJldDsKKworICAgIGJjal9hcHBseShzLCBiLT5vdXQsICZvdXRfc3RhcnQsIGItPm91dF9wb3MpOworCisgICAgLyoKKyAgICAgKiBBcyBhbiBleGNlcHRpb24sIGlmIHRoZSBuZXh0IGZpbHRlciByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELAorICAgICAqIHdlIGNhbiBkbyB0aGF0IHRvbywgc2luY2UgdGhlIGxhc3QgZmV3IGJ5dGVzIHRoYXQgcmVtYWluCisgICAgICogdW5maWx0ZXJlZCBhcmUgbWVhbnQgdG8gcmVtYWluIHVuZmlsdGVyZWQuCisgICAgICovCisgICAgaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorICAgICAgcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKyAgICBzLT50ZW1wLnNpemUgPSBiLT5vdXRfcG9zIC0gb3V0X3N0YXJ0OworICAgIGItPm91dF9wb3MgLT0gcy0+dGVtcC5zaXplOworICAgIG1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5zaXplKTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgd2Fzbid0IGVub3VnaCBpbnB1dCB0byB0aGUgbmV4dCBmaWx0ZXIgdG8gZmlsbAorICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggdW5maWx0ZXJlZCBkYXRhLCB0aGVyZSdzIG5vIHBvaW50CisgICAgICogdG8gdHJ5IGRlY29kaW5nIG1vcmUgZGF0YSB0byB0ZW1wLgorICAgICAqLworICAgIGlmIChiLT5vdXRfcG9zICsgcy0+dGVtcC5zaXplIDwgYi0+b3V0X3NpemUpCisgICAgICByZXR1cm4gWFpfT0s7CisgIH0KKworICAvKgorICAgKiBXZSBoYXZlIHVuZmlsdGVyZWQgZGF0YSBpbiB0ZW1wLiBJZiB0aGUgb3V0cHV0IGJ1ZmZlciBpc24ndCBmdWxsCisgICAqIHlldCwgdHJ5IHRvIGZpbGwgdGhlIHRlbXAgYnVmZmVyIGJ5IGRlY29kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZQorICAgKiBuZXh0IGZpbHRlci4gQXBwbHkgdGhlIEJDSiBmaWx0ZXIgb24gdGVtcC4gVGhlbiB3ZSBob3BlZnVsbHkgY2FuCisgICAqIGZpbGwgdGhlIGFjdHVhbCBvdXRwdXQgYnVmZmVyIGJ5IGNvcHlpbmcgZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAuCisgICAqIEEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEgbWF5IGJlIGxlZnQgaW4gdGVtcDsgaXQgd2lsbAorICAgKiBiZSB0YWtlbiBjYXJlIG9uIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIGlmIChiLT5vdXRfcG9zIDwgYi0+b3V0X3NpemUpIHsKKyAgICAvKiBNYWtlIGItPm91dHssX3Bvcyxfc2l6ZX0gdGVtcG9yYXJpbHkgcG9pbnQgdG8gcy0+dGVtcC4gKi8KKyAgICBzLT5vdXQgPSBiLT5vdXQ7CisgICAgcy0+b3V0X3BvcyA9IGItPm91dF9wb3M7CisgICAgcy0+b3V0X3NpemUgPSBiLT5vdXRfc2l6ZTsKKyAgICBiLT5vdXQgPSBzLT50ZW1wLmJ1ZjsKKyAgICBiLT5vdXRfcG9zID0gcy0+dGVtcC5zaXplOworICAgIGItPm91dF9zaXplID0gc2l6ZW9mKHMtPnRlbXAuYnVmKTsKKworICAgIHMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCisgICAgcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvczsKKyAgICBiLT5vdXQgPSBzLT5vdXQ7CisgICAgYi0+b3V0X3BvcyA9IHMtPm91dF9wb3M7CisgICAgYi0+b3V0X3NpemUgPSBzLT5vdXRfc2l6ZTsKKworICAgIGlmIChzLT5yZXQgIT0gWFpfT0sgJiYgcy0+cmV0ICE9IFhaX1NUUkVBTV9FTkQpCisgICAgICByZXR1cm4gcy0+cmV0OworCisgICAgYmNqX2FwcGx5KHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5maWx0ZXJlZCwgcy0+dGVtcC5zaXplKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIG5leHQgZmlsdGVyIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsIHdlIG1hcmsgdGhhdAorICAgICAqIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQsIHNpbmNlIHRoZSBsYXN0IHVuZmlsdGVyZWQgYnl0ZXMKKyAgICAgKiBvZiB0aGUgc3RyZWFtIGFyZSBtZWFudCB0byBiZSBsZWZ0IGFzIGlzLgorICAgICAqLworICAgIGlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKyAgICAgIHMtPnRlbXAuZmlsdGVyZWQgPSBzLT50ZW1wLnNpemU7CisKKyAgICBiY2pfZmx1c2gocywgYik7CisgICAgaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorICAgICAgcmV0dXJuIFhaX09LOworICB9CisKKyAgcmV0dXJuIHMtPnJldDsKK30KKworZW51bSB4el9yZXQgeHpfZGVjX2Jjal9yZXNldChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCBpZCkKK3sKKyAgc3dpdGNoIChpZCkgeworI2lmZGVmIFhaX0RFQ19YODYKKyAgY2FzZSBCQ0pfWDg2OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKyAgY2FzZSBCQ0pfUE9XRVJQQzoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19JQTY0CisgIGNhc2UgQkNKX0lBNjQ6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNCisgIGNhc2UgQkNKX0FSTToKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorICBjYXNlIEJDSl9BUk1USFVNQjoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19TUEFSQworICBjYXNlIEJDSl9TUEFSQzoKKyNlbmRpZgorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogVW5zdXBwb3J0ZWQgRmlsdGVyIElEICovCisgICAgcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisgIH0KKworICBzLT50eXBlID0gaWQ7CisgIHMtPnJldCA9IFhaX09LOworICBzLT5wb3MgPSAwOworICBzLT54ODZfcHJldl9tYXNrID0gMDsKKyAgcy0+dGVtcC5maWx0ZXJlZCA9IDA7CisgIHMtPnRlbXAuc2l6ZSA9IDA7CisKKyAgcmV0dXJuIFhaX09LOworfQorCisjZW5kaWYKKy8qCisgKiBMWk1BMiBkZWNvZGVyCisgKi8KKworCisvLyBCRUdJTiB4el9sem1hMi5oCisvKgorICogTFpNQTIgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworCisvKiBSYW5nZSBjb2RlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgUkNfU0hJRlRfQklUUyA4CisjZGVmaW5lIFJDX1RPUF9CSVRTIDI0CisjZGVmaW5lIFJDX1RPUF9WQUxVRSAoMSA8PCBSQ19UT1BfQklUUykKKyNkZWZpbmUgUkNfQklUX01PREVMX1RPVEFMX0JJVFMgMTEKKyNkZWZpbmUgUkNfQklUX01PREVMX1RPVEFMICgxIDw8IFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTKQorI2RlZmluZSBSQ19NT1ZFX0JJVFMgNQorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgcG9zaXRpb24gc3RhdGVzLiBBIHBvc2l0aW9uIHN0YXRlIGlzIHRoZSBsb3dlc3QgcGIKKyAqIG51bWJlciBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IHVuY29tcHJlc3NlZCBvZmZzZXQuIEluIHNvbWUgcGxhY2VzIHRoZXJlCisgKiBhcmUgZGlmZmVyZW50IHNldHMgb2YgcHJvYmFiaWxpdGllcyBmb3IgZGlmZmVyZW50IHBvc2l0aW9uIHN0YXRlcy4KKyAqLworI2RlZmluZSBQT1NfU1RBVEVTX01BWCAoMSA8PCA0KQorCisvKgorICogVGhpcyBlbnVtIGlzIHVzZWQgdG8gdHJhY2sgd2hpY2ggTFpNQSBzeW1ib2xzIGhhdmUgb2NjdXJyZWQgbW9zdCByZWNlbnRseQorICogYW5kIGluIHdoaWNoIG9yZGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJlZGljdCB0aGUgbmV4dCBzeW1ib2wuCisgKgorICogU3ltYm9sczoKKyAqICAtIExpdGVyYWw6IE9uZSA4LWJpdCBieXRlCisgKiAgLSBNYXRjaDogUmVwZWF0IGEgY2h1bmsgb2YgZGF0YSBhdCBzb21lIGRpc3RhbmNlCisgKiAgLSBMb25nIHJlcGVhdDogTXVsdGktYnl0ZSBtYXRjaCBhdCBhIHJlY2VudGx5IHNlZW4gZGlzdGFuY2UKKyAqICAtIFNob3J0IHJlcGVhdDogT25lLWJ5dGUgcmVwZWF0IGF0IGEgcmVjZW50bHkgc2VlbiBkaXN0YW5jZQorICoKKyAqIFRoZSBzeW1ib2wgbmFtZXMgYXJlIGluIGZyb20gU1RBVEVfb2xkZXN0X29sZGVyX3ByZXZpb3VzLiBSRVAgbWVhbnMKKyAqIGVpdGhlciBzaG9ydCBvciBsb25nIHJlcGVhdGVkIG1hdGNoLCBhbmQgTk9OTElUIG1lYW5zIGFueSBub24tbGl0ZXJhbC4KKyAqLworZW51bSBsem1hX3N0YXRlIHsKKyAgU1RBVEVfTElUX0xJVCwKKyAgU1RBVEVfTUFUQ0hfTElUX0xJVCwKKyAgU1RBVEVfUkVQX0xJVF9MSVQsCisgIFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQsCisgIFNUQVRFX01BVENIX0xJVCwKKyAgU1RBVEVfUkVQX0xJVCwKKyAgU1RBVEVfU0hPUlRSRVBfTElULAorICBTVEFURV9MSVRfTUFUQ0gsCisgIFNUQVRFX0xJVF9MT05HUkVQLAorICBTVEFURV9MSVRfU0hPUlRSRVAsCisgIFNUQVRFX05PTkxJVF9NQVRDSCwKKyAgU1RBVEVfTk9OTElUX1JFUAorfTsKKworLyogVG90YWwgbnVtYmVyIG9mIHN0YXRlcyAqLworI2RlZmluZSBTVEFURVMgMTIKKworLyogVGhlIGxvd2VzdCA3IHN0YXRlcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcmV2aW91cyBzdGF0ZSB3YXMgYSBsaXRlcmFsLiAqLworI2RlZmluZSBMSVRfU1RBVEVTIDcKKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN5bWJvbCB3YXMgYSBsaXRlcmFsLiAqLworc3RhdGljIGlubGluZSB2b2lkIGx6bWFfc3RhdGVfbGl0ZXJhbChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworICBpZiAoKnN0YXRlIDw9IFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQpCisgICAgKnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKyAgZWxzZSBpZiAoKnN0YXRlIDw9IFNUQVRFX0xJVF9TSE9SVFJFUCkKKyAgICAqc3RhdGUgLT0gMzsKKyAgZWxzZQorICAgICpzdGF0ZSAtPSA2OworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIGx6bWFfc3RhdGVfbWF0Y2goZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKyAgKnN0YXRlID0gKnN0YXRlIDwgTElUX1NUQVRFUyA/IFNUQVRFX0xJVF9NQVRDSCA6IFNUQVRFX05PTkxJVF9NQVRDSDsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN0YXRlIHdhcyBhIGxvbmcgcmVwZWF0ZWQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9sb25nX3JlcChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworICAqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX0xPTkdSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIHNob3J0IG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIGx6bWFfc3RhdGVfc2hvcnRfcmVwKGVudW0gbHptYV9zdGF0ZSAqc3RhdGUpCit7CisgICpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfU0hPUlRSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBUZXN0IGlmIHRoZSBwcmV2aW91cyBzeW1ib2wgd2FzIGEgbGl0ZXJhbC4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGx6bWFfc3RhdGVfaXNfbGl0ZXJhbChlbnVtIGx6bWFfc3RhdGUgc3RhdGUpCit7CisgIHJldHVybiBzdGF0ZSA8IExJVF9TVEFURVM7Cit9CisKKy8qIEVhY2ggbGl0ZXJhbCBjb2RlciBpcyBkaXZpZGVkIGluIHRocmVlIHNlY3Rpb25zOgorICogICAtIDB4MDAxLTB4MEZGOiBXaXRob3V0IG1hdGNoIGJ5dGUKKyAqICAgLSAweDEwMS0weDFGRjogV2l0aCBtYXRjaCBieXRlOyBtYXRjaCBiaXQgaXMgMAorICogICAtIDB4MjAxLTB4MkZGOiBXaXRoIG1hdGNoIGJ5dGU7IG1hdGNoIGJpdCBpcyAxCisgKgorICogTWF0Y2ggYnl0ZSBpcyB1c2VkIHdoZW4gdGhlIHByZXZpb3VzIExaTUEgc3ltYm9sIHdhcyBzb21ldGhpbmcgZWxzZSB0aGFuCisgKiBhIGxpdGVyYWwgKHRoYXQgaXMsIGl0IHdhcyBzb21lIGtpbmQgb2YgbWF0Y2gpLgorICovCisjZGVmaW5lIExJVEVSQUxfQ09ERVJfU0laRSAweDMwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBsaXRlcmFsIGNvZGVycyAqLworI2RlZmluZSBMSVRFUkFMX0NPREVSU19NQVggKDEgPDwgNCkKKworLyogTWluaW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyB0d28gYnl0ZXMuICovCisjZGVmaW5lIE1BVENIX0xFTl9NSU4gMgorCisvKiBNYXRjaCBsZW5ndGggaXMgZW5jb2RlZCB3aXRoIDQsIDUsIG9yIDEwIGJpdHMuCisgKgorICogTGVuZ3RoICAgQml0cworICogIDItOSAgICAgIDQgPSBDaG9pY2U9MCArIDMgYml0cworICogMTAtMTcgICAgIDUgPSBDaG9pY2U9MSArIENob2ljZTI9MCArIDMgYml0cworICogMTgtMjczICAgMTAgPSBDaG9pY2U9MSArIENob2ljZTI9MSArIDggYml0cworICovCisjZGVmaW5lIExFTl9MT1dfQklUUyAzCisjZGVmaW5lIExFTl9MT1dfU1lNQk9MUyAoMSA8PCBMRU5fTE9XX0JJVFMpCisjZGVmaW5lIExFTl9NSURfQklUUyAzCisjZGVmaW5lIExFTl9NSURfU1lNQk9MUyAoMSA8PCBMRU5fTUlEX0JJVFMpCisjZGVmaW5lIExFTl9ISUdIX0JJVFMgOAorI2RlZmluZSBMRU5fSElHSF9TWU1CT0xTICgxIDw8IExFTl9ISUdIX0JJVFMpCisjZGVmaW5lIExFTl9TWU1CT0xTIChMRU5fTE9XX1NZTUJPTFMgKyBMRU5fTUlEX1NZTUJPTFMgKyBMRU5fSElHSF9TWU1CT0xTKQorCisvKgorICogTWF4aW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyAyNzMgd2hpY2ggaXMgYSByZXN1bHQgb2YgdGhlIGVuY29kaW5nCisgKiBkZXNjcmliZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgTUFUQ0hfTEVOX01BWCAoTUFUQ0hfTEVOX01JTiArIExFTl9TWU1CT0xTIC0gMSkKKworLyoKKyAqIERpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgYXJlIHVzZWQgZm9yIG1hdGNoIGRpc3RhbmNlcyB0aGF0IGhhdmUKKyAqIHZlcnkgc2hvcnQgbWF0Y2ggbGVuZ3RoOiBMZW5ndGhzIG9mIDIsIDMsIGFuZCA0IGJ5dGVzIGhhdmUgYSBzZXBhcmF0ZQorICogc2V0IG9mIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggbGVuZ3RoLiBUaGUgbWF0Y2hlcyB3aXRoIGxvbmdlciBsZW5ndGgKKyAqIHVzZSBhIHNoYXJlZCBzZXQgb2YgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBESVNUX1NUQVRFUyA0CisKKy8qCisgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBhcHByb3ByaWF0ZSBwcm9iYWJpbGl0eSBhcnJheSBmb3IgZGVjb2RpbmcKKyAqIHRoZSBkaXN0YW5jZSBzbG90LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGx6bWFfZ2V0X2Rpc3Rfc3RhdGUodWludDMyX3QgbGVuKQoreworICByZXR1cm4gbGVuIDwgRElTVF9TVEFURVMgKyBNQVRDSF9MRU5fTUlOCisgICAgICA/IGxlbiAtIE1BVENIX0xFTl9NSU4gOiBESVNUX1NUQVRFUyAtIDE7Cit9CisKKy8qCisgKiBUaGUgaGlnaGVzdCB0d28gYml0cyBvZiBhIDMyLWJpdCBtYXRjaCBkaXN0YW5jZSBhcmUgZW5jb2RlZCB1c2luZyBzaXggYml0cy4KKyAqIFRoaXMgc2l4LWJpdCB2YWx1ZSBpcyBjYWxsZWQgYSBkaXN0YW5jZSBzbG90LiBUaGlzIHdheSBlbmNvZGluZyBhIDMyLWJpdAorICogdmFsdWUgdGFrZXMgNi0zNiBiaXRzLCBsYXJnZXIgdmFsdWVzIHRha2luZyBtb3JlIGJpdHMuCisgKi8KKyNkZWZpbmUgRElTVF9TTE9UX0JJVFMgNgorI2RlZmluZSBESVNUX1NMT1RTICgxIDw8IERJU1RfU0xPVF9CSVRTKQorCisvKiBNYXRjaCBkaXN0YW5jZXMgdXAgdG8gMTI3IGFyZSBmdWxseSBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuIFNpbmNlCisgKiB0aGUgaGlnaGVzdCB0d28gYml0cyAoZGlzdGFuY2Ugc2xvdCkgYXJlIGFsd2F5cyBlbmNvZGVkIHVzaW5nIHNpeCBiaXRzLAorICogdGhlIGRpc3RhbmNlcyAwLTMgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBiaXRzIHRvIGVuY29kZSwgc2luY2UgdGhlCisgKiBkaXN0YW5jZSBzbG90IGl0c2VsZiBpcyB0aGUgc2FtZSBhcyB0aGUgYWN0dWFsIGRpc3RhbmNlLiBESVNUX01PREVMX1NUQVJUCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IGRpc3RhbmNlIHNsb3Qgd2hlcmUgYXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgYml0IGlzCisgKiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgRElTVF9NT0RFTF9TVEFSVCA0CisKKy8qCisgKiBNYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNyBhcmUgZW5jb2RlZCBpbiB0aHJlZSBwaWVjZXM6CisgKiAgIC0gZGlzdGFuY2Ugc2xvdDogdGhlIGhpZ2hlc3QgdHdvIGJpdHMKKyAqICAgLSBkaXJlY3QgYml0czogMi0yNiBiaXRzIGJlbG93IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gYWxpZ25tZW50IGJpdHM6IGZvdXIgbG93ZXN0IGJpdHMKKyAqCisgKiBEaXJlY3QgYml0cyBkb24ndCB1c2UgYW55IHByb2JhYmlsaXRpZXMuCisgKgorICogVGhlIGRpc3RhbmNlIHNsb3QgdmFsdWUgb2YgMTQgaXMgZm9yIGRpc3RhbmNlcyAxMjgtMTkxLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfRU5EIDE0CisKKy8qIERpc3RhbmNlIHNsb3RzIHRoYXQgaW5kaWNhdGUgYSBkaXN0YW5jZSA8PSAxMjcuICovCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTX0JJVFMgKERJU1RfTU9ERUxfRU5EIC8gMikKKyNkZWZpbmUgRlVMTF9ESVNUQU5DRVMgKDEgPDwgRlVMTF9ESVNUQU5DRVNfQklUUykKKworLyoKKyAqIEZvciBtYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNywgb25seSB0aGUgaGlnaGVzdCB0d28gYml0cyBhbmQgdGhlCisgKiBsb3dlc3QgZm91ciBiaXRzIChhbGlnbm1lbnQpIGlzIGVuY29kZWQgdXNpbmcgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBBTElHTl9CSVRTIDQKKyNkZWZpbmUgQUxJR05fU0laRSAoMSA8PCBBTElHTl9CSVRTKQorI2RlZmluZSBBTElHTl9NQVNLIChBTElHTl9TSVpFIC0gMSkKKworLyogVG90YWwgbnVtYmVyIG9mIGFsbCBwcm9iYWJpbGl0eSB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgUFJPQlNfVE9UQUwgKDE4NDYgKyBMSVRFUkFMX0NPREVSU19NQVggKiBMSVRFUkFMX0NPREVSX1NJWkUpCisKKy8qCisgKiBMWk1BIHJlbWVtYmVycyB0aGUgZm91ciBtb3N0IHJlY2VudCBtYXRjaCBkaXN0YW5jZXMuIFJldXNpbmcgdGhlc2UKKyAqIGRpc3RhbmNlcyB0ZW5kcyB0byB0YWtlIGxlc3Mgc3BhY2UgdGhhbiByZS1lbmNvZGluZyB0aGUgYWN0dWFsCisgKiBkaXN0YW5jZSB2YWx1ZS4KKyAqLworI2RlZmluZSBSRVBTIDQKKworCisvLyBFTkQgeHpfbHptYTIuaAorCisvKgorICogUmFuZ2UgZGVjb2RlciBpbml0aWFsaXphdGlvbiBlYXRzIHRoZSBmaXJzdCBmaXZlIGJ5dGVzIG9mIGVhY2ggTFpNQSBjaHVuay4KKyAqLworI2RlZmluZSBSQ19JTklUX0JZVEVTIDUKKworLyoKKyAqIE1pbmltdW0gbnVtYmVyIG9mIHVzYWJsZSBpbnB1dCBidWZmZXIgdG8gc2FmZWx5IGRlY29kZSBvbmUgTFpNQSBzeW1ib2wuCisgKiBUaGUgd29yc3QgY2FzZSBpcyB0aGF0IHdlIGRlY29kZSAyMiBiaXRzIHVzaW5nIHByb2JhYmlsaXRpZXMgYW5kIDI2CisgKiBkaXJlY3QgYml0cy4gVGhpcyBtYXkgZGVjb2RlIGF0IG1heGltdW0gb2YgMjAgYnl0ZXMgb2YgaW5wdXQuIEhvd2V2ZXIsCisgKiBsem1hX21haW4oKSBkb2VzIGFuIGV4dHJhIG5vcm1hbGl6YXRpb24gYmVmb3JlIHJldHVybmluZywgdGh1cyB3ZQorICogbmVlZCB0byBwdXQgMjEgaGVyZS4KKyAqLworI2RlZmluZSBMWk1BX0lOX1JFUVVJUkVEIDIxCisKKy8qCisgKiBEaWN0aW9uYXJ5IChoaXN0b3J5IGJ1ZmZlcikKKyAqCisgKiBUaGVzZSBhcmUgYWx3YXlzIHRydWU6CisgKiAgICBzdGFydCA8PSBwb3MgPD0gZnVsbCA8PSBlbmQKKyAqICAgIHBvcyA8PSBsaW1pdCA8PSBlbmQKKyAqICAgIGVuZCA9PSBzaXplCisgKiAgICBzaXplIDw9IHNpemVfbWF4CisgKiAgICBhbGxvY2F0ZWQgPD0gc2l6ZQorICoKKyAqIE1vc3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBzaXplX3QgYXMgYSByZWxpYyBvZiBzaW5nbGUtY2FsbCBtb2RlLAorICogaW4gd2hpY2ggdGhlIGRpY3Rpb25hcnkgdmFyaWFibGVzIGFkZHJlc3MgdGhlIGFjdHVhbCBvdXRwdXQKKyAqIGJ1ZmZlciBkaXJlY3RseS4KKyAqLworc3RydWN0IGRpY3Rpb25hcnkgeworICAvKiBCZWdpbm5pbmcgb2YgdGhlIGhpc3RvcnkgYnVmZmVyICovCisgIHVpbnQ4X3QgKmJ1ZjsKKworICAvKiBPbGQgcG9zaXRpb24gaW4gYnVmIChiZWZvcmUgZGVjb2RpbmcgbW9yZSBkYXRhKSAqLworICBzaXplX3Qgc3RhcnQ7CisKKyAgLyogUG9zaXRpb24gaW4gYnVmICovCisgIHNpemVfdCBwb3M7CisKKyAgLyoKKyAgICogSG93IGZ1bGwgZGljdGlvbmFyeSBpcy4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQKKyAgICogd291bGQgcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKyAgICovCisgIHNpemVfdCBmdWxsOworCisgIC8qIFdyaXRlIGxpbWl0OyB3ZSBkb24ndCB3cml0ZSB0byBidWZbbGltaXRdIG9yIGxhdGVyIGJ5dGVzLiAqLworICBzaXplX3QgbGltaXQ7CisKKyAgLyogRW5kIG9mIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgZGljdGlvbmFyeSBzaXplLiAqLworICBzaXplX3QgZW5kOworCisgIC8qCisgICAqIFNpemUgb2YgdGhlIGRpY3Rpb25hcnkgYXMgc3BlY2lmaWVkIGluIEJsb2NrIEhlYWRlci4gVGhpcyBpcyB1c2VkCisgICAqIHRvZ2V0aGVyIHdpdGggImZ1bGwiIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQgd291bGQgbWFrZSB1cworICAgKiByZWFkIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLgorICAgKi8KKyAgdWludDMyX3Qgc2l6ZTsKKworICAvKgorICAgKiBNYXhpbXVtIGFsbG93ZWQgZGljdGlvbmFyeSBzaXplLgorICAgKi8KKyAgdWludDMyX3Qgc2l6ZV9tYXg7CisKKyAgLyoKKyAgICogQW1vdW50IG9mIG1lbW9yeSBjdXJyZW50bHkgYWxsb2NhdGVkIGZvciB0aGUgZGljdGlvbmFyeS4KKyAgICovCisgIHVpbnQzMl90IGFsbG9jYXRlZDsKK307CisKKy8qIFJhbmdlIGRlY29kZXIgKi8KK3N0cnVjdCByY19kZWMgeworICB1aW50MzJfdCByYW5nZTsKKyAgdWludDMyX3QgY29kZTsKKworICAvKgorICAgKiBOdW1iZXIgb2YgaW5pdGlhbGl6aW5nIGJ5dGVzIHJlbWFpbmluZyB0byBiZSByZWFkCisgICAqIGJ5IHJjX3JlYWRfaW5pdCgpLgorICAgKi8KKyAgdWludDMyX3QgaW5pdF9ieXRlc19sZWZ0OworCisgIC8qCisgICAqIEJ1ZmZlciBmcm9tIHdoaWNoIHdlIHJlYWQgb3VyIGlucHV0LiBJdCBjYW4gYmUgZWl0aGVyCisgICAqIHRlbXAuYnVmIG9yIHRoZSBjYWxsZXItcHJvdmlkZWQgaW5wdXQgYnVmZmVyLgorICAgKi8KKyAgY29uc3QgdWludDhfdCAqaW47CisgIHNpemVfdCBpbl9wb3M7CisgIHNpemVfdCBpbl9saW1pdDsKK307CisKKy8qIFByb2JhYmlsaXRpZXMgZm9yIGEgbGVuZ3RoIGRlY29kZXIuICovCitzdHJ1Y3QgbHptYV9sZW5fZGVjIHsKKyAgLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDEwICovCisgIHVpbnQxNl90IGNob2ljZTsKKworICAvKiBQcm9iYWJpbGl0eSBvZiBtYXRjaCBsZW5ndGggYmVpbmcgYXQgbGVhc3QgMTggKi8KKyAgdWludDE2X3QgY2hvaWNlMjsKKworICAvKiBQcm9iYWJpbGl0aWVzIGZvciBtYXRjaCBsZW5ndGhzIDItOSAqLworICB1aW50MTZfdCBsb3dbUE9TX1NUQVRFU19NQVhdW0xFTl9MT1dfU1lNQk9MU107CisKKyAgLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxMC0xNyAqLworICB1aW50MTZfdCBtaWRbUE9TX1NUQVRFU19NQVhdW0xFTl9NSURfU1lNQk9MU107CisKKyAgLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxOC0yNzMgKi8KKyAgdWludDE2X3QgaGlnaFtMRU5fSElHSF9TWU1CT0xTXTsKK307CisKK3N0cnVjdCBsem1hX2RlYyB7CisgIC8qIERpc3RhbmNlcyBvZiBsYXRlc3QgZm91ciBtYXRjaGVzICovCisgIHVpbnQzMl90IHJlcDA7CisgIHVpbnQzMl90IHJlcDE7CisgIHVpbnQzMl90IHJlcDI7CisgIHVpbnQzMl90IHJlcDM7CisKKyAgLyogVHlwZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgc2VlbiBMWk1BIHN5bWJvbHMgKi8KKyAgZW51bSBsem1hX3N0YXRlIHN0YXRlOworCisgIC8qCisgICAqIExlbmd0aCBvZiBhIG1hdGNoLiBUaGlzIGlzIHVwZGF0ZWQgc28gdGhhdCBkaWN0X3JlcGVhdCBjYW4KKyAgICogYmUgY2FsbGVkIGFnYWluIHRvIGZpbmlzaCByZXBlYXRpbmcgdGhlIHdob2xlIG1hdGNoLgorICAgKi8KKyAgdWludDMyX3QgbGVuOworCisgIC8qCisgICAqIExaTUEgcHJvcGVydGllcyBvciByZWxhdGVkIGJpdCBtYXNrcyAobnVtYmVyIG9mIGxpdGVyYWwKKyAgICogY29udGV4dCBiaXRzLCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIgb2YgbGl0ZXJhbAorICAgKiBwb3NpdGlvbiBiaXRzLCBhbmQgYSBtYXNrIGRlcnZpZWQgZnJvbSB0aGUgbnVtYmVyCisgICAqIHBvc2l0aW9uIGJpdHMpCisgICAqLworICB1aW50MzJfdCBsYzsKKyAgdWludDMyX3QgbGl0ZXJhbF9wb3NfbWFzazsgLyogKDEgPDwgbHApIC0gMSAqLworICB1aW50MzJfdCBwb3NfbWFzazsgICAgICAgICAvKiAoMSA8PCBwYikgLSAxICovCisKKyAgLyogSWYgMSwgaXQncyBhIG1hdGNoLiBPdGhlcndpc2UgaXQncyBhIHNpbmdsZSA4LWJpdCBsaXRlcmFsLiAqLworICB1aW50MTZfdCBpc19tYXRjaFtTVEFURVNdW1BPU19TVEFURVNfTUFYXTsKKworICAvKiBJZiAxLCBpdCdzIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgcmVwMCAuLiByZXAzLiAqLworICB1aW50MTZfdCBpc19yZXBbU1RBVEVTXTsKKworICAvKgorICAgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDAuCisgICAqIE90aGVyd2lzZSBjaGVjayBpc19yZXAxLgorICAgKi8KKyAgdWludDE2X3QgaXNfcmVwMFtTVEFURVNdOworCisgIC8qCisgICAqIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMS4KKyAgICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDIuCisgICAqLworICB1aW50MTZfdCBpc19yZXAxW1NUQVRFU107CisKKyAgLyogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAyLiBPdGhlcndpc2UgaXQgaXMgcmVwMy4gKi8KKyAgdWludDE2X3QgaXNfcmVwMltTVEFURVNdOworCisgIC8qCisgICAqIElmIDEsIHRoZSByZXBlYXRlZCBtYXRjaCBoYXMgbGVuZ3RoIG9mIG9uZSBieXRlLiBPdGhlcndpc2UKKyAgICogdGhlIGxlbmd0aCBpcyBkZWNvZGVkIGZyb20gcmVwX2xlbl9kZWNvZGVyLgorICAgKi8KKyAgdWludDE2X3QgaXNfcmVwMF9sb25nW1NUQVRFU11bUE9TX1NUQVRFU19NQVhdOworCisgIC8qCisgICAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBoaWdoZXN0IHR3byBiaXRzIG9mIHRoZSBtYXRjaAorICAgKiBkaXN0YW5jZS4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBwcm9iYWJpbGl0eSB0cmVlIGZvciBtYXRjaAorICAgKiBsZW5ndGhzIG9mIDIgKGkuZS4gTUFUQ0hfTEVOX01JTiksIDMsIDQsIGFuZCBbNSwgMjczXS4KKyAgICovCisgIHVpbnQxNl90IGRpc3Rfc2xvdFtESVNUX1NUQVRFU11bRElTVF9TTE9UU107CisKKyAgLyoKKyAgICogUHJvYmlsaXR5IHRyZWVzIGZvciBhZGRpdGlvbmFsIGJpdHMgZm9yIG1hdGNoIGRpc3RhbmNlCisgICAqIHdoZW4gdGhlIGRpc3RhbmNlIGlzIGluIHRoZSByYW5nZSBbNCwgMTI3XS4KKyAgICovCisgIHVpbnQxNl90IGRpc3Rfc3BlY2lhbFtGVUxMX0RJU1RBTkNFUyAtIERJU1RfTU9ERUxfRU5EXTsKKworICAvKgorICAgKiBQcm9iYWJpbGl0eSB0cmVlIGZvciB0aGUgbG93ZXN0IGZvdXIgYml0cyBvZiBhIG1hdGNoCisgICAqIGRpc3RhbmNlIHRoYXQgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDEyOC4KKyAgICovCisgIHVpbnQxNl90IGRpc3RfYWxpZ25bQUxJR05fU0laRV07CisKKyAgLyogTGVuZ3RoIG9mIGEgbm9ybWFsIG1hdGNoICovCisgIHN0cnVjdCBsem1hX2xlbl9kZWMgbWF0Y2hfbGVuX2RlYzsKKworICAvKiBMZW5ndGggb2YgYSByZXBlYXRlZCBtYXRjaCAqLworICBzdHJ1Y3QgbHptYV9sZW5fZGVjIHJlcF9sZW5fZGVjOworCisgIC8qIFByb2JhYmlsaXRpZXMgb2YgbGl0ZXJhbHMgKi8KKyAgdWludDE2X3QgbGl0ZXJhbFtMSVRFUkFMX0NPREVSU19NQVhdW0xJVEVSQUxfQ09ERVJfU0laRV07Cit9OworCitzdHJ1Y3QgbHptYTJfZGVjIHsKKyAgLyogUG9zaXRpb24gaW4geHpfZGVjX2x6bWEyX3J1bigpLiAqLworICBlbnVtIGx6bWEyX3NlcSB7CisgICAgU0VRX0NPTlRST0wsCisgICAgU0VRX1VOQ09NUFJFU1NFRF8xLAorICAgIFNFUV9VTkNPTVBSRVNTRURfMiwKKyAgICBTRVFfQ09NUFJFU1NFRF8wLAorICAgIFNFUV9DT01QUkVTU0VEXzEsCisgICAgU0VRX1BST1BFUlRJRVMsCisgICAgU0VRX0xaTUFfUFJFUEFSRSwKKyAgICBTRVFfTFpNQV9SVU4sCisgICAgU0VRX0NPUFkKKyAgfSBzZXF1ZW5jZTsKKworICAvKiBOZXh0IHBvc2l0aW9uIGFmdGVyIGRlY29kaW5nIHRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGNodW5rLiAqLworICBlbnVtIGx6bWEyX3NlcSBuZXh0X3NlcXVlbmNlOworCisgIC8qIFVuY29tcHJlc3NlZCBzaXplIG9mIExaTUEgY2h1bmsgKDIgTWlCIGF0IG1heGltdW0pICovCisgIHVpbnQzMl90IHVuY29tcHJlc3NlZDsKKworICAvKgorICAgKiBDb21wcmVzc2VkIHNpemUgb2YgTFpNQSBjaHVuayBvciBjb21wcmVzc2VkL3VuY29tcHJlc3NlZAorICAgKiBzaXplIG9mIHVuY29tcHJlc3NlZCBjaHVuayAoNjQgS2lCIGF0IG1heGltdW0pCisgICAqLworICB1aW50MzJfdCBjb21wcmVzc2VkOworCisgIC8qCisgICAqIFRydWUgaWYgZGljdGlvbmFyeSByZXNldCBpcyBuZWVkZWQuIFRoaXMgaXMgZmFsc2UgYmVmb3JlCisgICAqIHRoZSBmaXJzdCBjaHVuayAoTFpNQSBvciB1bmNvbXByZXNzZWQpLgorICAgKi8KKyAgaW50IG5lZWRfZGljdF9yZXNldDsKKworICAvKgorICAgKiBUcnVlIGlmIG5ldyBMWk1BIHByb3BlcnRpZXMgYXJlIG5lZWRlZC4gVGhpcyBpcyBmYWxzZQorICAgKiBiZWZvcmUgdGhlIGZpcnN0IExaTUEgY2h1bmsuCisgICAqLworICBpbnQgbmVlZF9wcm9wczsKK307CisKK3N0cnVjdCB4el9kZWNfbHptYTIgeworICAvKgorICAgKiBUaGUgb3JkZXIgYmVsb3cgaXMgaW1wb3J0YW50IG9uIHg4NiB0byByZWR1Y2UgY29kZSBzaXplIGFuZAorICAgKiBpdCBzaG91bGRuJ3QgaHVydCBvbiBvdGhlciBwbGF0Zm9ybXMuIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kCisgICAqIGluY2x1ZGluZyBsem1hLnBvc19tYXNrIGFyZSBpbiB0aGUgZmlyc3QgMTI4IGJ5dGVzIG9uIHg4Ni0zMiwKKyAgICogd2hpY2ggYWxsb3dzIHVzaW5nIHNtYWxsZXIgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyB0aG9zZQorICAgKiB2YXJpYWJsZXMuIE9uIHg4Ni02NCwgZmV3ZXIgdmFyaWFibGVzIGZpdCBpbnRvIHRoZSBmaXJzdCAxMjgKKyAgICogYnl0ZXMsIGJ1dCB0aGlzIGlzIHN0aWxsIHRoZSBiZXN0IG9yZGVyIHdpdGhvdXQgc2FjcmlmaWNpbmcKKyAgICogdGhlIHJlYWRhYmlsaXR5IGJ5IHNwbGl0dGluZyB0aGUgc3RydWN0dXJlcy4KKyAgICovCisgIHN0cnVjdCByY19kZWMgcmM7CisgIHN0cnVjdCBkaWN0aW9uYXJ5IGRpY3Q7CisgIHN0cnVjdCBsem1hMl9kZWMgbHptYTI7CisgIHN0cnVjdCBsem1hX2RlYyBsem1hOworCisgIC8qCisgICAqIFRlbXBvcmFyeSBidWZmZXIgd2hpY2ggaG9sZHMgc21hbGwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGJldHdlZW4KKyAgICogZGVjb2RlciBjYWxscy4gU2VlIGx6bWEyX2x6bWEoKSBmb3IgZGV0YWlscy4KKyAgICovCisgIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50OF90IGJ1ZlszICogTFpNQV9JTl9SRVFVSVJFRF07CisgIH0gdGVtcDsKK307CisKKy8qKioqKioqKioqKioqKgorICogRGljdGlvbmFyeSAqCisgKioqKioqKioqKioqKiovCisKKy8qIFJlc2V0IHRoZSBkaWN0aW9uYXJ5IHN0YXRlLiAqLworc3RhdGljIHZvaWQgZGljdF9yZXNldChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCkKK3sKKyAgZGljdC0+c3RhcnQgPSAwOworICBkaWN0LT5wb3MgPSAwOworICBkaWN0LT5saW1pdCA9IDA7CisgIGRpY3QtPmZ1bGwgPSAwOworfQorCisvKiBTZXQgZGljdGlvbmFyeSB3cml0ZSBsaW1pdCAqLworc3RhdGljIHZvaWQgZGljdF9saW1pdChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc2l6ZV90IG91dF9tYXgpCit7CisgIGlmIChkaWN0LT5lbmQgLSBkaWN0LT5wb3MgPD0gb3V0X21heCkKKyAgICBkaWN0LT5saW1pdCA9IGRpY3QtPmVuZDsKKyAgZWxzZQorICAgIGRpY3QtPmxpbWl0ID0gZGljdC0+cG9zICsgb3V0X21heDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGJ5dGUgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgZGljdGlvbmFyeS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRpY3RfaGFzX3NwYWNlKGNvbnN0IHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0KQoreworICByZXR1cm4gZGljdC0+cG9zIDwgZGljdC0+bGltaXQ7Cit9CisKKy8qCisgKiBHZXQgYSBieXRlIGZyb20gdGhlIGRpY3Rpb25hcnkgYXQgdGhlIGdpdmVuIGRpc3RhbmNlLiBUaGUgZGlzdGFuY2UgaXMKKyAqIGFzc3VtZWQgdG8gdmFsaWQsIG9yIGFzIGEgc3BlY2lhbCBjYXNlLCB6ZXJvIHdoZW4gdGhlIGRpY3Rpb25hcnkgaXMKKyAqIHN0aWxsIGVtcHR5LiBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWVkZWQgZm9yIHNpbmdsZS1jYWxsIGRlY29kaW5nIHRvCisgKiBhdm9pZCB3cml0aW5nIGEgJ1wwJyB0byB0aGUgZW5kIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZGljdF9nZXQoY29uc3Qgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90IGRpc3QpCit7CisgIHNpemVfdCBvZmZzZXQgPSBkaWN0LT5wb3MgLSBkaXN0IC0gMTsKKworICBpZiAoZGlzdCA+PSBkaWN0LT5wb3MpCisgICAgb2Zmc2V0ICs9IGRpY3QtPmVuZDsKKworICByZXR1cm4gZGljdC0+ZnVsbCA+IDAgPyBkaWN0LT5idWZbb2Zmc2V0XSA6IDA7Cit9CisKKy8qCisgKiBQdXQgb25lIGJ5dGUgaW50byB0aGUgZGljdGlvbmFyeS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIGlzIHNwYWNlIGZvciBpdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpY3RfcHV0KHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCB1aW50OF90IGJ5dGUpCit7CisgIGRpY3QtPmJ1ZltkaWN0LT5wb3MrK10gPSBieXRlOworCisgIGlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorICAgIGRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7Cit9CisKKy8qCisgKiBSZXBlYXQgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRpc3RhbmNlLiBJZiB0aGUgZGlzdGFuY2UgaXMKKyAqIGludmFsaWQsIGZhbHNlIGlzIHJldHVybmVkLiBPbiBzdWNjZXNzLCB0cnVlIGlzIHJldHVybmVkIGFuZCAqbGVuIGlzCisgKiB1cGRhdGVkIHRvIGluZGljYXRlIGhvdyBtYW55IGJ5dGVzIHdlcmUgbGVmdCB0byBiZSByZXBlYXRlZC4KKyAqLworc3RhdGljIGludCBkaWN0X3JlcGVhdChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgdWludDMyX3QgKmxlbiwgdWludDMyX3QgZGlzdCkKK3sKKyAgc2l6ZV90IGJhY2s7CisgIHVpbnQzMl90IGxlZnQ7CisKKyAgaWYgKGRpc3QgPj0gZGljdC0+ZnVsbCB8fCBkaXN0ID49IGRpY3QtPnNpemUpIHJldHVybiAwOworCisgIGxlZnQgPSBtaW5fdChzaXplX3QsIGRpY3QtPmxpbWl0IC0gZGljdC0+cG9zLCAqbGVuKTsKKyAgKmxlbiAtPSBsZWZ0OworCisgIGJhY2sgPSBkaWN0LT5wb3MgLSBkaXN0IC0gMTsKKyAgaWYgKGRpc3QgPj0gZGljdC0+cG9zKQorICAgIGJhY2sgKz0gZGljdC0+ZW5kOworCisgIGRvIHsKKyAgICBkaWN0LT5idWZbZGljdC0+cG9zKytdID0gZGljdC0+YnVmW2JhY2srK107CisgICAgaWYgKGJhY2sgPT0gZGljdC0+ZW5kKQorICAgICAgYmFjayA9IDA7CisgIH0gd2hpbGUgKC0tbGVmdCA+IDApOworCisgIGlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorICAgIGRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIENvcHkgdW5jb21wcmVzc2VkIGRhdGEgYXMgaXMgZnJvbSBpbnB1dCB0byBkaWN0aW9uYXJ5IGFuZCBvdXRwdXQgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkIGRpY3RfdW5jb21wcmVzc2VkKHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBzdHJ1Y3QgeHpfYnVmICpiLAorICAgICAgICAgICAgdWludDMyX3QgKmxlZnQpCit7CisgIHNpemVfdCBjb3B5X3NpemU7CisKKyAgd2hpbGUgKCpsZWZ0ID4gMCAmJiBiLT5pbl9wb3MgPCBiLT5pbl9zaXplCisgICAgICAmJiBiLT5vdXRfcG9zIDwgYi0+b3V0X3NpemUpIHsKKyAgICBjb3B5X3NpemUgPSBtaW4oYi0+aW5fc2l6ZSAtIGItPmluX3BvcywKKyAgICAgICAgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zKTsKKyAgICBpZiAoY29weV9zaXplID4gZGljdC0+ZW5kIC0gZGljdC0+cG9zKQorICAgICAgY29weV9zaXplID0gZGljdC0+ZW5kIC0gZGljdC0+cG9zOworICAgIGlmIChjb3B5X3NpemUgPiAqbGVmdCkKKyAgICAgIGNvcHlfc2l6ZSA9ICpsZWZ0OworCisgICAgKmxlZnQgLT0gY29weV9zaXplOworCisgICAgbWVtY3B5KGRpY3QtPmJ1ZiArIGRpY3QtPnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisgICAgZGljdC0+cG9zICs9IGNvcHlfc2l6ZTsKKworICAgIGlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorICAgICAgZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKKworICAgIGlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorICAgICAgZGljdC0+cG9zID0gMDsKKworICAgIG1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBiLT5pbiArIGItPmluX3BvcywKKyAgICAgICAgY29weV9zaXplKTsKKworICAgIGRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCisgICAgYi0+b3V0X3BvcyArPSBjb3B5X3NpemU7CisgICAgYi0+aW5fcG9zICs9IGNvcHlfc2l6ZTsKKyAgfQorfQorCisvKgorICogRmx1c2ggcGVuZGluZyBkYXRhIGZyb20gZGljdGlvbmFyeSB0byBiLT5vdXQuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBpcworICogZW5vdWdoIHNwYWNlIGluIGItPm91dC4gVGhpcyBpcyBndWFyYW50ZWVkIGJlY2F1c2UgY2FsbGVyIHVzZXMgZGljdF9saW1pdCgpCisgKiBiZWZvcmUgZGVjb2RpbmcgZGF0YSBpbnRvIHRoZSBkaWN0aW9uYXJ5LgorICovCitzdGF0aWMgdWludDMyX3QgZGljdF9mbHVzaChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgc2l6ZV90IGNvcHlfc2l6ZSA9IGRpY3QtPnBvcyAtIGRpY3QtPnN0YXJ0OworCisgIGlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorICAgIGRpY3QtPnBvcyA9IDA7CisKKyAgbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIGRpY3QtPmJ1ZiArIGRpY3QtPnN0YXJ0LAorICAgICAgY29weV9zaXplKTsKKworICBkaWN0LT5zdGFydCA9IGRpY3QtPnBvczsKKyAgYi0+b3V0X3BvcyArPSBjb3B5X3NpemU7CisgIHJldHVybiBjb3B5X3NpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKgorICogUmFuZ2UgZGVjb2RlciAqCisgKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc2V0IHRoZSByYW5nZSBkZWNvZGVyLiAqLworc3RhdGljIHZvaWQgcmNfcmVzZXQoc3RydWN0IHJjX2RlYyAqcmMpCit7CisgIHJjLT5yYW5nZSA9ICh1aW50MzJfdCktMTsKKyAgcmMtPmNvZGUgPSAwOworICByYy0+aW5pdF9ieXRlc19sZWZ0ID0gUkNfSU5JVF9CWVRFUzsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZpcnN0IGZpdmUgaW5pdGlhbCBieXRlcyBpbnRvIHJjLT5jb2RlIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisgKiByZWFkIGFscmVhZHkuIChZZXMsIHRoZSBmaXJzdCBieXRlIGdldHMgY29tcGxldGVseSBpZ25vcmVkLikKKyAqLworc3RhdGljIGludCByY19yZWFkX2luaXQoc3RydWN0IHJjX2RlYyAqcmMsIHN0cnVjdCB4el9idWYgKmIpCit7CisgIHdoaWxlIChyYy0+aW5pdF9ieXRlc19sZWZ0ID4gMCkgeworICAgIGlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkgcmV0dXJuIDA7CisKKyAgICByYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSArIGItPmluW2ItPmluX3BvcysrXTsKKyAgICAtLXJjLT5pbml0X2J5dGVzX2xlZnQ7CisgIH0KKworICByZXR1cm4gMTsKK30KKworLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IG5vdCBiZSBlbm91Z2ggaW5wdXQgZm9yIHRoZSBuZXh0IGRlY29kaW5nIGxvb3AuICovCitzdGF0aWMgaW5saW5lIGludCByY19saW1pdF9leGNlZWRlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKyAgcmV0dXJuIHJjLT5pbl9wb3MgPiByYy0+aW5fbGltaXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSAoZnJvbSBwb2ludCBvZiB2aWV3IG9mIHJhbmdlIGRlY29kZXIpIHRoYXQKKyAqIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBMWk1BIGNodW5rLgorICovCitzdGF0aWMgaW5saW5lIGludCByY19pc19maW5pc2hlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKyAgcmV0dXJuIHJjLT5jb2RlID09IDA7Cit9CisKKy8qIFJlYWQgdGhlIG5leHQgaW5wdXQgYnl0ZSBpZiBuZWVkZWQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfbm9ybWFsaXplKHN0cnVjdCByY19kZWMgKnJjKQoreworICBpZiAocmMtPnJhbmdlIDwgUkNfVE9QX1ZBTFVFKSB7CisgICAgcmMtPnJhbmdlIDw8PSBSQ19TSElGVF9CSVRTOworICAgIHJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IFJDX1NISUZUX0JJVFMpICsgcmMtPmluW3JjLT5pbl9wb3MrK107CisgIH0KK30KKworLyoKKyAqIERlY29kZSBvbmUgYml0LiBJbiBzb21lIHZlcnNpb25zLCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHNwbGl0dGVkIGluIHRocmVlCisgKiBmdW5jdGlvbnMgc28gdGhhdCB0aGUgY29tcGlsZXIgaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBtb3JlIGVhc2lseSBhdm9pZAorICogYW4gZXh0cmEgYnJhbmNoLiBJbiB0aGlzIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgTFpNQSBkZWNvZGVyLCB0aGlzCisgKiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIGlkZWEgKHRlc3RlZCB3aXRoIEdDQyAzLjMuNiwgMy40LjYsIGFuZCA0LjMuMworICogb24geDg2KS4gVXNpbmcgYSBub24tc3BsaXR0ZWQgdmVyc2lvbiByZXN1bHRzIGluIG5pY2VyIGxvb2tpbmcgY29kZSB0b28uCisgKgorICogTk9URTogVGhpcyBtdXN0IHJldHVybiBhbiBpbnQuIERvIG5vdCBtYWtlIGl0IHJldHVybiBhIGJvb2wgb3IgdGhlIHNwZWVkCisgKiBvZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgR0NDIDMueCBkZWNyZWFzZXMgMTAtMTUgJS4gKEdDQyA0LjMgZG9lc24ndCBjYXJlLAorICogYW5kIGl0IGdlbmVyYXRlcyAxMC0yMCAlIGZhc3RlciBjb2RlIHRoYW4gR0NDIDMueCBmcm9tIHRoaXMgZmlsZSBhbnl3YXkuKQorICovCitzdGF0aWMgaW5saW5lIGludCByY19iaXQoc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQxNl90ICpwcm9iKQoreworICB1aW50MzJfdCBib3VuZDsKKyAgaW50IGJpdDsKKworICByY19ub3JtYWxpemUocmMpOworICBib3VuZCA9IChyYy0+cmFuZ2UgPj4gUkNfQklUX01PREVMX1RPVEFMX0JJVFMpICogKnByb2I7CisgIGlmIChyYy0+Y29kZSA8IGJvdW5kKSB7CisgICAgcmMtPnJhbmdlID0gYm91bmQ7CisgICAgKnByb2IgKz0gKFJDX0JJVF9NT0RFTF9UT1RBTCAtICpwcm9iKSA+PiBSQ19NT1ZFX0JJVFM7CisgICAgYml0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICByYy0+cmFuZ2UgLT0gYm91bmQ7CisgICAgcmMtPmNvZGUgLT0gYm91bmQ7CisgICAgKnByb2IgLT0gKnByb2IgPj4gUkNfTU9WRV9CSVRTOworICAgIGJpdCA9IDE7CisgIH0KKworICByZXR1cm4gYml0OworfQorCisvKiBEZWNvZGUgYSBiaXR0cmVlIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCByY19iaXR0cmVlKHN0cnVjdCByY19kZWMgKnJjLAorICAgICAgICAgICAgIHVpbnQxNl90ICpwcm9icywgdWludDMyX3QgbGltaXQpCit7CisgIHVpbnQzMl90IHN5bWJvbCA9IDE7CisKKyAgZG8geworICAgIGlmIChyY19iaXQocmMsICZwcm9ic1tzeW1ib2xdKSkKKyAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworICAgIGVsc2UKKyAgICAgIHN5bWJvbCA8PD0gMTsKKyAgfSB3aGlsZSAoc3ltYm9sIDwgbGltaXQpOworCisgIHJldHVybiBzeW1ib2w7Cit9CisKKy8qIERlY29kZSBhIGJpdHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX2JpdHRyZWVfcmV2ZXJzZShzdHJ1Y3QgcmNfZGVjICpyYywKKyAgICAgICAgICAgICAgICAgdWludDE2X3QgKnByb2JzLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisgIHVpbnQzMl90IHN5bWJvbCA9IDE7CisgIHVpbnQzMl90IGkgPSAwOworCisgIGRvIHsKKyAgICBpZiAocmNfYml0KHJjLCAmcHJvYnNbc3ltYm9sXSkpIHsKKyAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworICAgICAgKmRlc3QgKz0gMSA8PCBpOworICAgIH0gZWxzZSB7CisgICAgICBzeW1ib2wgPDw9IDE7CisgICAgfQorICB9IHdoaWxlICgrK2kgPCBsaW1pdCk7Cit9CisKKy8qIERlY29kZSBkaXJlY3QgYml0cyAoZml4ZWQgZmlmdHktZmlmdHkgcHJvYmFiaWxpdHkpICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfZGlyZWN0KHN0cnVjdCByY19kZWMgKnJjLCB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisgIHVpbnQzMl90IG1hc2s7CisKKyAgZG8geworICAgIHJjX25vcm1hbGl6ZShyYyk7CisgICAgcmMtPnJhbmdlID4+PSAxOworICAgIHJjLT5jb2RlIC09IHJjLT5yYW5nZTsKKyAgICBtYXNrID0gKHVpbnQzMl90KTAgLSAocmMtPmNvZGUgPj4gMzEpOworICAgIHJjLT5jb2RlICs9IHJjLT5yYW5nZSAmIG1hc2s7CisgICAgKmRlc3QgPSAoKmRlc3QgPDwgMSkgKyAobWFzayArIDEpOworICB9IHdoaWxlICgtLWxpbWl0ID4gMCk7Cit9CisKKy8qKioqKioqKgorICogTFpNQSAqCisgKioqKioqKiovCisKKy8qIEdldCBwb2ludGVyIHRvIGxpdGVyYWwgY29kZXIgcHJvYmFiaWxpdHkgYXJyYXkuICovCitzdGF0aWMgdWludDE2X3QgKmx6bWFfbGl0ZXJhbF9wcm9icyhzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworICB1aW50MzJfdCBwcmV2X2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgMCk7CisgIHVpbnQzMl90IGxvdyA9IHByZXZfYnl0ZSA+PiAoOCAtIHMtPmx6bWEubGMpOworICB1aW50MzJfdCBoaWdoID0gKHMtPmRpY3QucG9zICYgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrKSA8PCBzLT5sem1hLmxjOworICByZXR1cm4gcy0+bHptYS5saXRlcmFsW2xvdyArIGhpZ2hdOworfQorCisvKiBEZWNvZGUgYSBsaXRlcmFsIChvbmUgOC1iaXQgYnl0ZSkgKi8KK3N0YXRpYyB2b2lkIGx6bWFfbGl0ZXJhbChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworICB1aW50MTZfdCAqcHJvYnM7CisgIHVpbnQzMl90IHN5bWJvbDsKKyAgdWludDMyX3QgbWF0Y2hfYnl0ZTsKKyAgdWludDMyX3QgbWF0Y2hfYml0OworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQzMl90IGk7CisKKyAgcHJvYnMgPSBsem1hX2xpdGVyYWxfcHJvYnMocyk7CisKKyAgaWYgKGx6bWFfc3RhdGVfaXNfbGl0ZXJhbChzLT5sem1hLnN0YXRlKSkgeworICAgIHN5bWJvbCA9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgMHgxMDApOworICB9IGVsc2UgeworICAgIHN5bWJvbCA9IDE7CisgICAgbWF0Y2hfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCBzLT5sem1hLnJlcDApIDw8IDE7CisgICAgb2Zmc2V0ID0gMHgxMDA7CisKKyAgICBkbyB7CisgICAgICBtYXRjaF9iaXQgPSBtYXRjaF9ieXRlICYgb2Zmc2V0OworICAgICAgbWF0Y2hfYnl0ZSA8PD0gMTsKKyAgICAgIGkgPSBvZmZzZXQgKyBtYXRjaF9iaXQgKyBzeW1ib2w7CisKKyAgICAgIGlmIChyY19iaXQoJnMtPnJjLCAmcHJvYnNbaV0pKSB7CisgICAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworICAgICAgICBvZmZzZXQgJj0gbWF0Y2hfYml0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ltYm9sIDw8PSAxOworICAgICAgICBvZmZzZXQgJj0gfm1hdGNoX2JpdDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChzeW1ib2wgPCAweDEwMCk7CisgIH0KKworICBkaWN0X3B1dCgmcy0+ZGljdCwgKHVpbnQ4X3Qpc3ltYm9sKTsKKyAgbHptYV9zdGF0ZV9saXRlcmFsKCZzLT5sem1hLnN0YXRlKTsKK30KKworLyogRGVjb2RlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGludG8gcy0+bHptYS5sZW4uICovCitzdGF0aWMgdm9pZCBsem1hX2xlbihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgbHptYV9sZW5fZGVjICpsLAorICAgICAgICAgdWludDMyX3QgcG9zX3N0YXRlKQoreworICB1aW50MTZfdCAqcHJvYnM7CisgIHVpbnQzMl90IGxpbWl0OworCisgIGlmICghcmNfYml0KCZzLT5yYywgJmwtPmNob2ljZSkpIHsKKyAgICBwcm9icyA9IGwtPmxvd1twb3Nfc3RhdGVdOworICAgIGxpbWl0ID0gTEVOX0xPV19TWU1CT0xTOworICAgIHMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UyKSkgeworICAgICAgcHJvYnMgPSBsLT5taWRbcG9zX3N0YXRlXTsKKyAgICAgIGxpbWl0ID0gTEVOX01JRF9TWU1CT0xTOworICAgICAgcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTOworICAgIH0gZWxzZSB7CisgICAgICBwcm9icyA9IGwtPmhpZ2g7CisgICAgICBsaW1pdCA9IExFTl9ISUdIX1NZTUJPTFM7CisgICAgICBzLT5sem1hLmxlbiA9IE1BVENIX0xFTl9NSU4gKyBMRU5fTE9XX1NZTUJPTFMKKyAgICAgICAgICArIExFTl9NSURfU1lNQk9MUzsKKyAgICB9CisgIH0KKworICBzLT5sem1hLmxlbiArPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIGxpbWl0KSAtIGxpbWl0OworfQorCisvKiBEZWNvZGUgYSBtYXRjaC4gVGhlIGRpc3RhbmNlIHdpbGwgYmUgc3RvcmVkIGluIHMtPmx6bWEucmVwMC4gKi8KK3N0YXRpYyB2b2lkIGx6bWFfbWF0Y2goc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDMyX3QgcG9zX3N0YXRlKQoreworICB1aW50MTZfdCAqcHJvYnM7CisgIHVpbnQzMl90IGRpc3Rfc2xvdDsKKyAgdWludDMyX3QgbGltaXQ7CisKKyAgbHptYV9zdGF0ZV9tYXRjaCgmcy0+bHptYS5zdGF0ZSk7CisKKyAgcy0+bHptYS5yZXAzID0gcy0+bHptYS5yZXAyOworICBzLT5sem1hLnJlcDIgPSBzLT5sem1hLnJlcDE7CisgIHMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKworICBsem1hX2xlbihzLCAmcy0+bHptYS5tYXRjaF9sZW5fZGVjLCBwb3Nfc3RhdGUpOworCisgIHByb2JzID0gcy0+bHptYS5kaXN0X3Nsb3RbbHptYV9nZXRfZGlzdF9zdGF0ZShzLT5sem1hLmxlbildOworICBkaXN0X3Nsb3QgPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIERJU1RfU0xPVFMpIC0gRElTVF9TTE9UUzsKKworICBpZiAoZGlzdF9zbG90IDwgRElTVF9NT0RFTF9TVEFSVCkgeworICAgIHMtPmx6bWEucmVwMCA9IGRpc3Rfc2xvdDsKKyAgfSBlbHNlIHsKKyAgICBsaW1pdCA9IChkaXN0X3Nsb3QgPj4gMSkgLSAxOworICAgIHMtPmx6bWEucmVwMCA9IDIgKyAoZGlzdF9zbG90ICYgMSk7CisKKyAgICBpZiAoZGlzdF9zbG90IDwgRElTVF9NT0RFTF9FTkQpIHsKKyAgICAgIHMtPmx6bWEucmVwMCA8PD0gbGltaXQ7CisgICAgICBwcm9icyA9IHMtPmx6bWEuZGlzdF9zcGVjaWFsICsgcy0+bHptYS5yZXAwCisgICAgICAgICAgLSBkaXN0X3Nsb3QgLSAxOworICAgICAgcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcHJvYnMsCisgICAgICAgICAgJnMtPmx6bWEucmVwMCwgbGltaXQpOworICAgIH0gZWxzZSB7CisgICAgICByY19kaXJlY3QoJnMtPnJjLCAmcy0+bHptYS5yZXAwLCBsaW1pdCAtIEFMSUdOX0JJVFMpOworICAgICAgcy0+bHptYS5yZXAwIDw8PSBBTElHTl9CSVRTOworICAgICAgcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcy0+bHptYS5kaXN0X2FsaWduLAorICAgICAgICAgICZzLT5sem1hLnJlcDAsIEFMSUdOX0JJVFMpOworICAgIH0KKyAgfQorfQorCisvKgorICogRGVjb2RlIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgdGhlIGZvdXIgbW9zdCByZWNlbnRseQorICogc2VlbiBtYXRjaGVzLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLgorICovCitzdGF0aWMgdm9pZCBsem1hX3JlcF9tYXRjaChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50MzJfdCBwb3Nfc3RhdGUpCit7CisgIHVpbnQzMl90IHRtcDsKKworICBpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDBbcy0+bHptYS5zdGF0ZV0pKSB7CisgICAgaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAwX2xvbmdbCisgICAgICAgIHMtPmx6bWEuc3RhdGVdW3Bvc19zdGF0ZV0pKSB7CisgICAgICBsem1hX3N0YXRlX3Nob3J0X3JlcCgmcy0+bHptYS5zdGF0ZSk7CisgICAgICBzLT5sem1hLmxlbiA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMVtzLT5sem1hLnN0YXRlXSkpIHsKKyAgICAgIHRtcCA9IHMtPmx6bWEucmVwMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAyW3MtPmx6bWEuc3RhdGVdKSkgeworICAgICAgICB0bXAgPSBzLT5sem1hLnJlcDI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBzLT5sem1hLnJlcDM7CisgICAgICAgIHMtPmx6bWEucmVwMyA9IHMtPmx6bWEucmVwMjsKKyAgICAgIH0KKworICAgICAgcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworICAgIH0KKworICAgIHMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKyAgICBzLT5sem1hLnJlcDAgPSB0bXA7CisgIH0KKworICBsem1hX3N0YXRlX2xvbmdfcmVwKCZzLT5sem1hLnN0YXRlKTsKKyAgbHptYV9sZW4ocywgJnMtPmx6bWEucmVwX2xlbl9kZWMsIHBvc19zdGF0ZSk7Cit9CisKKy8qIExaTUEgZGVjb2RlciBjb3JlICovCitzdGF0aWMgaW50IGx6bWFfbWFpbihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworICB1aW50MzJfdCBwb3Nfc3RhdGU7CisKKyAgLyoKKyAgICogSWYgdGhlIGRpY3Rpb25hcnkgd2FzIHJlYWNoZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBjYWxsLCB0cnkgdG8KKyAgICogZmluaXNoIHRoZSBwb3NzaWJseSBwZW5kaW5nIHJlcGVhdCBpbiB0aGUgZGljdGlvbmFyeS4KKyAgICovCisgIGlmIChkaWN0X2hhc19zcGFjZSgmcy0+ZGljdCkgJiYgcy0+bHptYS5sZW4gPiAwKQorICAgIGRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCk7CisKKyAgLyoKKyAgICogRGVjb2RlIG1vcmUgTFpNQSBzeW1ib2xzLiBPbmUgaXRlcmF0aW9uIG1heSBjb25zdW1lIHVwIHRvCisgICAqIExaTUFfSU5fUkVRVUlSRUQgLSAxIGJ5dGVzLgorICAgKi8KKyAgd2hpbGUgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiAhcmNfbGltaXRfZXhjZWVkZWQoJnMtPnJjKSkgeworICAgIHBvc19zdGF0ZSA9IHMtPmRpY3QucG9zICYgcy0+bHptYS5wb3NfbWFzazsKKworICAgIGlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfbWF0Y2hbCisgICAgICAgIHMtPmx6bWEuc3RhdGVdW3Bvc19zdGF0ZV0pKSB7CisgICAgICBsem1hX2xpdGVyYWwocyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXBbcy0+bHptYS5zdGF0ZV0pKQorICAgICAgICBsem1hX3JlcF9tYXRjaChzLCBwb3Nfc3RhdGUpOworICAgICAgZWxzZQorICAgICAgICBsem1hX21hdGNoKHMsIHBvc19zdGF0ZSk7CisKKyAgICAgIGlmICghZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogSGF2aW5nIHRoZSByYW5nZSBkZWNvZGVyIGFsd2F5cyBub3JtYWxpemVkIHdoZW4gd2UgYXJlIG91dHNpZGUKKyAgICogdGhpcyBmdW5jdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBlbmQgb2YgdGhlIGNodW5rLgorICAgKi8KKyAgcmNfbm9ybWFsaXplKCZzLT5yYyk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgTFpNQSBkZWNvZGVyIGFuZCByYW5nZSBkZWNvZGVyIHN0YXRlLiBEaWN0aW9uYXJ5IGlzIG5vcmUgcmVzZXQKKyAqIGhlcmUsIGJlY2F1c2UgTFpNQSBzdGF0ZSBtYXkgYmUgcmVzZXQgd2l0aG91dCByZXNldHRpbmcgdGhlIGRpY3Rpb25hcnkuCisgKi8KK3N0YXRpYyB2b2lkIGx6bWFfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKyAgdWludDE2X3QgKnByb2JzOworICBzaXplX3QgaTsKKworICBzLT5sem1hLnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKyAgcy0+bHptYS5yZXAwID0gMDsKKyAgcy0+bHptYS5yZXAxID0gMDsKKyAgcy0+bHptYS5yZXAyID0gMDsKKyAgcy0+bHptYS5yZXAzID0gMDsKKworICAvKgorICAgKiBBbGwgcHJvYmFiaWxpdGllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWUuIFRoaXMgaGFjaworICAgKiBtYWtlcyB0aGUgY29kZSBzbWFsbGVyIGJ5IGF2b2lkaW5nIGEgc2VwYXJhdGUgbG9vcCBmb3IgZWFjaAorICAgKiBwcm9iYWJpbGl0eSBhcnJheS4KKyAgICoKKyAgICogVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgc28gdGhhdCBvbmx5IHRoYXQgcGFydCBvZiBsaXRlcmFsCisgICAqIHByb2JhYmlsaXRpZXMgdGhhdCBhcmUgYWN0dWFsbHkgcmVxdWlyZWQuIEluIHRoZSBjb21tb24gY2FzZQorICAgKiB3ZSB3b3VsZCB3cml0ZSAxMiBLaUIgbGVzcy4KKyAgICovCisgIHByb2JzID0gcy0+bHptYS5pc19tYXRjaFswXTsKKyAgZm9yIChpID0gMDsgaSA8IFBST0JTX1RPVEFMOyArK2kpCisgICAgcHJvYnNbaV0gPSBSQ19CSVRfTU9ERUxfVE9UQUwgLyAyOworCisgIHJjX3Jlc2V0KCZzLT5yYyk7Cit9CisKKy8qCisgKiBEZWNvZGUgYW5kIHZhbGlkYXRlIExaTUEgcHJvcGVydGllcyAobGMvbHAvcGIpIGFuZCBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcworICogZnJvbSB0aGUgZGVjb2RlZCBscCBhbmQgcGIgdmFsdWVzLiBPbiBzdWNjZXNzLCB0aGUgTFpNQSBkZWNvZGVyIHN0YXRlIGlzCisgKiByZXNldCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBsem1hX3Byb3BzKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisgIGlmIChwcm9wcyA+ICg0ICogNSArIDQpICogOSArIDgpCisgICAgcmV0dXJuIDA7CisKKyAgcy0+bHptYS5wb3NfbWFzayA9IDA7CisgIHdoaWxlIChwcm9wcyA+PSA5ICogNSkgeworICAgIHByb3BzIC09IDkgKiA1OworICAgICsrcy0+bHptYS5wb3NfbWFzazsKKyAgfQorCisgIHMtPmx6bWEucG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLnBvc19tYXNrKSAtIDE7CisKKyAgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID0gMDsKKyAgd2hpbGUgKHByb3BzID49IDkpIHsKKyAgICBwcm9wcyAtPSA5OworICAgICsrcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrOworICB9CisKKyAgcy0+bHptYS5sYyA9IHByb3BzOworCisgIGlmIChzLT5sem1hLmxjICsgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID4gNCkKKyAgICByZXR1cm4gMDsKKworICBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2spIC0gMTsKKworICBsem1hX3Jlc2V0KHMpOworCisgIHJldHVybiAxOworfQorCisvKioqKioqKioqCisgKiBMWk1BMiAqCisgKioqKioqKioqLworCisvKgorICogVGhlIExaTUEgZGVjb2RlciBhc3N1bWVzIHRoYXQgaWYgdGhlIGlucHV0IGxpbWl0IChzLT5yYy5pbl9saW1pdCkgaGFzbid0CisgKiBiZWVuIGV4Y2VlZGVkLCBpdCBpcyBzYWZlIHRvIHJlYWQgdXAgdG8gTFpNQV9JTl9SRVFVSVJFRCBieXRlcy4gVGhpcworICogd3JhcHBlciBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIG1ha2luZyB0aGUgTFpNQSBkZWNvZGVyJ3MgYXNzdW1wdGlvbiBzYWZlLgorICoKKyAqIEFzIGxvbmcgYXMgdGhlcmUgaXMgcGxlbnR5IG9mIGlucHV0IGxlZnQgdG8gYmUgZGVjb2RlZCBpbiB0aGUgY3VycmVudCBMWk1BCisgKiBjaHVuaywgd2UgZGVjb2RlIGRpcmVjdGx5IGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgdW50aWwKKyAqIHRoZXJlJ3MgTFpNQV9JTl9SRVFVSVJFRCBieXRlcyBsZWZ0LiBUaG9zZSByZW1haW5pbmcgYnl0ZXMgYXJlIGNvcGllZCBpbnRvCisgKiBzLT50ZW1wLmJ1Ziwgd2hpY2ggKGhvcGVmdWxseSkgZ2V0cyBmaWxsZWQgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzCisgKiBmdW5jdGlvbi4gV2UgZGVjb2RlIGEgZmV3IGJ5dGVzIGZyb20gdGhlIHRlbXBvcmFyeSBidWZmZXIgc28gdGhhdCB3ZSBjYW4KKyAqIGNvbnRpbnVlIGRlY29kaW5nIGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgYWdhaW4uCisgKi8KK3N0YXRpYyBpbnQgbHptYTJfbHptYShzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworICBzaXplX3QgaW5fYXZhaWw7CisgIHVpbnQzMl90IHRtcDsKKworICBpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisgIGlmIChzLT50ZW1wLnNpemUgPiAwIHx8IHMtPmx6bWEyLmNvbXByZXNzZWQgPT0gMCkgeworICAgIHRtcCA9IDIgKiBMWk1BX0lOX1JFUVVJUkVEIC0gcy0+dGVtcC5zaXplOworICAgIGlmICh0bXAgPiBzLT5sem1hMi5jb21wcmVzc2VkIC0gcy0+dGVtcC5zaXplKQorICAgICAgdG1wID0gcy0+bHptYTIuY29tcHJlc3NlZCAtIHMtPnRlbXAuc2l6ZTsKKyAgICBpZiAodG1wID4gaW5fYXZhaWwpCisgICAgICB0bXAgPSBpbl9hdmFpbDsKKworICAgIG1lbWNweShzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSwgYi0+aW4gKyBiLT5pbl9wb3MsIHRtcCk7CisKKyAgICBpZiAocy0+dGVtcC5zaXplICsgdG1wID09IHMtPmx6bWEyLmNvbXByZXNzZWQpIHsKKyAgICAgIG1lbXNldChzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSArIHRtcCwgMCwKKyAgICAgICAgICBzaXplb2Yocy0+dGVtcC5idWYpCisgICAgICAgICAgICAtIHMtPnRlbXAuc2l6ZSAtIHRtcCk7CisgICAgICBzLT5yYy5pbl9saW1pdCA9IHMtPnRlbXAuc2l6ZSArIHRtcDsKKyAgICB9IGVsc2UgaWYgKHMtPnRlbXAuc2l6ZSArIHRtcCA8IExaTUFfSU5fUkVRVUlSRUQpIHsKKyAgICAgIHMtPnRlbXAuc2l6ZSArPSB0bXA7CisgICAgICBiLT5pbl9wb3MgKz0gdG1wOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHMtPnJjLmluX2xpbWl0ID0gcy0+dGVtcC5zaXplICsgdG1wIC0gTFpNQV9JTl9SRVFVSVJFRDsKKyAgICB9CisKKyAgICBzLT5yYy5pbiA9IHMtPnRlbXAuYnVmOworICAgIHMtPnJjLmluX3BvcyA9IDA7CisKKyAgICBpZiAoIWx6bWFfbWFpbihzKSB8fCBzLT5yYy5pbl9wb3MgPiBzLT50ZW1wLnNpemUgKyB0bXApCisgICAgICByZXR1cm4gMDsKKworICAgIHMtPmx6bWEyLmNvbXByZXNzZWQgLT0gcy0+cmMuaW5fcG9zOworCisgICAgaWYgKHMtPnJjLmluX3BvcyA8IHMtPnRlbXAuc2l6ZSkgeworICAgICAgcy0+dGVtcC5zaXplIC09IHMtPnJjLmluX3BvczsKKyAgICAgIG1lbW1vdmUocy0+dGVtcC5idWYsIHMtPnRlbXAuYnVmICsgcy0+cmMuaW5fcG9zLAorICAgICAgICAgIHMtPnRlbXAuc2l6ZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBiLT5pbl9wb3MgKz0gcy0+cmMuaW5fcG9zIC0gcy0+dGVtcC5zaXplOworICAgIHMtPnRlbXAuc2l6ZSA9IDA7CisgIH0KKworICBpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisgIGlmIChpbl9hdmFpbCA+PSBMWk1BX0lOX1JFUVVJUkVEKSB7CisgICAgcy0+cmMuaW4gPSBiLT5pbjsKKyAgICBzLT5yYy5pbl9wb3MgPSBiLT5pbl9wb3M7CisKKyAgICBpZiAoaW5fYXZhaWwgPj0gcy0+bHptYTIuY29tcHJlc3NlZCArIExaTUFfSU5fUkVRVUlSRUQpCisgICAgICBzLT5yYy5pbl9saW1pdCA9IGItPmluX3BvcyArIHMtPmx6bWEyLmNvbXByZXNzZWQ7CisgICAgZWxzZQorICAgICAgcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9zaXplIC0gTFpNQV9JTl9SRVFVSVJFRDsKKworICAgIGlmICghbHptYV9tYWluKHMpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpbl9hdmFpbCA9IHMtPnJjLmluX3BvcyAtIGItPmluX3BvczsKKyAgICBpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKSByZXR1cm4gMDsKKworICAgIHMtPmx6bWEyLmNvbXByZXNzZWQgLT0gaW5fYXZhaWw7CisgICAgYi0+aW5fcG9zID0gcy0+cmMuaW5fcG9zOworICB9CisKKyAgaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworICBpZiAoaW5fYXZhaWwgPCBMWk1BX0lOX1JFUVVJUkVEKSB7CisgICAgaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKyAgICAgIGluX2F2YWlsID0gcy0+bHptYTIuY29tcHJlc3NlZDsKKworICAgIG1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+aW4gKyBiLT5pbl9wb3MsIGluX2F2YWlsKTsKKyAgICBzLT50ZW1wLnNpemUgPSBpbl9hdmFpbDsKKyAgICBiLT5pbl9wb3MgKz0gaW5fYXZhaWw7CisgIH0KKworICByZXR1cm4gMTsKK30KKworLyoKKyAqIFRha2UgY2FyZSBvZiB0aGUgTFpNQTIgY29udHJvbCBsYXllciwgYW5kIGZvcndhcmQgdGhlIGpvYiBvZiBhY3R1YWwgTFpNQQorICogZGVjb2Rpbmcgb3IgY29weWluZyBvZiB1bmNvbXByZXNzZWQgY2h1bmtzIHRvIG90aGVyIGZ1bmN0aW9ucy4KKyAqLworZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3J1bihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLAorICAgICAgICAgICAgICAgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgdWludDMyX3QgdG1wOworCisgIHdoaWxlIChiLT5pbl9wb3MgPCBiLT5pbl9zaXplIHx8IHMtPmx6bWEyLnNlcXVlbmNlID09IFNFUV9MWk1BX1JVTikgeworICAgIHN3aXRjaCAocy0+bHptYTIuc2VxdWVuY2UpIHsKKyAgICBjYXNlIFNFUV9DT05UUk9MOgorICAgICAgLyoKKyAgICAgICAqIExaTUEyIGNvbnRyb2wgYnl0ZQorICAgICAgICoKKyAgICAgICAqIEV4YWN0IHZhbHVlczoKKyAgICAgICAqICAgMHgwMCAgIEVuZCBtYXJrZXIKKyAgICAgICAqICAgMHgwMSAgIERpY3Rpb25hcnkgcmVzZXQgZm9sbG93ZWQgYnkKKyAgICAgICAqICAgICAgICAgIGFuIHVuY29tcHJlc3NlZCBjaHVuaworICAgICAgICogICAweDAyICAgVW5jb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5IHJlc2V0KQorICAgICAgICoKKyAgICAgICAqIEhpZ2hlc3QgdGhyZWUgYml0cyAocy0+Y29udHJvbCAmIDB4RTApOgorICAgICAgICogICAweEUwICAgRGljdGlvbmFyeSByZXNldCwgbmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlCisgICAgICAgKiAgICAgICAgICByZXNldCwgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rCisgICAgICAgKiAgIDB4QzAgICBOZXcgcHJvcGVydGllcyBhbmQgc3RhdGUgcmVzZXQsIGZvbGxvd2VkCisgICAgICAgKiAgICAgICAgICBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vIGRpY3Rpb25hcnkKKyAgICAgICAqICAgICAgICAgIHJlc2V0KQorICAgICAgICogICAweEEwICAgU3RhdGUgcmVzZXQgdXNpbmcgb2xkIHByb3BlcnRpZXMsCisgICAgICAgKiAgICAgICAgICBmb2xsb3dlZCBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vCisgICAgICAgKiAgICAgICAgICBkaWN0aW9uYXJ5IHJlc2V0KQorICAgICAgICogICAweDgwICAgTFpNQSBjaHVuayAobm8gZGljdGlvbmFyeSBvciBzdGF0ZSByZXNldCkKKyAgICAgICAqCisgICAgICAgKiBGb3IgTFpNQSBjb21wcmVzc2VkIGNodW5rcywgdGhlIGxvd2VzdCBmaXZlIGJpdHMKKyAgICAgICAqIChzLT5jb250cm9sICYgMUYpIGFyZSB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZQorICAgICAgICogdW5jb21wcmVzc2VkIHNpemUgKGJpdHMgMTYtMjApLgorICAgICAgICoKKyAgICAgICAqIEEgbmV3IExaTUEyIHN0cmVhbSBtdXN0IGJlZ2luIHdpdGggYSBkaWN0aW9uYXJ5CisgICAgICAgKiByZXNldC4gVGhlIGZpcnN0IExaTUEgY2h1bmsgbXVzdCBzZXQgbmV3CisgICAgICAgKiBwcm9wZXJ0aWVzIGFuZCByZXNldCB0aGUgTFpNQSBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBWYWx1ZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBkZXNjcmliZWQgYWJvdmUKKyAgICAgICAqIGFyZSBpbnZhbGlkIGFuZCB3ZSByZXR1cm4gWFpfREFUQV9FUlJPUi4KKyAgICAgICAqLworICAgICAgdG1wID0gYi0+aW5bYi0+aW5fcG9zKytdOworCisgICAgICBpZiAodG1wID09IDB4MDApCisgICAgICAgIHJldHVybiBYWl9TVFJFQU1fRU5EOworCisgICAgICBpZiAodG1wID49IDB4RTAgfHwgdG1wID09IDB4MDEpIHsKKyAgICAgICAgcy0+bHptYTIubmVlZF9wcm9wcyA9IDE7CisgICAgICAgIHMtPmx6bWEyLm5lZWRfZGljdF9yZXNldCA9IDA7CisgICAgICAgIGRpY3RfcmVzZXQoJnMtPmRpY3QpOworICAgICAgfSBlbHNlIGlmIChzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQpIHsKKyAgICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisgICAgICB9CisKKyAgICAgIGlmICh0bXAgPj0gMHg4MCkgeworICAgICAgICBzLT5sem1hMi51bmNvbXByZXNzZWQgPSAodG1wICYgMHgxRikgPDwgMTY7CisgICAgICAgIHMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX1VOQ09NUFJFU1NFRF8xOworCisgICAgICAgIGlmICh0bXAgPj0gMHhDMCkgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2hlbiB0aGVyZSBhcmUgbmV3IHByb3BlcnRpZXMsCisgICAgICAgICAgICogc3RhdGUgcmVzZXQgaXMgZG9uZSBhdAorICAgICAgICAgICAqIFNFUV9QUk9QRVJUSUVTLgorICAgICAgICAgICAqLworICAgICAgICAgIHMtPmx6bWEyLm5lZWRfcHJvcHMgPSAwOworICAgICAgICAgIHMtPmx6bWEyLm5leHRfc2VxdWVuY2UKKyAgICAgICAgICAgICAgPSBTRVFfUFJPUEVSVElFUzsKKworICAgICAgICB9IGVsc2UgaWYgKHMtPmx6bWEyLm5lZWRfcHJvcHMpIHsKKyAgICAgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHMtPmx6bWEyLm5leHRfc2VxdWVuY2UKKyAgICAgICAgICAgICAgPSBTRVFfTFpNQV9QUkVQQVJFOworICAgICAgICAgIGlmICh0bXAgPj0gMHhBMCkKKyAgICAgICAgICAgIGx6bWFfcmVzZXQocyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0bXAgPiAweDAyKQorICAgICAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgICAgICAgIHMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMDsKKyAgICAgICAgcy0+bHptYTIubmV4dF9zZXF1ZW5jZSA9IFNFUV9DT1BZOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VRX1VOQ09NUFJFU1NFRF8xOgorICAgICAgcy0+bHptYTIudW5jb21wcmVzc2VkCisgICAgICAgICAgKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSA8PCA4OworICAgICAgcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfVU5DT01QUkVTU0VEXzI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VRX1VOQ09NUFJFU1NFRF8yOgorICAgICAgcy0+bHptYTIudW5jb21wcmVzc2VkCisgICAgICAgICAgKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisgICAgICBzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VRX0NPTVBSRVNTRURfMDoKKyAgICAgIHMtPmx6bWEyLmNvbXByZXNzZWQKKyAgICAgICAgICA9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKyAgICAgIHMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTRVFfQ09NUFJFU1NFRF8xOgorICAgICAgcy0+bHptYTIuY29tcHJlc3NlZAorICAgICAgICAgICs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gKyAxOworICAgICAgcy0+bHptYTIuc2VxdWVuY2UgPSBzLT5sem1hMi5uZXh0X3NlcXVlbmNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFUV9QUk9QRVJUSUVTOgorICAgICAgaWYgKCFsem1hX3Byb3BzKHMsIGItPmluW2ItPmluX3BvcysrXSkpCisgICAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgICAgICBzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9MWk1BX1BSRVBBUkU7CisKKyAgICBjYXNlIFNFUV9MWk1BX1BSRVBBUkU6CisgICAgICBpZiAocy0+bHptYTIuY29tcHJlc3NlZCA8IFJDX0lOSVRfQllURVMpCisgICAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgICAgICBpZiAoIXJjX3JlYWRfaW5pdCgmcy0+cmMsIGIpKQorICAgICAgICByZXR1cm4gWFpfT0s7CisKKyAgICAgIHMtPmx6bWEyLmNvbXByZXNzZWQgLT0gUkNfSU5JVF9CWVRFUzsKKyAgICAgIHMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUlVOOworCisgICAgY2FzZSBTRVFfTFpNQV9SVU46CisgICAgICAvKgorICAgICAgICogU2V0IGRpY3Rpb25hcnkgbGltaXQgdG8gaW5kaWNhdGUgaG93IG11Y2ggd2Ugd2FudAorICAgICAgICogdG8gYmUgZW5jb2RlZCBhdCBtYXhpbXVtLiBEZWNvZGUgbmV3IGRhdGEgaW50byB0aGUKKyAgICAgICAqIGRpY3Rpb25hcnkuIEZsdXNoIHRoZSBuZXcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8KKyAgICAgICAqIGItPm91dC4gQ2hlY2sgaWYgd2UgZmluaXNoZWQgZGVjb2RpbmcgdGhpcyBjaHVuay4KKyAgICAgICAqIEluIGNhc2UgdGhlIGRpY3Rpb25hcnkgZ290IGZ1bGwgYnV0IHdlIGRpZG4ndCBmaWxsCisgICAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlciB5ZXQsIHdlIG1heSBydW4gdGhpcyBsb29wCisgICAgICAgKiBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNoYW5naW5nIHMtPmx6bWEyLnNlcXVlbmNlLgorICAgICAgICovCisgICAgICBkaWN0X2xpbWl0KCZzLT5kaWN0LCBtaW5fdChzaXplX3QsCisgICAgICAgICAgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zLAorICAgICAgICAgIHMtPmx6bWEyLnVuY29tcHJlc3NlZCkpOworICAgICAgaWYgKCFsem1hMl9sem1hKHMsIGIpKQorICAgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgICAgcy0+bHptYTIudW5jb21wcmVzc2VkIC09IGRpY3RfZmx1c2goJnMtPmRpY3QsIGIpOworCisgICAgICBpZiAocy0+bHptYTIudW5jb21wcmVzc2VkID09IDApIHsKKyAgICAgICAgaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPiAwIHx8IHMtPmx6bWEubGVuID4gMAorICAgICAgICAgICAgfHwgIXJjX2lzX2ZpbmlzaGVkKCZzLT5yYykpCisgICAgICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKyAgICAgICAgcmNfcmVzZXQoJnMtPnJjKTsKKyAgICAgICAgcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKworICAgICAgfSBlbHNlIGlmIChiLT5vdXRfcG9zID09IGItPm91dF9zaXplCisgICAgICAgICAgfHwgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplCisgICAgICAgICAgICAmJiBzLT50ZW1wLnNpemUKKyAgICAgICAgICAgIDwgcy0+bHptYTIuY29tcHJlc3NlZCkpIHsKKyAgICAgICAgcmV0dXJuIFhaX09LOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VRX0NPUFk6CisgICAgICBkaWN0X3VuY29tcHJlc3NlZCgmcy0+ZGljdCwgYiwgJnMtPmx6bWEyLmNvbXByZXNzZWQpOworICAgICAgaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPiAwKQorICAgICAgICByZXR1cm4gWFpfT0s7CisKKyAgICAgIHMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gWFpfT0s7Cit9CisKK3N0cnVjdCB4el9kZWNfbHptYTIgKnh6X2RlY19sem1hMl9jcmVhdGUodWludDMyX3QgZGljdF9tYXgpCit7CisgIHN0cnVjdCB4el9kZWNfbHptYTIgKnMgPSBtYWxsb2Moc2l6ZW9mKCpzKSk7CisgIGlmIChzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcy0+ZGljdC5zaXplX21heCA9IGRpY3RfbWF4OworICBzLT5kaWN0LmJ1ZiA9IE5VTEw7CisgIHMtPmRpY3QuYWxsb2NhdGVkID0gMDsKKworICByZXR1cm4gczsKK30KKworZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3Jlc2V0KHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisgIC8qIFRoaXMgbGltaXRzIGRpY3Rpb25hcnkgc2l6ZSB0byAzIEdpQiB0byBrZWVwIHBhcnNpbmcgc2ltcGxlci4gKi8KKyAgaWYgKHByb3BzID4gMzkpCisgICAgcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKyAgcy0+ZGljdC5zaXplID0gMiArIChwcm9wcyAmIDEpOworICBzLT5kaWN0LnNpemUgPDw9IChwcm9wcyA+PiAxKSArIDExOworCisgIGlmIChzLT5kaWN0LnNpemUgPiBzLT5kaWN0LnNpemVfbWF4KQorICAgIHJldHVybiBYWl9NRU1MSU1JVF9FUlJPUjsKKworICBzLT5kaWN0LmVuZCA9IHMtPmRpY3Quc2l6ZTsKKworICBpZiAocy0+ZGljdC5hbGxvY2F0ZWQgPCBzLT5kaWN0LnNpemUpIHsKKyAgICBmcmVlKHMtPmRpY3QuYnVmKTsKKyAgICBzLT5kaWN0LmJ1ZiA9IG1hbGxvYyhzLT5kaWN0LnNpemUpOworICAgIGlmIChzLT5kaWN0LmJ1ZiA9PSBOVUxMKSB7CisgICAgICBzLT5kaWN0LmFsbG9jYXRlZCA9IDA7CisgICAgICByZXR1cm4gWFpfTUVNX0VSUk9SOworICAgIH0KKyAgfQorCisgIHMtPmx6bWEubGVuID0gMDsKKworICBzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworICBzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSAxOworCisgIHMtPnRlbXAuc2l6ZSA9IDA7CisKKyAgcmV0dXJuIFhaX09LOworfQorCisvKgorICogLnh6IFN0cmVhbSBkZWNvZGVyCisgKi8KKworCisvLyBCRUdJTiB4el9zdHJlYW0uaAorLyoKKyAqIERlZmluaXRpb25zIGZvciBoYW5kbGluZyB0aGUgLnh6IGZpbGUgZm9ybWF0CisgKi8KKworLyoKKyAqIFNlZSB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQKKyAqIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRhaW5lciBmb3JtYXQuCisgKi8KKworI2RlZmluZSBTVFJFQU1fSEVBREVSX1NJWkUgMTIKKworI2RlZmluZSBIRUFERVJfTUFHSUMgIlwzNzU3elhaIgorI2RlZmluZSBIRUFERVJfTUFHSUNfU0laRSA2CisKKyNkZWZpbmUgRk9PVEVSX01BR0lDICJZWiIKKyNkZWZpbmUgRk9PVEVSX01BR0lDX1NJWkUgMgorCisvKgorICogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgY2FuIGhvbGQgYSA2My1iaXQgdW5zaWduZWQgaW50ZWdlciBvciBhIHNwZWNpYWwKKyAqIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAqCisgKiBFeHBlcmltZW50YWw6IHZsaV90eXBlIGNhbiBiZSBkZWZpbmVkIHRvIHVpbnQzMl90IHRvIHNhdmUgYSBmZXcgYnl0ZXMKKyAqIGluIGNvZGUgc2l6ZSAobm8gZWZmZWN0IG9uIHNwZWVkKS4gRG9pbmcgc28gbGltaXRzIHRoZSB1bmNvbXByZXNzZWQgYW5kCisgKiBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgdG8gbGVzcyB0aGFuIDI1NiBNaUIgYW5kIG1heSBhbHNvIHdlYWtlbgorICogZXJyb3IgZGV0ZWN0aW9uIHNsaWdodGx5LgorICovCit0eXBlZGVmIHVpbnQ2NF90IHZsaV90eXBlOworCisjZGVmaW5lIFZMSV9NQVggKCh2bGlfdHlwZSktMSAvIDIpCisjZGVmaW5lIFZMSV9VTktOT1dOICgodmxpX3R5cGUpLTEpCisKKy8qIE1heGltdW0gZW5jb2RlZCBzaXplIG9mIGEgVkxJICovCisjZGVmaW5lIFZMSV9CWVRFU19NQVggKHNpemVvZih2bGlfdHlwZSkgKiA4IC8gNykKKworLyogSW50ZWdyaXR5IENoZWNrIHR5cGVzICovCitlbnVtIHh6X2NoZWNrIHsKKyAgWFpfQ0hFQ0tfTk9ORSA9IDAsCisgIFhaX0NIRUNLX0NSQzMyID0gMSwKKyAgWFpfQ0hFQ0tfQ1JDNjQgPSA0LAorICBYWl9DSEVDS19TSEEyNTYgPSAxMAorfTsKKworLyogTWF4aW11bSBwb3NzaWJsZSBDaGVjayBJRCAqLworI2RlZmluZSBYWl9DSEVDS19NQVggMTUKKy8vIEVORCB4el9zdHJlYW0uaAorCisjZGVmaW5lIElTX0NSQzY0KGNoZWNrX3R5cGUpICgoY2hlY2tfdHlwZSkgPT0gWFpfQ0hFQ0tfQ1JDNjQpCisKKy8qIEhhc2ggdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQgKi8KK3N0cnVjdCB4el9kZWNfaGFzaCB7CisgIHZsaV90eXBlIHVucGFkZGVkOworICB2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisgIHVpbnQzMl90IGNyYzMyOworfTsKKworc3RydWN0IHh6X2RlYyB7CisgIC8qIFBvc2l0aW9uIGluIGRlY19tYWluKCkgKi8KKyAgZW51bSB7CisgICAgU0VRX1NUUkVBTV9IRUFERVIsCisgICAgU0VRX0JMT0NLX1NUQVJULAorICAgIFNFUV9CTE9DS19IRUFERVIsCisgICAgU0VRX0JMT0NLX1VOQ09NUFJFU1MsCisgICAgU0VRX0JMT0NLX1BBRERJTkcsCisgICAgU0VRX0JMT0NLX0NIRUNLLAorICAgIFNFUV9JTkRFWCwKKyAgICBTRVFfSU5ERVhfUEFERElORywKKyAgICBTRVFfSU5ERVhfQ1JDMzIsCisgICAgU0VRX1NUUkVBTV9GT09URVIKKyAgfSBzZXF1ZW5jZTsKKworICAvKiBQb3NpdGlvbiBpbiB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYW5kIENoZWNrIGZpZWxkcyAqLworICB1aW50MzJfdCBwb3M7CisKKyAgLyogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgZGVjb2RlZCBieSBkZWNfdmxpKCkgKi8KKyAgdmxpX3R5cGUgdmxpOworCisgIC8qIFNhdmVkIGluX3BvcyBhbmQgb3V0X3BvcyAqLworICBzaXplX3QgaW5fc3RhcnQ7CisgIHNpemVfdCBvdXRfc3RhcnQ7CisKKyAgLyogQ1JDMzIgb3IgQ1JDNjQgdmFsdWUgaW4gQmxvY2sgb3IgQ1JDMzIgdmFsdWUgaW4gSW5kZXggKi8KKyAgdWludDY0X3QgY3JjOworCisgIC8qIFR5cGUgb2YgdGhlIGludGVncml0eSBjaGVjayBjYWxjdWxhdGVkIGZyb20gdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgZW51bSB4el9jaGVjayBjaGVja190eXBlOworCisgIC8qCisgICAqIFRydWUgaWYgdGhlIG5leHQgY2FsbCB0byB4el9kZWNfcnVuKCkgaXMgYWxsb3dlZCB0byByZXR1cm4KKyAgICogWFpfQlVGX0VSUk9SLgorICAgKi8KKyAgaW50IGFsbG93X2J1Zl9lcnJvcjsKKworICAvKiBJbmZvcm1hdGlvbiBzdG9yZWQgaW4gQmxvY2sgSGVhZGVyICovCisgIHN0cnVjdCB7CisgICAgLyoKKyAgICAgKiBWYWx1ZSBzdG9yZWQgaW4gdGhlIENvbXByZXNzZWQgU2l6ZSBmaWVsZCwgb3IKKyAgICAgKiBWTElfVU5LTk9XTiBpZiBDb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisgICAgICovCisgICAgdmxpX3R5cGUgY29tcHJlc3NlZDsKKworICAgIC8qCisgICAgICogVmFsdWUgc3RvcmVkIGluIHRoZSBVbmNvbXByZXNzZWQgU2l6ZSBmaWVsZCwgb3IKKyAgICAgKiBWTElfVU5LTk9XTiBpZiBVbmNvbXByZXNzZWQgU2l6ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICB2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKyAgICAvKiBTaXplIG9mIHRoZSBCbG9jayBIZWFkZXIgZmllbGQgKi8KKyAgICB1aW50MzJfdCBzaXplOworICB9IGJsb2NrX2hlYWRlcjsKKworICAvKiBJbmZvcm1hdGlvbiBjb2xsZWN0ZWQgd2hlbiBkZWNvZGluZyBCbG9ja3MgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBPYnNlcnZlZCBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKyAgICB2bGlfdHlwZSBjb21wcmVzc2VkOworCisgICAgLyogT2JzZXJ2ZWQgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKyAgICB2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKyAgICAvKiBOdW1iZXIgb2YgQmxvY2tzIGRlY29kZWQgc28gZmFyICovCisgICAgdmxpX3R5cGUgY291bnQ7CisKKyAgICAvKgorICAgICAqIEhhc2ggY2FsY3VsYXRlZCBmcm9tIHRoZSBCbG9jayBzaXplcy4gVGhpcyBpcyB1c2VkIHRvCisgICAgICogdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorICAgICAqLworICAgIHN0cnVjdCB4el9kZWNfaGFzaCBoYXNoOworICB9IGJsb2NrOworCisgIC8qIFZhcmlhYmxlcyBuZWVkZWQgd2hlbiB2ZXJpZnlpbmcgdGhlIEluZGV4IGZpZWxkICovCisgIHN0cnVjdCB7CisgICAgLyogUG9zaXRpb24gaW4gZGVjX2luZGV4KCkgKi8KKyAgICBlbnVtIHsKKyAgICAgIFNFUV9JTkRFWF9DT1VOVCwKKyAgICAgIFNFUV9JTkRFWF9VTlBBRERFRCwKKyAgICAgIFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQKKyAgICB9IHNlcXVlbmNlOworCisgICAgLyogU2l6ZSBvZiB0aGUgSW5kZXggaW4gYnl0ZXMgKi8KKyAgICB2bGlfdHlwZSBzaXplOworCisgICAgLyogTnVtYmVyIG9mIFJlY29yZHMgKG1hdGNoZXMgYmxvY2suY291bnQgaW4gdmFsaWQgZmlsZXMpICovCisgICAgdmxpX3R5cGUgY291bnQ7CisKKyAgICAvKgorICAgICAqIEhhc2ggY2FsY3VsYXRlZCBmcm9tIHRoZSBSZWNvcmRzIChtYXRjaGVzIGJsb2NrLmhhc2ggaW4KKyAgICAgKiB2YWxpZCBmaWxlcykuCisgICAgICovCisgICAgc3RydWN0IHh6X2RlY19oYXNoIGhhc2g7CisgIH0gaW5kZXg7CisKKyAgLyoKKyAgICogVGVtcG9yYXJ5IGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCBTdHJlYW0gSGVhZGVyLCBCbG9jayBIZWFkZXIsCisgICAqIGFuZCBTdHJlYW0gRm9vdGVyLiBUaGUgQmxvY2sgSGVhZGVyIGlzIHRoZSBiaWdnZXN0ICgxIEtpQikKKyAgICogc28gd2UgcmVzZXJ2ZSBzcGFjZSBhY2NvcmRpbmcgdG8gdGhhdC4gYnVmW10gaGFzIHRvIGJlIGFsaWduZWQKKyAgICogdG8gYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzOyB0aGUgc2l6ZV90IHZhcmlhYmxlcyBiZWZvcmUgaXQKKyAgICogc2hvdWxkIGd1YXJhbnRlZSB0aGlzLgorICAgKi8KKyAgc3RydWN0IHsKKyAgICBzaXplX3QgcG9zOworICAgIHNpemVfdCBzaXplOworICAgIHVpbnQ4X3QgYnVmWzEwMjRdOworICB9IHRlbXA7CisKKyAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTI7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisgIHN0cnVjdCB4el9kZWNfYmNqICpiY2o7CisgIGludCBiY2pfYWN0aXZlOworI2VuZGlmCit9OworCisvKiBTaXplcyBvZiB0aGUgQ2hlY2sgZmllbGQgd2l0aCBkaWZmZXJlbnQgQ2hlY2sgSURzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjaGVja19zaXplc1sxNl0gPSB7CisgIDAsCisgIDQsIDQsIDQsCisgIDgsIDgsIDgsCisgIDE2LCAxNiwgMTYsCisgIDMyLCAzMiwgMzIsCisgIDY0LCA2NCwgNjQKK307CisKKy8qCisgKiBGaWxsIHMtPnRlbXAgYnkgY29weWluZyBkYXRhIHN0YXJ0aW5nIGZyb20gYi0+aW5bYi0+aW5fcG9zXS4gQ2FsbGVyCisgKiBtdXN0IGhhdmUgc2V0IHMtPnRlbXAucG9zIHRvIGluZGljYXRlIGhvdyBtdWNoIGRhdGEgd2UgYXJlIHN1cHBvc2VkCisgKiB0byBjb3B5IGludG8gcy0+dGVtcC5idWYuIFJldHVybiB0cnVlIG9uY2Ugcy0+dGVtcC5wb3MgaGFzIHJlYWNoZWQKKyAqIHMtPnRlbXAuc2l6ZS4KKyAqLworc3RhdGljIGludCBmaWxsX3RlbXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgc2l6ZV90IGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwKKyAgICAgIGItPmluX3NpemUgLSBiLT5pbl9wb3MsIHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zKTsKKworICBtZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisgIGItPmluX3BvcyArPSBjb3B5X3NpemU7CisgIHMtPnRlbXAucG9zICs9IGNvcHlfc2l6ZTsKKworICBpZiAocy0+dGVtcC5wb3MgPT0gcy0+dGVtcC5zaXplKSB7CisgICAgcy0+dGVtcC5wb3MgPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlY29kZSBhIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIChsaXR0bGUtZW5kaWFuIGJhc2UtMTI4IGVuY29kaW5nKSAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY192bGkoc3RydWN0IHh6X2RlYyAqcywgY29uc3QgdWludDhfdCAqaW4sCisgICAgICAgICBzaXplX3QgKmluX3Bvcywgc2l6ZV90IGluX3NpemUpCit7CisgIHVpbnQ4X3QgYnl0ZTsKKworICBpZiAocy0+cG9zID09IDApCisgICAgcy0+dmxpID0gMDsKKworICB3aGlsZSAoKmluX3BvcyA8IGluX3NpemUpIHsKKyAgICBieXRlID0gaW5bKmluX3Bvc107CisgICAgKysqaW5fcG9zOworCisgICAgcy0+dmxpIHw9ICh2bGlfdHlwZSkoYnl0ZSAmIDB4N0YpIDw8IHMtPnBvczsKKworICAgIGlmICgoYnl0ZSAmIDB4ODApID09IDApIHsKKyAgICAgIC8qIERvbid0IGFsbG93IG5vbi1taW5pbWFsIGVuY29kaW5ncy4gKi8KKyAgICAgIGlmIChieXRlID09IDAgJiYgcy0+cG9zICE9IDApCisgICAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgICAgICBzLT5wb3MgPSAwOworICAgICAgcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisgICAgfQorCisgICAgcy0+cG9zICs9IDc7CisgICAgaWYgKHMtPnBvcyA9PSA3ICogVkxJX0JZVEVTX01BWCkKKyAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworICB9CisKKyAgcmV0dXJuIFhaX09LOworfQorCisvKgorICogRGVjb2RlIHRoZSBDb21wcmVzc2VkIERhdGEgZmllbGQgZnJvbSBhIEJsb2NrLiBVcGRhdGUgYW5kIHZhbGlkYXRlCisgKiB0aGUgb2JzZXJ2ZWQgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIG9mIHRoZSBCbG9jayBzbyB0aGF0CisgKiB0aGV5IGRvbid0IGV4Y2VlZCB0aGUgdmFsdWVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyCisgKiAodmFsaWRhdGlvbiBhc3N1bWVzIHRoYXQgbm8gaW50ZWdlciBvdmVyZmxvdyBvY2N1cnMsIHNpbmNlIHZsaV90eXBlCisgKiBpcyBub3JtYWxseSB1aW50NjRfdCkuIFVwZGF0ZSB0aGUgQ1JDMzIgb3IgQ1JDNjQgdmFsdWUgaWYgcHJlc2VuY2Ugb2YKKyAqIHRoZSBDUkMzMiBvciBDUkM2NCBmaWVsZCB3YXMgaW5kaWNhdGVkIGluIFN0cmVhbSBIZWFkZXIuCisgKgorICogT25jZSB0aGUgZGVjb2RpbmcgaXMgZmluaXNoZWQsIHZhbGlkYXRlIHRoYXQgdGhlIG9ic2VydmVkIHNpemVzIG1hdGNoCisgKiB0aGUgc2l6ZXMgcG9zc2libHkgc3RvcmVkIGluIHRoZSBCbG9jayBIZWFkZXIuIFVwZGF0ZSB0aGUgaGFzaCBhbmQKKyAqIEJsb2NrIGNvdW50LCB3aGljaCBhcmUgbGF0ZXIgdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfYmxvY2soc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgZW51bSB4el9yZXQgcmV0OworCisgIHMtPmluX3N0YXJ0ID0gYi0+aW5fcG9zOworICBzLT5vdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCisjaWZkZWYgWFpfREVDX0JDSgorICBpZiAocy0+YmNqX2FjdGl2ZSkKKyAgICByZXQgPSB4el9kZWNfYmNqX3J1bihzLT5iY2osIHMtPmx6bWEyLCBiKTsKKyAgZWxzZQorI2VuZGlmCisgICAgcmV0ID0geHpfZGVjX2x6bWEyX3J1bihzLT5sem1hMiwgYik7CisKKyAgcy0+YmxvY2suY29tcHJlc3NlZCArPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKyAgcy0+YmxvY2sudW5jb21wcmVzc2VkICs9IGItPm91dF9wb3MgLSBzLT5vdXRfc3RhcnQ7CisKKyAgLyoKKyAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBzZXBhcmF0ZWx5IGNoZWNrIGZvciBWTElfVU5LTk9XTiwgc2luY2UKKyAgICogdGhlIG9ic2VydmVkIHNpemVzIGFyZSBhbHdheXMgc21hbGxlciB0aGFuIFZMSV9VTktOT1dOLgorICAgKi8KKyAgaWYgKHMtPmJsb2NrLmNvbXByZXNzZWQgPiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorICAgICAgfHwgcy0+YmxvY2sudW5jb21wcmVzc2VkCisgICAgICAgID4gcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCkKKyAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICBpZiAocy0+Y2hlY2tfdHlwZSA9PSBYWl9DSEVDS19DUkMzMikKKyAgICBzLT5jcmMgPSB4el9jcmMzMihiLT5vdXQgKyBzLT5vdXRfc3RhcnQsCisgICAgICAgIGItPm91dF9wb3MgLSBzLT5vdXRfc3RhcnQsIHMtPmNyYyk7CisgIGVsc2UgaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDNjQpCisgICAgcy0+Y3JjID0gfihzLT5jcmMpOworICAgIHNpemVfdCBzaXplID0gYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydDsKKyAgICB1aW50OF90ICpidWYgPSBiLT5vdXQgKyBzLT5vdXRfc3RhcnQ7CisgICAgd2hpbGUgKHNpemUpIHsKKyAgICAgIHMtPmNyYyA9IHh6X2NyYzY0X3RhYmxlWypidWYrKyBeIChzLT5jcmMgJiAweEZGKV0gXiAocy0+Y3JjID4+IDgpOworICAgICAgLS1zaXplOworICAgIH0KKyAgICBzLT5jcmM9fihzLT5jcmMpOworCisgIGlmIChyZXQgPT0gWFpfU1RSRUFNX0VORCkgeworICAgIGlmIChzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZCAhPSBWTElfVU5LTk9XTgorICAgICAgICAmJiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorICAgICAgICAgICE9IHMtPmJsb2NrLmNvbXByZXNzZWQpCisgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgIGlmIChzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkICE9IFZMSV9VTktOT1dOCisgICAgICAgICYmIHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQKKyAgICAgICAgICAhPSBzLT5ibG9jay51bmNvbXByZXNzZWQpCisgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgIHMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gcy0+YmxvY2tfaGVhZGVyLnNpemUKKyAgICAgICAgKyBzLT5ibG9jay5jb21wcmVzc2VkOworCisgICAgcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSBjaGVja19zaXplc1tzLT5jaGVja190eXBlXTsKKworICAgIHMtPmJsb2NrLmhhc2gudW5jb21wcmVzc2VkICs9IHMtPmJsb2NrLnVuY29tcHJlc3NlZDsKKyAgICBzLT5ibG9jay5oYXNoLmNyYzMyID0geHpfY3JjMzIoCisgICAgICAgIChjb25zdCB1aW50OF90ICopJnMtPmJsb2NrLmhhc2gsCisgICAgICAgIHNpemVvZihzLT5ibG9jay5oYXNoKSwgcy0+YmxvY2suaGFzaC5jcmMzMik7CisKKyAgICArK3MtPmJsb2NrLmNvdW50OworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVXBkYXRlIHRoZSBJbmRleCBzaXplIGFuZCB0aGUgQ1JDMzIgdmFsdWUuICovCitzdGF0aWMgdm9pZCBpbmRleF91cGRhdGUoc3RydWN0IHh6X2RlYyAqcywgY29uc3Qgc3RydWN0IHh6X2J1ZiAqYikKK3sKKyAgc2l6ZV90IGluX3VzZWQgPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKyAgcy0+aW5kZXguc2l6ZSArPSBpbl91c2VkOworICBzLT5jcmMgPSB4el9jcmMzMihiLT5pbiArIHMtPmluX3N0YXJ0LCBpbl91c2VkLCBzLT5jcmMpOworfQorCisvKgorICogRGVjb2RlIHRoZSBOdW1iZXIgb2YgUmVjb3JkcywgVW5wYWRkZWQgU2l6ZSwgYW5kIFVuY29tcHJlc3NlZCBTaXplCisgKiBmaWVsZHMgZnJvbSB0aGUgSW5kZXggZmllbGQuIFRoYXQgaXMsIEluZGV4IFBhZGRpbmcgYW5kIENSQzMyIGFyZSBub3QKKyAqIGRlY29kZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGNhbiByZXR1cm4gWFpfT0sgKG1vcmUgaW5wdXQgbmVlZGVkKSwgWFpfU1RSRUFNX0VORCAoZXZlcnl0aGluZworICogc3VjY2Vzc2Z1bGx5IGRlY29kZWQpLCBvciBYWl9EQVRBX0VSUk9SIChpbnB1dCBpcyBjb3JydXB0KS4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19pbmRleChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworICBlbnVtIHh6X3JldCByZXQ7CisKKyAgZG8geworICAgIHJldCA9IGRlY192bGkocywgYi0+aW4sICZiLT5pbl9wb3MsIGItPmluX3NpemUpOworICAgIGlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkgeworICAgICAgaW5kZXhfdXBkYXRlKHMsIGIpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPmluZGV4LnNlcXVlbmNlKSB7CisgICAgY2FzZSBTRVFfSU5ERVhfQ09VTlQ6CisgICAgICBzLT5pbmRleC5jb3VudCA9IHMtPnZsaTsKKworICAgICAgLyoKKyAgICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIE51bWJlciBvZiBSZWNvcmRzIGZpZWxkCisgICAgICAgKiBpbmRpY2F0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIFJlY29yZHMgYXMKKyAgICAgICAqIHRoZXJlIHdlcmUgQmxvY2tzIGluIHRoZSBTdHJlYW0uCisgICAgICAgKi8KKyAgICAgIGlmIChzLT5pbmRleC5jb3VudCAhPSBzLT5ibG9jay5jb3VudCkKKyAgICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKyAgICAgIHMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOUEFEREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFUV9JTkRFWF9VTlBBRERFRDoKKyAgICAgIHMtPmluZGV4Lmhhc2gudW5wYWRkZWQgKz0gcy0+dmxpOworICAgICAgcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5DT01QUkVTU0VEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQ6CisgICAgICBzLT5pbmRleC5oYXNoLnVuY29tcHJlc3NlZCArPSBzLT52bGk7CisgICAgICBzLT5pbmRleC5oYXNoLmNyYzMyID0geHpfY3JjMzIoCisgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikmcy0+aW5kZXguaGFzaCwKKyAgICAgICAgICBzaXplb2Yocy0+aW5kZXguaGFzaCksCisgICAgICAgICAgcy0+aW5kZXguaGFzaC5jcmMzMik7CisgICAgICAtLXMtPmluZGV4LmNvdW50OworICAgICAgcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5QQURERUQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHMtPmluZGV4LmNvdW50ID4gMCk7CisKKyAgcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGF0IHRoZSBuZXh0IGZvdXIgb3IgZWlnaHQgaW5wdXQgYnl0ZXMgbWF0Y2ggdGhlIHZhbHVlCisgKiBvZiBzLT5jcmMuIHMtPnBvcyBtdXN0IGJlIHplcm8gd2hlbiBzdGFydGluZyB0byB2YWxpZGF0ZSB0aGUgZmlyc3QgYnl0ZS4KKyAqIFRoZSAiYml0cyIgYXJndW1lbnQgYWxsb3dzIHVzaW5nIHRoZSBzYW1lIGNvZGUgZm9yIGJvdGggQ1JDMzIgYW5kIENSQzY0LgorICovCitzdGF0aWMgZW51bSB4el9yZXQgY3JjX3ZhbGlkYXRlKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIsCisgICAgICAgIHVpbnQzMl90IGJpdHMpCit7CisgIGRvIHsKKyAgICBpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisgICAgICByZXR1cm4gWFpfT0s7CisKKyAgICBpZiAoKChzLT5jcmMgPj4gcy0+cG9zKSAmIDB4RkYpICE9IGItPmluW2ItPmluX3BvcysrXSkKKyAgICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgICAgcy0+cG9zICs9IDg7CisKKyAgfSB3aGlsZSAocy0+cG9zIDwgYml0cyk7CisKKyAgcy0+Y3JjID0gMDsKKyAgcy0+cG9zID0gMDsKKworICByZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworLyoKKyAqIFNraXAgb3ZlciB0aGUgQ2hlY2sgZmllbGQgd2hlbiB0aGUgQ2hlY2sgSUQgaXMgbm90IHN1cHBvcnRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbmNlIHRoZSB3aG9sZSBDaGVjayBmaWVsZCBoYXMgYmVlbiBza2lwcGVkIG92ZXIuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc2tpcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworICB3aGlsZSAocy0+cG9zIDwgY2hlY2tfc2l6ZXNbcy0+Y2hlY2tfdHlwZV0pIHsKKyAgICBpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpIHJldHVybiAwOworCisgICAgKytiLT5pbl9wb3M7CisgICAgKytzLT5wb3M7CisgIH0KKworICBzLT5wb3MgPSAwOworCisgIHJldHVybiAxOworfQorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBIZWFkZXIgZmllbGQgKHRoZSBmaXJzdCAxMiBieXRlcyBvZiB0aGUgLnh6IFN0cmVhbSkuICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3N0cmVhbV9oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKyAgaWYgKCFtZW1lcShzLT50ZW1wLmJ1ZiwgSEVBREVSX01BR0lDLCBIRUFERVJfTUFHSUNfU0laRSkpCisgICAgcmV0dXJuIFhaX0ZPUk1BVF9FUlJPUjsKKworICBpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYgKyBIRUFERVJfTUFHSUNfU0laRSwgMiwgMCkKKyAgICAgICE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgSEVBREVSX01BR0lDX1NJWkUgKyAyKSkKKyAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICBpZiAocy0+dGVtcC5idWZbSEVBREVSX01BR0lDX1NJWkVdICE9IDApCisgICAgcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKyAgLyoKKyAgICogT2YgaW50ZWdyaXR5IGNoZWNrcywgd2Ugc3VwcG9ydCBub25lIChDaGVjayBJRCA9IDApLAorICAgKiBDUkMzMiAoQ2hlY2sgSUQgPSAxKSwgYW5kIG9wdGlvbmFsbHkgQ1JDNjQgKENoZWNrIElEID0gNCkuCisgICAqIEhvd2V2ZXIsIGlmIFhaX0RFQ19BTllfQ0hFQ0sgaXMgZGVmaW5lZCwgd2Ugd2lsbCBhY2NlcHQgb3RoZXIKKyAgICogY2hlY2sgdHlwZXMgdG9vLCBidXQgdGhlbiB0aGUgY2hlY2sgd29uJ3QgYmUgdmVyaWZpZWQgYW5kCisgICAqIGEgd2FybmluZyAoWFpfVU5TVVBQT1JURURfQ0hFQ0spIHdpbGwgYmUgZ2l2ZW4uCisgICAqLworICBzLT5jaGVja190eXBlID0gcy0+dGVtcC5idWZbSEVBREVSX01BR0lDX1NJWkUgKyAxXTsKKworICBpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX01BWCkKKyAgICByZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworICBpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX0NSQzMyICYmICFJU19DUkM2NChzLT5jaGVja190eXBlKSkKKyAgICByZXR1cm4gWFpfVU5TVVBQT1JURURfQ0hFQ0s7CisKKyAgcmV0dXJuIFhaX09LOworfQorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBGb290ZXIgZmllbGQgKHRoZSBsYXN0IDEyIGJ5dGVzIG9mIHRoZSAueHogU3RyZWFtKSAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19zdHJlYW1fZm9vdGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisgIGlmICghbWVtZXEocy0+dGVtcC5idWYgKyAxMCwgRk9PVEVSX01BR0lDLCBGT09URVJfTUFHSUNfU0laRSkpCisgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKyAgaWYgKHh6X2NyYzMyKHMtPnRlbXAuYnVmICsgNCwgNiwgMCkgIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYpKQorICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgIC8qCisgICAqIFZhbGlkYXRlIEJhY2t3YXJkIFNpemUuIE5vdGUgdGhhdCB3ZSBuZXZlciBhZGRlZCB0aGUgc2l6ZSBvZiB0aGUKKyAgICogSW5kZXggQ1JDMzIgZmllbGQgdG8gcy0+aW5kZXguc2l6ZSwgdGh1cyB3ZSB1c2Ugcy0+aW5kZXguc2l6ZSAvIDQKKyAgICogaW5zdGVhZCBvZiBzLT5pbmRleC5zaXplIC8gNCAtIDEuCisgICAqLworICBpZiAoKHMtPmluZGV4LnNpemUgPj4gMikgIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyA0KSkKKyAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICBpZiAocy0+dGVtcC5idWZbOF0gIT0gMCB8fCBzLT50ZW1wLmJ1Zls5XSAhPSBzLT5jaGVja190eXBlKQorICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgIC8qCisgICAqIFVzZSBYWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWFpfT0sgdG8gYmUgbW9yZSBjb252ZW5pZW50CisgICAqIGZvciB0aGUgY2FsbGVyLgorICAgKi8KKyAgcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKy8qIERlY29kZSB0aGUgQmxvY2sgSGVhZGVyIGFuZCBpbml0aWFsaXplIHRoZSBmaWx0ZXIgY2hhaW4uICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX2Jsb2NrX2hlYWRlcihzdHJ1Y3QgeHpfZGVjICpzKQoreworICBlbnVtIHh6X3JldCByZXQ7CisKKyAgLyoKKyAgICogVmFsaWRhdGUgdGhlIENSQzMyLiBXZSBrbm93IHRoYXQgdGhlIHRlbXAgYnVmZmVyIGlzIGF0IGxlYXN0CisgICAqIGVpZ2h0IGJ5dGVzIHNvIHRoaXMgaXMgc2FmZS4KKyAgICovCisgIHMtPnRlbXAuc2l6ZSAtPSA0OworICBpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSwgMCkKKyAgICAgICE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplKSkKKyAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICBzLT50ZW1wLnBvcyA9IDI7CisKKyAgLyoKKyAgICogQ2F0Y2ggdW5zdXBwb3J0ZWQgQmxvY2sgRmxhZ3MuIFdlIHN1cHBvcnQgb25seSBvbmUgb3IgdHdvIGZpbHRlcnMKKyAgICogaW4gdGhlIGNoYWluLCBzbyB3ZSBjYXRjaCB0aGF0IHdpdGggdGhlIHNhbWUgdGVzdC4KKyAgICovCisjaWZkZWYgWFpfREVDX0JDSgorICBpZiAocy0+dGVtcC5idWZbMV0gJiAweDNFKQorI2Vsc2UKKyAgaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRikKKyNlbmRpZgorICAgIHJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisgIC8qIENvbXByZXNzZWQgU2l6ZSAqLworICBpZiAocy0+dGVtcC5idWZbMV0gJiAweDQwKSB7CisgICAgaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorICAgICAgICAgICE9IFhaX1NUUkVBTV9FTkQpCisgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgIHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gcy0+dmxpOworICB9IGVsc2UgeworICAgIHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gVkxJX1VOS05PV047CisgIH0KKworICAvKiBVbmNvbXByZXNzZWQgU2l6ZSAqLworICBpZiAocy0+dGVtcC5idWZbMV0gJiAweDgwKSB7CisgICAgaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorICAgICAgICAhPSBYWl9TVFJFQU1fRU5EKQorICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKyAgICBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gcy0+dmxpOworICB9IGVsc2UgeworICAgIHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKyAgfQorCisjaWZkZWYgWFpfREVDX0JDSgorICAvKiBJZiB0aGVyZSBhcmUgdHdvIGZpbHRlcnMsIHRoZSBmaXJzdCBvbmUgbXVzdCBiZSBhIEJDSiBmaWx0ZXIuICovCisgIHMtPmJjal9hY3RpdmUgPSBzLT50ZW1wLmJ1ZlsxXSAmIDB4MDE7CisgIGlmIChzLT5iY2pfYWN0aXZlKSB7CisgICAgaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMikKKyAgICAgIHJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisgICAgcmV0ID0geHpfZGVjX2Jjal9yZXNldChzLT5iY2osIHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdKTsKKyAgICBpZiAocmV0ICE9IFhaX09LKQorICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qCisgICAgICogV2UgZG9uJ3Qgc3VwcG9ydCBjdXN0b20gc3RhcnQgb2Zmc2V0LAorICAgICAqIHNvIFNpemUgb2YgUHJvcGVydGllcyBtdXN0IGJlIHplcm8uCisgICAgICovCisgICAgaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MDApCisgICAgICByZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKyAgfQorI2VuZGlmCisKKyAgLyogVmFsaWQgRmlsdGVyIEZsYWdzIGFsd2F5cyB0YWtlIGF0IGxlYXN0IHR3byBieXRlcy4gKi8KKyAgaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMikKKyAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAvKiBGaWx0ZXIgSUQgPSBMWk1BMiAqLworICBpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgyMSkKKyAgICByZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworICAvKiBTaXplIG9mIFByb3BlcnRpZXMgPSAxLWJ5dGUgRmlsdGVyIFByb3BlcnRpZXMgKi8KKyAgaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MDEpCisgICAgcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKyAgLyogRmlsdGVyIFByb3BlcnRpZXMgY29udGFpbnMgTFpNQTIgZGljdGlvbmFyeSBzaXplLiAqLworICBpZiAocy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MgPCAxKQorICAgIHJldHVybiBYWl9EQVRBX0VSUk9SOworCisgIHJldCA9IHh6X2RlY19sem1hMl9yZXNldChzLT5sem1hMiwgcy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10pOworICBpZiAocmV0ICE9IFhaX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgLyogVGhlIHJlc3QgbXVzdCBiZSBIZWFkZXIgUGFkZGluZy4gKi8KKyAgd2hpbGUgKHMtPnRlbXAucG9zIDwgcy0+dGVtcC5zaXplKQorICAgIGlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorICAgICAgcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKyAgcy0+dGVtcC5wb3MgPSAwOworICBzLT5ibG9jay5jb21wcmVzc2VkID0gMDsKKyAgcy0+YmxvY2sudW5jb21wcmVzc2VkID0gMDsKKworICByZXR1cm4gWFpfT0s7Cit9CisKK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfbWFpbihzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworICBlbnVtIHh6X3JldCByZXQ7CisKKyAgLyoKKyAgICogU3RvcmUgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgY2FzZSB3aGVuIHdlIGFyZSBpbiB0aGUgbWlkZGxlCisgICAqIG9mIHRoZSBJbmRleCBmaWVsZC4KKyAgICovCisgIHMtPmluX3N0YXJ0ID0gYi0+aW5fcG9zOworCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKHMtPnNlcXVlbmNlKSB7CisgICAgY2FzZSBTRVFfU1RSRUFNX0hFQURFUjoKKyAgICAgIC8qCisgICAgICAgKiBTdHJlYW0gSGVhZGVyIGlzIGNvcGllZCB0byBzLT50ZW1wLCBhbmQgdGhlbgorICAgICAgICogZGVjb2RlZCBmcm9tIHRoZXJlLiBUaGlzIHdheSBpZiB0aGUgY2FsbGVyCisgICAgICAgKiBnaXZlcyB1cyBvbmx5IGxpdHRsZSBpbnB1dCBhdCBhIHRpbWUsIHdlIGNhbgorICAgICAgICogc3RpbGwga2VlcCB0aGUgU3RyZWFtIEhlYWRlciBkZWNvZGluZyBjb2RlCisgICAgICAgKiBzaW1wbGUuIFNpbWlsYXIgYXBwcm9hY2ggaXMgdXNlZCBpbiBtYW55IHBsYWNlcworICAgICAgICogaW4gdGhpcyBmaWxlLgorICAgICAgICovCisgICAgICBpZiAoIWZpbGxfdGVtcChzLCBiKSkKKyAgICAgICAgcmV0dXJuIFhaX09LOworCisgICAgICAvKgorICAgICAgICogSWYgZGVjX3N0cmVhbV9oZWFkZXIoKSByZXR1cm5zCisgICAgICAgKiBYWl9VTlNVUFBPUlRFRF9DSEVDSywgaXQgaXMgc3RpbGwgcG9zc2libGUKKyAgICAgICAqIHRvIGNvbnRpbnVlIGRlY29kaW5nIGlmIHdvcmtpbmcgaW4gbXVsdGktY2FsbAorICAgICAgICogbW9kZS4gVGh1cywgdXBkYXRlIHMtPnNlcXVlbmNlIGJlZm9yZSBjYWxsaW5nCisgICAgICAgKiBkZWNfc3RyZWFtX2hlYWRlcigpLgorICAgICAgICovCisgICAgICBzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19TVEFSVDsKKworICAgICAgcmV0ID0gZGVjX3N0cmVhbV9oZWFkZXIocyk7CisgICAgICBpZiAocmV0ICE9IFhaX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY2FzZSBTRVFfQkxPQ0tfU1RBUlQ6CisgICAgICAvKiBXZSBuZWVkIG9uZSBieXRlIG9mIGlucHV0IHRvIGNvbnRpbnVlLiAqLworICAgICAgaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorICAgICAgICByZXR1cm4gWFpfT0s7CisKKyAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEluZGV4IGZpZWxkLiAqLworICAgICAgaWYgKGItPmluW2ItPmluX3Bvc10gPT0gMCkgeworICAgICAgICBzLT5pbl9zdGFydCA9IGItPmluX3BvcysrOworICAgICAgICBzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIEJsb2NrIEhlYWRlciBhbmQKKyAgICAgICAqIHByZXBhcmUgdG8gZGVjb2RlIGl0LgorICAgICAgICovCisgICAgICBzLT5ibG9ja19oZWFkZXIuc2l6ZQorICAgICAgICA9ICgodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zXSArIDEpICogNDsKKworICAgICAgcy0+dGVtcC5zaXplID0gcy0+YmxvY2tfaGVhZGVyLnNpemU7CisgICAgICBzLT50ZW1wLnBvcyA9IDA7CisgICAgICBzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19IRUFERVI7CisKKyAgICBjYXNlIFNFUV9CTE9DS19IRUFERVI6CisgICAgICBpZiAoIWZpbGxfdGVtcChzLCBiKSkKKyAgICAgICAgcmV0dXJuIFhaX09LOworCisgICAgICByZXQgPSBkZWNfYmxvY2tfaGVhZGVyKHMpOworICAgICAgaWYgKHJldCAhPSBYWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfVU5DT01QUkVTUzsKKworICAgIGNhc2UgU0VRX0JMT0NLX1VOQ09NUFJFU1M6CisgICAgICByZXQgPSBkZWNfYmxvY2socywgYik7CisgICAgICBpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIHMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1BBRERJTkc7CisKKyAgICBjYXNlIFNFUV9CTE9DS19QQURESU5HOgorICAgICAgLyoKKyAgICAgICAqIFNpemUgb2YgQ29tcHJlc3NlZCBEYXRhICsgQmxvY2sgUGFkZGluZworICAgICAgICogbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIuIFdlIGRvbid0IG5lZWQKKyAgICAgICAqIHMtPmJsb2NrLmNvbXByZXNzZWQgZm9yIGFueXRoaW5nIGVsc2UKKyAgICAgICAqIGFueW1vcmUsIHNvIHdlIHVzZSBpdCBoZXJlIHRvIHRlc3QgdGhlIHNpemUKKyAgICAgICAqIG9mIHRoZSBCbG9jayBQYWRkaW5nIGZpZWxkLgorICAgICAgICovCisgICAgICB3aGlsZSAocy0+YmxvY2suY29tcHJlc3NlZCAmIDMpIHsKKyAgICAgICAgaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorICAgICAgICAgIHJldHVybiBYWl9PSzsKKworICAgICAgICBpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisgICAgICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKyAgICAgICAgKytzLT5ibG9jay5jb21wcmVzc2VkOworICAgICAgfQorCisgICAgICBzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19DSEVDSzsKKworICAgIGNhc2UgU0VRX0JMT0NLX0NIRUNLOgorICAgICAgaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpIHsKKyAgICAgICAgcmV0ID0gY3JjX3ZhbGlkYXRlKHMsIGIsIDMyKTsKKyAgICAgICAgaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgICBlbHNlIGlmIChJU19DUkM2NChzLT5jaGVja190eXBlKSkgeworICAgICAgICByZXQgPSBjcmNfdmFsaWRhdGUocywgYiwgNjQpOworICAgICAgICBpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFjaGVja19za2lwKHMsIGIpKSB7CisgICAgICAgIHJldHVybiBYWl9PSzsKKyAgICAgIH0KKworICAgICAgcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfU1RBUlQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VRX0lOREVYOgorICAgICAgcmV0ID0gZGVjX2luZGV4KHMsIGIpOworICAgICAgaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICBzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9QQURESU5HOworCisgICAgY2FzZSBTRVFfSU5ERVhfUEFERElORzoKKyAgICAgIHdoaWxlICgocy0+aW5kZXguc2l6ZSArIChiLT5pbl9wb3MgLSBzLT5pbl9zdGFydCkpCisgICAgICAgICAgJiAzKSB7CisgICAgICAgIGlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkgeworICAgICAgICAgIGluZGV4X3VwZGF0ZShzLCBiKTsKKyAgICAgICAgICByZXR1cm4gWFpfT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisgICAgICAgICAgcmV0dXJuIFhaX0RBVEFfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEZpbmlzaCB0aGUgQ1JDMzIgdmFsdWUgYW5kIEluZGV4IHNpemUuICovCisgICAgICBpbmRleF91cGRhdGUocywgYik7CisKKyAgICAgIC8qIENvbXBhcmUgdGhlIGhhc2hlcyB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuICovCisgICAgICBpZiAoIW1lbWVxKCZzLT5ibG9jay5oYXNoLCAmcy0+aW5kZXguaGFzaCwKKyAgICAgICAgICBzaXplb2Yocy0+YmxvY2suaGFzaCkpKQorICAgICAgICByZXR1cm4gWFpfREFUQV9FUlJPUjsKKworICAgICAgcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfQ1JDMzI7CisKKyAgICBjYXNlIFNFUV9JTkRFWF9DUkMzMjoKKyAgICAgIHJldCA9IGNyY192YWxpZGF0ZShzLCBiLCAzMik7CisgICAgICBpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIHMtPnRlbXAuc2l6ZSA9IFNUUkVBTV9IRUFERVJfU0laRTsKKyAgICAgIHMtPnNlcXVlbmNlID0gU0VRX1NUUkVBTV9GT09URVI7CisKKyAgICBjYXNlIFNFUV9TVFJFQU1fRk9PVEVSOgorICAgICAgaWYgKCFmaWxsX3RlbXAocywgYikpCisgICAgICAgIHJldHVybiBYWl9PSzsKKworICAgICAgcmV0dXJuIGRlY19zdHJlYW1fZm9vdGVyKHMpOworICAgIH0KKyAgfQorCisgIC8qIE5ldmVyIHJlYWNoZWQgKi8KK30KKworLyoKKyAqIHh6X2RlY19ydW4oKSBpcyBhIHdyYXBwZXIgZm9yIGRlY19tYWluKCkgdG8gaGFuZGxlIHNvbWUgc3BlY2lhbCBjYXNlcyBpbgorICogbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwgZGVjb2RpbmcuCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCB3ZSBtdXN0IHJldHVybiBYWl9CVUZfRVJST1Igd2hlbiBpdCBzZWVtcyBjbGVhciB0aGF0IHdlCisgKiBhcmUgbm90IGdvaW5nIHRvIG1ha2UgYW55IHByb2dyZXNzIGFueW1vcmUuIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgY2FsbGVyCisgKiBmcm9tIGNhbGxpbmcgdXMgaW5maW5pdGVseSB3aGVuIHRoZSBpbnB1dCBmaWxlIGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UKKyAqIGNvcnJ1cHQuIFNpbmNlIHpsaWItc3R5bGUgQVBJIGFsbG93cyB0aGF0IHRoZSBjYWxsZXIgZmlsbHMgdGhlIGlucHV0IGJ1ZmZlcgorICogb25seSB3aGVuIHRoZSBkZWNvZGVyIGRvZXNuJ3QgcHJvZHVjZSBhbnkgbmV3IG91dHB1dCwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsCisgKiB0byBhdm9pZCByZXR1cm5pbmcgWFpfQlVGX0VSUk9SIHRvbyBlYXNpbHk6IFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5CisgKiBhZnRlciB0aGUgc2Vjb25kIGNvbnNlY3V0aXZlIGNhbGwgdG8geHpfZGVjX3J1bigpIHRoYXQgbWFrZXMgbm8gcHJvZ3Jlc3MuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgaWYgd2UgY291bGRuJ3QgZGVjb2RlIGV2ZXJ5dGhpbmcgYW5kIG5vIGVycm9yCisgKiBvY2N1cnJlZCwgZWl0aGVyIHRoZSBpbnB1dCBpcyB0cnVuY2F0ZWQgb3IgdGhlIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICogU2luY2Ugd2Uga25vdyB0aGF0IHRoZSBsYXN0IGlucHV0IGJ5dGUgbmV2ZXIgcHJvZHVjZXMgYW55IG91dHB1dCwgd2Uga25vdworICogdGhhdCBpZiBhbGwgdGhlIGlucHV0IHdhcyBjb25zdW1lZCBhbmQgZGVjb2Rpbmcgd2Fzbid0IGZpbmlzaGVkLCB0aGUgZmlsZQorICogbXVzdCBiZSBjb3JydXB0LiBPdGhlcndpc2UgdGhlIG91dHB1dCBidWZmZXIgaGFzIHRvIGJlIHRvbyBzbWFsbCBvciB0aGUKKyAqIGZpbGUgaXMgY29ycnVwdCBpbiBhIHdheSB0aGF0IGRlY29kaW5nIGl0IHByb2R1Y2VzIHRvbyBiaWcgb3V0cHV0LgorICoKKyAqIElmIHNpbmdsZS1jYWxsIGRlY29kaW5nIGZhaWxzLCB3ZSByZXNldCBiLT5pbl9wb3MgYW5kIGItPm91dF9wb3MgYmFjayB0bworICogdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiBUaGlzIGlzIGJlY2F1c2Ugd2l0aCBzb21lIGZpbHRlciBjaGFpbnMgdGhlcmUgd29uJ3QKKyAqIGJlIGFueSB2YWxpZCB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB1bmxlc3MgdGhlIGRlY29kaW5nCisgKiBhY3R1YWxseSBzdWNjZWVkcyAodGhhdCdzIHRoZSBwcmljZSB0byBwYXkgb2YgdXNpbmcgdGhlIG91dHB1dCBidWZmZXIgYXMKKyAqIHRoZSB3b3Jrc3BhY2UpLgorICovCitlbnVtIHh6X3JldCB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisgIHNpemVfdCBpbl9zdGFydDsKKyAgc2l6ZV90IG91dF9zdGFydDsKKyAgZW51bSB4el9yZXQgcmV0OworCisgIGluX3N0YXJ0ID0gYi0+aW5fcG9zOworICBvdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworICByZXQgPSBkZWNfbWFpbihzLCBiKTsKKworICBpZiAocmV0ID09IFhaX09LICYmIGluX3N0YXJ0ID09IGItPmluX3BvcyAmJiBvdXRfc3RhcnQgPT0gYi0+b3V0X3BvcykgeworICAgIGlmIChzLT5hbGxvd19idWZfZXJyb3IpCisgICAgICByZXQgPSBYWl9CVUZfRVJST1I7CisKKyAgICBzLT5hbGxvd19idWZfZXJyb3IgPSAxOworICB9IGVsc2UgeworICAgIHMtPmFsbG93X2J1Zl9lcnJvciA9IDA7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgeHpfZGVjICp4el9kZWNfaW5pdCh1aW50MzJfdCBkaWN0X21heCkKK3sKKyAgc3RydWN0IHh6X2RlYyAqcyA9IG1hbGxvYyhzaXplb2YoKnMpKTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBOVUxMOworCisjaWZkZWYgWFpfREVDX0JDSgorICBzLT5iY2ogPSBtYWxsb2Moc2l6ZW9mKCpzLT5iY2opKTsKKyAgaWYgKCFzLT5iY2opCisgICAgZ290byBlcnJvcl9iY2o7CisjZW5kaWYKKworICBzLT5sem1hMiA9IHh6X2RlY19sem1hMl9jcmVhdGUoZGljdF9tYXgpOworICBpZiAocy0+bHptYTIgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX2x6bWEyOworCisgIHh6X2RlY19yZXNldChzKTsKKyAgcmV0dXJuIHM7CisKK2Vycm9yX2x6bWEyOgorI2lmZGVmIFhaX0RFQ19CQ0oKKyAgZnJlZShzLT5iY2opOworZXJyb3JfYmNqOgorI2VuZGlmCisgIGZyZWUocyk7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIHh6X2RlY19yZXNldChzdHJ1Y3QgeHpfZGVjICpzKQoreworICBzLT5zZXF1ZW5jZSA9IFNFUV9TVFJFQU1fSEVBREVSOworICBzLT5hbGxvd19idWZfZXJyb3IgPSAwOworICBzLT5wb3MgPSAwOworICBzLT5jcmMgPSAwOworICBtZW1zZXQoJnMtPmJsb2NrLCAwLCBzaXplb2Yocy0+YmxvY2spKTsKKyAgbWVtc2V0KCZzLT5pbmRleCwgMCwgc2l6ZW9mKHMtPmluZGV4KSk7CisgIHMtPnRlbXAucG9zID0gMDsKKyAgcy0+dGVtcC5zaXplID0gU1RSRUFNX0hFQURFUl9TSVpFOworfQorCit2b2lkIHh6X2RlY19lbmQoc3RydWN0IHh6X2RlYyAqcykKK3sKKyAgaWYgKHMgIT0gTlVMTCkgeworICAgIGZyZWUoKHMtPmx6bWEyKS0+ZGljdC5idWYpOworICAgIGZyZWUocy0+bHptYTIpOworCisjaWZkZWYgWFpfREVDX0JDSgorICAgIGZyZWUocy0+YmNqKTsKKyNlbmRpZgorICAgIGZyZWUocyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L1JFQURNRSBiL3RveWJveC90b3lzL3Bvc2l4L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQ2MDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorUG9zaXggY29tbWFuZHMKKworQ29tbWFuZHMgZGVmaW5lZCBpbiBQT1NJWC0yMDA4LCBhbHNvIGtub3duIGFzIHRoZSBTaW5nbGUgVW5peAorU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDQsIGF2YWlsYWJsZSBvbmxpbmUgYXQKK2h0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2lkeC91dGlsaXRpZXMuaHRtbApkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvYmFzZW5hbWUuYyBiL3RveWJveC90b3lzL3Bvc2l4L2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyM2NjNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2Jhc2VuYW1lLmMKQEAgLTAsMCArMSwzNCBAQAorLyogYmFzZW5hbWUuYyAtIFJldHVybiBub24tZGlyZWN0b3J5IHBvcnRpb24gb2YgYSBwYXRobmFtZQorICoKKyAqIENvcHlyaWdodCAyMDEyIFRyeW4gTWlyZWxsIDx0cnluQG1pcmVsbC5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvYmFzZW5hbWUuaHRtbAorCisKK1VTRV9CQVNFTkFNRShORVdUT1koYmFzZW5hbWUsICI8MT4yIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgQkFTRU5BTUUKKyAgYm9vbCAiYmFzZW5hbWUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGJhc2VuYW1lIHN0cmluZyBbc3VmZml4XQorCisgICAgUmV0dXJuIG5vbi1kaXJlY3RvcnkgcG9ydGlvbiBvZiBhIHBhdGhuYW1lIHJlbW92aW5nIHN1ZmZpeAorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBiYXNlbmFtZV9tYWluKHZvaWQpCit7CisgIGNoYXIgKmJhc2UgPSBiYXNlbmFtZSgqdG95cy5vcHRhcmdzKSwgKnN1ZmZpeCA9IHRveXMub3B0YXJnc1sxXTsKKworICAvLyBjaG9wIG9mZiB0aGUgc3VmZml4IGlmIHByb3ZpZGVkCisgIGlmIChzdWZmaXggJiYgKnN1ZmZpeCkgeworICAgIGxvbmcgYmwgPSBzdHJsZW4oYmFzZSksIHNsID0gc3RybGVuKHN1ZmZpeCk7CisgICAgY2hhciAqcyA9IGJhc2UgKyBibCAtIHNsOworCisgICAgaWYgKGJsID4gc2wgJiYgIXN0cmNtcChzLCBzdWZmaXgpKSAqcyA9IDA7CisgIH0KKworICBwdXRzKGJhc2UpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY2FsLmMgYi90b3lib3gvdG95cy9wb3NpeC9jYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNhZmFkCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvY2FsLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIGNhbC5jIC0gc2hvdyBjYWxlbmRhci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2NhbC5odG1sCisKK1VTRV9DQUwoTkVXVE9ZKGNhbCwgIj4yIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgQ0FMCisgIGJvb2wgImNhbCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogY2FsIFtbbW9udGhdIHllYXJdCisKKyAgICBQcmludCBhIGNhbGVuZGFyLgorCisgICAgV2l0aCBvbmUgYXJndW1lbnQsIHByaW50cyBhbGwgbW9udGhzIG9mIHRoZSBzcGVjaWZpZWQgeWVhci4KKyAgICBXaXRoIHR3byBhcmd1bWVudHMsIHByaW50cyBjYWxlbmRhciBmb3IgbW9udGggYW5kIHllYXIuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBXcml0ZSBjYWxlbmRhciBpbnRvIGJ1ZmZlcjogZWFjaCBsaW5lIGlzIDIwIGNoYXJzIHdpZGUsIGVuZCBpbmRpY2F0ZWQKKy8vIGJ5IGVtcHR5IHN0cmluZy4KKworc3RhdGljIGNoYXIgKmNhbHN0cmluZ3MoY2hhciAqYnVmLCBzdHJ1Y3QgdG0gKnRtKQoreworICBjaGFyIHRlbXBbMjFdOworICBpbnQgd2RheSwgbWRheSwgc3RhcnQsIGxlbiwgbGluZTsKKworICAvLyBoZWFkZXIKKyAgbGVuID0gc3RyZnRpbWUodGVtcCwgMjEsICIlQiAlWSIsIHRtKTsKKyAgbGVuICs9ICgyMC1sZW4pLzI7CisgIGJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiUqcyUqcyAiLCBsZW4sIHRlbXAsIDIwLWxlbiwgIiIpOworICBidWYrKzsKKyAgYnVmICs9IHNwcmludGYoYnVmLCAiU3UgTW8gVHUgV2UgVGggRnIgU2EgIik7CisgIGJ1ZisrOworCisgIC8vIFdoYXQgZGF5IG9mIHRoZSB3ZWVrIGRvZXMgdGhpcyBtb250aCBzdGFydCBvbj8KKyAgaWYgKHRtLT50bV9tZGF5PjEpCisgICAgc3RhcnQgPSAoMzYrdG0tPnRtX3dkYXktdG0tPnRtX21kYXkpJTc7CisgIGVsc2Ugc3RhcnQgPSB0bS0+dG1fd2RheTsKKworICAvLyBXaGF0IGRheSBkb2VzIHRoaXMgbW9udGggZW5kIG9uPyAgQWxhcywgbGliYyBkb2Vzbid0IHRlbGwgdXMuLi4KKyAgbGVuID0gMzE7CisgIGlmICh0bS0+dG1fbW9uID09IDEpIHsKKyAgICBpbnQgeWVhciA9IHRtLT50bV95ZWFyOworICAgIGxlbiA9IDI4OworICAgIGlmICghKHllYXIgJiAzKSAmJiAhKCh5ZWFyJjEwMCkgJiYgISh5ZWFyJjQwMCkpKSBsZW4rKzsKKyAgfSBlbHNlIGlmICgodG0tPnRtX21vbisodG0tPnRtX21vbj42ID8gMSA6IDApKSAmIDEpIGxlbiA9IDMwOworCisgIGZvciAobWRheT1saW5lPTA7bGluZTw2O2xpbmUrKykgeworICAgIGZvciAod2RheT0wOyB3ZGF5PDc7IHdkYXkrKykgeworICAgICAgY2hhciAqcGF0ID0gIiAgICI7CisgICAgICBpZiAoIW1kYXkgPyB3ZGF5PT1zdGFydCA6IG1kYXk8bGVuKSB7CisgICAgICAgIHBhdCA9ICIlMmQgIjsKKyAgICAgICAgbWRheSsrOworICAgICAgfQorICAgICAgYnVmICs9IHNwcmludGYoYnVmLCBwYXQsIG1kYXkpOworICAgIH0KKyAgICBidWYrKzsKKyAgfQorCisgIHJldHVybiBidWY7Cit9CisKKy8vIFdvcnN0IGNhc2Ugc2NlbmFyaW8gdG95YnVmIHVzYWdlOiBzaXplb2Yoc3RydWN0IHRtKSBwbHVzIDIxIGJ5dGVzL2xpbmUKKy8vIHBsdXMgOCBsaW5lcy9tb250aCBwbHVzIDEyIG1vbnRocywgY29tZXMgdG8gYSBiaXQgb3ZlciAyayBvZiBvdXIgNGsgYnVmZmVyLgorCit2b2lkIGNhbF9tYWluKHZvaWQpCit7CisgIHN0cnVjdCB0bSAqdG07CisgIGNoYXIgKmJ1ZiA9IHRveWJ1ZjsKKworICBpZiAodG95cy5vcHRjKSB7CisgICAgLy8gQ29udmVuaWVudGx5IHN0YXJ0cyB6ZXJvZWQKKyAgICB0bSA9IChzdHJ1Y3QgdG0gKil0b3lidWY7CisgICAgYnVmICs9IHNpemVvZihzdHJ1Y3QgdG0pOworCisgICAgLy8gTGFzdCBhcmd1bWVudCBpcyB5ZWFyLCBvbmUgYmVmb3JlIHRoYXQgKGlmIGFueSkgaXMgbW9udGguCisgICAgdG0tPnRtX3llYXIgPSBhdG9seF9yYW5nZSh0b3lzLm9wdGFyZ3NbLS10b3lzLm9wdGNdLCAxLCA5OTk5KTsKKyAgICB0bS0+dG1feWVhciAtPSAxOTAwOworICAgIHRtLT50bV9tZGF5ID0gMTsKKyAgICB0bS0+dG1faG91ciA9IDEyOyAgLy8gbm9vbiB0byBhdm9pZCB0aW1lem9uZSB3ZWlyZG5lc3MKKyAgICBpZiAodG95cy5vcHRjKSB7CisgICAgICB0bS0+dG1fbW9uID0gYXRvbHhfcmFuZ2UodG95cy5vcHRhcmdzWy0tdG95cy5vcHRjXSwgMSwgMTIpOworICAgICAgdG0tPnRtX21vbi0tOworCisgICAgLy8gUHJpbnQgMTIgbW9udGhzIG9mIHRoZSB5ZWFyCisKKyAgICB9IGVsc2UgeworICAgICAgY2hhciAqYnVmc1sxMl07CisgICAgICBpbnQgaSwgaiwgazsKKworICAgICAgZm9yIChpPTA7IGk8MTI7IGkrKykgeworICAgICAgICB0bS0+dG1fbW9uPWk7CisgICAgICAgIG1rdGltZSh0bSk7CisgICAgICAgIGJ1ZiA9IGNhbHN0cmluZ3MoYnVmc1tpXT1idWYsIHRtKTsKKyAgICAgIH0KKworICAgICAgLy8gNCByb3dzLCA2IGxpbmVzIGVhY2gsIDMgY29sdW1ucworICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIGZvciAoaj0wOyBqPDg7IGorKykgeworICAgICAgICAgIGZvcihrPTA7IGs8MzsgaysrKSB7CisgICAgICAgICAgICBjaGFyICoqYiA9IGJ1ZnMrKGsraSozKTsKKyAgICAgICAgICAgICpiICs9IHByaW50ZigiJXMgIiwgKmIpOworICAgICAgICAgIH0KKyAgICAgICAgICBwdXRzKCIiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoYXQgZGF5IG9mIHRoZSB3ZWVrIGRvZXMgdGhhdCBzdGFydCBvbj8KKyAgICBta3RpbWUodG0pOworCisgIH0gZWxzZSB7CisgICAgdGltZV90IG5vdzsKKyAgICB0aW1lKCZub3cpOworICAgIHRtID0gbG9jYWx0aW1lKCZub3cpOworICB9CisKKyAgY2Fsc3RyaW5ncyhidWYsIHRtKTsKKyAgd2hpbGUgKCpidWYpIGJ1ZiArPSBwcmludGYoIiVzXG4iLCBidWYpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY2F0LmMgYi90b3lib3gvdG95cy9wb3NpeC9jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGEyZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvY2F0LmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIGNhdC5jIC0gY29weSBpbnB1dHMgdG8gc3Rkb3V0LgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvY2F0Lmh0bWwKKyAqCisgKiBBbmQgIkNhdCAtdiBjb25zaWRlcmVkIGhhcm1mdWwiIGF0CisgKiAgIGh0dHA6Ly9jbS5iZWxsLWxhYnMuY29tL2NtL2NzL2RvYy84NC9rcC5wcy5negorCitVU0VfQ0FUKE5FV1RPWShjYXQsICJ1IlVTRV9DQVRfVigidnRlIiksIFRPWUZMQUdfQklOKSkKK1VTRV9DQVRWKE5FV1RPWShjYXR2LCBVU0VfQ0FUVigidnRlIiksIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIENBVAorICBib29sICJjYXQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNhdCBbLXVdIFtmaWxlLi4uXQorCisgICAgQ29weSAoY29uY2F0ZW5hdGUpIGZpbGVzIHRvIHN0ZG91dC4gIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tIHN0ZGluLgorICAgIEZpbGVuYW1lICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLgorCisgICAgLXUJQ29weSBvbmUgYnl0ZSBhdCBhIHRpbWUgKHNsb3cpLgorCitjb25maWcgQ0FUX1YKKyAgYm9vbCAiY2F0IC1ldHYiCisgIGRlZmF1bHQgbgorICBkZXBlbmRzIG9uIENBVAorICBoZWxwCisgICAgdXNhZ2U6IGNhdCBbLWV2dF0KKworICAgIC1lCU1hcmsgZWFjaCBuZXdsaW5lIHdpdGggJAorICAgIC10CVNob3cgdGFicyBhcyBeSQorICAgIC12CURpc3BsYXkgbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzLiBVc2UgTS14IGZvcgorICAgIAloaWdoIGFzY2lpIGNoYXJhY3RlcnMgKD4xMjcpLCBhbmQgXnggZm9yIG90aGVyIG5vbnByaW50aW5nIGNoYXJzLgorCitjb25maWcgQ0FUVgorICBib29sICJjYXR2IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBjYXR2IFstZXZ0XSBbZmlsZW5hbWUuLi5dCisKKyAgICBEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcy4gVXNlIE0teCBmb3IKKyAgICBoaWdoIGFzY2lpIGNoYXJhY3RlcnMgKD4xMjcpLCBhbmQgXnggZm9yIG90aGVyIG5vbnByaW50aW5nIGNoYXJzLgorCisgICAgLWUgIE1hcmsgZWFjaCBuZXdsaW5lIHdpdGggJAorICAgIC10ICBTaG93IHRhYnMgYXMgXkkKKyAgICAtdiAgRG9uJ3QgdXNlIF54IG9yIE0teCBlc2NhcGVzLgorKi8KKworI2RlZmluZSBGT1JfY2F0CisjZGVmaW5lIEZPUkNFX0ZMQUdTCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgdm9pZCBkb19jYXQoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpbnQgaSwgbGVuLCBzaXplPSh0b3lzLm9wdGZsYWdzICYgRkxBR191KSA/IDEgOiBzaXplb2YodG95YnVmKTsKKworICBmb3IoOzspIHsKKyAgICBsZW4gPSByZWFkKGZkLCB0b3lidWYsIHNpemUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICB0b3lzLmV4aXR2YWwgPSBFWElUX0ZBSUxVUkU7CisgICAgICBwZXJyb3JfbXNnX3JhdyhuYW1lKTsKKyAgICB9CisgICAgaWYgKGxlbiA8IDEpIGJyZWFrOworICAgIGlmICgoQ0ZHX0NBVF9WIHx8IENGR19DQVRWKSAmJiAodG95cy5vcHRmbGFncyZ+RkxBR191KSkgeworICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgY2hhciBjPXRveWJ1ZltpXTsKKworICAgICAgICBpZiAoYyA+IDEyNiAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfdikpIHsKKyAgICAgICAgICBpZiAoYyA+IDEyNykgeworICAgICAgICAgICAgcHJpbnRmKCJNLSIpOworICAgICAgICAgICAgYyAtPSAxMjg7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjID09IDEyNykgeworICAgICAgICAgICAgcHJpbnRmKCJePyIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMzIpIHsKKyAgICAgICAgICBpZiAoYyA9PSAxMCkgeworICAgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2UpIHhwdXRjKCckJyk7CisgICAgICAgICAgfSBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgKGM9PTkgPyBGTEFHX3QgOiBGTEFHX3YpKSB7CisgICAgICAgICAgICBwcmludGYoIl4lYyIsIGMrJ0AnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB4cHV0YyhjKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeHdyaXRlKDEsIHRveWJ1ZiwgbGVuKTsKKyAgfQorfQorCit2b2lkIGNhdF9tYWluKHZvaWQpCit7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX2NhdCk7Cit9CisKK3ZvaWQgY2F0dl9tYWluKHZvaWQpCit7CisgIHRveXMub3B0ZmxhZ3MgXj0gRkxBR192OworICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb19jYXQpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY2hncnAuYyBiL3RveWJveC90b3lzL3Bvc2l4L2NoZ3JwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlOWViMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2NoZ3JwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGNoZ3JwLmMgLSBDaGFuZ2UgdXNlciBhbmQgZ3JvdXAgb3duZXJzaGlwCisgKgorICogQ29weXJpZ2h0IDIwMTIgR2VvcmdpIENob3JiYWR6aGl5c2tpIDxnZW9yZ2lAdW5peHNvbC5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvY2hvd24uaHRtbAorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvY2hncnAuaHRtbAorCitVU0VfQ0hHUlAoTkVXVE9ZKGNoZ3JwLCAiPDJoUExIUmZ2Wy1ITFBdIiwgVE9ZRkxBR19CSU4pKQorVVNFX0NIT1dOKE9MRFRPWShjaG93biwgY2hncnAsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIENIR1JQCisgIGJvb2wgImNoZ3JwIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBjaGdycC9jaG93biBbLVJITFBdIFstZnZoXSBncm91cCBmaWxlLi4uCisKKyAgICBDaGFuZ2UgZ3JvdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCisKKyAgICAtZglzdXBwcmVzcyBtb3N0IGVycm9yIG1lc3NhZ2VzLgorICAgIC1oCWNoYW5nZSBzeW1saW5rcyBpbnN0ZWFkIG9mIHdoYXQgdGhleSBwb2ludCB0bworICAgIC1SCXJlY3Vyc2UgaW50byBzdWJkaXJlY3RvcmllcyAoaW1wbGllcyAtaCkuCisgICAgLUgJd2l0aCAtUiBjaGFuZ2UgdGFyZ2V0IG9mIHN5bWxpbmssIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MKKyAgICAtTAl3aXRoIC1SIGNoYW5nZSB0YXJnZXQgb2Ygc3ltbGluaywgZm9sbG93IGFsbCBzeW1saW5rcworICAgIC1QCXdpdGggLVIgY2hhbmdlIHN5bWxpbmssIGRvIG5vdCBmb2xsb3cgc3ltbGlua3MgKGRlZmF1bHQpCisgICAgLXYJdmVyYm9zZSBvdXRwdXQuCisKK2NvbmZpZyBDSE9XTgorICBib29sICJjaG93biIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICBzZWU6IGNoZ3JwCisqLworCisjZGVmaW5lIEZPUl9jaGdycAorI2RlZmluZSBGT1JDRV9GTEFHUworI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgdWlkX3Qgb3duZXI7CisgIGdpZF90IGdyb3VwOworICBjaGFyICpvd25lcl9uYW1lLCAqZ3JvdXBfbmFtZTsKKyAgaW50IHN5bWZvbGxvdzsKKykKKworc3RhdGljIGludCBkb19jaGdycChzdHJ1Y3QgZGlydHJlZSAqbm9kZSkKK3sKKyAgaW50IGZkLCByZXQsIGZsYWdzID0gdG95cy5vcHRmbGFnczsKKworICAvLyBEZXB0aCBmaXJzdCBzZWFyY2gKKyAgaWYgKCFkaXJ0cmVlX25vdGRvdGRvdChub2RlKSkgcmV0dXJuIDA7CisgIGlmICgoZmxhZ3MgJiBGTEFHX1IpICYmICFub2RlLT5hZ2FpbiAmJiBTX0lTRElSKG5vZGUtPnN0LnN0X21vZGUpKQorICAgIHJldHVybiBESVJUUkVFX0NPTUVBR0FJTnwoRElSVFJFRV9TWU1GT0xMT1cqISEoZmxhZ3MmRkxBR19MKSk7CisKKyAgZmQgPSBkaXJ0cmVlX3BhcmVudGZkKG5vZGUpOworICByZXQgPSBmY2hvd25hdChmZCwgbm9kZS0+bmFtZSwgVFQub3duZXIsIFRULmdyb3VwLAorICAgIEFUX1NZTUxJTktfTk9GT0xMT1cqKCEoZmxhZ3MmKEZMQUdfTHxGTEFHX0gpKSAmJiAoZmxhZ3MmKEZMQUdfaHxGTEFHX1IpKSkpOworCisgIGlmIChyZXQgfHwgKGZsYWdzICYgRkxBR192KSkgeworICAgIGNoYXIgKnBhdGggPSBkaXJ0cmVlX3BhdGgobm9kZSwgMCk7CisgICAgaWYgKGZsYWdzICYgRkxBR192KQorICAgICAgeHByaW50ZigiJXMgJXMlcyVzICVzXG4iLCB0b3lzLndoaWNoLT5uYW1lLAorICAgICAgICBUVC5vd25lcl9uYW1lID8gVFQub3duZXJfbmFtZSA6ICIiLAorICAgICAgICB0b3lzLndoaWNoLT5uYW1lWzJdPT0nbycgJiYgVFQuZ3JvdXBfbmFtZSA/ICI6IiA6ICIiLAorICAgICAgICBUVC5ncm91cF9uYW1lID8gVFQuZ3JvdXBfbmFtZSA6ICIiLCBwYXRoKTsKKyAgICBpZiAocmV0ID09IC0xICYmICEodG95cy5vcHRmbGFncyAmIEZMQUdfZikpCisgICAgICBwZXJyb3JfbXNnKCInJXMnIHRvICclczolcyciLCBwYXRoLCBUVC5vd25lcl9uYW1lLCBUVC5ncm91cF9uYW1lKTsKKyAgICBmcmVlKHBhdGgpOworICB9CisgIHRveXMuZXhpdHZhbCB8PSByZXQ7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2hncnBfbWFpbih2b2lkKQoreworICBpbnQgaXNjaG93biA9IHRveXMud2hpY2gtPm5hbWVbMl0gPT0gJ28nOworICBjaGFyICoqcywgKm93bjsKKworICBUVC5vd25lciA9IFRULmdyb3VwID0gLTE7CisKKyAgLy8gRGlzdGluZ3Vpc2ggY2hvd24gZnJvbSBjaGdycAorICBpZiAoaXNjaG93bikgeworICAgIGNoYXIgKmdycDsKKworICAgIG93biA9IHhzdHJkdXAoKnRveXMub3B0YXJncyk7CisgICAgaWYgKChncnAgPSBzdHJjaHIob3duLCAnOicpKSB8fCAoZ3JwID0gc3RyY2hyKG93biwgJy4nKSkpIHsKKyAgICAgICooZ3JwKyspID0gMDsKKyAgICAgIFRULmdyb3VwX25hbWUgPSBncnA7CisgICAgfQorICAgIGlmICgqb3duKSBUVC5vd25lciA9IHhnZXR1aWQoVFQub3duZXJfbmFtZSA9IG93bik7CisgIH0gZWxzZSBUVC5ncm91cF9uYW1lID0gKnRveXMub3B0YXJnczsKKworICBpZiAoVFQuZ3JvdXBfbmFtZSAmJiAqVFQuZ3JvdXBfbmFtZSkKKyAgICBUVC5ncm91cCA9IHhnZXRnaWQoVFQuZ3JvdXBfbmFtZSk7CisKKyAgZm9yIChzPXRveXMub3B0YXJncysxOyAqczsgcysrKQorICAgIGRpcnRyZWVfZmxhZ3JlYWQoKnMsIERJUlRSRUVfU1lNRk9MTE9XKiEhKHRveXMub3B0ZmxhZ3MmKEZMQUdfSHxGTEFHX0wpKSwKKyAgICAgIGRvX2NoZ3JwKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFICYmIGlzY2hvd24pIGZyZWUob3duKTsKK30KKwordm9pZCBjaG93bl9tYWluKCkKK3sKKyAgY2hncnBfbWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY2htb2QuYyBiL3RveWJveC90b3lzL3Bvc2l4L2NobW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5MjQzOQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2NobW9kLmMKQEAgLTAsMCArMSw2NSBAQAorLyogY2htb2QuYyAtIENoYW5nZSBmaWxlIG1vZGUgYml0cworICoKKyAqIENvcHlyaWdodCAyMDEyIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvY2htb2QuaHRtbAorCitVU0VfQ0hNT0QoTkVXVE9ZKGNobW9kLCAiPDI/dlJmWy12Zl0iLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBDSE1PRAorICBib29sICJjaG1vZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogY2htb2QgWy1SXSBNT0RFIEZJTEUuLi4KKworICAgIENoYW5nZSBtb2RlIG9mIGxpc3RlZCBmaWxlW3NdIChyZWN1cnNpdmVseSB3aXRoIC1SKS4KKworICAgIE1PREUgY2FuIGJlIChjb21tYS1zZXBhcmF0ZWQpIHN0YW56YXM6IFt1Z29hXVsrLT1dW3J3eHN0WHVnb10KKworICAgIFN0YW56YXMgYXJlIGFwcGxpZWQgaW4gb3JkZXI6IEZvciBlYWNoIGNhdGVnb3J5ICh1ID0gdXNlciwKKyAgICBnID0gZ3JvdXAsIG8gPSBvdGhlciwgYSA9IGFsbCB0aHJlZSwgaWYgbm9uZSBzcGVjaWZpZWQgZGVmYXVsdCBpcyBhKSwKKyAgICBzZXQgKCspLCBjbGVhciAoLSksIG9yIGNvcHkgKD0pLCByID0gcmVhZCwgdyA9IHdyaXRlLCB4ID0gZXhlY3V0ZS4KKyAgICBzID0gdStzID0gc3VpZCwgZytzID0gc2dpZCwgbytzID0gc3RpY2t5LiAoK3QgaXMgYW4gYWxpYXMgZm9yIG8rcykuCisgICAgc3VpZC9zZ2lkOiBleGVjdXRlIGFzIHRoZSB1c2VyL2dyb3VwIHdobyBvd25zIHRoZSBmaWxlLgorICAgIHN0aWNreTogY2FuJ3QgZGVsZXRlIGZpbGVzIHlvdSBkb24ndCBvd24gb3V0IG9mIHRoaXMgZGlyZWN0b3J5CisgICAgWCA9IHggZm9yIGRpcmVjdG9yaWVzIG9yIGlmIGFueSBjYXRlZ29yeSBhbHJlYWR5IGhhcyB4IHNldC4KKworICAgIE9yIE1PREUgY2FuIGJlIGFuIG9jdGFsIHZhbHVlIHVwIHRvIDc3NzcJdWcgdXV1Z2dnb29vCXRvcCArCisgICAgYml0IDEgPSBvK3gsIGJpdCAxPDw4ID0gdSt3LCAxPDwxMSA9IGcrMQlzc3Ryd3hyd3hyd3gJYm90dG9tCisKKyAgICBFeGFtcGxlczoKKyAgICBjaG1vZCB1K3cgZmlsZSAtIGFsbG93IG93bmVyIG9mICJmaWxlIiB0byB3cml0ZSB0byBpdC4KKyAgICBjaG1vZCA3NDQgZmlsZSAtIHVzZXIgY2FuIHJlYWQvd3JpdGUvZXhlY3V0ZSwgZXZlcnlvbmUgZWxzZSByZWFkIG9ubHkKKyovCisKKyNkZWZpbmUgRk9SX2NobW9kCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICptb2RlOworKQorCitzdGF0aWMgaW50IGRvX2NobW9kKHN0cnVjdCBkaXJ0cmVlICp0cnkpCit7CisgIG1vZGVfdCBtb2RlOworCisgIGlmICghZGlydHJlZV9ub3Rkb3Rkb3QodHJ5KSkgcmV0dXJuIDA7CisKKyAgbW9kZSA9IHN0cmluZ190b19tb2RlKFRULm1vZGUsIHRyeS0+c3Quc3RfbW9kZSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB7CisgICAgY2hhciAqcyA9IGRpcnRyZWVfcGF0aCh0cnksIDApOworICAgIHByaW50ZigiY2htb2QgJyVzJyB0byAlMDRvXG4iLCBzLCBtb2RlKTsKKyAgICBmcmVlKHMpOworICB9CisgIHdmY2htb2RhdChkaXJ0cmVlX3BhcmVudGZkKHRyeSksIHRyeS0+bmFtZSwgbW9kZSk7CisKKyAgcmV0dXJuICh0b3lzLm9wdGZsYWdzICYgRkxBR19SKSA/IERJUlRSRUVfUkVDVVJTRSA6IDA7Cit9CisKK3ZvaWQgY2htb2RfbWFpbih2b2lkKQoreworICBUVC5tb2RlID0gKnRveXMub3B0YXJnczsKKyAgY2hhciAqKmZpbGU7CisKKyAgZm9yIChmaWxlID0gdG95cy5vcHRhcmdzKzE7ICpmaWxlOyBmaWxlKyspIGRpcnRyZWVfcmVhZCgqZmlsZSwgZG9fY2htb2QpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY2tzdW0uYyBiL3RveWJveC90b3lzL3Bvc2l4L2Nrc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2Nrc3VtLmMKQEAgLTAsMCArMSw4MyBAQAorLyogY2tzdW0uYyAtIHByb2R1Y2UgY3JjMzIgY2hlY2tzdW0gdmFsdWUgZm9yIGVhY2ggaW5wdXQKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2Nrc3VtLmh0bWwKKworVVNFX0NLU1VNKE5FV1RPWShja3N1bSwgIkhJUExOIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgQ0tTVU0KKyAgYm9vbCAiY2tzdW0iCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNrc3VtIFstSVBMTl0gW2ZpbGUuLi5dCisKKyAgICBGb3IgZWFjaCBmaWxlLCBvdXRwdXQgY3JjMzIgY2hlY2tzdW0gdmFsdWUsIGxlbmd0aCBhbmQgbmFtZSBvZiBmaWxlLgorICAgIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tIHN0ZGluLiAgRmlsZW5hbWUgIi0iIGlzIGEgc3lub255bSBmb3Igc3RkaW4uCisKKyAgICAtSAlIZXhhZGVjaW1hbCBjaGVja3N1bSAoZGVmYXVsdHMgdG8gZGVjaW1hbCkKKyAgICAtTAlMaXR0bGUgZW5kaWFuIChkZWZhdWx0cyB0byBiaWcgZW5kaWFuKQorICAgIC1QCVByZS1pbnZlcnNpb24KKyAgICAtSQlTa2lwIHBvc3QtaW52ZXJzaW9uCisgICAgLU4JRG8gbm90IGluY2x1ZGUgbGVuZ3RoIGluIENSQyBjYWxjdWxhdGlvbgorKi8KKworI2RlZmluZSBGT1JfY2tzdW0KKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIHVuc2lnbmVkIGNyY190YWJsZVsyNTZdOworKQorCitzdGF0aWMgdW5zaWduZWQgY2tzdW1fYmUodW5zaWduZWQgY3JjLCB1bnNpZ25lZCBjaGFyIGMpCit7CisgIHJldHVybiAoY3JjPDw4KV5UVC5jcmNfdGFibGVbKGNyYz4+MjQpXmNdOworfQorCitzdGF0aWMgdW5zaWduZWQgY2tzdW1fbGUodW5zaWduZWQgY3JjLCB1bnNpZ25lZCBjaGFyIGMpCit7CisgIHJldHVybiBUVC5jcmNfdGFibGVbKGNyY15jKSYweGZmXSBeIChjcmM+PjgpOworfQorCitzdGF0aWMgdm9pZCBkb19ja3N1bShpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHVuc2lnbmVkIGNyYyA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19QKSA/IDB4ZmZmZmZmZmYgOiAwOworICB1aW50NjRfdCBsbGVuID0gMCwgbGxlbjI7CisgIHVuc2lnbmVkICgqY2tzdW0pKHVuc2lnbmVkIGNyYywgdW5zaWduZWQgY2hhciBjKTsKKworICBja3N1bSA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19MKSA/IGNrc3VtX2xlIDogY2tzdW1fYmU7CisgIC8vIENSQyB0aGUgZGF0YQorCisgIGZvciAoOzspIHsKKyAgICBpbnQgbGVuLCBpOworCisgICAgbGVuID0gcmVhZChmZCwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgaWYgKGxlbjwwKSBwZXJyb3JfbXNnX3JhdyhuYW1lKTsKKyAgICBpZiAobGVuPDEpIGJyZWFrOworCisgICAgbGxlbiArPSBsZW47CisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIGNyYz1ja3N1bShjcmMsIHRveWJ1ZltpXSk7CisgIH0KKworICAvLyBDUkMgdGhlIGxlbmd0aAorCisgIGxsZW4yID0gbGxlbjsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfTikpIHsKKyAgICB3aGlsZSAobGxlbikgeworICAgICAgY3JjID0gY2tzdW0oY3JjLCBsbGVuKTsKKyAgICAgIGxsZW4gPj49IDg7CisgICAgfQorICB9CisKKyAgcHJpbnRmKCh0b3lzLm9wdGZsYWdzICYgRkxBR19IKSA/ICIleCIgOiAiJXUiLAorICAgICh0b3lzLm9wdGZsYWdzICYgRkxBR19JKSA/IGNyYyA6IH5jcmMpOworICBwcmludGYoIiAlIlBSSXU2NCwgbGxlbjIpOworICBpZiAoc3RyY21wKCItIiwgbmFtZSkpIHByaW50ZigiICVzIiwgbmFtZSk7CisgIHhwdXRjKCdcbicpOworfQorCit2b2lkIGNrc3VtX21haW4odm9pZCkKK3sKKyAgY3JjX2luaXQoVFQuY3JjX3RhYmxlLCB0b3lzLm9wdGZsYWdzICYgRkxBR19MKTsKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fY2tzdW0pOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY21wLmMgYi90b3lib3gvdG95cy9wb3NpeC9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjdmYmZkCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvY21wLmMKQEAgLTAsMCArMSw4NCBAQAorLyogY21wLmMgLSBDb21wYXJlIHR3byBmaWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBUaW1vdGh5IEVsbGlvdHQgPHRsZUBob2x5bW9ua2V5LmNvbT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9jbXAuaHRtbAorCitVU0VfQ01QKE5FV1RPWShjbXAsICI8Mj4ybHNbIWxzXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIENNUAorICBib29sICJjbXAiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNtcCBbLWxdIFstc10gRklMRTEgRklMRTIKKworICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byBmaWxlcy4KKworICAgIC1sCXNob3cgYWxsIGRpZmZlcmluZyBieXRlcworICAgIC1zCXNpbGVudAorKi8KKworI2RlZmluZSBGT1JfY21wCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBpbnQgZmQ7CisgIGNoYXIgKm5hbWU7CispCisKKy8vIFRoaXMgaGFuZGxlcyBvcGVuaW5nIHRoZSBmaWxlIGFuZAorCitzdGF0aWMgdm9pZCBkb19jbXAoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpbnQgaSwgbGVuMSwgbGVuMiwgbWluX2xlbiwgc2l6ZSA9IHNpemVvZih0b3lidWYpLzI7CisgIGxvbmcgYnl0ZV9ubyA9IDEsIGxpbmVfbm8gPSAxOworICBjaGFyICpidWYyID0gdG95YnVmK3NpemU7CisKKyAgLy8gRmlyc3QgdGltZSB0aHJvdWdoLCBjYWNoZSB0aGUgZGF0YSBhbmQgcmV0dXJuLgorICBpZiAoIVRULmZkKSB7CisgICAgVFQubmFtZSA9IG5hbWU7CisgICAgLy8gT24gcmV0dXJuIHRoZSBvbGQgZmlsZWhhbmRsZSBpcyBjbG9zZWQsIGFuZCB0aGlzIGFzc3VyZXMgdGhhdCBldmVuCisgICAgLy8gaWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBzdGRpbiBjbG9zZWQsIHRoZSBuZXcgZmlsZWhhbmRsZSAhPSAwLgorICAgIFRULmZkID0gZHVwKGZkKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgbGVuMSA9IHJlYWRhbGwoVFQuZmQsIHRveWJ1Ziwgc2l6ZSk7CisgICAgbGVuMiA9IHJlYWRhbGwoZmQsIGJ1ZjIsIHNpemUpOworCisgICAgbWluX2xlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisgICAgZm9yIChpPTA7IGk8bWluX2xlbjsgaSsrKSB7CisgICAgICBpZiAodG95YnVmW2ldICE9IGJ1ZjJbaV0pIHsKKyAgICAgICAgdG95cy5leGl0dmFsID0gMTsKKyAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpCisgICAgICAgICAgcHJpbnRmKCIlbGQgJW8gJW9cbiIsIGJ5dGVfbm8sIHRveWJ1ZltpXSwgYnVmMltpXSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpKSB7CisgICAgICAgICAgICBwcmludGYoIiVzICVzIGRpZmZlcjogY2hhciAlbGQsIGxpbmUgJWxkXG4iLAorICAgICAgICAgICAgICBUVC5uYW1lLCBuYW1lLCBieXRlX25vLCBsaW5lX25vKTsKKyAgICAgICAgICAgIHRveXMuZXhpdHZhbCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnl0ZV9ubysrOworICAgICAgaWYgKHRveWJ1ZltpXSA9PSAnXG4nKSBsaW5lX25vKys7CisgICAgfQorICAgIGlmIChsZW4xICE9IGxlbjIpIHsKKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNtcDogRU9GIG9uICVzXG4iLCBsZW4xIDwgbGVuMiA/IFRULm5hbWUgOiBuYW1lKTsKKyAgICAgIHRveXMuZXhpdHZhbCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGxlbjEgPCAxKSBicmVhazsKKyAgfQorb3V0OgorICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBjbG9zZShUVC5mZCk7Cit9CisKK3ZvaWQgY21wX21haW4odm9pZCkKK3sKKyAgbG9vcGZpbGVzX3J3KHRveXMub3B0YXJncywgT19DTE9FWEVDLCAwLCB0b3lzLm9wdGZsYWdzJkZMQUdfcywgZG9fY21wKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY29tbS5jIGIvdG95Ym94L3RveXMvcG9zaXgvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDI2MmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9jb21tLmMKQEAgLTAsMCArMSw4MCBAQAorLyogY29tbS5jIC0gc2VsZWN0IG9yIHJlamVjdCBsaW5lcyBjb21tb24gdG8gdHdvIGZpbGVzCisgKgorICogQ29weXJpZ2h0IDIwMTIgSWx5YSBLdXptaWNoIDxpa3ZAc2FmZS1tYWlsLm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9jb21tLmh0bWwKKworLy8gPCMgYW5kID4jIHRha2Ugc2luZ2xlIGRpZ2l0LCBzbyAzMjEgZGVmaW5lIGZsYWdzCitVU0VfQ09NTShORVdUT1koY29tbSwgIjwyPjIzMjEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBDT01NCisgIGJvb2wgImNvbW0iCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNvbW0gWy0xMjNdIEZJTEUxIEZJTEUyCisKKyAgICBSZWFkcyBGSUxFMSBhbmQgRklMRTIsIHdoaWNoIHNob3VsZCBiZSBvcmRlcmVkLCBhbmQgcHJvZHVjZXMgdGhyZWUgdGV4dAorICAgIGNvbHVtbnMgYXMgb3V0cHV0OiBsaW5lcyBvbmx5IGluIEZJTEUxOyBsaW5lcyBvbmx5IGluIEZJTEUyOyBhbmQgbGluZXMKKyAgICBpbiBib3RoIGZpbGVzLiBGaWxlbmFtZSAiLSIgaXMgYSBzeW5vbnltIGZvciBzdGRpbi4KKworICAgIC0xIHN1cHByZXNzIHRoZSBvdXRwdXQgY29sdW1uIG9mIGxpbmVzIHVuaXF1ZSB0byBGSUxFMQorICAgIC0yIHN1cHByZXNzIHRoZSBvdXRwdXQgY29sdW1uIG9mIGxpbmVzIHVuaXF1ZSB0byBGSUxFMgorICAgIC0zIHN1cHByZXNzIHRoZSBvdXRwdXQgY29sdW1uIG9mIGxpbmVzIGR1cGxpY2F0ZWQgaW4gRklMRTEgYW5kIEZJTEUyCisqLworCisjZGVmaW5lIEZPUl9jb21tCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgdm9pZCB3cml0ZWxpbmUoY29uc3QgY2hhciAqbGluZSwgaW50IGNvbCkKK3sKKyAgaWYgKGNvbCA9PSAwICYmIHRveXMub3B0ZmxhZ3MgJiBGTEFHXzEpIHJldHVybjsKKyAgZWxzZSBpZiAoY29sID09IDEpIHsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfMikgcmV0dXJuOworICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHXzEpKSBwdXRjaGFyKCdcdCcpOworICB9IGVsc2UgaWYgKGNvbCA9PSAyKSB7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHXzMpIHJldHVybjsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR18xKSkgcHV0Y2hhcignXHQnKTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR18yKSkgcHV0Y2hhcignXHQnKTsKKyAgfQorICBwdXRzKGxpbmUpOworfQorCit2b2lkIGNvbW1fbWFpbih2b2lkKQoreworICBpbnQgZmlsZVsyXTsKKyAgY2hhciAqbGluZVsyXTsKKyAgaW50IGk7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgPT0gNykgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBmaWxlW2ldID0geG9wZW5ybyh0b3lzLm9wdGFyZ3NbaV0pOworICAgIGxpbmVbaV0gPSBnZXRfbGluZShmaWxlW2ldKTsKKyAgfQorCisgIHdoaWxlIChsaW5lWzBdICYmIGxpbmVbMV0pIHsKKyAgICBpbnQgb3JkZXIgPSBzdHJjbXAobGluZVswXSwgbGluZVsxXSk7CisKKyAgICBpZiAob3JkZXIgPT0gMCkgeworICAgICAgd3JpdGVsaW5lKGxpbmVbMF0sIDIpOworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBmcmVlKGxpbmVbaV0pOworICAgICAgICBsaW5lW2ldID0gZ2V0X2xpbmUoZmlsZVtpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGkgPSBvcmRlciA8IDAgPyAwIDogMTsKKyAgICAgIHdyaXRlbGluZShsaW5lW2ldLCBpKTsKKyAgICAgIGZyZWUobGluZVtpXSk7CisgICAgICBsaW5lW2ldID0gZ2V0X2xpbmUoZmlsZVtpXSk7CisgICAgfQorICB9CisKKyAgLyogcHJpbnQgcmVzdCBvZiB0aGUgbG9uZ2VyIGZpbGUgKi8KKyAgZm9yIChpID0gbGluZVswXSA/IDAgOiAxOyBsaW5lW2ldOykgeworICAgIHdyaXRlbGluZShsaW5lW2ldLCBpKTsKKyAgICBmcmVlKGxpbmVbaV0pOworICAgIGxpbmVbaV0gPSBnZXRfbGluZShmaWxlW2ldKTsKKyAgfQorCisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHhjbG9zZShmaWxlW2ldKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L2NwLmMgYi90b3lib3gvdG95cy9wb3NpeC9jcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDYzYTcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9jcC5jCkBAIC0wLDAgKzEsNTA3IEBACisvKiBDb3B5cmlnaHQgMjAwOCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2NwLmh0bWwKKyAqIEFuZCBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL212Lmh0bWwKKyAqIEFuZCBodHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNS4wLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljLmh0bWwjSU5TVEFMTAorICoKKyAqIFBvc2l4IHNheXMgImNwIC1SZiBkaXIgZmlsZSIgc2hvdWxkbid0IGRlbGV0ZSBmaWxlLCBidXQgb3VyIC1mIGRvZXMuCisgKgorICogRGV2aWF0aW9ucyBmcm9tIHBvc2l4OiAtYWRsbnJzdkYsIC0tcHJlc2VydmUuLi4gYWJvdXQgaGFsZiB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgaW4gdGhpcyBjcCBpc24ndCBpbiBwb3NpeC4gUG9zaXggaXMgc3R1Y2sgaW4gdGhlIDE5NzAncy4KKyAqCisgKiBUT0RPOiAtLXByZXNlcnZlPWxpbmtzCisgKiBUT0RPOiB3aGF0J3MgdGhpcyBfQ1BfbW9kZSBzeXN0ZW0ucG9zaXhfYWNsXyBidXNpbmVzcz8gV2UgY2htb2QoKT8KKworLy8gb3B0aW9ucyBzaGFyZWQgYmV0d2VlbiBtdi9jcCBtdXN0IGJlIGluIHNhbWUgb3JkZXIgKHJpZ2h0IHRvIGxlZnQpCisvLyBmb3IgRkxBRyBtYWNyb3MgdG8gd29yayBvdXQgcmlnaHQgaW4gc2hhcmVkIGluZnJhc3RydWN0dXJlLgorCitVU0VfQ1AoTkVXVE9ZKGNwLCAiPDIiVVNFX0NQX1BSRVNFUlZFKCIocHJlc2VydmUpOjsiKSJSSExQcHJkYXNsdm5GKHJlbW92ZS1kZXN0aW5hdGlvbilmaVstSExQZF1bLW5pXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9NVihORVdUT1kobXYsICI8MnZuRihyZW1vdmUtZGVzdGluYXRpb24pZmlbLW5pXSIsIFRPWUZMQUdfQklOKSkKK1VTRV9JTlNUQUxMKE5FV1RPWShpbnN0YWxsLCAiPDFjZERwc3ZtOm86ZzoiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBDUAorICBib29sICJjcCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogY3AgWy1hZGxucnN2ZmlwUkhMUF0gU09VUkNFLi4uIERFU1QKKworICAgIENvcHkgZmlsZXMgZnJvbSBTT1VSQ0UgdG8gREVTVC4gIElmIG1vcmUgdGhhbiBvbmUgU09VUkNFLCBERVNUIG11c3QKKyAgICBiZSBhIGRpcmVjdG9yeS4KKworICAgIC1mCWRlbGV0ZSBkZXN0aW5hdGlvbiBmaWxlcyB3ZSBjYW4ndCB3cml0ZSB0bworICAgIC1GCWRlbGV0ZSBhbnkgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSBmaXJzdCAoLS1yZW1vdmUtZGVzdGluYXRpb24pCisgICAgLWkJaW50ZXJhY3RpdmUsIHByb21wdCBiZWZvcmUgb3ZlcndyaXRpbmcgZXhpc3RpbmcgREVTVAorICAgIC1wCXByZXNlcnZlIHRpbWVzdGFtcHMsIG93bmVyc2hpcCwgYW5kIG1vZGUKKyAgICAtUglyZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMgKERFU1QgbXVzdCBiZSBhIGRpcmVjdG9yeSkKKyAgICAtSAlGb2xsb3cgc3ltbGlua3MgbGlzdGVkIG9uIGNvbW1hbmQgbGluZQorICAgIC1MCUZvbGxvdyBhbGwgc3ltbGlua3MKKyAgICAtUAlEbyBub3QgZm9sbG93IHN5bWxpbmtzIFtkZWZhdWx0XQorICAgIC1hCXNhbWUgYXMgLWRwcgorICAgIC1kCWRvbid0IGRlcmVmZXJlbmNlIHN5bWxpbmtzCisgICAgLWwJaGFyZCBsaW5rIGluc3RlYWQgb2YgY29weQorICAgIC1uCW5vIGNsb2JiZXIgKGRvbid0IG92ZXJ3cml0ZSBERVNUKQorICAgIC1yCXN5bm9ueW0gZm9yIC1SCisgICAgLXMJc3ltbGluayBpbnN0ZWFkIG9mIGNvcHkKKyAgICAtdgl2ZXJib3NlCisKK2NvbmZpZyBDUF9QUkVTRVJWRQorICBib29sICJjcCAtLXByZXNlcnZlIHN1cHBvcnQiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIENQCisgIGhlbHAKKyAgICB1c2FnZTogY3AgWy0tcHJlc2VydmU9bW90Y3hhXQorCisgICAgLS1wcmVzZXJ2ZSB0YWtlcyBlaXRoZXIgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLCBvciB0aGUgZmlyc3QKKyAgICBsZXR0ZXIocykgb2Y6CisKKyAgICAgICAgICAgIG1vZGUgLSBwZXJtaXNzaW9ucyAoaWdub3JlIHVtYXNrIGZvciByd3gsIGNvcHkgc3VpZCBhbmQgc3RpY2t5IGJpdCkKKyAgICAgICBvd25lcnNoaXAgLSB1c2VyIGFuZCBncm91cAorICAgICAgdGltZXN0YW1wcyAtIGZpbGUgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgYW5kIGFjY2VzcyB0aW1lcy4KKyAgICAgICAgIGNvbnRleHQgLSBzZWN1cml0eSBjb250ZXh0CisgICAgICAgICAgIHhhdHRyIC0gZXh0ZW5kZWQgYXR0cmlidXRlcworICAgICAgICAgICAgIGFsbCAtIGFsbCBvZiB0aGUgYWJvdmUKKworY29uZmlnIE1WCisgIGJvb2wgIm12IgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBtdiBbLWZpdm5dIFNPVVJDRS4uLiBERVNUIgorCisgICAgLWYJZm9yY2UgY29weSBieSBkZWxldGluZyBkZXN0aW5hdGlvbiBmaWxlCisgICAgLWkJaW50ZXJhY3RpdmUsIHByb21wdCBiZWZvcmUgb3ZlcndyaXRpbmcgZXhpc3RpbmcgREVTVAorICAgIC12CXZlcmJvc2UKKyAgICAtbglubyBjbG9iYmVyIChkb24ndCBvdmVyd3JpdGUgREVTVCkKKworY29uZmlnIElOU1RBTEwKKyAgYm9vbCAiaW5zdGFsbCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogaW5zdGFsbCBbLWREcHN2XSBbLW8gVVNFUl0gWy1nIEdST1VQXSBbLW0gTU9ERV0gW1NPVVJDRS4uLl0gREVTVAorCisgICAgQ29weSBmaWxlcyBhbmQgc2V0IGF0dHJpYnV0ZXMuCisKKyAgICAtZAlBY3QgbGlrZSBta2RpciAtcAorICAgIC1ECUNyZWF0ZSBsZWFkaW5nIGRpcmVjdG9yaWVzIGZvciBERVNUCisgICAgLWcJTWFrZSBjb3B5IGJlbG9uZyB0byBHUk9VUAorICAgIC1tCVNldCBwZXJtaXNzaW9ucyB0byBNT0RFCisgICAgLW8JTWFrZSBjb3B5IGJlbG9uZyB0byBVU0VSCisgICAgLXAJUHJlc2VydmUgdGltZXN0YW1wcworICAgIC1zCUNhbGwgInN0cmlwIC1wIgorICAgIC12CVZlcmJvc2UKKyovCisKKyNkZWZpbmUgRk9SQ0VfRkxBR1MKKyNkZWZpbmUgRk9SX2NwCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIC8vIGluc3RhbGwncyBvcHRpb25zCisgICAgICBjaGFyICpncm91cDsKKyAgICAgIGNoYXIgKnVzZXI7CisgICAgICBjaGFyICptb2RlOworICAgIH0gaTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciAqcHJlc2VydmU7CisgICAgfSBjOworICB9OworCisgIGNoYXIgKmRlc3RuYW1lOworICBzdHJ1Y3Qgc3RhdCB0b3A7CisgIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGlydHJlZSAqdHJ5KTsKKyAgdWlkX3QgdWlkOworICBnaWRfdCBnaWQ7CisgIGludCBwZmxhZ3M7CispCisKK3N0cnVjdCBjcF9wcmVzZXJ2ZSB7CisgIGNoYXIgKm5hbWU7Cit9IHN0YXRpYyBjb25zdCBjcF9wcmVzZXJ2ZVtdID0gVEFHR0VEX0FSUkFZKENQLAorICB7Im1vZGUifSwgeyJvd25lcnNoaXAifSwgeyJ0aW1lc3RhbXBzIn0sIHsiY29udGV4dCJ9LCB7InhhdHRyIn0sCispOworCisvLyBDYWxsYmFjayBmcm9tIGRpcnRyZWVfcmVhZCgpIGZvciBlYWNoIGZpbGUvZGlyZWN0b3J5IHVuZGVyIGEgc291cmNlIGRpci4KKworaW50IGNwX25vZGUoc3RydWN0IGRpcnRyZWUgKnRyeSkKK3sKKyAgaW50IGZkb3V0ID0gLTEsIGNmZCA9IHRyeS0+cGFyZW50ID8gdHJ5LT5wYXJlbnQtPmV4dHJhIDogQVRfRkRDV0QsCisgICAgICB0ZmQgPSBkaXJ0cmVlX3BhcmVudGZkKHRyeSk7CisgIHVuc2lnbmVkIGZsYWdzID0gdG95cy5vcHRmbGFnczsKKyAgY2hhciAqY2F0Y2ggPSB0cnktPnBhcmVudCA/IHRyeS0+bmFtZSA6IFRULmRlc3RuYW1lLCAqZXJyID0gIiVzIjsKKyAgc3RydWN0IHN0YXQgY3N0OworCisgIGlmICghZGlydHJlZV9ub3Rkb3Rkb3QodHJ5KSkgcmV0dXJuIDA7CisKKyAgLy8gSWYgcmV0dXJuaW5nIGZyb20gQ09NRUFHQUlOLCBqdW1wIHN0cmFpZ2h0IHRvIC1wIGxvZ2ljIGF0IGVuZC4KKyAgaWYgKFNfSVNESVIodHJ5LT5zdC5zdF9tb2RlKSAmJiB0cnktPmFnYWluKSB7CisgICAgZmRvdXQgPSB0cnktPmV4dHJhOworICAgIGVyciA9IDA7CisgIH0gZWxzZSB7CisKKyAgICAvLyAtZCBpcyBvbmx5IHRoZSBzYW1lIGFzIC1yIGZvciBzeW1saW5rcywgbm90IGZvciBkaXJlY3RvcmllcworICAgIGlmIChTX0lTTE5LKHRyeS0+c3Quc3RfbW9kZSkgJiYgKGZsYWdzICYgRkxBR19kKSkgZmxhZ3MgfD0gRkxBR19yOworCisgICAgLy8gRGV0ZWN0IHJlY3Vyc2l2ZSBjb3BpZXMgdmlhIHJlcGVhdGVkIHRvcCBub2RlIChjcCAtUiAuLiAuKSBvcgorICAgIC8vIGlkZW50aWNhbCBzb3VyY2UvdGFyZ2V0IChmdW4gd2l0aCBoYXJkbGlua3MpLgorICAgIGlmICgoVFQudG9wLnN0X2RldiA9PSB0cnktPnN0LnN0X2RldiAmJiBUVC50b3Auc3RfaW5vID09IHRyeS0+c3Quc3RfaW5vCisgICAgICAgICAmJiAoY2F0Y2ggPSBUVC5kZXN0bmFtZSkpCisgICAgICAgIHx8ICghZnN0YXRhdChjZmQsIGNhdGNoLCAmY3N0LCAwKSAmJiBjc3Quc3RfZGV2ID09IHRyeS0+c3Quc3RfZGV2CisgICAgICAgICAmJiBjc3Quc3RfaW5vID09IHRyeS0+c3Quc3RfaW5vKSkKKyAgICB7CisgICAgICBlcnJvcl9tc2coIiclcycgaXMgJyVzJyIsIGNhdGNoLCBlcnIgPSBkaXJ0cmVlX3BhdGgodHJ5LCAwKSk7CisgICAgICBmcmVlKGVycik7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEhhbmRsZSAtaW52RgorCisgICAgaWYgKCFmYWNjZXNzYXQoY2ZkLCBjYXRjaCwgRl9PSywgMCkgJiYgIVNfSVNESVIoY3N0LnN0X21vZGUpKSB7CisgICAgICBjaGFyICpzOworCisgICAgICBpZiAoU19JU0RJUih0cnktPnN0LnN0X21vZGUpKSB7CisgICAgICAgIGVycm9yX21zZygiZGlyIGF0ICclcyciLCBzID0gZGlydHJlZV9wYXRoKHRyeSwgMCkpOworICAgICAgICBmcmVlKHMpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgRkxBR19GKSAmJiB1bmxpbmthdChjZmQsIGNhdGNoLCAwKSkgeworICAgICAgICBlcnJvcl9tc2coInVubGluayAnJXMnIiwgY2F0Y2gpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX24pIHJldHVybiAwOworICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX2kpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3ZlcndyaXRlICclcyciLCB0b3lzLndoaWNoLT5uYW1lLAorICAgICAgICAgIHMgPSBkaXJ0cmVlX3BhdGgodHJ5LCAwKSk7CisgICAgICAgIGZyZWUocyk7CisgICAgICAgIGlmICgheWVzbm8oMSkpIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmbGFncyAmIEZMQUdfdikgeworICAgICAgY2hhciAqcyA9IGRpcnRyZWVfcGF0aCh0cnksIDApOworICAgICAgcHJpbnRmKCIlcyAnJXMnXG4iLCB0b3lzLndoaWNoLT5uYW1lLCBzKTsKKyAgICAgIGZyZWUocyk7CisgICAgfQorCisgICAgLy8gTG9vcCBmb3IgLWYgcmV0cnkgYWZ0ZXIgdW5saW5rCisgICAgZG8geworCisgICAgICAvLyBkaXJlY3RvcnksIGhhcmRsaW5rLCBzeW1saW5rLCBta25vZCAoY2hhciwgYmxvY2ssIGZpZm8sIHNvY2tldCksIGZpbGUKKworICAgICAgLy8gQ29weSBkaXJlY3RvcnkKKworICAgICAgaWYgKFNfSVNESVIodHJ5LT5zdC5zdF9tb2RlKSkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDI7CisKKyAgICAgICAgaWYgKCEoZmxhZ3MgJiAoRkxBR19hfEZMQUdfcnxGTEFHX1IpKSkgeworICAgICAgICAgIGVyciA9ICJTa2lwcGVkIGRpciAnJXMnIjsKKyAgICAgICAgICBjYXRjaCA9IHRyeS0+bmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsd2F5cyBtYWtlIGRpcmVjdG9yeSB3cml0ZWFibGUgdG8gdXMsIHNvIHdlIGNhbiBjcmVhdGUgZmlsZXMgaW4gaXQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFllcywgdGhlcmUncyBhIHJhY2Ugd2luZG93IGJldHdlZW4gbWtkaXIoKSBhbmQgb3BlbigpIHNvIGl0J3MKKyAgICAgICAgLy8gcG9zc2libGUgdGhhdCAtcCBjYW4gYmUgbWFkZSB0byBjaG93biBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSBvbmUKKyAgICAgICAgLy8gd2UgY3JlYXRlZC4gVGhlIGNsb3Nlc3Qgd2UgY2FuIGRvIHRvIGNsb3NpbmcgdGhpcyBpcyBtYWtlIHN1cmUKKyAgICAgICAgLy8gdGhhdCB3aGF0IHdlIG9wZW4gX2lzXyBhIGRpcmVjdG9yeSByYXRoZXIgdGhhbiBzb21ldGhpbmcgZWxzZS4KKworICAgICAgICBpZiAoIW1rZGlyYXQoY2ZkLCBjYXRjaCwgdHJ5LT5zdC5zdF9tb2RlIHwgMDIwMCkgfHwgZXJybm8gPT0gRUVYSVNUKQorICAgICAgICAgIGlmICgtMSAhPSAodHJ5LT5leHRyYSA9IG9wZW5hdChjZmQsIGNhdGNoLCBPX05PRk9MTE9XKSkpCisgICAgICAgICAgICBpZiAoIWZzdGF0KHRyeS0+ZXh0cmEsICZzdDIpICYmIFNfSVNESVIoc3QyLnN0X21vZGUpKQorICAgICAgICAgICAgICByZXR1cm4gRElSVFJFRV9DT01FQUdBSU4KKyAgICAgICAgICAgICAgICAgICAgIHwgKERJUlRSRUVfU1lNRk9MTE9XKiEhKHRveXMub3B0ZmxhZ3MmRkxBR19MKSk7CisKKyAgICAgIC8vIEhhcmRsaW5rCisKKyAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX2wpIHsKKyAgICAgICAgaWYgKCFsaW5rYXQodGZkLCB0cnktPm5hbWUsIGNmZCwgY2F0Y2gsIDApKSBlcnIgPSAwOworCisgICAgICAvLyBDb3B5IHRyZWUgYXMgc3ltbGlua3MuIEZvciBub24tYWJzb2x1dGUgcGF0aHMgdGhpcyBpbnZvbHZlcworICAgICAgLy8gYXBwZW5kaW5nIHRoZSByaWdodCBudW1iZXIgb2YgLi4gZW50cmllcyBhcyB5b3UgZ28gZG93biB0aGUgdHJlZS4KKworICAgICAgfSBlbHNlIGlmIChmbGFncyAmIEZMQUdfcykgeworICAgICAgICBjaGFyICpzOworICAgICAgICBzdHJ1Y3QgZGlydHJlZSAqb3I7CisgICAgICAgIGludCBkb3Rkb3RzID0gMDsKKworICAgICAgICBzID0gZGlydHJlZV9wYXRoKHRyeSwgMCk7CisgICAgICAgIGZvciAob3IgPSB0cnk7IG9yLT5wYXJlbnQ7IG9yID0gb3ItPnBhcmVudCkgZG90ZG90cysrOworCisgICAgICAgIGlmICgqb3ItPm5hbWUgPT0gJy8nKSBkb3Rkb3RzID0gMDsKKyAgICAgICAgaWYgKGRvdGRvdHMpIHsKKyAgICAgICAgICBjaGFyICpzMiA9IHhtcHJpbnRmKCIlKmMlcyIsIDMqZG90ZG90cywgJyAnLCBzKTsKKyAgICAgICAgICBmcmVlKHMpOworICAgICAgICAgIHMgPSBzMjsKKyAgICAgICAgICB3aGlsZShkb3Rkb3RzLS0pIHsKKyAgICAgICAgICAgIG1lbWNweShzMiwgIi4uLyIsIDMpOworICAgICAgICAgICAgczIgKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzeW1saW5rYXQocywgY2ZkLCBjYXRjaCkpIHsKKyAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgIGZkb3V0ID0gQVRfRkRDV0Q7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShzKTsKKworICAgICAgLy8gRG8gc29tZXRoaW5nIF9vdGhlcl8gdGhhbiBjb3B5IGNvbnRlbnRzIG9mIGEgZmlsZT8KKyAgICAgIH0gZWxzZSBpZiAoIVNfSVNSRUcodHJ5LT5zdC5zdF9tb2RlKQorICAgICAgICAgICAgICAgICAmJiAodHJ5LT5wYXJlbnQgfHwgKGZsYWdzICYgKEZMQUdfYXxGTEFHX3IpKSkpCisgICAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIC8vIG1ha2Ugc3ltbGluaywgb3IgbWFrZSBibG9jay9jaGFyL2ZpZm8vc29ja2V0CisgICAgICAgIGlmIChTX0lTTE5LKHRyeS0+c3Quc3RfbW9kZSkKKyAgICAgICAgICAgID8gKChpID0gcmVhZGxpbmthdDAodGZkLCB0cnktPm5hbWUsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpKSAmJgorICAgICAgICAgICAgICAgIXN5bWxpbmthdCh0b3lidWYsIGNmZCwgY2F0Y2gpKQorICAgICAgICAgICAgOiAhbWtub2RhdChjZmQsIGNhdGNoLCB0cnktPnN0LnN0X21vZGUsIHRyeS0+c3Quc3RfcmRldikpCisgICAgICAgIHsKKyAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgIGZkb3V0ID0gQVRfRkRDV0Q7CisgICAgICAgIH0KKworICAgICAgLy8gQ29weSBjb250ZW50cyBvZiBmaWxlLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGZkaW47CisKKyAgICAgICAgZmRpbiA9IG9wZW5hdCh0ZmQsIHRyeS0+bmFtZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoZmRpbiA8IDApIHsKKyAgICAgICAgICBjYXRjaCA9IHRyeS0+bmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmZG91dCA9IG9wZW5hdChjZmQsIGNhdGNoLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DLCB0cnktPnN0LnN0X21vZGUpOworICAgICAgICBpZiAoZmRvdXQgPj0gMCkgeworICAgICAgICAgIHhzZW5kZmlsZShmZGluLCBmZG91dCk7CisgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG9ubHkgY29weSB4YXR0cnMgZm9yIGZpbGVzIGJlY2F1c2UgdGhlcmUncyBubyBmbGlzdHhhdHRyYXQoKQorICAgICAgICBpZiAoVFQucGZsYWdzJihfQ1BfeGF0dHJ8X0NQX2NvbnRleHQpKSB7CisgICAgICAgICAgc3NpemVfdCBsaXN0bGVuID0gZmxpc3R4YXR0cihmZGluLCAwLCAwKSwgbGVuOworICAgICAgICAgIGNoYXIgKm5hbWUsICp2YWx1ZSwgKmxpc3Q7CisKKyAgICAgICAgICBpZiAobGlzdGxlbj4wKSB7CisgICAgICAgICAgICBsaXN0ID0geG1hbGxvYyhsaXN0bGVuKTsKKyAgICAgICAgICAgIGZsaXN0eGF0dHIoZmRpbiwgbGlzdCwgbGlzdGxlbik7CisgICAgICAgICAgICBsaXN0W2xpc3RsZW4tMV0gPSAwOyAvLyBJIGRvIG5vdCB0cnVzdCB0aGlzIEFQSS4KKyAgICAgICAgICAgIGZvciAobmFtZSA9IGxpc3Q7IG5hbWUtbGlzdCA8IGxpc3RsZW47IG5hbWUgKz0gc3RybGVuKG5hbWUpKzEpIHsKKyAgICAgICAgICAgICAgaWYgKCEoVFQucGZsYWdzJl9DUF94YXR0cikgJiYgc3RybmNtcChuYW1lLCAic2VjdXJpdHkuIiwgOSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIGlmICgobGVuID0gZmdldHhhdHRyKGZkaW4sIG5hbWUsIDAsIDApKT4wKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB4bWFsbG9jKGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSBmZ2V0eGF0dHIoZmRpbiwgbmFtZSwgdmFsdWUsIGxlbikpCisgICAgICAgICAgICAgICAgICBpZiAoZnNldHhhdHRyKGZkb3V0LCBuYW1lLCB2YWx1ZSwgbGVuLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgcGVycm9yX21zZygiJXMgc2V0eGF0dHIoJXM9JXMpIiwgY2F0Y2gsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmcmVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShsaXN0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbG9zZShmZGluKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlcnIgJiYgKGZsYWdzICYgKEZMQUdfZnxGTEFHX24pKSAmJiAhdW5saW5rYXQoY2ZkLCBjYXRjaCwgMCkpOworICB9CisKKyAgLy8gRGlkIHdlIG1ha2UgYSB0aGluZz8KKyAgaWYgKGZkb3V0ICE9IC0xKSB7CisgICAgaW50IHJjOworCisgICAgLy8gSW5hYmlsaXR5IHRvIHNldCAtLXByZXNlcnZlIGlzbid0IGZhdGFsLCBzb21lIHJlcXVpcmUgcm9vdCBhY2Nlc3MuCisKKyAgICAvLyBvd25lcnNoaXAKKyAgICBpZiAoVFQucGZsYWdzICYgX0NQX293bmVyc2hpcCkgeworCisgICAgICAvLyBwZXJtaXNzaW9uIGJpdHMgYWxyZWFkeSBjb3JyZWN0IGZvciBta25vZCBhbmQgZG9uJ3QgYXBwbHkgdG8gc3ltbGluaworICAgICAgLy8gSWYgd2UgY2FuJ3QgZ2V0IGEgZmlsZWhhbmRsZSB0byB0aGUgYWN0dWFsIG9iamVjdCwgdXNlIHJhY3kgZnVuY3Rpb25zCisgICAgICBpZiAoZmRvdXQgPT0gQVRfRkRDV0QpCisgICAgICAgIHJjID0gZmNob3duYXQoY2ZkLCBjYXRjaCwgdHJ5LT5zdC5zdF91aWQsIHRyeS0+c3Quc3RfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgIEFUX1NZTUxJTktfTk9GT0xMT1cpOworICAgICAgZWxzZSByYyA9IGZjaG93bihmZG91dCwgdHJ5LT5zdC5zdF91aWQsIHRyeS0+c3Quc3RfZ2lkKTsKKyAgICAgIGlmIChyYyAmJiAhZ2V0ZXVpZCgpKSB7CisgICAgICAgIGNoYXIgKnBwOworCisgICAgICAgIHBlcnJvcl9tc2coImNob3duICclcyciLCBwcCA9IGRpcnRyZWVfcGF0aCh0cnksIDApKTsKKyAgICAgICAgZnJlZShwcCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gdGltZXN0YW1wCisgICAgaWYgKFRULnBmbGFncyAmIF9DUF90aW1lc3RhbXBzKSB7CisgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZXNbXSA9IHt0cnktPnN0LnN0X2F0aW0sIHRyeS0+c3Quc3RfbXRpbX07CisKKyAgICAgIGlmIChmZG91dCA9PSBBVF9GRENXRCkgdXRpbWVuc2F0KGNmZCwgY2F0Y2gsIHRpbWVzLCBBVF9TWU1MSU5LX05PRk9MTE9XKTsKKyAgICAgIGVsc2UgZnV0aW1lbnMoZmRvdXQsIHRpbWVzKTsKKyAgICB9CisKKyAgICAvLyBtb2RlIGNvbWVzIGxhc3QgYmVjYXVzZSBvdGhlciBzeXNjYWxscyBjYW4gc3RyaXAgc3VpZCBiaXQKKyAgICBpZiAoZmRvdXQgIT0gQVRfRkRDV0QpIHsKKyAgICAgIGlmIChUVC5wZmxhZ3MgJiBfQ1BfbW9kZSkgZmNobW9kKGZkb3V0LCB0cnktPnN0LnN0X21vZGUpOworICAgICAgeGNsb3NlKGZkb3V0KTsKKyAgICB9CisKKyAgICBpZiAoQ0ZHX01WICYmIHRveXMud2hpY2gtPm5hbWVbMF0gPT0gJ20nKQorICAgICAgaWYgKHVubGlua2F0KHRmZCwgdHJ5LT5uYW1lLCBTX0lTRElSKHRyeS0+c3Quc3RfbW9kZSkgPyBBVF9SRU1PVkVESVIgOjApKQorICAgICAgICBlcnIgPSAiJXMiOworICB9CisKKyAgaWYgKGVycikgeworICAgIGNoYXIgKmYgPSAwOworCisgICAgaWYgKGNhdGNoID09IHRyeS0+bmFtZSkgeworICAgICAgZiA9IGRpcnRyZWVfcGF0aCh0cnksIDApOworICAgICAgd2hpbGUgKHRyeS0+cGFyZW50KSB0cnkgPSB0cnktPnBhcmVudDsKKyAgICAgIGNhdGNoID0geG1wcmludGYoIiVzJXMiLCBUVC5kZXN0bmFtZSwgZitzdHJsZW4odHJ5LT5uYW1lKSk7CisgICAgICBmcmVlKGYpOworICAgICAgZiA9IGNhdGNoOworICAgIH0KKyAgICBwZXJyb3JfbXNnKGVyciwgY2F0Y2gpOworICAgIGZyZWUoZik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3BfbWFpbih2b2lkKQoreworICBjaGFyICpkZXN0bmFtZSA9IHRveXMub3B0YXJnc1stLXRveXMub3B0Y107CisgIGludCBpLCBkZXN0ZGlyID0gIXN0YXQoZGVzdG5hbWUsICZUVC50b3ApICYmIFNfSVNESVIoVFQudG9wLnN0X21vZGUpOworCisgIGlmICh0b3lzLm9wdGM+MSAmJiAhZGVzdGRpcikgZXJyb3JfZXhpdCgiJyVzJyBub3QgZGlyZWN0b3J5IiwgZGVzdG5hbWUpOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgKEZMQUdfYXxGTEFHX3ApKSB7CisgICAgVFQucGZsYWdzID0gQ1BfbW9kZXxDUF9vd25lcnNoaXB8Q1BfdGltZXN0YW1wczsKKyAgICB1bWFzaygwKTsKKyAgfQorICAvLyBOb3QgdXNpbmcgY29tbWFfYXJncygpICh5ZXQ/KSBiZWNhdXNlIGludGVycGV0aW5nIGFzIGxldHRlcnMuCisgIGlmIChDRkdfQ1BfUFJFU0VSVkUgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ByZXNlcnZlKSkgeworICAgIGNoYXIgKnByZSA9IHhzdHJkdXAoVFQuYy5wcmVzZXJ2ZSksICpzOworCisgICAgaWYgKGNvbW1hX3NjYW4ocHJlLCAiYWxsIiwgMSkpIFRULnBmbGFncyA9IH4wOworICAgIGZvciAoaT0wOyBpPEFSUkFZX0xFTihjcF9wcmVzZXJ2ZSk7IGkrKykKKyAgICAgIGlmIChjb21tYV9zY2FuKHByZSwgY3BfcHJlc2VydmVbaV0ubmFtZSwgMSkpIFRULnBmbGFncyB8PSAxPDxpOworICAgIGlmICgqcHJlKSB7CisKKyAgICAgIC8vIFRyeSB0byBpbnRlcnByZXQgYXMgbGV0dGVycywgY29tbWFzIHdvbid0IHNldCBhbnl0aGluZyB0aGlzIGRvZXNuJ3QuCisgICAgICBmb3IgKHMgPSBUVC5jLnByZXNlcnZlOyAqczsgcysrKSB7CisgICAgICAgIGZvciAoaT0wOyBpPEFSUkFZX0xFTihjcF9wcmVzZXJ2ZSk7IGkrKykKKyAgICAgICAgICBpZiAoKnMgPT0gKmNwX3ByZXNlcnZlW2ldLm5hbWUpIGJyZWFrOworICAgICAgICBpZiAoaSA9PSBBUlJBWV9MRU4oY3BfcHJlc2VydmUpKSB7CisgICAgICAgICAgaWYgKCpzID09ICdhJykgVFQucGZsYWdzID0gfjA7CisgICAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgfSBlbHNlIFRULnBmbGFncyB8PSAxPDxpOworICAgICAgfQorCisgICAgICBpZiAoKnMpIGVycm9yX2V4aXQoImJhZCAtLXByZXNlcnZlPSVzIiwgcHJlKTsKKyAgICB9CisgICAgZnJlZShwcmUpOworICB9CisgIGlmICghVFQuY2FsbGJhY2spIFRULmNhbGxiYWNrID0gY3Bfbm9kZTsKKworICAvLyBMb29wIHRocm91Z2ggc291cmNlcworICBmb3IgKGk9MDsgaTx0b3lzLm9wdGM7IGkrKykgeworICAgIGNoYXIgKnNyYyA9IHRveXMub3B0YXJnc1tpXTsKKyAgICBpbnQgcmMgPSAxOworCisgICAgaWYgKGRlc3RkaXIpIFRULmRlc3RuYW1lID0geG1wcmludGYoIiVzLyVzIiwgZGVzdG5hbWUsIGJhc2VuYW1lKHNyYykpOworICAgIGVsc2UgVFQuZGVzdG5hbWUgPSBkZXN0bmFtZTsKKworICAgIGVycm5vID0gRVhERVY7CisgICAgaWYgKENGR19NViAmJiB0b3lzLndoaWNoLT5uYW1lWzBdID09ICdtJykgeworICAgICAgaW50IGZvcmNlID0gdG95cy5vcHRmbGFncyAmIEZMQUdfZiwgbm9fY2xvYmJlciA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX247CisKKyAgICAgIGlmICghZm9yY2UgfHwgbm9fY2xvYmJlcikgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgaW50IGV4aXN0cyA9ICFzdGF0KFRULmRlc3RuYW1lLCAmc3QpOworCisgICAgICAgIC8vIFByb21wdCBpZiAtaSBvciBmaWxlIGlzbid0IHdyaXRhYmxlLiAgVGVjaG5pY2FsbHkgImlzIHdyaXRhYmxlIiBpcworICAgICAgICAvLyBtb3JlIGNvbXBsaWNhdGVkICgwMjIgaXMgbm90IHdyaXRlYWJsZSBieSB0aGUgb3duZXIsIGp1c3QgZXZlcnlib2R5CisgICAgICAgIC8vIF9lbHNlXykgYnV0IEkgZG9uJ3QgY2FyZS4KKyAgICAgICAgaWYgKGV4aXN0cyAmJiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIHx8ICEoc3Quc3RfbW9kZSAmIDAyMjIpKSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG92ZXJ3cml0ZSAnJXMnIiwgdG95cy53aGljaC0+bmFtZSwgVFQuZGVzdG5hbWUpOworICAgICAgICAgIGlmICgheWVzbm8oMSkpIHJjID0gMDsKKyAgICAgICAgICBlbHNlIHVubGluayhUVC5kZXN0bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgLW4gYW5kIGRlc3QgZXhpc3RzLCBkb24ndCB0cnkgdG8gcmVuYW1lKCkgb3IgY29weQorICAgICAgICBpZiAoZXhpc3RzICYmIG5vX2Nsb2JiZXIpIHJjID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChyYykgcmMgPSByZW5hbWUoc3JjLCBUVC5kZXN0bmFtZSk7CisgICAgfQorCisgICAgLy8gQ29weSBpZiB3ZSBkaWRuJ3QgbXYsIHNraXBwaW5nIG5vbmV4aXN0ZW50IHNvdXJjZXMKKyAgICBpZiAocmMpIHsKKyAgICAgIGlmIChlcnJubyE9RVhERVYgfHwgZGlydHJlZV9mbGFncmVhZChzcmMsIERJUlRSRUVfU0hVVFVQKworICAgICAgICBESVJUUkVFX1NZTUZPTExPVyohISh0b3lzLm9wdGZsYWdzJihGTEFHX0h8RkxBR19MKSksIFRULmNhbGxiYWNrKSkKKyAgICAgICAgICBwZXJyb3JfbXNnKCJiYWQgJyVzJyIsIHNyYyk7CisgICAgfQorICAgIGlmIChkZXN0ZGlyKSBmcmVlKFRULmRlc3RuYW1lKTsKKyAgfQorfQorCit2b2lkIG12X21haW4odm9pZCkKK3sKKyAgdG95cy5vcHRmbGFncyB8PSBGTEFHX2R8RkxBR19wfEZMQUdfUjsKKworICBjcF9tYWluKCk7Cit9CisKKy8vIEV4cG9ydCBjcCBmbGFncyBpbnRvIGluc3RhbGwncyBmbGFnIGNvbnRleHQuCisKK3N0YXRpYyBpbmxpbmUgaW50IGNwX2ZsYWdfRih2b2lkKSB7IHJldHVybiBGTEFHX0Y7IH07CitzdGF0aWMgaW5saW5lIGludCBjcF9mbGFnX3Aodm9pZCkgeyByZXR1cm4gRkxBR19wOyB9Oworc3RhdGljIGlubGluZSBpbnQgY3BfZmxhZ192KHZvaWQpIHsgcmV0dXJuIEZMQUdfdjsgfTsKKworLy8gU3dpdGNoIHRvIGluc3RhbGwncyBmbGFnIGNvbnRleHQKKyNkZWZpbmUgQ0xFQU5VUF9jcAorI2RlZmluZSBGT1JfaW5zdGFsbAorI2luY2x1ZGUgPGdlbmVyYXRlZC9mbGFncy5oPgorCitzdGF0aWMgaW50IGluc3RhbGxfbm9kZShzdHJ1Y3QgZGlydHJlZSAqdHJ5KQoreworICB0cnktPnN0LnN0X21vZGUgPSAoVFQuaS5tb2RlKQorICAgID8gc3RyaW5nX3RvX21vZGUoVFQuaS5tb2RlLCB0cnktPnN0LnN0X21vZGUpIDogMDc1NTsKKyAgaWYgKFRULmkuZ3JvdXApIHRyeS0+c3Quc3RfZ2lkID0gVFQuZ2lkOworICBpZiAoVFQuaS51c2VyKSB0cnktPnN0LnN0X3VpZCA9IFRULnVpZDsKKworICAvLyBBbHdheXMgcmV0dXJucyAwIGJlY2F1c2Ugbm8gLXIKKyAgY3Bfbm9kZSh0cnkpOworCisgIC8vIE5vIC1yIHNvIGFsd2F5cyBvbmUgbGV2ZWwgZGVlcCwgc28gZGVzdG5hbWUgYXMgc2V0IGJ5IGNwX25vZGUoKSBpcyBjb3JyZWN0CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKQorICAgIGlmICh4cnVuKChjaGFyICpbXSl7InN0cmlwIiwgIi1wIiwgVFQuZGVzdG5hbWUsIDB9KSkgdG95cy5leGl0dmFsID0gMTsKKworICByZXR1cm4gMDsKK30KKwordm9pZCBpbnN0YWxsX21haW4odm9pZCkKK3sKKyAgY2hhciAqKnNzOworICBpbnQgZmxhZ3MgPSB0b3lzLm9wdGZsYWdzOworCisgIGlmIChmbGFncyAmIEZMQUdfZCkgeworICAgIGZvciAoc3MgPSB0b3lzLm9wdGFyZ3M7ICpzczsgc3MrKykgeworICAgICAgaWYgKG1rcGF0aGF0KEFUX0ZEQ1dELCAqc3MsIDA3NzcsIDMpKSBwZXJyb3JfbXNnX3Jhdygqc3MpOworICAgICAgaWYgKGZsYWdzICYgRkxBR192KSBwcmludGYoIiVzXG4iLCAqc3MpOworICAgIH0KKworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19EKSB7CisgICAgVFQuZGVzdG5hbWUgPSB0b3lzLm9wdGFyZ3NbdG95cy5vcHRjLTFdOworICAgIGlmIChta3BhdGhhdChBVF9GRENXRCwgVFQuZGVzdG5hbWUsIDAsIDIpKQorICAgICAgcGVycm9yX2V4aXQoIi1EICclcyciLCBUVC5kZXN0bmFtZSk7CisgICAgaWYgKHRveXMub3B0YyA9PSAxKSByZXR1cm47CisgIH0KKyAgaWYgKHRveXMub3B0YyA8IDIpIGVycm9yX2V4aXQoIm5lZWRzIDIgYXJncyIpOworCisgIC8vIFRyYW5zbGF0ZSBmbGFncyBmcm9tIGluc3RhbGwgdG8gY3AKKyAgdG95cy5vcHRmbGFncyA9IGNwX2ZsYWdfRigpOworICBpZiAoZmxhZ3MgJiBGTEFHX3YpIHRveXMub3B0ZmxhZ3MgfD0gY3BfZmxhZ192KCk7CisgIGlmIChmbGFncyAmIChGTEFHX3B8RkxBR19vfEZMQUdfZykpIHRveXMub3B0ZmxhZ3MgfD0gY3BfZmxhZ19wKCk7CisKKyAgaWYgKFRULmkudXNlcikgVFQudWlkID0geGdldHVpZChUVC5pLnVzZXIpOworICBpZiAoVFQuaS5ncm91cCkgVFQuZ2lkID0geGdldGdpZChUVC5pLmdyb3VwKTsKKworICBUVC5jYWxsYmFjayA9IGluc3RhbGxfbm9kZTsKKyAgY3BfbWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY3Bpby5jIGIvdG95Ym94L3RveXMvcG9zaXgvY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDQwZjQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9jcGlvLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qIGNwaW8uYyAtIGEgYmFzaWMgY3BpbworICoKKyAqIFdyaXR0ZW4gMjAxMyBBRCBieSBJc2FhYyBEdW5oYW07IHRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlCisgKiBzYW1lIGxpY2Vuc2UgYXMgdG95Ym94IG9yIGFzIENDMCwgYXQgeW91ciBvcHRpb24uCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMTUgYnkgRnJvbnRpZXIgU2lsaWNvbiBMdGQuCisgKgorICogaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvTFNCXzQuMS4wL0xTQi1Db3JlLWdlbmVyaWMvTFNCLUNvcmUtZ2VuZXJpYy9jcGlvLmh0bWwKKyAqIGFuZCBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvNzkwODc5OS94Y3UvY3Bpby5odG1sCisgKgorICogWWVzLCB0aGF0J3MgU1VTdjIsIHRoZSBuZXdlciBzdGFuZGFyZHMgcmVtb3ZlZCBpdCBhcm91bmQgdGhlIHRpbWUgUlBNCisgKiBhbmQgaW5pdHJhbWZzIHN0YXJ0ZWQgaGVhdmlseSB1c2luZyB0aGlzIGFyY2hpdmUgZm9ybWF0LgorICoKKyAqIE1vZGVybiBjcGlvIGV4cGFuZGVkIGhlYWRlciB0byAxMTAgYnl0ZXMgKGZpcnN0IGZpZWxkIDYgYnl0ZXMsIHJlc3QgYXJlIDgpLgorICogSW4gb3JkZXI6IG1hZ2ljIGlubyBtb2RlIHVpZCBnaWQgbmxpbmsgbXRpbWUgZmlsZXNpemUgZGV2bWFqb3IgZGV2bWlub3IKKyAqIHJkZXZtYWpvciByZGV2bWlub3IgbmFtZXNpemUgY2hlY2sKKyAqIFRoaXMgaXMgdGhlIGVxdWlhdmxlbnQgb2YgbW9kZSAtSCBuZXdjIHdoZW4gdXNpbmcgR05VIENQSU8uCisKK1VTRV9DUElPKE5FV1RPWShjcGlvLCAiKG5vLXByZXNlcnZlLW93bmVyKW1kdUg6cDp8aXx0fEY6dih2ZXJib3NlKW98WyFwaW9dWyFwb3RdWyFwRl0iLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBDUElPCisgIGJvb2wgImNwaW8iCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGNwaW8gLXtvfHR8aXxwIERFU1R9IFstdl0gWy0tdmVyYm9zZV0gWy1GIEZJTEVdIFstLW5vLXByZXNlcnZlLW93bmVyXQorICAgICAgICAgICBbaWdub3JlZDogLW1kdSAtSCBuZXdjXQorCisgICAgY29weSBmaWxlcyBpbnRvIGFuZCBvdXQgb2YgYSAibmV3YyIgZm9ybWF0IGNwaW8gYXJjaGl2ZQorCisgICAgLUYgRklMRQl1c2UgYXJjaGl2ZSBGSUxFIGluc3RlYWQgb2Ygc3RkaW4vc3Rkb3V0CisgICAgLXAgREVTVAljb3B5LXBhc3MgbW9kZSwgY29weSBzdGRpbiBmaWxlIGxpc3QgdG8gZGlyZWN0b3J5IERFU1QKKyAgICAtaQlleHRyYWN0IGZyb20gYXJjaGl2ZSBpbnRvIGZpbGUgc3lzdGVtIChzdGRpbj1hcmNoaXZlKQorICAgIC1vCWNyZWF0ZSBhcmNoaXZlIChzdGRpbj1saXN0IG9mIGZpbGVzLCBzdGRvdXQ9YXJjaGl2ZSkKKyAgICAtdAl0ZXN0IGZpbGVzIChsaXN0IG9ubHksIHN0ZGluPWFyY2hpdmUsIHN0ZG91dD1saXN0IG9mIGZpbGVzKQorICAgIC12CXZlcmJvc2UgKGxpc3QgZmlsZXMgZHVyaW5nIGNyZWF0ZS9leHRyYWN0KQorICAgIC0tbm8tcHJlc2VydmUtb3duZXIgKGRvbid0IHNldCBvd25lcnNoaXAgZHVyaW5nIGV4dHJhY3QpCisqLworCisjZGVmaW5lIEZPUl9jcGlvCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICphcmNoaXZlOworICBjaGFyICpwYXNzOworICBjaGFyICpmbXQ7CispCisKKy8vIFJlYWQgc3RyaW5ncywgdGFpbCBwYWRkZWQgdG8gNCBieXRlIGFsaWdubWVudC4gQXJndW1lbnQgImFsaWduIiBpcyBhbW91bnQKKy8vIGJ5IHdoaWNoIHN0YXJ0IG9mIHN0cmluZyBpc24ndCBhbGlnbmVkICh1c3VhbGx5IDAsIGJ1dCBoZWFkZXIgaXMgMTEwIGJ5dGVzCisvLyB3aGljaCBpcyAyIGJ5dGVzIG9mZiBiZWNhdXNlIHRoZSBmaXJzdCBmaWVsZCB3YXNuJ3QgZXhwYW5kZWQgZnJvbSA2IHRvIDgpLgorc3RhdGljIGNoYXIgKnN0cnBhZChpbnQgZmQsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgYWxpZ24pCit7CisgIGNoYXIgKnN0cjsKKworICBhbGlnbiA9IChhbGlnbiArIGxlbikgJiAzOworICBpZiAoYWxpZ24pIGxlbiArPSAoNC1hbGlnbik7CisgIHhyZWFkYWxsKGZkLCBzdHIgPSB4bWFsbG9jKGxlbisxKSwgbGVuKTsKKyAgc3RyW2xlbl09MDsgLy8gcmVkdW5kYW50LCBpbiBjYXNlIGFyY2hpdmUgaXMgYmFkCisKKyAgcmV0dXJuIHN0cjsKK30KKworLy9jb252ZXJ0IGhleCB0byB1aW50OyBtb3N0bHkgdG8gYWxsb3cgdXNpbmcgYml0cyBvZiBub24tdGVybWluYXRlZCBzdHJpbmdzCit1bnNpZ25lZCB4OHUoY2hhciAqaGV4KQoreworICB1bnNpZ25lZCB2YWwsIGlucG9zID0gOCwgb3V0cG9zOworICBjaGFyIHBhdHRlcm5bNl07CisKKyAgd2hpbGUgKCpoZXggPT0gJzAnKSB7CisgICAgaGV4Kys7CisgICAgaWYgKCEtLWlucG9zKSByZXR1cm4gMDsKKyAgfQorICAvLyBCZWNhdXNlIHNjYW5mIGdyYXR1aXRvdXNseSB0cmVhdHMgJSpYIGRpZmZlcmVudGx5IHRoYW4gcHJpbnRmIGRvZXMuCisgIHNwcmludGYocGF0dGVybiwgIiUlJWRYJSVuIiwgaW5wb3MpOworICBzc2NhbmYoaGV4LCBwYXR0ZXJuLCAmdmFsLCAmb3V0cG9zKTsKKyAgaWYgKGlucG9zICE9IG91dHBvcykgZXJyb3JfZXhpdCgiYmFkIGhlYWRlciIpOworCisgIHJldHVybiB2YWw7Cit9CisKK3ZvaWQgY3Bpb19tYWluKHZvaWQpCit7CisgIC8vIFN1YnRsZSBiaXQ6IEZMQUdfbyBpcyAxIHNvIHdlIGNhbiBqdXN0IHVzZSBpdCB0byBzZWxlY3Qgc3RkaW4vc3Rkb3V0LgorICBpbnQgcGlwZSwgYWZkID0gdG95cy5vcHRmbGFncyAmIEZMQUdfbzsKKyAgcGlkX3QgcGlkID0gMDsKKworICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlLCBwYXJlbnQgc3RheXMgaW4gb3JpZ2luYWwgZGlyIGFuZCBnZW5lcmF0ZXMgYXJjaGl2ZQorICAvLyB0byBwaXBlLCBjaGlsZCBkb2VzIGNoZGlyIHRvIG5ldyBkaXIgYW5kIHJlYWRzIGFyY2hpdmUgZnJvbSBzdGRpbiAocGlwZSkuCisgIGlmIChUVC5wYXNzKSB7CisgICAgaWYgKHRveXMuc3RhY2t0b3ApIHsKKyAgICAgIC8vIHhwb3BlbigpIGRvZXNuJ3QgcmV0dXJuIGZyb20gY2hpbGQgZHVlIHRvIHZmb3JrKCksIGluc3RlYWQgcmVzdGFydHMKKyAgICAgIC8vIHdpdGggIXRveXMuc3RhY2t0b3AKKyAgICAgIHBpZCA9IHhwb3BlbigwLCAmcGlwZSwgMCk7CisgICAgICBhZmQgPSBwaXBlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBjaGlsZAorICAgICAgdG95cy5vcHRmbGFncyB8PSBGTEFHX2k7CisgICAgICB4Y2hkaXIoVFQucGFzcyk7CisgICAgfQorICB9CisKKyAgaWYgKFRULmFyY2hpdmUpIHsKKyAgICBpbnQgcGVybSA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSA/IE9fQ1JFQVR8T19XUk9OTFl8T19UUlVOQyA6IE9fUkRPTkxZOworCisgICAgYWZkID0geGNyZWF0ZShUVC5hcmNoaXZlLCBwZXJtLCAwNjQ0KTsKKyAgfQorCisgIC8vIHJlYWQgY3BpbyBhcmNoaXZlCisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiAoRkxBR19pfEZMQUdfdCkpIGZvciAoOzspIHsKKyAgICBjaGFyICpuYW1lLCAqdG9mcmVlLCAqZGF0YTsKKyAgICB1bnNpZ25lZCBzaXplLCBtb2RlLCB1aWQsIGdpZCwgdGltZXN0YW1wOworICAgIGludCB0ZXN0ID0gdG95cy5vcHRmbGFncyAmIEZMQUdfdCwgZXJyID0gMDsKKworICAgIC8vIFJlYWQgaGVhZGVyIGFuZCBuYW1lLgorICAgIHhyZWFkYWxsKGFmZCwgdG95YnVmLCAxMTApOworICAgIGlmIChtZW1jbXAodG95YnVmLCAiMDcwNzAxIiwgNikpIGVycm9yX2V4aXQoImJhZCBjcGlvIG1hZ2ljIik7CisgICAgdG9mcmVlID0gbmFtZSA9IHN0cnBhZChhZmQsIHg4dSh0b3lidWYrOTQpLCAxMTApOworICAgIGlmICghc3RyY21wKCJUUkFJTEVSISEhIiwgbmFtZSkpIHsKKyAgICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUodG9mcmVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIHlvdSB3YW50IHRvIGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMsICJjZCAvIiBhbmQgcnVuIGNwaW8uCisgICAgd2hpbGUgKCpuYW1lID09ICcvJykgbmFtZSsrOworICAgIC8vIFRPRE86IHJlbW92ZSAuLiBlbnRyaWVzCisKKyAgICBzaXplID0geDh1KHRveWJ1Zis1NCk7CisgICAgbW9kZSA9IHg4dSh0b3lidWYrMTQpOworICAgIHVpZCA9IHg4dSh0b3lidWYrMjIpOworICAgIGdpZCA9IHg4dSh0b3lidWYrMzApOworICAgIHRpbWVzdGFtcCA9IHg4dSh0b3lidWYrNDYpOyAvLyB1bnNpZ25lZCAzMiBiaXQsIHNvIHllYXIgMjEwMCBwcm9ibGVtCisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIChGTEFHX3R8RkxBR192KSkgcHV0cyhuYW1lKTsKKworICAgIGlmICghdGVzdCAmJiBzdHJyY2hyKG5hbWUsICcvJykgJiYgbWtwYXRoYXQoQVRfRkRDV0QsIG5hbWUsIDAsIDIpKSB7CisgICAgICBwZXJyb3JfbXNnKCJta3BhdGggJyVzJyIsIG5hbWUpOworICAgICAgdGVzdCsrOworICAgIH0KKworICAgIC8vIENvbnN1bWUgZW50aXJlIHJlY29yZCBldmVuIGlmIGl0IGNvdWxkbid0IGNyZWF0ZSBmaWxlLCBzbyB3ZSdyZQorICAgIC8vIHByb3Blcmx5IGFsaWduZWQgd2l0aCBuZXh0IGZpbGUuCisKKyAgICBpZiAoU19JU0RJUihtb2RlKSkgeworICAgICAgaWYgKCF0ZXN0KSBlcnIgPSBta2RpcihuYW1lLCBtb2RlKTsKKyAgICB9IGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIHsKKyAgICAgIGRhdGEgPSBzdHJwYWQoYWZkLCBzaXplLCAwKTsKKyAgICAgIGlmICghdGVzdCkgZXJyID0gc3ltbGluayhkYXRhLCBuYW1lKTsKKyAgICAgIGZyZWUoZGF0YSk7CisgICAgICAvLyBDYW4ndCBnZXQgYSBmaWxlaGFuZGxlIHRvIGEgc3ltbGluaywgc28gZG8gc3BlY2lhbCBjaG93bgorICAgICAgaWYgKCFlcnIgJiYgIWdldGV1aWQoKSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX25vX3ByZXNlcnZlX293bmVyKSkKKyAgICAgICAgZXJyID0gbGNob3duKG5hbWUsIHVpZCwgZ2lkKTsKKyAgICB9IGVsc2UgaWYgKFNfSVNSRUcobW9kZSkpIHsKKyAgICAgIGludCBmZCA9IHRlc3QgPyAwIDogb3BlbihuYW1lLCBPX0NSRUFUfE9fV1JPTkxZfE9fVFJVTkN8T19OT0ZPTExPVywgbW9kZSk7CisKKyAgICAgIC8vIElmIHdyaXRlIGZhaWxzLCB3ZSBzdGlsbCBuZWVkIHRvIHJlYWQvZGlzY2FyZCBkYXRhIHRvIGNvbnRpbnVlIHdpdGgKKyAgICAgIC8vIGFyY2hpdmUuIFNpbmNlIGRvaW5nIHNvIG92ZXJ3cml0ZXMgZXJybm8sIHJlcG9ydCBlcnJvciBub3cKKyAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcGVycm9yX21zZygiY3JlYXRlICVzIiwgbmFtZSk7CisgICAgICAgIHRlc3QrKzsKKyAgICAgIH0KKworICAgICAgZGF0YSA9IHRveWJ1ZjsKKyAgICAgIHdoaWxlIChzaXplKSB7CisgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKHRveWJ1ZikpIGRhdGEgPSBzdHJwYWQoYWZkLCBzaXplLCAwKTsKKyAgICAgICAgZWxzZSB4cmVhZGFsbChhZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgICAgICBpZiAoIXRlc3QpIHh3cml0ZShmZCwgZGF0YSwgZGF0YSA9PSB0b3lidWYgPyBzaXplb2YodG95YnVmKSA6IHNpemUpOworICAgICAgICBpZiAoZGF0YSAhPSB0b3lidWYpIHsKKyAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gc2l6ZW9mKHRveWJ1Zik7CisgICAgICB9CisKKyAgICAgIGlmICghdGVzdCkgeworICAgICAgICAvLyBzZXQgb3duZXIsIHJlc3RvcmUgZHJvcHBlZCBzdWlkIGJpdAorICAgICAgICBpZiAoIWdldGV1aWQoKSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX25vX3ByZXNlcnZlX293bmVyKSkgeworICAgICAgICAgIGVyciA9IGZjaG93bihmZCwgdWlkLCBnaWQpOworICAgICAgICAgIGlmICghZXJyKSBlcnIgPSBmY2htb2QoZmQsIG1vZGUpOworICAgICAgICB9CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCF0ZXN0KQorICAgICAgZXJyID0gbWtub2QobmFtZSwgbW9kZSwgZGV2X21ha2VkZXYoeDh1KHRveWJ1Zis3OCksIHg4dSh0b3lidWYrODYpKSk7CisKKyAgICAvLyBTZXQgb3duZXJzaGlwIGFuZCB0aW1lc3RhbXAuCisgICAgaWYgKCF0ZXN0ICYmICFlcnIpIHsKKyAgICAgIC8vIENyZWFkaW5nIGRpci9kZXYgZG9lc24ndCBnaXZlIHVzIGEgZmlsZWhhbmRsZSwgd2UgaGF2ZSB0byByZWZlciB0byBpdAorICAgICAgLy8gYnkgbmFtZSB0byBjaG93bi91dGltZSwgYnV0IGhvdyBkbyB3ZSBrbm93IGl0J3MgdGhlIHNhbWUgaXRlbT8KKyAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXQgbGVhc3QgaGF2ZSB0aGUgcmlnaHQgdHlwZSBvZiBlbnRpdHkgb3BlbiwgYW5kIGRvCisgICAgICAvLyBOT1QgcmVzdG9yZSBkcm9wcGVkIHN1aWQgYml0IGluIHRoaXMgY2FzZS4KKyAgICAgIGlmICghU19JU1JFRyhtb2RlKSAmJiAhU19JU0xOSyhtb2RlKSAmJiAhZ2V0ZXVpZCgpCisgICAgICAgICAgJiYgISh0b3lzLm9wdGZsYWdzICYgRkxBR19ub19wcmVzZXJ2ZV9vd25lcikpCisgICAgICB7CisgICAgICAgIGludCBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFl8T19OT0ZPTExPVyk7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgICAgIGlmIChmZCAhPSAtMSAmJiAhZnN0YXQoZmQsICZzdCkgJiYgKHN0LnN0X21vZGUmU19JRk1UKSA9PSAobW9kZSZTX0lGTVQpKQorICAgICAgICAgIGVyciA9IGZjaG93bihmZCwgdWlkLCBnaWQpOworICAgICAgICBlbHNlIGVyciA9IDE7CisKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgfQorCisgICAgICAvLyBzZXQgdGltZXN0YW1wCisgICAgICBpZiAoIWVycikgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZXNbMl07CisKKyAgICAgICAgbWVtc2V0KHRpbWVzLCAwLCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSoyKTsKKyAgICAgICAgdGltZXNbMF0udHZfc2VjID0gdGltZXNbMV0udHZfc2VjID0gdGltZXN0YW1wOworICAgICAgICBlcnIgPSB1dGltZW5zYXQoQVRfRkRDV0QsIG5hbWUsIHRpbWVzLCBBVF9TWU1MSU5LX05PRk9MTE9XKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyKSBwZXJyb3JfbXNnX3JhdyhuYW1lKTsKKyAgICBmcmVlKHRvZnJlZSk7CisKKyAgLy8gT3V0cHV0IGNwaW8gYXJjaGl2ZQorCisgIH0gZWxzZSB7CisgICAgY2hhciAqbmFtZSA9IDA7CisgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICB1bnNpZ25lZCBubGVuLCBlcnJvciA9IDAsIHplcm8gPSAwOworICAgICAgaW50IGxlbiwgZmQgPSAtMTsKKyAgICAgIHNzaXplX3QgbGxlbjsKKworICAgICAgbGVuID0gZ2V0bGluZSgmbmFtZSwgJnNpemUsIHN0ZGluKTsKKyAgICAgIGlmIChsZW48MSkgYnJlYWs7CisgICAgICBpZiAobmFtZVtsZW4tMV0gPT0gJ1xuJykgbmFtZVstLWxlbl0gPSAwOworICAgICAgbmxlbiA9IGxlbisxOworICAgICAgaWYgKGxzdGF0KG5hbWUsICZzdCkgfHwgKFNfSVNSRUcoc3Quc3RfbW9kZSkKKyAgICAgICAgICAmJiBzdC5zdF9zaXplICYmIChmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpKTwwKSkKKyAgICAgIHsKKyAgICAgICAgcGVycm9yX21zZ19yYXcobmFtZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgIVNfSVNMTksoc3Quc3RfbW9kZSkpIHN0LnN0X3NpemUgPSAwOworICAgICAgaWYgKHN0LnN0X3NpemUgPj4gMzIpIHBlcnJvcl9tc2coInNraXBwaW5nID4yRyBmaWxlICclcyciLCBuYW1lKTsKKyAgICAgIGVsc2UgeworICAgICAgICBsbGVuID0gc3ByaW50Zih0b3lidWYsCisgICAgICAgICAgIjA3MDcwMSUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiLAorICAgICAgICAgIChpbnQpc3Quc3RfaW5vLCBzdC5zdF9tb2RlLCBzdC5zdF91aWQsIHN0LnN0X2dpZCwgKGludClzdC5zdF9ubGluaywKKyAgICAgICAgICAoaW50KXN0LnN0X210aW1lLCAoaW50KXN0LnN0X3NpemUsIGRldl9tYWpvcihzdC5zdF9kZXYpLAorICAgICAgICAgIGRldl9taW5vcihzdC5zdF9kZXYpLCBkZXZfbWFqb3Ioc3Quc3RfcmRldiksIGRldl9taW5vcihzdC5zdF9yZGV2KSwKKyAgICAgICAgICBubGVuLCAwKTsKKyAgICAgICAgeHdyaXRlKGFmZCwgdG95YnVmLCBsbGVuKTsKKyAgICAgICAgeHdyaXRlKGFmZCwgbmFtZSwgbmxlbik7CisKKyAgICAgICAgLy8gTlVMIFBhZCBoZWFkZXIgdXAgdG8gNCBtdWx0aXBsZSBieXRlcy4KKyAgICAgICAgbGxlbiA9IChsbGVuICsgbmxlbikgJiAzOworICAgICAgICBpZiAobGxlbikgeHdyaXRlKGFmZCwgJnplcm8sIDQtbGxlbik7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IGJvZHkgZm9yIHN5bWxpbmsgb3IgcmVndWxhciBmaWxlCisgICAgICAgIGxsZW4gPSBzdC5zdF9zaXplOworICAgICAgICBpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworICAgICAgICAgIGlmIChyZWFkbGluayhuYW1lLCB0b3lidWYsIHNpemVvZih0b3lidWYpLTEpID09IGxsZW4pCisgICAgICAgICAgICB4d3JpdGUoYWZkLCB0b3lidWYsIGxsZW4pOworICAgICAgICAgIGVsc2UgcGVycm9yX21zZygicmVhZGxpbmsgJyVzJyIsIG5hbWUpOworICAgICAgICB9IGVsc2Ugd2hpbGUgKGxsZW4pIHsKKyAgICAgICAgICBubGVuID0gbGxlbiA+IHNpemVvZih0b3lidWYpID8gc2l6ZW9mKHRveWJ1ZikgOiBsbGVuOworICAgICAgICAgIGxsZW4gLT0gbmxlbjsKKyAgICAgICAgICAvLyBJZiByZWFkIGZhaWxzLCB3cml0ZSBhbnl3YXkgKGFscmVhZHkgd3JvdGUgc2l6ZSBpbiBoZWFkZXIpCisgICAgICAgICAgaWYgKG5sZW4gIT0gcmVhZGFsbChmZCwgdG95YnVmLCBubGVuKSkKKyAgICAgICAgICAgIGlmICghZXJyb3IrKykgcGVycm9yX21zZygiYmFkIHJlYWQgZnJvbSBmaWxlICclcyciLCBuYW1lKTsKKyAgICAgICAgICB4d3JpdGUoYWZkLCB0b3lidWYsIG5sZW4pOworICAgICAgICB9CisgICAgICAgIGxsZW4gPSBzdC5zdF9zaXplICYgMzsKKyAgICAgICAgaWYgKGxsZW4pIHh3cml0ZShhZmQsICZ6ZXJvLCA0LWxsZW4pOworICAgICAgfQorICAgICAgY2xvc2UoZmQpOworICAgIH0KKyAgICBmcmVlKG5hbWUpOworCisgICAgbWVtc2V0KHRveWJ1ZiwgMCwgc2l6ZW9mKHRveWJ1ZikpOworICAgIHh3cml0ZShhZmQsIHRveWJ1ZiwKKyAgICAgIHNwcmludGYodG95YnVmLCAiMDcwNzAxJTA0MFglMDU2WCUwOFhUUkFJTEVSISEhIiwgMSwgMHgwYiwgMCkrNCk7CisgIH0KKyAgaWYgKFRULmFyY2hpdmUpIHhjbG9zZShhZmQpOworCisgIGlmIChUVC5wYXNzKSB0b3lzLmV4aXR2YWwgfD0geHBjbG9zZShwaWQsIHBpcGUpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvY3V0LmMgYi90b3lib3gvdG95cy9wb3NpeC9jdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JlNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvY3V0LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIGN1dC5jIC0gQ3V0IGZyb20gYSBmaWxlLgorICoKKyAqIENvcHlyaWdodCAyMDEyIFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDEyIEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9jdXQuaHRtbAorICoKKyAqIFRPRE86IGNsZWFudXAKKworVVNFX0NVVChORVdUT1koY3V0LCAiYjp8Yzp8Zjp8ZDpzblshY2JmXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIENVVAorICBib29sICJjdXQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGN1dCBPUFRJT04uLi4gW0ZJTEVdLi4uCisKKyAgICBQcmludCBzZWxlY3RlZCBwYXJ0cyBvZiBsaW5lcyBmcm9tIGVhY2ggRklMRSB0byBzdGFuZGFyZCBvdXRwdXQuCisKKyAgICAtYiBMSVNUCXNlbGVjdCBvbmx5IHRoZXNlIGJ5dGVzIGZyb20gTElTVC4KKyAgICAtYyBMSVNUCXNlbGVjdCBvbmx5IHRoZXNlIGNoYXJhY3RlcnMgZnJvbSBMSVNULgorICAgIC1mIExJU1QJc2VsZWN0IG9ubHkgdGhlc2UgZmllbGRzLgorICAgIC1kIERFTElNCXVzZSBERUxJTSBpbnN0ZWFkIG9mIFRBQiBmb3IgZmllbGQgZGVsaW1pdGVyLgorICAgIC1zCWRvIG5vdCBwcmludCBsaW5lcyBub3QgY29udGFpbmluZyBkZWxpbWl0ZXJzLgorICAgIC1uCWRvbid0IHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIChJZ25vcmVkKS4KKyovCisjZGVmaW5lIEZPUl9jdXQKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmRlbGltOworICBjaGFyICpmbGlzdDsKKyAgY2hhciAqY2xpc3Q7CisgIGNoYXIgKmJsaXN0OworCisgIHZvaWQgKnNsaXN0X2hlYWQ7CisgIHVuc2lnbmVkIG5lbGVtOworICB2b2lkICgqZG9fY3V0KShpbnQgZmQpOworKQorCitzdHJ1Y3Qgc2xpc3QgeworICBzdHJ1Y3Qgc2xpc3QgKm5leHQ7CisgIGludCBzdGFydCwgZW5kOworfTsKKworc3RhdGljIHZvaWQgYWRkX3RvX2xpc3QoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICBzdHJ1Y3Qgc2xpc3QgKmN1cnJlbnQsICpoZWFkX3JlZiwgKnRlbXAxX25vZGU7CisKKyAgaGVhZF9yZWYgPSBUVC5zbGlzdF9oZWFkOworICB0ZW1wMV9ub2RlID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHNsaXN0KSk7CisgIHRlbXAxX25vZGUtPnN0YXJ0ID0gc3RhcnQ7CisgIHRlbXAxX25vZGUtPmVuZCA9IGVuZDsKKworICAvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBoZWFkIGVuZCAqLworICBpZiAoIWhlYWRfcmVmIHx8IGhlYWRfcmVmLT5zdGFydCA+PSBzdGFydCkgeyAKKyAgICAgIHRlbXAxX25vZGUtPm5leHQgPSBoZWFkX3JlZjsgCisgICAgICBoZWFkX3JlZiA9IHRlbXAxX25vZGU7CisgIH0gZWxzZSB7IAorICAgIC8qIExvY2F0ZSB0aGUgbm9kZSBiZWZvcmUgdGhlIHBvaW50IG9mIGluc2VydGlvbiAqLyAgIAorICAgIGN1cnJlbnQgPSBoZWFkX3JlZjsgICAKKyAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAmJiBjdXJyZW50LT5uZXh0LT5zdGFydCA8IHRlbXAxX25vZGUtPnN0YXJ0KQorICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICB0ZW1wMV9ub2RlLT5uZXh0ID0gY3VycmVudC0+bmV4dDsgICAKKyAgICBjdXJyZW50LT5uZXh0ID0gdGVtcDFfbm9kZTsKKyAgfQorICBUVC5zbGlzdF9oZWFkID0gaGVhZF9yZWY7Cit9CisKKy8vIHBhcnNlIGxpc3QgYW5kIGFkZCB0byBzbGlzdC4KK3N0YXRpYyB2b2lkIHBhcnNlX2xpc3QoY2hhciAqbGlzdCkKK3sKKyAgZm9yICg7OykgeworICAgIGNoYXIgKmN0b2tlbiA9IHN0cnNlcCgmbGlzdCwgIiwiKSwgKmR0b2tlbjsKKyAgICBpbnQgc3RhcnQgPSAwLCBlbmQgPSBJTlRfTUFYOworCisgICAgaWYgKCFjdG9rZW4pIGJyZWFrOworICAgIGlmICghKmN0b2tlbikgY29udGludWU7CisKKyAgICAvLyBHZXQgc3RhcnQgcG9zaXRpb24uCisgICAgaWYgKCooZHRva2VuID0gc3Ryc2VwKCZjdG9rZW4sICItIikpKSB7CisgICAgICBzdGFydCA9IGF0b2x4X3JhbmdlKGR0b2tlbiwgMCwgSU5UX01BWCk7CisgICAgICBzdGFydCA9IChzdGFydD8oc3RhcnQtMSk6c3RhcnQpOworICAgIH0KKworICAgIC8vIEdldCBlbmQgcG9zaXRpb24uCisgICAgaWYgKCFjdG9rZW4pIGVuZCA9IC0xOyAvL2Nhc2UgZS5nLiAxLDIsMworICAgIGVsc2UgaWYgKCpjdG9rZW4pIHsvL2Nhc2UgZS5nLiBOLU0KKyAgICAgIGVuZCA9IGF0b2x4X3JhbmdlKGN0b2tlbiwgMCwgSU5UX01BWCk7CisgICAgICBpZiAoIWVuZCkgZW5kID0gSU5UX01BWDsKKyAgICAgIGVuZC0tOworICAgICAgaWYoZW5kID09IHN0YXJ0KSBlbmQgPSAtMTsKKyAgICB9CisgICAgYWRkX3RvX2xpc3Qoc3RhcnQsIGVuZCk7CisgICAgVFQubmVsZW0rKzsKKyAgfQorICAvLyBpZiBsaXN0IGlzIG1pc3NpbmcgaW4gY29tbWFuZCBsaW5lLgorICBpZiAoIVRULm5lbGVtKSBlcnJvcl9leGl0KCJtaXNzaW5nIHBvc2l0aW9ucyBsaXN0Iik7Cit9CisKKy8qCisgKiByZXRyaXZlIGRhdGEgZnJvbSB0aGUgZmlsZS9zLgorICovCitzdGF0aWMgdm9pZCBnZXRfZGF0YSh2b2lkKQoreworICBjaGFyICoqYXJndiA9IHRveXMub3B0YXJnczsgLy9maWxlIG5hbWUuCisgIHRveXMuZXhpdHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworICBpZighKmFyZ3YpIFRULmRvX2N1dCgwKTsgLy9mb3Igc3RkaW4KKyAgZWxzZSB7CisgICAgZm9yKDsgKmFyZ3Y7ICsrYXJndikgeworICAgICAgaWYoc3RyY21wKCphcmd2LCAiLSIpID09IDApIFRULmRvX2N1dCgwKTsgLy9mb3Igc3RkaW4KKyAgICAgIGVsc2UgeworICAgICAgICBpbnQgZmQgPSBvcGVuKCphcmd2LCBPX1JET05MWSwgMCk7CisgICAgICAgIGlmIChmZCA8IDApIHsvL2lmIGZpbGUgbm90IHByZXNlbnQgdGhlbiBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzLgorICAgICAgICAgIHBlcnJvcl9tc2dfcmF3KCphcmd2KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBUVC5kb19jdXQoZmQpOworICAgICAgICB4Y2xvc2UoZmQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBwZXJmb3JtIGN1dCBvcGVyYXRpb24gb24gdGhlIGdpdmVuIGRlbGltaXRlci4KK3N0YXRpYyB2b2lkIGRvX2ZjdXQoaW50IGZkKQoreworICBjaGFyICpidWZmLCAqcGZpZWxkID0gMCwgKmRlbGltaXRlciA9IFRULmRlbGltOworCisgIGZvciAoOzspIHsKKyAgICB1bnNpZ25lZCBjcG9zID0gMDsKKyAgICBpbnQgc3RhcnQsIG5kZWxpbWl0ZXJzID0gLTE7CisgICAgaW50ICBucHJpbnRlZF9maWVsZHMgPSAwOworICAgIHN0cnVjdCBzbGlzdCAqdGVtcF9ub2RlID0gVFQuc2xpc3RfaGVhZDsKKworICAgIGZyZWUocGZpZWxkKTsKKyAgICBwZmllbGQgPSAwOworCisgICAgaWYgKCEoYnVmZiA9IGdldF9saW5lKGZkKSkpIGJyZWFrOworCisgICAgLy9kb2VzIGxpbmUgaGF2ZSBhbnkgZGVsaW1pdGVyPy4KKyAgICBpZiAoc3RycmNocihidWZmLCAoaW50KWRlbGltaXRlclswXSkgPT0gTlVMTCkgeworICAgICAgLy9pZiBub3QgdGhlbiBwcmludCB3aG9sZSBsaW5lIGFuZCBtb3ZlIHRvIG5leHQgbGluZS4KKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpKSB4cHV0cyhidWZmKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBmaWVsZCA9IHh6YWxsb2Moc3RybGVuKGJ1ZmYpICsgMSk7CisKKyAgICBpZiAodGVtcF9ub2RlKSB7CisgICAgICAvL3Byb2Nlc3MgbGlzdCBvbiBlYWNoIGxpbmUuCisgICAgICB3aGlsZSAoY3BvcyA8IFRULm5lbGVtICYmIGJ1ZmYpIHsKKyAgICAgICAgaWYgKCF0ZW1wX25vZGUpIGJyZWFrOworICAgICAgICBzdGFydCA9IHRlbXBfbm9kZS0+c3RhcnQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBjaGFyICpmaWVsZCA9IDA7CisKKyAgICAgICAgICAvL2NvdW50IG51bWJlciBvZiBkZWxpbWV0ZXJzIHBlciBsaW5lLgorICAgICAgICAgIHdoaWxlIChidWZmKSB7CisgICAgICAgICAgICBpZiAobmRlbGltaXRlcnMgPCBzdGFydCkgeworICAgICAgICAgICAgICBuZGVsaW1pdGVycysrOworICAgICAgICAgICAgICBmaWVsZCA9IHN0cnNlcCgmYnVmZiwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy9wcmludCBmaWVsZCAoaWYgbm90IHlldCBwcmludGVkKS4KKyAgICAgICAgICBpZiAoIXBmaWVsZFtuZGVsaW1pdGVyc10pIHsKKyAgICAgICAgICAgIGlmIChuZGVsaW1pdGVycyA9PSBzdGFydCkgeworICAgICAgICAgICAgICAvL3B1dCBkZWxpbWl0ZXIuCisgICAgICAgICAgICAgIGlmIChucHJpbnRlZF9maWVsZHMrKyA+IDApIHhwdXRjKGRlbGltaXRlclswXSk7CisgICAgICAgICAgICAgIGlmIChmaWVsZCkgZnB1dHMoZmllbGQsIHN0ZG91dCk7CisgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoaXMgZmllbGQgd29uJ3QgcHJpbnQgYWdhaW4uCisgICAgICAgICAgICAgIHBmaWVsZFtuZGVsaW1pdGVyc10gPSAoY2hhcikgMHgyMzsgLy9wdXQgc29tZSBjaGFyIGF0IHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHN0YXJ0Kys7CisgICAgICAgICAgaWYgKCh0ZW1wX25vZGUtPmVuZCA8IDApIHx8ICFidWZmKSBicmVhazsgICAgICAgICAgCisgICAgICAgIH0gd2hpbGUoc3RhcnQgPD0gdGVtcF9ub2RlLT5lbmQpOworICAgICAgICB0ZW1wX25vZGUgPSB0ZW1wX25vZGUtPm5leHQ7CisgICAgICAgIGNwb3MrKzsKKyAgICAgIH0KKyAgICB9CisgICAgeHB1dGMoJ1xuJyk7CisgIH0KK30KKworLy8gcGVyZm9ybSBjdXQgb3BlcmF0aW9uIGNoYXIgb3IgYnl0ZS4KK3N0YXRpYyB2b2lkIGRvX2JjY3V0KGludCBmZCkKK3sKKyAgY2hhciAqYnVmZjsKKworICB3aGlsZSAoKGJ1ZmYgPSBnZXRfbGluZShmZCkpICE9IE5VTEwpIHsKKyAgICB1bnNpZ25lZCBjcG9zID0gMDsKKyAgICBpbnQgYnVmZmxuID0gc3RybGVuKGJ1ZmYpOworICAgIGNoYXIgKnBmaWVsZCA9IHh6YWxsb2MoYnVmZmxuICsgMSk7CisgICAgc3RydWN0IHNsaXN0ICp0ZW1wX25vZGUgPSBUVC5zbGlzdF9oZWFkOworCisgICAgaWYgKHRlbXBfbm9kZSAhPSBOVUxMKSB7CisgICAgICB3aGlsZSAoY3BvcyA8IFRULm5lbGVtKSB7CisgICAgICAgIGludCBzdGFydDsKKworICAgICAgICBpZiAoIXRlbXBfbm9kZSkgYnJlYWs7CisgICAgICAgIHN0YXJ0ID0gdGVtcF9ub2RlLT5zdGFydDsKKyAgICAgICAgd2hpbGUgKHN0YXJ0IDwgYnVmZmxuKSB7CisgICAgICAgICAgLy90byBhdm9pZCBkdXBsaWNhdGUgZmllbGQgcHJpbnRpbmcuCisgICAgICAgICAgaWYgKHBmaWVsZFtzdGFydF0pIHsKKyAgICAgICAgICAgICAgaWYgKCsrc3RhcnQgPD0gdGVtcF9ub2RlLT5lbmQpIGNvbnRpbnVlOworICAgICAgICAgICAgICB0ZW1wX25vZGUgPSB0ZW1wX25vZGUtPm5leHQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL21ha2Ugc3VyZSB0aGlzIGZpZWxkIHdvbid0IHByaW50IGFnYWluLgorICAgICAgICAgICAgcGZpZWxkW3N0YXJ0XSA9IChjaGFyKSAweDIzOyAvL3B1dCBzb21lIGNoYXIgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICAgICAgICAgIHhwdXRjKGJ1ZmZbc3RhcnRdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCsrc3RhcnQgPiB0ZW1wX25vZGUtPmVuZCkgeworICAgICAgICAgICAgdGVtcF9ub2RlID0gdGVtcF9ub2RlLT5uZXh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNwb3MrKzsKKyAgICAgIH0KKyAgICAgIHhwdXRjKCdcbicpOworICAgIH0KKyAgICBmcmVlKHBmaWVsZCk7CisgICAgcGZpZWxkID0gTlVMTDsKKyAgfQorfQorCit2b2lkIGN1dF9tYWluKHZvaWQpCit7CisgIGNoYXIgZGVsaW1pdGVyID0gJ1x0JzsgLy9kZWZhdWx0IGRlbGltaXRlci4KKyAgY2hhciAqbGlzdDsKKworICBUVC5uZWxlbSA9IDA7CisgIFRULnNsaXN0X2hlYWQgPSBOVUxMOworCisgIC8vR2V0IGxpc3QgYW5kIGFzc2lnbiB0aGUgZnVuY3Rpb24uCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSB7CisgICAgbGlzdCA9IFRULmZsaXN0OworICAgIFRULmRvX2N1dCA9IGRvX2ZjdXQ7CisgIH0gZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgeworICAgIGxpc3QgPSBUVC5jbGlzdDsKKyAgICBUVC5kb19jdXQgPSBkb19iY2N1dDsKKyAgfSBlbHNlIHsKKyAgICBsaXN0ID0gVFQuYmxpc3Q7CisgICAgVFQuZG9fY3V0ID0gZG9fYmNjdXQ7CisgIH0KKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZCkgeworICAgIC8vZGVsaW1pdGVyIG11c3QgYmUgMSBjaGFyLgorICAgIGlmKFRULmRlbGltWzBdICYmIFRULmRlbGltWzFdKQorICAgICAgcGVycm9yX2V4aXQoInRoZSBkZWxpbWl0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKTsKKyAgICBkZWxpbWl0ZXIgPSBUVC5kZWxpbVswXTsKKyAgfQorCisgIGlmKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZCkgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSB7CisgICAgVFQuZGVsaW0gPSB4emFsbG9jKDIpOworICAgIFRULmRlbGltWzBdID0gZGVsaW1pdGVyOworICB9CisgIAorICAvL3doZW4gZmllbGQgaXMgbm90IHNwZWNpZmllZCwgY3V0dGluZyBoYXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nLgorICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSkgeworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19zKQorICAgICAgcGVycm9yX2V4aXQoInN1cHByZXNzaW5nIG5vbi1kZWxpbWl0ZWQgbGluZXMgb3BlcmF0aW5nIG9uIGZpZWxkcyIpOworICAgIGlmIChkZWxpbWl0ZXIgIT0gJ1x0JykKKyAgICAgIHBlcnJvcl9leGl0KCJhbiBpbnB1dCBkZWxpbWl0ZXIgbWF5IGJlIHNwZWNpZmllZCBvbmx5IHdoZW4gb3BlcmF0aW5nIG9uIGZpZWxkcyIpOworICB9CisKKyAgcGFyc2VfbGlzdChsaXN0KTsKKyAgZ2V0X2RhdGEoKTsKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZCkgJiYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSB7CisgICAgZnJlZShUVC5kZWxpbSk7CisgICAgVFQuZGVsaW0gPSBOVUxMOworICB9CisgIGxsaXN0X3RyYXZlcnNlKFRULnNsaXN0X2hlYWQsIGZyZWUpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZGF0ZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGNhNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9kYXRlLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIGRhdGUuYyAtIHNldC9nZXQgdGhlIGRhdGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBbmRyZSBSZW5hdWQgPGFuZHJlQGJsdWV3YXRlcnN5cy5jb20+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZGF0ZS5odG1sCisgKgorICogTm90ZTogc2V0dGluZyBhIDIgeWVhciBkYXRlIGlzIDUwIHllYXJzIGJhY2svZm9yd2FyZCBmcm9tIHRvZGF5LAorICogbm90IHBvc2l4J3MgaGFyZHdpcmVkIG1hZ2ljIGRhdGVzLgorCitVU0VfREFURShORVdUT1koZGF0ZSwgImQ6RDpyOnVbIWRyXSIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIERBVEUKKyAgYm9vbCAiZGF0ZSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZGF0ZSBbLXVdIFstciBGSUxFXSBbLWQgREFURV0gWytESVNQTEFZX0ZPUk1BVF0gWy1EIFNFVF9GT1JNQVRdIFtTRVRdCisKKyAgICBTZXQvZ2V0IHRoZSBjdXJyZW50IGRhdGUvdGltZS4gV2l0aCBubyBTRVQgc2hvd3MgdGhlIGN1cnJlbnQgZGF0ZS4KKworICAgIERlZmF1bHQgU0VUIGZvcm1hdCBpcyAiTU1ERGhobW1bW0NDXVlZXVsuc3NdIiwgdGhhdCdzICgyIGRpZ2l0cyBlYWNoKQorICAgIG1vbnRoLCBkYXksIGhvdXIgKDAtMjMpLCBhbmQgbWludXRlLiBPcHRpb25hbGx5IGNlbnR1cnksIHllYXIsIGFuZCBzZWNvbmQuCisgICAgQWxzbyBhY2NlcHRzICJAVU5JWFRJTUVbLkZSQUNUSU9OXSIgYXMgc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLgorCisgICAgLWQJU2hvdyBEQVRFIGluc3RlYWQgb2YgY3VycmVudCB0aW1lIChjb252ZXJ0IGRhdGUgZm9ybWF0KQorICAgIC1ECStGT1JNQVQgZm9yIFNFVCBvciAtZCAoaW5zdGVhZCBvZiBNTUREaGhtbVtbQ0NdWVldWy5zc10pCisgICAgLXIJVXNlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUgaW5zdGVhZCBvZiBjdXJyZW50IGRhdGUKKyAgICAtdQlVc2UgVVRDIGluc3RlYWQgb2YgY3VycmVudCB0aW1lem9uZQorCisgICAgK0ZPUk1BVCBzcGVjaWZpZXMgZGlzcGxheSBmb3JtYXQgc3RyaW5nIHVzaW5nIHRoZXNlIGVzY2FwZXM6CisKKyAgICAlJSBsaXRlcmFsICUgICAgICAgICAgICAgJW4gbmV3bGluZSAgICAgICAgICAgICAgJXQgdGFiCisgICAgJVMgc2Vjb25kcyAoMDAtNjApICAgICAgICVNIG1pbnV0ZSAoMDAtNTkpICAgICAgICVtIG1vbnRoICgwMS0xMikKKyAgICAlSCBob3VyICgwLTIzKSAgICAgICAgICAgJUkgaG91ciAoMDEtMTIpICAgICAgICAgJXAgQU0vUE0KKyAgICAleSBzaG9ydCB5ZWFyICgwMC05OSkgICAgJVkgeWVhciAgICAgICAgICAgICAgICAgJUMgY2VudHVyeQorICAgICVhIHNob3J0IHdlZWtkYXkgbmFtZSAgICAlQSB3ZWVrZGF5IG5hbWUgICAgICAgICAldSBkYXkgb2Ygd2VlayAoMS03LCAxPW1vbikKKyAgICAlYiBzaG9ydCBtb250aCBuYW1lICAgICAgJUIgbW9udGggbmFtZSAgICAgICAgICAgJVogdGltZXpvbmUgbmFtZQorICAgICVqIGRheSBvZiB5ZWFyICgwMDEtMzY2KSAlZCBkYXkgb2YgbW9udGggKDAxLTMxKSAlZSBkYXkgb2YgbW9udGggKCAxLTMxKQorICAgICVzIHNlY29uZHMgcGFzdCB0aGUgRXBvY2gKKworICAgICVVIFdlZWsgb2YgeWVhciAoMC01MyBzdGFydCBzdW5kYXkpICAgJVcgV2VlayBvZiB5ZWFyICgwLTUzIHN0YXJ0IG1vbmRheSkKKyAgICAlViBXZWVrIG9mIHllYXIgKDEtNTMgc3RhcnQgbW9uZGF5LCB3ZWVrIDwgNCBkYXlzIG5vdCBwYXJ0IG9mIHRoaXMgeWVhcikgCisKKyAgICAlRCA9ICIlbS8lZC8leSIgICAgJXIgPSAiJUkgOiAlTSA6ICVTICVwIiAgICVUID0gIiVIOiVNOiVTIiAgICVoID0gIiViIgorICAgICV4IGxvY2FsZSBkYXRlICAgICAlWCBsb2NhbGUgdGltZSAgICAgICAgICAgJWMgbG9jYWxlIGRhdGUvdGltZQorKi8KKworI2RlZmluZSBGT1JfZGF0ZQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqZmlsZTsKKyAgY2hhciAqc2V0Zm10OworICBjaGFyICpzaG93ZGF0ZTsKKworICBjaGFyICp0ejsKKyAgdW5zaWduZWQgbmFubzsKKykKKworLy8gbWt0aW1lKDMpIG5vcm1hbGl6ZXMgdGhlIHN0cnVjdCB0bSBmaWVsZHMsIGJ1dCBkYXRlKDEpIHNob3VsZG4ndC4KK3N0YXRpYyB0aW1lX3QgY2hrbWt0aW1lKHN0cnVjdCB0bSAqdG0sIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciogZm10KQoreworICBzdHJ1Y3QgdG0gdG0wID0gKnRtOworICBzdHJ1Y3QgdG0gdG0xOworICB0aW1lX3QgdCA9IG1rdGltZSh0bSk7CisKKyAgaWYgKHQgPT0gLTEgfHwgIWxvY2FsdGltZV9yKCZ0LCAmdG0xKSB8fAorICAgICAgdG0wLnRtX3NlYyAhPSB0bTEudG1fc2VjIHx8IHRtMC50bV9taW4gIT0gdG0xLnRtX21pbiB8fAorICAgICAgdG0wLnRtX2hvdXIgIT0gdG0xLnRtX2hvdXIgfHwgdG0wLnRtX21kYXkgIT0gdG0xLnRtX21kYXkgfHwKKyAgICAgIHRtMC50bV9tb24gIT0gdG0xLnRtX21vbikgeworICAgIGludCBsZW47CisKKyAgICBzdHJmdGltZSh0b3lidWYsIHNpemVvZih0b3lidWYpLCBmbXQsICZ0bTApOworICAgIGxlbiA9IHN0cmxlbih0b3lidWYpICsgMTsKKyAgICBzdHJmdGltZSh0b3lidWYgKyBsZW4sIHNpemVvZih0b3lidWYpIC0gbGVuLCBmbXQsICZ0bTEpOworICAgIGVycm9yX2V4aXQoImJhZCBkYXRlICclcyc7ICVzICE9ICVzIiwgc3RyLCB0b3lidWYsIHRveWJ1ZiArIGxlbik7CisgIH0KKyAgcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyB2b2lkIHV0enNldCh2b2lkKQoreworICBpZiAoIShUVC50eiA9IGdldGVudigiVFoiKSkpIFRULnR6ID0gKGNoYXIgKikxOworICBzZXRlbnYoIlRaIiwgIlVUQyIsIDEpOworICB0enNldCgpOworfQorCitzdGF0aWMgdm9pZCB1dHpyZXNldCh2b2lkKQoreworICBpZiAoVFQudHopIHsKKyAgICBpZiAoVFQudHogIT0gKGNoYXIgKikxKSBzZXRlbnYoIlRaIiwgVFQudHosIDEpOworICAgIGVsc2UgdW5zZXRlbnYoIlRaIik7CisgICAgdHpzZXQoKTsKKyAgfQorfQorCisvLyBIYW5kbGUgZGVmYXVsdCBwb3NpeCBkYXRlIGZvcm1hdCAobW1kZGhobW1bW2NjXXl5XSkgb3IgQFVOSVhbLkZSQUNdCisvLyByZXR1cm5zIDAgc3VjY2Vzcywgbm9uemVybyBmb3IgZXJyb3IKK3N0YXRpYyBpbnQgcGFyc2VfZGVmYXVsdChjaGFyICpzdHIsIHN0cnVjdCB0bSAqdG0pCit7CisgIGludCBsZW4gPSAwOworCisgIC8vIFBhcnNlIEBVTklYVElNRVsuRlJBQ1RJT05dCisgIGlmICgqc3RyID09ICdAJykgeworICAgIGxvbmcgbG9uZyBsbDsKKyAgICB0aW1lX3QgdHQ7CisKKyAgICAvLyBDb2xsZWN0IHNlY29uZHMgYW5kIG5hbm9zZWNvbmRzCisgICAgLy8gTm90ZTogc3RydWN0IHRtIGhhc24ndCBnb3QgYSBmcmFjdGlvbmFsIHNlY29uZHMgZmllbGQsIHRodXMgc3RycHRpbWUoKQorICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBpdCwgc28gc3RvcmUgbmFub3NlY29uZHMgb3V0IG9mIGJhbmQgKGluIGdsb2JhbHMpLgorICAgIC8vIHR0IGFuZCBsbCBhcmUgc2VwYXJhdGUgYmVjYXVzZSB3ZSBjYW4ndCBndWFyYW50ZWUgdGltZV90IGlzIDY0IGJpdCAoeWV0KS4KKyAgICBzc2NhbmYoc3RyLCAiQCVsbGQlbiIsICZsbCwgJmxlbik7CisgICAgaWYgKHN0cltsZW5dPT0nLicpIHsKKyAgICAgIHN0ciArPSBsZW4rMTsKKyAgICAgIGZvciAobGVuID0gMDsgbGVuPDk7IGxlbisrKSB7CisgICAgICAgIFRULm5hbm8gKj0gMTA7CisgICAgICAgIGlmIChpc2RpZ2l0KHN0cltsZW5dKSkgVFQubmFubyArPSBzdHJbbGVuXS0nMCc7CisgICAgICB9CisgICAgfQorICAgIGlmIChzdHJbbGVuXSkgcmV0dXJuIDE7CisgICAgdHQgPSBsbDsKKyAgICBnbXRpbWVfcigmdHQsIHRtKTsKKworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gUG9zaXggZm9ybWF0CisgIHNzY2FuZihzdHIsICIlMnUlMnUlMnUlMnUlbiIsICZ0bS0+dG1fbW9uLCAmdG0tPnRtX21kYXksICZ0bS0+dG1faG91ciwKKyAgICAmdG0tPnRtX21pbiwgJmxlbik7CisgIGlmIChsZW4gIT0gOCkgcmV0dXJuIDE7CisgIHN0ciArPSBsZW47CisgIHRtLT50bV9tb24tLTsKKworICAvLyBJZiB5ZWFyIHNwZWNpZmllZCwgb3ZlcndyaXRlIG9uZSB3ZSBmZXRjaGVkIGVhcmxpZXIKKyAgaWYgKCpzdHIgJiYgKnN0ciAhPSAnLicpIHsKKyAgICB1bnNpZ25lZCB5ZWFyOworCisgICAgbGVuID0gMDsKKyAgICBzc2NhbmYoc3RyLCAiJXUlbiIsICZ5ZWFyLCAmbGVuKTsKKyAgICBpZiAobGVuID09IDQpIHRtLT50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgZWxzZSBpZiAobGVuICE9IDIpIHJldHVybiAxOworICAgIHN0ciArPSBsZW47CisKKyAgICAvLyAyIGRpZ2l0IHllYXJzLCBuZXh0IDUwIHllYXJzIGFyZSAiZnV0dXJlIiwgbGFzdCA1MCB5ZWFycyBhcmUgInBhc3QiLgorICAgIC8vIEEgImZ1dHVyZSIgZGF0ZSBpbiBwYXN0IGlzIGEgY2VudHVyeSBhaGVhZC4KKyAgICAvLyBBIG5vbi1mdXR1cmUgZGF0ZSBpbiB0aGUgZnV0dXJlIGlzIGEgY2VudHVyeSBiZWhpbmQuCisgICAgaWYgKGxlbiA9PSAyKSB7CisgICAgICB1bnNpZ25lZCByMSA9IHRtLT50bV95ZWFyICUgMTAwLCByMiA9ICh0bS0+dG1feWVhciArIDUwKSAlIDEwMCwKKyAgICAgICAgY2VudHVyeSA9IHRtLT50bV95ZWFyIC0gcjE7CisKKyAgICAgIGlmICgocjEgPCByMikgPyAocjEgPCB5ZWFyICYmIHllYXIgPCByMikgOiAoeWVhciA8IHIxIHx8IHllYXIgPiByMikpIHsKKyAgICAgICAgaWYgKHllYXIgPCByMSkgeWVhciArPSAxMDA7CisgICAgICB9IGVsc2UgaWYgKHllYXIgPiByMSkgeWVhciAtPSAxMDA7CisgICAgICB0bS0+dG1feWVhciA9IHllYXIgKyBjZW50dXJ5OworICAgIH0KKyAgfQorICBpZiAoKnN0ciA9PSAnLicpIHsKKyAgICBsZW4gPSAwOworICAgIHNzY2FuZihzdHIsICIuJXUlbiIsICZ0bS0+dG1fc2VjLCAmbGVuKTsKKyAgICBzdHIgKz0gbGVuOworICB9IGVsc2UgdG0tPnRtX3NlYyA9IDA7CisKKyAgcmV0dXJuICpzdHI7Cit9CisKK3ZvaWQgZGF0ZV9tYWluKHZvaWQpCit7CisgIGNoYXIgKnNldGRhdGUgPSAqdG95cy5vcHRhcmdzLCAqZm9ybWF0X3N0cmluZyA9ICIlYSAlYiAlZSAlSDolTTolUyAlWiAlWSI7CisgIHN0cnVjdCB0bSB0bTsKKworICBtZW1zZXQoJnRtLCAwLCBzaXplb2Yoc3RydWN0IHRtKSk7CisKKyAgLy8gV2UgY2FuJ3QganVzdCBwYXNzIGEgdGltZXpvbmUgdG8gbWt0aW1lIGJlY2F1c2UgcG9zaXguCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR191KSB1dHpzZXQoKTsKKworICBpZiAoVFQuc2hvd2RhdGUpIHsKKyAgICBpZiAoVFQuc2V0Zm10KSB7CisgICAgICBjaGFyICpzID0gc3RycHRpbWUoVFQuc2hvd2RhdGUsIFRULnNldGZtdCsoKlRULnNldGZtdD09JysnKSwgJnRtKTsKKworICAgICAgaWYgKCFzIHx8ICpzKSBnb3RvIGJhZF9zaG93ZGF0ZTsKKyAgICB9IGVsc2UgaWYgKHBhcnNlX2RlZmF1bHQoVFQuc2hvd2RhdGUsICZ0bSkpIGdvdG8gYmFkX3Nob3dkYXRlOworICB9IGVsc2UgeworICAgIHRpbWVfdCBub3c7CisKKyAgICBpZiAoVFQuZmlsZSkgeworICAgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICAgIHhzdGF0KFRULmZpbGUsICZzdCk7CisgICAgICBub3cgPSBzdC5zdF9tdGltLnR2X3NlYzsKKyAgICB9IGVsc2Ugbm93ID0gdGltZSgwKTsKKworICAgICgodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgPyBnbXRpbWVfciA6IGxvY2FsdGltZV9yKSgmbm93LCAmdG0pOworICB9CisKKyAgLy8gRmFsbCB0aHJvdWdoIGlmIG5vIGFyZ3VtZW50cworICBpZiAoIXNldGRhdGUpOworICAvLyBEaXNwbGF5IHRoZSBkYXRlPworICBlbHNlIGlmICgqc2V0ZGF0ZSA9PSAnKycpIHsKKyAgICBmb3JtYXRfc3RyaW5nID0gdG95cy5vcHRhcmdzWzBdKzE7CisgICAgc2V0ZGF0ZSA9IHRveXMub3B0YXJnc1sxXTsKKworICAvLyBTZXQgdGhlIGRhdGUKKyAgfSBlbHNlIGlmIChzZXRkYXRlKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICBpZiAocGFyc2VfZGVmYXVsdChzZXRkYXRlLCAmdG0pKSBlcnJvcl9leGl0KCJiYWQgZGF0ZSAnJXMnIiwgc2V0ZGF0ZSk7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgeworICAgICAgLy8gV2UgY2FuJ3QganVzdCBwYXNzIGEgdGltZXpvbmUgdG8gbWt0aW1lIGJlY2F1c2UgcG9zaXguCisgICAgICB1dHpzZXQoKTsKKyAgICAgIHR2LnR2X3NlYyA9IGNoa21rdGltZSgmdG0sIHNldGRhdGUsIGZvcm1hdF9zdHJpbmcpOworICAgICAgdXR6cmVzZXQoKTsKKyAgICB9IGVsc2UgdHYudHZfc2VjID0gY2hrbWt0aW1lKCZ0bSwgc2V0ZGF0ZSwgZm9ybWF0X3N0cmluZyk7CisKKyAgICB0di50dl91c2VjID0gVFQubmFuby8xMDAwOworICAgIGlmIChzZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA8IDApIHBlcnJvcl9tc2coImNhbm5vdCBzZXQgZGF0ZSIpOworICB9CisKKyAgdXR6cmVzZXQoKTsKKyAgaWYgKCFzdHJmdGltZSh0b3lidWYsIHNpemVvZih0b3lidWYpLCBmb3JtYXRfc3RyaW5nLCAmdG0pKQorICAgIHBlcnJvcl9leGl0KCJiYWQgZm9ybWF0ICclcyciLCBmb3JtYXRfc3RyaW5nKTsKKyAgcHV0cyh0b3lidWYpOworCisgIHJldHVybjsKKworYmFkX3Nob3dkYXRlOgorICBlcnJvcl9leGl0KCJiYWQgZGF0ZSAnJXMnIiwgVFQuc2hvd2RhdGUpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZGYuYyBiL3RveWJveC90b3lzL3Bvc2l4L2RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZTZkNAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2RmLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIGRmLmMgLSByZXBvcnQgZnJlZSBkaXNrIHNwYWNlLgorICoKKyAqIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZGYuaHRtbAorCitVU0VfREYoTkVXVE9ZKGRmLCAiSFBraHQqYVstSFBraF0iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgREYKKyAgYm9vbCAiZGYiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGRmIFstSFBraF0gWy10IHR5cGVdIFtGSUxFU1lTVEVNIC4uLl0KKworICAgIFRoZSAiZGlzayBmcmVlIiBjb21tYW5kIHNob3dzIHRvdGFsL3VzZWQvYXZhaWxhYmxlIGRpc2sgc3BhY2UgZm9yCisgICAgZWFjaCBmaWxlc3lzdGVtIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBhbGwgY3VycmVudGx5IG1vdW50ZWQKKyAgICBmaWxlc3lzdGVtcy4KKworICAgIC1QCVRoZSBTVVN2MyAiUGVkYW50aWMiIG9wdGlvbgorICAgIC1rCVNldHMgdW5pdHMgYmFjayB0byAxMDI0IGJ5dGVzICh0aGUgZGVmYXVsdCB3aXRob3V0IC1QKQorICAgIC1oCUh1bWFuIHJlYWRhYmxlIG91dHB1dCAoSz0xMDI0KQorICAgIC1ICUh1bWFuIHJlYWRhYmxlIG91dHB1dCAoaz0xMDAwKQorICAgIC10IHR5cGUJRGlzcGxheSBvbmx5IGZpbGVzeXN0ZW1zIG9mIHRoaXMgdHlwZS4KKworICAgIFBlZGFudGljIHByb3ZpZGVzIGEgc2xpZ2h0bHkgbGVzcyB1c2VmdWwgb3V0cHV0IGZvcm1hdCBkaWN0YXRlZCBieSBQb3NpeCwKKyAgICBhbmQgc2V0cyB0aGUgdW5pdHMgdG8gNTEyIGJ5dGVzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTAyNCBieXRlcy4KKyovCisKKyNkZWZpbmUgRk9SX2RmCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBzdHJ1Y3QgYXJnX2xpc3QgKmZzdHlwZTsKKworICBsb25nIHVuaXRzOworICBpbnQgY29sdW1uX3dpZHRoc1s1XTsKKyAgaW50IGhlYWRlcl9zaG93bjsKKykKKworc3RhdGljIHZvaWQgbWVhc3VyZV9jb2x1bW4oaW50IGNvbCwgY29uc3QgY2hhciAqcykKK3sKKyAgc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKworICBpZiAoVFQuY29sdW1uX3dpZHRoc1tjb2xdIDwgbGVuKSBUVC5jb2x1bW5fd2lkdGhzW2NvbF0gPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIG1lYXN1cmVfbnVtZXJpY19jb2x1bW4oaW50IGNvbCwgbG9uZyBsb25nIG4pCit7CisgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIlbGxkIiwgbik7CisgIHJldHVybiBtZWFzdXJlX2NvbHVtbihjb2wsIHRveWJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVhZGVyKCkKK3sKKyAgVFQuaGVhZGVyX3Nob3duID0gMTsKKworICAvLyBUaGUgZmlsZXN5c3RlbSBjb2x1bW4gaXMgYWx3YXlzIGF0IGxlYXN0IHRoaXMgd2lkZS4KKyAgaWYgKFRULmNvbHVtbl93aWR0aHNbMF0gPCAxNCkgVFQuY29sdW1uX3dpZHRoc1swXSA9IDE0OworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgKEZMQUdfSHxGTEFHX2gpKSB7CisgICAgeHByaW50ZigiJS0qcyBTaXplICBVc2VkIEF2YWlsIFVzZSUlIE1vdW50ZWQgb25cbiIsCisgICAgICAgICAgICBUVC5jb2x1bW5fd2lkdGhzWzBdLCAiRmlsZXN5c3RlbSIpOworICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIgKmJsb2Nrc19sYWJlbCA9IFRULnVuaXRzID09IDUxMiA/ICI1MTItYmxvY2tzIiA6ICIxSy1ibG9ja3MiOworICAgIGNvbnN0IGNoYXIgKnVzZV9sYWJlbCA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX1AgPyAiQ2FwYWNpdHkiIDogIlVzZSUiOworCisgICAgbWVhc3VyZV9jb2x1bW4oMSwgYmxvY2tzX2xhYmVsKTsKKyAgICBtZWFzdXJlX2NvbHVtbigyLCAiVXNlZCIpOworICAgIG1lYXN1cmVfY29sdW1uKDMsICJBdmFpbGFibGUiKTsKKyAgICBtZWFzdXJlX2NvbHVtbig0LCB1c2VfbGFiZWwpOworICAgIHhwcmludGYoIiUtKnMgJSpzICUqcyAlKnMgJSpzIE1vdW50ZWQgb25cbiIsCisgICAgICAgICAgICBUVC5jb2x1bW5fd2lkdGhzWzBdLCAiRmlsZXN5c3RlbSIsCisgICAgICAgICAgICBUVC5jb2x1bW5fd2lkdGhzWzFdLCBibG9ja3NfbGFiZWwsCisgICAgICAgICAgICBUVC5jb2x1bW5fd2lkdGhzWzJdLCAiVXNlZCIsCisgICAgICAgICAgICBUVC5jb2x1bW5fd2lkdGhzWzNdLCAiQXZhaWxhYmxlIiwKKyAgICAgICAgICAgIFRULmNvbHVtbl93aWR0aHNbNF0sIHVzZV9sYWJlbCk7CisKKyAgICAvLyBGb3IgdGhlICJVc2UlIiBjb2x1bW4sIHRoZSB0cmFpbGluZyAlIHNob3VsZCBiZSBpbnNpZGUgdGhlIGNvbHVtbi4KKyAgICBUVC5jb2x1bW5fd2lkdGhzWzRdLS07CisgIH0KK30KKworc3RhdGljIHZvaWQgc2hvd19tdChzdHJ1Y3QgbXRhYl9saXN0ICptdCwgaW50IG1lYXN1cmluZykKK3sKKyAgbG9uZyBsb25nIHNpemUsIHVzZWQsIGF2YWlsLCBwZXJjZW50LCBibG9jazsKKyAgY2hhciAqZGV2aWNlOworCisgIC8vIFJldHVybiBpZiBpdCB3YXNuJ3QgZm91bmQgKHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3aXRoIC9ldGMvbXRhYi4uLikKKyAgaWYgKCFtdCkgcmV0dXJuOworCisgIC8vIElmIHdlIGhhdmUgLXQsIHNraXAgb3RoZXIgZmlsZXN5c3RlbSB0eXBlcworICBpZiAoVFQuZnN0eXBlKSB7CisgICAgc3RydWN0IGFyZ19saXN0ICphbDsKKworICAgIGZvciAoYWwgPSBUVC5mc3R5cGU7IGFsOyBhbCA9IGFsLT5uZXh0KSAKKyAgICAgIGlmICghc3RyY21wKG10LT50eXBlLCBhbC0+YXJnKSkgYnJlYWs7CisKKyAgICBpZiAoIWFsKSByZXR1cm47CisgIH0KKworICAvLyBJZiB3ZSBkb24ndCBoYXZlIC1hLCBza2lwIHN5bnRoZXRpYyBmaWxlc3lzdGVtcworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSAmJiAhbXQtPnN0YXR2ZnMuZl9ibG9ja3MpIHJldHVybjsKKworICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHRvdGFsL3VzZWQvZnJlZSBzcGFjZSB0aGlzIGZpbGVzeXN0ZW0gaGFzLAorICAvLyBmb3JjaW5nIDY0LWJpdCBtYXRoIGJlY2F1c2UgZmlsZXN5c3RlbXMgYXJlIGJpZyBub3cuCisgIGJsb2NrID0gbXQtPnN0YXR2ZnMuZl9ic2l6ZSA/IG10LT5zdGF0dmZzLmZfYnNpemUgOiAxOworICBzaXplID0gKGJsb2NrICogbXQtPnN0YXR2ZnMuZl9ibG9ja3MpIC8gVFQudW5pdHM7CisgIHVzZWQgPSAoYmxvY2sgKiAobXQtPnN0YXR2ZnMuZl9ibG9ja3MtbXQtPnN0YXR2ZnMuZl9iZnJlZSkpIC8gVFQudW5pdHM7CisgIGF2YWlsID0gKGJsb2NrKihnZXR1aWQoKT9tdC0+c3RhdHZmcy5mX2JhdmFpbDptdC0+c3RhdHZmcy5mX2JmcmVlKSkvVFQudW5pdHM7CisgIGlmICghKHVzZWQrYXZhaWwpKSBwZXJjZW50ID0gMDsKKyAgZWxzZSB7CisgICAgcGVyY2VudCA9ICh1c2VkKjEwMCkvKHVzZWQrYXZhaWwpOworICAgIGlmICh1c2VkKjEwMCAhPSBwZXJjZW50Kih1c2VkK2F2YWlsKSkgcGVyY2VudCsrOworICB9CisKKyAgZGV2aWNlID0gKm10LT5kZXZpY2UgPT0gJy8nID8gcmVhbHBhdGgobXQtPmRldmljZSwgTlVMTCkgOiBOVUxMOworICBpZiAoIWRldmljZSkgZGV2aWNlID0gbXQtPmRldmljZTsKKworICBpZiAobWVhc3VyaW5nKSB7CisgICAgbWVhc3VyZV9jb2x1bW4oMCwgZGV2aWNlKTsKKyAgICBtZWFzdXJlX251bWVyaWNfY29sdW1uKDEsIHNpemUpOworICAgIG1lYXN1cmVfbnVtZXJpY19jb2x1bW4oMiwgdXNlZCk7CisgICAgbWVhc3VyZV9udW1lcmljX2NvbHVtbigzLCBhdmFpbCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFUVC5oZWFkZXJfc2hvd24pIHNob3dfaGVhZGVyKCk7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIChGTEFHX0h8RkxBR19oKSkgeworICAgICAgY2hhciAqc2l6ZV9zdHIgPSB0b3lidWYsICp1c2VkX3N0ciA9IHRveWJ1Zis2NCwgKmF2YWlsX3N0ciA9IHRveWJ1ZisxMjg7CisgICAgICBpbnQgaHJfZmxhZ3MgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfSCkgPyBIUl8xMDAwIDogMDsKKworICAgICAgaHVtYW5fcmVhZGFibGUoc2l6ZV9zdHIsIHNpemUsIGhyX2ZsYWdzKTsKKyAgICAgIGh1bWFuX3JlYWRhYmxlKHVzZWRfc3RyLCB1c2VkLCBocl9mbGFncyk7CisgICAgICBodW1hbl9yZWFkYWJsZShhdmFpbF9zdHIsIGF2YWlsLCBocl9mbGFncyk7CisgICAgICB4cHJpbnRmKCIlLSpzICU0cyAgJTRzICAlNHMgJSAzbGxkJSUgJXNcbiIsCisgICAgICAgIFRULmNvbHVtbl93aWR0aHNbMF0sIGRldmljZSwKKyAgICAgICAgc2l6ZV9zdHIsIHVzZWRfc3RyLCBhdmFpbF9zdHIsIHBlcmNlbnQsIG10LT5kaXIpOworICAgIH0gZWxzZSB4cHJpbnRmKCIlLSpzICUqbGxkICUqbGxkICUqbGxkICUqbGxkJSUgJXNcbiIsCisgICAgICAgIFRULmNvbHVtbl93aWR0aHNbMF0sIGRldmljZSwKKyAgICAgICAgVFQuY29sdW1uX3dpZHRoc1sxXSwgc2l6ZSwKKyAgICAgICAgVFQuY29sdW1uX3dpZHRoc1syXSwgdXNlZCwKKyAgICAgICAgVFQuY29sdW1uX3dpZHRoc1szXSwgYXZhaWwsCisgICAgICAgIFRULmNvbHVtbl93aWR0aHNbNF0sIHBlcmNlbnQsCisgICAgICAgIG10LT5kaXIpOworICB9CisKKyAgaWYgKGRldmljZSAhPSBtdC0+ZGV2aWNlKSBmcmVlKGRldmljZSk7Cit9CisKK3ZvaWQgZGZfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgbXRhYl9saXN0ICptdCwgKm10c3RhcnQsICptdGVuZDsKKyAgaW50IG1lYXN1cmluZzsKKworICBpZiAodG95cy5vcHRmbGFncyAmIChGTEFHX0h8RkxBR19oKSkgeworICAgIFRULnVuaXRzID0gMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBVbml0cyBhcmUgNTEyIGJ5dGVzIGlmIHlvdSBzZWxlY3QgInBlZGFudGljIiB3aXRob3V0ICJraWxvYnl0ZXMiLgorICAgIFRULnVuaXRzID0gdG95cy5vcHRmbGFncyAmIEZMQUdfUCA/IDUxMiA6IDEwMjQ7CisgIH0KKworICBpZiAoIShtdHN0YXJ0ID0geGdldG1vdW50bGlzdCgwKSkpIHJldHVybjsKKyAgbXRlbmQgPSBkbGlzdF90ZXJtaW5hdGUobXRzdGFydCk7CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGxpc3Qgb2YgZmlsZXN5c3RlbXMgb24gdGhlIGNvbW1hbmQgbGluZSwgbG9vcCB0aHJvdWdoIHRoZW0uCisgIGlmICgqdG95cy5vcHRhcmdzKSB7CisgICAgLy8gTWVhc3VyZSB0aGUgbmFtZXMgdGhlbiBvdXRwdXQgdGhlIHRhYmxlLgorICAgIGZvciAobWVhc3VyaW5nID0gMTsgbWVhc3VyaW5nID49IDA7IC0tbWVhc3VyaW5nKSB7CisgICAgICBjaGFyICoqbmV4dDsKKworICAgICAgZm9yIChuZXh0ID0gdG95cy5vcHRhcmdzOyAqbmV4dDsgbmV4dCsrKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgICAgIC8vIFN0YXQgaXQgKGNvbXBsYWluIGlmIHdlIGNhbid0KS4KKyAgICAgICAgaWYgKHN0YXQoKm5leHQsICZzdCkpIHsKKyAgICAgICAgICBwZXJyb3JfbXNnKCInJXMnIiwgKm5leHQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBhbmQgZGlzcGxheSB0aGlzIGZpbGVzeXN0ZW0uICBVc2UgX2xhc3RfIGhpdCBpbiBjYXNlIG9mCisgICAgICAgIC8vIG92ZXJtb3VudHMgKHdoaWNoIGlzIGZpcnN0IGhpdCBpbiB0aGUgcmV2ZXJzZWQgbGlzdCkuCisgICAgICAgIGZvciAobXQgPSBtdGVuZDsgbXQ7IG10ID0gbXQtPnByZXYpIHsKKyAgICAgICAgICBpZiAoc3Quc3RfZGV2ID09IG10LT5zdGF0LnN0X2RldgorICAgICAgICAgICAgICB8fCAoc3Quc3RfcmRldiAmJiAoc3Quc3RfcmRldiA9PSBtdC0+c3RhdC5zdF9kZXYpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzaG93X210KG10LCBtZWFzdXJpbmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIExvb3AgdGhyb3VnaCBtb3VudCBsaXN0IHRvIGZpbHRlciBvdXQgb3Zlcm1vdW50cy4KKyAgICBmb3IgKG10ID0gbXRlbmQ7IG10OyBtdCA9IG10LT5wcmV2KSB7CisgICAgICBzdHJ1Y3QgbXRhYl9saXN0ICptdDIsICptdDM7CisKKyAgICAgIC8vIDA6MCBpcyBMQU5BTkEgbnVsbCBkZXZpY2UKKyAgICAgIGlmICghbXQtPnN0YXQuc3RfZGV2KSBjb250aW51ZTsKKworICAgICAgLy8gRmlsdGVyIG91dCBvdmVybW91bnRzLgorICAgICAgbXQzID0gbXQ7CisgICAgICBmb3IgKG10MiA9IG10LT5wcmV2OyBtdDI7IG10MiA9IG10Mi0+cHJldikgeworICAgICAgICBpZiAobXQtPnN0YXQuc3RfZGV2ID09IG10Mi0+c3RhdC5zdF9kZXYpIHsKKyAgICAgICAgICAvLyBGb3IgLS1iaW5kIG1vdW50cywgc2hvdyBlYXJsaWVzdCBtb3VudAorICAgICAgICAgIGlmICghc3RyY21wKG10LT5kZXZpY2UsIG10Mi0+ZGV2aWNlKSkgeworICAgICAgICAgICAgaWYgKCF0b3lzLm9wdGZsYWdzICYgRkxBR19hKSBtdDMtPnN0YXQuc3RfZGV2ID0gMDsKKyAgICAgICAgICAgIG10MyA9IG10MjsKKyAgICAgICAgICB9IGVsc2UgbXQyLT5zdGF0LnN0X2RldiA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZWFzdXJlIHRoZSBuYW1lcyB0aGVuIG91dHB1dCB0aGUgdGFibGUuCisgICAgZm9yIChtZWFzdXJpbmcgPSAxOyBtZWFzdXJpbmcgPj0gMDsgLS1tZWFzdXJpbmcpIHsKKyAgICAgIC8vIENvc21ldGljOiBzaG93IGZpbGVzeXN0ZW1zIGluIGNyZWF0aW9uIG9yZGVyLgorICAgICAgZm9yIChtdCA9IG10c3RhcnQ7IG10OyBtdCA9IG10LT5uZXh0KSB7CisgICAgICAgIGlmIChtdC0+c3RhdC5zdF9kZXYpIHNob3dfbXQobXQsIG1lYXN1cmluZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgbGxpc3RfdHJhdmVyc2UobXRzdGFydCwgZnJlZSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9kaXJuYW1lLmMgYi90b3lib3gvdG95cy9wb3NpeC9kaXJuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2Rpcm5hbWUuYwpAQCAtMCwwICsxLDIzIEBACisvKiBkaXJuYW1lLmMgLSBzaG93IGRpcmVjdG9yeSBwb3J0aW9uIG9mIHBhdGgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2Rpcm5hbWUuaHRtbAorCitVU0VfRElSTkFNRShORVdUT1koZGlybmFtZSwgIjwxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRElSTkFNRQorICBib29sICJkaXJuYW1lIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBkaXJuYW1lIFBBVEgKKworICAgIFNob3cgZGlyZWN0b3J5IHBvcnRpb24gb2YgcGF0aC4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgZGlybmFtZV9tYWluKHZvaWQpCit7CisgIHB1dHMoZGlybmFtZSgqdG95cy5vcHRhcmdzKSk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9kdS5jIGIvdG95Ym94L3RveXMvcG9zaXgvZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk3YjNmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvZHUuYwpAQCAtMCwwICsxLDE2MSBAQAorLyogZHUuYyAtIGRpc2sgdXNhZ2UgcHJvZ3JhbS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBBc2h3aW5pIEt1bWFyIDxhay5hc2h3aW5pQGdtYWlsLmNvbT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9kdS5odG1sCisgKgorICogVE9ETzogY2xlYW51cAorCitVU0VfRFUoTkVXVE9ZKGR1LCAiZCM8MGhtbGNhSGtLTHN4Wy1ITF1bLWtLbWhdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgRFUKKyAgYm9vbCAiZHUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGR1IFstZCBOXSBbLWFza3hITGxtY10gW2ZpbGUuLi5dCisKKyAgICBTaG93IGRpc2sgdXNhZ2UsIHNwYWNlIGNvbnN1bWVkIGJ5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKworICAgIFNpemUgaW46CisgICAgLWsgICAgMTAyNCBieXRlIGJsb2NrcyAoZGVmYXVsdCkKKyAgICAtSyAgICA1MTIgYnl0ZSBibG9ja3MgKHBvc2l4KQorICAgIC1tICAgIG1lZ2FieXRlcworICAgIC1oICAgIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoZS5nLiwgMUsgMjQzTSAyRyApCisKKyAgICBXaGF0IHRvIHNob3c6CisgICAgLWEgICAgYWxsIGZpbGVzLCBub3QganVzdCBkaXJlY3RvcmllcworICAgIC1IICAgIGZvbGxvdyBzeW1saW5rcyBvbiBjbWRsaW5lCisgICAgLUwgICAgZm9sbG93IGFsbCBzeW1saW5rcworICAgIC1zICAgIG9ubHkgdG90YWwgc2l6ZSBvZiBlYWNoIGFyZ3VtZW50CisgICAgLXggICAgZG9uJ3QgbGVhdmUgdGhpcyBmaWxlc3lzdGVtCisgICAgLWMgICAgY3VtdWxhdGl2ZSB0b3RhbAorICAgIC1kIE4gIG9ubHkgZGVwdGggPCBOCisgICAgLWwgICAgZGlzYWJsZSBoYXJkbGluayBmaWx0ZXIKKyovCisKKyNkZWZpbmUgRk9SX2R1CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBsb25nIG1heGRlcHRoOworCisgIGxvbmcgZGVwdGgsIHRvdGFsOworICBkZXZfdCBzdF9kZXY7CisgIHZvaWQgKmlub2RlczsKKykKKwordHlwZWRlZiBzdHJ1Y3Qgbm9kZV9zaXplIHsKKyAgc3RydWN0IGRpcnRyZWUgKm5vZGU7CisgIGxvbmcgc2l6ZTsKK30gbm9kZV9zaXplOworCisvLyBQcmludCB0aGUgc2l6ZSBhbmQgbmFtZSwgZ2l2ZW4gc2l6ZSBpbiBieXRlcworc3RhdGljIHZvaWQgcHJpbnQobG9uZyBsb25nIHNpemUsIHN0cnVjdCBkaXJ0cmVlICpub2RlKQoreworICBjaGFyICpuYW1lID0gInRvdGFsIjsKKworICBpZiAoVFQubWF4ZGVwdGggJiYgVFQuZGVwdGggPiBUVC5tYXhkZXB0aCkgcmV0dXJuOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSB7CisgICAgaHVtYW5fcmVhZGFibGUodG95YnVmLCBzaXplLCAwKTsKKyAgICBwcmludGYoIiVzIiwgdG95YnVmKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgYml0cyA9IDEwOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0spIGJpdHMgPSA5OworICAgIGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX20pIGJpdHMgPSAyMDsKKworICAgIHByaW50ZigiJWxsdSIsIChzaXplPj5iaXRzKSshIShzaXplJigoMTw8Yml0cyktMSkpKTsKKyAgfQorICBpZiAobm9kZSkgbmFtZSA9IGRpcnRyZWVfcGF0aChub2RlLCBOVUxMKTsKKyAgeHByaW50ZigiXHQlc1xuIiwgbmFtZSk7CisgIGlmIChub2RlKSBmcmVlKG5hbWUpOworfQorCisvLyBSZXR1cm4gd2hldGhlciBvciBub3Qgd2UndmUgc2VlbiB0aGlzIGlub2RlK2RldiwgYWRkaW5nIGl0IHRvIHRoZSBsaXN0IGlmCisvLyB3ZSBoYXZlbid0Lgorc3RhdGljIGludCBzZWVuX2lub2RlKHZvaWQgKipsaXN0LCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisgIGlmICghc3QpIGxsaXN0X3RyYXZlcnNlKHN0LCBmcmVlKTsKKworICAvLyBTa2lwcGluZyBkaXIgbm9kZXMgaXNuJ3QgX3F1aXRlXyByaWdodC4gVGhleSdyZSBub3QgaGFyZGxpbmtlZCwgYnV0IGNvdWxkCisgIC8vIGJlIGJpbmQgbW91bnRlZC4gU3RpbGwsIGl0J3MgbW9yZSBlZmZpY2llbnQgYW5kIHRoZSBhcmNoaXZlcnMgY2FuJ3QgdXNlCisgIC8vIGhhcmRsaW5rZWQgZGlyZWN0b3J5IGluZm8gYW55d2F5LiAoTm90ZSB0aGF0IHdlIGRvbid0IGNhdGNoIGJpbmQgbW91bnRlZAorICAvLyBfZmlsZXNfIGJlY2F1c2UgaXQgZG9lc24ndCBjaGFuZ2Ugc3RfbmxpbmsuKQorICBlbHNlIGlmICghU19JU0RJUihzdC0+c3RfbW9kZSkgJiYgc3QtPnN0X25saW5rID4gMSkgeworICAgIHN0cnVjdCBpbm9kZV9saXN0IHsKKyAgICAgIHN0cnVjdCBpbm9kZV9saXN0ICpuZXh0OworICAgICAgaW5vX3QgaW5vOworICAgICAgZGV2X3QgZGV2OworICAgIH0gKm5ldzsKKworICAgIGZvciAobmV3ID0gKmxpc3Q7IG5ldzsgbmV3ID0gbmV3LT5uZXh0KQorICAgICAgaWYobmV3LT5pbm8gPT0gc3QtPnN0X2lubyAmJiBuZXctPmRldiA9PSBzdC0+c3RfZGV2KQorICAgICAgICByZXR1cm4gMTsKKworICAgIG5ldyA9IHh6YWxsb2Moc2l6ZW9mKCpuZXcpKTsKKyAgICBuZXctPmlubyA9IHN0LT5zdF9pbm87CisgICAgbmV3LT5kZXYgPSBzdC0+c3RfZGV2OworICAgIG5ldy0+bmV4dCA9ICpsaXN0OworICAgICpsaXN0ID0gbmV3OworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGRpcnRyZWUgY2FsbGJhY2ssIGNvbXB1dC9kaXNwbGF5IHNpemUgb2Ygbm9kZQorc3RhdGljIGludCBkb19kdShzdHJ1Y3QgZGlydHJlZSAqbm9kZSkKK3sKKyAgaWYgKCFub2RlLT5wYXJlbnQpIFRULnN0X2RldiA9IG5vZGUtPnN0LnN0X2RldjsKKyAgZWxzZSBpZiAoIWRpcnRyZWVfbm90ZG90ZG90KG5vZGUpKSByZXR1cm4gMDsKKworICAvLyBkZXRlY3Qgc3dpY2hpbmcgZmlsZXN5c3RlbXMKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR194KSAmJiAoVFQuc3RfZGV2ICE9IG5vZGUtPnN0LnN0X2RldikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gRG9uJ3QgbG9vcCBlbmRsZXNzbHkgb24gcmVjdXJzaXZlIGRpcmVjdG9yeSBzeW1saW5rCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19MKSB7CisgICAgc3RydWN0IGRpcnRyZWUgKnRyeSA9IG5vZGU7CisKKyAgICB3aGlsZSAoKHRyeSA9IHRyeS0+cGFyZW50KSkKKyAgICAgIGlmIChub2RlLT5zdC5zdF9kZXY9PXRyeS0+c3Quc3RfZGV2ICYmIG5vZGUtPnN0LnN0X2lubz09dHJ5LT5zdC5zdF9pbm8pCisgICAgICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRG9uJ3QgY291bnQgaGFyZCBsaW5rcyB0d2ljZQorICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSAmJiAhbm9kZS0+YWdhaW4pCisgICAgaWYgKHNlZW5faW5vZGUoJlRULmlub2RlcywgJm5vZGUtPnN0KSkgcmV0dXJuIDA7CisKKyAgLy8gQ29sbGVjdCBjaGlsZCBpbmZvIGJlZm9yZSBwcmludGluZyBkaXJlY3Rvcnkgc2l6ZQorICBpZiAoU19JU0RJUihub2RlLT5zdC5zdF9tb2RlKSkgeworICAgIGlmICghbm9kZS0+YWdhaW4pIHsKKyAgICAgIFRULmRlcHRoKys7CisgICAgICByZXR1cm4gRElSVFJFRV9DT01FQUdBSU58KERJUlRSRUVfU1lNRk9MTE9XKiEhKHRveXMub3B0ZmxhZ3MmRkxBR19MKSk7CisgICAgfSBlbHNlIFRULmRlcHRoLS07CisgIH0KKworICBub2RlLT5leHRyYSArPSBub2RlLT5zdC5zdF9ibG9ja3M7CisgIGlmIChub2RlLT5wYXJlbnQpIG5vZGUtPnBhcmVudC0+ZXh0cmEgKz0gbm9kZS0+ZXh0cmE7CisgIGVsc2UgVFQudG90YWwgKz0gbm9kZS0+ZXh0cmE7CisKKyAgaWYgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19hKSB8fCAhbm9kZS0+cGFyZW50CisgICAgICB8fCAoU19JU0RJUihub2RlLT5zdC5zdF9tb2RlKSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpKSkKKyAgeworICAgIHByaW50KG5vZGUtPmV4dHJhKjUxMiwgbm9kZSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBkdV9tYWluKHZvaWQpCit7CisgIGNoYXIgKm5vYXJnc1tdID0geyIuIiwgMH0sICoqYXJnczsKKworICAvLyBMb29wIG92ZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgcmVjdXJzaW5nIHRocm91Z2ggY2hpbGRyZW4KKyAgZm9yIChhcmdzID0gdG95cy5vcHRjID8gdG95cy5vcHRhcmdzIDogbm9hcmdzOyAqYXJnczsgYXJncysrKQorICAgIGRpcnRyZWVfZmxhZ3JlYWQoKmFyZ3MsIERJUlRSRUVfU1lNRk9MTE9XKiEhKHRveXMub3B0ZmxhZ3MmKEZMQUdfSHxGTEFHX0wpKSwKKyAgICAgIGRvX2R1KTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIHByaW50KFRULnRvdGFsKjUxMiwgMCk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgc2Vlbl9pbm9kZShUVC5pbm9kZXMsIDApOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZWNoby5jIGIvdG95Ym94L3RveXMvcG9zaXgvZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGU2NzgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9lY2hvLmMKQEAgLTAsMCArMSw5NSBAQAorLyogZWNoby5jIC0gZWNobyBzdXBwb3J0aW5nIC1uIGFuZCAtZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2VjaG8uaHRtbAorICoKKyAqIERldmlhdGlvbnMgZnJvbSBwb3NpeDogd2UgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFzIExpbnV4IGhhcworICogY29uc2lzdGVudGx5IGRvbmUgc2luY2UgMTk5Mi4gUG9zaXggZGVmYXVsdHMgLWUgdG8gb24sIHdlIHJlcXVpcmUgLWUuCisgKiBXZSBhbHNvIGhvbm9yIC0tIHRvIF9zdG9wXyBvcHRpb24gcGFyc2luZyAoYmFzaCBkb2Vzbid0LCB3ZSBnbyB3aXRoCisgKiBjb25zaXN0ZW5jeSBvdmVyIGNvbXBhdGliaWxpdHkgaGVyZSkuCisKK1VTRV9FQ0hPKE5FV1RPWShlY2hvLCAiXj9lbiIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIEVDSE8KKyAgYm9vbCAiZWNobyIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZWNobyBbLW5lXSBbYXJncy4uLl0KKworICAgIFdyaXRlIGVhY2ggYXJndW1lbnQgdG8gc3Rkb3V0LCB3aXRoIG9uZSBzcGFjZSBiZXR3ZWVuIGVhY2gsIGZvbGxvd2VkCisgICAgYnkgYSBuZXdsaW5lLgorCisgICAgLW4JTm8gdHJhaWxpbmcgbmV3bGluZS4KKyAgICAtZQlQcm9jZXNzIHRoZSBmb2xsb3dpbmcgZXNjYXBlIHNlcXVlbmNlczoKKyAgICAJXFwJYmFja3NsYXNoCisgICAgCVwwTk5OCW9jdGFsIHZhbHVlcyAoMSB0byAzIGRpZ2l0cykKKyAgICAJXGEJYWxlcnQgKGJlZXAvZmxhc2gpCisgICAgCVxiCWJhY2tzcGFjZQorICAgIAlcYwlzdG9wIG91dHB1dCBoZXJlIChhdm9pZHMgdHJhaWxpbmcgbmV3bGluZSkKKyAgICAJXGYJZm9ybSBmZWVkCisgICAgCVxuCW5ld2xpbmUKKyAgICAJXHIJY2FycmlhZ2UgcmV0dXJuCisgICAgCVx0CWhvcml6b250YWwgdGFiCisgICAgCVx2CXZlcnRpY2FsIHRhYgorICAgIAlceEhICWhleGFkZWNpbWFsIHZhbHVlcyAoMSB0byAyIGRpZ2l0cykKKyovCisKKyNkZWZpbmUgRk9SX2VjaG8KKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgZWNob19tYWluKHZvaWQpCit7CisgIGludCBpID0gMCwgb3V0OworICBjaGFyICphcmcsICpjOworCisgIGZvciAoOzspIHsKKyAgICBhcmcgPSB0b3lzLm9wdGFyZ3NbaV07CisgICAgaWYgKCFhcmcpIGJyZWFrOworICAgIGlmIChpKyspIHB1dGNoYXIoJyAnKTsKKworICAgIC8vIFNob3VsZCB3ZSBvdXRwdXQgYXJnIHZlcmJhdGltPworCisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZSkpIHsKKyAgICAgIHhwcmludGYoIiVzIiwgYXJnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEhhbmRsZSAtZQorCisgICAgZm9yIChjID0gYXJnOzspIHsKKyAgICAgIGlmICghKG91dCA9ICooYysrKSkpIGJyZWFrOworCisgICAgICAvLyBoYW5kbGUgXGVzY2FwZXMKKyAgICAgIGlmIChvdXQgPT0gJ1xcJyAmJiAqYykgeworICAgICAgICBpbnQgc2xhc2ggPSAqKGMrKyksIG4gPSB1bmVzY2FwZShzbGFzaCk7CisKKyAgICAgICAgaWYgKG4pIG91dCA9IG47CisgICAgICAgIGVsc2UgaWYgKHNsYXNoPT0nYycpIGdvdG8gZG9uZTsKKyAgICAgICAgZWxzZSBpZiAoc2xhc2g9PScwJykgeworICAgICAgICAgIG91dCA9IDA7CisgICAgICAgICAgd2hpbGUgKCpjPj0nMCcgJiYgKmM8PSc3JyAmJiBuKys8Mykgb3V0ID0gKG91dCo4KSsqKGMrKyktJzAnOworICAgICAgICB9IGVsc2UgaWYgKHNsYXNoPT0neCcpIHsKKyAgICAgICAgICBvdXQgPSAwOworICAgICAgICAgIHdoaWxlIChuKys8MikgeworICAgICAgICAgICAgaWYgKCpjPj0nMCcgJiYgKmM8PSc5Jykgb3V0ID0gKG91dCoxNikrKihjKyspLScwJzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpbnQgdGVtcCA9IHRvbG93ZXIoKmMpOworICAgICAgICAgICAgICBpZiAodGVtcD49J2EnICYmIHRlbXA8PSdmJykgeworICAgICAgICAgICAgICAgIG91dCA9IChvdXQqMTYpK3RlbXAtJ2EnKzEwOworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgLy8gU2xhc2ggaW4gZnJvbnQgb2YgdW5rbm93biBjaGFyYWN0ZXIsIHByaW50IGxpdGVyYWwuCisgICAgICAgIH0gZWxzZSBjLS07CisgICAgICB9CisgICAgICBwdXRjaGFyKG91dCk7CisgICAgfQorICB9CisKKyAgLy8gT3V0cHV0ICJcbiIgaWYgbm8gLW4KKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX24pKSBwdXRjaGFyKCdcbicpOworZG9uZToKKyAgeGZsdXNoKCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9lbnYuYyBiL3RveWJveC90b3lzL3Bvc2l4L2Vudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmM1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9lbnYuYwpAQCAtMCwwICsxLDUwIEBACisvKiBlbnYuYyAtIFNldCB0aGUgZW52aXJvbm1lbnQgZm9yIGNvbW1hbmQgaW52b2NhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBUcnluIE1pcmVsbCA8dHJ5bkBtaXJlbGwub3JnPgorICoKKyAqIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZW52Lmh0bWwKKworVVNFX0VOVihORVdUT1koZW52LCAiXml1KiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEVOVgorICBib29sICJlbnYiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGVudiBbLWldIFstdSBOQU1FXSBbTkFNRT1WQUxVRS4uLl0gW2NvbW1hbmQgW29wdGlvbi4uLl1dCisKKyAgICBTZXQgdGhlIGVudmlyb25tZW50IGZvciBjb21tYW5kIGludm9jYXRpb24uCisKKyAgICAtaQlDbGVhciBleGlzdGluZyBlbnZpcm9ubWVudC4KKyAgICAtdSBOQU1FCVJlbW92ZSBOQU1FIGZyb20gdGhlIGVudmlyb25tZW50CisqLworCisjZGVmaW5lIEZPUl9lbnYKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIHN0cnVjdCBhcmdfbGlzdCAqdTsKKyk7CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKwordm9pZCBlbnZfbWFpbih2b2lkKQoreworICBjaGFyICoqZXY7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIGNsZWFyZW52KCk7CisgIHdoaWxlIChUVC51KSB7CisgICAgdW5zZXRlbnYoVFQudS0+YXJnKTsKKyAgICBUVC51ID0gVFQudS0+bmV4dDsKKyAgfQorCisgIGZvciAoZXYgPSB0b3lzLm9wdGFyZ3M7ICpldjsgZXYrKykgeworICAgIGNoYXIgKm5hbWUgPSAqZXYsICp2YWwgPSBzdHJjaHIobmFtZSwgJz0nKTsKKworICAgIGlmICh2YWwpIHsKKyAgICAgICoodmFsKyspID0gMDsKKyAgICAgIHNldGVudihuYW1lLCB2YWwsIDEpOworICAgIH0gZWxzZSB4ZXhlYyhldik7CisgIH0KKworICBpZiAoZW52aXJvbikgZm9yIChldiA9IGVudmlyb247ICpldjsgZXYrKykgeHB1dHMoKmV2KTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L2V4cGFuZC5jIGIvdG95Ym94L3RveXMvcG9zaXgvZXhwYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ODQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2V4cGFuZC5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBleHBhbmQuYyAtIGV4cGFuZHMgdGFicyB0byBzcGFjZQorICoKKyAqIENvcHlyaWdodCAyMDEyIEpvbmF0aGFuIENsYWlyZW1iYXVsdCA8am9uYXRoYW4gYXQgY2xhaXJlbWJhdWx0IGRvdCBmcj4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2V4cGFuZC5odG1sCisKK1VTRV9FWFBBTkQoTkVXVE9ZKGV4cGFuZCwgInQqIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorCitjb25maWcgRVhQQU5ECisgIGJvb2wgImV4cGFuZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZXhwYW5kIFstdCBUQUJMSVNUXSBbRklMRS4uLl0KKworICAgIEV4cGFuZCB0YWJzIHRvIHNwYWNlcyBhY2NvcmRpbmcgdG8gdGFic3RvcHMuCisKKyAgICAtdAlUQUJMSVNUCisKKyAgICBTcGVjaWZ5IHRhYiBzdG9wcywgZWl0aGVyIGEgc2luZ2xlIG51bWJlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDgsCisgICAgb3IgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbmNyZWFzaW5nIG51bWJlcnMgcmVwcmVzZW50aW5nIHRhYnN0b3AKKyAgICBwb3NpdGlvbnMgKGFic29sdXRlLCBub3QgaW5jcmVtZW50cykgd2l0aCBlYWNoIGFkZGl0aW9uYWwgdGFiIGJleW91bmQKKyAgICB0aGF0IGJlY29taW5nIG9uZSBzcGFjZS4KKyovCisKKyNkZWZpbmUgRk9SX2V4cGFuZAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgc3RydWN0IGFyZ19saXN0ICp0YWJzOworCisgIHVuc2lnbmVkIHRhYmNvdW50LCAqdGFiOworKQorCitzdGF0aWMgdm9pZCBkb19leHBhbmQoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBpbnQgaSwgbGVuLCB4PTAsIHN0b3AgPSAwOworCisgIGZvciAoOzspIHsKKyAgICBsZW4gPSByZWFkYWxsKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAobGVuPDApIHsKKyAgICAgIHBlcnJvcl9tc2dfcmF3KG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWxlbikgYnJlYWs7CisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgIGludCB3aWR0aCA9IDE7CisgICAgICBjaGFyIGM7CisKKyAgICAgIGlmIChDRkdfVE9ZQk9YX0kxOE4pIHsKKyAgICAgICAgd2NoYXJfdCBibGFoOworCisgICAgICAgIHdpZHRoID0gbWJydG93YygmYmxhaCwgdG95YnVmK2ksIGxlbi1pLCAwKTsKKyAgICAgICAgaWYgKHdpZHRoID4gMSkgeworICAgICAgICAgIGlmICh3aWR0aCAhPSBmd3JpdGUodG95YnVmK2ksIHdpZHRoLCAxLCBzdGRvdXQpKQorICAgICAgICAgICAgcGVycm9yX2V4aXQoInN0ZG91dCIpOworICAgICAgICAgIGkgKz0gd2lkdGgtMTsKKyAgICAgICAgICB4Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPT0gLTIpIGJyZWFrOworICAgICAgICBlbHNlIGlmICh3aWR0aCA9PSAtMSkgY29udGludWU7CisgICAgICB9CisgICAgICBjID0gdG95YnVmW2ldOworCisgICAgICBpZiAoYyAhPSAnXHQnKSB7CisgICAgICAgIGlmIChFT0YgPT0gcHV0YyhjLCBzdGRvdXQpKSBwZXJyb3JfZXhpdCgwKTsKKworICAgICAgICBpZiAoYyA9PSAnXGInICYmIHgpIHdpZHRoID0gLTE7CisgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICB4ID0gc3RvcCA9IDA7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChUVC50YWJjb3VudCA8IDIpIHsKKyAgICAgICAgICB3aWR0aCA9IFRULnRhYmNvdW50ID8gKlRULnRhYiA6IDg7CisgICAgICAgICAgd2lkdGggLT0geCV3aWR0aDsKKyAgICAgICAgfSBlbHNlIHdoaWxlIChzdG9wIDwgVFQudGFiY291bnQpIHsKKyAgICAgICAgICBpZiAoVFQudGFiW3N0b3BdID4geCkgeworICAgICAgICAgICAgd2lkdGggPSBUVC50YWJbc3RvcF0gLSB4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHN0b3ArKzsKKyAgICAgICAgfQorICAgICAgICB4cHJpbnRmKCIlKmMiLCB3aWR0aCwgJyAnKTsKKyAgICAgIH0KKyAgICAgIHggKz0gd2lkdGg7CisgICAgfQorICB9Cit9CisKKy8vIFBhcnNlIC10IG9wdGlvbnMgdG8gZmlsbCBvdXQgdW5zaWduZWQgYXJyYXkgaW4gdGFibGlzdCAoaWYgbm90IE5VTEwpCisvLyByZXR1cm4gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGlzdAorc3RhdGljIGludCBwYXJzZV90YWJsaXN0KHVuc2lnbmVkICp0YWJsaXN0KQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKnRhYnM7CisgIGludCB0YWJjb3VudCA9IDA7CisKKyAgZm9yICh0YWJzID0gVFQudGFiczsgdGFiczsgdGFicyA9IHRhYnMtPm5leHQpIHsKKyAgICBjaGFyICpzID0gdGFicy0+YXJnOworCisgICAgd2hpbGUgKCpzKSB7CisgICAgICBpbnQgY291bnQ7CisgICAgICB1bnNpZ25lZCB4LCAqdCA9IHRhYmxpc3QgPyB0YWJsaXN0K3RhYmNvdW50IDogJng7CisKKyAgICAgIGlmICh0YWJjb3VudCA+PSBzaXplb2YodG95YnVmKS9zaXplb2YodW5zaWduZWQpKSBicmVhazsKKyAgICAgIGlmIChzc2NhbmYocywgIiV1JW4iLCB0LCAmY291bnQpICE9IDEpIGJyZWFrOworICAgICAgaWYgKHRhYmNvdW50KysgJiYgdGFibGlzdCAmJiAqKHQtMSkgPj0gKnQpIGJyZWFrOworICAgICAgcyArPSBjb3VudDsKKyAgICAgIGlmICgqcz09JyAnIHx8ICpzPT0nLCcpIHMrKzsKKyAgICAgIGVsc2UgYnJlYWs7CisgICAgfQorICAgIGlmICgqcykgZXJyb3JfZXhpdCgiYmFkIHRhYmxpc3QiKTsKKyAgfQorCisgIHJldHVybiB0YWJjb3VudDsKK30KKwordm9pZCBleHBhbmRfbWFpbih2b2lkKQoreworICBUVC50YWJjb3VudCA9IHBhcnNlX3RhYmxpc3QoTlVMTCk7CisKKyAgLy8gRGV0ZXJtaW5lIHNpemUgb2YgdGFibGlzdCwgYWxsb2NhdGUgbWVtb3J5LCBmaWxsIG91dCB0YWJsaXN0CisgIGlmIChUVC50YWJjb3VudCkgeworICAgIFRULnRhYiA9IHhtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkKSpUVC50YWJjb3VudCk7CisgICAgcGFyc2VfdGFibGlzdChUVC50YWIpOworICB9CisKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fZXhwYW5kKTsKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShUVC50YWIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZmFsc2UuYyBiL3RveWJveC90b3lzL3Bvc2l4L2ZhbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1M2IwMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2ZhbHNlLmMKQEAgLTAsMCArMSwyMSBAQAorLyogZmFsc2UuYyAtIFJldHVybiBub256ZXJvLgorICoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZmFsc2UuaHRtbAorCitVU0VfRkFMU0UoTkVXVE9ZKGZhbHNlLCBOVUxMLCBUT1lGTEFHX0JJTnxUT1lGTEFHX05PSEVMUCkpCisKK2NvbmZpZyBGQUxTRQorICBib29sICJmYWxzZSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICBSZXR1cm4gbm9uemVyby4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgZmFsc2VfbWFpbih2b2lkKQoreworICB0b3lzLmV4aXR2YWwgPSAxOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZmlsZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDkwNDcKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9maWxlLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qIGZpbGUuYyAtIGRlc2NyaWJlIGZpbGUgdHlwZQorICoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2ZpbGUuaHRtbAorICoKKyAqIFRPRE86IGFyCisKK1VTRV9GSUxFKE5FV1RPWShmaWxlLCAiPDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBGSUxFCisgIGJvb2wgImZpbGUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGZpbGUgW2ZpbGUuLi5dCisKKyAgICBFeGFtaW5lIHRoZSBnaXZlbiBmaWxlcyBhbmQgZGVzY3JpYmUgdGhlaXIgY29udGVudCB0eXBlcy4KKyovCisKKyNkZWZpbmUgRk9SX2ZpbGUKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGludCBtYXhfbmFtZV9sZW47CispCisKKy8vIFdlIGRvbid0IHRydXN0IGVsZi5oIHRvIGJlIHRoZXJlLCBhbmQgdHdvIGNvZGVwYXRocyBmb3IgMzIvNjQgaXMgYXdrd2FyZAorLy8gYW55d2F5LCBzbyBjYWxjdWxhdGUgc3RydWN0IG9mZnNldHMgbWFudWFsbHkuIChJdCdzIGEgZml4ZWQgQUJJLikKK3N0YXRpYyB2b2lkIGRvX2VsZl9maWxlKGludCBmZCwgc3RydWN0IHN0YXQgKnNiKQoreworICBpbnQgZW5kaWFuID0gdG95YnVmWzVdLCBiaXRzID0gdG95YnVmWzRdLCBpLCBqOworICBpbnQ2NF90ICgqZWxmX2ludCkodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKSA9IHBlZWtfbGU7CisgIC8vIFZhbHVlcyBmcm9tIGluY2x1ZGUvbGludXgvZWxmLWVtLmggKHBsdXMgYXJjaC8qL2luY2x1ZGUvYXNtL2VsZi5oKQorICAvLyBOYW1lcyBhcmUgbGludXgvYXJjaC8gZGlyZWN0b3J5IChzb21ldGltZXMgYmVmb3JlIDMyLzY0IGJpdCBtZXJnZXMpCisgIHN0cnVjdCB7aW50IHZhbDsgY2hhciAqbmFtZTt9IHR5cGVbXSA9IHt7MHg5MDI2LCAiYWxwaGEifSwgezkzLCAiYXJjIn0sCisgICAgezE5NSwgImFyY3YyIn0sIHs0MCwgImFybSJ9LCB7MTgzLCAiYXJtNjQifSwgezB4MThhZCwgImF2cjMyIn0sCisgICAgezEwNiwgImJsYWNrZmluIn0sIHsxNDAsICJjNngifSwgezIzLCAiY2VsbCJ9LCB7NzYsICJjcmlzIn0sCisgICAgezB4NTQ0MSwgImZydiJ9LCB7NDYsICJoODMwMCJ9LCB7MTY0LCAiaGV4YWdvbiJ9LCB7NTAsICJpYTY0In0sCisgICAgezg4LCAibTMyciJ9LCB7MHg5MDQxLCAibTMyciJ9LCB7NCwgIm02OGsifSwgezE3NCwgIm1ldGFnIn0sCisgICAgezB4YmFhYiwgIm1pY3JvYmxhemUifSwgezgsICJtaXBzIn0sIHsxMCwgIm1pcHMtb2xkIn0sIHs4OSwgIm1uMTAzMDAifSwKKyAgICB7MHhiZWVmLCAibW4xMDMwMC1vbGQifSwgezExMywgIm5pb3MyIn0sIHs5MiwgIm9wZW5yaXNjIn0sCisgICAgezB4ODQ3MiwgIm9wZW5yaXNjLW9sZCJ9LCB7MTUsICJwYXJpc2MifSwgezIwLCAicHBjIn0sIHsyMSwgInBwYzY0In0sCisgICAgezIyLCAiczM5MCJ9LCB7MHhhMzkwLCAiczM5MC1vbGQifSwgezEzNSwgInNjb3JlIn0sIHs0MiwgInNoIn0sCisgICAgezIsICJzcGFyYyJ9LCB7MTgsICJzcGFyYzgrIn0sIHs0MywgInNwYXJjOSJ9LCB7MTg4LCAidGlsZSJ9LAorICAgIHsxOTEsICJ0aWxlZ3gifSwgezMsICIzODYifSwgezYsICI0ODYifSwgezYyLCAieDg2LTY0In0sIHs5NCwgInh0ZW5zYSJ9LAorICAgIHsweGFiYzcsICJ4dGVuc2Etb2xkIn0KKyAgfTsKKyAgaW50IGR5bmFtaWMgPSAwOworICBpbnQgc3RyaXBwZWQgPSAxOworICBjaGFyICptYXA7CisgIG9mZl90IHBob2ZmLCBzaG9mZjsKKyAgaW50IHBoc2l6ZSwgcGhudW0sIHNoc2l6ZSwgc2hudW07CisKKyAgcHJpbnRmKCJFTEYgIik7CisKKyAgLy8gZXhlY3V0YWJsZSAoRUxGIHNheXMgdGhpcyBpcyBzaG9ydCBidXQgcmVhbGl0eSBzYXlzIGJ5dGUsIG5vdCBNU0Igc3dhcHBlZCkKKyAgaSA9IHRveWJ1ZlsxNl07CisgIGlmIChpID09IDEpIHByaW50ZigicmVsb2NhdGFibGUiKTsKKyAgZWxzZSBpZiAoaSA9PSAyKSBwcmludGYoImV4ZWN1dGFibGUiKTsKKyAgZWxzZSBpZiAoaSA9PSAzKSBwcmludGYoInNoYXJlZCBvYmplY3QiKTsKKyAgZWxzZSBpZiAoaSA9PSA0KSBwcmludGYoImNvcmUgZHVtcCIpOworICBlbHNlIHByaW50ZigiKGJhZCB0eXBlICVkKSIsIGkpOworICBwcmludGYoIiwgIik7CisKKyAgLy8gIjY0LWJpdCIKKyAgaWYgKGJpdHMgPT0gMSkgcHJpbnRmKCIzMi1iaXQgIik7CisgIGVsc2UgaWYgKGJpdHMgPT0gMikgcHJpbnRmKCI2NC1iaXQgIik7CisgIGVsc2UgeworICAgIHByaW50ZigiKGJhZCBjbGFzcyAlZCkgIiwgYml0cyk7CisgICAgYml0cyA9IDA7CisgIH0KKworICAvLyAiTFNCIgorICBpZiAoZW5kaWFuID09IDEpIHByaW50ZigiTFNCICIpOworICBlbHNlIGlmIChlbmRpYW4gPT0gMikgeworICAgIHByaW50ZigiTVNCICIpOworICAgIGVsZl9pbnQgPSBwZWVrX2JlOworICB9IGVsc2UgeworICAgIHByaW50ZigiKGJhZCBlbmRpYW4gJWQpIFxuIiwgZW5kaWFuKTsKKyAgICBlbmRpYW4gPSAwOworICB9CisKKyAgLy8gZV9tYWNoaW5lLCBhbGEgIng4NiIsIGZyb20gYmlnIHRhYmxlIGFib3ZlCisgIGogPSBlbGZfaW50KHRveWJ1ZisxOCwgMik7CisgIGZvciAoaSA9IDA7IGk8QVJSQVlfTEVOKHR5cGUpOyBpKyspIGlmIChqPT10eXBlW2ldLnZhbCkgYnJlYWs7CisgIGlmIChpPEFSUkFZX0xFTih0eXBlKSkgcHJpbnRmKCIlcyIsIHR5cGVbaV0ubmFtZSk7CisgIGVsc2UgcHJpbnRmKCIodW5rbm93biBhcmNoICVkKSIsIGopOworCisgIGJpdHMtLTsKKyAgLy8gSWYgd2hhdCB3ZSd2ZSBzZWVuIHNvIGZhciBkb2Vzbid0IHNlZW0gY29uc2lzdGVudCwgYmFpbC4KKyAgaWYgKCEoKGJpdHMmMSk9PWJpdHMgJiYgZW5kaWFuICYmCisgICAgICAgKGkgPSBlbGZfaW50KHRveWJ1Zis0MisxMipiaXRzLCAyKSkgPT0gMzIrMjQqYml0cykpIHsKKyAgICBwcmludGYoIiwgY29ycnVwdD9cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFN0YXNoIHdoYXQgd2UgbmVlZCBmcm9tIHRoZSBoZWFkZXI7IGl0J3Mgb2theSB0byByZXVzZSB0b3lidWYgYWZ0ZXIgdGhpcy4KKyAgcGhzaXplID0gaTsKKyAgcGhudW0gPSBlbGZfaW50KHRveWJ1Zis0NCsxMipiaXRzLCAyKTsKKyAgcGhvZmYgPSBlbGZfaW50KHRveWJ1ZisyOCs0KmJpdHMsIDQrNCpiaXRzKTsKKyAgc2hzaXplID0gZWxmX2ludCh0b3lidWYrNDYrMTIqYml0cywgMik7CisgIHNobnVtID0gZWxmX2ludCh0b3lidWYrNDgrMTIqYml0cywgMik7CisgIHNob2ZmID0gZWxmX2ludCh0b3lidWYrMzIrOCpiaXRzLCA0KzQqYml0cyk7CisKKyAgbWFwID0gbW1hcCgwLCBzYi0+c3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CisgIGlmICghbWFwKSBwZXJyb3JfZXhpdCgibW1hcCIpOworCisgIC8vIFdlIG5lZWQgdG8gcmVhZCB0aGUgcGhkcnMgZm9yIGR5bmFtaWMgdnMgc3RhdGljIGFuZCBhbnkgbm90ZXMuCisgIC8vIChOb3RlOiBmaWVsZHMgZ290IHJlb3JkZXJlZCBmb3IgNjQgYml0KQorICBmb3IgKGkgPSAwOyBpPHBobnVtOyBpKyspIHsKKyAgICBjaGFyICpwaGRyID0gbWFwK3Bob2ZmK2kqcGhzaXplOworICAgIGludCBwX3R5cGUgPSBlbGZfaW50KHBoZHIsIDQpOworICAgIGxvbmcgbG9uZyBwX29mZnNldCwgcF9maWxlc3o7CisKKyAgICBpZiAocF90eXBlPT0yIC8qUFRfRFlOQU1JQyovKSBkeW5hbWljID0gMTsKKyAgICBpZiAocF90eXBlIT0zIC8qUFRfSU5URVJQKi8gJiYgcF90eXBlIT00IC8qUFRfTk9URSovKSBjb250aW51ZTsKKworICAgIGogPSBiaXRzKzE7CisgICAgcF9vZmZzZXQgPSBlbGZfaW50KHBoZHIrNCpqLCA0KmopOworICAgIHBfZmlsZXN6ID0gZWxmX2ludChwaGRyKzE2KmosIDQqaik7CisKKyAgICBpZiAocF90eXBlPT0zIC8qUFRfSU5URVJQKi8pCisgICAgICBwcmludGYoIiwgZHluYW1pYyAoJS4qcykiLCAoaW50KXBfZmlsZXN6LCBtYXArcF9vZmZzZXQpOworICAgIGVsc2UgeworICAgICAgY2hhciAqbm90ZSA9IG1hcCtwX29mZnNldDsKKworICAgICAgLy8gQSBQVF9OT1RFIHBoZHIgaXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzLCBlYWNoIGNvbnNpc3Rpbmcgb2YgYW4KKyAgICAgIC8vIG5kaHIgZm9sbG93ZWQgYnkgbl9uYW1lc3orbl9kZXNjc3ogYnl0ZXMgb2YgZGF0YSAoZWFjaCBvZiB0aG9zZQorICAgICAgLy8gcm91bmRlZCB1cCB0byB0aGUgbmV4dCA0IGJ5dGVzLCB3aXRob3V0IHRoaXMgYmVpbmcgcmVmbGVjdGVkIGluCisgICAgICAvLyB0aGUgaGVhZGVyIGJ5dGUgY291bnRzIHRoZW1zZWx2ZXMpLgorICAgICAgd2hpbGUgKHBfZmlsZXN6ID49IDMqNCkgeyAvLyBEb24ndCB0cnkgdG8gcmVhZCBhIHRydW5jYXRlZCBlbnRyeS4KKyAgICAgICAgaW50IG5fbmFtZXN6ID0gZWxmX2ludChub3RlLCA0KTsKKyAgICAgICAgaW50IG5fZGVzY3N6ID0gZWxmX2ludChub3RlKzQsIDQpOworICAgICAgICBpbnQgbl90eXBlID0gZWxmX2ludChub3RlKzgsIDQpOworICAgICAgICBpbnQgbm90ZXN6ID0gMyo0ICsgKChuX25hbWVzeiszKSZ+MykgKyAoKG5fZGVzY3N6KzMpJn4zKTsKKworICAgICAgICBpZiAobl9uYW1lc3o9PTQgJiYgIW1lbWNtcChub3RlKzEyLCAiR05VIiwgNCkpIHsKKyAgICAgICAgICBpZiAobl90eXBlID09IDMgLypOVF9HTlVfQlVJTERfSUQqLykgeworICAgICAgICAgICAgcHJpbnRmKCIsIEJ1aWxkSUQ9Iik7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbl9kZXNjc3o7ICsraikgcHJpbnRmKCIlMDJ4Iiwgbm90ZVsxNiArIGpdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobl9uYW1lc3o9PTggJiYgIW1lbWNtcChub3RlKzEyLCAiQW5kcm9pZCIsIDgpKSB7CisgICAgICAgICAgaWYgKG5fdHlwZT09MSkgcHJpbnRmKCIsIGZvciBBbmRyb2lkICVkIiwgKGludCllbGZfaW50KG5vdGUrMjAsIDQpKTsKKyAgICAgICAgfQorCisgICAgICAgIG5vdGUgKz0gbm90ZXN6OworICAgICAgICBwX2ZpbGVzeiAtPSBub3Rlc3o7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghZHluYW1pYykgcHJpbnRmKCIsIHN0YXRpYyIpOworCisgIC8vIFdlIG5lZWQgdG8gcmVhZCB0aGUgc2hkcnMgZm9yIHN0cmlwcGVkL3Vuc3RyaXBwZWQuCisgIC8vIChOb3RlOiBmaWVsZHMgZ290IHJlb3JkZXJlZCBmb3IgNjQgYml0KQorICBmb3IgKGkgPSAwOyBpPHNobnVtOyBpKyspIHsKKyAgICBjaGFyICpzaGRyID0gbWFwK3Nob2ZmK2kqc2hzaXplOworICAgIGludCBzaF90eXBlID0gZWxmX2ludChzaGRyKzQsIDQpOworCisgICAgaWYgKHNoX3R5cGUgPT0gMiAvKlNIVF9TWU1UQUIqLykgeworICAgICAgc3RyaXBwZWQgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHByaW50ZigiLCAlc3N0cmlwcGVkIiwgc3RyaXBwZWQgPyAiIiA6ICJub3QgIik7CisgIHhwdXRjKCdcbicpOworCisgIG11bm1hcChtYXAsIHNiLT5zdF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgZG9fcmVndWxhcl9maWxlKGludCBmZCwgY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnNiKQoreworICBjaGFyICpzOworICBpbnQgbGVuID0gcmVhZChmZCwgcyA9IHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiktMjU2KTsKKyAgaW50IG1hZ2ljOworCisgIGlmIChsZW48MCkgcGVycm9yX21zZygiJXMiLCBuYW1lKTsKKworICBpZiAobGVuPjQwICYmIHN0cnN0YXJ0KCZzLCAiXDE3N0VMRiIpKSBkb19lbGZfZmlsZShmZCwgc2IpOworICBlbHNlIGlmIChsZW4+MjggJiYgc3Ryc3RhcnQoJnMsICJceDg5UE5HXHgwZFx4MGFceDFhXHgwYSIpKSB7CisgICAgLy8gUE5HIGlzIGJpZy1lbmRpYW46IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9QTkcvIzdJbnRlZ2Vycy1hbmQtYnl0ZS1vcmRlcgorICAgIGludCBjaHVua19sZW5ndGggPSBwZWVrX2JlKHMsIDQpOworCisgICAgeHByaW50ZigiUE5HIGltYWdlIGRhdGEiKTsKKworICAgIC8vIFRoZSBJSERSIGNodW5rIGNvbWVzIGZpcnN0OiBodHRwczovL3d3dy53My5vcmcvVFIvUE5HLyMxMUlIRFIKKyAgICBzICs9IDQ7CisgICAgaWYgKGNodW5rX2xlbmd0aCA9PSAxMyAmJiBzdHJzdGFydCgmcywgIklIRFIiKSkgeworICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1BORy8jNkNvbG91ci12YWx1ZXMKKyAgICAgIGNoYXIgKmMgPSAwLCAqY29sb3JzW10gPSB7ImdyYXlzY2FsZSIsIDAsICJjb2xvciBSR0IiLCAiaW5kZXhlZCBjb2xvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmF5c2NhbGUgd2l0aCBhbHBoYSIsIDAsICJjb2xvciBSR0JBIn07CisKKyAgICAgIGlmIChzWzldPEFSUkFZX0xFTihjb2xvcnMpKSBjID0gY29sb3JzW3NbOV1dOworICAgICAgaWYgKCFjKSBjID0gInVua25vd24iOworCisgICAgICB4cHJpbnRmKCIsICVkIHggJWQsICVkLWJpdC8lcywgJXNpbnRlcmxhY2VkIiwgKGludClwZWVrX2JlKHMsIDQpLAorICAgICAgICAoaW50KXBlZWtfYmUocys0LCA0KSwgc1s4XSwgYywgc1sxMl0gPyAiIiA6ICJub24tIik7CisgICAgfQorCisgICAgeHB1dGMoJ1xuJyk7CisKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL0dyYXBoaWNzL0dJRi9zcGVjLWdpZjg5YS50eHQKKyAgfSBlbHNlIGlmIChsZW4+MTYgJiYgKHN0cnN0YXJ0KCZzLCAiR0lGODdhIikgfHwgc3Ryc3RhcnQoJnMsICJHSUY4OWEiKSkpCisgICAgeHByaW50ZigiR0lGIGltYWdlIGRhdGEsICVkIHggJWRcbiIsCisgICAgICAoaW50KXBlZWtfbGUocywgMiksIChpbnQpcGVla19sZShzKzgsIDIpKTsKKworICAvLyBUT0RPOiBwYXJzaW5nIEpQRUcgZm9yIHdpZHRoL2hlaWdodCBpcyBoYXJkZXIgdGhhbiBHSUYgb3IgUE5HLgorICBlbHNlIGlmIChsZW4+MzIgJiYgbWVtY21wKHRveWJ1ZiwgIlx4ZmZceGQ4IiwgMikgPT0gMCkKKyAgICB4cHJpbnRmKCJKUEVHIGltYWdlIGRhdGFcbiIpOworCisgIC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qdm1zL3NlNy9odG1sL2p2bXMtNC5odG1sCisgIGVsc2UgaWYgKGxlbj44ICYmIHN0cnN0YXJ0KCZzLCAiXHhjYVx4ZmVceGJhXHhiZSIpKQorICAgIHhwcmludGYoIkphdmEgY2xhc3MgZmlsZSwgdmVyc2lvbiAlZC4lZFxuIiwKKyAgICAgIChpbnQpcGVla19iZShzKzIsIDIpLCAoaW50KXBlZWtfYmUocywgMikpOworCisgIC8vIGh0dHBzOi8vcGVvcGxlLmZyZWVic2Qub3JnL35raWVudHpsZS9saWJhcmNoaXZlL21hbi9jcGlvLjUudHh0CisgIC8vIHRoZSBsZW5ndGhzIGZvciBjcGlvIGFyZSBzaXplIG9mIGhlYWRlciArIDkgYnl0ZXMsIHNpbmNlIGFueSB2YWxpZAorICAvLyBjcGlvIGFyY2hpdmUgZW5kcyB3aXRoIGEgcmVjb3JkIGZvciAiVEFSR0VUISEhIgorICBlbHNlIGlmIChsZW4+ODUgJiYgc3Ryc3RhcnQoJnMsICIwNzA3MCIpKSB7CisgICAgY2hhciAqY3Bpb2Zvcm1hdCA9ICJ1bmtub3duIHR5cGUiOworICAgIGlmICh0b3lidWZbNV0gPT0gJzcnKSBjcGlvZm9ybWF0ID0gInByZS1TVlI0IG9yIG9kYyI7CisgICAgZWxzZSBpZiAodG95YnVmWzVdID09ICcxJykgY3Bpb2Zvcm1hdCA9ICJTVlI0IHdpdGggbm8gQ1JDIjsKKyAgICBlbHNlIGlmICh0b3lidWZbNV0gPT0gJzInKSBjcGlvZm9ybWF0ID0gIlNWUjQgd2l0aCBDUkMiOworICAgIHhwcmludGYoIkFTQ0lJIGNwaW8gYXJjaGl2ZSAoJXMpXG4iLCBjcGlvZm9ybWF0KTsKKyAgfQorICBlbHNlIGlmIChsZW4+MzMgJiYgKG1hZ2ljPXBlZWsoJnMsMiksIG1hZ2ljPT0wMTQzNTYxIHx8IG1hZ2ljPT0wNzA3MDcpKSB7CisgICAgaWYgKG1hZ2ljID09IDAxNDM1NjEpIHByaW50ZigiYnl0ZS1zd2FwcGVkICIpOworICAgIHhwcmludGYoImNwaW8gYXJjaGl2ZVxuIik7CisgIH0KKyAgLy8gdGFyIGFyY2hpdmUgKHVzdGFyL3BheCBvciBnbnUpCisgIGVsc2UgaWYgKGxlbj41MDAgJiYgIXN0cm5jbXAocysyNTcsICJ1c3RhciIsIDUpKSB7CisgICAgeHByaW50ZigiUE9TSVggdGFyIGFyY2hpdmUlc1xuIiwgc3RybmNtcChzKzI2MiwiICAiLDIpPyIiOiIgKEdOVSkiKTsKKyAgfQorICAvLyB6aXAvamFyL2FwayBhcmNoaXZlLCBPREYvT09YTUwgZG9jdW1lbnQsIG9yIHN1Y2gKKyAgZWxzZSBpZiAobGVuPjUgJiYgc3Ryc3RhcnQoJnMsICJQS1wwM1wwNCIpKSB7CisgICAgaW50IHZlciA9IChpbnQpKGNoYXIpKHRveWJ1Zls0XSk7CisgICAgeHByaW50ZigiWmlwIGFyY2hpdmUgZGF0YSIpOworICAgIGlmICh2ZXIpCisgICAgICB4cHJpbnRmKCIsIHJlcXVpcmVzIGF0IGxlYXN0IHYlZC4lZCB0byBleHRyYWN0IiwgdmVyLzEwLCB2ZXIlMTApOworICAgIHhwdXRjKCdcbicpOworICB9CisgIGVsc2UgeworICAgIGNoYXIgKndoYXQgPSAwOworICAgIGludCBpLCBieXRlczsKKworICAgIC8vIElmIHNoZWxsIHNjcmlwdCwgcmVwb3J0IHdoaWNoIGludGVycHJldGVyCisgICAgaWYgKGxlbj4zICYmIHN0cnN0YXJ0KCZzLCAiIyEiKSkgeworICAgICAgLy8gV2hpdGVzcGFjZSBpcyBhbGxvd2VkIGJldHdlZW4gdGhlICMhIGFuZCB0aGUgaW50ZXJwcmV0ZXIKKyAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgcysrOworICAgICAgaWYgKHN0cnN0YXJ0KCZzLCAiL3Vzci9iaW4vZW52IikpIHdoaWxlIChpc3NwYWNlKCpzKSkgcysrOworICAgICAgZm9yICh3aGF0ID0gczsgKHMtdG95YnVmKTxsZW4gJiYgIWlzc3BhY2UoKnMpOyBzKyspOworICAgICAgc3RyY3B5KHMsICIgc2NyaXB0Iik7CisKKyAgICAvLyBEaXN0aW5ndWlzaCBBU0NJSSB0ZXh0LCBVVEYtOCB0ZXh0LCBvciBkYXRhCisgICAgfSBlbHNlIGZvciAoaSA9IDA7IGk8bGVuOyArK2kpIHsKKyAgICAgIGlmICghKGlzcHJpbnQodG95YnVmW2ldKSB8fCBpc3NwYWNlKHRveWJ1ZltpXSkpKSB7CisgICAgICAgIHdjaGFyX3Qgd2M7CisgICAgICAgIGlmICgoYnl0ZXMgPSBtYnJ0b3djKCZ3YywgcytpLCBsZW4taSwgMCkpPjAgJiYgd2N3aWR0aCh3Yyk+PTApIHsKKyAgICAgICAgICBpICs9IGJ5dGVzLTE7CisgICAgICAgICAgaWYgKCF3aGF0KSB3aGF0ID0gIlVURi04IHRleHQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdoYXQgPSAiZGF0YSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgeHB1dHMod2hhdCA/IHdoYXQgOiAiQVNDSUkgdGV4dCIpOworICB9Cit9CisKK3ZvaWQgZmlsZV9tYWluKHZvaWQpCit7CisgIGNoYXIgKiphcmc7CisKKyAgZm9yIChhcmcgPSB0b3lzLm9wdGFyZ3M7ICphcmc7ICsrYXJnKSB7CisgICAgaW50IG5hbWVfbGVuID0gc3RybGVuKCphcmcpOworCisgICAgaWYgKG5hbWVfbGVuID4gVFQubWF4X25hbWVfbGVuKSBUVC5tYXhfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKyAgfQorCisgIC8vIENhbid0IHVzZSBsb29wZmlsZXMgaGVyZSBiZWNhdXNlIGl0IGRvZXNuJ3QgY2FsbCBmdW5jdGlvbiB3aGVuIGNhbid0IG9wZW4KKyAgZm9yIChhcmcgPSB0b3lzLm9wdGFyZ3M7ICphcmc7IGFyZysrKSB7CisgICAgc3RydWN0IHN0YXQgc2I7CisgICAgY2hhciAqbmFtZSA9ICphcmcsICp3aGF0ID0gImNhbm5vdCBvcGVuIjsKKworICAgIHhwcmludGYoIiVzOiAlKnMiLCBuYW1lLCAoaW50KShUVC5tYXhfbmFtZV9sZW4gLSBzdHJsZW4obmFtZSkpLCAiIik7CisKKyAgICBpZiAoIWxzdGF0KG5hbWUsICZzYikpIHsKKyAgICAgIGlmIChTX0lTRklGTyhzYi5zdF9tb2RlKSkgd2hhdCA9ICJmaWZvIjsKKyAgICAgIGVsc2UgaWYgKFNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKyAgICAgICAgaW50IGZkID0gIXN0cmNtcChuYW1lLCAiLSIpID8gMCA6IG9wZW4obmFtZSwgT19SRE9OTFkpOworCisgICAgICAgIGlmIChmZCE9LTEpIHsKKyAgICAgICAgICBpZiAoIXNiLnN0X3NpemUpIHdoYXQgPSAiZW1wdHkiOworICAgICAgICAgIGVsc2UgZG9fcmVndWxhcl9maWxlKGZkLCBuYW1lLCAmc2IpOworICAgICAgICAgIGlmIChmZCkgY2xvc2UoZmQpOworICAgICAgICAgIGlmIChzYi5zdF9zaXplKSBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChTX0lTQkxLKHNiLnN0X21vZGUpKSB3aGF0ID0gImJsb2NrIHNwZWNpYWwiOworICAgICAgZWxzZSBpZiAoU19JU0NIUihzYi5zdF9tb2RlKSkgd2hhdCA9ICJjaGFyYWN0ZXIgc3BlY2lhbCI7CisgICAgICBlbHNlIGlmIChTX0lTRElSKHNiLnN0X21vZGUpKSB3aGF0ID0gImRpcmVjdG9yeSI7CisgICAgICBlbHNlIGlmIChTX0lTU09DSyhzYi5zdF9tb2RlKSkgd2hhdCA9ICJzb2NrZXQiOworICAgICAgZWxzZSBpZiAoU19JU0xOSyhzYi5zdF9tb2RlKSkgd2hhdCA9ICJzeW1ib2xpYyBsaW5rIjsKKyAgICAgIGVsc2Ugd2hhdCA9ICJ1bmtub3duIjsKKyAgICB9CisKKyAgICB4cHV0cyh3aGF0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZmluZC5jIGIvdG95Ym94L3RveXMvcG9zaXgvZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZmMxNDEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9maW5kLmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qIGZpbmQuYyAtIFNlYXJjaCBkaXJlY3RvcmllcyBmb3IgbWF0Y2hpbmcgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTQgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2ZpbmQuYworICoKKyAqIE91ciAidW5zcGVjaWZpZWQiIGJlaGF2aW9yIGZvciBubyBwYXRocyBpcyB0byB1c2UgIi4iCisgKiBQYXJlbnRoZXNlcyBjYW4gb25seSBzdGFjayA0MDk2IGRlZXAKKyAqIE5vdCB0cmVhdGluZyB0d28ge30gYXMgYW4gZXJyb3IsIGJ1dCBvbmx5IHVzaW5nIGxhc3QKKyAqCisgKiBUT0RPOiAtZW1wdHkgKGRpcnMgdG9vISkKKworVVNFX0ZJTkQoTkVXVE9ZKGZpbmQsICI/XkhMWy1ITF0iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBGSU5ECisgIGJvb2wgImZpbmQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGZpbmQgWy1ITF0gW0RJUi4uLl0gWzxvcHRpb25zPl0KKworICAgIFNlYXJjaCBkaXJlY3RvcmllcyBmb3IgbWF0Y2hpbmcgZmlsZXMuCisgICAgRGVmYXVsdDogc2VhcmNoICIuIiBtYXRjaCBhbGwgLXByaW50IGFsbCBtYXRjaGVzLgorCisgICAgLUggIEZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MgICAgICAgICAtTCAgRm9sbG93IGFsbCBzeW1saW5rcworCisgICAgTWF0Y2ggZmlsdGVyczoKKyAgICAtbmFtZSAgUEFUVEVSTiAgZmlsZW5hbWUgd2l0aCB3aWxkY2FyZHMgICAtaW5hbWUgICAgICBjYXNlIGluc2Vuc2l0aXZlIC1uYW1lCisgICAgLXBhdGggIFBBVFRFUk4gIHBhdGggbmFtZSB3aXRoIHdpbGRjYXJkcyAgLWlwYXRoICAgICAgY2FzZSBpbnNlbnNpdGl2ZSAtcGF0aAorICAgIC11c2VyICBVTkFNRSAgICBiZWxvbmdzIHRvIHVzZXIgVU5BTUUgICAgIC1ub3VzZXIgICAgIHVzZXIgSUQgbm90IGtub3duCisgICAgLWdyb3VwIEdST1VQICAgIGJlbG9uZ3MgdG8gZ3JvdXAgR1JPVVAgICAgLW5vZ3JvdXAgICAgZ3JvdXAgSUQgbm90IGtub3duCisgICAgLXBlcm0gIFstL11NT0RFIHBlcm1pc3Npb25zICgtPW1pbiAvPWFueSkgLXBydW5lICAgICAgaWdub3JlIGNvbnRlbnRzIG9mIGRpcgorICAgIC1zaXplICBOW2NdICAgICA1MTIgYnl0ZSBibG9ja3MgKGM9Ynl0ZXMpIC14ZGV2ICAgICAgIG9ubHkgdGhpcyBmaWxlc3lzdGVtCisgICAgLWxpbmtzIE4gICAgICAgIGhhcmRsaW5rIGNvdW50ICAgICAgICAgICAgLWF0aW1lIE4gICAgYWNjZXNzZWQgTiBkYXlzIGFnbworICAgIC1jdGltZSBOICAgICAgICBjcmVhdGVkIE4gZGF5cyBhZ28gICAgICAgIC1tdGltZSBOICAgIG1vZGlmaWVkIE4gZGF5cyBhZ28KKyAgICAtbmV3ZXIgRklMRSAgICAgbmV3ZXIgbXRpbWUgdGhhbiBGSUxFICAgICAtbWluZGVwdGggIyBhdCBsZWFzdCAjIGRpcnMgZG93bgorICAgIC1kZXB0aCAgICAgICAgICBpZ25vcmUgY29udGVudHMgb2YgZGlyICAgIC1tYXhkZXB0aCAjIGF0IG1vc3QgIyBkaXJzIGRvd24KKyAgICAtaW51bSAgTiAgICAgICAgaW5vZGUgbnVtYmVyIE4gICAgICAgICAgICAtZW1wdHkgICAgICBlbXB0eSBmaWxlcyBhbmQgZGlycworICAgIC10eXBlIFtiY2RmbHBzXSAoYmxvY2ssIGNoYXIsIGRpciwgZmlsZSwgc3ltbGluaywgcGlwZSwgc29ja2V0KQorCisgICAgTnVtYmVycyBOIG1heSBiZSBwcmVmaXhlZCBieSBhIC0gKGxlc3MgdGhhbikgb3IgKyAoZ3JlYXRlciB0aGFuKToKKworICAgIENvbWJpbmUgbWF0Y2hlcyB3aXRoOgorICAgICEsIC1hLCAtbywgKCApICAgIG5vdCwgYW5kLCBvciwgZ3JvdXAgZXhwcmVzc2lvbnMKKworICAgIEFjdGlvbnM6CisgICAgLXByaW50ICAgUHJpbnQgbWF0Y2ggd2l0aCBuZXdsaW5lICAtcHJpbnQwICAgIFByaW50IG1hdGNoIHdpdGggbnVsbAorICAgIC1leGVjICAgIFJ1biBjb21tYW5kIHdpdGggcGF0aCAgICAgLWV4ZWNkaXIgICBSdW4gY29tbWFuZCBpbiBmaWxlJ3MgZGlyCisgICAgLW9rICAgICAgQXNrIGJlZm9yZSBleGVjICAgICAgICAgICAtb2tkaXIgICAgIEFzayBiZWZvcmUgZXhlY2RpcgorICAgIC1kZWxldGUgIFJlbW92ZSBtYXRjaGluZyBmaWxlL2RpcgorCisgICAgQ29tbWFuZHMgc3Vic3RpdHV0ZSAie30iIHdpdGggbWF0Y2hlZCBmaWxlLiBFbmQgd2l0aCAiOyIgdG8gcnVuIGVhY2ggZmlsZSwKKyAgICBvciAiKyIgKG5leHQgYXJndW1lbnQgYWZ0ZXIgInt9IikgdG8gY29sbGVjdCBhbmQgcnVuIHdpdGggbXVsdGlwbGUgZmlsZXMuCisqLworCisjZGVmaW5lIEZPUl9maW5kCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICoqZmlsdGVyOworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmFyZ2RhdGE7CisgIGludCB0b3BkaXIsIHhkZXYsIGRlcHRoOworICB0aW1lX3Qgbm93OworKQorCitzdHJ1Y3QgZXhlY2Rpcl9kYXRhIHsKKyAgc3RydWN0IGV4ZWNkaXJfZGF0YSAqbmV4dDsKKworICBpbnQgbmFtZWNvdW50OworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKm5hbWVzOworfTsKKworLy8gTm9uZSBvZiB0aGlzIGNhbiBnbyBpbiBUVCBiZWNhdXNlIHlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIC1leGVjCitzdHJ1Y3QgZXhlY19yYW5nZSB7CisgIGNoYXIgKm5leHQsICpwcmV2OyAgLy8gbGF5b3V0IGNvbXBhdGlibGUgd2l0aCBzdHJ1Y3QgZG91YmxlX2xpc3QKKworICBpbnQgZGlyLCBwbHVzLCBhcmdsZW4sIGFyZ3NpemUsIGN1cmx5OworICBjaGFyICoqYXJnc3RhcnQ7CisgIHN0cnVjdCBleGVjZGlyX2RhdGEgZXhlYywgKmV4ZWNkaXI7Cit9OworCisvLyBQZXJmb3JtIHBlbmRpbmcgLWV4ZWMgKGlmIGFueSkKK3N0YXRpYyBpbnQgZmx1c2hfZXhlYyhzdHJ1Y3QgZGlydHJlZSAqbmV3LCBzdHJ1Y3QgZXhlY19yYW5nZSAqYWEpCit7CisgIHN0cnVjdCBleGVjZGlyX2RhdGEgKmJiID0gYWEtPmV4ZWNkaXIgPyBhYS0+ZXhlY2RpciA6ICZhYS0+ZXhlYzsKKyAgY2hhciAqKm5ld2FyZ3M7CisgIGludCByYywgcmV2ZXJ0ID0gMDsKKworICBpZiAoIWJiLT5uYW1lY291bnQpIHJldHVybiAwOworCisgIGRsaXN0X3Rlcm1pbmF0ZShiYi0+bmFtZXMpOworCisgIC8vIHN3aXRjaCB0byBkaXJlY3RvcnkgZm9yIC1leGVjZGlyLCBvciBiYWNrIHRvIHRvcCBpZiB3ZSBoYXZlIGFuIC1leGVjZGlyCisgIC8vIF9hbmRfIGEgbm9ybWFsIC1leGVjLCBvciBhcmUgYXQgdG9wIG9mIHRyZWUgaW4gLWV4ZWNkaXIKKyAgaWYgKFRULnRvcGRpciAhPSAtMSkgeworICAgIGlmIChhYS0+ZGlyICYmIG5ldyAmJiBuZXctPnBhcmVudCkgeworICAgICAgcmV2ZXJ0Kys7CisgICAgICByYyA9IGZjaGRpcihuZXctPnBhcmVudC0+ZGlyZmQpOworICAgIH0gZWxzZSByYyA9IGZjaGRpcihUVC50b3BkaXIpOworICAgIGlmIChyYykgeworICAgICAgcGVycm9yX21zZ19yYXcocmV2ZXJ0ID8gbmV3LT5uYW1lIDogIi4iKTsKKworICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgfQorCisgIC8vIGV4ZWNkaXI6IGFjY3VtdWxhdGVkIGV4ZWNzIGluIHRoaXMgZGlyZWN0b3J5J3MgY2hpbGRyZW4uCisgIG5ld2FyZ3MgPSB4bWFsbG9jKHNpemVvZihjaGFyICopKihhYS0+YXJnbGVuK2JiLT5uYW1lY291bnQrMSkpOworICBpZiAoYWEtPmN1cmx5IDwgMCkgeworICAgIG1lbWNweShuZXdhcmdzLCBhYS0+YXJnc3RhcnQsIHNpemVvZihjaGFyICopKmFhLT5hcmdsZW4pOworICAgIG5ld2FyZ3NbYWEtPmFyZ2xlbl0gPSAwOworICB9IGVsc2UgeworICAgIGludCBwb3MgPSBhYS0+Y3VybHksIHJlc3QgPSBhYS0+YXJnbGVuIC0gYWEtPmN1cmx5OworICAgIHN0cnVjdCBkb3VibGVfbGlzdCAqZGw7CisKKyAgICAvLyBDb2xsYXRlIGFyZ3VtZW50IGxpc3QKKyAgICBtZW1jcHkobmV3YXJncywgYWEtPmFyZ3N0YXJ0LCBzaXplb2YoY2hhciAqKSpwb3MpOworICAgIGZvciAoZGwgPSBiYi0+bmFtZXM7IGRsOyBkbCA9IGRsLT5uZXh0KSBuZXdhcmdzW3BvcysrXSA9IGRsLT5kYXRhOworICAgIHJlc3QgPSBhYS0+YXJnbGVuIC0gYWEtPmN1cmx5IC0gMTsKKyAgICBtZW1jcHkobmV3YXJncytwb3MsIGFhLT5hcmdzdGFydCthYS0+Y3VybHkrMSwgc2l6ZW9mKGNoYXIgKikqcmVzdCk7CisgICAgbmV3YXJnc1twb3MrcmVzdF0gPSAwOworICB9CisKKyAgcmMgPSB4cnVuKG5ld2FyZ3MpOworCisgIGxsaXN0X3RyYXZlcnNlKGJiLT5uYW1lcywgbGxpc3RfZnJlZV9kb3VibGUpOworICBiYi0+bmFtZXMgPSAwOworICBiYi0+bmFtZWNvdW50ID0gMDsKKworICBpZiAocmV2ZXJ0KSByZXZlcnQgPSBmY2hkaXIoVFQudG9wZGlyKTsKKworICByZXR1cm4gcmM7Cit9CisKKy8vIFJldHVybiBudW1lcmljIHZhbHVlIHdpdGggZXhwbGljaXQgc2lnbgorc3RhdGljIGludCBjb21wYXJlX251bXNpZ24obG9uZyB2YWwsIGxvbmcgdW5pdHMsIGNoYXIgKnN0cikKK3sKKyAgY2hhciBzaWduID0gMDsKKyAgbG9uZyBteXZhbDsKKworICBpZiAoKnN0ciA9PSAnKycgfHwgKnN0ciA9PSAnLScpIHNpZ24gPSAqKHN0cisrKTsKKyAgZWxzZSBpZiAoIWlzZGlnaXQoKnN0cikpIGVycm9yX2V4aXQoIiVzIG5vdCBbKy1dTiIsIHN0cik7CisgIG15dmFsID0gYXRvbHgoc3RyKTsKKyAgaWYgKHVuaXRzICYmIGlzZGlnaXQoc3RyW3N0cmxlbihzdHIpLTFdKSkgbXl2YWwgKj0gdW5pdHM7CisKKyAgaWYgKHNpZ24gPT0gJysnKSByZXR1cm4gdmFsID4gbXl2YWw7CisgIGlmIChzaWduID09ICctJykgcmV0dXJuIHZhbCA8IG15dmFsOworICByZXR1cm4gdmFsID09IG15dmFsOworfQorCitzdGF0aWMgdm9pZCBkb19wcmludChzdHJ1Y3QgZGlydHJlZSAqbmV3LCBjaGFyIGMpCit7CisgIGNoYXIgKnM9ZGlydHJlZV9wYXRoKG5ldywgMCk7CisKKyAgeHByaW50ZigiJXMlYyIsIHMsIGMpOworICBmcmVlKHMpOworfQorCisvLyBEZXNjZW5kIG9yIGFzY2VuZCAtZXhlY2RpciArIGRpcmVjdG9yeSBsZXZlbAorc3RhdGljIHZvaWQgZXhlY2RpcihzdHJ1Y3QgZGlydHJlZSAqbmV3LCBpbnQgZmx1c2gpCit7CisgIHN0cnVjdCBkb3VibGVfbGlzdCAqZGw7CisgIHN0cnVjdCBleGVjX3JhbmdlICphYTsKKyAgc3RydWN0IGV4ZWNkaXJfZGF0YSAqYmI7CisKKyAgaWYgKG5ldyAmJiBUVC50b3BkaXIgPT0gLTEpIHJldHVybjsKKworICBmb3IgKGRsID0gVFQuYXJnZGF0YTsgZGw7IGRsID0gZGwtPm5leHQpIHsKKyAgICBpZiAoZGwtPnByZXYgIT0gKHZvaWQgKikxKSBjb250aW51ZTsKKyAgICBhYSA9ICh2b2lkICopZGw7CisgICAgaWYgKCFhYS0+cGx1cyB8fCAobmV3ICYmICFhYS0+ZGlyKSkgY29udGludWU7CisKKyAgICBpZiAoZmx1c2gpIHsKKworICAgICAgLy8gRmx1c2ggcGVuZGluZyAiLWV4ZWNkaXIgKyIgaW5zdGFuY2VzIGZvciB0aGlzIGRpcgorICAgICAgLy8gb3IgZmx1c2ggZXZlcnl0aGluZyBmb3IgLWV4ZWMgYXQgdG9wCisgICAgICB0b3lzLmV4aXR2YWwgfD0gZmx1c2hfZXhlYyhuZXcsIGFhKTsKKworICAgICAgLy8gcG9wIHBlci1kaXJlY3Rvcnkgc3RydWN0CisgICAgICBpZiAoKGJiID0gYWEtPmV4ZWNkaXIpKSB7CisgICAgICAgIGFhLT5leGVjZGlyID0gYmItPm5leHQ7CisgICAgICAgIGZyZWUoYmIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYWEtPmRpcikgeworCisgICAgICAvLyBQdXNoIG5ldyBwZXItZGlyZWN0b3J5IHN0cnVjdCBmb3IgLWV4ZWNkaXIvb2tkaXIgKyBjb2RlcGF0aC4gKENhbid0CisgICAgICAvLyB1c2UgbmV3LT5leHRyYSBiZWNhdXNlIGNvbW1hbmQgbGluZSBtYXkgaGF2ZSBtdWx0aXBsZSAtZXhlY2RpcikKKyAgICAgIGJiID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGV4ZWNkaXJfZGF0YSkpOworICAgICAgYmItPm5leHQgPSBhYS0+ZXhlY2RpcjsKKyAgICAgIGFhLT5leGVjZGlyID0gYmI7CisgICAgfQorICB9Cit9IAorCisvLyBDYWxsIHRoaXMgd2l0aCAwIGZvciBmaXJzdCBwYXNzIGFyZ3VtZW50IHBhcnNpbmcgYW5kIHN5bnRheCBjaGVja2luZyAod2hpY2gKKy8vIHBvcHVsYXRlcyBhcmdkYXRhKS4gTGF0ZXIgY29tbWFuZHMgdHJhdmVyc2UgYXJnZGF0YSAoaW4gb3JkZXIpIHdoZW4gdGhleQorLy8gbmVlZCAiZG8gb25jZSIgcmVzdWx0cy4KK3N0YXRpYyBpbnQgZG9fZmluZChzdHJ1Y3QgZGlydHJlZSAqbmV3KQoreworICBpbnQgcGNvdW50ID0gMCwgcHJpbnQgPSAwLCBub3QgPSAwLCBhY3RpdmUgPSAhIW5ldywgdGVzdCA9IGFjdGl2ZSwgcmVjdXJzZTsKKyAgc3RydWN0IGRvdWJsZV9saXN0ICphcmdkYXRhID0gVFQuYXJnZGF0YTsKKyAgY2hhciAqcywgKipzczsKKworICByZWN1cnNlID0gRElSVFJFRV9DT01FQUdBSU58KERJUlRSRUVfU1lNRk9MTE9XKiEhKHRveXMub3B0ZmxhZ3MmRkxBR19MKSk7CisKKyAgLy8gc2tpcCAuIGFuZCAuLiBiZWxvdyB0b3BkaXIsIGhhbmRsZSAteGRldiBhbmQgLWRlcHRoCisgIGlmIChuZXcpIHsKKyAgICBpZiAobmV3LT5wYXJlbnQpIHsKKyAgICAgIGlmICghZGlydHJlZV9ub3Rkb3Rkb3QobmV3KSkgcmV0dXJuIDA7CisgICAgICBpZiAoVFQueGRldiAmJiBuZXctPnN0LnN0X2RldiAhPSBuZXctPnBhcmVudC0+c3Quc3RfZGV2KSByZWN1cnNlID0gMDsKKyAgICB9CisKKyAgICBpZiAoU19JU0RJUihuZXctPnN0LnN0X21vZGUpKSB7CisgICAgICAvLyBEZXNjZW5kaW5nIGludG8gbmV3IGRpcmVjdG9yeQorICAgICAgaWYgKCFuZXctPmFnYWluKSB7CisgICAgICAgIHN0cnVjdCBkaXJ0cmVlICpuOworCisgICAgICAgIGZvciAobiA9IG5ldy0+cGFyZW50OyBuOyBuID0gbi0+cGFyZW50KSB7CisgICAgICAgICAgaWYgKG4tPnN0LnN0X2lubz09bmV3LT5zdC5zdF9pbm8gJiYgbi0+c3Quc3RfZGV2PT1uZXctPnN0LnN0X2RldikgeworICAgICAgICAgICAgZXJyb3JfbXNnKCInJXMnOiBsb29wIGRldGVjdGVkIiwgcyA9IGRpcnRyZWVfcGF0aChuZXcsIDApKTsKKyAgICAgICAgICAgIGZyZWUocyk7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUVC5kZXB0aCkgeworICAgICAgICAgIGV4ZWNkaXIobmV3LCAwKTsKKworICAgICAgICAgIHJldHVybiByZWN1cnNlOworICAgICAgICB9CisgICAgICAvLyBEb25lIHdpdGggZGlyZWN0b3J5IChDT01FQUdBSU4gY2FsbCkKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4ZWNkaXIobmV3LCAxKTsKKyAgICAgICAgcmVjdXJzZSA9IDA7CisgICAgICAgIGlmICghVFQuZGVwdGgpIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHBjb3VudDogcGFyZW50aGVzZXMgc3RhY2sgZGVwdGggKHVzaW5nIHRveWJ1ZiBieXRlcywgNDA5NiBtYXggZGVwdGgpCisgIC8vIHRlc3Q6IHJlc3VsdCBvZiBtb3N0IHJlY2VudCB0ZXN0CisgIC8vIGFjdGl2ZTogaWYgMCBkb24ndCBwZXJmb3JtIHRlc3RzCisgIC8vIG5vdDogYSBwZW5kaW5nICEgYXBwbGllcyB0byB0aGlzIHRlc3QgKG9ubHkgc2V0IGlmIHBlcmZvcm1pbmcgdGVzdHMpCisgIC8vIHByaW50OiBzYXcgb25lIG9mIHByaW50L29rL2V4ZWMsIG5vIG5lZWQgZm9yIGRlZmF1bHQgLXByaW50CisKKyAgaWYgKFRULmZpbHRlcikgZm9yIChzcyA9IFRULmZpbHRlcjsgKnNzOyBzcysrKSB7CisgICAgaW50IGNoZWNrID0gYWN0aXZlICYmIHRlc3Q7CisKKyAgICBzID0gKnNzOworCisgICAgLy8gaGFuZGxlICEgKCApIHVzaW5nIHRveWJ1ZiBhcyBhIHN0YWNrCisgICAgaWYgKCpzICE9ICctJykgeworICAgICAgaWYgKHNbMV0pIGdvdG8gZXJyb3I7CisKKyAgICAgIGlmICgqcyA9PSAnIScpIHsKKyAgICAgICAgLy8gRG9uJ3QgaW52ZXJ0IGlmIHdlJ3JlIG5vdCBtYWtpbmcgYSBkZWNpc2lvbgorICAgICAgICBpZiAoY2hlY2spIG5vdCA9ICFub3Q7CisKKyAgICAgIC8vIFNhdmUgb2xkICJub3QiIGFuZCAiYWN0aXZlIiBvbiB0b3lidWYgc3RhY2suCisgICAgICAvLyBEZWFjdGl2YXRlIHRoaXMgcGFyZW50aGV0aWNhbCBpZiAhdGVzdAorICAgICAgLy8gTm90ZTogdGVzdCB2YWx1ZSBzaG91bGQgbmV2ZXIgY2hhbmdlIHdoaWxlICFhY3RpdmUKKyAgICAgIH0gZWxzZSBpZiAoKnMgPT0gJygnKSB7CisgICAgICAgIGlmIChwY291bnQgPT0gc2l6ZW9mKHRveWJ1ZikpIGdvdG8gZXJyb3I7CisgICAgICAgIHRveWJ1ZltwY291bnQrK10gPSBub3QrKGFjdGl2ZTw8MSk7CisgICAgICAgIGlmICghY2hlY2spIGFjdGl2ZSA9IDA7CisgICAgICAgIG5vdCA9IDA7CisKKyAgICAgIC8vIFBvcCBzdGF0dXMsIGFwcGx5IGRlZmVycmVkIG5vdCB0byB0ZXN0CisgICAgICB9IGVsc2UgaWYgKCpzID09ICcpJykgeworICAgICAgICBpZiAoLS1wY291bnQgPCAwKSBnb3RvIGVycm9yOworICAgICAgICAvLyBQb3AgYWN0aXZlIHN0YXRlLCBhcHBseSBkZWZlcnJlZCBub3QgKHdoaWNoIHdhcyBvbmx5IHNldCBpZiBjaGVja2luZykKKyAgICAgICAgYWN0aXZlID0gKHRveWJ1ZltwY291bnRdPj4xKSYxOworICAgICAgICBpZiAoYWN0aXZlICYmICh0b3lidWZbcGNvdW50XSYxKSkgdGVzdCA9ICF0ZXN0OworICAgICAgICBub3QgPSAwOworICAgICAgfSBlbHNlIGdvdG8gZXJyb3I7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSBzKys7CisKKyAgICBpZiAoIXN0cmNtcChzLCAieGRldiIpKSBUVC54ZGV2ID0gMTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMsICJkZWxldGUiKSkgeworICAgICAgLy8gRGVsZXRlIGZvcmNlcyBkZXB0aCBmaXJzdAorICAgICAgVFQuZGVwdGggPSAxOworICAgICAgaWYgKG5ldyAmJiBjaGVjaykKKyAgICAgICAgdGVzdCA9ICF1bmxpbmthdChkaXJ0cmVlX3BhcmVudGZkKG5ldyksIG5ldy0+bmFtZSwKKyAgICAgICAgICBTX0lTRElSKG5ldy0+c3Quc3RfbW9kZSkgPyBBVF9SRU1PVkVESVIgOiAwKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAocywgImRlcHRoIikpIFRULmRlcHRoID0gMTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMsICJvIikgfHwgIXN0cmNtcChzLCAib3IiKSkgeworICAgICAgaWYgKG5vdCkgZ290byBlcnJvcjsKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgaWYgKCF0ZXN0KSB0ZXN0ID0gMTsKKyAgICAgICAgZWxzZSBhY3RpdmUgPSAwOyAgICAgLy8gZGVjaXNpb24gaGFzIGJlZW4gbWFkZSB1bnRpbCBuZXh0ICIpIgorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAibm90IikpIHsKKyAgICAgIGlmIChjaGVjaykgbm90ID0gIW5vdDsKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIE1vc3RseSBpZ25vcmUgTk9QIGFyZ3VtZW50CisgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJhIikgfHwgIXN0cmNtcChzLCAiYW5kIikgfHwgIXN0cmNtcChzLCAibm9sZWFmIikpIHsKKyAgICAgIGlmIChub3QpIGdvdG8gZXJyb3I7CisKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAocywgInByaW50IikgfHwgIXN0cmNtcCgicHJpbnQwIiwgcykpIHsKKyAgICAgIHByaW50Kys7CisgICAgICBpZiAoY2hlY2spIGRvX3ByaW50KG5ldywgc1s1XSA/IDAgOiAnXG4nKTsKKworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAibm91c2VyIikpIHsKKyAgICAgIGlmIChjaGVjaykgaWYgKGJ1ZmdldHB3dWlkKG5ldy0+c3Quc3RfdWlkKSkgdGVzdCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJub2dyb3VwIikpIHsKKyAgICAgIGlmIChjaGVjaykgaWYgKGJ1ZmdldGdyZ2lkKG5ldy0+c3Quc3RfZ2lkKSkgdGVzdCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJwcnVuZSIpKSB7CisgICAgICBpZiAoY2hlY2sgJiYgU19JU0RJUihuZXctPnN0LnN0X21vZGUpICYmICFUVC5kZXB0aCkgcmVjdXJzZSA9IDA7CisKKyAgICAvLyBSZW1haW5pbmcgZmlsdGVycyB0YWtlIGFuIGFyZ3VtZW50CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghc3RyY21wKHMsICJuYW1lIikgfHwgIXN0cmNtcChzLCAiaW5hbWUiKQorICAgICAgICB8fCAhc3RyY21wKHMsICJwYXRoIikgfHwgIXN0cmNtcChzLCAiaXBhdGgiKSkKKyAgICAgIHsKKyAgICAgICAgaW50IGkgPSAoKnMgPT0gJ2knKTsKKyAgICAgICAgY2hhciAqYXJnID0gc3NbMV0sICpwYXRoID0gMCwgKm5hbWUgPSBuZXcgPyBuZXctPm5hbWUgOiBhcmc7CisKKyAgICAgICAgLy8gSGFuZGxlIHBhdGggZXhwYW5zaW9uIGFuZCBjYXNlIGZsYXR0ZW5pbmcKKyAgICAgICAgaWYgKG5ldyAmJiBzW2ldID09ICdwJykgbmFtZSA9IHBhdGggPSBkaXJ0cmVlX3BhdGgobmV3LCAwKTsKKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICBpZiAoKGNoZWNrIHx8ICFuZXcpICYmIG5hbWUpIG5hbWUgPSBzdHJsb3dlcihuYW1lKTsKKyAgICAgICAgICBpZiAoIW5ldykgZGxpc3RfYWRkKCZUVC5hcmdkYXRhLCBuYW1lKTsKKyAgICAgICAgICBlbHNlIGFyZyA9ICgoc3RydWN0IGRvdWJsZV9saXN0ICopbGxpc3RfcG9wKCZhcmdkYXRhKSktPmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hlY2spIHsKKyAgICAgICAgICB0ZXN0ID0gIWZubWF0Y2goYXJnLCBuYW1lLCBGTk1fUEFUSE5BTUUqKHNbaV0gPT0gJ3AnKSk7CisgICAgICAgICAgaWYgKGkpIGZyZWUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwYXRoKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAicGVybSIpKSB7CisgICAgICAgIGlmIChjaGVjaykgeworICAgICAgICAgIGNoYXIgKm0gPSBzc1sxXTsKKyAgICAgICAgICBpbnQgbWF0Y2hfbWluID0gKm0gPT0gJy0nLAorICAgICAgICAgICAgICBtYXRjaF9hbnkgPSAqbSA9PSAnLyc7CisgICAgICAgICAgbW9kZV90IG0xID0gc3RyaW5nX3RvX21vZGUobSsobWF0Y2hfbWluIHx8IG1hdGNoX2FueSksIDApLAorICAgICAgICAgICAgICAgICBtMiA9IG5ldy0+c3Quc3RfbW9kZSAmIDA3Nzc3OworCisgICAgICAgICAgaWYgKG1hdGNoX21pbiB8fCBtYXRjaF9hbnkpIG0yICY9IG0xOworICAgICAgICAgIHRlc3QgPSBtYXRjaF9hbnkgPyAhbTEgfHwgbTIgOiBtMSA9PSBtMjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJ0eXBlIikpIHsKKyAgICAgICAgaWYgKGNoZWNrKSB7CisgICAgICAgICAgaW50IHR5cGVzW10gPSB7U19JRkJMSywgU19JRkNIUiwgU19JRkRJUiwgU19JRkxOSywgU19JRklGTywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTX0lGUkVHLCBTX0lGU09DS30sIGkgPSBzdHJpZHgoImJjZGxwZnMiLCAqc3NbMV0pOworCisgICAgICAgICAgaWYgKGk8MCkgZXJyb3JfZXhpdCgiYmFkIC10eXBlICclYyciLCAqc3NbMV0pOworICAgICAgICAgIGlmICgobmV3LT5zdC5zdF9tb2RlICYgU19JRk1UKSAhPSB0eXBlc1tpXSkgdGVzdCA9IDA7CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJhdGltZSIpKSB7CisgICAgICAgIGlmIChjaGVjaykKKyAgICAgICAgICB0ZXN0ID0gY29tcGFyZV9udW1zaWduKFRULm5vdyAtIG5ldy0+c3Quc3RfYXRpbWUsIDg2NDAwLCBzc1sxXSk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocywgImN0aW1lIikpIHsKKyAgICAgICAgaWYgKGNoZWNrKQorICAgICAgICAgIHRlc3QgPSBjb21wYXJlX251bXNpZ24oVFQubm93IC0gbmV3LT5zdC5zdF9jdGltZSwgODY0MDAsIHNzWzFdKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAibXRpbWUiKSkgeworICAgICAgICBpZiAoY2hlY2spCisgICAgICAgICAgdGVzdCA9IGNvbXBhcmVfbnVtc2lnbihUVC5ub3cgLSBuZXctPnN0LnN0X210aW1lLCA4NjQwMCwgc3NbMV0pOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJzaXplIikpIHsKKyAgICAgICAgaWYgKGNoZWNrKQorICAgICAgICAgIHRlc3QgPSBjb21wYXJlX251bXNpZ24obmV3LT5zdC5zdF9zaXplLCA1MTIsIHNzWzFdKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAibGlua3MiKSkgeworICAgICAgICBpZiAoY2hlY2spIHRlc3QgPSBjb21wYXJlX251bXNpZ24obmV3LT5zdC5zdF9ubGluaywgMCwgc3NbMV0pOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJpbnVtIikpIHsKKyAgICAgICAgaWYgKGNoZWNrKQorICAgICAgICAgIHRlc3QgPSBjb21wYXJlX251bXNpZ24obmV3LT5zdC5zdF9pbm8sIDAsIHNzWzFdKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzLCAibWluZGVwdGgiKSB8fCAhc3RyY21wKHMsICJtYXhkZXB0aCIpKSB7CisgICAgICAgIGlmIChjaGVjaykgeworICAgICAgICAgIHN0cnVjdCBkaXJ0cmVlICpkdCA9IG5ldzsKKyAgICAgICAgICBpbnQgaSA9IDAsIGQgPSBhdG9seChzc1sxXSk7CisKKyAgICAgICAgICB3aGlsZSAoKGR0ID0gZHQtPnBhcmVudCkpIGkrKzsKKyAgICAgICAgICBpZiAoc1sxXSA9PSAnaScpIHsKKyAgICAgICAgICAgIHRlc3QgPSBpID49IGQ7CisgICAgICAgICAgICBpZiAoaSA9PSBkICYmIG5vdCkgcmVjdXJzZSA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRlc3QgPSBpIDw9IGQ7CisgICAgICAgICAgICBpZiAoaSA9PSBkICYmICFub3QpIHJlY3Vyc2UgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJ1c2VyIikgfHwgIXN0cmNtcChzLCAiZ3JvdXAiKQorICAgICAgICAgICAgICB8fCAhc3RyY21wKHMsICJuZXdlciIpKQorICAgICAgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgIHZvaWQgKm5leHQsICpwcmV2OworICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIHVpZF90IHVpZDsKKyAgICAgICAgICAgIGdpZF90IGdpZDsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0bTsKKyAgICAgICAgICB9IHU7CisgICAgICAgIH0gKnVkbDsKKworICAgICAgICBpZiAoIW5ldykgeworICAgICAgICAgIGlmIChzc1sxXSkgeworICAgICAgICAgICAgdWRsID0geG1hbGxvYyhzaXplb2YoKnVkbCkpOworICAgICAgICAgICAgZGxpc3RfYWRkX25vbWFsbG9jKCZUVC5hcmdkYXRhLCAodm9pZCAqKXVkbCk7CisKKyAgICAgICAgICAgIGlmICgqcyA9PSAndScpIHVkbC0+dS51aWQgPSB4Z2V0dWlkKHNzWzFdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpzID09ICdnJykgdWRsLT51LmdpZCA9IHhnZXRnaWQoc3NbMV0pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgICAgICAgICAgIHhzdGF0KHNzWzFdLCAmc3QpOworICAgICAgICAgICAgICB1ZGwtPnUudG0gPSBzdC5zdF9tdGltOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1ZGwgPSAodm9pZCAqKWxsaXN0X3BvcCgmYXJnZGF0YSk7CisgICAgICAgICAgaWYgKGNoZWNrKSB7CisgICAgICAgICAgICBpZiAoKnMgPT0gJ3UnKSB0ZXN0ID0gbmV3LT5zdC5zdF91aWQgPT0gdWRsLT51LnVpZDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpzID09ICdnJykgdGVzdCA9IG5ldy0+c3Quc3RfZ2lkID09IHVkbC0+dS5naWQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgdGVzdCA9IG5ldy0+c3Quc3RfbXRpbS50dl9zZWMgPiB1ZGwtPnUudG0udHZfc2VjOworICAgICAgICAgICAgICBpZiAobmV3LT5zdC5zdF9tdGltLnR2X3NlYyA9PSB1ZGwtPnUudG0udHZfc2VjKQorICAgICAgICAgICAgICAgIHRlc3QgPSBuZXctPnN0LnN0X210aW0udHZfbnNlYyA+IHVkbC0+dS50bS50dl9uc2VjOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghc3RyY21wKHMsICJleGVjIikgfHwgIXN0cmNtcCgib2siLCBzKQorICAgICAgICAgICAgICB8fCAhc3RyY21wKHMsICJleGVjZGlyIikgfHwgIXN0cmNtcChzLCAib2tkaXIiKSkKKyAgICAgIHsKKyAgICAgICAgc3RydWN0IGV4ZWNfcmFuZ2UgKmFhOworCisgICAgICAgIHByaW50Kys7CisKKyAgICAgICAgLy8gSW5pdGlhbCBhcmd1bWVudCBwYXJzaW5nIHBhc3MKKyAgICAgICAgaWYgKCFuZXcpIHsKKyAgICAgICAgICBpbnQgbGVuOworCisgICAgICAgICAgLy8gY2F0Y2ggIi1leGVjIiB3aXRoIG5vIGFyZ3MgYW5kICItZXhlYyBcOyIKKyAgICAgICAgICBpZiAoIXNzWzFdIHx8ICFzdHJjbXAoc3NbMV0sICI7IikpIGVycm9yX2V4aXQoIiclcycgbmVlZHMgMSBhcmciLCBzKTsKKworICAgICAgICAgIGRsaXN0X2FkZF9ub21hbGxvYygmVFQuYXJnZGF0YSwgKHZvaWQgKikoYWEgPSB4emFsbG9jKHNpemVvZigqYWEpKSkpOworICAgICAgICAgIGFhLT5hcmdzdGFydCA9ICsrc3M7CisgICAgICAgICAgYWEtPmN1cmx5ID0gLTE7CisKKyAgICAgICAgICAvLyBSZWNvcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byAtZXhlYworICAgICAgICAgIGZvciAobGVuID0gMDsgc3NbbGVuXTsgbGVuKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKHNzW2xlbl0sICI7IikpIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChzc1tsZW5dLCAie30iKSkgeworICAgICAgICAgICAgICBhYS0+Y3VybHkgPSBsZW47CisgICAgICAgICAgICAgIGlmIChzc1tsZW4rMV0gJiYgIXN0cmNtcChzc1tsZW4rMV0sICIrIikpIHsKKyAgICAgICAgICAgICAgICBhYS0+cGx1cysrOworICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgYWEtPmFyZ3NpemUgKz0gc2l6ZW9mKGNoYXIgKikgKyBzdHJsZW4oc3NbbGVuXSkgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXNzW2xlbl0pIGVycm9yX2V4aXQoIi1leGVjIHdpdGhvdXQgJXMiLAorICAgICAgICAgICAgYWEtPmN1cmx5IT0tMSA/ICJcXDsiIDogInt9Iik7CisgICAgICAgICAgc3MgKz0gbGVuOworICAgICAgICAgIGFhLT5hcmdsZW4gPSBsZW47CisgICAgICAgICAgYWEtPmRpciA9ICEhc3RyY2hyKHMsICdkJyk7CisgICAgICAgICAgaWYgKFRULnRvcGRpciA9PSAtMSkgVFQudG9wZGlyID0geG9wZW5ybygiLiIpOworCisgICAgICAgIC8vIGNvbGxlY3QgbmFtZXMgYW5kIGV4ZWN1dGUgY29tbWFuZHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFyICpuYW1lLCAqc3MxID0gc3NbMV07CisgICAgICAgICAgc3RydWN0IGV4ZWNkaXJfZGF0YSAqYmI7CisKKyAgICAgICAgICAvLyBHcmFiIGNvbW1hbmQgbGluZSBleGVjIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgICBhYSA9ICh2b2lkICopbGxpc3RfcG9wKCZhcmdkYXRhKTsKKyAgICAgICAgICBzcyArPSBhYS0+YXJnbGVuICsgMTsKKworICAgICAgICAgIGlmICghY2hlY2spIGdvdG8gY29udDsKKyAgICAgICAgICAvLyBuYW1lIGlzIGFsd2F5cyBhIG5ldyBtYWxsb2MsIHNvIHdlIGNhbiBhbHdheXMgZnJlZSBpdC4KKyAgICAgICAgICBuYW1lID0gYWEtPmRpciA/IHhzdHJkdXAobmV3LT5uYW1lKSA6IGRpcnRyZWVfcGF0aChuZXcsIDApOworCisgICAgICAgICAgaWYgKCpzID09ICdvJykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdICVzIiwgc3MxLCBuYW1lKTsKKyAgICAgICAgICAgIGlmICghKHRlc3QgPSB5ZXNubygwKSkpIHsKKyAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgZ290byBjb250OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEFkZCBuZXh0IG5hbWUgdG8gbGlzdCAoZ2xvYmFsIGxpc3Qgd2l0aG91dCAtZGlyLCBsb2NhbCB3aXRoKQorICAgICAgICAgIGJiID0gYWEtPmV4ZWNkaXIgPyBhYS0+ZXhlY2RpciA6ICZhYS0+ZXhlYzsKKyAgICAgICAgICBkbGlzdF9hZGQoJmJiLT5uYW1lcywgbmFtZSk7CisgICAgICAgICAgYmItPm5hbWVjb3VudCsrOworCisgICAgICAgICAgLy8gLWV4ZWMgKyBjb2xsYXRlcyBhbmQgc2F2ZXMgcmVzdWx0IGluIGV4aXR2YWwKKyAgICAgICAgICBpZiAoYWEtPnBsdXMpIHsKKyAgICAgICAgICAgIC8vIE1hcmsgZW50cnkgc28gQ09NRUFHQUlOIGNhbiBjYWxsIGZsdXNoX2V4ZWMoKSBpbiBwYXJlbnQuCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5ldmVyIGEgdmFsaWQgcG9pbnRlciB2YWx1ZSBmb3IgcHJldiB0byBoYXZlIG90aGVyd2lzZQorICAgICAgICAgICAgLy8gRG9uZSBoZXJlIHZzIGFyZ3VtZW50IHBhcnNpbmcgcGFzcyBzbyBpdCdzIGFmdGVyIGRsaXN0X3Rlcm1pbmF0ZQorICAgICAgICAgICAgYWEtPnByZXYgPSAodm9pZCAqKTE7CisKKyAgICAgICAgICAgIC8vIEZsdXNoIGlmIHdlIHBhc3MgMTYgbWVncyBvZiBlbnZpcm9ubWVudCBzcGFjZS4KKyAgICAgICAgICAgIC8vIEFuIGluc2FuZWx5IGxvbmcgcGF0aCAoPjIgZ2lncykgY291bGQgd3JhcCB0aGUgY291bnRlciBhbmQKKyAgICAgICAgICAgIC8vIGRlZmVhdCB0aGlzIHRlc3QsIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IHRyaWdnZXIgT09NIGtpbGxlci4KKyAgICAgICAgICAgIGlmICgoYWEtPnBsdXMgKz0gc2l6ZW9mKGNoYXIgKikrc3RybGVuKG5hbWUpKzEpID4gMTw8MjQpIHsKKyAgICAgICAgICAgICAgYWEtPnBsdXMgPSAxOworICAgICAgICAgICAgICB0b3lzLmV4aXR2YWwgfD0gZmx1c2hfZXhlYyhuZXcsIGFhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgdGVzdCA9IGZsdXNoX2V4ZWMobmV3LCBhYSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcmd1bWVudCBjb25zdW1lZCwgc2tpcCB0aGUgY2hlY2suCisgICAgICAgIGdvdG8gY29udDsKKyAgICAgIH0gZWxzZSBnb3RvIGVycm9yOworCisgICAgICAvLyBUaGlzIHRlc3QgY2FuIGdvIGF0IHRoZSBlbmQgYmVjYXVzZSB3ZSBkbyBhIHN5bnRheCBjaGVja2luZworICAgICAgLy8gcGFzcyBmaXJzdC4gUHV0dGluZyBpdCBoZXJlIGdldHMgdGhlIGVycm9yIG1lc3NhZ2UgKC11bmtub3duCisgICAgICAvLyB2cyAta25vd24gbm9hcmcpIHJpZ2h0LgorICAgICAgaWYgKCEqKytzcykgZXJyb3JfZXhpdCgiJyVzJyBuZWVkcyAxIGFyZyIsIC0tcyk7CisgICAgfQorY29udDoKKyAgICAvLyBBcHBseSBwZW5kaW5nICIhIiB0byByZXN1bHQKKyAgICBpZiAoYWN0aXZlICYmIG5vdCkgdGVzdCA9ICF0ZXN0OworICAgIG5vdCA9IDA7CisgIH0KKworICBpZiAobmV3KSB7CisgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGFjdGlvbiwgcHJpbnQKKyAgICBpZiAoIXByaW50ICYmIHRlc3QpIGRvX3ByaW50KG5ldywgJ1xuJyk7CisKKyAgICBpZiAoU19JU0RJUihuZXctPnN0LnN0X21vZGUpKSBleGVjZGlyKG5ldywgMCk7CisgCisgIH0gZWxzZSBkbGlzdF90ZXJtaW5hdGUoVFQuYXJnZGF0YSk7CisKKyAgcmV0dXJuIHJlY3Vyc2U7CisKK2Vycm9yOgorICBlcnJvcl9leGl0KCJiYWQgYXJnICclcyciLCAqc3MpOworfQorCit2b2lkIGZpbmRfbWFpbih2b2lkKQoreworICBpbnQgaSwgbGVuOworICBjaGFyICoqc3MgPSB0b3lzLm9wdGFyZ3M7CisKKyAgVFQudG9wZGlyID0gLTE7CisKKyAgLy8gRGlzdGluZ3Vpc2ggcGF0aHMgZnJvbSBmaWx0ZXJzCisgIGZvciAobGVuID0gMDsgdG95cy5vcHRhcmdzW2xlbl07IGxlbisrKQorICAgIGlmIChzdHJjaHIoIi0hKCIsICp0b3lzLm9wdGFyZ3NbbGVuXSkpIGJyZWFrOworICBUVC5maWx0ZXIgPSB0b3lzLm9wdGFyZ3MrbGVuOworCisgIC8vIHVzZSAiLiIgaWYgbm8gcGF0aHMKKyAgaWYgKCFsZW4pIHsKKyAgICBzcyA9IChjaGFyICpbXSl7Ii4ifTsKKyAgICBsZW4gPSAxOworICB9CisKKyAgLy8gZmlyc3QgcGFzcyBhcmd1bWVudCBwYXJzaW5nLCB2ZXJpZnkgYXJncyBtYXRjaCB1cCwgaGFuZGxlICJldmFsdWF0ZSBvbmNlIgorICBUVC5ub3cgPSB0aW1lKDApOworICBkb19maW5kKDApOworCisgIC8vIExvb3AgdGhyb3VnaCBwYXRocworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgZGlydHJlZV9mbGFncmVhZChzc1tpXSwgRElSVFJFRV9TWU1GT0xMT1cqISEodG95cy5vcHRmbGFncyYoRkxBR19IfEZMQUdfTCkpLAorICAgICAgZG9fZmluZCk7CisKKyAgZXhlY2RpcigwLCAxKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSB7CisgICAgY2xvc2UoVFQudG9wZGlyKTsKKyAgICBsbGlzdF90cmF2ZXJzZShUVC5hcmdkYXRhLCBmcmVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvZ3JlcC5jIGIvdG95Ym94L3RveXMvcG9zaXgvZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjNlYTYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9ncmVwLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qIGdyZXAuYyAtIHByaW50IGxpbmVzIHdoYXQgbWF0Y2ggZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uCisgKgorICogQ29weXJpZ2h0IDIwMTMgQ0UgU3RyYWtlIDxzdHJha2U4ODggYXQgZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZ3JlcC5odG1sCisgKgorICogVE9ETzogLUFCQworCitVU0VfR1JFUChORVdUT1koZ3JlcCwgIkMjQiNBI1p6RUZIYWJoaW5vcnN2d2NscWUqZiptI3hbIXd4XVshRUZ3XSIsIFRPWUZMQUdfQklOKSkKK1VTRV9FR1JFUChPTERUT1koZWdyZXAsIGdyZXAsIFRPWUZMQUdfQklOKSkKK1VTRV9GR1JFUChPTERUT1koZmdyZXAsIGdyZXAsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIEdSRVAKKyAgYm9vbCAiZ3JlcCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogZ3JlcCBbLUVGaXZ3Y2xvcXNIYmhuXSBbLUEgTlVNXSBbLW0gTUFYXSBbLWUgUkVHRVhdLi4uIFstZiBSRUdGSUxFXSBbRklMRV0uLi4KKworICAgIFNob3cgbGluZXMgbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9ucy4gSWYgbm8gLWUsIGZpcnN0IGFyZ3VtZW50IGlzCisgICAgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoLiBXaXRoIG5vIGZpbGVzIChvciAiLSIgZmlsZW5hbWUpIHJlYWQgc3RkaW4uCisgICAgUmV0dXJucyAwIGlmIG1hdGNoZWQsIDEgaWYgbm8gbWF0Y2ggZm91bmQuCisKKyAgICAtZSAgUmVnZXggdG8gbWF0Y2guIChNYXkgYmUgcmVwZWF0ZWQuKQorICAgIC1mICBGaWxlIGNvbnRhaW5pbmcgcmVndWxhciBleHByZXNzaW9ucyB0byBtYXRjaC4KKworICAgIG1hdGNoIHR5cGU6CisgICAgLUEgIFNob3cgTlVNIGxpbmVzIGFmdGVyICAgICAtQiAgU2hvdyBOVU0gbGluZXMgYmVmb3JlIG1hdGNoCisgICAgLUMgIE5VTSBsaW5lcyBjb250ZXh0IChBK0IpICAtRSAgZXh0ZW5kZWQgcmVnZXggc3ludGF4CisgICAgLUYgIGZpeGVkIChsaXRlcmFsIG1hdGNoKSAgICAtaSAgY2FzZSBpbnNlbnNpdGl2ZQorICAgIC1tICBtYXRjaCBNQVggbWFueSBsaW5lcyAgICAgLXIgIHJlY3Vyc2l2ZSAob24gZGlyKQorICAgIC12ICBpbnZlcnQgbWF0Y2ggICAgICAgICAgICAgLXcgIHdob2xlIHdvcmQgKGltcGxpZXMgLUUpCisgICAgLXggIHdob2xlIGxpbmUgICAgICAgICAgICAgICAteiAgaW5wdXQgTlVMIHRlcm1pbmF0ZWQKKworICAgIGRpc3BsYXkgbW9kZXM6IChkZWZhdWx0OiBtYXRjaGVkIGxpbmUpCisgICAgLWMgIGNvdW50IG9mIG1hdGNoaW5nIGxpbmVzICAtbCAgc2hvdyBtYXRjaGluZyBmaWxlbmFtZXMKKyAgICAtbyAgb25seSBtYXRjaGluZyBwYXJ0ICAgICAgIC1xICBxdWlldCAoZXJyb3JzIG9ubHkpCisgICAgLXMgIHNpbGVudCAobm8gZXJyb3IgbXNnKSAgICAtWiAgb3V0cHV0IE5VTCB0ZXJtaW5hdGVkCisKKyAgICBvdXRwdXQgcHJlZml4IChkZWZhdWx0OiBmaWxlbmFtZSBpZiBjaGVja2luZyBtb3JlIHRoYW4gMSBmaWxlKQorICAgIC1IICBmb3JjZSBmaWxlbmFtZSAgICAgICAgICAgLWIgIGJ5dGUgb2Zmc2V0IG9mIG1hdGNoCisgICAgLWggIGhpZGUgZmlsZW5hbWUgICAgICAgICAgICAtbiAgbGluZSBudW1iZXIgb2YgbWF0Y2gKKworY29uZmlnIEVHUkVQCisgIGJvb2wKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gR1JFUAorCitjb25maWcgRkdSRVAKKyAgYm9vbAorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBHUkVQCisqLworCisjZGVmaW5lIEZPUl9ncmVwCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKK0dMT0JBTFMoCisgIGxvbmcgbTsKKyAgc3RydWN0IGFyZ19saXN0ICpmOworICBzdHJ1Y3QgYXJnX2xpc3QgKmU7CisgIGxvbmcgYTsKKyAgbG9uZyBiOworICBsb25nIGM7CisKKyAgY2hhciBpbmRlbGltLCBvdXRkZWxpbTsKKykKKworLy8gRW1pdCBsaW5lIHdpdGggdmFyaW91cyBwb3RlbnRpYWwgcHJlZml4ZXMgYW5kIGRlbGltaXRlcgorc3RhdGljIHZvaWQgb3V0bGluZShjaGFyICpsaW5lLCBjaGFyIGRhc2gsIGNoYXIgKm5hbWUsIGxvbmcgbGNvdW50LCBsb25nIGJjb3VudCwKKyAgaW50IHRyaW0pCit7CisgIGlmIChuYW1lICYmICh0b3lzLm9wdGZsYWdzJkZMQUdfSCkpIHByaW50ZigiJXMlYyIsIG5hbWUsIGRhc2gpOworICBpZiAoIWxpbmUgfHwgKGxjb3VudCAmJiAodG95cy5vcHRmbGFncyZGTEFHX24pKSkKKyAgICBwcmludGYoIiVsZCVjIiwgbGNvdW50LCBsaW5lID8gZGFzaCA6IFRULm91dGRlbGltKTsKKyAgaWYgKGJjb3VudCAmJiAodG95cy5vcHRmbGFncyZGTEFHX2IpKSBwcmludGYoIiVsZCVjIiwgYmNvdW50LTEsIGRhc2gpOworICBpZiAobGluZSkgeHByaW50ZigiJS4qcyVjIiwgdHJpbSwgbGluZSwgVFQub3V0ZGVsaW0pOworfQorCisvLyBTaG93IG1hdGNoZXMgaW4gb25lIGZpbGUKK3N0YXRpYyB2b2lkIGRvX2dyZXAoaW50IGZkLCBjaGFyICpuYW1lKQoreworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsYiA9IDA7CisgIEZJTEUgKmZpbGUgPSBmZG9wZW4oZmQsICJyIik7CisgIGxvbmcgbGNvdW50ID0gMCwgbWNvdW50ID0gMCwgb2Zmc2V0ID0gMCwgYWZ0ZXIgPSAwLCBiZWZvcmUgPSAwOworICBjaGFyICpiYXJzID0gMDsKKworICBpZiAoIWZkKSBuYW1lID0gIihzdGFuZGFyZCBpbnB1dCkiOworCisgIGlmICghZmlsZSkgeworICAgIHBlcnJvcl9tc2dfcmF3KG5hbWUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCBsaW5lcyBvZiBpbnB1dAorICBmb3IgKDs7KSB7CisgICAgY2hhciAqbGluZSA9IDAsICpzdGFydDsKKyAgICByZWdtYXRjaF90IG1hdGNoZXM7CisgICAgc2l6ZV90IHVudXNlZDsKKyAgICBsb25nIGxlbjsKKyAgICBpbnQgbW1hdGNoID0gMDsKKworICAgIGxjb3VudCsrOworICAgIGlmICgwID4gKGxlbiA9IGdldGRlbGltKCZsaW5lLCAmdW51c2VkLCBUVC5pbmRlbGltLCBmaWxlKSkpIGJyZWFrOworICAgIGlmIChsaW5lW2xlbi0xXSA9PSBUVC5pbmRlbGltKSBsaW5lW2xlbi0xXSA9IDA7CisKKyAgICBzdGFydCA9IGxpbmU7CisKKyAgICAvLyBMb29wIHRocm91Z2ggbWF0Y2hlcyBpbiB0aGlzIGxpbmUKKyAgICBkbyB7CisgICAgICBpbnQgcmMgPSAwLCBza2lwID0gMDsKKworICAgICAgLy8gSGFuZGxlIG5vbi1yZWdleCBtYXRjaGVzCisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRikgeworICAgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnNlZWssIGZzZWVrOworICAgICAgICBjaGFyICpzID0gMDsKKworICAgICAgICBmb3IgKHNlZWsgPSBUVC5lOyBzZWVrOyBzZWVrID0gc2Vlay0+bmV4dCkgeworICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSB7CisgICAgICAgICAgICBpbnQgaSA9ICh0b3lzLm9wdGZsYWdzICYgRkxBR19pKTsKKworICAgICAgICAgICAgaWYgKChpID8gc3RyY2FzZWNtcCA6IHN0cmNtcCkoc2Vlay0+YXJnLCBsaW5lKSkgcyA9IGxpbmU7CisgICAgICAgICAgfSBlbHNlIGlmICghKnNlZWstPmFyZykgeworICAgICAgICAgICAgc2VlayA9ICZmc2VlazsKKyAgICAgICAgICAgIGZzZWVrLmFyZyA9IHMgPSBsaW5lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19pKSBzID0gc3RybnN0cihsaW5lLCBzZWVrLT5hcmcpOworICAgICAgICAgIGVsc2UgcyA9IHN0cnN0cihsaW5lLCBzZWVrLT5hcmcpOworICAgICAgICAgIGlmIChzKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgbWF0Y2hlcy5ybV9zbyA9IChzLWxpbmUpOworICAgICAgICAgIHNraXAgPSBtYXRjaGVzLnJtX2VvID0gKHMtbGluZSkrc3RybGVuKHNlZWstPmFyZyk7CisgICAgICAgIH0gZWxzZSByYyA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICByYyA9IHJlZ2V4ZWMoKHJlZ2V4X3QgKil0b3lidWYsIHN0YXJ0LCAxLCAmbWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0PT1saW5lID8gMCA6IFJFR19OT1RCT0wpOworICAgICAgICBza2lwID0gbWF0Y2hlcy5ybV9lbzsKKyAgICAgIH0KKworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpCisgICAgICAgIGlmIChtYXRjaGVzLnJtX3NvIHx8IGxpbmVbbWF0Y2hlcy5ybV9lb10pIHJjID0gMTsKKworICAgICAgaWYgKCFyYyAmJiAodG95cy5vcHRmbGFncyAmIEZMQUdfdykpIHsKKyAgICAgICAgY2hhciBjID0gMDsKKworICAgICAgICBpZiAoKHN0YXJ0K21hdGNoZXMucm1fc28pIT1saW5lKSB7CisgICAgICAgICAgYyA9IHN0YXJ0W21hdGNoZXMucm1fc28tMV07CisgICAgICAgICAgaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSBjID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWMpIHsKKyAgICAgICAgICBjID0gc3RhcnRbbWF0Y2hlcy5ybV9lb107CisgICAgICAgICAgaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSBjID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYykgeworICAgICAgICAgIHN0YXJ0ICs9IG1hdGNoZXMucm1fc28rMTsKKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR192KSB7CisgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSB7CisgICAgICAgICAgaWYgKHJjKSBza2lwID0gbWF0Y2hlcy5ybV9lbyA9IHN0cmxlbihzdGFydCk7CisgICAgICAgICAgZWxzZSBpZiAoIW1hdGNoZXMucm1fc28pIHsKKyAgICAgICAgICAgIHN0YXJ0ICs9IHNraXA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGVsc2UgbWF0Y2hlcy5ybV9lbyA9IG1hdGNoZXMucm1fc287CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFyYykgYnJlYWs7CisgICAgICAgICAgbWF0Y2hlcy5ybV9lbyA9IHN0cmxlbihzdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hlcy5ybV9zbyA9IDA7CisgICAgICB9IGVsc2UgaWYgKHJjKSBicmVhazsKKworICAgICAgLy8gQXQgbGVhc3Qgb25lIGxpbmUgd2UgZGlkbid0IHByaW50IHNpbmNlIG1hdGNoIHdoaWxlIC1BQkMgYWN0aXZlCisgICAgICBpZiAoYmFycykgeworICAgICAgICB4cHV0cyhiYXJzKTsKKyAgICAgICAgYmFycyA9IDA7CisgICAgICB9CisgICAgICBtbWF0Y2grKzsKKyAgICAgIHRveXMuZXhpdHZhbCA9IDA7CisgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcSkgeGV4aXQoKTsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19sKSB7CisgICAgICAgIHhwcmludGYoIiVzJWMiLCBuYW1lLCBUVC5vdXRkZWxpbSk7CisgICAgICAgIGZyZWUobGluZSk7CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX28pCisgICAgICAgIGlmIChtYXRjaGVzLnJtX2VvID09IG1hdGNoZXMucm1fc28pCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpKSB7CisgICAgICAgIGxvbmcgYmNvdW50ID0gMSArIG9mZnNldCArIChzdGFydC1saW5lKSArCisgICAgICAgICAgKCh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSA/IG1hdGNoZXMucm1fc28gOiAwKTsKKyAKKyAgICAgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbykpIHsKKyAgICAgICAgICB3aGlsZSAoZGxiKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsID0gZGxpc3RfcG9wKCZkbGIpOworCisgICAgICAgICAgICBvdXRsaW5lKGRsLT5kYXRhLCAnLScsIG5hbWUsIGxjb3VudC1iZWZvcmUsIDAsIC0xKTsKKyAgICAgICAgICAgIGZyZWUoZGwtPmRhdGEpOworICAgICAgICAgICAgZnJlZShkbCk7CisgICAgICAgICAgICBiZWZvcmUtLTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBvdXRsaW5lKGxpbmUsICc6JywgbmFtZSwgbGNvdW50LCBiY291bnQsIC0xKTsKKyAgICAgICAgICBpZiAoVFQuYSkgYWZ0ZXIgPSBUVC5hKzE7CisgICAgICAgIH0gZWxzZSBvdXRsaW5lKHN0YXJ0K21hdGNoZXMucm1fc28sICc6JywgbmFtZSwgbGNvdW50LCBiY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucm1fZW8tbWF0Y2hlcy5ybV9zbyk7CisgICAgICB9CisKKyAgICAgIHN0YXJ0ICs9IHNraXA7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSkgYnJlYWs7CisgICAgfSB3aGlsZSAoKnN0YXJ0KTsKKyAgICBvZmZzZXQgKz0gbGVuOworCisgICAgaWYgKG1tYXRjaCkgbWNvdW50Kys7CisgICAgZWxzZSB7CisgICAgICBpbnQgZGlzY2FyZCA9IChhZnRlciB8fCBUVC5iKTsKKworICAgICAgaWYgKGFmdGVyICYmIC0tYWZ0ZXIpIHsKKyAgICAgICAgb3V0bGluZShsaW5lLCAnLScsIG5hbWUsIGxjb3VudCwgMCwgLTEpOworICAgICAgICBkaXNjYXJkID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChkaXNjYXJkICYmIFRULmIpIHsKKyAgICAgICAgZGxpc3RfYWRkKCZkbGIsIGxpbmUpOworICAgICAgICBsaW5lID0gMDsKKyAgICAgICAgaWYgKCsrYmVmb3JlPlRULmIpIHsKKyAgICAgICAgICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsOworCisgICAgICAgICAgZGwgPSBkbGlzdF9wb3AoJmRsYik7CisgICAgICAgICAgZnJlZShkbC0+ZGF0YSk7CisgICAgICAgICAgZnJlZShkbCk7CisgICAgICAgICAgYmVmb3JlLS07CisgICAgICAgIH0gZWxzZSBkaXNjYXJkID0gMDsKKyAgICAgIH0KKyAgICAgIC8vIElmIHdlIGRpc2NhcmRlZCBhIGxpbmUgd2hpbGUgZGlzcGxheWluZyBjb250ZXh0LCBzaG93IGJhcnMgYmVmb3JlIG5leHQKKyAgICAgIC8vIGxpbmUgKGJ1dCBkb24ndCBzaG93IHRoZW0gbm93IGluIGNhc2UgdGhhdCB3YXMgbGFzdCBtYXRjaCBpbiBmaWxlKQorICAgICAgaWYgKGRpc2NhcmQgJiYgbWNvdW50KSBiYXJzID0gIi0tIjsKKyAgICB9CisgICAgZnJlZShsaW5lKTsKKworICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfbSkgJiYgbWNvdW50ID49IFRULm0pIGJyZWFrOworICB9CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIG91dGxpbmUoMCwgJzonLCBuYW1lLCBtY291bnQsIDAsIC0xKTsKKworICAvLyBsb29wZmlsZXMgd2lsbCBhbHNvIGNsb3NlIHRoZSBmZCwgYnV0IHRoaXMgZnJlZXMgYW4gKG9wYXF1ZSkgc3RydWN0LgorICBmY2xvc2UoZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3JlZ2V4KHZvaWQpCit7CisgIHN0cnVjdCBhcmdfbGlzdCAqYWwsICpuZXcsICpsaXN0ID0gTlVMTDsKKyAgbG9uZyBsZW4gPSAwOworICBjaGFyICpzLCAqc3M7CisKKyAgLy8gQWRkIGFsbCAtZiBsaW5lcyB0byAtZSBsaXN0LiAoWWVzLCB0aGlzIGlzIGxlYWtpbmcgYWxsb2NhdGlvbiBjb250ZXh0IGZvcgorICAvLyBleGl0IHRvIGZyZWUuIE5vdCBzdXBwb3J0aW5nIG5vZm9yayBmb3IgdGhpcyBjb21tYW5kIGFueSB0aW1lIHNvb24uKQorICBhbCA9IFRULmYgPyBUVC5mIDogVFQuZTsKKyAgd2hpbGUgKGFsKSB7CisgICAgaWYgKFRULmYpIHMgPSBzcyA9IHhyZWFkZmlsZShhbC0+YXJnLCAwLCAwKTsKKyAgICBlbHNlIHMgPSBzcyA9IGFsLT5hcmc7CisKKyAgICAvLyBTcGxpdCBsaW5lcyBhdCBcbiwgYWRkIGluZGl2aWR1YWwgbGluZXMgdG8gbmV3IGxpc3QuCisgICAgZG8geworICAgICAgc3MgPSBzdHJjaHIocywgJ1xuJyk7CisgICAgICBpZiAoc3MpICooc3MrKykgPSAwOworICAgICAgbmV3ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGFyZ19saXN0KSk7CisgICAgICBuZXctPm5leHQgPSBsaXN0OworICAgICAgbmV3LT5hcmcgPSBzOworICAgICAgbGlzdCA9IG5ldzsKKyAgICAgIHMgPSBzczsKKyAgICB9IHdoaWxlIChzcyAmJiAqcyk7CisKKyAgICAvLyBBZHZhbmNlLCB3aGVuIHdlIHJ1biBvdXQgb2YgLWYgc3dpdGNoIHRvIC1lLgorICAgIGFsID0gYWwtPm5leHQ7CisgICAgaWYgKCFhbCAmJiBUVC5mKSB7CisgICAgICBUVC5mID0gMDsKKyAgICAgIGFsID0gVFQuZTsKKyAgICB9CisgIH0KKyAgVFQuZSA9IGxpc3Q7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfRikpIHsKKyAgICBjaGFyICpyZWdzdHI7CisgICAgaW50IGk7CisKKyAgICAvLyBDb252ZXJ0IHN0cmluZ3MgdG8gb25lIGJpZyByZWdleAorICAgIGZvciAoYWwgPSBUVC5lOyBhbDsgYWwgPSBhbC0+bmV4dCkKKyAgICAgIGxlbiArPSBzdHJsZW4oYWwtPmFyZykrMSshKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0UpOworCisgICAgcmVnc3RyID0gcyA9IHhtYWxsb2MobGVuKTsKKyAgICBmb3IgKGFsID0gVFQuZTsgYWw7IGFsID0gYWwtPm5leHQpIHsKKyAgICAgIHMgPSBzdHBjcHkocywgYWwtPmFyZyk7CisgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19FKSkgKihzKyspID0gJ1xcJzsKKyAgICAgICoocysrKSA9ICd8JzsKKyAgICB9CisgICAgKihzLT0oMSshKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0UpKSkgPSAwOworCisgICAgaSA9IHJlZ2NvbXAoKHJlZ2V4X3QgKil0b3lidWYsIHJlZ3N0ciwKKyAgICAgICAgICAgICAgICAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0UpID8gUkVHX0VYVEVOREVEIDogMCkgfAorICAgICAgICAgICAgICAgICgodG95cy5vcHRmbGFncyAmIEZMQUdfaSkgPyBSRUdfSUNBU0UgICAgOiAwKSk7CisKKyAgICBpZiAoaSkgeworICAgICAgcmVnZXJyb3IoaSwgKHJlZ2V4X3QgKil0b3lidWYsIHRveWJ1ZitzaXplb2YocmVnZXhfdCksCisgICAgICAgICAgICAgICBzaXplb2YodG95YnVmKS1zaXplb2YocmVnZXhfdCkpOworICAgICAgZXJyb3JfZXhpdCgiYmFkIFJFR0VYOiAlcyIsIHRveWJ1Zik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgZG9fZ3JlcF9yKHN0cnVjdCBkaXJ0cmVlICpuZXcpCit7CisgIGNoYXIgKm5hbWU7CisKKyAgaWYgKG5ldy0+cGFyZW50ICYmICFkaXJ0cmVlX25vdGRvdGRvdChuZXcpKSByZXR1cm4gMDsKKyAgaWYgKFNfSVNESVIobmV3LT5zdC5zdF9tb2RlKSkgcmV0dXJuIERJUlRSRUVfUkVDVVJTRTsKKworICAvLyAiZ3JlcCAtciBvbmVmaWxlIiBkb2Vzbid0IHNob3cgZmlsZW5hbWVzLCBidXQgImdyZXAgLXIgb25lZGlyIiBzaG91bGQuCisgIGlmIChuZXctPnBhcmVudCAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2gpKSB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfSDsKKworICBuYW1lID0gZGlydHJlZV9wYXRoKG5ldywgMCk7CisgIGRvX2dyZXAob3BlbmF0KGRpcnRyZWVfcGFyZW50ZmQobmV3KSwgbmV3LT5uYW1lLCAwKSwgbmFtZSk7CisgIGZyZWUobmFtZSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ3JlcF9tYWluKHZvaWQpCit7CisgIGNoYXIgKipzcyA9IHRveXMub3B0YXJnczsKKworICBpZiAoIVRULmEpIFRULmEgPSBUVC5jOworICBpZiAoIVRULmIpIFRULmIgPSBUVC5jOworCisgIFRULmluZGVsaW0gPSAnXG4nICogISh0b3lzLm9wdGZsYWdzJkZMQUdfeik7CisgIFRULm91dGRlbGltID0gJ1xuJyAqICEodG95cy5vcHRmbGFncyZGTEFHX1opOworCisgIC8vIEhhbmRsZSBlZ3JlcCBhbmQgZmdyZXAKKyAgaWYgKCp0b3lzLndoaWNoLT5uYW1lID09ICdlJykgdG95cy5vcHRmbGFncyB8PSBGTEFHX0U7CisgIGlmICgqdG95cy53aGljaC0+bmFtZSA9PSAnZicpIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19GOworCisgIGlmICghVFQuZSAmJiAhVFQuZikgeworICAgIGlmICghKnNzKSBlcnJvcl9leGl0KCJubyBSRUdFWCIpOworICAgIFRULmUgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgYXJnX2xpc3QpKTsKKyAgICBUVC5lLT5hcmcgPSAqKHNzKyspOworICAgIHRveXMub3B0Yy0tOworICB9CisKKyAgcGFyc2VfcmVnZXgoKTsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzICYgRkxBR19oKSAmJiB0b3lzLm9wdGM+MSkgdG95cy5vcHRmbGFncyB8PSBGTEFHX0g7CisKKyAgdG95cy5leGl0dmFsID0gMTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHsKKyAgICBjbG9zZSgyKTsKKyAgICB4b3Blbl9zdGRpbygiL2Rldi9udWxsIiwgT19SRFdSKTsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19yKSB7CisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIC1yIGFyZ3VtZW50cy4gVXNlICIuIiBhcyBkZWZhdWx0IGlmIG5vbmUgcHJvdmlkZWQuCisgICAgZm9yIChzcyA9ICpzcyA/IHNzIDogKGNoYXIgKltdKXsiLiIsIDB9OyAqc3M7IHNzKyspIHsKKyAgICAgIGlmICghc3RyY21wKCpzcywgIi0iKSkgZG9fZ3JlcCgwLCAqc3MpOworICAgICAgZWxzZSBkaXJ0cmVlX3JlYWQoKnNzLCBkb19ncmVwX3IpOworICAgIH0KKyAgfSBlbHNlIGxvb3BmaWxlc19ydyhzcywgT19SRE9OTFksIDAsIDEsIGRvX2dyZXApOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvaGVhZC5jIGIvdG95Ym94L3RveXMvcG9zaXgvaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDA3NjAKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9oZWFkLmMKQEAgLTAsMCArMSw2MSBAQAorLyogaGVhZC5jIC0gY29weSBmaXJzdCBsaW5lcyBmcm9tIGlucHV0IHRvIHN0ZG91dC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBUaW1vdGh5IEVsbGlvdHQgPHRsZUBob2x5bW9ua2V5LmNvbT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9oZWFkLmh0bWwKKworVVNFX0hFQUQoTkVXVE9ZKGhlYWQsICI/biM8MD0xMCIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIEhFQUQKKyAgYm9vbCAiaGVhZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogaGVhZCBbLW4gbnVtYmVyXSBbZmlsZS4uLl0KKworICAgIENvcHkgZmlyc3QgbGluZXMgZnJvbSBmaWxlcyB0byBzdGRvdXQuIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tCisgICAgc3RkaW4uIEZpbGVuYW1lICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLgorCisgICAgLW4JTnVtYmVyIG9mIGxpbmVzIHRvIGNvcHkuCisqLworCisjZGVmaW5lIEZPUl9oZWFkCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBsb25nIGxpbmVzOworICBpbnQgZmlsZV9ubzsKKykKKworc3RhdGljIHZvaWQgZG9faGVhZChpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGludCBpLCBsZW4sIGxpbmVzPVRULmxpbmVzLCBzaXplPXNpemVvZih0b3lidWYpOworCisgIGlmICh0b3lzLm9wdGMgPiAxKSB7CisgICAgLy8gUHJpbnQgYW4gZXh0cmEgbmV3bGluZSBmb3IgYWxsIGJ1dCB0aGUgZmlyc3QgZmlsZQorICAgIGlmIChUVC5maWxlX25vKyspIHhwcmludGYoIlxuIik7CisgICAgeHByaW50ZigiPT0+ICVzIDw9PVxuIiwgbmFtZSk7CisgICAgeGZsdXNoKCk7CisgIH0KKworICB3aGlsZSAobGluZXMpIHsKKyAgICBsZW4gPSByZWFkKGZkLCB0b3lidWYsIHNpemUpOworICAgIGlmIChsZW48MCkgcGVycm9yX21zZ19yYXcobmFtZSk7CisgICAgaWYgKGxlbjwxKSBicmVhazsKKworICAgIGZvcihpPTA7IGk8bGVuOykgaWYgKHRveWJ1ZltpKytdID09ICdcbicgJiYgIS0tbGluZXMpIGJyZWFrOworCisgICAgeHdyaXRlKDEsIHRveWJ1ZiwgaSk7CisgIH0KK30KKwordm9pZCBoZWFkX21haW4odm9pZCkKK3sKKyAgY2hhciAqYXJnID0gKnRveXMub3B0YXJnczsKKworICAvLyBoYW5kbGUgb2xkICItNDIiIHN0eWxlIGFyZ3VtZW50cworICBpZiAoYXJnICYmICphcmcgPT0gJy0nICYmIGFyZ1sxXSkgeworICAgIFRULmxpbmVzID0gYXRvbHgoYXJnKzEpOworICAgIHRveXMub3B0Yy0tOworICB9IGVsc2UgYXJnID0gMDsKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncyshIWFyZywgZG9faGVhZCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9pZC5jIGIvdG95Ym94L3RveXMvcG9zaXgvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjczMmIxCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvaWQuYwpAQCAtMCwwICsxLDE3OSBAQAorLyogaWQuYyAtIHByaW50IHJlYWwgYW5kIGVmZmVjdGl2ZSB1c2VyIGFuZCBncm91cCBJRHMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTb255IE5ldHdvcmsgRW50ZXJ0YWlubWVudCwgSW5jLgorICoKKyAqIGJ5IFRpbSBCaXJkIDx0aW0uYmlyZEBhbS5zb255LmNvbT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9pZC5odG1sCisKK1VTRV9JRChORVdUT1koaWQsICI+MSJVU0VfSURfWigiWiIpIm5HZ3J1WyEiVVNFX0lEX1ooIloiKSJHZ3VdIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX0dST1VQUyhORVdUT1koZ3JvdXBzLCBOVUxMLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCitVU0VfTE9HTkFNRShORVdUT1kobG9nbmFtZSwgIj4wIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1dIT0FNSShPTERUT1kod2hvYW1pLCBsb2duYW1lLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBJRAorICBib29sICJpZCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogaWQgWy1uR2dydV0KKworICAgIFByaW50IHVzZXIgYW5kIGdyb3VwIElELgorCisgICAgLW4JcHJpbnQgbmFtZXMgaW5zdGVhZCBvZiBudW1lcmljIElEcyAodG8gYmUgdXNlZCB3aXRoIC1HZ3UpCisgICAgLUcJU2hvdyBvbmx5IHRoZSBncm91cCBJRHMKKyAgICAtZwlTaG93IG9ubHkgdGhlIGVmZmVjdGl2ZSBncm91cCBJRAorICAgIC1yCVNob3cgcmVhbCBJRCBpbnN0ZWFkIG9mIGVmZmVjdGl2ZSBJRAorICAgIC11CVNob3cgb25seSB0aGUgZWZmZWN0aXZlIHVzZXIgSUQKKworY29uZmlnIElEX1oKKyAgYm9vbAorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBJRCAmJiAhVE9ZQk9YX0xTTV9OT05FCisgIGhlbHAKKyAgICB1c2FnZTogaWQgWy1aXQorCisgICAgLVoJU2hvdyBvbmx5IHNlY3VyaXR5IGNvbnRleHQKKworY29uZmlnIEdST1VQUworICBib29sICJncm91cHMiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGdyb3VwcyBbdXNlcl0KKworICAgIFByaW50IHRoZSBncm91cHMgYSB1c2VyIGlzIGluLgorCitjb25maWcgTE9HTkFNRQorICBib29sICJsb2duYW1lIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBsb2duYW1lCisKKyAgICBQcmludCB0aGUgY3VycmVudCB1c2VyIG5hbWUuCisKK2NvbmZpZyBXSE9BTUkKKyAgYm9vbCAid2hvYW1pIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB3aG9hbWkKKworICAgIFByaW50IHRoZSBjdXJyZW50IHVzZXIgbmFtZS4KKyovCisKKyNkZWZpbmUgRk9SX2lkCisjZGVmaW5lIEZPUkNFX0ZMQUdTCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBpbnQgaXNfZ3JvdXBzOworKQorCitzdGF0aWMgdm9pZCBzX29yX3UoY2hhciAqcywgdW5zaWduZWQgdSwgaW50IGRvbmUpCit7CisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfbikgcHJpbnRmKCIlcyIsIHMpOworICBlbHNlIHByaW50ZigiJXUiLCB1KTsKKyAgaWYgKGRvbmUpIHsKKyAgICB4cHV0YygnXG4nKTsKKyAgICB4ZXhpdCgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dpZChjaGFyICpoZWFkZXIsIHVuc2lnbmVkIHUsIGNoYXIgKnMpCit7CisgIHByaW50ZigiJXMldSglcykiLCBoZWFkZXIsIHUsIHMpOworfQorCitzdGF0aWMgdm9pZCBkb19pZChjaGFyICp1c2VybmFtZSkKK3sKKyAgaW50IGZsYWdzLCBpLCBuZ3JvdXBzOworICBzdHJ1Y3QgcGFzc3dkICpwdzsKKyAgc3RydWN0IGdyb3VwICpncnA7CisgIHVpZF90IHVpZCA9IGdldHVpZCgpLCBldWlkID0gZ2V0ZXVpZCgpOworICBnaWRfdCBnaWQgPSBnZXRnaWQoKSwgZWdpZCA9IGdldGVnaWQoKSwgKmdyb3VwczsKKworICBmbGFncyA9IHRveXMub3B0ZmxhZ3M7CisKKyAgLy8gY2hlY2sgaWYgYSB1c2VybmFtZSBpcyBnaXZlbgorICBpZiAodXNlcm5hbWUpIHsKKyAgICBwdyA9IHhnZXRwd25hbSh1c2VybmFtZSk7CisgICAgdWlkID0gZXVpZCA9IHB3LT5wd191aWQ7CisgICAgZ2lkID0gZWdpZCA9IHB3LT5wd19naWQ7CisgICAgaWYgKFRULmlzX2dyb3VwcykgcHJpbnRmKCIlcyA6ICIsIHB3LT5wd19uYW1lKTsKKyAgfQorCisgIGkgPSBmbGFncyAmIEZMQUdfcjsKKyAgcHcgPSB4Z2V0cHd1aWQoaSA/IHVpZCA6IGV1aWQpOworICBpZiAodG95cy5vcHRmbGFncyZGTEFHX3UpIHNfb3JfdShwdy0+cHdfbmFtZSwgcHctPnB3X3VpZCwgMSk7CisKKyAgZ3JwID0geGdldGdyZ2lkKGkgPyBnaWQgOiBlZ2lkKTsKKyAgaWYgKGZsYWdzICYgRkxBR19nKSBzX29yX3UoZ3JwLT5ncl9uYW1lLCBncnAtPmdyX2dpZCwgMSk7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyYoRkxBR19nfEZMQUdfWikpKSB7CisgICAgc2hvd2lkKCJ1aWQ9IiwgcHctPnB3X3VpZCwgcHctPnB3X25hbWUpOworICAgIHNob3dpZCgiIGdpZD0iLCBncnAtPmdyX2dpZCwgZ3JwLT5ncl9uYW1lKTsKKworICAgIGlmICghaSkgeworICAgICAgaWYgKHVpZCAhPSBldWlkKSB7CisgICAgICAgIHB3ID0geGdldHB3dWlkKGV1aWQpOworICAgICAgICBzaG93aWQoIiBldWlkPSIsIHB3LT5wd191aWQsIHB3LT5wd19uYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmIChnaWQgIT0gZWdpZCkgeworICAgICAgICBncnAgPSB4Z2V0Z3JnaWQoZWdpZCk7CisgICAgICAgIHNob3dpZCgiIGVnaWQ9IiwgZ3JwLT5ncl9naWQsIGdycC0+Z3JfbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgc2hvd2lkKCIgZ3JvdXBzPSIsIGdycC0+Z3JfZ2lkLCBncnAtPmdyX25hbWUpOworICB9CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX1opKSB7CisgICAgZ3JvdXBzID0gKGdpZF90ICopdG95YnVmOworICAgIGkgPSBzaXplb2YodG95YnVmKS9zaXplb2YoZ2lkX3QpOworICAgIG5ncm91cHMgPSB1c2VybmFtZSA/IGdldGdyb3VwbGlzdCh1c2VybmFtZSwgZ2lkLCBncm91cHMsICZpKQorICAgICAgOiBnZXRncm91cHMoaSwgZ3JvdXBzKTsKKyAgICBpZiAobmdyb3VwczwwKSBwZXJyb3JfZXhpdCgwKTsKKworICAgIGludCBzaG93X3NlcGFyYXRvciA9ICEodG95cy5vcHRmbGFncyZGTEFHX0cpOworICAgIGZvciAoaSA9IDA7IGk8bmdyb3VwczsgaSsrKSB7CisgICAgICBpZiAoc2hvd19zZXBhcmF0b3IpIHhwdXRjKCh0b3lzLm9wdGZsYWdzJkZMQUdfRykgPyAnICcgOiAnLCcpOworICAgICAgc2hvd19zZXBhcmF0b3IgPSAxOworICAgICAgaWYgKCEoZ3JwID0gZ2V0Z3JnaWQoZ3JvdXBzW2ldKSkpIHBlcnJvcl9tc2coMCk7CisgICAgICBlbHNlIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfRykgc19vcl91KGdycC0+Z3JfbmFtZSwgZ3JwLT5ncl9naWQsIDApOworICAgICAgZWxzZSBpZiAoZ3JwLT5ncl9naWQgIT0gZWdpZCkgc2hvd2lkKCIiLCBncnAtPmdyX2dpZCwgZ3JwLT5ncl9uYW1lKTsKKyAgICAgIGVsc2Ugc2hvd19zZXBhcmF0b3IgPSAwOyAvLyBCZWNhdXNlIHdlIGRpZG4ndCBzaG93IGFueXRoaW5nIHRoaXMgdGltZS4KKyAgICB9CisgICAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19HKSB7CisgICAgICB4cHV0YygnXG4nKTsKKyAgICAgIHhleGl0KCk7CisgICAgfQorICB9CisKKyAgaWYgKCFDRkdfVE9ZQk9YX0xTTV9OT05FKSB7CisgICAgaWYgKGxzbV9lbmFibGVkKCkpIHsKKyAgICAgIGNoYXIgKmNvbnRleHQgPSBsc21fY29udGV4dCgpOworCisgICAgICBwcmludGYoIiBjb250ZXh0PSVzIishISh0b3lzLm9wdGZsYWdzJkZMQUdfWiksIGNvbnRleHQpOworICAgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShjb250ZXh0KTsKKyAgICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19aKSBlcnJvcl9leGl0KCIlcyBkaXNhYmxlZCIsIGxzbV9uYW1lKCkpOworICB9CisKKyAgeHB1dGMoJ1xuJyk7Cit9CisKK3ZvaWQgaWRfbWFpbih2b2lkKQoreworICBpZiAodG95cy5vcHRjKSB3aGlsZSgqdG95cy5vcHRhcmdzKSBkb19pZCgqdG95cy5vcHRhcmdzKyspOworICBlbHNlIGRvX2lkKE5VTEwpOworfQorCit2b2lkIGdyb3Vwc19tYWluKHZvaWQpCit7CisgIFRULmlzX2dyb3VwcyA9IDE7CisgIHRveXMub3B0ZmxhZ3MgPSBGTEFHX0d8RkxBR19uOworICBpZF9tYWluKCk7Cit9CisKK3ZvaWQgbG9nbmFtZV9tYWluKHZvaWQpCit7CisgIHRveXMub3B0ZmxhZ3MgPSBGTEFHX3V8RkxBR19uOworICBpZF9tYWluKCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9raWxsLmMgYi90b3lib3gvdG95cy9wb3NpeC9raWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZDM2YQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2tpbGwuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoga2lsbC5jIC0gYSBwcm9ncmFtIHRvIHNlbmQgc2lnbmFscyB0byBwcm9jZXNzZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBEYW5pZWwgV2FsdGVyIDxkLndhbHRlckAweDkwLmF0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2tpbGwuaHRtbAorICoKKyAqIGtpbGxhbGw1LmMgLSBTZW5kIHNpZ25hbCB0byBhbGwgcHJvY2Vzc2VzIG91dHNpZGUgY3VycmVudCBzZXNzaW9uLgorICoKKyAqIENvcHlyaWdodCAyMDE0IFJhbmphbiBLdW1hciA8cmFuamFua3VtYXIuYnRoQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ2FtaWwuY29tPgorICoKKyAqIE5vIFN0YW5kYXJkCisKK1VTRV9LSUxMKE5FV1RPWShraWxsLCAiP2xzOiAiLCBUT1lGTEFHX0JJTikpCitVU0VfS0lMTEFMTDUoTkVXVE9ZKGtpbGxhbGw1LCAiP28qbHM6IFshbG9dWyFsc10iLCBUT1lGTEFHX1NCSU4pKQorCitjb25maWcgS0lMTAorICBib29sICJraWxsIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBraWxsIFstbCBbU0lHTkFMXSB8IC1zIFNJR05BTCB8IC1TSUdOQUxdIHBpZC4uLgorCisgICAgU2VuZCBzaWduYWwgdG8gcHJvY2VzcyhlcykuCisKKyAgICAtbAlMaXN0IHNpZ25hbCBuYW1lKHMpIGFuZCBudW1iZXIocykKKyAgICAtcwlTZW5kIFNJR05BTCAoZGVmYXVsdCBTSUdURVJNKQorCitjb25maWcgS0lMTEFMTDUKKyAgYm9vbCAia2lsbGFsbDUiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIEtJTEwKKyAgaGVscAorICAgIHVzYWdlOiBraWxsYWxsNSBbLWwgW1NJR05BTF1dIFstU0lHTkFMfC1zIFNJR05BTF0gWy1vIFBJRF0uLi4KKworICAgIFNlbmQgYSBzaWduYWwgdG8gYWxsIHByb2Nlc3NlcyBvdXRzaWRlIGN1cnJlbnQgc2Vzc2lvbi4KKworICAgIC1sICAgICBMaXN0IHNpZ25hbCBuYW1lKHMpIGFuZCBudW1iZXIocykKKyAgICAtbyBQSUQgT21pdCBQSUQKKyAgICAtcyAgICAgc2VuZCBTSUdOQUwgKGRlZmF1bHQgU0lHVEVSTSkKKyovCisKKy8vIFRoaXMgaGFzIHRvIG1hdGNoIHRoZSBmaWxlbmFtZToKKyNkZWZpbmUgRk9SX2tpbGwKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKnNpZ25hbWU7CisgIHN0cnVjdCBhcmdfbGlzdCAqb2xpc3Q7CispCisKKy8vIEJ1dCBraWxsJ3MgZmxhZ3MgYXJlIGEgc3Vic2V0IG9mIGtpbGxhbGw1J3MKKworI2RlZmluZSBDTEVBTlVQX2tpbGwKKyNkZWZpbmUgRk9SX2tpbGxhbGw1CisjaW5jbHVkZSAiZ2VuZXJhdGVkL2ZsYWdzLmgiCisKK3ZvaWQga2lsbF9tYWluKHZvaWQpCit7CisgIGludCBzaWdudW07CisgIGNoYXIgKnRtcCwgKiphcmdzID0gdG95cy5vcHRhcmdzOworICBwaWRfdCBwaWQ7CisKKyAgLy8gbGlzdCBzaWduYWwocykKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpIHsKKyAgICBpZiAoKmFyZ3MpIHsKKyAgICAgIGludCBzaWdudW0gPSBzaWdfdG9fbnVtKCphcmdzKTsKKyAgICAgIGNoYXIgKnMgPSBOVUxMOworCisgICAgICBpZiAoc2lnbnVtPj0wKSBzID0gbnVtX3RvX3NpZyhzaWdudW0mMTI3KTsKKyAgICAgIHB1dHMocyA/IHMgOiAiVU5LTk9XTiIpOworICAgIH0gZWxzZSBzaWdfdG9fbnVtKE5VTEwpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHNpZ25hbCBtdXN0IGNvbWUgYmVmb3JlIHBpZHMsIHNvICJraWxsIC05IC0xIiBpc24ndCBjb25mdXNpbmcuCisKKyAgaWYgKCFUVC5zaWduYW1lICYmICphcmdzICYmICoqYXJncz09Jy0nKSBUVC5zaWduYW1lPSooYXJncysrKSsxOworICBpZiAoVFQuc2lnbmFtZSkgeworICAgIGNoYXIgKmFyZzsKKyAgICBpbnQgaSA9IHN0cnRvbChUVC5zaWduYW1lLCAmYXJnLCAxMCk7CisgICAgaWYgKCEqYXJnKSBhcmcgPSBudW1fdG9fc2lnKGkpOworICAgIGVsc2UgYXJnID0gVFQuc2lnbmFtZTsKKworICAgIGlmICghYXJnIHx8IC0xID09IChzaWdudW0gPSBzaWdfdG9fbnVtKGFyZykpKQorICAgICAgZXJyb3JfZXhpdCgiVW5rbm93biBzaWduYWwgJyVzJyIsIGFyZyk7CisgIH0gZWxzZSBzaWdudW0gPSBTSUdURVJNOworCisgIC8vIGlzIGl0IGtpbGxhbGw1PworICBpZiAoQ0ZHX0tJTExBTEw1ICYmIHRveXMud2hpY2gtPm5hbWVbNF09PSdhJykgeworICAgIERJUiAqZHA7CisgICAgc3RydWN0IGRpcmVudCAqZW50cnk7CisgICAgaW50IHBpZCwgc2lkOworICAgIGxvbmcgKm9saXN0ID0gMCwgb2NvdW50ID0gMDsKKworICAgIC8vIHBhcnNlIG9taXQgbGlzdAorICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19vKSB7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnB0cjsKKworICAgICAgZm9yIChwdHIgPSBUVC5vbGlzdDsgcHRyOyBwdHIgPSBwdHItPm5leHQpIG9jb3VudCsrOworICAgICAgb2xpc3QgPSB4bWFsbG9jKG9jb3VudCpzaXplb2YobG9uZykpOworICAgICAgb2NvdW50ID0gMDsKKyAgICAgIGZvciAocHRyID0gVFQub2xpc3Q7IHB0cjsgcHRyPXB0ci0+bmV4dCkKKyAgICAgICAgb2xpc3Rbb2NvdW50KytdID0gYXRvbHgocHRyLT5hcmcpOworICAgIH0KKworICAgIHNpZCA9IGdldHNpZChwaWQgPSBnZXRwaWQoKSk7CisKKyAgICBpZiAoIShkcCA9IG9wZW5kaXIoIi9wcm9jIikpKSBwZXJyb3JfZXhpdCgiL3Byb2MiKTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkcCkpKSB7CisgICAgICBpbnQgY291bnQsIHByb2NwaWQsIHByb2NzaWQ7CisKKyAgICAgIGlmICghKHByb2NwaWQgPSBhdG9pKGVudHJ5LT5kX25hbWUpKSkgY29udGludWU7CisKKyAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvcHJvYy8lZC9zdGF0IiwgcHJvY3BpZCk7CisgICAgICBpZiAoIXJlYWRmaWxlKHRveWJ1ZiwgdG95YnVmLCBzaXplb2YodG95YnVmKSkpIGNvbnRpbnVlOworICAgICAgaWYgKHNzY2FuZih0b3lidWYsICIlKmQgJSpzICUqYyAlKmQgJSpkICVkIiwgJnByb2NzaWQpICE9IDEpIGNvbnRpbnVlOworICAgICAgaWYgKHBpZCA9PSBwcm9jcGlkIHx8IHNpZCA9PSBwcm9jc2lkIHx8IHByb2NwaWQgPT0gMSkgY29udGludWU7CisKKyAgICAgIC8vIENoZWNrIGZvciBrZXJuZWwgdGhyZWFkcy4KKyAgICAgIHNucHJpbnRmKHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZiksICIvcHJvYy8lZC9jbWRsaW5lIiwgcHJvY3BpZCk7CisgICAgICBpZiAoIXJlYWRmaWxlKHRveWJ1ZiwgdG95YnVmLCBzaXplb2YodG95YnVmKSkgfHwgISp0b3lidWYpIGNvbnRpbnVlOworCisgICAgICAvLyBDaGVjayB3aXRoIG9taXQgbGlzdC4KKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9jb3VudDsgY291bnQrKykgCisgICAgICAgIGlmIChwcm9jcGlkID09IG9saXN0W2NvdW50XSkgYnJlYWs7CisgICAgICBpZiAoY291bnQgIT0gb2NvdW50KSBjb250aW51ZTsKKworICAgICAga2lsbChwcm9jcGlkLCBzaWdudW0pOworICAgIH0KKyAgICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSB7CisgICAgICBjbG9zZWRpcihkcCk7CisgICAgICBmcmVlKG9saXN0KTsKKyAgICB9CisKKyAgLy8gaXMgaXQga2lsbD8KKyAgfSBlbHNlIHsKKworICAgIC8vICI8MSIgaW4gb3B0c3RyIHdvdWxkbid0IGNvdmVyIHRoaXMgYmVjYXVzZSAiLVNJR05BTCIKKyAgICBpZiAoISphcmdzKSBoZWxwX2V4aXQoIm1pc3NpbmcgYXJndW1lbnQiKTsKKworICAgIHdoaWxlICgqYXJncykgeworICAgICAgY2hhciAqYXJnID0gKihhcmdzKyspOworCisgICAgICBwaWQgPSBzdHJ0b2woYXJnLCAmdG1wLCAxMCk7CisgICAgICBpZiAoKnRtcCB8fCBraWxsKHBpZCwgc2lnbnVtKSA8IDApIGVycm9yX21zZygidW5rbm93biBwaWQgJyVzJyIsIGFyZyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQga2lsbGFsbDVfbWFpbih2b2lkKQoreworICBraWxsX21haW4oKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L2xpbmsuYyBiL3RveWJveC90b3lzL3Bvc2l4L2xpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQyY2YwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvbGluay5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGxpbmsuYyAtIGhhcmRsaW5rIGEgZmlsZQorICoKKyAqIENvcHlyaWdodCAyMDExIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbGluay5odG1sCisKK1VTRV9MSU5LKE5FV1RPWShsaW5rLCAiPDI+MiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIExJTksKKyAgYm9vbCAibGluayIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbGluayBGSUxFIE5FV0xJTksKKworICAgIENyZWF0ZSBoYXJkbGluayB0byBhIGZpbGUuCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIGxpbmtfbWFpbih2b2lkKQoreworICBpZiAobGluayh0b3lzLm9wdGFyZ3NbMF0sIHRveXMub3B0YXJnc1sxXSkpCisgICAgcGVycm9yX2V4aXQoImNvdWxkbid0IGxpbmsgJyVzJyB0byAnJXMnIiwgdG95cy5vcHRhcmdzWzFdLAorICAgICAgdG95cy5vcHRhcmdzWzBdKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L2xuLmMgYi90b3lib3gvdG95cy9wb3NpeC9sbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzAwZGQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9sbi5jCkBAIC0wLDAgKzEsODggQEAKKy8qIGxuLmMgLSBDcmVhdGUgZmlsZXN5c3RlbSBsaW5rcworICoKKyAqIENvcHlyaWdodCAyMDEyIEFuZHJlIFJlbmF1ZCA8YW5kcmVAYmx1ZXdhdGVyc3lzLmNvbT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9sbi5odG1sCisKK1VTRV9MTihORVdUT1kobG4sICI8MXZuZnMiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBMTgorICBib29sICJsbiIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbG4gWy1zZm52XSBbRlJPTS4uLl0gVE8KKworICAgIENyZWF0ZSBhIGxpbmsgYmV0d2VlbiBGUk9NIGFuZCBUTy4KKyAgICBXaXRoIG9ubHkgb25lIGFyZ3VtZW50LCBjcmVhdGUgbGluayBpbiBjdXJyZW50IGRpcmVjdG9yeS4KKworICAgIC1zCUNyZWF0ZSBhIHN5bWJvbGljIGxpbmsKKyAgICAtZglGb3JjZSB0aGUgY3JlYXRpb24gb2YgdGhlIGxpbmssIGV2ZW4gaWYgVE8gYWxyZWFkeSBleGlzdHMKKyAgICAtbglTeW1saW5rIGF0IGRlc3RpbmF0aW9uIHRyZWF0ZWQgYXMgZmlsZQorICAgIC12CVZlcmJvc2UKKyovCisKKyNkZWZpbmUgRk9SX2xuCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIGxuX21haW4odm9pZCkKK3sKKyAgY2hhciAqZGVzdCA9IHRveXMub3B0YXJnc1stLXRveXMub3B0Y10sICpuZXc7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgaW50IGk7CisKKyAgLy8gV2l0aCBvbmUgYXJndW1lbnQsIGNyZWF0ZSBsaW5rIGluIGN1cnJlbnQgZGlyZWN0b3J5LgorICBpZiAoIXRveXMub3B0YykgeworICAgIHRveXMub3B0YysrOworICAgIGRlc3Q9Ii4iOworICB9CisKKyAgLy8gSXMgZGVzdGluYXRpb24gYSBkaXJlY3Rvcnk/CisgIGlmICgoKHRveXMub3B0ZmxhZ3MmRkxBR19uKSA/IGxzdGF0IDogc3RhdCkoZGVzdCwgJmJ1ZikKKyAgICB8fCAhU19JU0RJUihidWYuc3RfbW9kZSkpCisgIHsKKyAgICBpZiAodG95cy5vcHRjPjEpIGVycm9yX2V4aXQoIiclcycgbm90IGEgZGlyZWN0b3J5IiwgZGVzdCk7CisgICAgYnVmLnN0X21vZGUgPSAwOworICB9CisKKyAgZm9yIChpPTA7IGk8dG95cy5vcHRjOyBpKyspIHsKKyAgICBpbnQgcmM7CisgICAgY2hhciAqb2xkbmV3LCAqdHJ5ID0gdG95cy5vcHRhcmdzW2ldOworCisgICAgaWYgKFNfSVNESVIoYnVmLnN0X21vZGUpKSBuZXcgPSB4bXByaW50ZigiJXMvJXMiLCBkZXN0LCBiYXNlbmFtZSh0cnkpKTsKKyAgICBlbHNlIG5ldyA9IGRlc3Q7CisKKyAgICAvLyBGb3JjZSBuZWVkcyB0byB1bmxpbmsgdGhlIGV4aXN0aW5nIHRhcmdldCAoaWYgYW55KS4gRG8gdGhhdCBieSBjcmVhdGluZworICAgIC8vIGEgdGVtcCB2ZXJzaW9uIGFuZCByZW5hbWluZyBpdCBvdmVyIHRoZSBvbGQgb25lLCBzbyB3ZSBjYW4gcmV0YWluIHRoZQorICAgIC8vIG9sZCBmaWxlIGluIGNhc2VzIHdlIGNhbid0IHJlcGxhY2UgaXQgKHN1Y2ggYXMgaGFyZGxpbmsgYmV0d2VlbiBtb3VudHMpLgorICAgIG9sZG5ldyA9IG5ldzsKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZikgeworICAgICAgbmV3ID0geG1wcmludGYoIiVzX1hYWFhYWCIsIG5ldyk7CisgICAgICByYyA9IG1rc3RlbXAobmV3KTsKKyAgICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAgIGNsb3NlKHJjKTsKKyAgICAgICAgaWYgKHVubGluayhuZXcpKSBwZXJyb3JfbXNnKCJ1bmxpbmsgJyVzJyIsIG5ldyk7CisgICAgICB9CisgICAgfQorCisgICAgcmMgPSAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgPyBzeW1saW5rKHRyeSwgbmV3KSA6IGxpbmsodHJ5LCBuZXcpOworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSB7CisgICAgICBpZiAoIXJjKSB7CisgICAgICAgIGludCB0ZW1wOworCisgICAgICAgIHJjID0gcmVuYW1lKG5ldywgb2xkbmV3KTsKKyAgICAgICAgdGVtcCA9IGVycm5vOworICAgICAgICBpZiAocmMgJiYgdW5saW5rKG5ldykpIHBlcnJvcl9tc2coInVubGluayAnJXMnIiwgbmV3KTsKKyAgICAgICAgZXJybm8gPSB0ZW1wOworICAgICAgfQorICAgICAgZnJlZShuZXcpOworICAgICAgbmV3ID0gb2xkbmV3OworICAgIH0KKyAgICBpZiAocmMpCisgICAgICBwZXJyb3JfbXNnKCJjYW5ub3QgY3JlYXRlICVzIGxpbmsgZnJvbSAnJXMnIHRvICclcyciLAorICAgICAgICAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgPyAic3ltYm9saWMiIDogImhhcmQiLCB0cnksIG5ldyk7CisgICAgZWxzZQorICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpIGZwcmludGYoc3RkZXJyLCAiJyVzJyAtPiAnJXMnXG4iLCBuZXcsIHRyeSk7CisKKyAgICBpZiAobmV3ICE9IGRlc3QpIGZyZWUobmV3KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvbHMuYyBiL3RveWJveC90b3lzL3Bvc2l4L2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxODFjMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L2xzLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qIGxzLmMgLSBsaXN0IGZpbGVzCisgKgorICogQ29weXJpZ2h0IDIwMTIgQW5kcmUgUmVuYXVkIDxhbmRyZUBibHVld2F0ZXJzeXMuY29tPgorICogQ29weXJpZ2h0IDIwMTIgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9scy5odG1sCisKK1VTRV9MUyhORVdUT1kobHMsIFVTRV9MU19DT0xPUigiKGNvbG9yKTo7IikiWmdvQUNGSExSU2FiY2RmaGlrbG1ucHFyc3R1eDFbLUN4bTFdWy1DeG1sXVstQ3htb11bLUN4bWddWy1jdV1bLWZ0U11bLUhMXVshcWJdIiwgVE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorCitjb25maWcgTFMKKyAgYm9vbCAibHMiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IGxzIFstQUNGSExSU1phY2RmaGlrbG1ucHFyc3R1eDFdIFtkaXJlY3RvcnkuLi5dCisKKyAgICBsaXN0IGZpbGVzCisKKyAgICB3aGF0IHRvIHNob3c6CisgICAgLWEgIGFsbCBmaWxlcyBpbmNsdWRpbmcgLmhpZGRlbiAgICAtYiAgZXNjYXBlIG5vbmdyYXBoaWMgY2hhcnMKKyAgICAtYyAgdXNlIGN0aW1lIGZvciB0aW1lc3RhbXBzICAgICAgIC1kICBkaXJlY3RvcnksIG5vdCBjb250ZW50cworICAgIC1pICBpbm9kZSBudW1iZXIgICAgICAgICAgICAgICAgICAgLWsgIGJsb2NrIHNpemVzIGluIGtpbG9ieXRlcworICAgIC1wICBwdXQgYSAnLycgYWZ0ZXIgZGlyIG5hbWVzICAgICAgLXEgIHVucHJpbnRhYmxlIGNoYXJzIGFzICc/JworICAgIC1zICBzaXplIChpbiBibG9ja3MpICAgICAgICAgICAgICAgLXUgIHVzZSBhY2Nlc3MgdGltZSBmb3IgdGltZXN0YW1wcworICAgIC1BICBsaXN0IGFsbCBmaWxlcyBidXQgLiBhbmQgLi4gICAgLUggIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MKKyAgICAtTCAgZm9sbG93IHN5bWxpbmtzICAgICAgICAgICAgICAgIC1SICByZWN1cnNpdmVseSBsaXN0IGZpbGVzIGluIHN1YmRpcnMKKyAgICAtRiAgYXBwZW5kIC9kaXIgKmV4ZSBAc3ltIHxGSUZPICAgIC1aICBzZWN1cml0eSBjb250ZXh0CisKKyAgICBvdXRwdXQgZm9ybWF0czoKKyAgICAtMSAgbGlzdCBvbmUgZmlsZSBwZXIgbGluZSAgICAgICAgIC1DICBjb2x1bW5zIChzb3J0ZWQgdmVydGljYWxseSkKKyAgICAtZyAgbGlrZSAtbCBidXQgbm8gb3duZXIgICAgICAgICAgIC1oICBodW1hbiByZWFkYWJsZSBzaXplcworICAgIC1sICBsb25nIChzaG93IGZ1bGwgZGV0YWlscykgICAgICAgLW0gIGNvbW1hIHNlcGFyYXRlZAorICAgIC1uICBsaWtlIC1sIGJ1dCBudW1lcmljIHVpZC9naWQgICAgLW8gIGxpa2UgLWwgYnV0IG5vIGdyb3VwCisgICAgLXggIGNvbHVtbnMgKGhvcml6b250YWwgc29ydCkKKworICAgIHNvcnRpbmcgKGRlZmF1bHQgaXMgYWxwaGFiZXRpY2FsKToKKyAgICAtZiAgdW5zb3J0ZWQgICAgLXIgIHJldmVyc2UgICAgLXQgIHRpbWVzdGFtcCAgICAtUyAgc2l6ZQorCitjb25maWcgTFNfQ09MT1IKKyAgYm9vbCAibHMgLS1jb2xvciIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gTFMKKyAgaGVscAorICAgIHVzYWdlOiBscyAtLWNvbG9yWz1hdXRvXQorCisgICAgLS1jb2xvciAgZGV2aWNlPXllbGxvdyAgc3ltbGluaz10dXJxdW9pc2UvcmVkICBkaXI9Ymx1ZSAgc29ja2V0PXB1cnBsZQorICAgICAgICAgICAgIGZpbGVzOiBleGU9Z3JlZW4gIHN1aWQ9cmVkICBzdWlkZmlsZT1yZWRiYWNrICBzdGlja3lkaXI9Z3JlZW5iYWNrCisgICAgICAgICAgICAgPWF1dG8gbWVhbnMgZGV0ZWN0IGlmIG91dHB1dCBpcyBhIHR0eS4KKyovCisKKyNkZWZpbmUgRk9SX2xzCisjaW5jbHVkZSAidG95cy5oIgorCisvLyB0ZXN0IHNzdCBvdXRwdXQgKHN1aWQvc3RpY2t5IGluIGxzIGZsYWdsaXN0KQorCisvLyBscyAtbFIgc3RhcnRzIC46IHRoZW4gLi9zdWJkaXI6CisKK0dMT0JBTFMoCisgIGNoYXIgKmNvbG9yOworCisgIHN0cnVjdCBkaXJ0cmVlICpmaWxlcywgKnNpbmdsZWRpcjsKKworICB1bnNpZ25lZCBzY3JlZW5fd2lkdGg7CisgIGludCBubF90aXRsZTsKKyAgY2hhciAqZXNjbW9yZTsKKykKKworLy8gQ2FsbGJhY2sgZnJvbSBjcnVuY2hfc3RyIHRvIHJlcHJlc2VudCB1bnByaW50YWJsZSBjaGFycworaW50IGNydW5jaF9xYihGSUxFICpvdXQsIGludCBjb2xzLCBpbnQgd2MpCit7CisgIHVuc2lnbmVkIGxlbiA9IDE7CisgIGNoYXIgYnVmWzMyXTsKKworICBpZiAodG95cy5vcHRmbGFncyZGTEFHX3EpICpidWYgPSAnPyc7CisgIGVsc2UgeworICAgIGlmICh3YzwyNTYpICpidWYgPSB3YzsKKyAgICAvLyBzY3J1dGUgdGhlIGluc2NydXRhYmxlLCBlZmYgdGhlIGluZWZmYWJsZSwgcHJpbnQgdGhlIHVucHJpbnRhYmxlCisgICAgZWxzZSBsZW4gPSB3Y3J0b21iKGJ1Ziwgd2MsIDApOworICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfYikgeworICAgICAgY2hhciAqdG8gPSBidWYsICpmcm9tID0gYnVmKzI0OworICAgICAgaW50IGksIGo7CisKKyAgICAgIG1lbWNweShmcm9tLCB0bywgOCk7CisgICAgICBmb3IgKGkgPSAwOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICp0bysrID0gJ1xcJzsKKyAgICAgICAgaWYgKHN0cmNocihUVC5lc2Ntb3JlLCBmcm9tW2ldKSkgKnRvKysgPSBmcm9tW2ldOworICAgICAgICBlbHNlIGlmICgtMSAhPSAoaiA9IHN0cmlkeCgiXFxcYVxiXDAzM1xmXG5cclx0XHYiLCBmcm9tW2ldKSkpCisgICAgICAgICAgKnRvKysgPSAiXFxhYmVmbnJ0diJbal07CisgICAgICAgIGVsc2UgdG8gKz0gc3ByaW50Zih0bywgIiUwM28iLCBmcm9tW2ldKTsKKyAgICAgIH0KKyAgICAgIGxlbiA9IHRvLWJ1ZjsKKyAgICB9CisgIH0KKworICBpZiAoY29sczxsZW4pIGxlbiA9IGNvbHM7CisgIGlmIChvdXQpIGZ3cml0ZShidWYsIGxlbiwgMSwgb3V0KTsKKworICByZXR1cm4gbGVuOworfQorCisvLyBSZXR1cm5zIHdjd2lkdGgodXRmOCkgdmVyc2lvbiBvZiBzdHJsZW4gd2l0aCAtcWIgZXNjYXBlcworaW50IHN0cndpZHRoKGNoYXIgKnMpCit7CisgIHJldHVybiBjcnVuY2hfc3RyKCZzLCBJTlRfTUFYLCAwLCBUVC5lc2Ntb3JlLCBjcnVuY2hfcWIpOworfQorCit2b2lkIHFic3RyKGNoYXIgKnMsIGludCB3aWR0aCkKK3sKKyAgZHJhd190cmltX2VzYyhzLCB3aWR0aCwgYWJzKHdpZHRoKSwgVFQuZXNjbW9yZSwgY3J1bmNoX3FiKTsKK30gCisKK3N0YXRpYyBjaGFyIGVuZHR5cGUoc3RydWN0IHN0YXQgKnN0KQoreworICBtb2RlX3QgbW9kZSA9IHN0LT5zdF9tb2RlOworICBpZiAoKHRveXMub3B0ZmxhZ3MmKEZMQUdfRnxGTEFHX3ApKSAmJiBTX0lTRElSKG1vZGUpKSByZXR1cm4gJy8nOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfRikgeworICAgIGlmIChTX0lTTE5LKG1vZGUpKSByZXR1cm4gJ0AnOworICAgIGlmIChTX0lTUkVHKG1vZGUpICYmIChtb2RlJjAxMTEpKSByZXR1cm4gJyonOworICAgIGlmIChTX0lTRklGTyhtb2RlKSkgcmV0dXJuICd8JzsKKyAgICBpZiAoU19JU1NPQ0sobW9kZSkpIHJldHVybiAnPSc7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVtbGVuKGxvbmcgbG9uZyBsbCkKK3sKKyAgcmV0dXJuIHNucHJpbnRmKDAsIDAsICIlbGx1IiwgbGwpOworfQorCisvLyBGaWd1cmUgb3V0IHNpemUgb2YgcHJpbnRhYmxlIGVudHJ5IGZpZWxkcyBmb3IgZGlzcGxheSBpbmRlbnQvd3JhcAorCitzdGF0aWMgdm9pZCBlbnRyeWxlbihzdHJ1Y3QgZGlydHJlZSAqZHQsIHVuc2lnbmVkICpsZW4pCit7CisgIHN0cnVjdCBzdGF0ICpzdCA9ICYoZHQtPnN0KTsKKyAgdW5zaWduZWQgZmxhZ3MgPSB0b3lzLm9wdGZsYWdzOworICBjaGFyIHRtcFs2NF07CisKKyAgKmxlbiA9IHN0cndpZHRoKGR0LT5uYW1lKTsKKyAgaWYgKGVuZHR5cGUoc3QpKSArKypsZW47CisgIGlmIChmbGFncyAmIEZMQUdfbSkgKysqbGVuOworCisgIGxlblsxXSA9IChmbGFncyAmIEZMQUdfaSkgPyBudW1sZW4oc3QtPnN0X2lubykgOiAwOworICBpZiAoZmxhZ3MgJiAoRkxBR19sfEZMQUdfb3xGTEFHX258RkxBR19nKSkgeworICAgIHVuc2lnbmVkIGZuID0gZmxhZ3MgJiBGTEFHX247CisgICAgbGVuWzJdID0gbnVtbGVuKHN0LT5zdF9ubGluayk7CisgICAgbGVuWzNdID0gZm4gPyBudW1sZW4oc3QtPnN0X3VpZCkgOiBzdHJ3aWR0aChnZXR1c2VybmFtZShzdC0+c3RfdWlkKSk7CisgICAgbGVuWzRdID0gZm4gPyBudW1sZW4oc3QtPnN0X2dpZCkgOiBzdHJ3aWR0aChnZXRncm91cG5hbWUoc3QtPnN0X2dpZCkpOworICAgIGlmIChTX0lTQkxLKHN0LT5zdF9tb2RlKSB8fCBTX0lTQ0hSKHN0LT5zdF9tb2RlKSkgeworICAgICAgLy8gY2hlYXRpbmcgc2xpZ2h0bHkgaGVyZTogYXNzdW1pbmcgbWlub3IgaXMgYWx3YXlzIDMgZGlnaXRzIHRvIGF2b2lkCisgICAgICAvLyB0cmFja2luZyBhbm90aGVyIGNvbHVtbgorICAgICAgbGVuWzVdID0gbnVtbGVuKGRldl9tYWpvcihzdC0+c3RfcmRldikpKzU7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIEZMQUdfaCkgeworICAgICAgICBodW1hbl9yZWFkYWJsZSh0bXAsIHN0LT5zdF9zaXplLCAwKTsKKyAgICAgICAgbGVuWzVdID0gc3Ryd2lkdGgodG1wKTsKKyAgICB9IGVsc2UgbGVuWzVdID0gbnVtbGVuKHN0LT5zdF9zaXplKTsKKyAgfQorCisgIGxlbls2XSA9IChmbGFncyAmIEZMQUdfcykgPyBudW1sZW4oc3QtPnN0X2Jsb2NrcykgOiAwOworICBsZW5bN10gPSAoZmxhZ3MgJiBGTEFHX1opID8gc3Ryd2lkdGgoKGNoYXIgKilkdC0+ZXh0cmEpIDogMDsKK30KKworc3RhdGljIGludCBjb21wYXJlKHZvaWQgKmEsIHZvaWQgKmIpCit7CisgIHN0cnVjdCBkaXJ0cmVlICpkdGEgPSAqKHN0cnVjdCBkaXJ0cmVlICoqKWE7CisgIHN0cnVjdCBkaXJ0cmVlICpkdGIgPSAqKHN0cnVjdCBkaXJ0cmVlICoqKWI7CisgIGludCByZXQgPSAwLCByZXZlcnNlID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpID8gLTEgOiAxOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19TKSB7CisgICAgaWYgKGR0YS0+c3Quc3Rfc2l6ZSA+IGR0Yi0+c3Quc3Rfc2l6ZSkgcmV0ID0gLTE7CisgICAgZWxzZSBpZiAoZHRhLT5zdC5zdF9zaXplIDwgZHRiLT5zdC5zdF9zaXplKSByZXQgPSAxOworICB9CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR190KSB7CisgICAgaWYgKGR0YS0+c3Quc3RfbXRpbWUgPiBkdGItPnN0LnN0X210aW1lKSByZXQgPSAtMTsKKyAgICBlbHNlIGlmIChkdGEtPnN0LnN0X210aW1lIDwgZHRiLT5zdC5zdF9tdGltZSkgcmV0ID0gMTsKKyAgfQorICBpZiAoIXJldCkgcmV0ID0gc3RyY21wKGR0YS0+bmFtZSwgZHRiLT5uYW1lKTsKKyAgcmV0dXJuIHJldCAqIHJldmVyc2U7Cit9CisKKy8vIGNhbGxiYWNrIGZyb20gZGlydHJlZV9yZWN1cnNlKCkgZGV0ZXJtaW5pbmcgaG93IHRvIGhhbmRsZSB0aGlzIGVudHJ5LgorCitzdGF0aWMgaW50IGZpbHRlcihzdHJ1Y3QgZGlydHJlZSAqbmV3KQoreworICBpbnQgZmxhZ3MgPSB0b3lzLm9wdGZsYWdzOworCisgIC8vIFNwZWNpYWwgY2FzZSB0byBoYW5kbGUgZW5vcm1vdXMgZGlycyB3aXRob3V0IHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4KKyAgaWYgKGZsYWdzID09IChGTEFHXzF8RkxBR19mKSkgeworICAgIHhwcmludGYoIiVzXG4iLCBuZXctPm5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGZsYWdzICYgRkxBR19aKSB7CisgICAgaWYgKCFDRkdfVE9ZQk9YX0xTTV9OT05FKSB7CisKKyAgICAgIC8vIChXb3VsZG4ndCBpdCBiZSBuaWNlIGlmIHRoZSBsc20gZnVuY3Rpb25zIHdvcmtlZCBsaWtlIG9wZW5hdCgpLAorICAgICAgLy8gZmNobW9kYXQoKSwgbWtub2RhdCgpLCByZWFkbGlua2F0KCkgc28gd2UgY291bGQgZG8gdGhpcyB3aXRob3V0CisgICAgICAvLyBldmVuIE9fUEFUSD8gQnV0IG5vLCB0aGlzIGlzIDE5OTAncyB0ZWNoLikKKyAgICAgIGludCBmZCA9IG9wZW5hdChkaXJ0cmVlX3BhcmVudGZkKG5ldyksIG5ldy0+bmFtZSwKKyAgICAgICAgT19QQVRIfChPX05PRk9MTE9XKiEodG95cy5vcHRmbGFncyZGTEFHX0wpKSk7CisKKyAgICAgIGlmIChmZCAhPSAtMSkgeworICAgICAgICBpZiAoLTEgPT0gbHNtX2ZnZXRfY29udGV4dChmZCwgKGNoYXIgKiopJm5ldy0+ZXh0cmEpICYmIGVycm5vID09IEVCQURGKQorICAgICAgICB7CisgICAgICAgICAgY2hhciBoYWNrWzMyXTsKKworICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGtlcm5lbCBidWcgdGhhdCB3b24ndCBsZXQgdXMgcmVhZCB0aGlzICJtZXRhZGF0YSIgZnJvbQorICAgICAgICAgIC8vIHRoZSBmaWxlaGFuZGxlIHVubGVzcyB3ZSBoYXZlIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgZGF0YS4gKFdlIGNhbgorICAgICAgICAgIC8vIHF1ZXJ5IHRoZSBzYW1lIGRhdGEgaW4gYnkgcGF0aCwgYnV0IGNhbid0IGRvIGl0IHRocm91Z2ggYW4gT19QQVRICisgICAgICAgICAgLy8gZmlsZWhhbmRsZSwgYmVjYXVzZSByZWFzb25zLiBCdXQgZm9yIHNvbWUgcmVhc29uLCBUSElTIGlzIG9rPyBJZgorICAgICAgICAgIC8vIHRoZXkgZXZlciBmaXggdGhlIGtlcm5lbCwgdGhpcyBzaG91bGQgc3RvcCB0cmlnZ2VyaW5nLikKKworICAgICAgICAgIHNwcmludGYoaGFjaywgIi9wcm9jL3NlbGYvZmQvJWQiLCBmZCk7CisgICAgICAgICAgbHNtX2xnZXRfY29udGV4dChoYWNrLCAoY2hhciAqKikmbmV3LT5leHRyYSk7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoQ0ZHX1RPWUJPWF9MU01fTk9ORSB8fCAhbmV3LT5leHRyYSkgbmV3LT5leHRyYSA9IChsb25nKXhzdHJkdXAoIj8iKTsKKyAgfQorCisgIGlmIChmbGFncyAmIEZMQUdfdSkgbmV3LT5zdC5zdF9tdGltZSA9IG5ldy0+c3Quc3RfYXRpbWU7CisgIGlmIChmbGFncyAmIEZMQUdfYykgbmV3LT5zdC5zdF9tdGltZSA9IG5ldy0+c3Quc3RfY3RpbWU7CisgIGlmIChmbGFncyAmIEZMQUdfaykgbmV3LT5zdC5zdF9ibG9ja3MgPSAobmV3LT5zdC5zdF9ibG9ja3MgKyAxKSAvIDI7CisKKyAgaWYgKGZsYWdzICYgKEZMQUdfYXxGTEFHX2YpKSByZXR1cm4gRElSVFJFRV9TQVZFOworICBpZiAoIShmbGFncyAmIEZMQUdfQSkgJiYgbmV3LT5uYW1lWzBdPT0nLicpIHJldHVybiAwOworCisgIHJldHVybiBkaXJ0cmVlX25vdGRvdGRvdChuZXcpICYgRElSVFJFRV9TQVZFOworfQorCisvLyBGb3IgY29sdW1uIHZpZXcsIGNhbGN1bGF0ZSBob3Jpem9udGFsIHBvc2l0aW9uIChmb3IgcGFkZGluZykgYW5kIHJldHVybgorLy8gaW5kZXggb2YgbmV4dCBlbnRyeSB0byBkaXNwbGF5LgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2NvbHVtbih1bnNpZ25lZCBsb25nIHVsLCB1bnNpZ25lZCBsb25nIGR0bGVuLAorICB1bnNpZ25lZCBjb2x1bW5zLCB1bnNpZ25lZCAqeHBvcykKK3sKKyAgdW5zaWduZWQgbG9uZyB0cmFuc2l0aW9uOworICB1bnNpZ25lZCBoZWlnaHQsIHdpZGVjb2xzOworCisgIC8vIEhvcml6b250YWwgc29ydCBpcyBlYXN5CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX0MpKSB7CisgICAgKnhwb3MgPSB1bCAlIGNvbHVtbnM7CisgICAgcmV0dXJuIHVsOworICB9CisKKyAgLy8gdmVydGljYWwgc29ydAorCisgIC8vIEZvciAteCwgY2FsY3VsYXRlIGhlaWdodCBvZiBkaXNwbGF5LCByb3VuZGVkIHVwCisgIGhlaWdodCA9IChkdGxlbitjb2x1bW5zLTEpL2NvbHVtbnM7CisKKyAgLy8gU2FuaXR5IGNoZWNrOiBkb2VzIHdyYXBwaW5nIHJlbmRlciB0aGlzIGNvbHVtbiBjb3VudCBpbXBvc3NpYmxlCisgIC8vIGR1ZSB0byB0aGUgcmlnaHQgZWRnZSB3cmFwcGluZyBlYXRpbmcgYSB3aG9sZSByb3c/CisgIGlmIChoZWlnaHQqY29sdW1ucyAtIGR0bGVuID49IGhlaWdodCkgeworICAgICp4cG9zID0gY29sdW1uczsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFVuZXZlbiByb3VuZGluZyBnb2VzIGFsb25nIHJpZ2h0IGVkZ2UKKyAgd2lkZWNvbHMgPSBkdGxlbiAlIGhlaWdodDsKKyAgaWYgKCF3aWRlY29scykgd2lkZWNvbHMgPSBoZWlnaHQ7CisgIHRyYW5zaXRpb24gPSB3aWRlY29scyAqIGNvbHVtbnM7CisgIGlmICh1bCA8IHRyYW5zaXRpb24pIHsKKyAgICAqeHBvcyA9ICB1bCAlIGNvbHVtbnM7CisgICAgcmV0dXJuICgqeHBvcypoZWlnaHQpICsgKHVsL2NvbHVtbnMpOworICB9CisKKyAgdWwgLT0gdHJhbnNpdGlvbjsKKyAgKnhwb3MgPSB1bCAlIChjb2x1bW5zLTEpOworCisgIHJldHVybiAoKnhwb3MqaGVpZ2h0KSArIHdpZGVjb2xzICsgKHVsLyhjb2x1bW5zLTEpKTsKK30KKworaW50IGNvbG9yX2Zyb21fbW9kZShtb2RlX3QgbW9kZSkKK3sKKyAgaW50IGNvbG9yID0gMDsKKworICBpZiAoU19JU0RJUihtb2RlKSkgY29sb3IgPSAyNTYrMzQ7CisgIGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIGNvbG9yID0gMjU2KzM2OworICBlbHNlIGlmIChTX0lTQkxLKG1vZGUpIHx8IFNfSVNDSFIobW9kZSkpIGNvbG9yID0gMjU2KzMzOworICBlbHNlIGlmIChTX0lTUkVHKG1vZGUpICYmIChtb2RlJjAxMTEpKSBjb2xvciA9IDI1NiszMjsKKyAgZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpIGNvbG9yID0gMzM7CisgIGVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKSBjb2xvciA9IDI1NiszNTsKKworICByZXR1cm4gY29sb3I7Cit9CisKKy8vIERpc3BsYXkgYSBsaXN0IG9mIGRpcnRyZWUgZW50cmllcywgYWNjb3JkaW5nIHRvIGN1cnJlbnQgZm9ybWF0CisvLyBPdXRwdXQgdHlwZXMgLTEsIC1sLCAtQywgb3Igc3RyZWFtCisKK3N0YXRpYyB2b2lkIGxpc3RmaWxlcyhpbnQgZGlyZmQsIHN0cnVjdCBkaXJ0cmVlICppbmRpcikKK3sKKyAgc3RydWN0IGRpcnRyZWUgKmR0LCAqKnNvcnQ7CisgIHVuc2lnbmVkIGxvbmcgZHRsZW4sIHVsID0gMDsKKyAgdW5zaWduZWQgd2lkdGgsIGZsYWdzID0gdG95cy5vcHRmbGFncywgdG90YWxzWzhdLCBsZW5bOF0sIHRvdHBhZCA9IDAsCisgICAgKmNvbHNpemVzID0gKHVuc2lnbmVkICopKHRveWJ1ZisyNjApLCBjb2x1bW5zID0gKHNpemVvZih0b3lidWYpLTI2MCkvNDsKKyAgY2hhciB0bXBbNjRdOworCisgIGlmICgtMSA9PSBkaXJmZCkgeworICAgIHBlcnJvcl9tc2dfcmF3KGluZGlyLT5uYW1lKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIG1lbXNldCh0b3RhbHMsIDAsIHNpemVvZih0b3RhbHMpKTsKKyAgaWYgKENGR19UT1lCT1hfT05fQU5EUk9JRCB8fCBDRkdfVE9ZQk9YX0RFQlVHKSBtZW1zZXQobGVuLCAwLCBzaXplb2YobGVuKSk7CisKKyAgLy8gVG9wIGxldmVsIGRpcmVjdG9yeSB3YXMgYWxyZWFkeSBwb3B1bGF0ZWQgYnkgbWFpbigpCisgIGlmICghaW5kaXItPnBhcmVudCkgeworICAgIC8vIFNpbGVudGx5IGRlc2NlbmQgaW50byBzaW5nbGUgZGlyZWN0b3J5IGxpc3RlZCBieSBpdHNlbGYgb24gY29tbWFuZCBsaW5lLgorICAgIC8vIEluIHRoaXMgY2FzZSBvbmx5IHNob3cgZGlybmFtZS90b3RhbCBoZWFkZXIgd2hlbiBnaXZlbiAtUi4KKyAgICBkdCA9IGluZGlyLT5jaGlsZDsKKyAgICBpZiAoZHQgJiYgU19JU0RJUihkdC0+c3Quc3RfbW9kZSkgJiYgIWR0LT5uZXh0ICYmICEoZmxhZ3MmKEZMQUdfZHxGTEFHX1IpKSkKKyAgICB7CisgICAgICBsaXN0ZmlsZXMob3BlbihkdC0+bmFtZSwgMCksIFRULnNpbmdsZWRpciA9IGR0KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERvIHByZXByb2Nlc3NpbmcgKERpcnRyZWUgZGlkbid0IHBvcHVsYXRlLCBzbyBjYWxsYmFjayB3YXNuJ3QgY2FsbGVkLikKKyAgICBmb3IgKDtkdDsgZHQgPSBkdC0+bmV4dCkgZmlsdGVyKGR0KTsKKyAgICBpZiAoZmxhZ3MgPT0gKEZMQUdfMXxGTEFHX2YpKSByZXR1cm47CisgIC8vIFJlYWQgZGlyZWN0b3J5IGNvbnRlbnRzLiBXZSBkdXAoKSB0aGUgZmQgYmVjYXVzZSB0aGlzIHdpbGwgY2xvc2UgaXQuCisgIC8vIFRoaXMgcmVhZHMvc2F2ZXMgY29udGVudHMgdG8gZGlzcGxheSBsYXRlciwgZXhjZXB0IGZvciBpbiAibHMgLTFmIiBtb2RlLgorICB9IGVsc2UgIGRpcnRyZWVfcmVjdXJzZShpbmRpciwgZmlsdGVyLCBkdXAoZGlyZmQpLAorICAgICAgRElSVFJFRV9TWU1GT0xMT1cqISEoZmxhZ3MmRkxBR19MKSk7CisKKyAgLy8gQ29weSBsaW5rZWQgbGlzdCB0byBhcnJheSBhbmQgc29ydCBpdC4gRGlyZWN0b3JpZXMgZ28gaW4gYXJyYXkgYmVjYXVzZQorICAvLyB3ZSB2aXNpdCB0aGVtIGluIHNvcnRlZCBvcmRlciB0b28uIChUaGUgbmVzdGVkIGxvb3BzIGxldCB1cyBtZWFzdXJlIGFuZAorICAvLyBmaWxsIHdpdGggdGhlIHNhbWUgaW5uZXIgbG9vcC4pCisgIGZvciAoc29ydCA9IDA7O3NvcnQgPSB4bWFsbG9jKGR0bGVuKnNpemVvZih2b2lkICopKSkgeworICAgIGZvciAoZHRsZW4gPSAwLCBkdCA9IGluZGlyLT5jaGlsZDsgZHQ7IGR0ID0gZHQtPm5leHQsIGR0bGVuKyspCisgICAgICBpZiAoc29ydCkgc29ydFtkdGxlbl0gPSBkdDsKKyAgICBpZiAoc29ydCB8fCAhZHRsZW4pIGJyZWFrOworICB9CisKKyAgLy8gTGFiZWwgZGlyZWN0b3J5IGlmIG5vdCB0b3Agb2YgdHJlZSwgb3IgaWYgLVIKKyAgaWYgKGluZGlyLT5wYXJlbnQgJiYgKFRULnNpbmdsZWRpciE9aW5kaXIgfHwgKGZsYWdzJkZMQUdfUikpKQorICB7CisgICAgY2hhciAqcGF0aCA9IGRpcnRyZWVfcGF0aChpbmRpciwgMCk7CisKKyAgICBpZiAoVFQubmxfdGl0bGUrKykgeHB1dGMoJ1xuJyk7CisgICAgeHByaW50ZigiJXM6XG4iLCBwYXRoKTsKKyAgICBmcmVlKHBhdGgpOworICB9CisKKyAgLy8gTWVhc3VyZSBlYWNoIGVudHJ5IHRvIHdvcmsgb3V0IHdoaXRlc3BhY2UgcGFkZGluZyBhbmQgdG90YWwgYmxvY2tzCisgIGlmICghKGZsYWdzICYgRkxBR19mKSkgeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3MgPSAwOworCisgICAgcXNvcnQoc29ydCwgZHRsZW4sIHNpemVvZih2b2lkICopLCAodm9pZCAqKWNvbXBhcmUpOworICAgIGZvciAodWwgPSAwOyB1bDxkdGxlbjsgdWwrKykgeworICAgICAgZW50cnlsZW4oc29ydFt1bF0sIGxlbik7CisgICAgICBmb3IgKHdpZHRoID0gMDsgd2lkdGg8ODsgd2lkdGgrKykKKyAgICAgICAgaWYgKGxlblt3aWR0aF0+dG90YWxzW3dpZHRoXSkgdG90YWxzW3dpZHRoXSA9IGxlblt3aWR0aF07CisgICAgICBibG9ja3MgKz0gc29ydFt1bF0tPnN0LnN0X2Jsb2NrczsKKyAgICB9CisgICAgdG90cGFkID0gdG90YWxzWzFdKyEhdG90YWxzWzFdK3RvdGFsc1s2XSshIXRvdGFsc1s2XSt0b3RhbHNbN10rISF0b3RhbHNbN107CisgICAgaWYgKChmbGFncyYoRkxBR19ofEZMQUdfbHxGTEFHX298RkxBR19ufEZMQUdfZ3xGTEFHX3MpKSAmJiBpbmRpci0+cGFyZW50KSB7CisgICAgICBpZiAoZmxhZ3MmRkxBR19oKSB7CisgICAgICAgIGh1bWFuX3JlYWRhYmxlKHRtcCwgYmxvY2tzKjUxMiwgMCk7CisgICAgICAgIHhwcmludGYoInRvdGFsICVzXG4iLCB0bXApOworICAgICAgfSBlbHNlIHhwcmludGYoInRvdGFsICVsbHVcbiIsIGJsb2Nrcyk7CisgICAgfQorICB9CisKKyAgLy8gRmluZCBsYXJnZXN0IGVudHJ5IGluIGVhY2ggZmllbGQgZm9yIGRpc3BsYXkgYWxpZ25tZW50CisgIGlmIChmbGFncyAmIChGTEFHX0N8RkxBR194KSkgeworCisgICAgLy8gY29sdW1ucyBjYW4ndCBiZSBtb3JlIHRoYW4gdG95YnVmIGNhbiBob2xkLCBvciBtb3JlIHRoYW4gZmlsZXMsCisgICAgLy8gb3IgPiAxLzIgc2NyZWVuIHdpZHRoIChvbmUgY2hhciBmaWxlbmFtZSwgb25lIHNwYWNlKS4KKyAgICBpZiAoY29sdW1ucyA+IFRULnNjcmVlbl93aWR0aC8yKSBjb2x1bW5zID0gVFQuc2NyZWVuX3dpZHRoLzI7CisgICAgaWYgKGNvbHVtbnMgPiBkdGxlbikgY29sdW1ucyA9IGR0bGVuOworCisgICAgLy8gVHJ5IHRvIGZpdCBhcyBtYW55IGNvbHVtbnMgYXMgd2UgY2FuLCBkcm9wcGluZyBkb3duIGJ5IG9uZSBlYWNoIHRpbWUKKyAgICBmb3IgKDtjb2x1bW5zID4gMTsgY29sdW1ucy0tKSB7CisgICAgICB1bnNpZ25lZCBjLCB0b3RsZW4gPSBjb2x1bW5zOworCisgICAgICBtZW1zZXQoY29sc2l6ZXMsIDAsIGNvbHVtbnMqc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgICBmb3IgKHVsPTA7IHVsPGR0bGVuOyB1bCsrKSB7CisgICAgICAgIGVudHJ5bGVuKHNvcnRbbmV4dF9jb2x1bW4odWwsIGR0bGVuLCBjb2x1bW5zLCAmYyldLCBsZW4pOworICAgICAgICAqbGVuICs9IHRvdHBhZDsKKyAgICAgICAgaWYgKGMgPT0gY29sdW1ucykgYnJlYWs7CisgICAgICAgIC8vIEV4cGFuZCB0aGlzIGNvbHVtbiBpZiBuZWNlc3NhcnksIGJyZWFrIGlmIHRoYXQgcHV0cyB1cyBvdmVyIGJ1ZGdldAorICAgICAgICBpZiAoKmxlbiA+IGNvbHNpemVzW2NdKSB7CisgICAgICAgICAgdG90bGVuICs9ICgqbGVuKS1jb2xzaXplc1tjXTsKKyAgICAgICAgICBjb2xzaXplc1tjXSA9ICpsZW47CisgICAgICAgICAgaWYgKHRvdGxlbiA+IFRULnNjcmVlbl93aWR0aCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgZml0LCBzdG9wIGhlcmUKKyAgICAgIGlmICh1bCA9PSBkdGxlbikgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGFnYWluIHRvIHByb2R1Y2Ugb3V0cHV0LgorICBtZW1zZXQodG95YnVmLCAnICcsIDI1Nik7CisgIHdpZHRoID0gMDsKKyAgZm9yICh1bCA9IDA7IHVsPGR0bGVuOyB1bCsrKSB7CisgICAgaW50IGlpOworICAgIHVuc2lnbmVkIGN1cmNvbCwgY29sb3IgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbmV4dCA9IG5leHRfY29sdW1uKHVsLCBkdGxlbiwgY29sdW1ucywgJmN1cmNvbCk7CisgICAgc3RydWN0IHN0YXQgKnN0ID0gJihzb3J0W25leHRdLT5zdCk7CisgICAgbW9kZV90IG1vZGUgPSBzdC0+c3RfbW9kZTsKKyAgICBjaGFyIGV0ID0gZW5kdHlwZShzdCksICpzczsKKworICAgIC8vIFNraXAgZGlyZWN0b3JpZXMgYXQgdGhlIHRvcCBvZiB0aGUgdHJlZSB3aGVuIC1kIGlzbid0IHNldAorICAgIGlmIChTX0lTRElSKG1vZGUpICYmICFpbmRpci0+cGFyZW50ICYmICEoZmxhZ3MgJiBGTEFHX2QpKSBjb250aW51ZTsKKyAgICBUVC5ubF90aXRsZT0xOworCisgICAgLy8gSGFuZGxlIHBhZGRpbmcgYW5kIHdyYXBwaW5nIGZvciBkaXNwbGF5IHB1cnBvc2VzCisgICAgZW50cnlsZW4oc29ydFtuZXh0XSwgbGVuKTsKKyAgICBpZiAodWwpIHsKKyAgICAgIGlmIChmbGFncyAmIEZMQUdfbSkgeHB1dGMoJywnKTsKKyAgICAgIGlmIChmbGFncyAmIChGTEFHX0N8RkxBR194KSkgeworICAgICAgICBpZiAoIWN1cmNvbCkgeHB1dGMoJ1xuJyk7CisgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfMSkgfHwgd2lkdGgrMSsqbGVuID4gVFQuc2NyZWVuX3dpZHRoKSB7CisgICAgICAgIHhwdXRjKCdcbicpOworICAgICAgICB3aWR0aCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB4cHV0YygnICcpOworICAgICAgICB3aWR0aCsrOworICAgICAgfQorICAgIH0KKyAgICB3aWR0aCArPSAqbGVuOworCisgICAgaWYgKGZsYWdzICYgRkxBR19pKQorICAgICAgeHByaW50ZigiJSpsdSAiLCB0b3RhbHNbMV0sICh1bnNpZ25lZCBsb25nKXN0LT5zdF9pbm8pOworICAgIGlmIChmbGFncyAmIEZMQUdfcykKKyAgICAgIHhwcmludGYoIiUqbHUgIiwgdG90YWxzWzZdLCAodW5zaWduZWQgbG9uZylzdC0+c3RfYmxvY2tzKTsKKworICAgIGlmIChmbGFncyAmIChGTEFHX2x8RkxBR19vfEZMQUdfbnxGTEFHX2cpKSB7CisgICAgICBzdHJ1Y3QgdG0gKnRtOworCisgICAgICAvLyAobG9uZykgaXMgdG8gY29lcmNlIHRoZSBzdCB0eXBlcyBpbnRvIHNvbWV0aGluZyB3ZSBrbm93IHdlIGNhbiBwcmludC4KKyAgICAgIG1vZGVfdG9fc3RyaW5nKG1vZGUsIHRtcCk7CisgICAgICBwcmludGYoIiVzJSAqbGQiLCB0bXAsIHRvdGFsc1syXSsxLCAobG9uZylzdC0+c3RfbmxpbmspOworCisgICAgICAvLyBwcmludCB1c2VyCisgICAgICBpZiAoIShmbGFncyZGTEFHX2cpKSB7CisgICAgICAgIHB1dGNoYXIoJyAnKTsKKyAgICAgICAgaWkgPSAtdG90YWxzWzNdOworICAgICAgICBpZiAoZmxhZ3MmRkxBR19uKSBwcmludGYoIiUqdSIsIGlpLCAodW5zaWduZWQpc3QtPnN0X3VpZCk7CisgICAgICAgIGVsc2UgZHJhd190cmltX2VzYyhnZXR1c2VybmFtZShzdC0+c3RfdWlkKSwgaWksIGFicyhpaSksIFRULmVzY21vcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVuY2hfcWIpOworICAgICAgfQorCisgICAgICAvLyBwcmludCBncm91cAorICAgICAgaWYgKCEoZmxhZ3MmRkxBR19vKSkgeworICAgICAgICBwdXRjaGFyKCcgJyk7CisgICAgICAgIGlpID0gLXRvdGFsc1s0XTsKKyAgICAgICAgaWYgKGZsYWdzJkZMQUdfbikgcHJpbnRmKCIlKnUiLCBpaSwgKHVuc2lnbmVkKXN0LT5zdF9naWQpOworICAgICAgICBlbHNlIGRyYXdfdHJpbV9lc2MoZ2V0Z3JvdXBuYW1lKHN0LT5zdF9naWQpLCBpaSwgYWJzKGlpKSwgVFQuZXNjbW9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydW5jaF9xYik7CisgICAgICB9CisKKyAgICAgIGlmIChmbGFncyAmIEZMQUdfWikKKyAgICAgICAgcHJpbnRmKCIgJS0qcyIsIC0oaW50KXRvdGFsc1s3XSwgKGNoYXIgKilzb3J0W25leHRdLT5leHRyYSk7CisKKyAgICAgIC8vIHByaW50IG1ham9yL21pbm9yLCBvciBzaXplCisgICAgICBpZiAoU19JU0NIUihzdC0+c3RfbW9kZSkgfHwgU19JU0JMSyhzdC0+c3RfbW9kZSkpCisgICAgICAgIHByaW50ZigiJSAqZCwlIDRkIiwgdG90YWxzWzVdLTQsIGRldl9tYWpvcihzdC0+c3RfcmRldiksCisgICAgICAgICAgZGV2X21pbm9yKHN0LT5zdF9yZGV2KSk7CisgICAgICBlbHNlIGlmIChmbGFncyZGTEFHX2gpIHsKKyAgICAgICAgaHVtYW5fcmVhZGFibGUodG1wLCBzdC0+c3Rfc2l6ZSwgMCk7CisgICAgICAgIHhwcmludGYoIiUqcyIsIHRvdGFsc1s1XSsxLCB0bXApOworICAgICAgfSBlbHNlIHByaW50ZigiJSAqbGxkIiwgdG90YWxzWzVdKzEsIChsb25nIGxvbmcpc3QtPnN0X3NpemUpOworCisgICAgICAvLyBwcmludCB0aW1lLCBhbHdheXMgaW4gLS10aW1lLXN0eWxlPWxvbmctaXNvCisgICAgICB0bSA9IGxvY2FsdGltZSgmKHN0LT5zdF9tdGltZSkpOworICAgICAgc3RyZnRpbWUodG1wLCBzaXplb2YodG1wKSwgIiVGICVIOiVNIiwgdG0pOworICAgICAgeHByaW50ZigiICVzICIsIHRtcCk7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIEZMQUdfWikKKyAgICAgIHByaW50ZigiJS0qcyAiLCAoaW50KXRvdGFsc1s3XSwgKGNoYXIgKilzb3J0W25leHRdLT5leHRyYSk7CisKKyAgICBpZiAoZmxhZ3MgJiBGTEFHX2NvbG9yKSB7CisgICAgICBjb2xvciA9IGNvbG9yX2Zyb21fbW9kZShzdC0+c3RfbW9kZSk7CisgICAgICBpZiAoY29sb3IpIHByaW50ZigiXDAzM1slZDslZG0iLCBjb2xvcj4+OCwgY29sb3ImMjU1KTsKKyAgICB9CisKKyAgICBzcyA9IHNvcnRbbmV4dF0tPm5hbWU7CisgICAgY3J1bmNoX3N0cigmc3MsIElOVF9NQVgsIHN0ZG91dCwgVFQuZXNjbW9yZSwgY3J1bmNoX3FiKTsKKyAgICBpZiAoY29sb3IpIHhwcmludGYoIlwwMzNbMG0iKTsKKworICAgIGlmICgoZmxhZ3MgJiAoRkxBR19sfEZMQUdfb3xGTEFHX258RkxBR19nKSkgJiYgU19JU0xOSyhtb2RlKSkgeworICAgICAgcHJpbnRmKCIgLT4gIik7CisgICAgICBpZiAoZmxhZ3MgJiBGTEFHX2NvbG9yKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0MjsKKworICAgICAgICBpZiAoZnN0YXRhdChkaXJmZCwgc29ydFtuZXh0XS0+c3ltbGluaywgJnN0MiwgMCkpIGNvbG9yID0gMjU2KzMxOworICAgICAgICBlbHNlIGNvbG9yID0gY29sb3JfZnJvbV9tb2RlKHN0Mi5zdF9tb2RlKTsKKworICAgICAgICBpZiAoY29sb3IpIHByaW50ZigiXDAzM1slZDslZG0iLCBjb2xvcj4+OCwgY29sb3ImMjU1KTsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCIlcyIsIHNvcnRbbmV4dF0tPnN5bWxpbmspOworICAgICAgaWYgKGNvbG9yKSBwcmludGYoIlwwMzNbMG0iKTsKKyAgICB9CisKKyAgICBpZiAoZXQpIHhwdXRjKGV0KTsKKworICAgIC8vIFBhZCBjb2x1bW5zCisgICAgaWYgKGZsYWdzICYgKEZMQUdfQ3xGTEFHX3gpKSB7CisgICAgICBjdXJjb2wgPSBjb2xzaXplc1tjdXJjb2xdLSgqbGVuKS10b3RwYWQ7CisgICAgICBpZiAoY3VyY29sIDwgMjU1KSB4cHJpbnRmKCIlcyIsIHRveWJ1ZisyNTUtY3VyY29sKTsKKyAgICB9CisgIH0KKworICBpZiAod2lkdGgpIHhwdXRjKCdcbicpOworCisgIC8vIEZyZWUgZGlyZWN0b3J5IGVudHJpZXMsIHJlY3Vyc2luZyBmaXJzdCBpZiBuZWNlc3NhcnkuCisKKyAgZm9yICh1bCA9IDA7IHVsPGR0bGVuOyBmcmVlKHNvcnRbdWwrK10pKSB7CisgICAgaWYgKChmbGFncyAmIEZMQUdfZCkgfHwgIVNfSVNESVIoc29ydFt1bF0tPnN0LnN0X21vZGUpKSBjb250aW51ZTsKKworICAgIC8vIFJlY3Vyc2UgaW50byBkaXJzIGlmIGF0IHRvcCBvZiB0aGUgdHJlZSBvciBnaXZlbiAtUgorICAgIGlmICghaW5kaXItPnBhcmVudCB8fCAoKGZsYWdzJkZMQUdfUikgJiYgZGlydHJlZV9ub3Rkb3Rkb3Qoc29ydFt1bF0pKSkKKyAgICAgIGxpc3RmaWxlcyhvcGVuYXQoZGlyZmQsIHNvcnRbdWxdLT5uYW1lLCAwKSwgc29ydFt1bF0pOworICAgIGZyZWUoKHZvaWQgKilzb3J0W3VsXS0+ZXh0cmEpOworICB9CisgIGZyZWUoc29ydCk7CisgIGlmIChkaXJmZCAhPSBBVF9GRENXRCkgY2xvc2UoZGlyZmQpOworfQorCit2b2lkIGxzX21haW4odm9pZCkKK3sKKyAgY2hhciAqKnMsICpub2FyZ3NbXSA9IHsiLiIsIDB9OworICBzdHJ1Y3QgZGlydHJlZSAqZHQ7CisKKyAgVFQuc2NyZWVuX3dpZHRoID0gODA7CisgIHRlcm1pbmFsX3NpemUoJlRULnNjcmVlbl93aWR0aCwgTlVMTCk7CisgIGlmIChUVC5zY3JlZW5fd2lkdGg8MikgVFQuc2NyZWVuX3dpZHRoID0gMjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19iKSBUVC5lc2Ntb3JlID0gIiBcXCI7CisKKyAgLy8gRG8gd2UgaGF2ZSBhbiBpbXBsaWVkIC0xCisgIGlmICghaXNhdHR5KDEpKSB7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfbSkpIHRveXMub3B0ZmxhZ3MgfD0gRkxBR18xOworICAgIGlmIChUVC5jb2xvcikgdG95cy5vcHRmbGFncyBePSBGTEFHX2NvbG9yOworICB9IGVsc2UgaWYgKHRveXMub3B0ZmxhZ3MmKEZMQUdfbHxGTEFHX298RkxBR19ufEZMQUdfZykpCisgICAgdG95cy5vcHRmbGFncyB8PSBGTEFHXzE7CisgIGVsc2UgaWYgKCEodG95cy5vcHRmbGFncyYoRkxBR18xfEZMQUdfeHxGTEFHX20pKSkgdG95cy5vcHRmbGFncyB8PSBGTEFHX0M7CisgIC8vIFRoZSBvcHRmbGFncyBwYXJzaW5nIGluZnJhc3RydWN0dXJlIHNob3VsZCByZWFsbHkgZG8gdGhpcyBmb3IgdXMsCisgIC8vIGJ1dCBjdXJyZW50bHkgaXQgaGFzICJzd2l0Y2ggb2ZmIHdoZW4gdGhpcyBpcyBzZXQiLCBzbyAiLWRSIiBhbmQgIi1SZCIKKyAgLy8gYmVoYXZlIGRpZmZlcmVudGx5CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSB0b3lzLm9wdGZsYWdzICY9IH5GTEFHX1I7CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIGNvbGxlY3RpbmcgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgorICAvLyBOb24tYWJzb2x1dGUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5LiBUb3Agb2YgdHJlZSBpcworICAvLyBhIGR1bW15IG5vZGUgdG8gY29sbGVjdCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGludG8gcHNldWRvLWRpcmVjdG9yeS4KKyAgVFQuZmlsZXMgPSBkaXJ0cmVlX2FkZF9ub2RlKDAsIDAsIDApOworICBUVC5maWxlcy0+ZGlyZmQgPSBBVF9GRENXRDsKKyAgZm9yIChzID0gKnRveXMub3B0YXJncyA/IHRveXMub3B0YXJncyA6IG5vYXJnczsgKnM7IHMrKykgeworICAgIGludCBzeW0gPSAhKHRveXMub3B0ZmxhZ3MmKEZMQUdfbHxGTEFHX2R8RkxBR19GKSkKKyAgICAgIHx8ICh0b3lzLm9wdGZsYWdzJihGTEFHX0x8RkxBR19IKSk7CisKKyAgICBkdCA9IGRpcnRyZWVfYWRkX25vZGUoMCwgKnMsIERJUlRSRUVfU1lNRk9MTE9XKnN5bSk7CisKKyAgICAvLyBub3RlOiBkb3VibGVfbGlzdC0+cHJldiB0ZW1wb3JhcmlybHkgZ29lcyBpbiBkaXJ0cmVlLT5wYXJlbnQKKyAgICBpZiAoZHQpIGRsaXN0X2FkZF9ub21hbGxvYygodm9pZCAqKSZUVC5maWxlcy0+Y2hpbGQsICh2b2lkICopZHQpOworICAgIGVsc2UgdG95cy5leGl0dmFsID0gMTsKKyAgfQorCisgIC8vIENvbnZlcnQgZG91YmxlX2xpc3QgaW50byBkaXJ0cmVlLgorICBkbGlzdF90ZXJtaW5hdGUoVFQuZmlsZXMtPmNoaWxkKTsKKyAgZm9yIChkdCA9IFRULmZpbGVzLT5jaGlsZDsgZHQ7IGR0ID0gZHQtPm5leHQpIGR0LT5wYXJlbnQgPSBUVC5maWxlczsKKworICAvLyBEaXNwbGF5IHRoZSBmaWxlcyB3ZSBjb2xsZWN0ZWQKKyAgbGlzdGZpbGVzKEFUX0ZEQ1dELCBUVC5maWxlcyk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShUVC5maWxlcyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9ta2Rpci5jIGIvdG95Ym94L3RveXMvcG9zaXgvbWtkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJkZjMzCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvbWtkaXIuYwpAQCAtMCwwICsxLDU1IEBACisvKiBta2Rpci5jIC0gTWFrZSBkaXJlY3RvcmllcworICoKKyAqIENvcHlyaWdodCAyMDEyIEdlb3JnaSBDaG9yYmFkemhpeXNraSA8Z2VvcmdpQHVuaXhzb2wub3JnPgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL21rZGlyLmh0bWwKKworVVNFX01LRElSKE5FV1RPWShta2RpciwgIjwxIlVTRV9NS0RJUl9aKCJaOiIpInZwbToiLCBUT1lGTEFHX0JJTnxUT1lGTEFHX1VNQVNLKSkKKworY29uZmlnIE1LRElSCisgIGJvb2wgIm1rZGlyIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBta2RpciBbLXZwXSBbLW0gbW9kZV0gW2Rpcm5hbWUuLi5dCisKKyAgICBDcmVhdGUgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMuCisKKyAgICAtbQlzZXQgcGVybWlzc2lvbnMgb2YgZGlyZWN0b3J5IHRvIG1vZGUuCisgICAgLXAJbWFrZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXMgbmVlZGVkLgorICAgIC12CXZlcmJvc2UKKworY29uZmlnIE1LRElSX1oKKyAgYm9vbAorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBNS0RJUiAmJiAhVE9ZQk9YX0xTTV9OT05FCisgIGhlbHAKKyAgICB1c2FnZTogWy1aIGNvbnRleHRdCisKKyAgICAtWglzZXQgc2VjdXJpdHkgY29udGV4dAorKi8KKworI2RlZmluZSBGT1JfbWtkaXIKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmFyZ19tb2RlOworICBjaGFyICphcmdfY29udGV4dDsKKykKKwordm9pZCBta2Rpcl9tYWluKHZvaWQpCit7CisgIGNoYXIgKipzOworICBtb2RlX3QgbW9kZSA9ICgwNzc3Jn50b3lzLm9sZF91bWFzayk7CisKKyAgaWYgKENGR19NS0RJUl9aICYmICh0b3lzLm9wdGZsYWdzJkZMQUdfWikpCisgICAgaWYgKDA+bHNtX3NldF9jcmVhdGUoVFQuYXJnX2NvbnRleHQpKQorICAgICAgcGVycm9yX2V4aXQoIi1aICclcycgZmFpbGVkIiwgVFQuYXJnX2NvbnRleHQpOworCisgIGlmIChUVC5hcmdfbW9kZSkgbW9kZSA9IHN0cmluZ190b19tb2RlKFRULmFyZ19tb2RlLCAwNzc3KTsKKworICAvLyBOb3RlLCAtcCBhbmQgLXYgZmxhZ3MgbGluZSB1cCB3aXRoIG1rcGF0aGF0KCkgZmxhZ3MKKyAgZm9yIChzPXRveXMub3B0YXJnczsgKnM7IHMrKykgeworICAgIGlmIChta3BhdGhhdChBVF9GRENXRCwgKnMsIG1vZGUsIHRveXMub3B0ZmxhZ3N8MSkpCisgICAgICBwZXJyb3JfbXNnKCInJXMnIiwgKnMpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9ta2ZpZm8uYyBiL3RveWJveC90b3lzL3Bvc2l4L21rZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmRmZGMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9ta2ZpZm8uYwpAQCAtMCwwICsxLDUwIEBACisvKiBta2ZpZm8uYyAtIENyZWF0ZSBGSUZPcyAobmFtZWQgcGlwZXMpCisgKgorICogQ29weXJpZ2h0IDIwMTIgR2VvcmdpIENob3JiYWR6aGl5c2tpIDxnZW9yZ2lAdW5peHNvbC5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbWtmaWZvLmh0bWwKKworVVNFX01LRklGTyhORVdUT1kobWtmaWZvLCAiPDEiVVNFX01LRklGT19aKCJaOiIpIm06IiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTUtGSUZPCisgIGJvb2wgIm1rZmlmbyIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogbWtmaWZvIFtOQU1FLi4uXQorCisgICAgQ3JlYXRlIEZJRk9zIChuYW1lZCBwaXBlcykuCisKK2NvbmZpZyBNS0ZJRk9fWgorICBib29sCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIE1LRklGTyAmJiAhVE9ZQk9YX0xTTV9OT05FCisgIGhlbHAKKyAgICB1c2FnZTogbWtmaWZvIFstWiBDT05URVhUXQorCisgICAgLVoJU2VjdXJpdHkgY29udGV4dAorKi8KKworI2RlZmluZSBGT1JfbWtmaWZvCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICptX3N0cmluZzsKKyAgY2hhciAqWjsKKworICBtb2RlX3QgbW9kZTsKKykKKwordm9pZCBta2ZpZm9fbWFpbih2b2lkKQoreworICBjaGFyICoqczsKKworICBUVC5tb2RlID0gMDY2NjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX20pIFRULm1vZGUgPSBzdHJpbmdfdG9fbW9kZShUVC5tX3N0cmluZywgMCk7CisKKyAgaWYgKENGR19NS0ZJRk9fWiAmJiAodG95cy5vcHRmbGFncyZGTEFHX1opKQorICAgIGlmICgwPmxzbV9zZXRfY3JlYXRlKFRULlopKQorICAgICAgcGVycm9yX2V4aXQoIi1aICclcycgZmFpbGVkIiwgVFQuWik7CisKKyAgZm9yIChzID0gdG95cy5vcHRhcmdzOyAqczsgcysrKQorICAgIGlmIChta25vZCgqcywgU19JRklGTyB8IFRULm1vZGUsIDApIDwgMCkgcGVycm9yX21zZ19yYXcoKnMpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvbmljZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvbmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTg3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9uaWNlLmMKQEAgLTAsMCArMSwzOCBAQAorLyogbmljZS5jIC0gUnVuIGEgcHJvZ3JhbSBhdCBhIGRpZmZlcmVudCBuaWNlbmVzcyBsZXZlbC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL25pY2UuaHRtbAorCitVU0VfTklDRShORVdUT1kobmljZSwgIl48MW4jIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTklDRQorICBib29sICJuaWNlIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBuaWNlIFstbiBQUklPUklUWV0gY29tbWFuZCBbYXJncy4uLl0KKworICAgIFJ1biBhIGNvbW1hbmQgbGluZSBhdCBhbiBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIHNjaGVkdWxpbmcgcHJpb3JpdHkuCisKKyAgICBIaWdoZXIgbnVtYmVycyBtYWtlIGEgcHJvZ3JhbSB5aWVsZCBtb3JlIENQVSB0aW1lLCBmcm9tIC0yMCAoaGlnaGVzdAorICAgIHByaW9yaXR5KSB0byAxOSAobG93ZXN0KS4gIEJ5IGRlZmF1bHQgcHJvY2Vzc2VzIGluaGVyaXQgdGhlaXIgcGFyZW50J3MKKyAgICBuaWNlbmVzcyAodXN1YWxseSAwKS4gIEJ5IGRlZmF1bHQgdGhpcyBjb21tYW5kIGFkZHMgMTAgdG8gdGhlIHBhcmVudCdzCisgICAgcHJpb3JpdHkuICBPbmx5IHJvb3QgY2FuIHNldCBhIG5lZ2F0aXZlIG5pY2VuZXNzIGxldmVsLgorKi8KKworI2RlZmluZSBGT1JfbmljZQorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgbG9uZyBwcmlvcml0eTsKKykKKwordm9pZCBuaWNlX21haW4odm9pZCkKK3sKKyAgaWYgKCF0b3lzLm9wdGZsYWdzKSBUVC5wcmlvcml0eSA9IDEwOworCisgIGVycm5vID0gMDsKKyAgaWYgKG5pY2UoVFQucHJpb3JpdHkpPT0tMSAmJiBlcnJubykgcGVycm9yX2V4aXQoIkNhbid0IHNldCBwcmlvcml0eSIpOworCisgIHhleGVjKHRveXMub3B0YXJncyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9ubC5jIGIvdG95Ym94L3RveXMvcG9zaXgvbmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjAyYmZhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvbmwuYwpAQCAtMCwwICsxLDkzIEBACisvKiBubC5jIC0gcHJpbnQgbGluZSBudW1iZXJzCisgKgorICogQ29weXJpZ2h0IDIwMTMgQ0UgU3RyYWtlIDxzdHJha2U4ODhAZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbmwuaHRtbAorICoKKyAqIFRoaXMgaW1wbGVtZW50cyBhIHN1YnNldDogb25seSBvbmUgbG9naWNhbCBwYWdlICgtaXApLCBubyBzZWN0aW9ucyAoLWRmaCkuCisgKiB0b2RvOiAtbHYKKworVVNFX05MKE5FV1RPWShubCwgInYjPDE9MWwjYjpuOnM6dyM8MD02RSIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIE5MCisgIGJvb2wgIm5sIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBubCBbLUVdIFstbCAjXSBbLWIgTU9ERV0gWy1uIFNUWUxFXSBbLXMgU0VQQVJBVE9SXSBbLXcgV0lEVEhdIFtGSUxFLi4uXQorCisgICAgTnVtYmVyIGxpbmVzIG9mIGlucHV0LgorCisgICAgLUUJVXNlIGV4dGVuZGVkIHJlZ2V4IHN5bnRheCAod2hlbiBkb2luZyAtYiBwUkVHRVgpCisgICAgLWIJd2hpY2ggbGluZXMgdG8gbnVtYmVyOiBhIChhbGwpIHQgKG5vbi1lbXB0eSwgZGVmYXVsdCkgcFJFR0VYIChwYXR0ZXJuKQorICAgIC1sCU9ubHkgY291bnQgbGFzdCBvZiB0aGlzIG1hbnkgY29uc2VjdXRpdmUgYmxhbmsgbGluZXMKKyAgICAtbgludW1iZXIgU1RZTEU6IGxuIChsZWZ0IGp1c3RpZmllZCkgcm4gKHJpZ2h0IGp1c3RpZmllZCkgcnogKHplcm8gcGFkKQorICAgIC1zCVNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBudW1iZXIgYW5kIGxpbmUgKGluc3RlYWQgb2YgVEFCKQorICAgIC13CVdpZHRoIG9mIGxpbmUgbnVtYmVycyAoZGVmYXVsdCA2KQorKi8KKworI2RlZmluZSBGT1JfbmwKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgdzsKKyAgY2hhciAqczsKKyAgY2hhciAqbjsKKyAgY2hhciAqYjsKKyAgbG9uZyBsOworICBsb25nIHY7CisKKyAgLy8gQ291bnQgb2YgY29uc2VjdXRpdmUgYmxhbmsgbGluZXMgZm9yIC1sIGhhcyB0byBwZXJzaXN0IGJldHdlZW4gZmlsZXMKKyAgbG9uZyBsY291bnQ7CispCisKK3N0YXRpYyB2b2lkIGRvX25sKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgRklMRSAqZiA9IHhmZG9wZW4oZmQsICJyIik7CisgIGludCB3ID0gVFQudywgc2xlbiA9IHN0cmxlbihUVC5zKTsKKworICBmb3IgKDs7KSB7CisgICAgY2hhciAqbGluZSA9IDA7CisgICAgc2l6ZV90IHRlbXA7CisgICAgaW50IG1hdGNoID0gKlRULmIgIT0gJ24nOworCisgICAgaWYgKGdldGxpbmUoJmxpbmUsICZ0ZW1wLCBmKSA8IDEpIHsKKyAgICAgIGlmIChmZXJyb3IoZikpIHBlcnJvcl9tc2dfcmF3KG5hbWUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCpUVC5iID09ICdwJykgbWF0Y2ggPSAhcmVnZXhlYygodm9pZCAqKSh0b3lidWYrMTYpLCBsaW5lLCAwLCAwLCAwKTsKKyAgICBpZiAoVFQubCB8fCAqVFQuYiA9PSAndCcpCisgICAgICBpZiAoKmxpbmUgPT0gJ1xuJykgbWF0Y2ggPSBUVC5sICYmICsrVFQubGNvdW50ID49IFRULmw7CisgICAgaWYgKG1hdGNoKSB7CisgICAgICBUVC5sY291bnQgPSAwOworICAgICAgcHJpbnRmKHRveWJ1ZiwgdywgVFQudisrLCBUVC5zKTsKKyAgICB9IGVsc2UgcHJpbnRmKCIlKmMiLCAoaW50KXcrc2xlbiwgJyAnKTsKKyAgICB4cHJpbnRmKCIlcyIsIGxpbmUpOworCisgICAgZnJlZShsaW5lKTsKKyAgfQorCisgIGZjbG9zZShmKTsKK30KKwordm9pZCBubF9tYWluKHZvaWQpCit7CisgIGNoYXIgKmNsaXAgPSAiIjsKKworICBpZiAoIVRULnMpIFRULnMgPSAiXHQiOworCisgIGlmICghVFQubiB8fCAhc3RyY21wKFRULm4sICJybiIpKTsgLy8gZGVmYXVsdAorICBlbHNlIGlmICghc3RyY21wKFRULm4sICJsbiIpKSBjbGlwID0gIi0iOworICBlbHNlIGlmICghc3RyY21wKFRULm4sICJyeiIpKSBjbGlwID0gIjAiOworICBlbHNlIGVycm9yX2V4aXQoImJhZCAtbiAnJXMnIiwgVFQubik7CisKKyAgc3ByaW50Zih0b3lidWYsICIlJSVzJXMiLCBjbGlwLCAiKmxkJXMiKTsKKworICBpZiAoIVRULmIpIFRULmIgPSAidCI7CisgIGlmICgqVFQuYiA9PSAncCcgJiYgVFQuYlsxXSkKKyAgICB4cmVnY29tcCgodm9pZCAqKSh0b3lidWYrMTYpLCBUVC5iKzEsCisgICAgICBSRUdfTk9TVUIgfCAodG95cy5vcHRmbGFncyZGTEFHX0UpKlJFR19FWFRFTkRFRCk7CisgIGVsc2UgaWYgKCFzdHJjaHIoImF0biIsICpUVC5iKSkgZXJyb3JfZXhpdCgiYmFkIC1iICclcyciLCBUVC5iKTsKKworICBsb29wZmlsZXMgKHRveXMub3B0YXJncywgZG9fbmwpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvbm9odXAuYyBiL3RveWJveC90b3lzL3Bvc2l4L25vaHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMmNiZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L25vaHVwLmMKQEAgLTAsMCArMSw0MiBAQAorLyogbm9odXAuYyAtIHJ1biBjb21tYW5kbGluZSB3aXRoIFNJR0hVUCBibG9ja2VkLgorICoKKyAqIENvcHlyaWdodCAyMDExIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbm9odXAuaHRtbAorCitVU0VfTk9IVVAoTkVXVE9ZKG5vaHVwLCAiPDFeIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgTk9IVVAKKyAgYm9vbCAibm9odXAiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IG5vaHVwIENPTU1BTkQgW0FSR1MuLi5dCisKKyAgICBSdW4gYSBjb21tYW5kIHRoYXQgc3Vydml2ZXMgdGhlIGVuZCBvZiBpdHMgdGVybWluYWwuCisKKyAgICBSZWRpcmVjdCB0dHkgb24gc3RkaW4gdG8gL2Rldi9udWxsLCB0dHkgb24gc3Rkb3V0IHRvICJub2h1cC5vdXQiLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCBub2h1cF9tYWluKHZvaWQpCit7CisgIHhzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKyAgaWYgKGlzYXR0eSgxKSkgeworICAgIGNsb3NlKDEpOworICAgIGlmICgtMSA9PSBvcGVuKCJub2h1cC5vdXQiLCBPX0NSRUFUfE9fQVBQRU5EfE9fV1JPTkxZLAorICAgICAgICBTX0lSVVNSfFNfSVdVU1IgKSkKKyAgICB7CisgICAgICBjaGFyICp0ZW1wID0gZ2V0ZW52KCJIT01FIik7CisKKyAgICAgIHRlbXAgPSB4bXByaW50ZigiJXMvJXMiLCB0ZW1wID8gdGVtcCA6ICIiLCAibm9odXAub3V0Iik7CisgICAgICB4Y3JlYXRlKHRlbXAsIE9fQ1JFQVR8T19BUFBFTkR8T19XUk9OTFksIDA2MDApOworICAgICAgZnJlZSh0ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKGlzYXR0eSgwKSkgeworICAgIGNsb3NlKDApOworICAgIHhvcGVuX3N0ZGlvKCIvZGV2L251bGwiLCBPX1JET05MWSk7CisgIH0KKyAgeGV4ZWModG95cy5vcHRhcmdzKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L29kLmMgYi90b3lib3gvdG95cy9wb3NpeC9vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2VhNTgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9vZC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiBvZC5jIC0gUHJvdmlkZSBvY3RhbC9oZXggZHVtcHMgb2YgZGF0YQorICoKKyAqIENvcHlyaWdodCAyMDEyIEFuZHJlIFJlbmF1ZCA8YW5kcmVAYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIENvcHlyaWdodCAyMDEyIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvb2QuaHRtbAorCitVU0VfT0QoTkVXVE9ZKG9kLCAiaiN2dyM8MT0xNk4jeHNvZGNiQTp0KiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIE9ECisgIGJvb2wgIm9kIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBvZCBbLWJjZG9zeHZdIFstaiAjXSBbLU4gI10gWy13ICNdIFstQSBkb3huXSBbLXQgYWNkZm91eFsjXV0KKworICAgIC1BCUFkZHJlc3MgYmFzZSAoZGVjaW1hbCwgb2N0YWwsIGhleGRlY2ltYWwsIG5vbmUpCisgICAgLWoJU2tpcCB0aGlzIG1hbnkgYnl0ZXMgb2YgaW5wdXQKKyAgICAtTglTdG9wIGR1bXBpbmcgYWZ0ZXIgdGhpcyBtYW55IGJ5dGVzCisgICAgLXQJT3V0cHV0IHR5cGUgYShzY2lpKSBjKGhhcikgZChlY2ltYWwpIGYobG9hdCkgbyhjdGFsKSB1KG5zaWduZWQpIChoZSl4CisgICAgCXBsdXMgb3B0aW9uYWwgc2l6ZSBpbiBieXRlcworICAgIAlhbGlhc2VzOiAtYj0tdCBvMSwgLWM9LXQgYywgLWQ9LXQgdTIsIC1vPS10IG8yLCAtcz0tdCBkMiwgLXg9LXQgeDIKKyAgICAtdglEb24ndCBjb2xsYXBzZSByZXBlYXRlZCBsaW5lcyB0b2dldGhlcgorICAgIC13CVRvdGFsIGxpbmUgd2lkdGggaW4gYnl0ZXMgKGRlZmF1bHQgMTYpLgorKi8KKworI2RlZmluZSBGT1Jfb2QKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIHN0cnVjdCBhcmdfbGlzdCAqb3V0cHV0X2Jhc2U7CisgIGNoYXIgKmFkZHJlc3NfYmFzZTsKKyAgbG9uZyBtYXhfY291bnQ7CisgIGxvbmcgd2lkdGg7CisgIGxvbmcganVtcF9ieXRlczsKKworICBpbnQgYWRkcmVzc19pZHg7CisgIHVuc2lnbmVkIHR5cGVzLCBsZWZ0b3Zlciwgc3RhcjsKKyAgY2hhciAqYnVmOyAvLyBQb2ludHMgdG8gYnVmZmVyc1swXSBvciBidWZmZXJzWzFdLgorICBjaGFyICpidWZzWzJdOyAvLyBVc2VkIHRvIGRldGVjdCBkdXBsaWNhdGUgbGluZXMuCisgIG9mZl90IHBvczsKKykKKworc3RhdGljIGNoYXIgKmFzY2lpID0gIm51bHNvaHN0eGV0eGVvdGVucWFja2JlbCBicyBodCBubCB2dCBmZiBjciBzbyBzaSIKKyAgImRsZWRjMWRjMmRjM2RjNG5ha3N5bmV0YmNhbiBlbXN1YmVzYyBmcyBncyBycyB1cyBzcCI7CisKK3N0cnVjdCBvZHR5cGUgeworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7Cit9OworCitzdGF0aWMgaW50IG9kX291dF90KHN0cnVjdCBvZHR5cGUgKnQsIGNoYXIgKmJ1ZiwgaW50ICpvZmZzZXQpCit7CisgIHVuc2lnbmVkIGs7CisgIGludCB0aHJvdyA9IDAsIHBhZCA9IDA7CisKKyAgLy8gSGFuZGxlIGFzY2lpCisgIGlmICh0LT50eXBlIDwgMikgeworICAgIGNoYXIgYyA9IFRULmJ1ZlsoKm9mZnNldCkrK107CisgICAgcGFkICs9IDQ7CisKKyAgICBpZiAoIXQtPnR5cGUpIHsKKyAgICAgIGMgJj0gMTI3OworICAgICAgaWYgKGM8PTMyKSBzcHJpbnRmKGJ1ZiwgIiUuM3MiLCBhc2NpaSsoMypjKSk7CisgICAgICBlbHNlIGlmIChjPT0xMjcpIHN0cmNweShidWYsICJkZWwiKTsKKyAgICAgIGVsc2Ugc3ByaW50ZihidWYsICIlYyIsIGMpOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyICpiZm5ydGF2ID0gIlxiXGZcblxyXHRcYVx2IiwgKnMgPSBzdHJjaHIoYmZucnRhdiwgYyk7CisgICAgICBpZiAocykgc3ByaW50ZihidWYsICJcXCVjIiwgImJmbnJ0YXYwIltzLWJmbnJ0YXZdKTsKKyAgICAgIGVsc2UgaWYgKGMgPCAzMiB8fCBjID49IDEyNykgc3ByaW50ZihidWYsICIlMDNvIiwgYyk7CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgVVRGOCBhd2FyZS4KKyAgICAgICAgc3ByaW50ZihidWYsICIlYyIsIGMpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChDRkdfVE9ZQk9YX0ZMT0FUICYmIHQtPnR5cGUgPT0gNikgeworICAgIGxvbmcgZG91YmxlIGxkOworICAgIHVuaW9uIHtmbG9hdCBmOyBkb3VibGUgZDsgbG9uZyBkb3VibGUgbGQ7fSBmZGw7CisKKyAgICBtZW1jcHkoJmZkbCwgVFQuYnVmKypvZmZzZXQsIHQtPnNpemUpOworICAgICpvZmZzZXQgKz0gdC0+c2l6ZTsKKyAgICBpZiAoc2l6ZW9mKGZsb2F0KSA9PSB0LT5zaXplKSB7CisgICAgICBsZCA9IGZkbC5mOworICAgICAgcGFkICs9ICh0aHJvdyA9IDgpKzc7CisgICAgfSBlbHNlIGlmIChzaXplb2YoZG91YmxlKSA9PSB0LT5zaXplKSB7CisgICAgICBsZCA9IGZkbC5kOworICAgICAgcGFkICs9ICh0aHJvdyA9IDE3KSs4OworICAgIH0gZWxzZSBpZiAoc2l6ZW9mKGxvbmcgZG91YmxlKSA9PSB0LT5zaXplKSB7CisgICAgICBsZCA9IGZkbC5sZDsKKyAgICAgIHBhZCArPSAodGhyb3cgPSAyMSkrOTsKKyAgICB9IGVsc2UgZXJyb3JfZXhpdCgiYmFkIC10ZiAnJWQnIiwgdC0+c2l6ZSk7CisKKyAgICBzcHJpbnRmKGJ1ZiwgIiUuKkxlIiwgdGhyb3csIGxkKTsKKyAgLy8gSW50ZWdlciB0eXBlcworICB9IGVsc2UgeworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsbCA9IDAsIG9yOworICAgIGNoYXIgKmNbXSA9IHsiJSpsbGQiLCAiJSpsbHUiLCAiJTAqbGxvIiwgIiUwKmxseCJ9LAorICAgICAgKmNsYXNzID0gY1t0LT50eXBlLTJdOworCisgICAgLy8gV29yayBvdXQgd2lkdGggb2YgZmllbGQKKyAgICBpZiAodC0+c2l6ZSA9PSA4KSB7CisgICAgICBvciA9IC0xTEw7CisgICAgICBpZiAodC0+dHlwZSA9PSAyKSBvciA+Pj0gMTsKKyAgICB9IGVsc2Ugb3IgPSAoMUxMPDwoOCp0LT5zaXplKSktMTsKKyAgICB0aHJvdyA9IHNwcmludGYoYnVmLCBjbGFzcywgMCwgb3IpOworCisgICAgLy8gQWNjdW11bGF0ZSBpbnRlZ2VyIGJhc2VkIG9uIHNpemUgYXJndW1lbnQKKyAgICBmb3IgKGs9MDsgayA8IHQtPnNpemU7IGsrKykgeworICAgICAgb3IgPSBUVC5idWZbKCpvZmZzZXQpKytdOworICAgICAgbGwgfD0gb3IgPDwgKDgqKElTX0JJR19FTkRJQU4gPyB0LT5zaXplLWstMSA6IGspKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgbmVnYXRpdmUgdmFsdWVzCisgICAgaWYgKHQtPnR5cGUgPT0gMikgeworICAgICAgb3IgPSBzaXplb2Yob3IpIC0gdC0+c2l6ZTsKKyAgICAgIHRocm93Kys7CisgICAgICBpZiAob3IgJiYgKGxsICYgKDFsPDwoKDgqdC0+c2l6ZSktMSkpKSkKKyAgICAgICAgbGwgfD0gKChvcjw8KDgqb3IpKS0xKSA8PCAoOCp0LT5zaXplKTsKKyAgICB9CisKKyAgICBzcHJpbnRmKGJ1ZiwgY2xhc3MsIHRocm93LCBsbCk7CisgICAgcGFkICs9IHRocm93KzE7CisgIH0KKworICByZXR1cm4gcGFkOworfQorCitzdGF0aWMgdm9pZCBvZF9vdXRsaW5lKHZvaWQpCit7CisgIHVuc2lnbmVkIGZsYWdzID0gdG95cy5vcHRmbGFnczsKKyAgY2hhciBidWZbMTI4XSwgKmFiYXNlc1tdID0geyIiLCAiJTA3bGxkIiwgIiUwN2xsbyIsICIlMDZsbHgifTsKKyAgc3RydWN0IG9kdHlwZSAqdHlwZXMgPSAoc3RydWN0IG9kdHlwZSAqKXRveWJ1ZjsKKyAgaW50IGksIGosIGxlbiwgcGFkOworCisgIGlmIChUVC5sZWZ0b3ZlcjxUVC53aWR0aCkgbWVtc2V0KFRULmJ1ZitUVC5sZWZ0b3ZlciwgMCwgVFQud2lkdGgtVFQubGVmdG92ZXIpOworCisgIC8vIEhhbmRsZSBkdXBsY2lhdGUgbGluZXMgYXMgKgorICBpZiAoIShmbGFncyZGTEFHX3YpICYmIFRULmp1bXBfYnl0ZXMgIT0gVFQucG9zICYmIFRULmxlZnRvdmVyCisgICAgJiYgIW1lbWNtcChUVC5idWZzWzBdLCBUVC5idWZzWzFdLCBUVC53aWR0aCkpCisgIHsKKyAgICBpZiAoIVRULnN0YXIpIHsKKyAgICAgIHhwdXRzKCIqIik7CisgICAgICBUVC5zdGFyKys7CisgICAgfQorCisgIC8vIFByaW50IGxpbmUgcG9zaXRpb24KKyAgfSBlbHNlIHsKKyAgICBUVC5zdGFyID0gMDsKKworICAgIC8vIG9mZl90IHZhcmllcyBzbyBleHBhbmQgaXQgdG8gbGFyZ2VzdCBwb3NzaWJsZSBzaXplCisgICAgeHByaW50ZihhYmFzZXNbVFQuYWRkcmVzc19pZHhdLCAobG9uZyBsb25nKVRULnBvcyk7CisgICAgaWYgKCFUVC5sZWZ0b3ZlcikgeworICAgICAgaWYgKFRULmFkZHJlc3NfaWR4KSB4cHV0YygnXG4nKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBUVC5wb3MgKz0gbGVuID0gVFQubGVmdG92ZXI7CisgIFRULmxlZnRvdmVyID0gMDsKKyAgaWYgKFRULnN0YXIpIHJldHVybjsKKworICAvLyBGaW5kIGxhcmdlc3QgInBhZCIgb2YgdGhlIG91dHB1dCB0eXBlcy4KKyAgZm9yIChpID0gcGFkID0gMDsgaTxUVC50eXBlczsgaSsrKSB7CisgICAgaW50IGJ5dGVzID0gMDsKKworICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYnl0ZSBvZiBpbnB1dCBjb25zdW1lZCwgYXZlcmFnZSByb3VuZGluZyB1cC4KKyAgICBqID0gb2Rfb3V0X3QodHlwZXMraSwgYnVmLCAmYnl0ZXMpOworICAgIGogPSAoaitieXRlcy0xKS9ieXRlczsKKyAgIAorICAgIGlmIChqID4gcGFkKSBwYWQgPSBqOworICB9CisKKyAgLy8gRm9yIGVhY2ggb3V0cHV0IHR5cGUsIHByaW50IG9uZSBsaW5lCisgIGZvciAoaT0wOyBpPFRULnR5cGVzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqPGxlbjspIHsKKyAgICAgIGludCBieXRlcyA9IGo7CisKKyAgICAgIC8vIHBhZCBmb3IgYXMgbWFueSBieXRlcyBhcyB3ZXJlIGNvbnN1bWVkLCBhbmQgaW5kZW50IG5vbi1udW1iZXJlZCBsaW5lcworICAgICAgb2Rfb3V0X3QodHlwZXMraSwgYnVmLCAmYnl0ZXMpOworICAgICAgeHByaW50ZigiJSpzIiwgcGFkKihieXRlcy1qKSArIDcqKCEhaSkqIWosIGJ1Zik7CisgICAgICBqID0gYnl0ZXM7CisgICAgfQorICAgIHhwdXRjKCdcbicpOworICB9CisKKyAgLy8gVG9nZ2xlIGJ1ZmZlciBmb3IgInNhbWUgYXMgbGFzdCB0aW1lIiBjaGVjay4KKyAgVFQuYnVmID0gKFRULmJ1ZiA9PSBUVC5idWZzWzBdKSA/IFRULmJ1ZnNbMV0gOiBUVC5idWZzWzBdOworfQorCisvLyBMb29wIHRocm91Z2ggaW5wdXQgZmlsZXMKK3N0YXRpYyB2b2lkIGRvX29kKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgLy8gU2tpcCBpbnB1dCwgcG9zc2libHkgbW9yZSB0aGFuIG9uZSBlbnRpcmUgZmlsZS4KKyAgaWYgKFRULmp1bXBfYnl0ZXMgPiBUVC5wb3MpIHsKKyAgICBvZmZfdCBwb3MgPSBUVC5qdW1wX2J5dGVzLVRULnBvcywgb2ZmID0gbHNraXAoZmQsIHBvcyk7CisKKyAgICBpZiAob2ZmID49IDApIFRULnBvcyArPSBwb3Mtb2ZmOworICAgIGlmIChUVC5qdW1wX2J5dGVzID4gVFQucG9zKSByZXR1cm47CisgIH0KKworICBmb3IoOzspIHsKKyAgICBjaGFyICpidWYgPSBUVC5idWYgKyBUVC5sZWZ0b3ZlcjsKKyAgICBpbnQgbGVuID0gVFQud2lkdGggLSBUVC5sZWZ0b3ZlcjsKKworICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19OKSB7CisgICAgICBpZiAoIVRULm1heF9jb3VudCkgYnJlYWs7CisgICAgICBpZiAoVFQubWF4X2NvdW50IDwgbGVuKSBsZW4gPSBUVC5tYXhfY291bnQ7CisgICAgfQorCisgICAgbGVuID0gcmVhZGFsbChmZCwgYnVmLCBsZW4pOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICBwZXJyb3JfbXNnX3JhdyhuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoVFQubWF4X2NvdW50KSBUVC5tYXhfY291bnQgLT0gbGVuOworICAgIFRULmxlZnRvdmVyICs9IGxlbjsKKyAgICBpZiAoVFQubGVmdG92ZXIgPCBUVC53aWR0aCkgYnJlYWs7CisKKyAgICBvZF9vdXRsaW5lKCk7CisgIH0KK30KKworLy8gSGFuZGxlIG9uZSAtdCBhcmd1bWVudCAoaW5jbHVkaW5nIGltcGxpY2l0IG9uZXMpCitzdGF0aWMgdm9pZCBhcHBlbmRfYmFzZShjaGFyICpiYXNlKQoreworICBjaGFyICpzID0gYmFzZTsKKyAgc3RydWN0IG9kdHlwZSAqdHlwZXMgPSAoc3RydWN0IG9kdHlwZSAqKXRveWJ1ZjsKKyAgaW50IHR5cGU7CisKKyAgZm9yICg7OykgeworICAgIGludCBzaXplID0gMTsKKworICAgIGlmICghKnMpIHJldHVybjsKKyAgICBpZiAoVFQudHlwZXMgPj0gc2l6ZW9mKHRveWJ1Zikvc2l6ZW9mKHN0cnVjdCBvZHR5cGUpKSBicmVhazsKKyAgICBpZiAoLTEgPT0gKHR5cGUgPSBzdHJpZHgoImFjZHVveCJVU0VfVE9ZQk9YX0ZMT0FUKCJmIiksICoocysrKSkpKSBicmVhazsKKworICAgIGlmIChpc2RpZ2l0KCpzKSkgeworICAgICAgc2l6ZSA9IHN0cnRvbChzLCAmcywgMTApOworICAgICAgaWYgKHR5cGUgPCAyICYmIHNpemUgIT0gMSkgYnJlYWs7CisgICAgICBpZiAoQ0ZHX1RPWUJPWF9GTE9BVCAmJiB0eXBlID09IDYgJiYgc2l6ZSA9PSBzaXplb2YobG9uZyBkb3VibGUpKTsKKyAgICAgIGVsc2UgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA4KSBicmVhazsKKyAgICB9IGVsc2UgaWYgKENGR19UT1lCT1hfRkxPQVQgJiYgdHlwZSA9PSA2KSB7CisgICAgICBpbnQgc2l6ZXNbXSA9IHtzaXplb2YoZmxvYXQpLCBzaXplb2YoZG91YmxlKSwgc2l6ZW9mKGxvbmcgZG91YmxlKX07CisgICAgICBpZiAoLTEgPT0gKHNpemUgPSBzdHJpZHgoIkZETCIsICpzKSkpIHNpemUgPSBzaXplb2YoZG91YmxlKTsKKyAgICAgIGVsc2UgeworICAgICAgICBzKys7CisgICAgICAgIHNpemUgPSBzaXplc1tzaXplXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPiAxKSB7CisgICAgICBpZiAoLTEgPT0gKHNpemUgPSBzdHJpZHgoIkNTSUwiLCAqcykpKSBzaXplID0gNDsKKyAgICAgIGVsc2UgeworICAgICAgICBzKys7CisgICAgICAgIHNpemUgPSAxIDw8IHNpemU7CisgICAgICB9CisgICAgfQorCisgICAgdHlwZXNbVFQudHlwZXNdLnR5cGUgPSB0eXBlOworICAgIHR5cGVzW1RULnR5cGVzXS5zaXplID0gc2l6ZTsKKyAgICBUVC50eXBlcysrOworICB9CisKKyAgZXJyb3JfZXhpdCgiYmFkIC10ICVzIiwgYmFzZSk7Cit9CisKK3ZvaWQgb2RfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmFyZzsKKworICBUVC5idWZzWzBdID0geHphbGxvYyhUVC53aWR0aCk7CisgIFRULmJ1ZnNbMV0gPSB4emFsbG9jKFRULndpZHRoKTsKKyAgVFQuYnVmID0gVFQuYnVmc1swXTsKKworICBpZiAoIVRULmFkZHJlc3NfYmFzZSkgVFQuYWRkcmVzc19pZHggPSAyOworICBlbHNlIGlmICgwPihUVC5hZGRyZXNzX2lkeCA9IHN0cmlkeCgibmRveCIsICpUVC5hZGRyZXNzX2Jhc2UpKSkKKyAgICBlcnJvcl9leGl0KCJiYWQgLUEgJyVjJyIsICpUVC5hZGRyZXNzX2Jhc2UpOworCisgIC8vIENvbGxlY3QgLXQgZW50cmllcworCisgIGZvciAoYXJnID0gVFQub3V0cHV0X2Jhc2U7IGFyZzsgYXJnID0gYXJnLT5uZXh0KSBhcHBlbmRfYmFzZShhcmctPmFyZyk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19iKSBhcHBlbmRfYmFzZSgibzEiKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2MpIGFwcGVuZF9iYXNlKCJjIik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19kKSBhcHBlbmRfYmFzZSgidTIiKTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX28pIGFwcGVuZF9iYXNlKCJvMiIpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfcykgYXBwZW5kX2Jhc2UoImQyIik7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSBhcHBlbmRfYmFzZSgieDIiKTsKKyAgaWYgKCFUVC50eXBlcykgYXBwZW5kX2Jhc2UoIm8yIik7CisKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fb2QpOworCisgIGlmIChUVC5sZWZ0b3Zlcikgb2Rfb3V0bGluZSgpOworICBvZF9vdXRsaW5lKCk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGZyZWUoVFQuYnVmc1swXSk7CisgICAgZnJlZShUVC5idWZzWzFdKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvcGFzdGUuYyBiL3RveWJveC90b3lzL3Bvc2l4L3Bhc3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMzQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3Bhc3RlLmMKQEAgLTAsMCArMSw5OSBAQAorLyogcGFzdGUuYyAtIFJlcGxhY2UgbmV3bGluZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBGZWxpeCBKYW5kYSA8ZmVsaXguamFuZGFAcG9zdGVvLmRlPgorICoKKyAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9wYXN0ZS5odG1sIAorICoKK1VTRV9QQVNURShORVdUT1kocGFzdGUsICJkOnMiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQQVNURQorICBib29sICJwYXN0ZSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcGFzdGUgWy1zXSBbLWQgbGlzdF0gW2ZpbGUuLi5dCisKKyAgICBSZXBsYWNlIG5ld2xpbmVzIGluIGZpbGVzLgorCisgICAgLWQgbGlzdCAgICBsaXN0IG9mIGRlbGltaXRlcnMgdG8gc2VwYXJhdGUgbGluZXMKKyAgICAtcyAgICAgICAgIHByb2Nlc3MgZmlsZXMgc2VxdWVudGlhbGx5IGluc3RlYWQgb2YgaW4gcGFyYWxsZWwKKworICAgIEJ5IGRlZmF1bHQgcHJpbnQgY29ycmVzcG9uZGluZyBsaW5lcyBzZXBhcmF0ZWQgYnkgPHRhYj4uCisqLworI2RlZmluZSBGT1JfcGFzdGUKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGNoYXIgKmRlbGltOworKQorCit2b2lkIHBhc3RlX21haW4odm9pZCkKK3sKKyAgY2hhciAqcCwgKmJ1ZiA9IHRveWJ1ZiwgKiphcmdzID0gdG95cy5vcHRhcmdzOworICBzaXplX3QgbmRlbGltID0gMDsKKyAgaW50IGksIGosIGM7CisKKyAgLy8gUHJvY2VzcyBkZWxpbWl0ZXIgbGlzdAorICAvLyBUT0RPOiBIYW5kbGUgbXVsdGlieXRlIGNoYXJhY3RlcnMKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfZCkpIFRULmRlbGltID0gIlx0IjsKKyAgZm9yIChwID0gVFQuZGVsaW07ICpwOyBwKyssIGJ1ZisrLCBuZGVsaW0rKykgeworICAgIGlmICgqcCA9PSAnXFwnKSB7CisgICAgICBwKys7CisgICAgICBpZiAoLTEgPT0gKGkgPSBzdHJpZHgoIm50XFwwIiwgKnApKSkKKyAgICAgICAgZXJyb3JfZXhpdCgiYmFkIGRlbGltaXRlcjogXFwlYyIsICpwKTsKKyAgICAgICpidWYgPSAiXG5cdFxcXDAiW2ldOworICAgIH0gZWxzZSAqYnVmID0gKnA7CisgIH0KKyAgKmJ1ZiA9IDA7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3MpIHsgLy8gU2VxdWVudGlhbAorICAgIEZJTEUgKmY7CisKKyAgICBmb3IgKDsgKmFyZ3M7IGFyZ3MrKykgeworICAgICAgaWYgKCgqYXJncylbMF0gPT0gJy0nICYmICEoKmFyZ3MpWzFdKSBmID0gc3RkaW47CisgICAgICBlbHNlIGlmICghKGYgPSBmb3BlbigqYXJncywgInIiKSkpIHBlcnJvcl9leGl0X3JhdygqYXJncyk7CisgICAgICBmb3IgKGkgPSAwLCBjID0gMDsgYyAhPSBFT0Y7KSB7CisgICAgICAgIHN3aXRjaChjID0gZ2V0YyhmKSkgeworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgcHV0Y2hhcih0b3lidWZbaSsrICUgbmRlbGltXSk7CisgICAgICAgIGNhc2UgRU9GOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHB1dGNoYXIoYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmICE9IHN0ZGluKSBmY2xvc2UoZik7CisgICAgICBwdXRjaGFyKCdcbicpOworICAgIH0KKyAgfSBlbHNlIHsgLy8gUGFyYWxsZWwKKyAgICAvLyBOZWVkIHRvIGJlIGNhcmVmdWwgbm90IHRvIHByaW50IGFuIGV4dHJhIGxpbmUgYXQgdGhlIGVuZAorICAgIEZJTEUgKipmaWxlczsKKyAgICBpbnQgYW55b3BlbiA9IDE7CisKKyAgICBmaWxlcyA9IChGSUxFKiopKGJ1ZiArIDEpOworICAgIGZvciAoOyAqYXJnczsgYXJncysrLCBmaWxlcysrKSB7CisgICAgICBpZiAoKCphcmdzKVswXSA9PSAnLScgJiYgISgqYXJncylbMV0pICpmaWxlcyA9IHN0ZGluOworICAgICAgZWxzZSBpZiAoISgqZmlsZXMgPSBmb3BlbigqYXJncywgInIiKSkpIHBlcnJvcl9leGl0X3JhdygqYXJncyk7CisgICAgfQorICAgIHdoaWxlIChhbnlvcGVuKSB7CisgICAgICBhbnlvcGVuID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3lzLm9wdGM7IGkrKykgeworICAgICAgICBGSUxFICoqZiA9IChGSUxFKiopKGJ1ZiArIDEpICsgaTsKKworICAgICAgICBpZiAoKmYpIGZvciAoOzspIHsKKyAgICAgICAgICBjID0gZ2V0YygqZik7CisgICAgICAgICAgaWYgKGMgIT0gRU9GKSB7CisgICAgICAgICAgICBpZiAoIWFueW9wZW4rKykgZm9yIChqID0gMDsgaiA8IGk7IGorKykgcHV0Y2hhcih0b3lidWZbaiAlIG5kZWxpbV0pOworICAgICAgICAgICAgaWYgKGMgIT0gJ1xuJykgcHV0Y2hhcihjKTsKKyAgICAgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCpmICE9IHN0ZGluKSBmY2xvc2UoKmYpOworICAgICAgICAgICAgKmYgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhbnlvcGVuKSBwdXRjaGFyKChpICsgMSA9PSB0b3lzLm9wdGMpID8gdG95YnVmW2kgJSBuZGVsaW1dIDogJ1xuJyk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9wYXRjaC5jIGIvdG95Ym94L3RveXMvcG9zaXgvcGF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFkMWZiCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvcGF0Y2guYwpAQCAtMCwwICsxLDQzMSBAQAorLyogcGF0Y2guYyAtIEFwcGx5IGEgInVuaXZlcnNhbCIgZGlmZi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIHNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3BhdGNoLmh0bWwKKyAqIChCdXQgb25seSBkb2VzIC11LCBiZWNhdXNlIHdobyBzdGlsbCBjYXJlcyBhYm91dCAiZWQiPykKKyAqCisgKiBUT0RPOgorICogLWIgYmFja3VwCisgKiAtTiBpZ25vcmUgYWxyZWFkeSBhcHBsaWVkCisgKiAtZCBjaGRpciBmaXJzdAorICogLUQgZGVmaW5lIHdyYXAgI2lmZGVmIGFuZCAjaWZuZGVmIGFyb3VuZCBjaGFuZ2VzCisgKiAtbyBvdXRmaWxlIG91dHB1dCBoZXJlIGluc3RlYWQgb2YgaW4gcGxhY2UKKyAqIC1yIHJlamVjdGZpbGUgd3JpdGUgcmVqZWN0ZWQgaHVua3MgdG8gdGhpcyBmaWxlCisgKgorICogLUUgcmVtb3ZlIGVtcHR5IGZpbGVzIC0tcmVtb3ZlLWVtcHR5LWZpbGVzCisgKiAtZiBmb3JjZSAobm8gcXVlc3Rpb25zIGFza2VkKQorICogLUYgZnV6eiAobnVtYmVyLCBkZWZhdWx0IDIpCisgKiBbZmlsZV0gd2hpY2ggZmlsZSB0byBwYXRjaAorCitVU0VfUEFUQ0goTkVXVE9ZKHBhdGNoLCAiKGRyeS1ydW4pIlVTRV9UT1lCT1hfREVCVUcoIngiKSJkOnVscCNpOlIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQQVRDSAorICBib29sICJwYXRjaCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcGF0Y2ggWy1kIERJUl0gWy1pIGZpbGVdIFstcCBkZXB0aF0gWy1SbHVdIFstLWRyeS1ydW5dCisKKyAgICBBcHBseSBhIHVuaWZpZWQgZGlmZiB0byBvbmUgb3IgbW9yZSBmaWxlcy4KKworICAgIC1kCW1vZGlmeSBmaWxlcyBpbiBESVIKKyAgICAtaQlJbnB1dCBmaWxlIChkZWZhdWx0cz1zdGRpbikKKyAgICAtbAlMb29zZSBtYXRjaCAoaWdub3JlIHdoaXRlc3BhY2UpCisgICAgLXAJTnVtYmVyIG9mICcvJyB0byBzdHJpcCBmcm9tIHN0YXJ0IG9mIGZpbGUgcGF0aHMgKGRlZmF1bHQ9YWxsKQorICAgIC1SCVJldmVyc2UgcGF0Y2guCisgICAgLXUJSWdub3JlZCAob25seSBoYW5kbGVzICJ1bmlmaWVkIiBkaWZmcykKKyAgICAtLWRyeS1ydW4gRG9uJ3QgY2hhbmdlIGZpbGVzLCBqdXN0IGNvbmZpcm0gcGF0Y2ggYXBwbGllcworCisgICAgVGhpcyB2ZXJzaW9uIG9mIHBhdGNoIG9ubHkgaGFuZGxlcyB1bmlmaWVkIGRpZmZzLCBhbmQgb25seSBtb2RpZmllcworICAgIGEgZmlsZSB3aGVuIGFsbCBhbGwgaHVua3MgdG8gdGhhdCBmaWxlIGFwcGx5LiAgUGF0Y2ggcHJpbnRzIGZhaWxlZAorICAgIGh1bmtzIHRvIHN0ZGVyciwgYW5kIGV4aXRzIHdpdGggbm9uemVybyBzdGF0dXMgaWYgYW55IGh1bmtzIGZhaWwuCisKKyAgICBBIGZpbGUgY29tcGFyZWQgYWdhaW5zdCAvZGV2L251bGwgKG9yIHdpdGggYSBkYXRlIDw9IHRoZSBlcG9jaCkgaXMKKyAgICBjcmVhdGVkL2RlbGV0ZWQgYXMgYXBwcm9wcmlhdGUuCisqLworCisjZGVmaW5lIEZPUl9wYXRjaAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqaW5maWxlOworICBsb25nIHByZWZpeDsKKyAgY2hhciAqZGlyOworCisgIHN0cnVjdCBkb3VibGVfbGlzdCAqY3VycmVudF9odW5rOworICBsb25nIG9sZGxpbmUsIG9sZGxlbiwgbmV3bGluZSwgbmV3bGVuOworICBsb25nIGxpbmVudW07CisgIGludCBjb250ZXh0LCBzdGF0ZSwgZmlsZWluLCBmaWxlb3V0LCBmaWxlcGF0Y2gsIGh1bmtudW07CisgIGNoYXIgKnRlbXBuYW1lOworKQorCisvLyBEaXNwb3NlIG9mIGEgbGluZSBvZiBpbnB1dCwgZWl0aGVyIGJ5IHdyaXRpbmcgaXQgb3V0IG9yIGRpc2NhcmRpbmcgaXQuCisKKy8vIHN0YXRlIDwgMjoganVzdCBmcmVlCisvLyBzdGF0ZSA9IDI6IHdyaXRlIHdob2xlIGxpbmUgdG8gc3RkZXJyCisvLyBzdGF0ZSA9IDM6IHdyaXRlIHdob2xlIGxpbmUgdG8gZmlsZW91dAorLy8gc3RhdGUgPiAzOiB3cml0ZSBsaW5lKzEgdG8gZmlsZW91dCB3aGVuICpsaW5lICE9IHN0YXRlCisKK3N0YXRpYyB2b2lkIGRvX2xpbmUodm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdCA9IChzdHJ1Y3QgZG91YmxlX2xpc3QgKilkYXRhOworCisgIGlmIChUVC5zdGF0ZT4xICYmICpkbGlzdC0+ZGF0YSAhPSBUVC5zdGF0ZSkgeworICAgIGNoYXIgKnMgPSBkbGlzdC0+ZGF0YSsoVFQuc3RhdGU+MyA/IDEgOiAwKTsKKyAgICBpbnQgaSA9IFRULnN0YXRlID09IDIgPyAyIDogVFQuZmlsZW91dDsKKworICAgIHh3cml0ZShpLCBzLCBzdHJsZW4ocykpOworICAgIHh3cml0ZShpLCAiXG4iLCAxKTsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KQorICAgIGZwcmludGYoc3RkZXJyLCAiRE8gJWQ6ICVzXG4iLCBUVC5zdGF0ZSwgZGxpc3QtPmRhdGEpOworCisgIGZyZWUoZGxpc3QtPmRhdGEpOworICBmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2xkZmlsZSh2b2lkKQoreworICBpZiAoVFQudGVtcG5hbWUpIHJlcGxhY2VfdGVtcGZpbGUoVFQuZmlsZWluLCBUVC5maWxlb3V0LCAmVFQudGVtcG5hbWUpOworICBUVC5maWxlb3V0ID0gVFQuZmlsZWluID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZhaWxfaHVuayh2b2lkKQoreworICBpZiAoIVRULmN1cnJlbnRfaHVuaykgcmV0dXJuOworCisgIGZwcmludGYoc3RkZXJyLCAiSHVuayAlZCBGQUlMRUQgJWxkLyVsZC5cbiIsCisgICAgICBUVC5odW5rbnVtLCBUVC5vbGRsaW5lLCBUVC5uZXdsaW5lKTsKKyAgdG95cy5leGl0dmFsID0gMTsKKworICAvLyBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCwgd2UndmUgc2Vla2VkIHRvIHRoZSBlbmQuICBEaXNjYXJkIGNoYW5nZXMgdG8KKyAgLy8gdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgZmlsZS4KKworICBUVC5zdGF0ZSA9IDI7CisgIGxsaXN0X3RyYXZlcnNlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisgIFRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2RyeV9ydW4pKQorICAgIGRlbGV0ZV90ZW1wZmlsZShUVC5maWxlaW4sIFRULmZpbGVvdXQsICZUVC50ZW1wbmFtZSk7CisgIFRULnN0YXRlID0gMDsKK30KKworLy8gQ29tcGFyZSBpZ25vcmluZyB3aGl0ZXNwYWNlLiBKdXN0IHJldHVybnMgMC8xLCBubyA+IG9yIDwKK3N0YXRpYyBpbnQgbG9vc2VjbXAoY2hhciAqYWEsIGNoYXIgKmJiKQoreworICBpbnQgYSA9IDAsIGIgPSAwOworCisgIGZvciAoOzspIHsKKyAgICB3aGlsZSAoaXNzcGFjZShhYVthXSkpIGErKzsKKyAgICB3aGlsZSAoaXNzcGFjZShiYltiXSkpIGIrKzsKKyAgICBpZiAoYWFbYV0gIT0gYmJbYl0pIHJldHVybiAxOworICAgIGlmICghYWFbYV0pIHJldHVybiAwOworICAgIGErKywgYisrOworICB9Cit9CisKKy8vIEdpdmVuIGEgaHVuayBvZiBhIHVuaWZpZWQgZGlmZiwgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHRvIHRoZSBmaWxlLgorLy8gVGhpcyBkb2VzIG5vdCB1c2UgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgaW5zdGVhZCB0cmVhdHMgYSBodW5rCisvLyBhcyBhIHNvcnQgb2YgcmVnZXguICBDb3BpZXMgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB1bnRpbCBpdCBmaW5kcworLy8gdGhlIGNoYW5nZSB0byBiZSBtYWRlLCB0aGVuIG91dHB1dHMgdGhlIGNoYW5nZWQgZGF0YSBhbmQgcmV0dXJucy4KKy8vIChGaW5kaW5nIEVPRiBmaXJzdCBpcyBhbiBlcnJvci4pICBUaGlzIGlzIGEgc2luZ2xlIHBhc3Mgb3BlcmF0aW9uLCBzbworLy8gbXVsdGlwbGUgaHVua3MgbXVzdCBvY2N1ciBpbiBvcmRlciBpbiB0aGUgZmlsZS4KKworc3RhdGljIGludCBhcHBseV9vbmVfaHVuayh2b2lkKQoreworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKnBsaXN0LCAqYnVmID0gTlVMTCwgKmNoZWNrOworICBpbnQgbWF0Y2hlb2YsIHRyYWlsaW5nID0gMCwgcmV2ZXJzZSA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX1IsIGJhY2t3YXJuID0gMDsKKyAgaW50ICgqbGNtcCkoY2hhciAqYWEsIGNoYXIgKmJiKTsKKworICBsY21wID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2wpID8gKHZvaWQgKilsb29zZWNtcCA6ICh2b2lkICopc3RyY21wOworICBkbGlzdF90ZXJtaW5hdGUoVFQuY3VycmVudF9odW5rKTsKKworICAvLyBNYXRjaCBFT0YgaWYgdGhlcmUgYXJlbid0IGFzIG1hbnkgZW5kaW5nIGNvbnRleHQgbGluZXMgYXMgYmVnaW5uaW5nCisgIGZvciAocGxpc3QgPSBUVC5jdXJyZW50X2h1bms7IHBsaXN0OyBwbGlzdCA9IHBsaXN0LT5uZXh0KSB7CisgICAgaWYgKHBsaXN0LT5kYXRhWzBdPT0nICcpIHRyYWlsaW5nKys7CisgICAgZWxzZSB0cmFpbGluZyA9IDA7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIGZwcmludGYoc3RkZXJyLCAiSFVOSzolc1xuIiwgcGxpc3QtPmRhdGEpOworICB9CisgIG1hdGNoZW9mID0gIXRyYWlsaW5nIHx8IHRyYWlsaW5nIDwgVFQuY29udGV4dDsKKworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfeCkKKyAgICBmcHJpbnRmKHN0ZGVyciwiTUFUQ0hFT0Y9JWNcbiIsIG1hdGNoZW9mID8gJ1knIDogJ04nKTsKKworICAvLyBMb29wIHRocm91Z2ggaW5wdXQgZGF0YSBzZWFyY2hpbmcgZm9yIHRoaXMgaHVuay4gIE1hdGNoIGFsbCBjb250ZXh0CisgIC8vIGxpbmVzIGFuZCBhbGwgbGluZXMgdG8gYmUgcmVtb3ZlZCB1bnRpbCB3ZSd2ZSBmb3VuZCB0aGUgZW5kIG9mIGEKKyAgLy8gY29tcGxldGUgaHVuay4KKyAgcGxpc3QgPSBUVC5jdXJyZW50X2h1bms7CisgIGJ1ZiA9IE5VTEw7CisKKyAgZm9yICg7OykgeworICAgIGNoYXIgKmRhdGEgPSBnZXRfbGluZShUVC5maWxlaW4pOworCisgICAgVFQubGluZW51bSsrOworICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggbGluZSBvZiBodW5rIHRvIGNvbXBhcmUgd2l0aCBuZXh0LiAgKFNraXAgbGluZXMKKyAgICAvLyBvZiB0aGUgaHVuayB3ZSdkIGJlIGFkZGluZy4pCisgICAgd2hpbGUgKHBsaXN0ICYmICpwbGlzdC0+ZGF0YSA9PSAiKy0iW3JldmVyc2VdKSB7CisgICAgICBpZiAoZGF0YSAmJiAhbGNtcChkYXRhLCBwbGlzdC0+ZGF0YSsxKSkgeworICAgICAgICBpZiAoIWJhY2t3YXJuKSBiYWNrd2FybiA9IFRULmxpbmVudW07CisgICAgICB9CisgICAgICBwbGlzdCA9IHBsaXN0LT5uZXh0OworICAgIH0KKworICAgIC8vIElzIHRoaXMgRU9GPworICAgIGlmICghZGF0YSkgeworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIGZwcmludGYoc3RkZXJyLCAiSU5FT0ZcbiIpOworCisgICAgICAvLyBEb2VzIHRoaXMgaHVuayBuZWVkIHRvIG1hdGNoIEVPRj8KKyAgICAgIGlmICghcGxpc3QgJiYgbWF0Y2hlb2YpIGJyZWFrOworCisgICAgICBpZiAoYmFja3dhcm4pCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUG9zc2libHkgcmV2ZXJzZWQgaHVuayAlZCBhdCAlbGRcbiIsCisgICAgICAgICAgICBUVC5odW5rbnVtLCBUVC5saW5lbnVtKTsKKworICAgICAgLy8gRmlsZSBlbmRlZCBiZWZvcmUgd2UgZm91bmQgYSBwbGFjZSBmb3IgdGhpcyBodW5rLgorICAgICAgZmFpbF9odW5rKCk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR194KSBmcHJpbnRmKHN0ZGVyciwgIklOOiAlc1xuIiwgZGF0YSk7CisgICAgY2hlY2sgPSBkbGlzdF9hZGQoJmJ1ZiwgZGF0YSk7CisKKyAgICAvLyBDb21wYXJlIHRoaXMgbGluZSB3aXRoIG5leHQgZXhwZWN0ZWQgbGluZSBvZiBodW5rLgorCisgICAgLy8gQSBtYXRjaCBjYW4gZmFpbCBiZWNhdXNlIHRoZSBuZXh0IGxpbmUgZG9lc24ndCBtYXRjaCwgb3IgYmVjYXVzZQorICAgIC8vIHdlIGhpdCB0aGUgZW5kIG9mIGEgaHVuayB0aGF0IG5lZWRlZCBFT0YsIGFuZCB0aGlzIGlzbid0IEVPRi4KKworICAgIC8vIElmIG1hdGNoIGZhaWxlZCwgZmx1c2ggZmlyc3QgbGluZSBvZiBidWZmZXJlZCBkYXRhIGFuZAorICAgIC8vIHJlY2hlY2sgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2ggdW50aWwgd2UgZmluZCBvbmUgb3IgcnVuCisgICAgLy8gb3V0IG9mIGJ1ZmZlci4KKworICAgIGZvciAoOzspIHsKKyAgICAgIGlmICghcGxpc3QgfHwgbGNtcChjaGVjay0+ZGF0YSwgcGxpc3QtPmRhdGErMSkpIHsKKyAgICAgICAgLy8gTWF0Y2ggZmFpbGVkLiAgV3JpdGUgb3V0IGZpcnN0IGxpbmUgb2YgYnVmZmVyZWQgZGF0YSBhbmQKKyAgICAgICAgLy8gcmVjaGVjayByZW1haW5pbmcgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2guCisKKyAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIHsKKyAgICAgICAgICBpbnQgYnVnID0gMDsKKworICAgICAgICAgIGlmICghcGxpc3QpIGZwcmludGYoc3RkZXJyLCAiTlVMTCBwbGlzdFxuIik7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAocGxpc3QtPmRhdGFbYnVnXSA9PSBjaGVjay0+ZGF0YVtidWddKSBidWcrKzsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTk9UKCVkOiVkIT0lZCk6ICVzXG4iLCBidWcsIHBsaXN0LT5kYXRhW2J1Z10sCisgICAgICAgICAgICAgIGNoZWNrLT5kYXRhW2J1Z10sIHBsaXN0LT5kYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIGh1bmsgbXVzdCBtYXRjaCBzdGFydCBvZiBmaWxlLCBmYWlsIGlmIGl0IGRpZG4ndC4KKyAgICAgICAgaWYgKCFUVC5jb250ZXh0IHx8IHRyYWlsaW5nPlRULmNvbnRleHQpIHsKKyAgICAgICAgICBmYWlsX2h1bmsoKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBUVC5zdGF0ZSA9IDM7CisgICAgICAgIGRvX2xpbmUoY2hlY2sgPSBkbGlzdF9wb3AoJmJ1ZikpOworICAgICAgICBwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsKKworICAgICAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aXRob3V0IGNvbmZpcm1pbmcgYQorICAgICAgICAvLyBtYXRjaCwgcmVhZCBtb3JlIGxpbmVzLgorICAgICAgICBpZiAoIWJ1ZikgYnJlYWs7CisgICAgICAgIGNoZWNrID0gYnVmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpIGZwcmludGYoc3RkZXJyLCAiTUFZQkU6ICVzXG4iLCBwbGlzdC0+ZGF0YSk7CisgICAgICAgIC8vIFRoaXMgbGluZSBtYXRjaGVzLiAgQWR2YW5jZSBwbGlzdCwgZGV0ZWN0IHN1Y2Nlc3NmdWwgbWF0Y2guCisgICAgICAgIHBsaXN0ID0gcGxpc3QtPm5leHQ7CisgICAgICAgIGlmICghcGxpc3QgJiYgIW1hdGNoZW9mKSBnb3RvIG91dDsKKyAgICAgICAgY2hlY2sgPSBjaGVjay0+bmV4dDsKKyAgICAgICAgaWYgKGNoZWNrID09IGJ1ZikgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CitvdXQ6CisgIC8vIFdlIGhhdmUgYSBtYXRjaC4gIEVtaXQgY2hhbmdlZCBkYXRhLgorICBUVC5zdGF0ZSA9ICItKyJbcmV2ZXJzZV07CisgIGxsaXN0X3RyYXZlcnNlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisgIFRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisgIFRULnN0YXRlID0gMTsKK2RvbmU6CisgIGlmIChidWYpIHsKKyAgICBkbGlzdF90ZXJtaW5hdGUoYnVmKTsKKyAgICBsbGlzdF90cmF2ZXJzZShidWYsIGRvX2xpbmUpOworICB9CisKKyAgcmV0dXJuIFRULnN0YXRlOworfQorCisvLyBSZWFkIGEgcGF0Y2ggZmlsZSBhbmQgZmluZCBodW5rcywgb3BlbmluZy9jcmVhdGluZy9kZWxldGluZyBmaWxlcy4KKy8vIENhbGwgYXBwbHlfb25lX2h1bmsoKSBvbiBlYWNoIGh1bmsuCisKKy8vIHN0YXRlIDA6IE5vdCBpbiBhIGh1bmssIGxvb2sgZm9yICsrKy4KKy8vIHN0YXRlIDE6IEZvdW5kICsrKyBmaWxlIGluZGljYXRvciwgbG9vayBmb3IgQEAKKy8vIHN0YXRlIDI6IEluIGh1bms6IGNvdW50aW5nIGluaXRpYWwgY29udGV4dCBsaW5lcworLy8gc3RhdGUgMzogSW4gaHVuazogZ2V0dGluZyBib2R5CisKK3ZvaWQgcGF0Y2hfbWFpbih2b2lkKQoreworICBpbnQgcmV2ZXJzZSA9IHRveXMub3B0ZmxhZ3MmRkxBR19SLCBzdGF0ZSA9IDAsIHBhdGNobGluZW51bSA9IDAsCisgICAgc3RyaXAgPSAwOworICBjaGFyICpvbGRuYW1lID0gTlVMTCwgKm5ld25hbWUgPSBOVUxMOworCisgIGlmIChUVC5pbmZpbGUpIFRULmZpbGVwYXRjaCA9IHhvcGVucm8oVFQuaW5maWxlKTsKKyAgVFQuZmlsZWluID0gVFQuZmlsZW91dCA9IC0xOworCisgIGlmIChUVC5kaXIpIHhjaGRpcihUVC5kaXIpOworCisgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIHBhdGNoCisgIGZvciAoOzspIHsKKyAgICBjaGFyICpwYXRjaGxpbmU7CisKKyAgICBwYXRjaGxpbmUgPSBnZXRfbGluZShUVC5maWxlcGF0Y2gpOworICAgIGlmICghcGF0Y2hsaW5lKSBicmVhazsKKworICAgIC8vIE90aGVyIHZlcnNpb25zIG9mIHBhdGNoIGFjY2VwdCBkYW1hZ2VkIHBhdGNoZXMsCisgICAgLy8gc28gd2UgbmVlZCB0byBhbHNvLgorICAgIGlmIChzdHJpcCB8fCAhcGF0Y2hsaW5lbnVtKyspIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4ocGF0Y2hsaW5lKTsKKyAgICAgIGlmIChwYXRjaGxpbmVbbGVuLTFdID09ICdccicpIHsKKyAgICAgICAgaWYgKCFzdHJpcCkgZnByaW50ZihzdGRlcnIsICJSZW1vdmluZyBET1MgbmV3bGluZXNcbiIpOworICAgICAgICBzdHJpcCA9IDE7CisgICAgICAgIHBhdGNobGluZVtsZW4tMV09MDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCEqcGF0Y2hsaW5lKSB7CisgICAgICBmcmVlKHBhdGNobGluZSk7CisgICAgICBwYXRjaGxpbmUgPSB4c3RyZHVwKCIgIik7CisgICAgfQorCisgICAgLy8gQXJlIHdlIGFzc2VtYmxpbmcgYSBodW5rPworICAgIGlmIChzdGF0ZSA+PSAyKSB7CisgICAgICBpZiAoKnBhdGNobGluZT09JyAnIHx8ICpwYXRjaGxpbmU9PScrJyB8fCAqcGF0Y2hsaW5lPT0nLScpIHsKKyAgICAgICAgZGxpc3RfYWRkKCZUVC5jdXJyZW50X2h1bmssIHBhdGNobGluZSk7CisKKyAgICAgICAgaWYgKCpwYXRjaGxpbmUgIT0gJysnKSBUVC5vbGRsZW4tLTsKKyAgICAgICAgaWYgKCpwYXRjaGxpbmUgIT0gJy0nKSBUVC5uZXdsZW4tLTsKKworICAgICAgICAvLyBDb250ZXh0IGxpbmU/CisgICAgICAgIGlmICgqcGF0Y2hsaW5lPT0nICcgJiYgc3RhdGU9PTIpIFRULmNvbnRleHQrKzsKKyAgICAgICAgZWxzZSBzdGF0ZT0zOworCisgICAgICAgIC8vIElmIHdlJ3ZlIGNvbnN1bWVkIGFsbCBleHBlY3RlZCBodW5rIGxpbmVzLCBhcHBseSB0aGUgaHVuay4KKworICAgICAgICBpZiAoIVRULm9sZGxlbiAmJiAhVFQubmV3bGVuKSBzdGF0ZSA9IGFwcGx5X29uZV9odW5rKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZGxpc3RfdGVybWluYXRlKFRULmN1cnJlbnRfaHVuayk7CisgICAgICBmYWlsX2h1bmsoKTsKKyAgICAgIHN0YXRlID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIE9wZW4gYSBuZXcgZmlsZT8KKyAgICBpZiAoIXN0cm5jbXAoIi0tLSAiLCBwYXRjaGxpbmUsIDQpIHx8ICFzdHJuY21wKCIrKysgIiwgcGF0Y2hsaW5lLCA0KSkgeworICAgICAgY2hhciAqcywgKipuYW1lID0gJm9sZG5hbWU7CisgICAgICBpbnQgaTsKKworICAgICAgaWYgKCpwYXRjaGxpbmUgPT0gJysnKSB7CisgICAgICAgIG5hbWUgPSAmbmV3bmFtZTsKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgfQorCisgICAgICBmcmVlKCpuYW1lKTsKKyAgICAgIGZpbmlzaF9vbGRmaWxlKCk7CisKKyAgICAgIC8vIFRyaW0gZGF0ZSBmcm9tIGVuZCBvZiBmaWxlbmFtZSAoaWYgYW55KS4gIFdlIGRvbid0IGNhcmUuCisgICAgICBmb3IgKHMgPSBwYXRjaGxpbmUrNDsgKnMgJiYgKnMhPSdcdCc7IHMrKykKKyAgICAgICAgaWYgKCpzPT0nXFwnICYmIHNbMV0pIHMrKzsKKyAgICAgIGkgPSBhdG9pKHMpOworICAgICAgaWYgKGk+MTkwMCAmJiBpPD0xOTcwKSAqbmFtZSA9IHhzdHJkdXAoIi9kZXYvbnVsbCIpOworICAgICAgZWxzZSB7CisgICAgICAgICpzID0gMDsKKyAgICAgICAgKm5hbWUgPSB4c3RyZHVwKHBhdGNobGluZSs0KTsKKyAgICAgIH0KKworICAgICAgLy8gV2UgZGVmZXIgYWN0dWFsbHkgb3BlbmluZyB0aGUgZmlsZSBiZWNhdXNlIHN2biBwcm9kdWNlcyBicm9rZW4KKyAgICAgIC8vIHBhdGNoZXMgdGhhdCBkb24ndCBzaWduYWwgdGhleSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlIHRoZQorICAgICAgLy8gd2F5IHRoZSBwYXRjaCBtYW4gcGFnZSBzYXlzLCBzbyB5b3UgaGF2ZSB0byByZWFkIHRoZSBmaXJzdCBodW5rCisgICAgICAvLyBhbmQgX2d1ZXNzXy4KKworICAgIC8vIFN0YXJ0IGEgbmV3IGh1bms/ICBVc3VhbGx5IEBAIC1vbGRsaW5lLG9sZGxlbiArbmV3bGluZSxuZXdsZW4gQEAKKyAgICAvLyBidXQgYSBtaXNzaW5nICx2YWx1ZSBtZWFucyB0aGUgdmFsdWUgaXMgMS4KKyAgICB9IGVsc2UgaWYgKHN0YXRlID09IDEgJiYgIXN0cm5jbXAoIkBAIC0iLCBwYXRjaGxpbmUsIDQpKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGNoYXIgKnMgPSBwYXRjaGxpbmUrNDsKKworICAgICAgLy8gUmVhZCBvbGRsaW5lWyxvbGRsZW5dICtuZXdsaW5lWyxuZXdsZW5dCisKKyAgICAgIFRULm9sZGxlbiA9IFRULm5ld2xlbiA9IDE7CisgICAgICBUVC5vbGRsaW5lID0gc3RydG9sKHMsICZzLCAxMCk7CisgICAgICBpZiAoKnMgPT0gJywnKSBUVC5vbGRsZW49c3RydG9sKHMrMSwgJnMsIDEwKTsKKyAgICAgIFRULm5ld2xpbmUgPSBzdHJ0b2wocysyLCAmcywgMTApOworICAgICAgaWYgKCpzID09ICcsJykgVFQubmV3bGVuID0gc3RydG9sKHMrMSwgJnMsIDEwKTsKKworICAgICAgVFQuY29udGV4dCA9IDA7CisgICAgICBzdGF0ZSA9IDI7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGh1bmssIG9wZW4gdGhlIGZpbGUuCisgICAgICBpZiAoVFQuZmlsZWluID09IC0xKSB7CisgICAgICAgIGludCBvbGRzdW0sIG5ld3N1bSwgZGVsID0gMDsKKyAgICAgICAgY2hhciAqbmFtZTsKKworICAgICAgICBvbGRzdW0gPSBUVC5vbGRsaW5lICsgVFQub2xkbGVuOworICAgICAgICBuZXdzdW0gPSBUVC5uZXdsaW5lICsgVFQubmV3bGVuOworCisgICAgICAgIG5hbWUgPSByZXZlcnNlID8gb2xkbmFtZSA6IG5ld25hbWU7CisKKyAgICAgICAgLy8gV2UncmUgZGVsZXRpbmcgb2xkbmFtZSBpZiBuZXcgZmlsZSBpcyAvZGV2L251bGwgKGJlZm9yZSAtcCkKKyAgICAgICAgLy8gb3IgaWYgbmV3IGh1bmsgaXMgZW1wdHkgKHplcm8gY29udGV4dCkgYWZ0ZXIgcGF0Y2hpbmcKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIi9kZXYvbnVsbCIpIHx8ICEocmV2ZXJzZSA/IG9sZHN1bSA6IG5ld3N1bSkpCisgICAgICAgIHsKKyAgICAgICAgICBuYW1lID0gcmV2ZXJzZSA/IG5ld25hbWUgOiBvbGRuYW1lOworICAgICAgICAgIGRlbCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIC1wIHBhdGggdHJ1bmNhdGlvbi4KKyAgICAgICAgZm9yIChpID0gMCwgcyA9IG5hbWU7ICpzOykgeworICAgICAgICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfcCkgJiYgVFQucHJlZml4ID09IGkpIGJyZWFrOworICAgICAgICAgIGlmICgqcysrICE9ICcvJykgY29udGludWU7CisgICAgICAgICAgd2hpbGUgKCpzID09ICcvJykgcysrOworICAgICAgICAgIG5hbWUgPSBzOworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWwpIHsKKyAgICAgICAgICBwcmludGYoInJlbW92aW5nICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICB4dW5saW5rKG5hbWUpOworICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgLy8gSWYgd2UndmUgZ290IGEgZmlsZSB0byBvcGVuLCBkbyBzby4KKyAgICAgICAgfSBlbHNlIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ApIHx8IGkgPD0gVFQucHJlZml4KSB7CisgICAgICAgICAgLy8gSWYgdGhlIG9sZCBmaWxlIHdhcyBudWxsLCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBvbmUuCisgICAgICAgICAgaWYgKCghc3RyY21wKG9sZG5hbWUsICIvZGV2L251bGwiKSB8fCAhb2xkc3VtKSAmJiBhY2Nlc3MobmFtZSwgRl9PSykpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICBpZiAobWtwYXRoYXQoQVRfRkRDV0QsIG5hbWUsIDAsIDIpKQorICAgICAgICAgICAgICBwZXJyb3JfZXhpdCgibWtwYXRoICVzIiwgbmFtZSk7CisgICAgICAgICAgICBUVC5maWxlaW4gPSB4Y3JlYXRlKG5hbWUsIE9fQ1JFQVR8T19FWENMfE9fUkRXUiwgMDY2Nik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigicGF0Y2hpbmcgJXNcbiIsIG5hbWUpOworICAgICAgICAgICAgVFQuZmlsZWluID0geG9wZW5ybyhuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2RyeV9ydW4pCisgICAgICAgICAgICBUVC5maWxlb3V0ID0geG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgICAgICAgICAgZWxzZSBUVC5maWxlb3V0ID0gY29weV90ZW1wZmlsZShUVC5maWxlaW4sIG5hbWUsICZUVC50ZW1wbmFtZSk7CisgICAgICAgICAgVFQubGluZW51bSA9IDA7CisgICAgICAgICAgVFQuaHVua251bSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgVFQuaHVua251bSsrOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkaWRuJ3QgY29udGludWUgYWJvdmUsIGRpc2NhcmQgdGhpcyBsaW5lLgorICAgIGZyZWUocGF0Y2hsaW5lKTsKKyAgfQorCisgIGZpbmlzaF9vbGRmaWxlKCk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGNsb3NlKFRULmZpbGVwYXRjaCk7CisgICAgZnJlZShvbGRuYW1lKTsKKyAgICBmcmVlKG5ld25hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9wcmludGYuYyBiL3RveWJveC90b3lzL3Bvc2l4L3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDFlMmYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9wcmludGYuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogcHJpbnRmLmMgLSBGb3JtYXQgYW5kIFByaW50IHRoZSBkYXRhLgorICoKKyAqIENvcHlyaWdodCAyMDE0IFNhbmRlZXAgU2hhcm1hIDxzYW5kZWVwLmphY2syNzU2QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IEt5dW5nd2FuIEhhbiA8YXN1cmEzMjFAZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcHJpbnRmLmh0bWwKKyAqCisgKiB0b2RvOiAqbSQgYWxhIHByaW50ZigiJTEkZDolMiQuKjMkZDolNCQuKjMkZFxuIiwgaG91ciwgbWluLCBwcmVjaXNpb24sIHNlYyk7CisKK1VTRV9QUklOVEYoTkVXVE9ZKHByaW50ZiwgIjwxP14iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQUklOVEYgCisgIGJvb2wgInByaW50ZiIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcHJpbnRmIEZPUk1BVCBbQVJHVU1FTlQuLi5dCisgICAgCisgICAgRm9ybWF0IGFuZCBwcmludCBBUkdVTUVOVChzKSBhY2NvcmRpbmcgdG8gRk9STUFULCB1c2luZyBDIHByaW50ZiBzeW50YXgKKyAgICAoJSBlc2NhcGVzIGZvciBjZGVFZmdHaW9zdXhYLCBcIGVzY2FwZXMgZm9yIGFiZWZucnR2MCBvciBcT0NUQUwgb3IgXHhIRVgpLgorKi8KKworI2RlZmluZSBGT1JfcHJpbnRmCisjaW5jbHVkZSAidG95cy5oIgorCisvLyBEZXRlY3QgbWF0Y2hpbmcgY2hhcmFjdGVyIChyZXR1cm4gdHJ1ZS9mYWxzZSkgYW5kIGFkdmFuY2UgcG9pbnRlciBpZiBtYXRjaC4KK3N0YXRpYyBpbnQgZWF0KGNoYXIgKipzLCBjaGFyIGMpCit7CisgIGludCB4ID0gKCoqcyA9PSBjKTsKKworICBpZiAoeCkgKysqczsKKworICByZXR1cm4geDsKK30KKworLy8gUGFyc2UgZXNjYXBlIHNlcXVlbmNlcy4KK3N0YXRpYyBpbnQgaGFuZGxlX3NsYXNoKGNoYXIgKiplc2NfdmFsLCBpbnQgcG9zaXgpCit7CisgIGNoYXIgKnB0ciA9ICplc2NfdmFsOworICBpbnQgbGVuLCBiYXNlID0gMDsKKyAgdW5zaWduZWQgcmVzdWx0ID0gMCwgbnVtOworCisgIGlmICgqcHRyID09ICdjJykgeGV4aXQoKTsKKworICAvLyAweDEyIGhleCBlc2NhcGVzIGhhdmUgMS0yIGRpZ2l0cywgXDEyMyBvY3RhbCBlc2NhcGVzIGhhdmUgMS0zIGRpZ2l0cy4KKyAgaWYgKGVhdCgmcHRyLCAneCcpKSBiYXNlID0gMTY7CisgIGVsc2UgeworICAgIGlmIChwb3NpeCAmJiAqcHRyPT0nMCcpIHB0cisrOworICAgIGlmICgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc3JykgYmFzZSA9IDg7CisgIH0KKyAgbGVuID0gKGNoYXIgW10pezAsMywyfVtiYXNlLzhdOworCisgIC8vIE5vdCBhIGhleCBvciBvY3RhbCBlc2NhcGU/IChUaGlzIGNhdGNoZXMgdHJhaWxpbmcgXCkKKyAgaWYgKCFsZW4pIHsKKyAgICBpZiAoIShyZXN1bHQgPSB1bmVzY2FwZSgqcHRyKSkpIHJlc3VsdCA9ICdcXCc7CisgICAgZWxzZSArKyplc2NfdmFsOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHdoaWxlIChsZW4pIHsKKyAgICBudW0gPSB0b2xvd2VyKCpwdHIpIC0gJzAnOworICAgIGlmIChudW0gPj0gJ2EnLScwJykgbnVtICs9ICcwJy0nYScrMTA7CisgICAgaWYgKG51bSA+PSBiYXNlKSB7CisgICAgICAvLyBEb24ndCBwYXJzZSBpbnZhbGlkIGhleCB2YWx1ZSBhbGEgIlx4dmQiLCBwcmludCBpdCB2ZXJiYXRpbQorICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgbGVuID09IDIpIHsKKyAgICAgICAgcHRyLS07CisgICAgICAgIHJlc3VsdCA9ICdcXCc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmVzdWx0ID0gKHJlc3VsdCpiYXNlKStudW07CisgICAgcHRyKys7CisgICAgbGVuLS07CisgIH0KKyAgKmVzY192YWwgPSBwdHI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBwcmludGZfbWFpbih2b2lkKQoreworICBjaGFyICoqYXJnID0gdG95cy5vcHRhcmdzKzE7CisKKyAgLy8gUmVwZWF0IGZvcm1hdCB1bnRpbCBhcmd1bWVudHMgY29uc3VtZWQKKyAgZm9yICg7OykgeworICAgIGludCBzZWVuID0gMDsKKyAgICBjaGFyICpmID0gKnRveXMub3B0YXJnczsKKworICAgIC8vIExvb3AgdGhyb3VnaCBjaGFyYWN0ZXJzIGluIGZvcm1hdAorICAgIHdoaWxlICgqZikgeworICAgICAgaWYgKGVhdCgmZiwgJ1xcJykpIHB1dGNoYXIoaGFuZGxlX3NsYXNoKCZmLCAwKSk7CisgICAgICBlbHNlIGlmICghZWF0KCZmLCAnJScpIHx8ICpmID09ICclJykgcHV0Y2hhcigqZisrKTsKKworICAgICAgLy8gSGFuZGxlICVlc2NhcGUKKyAgICAgIGVsc2UgeworICAgICAgICBjaGFyIGMsICplbmQgPSAwLCAqYWEsICp0byA9IHRveWJ1ZjsKKyAgICAgICAgaW50IHdwW10gPSB7MCwtMX0sIGkgPSAwOworCisgICAgICAgIC8vIFBhcnNlIHdpZHRoLnByZWNpc2lvbiBiZXR3ZWVuICUgYW5kIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAqdG8rKyA9ICclJzsKKyAgICAgICAgd2hpbGUgKHN0cmNocigiLSsjICcwIiwgKmYpICYmICh0by10b3lidWYpPDEwKSAqdG8rKyA9ICpmKys7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICBpZiAoZWF0KCZmLCAnKicpKSB7CisgICAgICAgICAgICBpZiAoKmFyZykgd3BbaV0gPSBhdG9seCgqYXJnKyspOworICAgICAgICAgIH0gZWxzZSB3aGlsZSAoKmYgPj0gJzAnICYmICpmIDw9ICc5Jykgd3BbaV0gPSAod3BbaV0qMTApKygqZisrKS0nMCc7CisgICAgICAgICAgaWYgKGkrKyB8fCAhZWF0KCZmLCAnLicpKSBicmVhazsKKyAgICAgICAgICB3cFsxXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYyA9ICpmKys7CisgICAgICAgIHNlZW4gPSBzcHJpbnRmKHRvLCAiKi4qJWMiLCBjKTs7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgYWEgPSAqYXJnID8gKmFyZysrIDogIiI7CisKKyAgICAgICAgLy8gT3V0cHV0ICVlc2MgdXNpbmcgcGFyc2VkIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgaWYgKGMgPT0gJ2InKSB7CisgICAgICAgICAgd2hpbGUgKCphYSkgcHV0Y2hhcihlYXQoJmFhLCAnXFwnKSA/IGhhbmRsZV9zbGFzaCgmYWEsIDEpIDogKmFhKyspOworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnYycpIHByaW50Zih0b3lidWYsIHdwWzBdLCB3cFsxXSwgKmFhKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAncycpIHByaW50Zih0b3lidWYsIHdwWzBdLCB3cFsxXSwgYWEpOworICAgICAgICBlbHNlIGlmIChzdHJjaHIoImRpb3V4WCIsIGMpKSB7CisgICAgICAgICAgbG9uZyBsbDsKKworICAgICAgICAgIGlmICgqYWEgPT0gJ1wnJyB8fCAqYWEgPT0gJyInKSBsbCA9IGFhWzFdOworICAgICAgICAgIGVsc2UgbGwgPSBzdHJ0b2xsKGFhLCAmZW5kLCAwKTsKKworICAgICAgICAgIHNwcmludGYodG8sICIqLipsbCVjIiwgYyk7CisgICAgICAgICAgcHJpbnRmKHRveWJ1Ziwgd3BbMF0sIHdwWzFdLCBsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY2hyKCJmZUVnRyIsIGMpKSB7CisgICAgICAgICAgbG9uZyBkb3VibGUgbGQgPSBzdHJ0b2xkKGFhLCAmZW5kKTsKKworICAgICAgICAgIHNwcmludGYodG8sICIqLipMJWMiLCBjKTsKKyAgICAgICAgICBwcmludGYodG95YnVmLCB3cFswXSwgd3BbMV0sIGxkKTsKKyAgICAgICAgfSBlbHNlIGVycm9yX2V4aXQoImJhZCAlJSVjQCVsZCIsIGMsIChsb25nKShmLSp0b3lzLm9wdGFyZ3MpKTsKKworICAgICAgICBpZiAoZW5kICYmIChlcnJubyB8fCAqZW5kKSkgcGVycm9yX21zZygiYmFkICUlJWMgJXMiLCBjLCBhYSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUG9zaXggc2F5cyB0byBrZWVwIGxvb3BpbmcgdGhyb3VnaCBmb3JtYXQgdW50aWwgd2UgY29uc3VtZSBhbGwgYXJncy4KKyAgICAvLyBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGZvcm1hdCBhY3R1YWxseSBjb25zdW1lZCBhdCBsZWFzdCBvbmUgYXJnLgorICAgIGlmICghc2VlbiB8fCAhKmFyZykgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3BzLmMgYi90b3lib3gvdG95cy9wb3NpeC9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTI4YmQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9wcy5jCkBAIC0wLDAgKzEsMTc2NSBAQAorLyogcHMuYyAtIHNob3cgcHJvY2VzcyBsaXN0CisgKgorICogQ29weXJpZ2h0IDIwMTUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3BzLmh0bWwKKyAqIEFuZCBodHRwOi8va2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBUYWJsZSAxLTQKKyAqIEFuZCBsaW51eCBrZXJuZWwgc291cmNlIGZzL3Byb2MvYXJyYXkuYyBmdW5jdGlvbiBkb190YXNrX3N0YXQoKQorICoKKyAqIERldmlhdGlvbnMgZnJvbSBwb3NpeDogbm8gLW4gYmVjYXVzZSAvcHJvYy9zZWxmL3djaGFuIGV4aXN0czsgd2UgdXNlIC1uIHRvCisgKiBtZWFuICJzaG93IG51bWVyaWMgdXNlcnMgYW5kIGdyb3VwcyIgaW5zdGVhZC4KKyAqIFBvc2l4IHNheXMgZGVmYXVsdCBvdXRwdXQgc2hvdWxkIGhhdmUgZmllbGQgbmFtZWQgIlRUWSIgYnV0IGlmIHlvdSAiLW8gdHR5IgorICogdGhlIHNhbWUgZmllbGQgc2hvdWxkIGJlIGNhbGxlZCAiVFQiIHdoaWNoIGlzIF9JTlNBTkVfIGFuZCBJJ20gbm90IGRvaW5nIGl0LgorICogU2ltaWxhcmx5IC1mIG91dHB1dHMgVVNFUiBidXQgY2FsbHMgaXQgVUlEICh3ZSBjYWxsIGl0IFVTRVIpLgorICogSXQgYWxzbyBzYXlzIHRoYXQgLW8gImFyZ3MiIGFuZCAiY29tbSIgc2hvdWxkIGJlaGF2ZSBkaWZmZXJlbnRseSBidXQgdXNlCisgKiB0aGUgc2FtZSB0aXRsZSwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIHRpdGxlIGFzIHRoZSBkZWZhdWx0IG91dHB1dC4gKE5vLikKKyAqIFNlbGVjdCBieSBzZXNzaW9uIGlkIGlzIC1zIG5vdCAtZy4KKyAqCisgKiBQb3NpeCBkZWZpbmVzIC1vIEFERFIgYXMgIlRoZSBhZGRyZXNzIG9mIHRoZSBwcm9jZXNzIiBidXQgdGhlIHByb2Nlc3MKKyAqIHN0YXJ0IGFkZHJlc3MgaXMgYSBjb25zdGFudCBvbiBhbnkgZWxmIHN5c3RlbSB3aXRoIG1tdS4gVGhlIHByb2NwcyBBRERSCisgKiBmaWVsZCBhbHdheXMgcHJpbnRzICItIiB3aXRoIGFuIGFsaWdubWVudCBvZiAxLCB3aGljaCBpcyB3aHkgaXQgaGFzIDExCisgKiBjaGFyYWN0ZXJzIGxlZnQgZm9yICJjbWQiIGluIGluIDgwIGNvbHVtbiAicHMgLWwiIG1vZGUuIE9uIHg4Ni02NCB5b3UKKyAqIG5lZWQgMTIgY2hhcnMsIGxlYXZpbmcgbm90aGluZyBmb3IgY21kOiBJLkUuIHBvc2l4IDIwMDggcHMgLWwgbW9kZSBjYW4ndAorICogYmUgc2FuZWx5IGltcGxlbWVudGVkIG9uIDY0IGJpdCBMaW51eCBzeXN0ZW1zLiBJbiBwcm9jcHMgdGhlcmUncyBwcyAteQorICogd2hpY2ggY2hhbmdlcyAtbCBieSByZW1vdmluZyB0aGUgIkYiIGNvbHVtbiBhbmQgc3dhcHBpbmcgUlNTIGZvciBBRERSLAorICogbGVhdmluZyA5IGNoYXJzIGZvciBjbWQsIHNvIHdlJ3JlIHVzaW5nIHRoYXQgYXMgb3VyIC1sIG91dHB1dC4KKyAqCisgKiBBZGRlZCBhIGJ1bmNoIG9mIG5ldyAtbyBmaWVsZHMgcG9zaXggZG9lc24ndCBtZW50aW9uLCBhbmQgd2UgZG9uJ3QKKyAqIGxhYmVsICJwcyAtbyBjb21tYW5kLGFyZ3MsY29tbSIgYXMgIkNPTU1BTkQgQ09NTUFORCBDT01NQU5EIi4gV2UgZG9uJ3QKKyAqIG91dHB1dCBhcmd2WzBdIHVubW9kaWZpZWQgZm9yIC1vIGNvbW0gb3IgLW8gYXJncyAoYnV0IHByb2NwcyB2aW9sYXRlcworICogcG9zaXggZm9yIC1vIGNvbW0gYW55d2F5LCBpdCdzIHN0YXRbMl0gbm90IGFyZ3ZbMF0pLgorICoKKyAqIE5vdGU6IGlvdG9wIGlzIFNUQVlST09UIHNvIGl0IGNhbiByZWFkIG90aGVyIHByb2Nlc3MncyAvcHJvYy8kUElEL2lvCisgKiAgICAgICBmaWxlcyAod2h5IHRoZXkncmUgbm90IGdsb2JhbGx5IHJlYWRhYmxlIHdoZW4gdGhlIHJlc3Qgb2YgcHJvYworICogICAgICAgZGF0YSBpcy4uLj8pIGFuZCBnZXQgYSBnbG9iYWwgSS9PIHBpY3R1cmUuIE5vcm1hbCB0b3AgaXMgTk9ULAorICogICAgICAgZXZlbiB0aG91Z2ggeW91IGNhbiAtbyBBSU8gdGhlcmUsIHRvIGdpdmUgc3lzYWRtaW5zIHRoZSBvcHRpb24KKyAqICAgICAgIHRvIHJlZHVjZSBzZWN1cml0eSBleHBvc3VyZS4pCisgKgorICogVE9ETzogcHMgYXV4IChhdHQgJiBic2Qgc3R5bGUgInBzIC1heCIgdnMgInBzIGF4IiBiZWhhdmlvciBkaWZmZXJlbmNlKQorICogVE9ETzogc3dpdGNoIC1mbCB0byAteQorICogVE9ETzogdGhyZWFkIHN1cHBvcnQgL3Byb2MvJGQvdGFzay8lZC9zdGF0IChhbmQgLW8gc3RhdCBoYXMgImwiKQorICogVE9ETzogaW90b3A6IFdpbmRvdyBzaXplIGNoYW5nZTogcmVzcG9uZCBpbW1lZGlhdGVseS4gV2h5IG5vdCBwYWRkaW5nCisgKiAgICAgICBhdCByaWdodCBlZGdlPyAoTm90IGFkanVzdGluZyB0byBzY3JlZW4gc2l6ZSBhdCBhbGw/IEhlYWRlciB3cmFwcz8pCisgKiBUT0RPOiB0b3A6IHRocmVhZCBzdXBwb3J0IGFuZCBTTVAKKyAqIFRPRE86IHBncmVwIC1mIG9ubHkgc2VhcmNoZXMgdGhlIGFtb3VudCBvZiBjbWRsaW5lIHRoYXQgZml0cyBpbiB0b3lidWYuCisKK1VTRV9QUyhORVdUT1kocHMsICJrKHNvcnQpKlAocHBpZCkqYUFkZWZsTW5vKk8qcChwaWQpKnMqdCpUdSpVKmcqRyp3Wlshb2xdWytBZV1bIW9PXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKKy8vIHN0YXlyb290IGJlY2F1c2UgaW90b3AgbmVlZHMgcm9vdCB0byByZWFkIG90aGVyIHByb2Nlc3MnIHByb2MvJCQvaW8KK1VTRV9UT1AoTkVXVE9ZKHRvcCwgIj4wbSIgIk8qSGsqbypwKnUqcyM8MWQjPTM8MW4jPDFicVshb09dIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorVVNFX0lPVE9QKE5FV1RPWShpb3RvcCwgIj4wQWFLTyIgImsqbypwKnUqcyM8MT03ZCM9MzwxbiM8MWJxIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19TVEFZUk9PVHxUT1lGTEFHX0xPQ0FMRSkpCitVU0VfUEdSRVAoTkVXVE9ZKHBncmVwLCAiP2NsZDp1KlUqdCpzKlAqZypHKmZub3Z4TDpbLW5vXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKK1VTRV9QS0lMTChORVdUT1kocGtpbGwsICAgICI/VnUqVSp0KnMqUCpnKkcqZm5vdnhsOlstbm9dIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgUFMKKyAgYm9vbCAicHMiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHBzIFstQWFkZWZMbG53Wl0gWy1nRyBHUk9VUCxdIFstayBGSUVMRCxdIFstbyBGSUVMRCxdIFstcCBQSUQsXSBbLXQgVFRZLF0gWy11VSBVU0VSLF0KKworICAgIExpc3QgcHJvY2Vzc2VzLgorCisgICAgV2hpY2ggcHJvY2Vzc2VzIHRvIHNob3cgKHNlbGVjdGlvbnMgbWF5IGJlIGNvbW1hIHNlcGFyYXRlZCBsaXN0cyk6CisKKyAgICAtQQlBbGwgcHJvY2Vzc2VzCisgICAgLWEJUHJvY2Vzc2VzIHdpdGggdGVybWluYWxzIHRoYXQgYXJlbid0IHNlc3Npb24gbGVhZGVycworICAgIC1kCUFsbCBwcm9jZXNzZXMgdGhhdCBhcmVuJ3Qgc2Vzc2lvbiBsZWFkZXJzCisgICAgLWUJU2FtZSBhcyAtQQorICAgIC1nCUJlbG9uZ2luZyB0byBHUk9VUHMKKyAgICAtRwlCZWxvbmdpbmcgdG8gcmVhbCBHUk9VUHMgKGJlZm9yZSBzZ2lkKQorICAgIC1wCVBJRHMgKC0tcGlkKQorICAgIC1QCVBhcmVudCBQSURzICgtLXBwaWQpCisgICAgLXMJSW4gc2Vzc2lvbiBJRHMKKyAgICAtdAlBdHRhY2hlZCB0byBzZWxlY3RlZCBUVFlzCisgICAgLVQJU2hvdyB0aHJlYWRzCisgICAgLXUJT3duZWQgYnkgVVNFUnMKKyAgICAtVQlPd25lZCBieSByZWFsIFVTRVJzIChiZWZvcmUgc3VpZCkKKworICAgIE91dHB1dCBtb2RpZmllcnM6CisKKyAgICAtawlTb3J0IEZJRUxEcyBpbiAraW5jcmVhc2luZyBvciAtZGVjcmVhc3Rpbmcgb3JkZXIgKC0tc29ydCkKKyAgICAtTQlNZWFzdXJlIGZpZWxkIHdpZHRocyAoZXhwYW5kaW5nIGFzIG5lY2Vzc2FyeSkKKyAgICAtbglTaG93IG51bWVyaWMgVVNFUiBhbmQgR1JPVVAKKyAgICAtdwlXaWRlIG91dHB1dCAoZG9uJ3QgdHJ1bmNhdGUgYXQgdGVybWluYWwgd2lkdGgpCisKKyAgICBXaGljaCBGSUVMRHMgdG8gc2hvdy4gKERlZmF1bHQgPSAtbyBQSUQsVFRZLFRJTUUsQ01EKQorCisgICAgLWYJRnVsbCBsaXN0aW5nICgtbyBVU0VSOjg9VUlELFBJRCxQUElELEMsU1RJTUUsVFRZLFRJTUUsQVJHUz1DTUQpCisgICAgLWwJTG9uZyBsaXN0aW5nICgtbyBGLFMsVUlELFBJRCxQUElELEMsUFJJLE5JLEFERFIsU1osV0NIQU4sVFRZLFRJTUUsQ01EKQorICAgIC1vCU91dHB1dCBGSUVMRHMgaW5zdGVhZCBvZiBkZWZhdWx0cywgZWFjaCB3aXRoIG9wdGlvbmFsIDpzaXplIGFuZCA9dGl0bGUKKyAgICAtTwlBZGQgRklFTERTIHRvIGRlZmF1bHRzCisgICAgLVoJSW5jbHVkZSBMQUJFTAorCisgICAgQ29tbWFuZCBsaW5lIC1vIGZpZWxkczoKKworICAgICAgQVJHUyAgICAgQ01ETElORSBtaW51cyBpbml0aWFsIHBhdGggICAgIENNRCAgQ29tbWFuZCAodGhyZWFkKSBuYW1lIChzdGF0WzJdKQorICAgICAgQ01ETElORSAgQ29tbWFuZCBsaW5lIChhcmd2W10pICAgICAgICAgIENPTU0gQ29tbWFuZCBmaWxlbmFtZSAoL3Byb2MvJFBJRC9leGUpCisgICAgICBDT01NQU5EICBDb21tYW5kIGZpbGUgKC9wcm9jLyRQSUQvZXhlKSAgTkFNRSBQcm9jZXNzIG5hbWUgKGFyZ3ZbMF0gb2YgJFBJRCkKKworICAgIFByb2Nlc3MgYXR0cmlidXRlIC1vIEZJRUxEczoKKworICAgICAgQUREUiAgSW5zdHJ1Y3Rpb24gcG9pbnRlciAgICAgICAgICAgICAgIEJJVCAgIElzIHRoaXMgcHJvY2VzcyAzMiBvciA2NCBiaXRzCisgICAgICBDUFUgICBXaGljaCBwcm9jZXNzb3IgcnVubmluZyBvbiAgICAgICAgRVRJTUUgICBFbGFwc2VkIHRpbWUgc2luY2UgUElEIHN0YXJ0CisgICAgICBGICAgICBGbGFncyAoMT1GT1JLTk9FWEVDIDQ9U1VQRVJQUklWKSAgR0lEICAgICBHcm91cCBpZAorICAgICAgR1JPVVAgR3JvdXAgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIExBQkVMICAgU2VjdXJpdHkgbGFiZWwKKyAgICAgIE1BSkZMIE1ham9yIHBhZ2UgZmF1bHRzICAgICAgICAgICAgICAgICBNSU5GTCAgIE1pbm9yIHBhZ2UgZmF1bHRzCisgICAgICBOSSAgICBOaWNlbmVzcyAobG93ZXIgaXMgZmFzdGVyKQorICAgICAgUENQVSAgUGVyY2VudGFnZSBvZiBDUFUgdGltZSB1c2VkICAgICAgIFBDWSAgICAgQW5kcm9pZCBzY2hlZHVsaW5nIHBvbGljeQorICAgICAgUEdJRCAgUHJvY2VzcyBHcm91cCBJRAorICAgICAgUElEICAgUHJvY2VzcyBJRCAgICAgICAgICAgICAgICAgICAgICAgIFBQSUQgICAgUGFyZW50IFByb2Nlc3MgSUQKKyAgICAgIFBSSSAgIFByaW9yaXR5IChoaWdoZXIgaXMgZmFzdGVyKSAgICAgICBQU1IgICAgIFByb2Nlc3NvciBsYXN0IGV4ZWN1dGVkIG9uCisgICAgICBSR0lEICBSZWFsIChiZWZvcmUgc2dpZCkgZ3JvdXAgSUQgICAgICAgUkdST1VQICBSZWFsIChiZWZvcmUgc2dpZCkgZ3JvdXAgbmFtZQorICAgICAgUlNTICAgUmVzaWRlbnQgU2V0IFNpemUgKHBhZ2VzIGluIHVzZSkgIFJUUFJJTyAgUmVhbHRpbWUgcHJpb3JpdHkKKyAgICAgIFJVSUQgIFJlYWwgKGJlZm9yZSBzdWlkKSB1c2VyIElEICAgICAgICBSVVNFUiAgIFJlYWwgKGJlZm9yZSBzdWlkKSB1c2VyIG5hbWUKKyAgICAgIFMgICAgIFByb2Nlc3Mgc3RhdGU6CisgICAgICAgICAgICBSIChydW5uaW5nKSBTIChzbGVlcGluZykgRCAoZGV2aWNlIEkvTykgVCAoc3RvcHBlZCkgIHQgKHRyYWNlZCkKKyAgICAgICAgICAgIFogKHpvbWJpZSkgIFggKGRlYWRlcikgICB4IChkZWFkKSAgICAgICBLICh3YWtla2lsbCkgVyAod2FraW5nKQorICAgICAgU0NIRUQgU2NoZWR1bGluZyBwb2xpY3kgKDA9b3RoZXIsIDE9ZmlmbywgMj1yciwgMz1iYXRjaCwgND1pc28sIDU9aWRsZSkKKyAgICAgIFNUQVQgIFByb2Nlc3Mgc3RhdGUgKFMpIHBsdXM6CisgICAgICAgICAgICA8IGhpZ2ggcHJpb3JpdHkgICAgICAgICAgTiBsb3cgcHJpb3JpdHkgTCBsb2NrZWQgbWVtb3J5CisgICAgICAgICAgICBzIHNlc3Npb24gbGVhZGVyICAgICAgICAgKyBmb3JlZ3JvdW5kICAgbCBtdWx0aXRocmVhZGVkCisgICAgICBTVElNRSBTdGFydCB0aW1lIG9mIHByb2Nlc3MgaW4gaGg6bW0gKHNpemUgOjE5IHNob3dzIHl5eXktbW0tZGQgaGg6bW06c3MpCisgICAgICBTWiAgICBNZW1vcnkgU2l6ZSAoNGsgcGFnZXMgbmVlZGVkIHRvIGNvbXBsZXRlbHkgc3dhcCBvdXQgcHJvY2VzcykKKyAgICAgIFRDTlQgIFRocmVhZCBjb3VudCAgICAgICAgICAgICAgICAgICAgICBUSUQgICAgIFRocmVhZCBJRAorICAgICAgVElNRSAgQ1BVIHRpbWUgY29uc3VtZWQgICAgICAgICAgICAgICAgIFRUWSAgICAgQ29udHJvbGxpbmcgdGVybWluYWwKKyAgICAgIFVJRCAgIFVzZXIgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSICAgIFVzZXIgbmFtZQorICAgICAgVlNaICAgVmlydHVhbCBtZW1vcnkgc2l6ZSAoMWsgdW5pdHMpICAgICVWU1ogICAgVlNaIGFzICUgb2YgcGh5c2ljYWwgbWVtb3J5CisgICAgICBXQ0hBTiBXaGF0IGFyZSB3ZSB3YWl0aW5nIGluIGtlcm5lbCBmb3IKKworY29uZmlnIFRPUAorICBib29sICJ0b3AiCisgIGRlcGVuZHMgb24gVE9QX0NPTU1PTgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB0b3AgWy1IXSBbLWsgRklFTEQsXSBbLW8gRklFTEQsXSBbLXMgU09SVF0KKworICAgIFNob3cgcHJvY2VzcyBhY3Rpdml0eSBpbiByZWFsIHRpbWUuCisKKyAgICAtSAlTaG93IHRocmVhZHMKKyAgICAtawlGYWxsYmFjayBzb3J0IEZJRUxEUyAoZGVmYXVsdCAtUywtJUNQVSwtRVRJTUUsLVBJRCkKKyAgICAtbwlTaG93IEZJRUxEUyAoZGVmIFBJRCxVU0VSLFBSLE5JLFZJUlQsUkVTLFNIUixTLCVDUFUsJU1FTSxUSU1FKyxDTURMSU5FKQorICAgIC1PCUFkZCBGSUVMRFMgKHJlcGxhY2luZyBQUixOSSxWSVJULFJFUyxTSFIsUyBmcm9tIGRlZmF1bHQpCisgICAgLXMJU29ydCBieSBmaWVsZCBudW1iZXIgKDEtWCwgZGVmYXVsdCA5KQorCisjIFJlcXVpcmVzIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HIGluIHRoZSBrZXJuZWwgZm9yIC9wcm9jLyQkL2lvCitjb25maWcgSU9UT1AKKyAgYm9vbCAiaW90b3AiCisgIGRlcGVuZHMgb24gVE9QX0NPTU1PTgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBpb3RvcCBbLUFhS09dCisKKyAgICBSYW5rIHByb2Nlc3NlcyBieSBJL08uCisKKyAgICAtQQlBbGwgSS9PLCBub3QganVzdCBkaXNrCisgICAgLWEJQWNjdW11bGF0ZWQgSS9PIChub3QgcGVyY2VudGFnZSkKKyAgICAtSwlLaWxvYnl0ZXMKKyAgICAtawlGYWxsYmFjayBzb3J0IEZJRUxEUyAoZGVmYXVsdCAtW0RdSU8sLUVUSU1FLC1QSUQpCisgICAgLU8JT25seSBzaG93IHByb2Nlc3NlcyBkb2luZyBJL08KKyAgICAtbwlTaG93IEZJRUxEUyAoZGVmYXVsdCBQSUQsUFIsVVNFUixbRF1SRUFELFtEXVdSSVRFLFNXQVAsW0RdSU8sQ09NTSkKKyAgICAtcwlTb3J0IGJ5IGZpZWxkIG51bWJlciAoMC1YLCBkZWZhdWx0IDYpCisKK2NvbmZpZyBUT1BfQ09NTU9OCisgIGJvb2wKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogKiBbLWJxXSBbLW4gTlVNQkVSXSBbLWQgU0VDT05EU10gWy1wIFBJRCxdIFstdSBVU0VSLF0KKworICAgIC1iCUJhdGNoIG1vZGUgKG5vIHR0eSkKKyAgICAtZAlEZWxheSBTRUNPTkRTIGJldHdlZW4gZWFjaCBjeWNsZSAoZGVmYXVsdCAzKQorICAgIC1uCUV4aXQgYWZ0ZXIgTlVNQkVSIGl0ZXJhdGlvbnMKKyAgICAtcAlTaG93IHRoZXNlIFBJRHMKKyAgICAtdQlTaG93IHRoZXNlIFVTRVJzCisgICAgLXEJUXVpZXQgKG5vIGhlYWRlciBsaW5lcykKKworICAgIEN1cnNvciBMRUZUL1JJR0hUIHRvIGNoYW5nZSBzb3J0LCBVUC9ET1dOIG1vdmUgbGlzdCwgc3BhY2UgdG8gZm9yY2UKKyAgICB1cGRhdGUsIFIgdG8gcmV2ZXJzZSBzb3J0LCBRIHRvIGV4aXQuCisKK2NvbmZpZyBQR1JFUAorICBib29sICJwZ3JlcCIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gUEdLSUxMX0NPTU1PTgorICBoZWxwCisgICAgdXNhZ2U6IHBncmVwIFstY0xdIFstZCBERUxJTV0gWy1MIFNJR05BTF0gW1BBVFRFUk5dCisKKyAgICBTZWFyY2ggZm9yIHByb2Nlc3MoZXMpLiBQQVRURVJOIGlzIGFuIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGVja2VkCisgICAgYWdhaW5zdCBjb21tYW5kIG5hbWVzLgorCisgICAgLWMJU2hvdyBvbmx5IGNvdW50IG9mIG1hdGNoZXMKKyAgICAtZAlVc2UgREVMSU0gaW5zdGVhZCBvZiBuZXdsaW5lCisgICAgLUwJU2VuZCBTSUdOQUwgaW5zdGVhZCBvZiBwcmludGluZyBuYW1lCisgICAgLWwJU2hvdyBjb21tYW5kIG5hbWUKKworY29uZmlnIFBLSUxMCisgIGJvb2wgInBraWxsIgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBQR0tJTExfQ09NTU9OCisgIGhlbHAKKyAgICB1c2FnZTogcGtpbGwgWy1TSUdOQUx8LWwgU0lHTkFMXSBbUEFUVEVSTl0KKworICAgIC1sCVNlbmQgU0lHTkFMIChkZWZhdWx0IFNJR1RFUk0pCisgICAgLVYJdmVyYm9zZQorCitjb25maWcgUEdLSUxMX0NPTU1PTgorICBib29sCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6ICogWy1mbm92eF0gWy1HIEdJRCxdIFstZyBQR1JQLF0gWy1QIFBQSUQsXSBbLXMgU0lELF0gWy10IFRFUk0sXSBbLVUgVUlELF0gWy11IEVVSUQsXQorCisgICAgLWYJQ2hlY2sgZnVsbCBjb21tYW5kIGxpbmUgZm9yIFBBVFRFUk4KKyAgICAtRwlNYXRjaCByZWFsIEdyb3VwIElEKHMpCisgICAgLWcJTWF0Y2ggUHJvY2VzcyBHcm91cChzKSAoMCBpcyBjdXJyZW50IHVzZXIpCisgICAgLW4JTmV3ZXN0IG1hdGNoIG9ubHkKKyAgICAtbwlPbGRlc3QgbWF0Y2ggb25seQorICAgIC1QCU1hdGNoIFBhcmVudCBQcm9jZXNzIElEKHMpCisgICAgLXMJTWF0Y2ggU2Vzc2lvbiBJRChzKSAoMCBmb3IgY3VycmVudCkKKyAgICAtdAlNYXRjaCBUZXJtaW5hbChzKQorICAgIC1VCU1hdGNoIHJlYWwgVXNlciBJRChzKQorICAgIC11CU1hdGNoIGVmZmVjdGl2ZSBVc2VyIElEKHMpCisgICAgLXYJTmVnYXRlIHRoZSBtYXRjaAorICAgIC14CU1hdGNoIHdob2xlIGNvbW1hbmQgKG5vdCBzdWJzdHJpbmcpCisqLworCisjZGVmaW5lIEZPUl9wcworI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKkc7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKmc7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKlU7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnU7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnQ7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnM7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKnA7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKk87CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKm87CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKlA7CisgICAgICBzdHJ1Y3QgYXJnX2xpc3QgKms7CisgICAgfSBwczsKKyAgICBzdHJ1Y3QgeworICAgICAgbG9uZyBuOworICAgICAgbG9uZyBkOworICAgICAgbG9uZyBzOworICAgICAgc3RydWN0IGFyZ19saXN0ICp1OworICAgICAgc3RydWN0IGFyZ19saXN0ICpwOworICAgICAgc3RydWN0IGFyZ19saXN0ICpvOworICAgICAgc3RydWN0IGFyZ19saXN0ICprOworICAgICAgc3RydWN0IGFyZ19saXN0ICpPOworICAgIH0gdG9wOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyICpMOworICAgICAgc3RydWN0IGFyZ19saXN0ICpHOworICAgICAgc3RydWN0IGFyZ19saXN0ICpnOworICAgICAgc3RydWN0IGFyZ19saXN0ICpQOworICAgICAgc3RydWN0IGFyZ19saXN0ICpzOworICAgICAgc3RydWN0IGFyZ19saXN0ICp0OworICAgICAgc3RydWN0IGFyZ19saXN0ICpVOworICAgICAgc3RydWN0IGFyZ19saXN0ICp1OworICAgICAgY2hhciAqZDsKKworICAgICAgdm9pZCAqcmVnZXhlcywgKnNuYXBzaG90OworICAgICAgaW50IHNpZ25hbDsKKyAgICAgIHBpZF90IHNlbGYsIG1hdGNoOworICAgIH0gcGdyZXA7CisgIH07CisKKyAgc3RydWN0IHN5c2luZm8gc2k7CisgIHN0cnVjdCBwdHJfbGVuIGdnLCBHRywgcHAsIFBQLCBzcywgdHQsIHV1LCBVVTsKKyAgc3RydWN0IGRpcnRyZWUgKnRocmVhZHBhcmVudDsKKyAgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKyAgZGV2X3QgdHR5OworICB2b2lkICpmaWVsZHMsICprZmllbGRzOworICBsb25nIGxvbmcgdGlja3MsIGJpdHMsIHRpbWU7CisgIGludCBrY291bnQsIGZvcmNlaywgc29ydHBvczsKKyAgaW50ICgqbWF0Y2hfcHJvY2VzcykobG9uZyBsb25nICpzbG90KTsKKyAgdm9pZCAoKnNob3dfcHJvY2Vzcykodm9pZCAqdGIpOworKQorCitzdHJ1Y3Qgc3RyYXdiZXJyeSB7CisgIHN0cnVjdCBzdHJhd2JlcnJ5ICpuZXh0LCAqcHJldjsKKyAgc2hvcnQgd2hpY2gsIGxlbiwgcmV2ZXJzZTsKKyAgY2hhciAqdGl0bGU7CisgIGNoYXIgZm9yZXZlcltdOworfTsKKworLyogVGhlIHNsb3RbXSBhcnJheSBpcyBtb3N0bHkgcG9wdWxhdGVkIGZyb20gL3Byb2MvJFBJRC9zdGF0IChrZXJuZWwgcHJvYy50eHQKKyAqIHRhYmxlIDEtNCkgYnV0IHdlIHNoaWZ0IGFuZCByZXB1cnBvc2UgZmllbGRzLCB3aXRoIHRoZSByZXN1bHQgYmVpbmc6ICovCisKK2VudW0geworIFNMT1RfcGlkLCAgICAgIC8qcHJvY2VzcyBpZCovICAgICAgICAgICAgU0xPVF9wcGlkLCAgICAgIC8vIHBhcmVudCBwcm9jZXNzIGlkCisgU0xPVF9wZ3JwLCAgICAgLypwcm9jZXNzIGdyb3VwKi8gICAgICAgICBTTE9UX3NpZCwgICAgICAgLy8gc2Vzc2lvbiBpZAorIFNMT1RfdHR5bnIsICAgIC8qdHR5IHRoZSBwcm9jZXNzIHVzZXMqLyAgU0xPVF90dHlwZ3JwLCAgIC8vIHBncnAgb2YgdGhlIHR0eQorIFNMT1RfZmxhZ3MsICAgIC8qdGFzayBmbGFncyovICAgICAgICAgICAgU0xPVF9taW5mbHQsICAgIC8vIG1pbm9yIGZhdWx0cworIFNMT1RfY21pbmZsdCwgIC8qbWlub3IgZmF1bHRzK2NoaWxkKi8gICAgU0xPVF9tYWpmbHQsICAgIC8vIG1ham9yIGZhdWx0cworIFNMT1RfY21hamZsdCwgIC8qbWFqb3IgZmF1bHRzK2NoaWxkKi8gICAgU0xPVF91dGltZSwgICAgIC8vIHVzZXIra2VybmVsIGppZmZpZXMKKyBTTE9UX3N0aW1lLCAgICAvKmtlcm5lbCBtb2RlIGppZmZpZXMqLyAgIFNMT1RfY3V0aW1lLCAgICAvLyB1dGltZStjaGlsZAorIFNMT1RfY3N0aW1lLCAgIC8qc3RpbWUrY2hpbGQqLyAgICAgICAgICAgU0xPVF9wcmlvcml0eSwgIC8vIHByaW9yaXR5IGxldmVsCisgU0xPVF9uaWNlLCAgICAgLypuaWNlIGxldmVsKi8gICAgICAgICAgICBTTE9UX251bXRocmVhZHMsLy8gdGhyZWFkIGNvdW50CisgU0xPVF92bWxjaywgICAgLypsb2NrZWQgbWVtb3J5Ki8gICAgICAgICBTTE9UX3N0YXJ0dGltZSwgLy8gamlmZmllcyBhZnRlciBib290CisgU0xPVF92c2l6ZSwgICAgLyp2aXJ0dWFsIG1lbW9yeSBzaXplKi8gICBTTE9UX3JzcywgICAgICAgLy8gcmVzaWRlbnQgc2V0IHNpemUKKyBTTE9UX3Jzc2xpbSwgICAvKmxpbWl0IGluIGJ5dGVzIG9uIHJzcyovIFNMT1Rfc3RhcnRjb2RlLCAvLyBjb2RlIHNlZ21lbnQgYWRkcgorIFNMT1RfZW5kY29kZSwgIC8qY29kZSBzZWdtZW50IGFkZHJlc3MqLyAgU0xPVF9zdGFydHN0YWNrLC8vIHN0YWNrIGFkZHJlc3MKKyBTTE9UX2VzcCwgICAgICAvKnRhc2sgc3RhY2sgcG9pbnRlciovICAgIFNMT1RfZWlwLCAgICAgICAvLyBpbnN0cnVjdGlvbiBwb2ludGVyCisgU0xPVF9pb2J5dGVzLCAgLypBbGwgSS9PIGJ5dGVzKi8gICAgICAgICBTTE9UX2Rpb2J5dGVzLCAgLy8gZGlzayBJL08gYnl0ZXMKKyBTTE9UX3V0aW1lMiwgICAvKnJlbGF0aXZlIHV0aW1lICh0b3ApKi8gIFNMT1RfdWlkLCAgICAgICAvLyB1c2VyIGlkCisgU0xPVF9ydWlkLCAgICAgLypyZWFsIHVzZXIgaWQqLyAgICAgICAgICBTTE9UX2dpZCwgICAgICAgLy8gZ3JvdXAgaWQKKyBTTE9UX3JnaWQsICAgICAvKnJlYWwgZ3JvdXAgaWQqLyAgICAgICAgIFNMT1RfZXhpdHNpZywgICAvLyBzZW50IHRvIHBhcmVudAorIFNMT1RfdGFza2NwdSwgIC8qQ1BVIHJ1bm5pbmcgb24qLyAgICAgICAgU0xPVF9ydHByaW8sICAgIC8vIHJlYWx0aW1lIHByaW9yaXR5CisgU0xPVF9wb2xpY3ksICAgLyptYW4gc2NoZWRfc2V0c2NoZWR1bGVyKi9TTE9UX2Jsa2lvdGlja3MsLy8gSU8gd2FpdCB0aW1lCisgU0xPVF9ndGltZSwgICAgLypndWVzdCBqaWZmaWVzIG9mIHRhc2sqLyBTTE9UX2NndGltZSwgICAgLy8gZ3RpbWUrY2hpbGQKKyBTTE9UX3N0YXJ0YnNzLCAvKmRhdGEvYnNzIGFkZHJlc3MqLyAgICAgIFNMT1RfZW5kYnNzLCAgICAvLyBlbmQgYWRkciBkYXRhK2JzcworIFNMT1RfdXB0aWNrcywgIC8qNDYtMTkgKGRpdmlzb3IgZm9yICUpKi8gU0xPVF9hcmd2MGxlbiwgIC8vIGFyZ3ZbMF0gbGVuZ3RoCisgU0xPVF91cHRpbWUsICAgLypzaS51cHRpbWUgQHJlYWQgdGltZSovICBTTE9UX3ZzeiwgICAgICAgLy8gVmlydHVhbCBtZW0gU2l6ZQorIFNMT1RfcnNzMiwgICAgIC8qUmVzaWRlbnQgU2V0IFNpemUqLyAgICAgU0xPVF9zaHIsICAgICAgIC8vIFNoYXJlZCBtZW1vcnkKKyBTTE9UX3JjaGFyLCAgICAvKkFsbCBieXRlcyByZWFkKi8gICAgICAgIFNMT1Rfd2NoYXIsICAgICAvLyBBbGwgYnl0ZXMgd3JpdHRlbgorIFNMT1RfcmJ5dGVzLCAgIC8qRGlzayBieXRlcyByZWFkKi8gICAgICAgU0xPVF93Ynl0ZXMsICAgIC8vIERpc2sgYnl0ZXMgd3JpdHRlbgorIFNMT1Rfc3dhcCwgICAgIC8qU3dhcCBwYWdlcyB1c2VkKi8gICAgICAgU0xPVF9iaXRzLCAgICAgIC8vIDMyIG9yIDY0CisgU0xPVF90aWQsICAgICAgLypUaHJlYWQgSUQqLyAgICAgICAgICAgICBTTE9UX3Rjb3VudCwgICAgLy8gVGhyZWFkIGNvdW50CisgU0xPVF9wY3ksICAgICAgLypBbmRyb2lkIHNjaGVkIHBvbGljeSovCisKKyBTTE9UX2NvdW50Cit9OworCisvLyBEYXRhIGxheW91dCBpbiB0b3lidWYKK3N0cnVjdCBjYXJ2ZXVwIHsKKyAgbG9uZyBsb25nIHNsb3RbU0xPVF9jb3VudF07IC8vIGRhdGEgKHNlZSBlbnVtIGFib3ZlKQorICB1bnNpZ25lZCBzaG9ydCBvZmZzZXRbNl07ICAgLy8gb2Zmc2V0IG9mIGZpZWxkcyBpbiBzdHJbXSAoc2tpcCBuYW1lLCBhbHdheXMgMCkKKyAgY2hhciBzdGF0ZTsKKyAgY2hhciBzdHJbXTsgICAgICAgICAgICAgICAgIC8vIG5hbWUsIHR0eSwgY29tbWFuZCwgd2NoYW4sIGF0dHIsIGNtZGxpbmUKK307CisKKy8vIFRPRE86IEFuZHJvaWQgdXNlcyAtMzAgZm9yIExBQkVMLCBidXQgaWRlYWxseSBpdCB3b3VsZCBhdXRvLXNpemUuCisvLyA2NHxzbG90IG1lYW5zIGNvbXBhcmUgYXMgc3RyaW5nIHdoZW4gc29ydGluZworc3RydWN0IHR5cG9ncmFwaHkgeworICBjaGFyICpuYW1lOworICBzaWduZWQgY2hhciB3aWR0aCwgc2xvdDsKK30gc3RhdGljIGNvbnN0IHR5cG9zW10gPSBUQUdHRURfQVJSQVkoUFMsCisgIC8vIE51bWJlcnMKKyAgeyJQSUQiLCA1LCBTTE9UX3BpZH0sIHsiUFBJRCIsIDUsIFNMT1RfcHBpZH0sIHsiUFJJIiwgMywgU0xPVF9wcmlvcml0eX0sCisgIHsiTkkiLCAzLCBTTE9UX25pY2V9LCB7IkFERFIiLCA0K3NpemVvZihsb25nKSwgU0xPVF9laXB9LAorICB7IlNaIiwgNSwgU0xPVF92c2l6ZX0sIHsiUlNTIiwgNiwgU0xPVF9yc3N9LCB7IlBHSUQiLCA1LCBTTE9UX3BncnB9LAorICB7IlZTWiIsIDcsIFNMT1RfdnNpemV9LCB7Ik1BSkZMIiwgNiwgU0xPVF9tYWpmbHR9LCB7Ik1JTkZMIiwgNiwgU0xPVF9taW5mbHR9LAorICB7IlBSIiwgMiwgU0xPVF9wcmlvcml0eX0sIHsiUFNSIiwgMywgU0xPVF90YXNrY3B1fSwKKyAgeyJSVFBSSU8iLCA2LCBTTE9UX3J0cHJpb30sIHsiU0NIIiwgMywgU0xPVF9wb2xpY3l9LCB7IkNQVSIsIDMsIFNMT1RfdGFza2NwdX0sCisgIHsiVElEIiwgNSwgU0xPVF90aWR9LCB7IlRDTlQiLCA0LCBTTE9UX3Rjb3VudH0sIHsiQklUIiwgMywgU0xPVF9iaXRzfSwKKworICAvLyBTdHJpbmcgZmllbGRzCisgIHsiVFRZIiwgLTgsIC0yfSwgeyJXQ0hBTiIsIC02LCAtM30sIHsiTEFCRUwiLCAtMzAsIC00fSwgeyJDT01NIiwgLTI3LCAtNX0sCisgIHsiTkFNRSIsIC0yNywgLTd9LCB7IkNPTU1BTkQiLCAtMjcsIC01fSwgeyJDTURMSU5FIiwgLTI3LCAtNn0sCisgIHsiQVJHUyIsIC0yNywgLTZ9LCB7IkNNRCIsIC0xNSwgLTF9LAorCisgIC8vIHVzZXIvZ3JvdXAKKyAgeyJVSUQiLCA1LCBTTE9UX3VpZH0sIHsiVVNFUiIsIC04LCA2NHxTTE9UX3VpZH0sIHsiUlVJRCIsIDQsIFNMT1RfcnVpZH0sCisgIHsiUlVTRVIiLCAtOCwgNjR8U0xPVF9ydWlkfSwgeyJHSUQiLCA4LCBTTE9UX2dpZH0sIHsiR1JPVVAiLCAtOCwgNjR8U0xPVF9naWR9LAorICB7IlJHSUQiLCA0LCBTTE9UX3JnaWR9LCB7IlJHUk9VUCIsIC04LCA2NHxTTE9UX3JnaWR9LAorCisgIC8vIGNsb2NrIGRpc3BsYXlzCisgIHsiVElNRSIsIDgsIFNMT1RfdXRpbWV9LCB7IkVMQVBTRUQiLCAxMSwgU0xPVF9zdGFydHRpbWV9LAorICB7IlRJTUUrIiwgOSwgU0xPVF91dGltZX0sCisKKyAgLy8gUGVyY2VudGFnZSBkaXNwbGF5cworICB7IkMiLCAxLCBTTE9UX3V0aW1lMn0sIHsiJVZTWiIsIDUsIFNMT1RfdnNpemV9LCB7IiVNRU0iLCA1LCBTTE9UX3Jzc30sCisgIHsiJUNQVSIsIDQsIFNMT1RfdXRpbWUyfSwKKworICAvLyBodW1hbl9yZWFkYWJsZQorICB7IlZJUlQiLCA0LCBTTE9UX3Zzen0sIHsiUkVTIiwgNCwgU0xPVF9yc3MyfSwKKyAgeyJTSFIiLCA0LCBTTE9UX3Nocn0sIHsiUkVBRCIsIDYsIFNMT1RfcmNoYXJ9LCB7IldSSVRFIiwgNiwgU0xPVF93Y2hhcn0sCisgIHsiSU8iLCA2LCBTTE9UX2lvYnl0ZXN9LCB7IkRSRUFEIiwgNiwgU0xPVF9yYnl0ZXN9LAorICB7IkRXUklURSIsIDYsIFNMT1Rfd2J5dGVzfSwgeyJTV0FQIiwgNiwgU0xPVF9zd2FwfSwgeyJESU8iLCA2LCBTTE9UX2Rpb2J5dGVzfSwKKworICAvLyBNaXNjCisgIHsiU1RJTUUiLCA1LCBTTE9UX3N0YXJ0dGltZX0sIHsiRiIsIDEsIDY0fFNMT1RfZmxhZ3N9LCB7IlMiLCAtMSwgNjR9LAorICB7IlNUQVQiLCAtNSwgNjR9LCB7IlBDWSIsIDMsIDY0fFNMT1RfcGN5fSwKKyk7CisKKy8vIFJldHVybiAwIHRvIGRpc2NhcmQsIG5vbnplcm8gdG8ga2VlcAorc3RhdGljIGludCBzaGFyZWRfbWF0Y2hfcHJvY2Vzcyhsb25nIGxvbmcgKnNsb3QpCit7CisgIHN0cnVjdCBwdHJfbGVuIG1hdGNoW10gPSB7CisgICAgeyZUVC5nZywgU0xPVF9naWR9LCB7JlRULkdHLCBTTE9UX3JnaWR9LCB7JlRULnBwLCBTTE9UX3BpZH0sCisgICAgeyZUVC5QUCwgU0xPVF9wcGlkfSwgeyZUVC5zcywgU0xPVF9zaWR9LCB7JlRULnR0LCBTTE9UX3R0eW5yfSwKKyAgICB7JlRULnV1LCBTTE9UX3VpZH0sIHsmVFQuVVUsIFNMT1RfcnVpZH0KKyAgfTsKKyAgaW50IGksIGo7CisgIGxvbmcgKmxsID0gMDsKKworICAvLyBEbyB3ZSBoYXZlIC1nIC1HIC1wIC1QIC1zIC10IC11IC1VIG9wdGlvbnMgc2VsZWN0aW5nIHByb2Nlc3Nlcz8KKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX0xFTihtYXRjaCk7IGkrKykgeworICAgIHN0cnVjdCBwdHJfbGVuICptbSA9IG1hdGNoW2ldLnB0cjsKKworICAgIGlmIChtbS0+bGVuKSB7CisgICAgICBsbCA9IG1tLT5wdHI7CisgICAgICBmb3IgKGogPSAwOyBqPG1tLT5sZW47IGorKykgaWYgKGxsW2pdID09IHNsb3RbbWF0Y2hbaV0ubGVuXSkgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGxsID8gMCA6IC0xOworfQorCisKKy8vIFJldHVybiAwIHRvIGRpc2NhcmQsIG5vbnplcm8gdG8ga2VlcAorc3RhdGljIGludCBwc19tYXRjaF9wcm9jZXNzKGxvbmcgbG9uZyAqc2xvdCkKK3sKKyAgaW50IGkgPSBzaGFyZWRfbWF0Y2hfcHJvY2VzcyhzbG90KTsKKworICBpZiAoaT4wKSByZXR1cm4gMTsKKyAgLy8gSWYgd2UgaGFkIHNlbGVjdGlvbnMgYW5kIGRpZG4ndCBtYXRjaCB0aGVtLCBkb24ndCBkaXNwbGF5CisgIGlmICghaSkgcmV0dXJuIDA7CisKKyAgLy8gRmlsdGVyIGltcGxpY2l0IGNhdGVnb3JpZXMgZm9yIG90aGVyIGRpc3BsYXkgdHlwZXMKKyAgaWYgKCh0b3lzLm9wdGZsYWdzJihGTEFHX2F8RkxBR19kKSkgJiYgc2xvdFtTTE9UX3NpZF09PSpzbG90KSByZXR1cm4gMDsKKyAgaWYgKCh0b3lzLm9wdGZsYWdzJkZMQUdfYSkgJiYgIXNsb3RbU0xPVF90dHlucl0pIHJldHVybiAwOworICBpZiAoISh0b3lzLm9wdGZsYWdzJihGTEFHX2F8RkxBR19kfEZMQUdfQXxGTEFHX2UpKQorICAgICAgJiYgVFQudHR5IT1zbG90W1NMT1RfdHR5bnJdKSByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworLy8gQ29udmVydCBmaWVsZCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KK3N0YXRpYyBjaGFyICpzdHJpbmdfZmllbGQoc3RydWN0IGNhcnZldXAgKnRiLCBzdHJ1Y3Qgc3RyYXdiZXJyeSAqZmllbGQpCit7CisgIGNoYXIgKmJ1ZiA9IHRveWJ1ZitzaXplb2YodG95YnVmKS0yNjAsICpvdXQgPSBidWYsICpzOworICBpbnQgd2hpY2ggPSBmaWVsZC0+d2hpY2gsIHNsID0gdHlwb3Nbd2hpY2hdLnNsb3Q7CisgIGxvbmcgbG9uZyAqc2xvdCA9IHRiLT5zbG90LCBsbCA9IChzbCA+PSAwKSA/IHNsb3Rbc2wmNjNdIDogMDsKKworICAvLyBudW1iZXJzLCBtb3N0bHkgZnJvbSAvcHJvYy8kUElEL3N0YXQKKyAgaWYgKHdoaWNoIDw9IFBTX0JJVCkgeworICAgIGNoYXIgKmZtdCA9ICIlbGxkIjsKKworICAgIGlmICh3aGljaD09UFNfUFJJKSBsbCA9IDM5LWxsOworICAgIGlmICh3aGljaD09UFNfQUREUikgZm10ID0gIiVsbHgiOworICAgIGVsc2UgaWYgKHdoaWNoPT1QU19TWikgbGwgPj49IDEyOworICAgIGVsc2UgaWYgKHdoaWNoPT1QU19SU1MpIGxsIDw8PSAyOworICAgIGVsc2UgaWYgKHdoaWNoPT1QU19WU1opIGxsID4+PSAxMDsKKyAgICBlbHNlIGlmICh3aGljaD09UFNfUFIgJiYgbGw8LTkpIGZtdD0iUlQiOworICAgIGVsc2UgaWYgKCh3aGljaD09UFNfUlRQUklPIHx8IHdoaWNoPT1QU19CSVQpICYmIGxsID09IDApIGZtdD0iLSI7CisgICAgc3ByaW50ZihvdXQsIGZtdCwgbGwpOworCisgIC8vIFN0cmluZyBmaWVsZHMKKyAgfSBlbHNlIGlmIChzbCA8IDApIHsKKyAgICBvdXQgPSB0Yi0+c3RyOworICAgIHNsICo9IC0xOworICAgIC8vIEZpcnN0IHN0cmluZyBzbG90IGhhcyBvZmZzZXQgMCwgb3RoZXJzIGFyZSBvZmZzZXRbLXNsb3QtMl0KKyAgICBpZiAoLS1zbCkgb3V0ICs9IHRiLT5vZmZzZXRbLS1zbF07CisgICAgaWYgKHdoaWNoPT1QU19BUkdTIHx8IHdoaWNoPT1QU19DT01NKSB7CisgICAgICBpbnQgaTsKKworICAgICAgcyA9IG91dDsKKyAgICAgIGZvciAoaSA9IDA7ICh3aGljaD09UFNfQVJHUykgPyBpIDwgc2xvdFtTTE9UX2FyZ3YwbGVuXSA6IG91dFtpXTsgaSsrKQorICAgICAgICBpZiAob3V0W2ldID09ICcvJykgcyA9IG91dCtpKzE7CisgICAgICBvdXQgPSBzOworICAgIH0KKyAgICBpZiAod2hpY2g+PVBTX0NPTU0gJiYgISpvdXQpIHNwcmludGYob3V0ID0gYnVmLCAiWyVzXSIsIHRiLT5zdHIpOworCisgIC8vIHVzZXIvZ3JvdXAKKyAgfSBlbHNlIGlmICh3aGljaCA8PSBQU19SR1JPVVApIHsKKyAgICBzcHJpbnRmKG91dCwgIiVsbGQiLCBsbCk7CisgICAgaWYgKHNsJjY0KSB7CisgICAgICBpZiAod2hpY2ggPiBQU19SVVNFUikgeworICAgICAgICBzdHJ1Y3QgZ3JvdXAgKmdyID0gYnVmZ2V0Z3JnaWQobGwpOworCisgICAgICAgIGlmIChncikgb3V0ID0gZ3ItPmdyX25hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGJ1ZmdldHB3dWlkKGxsKTsKKworICAgICAgICBpZiAocHcpIG91dCA9IHB3LT5wd19uYW1lOworICAgICAgfQorICAgIH0KKworICAvLyBDbG9jayBkaXNwbGF5cworICB9IGVsc2UgaWYgKHdoaWNoIDw9IFBTX1RJTUVfKSB7CisgICAgaW50IHVuaXQgPSA2MCwgcGFkID0gMiwgaiA9IFRULnRpY2tzOyAKKyAgICB0aW1lX3Qgc2Vjb25kczsKKworICAgIGlmICh3aGljaCE9UFNfVElNRV8pIHVuaXQgKj0gNjAqMjQ7CisgICAgZWxzZSBwYWQgPSAwOworICAgIC8vIHRvcCBhZGp1c3RzIHNsb3RbU0xPVF91cHRpY2tzXSwgd2Ugd2FudCBvcmlnaW5hbCBtZWFuaW5nLgorICAgIGlmICh3aGljaD09UFNfRUxBUFNFRCkgbGwgPSAoc2xvdFtTTE9UX3VwdGltZV0qaiktc2xvdFtTTE9UX3N0YXJ0dGltZV07CisgICAgc2Vjb25kcyA9IGxsL2o7CisKKyAgICAvLyBPdXRwdXQgZGF5cy1ob3VyczptaW5zOnNlY3MsIHNraXBwaW5nIG5vbi1yZXF1aXJlZCBmaWVsZHMgd2l0aCB6ZXJvCisgICAgLy8gVElNRSBoYXMgMyByZXF1aXJlZCBmaWVsZHMsIEVUSU1FIGhhcyAyLiAoUG9zaXghKSBUSU1FKyBpcyBmcm9tIHRvcAorICAgIGZvciAocyA9IDAsIGogPSAyKih3aGljaD09UFNfVElNRV8pOyBqPDQ7IGorKykgeworICAgICAgaWYgKCFzICYmIChzZWNvbmRzPnVuaXQgfHwgaiA9PSAxKyh3aGljaCE9UFNfVElNRSkpKSBzID0gb3V0OworICAgICAgaWYgKHMpIHsKKyAgICAgICAgcyArPSBzcHJpbnRmKHMsIGogPyAiJTAqbGQiOiAiJSpsZCIsIHBhZCwgKGxvbmcpKHNlY29uZHMvdW5pdCkpOworICAgICAgICBwYWQgPSAyOworICAgICAgICBpZiAoKCpzID0gIi06OiJbal0pKSBzKys7CisgICAgICB9CisgICAgICBzZWNvbmRzICU9IHVuaXQ7CisgICAgICB1bml0IC89IGogPyA2MCA6IDI0OworICAgIH0KKyAgICBpZiAod2hpY2g9PVBTX1RJTUVfICYmIHMtb3V0PDgpCisgICAgICBzcHJpbnRmKHMsICIuJTAybGxkIiwgKDEwMCoobGwlVFQudGlja3MpKS9UVC50aWNrcyk7CisKKyAgLy8gUGVyY2VudGFnZSBkaXNwbGF5cworICB9IGVsc2UgaWYgKHdoaWNoIDw9IFBTX19DUFUpIHsKKyAgICBsbCA9IHNsb3Rbc2wmNjNdKjEwMDA7CisgICAgaWYgKHdoaWNoPT1QU19fVlNaIHx8IHdoaWNoPT1QU19fTUVNKQorICAgICAgbGwgLz0gVFQuc2kudG90YWxyYW0vKCh3aGljaD09UFNfX1ZTWikgPyAxMDI0IDogNDA5Nik7CisgICAgZWxzZSBpZiAoc2xvdFtTTE9UX3VwdGlja3NdKSBsbCAvPSBzbG90W1NMT1RfdXB0aWNrc107CisgICAgc2wgPSBsbDsKKyAgICBpZiAod2hpY2g9PVBTX0MpIHNsICs9IDU7CisgICAgc3ByaW50ZihvdXQsICIlZCIsIHNsLzEwKTsKKyAgICBpZiAod2hpY2ghPVBTX0MgJiYgc2w8MTAwMCkgc3ByaW50ZihvdXQrc3RybGVuKG91dCksICIuJWQiLCBzbCUxMCk7CisKKyAgLy8gSHVtYW4gcmVhZGFibGUKKyAgfSBlbHNlIGlmICh3aGljaCA8PSBQU19ESU8pIHsKKyAgICBsbCA9IHNsb3RbdHlwb3Nbd2hpY2hdLnNsb3RdOworICAgIGlmICh3aGljaCA8PSBQU19TSFIpIGxsICo9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKyAgICBpZiAoVFQuZm9yY2VrKSBzcHJpbnRmKG91dCwgIiVsbGRrIiwgbGwvMTAyNCk7CisgICAgZWxzZSBodW1hbl9yZWFkYWJsZShvdXQsIGxsLCAwKTsKKworICAvLyBQb3NpeCBkb2Vzbid0IHNwZWNpZnkgd2hhdCBmbGFncyBzaG91bGQgc2F5LiBNYW4gcGFnZSBzYXlzCisgIC8vIDEgZm9yIFBGX0ZPUktOT0VYRUMgYW5kIDQgZm9yIFBGX1NVUEVSUFJJViBmcm9tIGxpbnV4L3NjaGVkLmgKKyAgfSBlbHNlIGlmICh3aGljaD09UFNfRikgc3ByaW50ZihvdXQsICIlbGxvIiwgKHNsb3RbU0xPVF9mbGFnc10+PjYpJjUpOworICBlbHNlIGlmICh3aGljaD09UFNfUyB8fCB3aGljaD09UFNfU1RBVCkgeworICAgIHMgPSBvdXQ7CisgICAgKnMrKyA9IHRiLT5zdGF0ZTsKKyAgICBpZiAod2hpY2g9PVBTX1NUQVQpIHsKKyAgICAgIC8vIFRPRE8gbCA9IG11bHRpdGhyZWFkZWQKKyAgICAgIGlmIChzbG90W1NMT1RfbmljZV08MCkgKnMrKyA9ICc8JzsKKyAgICAgIGVsc2UgaWYgKHNsb3RbU0xPVF9uaWNlXT4wKSAqcysrID0gJ04nOworICAgICAgaWYgKHNsb3RbU0xPVF9zaWRdPT0qc2xvdCkgKnMrKyA9ICdzJzsKKyAgICAgIGlmIChzbG90W1NMT1Rfdm1sY2tdKSAqcysrID0gJ0wnOworICAgICAgaWYgKHNsb3RbU0xPVF90dHlwZ3JwXT09KnNsb3QpICpzKysgPSAnKyc7CisgICAgfSAKKyAgICAqcyA9IDA7CisgIH0gZWxzZSBpZiAod2hpY2g9PVBTX1NUSU1FKSB7CisgICAgdGltZV90IHQgPSB0aW1lKDApLXNsb3RbU0xPVF91cHRpbWVdK3Nsb3RbU0xPVF9zdGFydHRpbWVdL1RULnRpY2tzOworCisgICAgLy8gUGFkZGluZyBiZWhhdmlvcidzIGEgYml0IG9kZDogZGVmYXVsdCBmaWVsZCBzaXplIGlzIGp1c3QgaGg6bW0uCisgICAgLy8gSW5jcmVhc2luZyBzdGltZTpzaXplIHJldmVhbHMgbW9yZSBkYXRhIGF0IGxlZnQgdW50aWwgZnVsbCwKKyAgICAvLyBzbyBtb3ZlIHN0YXJ0IGFkZHJlc3Mgc28geXl5eS1tbS1kZCBoaDptbSByZXZlYWxlZCBvbiBsZWZ0IGF0IDoxNiwKKyAgICAvLyB0aGVuIGFkZCA6c3Mgb24gcmlnaHQgZm9yIDoxOS4KKyAgICBzdHJmdGltZShvdXQsIDI2MCwgIiVGICVUIiwgbG9jYWx0aW1lKCZ0KSk7CisgICAgb3V0ID0gb3V0K3N0cmxlbihvdXQpLTMtYWJzKGZpZWxkLT5sZW4pOworICAgIGlmIChvdXQ8YnVmKSBvdXQgPSBidWY7CisKKyAgfSBlbHNlIGlmICh3aGljaD09UFNfUENZKSBzcHJpbnRmKG91dCwgIiUuMnMiLCBnZXRfc2NoZWRfcG9saWN5X25hbWUobGwpKTsKKyAgZWxzZSBpZiAoQ0ZHX1RPWUJPWF9ERUJVRykgZXJyb3JfZXhpdCgiYmFkIHdoaWNoICVkIiwgd2hpY2gpOworCisgIHJldHVybiBvdXQ7Cit9CisKKy8vIERpc3BsYXkgcHJvY2VzcyBkYXRhIHRoYXQgZ2V0X3BzKCkgcmVhZCBmcm9tIC9wcm9jLCBmb3JtYXR0aW5nIHdpdGggVFQuZmllbGRzCitzdGF0aWMgdm9pZCBzaG93X3BzKHN0cnVjdCBjYXJ2ZXVwICp0YikKK3sKKyAgc3RydWN0IHN0cmF3YmVycnkgKmZpZWxkOworICBpbnQgcGFkLCBsZW4sIHdpZHRoID0gVFQud2lkdGgsIGFic2xlbiwgc2lnbiwgb2xlbiwgZXh0cmEgPSAwOworCisgIC8vIExvb3AgdGhyb3VnaCBmaWVsZHMgdG8gZGlzcGxheQorICBmb3IgKGZpZWxkID0gVFQuZmllbGRzOyBmaWVsZDsgZmllbGQgPSBmaWVsZC0+bmV4dCkgeworICAgIGNoYXIgKm91dCA9IHN0cmluZ19maWVsZCh0YiwgZmllbGQpOworCisgICAgLy8gT3V0cHV0IHRoZSBmaWVsZCwgYXBwcm9wcmlhdGVseSBwYWRkZWQKKworICAgIC8vIE1pbmltdW0gb25lIHNwYWNlIGJldHdlZW4gZWFjaCBmaWVsZAorICAgIGlmIChmaWVsZCAhPSBUVC5maWVsZHMpIHsKKyAgICAgIHB1dGNoYXIoJyAnKTsKKyAgICAgIHdpZHRoLS07CisgICAgfQorCisgICAgLy8gRG9uJ3QgdHJ1bmNhdGUgbnVtYmVyIGZpZWxkcywgYnV0IHRyeSB0byByZWNsYWltIGV4dHJhIG9mZnNldCBmcm9tIGxhdGVyCisgICAgLy8gZmllbGRzIHRoYXQgY2FuIG5hdHVyYWxseSBiZSBzaG9ydGVyCisgICAgYWJzbGVuID0gYWJzKGZpZWxkLT5sZW4pOworICAgIHNpZ24gPSBmaWVsZC0+bGVuPDAgPyAtMSA6IDE7CisgICAgb2xlbiA9IHN0cmxlbihvdXQpOworICAgIGlmIChmaWVsZC0+d2hpY2g8PVBTX0JJVCAmJiBvbGVuPmFic2xlbikgeworICAgICAgLy8gb3ZlcmZsb3cgYnV0IHJlbWVtYmVyIGJ5IGhvdyBtdWNoCisgICAgICBleHRyYSArPSBvbGVuLWFic2xlbjsKKyAgICAgIGFic2xlbiA9IG9sZW47CisgICAgfSBlbHNlIGlmIChleHRyYSAmJiBvbGVuPGFic2xlbikgeworICAgICAgLy8gSWYgbGF0ZXIgZmllbGRzIGhhdmUgc2xhY2sgc3BhY2UsIHRha2UgYmFjayBvdmVyZmxvdworICAgICAgb2xlbiA9IGFic2xlbi1vbGVuOworICAgICAgaWYgKG9sZW4+ZXh0cmEpIG9sZW4gPSBleHRyYTsKKyAgICAgIGFic2xlbiAtPSBvbGVuOworICAgICAgZXh0cmEgLT0gb2xlbjsKKyAgICB9CisgICAgaWYgKGFic2xlbj53aWR0aCkgYWJzbGVuID0gd2lkdGg7CisgICAgbGVuID0gcGFkID0gYWJzbGVuOworICAgIHBhZCAqPSBzaWduOworICAgIC8vIElmIGxhc3QgZmllbGQgaXMgbGVmdCBqdXN0aWZpZWQsIG5vIHRyYWlsaW5nIHNwYWNlcy4KKyAgICBpZiAoIWZpZWxkLT5uZXh0ICYmIHNpZ248MCkgeworICAgICAgcGFkID0gMDsKKyAgICAgIGxlbiA9IHdpZHRoOworICAgIH0KKworICAgIGlmIChUVC50dHkpIHdpZHRoIC09IGRyYXdfdHJpbShvdXQsIHBhZCwgbGVuKTsKKyAgICBlbHNlIHdpZHRoIC09IHByaW50ZigiJSouKnMiLCBwYWQsIGxlbiwgb3V0KTsKKyAgICBpZiAoIXdpZHRoKSBicmVhazsKKyAgfQorICB4cHV0YyhUVC50aW1lID8gJ1xyJyA6ICdcbicpOworfQorCisvLyBkaXJ0cmVlIGNhbGxiYWNrOiByZWFkIGRhdGEgYWJvdXQgcHJvY2VzcyB0byBkaXNwbGF5LCBzdG9yZSwgb3IgZGlzY2FyZCBpdC4KKy8vIEZpbGxzIHRveWJ1ZiB3aXRoIHN0cnVjdCBjYXJ2ZXVwIGFuZCBlaXRoZXIgRElSVFJFRV9TQVZFcyBhIGNvcHkgdG8gLT5leHRyYQorLy8gKGluIC1rIG1vZGUpIG9yIGNhbGxzIHNob3dfcHMgb24gdG95YnVmIChubyBtYWxsb2MvY29weS9mcmVlIHRoZXJlKS4KK3N0YXRpYyBpbnQgZ2V0X3BzKHN0cnVjdCBkaXJ0cmVlICpuZXcpCit7CisgIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsgICAgIC8vIFBhdGggdW5kZXIgL3Byb2MvJFBJRCBkaXJlY3RvcnkKKyAgICBsb25nIGxvbmcgYml0czsgLy8gT25seSBmZXRjaCBleHRyYSBkYXRhIGlmIGFuIC1vIGZpZWxkIGlzIGRpc3BsYXlpbmcgaXQKKyAgfSBmZXRjaFtdID0geworICAgIC8vIHNvdXJjZXMgZm9yIGNhcnZldXAtPm9mZnNldFtdIGRhdGEKKyAgICB7ImZkLyIsIF9QU19UVFl9LCB7IndjaGFuIiwgX1BTX1dDSEFOfSwgeyJhdHRyL2N1cnJlbnQiLCBfUFNfTEFCRUx9LAorICAgIHsiZXhlIiwgX1BTX0NPTU1BTkR8X1BTX0NPTU19LCB7ImNtZGxpbmUiLCBfUFNfQ01ETElORXxfUFNfQVJHU3xfUFNfTkFNRX0sCisgICAgeyIiLCBfUFNfTkFNRX0KKyAgfTsKKyAgc3RydWN0IGNhcnZldXAgKnRiID0gKHZvaWQgKil0b3lidWY7CisgIGxvbmcgbG9uZyAqc2xvdCA9IHRiLT5zbG90OworICBjaGFyICpuYW1lLCAqcywgKmJ1ZiA9IHRiLT5zdHIsICplbmQgPSAwOworICBpbnQgaSwgaiwgZmQ7CisgIG9mZl90IGxlbjsKKworICAvLyBSZWN1cnNlIG9uZSBsZXZlbCBpbnRvIC9wcm9jIGNoaWxkcmVuLCBza2lwIG5vbi1udW1lcmljIGVudHJpZXMKKyAgaWYgKCFuZXctPnBhcmVudCkKKyAgICByZXR1cm4gRElSVFJFRV9SRUNVUlNFfERJUlRSRUVfU0hVVFVQCisgICAgICB8KERJUlRSRUVfU0FWRSooVFQudGhyZWFkcGFyZW50fHwhVFQuc2hvd19wcm9jZXNzKSk7CisKKyAgbWVtc2V0KHNsb3QsIDAsIHNpemVvZih0Yi0+c2xvdCkpOworICBpZiAoISh0Yi0+c2xvdFtTTE9UX3RpZF0gPSAqc2xvdCA9IGF0b2wobmV3LT5uYW1lKSkpIHJldHVybiAwOworICBpZiAoVFQudGhyZWFkcGFyZW50ICYmIFRULnRocmVhZHBhcmVudC0+ZXh0cmEpCisgICAgaWYgKCpzbG90ID09ICooKChzdHJ1Y3QgY2FydmV1cCAqKVRULnRocmVhZHBhcmVudC0+ZXh0cmEpLT5zbG90KSkgcmV0dXJuIDA7CisgIGZkID0gZGlydHJlZV9wYXJlbnRmZChuZXcpOworCisgIGxlbiA9IDIwNDg7CisgIHNwcmludGYoYnVmLCAiJWxsZC9zdGF0IiwgKnNsb3QpOworICBpZiAoIXJlYWRmaWxlYXQoZmQsIGJ1ZiwgYnVmLCAmbGVuKSkgcmV0dXJuIDA7CisKKyAgLy8gcGFyc2Ugb2RkYmFsbCBmaWVsZHMgKG5hbWUgYW5kIHN0YXRlKS4gTmFtZSBjYW4gaGF2ZSBlbWJlZGRlZCAnKScgc28gbWF0Y2gKKyAgLy8gX2xhc3RfICcpJyBpbiBzdGF0IChhbHRob3VnaCBWRlMgbGltaXRzIGZpbGVuYW1lcyB0byAyNTUgYnl0ZXMgbWF4KS4KKyAgLy8gQWxsIHJlbWFpbmluZyBmaWVsZHMgc2hvdWxkIGJlIG51bWVyaWMuCisgIGlmICghKG5hbWUgPSBzdHJjaHIoYnVmLCAnKCcpKSkgcmV0dXJuIDA7CisgIGZvciAocyA9ICsrbmFtZTsgKnM7IHMrKykgaWYgKCpzID09ICcpJykgZW5kID0gczsKKyAgaWYgKCFlbmQgfHwgZW5kLW5hbWU+MjU1KSByZXR1cm4gMDsKKworICAvLyBQYXJzZSBudW1lcmljIGZpZWxkcyAoc3RhcnRpbmcgYXQgNHRoIGZpZWxkIGluIHNsb3RbU0xPVF9wcGlkXSkKKyAgaWYgKDE+c3NjYW5mKHMgPSBlbmQsICIpICVjJW4iLCAmdGItPnN0YXRlLCAmaSkpIHJldHVybiAwOworICBmb3IgKGogPSAxOyBqPFNMT1RfY291bnQ7IGorKykKKyAgICBpZiAoMT5zc2NhbmYocyArPSBpLCAiICVsbGQlbiIsIHNsb3QraiwgJmkpKSBicmVhazsKKworICAvLyBOb3cgd2UndmUgcmVhZCB0aGUgZGF0YSwgbW92ZSBzdGF0dXMgYW5kIG5hbWUgcmlnaHQgYWZ0ZXIgc2xvdFtdIGFycmF5LAorICAvLyBhbmQgY29udmVydCBsb3cgY2hhcnMgdG8gPyBmb3Igbm9uLXR0eSBkaXNwbGF5IHdoaWxlIHdlJ3JlIGF0IGl0LgorICBmb3IgKGkgPSAwOyBpPGVuZC1uYW1lOyBpKyspCisgICAgaWYgKCh0Yi0+c3RyW2ldID0gbmFtZVtpXSkgPCAnICcpCisgICAgICBpZiAoIVRULnR0eSkgdGItPnN0cltpXSA9ICc/JzsKKyAgYnVmID0gdGItPnN0citpOworICAqYnVmKysgPSAwOworICBsZW4gPSBzaXplb2YodG95YnVmKS0oYnVmLXRveWJ1Zik7CisKKyAgLy8gc2F2ZSB1aWQsIHJ1aWQsIGdpZCwgZ2lkLCBhbmQgcmdpZCBpbnQgc2xvdHMgMzEtMzQgKHdlIGRvbid0IHVzZSBzaWdjYXRjaAorICAvLyBvciBudW1lcmljIHdjaGFuLCBhbmQgdGhlIHJlbWFpbmluZyB0d28gYXJlIGFsd2F5cyB6ZXJvKSwgYW5kIHZtbGNrIGludG8KKyAgLy8gMTggKHdoaWNoIGlzICJvYnNvbGV0ZSwgYWx3YXlzIDAiIGZyb20gc3RhdCkKKyAgc2xvdFtTTE9UX3VpZF0gPSBuZXctPnN0LnN0X3VpZDsKKyAgc2xvdFtTTE9UX2dpZF0gPSBuZXctPnN0LnN0X2dpZDsKKworICAvLyBUSU1FIGFuZCBUSU1FKyB1c2UgY29tYmluZWQgdmFsdWUsIGtzb3J0IG5lZWRzICdlbSBhZGRlZC4KKyAgc2xvdFtTTE9UX3V0aW1lXSArPSBzbG90W1NMT1Rfc3RpbWVdOworICBzbG90W1NMT1RfdXRpbWUyXSA9IHNsb3RbU0xPVF91dGltZV07CisKKyAgLy8gSWYgUkdST1VQIFJVU0VSIFNUQVQgUlVJRCBSR0lEIFNXQVAgaGFwcGVuaW5nLCBvciAtRyBvciAtVSwgcGFyc2UgInN0YXR1cyIKKyAgLy8gYW5kIHNhdmUgcnVpZCwgcmdpZCwgYW5kIHZtbGNrLgorICBpZiAoKFRULmJpdHMmKF9QU19SR1JPVVB8X1BTX1JVU0VSfF9QU19TVEFUfF9QU19SVUlEfF9QU19SR0lEfF9QU19TV0FQCisgICAgICAgICAgICAgICB8X1BTX0lPfF9QU19ESU8pKSB8fCBUVC5HRy5sZW4gfHwgVFQuVVUubGVuKQorICB7CisgICAgb2ZmX3QgdGVtcCA9IGxlbjsKKworICAgIHNwcmludGYoYnVmLCAiJWxsZC9zdGF0dXMiLCAqc2xvdCk7CisgICAgaWYgKCFyZWFkZmlsZWF0KGZkLCBidWYsIGJ1ZiwgJnRlbXApKSAqYnVmID0gMDsKKyAgICBzID0gc3RyYWZ0ZXIoYnVmLCAiXG5VaWQ6Iik7CisgICAgc2xvdFtTTE9UX3J1aWRdID0gcyA/IGF0b2wocykgOiBuZXctPnN0LnN0X3VpZDsKKyAgICBzID0gc3RyYWZ0ZXIoYnVmLCAiXG5HaWQ6Iik7CisgICAgc2xvdFtTTE9UX3JnaWRdID0gcyA/IGF0b2wocykgOiBuZXctPnN0LnN0X2dpZDsKKyAgICBpZiAoKHMgPSBzdHJhZnRlcihidWYsICJcblZtTGNrOiIpKSkgc2xvdFtTTE9UX3ZtbGNrXSA9IGF0b2xsKHMpOworICAgIGlmICgocyA9IHN0cmFmdGVyKGJ1ZiwgIlxuVm1Td2FwOiIpKSkgc2xvdFtTTE9UX3N3YXBdID0gYXRvbGwocyk7CisgIH0KKworICAvLyBEbyB3ZSBuZWVkIHRvIHJlYWQgImlvIj8KKyAgaWYgKFRULmJpdHMmKF9QU19SRUFEfF9QU19XUklURXxfUFNfRFJFQUR8X1BTX0RXUklURXxfUFNfSU98X1BTX0RJTykpIHsKKyAgICBvZmZfdCB0ZW1wID0gbGVuOworCisgICAgc3ByaW50ZihidWYsICIlbGxkL2lvIiwgKnNsb3QpOworICAgIGlmICghcmVhZGZpbGVhdChmZCwgYnVmLCBidWYsICZ0ZW1wKSkgKmJ1ZiA9IDA7CisgICAgaWYgKChzID0gc3RyYWZ0ZXIoYnVmLCAicmNoYXI6IikpKSBzbG90W1NMT1RfcmNoYXJdID0gYXRvbGwocyk7CisgICAgaWYgKChzID0gc3RyYWZ0ZXIoYnVmLCAid2NoYXI6IikpKSBzbG90W1NMT1Rfd2NoYXJdID0gYXRvbGwocyk7CisgICAgaWYgKChzID0gc3RyYWZ0ZXIoYnVmLCAicmVhZF9ieXRlczoiKSkpIHNsb3RbU0xPVF9yYnl0ZXNdID0gYXRvbGwocyk7CisgICAgaWYgKChzID0gc3RyYWZ0ZXIoYnVmLCAid3JpdGVfYnl0ZXM6IikpKSBzbG90W1NMT1Rfd2J5dGVzXSA9IGF0b2xsKHMpOworICAgIHNsb3RbU0xPVF9pb2J5dGVzXSA9IHNsb3RbU0xPVF9yY2hhcl0rc2xvdFtTTE9UX3djaGFyXStzbG90W1NMT1Rfc3dhcF07CisgICAgc2xvdFtTTE9UX2Rpb2J5dGVzXSA9IHNsb3RbU0xPVF9yYnl0ZXNdK3Nsb3RbU0xPVF93Ynl0ZXNdK3Nsb3RbU0xPVF9zd2FwXTsKKyAgfQorCisgIC8vIFdlIG5vdyBrbm93IGVub3VnaCB0byBza2lwIHByb2Nlc3NlcyB3ZSBkb24ndCBjYXJlIGFib3V0LgorICBpZiAoVFQubWF0Y2hfcHJvY2VzcyAmJiAhVFQubWF0Y2hfcHJvY2VzcyhzbG90KSkgcmV0dXJuIDA7CisKKyAgLy8gL3Byb2MgZGF0YSBpcyBnZW5lcmF0ZWQgYXMgaXQncyByZWFkLCBzbyBmb3IgbWF4aW11bSBhY2N1cmFjeSBvbiBzbG93CisgIC8vIHN5c3RlbXMgKG9yIHBzIHwgbW9yZSkgd2UgcmUtZmV0Y2ggdXB0aW1lIGFzIHdlIGZldGNoIGVhY2ggL3Byb2MgbGluZS4KKyAgc3lzaW5mbygmVFQuc2kpOworICBzbG90W1NMT1RfdXB0aW1lXSA9IFRULnNpLnVwdGltZTsKKyAgc2xvdFtTTE9UX3VwdGlja3NdID0gc2xvdFtTTE9UX3VwdGltZV0qVFQudGlja3MgLSBzbG90W1NMT1Rfc3RhcnR0aW1lXTsKKworICAvLyBEbyB3ZSBuZWVkIHRvIHJlYWQgInN0YXRtIj8KKyAgaWYgKFRULmJpdHMmKF9QU19WSVJUfF9QU19SRVN8X1BTX1NIUikpIHsKKyAgICBvZmZfdCB0ZW1wID0gbGVuOworCisgICAgc3ByaW50ZihidWYsICIlbGxkL3N0YXRtIiwgKnNsb3QpOworICAgIGlmICghcmVhZGZpbGVhdChmZCwgYnVmLCBidWYsICZ0ZW1wKSkgKmJ1ZiA9IDA7CisgICAgCisgICAgZm9yIChzID0gYnVmLCBpPTA7IGk8MzsgaSsrKQorICAgICAgaWYgKCFzc2NhbmYocywgIiAlbGxkJW4iLCBzbG90K1NMT1RfdnN6K2ksICZqKSkgc2xvdFtTTE9UX3ZzeitpXSA9IDA7CisgICAgICBlbHNlIHMgKz0gajsKKyAgfQorCisgIC8vIERvIHdlIG5lZWQgdG8gcmVhZCAiZXhlIj8KKyAgaWYgKFRULmJpdHMmX1BTX0JJVCkgeworICAgIG9mZl90IHRlbXAgPSA2OworCisgICAgc3ByaW50ZihidWYsICIlbGxkL2V4ZSIsICpzbG90KTsKKyAgICBpZiAocmVhZGZpbGVhdChmZCwgYnVmLCBidWYsICZ0ZW1wKSAmJiAhbWVtY21wKGJ1ZiwgIlwxNzdFTEYiLCA0KSkgeworICAgICAgaWYgKGJ1Zls0XSA9PSAxKSBzbG90W1NMT1RfYml0c10gPSAzMjsKKyAgICAgIGVsc2UgaWYgKGJ1Zls0XSA9PSAyKSBzbG90W1NMT1RfYml0c10gPSA2NDsKKyAgICB9CisgIH0KKworICAvLyBEbyB3ZSBuZWVkIEFuZHJvaWQgc2NoZWR1bGluZyBwb2xpY3k/CisgIGlmIChUVC5iaXRzJl9QU19QQ1kpIGdldF9zY2hlZF9wb2xpY3koKnNsb3QsICh2b2lkICopJnNsb3RbU0xPVF9wY3ldKTsKKworICAvLyBGZXRjaCBzdHJpbmcgZGF0YSB3aGlsZSBwYXJlbnRmZCBzdGlsbCBhdmFpbGFibGUsIGFwcGVuZGluZyB0byBidWYuCisgIC8vIChUaGVyZSdzIHdlbGwgb3ZlciAzayBvZiB0b3lidWYgbGVmdC4gV2UgY291bGQgZHluYW1pY2FsbHkgbWFsbG9jLCBidXQKKyAgLy8gaXQnZCBhbG1vc3QgbmV2ZXIgZ2V0IHVzZWQsIHF1ZXJ5aW5nIGxlbmd0aCBvZiBhIHByb2MgZmlsZSBpcyBhd2t3YXJkLAorICAvLyBmaXhlZCBidWZmZXIgaXMgbm9tbXUgZnJpZW5kbHkuLi4gV2FpdCBmb3Igc29tZWJvZHkgdG8gY29tcGxhaW4uIDopCisgIHNsb3RbU0xPVF9hcmd2MGxlbl0gPSAwOworICBmb3IgKGogPSAwOyBqPEFSUkFZX0xFTihmZXRjaCk7IGorKykgeworICAgIHRiLT5vZmZzZXRbal0gPSBidWYtKHRiLT5zdHIpOworICAgIGlmICghKFRULmJpdHMmZmV0Y2hbal0uYml0cykpIHsKKyAgICAgICpidWYrKyA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgcmVtYWluaW5nIHNwYWNlLCByZXNlcnZpbmcgbWluaW11bSBvZiAyNTYgYnl0ZXMvZmllbGQgYW5kCisgICAgLy8gMjYwIGJ5dGVzIHNjcmF0Y2ggc3BhY2UgYXQgdGhlIGVuZCAoZm9yIG91dHB1dCBjb252ZXJzaW9uIGxhdGVyKS4KKyAgICBsZW4gPSBzaXplb2YodG95YnVmKS0oYnVmLXRveWJ1ZiktMjYwLTI1NiooQVJSQVlfTEVOKGZldGNoKS1qKTsKKyAgICBzcHJpbnRmKGJ1ZiwgIiVsbGQvJXMiLCAqc2xvdCwgZmV0Y2hbal0ubmFtZSk7CisKKyAgICAvLyBGb3IgZXhlIHdlIHJlYWRsaW5rIGluc3RlYWQgb2YgcmVhZCBjb250ZW50cworICAgIGlmIChqPT0zIHx8IGo9PTUpIHsKKyAgICAgIHN0cnVjdCBjYXJ2ZXVwICpwdGIgPSAwOworICAgICAgaW50IGs7CisKKyAgICAgIC8vIFRocmVhZCBkb2Vzbid0IGhhdmUgZXhlIG9yIGFyZ3ZbMF0sIHNvIHVzZSBwYXJlbnQncworICAgICAgaWYgKFRULnRocmVhZHBhcmVudCAmJiBUVC50aHJlYWRwYXJlbnQtPmV4dHJhKQorICAgICAgICBwdGIgPSAodm9pZCAqKVRULnRocmVhZHBhcmVudC0+ZXh0cmE7CisKKyAgICAgIGlmIChqPT0zICYmICFwdGIpIGxlbiA9IHJlYWRsaW5rYXQwKGZkLCBidWYsIGJ1ZiwgbGVuKTsKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoaj09MykgaSA9IHN0cmxlbihzID0gcHRiLT5zdHIrcHRiLT5vZmZzZXRbM10pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoIXB0YiB8fCB0Yi0+c2xvdFtTTE9UX2FyZ3YwbGVuXSkgcHRiID0gdGI7CisgICAgICAgICAgaSA9IHB0Yi0+c2xvdFtTTE9UX2FyZ3YwbGVuXTsKKyAgICAgICAgICBzID0gcHRiLT5zdHIrcHRiLT5vZmZzZXRbNF07CisgICAgICAgICAgd2hpbGUgKC0xIT0oayA9IHN0cmlkeChzLCAnLycpKSAmJiBrPGkpIHsKKyAgICAgICAgICAgIHMgKz0gaysxOworICAgICAgICAgICAgaSAtPSBrKzE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpPGxlbikgbGVuID0gaTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgcywgbGVuKTsKKyAgICAgICAgYnVmW2xlbl0gPSAwOworICAgICAgfQorCisgICAgLy8gSWYgaXQncyBub3QgdGhlIFRUWSBmaWVsZCwgZGF0YSB3ZSB3YW50IGlzIGluIGEgZmlsZS4KKyAgICAvLyBMYXN0IGxlbmd0aCBzYXZlZCBpbiBzbG90W10gaXMgY29tbWFuZCBsaW5lICh3aGljaCBoYXMgZW1iZWRkZWQgTlVMcykKKyAgICB9IGVsc2UgaWYgKCFqKSB7CisgICAgICBpbnQgcmRldiA9IHNsb3RbU0xPVF90dHlucl07CisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgICAgLy8gQ2FsbCBubyB0dHkgIj8iIHJhdGhlciB0aGFuICIwOjAiLgorICAgICAgc3RyY3B5KGJ1ZiwgIj8iKTsKKyAgICAgIGlmIChyZGV2KSB7CisgICAgICAgIC8vIENhbiB3ZSByZWFkbGluaygpIG91ciB3YXkgdG8gYSBuYW1lPworICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgeworICAgICAgICAgIHNwcmludGYoYnVmLCAiJWxsZC9mZC8laSIsICpzbG90LCBpKTsKKyAgICAgICAgICBpZiAoIWZzdGF0YXQoZmQsIGJ1ZiwgJnN0LCAwKSAmJiBTX0lTQ0hSKHN0LnN0X21vZGUpCisgICAgICAgICAgICAmJiBzdC5zdF9yZGV2ID09IHJkZXYgJiYgKGxlbiA9IHJlYWRsaW5rYXQwKGZkLCBidWYsIGJ1ZiwgbGVuKSkpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBpdCwgdHJ5IGFsbCB0aGUgdHR5IGRyaXZlcnMuCisgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICBGSUxFICpmcCA9IGZvcGVuKCIvcHJvYy90dHkvZHJpdmVycyIsICJyIik7CisgICAgICAgICAgaW50IHR0eV9tYWpvciA9IDAsIG1haiA9IGRldl9tYWpvcihyZGV2KSwgbWluID0gZGV2X21pbm9yKHJkZXYpOworCisgICAgICAgICAgaWYgKGZwKSB7CisgICAgICAgICAgICB3aGlsZSAoZnNjYW5mKGZwLCAiJSpzICUyNTZzICVkICUqcyAlKnMiLCBidWYsICZ0dHlfbWFqb3IpID09IDIpIHsKKyAgICAgICAgICAgICAgLy8gVE9ETzogd2UgY291bGQgcGFyc2UgdGhlIG1pbm9yIHJhbmdlIHRvby4KKyAgICAgICAgICAgICAgaWYgKHR0eV9tYWpvciA9PSBtYWopIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJWQiLCBtaW4pOworICAgICAgICAgICAgICAgIGlmICghc3RhdChidWYsICZzdCkgJiYgU19JU0NIUihzdC5zdF9tb2RlKSAmJiBzdC5zdF9yZGV2PT1yZGV2KQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdHR5X21ham9yID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmVhbGx5IGNvdWxkbid0IGZpbmQgaXQsIHNvIGp1c3Qgc2hvdyBtYWpvcjptaW5vci4KKyAgICAgICAgICBpZiAoIXR0eV9tYWpvcikgbGVuID0gc3ByaW50ZihidWYsICIlZDolZCIsIG1haiwgbWluKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSBidWY7CisgICAgICAgIGlmIChzdHJzdGFydCgmcywgIi9kZXYvIikpIG1lbW1vdmUoYnVmLCBzLCBsZW4gLT0gNSk7CisgICAgICB9CisKKyAgICAvLyBEYXRhIHdlIHdhbnQgaXMgaW4gYSBmaWxlLgorICAgIC8vIExhc3QgbGVuZ3RoIHNhdmVkIGluIHNsb3RbXSBpcyBjb21tYW5kIGxpbmUgKHdoaWNoIGhhcyBlbWJlZGRlZCBOVUxzKQorICAgIH0gZWxzZSB7CisKKyAgICAgIC8vIFdoZW4gY29tbWFuZCBoYXMgbm8gYXJndW1lbnRzLCBkb24ndCBzcGFjZSBvdmVyIHRoZSBOVUwKKyAgICAgIGlmIChyZWFkZmlsZWF0KGZkLCBidWYsIGJ1ZiwgJmxlbikgJiYgbGVuPjApIHsKKyAgICAgICAgaW50IHRlbXAgPSAwOworCisgICAgICAgIC8vIFRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgTlVMIGJ5dGVzCisgICAgICAgIHdoaWxlIChsZW4pCisgICAgICAgICAgaWYgKCFidWZbbGVuLTFdIHx8IGlzc3BhY2UoYnVmW2xlbi0xXSkpIGJ1ZlstLWxlbl0gPSAwOworICAgICAgICAgIGVsc2UgYnJlYWs7CisKKyAgICAgICAgLy8gVHVybiBOVUwgdG8gc3BhY2UsIG90aGVyIGxvdyBhc2NpaSB0byA/IChpbiBub24tdHR5IG1vZGUpCisgICAgICAgIC8vIGNtZGxpbmUgaGFzIGEgdHJhaWxpbmcgTlVMIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byB0dXJuIHRvIHNwYWNlLgorICAgICAgICBmb3IgKGk9MDsgaTxsZW4tMTsgaSsrKSB7CisgICAgICAgICAgY2hhciBjID0gYnVmW2ldOworCisgICAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICBpZiAoIXRlbXApIHRlbXAgPSBpOworICAgICAgICAgICAgYyA9ICcgJzsKKyAgICAgICAgICB9IGVsc2UgaWYgKCFUVC50dHkgJiYgYzwnICcpIGMgPSAnPyc7CisgICAgICAgICAgYnVmW2ldID0gYzsKKyAgICAgICAgfQorICAgICAgICAvLyBTdG9yZSBlbmQgb2YgYXJndlswXSBzbyBBUkdTIGFuZCBDTURMSU5FIGNhbiBkaWZmZXIuCisgICAgICAgIC8vIFdlIGRvIGl0IGZvciBlYWNoIGZpbGUgc3RyaW5nIHNsb3QgYnV0IGxhc3QgaXMgY21kbGluZSwgd2hpY2ggc3RpY2tzLgorICAgICAgICBzbG90W1NMT1RfYXJndjBsZW5dID0gdGVtcCA/IHRlbXAgOiBsZW47ICAvLyBQb3NpdGlvbiBvZiBfZmlyc3RfIE5VTAorICAgICAgfSBlbHNlICpidWYgPSBsZW4gPSAwOworICAgIH0KKworICAgIC8vIEFib3ZlIGNhbGN1bGF0ZWQvcmV0YWluZWQgbGVuLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlLXN0cmxlbi4KKyAgICBidWYgKz0gbGVuKzE7CisgIH0KKworICBUVC5rY291bnQrKzsKKyAgaWYgKFRULnNob3dfcHJvY2VzcyAmJiAhVFQudGhyZWFkcGFyZW50KSB7CisgICAgVFQuc2hvd19wcm9jZXNzKHRiKTsKKworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gSWYgd2UgbmVlZCB0byBzb3J0IHRoZSBvdXRwdXQsIGFkZCBpdCB0byB0aGUgbGlzdCBhbmQgcmV0dXJuLgorICBzID0geG1hbGxvYyhidWYtdG95YnVmKTsKKyAgbmV3LT5leHRyYSA9IChsb25nKXM7CisgIG1lbWNweShzLCB0b3lidWYsIGJ1Zi10b3lidWYpOworCisgIHJldHVybiBESVJUUkVFX1NBVkU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3RocmVhZHMoc3RydWN0IGRpcnRyZWUgKm5ldykKK3sKKyAgc3RydWN0IGRpcnRyZWUgKmR0OworICBzdHJ1Y3QgY2FydmV1cCAqdGI7CisgIHVuc2lnbmVkIHBpZCwga2NvdW50OworCisgIGlmICghbmV3LT5wYXJlbnQpIHJldHVybiBnZXRfcHMobmV3KTsKKworICBpZiAoIShwaWQgPSBhdG9sKG5ldy0+bmFtZSkpKSByZXR1cm4gMDsKKworICBUVC50aHJlYWRwYXJlbnQgPSBuZXc7CisgIGlmICghZ2V0X3BzKG5ldykpIHsKKyAgICBUVC50aHJlYWRwYXJlbnQgPSAwOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBSZWN1cnNlIGRvd24gaW50byB0YXNrcywgcmV0YWluaW5nIHRocmVhZCBncm91cHMuCisgIC8vIERpc2FibGUgc2hvd19wcm9jZXNzIGF0IGxlYXN0IHVudGlsIHdlIGNhbiBjYWxjdWxhdGUgdGNvdW50CisgIGtjb3VudCA9IFRULmtjb3VudDsKKyAgc3ByaW50Zih0b3lidWYsICIvcHJvYy8ldS90YXNrIiwgcGlkKTsKKyAgbmV3LT5jaGlsZCA9IGRpcnRyZWVfZmxhZ3JlYWQodG95YnVmLCBESVJUUkVFX1NIVVRVUCwgZ2V0X3BzKTsKKyAgVFQudGhyZWFkcGFyZW50ID0gMDsKKyAga2NvdW50ID0gVFQua2NvdW50LWtjb3VudCsxOworICB0YiA9ICh2b2lkICopbmV3LT5leHRyYTsKKyAgdGItPnNsb3RbU0xPVF90Y291bnRdID0ga2NvdW50OworCisgIC8vIEZpbGwgb3V0IHRpZCBhbmQgdGhyZWFkIGNvdW50IGZvciBlYWNoIGVudHJ5IGluIGdyb3VwCisgIGlmIChuZXctPmNoaWxkKSBmb3IgKGR0ID0gbmV3LT5jaGlsZC0+Y2hpbGQ7IGR0OyBkdCA9IGR0LT5uZXh0KSB7CisgICAgdGIgPSAodm9pZCAqKWR0LT5leHRyYTsKKyAgICB0Yi0+c2xvdFtTTE9UX3BpZF0gPSBwaWQ7CisgICAgdGItPnNsb3RbU0xPVF90Y291bnRdID0ga2NvdW50OworICB9CisKKyAgLy8gU2F2ZSBvciBkaXNwbGF5CisgIGlmICghVFQuc2hvd19wcm9jZXNzKSByZXR1cm4gRElSVFJFRV9TQVZFOworICBUVC5zaG93X3Byb2Nlc3MoKHZvaWQgKiluZXctPmV4dHJhKTsKKyAgZHQgPSBuZXctPmNoaWxkOworICBuZXctPmNoaWxkID0gMDsKKyAgd2hpbGUgKGR0LT5jaGlsZCkgeworICAgIG5ldyA9IGR0LT5jaGlsZC0+bmV4dDsKKyAgICBUVC5zaG93X3Byb2Nlc3MoKHZvaWQgKilkdC0+Y2hpbGQtPmV4dHJhKTsKKyAgICBmcmVlKGR0LT5jaGlsZCk7CisgICAgZHQtPmNoaWxkID0gbmV3OworICB9CisgIGZyZWUoZHQpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqcGFyc2Vfa28odm9pZCAqZGF0YSwgY2hhciAqdHlwZSwgaW50IGxlbmd0aCkKK3sKKyAgc3RydWN0IHN0cmF3YmVycnkgKmZpZWxkOworICBjaGFyICp3aWR0aCwgKnRpdGxlLCAqZW5kLCAqczsKKyAgaW50IGksIGosIGs7CisKKyAgLy8gR2V0IHRpdGxlLCBsZW5ndGggb2YgdGl0bGUsIHR5cGUsIGVuZCBvZiB0eXBlLCBhbmQgZGlzcGxheSB3aWR0aAorCisgIC8vIENoaXAgb2ZmID1uYW1lIHRvIGRpc3BsYXkKKyAgaWYgKChlbmQgPSBzdHJjaHIodHlwZSwgJz0nKSkgJiYgbGVuZ3RoPihlbmQtdHlwZSkpIHsKKyAgICB0aXRsZSA9IGVuZCsxOworICAgIGxlbmd0aCAtPSAoZW5kLXR5cGUpKzE7CisgIH0gZWxzZSB7CisgICAgZW5kID0gdHlwZStsZW5ndGg7CisgICAgdGl0bGUgPSAwOworICB9CisKKyAgLy8gQ2hpcCBvZmYgOndpZHRoIHRvIGRpc3BsYXkKKyAgaWYgKCh3aWR0aCA9IHN0cmNocih0eXBlLCAnOicpKSAmJiB3aWR0aDxlbmQpIHsKKyAgICBpZiAoIXRpdGxlKSBsZW5ndGggPSB3aWR0aC10eXBlOworICB9IGVsc2Ugd2lkdGggPSAwOworCisgIC8vIEFsbG9jYXRlIHN0cnVjdHVyZSwgY29weSB0aXRsZQorICBmaWVsZCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJhd2JlcnJ5KSsobGVuZ3RoKzEpKiEhdGl0bGUpOworICBpZiAodGl0bGUpIHsKKyAgICBtZW1jcHkoZmllbGQtPnRpdGxlID0gZmllbGQtPmZvcmV2ZXIsIHRpdGxlLCBsZW5ndGgpOworICAgIGZpZWxkLT50aXRsZVtmaWVsZC0+bGVuID0gbGVuZ3RoXSA9IDA7CisgIH0KKworICBpZiAod2lkdGgpIHsKKyAgICBmaWVsZC0+bGVuID0gc3RydG9sKCsrd2lkdGgsICZ0aXRsZSwgMTApOworICAgIGlmICghaXNkaWdpdCgqd2lkdGgpIHx8IHRpdGxlICE9IGVuZCkgcmV0dXJuIHRpdGxlOworICAgIGVuZCA9IC0td2lkdGg7CisgIH0KKworICAvLyBGaW5kIHR5cGUKKyAgZmllbGQtPnJldmVyc2UgPSAxOworICBpZiAoKnR5cGUgPT0gJy0nKSBmaWVsZC0+cmV2ZXJzZSA9IC0xOworICBlbHNlIGlmICgqdHlwZSAhPSAnKycpIHR5cGUtLTsKKyAgdHlwZSsrOworICBmb3IgKGkgPSAwOyBpPEFSUkFZX0xFTih0eXBvcyk7IGkrKykgeworICAgIGZpZWxkLT53aGljaCA9IGk7CisgICAgZm9yIChqID0gMDsgajwyOyBqKyspIHsKKyAgICAgIGlmICghaikgcyA9IHR5cG9zW2ldLm5hbWU7CisgICAgICAvLyBwb3NpeCByZXF1aXJlcyBhbHRlcm5hdGUgbmFtZXMgZm9yIHNvbWUgZmllbGRzCisgICAgICBlbHNlIGlmICgtMT09KGsgPSBzdHJpZHgoKGNoYXIgW10pe1BTX05JLCBQU19TQ0gsIFBTX0VMQVBTRUQsIFBTX19DUFUsCisgICAgICAgIFBTX1ZTWiwgUFNfVVNFUiwgMH0sIGkpKSkgY29udGludWU7CisgICAgICBlbHNlCisgICAgICAgIHMgPSAoKGNoYXIgKltdKXsiTklDRSIsICJTQ0hFRCIsICJFVElNRSIsICJQQ1BVIiwgIlZTSVpFIiwgIlVOQU1FIn0pW2tdOworCisgICAgICBpZiAoIXN0cm5jYXNlY21wKHR5cGUsIHMsIGVuZC10eXBlKSAmJiBzdHJsZW4ocyk9PWVuZC10eXBlKSBicmVhazsKKyAgICB9CisgICAgaWYgKGohPTIpIGJyZWFrOworICB9CisgIGlmIChpPT1BUlJBWV9MRU4odHlwb3MpKSByZXR1cm4gdHlwZTsKKyAgaWYgKCFmaWVsZC0+dGl0bGUpIGZpZWxkLT50aXRsZSA9IHR5cG9zW2ZpZWxkLT53aGljaF0ubmFtZTsKKyAgaWYgKCFmaWVsZC0+bGVuKSBmaWVsZC0+bGVuID0gdHlwb3NbZmllbGQtPndoaWNoXS53aWR0aDsKKyAgZWxzZSBpZiAodHlwb3NbZmllbGQtPndoaWNoXS53aWR0aDwwKSBmaWVsZC0+bGVuICo9IC0xOworICBkbGlzdF9hZGRfbm9tYWxsb2MoZGF0YSwgKHZvaWQgKilmaWVsZCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2xvbmcgbG9uZyBnZXRfaGVhZGVycyhzdHJ1Y3Qgc3RyYXdiZXJyeSAqZmllbGRzLCBjaGFyICpidWYsIGludCBibGVuKQoreworICBsb25nIGxvbmcgYml0cyA9IDA7CisgIGludCBsZW4gPSAwOworCisgIGZvciAoOyBmaWVsZHM7IGZpZWxkcyA9IGZpZWxkcy0+bmV4dCkgeworICAgIGxlbiArPSBzbnByaW50ZihidWYrbGVuLCBibGVuLWxlbiwgIiAlKnMiKyFiaXRzLCBmaWVsZHMtPmxlbiwKKyAgICAgIGZpZWxkcy0+dGl0bGUpOworICAgIGJpdHMgfD0gMUxMPDxmaWVsZHMtPndoaWNoOworICB9CisKKyAgcmV0dXJuIGJpdHM7Cit9CisKKy8vIFBhcnNlIC1wIC1zIC10IC11IC1VIC1nIC1HCitzdGF0aWMgY2hhciAqcGFyc2VfcmVzdCh2b2lkICpkYXRhLCBjaGFyICpzdHIsIGludCBsZW4pCit7CisgIHN0cnVjdCBwdHJfbGVuICpwbCA9IChzdHJ1Y3QgcHRyX2xlbiAqKWRhdGE7CisgIGxvbmcgKmxsID0gcGwtPnB0cjsKKyAgY2hhciAqZW5kOworICBpbnQgbnVtID0gMDsKKworICAvLyBBbGxvY2F0ZSBuZXh0IGNodW5rIG9mIGRhdGEKKyAgaWYgKCEoMTUmcGwtPmxlbikpCisgICAgbGwgPSBwbC0+cHRyID0geHJlYWxsb2MocGwtPnB0ciwgc2l6ZW9mKGxvbmcpKihwbC0+bGVuKzE2KSk7CisKKyAgLy8gUGFyc2UgbnVtZXJpY2FsIGlucHV0CisgIGlmIChpc2RpZ2l0KCpzdHIpKSB7CisgICAgbGxbcGwtPmxlbl0gPSB4c3RydG9sKHN0ciwgJmVuZCwgMTApOworICAgIGlmIChlbmQ9PShsZW4rc3RyKSkgbnVtKys7CisgICAgLy8gRm9yIHBraWxsLCAtcyAwIHJlcHJlc2VudHMgcGtpbGwncyBzZXNzaW9uIGlkLgorICAgIGlmIChwbD09JlRULnNzICYmIGxsW3BsLT5sZW5dPT0wKSBsbFtwbC0+bGVuXSA9IGdldHNpZCgwKTsKKyAgfQorCisgIGlmIChwbD09JlRULnBwIHx8IHBsPT0mVFQuc3MpIHsKKyAgICBpZiAobnVtICYmIGxsW3BsLT5sZW5dPjApIHsKKyAgICAgIHBsLT5sZW4rKzsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKHBsPT0mVFQudHQpIHsKKyAgICAvLyAtdCBwdHMgPSAxMixwdHMvMTIgdHR5ID0gL2Rldi90dHkyLHR0eTIsUzAKKyAgICBpZiAoIW51bSkgeworICAgICAgaWYgKHN0cnN0YXJ0KCZzdHIsIHN0cmNweSh0b3lidWYsICIvZGV2LyIpKSkgbGVuIC09IDU7CisgICAgICBpZiAoc3Ryc3RhcnQoJnN0ciwgInB0cy8iKSkgeworICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgbnVtKys7CisgICAgICB9IGVsc2UgaWYgKHN0cnN0YXJ0KCZzdHIsICJ0dHkiKSkgbGVuIC09IDM7CisgICAgfQorICAgIGlmIChsZW48MjU2ICYmICghKGVuZCA9IHN0cmNocihzdHIsICcvJykpIHx8IGVuZC1zdHI+bGVuKSkgeworICAgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICAgIGVuZCA9IHRveWJ1ZiArIHNwcmludGYodG95YnVmLCAiL2Rldi8lcyIsIG51bSA/ICJwdHMvIiA6ICJ0dHkiKTsKKyAgICAgIG1lbWNweShlbmQsIHN0ciwgbGVuKTsKKyAgICAgIGVuZFtsZW5dID0gMDsKKyAgICAgIHhzdGF0KHRveWJ1ZiwgJnN0KTsKKyAgICAgIGxsW3BsLT5sZW4rK10gPSBzdC5zdF9yZGV2OworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSBpZiAobGVuPDI1NSkgeworICAgIGNoYXIgbmFtZVsyNTZdOworCisgICAgaWYgKG51bSkgeworICAgICAgcGwtPmxlbisrOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBtZW1jcHkobmFtZSwgc3RyLCBsZW4pOworICAgIG5hbWVbbGVuXSA9IDA7CisgICAgaWYgKHBsPT0mVFQuZ2cgfHwgcGw9PSZUVC5HRykgeworICAgICAgc3RydWN0IGdyb3VwICpnciA9IGdldGdybmFtKG5hbWUpOworICAgICAgaWYgKGdyKSB7CisgICAgICAgIGxsW3BsLT5sZW4rK10gPSBnci0+Z3JfZ2lkOworCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocGw9PSZUVC51dSB8fCBwbD09JlRULlVVKSB7CisgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3bmFtKG5hbWUpOworICAgICAgaWYgKHB3KSB7CisgICAgICAgIGxsW3BsLT5sZW4rK10gPSBwdy0+cHdfdWlkOworCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFJldHVybiBlcnJvcgorICByZXR1cm4gc3RyOworfQorCisvLyBzb3J0IGZvciAtaworc3RhdGljIGludCBrc29ydCh2b2lkICphYSwgdm9pZCAqYmIpCit7CisgIHN0cnVjdCBzdHJhd2JlcnJ5ICpmaWVsZDsKKyAgc3RydWN0IGNhcnZldXAgKnRhID0gKihzdHJ1Y3QgY2FydmV1cCAqKilhYSwgKnRiID0gKihzdHJ1Y3QgY2FydmV1cCAqKiliYjsKKyAgaW50IHJldCA9IDAsIHNsb3Q7CisKKyAgZm9yIChmaWVsZCA9IFRULmtmaWVsZHM7IGZpZWxkICYmICFyZXQ7IGZpZWxkID0gZmllbGQtPm5leHQpIHsKKyAgICBzbG90ID0gdHlwb3NbZmllbGQtPndoaWNoXS5zbG90OworCisgICAgLy8gQ2FuIHdlIGRvIG51bWVyaWMgc29ydD8KKyAgICBpZiAoIShzbG90JjY0KSkgeworICAgICAgaWYgKHRhLT5zbG90W3Nsb3RdPHRiLT5zbG90W3Nsb3RdKSByZXQgPSAtMTsKKyAgICAgIGlmICh0YS0+c2xvdFtzbG90XT50Yi0+c2xvdFtzbG90XSkgcmV0ID0gMTsKKyAgICB9CisKKyAgICAvLyBmYWxsYmFjayB0byBzdHJpbmcgc29ydAorICAgIGlmICghcmV0KSB7CisgICAgICBtZW1jY3B5KHRveWJ1Ziwgc3RyaW5nX2ZpZWxkKHRhLCBmaWVsZCksIDAsIDIwNDgpOworICAgICAgdG95YnVmWzIwNDhdID0gMDsKKyAgICAgIHJldCA9IHN0cmNtcCh0b3lidWYsIHN0cmluZ19maWVsZCh0YiwgZmllbGQpKTsKKyAgICB9CisgICAgcmV0ICo9IGZpZWxkLT5yZXZlcnNlOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjYXJ2ZXVwICoqY29sbGF0ZV9sZWF2ZXMoc3RydWN0IGNhcnZldXAgKip0Yiwgc3RydWN0IGRpcnRyZWUgKmR0KSAKK3sKKyAgd2hpbGUgKGR0KSB7CisgICAgc3RydWN0IGRpcnRyZWUgKm5leHQgPSBkdC0+bmV4dDsKKworICAgIGlmIChkdC0+ZXh0cmEpICoodGIrKykgPSAodm9pZCAqKWR0LT5leHRyYTsKKyAgICBpZiAoZHQtPmNoaWxkKSB0YiA9IGNvbGxhdGVfbGVhdmVzKHRiLCBkdC0+Y2hpbGQpOworICAgIGZyZWUoZHQpOworICAgIGR0ID0gbmV4dDsKKyAgfQorCisgIHJldHVybiB0YjsKK30KKworc3RhdGljIHN0cnVjdCBjYXJ2ZXVwICoqY29sbGF0ZShpbnQgY291bnQsIHN0cnVjdCBkaXJ0cmVlICpkdCkKK3sKKyAgc3RydWN0IGNhcnZldXAgKip0YnNvcnQgPSB4bWFsbG9jKGNvdW50KnNpemVvZihzdHJ1Y3QgY2FydmV1cCAqKSk7CisKKyAgY29sbGF0ZV9sZWF2ZXModGJzb3J0LCBkdCk7CisKKyAgcmV0dXJuIHRic29ydDsKK30gCisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfa28oY2hhciAqcywgdm9pZCAqZmllbGRzLCBjaGFyICplcnIsIHN0cnVjdCBhcmdfbGlzdCAqYXJnKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgZGVmOworCisgIG1lbXNldCgmZGVmLCAwLCBzaXplb2Yoc3RydWN0IGFyZ19saXN0KSk7CisgIGRlZi5hcmcgPSBzOworICBjb21tYV9hcmdzKGFyZyA/IGFyZyA6ICZkZWYsIGZpZWxkcywgZXJyLCBwYXJzZV9rbyk7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJlZF9tYWluKHZvaWQpCit7CisgIGludCBpOworCisgIFRULnRpY2tzID0gc3lzY29uZihfU0NfQ0xLX1RDSyk7CisgIGlmICghVFQud2lkdGgpIHsKKyAgICBUVC53aWR0aCA9ICh0b3lzLndoaWNoLT5uYW1lWzFdID09ICdzJykgPyA5OTk5OSA6IDgwOworICAgIFRULmhlaWdodCA9IDI1OworICAgIHRlcm1pbmFsX3NpemUoJlRULndpZHRoLCAmVFQuaGVpZ2h0KTsKKyAgfQorCisgIC8vIGZpbmQgY29udHJvbGxpbmcgdHR5LCBmYWxsaW5nIGJhY2sgdG8gL2Rldi90dHkgaWYgbm9uZQorICBmb3IgKGkgPSAwOyAhVFQudHR5ICYmIGk8NDsgaSsrKSB7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IGZkID0gaTsKKworICAgIGlmIChpPT0zICYmIC0xPT0oZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRPTkxZKSkpIGJyZWFrOworCisgICAgaWYgKGlzYXR0eShmZCkgJiYgIWZzdGF0KGZkLCAmc3QpKSBUVC50dHkgPSBzdC5zdF9yZGV2OworICAgIGlmIChpPT0zKSBjbG9zZShmZCk7CisgIH0KK30KKwordm9pZCBwc19tYWluKHZvaWQpCit7CisgIHN0cnVjdCBkaXJ0cmVlICpkdDsKKyAgY2hhciAqbm90X287CisgIGludCBpOworCisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfdykgVFQud2lkdGggPSA5OTk5OTsKKyAgc2hhcmVkX21haW4oKTsKKworICAvLyBwYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBvdGhlciB0aGFuIC1vCisgIGNvbW1hX2FyZ3MoVFQucHMuUCwgJlRULlBQLCAiYmFkIC1QIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMucCwgJlRULnBwLCAiYmFkIC1wIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMudCwgJlRULnR0LCAiYmFkIC10IiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMucywgJlRULnNzLCAiYmFkIC1zIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMudSwgJlRULnV1LCAiYmFkIC11IiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMuVSwgJlRULlVVLCAiYmFkIC1VIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMuZywgJlRULmdnLCAiYmFkIC1nIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMuRywgJlRULkdHLCAiYmFkIC1HIiwgcGFyc2VfcmVzdCk7CisgIGNvbW1hX2FyZ3MoVFQucHMuaywgJlRULmtmaWVsZHMsICJiYWQgLWsiLCBwYXJzZV9rbyk7CisgIGRsaXN0X3Rlcm1pbmF0ZShUVC5rZmllbGRzKTsKKworICAvLyBGaWd1cmUgb3V0IHdoaWNoIGZpZWxkcyB0byBkaXNwbGF5CisgIG5vdF9vID0gIiVzVFRZLFRJTUUsQ01EIjsKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19mKQorICAgIHNwcmludGYobm90X28gPSB0b3lidWYrMTI4LCAiVVNFUjo4PVVJRCwlJXNQUElELCVzLFNUSU1FLFRUWSxUSU1FLEFSR1M9Q01EIiwKKyAgICAgICh0b3lzLm9wdGZsYWdzJkZMQUdfVCkgPyAiVENOVCIgOiAiQyIpOworICBlbHNlIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfbCkKKyAgICBub3RfbyA9ICJGLFMsVUlELCVzUFBJRCxDLFBSSSxOSSxBRERSLFNaLFdDSEFOLFRUWSxUSU1FLENNRCI7CisgIGVsc2UgaWYgKENGR19UT1lCT1hfT05fQU5EUk9JRCkKKyAgICBub3RfbyA9ICJVU0VSLCVzUFBJRCxWU0laRSxSU1MsV0NIQU46MTAsQUREUjoxMD1QQyxTLE5BTUUiOworICBzcHJpbnRmKHRveWJ1Ziwgbm90X28sICh0b3lzLm9wdGZsYWdzICYgRkxBR19UKSA/ICJQSUQsVElELCIgOiAiUElELCIpOworCisgIC8vIEluaXQgVFQuZmllbGRzLiBUaGlzIG9ubHkgdXNlcyB0b3lidWYgaWYgVFQucHMubyBpcyBOVUxMCisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfWikgZGVmYXVsdF9rbygiTEFCRUwiLCAmVFQuZmllbGRzLCAwLCAwKTsKKyAgZGVmYXVsdF9rbyh0b3lidWYsICZUVC5maWVsZHMsICJiYWQgLW8iLCBUVC5wcy5vKTsKKworICBpZiAoVFQucHMuTykgeworICAgIGlmIChUVC5maWVsZHMpIFRULmZpZWxkcyA9ICgoc3RydWN0IHN0cmF3YmVycnkgKilUVC5maWVsZHMpLT5wcmV2OworICAgIGNvbW1hX2FyZ3MoVFQucHMuTywgJlRULmZpZWxkcywgImJhZCAtTyIsIHBhcnNlX2tvKTsKKyAgICBpZiAoVFQuZmllbGRzKSBUVC5maWVsZHMgPSAoKHN0cnVjdCBzdHJhd2JlcnJ5ICopVFQuZmllbGRzKS0+bmV4dDsKKyAgfQorICBkbGlzdF90ZXJtaW5hdGUoVFQuZmllbGRzKTsKKworICAvLyAtZiBhbmQgLW4gY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHNvbWUgZmllbGRzCisgIGlmICh0b3lzLm9wdGZsYWdzJihGTEFHX2Z8RkxBR19uKSkgeworICAgIHN0cnVjdCBzdHJhd2JlcnJ5ICpldmVyOworCisgICAgZm9yIChldmVyID0gVFQuZmllbGRzOyBldmVyOyBldmVyID0gZXZlci0+bmV4dCkgeworICAgICAgaWYgKCh0b3lzLm9wdGZsYWdzJkZMQUdfbikgJiYgZXZlci0+d2hpY2g+PVBTX1VJRAorICAgICAgICAmJiBldmVyLT53aGljaDw9UFNfUkdST1VQICYmICh0eXBvc1tldmVyLT53aGljaF0uc2xvdCY2NCkpCisgICAgICAgICAgZXZlci0+d2hpY2gtLTsKKyAgICB9CisgIH0KKworICAvLyBDYWxjdWxhdGUgc2VlbiBmaWVsZHMgYml0IGFycmF5LCBhbmQgaWYgd2UgYXJlbid0IGRlZmVycmluZyBwcmludGluZworICAvLyBwcmludCBoZWFkZXJzIG5vdyAoZm9yIGxvdyBtZW1vcnkvbm9tbXUgc3lzdGVtcykuCisgIFRULmJpdHMgPSBnZXRfaGVhZGVycyhUVC5maWVsZHMsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICBpZiAoISh0b3lzLm9wdGZsYWdzJkZMQUdfTSkpIHByaW50ZigiJS4qc1xuIiwgVFQud2lkdGgsIHRveWJ1Zik7CisgIGlmICghKHRveXMub3B0ZmxhZ3MmKEZMQUdfa3xGTEFHX00pKSkgVFQuc2hvd19wcm9jZXNzID0gKHZvaWQgKilzaG93X3BzOworICBUVC5tYXRjaF9wcm9jZXNzID0gcHNfbWF0Y2hfcHJvY2VzczsKKyAgZHQgPSBkaXJ0cmVlX3JlYWQoIi9wcm9jIiwKKyAgICAoKHRveXMub3B0ZmxhZ3MmRkxBR19UKSB8fCAoVFQuYml0cyYoX1BTX1RJRHxfUFNfVENOVCkpKQorICAgICAgPyBnZXRfdGhyZWFkcyA6IGdldF9wcyk7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmKEZMQUdfa3xGTEFHX00pKSB7CisgICAgc3RydWN0IGNhcnZldXAgKip0YnNvcnQgPSBjb2xsYXRlKFRULmtjb3VudCwgZHQpOworCisgICAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19NKSB7CisgICAgICBmb3IgKGkgPSAwOyBpPFRULmtjb3VudDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBzdHJhd2JlcnJ5ICpmaWVsZDsKKworICAgICAgICBmb3IgKGZpZWxkID0gVFQuZmllbGRzOyBmaWVsZDsgZmllbGQgPSBmaWVsZC0+bmV4dCkgeworICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oc3RyaW5nX2ZpZWxkKHRic29ydFtpXSwgZmllbGQpKTsKKworICAgICAgICAgIGlmIChhYnMoZmllbGQtPmxlbik8bGVuKSBmaWVsZC0+bGVuID0gKGZpZWxkLT5sZW48MCkgPyAtbGVuIDogbGVuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIHJlY2FsY3VsYXRlZCBmaWVsZCB3aWR0aHMsIHJlLXBhZCBoZWFkZXJzIGFnYWluCisgICAgICBnZXRfaGVhZGVycyhUVC5maWVsZHMsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgICAgcHJpbnRmKCIlLipzXG4iLCBUVC53aWR0aCwgdG95YnVmKTsKKyAgICB9CisKKyAgICBpZiAodG95cy5vcHRmbGFncyZGTEFHX2spCisgICAgICBxc29ydCh0YnNvcnQsIFRULmtjb3VudCwgc2l6ZW9mKHN0cnVjdCBjYXJ2ZXVwICopLCAodm9pZCAqKWtzb3J0KTsKKyAgICBmb3IgKGkgPSAwOyBpPFRULmtjb3VudDsgaSsrKSB7CisgICAgICBzaG93X3BzKHRic29ydFtpXSk7CisgICAgICBmcmVlKHRic29ydFtpXSk7CisgICAgfQorICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUodGJzb3J0KTsKKyAgfQorCisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHsKKyAgICBmcmVlKFRULmdnLnB0cik7CisgICAgZnJlZShUVC5HRy5wdHIpOworICAgIGZyZWUoVFQucHAucHRyKTsKKyAgICBmcmVlKFRULlBQLnB0cik7CisgICAgZnJlZShUVC5zcy5wdHIpOworICAgIGZyZWUoVFQudHQucHRyKTsKKyAgICBmcmVlKFRULnV1LnB0cik7CisgICAgZnJlZShUVC5VVS5wdHIpOworICAgIGxsaXN0X3RyYXZlcnNlKFRULmZpZWxkcywgZnJlZSk7CisgIH0KK30KKworI2RlZmluZSBDTEVBTlVQX3BzCisjZGVmaW5lIEZPUl90b3AKKyNpbmNsdWRlICJnZW5lcmF0ZWQvZmxhZ3MuaCIKKworLy8gc2VsZWN0IHdoaWNoIG9mIHRoZSAtbyBmaWVsZHMgdG8gc29ydCBieQorc3RhdGljIHZvaWQgc2V0c29ydChpbnQgcG9zKQoreworICBzdHJ1Y3Qgc3RyYXdiZXJyeSAqZmllbGQsICpnb2luZzI7CisgIGludCBpID0gMDsKKworICBpZiAocG9zPDApIHBvcyA9IDA7CisKKyAgZm9yIChmaWVsZCA9IFRULmZpZWxkczsgZmllbGQ7IGZpZWxkID0gZmllbGQtPm5leHQpIHsKKyAgICBpZiAoKFRULnNvcnRwb3MgPSBpKyspPHBvcyAmJiBmaWVsZC0+bmV4dCkgY29udGludWU7CisgICAgZ29pbmcyID0gVFQua2ZpZWxkczsKKyAgICBnb2luZzItPndoaWNoID0gZmllbGQtPndoaWNoOworICAgIGdvaW5nMi0+bGVuID0gZmllbGQtPmxlbjsKKyAgICBicmVhazsKKyAgfQorfQorCisvLyBJZiB3ZSBoYXZlIGJvdGgsIGFkanVzdCBzbG90W2RlbHRhc1tdXSB0byBiZSByZWxhdGl2ZSB0byBwcmV2aW91cworLy8gbWVhc3VyZW1lbnQgcmF0aGVyIHRoYW4gcHJvY2VzcyBzdGFydC4gU3RvbXBpbmcgb2xkLmRhdGEgaXMgZmluZQorLy8gYmVjYXVzZSB3ZSBmcmVlIGl0IGFmdGVyIGRpc3BsYXlpbmcuCitzdGF0aWMgaW50IG1lcmdlX2RlbHRhcyhsb25nIGxvbmcgKm9zbG90LCBsb25nIGxvbmcgKm5zbG90LCBpbnQgbWlsaXMpCit7CisgIGNoYXIgZGVsdGFzW10gPSB7U0xPVF91dGltZTIsIFNMT1RfaW9ieXRlcywgU0xPVF9kaW9ieXRlcywgU0xPVF9yY2hhciwKKyAgICAgICAgICAgICAgICAgICBTTE9UX3djaGFyLCBTTE9UX3JieXRlcywgU0xPVF93Ynl0ZXMsIFNMT1Rfc3dhcH07CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGk8QVJSQVlfTEVOKGRlbHRhcyk7IGkrKykKKyAgICBvc2xvdFtkZWx0YXNbaV1dID0gbnNsb3RbZGVsdGFzW2ldXSAtIG9zbG90W2RlbHRhc1tpXV07CisgIG9zbG90W1NMT1RfdXB0aWNrc10gPSAobWlsaXMqVFQudGlja3MpLzEwMDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGVhZGVyX2xpbmUoaW50IGxpbmUsIGludCByZXYpCit7CisgIGlmICghbGluZSkgcmV0dXJuIDA7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19iKSByZXYgPSAwOworCisgIHByaW50ZigiJXMlKi4qcyVzXHJcbiIsIHJldiA/ICJcMDMzWzdtIiA6ICIiLAorICAgICh0b3lzLm9wdGZsYWdzJkZMQUdfYikgPyAwIDogLVRULndpZHRoLCBUVC53aWR0aCwgdG95YnVmLAorICAgIHJldiA/ICJcMDMzWzBtIiA6ICIiKTsKKworICByZXR1cm4gbGluZS0xOworfQorCitzdGF0aWMgbG9uZyBsb25nIG1pbGxpdGltZSh2b2lkKQoreworICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgIHJldHVybiB0cy50dl9zZWMqMTAwMCt0cy50dl9uc2VjLzEwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIHRvcF9jb21tb24oCisgIGludCAoKmZpbHRlcikobG9uZyBsb25nICpvc2xvdCwgbG9uZyBsb25nICpuc2xvdCwgaW50IG1pbGlzKSkKK3sKKyAgbG9uZyBsb25nIHRpbWVvdXQgPSAwLCBub3csIHN0YXRzWzE2XTsKKyAgc3RydWN0IHByb2NsaXN0IHsKKyAgICBzdHJ1Y3QgY2FydmV1cCAqKnRiOworICAgIGludCBjb3VudDsKKyAgICBsb25nIGxvbmcgd2hlbmNlOworICB9IHBsaXN0WzJdLCAqcGxvbGQsICpwbG5ldywgb2xkLCBuZXcsIG1peDsKKyAgY2hhciBzY3JhdGNoWzE2XSwgKnBvcywgKmNwdWZpZWxkc1tdID0geyJ1c2VyIiwgIm5pY2UiLCAic3lzIiwgImlkbGUiLAorICAgICJpb3ciLCAiaXJxIiwgInNpcnEiLCAiaG9zdCJ9OworIAorICB1bnNpZ25lZCB0b2NrID0gMDsKKyAgaW50IGksIGxpbmVzLCB0b3BvZmYgPSAwLCBkb25lID0gMDsKKworICB0b3lzLnNpZ25hbCA9IFNJR1dJTkNIOworICBUVC5iaXRzID0gZ2V0X2hlYWRlcnMoVFQuZmllbGRzLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgKnNjcmF0Y2ggPSAwOworICBtZW1zZXQocGxpc3QsIDAsIHNpemVvZihwbGlzdCkpOworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOworICBkbyB7CisgICAgc3RydWN0IGRpcnRyZWUgKmR0OworICAgIGludCByZWNhbGMgPSAxOworCisgICAgcGxvbGQgPSBwbGlzdCsodG9jaysrJjEpOworICAgIHBsbmV3ID0gcGxpc3QrKHRvY2smMSk7CisgICAgcGxuZXctPndoZW5jZSA9IG1pbGxpdGltZSgpOworICAgIGR0ID0gZGlydHJlZV9yZWFkKCIvcHJvYyIsCisgICAgICAoKHRveXMub3B0ZmxhZ3MmRkxBR19IKSB8fCAoVFQuYml0cyYoX1BTX1RJRHxfUFNfVENOVCkpKQorICAgICAgICA/IGdldF90aHJlYWRzIDogZ2V0X3BzKTsKKyAgICBwbG5ldy0+dGIgPSBjb2xsYXRlKHBsbmV3LT5jb3VudCA9IFRULmtjb3VudCwgZHQpOworICAgIFRULmtjb3VudCA9IDA7CisKKyAgICBpZiAocmVhZGZpbGUoIi9wcm9jL3N0YXQiLCBwb3MgPSB0b3lidWYsIHNpemVvZih0b3lidWYpKSkgeworICAgICAgbG9uZyBsb25nICpzdCA9IHN0YXRzKzgqKHRvY2smMSk7CisKKyAgICAgIC8vIHVzZXIgbmljZSBzeXN0ZW0gaWRsZSBpb3dhaXQgaXJxIHNvZnRpcnEgaG9zdAorICAgICAgc3NjYW5mKHBvcywgImNwdSAlbGxkICVsbGQgJWxsZCAlbGxkICVsbGQgJWxsZCAlbGxkICVsbGQiLAorICAgICAgICBzdCwgc3QrMSwgc3QrMiwgc3QrMywgc3QrNCwgc3QrNSwgc3QrNiwgc3QrNyk7CisgICAgfQorCisgICAgLy8gRmlyc3QgdGltZSwgd2FpdCBhIHF1YXJ0ZXIgb2YgYSBzZWNvbmQgdG8gY29sbGVjdCBhIGxpdHRsZSBkZWx0YSBkYXRhLgorICAgIGlmICghcGxvbGQtPnRiKSB7CisgICAgICBtc2xlZXAoMjUwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIENvbGxhdGUgb2xkIGFuZCBuZXcgaW50byAibWl4IiwgZGVwZW5kcyBvbiAvcHJvYyByZWFkIGluIHBpZCBzb3J0IG9yZGVyCisgICAgb2xkID0gKnBsb2xkOworICAgIG5ldyA9ICpwbG5ldzsKKyAgICBtaXgudGIgPSB4bWFsbG9jKChvbGQuY291bnQrbmV3LmNvdW50KSpzaXplb2Yoc3RydWN0IGNhcnZldXApKTsKKyAgICBtaXguY291bnQgPSAwOworCisgICAgd2hpbGUgKG9sZC5jb3VudCB8fCBuZXcuY291bnQpIHsKKyAgICAgIHN0cnVjdCBjYXJ2ZXVwICpvdGIgPSAqb2xkLnRiLCAqbnRiID0gKm5ldy50YjsKKworICAgICAgLy8gSWYgd2UganVzdCBoYXZlIG9sZCBmb3IgdGhpcyBwcm9jZXNzLCBpdCBleGl0ZWQuIERpc2NhcmQgaXQuCisgICAgICBpZiAob2xkLmNvdW50ICYmICghbmV3LmNvdW50IHx8ICpvdGItPnNsb3QgPCAqbnRiLT5zbG90KSkgeworICAgICAgICBvbGQudGIrKzsKKyAgICAgICAgb2xkLmNvdW50LS07CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGp1c3QgaGF2ZSBuZXcsIHVzZSBpdCB2ZXJiYXRpbQorICAgICAgaWYgKCFvbGQuY291bnQgfHwgKm90Yi0+c2xvdCA+ICpudGItPnNsb3QpIG1peC50YlttaXguY291bnRdID0gbnRiOworICAgICAgZWxzZSB7CisgICAgICAgIC8vIEtlZXAgb3IgZGlzY2FyZAorICAgICAgICBpZiAoZmlsdGVyKG90Yi0+c2xvdCwgbnRiLT5zbG90LCBuZXcud2hlbmNlLW9sZC53aGVuY2UpKSB7CisgICAgICAgICAgbWl4LnRiW21peC5jb3VudF0gPSBvdGI7CisgICAgICAgICAgbWl4LmNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgb2xkLnRiKys7CisgICAgICAgIG9sZC5jb3VudC0tOworICAgICAgfQorICAgICAgbmV3LnRiKys7CisgICAgICBuZXcuY291bnQtLTsKKyAgICB9CisKKyAgICAvLyBEb24ndCByZS1mZXRjaCBkYXRhIGlmIGl0J3Mgbm90IHRpbWUgeWV0LCBqdXN0IHJlLWRpc3BsYXkgZXhpc3RpbmcgZGF0YS4KKyAgICBmb3IgKDs7KSB7CisgICAgICBjaGFyIHdhcywgaXM7CisKKyAgICAgIGlmIChyZWNhbGMpIHsKKyAgICAgICAgcXNvcnQobWl4LnRiLCBtaXguY291bnQsIHNpemVvZihzdHJ1Y3QgY2FydmV1cCAqKSwgKHZvaWQgKilrc29ydCk7CisgICAgICAgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19iKSkgeworICAgICAgICAgIHByaW50ZigiXDAzM1tIXDAzM1tKIik7CisgICAgICAgICAgaWYgKHRveXMuc2lnbmFsKSB7CisgICAgICAgICAgICB0b3lzLnNpZ25hbCA9IDA7CisgICAgICAgICAgICB0ZXJtaW5hbF9wcm9iZXNpemUoJlRULndpZHRoLCAmVFQuaGVpZ2h0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGluZXMgPSBUVC5oZWlnaHQ7CisgICAgICB9CisgICAgICBpZiAocmVjYWxjICYmICEodG95cy5vcHRmbGFncyZGTEFHX3EpKSB7CisgICAgICAgIC8vIERpc3BsYXkgInRvcCIgaGVhZGVyLgorICAgICAgICBpZiAoKnRveXMud2hpY2gtPm5hbWUgPT0gJ3QnKSB7CisgICAgICAgICAgc3RydWN0IHN0cmF3YmVycnkgYWxsdWM7CisgICAgICAgICAgbG9uZyBsb25nIGxsLCB1cCA9IDA7CisgICAgICAgICAgbG9uZyBydW5bNl07CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAvLyBDb3VudCBydW5uaW5nLCBzbGVlcGluZywgc3RvcHBlZCwgem9tYmllIHByb2Nlc3Nlcy4KKyAgICAgICAgICBhbGx1Yy53aGljaCA9IFBTX1M7CisgICAgICAgICAgbWVtc2V0KHJ1biwgMCwgc2l6ZW9mKHJ1bikpOworICAgICAgICAgIGZvciAoaSA9IDA7IGk8bWl4LmNvdW50OyBpKyspCisgICAgICAgICAgICBydW5bMStzdHJpZHgoIlJTVFoiLCAqc3RyaW5nX2ZpZWxkKG1peC50YltpXSwgJmFsbHVjKSldKys7CisgICAgICAgICAgc3ByaW50Zih0b3lidWYsCisgICAgICAgICAgICAiVGFza3M6ICVkIHRvdGFsLCU0bGQgcnVubmluZywlNGxkIHNsZWVwaW5nLCU0bGQgc3RvcHBlZCwiCisgICAgICAgICAgICAiJTRsZCB6b21iaWUiLCBtaXguY291bnQsIHJ1blsxXSwgcnVuWzJdLCBydW5bM10sIHJ1bls0XSk7CisgICAgICAgICAgbGluZXMgPSBoZWFkZXJfbGluZShsaW5lcywgMCk7CisKKyAgICAgICAgICBpZiAocmVhZGZpbGUoIi9wcm9jL21lbWluZm8iLCB0b3lidWYsIHNpemVvZih0b3lidWYpKSkgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKSB7CisgICAgICAgICAgICAgIHBvcyA9IHN0cmFmdGVyKHRveWJ1ZiwgKGNoYXIgKltdKXsiTWVtVG90YWw6IiwiXG5NZW1GcmVlOiIsCisgICAgICAgICAgICAgICAgICAgICJcbkJ1ZmZlcnM6IiwiXG5DYWNoZWQ6IiwiXG5Td2FwVG90YWw6IiwiXG5Td2FwRnJlZToifVtpXSk7CisgICAgICAgICAgICAgIHJ1bltpXSA9IHBvcyA/IGF0b2wocG9zKSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKHRveWJ1ZiwKKyAgICAgICAgICAgICAiTWVtOiUxMGxkayB0b3RhbCwlOWxkayB1c2VkLCU5bGRrIGZyZWUsJTlsZGsgYnVmZmVycyIsCisgICAgICAgICAgICAgIHJ1blswXSwgcnVuWzBdLXJ1blsxXSwgcnVuWzFdLCBydW5bMl0pOworICAgICAgICAgICAgbGluZXMgPSBoZWFkZXJfbGluZShsaW5lcywgMCk7CisgICAgICAgICAgICBzcHJpbnRmKHRveWJ1ZiwKKyAgICAgICAgICAgICAgIlN3YXA6JTlsZGsgdG90YWwsJTlsZGsgdXNlZCwlOWxkayBmcmVlLCU5bGRrIGNhY2hlZCIsCisgICAgICAgICAgICAgIHJ1bls0XSwgcnVuWzRdLXJ1bls1XSwgcnVuWzVdLCBydW5bM10pOworICAgICAgICAgICAgbGluZXMgPSBoZWFkZXJfbGluZShsaW5lcywgMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcG9zID0gdG95YnVmOworICAgICAgICAgIGkgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKTsKKyAgICAgICAgICBwb3MgKz0gc3ByaW50Zihwb3MsICIlZCUlY3B1IiwgaSoxMDApOworICAgICAgICAgIGogPSA0KyhpPjEwKTsKKworICAgICAgICAgIC8vIElmIGEgcHJvY2Vzc29yIGdvZXMgaWRsZSBpdCdzIHBvd2VyZWQgZG93biBhbmQgaXRzIGlkbGUgdGlja3MgZG9uJ3QKKyAgICAgICAgICAvLyBhZHZhbmNlLCBzbyBjYWxjdWxhdGUgaWRsZSB0aW1lIGFzIHBvdGVudGlhbCB0aW1lIC0gdXNlZC4KKyAgICAgICAgICBpZiAobWl4LmNvdW50KSB1cCA9IG1peC50YlswXS0+c2xvdFtTTE9UX3VwdGlja3NdOworICAgICAgICAgIGlmICghdXApIHVwID0gMTsKKyAgICAgICAgICBub3cgPSB1cCppOworICAgICAgICAgIGxsID0gc3RhdHNbM10gPSBzdGF0c1sxMV0gPSAwOworICAgICAgICAgIGZvciAoaSA9IDA7IGk8ODsgaSsrKSBsbCArPSBzdGF0c1tpXS1zdGF0c1tpKzhdOworICAgICAgICAgIHN0YXRzWzNdID0gbm93IC0gbGxhYnMobGwpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaTw4OyBpKyspIHsKKyAgICAgICAgICAgIGxsID0gKGxsYWJzKHN0YXRzW2ldLXN0YXRzW2krOF0pKjEwMDApL3VwOworICAgICAgICAgICAgcG9zICs9IHNwcmludGYocG9zLCAiJSAqbGxkJSUlcyIsIGosIChsbCs1KS8xMCwgY3B1ZmllbGRzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbGluZXMgPSBoZWFkZXJfbGluZShsaW5lcywgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RydWN0IHN0cmF3YmVycnkgKmZpZWxkczsKKyAgICAgICAgICBzdHJ1Y3QgY2FydmV1cCB0YjsKKworICAgICAgICAgIG1lbXNldCgmdGIsIDAsIHNpemVvZihzdHJ1Y3QgY2FydmV1cCkpOworICAgICAgICAgIHBvcyA9IHN0cGNweSh0b3lidWYsICJUb3RhbHM6Iik7CisgICAgICAgICAgZm9yIChmaWVsZHMgPSBUVC5maWVsZHM7IGZpZWxkczsgZmllbGRzID0gZmllbGRzLT5uZXh0KSB7CisgICAgICAgICAgICBsb25nIGxvbmcgbGwsIGJpdHMgPSAwOworICAgICAgICAgICAgaW50IHNsb3QgPSB0eXBvc1tmaWVsZHMtPndoaWNoXS5zbG90JjYzOworCisgICAgICAgICAgICBpZiAoZmllbGRzLT53aGljaDxQU19DIHx8IGZpZWxkcy0+d2hpY2g+UFNfRElPKSBjb250aW51ZTsKKyAgICAgICAgICAgIGxsID0gMUxMPDxmaWVsZHMtPndoaWNoOworICAgICAgICAgICAgaWYgKGJpdHMmbGwpIGNvbnRpbnVlOworICAgICAgICAgICAgYml0cyB8PSBsbDsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPG1peC5jb3VudDsgaSsrKQorICAgICAgICAgICAgICB0Yi5zbG90W3Nsb3RdICs9IG1peC50YltpXS0+c2xvdFtzbG90XTsKKyAgICAgICAgICAgIHBvcyArPSBzbnByaW50Zihwb3MsIHNpemVvZih0b3lidWYpLzItKHBvcy10b3lidWYpLAorICAgICAgICAgICAgICAiICVzOiAlKnMsIiwgdHlwb3NbZmllbGRzLT53aGljaF0ubmFtZSwKKyAgICAgICAgICAgICAgZmllbGRzLT5sZW4sIHN0cmluZ19maWVsZCgmdGIsIGZpZWxkcykpOworICAgICAgICAgIH0KKyAgICAgICAgICAqLS1wb3MgPSAwOworICAgICAgICAgIGxpbmVzID0gaGVhZGVyX2xpbmUobGluZXMsIDApOworICAgICAgICB9CisKKyAgICAgICAgZ2V0X2hlYWRlcnMoVFQuZmllbGRzLCBwb3MgPSB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICAgICAgZm9yIChpID0gMCwgaXMgPSAnICc7ICpwb3M7IHBvcysrKSB7CisgICAgICAgICAgd2FzID0gaXM7CisgICAgICAgICAgaXMgPSAqcG9zOworICAgICAgICAgIGlmIChpc3NwYWNlKHdhcykgJiYgIWlzc3BhY2UoaXMpICYmIGkrKz09VFQuc29ydHBvcyAmJiBwb3MhPXRveWJ1ZikKKyAgICAgICAgICAgIHBvc1stMV0gPSAnWyc7CisgICAgICAgICAgaWYgKCFpc3NwYWNlKHdhcykgJiYgaXNzcGFjZShpcykgJiYgaT09VFQuc29ydHBvcysxKSAqcG9zID0gJ10nOworICAgICAgICB9CisgICAgICAgICpwb3MgPSAwOworICAgICAgICBsaW5lcyA9IGhlYWRlcl9saW5lKGxpbmVzLCAxKTsKKyAgICAgIH0KKyAgICAgIGlmICghcmVjYWxjICYmICEodG95cy5vcHRmbGFncyZGTEFHX2IpKQorICAgICAgICBwcmludGYoIlwwMzNbJWRIXDAzM1tKIiwgMStUVC5oZWlnaHQtbGluZXMpOworICAgICAgcmVjYWxjID0gMTsKKworICAgICAgZm9yIChpID0gMDsgaTxsaW5lcyAmJiBpK3RvcG9mZjxtaXguY291bnQ7IGkrKykgeworICAgICAgICBpZiAoISh0b3lzLm9wdGZsYWdzJkZMQUdfYikgJiYgaSkgeHB1dGMoJ1xuJyk7CisgICAgICAgIHNob3dfcHMobWl4LnRiW2krdG9wb2ZmXSk7CisgICAgICB9CisKKyAgICAgIGlmIChUVC50b3AubiAmJiAhLS1UVC50b3AubikgeworICAgICAgICBkb25lKys7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBub3cgPSBtaWxsaXRpbWUoKTsKKyAgICAgIGlmICh0aW1lb3V0PD1ub3cpIHRpbWVvdXQgPSBuZXcud2hlbmNlK1RULnRvcC5kOworICAgICAgaWYgKHRpbWVvdXQ8PW5vdyB8fCB0aW1lb3V0Pm5vdytUVC50b3AuZCkgdGltZW91dCA9IG5vdytUVC50b3AuZDsKKworICAgICAgLy8gSW4gYmF0Y2ggbW9kZSwgd2UgaWdub3JlIHRoZSBrZXlib2FyZC4KKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfYikgeworICAgICAgICBtc2xlZXAodGltZW91dC1ub3cpOworICAgICAgICAvLyBNYWtlIGFuIG9idmlvdXMgZ2FwIGJldHdlZW4gZGF0YXNldHMuCisgICAgICAgIHhwdXRzKCJcblxuIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpID0gc2Nhbl9rZXlfZ2V0c2l6ZShzY3JhdGNoLCB0aW1lb3V0LW5vdywgJlRULndpZHRoLCAmVFQuaGVpZ2h0KTsKKyAgICAgIGlmIChpPT0tMSB8fCBpPT0zIHx8IHRvdXBwZXIoaSk9PSdRJykgeworICAgICAgICBkb25lKys7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGk9PS0yKSBicmVhazsKKworICAgICAgLy8gRmx1c2ggdW5rbm93biBlc2NhcGUgc2VxdWVuY2VzLgorICAgICAgaWYgKGk9PTI3KSB3aGlsZSAoMDxzY2FuX2tleV9nZXRzaXplKHNjcmF0Y2gsIDAsICZUVC53aWR0aCwgJlRULmhlaWdodCkpOworICAgICAgZWxzZSBpZiAoaT09JyAnKSB7CisgICAgICAgIHRpbWVvdXQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAodG91cHBlcihpKT09J1InKQorICAgICAgICAoKHN0cnVjdCBzdHJhd2JlcnJ5ICopVFQua2ZpZWxkcyktPnJldmVyc2UgKj0gLTE7CisgICAgICBlbHNlIHsKKyAgICAgICAgaSAtPSAyNTY7CisgICAgICAgIGlmIChpID09IEtFWV9MRUZUKSBzZXRzb3J0KFRULnNvcnRwb3MtMSk7CisgICAgICAgIGVsc2UgaWYgKGkgPT0gS0VZX1JJR0hUKSBzZXRzb3J0KFRULnNvcnRwb3MrMSk7CisgICAgICAgIC8vIEtFWV9VUCBpcyAwLCBzbyBhdCBlbmQgb2Ygc3RyY2hyCisgICAgICAgIGVsc2UgaWYgKHN0cmNocigoY2hhciBbXSl7S0VZX0RPV04sS0VZX1BHVVAsS0VZX1BHRE4sS0VZX1VQfSwgaSkpIHsKKyAgICAgICAgICByZWNhbGMgPSAwOworCisgICAgICAgICAgaWYgKGkgPT0gS0VZX1VQKSB0b3BvZmYtLTsKKyAgICAgICAgICBlbHNlIGlmIChpID09IEtFWV9ET1dOKSB0b3BvZmYrKzsKKyAgICAgICAgICBlbHNlIGlmIChpID09IEtFWV9QR0ROKSB0b3BvZmYgKz0gbGluZXM7CisgICAgICAgICAgZWxzZSBpZiAoaSA9PSBLRVlfUEdVUCkgdG9wb2ZmIC09IGxpbmVzOworICAgICAgICAgIGlmICh0b3BvZmY8MCkgdG9wb2ZmID0gMDsgCisgICAgICAgICAgaWYgKHRvcG9mZj5taXguY291bnQpIHRvcG9mZiA9IG1peC5jb3VudDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZnJlZShtaXgudGIpOworICAgIGZvciAoaT0wOyBpPHBsb2xkLT5jb3VudDsgaSsrKSBmcmVlKHBsb2xkLT50YltpXSk7CisgICAgZnJlZShwbG9sZC0+dGIpOworICB9IHdoaWxlICghZG9uZSk7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX2IpKSB0dHlfcmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgdG9wX3NldHVwKGNoYXIgKmRlZm8sIGNoYXIgKmRlZmspCit7CisgIFRULnRvcC5kICo9IDEwMDA7CisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfYikgVFQud2lkdGggPSBUVC5oZWlnaHQgPSA5OTk5OTsKKyAgZWxzZSB7CisgICAgVFQudGltZSA9IG1pbGxpdGltZSgpOworICAgIHNldF90ZXJtaW5hbCgwLCAxLCAwKTsKKyAgICBzaWdhdGV4aXQodHR5X3NpZ3Jlc2V0KTsKKyAgICB4c2lnbmFsKFNJR1dJTkNILCBnZW5lcmljX3NpZ25hbCk7CisgICAgcHJpbnRmKCJcMDMzWz8yNWxcMDMzWzBtIik7CisgIH0KKyAgc2hhcmVkX21haW4oKTsKKworICBjb21tYV9hcmdzKFRULnRvcC51LCAmVFQudXUsICJiYWQgLXUiLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC50b3AucCwgJlRULnBwLCAiYmFkIC1wIiwgcGFyc2VfcmVzdCk7CisgIFRULm1hdGNoX3Byb2Nlc3MgPSBzaGFyZWRfbWF0Y2hfcHJvY2VzczsKKworICBkZWZhdWx0X2tvKGRlZm8sICZUVC5maWVsZHMsICJiYWQgLW8iLCBUVC50b3Aubyk7CisgIGRsaXN0X3Rlcm1pbmF0ZShUVC5maWVsZHMpOworCisgIC8vIEZpcnN0IChkdW1teSkgc29ydCBmaWVsZCBpcyBvdmVyd3JpdHRlbiBieSBzZXRzb3J0KCkKKyAgZGVmYXVsdF9rbygiLVMiLCAmVFQua2ZpZWxkcywgMCwgMCk7CisgIGRlZmF1bHRfa28oZGVmaywgJlRULmtmaWVsZHMsICJiYWQgLWsiLCBUVC50b3Auayk7CisgIGRsaXN0X3Rlcm1pbmF0ZShUVC5rZmllbGRzKTsKKyAgc2V0c29ydChUVC50b3Aucy0xKTsKK30KKwordm9pZCB0b3BfbWFpbih2b2lkKQoreworICAvLyB1c2FnZTogWy1oIEhFQURFUl0gLW8gT1VUUFVUIC1rIFNPUlQKKworICBzcHJpbnRmKHRveWJ1ZiwgIlBJRCxVU0VSLCVzJSVDUFUsJSVNRU0sVElNRSssQVJHUyIsCisgICAgVFQudG9wLk8gPyAiIiA6ICJQUixOSSxWSVJULFJFUyxTSFIsUywiKTsKKyAgaWYgKCFUVC50b3AucykgVFQudG9wLnMgPSBUVC50b3AuTyA/IDMgOiA5OworICB0b3Bfc2V0dXAodG95YnVmLCAiLSVDUFUsLUVUSU1FLC1QSUQiKTsKKyAgaWYgKFRULnRvcC5PKSB7CisgICAgc3RydWN0IHN0cmF3YmVycnkgKmZpZWxkcyA9IFRULmZpZWxkczsKKworICAgIGZpZWxkcyA9IGZpZWxkcy0+bmV4dC0+bmV4dDsKKyAgICBjb21tYV9hcmdzKFRULnRvcC5PLCAmZmllbGRzLCAiYmFkIC1PIiwgcGFyc2Vfa28pOworICB9CisKKyAgdG9wX2NvbW1vbihtZXJnZV9kZWx0YXMpOworfQorCisjZGVmaW5lIENMRUFOVVBfdG9wCisjZGVmaW5lIEZPUl9pb3RvcAorI2luY2x1ZGUgImdlbmVyYXRlZC9mbGFncy5oIgorCitzdGF0aWMgaW50IGlvdG9wX2ZpbHRlcihsb25nIGxvbmcgKm9zbG90LCBsb25nIGxvbmcgKm5zbG90LCBpbnQgbWlsaXMpCit7CisgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19hKSkgbWVyZ2VfZGVsdGFzKG9zbG90LCBuc2xvdCwgbWlsaXMpOworICBlbHNlIG9zbG90W1NMT1RfdXB0aWNrc10gPSAoKG1pbGxpdGltZSgpLVRULnRpbWUpKlRULnRpY2tzKS8xMDAwOworCisgIHJldHVybiAhKHRveXMub3B0ZmxhZ3MmRkxBR19vKXx8b3Nsb3RbU0xPVF9pb2J5dGVzKyEodG95cy5vcHRmbGFncyZGTEFHX0EpXTsKK30KKwordm9pZCBpb3RvcF9tYWluKHZvaWQpCit7CisgIGNoYXIgKnMxID0gMCwgKnMyID0gMCwgKmQgPSAiRCIrISEodG95cy5vcHRmbGFncyZGTEFHX0EpOworCisgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfSykgVFQuZm9yY2VrKys7CisKKyAgdG9wX3NldHVwKHMxID0geG1wcmludGYoIlBJRCxQUixVU0VSLCVzUkVBRCwlc1dSSVRFLFNXQVAsJXNJTyxDT01NIixkLGQsZCksCisgICAgczIgPSB4bXByaW50ZigiLSVzSU8sLUVUSU1FLC1QSUQiLGQpKTsKKyAgZnJlZShzMSk7CisgIGZyZWUoczIpOworICB0b3BfY29tbW9uKGlvdG9wX2ZpbHRlcik7Cit9CisKKy8vIHBraWxsJ3MgcGx1bWJpbmcgd3JhcHMgcGdyZXAncyBhbmQgdGh1cyBtb3N0bHkgdGFrZXMgcGxhY2UgaW4gcGdyZXAncyBmbGFnCisvLyBjb250ZXh0LCBzbyBmb3JjZSBwZ3JlcCdzIGZsYWdzIG9uIGV2ZW4gd2hlbiBidWlsZGluZyBwa2lsbCBzdGFuZGFsb25lLgorLy8gKEFsbCB0aGUgcGdyZXAvcGtpbGwgZnVuY3Rpb25zIGRyb3Agb3V0IHdoZW4gYnVpbGRpbmcgcHMgc3RhbmRhbG9uZS4pCisjZGVmaW5lIEZPUkNFX0ZMQUdTCisjZGVmaW5lIENMRUFOVVBfaW90b3AKKyNkZWZpbmUgRk9SX3BncmVwCisjaW5jbHVkZSAiZ2VuZXJhdGVkL2ZsYWdzLmgiCisKK3N0cnVjdCByZWdleF9saXN0IHsKKyAgc3RydWN0IHJlZ2V4X2xpc3QgKm5leHQ7CisgIHJlZ2V4X3QgcmVnOworfTsKKworc3RhdGljIHZvaWQgZG9fcGdrKHN0cnVjdCBjYXJ2ZXVwICp0YikKK3sKKyAgaWYgKFRULnBncmVwLnNpZ25hbCkgeworICAgIGlmIChraWxsKCp0Yi0+c2xvdCwgVFQucGdyZXAuc2lnbmFsKSkgeworICAgICAgY2hhciAqcyA9IG51bV90b19zaWcoVFQucGdyZXAuc2lnbmFsKTsKKworICAgICAgaWYgKCFzKSBzcHJpbnRmKHMgPSB0b3lidWYsICIlZCIsIFRULnBncmVwLnNpZ25hbCk7CisgICAgICBwZXJyb3JfbXNnKCIlcy0+JWxsZCIsIHMsICp0Yi0+c2xvdCk7CisgICAgfQorICB9CisgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19jKSAmJiAoIVRULnBncmVwLnNpZ25hbCB8fCBUVC50dHkpKSB7CisgICAgcHJpbnRmKCIlbGxkIiwgKnRiLT5zbG90KTsKKyAgICBpZiAodG95cy5vcHRmbGFncyZGTEFHX2wpCisgICAgICBwcmludGYoIiAlcyIsIHRiLT5zdHIrdGItPm9mZnNldFs0XSohISh0b3lzLm9wdGZsYWdzJkZMQUdfZikpOworICAgIAorICAgIHByaW50ZigiJXMiLCBUVC5wZ3JlcC5kID8gVFQucGdyZXAuZCA6ICJcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoX3BncmVwKHN0cnVjdCBjYXJ2ZXVwICp0YikKK3sKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgc3RydWN0IHJlZ2V4X2xpc3QgKnJlZzsKKyAgY2hhciAqbmFtZSA9IHRiLT5zdHIrdGItPm9mZnNldFs0XSohISh0b3lzLm9wdGZsYWdzJkZMQUdfZik7OworCisgIC8vIE5ldmVyIG1hdGNoIG91cnNlbHZlcy4KKyAgaWYgKFRULnBncmVwLnNlbGYgPT0gKnRiLT5zbG90KSByZXR1cm47CisKKyAgaWYgKFRULnBncmVwLnJlZ2V4ZXMpIHsKKyAgICBmb3IgKHJlZyA9IFRULnBncmVwLnJlZ2V4ZXM7IHJlZzsgcmVnID0gcmVnLT5uZXh0KSB7CisgICAgICBpZiAocmVnZXhlYygmcmVnLT5yZWcsIG5hbWUsIDEsICZtYXRjaCwgMCkpIGNvbnRpbnVlOworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR194KQorICAgICAgICBpZiAobWF0Y2gucm1fc28gfHwgbWF0Y2gucm1fZW8hPXN0cmxlbihuYW1lKSkgY29udGludWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCh0b3lzLm9wdGZsYWdzJkZMQUdfdikgPyAhIXJlZyA6ICFyZWcpIHJldHVybjsKKyAgfQorCisgIC8vIHBncmVwIHNob3VsZCByZXR1cm4gc3VjY2VzcyBpZiB0aGVyZSdzIGEgbWF0Y2guCisgIHRveXMuZXhpdHZhbCA9IDA7CisKKyAgLy8gUmVwdXJwb3NlIGEgZmllbGQgZm9yIC1jIGNvdW50LgorICBUVC5zb3J0cG9zKys7CisgIGlmICh0b3lzLm9wdGZsYWdzJihGTEFHX258RkxBR19vKSkgeworICAgIGxvbmcgbG9uZyBsbCA9IHRiLT5zbG90W1NMT1Rfc3RhcnR0aW1lXTsKKworICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfbykgbGwgKj0gLTE7CisgICAgaWYgKFRULnRpbWUgJiYgVFQudGltZT5sbCkgcmV0dXJuOworICAgIFRULnRpbWUgPSBsbDsKKyAgICBmcmVlKFRULnBncmVwLnNuYXBzaG90KTsKKyAgICBUVC5wZ3JlcC5zbmFwc2hvdCA9IHhtZW1kdXAodG95YnVmLCAobmFtZStzdHJsZW4obmFtZSkrMSktdG95YnVmKTsKKyAgfSBlbHNlIGRvX3Bnayh0Yik7Cit9CisKK3N0YXRpYyBpbnQgcGdyZXBfbWF0Y2hfcHJvY2Vzcyhsb25nIGxvbmcgKnNsb3QpCit7CisgIGludCBtYXRjaCA9IHNoYXJlZF9tYXRjaF9wcm9jZXNzKHNsb3QpOworCisgIHJldHVybiAodG95cy5vcHRmbGFncyZGTEFHX3YpID8gIW1hdGNoIDogbWF0Y2g7Cit9CisKK3ZvaWQgcGdyZXBfbWFpbih2b2lkKQoreworICBjaGFyICoqYXJnOworICBzdHJ1Y3QgcmVnZXhfbGlzdCAqcmVnOworCisgIFRULnBncmVwLnNlbGYgPSBnZXRwaWQoKTsKKworICAvLyBObyBzaWduYWwgbmFtZXMgc3RhcnQgd2l0aCAiTCIsIHNvIG5vIG5lZWQgZm9yICJMOiAiIHBhcnNpbmcuCisgIGlmIChUVC5wZ3JlcC5MICYmIDE+KFRULnBncmVwLnNpZ25hbCA9IHNpZ190b19udW0oVFQucGdyZXAuTCkpKQorICAgIGVycm9yX2V4aXQoImJhZCAtTCAnJXMnIiwgVFQucGdyZXAuTCk7CisKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC5HLCAmVFQuR0csICJiYWQgLUciLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC5nLCAmVFQuZ2csICJiYWQgLWciLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC5QLCAmVFQuUFAsICJiYWQgLVAiLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC5zLCAmVFQuc3MsICJiYWQgLXMiLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC50LCAmVFQudHQsICJiYWQgLXQiLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC5VLCAmVFQuVVUsICJiYWQgLVUiLCBwYXJzZV9yZXN0KTsKKyAgY29tbWFfYXJncyhUVC5wZ3JlcC51LCAmVFQudXUsICJiYWQgLXUiLCBwYXJzZV9yZXN0KTsKKworICBpZiAoKHRveXMub3B0ZmxhZ3MmKEZMQUdfeHxGTEFHX2YpKSB8fAorICAgICAgISh0b3lzLm9wdGZsYWdzJihGTEFHX0d8RkxBR19nfEZMQUdfUHxGTEFHX3N8RkxBR190fEZMQUdfVXxGTEFHX3UpKSkKKyAgICBpZiAoIXRveXMub3B0YykgaGVscF9leGl0KCJObyBQQVRURVJOIik7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19mKSBUVC5iaXRzIHw9IF9QU19DTURMSU5FOworICBmb3IgKGFyZyA9IHRveXMub3B0YXJnczsgKmFyZzsgYXJnKyspIHsKKyAgICByZWcgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnZXhfbGlzdCkpOworICAgIHhyZWdjb21wKCZyZWctPnJlZywgKmFyZywgUkVHX0VYVEVOREVEKTsKKyAgICByZWctPm5leHQgPSBUVC5wZ3JlcC5yZWdleGVzOworICAgIFRULnBncmVwLnJlZ2V4ZXMgPSByZWc7CisgIH0KKyAgVFQubWF0Y2hfcHJvY2VzcyA9IHBncmVwX21hdGNoX3Byb2Nlc3M7CisgIFRULnNob3dfcHJvY2VzcyA9ICh2b2lkICopbWF0Y2hfcGdyZXA7CisKKyAgLy8gcGdyZXAgc2hvdWxkIHJldHVybiBmYWlsdXJlIGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgorICB0b3lzLmV4aXR2YWwgPSAxOworCisgIGRpcnRyZWVfcmVhZCgiL3Byb2MiLCBnZXRfcHMpOworICBpZiAodG95cy5vcHRmbGFncyZGTEFHX2MpIHByaW50ZigiJWRcbiIsIFRULnNvcnRwb3MpOworICBpZiAoVFQucGdyZXAuc25hcHNob3QpIHsKKyAgICBkb19wZ2soVFQucGdyZXAuc25hcHNob3QpOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoVFQucGdyZXAuc25hcHNob3QpOworICB9CisgIGlmIChUVC5wZ3JlcC5kKSB4cHV0YygnXG4nKTsKK30KKworI2RlZmluZSBDTEVBTlVQX3BncmVwCisjZGVmaW5lIEZPUl9wa2lsbAorI2luY2x1ZGUgImdlbmVyYXRlZC9mbGFncy5oIgorCit2b2lkIHBraWxsX21haW4odm9pZCkKK3sKKyAgY2hhciAqKmFyZ3MgPSB0b3lzLm9wdGFyZ3M7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX2wpICYmICphcmdzICYmICoqYXJncz09Jy0nKSBUVC5wZ3JlcC5MID0gKihhcmdzKyspKzE7CisgIGlmICghVFQucGdyZXAuTCkgVFQucGdyZXAuc2lnbmFsID0gU0lHVEVSTTsKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1YpIFRULnR0eSA9IDE7CisgIHBncmVwX21haW4oKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3B3ZC5jIGIvdG95Ym94L3RveXMvcG9zaXgvcHdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3B3ZC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHB3ZC5jIC0gUHJpbnQgd29ya2luZyBkaXJlY3RvcnkuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9wd2QuaHRtbAorCitVU0VfUFdEKE5FV1RPWShwd2QsICI+MExQWy1MUF0iLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQV0QKKyAgYm9vbCAicHdkIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiBwd2QgWy1MfC1QXQorCisgICAgUHJpbnQgd29ya2luZyAoY3VycmVudCkgZGlyZWN0b3J5LgorCisgICAgLUwgIFVzZSBzaGVsbCdzIHBhdGggZnJvbSAkUFdEICh3aGVuIGFwcGxpY2FibGUpCisgICAgLVAgIFByaW50IGNhbm5vbmljYWwgYWJzb2x1dGUgcGF0aAorKi8KKworI2RlZmluZSBGT1JfcHdkCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHB3ZF9tYWluKHZvaWQpCit7CisgIGNoYXIgKnMsICpwd2QgPSBnZXRjd2QoMCwgMCksICpQV0Q7CisKKyAgLy8gT25seSB1c2UgJFBXRCBpZiBpdCdzIGFuIGFic29sdXRlIHBhdGggYWxpYXMgZm9yIGN3ZCB3aXRoIG5vICIuIiBvciAiLi4iCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1ApICYmIChzID0gUFdEID0gZ2V0ZW52KCJQV0QiKSkpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDEsIHN0MjsKKworICAgIHdoaWxlICgqcyA9PSAnLycpIHsKKyAgICAgIGlmICgqKCsrcykgPT0gJy4nKSB7CisgICAgICAgIGlmIChzWzFdID09ICcvJyB8fCAhc1sxXSkgYnJlYWs7CisgICAgICAgIGlmIChzWzFdID09ICcuJyAmJiAoc1syXSA9PSAnLycgfHwgIXNbMl0pKSBicmVhazsKKyAgICAgIH0KKyAgICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnLycpIHMrKzsKKyAgICB9CisgICAgaWYgKCEqcyAmJiBzICE9IFBXRCkgcyA9IFBXRDsKKyAgICBlbHNlIHMgPSBOVUxMOworCisgICAgLy8gSWYgY3VycmVudCBkaXJlY3RvcnkgZXhpc3RzLCBtYWtlIHN1cmUgaXQgbWF0Y2hlcy4KKyAgICBpZiAocyAmJiBwd2QpCisgICAgICAgIGlmIChzdGF0KHB3ZCwgJnN0MSkgfHwgc3RhdChQV0QsICZzdDIpIHx8IHN0MS5zdF9pbm8gIT0gc3QyLnN0X2lubyB8fAorICAgICAgICAgICAgc3QxLnN0X2RldiAhPSBzdDIuc3RfZGV2KSBzID0gTlVMTDsKKyAgfSBlbHNlIHMgPSBOVUxMOworCisgIC8vIElmIC1MIGRpZG4ndCBnaXZlIHVzIGEgdmFsaWQgcGF0aCwgdXNlIGN3ZC4KKyAgaWYgKCFzICYmICEocyA9IHB3ZCkpIHBlcnJvcl9leGl0KCJ4Z2V0Y3dkIik7CisKKyAgeHByaW50ZigiJXNcbiIsIHMpOworCisgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUocHdkKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3JlbmljZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvcmVuaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5ZWIxMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3JlbmljZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIHJlbmljZS5jIC0gcmVuaWNlIHByb2Nlc3MKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBDRSBTdHJha2UgPHN0cmFrZTg4OCBhdCBnbWFpbC5jb20+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9yZW5pY2UuaHRtbAorCitVU0VfUkVOSUNFKE5FV1RPWShyZW5pY2UsICI8MWdwdW4jfCIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFJFTklDRQorICBib29sICJyZW5pY2UiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHJlbmljZSBbLWdwdV0gLW4gaW5jcmVtZW50IElEIC4uLgorKi8KKworI2RlZmluZSBGT1JfcmVuaWNlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBsb25nIG5Bcmd1OworKQorCit2b2lkIHJlbmljZV9tYWluKHZvaWQpIHsKKyAgaW50IHdoaWNoID0gKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2cpID8gUFJJT19QR1JQIDoKKyAgICAgICAgICAgICAgKCh0b3lzLm9wdGZsYWdzICYgRkxBR191KSA/IFBSSU9fVVNFUiA6IFBSSU9fUFJPQ0VTUyk7CisgIGNoYXIgKiphcmc7CisKKyAgZm9yIChhcmcgPSB0b3lzLm9wdGFyZ3M7ICphcmc7IGFyZysrKSB7CisgICAgY2hhciAqcyA9ICphcmc7CisgICAgaW50IGlkID0gLTE7CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfdSkgeworICAgICAgc3RydWN0IHBhc3N3ZCAqcCA9IGdldHB3bmFtKHMpOworICAgICAgaWYgKHApIGlkID0gcC0+cHdfdWlkOworICAgIH0gZWxzZSB7CisgICAgICBpZCA9IHN0cnRvbChzLCAmcywgMTApOworICAgICAgaWYgKCpzKSBpZCA9IC0xOworICAgIH0KKworICAgIGlmIChpZCA8IDApIHsKKyAgICAgIGVycm9yX21zZygiYmFkICclcyciLCAqYXJnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzZXRwcmlvcml0eSh3aGljaCwgaWQsIGdldHByaW9yaXR5KHdoaWNoLCBpZCkrVFQubkFyZ3UpIDwgMCkKKyAgICAgIHBlcnJvcl9tc2coInNldHByaW9yaXR5ICVkIiwgaWQpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9ybS5jIGIvdG95Ym94L3RveXMvcG9zaXgvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZhOGVkCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvcm0uYwpAQCAtMCwwICsxLDEwNCBAQAorLyogcm0uYyAtIHJlbW92ZSBmaWxlcworICoKKyAqIENvcHlyaWdodCAyMDEyIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9ybS5odG1sCisKK1VTRV9STShORVdUT1kocm0sICJmaVJyWy1maV0iLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBSTQorICBib29sICJybSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogcm0gWy1maVJyXSBGSUxFLi4uCisKKyAgICBSZW1vdmUgZWFjaCBhcmd1bWVudCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCisgICAgLWYJZm9yY2U6IHJlbW92ZSB3aXRob3V0IGNvbmZpcm1hdGlvbiwgbm8gZXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdAorICAgIC1pCWludGVyYWN0aXZlOiBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbgorICAgIC1yUglyZWN1cnNpdmU6IHJlbW92ZSBkaXJlY3RvcnkgY29udGVudHMKKyovCisKKyNkZWZpbmUgRk9SX3JtCisjaW5jbHVkZSAidG95cy5oIgorCitzdGF0aWMgaW50IGRvX3JtKHN0cnVjdCBkaXJ0cmVlICp0cnkpCit7CisgIGludCBmZCA9IGRpcnRyZWVfcGFyZW50ZmQodHJ5KSwgZmxhZ3MgPSB0b3lzLm9wdGZsYWdzOworICBpbnQgZGlyID0gU19JU0RJUih0cnktPnN0LnN0X21vZGUpLCBvciA9IDAsIHVzaW5nID0gMDsKKworICAvLyBTa2lwIC4gYW5kIC4uICh5ZXMsIGV2ZW4gZXhwbGljaXRseSBvbiB0aGUgY29tbWFuZCBsaW5lOiBwb3NpeCBzYXlzIHRvKQorICBpZiAoIWRpcnRyZWVfbm90ZG90ZG90KHRyeSkpIHJldHVybiAwOworCisgIC8vIEludGVudGlvbmFsbHkgZmFpbCBub24tcmVjdXJzaXZlIGF0dGVtcHRzIHRvIHJlbW92ZSBldmVuIGFuIGVtcHR5IGRpcgorICAvLyAodmlhIHdyb25nIGZsYWdzIHRvIHVubGlua2F0KSBiZWNhdXNlIFBPU0lYIHNheXMgdG8uCisgIGlmIChkaXIgJiYgIShmbGFncyAmIChGTEFHX3J8RkxBR19SKSkpIGdvdG8gc2tpcDsKKworICAvLyBUaGlzIGlzIGVpdGhlciB0aGUgcG9zaXggc2VjdGlvbiAyKGIpIHByb21wdCBvciB0aGUgc2VjdGlvbiAzIHByb21wdC4KKyAgaWYgKCEoZmxhZ3MgJiBGTEFHX2YpCisgICAgJiYgKCFTX0lTTE5LKHRyeS0+c3Quc3RfbW9kZSkgJiYgZmFjY2Vzc2F0KGZkLCB0cnktPm5hbWUsIFdfT0ssIDApKSkgb3IrKzsKKyAgaWYgKCEoZGlyICYmIHRyeS0+YWdhaW4pICYmICgob3IgJiYgaXNhdHR5KDApKSB8fCAoZmxhZ3MgJiBGTEFHX2kpKSkgeworICAgIGNoYXIgKnMgPSBkaXJ0cmVlX3BhdGgodHJ5LCAwKTsKKworICAgIGZwcmludGYoc3RkZXJyLCAicm0gJXMlcyVzIiwgb3IgPyAicm8gIiA6ICIiLCBkaXIgPyAiZGlyICIgOiAiIiwgcyk7CisgICAgZnJlZShzKTsKKyAgICBvciA9IHllc25vKDApOworICAgIGlmICghb3IpIGdvdG8gbm9kZWxldGU7CisgIH0KKworICAvLyBoYW5kbGUgZGlyZWN0b3J5IHJlY3Vyc2lvbgorICBpZiAoZGlyKSB7CisgICAgdXNpbmcgPSBBVF9SRU1PVkVESVI7CisgICAgLy8gSGFuZGxlIGNobW9kIDAwMCBkaXJlY3RvcmllcyB3aGVuIC1mCisgICAgaWYgKGZhY2Nlc3NhdChmZCwgdHJ5LT5uYW1lLCBSX09LLCAwKSkgeworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpIHdmY2htb2RhdChmZCwgdHJ5LT5uYW1lLCAwNzAwKTsKKyAgICAgIGVsc2UgZ290byBza2lwOworICAgIH0KKyAgICBpZiAoIXRyeS0+YWdhaW4pIHJldHVybiBESVJUUkVFX0NPTUVBR0FJTjsKKyAgICBpZiAodHJ5LT5zeW1saW5rKSBnb3RvIHNraXA7CisgICAgaWYgKGZsYWdzICYgRkxBR19pKSB7CisgICAgICBjaGFyICpzID0gZGlydHJlZV9wYXRoKHRyeSwgMCk7CisKKyAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY3Rpb24gMihkKSBwcm9tcHQuIChZZXMsIHBvc2l4IHNheXMgdG8gcHJvbXB0IHR3aWNlLikKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicm1kaXIgJXMiLCBzKTsKKyAgICAgIGZyZWUocyk7CisgICAgICBvciA9IHllc25vKDApOworICAgICAgaWYgKCFvcikgZ290byBub2RlbGV0ZTsKKyAgICB9CisgIH0KKworc2tpcDoKKyAgaWYgKHVubGlua2F0KGZkLCB0cnktPm5hbWUsIHVzaW5nKSkgeworICAgIGlmICghZGlyIHx8IHRyeS0+c3ltbGluayAhPSAoY2hhciAqKTIpIHBlcnJvcl9tc2dfcmF3KHRyeS0+bmFtZSk7Citub2RlbGV0ZToKKyAgICBpZiAodHJ5LT5wYXJlbnQpIHRyeS0+cGFyZW50LT5zeW1saW5rID0gKGNoYXIgKikyOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcm1fbWFpbih2b2lkKQoreworICBjaGFyICoqczsKKworICAvLyBDYW4ndCB1c2UgPDEgaW4gb3B0c3RyaW5nIGJlY2F1c2UgemVybyBhcmd1bWVudHMgd2l0aCAtZiBpc24ndCBhbiBlcnJvcgorICBpZiAoIXRveXMub3B0YyAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpKSBlcnJvcl9leGl0KCJOZWVkcyAxIGFyZ3VtZW50Iik7CisKKyAgZm9yIChzID0gdG95cy5vcHRhcmdzOyAqczsgcysrKSB7CisgICAgaWYgKCFzdHJjbXAoKnMsICIvIikpIHsKKyAgICAgIGVycm9yX21zZygicm0gLy4gaWYgeW91IG1lYW4gaXQiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIEZpbGVzIHRoYXQgYWxyZWFkeSBkb24ndCBleGlzdCBhcmVuJ3QgZXJyb3JzIGZvciAtZiwgc28gdHJ5IGEgcXVpY2sKKyAgICAvLyB1bmxpbmsgbm93IHRvIHNlZSBpZiBpdCBzdWNjZWVkcyBvciByZXBvcnRzIHRoYXQgaXQgZGlkbid0IGV4aXN0LgorICAgIGlmICgodG95cy5vcHRmbGFncyAmIEZMQUdfZikgJiYgKCF1bmxpbmsoKnMpIHx8IGVycm5vID09IEVOT0VOVCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIFRoZXJlJ3MgYSByYWNlIGhlcmUgd2hlcmUgYSBmaWxlIHJlbW92ZWQgYmV0d2VlbiB0aGUgYWJvdmUgY2hlY2sgYW5kCisgICAgLy8gZGlydHJlZSdzIHN0YXQgd291bGQgcmVwb3J0IHRoZSBub25leGlzdGVuY2UgYXMgYW4gZXJyb3IsIGJ1dCB0aGF0J3MKKyAgICAvLyBub3QgYSBub3JtYWwgIml0IGRpZG4ndCBleGlzdCIgc28gSSdtIG9rIHdpdGggaXQuCisKKyAgICBkaXJ0cmVlX3JlYWQoKnMsIGRvX3JtKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvcm1kaXIuYyBiL3RveWJveC90b3lzL3Bvc2l4L3JtZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyMWJiMwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3JtZGlyLmMKQEAgLTAsMCArMSw0NyBAQAorLyogcm1kaXIuYyAtIHJlbW92ZSBkaXJlY3RvcnkvcGF0aAorICoKKyAqIENvcHlyaWdodCAyMDA4IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcm1kaXIuaHRtbAorCitVU0VfUk1ESVIoTkVXVE9ZKHJtZGlyLCAiPDFwIiwgVE9ZRkxBR19CSU4pKQorCitjb25maWcgUk1ESVIKKyAgYm9vbCAicm1kaXIiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHJtZGlyIFstcF0gW2Rpcm5hbWUuLi5dCisKKyAgICBSZW1vdmUgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMuCisKKyAgICAtcAlSZW1vdmUgcGF0aC4KKyovCisKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3N0YXRpYyB2b2lkIGRvX3JtZGlyKGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKnRlbXA7CisKKyAgZm9yICg7OykgeworICAgIGlmIChybWRpcihuYW1lKSkgeworICAgICAgcGVycm9yX21zZ19yYXcobmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRWFjaCAtcCBjeWNsZSBiYWNrIHVwIG9uZSBzbGFzaCwgaWdub3JpbmcgdHJhaWxpbmcgYW5kIHJlcGVhdGVkIC8uCisKKyAgICBpZiAoIXRveXMub3B0ZmxhZ3MpIHJldHVybjsKKyAgICBkbyB7CisgICAgICBpZiAoISh0ZW1wID0gc3RycmNocihuYW1lLCAnLycpKSkgcmV0dXJuOworICAgICAgKnRlbXAgPSAwOworICAgIH0gd2hpbGUgKCF0ZW1wWzFdKTsKKyAgfQorfQorCit2b2lkIHJtZGlyX21haW4odm9pZCkKK3sKKyAgY2hhciAqKnM7CisKKyAgZm9yIChzPXRveXMub3B0YXJnczsgKnM7IHMrKykgZG9fcm1kaXIoKnMpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvc2VkLmMgYi90b3lib3gvdG95cy9wb3NpeC9zZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk4ODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvc2VkLmMKQEAgLTAsMCArMSwxMDQzIEBACisvKiBzZWQuYyAtIHN0cmVhbSBlZGl0b3IuIFRoaW5nIHRoYXQgZG9lcyBzLy8vIGFuZCBvdGhlciBzdHVmZi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvc2VkLmh0bWwKKyAqCisgKiBUT0RPOiBsaW5lcyA+IDJHIGNvdWxkIHdyYXAgc2lnbmVkIGludCBsZW5ndGggY291bnRlcnMuIE5vdCBqdXN0IGdldGxpbmUoKQorICogYnV0IE4gYW5kIHMvLy8KKyAqIFRPRE86IG1ha2UgeS8vIGhhbmRsZSB1bmljb2RlCisgKiBUT0RPOiBoYW5kbGUgZXJyb3IgcmV0dXJuIGZyb20gZW1pdCgpLCBlcnJvcl9tc2cvZXhpdCBjb25zaXN0ZW50bHkKKyAqICAgICAgIFdoYXQncyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIC1pIHdoZW4gd3JpdGUgZmFpbHM/IFNraXAgdG8gbmV4dD8KKworVVNFX1NFRChORVdUT1koc2VkLCAiKHZlcnNpb24pZSpmKmluRXJbK0VyXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfTE9DQUxFKSkKKworY29uZmlnIFNFRAorICBib29sICJzZWQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHNlZCBbLWluckVdIFstZSBTQ1JJUFRdLi4ufFNDUklQVCBbLWYgU0NSSVBUX0ZJTEVdLi4uIFtGSUxFLi4uXQorCisgICAgU3RyZWFtIGVkaXRvci4gQXBwbHkgb25lIG9yIG1vcmUgZWRpdGluZyBTQ1JJUFRzIHRvIGVhY2ggbGluZSBvZiBpbnB1dAorICAgIChmcm9tIEZJTEUgb3Igc3RkaW4pIHByb2R1Y2luZyBvdXRwdXQgKGJ5IGRlZmF1bHQgdG8gc3Rkb3V0KS4KKworICAgIC1lCWFkZCBTQ1JJUFQgdG8gbGlzdAorICAgIC1mCWFkZCBjb250ZW50cyBvZiBTQ1JJUFRfRklMRSB0byBsaXN0CisgICAgLWkJRWRpdCBlYWNoIGZpbGUgaW4gcGxhY2UuCisgICAgLW4JTm8gZGVmYXVsdCBvdXRwdXQuIChVc2UgdGhlIHAgY29tbWFuZCB0byBvdXRwdXQgbWF0Y2hlZCBsaW5lcy4pCisgICAgLXIJVXNlIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXguCisgICAgLUUJQWxpYXMgZm9yIC1yLgorICAgIC1zCVRyZWF0IGlucHV0IGZpbGVzIHNlcGFyYXRlbHkgKGltcGxpZWQgYnkgLWkpCisKKyAgICBBIFNDUklQVCBpcyBhIHNlcmllcyBvZiBvbmUgb3IgbW9yZSBDT01NQU5EcyBzZXBhcmF0ZWQgYnkgbmV3bGluZXMgb3IKKyAgICBzZW1pY29sb25zLiBBbGwgLWUgU0NSSVBUcyBhcmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIGFzIGlmIHNlcGFyYXRlZAorICAgIGJ5IG5ld2xpbmVzLCBmb2xsb3dlZCBieSBhbGwgbGluZXMgZnJvbSAtZiBTQ1JJUFRfRklMRXMsIGluIG9yZGVyLgorICAgIElmIG5vIC1lIG9yIC1mIFNDUklQVHMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBTQ1JJUFQuCisKKyAgICBFYWNoIENPTU1BTkQgbWF5IGJlIHByZWNlZGVkIGJ5IGFuIGFkZHJlc3Mgd2hpY2ggbGltaXRzIHRoZSBjb21tYW5kIHRvCisgICAgYXBwbHkgb25seSB0byB0aGUgc3BlY2lmaWVkIGxpbmUocykuIENvbW1hbmRzIHdpdGhvdXQgYW4gYWRkcmVzcyBhcHBseSB0bworICAgIGV2ZXJ5IGxpbmUuIEFkZHJlc3NlcyBhcmUgb2YgdGhlIGZvcm06CisKKyAgICAgIFtBRERSRVNTWyxBRERSRVNTXV1DT01NQU5ECisKKyAgICBUaGUgQUREUkVTUyBtYXkgYmUgYSBkZWNpbWFsIGxpbmUgbnVtYmVyIChzdGFydGluZyBhdCAxKSwgYSAvcmVndWxhcgorICAgIGV4cHJlc3Npb24vIHdpdGhpbiBhIHBhaXIgb2YgZm9yd2FyZCBzbGFzaGVzLCBvciB0aGUgY2hhcmFjdGVyICIkIiB3aGljaAorICAgIG1hdGNoZXMgdGhlIGxhc3QgbGluZSBvZiBpbnB1dC4gKEluIC1zIG9yIC1pIG1vZGUgdGhpcyBtYXRjaGVzIHRoZSBsYXN0CisgICAgbGluZSBvZiBlYWNoIGZpbGUsIG90aGVyd2lzZSBqdXN0IHRoZSBsYXN0IGxpbmUgb2YgdGhlIGxhc3QgZmlsZS4pIEEgc2luZ2xlCisgICAgYWRkcmVzcyBtYXRjaGVzIG9uZSBsaW5lLCBhIHBhaXIgb2YgY29tbWEgc2VwYXJhdGVkIGFkZHJlc3NlcyBtYXRjaAorICAgIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyB0byB0aGUgc2Vjb25kIGFkZHJlc3MgKGluY2x1c2l2ZSkuIElmCisgICAgYm90aCBhZGRyZXNzZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIG1vcmUgdGhhbiBvbmUgcmFuZ2Ugb2YgbGluZXMgaW4KKyAgICBlYWNoIGZpbGUgY2FuIG1hdGNoLgorCisgICAgUkVHVUxBUiBFWFBSRVNTSU9OUyBpbiBzZWQgYXJlIHN0YXJ0ZWQgYW5kIGVuZGVkIGJ5IHRoZSBzYW1lIGNoYXJhY3RlcgorICAgICh0cmFkaXRpb25hbGx5IC8gYnV0IGFueXRoaW5nIGV4Y2VwdCBhIGJhY2tzbGFzaCBvciBhIG5ld2xpbmUgd29ya3MpLgorICAgIEJhY2tzbGFzaGVzIG1heSBiZSB1c2VkIHRvIGVzY2FwZSB0aGUgZGVsaW1pdGVyIGlmIGl0IG9jY3VycyBpbiB0aGUKKyAgICByZWdleCwgYW5kIGZvciB0aGUgdXN1YWwgcHJpbnRmIGVzY2FwZXMgKFxhYmNlZm5ydHYgYW5kIG9jdGFsLCBoZXgsCisgICAgYW5kIHVuaWNvZGUpLiBBbiBlbXB0eSByZWdleCByZXBlYXRzIHRoZSBwcmV2aW91cyBvbmUuIEFERFJFU1MgcmVnZXhlcworICAgIChhYm92ZSkgcmVxdWlyZSB0aGUgZmlyc3QgZGVsaW1ldGVyIHRvIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCB3aGVuCisgICAgaXQgaXNuJ3QgYSBmb3J3YXJkIHNsYXNoICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSBDT01NQU5EcyBiZWxvdykuCisKKyAgICBTZWQgbW9zdGx5IG9wZXJhdGVzIG9uIGluZGl2aWR1YWwgbGluZXMgb25lIGF0IGEgdGltZS4gSXQgcmVhZHMgZWFjaCBsaW5lLAorICAgIHByb2Nlc3NlcyBpdCwgYW5kIGVpdGhlciB3cml0ZXMgaXQgdG8gdGhlIG91dHB1dCBvciBkaXNjYXJkcyBpdCBiZWZvcmUKKyAgICByZWFkaW5nIHRoZSBuZXh0IGxpbmUuIFNlZCBjYW4gcmVtZW1iZXIgb25lIGFkZGl0aW9uYWwgbGluZSBpbiBhIHNlcGFyYXRlCisgICAgYnVmZmVyICh1c2luZyB0aGUgaCwgSCwgZywgRywgYW5kIHggY29tbWFuZHMpLCBhbmQgY2FuIHJlYWQgdGhlIG5leHQgbGluZQorICAgIG9mIGlucHV0IGVhcmx5ICh1c2luZyB0aGUgbiBhbmQgTiBjb21tYW5kKSwgYnV0IG90aGVyIHRoYW4gdGhhdCBjb21tYW5kCisgICAgc2NyaXB0cyBvcGVyYXRlIG9uIGluZGl2aWR1YWwgbGluZXMgb2YgdGV4dC4KKworICAgIEVhY2ggQ09NTUFORCBzdGFydHMgd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIuIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdGFrZQorICAgIG5vIGFyZ3VtZW50czoKKworICAgICAgeyAgU3RhcnQgYSBuZXcgY29tbWFuZCBibG9jaywgY29udGludWluZyB1bnRpbCBhIGNvcnJlc3BvbmRpbmcgIn0iLgorICAgICAgICAgQ29tbWFuZCBibG9ja3MgbWF5IG5lc3QuIElmIHRoZSBibG9jayBoYXMgYW4gYWRkcmVzcywgY29tbWFuZHMgd2l0aGluCisgICAgICAgICB0aGUgYmxvY2sgYXJlIG9ubHkgcnVuIGZvciBsaW5lcyB3aXRoaW4gdGhlIGJsb2NrJ3MgYWRkcmVzcyByYW5nZS4KKworICAgICAgfSAgRW5kIGNvbW1hbmQgYmxvY2sgKHRoaXMgY29tbWFuZCBjYW5ub3QgaGF2ZSBhbiBhZGRyZXNzKQorCisgICAgICBkICBEZWxldGUgdGhpcyBsaW5lIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZQorICAgICAgICAgKGlnbm9yZXMgcmVtYWluaW5nIENPTU1BTkRzKQorCisgICAgICBEICBEZWxldGUgb25lIGxpbmUgb2YgaW5wdXQgYW5kIHJlc3RhcnQgY29tbWFuZCBTQ1JJUFQgKHNhbWUgYXMgImQiCisgICAgICAgICB1bmxlc3MgeW91J3ZlIGdsdWVkIGxpbmVzIHRvZ2V0aGVyIHdpdGggIk4iIG9yIHNpbWlsYXIpCisKKyAgICAgIGcgIEdldCByZW1lbWJlcmVkIGxpbmUgKG92ZXJ3cml0aW5nIGN1cnJlbnQgbGluZSkKKworICAgICAgRyAgR2V0IHJlbWVtYmVyZWQgbGluZSAoYXBwZW5kaW5nIHRvIGN1cnJlbnQgbGluZSkKKworICAgICAgaCAgUmVtZW1iZXIgdGhpcyBsaW5lIChvdmVyd3JpdGluZyByZW1lbWJlcmVkIGxpbmUpCisKKyAgICAgIEggIFJlbWVtYmVyIHRoaXMgbGluZSAoYXBwZW5kaW5nIHRvIHJlbWVtYmVyZWQgbGluZSwgaWYgYW55KQorCisgICAgICBsICBQcmludCBsaW5lLCBlc2NhcGluZyBcYWJmcnR2IChidXQgbm90IG5ld2xpbmUpLCBvY3RhbCBlc2NhcGluZyBvdGhlcgorICAgICAgICAgbm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMsIHdyYXBwaW5nIGxpbmVzIHRvIHRlcm1pbmFsIHdpZHRoIHdpdGggYQorICAgICAgICAgYmFja3NsYXNoLCBhbmQgYXBwZW5kaW5nICQgdG8gYWN0dWFsIGVuZCBvZiBsaW5lLgorCisgICAgICBuICBQcmludCBkZWZhdWx0IG91dHB1dCBhbmQgcmVhZCBuZXh0IGxpbmUsIHJlcGxhY2luZyBjdXJyZW50IGxpbmUKKyAgICAgICAgIChJZiBubyBuZXh0IGxpbmUgYXZhaWxhYmxlLCBxdWl0IHByb2Nlc3Npbmcgc2NyaXB0KQorCisgICAgICBOICBBcHBlbmQgbmV4dCBsaW5lIG9mIGlucHV0IHRvIHRoaXMgbGluZSwgc2VwYXJhdGVkIGJ5IGEgbmV3bGluZQorICAgICAgICAgKFRoaXMgYWR2YW5jZXMgdGhlIGxpbmUgY291bnRlciBmb3IgYWRkcmVzcyBtYXRjaGluZyBhbmQgIj0iLCBpZiBubworICAgICAgICAgbmV4dCBsaW5lIGF2YWlsYWJsZSBxdWl0IHByb2Nlc3Npbmcgc2NyaXB0IHdpdGhvdXQgZGVmYXVsdCBvdXRwdXQpCisKKyAgICAgIHAgIFByaW50IHRoaXMgbGluZQorCisgICAgICBQICBQcmludCB0aGlzIGxpbmUgdXAgdG8gZmlyc3QgbmV3bGluZSAoZnJvbSAiTiIpCisKKyAgICAgIHEgIFF1aXQgKHByaW50IGRlZmF1bHQgb3V0cHV0LCBubyBtb3JlIGNvbW1hbmRzIHByb2Nlc3NlZCBvciBsaW5lcyByZWFkKQorCisgICAgICB4ICBFeGNoYW5nZSB0aGlzIGxpbmUgd2l0aCByZW1lbWJlcmVkIGxpbmUgKG92ZXJ3cml0ZSBpbiBib3RoIGRpcmVjdGlvbnMpCisKKyAgICAgID0gIFByaW50IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIChmb2xsb3dlZCBieSBhIG5ld2xpbmUpCisKKyAgICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIChtYXkpIHRha2UgYW4gYXJndW1lbnQuIFRoZSAidGV4dCIgYXJndW1lbnRzICh0bworICAgIHRoZSAiYSIsICJiIiwgYW5kICJjIiBjb21tYW5kcykgbWF5IGVuZCB3aXRoIGFuIHVuZXNjYXBlZCAiXCIgdG8gYXBwZW5kCisgICAgdGhlIG5leHQgbGluZSAoZm9yIHdoaWNoIGxlYWRpbmcgd2hpdGVzcGFjZSBpcyBub3Qgc2tpcHBlZCksIGFuZCBhbHNvCisgICAgdHJlYXQgIjsiIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKHVzZSAiXDsiIGluc3RlYWQpLgorCisgICAgICBhIFt0ZXh0XSAgIEFwcGVuZCB0ZXh0IHRvIG91dHB1dCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkIG5leHQgbGluZQorCisgICAgICBiIFtsYWJlbF0gIEJyYW5jaCwganVtcHMgdG8gOmxhYmVsIChvciB3aXRoIG5vIGxhYmVsLCB0byBlbmQgb2YgU0NSSVBUKQorCisgICAgICBjIFt0ZXh0XSAgIERlbGV0ZSBsaW5lLCBvdXRwdXQgdGV4dCBhdCBlbmQgb2YgbWF0Y2hpbmcgYWRkcmVzcyByYW5nZQorICAgICAgICAgICAgICAgICAoaWdub3JlcyByZW1haW5pbmcgQ09NTUFORHMpCisKKyAgICAgIGkgW3RleHRdICAgUHJpbnQgdGV4dAorCisgICAgICByIFtmaWxlXSAgIEFwcGVuZCBjb250ZW50cyBvZiBmaWxlIHRvIG91dHB1dCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkCisgICAgICAgICAgICAgICAgIG5leHQgbGluZS4KKworICAgICAgcy9TL1IvRiAgICBTZWFyY2ggZm9yIHJlZ2V4IFMsIHJlcGxhY2UgbWF0Y2hlZCB0ZXh0IHdpdGggUiB1c2luZyBmbGFncyBGLgorICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSAicyIgKGFueXRoaW5nIGJ1dCBuZXdsaW5lIG9yCisgICAgICAgICAgICAgICAgIGJhY2tzbGFzaCkgaXMgdGhlIGRlbGltaXRlciwgZXNjYXBlIHdpdGggXCB0byB1c2Ugbm9ybWFsbHkuCisKKyAgICAgICAgICAgICAgICAgVGhlIHJlcGxhY2VtZW50IHRleHQgbWF5IGNvbnRhaW4gIiYiIHRvIHN1YnN0aXR1dGUgdGhlIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgdGV4dCAoZXNjYXBlIGl0IHdpdGggYmFja3NsYXNoIGZvciBhIGxpdGVyYWwgJiksIG9yIFwxIHRocm91Z2gKKyAgICAgICAgICAgICAgICAgXDkgdG8gc3Vic3RpdHV0ZSBhIHBhcmVudGhldGljYWwgc3ViZXhwcmVzc2lvbiBpbiB0aGUgcmVnZXguCisgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyB1c2UgdGhlIG5vcm1hbCBiYWNrc2xhc2ggZXNjYXBlcyBzdWNoIGFzIFxuIGFuZAorICAgICAgICAgICAgICAgICBhIGJhY2tzbGFzaCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFwcGVuZHMgdGhlIG5leHQgbGluZS4KKworICAgICAgICAgICAgICAgICBUaGUgZmxhZ3MgYXJlOgorCisgICAgICAgICAgICAgICAgIFswLTldICAgIEEgbnVtYmVyLCBzdWJzdGl0dXRlIG9ubHkgdGhhdCBvY2N1cnJlbmNlIG9mIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgZyAgICAgICAgR2xvYmFsLCBzdWJzdGl0dXRlIGFsbCBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgIGkgICAgICAgIElnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgcCAgICAgICAgUHJpbnQgdGhlIGxpbmUgaWYgbWF0Y2ggd2FzIGZvdW5kIGFuZCByZXBsYWNlZAorICAgICAgICAgICAgICAgICB3IFtmaWxlXSBXcml0ZSAoYXBwZW5kKSBsaW5lIHRvIGZpbGUgaWYgbWF0Y2ggcmVwbGFjZWQKKworICAgICAgdCBbbGFiZWxdICBUZXN0LCBqdW1wIHRvIDpsYWJlbCBvbmx5IGlmIGFuICJzIiBjb21tYW5kIGZvdW5kIGEgbWF0Y2ggaW4KKyAgICAgICAgICAgICAgICAgdGhpcyBsaW5lIHNpbmNlIGxhc3QgdGVzdCAocmVwbGFjaW5nIHdpdGggc2FtZSB0ZXh0IGNvdW50cykKKworICAgICAgVCBbbGFiZWxdICBUZXN0IGZhbHNlLCBqdW1wIG9ubHkgaWYgInMiIGhhc24ndCBmb3VuZCBhIG1hdGNoLgorCisgICAgICB3IFtmaWxlXSAgIFdyaXRlIChhcHBlbmQpIGxpbmUgdG8gZmlsZQorCisgICAgICB5L29sZC9uZXcvIENoYW5nZSBlYWNoIGNoYXJhY3RlciBpbiAnb2xkJyB0byBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICBpbiAnbmV3JyAod2l0aCBzdGFuZGFyZCBiYWNrc2xhc2ggZXNjYXBlcywgZGVsaW1pdGVyIGNhbiBiZQorICAgICAgICAgICAgICAgICBhbnkgcmVwZWF0ZWQgY2hhcmFjdGVyIGV4Y2VwdCBcIG9yIFxuKQorCisgICAgICA6IFtsYWJlbF0gIExhYmVsZWQgdGFyZ2V0IGZvciBqdW1wIGNvbW1hbmRzCisKKyAgICAgICMgIENvbW1lbnQsIGlnbm9yZSByZXN0IG9mIHRoaXMgbGluZSBvZiBTQ1JJUFQKKworICAgIERldmlhdGlvbnMgZnJvbSBwb3NpeDogYWxsb3cgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyB3aXRoIC1yLAorICAgIGVkaXRpbmcgaW4gcGxhY2Ugd2l0aCAtaSwgc2VwYXJhdGUgd2l0aCAtcywgcHJpbnRmIGVzY2FwZXMgaW4gdGV4dCwgbGluZQorICAgIGNvbnRpbnVhdGlvbnMsIHNlbWljb2xvbnMgYWZ0ZXIgYWxsIGNvbW1hbmRzLCAyLWFkZHJlc3MgYW55d2hlcmUgYW4KKyAgICBhZGRyZXNzIGlzIGFsbG93ZWQsICJUIiBjb21tYW5kLCBtdWx0aWxpbmUgY29udGludWF0aW9ucyBmb3IgW2FiY10sCisgICAgXDsgdG8gZW5kIFthYmNdIGFyZ3VtZW50IGJlZm9yZSBlbmQgb2YgbGluZS4KKyovCisKKyNkZWZpbmUgRk9SX3NlZAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgc3RydWN0IGFyZ19saXN0ICpmOworICBzdHJ1Y3QgYXJnX2xpc3QgKmU7CisKKyAgLy8gcHJvY2Vzc2VkIHBhdHRlcm4gbGlzdAorICBzdHJ1Y3QgZG91YmxlX2xpc3QgKnBhdHRlcm47CisKKyAgY2hhciAqbmV4dGxpbmUsICpyZW1lbWJlcjsKKyAgdm9pZCAqcmVzdGFydCwgKmxhc3RyZWdleDsKKyAgbG9uZyBuZXh0bGVuLCByZW1lbWJlcmxlbiwgY291bnQ7CisgIGludCBmZG91dCwgbm9lb2w7CisgIHVuc2lnbmVkIHh4OworKQorCisvLyBMaW5rZWQgbGlzdCBvZiBwYXJzZWQgc2VkIGNvbW1hbmRzLiBPZmZzZXQgZmllbGRzIGluZGljYXRlIGxvY2F0aW9uIHdoZXJlCisvLyByZWdleCBvciBzdHJpbmcgc3RhcnRzLCBhbGEgb2Zmc2V0KyhjaGFyICopc3RydWN0LCBiZWNhdXNlIHdlIHJlbWFsbG9jKCkKKy8vIHRoZXNlIHRvIGV4cGFuZCB0aGVtIGZvciBtdWx0aWxpbmUgaW5wdXRzLCBhbmQgcG9pbnRlcnMgd291bGQgaGF2ZSB0byBiZQorLy8gaW5kaXZpZHVhbGx5IGFkanVzdGVkLgorCitzdHJ1Y3Qgc2VkY21kIHsKKyAgc3RydWN0IHNlZGNtZCAqbmV4dCwgKnByZXY7CisKKyAgLy8gQmVnaW4gYW5kIGVuZCBvZiBlYWNoIG1hdGNoCisgIGxvbmcgbG1hdGNoWzJdOyAvLyBsaW5lIG51bWJlciBvZiBtYXRjaAorICBpbnQgcm1hdGNoWzJdOyAgLy8gb2Zmc2V0IG9mIHJlZ2V4IHN0cnVjdCBmb3IgcHJlZml4IG1hdGNoZXMgKC9hYmMvLC9kZWYvcCkKKyAgaW50IGFyZzEsIGFyZzIsIHc7IC8vIG9mZnNldCBvZiB0d28gYXJndW1lbnRzIHBlciBjb21tYW5kLCBwbHVzIHMvL3cgZmlsZW5hbWUKKyAgdW5zaWduZWQgbm90LCBoaXQ7CisgIHVuc2lnbmVkIHNmbGFnczsgLy8gcy8vL2ZsYWcgYml0czogaT0xLCBnPTIsIHA9NAorICBjaGFyIGM7IC8vIGFjdGlvbgorfTsKKworLy8gV3JpdGUgb3V0IGxpbmUgd2l0aCBwb3RlbnRpYWwgZW1iZWRkZWQgTlVMLCBoYW5kbGluZyBlb2wvbm9lb2wKK3N0YXRpYyBpbnQgZW1pdChjaGFyICpsaW5lLCBsb25nIGxlbiwgaW50IGVvbCkKK3sKKyAgaW50IGwsIG9sZCA9IGxpbmVbbGVuXTsKKworICBpZiAoVFQubm9lb2wgJiYgIXdyaXRlYWxsKFRULmZkb3V0LCAiXG4iLCAxKSkgcmV0dXJuIDE7CisgIFRULm5vZW9sID0gIWVvbDsKKyAgaWYgKGVvbCkgbGluZVtsZW4rK10gPSAnXG4nOworICBpZiAoIWxlbikgcmV0dXJuIDA7CisgIGwgPSB3cml0ZWFsbChUVC5mZG91dCwgbGluZSwgbGVuKTsKKyAgaWYgKGVvbCkgbGluZVtsZW4tMV0gPSBvbGQ7CisgIGlmIChsICE9IGxlbikgeworICAgIHBlcnJvcl9tc2coInNob3J0IHdyaXRlIik7CisKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyBFeHRlbmQgYWxsb2NhdGlvbiB0byBpbmNsdWRlIG5ldyBzdHJpbmcsIHdpdGggbmV3bGluZSBiZXR3ZWVuIGlmIG5ld2xlbjwwCisKK3N0YXRpYyBjaGFyICpleHRlbmRfc3RyaW5nKGNoYXIgKipvbGQsIGNoYXIgKm5ldywgaW50IG9sZGxlbiwgaW50IG5ld2xlbikKK3sKKyAgaW50IG5ld2xpbmUgPSBuZXdsZW4gPCAwOworICBjaGFyICpzOworCisgIGlmIChuZXdsaW5lKSBuZXdsZW4gPSAtbmV3bGVuOworICBzID0gKm9sZCA9IHhyZWFsbG9jKCpvbGQsIG9sZGxlbituZXdsZW4rbmV3bGluZSsxKTsKKyAgaWYgKG5ld2xpbmUpIHNbb2xkbGVuKytdID0gJ1xuJzsKKyAgbWVtY3B5KHMrb2xkbGVuLCBuZXcsIG5ld2xlbik7CisgIHNbb2xkbGVuK25ld2xlbl0gPSAwOworCisgIHJldHVybiBzK29sZGxlbituZXdsZW4rMTsKK30KKworLy8gQW4gZW1wdHkgcmVnZXggcmVwZWF0cyB0aGUgcHJldmlvdXMgb25lCitzdGF0aWMgdm9pZCAqZ2V0X3JlZ2V4KHZvaWQgKnRydW1wLCBpbnQgb2Zmc2V0KQoreworICBpZiAoIW9mZnNldCkgeworICAgIGlmICghVFQubGFzdHJlZ2V4KSBlcnJvcl9leGl0KCJubyBwcmV2aW91cyByZWdleCIpOworICAgIHJldHVybiBUVC5sYXN0cmVnZXg7CisgIH0KKworICByZXR1cm4gVFQubGFzdHJlZ2V4ID0gb2Zmc2V0KyhjaGFyICopdHJ1bXA7Cit9CisKKy8vIEFwcGx5IHBhdHRlcm4gdG8gbGluZSBmcm9tIGlucHV0IGZpbGUKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbGluZShjaGFyICoqcGxpbmUsIGxvbmcgcGxlbikKK3sKKyAgc3RydWN0IGFwcGVuZCB7CisgICAgc3RydWN0IGFwcGVuZCAqbmV4dCwgKnByZXY7CisgICAgaW50IGZpbGU7CisgICAgY2hhciAqc3RyOworICB9ICphcHBlbmQgPSAwOworICBjaGFyICpsaW5lID0gVFQubmV4dGxpbmU7CisgIGxvbmcgbGVuID0gVFQubmV4dGxlbjsKKyAgc3RydWN0IHNlZGNtZCAqY29tbWFuZDsKKyAgaW50IGVvbCA9IDAsIHRlYSA9IDA7CisKKyAgLy8gR3JhYiBuZXh0IGxpbmUgZm9yIGRlZmVycmVkIHByb2Nlc3NpbmcgKEVPRiBkZXRlY3Rpb246IHdlIGdldCBhIE5VTEwKKyAgLy8gcGxpbmUgYXQgRU9GIHRvIGZsdXNoIGxhc3QgbGluZSkuIE5vdGUgdGhhdCBvbmx5IGVuZCBvZiBfbGFzdF8gaW5wdXQKKyAgLy8gZmlsZSBtYXRjaGVzICQgKHVubGVzcyB3ZSdyZSBkb2luZyAtaSkuCisgIFRULm5leHRsaW5lID0gMDsKKyAgVFQubmV4dGxlbiA9IDA7CisgIGlmIChwbGluZSkgeworICAgIFRULm5leHRsaW5lID0gKnBsaW5lOworICAgIFRULm5leHRsZW4gPSBwbGVuOworICAgICpwbGluZSA9IDA7CisgIH0KKworICBpZiAoIWxpbmUgfHwgIWxlbikgcmV0dXJuOworICBpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykgbGluZVstLWxlbl0gPSBlb2wrKzsKKyAgVFQuY291bnQrKzsKKworICAvLyBUaGUgcmVzdGFydC0xIGlzIGJlY2F1c2Ugd2UgYWRkZWQgb25lIHRvIG1ha2Ugc3VyZSBpdCB3YXNuJ3QgTlVMTCwKKyAgLy8gb3RoZXJ3aXNlIE4gYXMgbGFzdCBjb21tYW5kIHdvdWxkIHJlc3RhcnQgc2NyaXB0CisgIGNvbW1hbmQgPSBUVC5yZXN0YXJ0ID8gKChzdHJ1Y3Qgc2VkY21kICopVFQucmVzdGFydCktMSA6ICh2b2lkICopVFQucGF0dGVybjsKKyAgVFQucmVzdGFydCA9IDA7CisKKyAgd2hpbGUgKGNvbW1hbmQpIHsKKyAgICBjaGFyICpzdHIsIGMgPSBjb21tYW5kLT5jOworCisgICAgLy8gSGF2ZSB3ZSBnb3QgYSBsaW5lIG9yIHJlZ2V4IG1hdGNoaW5nIHJhbmdlIGZvciB0aGlzIHJ1bGU/CisgICAgaWYgKCpjb21tYW5kLT5sbWF0Y2ggfHwgKmNvbW1hbmQtPnJtYXRjaCkgeworICAgICAgaW50IG1pc3MgPSAwOworICAgICAgbG9uZyBsbTsKKworICAgICAgLy8gSW4gYSBtYXRjaCB0aGF0IG1pZ2h0IGVuZD8KKyAgICAgIGlmIChjb21tYW5kLT5oaXQpIHsKKyAgICAgICAgaWYgKCEobG0gPSBjb21tYW5kLT5sbWF0Y2hbMV0pKSB7CisgICAgICAgICAgaWYgKCFjb21tYW5kLT5ybWF0Y2hbMV0pIGNvbW1hbmQtPmhpdCA9IDA7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2b2lkICpybSA9IGdldF9yZWdleChjb21tYW5kLCBjb21tYW5kLT5ybWF0Y2hbMV0pOworCisgICAgICAgICAgICAvLyByZWdleCBtYXRjaCBlbmQgaW5jbHVkZXMgbWF0Y2hpbmcgbGluZSwgc28gZGVmZXIgZGVhY3RpdmF0aW9uCisgICAgICAgICAgICBpZiAobGluZSAmJiAhcmVnZXhlYzAocm0sIGxpbmUsIGxlbiwgMCwgMCwgMCkpIG1pc3MgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsbSA+IDAgJiYgbG0gPCBUVC5jb3VudCkgY29tbWFuZC0+aGl0ID0gMDsKKworICAgICAgLy8gU3RhcnQgYSBuZXcgbWF0Y2g/CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShsbSA9ICpjb21tYW5kLT5sbWF0Y2gpKSB7CisgICAgICAgICAgdm9pZCAqcm0gPSBnZXRfcmVnZXgoY29tbWFuZCwgKmNvbW1hbmQtPnJtYXRjaCk7CisKKyAgICAgICAgICBpZiAobGluZSAmJiAhcmVnZXhlYzAocm0sIGxpbmUsIGxlbiwgMCwgMCwgMCkpIGNvbW1hbmQtPmhpdCsrOworICAgICAgICB9IGVsc2UgaWYgKGxtID09IFRULmNvdW50IHx8IChsbSA9PSAtMSAmJiAhcGxpbmUpKSBjb21tYW5kLT5oaXQrKzsKKworICAgICAgICBpZiAoIWNvbW1hbmQtPmxtYXRjaFsxXSAmJiAhY29tbWFuZC0+cm1hdGNoWzFdKSBtaXNzID0gMTsKKyAgICAgIH0gCisKKyAgICAgIC8vIERpZG4ndCBtYXRjaD8KKyAgICAgIGxtID0gIShjb21tYW5kLT5oaXQgXiBjb21tYW5kLT5ub3QpOworCisgICAgICAvLyBEZWZlcnJlZCBkaXNhYmxlIGZyb20gcmVnZXggZW5kIG1hdGNoCisgICAgICBpZiAobWlzcyB8fCBjb21tYW5kLT5sbWF0Y2hbMV0gPT0gVFQuY291bnQpIGNvbW1hbmQtPmhpdCA9IDA7CisKKyAgICAgIGlmIChsbSkgeworICAgICAgICAvLyBIYW5kbGUgc2tpcHBpbmcgY3VybHkgYnJhY2tldCBjb21tYW5kIGdyb3VwCisgICAgICAgIGlmIChjID09ICd7JykgeworICAgICAgICAgIGludCBjdXJseSA9IDE7CisKKyAgICAgICAgICB3aGlsZSAoY3VybHkpIHsKKyAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLT5uZXh0OworICAgICAgICAgICAgaWYgKGNvbW1hbmQtPmMgPT0gJ3snKSBjdXJseSsrOworICAgICAgICAgICAgaWYgKGNvbW1hbmQtPmMgPT0gJ30nKSBjdXJseS0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb21tYW5kID0gY29tbWFuZC0+bmV4dDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQSBkZWxldGVkIGxpbmUgY2FuIHN0aWxsIHVwZGF0ZSBsaW5lIG1hdGNoIHN0YXRlIGZvciBsYXRlciBjb21tYW5kcworICAgIGlmICghbGluZSkgeworICAgICAgY29tbWFuZCA9IGNvbW1hbmQtPm5leHQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGNvbW1hbmQKKworICAgIGlmIChjPT0nYScgfHwgYz09J3InKSB7CisgICAgICBzdHJ1Y3QgYXBwZW5kICphID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGFwcGVuZCkpOworICAgICAgaWYgKGNvbW1hbmQtPmFyZzEpIGEtPnN0ciA9IGNvbW1hbmQtPmFyZzErKGNoYXIgKiljb21tYW5kOworICAgICAgYS0+ZmlsZSA9IGM9PSdyJzsKKyAgICAgIGRsaXN0X2FkZF9ub21hbGxvYygodm9pZCAqKSZhcHBlbmQsICh2b2lkICopYSk7CisgICAgfSBlbHNlIGlmIChjPT0nYicgfHwgYz09J3QnIHx8IGM9PSdUJykgeworICAgICAgaW50IHQgPSB0ZWE7CisKKyAgICAgIGlmIChjICE9ICdiJykgdGVhID0gMDsKKyAgICAgIGlmIChjPT0nYicgfHwgdF4oYz09J1QnKSkgeworICAgICAgICBpZiAoIWNvbW1hbmQtPmFyZzEpIGJyZWFrOworICAgICAgICBzdHIgPSBjb21tYW5kLT5hcmcxKyhjaGFyICopY29tbWFuZDsKKyAgICAgICAgZm9yIChjb21tYW5kID0gKHZvaWQgKilUVC5wYXR0ZXJuOyBjb21tYW5kOyBjb21tYW5kID0gY29tbWFuZC0+bmV4dCkKKyAgICAgICAgICBpZiAoY29tbWFuZC0+YyA9PSAnOicgJiYgIXN0cmNtcChjb21tYW5kLT5hcmcxKyhjaGFyICopY29tbWFuZCwgc3RyKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIWNvbW1hbmQpIGVycm9yX2V4aXQoIm5vIDolcyIsIHN0cik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjPT0nYycpIHsKKyAgICAgIHN0ciA9IGNvbW1hbmQtPmFyZzErKGNoYXIgKiljb21tYW5kOworICAgICAgaWYgKCFjb21tYW5kLT5oaXQpIGVtaXQoc3RyLCBzdHJsZW4oc3RyKSwgMSk7CisgICAgICBmcmVlKGxpbmUpOworICAgICAgbGluZSA9IDA7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGM9PSdkJykgeworICAgICAgZnJlZShsaW5lKTsKKyAgICAgIGxpbmUgPSAwOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChjPT0nRCcpIHsKKyAgICAgIC8vIERlbGV0ZSB1cCB0byBcbiBvciBlbmQgb2YgYnVmZmVyCisgICAgICBzdHIgPSBsaW5lOworICAgICAgd2hpbGUgKChzdHItbGluZSk8bGVuKSBpZiAoKihzdHIrKykgPT0gJ1xuJykgYnJlYWs7CisgICAgICBsZW4gLT0gc3RyIC0gbGluZTsKKyAgICAgIG1lbW1vdmUobGluZSwgc3RyLCBsZW4pOworCisgICAgICAvLyBpZiAiZGVsZXRlIiBibGFua3MgbGluZSwgZGlzYWJsZSBmdXJ0aGVyIHByb2Nlc3NpbmcKKyAgICAgIC8vIG90aGVyd2lzZSB0cmltIGFuZCByZXN0YXJ0IHNjcmlwdAorICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgZnJlZShsaW5lKTsKKyAgICAgICAgbGluZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBsaW5lW2xlbl0gPSAwOworICAgICAgICBjb21tYW5kID0gKHZvaWQgKilUVC5wYXR0ZXJuOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChjPT0nZycpIHsKKyAgICAgIGZyZWUobGluZSk7CisgICAgICBsaW5lID0geHN0cmR1cChUVC5yZW1lbWJlcik7CisgICAgICBsZW4gPSBUVC5yZW1lbWJlcmxlbjsKKyAgICB9IGVsc2UgaWYgKGM9PSdHJykgeworICAgICAgbGluZSA9IHhyZWFsbG9jKGxpbmUsIGxlbitUVC5yZW1lbWJlcmxlbisyKTsKKyAgICAgIGxpbmVbbGVuKytdID0gJ1xuJzsKKyAgICAgIG1lbWNweShsaW5lK2xlbiwgVFQucmVtZW1iZXIsIFRULnJlbWVtYmVybGVuKTsKKyAgICAgIGxpbmVbbGVuICs9IFRULnJlbWVtYmVybGVuXSA9IDA7CisgICAgfSBlbHNlIGlmIChjPT0naCcpIHsKKyAgICAgIGZyZWUoVFQucmVtZW1iZXIpOworICAgICAgVFQucmVtZW1iZXIgPSB4c3RyZHVwKGxpbmUpOworICAgICAgVFQucmVtZW1iZXJsZW4gPSBsZW47CisgICAgfSBlbHNlIGlmIChjPT0nSCcpIHsKKyAgICAgIFRULnJlbWVtYmVyID0geHJlYWxsb2MoVFQucmVtZW1iZXIsIFRULnJlbWVtYmVybGVuK2xlbisyKTsKKyAgICAgIFRULnJlbWVtYmVyW1RULnJlbWVtYmVybGVuKytdID0gJ1xuJzsKKyAgICAgIG1lbWNweShUVC5yZW1lbWJlcitUVC5yZW1lbWJlcmxlbiwgbGluZSwgbGVuKTsKKyAgICAgIFRULnJlbWVtYmVyW1RULnJlbWVtYmVybGVuICs9IGxlbl0gPSAwOworICAgIH0gZWxzZSBpZiAoYz09J2knKSB7CisgICAgICBzdHIgPSBjb21tYW5kLT5hcmcxKyhjaGFyICopY29tbWFuZDsKKyAgICAgIGVtaXQoc3RyLCBzdHJsZW4oc3RyKSwgMSk7CisgICAgfSBlbHNlIGlmIChjPT0nbCcpIHsKKyAgICAgIGludCBpLCB4LCBvZmY7CisKKyAgICAgIGlmICghVFQueHgpIHsKKyAgICAgICAgdGVybWluYWxfc2l6ZSgmVFQueHgsIDApOworICAgICAgICBpZiAoIVRULnh4KSBUVC54eCA9IDgwOworICAgICAgICBpZiAoVFQueHggPiBzaXplb2YodG95YnVmKS0xMCkgVFQueHggPSBzaXplb2YodG95YnVmKS0xMDsKKyAgICAgICAgaWYgKFRULnh4ID4gNCkgVFQueHggLT0gNDsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gb2ZmID0gMDsgaTxsZW47IGkrKykgeworICAgICAgICBpZiAob2ZmID49IFRULnh4KSB7CisgICAgICAgICAgdG95YnVmW29mZisrXSA9ICdcXCc7CisgICAgICAgICAgZW1pdCh0b3lidWYsIG9mZiwgMSk7CisgICAgICAgICAgb2ZmID0gMDsKKyAgICAgICAgfQorICAgICAgICB4ID0gc3RyaWR4KCJcXFxhXGJcZlxyXHRcdiIsIGxpbmVbaV0pOworICAgICAgICBpZiAoeCAhPSAtMSkgeworICAgICAgICAgIHRveWJ1ZltvZmYrK10gPSAnXFwnOworICAgICAgICAgIHRveWJ1ZltvZmYrK10gPSAiXFxhYmZydHYiW3hdOworICAgICAgICB9IGVsc2UgaWYgKGxpbmVbaV0gPj0gJyAnKSB0b3lidWZbb2ZmKytdID0gbGluZVtpXTsKKyAgICAgICAgZWxzZSBvZmYgKz0gc3ByaW50Zih0b3lidWYrb2ZmLCAiXFwlMDNvIiwgbGluZVtpXSk7CisgICAgICB9CisgICAgICB0b3lidWZbb2ZmKytdID0gJyQnOworICAgICAgZW1pdCh0b3lidWYsIG9mZiwgMSk7CisgICAgfSBlbHNlIGlmIChjPT0nbicpIHsKKyAgICAgIFRULnJlc3RhcnQgPSBjb21tYW5kLT5uZXh0KzE7CisKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYz09J04nKSB7CisgICAgICAvLyBDYW4ndCBqdXN0IGdyYWIgbmV4dCBsaW5lIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSBtdWx0aXBsZSBOIGFuZAorICAgICAgLy8gd2UgbmVlZCB0byBhY3R1YWxseSByZWFkIGFoZWFkIHRvIGdldCBOOyRwIEVPRiBkZXRlY3Rpb24gcmlnaHQuCisgICAgICBpZiAocGxpbmUpIHsKKyAgICAgICAgVFQucmVzdGFydCA9IGNvbW1hbmQtPm5leHQrMTsKKyAgICAgICAgZXh0ZW5kX3N0cmluZygmbGluZSwgVFQubmV4dGxpbmUsIGxlbiwgLVRULm5leHRsZW4pOworICAgICAgICBmcmVlKFRULm5leHRsaW5lKTsKKyAgICAgICAgVFQubmV4dGxpbmUgPSBsaW5lOworICAgICAgICBUVC5uZXh0bGVuICs9IGxlbiArIDE7CisgICAgICAgIGxpbmUgPSAwOworICAgICAgfQorCisgICAgICAvLyBQZW5kaW5nIGFwcGVuZCBnb2VzIG91dCByaWdodCBhZnRlciBOCisgICAgICBnb3RvIGRvbmU7IAorICAgIH0gZWxzZSBpZiAoYz09J3AnIHx8IGM9PSdQJykgeworICAgICAgY2hhciAqbCA9IChjPT0nUCcpID8gc3RyY2hyKGxpbmUsICdcbicpIDogMDsKKworICAgICAgaWYgKGVtaXQobGluZSwgbCA/IGwtbGluZSA6IGxlbiwgZW9sKSkgYnJlYWs7CisgICAgfSBlbHNlIGlmIChjPT0ncScpIHsKKyAgICAgIGlmIChwbGluZSkgKnBsaW5lID0gKHZvaWQgKikxOworICAgICAgZnJlZShUVC5uZXh0bGluZSk7CisgICAgICBUVC5uZXh0bGluZSA9IDA7CisgICAgICBUVC5uZXh0bGVuID0gMDsKKworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChjPT0ncycpIHsKKyAgICAgIGNoYXIgKnJsaW5lID0gbGluZSwgKm5ldyA9IGNvbW1hbmQtPmFyZzIgKyAoY2hhciAqKWNvbW1hbmQsICpzd2FwLCAqcnN3YXA7CisgICAgICByZWdtYXRjaF90ICptYXRjaCA9ICh2b2lkICopdG95YnVmOworICAgICAgcmVnZXhfdCAqcmVnID0gZ2V0X3JlZ2V4KGNvbW1hbmQsIGNvbW1hbmQtPmFyZzEpOworICAgICAgaW50IG1mbGFncyA9IDAsIGNvdW50ID0gMCwgem1hdGNoID0gMSwgcmxlbiA9IGxlbiwgbWxlbiwgb2ZmLCBuZXdsZW47CisKKyAgICAgIC8vIEZpbmQgbWF0Y2ggaW4gcmVtYWluaW5nIGxpbmUgKHVwIHRvIHJlbWFpbmluZyBsZW4pCisgICAgICB3aGlsZSAoIXJlZ2V4ZWMwKHJlZywgcmxpbmUsIHJsZW4sIDEwLCBtYXRjaCwgbWZsYWdzKSkgeworICAgICAgICBtZmxhZ3MgPSBSRUdfTk9UQk9MOworCisgICAgICAgIC8vIFplcm8gbGVuZ3RoIG1hdGNoZXMgZG9uJ3QgY291bnQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBwcmV2aW91cyBtYXRjaAorICAgICAgICBtbGVuID0gbWF0Y2hbMF0ucm1fZW8tbWF0Y2hbMF0ucm1fc287CisgICAgICAgIGlmICghbWxlbiAmJiAhem1hdGNoKSB7CisgICAgICAgICAgaWYgKCFybGVuLS0pIGJyZWFrOworICAgICAgICAgIHJsaW5lKys7CisgICAgICAgICAgem1hdGNoKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB6bWF0Y2ggPSAwOworCisgICAgICAgIC8vIElmIHdlJ3JlIHJlcGxhY2luZyBvbmx5IGEgc3BlY2lmaWMgbWF0Y2gsIHNraXAgaWYgdGhpcyBpc24ndCBpdAorICAgICAgICBvZmYgPSBjb21tYW5kLT5zZmxhZ3M+PjM7CisgICAgICAgIGlmIChvZmYgJiYgb2ZmICE9ICsrY291bnQpIHsKKyAgICAgICAgICBybGluZSArPSBtYXRjaFswXS5ybV9lbzsKKyAgICAgICAgICBybGVuIC09IG1hdGNoWzBdLnJtX2VvOworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGZhY3QgZ2V0bGluZSgpIGNhbiBhbGxvY2F0ZSB1bmJvdW5kZWQgYW1vdW50cyBvZiBtZW1vcnkgaXMKKyAgICAgICAgLy8gYSBiaWdnZXIgaXNzdWUsIGJ1dCB3aGlsZSB3ZSdyZSBoZXJlIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmIChtYXRjaFswXS5ybV9lbyA+IElOVF9NQVgpIHBlcnJvcl9leGl0KDApOworCisgICAgICAgIC8vIG5ld2xlbiA9IHN0cmxlbihuZXcpIGJ1dCB3aXRoIFwxIGFuZCAmIGFuZCBwcmludGYgZXNjYXBlcworICAgICAgICBmb3IgKG9mZiA9IG5ld2xlbiA9IDA7IG5ld1tvZmZdOyBvZmYrKykgeworICAgICAgICAgIGludCBjYyA9IC0xOworCisgICAgICAgICAgaWYgKG5ld1tvZmZdID09ICcmJykgY2MgPSAwOworICAgICAgICAgIGVsc2UgaWYgKG5ld1tvZmZdID09ICdcXCcpIGNjID0gbmV3Wysrb2ZmXSAtICcwJzsKKyAgICAgICAgICBpZiAoY2MgPCAwIHx8IGNjID4gOSkgeworICAgICAgICAgICAgbmV3bGVuKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV3bGVuICs9IG1hdGNoW2NjXS5ybV9lby1tYXRjaFtjY10ucm1fc287CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvY2F0ZSBuZXcgc2l6ZSwgY29weSBzdGFydC9lbmQgYXJvdW5kIG1hdGNoLiAoQ2FuJ3QgZXh0ZW5kIGluCisgICAgICAgIC8vIHBsYWNlIGJlY2F1c2UgYmFja3JlZnMgbWF5IHJlZmVyIHRvIHRleHQgYWZ0ZXIgaXQncyBvdmVyd3JpdHRlbi4pCisgICAgICAgIGxlbiArPSBuZXdsZW4tbWxlbjsKKyAgICAgICAgc3dhcCA9IHhtYWxsb2MobGVuKzEpOworICAgICAgICByc3dhcCA9IHN3YXArKHJsaW5lLWxpbmUpK21hdGNoWzBdLnJtX3NvOworICAgICAgICBtZW1jcHkoc3dhcCwgbGluZSwgKHJsaW5lLWxpbmUpK21hdGNoWzBdLnJtX3NvKTsKKyAgICAgICAgbWVtY3B5KHJzd2FwK25ld2xlbiwgcmxpbmUrbWF0Y2hbMF0ucm1fZW8sIChybGVuIC09IG1hdGNoWzBdLnJtX2VvKSsxKTsKKworICAgICAgICAvLyBjb3B5IGluIG5ldyByZXBsYWNlbWVudCB0ZXh0CisgICAgICAgIGZvciAob2ZmID0gbWxlbiA9IDA7IG5ld1tvZmZdOyBvZmYrKykgeworICAgICAgICAgIGludCBjYyA9IDAsIGxsOworCisgICAgICAgICAgaWYgKG5ld1tvZmZdID09ICdcXCcpIHsKKyAgICAgICAgICAgIGNjID0gbmV3Wysrb2ZmXSAtICcwJzsKKyAgICAgICAgICAgIGlmIChjYzwwIHx8IGNjPjkpIHsKKyAgICAgICAgICAgICAgaWYgKCEocnN3YXBbbWxlbisrXSA9IHVuZXNjYXBlKG5ld1tvZmZdKSkpCisgICAgICAgICAgICAgICAgcnN3YXBbbWxlbi0xXSA9IG5ld1tvZmZdOworCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtjY10ucm1fc28gPT0gLTEpIGVycm9yX2V4aXQoIm5vIHMvL1xcJWQvIiwgY2MpOworICAgICAgICAgIH0gZWxzZSBpZiAobmV3W29mZl0gIT0gJyYnKSB7CisgICAgICAgICAgICByc3dhcFttbGVuKytdID0gbmV3W29mZl07CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGxsID0gbWF0Y2hbY2NdLnJtX2VvLW1hdGNoW2NjXS5ybV9zbzsKKyAgICAgICAgICBtZW1jcHkocnN3YXArbWxlbiwgcmxpbmUrbWF0Y2hbY2NdLnJtX3NvLCBsbCk7CisgICAgICAgICAgbWxlbiArPSBsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJsaW5lID0gcnN3YXArbmV3bGVuOworICAgICAgICBmcmVlKGxpbmUpOworICAgICAgICBsaW5lID0gc3dhcDsKKworICAgICAgICAvLyBTdG9wIGFmdGVyIGZpcnN0IHN1YnN0aXR1dGlvbiB1bmxlc3Mgd2UgaGF2ZSBmbGFnIGcKKyAgICAgICAgaWYgKCEoY29tbWFuZC0+c2ZsYWdzICYgMikpIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAobWZsYWdzKSB7CisgICAgICAgIC8vIGZsYWcgcAorICAgICAgICBpZiAoY29tbWFuZC0+c2ZsYWdzICYgNCkgZW1pdChsaW5lLCBsZW4sIGVvbCk7CisKKyAgICAgICAgdGVhID0gMTsKKyAgICAgICAgaWYgKGNvbW1hbmQtPncpIGdvdG8gd3JpdGVub3c7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjPT0ndycpIHsKKyAgICAgIGludCBmZCwgbm9lb2w7CisgICAgICBjaGFyICpuYW1lOworCit3cml0ZW5vdzoKKyAgICAgIC8vIFN3YXAgb3V0IGVtaXQoKSBjb250ZXh0CisgICAgICBmZCA9IFRULmZkb3V0OworICAgICAgbm9lb2wgPSBUVC5ub2VvbDsKKworICAgICAgLy8gV2Ugc2F2ZSBmaWxlaGFuZGxlIGFuZCBuZXdsaW5lIHN0YXR1cyBiZWZvcmUgZmlsZW5hbWUKKyAgICAgIG5hbWUgPSBjb21tYW5kLT53ICsgKGNoYXIgKiljb21tYW5kOworICAgICAgbWVtY3B5KCZUVC5mZG91dCwgbmFtZSwgNCk7CisgICAgICBuYW1lICs9IDQ7CisgICAgICBUVC5ub2VvbCA9ICoobmFtZSsrKTsKKworICAgICAgLy8gd3JpdGUsIHRoZW4gc2F2ZS9yZXN0b3JlIGNvbnRleHQKKyAgICAgIGlmIChlbWl0KGxpbmUsIGxlbiwgZW9sKSkKKyAgICAgICAgcGVycm9yX2V4aXQoIncgJyVzJyIsIGNvbW1hbmQtPmFyZzErKGNoYXIgKiljb21tYW5kKTsKKyAgICAgICooLS1uYW1lKSA9IFRULm5vZW9sOworICAgICAgVFQubm9lb2wgPSBub2VvbDsKKyAgICAgIFRULmZkb3V0ID0gZmQ7CisgICAgfSBlbHNlIGlmIChjPT0neCcpIHsKKyAgICAgIGxvbmcgc3dhcCA9IFRULnJlbWVtYmVybGVuOworCisgICAgICBzdHIgPSBUVC5yZW1lbWJlcjsKKyAgICAgIFRULnJlbWVtYmVyID0gbGluZTsKKyAgICAgIGxpbmUgPSBzdHI7CisgICAgICBUVC5yZW1lbWJlcmxlbiA9IGxlbjsKKyAgICAgIGxlbiA9IHN3YXA7CisgICAgfSBlbHNlIGlmIChjPT0neScpIHsKKyAgICAgIGNoYXIgKmZyb20sICp0byA9IChjaGFyICopY29tbWFuZDsKKyAgICAgIGludCBpLCBqOworCisgICAgICBmcm9tID0gdG8rY29tbWFuZC0+YXJnMTsKKyAgICAgIHRvICs9IGNvbW1hbmQtPmFyZzI7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBqID0gc3RyaWR4KGZyb20sIGxpbmVbaV0pOworICAgICAgICBpZiAoaiAhPSAtMSkgbGluZVtpXSA9IHRvW2pdOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYz09Jz0nKSB7CisgICAgICBzcHJpbnRmKHRveWJ1ZiwgIiVsZCIsIFRULmNvdW50KTsKKyAgICAgIGVtaXQodG95YnVmLCBzdHJsZW4odG95YnVmKSwgMSk7CisgICAgfQorCisgICAgY29tbWFuZCA9IGNvbW1hbmQtPm5leHQ7CisgIH0KKworICBpZiAobGluZSAmJiAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX24pKSBlbWl0KGxpbmUsIGxlbiwgZW9sKTsKKworZG9uZToKKyAgaWYgKGRsaXN0X3Rlcm1pbmF0ZShhcHBlbmQpKSB3aGlsZSAoYXBwZW5kKSB7CisgICAgc3RydWN0IGFwcGVuZCAqYSA9IGFwcGVuZC0+bmV4dDsKKworICAgIGlmIChhcHBlbmQtPmZpbGUpIHsKKyAgICAgIGludCBmZCA9IG9wZW4oYXBwZW5kLT5zdHIsIE9fUkRPTkxZKTsKKworICAgICAgLy8gRm9yY2UgbmV3bGluZSBpZiBub2VvbCBwZW5kaW5nCisgICAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgaWYgKFRULm5vZW9sKSB4d3JpdGUoVFQuZmRvdXQsICJcbiIsIDEpOworICAgICAgICBUVC5ub2VvbCA9IDA7CisgICAgICAgIHhzZW5kZmlsZShmZCwgVFQuZmRvdXQpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcHBlbmQtPnN0cikgZW1pdChhcHBlbmQtPnN0ciwgc3RybGVuKGFwcGVuZC0+c3RyKSwgMSk7CisgICAgZWxzZSBlbWl0KGxpbmUsIDAsIDApOworICAgIGZyZWUoYXBwZW5kKTsKKyAgICBhcHBlbmQgPSBhOworICB9CisgIGZyZWUobGluZSk7Cit9CisKKy8vIEdlbmVyaWNpc2ggZnVuY3Rpb24sIGNhbiBwcm9iYWJseSBnZXQgbW92ZWQgdG8gbGliLmMKKworLy8gSXRlcmF0ZSBvdmVyIGxpbmVzIGluIGZpbGUsIGNhbGxpbmcgZnVuY3Rpb24uIEZ1bmN0aW9uIGNhbiB3cml0ZSAwIHRvCisvLyB0aGUgbGluZSBwb2ludGVyIGlmIHRoZXkgd2FudCB0byBrZWVwIGl0LCBvciAxIHRvIHRlcm1pbmF0ZSBwcm9jZXNzaW5nLAorLy8gb3RoZXJ3aXNlIGxpbmUgaXMgZnJlZWQuIFBhc3NlZCBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIGF0IHRoZSBlbmQuCitzdGF0aWMgdm9pZCBkb19saW5lcyhpbnQgZmQsIHZvaWQgKCpjYWxsKShjaGFyICoqcGxpbmUsIGxvbmcgbGVuKSkKK3sKKyAgRklMRSAqZnAgPSBmZCA/IHhmZG9wZW4oZmQsICJyIikgOiBzdGRpbjsKKworICBmb3IgKDs7KSB7CisgICAgY2hhciAqbGluZSA9IDA7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBsZW4gPSBnZXRsaW5lKCZsaW5lLCAodm9pZCAqKSZsZW4sIGZwKTsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgY2FsbCgmbGluZSwgbGVuKTsKKyAgICAgIGlmIChsaW5lID09ICh2b2lkICopMSkgYnJlYWs7CisgICAgICBmcmVlKGxpbmUpOworICAgIH0gZWxzZSBicmVhazsKKyAgfQorCisgIGlmIChmZCkgZmNsb3NlKGZwKTsKK30KKworLy8gQ2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggaW5wdXQgZmlsZQorc3RhdGljIHZvaWQgZG9fc2VkKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgaW50IGkgPSB0b3lzLm9wdGZsYWdzICYgRkxBR19pOworICBjaGFyICp0bXA7CisKKyAgaWYgKGkpIHsKKyAgICBzdHJ1Y3Qgc2VkY21kICpjb21tYW5kOworCisgICAgaWYgKCFmZCAmJiAhc3RyY21wKG5hbWUsICItIikpIHsKKyAgICAgIGVycm9yX21zZygiLWkgb24gc3RkaW4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgVFQuZmRvdXQgPSBjb3B5X3RlbXBmaWxlKGZkLCBuYW1lLCAmdG1wKTsKKyAgICBUVC5jb3VudCA9IDA7CisgICAgZm9yIChjb21tYW5kID0gKHZvaWQgKilUVC5wYXR0ZXJuOyBjb21tYW5kOyBjb21tYW5kID0gY29tbWFuZC0+bmV4dCkKKyAgICAgIGNvbW1hbmQtPmhpdCA9IDA7CisgIH0KKyAgZG9fbGluZXMoZmQsIHByb2Nlc3NfbGluZSk7CisgIGlmIChpKSB7CisgICAgcHJvY2Vzc19saW5lKDAsIDApOworICAgIHJlcGxhY2VfdGVtcGZpbGUoLTEsIFRULmZkb3V0LCAmdG1wKTsKKyAgICBUVC5mZG91dCA9IDE7CisgICAgVFQubmV4dGxpbmUgPSAwOworICAgIFRULm5leHRsZW4gPSBUVC5ub2VvbCA9IDA7CisgIH0KK30KKworLy8gQ29weSBjaHVuayBvZiBzdHJpbmcgYmV0d2VlbiB0d28gZGVsaW1pdGVycywgY29udmVydGluZyBwcmludGYgZXNjYXBlcy4KKy8vIHJldHVybnMgcHJvY2Vzc2VkIGNvcHkgb2Ygc3RyaW5nICgwIGlmIGVycm9yKSwgKnBzdHIgYWR2YW5jZXMgdG8gbmV4dAorLy8gdW51c2VkIGNoYXIuIGlmIGRlbGltIChvciAqZGVsaW0pIGlzIDAgdXNlcy9zYXZlcyBzdGFydGluZyBjaGFyIGFzIGRlbGltaXRlcgorLy8gaWYgcmVneGV4LCBpZ25vcmUgZGVsaW1pdGVyIGluIFtyYW5nZXNdCitzdGF0aWMgY2hhciAqdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZyhjaGFyICoqcHN0ciwgY2hhciAqZGVsaW0pCit7CisgIGNoYXIgKnRvLCAqZnJvbSwgbW9kZSA9IDAsIGQ7CisKKyAgZnJvbSA9ICpwc3RyOworICBpZiAoIWRlbGltIHx8ICEqZGVsaW0pIHsKKyAgICBpZiAoIShkID0gKihmcm9tKyspKSkgcmV0dXJuIDA7CisgICAgaWYgKGQgPT0gJ1xcJykgZCA9ICooZnJvbSsrKTsKKyAgICBpZiAoIWQgfHwgZCA9PSAnXFwnKSByZXR1cm4gMDsKKyAgICBpZiAoZGVsaW0pICpkZWxpbSA9IGQ7CisgIH0gZWxzZSBkID0gKmRlbGltOworICB0byA9IGRlbGltID0geG1hbGxvYyhzdHJsZW4oKnBzdHIpKzEpOworCisgIHdoaWxlIChtb2RlIHx8ICpmcm9tICE9IGQpIHsKKyAgICBpZiAoISpmcm9tKSByZXR1cm4gMDsKKworICAgIC8vIGRlbGltaXRlciBpbiByZWdleCBjaGFyYWN0ZXIgcmFuZ2UgZG9lc24ndCBjb3VudAorICAgIGlmICghbW9kZSAmJiAqZnJvbSA9PSAnWycpIHsKKyAgICAgIG1vZGUgPSAnWyc7CisgICAgICBpZiAoZnJvbVsxXT09Jy0nIHx8IGZyb21bMV09PSddJykgKih0bysrKSA9ICooZnJvbSsrKTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgJiYgKmZyb20gPT0gJ10nKSBtb2RlID0gMDsKKyAgICAvLyBMZW5ndGggMSByYW5nZSAoWC1YIHdpdGggc2FtZSBYKSBpcyAidW5kZWZpbmVkIiBhbmQgbWFrZXMgcmVnY29tcCBlcnIsCisgICAgLy8gYnV0IHRoZSBwZXJsIGJ1aWxkIGRvZXMgaXQsIHNvIHdlIG5lZWQgdG8gZmlsdGVyIGl0IG91dC4KKyAgICBlbHNlIGlmIChtb2RlICYmICpmcm9tID09ICctJyAmJiBmcm9tWy0xXSA9PSBmcm9tWzFdKSB7CisgICAgICBmcm9tKz0yOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmICgqZnJvbSA9PSAnXFwnKSB7CisgICAgICBpZiAoIWZyb21bMV0pIHJldHVybiAwOworCisgICAgICAvLyBDaGVjayBlc2NhcGVkIGVuZCBkZWxpbWl0ZXIgYmVmb3JlIHByaW50ZiBzdHlsZSBlc2NhcGVzLgorICAgICAgaWYgKGZyb21bMV0gPT0gZCkgZnJvbSsrOworICAgICAgZWxzZSBpZiAoZnJvbVsxXT09J1xcJykgKih0bysrKSA9ICooZnJvbSsrKTsKKyAgICAgIGVsc2UgeworICAgICAgICBjaGFyIGMgPSB1bmVzY2FwZShmcm9tWzFdKTsKKworICAgICAgICBpZiAoYykgeworICAgICAgICAgICoodG8rKykgPSBjOworICAgICAgICAgIGZyb20rPTI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1vZGUpICoodG8rKykgPSAqKGZyb20rKyk7CisgICAgICB9CisgICAgfQorICAgICoodG8rKykgPSAqKGZyb20rKyk7CisgIH0KKyAgKnRvID0gMDsKKyAgKnBzdHIgPSBmcm9tKzE7CisKKyAgcmV0dXJuIGRlbGltOworfQorCisvLyBUcmFuc2xhdGUgcGF0dGVybiBzdHJpbmdzIGludG8gY29tbWFuZCBzdHJ1Y3R1cmVzLiBFYWNoIGNvbW1hbmQgc3RydWN0dXJlCisvLyBpcyBhIHNpbmdsZSBhbGxvY2F0aW9uICh3aGljaCByZXF1aXJlcyBzb21lIG1hdGggYW5kIHJlbWFsbG9jIGF0IHRpbWVzKS4KK3N0YXRpYyB2b2lkIHBhcnNlX3BhdHRlcm4oY2hhciAqKnBsaW5lLCBsb25nIGxlbikKK3sKKyAgc3RydWN0IHNlZGNtZCAqY29tbWFuZCA9ICh2b2lkICopVFQucGF0dGVybjsKKyAgY2hhciAqbGluZSwgKnJlZywgYywgKmVycnN0YXJ0OworICBpbnQgaTsKKworICBsaW5lID0gZXJyc3RhcnQgPSBwbGluZSA/ICpwbGluZSA6ICIiOworICBpZiAobGVuICYmIGxpbmVbbGVuLTFdPT0nXG4nKSBsaW5lWy0tbGVuXSA9IDA7CisKKyAgLy8gQXBwZW5kIHRoaXMgbGluZSB0byBwcmV2aW91cyBtdWx0aWxpbmUgY29tbWFuZD8gKGhpdCBpbmRpY2F0ZXMgdHlwZS4pCisgIC8vIER1cmluZyBwYXJzaW5nICJoaXQiIHN0b3JlcyBkYXRhIGFib3V0IGxpbmUgY29udGludWF0aW9ucywgYnV0IGluCisgIC8vIHByb2Nlc3NfbGluZSgpIGl0IG1lYW5zIHRoZSBtYXRjaCByYW5nZSBhdHRhY2hlZCB0byB0aGlzIGNvbW1hbmQKKyAgLy8gaXMgYWN0aXZlLCBzbyBwcm9jZXNzaW5nIHRoZSBjb250aW51YXRpb24gbXVzdCB6ZXJvIGl0IGFnYWluLgorICBpZiAoY29tbWFuZCAmJiBjb21tYW5kLT5wcmV2LT5oaXQpIHsKKyAgICAvLyBSZW1vdmUgaGFsZi1maW5pc2hlZCBlbnRyeSBmcm9tIGxpc3Qgc28gcmVtYWxsb2MoKSBkb2Vzbid0IGNvbmZ1c2UgaXQKKyAgICBUVC5wYXR0ZXJuID0gVFQucGF0dGVybi0+cHJldjsKKyAgICBjb21tYW5kID0gZGxpc3RfcG9wKCZUVC5wYXR0ZXJuKTsKKyAgICBjID0gY29tbWFuZC0+YzsKKyAgICByZWcgPSAoY2hhciAqKWNvbW1hbmQ7CisgICAgcmVnICs9IGNvbW1hbmQtPmFyZzEgKyBzdHJsZW4ocmVnICsgY29tbWFuZC0+YXJnMSk7CisKKyAgICAvLyBSZXN1bWUgcGFyc2luZyBmb3IgJ2EnIG9yICdzJyBjb21tYW5kLiAoT25seSB0d28gdGhhdCBjYW4gZG8gdGhpcy4pCisgICAgLy8gVE9ETzogdXNpbmcgMjU2IHRvIGluZGljYXRlICdhJyBtZWFucyBvdXIgcy8vLyBkZWxpbWl0ZXIgY2FuJ3QgYmUKKyAgICAvLyBhIHVuaWNvZGUgY2hhcmFjdGVyLgorICAgIGlmIChjb21tYW5kLT5oaXQgPCAyNTYpIGdvdG8gcmVzdW1lX3M7CisgICAgZWxzZSBnb3RvIHJlc3VtZV9hOworICB9CisKKyAgLy8gTG9vcCB0aHJvdWdoIGNvbW1hbmRzIGluIHRoaXMgbGluZS4KKworICBjb21tYW5kID0gMDsKKyAgZm9yICg7OykgeworICAgIGlmIChjb21tYW5kKSBkbGlzdF9hZGRfbm9tYWxsb2MoJlRULnBhdHRlcm4sICh2b2lkICopY29tbWFuZCk7CisKKyAgICAvLyBJZiB0aGVyZSdzIG5vIG1vcmUgZGF0YSBvbiB0aGlzIGxpbmUsIHJldHVybi4KKyAgICBmb3IgKDs7KSB7CisgICAgICB3aGlsZSAoaXNzcGFjZSgqbGluZSkgfHwgKmxpbmUgPT0gJzsnKSBsaW5lKys7CisgICAgICBpZiAoKmxpbmUgPT0gJyMnKSB3aGlsZSAoKmxpbmUgJiYgKmxpbmUgIT0gJ1xuJykgbGluZSsrOworICAgICAgZWxzZSBicmVhazsKKyAgICB9CisgICAgaWYgKCEqbGluZSkgcmV0dXJuOworCisgICAgLy8gV2Ugc3RhcnQgYnkgd3JpdGluZyBkYXRhIGludG8gdG95YnVmLiBMYXRlciB3ZSdsbCBhbGxvY2F0ZSB0aGUKKyAgICAvLyBleAorCisgICAgZXJyc3RhcnQgPSBsaW5lOworICAgIG1lbXNldCh0b3lidWYsIDAsIHNpemVvZihzdHJ1Y3Qgc2VkY21kKSk7CisgICAgY29tbWFuZCA9ICh2b2lkICopdG95YnVmOworICAgIHJlZyA9IHRveWJ1ZiArIHNpemVvZihzdHJ1Y3Qgc2VkY21kKTsKKworICAgIC8vIFBhcnNlIGFkZHJlc3MgcmFuZ2UgKGlmIGFueSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBpZiAoKmxpbmUgPT0gJywnKSBsaW5lKys7CisgICAgICBlbHNlIGlmIChpKSBicmVhazsKKworICAgICAgaWYgKGlzZGlnaXQoKmxpbmUpKSBjb21tYW5kLT5sbWF0Y2hbaV0gPSBzdHJ0b2wobGluZSwgJmxpbmUsIDApOworICAgICAgZWxzZSBpZiAoKmxpbmUgPT0gJyQnKSB7CisgICAgICAgIGNvbW1hbmQtPmxtYXRjaFtpXSA9IC0xOworICAgICAgICBsaW5lKys7CisgICAgICB9IGVsc2UgaWYgKCpsaW5lID09ICcvJyB8fCAqbGluZSA9PSAnXFwnKSB7CisgICAgICAgIGNoYXIgKnMgPSBsaW5lOworCisgICAgICAgIGlmICghKHMgPSB1bmVzY2FwZV9kZWxpbWl0ZWRfc3RyaW5nKCZsaW5lLCAwKSkpIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghKnMpIGNvbW1hbmQtPnJtYXRjaFtpXSA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHhyZWdjb21wKCh2b2lkICopcmVnLCBzLCAodG95cy5vcHRmbGFncyAmIEZMQUdfcikqUkVHX0VYVEVOREVEKTsKKyAgICAgICAgICBjb21tYW5kLT5ybWF0Y2hbaV0gPSByZWctdG95YnVmOworICAgICAgICAgIHJlZyArPSBzaXplb2YocmVnZXhfdCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShzKTsKKyAgICAgIH0gZWxzZSBicmVhazsKKyAgICB9CisKKyAgICB3aGlsZSAoaXNzcGFjZSgqbGluZSkpIGxpbmUrKzsKKyAgICBpZiAoISpsaW5lKSBicmVhazsKKworICAgIHdoaWxlICgqbGluZSA9PSAnIScpIHsKKyAgICAgIGNvbW1hbmQtPm5vdCA9IDE7CisgICAgICBsaW5lKys7CisgICAgfQorICAgIHdoaWxlIChpc3NwYWNlKCpsaW5lKSkgbGluZSsrOworCisgICAgYyA9IGNvbW1hbmQtPmMgPSAqKGxpbmUrKyk7CisgICAgaWYgKHN0cmNocigifToiLCBjKSAmJiBpKSBicmVhazsKKyAgICBpZiAoc3RyY2hyKCJhaXFyPSIsIGMpICYmIGk+MSkgYnJlYWs7CisKKyAgICAvLyBBZGQgc3RlcCB0byBwYXR0ZXJuCisgICAgY29tbWFuZCA9IHhtZW1kdXAodG95YnVmLCByZWctdG95YnVmKTsKKyAgICByZWcgPSAocmVnLXRveWJ1ZikgKyAoY2hhciAqKWNvbW1hbmQ7CisKKyAgICAvLyBQYXJzZSBhcmd1bWVudHMgYnkgY29tbWFuZCB0eXBlCisgICAgaWYgKGMgPT0gJ3snKSBUVC5uZXh0bGVuKys7CisgICAgZWxzZSBpZiAoYyA9PSAnfScpIHsKKyAgICAgIGlmICghVFQubmV4dGxlbi0tKSBicmVhazsKKyAgICB9IGVsc2UgaWYgKGMgPT0gJ3MnKSB7CisgICAgICBjaGFyICplbmQsIGRlbGltID0gMDsKKworICAgICAgLy8gcy9wYXR0ZXJuL3JlcGxhY2VtZW50L2ZsYWdzCisKKyAgICAgIC8vIGxpbmUgY29udGludWF0aW9ucyB1c2UgYXJnMSAoYmFjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uKSwKKyAgICAgIC8vIHNvIGxldCdzIGZpbGwgb3V0IGFyZzIgZmlyc3QgKHNpbmNlIHRoZSByZWdleCBwYXJ0IGNhbid0IGJlIG11bHRpcGxlCisgICAgICAvLyBsaW5lcykgYW5kIHN3YXAgdGhlbSBiYWNrIGxhdGVyLgorCisgICAgICAvLyBnZXQgcGF0dGVybiAoanVzdCByZWNvcmQsIHdlIHBhcnNlIGl0IGxhdGVyKQorICAgICAgY29tbWFuZC0+YXJnMiA9IHJlZyAtIChjaGFyICopY29tbWFuZDsKKyAgICAgIGlmICghKFRULnJlbWVtYmVyID0gdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZygmbGluZSwgJmRlbGltKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIHJlZyArPSBzaXplb2YocmVnZXhfdCk7CisgICAgICBjb21tYW5kLT5hcmcxID0gcmVnLShjaGFyICopY29tbWFuZDsKKyAgICAgIGNvbW1hbmQtPmhpdCA9IGRlbGltOworcmVzdW1lX3M6CisgICAgICAvLyBnZXQgcmVwbGFjZW1lbnQgLSBkb24ndCByZXBsYWNlIGVzY2FwZXMgeWV0IGJlY2F1c2UgXDEgYW5kIFwmIG5lZWQKKyAgICAgIC8vIHByb2Nlc3NpbmcgbGF0ZXIsIGFmdGVyIHdlIHJlcGxhY2UgXFwgd2l0aCBcIHdlIGNhbid0IHRlbGwgXFwxIGZyb20gXDEKKyAgICAgIGVuZCA9IGxpbmU7CisgICAgICB3aGlsZSAoKmVuZCAhPSBjb21tYW5kLT5oaXQpIHsKKyAgICAgICAgaWYgKCEqZW5kKSBnb3RvIGVycm9yOworICAgICAgICBpZiAoKmVuZCsrID09ICdcXCcpIHsKKyAgICAgICAgICBpZiAoISplbmQgfHwgKmVuZCA9PSAnXG4nKSB7CisgICAgICAgICAgICBlbmRbLTFdID0gJ1xuJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBlbmQrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZWcgPSBleHRlbmRfc3RyaW5nKCh2b2lkICopJmNvbW1hbmQsIGxpbmUsIHJlZy0oY2hhciAqKWNvbW1hbmQsZW5kLWxpbmUpOworICAgICAgbGluZSA9IGVuZDsKKyAgICAgIC8vIGxpbmUgY29udGludWF0aW9uPyAobm90ZTogJ1xuJyBjYW4ndCBiZSBhIHZhbGlkIGRlbGltKS4KKyAgICAgIGlmICgqbGluZSA9PSBjb21tYW5kLT5oaXQpIGNvbW1hbmQtPmhpdCA9IDA7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCEqbGluZSkgY29udGludWU7CisgICAgICAgIHJlZy0tOworICAgICAgICBsaW5lKys7CisgICAgICAgIGdvdG8gcmVzdW1lX3M7CisgICAgICB9CisKKyAgICAgIC8vIHN3YXAgYXJnMS9hcmcyIHNvIHRoZXkncmUgYmFjayBpbiBvcmRlciBhcmd1bWVudHMgb2NjdXIuCisgICAgICBpID0gY29tbWFuZC0+YXJnMTsKKyAgICAgIGNvbW1hbmQtPmFyZzEgPSBjb21tYW5kLT5hcmcyOworICAgICAgY29tbWFuZC0+YXJnMiA9IGk7CisKKyAgICAgIC8vIGdldCBmbGFncworICAgICAgZm9yIChsaW5lKys7ICpsaW5lOyBsaW5lKyspIHsKKyAgICAgICAgbG9uZyBsOworCisgICAgICAgIGlmIChpc3NwYWNlKCpsaW5lKSAmJiAqbGluZSAhPSAnXG4nKSBjb250aW51ZTsKKworICAgICAgICBpZiAoMCA8PSAobCA9IHN0cmlkeCgiaWdwIiwgKmxpbmUpKSkgY29tbWFuZC0+c2ZsYWdzIHw9IDE8PGw7CisgICAgICAgIGVsc2UgaWYgKCEoY29tbWFuZC0+c2ZsYWdzPj4zKSAmJiAwPChsID0gc3RydG9sKGxpbmUsICZsaW5lLCAxMCkpKSB7CisgICAgICAgICAgY29tbWFuZC0+c2ZsYWdzIHw9IGwgPDwgMzsKKyAgICAgICAgICBsaW5lLS07CisgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gV2UgZGVmZXJyZWQgYWN0dWFsbHkgcGFyc2luZyB0aGUgcmVnZXggdW50aWwgd2UgaGFkIHRoZSBzLy8vaSBmbGFnCisgICAgICAvLyBhbGxvY2F0aW5nIHRoZSBzcGFjZSB3YXMgZG9uZSBieSBleHRlbmRfc3RyaW5nKCkgYWJvdmUKKyAgICAgIGlmICghKlRULnJlbWVtYmVyKSBjb21tYW5kLT5hcmcxID0gMDsKKyAgICAgIGVsc2UgeHJlZ2NvbXAoKHZvaWQgKikoY29tbWFuZC0+YXJnMSArIChjaGFyICopY29tbWFuZCksIFRULnJlbWVtYmVyLAorICAgICAgICAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpKlJFR19FWFRFTkRFRCl8KChjb21tYW5kLT5zZmxhZ3MmMSkqUkVHX0lDQVNFKSk7CisgICAgICBmcmVlKFRULnJlbWVtYmVyKTsKKyAgICAgIFRULnJlbWVtYmVyID0gMDsKKyAgICAgIGlmICgqbGluZSA9PSAndycpIHsKKyAgICAgICAgbGluZSsrOworICAgICAgICBnb3RvIHdyaXRlbm93OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYyA9PSAndycpIHsKKyAgICAgIGludCBmZCwgZGVsaW07CisgICAgICBjaGFyICpjYzsKKworICAgICAgLy8gU2luY2Ugcy8vLyB1c2VzIGFyZzEgYW5kIGFyZzIsIGFuZCB3IG5lZWRzIGEgcGVyc2lzdGVudCBmaWxlaGFuZGxlIGFuZAorICAgICAgLy8gZW9sIHN0YXR1cywgYW5kIHRvIHJldGFpbiB0aGUgZmlsZW5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzLCB3ZSdkIG5lZWQKKyAgICAgIC8vIHRvIGdvIHVwIHRvIGFyZzUganVzdCBmb3IgdGhpcy4gQ29tcHJvbWlzZTogZHluYW1pY2FsbHkgYWxsb2NhdGUgdGhlCisgICAgICAvLyBmaWxlaGFuZGxlIGFuZCBlb2wgc3RhdHVzLgorCit3cml0ZW5vdzoKKyAgICAgIHdoaWxlIChpc3NwYWNlKCpsaW5lKSkgbGluZSsrOworICAgICAgaWYgKCEqbGluZSkgZ290byBlcnJvcjsKKyAgICAgIGZvciAoY2MgPSBsaW5lOyAqY2M7IGNjKyspIGlmICgqY2MgPT0gJ1xcJyAmJiBjY1sxXSA9PSAnOycpIGJyZWFrOworICAgICAgZGVsaW0gPSAqY2M7CisgICAgICAqY2MgPSAwOworICAgICAgZmQgPSB4Y3JlYXRlKGxpbmUsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY0NCk7CisgICAgICAqY2MgPSBkZWxpbTsKKworICAgICAgY29tbWFuZC0+dyA9IHJlZyAtIChjaGFyICopY29tbWFuZDsKKyAgICAgIGNvbW1hbmQgPSB4cmVhbGxvYyhjb21tYW5kLCBjb21tYW5kLT53KyhjYy1saW5lKSs2KTsKKyAgICAgIHJlZyA9IGNvbW1hbmQtPncgKyAoY2hhciAqKWNvbW1hbmQ7CisKKyAgICAgIG1lbWNweShyZWcsICZmZCwgNCk7CisgICAgICByZWcgKz0gNDsKKyAgICAgICoocmVnKyspID0gMDsKKyAgICAgIG1lbWNweShyZWcsIGxpbmUsIGRlbGltKTsKKyAgICAgIHJlZyArPSBkZWxpbTsKKyAgICAgICoocmVnKyspID0gMDsKKworICAgICAgbGluZSA9IGNjOworICAgICAgaWYgKGRlbGltKSBsaW5lICs9IDI7CisgICAgfSBlbHNlIGlmIChjID09ICd5JykgeworICAgICAgY2hhciAqcywgZGVsaW0gPSAwOworICAgICAgaW50IGxlbjsKKworICAgICAgaWYgKCEocyA9IHVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoJmxpbmUsICZkZWxpbSkpKSBnb3RvIGVycm9yOworICAgICAgY29tbWFuZC0+YXJnMSA9IHJlZy0oY2hhciAqKWNvbW1hbmQ7CisgICAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgICByZWcgPSBleHRlbmRfc3RyaW5nKCh2b2lkICopJmNvbW1hbmQsIHMsIHJlZy0oY2hhciAqKWNvbW1hbmQsIGxlbik7CisgICAgICBmcmVlKHMpOworICAgICAgY29tbWFuZC0+YXJnMiA9IHJlZy0oY2hhciAqKWNvbW1hbmQ7CisgICAgICBpZiAoIShzID0gdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZygmbGluZSwgJmRlbGltKSkpIGdvdG8gZXJyb3I7CisgICAgICBpZiAobGVuICE9IHN0cmxlbihzKSkgZ290byBlcnJvcjsKKyAgICAgIHJlZyA9IGV4dGVuZF9zdHJpbmcoKHZvaWQgKikmY29tbWFuZCwgcywgcmVnLShjaGFyKiljb21tYW5kLCBsZW4pOworICAgICAgZnJlZShzKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNocigiYWJjaXJ0VHc6IiwgYykpIHsKKyAgICAgIGludCBlbmQ7CisKKyAgICAgIC8vIHRyaW0gbGVhZGluZyBzcGFjZXMKKyAgICAgIHdoaWxlIChpc3NwYWNlKCpsaW5lKSAmJiAqbGluZSAhPSAnXG4nKSBsaW5lKys7CisKKyAgICAgIC8vIFJlc3VtZSBsb2dpYyBkaWZmZXJzIGZyb20gJ3MnIGNhc2UgYmVjYXVzZSB3ZSBkb24ndCBhZGQgYSBuZXdsaW5lCisgICAgICAvLyB1bmxlc3MgaXQncyBhZnRlciBzb21ldGhpbmcsIHNvIHdlIGFkZCBpdCBvbiByZXR1cm4gaW5zdGVhZC4KK3Jlc3VtZV9hOgorICAgICAgY29tbWFuZC0+aGl0ID0gMDsKKworICAgICAgLy8gYnRUOiBlbmQgd2l0aCBzcGFjZSBvciBzZW1pY29sb24sIGFpY3J3IGNvbnRpbnVlIHRvIG5ld2xpbmUuCisgICAgICBpZiAoIShlbmQgPSBzdHJjc3BuKGxpbmUsIHN0cmNocigiOmJ0VCIsIGMpID8gIjsgXHRcclxuXHZcZiIgOiAiXG4iKSkpIHsKKyAgICAgICAgLy8gQXJndW1lbnQncyBvcHRpb25hbCBmb3IgYnRUCisgICAgICAgIGlmIChzdHJjaHIoImJ0VCIsIGMpKSBjb250aW51ZTsKKyAgICAgICAgZWxzZSBpZiAoIWNvbW1hbmQtPmFyZzEpIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBFeHRlbmQgYWxsb2NhdGlvbiB0byBpbmNsdWRlIG5ldyBzdHJpbmcuIFdlIHVzZSBvZmZzZXRzIGluc3RlYWQgb2YKKyAgICAgIC8vIHBvaW50ZXJzIHNvIHJlYWxsb2MoKSBtb3Zpbmcgc3R1ZmYgZG9lc24ndCBicmVhayB0aGluZ3MuIE9rIHRvIHdyaXRlCisgICAgICAvLyBcbiBvdmVyIE5VTCB0ZXJtaW5hdG9yIGJlY2F1c2UgY2FsbCB0byBleHRlbmRfc3RyaW5nKCkgYWRkcyBpdCBiYWNrLgorICAgICAgaWYgKCFjb21tYW5kLT5hcmcxKSBjb21tYW5kLT5hcmcxID0gcmVnIC0gKGNoYXIqKWNvbW1hbmQ7CisgICAgICBlbHNlIGlmICgqKGNvbW1hbmQtPmFyZzErKGNoYXIgKiljb21tYW5kKSkgKihyZWcrKykgPSAnXG4nOworICAgICAgZWxzZSBpZiAoIXBsaW5lKSB7CisgICAgICAgIGNvbW1hbmQtPmFyZzEgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJlZyA9IGV4dGVuZF9zdHJpbmcoKHZvaWQgKikmY29tbWFuZCwgbGluZSwgcmVnIC0gKGNoYXIgKiljb21tYW5kLCBlbmQpOworCisgICAgICAvLyBSZWNvcHkgZGF0YSB0byByZW1vdmUgZXNjYXBlIHNlcXVlbmNlcyBhbmQgaGFuZGxlIGxpbmUgY29udGludWF0aW9uLgorICAgICAgaWYgKHN0cmNocigiYWNpIiwgYykpIHsKKyAgICAgICAgcmVnIC09IGVuZCsxOworICAgICAgICBmb3IgKGkgPSBlbmQ7IGk7IGktLSkgeworICAgICAgICAgIGlmICgoKnJlZysrID0gKmxpbmUrKyk9PSdcXCcpIHsKKworICAgICAgICAgICAgLy8gZXNjYXBlIGF0IGVuZCBvZiBsaW5lOiByZXN1bWUgaWYgLWUgZXNjYXBlZCBsaXRlcmFsIG5ld2xpbmUsCisgICAgICAgICAgICAvLyBlbHNlIHJlcXVlc3QgY2FsbGJhY2sgYW5kIHJlc3VtZSB3aXRoIG5leHQgbGluZQorICAgICAgICAgICAgaWYgKCEtLWkpIHsKKyAgICAgICAgICAgICAgKi0tcmVnID0gMDsKKyAgICAgICAgICAgICAgaWYgKCpsaW5lKSB7CisgICAgICAgICAgICAgICAgbGluZSsrOworICAgICAgICAgICAgICAgIGdvdG8gcmVzdW1lX2E7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29tbWFuZC0+aGl0ID0gMjU2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHJlZ1stMV0gPSB1bmVzY2FwZSgqbGluZSkpKSByZWdbLTFdID0gKmxpbmU7CisgICAgICAgICAgICBsaW5lKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpyZWcgPSAwOworICAgICAgfSBlbHNlIGxpbmUgKz0gZW5kOworCisgICAgLy8gQ29tbWFuZHMgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cworICAgIH0gZWxzZSBpZiAoIXN0cmNocigie2REZ0doSGxuTnBQcXg9IiwgYykpIGJyZWFrOworICB9CisKK2Vycm9yOgorICBlcnJvcl9leGl0KCJiYWQgcGF0dGVybiAnJXMnQCVsZCAoJWMpIiwgZXJyc3RhcnQsIGxpbmUtZXJyc3RhcnQrMUwsICpsaW5lKTsKK30KKwordm9pZCBzZWRfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgYXJnX2xpc3QgKmFsOworICBjaGFyICoqYXJncyA9IHRveXMub3B0YXJnczsKKworICAvLyBMaWUgdG8gYXV0b2NvbmYgd2hlbiBpdCBhc2tzIHN0dXBpZCBxdWVzdGlvbnMsIHNvIGNvbmZpZ3VyZSByZWdleGVzCisgIC8vIHRoYXQgbG9vayBmb3IgIkdOVSBzZWQgdmVyc2lvbiAlZiIgZ3JlYXRlciB0aGFuIHNvbWUgb2xkIGJ1Z2d5IG51bWJlcgorICAvLyBkb24ndCBmYWlsIHVzIGZvciBub3QgbWF0Y2hpbmcgdGhlaXIgbmFycm93IGV4cGVjdGF0aW9ucy4KKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3ZlcnNpb24pIHsKKyAgICB4cHJpbnRmKCJUaGlzIGlzIG5vdCBHTlUgc2VkIHZlcnNpb24gOS4wXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQYXJzZSBwYXR0ZXJuIGludG8gY29tbWFuZHMuCisKKyAgLy8gSWYgbm8gLWUgb3IgLWYsIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBwYXR0ZXJuLgorICBpZiAoIVRULmUgJiYgIVRULmYpIHsKKyAgICBpZiAoISp0b3lzLm9wdGFyZ3MpIGVycm9yX2V4aXQoIm5vIHBhdHRlcm4iKTsKKyAgICAoVFQuZSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmdfbGlzdCkpKS0+YXJnID0gKihhcmdzKyspOworICB9CisKKyAgLy8gT3B0aW9uIHBhcnNpbmcgaW5mcmFzdHJ1Y3R1cmUgY2FuJ3QgaW50ZXJsYWNlICItZSBibGFoIC1mIGJsYWggLWUgYmxhaCIKKyAgLy8gc28gaGFuZGxlIGFsbCAtZSwgdGhlbiBhbGwgLWYuIChBdCBsZWFzdCB0aGUgYmVoYXZpb3IncyBjb25zaXN0ZW50LikKKworICBmb3IgKGFsID0gVFQuZTsgYWw7IGFsID0gYWwtPm5leHQpIHBhcnNlX3BhdHRlcm4oJmFsLT5hcmcsIHN0cmxlbihhbC0+YXJnKSk7CisgIGZvciAoYWwgPSBUVC5mOyBhbDsgYWwgPSBhbC0+bmV4dCkgZG9fbGluZXMoeG9wZW5ybyhhbC0+YXJnKSwgcGFyc2VfcGF0dGVybik7CisgIHBhcnNlX3BhdHRlcm4oMCwgMCk7CisgIGRsaXN0X3Rlcm1pbmF0ZShUVC5wYXR0ZXJuKTsKKyAgaWYgKFRULm5leHRsZW4pIGVycm9yX2V4aXQoIm5vIH0iKTsgIAorCisgIFRULmZkb3V0ID0gMTsKKyAgVFQucmVtZW1iZXIgPSB4c3RyZHVwKCIiKTsKKworICAvLyBJbmZsaWN0IHBhdHRlcm4gdXBvbiBpbnB1dCBmaWxlcworICBsb29wZmlsZXNfcncoYXJncywgT19SRE9OTFksIDAsIDAsIGRvX3NlZCk7CisKKyAgaWYgKCEodG95cy5vcHRmbGFncyAmIEZMQUdfaSkpIHByb2Nlc3NfbGluZSgwLCAwKTsKKworICAvLyB0b2RvOiBuZWVkIHRvIGNsb3NlIGZkIHdoZW4gZG9uZSBmb3IgVE9ZQk9YX0ZSRUU/Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC9zbGVlcC5jIGIvdG95Ym94L3RveXMvcG9zaXgvc2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I4YmJmCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvc2xlZXAuYwpAQCAtMCwwICsxLDM2IEBACisvKiBzbGVlcC5jIC0gV2FpdCBmb3IgYSBudW1iZXIgb2Ygc2Vjb25kcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IDIwMTIgR2VvcmdpIENob3JiYWR6aGl5c2tpIDxnZW9yZ2lAdW5peHNvbC5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvc2xlZXAuaHRtbAorCitVU0VfU0xFRVAoTkVXVE9ZKHNsZWVwLCAiPDEiLCBUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBTTEVFUAorICBib29sICJzbGVlcCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc2xlZXAgTEVOR1RICisKKyAgICBXYWl0IGJlZm9yZSBleGl0aW5nLiBBbiBvcHRpb25hbCBzdWZmaXggY2FuIGJlICJtIiAobWludXRlcyksICJoIiAoaG91cnMpLAorICAgICJkIiAoZGF5cyksIG9yICJzIiAoc2Vjb25kcywgdGhlIGRlZmF1bHQpLgorCisKK2NvbmZpZyBTTEVFUF9GTE9BVAorICBib29sCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFNMRUVQICYmIFRPWUJPWF9GTE9BVAorICBoZWxwCisgICAgTGVuZ3RoIGNhbiBiZSBhIGRlY2ltYWwgZnJhY3Rpb24uCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHNsZWVwX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHRpbWVzcGVjIHR2OworCisgIHR2LnR2X3NlYyA9IHhwYXJzZXRpbWUoKnRveXMub3B0YXJncywgMTAwMDAwMDAwMCwgJnR2LnR2X25zZWMpOworICB0b3lzLmV4aXR2YWwgPSAhIW5hbm9zbGVlcCgmdHYsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvc29ydC5jIGIvdG95Ym94L3RveXMvcG9zaXgvc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzIyZmIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9zb3J0LmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qIHNvcnQuYyAtIHB1dCBpbnB1dCBsaW5lcyBpbnRvIG9yZGVyCisgKgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDggUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NvcnQuaHRtbAorICoKKyAqIERldmlhdGlvbnMgZnJvbSBQT1NJWDogTG90cy4KKyAqIFdlIGludmVudGVkIC14CisKK1VTRV9TT1JUKE5FV1RPWShzb3J0LCBVU0VfU09SVF9GTE9BVCgiZyIpVVNFX1NPUlRfQklHKCJTOlQ6bSIgIm86ayp0OnhiTWNzemRmaSIpICJydW4iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBTT1JUCisgIGJvb2wgInNvcnQiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHNvcnQgWy1ydW5dIFtGSUxFLi4uXQorCisgICAgU29ydCBhbGwgbGluZXMgb2YgdGV4dCBmcm9tIGlucHV0IGZpbGVzIChvciBzdGRpbikgdG8gc3Rkb3V0LgorCisgICAgLXIJcmV2ZXJzZQorICAgIC11CXVuaXF1ZSBsaW5lcyBvbmx5CisgICAgLW4JbnVtZXJpYyBvcmRlciAoaW5zdGVhZCBvZiBhbHBoYWJldGljYWwpCisKK2NvbmZpZyBTT1JUX0JJRworICBib29sICJTdVN2MyBvcHRpb25zIChTdXBwb3J0IC1rdGNzYmRmaW96TSkiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFNPUlQKKyAgaGVscAorICAgIHVzYWdlOiBzb3J0IFstYmNkZmlNc3pdIFstayNbLCNbeF1dIFstdCBYXV0gWy1vIEZJTEVdCisKKyAgICAtYglpZ25vcmUgbGVhZGluZyBibGFua3MgKG9yIHRyYWlsaW5nIGJsYW5rcyBpbiBzZWNvbmQgcGFydCBvZiBrZXkpCisgICAgLWMJY2hlY2sgd2hldGhlciBpbnB1dCBpcyBzb3J0ZWQKKyAgICAtZAlkaWN0aW9uYXJ5IG9yZGVyICh1c2UgYWxwaGFudW1lcmljIGFuZCB3aGl0ZXNwYWNlIGNoYXJzIG9ubHkpCisgICAgLWYJZm9yY2UgdXBwZXJjYXNlIChjYXNlIGluc2Vuc2l0aXZlIHNvcnQpCisgICAgLWkJaWdub3JlIG5vbnByaW50aW5nIGNoYXJhY3RlcnMKKyAgICAtTQltb250aCBzb3J0IChqYW4sIGZlYiwgZXRjKS4KKyAgICAteAlIZXhhZGVjaW1hbCBudW1lcmljYWwgc29ydAorICAgIC1zCXNraXAgZmFsbGJhY2sgc29ydCAob25seSBzb3J0IHdpdGgga2V5cykKKyAgICAtegl6ZXJvIChudWxsKSB0ZXJtaW5hdGVkIGxpbmVzCisgICAgLWsJc29ydCBieSAia2V5IiAoc2VlIGJlbG93KQorICAgIC10CXVzZSBhIGtleSBzZXBhcmF0b3Igb3RoZXIgdGhhbiB3aGl0ZXNwYWNlCisgICAgLW8Jb3V0cHV0IHRvIEZJTEUgaW5zdGVhZCBvZiBzdGRvdXQKKworICAgIFNvcnRpbmcgYnkga2V5IGxvb2tzIGF0IGEgc3Vic2V0IG9mIHRoZSB3b3JkcyBvbiBlYWNoIGxpbmUuICAtazIKKyAgICB1c2VzIHRoZSBzZWNvbmQgd29yZCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCAtazIsMiBsb29rcyBhdCBvbmx5CisgICAgdGhlIHNlY29uZCB3b3JkLCAtazIsNCBsb29rcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHRvIHRoZSBlbmQKKyAgICBvZiB0aGUgZm91cnRoIHdvcmQuICBTcGVjaWZ5aW5nIG11bHRpcGxlIGtleXMgdXNlcyB0aGUgbGF0ZXIga2V5cyBhcworICAgIHRpZSBicmVha2VycywgaW4gb3JkZXIuICBBIHR5cGUgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIGEgc29ydCBrZXkKKyAgICAoc3VjaCBhcyAtMiwybikgYXBwbGllcyBvbmx5IHRvIHNvcnRpbmcgdGhhdCBrZXkuCisKK2NvbmZpZyBTT1JUX0ZMT0FUCisgIGJvb2wKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gU09SVF9CSUcgJiYgVE9ZQk9YX0ZMT0FUCisgIGhlbHAKKyAgICB1c2FnZTogc29ydCBbLWddCisKKyAgICAtZwlnZW5lcmFsIG51bWVyaWMgc29ydCAoZG91YmxlIHByZWNpc2lvbiB3aXRoIG5hbiBhbmQgaW5mKQorKi8KKworI2RlZmluZSBGT1Jfc29ydAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgY2hhciAqa2V5X3NlcGFyYXRvcjsKKyAgc3RydWN0IGFyZ19saXN0ICpyYXdfa2V5czsKKyAgY2hhciAqb3V0ZmlsZTsKKyAgY2hhciAqaWdub3JlMSwgaWdub3JlMjsgICAvLyBHTlUgY29tcGF0YWJpbGl0eSBOT1BzIGZvciAtUyBhbmQgLVQuCisKKyAgdm9pZCAqa2V5X2xpc3Q7CisgIGludCBsaW5lY291bnQ7CisgIGNoYXIgKipsaW5lczsKKykKKworLy8gVGhlIHNvcnQgdHlwZXMgYXJlIG4sIGcsIGFuZCBNLgorLy8gdSwgYywgcywgYW5kIHogYXBwbHkgdG8gdG9wIGxldmVsIG9ubHksIG5vdCB0byBrZXlzLgorLy8gYiBhdCB0b3AgbGV2ZWwgaW1wbGllcyBiYi4KKy8vIFRoZSByZW1haW5pbmcgb3B0aW9ucyBjYW4gYmUgYXBwbGllZCB0byBzZWFyY2gga2V5cy4KKworI2RlZmluZSBGTEFHX2JiICgxPDwzMSkgIC8vIElnbm9yZSB0cmFpbGluZyBibGFua3MKKworc3RydWN0IHNvcnRfa2V5Cit7CisgIHN0cnVjdCBzb3J0X2tleSAqbmV4dF9rZXk7ICAvLyBsaW5rZWQgbGlzdAorICB1bnNpZ25lZCByYW5nZVs0XTsgICAgICAgICAgLy8gc3RhcnQgd29yZCwgc3RhcnQgY2hhciwgZW5kIHdvcmQsIGVuZCBjaGFyCisgIGludCBmbGFnczsKK307CisKKy8vIENvcHkgb2YgdGhlIHBhcnQgb2YgdGhpcyBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIGtleS9mbGFncy4KKworc3RhdGljIGNoYXIgKmdldF9rZXlfZGF0YShjaGFyICpzdHIsIHN0cnVjdCBzb3J0X2tleSAqa2V5LCBpbnQgZmxhZ3MpCit7CisgIGludCBzdGFydD0wLCBlbmQsIGxlbiwgaSwgajsKKworICAvLyBTcGVjaWFsIGNhc2Ugd2hvbGUgc3RyaW5nLCBzbyB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgYSBjb3B5CisKKyAgaWYoa2V5LT5yYW5nZVswXT09MSAmJiAha2V5LT5yYW5nZVsxXSAmJiAha2V5LT5yYW5nZVsyXSAmJiAha2V5LT5yYW5nZVszXQorICAgICYmICEoZmxhZ3MmKEZMQUdfYnxGTEFHX2R8RkxBR19pfEZMQUdfYmIpKSkgcmV0dXJuIHN0cjsKKworICAvLyBGaW5kIHN0YXJ0IG9mIGtleSBvbiBmaXJzdCBwYXNzLCBlbmQgb24gc2Vjb25kIHBhc3MKKworICBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgZm9yIChqPTA7IGo8MjsgaisrKSB7CisgICAgaWYgKCFrZXktPnJhbmdlWzIqal0pIGVuZD1sZW47CisKKyAgICAvLyBMb29wIHRocm91Z2ggZmllbGRzCisgICAgZWxzZSB7CisgICAgICBlbmQ9MDsKKyAgICAgIGZvciAoaT0xOyBpIDwga2V5LT5yYW5nZVsyKmpdK2o7IGkrKykgeworCisgICAgICAgIC8vIFNraXAgbGVhZGluZyBibGFua3MKKyAgICAgICAgaWYgKHN0cltlbmRdICYmICFUVC5rZXlfc2VwYXJhdG9yKQorICAgICAgICAgIHdoaWxlIChpc3NwYWNlKHN0cltlbmRdKSkgZW5kKys7CisKKyAgICAgICAgLy8gU2tpcCBib2R5IG9mIGtleQorICAgICAgICBmb3IgKDsgc3RyW2VuZF07IGVuZCsrKSB7CisgICAgICAgICAgaWYgKFRULmtleV9zZXBhcmF0b3IpIHsKKyAgICAgICAgICAgIGlmIChzdHJbZW5kXT09KlRULmtleV9zZXBhcmF0b3IpIGJyZWFrOworICAgICAgICAgIH0gZWxzZSBpZiAoaXNzcGFjZShzdHJbZW5kXSkpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghaikgc3RhcnQ9ZW5kOworICB9CisKKyAgLy8gS2V5IHdpdGggZXhwbGljaXQgc2VwYXJhdG9yIHN0YXJ0cyBhZnRlciB0aGUgc2VwYXJhdG9yCisgIGlmIChUVC5rZXlfc2VwYXJhdG9yICYmIHN0cltzdGFydF09PSpUVC5rZXlfc2VwYXJhdG9yKSBzdGFydCsrOworCisgIC8vIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaWYgbmVjZXNzYXJ5CisgIGlmIChmbGFncyZGTEFHX2IpIHdoaWxlIChpc3NwYWNlKHN0cltzdGFydF0pKSBzdGFydCsrOworICBpZiAoZmxhZ3MmRkxBR19iYikgd2hpbGUgKGVuZD5zdGFydCAmJiBpc3NwYWNlKHN0cltlbmQtMV0pKSBlbmQtLTsKKworICAvLyBIYW5kbGUgb2Zmc2V0cyBvbiBzdGFydCBhbmQgZW5kCisgIGlmIChrZXktPnJhbmdlWzNdKSB7CisgICAgZW5kICs9IGtleS0+cmFuZ2VbM10tMTsKKyAgICBpZiAoZW5kPmxlbikgZW5kPWxlbjsKKyAgfQorICBpZiAoa2V5LT5yYW5nZVsxXSkgeworICAgIHN0YXJ0ICs9IGtleS0+cmFuZ2VbMV0tMTsKKyAgICBpZiAoc3RhcnQ+bGVuKSBzdGFydD1sZW47CisgIH0KKworICAvLyBNYWtlIHRoZSBjb3B5CisgIGlmIChlbmQ8c3RhcnQpIGVuZD1zdGFydDsKKyAgc3RyID0geHN0cm5kdXAoc3RyK3N0YXJ0LCBlbmQtc3RhcnQpOworCisgIC8vIEhhbmRsZSAtZAorICBpZiAoZmxhZ3MmRkxBR19kKSB7CisgICAgZm9yIChzdGFydCA9IGVuZCA9IDA7IHN0cltlbmRdOyBlbmQrKykKKyAgICAgIGlmIChpc3NwYWNlKHN0cltlbmRdKSB8fCBpc2FsbnVtKHN0cltlbmRdKSkgc3RyW3N0YXJ0KytdID0gc3RyW2VuZF07CisgICAgc3RyW3N0YXJ0XSA9IDA7CisgIH0KKworICAvLyBIYW5kbGUgLWkKKyAgaWYgKGZsYWdzJkZMQUdfaSkgeworICAgIGZvciAoc3RhcnQgPSBlbmQgPSAwOyBzdHJbZW5kXTsgZW5kKyspCisgICAgICBpZiAoaXNwcmludChzdHJbZW5kXSkpIHN0cltzdGFydCsrXSA9IHN0cltlbmRdOworICAgIHN0cltzdGFydF0gPSAwOworICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gYXBwZW5kIGEgc29ydF9rZXkgdG8ga2V5X2xpc3QuCisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9rZXkgKmFkZF9rZXkodm9pZCkKK3sKKyAgdm9pZCAqKnN0dXBpZF9jb21waWxlciA9ICZUVC5rZXlfbGlzdDsKKyAgc3RydWN0IHNvcnRfa2V5ICoqcGtleSA9IChzdHJ1Y3Qgc29ydF9rZXkgKiopc3R1cGlkX2NvbXBpbGVyOworCisgIHdoaWxlICgqcGtleSkgcGtleSA9ICYoKCpwa2V5KS0+bmV4dF9rZXkpOworICByZXR1cm4gKnBrZXkgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ydF9rZXkpKTsKK30KKworLy8gUGVyZm9ybSBhY3R1YWwgY29tcGFyaXNvbgorc3RhdGljIGludCBjb21wYXJlX3ZhbHVlcyhpbnQgZmxhZ3MsIGNoYXIgKngsIGNoYXIgKnkpCit7CisgIGludCBmZiA9IGZsYWdzICYgKEZMQUdfbnxGTEFHX2d8RkxBR19NfEZMQUdfeCk7CisKKyAgLy8gQXNjaWkgc29ydAorICBpZiAoIWZmKSByZXR1cm4gKChmbGFncyZGTEFHX2YpID8gc3RyY2FzZWNtcCA6IHN0cmNtcCkoeCwgeSk7CisKKyAgaWYgKENGR19TT1JUX0ZMT0FUICYmIGZmID09IEZMQUdfZykgeworICAgIGNoYXIgKnh4LCp5eTsKKyAgICBkb3VibGUgZHggPSBzdHJ0b2QoeCwmeHgpLCBkeSA9IHN0cnRvZCh5LCZ5eSk7CisgICAgaW50IHhpbmYsIHlpbmY7CisKKyAgICAvLyBub3QgbnVtYmVycyA8IE5hTiA8IC1pbmZpbml0eSA8IG51bWJlcnMgPCAraW5maW5pdHkKKworICAgIGlmICh4PT14eCkgcmV0dXJuIHk9PXl5ID8gMCA6IC0xOworICAgIGlmICh5PT15eSkgcmV0dXJuIDE7CisKKyAgICAvLyBDaGVjayBmb3IgaXNuYW4KKyAgICBpZiAoZHghPWR4KSByZXR1cm4gKGR5IT1keSkgPyAwIDogLTE7CisgICAgaWYgKGR5IT1keSkgcmV0dXJuIDE7CisKKyAgICAvLyBDaGVjayBmb3IgaW5maW5pdHkuICAoQ291bGQgdW5kZXJmbG93LCBidXQgYXZvaWRzIG5lZWRpbmcgbGlibS4pCisgICAgeGluZiA9ICgxLjAvZHggPT0gMC4wKTsKKyAgICB5aW5mID0gKDEuMC9keSA9PSAwLjApOworICAgIGlmICh4aW5mKSB7CisgICAgICBpZihkeDwwKSByZXR1cm4gKHlpbmYgJiYgZHk8MCkgPyAwIDogLTE7CisgICAgICByZXR1cm4gKHlpbmYgJiYgZHk+MCkgPyAwIDogMTsKKyAgICB9CisgICAgaWYgKHlpbmYpIHJldHVybiBkeTwwID8gMSA6IC0xOworCisgICAgcmV0dXJuIGR4PmR5ID8gMSA6IChkeDxkeSA/IC0xIDogMCk7CisgIH0gZWxzZSBpZiAoQ0ZHX1NPUlRfQklHICYmIGZmID09IEZMQUdfTSkgeworICAgIHN0cnVjdCB0bSB0aHltZTsKKyAgICBpbnQgZHg7CisgICAgY2hhciAqeHgsKnl5OworCisgICAgeHggPSBzdHJwdGltZSh4LCIlYiIsJnRoeW1lKTsKKyAgICBkeCA9IHRoeW1lLnRtX21vbjsKKyAgICB5eSA9IHN0cnB0aW1lKHksIiViIiwmdGh5bWUpOworICAgIGlmICgheHgpIHJldHVybiAheXkgPyAwIDogLTE7CisgICAgZWxzZSBpZiAoIXl5KSByZXR1cm4gMTsKKyAgICBlbHNlIHJldHVybiBkeD09dGh5bWUudG1fbW9uID8gMCA6IGR4LXRoeW1lLnRtX21vbjsKKworICB9IGVsc2UgaWYgKENGR19TT1JUX0JJRyAmJiBmZiA9PSBGTEFHX3gpIHsKKyAgICByZXR1cm4gc3RydG9sKHgsIE5VTEwsIDE2KS1zdHJ0b2woeSwgTlVMTCwgMTYpOworICAvLyBUaGlzIGhhcyB0byBiZSBmZiA9PSBGTEFHX24KKyAgfSBlbHNlIHsKKyAgICAvLyBGdWxsIGZsb2F0aW5nIHBvaW50IHZlcnNpb24gb2YgLW4KKyAgICBpZiAoQ0ZHX1NPUlRfRkxPQVQpIHsKKyAgICAgIGRvdWJsZSBkeCA9IGF0b2YoeCksIGR5ID0gYXRvZih5KTsKKworICAgICAgcmV0dXJuIGR4PmR5ID8gMSA6IChkeDxkeSA/IC0xIDogMCk7CisgICAgLy8gSW50ZWdlciB2ZXJzaW9uIG9mIC1uIGZvciB0aW55IHN5c3RlbXMKKyAgICB9IGVsc2UgcmV0dXJuIGF0b2koeCktYXRvaSh5KTsKKyAgfQorfQorCisvLyBDYWxsYmFjayBmcm9tIHFzb3J0KCk6IEl0ZXJhdGUgdGhyb3VnaCBrZXlfbGlzdCBhbmQgcGVyZm9ybSBjb21wYXJpc29ucy4KK3N0YXRpYyBpbnQgY29tcGFyZV9rZXlzKGNvbnN0IHZvaWQgKnhhcmcsIGNvbnN0IHZvaWQgKnlhcmcpCit7CisgIGludCBmbGFncyA9IHRveXMub3B0ZmxhZ3MsIHJldHZhbCA9IDA7CisgIGNoYXIgKngsICp5LCAqeHggPSAqKGNoYXIgKiopeGFyZywgKnl5ID0gKihjaGFyICoqKXlhcmc7CisgIHN0cnVjdCBzb3J0X2tleSAqa2V5OworCisgIGlmIChDRkdfU09SVF9CSUcpIHsKKyAgICBmb3IgKGtleT0oc3RydWN0IHNvcnRfa2V5ICopVFQua2V5X2xpc3Q7ICFyZXR2YWwgJiYga2V5OworICAgICAgIGtleSA9IGtleS0+bmV4dF9rZXkpCisgICAgeworICAgICAgZmxhZ3MgPSBrZXktPmZsYWdzID8ga2V5LT5mbGFncyA6IHRveXMub3B0ZmxhZ3M7CisKKyAgICAgIC8vIENob3Agb3V0IGFuZCBtb2RpZnkga2V5IGNodW5rcywgaGFuZGxpbmcgLWRmaWIKKworICAgICAgeCA9IGdldF9rZXlfZGF0YSh4eCwga2V5LCBmbGFncyk7CisgICAgICB5ID0gZ2V0X2tleV9kYXRhKHl5LCBrZXksIGZsYWdzKTsKKworICAgICAgcmV0dmFsID0gY29tcGFyZV92YWx1ZXMoZmxhZ3MsIHgsIHkpOworCisgICAgICAvLyBGcmVlIHRoZSBjb3BpZXMgZ2V0X2tleV9kYXRhKCkgbWFkZS4KKworICAgICAgaWYgKHggIT0geHgpIGZyZWUoeCk7CisgICAgICBpZiAoeSAhPSB5eSkgZnJlZSh5KTsKKworICAgICAgaWYgKHJldHZhbCkgYnJlYWs7CisgICAgfQorICB9IGVsc2UgcmV0dmFsID0gY29tcGFyZV92YWx1ZXMoZmxhZ3MsIHh4LCB5eSk7CisKKyAgLy8gUGVyZm9ybSBmYWxsYmFjayBzb3J0IGlmIG5lY2Vzc2FyeSAoYWx3YXlzIGNhc2UgaW5zZW5zaXRpdmUsIG5vIC1mLAorICAvLyB0aGUgcG9pbnQgaXMgdG8gZ2V0IGEgc3RhYmxlIG9yZGVyIGV2ZW4gZm9yIC1mIHNvcnRzKQorICBpZiAoIXJldHZhbCAmJiAhKENGR19TT1JUX0JJRyAmJiAodG95cy5vcHRmbGFncyZGTEFHX3MpKSkgeworICAgIGZsYWdzID0gdG95cy5vcHRmbGFnczsKKyAgICByZXR2YWwgPSBzdHJjbXAoeHgsIHl5KTsKKyAgfQorCisgIHJldHVybiByZXR2YWwgKiAoKGZsYWdzJkZMQUdfcikgPyAtMSA6IDEpOworfQorCisvLyBDYWxsYmFjayBmcm9tIGxvb3BmaWxlcyB0byBoYW5kbGUgaW5wdXQgZmlsZXMuCitzdGF0aWMgdm9pZCBzb3J0X3JlYWQoaW50IGZkLCBjaGFyICpuYW1lKQoreworICAvLyBSZWFkIGVhY2ggbGluZSBmcm9tIGZpbGUsIGFwcGVuZGluZyB0byBhIGJpZyBhcnJheS4KKworICBmb3IgKDs7KSB7CisgICAgY2hhciAqIGxpbmUgPSAoQ0ZHX1NPUlRfQklHICYmICh0b3lzLm9wdGZsYWdzJkZMQUdfeikpCisgICAgICAgICAgICAgPyBnZXRfcmF3bGluZShmZCwgTlVMTCwgMCkgOiBnZXRfbGluZShmZCk7CisKKyAgICBpZiAoIWxpbmUpIGJyZWFrOworCisgICAgLy8gaGFuZGxlIC1jIGhlcmUgc28gd2UgZG9uJ3QgYWxsb2NhdGUgbW9yZSBtZW1vcnkgdGhhbiBuZWNlc3NhcnkuCisgICAgaWYgKENGR19TT1JUX0JJRyAmJiAodG95cy5vcHRmbGFncyZGTEFHX2MpKSB7CisgICAgICBpbnQgaiA9ICh0b3lzLm9wdGZsYWdzJkZMQUdfdSkgPyAtMSA6IDA7CisKKyAgICAgIGlmIChUVC5saW5lcyAmJiBjb21wYXJlX2tleXMoKHZvaWQgKikmVFQubGluZXMsICZsaW5lKT5qKQorICAgICAgICBlcnJvcl9leGl0KCIlczogQ2hlY2sgbGluZSAlZFxuIiwgbmFtZSwgVFQubGluZWNvdW50KTsKKyAgICAgIGZyZWUoVFQubGluZXMpOworICAgICAgVFQubGluZXMgPSAoY2hhciAqKilsaW5lOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIShUVC5saW5lY291bnQmNjMpKQorICAgICAgICBUVC5saW5lcyA9IHhyZWFsbG9jKFRULmxpbmVzLCBzaXplb2YoY2hhciAqKSooVFQubGluZWNvdW50KzY0KSk7CisgICAgICBUVC5saW5lc1tUVC5saW5lY291bnRdID0gbGluZTsKKyAgICB9CisgICAgVFQubGluZWNvdW50Kys7CisgIH0KK30KKwordm9pZCBzb3J0X21haW4odm9pZCkKK3sKKyAgaW50IGlkeCwgZmQgPSAxOworCisgIC8vIE9wZW4gb3V0cHV0IGZpbGUgaWYgbmVjZXNzYXJ5LgorICBpZiAoQ0ZHX1NPUlRfQklHICYmIFRULm91dGZpbGUpCisgICAgZmQgPSB4Y3JlYXRlKFRULm91dGZpbGUsIE9fQ1JFQVR8T19UUlVOQ3xPX1dST05MWSwgMDY2Nik7CisKKyAgLy8gUGFyc2UgLWsgc29ydCBrZXlzLgorICBpZiAoQ0ZHX1NPUlRfQklHICYmIFRULnJhd19rZXlzKSB7CisgICAgc3RydWN0IGFyZ19saXN0ICphcmc7CisKKyAgICBmb3IgKGFyZyA9IFRULnJhd19rZXlzOyBhcmc7IGFyZyA9IGFyZy0+bmV4dCkgeworICAgICAgc3RydWN0IHNvcnRfa2V5ICprZXkgPSBhZGRfa2V5KCk7CisgICAgICBjaGFyICp0ZW1wOworICAgICAgaW50IGZsYWc7CisKKyAgICAgIGlkeCA9IDA7CisgICAgICB0ZW1wID0gYXJnLT5hcmc7CisgICAgICB3aGlsZSAoKnRlbXApIHsKKyAgICAgICAgLy8gU3RhcnQgb2YgcmFuZ2UKKyAgICAgICAga2V5LT5yYW5nZVsyKmlkeF0gPSAodW5zaWduZWQpc3RydG9sKHRlbXAsICZ0ZW1wLCAxMCk7CisgICAgICAgIGlmICgqdGVtcD09Jy4nKQorICAgICAgICAgIGtleS0+cmFuZ2VbKDIqaWR4KSsxXSA9ICh1bnNpZ25lZClzdHJ0b2wodGVtcCsxLCAmdGVtcCwgMTApOworCisgICAgICAgIC8vIEhhbmRsZSBmbGFncyBhcHBlbmRlZCB0byBhIGtleSB0eXBlLgorICAgICAgICBmb3IgKDsqdGVtcDt0ZW1wKyspIHsKKyAgICAgICAgICBjaGFyICp0ZW1wMiwgKm9wdGxpc3Q7CisKKyAgICAgICAgICAvLyBOb3RlIHRoYXQgYSBzZWNvbmQgY29tbWEgYmVjb21lcyBhbiAiVW5rbm93biBrZXkiIGVycm9yLgorCisgICAgICAgICAgaWYgKCp0ZW1wPT0nLCcgJiYgIWlkeCsrKSB7CisgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBXaGljaCBmbGFnIGlzIHRoaXM/CisKKyAgICAgICAgICBvcHRsaXN0ID0gdG95cy53aGljaC0+b3B0aW9uczsKKyAgICAgICAgICB0ZW1wMiA9IHN0cmNocihvcHRsaXN0LCAqdGVtcCk7CisgICAgICAgICAgZmxhZyA9ICgxPDwob3B0bGlzdC10ZW1wMitzdHJsZW4ob3B0bGlzdCktMSkpOworCisgICAgICAgICAgLy8gV2FzIGl0IGEgZmxhZyB0aGF0IGNhbiBhcHBseSB0byBhIGtleT8KKworICAgICAgICAgIGlmICghdGVtcDIgfHwgZmxhZz5GTEFHX2IKKyAgICAgICAgICAgIHx8IChmbGFnJihGTEFHX3V8RkxBR19jfEZMQUdfc3xGTEFHX3opKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBlcnJvcl9leGl0KCJVbmtub3duIGtleSBvcHRpb24uIik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGIgYWZ0ZXIgLCBtZWFucyBzdHJpcCBfdHJhaWxpbmdfIHNwYWNlLCBub3QgbGVhZGluZy4KKyAgICAgICAgICBpZiAoaWR4ICYmIGZsYWc9PUZMQUdfYikgZmxhZyA9IEZMQUdfYmI7CisgICAgICAgICAga2V5LT5mbGFncyB8PSBmbGFnOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gZ2xvYmFsIGIgZmxhZyBzdHJpcHMgYm90aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19iKSB0b3lzLm9wdGZsYWdzIHw9IEZMQUdfYmI7CisKKyAgLy8gSWYgbm8ga2V5cywgcGVyZm9ybSBhbHBoYWJldGljIHNvcnQgb3ZlciB0aGUgd2hvbGUgbGluZS4KKyAgaWYgKENGR19TT1JUX0JJRyAmJiAhVFQua2V5X2xpc3QpIGFkZF9rZXkoKS0+cmFuZ2VbMF0gPSAxOworCisgIC8vIE9wZW4gaW5wdXQgZmlsZXMgYW5kIHJlYWQgZGF0YSwgcG9wdWxhdGluZyBUVC5saW5lc1tUVC5saW5lY291bnRdCisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIHNvcnRfcmVhZCk7CisKKyAgLy8gVGhlIGNvbXBhcmUgKC1jKSBsb2dpYyB3YXMgaGFuZGxlZCBpbiBzb3J0X3JlYWQoKSwKKyAgLy8gc28gaWYgd2UgZ290IGhlcmUsIHdlJ3JlIGRvbmUuCisgIGlmIChDRkdfU09SVF9CSUcgJiYgKHRveXMub3B0ZmxhZ3MmRkxBR19jKSkgZ290byBleGl0X25vdzsKKworICAvLyBQZXJmb3JtIHRoZSBhY3R1YWwgc29ydAorICBxc29ydChUVC5saW5lcywgVFQubGluZWNvdW50LCBzaXplb2YoY2hhciAqKSwgY29tcGFyZV9rZXlzKTsKKworICAvLyBoYW5kbGUgdW5pcXVlICgtdSkKKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR191KSB7CisgICAgaW50IGpkeDsKKworICAgIGZvciAoamR4PTAsIGlkeD0xOyBpZHg8VFQubGluZWNvdW50OyBpZHgrKykgeworICAgICAgaWYgKCFjb21wYXJlX2tleXMoJlRULmxpbmVzW2pkeF0sICZUVC5saW5lc1tpZHhdKSkKKyAgICAgICAgZnJlZShUVC5saW5lc1tpZHhdKTsKKyAgICAgIGVsc2UgVFQubGluZXNbKytqZHhdID0gVFQubGluZXNbaWR4XTsKKyAgICB9CisgICAgaWYgKFRULmxpbmVjb3VudCkgVFQubGluZWNvdW50ID0gamR4KzE7CisgIH0KKworICAvLyBPdXRwdXQgcmVzdWx0CisgIGZvciAoaWR4ID0gMDsgaWR4PFRULmxpbmVjb3VudDsgaWR4KyspIHsKKyAgICBjaGFyICpzID0gVFQubGluZXNbaWR4XTsKKyAgICB1bnNpZ25lZCBpID0gc3RybGVuKHMpOworCisgICAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3opKSBzW2ldID0gJ1xuJzsKKyAgICB4d3JpdGUoZmQsIHMsIGkrMSk7CisgICAgaWYgKENGR19UT1lCT1hfRlJFRSkgZnJlZShzKTsKKyAgfQorCitleGl0X25vdzoKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGlmIChmZCAhPSAxKSBjbG9zZShmZCk7CisgICAgZnJlZShUVC5saW5lcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3NwbGl0LmMgYi90b3lib3gvdG95cy9wb3NpeC9zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWE0MTQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC9zcGxpdC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBzcGxpdC5jIC0gc3BsaXQgYSBmaWxlIGludG8gc21hbGxlciBmaWxlcworICoKKyAqIENvcHlyaWdodCAyMDEzIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9zcGxpdC5odG1sCisgKgorICogU3RhbmRhcmQgZG9lcyBub3QgY292ZXI6CisgKiAtIHNob3VsZCBzcGxpdHRpbmcgYW4gZW1wdHkgZmlsZSBwcm9kdWNlIGFuIGVtcHR5IG91dGZpbGU/IChXZW50IHdpdGggIm5vIi4pCisgKiAtIHBlcm1pc3Npb25zIG9uIG91dHB1dCBmaWxlCisKK1VTRV9TUExJVChORVdUT1koc3BsaXQsICI+MmEjPDE9Mj45YiM8MWwjPDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBTUExJVAorICBib29sICJzcGxpdCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogc3BsaXQgWy1hIFNVRkZJWF9MRU5dIFstYiBCWVRFU10gWy1sIExJTkVTXSBbSU5QVVQgW09VVFBVVF1dCisKKyAgICBDb3B5IElOUFVUIChvciBzdGRpbikgZGF0YSB0byBhIHNlcmllcyBvZiBPVVRQVVQgKG9yICJ4IikgZmlsZXMgd2l0aAorICAgIGFscGhhYmV0aWNhbGx5IGluY3JlYXNpbmcgc3VmZml4IChhYSwgYWIsIGFjLi4uIGF6LCBiYSwgYmIuLi4pLgorCisgICAgLWEJU3VmZml4IGxlbmd0aCAoZGVmYXVsdCAyKQorICAgIC1iCUJZVEVTL2ZpbGUgKDEwLCAxMGssIDEwbSwgMTBnLi4uKQorICAgIC1sCUxJTkVTL2ZpbGUgKGRlZmF1bHQgMTAwMCkKKyovCisKKyNkZWZpbmUgRk9SX3NwbGl0CisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBsb25nIGxpbmVzOworICBsb25nIGJ5dGVzOworICBsb25nIHN1ZmxlbjsKKworICBjaGFyICpvdXRmaWxlOworKQorCitzdGF0aWMgdm9pZCBkb19zcGxpdChpbnQgaW5mZCwgY2hhciAqaW4pCit7CisgIHVuc2lnbmVkIGxvbmcgYnl0ZXNsZWZ0LCBsaW5lc2xlZnQsIGZpbGVudW0sIGxlbiwgcG9zOworICBpbnQgb3V0ZmQgPSAtMTsKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgLy8gcG9zaXggZG9lc24ndCBjb3ZlciBwZXJtaXNzaW9ucyBvbiBvdXRwdXQgZmlsZSwgc28gY29weSBpbnB1dCAob3IgMDc3NykKKyAgc3Quc3RfbW9kZSA9IDA3Nzc7CisgIGZzdGF0KGluZmQsICZzdCk7CisKKyAgbGVuID0gcG9zID0gZmlsZW51bSA9IGJ5dGVzbGVmdCA9IGxpbmVzbGVmdCA9IDA7CisgIGZvciAoOzspIHsKKyAgICBpbnQgaSwgajsKKworICAgIC8vIFJlZmlsbCB0b3lidWY/CisgICAgaWYgKGxlbiA9PSBwb3MpIHsKKyAgICAgIGlmICghKGxlbiA9IHhyZWFkKGluZmQsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpKSkgYnJlYWs7CisgICAgICBwb3MgPSAwOworICAgIH0KKworICAgIC8vIFN0YXJ0IG5ldyBvdXRwdXQgZmlsZT8KKyAgICBpZiAoKFRULmJ5dGVzICYmICFieXRlc2xlZnQpIHx8IChUVC5saW5lcyAmJiAhbGluZXNsZWZ0KSkgeworICAgICAgY2hhciAqcyA9IFRULm91dGZpbGUgKyBzdHJsZW4oVFQub3V0ZmlsZSk7CisKKyAgICAgIGogPSBmaWxlbnVtKys7CisgICAgICBmb3IgKGkgPSAwOyBpPFRULnN1ZmxlbjsgaSsrKSB7CisgICAgICAgICooLS1zKSA9ICdhJysoaiUyNik7CisgICAgICAgIGogLz0gMjY7CisgICAgICB9CisgICAgICBpZiAoaikgZXJyb3JfZXhpdCgiYmFkIHN1ZmZpeCIpOworICAgICAgYnl0ZXNsZWZ0ID0gVFQuYnl0ZXM7CisgICAgICBsaW5lc2xlZnQgPSBUVC5saW5lczsKKyAgICAgIGlmIChvdXRmZCAhPSAtMSkgY2xvc2Uob3V0ZmQpOworICAgICAgb3V0ZmQgPSB4Y3JlYXRlKFRULm91dGZpbGUsIE9fUkRXUnxPX0NSRUFUfE9fVFJVTkMsIHN0LnN0X21vZGUgJiAwNzc3KTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBuZXh0IGNodW5rIG9mIG91dHB1dC4KKyAgICBpZiAoVFQubGluZXMpIHsKKyAgICAgIGZvciAoaSA9IHBvczsgaSA8IGxlbjsgKSB7CisgICAgICAgIGlmICh0b3lidWZbaSsrXSA9PSAnXG4nICYmICEtLWxpbmVzbGVmdCkgYnJlYWs7CisgICAgICAgIGlmICghLS1ieXRlc2xlZnQpIGJyZWFrOworICAgICAgfQorICAgICAgaiA9IGkgLSBwb3M7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBsZW4gLSBwb3M7CisgICAgICBpZiAoaiA+IGJ5dGVzbGVmdCkgaiA9IGJ5dGVzbGVmdDsKKyAgICAgIGJ5dGVzbGVmdCAtPSBqOworICAgIH0KKyAgICB4d3JpdGUob3V0ZmQsIHRveWJ1Zitwb3MsIGopOworICAgIHBvcyArPSBqOworICB9CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGlmIChvdXRmZCAhPSAtMSkgY2xvc2Uob3V0ZmQpOworICAgIGlmIChpbmZkKSBjbG9zZShpbmZkKTsKKyAgICBmcmVlKFRULm91dGZpbGUpOworICB9CisgIHhleGl0KCk7Cit9CisKK3ZvaWQgc3BsaXRfbWFpbih2b2lkKQoreworICBpZiAoIVRULmJ5dGVzICYmICFUVC5saW5lcykgVFQubGluZXMgPSAxMDAwOworCisgIC8vIEFsbG9jYXRlIHRlbXBsYXRlIGZvciBvdXRwdXQgZmlsZW5hbWVzCisgIFRULm91dGZpbGUgPSB4bXByaW50ZigiJXMlKmMiLCAodG95cy5vcHRjID09IDIpID8gdG95cy5vcHRhcmdzWzFdIDogIngiLAorICAgIChpbnQpVFQuc3VmbGVuLCAnICcpOworCisgIC8vIFdlIG9ubHkgZXZlciB1c2Ugb25lIGlucHV0LCBidXQgdGhpcyBoYW5kbGVzICctJyBvciBubyBpbnB1dCBmb3IgdXMuCisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX3NwbGl0KTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3N0cmluZ3MuYyBiL3RveWJveC90b3lzL3Bvc2l4L3N0cmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NlNzBjCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgvc3RyaW5ncy5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qc3RyaW5ncy5jIC0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMuCisgKgorICogQ29weXJpZ2h0IDIwMTQgS3l1bmctc3UgS2ltIDxrYXNweXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IDIwMTQgS3l1bmd3YW4gSGFuIDxhc3VyYTMyMUBnbWFpbC5jb20+CisgKgorICogTm8gU3RhbmRhcmQKKyAqIFRPRE86IHV0Zjggc3RyaW5ncworICogVE9ETzogcG9zaXggLXQKKworVVNFX1NUUklOR1MoTkVXVE9ZKHN0cmluZ3MsICJhbiM9NDwxZm8iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBTVFJJTkdTCisgIGJvb2wgInN0cmluZ3MiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHN0cmluZ3MgWy1mb10gWy1uIExFTl0gW0ZJTEUuLi5dCisKKyAgICBEaXNwbGF5IHByaW50YWJsZSBzdHJpbmdzIGluIGEgYmluYXJ5IGZpbGUKKworICAgIC1mCVByZWNlZGUgc3RyaW5ncyB3aXRoIGZpbGVuYW1lcworICAgIC1uCUF0IGxlYXN0IExFTiBjaGFyYWN0ZXJzIGZvcm0gYSBzdHJpbmcgKGRlZmF1bHQgNCkKKyAgICAtbwlQcmVjZWRlIHN0cmluZ3Mgd2l0aCBkZWNpbWFsIG9mZnNldHMKKyovCisKKyNkZWZpbmUgRk9SX3N0cmluZ3MKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgbnVtOworKQorCitzdGF0aWMgdm9pZCBkb19zdHJpbmdzKGludCBmZCwgY2hhciAqZmlsZW5hbWUpCit7CisgIGludCBucmVhZCwgaSwgd2xlbiA9IFRULm51bSwgY291bnQgPSAwOworICBvZmZfdCBvZmZzZXQgPSAwOworICBjaGFyICpzdHJpbmcgPSB4emFsbG9jKHdsZW4gKyAxKTsKKworICBmb3IgKDs7KSB7CisgICAgbnJlYWQgPSByZWFkKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAobnJlYWQgPCAwKSBwZXJyb3JfbXNnX3JhdyhmaWxlbmFtZSk7CisgICAgaWYgKG5yZWFkIDwgMSkgYnJlYWs7CisgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyBpKyssIG9mZnNldCsrKSB7CisgICAgICBpZiAoKCh0b3lidWZbaV0gPj0gMzIpICYmICh0b3lidWZbaV0gPD0gMTI2KSkgfHwgKHRveWJ1ZltpXSA9PSAnXHQnKSkgeworICAgICAgICBpZiAoY291bnQgPT0gd2xlbikgZnB1dGModG95YnVmW2ldLCBzdGRvdXQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzdHJpbmdbY291bnQrK10gPSB0b3lidWZbaV07CisgICAgICAgICAgaWYgKGNvdW50ID09IHdsZW4pIHsKKyAgICAgICAgICAgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19mKSBwcmludGYoIiVzOiAiLCBmaWxlbmFtZSk7CisgICAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfbykKKyAgICAgICAgICAgICAgcHJpbnRmKCIlN2xsZCAiLChsb25nIGxvbmcpKG9mZnNldCAtIHdsZW4pKTsKKyAgICAgICAgICAgIHByaW50ZigiJXMiLCBzdHJpbmcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvdW50ID09IHdsZW4pIHhwdXRjKCdcbicpOworICAgICAgICBjb3VudCA9IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHhjbG9zZShmZCk7CisgIGZyZWUoc3RyaW5nKTsKK30KKwordm9pZCBzdHJpbmdzX21haW4odm9pZCkKK3sKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fc3RyaW5ncyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC90YWlsLmMgYi90b3lib3gvdG95cy9wb3NpeC90YWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3ZTExNgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3RhaWwuYwpAQCAtMCwwICsxLDI3MCBAQAorLyogdGFpbC5jIC0gY29weSBsYXN0IGxpbmVzIGZyb20gaW5wdXQgdG8gc3Rkb3V0LgorICoKKyAqIENvcHlyaWdodCAyMDEyIFRpbW90aHkgRWxsaW90dCA8dGxlQGhvbHltb25rZXkuY29tPgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3RhaWwuaHRtbAorICoKKyAqIERldmlhdGlvbnMgZnJvbSBwb3NpeDogLWYgd2FpdHMgZm9yIHBpcGUvZmlmbyBvbiBzdGRpbiAobm9uYmxvY2s/KS4KKworVVNFX1RBSUwoTkVXVE9ZKHRhaWwsICI/ZmMtbi1bLWNuXSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRBSUwKKyAgYm9vbCAidGFpbCIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogdGFpbCBbLW58YyBOVU1CRVJdIFstZl0gW0ZJTEUuLi5dCisKKyAgICBDb3B5IGxhc3QgbGluZXMgZnJvbSBmaWxlcyB0byBzdGRvdXQuIElmIG5vIGZpbGVzIGxpc3RlZCwgY29weSBmcm9tCisgICAgc3RkaW4uIEZpbGVuYW1lICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZGluLgorCisgICAgLW4Jb3V0cHV0IHRoZSBsYXN0IE5VTUJFUiBsaW5lcyAoZGVmYXVsdCAxMCksICtYIGNvdW50cyBmcm9tIHN0YXJ0LgorICAgIC1jCW91dHB1dCB0aGUgbGFzdCBOVU1CRVIgYnl0ZXMsICtOVU1CRVIgY291bnRzIGZyb20gc3RhcnQKKyAgICAtZglmb2xsb3cgRklMRShzKSwgd2FpdGluZyBmb3IgbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkCisKK2NvbmZpZyBUQUlMX1NFRUsKKyAgYm9vbCAidGFpbCBzZWVrIHN1cHBvcnQiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRBSUwKKyAgaGVscAorICAgIFRoaXMgdmVyc2lvbiB1c2VzIGxzZWVrLCB3aGljaCBpcyBmYXN0ZXIgb24gbGFyZ2UgZmlsZXMuCisqLworCisjZGVmaW5lIEZPUl90YWlsCisjaW5jbHVkZSAidG95cy5oIgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisKK0dMT0JBTFMoCisgIGxvbmcgbGluZXM7CisgIGxvbmcgYnl0ZXM7CisKKyAgaW50IGZpbGVfbm8sIGZmZCwgKmZpbGVzOworKQorCitzdHJ1Y3QgbGluZV9saXN0IHsKKyAgc3RydWN0IGxpbmVfbGlzdCAqbmV4dCwgKnByZXY7CisgIGNoYXIgKmRhdGE7CisgIGludCBsZW47Cit9OworCitzdGF0aWMgc3RydWN0IGxpbmVfbGlzdCAqZ2V0X2NodW5rKGludCBmZCwgaW50IGxlbikKK3sKKyAgc3RydWN0IGxpbmVfbGlzdCAqbGluZSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW5lX2xpc3QpK2xlbik7CisKKyAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihzdHJ1Y3QgbGluZV9saXN0KSk7CisgIGxpbmUtPmRhdGEgPSAoKGNoYXIgKilsaW5lKSArIHNpemVvZihzdHJ1Y3QgbGluZV9saXN0KTsKKyAgbGluZS0+bGVuID0gcmVhZGFsbChmZCwgbGluZS0+ZGF0YSwgbGVuKTsKKworICBpZiAobGluZS0+bGVuIDwgMSkgeworICAgIGZyZWUobGluZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gbGluZTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jaHVuayh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBsaW5lX2xpc3QgKmxpc3QgPSBwdHI7CisKKyAgeHdyaXRlKDEsIGxpc3QtPmRhdGEsIGxpc3QtPmxlbik7CisgIGZyZWUobGlzdCk7Cit9CisKKy8vIFJlYWRpbmcgdGhyb3VnaCB2ZXJ5IGxhcmdlIGZpbGVzIGlzIHNsb3cuICBVc2luZyBsc2VlayBjYW4gc3BlZWQgdGhpbmdzCisvLyB1cCBhIGxvdCwgYnV0IGlzbid0IGFwcGxpY2FibGUgdG8gYWxsIGlucHV0IChjYXQgfCB0YWlsKS4KKy8vIE5vdGU6IGJ5dGVzIGFuZCBsaW5lcyBhcmUgbmVnYXRpdmUgaGVyZS4KK3N0YXRpYyBpbnQgdHJ5X2xzZWVrKGludCBmZCwgbG9uZyBieXRlcywgbG9uZyBsaW5lcykKK3sKKyAgc3RydWN0IGxpbmVfbGlzdCAqbGlzdCA9IDAsICp0ZW1wOworICBpbnQgZmxhZyA9IDAsIGNodW5rID0gc2l6ZW9mKHRveWJ1Zik7CisgIG9mZl90IHBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisKKyAgLy8gSWYgbHNlZWsoKSBkb2Vzbid0IHdvcmsgb24gdGhpcyBzdHJlYW0sIHJldHVybiBub3cuCisgIGlmIChwb3M8MCkgcmV0dXJuIDA7CisKKyAgLy8gU2VlayB0byB0aGUgcmlnaHQgc3BvdCwgb3V0cHV0IGRhdGEgZnJvbSB0aGVyZS4KKyAgaWYgKGJ5dGVzKSB7CisgICAgaWYgKGxzZWVrKGZkLCBieXRlcywgU0VFS19FTkQpPDApIGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisgICAgeHNlbmRmaWxlKGZkLCAxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIFJlYWQgZnJvbSBlbmQgdG8gZmluZCBlbm91Z2ggbGluZXMsIHRoZW4gb3V0cHV0IHRoZW0uCisKKyAgYnl0ZXMgPSBwb3M7CisgIHdoaWxlIChsaW5lcyAmJiBwb3MpIHsKKyAgICBpbnQgb2Zmc2V0OworCisgICAgLy8gUmVhZCBpbiBuZXh0IGNodW5rIGZyb20gZW5kIG9mIGZpbGUKKyAgICBpZiAoY2h1bms+cG9zKSBjaHVuayA9IHBvczsKKyAgICBwb3MgLT0gY2h1bms7CisgICAgaWYgKHBvcyAhPSBsc2VlayhmZCwgcG9zLCBTRUVLX1NFVCkpIHsKKyAgICAgIHBlcnJvcl9tc2coInNlZWsgZmFpbGVkIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCEodGVtcCA9IGdldF9jaHVuayhmZCwgY2h1bmspKSkgYnJlYWs7CisgICAgdGVtcC0+bmV4dCA9IGxpc3Q7CisgICAgbGlzdCA9IHRlbXA7CisKKyAgICAvLyBDb3VudCBuZXdsaW5lcyBpbiB0aGlzIGNodW5rLgorICAgIG9mZnNldCA9IGxpc3QtPmxlbjsKKyAgICB3aGlsZSAob2Zmc2V0LS0pIHsKKyAgICAgIC8vIElmIHRoZSBsYXN0IGxpbmUgZW5kcyB3aXRoIGEgbmV3bGluZSwgdGhhdCBvbmUgZG9lc24ndCBjb3VudC4KKyAgICAgIGlmICghZmxhZykgZmxhZysrOworCisgICAgICAvLyBTdGFydCBvdXRwdXR0aW5nIGRhdGEgcmlnaHQgYWZ0ZXIgbmV3bGluZQorICAgICAgZWxzZSBpZiAobGlzdC0+ZGF0YVtvZmZzZXRdID09ICdcbicgJiYgISsrbGluZXMpIHsKKyAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIGxpc3QtPmRhdGEgKz0gb2Zmc2V0OworICAgICAgICBsaXN0LT5sZW4gLT0gb2Zmc2V0OworCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE91dHB1dCBzdG9yZWQgZGF0YQorICBsbGlzdF90cmF2ZXJzZShsaXN0LCBkdW1wX2NodW5rKTsKKworICAvLyBJbiBjYXNlIG9mIC1mCisgIGxzZWVrKGZkLCBieXRlcywgU0VFS19TRVQpOworICByZXR1cm4gMTsKK30KKworLy8gQ2FsbGVkIGZvciBlYWNoIGZpbGUgbGlzdGVkIG9uIGNvbW1hbmQgbGluZSwgYW5kL29yIHN0ZGluCitzdGF0aWMgdm9pZCBkb190YWlsKGludCBmZCwgY2hhciAqbmFtZSkKK3sKKyAgbG9uZyBieXRlcyA9IFRULmJ5dGVzLCBsaW5lcyA9IFRULmxpbmVzOworICBpbnQgbGluZXBvcCA9IDE7CisKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpIHsKKyAgICBpbnQgZiA9IFRULmZpbGVfbm8qMjsKKyAgICBjaGFyICpzID0gbmFtZTsKKworICAgIGlmICghZmQpIHNwcmludGYocyA9IHRveWJ1ZiwgIi9wcm9jL3NlbGYvZmQvJWQiLCBmZCk7CisgICAgVFQuZmlsZXNbZisrXSA9IGZkOworICAgIGlmICgwID4gKFRULmZpbGVzW2ZdID0gaW5vdGlmeV9hZGRfd2F0Y2goVFQuZmZkLCBzLCBJTl9NT0RJRlkpKSkKKyAgICAgIHBlcnJvcl9tc2coImJhZCAtZiBvbiAnJXMnIiwgbmFtZSk7CisgIH0KKworICBpZiAoVFQuZmlsZV9ubysrKSB4cHV0YygnXG4nKTsKKyAgaWYgKHRveXMub3B0YyA+IDEpIHhwcmludGYoIj09PiAlcyA8PT1cbiIsIG5hbWUpOworCisgIC8vIEFyZSB3ZSBtZWFzdXJpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBmaWxlPworCisgIGlmIChieXRlczwwIHx8IGxpbmVzPDApIHsKKyAgICBzdHJ1Y3QgbGluZV9saXN0ICpsaXN0ID0gMCwgKm5ldzsKKworICAgIC8vIFRoZSBzbG93IGNvZGVwYXRoIGlzIGFsd2F5cyBuZWVkZWQsIGFuZCBjYW4gaGFuZGxlIGFsbCBpbnB1dCwKKyAgICAvLyBzbyBtYWtlIGxzZWVrIHN1cHBvcnQgb3B0aW9uYWwuCisgICAgaWYgKENGR19UQUlMX1NFRUsgJiYgdHJ5X2xzZWVrKGZkLCBieXRlcywgbGluZXMpKSByZXR1cm47CisKKyAgICAvLyBSZWFkIGRhdGEgdW50aWwgd2UgcnVuIG91dCwga2VlcCBhIHRyYWlsaW5nIGJ1ZmZlcgorICAgIGZvciAoOzspIHsKKyAgICAgIC8vIFJlYWQgbmV4dCBwYWdlIG9mIGRhdGEsIGFwcGVuZGluZyB0byBsaW5rZWQgbGlzdCBpbiBvcmRlcgorICAgICAgaWYgKCEobmV3ID0gZ2V0X2NodW5rKGZkLCBzaXplb2YodG95YnVmKSkpKSBicmVhazsKKyAgICAgIGRsaXN0X2FkZF9ub21hbGxvYygodm9pZCAqKSZsaXN0LCAodm9pZCAqKW5ldyk7CisKKyAgICAgIC8vIElmIHRyYWNpbmcgYnl0ZXMsIGFkZCB1bnRpbCB3ZSBoYXZlIGVub3VnaCwgZGlzY2FyZGluZyBvdmVyZmxvdy4KKyAgICAgIGlmIChUVC5ieXRlcykgeworICAgICAgICBieXRlcyArPSBuZXctPmxlbjsKKyAgICAgICAgaWYgKGJ5dGVzID4gMCkgeworICAgICAgICAgIHdoaWxlIChsaXN0LT5sZW4gPD0gYnl0ZXMpIHsKKyAgICAgICAgICAgIGJ5dGVzIC09IGxpc3QtPmxlbjsKKyAgICAgICAgICAgIGZyZWUoZGxpc3RfcG9wKCZsaXN0KSk7CisgICAgICAgICAgfQorICAgICAgICAgIGxpc3QtPmRhdGEgKz0gYnl0ZXM7CisgICAgICAgICAgbGlzdC0+bGVuIC09IGJ5dGVzOworICAgICAgICAgIGJ5dGVzID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGxlbiA9IG5ldy0+bGVuLCBjb3VudDsKKyAgICAgICAgY2hhciAqdHJ5ID0gbmV3LT5kYXRhOworCisgICAgICAgIC8vIEZpcnN0IGNoYXJhY3RlciBfYWZ0ZXJfIGEgbmV3bGluZSBzdGFydHMgYSBuZXcgbGluZSwgd2hpY2gKKyAgICAgICAgLy8gd29ya3MgZXZlbiBpZiBmaWxlIGRvZXNuJ3QgZW5kIHdpdGggYSBuZXdsaW5lCisgICAgICAgIGZvciAoY291bnQ9MDsgY291bnQ8bGVuOyBjb3VudCsrKSB7CisgICAgICAgICAgaWYgKGxpbmVwb3ApIGxpbmVzKys7CisgICAgICAgICAgbGluZXBvcCA9IHRyeVtjb3VudF0gPT0gJ1xuJzsKKworICAgICAgICAgIGlmIChsaW5lcyA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgYzsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICBjID0gKmxpc3QtPmRhdGE7CisgICAgICAgICAgICAgIGlmICghLS0obGlzdC0+bGVuKSkgZnJlZShkbGlzdF9wb3AoJmxpc3QpKTsKKyAgICAgICAgICAgICAgZWxzZSBsaXN0LT5kYXRhKys7CisgICAgICAgICAgICB9IHdoaWxlIChjICE9ICdcbicpOworICAgICAgICAgICAgbGluZXMtLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQvZnJlZSB0aGUgYnVmZmVyLgorICAgIGxsaXN0X3RyYXZlcnNlKGxpc3QsIGR1bXBfY2h1bmspOworCisgIC8vIE1lYXN1cmluZyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgIH0gZWxzZSBmb3IgKDs7KSB7CisgICAgaW50IGxlbiwgb2Zmc2V0ID0gMDsKKworICAgIC8vIEVycm9yIHdoaWxlIHJlYWRpbmcgZG9lcyBub3QgZXhpdC4gIEVycm9yIHdyaXRpbmcgZG9lcy4KKyAgICBsZW4gPSByZWFkKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKTsKKyAgICBpZiAobGVuPDEpIGJyZWFrOworICAgIHdoaWxlIChieXRlcyA+IDEgfHwgbGluZXMgPiAxKSB7CisgICAgICBieXRlcy0tOworICAgICAgaWYgKHRveWJ1ZltvZmZzZXQrK10gPT0gJ1xuJykgbGluZXMtLTsKKyAgICAgIGlmIChvZmZzZXQgPj0gbGVuKSBicmVhazsKKyAgICB9CisgICAgaWYgKG9mZnNldDxsZW4pIHh3cml0ZSgxLCB0b3lidWYrb2Zmc2V0LCBsZW4tb2Zmc2V0KTsKKyAgfQorfQorCit2b2lkIHRhaWxfbWFpbih2b2lkKQoreworICBjaGFyICoqYXJncyA9IHRveXMub3B0YXJnczsKKworICBpZiAoISh0b3lzLm9wdGZsYWdzJihGTEFHX258RkxBR19jKSkpIHsKKyAgICBjaGFyICphcmcgPSAqYXJnczsKKworICAgIC8vIGhhbmRsZSBvbGQgIi00MiIgc3R5bGUgYXJndW1lbnRzCisgICAgaWYgKGFyZyAmJiAqYXJnID09ICctJyAmJiBhcmdbMV0pIHsKKyAgICAgIFRULmxpbmVzID0gYXRvbHgoKihhcmdzKyspKTsKKyAgICAgIHRveXMub3B0Yy0tOworICAgIH0gZWxzZSB7CisgICAgICAvLyBpZiBub3RoaW5nIHNwZWNpZmllZCwgZGVmYXVsdCAtbiB0byAtMTAKKyAgICAgIFRULmxpbmVzID0gLTEwOworICAgIH0KKyAgfQorCisgIC8vIEFsbG9jYXRlIDIgaW50cyBwZXIgb3B0YXJnIGZvciAtZgorICBpZiAodG95cy5vcHRmbGFncyZGTEFHX2YpIHsKKyAgICBpZiAoKFRULmZmZCA9IGlub3RpZnlfaW5pdCgpKSA8IDApIHBlcnJvcl9leGl0KCJpbm90aWZ5X2luaXQiKTsKKyAgICBUVC5maWxlcyA9IHhtYWxsb2ModG95cy5vcHRjKjgpOworICB9CisgIGxvb3BmaWxlc19ydyhhcmdzLCBPX1JET05MWXwoT19DTE9FWEVDKiEodG95cy5vcHRmbGFncyZGTEFHX2YpKSwKKyAgICAwLCAwLCBkb190YWlsKTsKKworICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2YpICYmIFRULmZpbGVfbm8pIHsKKyAgICBpbnQgbGVuLCBsYXN0X2ZkID0gVFQuZmlsZXNbKFRULmZpbGVfbm8tMSkqMl0sIGksIGZkOworICAgIHN0cnVjdCBpbm90aWZ5X2V2ZW50IGV2OworCisgICAgZm9yICg7OykgeworICAgICAgaWYgKHNpemVvZihldikhPXJlYWQoVFQuZmZkLCAmZXYsIHNpemVvZihldikpKSBwZXJyb3JfZXhpdCgiaW5vdGlmeSIpOworCisgICAgICBmb3IgKGkgPSAwOyBpPFRULmZpbGVfbm8gJiYgZXYud2QhPVRULmZpbGVzWyhpKjIpKzFdOyBpKyspOworICAgICAgaWYgKGk9PVRULmZpbGVfbm8pIGNvbnRpbnVlOworICAgICAgZmQgPSBUVC5maWxlc1tpKjJdOworCisgICAgICAvLyBSZWFkIG5ldyBkYXRhLgorICAgICAgd2hpbGUgKChsZW4gPSByZWFkKGZkLCB0b3lidWYsIHNpemVvZih0b3lidWYpKSk+MCkgeworICAgICAgICBpZiAobGFzdF9mZCAhPSBmZCkgeworICAgICAgICAgIGxhc3RfZmQgPSBmZDsKKyAgICAgICAgICB4cHJpbnRmKCJcbj09PiAlcyA8PT1cbiIsIGFyZ3NbaV0pOworICAgICAgICB9CisKKyAgICAgICAgeHdyaXRlKDEsIHRveWJ1ZiwgbGVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3RlZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvdGVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1OTFiNgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3RlZS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIHRlZS5jIC0gY2F0IHRvIG11bHRpcGxlIG91dHB1dHMuCisgKgorICogQ29weXJpZ2h0IDIwMDggUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90ZWUuaHRtbAorCitVU0VfVEVFKE5FV1RPWSh0ZWUsICJpYSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRFRQorICBib29sICJ0ZWUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHRlZSBbLWFpXSBbZmlsZS4uLl0KKworICAgIENvcHkgc3RkaW4gdG8gZWFjaCBsaXN0ZWQgZmlsZSwgYW5kIGFsc28gdG8gc3Rkb3V0LgorICAgIEZpbGVuYW1lICItIiBpcyBhIHN5bm9ueW0gZm9yIHN0ZG91dC4KKworICAgIC1hCWFwcGVuZCB0byBmaWxlcy4KKyAgICAtaQlpZ25vcmUgU0lHSU5ULgorKi8KKworI2RlZmluZSBGT1JfdGVlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICB2b2lkICpvdXRwdXRzOworKQorCitzdHJ1Y3QgZmRfbGlzdCB7CisgIHN0cnVjdCBmZF9saXN0ICpuZXh0OworICBpbnQgZmQ7Cit9OworCisvLyBPcGVuIGVhY2ggb3V0cHV0IGZpbGUsIHNhdmluZyBmaWxlaGFuZGxlcyB0byBhIGxpbmtlZCBsaXN0LgorCitzdGF0aWMgdm9pZCBkb190ZWVfb3BlbihpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBmZF9saXN0ICp0ZW1wOworCisgIHRlbXAgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmRfbGlzdCkpOworICB0ZW1wLT5uZXh0ID0gVFQub3V0cHV0czsKKyAgdGVtcC0+ZmQgPSBmZDsKKyAgVFQub3V0cHV0cyA9IHRlbXA7Cit9CisKK3ZvaWQgdGVlX21haW4odm9pZCkKK3sKKyAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpIHhzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKworICAvLyBPcGVuIG91dHB1dCBmaWxlcworICBsb29wZmlsZXNfcncodG95cy5vcHRhcmdzLAorICAgIE9fUkRXUnxPX0NSRUFUfCgodG95cy5vcHRmbGFncyAmIEZMQUdfYSk/T19BUFBFTkQ6T19UUlVOQyksCisgICAgMDY2NiwgMCwgZG9fdGVlX29wZW4pOworCisgIGZvciAoOzspIHsKKyAgICBzdHJ1Y3QgZmRfbGlzdCAqZmRsOworICAgIGludCBsZW47CisKKyAgICAvLyBSZWFkIGRhdGEgZnJvbSBzdGRpbgorICAgIGxlbiA9IHhyZWFkKDAsIHRveWJ1Ziwgc2l6ZW9mKHRveWJ1ZikpOworICAgIGlmIChsZW48MSkgYnJlYWs7CisKKyAgICAvLyBXcml0ZSBkYXRhIHRvIGVhY2ggb3V0cHV0IGZpbGUsIHBsdXMgc3Rkb3V0LgorICAgIGZkbCA9IFRULm91dHB1dHM7CisgICAgZm9yICg7OykgeworICAgICAgaWYobGVuICE9IHdyaXRlYWxsKGZkbCA/IGZkbC0+ZmQgOiAxLCB0b3lidWYsIGxlbikpIHRveXMuZXhpdHZhbD0xOworICAgICAgaWYgKCFmZGwpIGJyZWFrOworICAgICAgZmRsID0gZmRsLT5uZXh0OworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvdGltZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTE4MjYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC90aW1lLmMKQEAgLTAsMCArMSw0OSBAQAorLyogdGltZS5jIC0gdGltZSBhIHNpbXBsZSBjb21tYW5kCisgKgorICogQ29weXJpZ2h0IDIwMTMgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3RpbWUuaHRtbAorCitVU0VfVElNRShORVdUT1kodGltZSwgIjwxXnAiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBUSU1FCisgIGJvb2wgInRpbWUiCisgIGRlZmF1bHQgeQorICBkZXBlbmRzIG9uIFRPWUJPWF9GTE9BVAorICBoZWxwCisgICAgdXNhZ2U6IHRpbWUgWy1wXSBDT01NQU5EIFtBUkdTLi4uXQorCisgICAgUnVuIGNvbW1hbmQgbGluZSBhbmQgcmVwb3J0IHJlYWwsIHVzZXIsIGFuZCBzeXN0ZW0gdGltZSBlbGFwc2VkIGluIHNlY29uZHMuCisgICAgKHJlYWwgPSBjbG9jayBvbiB0aGUgd2FsbCwgdXNlciA9IGNwdSB1c2VkIGJ5IGNvbW1hbmQncyBjb2RlLAorICAgIHN5c3RlbSA9IGNwdSB1c2VkIGJ5IE9TIG9uIGJlaGFsZiBvZiBjb21tYW5kLikKKworICAgIC1wCXBvc2l4IG1vZGUgKGlnbm9yZWQpCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHRpbWVfbWFpbih2b2lkKQoreworICBwaWRfdCBwaWQ7CisgIHN0cnVjdCB0aW1ldmFsIHR2LCB0djI7CisKKyAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgIGlmICghKHBpZCA9IFhWRk9SSygpKSkgeGV4ZWModG95cy5vcHRhcmdzKTsKKyAgZWxzZSB7CisgICAgaW50IHN0YXQ7CisgICAgc3RydWN0IHJ1c2FnZSBydTsKKyAgICBmbG9hdCByLCB1LCBzOworCisgICAgd2FpdDQocGlkLCAmc3RhdCwgMCwgJnJ1KTsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2MiwgTlVMTCk7CisgICAgaWYgKHR2LnR2X3VzZWMgPiB0djIudHZfdXNlYykgeworICAgICAgdHYyLnR2X3VzZWMgKz0gMTAwMDAwMDsKKyAgICAgIHR2Mi50dl9zZWMtLTsKKyAgICB9CisgICAgciA9ICh0djIudHZfc2VjLXR2LnR2X3NlYykrKCh0djIudHZfdXNlYy10di50dl91c2VjKS8xMDAwMDAwLjApOworICAgIHUgPSBydS5ydV91dGltZS50dl9zZWMrKHJ1LnJ1X3V0aW1lLnR2X3VzZWMvMTAwMDAwMC4wKTsKKyAgICBzID0gcnUucnVfc3RpbWUudHZfc2VjKyhydS5ydV9zdGltZS50dl91c2VjLzEwMDAwMDAuMCk7CisgICAgZnByaW50ZihzdGRlcnIsICJyZWFsICVmXG51c2VyICVmXG5zeXMgJWZcbiIsIHIsIHUsIHMpOworICAgIHRveXMuZXhpdHZhbCA9IFdJRkVYSVRFRChzdGF0KSA/IFdFWElUU1RBVFVTKHN0YXQpIDogV1RFUk1TSUcoc3RhdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3RvdWNoLmMgYi90b3lib3gvdG95cy9wb3NpeC90b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2RkNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC90b3VjaC5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiB0b3VjaC5jIDogY2hhbmdlIHRpbWVzdGFtcCBvZiBhIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBDaG91YmV5IEppIDx3YXJpb3IubGludXhAZ21haWwuY29tPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdG91Y2guaHRtbAorICoKKyAqIFRPRE86IGhhdmUgYW5vdGhlciBnbyBhdCBtZXJnaW5nIHRoZSAtdCBhbmQgLWQgc3RhbnphcworCitVU0VfVE9VQ0goTkVXVE9ZKHRvdWNoLCAiYWNkOm1yOnQ6aFshZHRyXSIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIFRPVUNICisgIGJvb2wgInRvdWNoIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB0b3VjaCBbLWFtY2hdIFstZCBEQVRFXSBbLXQgVElNRV0gWy1yIEZJTEVdIEZJTEUuLi4KKworICAgIFVwZGF0ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgb2YgZWFjaCBGSUxFIHRvIHRoZSBjdXJyZW50IHRpbWUuCisKKyAgICAtYQljaGFuZ2UgYWNjZXNzIHRpbWUKKyAgICAtbQljaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUKKyAgICAtYwlkb24ndCBjcmVhdGUgZmlsZQorICAgIC1oCWNoYW5nZSBzeW1saW5rCisgICAgLWQJc2V0IHRpbWUgdG8gREFURSAoaW4gWVlZWS1NTS1ERFRoaDptbTpTU1suZnJhY11bdHpdIGZvcm1hdCkKKyAgICAtdAlzZXQgdGltZSB0byBUSU1FIChpbiBbW0NDXVlZXU1NRERoaG1tWy5zc11bZnJhY10gZm9ybWF0KQorICAgIC1yCXNldCB0aW1lIHNhbWUgYXMgcmVmZXJlbmNlIEZJTEUKKyovCisKKyNkZWZpbmUgRk9SX3RvdWNoCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICp0aW1lOworICBjaGFyICpmaWxlOworICBjaGFyICpkYXRlOworKQorCit2b2lkIHRvdWNoX21haW4odm9pZCkKK3sKKyAgc3RydWN0IHRpbWVzcGVjIHRzWzJdOworICBjaGFyICoqc3M7CisgIGludCBmZCwgaTsKKworICAvLyB1c2UgY3VycmVudCB0aW1lIGlmIG5vIC10IG9yIC1kCisgIHRzWzBdLnR2X25zZWMgPSBVVElNRV9OT1c7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgKEZMQUdfdHxGTEFHX2QpKSB7CisgICAgY2hhciAqcywgKmRhdGU7CisgICAgc3RydWN0IHRtIHRtOworICAgIGludCBsZW4gPSAwOworCisgICAgbG9jYWx0aW1lX3IoJih0cy0+dHZfc2VjKSwgJnRtKTsKKworICAgIC8vIFNldCB0aW1lIGZyb20gLWQ/CisKKyAgICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfZCkgeworICAgICAgZGF0ZSA9IFRULmRhdGU7CisgICAgICBpID0gc3RybGVuKGRhdGUpOworICAgICAgaWYgKGkpIHsKKyAgICAgICAgLy8gVHJhaWxpbmcgWiBtZWFucyBVVEMgdGltZXpvbmUsIGRvbid0IGV4cGVjdCBsaWJjIHRvIGtub3cgdGhpcy4KKyAgICAgICAgaWYgKHRvdXBwZXIoZGF0ZVtpLTFdKT09J1onKSB7CisgICAgICAgICAgZGF0ZVtpLTFdID0gMDsKKyAgICAgICAgICBzZXRlbnYoIlRaIiwgIlVUQzAiLCAxKTsKKyAgICAgICAgICBsb2NhbHRpbWVfcigmKHRzLT50dl9zZWMpLCAmdG0pOworICAgICAgICB9CisgICAgICAgIHMgPSBzdHJwdGltZShkYXRlLCAiJVktJW0tJWRUJVQiLCAmdG0pOworICAgICAgICB0cy0+dHZfbnNlYyA9IDA7CisgICAgICAgIGlmIChzICYmICpzPT0nLicgJiYgaXNkaWdpdChzWzFdKSkgCisgICAgICAgICAgc3NjYW5mKHMsICIuJWx1JW4iLCAmdHMtPnR2X25zZWMsICZsZW4pOworICAgICAgICBlbHNlIGxlbiA9IDA7CisgICAgICB9IGVsc2UgcyA9IDA7CisKKyAgICAvLyBTZXQgdGltZSBmcm9tIC10PworCisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmNweSh0b3lidWYsICIlWSVtJWQlSCVNIik7CisgICAgICBkYXRlID0gVFQudGltZTsKKyAgICAgIGkgPSAoKHMgPSBzdHJjaHIoZGF0ZSwgJy4nKSkpID8gcy1kYXRlIDogc3RybGVuKGRhdGUpOworICAgICAgaWYgKGkgPCA4IHx8IGklMikgZXJyb3JfZXhpdCgiYmFkICclcyciLCBkYXRlKTsKKyAgICAgIGZvciAoaT0wO2k8MztpKyspIHsKKyAgICAgICAgcyA9IHN0cnB0aW1lKGRhdGUsIHRveWJ1ZisoaSYyKSwgJnRtKTsKKyAgICAgICAgaWYgKHMpIGJyZWFrOworICAgICAgICB0b3lidWZbMV09J3knOworICAgICAgfQorICAgICAgdG0udG1fc2VjID0gMDsKKyAgICAgIHRzLT50dl9uc2VjID0gMDsKKyAgICAgIGlmIChzICYmICpzPT0nLicgJiYgc3NjYW5mKHMsICIuJTJ1JW4iLCAmKHRtLnRtX3NlYyksICZsZW4pID09IDEpIHsKKyAgICAgICAgaWYgKHNzY2FuZihzICs9IGxlbiwgIiVsdSVuIiwgJnRzLT50dl9uc2VjLCAmbGVuKSA9PSAxKSB7CisgICAgICAgICAgcy0tOworICAgICAgICAgIGxlbisrOworICAgICAgICB9IGVsc2UgbGVuID0gMDsKKyAgICAgIH0gZWxzZSBsZW4gPSAwOworICAgIH0KKyAgICBpZiAobGVuKSB7CisgICAgICBzICs9IGxlbjsKKyAgICAgIGlmICh0cy0+dHZfbnNlYyA+IDk5OTk5OTk5OSkgcyA9IDA7CisgICAgICBlbHNlIHdoaWxlIChsZW4rKyA8IDEwKSB0cy0+dHZfbnNlYyAqPSAxMDsKKyAgICB9CisKKyAgICBlcnJubyA9IDA7CisgICAgdHMtPnR2X3NlYyA9IG1rdGltZSgmdG0pOworICAgIGlmICghcyB8fCAqcyB8fCB0cy0+dHZfc2VjID09IC0xKSBwZXJyb3JfZXhpdCgiYmFkICclcyciLCBkYXRlKTsKKyAgfQorICB0c1sxXT10c1swXTsKKworICAvLyBTZXQgdGltZSBmcm9tIC1yPworCisgIGlmIChUVC5maWxlKSB7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICB4c3RhdChUVC5maWxlLCAmc3QpOworICAgIHRzWzBdID0gc3Quc3RfYXRpbTsKKyAgICB0c1sxXSA9IHN0LnN0X210aW07CisgIH0KKworICAvLyBXaGljaCB0aW1lKHMpIHNob3VsZCB3ZSBhY3R1YWxseSBjaGFuZ2U/CisgIGkgPSB0b3lzLm9wdGZsYWdzICYgKEZMQUdfYXxGTEFHX20pOworICBpZiAoaSAmJiBpIT0oRkxBR19hfEZMQUdfbSkpIHRzW2k9PUZMQUdfbV0udHZfbnNlYyA9IFVUSU1FX09NSVQ7CisKKyAgLy8gTG9vcCB0aHJvdWdoIGZpbGVzIG9uIGNvbW1hbmQgbGluZQorICBmb3IgKHNzID0gdG95cy5vcHRhcmdzOyAqc3M7KSB7CisKKyAgICAvLyBjaGVhdDogRkxBR19oIGlzIHJpZ2h0bW9zdCBmbGFnLCBzbyBpdHMgdmFsdWUgaXMgMQorICAgIGlmICghdXRpbWVuc2F0KEFUX0ZEQ1dELCAqc3MsIHRzLAorICAgICAgICAodG95cy5vcHRmbGFncyAmIEZMQUdfaCkqQVRfU1lNTElOS19OT0ZPTExPVykpIHNzKys7CisgICAgZWxzZSBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgc3MrKzsKKyAgICBlbHNlIGlmIChhY2Nlc3MoKnNzLCBGX09LKSAmJiAoLTEhPShmZCA9IG9wZW4oKnNzLCBPX0NSRUFULCAwNjY2KSkpKQorICAgICAgY2xvc2UoZmQpOworICAgIGVsc2UgcGVycm9yX21zZygiJyVzJyIsICpzcysrKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvdHJ1ZS5jIGIvdG95Ym94L3RveXMvcG9zaXgvdHJ1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDNiODIKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC90cnVlLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdHJ1ZS5jIC0gUmV0dXJuIHplcm8uCisgKgorICogQ29weXJpZ2h0IDIwMDcgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90cnVlLmh0bWwKKworVVNFX1RSVUUoTkVXVE9ZKHRydWUsIE5VTEwsIFRPWUZMQUdfQklOfFRPWUZMQUdfTk9IRUxQKSkKK1VTRV9UUlVFKE9MRFRPWSg6LCB0cnVlLCBUT1lGTEFHX05PRk9SS3xUT1lGTEFHX05PSEVMUCkpCisKK2NvbmZpZyBUUlVFCisgIGJvb2wgInRydWUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgUmV0dXJuIHplcm8uCisqLworCisjaW5jbHVkZSAidG95cy5oIgorCit2b2lkIHRydWVfbWFpbih2b2lkKQoreworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC90dHkuYyBiL3RveWJveC90b3lzL3Bvc2l4L3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTRkODQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC90dHkuYwpAQCAtMCwwICsxLDMyIEBACisvKiB0dHkuYyAtIFNob3cgc3RkaW4ncyB0ZXJtaW5hbCBuYW1lCisgKgorICogQ29weXJpZ2h0IDIwMTEgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90dHkuaHRtbAorCitVU0VfVFRZKE5FV1RPWSh0dHksICJzIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgVFRZCisgIGJvb2wgInR0eSIKKyAgZGVmYXVsdCB5CisgIGhlbHAKKyAgICB1c2FnZTogdHR5IFstc10KKworICAgIFNob3cgZmlsZW5hbWUgb2YgdGVybWluYWwgY29ubmVjdGVkIHRvIHN0ZGluLgorCisgICAgUHJpbnRzICJub3QgYSB0dHkiIGFuZCBleGl0cyB3aXRoIG5vbnplcm8gc3RhdHVzIGlmIG5vIHRlcm1pbmFsCisgICAgaXMgY29ubmVjdGVkIHRvIHN0ZGluLgorCisgICAgLXMJc2lsZW50LCBleGl0IGNvZGUgb25seQorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB0dHlfbWFpbih2b2lkKQoreworICBjaGFyICp0dHkgPSB0dHluYW1lKDApOworCisgIGlmICghdG95cy5vcHRmbGFncykgcHV0cyh0dHkgPyB0dHkgOiAibm90IGEgdHR5Iik7CisKKyAgdG95cy5leGl0dmFsID0gIXR0eTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3VsaW1pdC5jIGIvdG95Ym94L3RveXMvcG9zaXgvdWxpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlZGQyYwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3VsaW1pdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiB1bGltaXQuYyAtIE1vZGlmeSByZXNvdXJjZSBsaW1pdHMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdWxpbWl0Lmh0bWwKKyAqIEFuZCBtYW4gcHJsaW1pdCgyKS4KKyAqCisgKiBEZXZpYXRpb25zIGZyb20gcG9zaXg6IFRoZSB1bml0cyBvbiAtZiBhcmUgc3VwcG9zZWQgdG8gYmUgNTEyIGJ5dGUKKyAqICJibG9ja3MiIChubyBvdGhlciBvcHRpb25zIGFyZSBzcGVjaWZpZWQsIGFuZCBldmVuIGhhcmQgZHJpdmVzIGRvbid0CisgKiBkbyB0aGF0IGFueW1vcmUpLiBCYXNoIHVzZXMgMTAyNCBieXRlIGJsb2Nrcywgc28gdGhleSBkb24ndCBjYXJlIGVpdGhlci4KKyAqIFdlIGNvbnNpc3RlbnRseSB1c2UgYnl0ZXMgZXZlcnl3aGVyZSB3ZSBjYW4uCisgKgorICogRGV2aWF0aW9ucyBmcm9tIGJhc2g6IFNpemVzIGFyZSBpbiBieXRlcyAoaW5zdGVhZCBvZiAtcCA1MTIgYW5kIC1mIDEwMjQpLgorICogQmFzaCdzIC1wIHZhbHVlIGhhcyBiZWVuIHdyb25nIHNpbmNlIDIwMTAgKGdpdCAzNWYzZDE0ZGJiYzUpLgorICogVGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiBvZiBSTElNSVRfTE9DS1MgKC14KSB3YXMgcmVtb3ZlZCBmcm9tIExpbnV4IGluCisgKiAyMDAzLiBCYXNoIG5ldmVyIGltcGxlbWVudGVkIC1iIChpdCdzIGluIHRoZSBoZWxwIGJ1dCB1bnJlY29nbml6ZWQgYXQKKyAqIHJ1bnRpbWUpLiBXZSBzdXBwb3J0IC1QIHRvIGFmZmVjdCBwcm9jZXNzZXMgb3RoZXIgdGhhbiB1cy4KKworVVNFX1VMSU1JVChORVdUT1kodWxpbWl0LCAiPjFQIzwxU0hhdnV0c3JScXBubWxpZmVkY1stU0hdWyFhcHZ1dHNyUnFubWxpZmVkY10iLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBVTElNSVQKKyAgYm9vbCAidWxpbWl0IgorICBkZWZhdWx0IHkKKyAgZGVwZW5kcyBvbiBUT1lCT1hfUFJMSU1JVAorICBoZWxwCisgICAgdXNhZ2U6IHVsaW1pdCBbLVAgUElEXSBbLVNIUmFjZGVmaWxtbnBxcnN0dXZdIFtMSU1JVF0KKworICAgIFByaW50IG9yIHNldCByZXNvdXJjZSBsaW1pdHMgZm9yIHByb2Nlc3MgbnVtYmVyIFBJRC4gSWYgbm8gTElNSVQgc3BlY2lmaWVkCisgICAgKG9yIHJlYWQtb25seSAtYXAgc2VsZWN0ZWQpIGRpc3BsYXkgY3VycmVudCB2YWx1ZSAoc2l6ZXMgaW4gYnl0ZXMpLgorICAgIERlZmF1bHQgaXMgdWxpbWl0IC1QICRQUElEIC1TZiIgKHNob3cgc29mdCBmaWxlc2l6ZSBvZiB5b3VyIHNoZWxsKS4KKyAgICAKKyAgICAtUyAgU2V0L3Nob3cgc29mdCBsaW1pdCAgICAgICAgICAtSCAgU2V0L3Nob3cgaGFyZCAobWF4aW11bSkgbGltaXQKKyAgICAtYSAgU2hvdyBhbGwgbGltaXRzICAgICAgICAgICAgICAtYyAgQ29yZSBmaWxlIHNpemUKKyAgICAtZCAgUHJvY2VzcyBkYXRhIHNlZ21lbnQgICAgICAgICAtZSAgTWF4IHNjaGVkdWxpbmcgcHJpb3JpdHkKKyAgICAtZiAgT3V0cHV0IGZpbGUgc2l6ZSAgICAgICAgICAgICAtaSAgUGVuZGluZyBzaWduYWwgY291bnQKKyAgICAtbCAgTG9ja2VkIG1lbW9yeSAgICAgICAgICAgICAgICAtbSAgUmVzaWRlbnQgU2V0IFNpemUKKyAgICAtbiAgTnVtYmVyIG9mIG9wZW4gZmlsZXMgICAgICAgICAtcCAgUGlwZSBidWZmZXIKKyAgICAtcSAgUG9zaXggbWVzc2FnZSBxdWV1ZSAgICAgICAgICAtciAgTWF4IFJlYWwtdGltZSBwcmlvcml0eQorICAgIC1SICBSZWFsdGltZSBsYXRlbmN5ICh1c2VjKSAgICAgIC1zICBTdGFjayBzaXplCisgICAgLXQgIFRvdGFsIENQVSB0aW1lIChpbiBzZWNvbmRzKSAgLXUgIE1heGltdW0gcHJvY2Vzc2VzICh1bmRlciB0aGlzIFVJRCkKKyAgICAtdiAgVmlydHVhbCBtZW1vcnkgc2l6ZSAgICAgICAgICAtUCAgUElEIHRvIGFmZmVjdCAoZGVmYXVsdCAkUFBJRCkKKyovCisKKyNkZWZpbmUgRk9SX3VsaW1pdAorI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgbG9uZyBwaWQ7CispCisKKy8vIFRoaXMgaXMgYSBsaW51eCBrZXJuZWwgc3lzY2FsbCBhZGRlZCBpbiAyLjYuMzYgKGdpdCBjMDIyYTBhY2FkNTMpIHdoaWNoCisvLyBnbGliYyBvbmx5IGV4cG9ydHMgYSB3cmFwcGVyIHByb3RvdHlwZSBmb3IgaWYgeW91ICNkZWZpbmUgX0ZTRl9IVVJEX1JVTFpFLgoraW50IHBybGltaXQocGlkX3QgcGlkLCBpbnQgcmVzb3VyY2UsIGNvbnN0IHN0cnVjdCBybGltaXQgKm5ld19saW1pdCwKKyAgc3RydWN0IHJsaW1pdCAqb2xkX2xpbWl0KTsKKworLy8gSSdkIGxpa2UgdG8gc29ydCB0aGUgUkxJTUlUIHZhbHVlcyAwLTE1LCBidXQgbWlwcywgYWxwaGEgYW5kIHNwYXJjCisvLyBvdmVycmlkZSB0aGUgYXNtLWdlbmVyaWMgdmFsdWVzIGZvciA1LTkuIEFsc28sIHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24KKy8vIG9mIFJMSU1JVF9MT0NLUyAoLXgpIHdhcyByZW1vdmVkIGZyb20gTGludXggaW4gMjAwMy4KK3ZvaWQgdWxpbWl0X21haW4odm9pZCkKK3sKKyAgc3RydWN0IHJsaW1pdCBycjsKKyAgaW50IGk7CisgIC8vIE9yZGVyIGlzIGNkZWZpbG1ucVJyc3R1dgorICBjaGFyIG1hcFtdID0ge1JMSU1JVF9DT1JFLCBSTElNSVRfREFUQSwgUkxJTUlUX05JQ0UsIFJMSU1JVF9GU0laRSwKKyAgICAgICAgICAgICAgICBSTElNSVRfU0lHUEVORElORywgUkxJTUlUX01FTUxPQ0ssIFJMSU1JVF9SU1MsIFJMSU1JVF9OT0ZJTEUsIDAsCisgICAgICAgICAgICAgICAgUkxJTUlUX01TR1FVRVVFLCBSTElNSVRfUlRUSU1FLCBSTElNSVRfUlRQUklPLCBSTElNSVRfU1RBQ0ssCisgICAgICAgICAgICAgICAgUkxJTUlUX0NQVSwgUkxJTUlUX05QUk9DLCBSTElNSVRfQVN9OworCisgIGlmICghKHRveXMub3B0ZmxhZ3MmKEZMQUdfSC0xKSkpIHRveXMub3B0ZmxhZ3MgfD0gRkxBR19mOworICBpZiAoKHRveXMub3B0ZmxhZ3MmKEZMQUdfYXxGTEFHX3ApKSAmJiB0b3lzLm9wdGMpIGVycm9yX2V4aXQoImNhbid0IHNldCAtYXAiKTsKKworICAvLyBGZXRjaCBkYXRhCisgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19QKSkgVFQucGlkID0gZ2V0cHBpZCgpOworCisgIGZvciAoaT0wOyBpPHNpemVvZihtYXApOyBpKyspIHsKKyAgICBjaGFyICpmbGFncz0iY2RlZmlsbW5wcVJyc3R1diI7CisKKyAgICBpbnQgZ2V0ID0gdG95cy5vcHRmbGFncyYoRkxBR19hfCgxPDxpKSk7CisKKyAgICBpZiAoZ2V0ICYmIHBybGltaXQoVFQucGlkLCBtYXBbaV0sIDAsICZycikpIHBlcnJvcl9leGl0KCItJWMiLCBmbGFnc1tpXSk7CisgICAgaWYgKCF0b3lzLm9wdGMpIHsKKyAgICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfYSkgcHJpbnRmKCItJWM6ICIsIGZsYWdzW2ldKTsKKyAgICAgIGlmIChnZXQpIHsKKyAgICAgICAgaWYgKCgxPDxpKSZGTEFHX3ApIHsKKyAgICAgICAgICBpZiAodG95cy5vcHRmbGFncyZGTEFHX0gpCisgICAgICAgICAgICB4cmVhZGZpbGUoIi9wcm9jL3N5cy9mcy9waXBlLW1heC1zaXplIiwgdG95YnVmLCBzaXplb2YodG95YnVmKSk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgcHBbMl07CisKKyAgICAgICAgICAgIHhwaXBlKHBwKTsKKyAgICAgICAgICAgIHNwcmludGYodG95YnVmLCAiJWRcbiIsIGZjbnRsKCpwcCwgRl9HRVRQSVBFX1NaKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiJXMiLCB0b3lidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJsaW1fdCBybCA9ICh0b3lzLm9wdGZsYWdzJkZMQUdfSCkgPyByci5ybGltX21heCA6IHJyLnJsaW1fY3VyOworCisgICAgICAgICAgaWYgKHJsID09IFJMSU1fSU5GSU5JVFkpIHByaW50ZigidW5saW1pdGVkXG4iKTsKKyAgICAgICAgICBlbHNlIHByaW50ZigiJWxkXG4iLCAobG9uZylybCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRveXMub3B0ZmxhZ3MmKDE8PGkpKSBicmVhazsKKyAgfQorCisgIGlmICh0b3lzLm9wdGZsYWdzJihGTEFHX2F8RkxBR19wKSkgcmV0dXJuOworCisgIGlmICh0b3lzLm9wdGMpIHsKKyAgICBybGltX3QgdmFsOworCisgICAgaWYgKHRvbG93ZXIoKip0b3lzLm9wdGFyZ3MpID09ICd1JykgdmFsID0gUkxJTV9JTkZJTklUWTsKKyAgICBlbHNlIHZhbCA9IGF0b2x4X3JhbmdlKCp0b3lzLm9wdGFyZ3MsIDAsIExPTkdfTUFYKTsKKworICAgIGlmICh0b3lzLm9wdGZsYWdzJkZMQUdfSCkgcnIucmxpbV9tYXggPSB2YWw7CisgICAgZWxzZSByci5ybGltX2N1ciA9IHZhbDsKKyAgICBpZiAocHJsaW1pdChUVC5waWQsIG1hcFtpXSwgJnJyLCAwKSkgcGVycm9yX2V4aXQoMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3VuYW1lLmMgYi90b3lib3gvdG95cy9wb3NpeC91bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTdkMzgKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC91bmFtZS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIHVuYW1lLmMgLSByZXR1cm4gc3lzdGVtIG5hbWUKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFNlZSBodHRwOi8vb3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3VuYW1lLmh0bWwKKworVVNFX1VOQU1FKE5FV1RPWSh1bmFtZSwgIm9hbXZybnNbK29zXSIsIFRPWUZMQUdfQklOKSkKKworY29uZmlnIFVOQU1FCisgIGJvb2wgInVuYW1lIgorICBkZWZhdWx0IHkKKyAgaGVscAorICAgIHVzYWdlOiB1bmFtZSBbLWFzbnJ2bV0KKworICAgIFByaW50IHN5c3RlbSBpbmZvcm1hdGlvbi4KKworICAgIC1zCVN5c3RlbSBuYW1lCisgICAgLW4JTmV0d29yayAoZG9tYWluKSBuYW1lCisgICAgLXIJS2VybmVsIFJlbGVhc2UgbnVtYmVyCisgICAgLXYJS2VybmVsIFZlcnNpb24gCisgICAgLW0JTWFjaGluZSAoaGFyZHdhcmUpIG5hbWUKKyAgICAtYQlBbGwgb2YgdGhlIGFib3ZlCisqLworCisjZGVmaW5lIEZPUl91bmFtZQorI2luY2x1ZGUgInRveXMuaCIKKworLy8gSWYgYSAzMiBiaXQgeDg2IGJ1aWxkIGVudmlyb25tZW50IHdvcmtpbmcgaW4gYSBjaHJvb3QgdW5kZXIgYW4geDg2LTY0CisvLyBrZXJuZWwgcmV0dXJucyB4ODZfNjQgZm9yIC1tIGl0IGNvbmZ1c2VzIC4vY29uZmlndXJlLiAgU3BlY2lhbCBjYXNlIGl0LgorCisjaWYgZGVmaW5lZChfX2k2ODZfXykKKyNkZWZpbmUgR1JPU1MgImk2ODYiCisjZWxpZiBkZWZpbmVkKF9faTU4Nl9fKQorI2RlZmluZSBHUk9TUyAiaTU4NiIKKyNlbGlmIGRlZmluZWQoX19pNDg2X18pCisjZGVmaW5lIEdST1NTICJpNDg2IgorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgR1JPU1MgImkzODYiCisjZW5kaWYKKwordm9pZCB1bmFtZV9tYWluKHZvaWQpCit7CisgIGludCBpLCBmbGFncyA9IHRveXMub3B0ZmxhZ3MsIG5lZWRzcGFjZT0wOworCisgIHVuYW1lKCh2b2lkICopdG95YnVmKTsKKworICBpZiAoIWZsYWdzKSBmbGFncyA9IEZMQUdfczsKKyAgZm9yIChpPTA7IGk8NTsgaSsrKSB7CisgICAgY2hhciAqYyA9IHRveWJ1ZisoNjUqaSk7CisKKyAgICBpZiAoZmxhZ3MgJiAoKDE8PGkpfEZMQUdfYSkpIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4oYyk7CisKKyAgICAgIC8vIFRoaXMgcHJvYmxlbSBvcmlnaW5hdGVzIGluIGF1dG9jb25mLCBzbyBvZiBjb3Vyc2UgdGhlIHNvbHV0aW9uCisgICAgICAvLyBpcyBob3JyaWJseSB1Z2x5LgorI2lmZGVmIEdST1NTCisgICAgICBpZiAoaT09NCAmJiAhc3RyY21wKGMsIng4Nl82NCIpKSB7CisgICAgICAgIHByaW50ZihHUk9TUyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChuZWVkc3BhY2UrKykgeworICAgICAgICAvLyBXZSBjYW4ndCBkZWNyZW1lbnQgb24gdGhlIGZpcnN0IGVudHJ5LCBiZWNhdXNlCisgICAgICAgIC8vIG5lZWRzcGFjZSB3b3VsZCBiZSAwCisgICAgICAgICooLS1jKT0nICc7CisgICAgICAgIGxlbisrOworICAgICAgfQorICAgICAgeHdyaXRlKDEsIGMsIGxlbik7CisgICAgfQorICB9CisgIHB1dGNoYXIoJ1xuJyk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC91bmlxLmMgYi90b3lib3gvdG95cy9wb3NpeC91bmlxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyN2NmZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3VuaXEuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogdW5pcS5jIC0gcmVwb3J0IG9yIGZpbHRlciBvdXQgcmVwZWF0ZWQgbGluZXMgaW4gYSBmaWxlCisgKgorICogQ29weXJpZ2h0IDIwMTIgR2VvcmdpIENob3JiYWR6aGl5c2tpIDxnZW9yZ2lAdW5peHNvbC5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdW5pcS5odG1sCisKK1VTRV9VTklRKE5FV1RPWSh1bmlxLCAiZiNzI3cjemljZHUiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBVTklRCisgIGJvb2wgInVuaXEiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHVuaXEgWy1jZHVpel0gWy13IG1heGNoYXJzXSBbLWYgZmllbGRzXSBbLXMgY2hhcl0gW2lucHV0X2ZpbGUgW291dHB1dF9maWxlXV0KKworICAgIFJlcG9ydCBvciBmaWx0ZXIgb3V0IHJlcGVhdGVkIGxpbmVzIGluIGEgZmlsZQorCisgICAgLWMJc2hvdyBjb3VudHMgYmVmb3JlIGVhY2ggbGluZQorICAgIC1kCXNob3cgb25seSBsaW5lcyB0aGF0IGFyZSByZXBlYXRlZAorICAgIC11CXNob3cgb25seSBsaW5lcyB0aGF0IGFyZSB1bmlxdWUKKyAgICAtaQlpZ25vcmUgY2FzZSB3aGVuIGNvbXBhcmluZyBsaW5lcworICAgIC16CWxpbmVzIGVuZCB3aXRoIFwwIG5vdCBcbgorICAgIC13CWNvbXBhcmUgbWF4aW11bSBYIGNoYXJzIHBlciBsaW5lCisgICAgLWYJaWdub3JlIGZpcnN0IFggZmllbGRzCisgICAgLXMJaWdub3JlIGZpcnN0IFggY2hhcnMKKyovCisKKyNkZWZpbmUgRk9SX3VuaXEKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgbWF4Y2hhcnM7CisgIGxvbmcgbmNoYXJzOworICBsb25nIG5maWVsZHM7CisgIGxvbmcgcmVwZWF0czsKKykKKworc3RhdGljIGNoYXIgKnNraXAoY2hhciAqc3RyKQoreworICBsb25nIG5jaGFycyA9IFRULm5jaGFycywgbmZpZWxkczsKKworICAvLyBTa2lwIGZpZWxkcyBmaXJzdAorICBmb3IgKG5maWVsZHMgPSBUVC5uZmllbGRzOyBuZmllbGRzOyBzdHIrKykgeworICAgIHdoaWxlICgqc3RyICYmIGlzc3BhY2UoKnN0cikpIHN0cisrOworICAgIHdoaWxlICgqc3RyICYmICFpc3NwYWNlKCpzdHIpKSBzdHIrKzsKKyAgICBuZmllbGRzLS07CisgIH0KKyAgLy8gU2tpcCBjaGFycworICB3aGlsZSAoKnN0ciAmJiBuY2hhcnMtLSkgc3RyKys7CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbGluZShGSUxFICpmLCBjaGFyICpsaW5lKQoreworICBpZiAodG95cy5vcHRmbGFncyAmIChUVC5yZXBlYXRzID8gRkxBR191IDogRkxBR19kKSkgcmV0dXJuOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgZnByaW50ZihmLCAiJTdsdSAiLCBUVC5yZXBlYXRzICsgMSk7CisgIGZwdXRzKGxpbmUsIGYpOworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfeikgZnB1dGMoMCwgZik7Cit9CisKK3ZvaWQgdW5pcV9tYWluKHZvaWQpCit7CisgIEZJTEUgKmluZmlsZSA9IHN0ZGluLCAqb3V0ZmlsZSA9IHN0ZG91dDsKKyAgY2hhciAqdGhpc2xpbmUgPSBOVUxMLCAqcHJldmxpbmUgPSBOVUxMLCAqdG1wbGluZSwgZW9sID0gJ1xuJzsKKyAgc2l6ZV90IHRoaXNzaXplLCBwcmV2c2l6ZSA9IDAsIHRtcHNpemU7CisKKyAgaWYgKHRveXMub3B0YyA+PSAxKSBpbmZpbGUgPSB4Zm9wZW4odG95cy5vcHRhcmdzWzBdLCAiciIpOworICBpZiAodG95cy5vcHRjID49IDIpIG91dGZpbGUgPSB4Zm9wZW4odG95cy5vcHRhcmdzWzFdLCAidyIpOworCisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR196KSBlb2wgPSAwOworCisgIC8vIElmIGZpcnN0IGxpbmUgY2FuJ3QgYmUgcmVhZAorICBpZiAoZ2V0ZGVsaW0oJnByZXZsaW5lLCAmcHJldnNpemUsIGVvbCwgaW5maWxlKSA8IDApCisgICAgcmV0dXJuOworCisgIHdoaWxlIChnZXRkZWxpbSgmdGhpc2xpbmUsICZ0aGlzc2l6ZSwgZW9sLCBpbmZpbGUpID4gMCkgeworICAgIGludCBkaWZmOworICAgIGNoYXIgKnQxLCAqdDI7CisKKyAgICAvLyBJZiByZXF1ZXN0ZWQgZ2V0IHRoZSBjaG9zZW4gZmllbGRzICsgY2hhcmFjdGVyIG9mZnNldHMuCisgICAgaWYgKFRULm5maWVsZHMgfHwgVFQubmNoYXJzKSB7CisgICAgICB0MSA9IHNraXAodGhpc2xpbmUpOworICAgICAgdDIgPSBza2lwKHByZXZsaW5lKTsKKyAgICB9IGVsc2UgeworICAgICAgdDEgPSB0aGlzbGluZTsKKyAgICAgIHQyID0gcHJldmxpbmU7CisgICAgfQorCisgICAgaWYgKFRULm1heGNoYXJzID09IDApIHsKKyAgICAgIGRpZmYgPSAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpID8gc3RyY21wKHQxLCB0MikgOiBzdHJjYXNlY21wKHQxLCB0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpZmYgPSAhKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2kpID8gc3RybmNtcCh0MSwgdDIsIFRULm1heGNoYXJzKQorICAgICAgICAgICAgICA6IHN0cm5jYXNlY21wKHQxLCB0MiwgVFQubWF4Y2hhcnMpOworICAgIH0KKworICAgIGlmIChkaWZmID09IDApIHsgLy8gc2FtZQorICAgICAgVFQucmVwZWF0cysrOworICAgIH0gZWxzZSB7CisgICAgICBwcmludF9saW5lKG91dGZpbGUsIHByZXZsaW5lKTsKKworICAgICAgVFQucmVwZWF0cyA9IDA7CisKKyAgICAgIHRtcGxpbmUgPSBwcmV2bGluZTsKKyAgICAgIHByZXZsaW5lID0gdGhpc2xpbmU7CisgICAgICB0aGlzbGluZSA9IHRtcGxpbmU7CisKKyAgICAgIHRtcHNpemUgPSBwcmV2c2l6ZTsKKyAgICAgIHByZXZzaXplID0gdGhpc3NpemU7CisgICAgICB0aGlzc2l6ZSA9IHRtcHNpemU7CisgICAgfQorICB9CisKKyAgcHJpbnRfbGluZShvdXRmaWxlLCBwcmV2bGluZSk7CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGlmIChvdXRmaWxlICE9IHN0ZG91dCkgZmNsb3NlKG91dGZpbGUpOworICAgIGlmIChpbmZpbGUgIT0gc3RkaW4pIGZjbG9zZShpbmZpbGUpOworICAgIGZyZWUocHJldmxpbmUpOworICAgIGZyZWUodGhpc2xpbmUpOworICB9Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC91bmxpbmsuYyBiL3RveWJveC90b3lzL3Bvc2l4L3VubGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWVmOWQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvdG95cy9wb3NpeC91bmxpbmsuYwpAQCAtMCwwICsxLDI0IEBACisvKiB1bmxpbmsuYyAtIGRlbGV0ZSBvbmUgZmlsZQorICoKKyAqIENvcHlyaWdodCAyMDExIFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU2VlIGh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdW5saW5rLmh0bWwKKworVVNFX1VOTElOSyhORVdUT1kodW5saW5rLCAiPDE+MSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFVOTElOSworICBib29sICJ1bmxpbmsiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHVubGluayBGSUxFCisKKyAgICBEZWxldGVzIG9uZSBmaWxlLgorKi8KKworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB1bmxpbmtfbWFpbih2b2lkKQoreworICBpZiAodW5saW5rKCp0b3lzLm9wdGFyZ3MpKQorICAgIHBlcnJvcl9leGl0KCJDb3VsZG4ndCB1bmxpbmsgYCVzJyIsICp0b3lzLm9wdGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvdXVkZWNvZGUuYyBiL3RveWJveC90b3lzL3Bvc2l4L3V1ZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3V1ZGVjb2RlLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIHV1ZGVjb2RlLmMgLSB1dWRlY29kZSAvIGJhc2U2NCBkZWNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBFcmljaCBQbG9uZGtlIDx0b3lib3hAZXJpY2gud3JlY2sub3JnPgorICoKKyAqIFNlZSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdXVkZWNvZGUuaHRtbAorCitVU0VfVVVERUNPREUoTkVXVE9ZKHV1ZGVjb2RlLCAiPjFvOiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOfFRPWUZMQUdfVU1BU0spKQorCitjb25maWcgVVVERUNPREUKKyAgYm9vbCAidXVkZWNvZGUiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHV1ZGVjb2RlIFstbyBPVVRGSUxFXSBbSU5GSUxFXQorCisgICAgRGVjb2RlIGZpbGUgZnJvbSBzdGRpbiAob3IgSU5GSUxFKS4KKworICAgIC1vCXdyaXRlIHRvIE9VVEZJTEUgaW5zdGVhZCBvZiBmaWxlbmFtZSBpbiBoZWFkZXIKKyovCisKKyNkZWZpbmUgRk9SX3V1ZGVjb2RlCisjaW5jbHVkZSAidG95cy5oIgorCitHTE9CQUxTKAorICBjaGFyICpvOworKQorCit2b2lkIHV1ZGVjb2RlX21haW4odm9pZCkKK3sKKyAgaW50IGlmZCA9IDAsIG9mZCwgaWR4ID0gMCwgbSA9IG07CisgIGNoYXIgKmxpbmUgPSAwLCBtb2RlWzE2XSwKKyAgICAgICAqY2xhc3NbXSA9IHsiYmVnaW4lKlsgXSUxNXMlKlsgXSVuIiwgImJlZ2luLWJhc2U2NCUqWyBdJTE1cyUqWyBdJW4ifTsKKworICBpZiAodG95cy5vcHRjKSBpZmQgPSB4b3BlbnJvKCp0b3lzLm9wdGFyZ3MpOworCisgIHdoaWxlICghaWR4KSB7CisgICAgZnJlZShsaW5lKTsKKyAgICBpZiAoIShsaW5lID0gZ2V0X2xpbmUoaWZkKSkpIGVycm9yX2V4aXQoImJhZCBFT0YiKTsKKyAgICBmb3IgKG09MDsgbSA8IDI7IG0rKykgeworICAgICAgc3NjYW5mKGxpbmUsIGNsYXNzW21dLCBtb2RlLCAmaWR4KTsKKyAgICAgIGlmIChpZHgpIGJyZWFrOworICAgIH0KKyAgfQorCisgIG9mZCA9IHhjcmVhdGUoVFQubyA/IFRULm8gOiBsaW5lK2lkeCwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLAorICAgIHN0cmluZ190b19tb2RlKG1vZGUsIDA3NzdedG95cy5vbGRfdW1hc2spKTsKKworICBmb3IoOzspIHsKKyAgICBjaGFyICppbiwgKm91dDsKKyAgICBpbnQgb2xlbjsKKworICAgIGZyZWUobGluZSk7CisgICAgaWYgKG0gPT0gMiB8fCAhKGxpbmUgPSBnZXRfbGluZShpZmQpKSkgYnJlYWs7CisgICAgaWYgKCFzdHJjbXAobGluZSwgbSA/ICI9PT09IiA6ICJlbmQiKSkgeworICAgICAgbSA9IDI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBvbGVuID0gMDsKKyAgICBpbiA9IG91dCA9IGxpbmU7CisgICAgaWYgKCFtKSBvbGVuID0gKCooaW4rKykgLSAzMikgJiAweDNmOworCisgICAgZm9yICg7OykgeworICAgICAgaW50IGkgPSAwLCB4ID0gMCwgbGVuID0gNDsKKyAgICAgIGNoYXIgYyA9IDA7CisKKyAgICAgIGlmICghbSkgeworICAgICAgICBpZiAob2xlbiA8IDEpIGJyZWFrOworICAgICAgICBpZiAob2xlbiA8IDMpIGxlbiA9IG9sZW4gKyAxOworICAgICAgfQorCisgICAgICB3aGlsZSAoaSA8IGxlbikgeworICAgICAgICBpZiAoIShjID0gKihpbisrKSkpIGdvdG8gbGluZV9kb25lOworCisgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgaWYgKGMgPT0gJz0nKSB7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSBpZiAobGVuICE9IDQpIGJyZWFrOworCisgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSBjIC09ICdBJzsKKyAgICAgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgYyArPSAyNiAtICdhJzsKKyAgICAgICAgICBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgYyArPSA1MiAtICcwJzsKKyAgICAgICAgICBlbHNlIGlmIChjID09ICcrJykgYyA9IDYyOworICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKSBjID0gNjM7CisgICAgICAgICAgZWxzZSBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGMgPSAoYyAtIDMyKSAmIDB4M2Y7CisKKyAgICAgICAgeCB8PSBjIDw8ICg2KigzLWkpKTsKKworICAgICAgICBpZiAoaSAmJiBpIDwgbGVuKSB7CisgICAgICAgICAgKihvdXQrKykgPSAoeD4+KDgqKDMtaSkpKSAmIDB4ZmY7CisgICAgICAgICAgb2xlbi0tOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICAgIH0KKworICAgICAgaWYgKGkgJiYgaSE9bGVuKSBlcnJvcl9leGl0KCJiYWQgJXMiLCBsaW5lKTsKKyAgICB9CitsaW5lX2RvbmU6CisgICAgeHdyaXRlKG9mZCwgbGluZSwgb3V0LWxpbmUpOworICB9CisKKyAgaWYgKENGR19UT1lCT1hfRlJFRSkgeworICAgIGlmIChpZmQpIGNsb3NlKGlmZCk7CisgICAgY2xvc2Uob2ZkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvdXVlbmNvZGUuYyBiL3RveWJveC90b3lzL3Bvc2l4L3V1ZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MDlkNQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3V1ZW5jb2RlLmMKQEAgLTAsMCArMSw1OCBAQAorLyogdXVlbmNvZGUuYyAtIHV1ZW5jb2RlIC8gYmFzZTY0IGVuY29kZQorICoKKyAqIENvcHlyaWdodCAyMDEzIEVyaWNoIFBsb25ka2UgPHRveWJveEBlcmljaC53cmVjay5vcmc+CisgKgorICogU2VlIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy91dWVuY29kZS5odG1sCisKK1VTRV9VVUVOQ09ERShORVdUT1kodXVlbmNvZGUsICI8MT4ybSIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFVVRU5DT0RFCisgIGJvb2wgInV1ZW5jb2RlIgorICBkZWZhdWx0IHkgCisgIGhlbHAKKyAgICB1c2FnZTogdXVlbmNvZGUgWy1tXSBbZmlsZV0gZW5jb2RlLWZpbGVuYW1lCisKKyAgICBVdWVuY29kZSBzdGRpbiAob3IgZmlsZSkgdG8gc3Rkb3V0LCB3aXRoIGVuY29kZS1maWxlbmFtZSBpbiB0aGUgb3V0cHV0LgorCisgICAgLW0JYmFzZTY0LWVuY29kZQorKi8KKworI2RlZmluZSBGT1JfdXVlbmNvZGUKKyNpbmNsdWRlICJ0b3lzLmgiCisKK3ZvaWQgdXVlbmNvZGVfbWFpbih2b2lkKQoreworICBjaGFyICpuYW1lID0gdG95cy5vcHRhcmdzW3RveXMub3B0Yy0xXSwgYnVmWyg3Ni80KSozXTsKKworICBpbnQgaSwgbSA9IHRveXMub3B0ZmxhZ3MgJiBGTEFHX20sIGZkID0gMDsKKworICBpZiAodG95cy5vcHRjID4gMSkgZmQgPSB4b3BlbnJvKHRveXMub3B0YXJnc1swXSk7CisKKyAgYmFzZTY0X2luaXQodG95YnVmKTsKKworICB4cHJpbnRmKCJiZWdpbiVzIDc0NCAlc1xuIiwgbSA/ICItYmFzZTY0IiA6ICIiLCBuYW1lKTsKKyAgZm9yICg7OykgeworICAgIGNoYXIgKmluOworCisgICAgaWYgKCEoaSA9IHhyZWFkKGZkLCBidWYsIG0gPyBzaXplb2YoYnVmKSA6IDQ1KSkpIGJyZWFrOworCisgICAgaWYgKCFtKSB4cHV0YyhpKzMyKTsKKyAgICBpbiA9IGJ1ZjsKKworICAgIGZvciAoaW4gPSBidWY7IGluLWJ1ZiA8IGk7ICkgeworICAgICAgaW50IGosIHgsIGJ5dGVzID0gaSAtIChpbi1idWYpOworCisgICAgICBpZiAoYnl0ZXMgPiAzKSBieXRlcyA9IDM7CisKKyAgICAgIGZvciAoaiA9IHggPSAwOyBqPDQ7IGorKykgeworICAgICAgICBpbnQgb3V0OworCisgICAgICAgIGlmIChqIDwgYnl0ZXMpIHggfD0gKCooaW4rKykgJiAweDBmZikgPDwgKDgqKDItaikpOworICAgICAgICBvdXQgPSAoeD4+KCgzLWopKjYpKSAmIDB4M2Y7CisgICAgICAgIHhwdXRjKG0gPyAoaiA+IGJ5dGVzID8gJz0nIDogdG95YnVmW291dF0pIDogKG91dCA/IG91dCArIDB4MjAgOiAweDYwKSk7CisgICAgICB9IAorICAgIH0KKyAgICB4cHV0YygnXG4nKTsKKyAgfQorICB4cHV0cyhtID8gIj09PT0iIDogImVuZCIpOworfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3RveXMvcG9zaXgvd2MuYyBiL3RveWJveC90b3lzL3Bvc2l4L3djLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjM2U0NQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3djLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qIHdjLmMgLSBXb3JkIGNvdW50CisgKgorICogQ29weXJpZ2h0IDIwMTEgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy93Yy5odG1sCisKK1VTRV9XQyhORVdUT1kod2MsICJtY3dsIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU58VE9ZRkxBR19MT0NBTEUpKQorCitjb25maWcgV0MKKyAgYm9vbCAid2MiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHdjIC1sd2NtIFtGSUxFLi4uXQorCisgICAgQ291bnQgbGluZXMsIHdvcmRzLCBhbmQgY2hhcmFjdGVycyBpbiBpbnB1dC4KKworICAgIC1sCXNob3cgbGluZXMKKyAgICAtdwlzaG93IHdvcmRzCisgICAgLWMJc2hvdyBieXRlcworICAgIC1tCXNob3cgY2hhcmFjdGVycworCisgICAgQnkgZGVmYXVsdCBvdXRwdXRzIGxpbmVzLCB3b3JkcywgYnl0ZXMsIGFuZCBmaWxlbmFtZSBmb3IgZWFjaAorICAgIGFyZ3VtZW50IChvciBmcm9tIHN0ZGluIGlmIG5vbmUpLiBEaXNwbGF5cyBvbmx5IGVpdGhlciBieXRlcworICAgIG9yIGNoYXJhY3RlcnMuCisqLworCisjZGVmaW5lIEZPUl93YworI2luY2x1ZGUgInRveXMuaCIKKworR0xPQkFMUygKKyAgdW5zaWduZWQgbG9uZyB0b3RhbHNbNF07CispCisKK3N0YXRpYyB2b2lkIHNob3dfbGVuZ3Rocyh1bnNpZ25lZCBsb25nICpsZW5ndGhzLCBjaGFyICpuYW1lKQoreworICBpbnQgaSwgc3BhY2UgPSA3LCBmaXJzdCA9IDE7CisKKyAgZm9yIChpID0gMDsgaTw0OyBpKyspIGlmICh0b3lzLm9wdGZsYWdzID09ICgxPDxpKSkgc3BhY2UgPSAwOworICBmb3IgKGkgPSAwOyBpPDQ7IGkrKykgeworICAgIGlmICh0b3lzLm9wdGZsYWdzJigxPDxpKSkgeworICAgICAgcHJpbnRmKCIgJSpsZCIrZmlyc3QsIHNwYWNlLCBsZW5ndGhzW2ldKTsKKyAgICAgIGZpcnN0ID0gMDsKKyAgICB9CisgICAgVFQudG90YWxzW2ldICs9IGxlbmd0aHNbaV07CisgIH0KKyAgaWYgKCp0b3lzLm9wdGFyZ3MpIHByaW50ZigiICVzIiwgbmFtZSk7CisgIHhwdXRjKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBkb193YyhpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGludCBsZW4gPSAwLCBjbGVuID0gMSwgc3BhY2UgPSAwOworICB1bnNpZ25lZCBsb25nIHdvcmQgPSAwLCBsZW5ndGhzW10gPSB7MCwwLDAsMH07CisKKyAgLy8gU3BlZWQgdXAgY29tbW9uIGNhc2U6IHdjIC1jIG5vcm1hbGZpbGUgaXMgZmlsZSBsZW5ndGguCisgIGlmICh0b3lzLm9wdGZsYWdzID09IEZMQUdfYykgeworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgLy8gT24gTGludXgsIGZpbGVzIGluIC9wcm9jIG9mdGVuIHJlcG9ydCB0aGVpciBzaXplIGFzIDAuCisgICAgaWYgKCFmc3RhdChmZCwgJnN0KSAmJiBTX0lTUkVHKHN0LnN0X21vZGUpICYmIHN0LnN0X3NpemUpIHsKKyAgICAgIGxlbmd0aHNbMl0gPSBzdC5zdF9zaXplOworICAgICAgZ290byBzaG93OworICAgIH0KKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBpbnQgcG9zLCBkb25lID0gMCwgbGVuMiA9IHJlYWQoZmQsIHRveWJ1ZitsZW4sIHNpemVvZih0b3lidWYpLWxlbik7CisKKyAgICBpZiAobGVuMjwwKSBwZXJyb3JfbXNnX3JhdyhuYW1lKTsKKyAgICBlbHNlIGxlbiArPSBsZW4yOworICAgIGlmIChsZW4yPDEpIGRvbmUrKzsKKworICAgIGZvciAocG9zID0gMDsgcG9zPGxlbjsgcG9zKyspIHsKKyAgICAgIGlmICh0b3lidWZbcG9zXT09J1xuJykgbGVuZ3Roc1swXSsrOworICAgICAgbGVuZ3Roc1syXSsrOworICAgICAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19tKSB7CisgICAgICAgIC8vIElmIHdlJ3ZlIGNvbnN1bWVkIG5leHQgd2lkZSBjaGFyCisgICAgICAgIGlmICgtLWNsZW48MSkgeworICAgICAgICAgIHdjaGFyX3Qgd2NoYXI7CisKKyAgICAgICAgICAvLyBuZXh0IHdpZGUgc2l6ZSwgZG9uJ3QgY291bnQgaW52YWxpZCwgZmV0Y2ggbW9yZSBkYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgIGNsZW4gPSBtYnJ0b3djKCZ3Y2hhciwgdG95YnVmK3BvcywgbGVuLXBvcywgMCk7CisgICAgICAgICAgaWYgKGNsZW4gPT0gLTEpIGNvbnRpbnVlOworICAgICAgICAgIGlmIChjbGVuID09IC0yICYmICFkb25lKSBicmVhazsKKworICAgICAgICAgIGxlbmd0aHNbM10rKzsKKyAgICAgICAgICBzcGFjZSA9IGlzd3NwYWNlKHdjaGFyKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHNwYWNlID0gaXNzcGFjZSh0b3lidWZbcG9zXSk7CisKKyAgICAgIGlmIChzcGFjZSkgd29yZD0wOworICAgICAgZWxzZSB7CisgICAgICAgIGlmICghd29yZCkgbGVuZ3Roc1sxXSsrOworICAgICAgICB3b3JkPTE7CisgICAgICB9CisgICAgfQorICAgIGlmIChkb25lKSBicmVhazsKKyAgICBpZiAocG9zICE9IGxlbikgbWVtbW92ZSh0b3lidWYsIHRveWJ1Zitwb3MsIGxlbi1wb3MpOworICAgIGxlbiAtPSBwb3M7CisgIH0KKworc2hvdzoKKyAgc2hvd19sZW5ndGhzKGxlbmd0aHMsIG5hbWUpOworfQorCit2b2lkIHdjX21haW4odm9pZCkKK3sKKyAgaWYgKCF0b3lzLm9wdGZsYWdzKSB0b3lzLm9wdGZsYWdzID0gRkxBR19sfEZMQUdfd3xGTEFHX2M7CisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIGRvX3djKTsKKyAgaWYgKHRveXMub3B0Yz4xKSBzaG93X2xlbmd0aHMoVFQudG90YWxzLCAidG90YWwiKTsKK30KZGlmZiAtLWdpdCBhL3RveWJveC90b3lzL3Bvc2l4L3doby5jIGIvdG95Ym94L3RveXMvcG9zaXgvd2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0Y2RmYwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC90b3lzL3Bvc2l4L3doby5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIHdoby5jIC0gZGlzcGxheSB3aG8gaXMgb24gdGhlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAyMDEyIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKgorICogYnkgTHVpcyBGZWxpcGUgU3RyYW5vIE1vcmFlcyA8bGZlbGlwZUBwcm9mdXNpb24ubW9iaT4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy93aG8uaHRtbAorICoKKyAqIFBvc2l4IHNheXMgdG8gc3VwcG9ydCBtYW55IG9wdGlvbnMgKC1hYmRIbG1wcXJzdFR1KSBidXQgdGhpcworICogaXNuJ3QgYWltZWQgYXQgbWluaWNvbXB1dGVycyB3aXRoIG1vZGVtIHBvb2xzLgorCitVU0VfV0hPKE5FV1RPWSh3aG8sICJhIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgV0hPCisgIGJvb2wgIndobyIKKyAgZGVmYXVsdCB5CisgIGRlcGVuZHMgb24gVE9ZQk9YX1VUTVBYCisgIGhlbHAKKyAgICB1c2FnZTogd2hvCisKKyAgICBQcmludCBsb2dnZWQgdXNlciBpbmZvcm1hdGlvbiBvbiBzeXN0ZW0KKyovCisKKyNkZWZpbmUgRk9SX3dobworI2luY2x1ZGUgInRveXMuaCIKKwordm9pZCB3aG9fbWFpbih2b2lkKQoreworICBzdHJ1Y3QgdXRtcHggKmVudHJ5OworCisgIHNldHV0eGVudCgpOworCisgIHdoaWxlICgoZW50cnkgPSBnZXR1dHhlbnQoKSkpIHsKKyAgICBpZiAoKHRveXMub3B0ZmxhZ3MgJiBGTEFHX2EpIHx8IGVudHJ5LT51dF90eXBlID09IFVTRVJfUFJPQ0VTUykgeworICAgICAgdGltZV90IHRpbWU7CisgICAgICBpbnQgdGltZV9zaXplOworICAgICAgY2hhciAqdGltZXM7CisKKyAgICAgIHRpbWUgPSBlbnRyeS0+dXRfdHYudHZfc2VjOworICAgICAgdGltZXMgPSBjdGltZSgmdGltZSk7CisgICAgICB0aW1lX3NpemUgPSBzdHJsZW4odGltZXMpIC0gMjsKKyAgICAgIHByaW50ZigiJXNcdCVzXHQlKi4qc1x0KCVzKVxuIiwgZW50cnktPnV0X3VzZXIsIGVudHJ5LT51dF9saW5lLAorICAgICAgICB0aW1lX3NpemUsIHRpbWVfc2l6ZSwgY3RpbWUoJnRpbWUpLCBlbnRyeS0+dXRfaG9zdCk7CisgICAgfQorICB9CisKKyAgZW5kdXR4ZW50KCk7Cit9CmRpZmYgLS1naXQgYS90b3lib3gvdG95cy9wb3NpeC94YXJncy5jIGIvdG95Ym94L3RveXMvcG9zaXgveGFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNiODBhCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3RveXMvcG9zaXgveGFyZ3MuYwpAQCAtMCwwICsxLDE5MCBAQAorLyogeGFyZ3MuYyAtIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzIHRha2VuIGZyb20gc3RkaW4uCisgKgorICogQ29weXJpZ2h0IDIwMTEgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBTZWUgaHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy94YXJncy5odG1sCisgKgorICogVE9ETzogUmljaCdzIHdoaXRlc3BhY2Ugb2JqZWN0aW9uLCBlbnYgc2l6ZSBpc24ndCBmaXhlZCBhbnltb3JlLgorCitVU0VfWEFSR1MoTkVXVE9ZKHhhcmdzLCAiXkk6RTpMI3B0eHJuIzwxcyMwIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorCitjb25maWcgWEFSR1MKKyAgYm9vbCAieGFyZ3MiCisgIGRlZmF1bHQgeQorICBoZWxwCisgICAgdXNhZ2U6IHhhcmdzIFstcHR4cjBdIFstcyBOVU1dIFstbiBOVU1dIFstTCBOVU1dIFstRSBTVFJdIENPTU1BTkQuLi4KKworICAgIFJ1biBjb21tYW5kIGxpbmUgb25lIG9yIG1vcmUgdGltZXMsIGFwcGVuZGluZyBhcmd1bWVudHMgZnJvbSBzdGRpbi4KKworICAgIElmIGNvbW1hbmQgZXhpdHMgd2l0aCAyNTUsIGRvbid0IGxhdW5jaCBhbm90aGVyIGV2ZW4gaWYgYXJndW1lbnRzIHJlbWFpbi4KKworICAgIC1zCVNpemUgaW4gYnl0ZXMgcGVyIGNvbW1hbmQgbGluZQorICAgIC1uCU1heCBudW1iZXIgb2YgYXJndW1lbnRzIHBlciBjb21tYW5kCisgICAgLTAJRWFjaCBhcmd1bWVudCBpcyBOVUxMIHRlcm1pbmF0ZWQsIG5vIHdoaXRlc3BhY2Ugb3IgcXVvdGUgcHJvY2Vzc2luZworICAgICMtcAlQcm9tcHQgZm9yIHkvbiBmcm9tIHR0eSBiZWZvcmUgcnVubmluZyBlYWNoIGNvbW1hbmQKKyAgICAjLXQJVHJhY2UsIHByaW50IGNvbW1hbmQgbGluZSB0byBzdGRlcnIKKyAgICAjLXgJRXhpdCBpZiBjYW4ndCBmaXQgZXZlcnl0aGluZyBpbiBvbmUgY29tbWFuZAorICAgICMtcglEb24ndCBydW4gY29tbWFuZCB3aXRoIGVtcHR5IGlucHV0CisgICAgIy1MCU1heCBudW1iZXIgb2YgbGluZXMgb2YgaW5wdXQgcGVyIGNvbW1hbmQKKyAgICAtRQlzdG9wIGF0IGxpbmUgbWF0Y2hpbmcgc3RyaW5nCisKK2NvbmZpZyBYQVJHU19QRURBTlRJQworICBib29sICJUT0RPIHhhcmdzIHBlZGFudGljIHBvc2l4IGNvbXBhdGFiaWxpdHkiCisgIGRlZmF1bHQgbgorICBkZXBlbmRzIG9uIFhBUkdTCisgIGhlbHAKKyAgICBUaGlzIHZlcnNpb24gc3VwcG9ydHMgaW5zYW5lIHBvc2l4IHdoaXRlc3BhY2UgaGFuZGxpbmcgcmVuZGVyZWQgb2Jzb2xldGUKKyAgICBieSAtMCBtb2RlLgorKi8KKworI2RlZmluZSBGT1JfeGFyZ3MKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGxvbmcgbWF4X2J5dGVzOworICBsb25nIG1heF9lbnRyaWVzOworICBsb25nIEw7CisgIGNoYXIgKmVvZnN0cjsKKyAgY2hhciAqSTsKKworICBsb25nIGVudHJpZXMsIGJ5dGVzOworICBjaGFyIGRlbGltOworKQorCisvLyBJZiBvdXQ9PU5VTEwgY291bnQgVFQuYnl0ZXMgYW5kIFRULmVudHJpZXMsIHN0b3BwaW5nIGF0IG1heC4KKy8vIE90aGVyd2lzZSwgZmlsbCBvdXQgb3V0W10KKworLy8gUmV0dXJuaW5nIE5VTEwgbWVhbnMgbmVlZCBtb3JlIGRhdGEuCisvLyBSZXR1cm5pbmcgY2hhciAqIG1lYW5zIGhpdCBkYXRhIGxpbWl0cywgc3RhcnQgb2YgZGF0YSBsZWZ0IG92ZXIKKy8vIFJldHVybmluZyAxIG1lYW5zIGhpdCBkYXRhIGxpbWl0cywgYnV0IGNvbnN1bWVkIGFsbCBkYXRhCisvLyBSZXR1cm5pbmcgMiBtZWFucyBoaXQgLUUgZW9mc3RyCisKK3N0YXRpYyBjaGFyICpoYW5kbGVfZW50cmllcyhjaGFyICpkYXRhLCBjaGFyICoqZW50cnkpCit7CisgIGlmIChUVC5kZWxpbSkgeworICAgIGNoYXIgKnMgPSBkYXRhOworCisgICAgLy8gQ2hvcCB1cCB3aGl0ZXNwYWNlIGRlbGltaXRlZCBzdHJpbmcgaW50byBhcmdzCisgICAgd2hpbGUgKCpzKSB7CisgICAgICBjaGFyICpzYXZlOworCisgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKKyAgICAgICAgaWYgKGVudHJ5KSAqcyA9IDA7CisgICAgICAgIHMrKzsKKyAgICAgIH0KKworICAgICAgaWYgKFRULm1heF9lbnRyaWVzICYmIFRULmVudHJpZXMgPj0gVFQubWF4X2VudHJpZXMpCisgICAgICAgIHJldHVybiAqcyA/IHMgOiAoY2hhciAqKTE7CisKKyAgICAgIGlmICghKnMpIGJyZWFrOworICAgICAgc2F2ZSA9IHM7CisKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCsrVFQuYnl0ZXMgPj0gVFQubWF4X2J5dGVzICYmIFRULm1heF9ieXRlcykgcmV0dXJuIHNhdmU7CisgICAgICAgIGlmICghKnMgfHwgaXNzcGFjZSgqcykpIGJyZWFrOworICAgICAgICBzKys7CisgICAgICB9CisgICAgICBpZiAoVFQuZW9mc3RyKSB7CisgICAgICAgIGludCBsZW4gPSBzLXNhdmU7CisgICAgICAgIGlmIChsZW4gPT0gc3RybGVuKFRULmVvZnN0cikgJiYgIXN0cm5jbXAoc2F2ZSwgVFQuZW9mc3RyLCBsZW4pKQorICAgICAgICAgIHJldHVybiAoY2hhciAqKTI7CisgICAgICB9CisgICAgICBpZiAoZW50cnkpIGVudHJ5W1RULmVudHJpZXNdID0gc2F2ZTsKKyAgICAgICsrVFQuZW50cmllczsKKyAgICB9CisKKyAgLy8gLTAgc3VwcG9ydAorICB9IGVsc2UgeworICAgIFRULmJ5dGVzICs9IHN0cmxlbihkYXRhKSsxOworICAgIGlmIChUVC5tYXhfYnl0ZXMgJiYgVFQuYnl0ZXMgPj0gVFQubWF4X2J5dGVzKSByZXR1cm4gZGF0YTsKKyAgICBpZiAoVFQubWF4X2VudHJpZXMgJiYgVFQuZW50cmllcyA+PSBUVC5tYXhfZW50cmllcykKKyAgICAgIHJldHVybiAoY2hhciAqKTE7CisgICAgaWYgKGVudHJ5KSBlbnRyeVtUVC5lbnRyaWVzXSA9IGRhdGE7CisgICAgVFQuZW50cmllcysrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgeGFyZ3NfbWFpbih2b2lkKQoreworICBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsaXN0ID0gTlVMTCwgKmR0ZW1wOworICBpbnQgZW50cmllcywgYnl0ZXMsIGRvbmUgPSAwLCBzdGF0dXM7CisgIGNoYXIgKmRhdGEgPSBOVUxMLCAqKm91dDsKKyAgcGlkX3QgcGlkOworCisgIGlmICghKHRveXMub3B0ZmxhZ3MgJiBGTEFHXzApKSBUVC5kZWxpbSA9ICdcbic7CisKKyAgLy8gSWYgbm8gb3B0YXJncywgY2FsbCBlY2hvLgorICBpZiAoIXRveXMub3B0YykgeworICAgIGZyZWUodG95cy5vcHRhcmdzKTsKKyAgICAqKHRveXMub3B0YXJncyA9IHh6YWxsb2MoMipzaXplb2YoY2hhciAqKSkpPSJlY2hvIjsKKyAgICB0b3lzLm9wdGMgPSAxOworICB9CisKKyAgZm9yIChlbnRyaWVzID0gMCwgYnl0ZXMgPSAtMTsgZW50cmllcyA8IHRveXMub3B0YzsgZW50cmllcysrLCBieXRlcysrKQorICAgIGJ5dGVzICs9IHN0cmxlbih0b3lzLm9wdGFyZ3NbZW50cmllc10pOworCisgIC8vIExvb3AgdGhyb3VnaCBleGVjIGNodW5rcy4KKyAgd2hpbGUgKGRhdGEgfHwgIWRvbmUpIHsKKyAgICBUVC5lbnRyaWVzID0gMDsKKyAgICBUVC5ieXRlcyA9IGJ5dGVzOworCisgICAgLy8gTG9vcCByZWFkaW5nIGlucHV0CisgICAgZm9yICg7OykgeworCisgICAgICAvLyBSZWFkIGxpbmUKKyAgICAgIGlmICghZGF0YSkgeworICAgICAgICBzc2l6ZV90IGwgPSAwOworICAgICAgICBsID0gZ2V0ZGVsaW0oJmRhdGEsIChzaXplX3QgKikmbCwgVFQuZGVsaW0sIHN0ZGluKTsKKworICAgICAgICBpZiAobDwwKSB7CisgICAgICAgICAgZGF0YSA9IDA7CisgICAgICAgICAgZG9uZSsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBkbGlzdF9hZGQoJmRsaXN0LCBkYXRhKTsKKworICAgICAgLy8gQ291bnQgZGF0YSB1c2VkCisgICAgICBkYXRhID0gaGFuZGxlX2VudHJpZXMoZGF0YSwgTlVMTCk7CisgICAgICBpZiAoIWRhdGEpIGNvbnRpbnVlOworICAgICAgaWYgKGRhdGEgPT0gKGNoYXIgKikyKSBkb25lKys7CisgICAgICBpZiAoKGxvbmcpZGF0YSA8PSAyKSBkYXRhID0gMDsKKyAgICAgIGVsc2UgZGF0YSA9IHhzdHJkdXAoZGF0YSk7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEFjY3VtdWxhdGUgY2FsbHkgdGhpbmcKKworICAgIGlmIChkYXRhICYmICFUVC5lbnRyaWVzKSBlcnJvcl9leGl0KCJhcmd1bWVudCB0b28gbG9uZyIpOworICAgIG91dCA9IHh6YWxsb2MoKGVudHJpZXMrVFQuZW50cmllcysxKSpzaXplb2YoY2hhciAqKSk7CisKKyAgICAvLyBGaWxsIG91dCBjb21tYW5kIGxpbmUgdG8gZXhlYworICAgIG1lbWNweShvdXQsIHRveXMub3B0YXJncywgZW50cmllcypzaXplb2YoY2hhciAqKSk7CisgICAgVFQuZW50cmllcyA9IDA7CisgICAgVFQuYnl0ZXMgPSBieXRlczsKKyAgICBpZiAoZGxpc3QpIGRsaXN0LT5wcmV2LT5uZXh0ID0gMDsKKyAgICBmb3IgKGR0ZW1wID0gZGxpc3Q7IGR0ZW1wOyBkdGVtcCA9IGR0ZW1wLT5uZXh0KQorICAgICAgaGFuZGxlX2VudHJpZXMoZHRlbXAtPmRhdGEsIG91dCtlbnRyaWVzKTsKKworICAgIGlmICghKHBpZCA9IFhWRk9SSygpKSkgeworICAgICAgeGNsb3NlKDApOworICAgICAgb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOworICAgICAgeGV4ZWMob3V0KTsKKyAgICB9CisgICAgd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworICAgIHN0YXR1cyA9IFdJRkVYSVRFRChzdGF0dXMpID8gV0VYSVRTVEFUVVMoc3RhdHVzKSA6IFdURVJNU0lHKHN0YXR1cykrMTI3OworCisgICAgLy8gQWJyaXRyYXJ5IG51bWJlciBvZiBleGVjcywgY2FuJ3QganVzdCBsZWFrIG1lbW9yeSBlYWNoIHRpbWUuLi4KKyAgICB3aGlsZSAoZGxpc3QpIHsKKyAgICAgIHN0cnVjdCBkb3VibGVfbGlzdCAqZHRlbXAgPSBkbGlzdC0+bmV4dDsKKworICAgICAgZnJlZShkbGlzdC0+ZGF0YSk7CisgICAgICBmcmVlKGRsaXN0KTsKKyAgICAgIGRsaXN0ID0gZHRlbXA7CisgICAgfQorICAgIGZyZWUob3V0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG95Ym94L3d3dy9hYm91dC5odG1sIGIvdG95Ym94L3d3dy9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlMDYxODYKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvd3d3L2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwxNjMgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5XaGF0IGlzIHRveWJveD88L3RpdGxlPgorPCEtLSNpbmNsdWRlIGZpbGU9ImhlYWRlci5odG1sIiAtLT4KKworPGgyPjxhIG5hbWU9IndoYXQiIC8+V2hhdCBpcyB0b3lib3g/PC9oMj4KKworPHA+VG95Ym94IGNvbWJpbmVzIG1hbnkgY29tbW9uIExpbnV4IGNvbW1hbmQgbGluZSB1dGlsaXRpZXMgdG9nZXRoZXIgaW50bworYSBzaW5nbGUgPGEgaHJlZj1saWNlbnNlLmh0bWw+QlNELWxpY2Vuc2VkPC9hPiBleGVjdXRhYmxlLiBJdCdzIHNpbXBsZSwgc21hbGwsIGZhc3QsIGFuZCByZWFzb25hYmx5CitzdGFuZGFyZHMtY29tcGxpYW50ICg8YSBocmVmPWh0dHA6Ly9vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OT5QT1NJWC0yMDA4PC9hPiBhbmQgPGEgaHJlZj1odHRwOi8vcmVmc3BlY3MubGludXhmb3VuZGF0aW9uLm9yZy9MU0JfNC4xLjA+TFNCIDQuMTwvYT4pLjwvcD4KKworPHA+VG95Ym94J3MgbWFpbiBnb2FsIGlzIHRvIG1ha2UgQW5kcm9pZAorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9hYm91dC5odG1sI3NlbGZob3N0PnNlbGYtaG9zdGluZzwvYT4KK2J5IGltcHJvdmluZyBBbmRyb2lkJ3MgY29tbWFuZCBsaW5lIHV0aWxpdGllcyBzbyBpdCBjYW4KK2J1aWxkIGFuIGluc3RhbGxhYmxlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCBpbWFnZQorZW50aXJlbHkgZnJvbSBzb3VyY2UgdW5kZXIgYSBzdG9jayBBbmRyb2lkIHN5c3RlbS4gQWZ0ZXIgYSB0YWxrIGF0IHRoZSAyMDEzCitFbWJlZGRlZCBMaW51eCBDb25mZXJlbmNlIGV4cGxhaW5pbmcgdGhpcyBwbGFuCisoPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvdGFsa3MvY2VsZi0yMDEzLnR4dD5vdXRsaW5lPC9hPiwKKzxhIGhyZWY9aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TR210UDVMZ190MD52aWRlbzwvYT4pLCBHb29nbGUKKzxhIGhyZWY9aHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzYyOTM2Mi8+bWVyZ2VkIHRveWJveCBpbnRvIEFPU1A8L2E+IGFuZAorYmVnYW4gc2hpcHBpbmcgdG95Ym94IGluIEFuZHJvaWQgTWFzaG1hbGxvdy48L3A+CisKKzxwPlRveWJveCBhaW1zIHRvIHByb3ZpZGUgb25lIHF1YXJ0ZXIgb2YgYSB0aGVvcmV0aWNhbCAibWluaW1hbCBuYXRpdmUKK2RldmVsb3BtZW50IGVudmlyb25tZW50Iiwgd2hpY2ggaXMgdGhlIHNpbXBsZXN0IExpbnV4IHN5c3RlbSBjYXBhYmxlIG9mCityZWJ1aWxkaW5nIGl0c2VsZiBmcm9tIHNvdXJjZSBjb2RlIGFuZCB0aGVuIGJ1aWxkaW5nCis8YSBocmVmPWh0dHA6Ly9saW51eGZyb21zY3JhdGNoLm9yZy9sZnM+TGludXggRnJvbSBTY3JhdGNoPC9hPgorYW5kIHRoZSA8YSBocmVmPWh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tPkFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdDwvYT4KK3VuZGVyIHRoZSByZXN1bHQuIEluIHRoZW9yeSwgdGhpcyBzaG91bGQgb25seSByZXF1aXJlIGZvdXIgcGFja2FnZXM6CisxKSBhIHNldCBvZiBwb3NpeC1pc2ggY29tbWFuZCBsaW5lIHV0aWxpdGllcywKKzIpIGEgY29tcGlsZXI8YSBuYW1lPSIxX2JhY2siPjwvYT48c3VwPjxmb250IHNpemU9LTM+PGEgaHJlZj0jMT5bMV08L2E+PC9mb250Pjwvc3VwPiwKKzMpIGEgQyBsaWJyYXJ5LCBhbmQgNCkgYSBrZXJuZWwuIFRoaXMgcHJvdmlkZXMgYSByZXByb2R1Y2libGUgYW5kIGF1ZGl0YWJsZQorYmFzZSBzeXN0ZW0sIHdoaWNoIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgZmV3IGNvbnZpZW5jaWVuY2VzICh2aSwgdG9wLAorc2hlbGwgY29tbWFuZCBsaW5lIGhpc3RvcnkuLi4pIGNhbiBwcm92aWRlIGEgdXNhYmxlIGludGVyYWN0aXZlIGV4cGVyaWVuY2UKK3JhdGhlciB0aGFuIGp1c3QgYSBoZWFkbGVzcyBidWlsZCBzZXJ2ZXIuPC9wPgorCis8Yj48aDI+PGEgbmFtZT0id2h5IiAvPldoeSBpcyB0b3lib3g/PC9oMj48L2I+CisKKzxwPlRoZSA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC90YWxrcy9jZWxmLTIwMTUudHh0PjIwMTUgdG95Ym94IHRhbGs8L2E+CitzdGFydHMgd2l0aCBsaW5rcyB0byB0aHJlZSBwcmV2aW91cyB0YWxrcyBvbiB0aGUgaGlzdG9yeSBhbmQgbW90aXZhdGlvbiBvZgordGhlIHByb2plY3Q6ICJXaHkgVG95Ym94IiwgIldoeSBQdWJsaWMgRG9tYWluIiwgYW5kICJXaHkgZGlkIEkgZG8KK0Fib3JpZ2luYWwgTGludXggKHdoaWNoIGxlZCBtZSBoZXJlKT8iLiBJZiB5b3UncmUgcmVhbGx5IGJvcmVkLAordGhlcmUncyBldmVuIGEgaGFsZi1maW5pc2hlZAorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9oaXN0b3J5Lmh0bWw+YSBoaXN0b3J5IHBhZ2U8L2E+LjwvcD4KKworPHA+VGhlIHRveWJveCBtYWludGFpbmVyJ3MgZWFybGllciBtaW5pbWFsIHNlbGYtaG9zdGluZyBzeXN0ZW0gcHJvamVjdCwKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYWJvdXQuaHRtbD5BYm9yaWdpbmFsIExpbnV4PC9hPiwKK2dvdCBpdHMgbWluaW1hbCBuYXRpdmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZG93biB0byBzZXZlbiBwYWNrYWdlcyBpbgoraXRzIDEuMCByZWxlYXNlIChidXN5Ym94LCB1Q2xpYmMsIGdjYywgYmludXRpbHMsIG1ha2UsIGJhc2gsIGFuZCBsaW51eCkKK2FuZCBidWlsdCBMaW51eCBGcm9tIFNjcmF0Y2ggdW5kZXIgdGhlIHJlc3VsdC4gVGhhdCBwcm9qZWN0Cis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL2hpc3RvcnkuaHRtbD53YXMgdGhlIHJlYXNvbjwvYT4KK3RveWJveCdzIG1haW50YWluZXIgYmVjYW1lIGJ1c3lib3ggbWFpbnRhaW5lciwgaGF2aW5nIGRvbmUgc28KK211Y2ggd29yayB0byBleHRlbmQgYnVzeWJveCB0byByZXBsYWNlIGFsbCB0aGUgZ251IHRvb2xzIGluIGEgTGludXggRnJvbQorU2NyYXRjaCBidWlsZCB0aGF0IHRoZSBwcmV2aW91cyBtYWludGFpbmVyIGhhbmRlZCBvdmVyIHRoZSBwcm9qZWN0ICh0bworc3BlbmQgbW9yZSB0aW1lIG9uIGJ1aWxkcm9vdCkuPC9wPgorCis8cD5EZXNwaXRlIHRoZSBtYWludGFpbmVyJ3MgaGlzdG9yeSB3aXRoIGJ1c3lib3gsIHRveWJveCBpcyBhIGZyZXNoCitmcm9tLXNjcmF0Y2ggaW1wbGVtZW50YXRpb24gdW5kZXIgYW4KKzxhIGhyZWY9aHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc291cmNlL2xpY2Vuc2VzLmh0bWw+YW5kcm9pZC1jb21wYXRpYmxlPC9hPgorPGEgaHJlZj1saWNlbnNlLmh0bWw+bGljZW5zZTwvYT4uIEJ1c3lib3ggcHJlZGF0ZXMgQW5kcm9pZCwgYnV0IGhhcyBuZXZlcgorc2hpcHBlZCB3aXRoIEFuZHJvaWQgZHVlIHRvIHRoZSBsaWNlbnNlLiBBcyBsb25nIGFzIHdlJ3JlIHN0YXJ0aW5nIG92ZXIgYW55d2F5LAord2UgY2FuIGRvIGEgYmV0dGVyIGpvYi48L3A+CisKKzxwPlRoZXNlIGRheXMsIHRveWJveCBpcyByZXBsYWNpbmcgYnVzeWJveAoraW4gQWJvcmlnaW5hbCBMaW51eCBvbmUgY29tbWFuZCBhdCBhIHRpbWUsIGFuZCBlYWNoIHRveWJveCByZWxlYXNlIGlzCityZWdyZXNzaW9uIHRlc3RlZCBieSBidWlsZGluZyBBYm9yaWdpbmFsIExpbnV4IHdpdGggaXQsIHRoZW4gYnVpbGRpbmcKK0xpbnV4IEZyb20gU2NyYXRjaCB1bmRlciB0aGUgcmVzdWx0IHdpdGggdGhlIG5ldyB0b3lib3ggY29tbWFuZHMuCitUaGUgbGlzdCBvZiBjb21tYW5kcyByZW1haW5pbmcgaXMgdHJhY2tlZCA8YSBocmVmPXJvYWRtYXAuaHRtbCNkZXZfZW52PmluCit0aGUgcm9hZG1hcDwvYT4sIGFuZCB0aGUgcmVwbGFjaW5nIGJ1c3lib3ggaW4gQWJvcmlnaW5hbCBMaW51eCBpcworb25lIG9mIHRoZSBtYWluIGdvYWxzIGZvciB0b3lib3gnIDEuMCByZWxlYXNlLjwvcD4KKworPHA+QnVpbGRpbmcgTEZTIHJlcXVyZXMgZmV3ZXIgY29tbWFuZHMgdGhhbiBidWlsZGluZyBBT1NQLCB3aGljaCBoYXMgYSBsb3QgbW9yZQorPGEgaHJlZj1odHRwOi8vc291cmNlLmFuZHJvaWQuY29tL3NvdXJjZS9pbml0aWFsaXppbmcuaHRtbD5idWlsZAorcHJlcmVxdWlzaXRlczwvYT4uIEluIHRoZW9yeSBzb21lIG9mIHRob3NlIGNhbiBiZSBidWlsdCBmcm9tIHNvdXJjZQorYXMgZXh0ZXJuYWwgcGFja2FnZXMgKHdlJ3JlIGNsZWFybHkgbm90IGluY2x1ZGluZyBvdXIgb3duIGphdmEgaW1wbGVtZW50YXRpb24pLAorYnV0IHNvbWUgZWFybHkgcHJlcmVxdWlzaXRlcyBtYXkgbmVlZCB0byBiZSBhZGRlZCB0byBib290c3RyYXAgQU9TUCBmYXIgZW5vdWdoCit0byBidWlsZCB0aGVtIChzdWNoIGFzIGEgcmVhZC1vbmx5IHZlcnNpb24gb2YgImdpdCI6Citob3cgZG9lcyByZXBvIGRvd25sb2FkIHRoZSBBT1NQIHNvdXJjZSBvdGhlcndpc2U/KQorPGEgbmFtZT0iMl9iYWNrIj48L2E+PHN1cD48Zm9udCBzaXplPS0zPjxhIGhyZWY9IzI+WzJdPC9hPjwvZm9udD48L3N1cD48L3A+CisKKzxiPjxoMj48YSBuYW1lPSJzdGF0dXMiIC8+V2hhdCBjb21tYW5kcyBhcmUgcGxhbm5lZC9pbXBsZW1lbnRlZCBpbiB0b3lib3g/PC9oMj48L2I+CisKKzxwPlRoZSBjdXJyZW50IGxpc3Qgb2YgY29tbWFuZHMgaW1wbGVtZW50ZWQgYnkgdG95Ym94IGlzIG9uIHRoZQorPGEgaHJlZj1zdGF0dXMuaHRtbD5zdGF0dXMgcGFnZTwvYT4sIHdoaWNoIGlzIHVwZGF0ZWQgZWFjaCByZWxlYXNlLgorVGhlcmUgaXMgYWxzbyBhIDxhIGhyZWY9cm9hZG1hcC5odG1sPnJvYWRtYXA8L2E+IGxpc3RpbmcgYWxsIHBsYW5uZWQgY29tbWFuZHMKK2ZvciB0aGUgMS4wIHJlbGVhc2UgYW5kIHRoZSByZWFzb25zIGZvciBpbmNsdWRpbmcgdGhlbS48L3A+CisKKzxwPkluIGdlbmVyYWwsIGNvbmZpZ3VyaW5nIHRveWJveCB3aXRoICJtYWtlIGRlZmNvbmZpZyIgZW5hYmxlcyBhbGwgdGhlIGNvbW1hbmRzCitjb21wZXRlIGVub3VnaCB0byBiZSB1c2VmdWwuIENvbmZpZ3VyaW5nICJhbGx5ZXNjb25maWciIGVuYWJsZXMgcGFydGlhbGx5CitpbXBsZW1lbnRlZCBjb21tYW5kcyBhcyB3ZWxsLCBhbG9uZyB3aXRoIGRlYnVnZ2luZyBmZWF0dXJlcy48L3A+CisKKzxiPjxoMz5SZWxldmFudCBTdGFuZGFyZHM8L2gzPjwvYj4KKworPHA+TW9zdCBjb21tYW5kcyBhcmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIFBPU0lYLTIwMDggKEkuRS4KKzxhIGhyZWY9aHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2lkeC91dGlsaXRpZXMuaHRtbD5UaGUKK1NpbmdsZSBVbml4IFNwZWNpZmljYXRpb24gdmVyc2lvbiA0PC9hPikgd2hlcmUgYXBwbGljYWJsZS4gVGhpcyBkb2VzIG5vdCBtZWFuCit0aGF0IHRveWJveCBpcyBpbXBsZW1lbnRpbmcgZXZlcnkgU1VTdjQgdXRpbGl0eTogc29tZSBzdWNoIGFzIFNDQ1MgYW5kIGVkIGFyZQorb2Jzb2xldGUsIHdoaWxlIG90aGVycyBzdWNoIGFzIGM5OSBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIHByb2plY3QuCitUb3lib3ggYWxzbyBpc24ndCBpbXBsZW1lbnRpbmcgZnVsbCBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0OiBpdCBzaG91bGQgYmUKKzgtYml0IGNsZWFuIGFuZCBoYW5kbGUgVVRGLTgsIGJ1dCBvdGhlcndpc2Ugd2UgbGVhdmUgdGhpcyB0byBYMTEgYW5kIGhpZ2hlcgorbGF5ZXJzLiBBbmQgc29tZSB0aGluZ3MgKGxpa2UgJENEUEFUSCBzdXBwb3J0IGluICJjZCIpIGF3YWl0IGEgZ29vZAorZXhwbGFuYXRpb24gb2Ygd2h5IHRvIGJvdGhlciB3aXRoIHRoZW0uIChQT1NJWCBwcm92aWRlcyBhbiBpbXBvcnRhbnQKK2ZyYW1lIG9mIHJlZmVyZW5jZSwgYnV0IGlzIG5vdCBhbiBpbmZhbGxhYmxlIHNldCBvZiBjb21tYW5kbWVudHMgdG8gYmUgYmxpbmRseQorb2JleWVkLiBXZSBkbyB0cnkgdG8gZG9jdW1lbnQgb3VyIGRldmlhdGlvbnMgZnJvbSBpdCBpbiB0aGUgY29tbWVudCBzZWN0aW9uCithdCB0aGUgc3RhcnQgb2YgZWFjaCBjb21tYW5kIHVuZGVyIHRveXMvcG9zaXguKTwvcD4KKworPHA+VGhlIG90aGVyIG1ham9yIHNvdXJjZXMgb2YgY29tbWFuZHMgYXJlIHRoZSBMaW51eCBtYW4gcGFnZXMsIHRoZQorTGludXggU3RhbmRhcmQgQmFzZSwgYW5kIHRlc3RpbmcgdGhlIGJlaGF2aW9yIG9mIGV4aXN0aW5nIGNvbW1hbmQKK2ltcGxlbWVudGF0aW9ucyAoYWx0aG91Z2ggbm90IGdlbmVyYWxseSBsb29raW5nIGF0IHRoZWlyCitzb3VyY2UgY29kZSksIGluY2x1ZGluZyB0aGUgY29tbWFuZHMgaW4gQW5kcm9pZCdzIHRvb2xib3guIFNVU3Y0IGRvZXMgbm90CitpbmNsdWRlIG1hbnkgYmFzaWMgY29tbWFuZHMgc3VjaCBhcyAibW91bnQiLCAiaW5pdCIsIGFuZCAibWtlMmZzIiwgd2hpY2ggYXJlCitraW5kIG9mIG5pY2UgdG8gaGF2ZS48L3A+CisKKzxwPkZvciBtb3JlIG9uIHRoaXMgc2VlIHRoZSA8YSBocmVmPXJvYWRtYXAuaHRtbD5yb2FkbWFwPC9hPiBhbmQKKzxhIGhyZWY9ZGVzaWduLmh0bWw+ZGVzaWduIGdvYWxzPC9hPi48L3A+CisKKzxiPjxoMj48YSBuYW1lPSJkb3dubG9hZHMiIC8+RG93bmxvYWQ8L2gyPjwvYj4KKworPHA+VGhpcyBwcm9qZWN0IGlzIG1haW50YWluZWQgYXMgYSA8YSBocmVmPWh0dHBzOi8vZ2l0aHViLmNvbS9sYW5kbGV5L3RveWJveD5naXQKK2FyY2hpdmU8L2E+LCBhbmQgYWxzbyBvZmZlcnMgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvdG95Ym94L2Rvd25sb2Fkcz5zb3VyY2UKK3RhcmJhbGxzPC9hPiBhbmQgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvdG95Ym94L2Jpbj5zdGF0aWMgYmluYXJpZXM8L2E+CitvZiB0aGUgcmVsZWFzZSB2ZXJzaW9ucy48L3A+CisKKzxwPlRoZSBtYWludGFpbmVyJ3MgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMuaHRtbD5kZXZlbG9wbWVudCBsb2c8L2E+IGFuZCB0aGUgcHJvamVjdCdzCis8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9saXN0aW5mby5jZ2kvdG95Ym94LWxhbmRsZXkubmV0Pm1haWxpbmcKK2xpc3Q8L2E+IGFyZSBhbHNvIGdvb2Qgd2F5cyB0byB0cmFjayB3aGF0J3MgZ29pbmcgb24gd2l0aCB0aGUgcHJvamVjdC48L3A+CisKKzxiPjxoMj48YSBuYW1lPSJ0b3ljYW5zIiAvPldoYXQncyB0aGUgdG95Ym94IGxvZ28gaW1hZ2U/PC9oMj48L2I+CisKKzxwPkl0J3MgPGEgaHJlZj10b3ljYW5zLWJpZy5qcGc+Y2FyZWZ1bGx5IHN0YWNrZWQgc29kYSBjYW5zPC9hPi4gU3BlY2lmaWNhbGx5LAoraXQncyBhIGJ1bmNoIG9mIHRoZSBvcmlnaW5hbCAiQ29rZSBaZXJvIiBhbmQgIlBlcHNpIE9uZSIgY2FucywgY2lyY2EgMjAwNiwKK3N0YWNrZWQgdG8gc3BlbGwgb3V0IHRoZSBiaW5hcnkgdmFsdWVzIG9mIHRoZSBhc2NpaSBzdHJpbmcgIlRveWJveCIsIHdpdGgKK251bGwgdGVybWluYXRvciBhdCB0aGUgYm90dG9tLiAoVGhlIGJpZyBwaWN0dXJlJ3Mgb24gaXQncyBzaWRlIGJlY2F1c2UKK3RoZSBjYW1lcmEgd2FzIGhlbGQgc2lkZXdheXMgdG8gZ2V0IGEgYmV0dGVyIHNob3QuKTwvcD4KKworPHA+Tm8sIGl0J3Mgbm90IHBob3Rvc2hvcHBlZCwgSSBhY3R1YWxseSBoYWQgdGhlc2UgY2FucyB1bnRpbCBhIGNvd29ya2VyCit3aG8gVG90YWxseSBEaWQgTm90IEdldCBJdCA8c3VwPjxmb250IHNpemU9LTM+PGEgaHJlZj1odHRwOi8vd3d3LnRpbWVzeXMuY29tPnRtPC9hPjwvZm9udD48L3N1cD4gdGhyZXcgdGhlbSBvdXQgb25lIGRheSBhZnRlciBJJ2QgZ29uZSBob21lLAordGhpbmtpbmcgdGhleSB3ZXJlIHJlY3ljbGluZy4gKEkgc3RpbGwgaGF2ZSB0d28gb2YgZWFjaCBraW5kLCBidXQKK1BlcHNpIE9uZSBzZWVtcyBkaXNjb250aW51ZWQgYW5kIENva2UgWmVybyBzd2l0Y2hlZCBpdHMgY2FuIGNvbG9yCitmcm9tIGJsYWNrIHRvIGdyZXksIHByZXN1bWFibHkgaW4gY2VsZWJyYXRpb24uIEl0IHdhcyBmdW4gd2hpbGUgaXQgbGFzdGVkLi4uKTwvcD4KKworPGI+PGgyPkZvb3Rub3RlczwvaDI+PC9iPgorCis8cD48YSBuYW1lPSIxIiAvPjxhIGhyZWY9IiMxX2JhY2siPlsxXTwvYT4gT2ssIG1vc3QgdG9vbGNoYWlucyAoZ2NjLCBsbHZtLCBwY2MsIGxpYmZpcm0uLi4pCithcmUgbXVsdGlwbGUgcGFja2FnZXMsIGJ1dCB0aGUgbWFpbnRhaW5lciBvZiB0b3lib3ggdXNlZCB0byBtYWludGFpbiBhCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC90aW55Y2M+Zm9yayBvZiB0aW55Y2M8L2E+IChhbiBpbnRlZ3JhdGVkCitjb21waWxlci9hc3NlbWJsZXIvbGlua2VyIHdoaWNoIG9uY2UgdXBvbiBhCit0aW1lIGRpZCA8YSBocmVmPWh0dHA6Ly9iZWxsYXJkLm9yZy90Y2MvdGNjYm9vdC5odG1sPmJ1aWxkIGEgYm9vdGFibGUgbGludXgKK2tlcm5lbDwvYT4gYmVmb3JlIGl0cyBvcmlnaW5hbCBkZXZlbG9wZXIgYWJhbmRvbmVkIHRoZSBwcm9qZWN0KSwKK2FuZCBoYXMgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvcWNjL2ZpbGUvdGlwL3RvZG8vdG9kby50eHQ+dmFndWUgcGxhbnM8L2E+IG9mIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L3FjYz50cnlpbmcKK2FnYWluIHNvbWVkYXk8L2E+LiBUaGUgY29tcGlsZXIgdG9vbGNoYWluIGlzIF9jb25jZXB0dWFsbHlfIG9uZSBwYWNrYWdlLAoraW1wbGVtZW50YWJsZSBhcyBhIHNpbmdsZSBtdWx0aWNhbGwgYmluYXJ5IGFjdGluZyBsaWtlIG1ha2UsIGNjLCBhcywgbGQsIGNwcCwKK3N0cmlwLCByZWFkZWxmLCBubSwgb2JqZHVtcCwgYW5kIHNvIG9uIGFzIG5lY2Vzc2FyeS4gSXQncyBqdXN0IHRoZSBleGlzdGluZworcGFja2FnZXMgdGhhdCBkbyB0aGlzIDxzdHJpa2U+a2luZGEgc3Vjazwvc3RyaWtlPiBkb24ndC4gKEluIHRoZW9yeSAibWFrZSIKK2JlbG9uZ3MgaW4gcWNjLCBpbiBwcmFjdGljZSBsbHZtIGhhc24ndCBnb3QgaXRzIG93biBtYWtlIHNvIHRveWJveCBwcm9iYWJseQorbmVlZHMgdG8gYWRkIGl0IGFmdGVyIDEuMCB0byBlbGltaW5hdGUgYW5vdGhlciBncGwgYnVpbGQgcHJlcmVxdWl0ZSBmcm9tCitBT1NQLik8L3A+CisKKzxwPjxhIG5hbWU9IjIiIC8+PGEgaHJlZj0iIzJfYmFjayI+WzJdPC9hPgorVGhlIGRpdmlkaW5nIGxpbmUgaXMKKyJJcyB0aGVyZSBhbiBhY2NlcHRhYmx5IGxpY2Vuc2VkIHZlcnNpb24gQW5kcm9pZCBjYW4gc2hpcCwgb3IgZG8gd2UgaGF2ZQordG8gd3JpdGUgb25lPyIgU2luY2UgYW5kcm9pZCBpcyBub3QgIkdOVS9MaW51eCIgaW4gYW55IHdheSwgd2UgbmVlZCB0bworY2xlYW4gb3V0IGFsbCB0cmFjZXMgb2YgZ251IHNvZnR3YXJlIGZyb20gaXRzIGJ1aWxkIHRvIGdldCBhIGNsZWFuCitzZWxmLWhvc3Rpbmcgc3lzdGVtLjwvcD4KKworPCEtLSNpbmNsdWRlIGZpbGU9ImZvb3Rlci5odG1sIiAtLT4KZGlmZiAtLWdpdCBhL3RveWJveC93d3cvY2xlYW51cC5odG1sIGIvdG95Ym94L3d3dy9jbGVhbnVwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxZGZiOAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC93d3cvY2xlYW51cC5odG1sCkBAIC0wLDAgKzEsMjkwIEBACis8aHRtbD48aGVhZD48dGl0bGU+dG95Ym94IGNsZWFudXA8L3RpdGxlPjwvaGVhZD4KKzwhLS0jaW5jbHVkZSBmaWxlPSJoZWFkZXIuaHRtbCIgLS0+CisKKzxoMT5JbmRleDwvaDE+CisKKzx1bD4KKzxsaT48YSBocmVmPSNpbnRybz5JbnRyb2R1Y3Rpb248L2E+PC9saT4KKzxsaT48YSBocmVmPSNhZHZpY2U+QWR2aWNlPC9hPjwvbGk+Cis8bGk+Q29tbWFuZHM6PC9saT4KKzx1bD4KKzxsaT48YSBocmVmPSN1dWVuY29kZT51dWVuY29kZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9I3V1ZGVjb2RlPnV1ZGVjb2RlPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0jaWZjb25maWc+aWZjb25maWc8L2E+PC9saT4KKzxsaT48YSBocmVmPSNmaW5kPmZpbmQ8L2E+PC9saT4KKzwvdWw+Cis8L3VsPgorCis8aHI+CisKKzxhIG5hbWU9aW50cm8gLz4KKzxoMT5DbGVhbmluZyB1cCB0aGUgdG95Ym94IGNvZGUuPC9oMT4KKworPHA+VG95Ym94IDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLmh0bWwjMzEtMDMtMjAxMz5oYXNuJ3QgYWx3YXlzPC9hPgordGFrZW4gcHJvcGVyIGFkdmFudGFnZSBvZiBleHRlcm5hbCBjb250cmlidXRpb25zPC9hPi4KK0xvdHMgb2YgcGVvcGxlIHdhbnQgdG8gaGVscCwgYnV0IHRoZWlyIGNvbnRyaWJ1dGlvbnMgbGFuZ3Vpc2ggb3V0IG9mIHRyZWUKK29yIGluIHRoZSAicGVuZGluZyIgZGlyZWN0b3J5LCBhd2FpdGluZyBjbGVhbnVwLjwvcD4KKworPHA+VG95Ym94J3MgZGVzaWduIGdvYWxzIHJlcXVpcmUgc2ltcGxlciwgdGlnaHRlciwgYW5kIG1vcmUgZXhwbGljaXQgY29kZQordGhhbiBtb3N0IG90aGVyIGltcGxlbWVudGF0aW9ucywgYW1vbmcgb3RoZXIgcmVhc29ucyB0byBhbGxvdyBiZXR0ZXIgc2VjdXJpdHkKK2F1ZGl0aW5nLiBXcml0aW5nICJhbm90aGVyIiBpbXBsZW1lbnRhdGlvbiBvZiBzdGFuZGFyZCBjb21tYW5kIGxpbmUgdG9vbHMKK2lzbid0IHZlcnkgaW50ZXJlc3RpbmcsIHRoZXkgc2hvdWxkIGJlIF9iZXR0ZXJfIGltcGxlbWVudGF0aW9ucy4KK1VuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgZXhpc3RpbmcsIHdvcmtpbmcgY29tbWFuZHMgb2Z0ZW4gdGFrZSBtb3JlIGVmZm9ydCB0bworY2xlYW4gdXAgdG8gVG95Ym94J3Mgc3RhbmRhcmRzIHRoYW4gd3JpdGluZyBhIG5ldyBvbmUgZnJvbSBzY3JhdGNoLCBub3QKK2JlY2F1c2UgdGhleSBkb24ndCB3b3JrLCBidXQgYmVjYXVzZSB3ZSBhaW0gZm9yIGFuIHVudXN1YWwgbGV2ZWwgb2YgcG9saXNoLjwvcD4KKworPHA+SW4gaG9wZXMgb2YgdGVhY2hpbmcgbW9yZSBwZW9wbGUgaG93IHRvIGRvIHRoaXMKK2NsZWFudXAgd29yaywgSSd2ZSBzdGFydGVkIGJyZWFraW5nIGNsZWFudXAgY2hhbmdlcyBpbnRvIHNtYWxsZXIgY2h1bmtzIGFuZAorcG9zdGluZyBleHBsYW5hdGlvbnMgb2YgZWFjaCBjaGFuZ2UgdG8gdGhlIG1haWxpbmcgbGlzdC4KK0JlbG93IGFyZSBpbmRleGVzIG9mIHN1Y2ggY2xlYW51cCBzZXJpZXMuIEVhY2ggY29tbWl0IGFuZCBwb3N0IGFyZSBtZWFudCB0bworYmUgcmVhZCB0b2dldGhlcjogZWFjaCBkZXNjcmlwdGlvbiBleHBsYWlucyB3aGF0IHRoZSBjb3JyZXNwb25kaW5nIHBhdGNoCit3YXMgdHJ5aW5nIHRvIGFjY29tcGxpc2guPC9wPgorCis8cD5MaW5lL2J5dGUgdG90YWxzIG9mIGNvbXBsZXRlZCBzZXJpZXMgYXJlIGdpdmVuIGZvciBzY2FsZSwgYnV0IHRoZSBwb2ludAorb2YgdGhpcyB3b3JrIGlzIHNpbXBsaWNpdHkgYW5kIGNvbXBhY3RuZXNzLCBub3Qgc2l6ZSBwZXIgc2UuPC9wPgorCis8cD4oTm90ZTogbWVyY3VyaWFsJ3Mgd2ViIHZpZXdlciBkb2Vzbid0IGZvbGxvdyByZW5hbWVzLCBzbyBhbHRob3VnaCBlYWNoCitjb21tYW5kIG5hbWUgbGlua3MgdG8gYSBjb21taXQgbGlzdCB3aXRoIHRoZSBidWxrIG9mIHRoZSBjaGFuZ2VzLCBpdCBtYXkKK25vdCBpbmNsdWRlIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIGVhY2ggZmlsZSBtb3ZlZCBmcm9tIHRoZSAicGVuZGluZyIKK2RpcmVjdG9yeSB0byBpdHMgZmluYWwgbG9jYXRpb24uIFRoZSBzdW1tYXJpZXMgbGluayB0aGUgaW5pdGlhbCBhbmQgY2xlYW5lZAordmVyc2lvbnMgb2YgZWFjaCBmaWxlIHdoZW4gZ2l2aW5nIGxpbmUgY291bnRzLik8L3A+CisKKzxocj4KKworPGEgbmFtZT1hZHZpY2UgLz4KKzxoMT5HZW5lcmFsIGFkdmljZSBhbmQvb3IgcG9saWN5LjwvaDE+CisKKzxwPlRoZSA8YSBocmVmPWRlc2lnbi5odG1sPmRlc2lnbiBvZiB0b3lib3g8L2E+IHBhZ2UgYW5kIHRoZSBjb2RpbmcKK3N0eWxlIHNlY3Rpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSA8YSBocmVmPWNvZGUuaHRtbD5zb3VyY2UgY29kZSB3YWxrdGhyb3VnaDwvYT4KK2Rvbid0IGNvdmVyIGV2ZXJ5dGhpbmcuIEhlcmUgYXJlIHNvbWUKK2xpbmtzIHRvIG1haWxpbmcgbGlzdCBtZXNzYWdlcyB0aGF0IGNvdmVyIHZhcmlvdXMgcHJvZ3JhbW1pbmcgdG9waWNzCitub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNsZWFudXAgc2VyaWVzOjwvcD4KKworPHVsPgorPGxpPjxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1BcHJpbC8wMDA4NTAuaHRtbD5FcnJvciBtZXNzYWdlcyBhbmQgaW50ZXJuYXRpb25hbGl6YXRpb24uPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUFwcmlsLzAwMDg5MS5odG1sPldoeSBub3QgImNvbnN0Ij88L2E+IChFeGNlcHRpb246IGdsb2JhbCB2YXJpYWJsZXMKK291dHNpZGUgb2YgR0xPQkFMUyBjYW4gYmUgc3RhdGljIGNvbnN0LCB0byBnbyBpbiByb2RhdGEgaW5zdGVhZCBvZiBkYXRhLgorVGhpcyBtZWFucyB0aGUgcGFnZXMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGluc3RhbmNlcy4pPC9saT4KKzxsaT48YSBocmVmPWh0dHA6Ly9sa21sLmluZGlhbmEuZWR1L2h5cGVybWFpbC9saW51eC9rZXJuZWwvMTMwOC4zLzAzODkwLmh0bWw+V2h5IG5vdCAiYm9vbCI/PC9hPiAoZXhwbGFuYXRpb24gZnJvbSBMaW51cyBUb3J2YWxkcyk8L2xpPgorPGxpPjxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1BcHJpbC8wMDA4OTMuaHRtbD5XaHkgbm90IHRvIGNoZWNrIGluIGRlYnVnIGNvZGUuPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUp1bmUvMDAxMDQ0Lmh0bWw+UmVsYXRpb25zaGlwIGJldHdlZW4gL3Byb2MgYW5kIC9zeXM8L2E+ICgvcHJvYyBpc24ndCBvYnNvbGV0ZSBhbmQgL3N5cyBpcyBhbiBBQkkpPC9saT4KKzxsaT4iSGlkaW5nIG51bWJlcnMgdGhhdCBhcmUgdXNlZCBqdXN0IG9uY2UgaW50byBkZWZpbmVzIHRvIHB1dCB0aGVtIG91dCBvZgorc2lnaHQgZG9lcyBub3QgcmVhbGx5IGhlbHAgcmVhZGFiaWxpdHkuIjwvYT4gLQorPGEgaHJlZj1odHRwOi8vbGttbC5pdS5lZHUvaHlwZXJtYWlsL2xpbnV4L2tlcm5lbC8xNDA3LjEvMDAyOTkuaHRtbD5QYXZlbAorTWFjaGVrPC9hPjwvbGk+Cis8bGk+IkluZnJhc3RydWN0dXJlIGluIHNlYXJjaCBvZiBhIHVzZXIiIGlzIGEgYmFkIHRoaW5nLCBzbyBkb24ndCBwdXQgY29kZQoraW4gbGliLyB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGF0IGxlYXN0IHR3byB1c2Vycy4gRG9uJ3QgcHJlZW1wdGl2ZWx5CitmYWN0b3Igc3R1ZmYgb3V0LCBpdCdzIGVhc3kgZW5vdWdoIHRvIHJld3JpdGUgaXQgdWluIGZ1dHVyZSBpZiBpdCBuZWVkcwordG8gY2hhbmdlLiBUaGUgImV4dHJlbWUgcHJvZ3JhbW1pbmciIGZhZCBjYWxsZWQgdGhpcyAiWW91IEFpbid0IEdvbm5hCitOZWVkIEl0IiAod2hpbGUgaW5leHBsaWNhYmx5IHNjcmVhbWluZyBhdCBjYW5zIG9mIE1vdW50YWluIERldywgYmFjayBpbiB0aGUKKzkwJ3MpLiBIZXJlJ3MgPGEgaHJlZj1odHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNjgzNzQ1Lz5MaW51cyBUb3J2YWxkcycgdGFrZTwvYT4uPC9saT4KKzwvdWw+CisKKzxocj4KKworPGEgbmFtZT0idXVlbmNvZGUiPjxoMT48YSBocmVmPS9oZy90b3lib3gvbG9nLzkwMC90b3lzL3BlbmRpbmcvdXVlbmNvZGUuYz51dWVuY29kZTwvYT48L2gxPgorCis8cD5UaGlzIGlzIGFuIGV4YW1wbGUgb2YgY2xlYW5pbmcgdXAgc29tZXRoaW5nIG1vc3QgcHJvamVjdHMgd291bGQgYmUgcXVpdGUKK2hhcHB5IHdpdGguIFRoZSBpbml0aWFsIHN1Ym1pc3Npb24gb2YgdXVlbmNvZGUgYW5kIHV1ZGVjb2RlIHdhcyBoaWdoCitxdWFsaXR5IGNvZGUsIHdyaXR0ZW4gYnkgYSBzZWFzb25lZCBkZXZlbG9wZXIgd2hvIGRpZCBhbiBleGNlbGxlbnQKK2pvYiwgYnV0IGl0IHdhcyBzdGlsbCBwb3NzaWJsZSB0byBzaHJpbmsgdGhlIHJlc3VsdCBhbG1vc3QgYnkgaGFsZjo8L3A+CisKKzx1bD4KKzxsaT5vbGQgdG90YWw6IDxhIGhyZWY9L2hnL3RveWJveC9maWxlLzgyOC90b3lzL3BlbmRpbmcvdXVlbmNvZGUuYz4xMTYgbGluZXMgKDI3NDMKK2J5dGVzKSBpbiA3IGZ1bmN0aW9uczwvYT48L2xpPgorPGxpPm5ldyB0b3RhbDogPGEgaHJlZj0vaGcvdG95Ym94L2ZpbGUvODQxL3RveXMvcG9zaXgvdXVlbmNvZGUuYz42NyBsaW5lcyAoMTQ0MAorYnl0ZXMpIGluIDEgZnVuY3Rpb248L2E+PC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODMwPjgzMDwvYT46IGZpcnN0IHBhc3MsIGRlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwOTA0Lmh0bWw+cGFydCAxPC9hPiwKKzxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1BcHJpbC8wMDA5MDMuaHRtbD5wYXJ0IDI8L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODMxPjgzMTwvYT4sCitzZWNvbmQgcGFzcywgZGVzY3JpcHRpb246IDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1BcHJpbC8wMDA5MTkuaHRtbD5wYXJ0IDM8L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODM3PjgzNzwvYT4sCitkZXNjcmlwdGlvbjogZml4IHRlc3Qgc3VpdGUuPC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODUzPjg1MzwvYT4sIGRlc2NyaXB0aW9uOiBidWdmaXguPC9saT4KKzwvdWw+CisKKzxwPlN0YXR1czogQ09NUExFVEU8L3A+CisKKzxhIG5hbWU9InV1ZGVjb2RlIj48aDE+PGEgaHJlZj0vaGcvdG95Ym94L2xvZy85MDAvdG95cy9wZW5kaW5nL3V1ZGVjb2RlLmM+dXVkZWNvZGU8L2E+PC9oMT4KKworPHA+VGhlIHV1ZGVjb2RlIGNsZWFudXAgd2FzIG15IHNlY29uZCAiZXhwbGFpbiBhcyBJIGdvIGFsb25nIiBjbGVhbnVwLAorYW5kIEkgdHJpZWQgdG8gZG8gaXQgaW4gc21hbGxlciBzdGFnZXMgc28gaXQgd2FzIGVhc2llciB0byBzZWUgd2hhdAorY2hhbmdlZCBmcm9tIHRoZSBkaWZmOjwvcD4KKworPHVsPgorPGxpPm9sZDogPGEgaHJlZj0vaGcvdG95Ym94L2ZpbGUvODI4L3RveXMvcGVuZGluZy91dWRlY29kZS5jPjE3NQorbGluZXMgKDQ1MzQgYnl0ZXMpIGluIDkgZnVuY3Rpb25zPC9hPjwvbGk+Cis8bGk+bmV3OiA8YSBocmVmPS9oZy90b3lib3gvZmlsZS84NDAvdG95cy9wb3NpeC91dWRlY29kZS5jPjEwNyBsaW5lcworKDIzMDAgYnl0ZXMpIGluIDEgZnVuY3Rpb248L2E+PC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODMzPjgzMzwvYT4sCitkZXNjcmlwdGlvbjogcHJlcGFyYXRvcnkgYWRqdXN0bWVudHMgdG8gdGVzdCBzdWl0ZS48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84MzU+ODM1PC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTQtSmFudWFyeS8wMDE1MzIuaHRtbD5SZWRvIGNvbW1hbmQgbGluZSBwYXJzaW5nLCByZWRvIHBhcnNpbmcgbG9vcC48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODM4PjgzODwvYT4sCitkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDE0LUphbnVhcnkvMDAxNTMzLmh0bWw+UmVkbyBiNjRfMWJ5dGUsIGI2NF80Ynl0ZXMsIGFuZCB1dV9saW5lKCk8L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODM5PjgzOTwvYT4sCitkZXNjcmlwdGlvbjogdG9kbzwvYT48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NDA+ODQwPC9hPiwKK2Rlc2NyaXB0aW9uOiB0b2RvIChmaW5pc2gsIG1vdmUgcGVuZGluZy0+cG9zaXgsIGRlZmF1bHQgeSk8L2E+PC9saT4KKzwvdWw+CisKKzxwPlN0YXR1czogQ09NUExFVEU8L3A+CisKKzxhIG5hbWU9aWZjb25maWc+Cis8aDE+PGEgaHJlZj0vaGcvdG95Ym94L2xvZy90aXAvdG95cy9wZW5kaW5nL2lmY29uZmlnLmM+aWZjb25maWc8L2E+PC9oMT4KKworPHA+VGhpcyBzZXJpZXMgZGVzY3JpYmVzIGEgdGhvcm91Z2ggY2xlYW51cCB0aGF0IHRvb2sgYSB3aGlsZSB0byBkby48L3A+CisKKzxwPldoZW4gaWZjb25maWcgd2FzIHN1Ym1pdHRlZCwgaXQgdG91Y2hlZCBhIGhhbGYtZG96ZW4gZmlsZXMuIEkgZ2x1ZWQgaXQKK3RvZ2V0aGVyIGludG8gYSBzaW5nbGUgc2VsZi1jb250YWluZWQgZmlsZSwgd2hpY2ggbmVlZGVkIGEgbG90IG9mCitjbGVhbnVwLiBUaGUgZmluYWwgdmVyc2lvbiBpcyBhYm91dCAxLzMgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsLjwvcD4KKworPHVsPgorPGxpPm9sZCB0b3RhbDogPGEgaHJlZj0vaGcvdG95Ym94L2ZpbGUvODQxL3RveXMvcGVuZGluZy9pZmNvbmZpZy5jPjE1MDQgbGluZXMgKDQ0MjY4IGJ5dGVzKSBpbiAzOCBmdW5jdGlvbnM8L2E+PC9saT4KKzxsaT5uZXcgdG90YWw6IDxhIGhyZWY9L2hnL3RveWJveC9maWxlLzExMzMvdG95cy9vdGhlci9pZmNvbmZpZy5jPjUyMSBsaW5lcyAoMTU5NjMgYnl0ZXMpIGluIDQgZnVuY3Rpb25zPC9hPjwvbGk+Cis8L3VsPgorCis8cD5UaGlzIHdhcyB0aGUgZmlyc3QgY29tbWFuZCBJIHN0YXJ0ZWQgY2xlYW5pbmcgdXAgd2l0aCB0aGUgaW50ZW50IG9mCitkZXNjcmliaW5nIHRoZSBwcm9jZXNzLCBhbmQgZXNwZWNpYWxseSB0aGUgZmlyc3QgZmV3IGVudHJpZXMgaW4gdGhpcworc2VyaWVzIGRlc2NyaWJlIG1hbnkgb2YgdGhlIGxvdyBoYW5naW5nIGZydWl0IHRlY2huaXF1ZXMgdXNlZCB0byBjbGVhbgordXAgYSBjb2RlYmFzZS48L3A+CisKKzx1bD4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODQzPjg0MzwvYT4sIGRlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwODgyLmh0bWw+SW5mcmFzdHJ1Y3R1cmUgaW4gc2VhcmNoIG9mIGEgdXNlciwgY29kZSBwcm94aW1pdHksCit1bm5lY2Vzc2FyeSAjZGVmaW5lcywgc2hvcnRlciBjb2RlIGlzIGVhc2llciB0byByZWFkLjwvYT48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NDQ+ODQ0PC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwODgxLmh0bWw+SGVhZGVycywgcmVwbGFjaW5nIHJlcGVhdGVkIGNvZGUgd2l0aCBsb29wcywKK2xvZ2ljYWwgb3BlcmF0b3JzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIDAgb3IgMSwgbWF0aCBvbiBzdHJpbmcgY29uc3RhbnRzLAorcmVtb3ZpbmcgdW5uZWNlc3NhcnkgdmFyaWFibGVzIGFuZCB0ZXN0cy48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODUyPjg1MjwvYT4sCitkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUFwcmlsLzAwMDkyMS5odG1sPmhnIGNvbW1pdCBudW1iZXJzLCBkb2N1bWVudGluZyB0aGUgb2J2aW91cywgb3JkZXJpbmcKK3RvIGF2b2lkIHByb3RvdHlwZXMsIHJldHVybmluZyB2b2lkLCBjb2xsYXRlIGxvY2FsIGRlY2xhcmF0aW9ucywKK3VzZSBlcnJvcl9leGl0KCksIHVubmVjZXNzYXJ5IHBhcmVudGhlc2VzLCBpbmxpbmUgdG8gcmVtb3ZlIHZhcmlhYmxlcy9mdW5jdGlvbnMKK3VzZWQgb25seSBvbmNlLCB1c2luZyAqdmFyIGluc3RlYWQgb2YgdmFyWzBdLCB1bm5lY2Vzc2FyeSB0eXBlY2FzdHMsCit4cHJpbnRmKCJcbiIpIHZzIHhwdXRjKCdcbicpPC9hPjwvbGk+Cis8bGk+Y29tbWl0OiA8YSBocmVmPS9oZy90b3lib3gvcmV2Lzg1Nj44NTY8L2E+LAorZGVzY3JpcHRpb246IG9uZSBsaW5lIHBvcnRhYmlsaXR5IGZpeCBmcm9tIElzYWFjIER1bmhhbTwvbGk+Cis8bGk+Y29tbWl0OiA8YSBocmVmPS9oZy90b3lib3gvcmV2Lzg2MT44NjE8L2E+CithbmQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NjM+ODYzPC9hPiwKK2Rlc2NyaXB0aW9uOgorPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUFwcmlsLzAwMDkxMC5odG1sPkhlbHAKK2luZnJhc3RydWN0dXJlIGNsZWFudXAgZnJvbSBJc2FhYyBEdW5oYW08L2E+Cisod2hpY2ggSSBtaXMtYXBwbGllZCBhbmQgdGhlbiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwOTIwLmh0bWw+Zml4ZWQgcGx1cyBzb21lIHdoaXRlc3BhY2UgY2hhbmdlczwvYT4pPC9saT4KKworPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NjI+ODYyPC9hPiwgZGVzY3JpcHRpb246Cis8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTQtSmFudWFyeS8wMDE1MjUuaHRtbD5yZW1vdmUgdW51c2VkIGhlYWRlcnMgYW5kIGZ1bmN0aW9uLCByZXBsYWNlIGxvY2FsIGJ1ZmZlciB3aXRoIHRveWJ1ZiwgcGVycm9yX2V4aXQoKSwgYXZvaWQgdW5uZWNlc3NhcnkgYXNzaWdubWVudC48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODY0Pjg2NDwvYT4sIGRlc2NyaXB0aW9uOgorPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDE0LUphbnVhcnkvMDAxNTI2Lmh0bWw+dXNlIGNvbW1vbiBsaW5rZWQgbGlzdCBmdW5jdGlvbnMsIGlubGluZSBzZXRfZGF0YSwgYWRkIHhpb2N0bCwgY2xlYW4gdXAgZXJyb3IgbWVzc2FnZXMsIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgdHdlYWtzLCByZW1vdmUgTk9QIHJldHVybiBzdGF0ZW1lbnRzPC9hPjwvbGk+Cis8bGk+Y29tbWl0OiA8YSBocmVmPS9oZy90b3lib3gvcmV2Lzg2Nj44NjY8L2E+LCBkZXNjcmlwdGlvbjoKKzxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxNC1KYW51YXJ5LzAwMTUyOC5odG1sPm1vdmUgc3RhbmRhbG9uZSBnbG9iYWxzIGludG8gR0xPQkFMUygpIGJsb2NrLCBjb2xsYXRlIHN0cnVjdHMgaW50bworaWZhY2VfbGlzdC4gSW5saW5lL3Jld3JpdGUvcmVtb3ZlIGZpZWxkX2Zvcm1hdCwgaWZhY2VfZmxhZ3Nfc3RyLAorb21pdF93aGl0ZXNwYWNlKCksIHByaW50X2lmYWNlX2ZsYWdzKCksIHByaW50X21lZGlhKCksIGdldF9pZmNvbmZpZ19pbmZvKCksCithbmQgY2xlYXJfbGlzdCgpLiBNZXJnZSBkdXBsaWNhdGUgZnVuY3Rpb24KK2NhbGxzLiBTaG93IGdldF9wcm9jX2luZm8oKSB2ZXJzaW9uIGZpZWxkIGNhbid0IG1hdHRlciBpbiAyLjYgb3IgbmV3ZXIga2VybmVsLAorYW5kIHRoYXQgU0lPQ0dJRk1BUCBoYXMgYmVlbiB0aGVyZSBzaW5jZSAxOTk0IHNvIGRvZXNuJ3QgbmVlZCBhbiAjaWZkZWYuCitMb29wIHNpbXBsaWZpY2F0aW9uIGluIHJlYWRjb25mKCkgYW5kIHNob3dfaWZhY2UoKS48L2E+PC9saT4KKworPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84Njk+ODY5PC9hPiBhbmQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NzA+ODcwPC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwOTI4Lmh0bWw+ODY5OgorcmVvcmRlciB0byBlbGltaW5hdGUgcHJvdG90eXBlcywgcHV0IGNvbW1hbmRfbWFpbigpIGF0IGVuZCBvZiBmaWxlLAorODcwOiBsb25nIHJlcGVhdGVkIHZhcmlhYmxlIHByZWZpeGVzLCByZXBsYWNpbmcgc3RydWN0K3NzY2FuZigpK3ByaW50ZiB3aXRoIGEKK2xvb3AgYW5kIGEgdGFibGUgKGZyb20gaWZhY2VfbGlzdCwgZ2V0X3Byb2NfaW5mbygpLCBkaXNwbGF5X2lmY29uZmlnKCkpLAordXNlIGxpYi94d3JhcC5jIGZ1bmN0aW9ucyB0byByZXR1cm4gdm9pZCwgd2h5IHhzdHJjcHkoKSBmYWlscyBjbG9zZWQsCisoZnVuY3Rpb25hbCBjb21tZW50OiB3aHkgbXVsdGljYXN0IGZhaWxlZCwgQ1NMSVAgb2Jzb2xlY2Vuc2UpLCBub3QgYmVpbmcKK190b29fIGNsZXZlci48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODc4Pjg3ODwvYT4gYW5kIDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODc5Pjg3OTwvYT46CitkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUFwcmlsLzAwMDk0Ni5odG1sPjg3ODogYWRkIHhzb2NrZXQoKSwgZnJlZShOVUxMKSBpcyBhIHNhZmUgTk9QIChwb3NpeCEpLgorODc5OiBpbmxpbmUgdGhyZWUgZnVuY3Rpb25zIGFuZCBzaW1wbGlmeSwgc29tZSBzaW1wbGlmaWNhdGlvbnMgb25seSBzaG93IHVwCithZnRlciByZXBlYXRlZCBpbmxpbmluZzwvYT48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84ODM+ODgzPC9hPiwKK2Rlc2NyaXB0aW9uOiBtb3ZlIHNvbWUgY29tbW9uIGNvZGUgdG8gbGliLyBhbmQgcG9zaXggaGVhZGVycyB0byB0b3lzLmguPC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODk4Pjg5ODwvYT4sCitkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLU1heS8wMDA5NzQuaHRtbD5Bcmd1bWVudCBwYXJzaW5nLiAoUmVwbGFjZSBpZmNvbmZpZ19tYWluKCkgaWYvZWxzZSBzdGFpcmNhc2Ugd2l0aCBhIGxvb3Agb3ZlcgorYW4gYXJyYXksIGdlbmVyaWNpemUgbWludXMgcHJlZml4IGxvZ2ljLCBpbmxpbmUgYSB1c2Ugb2Ygc2V0X2ZsYWdzKCkuKTwvYT48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi85MDU+OTA1PC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtTWF5LzAwMDk5Mi5odG1sPnJlbW92ZSB1bm5lY2Vzc2FyeSB3cmFwcGVyIGZ1bmN0aW9uLCBpbmxpbmluZyBtb3JlIGZ1bmN0aW9ucywKK3JlbHlpbmcgb24gdGhlIHZhbHVlcyBvZiBjb25zdGFudHMgdGhhdCBkb24ndCBjaGFuZ2UgYWNyb3NzIGFyY2hpdGVjdHVyZXMKKyhiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkpLCBtb3JlIGlmY29uZmlnX21haW4gdGFibGUgd29yaywKK21hbiBpb2N0bF9saXN0LjwvYT48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi85MDY+OTA2PC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtTWF5LzAwMDk5NC5odG1sPk1vcmUgaWZjb25maWdfbWFpbigpIHRhYmxlIHdvcmssIHJlbW92ZSB2ZXN0aWdpYWwgYXJndW1lbnRzCit0byBmdW5jdGlvbnMsICJhIGZyZW56eSBvZiBpbmxpbmluZyIsIHNsaWdodGx5IGJldHRlciBlcnJvciByZXBvcnRpbmcsCitkb24ndCByZWludmVudCBsaWJjIGZ1bmN0aW9ucy48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTA3PjkwNzwvYT4sCis8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtTWF5LzAwMDk5NS5odG1sPmlubGluaW5nIHNob3dfaXBfYWRkcigpIHdpdGggYSBsb29wIGFuZCBhIHRhYmxlLCBpbmxpbmluZyBoZXhfdG9fYmluYXJ5KCkKK2FuZCBzZXRfaHdfYWRkcmVzcygpLCBzdG9wIHZhbGlkYXRpbmcgZGF0YSB3ZSBzdXBwbGllZCwgcmVtb3ZlIGEgdGFibGUKK3RoYXQncyBvdmVya2lsbCAodHdvIGVudHJpZXMsIHdlIGRvbid0IGV2ZW4gbG9vcCBvdmVyIGl0KSwgd2hlbiB5b3UgZG9uJ3QgbmVlZCBhCitOVUxMIHRlcm1pbmF0b3IgZm9yIGFycmF5LCByZW1vdmUgdW5uZWNlc3NhcnkgbWVtY3B5KG9mZnNldG9mKCkpIHdpdGgKK2Fzc2lnbm1lbnQsIHRydXN0aW5nIC1mdW5zaWduZWQtY2hhci48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTE5PjkxOTwvYT4sCis8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtSnVuZS8wMDEwMjcuaHRtbD50b2RvIHdoaXRlc3BhY2UgZGFtYWdlLCBpbnRyb2R1Y2UgSUZSRVFfT0ZGU1ooKSBhbmQgcG9rZSgpIHRvCitpZmNvbmZpZ19tYWluKCkgdGFibGUgbG9naWMgdG8gZm9sZCBtb3JlIGlmL2Vsc2UgcGFydHMgaW50byB0aGUgdGFibGU8L2E+PC9saT4KKzxsaT5TdGF0dXMgdXBkYXRlOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtSnVuZS8wMDEwMzMuaHRtbD5FbnRlcmluZyB0aGUgaG9tZSBzdHJldGNoIG9uIGlmY29uZmlnPC9hPiAoYW5kIGEgPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLUp1bmUvMDAxMDQzLmh0bWw+bm90ZSBhYm91dCBpbmZpbmliYW5kPC9hPik8L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi85MjE+OTIxPC9hPiwgZGVzY3JpcHRpb246IDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxNC1KdW5lLzAwMzUwOC5odG1sPklubGluZSBhIGNvdXBsZSBtb3JlIGZ1bmN0aW9ucyBhbmQgbWFrZSBzb2NrZmQgYSBnbG9iYWwuPC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTU3Pjk1NzwvYT4sIGRlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtSnVseS8wMDExMjEuaHRtbD5SZW1vdmUgdW51c2VkIHNvY2tsZW4gYW5kIGFkZHJfdG9fbGVuKCksIGNsZWFudXAgc28gd2UgY2FuIG1lcmdlIGdldF9kZXZpY2VfaW5mbygpL2Rpc3BsYXlfaWZjb25maWcoKS48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTU4Pjk1ODwvYT4sIGRlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtSnVseS8wMDExMzEuaHRtbD5UaGlzIGNvbW1pdCByZW1vdmVzIHN0cnVjdCBpZl9saXN0IGJ5IHVuaWZ5aW5nIGdldF9kZXZpY2VfaW5mbygpIGFuZCBkaXNwbGF5X2lmY29uZmlnKCkuPC9hPjwvbGk+Cis8bGk+Y29tbWl0OiA8YSBocmVmPS9oZy90b3lib3gvcmV2LzExMDQ+MTEwNDwvYT4sIGRlc2NyaXB0aW9uOiBNZXJnZSB0b3luZXQgaW50byB0b3lzLmg6IG11c2wgc3VwcG9ydHMgaXQgYW5kIG1pY3JvbWFuYWdpbmcgdUNsaWJjIGNvbmZpZyBvcHRpb25zIGlzbid0IHZlcnkgaW50ZXJlc3RpbmcgYW55bW9yZS48L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi8xMTI3PjExMjc8L2E+LCBkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLU5vdmVtYmVyLzAwMTQ2NC5odG1sPlN0YXJ0IHRhY2xpbmcgaXB2NiBpc3N1ZXMsIGJlZ2lubmluZyB3aXRoIGRpc3BsYXlfaWZjb25maWcoKS48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvMTEyOD4xMTI4PC9hPiwgZGVzY3JpcHRpb246IDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1Ob3ZlbWJlci8wMDE0NjMuaHRtbD5Nb3JlIGlwdjYsIG1ha2Ugc3RydWN0IHNvY2thZGRyX3dpdGhfbGVuIGdvIGF3YXksIG1lcmdlIG1vcmUgYXJndW1lbnRzIGludG8gdGhlIHRhYmxlIGluIG1haW4oKS48L2E+PC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvMTEzMj4xMTMyPC9hPiwgZGVzY3JpcHRpb246IHByb21vdGlvbiBmcm9tIHBlbmRpbmcgdG8gb3RoZXI8L2xpPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi8xMTMyPjExMzM8L2E+LCBkZXNjcmlwdGlvbjogPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLU5vdmVtYmVyLzAwMTQ2Mi5odG1sPmNsZWFudXAgaGVscCB0ZXh0LCByZW1vdmUgb2Jzb2xldGUvTk9QIGNvbW1hbmRzPC9hPjwvbGk+Cis8L3VsPgorCis8cD5TdGF0dXM6IENPTVBMRVRFLjwvcD4KKworPGgxPjxhIGhyZWY9L2hnL3RveWJveC9sb2cvdGlwL3RveXMvcGVuZGluZy9maW5kLmM+ZmluZDwvYT48L2gxPgorCis8cHJlPgorODE0IEluaXRpYWwgdmVyc2lvbiBieSBHdXJhbmcgU2hhc3RyaS4KKzgxNQorODE2Cis4NDcgRmVsaXggSmFuZGEKKzg0OCBXaGl0ZXNwYWNlIChyZWluZGVudCBmcm9tIHRhYnMgLT4gMiBzcGFjZXMpCis4NDkgTW9yZSBjbGVhbnVwCis4NjcgRmVsaXggSmFuZGEgSW1wcm92ZSBvcGVyYXRvciBwcm9jZXNzaW5nLgorODc0IEZlbGl4IEphbmRhCis4NzUgRmVsaXggSmFuZGEKKzg4NyBGZWxpeCBKYW5kYSBmaXggLW10aW1lCis8L3ByZT4KKworPHVsPgorPGxpPmNvbW1pdDogPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NDk+ODQ5PC9hPiwKK2Rlc2NyaXB0aW9uOiA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwODk1Lmh0bWw+aGVyZTwvYT48L2xpPgorPC91bD4KKworPHA+U3RhdHVzOiBpbiBwcm9ncmVzcy48L3A+CisKKzxoMT48YSBocmVmPS9oZy90b3lib3gvbG9nLzkxNy90b3lzL3BlbmRpbmcvc3RhdC5jPnN0YXQ8L2E+PC9oMT4KKworPHA+QSBsb3Qgb2YgdGhlIHN0YXQgY2xlYW51cCB3YXMgZG9uZSBieSBGZWxpeCBKYW5kYS48L3A+CisKKzx1bD4KKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi83NDc+NzQ3PC9hPjogaW5pdGlhbCBzdWJtaXNzaW9uPC9hPjwvbGk+Cis8bGk+Y29tbWl0IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvODEwPjgxMDwvYT46IHdoaXRlc3BhY2U8L2xpPgorPGxpPmNvbW1pdCA8YSBocmVmPS9oZy90b3lib3gvcmV2LzgxMT44MTE8L2E+OiBkZXNjcmlwdGlvbiBpbiBjb21taXQgbWVzc2FnZS48L2xpPgorPGxpPmNvbW1pdCA8YSBocmVmPS9oZy90b3lib3gvcmV2Lzg3MT44NzE8L2E+OiB3aGl0ZXNwYWNlIChyZWluZGVudCBmcm9tIDQgc3BhY2VzIHRvIDIpPC9saT4KKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NzI+ODcyPC9hPjogRmVsaXggSmFuZGEgLSA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwOTIzLmh0bWw+Y2xlYW51cDwvYT4gKHdpdGggZGlzY3Vzc2lvbiB0aHJlYWQpPC9saT4KKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84NzU+ODg1PC9hPjogRmVsaXggSmFuZGEgLSA8YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtQXByaWwvMDAwOTM2Lmh0bWw+bW92ZSBwZXJtaXNzaW9uIGZvcm1hdHRpbmcgKDc3NyAtPiAtcnd4cnd4cnd4KSBmcm9tIGxzIHRvIGxpYiBzbyBzdGF0IGNhbiByZXVzZSBpdC48L2E+PC9saT4KKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi84ODU+ODg2PC9hPjogRmVsaXggSmFuZGEgLSByZW1vdmUgdW5pbXBsZW1lbnRlZCBvcHRpb25zIGFuZCBjbGVhbiB1cCBoZWxwIHRleHQ8L2xpPgorPGxpPmNvbW1pdCA8YSBocmVmPS9oZy90b3lib3gvcmV2LzkxMD45MTA8L2E+OiBGZWxpeCBKYW5kYSAtIDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1NYXkvMDAxMDEzLmh0bWw+QWRkIHN1cHBvcnQgZm9yIHN0YXRpbmcgbXVsdGlwbGUgZmlsZXM8L2E+LjwvbGk+Cis8bGk+Y29tbWl0IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTExPjkxMTwvYT46IEZlbGl4IEphbmRhIC0gU2VwYXJhdGUgc3RhdCBhbmQgc3RhdGZzLCBnaXZlIHN0YXRfbWFpbigpIGEgZHNbMl0gYXJyYXkgdG8gZGlzdGluZ3Vpc2ggRkxBR19mIHZzIG5vdCBjYXNlcywgYW5kIHNvbWUgd2hpdGVzcGFjZSBjaGFuZ2VzLjwvbGk+Cis8bGk+Y29tbWl0IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTEyPjkxMjwvYT46IGRlc2NyaXB0aW9uIGluIGNvbW1pdCBtZXNzYWdlIChhbHNvIDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1NYXkvMDAxMDE5Lmh0bWw+aGVyZTwvYT4pPC9saT4KKzxsaT48YSBocmVmPWh0dHA6Ly9saXN0cy5sYW5kbGV5Lm5ldC9waXBlcm1haWwvdG95Ym94LWxhbmRsZXkubmV0LzIwMTMtTWF5LzAwMTAyNC5odG1sPmRlc2lnbiBwb25kZXJpbmc8L2E+IChsZWFkaW5nIHRvIHBlZWsoKSBmdW5jdGlvbiBpbiBsaWIvKTwvbGk+CisKKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi85MTQ+OTE0PC9hPjogZGVzY3JpcHRpb24gaW4gY29tbWl0IG1lc3NhZ2UuPC9saT4KKzxsaT5jb21taXQgPGEgaHJlZj0vaGcvdG95Ym94L3Jldi85MTY+OTE2PC9hPjogZGVzY3JpcHRpb24gaW4gY29tbWl0IG1lc3NhZ2UuPC9saT4KKzxsaT5jb21taXQ6IDxhIGhyZWY9L2hnL3RveWJveC9yZXYvOTE3PjkxNzwvYT46IGRlc2NyaXB0aW9uIGluIGNvbW1pdCBtZXNzYWdlLjwvbGk+Cis8bGk+Y29tbWl0OiA8YSBocmVmPS9oZy90b3lib3gvcmV2LzkxOD45MTg8L2E+LAorZGVzY3JpcHRpb246IGRvbmU6IG1vdmUgcGVuZGluZyB0byBwb3NpeCwgZGVmYXVsdCB5LCBubyBvdGhlciBjaGFuZ2VzPC9hPi48L2xpPgorPGxpPjxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L3BpcGVybWFpbC90b3lib3gtbGFuZGxleS5uZXQvMjAxMy1KdW5lLzAwMTAyNi5odG1sPnN1bW1hcnk8L2E+PC9saT4KKzwvdWw+CisKKzxwPlN0YXR1czogQ09NUExFVEUuPC9wPgorCis8IS0tI2luY2x1ZGUgZmlsZT0iZm9vdGVyLmh0bWwiIC0tPgpkaWZmIC0tZ2l0IGEvdG95Ym94L3d3dy9jb2RlLmh0bWwgYi90b3lib3gvd3d3L2NvZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDU2NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3d3dy9jb2RlLmh0bWwKQEAgLTAsMCArMSwxNDI0IEBACis8aHRtbD48aGVhZD48dGl0bGU+dG95Ym94IHNvdXJjZSBjb2RlIHdhbGt0aHJvdWdoPC90aXRsZT48L2hlYWQ+Cis8IS0tI2luY2x1ZGUgZmlsZT0iaGVhZGVyLmh0bWwiIC0tPgorCis8cD48aDE+PGEgbmFtZT0ic3R5bGUiIC8+PGEgaHJlZj0iI3N0eWxlIj5Db2RlIHN0eWxlPC9hPjwvaDE+PC9wPgorCis8cD5UaGUgcHJpbWFyeSBnb2FsIG9mIHRveWJveCBpcyBfc2ltcGxlXyBjb2RlLiBLZWVwaW5nIHRoZSBjb2RlIHNtYWxsIGlzCitzZWNvbmQsIHdpdGggc3BlZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgY29taW5nIGluIHNvbWV3aGVyZSBhZnRlciB0aGF0LgorKEZvciBtb3JlIG9uIHRoYXQsIHNlZSB0aGUgPGEgaHJlZj1kZXNpZ24uaHRtbD5kZXNpZ248L2E+IHBhZ2UuKTwvcD4KKworPHA+QSBzaW1wbGUgaW1wbGVtZW50YXRpb24gdXN1YWxseSB0YWtlcyB1cCBmZXdlciBsaW5lcyBvZiBzb3VyY2UgY29kZSwKK21lYW5pbmcgbW9yZSBjb2RlIGNhbiBmaXQgb24gdGhlIHNjcmVlbiBhdCBvbmNlLCBtZWFuaW5nIHRoZSBwcm9ncmFtbWVyIGNhbgorc2VlIG1vcmUgb2YgaXQgb24gdGhlIHNjcmVlbiBhbmQgdGh1cyBrZWVwIG1vcmUgaWYgaW4gdGhlaXIgaGVhZCBhdCBvbmNlLgorVGhpcyBoZWxwcyBjb2RlIGF1ZGl0aW5nIGFuZCB0aHVzIHJlZHVjZXMgYnVncy4gVGhhdCBzYWlkLCBzb21ldGltZXMgYmVpbmcKK21vcmUgZXhwbGljaXQgaXMgcHJlZmVyYWJsZSB0byBiZWluZyBjbGV2ZXIgZW5vdWdoIHRvIG91dHNtYXJ0IHlvdXJzZWxmOgorZG9uJ3QgYmUgc28gdGVyc2UgeW91ciBjb2RlIGlzIHVucmVhZGFibGUuPC9wPgorCis8cD5Ub3lib3ggaGFzIGFuIGFjdHVhbCBjb2Rpbmcgc3R5bGUgZ3VpZGUgb3ZlciBvbgorPGEgaHJlZj1kZXNpZ24uaHRtbCNjb2Rlc3R5bGU+dGhlIGRlc2lnbiBwYWdlPC9hPiwgYnV0IGluIGdlbmVyYWwgd2UganVzdAord2FudCB0aGUgY29kZSB0byBiZSBjb25zaXN0ZW50LjwvcD4KKworPHA+PGgxPjxhIG5hbWU9ImJ1aWxkaW5nIiAvPjxhIGhyZWY9IiNidWlsZGluZyI+QnVpbGRpbmcgVG95Ym94PC9hPjwvaDE+PC9wPgorCis8cD5Ub3lib3ggaXMgY29uZmlndXJlZCB1c2luZyB0aGUgS2NvbmZpZyBsYW5ndWFnZSBwaW9uZWVyZWQgYnkgdGhlIExpbnV4CitrZXJuZWwsIGFuZCBhZG9wdGVkIGJ5IG1hbnkgb3RoZXIgcHJvamVjdHMgKHVDbGliYywgT3BlbkVtYmVkZGVkLCBldGMpLgorVGhpcyBnZW5lcmF0ZXMgYSAiLmNvbmZpZyIgZmlsZSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBvcHRpb25zLCB3aGljaAorY29udHJvbHMgd2hpY2ggZmVhdHVyZXMgYXJlIGluY2x1ZGVkIHdoZW4gY29tcGlsaW5nIHRveWJveC48L3A+CisKKzxwPkVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGEgZGVmYXVsdCB2YWx1ZS4gVGhlIGRlZmF1bHRzIGluZGljYXRlIHRoZQorIm1heGltdW0gc2FuZSBjb25maWd1cmF0aW9uIiwgSS5FLiBpZiB0aGUgZmVhdHVyZSBkZWZhdWx0cyB0byAibiIgdGhlbiBpdAorZWl0aGVyIGlzbid0IGNvbXBsZXRlIG9yIGlzIGEgc3BlY2lhbC1wdXJwb3NlIG9wdGlvbiAoc3VjaCBhcyBkZWJ1Z2dpbmcKK2NvZGUpIHRoYXQgaXNuJ3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2UuPC9wPgorCis8cD5Gb3IgYSBtb3JlIGNvbXBhY3QgaHVtYW4tZWRpdGFibGUgdmVyc2lvbiAuY29uZmlnIGZpbGVzLCB5b3UgY2FuIHVzZSB0aGUKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvRkFRLmh0bWwjZGV2X21pbmljb25maWc+bWluaWNvbmZpZzwvYT4KK2Zvcm1hdC48L3A+CisKKzxwPlRoZSBzdGFuZGFyZCBidWlsZCBpbnZvY2F0aW9uIGlzOjwvcD4KKworPHVsPgorPGxpPm1ha2UgZGVmY29uZmlnICMob3IgbWVudWNvbmZpZyk8L2xpPgorPGxpPm1ha2U8L2xpPgorPGxpPm1ha2UgaW5zdGFsbDwvbGk+Cis8L3VsPgorCis8cD5UeXBlICJtYWtlIGhlbHAiIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGJ1aWxkIG9wdGlvbnMuPC9wPgorCis8cD5UaGUgZmlsZSAiY29uZmlndXJlIiBjb250YWlucyBhIG51bWJlciBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZWZpbml0aW9ucword2hpY2ggaW5mbHVlbmNlIHRoZSBidWlsZCwgc3VjaCBhcyBzcGVjaWZ5aW5nIHdoaWNoIGNvbXBpbGVyIHRvIHVzZSBvciB3aGVyZQordG8gaW5zdGFsbCB0aGUgcmVzdWx0aW5nIGJpbmFyaWVzLiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgdGhlIGJ1aWxkLCBidXQKK2FjY2VwdHMgZXhpc3RpbmcgZGVmaW5pdGlvbnMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcywgc28gaXQgbWF5IGJlIHNvdXJjZWQKK29yIG1vZGlmaWVkIGJ5IHRoZSBkZXZlbG9wZXIgYmVmb3JlIGJ1aWxkaW5nIGFuZCB0aGUgZGVmaW5pdGlvbnMgZXhwb3J0ZWQKK3RvIHRoZSBlbnZpcm9ubWVudCB3aWxsIHRha2UgcHJlY2VkZW5jZS48L3A+CisKKzxwPihUbyBjbGFyaWZ5OiAiLmNvbmZpZyIgbGlzdHMgdGhlIGZlYXR1cmVzIHNlbGVjdGVkIGJ5IGRlZmNvbmZpZy9tZW51Y29uZmlnLAorSS5FLiAid2hhdCB0byBidWlsZCIsIGFuZCAiY29uZmlndXJlIiBkZXNjcmliZXMgdGhlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24KK2Vudmlyb25tZW50LCBJLkUuICJob3cgdG8gYnVpbGQgaXQiLik8L3A+CisKKzxwPkJ5IGRlZmF1bHQgIm1ha2UgaW5zdGFsbCIgcHV0cyBmaWxlcyBpbiAvdXNyL3RveWJveC4gQWRkaW5nIHRoaXMgdG8gdGhlCiskUEFUSCBpcyB1cCB0byB5b3UuIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkUFJFRklYIGNhbiBjaGFuZ2UgdGhlCitpbnN0YWxsIGxvY2F0aW9uLCBhbGEgIlBSRUZJWD0vdXNyL2xvY2FsL2JpbiBtYWtlIGluc3RhbGwiLjwvcD4KKworPHA+SWYgeW91IG5lZWQgYW4gdW5zdHJpcHBlZCAoZGVidWcpIHZlcnNpb24gb2YgYW55IG9mIHRoZXNlIGJpbmFyaWVzLAorbG9vayBpbiBnZW5lcmF0ZWQvdW5zdHJpcHBlZC48L3A+CisKKzxwPjxoMT48YSBuYW1lPSJydW5uaW5nIj48YSBocmVmPSIjcnVubmluZyI+UnVubmluZyBhIGNvbW1hbmQ8L2E+PC9oMT48L3A+CisKKzxoMj5tYWluPC9oMj4KKworPHA+VGhlIHRveWJveCBtYWluKCkgZnVuY3Rpb24gaXMgYXQgdGhlIGVuZCBvZiBtYWluLmMgYXQgdGhlIHRvcCBsZXZlbC4gSXQgaGFzCit0d28gcG9zc2libGUgY29kZXBhdGhzLCBvbmx5IG9uZSBvZiB3aGljaCBpcyBjb25maWd1cmVkIGludG8gYW55IGdpdmVuIGJ1aWxkCitvZiB0b3lib3guPC9wPgorCis8cD5JZiBDT05GSUdfU0lOR0xFIGlzIHNlbGVjdGVkLCB0b3lib3ggaXMgY29uZmlndXJlZCB0byBjb250YWluIG9ubHkgYSBzaW5nbGUKK2NvbW1hbmQsIHNvIG1vc3Qgb2YgdGhlIG5vcm1hbCBzZXR1cCBjYW4gYmUgc2tpcHBlZC4gSW4gdGhpcyBjYXNlIHRoZQorbXVsdGlwbGV4ZXIgaXNuJ3QgdXNlZCwgaW5zdGVhZCBtYWluKCkgY2FsbHMgdG95X3NpbmdsZWluaXQoKSAoYWxzbyBpbiBtYWluLmMpCit0byBzZXQgdXAgZ2xvYmFsIHN0YXRlIGFuZCBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCBjYWxscyB0aGUgY29tbWFuZCdzCittYWluIGZ1bmN0aW9uIG91dCBvZiB0b3lfbGlzdCAoaW4gdGhlIENPTkZJR19TSU5HTEUgY2FzZSB0aGUgYXJyYXkgaGFzIGEgc2luZ2xlIGVudHJ5LCBubyBuZWVkIHRvIHNlYXJjaCksIGFuZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbnN0ZWFkIG9mIGV4aXRpbmcKK2l0IGZsdXNoZXMgc3Rkb3V0IChkZXRlY3RpbmcgZXJyb3IpIGFuZCByZXR1cm5zIHRveXMuZXhpdHZhbC48L3A+CisKKzxwPldoZW4gQ09ORklHX1NJTkdMRSBpcyBub3Qgc2VsZWN0ZWQsIG1haW4oKSB1c2VzIGJhc2VuYW1lKCkgdG8gZmluZCB0aGUKK25hbWUgaXQgd2FzIHJ1biBhcywgc2hpZnRzIGl0cyBhcmd1bWVudCBsaXN0IG9uZSB0byB0aGUgcmlnaHQgc28gaXQgbGluZXMgdXAKK3dpdGggd2hlcmUgdGhlIG11bHRpcGxleGVyIGZ1bmN0aW9uIGV4cGVjdHMgaXQsIGFuZCBjYWxscyB0b3lib3hfbWFpbigpLiBUaGlzCitsZXZlcmFnZXMgdGhlIG11bHRpcGxleGVyIGNvbW1hbmQncyBpbmZyYXN0cnVjdHVyZSB0byBmaW5kIGFuZCBydW4gdGhlCithcHByb3ByaWF0ZSBjb21tYW5kLiAoQSBjb21tYW5kIG5hbWUgc3RhcnRpbmcgd2l0aCAidG95Ym94IiB3aWxsCityZWN1cnNpdmVseSBjYWxsIHRveWJveF9tYWluKCk7IHlvdSBjYW4gZ28gIi4vdG95Ym94IHRveWJveCB0b3lib3ggdG95Ym94IGxzIgoraWYgeW91IHdhbnQgdG8uLi4pPC9wPgorCis8aDI+dG95Ym94X21haW48L2gyPgorCis8cD5UaGUgdG95Ym94X21haW4oKSBmdW5jdGlvbiBpcyBhbHNvIGluIG1haW4sYy4gSXQgaGFuZGxlcyBhIHBvc3NpYmxlCistLWhlbHAgb3B0aW9uICgidG95Ym94IC0taGVscCBscyIpLCBwcmludHMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzIGlmIG5vCithcmd1bWVudHMgd2VyZSBwcm92aWRlZCB0byB0aGUgbXVsdGlwbGV4ZXIgKG9yIHdpdGggZnVsbCBwYXRoIG5hbWVzIGlmIGFueQorb3RoZXIgb3B0aW9uIGlzIHByb3ZpZGVkIGJlZm9yZSBhIGNvbW1hbmQgbmFtZSwgYWxhICJ0b3lib3ggLS1saXN0IikuCitPdGhlcndpc2UgaXQgY2FsbHMgdG95X2V4ZWMoKSBvbiBpdHMgYXJndW1lbnQgbGlzdC48L3A+CisKKzxwPk5vdGUgdGhhdCB0aGUgbXVsdGlwbGV4ZXIgaXMgdGhlIGZpcnN0IGVudHJ5IGluIHRveV9saXN0ICh0aGUgcmVzdCBvZiB0aGUKK2xpc3QgaXMgc29ydGVkIGFscGhhYmV0aWNhbGx5IHRvIGFsbG93IGJpbmFyeSBzZWFyY2gpLCBzbyB0b3lib3hfbWFpbiBjYW4KK2NoZWF0IGFuZCBqdXN0IGdyYWIgdGhlIGZpcnN0IGVudHJ5IHRvIHF1aWNrbHkgc2V0IHVwIGl0cyBjb250ZXh0IHdpdGhvdXQKK3NlYXJjaGluZy4gU2luY2UgYWxsIGNvbW1hbmQgbmFtZXMgZ28gdGhyb3VnaCB0aGUgbXVsdGlwbGV4ZXIgYXQgbGVhc3Qgb25jZQoraW4gdGhlIG5vbi1UT1lCT1hfU0lOR0xFIGNhc2UsIHRoaXMgYXZvaWRzIGEgcmVkdW5kYW50IHNlYXJjaCBvZgordGhlIGxpc3QuPC9wPgorCis8cD5UaGUgdG95X2V4ZWMoKSBmdW5jdGlvbiBpcyBhbHNvIGluIG1haW4uYy4gSXQgcGVyZm9ybXMgdG95X2ZpbmQoKSB0bworcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHRveV9saXN0IGFycmF5IHRvIGxvb2sgdXAgdGhlIGNvbW1hbmQncworZW50cnkgYnkgbmFtZSBhbmQgc2F2ZXMgaXQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSB3aGljaCwgY2FsbHMgdG95X2luaXQoKQordG8gcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2V0IHVwIGdsb2JhbCBzdGF0ZSAodXNpbmcgd2hpY2gtPm9wdGlvbnMpLAorYW5kIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kJ3MgbWFpbigpIGZ1bmN0aW9uICh3aGljaC0+dG95X21haW4pLiBPbgorcmV0dXJuIGl0IGZsdXNoZXMgYWxsIHBlbmRpbmcgYW5zaSBGSUxFICogSS9PLCBkZXRlY3RzIGlmIHN0ZG91dCBoYWQgYW4KK2Vycm9yLCBhbmQgdGhlbiBjYWxscyB4ZXhpdCgpICh3aGljaCB1c2VzIHRveXMuZXhpdHZhbCkuPC9wPgorCis8cD48aDE+PGEgbmFtZT0iaW5mcmFzdHJ1Y3R1cmUiIC8+PGEgaHJlZj0iI2luZnJhc3RydWN0dXJlIj5JbmZyYXN0cnVjdHVyZTwvYT48L2gxPjwvcD4KKworPHA+VGhlIHRveWJveCBzb3VyY2UgY29kZSBpcyBpbiBmb2xsb3dpbmcgZGlyZWN0b3JpZXM6PC9wPgorPHVsPgorPGxpPlRoZSA8YSBocmVmPSIjdG9wIj50b3AgbGV2ZWwgZGlyZWN0b3J5PC9hPiBjb250YWlucyB0aGUgZmlsZSBtYWluLmMgKHdlcmUKK2V4ZWN1dGlvbiBzdGFydHMpLCB0aGUgaGVhZGVyIGZpbGUgdG95cy5oIChpbmNsdWRlZCBieSBldmVyeSBjb21tYW5kKSwgYW5kCitvdGhlciBnbG9iYWwgaW5mcmFzdHJ1Y3R1cmUuPC9saT4KKzxsaT5UaGUgPGEgaHJlZj0iI2xpYiI+bGliIGRpcmVjdG9yeTwvYT4gY29udGFpbnMgY29tbW9uIGZ1bmN0aW9ucyBzaGFyZWQgYnkKK211bHRpcGxlIGNvbW1hbmRzOjwvbGk+Cis8dWw+Cis8bGk+PGEgaHJlZj0iI2xpYl9saWIiPmxpYi9saWIuYzwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNsaWJfeHdyYXAiPmxpYi94d3JhcC5jPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI2xpYl9sbGlzdCI+bGliL2xsaXN0LmM8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjbGliX2FyZ3MiPmxpYi9hcmdzLmM8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjbGliX2RpcnRyZWUiPmxpYi9kaXJ0cmVlLmM8L2E+PC9saT4KKzwvdWw+Cis8bGk+VGhlIDxhIGhyZWY9IiN0b3lzIj50b3lzIGRpcmVjdG9yeTwvYT4gY29udGFpbnMgdGhlIEMgZmlsZXMgaW1wbGVtZW50YXRpbmcKK2VhY2ggY29tbWFuZC4gQ3VycmVudGx5IGl0IGNvbnRhaW5zIGZpdmUgc3ViZGlyZWN0b3JpZXMgY2F0ZWdvcml6aW5nIHRoZQorY29tbWFuZHM6IHBvc2l4LCBsc2IsIG90aGVyLCBleGFtcGxlLCBhbmQgcGVuZGluZy48L2xpPgorPGxpPlRoZSA8YSBocmVmPSIjc2NyaXB0cyI+c2NyaXB0cyBkaXJlY3Rvcnk8L2E+IGNvbnRhaW5zIHRoZSBidWlsZCBhbmQKK3Rlc3QgaW5mcmFzdHJ1Y3R1cmUuPC9saT4KKzxsaT5UaGUgPGEgaHJlZj0iI2tjb25maWciPmtjb25maWcgZGlyZWN0b3J5PC9hPiBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbgoraW5mcmFzdHJ1Y3R1cmUgaW1wbGVtZW50aW5nIG1lbnVjb25maWcgKGNvcGllZCBmcm9tIHRoZSBMaW51eCBrZXJuZWwpLjwvbGk+Cis8bGk+VGhlIDxhIGhyZWY9IiNnZW5lcmF0ZWQiPmdlbmVyYXRlZCBkaXJlY3Rvcnk8L2E+IGNvbnRhaW5zIGludGVybWVkaWF0ZQorZmlsZXMgZ2VuZXJhdGVkIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIHNvdXJjZSBjb2RlLjwvbGk+Cis8L3VsPgorCis8YSBuYW1lPSJhZGRpbmciIC8+Cis8cD48aDE+PGEgaHJlZj0iI2FkZGluZyI+QWRkaW5nIGEgbmV3IGNvbW1hbmQ8L2E+PC9oMT48L3A+Cis8cD5UbyBhZGQgYSBuZXcgY29tbWFuZCB0byB0b3lib3gsIGFkZCBhIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhhdCBjb21tYW5kIHRvCitvbmUgb2YgdGhlIHN1YmRpcmVjdG9yaWVzIHVuZGVyIHRoZSB0b3lzIGRpcmVjdG9yeS4gIE5vIG90aGVyIGZpbGVzIG5lZWQgdG8KK2JlIG1vZGlmaWVkOyB0aGUgYnVpbGQgZXh0cmFjdHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBpdCBuZWVkcyAoc3VjaCBhcyBjb21tYW5kCitsaW5lIGFyZ3VtZW50cykgZnJvbSBzcGVjaWFsbHkgZm9ybWF0dGVkIGNvbW1lbnRzIGFuZCBtYWNyb3MgaW4gdGhlIEMgZmlsZS4KKyhTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSA8YSBocmVmPSIjZ2VuZXJhdGVkIj4iZ2VuZXJhdGVkIiBkaXJlY3Rvcnk8L2E+Citmb3IgZGV0YWlscy4pPC9wPgorCis8cD5DdXJyZW50bHkgdGhlcmUgYXJlIGZpdmUgc3ViZGlyZWN0b3JpZXMgdW5kZXIgInRveXMiLCBvbmUgZm9yIGNvbW1hbmRzCitkZWZpbmVkIGJ5IHRoZSBQT1NJWCBzdGFuZGFyZCwgb25lIGZvciBjb21tYW5kcyBkZWZpbmVkIGJ5IHRoZSBMaW51eCBTdGFuZGFyZAorQmFzZSwgYW4gIm90aGVyIiBkaXJlY3RvcnkgZm9yIGNvbW1hbmRzIG5vdCBjb3ZlcmVkIGJ5IGFuIG9idmlvdXMgc3RhbmRhcmQsCithIGRpcmVjdG9yeSBvZiBleGFtcGxlIGNvbW1hbmRzICh0ZW1wbGF0ZXMgdG8gdXNlIHdoZW4gc3RhcnRpbmcgbmV3IGNvbW1hbmRzKSwKK2FuZCBhICJwZW5kaW5nIiBkaXJlY3Rvcnkgb2YgY29tbWFuZHMgdGhhdCBuZWVkIGZ1cnRoZXIgcmV2aWV3L2NsZWFudXAKK2JlZm9yZSBtb3ZpbmcgdG8gb25lIG9mIHRoZSBvdGhlciBkaXJlY3RvcmllcyAocnVuIHRoZXNlIGF0IHlvdXIgb3duIHJpc2ssCitjbGVhbnVwIHBhdGNoZXMgd2VsY29tZSkuCitUaGVzZSBkaXJlY3RvcmllcyBhcmUganVzdCBmb3IgZGV2ZWxvcGVyIGNvbnZlbmllbmNlIHNvcnRpbmcgdGhlIGNvbW1hbmRzLAordGhlIGRpcmVjdG9yaWVzIGFyZSBvdGhlcndpc2UgZnVuY3Rpb25hbGx5IGlkZW50aWNhbC4gVG8gYWRkIGEgbmV3IGNhdGVnb3J5LAorY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcnkgd2l0aCBhIFJFQURNRSBmaWxlIGluIGl0IHdob3NlIGZpcnN0IGxpbmUKK2lzIHRoZSBkZXNjcmlwdGlvbiBtZW51Y29uZmlnIHNob3VsZCB1c2UgZm9yIHRoZSBkaXJlY3RvcnkuKTwvcD4KKworPHA+QW4gZWFzeSB3YXkgdG8gc3RhcnQgYSBuZXcgY29tbWFuZCBpcyBjb3B5IHRoZSBmaWxlICJ0b3lzL2V4YW1wbGUvaGVsbG8uYyIKK3RvIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29tbWFuZCwgYW5kIG1vZGlmeSB0aGlzIGNvcHkgdG8gaW1wbGVtZW50IHRoZSBuZXcKK2NvbW1hbmQgKG1vcmUgb3IgbGVzcyBieSB0dXJuaW5nIGV2ZXJ5IGluc3RhbmNlIG9mICJoZWxsbyIgaW50byB0aGUKK25hbWUgb2YgeW91ciBjb21tYW5kLCB1cGRhdGluZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgZ2xvYmFscywgYW5kCitoZWxwIGRhdGEsIGFuZCB0aGVuIGZpbGxpbmcgb3V0IGl0cyAibWFpbiIgZnVuY3Rpb24gd2l0aCBjb2RlIHRoYXQgZG9lcworc29tZXRoaW5nIGludGVyZXN0aW5nKS48L3A+IAorCis8cD5Zb3UgY291bGQgYWxzbyBzdGFydCB3aXRoICJ0b3lzL2V4YW1wbGUvc2tlbGV0b24uYyIsIHdoaWNoIHByb3ZpZGVzIGEgbG90Cittb3JlIGV4YW1wbGUgY29kZSAoc2hvd2luZyBzZXZlcmFsIHZhcmlhbnRzIG9mIGNvbW1hbmQgbGluZSBvcHRpb24KK3BhcnNpbmcsIGhvdyB0byBpbXBsZW1lbnQgbXVsdGlwbGUgY29tbWFuZHMgaW4gdGhlIHNhbWUgZmlsZSwgYW5kIHNvIG9uKS4KK0J1dCB1c3VhbGx5IGl0J3MganVzdCBtb3JlIHN0dWZmIHRvIGRlbGV0ZS48L3A+CisKKzxwPkhlcmUncyBhIGNoZWNrbGlzdCBvZiBzdGVwcyB0byB0dXJuIGhlbGxvLmMgaW50byBhbm90aGVyIGNvbW1hbmQ6PC9wPgorCis8dWw+Cis8bGk+PHA+Rmlyc3QgImNwIHRveXMvZXhhbXBsZS9oZWxsby5jIHRveXMvb3RoZXIveW91cmNvbW1hbmQuYyIgYW5kIG9wZW4KK3RoZSBuZXcgZmlsZSBpbiB5b3VyIHByZWZlcnJlZCB0ZXh0IGVkaXRvci48L3A+Cis8dWw+PGxpPjxwPk5vdGUgdGhhdCB0aGUKK25hbWUgb2YgdGhlIG5ldyBmaWxlIGlzIHNpZ25pZmljYW50OiBpdCdzIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29tbWFuZCB5b3UncmUKK2FkZGluZyB0byB0b3lib3guIFRoZSBidWlsZCBpbmNsdWRlcyBhbGwgKi5jIGZpbGVzIHVuZGVyIHRveXMvKi8gd2hvc2UKK25hbWVzIGFyZSBhIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGFuIGVuYWJsZWQgY29uZmlnIHN5bWJvbC4gU28KK3RveXMvcG9zaXgvY2F0LmMgb25seSBnZXRzIGluY2x1ZGVkIGlmIHlvdSBoYXZlICJDQVQ9eSIgaW4gIi5jb25maWciLjwvcD48L2xpPgorPC91bD48L3A+PC9saT4KKworPGxpPjxwPkNoYW5nZSB0aGUgb25lIGxpbmUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlIChjdXJyZW50bHkKKyJoZWxsby5jIC0gQSBoZWxsbyB3b3JsZCBwcm9ncmFtIikgdG8gZGVzY3JpYmUgeW91ciBuZXcgZmlsZS48L3A+PC9saT4KKworPGxpPjxwPkNoYW5nZSB0aGUgY29weXJpZ2h0IG5vdGljZSB0byB5b3VyIG5hbWUsIGVtYWlsLCBhbmQgdGhlIGN1cnJlbnQKK3llYXIuPC9wPjwvbGk+CisKKzxsaT48cD5HaXZlIGEgVVJMIHRvIHRoZSByZWxldmFudCBzdGFuZGFyZHMgZG9jdW1lbnQsIHdoZXJlIGFwcGxpY2FibGUuCisoU2FtcGxlIGxpbmtzIHRvIFNVU3Y0IGFuZCBMU0IgYXJlIHByb3ZpZGVkLCBmZWVsIGZyZWUgdG8gbGluayB0byBvdGhlcgorZG9jdW1lbnRhdGlvbiBvciBzdGFuZGFyZHMgYXMgYXBwcm9wcmlhdGUuKTwvcD48L2xpPgorCis8bGk+PHA+VXBkYXRlIHRoZSBVU0VfWU9VUkNPTU1BTkQoTkVXVE9ZKHlvdXJjb21tYW5kLCJibGFoIiwwKSkgbGluZS4KK1RoZSBORVdUT1kgbWFjcm8gZmlsbHMgb3V0IHRoaXMgY29tbWFuZCdzIDxhIGhyZWY9IiN0b3lfbGlzdCI+dG95X2xpc3Q8L2E+CitzdHJ1Y3R1cmUuICBUaGUgYXJndW1lbnRzIHRvIHRoZSBORVdUT1kgbWFjcm8gYXJlOjwvcD4KKworPG9sPgorPGxpPjxwPnRoZSBuYW1lIHVzZWQgdG8gcnVuIHlvdXIgY29tbWFuZDwvcD48L2xpPgorPGxpPjxwPnRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgPGEgaHJlZj0iI2xpYl9hcmdzIj5vcHRpb24gcGFyc2luZyBzdHJpbmc8L2E+ICgwIGlmIG5vbmUpPC9wPjwvbGk+Cis8bGk+PHA+YSBiaXRmaWVsZCBvZiBUT1lGTEFHIHZhbHVlcworKGRlZmluZWQgaW4gdG95cy5oKSBwcm92aWRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHdoZXJlIHlvdXIKK2NvbW1hbmQgc2hvdWxkIGJlIGluc3RhbGxlZCBvbiBhIHJ1bm5pbmcgc3lzdGVtLCB3aGV0aGVyIHRvIGJsYW5rIHVtYXNrCitiZWZvcmUgcnVubmluZywgd2hldGhlciBvciBub3QgdGhlIGNvbW1hbmQgbXVzdCBydW4gYXMgcm9vdCAoYW5kIHRodXMgc2hvdWxkCityZXRhaW4gcm9vdCBhY2Nlc3MgaWYgaW5zdGFsbGVkIFNVSUQpLCBhbmQgc28gb24uPC9wPjwvbGk+Cis8L29sPgorPC9saT4KKworPGxpPjxwPkNoYW5nZSB0aGUga2NvbmZpZyBkYXRhIChmcm9tICJjb25maWcgWU9VUkNPTU1BTkQiIHRvIHRoZSBlbmQgb2YgdGhlCitjb21tZW50IGJsb2NrKSB0byBzdXBwbHkgeW91ciBjb21tYW5kJ3MgY29uZmlndXJhdGlvbiBhbmQgaGVscAoraW5mb3JtYXRpb24uICBUaGUgdXBwcGVyIGNhc2UgY29uZmlnIHN5bWJvbHMgYXJlIHVzZWQgYnkgbWVudWNvbmZpZywgYW5kIGFyZQorYWxzbyB3aGF0IHRoZSBDRkdfIGFuZCBVU0VfKCkgbWFjcm9zIGFyZSBnZW5lcmF0ZWQgZnJvbSAoc2VlIFtUT0RPXSkuICBUaGUKK2hlbHAgaW5mb3JtYXRpb24gaGVyZSBpcyB1c2VkIGJ5IG1lbnVjb25maWcsIGFuZCBhbHNvIGJ5IHRoZSAiaGVscCIgY29tbWFuZCB0bworZGVzY3JpYmUgeW91ciBuZXcgY29tbWFuZC4gIChTZWUgW1RPRE9dIGZvciBkZXRhaWxzLikgIEJ5IGNvbnZlbnRpb24sCit1bmZpbmlzaGVkIGNvbW1hbmRzIGRlZmF1bHQgdG8gIm4iIGFuZCBmaW5pc2hlZCBjb21tYW5kcyBkZWZhdWx0IHRvICJ5IiwKK3NvICJtYWtlIGRlZmNvbmZpZyIgc2VsZWN0cyBhbGwgZmluaXNoZWQgY29tbWFuZHMuICAoTm90ZSwgImZpbmlzaGVkIiBtZWFucworInJlYWR5IHRvIGJlIHVzZWQiLCBub3QgdGhhdCBpdCdsbCBuZXZlciBjaGFuZ2UgYWdhaW4uKTxwPgorCis8cD5FYWNoIGhlbHAgYmxvY2sgc2hvdWxkIHN0YXJ0IHdpdGggYSAidXNhZ2U6IHlvdXJjb21tYW5kIiBsaW5lIGV4cGxhaW5pbmcKK2FueSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFkZGVkIGJ5IHRoaXMgY29uZmlnIG9wdGlvbi4gIFRoZSAiaGVscCIgY29tbWFuZAorb3V0cHV0cyB0aGlzIHRleHQsIGFuZCBzY3JpcHRzL2NvbmZpZzJoZWxwLmMgaW4gdGhlIGJ1aWxkIGluZnJhc3RydWN0dXJlCitjb2xsYXRlcyB0aGVzZSB1c2FnZSBsaW5lcyBmb3IgY29tbWFuZHMgd2l0aCBtdWx0aXBsZSBjb25maWd1cmF0aW9uCitvcHRpb25zIHdoZW4gcHJvZHVjaW5nIGdlbmVyYXRlZC9oZWxwLmguPC9wPgorPC9saT4KKworPGxpPjxwPkNoYW5nZSB0aGUgIiNkZWZpbmUgRk9SX2hlbGxvIiBsaW5lIHRvICIjZGVmaW5lIEZPUl95b3VyY29tbWFuZCIgcmlnaHQKK2JlZm9yZSB0aGUgIiNpbmNsdWRlIDx0b3lzLmg+Ii4gKFRoaXMgc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgRkxBR18gbWFjcm9zIGFuZAorZG9lcyBhICIjZGVmaW5lIFRUIHRoaXMueW91cmNvbW1hbmQiIHNvIHlvdSBjYW4gYWNjZXNzIHRoZSBnbG9iYWwgdmFyaWFibGVzCitvdXQgb2YgdGhlIHNwYWNlLXNhdmluZyB1bmlvbiBvZiBzdHJ1Y3R1cmVzLiBJZiB5b3UgYXJlbid0IHVzaW5nIGFueSBjb21tYW5kCitmbGFnIGJpdHMgYW5kIGFyZW4ndCBkZWZpbmluZyBhIEdMT0JBTCBibG9jaywgeW91IGNhbiBkZWxldGUgdGhpcyBsaW5lLik8L3A+PC9saT4KKworPGxpPjxwPlVwZGF0ZSB0aGUgR0xPQkFMUygpIG1hY3JvIHRvIGNvbnRhaW4geW91ciBjb21tYW5kJ3MgZ2xvYmFsCit2YXJpYWJsZXMuIElmIHlvdXIgY29tbWFuZCBoYXMgbm8gZ2xvYmFsIHZhcmlhYmxlcywgZGVsZXRlIHRoaXMgbWFjcm8uPC9wPgorCis8cD5WYXJpYWJsZXMgaW4gdGhlIEdMT0JBTFMoKSBibG9jayBhcmUgYXJlIHN0b3JlZCBpbiBhIHNwYWNlIHNhdmluZworPGEgaHJlZj0iI3RveV91bmlvbiI+dW5pb24gb2Ygc3RydWN0dXJlczwvYT4gZm9ybWF0LCB3aGljaCBtYXkgYmUgYWNjZXNzZWQKK3VzaW5nIHRoZSBUVCBtYWNybyBhcyBpZiBUVCB3ZXJlIGEgZ2xvYmFsIHN0cnVjdHVyZSAoc28gVFQubWVtYmVybmFtZSkuCitJZiB5b3Ugc3BlY2lmaWVkIHR3by1jaGFyYWN0ZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbgorTkVXVE9ZKCksIHRoZSBmaXJzdCBmZXcgZ2xvYmFsIHZhcmlhYmxlcyB3aWxsIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBhdXRvbWF0aWMKK2FyZ3VtZW50IHBhcnNpbmcgbG9naWMsIGFuZCB0aGUgdHlwZSBhbmQgb3JkZXIgb2YgdGhlc2UgdmFyaWFibGVzIG11c3QKK2NvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gTkVXVE9ZKCkuCisoU2VlIDxhIGhyZWY9IiNsaWJfYXJncyI+bGliL2FyZ3MuYzwvYT4gZm9yIGRldGFpbHMuKTwvcD48L2xpPgorCis8bGk+PHA+UmVuYW1lIGhlbGxvX21haW4oKSB0byB5b3VyY29tbWFuZF9tYWluKCkuICBUaGlzIGlzIHRoZSBtYWluKCkgZnVuY3Rpb24KK3doZXJlIGV4ZWN1dGlvbiBvZiB5b3VyIGNvbW1hbmQgc3RhcnRzLiBZb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZQorYWxyZWFkeSBzb3J0ZWQgaW50byB0aGlzLm9wdGZsYWdzLCB0aGlzLm9wdGFyZ3MsIHRoaXMub3B0YywgYW5kIHRoZSBHTE9CQUxTKCkKK2FzIGFwcHJvcHJpYXRlIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAoU2VlCis8YSBocmVmPSIjbGliX2FyZ3MiPmdldF9vcHRmbGFncygpPC9hPiBmb3IgZGV0YWlscy4pPC9wPjwvbGk+CisKKzxsaT48cD5Td2l0Y2ggb24gVE9ZQk9YX0RFQlVHIGluIG1lbnVjb25maWcgKHRveWJveCBnbG9iYWwgc2V0dGluZ3MgbWVudSkKK3RoZSBmaXJzdCB0aW1lIHlvdSBidWlsZCBhbmQgcnVuIHlvdXIgbmV3IGNvbW1hbmQuIElmIGFueXRoaW5nIGlzIHdyb25nCit3aXRoIHlvdXIgb3B0aW9uIHN0cmluZywgdGhhdCB3aWxsIGdpdmUgeW91IGVycm9yIG1lc3NhZ2VzLjwvcD4KKworPHA+T3RoZXJ3aXNlIGl0J2xsIGp1c3Qgc2VnZmF1bHQgd2l0aG91dAorZXhwbGFuYXRpb24gd2hlbiBpdCBmYWxscyBvZmYgdGhlIGVuZCBiZWNhdXNlIGl0IGRpZG4ndCBmaW5kIGEgbWF0Y2hpbmcKK2VuZCBwYXJhbnRoZXNlcyBmb3IgYSBsb25nb3B0LCBvciB5b3UgcHV0IGEgbm9uZXhpc3RlbnQgb3B0aW9uIGluIGEgc3F1YXJlCiticmFja2V0IGdyb3VwaW5nLi4uIFNpbmNlIHRoZXNlIGtpbmQgb2YgZXJyb3JzIGNhbiBvbmx5IGJlIGNhdXNlZCBieSBhCitkZXZlbG9wZXIsIG5vdCBieSBlbmQgdXNlcnMsIHdlIGRvbid0IG5vcm1hbGx5IHdhbnQgcnVudGltZSBjaGVja3MgZm9yCit0aGVtLiBPbmNlIHlvdSdyZSBoYXBweSB3aXRoIHlvdXIgb3B0aW9uIHN0cmluZywgeW91IGNhbiBzd2l0Y2ggVE9ZQk9YX0RFQlVHCitiYWNrIG9mZi48L3A+PC9saT4KKzwvdWw+CisKKzxhIG5hbWU9ImhlYWRlcnMiIC8+PGgyPjxhIGhyZWY9IiNoZWFkZXJzIj5IZWFkZXJzLjwvYT48L2gyPgorCis8cD5Db21tYW5kcyBnZW5lcmFsbHkgZG9uJ3QgaGF2ZSB0aGVpciBvd24gaGVhZGVycy4gSWYgaXQncyBjb21tb24gY29kZQoraXQgY2FuIGxpdmUgaW4gbGliLywgaWYgaXQgaXNuJ3QgcHV0IGl0IGluIHRoZSBjb21tYW5kJ3MgLmMgZmlsZS4gKFRoZSBsaW5lCitiZXR3ZWVuIGltcGxlbWVudGluZyBtdWx0aXBsZSBjb21tYW5kcyBpbiBhIEMgZmlsZSB2aWEgT0xEVE9ZKCkgdG8gc2hhcmUKK2luZnJhc3RydWN0dXJlIGFuZCBtb3ZpbmcgdGhhdCBzaGFyZWQgaW5mcmFzdHJ1Y3R1cmUgdG8gbGliLyBpcyBhIGp1ZGdlbWVudAorY2FsbC4gVHJ5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggaXMgc2ltcGxlc3QuKTwvcD4KKworPHA+VGhlIHRvcCBsZXZlbCB0b3lzLmggc2hvdWxkICNpbmNsdWRlIGFsbCB0aGUgc3RhbmRhcmQgKHBvc2l4KSBoZWFkZXJzCit0aGF0IGFueSBjb21tYW5kIHVzZXMuIChQYXJ0bHkgdGhpcyBpcyBmcmllbmRseSB0byBjY2FjaGUgYW5kIHBhcnRseSB0aGlzCittYWtlcyB0aGUgY29tbWFuZCBpbXBsZW1lbnRhdGlvbnMgc2hvcnRlci4pIEluZGl2aWR1YWwgY29tbWFuZHMgc2hvdWxkIG9ubHkKK25lZWQgdG8gaW5jbHVkZSBub25zdGFuZGFyZCBoZWFkZXJzIHRoYXQgbWlnaHQgcHJldmVudCB0aGF0IGNvbW1hbmQgZnJvbQorYnVpbGRpbmcgaW4gc29tZSBjb250ZXh0IHdlJ2QgY2FyZSBhYm91dCAoYW5kIHRodXMgcmVxdWlyaW5nIHRoYXQgY29tbWFuZCB0bworYmUgZGlzYWJsZWQgdG8gYXZvaWQgYSBidWlsZCBicmVhaykuPC9wPgorCis8cD5UYXJnZXQtc3BlY2lmaWMgc3R1ZmYgKGRpZmZlcmVuY2VzIGJldHdlZW4gY29tcGlsZXIgdmVyc2lvbnMsIGxpYmMgdmVyc2lvbnMsCitvciBvcGVyYXRpbmcgc3lzdGVtcykgc2hvdWxkIGJlIGNvbmZpbmVkIHRvIGxpYi9wb3J0YWJpbGl0eS5oIGFuZAorbGliL3BvcnRhYmlsaXR5LmMuIChUaGVyZSdzIGV2ZW4gc29tZSBtaW5pbWFsIGNvbXBpbGUtdGltZSBlbnZpcm9ubWVudCBwcm9iaW5nCit0aGF0IHdyaXRlcyBkYXRhIHRvIGdlbmVyYXRlZC9wb3J0YWJpbGl0eS5oLCBzZWUgc2NyaXB0cy9nZW5jb25maWcuc2guKTwvcD4KKworPHA+T25seSBpbmNsdWRlIGxpbnV4LyouaCBoZWFkZXJzIGZyb20gaW5kaXZpZHVhbCBjb21tYW5kcyAobm90IGZyb20gb3RoZXIKK2hlYWRlcnMpLCBhbmQgb25seSBpZiB5b3UgcmVhbGx5IG5lZWQgdG8uIERhdGEgdGhhdCB2YXJpZXMgcGVyIGFyY2hpdGVjdHVyZQoraXMgYSBnb29kIHJlYXNvbiB0byBpbmNsdWRlIGEgaGVhZGVyLiBJZiB5b3UganVzdCBuZWVkIGEgY291cGxlIGNvbnN0YW50cwordGhhdCBoYXZlbid0IGNoYW5nZWQgc2luY2UgdGhlIDE5OTAncywgaXQncyBvayB0byAjZGVmaW5lIHRoZW0geW91cnNlbGYgb3IKK2p1c3QgdXNlIHRoZSBjb25zdGFudCBpbmxpbmUgd2l0aCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aGF0IGl0IGlzLiAoQQorI2RlZmluZSB0aGF0J3Mgb25seSB1c2VkIG9uY2UgaXNuJ3QgcmVhbGx5IGhlbHBpbmcuKTwvcD4KKworPHA+PGEgbmFtZT0idG9wIiAvPjxoMT48YSBocmVmPSIjdG9wIj5Ub3AgbGV2ZWwgZGlyZWN0b3J5LjwvYT48L2gxPjwvcD4KKworPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZ2xvYmFsIGluZnJhc3RydWN0dXJlLjwvcD4KKworPGgzPnRveXMuaDwvaDM+Cis8cD5FYWNoIGNvbW1hbmQgI2luY2x1ZGVzICJ0b3lzLmgiIGFzIHBhcnQgb2YgaXRzIHN0YW5kYXJkIHByb2xvZy4gSXQKK21heSAiI2RlZmluZSBGT1JfY29tbWFuZG5hbWUiIGJlZm9yZSBkb2luZyBzbyB0byBnZXQgc29tZSBleHRyYSBlbnRyaWVzCitzcGVjaWZpYyB0byB0aGlzIGNvbW1hbmQuPC9wPgorCis8cD5UaGlzIGZpbGUgc3Vja3MgaW4gbW9zdCBvZiB0aGUgY29tbW9ubHkgdXNlZCBzdGFuZGFyZCAjaW5jbHVkZXMsIHNvCitpbmRpdmlkdWFsIGZpbGVzIGNhbiBqdXN0ICNpbmNsdWRlICJ0b3lzLmgiIGFuZCBub3QgaGF2ZSB0byB3b3JyeSBhYm91dAorc3RkYXJncy5oIGFuZCBzbyBvbi4gIEluZGl2aWR1YWwgY29tbWFuZHMgc3RpbGwgbmVlZCB0byAjaW5jbHVkZQorc3BlY2lhbC1wdXJwb3NlIGhlYWRlcnMgdGhhdCBtYXkgbm90IGJlIHByZXNlbnQgb24gYWxsIHN5c3RlbXMgKGFuZCB0aHVzIHdvdWxkCitwcmV2ZW50IHRveWJveCBmcm9tIGJ1aWxkaW5nIHRoYXQgY29tbWFuZCBvbiBzdWNoIGEgc3lzdGVtIHdpdGggdGhhdCBjb21tYW5kCitlbmFibGVkKS4gIEV4YW1wbGVzIGluY2x1ZGUgcmVnZXggc3VwcG9ydCwgYW55ICJsaW51eC8iIG9yICJhc20vIiBoZWFkZXJzLCBtdGFiCitzdXBwb3J0IChtbnRlbnQuaCBhbmQgc3lzL21vdW50LmgpLCBhbmQgc28gb24uPC9wPgorCis8cD5UaGUgdG95cy5oIGhlYWRlciBhbHNvIGRlZmluZXMgc3RydWN0dXJlcyBmb3IgbW9zdCBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlcworcHJvdmlkZWQgdG8gZWFjaCBjb21tYW5kIGJ5IHRveWJveF9tYWluKCkuICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluCitkZXRhaWwgaW4gdGhlIGRlc2NyaXB0aW9uIGZvciBtYWluLmMsIHdoZXJlIHRoZXkgYXJlIGluaXRpYWxpemVkLjwvcD4KKworPHA+VGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGdyb3VwZWQgaW50byBzdHJ1Y3R1cmVzIChhbmQgYSB1bmlvbikgZm9yIHNwYWNlCitzYXZpbmdzLCB0byBtb3JlIGVhc2lseSB0cmFjayB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCBieSB0aGVtLAorc28gdGhhdCB0aGV5IG1heSBiZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQvaW5pdGlhbGl6ZWQgYXMgbmVlZGVkLCBhbmQgc28KK3RoYXQgYWNjZXNzIHRvIGdsb2JhbCB2YXJpYWJsZXMgaXMgbW9yZSBlYXNpbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIGFjY2VzcyB0bworbG9jYWwgdmFyaWFibGVzLjwvcD4KKworPGgzPm1haW4uYzwvaDM+Cis8cD5Db250YWlucyB0aGUgbWFpbigpIGZ1bmN0aW9uIHdoZXJlIGV4ZWN1dGlvbiBzdGFydHMsIHBsdXMKK2NvbW1vbiBpbmZyYXN0cnVjdHVyZSB0byBpbml0aWFsaXplIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHNlbGVjdCB3aGljaCBjb21tYW5kCit0byBydW4uICBUaGUgInRveWJveCIgbXVsdGlwbGV4ZXIgY29tbWFuZCBhbHNvIGxpdmVzIGhlcmUuICAoVGhpcyBpcyB0aGUKK29ubHkgY29tbWFuZCBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIHRveXMgZGlyZWN0b3J5Lik8L3A+CisKKzxwPkV4ZWN1dGlvbiBzdGFydHMgaW4gbWFpbigpIHdoaWNoIHRyaW1zIGFueSBwYXRoIG9mZiBvZiB0aGUgZmlyc3QgY29tbWFuZAorbmFtZSBhbmQgY2FsbHMgdG95Ym94X21haW4oKSwgd2hpY2ggY2FsbHMgdG95X2V4ZWMoKSwgd2hpY2ggY2FsbHMgdG95X2ZpbmQoKQorYW5kIHRveV9pbml0KCkgYmVmb3JlIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQncyBmdW5jdGlvbiBmcm9tCit0b3lfbGlzdFtdICh2aWEgdG95cy53aGljaC0+dG95X21haW4oKSkuCitJZiB0aGUgY29tbWFuZCBpcyAidG95Ym94IiwgZXhlY3V0aW9uIHJlY3Vyc2VzIGludG8gdG95Ym94X21haW4oKSwgb3RoZXJ3aXNlCit0aGUgY2FsbCBnb2VzIHRvIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kbmFtZV9tYWluKCkgZnJvbSBhIEMgZmlsZSBpbiB0aGUgdG95cworZGlyZWN0b3J5LjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG1haW4uYzo8L3A+Cis8dWw+Cis8YSBuYW1lPSJ0b3lfbGlzdCIgLz4KKzxsaT48cD48Yj5zdHJ1Y3QgdG95X2xpc3QgdG95X2xpc3RbXTwvYj4gLSBhcnJheSBkZXNjcmliaW5nIGFsbCB0aGUKK2NvbW1hbmRzIGN1cnJlbnRseSBjb25maWd1cmVkIGludG8gdG95Ym94LiAgVGhlIGZpcnN0IGVudHJ5ICh0b3lfbGlzdFswXSkgaXMKK2ZvciB0aGUgInRveWJveCIgbXVsdGlwbGV4ZXIgY29tbWFuZCwgd2hpY2ggcnVucyBhbGwgdGhlIG90aGVyIGJ1aWx0LWluIGNvbW1hbmRzCit3aXRob3V0IHN5bWxpbmtzIGJ5IHVzaW5nIGl0cyBmaXJzdCBhcmd1bWVudCBhcyB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0bworcnVuIGFuZCB0aGUgcmVzdCBhcyB0aGF0IGNvbW1hbmQncyBhcmd1bWVudCBsaXN0IChhbGEgIi4vdG95Ym94IGVjaG8gaGVsbG8iKS4KK1RoZSByZW1haW5pbmcgZW50cmllcyBhcmUgdGhlIGNvbW1hbmRzIGluIGFscGhhYmV0aWNhbCBvcmRlciAoZm9yIGVmZmljaWVudAorYmluYXJ5IHNlYXJjaCkuPC9wPgorCis8cD5UaGlzIGlzIGEgcmVhZC1vbmx5IGFycmF5IGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSBieQorZGVmaW5pbmcgbWFjcm9zIGFuZCAjaW5jbHVkaW5nIGdlbmVyYXRlZC9uZXd0b3lzLmguPC9wPgorCis8cD5NZW1iZXJzIG9mIHN0cnVjdCB0b3lfbGlzdCAoZGVmaW5lZCBpbiAidG95cy5oIikgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PHA+Y2hhciAqPGI+bmFtZTwvYj4gLSB0aGUgbmFtZSBvZiB0aGlzIGNvbW1hbmQuPC9wPjwvbGk+Cis8bGk+PHA+dm9pZCAoKjxiPnRveV9tYWluPC9iPikodm9pZCkgLSBmdW5jdGlvbiBwb2ludGVyIHRvIHJ1biB0aGlzCitjb21tYW5kLjwvcD48L2xpPgorPGxpPjxwPmNoYXIgKjxiPm9wdGlvbnM8L2I+IC0gY29tbWFuZCBsaW5lIG9wdGlvbiBzdHJpbmcgKHVzZWQgYnkKK2dldF9vcHRmbGFncygpIGluIGxpYi9hcmdzLmMgdG8gaW50aWFsaXplIHRveXMub3B0ZmxhZ3MsIHRveXMub3B0YXJncywgYW5kCitlbnRyaWVzIGluIHRoZSB0b3kncyBHTE9CQUxTIHN0cnVjdCkuICBXaGVuIHRoaXMgaXMgTlVMTCwgbm8gb3B0aW9uCitwYXJzaW5nIGlzIGRvbmUgYmVmb3JlIGNhbGxpbmcgdG95X21haW4oKS48L3A+PC9saT4KKzxsaT48cD5pbnQgPGI+ZmxhZ3M8L2I+IC0gQmVoYXZpb3IgZmxhZ3MgZm9yIHRoaXMgY29tbWFuZC4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGN1cnJlbnRseSB1bmRlcnN0b29kOjwvcD4KKworPHVsPgorPGxpPjxiPlRPWUZMQUdfVVNSPC9iPiAtIEluc3RhbGwgdGhpcyBjb21tYW5kIHVuZGVyIC91c3I8L2xpPgorPGxpPjxiPlRPWUZMQUdfQklOPC9iPiAtIEluc3RhbGwgdGhpcyBjb21tYW5kIHVuZGVyIC9iaW48L2xpPgorPGxpPjxiPlRPWUZMQUdfU0JJTjwvYj4gLSBJbnN0YWxsIHRoaXMgY29tbWFuZCB1bmRlciAvc2JpbjwvbGk+Cis8bGk+PGI+VE9ZRkxBR19OT0ZPUks8L2I+IC0gVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIGFzIGEgc2hlbGwgYnVpbHRpbi48L2xpPgorPGxpPjxiPlRPWUZMQUdfVU1BU0s8L2I+IC0gQ2FsbCB1bWFzaygwKSBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQuPC9saT4KKzxsaT48Yj5UT1lGTEFHX1NUQVlST09UPC9iPiAtIERvbid0IGRyb3AgcGVybWlzc2lvbnMgZm9yIHRoaXMgY29tbWFuZCBpZiB0b3lib3ggaXMgaW5zdGFsbGVkIFNVSUQgcm9vdC48L2xpPgorPGxpPjxiPlRPWUZMQUdfTkVFRFJPT1Q8L2I+IC0gVGhpcyBjb21tYW5kIGNhbm5vdCBmdW5jdGlvbiB1bmxlc3MgcnVuIHdpdGggcm9vdCBhY2Nlc3MuPC9saT4KKzwvdWw+Cis8YnI+CisKKzxwPlRoZXNlIGZsYWdzIGFyZSBjb21iaW5lZCB3aXRoIHwgKG9yKS4gIEZvciBleGFtcGxlLCB0byBpbnN0YWxsIGEgY29tbWFuZAoraW4gL3Vzci9iaW4sIG9yIHRvZ2V0aGVyIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOLjwvcD4KKzwvdWw+Cis8L2xpPgorCis8bGk+PHA+PGI+c3RydWN0IHRveV9jb250ZXh0IHRveXM8L2I+IC0gZ2xvYmFsIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uCitjb21tb24gdG8gYWxsIGNvbW1hbmRzLCBpbml0aWFsaXpkIGJ5IHRveV9pbml0KCkgYW5kIGRlZmluZWQgaW4gInRveXMuaCIuCitNZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxwPnN0cnVjdCB0b3lfbGlzdCAqPGI+d2hpY2g8L2I+IC0gYSBwb2ludGVyIHRvIHRoaXMgY29tbWFuZCdzIHRveV9saXN0CitzdHJ1Y3R1cmUuICBNb3N0bHkgdXNlZCB0byBncmFiIHRoZSBuYW1lIG9mIHRoZSBydW5uaW5nIGNvbW1hbmQKKyh0b3lzLT53aGljaC5uYW1lKS48L3A+Cis8L2xpPgorPGxpPjxwPmludCA8Yj5leGl0dmFsPC9iPiAtIEV4aXQgdmFsdWUgb2YgdGhpcyBjb21tYW5kLiAgRGVmYXVsdHMgdG8gemVyby4gIFRoZQorZXJyb3JfZXhpdCgpIGZ1bmN0aW9ucyB3aWxsIHJldHVybiAxIGlmIHRoaXMgaXMgemVybywgb3RoZXJ3aXNlIHRoZXknbGwKK3JldHVybiB0aGlzIHZhbHVlLjwvcD48L2xpPgorPGxpPjxwPmNoYXIgKio8Yj5hcmd2PC9iPiAtICJyYXciIGNvbW1hbmQgbGluZSBvcHRpb25zLCBJLkUuIHRoZSBvcmlnaW5hbAordW5tb2RpZmllZCBzdHJpbmcgYXJyYXkgcGFzc2VkIGluIHRvIG1haW4oKS4gIE5vdGUgdGhhdCBtb2RpZnlpbmcgdGhpcyBjaGFuZ2VzCisicHMiIG91dHB1dCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZC4gIFRoaXMgYXJyYXkgaXMgbnVsbCB0ZXJtaW5hdGVkOyBhIE5VTEwKK2VudHJ5IGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBhcnJheS48L3A+Cis8cD5Nb3N0IGNvbW1hbmRzIGRvbid0IHVzZSB0aGlzIGZpZWxkLCBpbnN0ZWFkIHRoZSB1c2Ugb3B0YXJncywgb3B0ZmxhZ3MsCithbmQgdGhlIGZpZWxkcyBpbiB0aGUgR0xPQkFMUyBzdHJ1Y3QgaW5pdGlhbGl6ZWQgYnkgZ2V0X29wdGZsYWdzKCkuPC9wPgorPC9saT4KKzxsaT48cD51bnNpZ25lZCA8Yj5vcHRmbGFnczwvYj4gLSBDb21tYW5kIGxpbmUgb3B0aW9uIGZsYWdzLCBzZXQgYnkKKzxhIGhyZWY9IiNsaWJfYXJncyI+Z2V0X29wdGZsYWdzKCk8L2E+LiAgSW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBsaXN0ZWQgaW4KK3RveXMtPndoaWNoLm9wdGlvbnMgb2NjdXJyZWQgdGhpcyB0aW1lLjwvcD4KKworPHA+VGhlIHJpZ2h0bW9zdCBjb21tYW5kIGxpbmUgYXJndW1lbnQgbGlzdGVkIGluIHRveXMtPndoaWNoLm9wdGlvbnMgc2V0cyBiaXQKKzEsIHRoZSBuZXh0IG9uZSBzZXRzIGJpdCAyLCBhbmQgc28gb24uICBUaGlzIG1lYW5zIHRoZSBiaXRzIGFyZSBzZXQgaW4gdGhlIHNhbWUKK29yZGVyIHRoZSBiaW5hcnkgZGlnaXRzIHdvdWxkIGJlIGxpc3RlZCBpZiB0eXBlZCBvdXQgYXMgYSBzdHJpbmcuICBGb3IgZXhhbXBsZSwKK3RoZSBvcHRpb24gc3RyaW5nICJhYmNkIiB3b3VsZCBwYXJzZSB0aGUgY29tbWFuZCBsaW5lICItYyIgdG8gc2V0IG9wdGZsYWdzIHRvIDIsCisiLWEiIHdvdWxkIHNldCBvcHRmbGFncyB0byA4LCBhbmQgIi1iZCIgd291bGQgc2V0IG9wdGZsYWdzIHRvIDYgKDR8MikuPC9wPgorCis8cD5Pbmx5IGxldHRlcnMgYXJlIHJlbGV2YW50IHRvIG9wdGZsYWdzLiAgSW4gdGhlIHN0cmluZyAiYSpiOmMjZCIsIGQ9MSwgYz0yLAorYj00LCBhPTguICBQdW5jdHVhdGlvbiBhZnRlciBhIGxldHRlciBpbml0aWFsaXplcyBnbG9iYWwgdmFyaWFibGVzIGF0IHRoZQorc3RhcnQgb2YgdGhlIEdMT0JBTFMoKSBibG9jayAoc2VlIDxhIGhyZWY9IiN0b3lfdW5pb24iPnVuaW9uIHRveV91bmlvbiB0aGlzPC9hPgorZm9yIGRldGFpbHMpLjwvcD4KKworPHA+VGhlIGJ1aWxkIGluZnJhc3RydWN0dXJlIGNyZWF0ZXMgRkxBR18gbWFjcm9zIGZvciBlYWNoIG9wdGlvbiBsZXR0ZXIsCitjb3JyZXNwb25kaW5nIHRvIHRoZSBiaXQgcG9zaXRpb24sIHNvIHlvdSBjYW4gY2hlY2sgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3gpCit0byBzZWUgaWYgYSBmbGFnIHdhcyBzcGVjaWZpZWQuIChUaGUgY29ycmVjdCBzZXQgb2YgRkxBR18gbWFjcm9zIGlzIHNlbGVjdGVkCitieSBkZWZpbmluZyBGT1JfbXljb21tYW5kIGJlZm9yZSAjaW5jbHVkaW5nIHRveXMuaC4gVGhlIG1hY3JvcyBsaXZlIGluCit0b3lzL2dsb2JhbHMuaCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgc2NyaXB0cy9tYWtlLnNoLik8L3A+CisKKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG9wdGlvbiBwYXJzaW5nLCBzZWUgPGEgaHJlZj0iI2xpYl9hcmdzIj5nZXRfb3B0ZmxhZ3MoKTwvYT4uPC9wPgorCis8L2xpPgorPGxpPjxwPmNoYXIgKio8Yj5vcHRhcmdzPC9iPiAtIE51bGwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudHMgbGVmdCBvdmVyCithZnRlciBnZXRfb3B0ZmxhZ3MoKSByZW1vdmVkIGFsbCB0aGUgb25lcyBpdCB1bmRlcnN0b29kLiAgTm90ZTogb3B0YXJnWzBdIGlzCit0aGUgZmlyc3QgYXJndW1lbnQsIG5vdCB0aGUgY29tbWFuZCBuYW1lLiAgVXNlIHRveXMud2hpY2gtPm5hbWUgZm9yIHRoZSBjb21tYW5kCituYW1lLjwvcD48L2xpPgorPGxpPjxwPmludCA8Yj5vcHRjPC9iPiAtIE9wdGFyZyBjb3VudCwgZXF1aXZhbGVudCB0byBhcmdjIGJ1dCBmb3IKK29wdGFyZ3NbXS48cD48L2xpPgorPC91bD4KKworPGEgbmFtZT0idG95X3VuaW9uIiAvPgorPGxpPjxwPjxiPnVuaW9uIHRveV91bmlvbiB0aGlzPC9iPiAtIFVuaW9uIG9mIHN0cnVjdHVyZXMgY29udGFpbmluZyBlYWNoCitjb21tYW5kJ3MgZ2xvYmFsIHZhcmlhYmxlcy48L3A+CisKKzxwPkdsb2JhbCB2YXJpYWJsZXMgYXJlIHVzZWZ1bDogdGhleSByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIHBhc3NpbmcgZXh0cmEKK2NvbW1hbmQgbGluZSBhcmd1bWVudHMgYmV0d2VlbiBmdW5jdGlvbnMsIHRoZXkgY29udmVuaWVudGx5IHN0YXJ0IHByZXplcm9lZCB0bworc2F2ZSBpbml0aWFsaXphdGlvbiBjb3N0cywgYW5kIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2luZyBpbmZyYXN0cnVjdHVyZQorY2FuIGFsc28gaW5pdGlhbGl6ZSBnbG9iYWwgdmFyaWFibGVzIHdpdGggaXRzIHJlc3VsdHMuPC9wPgorCis8cD5CdXQgc2luY2UgZWFjaCB0b3lib3ggcHJvY2VzcyBjYW4gb25seSBydW4gb25lIGNvbW1hbmQgYXQgYSB0aW1lLCBhbGxvY2F0aW5nCitzcGFjZSBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBiZWxvbmdpbmcgdG8gb3RoZXIgY29tbWFuZHMgeW91IGFyZW4ndCBjdXJyZW50bHkKK3J1bm5pbmcgd291bGQgYmUgd2FzdGVmdWwuPC9wPgorCis8cD5Ub3lib3ggaGFuZGxlcyB0aGlzIGJ5IGVuY2Fwc3VsYXRpbmcgZWFjaCBjb21tYW5kJ3MgZ2xvYmFsIHZhcmlhYmxlcyBpbgorYSBzdHJ1Y3R1cmUsIGFuZCBkZWNsYXJpbmcgYSB1bmlvbiBvZiB0aG9zZSBzdHJ1Y3R1cmVzIHdpdGggYSBzaW5nbGUgZ2xvYmFsCitpbnN0YW5jZSAoY2FsbGVkICJ0aGlzIikuICBUaGUgR0xPQkFMUygpIG1hY3JvIGNvbnRhaW5zIHRoZSBnbG9iYWwKK3ZhcmlhYmxlcyB0aGF0IHNob3VsZCBnbyBpbiB0aGUgY3VycmVudCBjb21tYW5kJ3MgZ2xvYmFsIHN0cnVjdHVyZS4gIEVhY2gKK3ZhcmlhYmxlIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzICJ0aGlzLmNvbW1hbmRuYW1lLnZhcm5hbWUiLgorSWYgeW91ICNkZWZpbmVkIEZPUl9jb21tYW5kbmFtZSBiZWZvcmUgaW5jbHVkaW5nIHRveXMuaCwgdGhlIG1hY3JvIFRUIGlzCisjZGVmaW5lZCB0byB0aGlzLmNvbW1hbmRuYW1lIHNvIHRoZSB2YXJpYWJsZSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhcworIlRULnZhcmlhYmxlIi4gIFNlZSB0b3lzL2hlbGxvLmMgZm9yIGFuIGV4YW1wbGUuPC9wPgorCis8cD5BIGNvbW1hbmQgdGhhdCBuZWVkcyBnbG9iYWwgdmFyaWFibGVzIHNob3VsZCBkZWNsYXJlIGEgc3RydWN0dXJlIHRvCitjb250YWluIHRoZW0gYWxsLCBhbmQgYWRkIHRoYXQgc3RydWN0dXJlIHRvIHRoaXMgdW5pb24uICBBIGNvbW1hbmQgc2hvdWxkIG5ldmVyCitkZWNsYXJlIGdsb2JhbCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGlzLCBiZWNhdXNlIHN1Y2ggZ2xvYmFsIHZhcmlhYmxlcyB3b3VsZAorYWxsb2NhdGUgbWVtb3J5IHdoZW4gcnVubmluZyBvdGhlciBjb21tYW5kcyB0aGF0IGRvbid0IHVzZSB0aG9zZSBnbG9iYWwKK3ZhcmlhYmxlcy48L3A+CisKKzxwPlRoZSBmaXJzdCBmZXcgZmllbGRzIG9mIHRoaXMgc3RydWN0dXJlIGNhbiBiZSBpbnRpYWxpemVkIGJ5IDxhIGhyZWY9IiNsaWJfYXJncyI+Z2V0X29wdGFyZ3MoKTwvYT4sCithcyBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgZmllbGQgb2ZmIHRoaXMgY29tbWFuZCdzIHRveV9saXN0IGVudHJ5LiAgU2VlCit0aGUgZ2V0X29wdGFyZ3MoKSBkZXNjcmlwdGlvbiBpbiBsaWIvYXJncy5jIGZvciBkZXRhaWxzLjwvcD4KKzwvbGk+CisKKzxsaT48Yj5jaGFyIHRveWJ1Zls0MDk2XTwvYj4gLSBhIGNvbW1vbiBzY3JhdGNoIHNwYWNlIGJ1ZmZlciBndWFyYW50ZWVkCit0byBzdGFydCB6ZXJvZWQsIHNvIGNvbW1hbmRzIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGVpciBvd24uCitBbnkgY29tbWFuZCBpcyBmcmVlIHRvIHVzZSB0aGlzLCBhbmQgaXQgc2hvdWxkIG5ldmVyIGJlIGRpcmVjdGx5IHJlZmVyZW5jZWQKK2J5IGZ1bmN0aW9ucyBpbiBsaWIvIChhbHRob3VnaCBjb21tYW5kcyBhcmUgZnJlZSB0byBwYXNzIHRveWJ1ZiBpbiB0byBhCitsaWJyYXJ5IGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50KS48L2xpPgorCis8bGk+PGI+Y2hhciBsaWJidWZbNDA5Nl08L2I+IC0gbGlrZSB0b3lidWYsIGJ1dCBmb3IgdXNlIGJ5IGNvbW1vbiBjb2RlIGluCitsaWIvKi5jLiBDb21tYW5kcyBzaG91bGQgbmV2ZXIgZGlyZWN0bHkgcmVmZXJlbmNlIGxpYmJ1ZiwgYW5kIGxpYnJhcnkKK2NvdWxkIHNob3VsZCBubmV2ZXIgZGlyZWN0bHkgcmVmZXJlbmNlIHRveWJ1Zi48L2xpPgorPC91bD4KKworPHA+VGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gbWFpbi5jOjwvcD4KKzx1bD4KKzxsaT48cD5zdHJ1Y3QgdG95X2xpc3QgKjxiPnRveV9maW5kPC9iPihjaGFyICpuYW1lKSAtIFJldHVybiB0aGUgdG95X2xpc3QKK3N0cnVjdHVyZSBmb3IgdGhpcyBjb21tYW5kIG5hbWUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLjwvcD48L2xpPgorPGxpPjxwPnZvaWQgPGI+dG95X2luaXQ8L2I+KHN0cnVjdCB0b3lfbGlzdCAqd2hpY2gsIGNoYXIgKmFyZ3ZbXSkgLSBmaWxsIG91dAordGhlIGdsb2JhbCB0b3lzIHN0cnVjdHVyZSwgY2FsbGluZyBnZXRfb3B0YXJncygpIGlmIG5lY2Vzc2FyeS48L3A+PC9saT4KKzxsaT48cD52b2lkIDxiPnRveV9leGVjPC9iPihjaGFyICphcmd2W10pIC0gUnVuIGEgYnVpbHQtaW4gY29tbWFuZCB3aXRoCithcmd1bWVudHMuPC9wPgorPHA+Q2FsbHMgdG95X2ZpbmQoKSBvbiBhcmd2WzBdICh3aGljaCBtdXN0IGJlIGp1c3QgYSBjb21tYW5kIG5hbWUKK3dpdGhvdXQgcGF0aCkuICBSZXR1cm5zIGlmIGl0IGNhbid0IGZpbmQgdGhpcyBjb21tYW5kLCBvdGhlcndpc2UgY2FsbHMKK3RveV9pbml0KCksIHRveXMtPndoaWNoLnRveV9tYWluKCksIGFuZCBleGl0KCkgaW5zdGVhZCBvZiByZXR1cm5pbmcuPC9wPgorCis8cD5Vc2UgdGhlIGxpYnJhcnkgZnVuY3Rpb24geGV4ZWMoKSB0byBmYWxsIGJhY2sgdG8gZXh0ZXJuYWwgZXhlY3V0YWJsZXMKK2luICRQQVRIIGlmIHRveV9leGVjKCkgY2FuJ3QgZmluZCBhIGJ1aWx0LWluIGNvbW1hbmQuICBOb3RlIHRoYXQgdG95X2V4ZWMoKQorZG9lcyBub3Qgc3RyaXAgcGF0aHMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYSBjb21tYW5kLCBzbyAiLi9jb21tYW5kIiB3aWxsCituZXZlciBtYXRjaCBhbiBpbnRlcm5hbCBjb21tYW5kLjwvbGk+CisKKzxsaT48cD52b2lkIDxiPnRveWJveF9tYWluPC9iPih2b2lkKSAtIHRoZSBtYWluIGZ1bmN0aW9uIGZvciB0aGUgbXVsdGlwbGV4ZXIKK2NvbW1hbmQgKEkuRS4gInRveWJveCIpLiAgR2l2ZW4gYSBjb21tYW5kIG5hbWUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBjYWxscwordG95X2V4ZWMoKSBvbiBpdHMgYXJndW1lbnRzLiAgV2l0aCBubyBhcmd1bWVudHMsIGl0IGxpc3RzIGF2YWlsYWJsZSBjb21tYW5kcy4KK0lmIHRoZSBmaXJzdCBhcmd1bWVudCBzdGFydHMgd2l0aCAiLSIgaXQgbGlzdHMgZWFjaCBjb21tYW5kIHdpdGggaXRzIGRlZmF1bHQKK2luc3RhbGwgcGF0aCBwcmVwZW5kZWQuPC9wPjwvbGk+CisKKzwvdWw+CisKKzxoMz5Db25maWcuaW48L2gzPgorCis8cD5Ub3AgbGV2ZWwgY29uZmlndXJhdGlvbiBmaWxlIGluIGEgc3R5bGl6ZWQgdmFyaWFudCBvZgorPGEgaHJlZj1odHRwOi8va2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQ+a2NvbmZpZzwvYT4gZm9ybWF0LiAgSW5jbHVkZXMgZ2VuZXJhdGVkL0NvbmZpZy5pbi48L3A+CisKKzxwPlRoZXNlIGZpbGVzIGFyZSBkaXJlY3RseSB1c2VkIGJ5ICJtYWtlIG1lbnVjb25maWciIHRvIHNlbGVjdCB3aGljaCBjb21tYW5kcwordG8gYnVpbGQgaW50byB0b3lib3ggKHRodXMgZ2VuZXJhdGluZyBhIC5jb25maWcgZmlsZSksIGFuZCBieQorc2NyaXB0cy9jb25maWcyaGVscC5weSB0byBjcmVhdGUgZ2VuZXJhdGVkL2hlbHAuaC48L3A+CisKKzxhIG5hbWU9ImdlbmVyYXRlZCIgLz4KKzxoMT48YSBocmVmPSIjZ2VuZXJhdGVkIj5UZW1wb3JhcnkgZmlsZXM6PC9hPjwvaDE+CisKKzxwPlRoZXJlIGlzIG9uZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgdG9wIGxldmVsIHNvdXJjZSBkaXJlY3Rvcnk6PC9wPgorPHVsPgorPGxpPjxwPjxiPi5jb25maWc8L2I+IC0gQ29uZmlndXJhdGlvbiBmaWxlIGdlbmVyYXRlZCBieSBrY29uZmlnLCBpbmRpY2F0aW5nCit3aGljaCBjb21tYW5kcyAoYW5kIG9wdGlvbnMgdG8gY29tbWFuZHMpIGFyZSBjdXJyZW50bHkgZW5hYmxlZC4gIFVzZWQKK3RvIG1ha2UgZ2VuZXJhdGVkL2NvbmZpZy5oIGFuZCBkZXRlcm1pbmUgd2hpY2ggdG95cy8qLyouYyBmaWxlcyB0byBidWlsZC48L3A+CisKKzxwPllvdSBjYW4gY3JlYXRlIGEgaHVtYW4gcmVhZGFibGUgIm1pbmljb25maWciIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzaW5nCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL25ld19wbGF0Zm9ybS5odG1sI21pbmljb25maWc+dGhlc2UKK2luc3RydWN0aW9uczwvYT4uPC9wPgorPC9saT4KKzwvdWw+CisKKzxwPjxoMj5EaXJlY3RvcnkgZ2VuZXJhdGVkLzwvaDI+PC9wPgorCis8cD5UaGUgcmVtYWluaW5nIHRlbXBvcmFyeSBmaWxlcyBsaXZlIGluIHRoZSAiZ2VuZXJhdGVkLyIgZGlyZWN0b3J5LAord2hpY2ggaXMgZm9yIGZpbGVzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGZyb20gb3RoZXIgc291cmNlIGZpbGVzLjwvcD4KKworPHVsPgorPGxpPjxwPjxiPmdlbmVyYXRlZC9Db25maWcuaW48L2I+IC0gS2NvbmZpZyBlbnRyaWVzIGZvciBlYWNoIGNvbW1hbmQsIGluY2x1ZGVkCitmcm9tIHRoZSB0b3AgbGV2ZWwgQ29uZmlnLmluLiBUaGUgaGVscCB0ZXh0IGhlcmUgaXMgdXNlZCB0byBnZW5lcmF0ZQoraGVscC5oLjwvcD4KKworPHA+RWFjaCBjb21tYW5kIGhhcyBhIGNvbmZpZ3VyYXRpb24gZW50cnkgd2l0aCBhbiB1cHBlciBjYXNlIHZlcnNpb24gb2YKK3RoZSBjb21tYW5kIG5hbWUuIE9wdGlvbnMgdG8gY29tbWFuZHMgc3RhcnQgd2l0aCB0aGUgY29tbWFuZAorbmFtZSBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlIGFuZCB0aGUgb3B0aW9uIG5hbWUuIEdsb2JhbCBvcHRpb25zIGFyZSBhdHRhY2hlZAordG8gdGhlICJ0b3lib3giIGNvbW1hbmQsIGFuZCB0aHVzIHVzZSB0aGUgcHJlZml4ICJUT1lCT1hfIi4gIFRoaXMgb3JnYW5pemF0aW9uCitpcyB1c2VkIGJ5IHNjcmlwdHMvY2ZnMmZpbGVzIHRvIHNlbGVjdCB3aGljaCB0b3lzLyovKi5jIGZpbGVzIHRvIGNvbXBpbGUgZm9yIGEKK2dpdmVuIC5jb25maWcuPC9wPgorPC9saT4KKworPGxpPjxwPjxiPmdlbmVyYXRlZC9jb25maWcuaDwvYj4gLSBsaXN0IG9mIENGR19TWU1CT0wgYW5kIFVTRV9TWU1CT0woKSBtYWNyb3MsCitnZW5lcmF0ZWQgZnJvbSAuY29uZmlnIGJ5IGEgc2VkIGludm9jYXRpb24gaW4gc2NyaXB0cy9tYWtlLnNoLjwvcD4KKworPHA+Q0ZHX1NZTUJPTCBpcyBhIGNvbXBsZSB0aW1lIGNvbnN0YW50IHNldCB0byAxIGZvciBlbmFibGVkIHN5bWJvbHMgYW5kIDAgZm9yCitkaXNhYmxlZCBzeW1ib2xzLiBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIG5vcm1hbCBpZigpIHN0YXRlbWVudHMgdG8gcmVtb3ZlCitjb2RlIGF0IGNvbXBpbGUgdGltZSB2aWEgdGhlIG9wdGltaXplcidzIGRlYWQgY29kZSBlbGltaW5hdGlvbiAod2hpY2ggcmVtb3ZlcworZnJvbSB0aGUgYmluYXJ5IGFueSBjb2RlIHRoYXQgY2Fubm90IGJlIHJlYWNoZWQpLiBUaGlzIHNhdmVzIHNwYWNlIHdpdGhvdXQKK2NsdXR0ZXJpbmcgdGhlIGNvZGUgd2l0aCAjaWZkZWZzIG9yIGxlYWRpbmcgdG8gY29uZmlndXJhdGlvbiBkZXBlbmRlbnQgYnVpbGQKK2JyZWFrcy4gKFNlZSB0aGUgMTk5MiBVc2VuaXggcGFwZXIKKzxhIGhyZWY9aHR0cDovL2RvYy5jYXQtdi5vcmcvaGVucnlfc3BlbmNlci9pZmRlZl9jb25zaWRlcmVkX2hhcm1mdWwucGRmPiNpZmRlZgorQ29uc2lkZXJlZCBIYXJtZnVsPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4pPC9wPgorCis8cD5XaGVuIHlvdSBjYW4ndCBlbnRpcmVseSBhdm9pZCBhbiAjaWZkZWYsIHRoZSBVU0VfU1lNQk9MKGNvZGUpIG1hY3JvCitwcm92aWRlcyBhIGxlc3MgaW50cnVzaXZlIGFsdGVybmF0aXZlLCBldmFsdWF0aW5nIHRvIHRoZSBjb2RlIGluIHBhcmVudGhlc2VzCit3aGVuIHRoZSBzeW1ib2wgaXMgZW5hYmxlZCwgYW5kIG5vdGhpbmcgd2hlbiB0aGUgc3ltYm9sIGlzIGRpc2FibGVkLiBUaGlzCitpcyBtb3N0IGNvbW1vbmx5IHVzZWQgYXJvdW5kIE5FV1RPWSgpIGRlY2xhcmF0aW9ucyAoc28gb25seSB0aGUgZW5hYmxlZAorY29tbWFuZHMgc2hvdyB1cCBpbiB0b3lfbGlzdCksIGFuZCBpbiBvcHRpb24gc3RyaW5ncy4gVGhpcyBjYW4gYWxzbyBiZSB1c2VkCitmb3IgdGhpbmdzIGxpa2UgdmFyYXJncyBvciBzdHJ1Y3R1cmUgbWVtYmVycyB3aGljaCBjYW4ndCBhbHdheXMgYmUKK2VsaW1pbmF0ZWQgYnkgYSBzaW1wbGUgdGVzdCBvbiBDRkdfU1lNQk9MLiBSZW1lbWJlciwgdW5saWtlIENGR19TWU1CT0wKK3RoaXMgaXMgcmVhbGx5IGp1c3QgYSB2YXJpYW50IG9mICNpZmRlZiwgYW5kIGNhbiBzdGlsbCByZXN1bHQgaW4gY29uZmlndXJhdGlvbgorZGVwZW5kZW50IGJ1aWxkIGJyZWFrcy4gVXNlIHdpdGggY2F1dGlvbi48L3A+Cis8L2xpPgorCis8bGk+PHA+PGI+Z2VuZXJhdGVkL2ZsYWdzLmg8L2I+IC0gRkxBR18/IG1hY3JvcyBpbmRpY2F0aW5nIHdoaWNoIGNvbW1hbmQKK2xpbmUgb3B0aW9ucyB3ZXJlIHNlZW4uIFRoZSBvcHRpb24gcGFyc2luZyBpbiBsaWIvYXJncy5jIHNldHMgYml0cyBpbgordG95cy5vcHRmbGFncywgd2hpY2ggY2FuIGJlIHRlc3RlZCBieSBhbmRpbmcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgRkxBR18KK21hY3JvLiAoQmFyZSBsb25nb3B0cywgd2hpY2ggaGF2ZSBubyBjb3JyZXNwb25kaW5nIHNob3J0IG9wdGlvbiwgd2lsbAoraGF2ZSB0aGUgbG9uZ29wdCBuYW1lIGFmdGVyIEZMQUdfLiBBbGwgb3RoZXJzIHVzZSB0aGUgc2luZ2xlIGxldHRlciBzaG9ydAorb3B0aW9uLik8L3A+CisKKzxwPlRvIGdldCB0aGUgYXBwcm9wcmlhdGUgbWFjcm9zIGZvciB5b3VyIGNvbW1hbmQsICNkZWZpbmUgRk9SX2NvbW1hbmRuYW1lCitiZWZvcmUgI2luY2x1ZGluZyB0b3lzLmguIFRvIHN3aXRjaCBtYWNybyBzZXRzIChiZWNhdXNlIHlvdSBoYXZlIGFuIE9MRFRPWSgpCit3aXRoIGRpZmZlcmVudCBvcHRpb25zIGluIHRoZSBzYW1lIC5jIGZpbGUpLCAjZGVmaW5lIENMRUFOVVBfb2xkY29tbWFuZAorYW5kIGFsc28gI2RlZmluZSBGT1JfbmV3Y29tbWFuZCwgdGhlbiAjaW5jbHVkZSAiZ2VuZXJhdGVkL2ZsYWdzLmgiIHRvIHN3aXRjaC4KKzwvcD4KKzwvbGk+CisKKzxsaT48cD48Yj5nZW5lcmF0ZWQvZ2xvYmFscy5oPC9iPiAtCitEZWNsYXJlcyBzdHJ1Y3R1cmVzIHRvIGhvbGQgdGhlIGNvbnRlbnRzIG9mIGVhY2ggY29tbWFuZCdzIEdMT0JBTFMoKSwKK2FuZCBjb21iaW5lcyB0aGVtIGludG8gImdsb2JhbF91bmlvbiB0aGlzIi4gKFllcywgdGhlIG5hbWUgd2FzCitjaG9zZW4gdG8gcGlzcyBvZmYgQysrIGRldmVsb3BlcnMgd2hvIHRoaW5rIHRoYXQgQworaXMgbWVyZWx5IGEgc3Vic2V0IG9mIEMrKywgbm90IGEgbGFuZ3VhZ2UgaW4gaXRzIG93biByaWdodC4pPC9wPgorCis8cD5UaGUgdW5pb24gcmV1c2VzIHRoZSBzYW1lIG1lbW9yeSBmb3IgZWFjaCBjb21tYW5kJ3MgZ2xvYmFsIHN0cnVjdDoKK3NpbmNlIG9ubHkgb25lIGNvbW1hbmQncyBnbG9iYWxzIGFyZSBpbiB1c2UgYXQgYW55IGdpdmVuIHRpbWUsIGNvbGxhcHNpbmcKK3RoZW0gdG9nZXRoZXIgc2F2ZXMgc3BhY2UuIFRoZSBoZWFkZXJzICNkZWZpbmUgVFQgdG8gdGhlIGFwcHJvcHJpYXRlCisidGhpcy5jb21tYW5kbmFtZSIsIHNvIHlvdSBjYW4gcmVmZXIgdG8gdGhlIGN1cnJlbnQgY29tbWFuZCdzIGdsb2JhbAordmFyaWFibGVzIG91dCBvZiAidGhpcyIgYXMgVFQudmFyaWFibGVuYW1lLjwvcD4KKworPHA+VGhlIGdsb2JhbHMgc3RhcnQgemVyb2VkLCBhbmQgdGhlIGZpcnN0IGZldyBhcmUgZmlsbGVkIG91dCBieSB0aGUgCitsaWIvYXJncy5jIGFyZ3VtZW50IHBhcnNpbmcgY29kZSBjYWxsZWQgZnJvbSBtYWluLmMuPC9wPgorPC9saT4KKworPGxpPjxwPjxiPnRveXMvaGVscC5oPC9iPiAtIEhlbHAgc3RyaW5ncyBmb3IgdXNlIGJ5IHRoZSAiaGVscCIgY29tbWFuZCBhbmQKKy0taGVscCBvcHRpb25zLiBUaGlzIGZpbGUgI2RlZmluZXMgYSBoZWxwX3N5bWJvbG5hbWUgc3RyaW5nIGZvciBlYWNoCitzeW1ib2xuYW1lLCBidXQgb25seSB0aGUgc3ltYm9sbmFtZXMgbWF0Y2hpbmcgY29tbWFuZCBuYW1lcyBnZXQgdXNlZAorYnkgc2hvd19oZWxwKCkgaW4gbGliL2hlbHAuYyB0byBkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmRzLjwvcD4KKworPHA+VGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgc2NyaXB0cy9tYWtlLnNoLCB3aGljaCBjb21waWxlcyBzY3JpcHRzL2NvbmZpZzJoZWxwLmMKK2ludG8gdGhlIGJpbmFyeSBnZW5lcmF0ZWQvY29uZmlnMmhlbHAsIGFuZCB0aGVuIHJ1bnMgaXQgYWdhaW5zdCB0aGUgdG9wCitsZXZlbCAuY29uZmlnIGFuZCBDb25maWcuaW4gZmlsZXMgdG8gZXh0cmFjdCB0aGUgaGVscCB0ZXh0IGZyb20gZWFjaCBjb25maWcKK2VudHJ5IGFuZCBjb2xsYXRlIHRvZ2V0aGVyIGRlcGVuZGVudCBvcHRpb25zLjwvcD4KKworPHA+VGhpcyBmaWxlIGNvbnRhaW5zIGhlbHAgdGV4dCBmb3IgYWxsIGNvbW1hbmRzLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQKK2NvbmZpZ3VyYXRpb24sIGJ1dCBvbmx5IHRoZSBvbmVzIGN1cnJlbnRseSBlbmFibGVkIGluIHRoZSAuY29uZmlnIGZpbGUKK3dpbmQgdXAgaW4gdGhlIGhlbHBfZGF0YVtdIGFycmF5LCBhbmQgb25seSB0aGUgZW5hYmxlZCBkZXBlbmRlbnQgb3B0aW9ucworaGF2ZSB0aGVpciBoZWxwIHRleHQgYWRkZWQgdG8gdGhlIGNvbW1hbmQgdGhleSBkZXBlbmQgb24uPC9wPgorPC9saT4KKworPGxpPjxwPjxiPmdlbmVyYXRlZC9uZXd0b3lzLmg8L2I+IC0gCitBbGwgdGhlIE5FV1RPWSgpIGFuZCBPTERUT1koKSBtYWNyb3MgZnJvbSB0b3lzLyovKi5jLiBUaGUgInRveWJveCIgbXVsdGlwbGV4ZXIKK2lzIHRoZSBmaXJzdCBlbnRyeSwgdGhlIHJlc3QgYXJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4gRWFjaCBsaW5lIHNob3VsZCBiZQoraW5zaWRlIGFuIGFwcHJvcHJpYXRlIFVTRV8gbWFjcm8sIHNvIGNvZGUgdGhhdCAjaW5jbHVkZXMgdGhpcyBmaWxlIG9ubHkgc2VlcwordGhlIGN1cnJlbnRseSBlbmFibGVkIGNvbW1hbmRzLjwvcD4KKworPHA+QnkgI2RlZmluaW5pbmcgTkVXVE9ZKCkgdG8gdmFyaW91cyB0aGluZ3MgYmVmb3JlICNpbmNsdWRpbmcgdGhpcyBmaWxlLAoraXQgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKGluIHRveXMuaCksIGluaXRpYWxpemUgdGhlCitoZWxwX2RhdGEgYXJyYXkgKGluIGxpYi9oZWxwLmMpLCAgaW5pdGlhbGl6ZSB0aGUgdG95X2xpc3QgYXJyYXkgKGluIG1haW4uYywKK3RoZSBhbHBoYWJldGljYWwgb3JkZXIgbGV0cyB0b3lfZmluZCgpIGRvIGEgYmluYXJ5IHNlYXJjaCwgdGhlIGV4Y2VwdGlvbiB0bwordGhlIGFscGhhYmV0aWNhbCBvcmRlciBsZXRzIGl0IHVzZSB0aGUgbXVsdGlwbGV4ZXIgd2l0aG91dCBzZWFyY2hpbmcpLCBhbmQgc28KK29uLiAgKEl0J3MgZXZlbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIE5FRURfT1BUSU9OUyBtYWNybywgd2hpY2ggcHJvZHVjZXMgYSAxCitvciAwIGZvciBlYWNoIGNvbW1hbmQgdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzaW5nLCB3aGljaCBpcyBPUmVkIHRvZ2V0aGVyCit0byBhbGxvdyBjb21waWxlLXRpbWUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHRvIHJlbW92ZSB0aGUgd2hvbGUgb2YKK2xpYi9hcmdzLmMgaWYgbm90aGluZyBjdXJyZW50bHkgZW5hYmxlZCBpcyB1c2luZyBpdC4pPHA+CisKKzxwPkVhY2ggTkVXVE9ZIGFuZCBPTERUT1kgbWFjcm8gY29udGFpbnMgdGhlIGNvbW1hbmQgbmFtZSwgY29tbWFuZCBsaW5lCitvcHRpb24gc3RyaW5nICh0ZWxsaW5nIGxpYi9hcmdzLmMgaG93IHRvIHBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvcgordGhpcyBjb21tYW5kKSwgcmVjb21tZW5kZWQgaW5zdGFsbCBsb2NhdGlvbiwgYW5kIG1pc2NlbGFuZW91cyBkYXRhIHN1Y2gKK2FzIHdoZXRoZXIgdGhpcyBjb21tYW5kIHNob3VsZCByZXRhaW4gcm9vdCBwZXJtaXNzaW9ucyBpZiBpbnN0YWxsZWQgc3VpZC48L3A+Cis8L2xpPgorCis8bGk+PHA+PGI+dG95cy9vbGR0b3lzLmg8L2I+IC0gTWFjcm9zIHdpdGggdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gcGFyc2luZworc3RyaW5nIGZvciBlYWNoIE5FV1RPWS4gVGhpcyBhbGxvd3MgYW4gT0xEVE9ZIHRoYXQncyBqdXN0IGFuIGFsaWFzIGZvciBhbgorZXhpc3RpbmcgY29tbWFuZCB0byByZWZlciB0byB0aGUgZXhpc3Rpbmcgb3B0aW9uIHN0cmluZyBpbnN0ZWFkIG9mCitoYXZpbmcgdG8gcmVwZWF0IGl0LjwvcD4KKzwvbGk+Cis8L3VsPgorCis8YSBuYW1lPSJsaWIiPgorPGgyPkRpcmVjdG9yeSBsaWIvPC9oMj4KKworPHA+VE9ETzogZG9jdW1lbnQgbG90cyBtb3JlIGhlcmUuPC9wPgorCis8cD5saWI6IGdldG1vdW50bGlzdCgpLCBlcnJvcl9tc2cvZXJyb3JfZXhpdCwgeG1hbGxvYygpLAorc3RybGNweSgpLCB4ZXhlYygpLCB4b3BlbigpL3hyZWFkKCksIHhnZXRjd2QoKSwgeGFic3BhdGgoKSwgZmluZF9pbl9wYXRoKCksCitpdG9hKCkuPC9wPgorCisKKworPGEgbmFtZT0ibGliX3h3cmFwIj48aDM+bGliL3h3cmFwLmM8L2gzPgorCis8cD5GdW5jdGlvbnMgcHJlZml4ZWQgd2l0aCB0aGUgbGV0dGVyIHggY2FsbCBwZXJyb3JfZXhpdCgpIHdoZW4gdGhleSBoaXQKK2Vycm9ycywgdG8gZWxpbWluYXRlIGNvbW1vbiBlcnJvciBjaGVja2luZy4gVGhpcyBwcmludHMgYW4gZXJyb3IgbWVzc2FnZQorYW5kIHRoZSBzdHJlcnJvcigpIHN0cmluZyBmb3IgdGhlIGVycm5vIGVuY291bnRlcmVkLjwvcD4KKworPHA+V2UgcmVwbGFjZWQgZXhpdCgpLCBfZXhpdCgpLCBhbmQgYXRleGl0KCkgd2l0aCB4ZXhpdCgpLCBfeGV4aXQoKSwgYW5kCitzaWdhdGV4aXQoKS4gVGhpcyBnaXZlcyBfeGV4aXQoKSB0aGUgb3B0aW9uIHRvIHNpZ2xvbmdqbXAodG95cy5yZWJvdW5kLCAxKQoraW5zdGVhZCBvZiBleGl0aW5nLCBsZXRzIHhleGl0KCkgcmVwb3J0IHN0ZG91dCBmbHVzaCBmYWlsdXJlcyB0byBzdGRlcnIKK2FuZCBjaGFuZ2UgdGhlIGV4aXQgY29kZSB0byBpbmRpY2F0ZSBlcnJvciwgbGV0cyBvdXIgdG95cy5leGl0IGZ1bmN0aW9uCitjaGFuZ2UgaGFwcGVuIGZvciBzaWduYWwgZXhpdCBwYXRocyBhbmQgbGV0cyB1cyByZW1vdmUgdGhlIGZ1bmN0aW9ucworYWZ0ZXIgd2UndmUgY2FsbGVkIHRoZW0uPC9wPgorCis8cD5Zb3UgY2FuIGludGVyY2VwdCBvdXIgZXhpdCBieSBhc3NpZ25pbmcgYSBzZXRqbXAvbG9uZ2ptcCBidWZmZXIgdG8KK3RveXMucmVib3VuZCAoc2V0IGl0IGJhY2sgdG8gemVybyB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4KK0lmIHlvdSBkbyB0aGlzLCBjbGVhbmluZyB1cCByZXNvdXJjZSBsZWFrcyBpcyB5b3VyIHByb2JsZW0uPC9wPgorCis8dWw+Cis8bGk+PGI+dm9pZCB4c3RybmNweShjaGFyICpkZXN0LCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTwvYj48L2xpPgorPGxpPjxwPjxiPjxwPnZvaWQgX3hleGl0KHZvaWQpPC9iPjwvcD4KKzxwPkNhbGxzIHNpZ2xvbmdqbXAodG95cy5yZWJvdW5kLCAxKSwgb3IgZWxzZSBfZXhpdCh0b3lzLmV4aXR2YWwpLiBUaGlzCitsZXRzIHlvdSBpZ25vcmUgZXJyb3JzIHdpdGggdGhlIE5PX0VYSVQoKSBtYWNybyB3cmFwcGVyLCBvciBpbnRlcmNlcHQKK3RoZW0gd2l0aCBXT1VMRF9FWElUKCkuPC9wPgorPGxpPjxiPjxwPnZvaWQgeGV4aXQodm9pZCk8L2I+PC9wPgorPHA+Q2FsbHMgdG95cy54ZXhpdCBmdW5jdGlvbnMgKGlmIGFueSkgYW5kIGZsdXNoZXMgc3Rkb3V0L3N0ZGVyciAocmVwb3J0aW5nCitmYWlsdXJlIHRvIHdyaXRlIHRvIHN0ZG91dCBib3RoIHRvIHN0ZGVyciBhbmQgaW4gdGhlIGV4aXQgY29kZSksIHRoZW4KK2NhbGxzIF94ZXhpdCgpLjwvcD4KKzwvbGk+Cis8bGk+PGI+dm9pZCAqeG1hbGxvYyhzaXplX3Qgc2l6ZSk8L2I+PC9saT4KKzxsaT48Yj52b2lkICp4emFsbG9jKHNpemVfdCBzaXplKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgKnhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqeHN0cm5kdXAoY2hhciAqcywgc2l6ZV90IG4pPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqeHN0cmR1cChjaGFyICpzKTwvYj48L2xpPgorPGxpPjxiPmNoYXIgKnhtcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgeHByaW50ZihjaGFyICpmb3JtYXQsIC4uLik8L2I+PC9saT4KKzxsaT48Yj52b2lkIHhwdXRzKGNoYXIgKnMpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCB4cHV0YyhjaGFyIGMpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCB4Zmx1c2godm9pZCk8L2I+PC9saT4KKzxsaT48Yj5waWRfdCB4Zm9yayh2b2lkKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgeGV4ZWNfb3B0YXJncyhpbnQgc2tpcCk8L2I+PC9saT4KKzxsaT48Yj52b2lkIHhleGVjKGNoYXIgKiphcmd2KTwvYj48L2xpPgorPGxpPjxiPnBpZF90IHhwb3BlbihjaGFyICoqYXJndiwgaW50ICpwaXBlcyk8L2I+PC9saT4KKzxsaT48Yj5pbnQgeHBjbG9zZShwaWRfdCBwaWQsIGludCAqcGlwZXMpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCB4YWNjZXNzKGNoYXIgKnBhdGgsIGludCBmbGFncyk8L2I+PC9saT4KKzxsaT48Yj52b2lkIHh1bmxpbmsoY2hhciAqcGF0aCk8L2I+PC9saT4KKzxsaT48cD48Yj5pbnQgeGNyZWF0ZShjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIGludCBtb2RlKTxiciAvPgoraW50IHhvcGVuKGNoYXIgKnBhdGgsIGludCBmbGFncyk8L2I+PC9wPgorCis8cD5UaGUgeG9wZW4oKSBhbmQgeGNyZWF0ZSgpIGZ1bmN0aW9ucyBvcGVuIGFuIGV4aXN0aW5nIGZpbGUgKGV4aXRpbmcgaWYKK2l0J3Mgbm90IHRoZXJlKSBhbmQgY3JlYXRlIGEgbmV3IGZpbGUgKGV4aXRpbmcgaWYgaXQgY2FuJ3QpLjwvcD4KKworPHA+VGhleSBkZWZhdWx0IHRvIE9fQ0xPRVhFQyBzbyB0aGUgZmlsZWhhbmRsZXMgYXJlbid0IHBhc3NlZCBvbiB0byBjaGlsZAorcHJvY2Vzc2VzLiBGZWVkIGluIE9fQ0xPRVhFQyB0byBkaXNhYmxlIHRoaXMuPC9wPgorPC9saT4KKzxsaT48cD48Yj52b2lkIHhjbG9zZShpbnQgZmQpPC9iPjwvcD4KKworPHA+QmVjYXVzZSBORlMgaXMgYnJva2VuLCBhbmQgd29uJ3QgbmVjZXNzYXJpbHkgcGVyZm9ybSB0aGUgcmVxdWVzdGVkCitvcGVyYXRpb24gKGFuZCByZXBvcnQgdGhlIGVycm9yKSB1bnRpbCB5b3UgY2xvc2UgdGhlIGZpbGUuIE9mIGNvdXJzZSwgdGhpcworYmVpbmcgTkZTLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJlcG9ydCB0aGUgZXJyb3IgdGhlcmUgZWl0aGVyLCBidXQgaXQKK19jYW5fLjwvcD4KKworPHA+Tm90aGluZyBlbHNlIGV2ZXIgcmVwb3J0cyBhbiBlcnJvciBvbiBjbG9zZSwgZXZlcnl3aGVyZSBlbHNlIGl0J3MganVzdCBhCitWRlMgb3BlcmF0aW9uIGZyZWVpbmcgc29tZSByZXNvdXJjZXMuIE5GUyBpcyBfc3BlY2lhbF8sIGluIGEgd2F5IHRoYXQKK290aGVyIG5ldHdvcmsgZmlsZXN5c3RlbXMgbGlrZSBzbWJmcyBhbmQgdjlmcyBhcmVuJ3QuLjwvcD4KKzwvbGk+Cis8bGk+PGI+aW50IHhkdXAoaW50IGZkKTwvYj48L2xpPgorPGxpPjxwPjxiPnNpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik8L2I+PC9wPgorCis8cD5DYW4gcmV0dXJuIDAsIGJ1dCBub3QgLTEuPC9wPgorPC9saT4KKzxsaT48cD48Yj52b2lkIHhyZWFkYWxsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTwvYj48L3A+CisKKzxwPlJlYWRzIHRoZSBlbnRpcmUgbGVuLXNpemVkIGJ1ZmZlciwgcmV0cnlpbmcgdG8gY29tcGxldGUgc2hvcnQKK3JlYWRzLiBFeGl0cyBpZiBpdCBjYW4ndCBnZXQgZW5vdWdoIGRhdGEuPC9wPjwvbGk+CisKKzxsaT48cD48Yj52b2lkIHh3cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik8L2I+PC9wPgorCis8cD5SZXRyaWVzIHNob3J0IHdyaXRlcywgZXhpdHMgaWYgY2FuJ3Qgd3JpdGUgdGhlIGVudGlyZSBidWZmZXIuPC9wPjwvbGk+CisKKzxsaT48Yj5vZmZfdCB4bHNlZWsoaW50IGZkLCBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqeGdldGN3ZCh2b2lkKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgeHN0YXQoY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0KTwvYj48L2xpPgorPGxpPjxwPjxiPmNoYXIgKnhhYnNwYXRoKGNoYXIgKnBhdGgsIGludCBleGFjdCkgPC9iPjwvcD4KKworPHA+QWZ0ZXIgc2V2ZXJhbCB5ZWFycyBvZgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAwNy5odG1sIzE4LTA2LTIwMDc+d3Jlc3RsaW5nPC9hPgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAwOC5odG1sIzE5LTAxLTIwMDg+d2l0aDwvYT4gcmVhbHBhdGgoKSwgCitJIGJyb2tlIGRvd24gYW5kIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLTIwMTIuaHRtbCMyMC0xMS0yMDEyPndyb3RlCitteSBvd248L2E+IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lc24ndCB1c2UgdGhlIG9uZSBpbiBsaWJjLiBBcyBJIGV4cGxhaW5lZDoKKworPGJsb2NrcXVvdGU+PHA+SWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgYnJva2VuIGxpbmssCityZWFkbGluayAtZiBzaG91bGQgc2hvdyB3aGVyZSB0aGUgbGluayBwb2ludHMgdG8sIG5vdCB3aGVyZSB0aGUgYnJva2VuIGxpbmsKK2xpdmVzLiAoVGhlIHBvaW50IG9mIHJlYWRsaW5rIC1mIGlzICJpZiBJIHdyaXRlIGhlcmUsIHdoZXJlIHdvdWxkIGl0IGF0dGVtcHQKK3RvIGNyZWF0ZSBhIGZpbGUiLikgVGhlIHByb2JsZW0gaXMsIHJlYWxwYXRoKCkgcmV0dXJucyBOVUxMIGZvciBhIHBhdGggZW5kaW5nCit3aXRoIGEgYnJva2VuIGxpbmssIGFuZCBJIGNhbid0IGJlYXQgZGlmZmVyZW50IGJlaGF2aW9yIG91dCBvZiBjb2RlIGxvY2tlZAorYXdheSBpbiBsaWJjLjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPgorPC9saT4KKzxsaT48Yj52b2lkIHhjaGRpcihjaGFyICpwYXRoKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgeGNocm9vdChjaGFyICpwYXRoKTwvYj48L2xpPgorCis8bGk+PHA+PGI+c3RydWN0IHBhc3N3ZCAqeGdldHB3dWlkKHVpZF90IHVpZCk8YnIgLz4KK3N0cnVjdCBncm91cCAqeGdldGdyZ2lkKGdpZF90IGdpZCk8YnIgLz4KK3N0cnVjdCBwYXNzd2QgKnhnZXRwd25hbShjaGFyICpuYW1lKTwvYj48L3A+CisKKzxwPjwvcD4KKzwvbGk+CisKKworCis8bGk+PGI+dm9pZCB4c2V0dXNlcihzdHJ1Y3QgcGFzc3dkICpwd2QpPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqeHJlYWRsaW5rKGNoYXIgKm5hbWUpPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqeHJlYWRmaWxlKGNoYXIgKm5hbWUsIGNoYXIgKmJ1Ziwgb2ZmX3QgbGVuKTwvYj48L2xpPgorPGxpPjxiPmludCB4aW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCwgdm9pZCAqZGF0YSk8L2I+PC9saT4KKzxsaT48Yj52b2lkIHhwaWRmaWxlKGNoYXIgKm5hbWUpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCB4c2VuZGZpbGUoaW50IGluLCBpbnQgb3V0KTwvYj48L2xpPgorPGxpPjxiPmxvbmcgeHBhcnNldGltZShjaGFyICphcmcsIGxvbmcgdW5pdHMsIGxvbmcgKmZyYWN0aW9uKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgeHJlZ2NvbXAocmVnZXhfdCAqcHJlZywgY2hhciAqcmVnZXgsIGludCBjZmxhZ3MpPC9iPjwvbGk+Cis8L3VsPgorCis8YSBuYW1lPSJsaWJfbGliIj48aDM+bGliL2xpYi5jPC9oMz4KKzxwPkVpZ2h0IGdhemlsbGlvbiBjb21tb24gZnVuY3Rpb25zOjwvcD4KKworPHVsPgorPGxpPjxiPnZvaWQgdmVycm9yX21zZyhjaGFyICptc2csIGludCBlcnIsIHZhX2xpc3QgdmEpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCBlcnJvcl9tc2coY2hhciAqbXNnLCAuLi4pPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCBwZXJyb3JfbXNnKGNoYXIgKm1zZywgLi4uKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgZXJyb3JfZXhpdChjaGFyICptc2csIC4uLik8L2I+PC9saT4KKzxsaT48Yj52b2lkIHBlcnJvcl9leGl0KGNoYXIgKm1zZywgLi4uKTwvYj48L2xpPgorPGxpPjxiPnNzaXplX3QgcmVhZGFsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik8L2I+PC9saT4KKzxsaT48Yj5zc2l6ZV90IHdyaXRlYWxsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTwvYj48L2xpPgorPGxpPjxiPm9mZl90IGxza2lwKGludCBmZCwgb2ZmX3Qgb2Zmc2V0KTwvYj48L2xpPgorPGxpPjxiPmludCBta3BhdGhhdChpbnQgYXRmZCwgY2hhciAqZGlyLCBtb2RlX3QgbGFzdG1vZGUsIGludCBmbGFncyk8L2I+PC9saT4KKzxsaT48Yj5zdHJ1Y3Qgc3RyaW5nX2xpc3QgKipzcGxpdHBhdGgoY2hhciAqcGF0aCwgc3RydWN0IHN0cmluZ19saXN0ICoqbGlzdCk8L2I+PC9saT4KKzxsaT48Yj5zdHJ1Y3Qgc3RyaW5nX2xpc3QgKmZpbmRfaW5fcGF0aChjaGFyICpwYXRoLCBjaGFyICpmaWxlbmFtZSk8L2I+PC9saT4KKzxsaT48Yj5sb25nIGF0b2x4KGNoYXIgKm51bXN0cik8L2I+PC9saT4KKzxsaT48Yj5sb25nIGF0b2x4X3JhbmdlKGNoYXIgKm51bXN0ciwgbG9uZyBsb3csIGxvbmcgaGlnaCk8L2I+PC9saT4KKzxsaT48Yj5pbnQgbnVtbGVuKGxvbmcgbCk8L2I+PC9saT4KKzxsaT48Yj5pbnQgc3RyaWR4KGNoYXIgKmhheXN0YWNrLCBjaGFyIG5lZWRsZSk8L2I+PC9saT4KKzxsaT48Yj5pbnQgc3Ryc3RhcnQoY2hhciAqKmEsIGNoYXIgKmIpPC9iPjwvbGk+Cis8bGk+PGI+b2ZmX3QgZmRsZW5ndGgoaW50IGZkKTwvYj48L2xpPgorPGxpPjxiPmNoYXIgKnJlYWRmaWxlKGNoYXIgKm5hbWUsIGNoYXIgKmlidWYsIG9mZl90IGxlbik8L2I+PC9saT4KKzxsaT48Yj52b2lkIG1zbGVlcChsb25nIG1pbGlzZWNvbmRzKTwvYj48L2xpPgorPGxpPjxiPmludDY0X3QgcGVla19sZSh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpPC9iPjwvbGk+Cis8bGk+PGI+aW50NjRfdCBwZWVrX2JlKHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSk8L2I+PC9saT4KKzxsaT48Yj5pbnQ2NF90IHBlZWsodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgcG9rZSh2b2lkICpwdHIsIHVpbnQ2NF90IHZhbCwgaW50IHNpemUpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCBsb29wZmlsZXNfcncoY2hhciAqKmFyZ3YsIGludCBmbGFncywgaW50IHBlcm1pc3Npb25zLCBpbnQgZmFpbG9rLDwvYj48L2xpPgorPGxpPjxiPnZvaWQgbG9vcGZpbGVzKGNoYXIgKiphcmd2LCB2b2lkICgqZnVuY3Rpb24pKGludCBmZCwgY2hhciAqbmFtZSkpPC9iPjwvbGk+Cis8bGk+PGI+Y2hhciAqZ2V0X3Jhd2xpbmUoaW50IGZkLCBsb25nICpwbGVuLCBjaGFyIGVuZCk8L2I+PC9saT4KKzxsaT48Yj5jaGFyICpnZXRfbGluZShpbnQgZmQpPC9iPjwvbGk+Cis8bGk+PGI+aW50IHdmY2htb2RhdChpbnQgZmQsIGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlKTwvYj48L2xpPgorPGxpPjxiPnN0YXRpYyB2b2lkIHRlbXBmaWxlX2hhbmRsZXIoaW50IGkpPC9iPjwvbGk+Cis8bGk+PGI+aW50IGNvcHlfdGVtcGZpbGUoaW50IGZkaW4sIGNoYXIgKm5hbWUsIGNoYXIgKip0ZW1wbmFtZSk8L2I+PC9saT4KKzxsaT48Yj52b2lkIGRlbGV0ZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpPC9iPjwvbGk+Cis8bGk+PGI+dm9pZCByZXBsYWNlX3RlbXBmaWxlKGludCBmZGluLCBpbnQgZmRvdXQsIGNoYXIgKip0ZW1wbmFtZSk8L2I+PC9saT4KKzxsaT48Yj52b2lkIGNyY19pbml0KHVuc2lnbmVkIGludCAqY3JjX3RhYmxlLCBpbnQgbGl0dGxlX2VuZGlhbik8L2I+PC9saT4KKzxsaT48Yj5pbnQgdGVybWluYWxfc2l6ZSh1bnNpZ25lZCAqeHgsIHVuc2lnbmVkICp5eSk8L2I+PC9saT4KKzxsaT48Yj5pbnQgeWVzbm8oY2hhciAqcHJvbXB0LCBpbnQgZGVmKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgZ2VuZXJpY19zaWduYWwoaW50IHNpZyk8L2I+PC9saT4KKzxsaT48Yj52b2lkIHNpZ2F0ZXhpdCh2b2lkICpoYW5kbGVyKTwvYj48L2xpPgorPGxpPjxiPmludCBzaWdfdG9fbnVtKGNoYXIgKnBpZHN0cik8L2I+PC9saT4KKzxsaT48Yj5jaGFyICpudW1fdG9fc2lnKGludCBzaWcpPC9iPjwvbGk+Cis8bGk+PGI+bW9kZV90IHN0cmluZ190b19tb2RlKGNoYXIgKm1vZGVzdHIsIG1vZGVfdCBtb2RlKTwvYj48L2xpPgorPGxpPjxiPnZvaWQgbW9kZV90b19zdHJpbmcobW9kZV90IG1vZGUsIGNoYXIgKmJ1Zik8L2I+PC9saT4KKzxsaT48Yj52b2lkIG5hbWVzX3RvX3BpZChjaGFyICoqbmFtZXMsIGludCAoKmNhbGxiYWNrKShwaWRfdCBwaWQsIGNoYXIgKm5hbWUpKTwvYj48L2xpPgorPGxpPjxiPmludCBodW1hbl9yZWFkYWJsZShjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0pPC9iPjwvbGk+Cis8L3VsPgorCis8aDM+bGliL3BvcnRhYmlsaXR5Lmg8L2gzPgorCis8cD5UaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBmcm9tIHRoZSB0b3Agb2YgdG95cy5oLCBhbmQgc21vb3Rocworb3ZlciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBsYXRmb3JtcyAoaGFyZHdhcmUgdGFyZ2V0cywgY29tcGlsZXJzLCBDIGxpYnJhcmllcywKK29wZXJhdGluZyBzeXN0ZW1zLCBldGMpLjwvcD4KKworPHA+VGhpcyBmaWxlIHByb3ZpZGVzIFNXQVAgbWFjcm9zIChTV0FQX0JFMTYoeCkgYW5kIFNXQVBfTEUzMih4KSBhbmQgc28gb24pLjwvcD4KKworPHA+QSBtYWNybyBsaWtlIFNXQVBfTEUzMih4KSBtZWFucyAiVGhlIHZhbHVlIGluIHggaXMgc3RvcmVkIGFzIGEgbGl0dGxlCitlbmRpYW4gMzIgYml0IHZhbHVlLCBzbyBwZXJmb3JtIHRoZSB0cmFuc2xhdGlvbiB0by9mcm9tIHdoYXRldmVyIHRoZSBuYXRpdmUKKzMyLWJpdCBmb3JtYXQgaXMiLiAgWW91IGRvIHRoZSBzd2FwIG9uY2Ugb24gdGhlIHdheSBpbiwgYW5kIG9uY2Ugb24gdGhlIHdheQorb3V0LiBJZiB5b3VyIHRhcmdldCBpcyBhbHJlYWR5IGxpdHRsZSBlbmRpYW4sIHRoZSBtYWNybyBpcyBhIE5PUC48L3A+CisKKzxwPlRoZSBTV0FQIG1hY3JvcyBjb21lIGluIEJFIGFuZCBMRSBlYWNoIHdpdGggMTYsIDMyLCBhbmQgNjQgYml0IHZlcnNpb25zLgorSW4gZWFjaCBjYXNlLCB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gcmVmZXJzIHRvIHRoZSBfZXh0ZXJuYWxfIHJlcHJlc2VudGF0aW9uLAorYW5kIGNvbnZlcnRzIHRvL2Zyb20gd2hhdGV2ZXIgeW91ciBuYXRpdmUgcmVwcmVzZW50YXRpb24gaGFwcGVucyB0byBiZSAod2hpY2gKK2NhbiB2YXJ5IGRlcGVuZGluZyBvbiB3aGF0IHlvdSdyZSBjdXJyZW50bHkgY29tcGlsaW5nIGZvcikuPC9wPgorCis8YSBuYW1lPSJsaWJfbGxpc3QiPjxoMz5saWIvbGxpc3QuYzwvaDM+CisKKzxwPlNvbWUgZ2VuZXJpYyBzaW5nbGUgYW5kIGRvdWJseSBsaW5rZWQgbGlzdCBmdW5jdGlvbnMsIHdoaWNoIHRha2UKK2FkdmFudGFnZSBvZiBhIGNvdXBsZSBwcm9wZXJ0aWVzIG9mIEM6PC9wPgorCis8dWw+Cis8bGk+PHA+U3RydWN0dXJlIGVsZW1lbnRzIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkgaW4gdGhlIG9yZGVyIGxpc3RlZCwgYW5kCit0aGUgZmlyc3QgZWxlbWVudCBoYXMgbm8gcGFkZGluZy4gVGhpcyBtZWFucyB5b3UgY2FuIGFsd2F5cyB0cmVhdCAodHlwZWNhc3QpCithIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdHJ1Y3R1cmUsCitldmVuIGlmIHlvdSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBkYXRhIGZvbGxvd2luZyBpdC48L3A+PC9saT4KKworPGxpPjxwPkFuIGFycmF5IG9mIGxlbmd0aCB6ZXJvIGF0IHRoZSBlbmQgb2YgYSBzdHJ1Y3R1cmUgYWRkcyBubyBzcGFjZQordG8gdGhlIHNpemVvZigpIHRoZSBzdHJ1Y3R1cmUsIGJ1dCBpZiB5b3UgY2FsY3VsYXRlIGhvdyBtdWNoIGV4dHJhIHNwYWNlCit5b3Ugd2FudCB3aGVuIHlvdSBtYWxsb2MoKSB0aGUgc3RydWN0dXJlIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGF0IHRoZSBlbmQuCitTaW5jZSBDIGhhcyBubyBib3VuZHMgY2hlY2tpbmcsIHRoaXMgbWVhbnMgZWFjaCBzdHJ1Y3QgY2FuIGhhdmUgb25lIHZhcmlhYmxlCitsZW5ndGggYXJyYXkuPC9wPjwvbGk+Cis8L3VsPgorCis8cD5Ub3lib3gncyBsaXN0IHN0cnVjdHVyZXMgYWx3YXlzIGhhdmUgdGhlaXIgPGI+bmV4dDwvYj4gcG9pbnRlciBhcwordGhlIGZpcnN0IGVudHJ5IG9mIGVhY2ggc3RydWN0LCBhbmQgc2luZ2x5IGxpbmtlZCBsaXN0cyBlbmQgd2l0aCBhIE5VTEwgcG9pbnRlci4KK1RoaXMgYWxsb3dzIGdlbmVyaWMgY29kZSB0byB0cmF2ZXJzZSBzdWNoIGxpc3RzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZworZWxzZSBhYm91dCB0aGUgc3BlY2lmaWMgc3RydWN0cyBjb21wb3NpbmcgdGhlbTogaWYgeW91ciBwb2ludGVyIGlzbid0IE5VTEwKK3R5cGVjYXN0IGl0IHRvIHZvaWQgKiogYW5kIGRlcmVmZXJlbmNlIG9uY2UgdG8gZ2V0IHRoZSBuZXh0IGVudHJ5LjwvcD4KKworPHA+PGI+bGliL2xpYi5oPC9iPiBkZWZpbmVzIHRocmVlIHN0cnVjdHVyZSB0eXBlczo8L3A+Cis8dWw+Cis8bGk+PHA+PGI+c3RydWN0IHN0cmluZ19saXN0PC9iPiAtIHN0b3JlcyBhIHNpbmdsZSBzdHJpbmcgKDxiPmNoYXIgc3RyWzBdPC9iPiksCittZW1vcnkgZm9yIHdoaWNoIGlzIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoZSBub2RlLiAoSS5FLiBsbGlzdF90cmF2ZXJzZShsaXN0LAorZnJlZSk7IGNhbiBjbGVhbiB1cCBhZnRlciB0aGlzIHR5cGUgb2YgbGlzdC4pPC9wPjwvbGk+CisKKzxsaT48cD48Yj5zdHJ1Y3QgYXJnX2xpc3Q8L2I+IC0gc3RvcmVzIGEgcG9pbnRlciB0byBhIHNpbmdsZSBzdHJpbmcKKyg8Yj5jaGFyICphcmc8L2I+KSB3aGljaCBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBjaHVuayBvZiBtZW1vcnkuPC9wPjwvbGk+CisKKzxsaT48cD48Yj5zdHJ1Y3QgZG91YmxlX2xpc3Q8L2I+IC0gaGFzIGEgc2Vjb25kIHBvaW50ZXIgKDxiPnN0cnVjdCBkb3VibGVfbGlzdAorKnByZXY8L2I+IGFsb25nIHdpdGggYSA8Yj5jaGFyICpkYXRhPC9iPiBmb3IgcGF5bG9hZC48L3A+PC9saT4KKzwvdWw+CisKKzxiPkxpc3QgRnVuY3Rpb25zPC9iPgorCis8dWw+Cis8bGk+PHA+dm9pZCAqPGI+bGxpc3RfcG9wPC9iPih2b2lkICoqbGlzdCkgLSBhZHZhbmNlcyB0aHJvdWdoIGEgbGlzdCBhbGEKKzxiPm5vZGUgPSBsbGlzdF9wb3AoJmxpc3QpOzwvYj4gIFRoaXMgZG9lc24ndCBtb2RpZnkgdGhlIGxpc3QgY29udGVudHMsCitidXQgZG9lcyBhZHZhbmNlIHRoZSBwb2ludGVyIHlvdSBmZWVkIGl0ICh3aGljaCBpcyB3aHkgeW91IHBhc3MgdGhlIF9hZGRyZXNzXworb2YgdGhhdCBwb2ludGVyLCBub3QgdGhlIHBvaW50ZXIgaXRzZWxmKS48L3A+PC9saT4KKworPGxpPjxwPnZvaWQgPGI+bGxpc3RfdHJhdmVyc2U8L2I+KHZvaWQgKmxpc3QsIHZvaWQgKCp1c2luZykodm9pZCAqZGF0YSkpIC0KK2l0ZXJhdGUgdGhyb3VnaCBhIGxpc3QgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2ggbm9kZS48L3A+PC9saT4KKworPGxpPjxwPnN0cnVjdCBkb3VibGVfbGlzdCAqPGI+ZGxpc3RfYWRkPC9iPihzdHJ1Y3QgZG91YmxlX2xpc3QgKipsbGlzdCwgY2hhciAqZGF0YSkKKy0gYXBwZW5kIGFuIGVudHJ5IHRvIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuCitUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBzdHJ1Y3QgZG91YmxlX2xpc3Qgd3JhcHBlciBhbmQgcmV0dXJucyB0aGUKK3BvaW50ZXIgdG8gdGhlIG5ldyBlbnRyeSAod2hpY2ggeW91IGNhbiB1c3VhbGx5IGlnbm9yZSBzaW5jZSBpdCdzIGxsaXN0LT5wcmV2LAorYnV0IGlmIGxsaXN0IHdhcyBOVUxMIHlvdSBuZWVkIGl0KS4gVGhlIGFyZ3VtZW50IGlzIHRoZSAtPmRhdGEgZmllbGQgZm9yIHRoZQorbmV3IG5vZGUuPC9wPjwvbGk+Cis8dWw+PGxpPjxwPnZvaWQgPGI+ZGxpc3RfYWRkX25vbWFsbG9jPC9iPihzdHJ1Y3QgZG91YmxlX2xpc3QgKipsbGlzdCwKK3N0cnVjdCBkb3VibGVfbGlzdCAqbmV3KSAtIGFwcGVuZCBleGlzdGluZyBzdHJ1Y3QgZG91YmxlX2xpc3QgdG8KK2xpc3QsIGRvZXMgbm90IGFsbG9jYXRlIGFueXRoaW5nLjwvcD48L2xpPjwvdWw+Cis8L3VsPgorCis8Yj5MaXN0IGNvZGUgdHJpdmlhIHF1ZXN0aW9uczo8L2I+CisKKzx1bD4KKzxsaT48cD48Yj5XaHkgZG8gYXJnX2xpc3QgYW5kIGRvdWJsZV9saXN0IGNvbnRhaW4gYSBjaGFyICogcGF5bG9hZCBpbnN0ZWFkIG9mCithIHZvaWQgKj88L2I+IC0gQmVjYXVzZSB5b3UgYWx3YXlzIGhhdmUgdG8gdHlwZWNhc3QgYSB2b2lkICogdG8gdXNlIGl0LCBhbmQKK3R5cGVjYXN0aW5nIGEgY2hhciAqIGRvZXMgbm8gaGFybS4gU2luY2Ugc3RyaW5ncyBhcmUgdGhlIG1vc3QgY29tbW9uCitwYXlsb2FkLCBhbmQgZG9pbmcgbWF0aCBvbiB0aGUgcG9pbnRlciBhbGEKKyIodHlwZSAqKShwdHIrc2l6ZW9mKHRoaW5nKStzaXplb2Yob3RoZXJ0aGluZykpIiByZXF1aXJlcyBwdHIgdG8gYmUgY2hhciAqCithbnl3YXkgKGF0IGxlYXN0IGFjY29yZGluZyB0byB0aGUgQyBzdGFuZGFyZCksIGRlZmF1bHRpbmcgdG8gY2hhciAqIHNhdmVzCithIHR5cGVjYXN0LjwvcD4KKzwvbGk+CisKKzxsaT48cD48Yj5XaHkgZG8gdGhlIG5hbWVzIC0+c3RyLCAtPmFyZywgYW5kIC0+ZGF0YSBkaWZmZXI/PC9iPiAtIFRvIGZvcmNlCit5b3UgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvbmUgeW91J3JlIHVzaW5nLCBjYWxsaW5nIGZyZWUobm9kZS0+c3RyKSB3b3VsZAorYmUgYmFkLCBhbmQgX2ZhaWxpbmdfIHRvIGZyZWUobm9kZS0+YXJnKSBsZWFrcyBtZW1vcnkuPC9wPjwvbGk+CisKKzxsaT48cD48Yj5XaHkgZG9lcyBsbGlzdF9wb3AoKSB0YWtlIGEgdm9pZCAqIGluc3RlYWQgb2Ygdm9pZCAqKj88L2I+IC0KK2JlY2F1c2UgdGhlIHN0dXBpZCBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgInR5cGUgcHVubmVkIHBvaW50ZXJzIiB3aGVuCit5b3UgdHlwZWNhc3QgYW5kIGRlcmVmZXJlbmNlIG9uIHRoZSBzYW1lIGxpbmUsCitkdWUgdG8gaW5zYW5lIEZTRiBkZXZlbG9wZXJzIGhhcmR3aXJpbmcgbGltaXRhdGlvbnMgb2YgdGhlaXIgb3B0aW1pemVyCitpbnRvIGdjYydzIHdhcm5pbmcgc3lzdGVtLiBTaW5jZSBDIGF1dG9tYXRpY2FsbHkgdHlwZWNhc3RzIGFueSBvdGhlcgorcG9pbnRlciB0eXBlIHRvIGFuZCBmcm9tIHZvaWQgKiwgdGhlIGN1cnJlbnQgY29kZSB3b3JrcyBmaW5lLiBJdCdzIHNhZCB0aGF0IGl0Cit3b24ndCB3YXJuIHlvdSBpZiB5b3UgZm9yZ2V0IHRoZSAmLCBidXQgdGhlIGNvZGUgY3Jhc2hlcyBwcmV0dHkgcXVpY2tseSBpbgordGhhdCBjYXNlLjwvcD48L2xpPgorCis8bGk+PHA+PGI+SG93IGRvIEkgYXNzZW1ibGUgYSBzaW5nbHktbGlua2VkLWxpc3QgaW4gb3JkZXI/PC9iPiAtIHVzZQorYSBkb3VibGVfbGlzdCwgZGxpc3RfYWRkKCkgeW91ciBlbnRyaWVzLCBhbmQgdGhlbiBicmVhayB0aGUgY2lyY2xlIHdpdGgKKzxiPmxpc3QtPnByZXYtPm5leHQgPSBOVUxMOzwvYj4gd2hlbiBkb25lLjwvbGk+Cis8L3VsPgorCis8YSBuYW1lPSJsaWJfYXJncyI+PGgzPmxpYi9hcmdzLmM8L2gzPgorCis8cD5Ub3lib3gncyBtYWluLmMgYXV0b21hdGljYWxseSBwYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgYmVmb3JlIGNhbGxpbmcgdGhlCitjb21tYW5kJ3MgbWFpbiBmdW5jdGlvbi4gT3B0aW9uIHBhcnNpbmcgc3RhcnRzIGluIGdldF9vcHRmbGFncygpLCB3aGljaCBzdG9yZXMKK3Jlc3VsdHMgaW4gdGhlIGdsb2JhbCBzdHJ1Y3R1cmVzICJ0b3lzIiAob3B0ZmxhZ3MgYW5kIG9wdGFyZ3MpIGFuZCAidGhpcyIuPC9wPgorCis8cD5UaGUgb3B0aW9uIHBhcnNpbmcgaW5mcmFzdHJ1Y3R1cmUgc3RvcmVzIGEgYml0ZmllbGQgaW4gdG95cy5vcHRmbGFncyB0bworaW5kaWNhdGUgd2hpY2ggb3B0aW9ucyB0aGUgY3VycmVudCBjb21tYW5kIGxpbmUgY29udGFpbmVkLCBhbmQgZGVmaW5lcyBGTEFHCittYWNyb3MgY29kZSBjYW4gdXNlIHRvIGNoZWNrIHdoZXRoZXIgZWFjaCBhcmd1bWVudCdzIGJpdCBpcyBzZXQuIEFyZ3VtZW50cworYXR0YWNoZWQgdG8gdGhvc2Ugb3B0aW9ucyBhcmUgc2F2ZWQgaW50byB0aGUgY29tbWFuZCdzIGdsb2JhbCBzdHJ1Y3R1cmUKKygidGhpcyIpLiBBbnkgcmVtYWluaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0b2dldGhlciBpbnRvCit0aGUgbnVsbC10ZXJtaW5hdGVkIGFycmF5IHRveXMub3B0YXJncywgd2l0aCB0aGUgbGVuZ3RoIGluIHRveXMub3B0Yy4gKE5vdGUKK3RoYXQgdG95cy5vcHRhcmdzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGN1cnJlbnQgY29tbWFuZCBuYW1lIGF0IHBvc2l0aW9uIHplcm8sCit1c2UgInRveXMud2hpY2gtPm5hbWUiIGZvciB0aGF0LikgVGhlIHJhdyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGdldF9vcHRmbGFncygpCitwYXJzZWQgYXJlIHJldGFpbmVkIHVubW9kaWZpZWQgaW4gdG95cy5hcmd2W10uPC9wPgorCis8cD5Ub3lib3gncyBvcHRpb24gcGFyc2luZyBsb2dpYyBpcyBjb250cm9sbGVkIGJ5IGFuICJvcHRmbGFncyIgc3RyaW5nLCB1c2luZworYSBmb3JtYXQgcmVtaW5pc2NlbnQgb2YgZ2V0b3B0J3Mgb3B0YXJncyBidXQgd2l0aCBzZXZlcmFsIGltcG9ydGFudCBkaWZmZXJlbmNlcy4KK1RveWJveCBkb2VzIG5vdCB1c2UgdGhlIGdldG9wdCgpCitmdW5jdGlvbiBvdXQgb2YgdGhlIEMgbGlicmFyeSwgZ2V0X29wdGZsYWdzKCkgaXMgYW4gaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24KK3doaWNoIGRvZXNuJ3QgcGVybXV0ZSB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIChhbmQgdGh1cyBkb2Vzbid0IGNoYW5nZSBob3cgdGhlCitjb21tYW5kIGlzIGRpc3BsYXllZCBpbiBwcyBhbmQgdG9wKSwgYW5kIGhhcyBtYW55IGZlYXR1cmVzIG5vdCBwcmVzZW50IGluCitsaWJjIG9wdGFyZ3MoKSAoc3VjaCBhcyB0aGUgYWJpbGl0eSB0byBkZXNjcmliZSBsb25nIG9wdGlvbnMgaW4gdGhlIHNhbWUgc3RyaW5nCithcyBub3JtYWwgb3B0aW9ucykuPC9wPgorCis8cD5FYWNoIGNvbW1hbmQncyBORVdUT1koKSBtYWNybyBoYXMgYW4gb3B0ZmxhZ3Mgc3RyaW5nIGFzIGl0cyBtaWRkbGUgYXJndW1lbnQsCit3aGljaCBzZXRzIHRveV9saXN0Lm9wdGlvbnMgZm9yIHRoYXQgY29tbWFuZCB0byB0ZWxsIGdldF9vcHRmbGFncygpIHdoYXQKK2NvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gbG9vayBmb3IsIGFuZCB3aGF0IHRvIGRvIHdpdGggdGhlbS4KK0lmIGEgY29tbWFuZCBoYXMgbm8gb3B0aW9uCitkZWZpbml0aW9uIHN0cmluZyAoSS5FLiB0aGUgYXJndW1lbnQgaXMgTlVMTCksIG9wdGlvbiBwYXJzaW5nIGlzIHNraXBwZWQKK2ZvciB0aGF0IGNvbW1hbmQsIHdoaWNoIG11c3QgbG9vayBhdCB0aGUgcmF3IGRhdGEgaW4gdG95cy5hcmd2IHRvIHBhcnNlIGl0cworb3duIGFyZ3VtZW50cy4gKElmIG5vIGN1cnJlbnRseSBlbmFibGVkIGNvbW1hbmQgdXNlcyBvcHRpb24gcGFyc2luZywKK2dldF9vcHRmbGFncygpIGlzIG9wdGltaXplZCBvdXQgb2YgdGhlIHJlc3VsdGluZyBiaW5hcnkgYnkgdGhlIGNvbXBpbGVyJ3MKKy0tZ2Mtc2VjdGlvbnMgb3B0aW9uLik8L3A+CisKKzxwPllvdSBkb24ndCBoYXZlIHRvIGZyZWUgdGhlIG9wdGlvbiBzdHJpbmdzLCB3aGljaCBwb2ludCBpbnRvIHRoZSBlbnZpcm9ubWVudAorc3BhY2UgKEkuRS4gdGhlIHN0cmluZyBkYXRhIGlzIG5vdCBjb3BpZWQpLiBBIFRPWUZMQUdfTk9GT1JLIGNvbW1hbmQKK3RoYXQgdXNlcyB0aGUgbGlua2VkIGxpc3QgdHlwZSAiKiIgc2hvdWxkIGZyZWUgdGhlIGxpc3Qgb2JqZWN0cyBidXQgbm90Cit0aGUgZGF0YSB0aGV5IHBvaW50IHRvLCB2aWEgImxsaXN0X2ZyZWUoVFQubXlsaXN0LCBOVUxMKTsiLiAoSWYgaXQncyBub3QKK05PRk9SSywgZXhpdCgpIHdpbGwgZnJlZSBhbGwgdGhlIG1hbGxvY2VkIGRhdGEgYW55d2F5IHVubGVzcyB5b3Ugd2FudAordG8gaW1wbGVtZW50IGEgQ09ORklHX1RPWUJPWF9GUkVFIGNsZWFudXAgZm9yIGl0Lik8L3A+CisKKzxoND5PcHRmbGFncyBmb3JtYXQgc3RyaW5nPC9oND4KKworPHA+Tm90ZTogdGhlIG9wdGZsYWdzIG9wdGlvbiBkZXNjcmlwdGlvbiBzdHJpbmcgZm9ybWF0IGlzIG11Y2ggbW9yZQorY29uY2lzZWx5IGRlc2NyaWJlZCBieSBhIGxhcmdlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiBsaWIvYXJncy5jLjwvcD4KKworPHA+VGhlIGdlbmVyYWwgdGhlb3J5IGlzIHRoYXQgbGV0dGVycyBzZXQgb3B0ZmxhZ3MsIGFuZCBwdW5jdHVhdGlvbiBkZXNjcmliZXMKK290aGVyIGFjdGlvbnMgdGhlIG9wdGlvbiBwYXJzaW5nIGxvZ2ljIHNob3VsZCB0YWtlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlIGNvbW1hbmQgbGluZSA8Yj5jb21tYW5kIC1iIGZydWl0IC1kIHdhbHJ1cyAtYSA0MjwvYj4KK2lzIHBhcnNlZCB1c2luZyB0aGUgb3B0ZmxhZ3Mgc3RyaW5nICI8Yj5hI2I6YzpkPC9iPiIuICAoSS5FLgordG95cy53aGljaC0+b3B0aW9ucz0iYSNiOmM6ZCIgYW5kIGFyZ3YgPSBbImNvbW1hbmQiLCAiLWIiLCAiZnJ1aXQiLCAiLWQiLAorIndhbHJ1cyIsICItYSIsICI0MiJdKS4gIFdoZW4gZ2V0X29wdGZsYWdzKCkgcmV0dXJucywgdGhlIGZvbGxvd2luZyBkYXRhIGlzCithdmFpbGFibGUgdG8gY29tbWFuZF9tYWluKCk6CisKKzx1bD4KKzxsaT48cD5JbiA8Yj5zdHJ1Y3QgdG95czwvYj46Cis8dWw+Cis8bGk+dG95cy5vcHRmbGFncyA9IDEzOyAvLyBGTEFHX2EgPSA4IHwgRkxBR19iID0gNCB8IEZMQUdfZCA9IDE8L2xpPgorPGxpPnRveXMub3B0YXJnc1swXSA9ICJ3YWxydXMiOyAvLyBsZWZ0b3ZlciBhcmd1bWVudDwvbGk+Cis8bGk+dG95cy5vcHRhcmdzWzFdID0gTlVMTDsgLy8gZW5kIG9mIGxpc3Q8L2xpPgorPGxpPnRveXMub3B0YyA9IDE7IC8vIHRoZXJlIHdhcyAxIGxlZnRvdmVyIGFyZ3VtZW50PC9saT4KKzxsaT50b3lzLmFyZ3ZbXSA9IHsiLWIiLCAiZnJ1aXQiLCAiLWQiLCAid2FscnVzIiwgIi1hIiwgIjQyIn07IC8vIFRoZSBvcmlnaW5hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCis8L3VsPgorPHA+PC9saT4KKworPGxpPjxwPkluIDxiPnVuaW9uIHRoaXM8L2I+ICh0cmVhdGVkIGFzIDxiPmxvbmcgdGhpc1tdPC9iPik6Cis8dWw+Cis8bGk+dGhpc1swXSA9IE5VTEw7IC8vIC1jIGRpZG4ndCBnZXQgYW4gYXJndW1lbnQgdGhpcyB0aW1lLCBzbyBnZXRfb3B0ZmxhZ3MoKSBkaWRuJ3QgY2hhbmdlIGl0IGFuZCB0b3lzX2luaXQoKSB6ZXJvZWQgInRoaXMiIGR1cmluZyBzZXR1cC4pPC9saT4KKzxsaT50aGlzWzFdID0gKGxvbmcpImZydWl0IjsgLy8gYXJndW1lbnQgdG8gLWI8L2xpPgorPGxpPnRoaXNbMl0gPSA0MjsgLy8gYXJndW1lbnQgdG8gLWE8L2xpPgorPC91bD4KKzwvcD48L2xpPgorPC91bD4KKworPHA+SWYgdGhlIGNvbW1hbmQncyBnbG9iYWxzIGFyZTo8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CitHTE9CQUxTKAorCWNoYXIgKmM7CisJY2hhciAqYjsKKwlsb25nIGE7CispCis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlRoYXQgd291bGQgbWVhbiBUVC5jID09IE5VTEwsIFRULmIgPT0gImZydWl0IiwgYW5kIFRULmEgPT0gNDIuICAoUmVtZW1iZXIsCitlYWNoIGVudHJ5IHRoYXQgcmVjZWl2ZXMgYW4gYXJndW1lbnQgbXVzdCBiZSBhIGxvbmcgb3IgcG9pbnRlciwgdG8gbGluZSB1cAord2l0aCB0aGUgYXJyYXkgcG9zaXRpb24uICBSaWdodCB0byBsZWZ0IGluIHRoZSBvcHRmbGFncyBzdHJpbmcgY29ycmVzcG9uZHMgdG8KK3RvcCB0byBib3R0b20gaW4gR0xPQkFMUygpLjwvcD4KKworPHA+UHV0IGdsb2JhbHMgbm90IGZpbGxlZCBvdXQgYnkgdGhlIG9wdGlvbiBwYXJzaW5nIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhlCitHTE9CQUxTIGJsb2NrLiBDb21tb24gcHJhY3RpY2UgaXMgdG8gbGlzdCB0aGUgb3B0aW9ucyBvbmUgcGVyIGxpbmUgKHRvCittYWtlIHRoZSBvcmRlcmluZyBleHBsaWNpdCwgZmlyc3QgdG8gbGFzdCBpbiBnbG9iYWxzIGNvcnJlc3BvbmRzIHRvIHJpZ2h0Cit0byBsZWZ0IGluIHRoZSBvcHRpb24gc3RyaW5nKSwgdGhlbiBsZWF2ZSBhIGJsYW5rIGxpbmUgYmVmb3JlIGFueSBub24tb3B0aW9uCitnbG9iYWxzLjwvcD4KKworPHA+PGI+bG9uZyB0b3lzLm9wdGZsYWdzPC9iPjwvcD4KKworPHA+RWFjaCBvcHRpb24gaW4gdGhlIG9wdGZsYWdzIHN0cmluZyBjb3JyZXNwb25kcyB0byBhIGJpdCBwb3NpdGlvbiBpbgordG95cy5vcHRmbGFncywgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyBhIGNvcnJlc3BvbmRpbmcgYmluYXJ5IGRpZ2l0LiAgVGhlCityaWdodG1vc3QgYXJndW1lbnQgaXMgKDE8PDApLCB0aGUgbmV4dCB0byBsYXN0IGlzICgxPDwxKSBhbmQgc28gb24uICBJZgordGhlIG9wdGlvbiBpc24ndCBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGFyZ3ZbXSwgaXRzIGJpdCByZW1haW5zIDAuPC9wPgorCis8cD5FYWNoIG9wdGlvbiAteCBoYXMgYSBGTEFHX3ggbWFjcm8gZm9yIHRoZSBjb21tYW5kIGxldHRlci4gQmFyZSAtLWxvbmdvcHRzCit3aXRoIG5vIGNvcnJlc3BvbmRpbmcgc2hvcnQgb3B0aW9uIGhhdmUgYSBGTEFHX2xvbmdvcHQgbWFjcm8gZm9yIHRoZSBsb25nCitvcHRpb25uYW1lLiBDb21tYW5kcyBlbmFibGUgdGhlc2UgbWFjcm9zIGJ5ICNkZWZpbmluZyBGT1JfY29tbWFuZG5hbWUgYmVmb3JlCisjaW5jbHVkaW5nIDx0b3lzLmg+LiBXaGVuIG11bHRpcGxlIGNvbW1hbmRzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgc2FtZQorc291cmNlIGZpbGUsIHlvdSBjYW4gc3dpdGNoIGZsYWcgY29udGV4dHMgbGF0ZXIgaW4gdGhlIGZpbGUgYnkKKyNkZWZpbmluZyBDTEVBTlVQX29sZGNvbW1hbmQgYW5kICNkZWZpbmluZyBGT1JfbmV3Y29tbWFuZCwgdGhlbgorI2luY2x1ZGluZyA8Z2VuZXJhdGVkL2ZsYWdzLmg+LjwvcD4KKworPHA+T3B0aW9ucyBkaXNhYmxlZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uICh3cmFwcGVkIGluCithIFVTRV9CTEFIKCkgbWFjcm8gZm9yIGEgQ09ORklHX0JMQUggdGhhdCdzIHN3aXRjaGVkIG9mZikgaGF2ZSB0aGVpcgorY29ycmVzcG9uZGluZyBGTEFHIG1hY3JvIHNldCB0byB6ZXJvLCBzbyBjb2RlIGNoZWNraW5nIHRoZW0gYWxhCitpZiAodG95cy5vcHRhcmdzICYgRkxBR194KSBnZXRzIG9wdGltaXplZCBvdXQgdmlhIGRlYWQgY29kZSBlbGltaW5hdGlvbi4KKyNkZWZpbmluZyBGT1JDRV9GTEFHUyB3aGVuIHN3aXRjaGluZyBmbGFnIGNvbnRleHQgZGlzYWJsZXMgdGhpcworYmVoYXZpb3I6IHRoZSBmbGFnIGlzIG5ldmVyIHplcm8gZXZlbiBpZiB0aGUgY29uZmlnIGlzIGRpc2FibGVkLiBUaGlzCithbGxvd3MgY29kZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBjb21tYW5kcyB0byB1c2UgdGhlIHNhbWUgZmxhZwordmFsdWVzLCBhcyBsb25nIGFzIHRoZSBjb21tb24gZmxhZ3MgbWF0Y2ggdXAgcmlnaHQgdG8gbGVmdCBpbiBib3RoIG9wdGlvbgorc3RyaW5ncy48L3A+CisKKzxwPkZvciBleGFtcGxlLAordGhlIG9wdGZsYWdzIHN0cmluZyAiYWJjZCIgd291bGQgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCAiLWMiIHRvIHNldAorb3B0ZmxhZ3MgdG8gMiwgIi1hIiB3b3VsZCBzZXQgb3B0ZmxhZ3MgdG8gOCwgIi1iZCIgd291bGQgc2V0IG9wdGZsYWdzIHRvCis2IChJLkUuIDR8MiksIGFuZCAiLWEgLWMiIHdvdWxkIHNldCBvcHRmbGFncyB0byAxMCAoMnw4KS4gVG8gY2hlY2sgaWYgLWMKK3dhcyBlbmNvdW50ZXJlZCwgY29kZSBjb3VsZCB0ZXN0OiBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfYykgcHJpbnRmKCJ5dXAiKTsKKyhTZWUgdGhlIHRveXMvZXhhbXBsZXMgZGlyZWN0b3J5IGZvciBtb3JlLik8L3A+CisKKzxwPk9ubHkgbGV0dGVycyBhcmUgcmVsZXZhbnQgdG8gb3B0ZmxhZ3MsIHB1bmN0dWF0aW9uIGlzIHNraXBwZWQ6IGluIHRoZQorc3RyaW5nICJhKmI6YyNkIiwgZD0xLCBjPTIsIGI9NCwgYT04LiBUaGUgcHVuY3R1YXRpb24gYWZ0ZXIgYSBsZXR0ZXIKK3VzdWFsbHkgaW5kaWNhdGUgdGhhdCB0aGUgb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50LjwvcD4KKworPHA+U2luY2UgdG95cy5vcHRmbGFncyBpcyBhbiB1bnNpZ25lZCBpbnQsIGl0IG9ubHkgc3RvcmVzIDMyIGJpdHMuIChXaGljaCBpcwordGhlIGFtb3VudCBhIGxvbmcgd291bGQgaGF2ZSBvbiAzMi1iaXQgcGxhdGZvcm1zIGFueXdheTsgNjQgYml0IGNvZGUgb24KKzMyIGJpdCBwbGF0Zm9ybXMgaXMgdG9vIGV4cGVuc2l2ZSB0byByZXF1aXJlIGluIGNvbW1vbiBjb2RlIHVzZWQgYnkgYWxtb3N0CithbGwgY29tbWFuZHMuKSBCaXQgcG9zaXRpb25zIGJleW9uZCB0aGUgMTw8MzEgYXJlbid0IHJlY29yZGVkLCBidXQKK3BhcnNpbmcgaGlnaGVyIG9wdGlvbnMgY2FuIHN0aWxsIHNldCBnbG9iYWwgdmFyaWFibGVzLjwvcD4KKworPHA+PGI+QXV0b21hdGljYWxseSBzZXR0aW5nIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBhcmd1bWVudHMgKHVuaW9uIHRoaXMpPC9iPjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIG1heSBiZSBhcHBlbmRlZCB0byBhbiBvcHRmbGFncworYXJndW1lbnQgbGV0dGVyLCBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdGFrZXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudDo8L3A+CisKKzx1bD4KKzxsaT48Yj46PC9iPiAtIHBsdXMgYSBzdHJpbmcgYXJndW1lbnQsIGtlZXAgbW9zdCByZWNlbnQgaWYgbW9yZSB0aGFuIG9uZS48L2xpPgorPGxpPjxiPio8L2I+IC0gcGx1cyBhIHN0cmluZyBhcmd1bWVudCwgYXBwZW5kZWQgdG8gYSBsaW5rZWQgbGlzdC48L2xpPgorPGxpPjxiPkA8L2I+IC0gcGx1cyBhbiBvY2N1cnJlbmNlIGNvdW50ZXIgKHN0b3JlZCBpbiBhIGxvbmcpPC9saT4KKzxsaT48Yj4jPC9iPiAtIHBsdXMgYSBzaWduZWQgbG9uZyBhcmd1bWVudC4KKzxsaT48Yj4tPC9iPiAtIHBsdXMgYSBzaWduZWQgbG9uZyBhcmd1bWVudCBkZWZhdWx0aW5nIHRvIG5lZ2F0aXZlIChzdGFydCBhcmd1bWVudCB3aXRoICsgdG8gZm9yY2UgYSBwb3NpdGl2ZSB2YWx1ZSkuPC9saT4KKzxsaT48Yj4uPC9iPiAtIHBsdXMgYSBmbG9hdGluZyBwb2ludCBhcmd1bWVudCAoaWYgQ0ZHX1RPWUJPWF9GTE9BVCkuPC9saT4KKzx1bD5UaGUgZm9sbG93aW5nIGNhbiBiZSBhcHBlbmRlZCB0byBhIGZsb2F0IG9yIGRvdWJsZToKKzxsaT48Yj4mbHQ7MTIzPC9iPiAtIGVycm9yIGlmIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGlzPC9saT4KKzxsaT48Yj4mZ3Q7MTIzPC9iPiAtIGVycm9yIGlmIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGlzPC9saT4KKzxsaT48Yj49MTIzPC9iPiAtIGRlZmF1bHQgdmFsdWUgaWYgYXJndW1lbnQgbm90IHN1cHBsaWVkPC9saT4KKzwvdWw+Cis8L3VsPgorCis8cD48Yj5HTE9CQUxTPC9iPjwvcD4KKworPHA+T3B0aW9ucyB3aGljaCBoYXZlIGFuIGFyZ3VtZW50IGZpbGwgaW4gdGhlIGNvcnJlc3BvbmRpbmcgc2xvdCBpbiB0aGUgZ2xvYmFsCit1bmlvbiAidGhpcyIgKHNlZSBnZW5lcmF0ZWQvZ2xvYmFscy5oKSwgdHJlYXRpbmcgaXQgYXMgYW4gYXJyYXkgb2YgbG9uZ3MKK3dpdGggdGhlIHJpZ2h0bW9zdCBzYXZlZCBpbiB0aGlzWzBdLiAgQXMgZGVzY3JpYmVkIGFib3ZlLCB1c2luZyAiYSpiOmMjZCIsCisiLWMgNDIiIHdvdWxkIHNldCB0aGlzWzBdID0gNDI7IGFuZCAiLWIgNDIiIHdvdWxkIHNldCB0aGlzWzFdID0gIjQyIjsgZWFjaAorc2xvdCBpcyBsZWZ0IE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgaXMgbm90IGVuY291bnRlcmVkLjwvcD4KKworPHA+VGhpcyBiZWhhdmlvciBpcyB1c2VmdWwgYmVjYXVzZSB0aGUgTFA2NCBzdGFuZGFyZCBlbnN1cmVzIGxvbmcgYW5kIHBvaW50ZXIKK2FyZSB0aGUgc2FtZSBzaXplLiBDOTkgZ3VhcmFudGVlcyBzdHJ1Y3R1cmUgbWVtYmVycyB3aWxsIG9jY3VyIGluIG1lbW9yeQoraW4gdGhlIHNhbWUgb3JkZXIgdGhleSdyZSBkZWNsYXJlZCwgYW5kIHRoYXQgcGFkZGluZyB3b24ndCBiZSBpbnNlcnRlZCBiZXR3ZWVuCitjb25zZWN1dGl2ZSB2YXJpYWJsZXMgb2YgcmVnaXN0ZXIgc2l6ZS4gIFRodXMgdGhlIGZpcnN0IGZldyBlbnRyaWVzIGNhbgorYmUgbG9uZ3Mgb3IgcG9pbnRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2F2ZWQgYXJndW1lbnRzLjwvcD4KKworPHA+U2VlIHRveXMvZXhhbXBsZS8qLmMgZm9yIGxvbmdlciBleGFtcGxlcyBvZiBwYXJzaW5nIG9wdGlvbnMgaW50byB0aGUKK0dMT0JBTFMgYmxvY2suPC9wPgorCis8cD48Yj5jaGFyICp0b3lzLm9wdGFyZ3NbXTwvYj48L3A+CisKKzxwPkNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gYXJndltdIHdoaWNoIGFyZSBub3QgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcKKyhJLkUuIG5vdCByZWNvZ25pemVkIGVpdGhlciBhcyAtZmxhZ3Mgb3IgYXJndW1lbnRzIHRvIC1mbGFncykgd2lsbCBiZSBjb3BpZWQKK3RvIHRveXMub3B0YXJnc1tdLCB3aXRoIHRoZSBsZW5ndGggb2YgdGhhdCBhcnJheSBpbiB0b3lzLm9wdGMuCisoV2hlbiB0b3lzLm9wdGMgaXMgMCwgbm8gdW5yZWNvZ25pemVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgcmVtYWluLikKK1RoZSBvcmRlciBvZiBlbnRyaWVzIGlzIHByZXNlcnZlZCwgYW5kIGFzIHdpdGggYXJndltdIHRoaXMgbmV3IGFycmF5IGlzIGFsc28KK3Rlcm1pbmF0ZWQgYnkgYSBOVUxMIGVudHJ5LjwvcD4KKworPHA+T3B0aW9uIHBhcnNpbmcgY2FuIHJlcXVpcmUgYSBtaW5pbXVtIG9yIG1heGltdW0gbnVtYmVyIG9mIG9wdGFyZ3MgbGVmdAorb3ZlciwgYnkgYWRkaW5nICI8MSIgKHJlYWQgImF0IGxlYXN0IG9uZSIpIG9yICI+OSIgKCJhdCBtb3N0IG5pbmUiKSB0byB0aGUKK3N0YXJ0IG9mIHRoZSBvcHRmbGFncyBzdHJpbmcuPC9wPgorCis8cD5UaGUgc3BlY2lhbCBhcmd1bWVudCAiLS0iIHRlcm1pbmF0ZXMgb3B0aW9uIHBhcnNpbmcsIHN0b3JpbmcgYWxsIHJlbWFpbmluZworYXJndW1lbnRzIGluIG9wdGFyZ3MuICBUaGUgIi0tIiBpdHNlbGYgaXMgY29uc3VtZWQuPC9wPgorCis8cD48Yj5PdGhlciBvcHRmbGFncyBjb250cm9sIGNoYXJhY3RlcnM8L2I+PC9wPgorCis8cD5UaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgbWF5IG9jY3VyIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNvbW1hbmQncworb3B0ZmxhZ3Mgc3RyaW5nLCBiZWZvcmUgYW55IG9wdGlvbnMgdGhhdCB3b3VsZCBzZXQgYSBiaXQgaW4gdG95cy5vcHRmbGFnczo8L3A+CisKKzx1bD4KKzxsaT48Yj5ePC9iPiAtIHN0b3AgYXQgZmlyc3Qgbm9ub3B0aW9uIGFyZ3VtZW50IChmb3IgbmljZSwgeGFyZ3MuLi4pPC9saT4KKzxsaT48Yj4/PC9iPiAtIGFsbG93IHVua25vd24gYXJndW1lbnRzIChwYXNzIG5vbi1vcHRpb24gYXJndW1lbnRzIHN0YXJ0aW5nCit3aXRoIC0gdGhyb3VnaCB0byBvcHRhcmdzIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0KS48L2xpPgorPGxpPjxiPiZhbXA7PC9iPiAtIHRoZSBmaXJzdCBhcmd1bWVudCBoYXMgaW1hZ2luYXJ5IGRhc2ggKGFsYSB0YXIvcHMuICBJZiBnaXZlbiB0d2ljZSwgYWxsIGFyZ3VtZW50cyBoYXZlIGltYWdpbmFyeSBkYXNoLik8L2xpPgorPGxpPjxiPiZsdDs8L2I+IC0gbXVzdCBiZSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgZGlnaXQgaW5kaWNhdGluZyBhdCBsZWFzdCB0aGlzIG1hbnkgbGVmdG92ZXIgYXJndW1lbnRzIGFyZSBuZWVkZWQgaW4gb3B0YXJncyAoZGVmYXVsdCAwKTwvbGk+Cis8bGk+PGI+Jmd0OzwvYj4gLSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGVjaW1hbCBkaWdpdCBpbmRpY2F0aW5nIGF0IG1vc3QgdGhpcyBtYW55IGxlZnRvdmVyIGFyZ3VtZW50cyBhbGxvd2VkIChkZWZhdWx0IE1BWF9JTlQpPC9saT4KKzwvdWw+CisKKzxwPlRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBtYXkgYmUgYXBwZW5kZWQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciwgYnV0IGRvCitub3QgYnkgdGhlbXNlbHZlcyBpbmRpY2F0ZSBhbiBleHRyYSBhcmd1bWVudCBzaG91bGQgYmUgc2F2ZWQgaW4gdGhpc1tdLgorKFRlY2huaWNhbGx5IGFueSBjaGFyYWN0ZXIgbm90IHJlY29nbml6ZWQgYXMgYSBjb250cm9sIGNoYXJhY3RlciBzZXRzIGFuCitvcHRmbGFnLCBidXQgbGV0dGVycyBhcmUgbmV2ZXIgY29udHJvbCBjaGFyYWN0ZXJzLik8L3A+CisKKzx1bD4KKzxsaT48Yj5ePC9iPiAtIHN0b3AgcGFyc2luZyBvcHRpb25zIGFmdGVyIGVuY291bnRlcmluZyB0aGlzIG9wdGlvbiwgZXZlcnl0aGluZyBlbHNlIGdvZXMgaW50byBvcHRhcmdzLjwvbGk+Cis8bGk+PGI+fDwvYj4gLSB0aGlzIG9wdGlvbiBpcyByZXF1aXJlZC4gIElmIG1vcmUgdGhhbiBvbmUgbWFya2VkLCBvbmx5IG9uZSBpcyByZXF1aXJlZC48L2xpPgorPC91bD4KKworPHA+VGhlIGZvbGxvd2luZyBtYXkgYmUgYXBwZW5kZWQgdG8gYSBmbG9hdCBvciBkb3VibGU6PC9wPgorCis8dWw+Cis8bGk+PGI+Jmx0OzEyMzwvYj4gLSBlcnJvciBpZiBhcmd1bWVudCBpcyBsZXNzIHRoYW4gdGhpczwvbGk+Cis8bGk+PGI+Jmd0OzEyMzwvYj4gLSBlcnJvciBpZiBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gdGhpczwvbGk+Cis8bGk+PGI+PTEyMzwvYj4gLSBkZWZhdWx0IHZhbHVlIGlmIGFyZ3VtZW50IG5vdCBzdXBwbGllZDwvbGk+Cis8L3VsPgorCis8cD5PcHRpb24gcGFyc2luZyBvbmx5IHVuZGVyc3RhbmRzIDw+PSBhZnRlciAuIHdoZW4gQ0ZHX1RPWUJPWF9GTE9BVAoraXMgZW5hYmxlZC4gKE90aGVyd2lzZSB0aGUgY29kZSB0byBkZXRlcm1pbmUgd2hlcmUgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCitlbmQgZHJvcHMgb3V0LiAgV2hlbiBkaXNhYmxlZCwgaXQgY2FuIHJlc2VydmUgYSBnbG9iYWwgZGF0YSBzbG90IGZvciB0aGUKK2FyZ3VtZW50IHNvIG9mZnNldHMgd29uJ3QgY2hhbmdlLCBidXQgd2lsbCBuZXZlciBmaWxsIGl0IG91dC4pIFlvdSBjYW4gaGFuZGxlCit0aGlzIGJ5IHVzaW5nIHRoZSBVU0VfQkxBSCgpIG1hY3JvcyB3aXRoIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24sIGFsYTo8L3A+CisKKzxibG9ja3F1b3RlPiJhYmMuIiBVU0VfVE9ZQk9YX0ZMT0FUKCI8MS4yMz40LjU2PTcuODkiKSAiZGVmIjwvYmxvY2txdW90ZT4KKworPHA+PGI+LS1sb25nb3B0czwvYj48L3A+CisKKzxwPlRoZSBvcHRmbGFncyBzdHJpbmcgY2FuIGNvbnRhaW4gbG9uZyBvcHRpb25zLCB3aGljaCBhcmUgZW5jbG9zZWQgaW4KK3BhcmVudGhlc2VzLiBUaGV5IG1heSBiZSBhcHBlbmRlZCB0byBhbiBleGlzdGluZyBvcHRpb24gY2hhcmFjdGVyLCBpbgord2hpY2ggY2FzZSB0aGUgLS1sb25nb3B0IGlzIGEgc3lub255bSBmb3IgdGhhdCBvcHRpb24sIGFsYSAiYTooLS1mcmVkKSIKK3doaWNoIHVuZGVyc3RhbmRzICItYSBibGFoIiBvciAiLS1mcmVkIGJsYWgiIGFzIHN5bm9ueW1zLjwvcD4KKworPHA+TG9uZ29wdHMgbWF5IGFsc28gYXBwZWFyIGJlZm9yZSBhbnkgb3RoZXIgb3B0aW9ucyBpbiB0aGUgb3B0ZmxhZ3Mgc3RyaW5nLAoraW4gd2hpY2ggY2FzZSB0aGV5IGhhdmUgbm8gY29ycmVzcG9uZGluZyBzaG9ydCBhcmd1bWVudCwgYnV0IGluc3RlYWQgc2V0Cit0aGVpciBvd24gYml0IGJhc2VkIG9uIHBvc2l0aW9uLiBTbyBmb3IgIih3YWxydXMpIyhibGFoKXh5OnoiLCAiY29tbWFuZAorLS13YWxydXMgNDIiIHdvdWxkIHNldCB0b3lzLm9wdGZsYWdzID0gMTYgKC16ID0gMSwgLXkgPSAyLCAteCA9IDQsIC0tYmxhaCA9IDgpCithbmQgd291bGQgYXNzaWduIHRoaXNbMV0gPSA0Mjs8L3A+CisKKzxwPkEgc2hvcnQgb3B0aW9uIG1heSBoYXZlIG11bHRpcGxlIGxvbmdvcHQgc3lub255bXMsICJhKG9uZSkodHdvKSIsIGJ1dAorZWFjaCAiYmFyZSBsb25nb3B0IiAoYWxhICIob25lKSh0d28pYWJjIiBiZWZvcmUgYW55IG9wdGlvbiBjaGFyYWN0ZXJzKQorYWx3YXlzIHNldHMgaXRzIG93biBiaXQgKGFsdGhvdWdoIHlvdSBjYW4gZ3JvdXAgdGhlbSB3aXRoICtYKS48L3A+CisKKzxwPk9ubHkgYmFyZSBsb25nb3B0cyBoYXZlIGEgRkxBR18gbWFjcm8gd2l0aCB0aGUgbG9uZ29wdCBuYW1lCisoYWxhIC0tZnJlZCB3b3VsZCAjZGVmaW5lIEZMQUdfZnJlZCkuIE90aGVyIGxvbmdvcHRzIHVzZSB0aGUgc2hvcnQKK29wdGlvbidzIEZMQUcgbWFjcm8gdG8gdGVzdCB0aGUgdG95cy5vcHRmbGFncyBiaXQuPC9wPgorCis8cD5PcHRpb25zIHdpdGggYSBzZW1pY29sb24gIjsiIGFmdGVyIHRoZWlyIGRhdGEgdHlwZSBjYW4gb25seSBzZXQgdGhlaXIKK2NvcnJlc3BvbmRpbmcgR0xPQkFMUygpIGVudHJ5IHZpYSAiLS1sb25nb3B0PXZhbHVlIi4gRm9yIGV4YW1wbGUsIG9wdGlvbgorc3RyaW5nICJ4KGJvaW5nKTogeSIgd291bGQgc2V0IFRULnggaWYgaXQgc2F3ICItLWJvaW5nPXZhbHVlIiwgYnV0IHdvdWxkCit0cmVhdCAiLS1ib2luZyB2YWx1ZSIgYXMgc2V0dGluZyBGTEFHX3ggaW4gdG95cy5vcHRhcmdzLCBsZWF2aW5nIFRULnggTlVMTCwKK2FuZCBrZWVwaW5nICJ2YWx1ZSIgaW4gdG95cy5vcHRhcmdzW10uIChUaGlzIGxldHMgImxzIC0tY29sb3IiIGFuZAorImxzIC0tY29sb3I9YXV0byIgYm90aCB3b3JrLik8L3A+CisKKzxwPjxiPltncm91cHNdPC9iPjwvcD4KKworPHA+QXQgdGhlIGVuZCBvZiB0aGUgb3B0aW9uIHN0cmluZywgc3F1YXJlIGJyYWNrZXQgZ3JvdXBzIGNhbiBkZWZpbmUKK3JlbGF0aW9uc2hpcHMgYmV0d2VlbiBleGlzdGluZyBvcHRpb25zLiAoVGhpcyBvbmx5IGFwcGxpZXMgdG8gc2hvcnQKK29wdGlvbnMsIGJhcmUgLS1sb25nb3B0cyBjYW4ndCBwYXJ0aWNpcGF0ZS4pPC9wPgorCis8cD5UaGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBncm91cCBkZWZpbmVzIHRoZSB0eXBlLCB0aGUgcmVtYWluaW5nCitjaGFyYWN0ZXJzIGFyZSBvcHRpb25zIGl0IGFwcGxpZXMgdG86PC9wPgorCis8dWw+Cis8bGk+PGI+LTwvYj4gLSBFeGNsdXNpdmUsIHN3aXRjaCBvZmYgYWxsIG90aGVycyBpbiB0aGlzIGdyb3VwLjwvbGk+Cis8bGk+PGI+KzwvYj4gLSBJbmNsdXNpdmUsIHN3aXRjaCBvbiBhbGwgb3RoZXJzIGluIHRoaXMgZ3JvdXAuPC9saT4KKzxsaT48Yj4hPC9iPiAtIEVycm9yLCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUgZGVmaW5lZC48L2xpPgorPC91bD4KKworPHA+U28gImFiY1stYWJjXSIgbWVhbnMgLWFiID0gLWIsIC1iYSA9IC1hLCAtYWJjID0gLWMuICJhYmNbK2FiY10iCittZWFucyAtYWI9LWFiYywgLWM9LWFiYywgYW5kICJhYmNbIWFiY10gbWVhbnMgLWFiIGNhbGxzIGVycm9yX2V4aXQoIm5vIC1iCit3aXRoIC1hIikuIE5vdGUgdGhhdCBbLV0gZ3JvdXBzIGNsZWFyIHRoZSBHTE9CQUxTIG9wdGlvbiBzbG90IG9mCitvcHRpb25zIHRoZXkncmUgc3dpdGNoaW5nIGJhY2sgb2ZmLCBidXQgWytdIHdvbid0IHNldCBvcHRpb25zIGl0IGRpZG4ndCBzZWUKKyhqdXN0IHRoZSBvcHRmbGFncykuPC9wPgorCis8cD48Yj53aGl0ZXNwYWNlPC9iPjwvcD4KKworPHA+QXJndW1lbnRzIG1heSBvY2N1ciB3aXRoIG9yIHdpdGhvdXQgYSBzcGFjZSAoSS5FLiAiLWEgNDIiIG9yICItYTQyIikuCitUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50ICItYWJjIiBtYXkgYmUgaW50ZXJlcHJldGVkIG1hbnkgZGlmZmVyZW50IHdheXM6Cit0aGUgb3B0ZmxhZ3Mgc3RyaW5nICJjYmEiIHNldHMgdG95cy5vcHRmbGFncyA9IDcsICJjOmJhIiBzZXRzIHRveXMub3B0ZmxhZ3M9NAorYW5kIHNhdmVzICJiYSIgYXMgdGhlIGFyZ3VtZW50IHRvIC1jLCBhbmQgImNiOmEiIHNldHMgb3B0ZmxhZ3MgdG8gNiBhbmQgc2F2ZXMKKyJjIiBhcyB0aGUgYXJndW1lbnQgdG8gLWIuPC9wPgorCis8cD5Ob3RlIHRoYXQgJmFtcDsgY2hhbmdlcyB3aGl0ZXNwYWNlIGhhbmRsaW5nLCBzbyB0aGF0IHRoZSBjb21tYW5kIGxpbmUKKyJ0YXIgY3ZmQ2ogb3V0ZmlsZS50YXIuYnoyIHRvcGRpciBmaWxlbmFtZSIgaXMgcGFyc2VkIHRoZSBzYW1lIGFzCisidGFyIGZpbGVuYW1lIC1jIC12IC1qIC1mIG91dGZpbGUudGFyLmJ6MiAtQyB0b3BkaXIiLiBOb3RlIHRoYXQgInRhciAtY3ZmQ2oKK29uZSB0d28gdGhyZWUiIHdvdWxkIGVxdWFsICJ0YXIgLWMgLXYgLWYgQ2ogb25lIHR3byB0aHJlZSIuIChUaGlzIG1hdGNoZXMKK2hpc3RvcmljYWwgdXNhZ2UuKTwvcD4KKworPHA+QXBwZW5kaW5nIGEgc3BhY2UgdG8gdGhlIG9wdGlvbiBpbiB0aGUgb3B0aW9uIHN0cmluZyAoImE6IGIiKSBtYWtlcyBpdAorcmVxdWlyZSBhIHNwYWNlLCBJLkUuICItYWIiIGlzIGludGVycHJldGVkIGFzICItYSIgIi1iIi4gVGhhdCB3YXkgImtpbGwgLXN0b3AiCitkaWZmZXJzIGZyb20gImtpbGwgLXMgdG9wIi48L3A+CisKKzxwPkFwcGVuZGluZyA7IHRvIGEgbG9uZ29wdCBpbiB0aGUgb3B0aW9uIHN0cmluZyBtYWtlcyBpdHMgYXJndW1lbnQgb3B0aW9uYWwsCithbmQgb25seSBzZXR0YWJsZSB3aXRoID0sIHNvIGluIGxzICIoY29sb3IpOjsiIGNhbiBhY2NlcHQgImxzIC0tY29sb3IiIGFuZAorImxzIC0tY29sb3I9YXV0byIgd2l0aG91dCBjb21wbGFpbmluZyB0aGF0IHRoZSBmaXJzdCBoYXMgbm8gYXJndW1lbnQuPC9wPgorCis8YSBuYW1lPSJsaWJfZGlydHJlZSI+PGgzPmxpYi9kaXJ0cmVlLmM8L2gzPgorCis8cD5UaGUgZGlyZWN0b3J5IHRyZWUgdHJhdmVyc2FsIGNvZGUgc2hvdWxkIGJlIHN1ZmZpY2llbnRseSBnZW5lcmljCit0aGF0IGNvbW1hbmRzIG5ldmVyIG5lZWQgdG8gdXNlIHJlYWRkaXIoKSwgc2NhbmRpcigpLCBvciB0aGUgZnRzLmggZmFtaWx5CitvZiBmdW5jdGlvbnMuPC9wPgorCis8cD5UaGVzZSBmdW5jdGlvbnMgZG8gbm90IGNhbGwgY2hkaXIoKSBvciByZWx5IG9uIFBBVEhfTUFYLiBJbnN0ZWFkIHRoZXkKK3VzZSBvcGVuYXQoKSBhbmQgZnJpZW5kcywgdXNpbmcgb25lIGZpbGVoYW5kbGUgcGVyIGRpcmVjdG9yeSBsZXZlbCB0bworcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzLiAoSS5FLiB0aGV5IGNhbiBkZXNjZW5kIDEwMDAgZGlyZWN0b3JpZXMgZGVlcAoraWYgc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUpIGFsbG93cyBlbm91Z2ggb3BlbiBmaWxlaGFuZGxlcywgYW5kIHRoZSBkZWZhdWx0CitpbiAvcHJvYy9zZWxmL2xpbWl0cyBpcyBnZW5lcmFsbHkgMTAyNC4pPC9wPgorCis8cD5UaGVyZSBhcmUgdHdvIG1haW4gd2F5cyB0byB1c2UgZGlydHJlZTogMSkgYXNzZW1ibGUgYSB0cmVlIG9mIG5vZGVzCityZXByZXNlbnRpbmcgYSBzbmFwc2hvdCBvZiBkaXJlY3Rvcnkgc3RhdGUgYW5kIHRyYXZlcnNlIHRoZW0gdXNpbmcgdGhlCistPm5leHQgYW5kIC0+Y2hpbGQgcG9pbnRlcnMsIG9yIDIpIHRyYXZlcnNlIHRoZSB0cmVlIGNhbGxpbmcgYSBjYWxsYmFjaworZnVuY3Rpb24gb24gZWFjaCBlbnRyeSwgYW5kIGZyZWVpbmcgaXRzIG5vZGUgYWZ0ZXJ3YXJkcy4gKFlvdSBjYW4gYWxzbworY29tYmluZSB0aGUgdHdvLCB1c2luZyB0aGUgY2FsbGJhY2sgYXMgYSBmaWx0ZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG5vZGVzCit0byBrZWVwLik8L3A+CisKKzxwPlRoZSBiYXNpYyBkaXJ0cmVlIGZ1bmN0aW9ucyBhcmU6PC9wPgorCis8dWw+Cis8bGk+PHA+PGI+c3RydWN0IGRpcnRyZWUgKmRpcnRyZWVfcmVhZChjaGFyICpwYXRoLCBpbnQgKCpjYWxsYmFjaykoc3RydWN0CitkaXJ0cmVlIG5vZGUpKTwvYj4gLSByZWN1cnNpdmVseSByZWFkIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgY2FsbGluZworY2FsbGJhY2soKSBvbiBlYWNoLCBhbmQgcmV0dXJuaW5nIGEgdHJlZSBvZiBzYXZlZCBub2RlcyAoaWYgYW55KS4KK0lmIHBhdGggZG9lc24ndCBleGlzdCwgcmV0dXJucyBESVJUUkVFX0FCT1JUVkFMLiBJZiBjYWxsYmFjayBpcyBOVUxMLAorcmV0dXJucyBhIHNpbmdsZSBub2RlIGF0IHRoYXQgcGF0aC48L3A+CisKKzxsaT48cD48Yj5kaXJ0cmVlX25vdGRvdGRvdChzdHJ1Y3QgZGlydHJlZSAqbmV3KTwvYj4gLSBzdGFuZGFyZCBjYWxsYmFjaword2hpY2ggZGlzY2FyZHMgIi4iIGFuZCAiLi4iIGVudHJpZXMgYW5kIHJldHVybnMgRElSVFJFRV9TQVZFfERJUlRSRUVfUkVDVVJTRQorZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gVXNlZCBkaXJlY3RseSwgdGhpcyBhc3NlbWJsZXMgYSBzbmFwc2hvdCB0cmVlIG9mCit0aGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGl0cyBzdWJkaXJlY3RvcmllcwordG8gYmUgcHJvY2Vzc2VkIGFmdGVyIGRpcnRyZWVfcmVhZCgpIHJldHVybnMgKGJ5IHRyYXZlcnNpbmcgdGhlCitzdHJ1Y3QgZGlydHJlZSdzIC0+bmV4dCBhbmQgLT5jaGlsZCBwb2ludGVycyBmcm9tIHRoZSByZXR1cm5lZCByb290IG5vZGUpLjwvcD4KKworPGxpPjxwPjxiPmRpcnRyZWVfcGF0aChzdHJ1Y3QgZGlydHJlZSAqbm9kZSwgaW50ICpwbGVuKTwvYj4gLSBtYWxsb2MoKSBhCitzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCBmcm9tIHRoZSByb290IG9mIHRoaXMgdHJlZSB0byB0aGlzIG5vZGUuIElmCitwbGVuIGlzbid0IE5VTEwgdGhlbiAqcGxlbiBpcyBob3cgbWFueSBleHRyYSBieXRlcyB0byBtYWxsb2MgYXQgdGhlIGVuZAorb2Ygc3RyaW5nLjwvcD48L2xpPgorCis8bGk+PHA+PGI+ZGlydHJlZV9wYXJlbnRmZChzdHJ1Y3QgZGlydHJlZSAqbm9kZSk8L2I+IC0gcmV0dXJuIGZkIG9mCitkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIG5vZGUsIGZvciB1c2Ugd2l0aCBvcGVuYXQoKSBhbmQgc3VjaC48L3A+PC9saT4KKzwvdWw+CisKKzxwPlRoZSA8Yj5kaXJ0cmVlX3JlYWQoKTwvYj4gZnVuY3Rpb24gaXMgdGhlIHN0YW5kYXJkIHdheSB0byBzdGFydAorZGlyZWN0b3J5IHRyYXZlcnNhbC4gSXQgdGFrZXMgdHdvIGFyZ3VtZW50czogYSBzdGFydGluZyBwYXRoIGZvcgordGhlIHJvb3Qgb2YgdGhlIHRyZWUsIGFuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGUgY2FsbGJhY2soKSBpcyBjYWxsZWQKK29uIGVhY2ggZGlyZWN0b3J5IGVudHJ5LCBpdHMgYXJndW1lbnQgaXMgYSBmdWxseSBwb3B1bGF0ZWQKKzxiPnN0cnVjdCBkaXJ0cmVlICo8L2I+IChmcm9tIGxpYi9saWIuaCkgZGVzY3JpYmluZyB0aGUgbm9kZSwgYW5kIGl0cworcmV0dXJuIHZhbHVlIHRlbGxzIHRoZSBkaXJ0cmVlIGluZnJhc3RydWN0dXJlIHdoYXQgdG8gZG8gbmV4dC48L3A+CisKKzxwPihUaGVyZSdzIGFsc28gYSB0aHJlZSBhcmd1bWVudCB2ZXJzaW9uLAorPGI+ZGlydHJlZV9mbGFncmVhZChjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QKK2RpcnRyZWUgbm9kZSkpPC9iPiwgd2hpY2ggbGV0cyB5b3UgYXBwbHkgZmxhZ3MgbGlrZSBESVJUUkVFX1NZTUZPTExPVyBhbmQKK0RJUlRSRUVfU0hVVFVQIHRvIHJlYWRpbmcgdGhlIHRvcCBub2RlLCBidXQgdGhpcyBvbmx5IGFmZmVjdHMgdGhlIHRvcCBub2RlLgorQ2hpbGQgbm9kZXMgdXNlIHRoZSBmbGFncyByZXR1cm5lZCBieSBjYWxsYmFjaygpLjwvcD4KKworPHA+PGI+c3RydWN0IGRpcnRyZWU8L2I+PC9wPgorCis8cD5FYWNoIHN0cnVjdCBkaXJ0cmVlIG5vZGUgY29udGFpbnMgPGI+Y2hhciBuYW1lW108L2I+IGFuZCA8Yj5zdHJ1Y3Qgc3RhdAorc3Q8L2I+IGVudHJpZXMgZGVzY3JpYmluZyBhIGZpbGUsIHBsdXMgYSA8Yj5jaGFyICpzeW1saW5rPC9iPgord2hpY2ggaXMgTlVMTCBmb3Igbm9uLXN5bWxpbmtzLjwvcD4KKworPHA+RHVyaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSA8Yj5pbnQgZGlyZmQ8L2I+IGZpZWxkIG9mIGRpcmVjdG9yeSBub2RlcworY29udGFpbnMgYSBkaXJlY3RvcnkgZmlsZSBkZXNjcmlwdG9yIChmb3IgdXNlIHdpdGggdGhlIG9wZW5hdCgpIGZhbWlseSBvZgorZnVuY3Rpb25zKS4gVGhpcyBpc24ndCB1c3VhbGx5IHVzZWQgZGlyZWN0bHksIGludHN0ZWFkIGNhbGwgZGlydHJlZV9wYXJlbnRmZCgpCitvbiB0aGUgY2FsbGJhY2sncyBub2RlIGFyZ3VtZW50LiBUaGUgPGI+Y2hhciBhZ2FpbjwvYT4gZmllbGQgaXMgMCBmb3IgdGhlCitmaXJzdCBjYWxsYmFjayBvbiBhIG5vZGUsIGFuZCAxIG9uIHRoZSBzZWNvbmQgY2FsbGJhY2sgKHRyaWdnZXJlZCBieSByZXR1cm5pbmcKK0RJUlRSRUVfQ09NRUFHQUlOIG9uIGEgZGlyZWN0b3J5LCBtYWRlIGFmdGVyIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gcHJvY2Vzc2VkKS4KKzwvcD4KKworPHA+VXNlcnMgb2YgdGhpcyBjb2RlIG1heSBwdXQgYW55dGhpbmcgdGhleSBsaWtlIGludG8gdGhlIDxiPmxvbmcgZXh0cmE8L2I+CitmaWVsZC4gRm9yIGV4YW1wbGUsICJjcCIgYW5kICJtdiIgdXNlIHRoaXMgdG8gc3RvcmUgYSBkaXJmZCBmb3IgdGhlIGRlc3RpbmF0aW9uCitkaXJlY3RvcnkgKGFuZCB1c2UgRElSVFJFRV9DT01FQUdBSU4gdG8gZ2V0IHRoZSBzZWNvbmQgY2FsbGJhY2sgc28gdGhleSBjYW4KK2Nsb3NlKG5vZGUtPmV4dHJhKSB0byBhdm9pZCBydW5uaW5nIG91dCBvZiBmaWxlaGFuZGxlcykuCitUaGlzIGZpZWxkIGlzIG5vdCBkaXJlY3RseSB1c2VkIGJ5IHRoZSBkaXJ0cmVlIGNvZGUsIGFuZAordGhhbmtzIHRvIExQNjQgaXQncyBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgYSB0eXBlY2FzdCBwb2ludGVyIHRvIGFuCithcmJpdHJhcnkgc3RydWN0LjwvcD4KKworPHA+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgY29tYmluZXMgZmxhZ3MgKHdpdGggYm9vbGVhbiBvcikgdG8gdGVsbAordGhlIHRyYXZlcnNhbCBpbmZyYXN0cnVjdHVyZSBob3cgdG8gYmVoYXZlOjwvcD4KKworPHVsPgorPGxpPjxwPjxiPkRJUlRSRUVfU0FWRTwvYj4gLSBTYXZlIHRoaXMgbm9kZSwgYXNzZW1ibGluZyBhIHRyZWUuIChXaXRob3V0Cit0aGlzIHRoZSBzdHJ1Y3QgZGlydHJlZSBpcyBmcmVlZCBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucy4gRmlsdGVyaW5nIG91dAorc2libGluZ3MgaXMgZmluZSwgYnV0IGRpc2NhcmRpbmcgYSBwYXJlbnQgd2hpbGUga2VlcGluZyBpdHMgY2hpbGQgbGVha3MKK21lbW9yeS4pPC9wPjwvbGk+Cis8bGk+PHA+PGI+RElSVFJFRV9BQk9SVDwvYj4gLSBEbyBub3QgZXhhbWluZSBhbnkgbW9yZSBlbnRyaWVzIGluIHRoaXMKK2RpcmVjdG9yeS4gKERvZXMgbm90IHByb3BhZ2F0ZSB1cCB0cmVlOiB0byBhYm9ydCBlbnRpcmUgdHJhdmVyc2FsLAorcmV0dXJuIERJUlRSRUVfQUJPUlQgZnJvbSBwYXJlbnQgY2FsbGJhY2tzIHRvby4pPC9wPjwvbGk+Cis8bGk+PHA+PGI+RElSVFJFRV9SRUNVUlNFPC9iPiAtIEV4YW1pbmUgZGlyZWN0b3J5IGNvbnRlbnRzLiBJZ25vcmVkIGZvcgorbm9uLWRpcmVjdG9yeSBlbnRyaWVzLiBUaGUgcmVtYWluaW5nIGZsYWdzIG9ubHkgdGFrZSBlZmZlY3Qgd2hlbgorcmVjdXJzaW5nIGludG8gdGhlIGNoaWxkcmVuIG9mIGEgZGlyZWN0b3J5LjwvcD48L2xpPgorPGxpPjxwPjxiPkRJUlRSRUVfQ09NRUFHQUlOPC9iPiAtIENhbGwgdGhlIGNhbGxiYWNrIG9uIHRoaXMgbm9kZSBhIHNlY29uZCB0aW1lCithZnRlciBleGFtaW5pbmcgYWxsIGRpcmVjdG9yeSBjb250ZW50cywgYWxsb3dpbmcgZGVwdGgtZmlyc3QgdHJhdmVyc2FsLgorT24gdGhlIHNlY29uZCBjYWxsLCBkaXJ0cmVlLT5hZ2FpbiBpcyBub256ZXJvLjwvcD48L2xpPgorPGxpPjxwPjxiPkRJUlRSRUVfU1lNRk9MTE9XPC9iPiAtIGZvbGxvdyBzeW1saW5rcyB3aGVuIHBvcHVsYXRpbmcgY2hpbGRyZW4ncworPGI+c3RydWN0IHN0YXQgc3Q8L2I+IChieSBmZWVkaW5nIGEgbm9uemVybyB2YWx1ZSB0byB0aGUgc3ltZm9sbG93IGFyZ3VtZW50IG9mCitkaXJ0cmVlX2FkZF9ub2RlKCkpLCB3aGljaCBtZWFucyBESVJUUkVFX1JFQ1VSU0UgdHJlYXRzIHN5bWxpbmtzIHRvCitkaXJlY3RvcmllcyBhcyBkaXJlY3Rvcmllcy4gKEF2b2lkaW5nIGluZmluaXRlIHJlY3Vyc2lvbiBpcyB0aGUgY2FsbGJhY2sncworcHJvYmxlbTogdGhlIG5vbi1OVUxMIGRpcnRyZWUtPnN5bWxpbmsgY2FuIHN0aWxsIGRpc3Rpbmd1aXNoIGJldHdlZW4KK3RoZW0uIFRoZSAiZmluZCIgY29tbWFuZCBmb2xsb3dzIC0+cGFyZW50IHVwIHRoZSB0cmVlIHRvIHRoZSByb290IG5vZGUKK2VhY2ggdGltZSwgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoYXQgc3RhdCdzIGRldiBhbmQgaW5vZGUgcGFpciBkb24ndAorbWF0Y2ggYW55IGFuY2VzdG9ycy4pPC9wPjwvbGk+Cis8L3VsPgorCis8cD5FYWNoIHN0cnVjdCBkaXJ0cmVlIGNvbnRhaW5zIHRocmVlIHBvaW50ZXJzIChuZXh0LCBwYXJlbnQsIGFuZCBjaGlsZCkKK3RvIG90aGVyIHN0cnVjdCBkaXJ0cmVlLjwvcD4KKworPHA+VGhlIDxiPnBhcmVudDwvYj4gcG9pbnRlciBpbmRpY2F0ZXMgdGhlIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGlzIGVudHJ5OyBldmVuIHdoZW4gbm90IGFzc2VtYmxpbmcgYSBwZXJzaXN0ZW50IHRyZWUgb2YKK25vZGVzIHRoZSBwYXJlbnQgZW50cmllcyByZW1haW4gbGl2ZSB1cCB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSB3aGlsZQorY2hpbGQgbm9kZXMgYXJlIGFjdGl2ZS4gQXQgdGhlIHRvcCBvZiB0aGUgdHJlZSB0aGUgcGFyZW50IHBvaW50ZXIgaXMKK05VTEwsIG1lYW5pbmcgdGhlIG5vZGUncyBuYW1lW10gaXMgZWl0aGVyIGFuIGFic29sdXRlIHBhdGggb3IgcmVsYXRpdmUKK3RvIGN3ZC4gVGhlIGZ1bmN0aW9uIGRpcnRyZWVfcGFyZW50ZmQoKSBnZXRzIHRoZSBkaXJlY3RvcnkgZmlsZSBkZXNjcmlwdG9yCitmb3IgdXNlIHdpdGggb3BlbmF0KCkgYW5kIGZyaWVuZHMsIHJldHVybmluZyBBVF9GRENXRCBhdCB0aGUgdG9wIG9mIHRyZWUuPC9wPgorCis8cD5UaGUgPGI+Y2hpbGQ8L2I+IHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBsaXN0IG9mIGNvbnRlbnRzIG9mCit0aGlzIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBjb250YWlucyBubyBmaWxlcywgb3IgdGhlIGVudHJ5IGlzbid0CithIGRpcmVjdG9yeSwgY2hpbGQgaXMgTlVMTC48L3A+CisKKzxwPlRoZSA8Yj5uZXh0PC9iPiBwb2ludGVyIGluZGljYXRlcyBzaWJsaW5nIG5vZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzCitub2RlLCBhbmQgc2luY2UgaXQncyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHN0cnVjdCB0aGUgbGxpc3QuYyB0cmF2ZXJzYWwKK21lY2hhbmlzbXMgd29yayB0byBpdGVyYXRlIG92ZXIgc2libGluZyBub2Rlcy4gRWFjaCBkaXJ0cmVlIG5vZGUgaXMgYQorc2luZ2xlIG1hbGxvYygpIChldmVuIGNoYXIgKnN5bWxpbmsgcG9pbnRzIHRvIG1lbW9yeSBhdCB0aGUgZW5kIG9mIHRoZSBub2RlKSwKK3NvIGxsaXN0X2ZyZWUoKSB3b3JrcyBidXQgaXRzIGNhbGxiYWNrIG11c3QgZGVzY2VuZCBpbnRvIGNoaWxkIG5vZGVzIChmcmVlaW5nCithIHRyZWUsIG5vdCBqdXN0IGEgbGlua2VkIGxpc3QpLCBwbHVzIHdoYXRldmVyIHRoZSB1c2VyIHN0b3JlZCBpbiBleHRyYS48L3A+CisKKzxwPlRoZSA8Yj5kaXJ0cmVlX2ZsYWdyZWFkPC9iPigpIGZ1bmN0aW9uIGlzIGEgc2ltcGxlIHdyYXBwZXIsIGNhbGxpbmcgPGI+ZGlydHJlZV9hZGRfbm9kZTwvYj4oKQordG8gY3JlYXRlIGEgcm9vdCBub2RlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhlbiBjYWxsaW5nCis8Yj5kaXJ0cmVlX2hhbmRsZV9jYWxsYmFjazwvYj4oKSBvbiB0aGF0IG5vZGUgKHdoaWNoIHJlY3Vyc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIGNhbGxiYWNrCityZXR1cm4gZmxhZ3MpLiBUaGUgZmxhZ3MgYXJndW1lbnQgcHJpbWFyaWx5IGxldHMgeW91Citjb250cm9sIHdoZXRoZXIgb3Igbm90IHRvIGZvbGxvdyBzeW1saW5rcyB0byB0aGUgcm9vdCBub2RlOyBzeW1saW5rcworbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIG9mdGVuIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBzeW1saW5rcworZW5jb3VudGVyZWQgZHVyaW5nIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJhdmVyc2FsLgorCis8cD5UaGUgbHMgY29tbWFuZCBub3Qgb25seSBieXBhc3NlcyB0aGlzIHdyYXBwZXIsIGJ1dCBuZXZlciByZXR1cm5zCis8Yj5ESVJUUkVFX1JFQ1VSU0U8L2I+IGZyb20gdGhlIGNhbGxiYWNrLCBpbnN0ZWFkIGNhbGxpbmcgPGI+ZGlydHJlZV9yZWN1cnNlPC9iPigpIG1hbnVhbGx5Citmcm9tIGVsc2V3aGVyZSBpbiB0aGUgcHJvZ3JhbS4gVGhpcyBnaXZlcyBscyAtbFIgbWFudWFsIGNvbnRyb2wKK29mIHRyYXZlcnNhbCBvcmRlciwgd2hpY2ggaXMgbmVpdGhlciBkZXB0aCBmaXJzdCBub3IgYnJlYWR0aCBmaXJzdCBidXQKK2luc3RlYWQgYSBzb3J0IG9mIEZJRk8gb3JkZXIgcmVxdXJpZWQgYnkgdGhlIGxzIHN0YW5kYXJkLjwvcD4KKworPGEgbmFtZT0idG95cyI+Cis8aDE+PGEgaHJlZj0iI3RveXMiPkRpcmVjdG9yeSB0b3lzLzwvYT48L2gxPgorCis8cD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb21tYW5kIGltcGxlbWVudGF0aW9ucy4gRWFjaCBjb21tYW5kIGlzIGEgc2luZ2xlCitzZWxmLWNvbnRhaW5lZCBmaWxlLiBBZGRpbmcgYSBuZXcgY29tbWFuZCBpbnZvbHZlcyBhZGRpbmcgYSBzaW5nbGUKK2ZpbGUsIGFuZCByZW1vdmluZyBhIGNvbW1hbmQgaW52b2x2ZXMgcmVtb3ZpbmcgdGhhdCBmaWxlLiBDb21tYW5kcyB1c2UKK3NoYXJlZCBpbmZyYXN0cnVjdHVyZSBmcm9tIHRoZSBsaWIvIGFuZCBnZW5lcmF0ZWQvIGRpcmVjdG9yaWVzLjwvcD4KKworPHA+Q3VycmVudGx5IHRoZXJlIGFyZSBmaXZlIHN1YmRpcmVjdG9yaWVzIHVuZGVyICJ0b3lzLyIgY29udGFpbmluZyAicG9zaXgiCitjb21tYW5kcyBkZXNjcmliZWQgaW4gUE9TSVgtMjAwOCwgImxzYiIgY29tbWFuZHMgZGVzY3JpYmVkIGluIHRoZSBMaW51eAorU3RhbmRhcmQgQmFzZSA0LjEsICJvdGhlciIgY29tbWFuZHMgbm90IGRlc2NyaWJlZCBieSBlaXRoZXIgc3RhbmRhcmQsCisicGVuZGluZyIgY29tbWFuZHMgYXdhaXRpbmcgY2xlYW51cCAod2hpY2ggZGVmYXVsdCB0byAibiIgaW4gbWVudWNvbmZpZworYmVjYXVzZSB0aGV5IGRvbid0IG5lY2Vzc2FyaWx5IHdvcmsgcmlnaHQgeWV0KSwgYW5kICJleGFtcGxlIiBjb2RlIHNob3dpbmcKK2hvdyB0b3lib3ggaW5mcmFzdHJ1Y3R1cmUgd29ya3MgYW5kIHByb3ZpZGluZyB0ZW1wbGF0ZS9za2VsZXRvbiBmaWxlcyB0bworc3RhcnQgbmV3IGNvbW1hbmRzLjwvcD4KKworPHA+VGhlIG9ubHkgZGlmZmVyZW5jZSBkaXJlY3RvcnkgbG9jYXRpb24gbWFrZXMgaXMgd2hpY2ggbWVudSB0aGUgY29tbWFuZAorc2hvd3MgdXAgaW4gZHVyaW5nICJtYWtlIG1lbnVjb25maWciLCB0aGUgZGlyZWN0b3JpZXMgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuCitOb3RlIHRoYXQgdGhlIGNvbW1hbmRzIGV4aXN0IHdpdGhpbiBhIHNpbmdsZSBuYW1lc3BhY2UgYXQgcnVudGltZSwgc28geW91IGNhbid0CitoYXZlIHRoZSBzYW1lIGNvbW1hbmQgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMuIChUaGUgYnVpbGQgdHJpZXMgdG8gZmFpbAoraW5mb3JtYXRpdmVseSB3aGVuIHlvdSBkbyB0aGF0Lik8L3A+CisKKzxwPlRoZXJlIGlzIG9uZSBtb3JlIHN1Yi1tZW51cyBpbiAibWFrZSBtZW51Y29uZmlnIiBjb250YWluaW5nIGdsb2JhbAorY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0b3lib3guIFRoaXMgbWVudSBpcyBkZWZpbmVkIGluIHRoZSB0b3AgbGV2ZWwKK0NvbmZpZy5pbi48L3A+CisKKzxwPlNlZSA8YSBocmVmPSIjYWRkaW5nIj5hZGRpbmcgYSBuZXcgY29tbWFuZDwvYT4gZm9yIGRldGFpbHMgb24gdGhlCitsYXlvdXQgb2YgYSBjb21tYW5kIGZpbGUuPC9wPgorCis8aDI+RGlyZWN0b3J5IHNjcmlwdHMvPC9oMj4KKworPHA+QnVpbGQgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBtYWtlZmlsZSBjYWxscyBzY3JpcHRzL21ha2Uuc2ggZm9yICJtYWtlIgorYW5kIHNjcmlwdHMvaW5zdGFsbC5zaCBmb3IgIm1ha2UgaW5zdGFsbCIuPC9wPgorCis8cD5UaGVyZSdzIGFsc28gYSB0ZXN0IHN1aXRlLCAibWFrZSB0ZXN0IiBjYWxscyBtYWtlL3Rlc3Quc2gsIHdoaWNoIHJ1bnMgYWxsCit0aGUgdGVzdHMgaW4gbWFrZS90ZXN0LyouIFlvdSBjYW4gcnVuIGluZGl2aWR1YWwgdGVzdHMgdmlhCisic2NyaXB0cy90ZXN0LnNoIGNvbW1hbmQiLCBvciAiVEVTVF9IT1NUPTEgc2NyaXB0cy90ZXN0LnNoIGNvbW1hbmQiIHRvIHJ1bgordGhhdCB0ZXN0IGFnYWluc3QgdGhlIGhvc3QgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBvZiB0aGUgdG95Ym94IG9uZS48L3A+CisKKzxoMz5zY3JpcHRzL2NmZzJmaWxlcy5zaDwvaDM+CisKKzxwPlJ1biAuY29uZmlnIHRocm91Z2ggdGhpcyBmaWx0ZXIgdG8gZ2V0IGEgbGlzdCBvZiBlbmFibGVkIGNvbW1hbmRzLCB3aGljaAoraXMgdHVybmVkIGludG8gYSBsaXN0IG9mIGZpbGVzIGluIHRveXMgdmlhIGEgc2VkIGludm9jYXRpb24gaW4gdGhlIHRvcCBsZXZlbAorTWFrZWZpbGUuCis8L3A+CisKKzxoMj5EaXJlY3Rvcnkga2NvbmZpZy88L2gyPgorCis8cD5NZW51Y29uZmlnIGluZnJhc3RydWN0dXJlIGNvcGllZCBmcm9tIHRoZSBMaW51eCBrZXJuZWwuICBTZWUgdGhlCitMaW51eCBrZXJuZWwncyBEb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dDwvcD4KKworPCEtLSB0b2RvCisKK0JldHRlciBPTERUT1kgYW5kIG11bHRpcGxlIGNvbW1hbmQgZXhwbGFuYXRpb24uIEZyb20gQ29uZmlnLmluOgorCis8cD5BIGNvbW1hbmQgd2l0aCBtdWx0aXBsZSBuYW1lcyAob3IgbXVsdGlwbGUgc2ltaWxhciBjb21tYW5kcyBpbXBsZW1lbnRlZCBpbgordGhlIHNhbWUgLmMgZmlsZSkgc2hvdWxkIGhhdmUgY29uZmlnIHN5bWJvbHMgcHJlZml4ZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGVpcgorQyBmaWxlLiBJLkUuIGNvbmZpZyBzeW1ib2wgcHJlZml4ZXMgYXJlIE5FV1RPWSgpIG5hbWVzLiBJZiBPTERUT1koKSBuYW1lcworaGF2ZSBjb25maWcgc3ltYm9scyB0aGV5IG11c3QgYmUgb3B0aW9ucyAoc3ltYm9scyB3aXRoIGFuIHVuZGVyc2NvcmUgYW5kCitzdWZmaXgpIHRvIHRoZSBORVdUT1koKSBuYW1lLiAoU2VlIGdlbmVyYXRlZC90b3lsaXN0LmgpPC9wPgorLS0+CisKKzwhLS0jaW5jbHVkZSBmaWxlPSJmb290ZXIuaHRtbCIgLS0+CmRpZmYgLS1naXQgYS90b3lib3gvd3d3L2Rlc2lnbi5odG1sIGIvdG95Ym94L3d3dy9kZXNpZ24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTNhN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3d3dy9kZXNpZ24uaHRtbApAQCAtMCwwICsxLDQ5MSBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPlRoZSBkZXNpZ24gb2YgdG95Ym94PC90aXRsZT48L2hlYWQ+Cis8IS0tI2luY2x1ZGUgZmlsZT0iaGVhZGVyLmh0bWwiIC0tPgorCis8Yj48aDI+RGVzaWduIGdvYWxzPC9oMj48L2I+CisKKzxwPlRveWJveCBzaG91bGQgYmUgc2ltcGxlLCBzbWFsbCwgZmFzdCwgYW5kIGZ1bGwgZmVhdHVyZWQuICBPZnRlbiwgdGhlc2UKK3RoaW5ncyBuZWVkIHRvIGJlIGJhbGFuY2VkIG9mZiBhZ2FpbnN0IGVhY2ggb3RoZXIuICBJbiBnZW5lcmFsLCBrZWVwaW5nIHRoZQorY29kZSBzaW1wbGUgdGhlIG1vc3QgaW1wb3J0YW50IChhbmQgaGFyZGVzdCkgZ29hbCwgYW5kIHNtYWxsIGlzIHNsaWdodGx5IG1vcmUKK2ltcG9ydGFudCB0aGFuIGZhc3QuIEZlYXR1cmVzIGFyZSB0aGUgcmVhc29uIHdlIHdyaXRlIGNvZGUgaW4gdGhlIGZpcnN0CitwbGFjZSBidXQgdGhpcyBoYXMgYWxsIGJlZW4gaW1wbGVtZW50ZWQgYmVmb3JlIHNvIGlmIHdlIGNhbid0IGRvIGEgYmV0dGVyCitqb2Igd2h5IGJvdGhlcj8gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBnZXQgODAlIG9mIHRoZSB3YXkgdG8gZWFjaCBnb2FsCitiZWZvcmUgdGhleSByZWFsbHkgc3RhcnQgdG8gZmlnaHQuPC9wPgorCis8cD5IZXJlIHRoZXkgYXJlIGluIHJldmVyc2Ugb3JkZXIgb2YgaW1wb3J0YW5jZTo8L3A+CisKKzxiPjxoMz5GZWF0dXJlczwvaDM+PC9iPgorCis8cD5UaGUgPGEgaHJlZj1yb2FkbWFwLmh0bWw+cm9hZG1hcDwvYT4gaGFzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHdlJ3JlCit0cnlpbmcgdG8gaW1wbGVtZW50LCBhbmQgdGhlIHJlYXNvbnMgZm9yIHRoZW0uIEFmdGVyIHRoZSAxLjAgcmVsZWFzZQorc29tZSBvZiB0aGF0IG1hdGVyaWFsIG1heSBnZXQgbW92ZWQgaGVyZS48L3A+CisKKzxwPlNvbWUgdGhpbmdzIGFyZSBzaW1wbHkgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIHByb2plY3Q6IGV2ZW4gdGhvdWdoCitwb3NpeCBkZWZpbmVzIGNvbW1hbmRzIGZvciBjb21waWxpbmcgYW5kIGxpbmtpbmcsIHdlJ3JlIG5vdCBnb2luZyB0byBpbmNsdWRlCithIGNvbXBpbGVyIG9yIGxpbmtlciAoYW5kIHN1cHBvcnQgZm9yIGEgcG90ZW50aWFsbHkgaW5maW5pdGUgbnVtYmVyIG9mIGhhcmR3YXJlCit0YXJnZXRzKS4gQW5kIHVudGlsIHNvbWVib2R5IGNvbWVzIHVwIHdpdGggYSB+MzBrIHNzaCBpbXBsZW1lbnRhdGlvbiwgd2UncmUKK2dvaW5nIHRvIHBvaW50IHlvdSBhdCBkcm9wYmVhciBvciBwb2xhcnNzbC48L3A+CisKKzxwPkVudmlyb25tZW50YWwgZGVwZW5kZW5jaWVzIGFyZSBhIHR5cGUgb2YgY29tcGxleGl0eSwgc28gbmVlZGluZyBvdGhlcgorcGFja2FnZXMgdG8gYnVpbGQgb3IgcnVuIGlzIGEgYmlnIGRvd25zaWRlLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0IHVzZSBjdXJzZXMKK3doZW4gd2UgY2FuIHNpbXBseSBvdXRwdXQgYW5zaSBlc2NhcGUgc2VxdWVuY2VzIGFuZCB0cnVzdCBhbGwgdGVybWluYWwKK3Byb2dyYW1zIHdyaXR0ZW4gaW4gdGhlIHBhc3QgMzAgeWVhcnMgdG8gYmUgYWJsZSB0byBzdXBwb3J0IHRoZW0uIChBIGNvbW1vbgordXNlIGNhc2UgaXMgdG8gZG93bmxvYWQgYSBzdGF0aWNhbGx5IGxpbmtlZCB0b3lib3ggYmluYXJ5IHRvIGFuIGFyYml0cmFyeQorTGludXggc3lzdGVtLCBhbmQgdXNlIGl0IGluIGFuIG90aGVyd2lzZSB1bmtub3duIGVudmlyb25tZW50OyBiZWluZworc2VsZi1jb250YWluZWQgaGVscHMgc3VwcG9ydCB0aGlzLik8L3A+CisKKzxiPjxoMz5TcGVlZDwvaDM+PC9iPgorCis8cD5JdCdzIGVhc3kgdG8gc2F5IGxvdHMgYWJvdXQgb3B0aW1pemluZyBmb3Igc3BlZWQgKHdoaWNoIGlzIHdoeSB0aGlzIHNlY3Rpb24KK2lzIHNvIGxvbmcpLCBidXQgYXQgdGhlIHNhbWUgdGltZSBpdCdzIHRoZSBvcHRpbWl6YXRpb24gd2UgY2FyZSB0aGUgbGVhc3QgYWJvdXQuCitUaGUgZXNzZW5jZSBvZiBzcGVlZCBpcyBiZWluZyBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUsIHdoaWNoIG1lYW5zIGRvaW5nIGFzCitsaXR0bGUgd29yayBhcyBwb3NzaWJsZS4gIEEgZGVzaWduIHRoYXQncyBzbWFsbCBhbmQgc2ltcGxlIGdldHMgeW91IDkwJSBvZiB0aGUKK3dheSB0aGVyZSwgYW5kIG1vc3Qgb2YgdGhlIHJlc3QgaXMgZWl0aGVyIGZpbmUtdHVuaW5nIG9yIG1vcmUgdHJvdWJsZSB0aGFuCitpdCdzIHdvcnRoIChhbmQgb2Z0ZW4gYWN0dWFsbHkgY291bnRlcnByb2R1Y3RpdmUpLiAgU3RpbGwsIGhlcmUncyBzb21lCithZHZpY2U6PC9wPgorCis8cD5GaXJzdCwgdW5kZXJzdGFuZCB0aGUgZGFybiBwcm9ibGVtIHlvdSdyZSB0cnlpbmcgdG8gc29sdmUuICBZb3UnZCB0aGluaworSSB3b3VsZG4ndCBoYXZlIHRvIHNheSB0aGlzLCBidXQgSSBkby4gIFRyeWluZyB0byBmaW5kIGEgZmFzdGVyIHNvcnRpbmcKK2FsZ29yaXRobSBpcyBubyBzdWJzdGl0dXRlIGZvciBmaWd1cmluZyBvdXQgYSB3YXkgdG8gc2tpcCB0aGUgc29ydGluZyBzdGVwCitlbnRpcmVseS4gIFRoZSBmYXN0ZXN0IHdheSB0byBkbyBhbnl0aGluZyBpcyBub3QgdG8gaGF2ZSB0byBkbyBpdCBhdCBhbGwsCithbmQgX2FsbF8gb3B0aW1pemF0aW9uIGJvaWxzIGRvd24gdG8gYXZvaWRpbmcgdW5uZWNlc3Nhcnkgd29yay48L3A+CisKKzxwPlNwZWVkIGlzIGVhc3kgdG8gbWVhc3VyZTsgdGhlcmUgYXJlIGRvemVucyBvZiBwcm9maWxpbmcgdG9vbHMgZm9yIExpbnV4CisoYWx0aG91Z2ggcGVyc29uYWxseSBJIGZpbmQgdGhlICJ0aW1lIiBjb21tYW5kIGEgZ29vZCBzdGFydGluZyBwbGFjZSkuCitEb24ndCB3YXN0ZSB0b28gbXVjaCB0aW1lIHRyeWluZyB0byBvcHRpbWl6ZSBzb21ldGhpbmcgeW91IGNhbid0IG1lYXN1cmUsCithbmQgdGhlcmUncyBubyBtdWNoIHBvaW50IHNwZWVkaW5nIHVwIHRoaW5ncyB5b3UgZG9uJ3Qgc3BlbmQgbXVjaCB0aW1lIGRvaW5nCithbnl3YXkuPC9wPgorCis8cD5VbmRlcnN0YW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhyb3VnaHB1dCBhbmQgbGF0ZW5jeS4gIEZhc3RlcgorcHJvY2Vzc29ycyBpbXByb3ZlIHRocm91Z2hwdXQsIGJ1dCBkb24ndCBhbHdheXMgZG8gbXVjaCBmb3IgbGF0ZW5jeS4KK0FmdGVyIDMwIHllYXJzIG9mIE1vb3JlJ3MgTGF3LCBtb3N0IG9mIHRoZSByZW1haW5pbmcgcHJvYmxlbXMgYXJlIGxhdGVuY3ksCitub3QgdGhyb3VnaHB1dC4gIChUaGVyZSBhcmUgb2YgY291cnNlIGEgZmV3IGV4Y2VwdGlvbnMsIGxpa2UgZGF0YSBjb21wcmVzc2lvbgorY29kZSwgZW5jcnlwdGlvbiwgcnN5bmMuLi4pICBXb3JyeSBhYm91dCB0aHJvdWdocHV0IGluc2lkZSBsb25nLXJ1bm5pbmcKK2xvb3BzLCBhbmQgd29ycnkgYWJvdXQgbGF0ZW5jeSBldmVyeXdoZXJlIGVsc2UuICAoQW5kIGRvbid0IHdvcnJ5IHRvbyBtdWNoCithYm91dCBhdm9pZGluZyBzeXN0ZW0gY2FsbHMgb3IgZnVuY3Rpb24gY2FsbHMgb3IgYW55dGhpbmcgZWxzZSBpbiB0aGUgbmFtZQorb2Ygc3BlZWQgdW5sZXNzIHlvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHRpZ2h0IGxvb3AgdGhhdCdzIHlvdSd2ZSBhbHJlYWR5Citwcm92ZW4gaXNuJ3QgcnVubmluZyBmYXN0IGVub3VnaC4pPC9wPgorCis8cD4iTG9jYWxpdHkgb2YgcmVmZXJlbmNlIiBpcyBnZW5lcmFsbHkgbmljZSwgaW4gYWxsIHNvcnRzIG9mIGNvbnRleHRzLgorSXQncyBvYnZpb3VzIHRoYXQgd2FpdGluZyBmb3IgZGlzayBhY2Nlc3MgaXMgMTAwMHggc2xvd2VyIHRoYW4gZG9pbmcgc3R1ZmYgaW4KK1JBTSAoYW5kIG1ha2luZyB0aGUgZGlzayBzZWVrIGlzIDEweCBzbG93ZXIgdGhhbiBzZXF1ZW50aWFsIHJlYWRzL3dyaXRlcyksCitidXQgaXQncyBqdXN0IGFzIHRydWUgdGhhdCBhIGxvb3Agd2hpY2ggc3RheXMgaW4gTDEgY2FjaGUgaXMgbWFueSB0aW1lcyBmYXN0ZXIKK3RoYW4gYSBsb29wIHRoYXQgaGFzIHRvIHdhaXQgZm9yIGEgRFJBTSBmZXRjaCBvbiBlYWNoIGl0ZXJhdGlvbi4gIERvbid0IHdvcnJ5CithYm91dCB3aGV0aGVyICImIiBpcyBmYXN0ZXIgdGhhbiAiJSIgdW50aWwgeW91ciBleGVjdXRhYmxlIGxvb3Agc3RheXMgaW4gTDEKK2NhY2hlIGFuZCB0aGUgZGF0YSBhY2Nlc3MgaXMgZmV0Y2hpbmcgY2FjaGUgbGluZXMgaW50ZWxsaWdlbnRseS4gIChUbwordW5kZXJzdGFuZCBEUkFNLCBMMSwgYW5kIEwyIGNhY2hlLCByZWFkIEhhbm5pYmFsJ3MgbWFydmVsb3VzIHJhbSBndWlkZSBhdCBBcnMKK1RlY2huaWNhOgorPGEgaHJlZj1odHRwOi8vYXJzdGVjaG5pY2EuY29tL3BhZWRpYS9yL3JhbV9ndWlkZS9yYW1fZ3VpZGUucGFydDEtMi5odG1sPnBhcnQgb25lPC9hPiwKKzxhIGhyZWY9aHR0cDovL2Fyc3RlY2huaWNhLmNvbS9wYWVkaWEvci9yYW1fZ3VpZGUvcmFtX2d1aWRlLnBhcnQyLTEuaHRtbD5wYXJ0IHR3bzwvYT4sCis8YSBocmVmPWh0dHA6Ly9hcnN0ZWNobmljYS5jb20vcGFlZGlhL3IvcmFtX2d1aWRlL3JhbV9ndWlkZS5wYXJ0My0xLmh0bWw+cGFydCB0aHJlZTwvYT4sCitwbHVzIHRoaXMKKzxhIGhyZWY9aHR0cDovL2Fyc3RlY2huaWNhLmNvbS9hcnRpY2xlcy9wYWVkaWEvY3B1L2NhY2hpbmcuYXJzLzE+YXJ0aWNsZSBvbgorY2FjaGVpbmc8L2E+LCBhbmQgdGhpcyBvbmUgb24KKzxhIGhyZWY9aHR0cDovL2Fyc3RlY2huaWNhLmNvbS9hcnRpY2xlcy9wYWVkaWEvY3B1L2JhbmR3aWR0aC1sYXRlbmN5LmFycz5iYW5kd2lkdGgKK2FuZCBsYXRlbmN5PC9hPi4KK0FuZCB0aGVyZSdzIDxhIGhyZWY9aHR0cDovL2Fyc3RlY2huaWNhLmNvbS9wYWVkaWEvaW5kZXguaHRtbD5tb3JlIHdoZXJlIHRoYXQgY2FtZSBmcm9tPC9hPi4pCitSdW5uaW5nIG91dCBvZiBMMSBjYWNoZSBjYW4gZXhlY3V0ZSBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGNsb2NrIGN5Y2xlLCBnb2luZwordG8gTDIgY2FjaGUgY29zdHMgYSBkb3plbiBvciBzbyBjbG9jayBjeWNsZXMsIGFuZCB3YWl0aW5nIGZvciBhIHdvcnN0IGNhc2UgZHJhbQorZmV0Y2ggKHJvdW5kIHRyaXAgbGF0ZW5jeSB3aXRoIGEgYmFuayBzd2l0Y2gpIGNhbiBjb3N0IHRob3VzYW5kcyBvZgorY2xvY2sgY3ljbGVzLiAgKEhpc3RvcmljYWxseSwgdGhpcyBkaXNwYXJpdHkgaGFzIGdvdHRlbiB3b3JzZSB3aXRoIHRpbWUsCitqdXN0IGxpa2UgdGhlIHNwZWVkIGhpdCBmb3Igc3dhcHBpbmcgdG8gZGlzay4gIFRoZXNlIGRheXMsIGEgX2JpZ18gTDEgY2FjaGUKK2lzIDEyOGsgYW5kIGEgYmlnIEwyIGNhY2hlIGlzIGEgY291cGxlIG9mIG1lZ2FieXRlcy4gIEEgY2hlYXAgbG93LXBvd2VyCitlbWJlZGRlZCBwcm9jZXNzb3IgbWF5IGhhdmUgOGsgb2YgTDEgY2FjaGUgYW5kIG5vIEwyLik8L3A+CisKKzxwPkxlYXJuIGhvdyA8YSBocmVmPWh0dHA6Ly9ub21tdS5vcmcvbWVtb3J5LWZhcS50eHQ+dmlydHVhbCBtZW1vcnkgYW5kCittZW1vcnkgbWFuYWdtZW50IHVuaXRzIHdvcms8L2E+LiAgRG9uJ3QgdG91Y2gKK21lbW9yeSB5b3UgZG9uJ3QgaGF2ZSB0by4gIEV2ZW4ganVzdCByZWFkaW5nIG1lbW9yeSBldmljdHMgc3R1ZmYgZnJvbSBMMSBhbmQgTDIKK2NhY2hlLCB3aGljaCBtYXkgaGF2ZSB0byBiZSByZWFkIGJhY2sgaW4gbGF0ZXIuICBXcml0aW5nIG1lbW9yeSBjYW4gZm9yY2UgdGhlCitvcGVyYXRpbmcgc3lzdGVtIHRvIGJyZWFrIGNvcHktb24td3JpdGUsIHdoaWNoIGFsbG9jYXRlcyBtb3JlIG1lbW9yeS4gIChUaGUKK21lbW9yeSByZXR1cm5lZCBieSBtYWxsb2MoKSBpcyBvbmx5IGEgdmlydHVhbCBhbGxvY2F0aW9uLCBmaWxsZWQgd2l0aCBsb3RzIG9mCitjb3B5LW9uLXdyaXRlIG1hcHBpbmdzIG9mIHRoZSB6ZXJvIHBhZ2UuICBBY3R1YWwgcGh5c2ljYWwgcGFnZXMgZ2V0IGFsbG9jYXRlZAord2hlbiB0aGUgY29weS1vbi13cml0ZSBnZXRzIGJyb2tlbiBieSB3cml0aW5nIHRvIHRoZSB2aXJ0dWFsIHBhZ2UuICBUaGlzCitpcyB3aHkgY2hlY2tpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBtYWxsb2MoKSBpc24ndCB2ZXJ5IHVzZWZ1bCBhbnltb3JlLCBpdAorb25seSBkZXRlY3RzIHJ1bm5pbmcgb3V0IG9mIHZpcnR1YWwgbWVtb3J5LCBub3QgcGh5c2ljYWwgbWVtb3J5LiAgVW5sZXNzCit5b3UncmUgdXNpbmcgYSA8YSBocmVmPWh0dHA6Ly9ub21tdS5vcmc+Tk9NTVUgc3lzdGVtPC9hPiwgd2hlcmUgYWxsIGJldHMgYXJlIG9mZi4pPC9wPgorCis8cD5Eb24ndCB0aGluayB0aGF0IGp1c3QgYmVjYXVzZSB5b3UgZG9uJ3QgaGF2ZSBhIHN3YXAgZmlsZSB0aGUgc3lzdGVtIGNhbid0CitzdGFydCBzd2FwIHRocmFzaGluZzogYW55IGZpbGUgYmFja2VkIHBhZ2UgKGFsYSBtbWFwKSBjYW4gYmUgZXZpY3RlZCwgYW5kCit0aGVyZSdzIGEgcmVhc29uIGFsbCBydW5uaW5nIHByb2dyYW1zIHJlcXVpcmUgYW4gZXhlY3V0YWJsZSBmaWxlICh0aGV5J3JlCittbWFwZWQsIGFuZCBjYW4gYmUgZmx1c2hlZCBiYWNrIHRvIGRpc2sgd2hlbiBtZW1vcnkgaXMgc2hvcnQpLiAgQW5kIGxvbmcKK2JlZm9yZSB0aGF0LCBkaXNrIGNhY2hlIGdldHMgcmVjbGFpbWVkIGFuZCBoYXMgdG8gYmUgcmVhZCBiYWNrIGluLiAgV2hlbiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gcmVhbGx5IGNhbid0IGZyZWUgdXAgYW55IG1vcmUgcGFnZXMgaXQgdHJpZ2dlcnMgdGhlIG91dCBvZgorbWVtb3J5IGtpbGxlciB0byBmcmVlIHVwIHBhZ2VzIGJ5IGtpbGxpbmcgcHJvY2Vzc2VzICh0aGUgYWx0ZXJuYXRpdmUgaXMgdGhlCitlbnRpcmUgT1MgZnJlZXppbmcgc29saWQpLiAgTW9kZXJuIG9wZXJhdGluZyBzeXN0ZW1zIHNlbGRvbSBydW4gb3V0IG9mCittZW1vcnkgZ3JhY2VmdWxseS48L3A+CisKKzxwPkFsc28sIGl0J3MgYmV0dGVyIHRvIGJlIHNpbXBsZSB0aGFuIGNsZXZlci4gIE1hbnkgcGVvcGxlIHRoaW5rIHRoYXQgbW1hcCgpCitpcyBmYXN0ZXIgdGhhbiByZWFkKCkgYmVjYXVzZSBpdCBhdm9pZHMgYSBjb3B5LCBidXQgdHdpZGRsaW5nIHdpdGggdGhlIG1lbW9yeQorbWFuYWdlbWVudCBpcyBpdHNlbGYgc2xvdywgYW5kIGNhbiBjYXVzZSB1bm5lY2Vzc2FyeSBDUFUgY2FjaGUgZmx1c2hlcy4gIEFuZAoraWYgYSByZWFkIGZhdWx0cyBpbiBkb3plbnMgb2YgcGFnZXMgc2VxdWVudGlhbGx5LCBidXQgeW91ciBtbWFwIGl0ZXJhdGVzCitiYWNrd2FyZHMgdGhyb3VnaCBhIGZpbGUgKGNhdXNpbmcgbG90cyBvZiBzZWVrcywgZWFjaCBvZiB3aGljaCB5b3VyIHByb2dyYW0KK2Jsb2NrcyB3YWl0aW5nIGZvciksIHRoZSByZWFkIGNhbiBiZSBtYW55IHRpbWVzIGZhc3Rlci4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUKK21tYXAgY2FuIHNvbWV0aW1lcyB1c2UgbGVzcyBtZW1vcnksIHNpbmNlIHRoZSBtZW1vcnkgcHJvdmlkZWQgYnkgbW1hcAorY29tZXMgZnJvbSB0aGUgcGFnZSBjYWNoZSAoYWxsb2NhdGVkIGFueXdheSksIGFuZCBpdCBjYW4gYmUgZmFzdGVyIGlmIHlvdSdyZQorZG9pbmcgYSBsb3Qgb2YgZGlmZmVyZW50IHVwZGF0ZXMgdG8gdGhlIHNhbWUgYXJlYS4gIFRoZSBtb3JhbD8gIE1lYXN1cmUsIHRoZW4KK3RyeSB0byBzcGVlZCB0aGluZ3MgdXAsIGFuZCBtZWFzdXJlIGFnYWluIHRvIGNvbmZpcm0gaXQgYWN0dWFsbHkgX2RpZF8gc3BlZWQKK3RoaW5ncyB1cCByYXRoZXIgdGhhbiBtYWRlIHRoZW0gd29yc2UuICAoQW5kIHVuZGVyc3RhbmRpbmcgd2hhdCdzIHJlYWxseSBnb2luZworb24gdW5kZXJuZWF0aCBpcyBhIGJpZyBoZWxwIHRvIG1ha2luZyBpdCBoYXBwZW4gZmFzdGVyLik8L3A+CisKKzxwPkluIGdlbmVyYWwsIGJlaW5nIHNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBiZWluZyBjbGV2ZXIuICBPcHRpbWl6YXRpb24KK3N0cmF0ZWdpZXMgY2hhbmdlIHdpdGggdGltZS4gIEZvciBleGFtcGxlLCBkZWNhZGVzIGFnbyBwcmVjYWxjdWxhdGluZyBhIHRhYmxlCitvZiByZXN1bHRzIChmb3IgdGhpbmdzIGxpa2UgaXNkaWdpdCgpIG9yIGNvc2luZShpbnQgZGVncmVlcykpIHdhcyBjbGVhcmx5CitmYXN0ZXIgYmVjYXVzZSBwcm9jZXNzb3JzIHdlcmUgc28gc2xvdy4gIFRoZW4gcHJvY2Vzc29ycyBnb3QgZmFzdGVyIGFuZCBncmV3CittYXRoIGNvcHJvY2Vzc29ycywgYW5kIGNhbGN1bGF0aW5nIHRoZSB2YWx1ZSBlYWNoIHRpbWUgYmVjYW1lIGZhc3RlciB0aGFuCit0aGUgdGFibGUgbG9va3VwIChiZWNhdXNlIHRoZSBjYWxjdWxhdGlvbiBmaXQgaW4gTDEgY2FjaGUgYnV0IHRoZSBsb29rdXAKK2hhZCB0byBnbyBvdXQgdG8gRFJBTSkuICBUaGVuIGNhY2hlIHNpemVzIGdvdCBiaWdnZXIgKHRoZSBQZW50aXVtIE0gaGFzCisyIG1lZ2FieXRlcyBvZiBMMiBjYWNoZSkgYW5kIHRoZSB0YWJsZSBmaXQgaW4gY2FjaGUsIHNvIHRoZSB0YWJsZSBiZWNhbWUKK2Zhc3QgYWdhaW4uLi4gIFByZWRpY3RpbmcgaG93IGNoYW5nZXMgaW4gaGFyZHdhcmUgd2lsbCBhZmZlY3QgeW91ciBhbGdvcml0aG0KK2lzIGRpZmZpY3VsdCwgYW5kIHVzaW5nIHRlbiB5ZWFyIG9sZCBvcHRpbWl6YXRpb24gYWR2aWNlIGFuZCBwcm9kdWNlCitsYXVnaGFibHkgYmFkIHJlc3VsdHMuICBCdXQgYmVpbmcgc2ltcGxlIGFuZCBlZmZpY2llbnQgaXMgYWx3YXlzIGdvaW5nIHRvCitnaXZlIGF0IGxlYXN0IGEgcmVhc29uYWJsZSByZXN1bHQuPC9wPgorCis8cD5UaGUgZmFtb3VzIHF1b3RlIGZyb20gS2VuIFRob21wc29uLCAiV2hlbiBpbiBkb3VidCwgdXNlIGJydXRlIGZvcmNlIiwKK2FwcGxpZXMgdG8gdG95Ym94LiAgRG8gdGhlIHNpbXBsZSB0aGluZyBmaXJzdCwgZG8gYXMgbGl0dGxlIG9mIGl0IGFzIHBvc3NpYmxlLAorYW5kIG1ha2Ugc3VyZSBpdCdzIHJpZ2h0LiAgWW91IGNhbiBhbHdheXMgc3BlZWQgaXQgdXAgbGF0ZXIuPC9wPgorCis8Yj48aDM+U2l6ZTwvaDM+PC9iPgorPHA+QWdhaW4sIHNpbXBsZSBnaXZlcyB5b3UgbW9zdCBvZiB0aGlzLiAgQW4gYWxnb3JpdGhtIHRoYXQgZG9lcyBsZXNzIHdvcmsKK2lzIGdlbmVyYWxseSBzbWFsbGVyLiAgVW5kZXJzdGFuZCB0aGUgcHJvYmxlbSwgdHJlYXQgc2l6ZSBhcyBhIGNvc3QsIGFuZAorZ2V0IGEgZ29vZCBiYW5nIGZvciB0aGUgYnl0ZS48L3A+CisKKzxwPlVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiaW5hcnkgc2l6ZSwgaGVhcCBzaXplLCBhbmQgc3RhY2sgc2l6ZS4KK1lvdXIgYmluYXJ5IGlzIHRoZSBleGVjdXRhYmxlIGZpbGUgb24gZGlzaywgeW91ciBoZWFwIGlzIHdoZXJlIG1hbGxvYygpIG1lbW9yeQorbGl2ZXMsIGFuZCB5b3VyIHN0YWNrIGlzIHdoZXJlIGxvY2FsIHZhcmlhYmxlcyAoYW5kIGZ1bmN0aW9uIGNhbGwgcmV0dXJuCithZGRyZXNzZXMpIGxpdmUuICBPcHRpbWl6aW5nIGZvciBiaW5hcnkgc2l6ZSBpcyBnZW5lcmFsbHkgZ29vZDogZXhlY3V0aW5nCitmZXdlciBpbnN0cnVjdGlvbnMgbWFrZXMgeW91ciBwcm9ncmFtIHJ1biBmYXN0ZXIgKGFuZCBmaXRzIG1vcmUgb2YgaXQgaW4KK2NhY2hlKS4gIE9uIGVtYmVkZGVkIHN5c3RlbXMsIGJpbmFyeSBzaXplIGlzIGVzcGVjaWFsbHkgcHJlY2lvdXMgYmVjYXVzZQorZmxhc2ggaXMgZXhwZW5zaXZlIChhbmQgaXRzIHN1Y2Nlc3NvciwgTVJBTSwgZXZlbiBtb3JlIHNvKS4gIFNtYWxsIHN0YWNrIHNpemUKK2lzIGltcG9ydGFudCBmb3Igbm9tbXUgc3lzdGVtcyBiZWNhdXNlIHRoZXkgaGF2ZSB0byBwcmVhbGxvY2F0ZSB0aGVpciBzdGFjaworYW5kIGNhbid0IG1ha2UgaXQgYmlnZ2VyIHZpYSBwYWdlIGZhdWx0LiAgQW5kIGV2ZXJ5Ym9keSBsaWtlcyBhIHNtYWxsIGhlYXAuPC9wPgorCis8cD5NZWFzdXJlIHRoZSByaWdodCB0aGluZ3MuICBFc3BlY2lhbGx5IHdpdGggbW9kZXJuIG9wdGltaXplcnMsIGV4cGVjdGluZworc29tZXRoaW5nIHRvIGJlIHNtYWxsZXIgaXMgbm8gZ3VhcmFudGVlIGl0IHdpbGwgYmUgYWZ0ZXIgdGhlIGNvbXBpbGVyJ3MgZG9uZQord2l0aCBpdC4gIEJpbmFyeSBzaXplIGlzbid0IHRoZSBtb3N0IGFjY3VyYXRlIGluZGljYXRvciBvZiB0aGUgaW1wYWN0IG9mIGEKK2dpdmVuIGNoYW5nZSwgYmVjYXVzZSBsb3RzIG9mIHRoaW5ncyBnZXQgY29tYmluZWQgYW5kIHJvdW5kZWQgZHVyaW5nCitjb21waWxhdGlvbiBhbmQgbGlua2luZy4gIE1hdHQgTWFja2FsbCdzIGJsb2F0LW8tbWV0ZXIgaXMgYSBweXRob24gc2NyaXB0Cit3aGljaCBjb21wYXJlcyB0d28gdmVyc2lvbnMgb2YgYSBwcm9ncmFtLCBhbmQgc2hvd3Mgc2l6ZSBjaGFuZ2VzIGluIGVhY2gKK3N5bWJvbCAodXNpbmcgdGhlICJubSIgY29tbWFuZCBiZWhpbmQgdGhlIHNjZW5lcykuICBUbyB1c2UgdGhpcywgcnVuCisibWFrZSBiYXNlbGluZSIgdG8gYnVpbGQgYSBiYXNlbGluZSB2ZXJzaW9uIHRvIGNvbXBhcmUgYWdhaW5zdCwgYW5kCit0aGVuICJtYWtlIGJsb2F0b21ldGVyIiB0byBjb21wYXJlIHRoYXQgYmFzZWxpbmUgdmVyc2lvbiBhZ2FpbnN0IHRoZSBjdXJyZW50Citjb2RlLjwvcD4KKworPHA+QXZvaWQgc3BlY2lhbCBjYXNlcy4gIFdoZW5ldmVyIHlvdSBzZWUgc2ltaWxhciBjaHVua3Mgb2YgY29kZSBpbiBtb3JlIHRoYW4KK29uZSBwbGFjZSwgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gY29tYmluZSB0aGVtIGFuZCBoYXZlIHRoZSB1c2VycyBjYWxsIHNoYXJlZAorY29kZS4gKFRoaXMgaXMgdGhlIG1vc3QgY29tbW9ubHkgY2l0ZWQgdHJpY2ssIHdoaWNoIGRvZXNuJ3QgbWFrZSBpdCBlYXN5LiBJZgorc2VlaW5nIHR3byBsaW5lcyBvZiBjb2RlIGRvIHRoZSBzYW1lIHRoaW5nIG1ha2VzIHlvdSBzbGlnaHRseSB1bmNvbWZvcnRhYmxlLAoreW91J3ZlIGdvdCB0aGUgcmlnaHQgbWluZHNldC4pPC9wPgorCis8cD5Tb21lIHNwZWNpZmljIGFkdmljZTogVXNpbmcgYSBjaGFyIGluIHBsYWNlIG9mIGFuIGludCB3aGVuIGRvaW5nIG1hdGgKK3Byb2R1Y2VzIHNpZ25pZmljYW50bHkgbGFyZ2VyIGNvZGUgb24gc29tZSBwbGF0Zm9ybXMgKG5vdGFibHkgYXJtKSwKK2JlY2F1c2UgZWFjaCB0aW1lIHRoZSBjb21waWxlciBoYXMgdG8gZW1pdCBjb2RlIHRvIGNvbnZlcnQgaXQgdG8gaW50LCBkbyB0aGUKK21hdGgsIGFuZCBjb252ZXJ0IGl0IGJhY2suICBCaXRmaWVsZHMgaGF2ZSB0aGlzIHByb2JsZW0gb24gbW9zdCBwbGF0Zm9ybXMuCitCZWNhdXNlIG9mIHRoaXMsIHVzaW5nIGNoYXIgdG8gaW5kZXggYSBmb3IoKSBsb29wIGlzIHByb2JhYmx5IG5vdCBhIG5ldCB3aW4sCithbHRob3VnaCB1c2luZyBjaGFyIChvciBhIGJpdGZpZWxkKSB0byBzdG9yZSBhIHZhbHVlIGluIGEgc3RydWN0dXJlIHRoYXQncworcmVwZWF0ZWQgaHVuZHJlZHMgb2YgdGltZXMgY2FuIGJlIGEgZ29vZCB0cmFkZW9mZiBvZiBiaW5hcnkgc2l6ZSBmb3IgaGVhcAorc3BhY2UuPC9wPgorCis8Yj48aDM+U2ltcGxlPC9oMz48L2I+CisKKzxwPkNvbXBsZXhpdHkgaXMgYSBjb3N0LCBqdXN0IGxpa2UgY29kZSBzaXplIG9yIHJ1bnRpbWUgc3BlZWQuIFRyZWF0IGl0IGFzCithIGNvc3QsIGFuZCBzcGVuZCB5b3VyIGNvbXBsZXhpdHkgYnVkZ2V0IHdpc2VseS4gKFNvbWV0aW1lcyB0aGlzIG1lYW5zIHlvdQorY2FuJ3QgYWZmb3JkIGEgZmVhdHVyZSBiZWNhdXNlIGl0IGNvbXBsaWNhdGVzIHRoZSBjb2RlIHRvbyBtdWNoIHRvIGJlCit3b3J0aCBpdC4pPC9wPgorCis8cD5TaW1wbGljaXR5IGhhcyBsb3RzIG9mIGJlbmVmaXRzLiAgU2ltcGxlIGNvZGUgaXMgZWFzeSB0byBtYWludGFpbiwgZWFzeSB0bworcG9ydCB0byBuZXcgcHJvY2Vzc29ycywgZWFzeSB0byBhdWRpdCBmb3Igc2VjdXJpdHkgaG9sZXMsIGFuZCBlYXN5IHRvCit1bmRlcnN0YW5kLjwvcD4KKworPHA+U2ltcGxpY2l0eSBpdHNlbGYgY2FuIGhhdmUgc3VidGxlIG5vbi1vYnZpb3VzIGFzcGVjdHMgcmVxdWlyaW5nIGEgdHJhZGVvZmYKK2JldHdlZW4gb25lIGtpbmQgb2Ygc2ltcGxpY2l0eSBhbmQgYW5vdGhlcjogc2ltcGxlIGZvciB0aGUgY29tcHV0ZXIgdG8KK2V4ZWN1dGUgYW5kIHNpbXBsZSBmb3IgYSBodW1hbiByZWFkZXIgdG8gdW5kZXJzdGFuZCBhcmVuJ3QgYWx3YXlzIHRoZQorc2FtZSB0aGluZy4gQSBjb21wYWN0IGFuZCBjbGV2ZXIgYWxnb3JpdGhtIHRoYXQgZG9lcyB2ZXJ5IGxpdHRsZSB3b3JrIG1heQorbm90IGJlIGFzIGVhc3kgdG8gZXhwbGFpbiBvciB1bmRlcnN0YW5kIGFzIGEgbGFyZ2VyIG1vcmUgZXhwbGljaXQgdmVyc2lvbgorcmVxdWlyaW5nIG1vcmUgY29kZSwgbWVtb3J5LCBhbmQgQ1BVIHRpbWUuIFdoZW4gYmFsYW5jaW5nIHRoZXNlLCBlcnIgb24gdGhlCitzaWRlIG9mIGRvaW5nIGxlc3Mgd29yaywgYnV0IGFkZCBjb21tZW50cyBkZXNjcmliaW5nIGhvdyB5b3UKK2NvdWxkIGJlIG1vcmUgZXhwbGljaXQuPC9wPgorCis8cD5JbiBnZW5lcmFsLCBjb21tZW50cyBhcmUgbm90IGEgc3Vic3RpdHV0ZSBmb3IgZ29vZCBjb2RlIChvciB3ZWxsIGNob3NlbgordmFyaWFibGUgb3IgZnVuY3Rpb24gbmFtZXMpLiBDb21tZW50aW5nICJ4ICs9IHk7IiB3aXRoICIvKiBhZGQgeSB0byB4ICovIgorY2FuIGFjdHVhbGx5IGRldHJhY3QgZnJvbSB0aGUgcHJvZ3JhbSdzIHJlYWRhYmlsaXR5LiBJZiB5b3UgbmVlZCB0byBkZXNjcmliZQord2hhdCB0aGUgY29kZSBpcyBkb2luZyAocmF0aGVyIHRoYW4gX3doeV8gaXQncyBkb2luZyBpdCksIHRoYXQgbWVhbnMgdGhlCitjb2RlIGl0c2VsZiBpc24ndCB2ZXJ5IGNsZWFyLjwvcD4KKworPHA+UHJpb3JpdGl6aW5nIHNpbXBsaWNpdHkgdGVuZHMgdG8gc2VydmUgb3VyIG90aGVyIGdvYWxzOiBzaW1wbGlmeWluZyBjb2RlCitnZW5lcmFsbHkgcmVkdWNlcyBpdHMgc2l6ZSAoYm90aCBpbiB0ZXJtcyBvZiBiaW5hcnkgc2l6ZSBhbmQgcnVudGltZSBtZW1vcnkKK3VzYWdlKSwgYW5kIGF2b2lkaW5nIHVubmVjZXNzYXJ5IHdvcmsgbWFrZXMgY29kZSBydW4gZmFzdGVyLiBTbWFsbGVyIGNvZGUKK2Fsc28gdGVuZHMgdG8gcnVuIGZhc3RlciBvbiBtb2Rlcm4gaGFyZHdhcmUgZHVlIHRvIENQVSBjYWNoZWluZzogZml0dGluZyB5b3VyCitjb2RlIGludG8gTDEgY2FjaGUgaXMgZ3JlYXQsIGFuZCBzdGF5aW5nIGluIEwyIGNhY2hlIGlzIHN0aWxsIHByZXR0eSBnb29kLjwvcD4KKworPHA+QnV0IGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBhbHdheXMgdGhlIHNtYWxsZXN0IG9yIGZhc3Rlc3QsIGFuZAorYmFsYW5jaW5nIHNpbXBsaWNpdHkgdnMgdGhlIG90aGVyIGdvYWxzIGNhbiBiZSBkaWZmaWN1bHQuIEZvciBleGFtcGxlLCB0aGUKK2F0b2x4X3JhbmdlKCkgZnVuY3Rpb24gaW4gbGliL2xpYi5jIHVzZXMgdGhlIGFsd2F5cyA2NCBiaXQgImxvbmcgbG9uZyIgdHlwZSwKK3doaWNoIHByb2R1Y2VzIGxhcmdlciBhbmQgc2xvd2VyIGNvZGUgb24gMzIgYml0IHBsYXRmb3JtcyBhbmQKK29mdGVuIGFzc2lnbmVkIGludG8gc21hbGxlciBpbnRlcmdlciB0eXBlcy4gQWx0aG91Z2ggbGliYyBoYXMgcGFyYWxsZWwKK2ltcGxlbWVudGF0aW9ucyBmb3IgZGlmZmVyZW50IGRhdGEgc2l6ZXMgKGF0b2ksIGF0b2wsIGF0b2xsKSB3ZSBvbmx5Cit1c2VkIHRoZSBsYXJnZXN0LCB3aGljaCBjYW4gY292ZXIgYWxsIGNhc2VzLjwvcD4KKworPHA+T24gdGhlIG90aGVyIGhhbmQsIHRoZSAidGFpbCIgY29tbWFuZCBoYXMgdHdvIGNvZGVwYXRocywgb25lIGZvciBzZWVrYWJsZQorZmlsZXMgYW5kIG9uZSBmb3Igbm9uc2Vla2FibGUgZmlsZXMuIEFsdGhvdWdoIHRoZSBub25zZWVrYWJsZSBjYXNlIGNhbiBoYW5kbGUKK2FsbCBpbnB1dHMgKGFuZCBpcyByZXF1aXJlZCB3aGVuIGlucHV0IGNvbWVzIGZyb20gYSBwaXBlIG9yIHNpbWlsYXIsIHNvIGNhbm5vdAorYmUgcmVtb3ZlZCksIHJlYWRpbmcgdGhyb3VnaCBtdWx0aXBsZSBnaWdhYnl0ZXMgb2YgZGF0YSB0byByZWFjaCB0aGUgZW5kIG9mCitzZWVrYWJsZSBmaWxlcyB3YXMgYm90aCBhIGNvbW1vbiBjYXNlIGFuZCBodWdlbHkgcGVuYWxpemVkIGJ5IGEgbm9uc2Vla2FibGUKK2FwcHJvYWNoIChoYWxmLW1pbnV0ZSB3YWl0IHZzIGluc3RhbnQgcmVzdWx0cykuIFRoaXMgaXMgb25lIGV4YW1wbGUKK3doZXJlIHBlcmZvcm1hbmNlIGRpZCBvdXR3ZWlnaCBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLjwvcD4KKworPHA+PGEgaHJlZj1odHRwOi8vd3d3LmpvZWxvbnNvZnR3YXJlLmNvbS9hcnRpY2xlcy9mb2cwMDAwMDAwMDY5Lmh0bWw+Sm9lbAorU3BvbHNreSBhcmd1ZXMgYWdhaW5zdCB0aHJvd2luZyBjb2RlIG91dCBhbmQgc3RhcnRpbmcgb3ZlcjwvYT4sIGFuZCBoZSBoYXMKK2dvb2QgcG9pbnRzOiBhbiBleGlzdGluZyBkZWJ1Z2dlZCBjb2RlYmFzZSBjb250YWlucyBhIGh1Z2UgYW1vdW50IG9mIGJha2VkCitpbiBrbm93bGVkZ2UgYWJvdXQgc3RyYW5nZSByZWFsLXdvcmxkIHVzZSBjYXNlcyB0aGF0IHRoZSBkZXNpZ25lcnMgZGlkbid0Citrbm93IGFib3V0IHVudGlsIHVzZXJzIGhpdCB0aGUgYnVncywgYW5kIG1vc3Qgb2YgdGhpcyBrbm93bGVkZ2UgaXMgbmV2ZXIKK2V4cGxpY2l0bHkgc3RhdGVkIGFueXdoZXJlIGV4Y2VwdCBpbiB0aGUgc291cmNlIGNvZGUuPC9wPgorCis8cD5UaGF0IHNhaWQsIHRoZSBNeXRoaWNhbCBNYW4tTW9udGgncyAiYnVpbGQgb25lIHRvIHRocm93IGF3YXkiIGFkdmljZSBwb2ludHMKK291dCB0aGF0IHVudGlsIHlvdSd2ZSBzb2x2ZWQgdGhlIHByb2JsZW0geW91IGRvbid0IHByb3Blcmx5IHVuZGVyc3RhbmQgaXQsIGFuZAorYWJvdXQgdGhlIHRpbWUgeW91IGZpbmlzaCB5b3VyIGZpcnN0IHZlcnNpb24gaXMgd2hlbiB5b3UndmUgZmluYWxseSBmaWd1cmVkCitvdXQgd2hhdCB5b3UgX3Nob3VsZF8gaGF2ZSBkb25lLiAgKFRoZSBjb3Jyb2xhcnkgaXMgdGhhdCBpZiB5b3UgYnVpbGQgb25lCitleHBlY3RpbmcgdG8gdGhyb3cgaXQgYXdheSwgeW91J2xsIGFjdHVhbGx5IHdpbmQgdXAgdGhyb3dpbmcgYXdheSB0d28uICBZb3UKK2Rvbid0IHVuZGVyc3RhbmQgdGhlIHByb2JsZW0gdW50aWwgeW91IF9oYXZlXyBzb2x2ZWQgaXQuKTwvcD4KKworPHA+Sm9lbCBpcyB0YWxraW5nIGFib3V0IHdoYXQgY2xvc2VkIHNvdXJjZSBzb2Z0d2FyZSBjYW4gYWZmb3JkIHRvIGRvOiBDb2RlCit0aGF0IHdvcmtzIGFuZCBoYXMgYmVlbiBwYWlkIGZvciBpcyBhIGNvcnBvcmF0ZSBhc3NldCBub3QgbGlnaHRseSBhYmFuZG9uZWQuCitPcGVuIHNvdXJjZSBzb2Z0d2FyZSBjYW4gYWZmb3JkIHRvIHJlLWltcGxlbWVudCBjb2RlIHRoYXQgd29ya3MsIG92ZXIgYW5kCitvdmVyIGZyb20gc2NyYXRjaCwgZm9yIGluY3JlbWVudGFsIGdhaW5zLiAgQmVmb3JlIHRveWJveCwgdGhlIHVuaXggY29tbWFuZCBsaW5lCitoYXMgYWxyZWFkeSBiZWVuIHJlaW1wbGVtZW50ZWQgZnJvbSBzY3JhdGNoIHNldmVyYWwgdGltZXMgKHRoZQorb3JpZ2luYWwgQVQmYW1wO1QgVW5peCBjb21tYW5kIGxpbmUgaW4gYXNzZW1ibHkgYW5kIHRoZW4gaW4gQywgdGhlIEJTRAordmVyc2lvbnMsIENvaGVyZW50IHdhcyB0aGUgZmlyc3QgZnVsbCBmcm9tLXNjcmF0Y2ggVW5peCBjbG9uZSBpbiAxOTgwLAorTWluaXggd2FzIGFub3RoZXIgY2xvbmUgd2hpY2ggTGludXggd2FzIGluc3BpcmVkIGJ5IGFuZCBkZXZlbG9wZWQgdW5kZXIsCit0aGUgR05VIHRvb2xzIHdlcmUgeWV0IGFub3RoZXIgcmV3cml0ZSBpbnRlbmRlZCBmb3IgdXNlIGluIHRoZSBzdGlsbGJvcm4KKyJIdXJkIiBwcm9qZWN0LCBCdXN5Qm94IHdhcyBzdGlsbCBhbm90aGVyIHJld3JpdGUsIGFuZCBtb3JlIHZlcnNpb25zCit3ZXJlIHdyaXR0ZW4gaW4gUGxhbiA5LCB1Y2xpbnV4LCBrbGliYywgc2FzaCwgc2Jhc2UsIHM2LCBhbmQgb2YgY291cnNlCithbmRyb2lkIHRvb2xib3guLi4pIGJ1dCBtYXliZSB0b3lib3ggY2FuIGRvIGEgYmV0dGVyIGpvYi4gOik8L3A+CisKKzxwPkFzIEFudG9pbmUgZGUgU3QuIEV4dXBlcnkgKGF1dGhvciBvZiAiVGhlIExpdHRsZSBQcmluY2UiIGFuZCBhbiBlYXJseQorYWlyY3JhZnQgZGVzaWduZXIpIHNhaWQsICJQZXJmZWN0aW9uIGlzIGFjaGlldmVkLCBub3Qgd2hlbiB0aGVyZQoraXMgbm90aGluZyBsZWZ0IHRvIGFkZCwgYnV0IHdoZW4gdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHRha2UgYXdheS4iCitBbmQgS2VuIFRob21wc29uIChjcmVhdG9yIG9mIFVuaXgpIHNhaWQgIk9uZSBvZiBteSBtb3N0IHByb2R1Y3RpdmUKK2RheXMgd2FzIHRocm93aW5nIGF3YXkgMTAwMCBsaW5lcyBvZiBjb2RlLiIgSXQncyBhbHdheXMgcG9zc2libGUgdG8KK2NvbWUgdXAgd2l0aCBhIGJldHRlciB3YXkgdG8gZG8gaXQuPC9wPgorCis8cD5QLlMuICBIb3cgY291bGQgSSByZXNpc3QgbGlua2luZyB0byBhbiBhcnRpY2xlIGFib3V0Cis8YSBocmVmPWh0dHA6Ly9ibG9nLm91dGVyLWNvdXJ0LmNvbS9hcmNoaXZlLzIwMDUtMDgtMjQtbjE0Lmh0bWw+d2h5Citwcm9ncmFtbWVycyBzaG91bGQgc3RyaXZlIHRvIGJlIGxhenkgYW5kIGR1bWI8L2E+PzwvcD4KKworPGI+PGgyPlBvcnRhYmlsaXR5IGlzc3VlczwvaDI+PC9iPgorCis8Yj48aDM+UGxhdGZvcm1zPC9oMz48L2I+Cis8cD5Ub3lib3ggc2hvdWxkIHJ1biBvbiBBbmRyb2lkIChhbGwgY29tbWFuZHMgd2l0aCBtdXNsLWxpYmMsIGFzIGxhcmdlIGEgc3Vic2V0CithcyBwcmFjdGljYWwgd2l0aCBiaW9uaWMpLCBhbmQgZXZlcnkgb3RoZXIgaGFyZHdhcmUgcGxhdGZvcm0gTGludXggcnVucyBvbi4KK090aGVyIHBvc2l4L3N1c3Y0IGVudmlyb25tZW50cyAocGVyaGFwcyBNYWNPUyBYIG9yIG5ld2xpYitsaWJnbG9zcykgYXJlIHZhZ3VlbHkKK2ludGVyZXN0aW5nIGJ1dCBvbmx5IGlmIHRoZXkncmUgZWFzeSB0byBzdXBwb3J0OyBJJ20gbm90IGdvaW5nIHRvIHNwZW5kIG11Y2gKK2VmZm9ydCBvbiB0aGVtLjwvcD4KKworPHA+SSBkb24ndCBkbyB3aW5kb3dzLjwvcD4KKworPHA+V2UgZGVwZW5kIG9uIEM5OSBhbmQgcG9zaXgtMjAwOCBsaWJjIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIG9wZW5hdCgpIGZhbWlseSBvZgorZnVuY3Rpb25zLiBXZSBhbHNvIGFzc3VtZSBjZXJ0YWluICJtb2Rlcm4iIGxpbnV4IGtlcm5lbCBiZWhhdmlvciBzdWNoCithcyBsYXJnZSBlbnZpcm9ubWVudCBzaXplcyAobGludXggY29tbWl0IGI2YTJmZWEzOTMxOCwgd2VudCBpbnRvIDIuNi4yMgorcmVsZWFzZWQgSnVseSAyMDA3KS4gSW4gdGhlb3J5IHRoaXMgc2hvdWxkbid0IHByZXZlbnQgdXMgZnJvbSB3b3JraW5nIG9uCitvbGRlciBrZXJuZWxzIG9yIG90aGVyIGltcGxlbWVudGF0aW9ucyAoYWxhIEJTRCksIGJ1dCB3ZSBkb24ndCBwb2xpY2UgdGhlaXIKK2Nvcm5lciBjYXNlcy48L3A+CisKKzxiPjxoMz4zMi82NCBiaXQ8L2gzPjwvYj4KKzxwPlRveWJveCBzaG91bGQgd29yayBvbiBib3RoIDMyIGJpdCBhbmQgNjQgYml0IHN5c3RlbXMuIDY0IGJpdCBkZXNrdG9wCitoYXJkd2FyZSB3ZW50IG1haW5zdHJlYW0gaW4gMjAwNSBhbmQgd2FzIGVzc2VudGlhbGx5IHViaXF1aXRvdXMKK2J5IHRoZSBlbmQgb2YgdGhlIGRlY2FkZSwgYnV0IDMyIGJpdCBoYXJkd2FyZSB3aWxsIGNvbnRpbnVlIHRvIGJlIGltcG9ydGFudAoraW4gZW1iZWRkZWQgZGV2aWNlcyBmb3Igc2V2ZXJhbCBtb3JlIHllYXJzLjwvcD4KKworPHA+VG95Ym94IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IG9uIGFueSBVbml4LWxpa2UgcGxhdGZvcm0sIHBvaW50ZXIgYW5kIGxvbmcKK2FyZSBhbHdheXMgdGhlIHNhbWUgc2l6ZSAob24gYm90aCAzMiBhbmQgNjQgYml0KS4gUG9pbnRlciBhbmQgaW50IGFyZSBfbm90XwordGhlIHNhbWUgc2l6ZSBvbiA2NCBiaXQgc3lzdGVtcywgYnV0IHBvaW50ZXIgYW5kIGxvbmcgYXJlLjwvcD4KKworPHA+VGhpcyBpcyBndWFyYW50ZWVkIGJ5IHRoZSBMUDY0IG1lbW9yeSBtb2RlbCwgYSBVbml4IHN0YW5kYXJkICh3aGljaCBMaW51eAorYW5kIE1hY09TIFggYm90aCBpbXBsZW1lbnQsIGFuZCB3aGljaCBtb2Rlcm4gNjQgYml0IHByb2Nlc3NvcnMgc3VjaCBhcworeDg2LTY0IHdlcmUgPGEgaHJlZj1odHRwOi8vd3d3LnBhZ2V0YWJsZS5jb20vP3A9Nj5kZXNpZ25lZCBmb3I8L2E+KS4gIFNlZQorPGEgaHJlZj1odHRwOi8vd3d3LnVuaXgub3JnL3doaXRlcGFwZXJzLzY0Yml0Lmh0bWw+dGhlIExQNjQgc3RhbmRhcmQ8L2E+IGFuZAorPGEgaHJlZj1odHRwOi8vd3d3LnVuaXgub3JnL3ZlcnNpb24yL3doYXRzbmV3L2xwNjRfd3AuaHRtbD50aGUgTFA2NAorcmF0aW9uYWxlPC9hPiBmb3IgZGV0YWlscy48L3A+CisKKzxwPk5vdGUgdGhhdCBXaW5kb3dzIGRvZXNuJ3Qgd29yayBsaWtlIHRoaXMsIGFuZCBJIGRvbid0IGNhcmUuCis8YSBocmVmPWh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDUvMDEvMzEvMzYzNzkwLmFzcHg+VGhlCitpbnNhbmUgbGVnYWN5IHJlYXNvbnMgd2h5IHRoaXMgaXMgYnJva2VuIG9uIFdpbmRvd3MgYXJlIGV4cGxhaW5lZCBoZXJlLjwvYT48L3A+CisKKzxiPjxoMz5TaWduZWRuZXNzIG9mIGNoYXI8L2gzPjwvYj4KKzxwPk9uIHBsYXRmb3JtcyBsaWtlIHg4NiwgdmFyaWFibGVzIG9mIHR5cGUgY2hhciBkZWZhdWx0IHRvIHVuc2lnbmVkLiAgT24KK3BsYXRmb3JtcyBsaWtlIGFybSwgY2hhciBkZWZhdWx0cyB0byBzaWduZWQuICBUaGlzIGRpZmZlcmVuY2UgY2FuIGxlYWQgdG8KK3N1YnRsZSBwb3J0YWJpbGl0eSBidWdzLCBhbmQgdG8gYXZvaWQgdGhlbSB3ZSBzcGVjaWZ5IHdoaWNoIG9uZSB3ZSB3YW50IGJ5CitmZWVkaW5nIHRoZSBjb21waWxlciAtZnVuc2lnbmVkLWNoYXIuPC9wPgorCis8cD5UaGUgcmVhc29uIHRvIHBpY2sgInVuc2lnbmVkIiBpcyB0aGF0IHdheSB3ZSdyZSA4LWJpdCBjbGVhbiBieSBkZWZhdWx0LjwvcD4KKworPHA+PGgzPkVycm9yIG1lc3NhZ2VzIGFuZCBpbnRlcm5hdGlvbmFsaXphdGlvbjo8L2gzPjwvcD4KKworPHA+RXJyb3IgbWVzc2FnZXMgYXJlIGV4dHJlbWVseSB0ZXJzZSBub3QganVzdCB0byBzYXZlIGJ5dGVzLCBidXQgYmVjYXVzZSB3ZQorZG9uJ3QgdXNlIGFueSBzb3J0IG9mIF8oInN0cmluZyIpIHRyYW5zbGF0aW9uIGluZnJhc3RydWN0dXJlLiAoV2UncmUgbm90Cit0cmFuc2xhdGluZyB0aGUgY29tbWFuZCBuYW1lcyB0aGVtc2VsdmVzLCBzbyB3ZSBtdXN0IGV4cGVjdCBhIG1pbmltdW0gYW1vdW50IG9mCitlbmdsaXNoIGtub3dsZWRnZSBmcm9tIG91ciB1c2VycywgYnV0IGxldCdzIGtlZXAgaXQgdG8gYSBtaW5pbXVtLik8L3A+CisKKzxwPlRodXMgImJhZCAtQSAnJWMnIiBpcworcHJlZmVyYWJsZSB0byAiVW5yZWNvZ25pemVkIGFkZHJlc3MgYmFzZSAnJWMnIiwgYmVjYXVzZSBhIG5vbi1lbmdsaXNoIHNwZWFrZXIKK2NhbiBzZWUgdGhhdCAtQSB3YXMgdGhlIHByb2JsZW0gKGdpdmluZyBiYWNrIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhleQorc3VwcGxpZWQpLiBBIHVzZXIgd2l0aCBhIH4yMCB3b3JkIGVuZ2xpc2ggdm9jYWJ1bGFyeSBpcworbW9yZSBsaWtlbHkgdG8ga25vdyAob3IgZ3Vlc3MpICJiYWQiIHRoYW4gdGhlIGxvbmdlciBtZXNzYWdlLCBhbmQgeW91IGNhbgordXNlICJiYWQiIGluIHBsYWNlIG9mICJpbnZhbGlkIiwgImluYXBwcm9wcmlhdGUiLCAidW5yZWNvZ25pemVkIi4uLgorU2ltaWxhcmx5IHdoZW4gYXRvbHhfcmFuZ2UoKSBjb21wbGFpbnMgYWJvdXQgcmFuZ2UgY29uc3RyYWludHMgd2l0aAorIjQgPCAxNyIgb3IgIjEyID4gNSIsIGl0J3MgaW50ZW50aW9uYWw6IHRob3NlIGRvbid0IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC48L3A+CisKKzxwPlRoZSBzdHJlcnJvcigpIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHBlcnJvcl9leGl0KCkgYW5kIGZyaWVuZHMgc2hvdWxkIGJlCitsb2NhbGl6ZWQgYnkgbGliYywgYW5kIG91ciBlcnJvciBmdW5jdGlvbnMgYWxzbyBwcmVwZW5kIHRoZSBjb21tYW5kIG5hbWUKKyh3aGljaCBub24tZW5nbGlzaCBzcGVha2VycyBjYW4gcHJlc3VtYWJseSByZWNvZ25pemUgYWxyZWFkeSkuIEtlZXAgdGhlCitleHBsYW5hdGlvbiBpbiBiZXR3ZWVuIHRvIGEgbWluaW11bSwgYW5kIHdoZXJlIHBvc3NpYmxlIGZlZWQgYmFjayB0aGUgdmFsdWVzCit0aGV5IHBhc3NlZCBpbiB0byBpZGVudGlmeSBfd2hhdF8gd2UgY291bGRuJ3QgcHJvY2Vzcy4KK0lmIHlvdSBzYXkgcGVycm9yX2V4aXQoInNldHNvY2tvcHQiKSwgeW91J3ZlIGlkZW50aWZpZWQgdGhlIGFjdGlvbiB5b3UKK3dlcmUgdHJ5aW5nIHRvIHRha2UsIGFuZCB0aGUgcGVycm9yIGdpdmVzIGEgdHJhbnNsYXRlZCBlcnJvciBtZXNzYWdlIChmcm9tIGxpYmMpCitleHBsYWluaW5nIF93aHlfIGl0IGNvdWxkbid0IGRvIGl0LCBzbyB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBhZGQgZW5nbGlzaAord29yZHMgbGlrZSAiZmFpbGVkIiBvciAiY291bGRuJ3QgYXNzaWduIi48L3A+CisKKzxwPkFsbCBjb21tYW5kcyBzaG91bGQgYmUgOC1iaXQgY2xlYW4sIHdpdGggZXhwbGljaXQKKzxhIGhyZWY9aHR0cDovL3lhcmNoaXZlLm5ldC9jb21wL2xpbnV4L3V0ZjguaHRtbD5VVEYtODwvYT4gc3VwcG9ydCB3aGVyZQorbmVjZXNzYXJ5LiBBc3N1bWUgYWxsIGlucHV0IGRhdGEgbWlnaHQgYmUgdXRmOCwgYW5kIGF0IGxlYXN0IHByZXNlcnZlCitpdCBhbmQgcGFzcyBpdCB0aHJvdWdoLiAoRm9yIHRoaXMgcmVhc29uLCBvdXIgYnVpbGQgaXMgLWZ1bnNpZ25lZC1jaGFyIG9uCithbGwgYXJjaGl0ZWN0dXJlczsgImNoYXIiIGlzIHVuc2lnbmVkIHVubGVzcyB5b3Ugc3RpY2sgInNpZ25lZCIgaW4gZnJvbnQKK29mIGl0Lik8L3A+CisKKzxwPkxvY2FsZSBzdXBwb3J0IGlzbid0IGN1cnJlbnRseSBhIGdvYWw7IHRoYXQncyBhIHByZXNlbnRhdGlvbiBsYXllciBpc3N1ZQorKEkuRS4gYSBHVUkgcHJvYmxlbSkuPC9wPgorCis8cD48aDM+U2hhcmVkIExpYnJhcmllczwvaDM+PC9wPgorCis8cD5Ub3lib3gncyBwb2xpY3kgb24gc2hhcmVkIGxpYnJhcmllcyBpcyB0aGF0IHRoZXkgc2hvdWxkIG5ldmVyIGJlCityZXF1aXJlZCwgYnV0IGNhbiBvcHRpb25hbGx5IGJlIHVzZWQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS48L3A+CisKKzxwPlRveWJveCBzaG91bGQgcHJvdmlkZSB0aGUgY29tbWFuZCBsaW5lIHV0aWxpdGllcyBmb3IKKzxhIGhyZWY9cm9hZG1hcC5odG1sI2Rldl9lbnY+c2VsZi1ob3N0aW5nIGRldmVsb3BtZW50IGV2aXJpb25tZW50czwvYT4sCithbmQgYW4gZWFzeSB3YXkgdG8gc2V0IHVwICJoZXJtZXRpYyBidWlsZHMiIChJLkUuIGJ1aWxkcyB3aGljaCBwcm92aWRlCit0aGVpciBvd24gZGVwZW5kZW5jaWVzLCBpc29sYXRpbmcgdGhlIGJ1aWxkIGxvZ2ljIGZyb20gaG9zdCBjb21tYW5kIHZlcnNpb24KK3NrZXcgd2l0aCBhIHNpbXBsZSBrbm93biBidWlsZCBlbnZpcm9ubWVudCkuIEluIGJvdGggY2FzZXMsIGV4dGVybmFsCitkZXBlbmRlbmNpZXMgZGVmZWF0IHRoZSBwdXJwb3NlLjwvcD4KKworPHA+VGhpcyBtZWFucyB0b3lib3ggc2hvdWxkIHByb3ZpZGUgZnVsbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgcmVseWluZworb24gYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcyAob3RoZXIgdGhhbiBsaWJjKS4gQnV0IHRveWJveCBtYXkgb3B0aW9uYWxseSB1c2UKK2xpYnJhcmllcyBzdWNoIGFzIHpsaWIgYW5kIG9wZW5zc2wgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgdGhpbmdzIGxpa2UKK2RlZmxhdGUgYW5kIHNoYTFzdW0sIHdoaWNoIGxldHMgdGhlIGNvcnJlc3BvbmRpbmcgYnVpbHQtaW4gaW1wbGVtZW50YXRpb25zCitiZSBzaW1wbGUgKGFuZCB0aHVzIHNsb3cpLiBCdXQgdGhlIGJ1aWx0LWluIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIGV4aXN0IGFuZAord29yay48L3A+CisKKzxwPihUaGlzIGlzIHdoeSB3ZSB1c2UgYW4gZXh0ZXJuYWwgaHR0cHMgd3JhcHBlciBwcm9ncmFtLCBiZWNhdXNlIGRlcGVuZGluZyBvbgorb3BlbnNzbCBvciBzaW1pbGFyIHRvIGJlIGxpbmtlZCBpbiB3b3VsZCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRveWJveC4pPC9wPgorCis8YSBuYW1lPSJjb2Rlc3R5bGUiIC8+Cis8aDI+Q29kaW5nIHN0eWxlPC9oMj4KKworPHA+VGhlIHJlYWwgY29kaW5nIHN0eWxlIGhvbHkgd2FycyBhcmUgb3ZlciB0aGluZ3MgdGhhdCBkb24ndCBtYXR0ZXIKKyh3aGl0ZXNwYWNlLCBpbmRlbnRhdGlvbiwgY3VybHkgYnJhY2tldCBwbGFjZW1lbnQuLi4pIGFuZCB0aHVzIGhhdmUgbm8KK29idmlvdXNseSBjb3JyZWN0IGFuc3dlci4gQXMgaW4gYWNhZGVtaWEsICJ0aGUgZmlnaHRpbmcgaXMgc28gdmljaW91cyBiZWNhdXNlCit0aGUgc3Rha2VzIGFyZSBzbyBzbWFsbCIuIFRoYXQgc2FpZCwgYmVpbmcgY29uc2lzdGVudCBtYWtlcyB0aGUgY29kZSByZWFkYWJsZSwKK3NvIGhlcmUncyBob3cgdG8gbWFrZSB0b3lib3ggY29kZSBsb29rIGxpa2Ugb3RoZXIgdG95Ym94IGNvZGUuPC9wPgorCis8cD5Ub3lib3ggc291cmNlIHVzZXMgdHdvIHNwYWNlcyBwZXIgaW5kZW50YXRpb24gbGV2ZWwsIGFuZCB3cmFwcyBhdCA4MAorY29sdW1ucy4gKEluZGVudGF0aW9uIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyBpcyBhd2t3YXJkIG5vIG1hdHRlciB3aGF0Cit5b3UgZG8sIHNvbWV0aW1lcyB0d28gc3BhY2VzIGxvb2tzIGJldHRlciwgc29tZXRpbWVzIGluZGVudGluZyB0byB0aGUKK2NvbnRlbnRzIG9mIGEgcGFyZW50aGVzZXMgbG9va3MgYmV0dGVyLik8L3A+CisKKzxwPkknbSBhd2FyZSB0aGlzIGluZGVudGF0aW9uIHN0eWxlIGNyZWVwcyBzb21lIHBlb3BsZSBvdXQsIHNvIGhlcmUncwordGhlIHNlZCBpbnZvY2F0aW9uIHRvIGNvbnZlcnQgZ3JvdXBzIG9mIHR3byBsZWFkaW5nIHNwYWNlcyB0byB0YWJzOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CitzZWQgLWkgJzpsb29wO3MvXlwoICpcKSAgL1wxXHQvO3QgbG9vcCcgZmlsZW5hbWUKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+QW5kIGhlcmUncyB0aGUgc2VkIGludm9jYXRpb24gdG8gY29udmVydCBsZWFkaW5nIHRhYnMgdG8gdHdvIHNwYWNlcyBlYWNoOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CitzZWQgLWkgJzpsb29wO3MvXlwoICpcKVx0L1wxICAvO3QgbG9vcCcgZmlsZW5hbWUKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+VGhlcmUncyBhIHNwYWNlIGFmdGVyIEMgZmxvdyBjb250cm9sIHN0YXRlbWVudHMgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb25zLCBzbworImlmIChibGFoKSIgaW5zdGVhZCBvZiAiaWYoYmxhaCkiLiAoTm90ZSB0aGF0IHNpemVvZiBpcyBhY3R1YWxseSBhbgorb3BlcmF0b3IsIHNvIHdlIGRvbid0IGdpdmUgaXQgYSBzcGFjZSBmb3IgdGhlIHNhbWUgcmVhc29uICsrIGRvZXNuJ3QgZ2V0CitvbmUuIFllYWgsIGl0IGRvZXNuJ3QgbmVlZCB0aGUgcGFyZW50aGVzZXMgZWl0aGVyLCBidXQgaXQgZ2V0cyB0aGVtLgorVGhlc2UgcnVsZXMgYXJlIG1vc3RseSB0byBtYWtlIHRoZSBjb2RlIGxvb2sgY29uc2lzdGVudCwgYW5kIHRodXMgZWFzaWVyCit0byByZWFkLikgV2UgYWxzbyBwdXQgYSBzcGFjZSBhcm91bmQgYXNzaWdubWVudCBvcGVyYXRvcnMgKG9uIGJvdGggc2lkZXMpLAorc28gImludCB4ID0gMDsiLjwvcD4KKworPHA+QmxhbmsgbGluZXMgKHZlcnRpY2FsIHdoaXRlc3BhY2UpIGdvIGJldHdlZW4gdGhvdWdodHMuICJXZSB3ZXJlIGRvaW5nIHRoYXQsCitub3cgd2UncmUgZG9pbmcgdGhpcy4iIChOb3QgYSBoYXJkIGFuZCBmYXN0IHJ1bGUgYWJvdXQgX3doZXJlXyBpdCBnb2VzLAorYnV0IHRoZXJlIHNob3VsZCBiZSBzb21lIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGluZyBoYXMgcGFyYWdyYXBoIGJyZWFrcy4pPC9wPgorCis8cD5WYXJpYWJsZSBkZWNsYXJhdGlvbnMgZ28gYXQgdGhlIHN0YXJ0IG9mIGJsb2Nrcywgd2l0aCBhIGJsYW5rIGxpbmUgYmV0d2VlbgordGhlbSBhbmQgb3RoZXIgY29kZS4gWWVzLCBjOTkgYWxsb3dzIHlvdSB0byBwdXQgdGhlbSBhbnl3aGVyZSwgYnV0IHRoZXkncmUKK2hhcmRlciB0byBmaW5kIGlmIHlvdSBkbyB0aGF0LiBJZiB0aGVyZSdzIGEgbGFyZ2UgZW5vdWdoIGRpc3RhbmNlIGJldHdlZW4KK3RoZSBkZWNsYXJhdGlvbiBhbmQgdGhlIGNvZGUgdXNpbmcgaXQgdG8gbWFrZSB5b3UgdW5jb21mb3J0YWJsZSwgbWF5YmUgdGhlCitmdW5jdGlvbidzIHRvbyBiaWcsIG9yIGlzIHRoZXJlIGFuIGlmIHN0YXRlbWVudCBvciBzb21ldGhpbmcgeW91IGNhbgordXNlIGFzIGFuIGV4Y3VzZSB0byBzdGFydCBhIG5ldyBjbG9zZXIgYmxvY2s/PC9wPgorCis8cD5JZiBzdGF0bWVudHMgd2l0aCBhIHNpbmdsZSBsaW5lIGJvZHkgZ28gb24gdGhlIHNhbWUgbGluZSBpZiB0aGUgcmVzdWx0CitmaXRzIGluIDgwIGNvbHVtbnMsIG9uIGEgc2Vjb25kIGxpbmUgaWYgaXQgZG9lc24ndC4gV2UgdXN1YWxseSBvbmx5IHVzZQorY3VybHkgYnJhY2tldHMgaWYgd2UgbmVlZCB0bywgZWl0aGVyIGJlY2F1c2UgdGhlIGJvZHkgaXMgbXVsdGlwbGUgbGluZXMgb3IKK2JlY2F1c2Ugd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGljaCBpZiBhbiBlbHNlIGJpbmRzIHRvLiBDdXJseSBicmFja2V0cyBnbworb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgdGVzdC9sb29wIHN0YXRlbWVudC4gVGhlIGV4Y2VwdGlvbiB0byBib3RoIGNhc2VzIGlzCitpZiB0aGUgdGVzdCBwYXJ0IG9mIGFuIGlmIHN0YXRlbWVudCBpcyBsb25nIGVub3VnaCB0byBzcGxpdCBpbnRvIG11bHRpcGxlCitsaW5lcywgdGhlbiB3ZSBwdXQgdGhlIGN1cmx5IGJyYWNrZXQgb24gaXRzIG93biBsaW5lIGFmdGVyd2FyZHMgKHNvIGl0IGRvZXNuJ3QKK2dldCBsb3N0IGluIHRoZSBtdWx0cGxlIGxpbmUgdmFyaWFibHkgaW5kZW50ZWQgbWVzcyksIGFuZCB3ZSBwdXQgaXQgdGhlcmUKK2V2ZW4gaWYgaXQncyBvbmx5IGdyb3VwaW5nIG9uZSBsaW5lIChiZWNhdXNlIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBpcyBub3QKK3Byb3ZpZGluZyBjbGVhciBpbmZvcm1hdGlvbiBpbiB0aGF0IGNhc2UpLjwvcD4KKworPHA+SS5FLjwvcD4KKworPGJsb2NrcXVvdGU+Cis8cHJlPgoraWYgKHRoaW5neSkgdGhpbmd5OworZWxzZSB0aGluZ3k7CisKK2lmICh0aGluZ3kpIHsKKyAgdGhpbmd5OworICB0aGluZ3k7Cit9IGVsc2UgdGhpbmd5OworCitpZiAoYmxhaCBibGFoIGJsYWguLi4KKyAgICAmJiBibGFoIGJsYWggYmxhaCkKK3sKKyAgdGhpbmd5OworfQorPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5Hb3RvcyBhcmUgYWxsb3dlZCBmb3IgZXJyb3IgaGFuZGxpbmcsIGFuZCBmb3IgYnJlYWtpbmcgb3V0IG9mCituZXN0ZWQgbG9vcHMuIEluIGdlbmVyYWwsIGEgZ290byBzaG91bGQgb25seSBqdW1wIGZvcndhcmQgKG5vdCBiYWNrKSwgYW5kCitzaG91bGQgZWl0aGVyIGp1bXAgdG8gdGhlIGVuZCBvZiBhbiBvdXRlciBsb29wLCBvciB0byBlcnJvciBoYW5kbGluZyBjb2RlCithdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gR290byBsYWJlbHMgYXJlIG5ldmVyIGluZGVudGVkOiB0aGV5IG92ZXJyaWRlIHRoZQorYmxvY2sgc3RydWN0dXJlIG9mIHRoZSBmaWxlLiBQdXR0aW5nIHRoZW0gYXQgdGhlIGxlZnQgZWRnZSBtYWtlcyB0aGVtIGVhc3kKK3RvIHNwb3QgYXMgb3ZlcnJpZGVzIHRvIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sLCB3aGljaCB0aGV5IGFyZS48L3A+CisKKzxwPldoZW4gdGhlcmUncyBhIHNob3J0ZXIgd2F5IHRvIHNheSBzb21ldGhpbmcsIHdlIHRlbmQgdG8gZG8gdGhhdCBmb3IKK2NvbnNpc3RlbmN5LiBGb3IgZXhhbXBsZSwgd2UgdGVuZCB0byBzYXkgIipibGFoIiBpbnN0ZWFkIG9mICJibGFoWzBdIiB1bmxlc3MKK3dlJ3JlIHJlZmVycmluZyB0byBtb3JlIHRoYW4gb25lIGVsZW1lbnQgb2YgYmxhaC4gU2ltaWxhcmx5LCBOVUxMIGlzCityZWFsbHkganVzdCAwIChhbmQgQyB3aWxsIGF1dG9tYXRpY2FsbHkgdHlwZWNhc3QgMCB0byBhbnl0aGluZywgZXhjZXB0IGluCit2YXJhcmdzKSwgImlmIChmdW5jdGlvbigpICE9IE5VTEwpIiBpcyB0aGUgc2FtZSBhcyAiaWYgKGZ1bmN0aW9uKCkpIiwKKyJ4ID0gKGJsYWggPT0gTlVMTCk7IiBpcyAieCA9ICFibGFoOyIsIGFuZCBzbyBvbi48L3A+CisKKzxwPlRoZSBnb2FsIGlzIHRvIGJlCitjb25jaXNlLCBub3QgY3J5cHRpYzogaWYgeW91J3JlIHdvcnJpZWQgYWJvdXQgdGhlIGNvZGUgYmVpbmcgaGFyZCB0bwordW5kZXJzdGFuZCwgc3BsaXR0aW5nIGl0IHRvIG11bHRpcGxlIHN0ZXBzIG9uIG11bHRpcGxlIGxpbmVzIGlzCitiZXR0ZXIgdGhhbiBhIE5PUCBvcGVyYXRpb24gbGlrZSAiIT0gTlVMTCIuIEEgY29tbW9uIHNpZ24gb2YgdHJ5aW5nIHRvCitoYXJkIGlzIG5lc3RpbmcgPyA6IHRocmVlIGxldmVscyBkZWVwLCBzb21ldGltZXMgaWYvZWxzZSBhbmQgYSB0ZW1wb3JhcnkKK3ZhcmlhYmxlIGlzIGp1c3QgcGxhaW4gZWFzaWVyIHRvIHJlYWQuIElmIHlvdSB0aGluayB5b3UgbmVlZCBhIGNvbW1lbnQsCit5b3UgbWF5IGJlIHJpZ2h0LjwvcD4KKworPHA+Q29tbWVudHMgYXJlIG5pY2UsIGJ1dCBkb24ndCBvdmVyZG8gaXQuIENvbW1lbnRzIHNob3VsZCBleHBsYWluIF93aHlfLAorbm90IGhvdy4gSWYgdGhlIGNvZGUgZG9lc24ndCBtYWtlIHRoZSBob3cgcGFydCBvYnZpb3VzLCB0aGF0J3MgYSBwcm9ibGVtIHdpdGgKK3RoZSBjb2RlLiBTb21ldGltZXMgY2hvb3NpbmcgYSBiZXR0ZXIgdmFyaWFibGUgbmFtZSBpcyBtb3JlIHJldmVhbGluZyB0aGFuIGEKK2NvbW1lbnQuIENvbW1lbnRzIG9uIHRoZWlyIG93biBsaW5lIGFyZSBiZXR0ZXIgdGhhbiBjb21tZW50cyBvbiB0aGUgZW5kIG9mCitsaW5lcywgYW5kIHRoZXkgdXN1YWxseSBoYXZlIGEgYmxhbmsgbGluZSBiZWZvcmUgdGhlbS4gTW9zdCBvZiB0b3lib3gncworY29tbWVudHMgYXJlIGM5OSBzdHlsZSAvLyBzaW5nbGUgbGluZSBjb21tZW50cywgZXZlbiB3aGVuIHRoZXJlJ3MgbW9yZSB0aGFuCitvbmUgb2YgdGhlbS4gVGhlIC8qIG11bHRpbGluZSAqLyBzdHlsZSBpcyB1c2VkIGF0IHRoZSBzdGFydCBmb3IgdGhlIG1ldGFkYXRhLAorYnV0IG5vdCBzbyBtdWNoIGluIHRoZSBjb2RlIGl0c2VsZi4gVGhleSBkb24ndCBuZXN0IGNsZWFubHksIGFyZSBlYXN5IHRvIGxlYXZlCithY2NpZGVudGFsbHkgdW50ZXJtaW5hdGVkLCBuZWVkIGV4dHJhIG5vbmZ1bmN0aW9uYWwgKiB0byBsb29rIHJpZ2h0LCBhbmQgaWYKK3lvdSBuZWVkIF90aGF0XyBtdWNoIGV4cGxhbmF0aW9uIG1heWJlIHdoYXQgeW91IHJlYWxseSBuZWVkIGlzIGEgVVJMIGNpdGF0aW9uCitsaW5raW5nIHRvIGEgc3RhbmRhcmRzIGRvY3VtZW50PyBMb25nIGNvbW1lbnRzIGNhbiBmYWxsIG91dCBvZiBzeW5jIHdpdGggd2hhdAordGhlIGNvZGUgaXMgZG9pbmcuIENvbW1lbnRzIGRvIG5vdCBnZXQgcmVncmVzc2lvbiB0ZXN0ZWQuIFRoZXJlJ3Mgbm8gc3VjaAordGhpbmcgYXMgc2VsZi1kb2N1bWVudGluZyBjb2RlIChpZiBub3RoaW5nIGVsc2UsIGNvZGUgd2l0aCBfbm9fIGNvbW1lbnRzCitpcyBhIGJpdCB1bmZyaWVuZGx5IHRvIG5ldyByZWFkZXJzKSwgYnV0ICJjaG9jb2xhdGUgc2F1Y2UgaXNuJ3QgdGhlIGFuc3dlcgordG8gYmFkIGNvb2tpbmciIGVpdGhlci4gRG9uJ3QgdXNlIGNvbW1lbnRzIGFzIGEgY3J1dGNoIHRvIGV4cGxhaW4gdW5jbGVhcgorY29kZSBpZiB0aGUgY29kZSBjYW4gYmUgZml4ZWQuPC9wPgorCis8IS0tI2luY2x1ZGUgZmlsZT0iZm9vdGVyLmh0bWwiIC0tPgpkaWZmIC0tZ2l0IGEvdG95Ym94L3d3dy9leHQyLmh0bWwgYi90b3lib3gvd3d3L2V4dDIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJkNmNkCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3d3dy9leHQyLmh0bWwKQEAgLTAsMCArMSwxMDggQEAKKzx0aXRsZT5Sb2IncyBleHQyIGRvY3VtZW50YXRpb248L3RpdGxlPgorCis8cD5UaGlzIHBhZ2UgZm9jdXNlcyBvbiB0aGUgZXh0MiBvbi1kaXNrIGZvcm1hdC4gIFRoZSBMaW51eCBrZXJuZWwncyBmaWxlc3lzdGVtCitpbXBsZW1lbnRhdGlvbiAodGhlIGNvZGUgdG8gcmVhZCBhbmQgd3JpdGUgaXQpIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGtlcm5lbAorc291cmNlLCBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDIudHh0LjwvcD4KKworPHA+Tm90ZTogZm9yIG91ciBwdXJwb3NlcywgZXh0MyBhbmQgZXh0NCBhcmUganVzdCBleHQyIHdpdGggc29tZSBleHRyYSBkYXRhCitmaWVsZHMuPC9wPgorCis8aDI+T3ZlcnZpZXc8L2gyPgorCis8aDI+QmxvY2tzIGFuZCBCbG9jayBHcm91cHM8L2gyPgorCis8cD5FdmVyeSBleHQyIGZpbGVzeXN0ZW0gY29uc2lzdHMgb2YgYmxvY2tzLCB3aGljaCBhcmUgZGl2aWRlZCBpbnRvIGJsb2NrCitncm91cHMuICBCbG9ja3MgY2FuIGJlIDFrLCAyaywgb3IgNGsgaW4gbGVuZ3RoLjxzdXBlcj48YSBocmVmPSIjMSI+WzFdPC9hPjwvc3VwZXI+CitBbGwgZXh0MiBkaXNrIGxheW91dCBpcyBkb25lIGluIHRlcm1zIG9mIHRoZXNlIGxvZ2ljYWwgYmxvY2tzLCBuZXZlciBpbgordGVybXMgb2YgNTEyLWJ5dGUgbG9naWNhbCBibG9ja3MuPC9wPgorCis8cD5FYWNoIGJsb2NrIGdyb3VwIGNvbnRhaW5zIGFzIG1hbnkgYmxvY2tzIGFzIG9uZSBibG9jayBjYW4gaG9sZCBhCitiaXRtYXAgZm9yLCBzbyBhdCBhIDFrIGJsb2NrIHNpemUgYSBibG9jayBncm91cCBjb250YWlucyA4MTkyIGJsb2NrcyAoMTAyNAorYnl0ZXMgKiA4IGJpdHMpLCBhbmQgYXQgNGsgYmxvY2sgc2l6ZSBhIGJsb2NrIGdyb3VwIGNvbnRhaW5zIDMyNzY4IGJsb2Nrcy4KK0dyb3VwcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgYXQgMCwgYW5kIG9jY3VyIG9uZSBhZnRlciBhbm90aGVyIG9uIGRpc2ssCitpbiBvcmRlciwgd2l0aCBubyBnYXBzIGJldHdlZW4gdGhlbS48L3A+CisKKzxwPkJsb2NrIGdyb3VwcyBjb250YWluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcywgaW4gb3JkZXI6PC9wPgorCis8dWw+Cis8bGk+U3VwZXJibG9jayAoc29tZXRpbWVzKTwvbGk+Cis8bGk+R3JvdXAgdGFibGUgKHNvbWV0aW1lcyk8L2xpPgorPGxpPkJsb2NrIGJpdG1hcDwvbGk+Cis8bGk+SW5vZGUgYml0bWFwPC9saT4KKzxsaT5Jbm9kZSB0YWJsZTwvbGk+Cis8bGk+RGF0YSBibG9ja3M8L2xpPgorPC91bD4KKworPHA+Tm90IGFsbCBibG9jayBncm91cHMgY29udGFpbiBhbGwgc3RydWN0dXJlcy4gIFNwZWNpZmljYWxseSwgdGhlIGZpcnN0IHR3bworKHN1cGVyYmxvY2sgYW5kIGdyb3VwIHRhYmxlKSBvbmx5IG9jY3VyIGluIHNvbWUgZ3JvdXBzLCBhbmQgb3RoZXIgYmxvY2sKK2dyb3VwcyBzdGFydCB3aXRoIHRoZSBibG9jayBiaXRtYXAgYW5kIGdvIGZyb20gdGhlcmUuICBUaGlzIGZyZWVzIHVwIG1vcmUKK2RhdGEgYmxvY2tzIHRvIGhvbGQgYWN0dWFsIGZpbGUgYW5kIGRpcmVjdG9yeSBkYXRhLCBzZWUgdGhlIHN1cGVyYmxvY2sKK2Rlc2NyaXB0aW9uIGZvciBkZXRhaWxzLjwvcD4KKworPHA+RWFjaCBzdHJ1Y3R1cmUgaW4gdGhpcyBsaXN0IGlzIHN0b3JlZCBpbiBpdHMnIG93biBibG9jayAob3IgYmxvY2tzIGluIHRoZQorY2FzZSBvZiB0aGUgZ3JvdXAgYW5kIGlub2RlIHRhYmxlcyksIGFuZCBkb2Vzbid0IHNoYXJlIGJsb2NrcyB3aXRoIGFueSBvdGhlcgorc3RydWN0dXJlLiAgVGhpcyBjYW4gaW52b2x2ZSBwYWRkaW5nIHRoZSBlbmQgb2YgdGhlIGJsb2NrIHdpdGggemVyb2VzLCBvcgorZXh0ZW5kaW5nIHRhYmxlcyB3aXRoIGV4dHJhIGVudHJpZXMgdG8gZmlsbCB1cCB0aGUgcmVzdCBvZiB0aGUgYmxvY2suPC9wPgorCis8cD5UaGUgbGludXgvZXh0Ml9mcy5oICNpbmNsdWRlIGZpbGUgZGVmaW5lcyBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaywKK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MsIHN0cnVjdCBleHQyX2lub2RlLCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiwgYW5kIGEgbG90CitvZiBjb25zdGFudHMuICBUb3lib3ggZG9lc24ndCB1c2UgdGhpcyBmaWxlIGRpcmVjdGx5LCBpbnN0ZWFkIGl0IGhhcyBhbiBlMmZzLmgKK2luY2x1ZGUgb2YgaXRzIG93biBjb250YWludGluZyBjbGVhbmVkLXVwIHZlcnNpb25zIG9mIHRoZSBkYXRhIGl0IG5lZWRzLjwvcD4KKworPGgyPlN1cGVyYmxvY2s8L2gyPgorCis8cD5UaGUgc3VwZXJibG9jayBjb250YWlucyBhIDEwMjQgYnl0ZSBzdHJ1Y3R1cmUsIHdoaWNoIHRveWJveCBjYWxscworInN0cnVjdCBleHQyX3N1cGVyYmxvY2siLiAgV2hlcmUgZXhhY3RseSB0aGlzIHN0cnVjdHVyZSBpcyB0byBiZSBmb3VuZCBpcworYSBiaXQgY29tcGxpY2F0ZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy48L3A+CisKKzxwPkZvciBjb3BpZXMgb2YgdGhlIHN1cGVyYmxvY2sgc3RvcmVkIGluIGJsb2NrIGdyb3VwcyBhZnRlciB0aGUgZmlyc3QsCit0aGUgc3VwZXJibG9jayBzdHJ1Y3R1cmUgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZQorZ3JvdXAsIHdpdGggemVybyBwYWRkaW5nIGFmdGVyd2FyZHMgaWYgbmVjZXNzYXJ5IChJLkUuIGlmIHRoZSBibG9jayBzaXplIGlzCitsYXJnZXIgdGhhbiAxaykuICBJbiBtb2Rlcm4gInNwYXJzZSBzdXBlcmJsb2NrIiBmaWxlc3lzdGVtcyAoZXZlcnl0aGluZworYW55b25lIHN0aWxsIGNhcmVzIGFib3V0KSwgdGhlIHN1cGVyYmxvY2sgb2NjdXJzIGluIGdyb3VwIDAgYW5kIGluIGxhdGVyIGdyb3VwcwordGhhdCBhcmUgcG93ZXJzIG9mIDMsIDUsIGFuZCA3LiAgKFNvIGdyb3VwcyAwLCAxLCAzLCA1LCA3LCA5LCAyNSwgMjcsIDQ5LCA4MSwKKzEyNSwgMjQzLCAzNDMuLi4pICBBbnkgYmxvY2sgZ3JvdXAgc3RhcnRpbmcgd2l0aCBhIHN1cGVyYmxvY2sgd2lsbCBhbHNvCitoYXZlIGEgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSwgYW5kIG9uZXMgdGhhdCBkb24ndCB3b24ndC48L3A+CisKKzxwPlRoZSB2ZXJ5IGZpcnN0IHN1cGVyYmxvY2sgaXMgd2VpcmQuICBUaGlzIGlzIGJlY2F1c2UgaWYgeW91IGZvcm1hdCBhbiBlbnRpcmUKK2Jsb2NrIGRldmljZSAocmF0aGVyIHRoYW4gYSBwYXJ0aXRpb24pLCB5b3Ugc3RvbXAgdGhlIHZlcnkgc3RhcnQgb2YgdGhlIGRpc2sKK3doaWNoIGNvbnRhaW5zIHRoZSBib290IHNlY3RvciBhbmQgdGhlIHBhcnRpdGlvbiB0YWJsZS4gIEJhY2sgd2hlbiBleHQyIG9uCitmbG9wcGllcyB3YXMgY29tbW9uLCB0aGlzIHdhcyBhIGJpZyBkZWFsLjwvcD4KKworPHA+U28gdGhlIHZlcnkgZmlyc3QgMTAyNCBieXRlcyBvZiB0aGUgdmVyeSBmaXJzdCBibG9jayBhcmUgYWx3YXlzIGxlZnQgYWxvbmUuCitXaGVuIHRoZSBibG9jayBzaXplIGlzIDEwMjQgYnl0ZXMsIHRoZW4gdGhhdCBibG9jayBpcyBsZWZ0IGFsb25lIGFuZCB0aGUKK3N1cGVyYmxvY2sgaXMgc3RvcmVkIGluIHRoZSBzZWNvbmQgYmxvY2sgaW5zdGVhZDxzdXBlcj48YSBocmVmPSIjMiI+WzJdPC9hPi4KK1doZW4gdGhlIGJsb2NrIHNpemUgaXMgbGFyZ2VyIHRoYW4gMTAyNCBieXRlcywgdGhlIGZpcnN0IHN1cGVyYmxvY2sgc3RhcnRzCisxMDI0IGJ5dGVzIGludG8gdGhlIGJsb2NrLCB3aXRoIHRoZSBvcmlnaW5hbCBkYXRhIHByZXNlcnZlZCBieSBta2UyZnMgYW5kCithcHByb3ByaWF0ZSB6ZXJvIHBhZGRpbmcgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKGlmIG5lY2Vzc2FyeSkuPC9wPgorCis8aDI+R3JvdXAgZGVzY3JpcHRvciB0YWJsZTwvaDI+Cis8aDI+QmxvY2sgYml0bWFwPC9oMj4KKzxoMj5Jbm9kZSBiaXRtYXA8L2gyPgorPGgyPklub2RlIHRhYmxlPC9oMj4KKzxoMj5EYXRhIGJsb2NrczwvaDI+CisKKzxoMj5EaXJlY3RvcmllczwvaDI+CisKKzxwPkZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBkaXJlY3RvcnkgZW50cmllcyBhcmUgNC1ieXRlIGFsaWduZWQgKHJlY19sZW4gaXMKK2EgbXVsdGlwbGUgb2YgNCksIHNvIHVwIHRvIDMgYnl0ZXMgb2YgcGFkZGluZyAoemVyb2VzKSBjYW4gYmUgYWRkZWQgYXQgdGhlIGVuZAorb2YgZWFjaCBuYW1lLiAgKFRoaXMgYWZmZWN0cyByZWNfbGVuIGJ1dCBub3QgdGhlIG5hbWVfbGVuLik8L3A+CisKKzxwPlRoZSBsYXN0IGRpcmVjdG9yeSBlbnRyeSBpbiBlYWNoIGJsb2NrIGlzIHBhZGRlZCB1cCB0byBibG9jayBzaXplLiAgSWYgdGhlcmUKK2lzbid0IGVub3VnaCBzcGFjZSBmb3IgYW5vdGhlciBzdHJ1Y3QgZXh0Ml9kZW50cnkgdGhlIGxhc3QgPC9wPgorCis8cD5RdWVzdGlvbjogaXMgdGhlIGxlbmd0aCBzdG9yZWQgaW4gdGhlIGlub2RlIGFsc28gcGFkZGVkIHVwIHRvIGJsb2NrIHNpemU/PC9wPgorCis8aHIgLz4KKzxwPjxhIG5hbWU9IjEiIC8+Rm9vdG5vdGUgMTogT24gc29tZSBzeXN0ZW1zIGJsb2NrcyBjYW4gYmUgbGFyZ2VyIHRoYW4gNGssIGJ1dAorZm9yIGltcGxlbWVudGF0aW9uIHJlYXNvbnMgbm90IGxhcmdlciB0aGFuIFBBR0VfU0laRS4gIFNvIHRoZSBBbHBoYSBjYW4gaGF2ZQorOGsgYmxvY2tzIGJ1dCBtb3N0IG90aGVyIHN5c3RlbXMgY291bGRuJ3QgbW91bnQgdGhlbSwgdGh1cyB5b3UgZG9uJ3Qgc2VlIHRoaXMKK291dCBpbiB0aGUgd2lsZCBtdWNoIGFueW1vcmUuPC9wPgorCis8cD48YSBuYW1lPSIyIiAvPkZvb3Rub3RlIDI6IEluIHRoaXMgY2FzZSwgdGhlIGZpcnN0X2RhdGFfYmxvY2sgZmllbGQgaW4gdGhlCitzdXBlcmJsb2NrIHN0cnVjdHVyZSB3aWxsIGJlIHNldCB0byAxLiAgT3RoZXJ3aXNlIGl0J3MgYWx3YXlzIDAuICBIb3cgdGhpcworY291bGQgUE9TU0lCTFkgYmUgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGFuIG9wZW4gcXVlc3Rpb24sIHNpbmNlIEEpIHlvdSBoYXZlIHRvCityZWFkIHRoZSBzdXBlcmJsb2NrIGJlZm9yZSB5b3UgY2FuIGdldCB0aGlzIGluZm9ybWF0aW9uLCBzbyB5b3Uga25vdyB3aGVyZQoraXQgY2FtZSBmcm9tLCBCKSB0aGUgZmlyc3QgY29weSBvZiB0aGUgc3VwZXJibG9jayBhbHdheXMgc3RhcnRzIGF0IG9mZnNldCAxMDI0CitubyBtYXR0ZXIgd2hhdCwgYW5kIGlmIHlvdXIgYmxvY2sgc2l6ZSBpcyAxMDI0IHlvdSBhbHJlYWR5IGtub3cgeW91IHNraXBwZWQgdGhlCitmaXJzdCBibG9jay48L3A+CmRpZmYgLS1naXQgYS90b3lib3gvd3d3L2ZhcS5odG1sIGIvdG95Ym94L3d3dy9mYXEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MmVhNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3d3dy9mYXEuaHRtbApAQCAtMCwwICsxLDQyIEBACis8aHRtbD48aGVhZD48dGl0bGU+dG95Ym94IG5ld3M8L3RpdGxlPgorPCEtLSNpbmNsdWRlIGZpbGU9ImhlYWRlci5odG1sIiAtLT4KKworPGgyPlE6ICJXaHkgaXMgdGhlcmUgdG95Ym94PyBXaGF0IHdhcyB3cm9uZyB3aXRoIGJ1c3lib3g/IjwvaDI+CisKKzxwPkE6IFRvIGFuc3dlciB0aGUgZmlyc3QgcGFydDogVG95Ym94IGRhdGVzIGJhY2sgdG8gd2hlbiBpdHMgbWFpbnRhaW5lcgorPGEgaHJlZj1odHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvMjAyMTA2Lz5oYW5kZWQgb2ZmIEJ1c3lCb3ggbWFpbnRhaW5lcnNoaXA8L2E+CithbmQgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAwNi5odG1sIzI4LTA5LTIwMDY+c3RhcnRlZCBvdmVyIGZyb20KK3NjcmF0Y2g8L2E+IG9uIGEgbmV3IGNvZGViYXNlIGFmdGVyIGEKKzxhIGhyZWY9aHR0cDovL2xpc3RzLmJ1c3lib3gubmV0L3BpcGVybWFpbC9idXN5Ym94LzIwMDYtU2VwdGVtYmVyLzA1ODYxNy5odG1sPnByb3RyYWN0ZWQgbGljZW5zaW5nIGFyZ3VtZW50PC9hPiB0b29rIGFsbCB0aGUgZnVuIG91dCBvZgord29ya2luZyBvbiBCdXN5Qm94LiBUb3lib3ggd2FzIGp1c3QgYSBwZXJzb25hbCBwcm9qZWN0IHVudGlsIGl0IGdvdAorPGEgaHJlZj1odHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNDc4MzA4Lz5yZWxpY2Vuc2VkIHllYXJzCitsYXRlcjwvYT4gYWZ0ZXIgaXRzIGF1dGhvciBkaWQgYSBsb3Qgb2YgdGhpbmtpbmcKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L3RhbGtzL29oaW8tMjAxMy50eHQ+YWJvdXQgbGljZW5zZXM8L2E+CithbmQgYWJvdXQgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAxMS5odG1sIzIxLTAzLTIwMTE+dGhlCit0cmFuc2l0aW9uIHRvIHNtYXJ0cGhvbmVzPC9hPi4gVGhpcyBsZWQgdG8gdGhlCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC90YWxrcy9jZWxmLTIwMTMudHh0PjIwMTM8L2E+Cis8YSBocmVmPWh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDA+dGFsazwvYT4gbGF5aW5nCitvdXQgYSBzdHJhdGVneSB0byBtYWtlIEFuZHJvaWQgc2VsZi1ob3N0aW5nLCB3aGljaCBoZWxwZWQKKzxhIGhyZWY9aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9NzY4NjE+YnJpbmcKK2l0IHRvIEFuZHJvaWQncyBhdHRlbnRpb248L2E+LCBhbmQgdGhleQorPGEgaHJlZj1odHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNjI5MzYyLz5tZXJnZWQgaXQ8L2E+IGludG8gQW5kcm9pZCBNLjwvcD4KKworPHA+VG8gYW5zd2VyIHRoZSBzZWNvbmQgcGFydDogQnVzeUJveCBwcmVkYXRlcyBBbmRyb2lkCitieSBhbG1vc3QgYSBkZWNhZGUsIGJ1dCBBbmRyb2lkIHN0aWxsIGRvZXNuJ3Qgc2hpcCB3aXRoIGl0IGJlY2F1c2UgR1BMdjMgY2FtZQorb3V0IGFyb3VuZCB0aGUgc2FtZSB0aW1lIEFuZHJvaWQgZGlkIGFuZCBjYXVzZWQgbWFueSBwZW9wbGUgdG8gdGhyb3cKK291dCB0aGUgR1BMdjIgYmFieSB3aXRoIHRoZSBHUEx2MyBiYXRod2F0ZXIuCitBbmRyb2lkIDxhIGhyZWY9aHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc291cmNlL2xpY2Vuc2VzLmh0bWw+ZXhwbGljaXRseQorZGlzY291cmFnZXM8L2E+IHVzZSBvZiBHUEwgYW5kIExHUEwgbGljZW5zZXMgaW4gaXRzIHByb2R1Y3RzLCBhbmQgaGFzIGdyYWR1YWxseQorcmVpbXBsZW1lbnRlZCBoaXN0b3JpY2FsIEdQTCBjb21wb25lbnRzIHN1Y2ggYXMgaXRzIGJsdWV0b290aCBzdGFjayB1bmRlciB0aGUKK0FwYWNoZSBsaWNlbnNlLiBTaW1pbGFybHksIEFwcGxlIGZyb3plIHhjb2RlIGF0IHRoZSBsYXN0IEdQTHYyIHJlbGVhc2VzCisoR0NDIDQuMi4xIHdpdGggYmludXRpbHMgMi4xNykgZm9yIG92ZXIgNSB5ZWFycyB3aGlsZSBpdCBzcG9uc29yZWQgdGhlCitkZXZlbG9wbWVudCBvZiBuZXcgcHJvamVjdHMgKGNsYW5nL2xsdm0vbGxkKSB0byByZXBsYWNlIHRoZW0sCitpbXBsZW1lbnRlZCBpdHMgU01CIHNlcnZlciBmcm9tIHNjcmF0Y2ggdG8gcmVwbGFjZSBzYW1iYSwKKzxhIGhyZWY9aHR0cDovL21ldGEuYXRoMC5jb20vMjAxMi8wMi8wNS9hcHBsZXMtZ3JlYXQtZ3BsLXB1cmdlLz5hbmQgc28KK29uPC9hPi4gVG95Ym94IGl0c2VsZiBleGlzdHMgYmVjYXVzZSBzb21lYm9keSB3aXRoIGluIGEgbGVnYWN5IHBvc2l0aW9uCitqdXN0IHdvdWxkbid0IHNodXQgdXAgYWJvdXQgR1BMdjMsIG90aGVyd2lzZSBpdHMgbWFpbnRhaW5lciB3b3VsZCBwcm9iYWJseQorc3RpbGwgaGFwcGlseSBiZSBtYWludGFpbmluZyBCdXN5Qm94LiAoRm9yIG1vcmUgb24gaG93IHNhaWQgbWFpbnRhaW5lciB3b3VuZAordXAgd29ya2luZyBvbiBidXN5Ym94IGluIHRoZSBmaXJzdCBwbGFjZSwKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvaGlzdG9yeS5odG1sPnNlZSBoZXJlPC9hPi4pPC9wPgorCis8IS0tI2luY2x1ZGUgZmlsZT0iZm9vdGVyLmh0bWwiIC0tPgpkaWZmIC0tZ2l0IGEvdG95Ym94L3d3dy9mb290ZXIuaHRtbCBiL3RveWJveC93d3cvZm9vdGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC93d3cvZm9vdGVyLmh0bWwKQEAgLTAsMCArMSw0IEBACis8L3RkPjwvdHI+PC90YWJsZT4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90b3lib3gvd3d3L2hlYWRlci5odG1sIGIvdG95Ym94L3d3dy9oZWFkZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzk2ODAwCi0tLSAvZGV2L251bGwKKysrIGIvdG95Ym94L3d3dy9oZWFkZXIuaHRtbApAQCAtMCwwICsxLDQzIEBACis8L2hlYWQ+Cis8IS0tIGJvZHkgc3R5bGU9ImJhY2tncm91bmQ6IHVybCh0b3ljYW5zLnBuZykgcmVwZWF0OyIgLS0+Cis8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0xMD4KKworPHRyPjx0ZCB2YWxpZ249dG9wPgorICA8aDE+dG95Ym94PC9oMT4KKworICA8Yj5BYm91dDwvYj4KKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSJpbmRleC5odG1sIj5OZXdzPC9hPjwvbGk+CisgICAgPGxpPldoYXQgaXMgaXQ/PGJyPgorICAgICAgLSA8YSBocmVmPSJhYm91dC5odG1sIj5BYm91dDwvYT48YnI+CisgICAgICAtIDxhIGhyZWY9InJvYWRtYXAuaHRtbCI+Um9hZG1hcDwvYT48YnI+CisgICAgICAtIDxhIGhyZWY9InN0YXR1cy5odG1sIj5TdGF0dXM8L2E+PGJyPgorICAgICAgLSA8YSBocmVmPSJoZWxwLmh0bWwiPkhlbHA8L2E+PGJyPgorICAgIDwvbGk+CisKKyAgICA8bGk+V2h5IGlzIGl0Pzxicj4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly95b3V0dS5iZS9TR210UDVMZ190MCI+dmlkZW88L2E+LzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L3RhbGtzL2NlbGYtMjAxMy50eHQ+b3V0bGluZTwvYT48YnI+CisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmgtb25saW5lLmNvbS9vcGVuL2ZlYXR1cmVzL0luc2lkZS10aGUtVG95Qm94LUFuLWludGVydmlldy13aXRoLVJvYi1MYW5kbGV5LTE0NDc0OTQuaHRtbCI+SW50ZXJ2aWV3PC9hPjxicj4KKyAgICA8L2xpPgorICA8L3VsPgorICA8Yj5Eb3dubG9hZDwvYj4KKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGFuZGxleS90b3lib3giPlNvdXJjZSBjb250cm9sPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9ImRvd25sb2FkcyI+UmVsZWFzZXM8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iYmluIj5CaW5hcmllczwvYT48L2xpPgorICA8L3VsPgorICA8Yj5EZXZlbG9wbWVudDwvYj4KKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSJkZXNpZ24uaHRtbCI+RGVzaWduIGdvYWxzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9ImNvZGUuaHRtbCI+U291cmNlIGNvZGUgd2Fsa3Rocm91Z2g8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2xpc3RzLmxhbmRsZXkubmV0L2xpc3RpbmZvLmNnaS90b3lib3gtbGFuZGxleS5uZXQiPk1haWxpbmcgTGlzdDwvYT4gKDxhIGhyZWY9aHR0cDovL25ld3MuZ21hbmUub3JnL2dtYW5lLmxpbnV4LnRveWJveD5iYWNrdXAgYXJjaGl2ZTwvYT4pPC9saT4KKyAgICA8bGk+SVJDICN0b3lib3ggb24gZnJlZW5vZGUubmV0PC9saT4KKyAgICA8bGk+PGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vbGFuZGxleS90b3lib3gvY29tbWl0cy9tYXN0ZXIuYXRvbT5Db21taXQgUlNTIGZlZWQ8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iL25vdGVzLmh0bWwiPk1haW50YWluZXIncyBCbG9nPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Y2xlYW51cC5odG1sPkNsZWFudXA8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj1odHRwOi8vd3d3Lm9obG9oLm5ldC9wL3RveWJveC1sYW5kbGV5PlN0YXRpc3RpY3M8L2E+PC9saT4KKyAgPC91bD4KKzwvdGQ+CisKKzx0ZCB2YWxpZ249dG9wPgorCmRpZmYgLS1naXQgYS90b3lib3gvd3d3L2luZGV4Lmh0bWwgYi90b3lib3gvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGRlZjJmMQotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC93d3cvaW5kZXguaHRtbApAQCAtMCwwICsxIEBACituZXdzLmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b3lib3gvd3d3L2xpY2Vuc2UuaHRtbCBiL3RveWJveC93d3cvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1MTA0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvd3d3L2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDUwIEBACis8aHRtbD48aGVhZD48dGl0bGU+VG95Ym94IExpY2Vuc2U8L3RpdGxlPgorPCEtLSNpbmNsdWRlIGZpbGU9ImhlYWRlci5odG1sIiAtLT4KKworPGgyPlRveWJveCBpcyByZWxlYXNlZCB1bmRlciB0aGUgZm9sbG93aW5nICJ6ZXJvIGNsYXVzZSIgQlNEIGxpY2Vuc2U6PC9oMj4KKworPGJsb2NrcXVvdGU+Cis8cD5Db3B5cmlnaHQgKEMpIDIwMDYgYnkgUm9iIExhbmRsZXkgJmx0O3JvYkBsYW5kbGV5Lm5ldCZndDsKKworPHA+UGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CitwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuPC9wPgorCis8cD5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKK1dJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCitBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCitXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KK0FDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCitPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLjwvcD4KKzwvYmxvY2txdW90ZT4KKworPHA+VGhlIHRleHQgb2YgdGhlIGFib3ZlIGxpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNlLjwvcD4KKworPGgyPldoeSAwQlNEPzwvaDI+CisKKzxwPkFzIHdpdGggPGEgaHJlZj1odHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLz5DQzA8L2E+LAorPGEgaHJlZj1odHRwOi8vdW5saWNlbnNlLm9yZz51bmxpY2Vuc2U8L2E+LCBhbmQgPGEgaHJlZj1odHRwOi8vd3RmcGwubmV0Lz53dGZwbDwvYT4sCit0aGUgaW50ZW50IGlzIHRvIHBsYWNlIHRoZSBsaWNlbnNlZCBtYXRlcmlhbCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLAord2hpY2ggYWZ0ZXIgZGVjYWRlcyBvZiBGVUQgKHN1Y2ggYXMgdGhlIHRpbWUgT1NJJ3MgZXgtbGF3eWVyIGNvbXBhcmVkCis8YSBocmVmPWh0dHA6Ly93d3cuY29kNS5vcmcvYXJjaGl2ZS8+cGxhY2luZyBjb2RlIGludG8gdGhlIHB1YmxpYyBkb21haW48L2E+IHRvCis8YSBocmVmPWh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLzYyMjU+YWJhbmRvbmluZyB0cmFzaCBieSB0aGUKK3NpZGUgb2YgYSBoaWdod2F5PC9hPikgaXMgY29uc2lkZXJlZCBzb21laG93IHVuc2FmZS4gQnV0IGlmIHNvbWUgcmFuZG9tIHRoaXJkCitwYXJ0eQorPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vbWtqL2Ryb3BiZWFyL2Jsb2IvbWFzdGVyL2xpYnRvbWNyeXB0L0xJQ0VOU0U+dGFrZXMKK3B1YmxpYyBkb21haW4gY29kZTwvYT4gYW5kIHNsYXBzIDxhIGhyZWY9aHR0cDovL3d3dy5vcGVuc291cmNlLmFwcGxlLmNvbS9zb3VyY2UvZ251emlwL2dudXppcC0yNS9nemlwL2d6aXAuYz5zb21lIG90aGVyIGxpY2Vuc2Ugb24gaXQ8L2E+LCB0aGVuIGl0J3MgZmluZS48L3A+CisKKzxwPlRvIHdvcmsgYXJvdW5kIHRoaXMgcGVyY2VwdGlvbiwgdGhlIGFib3ZlIGxpY2Vuc2UgaXMgYSBzdGFuZGFyZCAyLWNsYXVzZSBCU0QKK2xpY2Vuc2UgPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vbGFuZGxleS90b3lib3gvY29tbWl0L2VlODZiMWQ4ZTI1Y2IwY2E5ZDQxOGIzM2ViMGRjNWU3NzE2ZGRjMWU+bWludXMgdGhlIGhhbGYgc2VudGVuY2U8L2E+CityZXF1aXJpbmcgdGV4dCBjb3BpZWQgdmVyYmF0aW0gaW50byBkZXJpdmVkIHdvcmtzLiBJZiAyQlNEIGlzCitvaywgdGhlIDBCU0Qgc2hvdWxkIGJlIG9rLCBkZXNwaXRlIGJlaW5nIGVxdWl2YWxlbnQgdG8gcGxhY2luZyBjb2RlIGluIHRoZQorcHVibGljIGRvbWFpbi48L3A+CisKKzxwPk1vZGlmeWluZyB0aGUgbGljZW5zZSBpbiB0aGlzIHdheSBhdm9pZHMgdGhlIGhvbGUgYW5kcm9pZCB0b29sYm94IGZlbGwgaW50byB3aGVyZQorPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vYW5kcm9pZC9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL2ZkNGM2YjBhM2EyNTkyMWE5ZmUyNDY5MWE2OTVkNzE1YWVjYjZhZmUvdG9vbGJveC9OT1RJQ0U+MzMgY29waWVzIG9mIEJTRCBsaWNlbnNlIHRleHQ8L2E+Cit3ZXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB3aGVuIGNvcHlyaWdodCBkYXRlcyBjaGFuZ2VkLCBvciB0aGUgc3RyYW5nZQorc29sdXRpb24gdGhlIGJ1c3lib3ggZGV2ZWxvcGVycyB1c2VkIHRvIHJlc29sdmUgdGVuc2lvbiBiZXR3ZWVuIEdQTHYyJ3MgIm5vCithZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyIgYW5kIEJTRCdzICJ5b3UgbXVzdCBpbmNsdWRlIHRoaXMgbGFyZ2UgaHVuayBvZiB0ZXh0IgorYnkgc3RpY2tpbmcgdGhlIHR3byBsaWNlbnNlcyBhdAorPGEgaHJlZj1odHRwOi8vZ2l0LmJ1c3lib3gubmV0L2J1c3lib3gvdHJlZS9uZXR3b3JraW5nL3BpbmcuYz9pZD04ODdhMWFkNTdmZTk3OGNkMzIwYmUzNThlZmZiZTY2ZGY4YTA2OGJmPm9wcG9zaXRlIGVuZHMgb2YgdGhlIGZpbGU8L2E+IGFuZCBob3Bpbmcgbm9ib2R5Citub3RpY2VkLjwvYT4KKzwhLS0jaW5jbHVkZSBmaWxlPSJmb290ZXIuaHRtbCIgLS0+CmRpZmYgLS1naXQgYS90b3lib3gvd3d3L25ld3MuaHRtbCBiL3RveWJveC93d3cvbmV3cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjU0NzUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvd3d3L25ld3MuaHRtbApAQCAtMCwwICsxLDE3ODggQEAKKzxodG1sPjxoZWFkPjx0aXRsZT50b3lib3ggbmV3czwvdGl0bGU+Cis8IS0tI2luY2x1ZGUgZmlsZT0iaGVhZGVyLmh0bWwiIC0tPgorCis8cD5Ub3lib3ggY29tYmluZXMgY29tbW9uIExpbnV4IGNvbW1hbmQgbGluZSB1dGlsaXRpZXMgdG9nZXRoZXIKK2ludG8gYSBzaW5nbGUgQlNELWxpY2Vuc2VkIGV4ZWN1dGFibGUgdGhhdCdzIHNpbXBsZSwgc21hbGwsIGZhc3QsCityZWFzb25hYmx5IHN0YW5kYXJkcy1jb21wbGlhbnQsIGFuZCBwb3dlcmZ1bCBlbm91Z2ggdG8gdHVybiBBbmRyb2lkIGludG8KK2EgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIFNlZSB0aGUgbGlua3Mgb24gdGhlIGxlZnQgZm9yIGRldGFpbHMuPC9wPgorCis8aDI+TmV3czwvaDI+CisKKzxhIG5hbWU9IjAyLTAyLTIwMTYiIC8+PGEgaHJlZj0iIzAyLTAyLTIwMTYiPjxocj48aDI+PGI+RmVicnVhcnkgMiwgMjAxNjwvYj48L2gyPjwvYT4KKzxibG9ja3F1b3RlPjxwPiJJIGNoZWNrZWQgaXQgdmVyeSB0aG9yb3VnaGx5LCIgc2FpZCB0aGUgY29tcHV0ZXIsICJhbmQgdGhhdAorcXVpdGUgZGVmaW5pdGVseSBpcyB0aGUgYW5zd2VyLiBJIHRoaW5rIHRoZSBwcm9ibGVtLCB0byBiZSBxdWl0ZSBob25lc3Qgd2l0aAoreW91LCBpcyB0aGF0IHlvdSd2ZSBuZXZlciBhY3R1YWxseSBrbm93biB3aGF0IHRoZSBxdWVzdGlvbiBpcy4iCistIFRoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eS48L3A+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC43LjAudGFyLmd6PlRveWJveCAwLjcuMDwvYT4KKyg8YSBocmVmPWh0dHBzOi8vZ2l0aHViLmNvbS9sYW5kbGV5L3RveWJveC9yZWxlYXNlcy90YWcvMC43LjA+Z2l0IGNvbW1pdDwvYT4pCitpcyBvdXQuPC9wPgorCis8cD5UaGUgbmV3IGNvbW1hbmRzIGluIGRlZmNvbmZpZyBhcmUgPGI+aW90b3A8L2I+LCA8Yj50b3A8L2I+LCA8Yj5wZ3JlcDwvYj4sCithbmQgPGI+cGtpbGw8L2I+CisobW9zdCByZXBsYWNpbmcgY29ycmVzcG9uZGluZyB2ZXJzaW9ucyBmcm9tIHBlbmRpbmcpLiBBZGRlZCBncmVwIC1BQkMsCitzd2Fwb24gLWQgKGRpc2NhcmQpLCBta3N3YXAgLUwgKGxhYmVsKSBhbmQgVVVJRCBzdXBwb3J0LCBhbmQgZmluZCAtZGVsZXRlLgorSXphYmVyYSBhZGRlZCBmcmVlIC1oIGFuZCB1bnNoYXJlIC1mLiBKb3NoIEdhbyBpbXBsZW1lbnRlZCB0YWlsIC1mLgorSm9zZSBCb2xsbyBzdWJtaXR0ZWQgY3AgLS1wcmVzZXJ2ZT1jb250ZXh0LGF0dHIuIEt5bGllIE1jQ2xhaW4gYWRkZWQKK21rdGVtcCAtdS48L3A+CisKKzxwPkluIHBlbmRpbmcgdGhlcmUncyB0aGUgc3RhcnQgb2YgYSB2aSBjb21tYW5kLCBhbmQgU2FtZWVyIFByYWRoYW4gY29udHJpYnV0ZWQKK2EgbmV3IGRoY3A2LiBUaGlzIGN5Y2xlIHNhdyBzZXZlcmFsIHJvdW5kcyBvZiByb3V0ZSBjbGVhbnVwIGFuZCBhIGxpdHRsZSBkaGNwCitjbGVhbnVwLCBidXQgbmVpdGhlciBhcmUgY29tcGxldGUgeWV0LiBMaXBpIExlZSBkaWQgc29tZSBjbGVhbnVwIHRvIG5ldHN0YXQuYworYW5kIEVsbGlvdHQgSHVnaGVzIHJlbW92ZWQgd2FybmluZ3MgZnJvbSB0cmFjZXJvdXRlLjwvcD4KKworPHA+TG90cyBvZiB1cGRhdGVzIHRvIHBzOiBzZXZlcmFsIG5ldyAtbyBvcHRpb25zLCAtayAoLS1zb3J0KSAtTyBhbmQgLU0sCitpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggQW5kcm9pZCdzIGhpc3RvcmljYWwgYmVoYXZpb3IsIGFuZAorZXh0ZW5zaXZlIGludGVybmFsIGNvZGUgY2xlYW51cCAoaW5jbHVkaW5nIHRoZSByZW1vdmFsIG9mIGFsbAordGhlIG1hZ2ljIGNvbnN0YW50cykuPC9wPgorCis8aDM+PGI+V2Vic2l0ZTwvYj48L2gzPgorCis8cD5EcmVhbWhvc3QgcmVzdG9yZWQgdGhlIDxhIGhyZWY9IiMxMi0yMS0yMDE1Ij5taXNzaW5nIDExIG1vbnRoczwvYT4KK3RvIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZSwgaW4gdGhlIHByb2Nlc3MgZGVsZXRpbmcgdGhlIG1vbnRoIGFmdGVyCit0aGF0LiBOb3cgdGhleSd2ZSBhc2tlZCBpZiBJIGhhdmUgbWJveCBmaWxlcyBhcmNoaXZpbmcgdGhlIG5ldworZ2FwIChiZXR3ZWVuIERlY2VtYmVyIDIwLCAyMDE1IHRvIEphbnVhcnkgMjEsIDIwMTYsIGFuZCBwcmVzdW1hYmx5IHRoZXkKK2NvdWxkIGFsc28gZmlsbCBpbiB0aGUgZ2FwIGZyb20gRGVjZW1iZXIgMTQsIDIwMTQgdG8gSmFudWFyeSAzLCAyMDE1IHRoYXQncworYmVlbiB0aGVyZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZXkgZGlkIHRoaXMpLAorYnV0IGR1ZSB0byBzb21lIGdtYWlsIGZpbHRlcmluZyBJJ3ZlCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9ub3Rlcy0yMDEyLmh0bWwjMTUtMTAtMjAxMj5uZXZlcgorYmVlbiBhYmxlIHRvIGRpc2FibGU8L2E+LCBteSBjb3B5IG9mIHRob3NlIGZpbGVzIGlzIHNwcmVhZCBhbW9uZyAzIGRpZmZlcmVudAorbWJveCBmaWxlcyBJJ2QgaGF2ZSB0byBzb3J0L2ZpbHRlci9jb2xsYXRlLiAoSXQncyBvbiB0aGUgdG9kbyBsaXN0Lik8L3A+CisKKzxwPkFkZGVkIGEgY29kZSBvZiBjb25kdWN0IHRvIHRoZSBSRUFETUUgKHdlJ3JlCis8YSBocmVmPWh0dHBzOi8vZW5naW5lZXJpbmcudHdpdHRlci5jb20vb3BlbnNvdXJjZS9jb2RlLW9mLWNvbmR1Y3Q+Ym9ycm93aW5nIHR3aXR0ZXInczwvYT4pIGJlY2F1c2Ugc29tZWJvZHkKK21hZGUgaXQgbmVjZXNzYXJ5LjwvcD4KKworPGgzPjxiPkJ1Z2ZpeGVzPC9iPjwvaDM+Cis8cD5GaXhlZCBhbm90aGVyIHNlZCBidWcgd2hlcmUgYW55IF0gcmlnaHQgYWZ0ZXIgWyB3YXMgc2tpcHBlZCAobm90IGp1c3QgdGhlCitmaXJzdCBvbmUgaW4gdGhlIHJhbmdlLCBzbyBbW10gZGlkbid0IHRlcm1pbmF0ZSkuIEZpeGVkIHNvcnQgLWYgYW5kIGFkZGVkIHRlc3QgY2FzZXMuCitBc3N1bWUgODAgY29sdW1ucyBpbiAibHMgLW0gfCBjYXQiLCBscyAtTCBpcyBubyBsb25nZXIgYmFja3dhcmRzLAorYW5kIGxzIG9mIGZpbGVzIHdpdGggbm8gcGF0aHMgbm8gbG9uZ2VyIHVzZXMgYW4gdW5pbml0aWFsaXplZCAoemVybykgZGlyZmQuCitTZXZlcmFsIGJ1Z2ZpeGVzCit0byBmaW5kIChHaWxhZCBBcm5vbGQgZml4ZWQgLXBlcm0sIERhbmllbCBLLiBMZXZ5IGZpeGVkICJmaW5kIC4gLWV4ZWMgZWNobyB7fSIsCithbmQgd2hpbGUgd2UncmUgdGhlcmUgSSBmaXhlZCBmaW5kIC0tcHJ1bmUsIG1hZGUgImZpbmQgLiAtZXhlY2RpcgorZWNobyB7fSArIC1leGVjZGlyIGxzIHt9ICsiIHdvcmssIGFuZCByaXBwZWQgb3V0IHRoZSBlbnZpcm9ubWVudCBzaXplCittZWFzdXJpbmcgY29kZSB0aGF0IGNoZWNrZWQgZm9yIGEgMTI4ayBsaW1pdCByZW1vdmVkIGJhY2sgaW4gbGludXggMi42LjIyKS4KK0VsbGlvdHQgSHVnaGVzIGZpeGVkIHRoZSBkYXRlIGNvbW1hbmQncyBwYXJzaW5nIG9mIDQgZGlnaXQKK3llYXJzIGFuZCBkb2N1bWVudGVkIHRoZSAlcyBlc2NhcGUsIGZpeGVkIGh3Y2xvY2sgLXUsIGFuZCBwb2ludGVkIG91dAordGhhdCBydW5jb24gbmVlZHMgdG8gZXhlYyB0byBkbyBpdHMgam9iIChub3QgcmVjdXJzaXZlbHkgY2FsbCBhbm90aGVyCitjb21tYW5kX21haW4oKSBpbiB0aGUgc2FtZSBwcm9jZXNzKS4gVG9tIE1hcnNoYWxsIHJlcG9ydGVkIHRoYXQgYmxraWQgd2FzCitoYW5kbGluZyBleHQyIHdyb25nLiBNaWtlIE1vcmV0b24gY29ycmVjdGVkIGNwaW8gZXh0cmFjdGlvbidzIHVpZCBhbmQgZ2lkCit2YWx1ZXMsIGFuZCBhZGRlZCBhIC0tbm8tcHJlc2VydmUtb3duZXIgb3B0aW9uLiBGaXhlZCB0aGUgU1VJRCBwZXJtaXNzaW9uCitkcm9wcGluZyBsb2dpYyAod2hpY2ggd2FzIGEgYml0IG92ZXItemVhbG91cywgcHJldmVudGluZyBzb21lIGNvbW1hbmRzIGZyb20KK3J1bm5pbmcgYXQgYWxsKS48L3A+CisKKzxwPkknbSB0b2xkIHRoYXQgZGViaWFuLXRlc3RpbmcgYnJva2UgaXRzIGxpYmMgc28gdGhlIG5zZW50ZXIgYnVpbGQgYnJlYWtzLAorYnV0IG15IGF0dGVtcHRzIHRvIGluc3RhbGwgdGhlIGRlYmlhbi10ZXN0aW5nIG5ldHdvcmsgY2QgaW1hZ2UgdW5kZXIKK3FlbXUga2VlcCBicmVha2luZy4gTWF5YmUgc29tZWRheSB0aGV5J2xsIGZpeCBpdCBlbm91Z2ggSSBjYW4gYWN0dWFsbHkKK3JlcHJvZHVjZSB0aGUgcHJvYmxlbS4gKERlYm9vdHN0cmFwIHVuZGVyIHVuYnVudHUgYnVpbGRzIGFuIHVidW50dS1mbGF2b3JlZAorY2hyb290IGluIHdoaWNoIHRveWJveCBidWlsZHMgZmluZS4pPC9wPgorCis8aDM+PGI+RG9jdW1lbnRhdGlvbjwvYj48L2gzPgorPHA+UmV3cml0ZSBvZiB0aGUgYWJvdXQuaHRtbCBwYWdlLCB0d2Vha3MgdG8gZGVzaWduLmh0bWwsIGFuZCBhIHJlLXRyaWFnZSBvZgorc2Jhc2UgaW4gcm9hZG1hcC5odG1sLiBVcGRhdGUgdG8gbWtzdGF0dXMucHkgdG8gY29sbGF0ZSBtdWx0aXBsZSBzcGFuCit0YWdzIHdpdGggdGhlIHNhbWUgaWQsIHJlc3VsdGluZyBpbiBhIGxhcmdlciBzdGF0dXMuaHRtbCBwYWdlICh3aGljaAord2FzIHByZXZpb3VzbHkgaWdub3Jpbmcgc29tZSBjb21tYW5kcyBpbiB0aGUgcm9hZG1hcCkuPC9wPgorCis8cD5FeHBhbmRlZCB0aGUgZGVmY29uZmlnL2FsbHllc2NvbmZpZy9hbGxub2NvbmZpZ2hlbHAgdGV4dCBpbiAibWFrZSBoZWxwIgordG8gZXhwbGFpbiB3aGF0IHRoZXkncmUgZm9yLjwvcD4KKworPGgzPjxiPmluZnJhc3RydWN0dXJlPC9iPjwvaDM+Cis8dWw+Cis8bGk+PHA+RXhwYW5kZWQgdG95cy5vcHRhcmdzIHRvIDY0IGJpdHMgc28gYSBjb21tYW5kIGNhbiBoYXZlIG1vcmUgdGhhbiAzMiBvcHRpb25zLjwvcD48L2xpPgorPGxpPjxwPkFkZGVkIE5PRVhJVCgpIHdyYXBwZXIgdG8gdHVybiB4d3JhcCgpIGZ1bmN0aW9ucyBpbnRvIHdhcm5pbmcgdmVyc2lvbnMKK3VzaW5nIHRoZSBleGlzdGluZyBsb25nanVtcCh0b3lzLnJlYm91bmQpIGluZnJhc3RydWN0dXJlLjwvcD48L2xpPgorPGxpPjxwPlJlbmFtZWQgZGlydHJlZS0+ZGF0YSB0byBkaXJmZCBhbmQgc3RvcHBlZCBzdG9yaW5nIHN5bWxpbmsgbGVuZ3RoCitpbnRvIGl0ICh0aGlzIGZpeGVkIGEgYnVnIHdoZXJlIGZvbGxvd2luZyBzeW1saW5rcyB0byBkaXJlY3RvcmllcworZGlkbid0IGdpdmUgYSB2YWxpZCBkaXJlY3RvcnkgZmlsZWhhbmRsZSwgbm90aWNlYWJsZSB3aXRoIGxzIC1aKS48L3A+PC9saT4KKzxsaT48cD5OZXcgVEFHR0VEX0FSUkFZKCkgaW5mcmFzdHJ1Y3R1cmUgZ2VuZXJhdGVzIGluZGV4IGFuZCBiaXRtYXNrIG1hY3JvcworZm9yIGFycmF5cyBvZiBzdHJ1Y3R1cmVzIHN0YXJ0aW5nIHdpdGggYSBuYW1lIHN0cmluZy48L3A+PC9saT4KKzxsaT48cD5OZXcgbGliL2xpbmVzdGFjay5jIGZvciB1dGY4IGZvbnRtZXRyaWNzIChkcmF3X3N0cigpIGFuZCB1dGY4bGVuKCkKK2FuZCBzbyBvbiksIGFuZCBmb3IgdHJhY2tpbmcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dAorKHZpLCBsZXNzLCBzaGVsbCBoaXN0b3J5KSB0aGF0IG5lZWQgd29yZHdyYXBwaW5nIGFuZCBzY3JvbGxpbmcgdXAvZG93bi48L3A+PC9saT4KKzxsaT48cD5VcGdyYWRlcyB0byBsaWIvaW50ZXJlc3Rpbmd0aW1lcy5jOiBzY2FuX2tleSgpIG5vdyBoYXMgYSB0aW1lb3V0CitpbiBtaWxpc2Vjb25kcyBhbmQgcmVjb2duaXplcyBtb3JlIHNlcXVlbmNlcyBpbmNsdWRpbmcgQU5TSQord2luZG93IHNpemUgcHJvYmVzLiBOZXcgdXRmOCB0ZXN0IGZpbGVzIGluIHRlc3RzL2ZpbGVzL3V0ZjggaW5jbHVkaW5nCitzZXF1ZW5jZSByZXZlcnNpbmcsIHN0YWNrZWQgY29tYmluaW5nIGNoYXJzLCBhbmQgYWxsIHRocmVlIHR5cGVzIG9mCit1bnByaW50YWJsZSBzZXF1ZW5jZXMgKGxvdyBhc2NpaSA8MzIgYWxhIF5YLCBpbnZhbGlkIHV0Zjggc2VxdWVuY2VzIGFsYQorPEFCPjxDRD4sIGFuZCBpbnZhbGlkIHVuaWNvZGUgY29kZSBwb2ludHMgYWxhIFUrMTIzNCkuPC9wPjwvbGk+Cis8bGk+PHA+TW9yZSBjb21tYSBoYW5kbGluZyBjb2RlIGluIGxpYi5jOiBjb21tYV9hcmdzKCk8L3A+PC9saT4KKzxsaT48cD5BZGRlZCBlcnJvcl9tc2dfcmF3KCkgdG8gc2h1dCB1cCBmb3J0aWZ5J3MgZW5kbGVzcyBzdGF0aWMgY2hlY2tpbmcgZmFsc2UKK3Bvc2l0aXZlcy48L3A+PC9saT4KKzxsaT48cD5yZWFkZmlsZWF0KCkgY2FuIG5vdyByZWFsbG9jKCkgaW4gYSBsb29wIHRvIHJlYWQgbG9uZyBmaWxlcworKCJ6Y2F0IHwgaW5zbW9kIiBuZWVkZWQgaXQpLjwvcD48L2xpPgorPC91bD4KKworPGgzPjxiPlJvYWRtYXA8L2I+PC9oMz4KKzxwPldlJ3JlIGdldHRpbmcgY2xvc2UgdG8gaGF2aW5nIGEgc2VsZi1ob3N0aW5nIGRldmVsb3BtZW50IGVudmlyb25tZW50Cit1c2luZyB0b3lib3ggZm9yIHRoZSBjb21tYW5kIGxpbmUuIFRoZSByZW1haW5pbmcgYnVzeWJveCBjb21tYW5kcyBpbgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9hYm91dC5odG1sPkFib3JpZ2luYWwgTGludXg8L2E+IGFyZTo8L3A+CisKKzxibG9ja3F1b3RlPjxwPjxiPgorYXdrIGJ1bnppcDIgYnpjYXQgYnppcDIgZGQgZGlmZiBleHByIGZkaXNrIGZ0cGQgZnRwZ2V0IGZ0cHB1dCBndW56aXAgZ3ppcAorbGVzcyBwaW5nIHJvdXRlIHNoIHNoYTUxMnN1bSB0YXIgdGVzdCB0ciB1bnh6IHZpIHdnZXQgeHpjYXQgemNhdAorPC9iPjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkFuZCB0aGUgcmVtYWluaW5nIG5vbi1idXN5Ym94IGNvbW1hbmRzIGluIEFib3JpZ2luYWwgTGludXgncyBidWlsZC9ob3N0CitkaXJlY3RvcnkgKGZyb20gdGhlIGRpc3RjYywgZ2VuZXh0MmZzLCBlMmZzcHJvZ3MsIHpsaWIsIGFuZCBzcXVhc2hmcyBwYWNrYWdlc2kpCithcmU6PC9wPgorCis8YmxvY2txdW90ZT48cD48Yj4KK21rZTJmcyBmc2NrLmV4dDIgcmVzaXplMmZzIGRpc3RjYyBnZW5leHQyZnMgdW5zcXVhc2hmcyBkaXN0Y2NkIG1rc3F1YXNoZnMgdHVuZTJmcworPC9iPjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPlNxdWFzaGZzIGFuZCBkaXN0Y2MgYXJlIHByb2JhYmx5IG91dCBvZiBzY29wZSBmb3IgdG95Ym94LCBidXQgbWtlMmZzLAorZnNjay5leHQyLCByZXNpemUyZnMsIGdlbmV4dDJmcywgYW5kIHR1bmUyZnMgc2hvdWxkIGFsbCBiZSBhZGRlZCB0byB0aGUKK2Fib3ZlICJidXN5Ym94IiByZXBsYWNlbWVudCBsaXN0LjwvcD4KKworPHA+UmVtaW5kIG1lIHRvIGluY2x1ZGUgdGhpcyBjb3VudGRvd24gaW4gZnV0dXJlIHJlbGVhc2VzLiBPbmNlIHRoZXkndmUgYWxsCitiZWVuIHJlcGxhY2VkLCB0aGUgbmV4dCBnb2FsIGlzIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYWJvdXQuaHRtbCNzZWxmaG9zdD5idWlsZGluZyBBT1NQIHVuZGVyIGl0c2VsZjwvYT4uPC9wPgorCis8cD5TZWUgdGhlIGZ1bGwgPGEgaHJlZj1yb2FkbWFwLmh0bWw+cm9hZG1hcDwvYT4gYW5kIDxhIGhyZWY9c3RhdHVzLmh0bWw+c3RhdHVzPC9hPgorcGFnZXMgZm9yIG1vcmUgZGV0YWlscy48L3A+CisKKzxhIG5hbWU9IjEyLTIxLTIwMTUiIC8+PGEgaHJlZj0iIzEyLTIxLTIwMTUiPjxocj48aDI+PGI+RGVjZW1iZXIgMjEsIDIwMTU8L2I+PC9oMj48L2E+CisKKzxwPlllcywgMTEgbW9udGhzIGhhdmUgZ29uZSBtaXNzaW5nIGZyb20gdGhlIG1haWxpbmcgbGlzdCB3ZWIgYXJjaGl2ZS48L3A+CisKKzxwPlllc3RlcmRheSBldmVuaW5nIERyZWFtaG9zdCdzIG1haWxtYW4gc2VydmVyIHdlbnQgZG93biAodGltaW5nIG91dCB0cnlpbmcKK3RvIGNvbm5lY3QpLiBJIHBva2VkIHRoZW0gYWJvdXQgaXQsIHRoZXkKKzxhIGhyZWY9aHR0cHM6Ly90d2l0dGVyLmNvbS9sYW5kbGV5L3N0YXR1cy82Nzg3ODEyNzE2NzAxNDkxMjE+YmxhbWVkCitETlM8L2E+LCBJIGV4cGxhaW5lZCB0aGF0IHRoZSBoYW5nIHdhcyBfYWZ0ZXJfIHRoZSBETlMgbG9va3VwIGFuZAorZW50ZXJlZCB0aGUgZGlnIGluZm8gaW50byB0aGUgdHJvdWJsZSB0aWNrZXQgc2hvd2luZyB0aGUgSVBzIHRoZSBETlMKK3F1ZXJpZXMgd2VyZSByZXR1cm5pbmcsIHRoZXkgcmVpbnN0YWxsZWQgdGhlIHNlcnZlciBhdCB0aGF0IElQIGZyb20gd2hhdCBJCithc3N1bWUgd2FzIHRoZWlyIG1vc3QgcmVjZW50IGJhY2t1cCwgYW5kIHRoYXQncyBob3cgMTEgbW9udGhzIG9mIG1lc3NhZ2VzCit2YW5pc2hlZCBvdXQgb2YgdGhlIGFyY2hpdmUuPC9wPgorCis8cD5JJ3ZlIDxhIGhyZWY9aHR0cHM6Ly90d2l0dGVyLmNvbS9sYW5kbGV5L3N0YXR1cy82NzkxMTQ0NTE5NzU0NjcwMDg+Y29udGludWVkIHRvIHBva2UgdGhlbSBhYm91dCBpdDwvYT4gYnV0IEkgaG9uZXN0bHkgYmVsaWV2ZSB0aGF0J3MgdGhlIGJlc3QgdGhleQorY2FuIGRvLiA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9kcmVhbWhvc3QudHh0Pkxhc3QgdGltZTwvYT4KK3RoaXMgc29ydCBvZiB0aGluZyA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9kcmVhbWhvc3QyLnR4dD5oYXBwZW5lZDwvYT4KK3dlIHdlbnQgYmFjayBhbmQgZm9ydGggZm9yIG1vbnRocywgc28gSSBhZGRlZCBhIGxpbmsgdG8gYSBiYWNrdXAgd2ViCithcmNoaXZlIChpbiB0aGUgbmF2IGJhciBvbiB0aGUgbGVmdCkgdGhhdCBpc24ndCBjb250cm9sbGVkIGJ5IGRyZWFtaG9zdCwKK2FuZCB0aHVzIGRvZXNuJ3QgZ3JhdHVpdG91c2x5IGxvc2UgZGF0YSBvbiBhIHJlZ3VsYXIgYmFzaXMuIChJIG5vdGUKK3RoZSBlYXJsaWVyIGhvbGUgaW4gRHJlYW1ob3N0J3MgYXJjaGl2ZSB3YXMgbmV2ZXIgZml4ZWQgZWl0aGVyLiBUaGF0Cit3YXMgZGF0YSBuZXZlciBnZXR0aW5nIGFyY2hpdmVkLCB0aGlzIGlzIGEgeWVhcidzIHdvcnRoIG9mIGRhdGEgdGhhdAord2FzIGluIHRoZSBhcmNoaXZlIHVudGlsIHllc3RlcmRheSB2YW5pc2hpbmcgYWZ0ZXIgdGhlIGZhY3QuKTwvcD4KKworPHA+SWYgeW91J3JlIHdvbmRlcmluZyB3aHkgdGhlIDxhIGhyZWY9aHR0cDovL2xpc3RzLmxhbmRsZXkubmV0PnRvcCBsZXZlbDwvYT4KK2xpc3QgcGFnZSBoYXMgYmVlbiAidGVtcG9yYXJpbHkgZGlzYWJsZWQiIGZvciBtdWx0aXBsZSB5ZWFycyBub3cuLi4geW91J2QgaGF2ZQordG8gYXNrIERyZWFtaG9zdC4gSSBrbm93IEkgaGF2ZS4gTW9yZSB0aGFuIGEgZG96ZW4gdGltZXMuPC9wPgorCis8YSBuYW1lPSIwMy0xMS0yMDE1IiAvPjxhIGhyZWY9IiMwMy0xMS0yMDE1Ij48aHI+PGgyPjxiPk5vdmVtYmVyIDMsIDIwMTU8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iQWxyaWdodCwiIHNhaWQgRm9yZC4gIkhvdyB3b3VsZCB5b3UgcmVhY3QgaWYgSSBzYWlkIHRoYXQgSSdtCitub3QgZnJvbSBHdWlsZGZvcmQgYWZ0ZXIgYWxsLCBidXQgZnJvbSBhIHNtYWxsIHBsYW5ldCBzb21ld2hlcmUgaW4gdGhlIHZpY2luaXR5CitvZiBCZXRlbGdldXNlPyIgQXJ0aHVyIHNocnVnZ2VkIGluIGEgc28tc28gc29ydCBvZiB3YXkuICJJIGRvbid0IGtub3csIiBoZQorc2FpZCwgdGFraW5nIGEgcHVsbCBvZiBiZWVyLiAiV2h5IC0gZG8geW91IHRoaW5rIGl0J3MgdGhlIHNvcnQgb2YgdGhpbmcgeW91J3JlCitsaWtlbHkgdG8gc2F5PyIgLSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNi4xLnRhci5nej5Ub3lib3ggMC42LjE8L2E+CisoPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vbGFuZGxleS90b3lib3gvcmVsZWFzZXMvdGFnLzAuNi4xPmdpdCBjb21taXQ8L2E+KQoraXMgb3V0LjwvcD4KKworPHA+V2UgaGF2ZSBhIG5ldyA8Yj5wczwvYj4gY29tbWFuZCB3aXRoIGFsbCB0aGUgLW8gZmllbGRzIHBvc2l4IHdhbnRzIChhbHRob3VnaAoraXQgZG9lc24ndCBhY2NlcHQgQlNEIG5vbi1kYXNoIG9wdGlvbiBzeW50YXggeWV0KSwgYW5kIDxiPmJ1bnppcDI8L2I+IChub3QganVzdAorYnpjYXQgYnV0IHRoZSBwcm9wZXIgZXh0cmFjdC1pbi1wbGFjZSBjb21tYW5kKS4KK1NhbWVlciBQcmFkaGFuIGFkZGVkIDxiPmhvc3RpZDwvYj4gYW5kIDxiPmZzeW5jPC9iPi4KK0VsbGlvdHQgSHVnaGVzIGFkZGVkIDxiPmZsb2NrPC9iPi4KKworPHA+VGhlIHBlb3BsZSB3YWl0aW5nIGZvciA8Yj5odW1hbiByZWFkYWJsZSBudW1iZXIgc3VwcG9ydDwvYj4gKGR1IC1oSCwgbHMgLWgsCithbmQgc28gb24pIGNhbiB0aGFuayBFbGxpb3R0IEh1Z2hlcyBmb3IgaW1wbGVtZW50aW5nIGl0LiAoT3VyIG91dHB1dCBkb2Vzbid0CitleGFjdGx5IG1hdGNoIG90aGVycycgYmVjYXVzZSB3ZSBvdXIgImJpbmFyeSIgbW9kZSB3aWxsIHNheSAxLjBHIGluc3RlYWQgb2YKKzEwMjRNLCB3aGljaCBpcyBhIGJ1ZyBpbiB0aGUgb3RoZXIgb25lIHdlIGRpZG4ndCBlbXVsYXRlLik8L3A+CisKKzxwPlRoZSBvdGhlciBiaWcgbmV3cyBpcyA8Yj5ub21tdSBzdXBwb3J0PC9iPiwgdGVzdGVkIG9uIHRoZSBuZXcKKzxhIGhyZWY9aHR0cDovL25vbW11Lm9yZy9qY29yZT5qY29yZTwvYT4gcHJvY2Vzc29yIGJ1dCBwcmVzdW1hYnkgd29ya2luZworb24gYW55IG5vbW11IHN5c3RlbS4gQSBmZXcgY29tbWFuZHMgZG9uJ3Qgc3VwcG9ydCBub21tdSB5ZXQsIGJ1dCB0aG9zZQorYXJlIGRpc2FibGVkIGJ5IGRlcGVuZGVuY2llcyBvbiBUT1lCT1hfRk9SSyBpbiBtZW51Y29uZmlnIHdoZW4gYnVpbGRpbmcKK2ZvciBub21tdS4gVGhlIHJvYWRtYXAgbm93IGhhcyBhIGxhcmdlIHNlY3Rpb24gYW5hbHl6aW5nIHRoZSB1Q2xpbnV4Citwcm9qZWN0IChub3RlIHRoYXQgPGEgaHJlZj1odHRwOi8vbm9tbXUub3JnPm5vbW11Lm9yZzwvYT4gaXMgc2xvd2x5IHJlcGxhY2luZworPGEgaHJlZj1odHRwOi8vdWNsaW51eC5vcmc+dWNsaW51eC5vcmc8L2E+IGFzIHRoZSBzdGFuZGFyZCByZXBvc2l0b3J5IG9mCithbGwga25vd2xlZGdlIGFuZCB3aXNkb20gYWJvdXQgbm9tbXUuIFRoZSBvbGQgc2l0ZSA8YSBocmVmPSMxMi0wMi0yMDEyPmNvbnRhaW5zCittdWNoIHRoYXQgaXMgYXBvY3J5cGhhbDwvYT4sIG9yIGF0IGxlYXN0IHdpbGRseSBpbmFjY3VyYXRlLCBhbmQgdGhlIG5ldyBvbmUKK2lzIHRyeWluZyB0byBpbXByb3ZlIG9uIHRoYXQpLjwvcD4KKworPHA+Qm90aCAibWFrZSBjaGFuZ2UiIGFuZCBzY3JpcHRzL3NpbmdsZS5zaCAoZm9yIGJ1aWxkaW5nIHN0YW5kYWxvbmUgY29tbWFuZHMKK3dpdGhvdXQgdGhlIG11bHRpcGxleGVyIGxvZ2ljKSBub3cgdXNlIHRoZSB0b3AgbGV2ZWwgLmNvbmZpZworZm9yIHRveWJveCBnbG9iYWwgc2V0dGluZ3Mgc3VjaCBhcyBMaW51eCBTZWN1cml0eSBCbGFua2V0IE1vZHVsZSBzZWxlY3Rpb24sCisoc28gbWFrZSBkZWZjb25maWcgYmVmb3JlIGNoYW5nZSBub3cpLjwvcD4KKworPHA+RG9jdW1lbnRhdGlvbiB1cGRhdGVzIHRvIHRoZSA8YSBocmVmPWNvZGUuaHRtbD5jb2RlPC9hPiBhbmQKKzxhIGhyZWY9cm9hZG1hcC5odG1sPnJvYWRtYXA8L2E+IHBhZ2VzLjwvcD4KKworPGgzPnBlbmRpbmc8L2gzPgorCis8cD5JbiB0aGUgcGVuZGluZyBkaXJlY3RvcnkgU2FtZWVyIFByYWRoYW4gYWRkZWQgdGZ0cCwKK2FuZCBFbGxpb3R0IEh1Z2hlcyBzZW50IGxzb2YuIElzYWFjIER1bmhhbSB1cGdyYWRlZCBtZGV2LAorcmVib290LCBpbml0LCBsb2dpbiwgYW5kIG1vZHByb2JlLCBhbmQgZml4ZWQgYSBkaXN0cm8tc3BlY2lmaWMgYnVpbGQgYnJlYWsgaW4KK3NjcmlwdHMvbWtmbGFncy5oLiBFbGxpb3R0IEh1Z2hlcyBhbmQgTGlwaSBMZWUgbWFkZSBuZXRzdGF0IC1wIGhhbmRsZQorY29tbWFuZCBsaW5lcyBsb25nZXIgdGhhbiAyMSBjaGFyYWN0ZXJzLCBhbmQgRWxsaW90dCBmaXhlZCBuZXRzdGF0IC1lIGFuZAorc29tZSBidWlsZCB3YXJuaW5ncy4gWWVvbmdkZW9rIFN1aCBmaXhlZCBhIHdhcm5pbmcgaW4gZGhjcGQuCitJIHN0YXJ0ZWQgY2xlYW51cCBvbiBwZ3JlcC9wa2lsbC48L3A+CisKKzxoMz5Db21tYW5kIHVwZGF0ZXMsIGJ1Z2ZpeGVzLCBhbmQgaW5mcmFzdHJ1Y3R1cmU8L2gzPgorCis8cD5UaGUgbXVsdGlwbGV4ZXIncyAiY29tbWFuZCBub3QgZm91bmQiIGVycm9yIGV4aXQgaXMgbm93IDEyNywgc28gbm93IHlvdSBjYW4ndAorZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGNvbW1hbmQgbm90IGJlaW5nIGZvdW5kIGluIHRoZSBtdWx0aXBsZXhlciBhbmQKK3RoZSBtdWx0aXBsZXhlciBpdHNlbGYgbm90IGJlaW5nIGZvdW5kIGJ5IHRoZSBzaGVsbCwgYmVjYXVzZSBwZW9wbGUgd2FudGVkCit0aGF0IGZvciBzb21lIHJlYXNvbi48L3A+CisKKzxwPkVsbGlvdHQgSHVnaGVzIG1hZGUgZGF0ZSByZWplY3QgaW52YWxpZCBkYXRlcyByYXRoZXIKK3RoYW4gc2V0IHRoZSBjbG9jayB0byBzb21ldGhpbmcgd2VpcmQgKHNldHRpbmcgdGhlIGNsb2NrIDEwMCB5ZWFycyBpbnRvIHRoZQorZnV0dXJlIG1ha2VzIG1vc3QgTGludXggZGVza3RvcHMgc3VycHJpc2luZ2x5IHVuaGFwcHksIGFuZCBudHBkYXRlIHdvbid0IGZpeCBpdAorZWl0aGVyKSwgZml4ZWQgc2V2ZXJhbCBscyAtbCBkaXNwbGF5IGlzc3VlcyAodXNlci9ncm91cCBmaWVsZCBvcmRlcmluZywKK21ha2UgdXNlci9ncm91cC9sc21jb250ZXh0IGxlZnQgYWxpZ25lZCksIGRpZCB0aGUgYWZvcmVtZW50aW9uZWQKK2V4dGVuc2l2ZSB3b3JrIG9uIGh1bWFuIHJlYWRhYmxlIG51bWJlciBvdXRwdXQsIGZpeGVkIGlvbmljZSdzIGRlZmF1bHQKK2NsYXNzLCBmaXhlZCBhIG12IG92ZXJ3cml0ZSBidWcsIG1hZGUgZGYncyBjb2x1bW5zIGF1dG8tc2l6ZSwgYWRkZWQKKy0tcHBpZCBhbmQgLVogdG8gcHMsIGFuZCB0ZWFtZWQgdXAgd2l0aCBEYW5pZWwgSy4gTGV2eSB0byBmaXgKK2Egc2VnZmF1bHQgaW4gZmluZCdzIGhhbmRsaW5nIG9mIC1uZXdlciAtZ3JvdXAgb3IgLXVzZXIuPC9wPgorCis8cD5IeWVqaW4gS2ltIGFkZGVkIHN0YXQgLWMgJVQgc3VwcG9ydC4gQ29saW4gQ3Jvc3Mgd29ya2VkCitvbiB2bXN0YXQgZml4aW5nCithIGhlYWRlciBwcmludGluZyBidWcgYW5kIGNhbGN1bGF0aW5nIHRoZSBiaSBhbmQgYm8gY29sdW1ucyBpbiB0aGUgcmlnaHQKK3VuaXRzLiBJc2FiZWxsYSBQYXJha2lzcyByZXBvcnRlZCB0aGF0IHNlZCAtZSAiL3gvY1wiIC1lICJ5IiBhZGRlZCBhbiBleHRyYQorbmV3bGluZSBhbmQgdGhhdCBncmVwIC13ICdcKHhcKVwxJyBkaWRuJ3Qgd29yaywgYm90aCBub3cgZml4ZWQuCitBbGlzdGFpciBTdHJhY2hhbiBmaXhlZCBzZXZlcmFsIHByb2JsZW1zIHdpdGggc3dpdGNoX3Jvb3QuIEt5bGllIE1jQ2xhaW4KK3BvaW50ZWQgb3V0IGVudiBzaG91bGQgYmUgYWJsZSB0byBjbGVhciB2YXJpYWJsZXMgdmlhIE5BTUU9IHN5bnRheC4KK0RpbWEgS3Jhc25lciBhZGRlZCBzdXBwb3J0IGZvciBydW5uaW5nIGJsa2lkIHdpdGhvdXQgYSBwYXJ0aXRpb24gKHNvIGl0IHNob3dzCithbGwgcGFydGl0aW9ucykuIEh5ZWppbiBLaW0gc2VudCBpbiBhIGJ1bmNoIG9mIHN0YXRpYyBhbmFseXNpcyBidWcgcmVwb3J0cy48L3A+CisKKzxwPklzYWJlbGxhIFBhcmFraXNzIHJlcG9ydGVkIHRoYXQgc2VkIC1lICIveC9jXCIgLWUgInkiIGFkZGVkIGFuIGV4dHJhCituZXdsaW5lIGFuZCB0aGF0IGdyZXAgLXcgJ1woeFwpXDEnIGRpZG4ndCB3b3JrLCBib3RoIG5vdyBmaXhlZC4KK0FsaXN0YWlyIFN0cmFjaGFuIGZpeGVkIHNldmVyYWwgcHJvYmxlbXMgd2l0aCBzd2l0Y2hfcm9vdC4gS3lsaWUgTWNDbGFpbgorcG9pbnRlZCBvdXQgZW52IHNob3VsZCBiZSBhYmxlIHRvIGNsZWFyIHZhcmlhYmxlcyB2aWEgTkFNRT0gc3ludGF4LgorRGltYSBLcmFzbmVyIGFkZGVkIHN1cHBvcnQgZm9yIHJ1bm5pbmcgYmxraWQgd2l0aG91dCBhIHBhcnRpdGlvbiAoc28gaXQgc2hvd3MKK2FsbCBwYXJ0aXRpb25zKS4gSHllamluIEtpbSBzZW50IGluIGEgYnVuY2ggb2Ygc3RhdGljIGFuYWx5c2lzIGJ1ZyByZXBvcnRzLjwvcD4KKworPHA+VHdvIGxhcmdlIHRoaW5rbyBmaXhlcyBpbiBvbmVpdDogLTMgd2FzIGFsd2F5cyBlbmFibGVkICh3aGljaCB3b3VsZAorZXZlbnR1YWxseSBibG9jayBpZiB0aGUgY2hpbGQgbmV2ZXIgcmVhZCB0aGUgZXhpdGluZyBQSUQgbnVtYmVycyBmcm9tIGl0cyBmaWxlCitkZXNjcmlwdG9yICMzIHVudGlsIHRoZSBwaXBlIGZpbGxlZCB1cCksIGFuZCB0aGUgc2lnbmFsIGhhbmRsZXJzIHdlcmVuJ3QKK3NldCB1cCByaWdodCAoZm9yIHJlcXVlc3Rpbmcgc2VtaS1ncmFjZWZ1bCBoYWx0L3Bvd2Vyb2ZmL3JlYm9vdCkuCitDYWxsaW5nIGluc3RhbGwgd2l0aG91dCBhIG1vZGUgaXMgbm93IDA3NTUsIGFuZCBpbnN0YWxsIC1nIDAgbm8gbG9uZ2VyIGNsYXNoZXMKK3dpdGggY3AgLS1wcmVzZXJ2ZS4gQmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIGxzIC1yIG9uIHVucmVhZGFibGUKK2RpcmVjdG9yaWVzLCBhbmQgbHMgLVogbm93IHVzZXMgT19QQVRIICh3aXRoIHRoZSAvcHJvYy9zZWxmL2ZkLyVkCit3b3JrYXJvdW5kIGZvciBrZXJuZWwgc3R1cGlkaXR5IGFzIG5lY2Vzc2FyeSkuPC9wPgorCis8cD5EYXRlIG5vdyB1bmRlcnN0YW5kcyBAdW5peHRpbWVbLmZyYWN0aW9uXSBhbmQgdXNlcyAtRCBmb3IKK3RoZSBzZXQtc2lkZSBmb3JtYXQgKG1hdGNoaW5nIGJ1c3lib3gncyBleHRlbnNpb24gZm9yIHRoaXMpLiBUaGUgc2VxIC1mCitzdHJpbmcgbm93IGNoZWNrcyB0aGF0IGl0J3MgZ290IGV4YWN0bHkgb25lICVmIGVzY2FwZSB3aXRoIHRoZSBjb3JyZWN0CithdHRyaWJ1dGVzIChhbmQgYSB3aG9sZSBidW5jaCBvZiB0ZXN0IGNhc2VzIGZvciBpdCkuIEZpeGVkIGEgYnVnCitpbiBvZCB0aGF0IHNjcmV3ZWQgdXAgdGhlIHBvc2l0aW9uIGluZGljYXRvciBvbiBhcm0gYW5kIG1pcHMuCitJbiBzdGF0IHRoZSBkL2ggdW5pdHMgbW92ZWQgZnJvbSAlZCAlRCB0byB0aGUgZGVmYXVsdCBzdHJpbmcuCitBbmQgcGF0Y2ggY2FuIG5vdyBjb3JyZWN0bHkgYXBwbHkgaHVua3Mgd2l0aCB0cmFpbGluZyBjb250ZXh0IHRvIHRoZSBzdGFydCBvZgordGhlIGZpbGUuPC9wPgorCis8cD5UaGUgcHJvbXB0IGFyZ3VtZW50IG1vdmVkIG91dCBvZiB5ZXNubygpICh0aGUgY2FsbGVyIGNhbiBwcmludCB0aGUgcHJvbXB0Cit0aGVtc2VsdmVzKS4gUmVwbGFjZWQgdG95cy5leGl0aGVscCB3aXRoIGhlbHBfZXhpdCgpLiBBZGRlZCBuZXcKK1hWRk9SSygpIG1hY3JvLCBhbmQgeHBvcGVuX2JvdGgoKSBjYWxscyAvcHJvYy9zZWxmL2V4ZSB3aGVuIHBhc3NlZAorYSBOVUxMIGFyZ3YgKHNlZSBjcGlvIC1wIGZvciBleGFtcGxlIHVzYWdlKS4gUmVwbGFjZWQgdG95cy5yZWN1cnNlCit3aXRoIHRveXMuc3RhY2t0b3Agc28gdGhlIHJlY3Vyc2Ugb3IgcmUtZXhlYyBkZWNpc2lvbiBpcyBub3cgYmFzZWQKK29uIGJ5dGVzIG9mIHN0YWNrIHNwYWNlIHVzZWQuIE1hcmtlZCBhIGJ1bmNoIG9mIGNvbW1hbmQtbG9jYWwgZnVuY3Rpb25zCitzdGF0aWMuPC9wPgorCis8cD5OZXcgYWRkaXRpb25zIHRvIGxpYi8gaW5jbHVkZSBzdHJsb3dlcigpLCB4Y29ubmVjdCgpLCBhbmQgdGhlCithZm9yZW1lbnRpb25lZCBoZWxwX2V4aXQoKS4KK1RoZSB0ZXN0c3VpdGUgbm93IGhhcyBzb21lIGluZnJhc3RydWN0dXJlIHRlc3RzIGJhc2VkIG9uICJleGFtcGxlIgorY29tbWFuZHMgc3VjaCBhcyB0b3lzL2V4YW1wbGVzL3Rlc3RfaHVtYW5fcmVhZGFibGUuYy4KK1RoZSBsb2dpbiBjb21tYW5kIGZpbmFsbHkgZ290IGEgbG9uZy1vdmVyZHVlIGNsZWFudXAgKGl0J3Mgb25lIG9mIHRoZQorY29tbWFuZHMgdGhhdCBwcmVkYXRlIHRoZSAicGVuZGluZyIgZGlyZWN0b3J5IGJ1dCB3ZXJlIHBhcnQgb2YgdGhlIHJlYXNvbgorZm9yIGl0KS4gSGV4ZWRpdCBoYWQgYW4KK3VuaW5pdGlhbGl6ZWQgdmFyaWFibGUgKG9mIGNvdXJzZSBnY2MgZGlkbid0IHNwb3QgaXQsIGl0IHdhcyB0b28gYnVzeQord2FybmluZyBhYm91dCAibWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBidXQgbmV2ZXIgYWN0dWFsbHkgaXMiIHZhcmlhYmxlcykuPC9wPgorCis8cD5Ud2Vha2VkIG1ha2VmaWxlIHNvCisibWFrZSBDUk9TU19DT01QSUxFPXByZWZpeC0iIChhcyB3ZWxsIGFzICJDUk9TU19DT01QSUxFPXByZWZpeC0gbWFrZSIsCit3aGljaCBzdGlsbCB3b3JrcykuIFRveWJveCBpcyBub3cgaW5zdGFsbGVkIGNobW9kIC13IHNvIGJyb2tlbiBpbnN0YWxsZXJzCisobGlrZSB0aGUgYnVuemlwMiBwYWNrYWdlJ3MpIHRoYXQgdHJ5IHRvIG92ZXJ3cml0ZSBleGlzdGluZyBiaW5hcmllcyB3b24ndAora25vY2sgb3V0IHRoZSB3aG9sZSBvZiB0b3lib3guCitHQ0MgNS4yLjAgc3RvcHBlZCBiZWluZyBhYmxlIHRvIGNvbXBpbGUgTGludXggMi42LjEyJ3Mga2NvbmZpZywgYnV0Cit3ZSBhZGRlZCBhIHdvcmthcm91bmQuIFlvdSBjYW4gbm93IGJ1aWxkIHVwdGltZSB3aXRob3V0IHV0bXB4LmguCitBbGVqYW5kcm8gSm95YSBwb2ludGVkIG91dCB0aGF0IGVuYWJsaW5nIHNtYWNrIHJlcXVpcmVkIHNtYWNrIG9uIHRoZSBob3N0CithcyB3ZWxsIGFzIHRhcmdldCB3aGVuIGNyb3NzIGNvbXBpbGluZywgd2hpY2ggaXMgbm93IGZpeGVkLjwvcD4KKworPHA+Tm90ZTogdG95Ym94IGNhbiBhdXRvZGV0ZWN0IG5vbW11IHN1cHBvcnQgd2hlbiBidWlsZGluZyB3aXRoIGEgdUNsaWJjCit0b29sY2hhaW4gc3VjaCBhcyA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL2Rvd25sb2Fkcy9iaW5hcmllcy9vbGQvMS40LjMvY3Jvc3MtY29tcGlsZXItc2gyZWIudGFyLmd6PnRoZSBvbmUgZnJvbSBBYm9yaWdpbmFsIExpbnV4PC9hPiwKK2J1dCA8YSBocmVmPWh0dHA6Ly9naXRodWIuY29tL3JpY2hmZWxrZXIvbXVzbC1jcm9zcy1tYWtlPndpdGggbXVzbC1saWJjPC9hPgoreW91J2xsIGhhdmUgdG8gZW5hYmxlIENPTkZJR19UT1lCT1hfTVVTTF9OT01NVV9JU19CUk9LRU4gdG8gd29yayBhcm91bmQgdGhlCitmYWN0IHRoZXkgcHJvdmlkZSBhIG5vbi1mdW5jdGlvbmFsIGZvcmsoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zCistRU5PU1lTLCB0byBwcmV2ZW50IHlvdSBmcm9tIGNvbXBpbGUtdGltZSBwcm9iaW5nIGZvciBub21tdSBzdXBwb3J0IHdoZW4KK2Nyb3NzLWNvbXBpbGluZy4gVW5mb3J0dW5hdGVseSAicHJldmVudGluZyB5b3UgZnJvbSBwcm9iaW5nIiBzZWVtcyB0byBiZQorYW4gZXhwbGljaXQgcG9saWN5IHdpdGggbXVzbCwgdGhleSBhbHNvIGRvbid0IHByb3ZpZGUgYW4gIiNpZmRlZiBfX01VU0xfXyIKK2JlY2F1c2UgdGhlaXIgbGlicmFyeSBpcyBwZXJmZWN0IGFuZCB5b3UncmUgb25seSBldmVyIGFsbG93ZWQgdG8gd29yayBhcm91bmQKK290aGVyIHBlb3BsZSdzIGJ1Z3MsIG5vdCB0aGVpcnMuIFNvIHdlIGhhdmUgdG8gdXNlIG1lbnVjb25maWcgdG8gbWFudWFsbHkKK2VuYWJsZSBtdXNsLXNwZWNpZmljIGJ1ZyB3b3JrYXJvdW5kcy48L3A+CisKKzxhIG5hbWU9IjIzLTA3LTIwMTUiIC8+PGEgaHJlZj0iIzIzLTA3LTIwMTUiPjxocj48aDI+PGI+SnVseSAyMywgMjAxNTwvYj48L2gyPjwvYT4KKzxwPkkgcmVjcmVhdGVkIHRoZSA8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC42LjAudGFyLmd6PjAuNi4wIHNvdXJjZSB0YXJiYWxsPC9hPgorKG5ldyBzaGExc3VtIDA4ZmIxYzIzZjUyMGMyNWExNWYyNjJhOGE5NWVhNWI2NzZhOThkNTQpCitiZWNhdXNlIEkgZm9yZ290IHRvIGFkZCAtLXByZWZpeCB0byB0aGUgZ2l0IGFyY2hpdmUgY29tbWFuZCB3aGVuIEkgdXBkYXRlZAorbXkgcmVsZWFzZSBzY3JpcHQgZnJvbSBtZXJjdXJpYWwsIHNvIHRoZSBmaWxlcyB3ZXJlbid0IGluIGFuIGVuY2xvc2luZworZGlyZWN0b3J5LiAoT29vcHMuKTwvcD4KKworPGEgbmFtZT0iMTktMDctMjAxNSIgLz48YSBocmVmPSIjMTktMDctMjAxNSI+PGhyPjxoMj48Yj5KdWx5IDE5LCAyMDE1PC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+CitUaGUgcmVhc29uIHdoeSBpdCB3YXMgcHVibGlzaGVkIGluIHRoZSBmb3JtIG9mIGEgbWljcm8gc3ViIG1lc29uIGVsZWN0cm9uaWMKK2NvbXBvbmVudCBpcyB0aGF0IGlmIGl0IHdlcmUgcHJpbnRlZCBpbiBub3JtYWwgYm9vayBmb3JtLCBhbiBpbnRlcnN0ZWxsYXIKK2hpdGNoaGlrZXIgd291bGQgcmVxdWlyZSBzZXZlcmFsIGluY29udmVuaWVudGx5IGxhcmdlIGJ1aWxkaW5ncyB0byBjYXJyeSBpdAorYXJvdW5kIGluLiIgLSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkgPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNi4wLnRhci5nej5Ub3lib3ggMC42LjA8L2E+CisoPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vbGFuZGxleS90b3lib3gvcmVsZWFzZXMvdGFnLzAuNi4wPmdpdCBjb21taXQ8L2E+KQoraXMgb3V0LiAoWWVzLCBnaXQuIFNlZSB0aGUgPGEgaHJlZj0jMDUtMDQtMjAxNT5wcmV2aW91cyBuZXdzIGVudHJ5PC9hPi4pPC9wPgorCis8cD5Tb3JyeSBmb3IgdGhlIHVudXN1YWxseSBsb25nIGdhcCBiZXR3ZWVuIHJlbGVhc2VzLiBTaW5jZSBsYXN0IHJlbGVhc2UgWWUKK09sZGUgUHJvamVjdCBNYWludGFpbmVyIHRyYXZlbGVkIHRvIGphcGFuIHR3aWNlIGFuZCBoYWQgdHdvIG1vcmUgIm9uY2UKK2EgY2VudHVyeSIgZmxvb2RzIGF0IGhvbWUuIChQcm9iYWJseSBhIGNvaW5jaWRlbmNlLikgU3RpbGwgY2F0Y2hpbmcgdXAuPC9wPgorCis8aDM+PGI+Q0VMRi9FTEMgdGFsayBhbmQgV2lraXBlZGlhW2NpdGF0aW9uIG5lZWRlZF0gYXJ0aWNsZTwvYj48L2gzPgorCis8cD5JIGdhdmUgYW5vdGhlciBTdGF0ZSBPZiBUaGUgVG95Ym94IHRhbGsKKyg8YSBocmVmPWh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9MDRYd0FidFBtQWc+dmlkZW88L2E+Cis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC90YWxrcy9jZWxmLTIwMTUudHh0Pm91dGxpbmU8L2E+KSwgaW4gd2hpY2ggSQorcmVwZWF0IG15IDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLTIwMTMuaHRtbCMwNy0xMS0yMDEzPnBlcmVubmlhbDwvYT4KKzxhIGhyZWY9aHR0cHM6Ly90d2l0dGVyLmNvbS9sYW5kbGV5L3N0YXR1cy81NTczMDkyMjQ1MzU4NTEwMDk+Y29tcGxhaW50PC9hPgordGhhdCBXaWtpcGVkaWFbY2l0YXRpb24gbmVlZGVkXQorPGEgaHJlZj1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RveWJveD5zdGlsbDwvYT4KKzxhIGhyZWY9aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnVzeUJveCNDb250cm92ZXJzeV9vdmVyX1RveWJveD5zYXlzPC9hPgordG95Ym94IHdhcyByZWxpY2Vuc2VkIGJlZm9yZSBpdHMgaGlhdHVzLCB3aGVuIHJlbGljZW5zaW5nIHdhcyB3aHkKK3RoZSBoaWF0dXMgZW5kZWQuPC9wPgorCis8cD5TaW5jZSBXaWtpcGVkaWFbY2l0YXRpb24gbmVlZGVkXSBzZWVtcyB1bmFibGUgdG8gZG8gdGhlCis8YSBocmVmPSMxNS0xMS0yMDExPm1vc3Q8L2E+Cis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9oZy90b3lib3gvbG9nL3RpcC9MSUNFTlNFPmJhc2ljPC9hPgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAxMS5odG1sIzEzLTExLTIwMTE+cmVzZWFyY2g8L2E+IG9uCit0aGlzIHBvaW50LCBhbmQgaGFzIHN0dWNrIHRvIGFuIGluY29ycmVjdCBzZXF1ZW5jZSBvZiBldmVudHMgZm9yIHllYXJzLAorSSd2ZSBiZWVuIGdyYWR1YWxseSBlc2NhbGF0aW5nIG15IGF0dGVtcHRzIHRvIGNvcnJlY3QgdGhlbS4gVG95Ym94CitjYW1lIG91dCBvZiBtb3RoYmFsbHMgaW4gTm92ZW1iZXIgMjAxMSA8Yj5iZWNhdXNlPC9iPiBpdCBjb3VsZCBiZQorcmVsaWNlbnNlZC4gVGhhdCdzIHdoYXQgb3BlbmVkIHVwIGEgbmV3IG5pY2hlIGJ1c3lib3ggd2Fzbid0IGFscmVhZHkKK2ZpbGxpbmcgd2l0aCBhIDEwIHllYXIgaGVhZHN0YXJ0LjwvcD4KKworPGEgbmFtZT0iYXN0ZXJpc2tfYmFjayIgLz4KKzxwPlRoZSBhcnRpY2xlIGhhcyBwbGVudHkgb2Ygc21hbGxlciBpc3N1ZXM8YSBocmVmPSNhc3Rlcmlzaz4qPC9hPiwgYnV0CitnaXZlbiB0aGF0IEkgZ2F2ZSBhbiBlbnRpcmUgdGFsayBhdCBPaGlvIExpbnV4RmVzdCBpbiAyMDEzCisoPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvdGFsa3Mvb2hpby0yMDEzLnR4dD5vdXRsaW5lPC9hPiwKKzxhIGhyZWY9aHR0cHM6Ly9hcmNoaXZlLm9yZy9kb3dubG9hZC9PaGlvTGludXhmZXN0MjAxMy8yNC1Sb2JfTGFuZGxleS1UaGVfUmlzZV9hbmRfRmFsbF9vZl9Db3B5bGVmdC5tcDM+YXVkaW88L2E+KSBvbiB3aHkgSSBzd2l0Y2hlZCBhd2F5IGZyb20gR1BMIGZvcgorbXkgcHJvamVjdHMsIHRoYXQgb25lIGJ1Z3MgbWUuPC9wPgorCis8aDM+PGI+TmV3IHN0dWZmIHRoaXMgcmVsZWFzZTwvYj48L2gzPgorCis8cD5UaGVyZSdzIGEgbmV3IGFuZHJvaWQgbWVudSBpbiBtZW51Y29uZmlnLCBhbmQgcmF0aGVyIGEgbG90IG9mIExpbnV4CitTZWN1cml0eSBNb2R1bGUgc3VwcG9ydCAoU21hY2sgZm9yIFRpemVuIGZyb20gWGF2aWVyIFJvY2hlIGFuZCBKb3PDqSBCb2xsbywKK2FuZCBTRUxpbnV4IGZvciBBbmRyb2lkIGZyb20gRWxsaW90dCBIdWdoZXM7IHNlZQordGhlIFNlY3VyaXR5IEJsYW5rZXQgbWVudSB1bmRlciBnbG9iYWwgc2V0dGluZ3MgaW4gbWVudWNvbmZpZykgaGFzCit0cmlja2xlZCBpbiwgYWx0aG91Z2ggdGhlcmUncyBzdGlsbCBtb3JlIHRvIGNvbWUuPC9wPgorCis8cD48Yj5OZXcgY29tbWFuZHM6PC9iPiBBZGRlZCByZXNldCwgbnByb2MsIGlvbmljZSwgYW5kIGlvcmVuaWNlLgorRWxsaW90dCBIdWdoZXMgY29udHJpYnV0ZWQgeHhkLCBydW5jb24sCityZXN0b3JlY29uLCBsb2FkX3BvbGljeSwgZ2V0ZW5mb3JjZSwgc2V0ZW5mb3JjZSwgZ2V0cHJvcCwgYW5kIHNldHByb3AuCitQcm9tb3RlZCBzaHJlZCwgbnNlbnRlciwgYW5kIGh3Y2xvY2suPC9wPgorCis8cD5Zb3UgY2FuIG9uY2UgYWdhaW4gYnVpbGQgY2F0diBub3cgdGhlIGZsYWcgaW5mcmFzdHJ1Y3R1cmUncyBiZWVuIHVwZGF0ZWQgdG8KK2xldCBpdCBjb2V4aXN0IHdpdGggY2F0IC12LgorQW5kIG9uIGEgbG9uZyBwbGFuZSBmbGlnaHQgSSB3cm90ZQoraGV4ZWRpdCwgYW4gaW50ZXJhY3RpdmUgaGV4IGVkaXRvciB0aGF0IGltcGxlbWVudHMgdGhlIHN0YXJ0IG9mCitjdXJzb3IgY29udHJvbCBpbmZyYXN0cnVjdHVyZSAoZm9yIGV2ZW50dWFsIHVzZSBieSBsZXNzIGFuZCB2aSBhbmQgc2hlbGwKK2NvbW1hbmQgaGlzdG9yeSBhbmQgc28gb24pLjwvcD4KKworPHA+PGI+TmV3IG9wdGlvbnM6PC9iPiBBZGRlZCBzZWQgLUUgYXMgYSBCU0QtY29tcGF0aWJsZSBzeW5vbnltIGZvciAtci4KK1VwZ3JhZGVkIG9uZWl0IHdpdGggLXIgKHJlc3RhcnQpLCAtMyAoc2VuZCBleGl0aW5nIFBJRCB2YWx1ZXMgdG8gY2hpbGQpLAorYW5kIHNpZ25hbCBoYW5kbGluZy4gQWRkZWQgLXYgb3B0aW9uIHRvIHRpbWVvdXQsIC1tIHRvIG1rbm9kLCAtdSB0byBzaHJlZCwKKy10IHRvIGRtZXNnLCBhbmQgLTEyMyB0byBoZWFkIGFuZCB0YWlsLiBBZGRlZCBpbXBsaWNpdCAiLiIgdG8gZ3JlcCAtciB3aXRob3V0CithbnkgZmlsZXMgdG8gd29yayBvbi4gSHllamluIEtpbSByZXF1ZXN0ZWQgcHJlZml4IHN1cHBvcnQgZm9yIHRydW5jYXRlIC1zLgorR3JlZyBIYWNrbWFuIGFkZGVkIC1pbnVtIHRvIGZpbmQuCitKYW4gQ3lidWxza2kgYWRkZWQgdGhlIHNtYWNrIHNpZGUgb2YgbHMgLVogc3VwcG9ydC4gVmFyaW91cyBwYXRjaGVzIGFsc28KK2FkZGVkIC1aIHRvIG1rZGlyLCBta25vZCwgYW5kIG1rZmlmby4KK0Jhc2ljIGNwIC0tcHJlc2VydmUgc3VwcG9ydCB3ZW50IGluLCBidXQgbm90IHlldCB0aGUgeGF0dHIvTFNNIHBhcnRzLjwvcD4KKworPHA+VGhlIHRveWJveCBjb21tYW5kIG5vdyBoYXMgYSAtLXZlcnNpb24gb3B0aW9uLAord2hpY2ggdXNlcyAiZ2l0IGRlc2NyaWJlIiBpZiBhdmFpbGFibGUuPC9wPgorCis8cD48Yj5CdWlsZCBpbmZyYXN0cnVjdHVyZTo8L2I+CitUaGUgIm1ha2UgY2hhbmdlIiB0YXJnZXQgbm93IHNhdmVzIHRoZSBvdXRwdXQgb2YgZWFjaCBmYWlsZWQgc3RhbmRhbG9uZQorY29tbWFuZCBidWlsZCBpbiBhIC5iYWQgZmlsZSwgYW5kICJtYWtlIGRlZmNvbmZpZyIgaXMgcXVpZXRlciBub3cuPC9wPgorCis8cD5QYXVsIEJhcmtlciBzdWJtaXR0ZWQgYSBsYXJnZSBwYXRjaCBjaGFuZ2luZyBjb21tYW5kIGluc3RhbGwgcGF0aHMgc28KKyJ0b3lib3ggY2FuIGJlIGluc3RhbGxlZCBhbG9uZ3NpZGUgYnVzeWJveCB3aXRob3V0IGNvbmZ1c2luZwordXBkYXRlLWFsdGVybmF0aXZlcyIuIChUaGVyZSdzIHNvbWUgYXJndW1lbnQgb3Zlcgord2hhdCB0aGUgcmlnaHQgcGF0aHMgc2hvdWxkIGJlLCBhbmQgSSdtIHdhaXRpbmcgZm9yCitwZW9wbGUgdG8gdGVsbCBtZSB3aGF0IGVsc2UgbmVlZHMgZml4aW5nIGJlY2F1c2UgSSBoYXZlIG5vIGlkZWEuIEkndmUKK2JlZW4gc3ltbGlua2luZyAvYmluIHRvIC91c3IvYmluIHNpbmNlIDIwMDIKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L3dyaXRpbmcvaGFja2VybW9udGhseS1pc3N1ZTAyMi1wZzMzLnBkZj5mb3IKK2hpc3RvcmljYWwgcmVhc29uczwvYT4uKTwvcD4KKworPHA+PGI+RG9jczo8L2I+IFRoZSByZXBvc2l0b3J5IGxpbmsgbm93IGdvZXMgdG8gZ2l0aHViLCB3aXRoIGFub3RoZXIgbGluawordG8gdGhlIGNvbW1pdCByc3MgZmVlZC48L3A+CisKKzxwPkVsbGlvdHQgSHVnaGVzIHVwZGF0ZWQgdGhlIEFuZHJvaWQgc2VjdGlvbiBvZiB0aGUgcm9hZG1hcAorKGFuZCBoZSB3b3VsZCBrbm93KS4gUmVkaWQgYml0cyBvZiBzY3JpcHRzL21rc3RhdHVzLnB5IHRvIG1ha2UgdXBkYXRpbmcKK3N0YXR1cy5odG1sIGVhc2llciwgYW5kIHRoZSBSRUFETUUgaXMgbGFyZ2VyLjwvcD4KKworPHA+TW9yZSBkZXNjcmlwdGlvbiBvZiBvcHRpb24gcGFyc2luZyBpbiBjb2RlLmh0bWwsIHdoaWNoIG5vdyBkZXNjcmliZXMgdGhlCitGTEFHX3ggbWFjcm9zLCBzd2l0Y2hpbmcgZmxhZyBtYWNybyBzZXRzIHdpdGggRk9SX25ld2NvbW1hbmQsIGhvdworY29uZmlndXJhdGlvbiB6ZXJvZXMgZmxhZyBtYWNyb3MgYW5kIHVzaW5nIEZPUkNFX0ZMQUdTIHRvIHN1cHByZXNzIHRoZQoremVyb2luZyBvZiBvcHRpb25zIHNoYXJlZCBiZXR3ZWVuIGNvbW1hbmRzLiBBbHNvIGFkZGVkIGRlc2NyaXB0aW9uIG9mICI7IgordG8gbWFrZSAtLWxvbmdvcHRzIHRha2UgYW4gb3B0aW9uYWwgPXZhbHVlIHBhcnQsIGFuZCBtb3JlIGFib3V0IFRPWUJPWF9ERUJVRwordG8gY2hlY2sgTkVXVE9ZKCkgb3B0aW9uIHN0cmluZ3MgKG90aGVyd2lzZSBhIGJhZCBvcHRpb24gc3RyaW5nIG1ha2VzCitsaWIvYXJncy5jIG9idmlvdXNseSBzZWdmYXVsdCwgYnV0IGRvZXNuJ3QgZXhwbGFpbiB3aHkpLjwvcD4KKworPHA+QWRkZWQgYSAiV2h5IDBCU0Q/IiBzZWN0aW9uIHRvIGxpY2Vuc2UuaHRtbCB3aGVuIHN1Ym1pdHRpbmcgemVybyBjbGF1c2UgYnNkCit0byBTUERYIChhY2NvcmRpbmcgdG8gdGhlIHBlbmRpbmcgbGljZW5zZSBzcHJlYWRzaGVldCwgaXQncyBiZWVuIGFwcHJvdmVkIGZvcgorU1BEWCAyLjIpLjwvcD4KKworPHA+VGhlIG9sZCBsaXN0IG9mIGNvbW1hbmRzIG5lZWRpbmcgY2xlYW51cCBidXQgbm90IGluIHBlbmRpbmcgd2FzCityZW1vdmVkIGZyb20gdG95cy9wZW5kaW5nL1JFQURNRSBhbmQgaW5zdGVhZCB0aGUgaXNzdWVzIHdlcmUgYWRkZWQKK2FzIFRPRE8gY29tbWVudHMgaW4gdGhlIGluZGl2aWR1YWwgY29tbWFuZHMuPC9wPgorCis8cD48Yj5CdWdmaXhlczo8L2I+CitGaXhlZCBtb3VudCAtYSBzZWdmYXVsdGluZyB3aXRob3V0IC1PIChyZXBvcnRlZCBieSBKYW51cyBUcm9lbHNlbiksCithbmQgbWFkZSBpdCB0cnkgYSAiYmVjb21lIHJ3IiBpb2N0bCgpIG9uIHRoZSBibG9jayBkZXZpY2UgYmVmb3JlIGZhbGxpbmcKK2JhY2sgdG8gbW91bnRpbmcgcmVhZCBvbmx5IChiZWNhdXNlIEFuZHJvaWQgZXhwZWN0cyB0aGF0KS4KK0ZpeGVkIHByaW50ZiAtLSBhbmQgcHJpbnRmIC0tLS4gTG90cyBvZiB0d2Vha3MgdG8gbHMgLWwgc3BhY2luZyB3aXRoCitkaWZmZXJlbnQgb3B0aW9ucy4gTWFrZSB0b3VjaCAtZCBhbmQgLXQgYWN0dWFsbHkgc2V0IHRpbWUgd2hlbiB5b3UgZG9uJ3QKK3NwZWNpZnkgbmFub3NlY29uZHMuCitGaXhlZCBhIHN1YnRsZSBidWcgd2hlcmUgcmVjdXJzaXZlIGNhbGxzICh0b3lib3ggY29tbWFuZHMgdGhhdCBydW4gb3RoZXIKK3RveWJveCBjb21tYW5kcykgd2VyZW4ndCByZXNldHRpbmcgYWxsIHRoZWlyIHN0YXRlLiAoVGhpcyBtYW5pZmVzdGVkIGFzCithICJubyB9IiBlcnJvciBmcm9tICJmaW5kIHwgeGFyZ3Mgc2VkIiwgYnV0IGNvdWxkIGNhdXNlIG90aGVyIHByb2JsZW1zLikKK0FuZCBEYXZpZCBIYWxscyByZXBvcnRlZCBhbm90aGVyIHNlZCBidWcgdHJ5aW5nIHRvIGNvbXBpbGUgbGliaWNvbnYgKHdoaWNoCitsZWZ0IGV4dHJhIFwgYXQgdGhlIHN0YXJ0IG9mIGxpbmVzIGluIGEgZ2VuZXJhdGVkIHNoZWxsIHNjcmlwdCwgYnJlYWtpbmcKK3RoZSBidWlsZCkuIE91dHB1dCBhbiBlcnJvciBtZXNzYWdlIGZvciAiY2F0IC9tbnQiLjwvcD4KKworPHA+S3lsaWUgTWNDbGFpbiByZXBvcnRlZCB0aGF0IG1rdGVtcCBicm9rZSB3aGVuICRUTVBESVIgd2FzIHNldCB0byBhbiBlbXB0eQorc3RyaW5nICh3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgdW5zZXQpLCB0aGF0IGluc3RhbGwvZmluZCBkaWRuJ3Qgc3VwcG9ydAorbnVtZXJpYyB1aWQvZ2lkcywgYW5kIHRoYXQgc29ydCAteiBhZmZlY3RzIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KK0lzYWJlbGxhIFBhcmFraXNzIGZpeGVkIGEgcHJpbnRmLmMgYnVnLgorRGF2aWQgSGFsbHMgZml4ZWQgYnVncyBpbiBpbnN0YWxsIC1EIGFuZCBmaW5kIC1leGVjLiBTYW11ZWwgSG9sbGFuZAorZml4ZWQgdW5zaGFyZSAtci4gSHllamluIEtpbSBmaXhlZCBtYWtlZGV2cyB3aXRoIGEgY291bnQgb2YgMSwgZm9sZCAtdworcmFuZ2UgY2hlY2tpbmcsIGFuIGVycm9yIHBhdGggaW4gc2NyaXB0cy9ta2ZsYWdzLmMsIGFkZGVkIC1pIHRvIGRoY3BkLAorYW5kIHN0b3BwZWQgc3UgZnJvbSBwcm9tcHRpbmcgdGhlIHJvb3QgdXNlciBmb3IgdGhlIG5ldyB1c2VyJ3MgcGFzc3dvcmQuCitKYW4gQ3lidWxza2kgc3BvdHRlZCB3cm9uZyBpbmRlbnRhdGlvbiB3aGVuIGNvbWJpbmluZyBscyAtcyBhbmQgLWkgd2l0aCAtQyBhbmQKKy14LiBKb3PDqSBCb2xsbyBmaXhlZCBzdGF0ICVHLiBTYW1lZXIgUHJhZGhhbiBmaXhlZCBhIGJ1ZyBpbiBta2ZpZm8gLVouPC9wPgorCis8cD5FbGxpb3R0IEh1Z2hlcyBhc2tlZCBmb3IgYSBkZWZhdWx0IFNJR1BJUEUgaGFuZGxlciB0byBkaXNhYmxlCit0aGUgc2lnbmFsIGhhbmRsZXIgYmlvbmljJ3MgZHluYW1pYyBsb2FkZXIgaW5zdGFsbHMgKHllcyByZWFsbHkpLiBTdGlsbCBub3QKKzEwMCUgc3VyZSB3aGF0IHRoZSBjb3JyZWN0IGJlaGF2aW9yIGlzIHRoZXJlLiAoUG9zaXggaXMKKyg8YSBocmVmPWh0dHA6Ly9wZXJtYWxpbmsuZ21hbmUub3JnL2dtYW5lLmNvbXAuc3RhbmRhcmRzLnBvc2l4LmF1c3Rpbi5nZW5lcmFsLzEwOTE1PmFjdGl2ZWx5IHVuaGVscGZ1bDwvYT4sIGJ1dCBhdCBsZWFzdCB0aGV5J3JlIHRha2luZworPGEgaHJlZj1odHRwOi8vYXVzdGluZ3JvdXBidWdzLm5ldC92aWV3LnBocD9pZD03ODkjYzE5NzY+eWVhcnMgdG8KK21ha2UgdXAgdGhlaXIgbWluZDwvYT4uIEVsbGlvdHQgYWxzbyBzZW50IHBhdGNoZXMgdG8gZml4IGEgdHlwbyBpbgordXNlcmFkZC50ZXN0LCBhZGQgbWlzc2luZyBhcmd1bWVudHMgdG8gZXJyb3JfZXhpdCgpIGNhbGxzIGFuZCBjbGVhbiB1cAorcHJpbnRmKCkgZm9ybWF0IHN0cmluZ3MsIGZpeCBhbiBvZmYgYnkgb25lIGVycm9yIGluIGh1bWFuX3JlYWRhYmxlKCksCitmaXggZG1lc2cgLWMgZXJyb3IgcmVwb3J0aW5nLCBmaXggYSBzZWdmYXVsdCBpbiBjb21tYV9zY2FuIHdoZXJlIHRoZSBvcHRpb24KK3dhcyB0aGUgbGFzdCBpdGVtIGluIG9wdGxpc3QgKHRyaWdnZXJlZCBieSBtb3VudCAtbyBybyxyZW1vdW50KSwgZml4Citod2Nsb2NrIC13LCBtYWRlIGlmY29uZmlnIHByaW50IGxvd2VyY2FzZSBNQUMgYWRkcmVzc2VzIChpdCB3YXMgYm90aGVyaW5nCitoaW0pLCBhbmQgbWFrZSB0ZXJtaW5hbF9zaXplKCkgcmVhZCB0aGUgcmlnaHQgZW52aXJvbm1lbnQgdmFyaWFibGUKKyhMSU5FUywgbm90IFJPV1MpLiBBbmQgaGUgc3VnZ2VzdGVkIHRoZSB0ZXN0IHN1aXRlIG5vdGljZSBoaWdoIGNvbW1hbmQgZXhpdAordmFsdWVzIChjb3JyZXNwb25kaW5nIHRvIHNlZ2ZhdWx0IG9yIG90aGVyIHNpZ25hbHMpLjwvcD4KKworPHA+UGVvcGxlIGFyZSBhcHBhcmVudGx5IHVzaW5nIHRveXMvcGVuZGluZyBjb21tYW5kcywgZGVzcGl0ZSB0aGUgcG9saWNlIHRhcGUKK2FuZCBmbGFzaGluZyBsaWdodHMsIHNvIGFkZGVkIGxvdWRlciB3YXJuaW5ncyB0byB0b3lzL3BlbmRpbmcvUkVBRE1FLgorRWxsaW90dCBIdWdoZXMgZml4ZWQgdmFyaW91cyBwcm9ibGVtcyB3aXRoIHRhciwgZGQsIG1vcmUsIGFuZCB0b3AuCitIeWVqaW4gS2ltIGNsZWFuZWQgdXAgc3lzbG9nZCBhbmQgZHVtcGxlYXNlcy4gSXNhYWMgRHVuaGFtIGFkZGVkIGhvdHBsdWcKK3N1cHBvcnQgdG8gbWRldi4gWWVvbmdkZW9rIFN1aCBhZGRlZCBSRkMtMzMxNSBpcHY2IHN1cHBvcnQgdG8gZGhjcGQuPC9wPgorCis8cD5JIHJld3JvdGUgcHMuYyBmcm9tIHNjcmF0Y2ggKGluIHBlbmRpbmcpLCBidXQgaXQncyBub3QgcmVhZHkgZm9yIHJlYWwgdXNlCit5ZXQuPC9wPgorCis8cD48Yj5Qb3J0YWJpbGl0eTo8L2I+CitPbiB0aGUgcG9ydGFiaWxpdHkgZnJvbnQgQmVybmhhcmQgUm9zZW5rcmFuemVyIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0aGUKK21lbnVjb25maWcgY29kZSB3b3VsZG4ndCBjb21waWxlIGluIEM5OSBtb2RlLiAoVGhpcyBsZWQgdG8gbWUgZG9jdW1lbnRpbmcKK3RoZSBjcmFwdGFjdWxhciBuYXR1cmUgb2Yga2NvbmZpZyBpbiBhIFJFQURNRSwgYW5kIHRoZSBwbGFuIHRvIHJlcGxhY2UgaXQKK3NvbWV0aW1lIGJlZm9yZSAxLjAuKSBTb21lIGV4dHJhIGZsYWdzIHRvIHNodXQgdXAgb3ZlcnplYWxvdXMgbGx2bSB3YXJuaW5ncword2VyZSBhZGRlZCAoYW5kIGhhdmUgdG8gYmUgcHJvYmVkIGZvciBiZWNhdXNlIGdjYyBjb21wbGFpbnMgYWJvdXQKK2FyZ3VtZW50cyBpdCBkb2Vzbid0IHJlY29nbml6ZSBldmVuIHdoZW4gdGhleSBzd2l0Y2ggc3R1ZmYgX29mZl8gdXNpbmcKK2Egc3RhbmRhcmQgc3ludGF4KS4gRG9uJ3QgZGVwZW5kIG9uIG1hbGxvYygwKSB0byByZXR1cm4gbm9uLW51bGwgaW4gbHMuCitEYXZpZCBIYWxscyBmaXhlZCBzb21lIG1hYy9pb3MgcG9ydGFiaWxpdHkgaXNzdWVzLAoraW1wbHlpbmcgc29tZWJvZHkncyBidWlsdCBhdCBsZWFzdCBwYXJ0IG9mIHRveWJveCBvbiBhIG1hYy48L3A+CisKKzxwPkFkZGVkIGJhc2VuYW1lX3IoKSB0byBsaWIvbGliLmMgYmVjYXVzZSB0aGUgcG9zaXggc2VtYW50aWNzIGZvciBiYXNlbmFtZSgpCithcmUgc3R1cGlkIGJ1dCB3aGF0IHRoZSBnbnUgZ3V5cyBkaWQgdG8gaXQgd2FzIGFwcGFsbGluZy4KK1R1cm5zIG91dCBiaW9uaWMgYWxyZWFkeSBoYWQgYSBiYXNlbmFtZV9yKCksIGJ1dCBwb3NpeCBzdGlsbCBkb2Vzbid0LgorRml4ZWQgaXQgdXAgaW4gcG9ydGFiaWxpdHkuaCwgYnV0IHRoaXMKK2NvdWxkIGJyZWFrIG1vcmUgc3R1ZmYgaW4gZnV0dXJlLiAoQ29ycmVjdCBmaXggaXMgdG8gbG9iYnkgcG9zaXggdG8gYWRkIGl0LAord2hpY2ggd291bGQgcHJvYmFibHkgdGFrZSBhYm91dCAxNSB5ZWFycy4uLik8L3A+CisKKzxwPjxiPkluZnJhc3RydWN0dXJlOjwvYj4KK1RoZSBidWlsZCBub3cgY2hlY2tzICRMREZMQUdTIGZvciBsaW5rZXItb25seSBmbGFncywgYW5kIGFsbG93cyB0aGUgc3RyaXAKK2NvbW1hbmQgdG8gZmFpbCAoYmluZmx0IHRvb2xjaGFpbnMgcHJvdmlkZSBhIHN0cmlwIHRoYXQgZG9lc24ndCB3b3JrKS4KK1NpbmNlIHRpbWUuYyB1c2VzIGZsb2F0aW5nIHBvaW50LCBhZGRlZCBUT1lCT1hfRkxPQVQgZGVwZW5kZW5jeSBpbiBjb25maWcuPC9wPgorCis8cD5UaGVyZSdzIGEgbGliL2xzbS5oIGRlZmluaW5nIHZhcm91cyBpbmxpbmUgZnVuY3Rpb25zIGZvciBsaW51eAorc2VjdXJpdHkgbW9kdWxlcyBzdHVmZiwgaWYgKGxzbV9lbmFibGVkKCkpIHNob3VsZCB0dXJuIGludG8gYSBjb21waWxlLXRpbWUKK2NvbnN0YW50IDAgYW5kIGxldCBjb2RlIGRyb3Agb3V0IHdoZW4gVE9ZQk9YX0xTTV9OT05FIHNlbGVjdGVkLCBidXQKK3Rlc3RpbmcgYWdhaW5zdCBDRkdfVE9ZQk9YX0xTTV9OT05FIG9yIGRlcml2ZWQgc3ltYm9scyBpcyBzdGlsbCB1c2VmdWwKK2JlY3Vhc2Ugd2hlbiBpdCBfaXNfIGVuYWJsZWQgdGhlIHByb2JlIHR1cm5zIGludG8gYSBzeXN0ZW0gY2FsbCB5b3UKK2Rvbid0IHdhbnQgdG8gcmVwZWF0IHRvbyBtdWNoLjwvcD4KKworPHA+U3dpdGNoZWQgYSBidW5jaCBvZiBjb21tYW5kcyBmcm9tIHNpZ25hbCgpIHRvIHhzaWduYWwoKS4gRmFjdG9yZWQgb3V0Cit4Z2V0Z3JuYW1pZCgpIGFuZCB4Z2V0cHduYW1pZCgpIGludG8geHdyYXAuYy4gTWFrZSB0aW1lLmMgZGVwZW5kIG9uCitUT1lCT1hfRkxPQVQgKHNpbmNlIGl0IGFsd2F5cyB1c2VzIGZsb2F0IHNvIHNob3VsZG4ndCBiZSBhdmFpbGFibGUgb24KK2J1aWxkIHRhcmdldHMgd2l0aG91dCBldmVuIHNvZnR3YXJlIGZsb2F0KS4gQWRkZWQgcmVhZGZpbGVhdCgpIHRvIGxpYi9saWIuYy48L3A+CisKKzxwPlRoZSBkaXJ0cmVlIGluZnJhc3RydWN0dXJlIG5vdyBwYXNzZXMgaW4gZnVsbCBmbGFncyBmb3IgdGhlIG9sZCBzeW1saW5rCitmaWVsZCwgYW5kIHRoZSBuZXcgRElSVFJFRV9TSFVUVVAgZmxhZyBkaXNhYmxlcyB3YXJuaW5ncyBpZiBhIGZpbGUgdmFuaXNoZXMKK291dCBmcm9tIHVuZGVyIHlvdSBkdXJpbmcgdHJhdmVyc2UuIE5ldyBkaXJ0cmVlX3N0YXJ0KCkgd3JhcHBlciB0bworY3JlYXRlIGRpcnRyZWUgcm9vdCB3aXRoIG9ubHkgdHdvIGFyZ3VtZW50cy48L3A+CisKKzxwPlRoZSBub3QtY3Vyc2VzIGluZnJhc3RydWN0dXJlIGludHJvZHVjZWQgYnkgaGV4ZWRpdCBtb3N0bHkgbW92ZWQgdG8KK2xpYi9pbnRlcmVzdGluZ3RpbWVzLmMuPC9wPgorCis8YSBuYW1lPSJhc3RlcmlzayIgLz4KKzxhIGhyZWY9IiNhc3Rlcmlza19iYWNrIiAvPkFzdGVyaXNrOjwvYT4gc3VjaCB3aGVuCitUaW0gY29udGFjdGVkIG1lIChteSBibG9nIHNheXMgYSBjb3VwbGUgZGF5cyBiZWZvcmUgbm92IDEzLCAyMDExLCBJLkUuCisxMS8xMS8xMSBub3Qgc29tZSBzcGVjaWZpYyBkYXkgMiBtb250aHMgbGF0ZXIpIHRvIGFzayBpZiBJIHdhbnRlZCB0byB3b3JrCitvbiBhIG5ldyBwcm9qZWN0IGhlIHdhcyBwcm9wb3NpbmcgY2FsbGVkCis8YSBocmVmPWh0dHA6Ly93d3cuZWxpbnV4Lm9yZy9CdXN5Ym94X3JlcGxhY2VtZW50X3Byb2plY3Q+QmVudG9Cb3g8L2E+CisoYmVjYXVzZSBJIHVzZWQgdG8gZG8gYnVzeWJveCwgaGUnZCBmb3Jnb3R0ZW4gdG95Ym94IGV4aXN0ZWQKK3VudGlsIEkgYnJvdWdodCBpdCB1cCkuIEFuZCBkb24ndCBhc2sgbWUgd2hhdCAiZm9jdXNlcyBub3Qgb24gY29tcGF0aWJpbGl0eQord2l0aCBpdHMgR05VIGNvdW50ZXJwYXJ0cyIgbWVhbnMgd2hlbiBDUF9NT1JFIGFkZHMgNyBub24tcG9zaXggb3B0aW9ucworYW5kIHRveXMvb3RoZXIgaGFzIDg0IGNvbW1hbmRzIGluIG5laXRoZXIgcG9zaXggbm9yIExTQi4gSSB0aGluayB0aGV5J3JlCitzdHJ1Z2dsaW5nIHRvIGV4cGxhaW4gdGhlIGRpZmZlcmVuY2UgaGF2aW5nIGRpc21pc3NlZCAibGljZW5zaW5nIiBhcyBiZWluZwordGhlIHJlYXNvbiBpdCBzdGFydGVkIHVwIGFnYWluIGFmdGVyIGEgbG9uZyBoaWF0dXM/IFRoZSByZWFzb24gSSBkb24ndCB0aGluaworR05VIGlzIHNwZWNpYWwgaXMgdGhlcmUgYXJlIGEgaGFsZi1kb3plbiBvdGhlciBpbmRlcGVuZGVudAoraW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIHVuaXggY29tbWFuZCB0b29scyBvdXQgdGhlcmUgKEFUJmFtcDtULAorQlNELCBDb2hlcmVudCwgTWluaXgsIHBsYW4gOSwgYnVzeWJveCwgdG95Ym94LCBhbmQgc2V2ZXJhbCBtb3JlIGFuYWx5emVkIGluCit0aGUgPGEgaHJlZj1yb2FkbWFwLmh0bWw+cm9hZG1hcDwvYT4sIGFuZCB0aGF0J3MgaWdub3JpbmcgdGhlIGltcGxlbWVudGF0aW9ucword3JpdHRlbiBmb3IgRE9TIG9yIGluIGFzc2VtYmx5IG92ZXIgdGhlIHllYXJzKS4gQnV0IEkgZG8gY2FyZSB3aGF0CitMaW51eCBGcm9tIFNjcmF0Y2ggZXhwZWN0cywgYW5kIGlmIGl0J3MKKzxhIGhyZWY9aHR0cDovL2FyY2hpdmUubGludXhmcm9tc2NyYXRjaC5vcmcvbGZzLW11c2V1bS83LjYvTEZTLUJPT0stNy42LU5PQ0hVTktTLmh0bWwjY2gtdG9vbHMtZ2NjLXBhc3MxPmNhbGxpbmcgbXYgLXY8L2E+Cit0aGVuIEkgaW1wZWxlbWVudCBtdiAtdgorZXZlbiBpZiA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC90b3lib3gvcm9hZG1hcC5odG1sPnBvc2l4IGhhc24ndCBnb3QKK2l0PC9hPi4gQW5kIEkgZG9uJ3Qga25vdyB3aHkgImdudSBjb3VudGVycGFydHMiIHdvdWxkIGRlc2NyaWJlIHRoaXMgd2hlbgordXRpbC1saW51eCBpc24ndCBhIGdudSBwYWNrYWdlLCBub3IgYXJlIGluZm8temlwLCBlMmZzcHJvZ3MsIGttb2QsIGxlc3MsCitwcm9jcHMsIHNoYWRvdywgc3lza2xvZ2QsIHZpbSwgemxpYiwgc3VkbywgZGhjcGNkLi4uPC9wPgorCis8YSBuYW1lPSIwNS0wNC0yMDE1IiAvPjxhIGhyZWY9IiMwNS0wNC0yMDE1Ij48aHI+PGgyPjxiPkFwcmlsIDUsIDIwMTU8L2I+PC9oMj48L2E+Cis8cD5TaW5jZSA8YSBocmVmPWh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2V4dGVybmFsL3RveWJveC8+YW5kcm9pZDwvYT4gYW5kCis8YSBocmVmPWh0dHBzOi8vZ2l0LnRpemVuLm9yZy9jZ2l0L3BsYXRmb3JtL3Vwc3RyZWFtL3RveWJveC5naXQ+dGl6ZW48L2E+CithbmQgPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20va3Jhai9tZXRhLW11c2wvdHJlZS9tYXN0ZXIvcmVjaXBlcy1jb3JlL3RveWJveD5vcGVuZW1iZWRkZWQ8L2E+CithbmQgPGEgaHJlZj1odHRwczovL3BhY2thZ2VzLmdlbnRvby5vcmcvcGFja2FnZS9zeXMtYXBwcy90b3lib3g+Z2VudG9vPC9hPgorYW5kIHNvIG9uIGhhdmUgYWxsIGJlZW4gdXNpbmcgR2VvcmdpIENob3JiYWR6aGl5c2tpJ3MgZ2l0IG1pcnJvciByYXRoZXIKK3RoYW4gdGhlIG1lcmN1cmlhbCByZXBvc2l0b3J5LCBJIGJpdCB0aGUgYnVsbGV0IGFuZCBzd2l0Y2hlZCB0aGUgcHJvamVjdCdzIHJlcG8KKzxhIGhyZWY9aHR0cHM6Ly9naXRodWIuY29tL2xhbmRsZXkvdG95Ym94PnRvIGdpdDwvYT4uIEdlb3JnaSdzCis8YSBocmVmPWh0dHBzOi8vZ2l0aHViLmNvbS9nZnRvL3RveWJveD5taXJyb3I8L2E+IGlzIG5vdyBwdWxsaW5nIGZyb20gdGhhdC48L3A+CisKKzxhIG5hbWU9IjI1LTAyLTIwMTUiIC8+PGEgaHJlZj0iIzI1LTAyLTIwMTUiPjxocj48aDI+PGI+RmVicnVhcnkgMjUsIDIwMTU8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iQSBjb21tb24gbWlzdGFrZSB0aGF0IHBlb3BsZSBtYWtlIHdoZW4gdHJ5aW5nIHRvIGRlc2lnbgorc29tZXRoaW5nIGNvbXBsZXRlbHkgZm9vbHByb29mIGlzIHRvIHVuZGVyZXN0aW1hdGUgdGhlIGluZ2VudWl0eSBvZgorY29tcGxldGUgZm9vbHMuIjwvcD48cD4tIFRoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eS48L3A+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC41LjIudGFyLmd6PlRveWJveCAwLjUuMjwvYT4KKyg8YSBocmVmPS9oZy90b3lib3gvc2hvcnRsb2cvMTcwMj5jb21taXQgMTcwMjwvYT4pIGlzIG91dC48L3A+CisKKzxwPk5ldyBwcm9tb3RlZCBjb21tYW5kczogc2VkIChmaW5hbGx5IGZpeGVkIGVub3VnaCBpdCBidWlsZHMgTGludXggRnJvbQorU2NyYXRjaCksIHByaW50ZiAoY2xlYW5lZCB1cCBhbmQgcHJvbW90ZWQpLCBzaHJlZCBhbmQKK2Jhc2U2NCAodGhlIFRpemVuIGd1eXMgd2FudGVkIHRoZW0pLCBnZXRlbmZvcmNlLCBzZXRlbmZvcmNlLCBhbmQgY2hjb24gKGFuZHJvaWQpLAorbWl4IChwcm9tb3RlZCB3aXRoIGZpeGVzIGZyb20gSXNhYWMgRHVuaGFtKSwgbnNlbnRlciAoZnJvbQorQW5keSBMdXRvbWlyc2tpLCBtZXJnZWQgaW50byB1bnNoYXJlKS48L3A+CisKKzxwPkVsbGlvdHQgSHVnaGVzIHN1Ym1pdGVkIGEgYnVuY2ggb2YgcGF0Y2hlcyB0byBzdXBwb3J0IEFuZHJvaWQgKHRvCitib3RoIHRveWJveCBhbmQgQmlvbmljIGxpYmMsIHdoaWNoIGhlIG1haW50YWlucykuIE9uIHRveWJveCdzIGVuZCB0aGlzCitpbnZvbHZlZCBhIGxvdCBvZiBmaXh1cHMgdG8gcG9ydGFiaWxpdHkuW2NoXSBhbmQgZml4ZXMgdG8gb3ZlciBhIGRvemVuCitjb21tYW5kcywgcGx1cyBzZXZlcmFsIG5ldyBvbmVzLiBPdGhlciBwb3J0YWJpbGl0eSBmaXhlcyBpbmNsdWRlZCB3b3JraW5nCit3aXRoIGJ1aWxkcm9vdCdzIHVjbGliYyBmb3JrIGFuZCBidWlsZGluZyBmb3Igbm9tbXUgdGFyZ2V0cy48L3A+CisKKzxwPlRoZSBuZXcgIm1ha2UgY2hhbmdlIiB0YXJnZXQgYnVpbGRzIGVhY2ggdG95Ym94IGNvbW1hbmQgYXMgYSBzdGFuZGFsb25lCitiaW5hcnkuIFJhdGhlciBhIGxvdCBvZiBjb21tYW5kcyB0aGF0IGRpZG4ndCBidWlsZCBieSB0aGVtc2VsdmVzIChtdiBkZXBlbmRpbmcKK29uIGNwIGFuZCBzbyBvbikgd2VyZSBoaXQgd2l0aCBhIGxhcmdlIHJvY2sgdW50aWwgdGhleSBidWlsdCBzdGFuZGFsb25lLgorVGhpcyBpbnZvbHZlZCByZXdyaXRpbmcgYml0cyBvZiBvcHRpb24gcGFyc2luZywgbW9yZSBlbGFib3JhdGUgZGVwZW5kZW5jeQorZ2VuZXJhdGlvbiwgbWFraW5nIGVhY2ggY29tbWFuZCBoYXZlIGl0cyBvd24gY29uZmlnCitzeW1ib2wgYW5kIG1haW4oKSBmdW5jdGlvbiAoZXZlbiB3aGVuIGl0J3MganVzdCBhIHdyYXBwZXIgY2FsbGluZyBhbm90aGVyCitjb21tYW5kJ3MgbWFpbigpKSwgYW5kIHNvIG9uLiBBbHNvLCBzb21lIGNvbW1hbmRzIGNhbid0IGJlIGJ1aWx0IHN0YW5kYWxvbmUKK2F0IGEgY29uY2VwdHVhbCBsZXZlbDogImhlbHAiIGRlc2NyaWJlcyBvdGhlciBlbmFibGVkIGNvbW1hbmRzIGFuZCAic2giCitoYXMgYSBudW1iZXIgb2YgYnVsaXRpbiBjb21tYW5kcyAoY2QsIGV4aXQsIHNldCkgdGhhdCByZXF1aXJlIHRoZQorbXVsdGlwbGV4ZXIgaW5mcmFzdHJ1Y3R1cmUsIHNvICJtYWtlIGNoYW5nZSIgZmlsdGVycyB0aGVtIG91dC48L3A+CisKKzxwPlRoZSBtYWlsaW5nIGxpc3QncyB3ZWIgYXJjaGl2ZSBpcyBzdGlsbCBzY3Jld2VkIHVwLiBEcmVhbWhvc3QgaGFzCitiZWVuIHRyeWluZyB0byBmaXggaXQgc2luY2UgYXBwcm94aW1hdGVseSBTZXB0ZW1iZXIuIFRoZXJlIGFyZQorPGEgaHJlZj1odHRwOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vdG95Ym94QGxpc3RzLmxhbmRsZXkubmV0Lz50d288L2E+Cis8YSBocmVmPWh0dHA6Ly9uZXdzLmdtYW5lLm9yZy9nbWFuZS5saW51eC50b3lib3g+b3RoZXI8L2E+IGxlc3MgYnJva2VuCithcmNoaXZlcywgYnV0IG5laXRoZXIgaGFzIHF1aXRlIHRoZSBzYW1lIFVJIGFzIG1haWxtYW4uPC9wPgorCis8aDM+QnVnZml4ZXMgYW5kIHR3ZWFrczwvaDM+CisKKzxwPkN5bnQgUnludCBzZW50IGluIHRlc3RzIGZvciBpZmNvbmZpZywKK1JvYmVydCBUaG9tcHNvbiB0YXVnaHQgZmFjdG9yIHRvIGFjY2VwdCB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBhcmd1bWVudHMsCitIeWVqaW4gS2ltIHBvaW50ZWQgb3V0IHRoYXQgc29tZSBvZiBta3RlbXAncyBsb25nb3B0cyB3ZXJlIGF0dGFjaGVkIHRvCit0aGUgd3Jvbmcgc2hvcnQgb3B0aW9ucywKK0x1aXMgRmVsaXBlIFN0cmFubyBNb3JhZXMgZml4ZWQgYSB3cm9uZyBmcmVlKCkgY2FsbCBpbiBib290Y2hhcnRkIGluIHBlbmRpbmcuCitQYXRjaGVzIGZyb20gQXNod2luaSBTaGFybWEgdG8gbWFrZSAiZGYgL2Rldi9ub2RlIiB3b3JrLCBwcmV2ZW50IGR1IGZyb20KK2xvb3BpbmcgZW5kbGVzc2x5IGZvbGxvd2luZyBzeW1saW5rcywgYW5kIHRvIG1ha2UgZXhwci5jCisoaW4gcGVuZGluZykgdW5kZXJzdGFuZCA9PSBhbmQgcmVnZXggbWF0Y2hlcy4gKFNwZWFraW5nIG9mIGV4cHIsIGl0IGdldHMKK3ByaW9yaXR5IGdyb3VwaW5ncyB3cm9uZyBidXQgdGhlIGJ1ZyB3YXMgYWN0dWFsbHkgaW4gdGhlIHBvc2l4IHNwZWMncworSFRNTCBjb252ZXJzaW9uLiBUaGV5IGZpeGVkIHRoZSBwb3NpeCBzcGVjIHVwc3RyZWFtIGZvciB1cy4gU3RpbGwgbmVlZAordG8gZml4IHRoZSBleHByIGNvZGUsIGJ1dCBpdCdzIGluIHBlbmRpbmcgZm9yIGEgcmVhc29uLi4uKTwvcD4KKworPHA+U29tZSBjb21tYW5kcyBncmV3IG5ldyBvcHRpb24gZmxhZ3MsIHN1Y2ggYXMgY3AgLS1yZW1vdmUtZGVzdGluYXRpb24KK2FuZCB0b3VjaCAtaC48L3A+CisKKzxwPlRoZSBwYXJhbGxlbCBidWlsZCBoYXMgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBub3cuIFdoZW4gdG95Ym94IG5lZWRzIHRvCityZS1leGVjIGl0c2VsZiB0byByZWdhaW4gc3VpZCByb290IHBlcm1pc3Npb25zIGFuZCBoYXNuJ3QgZ290IHRoZSBzdWlkIGJpdCwKK2l0IG5vdyBnaXZlcyB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSAoIm5vdCByb290IiBpbnN0ZWFkIG9mICJubyBzdWNoIGNvbW1hbmQiKS4KKworPHA+QWRkZWQgYSB0ZXN0IHRvICJtb3VudCIgdG8gbm90IG1vdW50IHRoZSBzYW1lIGRldmljZS9kaXJlY3RvcnkgY29tYmluYXRpb24KK292ZXIgaXRzZWxmICh0aGUgT1MgY2F0Y2hlcyB0aGlzIGZvciBibG9jayBkZXZpY2VzLCBidXQgbm90IGZvciB0bXBmcykuCitNYWtlIGJsa2lkIGRpc3Rpbmd1aXNoIGV4dDMgZnJvbSBleHQ0LiBBZGRlZCBjYXR2IGJhY2sgaW50byBjYXQgKGJlY2F1c2UKK3RoZSBBbmRyb2lkIGd1eXMgd2FudGVkIGl0LCBhbmQgdGhleSBoYXZlIGhpc3RvcmljYWwgdXNhZ2Ugb24gdGhlaXIgc2lkZSwKK3NvLi4uKS4gSGFuZGxlIG5hbm9zZWNvbmRzIGluIHRvdWNoLjwvcD4KKworPHA+Rml4ZWQgYSBzZWdmYXVsdCB3aGVuIENQX01PUkUgd2FzIGRpc2FibGVkICh0aGUgcmVzdWx0aW5nIG9wdGlvbiBmbGFnIGxpc3QKK25vIGxvbmdlciBkZWZpbmVkIC1kIGJ1dCBzdGlsbCBoYWQgaXQgaW4gb3B0aW9uIGdyb3VwcyBhdCB0aGUgZW5kKS4KK1dvcmthcm91bmQgZm9yIGdsaWJjIHJlZGVmaW5pbmcgZGlybmFtZSgpIGFuZCBiYXNlbmFtZSgpIHRvIHJhbmRvbSBub24tcG9zaXgKK3NlbWFudGljcyBiZWNhdXNlIGdudS4gKFRoZXkgY291bGQgaGF2ZSBjcmVhdGVkIGRpcm5hbWVfcigpIGJ1dCBkaWRuJ3Qgd2FudAordG8uKTwvcD4KKworPHA+Rml4IGFuIGlmY29uZmlnIHRlc3QgdGhhdCB3YXMgcHJldmVudGluZyBhc3NpZ25pbmcgYW4gaXB2NCBhZGRyZXNzIHRvCitpbnRlcmZhY2UgYWxpYXNlcy4gU2V2ZXJhbCBjbGVhbnVwIHBhc3NlcyBvbiBod2Nsb2NrIGJ1dCBub3QgcXVpdGUKK3Byb21vdGVkIG91dCBvZiBwZW5kaW5nIHlldC48cD4KKworPHA+Rml4ZWQgYSB3cm9uZyBlcnJvciBtZXNzYWdlIGluIHJtIChpZiB5b3UgaGFkIGEgY2htb2QgMDAwIGRpcmVjdG9yeSBhbmQKK2RpZCBybSAtciBvbiBpdCB3aXRob3V0IC1mLCBhZnRlciB0aGUgcHJvbXB0IGl0IHdvdWxkIGNvbXBsYWluIGl0IHdhcyBhCitkaXJlY3RvcnksIHdoaWNoIHdhcyBub3QgdGhlIHByb2JsZW0pLjwvcD4KKworPHA+VGhlIGd6aXAgY29tcHJlc3Npb24gY29kZSBub3cgZG9lcyAic3RvcmUgb25seSIgb3V0cHV0IHRvIHN0ZG91dCwgZm9yCit3aGF0IHRoYXQncyB3b3J0aC48L3A+CisKKzxwPkNsZWFudXAgbW91bnRwb2ludCBhbmQgZXhwYW5kLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0b3lzL3BlbmRpbmcvUkVBRE1FCisoYSBsaXN0IG9mIGNvbW1hbmRzIHRoYXQgcHJlZGF0ZSB0aGUgdG95cy9wZW5kaW5nIGRpcmVjdG9yeSBidXQgbmVlZGVkCithbm90aGVyIHBhc3MpLjwvcD4KKworPGgzPkxpYnJhcnkgYW5kIGluZnJhc3RydWN0dXJlOjwvaDM+CisKKzxwPlJld29ya2VkIHRoZSBvcHRpb24gcGFyc2luZyBpbmZyYXN0cnVjdHVyZSBzbyBtb3JlIGNvbW1hbmRzIGJ1aWxkCitzdGFuZGFsb25lICh2aWEgc2NyaXB0cy9zaW5nbGUuc2ggb3IgIm1ha2UgY2hhbmdlIikuIFRoZSBvcHRpb24gZmxhZyBiaXQKK3ZhbHVlcyBhcmUgbm8gbG9uZ2VyIHBhY2tlZCwgaXQgbGVhdmVzIHNwYWNlcyB3aGVyZSBjdXJyZW50bHkgZGlzYWJsZWQKK2ZsYWdzIGdvLCBhbmQgeW91IGNhbiAjZGVmaW5lIEZPUkNFX0ZMQUdTIHNvIGRpc2FibGVkIGZsYWdzIGFyZW4ndCB6ZXJvZWQuCitUaGlzIGFsbG93cyBtdWx0aXBsZSBjb21tYW5kcyB0byBtb3JlIGVhc2lseSBzaGFyZSBpbmZyYXN0cnVjdHVyZSwgZXZlbiBpZgoreW91ciBjdXJyZW50IGZsYWcgY29udGV4dCBpcyBmb3IgYSBkaXNhYmxlZCBjb21tYW5kIChzd2l0Y2hlZCBvZmYgaW4gY29uZmlnKSwKK3lvdSBjYW4gZm9yY2UgdGhlbSB0byBzdGF5IG9uIGFuZCBhcyBsb25nIGFzIHRoZSBmbGFncyByZWFkIHRoZSBzYW1lIHJpZ2h0Cit0byBsZWZ0IHRoZXknbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgorCis8cD5XZSd2ZSBzdGFydGVkIHJlbW92aW5nIHVzZSBvZiBzdHJuY3B5KCkgYmVjYXVzZSBpdCdzIGEgaHVnZWx5IGJyb2tlbgorc3RhbmRhcmQgQyBmdW5jdGlvbjogdGhlIGxlbmd0aCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdG8gX2FwcGVuZF8sIG5vdAordGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gSXQgbWVtc2V0cyB0aGUgcmVtYWluaW5nIHNwYWNlIGl0IGRpZG4ndAorY29weSBhbGEgIm1lbXNldChkZXN0K3N0cmxlbihkZXN0KSwgMCwgbGVuKTsiIHNvCitpZiB5b3UgdGhpbmsgbGVuIGlzIHRoZSBzaXplIG9mIGRlc3QgeW91J3JlIGd1YXJhbnRlZWQgdG8gc3RvbXAgbWVtb3J5IG9mZiB0aGUKK2VuZCkuIEFuZCBpZiBpdCBydW5zIG91dCBvZiBzcGFjZSBpdCB3b24ndCBudWxsIHRlcm1pbmF0ZSBiZWNhdXNlIHJlYXNvbnMuCisoTWVhbndoaWxlIHNwcmludGYoIiUqcyIsIGxlbiwgc3RyKSBpcyBjb3VudGluZyB3aWRlIGNoYXJhY3RlcnMgaW4geW91ciBjdXJyZW50Citsb2NhbGUsIHNvIGlmIHlvdSBzZXQgYSBsb2NhbGUgb3RoZXIgdGhhbiAiQyIgaXQgd2lsbCBhbHNvIGdvIHBhc3QgeW91cgorYWxsb2NhdGVkIGJ1ZmZlciBzaXplLiBXaG9ldmVyIGlzIG1haW50aW5pbmcgdGhlIEMgbGlicmFyeSBzdGFuZGFyZHMgaXMgcmVhbGx5CitiYWQgYXQgc3RyaW5ncy4pCitJbnN0ZWFkIHdlIGhhdmUgeHN0cm5jYXQoKSB3aGljaCB3aWxsIGVycm9yX2V4aXQoKSBpZiBzcmMrZGVzdCsxIGRvZXNuJ3QKK2ZpdCBpbiB0aGUgYnVmZmVyLiAoQmVjYXVzZSByYW5kb21seSB0cnVuY2F0aW5nIGlucHV0IGRhdGEgaXNuJ3QgbmVjZXNzYXJpbHkKK2FuIGltcHJvdmVtZW50LikgQW5kIHRoZXJlJ3MgYWx3YXlzIHhtcHJpbnRmKCkuPC9wPgorCis8cD5TaW1pbGFybHksIHN0cnRvbCgpIGRvZXNuJ3QgcmV0dXJuIGFuIGVycm9yIGluZGljYXRvciBvbiBvdmVyZmxvdywKK3lvdSBoYXZlIHRvIGNsZWFyIGFuZCB0aGVuIGNoZWNrIGVycm5vLiBTbyBuZXcgeHN0cnRvbCgpIHRoYXQgY2FyZXMKK2Fib3V0IG92ZXJmbG93LjwvcD4KKworPHA+VGhlIGJpb25pYyBhbmQgbXVzbCBndXlzIGFncmVlIGZhY2Nlc3NhdChBVF9TWU1MSU5LX05PRk9MTE9XKSBpcyBub3QKK3N1cHBvcnRlZCwgc28gc3RvcCB1c2luZyBpdC48L3A+CisKKzxwPkZpeGVkIHRveV9leGVjKCkgdG8gZGV0ZWN0IHdoZW4gYXJnYyBpcyBpbiBvcHRhcmdzLCBzbyB3ZSBkb24ndAorbmVlZCBhIHNlcGFyYXRlIHhleGVjX29wdGFyZ3MoKS48L3A+CisKKzxhIG5hbWU9IjE4LTAyLTIwMTUiIC8+PGEgaHJlZj0iIzE4LTAyLTIwMTUiPjxocj48aDI+PGI+RmVicnVhcnkgMTgsIDIwMTU8L2I+PC9oMj48L2E+Cis8cD5EcmVhbWhvc3QgY29udGludWVzIHRvIGJlIHVuYWJsZSB0byBtYWtlIG1haWxpbmcgbGlzdCBhcmNoaXZlcyB3b3JrLCBzbworaGVyZSdzIDxhIGhyZWY9aHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL3RveWJveEBsaXN0cy5sYW5kbGV5Lm5ldC8+YW5vdGhlcgorbGlzdCBhcmNoaXZlPC9hPiB3aXRoIGEgbGVzcyBhd2t3YXJkIGludGVyZmFjZSB0aGFuIGdtYW5lLjwvcD4KKworPHA+KE5laXRoZXIgZ2l2ZXMgeW91IHRoZSBjb252ZW5pZW50IGhpc3RvcmljYWwgbW9udGhseSB2aWV3cyBvZiBtYWlsbWFuLAorYnV0IEkgc3RpbGwgaGF2ZSBob3BlcyBkcmVhbWhvc3Qgd2lsbCBzb21lZGF5IGZpZ3VyZSBvdXQgd2hhdCB0aGV5J3JlIGRvaW5nCit3cm9uZy4gVGhleSd2ZSBvbmx5IGJlZW4gdHJ5aW5nIHNpbmNlIE9jdG9iZXIuIExhc3QgbW9udGggdGhleSBkaWQgYQorPGEgaHJlZj1odHRwOi8vd3d3LmRyZWFtaG9zdHN0YXR1cy5jb20vMjAxNS8wMS8xNC9kaXNjdXNzaW9uLWxpc3QtaGFyZHdhcmUtbWFpbnRlbmFuY2UvPmhhcmR3YXJlIHVwZ3JhZGUgdG8gZml4IGEgc29mdHdhcmUgcHJvYmxlbTwvYT4sIGFuZCB0aGUgc3RhbGUKK2RhdGEgbG9hZHMgbXVjaCBmYXN0ZXIgbm93LCBzbyB0aGF0J3Mgc29tZXRoaW5nLik8L3A+CisKKzxwPlVwZGF0ZSAoRmViIDE5KTogdGhlIGFyY2hpdmUgc3RhcnRlZCB1cGRhdGluZyBhZ2FpbiwgYnkgZGlzY2FyZGluZworYWxsIHRoZSBwZW5kaW5nIGRhdGEuIFNvIHRoZXJlIGFyZSBub3cgX3R3b18gZ2lhbnQgaG9sZXMgaW4gRHJlYW1ob3N0J3MKK3dlYiBhcmNoaXZlLCBmcm9tIERlYyAxNS1KYW4gMywgYW5kIHRoZW4gYW5vdGhlciBob2xlIGZyb20gSmFuIDE2LUZlYiAxOC4KK1RoZSByZWxldmFudCBtZXNzYWdlcyBhcmUgaW4gYm90aCBvZiB0aGUgb3RoZXIgYXJjaGl2ZXMuIEhlcmUncyBob3BpbmcKK3RoZSBjaHJvbmljIGFyY2hpdmUgY29uc3RpcGF0aW9uIHByb2JsZW0gd29uJ3QgaGFwcGVuIGEgc2l4dGggdGltZS48L3A+CisKKzxhIG5hbWU9IjMwLTEyLTIwMTQiIC8+PGEgaHJlZj0iIzMwLTEyLTIwMTQiPjxocj48aDI+PGI+RGVjZW1iZXIgMzAsIDIwMTQ8L2I+PC9oMj48L2E+Cis8cD5EdWUgdG8gRHJlYW1ob3N0J3MgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvZHJlYW1ob3N0LnR4dD5vbmdvaW5nPC9hPgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvZHJlYW1ob3N0Mi50eHQ+aW5hYmlsaXR5PC9hPiB0byBtYWtlIG1haWxtYW4KK3dvcmsgcmVsaWFibHksIEkndmUgYWRkZWQgYSBsaW5rIHRvIGEgYmFja3VwIHdlYiBhcmNoaXZlIGF0Cis8YSBocmVmPWh0dHA6Ly9uZXdzLmdtYW5lLm9yZy9nbWFuZS5saW51eC50b3lib3g+Z21hbmU8L2E+IHRvIHRoZSBuYXYgYmFyCitvbiB0aGUgbGVmdC48L3A+CisKKzxwPllvdSBzdGlsbCBzdWJzY3JpYmUgdG8gdGhlIGxpc3QgdGhyb3VnaAorPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvbGlzdGluZm8uY2dpL3RveWJveC1sYW5kbGV5Lm5ldD50aGUgZmlyc3QgbGluazwvYT4uPC9wPgorCis8cD5VcGRhdGUgKEphbnVhcnkgMjcsIDIwMTUpOiB0aGV5J3JlIDxhIGhyZWY9aHR0cHM6Ly90d2l0dGVyLmNvbS9sYW5kbGV5L3N0YXR1cy81NTg0Mjg4Mzk0NjI3MDMxMDQ+c3RpbGwgd29ya2luZyBvbiBpdDwvYT4uPC9wPgorCis8YSBuYW1lPSIxOS0xMS0yMDE0IiAvPjxhIGhyZWY9IiMxOS0xMS0yMDE0Ij48aHI+PGgyPjxiPk5vdmVtYmVyIDE5LCAyMDE0PC9iPjwvaDI+PC9hPgorCis8YmxvY2txdW90ZT48cD4iVGhpcyB0aW1lIGl0IHdhcyByaWdodCwgaXQgd291bGQgd29yaywgYW5kIG5vIG9uZSB3b3VsZCBoYXZlIHRvIGdldCBuYWlsZWQgdG8gYW55dGhpbmcuIiAtIFRoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eS48L3A+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC41LjEudGFyLmJ6Mj5Ub3lib3ggMC41LjE8L2E+CisoPGEgaHJlZj0vaGcvdG95Ym94L3Nob3J0bG9nLzE1NjY+Y29tbWl0IDE1NjY8L2E+KSBpcyBvdXQuPC9wPgorCis8cD5JdCdzIGFuIGludGVyaW0gcmVsZWFzZSwgbW9zdGx5IGJ1Z2ZpeGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBuZXcgY29tbWFuZHMsCitidXQgdGhleSdyZSBhbGwgaW4gcGVuZGluZy48L3A+CisKKzxoMz5EZXZlbG9wbWVudDwvaDM+CisKKzxwPkZpbmFsbHkgaW1wbGVtZW50ZWQgc2VkLCB3aGljaCBpcyBzdGlsbCBpbiBwZW5kaW5nIGJlY2F1c2UgYWx0aG91Z2gKK2l0J3MgZmVhdHVyZSBjb21wbGV0ZSBhY2NvcmRpbmcgdG8gcG9zaXgsIGFuZCBldmVuIHBhc3NlcyB0aGUgcGFydHMgb2YKK0J1c3lib3gncyBzZWQgdGVzdCBzdWl0ZSB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IHRlc3RpbmcgZm9yIGdudSBidWdzIHdlCitkb24ndCB3YW50IHRvIGNvcHksIGl0J3Mgbm90IHlldCBnb29kIGVub3VnaCB0byBidWlsZCBMaW51eCBGcm9tIFNjcmF0Y2guCisoVGhlIC4vY29uZmlndXJlIHN0YWdlcyB1c2UgdmVyeSBsb25nIHNlZCBzY3JpcHRzLiAyMCBjb21taXRzIHdvcnRoIG9mCitpbXBsZW1lbnRhdGlvbiBhbmQgZGVidWdnaW5nLCBqdXN0IHVuZGVyIDEwMDAgbGluZXMgb2YgY29kZSwgYW5kIHRoZXJlJ3MKK3N0aWxsIG1vcmUgdG8gZG8uIFdlJ3JlIGRlZmluaXRlbHkgdXAgdG8gc29tZSBvZiB0aGUgImZpZGRseSIgY29tbWFuZHMgbm93LgorRGlkIHlvdSBrbm93ICJlY2hvIGhlbGxvIHwgc2VkIHAgLSAtIiBzZWdmYXVsdHMgZ251IHNlZCBpbiBVYnVudHUgMTIuMDQ/CitZZWFoLi4uKTwvcD4KKworPHA+VGFsa2VkIHdpdGggdGhlIFRpemVuIGRldmVsb3BlcnMgdG8gZm9sbG93IHVwIG9uIHRoZWlyIGRlc2lyZSB0bworbWFrZSB0b3lib3ggYSBwYXJ0IG9mIHRoZSBiYXNlIFRpemVuIHN5c3RlbSwgYW5kIGdvdCBhIGxpc3Qgb2YgY29tbWFuZHMKK3RvIGFkZCB0byB0aGUgcm9hZG1hcC4gVGhlIHRpemVuIHRvZG8gbGlzdCBpczo8L3A+CisKKzxibG9ja3F1b3RlPjxwPgord2dldCwgc2hhMjU2KiwgZ3ppcCwgZ3VuemlwLCBidW56aXAyLCByc3luYywgemRpZmYqLAorbGVzcywgYXIsIGFyY2gsIGJhc2U2NCwgY3NwbGl0LCBkaXIsIGZtdCwgam9pbiwgCitucHJvYywgc2hyZWQsIHNodWYsIHN0ZGJ1Ziwgc3R0eSwgdGVzdCwgdHIsIHVuZXhwYW5kLAordXNlcnMsIHZkaXIsIGRpZmYzLCBzZGlmZiwgZG9zZnNjayAoZnNjay52ZmF0KSwgYXdrLCBmZGlzaworPC9wPjwvYmxvY2txdW90ZT4KKworPHA+KE1vc3Qgb2Ygd2hpY2ggd2FzIGFscmVhZHkgb24gdGhlIHRvZG8gbGlzdCwgYnV0IGl0IGhlbHBzIHByaW9yaXRpemUuKTwvcD4KKworPHA+Rml4ZWQgbWQ1c3VtIGFuZCBzaGExc3VtIG9uIGJpZyBlbmRpYW4gc3lzdGVtcyAocmVwb3J0ZWQgYnkgSmFtZXMgTWNNZWNoYW4pLgorQW5keSBMdXRvbWlyc2tpIGZpeGVkIHVuc2hhcmUncyBoZWxwIHRleHQgYW5kIG9wdGlvbiBwYXJzaW5nLAorYW5kIHN1Ym1pdHRlZCBuc2VudGVyIChhIHRvb2wgdG8gdXNlIHNldG5zKDIpKSB0byBwZW5kaW5nLgorSXNhYWMgRHVuaGFtIGltcGxlbWVudGVkIGFjcGkgLWN0ViBvcHRpb25zLCBhbmQgc3BvdHRlZCB0aGUgYnVnIHRoYXQgbHMgLWQKK3dhcyBpbmFwcHJvcHJhaXRlbHkgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBzeW1saW5rcyB3aXRob3V0IC1IIG9yIC1MIChpdAorc2hvdWxkIGFjdCBsaWtlIGxzIC1sIGRvZXMpLCBhbmQgbHMgLUYgaGFuZGxlcyBzeW1saW5rcyB3cm9uZyB0b28uCitMdWthc3ogU3pwYWtvd3NraSBzZW50IGluIHR3byBidWdmaXhlcyB0byB0YWlsLmMuIEN5bnQgUnludCBzcG90dGVkIGFuCit1bm5lY2Vzc2FyeSBhc3NpZ25tZW50IGluIGxpYi9wYXNzd29yZC5jLjwvcD4KKworPHA+QXNod2luaSBTaGFybWEncyB0ZWFtIHdhcyBhcyBidXN5IGFzIHVzdWFsLCBzdWJtaXR0aW5nIHRyLCBjcm9udGFiLCBhbmQKK2lwY3JtLCBhbmQgaHdjbG9jayB0byBwZW5kaW5nLCBtb3JlIGZlYXR1cmVzIHRvIHRoZSBwZW5kaW5nIGlwLmMsIGFuZCBhCitwaWxlIG9mIGJ1Z2ZpeGVzICh0byBjaGdycCwga2lsbGFsbCwgaWZjb25maWcsIGluc21vZCwKK2xvc2V0dXAsIGNvbW0sIGNwLCBpZCwgeHdyYXAsIG5ldGNhdCwgbW9kcHJvYmUsIG5vaHVwLi4uKSBtb3N0bHkgZm91bmQgYnkKK3N0YXRpYyBhbmFseXNpcy4gKFRoZXNlIGZpeGVzIGFyZSBtb3N0bHkgdG8gc2VsZG9tLXVzZWQgY29kZXBhdGhzIGxpa2UgdGhlCitUT1lCT1hfRlJFRSBjb25maWcgb3B0aW9uLCBidXQgdGVzdCBjb3ZlcmFnZSBpcyBhbHdheXMgYXBwcmVjaWF0ZWQuKSBBc2h3aW5pCithbHNvIHN1Z2dlc3RlZCB1cGdyYWRpbmcgbG4gLWYgdG8gbGVhdmUgdGhlIG9yaWdpbmFsIHRhcmdldCBhbG9uZSBpZiBsaW5rCitjcmVhdGlvbiBmYWlscywgYW5kIHJlcG9ydGVkIHRoYXQgbXYgLWYgYW5kIC1pIHdlcmVuJ3QgaW1wbGVtZW50ZWQgKG5vdyBmaXhlZCkuPC9wPgorCis8cD5OZXcgY29uZmlnIG9wdGlvbjogVE9ZQk9YX05PUkVDVVJTRSBwcmV2ZW50cyB4ZXhlYygpIGZyb20gbWFraW5nIGludGVybmFsCitmdW5jdGlvbiBjYWxscyAoZm9yIG5vbW11IHN5c3RlbXMgd2l0aCBhIGZpbml0ZSBzdGFjaykuPC9wPgorCis8cD5UaGUgInRveWJveCIgbXVsdGlwbGV4ZXIgY29tbWFuZCBubyBsb25nZXIgYWRkcyBhIHRyYWlsaW5nIHNwYWNlIHRvIGVhY2gKK2xpbmUgb2YgY29tbWFuZCBuYW1lcywgc28gdGhpbmdzIGxpa2UgIi4vdG95Ym94IHwgdHIgJyBcbicgJ3wnIiB0byBjcmVhdGUKK2EgZ3JlcCBwYXR0ZXJuIHNuaXBwZXQgYXJlIGVhc2llciB0byBkby4gKFdoeSB5b3UnZCB3YW50IHRvIGlzIHlvdXIgYnVzaW5lc3MsCitidXQgdGhlIG91dHB1dCBpcyB0aWRpZXIgbm93Lik8L3A+CisKKzxoMz5JbmZyYXN0cnVjdHVyZTwvaDM+CisKKzxwPklzYWFjIER1bmhhbSBhZGRlZCBBbmRyb2lkIHN1cHBvcnQgdG8gcG9ydGFiaWxpdHkuaCwgaW5jbHVkaW5nIGNvbXBpbGUKK3Byb2JlcyBmb3IgZnVuY3Rpb25zIG1pc3NpbmcgZnJvbSBiaW9uaWMtbGliYywgYW5kIGFubm90YXRlZCB0aGUgY29tbWFuZHMgdGhhdAordXNlIHRob3NlIGZ1bmN0aW9ucy4gV2UgaGF2ZW4ndCByZWFsbHkgdGVzdGVkIGJ1aWxkaW5nIGFnYWluc3QgYmlvbmljLAorYnV0IGluIHRoZW9yeSBpdCdzIHBvc3NpYmxlIG5vdy48L3A+CisKKzxwPlJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgbm93IGNvbG9yIGNvZGVzIHRoZSBQQVNTL1NLSVAvRkFJTCBub3RpZmljYXRpb25zCitpZiBvdXRwdXQgaXMgdG8gYSB0dHkuIChBbmQgaW4gY2FzZSB5b3UgbWlzc2VkIGl0IGxhc3QgdGltZSwgVkVSQk9TRT1mYWlsCit0byBzdG9wIGF0IHRoZSBmaXJzdCBmYWlsdXJlIGlzIHJlYWxseSB1c2VmdWwuKTwvcD4KKworPHA+SW4gbG9vcGZpbGVzX3J3KCkgdXNlIE9fQ0xPRVhFQyBpbnN0ZWFkIG9mIE9fUkRPTkxZIHRvIHJlcXVlc3QgdGhlIGxvb3AKK2Z1bmN0aW9uIGNsb3NlIGZpbGVoYW5kbGVzIGZvciB1cy4gKE90aGVyd2lzZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdAorY2xvc2UgZWFjaCBzdXBwbGllZCBmaWxlaGFuZGxlIGl0c2VsZi4pPC9wPgorCis8cD5UaGUgcHJpbnRmLXN0eWxlIGVzY2FwZSBwYXJzaW5nICgiXG4iIGFuZCBmcmllbmRzKSBnb3QgZmFjdG9yZWQgb3V0IGludG8KK2EgbmV3IHVuZXNjYXBlKCkgZnVuY3Rpb24uPC9wPgorCis8YSBuYW1lPSIwMi0xMC0yMDE0IiAvPjxhIGhyZWY9IiMwMi0xMC0yMDE0Ij48aHI+PGgyPjxiPk9jdG9iZXIgMiwgMjAxNDwvYj48L2gyPjwvYT4KKzxibG9ja3F1b3RlPjxwPiJUaGVyZSBpcyBhbiBhcnQsIGl0IHNheXMsIG9yIHJhdGhlciwgYSBrbmFjayB0byBmbHlpbmcuCitUaGUga25hY2sgbGllcyBpbiBsZWFybmluZyBob3cgdG8gdGhyb3cgeW91cnNlbGYgYXQgdGhlIGdyb3VuZCBhbmQgbWlzcy4uLgorQ2xlYXJseSwgaXQgaXMgdGhpcyBzZWNvbmQgcGFydCwgdGhlIG1pc3NpbmcsIHdoaWNoIHByZXNlbnRzIHRoZQorZGlmZmljdWx0aWVzLiIgLSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPHA+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC41LjAudGFyLmJ6Mj5Ub3lib3ggMC41LjA8L2E+CisoPGEgaHJlZj0vaGcvdG95Ym94L3Nob3J0bG9nLzE1MTI+Y29tbWl0IDE1MTI8L2E+KSBpcyBvdXQuPC9wPgorCis8aDM+TmV3IGNvbW1hbmRzPC9oMz4KKworPHA+VGhlIG5ldyBjb21tYW5kcyBhcmUgZmluZCwgaW5zdGFsbCwgZmFjdG9yLCBhbmQgbW91bnQuIFByb21vdGVkIGNvbW1hbmRzCisoY2xlYW5lZCB1cCBhbmQgbW92ZWQgb3V0IG9mICJwZW5kaW5nIikgYXJlIGxzcGNpLCBpbm90aWZ5ZCwgYW5kIGJsb2NrZGV2LjwvcD4KKworPHA+Y3Agbm93IGltcGxlbWVudHMgLUhMIGFuZCAtRiB0byBmb3JjZSBkZWxldGUgb2YgcGVuZGluZyBmaWxlcywgY3BpbyBub3cKK2lnbm9yZXMgLW0gYW5kIGltcGxlbWVudHMgLXAsIGxzIC1DIG5vdyBoYXMgdXRmOCBzdXBwb3J0ICh1c2luZyB3Y3dpZHRoCitpbnN0ZWFkIG9mIHN0cmxlbiksIGFuZCB1bW91bnQgZ290IGEgbnVtYmVyIG9mIHVwZ3JhZGVzIGludm9sdmluZworbG9va2luZyB0aGluZ3MgdXAgaW4gL3Byb2MvbW91bnRzLiBPdGhlciBtaW5vciBjbGVhbnVwcyBoYXBwZW5kIHRvCitjdXQsIHRvdWNoLCBmcmVlLCBhbmQgaWQuPC9wPgorCis8cD5JbiBwZW5kaW5nOiBCcmFkbGV5IENvbnRyb3kgc3VibWl0dGVkIG1peCAoYWRqdXN0cyBPU1Mgc291bmQgdm9sdW1lKS4gQXNod2luaQorU2hhcm1hIHN1Ym1pdHRlZCBkaWZmLCB1c2VyZGVsLCBibG9ja2RldiwgaXBjcywgYW5kIGNyb25kLCB1cGdyYWRlZAorZmRpc2ssIGZzY2ssIGFuZCBmdHBnZXQsIGFuZCByYW4gYSBzdGF0aWMgYW5hbHl6ZXIgb24gYSBsb3Qgb2Ygb3RoZXIgY29kZS4KK1BhcnRpYWwgY2xlYW51cCB3YXMgZG9uZSB0byB1c2VyYWRkLCB1c2VyZGVsLCBncm91cGFkZCwgYW5kIGdyb3VwZGVsLjwvcD4KKworPGgzPkJ1aWxkIGluZnJhc3RydWN0dXJlPC9oMz4KKworPHA+PGI+UGFyYWxsZWwgYnVpbGRzPC9iPjwvcD4KKworPHA+VGhlIGJ1aWxkIG5vdyB0YWtlcyBhZHZhbnRhZ2Ugb2YgU01QLCBhdXRvZGV0ZWN0aW5nIHRoZSBudW1iZXIgb2YKK3Byb2Nlc3NvcnMuIChFeHBvcnQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENQVVMgdG8gcGljayBhIHNwZWNpZmljIG51bWJlci4pCitPdGhlciBidWlsZCBjaGFuZ2VzOiBzcGxpdCBvdXQgJExET1BUSU1JWkUgYmVjYXVzZSBvbGQgY29tcGlsZXJzIGNvbXBsYWluCithYm91dCBsaW5rZXIgb3B0aW9ucyBwYXNzZWQgd2l0aCAtYywgYW5kIHRoZSBlbnRpcmUgImdlbmVyYXRlZCIgZGlyZWN0b3J5IG5vdworZ2V0cyBkZWxldGVkIGJ5IGNsZWFuICh0aGUgUkVBRE1FIHRoYXQgd2FzIGluIHRoZXJlIGdvdCBtZXJnZWQgaW50byBjb2RlLmh0bWwpLjwvcD4KKworPHA+PGI+U3RhbmRhbG9uZSBidWlsZHM8L2I+PC9wPgorCis8cD5UaGUgc3RhbmRhbG9uZSBidWlsZCBpbmZyYXN0cnVjdHVyZSAoc2NyaXB0cy9zaW5nbGUuc2gpIGdvdCB1cGdyYWRlZCB0bworYnVpbGQgbW9yZSBjb21tYW5kcyBhcyBzdGFuZGFsb25lIGV4ZWN1dGFibGVzLiBJbiBtYWtlLnNoIHRoZSBzb3VyY2UgZmlsZQorc2VsZWN0aW9uIHVzZXMgYSByZWdleCB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgTkVXVE9ZL09MRFRPWSBtYWNybworZm9yIHRoZSBjb21tYW5kLiBJdCBlbmFibGVzIGVhY2ggY29tbWFuZCdzCitzdWItb3B0aW9ucyAoc28gQ1AgaGFzIENQX01PUkUpLCBlbmFibGVzIEkxOE4gYW5kIEZMT0FUIHN1cHBvcnQgdG8gYnVpbGQKK2Z1bGwtZmVhdHVyZWQgY29tbWFuZHMsIGFuZCBpbmNsdWRlcyAtLWhlbHAgdGV4dCAoYXQgbGVhc3Qgd2hlbgordGhlIGNvbW1hbmQgZG9lc24ndCB1c2UgYW5vdGhlciBjb21tYW5kJ3MgaGVscCkuIFRoZSBPTERUT1koKSBtYWNybworbm93IHByb2R1Y2VzIChyZWR1bmRhbnQpIGZ1bmN0aW9uIHByb3RvdHlwZXMgc28geW91IGNhbiBidWlsZCBhbiBPTERUT1kKK3dpdGhvdXQgdGhlIE5FV1RPWTwvcD4KKworPHA+SXQgZG9lc24ndCBxdWl0ZSBoYXZlIGNvbXBsZXRlIGNvdmVyYWdlIHlldCwgdGhlIGRlZmNvbmZpZyBlbnRyaWVzIHRoYXQKK2FyZW4ndCBidWlsZGluZyBzdGFuZGFsb25lIHlldCBhcmU6PC9wPgorCis8YmxvY2txdW90ZT48cD5jaG93biwgZWdyZXAsIGZncmVwLCBmc3R5cGUsIGhhbHQsIG12LCBuYywgcG93ZXJvZmYsIHVuaXgyZG9zLAord2hvYW1pPC9wPjwvYmxvY2txdW90ZT4KKworPHA+VGhlIG1haW4gcmVhc29uIGZvciBzdGFuZGFsb25lIGJ1aWxkIGZhaWx1cmVzIGlzIE5FV1RPWSgpIG9yIE9MRFRPWSgpCitlbnRyaWVzIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpciBvd24gY29uZmlnIHN5bWJvbC4gQW5vdGhlciBwcm9ibGVtIGlzIGVudHJpZXMKK3RoYXQgZGVwZW5kIG9uIGFub3RoZXIgZW50cnkgaW4ga2NvbmZpZywgdXN1YWxseSBiZWNhdXNlIGNvbW1vbiBpbmZyYXN0cnVjdHVyZQoraXMgdXNpbmcgb25lIGNvbW1hbmQncyBmbGFncyAod2hpY2ggdGhlIG90aGVyIGNvbW1hbmRzIGNvcHkpOiBpZiB0aGF0IGNvbW1hbmQKK2lzIGRpc2FibGVkLCB0aGUgRkxBRyBtYWNyb3MgYmVjb21lIDAgc28gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGNhbiByZW1vdmUgdGhlCitjb2RlLiBJdCdzIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2hnL3RveWJveC9yZXYvMTUwMz5wb3NzaWJsZQordG8gdW50YW5nbGU8L2E+IHRoaXMsIGJ1dCBhIGJpdCBhd2t3YXJkLiAoSXQgYm9pbHMgZG93biB0byBjb25mbGljdGluZworZGVzaWduIGdvYWxzIGluIHRoZSB0d28gY29udGV4dHMuKTwvcD4KKworPHA+U3RhbmRhbG9uZSBidWlsZHMgYXJlIHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUgd2hlbiB0ZXN0aW5nIGluZGl2aWR1YWwKK2NvbW1hbmRzLgorCis8cD48Yj5TbmFwc2hvdCBidWlsZHM8L2I+PC9wPgorCis8cD5BIG5ldyBhZGRpdGlvbiB0byB0aGUgImdlbmVyYXRlZCIgZGlyZWN0b3J5IGlzIGdlbmVyYXRlZC9idWlsZC5zaAorY29udGFpbmluZyBhIHNpbmdsZSBjb21waWxlciBjb21tYW5kIGxpbmUgdG8gYnVpbGQgdG95Ym94IGluIGl0cyBjdXJyZW50Citjb25maWd1cmF0aW9uLiBDb21iaW5lZCB3aXRoIHRoZSBnZW5lcmF0ZWQvKi57aCxzaH0gZmlsZXMgZnJvbSBhbgorZXhpc2l0aW5nIGJ1aWxkLCB0aGlzIG1heSBsZXQgeW91IGJ1aWxkIG9uIGEgbmV3IHN5c3RlbSB0aGF0IGhhc24ndCBxdWl0ZQorZ290IGVub3VnaCBPUyBiaXRzIHdvcmtpbmcgdG8gcnVuIGEgZnVsbCBjb25maWd1cmVhbmQgbWFrZS48L3A+CisKKzxoMz5JbnRlcm5hbHM8L2gzPgorCis8cD5MaWJyYXJ5IGNvZGU6IHhjcmVhdGUveG9wZW4gbm93IE9fQ0xPRVhFQyBieSBkZWZhdWx0IHRvIGF2b2lkIGxlYWtpbmcKK2ZpbGVoYW5kbGVzIHRvIGNoaWxkIHByb2Nlc3Nlcy4gRElSVFJFRV9DT01FQUdBSU4ncyBzZWNvbmQgY2FsbGJhY2sgaXMgbm93Citkb25lIHdpdGggdGhlIGRpcmVjdG9yeSBmaWxlaGFuZGxlIHN0aWxsIG9wZW4gKG5ldyBkaXItPmFnYWluIHZhcmlhYmxlIGFkZGVkCit0byBkaXN0aW5ndWlzaCBmaXJzdCBmcm9tIHNlY29uZCBjYWxsYmFjaywgYW5kIHJlcXVlc3RpbmcgRElSVFJFRV9SRUNVUlNFIG5vdworcmVxdWlyZXMgcGFzc2luZyBpbiB0aGUgc3BlY2lmaWMgbWFjcm8gdmFsdWUsIG5vdCBqdXN0IGEgdHJ1ZS9mYWxzZSkuCitVc2UgZGFlbW9uKCkgb3V0IG9mIGxpYmMgaW5zdGVhZCBvZiBoYW5kLXJvbGxlZCBkYWVtb25pemUoKSBpbiB2YXJpb3VzCitwZW5kaW5nIGNvbW1hbmRzLiBzdHJpbmdfdG9fbW9kZSgpIG5vdyBwYXNzZXMgdGhyb3VnaCB0eXBlIGJpdHMgc28geW91IGNhbgordXNlIGl0IHRvIG1vcmUgZWFzaWx5IG1vZGlmeSBhIGZpbGUncyBleGlzdGluZyBtb2RlLgorU3BsaXQgeHBvcGVuKCkgaW50byB4cG9wZW5fYm90aCgpLCB4b3BlbigpLCBhbmQgeHJ1bigpIGRlcGVuZGluZyBvbiB3aGV0aGVyCit3ZSB3YW50IHRvIHJlZGlyZWN0IGJvdGgsIG9uZSwgb3IgbmVpdGhlciBvZiBzdGRpbi9zdGRvdXQuPC9wPgorCis8cD5CdWdmaXhlczogQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBUT1lCT1hfU1VJRCBvcHRpb24gY2FuJ3QgZHJvcCBwcml2aWxpZ2VzCisod2hpY2ggaGFwcGVucyB3aGVuIHlvdSBzdWlkIHNvbWV0aGluZyBfb3RoZXJfIHRoYW4gcm9vdCkuCitUaGUgb2xkIHBlbmRpbmcgdmVyc2lvbiBvZiBuYmRfY2xpZW50LmMgd2Fzbid0IGRlbGV0ZWQgd2hlbiB0aGUKK2NvbW1hbmQgd2FzIHByb21vdGVkIChhbmQgdGhlIGJ1aWxkIHdvdWxkIGJyZWFrIGlmIGJvdGggd2VyZSBlbmFibGVkKSwKK3RveV9leGVjKCkgc29tZXRpbWVzIG5lZWRzIHRvIHJlLWV4ZWMgZnJvbSAkUEFUSCByYXRoZXIgdGhhbiByZWN1cnNlCitpbnRlcm5hbGx5ICh0byBnYWluIGRyb3BwZWQgcm9vdCBwZXJtaXNzaW9ucyBvciBsaW1pdCBzdGFjayBkZXB0aCksCithbHdheXMgY2FsbCBzZXRsb2NhbGUoKSB3aGVuIEkxOE4gaXMgZW5hYmxlZCB0byBzd2l0Y2ggaXQgYmFjayBfb2ZmXyB3aGVuCit3ZSBydW4gY29tbWFuZHMgdGhhdCBleHBlY3Qgc3NjYW5mKCIlbiIpIHRvIHJldHVybiBieXRlcywKK2RpcnRyZWUoKSBoYWQgYSBtZW1vcnkgbGVhayBpbiBhbiBlcnJvciBwYXRoLCBwYXRjaC5jIGhhZCBzb21lIGJ1Z3MgaW4KK2Vycm9yIHBhdGhzIChkaWRuJ3QgcmVwb3J0IHByb2JsZW0gY2xlYXJseSkuIEFzaHdpbmkgU2hhcm1hIHNwb3R0ZWQgYW4KK29wdGlvbiBwYXJzaW5nIGJ1ZyB3aGVyZSBbLWFiY10gd291bGQgZm9yZ2V0IF9hbGxfIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3NhdmVkIGluIHRoZSBHTE9CQUxTKCkgYmxvY2sgKG5vdCBqdXN0IHRoZSBvbmVzIGZvciBvcHRpb25zIGJlaW5nIHN3aXRjaGVkCitvZmYpLCBwbHVzIHZhcmlvdXMgbWlub3IgZml4ZXMgdG8gbmJkX2NsaWVudCBhbmQgY3Bpby4KK0x1a2FzeiBTenBha293c2tpIGZpeGVkIHJtIC1mIG9uIGEgYnJva2VuIHN5bWxpbmsgKGZhaWxlZCksIGFuZCBraWxsYWxsCit3aXRoIG5vIGFyZ3VtZW50cyAoc2VnZmF1bHRlZCkuPC9wPgorCis8cD48Yj5Qb3J0YWJpbGl0eTwvYj48L3A+CisKKzxwPkEgc29tZXdoYXQgZmlkZGx5IGZpeCB0byBybSAtcmYgKHdoaWNoIG5lZWRzIHRvIGNobW9kIGRpcmVjdG9yaWVzIHRvIHUrcnd4Cit0byBkZXNjZW5kIGludG8gdGhlbSkgd2hpY2ggaGl0IGEgbXVzbCBidWcgaW4gZmFjY2Vzc2F0KCkgd2hpY2ggdGhlIG11c2wKK21haW50YWluZXIgcmVmdXNlcyB0byBmaXguIChIZSBsaXRlcmFsbHkgd2FudHMgdGhlIG1hbiBwYWdlIGNoYW5nZWQKK2luc3RlYWQsIGRlc3BpdGUgb3RoZXIgbGliY3Mgd29ya2luZy4pIEFkZGVkIGFuICNpZmRlZiBfX01VU0xfXyBzZWN0aW9uCit0byBwb3J0YWJpbGl0eS5oIHdpdGggYSB3b3JrYXJvdW5kLCB5b3UgbWF5IG5lZWQgQ0ZMQUdTPS1EX19NVVNMX18gaW4geW91cgorYnVpbGQgaWYgeW91ciBtdXNsIGJ1aWxkJ3MgZmVhdHVyZXMuaCBkb2Vzbid0ICNkZWZpbmUgdGhhdC4gKEkgbWF5IGRvCithIGRpZmZlcmVudCB3b3JrYXJvdW5kIGluIGZ1dHVyZSwgYnV0IHNvbWV0aW1lcyB5b3UndmUganVzdCBnb3QgdG8gbWFrZQoraXQgd29yayBzbyB5b3UgY2FuIHNoaXAuIEFsc28sIHRveWJveCBncmVwIHdpdGggbXVsdGlwbGUgcGF0dGVybnMKK3JlcXVpcmVzIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2hnL2Fib3JpZ2luYWwvcmV2LzE2OTI+YSBwYXRjaAordG8gbXVzbCdzIHJlZ2V4IGVuZ2luZTwvYT4sIHdoaWNoIGFwcGxpZXMgdG8gMS4xLjQgYnV0IG5vdCB0byB0aGUgY3VycmVudAorbXVzbCBzb3VyY2UgY29udHJvbC4pPC9wPgorCis8cD5Nb3JlIHBvcnRhYmlsaXR5LmggZml4ZXMgZm9yIHVDbGliYyB0b28uIChJIGRvbid0IGV4cGVjdCB0aGF0IHRvIGV2ZXIgaGF2ZQorYW5vdGhlciByZWxlYXNlLCBzbyBsb2NhbGx5IHBhdGNoaW5nIGFyb3VuZCBwb3NpeC0yMDA4IHZpb2xhdGlvbnMgaXMgc2lsbHkpLjwvcD4KKworPHA+PGI+Q2hhbmdlIHRvIHVzZXJuYW1lIGZpbHRlcmluZzwvYj48L3A+CisKKzxwPlBvc2l4IHJlY29tbWVuZHMgdGhlIHVzZXJuYW1lIGNyZWF0aW9uIGxvZ2ljIGZpbHRlciB1c2VybmFtZXMgdG8gYSBzbWFsbAorYWxsb3dlZCBzZXQgb2YgY2hhcmFjdGVycyAod2hpY2ggZXZlbiBSZWQgSGF0IGJyZWFrcyBieSBleHBsaWNpdGx5IGFsbG93aW5nCisiJCIgYXQgdGhlIGVuZCksIGJ1dCB0aGlzIHByZXZlbnRzIFVURi04IHVzZXJuYW1lcy4gUG9zaXgnIHN0YXRlZCBsb2dpYworaXMgdG8gYWxsb3cgZmlsZXN5c3RlbXMgdG8gY3JlYXRlIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksIGJ1dCBMaW51eAorZmlsZXN5c3RlbXMgY2FuIGFjY2VwdCBhbnkgY2hhcmFjdGVyIGJ1dCBOVUwgYW5kICIvIi4gVGhlIG9ubHkgY2hhcmFjdGVycword2UgYWN0dWFsbHkgX25lZWRfIHRvIGZpbHRlciBvdXQgYXJlICI6IiAoZmllbGQgc2VwYXJhdG9yIGluIHBhc3N3ZCksCituZXdsaW5lIChsaW5lIHNlcGFyYXRvciBpbiBwYXNzd2QpLCBhbmQgIi8iIChkaXJlY3Rvcnkgc2VwYXJhdG9yIGluCitmaWxlc3lzdGVtKS48L3A+CisKKzxoMz5Eb2N1bWVudGF0aW9uPC9oMz4KKworPHA+V2ViIHBhZ2VzIHVwZGF0ZWQ6IGNsZWFudXAuaHRtbCBkb2N1bWVudHMgbW9yZSBjbGVhbnVwLCBjb2RlLmh0bWwKK2RvY3VtZW50cyBtb3JlIGNvZGUsIGFuZCBhYm91dC5odG1sIG5vdyBjYXBpdGFsaXplcyAidG95Ym94IiBjb25zaXN0ZW50bHkKKyhpdCdzIGp1c3QgYSB3b3JkLCBjYXBpdGFsaXplIGF0IHN0YXJ0IG9mIHNlbnRlbmNlKS48L3A+CisKKzxwPlRoZSBwZW5kaW5nL1JFQURNRSBmaWxlIG5vdyBsaXN0cyBjb21tYW5kcyB0aGF0IG5lZWRlZCByZXZpZXcvY2xlYW51cAorYmVmb3JlIHRoZSBwZW5kaW5nIGRpcmVjdG9yeSB3YXMgYWRkZWQuPC9wPgorCis8aDM+VGVzdCBTdWl0ZTwvaDM+CisKKzxwPk1vdmVkIG91dCBvZiBzY3JpcHRzL3Rlc3QgaW50byB0b3AgbGV2ZWwgInRlc3RzIiBkaXJlY3RvcnksIGFuZCB0aGUKK3Rlc3Rpbmcuc2ggc2NyaXB0IGlzIG5vdyBpbiBzY3JpcHRzIHJhdGhlciB0aGFuIG1peGVkIGludG8gdGhlICoudGVzdCBmaWxlcy48L3A+CisKKzxwPkpvaGFuIEJlcmdzdHLDtm0gcmVxdWVzdGVkIFZFUkJPU0U9ZmFpbCB0byBtYWtlIHRlc3RzICh0ZWxsaW5nIGl0IHRvCitzdG9wIGF0IHRoZSBmaXJzdCBmYWlsdXJlKSwgYW5kIHNwb3R0ZWQgYSBidWlsZCBidWcgd2hlcmUgdXNpbmcgZ251Citzb3J0IG9uIHRoZSBob3N0IGJyb2tlIGluIG5vbi1DIGxvY2FsZXMuPC9wPgorCis8cD5EaXZ5YSBLb3RoYXJpIHN1Ym1pdHRlZCB0ZXN0cyBmb3IgY2htb2QsIGxpbmssIHRhciwgYnpjYXQsIHh6Y2F0LCB6Y2F0LAorYW5kIGhvc3RuYW1lLiAoQW5kIG1vcmUsIGJ1dCB0aGF0J3MgYWxsIHRoYXQncyBtZXJnZWQgc28gZmFyLik8L3A+CisKKzxhIG5hbWU9IjA3LTA3LTIwMTQiIC8+PGEgaHJlZj0iIzA3LTA3LTIwMTQiPjxocj48aDI+PGI+SnVseSA3LCAyMDE0PC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+IlRoaXMgcGxhbmV0IGhhcyAtIG9yIHJhdGhlciBoYWQgLSBhIHByb2JsZW0sIHdoaWNoIHdhcyB0aGlzOgorbW9zdCBvZiB0aGUgcGVvcGxlIGxpdmluZyBvbiBpdCB3ZXJlIHVuaGFwcHkgZm9yIHByZXR0eSBtdWNoIG9mIHRoZSB0aW1lLiBNYW55Citzb2x1dGlvbnMgd2VyZSBzdWdnZXN0ZWQgZm9yIHRoaXMgcHJvYmxlbSwgYnV0IG1vc3Qgb2YgdGhlc2Ugd2VyZSBsYXJnZWx5Citjb25jZXJuZWQgd2l0aCB0aGUgbW92ZW1lbnQgb2Ygc21hbGwgZ3JlZW4gcGllY2VzIG9mIHBhcGVyLCB3aGljaCB3YXMgb2RkCitiZWNhdXNlIG9uIHRoZSB3aG9sZSBpdCB3YXNuJ3QgdGhlIHNtYWxsIGdyZWVuIHBpZWNlcyBvZiBwYXBlciB0aGF0IHdlcmUKK3VuaGFwcHkuIiAtIFRoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eS48L3A+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC40LjkudGFyLmJ6Mj5Ub3lib3ggMC40Ljk8L2E+ICg8YSBocmVmPS9oZy90b3lib3gvc2hvcnRsb2cvMTM4NT5jb21taXQgMTM4NTwvYT4pIGlzIG91dC48L3A+CisKKzxwPjxiPk5ldyBjb21tYW5kczwvYj4gYWRkZWQgdG8gcGVuZGluZyBpbmNsdWRlOgorbHNhdHRyLCBjaGF0dHIsIGlub3RpZnlkLCByZmtpbGwsIHN1bG9naW4sIHN0cmluZ3MsIG1ha2VkZXZzLAora2lsbGFsbDUsIGFuZCB0YXIgZnJvbSBBc2h3aW5pIFNoYXJtYSwgYXJwIGZyb20gS3l1bmd3YW4gSGFuLAorc3lzY3RsIGJ5IEJpbGFsIFF1cmVzaGksIHBhcnRwcm9iZSBmcm9tIEJlcnRvbGQgVmFuIGRlbiBCZXJnaCwKK2hvc3QgZnJvbSBSaWNoIGZlbGtlciwgYW5kIEkgZGlkIG5iZC1jbGllbnQgYW5kIHRoZSBmaXJzdCAyLzMgb2YgbW91bnQuPC9wPgorCis8cD5GaW5pc2hlZCBjbGVhbnVwcyAoY29tbWFuZHMgcHJvbW90ZWQgb3V0IG9mIHBlbmRpbmcpOgorc3lzY3RsLCByZmtpbGwsIHN0cmluZ3MsIG1rcGFzc3dkLCBtYWtlZGV2cywgcGFydHByb2JlLCBraWxsYWxsNSwKK2ZhbGxvY2F0ZSwgYW5kIG5iZC1jbGllbnQuPC9wPgorCis8cD4oQWxvbmcgdGhlIHdheSBwYXJ0aWFsIGNsZWFudXBzIGdvdCBtYWRlIHRvOiBsYXN0LCBmb2xkLCBsc3BjaSwgcHMsCitib290Y2hhcnRkLCBpbml0LCBmc2NrLCB0ZWxuZXRkLCB0ZWxuZXQsIHZjb25maWcsIHRveXNoLCBpY29udiwgdXNlcmFkZCwKK2xvZ2luLCBob3N0LCBvcGVudnQsIGRlYWxsb2N2dCwgZ2V0dHksIHRmdHBkLCBhbmQgbW9kcHJvYmUuIEJ1dCB0aGVyZSdzCitzdGlsbCBtb3JlIHRvIGRvIG9uIGFsbCBvZiB0aG9zZS4pPC9wPgorCis8cD5UaGlzIHRpbWUgYXJvdW5kIHRoZSA8YSBocmVmPWJpbj5zdGF0aWMgYmluYXJpZXM8L2E+IGFyZSBsaW5rZWQgYWdhaW5zdAorbXVzbCBpbnN0ZWFkIG9mIHVDbGliYy4gKFRoYXQncyB3aHkgdGhlcmUncyBubyBzcGFyYyB2ZXJzaW9uLCBtdXNsIGRvZXNuJ3QKK3N1cHBvcnQgdGhhdCB0YXJnZXQgeWV0Lik8L3A+CisKKzxwPjxiPkRvY3VtZW50YXRpb246PC9iPjwvcD4KKworPHA+VGhlIGhlbHAgdGV4dCBwYXJzZXIgZXhwZWN0cyBsb3dlciBjYXNlICJ1c2FnZToiIGxpbmVzIHdpdGgKK2EgYmxhbmsgbGluZSBhZnRlciB0aGVtLCBzbyBnbyB0aHJvdWdoIGFuZCByZWd1bGFyaXplIHRob3NlLiBFeHBhbmQgdGhlCisiY29kaW5nIHN0eWxlIiBzZWN0aW9uIGluIHRoZSBkb2NzIGFuZCBtb3ZlIGl0IHRvIGRlc2lnbi5odG1sLiAoTm90IGEgc2hvdworc3RvcHBlciBmb3IgaW5jb21pbmcKK2NvbnRyaWJ1dGlvbnMsIGp1c3QgYW4gZXhwbGFuYXRpb24gb2Ygc29tZSBvZiB0aGUgdGhpbmdzIEknbGwgZG8gdG8gdGhlbQorZHVyaW5nIGNsZWFudXAuKSBUaGUgaGVscCB0ZXh0IGZvciB0aGUgInRveWJveCIgY29tbWFuZCBub3cgaW5jbHVkZXMKK3RoZSBzaGVsbCBzY3JpcHQgc25pcHBldCB0byBpbnN0YWxsIHN5bWxpbmtzIHRvIHRoZSB0b3lib3ggYmluYXJ5LjwvcD4KKworPHA+VGhlIDxhIGhyZWY9Y2xlYW51cC5odG1sPmNsZWFudXAgcGFnZTwvYT4gbm93IGhhcyBkZXNjcmlwdGlvbnMgZm9yIHRoZQorZnVsbCBpZmNvbmZpZyBjbGVhbnVwIHNlcmllcywgYW1vbmcgb3RoZXJzLjwvcD4KKworPHA+VGhlIG5ldyB0b3lzL2V4YW1wbGVzIGRpcmVjdG9yeSBjb250YWlucyBoZWxsby5jIGFuZCBza2VsZXRvbi5jLiBUaGUgZmlyc3QgaXMKK2Egc2ltcGxlIGhlbGxvIHdvcmxkIHByb2dyYW0gaW4gdG95Ym94IHN0eWxlLCB0aGUgc2Vjb25kIGlzIGEgbXVjaCBtb3JlCitlbGFib3JhdGUgZXhhbXBsZSBwcm9ncmFtIHVzaW5nIHNob3dpbmcgaG93IHRvIHVzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbgorcGFyc2luZyBhbmQgaG93IHRvIHByb3ZpZGUgbXVsdGlwbGUgY29tbWFuZHMgaW4gdGhlIHNhbWUgQyBmaWxlLjwvcD4KKworPHA+PGI+Rml4ZXM8L2I+OjwvcD4KKworPHA+Rml4IG9kIGJ1ZyByZXBvcnRlZCBieSBTYW11ZWwgSG9sbGFuZCAoIm9kIC12IC1iIiB3YXMgYXBwZW5kaW5nIHRoZSBkZWZhdWx0CitvdXRwdXQgdHlwZSBldmVuIHRob3VnaCBhbiBvdXRwdXQgdHlwZSB3YXMgc3BlY2lmaWVkKS4gQXNod2luaSBTaGFybWEgcmVwb3J0ZWQKK2J1Z3Mgd2hlcmUgcmVhZGZpbGUoKSB3YXMgaW5jb3JyZWN0bHkgZnJlZWluZyBpdHMgYnVmZmVyLCBhbmQgd2hlcmUgdG95X2luaXQoKQord2FzIHplcm9pbmcgdGhlIHdyb25nIGRhdGEgYmVjYXVzZSB0aGUgZmllbGQgaXQgd2FzIHVzaW5nIHRvIG1lYXN1cmUgKHJlYm91bmQpCitoYWQgbW92ZWQgKHdoZW4gSSBtb3ZlZCBpdCBiYWNrIEkgYWRkZWQgYSBjb21tZW50IHdoeSB0aGUgZmllbGQgbmVlZHMgdG8gYmUKK3RoZXJlKSwgZml4ZWQgYSBzZWdmYXVsdCBpbiB0aGUgZGhjcCBjbGllbnQsIGFuZCBtYWRlIGEgMCBsZW5ndGggcmVhZCBhdAordGhlIHN0YXJ0IG9mIHBhc3N3b3JkIGVudHJ5IGNvdW50IGFzIEVPRi4gTWFrZSB0aGUgIndlIGFyZSBub3Qgcm9vdCIgdGVzdAoraW4gdGhlIGluaXQgY29kZSBzaG93IHRoZSBoZWxwIHRleHQuIFBvc2l4IGltcGxpZXMgdGhhdCBmZmx1c2goKSBjYW4gcmV0dXJuCitzdWNjZXNzIGV2ZW4gd2hlbiB0aGUgc3RyZWFtJ3MgZXJyb3IgYml0IGlzIHNldCwgc28gY2FsbCBib3RoIGZmbHVzaCgpIGFuZAorZmVycm9yKCkgZnJvbSB4cHJpbnRmKCkuPC9wPgorCis8cD5Jc2FhYyBEdW5oYW0gcG9pbnRlZCBvdXQgdGhhdCBibG9hdGNoZWNrIGNvdWxkbid0IGRlYWwgd2l0aCBkaWZmCitpbXBsZW1lbnRhdGlvbnMgdGhhdCBvbmx5IGltcGxlbWVudCAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFuZCB0aGF0IHNvbWUKK2RpZmYgaW1wbGVtZW50YXRpb25zIGNhbid0IGhhbmRsZSBub25zZWVrYWJsZSBpbnB1dCAoSS5FLiByZWFkaW5nIGZyb20KK2EgcGlwZSkuIEJ1Z2ZpeCBzbyAiaGVscCAtYSIgd29ya3MgYWdhaW4uIE9wdGlvbiBwYXJzaW5nIG9uIG5vaHVwIG5vdyBzdG9wcworYXQgZmlyc3Qgbm9ub3B0aW9uIGFyZ3VtZW50LiBGaXggc2VnZmF1bHQgaW4gIndoaWNoIiBpZiBQQVRIIHdhc24ndCBzZXQsCit3aGljaCB3YXMgYWN0dWFsbHkgYSBidWcgaW4gbGliIGZ1bmN0aW9uIGZpbmRfaW5fcGF0aCgpLiBNYWRlIHJtIC1yZiBvZgorY2htb2QgMDAwIGRpcmVjdG9yaWVzIGFjdHVhbGx5IHJlbW92ZSB0aGVtLjwvcD4KKworPHA+VGhlIGJ1aWxkIG5vdyBwYXNzZXMgdGhlIHNhbWUgJENGTEFHUyB0byB0aGUgbGlicmFyeSBwcm9iZSBhcyB0aGUgZmluYWwKK2J1aWxkLCBiZWNhdXNlIGFyY2ggbGludXggaXMgc28gYnJva2VuIGl0IHByb3ZpZGVzIGRpZmZlcmVudCBzZXRzIG9mCitsaWJyYXJpZXMgZm9yIHN0YXRpYyBhbmQgZHluYW1pYyBsaW5raW5nLjwvcD4KKworPHA+SXQgdHVybnMgb3V0IHNwcmludGYoIiUuMTIzcyIsIHN0cikgaXMgY291bnRpbmcgY2hhcmFjdGVycywgbm90IGJ5dGVzLAorc28gZ2xvYmFsbHkgZW5hYmxpbmcgbG9jYWxlIHN1cHBvcnQgb3BlbnMgc3RhY2sgc21hc2hpbmcgdnVsbmVyYWJpbGl0aWVzLgorU28gdGhlcmUncyBhIG5ldyBUT1lGTEFHU19MT0NBTEUgeW91IHNldCBpbiB0b3lmbGFncyB3aGVuIHlvdSB3YW50IHRoZQorc2V0dXAgY29kZSB0byBzZXRsb2NhbGUoKS48L3A+CisKKzxwPjxiPlVwZ3JhZGVzOjwvYj48L3A+CisKKzxwPklzYWFjIER1bmhhbSBleHRlbmRlZCBjcGlvIHRvIGFyY2hpdmUgdW5yZWFkYWJsZSBlbXB0eSBmaWxlcywgYW5kIEkgdGF1Z2h0IGl0Cit0byBzZXQgdWlkL2dpZCBhbmQgdGltZXN0YW1wIHdoZW4gZXh0cmFjdGluZyBhcmNoaXZlcy4gSXNhYWMgYWxzbworYWRkZWQgdGVzdHMgZm9yIGNwaW8sIGxpbmssIGFuZCBkdSwgYWRkZWQgbHNwY2kgLWksIG1hZGUgdGhlIHBjaSBkYXRhYmFzZQorcGFyc2luZyBza2lwICMgY29tbWVudCBsaW5lcywgbWVyZ2VkIGxvZ25hbWUgYW5kIHdob2FtaSBpbnRvIGlkLjwvcD4KKworPHA+RGFuaWVsIFZlcmthbXAgc3BlZCB1cCBtZDVzdW0gYWJvdXQgMzAlIHdpdGggc29tZSBsb29wIHVucm9sbGluZywgbWFraW5nCitpdCBhY3R1YWxseSBzbWFsbGVyIGluIHRoZSBwcm9jZXNzLiBJIGFkZGVkIC1iIGZsYWdzIHRvIG1kNXN1bSBhbmQgc2hhMXN1bQorZm9yICJicmllZiIgb3V0cHV0IHRoYXQncyBqdXN0IHRoZSBoYXNoIHdpdGggbm8gZmlsZW5hbWUuIChJJ20gYXdhcmUgb3RoZXIKK2ltcGxlbWVudGF0aW9ucyB1c2UgdGhhdCBmb3IgTVNET1MgImJpbmFyeSIgbW9kZSwgYW5kIGRvbid0IGNhcmUuKTwvcD4KKworPHA+V2hlbiBidWlsZGluZyBzdGFuZGFsb25lIGNvbW1hbmRzIChzY3JpcHRzL3NpbmdsZWNvbmZpZy5zaCBjb21tYW5kbmFtZSksCit0aGUgYnVpbGQgbm93IHN3aXRjaGVzIG9uIGFsbCB0aGUgc3ViLW9wdGlvbnMgb2YgdGhlIGNvbW1hbmQgc28gd2UgZ2V0CithIHN0YW5kYWxvbmUgdmVyc2lvbiB3aXRoIGFsbCB0aGUgYmVsbHMgYW5kIHdoaXN0bGVzIGVuYWJsZWQuPC9wPgorCis8cD5BZGQgLWRzIGZsYWdzIHRvIGRhdGUgYW5kIGRvY3VtZW50ICtGT1JNQVQgZXNjYXBlcy4gQWRkIHRoZSBzaGVsbCBOT1AKK2NvbW1hbmQgIjoiIGFzIGFuIGFsaWFzIGZvciB0cnVlIChmb3IgdG95c2gpLjwvcD4KKworPHA+QWRkIHVDbGliYyBwcm9iZSBmb3IgaWNvbnYoKSBhbmQgZmFsbG9jYXRlLiAoVGhlIGZhY3QgaXQgZGlkbid0IGFsd2F5cworYnVpbGQgYWdhaW5zdCB1Q2xpYmMgaXMgd2h5IGZhbGxvY2F0ZSB3YXNuJ3QgZW5hYmxlZCBpbiBkZWZjb25maWcgYmVmb3JlLik8L3A+CisKKzxwPlRoZSB1bW91bnQgY29tbWFuZCBub3cgZG9lcyBhbiBsb3NldHVwIC1kIG9uIHRoZSBkZXZpY2UgYnkgZGVmYXVsdCwgc28KK3dlIGRvbid0IGxlYWsgbG9vcGJhY2sgZGV2aWNlcy4gQnVnZml4IHRvIGxvc2V0dXAgc28gImxvc2V0dXAgL2Rldi9sb29wMAorZmlsZW5hbWUiIGFjdHVhbGx5IHdvcmtzIGFnYWluLjwvcD4KKworPHA+RGl2eWEgS290aGFyaSBzZW50IGluIHRlc3Qgc3VpdGUgZW50cmllcyBmb3IgbHMsIGxuLCBybSwgbXYsIHByaW50ZiwgZGQsCithbmQgcmVuaWNlLiBUaGVuIGEgc2Vjb25kIHJvdW5kIGZvciBsc2F0dHIvY2hhdHRyLCBtb3VudCwgY2htb2QsIHBncmVwL3BraWxsLAorZ3JvdXBhZGQsIGdyb3VwZGVsLCBhbmQgdXNlcmFkZC4gU2V2ZXJhbCBvZiB0aGVzZSB1bmNvdmVyZWQgYnVncywgc3RpbGwKK3dvcmtpbmcgdG8gZml4IHRoZW0uPC9wPgorCis8cD5UaGVyZSBhcmUgbm93IGZyZWUoKSBmdW5jdGlvbnMgZm9yIHRoZSBwcmVkZWZpbmVkIGxsaXN0IHR5cGVzIGFuZCBhCitkbGlzdF90ZXJtaW5hdGUoKSBmdW5jdGlvbiB0byBicmVhayBkb3VibHkgbGlua2VkIGxpc3RzLiBUaGUgbmV3CitnZW5lcmljX3NpZ25hbCgpIGhhbmRsZXIgZWl0aGVyIHNldHMgInRveXMuc2lnbmFsIiBvciB3cml0ZXMgYSBieXRlCit0byB0b3lzLnNpZ25hbGZkIHdpdGggdGhlIHNpZ25hbCBudW1iZXIgaWYgc2lnbmFsZmQgaXNuJ3QgLTEgKHdoaWNoIGl0J3MKK2luaXRpYWxpemVkIHRvIGluIHRveV9pbml0KS48L3A+CisKKzxwPlRoZSBvcHRpb24gcGFyc2luZyBsb2dpYyBjYW4gbm93IGRldGVjdCB3aGVuIGEgZG91YmxlIGZpdHMgaW4gYSBsb25nIGFuZAordXNlIHRoZSBtb3JlIHByZWNpc2UgdHlwZSBmb3IgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzICh0aGUgRkxPQVQgbWFjcm8KK2NvbnRhaW5zIHRoZSB0eXBlIHVzZWQpLiBUaGUgaHVtYW5fcmVhZGFibGUoKSBmdW5jdGlvbiBub3cganVzdCBvdXRwdXRzCitkZWNpbWFsIGtpbG8vbWVnYS9naWdhYnl0ZXMgKHNvIHdoZW4gZHUgLXUgc2F5cyA1LjBHIGl0IG1lYW5zIDUuMCBiaWxsaW9uCitieXRlcykuIFRoZSBidWlsZCBpbmZyYXN0cnVjdHVyZSBub3cgbm90aWNlcyBkdXBsaWNhdGUgY29tbWFuZHMgKHNvIGlmIHlvdQorY3AgdG95cy9wZW5kaW5nL2NvbW1hbmQuYyB0b3lzL290aGVyL2NvbW1hbmQuYyBhbmQgZm9yZ2V0IHRvIGRlbGV0ZSB0aGUKK2ZpcnN0IG9uZSwgdGhlIGJ1aWxkIGJyZWFrIGlzIG5vdyBtb3JlIGluZm9ybWF0aXZlKS48L3A+CisKKzxhIG5hbWU9IjIwLTA0LTIwMTQiIC8+PGEgaHJlZj0iIzIwLTA0LTIwMTQiPjxocj48aDI+PGI+QXByaWwgMjAsIDIwMTQ8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD5BbmQgdG8gdGhpcyBlbmQgdGhleSBidWlsdCB0aGVtc2VsdmVzIGEgc3R1cGVuZG91cyBzdXBlcmNvbXB1dGVyCit3aGljaCB3YXMgc28gYW1hemluZ2x5IGludGVsbGlnZW50IHRoYXQgZXZlbiBiZWZvcmUgdGhlIGRhdGEgYmFua3MKK2hhZCBiZWVuIGNvbm5lY3RlZCB1cCBpdCBoYWQgc3RhcnRlZCBmcm9tICJJIHRoaW5rIHRoZXJlZm9yZSBJIGFtIiBhbmQgZ290IGFzCitmYXIgYXMgdGhlIGV4aXN0ZW5jZSBvZiByaWNlIHB1ZGRpbmcgYW5kIGluY29tZSB0YXggYmVmb3JlIGFueW9uZSBtYW5hZ2VkIHRvCit0dXJuIGl0IG9mZi4gLSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNC44LnRhci5iejI+VG95Ym94IDAuNC44PC9hPiBpcyBiYXNlZCBvbgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvdG95Ym94L3Nob3J0bG9nLzEyNjI+Y29tbWl0IDEyNjI8L2E+LiBBbmQKK2Fib3V0IHRpbWUgdG9vLjwvcD4KKworPHA+VGhlIGJpZyBuZXdzIGlzIHRoYXQgdGhlIGJ1aWxkIG5vIGxvbmdlciBuZWVkcyBweXRob24gdG8gZ2VuZXJhdGUgaGVscC5oLAordGhhdCdzIG5vdyBkb25lIGluIEMuIFRoZSBoZWxwIHRleHQgZ2VuZXJhdGlvbiBpcyBhbHNvIGNvbGxhdGluZyBoZWxwIHRleHQKK2Zyb20gbXVsdGlwbGUgb3B0aW9ucywgbWVyZ2luZyBjb21tYW5kIGxpbmUgb3B0aW9uIGJsb2NrcyBhbmQgdXNhZ2U6IGxpbmVzLgorVGhlcmUncyBldmVuIGEgbmV3IDxhIGhyZWY9aGVscC5odG1sPmhlbHAgd2ViIHBhZ2U8L2E+LjwvcD4KKworPHA+PGI+TmV3IGNvbW1hbmRzOjwvYj4gSWZjb25maWcsIGNwaW8sIGFuZCBzdSB3ZXJlIGNsZWFuZWQgdXAgdGhlIHJlc3Qgb2YgdGhlCit3YXkgYW5kIHByb21vdGVkIG91dCBvZiBwZW5kaW5nLiBUaGF0IHNhZ2EgaXMgbW9zdGx5IGV4cGxhaW5lZCBvbiB0aGUKKzxhIGhyZWY9Y2xlYW51cC5odG1sPmNsZWFudXAgcGFnZTwvYT4uIFZpdmVrIEJoYWdhdCdzIGZyZWVyYW1kaXNrLAorSXNhYWMgRHVuaGFtJ3MgZnNmcmVlemUsIGFuZCBGZWxpeCBKYW5kYSdzIGljb252IGFyZSBhbHNvIG5ldy48L3A+CisKKzxwPjxiPkluIHBlbmRpbmc6PC9iPgorQXNod2luaSBTaGFybWEncyB0ZWFtIHN1Ym1pdHRlZCB0Y3BzdmQsIHVkcHN2ZCwgdGVsbmV0LCB0ZWxuZXRkLCBsYXN0LCBtb3JlLAorZ3JvdXBkZWwvZGVsZ3JvdXAsIGFycGluZywgYnJjdGwsIGZ0cGdldCwgZnRwcHV0LCBwcmludGYsIHJlc2V0LCBhbmQgYWRkZWQKK2lwdjYgc3VwcG9ydCB0byB0cmFjZXJvdXRlLiBLeXVuZ3dhbiBIYW4ncyB0ZWFtIHN1Ym1pdHRlZCBtb2Rwcm9iZSBhbmQgZ2V0dHkuCitWaXZlayBCaGFnYXQgc3VibWl0dGVkIG9wZW52dCBhbmQgZGVhY2xsb2N2dC4gU2FtdWVsIEhvbGxhbmQgc3VibWl0dGVkIGZvbGQuCitJIHdyb3RlIGEgbmV3IGluZmxhdGUgKHppcC96bGliL2d6aXAgZGVjb21wcmVzc2lvbikgaW1wbGVtZW50YXRpb24gaW4KK2NvbXByZXNzLmMsIGFuZCBzdGlsbCAgbmVlZCB0byBkbyBhIGNvcnJlc3BvbmRpbmcgZGVmbGF0ZSAoY29tcHJlc3Npb24tc2lkZSkKK2FuZCBwbHVnIHRoZW0gaW50byBnemlwIGFuZCB6aXAgYW5kIHNvIG9uLiAoUmlnaHQgbm93IGl0IGRvZXMgemNhdC4pPC9wPgorCis8cD5TZXZlcmFsIGNvbW1hbmRzICh2bXN0YXQsIGxvZ2luLCBkdSwgdmNvbmZpZywgbW91bnRwb2ludCwgZnJlZSwgY2hyb290LAorY3V0LCB0b3VjaCwgbW9kaW5mbywgZXhwYW5kKSBwcmVkYXRlIHRoZSAicGVuZGluZyIgZGlyZWN0b3J5LCBhbmQgYXJlIHRodXMKK2luIG90aGVyIGRpcmVjdG9yaWVzIGJ1dCBzdGlsbCBuZWVkIGNsZWFudXAuIE9mIHRoZXNlLCB2bXN0YXQgZ290IHNvbWUKK3dvcmsgdGhpcyB0aW1lICh3aGljaCB3b3VsZCBiZSBtdWNoIGVhc2llciBvdGhlciB2bXN0YXQgaW1wbGVtZW50YXRpb25zCitkb2N1bWVudGVkIHdoYXQgdGhlaXIgb3V0cHV0IGFjdHVhbGx5IG1lYW50KS48L3A+CisKKzxwPjxiPlVwZ3JhZGVzOjwvYj4gSWZjb25maWcgZ3JldyAvcHJlZml4IG5ldG1hc2sgc3VwcG9ydCAoYWxhIDEuMi4zLjQvMjQpLiBHcmVwIG5vdyBoYXMgLXpaIHRvCitoYW5kbGUgbnVsbCB0ZXJtaW5hdGVkIGRhdGEsIGNrc3VtIGdyZXcgLUggZm9yIGhleCBvdXRwdXQuIFVwZ3JhZGVkIG9kIHNvIHRoZQorZmllbGRzIGFsaWduIGJldHRlciB3aGVuIHByb2R1Y2luZyBtdWx0aXBsZSBvdXRwdXQgdHlwZXMuIEhlbHAgaGFzIC1hIGFuZCAtaAorb3B0aW9ucyAoYWxsIGNvbW1hbmRzLCBodG1sIG91dHB1dCkuCitCdWdmaXggdG8gYmxraWQgYnVpbGRpbmcgZm9yIGEgMzIgYml0IHRhcmdldC4gVGhlIGRhdGUgY29tbWFuZCBjYW4gYWN0dWFsbHkKK3NldCBkYXRlcyBub3cuIFRoZSBPX05PRk9MTE9XIGNvbXBpbGUgdGltZSBwcm9iZSBkaWRuJ3Qgd29yayB3aXRoIGNyb3NzCitjb21waWxpbmcsIHNvIGl0J3MgYmFjayB0byBhbiAjaWZkZWYgdGVzdCBpbiBwb3J0YWJpbGl0eS5oLiBOYXRoYW4gTWNTd2Vlbgorc2VudCBpbiBhIGJ1Z2ZpeCB0byBvZCBhbmQgYSBwb3J0YWJpbGl0eSBmaXggaW4gdGhlIGNvbW1vbiBsaWJyYXJ5IGNvZGUuCitBc2h3aW5pIFNoYXJtYSBzcG90dGVkIGEgYnVnIGluIHBpZG9mIC1vLCBhbmQgYWRkZWQgdmVyYm9zZSAoLXYpIG9wdGlvbnMKK3RvIG1rZGlyIGFuZCBsbiwgYW5kIHN1Z2dlc3RlZCBraWxsYWxsIHNob3VsZCBoYXZlIGFuIC1zIG9wdGlvbiBhbmQKK2FsbG93IC1sIHRvIHRha2UgemVybyBhcmd1bWVudHMuIEFzaHdpbmkgU2hhcm1hIGFuZCBGZWxpeCBKYW5kYSB1cGdyYWRlZAordGZ0cGQuICBGaXhlZCBkdW1wbGVhc2VzIHN0aWxsIHVzaW5nIHRveW5ldC5oIGFmdGVyCit0aGF0IHdhcyByZW1vdmVkLiBDb3JyZWN0ZWQga2lsbGFsbCByZXR1cm4gY29kZSBhbmQgZXJyb3IgcmVwb3J0aW5nLgorSXNhY2MgRHVuaGFtIGZpeGVkIGJ1Z3MgYWxsIG92ZXIgdGhlIHRyZWUsIGRpZCBjbGVhbnVwIG9uIGEgYnVuY2ggb2YKK3BlbmRpbmcgY29tbWFuZHMgKGdldHR5LCBmdHBnZXQsIGluaXQsIG9wZW52dCwgbW9kcHJvYmUuLi4pLCBhbmQgY2xhcmlmaWVkCitmaW5kJ3MgaGVscCB0ZXh0LiBUb20gU3BhcnJvdyByYW4gdGhyZWUgZGlmZmVyZW50IHN0YXRpYyBhbmFseXplcnMgb24KK3RoZSBjb2RlLCB3aGljaCByZXN1bHRlZCBpbiBhIGZldyBjbGVhbnVwcy4gVGhlIHBlZWsoKS9wb2tlKCkgZnVuY3Rpb25zCitub3cgdXNlICJ2b2xhdGlsZSIgdG8gcHJldmVudCBicm9rZW4gY29tcGlsZXIgIm9wdGltaXphdGlvbnMiIHRvIGRvIHdpdGgKK2FsaWFzaW5nLjwvcD4KKworPHA+PGI+QnVpbGQgc3R1ZmY6PC9iPiBFYWNoIEZPUl94eHh4IG1hY3JvIG5vdyBoYXMgYSBjb21wbGVtZW50YXJ5IENMRUFOVVBfeHh4eCBtYWNybywgc28geW91CitjYW4gcHV0IG11bHRpcGxlIGNvbW1hbmRzIHdpdGggZGlmZmVyZW50IGNvbW1hbmQgbGluZSBvcHRpb25zIGluIHRoZSBzYW1lCisuYyBmaWxlLCBzbyB0aGV5IGNhbiBzaGFyZSBpbmZyYXN0cnVjdHVyZSBvdXRzaWRlIG9mIGxpYi4gKFRoaXMgbGV0IHRoZQorYnVuemlwIGxvZ2ljIG1vdmUgb3V0IG9mIGxpYiBpbnRvIGJ6Y2F0LmMuKSBTZWUgWFhYIGZvciBleGFtcGxlLgoraQorPHA+VGhlIGhlYWRlcnMgI2luY2x1ZGVkIGluIHRveXMuaCBhcmUgbm93IGdyb3VwZWQgYnkgc3RhbmRhcmQsIGFuZCBoZWFkZXJzCitub3QgbGlzdGVkIGluIFBvc2l4IG9yIExTQiB3ZXJlIG1vdmVkIHRvIHBvcnRhYmlsaXR5LmguIFRoZSBvbGQgeHJlZ2NvbXAuaAord2FzIGZvbGRlZCBpbnRvIGxpYi5oIGJlY2F1c2UgaXQncyBwb3NpeCAoYW5kIHN1cHBvcnRpbmcgb2RkYmFsbCB1Q2xpYmMKK2NvbmZpZ3VyYXRpb25zIGlzbid0IGFzIGltcG9ydGFudCBhcyBpdCBvbmNlIHdhcykuPC9wPgorCis8cD5SZWdyZXNzaW9uIHRlc3RlZCBhZ2FpbnN0IFVidW50dSA4LjA0IHRvIGZpeCB1cCBiaXQtcm90IGluIGRlZmNvbmZpZworYnVpbGQgb24gb2xkZXIgc3lzdGVtcy4gKFdlIGRlcGVuZCBvbiBQb3NpeC0yMDA4LCBidXQgbm90IG5lY2Vzc2FyaWx5Cit0aGUgYWJzb2x1dGUgbGF0ZXN0IGJ1aWxkIGVudmlyb25tZW50Lik8L3A+CisKKzxwPjxiPkluIGxpYjwvYj46IGxpYi94d3JhcC5jIGFkZGVkIHhnZXRwd25hbSgpLCB4Y2hyb290KCksIGFuZCBsaWIvbGliLmMgbm93IGhhcyBuYW1lc190b19waWQoKS4KK3hzZXR1aWQoKSB3YXMgcmVwbGFjZWQgd2l0aCB4c2V0dXNlcigpIHdoaWNoIHRha2VzIGEgc3RydWN0IHBhc3N3ZAorYW5kIHNldHMgYm90aCBnaWQgYW5kIHVpZCwgbWtwYXRoYXQoKSBnb3QgZmFjdG9yZWQgb3V0IGludG8gYSBsaWJyYXJ5IGNvbW1hbmQsCitnZXRfaW50X3ZhbHVlKCkgYmVjYW1lIGF0b2x4X3JhbmdlKCksIGFuZAoreG1zcHJpbnRmKCkgaXMgbm93IGp1c3QgeG1wcmludGYoKS4gVGhlIGJ1bnppcDIgbG9naWMgbW92ZWQgZnJvbSBsaWIgaW50bworYnpjYXQuYy48L3A+CisKKzxwPjxiPkRvY3VtZW50YXRpb248L2I+OiBuZXcgPGEgaHJlZj1oZWxwLmh0bWw+aGVscCBwYWdlPC9hPiB3aXRoIHRoZQoraGVscCB0ZXh0IGZvciBhbGwgdGhlIGRlZmNvbmZpZyBjb21tYW5kcywgdXNpbmcgdGhlIG5ldyBoZWxwIC1haCBvdXRwdXQuCitUaGUgPGEgaHJlZj1jb2RlLmh0bWw+c291cmNlIGNvZGUgd2Fsa3Rocm91Z2g8L2E+IG5vdyBzYXlzIG1vcmUgYWJvdXQKKyNpbmNsdWRpbmcgaGVhZGVyIGZpbGVzLCBhbmQgaG93IHRoZSBnZW5lcmF0ZWQvKiBkaXJlY3Rvcnkgd29ya3MuIFRoZQorPGEgaHJlZj1kZXNpZ24uaHRtbD5kZXNpZ24gcGFnZTwvYT4gaGFzIHNvbWUgbmV3IHBhcmFncmFwaHMgYWJvdXQgdHJhZGluZworb2YgZGlmZmVyZW50IGtpbmRzIG9mIHNpbXBsaWNpdHksIGFuZCB3aHkgY29tbWVudHMgYXJlbid0IGEgc3Vic3RpdHV0ZSBmb3IKK2dvb2QgY29kZS4gVGhlIFJFQURNRSBubyBsb25nZXIgdHJhaWxzIG9mZiBpbnRvIG9idmlvdXMgdW5maW5pc2hlZCBjb25mdXNpb24KK2F0IHRoZSBlbmQuIEVhY2ggcGFnZSBvbiB0aGUgd2Vic2l0ZSBzaG91bGQgbm93IGhhdmUgaXRzIG93biB0aXRsZS48L3A+CisKKzxhIG5hbWU9IjE4LTExLTIwMTMiIC8+PGEgaHJlZj0iIzE4LTExLTIwMTMiPjxocj48aDI+PGI+Tm92ZW1iZXIgMTgsIDIwMTM8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iU3BhY2UsIiBpdCBzYXlzLCAiaXMgYmlnLiBSZWFsbHkgYmlnLiBZb3UganVzdCB3b24ndCBiZWxpZXZlIGhvdyB2YXN0bHksIGh1Z2VseSwgbWluZGJvZ2dsaW5nbHkgYmlnIGl0IGlzLiBJIG1lYW4sIHlvdSBtYXkgdGhpbmsgaXQncyBhIGxvbmcgd2F5IGRvd24gdGhlIHN0cmVldCB0byB0aGUgY2hlbWlzdCdzLCBidXQgdGhhdCdzIGp1c3QgcGVhbnV0cyB0byBzcGFjZS4iIC0KK1RoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eS48L3A+PC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC40LjcudGFyLmJ6Mj5Ub3lib3ggMC40Ljc8L2E+IGlzIGJhc2VkIG9uCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9oZy90b3lib3gvc2hvcnRsb2cvMTEyMj5jb21taXQgMTEyMjwvYT4uPC9wPgorCis8cD5OZXcgY29tbWFuZHM6IEJyYWQgQ29ucm95IHN1Ym1pdHRlZCBibGtpZC4gRWxpZSBEZSBCcmF1d2VyIHN1Ym1pdHRlZAorcmVib290LCBoYWx0LCBhbmQgcG93ZXJvZmYuIFN0cmFrZSdzIG5sIGdvdCBjbGVhbmVkIHVwIGFuZCBwcm9tb3RlZCBmcm9tCitwZW5kaW5nIHRvIHBvc2l4LiBJbiBhZGRpdGlvbiwgdGhlIGV4aXN0aW5nIGNodnQgYW5kIHZjb25maWcgZ290IHNvbWUKK2NsZWFudXAuPC9wPgorCis8cD5UaGF0IHNhaWQsIEkgaGF2ZW4ndCBuZWFybHkga2VwdCB1cCB3aXRoIHRoZSBmbG9vZCBvZiBuZXcgY29tbWFuZHMgZ29pbmcKK2ludG8gcGVuZGluZzogQXNod2luaSBTaGFybWEncyB0ZWFtIHN1Ym1pdHRlZAorZGQsIGR1bXBsZWFzZXMsIHRyYWNlcm91dGUsIHRvcCwgdXNlcmFkZCwgZ3JvdXBhZGQsIG1rcGFzc3dkLCB0ZnRwZCwgYW5kCithbiBmc2NrIHdyYXBwZXIgKHdpdGggbm8gZmlsZXN5c3RlbSBkcml2ZXJzIHlldCkuIElzYWFjIER1bmhhbSBzZW50IGluIGNwaW8uPC9wPgorCis8cD5CdWdmaXhlczogSmVyb2VuIHZhbiBSaWpuIGFkZGVkIGEgdXNlciBjb3VudCB0byB1cHRpbWUuIEVsaWUgRGUgQnJhdXdlcgorYWRkZWQgLWUgdG8gd2F0Y2gsIHJlbW92ZWQgYSBtZW1vcnkgbGVhaywgYW5kIGZpeGVkIGEgdGVybWluYWwgc2l6ZSBwcm9ibGVtLgorV2lsbGlhbSBIYWRkb24gbWFkZSB4YXJncyBjYWxsIGl0cyBjb21tYW5kIGxpbmUgb25jZSBldmVuIHdpdGggYmxhbmsgaW5wdXQKKyh0aGUgc3RhbmRhcmQgaXMgdmFndWUsIGJ1dCBidWlsZHMgZXhwZWN0IGl0KSwgYW5kIGZpeGVkIGFuIG9mZiBieSBvbmUgYnVnCit3aGVyZSBncmVwIGRpZG4ndCBtYWxsb2MgZW5vdWdoIHNwYWNlIHdpdGggLUUgKGxlYWRpbmcgdG8gYSBzZWdmYXVsdCkuCitJIGZpeGVkIGEgZ2xpdGNoIGluIGJ1bnppcDIgKHNhbWUgb25lIGFzIHdlbnQgaW50byBidXN5Ym94IHNpbmNlIHRoZXkncmUgdXNpbmcKK3RoZSBjb2RlIEkgd3JvdGUpLCBpbiBvZCB0byBmaXggLXQgY28sIC1KLCBhbmQgLWMgb3B0aW9ucy4gQWRkIHVuYW1lIC1vIGFzIGEKK3N5bm9ueW0gZm9yIC1zLiBCdWlsZCBmaXggdG8gbmV2ZXIgdXNlICRDQyB3aXRob3V0IHByZWZpeGluZyBpdCB3aXRoCiskQ1JPU1NfQ09NUElMRSAoc2luY2UgJEhPU1RDQyBjb3VsZCBiZSBkaWZmZXJlbnQpLiBBbmNhIEVtYW51ZWwgc3BvdHRlZAorYSB0eXBvIGluIHRoZSB3ZWIgcGFnZS48L3A+CisKKzxwPlRoZSBjb21waWxlLXRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzaW5nIGdvdCByZXdyaXR0ZW4gKHBvcnRlZCBmcm9tCitiYXNoIHRvIEMpLCB3aGljaCBzaG91bGQgc3BlZWQgdXAgYnVpbGRzIGEgYml0IGFuZCBhbGxvdyBjb2RlIGNvbnRyb2xsZWQgYnkKKy0tbG9uZ29wdHMgdG8gZHJvcCBvdXQgcHJvcGVybHkgd2hlbiBkaXNhYmxlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4gVGVybWluYWwKK3F1ZXJ5aW5nIGdvdCByZWZhY3RvcmVkLiBQYXRjaCdzIC14IG9wdGlvbiBpcyBub3cgbW9yZSBpbmZvcm1hdGl2ZSAoYQorZGVidWcgdGhpbmcgaWYgeW91J3JlIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoeSBhIHBhdGNoIGRpZG4ndCBhcHBseSkuCitUaGUgInRveW5ldC5oIiBmaWxlIGdvdCBmb2xkZWQgaW50byB0b3lzLmggc2luY2UgbXVzbCBzdXBwb3J0cyBpdCBhbmQKK21pY3JvbWFuZ2luZyB1Q2xpYmMgb3B0aW9ucyBpc24ndCB2ZXJ5IGludGVyZXN0aW5nIGFueW1vcmUuIFRoZSB0ZXN0IHN1aXRlCitub3cgdXNlcyBzY3JpcHRzL3NpbmdsZS5zaCB3aGVuIHRlc3RpbmcgYSBzaW5nbGUgY29tbWFuZC48L3A+CisKKzxhIG5hbWU9IjE3LTA5LTIwMTMiIC8+PGEgaHJlZj0iIzE3LTA5LTIwMTMiPjxocj48aDI+PGI+U2VwdGVtYmVyIDE3LCAyMDEzPC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+IlRoaW5rIG9mIGEgbnVtYmVyLCIgc2FpZCB0aGUgY29tcHV0ZXIsICJhbnkgbnVtYmVyLiIKK0FydGh1ciB0b2xkIHRoZSBjb21wdXRlciB0aGUgdGVsZXBob25lIG51bWJlciBvZiBLaW5nJ3MgQ3Jvc3MgcmFpbHdheQorc3RhdGlvbiBwYXNzZW5nZXIgaW5xdWlyaWVzLCBvbiB0aGUgZ3JvdW5kcyB0aGF0IGl0IG11c3QgaGF2ZSBzb21lIGZ1bmN0aW9uLAorYW5kIHRoaXMgbWlnaHQgdHVybiBvdXQgdG8gYmUgaXQuIC0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5PC9wPgorPC9ibG9ja3F1b3RlPgorCis8cD48YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC40LjYudGFyLmJ6Mj5Ub3lib3ggMC40LjY8L2E+IGlzIGJhc2VkIG9uCis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9oZy90b3lib3gvc2hvcnRsb2cvMTA2OD5jb21taXQgMTA2ODwvYT4uPC9wPgorCis8cD5UaGlzIHJlbGVhc2UgYWRkcworc2V2ZXJhbCBuZXcgY29tbWFuZHM6IEZlbGl4IEphbmRhIHdyb3RlIHBhc3RlIGFuZCBmYWxsb2NhdGUsIEt5dW5nd2FuIEhhbgorc3VibWl0dGVkIGVqZWN0LCBTdHJha2UgY29udHJpYnV0ZWQgZ3JlcCwgQXNod2luaSBTaGFybWEgYWRkZWQgcG1hcCAoYW5kCithIHRlc3RzdWl0ZSBlbnRyeSBmb3IgZ3JlcCksIEx1a2FzeiBTa2Fsc2tpIHNlbnQgcHdkeCwgSXNhYWMgRHVuaGFtIHBvc3RlZAorYWNwaSwgYW5kIEkgZGlkIHRpbWVvdXQgYW5kIHVtb3VudC48L3A+CisKKzxwPlRoZSBscyBjb21tYW5kIG5vdyBoYXMgYSAtLWNvbG9yPWF1dG8gb3B0aW9uIChzdWdnZXN0ZWQgYnkgUmljaCBGZWxrZXIpLgorVGhlIG11bHRpcGxleGVyIG5vdyBoYXMgYSAtLWhlbHAgb3B0aW9uIHNvIHlvdSBjYW4gc2F5ICIuL3RveWJveCAtLWhlbHAgYmxhaCIKK2luc3RlYWQgb2YgdXNpbmcgdGhlIGJ1aWx0LWluICJoZWxwIiBjb21tYW5kLiAoV2hpY2ggaXMgYSBzaGVsbCBidWlsdC1pbi4KK1RyeSBpdCBvbiB5b3VyIGNvbW1hbmQgbGluZSwgaXQncyBsaWtlIG1hbiBmb3Igc2hlbGwgYnVpbHRpbnMuIEJ1dCBhIGNlcnRhaW4KK290aGVyIHByb2plY3QgaGFzIGNvbmRpdGlvbmVkIHBlb3BsZSB0byBleHBlY3QgLS1oZWxwLCBzby4uLikgSSBmb3JnZXQgd2hvCitoZWVob29tYW4gYXQgZ21haWwgaXMgYnV0IHRoZXkgcG9pbnRlZCBvdXQgdW5zaGFyZSBuZWVkZWQgUElEIGFuZCBVSUQKK25hbWVzcGFjZSBzdXBwb3J0LjwvcD4KKworPGgzPlBlbmRpbmc8L2gzPgorCis8cD5BIGxvdCBvZiBuZXcgY29tbWFuZHMgaW4gdG95cy9wZW5kaW5nLCB0byB0aGUgcG9pbnQgdGhlIG5leHQgcmVsZWFzZSBzaG91bGQKK3Byb2JhYmx5IGp1c3QgZm9jdXMgb24gY2xlYW51cCBhbmQgcmV2aWV3IG9mIHRoaXMgYmFja2xvZy4gV2UndmUgZ290IGtsb2dkLAorZGhjcCwgZGhjcGQsIHdhdGNoLCByb3V0ZSwgYW5kIHBzIGZyb20KK0FzaHdpbmkgU2hhcm1hIChhbmQgYW4gZnNjayB3cmFwcGVyIGJ1dCBubyBmc2NrLmZzdHlwZSBlbmdpbmVzIHlldCksCitzeXNsb2dkLCBwZ3JlcCwgYW5kIHBraWxsIGZyb20gTWFkaHVyIFZlcm1hLCBuZXRzdGF0IGJ5IFJhbmphbiBLdW1hciwKK3Rlc3QgYnkgRmVsaXggSmFuZGEsIGxzcGNpIGJ5IElzYWFjIER1bmhhbSwgbmwsIHN1LCBhbmQgcmVuaWNlIGJ5IHN0cmFrZSAoSS5FLgorTS4gRmFya2FzLUR5Y2spLCBhbmQgc3lzdmluaXQgYnkgS3l1bmd3YW4gSGFuLjwvcD4KKworPHA+U29tZSBjbGVhbnVwIHdvcmsgb24gZXhpc3RpbmcgcGVuZGluZyBjb21tYW5kcyB0aGF0IGFyZW4ndAorcmVhZHkgdG8gcHJvbW90ZSB5ZXQ6IEkgZGlkIGEgZmV3IG1vcmUgcm91bmRzIG9uIGlmY29uZmlnCithbmQgSXNhYWMgRHVuaGFtJ3MgZGlkIHNldmVyYWwgY2xlYW51cHMgdG8geHpjYXQsIEZlbGl4IEphbmRhIGNsZWFuZWQgdXAKK2xvZ2dlciBhbmQgc3lzbG9nZC4uLjwvcD4KKworPHA+QWxzbyBzb21lIGNsZWFudXAgd29yayBvbiBjb21tYW5kcyB0aGF0IHByZWRhdGUgdGhlIHBlbmRpbmcgZGlyZWN0b3J5LAorYnV0IHdlcmVuJ3QgcXVpdGUgcG9saXNoZWQgd2hlbiB0aGV5IHdlbnQgaW4sIG1vc3QgcHJvbWluZW50bHkgZHUsCitleHBhbmQsIGFuZCB0b3VjaC48L3A+IAorCis8aDM+SW5mcmFzdHJ1Y3R1cmU8L2gzPgorCis8cD5UaGUgbmV3IHNjcmlwdHMvc2luZ2xlLnNoIGJ1aWxkcyBhIHN0YW5kYWxvbmUgY29tbWFuZCB3aXRob3V0IHRoZQorbXVsdGlwbGV4ZXIsIGFsdGhvdWdoIG5vdCBhbGwgY29tbWFuZHMgY2FuIGJlIGJ1aWx0IHRoYXQgd2F5IHlldCAoTkVXVE9ZIHllcywKK09MRFRPWSBubykgYW5kIHRoZSBzcGFjZSBzYXZpbmdzIGFyZW4ndCBhbnl0aGluZyB0byB3cml0ZSBob21lIGFib3V0LiAoSWYgYQorY29tbWFuZCBuZWVkcyB0aGUgb3B0aW9uIHBhcnNpbmcgbG9naWMgYXQgYWxsLCBpdCBuZWVkcyBhbGwgb2YgaXQuKSBJZgoreW91J3JlIGN1cmlvdXMsIHlvdSBjYW4gZG86PC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorbWFrZSBkZWZjb25maWcKK21ha2UKK21rZGlyIHNpbmdsZXMKK2ZvciBpIGluICQoLi90b3lib3gpCitkbworICBlY2hvICRpCisgIFBSRUZJWD1zaW5nbGVzLyBzY3JpcHRzL3NpbmdsZS5zaCAkaSB8fCBicmVhaworZG9uZQorPC9wcmU+Cis8cD4oQW5kIHRoZW4gd2FpdCBhIGxvbmcgdGltZSBhbmQgd2F0Y2ggYWxtb3N0IGhhbGYgdGhlIGJ1aWxkcyBmYWlsLik8L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPlRoZXJlIGlzIG5vdyBsaWJidWYgYW5hbG9nb3VzIHRvIHRveWJ1ZiwgYW5vdGhlciBnbG9iYWwgNGsgYnVmZmVyIHRoaXMKK3RpbWUgZm9yIHVzZSBieSBsaWIvIGNvZGUgaW5zdGVhZCBvZiBjb21tYW5kIGNvZGUuPC9wPgorCis8cD5UaGUgbGliIGRpcmVjdG9yeSBnb3Qgc3BsaXQgdXAgYSBiaXQsIGxpYi9wZW5kaW5nLmMgY29udGFpbnMgZnVuY3Rpb25zCitub3QgeWV0IHVzZWQgYnkgYW55dGhpbmcgb3V0c2lkZSBvZiB0b3lzL3BlbmRpbmcvKiwgYW5kIGxpYi94d3JhcC5jIGNvbnRhaW5zCitmdW5jdGlvbnMgdGhhdCB3cmFwIG90aGVyIGZ1bmN0aW9ucyBhbmQgaGFuZGxlIGZhaWx1cmVzICh2aWEgZXJyb3JfZXhpdCkuCitUaGlzIGxlYXZlcyBsaWIvbGliLmMgY29udGFpbmluZyBhY3R1YWwgbmV3IGZ1bmN0aW9ucy48L3A+CisKKzxwPkdlbmVyYWwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMgdG8gYXJndW1lbnQgcGFyc2luZy4gVGhlIFstYWJjXSBleGNsdWRlCitsb2dpYyBzaG91bGQgbm93IGNsZWFyIGFyZ3VtZW50cyBzbG90cyB3aGVuIGRpc2FibGluZyBvcHRpb25zLiBCYXJlIC0tbG9uZ29wdHMKK3Nob3VsZCB3b3JrIG5vdyBhbmQgYmUgYWJsZSB0byByZXBvcnQgZXJyb3JzIHVzaW5nIHRoZWlyIG5hbWUsIHRoZSBuZXcgOworb3B0aW9uIGFsbG93cyBvcHRpb25hbCBhcmd1bWVudHMgdG8gbG9uZ29wdHMgb25seSBzdXBwbGlhYmxlIHdpdGggPSAoSS5FLgorLS1jb2xvciBhbmQgLS1jb2xvcj1hdXRvIGJ1dCBub3QgLS1jb2xvciBhdXRvKS48L3A+CisKKzxwPkknbSBncmFkdWFsbHkgd2VhbmluZyB0aGUgY29kZSBvZmYgb2YgaXRvYSgpL3V0b2EoKSBiZWNhdXNlIHNwcmludGYKK2RvZXMgdGhpcyBhbHJlYWR5LiBJbiB0aGlzIGNhc2UgInNpbXBsZSIgcHJvYmFibHkgbWVhbnMgImxldCBsaWJjIGRvIGl0Citmb3IgdXMiLjwvcD4KKworPHA+UmV3cm90ZSBmb3JfZWFjaF9waWRfd2l0aF9uYW1lX2luKCkgYW5kIHJlbmFtZWQgaXQgdG8ganVzdCBuYW1lc190b19waWQoKS4KK0l0IHNob3VsZG4ndCBnZXQgY29uZnVzZWQgdHJ5aW5nIHRvIGNvbXBhcmUgYWJzb2x1dGUgYW5kIHJlbGF0aXZlIHBhdGhzIHF1aXRlCitzbyBtdWNoIGFueW1vcmUuPC9wPgorCis8cD5saWIvbGxpc3QuYyBncmV3IGEgbmV3IGRsaXN0X3BvcCgpIGZ1bmN0aW9uIGZvciByZW1vdmluZyBhIGRvdWJseQorbGlua2VkIGxpc3QgZW50cnkgd2hpbGUgbWFpbnRhaW5pbmcgYSBjaXJjdWxhciBsaXN0OyB0YWlsIGFuZCBwYXRjaCBhcmUKK3VzaW5nIGl0IG5vdy48L3A+CisKKzxwPlRoZSBtdXNsIGd1eXMgc3VnZ2VzdGVkIGEgbmV3IG9wdGltaXphdGlvbiBmbGFnCisoLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcykKK3RoYXQgc2hhdmVzIGFib3V0IDEwJSBvZmYgdGhlIGJpbmFyeSBzaXplIGJ5IHJlbW92aW5nIGEgQysraXNtIHRoYXQgY3JlcHQKK2ludG8gZ2NjJ3MgaWRlYSBvZiBDLiBXaGlsZSBJIGRvbid0IG5vcm1hbGx5IHRyeSB0byBtaWNyb21hbmFnZSB0aGUgY29tcGlsZXIsCisiLWZzdG9wLWJlaW5nLXN0dXBpZCIgaXMgYSB0aGluZyB5b3UgaGF2ZSB0byBoaXQgZ2NjIHdpdGggZnJvbSB0aW1lIHRvIHRpbWUuPC9wPgorCis8aDM+QnVnZml4ZXM8L2gzPgorCis8cD5GZWxpeCBKYW5kYSBhbmQgSSBkaWQgYSBsYXJnZWlzaCByZXdyaXRlIG9mIHRhaWwgdG8KK2ZpbmFsbHkgbWFrZSBpdCB3b3JrIHJpZ2h0ICh3ZSB0aGluaykuIFN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IHRhaWwgLWYKK3NvbWVkYXkgKHRoZSB0cmlja3kgYml0IGlzIG1ha2luZyAtZiBmb2xsb3cgbXVsdGlwbGUgZmlsZXMgYXQgb25jZSkuCitGZWxpeCBhbHNvIHJlcG9ydGVkIGEgYnVnIGluIHhwaWRmaWxlLjwvcD4KKworPHA+SnVoYW5pIEhhdmVyaW5lbiBwb2ludGVkIG91dCB0aGF0CitweXRob24gMyBkb2Vzbid0IHdvcmsgd2l0aCBjb25maWcyaGVscC5weSwgc28gdGhlIGRldGVjdGlvbiBsb2dpYyBsb29rcworZm9yIHB5dGhvbjIgKHVudGlsIEkgZ2V0IGFyb3VuZCB0byByZXdyaXRpbmcgdGhhdCBpbiBDKS4gRWxpZSBEZSBCcmF1d2VyCit0aGVuIGZpeGVkIG91ciBmaXJzdCBhdHRlbXB0IGF0IHRoaXMsIGFuZCBhbHNvIGZpeGVkIHVuYW1lJ3MgaGVscCBzdHJpbmcuPC9wPgorCis8cD5Bc2h3aW5pIFNoYXJtYQorcG9pbnRlZCBvdXQgdGhlIGJ1aWxkIHdhcyBtYWtpbmcgYSBGTEFHXyBtYWNybyBmb3IgIiAiIHdoaWNoIGJyb2tlIHNvbWUKK2NvbmZpZ3VyYXRpb25zLiAoVGhhdCdzIGEgY29udHJvbCBjaGFyYWN0ZXIsIG5vdCBhIGNvbW1hbmQgbGluZSBvcHRpb24uKTwvcD4KKworPHA+SmFjZWsgQnVrYXJld2ljeiBwb2ludGVkIG91dCBhIGJ1ZyBpbiBjaGRpciBwZXJtaXNzaW9uIGhhbmRsaW5nLCBhbmQKK2Egd2F5IHRvIG1ha2UgZW52IHNlZ2ZhdWx0LiBCb3RoIHNob3VsZCBiZSBmaXhlZCBub3cuPC9wPiAKKworPHA+VGhlIG5ldyBmdW5jdGlvbiB4ZXhlY19vcHRhcmdzKCkKK3JlcGxhY2VzIGNhbGxzIHRvIHhleGVjKHRveXMub3B0YXJncykgdG8gYXZvaWQgZnJlZWluZyBhbmQgcmV1c2luZyBvcHRhcmdzCitkdXJpbmcgb3B0aW9uIHBhcnNpbmcgc2NyZXdpbmcgc3R1ZmYgdXAgKHN1Y2ggYXMgbmV0Y2F0J3MgZXhlYyBtb2RlKS48L3A+CisKKzxwPlRoZSBzdGF0IGNvbW1hbmQncyAlYSBvdXRwdXQgd2FzIHBhZGRlZCB3aXRoIGxlYWRpbmcgemVyb2VzLCB3aGljaAorZGlkbid0IG1hdGNoIGFueWJvZHkgZWxzZSdzIGJlaGF2aW9yIGFuZCB0aHVzIG1hZGUgdGhlIHRlc3Qgc3VpdGUgaGljY3VwCitiZXR3ZWVuIFRFU1RfSE9TVCBhbmQgdGVzdGluZyB0b3lib3guIChJZiB5b3UgZ28gIlRFU1RfSE9TVD0xIHNjcmlwdHMvdGVzdC5zaAorY29tbWFuZCIgaXQgc2FuaXR5IGNoZWNrcyB0aGUgdGVzdHMgYWdhaW5zdCB0aGUgaG9zdCBpbXBsZW1lbnRhdGlvbi4pPC9wPgorCis8cD5MYXN0IHJlbGVhc2UsICJta2RpciBzdWIvc3ViICYmIGNobW9kIDAwNyBzdWIvc3ViICYmIHJtIC1yZiBzdWIiIGRpZG4ndAorZGVsZXRlIHN1YiBhbmQgZGlkbid0IGV4aXQgd2l0aCBhbiBlcnJvciBlaXRoZXIuIE5laXRoZXIgd2FzIGNvcnJlY3QsIHJtCitzaG91bGQgbm93IGJlIGZpeGVkLjwvcD4KKworPHA+Cis8YSBuYW1lPSIyNi0wNy0yMDEzIiAvPjxhIGhyZWY9IiMyNi0wNy0yMDEzIj48aHI+PGgyPjxiPkp1bHkgMjYsIDIwMTM8L2I+PC9oMj48L2E+Cis8cD5HZW9yZ2kgQ2hvcmJhZHpoaXlza2kgbWFpbnRhaW5zIGEgPGEgaHJlZj1odHRwczovL2dpdGh1Yi5jb20vZ2Z0by90b3lib3g+Z2l0CittaXJyb3I8L2E+IG9mIHRoZSByZXBvc2l0b3J5IG9uIGdpdGh1YiwgYXV0b21hdGljYWxseSB1cGRhdGVkIGZyb20gdGhlCittZXJjdXJpYWwgZXZlcnkgNiBob3Vycy4gVGhlIG1pcnJvciBpcyByZWFkIG9ubHksIGJ1dCB5b3UgY2FuIGdlbmVyYXRlIHBhdGNoZXMKK2FnYWluc3QgaXQgYW5kIHBvc3QgdGhlbSB0byB0aGUgbGlzdC48L3A+CisKKzxhIG5hbWU9IjAyLTA3LTIwMTMiIC8+PGEgaHJlZj0iIzAyLTA3LTIwMTMiPjxocj48aDI+PGI+SnVseSAyLCAyMDEzPC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+IlRpbWUgaXMgYW4gaWxsdXNpb24uIEx1bmNodGltZSBkb3VibHkgc28uIiAiVmVyeSBkZWVwLiBZb3UKK3Nob3VsZCBzZW5kIHRoYXQgaW4gdG8gdGhlIFJlYWRlcidzIERpZ2VzdC4gVGhleSd2ZSBnb3QgYSBwYWdlIGZvciBwZW9wbGUKK2xpa2UgeW91LiIgLQorVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPjxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjQuNS50YXIuYnoyPlRveWJveCAwLjQuNTwvYT4gaXMgYmFzZWQgb24KKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2hnL3RveWJveC9zaG9ydGxvZy85NDE+Y29tbWl0IDk0MTwvYT4uIEl0IGFkZHMKK3V1ZW5jb2RlIGFuZCB1dWRlY29kZSBmcm9tIEVyaWNoIFBsb25ka2UsIGFuZCBlbmFibGVzIEx1aXMgTW9yYWxlcycgIndobyIgYnkKK2RlZmF1bHQuIEZlbGl4IEphbmRhIGFuZCBJIGNsZWFuZWQgdXAgbGFzdCB5ZWFyJ3MgInN0YXQiIHN1Ym1pc3Npb24gYW5kCitlbmFibGVkIGl0LiBJdm8gdmFuIFBvb3J0ZW4gYWRkZWQgImdyb3VwcyIuCitBbmRyZSBSZW5hdWQgYWRkZWQgImxzdXNiIi4gSSBpbXBsZW1lbnRlZCAic3BsaXQiLCAicGl2b3Rfcm9vdCIsIGFuZCAibXYiLgorPC9wPgorCis8cD5UaGUgImhlbHAiIGNvbW1hbmQgaXMgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgbm93IChsaWIvaGVscC5jKSBhbmQKK2VhY2ggY29tbWFuZCBjYW4gbm93IHVuZGVyc3RhbmQgLS1oZWxwIChpbmNsdWRpbmcgYm90aCAidG95Ym94IC0taGVscCIKK2FuZCAidG95Ym94IC0taGVscCBjb21tYW5kIiBpbiB0aGUgbXVsdGlwbGV4ZXIpLjwvcD4KKworPHA+VGhlICJwZW5kaW5nIiBkaXJlY3RvcnkgaGFzIHNldmVyYWwgY29tbWFuZHMgKGZpbmQsIHh6Y2F0LCBuYmQtY2xpZW50LAorbG9nZ2VyLCBleHByKSB3aGljaCB3b3JrIGJ1dCBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBwZW5kaW5nIGZ1cnRoZXIgY2xlYW51cC4KK0lmY29uZmlnIGlzIGVuYWJsZWQsIGJ1dCBzdGlsbCBpbiBwZW5kaW5nIGJlY2F1c2UgaXQncyBvbmx5IDIvMyBjbGVhbmVkIHVwLgorKEl0J3MgYW4gYXdrd2FyZCBoYWxmd2F5IHN0YXRlIGJ1dCBJJ20gbm90IGhvbGRpbmcgdXAgdGhlIHJlbGVhc2UgZm9yIGl0Lik8L3A+CisKKzxwPkknbSA8YSBocmVmPWNsZWFudXAuaHRtbD5kb2N1bWVudGluZyB0aGUgY2xlYW51cHM8L2E+IHRvIHRlYWNoCittb3JlIHBlb3BsZSB0byBkbyBpdCwgYnV0IHRoZSB3cml0ZXVwcyBhcmVuJ3QgY2F1Z2h0IHVwIHlldC4gVGhlCis8YSBocmVmPXJvYWRtYXAuaHRtbD5yb2FkbWFwPC9hPiBhbHNvIGdvdCB1cGRhdGVkIGEgYml0IHdpdGggZnVydGhlciBhbmFseXNpcworb2Ygb3RoZXIgcHJvamVjdHMsIGFuZCB0aGUgUkVBRE1FIGFuZCBhYm91dCBwYWdlcyBnb3QgdXBkYXRlZC48L3A+CisKKzxwPkZpeGVkIF9hbm90aGVyXyAibHMgLUMiIHNlZ2ZhdWx0IHdoZW4gdGVybWluYWwgc2l6ZSBjYW4ndCBiZSBkZXRlY3RlZCwKK2NvbmRlbnNlZCB0aGUgbHMgaGVscCB0ZXh0IHRvIGZpdCBvbiBvbmUgcGFnZSwgaW1wbGVudGVkIC0tY29sb3IsIGFuZCB0YXVnaHQKKy1sIHRvIHByaW50IHRoZSBtYWpvciwgbWlub3IgbnVtYmVycyB3aGVuIHNob3dpbmcgYmxvY2svY2hhciBkZXZpY2VzLgorQXJndW1lbnQgcGFyc2luZyBub3cgaGFuZGxlcyAiLS0iIHByb3Blcmx5ICh0byBlbmQgb3B0aW9uIGNoZWNraW5nKSwKK2FuZCB0aGUgaW5mcmFzdHJ1Y3R1cmUgY2FuIG5vdyBoYW5kbGUgYmFyZSAtLWxvbmdvcHRzIHRoYXQgaGF2ZSBubworY29ycmVzcG9uZGluZyBzaG9ydCBvcHRpb24gKGJvdGggd2VyZSBpbXBsZW1lbnRlZCBiZWZvcmUgYnV0IGRpZG4ndCB3b3JrKS4KK0ZpeGVkIGFuIG9sZCBidWcgaW4gInBhdGNoIiwgY2htb2QgZ3JldyAtZiwgd2hvIGdyZXcgLWEuIElzYWFjIER1bmhhbQorZml4ZWQgIi0iIHZzICJfIiBoYW5kbGluZyBpbiBtb2RpbmZvLCBhZGRlZCBhICJmaXJtd2FyZSIgb3V0cHV0CitmaWVsZCwgYWRkZWQgLWIgYW5kIC1rIHN1cHBvcnQsIGFuZCB0YXVnaHQgaXQgdGhhdCB0aGUgIi5rbyIgZXh0ZW5zaW9uIG1lYW5zCit0byBsb29rIGZvciB0aGUgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggaW5zdGVhZCBvZiB1bmRlciAvbGliLiBGZWxpeCBKYW5kYQorbW92ZWQgZmlsZSBwZXJtaXNzaW9uIGRpc3BsYXkgY29kZSB0byBsaWIgc28gbHMgYW5kCitzdGF0IGNvdWxkIHNoYXJlIGl0LiBBc2h3aW5pIFNoYXJtYSBzcG90dGVkIGEgYnVnIGluIHhhYnNwYXRoIHdoZW4gdGhlCitsYXN0IHBhdGggY29tcG9uZW50IGV4aXN0cyBidXQgd2UgaGF2ZW4ndCBnb3QgcGVybWlzc2lvbnMgdG8gb3BlbiBpdAorKGFsYSByZWFkbGluayAtZiAvZGV2L3NkYSBhcyBhIG5vcm1hbCB1c2VyKS4KKzwvcD4KKworPHA+SW4gdGhlIGJ1aWxkIGluZnJhc3RydWN0dXJlLCBzY3JpcHRzL2ZpbmRnbG9iYWxzLnNoIGZpbmRzIGxlYWtlZCBnbG9iYWwKK3ZhcmlhYmxlcy4gKExlYWtlZCBtZWFucyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZSBnbG9iYWwgdW5pb246IE90aGVyIHRoYW4gZ2xpYmMKK2RlYnJpcywgdG95Ym94IHNob3VsZCBkZWZpbmUgInRoaXMiLCAidG95X2xpc3QiLCAidG95YnVmIiwgYW5kICJ0b3lzIiwgYW5kCit0aGF0J3MgaXQ7IHRoZSByZXN0IGFkZCBtZW1vcnkgZm9vdHByaW50IHRvIGV2ZXJ5IGNvbW1hbmQgZm9yIHRoZSBiZW5lZml0IG9mCitqdXN0IG9uZSBjb21tYW5kOyB1c2UgR0xPQkFMUygpIHRvIHN0aWNrICdlbSBpbiB0aGUgdW5pb24uKSBTdGF0aWMgbGlua2luZworYWdhaW5zdCBsaWJyYXJpZXMgb3RoZXIgdGhhbiB0aGUgaG9zdCdzIGxpYmMgbm93IGFwcGxpZXMgdG8gZmVhdHVyZSBwcm9iZXMKK2ZvciB1bnNoYXJlIGFuZCBzdWNoLiBOZXV0ZXIgc3R1cGlkIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQgdGhhdCBtYWtlcwordmFyaW91cyBob3N0ICJzb3J0IiBjb21tYW5kcyBwdXQgdGhpbmdzIGluIGFuIG9yZGVyIG90aGVyIHRoYW4gYWxwaGFiZXRpY2FsCisoYnJlYWtpbmcgdGhlIG11bHRpcGxleGVyJ3MgYmluYXJ5IHNlYXJjaCBvbiBjb21tYW5kIG5hbWVzKS4KKworPHA+WW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBidWlsZCBmcm9tIGEgc291cmNlIGNvbnRyb2wgc25hcHNob3Qgb24gYSBidWlsZAorc3lzdGVtIHRoYXQgaGFzbid0IGdvdCBweXRob246IGlmIHlvdSBkaXNhYmxlIENPTkZJR19UT1lCT1hfSEVMUC4gKFRoZQorcmVsZWFzZSB0YXJiYWxscyBzaGlwIGdlbmVyYXRlZC9oZWxwLmgsIGJ1dCBpdCdzIG5vdCBpbiBzb3VyY2UgY29udHJvbC4KK0V2ZW50dWFsbHkgSSBzaG91bGQgcmV3cml0ZSB0aGF0IHB5dGhvbiBzY3JpcHQgaW4gQy4pPC9wPgorPC9wPgorCis8cD48Yj5MSUNFTlNFIFRXRUFLPC9iPjogQWZ0ZXIgPGEgaHJlZj1odHRwOi8vbGlzdHMubGFuZGxleS5uZXQvcGlwZXJtYWlsL3RveWJveC1sYW5kbGV5Lm5ldC8yMDEzLU1hcmNoLzAwMDc5NC5odG1sPmRpc2N1c3Npb248L2E+IG9uIHRoZSBtYWlsaW5nIGxpc3QgdGhlICIyIGNsYXVzZQorQlNEIiA8YSBocmVmPWxpY2Vuc2UuaHRtbD5saWNlbnNlPC9hPiBnb3Qgc2xpZ2h0bHkgc2ltcGxpZmllZCBzbyB0aGUgZmlyc3QKK3BhcmFncmFwaCBub3cgc2F5czo8L3A+CisKKzxibG9ja3F1b3RlPjxwPlBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGZvciBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkl0IHVzZWQgdG8gY29udGludWUgInByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMKK3Blcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIiwgYnV0IEEpIHdoYXQncyB0aGUgcG9pbnQ/IEIpIGRvZXMgImFsbAorY29waWVzIiBtZWFuIGJpbmFyaWVzLCBvciBqdXN0IHNvdXJjZSBjb2RlLCBvciB3aGF0PyBDKSBsb3RzIG9mIHByb2plY3RzCit0aGF0IGNvbnNpZGVyIEJTRCBhbmQgR1BMIGNvbXBhdGlibGUgaGF2ZSA8YSBocmVmPWh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdC90cmVlL2NyeXB0by9hZXNfZ2VuZXJpYy5jPmZpbGVzIHdpdGgKK2JvdGggbGljZW5zZSBub3RpY2VzPC9hPiBvbiB0aGVtIChzb21ldGltZXMgYXQgPGEgaHJlZj1odHRwOi8vZ2l0LmJ1c3lib3gubmV0L2J1c3lib3gvdHJlZS9zaGVsbC9hc2guYz5vcHBvc2l0ZSBlbmRzIG9mIHRoZSBmaWxlPC9hPiB0byBtYWtlIHRoZSBjb25mbGljdAorbGVzcyBvYnZpb3VzKSBiZWNhdXNlICJhbGwgY29waWVzIG11c3QgaW5jbHVkZSB0aGlzIGZ1bmN0aW9uIiB3b3VsZCB2aW9sYXRlCit0aGUgR1BMIGJ1dCAiYWxsIGNvcGllcyBtdXN0IGluY2x1ZGUgdGhpcyBtYWdpYyB0ZXh0IGJsb2IiIHNvbWVob3cgZG9uJ3Q/PC9wPgorCis8cD5JIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBjYXJlIGFib3V0IHRoaXMgYW55bW9yZS4gVGhlIHR3ZWFrZWQgdmVyc2lvbiBpcyBtb3JlCitvciBsZXNzIHB1YmxpYyBkb21haW4gd2l0aCBhIGxpYWJpbGl0eSBkaXNjbGFpbWVyLCBidXQgd2UncmUgc3RpbGwgY2FsbGluZyBpdAorQlNEIChzb21ldGltZXMgIjAgY2xhdXNlIEJTRCIpIHRvIGF2b2lkIGV4cGxhaW5pbmcuPC9wPgorCis8YSBuYW1lPSIyMS0wMy0yMDEzIiAvPjxhIGhyZWY9IiMyMS0wMy0yMDEzIj48aHI+PGgyPjxiPk1hcmNoIDIxLCAyMDEzPC9iPjwvaDI+PC9hPgorPHA+VmlkZW8gb2YgbXkgRUxDIHRhbGsKKyI8YSBocmVmPWh0dHA6Ly95b3V0dS5iZS9TR210UDVMZ190MD5XaHkgaXMgVG95Ym94PzwvYT4iCitpcyB1cCBvbiB5b3V0dWJlLiBSZWxhdGVkIG1hdGVyaWFscyBpbmNsdWRlIHRoZQorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvdGFsa3MvY2VsZi0yMDEzLnR4dD50YWxrIG91dGxpbmU8L2E+IGFuZCBhbgorPGEgaHJlZj0vYWJvcmlnaW5hbC9hYm91dC5odG1sI3NlbGZob3N0PmFuZHJvaWQgc2VsZi1ob3N0aW5nIHdyaXRldXA8L2E+LjwvcD4KKworPHA+W1VwZGF0ZWQgSnVuZSA0XSBUaGUgZm9sbG93aW5nIGxpbmtzIGp1bXAgdG8gc3BlY2lmaWMgdG9waWNzIGluIHRoZSB2aWRlby4gKFNvcnJ5IGFib3V0Cit0aGUgYWRzLCBpdCdzIFRoZSBMaW51eCBGb3VuZGF0aW9uLik8L3A+CisKKzx1bD4KKzxsaT4wbTI5cyA8YSBocmVmPWh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TR210UDVMZ190MCN0PTBtMjlzPlRoZSBzbWFydHBob25lIGlzIHJlcGxhY2luZyB0aGUgUEM8L2E+PC9saT4KKyAgPHVsPgorICA8bGk+NG0yMnMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD00bTIycz5Tb2Z0d2FyZSBuZWVkZWQgdG8gYmVjb21lIHNlbGYtaG9zdGluZzwvYT48L2xpPgorICA8bGk+Nm0yMHMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD02bTIwcz5EbyB3ZSBjYXJlIGlmIGFuZHJvaWQgb3IgaXBob25lIHdpbnM/PC9hPjwvbGk+CisgIDwvdWw+Cis8bGk+OW00NXMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD05bTQ1cz5BbmRyb2lkIG5vdCB2YW5pbGxhOiBvcHBvc2Ugb3IgYWNjZXB0PzwvYT48L2xpPgorICA8dWw+CisgIDxsaT4xMW0zMHMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD0xMW0zMHM+T3BlbiBzb3VyY2UgY2FuJ3QgZG8gVXNlciBJbnRlcmZhY2VzPC9hPjwvbGk+CisgIDwvdWw+Cis8bGk+MTVtMDlzIDxhIGhyZWY9aHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVNHbXRQNUxnX3QwI3Q9MTVtMDlzPkFuZHJvaWQgaXMgbm90IGNvcHlsZWZ0OiBvcHBvc2Ugb3IgYWNjZXB0PzwvYT48L2xpPgorPGxpPjE4bTIzcyA8YSBocmVmPWh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TR210UDVMZ190MCN0PTE4bTIzcz5TZWN1cml0eSBpc3N1ZXM8L2E+PC9saT4KKzxsaT4yMW0xNXMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD0yMW0xNXM+U29sdXRpb25zIHRvIHRoZSBzb2Z0d2FyZSBwcm9ibGVtczwvYT48L2xpPgorICA8dWw+CisgIDxsaT4yMm01NXMgPGEgaHJlZj1odHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9U0dtdFA1TGdfdDAjdD0yMm01NXM+V2hhdCB0b3lib3ggbmVlZHMgdG8gYmUvZG88L2E+PC9saT4KKyAgPGxpPjI4bTE3cyA8YSBocmVmPWh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TR210UDVMZ190MCN0PTI4bTE3cz5XaGF0IGlzIHRveWJveD88L2E+PC9saT4KKyAgICA8dWw+CisgICAgPGxpPjI4bTU4cyA8YSBocmVmPWh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1TR210UDVMZ190MCN0PTI4bTU4cz5XaHkgdG95Ym94IHN0YXJ0ZWQuLi48L2E+PC9saT4KKyAgICA8bGk+MzdtNTBzIDxhIGhyZWY9aHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVNHbXRQNUxnX3QwI3Q9MzdtNTBzPldoYXQgZG9lcyB0b3lib3ggYWN0dWFsbHkgaW1wbGVtZW50PzwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvdWw+Cis8L3VsPgorPC9zcGFuPgorCisKKzxhIG5hbWU9IjE0LTAzLTIwMTMiIC8+PGEgaHJlZj0iIzE0LTAzLTIwMTMiPjxocj48aDI+PGI+TWFyY2ggMTQsIDIwMTM8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iRm9yZCwgeW91J3JlIHR1cm5pbmcgaW50byBhIHBlbmd1aW4uIFN0b3AgaXQuIiAtCitUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNC40LnRhci5iejI+VG95Ym94IDAuNC40PC9hPiBpcyBiYXNlZCBvbgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvdG95Ym94L3Nob3J0bG9nLzgxMz5jb21taXQgODEzPC9hPiwgYWRkaW5nCit0aGUgInRpbWUiIGFuZCAicmVhZGFoZWFkIiBjb21tYW5kcywgcGx1cyBzb21lIGJ1Z2ZpeGVzLjwvcD4KKworPHA+VGhlICJjcCIgY29tbWFuZCBub3cgaW1wbGVtZW50cyB0aGUgLXMgc3ltbGluayBvcHRpb24sIHBsdXMgYnVnZml4ZXMKK2dldHRpbmcgdmFyaW91cyBjb3JuZXIgY2FzZXMgcmlnaHQgYXMgdXNlZCBpbiBhY3R1YWwgcGFja2FnZSBidWlsZHMuCisiaWQgLUduIHJvb3QiIHNob3VsZCBub3cgcHJpbnQgcm9vdCdzIGdyb3VwcworaW5zdGVhZCBvZiB0aGUgY3VycmVudCB1c2VyJ3MuIFNldmVyYWwgYnVpbGQgZml4ZXMgc28gdG95Ym94IGJ1aWxkcyB1bmRlcgorVWJ1bnR1IDguMDQgYWdhaW4gKHdoaWNoIGlzIGFib3V0IGFzIG9sZCBhIGJ1aWxkIGVudmlyb25tZW50IGFzIHlvdQorY2FuIGV4cGVjdCB0byBmaW5kIHBvc2l4LTIwMDggZmVhdHVyZXMgaW4pLjwvcD4KKworPHA+VW5maW5pc2hlZCBjb21tYW5kcyBoYXZlIGdlbmVyYWxseSBiZWVuIG1vdmVkIHRvICJ0b3lzL3BlbmRpbmciLgorRXZlcnl0aGluZyBlbHNlIHNob3VsZCAiZGVmYXVsdCB5IiB0byBwYXJ0aWNpcGF0ZSBpbiBtYWtlIGRlZmNvbmZpZy4KK1NldmVyYWwgb2YgdGhvc2UgcGVuZGluZyBjb21tYW5kcyBnb3Qgc29tZSBiYXNpYyBjbGVhbnVwIHNvIGFsbHllc2NvbmZpZworc2hvdWxkIGF0IGxlYXN0IGNvbXBpbGUgKGFsdGhvdWdoIGRlZmNvbmZpZyBpcyBzdGlsbCB3aGF0J3MgdXNlZnVsKS48L3A+CisKKzxwPlNpZ25pZmljYW50IHJvYWRtYXAgdXBkYXRlcywgY2hlY2tpbmcgc2V2ZXJhbCBvdGhlciBtdWx0aWNhbGwgYmluYXJpZXMKKyhrbGliYywgc2FzaCwgc2Jhc2UsIHM2Li4uKSB0byBzZWUgd2hhdCBjb21tYW5kcyB0aGV5IGluY2x1ZGUuPC9wPgorCis8YSBuYW1lPSIxOC0wMS0yMDEzIiAvPjxhIGhyZWY9IiMxOC0wMS0yMDEzIj48aHI+PGgyPjxiPkphbnVhcnkgMTgsIDIwMTM8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD5UaGlzIG11c3QgYmUgVGh1cnNkYXkuIEkgbmV2ZXIgY291bGQgZ2V0IHRoZSBoYW5nIG9mIFRodXJzZGF5cy4gLSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNC4zLnRhci5iejI+VG95Ym94IDAuNC4zPC9hPiBpcyBiYXNlZCBvbgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvdG95Ym94L3Nob3J0bG9nLzc5Mz5jb21taXQgNzkzPC9hPi4gVGhlcmUKK2FyZSBub3cgZXhhY3RseSAxMDAgY29tbWFuZHMgaW4gZGVmY29uZmlnIChvZiBhIGxpdHRsZSBvdmVyIDIyMCBvbiB0aGUKKzxhIGhyZWY9cm9hZG1hcC5odG1sPnRvZG8gbGlzdDwvYT4pLjwvcD4KKworPHA+RWxpZSBEZSBCcmF1d2VyIGFkZGVkIHRoZSByZXYgY29tbWFuZCwgY2xlYW5lZCB1cCB0YWMsIGltcGxlbWVudGVkIHRoZSAtcworYW5kIC1mIGZsYWdzIGZvciBzZXEsIGFkZGVkIC12IGFuZCAtaSB0byBraWxsYWxsIChhbmQgZml4ZWQga2lsbGFsbCBub3QgdG8KK2tpbGwgaXRzZWxmIGJlZm9yZSBmaW5pc2hpbmcgaXRzIHBpZCBsaXN0KSwgYW5kIGFkZGVkIHRvIHRoZSB0ZXN0IHN1aXRlLgorRmVsaXggSmFuZGEgYWRkZWQgLW0gdG8gbWtkaXIsIHB3ZCAtTCBhbmQgLVAsIGFuZCBtb3JlIHRlc3Qgc3VpdGUgZW50cmllcy48L3A+CisKKzxwPlJvYiBMYW5kbGV5IGFkZGVkIHRoZSBsb3NldHVwIGNvbW1hbmQsIGFuZCBmaXhlZCB0aGUgZXhpc3RpbmcgbHMsIGNwLCBhbmQKK3JlYWRsaW5rIGNvbW1hbmRzLiBUaGUgc2VnZmF1bHQgaW4gbHMKK2hhcHBlbmVkIHdoZW4gaXQgY291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBzY3JlZW4gc2l6ZSAobGFzdCByZWxlYXNlIGNoYW5nZWQgdGhlCitkZWZhdWx0IHRvIC1DIGFuZCBhIHNjcmVlbiBzaXplIG9mIDAgbWFkZSBjb2x1bW4gdmlldyB1bmhhcHB5KSwgYW5kIGNwIGdvdCBhbgorZXh0ZW5zaXZlIHJld3JpdGUgYnJpbmdpbmcgaXQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBkaXJ0cmVlIGNoYW5nZXMgYW5kIGZpeGluZworYSBudW1iZXIgb2YgdGhpbmdzIGl0IG5ldmVyIGRpZCByaWdodCBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoZSB4YWJzcGF0aCgpCitjb2RlIGluIHRoZSBsaWJyYXJ5IG5vdyBoYW5kbGVzIGEgc3ltbGluayBhZnRlciAiLi4iIHByb3Blcmx5IChhbmQgdGhlIHRlc3QKK3N1aXRlIGNoZWNrcyBmb3IgaXQpLjwvcD4KKworPHA+SW5mcmFzdHJ1Y3R1cmUtd2lzZSB0aGUgY29kZSBpcyBiZXR0ZXIgYWJvdXQgYXV0b21hdGljYWxseSBzZXR0aW5nIHRoZQorZXJyb3IgcmV0dXJuIGNvZGUgcHJvcGVybHkuIE5vdyBlcnJvcl9tc2coKSBzZXRzIHRoZSBleGl0IGNvZGUgdG8gMSBpZiBpdCdzCitzdGlsbCBkZWZhdWx0aW5nIHRvIDAsIGFuZCB0aGUgZ2xvYmFsIGV4aXQgcGF0aCBkb2VzIGEgZmZsdXNoKE5VTEwpIHdpdGggZXJyb3IKK2JpdCBjaGVjayByYXRoZXIgdGhhbiB0cnlpbmcgdG8gYmUgcXVpdGUgc28gZ3JhbnVsYXIgYWJvdXQgZmx1c2hpbmcuIChUaGF0CittZWFucyBpZiB3ZSB1c2UgcHJpbnRmKCkgaW5zdGVhZCBvZiB4cHJpbnRmKCkgaXQgc3RpbGwgZXhpdHMgd2l0aCB0aGUgcmlnaHQKK2Vycm9yIGNvZGUsIGl0IGp1c3QgZG9lc24ndCBlbmQgdGhlIHByb2dyYW0gZWFybHkgb24gYW4gb3V0cHV0IGVycm9yLikKK01pbm9yIGJ1Z2ZpeCBzbyBUT1lCT1hfREVCVUcKK2RvZXNuJ3QgYWx3YXlzIHdhcm4gYWJvdXQgdGhlIGxhY2sgb2Ygc3VpZCBiaXQgd2hlbiB0b3lib3ggaXMgYnVpbHQgd2l0aAorYXQgbGVhc3Qgb25lIFNUQVlST09UIGNvbW1hbmQuIEJ1Z2ZpeCBmb3IgdGhlIG9wdGlvbiBbZ3JvdXBpbmddIGxvZ2ljCisoYW5kIHRoZW4gZnVydGhlciBmaXhlcyB0byB0aGUgZXJyb3IgcmVwb3J0aW5nIHBvaW50ZWQgb3V0IGJ5IEFzaHdpbmkgU2hhcm1hKS4KK2RpcnRyZWVfaGFuZGxlX2NhbGxiYWNrKCkgbm93IGhhcyBhIHByZWZpeCBsaWtlIHRoZSByZXN0IG9mIHRoZSBkaXJ0cmVlCitmdW5jdGlvbnMuIEEgbG90IG9mIHN0dWZmIGRvaW5nIG1hbnVhbCBwYXRoIGhhbmRsaW5nIHdhcyBzd2l0Y2hlZCB0byB1c2luZworbGliYyBiYXNlbmFtZSgpIChpbmNsdWRpbmcsIGVtYmFyYXNzaW5nbHksIHRoZSBiYXNlbmFtZSBjb21tYW5kKSwgd2hpY2ggbWVhbnMKK2l0IG5vdyBjb3JyZWN0bHkgZGV0ZWN0cyAiL3RyYWlsaW5nL3NsYXNoLyIgd2hpY2ggdGhlIHByZXZpb3VzIGNvZGUgZGlkbid0LjwvcD4KKworPHA+QWxzbywgbGFzdCByZWxlYXNlIGluY2x1ZGVkIHNvbWUgYWNjaWRlbnRhbGx5IGNoZWNrZWQgaW4gZGVidWcgY29kZSB0aGF0CitkaXNhYmxlZCBjb21waWxlciBvcHRpbWl6YXRpb24sIHNvIHRoZSBiaW5hcnkgc2l6ZSBibG9hdGVkIGEgYml0LiBJdCdzIGJhY2sKK3RvIC1PcyBieSBkZWZhdWx0IG5vdy48L3A+CisKKzxhIG5hbWU9IjE1LTEyLTIwMTIiIC8+PGEgaHJlZj0iIzE1LTEyLTIwMTIiPjxocj48aDI+PGI+RGVjZW1iZXIgMTUsIDIwMTI8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iVGhlIG1ham9yIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHRoaW5nIHRoYXQgbWlnaHQgZ28gd3JvbmcgYW5kIGEKK3RoaW5nIHRoYXQgY2Fubm90IHBvc3NpYmx5IGdvIHdyb25nIGlzIHRoYXQgd2hlbiBhIHRoaW5nIHRoYXQgY2Fubm90IHBvc3NpYmx5CitnbyB3cm9uZyBnb2VzIHdyb25nIGl0IHVzdWFsbHkgdHVybnMgb3V0IHRvIGJlIGltcG9zc2libGUgdG8gZ2V0IGF0IG9yIHJlcGFpci4iCis8L3A+PHA+LSBUaGUgSGl0Y2hoaWtlcidzIEd1aWRlIHRvIHRoZSBHYWxheHkuPC9wPjwvYmxvY2txdW90ZT4KKworPHA+PGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuNC4yLnRhci5iejI+VG95Ym94IDAuNC4yPC9hPiBpcyBiYXNlZCBvbgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvdG95Ym94L3Nob3J0bG9nLzc0OT5jb21taXQgNzQ5PC9hPiBhbmQgaXMKK2p1c3QgYSByZXN5bmMuIExpbnV4IDMuNyBjYW1lIG91dCwgbWVhbmluZyBpdCdzIHRpbWUgdG8gZG8gYW4gQWJvcmlnaW5hbAorTGludXggcmVsZWFzZSwgYW5kIHRoYXQgc2hvdWxkIHVzZSBhIHN0YWJsZSB2ZXJzaW9uIG9mIHRveWJveC4gU28gaGVyZSdzCithIG5ldyBzdGFibGUgdmVyc2lvbi48L3A+CisKKzxwPlRoZSBuZXcgY29tbWFuZHMgYXJlIGN1dCAoZnJvbSBKYXNvbiBLeXVuZ3dhbiBIYW4pLCB0b3VjaAorKGZyb20gQ2hvdWJleSBKaSksIGV4cGFuZCAoZnJvbSBKb25hdGhhbiBDbGFpcmVtYmF1bHQsIGFuZCBoZSBmaXhlZCBhCitidWcgaW4gbG9naW4pLCBhbmQgcm0gKGZyb20gUm9iIExhbmRsZXkpLiBGZWxpeCBKYW5kYSBhZGRlZCBVVEYtOAorc3VwcG9ydCBpbmZyYXN0cnVjdHVyZSAoZm9yIG5vbi1hc2NpaSBjaGFyYWN0ZXIgc2V0cykgd2l0aCBhIGNvbmZpZyBvcHRpb24uCitFbGllIERlIEJyYXV3ZXIgYWRkZWQgdGVzdHMgZm9yIGNhdCBhbmQgc2hhMXN1bSwgYW5kIC1zbyBvcHRpb25zIHRvIHBpZG9mLgorVGhlICJscyIgY29tbWFuZCBkZWZhdWx0cyB0byAtQyAoY29sdW1uIHZpZXcpIG5vdywgYW5kICJyZWFkbGluayIgbm93IHN1cHBvcnRzCistZmVucS48L3A+CisKKzxwPlBvcnRhYmlsaXR5IHdvcms6IHRveWJveCBzaG91bGQgbm93IGJ1aWxkIGFnYWluc3QgdGhlIG11c2wgQyBsaWJyYXJ5LAorYW5kIGFnYWluc3Qgb2xkZXIgZ2xpYmMgdmVyc2lvbnMgKGNpcmNhIDIwMDgsIG11Y2ggYmVmb3JlIHRoYXQgYW5kIGtlcm5lbAorZmVhdHVyZXMgd2UgZGVwZW5kIG9uIHN0YXJ0IHRvIGRyb3Agb3V0KS48L3A+CisKKzxwPlRoZSB3aG9sZSBjb2RlYmFzZSBnb3QgcmVpbmRlbnRlZCBmcm9tICJvbmUgdGFiIiB0byAidHdvIHNwYWNlcyIgcGVyCitsZXZlbC4gVGhlIG9wdGlvbiBwYXJzaW5nIGxvZ2ljIG5vdyB1bmRlcnN0YW5kcyBbZ3JvdXBzXSBvZiBjb21tYW5kcyAod2hlbiBtb3JlCit0aGFuIG9uZSBpbiBhIGdyb3VwIGlzIHNlbGVjdGVkIGl0IGNhbiBzd2l0Y2ggdGhlIG90aGVycyBvZmYsIG9yIGVycm9yIG91dCwKK29yIG90aGVyIHRoaW5ncykuIFRoZSBlcnJvcl9leGl0KCkgaW5mcmFzdHJ1Y3R1cmUgY2FuIG5vdyBsb25nam1wIGJhY2sgdG8gYW4KK2VhcmxpZXIgcG9pbnQgaW5zdGVhZCBvZiBleGl0aW5nLiBFYWNoIHRveXMvKiBkaXJlY3Rvcnkgbm93IGhhcyBhIFJFQURNRSwKK3RoZSBmaXJzdCBsaW5lIG9mIHdoaWNoIGlzIHRoZSBmYW5jeSBuYW1lIG1lbnVjb25maWcgdXNlcyBmb3IgdGhlIGRpcmVjdG9yeQorKHNvIG5vIG1vcmUgaGFyZHdpcmVkIGRpcmVjdG9yeSBsaXN0IGluIHNjcmlwdHMvZ2VuY29uZmlnLnNoKS48L3A+CisKKzxwPkZpeGVkIGEgZmlsZWhhbmRsZSBsZWFrIGluIGdldG1vdW50bGlzdCgpLgorUGFzcyBwYXJlbnQgcG9pbnRlciB0byBkaXJ0cmVlX2FkZF9ub2RlKCkgc28gaXQgY2FuIGdpdmUgZXJyb3IgbWVzc2FnZXMgd2l0aAorZnVsbCBwYXRoLiBUaGUgeWVzbm8oKSBmdW5jdGlvbiBub3cgYWx3YXlzIHJlYWRzIGZyb20gc3RkaW4gYW5kIHdyaXRlcyB0bworc3RkZXJyICh3ZSBjYW4gcmV0cnkgdHR5IGNoZWNraW5nIGNvbXBsZXhpdHkgb25jZSB3ZSd2ZSBnb3QgY29tbWFuZHMgbmVlZGluZworaXQpLjwvcD4KKworPHA+VGhlIG9wZW4gZ3JvdXAgYnJva2UgdGhlaXIgd2Vic2l0ZSBzbyB0aGUKKzxhIGhyZWY9aHR0cDovL29wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5Pm9sZCBsaW5rczwvYT4gdG8gUE9TSVggMjAwOAorbm93IDxhIGhyZWY9aHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTk+bmVlZCB0byBzdGFydCB3aXRoCitwdWJzPC9hPi4gU29tZSBvZiB0aGUgbGlua3MgaW4gdGhlIHRyZWUgaGF2ZSBiZWVuIHVwZGF0ZWQsIG90aGVycyBoYXZlbid0IHdoaWxlCitJIHdhaXQgdG8gc2VlIGlmIHRoZWlyIHdlYm1hc3RlciBub3RpY2VzIGFuZCBmaXhlcyBpdC48L3A+CisKKzxwPihJIG5vdGUgdGhhdCB0aGUgY3VycmVudCBybSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdGVjaG5pY2FsbHkgcG9zaXggY29tcGxpYW50CitiZWNhdXNlIHRoZSBzdGFuZGFyZCByZXF1aXJlcyBpbmZpbml0ZSByZWN1cnNpb24gZGVwdGggYW5kIHRoZSBjdXJyZW50CitpbXBsZW1lbnRhdGlvbiB1c2VzIG9uZSBmaWxlaGFuZGxlIHBlciBsZXZlbC4gSSBjYW4gYWRkIGEgY29uZmlnIG9wdGlvbgordG8gZG8gaXQgUG9zaXgncyB3YXksIHdoaWNoIGlzIG1vcmUgYnJpdHRsZSBhbmQgbmVlZHMgZXh0cmEgc2VjdXJpdHkgY2hlY2tzLAorYnV0IGFtIHdhaXRpbmcgZm9yIHNvbWVib2R5IHRvIGNvbXBsYWluIGZpcnN0LiBUaGUgZGVmYXVsdCAidWxpbWl0IC1uIiBpcyAxMDI0CitmaWxlaGFuZGxlcywgc28gZHJpbGxpbmcgZG93biBvdmVyIDEwMDAgbmVzdGVkIHN1YmRpcmVjdG9yaWVzKS48L3A+CisKKzxhIG5hbWU9IjEzLTExLTIwMTIiIC8+PGEgaHJlZj0iIzEzLTExLTIwMTIiPjxocj48aDI+PGI+Tm92ZW1iZXIgMTMsIDIwMTI8L2I+PC9oMj48L2E+Cis8YmxvY2txdW90ZT48cD4iUnVsZSBTaXg6IFRoZSB3aW5uaW5nIHRlYW0gc2hhbGwgYmUgdGhlIGZpcnN0IHRlYW0gdGhhdCB3aW5zLiIKKy0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPjxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjQuMS50YXIuYnoyPlRveWJveCAwLjQuMTwvYT4gaXMgYmFzZWQgb24KKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2hnL3RveWJveC9zaG9ydGxvZy82OTE+Y29tbWl0IDY5MTwvYT4uPC9wPgorCis8cD5FbGllIERlIEJyYXV3ZXIgY29udHJpYnV0ZWQgdXNsZWVwLCBBc2h3aW5pIEt1bWFyIGNvbnRyaWJ1dGVkIGR1LCBhbmQKK0t5dW5nd2FuIEhhbiBjb250cmlidXRlZCB2Y29uZmlnLiBPdGhlciBuZXcgY29tbWFuZHMgaW5jbHVkZSBzd2l0Y2hfcm9vdCBhbmQKK21kNXN1bSwgYW5kIHRoZSByZW1haW5pbmcgc2hlbGwgd3JhcHBlcnMgYXJlIG5vdyBwcm9wZXIgY29tbWFuZHMgKGRvczJ1bml4LAordW5peDJkb3MpLjwvcD4KKworPHA+VGhlIHBhdGNoIGNvbW1hbmQgbm93IHN1cHBvcnRzIC1sLCBhbmQgZ2V0aG9zdG5hbWUgaXMgbm93IGVuYWJsZWQgYnkKK2RlZmF1bHQuIFRoZSBkZiBjb21tYW5kIGZvbGxvd3Mgc3ltbGlua3MgdG8gZ2V0IHRoZSBhY3R1YWwgZGV2aWNlIG5hbWUuCitGZWxpeCBKYW5kYSBhZGRlZCAtbSBzdXBwb3J0IHRvIHdjIChmb3IgdXRmOCkuPC9wPgorCis8cD5PbiB0aGUgaW5mcmFzdHJ1Y3R1cmUgc2lkZSwgdGhlIGNvbW1hbmRzIGhhdmUgbm93IGJlZW4gZ3JvdXBlZCBpbnRvCisicG9zaXgiLCAibHNiIiwgYW5kICJvdGhlciIgc3ViZGlyZWN0b3JpZXMgKGZvciB0aGluZ3MgcmVxdWlyZWQgYnkgUG9zaXgtMjAwOCwKK3RoZSBMaW51eCBTdGFuZGFyZCBCYXNlIDQuMSwgYW5kIGNvbW1hbmRzIGluIG5laXRoZXIpLiBUaGlzIGFmZmVjdHMgbWVudWNvbmZpZworYW5kIHRoZSBhY3R1YWwgc291cmNlIGxheW91dCAodG95cy9jcC5jIGlzIG5vdyB0b3lzL3Bvc2l4L2NwLmMsIGFuZCBzbyBvbikuCitBbiBhbmRyb2lkIGRpcmVjdG9yeSBpcyBwbGFubmVkIChzZWUgdGhlIHVwZGF0ZWQKKzxhIGhyZWY9cm9hZG1hcC5odG1sI2FuZHJvaWQ+YW5kcm9pZCByb2FkbWFwIGFuYWx5c2lzPC9hPikuPC9wPgorCis8cD5UaGUgRkxBR18gbWFjcm9zIGZvciBjb21tYW5kIG9wdGlvbiBwYXJzaW5nIGFuZCBUVCBhbGlhcyBmb3IgdGhlIGNvbW1hbmQncworZ2xvYmFsIGJsb2NrIGFyZSBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGNvbW1hbmRzIHNob3VsZAorI2RlZmluZSBGT1JfY29tbWFuZG5hbWUgYmVmb3JlICNpbmNsdWRpbmcgPHRveXMuaD4gdG8gZ2V0IHRoZSBtYWNyb3MgZm9yIHRoYXQKK2NvbW1hbmQuPC9wPgorCis8cD5BbiB1cGdyYWRlIHRvIHRoZSBidWlsZCBpbmZyYXN0cnVjdHVyZSBub3cgYWxsb3dzIGNvbW1hbmRzIHdpdGggXyBhbmQgLQoraW4gdGhlbSwgc3VjaCBhcyBzd2l0Y2hfcm9vdC48L3A+CisKKzxwPkJ1Z2ZpeGVzOiBBdmVyeSBQZW5uYXJ1biBzcG90dGVkIGEgY2FzZSB3aGVyZSBscyBzaG93ZWQgdWlkIHR3aWNlIGluc3RlYWQgb2YKK3VpZCBhbmQgZ2lkLCBhbmQgdGhhdCBuaWNlIHdhcyB1c2luZyB0aGUgd3JvbmcgcmFuZ2Ugb2YgbnVtYmVycy4KK1RoZSBscyBjb21tYW5kIGFsc28gcmVjdXJzZWQgaW5hcHByb3ByaWF0ZWx5IGxhc3QgdGltZSAobm90IHF1aXRlCitwcm9wZXJseSBjb252ZXJ0ZWQgZm9yIHRoZSBkaXJ0cmVlIGNoYW5nZXMgbGFzdCByZWxlYXNlKSwgYW5kIG5vdyBpdCdzCitmaXhlZC4gUm95IFRhbSBwb2ludGVkIG91dCBhIGdsaXRjaCBpbiBzaCwgYW5kIGZpeGVkIGRmJ3MgcGVyY2VudGFnZQorY2FsY3VsYXRpb24gdG8gbWF0Y2ggdGhlIFBPU0lYIHNwZWMuIFRoZSBrZXJuZWwgYnVpbGQgZGlkbid0IGxpa2Ugb3VyIG1rdGVtcAorYW5kIGl0IGRvZXMgbm93LiBUaGUgd2MgY29tbWFuZCB3YXNuJ3QgcXVpdGUgcG9zaXggY29tcGxpYW50ICh0cmFpbGluZyBzcGFjZXMKK2JyZWFrIHN0dWZmKS4gVGhlIGxzIGNvbW1hbmQgcmVjdXJzZWQgaW5hcHByb3ByaWF0ZWx5IGxhc3QgdGltZSAobm90IHF1aXRlCitwcm9wZXJseSBjb252ZXJ0ZWQgZm9yIHRoZSBkaXJ0cmVlIGNoYW5nZXMgbGFzdCByZWxlYXNlKSwgYW5kIG5vdyBpdCdzCitmaXhlZC4gVGhlIGNhdHYgY29tbWFuZCB3YXNuJ3QgZGlzcGxheWluZyBieXRlIDI1NSBjb3JyZWN0bHkuIFNvbWUgbGliCitmaXhlcyAodGhpbmtvIGluIHhwaWRmaWxlKS4gRml4ZWQgdW5hbWUgLW0gd2hlbiBydW5uaW5nIGEgMzIgYml0IHg4NiBiaW5hcnkKK29uIGFuIHg4Ni02NCBob3N0IChpdCBsaWVzIGFuZCBzYXlzIHRoZSBzeXN0ZW0gaXMgaTY4NiwgaTU4Niwgb3IgaTQ4NiBkZXBlbmRpbmcKK29uIHdoYXQgdGhlIHRvb2xjaGFpbiB0aGF0IGJ1aWx0IHRoZSBiaW5hcnkgc3VwcG9ydGVkLiBUaGlzIG1ha2VzIGJ1aWxkcyBpbgorYSAzMiBiaXQgY2hyb290IG9uIGEgNjQgYml0IGtlcm5lbCBicmVhayBsZXNzLikgVGhlIGRmIGNvbW1hbmQgd2FzIGNoZWNraW5nCitwYXJ0aXRpb25zIGluIHRoZSB3cm9uZyBvcmRlciAoZGlzcGxheWluZyB1bmRlcm1vdW50cyBpbnN0ZWFkIG9mIG92ZXJtb3VudHM6Cit0aGlzIHVzZWQgdG8gd29yayBidXQgc29tZSBsaWJyYXJ5IGNvZGUgY2hhbmdlZCBvdXQgZnJvbSB1bmRlciBpdCBhbmQgaXQKK3dhc24ndCB1cGRhdGVkIHRvIG1hdGNoIHVudGlsIG5vdykuIEZlbGl4IEphbmRhIGZpbGxlZCBvdXQgdGhlIHRlc3Qgc3VpdGUKK3NvbWUgbW9yZS4gVGhlIHBhdGNoIGZpbGUgY3JlYXRpb24gbG9naWMgZ290IHR3ZWFrZWQgc2V2ZXJhbCB0aW1lcyB0bworc3VjY2Vzc2Z1bGx5IGFwcGx5IG1vcmUgcGF0Y2hlcy4gU3VwcG9ydCBmb3Igb2xkZXIgKHByZSAyLjEwKSBnbGliYwordmVyc2lvbnMgd2FzIGFkZGVkIHRvIHBvcnRhYmlsaXR5LmguPC9wPgorCis8cD5NaXNjZWxhbmVvdXMgY2xlYW51cHMgYWxsIGFyb3VuZCAobWtub2QsIHNoYTFzdW0sIGxvZ25hbWUpLCBpbmNsdWRpbmcgYQorcmV3cml0ZSBvZiB0YXNrc2V0IHRvIGJlIGxlc3MgZGVwZW5kZW50IG9uIGxpYmMgZ2V0dGluZyB0aGUgaGVhZGVycyByaWdodC4gQWxsCit0aGUgY29tbWFuZCBoZWFkZXJzIHNob3VsZCBub3cgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcmVsZXZhbnQgc3RhbmRhcmRzCitkb2N1bWVudCwgd2hlcmUgYXBwbGljYWJsZS48L3A+CisKKzxwPlRoaXMgbmV3cyBwYWdlIGhhZCBvbGQgbmV3cyBlbnRyaWVzIGZyb20gYmVmb3JlIHRoZSByZWxhdW5jaCBtb3ZlZCBpbnRvCithIHNlcGFyYXRlIDxhIGhyZWY9b2xkbmV3cy5odG1sPm9sZG5ld3M8L2E+IHBhZ2UuPC9wPgorCis8cD5JIGZvcmdvdCB0byBjcmVhdGUgPGEgaHJlZj1iaW4+c3RhdGljIGJpbmFyaWVzPC9hPiBsYXN0IHRpbWUsIGJ1dCB0aGV5J3JlCitiYWNrIG5vdy48L3A+Cis8L3NwYW4+CisKKzxhIG5hbWU9IjIzLTA3LTIwMTIiIC8+PGEgaHJlZj0iIzIzLTA3LTIwMTIiPjxocj48aDI+PGI+SnVseSAyMywgMjAxMjwvYj48L2gyPjwvYT4KKzxibG9ja3F1b3RlPjxwPiJGb3JkIiwgQXJ0aHVyIHNhaWQuICJUaGVyZSdzIGFuIGluZmluaXRlIG51bWJlciBvZiBtb25rZXlzCitvdXQgaGVyZSB3aG8gd2FudCB0byB0YWxrIHRvIHVzIGFib3V0IHRoaXMgc2NyaXB0IGZvciBIYW1sZXQgdGhleSd2ZSB3b3JrZWQKK291dC4iIC0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPjxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjQuMC50YXIuYnoyPlRveWJveCAwLjQuMDwvYT4gaXMgYmFzZWQgb24KKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2hnL3RveWJveC9zaG9ydGxvZy82NDA+Y29tbWl0IDY0MDwvYT4uPC9wPgorCis8cD5UaGUgbmV3IDxhIGhyZWY9c3RhdHVzLmh0bWw+c3RhdHVzIHBhZ2U8L2E+IGlzIGNhbGN1bGF0ZWQgZnJvbQordGhlIHJvYWRtYXAgaW5mbywgYW5kIHNob3VsZCBiZSBlYXNpZXIgdG8ga2VlcCB1cCB0byBkYXRlIGluIGZ1dHVyZS48L3A+CisKKzxwPkFuZHJlIFJlbmF1ZCBjb250cmlidXRlZCBvZCBhbmQgbW9kaW5mby4gRWxpZSBEZSBCcmF1d2VyIGNvbnRyaWJ1dGVkCit0YXNrc2V0LCBidWdmaXhlcyB0byBjbXAgYW5kIHRhaWwsIGFuZCB0ZXN0cyBmb3Igc29ydCBhbmQgdGFpbC4gS3l1bmd3YW4gSGFuCitjb250cmlidXRlZCBwYXNzd2QuIEdhdXJhbmcgU2hhc3RyaSBjb250cmlidXRlZCB3LiBBc2h3aW5pIFNoYXJtYSBzcG90dGVkIGEKK2Nhc2Ugd2hlcmUgZGlydHJlZSB3YXMgYWRkaW5nIGV4dHJhIHNsYXNoZXMgdG8gYSBwYXRoLjwvcD4KKworPHA+SSByZXdyb3RlIG9kLCBjbGVhbmVkIHVwIGNvbW0sIGRvY3VtZW50ZWQgdGhlCis8YSBocmVmPWNvZGUuaHRtbCNsaWJfbGxpc3Q+bGxpc3Q8L2E+IGFuZAorPGEgaHJlZj1jb2RlLmh0bWwjbGliX2RpcnRyZWU+ZGlydHJlZTwvYT4gaW5mcmFzdHJ1Y3R1cmUsIGFkZGVkIGFuIC1yIG9wdGlvbgordG8gZGF0ZSAoYW5kIGZpeGVkIGEgYnVnIHdoZXJlIC11IHdvdWxkbid0IG92ZXJyaWRlIC9ldGMvbG9jYWx0aW1lKSwKK2ZpeGVkIGJ1Z3MgaW4gY2htb2QgK3N0dywgZml4ZWQgbHMgdG8gc2hvdyBzdWlkIGJpdHMgcHJvcGVybHkgd2hlbiB0aGUKK2NvcnJlc3BvbmRpbmcgZXhlY3V0YWJsZSBiaXQgd2Fzbid0IHNldCwgYW5kIHdvcmtlZCBhcm91bmQgYSBsb25nc3RhbmRpbmcKK2dsaWJjIGJ1ZyB3aGVyZSBzdGF0aWMgbGlua2luZyBwcmV2ZW50cyBzdGRvdXQgZnJvbSBhdXRvbWF0aWNhbGx5IGZsdXNoaW5nCitwZW5kaW5nIG91dHB1dCBvbiBleGl0LjwvcD4KKworPGEgbmFtZT0iMjUtMDYtMjAxMiIgLz48YSBocmVmPSIjMjUtMDYtMjAxMiI+PGhyPjxoMj48Yj5KdW5lIDI1LCAyMDEyPC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+IkZvciBhIG1vbWVudCwgbm90aGluZyBoYXBwZW5lZC4gVGhlbiwgYWZ0ZXIgYSBzZWNvbmQgb3Igc28sIG5vdGhpbmcgY29udGludWVkIHRvIGhhcHBlbi4iIC0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPjxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjMuMS50YXIuYnoyPlRveWJveCAwLjMuMTwvYT4gaXMgYmFzZWQgb24gY29tbWl0Cis8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9oZy90b3lib3gvc2hvcnRsb2cvNjA3PmNvbW1pdCA2MDc8L2E+LiBJdCdzCittb3N0bHkgYSBidWdmaXggcmVsZWFzZSBmb3IgbHMgLWwgKHdoaWNoIHdhcyB1bmhhcHB5IG9uIHRhcmdldHMgb3RoZXIgdGhhbgoreDg2LTY0KSwgcGx1cyBhIG5ldyAiZGF0ZSIgZnJvbSBBbmRyZSBSZW5hdWQgYW5kIHJld3JpdHRlbiBjaGdycC9jaG93biB3aGljaAorbm93IHN1cHBvcnQgdGhlIGZ1bGwgc2V0IG9mIHBvc2l4IGZsYWdzLCBwbHVzIGEgbGl0dGxlIHdvcmsgb24gdGhlIHRlc3QKK3N1aXRlIGFuZCBzb21lIG1vcmUgaGVhZGVyIHR3ZWFrcyB0b3dhcmRzIGV2ZW50dWFsIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUKK211c2wgbGliYy48L3A+CisKKzxwPlRoZSB0b2RvIGxpc3QgcnVubmV0aCBvdmVyLCBidXQgInJlbGVhc2UgZWFybHksIHJlbGVhc2Ugb2Z0ZW4iLCBzbyBoZXJlCitpdCBpcy4gVGhlIHJvYWRtYXAgYW5kIGRvY3VtZW50YXRpb24gYXJlIGEgYml0IGJlaGluZCwgYW5kIEkndmUgZ290IH40MAorcGVuZGluZyBzdWJtaXNzaW9ucyB0byByZXZpZXcuIEkgbmVlZCB0byBjYXRjaCB1cC4uLjwvcD4KKzwvc3Bhbj4KKworPGEgbmFtZT0iMTItMDYtMjAxMiIgLz48YSBocmVmPSIjMTItMDYtMjAxMiI+PGhyPjxoMj48Yj5KdW5lIDEyLCAyMDEyPC9iPjwvaDI+PC9hPgorPGJsb2NrcXVvdGU+PHA+IkZvciBpbnN0YW5jZSwgb24gdGhlIHBsYW5ldCBFYXJ0aCwgbWFuIGhhZCBhbHdheXMgYXNzdW1lZCB0aGF0CitoZSB3YXMgbW9yZSBpbnRlbGxpZ2VudCB0aGFuIGRvbHBoaW5zIGJlY2F1c2UgaGUgaGFkIGFjaGlldmVkIHNvIG11Y2ggLSB0aGUKK3doZWVsLCBOZXcgWW9yaywgd2FycyBhbmQgc28gb24gLSB3aGlsc3QgYWxsIHRoZSBkb2xwaGlucyBoYWQgZXZlciBkb25lIHdhcworbXVjayBhYm91dCBpbiB0aGUgd2F0ZXIgaGF2aW5nIGEgZ29vZCB0aW1lLiBCdXQgY29udmVyc2VseSwgdGhlIGRvbHBoaW5zIGhhZAorYWx3YXlzIGJlbGlldmVkIHRoYXQgdGhleSB3ZXJlIGZhciBtb3JlIGludGVsbGlnZW50IHRoYW4gbWFuIC0gZm9yIHByZWNpc2VseQordGhlIHNhbWUgcmVhc29ucy4iIC0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkl0J3Mgd2VsbCBwYXN0IHRpbWUgZm9yIDxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjMuMC50YXIuYnoyPnRveWJveCAwLjMuMDwvYT4sCitzbyBoZXJlIGl0IGlzLCBiYXNlZAorb24gPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvaGcvdG95Ym94L3Nob3J0bG9nLzU5NT5jb21taXQgNTk1PC9hPiwgYW5kIHRoZQorc3RhdGljYWxseSBsaW5rZWQgPGEgaHJlZj1kb3dubG9hZHMvYmluYXJpZXM+cHJlYnVpbHQgYmluYXJpZXM8L2E+IHNob3VsZAorYWN0dWFsbHkgYmUgc3RhdGljYWxseSBsaW5rZWQgdGhpcyB0aW1lICh0aGFua3MgQXNod2luaSBTaGFybWEgZm9yIHNwb3R0aW5nCit0aGF0KS48L3A+CisKKzxwPkl0J3MgaGFyZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIGN1dCBhIHJlbGVhc2UsIGJlY2F1c2UgZGV2ZWxvcG1lbnQKK2RvZXNuJ3Qgc3RvcC4gIkxvbmcgYmVmb3JlIG5vdyIgaXMgdGhlIG9idml1b3MgYW5zd2VyLCBvZiBjb3Vyc2UuCitUaGUgcHJvamVjdCdzIG1haW50YWluZXIgYWxzbyBtb3ZlZCBob3VzZSBkdXJpbmcgdGhpcyBkZXZlbG9wbWVudCBjeWNsZSwgd2hpY2gKK3RocmV3IHRoaW5ncyBvZmYgZm9yIGEgYml0IChzbyBtYW55IGJveGVzKS4gUmVsZWFzZXMgc2hvdWxkIGhvcGVmdWxseSBiZSBhIGJpdAorbW9yZSBmcmVxdWVudCBmcm9tIGhlcmUgb24uPC9wPgorCis8cD5UaGUgYmlnIHRoaW5ncyBSb2Igd29ya2VkIG9uIHRoaXMgdGltZSB3ZXJlIHRoZSBuZXcgZGlydHJlZSAoZGlyZWN0b3J5Cit0cmVlIHRyYXZlcnNhbCkgaW5mcmFzdHJ1Y3R1cmUsIGFuZCBhIGNvbXBsZXRlIHJld3JpdGUgb2YgbHMgdXNpbmcgdGhhdAord2hpY2ggc2hvdWxkIG5vdyBpbXBsZW1lbnQgYWxsIDI2IHBvc2l4IG9wdGlvbnMuPC9wPgorCis8cD5HZW9yZ2kgQ2hvcmJhZHpoaXlza2kgYWRkZWQgcHJpbnRlbnYsIHdob2FtaSwgbWtkaXIsIG1rZmlmbywgY2htb2QsIGNob3duLAorY2hncnAsIGFuZCB1bmlxLiBIZSBhbHNvIGFkZGVkIGZyYWN0aW9uIGFuZCBleHRlbnNpb24gc3VwcG9ydCB0byBzbGVlcCAoc28gaWYKK3lvdSBuZWVkIGEgcXVhcnRlci1zZWNvbmQgc2xlZXAsIGl0IGNhbiBkbyB0aGF0IG5vdyksIGFuZCBmaXhlZCBhIGJ1aWxkIGJ1Zworb24gc2xhY2t3YXJlLjwvcD4KKworPHA+RGFuaWVsIFdhbHRlciBjb250cmlidXRlZCBhIHN0cmluZyB0byBtb2RlX3QgcGFyc2VyIChpbiB1c2UgYnkgY2htb2QgYW5kCitta2RpciAtbSkuICBJbHlhIEt1em1pY2ggY29udHJpYnV0ZWQgY29tbS4gRWxpZSBEZSBCcmF1d2VyIGFkZGVkIG1vdW50cG9pbnQsCit2bXN0YXQsIGxvZ25hbWUsIGxvZ2luLCBhbmQgbWt0ZW1wLiBLZXZpbiBDaGFzZSBkaWQgc29tZSBwb3J0YWJpbGl0eSBjbGVhbnVwcy4KK1BlcmUgT3JnYSBmaXhlZCBzb21lIGRvY3VtZW50YXRpb24uPC9wPgorCis8cD5UaGUgInRhYyIgYW5kICJjbGVhciIgY29tbWFuZHMgYXJlIG5vdyBub3JtYWwgY29tbWFuZHMgaW5zdGVhZCBvZiBzaGVsbAord3JhcHBlcnMsIGFuZCB0aGUgaGVhZGVyICNpbmNsdWRlcyBoYXZlIGJlZW4gY2xlYW5lZCB1cCBhIGJpdCB0byByZW1vdmUKK2RlcHJlY2F0ZWQgZnVuY3Rpb25zIGFuZCBhdHRlbXB0IHRvIGluY3JlYXNlIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgYmlvbmljIGFuZAorbXVzbCBDIGxpYnJhcmllcywgInRhaWwiIHNob3VsZCBub3cgdXNlIGxzZWVrKCkgZm9yIGxhcmdlIGZpbGVzLCBhbmQgImlkIiBnb3QKK3NvbWUgY2xlYW51cHMgYW5kIGJ1Z2ZpeGVzLjwvcD4KKworPHA+VGhlIG5ldyBUT1lCT1hfRkxPQVQgY29uZmlndXJhdGlvbiBvcHRpb24gc2VsZWN0cyB3aGV0aGVyIG9yIG5vdAordG8gaW5jbHVkZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IChmb3IgZW1iZWRkZWQgdGFyZ2V0cyB3aGVyZSB0aGF0J3MKK3Byb2JsZW1hdGljKS48L3A+CisKKzxwPlNldmVyYWwgcmFuZG9tIGJ1Z2ZpeGVzOiB1bnNoYXJlKCkgbWlnaHQgYWN0dWFsbHkgYnVpbGQgcG9ydGFibHkgbm93LAoreWVzICduJyB8IGNwIC1pIHNob3VsZCBubyBsb25nZXIgYnlwYXNzIHN0ZGluIGFuZCBwcm9tcHQgdmlhIHRoZSB0dHksIHRoZQorU1VJRCBzdXBwb3J0IG5vIGxvbmdlciBkcm9wcyBwZXJtaXNzaW9ucyBnb2luZyB0aHJvdWdoIHRoZSB0b3lib3gKK211bHRpcGxleGVyIGNvbW1hbmQsIGFuZCBhIGJ1Z2ZpeCB0byB4YXJncyAtMCBtZWFucyBpdCBzaG91bGQgbm8gbG9uZ2VyCitzZWdmYXVsdC4gKEkgaGF2ZSBhIHBlbmRpbmcgYnVnIHJlcG9ydCBhYm91dCB4YXJncyBub3QgZG9pbmcgdGhlIGZ1bGwKK3Bvc2l4IHdoaXRlc3BhY2UgaGFuZGxpbmcgdGhhdCAtMCBvYnNvbGV0ZWQsIGJ1dCBJJ2xsIGRlYWwgd2l0aCB0aGF0IG5leHQKK3JlbGVhc2UuKTwvcD4KKworPHA+VGhlIGJ1aWxkIGluZnJhc3RydWN0dXJlIGlzIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgRkxBR18gbWFjcm9zCitmb3IgdGhlIG9wdGlvbnMsIGJ1dCBjdXJyZW50bHkgd2l0aCB0aGUgd3JvbmcgbmFtZXMuIFNvbWUgbW9yZSBtYWNybyBnbHVlCitpcyBuZWNlc3NhcnksIHdoaWNoIEkgaGF2ZW4ndCBxdWl0ZSBmaWd1cmVkIG91dCBob3cgdG8gZG8geWV0LjwvcD4KKworPHA+QSBkZWZjb25maWcgdG95Ym94IGF0IHRoZSBzdGFydCBvZiB0aGUgJFBBVEggaGFzIHN1Y2Nlc3NmdWxseSBidWlsdAorTGludXggRnJvbSBTY3JhdGNoIChpbiBteSBBYm9yaWdpbmFsIExpbnV4IHByb2plY3QpLiBUaGUgY29tbWFuZHMgdGhhdAorJ2RlZmF1bHQgbicgaW4gdGhlIGNvbmZpZyBhcmUgb2Z0ZW4gc3RpbGwgYnJva2VuLCBjbGVhbnVwIGlzIG9uZ29pbmcuCisoVGhlIG5ldyBkaXJ0cmVlIHN0dWZmIGJyb2tlIHNldmVyYWwgb2YgdGhlbSB0aGF0IGhhdmVuJ3QgYmVlbiBjb252ZXJ0ZWQKK3lldCwgYnV0IGlmIEkgd2FpdCB1bnRpbCBldmVyeXRoaW5nIHdvcmtzIHdlIHdvbid0IGhhdmUgYSByZWxlYXNlIGJlZm9yZQorMS4wLCBzbyBoZXJlJ3MgYSBjaGVja3BvaW50Lik8L3A+CisKKworPGEgbmFtZT0iMDMtMDMtMjAxMiIgLz48YSBocmVmPSIjMDMtMDMtMjAxMiI+PGhyPjxoMj48Yj5NYXJjaCAzLCAyMDEyPC9iPjwvaDI+PC9hPgorCis8YmxvY2txdW90ZT48cD4iVGhleSB3ZW50IHVubm90aWNlZCBhdCBHb29uaGlsbHksIHBhc3NlZCBvdmVyIENhcGUgQ2FuYXZlcmFsCit3aXRob3V0IGEgYmxpcCwgYW5kIFdvb21lcmEgYW5kIEpvZHJlbGwgQmFuayBsb29rZWQgc3RyYWlnaHQgdGhyb3VnaCB0aGVtLgorV2hpY2ggd2FzIGEgcGl0eSwgYmVjYXVzZSBpdCB3YXMgZXhhY3RseSB0aGUgc29ydCBvZiB0aGluZyB0aGV5J2QgYmVlbiBsb29raW5nCitmb3IgYWxsIHRoZXNlIHllYXJzLiI8L3A+PC9wPi0gVGhlIEhpdGNoaGlrZXIncyBHdWlkZSB0byB0aGUgR2FsYXh5LjwvcD4KKzwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkhlcmUncyA8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4yLjEudGFyLmJ6Mj50b3lib3ggMC4yLjE8L2E+IGJhc2VkCitvbiA8YSBocmVmPWh0dHA6Ly9sYW5kbGV5Lm5ldC9oZy90b3lib3gvc2hvcnRsb2cvNTEyPmNvbW1pdCA1MTI8L2E+LiAgVGhpcwordGltZSBhcm91bmQsIHRoZXJlIGFyZSBzdGF0aWNhbGx5IGxpbmtlZCA8YSBocmVmPWRvd25sb2Fkcy9iaW5hcmllcz5wcmVidWlsdAorYmluYXJpZXM8L2E+IGZvciB2YXJpb3VzIGVtYmVkZGVkIHRhcmdldHMuPC9wPgorCis8cD5JdCdzIGJlZW4gYSBidXN5IGZldyB3ZWVrcywgYWxtb3N0IGVudGlyZWx5IGR1ZSB0byBuZXcgY29udHJpYnV0b3JzLiAoSQoraGF2ZSBub3QgcXVpdGUgYmVlbiBrZWVwaW5nIHVwLik8L3A+CisKKzxwPkVsaWUgRGUgQnJhdXdlciBjb250cmlidXRlZCBmcmVlLCB1cHRpbWUsIHN3YXBvbiwgc3dhcG9mZiwgbHNtb2QsIG1rbm9kLAoraW5zbW9kLCBybW1vZCwgYW5kIGZpeGVkIGEgYnVnIGluIGJhc2VuYW1lLiAgQW5kcmUgUmVuYXVkIGNvbnRyaWJ1dGVkIGxzLCBsbiwKK3JlYWxwYXRoLCBhbmQgaG9zdG5hbWUuIEFuZHJlcyBIZWNrIGNvbnRyaWJ1dGVkIHBpZG9mIGFuZCBraWxsYWxsLiAgRGFuaWVsCitXYWx0ZXIgd3JvdGUga2lsbCBhbmQgZXh0ZW5kZWQgaWQuIFRpbW90aHkgRWxsaW90dCBjb250cmlidXRlZCB0YWlsIGFuZCB0ZXN0cworZm9yIGNtcC4gRnJhbmsgQmVyZ21hbm4gc2VudCBhIHdhcm5pbmcgZml4LiBCcnljZSBGcmlja2UgYWRkZWQgLWkgdG8gY3AuCitOYXRoYW4gTWNTd2VlbiBwb2ludGVkIG91dCBhbiBvcHRpbWl6YXRpb24uIEdlb3JnaSBDaG9yYmFkemhpeXNraSBmaXhlZAorY3Jvc3MgY29tcGlsaW5nIHRvIHdvcmsgbW9yZSByZWxpYWJseS48L3A+CisKKzxwPihNeSBvd24gY29udHJpYnV0aW9uIHRoaXMgdGltZSBhcm91bmQgd2FzIGp1c3QgdGlnaHRlbmluZyB1cCBvdGhlciBwZW9wbGUncworY29kZSwgYSBidWlsZCBmaXggdG8gdW5zaGFyZSwgc29tZSByYW5kb20gYnVnZml4ZXMsIGFuZCBzbyBvbi4gTXkgb25seSBuZXcKK2NvZGUgdGhpcyB0aW1lIGFyb3VuZCB3YXMgd3JpdGluZyBhIGJhc2ggcmVwbGFjZW1lbnQgZm9yIHRoZSBleGlzdGluZyBweXRob24KK2Jsb2F0LW8tbWV0ZXIuKTwvcD4KKworPHA+TGFzdCB0aW1lICh0aGUgMC4yLjAgcmVsZWFzZSkgaW5jbHVkZWQgdGhlIGZpcnN0IHBhc3MgYXQgYW4gaWQgY29tbWFuZCBmcm9tCitUaW0gQmlyZCwgZW52IGFuZCBiYXNlbmFtZSBmcm9tIFRyeW4gTWlyZWxsLCBjbXAgYW5kIGhlYWQgZnJvbSBUaW1vdGh5IEVsbGlvdHQsCittb3JlIGJ1Z2ZpeGVzIGZyb20gTmF0aGFuIE1jU3dlZW4gYW5kIEVsaWUgRGUgQnJhdXdlciwgYW5kIEx1aXMgRmVsaXBlIFN0cmFubworTW9yYWVzIGRpZCBhIGZpcnN0IHBhc3MgYXQgdGhlIHdobyBjb21tYW5kIHBsdXMgb3RoZXIgYnVnZml4ZXMgYW5kCitvcHRpbWl6YXRpb25zLjwvcD4KKworPHA+KEZvciB0aGF0IHJlbGVhc2UgSSBkaWQgeGFyZ3MsIGNhbCwgdHJ1bmNhdGUsIHVubGluaywgbm9odXAsIHR0eSwgd2MsIGxpbmssCitkaXJuYW1lLCB1bnNoYXJlLCBhbmQgdmFyaW91cyBpbmZyYXN0cnVjdHVyZSB0d2Vha3MsIGJ1dCBpdCB0b29rIG1lIDMgbW9udGhzCithbmQgdGhvc2UgZ3V5cyBkaWQgdGhlaXIgc3R1ZmYgaW4gYSB3ZWVrIG9yIHNvLik8L3A+CisKKworPGEgbmFtZT0iMTItMDItMjAxMiIgLz48YSBocmVmPSIjMTItMDItMjAxMiI+PGhyPjxoMj48Yj5GZWJydWFyeSAxMiwgMjAxMjwvYj48L2gyPjwvYT4KKzxibG9ja3F1b3RlPjxwPgorImZvciB0aG91Z2ggaXQgaGFzIG1hbnkgb21pc3Npb25zIGFuZCBjb250YWlucyBtdWNoIHRoYXQgaXMgYXBvY3J5cGhhbCwgb3IgYXQKK2xlYXN0IHdpbGRseSBpbmFjY3VyYXRlLCBpdCBzY29yZXMgb3ZlciB0aGUgb2xkZXIsIG1vcmUgcGVkZXN0cmlhbiB3b3JrIGluIHR3bworaW1wb3J0YW50IHJlc3BlY3RzLi4uIjwvcD4KKzxwPiAtIFRoZSBIaXRjaGhpa2VyJ3MgR3VpZGUgdG8gdGhlIEdhbGF4eTwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkhlcmUncyB0aGUgZmlyc3QgQlNEIGxpY2Vuc2VkIHJlbGVhc2UsCis8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4yLjAudGFyLmJ6Mj50b3lib3gtMC4yLjA8L2E+LCBtb3JlIGEgc3luY2hyb25pemF0aW9uCitwb2ludCB0aGFuIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwuICA0NyBjb21tYW5kcyBpbiBhIHJlYXNvbmFibHkKK3JlYWR5LXRvLXVzZSBzdGF0ZSAod2hhdCAibWFrZSBkZWZjb25maWciIGJ1aWxkcyksIGFub3RoZXIgdGVuIG9yIHNvIHBhcnRpYWxseQorZmluaXNoZWQgc3R1YnMgKCJtYWtlIGFsbHllc2NvbmZpZyIpLCBhbmQgc2V2ZXJhbAorcGF0Y2hlcyBwZW5kaW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QgSSBuZWVkIHRvIHJldmlldyBhbmQgbWVyZ2UuPC9wPgorCis8cD5Nb3JlIHRvIGNvbWUuLi48L3A+CisKKzxocj4KKzxhIG5hbWU9IjE1LTExLTIwMTEiIC8+PGEgaHJlZj0iIzE1LTExLTIwMTEiPjxocj48aDI+PGI+Tm92ZW1iZXIgMTUsIDIwMTE8L2I+PC9oMj48L2E+CistIEJhY2sgZnJvbSB0aGUgZGVhZCwgVG95Ym94IGlzIG5vdyB1bmRlciBhIDIKK2NsYXVzZSBCU0QgbGljZW5zZSwgYW5kIGFpbWluZyB0byBiZWNvbWUgdGhlIGRlZmF1bHQgY29tbWFuZCBsaW5lCitpbXBsZW1lbnRhdGlvbiBvZiBBbmRyb2lkIHN5c3RlbXMgZXZlcnl3aGVyZS48L3A+CisKKzxwPk1vcmUgdG8gY29tZS4uLjwvcD4KKworPGhyPgorCis8cD48YSBocmVmPW9sZG5ld3MuaHRtbD5PbGQgbmV3czwvYT4gZnJvbSBiZWZvcmUgdGhlIHJlbGF1bmNoLjwvcD4KKworPCEtLSNpbmNsdWRlIGZpbGU9ImZvb3Rlci5odG1sIiAtLT4KZGlmZiAtLWdpdCBhL3RveWJveC93d3cvb2xkbmV3cy5odG1sIGIvdG95Ym94L3d3dy9vbGRuZXdzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTJhNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC93d3cvb2xkbmV3cy5odG1sCkBAIC0wLDAgKzEsMTM5IEBACis8aHRtbD48aGVhZD48dGl0bGU+dG95Ym94OiBvbGQgbmV3czwvdGl0bGU+Cis8IS0tI2luY2x1ZGUgZmlsZT0iaGVhZGVyLmh0bWwiIC0tPgorCis8aDI+T2xkIE5ld3M8L2gyPgorCis8cD5UaGlzIHByb2plY3QgPGEgaHJlZj1odHRwOi8vbGlzdHMuYnVzeWJveC5uZXQvcGlwZXJtYWlsL2J1c3lib3gvMjAwNi1TZXB0ZW1iZXIvMDI0Nzk0Lmh0bWw+c3RhcnRlZCBpbiAyMDA2PC9hPiwgZ290IG1vdGhiYWxsZWQgaW4gMjAwOQorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAwOS5odG1sIzE4LTA2LTIwMDk+Zm9yPC9hPgorPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvbm90ZXMtMjAxMS5odG1sIzMxLTAzLTIwMTE+dmFyaW91czwvYT4KKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLTIwMTEuaHRtbCMwOC0wNi0yMDExPnJlYXNvbnM8L2E+CisoZHVyaW5nIHdoaWNoIHRpbWUgSQorPGEgaHJlZj1odHRwOi8vbGlzdHMuYnVzeWJveC5uZXQvcGlwZXJtYWlsL2J1c3lib3gvMjAxMC1NYXJjaC8wNzE3ODMuaHRtbD5jb250cmlidXRlZDwvYT4KK3NvbWUgdG95Ym94IGNvZGUgYW5kIGRlc2lnbiBpZGVhcyB0byBidXN5Ym94PC9hPiBidXQgcmV0YWluZWQgdGhlIGNvcHlyaWdodHMgdG8KK215IHdvcmspLCB0aGVuIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLTIwMTEuaHRtbCMxMy0xMS0yMDExPnJlbGF1bmNoZWQ8L2E+Cit1bmRlciBhIDItY2xhdXNlIEJTRCBsaWNlbnNlIGluIDIwMTEuCitUaGUgZm9sbG93aW5nIG5ld3MgZW50cmllcyBwcmVkYXRlIHRoYXQgcmVsYXVuY2g6PC9wPgorCis8aHI+Cis8cD48Yj5EZWNlbWJlciAxLCAyMDA5PC9iPiAtIDxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjEuMC50YXIuYnoyPnRveWJveC0wLjEuMDwvYT4gaXMgb3V0LjwvcD4KKworPHA+VGhpcyByZWxlYXNlIGlzIGEgY291cGxlIGJ1aWxkIGZpeGVzIGFuZCBhbm90aGVyIGJ1Z2ZpeCB0byBwYXRjaC48L3A+CisKKzxocj4KKzxwPjxiPkFwcmlsIDE3LCAyMDA5PC9iPiAtIEFub3RoZXIgYnVnZml4IHJlbGVhc2UsCis8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4wLjkuMi50YXIuYnoyPnRveWJveC0wLjAuOS4yPC9hPiwgb2ZmIGJ5IG9uZSBhbGxvY2F0aW9uIGVycm9yIGluIHBhdGNoLjwvcD4KKworPHA+KERhcm4gZmlkZGx5IGNvbW1hbmQsIGlubml0Pyk8L3A+CisKKzxocj4KKzxwPjxiPk1hcmNoIDI5LCAyMDA5PC9iPiAtIFJlbGVhc2VkCis8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4wLjkuMS50YXIuYnoyPnRveWJveCAwLjAuOS4xPC9hPiB3aGljaCBpcyBhIGJ1Z2ZpeAorcmVsZWFzZSBmb3IgaXNzdWVzIHdpdGggdGhlIHBhdGNoIGNvbW1hbmQuPC9wPgorCis8cD5UaGUgcHJvamVjdCBpcyBjdXJyZW50bHkgb24gaG9sZCB3aGlsZSB0aGUgZGV2ZWxvcGVycyBsZWFybiBMdWEgYW5kCitkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcG9ydCB0aGUgd2hvbGUgdGhpbmcgdG8gdGhhdCBsYW5ndWFnZS4KKyhBbHNvIG5vdGU6IHRoZSBtYWlsaW5nIGxpc3QgbW92ZWQuICBTZWUgdGhlIGxpbmtzIG9uIHRoZSBsZWZ0LiAgWW91J2xsCitoYXZlIHRvIHJlc3Vic2NyaWJlLik8L3A+CisKKzxocj4KKzxwPjxiPkphbnVhcnkgMjksIDIwMDk8L2I+IC0gUmVsZWFzZWQKKzxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjAuOS50YXIuYnoyPnRveWJveCAwLjAuOS50YXIuYnoyPC9hPiB3aGljaCBpcyBhIG1pbm9yIHBhY2thZ2luZworZml4IGZvciAwLjAuOC4gIChUaGUgcHJldmlvdXMgcmVsZWFzZSB0YXJiYWxsIGNvbnRhaW5lZCBhIHByZWJ1aWx0IHg4Ni02NAora2NvbmZpZy9jb25mIGZpbGUsIGJlY2F1c2UgdGhlIHJlbGVhc2Ugc2NyaXB0IHJhbiBkZWZjb25maWcgdG8KK3ByZWdlbmVyYXRlIGhlbHAuaCwgYW5kIGRpZG4ndCBydW4gbWFrZSBjbGVhbiBhZnRlcndhcmRzLikgIFRoZSBhY3R1YWwgc291cmNlCitjb2RlIGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgcmVsZWFzZS48L3A+CisKKzxocj4KKzxwPjxiPkphbnVhcnkgMjAsIDIwMDk8L2I+IC0gPGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuMC44LnRhci5iejI+dG95Ym94IDAuMC44PC9hPgorYWRkcyB0aGUgdW5hbWUsIGNrc3VtLCBhbmQgbWtzd2FwZnMgY29tbWFuZHMuPC9wPgorCis8cD5UaGlzIHVuYW1lIGltcGxlbWVudGF0aW9uIGlzIGNyb3NzIGNvbXBpbGUgZnJpZW5kbHk6IHdoZW4gYnVpbHQgYXMgYSAzMiBiaXQKK2JpbmFyeSBvbiBhbiB4ODZfNjQgaG9zdCwgaXQgcmVwb3J0cyAiaTY4NiIgdG8gY29uZnVzZSBhdXRvY29uZiBsZXNzLjwvcD4KKworPHA+VGhpcyBja3N1bSBoYXMgc2V2ZXJhbCBleHRyYSBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0bworcHJvZHVjZSBkaWZmZXJlbnQgY2tzdW0gdmFyaWFudHMgYmFzZWQgb24gdGhlIHNhbWUgY3JjMzIgYWxnb3JpdGhtLiAgRm9yCitleGFtcGxlLCB0aGUgYnJvYWRjb20gInRyeCIgaW1hZ2UgcGFja2FnaW5nIHVzZXMgYSBsaXR0bGUgZW5kaWFuIGNyYywKK3ByZS1pbnZlcnRlZCBpbnN0ZWFkIG9mIHBvc3QtaW52ZXJ0ZWQsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsZW5ndGguCisoV2l0aG91dCB0aGVzZSBhcmd1bWVudHMsIGl0IHByb2R1Y2VzIHRoZSBub3JtYWwgU1VTdjQgY2tzdW0gb3V0cHV0Lik8L3A+CisKKzxwPkl0IGFsc28gdXBncmFkZXMgbmV0Y2F0IHdpdGggYSBzZXJ2ZXIgbW9kZSAoLWwgb3B0aW9uKSBhbmQgZml4ZXMgc2V2ZXJhbAorbmV0Y2F0IGJ1Z3MuICBJdCBhbHNvIGZpeGVkIG11bHRpcGxlIGJ1Z3MgaW4gInBhdGNoIiwgd29ya3MgYXJvdW5kIGEKK3JlaXNlcmZzIGJ1ZyBpbiBjcCwgYW5kIG9uZWl0IGNhbiByZWJvb3Qgb24gZXhpdCBtb3JlIHJlbGlhYmx5LjwvcD4KKworPHA+PGI+Tm92ZW1iZXIgMTIsIDIwMDg8L2I+IC0KKzxhIGhyZWY9ZG93bmxvYWRzL3RveWJveC0wLjAuNy50YXIuYnoyPnRveWJveCAwLjAuNzwvYT4KK2FkZHMgc29ydCBhbmQgdGVlIGNvbW1hbmRzLCB1cGdyYWRlcyB0aGUgaW50ZXJuYWwgb3B0aW9uIHBhcnNpbmcgbG9naWMgYW5kIHRoZQordGVzdCBzdWl0ZSwgYW5kIG51bWVyb3VzIGJ1Z2ZpeGVzIChidW56aXAsIGNocm9vdCwgY2F0LCBwYXRjaCkuPC9wPgorCis8cD48Yj5NYXkgMjYsIDIwMDg8L2I+IC0gPGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuMC42LnRhci5iejI+dG95Ym94IDAuMC42PC9hPgorYWRkcyBjYXQsIHJtZGlyLCBhbmQgc2VxLiAgQnVnZml4ZXMgdG8gY3AgYW5kIGEgbmV3IC12IG9wdGlvbi4gIFVwZGF0ZXMgbWRldiB0bword29yayB3aXRoIHRoZSAyLjYuMjUga2VybmVsLiAgVXBkYXRlcyBwYXRjaCB0byBrbm93cyB0aGF0IGEgZmlsZSBkYXRlZAorMTk2OS0xMi0zMSBtZWFucyBpdCBkb2Vzbid0IGV4aXN0LCBhbmQgdG8gZmFpbCBpZiBhIGZpbGUgaXQgbmVlZHMgdG8gY3JlYXRlCithbHJlYWR5IGV4aXN0cy4gIENvbW1hbmQgbGluZSBvcHRpb24gcGFyc2luZyBjYW4gbm93IGhhbmRsZSB0aGluZ3MgbGlrZSAiZWNobworLW5leCIgdnMgImVjaG8gLW5lIi4gIFNldmVyYWwgdXBkYXRlcyB0byB0aGUgdGVzdCBzdWl0ZSAocnVuIHNjcmlwdHMvdGVzdC5zaCksCithbmQgc29tZSBidWlsZCBmaXhlcy48L3A+CisKKzxwPgorPGhyPgorPHA+PGI+TWFyY2ggMjksIDIwMDg8L2I+IC0KK1RpbWUgdG8gcmVsZWFzZSA8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4wLjUudGFyLmJ6Mj50b3lib3ggMC4wLjU8L2E+LCB3aXRoCituZXcgY29tbWFuZHMgY3AgYW5kIGNodnQgYW5kIHNldmVyYWwgYnVnZml4ZXMuPC9wPgorCis8cD5Nb3JlIG1ha2VmaWxlIHRhcmdldHM6ICJtYWtlIHRlc3QiIHJ1bnMgdGhlIHRlc3Qgc3VpdGUgKHdoaWNoIG5lZWRzIG1vcmUgdGVzdAorc2NyaXB0cyksIGFuZCBtYWtlIGluc3RhbGwvaW5zdGFsbF9mbGF0L3VuaW5zdGFsbC91bmluc3RhbGxfZmxhdCBjYWxscworbWFrZS9pbnN0YWxsLnNoICh3aXRoIG9wdGlvbnMgLS1sb25nIC0tc3ltbGluayAtLWZvcmNlIC0tdW5pbnN0YWxsIGRlcGVuZGluZworb24gdGhlIGNvbnRleHQpLjwvcD4KKworPHA+TW9zdCBvZiB0aGUgd29yayBoYXMgYmVlbiBiZWhpbmQgdGhlIHNjZW5lcywgbmFtZWx5IGEgc2lnbmlmaWNhbnQgcmV3cml0ZSBvZgordGhlIGJ1aWxkIGxvZ2ljIHNvIGFkZGluZyBlYWNoIG5ldyBjb21tYW5kIGNvbnNpc3RzIG9mIGFkZGluZyBhIHNpbmdsZSBDIGZpbGUgdG8KK3RoZSAidG95cyIgZGlyZWN0b3J5LCBlbGltaW5hdGluZyB0aGUgbmVlZCB0byB0b3VjaCBhbnkgb3RoZXIgZmlsZXMuCitUaGVyZSBhcmUgc3BlY2lhbGx5IGZvcm1hdHRlZCBjb21tZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBDIGZpbGUgdG8gZ2VuZXJhdGUKK3RoZSBvdGhlciBmaWxlcywgc2VlIHRveXMvaGVsbG8uYyBmb3IgYW4gZXhhbXBsZS4gIChTZWUgZ2VuZXJhdGVkL1JFQURNRS50eHQKK2FuZCA8YSBocmVmPWNvZGUuaHRtbD5jb2RlLmh0bWw8L2E+IGZvciBkZXRhaWxzLik8L3A+CisKKzxwPjxiPkphbnVhcnkgMiwgMjAwODwvYj4gLSBBbmQgPGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuMC40LnRhci5iejI+dG95Ym94LTAuMC40LnRhci5iejI8L2E+IGlzIG91dC4KK1RoZSBuZXcgYXBwbGV0cyB0aGlzIHRpbWUgYXJvdW5kIGluY2x1ZGUgYmFzZW5hbWUsIGNocm9vdCwgZGlybmFtZSwgZG1lc2csCitoZWxwLCBta2ZpZm8sIG5ldGNhdCwgcGF0Y2gsIHNoYTFzdW0sIHRvdWNoLCBhbmQgdHR5LjwvcD4KKworPHA+Tm90ZSB0aGF0IHRoaXMgInRvdWNoIiBpbmNsdWRlcyAtbCB0byBzZXQgdGhlIGxlbmd0aCwgd2hpY2ggY2FuIHRydW5jYXRlCithIGZpbGUgb3IgY3JlYXRlIGEgY29tbXBsZXRlbHkgc3BhcnNlIGZpbGUsIGdvb2QgZm9yIGZpbGVzeXN0ZW0gaW1hZ2VzLjwvcD4KKworPHA+RXhwZWN0IHRoZSBuZXh0IHJlbGVhc2UgaW4gYWJvdXQgNiBtb250aHMuPC9wPgorCis8cD48Yj5EZWNlbWJlciAxMiwgMjAwNzwvYj4gLSBVcGRhdGVkIHRoZSBsaXN0IG9mIGltcGxlbWVudGVkIGFwcGxpY2F0aW9ucywKK3B1dCB1cCBhIDxhIGhyZWY9dG9kby50eHQ+dG9kbyBsaXN0PC9hPiBhbmQgPGEgaHJlZj1jb2RlLmh0bWw+aW5mcmFzdHJ1Y3R1cmUKK2RvY3VtZW50YXRpb248L2E+LiAgRXhwZWN0IGFub3RoZXIgcmVsZWFzZSB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIG1vbnRoLjwvcD4KKworPHA+PGI+SnVuZSAxOCwgMjAwNzwvYj4gLSBQdXQgb3V0Cis8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4wLjMudGFyLmJ6Mj50b3lib3gtMC4wLjMudGFyLmJ6MjwvYT4gc2luY2UgaXQncworYmVlbiB0b28gbG9uZyBzaW5jZSBJIGRpZCBzb21ldGhpbmcgbGlrZSB0aGF0LiAgVGhpcyBvbmUgaW1wbGVtZW50cworY2F0diwgY291bnQsIGRmLCBlY2hvLCBmYWxzZSwgb25laXQsIHB3ZCwgc2xlZXAsIHN5bmMsIHRveXNoLCB0cnVlLCB3aGljaCwKK2FuZCB5ZXMgKHdoaWNoIGlzIHdoYXQgIm1ha2UgZGVmY29uZmlnIiBlbmFibGVzKS4gIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyCitjb21tYW5kcyBub3QgZW5hYmxlZCBieSBkZWZjb25maWcsIGJlY2F1c2UgdGhleSBkb24ndCByZWFsbHkgd29yayB5ZXQuPC9wPgorCis8cD5Nb3N0IG9mIHRoZSBnZW5lcmFsIGluZnJhc3RydWN0dXJlJ3MgdGhlcmUgbm93LCBhbHRob3VnaCBsb3RzIG9mIHR3ZWFraW5nCithbmQgb3B0aW1pemluZyBpcyBzdGlsbCBuZWVkZWQuICBUaGUgdGVzdCBzdWl0ZSBpcyBza2VsZXRhbCBhbmQgbm90IGVudGlyZWx5CitjaGVja2VkIGluIHlldCwgYnV0IEknbSB3b3JraW5nIG9uIHRoYXQuPC9wPgorCis8cD5JIGRvbid0IGhhdmUgbmVhcmx5IGFzIG11Y2ggdGltZSB0byB3b3JrIG9uIHRoaXMgYXMgSSdkIGxpa2UsIGJ1dCBJJ20gbWFraW5nCithIGxpdHRsZSBwcm9ncmVzcy48L3A+CisKKzxwPjxiPkphbnVhcnkgMzEsIDIwMDc8L2I+IC0KK1RveWJveCA8YSBocmVmPWRvd25sb2Fkcy90b3lib3gtMC4wLjIudGFyLmJ6Mj4wLjAuMiByZWxlYXNlPC9hPi4KK0ltcGxlbWVudHMgY291bnQsIHllcywgcHdkLCBlY2hvLCBiemNhdCwgY2F0diwgb25laXQsIGFuZCBhbiB1bmZpbmlzaGVkCitza2VsZXRvbiBvZiBta2UyZnMuICBBZGRzIGFyZ3VtZW50IHBhcnNpbmcgbG9naWMgYW5kIGJ1bnppcCBjb2RlIHRvIGxpYnJhcnkuCitOb3cgY29uZmlndXJlZCB3aXRoIG1lbnVjb25maWcuICBBZGRzICJtYWtlIGJhc2VsaW5lIiBhbmQgIm1ha2UgYmxvYXRjaGVjayIKK3VzaW5nIE1hdHQgTWFja2FsbCdzIGJsb2F0LW8tbWV0ZXIsIGFuZCBzY3JpcHRzL3Nob3dhc20uPC9wPgorCis8cD5TY3Jld2luZyB1cCB0aGUgd2ViIHBhZ2UgYSBiaXQsIGFkZGluZyBhbiBpbmRleCBiYXIgYWxvbmcgdGhlIHNpZGUKK3doaWNoIGRvZXNuJ3QgcHJvcGVybHkgY29ubmVjdCB1cCB0byBhbnl0aGluZyB5ZXQuICAoQnVzeSBpbXBsZW1lbnRpbmcKK21rZTJmcyBhbmQgZ2VuZTJmcy4pPC9wPgorCis8cD48Yj5PY3RvYmVyIDMwLCAyMDA2PC9iPiAtCitUb3lib3ggPGEgaHJlZj1kb3dubG9hZHMvdG95Ym94LTAuMC4xLnRhci5iejI+MC4wLjEgcmVsZWFzZTwvYT4uICBJbXBsZW1lbnRzCitkZiwgYSBza2VsZXRhbCB0b3lzaCwgYW5kIHNvbWUgbGlicmFyeSBmdW5jdGlvbnMuICBQcm9vZiBvZiBjb25jZXB0LCByZWFsbHkuPC9wPgorCis8cD48Yj5TZXB0ZW1iZXIgNywgMjAwNjwvYj4gLQorUHJvamVjdCBsYXVuY2hlZCwgZmlyc3QgY29tbWl0IHRvIG1lcmN1cmlhbCBhcmNoaXZlLjwvcD4KKworPCEtLSNpbmNsdWRlIGZpbGU9ImZvb3Rlci5odG1sIiAtLT4KZGlmZiAtLWdpdCBhL3RveWJveC93d3cvcm9hZG1hcC5odG1sIGIvdG95Ym94L3d3dy9yb2FkbWFwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGNkYWZiMAotLS0gL2Rldi9udWxsCisrKyBiL3RveWJveC93d3cvcm9hZG1hcC5odG1sCkBAIC0wLDAgKzEsOTk3IEBACis8aHRtbD48aGVhZD48dGl0bGU+dG95Ym94IHJvYWRtYXA8L3RpdGxlPgorPCEtLSNpbmNsdWRlIGZpbGU9ImhlYWRlci5odG1sIiAtLT4KKzx0aXRsZT5Ub3lib3ggUm9hZG1hcDwvdGl0bGU+CisKKzxoMj5Hb2FscyBhbmQgdXNlIGNhc2VzPC9oMj4KKworPHA+V2UgaGF2ZSBzZXZlcmFsIHBvdGVudGlhbCB1c2UgY2FzZXMgZm9yIGEgbmV3IHNldCBvZiBjb21tYW5kIGxpbmUKK3V0aWxpdGllcywgYW5kIGFyZSB1c2luZyB0aG9zZSB0byBkZXRlcm1pbmUgd2hpY2ggY29tbWFuZHMgdG8gaW1wbGVtZW50Citmb3IgVG95Ym94J3MgMS4wIHJlbGVhc2UuPC9wPgorCis8cD5UaGUgbW9zdCBpbnRlcmVzdGluZyBzdGFuZGFyZHMgYXJlIFBPU0lYLTIwMDggKGFsc28ga25vd24gYXMgdGhlIFNpbmdsZQorVW5peCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gNCkgYW5kIHRoZSBMaW51eCBTdGFuZGFyZCBCYXNlICh2ZXJzaW9uIDQuMSkuCitUaGUgbWFpbiB0ZXN0IGhhcm5lc3MgaW5jbHVkaW5nIHRveWJveCBpbiBBYm9yaWdpbmFsIExpbnV4IGFuZCBpZiB0aGF0IGNhbgorYnVpbGQgaXRzZWxmIHVzaW5nIHRoZSByZXN1bHQgdG8gYnVpbGQgTGludXggRnJvbSBTY3JhdGNoICh2ZXJzaW9uIDYuOCkuCitXZSBhbHNvIGFpbSB0byByZXBsYWNlIEFuZHJvaWQncyBUb29sYm94LjwvcD4KKworPHA+QXQgYSBzZWNvbmRhcnkgbGV2ZWwgd2UnZCBsaWtlIHRvIG1lZXQgb3RoZXIgdXNlIGNhc2VzLiBXZSd2ZSBhbmFseXplZAordGhlIGNvbW1hbmRzIHByb3ZpZGVkIGJ5IHNpbWlsYXIgcHJvamVjdHMgKGtsaWJjLCBzYXNoLCBzYmFzZSwgczYsIGVtYnV0aWxzLAorbmFzaCwgYW5kIGJlYXN0aWVib3gpLCBhbG9uZyB3aXRoIHZhcmlvdXMgdmVuZG9yIGNvbmZpZ3VyYXRpb25zIG9mIGJ1c3lib3gsCithbmQgc29tZSBlbmQgdXNlciByZXF1ZXN0cy48L3A+CisKKzxwPkZpbmFsbHksIHdlJ2QgbGlrZSB0byBwcm92aWRlIGEgZ29vZCByZXBsYWNlbWVudCBmb3IgdGhlIEJhc2ggc2hlbGwsCit3aGljaCB3YXMgdGhlIGZpcnN0IHByb2dyYW0gTGludXggZXZlciByYW4gYW5kIHJlbWFpbnMgdGhlIHN0YW5kYXJkIHNoZWxsCitvZiBMaW51eCBubyBtYXR0ZXIgd2hhdCBVYnVudHUgc2F5cy4gVGhpcyBkb2Vzbid0IG1lYW4gaW5jbHVkaW5nIHRoZSBmdWxsCitzZXQgb2YgQmFzaCA0LnggZnVuY3Rpb25hbGl0eSwgYnV0IGRvZXMgaW52b2x2ZSB7dmFyaW91cyxmZWF0dXJlc30gYmV5b25kCitwb3NpeC48L3A+CisKKzxwPlNlZSB0aGUgPGEgaHJlZj1zdGF0dXMuaHRtbD5zdGF0dXMgcGFnZTwvYT4gZm9yIHRoZSBjb21iaW5lZCBsaXN0CithbmQgcHJvZ3Jlc3MgdG93YXJkcyBpbXBsZW1lbnRpbmcgaXQuPC9wPgorCis8dWw+Cis8bGk+PGEgaHJlZj0jc3VzdjQ+UE9TSVgtMjAwOC9TVVN2NDwvYT48L2xpPgorPGxpPjxhIGhyZWY9I3NpZ2g+TGludXggIlN0YW5kYXJkIiBCYXNlPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0jZGV2X2Vudj5EZXZlbG9wbWVudCBFbnZpcm9ubWVudDwvYT48L2xpPgorPGxpPjxhIGhyZWY9I2FuZHJvaWQ+QW5kcm9pZCBUb29sYm94PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0jdGl6ZW4+VGl6ZW4gQ29yZTwvYT48L2xpPgorPGxpPk1pc2NlbGFuZW91czogPGEgaHJlZj0ja2xpYmM+a2xpYmM8L2E+LCA8YSBocmVmPSNnbGliYz5nbGliYzwvYT4sCis8YSBocmVmPSNzYXNoPnNhc2g8L2E+LCA8YSBocmVmPSNzYmFzZT5zYmFzZTwvYT4sIDxhIGhyZWY9I3M2PnM2PC9hPiwKKzxhIGhyZWY9I3VjbGludXg+dWNsaW51eDwvYT4uLi48L2xpPgorPC91bD4KKworPGhyIC8+Cis8YSBuYW1lPSJzdGFuZGFyZHMiPgorPGgyPlVzZSBjYXNlOiBzdGFuZGFyZHMgY29tcGxpYW5jZS48L2gyPgorCis8aDM+PGEgbmFtZT1zdXN2NCAvPjxhIGhyZWY9IiNzdXN2NCI+UE9TSVgtMjAwOC9TVVN2NDwvYT48L2gzPgorPHA+VGhlIGJlc3Qgc3RhbmRhcmRzIGFyZSB0aGUga2luZCB0aGF0IGRlc2NyaWJlIHJlYWxpdHksIHJhdGhlciB0aGFuCithdHRlbXB0aW5nIHRvIGltcG9zZSBhIG5ldyBvbmUuICAoSS5FLiBhIGdvb2Qgc3RhbmRhcmQgc2hvdWxkIGRvY3VtZW50LCBub3QKK2xlZ2lzbGF0ZS4pPC9wPgorCis8cD5UaGUga2luZCBvZiBzdGFuZGFyZHMgd2hpY2ggZGVzY3JpYmUgZXhpc3RpbmcgcmVhbGl0eSB0ZW5kIHRvIGJlIGFwcHJvdmVkIGJ5Cittb3JlIHRoYW4gb25lIHN0YW5kYXJkcyBib2R5LCBzdWNoIEFOU0kgYW5kIElTTyBib3RoIGFwcHJvdmluZyBDLiAgVGhhdCdzIHdoeQordGhlIElFRUUgUE9TSVggY29tbWl0dGVlJ3MgMjAwOCBzdGFuZGFyZCwgdGhlIFNpbmdsZSBVbml4IFNwZWNpZmljYXRpb24gdmVyc2lvbgorNCwgYW5kIHRoZSBPcGVuIEdyb3VwIEJhc2UgU3BlY2lmaWNhdGlvbiBlZGl0aW9uIDcgYXJlIGFsbCB0aGUgc2FtZSBzdGFuZGFyZAorZnJvbSB0aHJlZSBzb3VyY2VzLjwvcD4KKworPHA+VGhlIDxhIGhyZWY9Imh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2lkeC91dGlsaXRpZXMuaHRtbCI+InV0aWxpdGllcyIKK3NlY3Rpb248L2E+CitvZiB0aGVzZSBzdGFuZGFyZHMgaXMgZGV2b3RlZCB0byB0aGUgdW5peCBjb21tYW5kIGxpbmUsIGFuZCBhcmUgdGhlIGJlc3Qgc3VjaAorc3RhbmRhcmQgZm9yIG91ciBwdXJwb3Nlcy4gIChNeSBlYXJsaWVyIHdvcmsgb24gQnVzeUJveCB3YXMgaW1wbGVtZW50ZWQgd2l0aAorcmVnYXJkIHRvIFNVU3YzLCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBzdGFuZGFyZC4pPC9wPgorCis8aDM+UHJvYmxlbXMgd2l0aCB0aGUgc3RhbmRhcmQ8L2gzPgorCis8cD5VbmZvcnR1bmF0ZWx5LCB0aGVzZSBzdGFuZGFyZHMgZGVzY3JpYmUgYSBzdWJzZXQgb2YgcmVhbGl0eSwgbGFja2luZyBhbnkKK21lbnRpb24gb2YgY29tbWFuZHMgc3VjaCBhcyBpbml0LCBsb2dpbiwgb3IgbW91bnQgcmVxdWlyZWQgdG8gYWN0dWFsbHkgYm9vdCBhCitzeXN0ZW0uIEl0IHByb3ZpZGVzIGlwY3JtIGFuZCBpcGNzLCBidXQgbm90IGlwY21rLCBzbyB5b3UgY2FuIHVzZSBTeXN0ZW0gViBJUEMKK3Jlc291cmNlcyBidXQgbm90IGNyZWF0ZSB0aGVtLjwvcD4KKworPHA+VGhlc2Ugc3RhbmRhcmRzIGFsc28gY29udGFpbiBhIGxhcmdlIG51bWJlciBvZiBjb21tYW5kcyB0aGF0IGFyZQoraW5hcHByb3ByaWF0ZSBmb3IgdG95Ym94IHRvIGltcGxlbWVudCBpbiBpdHMgMS4wIHJlbGVhc2UuICAoUGVyaGFwcyBzb21lIG9mCit0aGVzZSBjb3VsZCBiZSByZWludHJvZHVjZWQgaW4gbGF0ZXIgcmVsZWFzZXMsIGJ1dCBub3Qgbm93Lik8L3A+CisKKzxwPlN0YXJ0aW5nIHdpdGggdGhlIGZ1bGwgInV0aWxpdGllcyIgbGlzdCwgd2UgZmlyc3QgcmVtb3ZlIGdlbmVyYWxseSBvYnNvbGV0ZQorY29tbWFuZHMgKGNvbXBlc3MgZWQgZXggcHIgdW5jb21wcmVzcyB1Y2NwIHV1c3RhdCB1dXgpLCBjb21tYW5kcyBmb3IgdGhlCitwcmUtQ1ZTICJTQ0NTIiBzb3VyY2UgY29udHJvbCBzeXN0ZW0gKGFkbWluIGRlbHRhIGdldCBwcnMgcm1kZWwgc2FjdCBzY2NzIHVuZ2V0Cit2YWwgd2hhdCksIGZvcnRyYW4gc3VwcG9ydCAoYXNhIGZvcnQ3NyksIGFuZCBiYXRjaCBwcm9jZXNzaW5nIHN1cHBvcnQgKGJhdGNoCitxYWx0ZXIgcWRlbCBxaG9sZCBxbW92ZSBxbXNnIHFyZXJ1biBxcmxzIHFzZWxlY3QgcXNpZyBxc3RhdCBxc3ViKS48L3A+CisKKzxwPlNvbWUgY29tbWFuZHMgYXJlIGZvciBhIGNvbXBpbGVyIHRvb2xjaGFpbiAoYXIgYzk5IGNmbG93IGN0YWdzIGN4cmVmIGdlbmNhdAoraWNvbnYgbGV4IG00IG1ha2Ugbm0gc3RyaW5ncyBzdHJpcCB0c29ydCB5YWNjKSwgd2hpY2ggaXMgb3V0c2lkZSBvZiB0b3lib3gncworbWFuZGF0ZSBhbmQgc2hvdWxkIGJlIHN1cHBsaWVkIGV4dGVybmFsbHkuICAoQWdhaW4sIHNvbWUgb2YgdGhlc2UgbWF5IGJlCityZXZpc2l0ZWQgbGF0ZXIsIGJ1dCBub3QgZm9yIHRveWJveCAxLjAuKTwvcD4KKworPHA+U29tZSBjb21tYW5kcyBhcmUgcGFydCBvZiBhIGNvbW1hbmQgc2hlbGwsIGFuZCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgYXMKK3NlcGFyYXRlIGV4ZWN1dGFibGVzIChhbGlhcyBiZyBjZCBjb21tYW5kIGZjIGZnIGdldG9wdHMgaGFzaCBqb2JzIGtpbGwgcmVhZAordHlwZSB1bGltaXQgdW1hc2sgdW5hbGlhcyB3YWl0KS4gIFRoZXNlIG1heSBiZSByZXZpc2l0ZWQgYXMgcGFydCBvZiBhIGJ1aWx0LWluCit0b3lib3ggc2hlbGwsIGJ1dCBhcmUgbm90IGV4cG9ydGVkIGludG8gJFBBVEggdmlhIHN5bWxpbmtzLiAgKElmIHlvdSBmb3JrIGEKK2NoaWxkIHByb2Nlc3MgYW5kIGhhdmUgaXQgImNkIiB0aGVuIGV4aXQsIHlvdSd2ZSBhY2NvbXBsaXNoZWQgbm90aGluZy4KK1RoaXMgaXMgbm90IGEgY29tcGxldGUgbGlzdCwgYSBzaGVsbCBhbHNvIG5lZWRzIGV4aXQsIGlmLCB3aGlsZSwgZm9yLCBjYXNlLAorZXhwb3J0LCBzZXQsIHVuc2V0LCB0cmFwLCBleGVjLi4uIEFuZCBmb3IgYmFzaCBjb21wYXRhYmlsaXR5LCBmdW5jdGlvbiBhbmQKK3NvdXJjZS4pPC9wPgorCis8YmxvY2txdW90ZT48Yj4KKzxzcGFuIGlkPXNoZWxsPgorYWxpYXMgYmcgY2QgY29tbWFuZCBmYyBmZyBnZXRvcHRzIGhhc2ggam9icyBraWxsIHJlYWQgdHlwZSB1bGltaXQgdW1hc2sKK3VuYWxpYXMgd2FpdCBleGl0IGlmIHdoaWxlIGZvciBjYXNlIGV4cG9ydCBzZXQgdW5zZXQgdHJhcCBleGVjIGZ1bmN0aW9uIHNvdXJjZQorPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+QSBmZXcgb3RoZXIgY29tbWFuZHMgYXJlIGp1ZGdlbWVudCBjYWxscywgcHJvdmlkaW5nIGNvbW1hbmQtbGluZQoraW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCAoaWNvbnYgbG9jYWxlIGxvY2FsZWRlZiksIFN5c3RlbSBWIGludGVyLXByb2Nlc3MKK2NvbW11bmljYXRpb24gKGlwY3JtIGlwY3MpLCBhbmQgY3Jvc3MtdHR5IGNvbW11bmljYXRpb24gZnJvbSB0aGUgbWluaWNvbXB1dGVyCitkYXlzICh0YWxrIG1lc2cgd3JpdGUpLiAgVGhlICJwYXgiIHV0aWxpdHkgd2FzIHN1cHBsYW50ZWQgYnkgdGFyLCAibWFpbHgiIGlzCithIGNvbW1hbmQgbGluZSBlbWFpbCBjbGllbnQsIGFuZCAibHAiIHN1Ym1pdHMgZmlsZXMgZm9yIHByaW50aW5nIHRvLi4uIHdoYXQKK2V4YWN0bHk/ICAoY3Vwcz8pICBUaGUgc3RhbmRhcmQgZGVmaW5lcyBjcm9udGFiIGJ1dCBub3QgY3JvbmQuPC9wPgorCis8cD5SZW1vdmluZyBhbGwgb2YgdGhhdCBsZWF2ZXMgdGhlIGZvbGxvd2luZyBjb21tYW5kcywgd2hpY2ggdG95Ym94IHNob3VsZAoraW1wbGVtZW50OjwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD1wb3NpeD4KK2F0IGF3ayBiYXNlbmFtZSBiYyBjYWwgY2F0IGNoZ3JwIGNobW9kIGNob3duIGNrc3VtIGNtcCBjb21tIGNwCitjc3BsaXQgY3V0IGRhdGUgZGQgZGYgZGlmZiBkaXJuYW1lIGR1IGVjaG8gZW52IGV4cGFuZCBleHByIGZhbHNlIGZpbGUgZmluZAorZm9sZCBmdXNlciBnZXRjb25mIGdyZXAgaGVhZCBpZCBqb2luIGtpbGwgbGluayBsbiBsb2dnZXIgbG9nbmFtZSBscyBtYW4KK21rZGlyIG1rZmlmbyBtb3JlIG12IG5ld2dycCBuaWNlIG5sIG5vaHVwIG9kIHBhc3RlIHBhdGNoIHBhdGhjaGsgcHJpbnRmIHBzCitwd2QgcmVuaWNlIHJtIHJtZGlyIHNlZCBzaCBzbGVlcCBzb3J0IHNwbGl0IHN0dHkgdGFicyB0YWlsIHRlZSB0ZXN0IHRpbWUKK3RvdWNoIHRwdXQgdHIgdHJ1ZSB0dHkgdW5hbWUgdW5leHBhbmQgdW5pcSB1bmxpbmsgdXVkZWNvZGUgdXVlbmNvZGUgdmkgd2MKK3dobyB4YXJncyB6Y2F0Cis8L3NwYW4+Cis8L2I+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT1zaWdoIC8+PGEgaHJlZj0iI3NpZ2giPkxpbnV4IFN0YW5kYXJkIEJhc2U8L2E+PC9oMz4KKworPHA+T25lIGF0dGVtcHQgdG8gc3VwcGxlbWVudCBQT1NJWCB0b3dhcmRzIGFuIGFjdHVhbCB1c2FibGUgc3lzdGVtIHdhcyB0aGUKK0xpbnV4IFN0YW5kYXJkIEJhc2UuIFVuZm9ydHVuYXRlbHksIHRoZSBxdWFsaXR5IG9mIHRoaXMgInN0YW5kYXJkIiBpcworZmFpcmx5IGxvdy48L3A+CisKKzxwPlBPU0lYIGFsbG93ZWQgaXRzIHN0YW5kYXJkcyBwcm9jZXNzIHRvIGJlIGNvbXByb21pc2VkCitieSBsZWF2aW5nIHRoaW5ncyBvdXQsIHRodXMgYWxsb3dpbmcgSUJNIG1haW5mcmFtZXMgYW5kIFdpbmRvd3MgTlQgdG8gZHJpdmUKK2EgdHJ1Y2sgdGhyb3VnaCB0aGUgaG9sZXMgYW5kIGRlY2xhcmUgdGhlbXNlbHZlcyBjb21waWxhbnQuIEJ1dCBpdCBtZWFucyB3aGF0Cit0aGV5IERJRCBzdGFuZGFyZGl6ZSB0ZW5kcyB0byBiZSByZXNwZWN0ZWQgKGlmIHNvbWV0aW1lcyBvYnNvbGV0ZSkuPC9wPgorCis8cD5UaGUgTGludXggU3RhbmRhcmQgQmFzZSdzIGZhaWx1cmUgbW9kZSBpcyBkaWZmZXJlbnQsIHRoZXkgcmVzcG9uZCB0bworcHJlc3N1cmUgYnkgaW5jbHVkaW5nIHNwZWNpYWwtY2FzZSBjcmFwLCBzdWNoIGFzIGFsbG93aW5nIFJlZCBIYXQgdG8gc2hvZWhvcm4KK1JQTSBpbnRvIHRoZSBzdGFuZGFyZCBldmVuIHRob3VnaCBhbGwgc29ydHMgb2YgZGlzdHJvcyAoRGViaWFuLCBTbGFja3dhcmUsIEFyY2gsCitHZW50b28pIGRvbid0IHVzZSBpdCBhbmQgcHJvYmFibHkgbmV2ZXIgd2lsbC4gVGhpcyBtZWFucyBhbnl0aGluZyBpbiB0aGUgTFNCIGlzCithdCBiZXN0IGEgc3VnZ2VzdGlvbjogYXJiaXRyYXJ5IHBvcnRpb25zIG9mIHRoaXMgc3RhbmRhcmQgYXJlIHdpZGVseQoraWdub3JlZC48L3A+CisKKzxwPlRoZSBjb21tdW5pdHkgcGVyY2VwdGlvbiBzZWVtcyB0byBiZSB0aGF0IHRoZSBMaW51eCBTdGFuZGFyZCBCYXNlIGlzCit0aGUgYmVzdCBzdGFuZGFyZCBtb25leSBjYW4gYnV5LCBJLkUuIHRoZSBMaW51eCBGb3VuZGF0aW9uIGlzIHN1cHBvcnRlZCBieQorZmluYW5jaWFsIGRvbmF0aW9ucyBmb3JtIGxhcmdlIGNvbXBhbmllcyBhbmQgdGhlIExTQiByZXByZXNlbnRzIHRoZSBpbnRlcmVzdHMKK29mIHRob3NlIGRvbm9ycyBtb3JlIHRoYW4gdGVjaG5pY2FsIG1lcml0LiBEZWJpYW4gb2ZmaWNpYWxseQorPGEgaHJlZj1odHRwOi8vbHduLm5ldC9BcnRpY2xlcy82NTg4MDk+d2FzaGVkIGl0cyBoYW5kcyBvZiBMU0I8L2E+IHdoZW4gNS4wCitjYW1lIG91dCBpbiAyMDE1LCBhbmQgbm8gbG9uZ2VyIGV2ZW4gcHJldGVuZHMgdG8gc3VwcG9ydCBpdCAod2hpY2ggbWF5IGFmZmVjdAorRGViaWFuIGRlcml2YXRpdmVzIGxpa2UgVWJ1bnR1IGFuZCBLbm9wcGl4KS4gVG95Ym94IGhhc24ndCBtb3ZlZCB0byA1LjAgZm9yCitzaW1pbGFyIHJlYXNvbnMuPC9wPgorCis8cD5UaGF0IHNhaWQsIFBvc2l4IGJ5IGl0c2VsZiBpc24ndCBlbm91Z2gsIGFuZCB0aGlzIGlzIHRoZSBuZXh0IG1vc3QKK2NvbXByZWhlbnNpdmUgc3RhbmRhcmRzIGVmZm9ydCBmb3IgTGludXggc28gZmFyLjwvcD4KKworPHA+VGhlIExTQiBzcGVjaWZpZXMgYSA8YSBocmVmPWh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvY21kYmVoYXYuaHRtbD5saXN0IG9mIGNvbW1hbmQgbGluZQordXRpbGl0aWVzPC9hPjo8L3A+CisKKzxibG9ja3F1b3RlPjxiPgorYXIgYXQgYXdrIGJhdGNoIGJjIGNoZm4gY2hzaCBjb2wgY3BpbyBjcm9udGFiIGRmIGRtZXNnIGR1IGVjaG8gZWdyZXAgCitmZ3JlcCBmaWxlIGZ1c2VyIGdldHRleHQgZ3JlcCBncm91cGFkZCBncm91cGRlbCBncm91cG1vZCBncm91cHMgCitndW56aXAgZ3ppcCBob3N0bmFtZSBpbnN0YWxsIGluc3RhbGxfaW5pdGQgaXBjcm0gaXBjcyBraWxsYWxsIGxwciBscyAKK2xzYl9yZWxlYXNlIG00IG1kNXN1bSBta25vZCBta3RlbXAgbW9yZSBtb3VudCBtc2dmbXQgbmV3Z3JwIG9kIHBhc3N3ZCAKK3BhdGNoIHBpZG9mIHJlbW92ZV9pbml0ZCByZW5pY2Ugc2VkIHNlbmRtYWlsIHNlcSBzaCBzaHV0ZG93biBzdSBzeW5jIAordGFyIHVtb3VudCB1c2VyYWRkIHVzZXJkZWwgdXNlcm1vZCB4YXJncyB6Y2F0Cis8L2I+PC9ibG9ja3F1b3RlPgorCis8cD5XaGVyZSBwb3NpeCBzcGVjaWZpZXMgb25lIG9mIHRob3NlIGNvbW1hbmRzLCBMU0IncyBkZWx0YXMgdGVuZCB0byBiZQorYWNjb21vZGF0aW9ucyBmb3IgYnJva2VuIHRvb2wgdmVyc2lvbnMgd2hpY2ggYXJlbid0IHVwIHRvIGRhdGUgd2l0aCB0aGUKK3N0YW5kYXJkIHlldC4gKFNlZSA8YSBocmVmPWh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvbW9yZS5odG1sPm1vcmU8L2E+IGFuZCA8YSBocmVmPWh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0xTQl80LjEuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMveGFyZ3MuaHRtbD54YXJnczwvYT4KK2ZvciBleGFtcGxlcy4pPC9wPgorCis8cD5TaW5jZSB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCB0byB1c2luZyBvdXIgb3duIGp1ZGdlbWVudCB0byBza2lwIGJpdHMgb2YKK1BPU0lYLCBhbmQgTFNCJ3MgImp1ZGdlbWVudCIgaW4gdGhpcyByZWdhcmQgaXMgcHVyZWx5IGJ1ZyB3b3JrYXJvdW5kcyB0byBkZWNsYXJlCit2YXJpb3VzIGxlZ2FjeSB0b29sIGltcGxlbWVudGF0aW9ucyAiY29tcGxpYW50IiwgdGhpcyBtZWFucyB3ZSdyZSBtb3N0bHkKK2ludGVyZXN0ZWQgaW4gdGhlIHNldCBvZiB0b29scyB0aGF0IGFyZW4ndCBzcGVjaWZpZWQgaW4gcG9zaXggYXQgYWxsLjwvcD4KKworPHA+T2YgdGhlc2UsIGdldHRleHQgYW5kIG1zZ2ZtdCBhcmUgaW50ZXJuYXRpb25hbGl6YXRpb24sIGluc3RhbGxfaW5pdGQgYW5kCityZW1vdmVfaW5pdGQgYXJlbid0IHByZXNlbnQgb24gdWJ1bnR1IDEwLjA0LCBscHIgaXMgb3V0IG9mIHNjb3BlLCBhbmQKK2xzYl9yZWxlYXNlIGlzIGEgZGlzdHJvIGlzc3VlIChpdCdzIGEgbmljZSBjb21tYW5kLCBidXQgdGhlIG91dHB1dCBvZgorbHNiX3JlbGVhc2UgLWEgaXMgdGhlIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaW51eCBkaXN0cm8geW91J3JlCitydW5uaW5nLCB3aGljaCB0b3lib3ggZG9lc24ndCBrbm93KS48L3A+CisKKzxwPlRoaXMgbGVhdmVzOjwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD1sc2I+CitjaGZuIGNoc2ggZG1lc2cgZWdyZXAgZmdyZXAgZ3JvdXBhZGQgZ3JvdXBkZWwgZ3JvdXBtb2QgZ3JvdXBzCitndW56aXAgZ3ppcCBob3N0bmFtZSBpbnN0YWxsIGtpbGxhbGwgbWQ1c3VtCitta25vZCBta3RlbXAgbW91bnQgcGFzc3dkIHBpZG9mIHNlbmRtYWlsIHNlcSBzaHV0ZG93bgorc3Ugc3luYyB0YXIgdW1vdW50IHVzZXJhZGQgdXNlcmRlbCB1c2VybW9kIHpjYXQKKzwvc3Bhbj4KKzwvYj48L2Jsb2NrcXVvdGU+CisKKzxociAvPgorPGEgbmFtZT0iZGV2X2VudiI+Cis8aDI+PGEgaHJlZj0iI2Rldl9lbnYiPlVzZSBjYXNlOiBwcm92aWRlIGEgc2VsZi1ob3N0aW5nIGRldmVsb3BtZW50IGVudmlyb25tZW50PC9hPjwvaDI+CisKKzxwPlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGVub3VnaCB0byBidWlsZCB0aGUgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9hYm91dC5odG1sPkFib3JpZ2luYWwgTGludXg8L2E+IGRldmVsb3BtZW50CitlbnZpcm9ubWVudCwgYm9vdCBpdCB0byBhIHNoZWxsIHByb21wdCwgYW5kIGJ1aWxkIDxhIGhyZWY9aHR0cDovL3d3dy5saW51eGZyb21zY3JhdGNoLm9yZy9sZnMvdmlldy82LjgvPkxpbnV4IEZyb20gU2NyYXRjaCA2Ljg8L2E+IHVuZGVyCitpdC4gKEFib3JpZ2luYWwgTGludXggPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9oaXN0b3J5Lmh0bWw+Y3VycmVudGx5IHVzZXM8L2E+IEJ1c3lCb3ggZm9yIHRoaXMsIHRodXMgcHJvdmlkaW5nIGEKK2Ryb3AtaW4gdGVzdCBlbnZpcm9ubWVudCBmb3IgdG95Ym94LiBXZSBpbnN0YWxsIGJvdGggaW1wbGVtZW50YXRpb25zIHNpZGUKK2J5IHNpZGUsIHJlZGlyZWN0aW5nIHRoZSBzeW1saW5rcyBhIGNvbW1hbmQgYXQgYSB0aW1lIHVudGlsIHRoZSBvbGRlcgorcGFja2FnZSBpcyBubyBsb25nZXIgdXNlZCwgYW5kIGNhbiBiZSByZW1vdmVkLik8L3A+CisKKzxwPlRoaXMgdXNlIGNhc2UgaW5jbHVkZXMgcnVubmluZyBpbml0IHNjcmlwdHMgYW5kIG90aGVyIHNoZWxsIHNjcmlwdHMsIHJ1bm5pbmcKK2NvbmZpZ3VyZSwgbWFrZSwgYW5kIGluc3RhbGwgaW4gZWFjaCBwYWNrYWdlLCBhbmQgcHJvdmlkaW5nIGJhc2ljIGNvbW1hbmQgbGluZQorZmFjaWxpdGllcyBzdWNoIGFzIGEgdGV4dCBlZGl0b3IuIChJdCBkb2VzIG5vdCBpbmNsdWRlIGEgY29tcGlsZXIgdG9vbGNoYWluIG9yCitDIGxpYnJhcnksIHRob3NlIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIHByb2plY3QuKTwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD1kZXZlbG9wbWVudD4KK2J6Y2F0IGNhdCBjcCBkaXJuYW1lIGVjaG8gZW52IHBhdGNoIHJtZGlyIHNoYTFzdW0gc2xlZXAgc29ydCBzeW5jCit0cnVlIHVuYW1lIHdjIHdoaWNoIHllcyB6Y2F0Cithd2sgYmFzZW5hbWUgY2htb2QgY2hvd24gY21wIGN1dCBkYXRlIGRkIGRpZmYKK2VncmVwIGV4cHIgZmRpc2sgZmluZCBncmVwIGd6aXAgaGVhZCBob3N0bmFtZSBpZCBpbnN0YWxsIGxuIGxzCitta2RpciBta3RlbXAgbXYgb2QgcmVhZGxpbmsgcm0gc2VkIHNoIHRhaWwgdGFyIHRvdWNoIHRyIHVuaXEKK3dnZXQgd2hvYW1pIHhhcmdzIGNoZ3JwIGNvbW0gZ3VuemlwIGxlc3MgbG9nbmFtZSBzcGxpdAordGVlIHRlc3QgdGltZSBidW56aXAyIGNoZ3JwIGNocm9vdCBjb21tIGNwaW8gZG1lc2cKK2Ruc2RvbWFpbm5hbWUgZnRwZCBmdHBnZXQgZnRwcHV0IGd1bnppcCBpZmNvbmZpZyBpbml0IGxlc3MKK2xvZ25hbWUgbG9zZXR1cCBtZGV2IG1vdW50IG1vdW50cG9pbnQgbmMgcGdyZXAgcGtpbGwgCitwd2Qgcm91dGUgc3BsaXQgc3RhdCBzd2l0Y2hfcm9vdCB0YWMgdW1vdW50IHZpCityZXNpemUyZnMgdHVuZTJmcyBmc2NrLmV4dDIgZ2VuZXh0MmZzIG1rZTJmcyB4emNhdAorPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+Tm90ZTogQWJvcmlnaW5hbCBMaW51eCBpbnN0YWxscyBiYXNoIDIuMDViIGFzICMhL2Jpbi9zaCBhbmQgaXRzIHNjcmlwdHMKK3JlcXVpcmUgYmFzaCBleHRlbnNpb25zIG5vdCBwcmVzZW50IGluIHNoZWxscyBzdWNoIGFzIGJ1c3lib3ggYXNoLgorVGhpcyBtZWFucyB0aGF0IHRveXNoIG5lZWRzIHRvIHN1cHBseSBzZXZlcmFsIGJhc2ggZXh0ZW5zaW9ucyBfYW5kXyB3b3JrCit3aGVuIGNhbGxlZCB1bmRlciB0aGUgbmFtZSAiYmFzaCIuPC9wPgorCis8cD5UaGUgPGEgaHJlZj1odHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbD5BYm9yaWdpbmFsIExpbnV4PC9hPgorc2VsZi1ib290c3RyYXBwaW5nIGJ1aWxkIHN0aWxsIHVzZXMgdGhlIGZvbGxvd2luZyBidXN5Ym94IGNvbW1hbmRzLAorbm90IHlldCBzdXBwbGllZCBieSB0b3lib3g6PC9wPgorCis8YmxvY2txdW90ZT48cD4KK2F3ayBidW56aXAyIGJ6Y2F0IGRkIGRpZmYgZXhwciBmZGlzayBmdHBkIGZ0cGdldAorZnRwcHV0IGd1bnppcCBnemlwIGxlc3MgcGluZyByb3V0ZSBzaAorc2hhNTEyc3VtIHRhciB0ZXN0IHRyIHVueHogdmkgd2dldCB4emNhdCB6Y2F0Cis8L3A+PC9ibG9ja3F1b3RlPgorCis8cD5NYW55IG9mIHRob3NlIGFyZSBpbiAicGVuZGluZyIuIFRoZSByZW1haW5pbmcgImRpZmZpY3VsdCIKK2NvbW1hbmRzIGFyZSB2aSwgYXdrLCBhbmQgc2guPC9wPgorCis8cD5CdWlsZGluZyBMaW51eCBGcm9tIFNjcmF0Y2ggaXMgbm90IHRoZSBzYW1lIGFzIGJ1aWxkaW5nIHRoZQorPGEgaHJlZj1odHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbT5BbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Q8L2E+LAorYnV0IGFmdGVyIHRveWJveCAxLjAgZm9jdXMgbWF5IHNoaWZ0IHRvIDxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYWJvdXQuaHRtbCNoYWlyYmFsbD5tb2RpZnlpbmcgdGhlIEFPU1AgYnVpbGQ8L2E+Cit0byByZWR1Y2UgZGVwZW5kZW5jaWVzLiAoSXQncyBmYWlybHkgbGlrZWx5IHdlJ2xsIGhhdmUgdG8gYWRkIGF0IGxlYXN0CithIHJlYWQtb25seSBnaXQgdXRpbGl0eSBzbyByZXBvIGNhbiBkb3dubG9hZCB0aGUgYnVpbGQncyBzb3VyY2UgY29kZSwKK2J1dCB0aGF0J3MgYWN0dWFsbHkgPGEgaHJlZj1odHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVA3bjZHMklMNmVvPm5vdAordGhhdCBoYXJkPC9hPi4gV2UnbGwgcHJvYmFibHkgYWxzbyBuZWVkIG91ciBvd24gIm1ha2UiIGF0IHNvbWUgcG9pbnQgYWZ0ZXIKKzEuMC4pPC9wPgorCis8aHIgLz4KKzxoMj48YSBuYW1lPWFuZHJvaWQgLz48YSBocmVmPSIjYW5kcm9pZCI+VXNlIGNhc2U6IFJlcGxhY2luZyBBbmRyb2lkIFRvb2xib3g8L2E+PC9oMj4KKworPHA+QW5kcm9pZCBoYXMgYSBwb2xpY3kgYWdhaW5zdCBHUEwgaW4gdXNlcnNwYWNlLCBzbyBldmVuIHRob3VnaCBCdXN5Qm94CitwcmVkYXRlcyBBbmRyb2lkIGJ5IG1hbnkgeWVhcnMsIHRoZXkgY291bGRuJ3QgdXNlIGl0LiBJbnN0ZWFkIHRoZXkgZ3JhYmJlZAorYW4gb2xkIHZlcnNpb24gb2YgYXNoIGFuZCBpbXBsZW1lbnRlZCB0aGVpciBvd24gY29tbWFuZCBsaW5lIHV0aWxpdHkgc2V0CitjYWxsZWQgInRvb2xib3giLiBhc2ggd2FzIGxhdGVyIHJlcGxhY2VkIGJ5Cis8YSBocmVmPSJodHRwczovL3d3dy5taXJic2Qub3JnL21rc2guaHRtIj5ta3NoPC9hPjsgdG9vbGJveCBpcyBiZWluZworcmVwbGFjZWQgYnkgdG95Ym94LjwvcD4KKworPHA+VG9vbGJveCBkb2Vzbid0IGhhdmUgaXRzIG93biByZXBvc2l0b3J5LCBpbnN0ZWFkIGl0J3MgcGFydCBvZiBBbmRyb2lkJ3MKKzxhIGhyZWY9aHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2NvcmU+c3lzdGVtL2NvcmUKK2dpdCByZXBvc2l0b3J5PC9hPi48L3A+CisKKzxoMz5Ub29sYm94IGNvbW1hbmRzOjwvaDM+CisKKzxwPkFjY29yZGluZyB0byA8YSBocmVmPWh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9jb3JlLysvbWFzdGVyL3Rvb2xib3gvQW5kcm9pZC5taz4KK3N5c3RlbS9jb3JlL3Rvb2xib3gvQW5kcm9pZC5tazwvYT4gdGhlIHRvb2xib3ggZGlyZWN0b3J5IGJ1aWxkcyB0aGUKK2ZvbGxvd2luZyBjb21tYW5kczo8L3A+CisKKzxibG9ja3F1b3RlPjxiPgorZGQgZ2V0ZXZlbnQgbmV3ZnNfbXNkb3MKKzwvYj48L2Jsb2NrcXVvdGU+CisKKzxwPlRoZSB0b29sYm94IG1ha2VmaWxlIGFsc28gYnVpbGRzIHRoZSBCU0QgZ3JlcCByaWdodCBub3csIGJlY2F1c2UgdG95Ym94CitncmVwIGlzIG1pc3NpbmcgPGNvZGU+LS1jb2xvcjwvY29kZT4uPC9wPgorCis8aDM+T3RoZXIgQW5kcm9pZCBjb3JlIGNvbW1hbmRzPC9oMz4KKworPHA+T3RoZXIgdGhhbiB0aGUgdG9vbGJveCBkaXJlY3RvcnksIHRoZSBjdXJyZW50bHkgaW50ZXJlc3RpbmcKK3N1YmRpcmVjdG9yaWVzIGluIHRoZSBjb3JlIHJlcG9zaXRvcnkgYXJlIGluaXQsCitsb2djYXQsIGxvZ3dyYXBwZXIsIHJlYm9vdCwgYW5kIHJ1bi1hcy48L3A+CisKKzx1bD4KKzxsaT48Yj5pbml0PC9iPiAtIEFuZHJvaWQncyBQSUQgMTwvbGk+Cis8bGk+PGI+bG9nY2F0PC9iPiAtIHJlYWQgYW5kcm9pZCBsb2cgZm9ybWF0PC9saT4KKzxsaT48Yj5sb2d3cmFwcGVyPC9iPiAtIHJlZGlyZWN0IHN0ZGlvIHRvIGFuZHJvaWQgbG9nPC9saT4KKzxsaT48Yj5yZWJvb3Q8L2I+IC0gQW5kcm9pZCdzIHJlYm9vdCgxKTwvbGk+Cis8bGk+PGI+cnVuLWFzPC9iPiAtIHN1YnNldCBvZiBzdWRvPC9saT4KKzwvdWw+CisKKzxwPkFsbW9zdCBhbGwgb2YgdGhlc2UgcmVpbnZlbnQgYW4gZXhpc3Rpbmcgd2hlZWwgd2l0aCBsZXNzIGZ1bmN0aW9uYWxpdHkgYW5kIGEKK2RpZmZlcmVudCB1c2VyIGludGVyZmFjZS4gV2UgbWF5IHdhbnQgdG8gcHJvdmlkZSB0aGF0IGludGVyZmFjZSwgYnV0CitpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgY29tbWFuZHMgKGZkaXNrLCBpbml0LCBhbmQgc3VkbykgY29tZSBmaXJzdC48L3A+CisKKzxoMz5BbmFseXNpczwvaDM+CisKKzxwPkZvciByZWZlcmVuY2UsIGNvbWJpbmluZyBldmVyeXRoaW5nIGxpc3RlZCBhYm92ZSwgd2UgZ2V0OjwvcD4KKworPGJsb2NrcXVvdGU+PGI+CitkZCBnZXRldmVudCBpbml0Citsb2djYXQgbG9nd3JhcHBlcgorbmV3ZnNfbXNkb3MgcmVib290IHJ1bi1hcworPC9iPjwvYmxvY2txdW90ZT4KKworPHA+V2UgbWF5IGV2ZW50dWFsbHkgaW1wbGVtZW50IGFsbCBvZiB0aGF0LCBidXQgZm9yIHRveWJveCAxLjAgd2UgbmVlZCB0bworZm9jdXMgYSBiaXQuIEZvciBvdXIgZmlyc3QgcGFzcywgbGV0J3MgZ3JhYiBqdXN0IGxvZ2NhdCBhbmQgbG9nd3JhcHBlcgorZnJvbSB0aGUgImNvcmUiIGNvbW1hbmRzIChzaW5jZSB0aGUgcmVzdCBoYXZlIHNvbWUgZnVsbC9zdGFuZGFyZCB2ZXJzaW9uCitwcm92aWRpbmcgdGhhdCBmdW5jdGlvbmFsaXR5LCB3aGljaCB3ZSBjYW4gaW1wbGVtZW50IGEgc2hpbSBpbnRlcmZhY2UKK2ZvciBsYXRlcikuPC9wPgorCis8cD5UaGlzIG1lYW5zIHRveWJveCBzaG91bGQgaW1wbGVtZW50IChvciBmaW5pc2ggaW1wbGVtZW50aW5nKTo8L3A+Cis8YmxvY2txdW90ZT48Yj4KKzxzcGFuIGlkPXRvb2xib3g+CitkZCBnZXRldmVudCBsb2djYXQgbG9nd3JhcHBlciBuZXdmc19tc2RvcworPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+VXBkYXRlOiBBbmRyb2lkLm1rIGlzIGN1cnJlbnRseSBidWlsZGluZyB0aGUgZm9sbG93aW5nIHRveWJveCBmaWxlcyBvdXQKK29mICJwZW5kaW5nIi4gVGhlc2Ugc2hvdWxkIGJlIGEgcHJpb3JpdHkgZm9yIGNsZWFudXA6PC9wPgorCis8YmxvY2txdW90ZT48Yj4KK2RkIGV4cHIgbHNvZiBtb3JlIHRhciB0ciB0cmFjZXJvdXRlCis8L2I+PC9ibG9ja3F1b3RlPgorCis8cD5BbmRyb2lkIHdpc2hsaXN0OjwvcD4KKworPGJsb2NrcXVvdGU+PGI+CittdG9vbHMgZ2VudmZhdGZzIG1rZTJmcyBnZW5lMmZzCis8L2I+PC9ibG9ja3F1b3RlPgorCis8aHIgLz4KKzxoMj48YSBuYW1lPXRpemVuIC8+PGEgaHJlZj0iI3RpemVuIj5Vc2UgY2FzZTogVGl6ZW4gQ29yZTwvYT48L2gyPgorCis8cD5UaGUgVGl6ZW4gcHJvamVjdCBoYXMgZXhwcmVzc2VkIGEgZGVzaXJlIHRvIGVsaW1pbmF0ZSBHUEx2MyBzb2Z0d2FyZQorZnJvbSBpdHMgY29yZSBzeXN0ZW0sIGFuZCBpcyBpbnN0YWxsaW5nIHRveWJveCBhcworPGEgaHJlZj1odHRwczovL3dpa2kudGl6ZW4ub3JnL3dpa2kvVG95Ym94PnBhcnQgb2YgdGhpcyBwcm9jZXNzPC9hPi48L3A+CisKKzxwPlRoZXkgaGF2ZSBhIGZhaXJseSBsb25nIGxpc3Qgb2YgbmV3IGNvbW1hbmRzIHRoZXknZCBsaWtlIHRvIHNlZSBpbiB0b3lib3g6PC9wPgorCis8YmxvY2txdW90ZT48Yj4KKzxzcGFuIGlkPXRpemVuPgorYXJjaCBiYXNlNjQgdXNlcnMgZGlyIHZkaXIgdW5leHBhbmQgc2hyZWQgam9pbiBjc3BsaXQKK2hvc3RpZCBucHJvYyBydW5jb24gc2hhMjI0c3VtIHNoYTI1NnN1bSBzaGEzODRzdW0gc2hhNTEyc3VtIHNoYTNzdW0gbWtmcy52ZmF0IGZzY2sudmZhdCAKK2Rvc2ZzbGFiZWwgdW5hbWUgc3RkYnVmIHBpbmt5IGRpZmYzIHNkaWZmIHpjbXAgemRpZmYgemVncmVwIHpmZ3JlcCB6bGVzcyB6bW9yZQorPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+SW4gYWRkaXRpb24sIHRoZXknZCBsaWtlIHRvIHVzZSBzZXZlcmFsIGNvbW1hbmRzIGN1cnJlbnRseSBpbiBwZW5kaW5nOjwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD10aXplbj4KK3RhciBkaWZmIHByaW50ZiB3Z2V0IHJzeW5jIGZkaXNrIHZpIGxlc3MgdHIgdGVzdCBzdHR5IGZvbGQgZXhwciBkZAorPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+QWxzbywgdGl6ZW4gdXNlcyBhIGRpZmZlcmVudCBMaW51eCBTZWN1cml0eSBNb2R1bGUgY2FsbGVkIFNNQUNLLCBzbworbWFueSBvZiB0aGUgU0VMaW51eCBvcHRpb25zIGFsYSBscyAtWiBuZWVkIHNtYWNrIGFsdGVybmF0aXZlcyBpbiBhbgoraWYvZWxzZSBzZXR1cC48L3A+CisKKzxociAvPjxhIG5hbWU9a2xpYmMgLz4KKzxoMj5rbGliYzo8L2gyPgorCis8cD5Mb25nIGFnbyBzb21lIGtlcm5lbCBkZXZlbG9wZXJzIGNhbWUgdXAgd2l0aCBhIHByb2plY3QgY2FsbGVkCis8YSBocmVmPWh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvS2xpYmM+a2xpYmM8L2E+LgorQWZ0ZXIgYSBkZWNhZGUgb2YgZGV2ZWxvcG1lbnQgaXQgc3RpbGwgaGFzIG5vIHdlYiBwYWdlIG9yIEhPV1RPLAorYW5kIG5vYm9keSdzIHF1aXRlIHN1cmUgaWYgdGhlIGxpY2Vuc2UgaXMgQlNEIG9yIEdQTC4gSXQgaW5leHBsaWNhYmx5Cis8YSBocmVmPWh0dHA6Ly93d3cuaW5mb3dvcmxkLmNvbS9kL2RhdGEtY2VudGVyL3BlcmwtaXNudC1nb2luZy1hbnl3aGVyZS1iZXR0ZXItb3Itd29yc2UtMjExNTgwPnJlcXVpcmVzIHBlcmwgdG8gYnVpbGQ8L2E+LCBhbmQgc2VlbXMgbGlrZSBhbiBpZGVhbCBjYW5kaWRhdGUgZm9yCityZXBsYWNlbWVudC48L3A+CisKKzxwPkluIGFkZGl0aW9uIHRvIGEgQyBsaWJyYXJ5IGV2ZW4gbGVzcyBjYXBhYmxlIHRoYW4gYmlvbmljIChvYnNvbGV0ZWQgYnkKK211c2wpLCBrbGliYyBidWlsZHMgYSByYW5kb20gYXNzb3J0bWVudCBvZiBleGVjdXRhYmxlcyB0byBydW4gaW5pdCBzY3JpcHRzCit3aXRoLiBUaGVyZSdzIG5vIG11bHRpcGxleGVyIGNvbW1hbmQsIHRoZXNlIGFyZSBpbmRpdmlkdWFsIGV4ZWN1dGFibGVzOjwvcD4KKworPGJsb2NrcXVvdGU+PHA+PGI+CitjYXQgY2hyb290IGNwaW8gZGQgZG1lc2cgZmFsc2UgZml4ZGVwIGZzdHlwZSBndW56aXAgZ3ppcCBoYWx0IGlwY29uZmlnIGtpbGwKK2tpbml0IGxuIGxvc2V0dXAgbHMgbWluaXBzIG1rZGlyIG1rZmlmbyBta25vZGVzCitta3N5bnRheCBtb3VudCBtdiBuZnNtb3VudCBudWtlIHBpdm90X3Jvb3QgcG93ZXJvZmYgcmVhZGxpbmsgcmVib290IHJlc3VtZQorcnVuLWluaXQgc2ggc2hhMWhhc2ggc2xlZXAgc3luYyB0cnVlIHVtb3VudCB1bmFtZSB6Y2F0Cis8L2I+PC9wPjwvYmxvY2txdW90ZT4KKworPHA+VG8gZ2V0IHRoYXQgbGlzdCwgYnVpbGQga2xpYmMgYWNjb3JkaW5nIHRvIHRoZSBpbnN0cnVjdGlvbnMgKEkKKzxhIGhyZWY9aHR0cDovL2xhbmRsZXkubmV0L25vdGVzLTIwMTMuaHRtbCMyMy0wMS0yMDEzPmxvb2tlZCBhdDwvYT4gdmVyc2lvbgorMi4wLjIgYW5kIGRpZCBjZCBrbGliYy0qOyBsbiAtcyAvb3V0cHV0L29mL2tlcm5lbC9tYWtlL2hlYWRlcnNfaW5zdGFsbAorbGludXg7IG1ha2UpIHRoZW4gPGI+ZWNobyAkKGZvciBpIGluICQoZmluZCAuIC10eXBlIGYpOyBkbyBmaWxlICRpIHwgZ3JlcCAtcQorZXhlY3V0YWJsZSAmJiBiYXNlbmFtZSAkaTsgZG9uZSB8IGdyZXAgLXYgJ1suXWckJyB8IHNvcnQgLXUpPC9iPiB0byBmaW5kCitleGVjdXRhYmxlcywgdGhlbiBlbGltaW5hdGUgdGhlICouc28gZmlsZXMgYW5kICouc2hhcmVkIGR1cGxpY2F0ZXMuPC9wPgorCis8cD5Tb21lIG9mIHRob3NlIGJpbmFyaWVzIGFyZSBidWlsZC10aW1lIHRvb2xzIHRoYXQgZG9uJ3QgZ2V0IGluc3RhbGxlZCwKK3doaWNoIHJlbW92ZXMgbWtub2RlcywgbWtzeW50YXgsIHNoYTFoYXNoLCBhbmQgZml4ZGVwIGZyb20gdGhlIGxpc3QuCisoQW5kIHNoYTFoYXNoIGlzIGp1c3QgYW4gdW5wb2xpc2hlZCBzaGExc3VtIGFueXdheS4pPC9wPgorCis8cD5UaGUgcnVuLWluaXQgY29tbWFuZCBpcyBtb3JlIGNvbW1vbmx5IGNhbGxlZCBzd2l0Y2hfcm9vdCwgbnVrZSBpcyBqdXN0Cisicm0gLXJmIC0tICRAIiwgYW5kIG1pbmlwcyBpcyBtb3JlIGNvbW1vbmx5IGNhbGxlZCAicHMiLiBJJ20gbm90IGRvaW5nIGFsaWFzZXMKK2ZvciB0aGUgb2RkYmFsbCBuYW1lcy48L3A+CisKKzxwPllldCBtb3JlIHN0YWxlIGZvcmtzIG9mIGRhc2ggYW5kIGd6aXAgc3Vja2VkIGluIGhlcmUgKHNlZSAiZHViaW91cworbGljZW5zZSB0ZXJtcyIgYWJvdmUpLCBhZGRpbmcgbm90aGluZyB0byB0aGUgb3RoZXIgcHJvamVjdHMgd2UndmUgbG9va2VkIGF0LgorQnV0IHdlIHN0aWxsIG5lZWQgc2gsIGd1bnppcCwgZ3ppcCwgYW5kIHpjYXQgdG8gcmVwbGFjZSB0aGlzIHBhY2thZ2UuPC9wPgorCis8cD5BdCB0aGUgdGltZSBJIGRpZCB0aGUgaW5pdGlhbCBhbmFseXNpcyB0b3lib3ggYWxyZWFkeSBoYWQgY2F0LCBjaHJvb3QsIGRtZXNnLCBmYWxzZSwKK2tpbGwsIGxuLCBsb3NldHVwLCBscywgbWtkaXIsIG1rZmlmbywgcmVhZGxpbmssIHJtLCBzd2l0Y2hfcm9vdCwgc2xlZXAsIHN5bmMsCit0cnVlLCBhbmQgdW5hbWUuPC9wPgorCis8cD5UaGUgbG93IGhhbmdpbmcgZnJ1aXQgaXMgY3BpbywgZGQsIHBzLCBtdiwgYW5kIHBpdm90X3Jvb3QuPC9wPgorCis8cD5UaGUgImtpbml0IiBjb21tYW5kIGlzIGFub3RoZXIgZ3JhdHVpdG91cyByZW5hbWUsIGl0J3MgaW5pdCBydW5uaW5nIGFzIFBJRCAxLgorVGhlIGhhbHQsIHBvd2Vyb2ZmLCBhbmQgcmVib290IGNvbW1hbmRzIHdvcmsgd2l0aCBpdC48L3A+CisKKzxwPkkndmUgZ290IG1vdW50IGFuZCB1bW91bnQgcXVldWVkIHVwIGFscmVhZHksIGZzdHlwZSBhbmQgbmZzbW91bnQgZ28gd2l0aAordGhvc2UuIChBbmQgcHJvYmFibHkgc21ibW91bnQgYW5kIHA5bW91bnQsIGJ1dCB0aGlzIGhhc24ndCBnb3Qgb25lLiBUaG9zZQorYXJlIGFsbCBhYm91dCBxdWVyeWluZyBmb3IgbG9naW4gY3JlZGVudGlhbHMsIHByb2JhYmx5IHdvcmthYmxlIGludG8gdGhlCitiYXNlIG1vdW50IGNvbW1hbmQuKTwvcD4KKworPHA+VGhlIGlwY29uZmlnIGNvbW1hbmQgaGVyZSBoYXMgYSBidWlsdCBpbiBkaGNwIGNsaWVudCwgc28gaXQncyBpZmNvbmZpZworYW5kIGRoY3BjZCBhbmQgbWF5YmUgc29tZSBvdGhlciBzdHVmZi48L3A+CisKKzxwPlRoZSByZXN1bWUgY29tbWFuZCBpcy4uLiB3ZWlyZC4gSXQgZmluZHMgYSBzd2FwIHBhcnRpdGlvbiBhbmQgcmVhZHMgZGF0YQorZnJvbSBpdCBpbnRvIGEgL3Byb2MgZmlsZSwgc29tZXRoaW5nIHRoZSBrZXJuZWwgaXMgY2FwYWJsZSBvZiBkb2luZyBpdHNlbGYuCisoRXZlbiB0aG91Z2ggdGhlIGtsaWJjIGF1dGhvcgorPGEgaHJlZj1odHRwOi8vd3d3Lnp5dG9yLmNvbS9waXBlcm1haWwva2xpYmMvMjAwNi1KdW5lLzAwMTc0OC5odG1sPmF0dGVtcHRlZAordG8gcmVtb3ZlPC9hPiB0aGF0IGNhcGFiaWxpdHkgZnJvbSB0aGUga2VybmVsLCBjdXJyZW50IGtlcm5lbC9wb3dlci9oaWJlcm5hdGUuYworc3RpbGwgcGFyc2VzICJyZXN1bWU9IiBvbiB0aGUgY29tbWFuZCBsaW5lKS4gQW5kIHlldCB2YXJpb3VzIGRpc3Ryb3Mgc2VlbSB0bworbWFrZSB1c2Ugb2Yga2xpYmMgZm9yIHRoaXMuCitHaXZlbiB0aGUgaGlzdG9yeSBvZiBzd3N1c3AvaGliZXJuYXRlIChhbmQgCis8YSBocmVmPWh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzMzMzAwNz5UdXhPbkljZTwvYT4KK2FuZCA8YSBocmVmPWh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI0MjEwNz5rZXhlYyBqdW1wPC9hPikgSSd2ZSBsb3N0IHRyYWNrCitvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXJ0IGhlcmUuIEFoLCBEb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC50eHQKK2hhcyB0aGUgQVBJIGRvY3MsIGFuZCA8YSBocmVmPWh0dHA6Ly9zdXNwZW5kLnNmLm5ldD5oZXJlJ3MgYSBiZXR0ZXIKK3Rvb2w8L2E+Li4uPC9wPgorCis8cD5TbyB0aGUgbGlzdCBvZiB0aGluZ3MgYWN0dWFsbHkgaW4ga2xpYmMgYXJlOjwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD1rbGliY19jbWQ+CitjYXQgY2hyb290IGRtZXNnIGZhbHNlIGtpbGwgbG4gbG9zZXR1cCBscyBta2RpciBta2ZpZm8gcmVhZGxpbmsgcm0gc3dpdGNoX3Jvb3QKK3NsZWVwIHN5bmMgdHJ1ZSB1bmFtZQorCitjcGlvIGRkIHBzIG12IHBpdm90X3Jvb3QKK21vdW50IG5mc21vdW50IGZzdHlwZSB1bW91bnQKK3NoIGd1bnppcCBnemlwIHpjYXQKK2tpbml0IGhhbHQgcG93ZXJvZmYgcmVib290CitpcGNvbmZpZworcmVzdW1lCis8L3NwYW4+Cis8L2I+PC9ibG9ja3F1b3RlPgorCis8aHIgLz4KKzxhIG5hbWU9Z2xpYmMgLz4KKzxoMj5nbGliYzwvaDI+CisKKzxwPlJhdGhlciBhIGxvdCBvZiBjb21tYW5kIGxpbmUgdXRpbGl0aWVzIGNvbWUgYnVuZGxlZCB3aXRoIGdsaWJjOjwvcD4KKworPGJsb2NrcXVvdGU+PGI+CitjYXRjaHNlZ3YgZ2V0Y29uZiBnZXRlbnQgaWNvbnYgaWNvbnZjb25maWcgbGRjb25maWcgbGRkIGxvY2FsZSBsb2NhbGVkZWYKK210cmFjZSBuc2NkIHJwY2VudCBycGNpbmZvIHR6c2VsZWN0IHpkdW1wIHppYworPC9iPjwvYmxvY2txdW90ZT4KKworPHA+T2YgdGhvc2UsIG11c2wgbGliYyBvbmx5IGltcGxlbWVudHMgbGRkLjwvcD4KKworPHA+Y2F0Y2hzZWd2IGlzIGEgcnVkaW1lbnRhcnkgZGVidWdnZXIsIHByb2JhYmx5IG91dCBvZiBzY29wZSBmb3IgdG95Ym94LjwvcD4KKworPHA+aWNvbnYgaGFzIGJlZW4gPGEgaHJlZj0iI3N1c3Y0Ij5wcmV2aW91c2x5IGRpc2N1c3NlZDwvYT4uPC9wPgorCis8cD5pY29udmNvbmZpZyBpcyBvbmx5IHJlbGV2YW50IGlmIGljb252IGlzIHVzZXItY29uZmlndXJhYmxlOyBtdXNsIHVzZXMgYQorbm9uLWNvbmZpZ3VyYWJsZSBpY29udi48L3A+CisKKzxwPmdldGNvbmYgaXMgYSBwb3NpeCB1dGlsaXR5IHdoaWNoIGRpc3BsYXlzIHNldmVyYWwgdmFyaWFibGVzIGZyb20gCit1bmlzdGQuaDsgaXQgcHJvYmFibHkgYmVsb25ncyBpbiB0aGUgZGV2ZWxvcG1lbnQgdG9vbGNoYWluLjwvcD4KKworPHA+Z2V0ZW50IGhhbmRsZXMgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gcGFzc3dkLXN0eWxlIGRhdGFiYXNlcworKGluIGEgcmF0aGVyIGxhbWUgd2F5KSBhbmQgaXMgdHJpdmlhbGx5IHJlcGxhY2FibGUgYnkgZ3JlcC48L3A+CisKKzxwPmxvY2FsZSB3YXMgZGlzY3Vzc2VkIHVuZGVyIDxhIGhyZWY9I3N1c3Y0PnBvc2l4PC9hPi4KK2xvY2FsZWRlZiBjb21waWxlcyBsb2NhbGUgZGVmaW5pdGlvbnMsIHdoaWNoIG11c2wgY3VycmVudGx5IGRvZXMgbm90IHVzZS48L3A+CisKKzxwPm10cmFjZSBpcyBhIHBlcmwgc2NyaXB0IHRvIHVzZSB0aGUgbWFsbG9jIGRlYnVnZ2luZyB0aGF0IGdsaWJjIGhhcyBidWlsdC1pbjsKK3RoaXMgaXMgbm90IHJlbGV2YW50IGZvciBtdXNsLCBhbmQgd291bGQgbmVjZXNzYXJpbHkgdmFyeSB3aXRoIGxpYmMuIDwvcD4KKworPHA+bnNjZCBpcyBhIG5hbWUgc2VydmljZSBjYWNoaW5nIGRhZW1vbiwgd2hpY2ggaXMgbm90IHlldCByZWxldmFudCBmb3IgbXVzbC4KK3JwY2luZm8gYW5kIHJwY2VudCBhcmUgcmVsYXRlZCB0byBycGMsIHdoaWNoIG11c2wgZG9lcyBub3QgaW5jbHVkZS48L3A+CisKKzxwPlRoZSByZW1haW5pbmcgY29tbWFuZHMgaW52b2x2ZSBnbGliYydzIGJ1bmRsZWQgdGltZXpvbmUgZGF0YWJhc2UsCit3aGljaCBzZWVtcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIDxhIGhyZWY9aHR0cDovL3d3dy5pYW5hLm9yZy90aW1lLXpvbmVzPklBTkEKK3RpbWV6b25lIGRhdGFiYXNlPC9hPi4gVW5sZXNzIHdlIHdhbnQgdG8gbWFpbnRhaW4gb3VyIG93biBmb3JrIG9mIHRoZQorc3RhbmRhcmRzIGJvZHkncyBkYXRhYmFzZSBsaWtlIGdsaWJjIGRvZXMsIHRoZXNlIGFyZSBvZiBubyBpbnRlcmVzdCwKK2J1dCBmb3IgY29tcGxldGVuZXNzOjwvcD4KKworPHA+dHpzZWxlY3Qgb3V0cHV0cyBhIFRaIHZhcmlhYmxlIGNvcnJlcG9uZGluZyB0byB1c2VyIGlucHV0LiAKK1RoZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGluZGljYXRlIGhvdyB0byB1c2UgaXQgaW4gYSBzY3JpcHQsIGJ1dCBpdCBzZWVtcwordGhhdCBEZWJpYW4gbWF5IGhhdmUgZG9uZSBzby4KK3pkdW1wIHByaW50cyBjdXJyZW50IHRpbWUgaW4gZWFjaCBvZiBzZXZlcmFsIHRpbWV6b25lcywgb3B0aW9uYWxseQorb3V0cHV0dGluZyBhIGdyZWF0IGRlYWwgb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCB0aW1lem9uZS4KK3ppYyBjb252ZXJ0cyBhIGRlc2NyaXB0aW9uIG9mIGEgdGltZXpvbmUgdG8gYSBmaWxlIGluIHR6IGZvcm1hdC48L3A+CisKKzxwPk5vbmUgb2YgZ2xpYmMncyBidW5kbGVkIGNvbW1hbmRzIGFyZSBjdXJyZW50bHkgb2YgaW50ZXJlc3QgdG8gdG95Ym94LjwvcD4KKworPC9iPjwvYmxvY2txdW90ZT4KKworPGhyIC8+Cis8YSBuYW1lPXNhc2ggLz4KKzxoMj5TdGFuZC1BbG9uZSBTaGVsbDwvaDI+CisKKzxwPldpa2lwZWRpYSBoYXMgPGEgaHJlZj1odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N0YW5kLWFsb25lX3NoZWxsPmEgZ29vZAorc3VtbWFyeSBvZiBzYXNoPC9hPiwgd2l0aCBsaW5rcy4gVGhlIG9yaWdpbmFsIFN0YW5kLUFsb25lIFNoZWxsIHByb2plY3QgcmVhY2hlZAorYSBzdG9wcGluZyBwb2ludCwgYW5kIHRoZW4gPGEgaHJlZj1odHRwOi8vd3d3LmJhaXRpLm5ldC9zYXNoPiJzYXNoIHBsdXMKK3BhdGNoZXMiPC9hPiBleHRlbmRlZCBpdCBhIGJpdCBmdXJ0aGVyLiBUaGUgcmVzdWx0IGlzIGEgbWVnYWJ5dGUgZXhlY3V0YWJsZQordGhhdCBwcm92aWRlcyA0MCBjb21tYW5kcy48L3A+CisKKzxwPlNhc2ggaXMgYSBzaGVsbCB3aXRoIGJ1aWx0LWluIGNvbW1hbmRzLiBJdCBkb2Vzbid0IGhhdmUgYSBtdWx0aXBsZXhlcgorY29tbWFuZCwgbWVhbmluZyAic2FzaCBscyAtbCIgZG9lc24ndCB3b3JrICh5b3UgaGF2ZSB0byBnbyAic2FzaCAtYyAnbHMgLWwnIikuCis8L3A+CisKKzxwPlRoZSBsaXN0IG9mIGNvbW1hbmRzIGNhbiBiZSBvYnRhaW5lZCB2aWEgYnVpbGRpbmcgaXQgYW5kIGRvaW5nCisiZWNobyBoZWxwIHwgLi9zYXNoIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNlZCAncy9eLS8vJyB8IHhhcmdzIGVjaG8iLCB3aGljaAorZ2l2ZXMgdXM6PC9wPgorCis8YmxvY2txdW90ZT48Yj4KK2FsaWFzIGFsaWFzYWxsIGFyIGNkIGNoYXR0ciBjaGdycCBjaG1vZCBjaG93biBjbXAgY3AgY2hyb290IGRkIGVjaG8gZWQgZXhlYworZXhpdCBmaWxlIGZpbmQgZ3JlcCBndW56aXAgZ3ppcCBoZWxwIGtpbGwgbG9zZXR1cCBsb3NldHVwIGxuIGxzIGxzYXR0ciBta2RpcgorbWtub2QgbW9yZSBtb3VudCBtdiBwaXZvdF9yb290IHByaW50ZW52IHByb21wdCBwd2QgcXVpdCBybSBybWRpciBzZXRlbnYgc291cmNlCitzdW0gc3luYyB0YXIgdG91Y2ggdW1hc2sgdW1vdW50IHVuYWxpYXMgd2hlcmUKKzwvYj48L2Jsb2NrcXVvdGU+CisKKzxwPlBsdXMgc2ggYmVjYXVzZSBpdCdzIGEgc2hlbGwuIEEgZG96ZW4gb3Igc28gY29tbWFuZHMgY2FuIG9ubHkgc2FuZWx5IGJlCitpbXBsZW1lbnRlZCBhcyBzaGVsbCBidWlsdGlucyAoYWxpYXMgYWxpYXNhbGwgY2QgZXhlYyBleGl0IHByb21wdCBxdWl0IHNldGVudgorc291cmNlIHVtYXNrIHVuYWxpYXMpLCB3aGVyZSBpcyBhbiBhbGlhcyBmb3Igd2hpY2gsIGFuZCBhdCB0cmlhZ2UgdGltZSB0b3lib3gKK2FscmVhZHkgaGFzIGNoZ3JwLCBjaG1vZCwgY2hvd24sIGNtcCwgY3AsIGNocm9vdCwgZWNobywgaGVscCwga2lsbCwgbG9zZXR1cCwKK2xuLCBscywgbWtkaXIsIG1rbm9kLCBwcmludGVudiwgcHdkLCBybSwgcm1kaXIsIHN5bmMsIGFuZCB0b3VjaC48L3A+CisKKzxwPlRoaXMgbGVhdmVzOjwvcD4KKworPGJsb2NrcXVvdGU+PGI+Cis8c3BhbiBpZD1zYXNoX2NtZD4KK2FyIGNoYXR0ciBkZCBlZCBmaWxlIGZpbmQgZ3JlcCBndW56aXAgZ3ppcCBsc2F0dHIgbW9yZSBtb3VudCBtdiBwaXZvdF9yb290CitzaCBzdW0gdGFyIHVtb3VudAorPC9zcGFuPgorPC9iPjwvYmxvY2txdW90ZT4KKworPHA+KEZvciBvbmNlLCB0aGlzIHByb2plY3QgZG9lc24ndCBpbmNsdWRlIGEgZm9yayBvZiBnemlwLCBpbnN0ZWFkCitpdCBzdWNrcyBpbiAtbHogZnJvbSB0aGUgaG9zdC4pPC9wPgorCis8aHIgLz4KKzxhIG5hbWU9c2Jhc2UgLz4KKzxoMj5zYmFzZTo8L2gyPgorCis8cD5JdCdzIDxhIGhyZWY9aHR0cDovL2dpdC5zdWNrbGVzcy5vcmcvc2Jhc2U+b24gc3Vja2xlc3M8L2E+IGluCis8YSBocmVmPWh0dHA6Ly9naXQuc3Vja2xlc3Mub3JnL3ViYXNlPnR3byBwYXJ0czwvYT4uIEFzIG9mIE5vdmVtYmVyIDIwMTUgaXQncworaW1wbGVtZW50ZWQgdGhlIGZvbGxvd2luZyAocmVuYW1pbmcgImNyb24iIHRvICJjcm9uZCIgZm9yCitjb25zaXN0ZW5jeSwgYW5kIHlhbmtpbmcgInNwb25nZSIsICJtZXNnIiwgInBhZ2VzaXplIiwgInJlc3Bhd24iLCBhbmQKKyJ2dGFsbG93Iik6PC9wPgorCis8YmxvY2txdW90ZT48cD4KKzxzcGFuIGlkPXNiYXNlX2NtZD4KK2Jhc2VuYW1lIGNhbCBjYXQgY2hncnAgY2htb2QgY2hvd24gY2hyb290IGNrc3VtIGNtcCBjb2xzIGNvbW0gY3AgY3JvbmQgY3V0IGRhdGUKK2Rpcm5hbWUgZHUgZWNobyBlbnYgZXhwYW5kIGV4cHIgZmFsc2UgZmluZCBmbG9jayBmb2xkIGdldGNvbmYgZ3JlcCBoZWFkCitob3N0bmFtZSBqb2luIGtpbGwgbGluayBsbiBsb2dnZXIgbG9nbmFtZSBscyBtZDVzdW0gbWtkaXIgbWtmaWZvIG1rdGVtcCBtdgorbmljZSBubCBub2h1cCBvZCBwYXN0ZSBwcmludGVudiBwcmludGYgcHdkIHJlYWRsaW5rIHJlbmljZSBybSBybWRpciBzZWQgc2VxCitzZXRzaWQgc2hhMXN1bSBzaGEyNTZzdW0gc2hhNTEyc3VtIHNsZWVwIHNvcnQgc3BsaXQgc3RyaW5ncyBzeW5jIHRhaWwKK3RhciB0ZWUgdGVzdCB0ZnRwIHRpbWUgdG91Y2ggdHIgdHJ1ZSB0dHkgdW5hbWUgdW5leHBhbmQgdW5pcSB1bmxpbmsgdXVkZWNvZGUKK3V1ZW5jb2RlIHdjIHdoaWNoIHhhcmdzIHllcworPC9zcGFuPgorPC9wPjwvYmxvY2txdW90ZT4KKworPHA+YW5kPHA+CisKKzxibG9ja3F1b3RlPjxwPgorPHNwYW4gaWQ9c2Jhc2VfY21kPgorY2h2dCBjbGVhciBkZCBkZiBkbWVzZyBlamVjdCBmYWxsb2NhdGUgZnJlZSBpZCBsb2dpbiBta25vZCBtb3VudHBvaW50CitwYXNzd2QgcGlkb2YgcHMgc3RhdCBzdSB0cnVuY2F0ZSB1bnNoYXJlIHVwdGltZSB3YXRjaAord2hvCis8L3NwYW4+Cis8L3A+PC9ibG9ja3F1b3RlPgorCis8aHIgLz4KKzxhIG5hbWU9czYgLz4KKzxoMj5zNjwvaDI+CisKKzxwPlRoZSB3ZWJzaXRlIDxhIGhyZWY9aHR0cDovL3NrYXJuZXQub3JnL3NvZnR3YXJlLz5za2FybmV0PC9hPiBoYXMgYSBidW5jaAorb2Ygc21hbGwgdXRpbGl0aWVzIGFzIHBhcnQgb2Ygc29tZXRoaW5nIGNhbGxlZCAiczYiLiBUaGlzIGluY2x1ZGVzIHRoZQorPGEgaHJlZj1odHRwOi8vc2thcm5ldC5vcmcvc29mdHdhcmUvczYtcG9ydGFibGUtdXRpbHM+czYtcG9ydGFiaWxlLXV0aWxzPC9hPgorYW5kIHRoZSA8YSBocmVmPWh0dHA6Ly9za2FybmV0Lm9yZy9zb2Z0d2FyZS9zNi1saW51eC11dGlscz5zNi1saW51eC11dGlsczwvYT4uCis8L3A+CisKKzxwPkJvdGggcGFja2FnZXMgcmVseSBvbiBtdWx0aXBsZSBiZXNwb2tlIGV4dGVybmFsIGxpYnJhcmllcyB3aXRob3V0IHdoaWNoCit0aGV5IGNhbid0IGNvbXBpbGUuIFRoZSBzb3VyY2UgaXMgY29tcGxldGVseSB1bmNvbW1lbnRlZCBhbmQgZG9lc24ndCB3cmFwIGF0Cis4MCBjaGFyYWN0ZXJzLiBEb2luZyBhIGZpbmQgZm9yICouYyBmaWxlcyBicmluZ3MgdXAgdGhlIGZvbGxvd2luZyBjb21tYW5kczo8L3A+CisKKzxibG9ja3F1b3RlPjxiPgorPHNwYW4gaWQ9czY+CitiYXNlbmFtZSBjYXQgY2htb2QgY2hvd24gY2hyb290IGNsb2NrIGN1dCBkZXZkIGRpcm5hbWUgZWNobyBlbnYgZXhwciBmYWxzZQorZm9ybWF0LWZpbHRlciBmcmVlcmFtZGlzayBncmVwIGhhbHQgaGVhZCBoaWVyY29weSBob3N0bmFtZSBsaW5rbmFtZSBsbgorbG9nd2F0Y2ggbHMgbWF4aW11bXRpbWUgbWVtb3J5aG9nIG1rZGlyIG1rZmlmbyBtb3VudCBuaWNlIG51a2UgcGF1c2UKK3Bpdm90Y2hyb290IHBvd2Vyb2ZmIHByaW50ZW52IHF1b3RlIHF1b3RlLWZpbHRlciByZWJvb3QgcmVuYW1lIHJtcmYgc2xlZXAKK3NvcnQgc3dhcG9mZiBzd2Fwb24gc3luYyB0YWlsIHRlc3QgdG91Y2ggdHJ1ZSB1bW91bnQgdW5pcXVlbmFtZSB1bnF1b3RlCit1bnF1b3RlLWZpbHRlciB1cGRhdGUtc3ltbGlua3MKKzwvc3Bhbj4KKzwvYj48L2Jsb2NrcXVvdGU+CisKKzxwPlRyaWFnZTogbWVtb3J5aG9nIGlzbid0IGV2ZW4gbGlzdGVkIG9uIHRoZSB3ZWJzaXRlIG5vciBkb2VzIGl0IGhhdmUKK2EgZG9jdW1lbnRhdGlvbiBmaWxlLCBjbG9jayBzZWVtcyBsaWtlIGEgc3Vic2V0CitvZiBkYXRlLCBkZXZkIGlzIHNvbWUgc29ydCBvZiBuZXRsaW5rIHdyYXBwZXIgdGhhdCBzcGF3bnMgaXRzIGNvbW1hbmQgbGluZQorZXZlcnkgdGltZSBpdCBnZXRzIGEgbWVzc2FnZSAobWF5YmUgdGhpcyBpcyBtZWFudCB0byBpbXBsZW1lbnQgcGFydCBvZgordWRldi9tZGV2PyksIGZvcm1hdC1maWx0ZXIgaXMgc29ydCBvZiBhd2sncyAne3ByaW50ICQyfScgZnVuY3Rpb24gc3BsaXQgb3V0CitpbnRvIGl0cyBvd24gY29tbWFuZCwgaGllcmNvcHkgYSBzdWJzZXQgb2YgImNwIC1yIiwgbWF4aW11bXRpbWUgaXMgc29tZXRoaW5nCitJIGltcGxlbWVudGVkIGFzIGEgc2hlbGwgc2NyaXB0IChtb3JlL3RpbWVvdXQuc2ggaW4gQWJvcmlnaW5hbCBMaW51eCksCitudWtlIGlzbid0IHRoZSBzYW1lIGFzIGtsaWJjICh0aGlzIG9uZSdzICJraWxsIFNJRyAtMSIgb25seSB3aXRoIGhhcmR3YXJlZAorU0lHIG9wdGlvbnMpLCBwYXVzZSBpcyBhIHByb2dyYW0gdGhhdCBsaXRlcmFsbHkgd2FpdHMgdG8gYmUga2lsbGVkIChJCitnZW5lcmFsbHkgc2xlZXAgOTk5OTk5OTk5IHdoaWNoIGlzIGEgbGl0dGxlIG92ZXIgMzAgeWVhcnMpLAorcGl2b3RjaHJvb3QgaXMgYSBzdWJzZXQgb2Ygc3dpdGNoX3Jvb3QsIHJtcmYgaXMgcm0gLXJmLi4uPC9wPgorCis8cD5JIHNlZSAibnVrZSIgcmVzdXJmYWNlLCBhbmQgaWYgInJtcmYiIHdhc24ndCBhbHNvIGhlcmUgSSBtaWdodCB0aGluawora2xpYmMgaGFkIGEgcG9pbnQuPC9iPgorCis8YmxvY2txdW90ZT4KK2Jhc2VuYW1lIGNhdCBjaG1vZCBjaG93biBjaHJvb3QgY3V0IGRpcm5hbWUgZWNobyBlbnYgZXhwciBmYWxzZQorZnJlZXJhbWRpc2sgZ3JlcCBoYWx0IGhlYWQgaG9zdG5hbWUgbGlua25hbWUgbG4KK2xvZ3dhdGNoIGxzIG1rZGlyIG1rZmlmbyBtb3VudCBuaWNlCitwaXZvdGNocm9vdCBwb3dlcm9mZiBwcmludGVudiBxdW90ZSBxdW90ZS1maWx0ZXIgcmVib290IHJlbmFtZSBzbGVlcAorc29ydCBzd2Fwb2ZmIHN3YXBvbiBzeW5jIHRhaWwgdGVzdCB0b3VjaCB0cnVlIHVtb3VudCB1bmlxdWVuYW1lIHVucXVvdGUKK3VucXVvdGUtZmlsdGVyIHVwZGF0ZS1zeW1saW5rcworPC9ibG9ja3F1b3RlPgorCisKKzxociAvPgorPGEgbmFtZT1uYXNoIC8+Cis8aDI+bmFzaDo8L2gyPgorCis8cD5SZWQgSGF0J3MgbmFzaCB3YXMgcGFydCBvZiBpdHMgIm1raW5pdHJkIiBwYWNrYWdlLCByZXBsYWNlbWVudCBmb3IgYSBzaGVsbAorYW5kIHV0aWxpdGllcyBvbiB0aGUgYm9vdCBmbG9wcHkgYmFjayBpbiB0aGUgMTk5MCdzICh0aGUgc2FtZSBnZW5lcmFsIGlkZWEKK2FzIEJ1c3lCb3gsIGRldmVsb3BlZCBpbmRlcGVuZGVudGx5KS4gUmVkIEhhdCBkaXNjb250aW51ZWQgbmFzaCBkZXZlbG9wbWVudAoraW4gMjAxMCwgcmVwbGFjaW5nIGl0IHdpdGggZHJhY3V0ICh3aGljaCBjb2xsZWN0cyB0b2dldGhlciBleGlzdGluZyBwYWNrYWdlcywKK2luY2x1ZGluZyBidXN5Ym94KS48L3A+CisKKzxwPkkgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gYmVhdCBzb3VyY2UgY29kZSBvdXQgb2YKKzxhIGhyZWY9aHR0cDovL3BrZ3MuZmVkb3JhcHJvamVjdC5vcmcvZ2l0L21raW5pdHJkPkZlZG9yYSdzIGN1cnJlbnQgZ2l0PC9hPgorcmVwb3NpdG9yeS4gVGhlIGxhc3QgcmVsZWFzZSB2ZXJzaW9uIHRoYXQgdXNlZCBpdCB3YXMgRmVkb3JhIENvcmUgMTIKK3doaWNoIGhhcyA8YSBocmVmPWh0dHA6Ly9hcmNoaXZlLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9hcmNoaXZlL2ZlZG9yYS9saW51eC9yZWxlYXNlcy8xMi9GZWRvcmEvc291cmNlL1NSUE1TL21raW5pdHJkLTYuMC45My0xLmZjMTIuc3JjLnJwbT5hIHNvdXJjZSBycG08L2E+Cit0aGF0IGNhbiBiZSB1bndvdW5kIHdpdGggInJwbTJjcGlvIG1raW5pdHJkLnNyYy5ycG0gfCBjcGlvIC1pIC1kIC1IIG5ld2MKKy0tbm8tYWJzb2x1dGUtZmlsZW5hbWVzIiBhbmQgaW4gdGhlcmUgaXMgYSBta2luaXRyZC02LjAuOTMudGFyLmJ6MiB3aGljaAoraGFzIHRoZSBzb3VyY2UuPC9wPgorCis8cD5JbiBhZGRpdGlvbiB0byBiZWluZyBhIGJpdCBsaWtlIGEgY29tbWFuZCBzaGVsbCwgdGhlIG5hc2ggbWFuIHBhZ2UgbGlzdHMgdGhlCitmb2xsb3dpbmcgY29tbWFuZHM6PC9wPgorCis8YmxvY2txdW90ZT48cD4KK2FjY2VzcyBlY2hvIGZpbmQgbG9zZXR1cCBta2RldmljZXMgbWtkaXIgbWtub2QgbWtkbW5vZCBta3Jvb3RkZXYgbW91bnQKK3Bpdm90X3Jvb3QgcmVhZGxpbmsgcmFpZGF1dG9ydW4gc2V0cXVpZXQgc2hvd2xhYmVscyBzbGVlcCBzd2l0Y2hyb290IHVtb3VudAorPC9wPjwvYmxvY2txdW90ZT4KKworPHA+T2RkbHksIHRoZSBvbmx5IG9jY3VycmVuY2Ugb2YgdGhlIHN0cmluZyBwaXZvdF9yb290IGluIHRoZSBuYXNoIHNvdXJjZSBjb2RlCitpcyBpbiB0aGUgbWFuIHBhZ2UsIHRoZSBjb21tYW5kIGlzbid0IHRoZXJlLiAoSXQgc2VlbXMgdG8gaGF2ZSBiZWVuIHJlbW92ZWQKK3doZW4gdGhlIHVuZGVyc2NvcmVsZXNzIHN3aXRjaHJvb3Qgd2VudCBpbi4pPC9wPgorCis8cD5BIG1vcmUgY29tcGxldGUgbGlzdCBzZWVtcyB0byBiZSB0aGUgaGFuZGxlcnNbXSBhcnJheSBpbiBuYXNoLmM6PC9wPgorCis8YmxvY2txdW90ZT48cD4KK2FjY2VzcyBidWlsZEVudiBjYXQgY29uZCBjcCBkYWVtb25pemUgZG0gZWNobyBleGVjIGV4aXQgZmluZCBrZXJuZWxvcHQKK2xvYWREcml2ZXJzIGxvYWRwb2xpY3kgbWtjaGFyZGV2cyBta2Jsa3RhYiBta2Jsa2RldnMgbWtkaXIgbWtkbW5vZCBta25vZAorbWtyb290ZGV2IG1vdW50IG5ldG5hbWUgbmV0d29yayBudWxsIHBseW1vdXRoIGhvdHBsdWcga2lsbHBsdWcgbG9zZXR1cAorbG4gbHMgcmFpZGF1dG9ydW4gcmVhZGxpbmsgcmVzdW1lIHJlc29sdmVEZXZpY2Ugcm1wYXJ0cyBzZXREZXZpY2VFbnYKK3NldHF1aWV0IHNldHVwcm9vdCBzaG93ZWxmaW50ZXJwIHNob3dsYWJlbHMgc2xlZXAgc3RhYmlsaXplZCBzdGF0dXMgc3dpdGNocm9vdAordW1vdW50IHdhaXRkZXYKKzwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPlRoaXMgbGlzdCBpcyBudXRzOiAicGx5bW91dGgiIGlzIGFuIGFsaWFzIGZvciAibnVsbCIgd2hpY2ggaXMgYmFzaWNhbGx5CisidHJ1ZSIgKHdoaWNoIHRoaWUgYWJvdmUgbGlzdCBkb2Vzbid0IGhhdmUpLiBUaGluZ3MgbGlrZSBidWlsZEVudiBhbmQKK2xvYWREcml2ZXJzIGFyZSBiZXNwb2tlIFJlZCBIYXQgYmVoYXZpb3IgdGhhdCBtaWdodCBhcyB3ZWxsIGJlIGhhcmR3aXJlZCBpbgordG8gbmFzaCdzIG1haW4oKSB3aXRob3V0IGJlaW5nIGNhbGxlZC48L3A+CisKKzxwPkluc3RlYWQgb2YgZWxpbWluYXRpbmcgaXRlbXMKK2Zyb20gdGhlIGxpc3Qgd2l0aCBhbiBleHBsYW5hdGlvbiBmb3IgZWFjaCwgSSdtIGp1c3QgZ29pbmcgdG8gY2hlcnJ5IHBpY2sKK2EgZmV3OiB0aGUgZGV2aWNlIG1hcHBlciAoZG0sIHJhaWRhdXRvcnVuKSBpcyBwcm9iYWJseSBpbnRlcmVzdGluZywKK2hvdHBsdWcgKG1heSBiZSBvYnNvbGV0ZSBkdWUgdG8ga2VybmVsIGNoYW5nZXMgdGhhdCBub3cgbG9hZCBmaXJtd2FyZQorZGlyZWN0bHkpLCBhbmQgYW5vdGhlciAicmVzdW1lIiBhbGEga2xpYmMuPC9wPgorCis8cD5CdXQgbW9zdGx5OiBJIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBvbmUuIEFuZCBuZWl0aGVyIGRvZXMgUmVkIEhhdCBhbnltb3JlLjwvcD4KKworPHA+VmVyZGljdDogaWdub3JlPC9wPgorCis8aHIgLz4KKzxhIG5hbWU9YmVhc3RpZWJveCAvPgorPGgyPkJlYXN0aWVib3g8L2gyPgorCis8cD5CYWNrIGluIDIwMDgsIHRoZSBCU0QgZ3V5cyB2ZW50ZWQgc29tZSBidXN5Ym94LWVudnkKKzxhIGhyZWY9aHR0cDovL2JlYXN0aWVib3guc291cmNlZm9yZ2UubmV0Pm9uIHNvdXJjZWZvcmdlPC9hPi4gVGhlbiBzdG9wcGVkLgorVGhlaXIgcmVwb3NpdG9yeSBpcyBzdGlsbCBpbiBDVlMsIGhhc24ndCBiZWVuIHRvdWNoZWQgaW4geWVhcnMsIGl0J3MgYSBnaWFudAoraGFpcmJhbGwgb2YgZXhpc3RpbmcgY29kZSBzdWNrZWQgdG9nZXRoZXIuIChUaGUgd2ViIHBhZ2Ugc2F5cyB0aGUgYXV0aG9yCitpcyBhd2FyZSBvZiBjcnVuY2hnZW4sIGJ1dCBkZWNpZGVkIHRvIGRvIHRoaXMgYnkgaGFuZCBhbnl3YXkuIFRoaXMgaXMgbm90CithIGNvbGxlY3Rpb24gb2YgbmV3IGNvZGUsIGl0J3MgYSBrYXRhbWFyaSBvZiBleGlzdGluZyBjb2RlIHJvbGxlZCB1cCBpbiBhCitiYWxsLik8L3A+CisKKzxwPkNvbWJpbmluZyB0aGUgc2V0IG9mIGNvbW1hbmRzIGxpc3RlZCBvbiB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGUgc2V0IG9mCittYW4gcGFnZXMgaW4gdGhlIHNvdXJjZSBnaXZlcyB1czo8L1A+CisKKzxibG9ja3F1b3RlPjxwPgorWyBjYXQgY2htb2QgY3AgY3NoIGRhdGUgZGYgZGlza2xhYmVsIGRtZXNnIGVjaG8gZXggZmRpc2sgZnNjayBmc2NrX2ZmcyBnZXR0eQoraGFsdCBob3N0bmFtZSBpZmNvbmZpZyBpbml0IGtpbGwgbGVzcyBsZXNza2V5IGxuIGxvZ2luIGxzIGx2IG1rc2ggbW9yZSBtb3VudAorbW91bnRfZmZzIG12IHBmY3RsIHBpbmcgcG93ZXJvZmYgcHMgcmVib290IHJtIHJvdXRlIHNlZCBzaCBzdHR5IHN5c2N0bCB0YXIgdGVzdAordHJhY2Vyb3V0ZSB1bW91bnQgdmkgd2ljb25maWcKKzwvcD48L2Jsb2NrcXVvdGU+CisKKzxwPkFwcGFyZW50bHkgbHYgaXMgdGhlIG1pc3NpbmcgbGluayBiZXR3ZWVuIGVkIGFuZCB2aSwgY29weXJpZ2h0IDE5ODItMTk5NyAoZG8KK25vdCB3YW50KSwgZXggaXMgYW5vdGhlciBvYnNvbGV0ZSB2aSBtb2RlLCBsZXNza2V5IGlzICJ1c2VkIHRvCitzcGVjaWZ5IGEgc2V0IG9mIGtleSBiaW5kaW5ncyB0byBiZSB1c2VkIHdpdGggbGVzcyIsIGFuZCBjc2ggaXMgYSBzaGVsbCB0aGV5CitzdWNrZWQgaW4gKGV2ZW4gdGhvdWdoIHRoZXkgaGF2ZSBta3NoPyksIFsgaXMgYW4gYWxpYXMgZm9yIHRlc3QuIFNldmVyYWwgbW9yZSBic2QtaXNtcyB0aGF0IGRvbid0IGhhdmUgTGludXgKK2VxdWl2YWxlbnRzIChldmVuIGluIHRoZSB1YnVudHUgImluc3RhbGwgdGhpcyBwYWNrYWdlIiBzZWFyY2gpIGFyZQorZGlza2xhYmVsLCBmc2NrX2ZmcywgbW91bnRfZmZzLCBhbmQgcGZjdGwuIEFuZCB3aWNvbmZpZyBpcyBhCit3YXZlbGFuIGludGVyZmFjZSBuZXR3b3JrIGNhcmQgZHJpdmVyIHV0aWxpdHkuIFN1YnRyYWN0aW5nIGFsbCB0aGF0IGFuZCB0aGUKK2NvbW1hbmRzIHRveWJveCBhbHJlYWR5IGltcGxlbWVudHMgYXQgdHJpYWdlIHRpbWUsIHdlIGdldDo8L3A+CisKKzxibG9ja3F1b3RlPjxwPgorPHNwYW4gaWQ9YmVhc3RpZWJveF9jbWQ+CitmZGlzayBmc2NrIGdldHR5IGhhbHQgaWZjb25maWcgaW5pdCBraWxsIGxlc3MgbW9yZSBtb3VudCBtdiBwaW5nIHBvd2Vyb2ZmCitwcyByZWJvb3Qgcm91dGUgc2VkIHNoIHN0dHkgc3lzY3RsIHRhciB0ZXN0IHRyYWNlcm91dGUgdW1vdW50IHZpCis8L3NwYW4+Cis8L3A+PC9ibG9ja3F1b3RlPgorCis8cD5Ob3QgYSBodWdlbHkgaW50ZXJlc3RpbmcgbGlzdCwgYnV0IGVoLjwvcD4KKworPHA+VmVyZGljdDogaWdub3JlPC9wPgorCis8aHIgLz4KKzxhIG5hbWU9QnNkQm94IC8+Cis8aDI+QnNkQm94PC9oMj4KKworPHA+U29tZWJvZHkgZGVjaWRlZCB0byBkbyBhIDxhIGhyZWY9aHR0cHM6Ly93aWtpLmZyZWVic2Qub3JnL0FkcmlhbkNoYWRkL0JzZEJveD5tdWx0aWNhbGwgYmluYXJ5IGZvciBmcmVlYnNkPC9hPi48L3A+CisKKzxwPlRoZXkgYmFzZWQgaXQgb24gY3J1bmNoZ2VuLCBhIHRvb2wgdGhhdCBnbHVlcyBleGlzdGluZyBwcm9ncmFtcyB0b2dldGhlcgoraW50byBhbiBhcmNoaXZlIGFuZCB1c2VzIHRoZSBuYW1lIHRvIGV4ZWN1dGUgdGhlIHJpZ2h0IG9uZS4gSXQgaGFzIG5vCitzaW1wbGlmaWNhdGlvbiBvciBjb2RlIHNoYXJpbmcgYmVuZWZpdHMgd2hhdHNvZXZlciwgaXQncyBiYXNpY2FsbHkgYW4KK2FyY2hpdmVyIHRoYXQgcHJvZHVjZXMgZXhlY3V0YWJsZXMuPC9wPgorCis8cD5UaGF0J3MgYWJvdXQgd2hlcmUgSSBzdG9wcGVkIHJlYWRpbmcuPC9wPgorCis8cD5WZXJkaWN0OiBpZ25vcmUuPC9wPgorCis8aHIgLz4KKzxhIG5hbWU9c2xvd2FyaXMgLz4KKzxoMj5PcGVuU29sYXJpcyBCdXN5Ym94PC9oMj4KKworPHA+U29tZWJvZHkgPGEgaHJlZj1odHRwOi8vaHViLm9wZW5zb2xhcmlzLm9yZy9iaW4vdmlldy9Qcm9qZWN0K2J1c3lib3gvPndyb3RlCithIHdpa2kgcGFnZTwvYT4gc2F5aW5nIHRoYXQgQnVzeWJveCBmb3IgT3BlblNvbGFyaXMgd291bGQgYmUgYSBnb29kIGlkZWEuPC9wPgorCis8cD5UaGUgY29ycmVzcG9uZGluZyAiZmlsZXMiIHRhYiBpcyBhbiBhdXRvLWdlbmVyYXRlZCBzdHViLiBUaGUgcHJvamVjdCBuZXZlcgorZXZlbiBnb3QgYXMgZmFyIGFzIHN1Z2dlc3RpbmcgY29tbWFuZHMgdG8gaW5jbHVkZSBiZWZvcmUgT3JhY2xlIGRpc2NvbnRpbnVlZAorT3BlblNvbGFyaXMuPC9wPgorCis8cD5WZXJkaWN0OiBpZ25vcmUuPC9wPgorCis8aHIgLz4KKzxhIG5hbWU9dWNsaW51eCAvPgorPGgyPnVDbGludXg8L2gyPgorCis8cD5Mb25nIGFnbyBhIGhhcmR3YXJlIGRldmVsb3BlciBuYW1lZCBKZWZmIERpb25uZSBwdXQgdG9nZXRoZXIgYQorbm9tbXUgTGludXggZGlzdHJpYnV0aW9uLCB3aGljaCBpbnZvbHZlZCByZXdyaXRpbmcgYSBsb3Qgb2YgY29tbWFuZCBsaW5lCit1dGlsaXRpZXMgdGhhdCByZWxpZWQgb24gPGEgaHJlZj1odHRwOi8vbm9tbXUub3JnL21lbW9yeS1mYXEudHh0PmZlYXR1cmVzCit1bmF2YWlsYWJsZSBvbiBub21tdTwvYT4gaGFyZHdhcmUuPC9wPgorCis8cD5JbiAyMDAzIEplZmYgbW92ZWQgdG8gSmFwYW4gYW5kIGhhbmRlZAordGhlIHByb2plY3Qgb2ZmIHRvIHBlb3BsZSB3aG8gYWxsb3dlZCBpdCB0byByb2xsIHRvIGEgc3RvcC4gVGhlIHdlYnNpdGUKK3R1cm5lZCBpbnRvIGEgbWVzcyBvZiA0MDQgbGlua3MsIHRoZSBuYXZpZ2F0aW9uIGluZGV4ZXMgc3RvcHBlZCBiZWluZwordXBkYXRlZCBvdmVyIGEgZGVjYWRlIGFnbywgYW5kIHRoZSBwcm9qZWN0J3MgQ1ZTIHJlcG9zaXRvcnkgc3VmZmVyZWQgYQoraGFyZCBkcml2ZSBmYWlsdXJlIGZvciB3aGljaCB0aGVyZSB3ZXJlIG5vIGJhY2t1cHMuIFRoZSBwcm9qZWN0IGNvbnRpbnVlZAordG8gcHV0IG91dCAicmVsZWFzZXMiIHRocm91Z2ggMjAxNCAoeW91IGhhdmUgdG8gc2Nyb2xsIGRvd24gaW4gdGhlICJuZXdzIgorc2VjdGlvbiB0byBmaW5kIHRoZW0sIHRoZSAiSFRUUCBkb3dubG9hZCIgc2VjdGlvbiBpbiB0aGUgbmF2IGJhciBvbiB0aGUKK2xlZnQgaGFzbid0IGJlZW4gdXBkYXRlZCBpbiBvdmVyIGEgZGVjYWRlKSwgd2hpY2ggd2VyZSBoYW5kLXVwZGF0ZWQgdGFyYmFsbAorc25hcHNob3RzIG1vc3RseSBjb25zaXN0aW5nIG9mIHNvZnR3YXJlIGZyb20gdGhlIDE5OTAncy4gRm9yIGV4YW1wbGUgdGhlCisyMDE0IHJlbGVhc2Ugc3RpbGwgY29udGFpbmVkIGlwZndhZG0sIHRoZSBwYWNrYWdlIHdoaWNoIHByZWRhdGVkIGlwY2hhaW5zLAord2hpY2ggcHJlZGF0ZWQgaXB0YWJsZXMsIHdoaWNoIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlcGxhY2VkIGJ5CituZnRhYmxlcy48L3A+CisKKzxwPk5ldmVydGhlbGVzcywgcGVvcGxlIHN0aWxsIHRyeSB0byB1c2UgdGhpcyBiZWNhdXNlIChhdCBsZWFzdCB1bnRpbCB0aGUKK2xhdW5jaCBvZiA8YSBocmVmPWh0dHA6Ly9ub21tdS5vcmc+bm9tbXUub3JnPC9hPikgdGhlIHByb2plY3Qgd2FzIHZpZXdlZAorYXMgdGhlIHBsYWNlIHRvIGRpc2N1c3MsIGRldmVsb3AsIGFuZCBsZWFybiBhYm91dCBub21tdSBMaW51eC4KK1RoZSByb2xlIG9mIHVjbGludXgub3JnIGFzIGFuIGVkdWNhdGlvbmFsIHJlc291cmNlIGtlcHQgcGVvcGxlIGNvbWluZwordG8gaXQgbG9uZyBhZnRlciBpdCBoYWQgY29sbGFwc2VkIGFzIGEgTGludXggZGlzdHJvLjwvcD4KKworPHA+U3RhcnRpbmcgYXJvdW5kIDAuNi4wIHRveWJveCBiZWdhbiB0byBhZGRyZXNzIG5vbW11IHN1cHBvcnQgd2l0aCB0aGUgZ29hbAorb2YgcHV0dGluZyB1Q2xpbnV4IG91dCBvZiBpdHMgbWlzZXJ5LjwvcD4KKworPHA+QW4gYW5hbHlzaXMgb2YgPGEgaHJlZj1odHRwOi8vd3d3LnVjbGludXgub3JnL3B1Yi91Q2xpbnV4L2Rpc3QvdUNsaW51eC1kaXN0LTIwMTQwNTA0LnRhci5iejI+dUNsaW51eC1kaXN0LTIwMTQwNTA0PC9hPiBmb3VuZCAzMTIgcGFja2FnZQorc3ViZGlyZWN0b3JpZXMgdW5kZXIgInVzZXIiLjwvcD4KKworPGgzPlRha2luZyBvdXQgdGhlIHRyYXNoPC9oMz4KKworPHA+QSBidW5jaCBvZiBwYWNrYWdlcyAoPGI+aW5vdGlmeS10b29scywgaW5wdXQtZXZlbnQtZGVtb24sIGlwc2VjLXRvb2xzLCBuZXRpZmQsCitrZWVwYWxpdmVkLCBtb2JpbGUtYnJvYWRiYW5kLXByb3ZpZGVyLWluZm8sIG51dHRwLCByZWFkbGluZSwgc25vcnQsCitzbm9ydC1iYXJueWFyZCwgc29jYXQsIHNxbGl0ZSwgc3lza2xvZ2QsIHN5c3N0YXQsIHRjbCwgdWJ1cywgdWNpLCB1ZGV2LAordW5pb25mcywgdXFtaSwgdXNiX21vZGVzd2l0Y2gsIHVzYnV0aWxzLCB1dGlsLWxpbnV4PC9iPikKK2FyZSBoYXJkIHRvIGV2YWx1YXRlIGJlY2F1c2UKK3VjbGludXggaGFzIGRpcmVjdG9yaWVzIGZvciB0aGVtLCBidXQgdGhlaXIgc291cmNlIGlzbid0IGFjdHVhbGx5IGluIHRoZQordWNsaW51eCB0cmVlLiBJbiBzb21lIG9mIHRoZXNlIHRoZSBtYWtlZmlsZXMgZG93bmxvYWQgYSBnaXQgcmVwbyBkdXJpbmcKK3RoZSBidWlsZCwgc28gSSdtIGFzc3VtaW5nIHlvdSBjYW4gYnVpbGQgdGhlIGV4dGVybmFsIHBhY2thZ2UgaWYgeW91IHJlYWxseQorY2FyZS4gKEV2ZW4gd2hlbiBJIGtub3cgd2hhdCB0aGVzZSBwYWNrYWdlcyBkbywgSSdtIHNraXBwaW5nIHRoZW0KK2JlY2F1c2UgdWNsaW51eCBkb2Vzbid0IGFjdHVhbGx5IGNvbnRhaW4gdGhlbSwgYW5kIGFueSBnaXZlbiBzbmFwc2hvdAorb2YgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsIGJpdHJvdCBhcyBleHRlcm5hbCB3ZWIgbGlua3MgY2hhbmdlIG92ZXIgdGltZS4pPC9wPgorCis8cD5PdGhlciBwYWNrYWdlcyBhcmUgb3JwaGFuZWQsIG1lYW5pbmcgdGhleSdyZSBub3QgbWVudGlvbmVkIGZyb20gYW55IEtjb25maWcKK29yIE1ha2VmaWxlcyBvdXRzaWRlIG9mIHRoZWlyIGRpcmVjdG9yeSwgc28gdWNsaW51eCBjYW4ndCBhY3R1YWxseSBidWlsZAordGhlbTogPGI+bWJ1czwvYj4gaXMgYW4gb3JwaGFuZWQgaTJjIHRlc3QgcHJvZ3JhbSBleHBlY3RpbmcgdG8gcnVuIGluIHNvbWUgc29ydAorb2YgaGFyZHdpcmVkIGhhcmR3YXJlIGNvbnRleHQsIDxiPm1rZWNjYmluPC9iPiBpcyBhbiBvcnBoYW5lZCAiRUNDIGFubm90YXRlZAorYmluYXJ5IGZpbGUiIGdlbmVyYXRvciAobWVhbmluZyBpdCdzIGhhbGYgb2YgYSBmbGFzaCB3cml0ZXIpLAorPGI+d3NjX3VwbnA8L2I+IGlzIGEgIlJhbGluayBXUFMiIGRyaXZlciAoc29tZSBzb3J0IG9mIHN0YWxlIHdpZmkgY2hpcCkuLi48L3A+CisKKzxwPlRoZSBtYWpvcml0eSBvZiB0aGUgcmVtYWluaW5nIHBhY2thZ2VzIGFyZSBwcm9iYWJseSBub3Qgb2YgaW50ZXJlc3QgdG8KK3RveWJveCBkdWUgdG8gYmVpbmcgc28gb2Jzb2xldGUgb3Igc3BlY2lhbCBwdXJwb3NlIHRoZXkgbWF5IG5vdCBhY3R1YWxseSBiZQorb2YgaW50ZXJlc3QgdG8gYW55Ym9keSBhbnltb3JlLiAoVGhpcyBsaXN0IGFsc28gaW5jbHVkZXMgYSBsb3Qgb2YKK3NwZWNpYWwtcHVycG9zZSBuZXR3b3JrIGJhY2stZW5kIHN0dWZmIHRoYXQncyBoYXJkIGZvciBhbnlib2R5IGJ1dAorZGF0YWNlbnRlciBhZG1pbnMgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgcmVsZXZhbmNlIG9mLik8L3A+CisKKzxibG9ja3F1b3RlPjxiPjxwPgorYXJqIGFzdGVyaXNrIGJvb3R0b29scyBicGFsb2dpbiBicjI2ODRjdGwgY2Ftc2VydiBjYW40bGludXggY2dpX2dlbmVyaWMKK2NnaWh0bWwgY2xhbWF2IGNsYW1zbXRwIGNvbm50cmFjay10b29scyBjcmFtZnMgY3J5cHRvLXRvb2xzIGN4eHRlc3QKK2RkbnMzLWNsaWVudCBkZTJ0cy1jYWwgZGVidWcgZGVtbyBkaWFsZCBkaXNjYXJkIGRuc21hc3EgZG5zbWFzcTIKK2V0aGF0dGFjaCBleHBhdC1leGFtcGxlcyBlei1pcHVwZGF0ZSBmYWtlaWRlbnRkCitmY29uZmlnIGZlcnJldCBmbGF0ZnMgZmx0aGRyIGZyZWVyYWRpdXMgZnJlZXN3YW4gZnJvYi1sZWQgZnJveCBmc3djZXJ0CitnYW1lIGdldHR5ZCBnbnVnayBoYXNlcmwgaG9yY2gKK2hvc3RhcCBocGluZyBodHRwdHVubmVsIGlmYXR0YWNoIGlwY2hhaW5zCitpcGZ3YWRtIGlwbWFzcWFkbSBpcHBvcnRmdyBpcHJlZGlyIGlwc2V0IGlzb19jbGllbnQKK2phbXZtIGpmZnMtdG9vbHMganBlZ3ZpZXcganF1ZXJ5LXVpIGtlbmRpbi1jb25maWcga2lzbWV0IGtsYXhvbiBrbW9kCitsMnRwZCBsY2QgbGVkY21kIGxlZGNvbiBsaGEgbGlsbyBsaXJjIGxpc3NhIGxvYWQgbG9hdHRhY2gKK2xwciBscnBzdGF0IGxyenN6IG1haWwgbWJ1cyBtZ2V0dHkgbWljcm93aW4gTW9kZW1NYW5hZ2VyIG1zbnRwIG11c2ljYm94Citub29vbSBudWxsIG9wZW5zd2FuIG9wZW52cG4gcGFsbWJvdCBwYW1fKiBwY21jaWEtY3MgcGxheXJ0IHBsdWdkYWVtb24gcG9wM3Byb3h5Citwb3RyYWNlIHFzcGl0ZXN0IHF1YWdnYSByYWRhdXRoCityYW1pbWFnZSByZWFkcHJvZmlsZSByZGF0ZSByZWFkcHJvZmlsZSByb3V0ZWQgcnJkdG9vbCBydGMtZHMxMzAyCitzZW5kaXAgc2VyIHNldGhkbGMgc2V0bWFjIHNldHNlcmlhbCBzZ3V0b29sIHNpZ3Mgc2lwcm94ZCBzbGF0dGFjaAorc210cGNsaWVudCBzbm1wZCBuZXQtc25tcCBzbm9ydHJ1bGVzIHNwZWVkdG91Y2ggc3F1YXNoZnMgc2NlcCBzc2x3cmFwIHN0cAorc3R1bm5lbCB0Y3BibGFzdCB0Y3BkdW1wIHRjcHdyYXBwZXJzIHRocmVhZGRlbW9zIHRpbnlsb2dpbiB0aW55cHJveHkKK3RwdCB0cmlwd2lyZSB1bnJhciB1bnpvbyB2ZXJzaW9uIHZwbmxlZCB3M2NhbSB4bDJ0cGQgemVicmEKKzwvcD48L2I+PC9ibG9ja3F1b3RlPgorICAgIAorPHA+VGhpcyBzdHVmZiBpcyBhbGwgb3ZlciB0aGUgcGxhY2U6IGFyaiwgbGhhLCByYXIsIGFuZCB6b28gYXJlIERPUyBhcmNoaXZlcnMsCitldGhhdHRhY2ggZGVzY3JpYmVzIGl0c2VsZiBhcyBqdXN0ICJhIG5ldHdvcmsgdG9vbCIsCittYWlsIGlzIGEgdGV4dG1vZGUgc210cCBtYWlsZXIgbGl0ZXJhbGx5IGRlc2NyaWJlZCBhcyAiU29tZSBraW5kIG9mIG1haWwKK3Byb2dneSIgaW4gdWNsaW51eCdzIGtjb25maWcgKGFzIG9wcG9zZWQgdG8gY2xhbXNtdHAgYW5kIHNtdHBjbGllbnQgYW5kCitzbyBvbiksIHRoaXMgZ2V0dHlkIGlzbid0IGEgZ2VuZXJpYyB2ZXJzaW9uIGJ1dCBzcGVjaWZpY2FsbHkgYQoraGFyZHdpcmVkIHBwcCBkaWFsaW4gdXRpbGl0eSwgbWdldHR5IGlzbid0IGEgZ2VuZXJpYyB2ZXJzaW9uIGJ1dCBpcyBjb21iaW5lZAord2l0aCAic2VuZGZheCIsIGhvc3RhcCBpcyBhbiBpbnRlcnNpbCBwcmlzbSBkcml2ZXIsIHdsYW4tbmcgaXMgYWxzbyBhbgoraW50ZXJzaWwgcHJpc20gZGlydmVyLCBudWxsIGlzIGEgcHJvZ3JhbSB0byBpbnRlbnRpb25hbGx5IGRlcmVmZXJlbmNlIGEKK251bGwgcG9pbnRlciAoaW4gY2FzZSB5b3UgbmVlZGVkIG9uZSksIGlzb19jbGllbnQgaXMgYQorIkRlbW8gQXBwbGljYXRpb24gZm9yIHRoZSBVU0IgRGV2aWNlIERyaXZlciIsIGtlbmRpbi1jb25maWcgaXMKKyJmb3IgY29uZmlndXJpbmcgdGhlIE1pY3JlbCBLZW5kaW4gS1M4OTk1TSBvdmVyIFFTUEkiLCBzcGVlZHRvdWNoIGNvbmZpZ3VyZXMKK2Egc3BlY2lmaWMgYnJhbmQgb2YgYXNkbCBtb2RlbSwgcG9ydG1hcCBpcyBwYXJ0IG9mIEFuZnMsCitmZXJyZXQsIGxpbnV4LWlnZCwgYW5kIG1pbml1cG5wIGFyZSBhbGwgdXBucCBwYWNrYWdlcywKK2xhbmJ5cGFzcyAiY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgTEFOCitieXBhc3Mgc3dpdGNoZXMgb24gdGhlIEFkdmFudGVjaCB4ODYgYmFzZWQgaGFyZHdhcmUgcGxhdGZvcm1zIiwgbGNkIGlzCisidGVzdCBvZiBsY2RkbWEgZGV2aWNlIGRyaXZlciIgKGFuIG91dC1vZi10cmVlIENvbGRmaXJlIGRyaXZlciBhcHBhcmVudGx5Citsb3N0IHRvIGhpc3RvcnksIHRoZSB1Y2xpbnV4IGxpbnV4LTIuNC54IGRpcmVjdG9yeSBoYXMgYSBjb25maWcgc3ltYm9sIGZvcgoraXQsIGJ1dCBub3RoaW5nIGluIHRoZSBjb2RlIGFjdHVhbGx5IF91c2VzXyBpdC4uLiksIHFzcGl0ZXN0IGlzIGFub3RoZXIKK2NvbGRmaXJlIHRoaW5nLCBtaWktdG9vbC1mZWMgaXMKKyJzdHJpY3RseSBmb3IgdGhlIEZFQyBFdGhlcm5ldCBkcml2ZXIgYXMgaW1wbGVtZW50ZWQgKGFuZCBtb2RpZmllZCkgZm9yCit0aGUgdUNkaW1tNTI3MiIsIHJ0Yy1kczEzMDIgYW5kIHJ0Yy1tNDF0MTEgYXJlIHVzZXJtb2RlIGRyaXZlcnMgZm9yIHNwZWNpZmljCitjbG9jayBjaGlwcywgc3R1bm5lbCBpcyBiYXNpY2FsbHkgIm9wZW5zc2wgc19jbGllbnQgLXF1aWV0IC1jb25uZWN0IiwKK3BvdHJhY2UgaXMgYSBiaXRtYXAgdG8gdmVjdG9yIGdyYXBoaWMgY29udmVydGVyLCByYWRhdXRoIHBlcmZvcm1zIGNvbW1hbmQgbGluZQorYXV0aGVudGljYXRpb24gYWdhaW5zdCBhIHJhZGl1cyBzZXJ2ZXIsCitjbGFtYXYsIGtsYXhvbiwgZmVycmV0LCBsNy1wcm90b2NvbHMsIGFuZCBuZXNzdXMgYXJlIHZlcnkgb2xkIG5ldHdvcmsgc2VjdXJpdHkKK3NvZnR3YXJlIChpdCdzIGdvdCBhIHN0YWxlIHNuYXBzaG90IG9mIG5tYXAgdG9vKSwgeGwydHBkIGlzIGEgUFBQIG92ZXIgVURQCit0dW5uZWwgKHJmYyAyNjYxKSwgemVicmEgaXMgdGhlIHBhY2thZ2UgcXVhZ2dhIHJlcGxhY2VkLAorbGlsbyBpcyB0aGUgeDg2LW9ubHkgYm9vdGxvYWRlciB0aGF0IHByZWRhdGVkIGdydWIgKGFuZCByZWNlbnRseSBkaXNjb250aW51ZWQKK2RldmVsb3BtZW50KSwgbGlzc2EgaXMgYSAiZnJhbWVidWZmZXIgZ3JhcGhpY3MgZGVtbyIgZnJvbQorMTk5OCwgdGhlIHNxdWFzaGZzIHBhY2thZ2UgaGVyZSBpcyB0aGUgb3V0IG9mIHRyZWUgcGF0Y2hlcyBmb3IgMi40IGtlcm5lbHMKK2FuZCBzdWNoIGJlZm9yZSB0aGUgZmlsZXN5c3RlbSB3YXMgbWVyZ2VkIHVwc3RyZWFtIChhcyBvcHBvc2VkIHRvIHRoZQorc3F1YXNoZnMtbmV3IHBhY2thZ2Ugd2hpY2ggaXMgYSBzbmFwc2hvdCBvZiB0aGUgdXNlcnNwYWNlIHRvb2wgZnJvbSAyMDExKSwKK2xvYWQgaXMgYmFzaWNhbGx5ICJkZCBmaWxlIC9kZXYvc3BpIiwgdmVyc2lvbiBpcyBiYXNpY2FsbHkgImNhdCAvcHJvYy92ZXJzaW9uIiwKK21pY3Jvd2luIGlzIGEgcG9ydCBvZiB0aGUgV2luQ0UgZ3JhcGhpY3MgQVBJIHRvIExpbnV4LCBzY2VwIGlzIGEgMjAwMworaW1wbGVtZW50YXRpb24gb2YgYW4gSUVURiBkcmFmdCBhYmFuZG9uZWQgaW4gMjAxMCwgdHB0IGRlcGVuZHMgb24KK0FuZHJldyBNb3J0b24ncyAxNSB5ZWFyIG9sZCB1bm1lcmdlZCAidGltZXBlZ3MiIGtlcm5lbCBwYXRjaCB1c2luZyB0aGUgcGVudGl1bQorY3ljbGUgY291bnRlciwgdnBubGVkIGNvbnRyb2xzIGEgbGlnaHQgdGhhdCByZWJvb3RzIHN5c3RlbXMgKHdoYXQ/KSwKK3czY2FtIGlzIGEgdmlkZW80bGludXggMS4wIGNsaWVudCAodjRsMiBzaG93ZWQgdXAgZHVyaW5nIDIuNSBhbmQgc3VwcG9ydCBmb3IKK3RoZSBvbGQgdjRsMSB3YXMgcmVtb3ZlZCBpbiAyLjYuMzggYmFjayBpbiAyMDExKSwgYnVzeWJveCBhdGUgdGlueWxvZ2luCitvdmVyIGEgZGVjYWRlIGFnbywgbHJwc3RhdCBpcyBhIGphdmEgbmV0d29yayBtb25pdG9yCitmcm9tIDIwMDEsIGxyenN6IGlzIHptb2RlbS95bW9kZW0vem1vZGVtLCBtc250cCBhbmQgc3RwIGltcGxlbWVudCByZmMyMDMwCittZWFuaW5nIGl0IG92ZXJmbG93cyBpbiAyMDM2ICh0aGUgcGFja2FnZSB3YXMgbGFzdCB1cGRhdGVkIGluIDIwMDApLCByZGF0ZQoraXMgcmZjIDg2OCBtZWFuaW5nIGl0IGFsc28gb3ZlcmZsb3dzIGluIDIwMzYgKHdoaWNoIGlzIHdoeSBudHAgd2FzIGludmVudGVkCithIGZldyBkZWNhZGVzIGJhY2spLCByZWlzZXJmc3Byb2dzIGRldmVsb3BtZW50IHN0b3BwZWQgYWJydXB0bHkgYWZ0ZXIKK0hhbnMgUmVpc2VyIHdhcyBjb252aWN0ZWQgb2YgbXVyZGVyaW5nIGhpcyB3aWZlIE5pbmEgKGRlbnlpbmcgaXQgb24gdGhlCitzdGFuZCBhbmQgdGhlbiBsZWFkaW5nIHRoZW0gdG8gdGhlIGJvZHkgYXMgcGFydCBvZiBoaXMgcGxlYSBiYXJnYWluIGR1cmluZworc2VudGVuY2luZykuLi4KKzwvcD4KKworPHA+U2VyaW91c2x5LCB0aGVyZSdzIGEgbG90IG9mIGNyYXAgaW4gdGhlcmUuIEl0J3MgaGFyZCB0byBhbmFseXplIG1vc3QKK29mIGl0IGZhciBlbm91Z2ggdG8gcHJvdmUgaXQgX2RvZXNuJ3RfIGRvIGFueXRoaW5nLjwvcD4KKworPGgzPk5vbi10b3lib3ggcHJvZ3JhbXM8L2gzPgorCis8cD5UaGUgZm9sbG93aW5nIHNvZnR3YXJlIG1heSBhY3R1YWxseSBzdGlsbCBkbyBzb21ldGhpbmcgaW50ZWxsaWdpYmxlCisoYWx0aG91Z2ggdGhlIHBhY2thZ2UgdmVyc2lvbnMgdGVuZCB0byBiZSB5ZWFycyBvdXQgb2YgZGF0ZSksIGJ1dAoraXQncyBub3QgYSBkaXJlY3Rpb24gdG95Ym94IGhhcyBjaG9zZW4gdG8gZ28gaW4uPC9wPgorCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCBwcm9ncmFtbWluZyBsYW5ndWFnZXMgKDxiPmJhc2gsIGx1YSwgamFtdm0sIHRpbnl0Y2wsCitwZXJsLCBweXRob248L2I+KSBpbiB0aGVyZS4gTWF5YmUgc29tZW9uZSBzb21ld2hlcmUgd2FudHMgYSAyMDA4IHJlbGVhc2Ugb2YgYQoramF2YSB2aXJ0dWFsIG1hY2hpbmUgdGVzdGVkIHRvIHdvcmsgb24gbm9tbXUgc3lzdGVtcyAoamFtdm0pLCBidXQgaXQncyBvdXQKK29mIHNjb3BlIGZvciB0b3lib3guPC9wPgorCis8cD5BIGJ1bmNoIG9mIGJlbmNobWFyayBwcm9ncmFtczogPGI+Y3B1LCBkaHJ5c3RvbmUsIG1hdGh0ZXN0LCBuYmVuY2gsIG5ldHBlcmYsCituZXRwaXBlLCBhbmQgd2hldHN0b25lPC9iPi48L3A+CisKKzxwPkEgYnVuY2ggb2Ygd2ViIHNlcnZlcnM6IDxiPmFwcFdlYiwgYm9hLCBmbm9yZCAodmlhIHRjcHNlcnZlciksIGdvYWhlYWQsIGh0dHBkLAorbWluaV9odHRwZCwgYW5kIHRodHRwZDwvYj4uPC9wPgorCis8cD5BIGJ1bmNoIG9mIHNoZWxsczogPGI+bXNoPC9iPiBpcyBhIGNsZXZlciAoSS5FLiBvYmZ1c2NhdGVkKSBsaXR0bGUgc2hlbGwsCis8Yj5ud3NoPC9iPiBpcyAibmV3IHNoZWxsIiAodGhhdCdzIHdoYXQgaXQgY2FsbGVkIGl0c2VsZiBpbiAxOTk5IGFueXdheSksCis8Yj5zYXNoPC9iPiBpcyBhbm90aGVyIHNoZWxsIHdpdGggYSBidW5jaCBvZiBidWlsdGlucyAobHMsIHBzLCBkZiwgY3AsIGRhdGUsIHJlYm9vdCwKK2FuZCBzaHV0ZG93biwgdGhpcyByb2FkbWFwIGFuYWx5emVzIGl0IDxhIGhyZWY9IiNzYXNoIj5lbHNld2hlcmU8L2E+KSwKKzxiPnNoPC9iPiBpcyBhIHZlcnkgb2xkIG1pbml4IHNoZWxsIGZvcmssIGFuZCA8Yj50Y3NoPC9iPiBpcyBhbHNvIGEgc2hlbGwuPC9wPgorCis8cD5BbHNvIGluIHRoaXMgY2F0ZWdvcnksIHdlIGhhdmU6PC9wPgorCis8YmxvY2txdW90ZT48Yj48cD4KK2Ryb3BiZWFyIGpmZnMtdG9vbHMganBlZ3ZpZXcga2V4ZWMtdG9vbHMgYmluZCBjdG9ycmVudAoraXBlcmYgaXByb3V0ZTIgaXAtc2VudGluZWwgaXB0YWJsZXMga2V4ZWMKK25tYXAgb2dncGxheSBvcGVuc3NsIG9wcm9maWxlIHA3emlwIHBwcGQgcHB0cCBwbGF5IHZwbGF5CitoZHBhcm0gbXAzcGxheSBhdCBjbG9jaworbXRkLXV0aWxzIG15c3FsIGxvZ3JvdGF0ZSBicmNmZyBicmlkZ2UtdXRpbHMgZmxhc2h3CitlYnRhYmxlcyBldGhlcndha2UgZXRodG9vbCBleHBlY3QgZ2RiIGdkYnNlcnZlciBob3N0YXBkCitsbV9zZW5zb3JzIGxvYWQgbmV0Zmxhc2ggbmV0c3RhdC1uYXQKK3JhZHZkIHJlY292ZXIgcm9vdGxvYWRlciByZXNvbHZlaXAgcnAtcHBwb2UKK3JzeXNsb2cgcnN5c2xvZ2Qgc2FtYmEgc21ibW91bnQgc3F1YXNoZnMtbmV3IHNxdWlkIHNzaCBzdHJhY2UgdGlwCit1Ym9vdC1lbnZ0b29scyB1bG9nZCB1c2JodWJjdHJsIHZjb25maWcgdml4aWUtY3JvbiB3YXRjaGRvZ2QKK3dpcmVsZXNzX3Rvb2xzIHdwYV9zdXBwbGljYW50Cis8L3A+PC9iPjwvYmxvY2txdW90ZT4KKworPHA+QW4gYXdmdWwgbG90IG9mIHRob3NlIGFyZSBib3JkZXJsaW5lOiBwbGF5IGFuZCB2cGxheSBhcmUgd2F2IGZpbGUKK2F1ZGlvIHBsYXllcnMsIHRoZXJlJ3Mgb3Byb2ZpbGUgX2FuZF8gcmVhZHByb2ZpbGUgKHdoaWNoIGp1c3QgcmVhZHMga2VybmVsCitwcm9maWxpbmcgZGF0YSBmcm9tIC9wcm9jL3Byb2ZpbGUpLAorcmFkdmQgaXMgYSAicm91dHIgYWR2ZXJ0aXNlbWVudCBkYWVtb24iIChpcHY2IHN0YXRlbGVzcyBhdXRvY29uZiksCitjdG9ycmVudCBpcyBhIGJpdHRvcmVudCBjbGllbnQsIAorbG1fc2Vuc29ycyBpcyBoYXJkd2FyZSAoaGVhdD8pIG1vbml0b3JpbmcsCityZXNvbHZlaXAgaXMgZGlnIG9ubHkgbGVzcyBzbywKK3JwLXBwcG9lIGlzIHBwcCBvdmVyIGV0aGVybmV0LAorZWJ0YWJsZXMgaXMgYW4gZXRoZXJuZXQgdmVyc2lvbiBvZiBpcHRhYmxlcyAoZm9yIGJyaWRnaW5nKSwKK3RoZWlyIGRyb3BiZWFyIGlzIGZyb20gMjAxMiwgYW5kIHRoYXQgc3NoIHZlcnNpb24gaXMgZnJvbSAyMDExCisod2hpY2ggbWVhbnMgaXQncyBhYm91dCBuaW5lIG1vbnRocyB0b28gX29sZF8gdG8gaGF2ZSB0aGUgaGVhcnRibGVlZCBidWcpLgorVGhlcmUncyBib3RoIHVsb2dkIGFuZCB1bG9nZDIgKG5vIGlkZWEgd2h5KSwgYW5kIHBwcGQgaXMgdmVyc2lvbiAyLjQgYnV0Cit0aGVyZSdzIGEgcHBkLTIuMyBkaXJlY3RvcnkgYWxzby48L3A+CisKKzxwPkxvdHMgb2YgZmxhc2ggc3R1ZmY6CitmbGFzaHcgaXMgYSBmbGFzaCB3cml0ZXIsIGxvYWQgaXMgYW4gc3BpIGZsYXNoIGxvYWRlciwgbmV0Zmxhc2ggd3JpdGVzCit0byBmbGFzaCB2aWEgdGZ0cCwKK3JlY292ZXIgaXMgYWxzbyBhIHJlZmxhc2ggZGFlbW9uIGludGVuZGVkIHRvIGNvbWUgdXAgd2hlbiB0aGUgc3lzdGVtIGNhbid0IGJvb3QsCityb290bG9hZGVyIHNlZW1zIHRvIGJlIGFub3RoZXIgcmVmbGFzaCBkYWVtb24gYnV0IHdpdGhvdXQgZGhjcC48L3A+CisKKzxoMz5BbHJlYWR5IGluIHJvYWRtYXA8L2gzPgorCis8cD5UaGUgZm9sbG93aW5nIHBhY2thZ2VzIGNvbnRhaW4gY29tbWFuZHMgYWxyZWFkeSBpbiB0aGUgdG95Ym94IHJvYWRtYXA6PC9wPgorCis8YmxvY2txdW90ZT48Yj48cD4KK2FnZXR0eSBjYWwgY2tzdW0gY3JvbiBkaGNwY2QgZGhjcGNkLW5ldyBkaGNwZCBkaGNwLWlzYyBkb3Nmc3Rvb2xzIGUyZnNwcm9ncworZWx2aXMtdGlueSBsZXZlZSBmZGlzayBmaWxldXRpbHMgZnRwIGZ0cGQgZ3JlcCBoZCBod2Nsb2NrIGluZXRkIGluaXQgbnRwCitpcHV0aWxzIGxvZ2luIG1vZHVsZS1pbml0LXRvb2xzIG5ldGNhdCBzaHV0aWxzIG50cGRhdGUgbHNwY2kgcGluZyBwcm9jcHMKK3Byb2Z0cGQgcnN5bmMgc2hhZG93IHNodXRpbHMgc3R0eSBzeXN1dGlscyB0ZWxuZXQgdGVsbmV0ZCB0ZnRwIHRmdHBkIHRyYWNlcm91dGUKK3VuemlwIHdnZXQgbWF3ayBuZXQtdG9vbHMKKzwvcD48L2I+PC9ibG9ja3F1b3RlPgorCis8cD5UaGVyZSBhcmUgc29tZSBkdXBsaWNhdGVzIGluIHRoZXJlLCBsZXZlZSBpcyBhIHRpbnkgdmkgaW1wbGVtZW50YXRpb24KK2xpa2UgZWx2aXMtdGlueSwgbnRwIGFuZCBudHBkYXRlIG92ZXJsYXAsIGV0Yy48L3A+CisKKzxwPlZlcmRpY3Q6IFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGRvIGEgd2hvbGUgbG90IHNwZWNpYWwgZm9yIG5vbW11CitzeXN0ZW1zLCBqdXN0IGdldCB0aGUgZXhpc3RpbmcgdG95Ym94IHJvYWRtYXAgd29ya2luZyBvbiBub21tdSBhbmQKK3dlJ3JlIGdvb2QuIFRoZSB1Q2xpbnV4IHByb2plY3QgY2FuIHJlc3QgaW4gcGVhY2UuPC9wPgorCis8aHIgLz4KKzxoMj5SZXF1ZXN0czo8L2gyPgorCis8cD5UaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29tbWFuZHMgaGF2ZSBiZWVuIHJlcXVlc3RlZCAoYW5kIG9mdGVuIHN1Ym1pdHRlZCkKK2J5IHZhcmlvdXMgdXNlcnMuIEkgX3JlYWxseV8gbmVlZCB0byBjbGVhbiB1cCB0aGlzIHNlY3Rpb24uPC9wPgorCis8cD5BbHNvOjwvcD4KKzxibG9ja3F1b3RlPjxiPgorPHNwYW4gaWQ9cmVxdWVzdD4KK2RpZyBmcmVlcmFtZGlzayBnZXR0eSBoYWx0IGhleGR1bXAgaHdjbG9jayBrbG9nZCBtb2Rwcm9iZSBwaW5nIHBpbmc2IHBpdm90X3Jvb3QKK3Bvd2Vyb2ZmIHJlYWRhaGVhZCByZXYgc2ZkaXNrIHN1ZG8gc3lzbG9nZCB0YXNrc2V0IHRlbG5ldCB0ZWxuZXRkIHRyYWNlcGF0aAordHJhY2Vyb3V0ZSB1bnppcCB1c2xlZXAgdmNvbmZpZyB6aXAgZnJlZSBsb2dpbiBtb2RpbmZvIHVuc2hhcmUgbmV0Y2F0IGhlbHAgdworbnRwZCBpd2NvbmZpZyBpd2xpc3QgcmRhdGUKK2RvczJ1bml4IHVuaXgyZG9zIGNhdHYgY2xlYXIKK3BtYXAgcmVhbHBhdGggc2V0c2lkIHRpbWVvdXQgdHJ1bmNhdGUKK21rc3dhcCBzd2Fwb24gc3dhcG9mZgorY291bnQgb25laXQgZnN0eXBlCithY3BpIGJsa2lkIGVqZWN0IHB3ZHgKK3N1bG9naW4gcmZraWxsIGJvb3RjaGFydGQKK2FycCBtYWtlZGV2cyBzeXNjdGwga2lsbGFsbDUgY3JvbmQgY3JvbnRhYiBkZWx1c2VyIGxhc3QgbWtwYXNzd2Qgd2F0Y2gKK2Jsb2NrZGV2IHJwbTJjcGlvIGFycGluZyBicmN0bCBkdW1wbGVhc2VzIGZzY2sKK3RjcHN2ZCB0ZnRwZAorZmFjdG9yIGZhbGxvY2F0ZSBmc2ZyZWV6ZSBpbm90aWZ5ZCBsc3BjaSBuYmQtY2xpZW50IHBhcnRwcm9iZSBzdHJpbmdzCitiYXNlNjQgbWl4CityZXNldCBoZXhlZGl0IG5zZW50ZXIgc2hyZWQKK2ZzeW5jIGluc21vZCBpb25pY2UgbHNtb2QgbHN1c2Igcm1tb2Qgdm1zdGF0IHh4ZCBpb3RvcAorbHNvZiBpb25pY2UgY29tcHJlc3MgZGhjcCBkaGNwZCBhZGRncm91cCBkZWxncm91cCBob3N0IGljb252IGlwCitpcGNybSBpcGNzIG5ldHN0YXQgb3BlbnZ0CitkZWFsbG9jdnQgaW9yZW5pY2UKK3VkcHN2ZCBhZGR1c2VyCis8L3NwYW4+Cis8L2I+PC9ibG9ja3F1b3RlPgorCis8IS0tICNpbmNsdWRlICJmb290ZXIuaHRtbCIgLS0+CisKZGlmZiAtLWdpdCBhL3RveWJveC93d3cvc3RhdHVzLmh0bWwgYi90b3lib3gvd3d3L3N0YXR1cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhMWE1ODUKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvd3d3L3N0YXR1cy5odG1sCkBAIC0wLDAgKzEsOSBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPnRveWJveCBjdXJyZW50IHN0YXR1czwvdGl0bGU+Cis8IS0tI2luY2x1ZGUgZmlsZT0iaGVhZGVyLmh0bWwiIC0tPgorPHRpdGxlPlRveWJveCBTdGF0dXM8L3RpdGxlPgorCis8IS0tI2luY2x1ZGUgZmlsZT0ic3RhdHVzLmdlbiIgLS0+CisKKzxwPlNlZSB0aGUgPGEgaHJlZj1yb2FkbWFwLmh0bWw+Um9hZG1hcCBwYWdlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisKKzwhLS0gI2luY2x1ZGUgImZvb3Rlci5odG1sIiAtLT4KZGlmZiAtLWdpdCBhL3RveWJveC93d3cvdG95Y2Fucy5wbmcgYi90b3lib3gvd3d3L3RveWNhbnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi90b3lib3gvd3d3L3RveWNhbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIK