LyoKICogSGVscCBWaWV3ZXIKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKICogUG9ydHVndWVzZSB0cmFuc2xhdGlvbiBieSBHdXN0YXZvIEp1bmlvciBBbHZlcyA8YWx2ZXNAY29ycmVpb25ldC5jb20uYnI+CiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiBDb3B5cmlnaHQgMjAwMyBNYXJjZWxvIER1YXJ0ZQogKiBDb3B5cmlnaHQgMjAwNCwyMDA3IEFt6XJpY28gSm9z6SBNZWxvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKLyogTWVudSAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFycXVpdm8iIHsKICBNRU5VSVRFTSAiJkFicmlyLi4uIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkltcHJpbWlyIiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIiZDb25maWd1cmFyIEltcHJlc3NvcmEuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImRWRpdGFyIiB7CiAgIE1FTlVJVEVNICImQ29waWFyLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImQW5vdGFyLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiSW4mZGljYWRvciIgewogICBNRU5VSVRFTSAiJkRlZmluaXIuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkhlbHAgYWx3YXlzIHZpc2libGUiCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIkRlZmF1bHQiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIlZpc2libGUiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3J5IiwJCU1OSURfT1BUU19ISVNUT1JZCiAgUE9QVVAgICAgIkZvbnRzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiU21hbGwiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiTm9ybWFsIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJMYXJnZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlVzZSBzeXN0ZW0gY29sb3JzIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICJBaiZ1ZGEiIHsKICAgTUVOVUlURU0gIkFqdWRhICZuYSBhanVkYSIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIlNlbXByZSAmdmlz7XZlbCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWHn9WVzLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImU29icmUgV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWNoZWlybyIgewogIE1FTlVJVEVNICImQWJyaXIuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXIgSW1wcmVzc29yYS4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FpJnIiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIiZFZGl0YXIiIHsKICAgTUVOVUlURU0gIiZDb3BpYXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm90YXIuLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICJJbiZkaWNhZG9yIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pci4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICImT3B0aW9ucyIgewogICBQT1BVUAkiSGVscCBhbHdheXMgdmlzaWJsZSIKICAgQkVHSU4KICAgICBNRU5VSVRFTSAiRGVmYXVsdCIsCU1OSURfT1BUU19IRUxQX0RFRkFVTFQKICAgICBNRU5VSVRFTSAiVmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX1ZJU0lCTEUKICAgICBNRU5VSVRFTSAiTm9uIHZpc2libGUiLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIkhpc3RvcnkiLAkJTU5JRF9PUFRTX0hJU1RPUlkKICBQT1BVUCAgICAiRm9udHMiCiAgQkVHSU4KICAgIE1FTlVJVEVNICJTbWFsbCIsCQlNTklEX09QVFNfRk9OVFNfU01BTEwKICAgIE1FTlVJVEVNICJOb3JtYWwiLCAgICAJTU5JRF9PUFRTX0ZPTlRTX05PUk1BTAogICAgTUVOVUlURU0gIkxhcmdlIiwgICAgIAlNTklEX09QVFNfRk9OVFNfTEFSR0UKICBFTkQKICBNRU5VSVRFTSAiVXNlIHN5c3RlbSBjb2xvcnMiLAlNTklEX09QVFNfU1lTVEVNX0NPTE9SUwogfQogUE9QVVAgIkFqJnVkYSIgewogICBNRU5VSVRFTSAiQWp1ZGEgJm5hIGFqdWRhIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiU2VtcHJlICZ2aXPtdmVsIiwgTU5JRF9IRUxQX0hFTFBUT1AKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImSW5mb3JtYef1ZXMuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZBY2VyY2EgZG8gV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgovKiBTdHJpbmdzICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RJRF9XSU5FX0hFTFAsIAkiQWp1ZGEgV0lORSIKU1RJRF9XSEVSUk9SLCAJCSJFUlJPIgpTVElEX1dBUk5JTkcsICAJCSJBVklTTyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYefjbyIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTuNvIGltcGxlbWVudGFkbyIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRXJybyBlbmNvbnRyYWRvIG5hIGxlaXR1cmEgZG8gYXJxdWl2byBkZSBhanVkYSAnJXMnIgpTVElEX0lOREVYLCAJCSImQ29udGX6ZG8iClNUSURfQ09OVEVOVFMsCQkiU3VtbWFyeSIKU1RJRF9CQUNLLCAJCSImVm9sdGFyIgpTVElEX0FMTF9GSUxFUywgCSJUb2RvcyBvcyBhcnF1aXZvcyAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJBcnF1aXZvcyBkZSBhanVkYSAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MgICAiQ2Fubm90IGZpbmQgJyVzJy4gRG8geW91IHdhbnQgdG8gZmluZCB0aGlzIGZpbGUgeW91cnNlbGY/IgpTVElEX05PX1JJQ0hFRElUCSJDYW5ub3QgZmluZCBhIHJpY2hlZGl0IGltcGxlbWVudGF0aW9uLi4uIEFib3J0aW5nIgpTVElEX1BTSF9JTkRFWCwJCSJIZWxwIHRvcGljczogIgp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVElEX1dJTkVfSEVMUCwgCSJBanVkYSBXSU5FIgpTVElEX1dIRVJST1IsIAkJIkVSUk8iClNUSURfV0FSTklORywgIAkJIkFWSVNPIgpTVElEX0lORk8sICAJCSJJbmZvcm1h5+NvIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJO428gaW1wbGVtZW50YWRvIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJFcnJvIGVuY29udHJhZG8gbmEgbGVpdHVyYSBkbyBmaWNoZWlybyBkZSBhanVkYSAnJXMnIgpTVElEX0lOREVYLCAJCSImQ29udGX6ZG8iClNUSURfQ09OVEVOVFMsCQkiU3VtbWFyeSIKU1RJRF9CQUNLLCAJCSImVm9sdGFyIgpTVElEX0FMTF9GSUxFUywgCSJUb2RvcyBvcyBmaWNoZWlyb3MgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiRmljaGVpcm9zIGRlIGFqdWRhICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiTuNvIOkgcG9zc+12ZWwgZW5jb250cmFyICclcycuIERlc2VqYSBwcm9jdXJhciBlc3RlIGZpY2hlaXJvIHZvY+ogbWVzbW8/IgpTVElEX05PX1JJQ0hFRElUCSJDYW5ub3QgZmluZCBhIHJpY2hlZGl0IGltcGxlbWVudGF0aW9uLi4uIEFib3J0aW5nIgpTVElEX1BTSF9JTkRFWCwJCSJIZWxwIHRvcGljczogIgp9Cg==