LyoKICogSVdpbmVEM0QgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDItMjAwNCBKYXNvbiBFZG1lYWRlcwogKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJhcGhhZWwgSnVucXVlaXJhCiAqIENvcHlyaWdodCAyMDA0IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKiBDb3B5cmlnaHQgMjAwNy0yMDA4IFN0ZWZhbiBE9nNpbmdlciBmb3IgQ29kZVdlYXZlcnMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogQ29tcGlsZSB0aW1lIGRpYWdub3N0aWNzOiAqLwoKI2lmbmRlZiBERUJVR19TSU5HTEVfTU9ERQovKiBTZXQgdG8gMSB0byBmb3JjZSBvbmx5IGEgc2luZ2xlIGRpc3BsYXkgbW9kZSB0byBiZSBleHBvc2VkOiAqLwojZGVmaW5lIERFQlVHX1NJTkdMRV9NT0RFIDAKI2VuZGlmCgoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGQzZF9jYXBzKTsKCi8qIFRoZSBkM2QgZGV2aWNlIElEICovCnN0YXRpYyBjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfRDNEVUlEID0geyAweGFlYjJjZGQ0LCAweDZlNDEsIDB4NDNlYSwgeyAweDk0LDB4MWMsMHg4MywweDYxLDB4Y2MsMHg3NiwweDA3LDB4ODEgfSB9OwoKLyogRXh0ZW5zaW9uIGRldGVjdGlvbiAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbl9zdHJpbmc7CiAgICBHTF9TdXBwb3J0ZWRFeHQgZXh0ZW5zaW9uOwogICAgRFdPUkQgdmVyc2lvbjsKfSBFWFRFTlNJT05fTUFQW10gPSB7CiAgICAvKiBBUFBMRSAqLwogICAgeyJHTF9BUFBMRV9jbGllbnRfc3RvcmFnZSIsICAgICAgICAgICAgIEFQUExFX0NMSUVOVF9TVE9SQUdFLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FQUExFX2ZlbmNlIiwgICAgICAgICAgICAgICAgICAgICAgQVBQTEVfRkVOQ0UsICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVBQTEVfZmx1c2hfcmVuZGVyIiwgICAgICAgICAgICAgICBBUFBMRV9GTFVTSF9SRU5ERVIsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUFBMRV95Y2Jjcl80MjIiLCAgICAgICAgICAgICAgICAgIEFQUExFX1lDQkNSXzQyMiwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FQUExFX2Zsb2F0X3BpeGVscyIsICAgICAgICAgICAgICAgQVBQTEVfRkxPQVRfUElYRUxTLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAvKiBBVEkgKi8KICAgIHsiR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWwiLCAgICAgICAgICAgICBBVElfU0VQQVJBVEVfU1RFTkNJTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMiLCAgICAgICAgIEFUSV9URVhUVVJFX0VOVl9DT01CSU5FMywgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlIiwgICAgICAgICAgQVRJX1RFWFRVUkVfTUlSUk9SX09OQ0UsICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVRJX2Vudm1hcF9idW1wbWFwIiwgICAgICAgICAgICAgICBBVElfRU5WTUFQX0JVTVBNQVAsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BVElfZnJhZ21lbnRfc2hhZGVyIiwgICAgICAgICAgICAgIEFUSV9GUkFHTUVOVF9TSEFERVIsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgLyogQVJCICovCiAgICB7IkdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQiLCAgICAgICAgICAgQVJCX0NPTE9SX0JVRkZFUl9GTE9BVCwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX2RyYXdfYnVmZmVycyIsICAgICAgICAgICAgICAgICBBUkJfRFJBV19CVUZGRVJTLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSIsICAgICAgICAgICAgIEFSQl9GUkFHTUVOVF9QUk9HUkFNLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9mcmFnbWVudF9zaGFkZXIiLCAgICAgICAgICAgICAgQVJCX0ZSQUdNRU5UX1NIQURFUiwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwiLCAgICAgICAgICAgICBBUkJfSEFMRl9GTE9BVF9QSVhFTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfaW1hZ2luZyIsICAgICAgICAgICAgICAgICAgICAgIEFSQl9JTUFHSU5HLCAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9tdWx0aXNhbXBsZSIsICAgICAgICAgICAgICAgICAgQVJCX01VTFRJU0FNUExFLCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgLyogbmVlZHMgR0xYX0FSQl9NVUxUSVNBTVBMRSBhcyB3ZWxsICovCiAgICB7IkdMX0FSQl9tdWx0aXRleHR1cmUiLCAgICAgICAgICAgICAgICAgQVJCX01VTFRJVEVYVFVSRSwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX29jY2x1c2lvbl9xdWVyeSIsICAgICAgICAgICAgICBBUkJfT0NDTFVTSU9OX1FVRVJZLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfcGl4ZWxfYnVmZmVyX29iamVjdCIsICAgICAgICAgIEFSQl9QSVhFTF9CVUZGRVJfT0JKRUNULCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9wb2ludF9wYXJhbWV0ZXJzIiwgICAgICAgICAgICAgQVJCX1BPSU5UX1BBUkFNRVRFUlMsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3BvaW50X3Nwcml0ZSIsICAgICAgICAgICAgICAgICBBUkJfUE9JTlRfU1BSSVRFLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAiLCAgICAgICAgIEFSQl9URVhUVVJFX0JPUkRFUl9DTEFNUCwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uIiwgICAgICAgICAgQVJCX1RFWFRVUkVfQ09NUFJFU1NJT04sICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAiLCAgICAgICAgICAgICBBUkJfVEVYVFVSRV9DVUJFX01BUCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9lbnZfYWRkIiwgICAgICAgICAgICAgIEFSQl9URVhUVVJFX0VOVl9BREQsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lIiwgICAgICAgICAgQVJCX1RFWFRVUkVfRU5WX0NPTUJJTkUsICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfZW52X2RvdDMiLCAgICAgICAgICAgICBBUkJfVEVYVFVSRV9FTlZfRE9UMywgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9mbG9hdCIsICAgICAgICAgICAgICAgIEFSQl9URVhUVVJFX0ZMT0FULCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCIsICAgICAgQVJCX1RFWFRVUkVfTUlSUk9SRURfUkVQRUFULCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byIsICAgICBBUkJfVEVYVFVSRV9OT05fUE9XRVJfT0ZfVFdPLCAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUiLCAgICAgICAgICAgIEFSQl9URVhUVVJFX1JFQ1RBTkdMRSwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl92ZXJ0ZXhfYmxlbmQiLCAgICAgICAgICAgICAgICAgQVJCX1ZFUlRFWF9CTEVORCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0IiwgICAgICAgICBBUkJfVkVSVEVYX0JVRkZFUl9PQkpFQ1QsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdmVydGV4X3Byb2dyYW0iLCAgICAgICAgICAgICAgIEFSQl9WRVJURVhfUFJPR1JBTSwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl92ZXJ0ZXhfc2hhZGVyIiwgICAgICAgICAgICAgICAgQVJCX1ZFUlRFWF9TSEFERVIsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3NoYWRlcl9vYmplY3RzIiwgICAgICAgICAgICAgICBBUkJfU0hBREVSX09CSkVDVFMsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAoKICAgIC8qIEVYVCAqLwogICAgeyJHTF9FWFRfYmxlbmRfY29sb3IiLCAgICAgICAgICAgICAgICAgIEVYVF9CTEVORF9DT0xPUiwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9ibGVuZF9taW5tYXgiLCAgICAgICAgICAgICAgICAgRVhUX0JMRU5EX01JTk1BWCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIiwgICAgICBFWFRfQkxFTkRfRVFVQVRJT05fU0VQQVJBVEUsICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZSIsICAgICAgICAgIEVYVF9CTEVORF9GVU5DX1NFUEFSQVRFLCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9mb2dfY29vcmQiLCAgICAgICAgICAgICAgICAgICAgRVhUX0ZPR19DT09SRCwgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX2ZyYW1lYnVmZmVyX2JsaXQiLCAgICAgICAgICAgICBFWFRfRlJBTUVCVUZGRVJfQkxJVCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IiwgICAgICAgICAgIEVYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9wYWxldHRlZF90ZXh0dXJlIiwgICAgICAgICAgICAgRVhUX1BBTEVUVEVEX1RFWFRVUkUsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3BvaW50X3BhcmFtZXRlcnMiLCAgICAgICAgICAgICBFWFRfUE9JTlRfUEFSQU1FVEVSUywgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIiwgICAgICAgICAgICAgIEVYVF9TRUNPTkRBUllfQ09MT1IsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9zdGVuY2lsX3R3b19zaWRlIiwgICAgICAgICAgICAgRVhUX1NURU5DSUxfVFdPX1NJREUsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3N0ZW5jaWxfd3JhcCIsICAgICAgICAgICAgICAgICBFWFRfU1RFTkNJTF9XUkFQLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZTNEIiwgICAgICAgICAgICAgICAgICAgIEVYVF9URVhUVVJFM0QsICAgICAgICAgICAgICAgICAgTUFLRURXT1JEX1ZFUlNJT04oMSwgMikgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMiLCAgICAgRVhUX1RFWFRVUkVfQ09NUFJFU1NJT05fUzNUQywgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmVfZW52X2FkZCIsICAgICAgICAgICAgICBFWFRfVEVYVFVSRV9FTlZfQURELCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSIsICAgICAgICAgIEVYVF9URVhUVVJFX0VOVl9DT01CSU5FLCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzIiwgICAgICAgICAgICAgRVhUX1RFWFRVUkVfRU5WX0RPVDMsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmVfc1JHQiIsICAgICAgICAgICAgICAgICBFWFRfVEVYVFVSRV9TUkdCLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiLCAgIEVYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQywgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX2xvZCIsICAgICAgICAgICAgICAgICAgRVhUX1RFWFRVUkVfTE9ELCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMiLCAgICAgICAgICAgICBFWFRfVEVYVFVSRV9MT0RfQklBUywgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdmVydGV4X3NoYWRlciIsICAgICAgICAgICAgICAgIEVYVF9WRVJURVhfU0hBREVSLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nIiwgICAgICAgICAgICAgRVhUX1ZFUlRFWF9XRUlHSFRJTkcsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMiLCAgICAgICBFWFRfR1BVX1BST0dSQU1fUEFSQU1FVEVSUywgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAoKICAgIC8qIE5WICovCiAgICB7IkdMX05WX2hhbGZfZmxvYXQiLCAgICAgICAgICAgICAgICAgICAgTlZfSEFMRl9GTE9BVCwgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfZmVuY2UiLCAgICAgICAgICAgICAgICAgICAgICAgICBOVl9GRU5DRSwgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9mb2dfZGlzdGFuY2UiLCAgICAgICAgICAgICAgICAgIE5WX0ZPR19ESVNUQU5DRSwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX2ZyYWdtZW50X3Byb2dyYW0iLCAgICAgICAgICAgICAgTlZfRlJBR01FTlRfUFJPR1JBTSwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTIiLCAgICAgICAgICAgICBOVl9GUkFHTUVOVF9QUk9HUkFNMiwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMiLCAgICAgICAgICAgIE5WX1JFR0lTVEVSX0NPTUJJTkVSUywgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIiLCAgICAgICAgICAgTlZfUkVHSVNURVJfQ09NQklORVJTMiwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24iLCAgICAgICAgICAgICBOVl9URVhHRU5fUkVGTEVDVElPTiwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCIsICAgICAgICAgIE5WX1RFWFRVUkVfRU5WX0NPTUJJTkU0LCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3RleHR1cmVfc2hhZGVyIiwgICAgICAgICAgICAgICAgTlZfVEVYVFVSRV9TSEFERVIsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdGV4dHVyZV9zaGFkZXIyIiwgICAgICAgICAgICAgICBOVl9URVhUVVJFX1NIQURFUjIsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl90ZXh0dXJlX3NoYWRlcjMiLCAgICAgICAgICAgICAgIE5WX1RFWFRVUkVfU0hBREVSMywgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX29jY2x1c2lvbl9xdWVyeSIsICAgICAgICAgICAgICAgTlZfT0NDTFVTSU9OX1FVRVJZLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdmVydGV4X3Byb2dyYW0iLCAgICAgICAgICAgICAgICBOVl9WRVJURVhfUFJPR1JBTSwgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTFfMSIsICAgICAgICAgICAgIE5WX1ZFUlRFWF9QUk9HUkFNMV8xLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3ZlcnRleF9wcm9ncmFtMiIsICAgICAgICAgICAgICAgTlZfVkVSVEVYX1BST0dSQU0yLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdmVydGV4X3Byb2dyYW0zIiwgICAgICAgICAgICAgICBOVl9WRVJURVhfUFJPR1JBTTMsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9kZXB0aF9jbGFtcCIsICAgICAgICAgICAgICAgICAgIE5WX0RFUFRIX0NMQU1QLCAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX2xpZ2h0X21heF9leHBvbmVudCIsICAgICAgICAgICAgTlZfTElHSFRfTUFYX0VYUE9ORU5ULCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAvKiBTR0kgKi8KICAgIHsiR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAiLCAgICAgICAgICAgICBTR0lTX0dFTkVSQVRFX01JUE1BUCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVXRpbGl0eSBmdW5jdGlvbnMgZm9sbG93CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogQWRhcHRlcnMgKi8Kc3RhdGljIGludCBudW1BZGFwdGVycyA9IDA7CnN0YXRpYyBzdHJ1Y3QgV2luZUQzREFkYXB0ZXIgQWRhcHRlcnNbMV07CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlRm9ybWF0KElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCBXSU5FRDNERk9STUFUIEFkYXB0ZXJGb3JtYXQsIERXT1JEIFVzYWdlLCBXSU5FRDNEUkVTT1VSQ0VUWVBFIFJUeXBlLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KTsKCi8qIGxvb2t1cCB0YWJsZXMgKi8KaW50IG1pbkxvb2t1cFtNQVhfTE9PS1VQU107CmludCBtYXhMb29rdXBbTUFYX0xPT0tVUFNdOwpEV09SRCAqc3RhdGVMb29rdXBbTUFYX0xPT0tVUFNdOwoKRFdPUkQgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX0FOSVNPVFJPUElDICsgMV1bV0lORUQzRFRFWEZfTElORUFSICsgMV07CkRXT1JEIG1pbk1pcExvb2t1cF9ub0ZpbHRlcltXSU5FRDNEVEVYRl9BTklTT1RST1BJQyArIDFdW1dJTkVEM0RURVhGX0xJTkVBUiArIDFdID0gewogICAge0dMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1R9LAogICAge0dMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1R9LAogICAge0dMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1R9LAogICAge0dMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1R9LAp9OwoKRFdPUkQgbWFnTG9va3VwW1dJTkVEM0RURVhGX0FOSVNPVFJPUElDICsgMV07CkRXT1JEIG1hZ0xvb2t1cF9ub0ZpbHRlcltXSU5FRDNEVEVYRl9BTklTT1RST1BJQyArIDFdID0gewogICAgR0xfTkVBUkVTVCwgR0xfTkVBUkVTVCwgR0xfTkVBUkVTVCwgR0xfTkVBUkVTVAp9OwoKLyogZHJhd1N0cmlkZWRTbG93IGF0dHJpYnV0ZXMgKi8KZ2xBdHRyaWJGdW5jIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VTlVTRURdOwpnbEF0dHJpYkZ1bmMgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVU5VU0VEXTsKZ2xBdHRyaWJGdW5jIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VTlVTRURdOwpnbEF0dHJpYkZ1bmMgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VTlVTRURdOwpnbFRleEF0dHJpYkZ1bmMgdGV4Y29vcmRfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VOVVNFRF07CgovKioKICogTm90ZTogR0wgc2VlbXMgdG8gdHJhcCBpZiBHZXREZXZpY2VDYXBzIGlzIGNhbGxlZCBiZWZvcmUgYW55IEhXTkQncyBjcmVhdGVkLAogKiBpLmUuLCB0aGVyZSBpcyBubyBHTCBDb250ZXh0IC0gR2V0IGEgZGVmYXVsdCByZW5kZXJpbmcgY29udGV4dCB0byBlbmFibGUgdGhlCiAqIGZ1bmN0aW9uIHF1ZXJ5IHNvbWUgaW5mbyBmcm9tIEdMLgogKi8KCnN0YXRpYyBpbnQgICAgICAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfcmVmID0gMDsKc3RhdGljIEJPT0wgICAgICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9mb3JlaWduOwpzdGF0aWMgQk9PTCAgICAgICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2F2YWlsYWJsZSA9IEZBTFNFOwpzdGF0aWMgSERDICAgICAgICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYyA9IE5VTEw7CnN0YXRpYyBIV05EICAgICAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCA9IE5VTEw7CgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jczsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3NfZGVidWcgPQp7CiAgICAwLCAwLCAmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MsCiAgICB7ICZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jc19kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LAogICAgICAmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3NfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgMCwgMCwgeyAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jcyIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MgPSB7ICZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jc19kZWJ1ZywgLTEsIDAsIDAsIDAsIDAgfTsKCnN0YXRpYyB2b2lkIFdpbmVEM0RfUmVsZWFzZUZha2VHTENvbnRleHQodm9pZCkgewogICAgSEdMUkMgZ2xDdHg7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzKTsKCiAgICBpZighd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfYXZhaWxhYmxlKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiY29udGV4dCBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBnbEN0eCA9IHB3Z2xHZXRDdXJyZW50Q29udGV4dCgpOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoImRlY3JlbWVudGluZyByZWYgZnJvbSAlaVxuIiwgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfcmVmKTsKICAgIGlmICgwID09ICgtLXdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZikgKSB7CiAgICAgICAgaWYoIXdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2ZvcmVpZ24gJiYgZ2xDdHgpIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiZGVzdHJveWluZyBmYWtlIEdMIGNvbnRleHRcbiIpOwogICAgICAgICAgICBwd2dsTWFrZUN1cnJlbnQoTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIHB3Z2xEZWxldGVDb250ZXh0KGdsQ3R4KTsKICAgICAgICB9CiAgICAgICAgaWYod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjKQogICAgICAgICAgICBSZWxlYXNlREMod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCwgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjKTsKICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMgPSBOVUxMOyAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgdGhhdCBpdCBpcyBzdGlsbCBhcm91bmQgKi8KICAgICAgICBpZih3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kKQogICAgICAgICAgICBEZXN0cm95V2luZG93KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQpOwogICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQgPSBOVUxMOwogICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2F2YWlsYWJsZSA9IEZBTFNFOwogICAgfQogICAgYXNzZXJ0KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZiA+PSAwKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MpOwp9CgpzdGF0aWMgQk9PTCBXaW5lRDNEX0NyZWF0ZUZha2VHTENvbnRleHQodm9pZCkgewogICAgSEdMUkMgZ2xDdHggPSBOVUxMOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jcyk7CgogICAgVFJBQ0UoImdldHRpbmcgY29udGV4dC4uLlxuIik7CiAgICBpZih3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9yZWYgPiAwKSBnb3RvIHJldDsKICAgIGFzc2VydCgwID09IHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZik7CgogICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfZm9yZWlnbiA9IFRSVUU7CgogICAgZ2xDdHggPSBwd2dsR2V0Q3VycmVudENvbnRleHQoKTsKICAgIGlmICghZ2xDdHgpIHsKICAgICAgICBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcGZkOwogICAgICAgIGludCBpUGl4ZWxGb3JtYXQ7CgogICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2ZvcmVpZ24gPSBGQUxTRTsKCiAgICAgICAgLyogV2UgbmVlZCBhIGZha2Ugd2luZG93IGFzIGEgaGRjIHJldHJpZXZlZCB1c2luZyBHZXREQygwKSBjYW4ndCBiZSB1c2VkIGZvciBtdWNoIEdMIHB1cnBvc2VzICovCiAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCA9IENyZWF0ZVdpbmRvd0EoIldpbmVEM0RfT3BlbkdMIiwgIldpbmVEM0QgZmFrZSB3aW5kb3ciLCBXU19PVkVSTEFQUEVEV0lORE9XLCAgICAgICAgMTAsIDEwLCAxMCwgMTAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgIGlmKCF3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kKSB7CiAgICAgICAgICAgIEVSUigiSFdORCBjcmVhdGlvbiBmYWlsZWQhXG4iKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMgPSBHZXREQyh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kKTsKICAgICAgICBpZighd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjKSB7CiAgICAgICAgICAgIEVSUigiR2V0REMgZmFpbGVkIVxuIik7CiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICB9CgogICAgICAgIC8qIFBpeGVsRm9ybWF0IHNlbGVjdGlvbiAqLwogICAgICAgIFplcm9NZW1vcnkoJnBmZCwgc2l6ZW9mKHBmZCkpOwogICAgICAgIHBmZC5uU2l6ZSAgICAgID0gc2l6ZW9mKHBmZCk7CiAgICAgICAgcGZkLm5WZXJzaW9uICAgPSAxOwogICAgICAgIHBmZC5kd0ZsYWdzICAgID0gUEZEX1NVUFBPUlRfT1BFTkdMIHwgUEZEX0RPVUJMRUJVRkZFUiB8IFBGRF9EUkFXX1RPX1dJTkRPVzsvKlBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEKi8KICAgICAgICBwZmQuaVBpeGVsVHlwZSA9IFBGRF9UWVBFX1JHQkE7CiAgICAgICAgcGZkLmNDb2xvckJpdHMgPSAzMjsKICAgICAgICBwZmQuaUxheWVyVHlwZSA9IFBGRF9NQUlOX1BMQU5FOwoKICAgICAgICBpUGl4ZWxGb3JtYXQgPSBDaG9vc2VQaXhlbEZvcm1hdCh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMsICZwZmQpOwogICAgICAgIGlmKCFpUGl4ZWxGb3JtYXQpIHsKICAgICAgICAgICAgLyogSWYgdGhpcyBoYXBwZW5zIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nIGFzIENob29zZVBpeGVsRm9ybWF0IGJhcmVseSBmYWlscyAqLwogICAgICAgICAgICBFUlIoIkNhbid0IGZpbmQgYSBzdWl0YWJsZSBpUGl4ZWxGb3JtYXRcbiIpOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQogICAgICAgIERlc2NyaWJlUGl4ZWxGb3JtYXQod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjLCBpUGl4ZWxGb3JtYXQsIHNpemVvZihwZmQpLCAmcGZkKTsKICAgICAgICBTZXRQaXhlbEZvcm1hdCh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMsIGlQaXhlbEZvcm1hdCwgJnBmZCk7CgogICAgICAgIC8qIENyZWF0ZSBhIEdMIGNvbnRleHQgKi8KICAgICAgICBnbEN0eCA9IHB3Z2xDcmVhdGVDb250ZXh0KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYyk7CiAgICAgICAgaWYgKCFnbEN0eCkgewogICAgICAgICAgICBXQVJOXyhkM2RfY2FwcykoIkVycm9yIGNyZWF0aW5nIGRlZmF1bHQgY29udGV4dCBmb3IgY2FwYWJpbGl0aWVzIGluaXRpYWxpemF0aW9uXG4iKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KCiAgICAgICAgLyogTWFrZSBpdCB0aGUgY3VycmVudCBHTCBjb250ZXh0ICovCiAgICAgICAgaWYgKCFwd2dsTWFrZUN1cnJlbnQod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjLCBnbEN0eCkpIHsKICAgICAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJFcnJvciBzZXR0aW5nIGRlZmF1bHQgY29udGV4dCBhcyBjdXJyZW50IGZvciBjYXBhYmlsaXRpZXMgaW5pdGlhbGl6YXRpb25cbiIpOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQogICAgfQoKICByZXQ6CiAgICBUUkFDRSgiaW5jcmVtZW50aW5nIHJlZiBmcm9tICVpXG4iLCB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9yZWYpOwogICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfcmVmKys7CiAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9hdmFpbGFibGUgPSBUUlVFOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzKTsKICAgIHJldHVybiBUUlVFOwogIGZhaWw6CiAgICBpZih3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMpCiAgICAgICAgUmVsZWFzZURDKHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQsIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYyk7CiAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMgPSBOVUxMOwogICAgaWYod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCkKICAgICAgICBEZXN0cm95V2luZG93KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQpOwogICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCA9IE5VTEw7CiAgICBpZihnbEN0eCkgcHdnbERlbGV0ZUNvbnRleHQoZ2xDdHgpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzKTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyogQWRqdXN0IHRoZSBhbW91bnQgb2YgdXNlZCB0ZXh0dXJlIG1lbW9yeSAqLwpsb25nIFdpbmVEM0RBZGFwdGVyQ2hhbmdlR0xSYW0oSVdpbmVEM0REZXZpY2VJbXBsICpEM0REZXZpY2UsIGxvbmcgZ2xyYW0pewogICAgVUlOVCBBZGFwdGVyID0gRDNERGV2aWNlLT5hZGFwdGVyTm87CgogICAgQWRhcHRlcnNbQWRhcHRlcl0uVXNlZFRleHR1cmVSYW0gKz0gZ2xyYW07CiAgICBUUkFDRSgiQWRqdXN0ZWQgZ2wgcmFtIGJ5ICVsZCB0byAlZFxuIiwgZ2xyYW0sIEFkYXB0ZXJzW0FkYXB0ZXJdLlVzZWRUZXh0dXJlUmFtKTsKICAgIHJldHVybiBBZGFwdGVyc1tBZGFwdGVyXS5Vc2VkVGV4dHVyZVJhbTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gcGFydHMgZm9sbG93cwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfUXVlcnlJbnRlcmZhY2UoSVdpbmVEM0QgKmlmYWNlLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmopCnsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqVGhpcyA9IChJV2luZUQzRERldmljZUltcGwgKilpZmFjZTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmlpZCkscHBvYmopOwogICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVVua25vd24pCiAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JV2luZUQzREJhc2UpCiAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JV2luZUQzRERldmljZSkpIHsKICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOwogICAgICAgICpwcG9iaiA9IFRoaXM7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CiAgICAqcHBvYmogPSBOVUxMOwogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgSVdpbmVEM0RJbXBsX0FkZFJlZihJV2luZUQzRCAqaWZhY2UpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZkNvdW50ID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCkgOiBBZGRSZWYgaW5jcmVhc2luZyBmcm9tICVkXG4iLCBUaGlzLCByZWZDb3VudCAtIDEpOwogICAgcmV0dXJuIHJlZkNvdW50Owp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIElXaW5lRDNESW1wbF9SZWxlYXNlKElXaW5lRDNEICppZmFjZSkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmOwogICAgVFJBQ0UoIiglcCkgOiBSZWxlYXNpbmcgZnJvbSAlZFxuIiwgVGhpcywgVGhpcy0+cmVmKTsKICAgIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwogICAgaWYgKHJlZiA9PSAwKSB7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CiAgICB9CgogICAgcmV0dXJuIHJlZjsKfQoKLyogU2V0IHRoZSBzaGFkZXIgdHlwZSBmb3IgdGhpcyBkZXZpY2UsIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzLAogKiB0aGUgZGV2aWNlIHR5cGUsIGFuZCB0aGUgdXNlciBwcmVmZXJlbmNlcyBpbiB3aW5lZDNkX3NldHRpbmdzICovCgp2b2lkIHNlbGVjdF9zaGFkZXJfbW9kZSgKICAgIFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbywKICAgIFdJTkVEM0RERVZUWVBFIERldmljZVR5cGUsCiAgICBpbnQqIHBzX3NlbGVjdGVkLAogICAgaW50KiB2c19zZWxlY3RlZCkgewoKICAgIGlmICh3aW5lZDNkX3NldHRpbmdzLnZzX21vZGUgPT0gVlNfTk9ORSkgewogICAgICAgICp2c19zZWxlY3RlZCA9IFNIQURFUl9OT05FOwogICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9TSEFERVJdICYmIHdpbmVkM2Rfc2V0dGluZ3MuZ2xzbFJlcXVlc3RlZCkgewogICAgICAgIC8qIEdlZm9yY2U0IGNhcmRzIHN1cHBvcnQgR0xTTCBidXQgZm9yIHZlcnRleCBzaGFkZXJzIG9ubHkuIEZ1cnRoZXIgaXRzIHJlcG9ydGVkIEdMU0wgY2FwcyBhcmUKICAgICAgICAgKiB3cm9uZy4gVGhpcyBjb21iaW5lZCB3aXRoIHRoZSBmYWN0IHRoYXQgZ2xzbCB3b24ndCBvZmZlciBtb3JlIGZlYXR1cmVzIG9yIHBlcmZvcm1hbmNlLCB1c2UgQVJCCiAgICAgICAgICogc2hhZGVycyBvbmx5IG9uIHRoaXMgY2FyZC4gKi8KICAgICAgICBpZihnbF9pbmZvLT52c19udl92ZXJzaW9uICYmIGdsX2luZm8tPnZzX252X3ZlcnNpb24gPCBWU19WRVJTSU9OXzIwKQogICAgICAgICAgICAqdnNfc2VsZWN0ZWQgPSBTSEFERVJfQVJCOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKnZzX3NlbGVjdGVkID0gU0hBREVSX0dMU0w7CiAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVkVSVEVYX1BST0dSQU1dKSB7CiAgICAgICAgKnZzX3NlbGVjdGVkID0gU0hBREVSX0FSQjsKICAgIH0gZWxzZSB7CiAgICAgICAgKnZzX3NlbGVjdGVkID0gU0hBREVSX05PTkU7CiAgICB9CgogICAgaWYgKHdpbmVkM2Rfc2V0dGluZ3MucHNfbW9kZSA9PSBQU19OT05FKSB7CiAgICAgICAgKnBzX3NlbGVjdGVkID0gU0hBREVSX05PTkU7CiAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfRlJBR01FTlRfU0hBREVSXSAmJiB3aW5lZDNkX3NldHRpbmdzLmdsc2xSZXF1ZXN0ZWQpIHsKICAgICAgICAqcHNfc2VsZWN0ZWQgPSBTSEFERVJfR0xTTDsKICAgIH0gZWxzZSBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9GUkFHTUVOVF9QUk9HUkFNXSkgewogICAgICAgICpwc19zZWxlY3RlZCA9IFNIQURFUl9BUkI7CiAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBVElfRlJBR01FTlRfU0hBREVSXSkgewogICAgICAgICpwc19zZWxlY3RlZCA9IFNIQURFUl9BVEk7CiAgICB9IGVsc2UgewogICAgICAgICpwc19zZWxlY3RlZCA9IFNIQURFUl9OT05FOwogICAgfQp9CgovKiogU2VsZWN0IHRoZSBudW1iZXIgb2YgcmVwb3J0IG1heGltdW0gc2hhZGVyIGNvbnN0YW50cyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgc2hhZGVyIG1vZGVzICovCnN0YXRpYyB2b2lkIHNlbGVjdF9zaGFkZXJfbWF4X2NvbnN0YW50cygKICAgIGludCBwc19zZWxlY3RlZF9tb2RlLAogICAgaW50IHZzX3NlbGVjdGVkX21vZGUsCiAgICBXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8pIHsKCiAgICBzd2l0Y2ggKHZzX3NlbGVjdGVkX21vZGUpIHsKICAgICAgICBjYXNlIFNIQURFUl9HTFNMOgogICAgICAgICAgICAvKiBTdWJ0cmFjdCB0aGUgb3RoZXIgcG90ZW50aWFsIHVuaWZvcm1zIGZyb20gdGhlIG1heCBhdmFpbGFibGUgKGJvb2xzLCBpbnRzLCBhbmQgMSByb3cgb2YgcHJvamVjdGlvbiBtYXRyaXgpICovCiAgICAgICAgICAgIGdsX2luZm8tPm1heF92c2hhZGVyX2NvbnN0YW50c0YgPSBnbF9pbmZvLT52c19nbHNsX2NvbnN0YW50c0YgLSAoTUFYX0NPTlNUX0IgLyA0KSAtIE1BWF9DT05TVF9JIC0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTSEFERVJfQVJCOgogICAgICAgICAgICAvKiBXZSBoYXZlIHRvIHN1YnRyYWN0IGFueSBvdGhlciBQQVJBTXMgdGhhdCB3ZSBtaWdodCB1c2UgaW4gb3VyIHNoYWRlciBwcm9ncmFtcy4KICAgICAgICAgICAgICogQVRJIHNlZW1zIHRvIGNvdW50IDIgaW1wbGljaXQgUEFSQU1zIHdoZW4gd2UgdXNlIGZvZyBhbmQgTlZJRElBIGNvdW50cyAxLAogICAgICAgICAgICAgKiBhbmQgd2UgcmVmZXJlbmNlIG9uZSByb3cgb2YgdGhlIFBST0pFQ1RJT04gbWF0cml4IHdoaWNoIGNvdW50cyBhcyAxIFBBUkFNLiAqLwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfdnNoYWRlcl9jb25zdGFudHNGID0gZ2xfaW5mby0+dnNfYXJiX2NvbnN0YW50c0YgLSAzOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnbF9pbmZvLT5tYXhfdnNoYWRlcl9jb25zdGFudHNGID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgc3dpdGNoIChwc19zZWxlY3RlZF9tb2RlKSB7CiAgICAgICAgY2FzZSBTSEFERVJfR0xTTDoKICAgICAgICAgICAgLyogU3VidHJhY3QgdGhlIG90aGVyIHBvdGVudGlhbCB1bmlmb3JtcyBmcm9tIHRoZSBtYXggYXZhaWxhYmxlIChib29scyAmIGludHMpLCBhbmQgMiBzdGF0ZXMgZm9yIGZvZy4KICAgICAgICAgICAgICogSW4gdGhlb3J5IHRoZSB0ZXhiZW0gaW5zdHJ1Y3Rpb24gbWF5IG5lZWQgb25lIG1vcmUgc2hhZGVyIGNvbnN0YW50IHRvby4gQnV0IGxldHMgYXNzdW1lCiAgICAgICAgICAgICAqIHRoYXQgYSBzbSA8PSAxLjMgc2hhZGVyIGRvZXMgbm90IG5lZWQgYWxsIHRoZSB1bmlmb3JtcyBwcm92aWRlZCBieSBhIGdsc2wtY2FwYWJsZSBjYXJkLAogICAgICAgICAgICAgKiBhbmQgbGV0cyBub3QgdGFrZSBhd2F5IGEgdW5pZm9ybSBuZWVkbGVzc2x5IGZyb20gYWxsIG90aGVyIHNoYWRlcnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfcHNoYWRlcl9jb25zdGFudHNGID0gZ2xfaW5mby0+cHNfZ2xzbF9jb25zdGFudHNGIC0gKE1BWF9DT05TVF9CIC8gNCkgLSBNQVhfQ09OU1RfSSAtIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU0hBREVSX0FSQjoKICAgICAgICAgICAgLyogVGhlIGFyYiBzaGFkZXIgb25seSBsb2FkcyB0aGUgYnVtcCBtYXBwaW5nIGVudmlyb25tZW50IG1hdHJpeCBpbnRvIHRoZSBzaGFkZXIgaWYgaXQgZmluZHMKICAgICAgICAgICAgICogYSBmcmVlIGNvbnN0YW50IHRvIGRvIHRoYXQsIHNvIG9ubHkgcmVkdWNlIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbnN0YW50cyBieSAyIGZvciB0aGUgZm9nIHN0YXRlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsX2luZm8tPm1heF9wc2hhZGVyX2NvbnN0YW50c0YgPSBnbF9pbmZvLT5wc19hcmJfY29uc3RhbnRzRiAtIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdsX2luZm8tPm1heF9wc2hhZGVyX2NvbnN0YW50c0YgPSAwOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0QgcGFydHMgZm9sbG93cwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OICgqZ2xfaW5mbykKc3RhdGljIGlubGluZSBCT09MIHRlc3RfYXJiX3ZzX29mZnNldF9saW1pdChXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8pIHsKICAgIEdMdWludCBwcm9nOwogICAgQk9PTCByZXQgPSBGQUxTRTsKICAgIGNvbnN0IGNoYXIgKnRlc3Rjb2RlID0KICAgICAgICAiISFBUkJ2cDEuMFxuIgogICAgICAgICJQQVJBTSBDWzY2XSA9IHsgcHJvZ3JhbS5lbnZbMC4uNjVdIH07XG4iCiAgICAgICAgIkFERFJFU1MgQTA7IgogICAgICAgICJQQVJBTSB6ZXJvID0gezAuMCwgMC4wLCAwLjAsIDAuMH07XG4iCiAgICAgICAgIkFSTCBBMC54LCB6ZXJvLng7XG4iCiAgICAgICAgIk1PViByZXN1bHQucG9zaXRpb24sIENbQTAueCArIDY1XTtcbiIKICAgICAgICAiRU5EXG4iOwoKICAgIHdoaWxlKGdsR2V0RXJyb3IoKSk7CiAgICBHTF9FWFRDQUxMKGdsR2VuUHJvZ3JhbXNBUkIoMSwgJnByb2cpKTsKICAgIGlmKCFwcm9nKSB7CiAgICAgICAgRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGFuIEFSQiBvZmZzZXQgbGltaXQgdGVzdCBwcm9ncmFtXG4iKTsKICAgIH0KICAgIEdMX0VYVENBTEwoZ2xCaW5kUHJvZ3JhbUFSQihHTF9WRVJURVhfUFJPR1JBTV9BUkIsIHByb2cpKTsKICAgIEdMX0VYVENBTEwoZ2xQcm9ncmFtU3RyaW5nQVJCKEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwgR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRlc3Rjb2RlKSwgdGVzdGNvZGUpKTsKICAgIGlmKGdsR2V0RXJyb3IoKSAhPSAwKSB7CiAgICAgICAgVFJBQ0UoIk9wZW5HTCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBpbmRpcmVjdCBhZGRyZXNzaW5nIG9mZnNldHMgPiA2M1xuIik7CiAgICAgICAgVFJBQ0UoImVycm9yOiAlc1xuIiwgZGVidWdzdHJfYSgoY29uc3QgY2hhciAqKWdsR2V0U3RyaW5nKEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQikpKTsKICAgICAgICByZXQgPSBUUlVFOwogICAgfSBlbHNlIFRSQUNFKCJPcGVuR0wgaW1wbGVtZW50YXRpb24gYWxsb3dzIG9mZnNldHMgPiA2M1xuIik7CgogICAgR0xfRVhUQ0FMTChnbEJpbmRQcm9ncmFtQVJCKEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwgMCkpOwogICAgR0xfRVhUQ0FMTChnbERlbGV0ZVByb2dyYW1zQVJCKDEsICZwcm9nKSk7CiAgICBjaGVja0dMY2FsbCgiQVJCIHZwIG9mZnNldCBsaW1pdCB0ZXN0IGNsZWFudXBcbiIpOwoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBEV09SRCB2ZXJfZm9yX2V4dChHTF9TdXBwb3J0ZWRFeHQgZXh0KQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKEVYVEVOU0lPTl9NQVApIC8gc2l6ZW9mKCpFWFRFTlNJT05fTUFQKSk7ICsraSkgewogICAgICAgIGlmKEVYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uID09IGV4dCkgewogICAgICAgICAgICByZXR1cm4gRVhURU5TSU9OX01BUFtpXS52ZXJzaW9uOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CgpCT09MIElXaW5lRDNESW1wbF9GaWxsR0xDYXBzKFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykgewogICAgY29uc3QgY2hhciAqR0xfRXh0ZW5zaW9ucyAgICA9IE5VTEw7CiAgICBjb25zdCBjaGFyICpXR0xfRXh0ZW5zaW9ucyAgID0gTlVMTDsKICAgIGNvbnN0IGNoYXIgKmdsX3N0cmluZyAgICAgICAgPSBOVUxMOwogICAgY29uc3QgY2hhciAqZ2xfc3RyaW5nX2N1cnNvciA9IE5VTEw7CiAgICBHTGludCAgICAgICBnbF9tYXg7CiAgICBHTGZsb2F0ICAgICBnbF9mbG9hdHZbMl07CiAgICBpbnQgICAgICAgICBtYWpvciA9IDEsIG1pbm9yID0gMDsKICAgIEJPT0wgICAgICAgIHJldHVybl92YWx1ZSA9IFRSVUU7CiAgICB1bnNpZ25lZCAgICBpOwogICAgSERDICAgICAgICAgaGRjOwogICAgdW5zaWduZWQgaW50IHZpZG1lbT0wOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcClcbiIsIGdsX2luZm8pOwoKICAgIEVOVEVSX0dMKCk7CgogICAgZ2xfc3RyaW5nID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpOwogICAgaWYgKE5VTEwgPT0gZ2xfc3RyaW5nKQoJZ2xfc3RyaW5nID0gIk5vbmUiOwogICAgc3RyY3B5KGdsX2luZm8tPmdsX3JlbmRlcmVyLCBnbF9zdHJpbmcpOwoKICAgIGdsX3N0cmluZyA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFTkRPUik7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJGaWxsaW5nIHZlbmRvciBzdHJpbmcgJXNcbiIsIGdsX3N0cmluZyk7CiAgICBpZiAoZ2xfc3RyaW5nICE9IE5VTEwpIHsKICAgICAgICAvKiBGaWxsIGluIHRoZSBHTCB2ZW5kb3IgKi8KICAgICAgICBpZiAoc3Ryc3RyKGdsX3N0cmluZywgIk5WSURJQSIpKSB7CiAgICAgICAgICAgIGdsX2luZm8tPmdsX3ZlbmRvciA9IFZFTkRPUl9OVklESUE7CiAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfc3RyaW5nLCAiQVRJIikpIHsKICAgICAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX0FUSTsKICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihnbF9zdHJpbmcsICJJbnRlbChSKSIpIHx8CiAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJJbnRlbChSKSIpIHx8CiAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfc3RyaW5nLCAiSW50ZWwgSW5jLiIpKSB7CiAgICAgICAgICAgIGdsX2luZm8tPmdsX3ZlbmRvciA9IFZFTkRPUl9JTlRFTDsKICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihnbF9zdHJpbmcsICJNZXNhIikpIHsKICAgICAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX01FU0E7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX1dJTkU7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBnbF9pbmZvLT5nbF92ZW5kb3IgPSBWRU5ET1JfV0lORTsKICAgIH0KCgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiZm91bmQgR0xfVkVORE9SICglcyktPigweCUwNHgpXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZyksIGdsX2luZm8tPmdsX3ZlbmRvcik7CgogICAgLyogUGFyc2UgdGhlIEdMX1ZFUlNJT04gZmllbGQgaW50byBtYWpvciBhbmQgbWlub3IgaW5mb3JtYXRpb24gKi8KICAgIGdsX3N0cmluZyA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwogICAgaWYgKGdsX3N0cmluZyAhPSBOVUxMKSB7CgogICAgICAgIC8qIEZpcnN0LCBwYXJzZSB0aGUgZ2VuZXJpYyBvcGVuZ2wgdmVyc2lvbi4gVGhpcyBpcyBzdXBwb3NlZCBub3QgdG8gYmUgY29udm9sdXRlZCB3aXRoCiAgICAgICAgICogZHJpdmVyIHNwZWNpZmljIGluZm9ybWF0aW9uCiAgICAgICAgICovCiAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IGdsX3N0cmluZzsKICAgICAgICBtYWpvciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgaWYobWFqb3IgPD0gMCkgewogICAgICAgICAgICBFUlIoIkludmFsaWQgb3BlbmdsIG1ham9yIHZlcnNpb246ICVkXG4iLCBtYWpvcik7CiAgICAgICAgfQogICAgICAgIHdoaWxlICgqZ2xfc3RyaW5nX2N1cnNvciA8PSAnOScgJiYgKmdsX3N0cmluZ19jdXJzb3IgPj0gJzAnKSB7CiAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICB9CiAgICAgICAgaWYgKCpnbF9zdHJpbmdfY3Vyc29yKysgIT0gJy4nKSB7CiAgICAgICAgICAgIEVSUl8oZDNkX2NhcHMpKCJJbnZhbGlkIG9wZW5nbCB2ZXJzaW9uIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX2EoZ2xfc3RyaW5nKSk7CiAgICAgICAgfQogICAgICAgIG1pbm9yID0gYXRvaShnbF9zdHJpbmdfY3Vyc29yKTsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJGb3VuZCBPcGVuR0wgdmVyc2lvbjogJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7CiAgICAgICAgZ2xfaW5mby0+Z2xfdmVyc2lvbiA9IE1BS0VEV09SRF9WRVJTSU9OKG1ham9yLCBtaW5vcik7CgogICAgICAgIC8qIE5vdyBwYXJzZSB0aGUgZHJpdmVyIHNwZWNpZmljIHN0cmluZyB3aGljaCB3ZSdsbCByZXBvcnQgdG8gdGhlIGFwcCAqLwogICAgICAgIHN3aXRjaCAoZ2xfaW5mby0+Z2xfdmVuZG9yKSB7CiAgICAgICAgY2FzZSBWRU5ET1JfTlZJRElBOgogICAgICAgICAgICBnbF9zdHJpbmdfY3Vyc29yID0gc3Ryc3RyKGdsX3N0cmluZywgIk5WSURJQSIpOwogICAgICAgICAgICBpZiAoIWdsX3N0cmluZ19jdXJzb3IpIHsKICAgICAgICAgICAgICAgIEVSUl8oZDNkX2NhcHMpKCJJbnZhbGlkIG5WaWRpYSB2ZXJzaW9uIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX2EoZ2xfc3RyaW5nKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IHN0cnN0cihnbF9zdHJpbmdfY3Vyc29yLCAiICIpOwogICAgICAgICAgICBpZiAoIWdsX3N0cmluZ19jdXJzb3IpIHsKICAgICAgICAgICAgICAgIEVSUl8oZDNkX2NhcHMpKCJJbnZhbGlkIG5WaWRpYSB2ZXJzaW9uIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX2EoZ2xfc3RyaW5nKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCpnbF9zdHJpbmdfY3Vyc29yID09ICcgJykgewogICAgICAgICAgICAgICAgKytnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISpnbF9zdHJpbmdfY3Vyc29yKSB7CiAgICAgICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBuVmlkaWEgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1ham9yID0gYXRvaShnbF9zdHJpbmdfY3Vyc29yKTsKICAgICAgICAgICAgd2hpbGUgKCpnbF9zdHJpbmdfY3Vyc29yIDw9ICc5JyAmJiAqZ2xfc3RyaW5nX2N1cnNvciA+PSAnMCcpIHsKICAgICAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCpnbF9zdHJpbmdfY3Vyc29yKysgIT0gJy4nKSB7CiAgICAgICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBuVmlkaWEgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1pbm9yID0gYXRvaShnbF9zdHJpbmdfY3Vyc29yKTsKICAgICAgICAgICAgbWlub3IgPSBtYWpvcioxMDArbWlub3I7CiAgICAgICAgICAgIG1ham9yID0gMTA7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBWRU5ET1JfQVRJOgogICAgICAgICAgICBtYWpvciA9IG1pbm9yID0gMDsKICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IHN0cmNocihnbF9zdHJpbmcsICctJyk7CiAgICAgICAgICAgIGlmIChnbF9zdHJpbmdfY3Vyc29yKSB7CiAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSAwOwogICAgICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvcisrOwoKICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHZlcnNpb24gbnVtYmVyIGlzIG9mIHRoZSBmb3JtIHgueS56ICovCiAgICAgICAgICAgICAgICBpZiAoKmdsX3N0cmluZ19jdXJzb3IgPiAnOScgJiYgKmdsX3N0cmluZ19jdXJzb3IgPCAnMCcpCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAxOwogICAgICAgICAgICAgICAgaWYgKCFlcnJvciAmJiAqKGdsX3N0cmluZ19jdXJzb3IrMikgPiAnOScgJiYgKihnbF9zdHJpbmdfY3Vyc29yKzIpIDwgJzAnKQogICAgICAgICAgICAgICAgICAgIGVycm9yID0gMTsKICAgICAgICAgICAgICAgIGlmICghZXJyb3IgJiYgKihnbF9zdHJpbmdfY3Vyc29yKzQpID4gJzknICYmICooZ2xfc3RyaW5nX2N1cnNvcis0KSA8ICcwJykKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgICAgICAgICBpZiAoIWVycm9yICYmICooZ2xfc3RyaW5nX2N1cnNvcisxKSAhPSAnLicgJiYgKihnbF9zdHJpbmdfY3Vyc29yKzMpICE9ICcuJykKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IDE7CgogICAgICAgICAgICAgICAgLyogTWFyayB2ZXJzaW9uIG51bWJlciBhcyBtYWxmb3JtZWQgKi8KICAgICAgICAgICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgICAgICAgICBnbF9zdHJpbmdfY3Vyc29yID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFnbF9zdHJpbmdfY3Vyc29yKQogICAgICAgICAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJtYWxmb3JtZWQgR0xfVkVSU0lPTiAoJXMpXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1ham9yID0gKmdsX3N0cmluZ19jdXJzb3IgLSAnMCc7CiAgICAgICAgICAgICAgICBtaW5vciA9ICgqKGdsX3N0cmluZ19jdXJzb3IrMikgLSAnMCcpICogMjU2ICsgKCooZ2xfc3RyaW5nX2N1cnNvcis0KSAtICcwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVkVORE9SX0lOVEVMOgogICAgICAgICAgICAvKiBBcHBsZSBhbmQgTWVzYSB2ZXJzaW9uIHN0cmluZ3MgbG9vayBkaWZmZXJlbnRseSwgYnV0IGJvdGggcHJvdmlkZSBpbnRlbCBkcml2ZXJzICovCiAgICAgICAgICAgIGlmKHN0cnN0cihnbF9zdHJpbmcsICJBUFBMRSIpKSB7CiAgICAgICAgICAgICAgICAvKiBbMC05XSsuWzAtOV0rIEFQUExFLVswLTldKy5bMC45XSsuWzAuOV0rCiAgICAgICAgICAgICAgICAgKiBXZSBvbmx5IG5lZWQgdGhlIGZpcnN0IHBhcnQsIGFuZCB1c2UgdGhlIEFQUExFIGFzIGlkZW50aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgKiAiMS4yIEFQUExFLTEuNC41NiIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IGdsX3N0cmluZzsKICAgICAgICAgICAgICAgIG1ham9yID0gYXRvaShnbF9zdHJpbmdfY3Vyc29yKTsKICAgICAgICAgICAgICAgIHdoaWxlICgqZ2xfc3RyaW5nX2N1cnNvciA8PSAnOScgJiYgKmdsX3N0cmluZ19jdXJzb3IgPj0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgKytnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgqZ2xfc3RyaW5nX2N1cnNvcisrICE9ICcuJykgewogICAgICAgICAgICAgICAgICAgIEVSUl8oZDNkX2NhcHMpKCJJbnZhbGlkIE1hY09TLUludGVsIHZlcnNpb24gc3RyaW5nOiAlc1xuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaW5vciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICBjYXNlIFZFTkRPUl9NRVNBOgogICAgICAgICAgICBnbF9zdHJpbmdfY3Vyc29yID0gc3Ryc3RyKGdsX3N0cmluZywgIk1lc2EiKTsKICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IHN0cnN0cihnbF9zdHJpbmdfY3Vyc29yLCAiICIpOwogICAgICAgICAgICB3aGlsZSAoKmdsX3N0cmluZ19jdXJzb3IgJiYgJyAnID09ICpnbF9zdHJpbmdfY3Vyc29yKSArK2dsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgICAgIGlmICgqZ2xfc3RyaW5nX2N1cnNvcikgewogICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwogICAgICAgICAgICAgICAgaW50IGN1cnNvciA9IDA7CgogICAgICAgICAgICAgICAgd2hpbGUgKCpnbF9zdHJpbmdfY3Vyc29yIDw9ICc5JyAmJiAqZ2xfc3RyaW5nX2N1cnNvciA+PSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICB0bXBbY3Vyc29yKytdID0gKmdsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgICAgICAgICAgICAgKytnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdG1wW2N1cnNvcl0gPSAwOwogICAgICAgICAgICAgICAgbWFqb3IgPSBhdG9pKHRtcCk7CgogICAgICAgICAgICAgICAgaWYgKCpnbF9zdHJpbmdfY3Vyc29yICE9ICcuJykgV0FSTl8oZDNkX2NhcHMpKCJtYWxmb3JtZWQgR0xfVkVSU0lPTiAoJXMpXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICAgICAgKytnbF9zdHJpbmdfY3Vyc29yOwoKICAgICAgICAgICAgICAgIGN1cnNvciA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoKmdsX3N0cmluZ19jdXJzb3IgPD0gJzknICYmICpnbF9zdHJpbmdfY3Vyc29yID49ICcwJykgewogICAgICAgICAgICAgICAgICAgIHRtcFtjdXJzb3IrK10gPSAqZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICAgICAgICAgICAgICArK2dsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0bXBbY3Vyc29yXSA9IDA7CiAgICAgICAgICAgICAgICBtaW5vciA9IGF0b2kodG1wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbWFqb3IgPSAwOwogICAgICAgICAgICBtaW5vciA9IDk7CiAgICAgICAgfQogICAgICAgIGdsX2luZm8tPmRyaXZlcl92ZXJzaW9uID0gTUFLRURXT1JEX1ZFUlNJT04obWFqb3IsIG1pbm9yKTsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJmb3VuZCBkcml2ZXIgdmVyc2lvbiAoJXMpLT4laS4laS0+KDB4JTA4eClcbiIsIGRlYnVnc3RyX2EoZ2xfc3RyaW5nKSwgbWFqb3IsIG1pbm9yLCBnbF9pbmZvLT5kcml2ZXJfdmVyc2lvbik7CiAgICAgICAgLyogQ3VycmVudCBXaW5kb3dzIGRyaXZlcnMgaGF2ZSB2ZXJzaW9ucyBsaWtlIDYuMTQuLi4uIChzb21lIG9sZGVyIGhhdmUgYW4gZWFybGllciB2ZXJzaW9uKSAqLwogICAgICAgIGdsX2luZm8tPmRyaXZlcl92ZXJzaW9uX2hpcGFydCA9IE1BS0VEV09SRF9WRVJTSU9OKDYsIDE0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgRklYTUUoIk9wZW5HTCBkcml2ZXIgZGlkIG5vdCByZXR1cm4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIik7CiAgICAgICAgZ2xfaW5mby0+ZHJpdmVyX3ZlcnNpb24gPSBNQUtFRFdPUkRfVkVSU0lPTigwLCAwKTsKICAgICAgICBnbF9pbmZvLT5kcml2ZXJfdmVyc2lvbl9oaXBhcnQgPSBNQUtFRFdPUkRfVkVSU0lPTig2LCAxNCk7CiAgICB9CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiZm91bmQgR0xfUkVOREVSRVIgKCVzKS0+KDB4JTA0eClcbiIsIGRlYnVnc3RyX2EoZ2xfaW5mby0+Z2xfcmVuZGVyZXIpLCBnbF9pbmZvLT5nbF9jYXJkKTsKCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSBvcGVuR0wgZXh0ZW5zaW9uIHJlbGF0ZWQgdmFyaWFibGVzCiAgICAgKiAgd2l0aCBEZWZhdWx0IHZhbHVlcwogICAgICovCiAgICBtZW1zZXQoJmdsX2luZm8tPnN1cHBvcnRlZCwgMCwgc2l6ZW9mKGdsX2luZm8tPnN1cHBvcnRlZCkpOwogICAgZ2xfaW5mby0+bWF4X2J1ZmZlcnMgICAgICAgID0gMTsKICAgIGdsX2luZm8tPm1heF90ZXh0dXJlcyAgICAgICA9IDE7CiAgICBnbF9pbmZvLT5tYXhfdGV4dHVyZV9zdGFnZXMgPSAxOwogICAgZ2xfaW5mby0+bWF4X2ZyYWdtZW50X3NhbXBsZXJzID0gMTsKICAgIGdsX2luZm8tPm1heF92ZXJ0ZXhfc2FtcGxlcnMgPSAwOwogICAgZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzID0gMDsKICAgIGdsX2luZm8tPm1heF9zYW1wbGVyX3N0YWdlcyA9IDE7CiAgICBnbF9pbmZvLT5wc19hcmJfdmVyc2lvbiA9IFBTX1ZFUlNJT05fTk9UX1NVUFBPUlRFRDsKICAgIGdsX2luZm8tPnBzX2FyYl9tYXhfdGVtcHMgPSAwOwogICAgZ2xfaW5mby0+cHNfYXJiX21heF9pbnN0cnVjdGlvbnMgPSAwOwogICAgZ2xfaW5mby0+dnNfYXJiX3ZlcnNpb24gPSBWU19WRVJTSU9OX05PVF9TVVBQT1JURUQ7CiAgICBnbF9pbmZvLT52c19hcmJfbWF4X3RlbXBzID0gMDsKICAgIGdsX2luZm8tPnZzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zID0gMDsKICAgIGdsX2luZm8tPnZzX252X3ZlcnNpb24gID0gVlNfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOwogICAgZ2xfaW5mby0+dnNfYXRpX3ZlcnNpb24gPSBWU19WRVJTSU9OX05PVF9TVVBQT1JURUQ7CiAgICBnbF9pbmZvLT52c19nbHNsX2NvbnN0YW50c0YgPSAwOwogICAgZ2xfaW5mby0+cHNfZ2xzbF9jb25zdGFudHNGID0gMDsKICAgIGdsX2luZm8tPnZzX2FyYl9jb25zdGFudHNGID0gMDsKICAgIGdsX2luZm8tPnBzX2FyYl9jb25zdGFudHNGID0gMDsKCiAgICAvKiBSZXRyaWV2ZSBvcGVuZ2wgZGVmYXVsdHMgKi8KICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NMSVBfUExBTkVTLCAmZ2xfbWF4KTsKICAgIGdsX2luZm8tPm1heF9jbGlwcGxhbmVzID0gbWluKFdJTkVEM0RNQVhVU0VSQ0xJUFBMQU5FUywgZ2xfbWF4KTsKICAgIFRSQUNFXyhkM2RfY2FwcykoIkNsaXBQbGFuZXMgc3VwcG9ydCAtIG51bSBQbGFuZXM9JWRcbiIsIGdsX21heCk7CgogICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfTElHSFRTLCAmZ2xfbWF4KTsKICAgIGdsX2luZm8tPm1heF9saWdodHMgPSBnbF9tYXg7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJMaWdodHMgc3VwcG9ydCAtIG1heCBsaWdodHM9JWRcbiIsIGdsX21heCk7CgogICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmZ2xfbWF4KTsKICAgIGdsX2luZm8tPm1heF90ZXh0dXJlX3NpemUgPSBnbF9tYXg7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXhpbXVtIHRleHR1cmUgc2l6ZSBzdXBwb3J0IC0gbWF4IHRleHR1cmUgc2l6ZT0lZFxuIiwgZ2xfbWF4KTsKCiAgICBnbEdldEZsb2F0dihHTF9QT0lOVF9TSVpFX1JBTkdFLCBnbF9mbG9hdHYpOwogICAgZ2xfaW5mby0+bWF4X3BvaW50c2l6ZW1pbiA9IGdsX2Zsb2F0dlswXTsKICAgIGdsX2luZm8tPm1heF9wb2ludHNpemUgPSBnbF9mbG9hdHZbMV07CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXhpbXVtIHBvaW50IHNpemUgc3VwcG9ydCAtIG1heCBwb2ludCBzaXplPSVmXG4iLCBnbF9mbG9hdHZbMV0pOwoKICAgIC8qIFBhcnNlIHRoZSBnbCBzdXBwb3J0ZWQgZmVhdHVyZXMsIGluIHRoZW9yeSBlbmFibGluZyBwYXJ0cyBvZiBvdXIgY29kZSBhcHByb3ByaWF0ZWx5ICovCiAgICBHTF9FeHRlbnNpb25zID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyk7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJHTF9FeHRlbnNpb25zIHJlcG9ydGVkOlxuIik7CgogICAgaWYgKE5VTEwgPT0gR0xfRXh0ZW5zaW9ucykgewogICAgICAgIEVSUigiICAgR0xfRXh0ZW5zaW9ucyByZXR1cm5zIE5VTExcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoKkdMX0V4dGVuc2lvbnMgIT0gMHgwMCkgewogICAgICAgICAgICBjb25zdCBjaGFyICpTdGFydDsKICAgICAgICAgICAgY2hhciAgICAgICAgVGhpc0V4dG5bMjU2XTsKICAgICAgICAgICAgc2l6ZV90ICAgICAgbGVuOwoKICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKkdMX0V4dGVuc2lvbnMpKSBHTF9FeHRlbnNpb25zKys7CiAgICAgICAgICAgIFN0YXJ0ID0gR0xfRXh0ZW5zaW9uczsKICAgICAgICAgICAgd2hpbGUgKCFpc3NwYWNlKCpHTF9FeHRlbnNpb25zKSAmJiAqR0xfRXh0ZW5zaW9ucyAhPSAweDAwKSB7CiAgICAgICAgICAgICAgICBHTF9FeHRlbnNpb25zKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlbiA9IEdMX0V4dGVuc2lvbnMgLSBTdGFydDsKICAgICAgICAgICAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+PSBzaXplb2YoVGhpc0V4dG4pKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBtZW1jcHkoVGhpc0V4dG4sIFN0YXJ0LCBsZW4pOwogICAgICAgICAgICBUaGlzRXh0bltsZW5dID0gJ1wwJzsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiLSAlc1xuIiwgVGhpc0V4dG4pOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YoRVhURU5TSU9OX01BUCkgLyBzaXplb2YoKkVYVEVOU0lPTl9NQVApKTsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChUaGlzRXh0biwgRVhURU5TSU9OX01BUFtpXS5leHRlbnNpb25fc3RyaW5nKSkgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIiBGT1VORDogJXMgc3VwcG9ydFxuIiwgRVhURU5TSU9OX01BUFtpXS5leHRlbnNpb25fc3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhURU5TSU9OX01BUFtpXS5leHRlbnNpb25dID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgTEVBVkVfR0woKTsKCiAgICAgICAgLyogTm93IHdvcmsgb3V0IHdoYXQgR0wgc3VwcG9ydCB0aGlzIGNhcmQgcmVhbGx5IGhhcyAqLwojZGVmaW5lIFVTRV9HTF9GVU5DKHR5cGUsIHBmbiwgZXh0LCByZXBsYWNlKSB7IFwKICAgICAgICAgICAgRFdPUkQgdmVyID0gdmVyX2Zvcl9leHQoZXh0KTsgXAogICAgICAgICAgICBpZihnbF9pbmZvLT5zdXBwb3J0ZWRbZXh0XSkgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcGZuKTsgXAogICAgICAgICAgICBlbHNlIGlmKHZlciAmJiB2ZXIgPD0gZ2xfaW5mby0+Z2xfdmVyc2lvbikgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcmVwbGFjZSk7IFwKICAgICAgICAgICAgZWxzZSBnbF9pbmZvLT5wZm4gPSBOVUxMOyBcCiAgICAgICAgfQogICAgICAgIEdMX0VYVF9GVU5DU19HRU47CiN1bmRlZiBVU0VfR0xfRlVOQwoKI2RlZmluZSBVU0VfR0xfRlVOQyh0eXBlLCBwZm4sIGV4dCwgcmVwbGFjZSkgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcGZuKTsKICAgICAgICBXR0xfRVhUX0ZVTkNTX0dFTjsKI3VuZGVmIFVTRV9HTF9GVU5DCgogICAgICAgIEVOVEVSX0dMKCk7CiAgICAgICAgLyogTm93IG1hcmsgYWxsIHRoZSBleHRlbnNpb25zIHN1cHBvcnRlZCB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlIG9wZW5nbCBjb3JlIHZlcnNpb24uIERvIHRoaXMgKmFmdGVyKgogICAgICAgICAqIGxvYWRpbmcgdGhlIGZ1bmN0aW9ucywgb3RoZXJ3aXNlIHRoZSBjb2RlIGFib3ZlIHdpbGwgbG9hZCB0aGUgZXh0ZW5zaW9uIGVudHJ5IHBvaW50cyBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAqIGNvcmUgZnVuY3Rpb25zLCB3aGljaCBtYXkgbm90IHdvcmsKICAgICAgICAgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihFWFRFTlNJT05fTUFQKSAvIHNpemVvZigqRVhURU5TSU9OX01BUCkpOyArK2kpIHsKICAgICAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtFWFRFTlNJT05fTUFQW2ldLmV4dGVuc2lvbl0gPT0gRkFMU0UgJiYKICAgICAgICAgICAgICAgIEVYVEVOU0lPTl9NQVBbaV0udmVyc2lvbiA8PSBnbF9pbmZvLT5nbF92ZXJzaW9uICYmIEVYVEVOU0lPTl9NQVBbaV0udmVyc2lvbikgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiIEdMIENPUkU6ICVzIHN1cHBvcnRcbiIsIEVYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uX3N0cmluZyk7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhURU5TSU9OX01BUFtpXS5leHRlbnNpb25dID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUFBMRV9GRU5DRV0pIHsKICAgICAgICAgICAgLyogR0xfTlZfZmVuY2UgYW5kIEdMX0FQUExFX2ZlbmNlIHByb3ZpZGUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBiYXNpY2FsbHkuCiAgICAgICAgICAgICAqIFRoZSBhcHBsZSBleHRlbnNpb24gaW50ZXJhY3RzIHdpdGggc29tZSBvdGhlciBhcHBsZSBleHRzLiBEaXNhYmxlIHRoZSBOVgogICAgICAgICAgICAgKiBleHRlbnNpb24gaWYgdGhlIGFwcGxlIG9uZSBpcyBzdXBwb3J0IHRvIHByZXZlbnQgY29uZnVzaW9uIGluIG90aGVyIHBhcnRzCiAgICAgICAgICAgICAqIG9mIHRoZSBjb2RlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfRkVOQ0VdID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVBQTEVfRkxPQVRfUElYRUxTXSkgewogICAgICAgICAgICAvKiBHTF9BUFBMRV9mbG9hdF9waXhlbHMgPT0gR0xfQVJCX3RleHR1cmVfZmxvYXQgKyBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBUaGUgZW51bXMgYXJlIHRoZSBzYW1lOgogICAgICAgICAgICAgKiBHTF9SR0JBMTZGX0FSQiAgICAgPSBHTF9SR0JBX0ZMT0FUMTZfQVBQTEUgPSAweDg4MUEKICAgICAgICAgICAgICogR0xfUkdCMTZGX0FSQiAgICAgID0gR0xfUkdCX0ZMT0FUMTZfQVBQTEUgID0gMHg4ODFCCiAgICAgICAgICAgICAqIEdMX1JHQkEzMkZfQVJCICAgICA9IEdMX1JHQkFfRkxPQVQzMl9BUFBMRSA9IDB4ODgxNAogICAgICAgICAgICAgKiBHTF9SR0IzMkZfQVJCICAgICAgPSBHTF9SR0JfRkxPQVQzMl9BUFBMRSAgPSAweDg4MTUKICAgICAgICAgICAgICogR0xfSEFMRl9GTE9BVF9BUkIgID0gR0xfSEFMRl9BUFBMRSAgICAgICAgID0gIDB4MTQwQgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoIWdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9GTE9BVF0pIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIiBJTVBMSUVEOiBHTF9BUkJfdGV4dHVyZV9mbG9hdCBzdXBwb3J0KGZyb20gR0xfQVBQTEVfZmxvYXRfcGl4ZWxzXG4iKTsKICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9GTE9BVF0gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCFnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0hBTEZfRkxPQVRfUElYRUxdKSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCIgSU1QTElFRDogR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwgc3VwcG9ydChmcm9tIEdMX0FQUExFX2Zsb2F0X3BpeGVsc1xuIik7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0hBTEZfRkxPQVRfUElYRUxdID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX0NVQkVfTUFQXSkgewogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCIgSU1QTElFRDogTlZJRElBIChOVikgVGV4dHVyZSBHZW4gUmVmbGVjdGlvbiBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW05WX1RFWEdFTl9SRUZMRUNUSU9OXSA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVEVYVFVSRV9TSEFERVIyXSkgewogICAgICAgICAgICAvKiBHTF9BVElfZW52bWFwX2J1bXBtYXAgd29uJ3QgcGxheSBuaWNlIHdpdGggdGV4dHVyZSBzaGFkZXJzLCBzbyBkaXNhYmxlIGl0CiAgICAgICAgICAgICAqIFdvbid0IG9jY3VyIGluIGFueSByZWFsIHdvcmxkIHNpdHVhdGlvbiB0aG91Z2gKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBVElfRU5WTUFQX0JVTVBNQVBdID0gRkFMU0U7CiAgICAgICAgICAgIGlmKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9SRUdJU1RFUl9DT01CSU5FUlNdKSB7CiAgICAgICAgICAgICAgICAvKiBBbHNvIGRpc2FibGUgQVRJX0ZSQUdNRU5UX1NIQURFUiBpZiByZWdpc3RlciBjb21iaW5lcnMgYW5kIHRleHR1cmVfc2hhZGVyMgogICAgICAgICAgICAgICAgICogYXJlIHN1cHBvcnRlZC4gVGhlIG52IGV4dGVuc2lvbnMgcHJvdmlkZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIHRoZQogICAgICAgICAgICAgICAgICogQVRJIG9uZSwgYW5kIGEgYml0IG1vcmUoc2lnbmVkIHBpeGVsZm9ybWF0cykKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FUSV9GUkFHTUVOVF9TSEFERVJdID0gRkFMU0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfRFJBV19CVUZGRVJTXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCLCAmZ2xfbWF4KTsKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2J1ZmZlcnMgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBkcmF3IGJ1ZmZlcnM6ICV1XG4iLCBnbF9tYXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9NVUxUSVRFWFRVUkVdKSB7CiAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfVU5JVFNfQVJCLCAmZ2xfbWF4KTsKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3RleHR1cmVzID0gbWluKE1BWF9URVhUVVJFUywgZ2xfbWF4KTsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IHRleHR1cmVzOiAlZFxuIiwgZ2xfaW5mby0+bWF4X3RleHR1cmVzKTsKCiAgICAgICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfUkVHSVNURVJfQ09NQklORVJTXSkgewogICAgICAgICAgICAgICAgR0xpbnQgdG1wOwogICAgICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfR0VORVJBTF9DT01CSU5FUlNfTlYsICZ0bXApOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3RleHR1cmVfc3RhZ2VzID0gbWluKE1BWF9URVhUVVJFUywgdG1wKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF90ZXh0dXJlX3N0YWdlcyA9IG1pbihNQVhfVEVYVFVSRVMsIGdsX21heCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IHRleHR1cmUgc3RhZ2VzOiAlZFxuIiwgZ2xfaW5mby0+bWF4X3RleHR1cmVfc3RhZ2VzKTsKCiAgICAgICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0ZSQUdNRU5UX1BST0dSQU1dKSB7CiAgICAgICAgICAgICAgICBHTGludCB0bXA7CiAgICAgICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiwgJnRtcCk7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfZnJhZ21lbnRfc2FtcGxlcnMgPSBtaW4oTUFYX0ZSQUdNRU5UX1NBTVBMRVJTLCB0bXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2ZyYWdtZW50X3NhbXBsZXJzID0gbWF4KGdsX2luZm8tPm1heF9mcmFnbWVudF9zYW1wbGVycywgZ2xfbWF4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggZnJhZ21lbnQgc2FtcGxlcnM6ICVkXG4iLCBnbF9pbmZvLT5tYXhfZnJhZ21lbnRfc2FtcGxlcnMpOwoKICAgICAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVkVSVEVYX1NIQURFUl0pIHsKICAgICAgICAgICAgICAgIEdMaW50IHRtcDsKICAgICAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiwgJnRtcCk7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzID0gdG1wOwogICAgICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIsICZ0bXApOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzID0gdG1wOwoKICAgICAgICAgICAgICAgIC8qIExvYWRpbmcgR0xTTCBzYW1wbGVyIHVuaWZvcm1zIGlzIG11Y2ggc2ltcGxlciBpZiB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNhbXBsZXIgc2V0dXAKICAgICAgICAgICAgICAgICAqIGlzIGtub3duIGF0IHNoYWRlciBsaW5rIHRpbWUuIEluIGEgdmVydGV4IHNoYWRlciArIHBpeGVsIHNoYWRlciBjb21iaW5hdGlvbiB0aGlzIGlzbid0CiAgICAgICAgICAgICAgICAgKiBhbiBpc3N1ZSBiZWNhdXNlIHRoZW4gdGhlIHNhbXBsZXIgc2V0dXAgb25seSBkZXBlbmRzIG9uIHRoZSB0d28gc2hhZGVycy4gSWYgYSBwaXhlbAogICAgICAgICAgICAgICAgICogc2hhZGVyIGlzIHVzZWQgd2l0aCBmaXhlZCBmdW5jdGlvbiB2ZXJ0ZXggcHJvY2Vzc2luZyB3ZSdyZSBmaW5lIHRvbyBiZWNhdXNlIGZpeGVkIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgKiB2ZXJ0ZXggcHJvY2Vzc2luZyBkb2Vzbid0IHVzZSBhbnkgc2FtcGxlcnMuIElmIGZpeGVkIGZ1bmN0aW9uIGZyYWdtZW50IHByb2Nlc3NpbmcgaXMKICAgICAgICAgICAgICAgICAqIHVzZWQgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdmVydGV4IHNhbXBsZXIgc2V0dXBzIGFyZSB2YWxpZCB0b2dldGhlciB3aXRoIGFsbAogICAgICAgICAgICAgICAgICogcG9zc2libGUgZml4ZWQgZnVuY3Rpb24gZnJhZ21lbnQgcHJvY2Vzc2luZyBzZXR1cHMuIFRoaXMgaXMgdHJ1ZSBpZiB2c2FtcGxlcnMgKyBNQVhfVEVYVFVSRVMKICAgICAgICAgICAgICAgICAqIDw9IG1heF9zYW1wbGVycy4gVGhpcyBpcyB0cnVlIG9uIGFsbCBkM2Q5IGNhcmRzIHRoYXQgc3VwcG9ydCB2dGYoZ2YgNiBhbmQgZ2Y3IGNhcmRzKS4KICAgICAgICAgICAgICAgICAqIGR4OSByYWRlb24gY2FyZHMgZG8gbm90IHN1cHBvcnQgdmVydGV4IHRleHR1cmUgZmV0Y2guIERYMTAgY2FyZHMgaGF2ZSAxMjggc2FtcGxlcnMsIGFuZAogICAgICAgICAgICAgICAgICogZHg5IGlzIGxpbWl0ZWQgdG8gOCBmaXhlZCBmdW5jdGlvbiB0ZXh0dXJlIHN0YWdlcyBhbmQgNCB2ZXJ0ZXggc2FtcGxlcnMuIERYMTAgZG9lcyBub3QgaGF2ZQogICAgICAgICAgICAgICAgICogYSBmaXhlZCBmdW5jdGlvbiBwaXBlbGluZSBhbnltb3JlLgogICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAqIFNvIHRoaXMgaXMganVzdCBhIGNoZWNrIHRvIGNoZWNrIHRoYXQgb3VyIGFzc3VtcHRpb24gaG9sZHMgdHJ1ZS4gSWYgbm90LCB3cml0ZSBhIHdhcm5pbmcKICAgICAgICAgICAgICAgICAqIGFuZCByZWR1Y2UgdGhlIG51bWJlciBvZiB2ZXJ0ZXggc2FtcGxlcnMgb3IgcHJvYmFibHkgZGlzYWJsZSB2ZXJ0ZXggdGV4dHVyZSBmZXRjaC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYoZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycyAmJgogICAgICAgICAgICAgICAgICAgTUFYX1RFWFRVUkVTICsgZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycyA+IGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycykgewogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJPcGVuR0wgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgJXUgdmVydGV4IHNhbXBsZXJzIGFuZCAldSB0b3RhbCBzYW1wbGVyc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzLCBnbF9pbmZvLT5tYXhfY29tYmluZWRfc2FtcGxlcnMpOwogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJFeHBlY3RlZCB2ZXJ0ZXggc2FtcGxlcnMgKyBNQVhfVEVYVFVSRVMoPTgpID4gY29tYmluZWRfc2FtcGxlcnNcbiIpOwogICAgICAgICAgICAgICAgICAgIGlmKCBnbF9pbmZvLT5tYXhfY29tYmluZWRfc2FtcGxlcnMgPiBNQVhfVEVYVFVSRVMgKQogICAgICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycyAtIE1BWF9URVhUVVJFUzsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF92ZXJ0ZXhfc2FtcGxlcnMgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzID0gZ2xfaW5mby0+bWF4X2ZyYWdtZW50X3NhbXBsZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCB2ZXJ0ZXggc2FtcGxlcnM6ICV1XG4iLCBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzKTsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IGNvbWJpbmVkIHNhbXBsZXJzOiAldVxuIiwgZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVkVSVEVYX0JMRU5EXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVU5JVFNfQVJCLCAmZ2xfbWF4KTsKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2JsZW5kcyA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IGJsZW5kczogJXVcbiIsIGdsX2luZm8tPm1heF9ibGVuZHMpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0VYVF9URVhUVVJFM0RdKSB7CiAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYXzNEX1RFWFRVUkVfU0laRV9FWFQsICZnbF9tYXgpOwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfdGV4dHVyZTNkX3NpemUgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCB0ZXh0dXJlM0Qgc2l6ZTogJWRcbiIsIGdsX2luZm8tPm1heF90ZXh0dXJlM2Rfc2l6ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPm1heF9hbmlzb3Ryb3B5ID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggYW5pc290cm9weTogJWRcbiIsIGdsX2luZm8tPm1heF9hbmlzb3Ryb3B5KTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfRlJBR01FTlRfUFJPR1JBTV0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfYXJiX3ZlcnNpb24gPSBQU19WRVJTSU9OXzExOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCLCBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfYXJiX2NvbnN0YW50c0YgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfRlJBR01FTlRfUFJPR1JBTSBmbG9hdCBjb25zdGFudHM6ICVkXG4iLCBnbF9pbmZvLT5wc19hcmJfY29uc3RhbnRzRik7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xHZXRQcm9ncmFtaXZBUkIoR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIsIEdMX01BWF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfYXJiX21heF90ZW1wcyA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IEFSQl9GUkFHTUVOVF9QUk9HUkFNIG5hdGl2ZSB0ZW1wb3JhcmllczogJWRcbiIsIGdsX2luZm8tPnBzX2FyYl9tYXhfdGVtcHMpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCLCBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiwgJmdsX21heCkpOwogICAgICAgICAgICBnbF9pbmZvLT5wc19hcmJfbWF4X2luc3RydWN0aW9ucyA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IEFSQl9GUkFHTUVOVF9QUk9HUkFNIG5hdGl2ZSBpbnN0cnVjdGlvbnM6ICVkXG4iLCBnbF9pbmZvLT5wc19hcmJfbWF4X2luc3RydWN0aW9ucyk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9QUk9HUkFNXSkgewogICAgICAgICAgICBnbF9pbmZvLT52c19hcmJfdmVyc2lvbiA9IFZTX1ZFUlNJT05fMTE7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xHZXRQcm9ncmFtaXZBUkIoR0xfVkVSVEVYX1BST0dSQU1fQVJCLCBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfYXJiX2NvbnN0YW50c0YgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfVkVSVEVYX1BST0dSQU0gZmxvYXQgY29uc3RhbnRzOiAlZFxuIiwgZ2xfaW5mby0+dnNfYXJiX2NvbnN0YW50c0YpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiwgJmdsX21heCkpOwogICAgICAgICAgICBnbF9pbmZvLT52c19hcmJfbWF4X3RlbXBzID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggQVJCX1ZFUlRFWF9QUk9HUkFNIG5hdGl2ZSB0ZW1wb3JhcmllczogJWRcbiIsIGdsX2luZm8tPnZzX2FyYl9tYXhfdGVtcHMpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfYXJiX21heF9pbnN0cnVjdGlvbnMgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfVkVSVEVYX1BST0dSQU0gbmF0aXZlIGluc3RydWN0aW9uczogJWRcbiIsIGdsX2luZm8tPnZzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zKTsKCiAgICAgICAgICAgIGdsX2luZm8tPmFyYl92c19vZmZzZXRfbGltaXQgPSB0ZXN0X2FyYl92c19vZmZzZXRfbGltaXQoZ2xfaW5mbyk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9TSEFERVJdKSB7CiAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCLCAmZ2xfbWF4KTsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfZ2xzbF9jb25zdGFudHNGID0gZ2xfbWF4IC8gNDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IEFSQl9WRVJURVhfU0hBREVSIGZsb2F0IGNvbnN0YW50czogJXVcbiIsIGdsX2luZm8tPnZzX2dsc2xfY29uc3RhbnRzRik7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0ZSQUdNRU5UX1NIQURFUl0pIHsKICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPnBzX2dsc2xfY29uc3RhbnRzRiA9IGdsX21heCAvIDQ7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfRlJBR01FTlRfU0hBREVSIGZsb2F0IGNvbnN0YW50czogJXVcbiIsIGdsX2luZm8tPnBzX2dsc2xfY29uc3RhbnRzRik7CiAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZBUllJTkdfRkxPQVRTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPm1heF9nbHNsX3ZhcnlpbmdzID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggR0xTTCB2YXJ5aW5nczogJXUgKCV1IDQgY29tcG9uZW50IHZhcnlpbmdzKVxuIiwgZ2xfbWF4LCBnbF9tYXggLyA0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtFWFRfVkVSVEVYX1NIQURFUl0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfYXRpX3ZlcnNpb24gPSBWU19WRVJTSU9OXzExOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX1ZFUlRFWF9QUk9HUkFNM10pIHsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfbnZfdmVyc2lvbiA9IFZTX1ZFUlNJT05fMzA7CiAgICAgICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVkVSVEVYX1BST0dSQU0yXSkgewogICAgICAgICAgICBnbF9pbmZvLT52c19udl92ZXJzaW9uID0gVlNfVkVSU0lPTl8yMDsKICAgICAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9WRVJURVhfUFJPR1JBTTFfMV0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfbnZfdmVyc2lvbiA9IFZTX1ZFUlNJT05fMTE7CiAgICAgICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVkVSVEVYX1BST0dSQU1dKSB7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX252X3ZlcnNpb24gPSBWU19WRVJTSU9OXzEwOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX0ZSQUdNRU5UX1BST0dSQU0yXSkgewogICAgICAgICAgICBnbF9pbmZvLT5wc19udl92ZXJzaW9uID0gUFNfVkVSU0lPTl8zMDsKICAgICAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9GUkFHTUVOVF9QUk9HUkFNXSkgewogICAgICAgICAgICBnbF9pbmZvLT5wc19udl92ZXJzaW9uID0gUFNfVkVSU0lPTl8yMDsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9MSUdIVF9NQVhfRVhQT05FTlRdKSB7CiAgICAgICAgICAgIGdsR2V0RmxvYXR2KEdMX01BWF9TSElOSU5FU1NfTlYsICZnbF9pbmZvLT5tYXhfc2hpbmluZXNzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbF9pbmZvLT5tYXhfc2hpbmluZXNzID0gMTI4LjA7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXT10pIHsKICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBmdWxsIE5QMiB0ZXh0dXJlIHN1cHBvcnQsIGRpc2FibGUgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlIGJlY2F1c2Ugd2Ugd2lsbCBuZXZlciB1c2UgaXQuCiAgICAgICAgICAgICAqIFRoaXMgc2F2ZXMgYSBmZXcgcmVkdW5kYW50IGdsRGlzYWJsZSBjYWxscwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX1JFQ1RBTkdMRV0gPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgaWYoZ2xfaW5mby0+c3VwcG9ydGVkW0FUSV9GUkFHTUVOVF9TSEFERVJdKSB7CiAgICAgICAgICAgIC8qIERpc2FibGUgTlZfcmVnaXN0ZXJfY29tYmluZXJzIGFuZCBmcmFnbWVudCBzaGFkZXIgaWYgdGhpcyBpcyBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAqIGdlbmVyYWxseSB0aGUgTlYgZXh0ZW5zaW9ucyBhcmUgcHJlZmVycmVkIG92ZXIgdGhlIEFUSSBvbmVzLCBhbmQgdGhpcwogICAgICAgICAgICAgKiBleHRlbnNpb24gaXMgZGlzYWJsZWQgaWYgcmVnaXN0ZXJfY29tYmluZXJzIGFuZCB0ZXh0dXJlX3NoYWRlcjIgYXJlIGJvdGgKICAgICAgICAgICAgICogc3VwcG9ydGVkLiBTbyB3ZSByZWFjaCB0aGlzIHBsYWNlIG9ubHkgaWYgd2UgaGF2ZSBpbmNvbXBsZXRlIE5WIGR4bGV2ZWwgOAogICAgICAgICAgICAgKiBmcmFnbWVudCBwcm9jZXNzaW5nIHN1cHBvcnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtOVl9SRUdJU1RFUl9DT01CSU5FUlNdID0gRkFMU0U7CiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtOVl9SRUdJU1RFUl9DT01CSU5FUlMyXSA9IEZBTFNFOwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVEVYVFVSRV9TSEFERVJdID0gRkFMU0U7CiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtOVl9URVhUVVJFX1NIQURFUjJdID0gRkFMU0U7CiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtOVl9URVhUVVJFX1NIQURFUjNdID0gRkFMU0U7CiAgICAgICAgfQoKICAgIH0KICAgIGNoZWNrR0xjYWxsKCJleHRlbnNpb24gZGV0ZWN0aW9uXG4iKTsKCiAgICAvKiBJbiBzb21lIGNhc2VzIHRoZSBudW1iZXIgb2YgdGV4dHVyZSBzdGFnZXMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBudW1iZXIKICAgICAqIG9mIHNhbXBsZXJzLiBUaGUgR0Y0IGZvciBleGFtcGxlIGNhbiB1c2Ugb25seSAyIHNhbXBsZXJzIChubyBmcmFnbWVudAogICAgICogc2hhZGVycyksIGJ1dCA4IHRleHR1cmUgc3RhZ2VzIChyZWdpc3RlciBjb21iaW5lcnMpLiAqLwogICAgZ2xfaW5mby0+bWF4X3NhbXBsZXJfc3RhZ2VzID0gbWF4KGdsX2luZm8tPm1heF9mcmFnbWVudF9zYW1wbGVycywgZ2xfaW5mby0+bWF4X3RleHR1cmVfc3RhZ2VzKTsKCiAgICAvKiBXZSBjYW4gb25seSB1c2UgT1JNX0ZCTyB3aGVuIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBpdC4gKi8KICAgIGlmICh3aW5lZDNkX3NldHRpbmdzLm9mZnNjcmVlbl9yZW5kZXJpbmdfbW9kZSA9PSBPUk1fRkJPICYmICFnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX0ZSQU1FQlVGRkVSX09CSkVDVF0pIHsKICAgICAgICBXQVJOXyhkM2RfY2FwcykoIkdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3Qgbm90IHN1cHBvcnRlZCwgZmFsbGluZyBiYWNrIHRvIFBCdWZmZXIgb2Zmc2NyZWVuIHJlbmRlcmluZyBtb2RlLlxuIik7CiAgICAgICAgd2luZWQzZF9zZXR0aW5ncy5vZmZzY3JlZW5fcmVuZGVyaW5nX21vZGUgPSBPUk1fUEJVRkZFUjsKICAgIH0KCiAgICAvKiBNUlRzIGFyZSBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2hlbiBGQk9zIGFyZSB1c2VkLiAqLwogICAgaWYgKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlICE9IE9STV9GQk8pIHsKICAgICAgICBnbF9pbmZvLT5tYXhfYnVmZmVycyA9IDE7CiAgICB9CgogICAgLyogQmVsb3cgaXMgYSBsaXN0IG9mIE52aWRpYSBhbmQgQVRJIEdQVXMuIEJvdGggdmVuZG9ycyBoYXZlIGRvemVucyBvZiBkaWZmZXJlbnQgR1BVcyB3aXRoIHJvdWdobHkgdGhlIHNhbWUKICAgICAqIGZlYXR1cmVzLiBJbiBtb3N0IGNhc2VzIEdQVXMgZnJvbSBhIGNlcnRhaW4gZmFtaWx5IGRpZmZlciBpbiBjbG9ja3NwZWVkcywgdGhlIGFtb3VudCBvZiB2aWRlbyBtZW1vcnkgYW5kCiAgICAgKiBpbiBjYXNlIG9mIHRoZSBsYXRlc3QgdmlkZW9jYXJkcyBpbiB0aGUgbnVtYmVyIG9mIHBpeGVsL3ZlcnRleCBwaXBlbGluZXMuCiAgICAgKgogICAgICogQSBEaXJlY3QzRCBkZXZpY2Ugb2JqZWN0IGNvbnRhaW5zIHRoZSBQQ0kgaWQgKHZlbmRvciArIGRldmljZSkgb2YgdGhlIHZpZGVvY2FyZCB3aGljaCBpcyB1c2VkIGZvcgogICAgICogcmVuZGVyaW5nLiBWYXJpb3VzIGdhbWVzIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGdldCBhIHJvdWdoIGVzdGltYXRpb24gb2YgdGhlIGZlYXR1cmVzIG9mIHRoZSBjYXJkCiAgICAgKiBhbmQgc29tZSBtaWdodCB1c2UgaXQgZm9yIGVuYWJsaW5nIDNkIGVmZmVjdHMgb25seSBvbiBjZXJ0YWluIHR5cGVzIG9mIHZpZGVvY2FyZHMuIEluIHNvbWUgY2FzZXMKICAgICAqIGdhbWVzIG1pZ2h0IGV2ZW4gdXNlIGl0IHRvIHdvcmsgYXJvdW5kIGJ1Z3Mgd2hpY2ggaGFwcGVuIG9uIGNlcnRhaW4gdmlkZW9jYXJkcy9kcml2ZXIgY29tYmluYXRpb25zLgogICAgICogVGhlIHByb2JsZW0gaXMgdGhhdCBPcGVuR0wgb25seSBleHBvc2VzIGEgcmVuZGVyaW5nIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB2aWRlb2NhcmQgYW5kCiAgICAgKiBub3QgdGhlIFBDSSBpZC4KICAgICAqCiAgICAgKiBWYXJpb3VzIGdhbWVzIGRlcGVuZCBvbiB0aGUgUENJIGlkLCBzbyBzb21laG93IHdlIG5lZWQgdG8gcHJvdmlkZSBvbmUuIEEgc2ltcGxlIG9wdGlvbiBpcyB0byBwYXJzZQogICAgICogdGhlIHJlbmRlcmVyIHN0cmluZyBhbmQgdHJhbnNsYXRlIHRoaXMgdG8gdGhlIHJpZ2h0IFBDSSBpZC4gVGhpcyBpcyBhIGxvdCBvZiB3b3JrIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUKICAgICAqIHRoYW4gMjAwIEdQVXMganVzdCBmb3IgTnZpZGlhLiBWYXJpb3VzIGNhcmRzIHNoYXJlIHRoZSBzYW1lIHJlbmRlcmVyIHN0cmluZywgc28gdGhlIGFtb3VudCBvZiBjb2RlIG1pZ2h0CiAgICAgKiBiZSAnc21hbGwnIGJ1dCB0aGVyZSBhcmUgcXVpdGUgYSBudW1iZXIgb2YgZXhjZXB0aW9ucyB3aGljaCB3b3VsZCBtYWtlIHRoaXMgYSBwYWluIHRvIG1haW50YWluLgogICAgICogQW5vdGhlciB3YXkgd291bGQgYmUgdG8gcXVlcnkgdGhlIFBDSSBpZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtIChhc3N1bWluZyB0aGlzIGlzIHRoZSB2aWRlb2NhcmQgd2hpY2gKICAgICAqIGlzIHVzZWQgZm9yIHJlbmRlcmluZyB3aGljaCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlKS4gVGhpcyB3b3VsZCB3b3JrIGJ1dCBpdCBpcyBub3QgdmVyeSBwb3J0YWJsZS4gU2Vjb25kCiAgICAgKiBpdCB3b3VsZCBub3Qgd29yayB3ZWxsIGluLCBsZXQncyBzYXksIGEgcmVtb3RlIFggc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBhbW91bnQgb2YgM2QgZmVhdHVyZXMgd2hpY2ggY2FuIGJlIHVzZWQKICAgICAqIGlzIGxpbWl0ZWQuCiAgICAgKgogICAgICogQXMgc2FpZCBtb3N0IGdhbWVzIG9ubHkgdXNlIHRoZSBQQ0kgaWQgdG8gZ2V0IGFuIGluZGljYXRpb24gb2YgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgY2FyZC4KICAgICAqIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBpZiB0aGUgZ2l2ZW4gaWQgaXMgdGhlIGNvcnJlY3Qgb25lIGlmIHdlIHJldHVybiB0aGUgaWQgb2YgYSBjYXJkIHdpdGgKICAgICAqIHNpbWlsYXIgM2QgZmVhdHVyZXMuCiAgICAgKgogICAgICogVGhlIGNvZGUgYmVsb3cgY2hlY2tzIHRoZSBPcGVuR0wgY2FwYWJpbGl0aWVzIG9mIGEgdmlkZW9jYXJkIGFuZCBtYXRjaGVzIHRoYXQgdG8gYSBjZXJ0YWluIGxldmVsIG9mCiAgICAgKiBEaXJlY3QzRCBmdW5jdGlvbmFsaXR5LiBPbmNlIGEgY2FyZCBwYXNzZXMgdGhlIERpcmVjdDNEOSBjaGVjaywgd2Uga25vdyB0aGF0IHRoZSBjYXJkIChpbiBjYXNlIG9mIE52aWRpYSkKICAgICAqIGlzIGF0IGxlYXN0IGEgR2Vmb3JjZUZYLiBUbyBnaXZlIGEgYmV0dGVyIGVzdGltYXRlIHdlIGRvIGEgYmFzaWMgY2hlY2sgb24gdGhlIHJlbmRlcmVyIHN0cmluZyBidXQgaWYgdGhhdAogICAgICogd29uJ3QgcGFzcyB3ZSByZXR1cm4gYSBkZWZhdWx0IGNhcmQuIFRoaXMgd2F5IGlzIGJldHRlciB0aGFuIG1haW50YWluaW5nIGEgZnVsbCBjYXJkIGRhdGFiYXNlIGFzIGV2ZW4KICAgICAqIHdpdGhvdXQgYSBmdWxsIGRhdGFiYXNlIHdlIGNhbiByZXR1cm4gYSBjYXJkIHdpdGggc2ltaWxhciBmZWF0dXJlcy4gU2Vjb25kIHRoZSBzaXplIG9mIHRoZSBkYXRhYmFzZQogICAgICogY2FuIGJlIG1hZGUgcXVpdGUgc21hbGwgYmVjYXVzZSB3aGVuIHlvdSBrbm93IHdoYXQgdHlwZSBvZiAzZCBmdW5jdGlvbmFsaXR5IGEgY2FyZCBoYXMsIHlvdSBrbm93IHRvIHdoaWNoCiAgICAgKiBHUFUgZmFtaWx5IHRoZSBHUFUgbXVzdCBiZWxvbmcuIEJlY2F1c2Ugb2YgdGhpcyB5b3Ugb25seSBoYXZlIHRvIGNoZWNrIGEgc21hbGwgcGFydCBvZiB0aGUgcmVuZGVyZXIgc3RyaW5nCiAgICAgKiB0byBkaXN0aW5ndWlzaGVzIGJldHdlZW4gZGlmZmVyZW50IG1vZGVscyBmcm9tIHRoYXQgZmFtaWx5LgogICAgICoKICAgICAqIFRoZSBjb2RlIGFsc28gc2VsZWN0cyBhIGRlZmF1bHQgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSB3aGljaCB3ZSB3aWxsIHVzZSBmb3IgYW4gZXN0aW1hdGlvbiBvZiB0aGUgYW1vdW50CiAgICAgKiBvZiBmcmVlIHRleHR1cmUgbWVtb3J5LiBJbiBjYXNlIG9mIHJlYWwgRDNEIHRoZSBhbW91bnQgb2YgdGV4dHVyZSBtZW1vcnkgaW5jbHVkZXMgdmlkZW8gbWVtb3J5IGFuZCBzeXN0ZW0KICAgICAqIG1lbW9yeSAodG8gYmUgc3BlY2lmaWMgQUdQIG1lbW9yeSBvciBpbiBjYXNlIG9mIFBDSUUgVHVyYm9DYWNoZS9IeXBlck1lbW9yeSkuIFdlIGRvbid0IGtub3cgaG93IG11Y2gKICAgICAqIHN5c3RlbSBtZW1vcnkgY2FuIGJlIGFkZHJlc3NlZCBieSB0aGUgc3lzdGVtIGJ1dCB3ZSBjYW4gbWFrZSBhIHJlYXNvbmFibGUgZXN0aW1hdGlvbiBhYm91dCB0aGUgYW1vdW50IG9mCiAgICAgKiB2aWRlbyBtZW1vcnkuIElmIHRoZSB2YWx1ZSBpcyBzbGlnaHRseSB3cm9uZyBpdCBkb2Vzbid0IG1hdHRlciBhcyB3ZSBkaWRuJ3QgaW5jbHVkZSBBR1AtbGlrZSBtZW1vcnkgd2hpY2gKICAgICAqIG1ha2VzIHRoZSBhbW91bnQgb2YgYWRkcmVzc2FibGUgbWVtb3J5IGhpZ2hlciBhbmQgc2Vjb25kIE9wZW5HTCBpc24ndCB0aGF0IGNyaXRpY2FsIGl0IG1vdmVzIHRvIHN5c3RlbQogICAgICogbWVtb3J5IGJlaGluZCBvdXIgYmFja3MgaWYgcmVhbGx5IG5lZWRlZC4KICAgICAqIE5vdGUgdGhhdCB0aGUgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSBjYW4gYmUgb3ZlcnJ1bGVkIHVzaW5nIGEgcmVnaXN0cnkgc2V0dGluZy4KICAgICAqLwogICAgc3dpdGNoIChnbF9pbmZvLT5nbF92ZW5kb3IpIHsKICAgICAgICBjYXNlIFZFTkRPUl9OVklESUE6CiAgICAgICAgICAgIC8qIEJvdGggdGhlIEdlZm9yY2VGWCwgNnh4eCBhbmQgN3h4eCBzZXJpZXMgc3VwcG9ydCBEM0Q5LiBUaGUgbGFzdCB0d28gdHlwZXMgaGF2ZSBtb3JlCiAgICAgICAgICAgICAqIHNoYWRlciBjYXBhYmlsaXRpZXMsIHNvIHdlIHVzZSB0aGUgc2hhZGVyIGNhcGFiaWxpdGllcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZYIGFuZCA2eHh4Lzd4eHguCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZihXSU5FX0QzRDlfQ0FQQUJMRShnbF9pbmZvKSAmJiAoZ2xfaW5mby0+dnNfbnZfdmVyc2lvbiA9PSBWU19WRVJTSU9OXzMwKSkgewogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTkgLSBoaWdoZW5kICovCiAgICAgICAgICAgICAgICBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI5ODAwIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV85ODAwR1Q7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNTEyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTkgLSBtaWRlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiOTYwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfOTYwMEdUOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDM4NDsgLyogVGhlIDk2MDBHU08gaGFzIDM4NE1CLCB0aGUgOTYwMEdUIGhhcyA1MTItMTAyNE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlOCAtIGhpZ2hlbmQgKi8KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4ODAwIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV84ODAwR1RTOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDMyMDsgLyogVGhlIDg4MDBHVFMgdXNlcyAzMjBNQiwgYSA4ODAwR1RYIGNhbiBoYXZlIDc2OE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlOCAtIG1pZGVuZCBtb2JpbGUgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODYwMCBNIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV84NjAwTUdUOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDUxMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U4IC0gbWlkZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg2MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NzAwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfODYwMEdUOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDI1NjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U4IC0gbG93ZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjgzMDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NDAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODUwMCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzgzMDBHUzsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAxMjg7IC8qIDEyOC0yNTZNQiBmb3IgYSA4MzAwLCAyNTYtNTEyTUIgZm9yIGEgODQwMCAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTcgLSBoaWdoZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjc4MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI3OTAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzk1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlF1YWRybyBGWCA0IikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiUXVhZHJvIEZYIDUiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV83ODAwR1Q7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OyAvKiBBIDc4MDBHVCB1c2VzIDI1Nk1CIHdoaWxlIGhpZ2hlbmQgNzkwMCBjYXJkcyBjYW4gdXNlIDUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNyBtaWRlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzYwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjc3MDAiKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzc2MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OyAvKiBUaGUgNzYwMCB1c2VzIDI1Ni01MTJNQiAqLwogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTcgbG93ZXIgbWVkaXVtICovCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzQwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfNzQwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAyNTY7IC8qIFRoZSA3NDAwIHVzZXMgMjU2LTUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNyBsb3dlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzMwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfNzMwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAyNTY7IC8qIE1hYyBQcm9zIHdpdGggdGhpcyBjYXJkIGhhdmUgMjU2IE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNiBoaWdoZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjY4MDAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV82ODAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogVGhlIDY4MDAgdXNlcyAxMjgtMjU2TUIsIHRoZSA3NjAwIHVzZXMgMjU2LTUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNiAtIG1pZGVuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI2NjAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNjYxMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjY3MDAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV82NjAwR1Q7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMTI4OyAvKiBBIDY2MDBHVCBoYXMgMTI4LTI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNi83IGxvd2VuZCAqLwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfNjIwMDsgLyogR2Vmb3JjZSA2MTAwLzYxNTAvNjIwMC83MzAwLzc0MDAvNzUwMCAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYoV0lORV9EM0Q5X0NBUEFCTEUoZ2xfaW5mbykpIHsKICAgICAgICAgICAgICAgIC8qIEdlZm9yY2VGWCAtIGhpZ2hlbmQgKi8KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1ODAwIikgfHwKICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1OTAwIikgfHwKICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1OTUwIikgfHwKICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJRdWFkcm8gRlgiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRUZYXzU4MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OyAvKiA1ODAwLTU5MDAgY2FyZHMgdXNlIDI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlRlggLSBtaWRlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNTYwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjU2NTAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1NzAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNTc1MCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFRlhfNTYwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAxMjg7IC8qIEEgNTYwMCB1c2VzIDEyOC0yNTZNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogR2Vmb3JjZUZYIC0gbG93ZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRUZYXzUyMDA7IC8qIEdlZm9yY2VGWCA1MTAwLzUyMDAvNTI1MC81MzAwLzU1MDAgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogTm9ybWFsIEZYNTIwMCBjYXJkcyB1c2UgNjQtMjU2TUI7IGxhcHRvcCAobm9uLXN0YW5kYXJkKSBjYW4gaGF2ZSBsZXNzICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihXSU5FX0QzRDhfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkdlRm9yY2U0IFRpIikgfHwgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiUXVhZHJvNCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0U0X1RJNDIwMDsgLyogR2Vmb3JjZTQgVGk0MjAwL1RpNDQwMC9UaTQ2MDAvVGk0ODAwLCBRdWFkcm80ICovCiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNjQ7IC8qIEdlZm9yY2U0IFRpIGNhcmRzIGhhdmUgNjQtMTI4TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFMzsgLyogR2Vmb3JjZTMgc3RhbmRhcmQvVGkyMDAvVGk1MDAsIFF1YWRybyBEQ0MgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogR2Vmb3JjZTMgY2FyZHMgaGF2ZSA2NC0xMjhNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYoV0lORV9EM0Q3X0NBUEFCTEUoZ2xfaW5mbykpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJHZUZvcmNlNCBNWCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0U0X01YOyAvKiBNWDQyMC9NWDQ0MC9NWDQ2MC9NWDQwMDAgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogTW9zdCBHZWZvcmNlNE1YIEdQVXMgaGF2ZSBhdCBsZWFzdCA2NE1CIG9mIG1lbW9yeSwgc29tZSBlYXJseSBtb2RlbHMgaGFkIDMyTUIgYnV0IG1vc3QgaGF2ZSA2NE1CIG9yIGV2ZW4gMTI4TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiR2VGb3JjZTIgTVgiKSB8fCBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJRdWFkcm8yIE1YUiIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0UyX01YOyAvKiBHZWZvcmNlMiBzdGFuZGFyZC9NWDEwMC9NWDIwMC9NWDQwMCwgUXVhZHJvMiBNWFIgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogR2Vmb3JjZTJNWCBHUFVzIGhhdmUgMzItNjRNQiBvZiB2aWRlbyBtZW1vcnkgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiR2VGb3JjZTIiKSB8fCBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJRdWFkcm8yIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTI7IC8qIEdlZm9yY2UyIEdUUy9Qcm8vVGkvVWx0cmEsIFF1YWRybzIgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogR2Vmb3JjZTIgR1BVcyBoYXZlIDMyLTY0TUIgb2YgdmlkZW8gbWVtb3J5ICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTsgLyogR2Vmb3JjZSAyNTYvRERSLCBRdWFkcm8gKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogTW9zdCBHZWZvcmNlMSBjYXJkcyBoYXZlIDMyTUIsIHRoZXJlIGFyZSBhbHNvIHNvbWUgcmFyZSAxNiBhbmQgNjRNQiAoRGVsbCkgbW9kZWxzICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiVE5UMiIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX1JJVkFfVE5UMjsgLyogUml2YSBUTlQyIHN0YW5kYXJkL002NC9Qcm8vVWx0cmEgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogTW9zdCBUTlQyIGJvYXJkcyBoYXZlIDMyTUIsIHRob3VnaCB0aGVyZSBhcmUgMTZNQiBib2FyZHMgdG9vICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfUklWQV9UTlQ7IC8qIFJpdmEgVE5ULCBWYW50YSAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDE2OyAvKiBNb3N0IFROVCBib2FyZHMgaGF2ZSAxNk1CLCBzb21lIHJhcmUgbW9kZWxzIGhhdmUgOE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBWRU5ET1JfQVRJOgogICAgICAgICAgICBpZihXSU5FX0QzRDlfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgLyogUmFkZW9uIFI2eHggSEQyOTAwL0hEMzgwMCAtIGhpZ2hlbmQgKi8KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAyOTAwIikgfHwKICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAzODcwIikgfHwKICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAzODUwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9IRDI5MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNTEyOyAvKiBIRDI5MDAvSEQzODAwIHVzZXMgMjU2LTEwMjRNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogUmFkZW9uIFI2eHggSEQyNjAwL0hEMzYwMCAtIG1pZGVuZDsgSEQzODMwIGlzIENoaW5hLW9ubHkgbWlkZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAyNjAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkhEIDM4MzAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMzY5MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAzNjUwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9IRDI2MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OyAvKiBIRDI2MDAvSEQzNjAwIHVzZXMgMjU2LTUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjZ4eCBIRDIzMDAvSEQyNDAwL0hEMzQwMCAtIGxvd2VuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMjMwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAyNDAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkhEIDM0NzAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMzQ1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAzNDMwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9IRDIzMDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMTI4OyAvKiBIRDIzMDAgdXNlcyBhdCBsZWFzdCAxMjhNQiwgSEQyNDAwIHVzZXMgMjU2TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIFJhZGVvbiBSNnh4L1I3eHggaW50ZWdyYXRlZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMzEwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJIRCAzMjAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkhEIDMzMDAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9BVElfUkFERU9OX0hEMzIwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAxMjg7IC8qIDEyOE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjV4eCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE2MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE2NTAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE4MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE5MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE5NTAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9BVElfUkFERU9OX1gxNjAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogWDE2MDAgdXNlcyAxMjgtMjU2TUIsID49WDE4MDAgdXNlcyAyNTZNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogUmFkZW9uIFI0eHggKyBYMTMwMC9YMTQwMC9YMTQ1MC9YMTU1MC9YMjMwMCAobG93ZW5kIFI1eHgpICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlg3MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJYODAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDg1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlgxMzAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE0MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJYMTQ1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlgxNTUwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9YNzAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogeDcwMC94OCowIHVzZSAxMjgtMjU2TUIsID49eDEzMDAgMTI4LTUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjN4eCAqLyAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0FUSV9SQURFT05fOTUwMDsgLyogUmFkZW9uIDk1MDAvOTU1MC85NjAwLzk3MDAvOTgwMC9YMzAwL1g1NTAvWDYwMCAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiBSYWRlb24gOTUwMCB1c2VzIDY0TUIsIGhpZ2hlciBtb2RlbHMgdXNlIHVwIHRvIDI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihXSU5FX0QzRDhfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl84NTAwOyAvKiBSYWRlb24gODUwMC85MDAwLzkxMDAvOTIwMC85MzAwICovCiAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogODUwMC85MDAwIGNhcmRzIHVzZSBtb3N0bHkgNjRNQiwgdGhvdWdoIHRoZXJlIGFyZSAzMk1CIGFuZCAxMjhNQiBtb2RlbHMgKi8KICAgICAgICAgICAgfSBlbHNlIGlmKFdJTkVfRDNEN19DQVBBQkxFKGdsX2luZm8pKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9BVElfUkFERU9OXzcyMDA7IC8qIFJhZGVvbiA3MDAwLzcxMDAvNzIwMC83NTAwICovCiAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogVGhlcmUgYXJlIG1vZGVscyB3aXRoIHVwIHRvIDY0TUIgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0FUSV9SQUdFXzEyOFBSTzsKICAgICAgICAgICAgICAgIHZpZG1lbSA9IDE2OyAvKiBUaGVyZSBhcmUgMTYtMzJNQiBtb2RlbHMgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZFTkRPUl9JTlRFTDoKICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkdNQSA5NTAiKSkgewogICAgICAgICAgICAgICAgLyogTWFjT1MgY2FsbHMgdGhlIGNhcmQgR01BIDk1MCwgYnV0IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgUENJIElEIGlzIG5hbWVkIDk0NUdNICovCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTQ1R007CiAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI5MTVHTSIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTE1R007CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiOTE1RyIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTE1RzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NjVHIikpIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0lOVEVMX0k4NjVHOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg1NUciKSkgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfSU5URUxfSTg1NUc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODMwRyIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JODMwRzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0lOVEVMX0k5MTVHOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVkVORE9SX01FU0E6CiAgICAgICAgY2FzZSBWRU5ET1JfV0lORToKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBEZWZhdWx0IHRvIGdlbmVyaWMgTnZpZGlhIGhhcmR3YXJlIGJhc2VkIG9uIHRoZSBzdXBwb3J0ZWQgT3BlbkdMIGV4dGVuc2lvbnMuIFRoZSBjaG9pY2UgCiAgICAgICAgICAgICAqIGZvciBOdmlkaWEgd2FzIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGFuZCBkcml2ZXJzIHRoZXkgbWFrZSBhcmUgb2YgZ29vZCBxdWFsaXR5LiBUaGlzIG1ha2VzCiAgICAgICAgICAgICAqIHRoZW0gYSBnb29kIGdlbmVyaWMgY2hvaWNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX05WSURJQTsKICAgICAgICAgICAgaWYoV0lORV9EM0Q5X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRUZYXzU2MDA7CiAgICAgICAgICAgIGVsc2UgaWYoV0lORV9EM0Q4X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTM7CiAgICAgICAgICAgIGVsc2UgaWYoV0lORV9EM0Q3X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTsKICAgICAgICAgICAgZWxzZSBpZihXSU5FX0QzRDZfQ0FQQUJMRShnbF9pbmZvKSkKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9SSVZBX1ROVDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX1JJVkFfMTI4OwogICAgfQogICAgVFJBQ0VfKGQzZF9jYXBzKSgiRk9VTkQgKGZha2UpIGNhcmQ6IDB4JXggKHZlbmRvciBpZCksIDB4JXggKGRldmljZSBpZClcbiIsIGdsX2luZm8tPmdsX3ZlbmRvciwgZ2xfaW5mby0+Z2xfY2FyZCk7CgogICAgLyogSWYgd2UgaGF2ZSBhbiBlc3RpbWF0ZSB1c2UgaXQsIGVsc2UgZGVmYXVsdCB0byA2NE1COyAgKi8KICAgIGlmKHZpZG1lbSkKICAgICAgICBnbF9pbmZvLT52aWRtZW0gPSB2aWRtZW0qMTAyNCoxMDI0OyAvKiBjb252ZXJ0IGZyb20gTUJzIHRvIGJ5dGVzICovCiAgICBlbHNlCiAgICAgICAgZ2xfaW5mby0+dmlkbWVtID0gV0lORV9ERUZBVUxUX1ZJRE1FTTsKCiAgICAvKiBMb2FkIGFsbCB0aGUgbG9va3VwIHRhYmxlcwogICAgVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIG1ha2UgbWluTG9va3VwIGFuZCBtYXhMb29rdXAgY29uc3QgYW5kIHBvcHVsYXRlIHRoZW0gaW4gd2luZWQzZF9wcml2YXRlLmggd2hlcmUgdGhleSBhcmUgZGVjbGFyZWQgKi8KICAgIG1pbkxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV0gPSBXSU5FRDNEVEFERFJFU1NfV1JBUDsKICAgIG1heExvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV0gPSBXSU5FRDNEVEFERFJFU1NfTUlSUk9ST05DRTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xPT0tVUFM7IGkrKykgewogICAgICAgIHN0YXRlTG9va3VwW2ldID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqc3RhdGVMb29rdXBbaV0pICogKDEgKyBtYXhMb29rdXBbaV0gLSBtaW5Mb29rdXBbaV0pICk7CiAgICB9CgogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19XUkFQICAgLSBtaW5Mb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dXSA9IEdMX1JFUEVBVDsKICAgIHN0YXRlTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXVtXSU5FRDNEVEFERFJFU1NfQ0xBTVAgIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPSBHTF9DTEFNUF9UT19FREdFOwogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19CT1JERVIgLSBtaW5Mb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dXSA9CiAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfQk9SREVSX0NMQU1QXSA/IEdMX0NMQU1QX1RPX0JPUkRFUl9BUkIgOiBHTF9SRVBFQVQ7CiAgICBzdGF0ZUxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV1bV0lORUQzRFRBRERSRVNTX0JPUkRFUiAtIG1pbkxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV1dID0KICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9CT1JERVJfQ0xBTVBdID8gR0xfQ0xBTVBfVE9fQk9SREVSX0FSQiA6IEdMX1JFUEVBVDsKICAgIHN0YXRlTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXVtXSU5FRDNEVEFERFJFU1NfTUlSUk9SIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPQogICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX01JUlJPUkVEX1JFUEVBVF0gPyBHTF9NSVJST1JFRF9SRVBFQVRfQVJCIDogR0xfUkVQRUFUOwogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19NSVJST1JPTkNFIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPQogICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FUSV9URVhUVVJFX01JUlJPUl9PTkNFXSA/IEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0FUSSA6IEdMX1JFUEVBVDsKCiAgICBtYWdMb29rdXBbV0lORUQzRFRFWEZfTk9ORSAgICAgICAgLSBXSU5FRDNEVEVYRl9OT05FXSAgPSBHTF9ORUFSRVNUOwogICAgbWFnTG9va3VwW1dJTkVEM0RURVhGX1BPSU5UICAgICAgIC0gV0lORUQzRFRFWEZfTk9ORV0gPSBHTF9ORUFSRVNUOwogICAgbWFnTG9va3VwW1dJTkVEM0RURVhGX0xJTkVBUiAgICAgIC0gV0lORUQzRFRFWEZfTk9ORV0gPSBHTF9MSU5FQVI7CiAgICBtYWdMb29rdXBbV0lORUQzRFRFWEZfQU5JU09UUk9QSUMgLSBXSU5FRDNEVEVYRl9OT05FXSA9CiAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDXSA/IEdMX0xJTkVBUiA6IEdMX05FQVJFU1Q7CgoKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9OT05FXVtXSU5FRDNEVEVYRl9OT05FXSAgICAgPSBHTF9MSU5FQVI7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfTk9ORV1bV0lORUQzRFRFWEZfUE9JTlRdICAgID0gR0xfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX05PTkVdW1dJTkVEM0RURVhGX0xJTkVBUl0gICA9IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9QT0lOVF1bV0lORUQzRFRFWEZfTk9ORV0gICAgPSBHTF9ORUFSRVNUOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX1BPSU5UXVtXSU5FRDNEVEVYRl9QT0lOVF0gICA9IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfUE9JTlRdW1dJTkVEM0RURVhGX0xJTkVBUl0gID0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX0xJTkVBUl1bV0lORUQzRFRFWEZfTk9ORV0gICA9IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9MSU5FQVJdW1dJTkVEM0RURVhGX1BPSU5UXSAgPSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1Q7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfTElORUFSXVtXSU5FRDNEVEVYRl9MSU5FQVJdID0gR0xfTElORUFSX01JUE1BUF9MSU5FQVI7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfQU5JU09UUk9QSUNdW1dJTkVEM0RURVhGX05PTkVdICAgPSBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDXSA/CiAgICBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA6IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9BTklTT1RST1BJQ11bV0lORUQzRFRFWEZfUE9JTlRdICA9IGdsX2luZm8tPnN1cHBvcnRlZFtFWFRfVEVYVFVSRV9GSUxURVJfQU5JU09UUk9QSUNdID8gR0xfTElORUFSX01JUE1BUF9ORUFSRVNUIDogR0xfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX0FOSVNPVFJPUElDXVtXSU5FRDNEVEVYRl9MSU5FQVJdID0gZ2xfaW5mby0+c3VwcG9ydGVkW0VYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQ10gPyBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA6IEdMX0xJTkVBUjsKCi8qIFRPRE86IGNvbmZpZyBsb29rdXBzICovCgogICAgLyogTWFrZSBzdXJlIHRoZXJlJ3MgYW4gYWN0aXZlIEhEQyBlbHNlIHRoZSBXR0wgZXh0ZW5zaW9ucyB3aWxsIGZhaWwgKi8KICAgIGhkYyA9IHB3Z2xHZXRDdXJyZW50REMoKTsKICAgIGlmIChoZGMpIHsKICAgICAgICBXR0xfRXh0ZW5zaW9ucyA9IEdMX0VYVENBTEwod2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQihoZGMpKTsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJXR0xfRXh0ZW5zaW9ucyByZXBvcnRlZDpcbiIpOwoKICAgICAgICBpZiAoTlVMTCA9PSBXR0xfRXh0ZW5zaW9ucykgewogICAgICAgICAgICBFUlIoIiAgIFdHTF9FeHRlbnNpb25zIHJldHVybnMgTlVMTFxuIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKCpXR0xfRXh0ZW5zaW9ucyAhPSAweDAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdGFydDsKICAgICAgICAgICAgICAgIGNoYXIgVGhpc0V4dG5bMjU2XTsKICAgICAgICAgICAgICAgIHNpemVfdCBsZW47CgogICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKldHTF9FeHRlbnNpb25zKSkgV0dMX0V4dGVuc2lvbnMrKzsKICAgICAgICAgICAgICAgIFN0YXJ0ID0gV0dMX0V4dGVuc2lvbnM7CiAgICAgICAgICAgICAgICB3aGlsZSAoIWlzc3BhY2UoKldHTF9FeHRlbnNpb25zKSAmJiAqV0dMX0V4dGVuc2lvbnMgIT0gMHgwMCkgewogICAgICAgICAgICAgICAgICAgIFdHTF9FeHRlbnNpb25zKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGVuID0gV0dMX0V4dGVuc2lvbnMgLSBTdGFydDsKICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPj0gc2l6ZW9mKFRoaXNFeHRuKSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBtZW1jcHkoVGhpc0V4dG4sIFN0YXJ0LCBsZW4pOwogICAgICAgICAgICAgICAgVGhpc0V4dG5bbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCItICVzXG4iLCBUaGlzRXh0bik7CgogICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoVGhpc0V4dG4sICJXR0xfQVJCX3BidWZmZXIiKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtXR0xfQVJCX1BCVUZGRVJdID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJGT1VORDogV0dMX0FSQl9wYnVmZmVyIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoVGhpc0V4dG4sICJXR0xfV0lORV9waXhlbF9mb3JtYXRfcGFzc3Rocm91Z2giKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtXR0xfV0lORV9QSVhFTF9GT1JNQVRfUEFTU1RIUk9VR0hdID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJGT1VORDogV0dMX1dJTkVfcGl4ZWxfZm9ybWF0X3Bhc3N0aHJvdWdoIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTEVBVkVfR0woKTsKCiAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwp9CiN1bmRlZiBHTElORk9fTE9DQVRJT04KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEIGltcGxlbWVudGF0aW9uIGZvbGxvd3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgVUlOVCAgICAgV0lOQVBJIElXaW5lRDNESW1wbF9HZXRBZGFwdGVyQ291bnQgKElXaW5lRDNEICppZmFjZSkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcCk6IFJlcG9ydGluZyAlZCBhZGFwdGVyc1xuIiwgVGhpcywgbnVtQWRhcHRlcnMpOwogICAgcmV0dXJuIG51bUFkYXB0ZXJzOwp9CgpzdGF0aWMgSFJFU1VMVCAgV0lOQVBJIElXaW5lRDNESW1wbF9SZWdpc3RlclNvZnR3YXJlRGV2aWNlKElXaW5lRDNEICppZmFjZSwgdm9pZCogcEluaXRpYWxpemVGdW5jdGlvbikgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgRklYTUUoIiglcCktPiglcCk6IHN0dWJcbiIsIFRoaXMsIHBJbml0aWFsaXplRnVuY3Rpb24pOwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBITU9OSVRPUiBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb25pdG9yKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyKSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXApLT4oJWQpXG4iLCBUaGlzLCBBZGFwdGVyKTsKICAgIHJldHVybiBNb25pdG9yRnJvbVBvaW50KEFkYXB0ZXJzW0FkYXB0ZXJdLm1vbml0b3JQb2ludCwgTU9OSVRPUl9ERUZBVUxUVE9QUklNQVJZKTsKfQoKLyogRklYTUU6IEdldEFkYXB0ZXJNb2RlQ291bnQgYW5kIEVudW1BZGFwdGVyTW9kZXMgY3VycmVudGx5IG9ubHkgcmV0dXJucyBtb2RlcwogICAgIG9mIHRoZSBzYW1lIGJwcCBidXQgZGlmZmVyZW50IHJlc29sdXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgovKiBOb3RlOiBkeDkgc3VwcGxpZXMgYSBmb3JtYXQuIENhbGxzIGZyb20gZDNkOCBzdXBwbHkgV0lORUQzREZNVF9VTktOT1dOICovCnN0YXRpYyBVSU5UICAgICBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb2RlQ291bnQoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgRm9ybWF0KSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXB9LT4oQWRhcHRlcjogJWQsIEZvcm1hdDogJXMpXG4iLCBUaGlzLCBBZGFwdGVyLCBkZWJ1Z19kM2Rmb3JtYXQoRm9ybWF0KSk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIFRPRE86IFN0b3JlIG1vZGVzIHBlciBhZGFwdGVyIGFuZCByZWFkIGl0IGZyb20gdGhlIGFkYXB0ZXIgc3RydWN0dXJlICovCiAgICBpZiAoQWRhcHRlciA9PSAwKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgaW50IGogPSAwOwoKICAgICAgICBpZiAoIURFQlVHX1NJTkdMRV9NT0RFKSB7CiAgICAgICAgICAgIERFVk1PREVXIERldk1vZGVXOwoKICAgICAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgICAgICBEZXZNb2RlVy5kbVNpemUgPSBzaXplb2YoRGV2TW9kZVcpOwogICAgICAgICAgICB3aGlsZSAoRW51bURpc3BsYXlTZXR0aW5nc0V4VyhOVUxMLCBqLCAmRGV2TW9kZVcsIDApKSB7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKEZvcm1hdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVU5LTk9XTjoKICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBmb3IgRDNEOCwgZG8gbm90IGVudW1lcmF0ZSBQOCBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAxNikgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIpIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAxNikgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gOCkgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIG90aGVyIG1vZGVzIGFzIHRoZXkgZG8gbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICAgIGogPSAxOwogICAgICAgIH0KCiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwfS0+KEFkYXB0ZXI6ICVkKSA9PiAlZCAob3V0IG9mICVkKVxuIiwgVGhpcywgQWRhcHRlciwgaSwgaik7CiAgICAgICAgcmV0dXJuIGk7CiAgICB9IGVsc2UgewogICAgICAgIEZJWE1FXyhkM2RfY2FwcykoIkFkYXB0ZXIgbm90IHByaW1hcnkgZGlzcGxheVxuIik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyogTm90ZTogZHg5IHN1cHBsaWVzIGEgZm9ybWF0LiBDYWxscyBmcm9tIGQzZDggc3VwcGx5IFdJTkVEM0RGTVRfVU5LTk9XTiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0VudW1BZGFwdGVyTW9kZXMoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgRm9ybWF0LCBVSU5UIE1vZGUsIFdJTkVEM0RESVNQTEFZTU9ERSogcE1vZGUpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcH0tPihBZGFwdGVyOiVkLCBtb2RlOiVkLCBwTW9kZTolcCwgZm9ybWF0OiVzKVxuIiwgVGhpcywgQWRhcHRlciwgTW9kZSwgcE1vZGUsIGRlYnVnX2QzZGZvcm1hdChGb3JtYXQpKTsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBhcyBtdWNoIGFzIHBvc3NpYmxlICovCiAgICBpZiAoTlVMTCA9PSBwTW9kZSB8fAogICAgICAgIEFkYXB0ZXIgPj0gSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJDb3VudChpZmFjZSkgfHwKICAgICAgICBNb2RlICAgID49IElXaW5lRDNESW1wbF9HZXRBZGFwdGVyTW9kZUNvdW50KGlmYWNlLCBBZGFwdGVyLCBGb3JtYXQpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVE9ETzogU3RvcmUgbW9kZXMgcGVyIGFkYXB0ZXIgYW5kIHJlYWQgaXQgZnJvbSB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KICAgIGlmIChBZGFwdGVyID09IDAgJiYgIURFQlVHX1NJTkdMRV9NT0RFKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBERVZNT0RFVyBEZXZNb2RlVzsKICAgICAgICBpbnQgTW9kZUlkeCA9IDA7CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGludCBqID0gMDsKCiAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgIERldk1vZGVXLmRtU2l6ZSA9IHNpemVvZihEZXZNb2RlVyk7CgogICAgICAgIC8qIElmIHdlIGFyZSBmaWx0ZXJpbmcgdG8gYSBzcGVjaWZpYyBmb3JtYXQgKEQzRDkpLCB0aGVuIG5lZWQgdG8gc2tpcAogICAgICAgICAgIGFsbCB1bnJlbGF0ZWQgbW9kZXMsIGJ1dCBpZiBtb2RlIGlzIGlycmVsZXZhbnQgKEQzRDgpLCB0aGVuIHdlIGNhbgogICAgICAgICAgIGp1c3QgY291bnQgdGhyb3VnaCB0aGUgb25lcyB3aXRoIHZhbGlkIGJpdCBkZXB0aHMgKi8KICAgICAgICB3aGlsZSAoKGk8PU1vZGUpICYmIEVudW1EaXNwbGF5U2V0dGluZ3NFeFcoTlVMTCwgaisrLCAmRGV2TW9kZVcsIDApKSB7CiAgICAgICAgICAgIHN3aXRjaCAoRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVU5LTk9XTjoKICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIEQzRDguIERvIG5vdCBlbnVtZXJhdGUgUDggaGVyZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgRGV2TW9kZVcuZG1CaXRzUGVyUGVsID09IDE2KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAzMikgaSsrOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgICAgICAgICBpZiAoRGV2TW9kZVcuZG1CaXRzUGVyUGVsID09IDE2KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSA4KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVzIHRoYXQgZG9uJ3QgbWF0Y2ggd2hhdCB3ZSBzdXBwb3J0IGNhbiBnZXQgYW4gZWFybHktb3V0ICovCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiU2VhcmNoaW5nIGZvciAlcywgcmV0dXJuaW5nIEQzREVSUl9JTlZBTElEQ0FMTFxuIiwgZGVidWdfZDNkZm9ybWF0KEZvcm1hdCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk5vIG1vZGVzIGZvdW5kIGZvciBmb3JtYXQgKCV4IC0gJXMpXG4iLCBGb3JtYXQsIGRlYnVnX2QzZGZvcm1hdChGb3JtYXQpKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgfQogICAgICAgIE1vZGVJZHggPSBqIC0gMTsKCiAgICAgICAgLyogTm93IGdldCB0aGUgZGlzcGxheSBtb2RlIHZpYSB0aGUgY2FsY3VsYXRlZCBpbmRleCAqLwogICAgICAgIGlmIChFbnVtRGlzcGxheVNldHRpbmdzRXhXKE5VTEwsIE1vZGVJZHgsICZEZXZNb2RlVywgMCkpIHsKICAgICAgICAgICAgcE1vZGUtPldpZHRoICAgICAgICA9IERldk1vZGVXLmRtUGVsc1dpZHRoOwogICAgICAgICAgICBwTW9kZS0+SGVpZ2h0ICAgICAgID0gRGV2TW9kZVcuZG1QZWxzSGVpZ2h0OwogICAgICAgICAgICBwTW9kZS0+UmVmcmVzaFJhdGUgID0gV0lORUQzREFEQVBURVJfREVGQVVMVDsKICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtRmllbGRzICYgRE1fRElTUExBWUZSRVFVRU5DWSkKICAgICAgICAgICAgICAgIHBNb2RlLT5SZWZyZXNoUmF0ZSA9IERldk1vZGVXLmRtRGlzcGxheUZyZXF1ZW5jeTsKCiAgICAgICAgICAgIGlmIChGb3JtYXQgPT0gV0lORUQzREZNVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKERldk1vZGVXLmRtQml0c1BlclBlbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gRm9ybWF0OwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiUmVxdWVzdGVkIG1vZGUgb3V0IG9mIHJhbmdlICVkXG4iLCBNb2RlKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgfQoKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJXICVkIEggJWQgcnIgJWQgZm10ICgleCAtICVzKSBicHAgJXVcbiIsIHBNb2RlLT5XaWR0aCwgcE1vZGUtPkhlaWdodCwKICAgICAgICAgICAgICAgIHBNb2RlLT5SZWZyZXNoUmF0ZSwgcE1vZGUtPkZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KHBNb2RlLT5Gb3JtYXQpLAogICAgICAgICAgICAgICAgRGV2TW9kZVcuZG1CaXRzUGVyUGVsKTsKCiAgICB9IGVsc2UgaWYgKERFQlVHX1NJTkdMRV9NT0RFKSB7CiAgICAgICAgLyogUmV0dXJuIG9uZSBzZXR0aW5nIG9mIHRoZSBmb3JtYXQgcmVxdWVzdGVkICovCiAgICAgICAgaWYgKE1vZGUgPiAwKSByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgICAgICBwTW9kZS0+V2lkdGggICAgICAgID0gODAwOwogICAgICAgIHBNb2RlLT5IZWlnaHQgICAgICAgPSA2MDA7CiAgICAgICAgcE1vZGUtPlJlZnJlc2hSYXRlICA9IDYwOwogICAgICAgIHBNb2RlLT5Gb3JtYXQgICAgICAgPSAoRm9ybWF0ID09IFdJTkVEM0RGTVRfVU5LTk9XTikgPyBXSU5FRDNERk1UX1g4UjhHOEI4IDogRm9ybWF0OwogICAgfSBlbHNlIHsKICAgICAgICBGSVhNRV8oZDNkX2NhcHMpKCJBZGFwdGVyIG5vdCBwcmltYXJ5IGRpc3BsYXlcbiIpOwogICAgfQoKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJEaXNwbGF5TW9kZShJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERJU1BMQVlNT0RFKiBwTW9kZSkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwfS0+KEFkYXB0ZXI6ICVkLCBwTW9kZTogJXApXG4iLCBUaGlzLCBBZGFwdGVyLCBwTW9kZSk7CgogICAgaWYgKE5VTEwgPT0gcE1vZGUgfHwKICAgICAgICBBZGFwdGVyID49IElXaW5lRDNEX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICBpZiAoQWRhcHRlciA9PSAwKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBpbnQgYnBwID0gMDsKICAgICAgICBERVZNT0RFVyBEZXZNb2RlVzsKCiAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgIERldk1vZGVXLmRtU2l6ZSA9IHNpemVvZihEZXZNb2RlVyk7CgogICAgICAgIEVudW1EaXNwbGF5U2V0dGluZ3NFeFcoTlVMTCwgRU5VTV9DVVJSRU5UX1NFVFRJTkdTLCAmRGV2TW9kZVcsIDApOwogICAgICAgIHBNb2RlLT5XaWR0aCAgICAgICAgPSBEZXZNb2RlVy5kbVBlbHNXaWR0aDsKICAgICAgICBwTW9kZS0+SGVpZ2h0ICAgICAgID0gRGV2TW9kZVcuZG1QZWxzSGVpZ2h0OwogICAgICAgIGJwcCAgICAgICAgICAgICAgICAgPSBEZXZNb2RlVy5kbUJpdHNQZXJQZWw7CiAgICAgICAgcE1vZGUtPlJlZnJlc2hSYXRlICA9IFdJTkVEM0RBREFQVEVSX0RFRkFVTFQ7CiAgICAgICAgaWYgKERldk1vZGVXLmRtRmllbGRzJkRNX0RJU1BMQVlGUkVRVUVOQ1kpCiAgICAgICAgewogICAgICAgICAgICBwTW9kZS0+UmVmcmVzaFJhdGUgPSBEZXZNb2RlVy5kbURpc3BsYXlGcmVxdWVuY3k7CiAgICAgICAgfQoKICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKGJwcCk7CiAgICB9IGVsc2UgewogICAgICAgIEZJWE1FXyhkM2RfY2FwcykoIkFkYXB0ZXIgbm90IHByaW1hcnkgZGlzcGxheVxuIik7CiAgICB9CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgicmV0dXJuaW5nIHc6JWQsIGg6JWQsIHJlZjolZCwgZm10OiVzXG4iLCBwTW9kZS0+V2lkdGgsCiAgICAgICAgICBwTW9kZS0+SGVpZ2h0LCBwTW9kZS0+UmVmcmVzaFJhdGUsIGRlYnVnX2QzZGZvcm1hdChwTW9kZS0+Rm9ybWF0KSk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKLyogTk9URTogZHVlIHRvIHN0cnVjdHVyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGR4OCBhbmQgZHg5IEQzREFEQVBURVJfSURFTlRJRklFUiwKICAgYW5kIGZpZWxkcyBiZWluZyBpbnNlcnRlZCBpbiB0aGUgbWlkZGxlLCBhIG5ldyBzdHJ1Y3R1cmUgaXMgdXNlZCBpbiBwbGFjZSAgICAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJJZGVudGlmaWVyKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREFEQVBURVJfSURFTlRJRklFUiogcElkZW50aWZpZXIpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKCiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXB9LT4oQWRhcHRlcjogJWQsIEZsYWdzOiAleCwgcElkPSVwKVxuIiwgVGhpcywgQWRhcHRlciwgRmxhZ3MsIHBJZGVudGlmaWVyKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgKi8KICAgIFRSQUNFXyhkM2RfY2FwcykoImRldmljZS9WZW5kb3IgTmFtZSBhbmQgVmVyc2lvbiBkZXRlY3Rpb24gdXNpbmcgRmlsbEdMQ2Fwc1xuIik7CiAgICBzdHJjcHkocElkZW50aWZpZXItPkRyaXZlciwgQWRhcHRlcnNbQWRhcHRlcl0uZHJpdmVyKTsKICAgIHN0cmNweShwSWRlbnRpZmllci0+RGVzY3JpcHRpb24sIEFkYXB0ZXJzW0FkYXB0ZXJdLmRlc2NyaXB0aW9uKTsKCiAgICAvKiBOb3RlIGR4OCBkb2Vzbid0IHN1cHBseSBhIERldmljZU5hbWUgKi8KICAgIGlmIChOVUxMICE9IHBJZGVudGlmaWVyLT5EZXZpY2VOYW1lKSBzdHJjcHkocElkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWSIpOyAvKiBGSVhNRTogTWF5IGRlcGVuZCBvbiBkZXNrdG9wPyAqLwogICAgcElkZW50aWZpZXItPkRyaXZlclZlcnNpb24tPnUuSGlnaFBhcnQgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmRyaXZlcl92ZXJzaW9uX2hpcGFydDsKICAgIHBJZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLT51Lkxvd1BhcnQgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmRyaXZlcl92ZXJzaW9uOwogICAgKihwSWRlbnRpZmllci0+VmVuZG9ySWQpID0gQWRhcHRlcnNbQWRhcHRlcl0uZ2xfaW5mby5nbF92ZW5kb3I7CiAgICAqKHBJZGVudGlmaWVyLT5EZXZpY2VJZCkgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmdsX2NhcmQ7CiAgICAqKHBJZGVudGlmaWVyLT5TdWJTeXNJZCkgPSAwOwogICAgKihwSWRlbnRpZmllci0+UmV2aXNpb24pID0gMDsKICAgICpwSWRlbnRpZmllci0+RGV2aWNlSWRlbnRpZmllciA9IElJRF9EM0RERVZJQ0VfRDNEVUlEOwoKICAgIGlmIChGbGFncyAmIFdJTkVEM0RFTlVNX05PX1dIUUxfTEVWRUwpIHsKICAgICAgICAqKHBJZGVudGlmaWVyLT5XSFFMTGV2ZWwpID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgKihwSWRlbnRpZmllci0+V0hRTExldmVsKSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBCT09MIElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoY29uc3QgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZnLCBXSU5FRDNERk9STUFUIEZvcm1hdCkgewogICAgc2hvcnQgcmVkU2l6ZSwgZ3JlZW5TaXplLCBibHVlU2l6ZSwgYWxwaGFTaXplLCBjb2xvckJpdHM7CgogICAgaWYoIWNmZykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgaWYoY2ZnLT5pUGl4ZWxUeXBlID09IFdHTF9UWVBFX1JHQkFfQVJCKSB7IC8qIEludGVnZXIgUkdCQSBmb3JtYXRzICovCiAgICAgICAgaWYoIWdldENvbG9yQml0cyhGb3JtYXQsICZyZWRTaXplLCAmZ3JlZW5TaXplLCAmYmx1ZVNpemUsICZhbHBoYVNpemUsICZjb2xvckJpdHMpKSB7CiAgICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGNoZWNrIGNvbXBhdGliaWxpdHkgZm9yIEZvcm1hdD0lc1xuIiwgZGVidWdfZDNkZm9ybWF0KEZvcm1hdCkpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICBpZihjZmctPnJlZFNpemUgPCByZWRTaXplKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGlmKGNmZy0+Z3JlZW5TaXplIDwgZ3JlZW5TaXplKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGlmKGNmZy0+Ymx1ZVNpemUgPCBibHVlU2l6ZSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICBpZihjZmctPmFscGhhU2l6ZSA8IGFscGhhU2l6ZSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0gZWxzZSBpZihjZmctPmlQaXhlbFR5cGUgPT0gV0dMX1RZUEVfUkdCQV9GTE9BVF9BUkIpIHsgLyogRmxvYXQgUkdCQSBmb3JtYXRzOyBUT0RPOiBXR0xfTlZfZmxvYXRfYnVmZmVyICovCiAgICAgICAgaWYoRm9ybWF0ID09IFdJTkVEM0RGTVRfUjE2RikKICAgICAgICAgICAgcmV0dXJuIChjZmctPnJlZFNpemUgPT0gMTYgJiYgY2ZnLT5ncmVlblNpemUgPT0gMCAmJiBjZmctPmJsdWVTaXplID09IDAgJiYgY2ZnLT5hbHBoYVNpemUgPT0gMCk7CiAgICAgICAgaWYoRm9ybWF0ID09IFdJTkVEM0RGTVRfRzE2UjE2RikKICAgICAgICAgICAgcmV0dXJuIChjZmctPnJlZFNpemUgPT0gMTYgJiYgY2ZnLT5ncmVlblNpemUgPT0gMTYgJiYgY2ZnLT5ibHVlU2l6ZSA9PSAwICYmIGNmZy0+YWxwaGFTaXplID09IDApOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX0ExNkIxNkcxNlIxNkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDE2ICYmIGNmZy0+Z3JlZW5TaXplID09IDE2ICYmIGNmZy0+Ymx1ZVNpemUgPT0gMTYgJiYgY2ZnLT5hbHBoYVNpemUgPT0gMTYpOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX1IzMkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDMyICYmIGNmZy0+Z3JlZW5TaXplID09IDAgJiYgY2ZnLT5ibHVlU2l6ZSA9PSAwICYmIGNmZy0+YWxwaGFTaXplID09IDApOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX0czMlIzMkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDMyICYmIGNmZy0+Z3JlZW5TaXplID09IDMyICYmIGNmZy0+Ymx1ZVNpemUgPT0gMCAmJiBjZmctPmFscGhhU2l6ZSA9PSAwKTsKICAgICAgICBpZihGb3JtYXQgPT0gV0lORUQzREZNVF9BMzJCMzJHMzJSMzJGKQogICAgICAgICAgICByZXR1cm4gKGNmZy0+cmVkU2l6ZSA9PSAzMiAmJiBjZmctPmdyZWVuU2l6ZSA9PSAzMiAmJiBjZmctPmJsdWVTaXplID09IDMyICYmIGNmZy0+YWxwaGFTaXplID09IDMyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogUHJvYmFibHkgYSBjb2xvciBpbmRleCBtb2RlICovCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KGNvbnN0IFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZywgV0lORUQzREZPUk1BVCBGb3JtYXQpIHsKICAgIHNob3J0IGRlcHRoU2l6ZSwgc3RlbmNpbFNpemU7CiAgICBCT09MIGxvY2thYmxlID0gRkFMU0U7CgogICAgaWYoIWNmZykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgaWYoIWdldERlcHRoU3RlbmNpbEJpdHMoRm9ybWF0LCAmZGVwdGhTaXplLCAmc3RlbmNpbFNpemUpKSB7CiAgICAgICAgRVJSKCJVbmFibGUgdG8gY2hlY2sgY29tcGF0aWJpbGl0eSBmb3IgRm9ybWF0PSVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoRm9ybWF0KSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmKChGb3JtYXQgPT0gV0lORUQzREZNVF9EMTZfTE9DS0FCTEUpIHx8IChGb3JtYXQgPT0gV0lORUQzREZNVF9EMzJGX0xPQ0tBQkxFKSkKICAgICAgICBsb2NrYWJsZSA9IFRSVUU7CgogICAgLyogT24gc29tZSBtb2Rlcm4gY2FyZHMgbGlrZSB0aGUgR2Vmb3JjZTgvOSBHTFggZG9lc24ndCBvZmZlciBzb21lIGRlcGh0aHN0ZW5jaWwgZm9ybWF0cyB3aGljaCBEM0Q5IHJlcG9ydHMuCiAgICAgKiBXZSBjYW4gc2FmZWx5IHJlcG9ydCAnY29tcGF0aWJsZScgZm9ybWF0cyAoZS5nLiBEMjQgY2FuIGJlIHVzZWQgZm9yIEQxNikgYXMgbG9uZyBhcyB3ZSBhcmVuJ3QgZGVhbGluZyB3aXRoCiAgICAgKiBhIGxvY2thYmxlIGZvcm1hdC4gVGhpcyBhbHNvIGhlbHBzIEQzRCA8PSA3IGFzIHRoZXkgZXhwZWN0IEQxNiB3aGljaCBpc24ndCBvZmZlcmVkIHdpdGhvdXQgdGhpcyBvbiBHZWZvcmNlOCBjYXJkcy4gKi8KICAgIGlmKCEoY2ZnLT5kZXB0aFNpemUgPT0gZGVwdGhTaXplIHx8ICghbG9ja2FibGUgJiYgY2ZnLT5kZXB0aFNpemUgPiBkZXB0aFNpemUpKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgLyogU29tZSBjYXJkcyBsaWtlIEludGVsIGk5MTUgb25lcyBvbmx5IG9mZmVyIEQyNFM4IGJ1dCBsb3RzIG9mIGdhbWVzIGFsc28gbmVlZCBhIGZvcm1hdCB3aXRob3V0IHN0ZW5jaWwsIHNvCiAgICAgKiBhbGxvdyBtb3JlIHN0ZW5jaWwgYml0cyB0aGFuIHJlcXVlc3RlZC4gKi8KICAgIGlmKGNmZy0+c3RlbmNpbFNpemUgPCBzdGVuY2lsU2l6ZSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIFJlbmRlclRhcmdldEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBEZXB0aFN0ZW5jaWxGb3JtYXQpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIGludCBuQ2ZnczsKICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3M7CiAgICBpbnQgaXQ7CgogICAgV0FSTl8oZDNkX2NhcHMpKCIoJXApLT4gKFNUVUIpIChBZHB0cjolZCwgRGV2VHlwZTooJXgsJXMpLCBBZHB0Rm10OigleCwlcyksIFJlbmRyVGd0Rm10OigleCwlcyksIERlcHRoU3RlbmNpbEZtdDooJXgsJXMpKVxuIiwKICAgICAgICAgICBUaGlzLCBBZGFwdGVyLAogICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICAgQWRhcHRlckZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KEFkYXB0ZXJGb3JtYXQpLAogICAgICAgICAgIFJlbmRlclRhcmdldEZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KFJlbmRlclRhcmdldEZvcm1hdCksCiAgICAgICAgICAgRGVwdGhTdGVuY2lsRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoRGVwdGhTdGVuY2lsRm9ybWF0KSk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIFRSQUNFKCIoJXApIEZhaWxlZDogQXRhcHRlciAoJXUpIGhpZ2hlciB0aGFuIHN1cHBvcnRlZCBhZGFwdGVycyAoJXUpIHJldHVybmluZyBXSU5FRDNERVJSX0lOVkFMSURDQUxMXG4iLCBUaGlzLCBBZGFwdGVyLCBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICBjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIG5DZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0ubkNmZ3M7CiAgICBmb3IgKGl0ID0gMDsgaXQgPCBuQ2ZnczsgKytpdCkgewogICAgICAgIGlmIChJV2luZUQzREltcGxfSXNQaXhlbEZvcm1hdENvbXBhdGlibGVXaXRoUmVuZGVyRm10KCZjZmdzW2l0XSwgUmVuZGVyVGFyZ2V0Rm9ybWF0KSkgewogICAgICAgICAgICBpZiAoSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KCZjZmdzW2l0XSwgRGVwdGhTdGVuY2lsRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKSA6IEZvcm1hdHMgbWF0Y2hlZFxuIiwgVGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzRF9PSzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFdBUk5fKGQzZF9jYXBzKSgidW5zdXBwb3J0ZWQgZm9ybWF0IHBhaXI6ICVzIGFuZCAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KFJlbmRlclRhcmdldEZvcm1hdCksIGRlYnVnX2QzZGZvcm1hdChEZXB0aFN0ZW5jaWxGb3JtYXQpKTsKCiAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RERVZUWVBFIERldmljZVR5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBTdXJmYWNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBXaW5kb3dlZCwgV0lORUQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGVUeXBlLCBEV09SRCogICBwUXVhbGl0eUxldmVscykgewoKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2M7CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKS0+IChBZHB0cjolZCwgRGV2VHlwZTooJXgsJXMpLCBTdXJmRm10OigleCwlcyksIFdpbj8lZCwgTXVsdGlTYW1wOiV4LCBwUXVhbDolcClcbiIsCiAgICAgICAgICBUaGlzLAogICAgICAgICAgQWRhcHRlciwKICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICBTdXJmYWNlRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoU3VyZmFjZUZvcm1hdCksCiAgICAgICAgICBXaW5kb3dlZCwKICAgICAgICAgIE11bHRpU2FtcGxlVHlwZSwKICAgICAgICAgIHBRdWFsaXR5TGV2ZWxzKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVE9ETzogaGFuZGxlIFdpbmRvd2VkLCBhZGQgbW9yZSBxdWFsaXR5IGxldmVscyAqLwoKICAgIGlmIChXSU5FRDNETVVMVElTQU1QTEVfTk9ORSA9PSBNdWx0aVNhbXBsZVR5cGUpIHJldHVybiBXSU5FRDNEX09LOwoKICAgIC8qIEJ5IGRlZmF1bHQgbXVsdGlzYW1wbGluZyBpcyBkaXNhYmxlZCByaWdodCBub3cgYXMgaXQgY2F1c2VzIGlzc3VlcwogICAgICogb24gc29tZSBOdmlkaWEgZHJpdmVyIHZlcnNpb25zIGFuZCBpdCBkb2Vzbid0IHdvcmsgd2VsbCBpbiBjb21iaW5hdGlvbgogICAgICogd2l0aCBGQk9zIHlldC4gKi8KICAgIGlmKCF3aW5lZDNkX3NldHRpbmdzLmFsbG93X211bHRpc2FtcGxpbmcpCiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwoKICAgIGRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoU3VyZmFjZUZvcm1hdCwgJkFkYXB0ZXJzW0FkYXB0ZXJdLmdsX2luZm8sICZnbERlc2MpOwogICAgaWYoIWRlc2MgfHwgIWdsRGVzYykgewogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgIGlmKGdsRGVzYy0+RmxhZ3MgJiAoV0lORUQzREZNVF9GTEFHX0RFUFRIIHwgV0lORUQzREZNVF9GTEFHX1NURU5DSUwpKSB7CiAgICAgICAgaW50IGksIG5DZmdzOwogICAgICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3M7CgogICAgICAgIGNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5jZmdzOwogICAgICAgIG5DZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0ubkNmZ3M7CiAgICAgICAgZm9yKGk9MDsgaTxuQ2ZnczsgaSsrKSB7CiAgICAgICAgICAgIGlmKGNmZ3NbaV0ubnVtU2FtcGxlcyAhPSBNdWx0aVNhbXBsZVR5cGUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmKCFJV2luZUQzREltcGxfSXNQaXhlbEZvcm1hdENvbXBhdGlibGVXaXRoRGVwdGhGbXQoJmNmZ3NbaV0sIFN1cmZhY2VGb3JtYXQpKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBUUkFDRSgiRm91bmQgaVBpeGVsRm9ybWF0PSVkIHRvIHN1cHBvcnQgTXVsdGlTYW1wbGVUeXBlPSVkIGZvciBmb3JtYXQgJXNcbiIsIGNmZ3NbaV0uaVBpeGVsRm9ybWF0LCBNdWx0aVNhbXBsZVR5cGUsIGRlYnVnX2QzZGZvcm1hdChTdXJmYWNlRm9ybWF0KSk7CgogICAgICAgICAgICBpZihwUXVhbGl0eUxldmVscykKICAgICAgICAgICAgICAgICpwUXVhbGl0eUxldmVscyA9IDE7IC8qIEd1ZXNzIGF0IGEgdmFsdWUhICovCiAgICAgICAgICAgIHJldHVybiBXSU5FRDNEX09LOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoZ2xEZXNjLT5GbGFncyAmIFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQpIHsKICAgICAgICBzaG9ydCByZWRTaXplLCBncmVlblNpemUsIGJsdWVTaXplLCBhbHBoYVNpemUsIGNvbG9yQml0czsKICAgICAgICBpbnQgaSwgbkNmZ3M7CiAgICAgICAgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZnczsKCiAgICAgICAgaWYoIWdldENvbG9yQml0cyhTdXJmYWNlRm9ybWF0LCAmcmVkU2l6ZSwgJmdyZWVuU2l6ZSwgJmJsdWVTaXplLCAmYWxwaGFTaXplLCAmY29sb3JCaXRzKSkgewogICAgICAgICAgICBFUlIoIlVuYWJsZSB0byBjb2xvciBiaXRzIGZvciBmb3JtYXQgJSN4LCBjYW4ndCBjaGVjayBtdWx0aXNhbXBsaW5nIGNhcGFiaWxpdHkhXG4iLCBTdXJmYWNlRm9ybWF0KTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgIH0KCiAgICAgICAgY2ZncyA9IEFkYXB0ZXJzW0FkYXB0ZXJdLmNmZ3M7CiAgICAgICAgbkNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsKICAgICAgICBmb3IoaT0wOyBpPG5DZmdzOyBpKyspIHsKICAgICAgICAgICAgaWYoY2Znc1tpXS5udW1TYW1wbGVzICE9IE11bHRpU2FtcGxlVHlwZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLnJlZFNpemUgIT0gcmVkU2l6ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLmdyZWVuU2l6ZSAhPSBncmVlblNpemUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgaWYoY2Znc1tpXS5ibHVlU2l6ZSAhPSBibHVlU2l6ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLmFscGhhU2l6ZSAhPSBhbHBoYVNpemUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIFRSQUNFKCJGb3VuZCBpUGl4ZWxGb3JtYXQ9JWQgdG8gc3VwcG9ydCBNdWx0aVNhbXBsZVR5cGU9JWQgZm9yIGZvcm1hdCAlc1xuIiwgY2Znc1tpXS5pUGl4ZWxGb3JtYXQsIE11bHRpU2FtcGxlVHlwZSwgZGVidWdfZDNkZm9ybWF0KFN1cmZhY2VGb3JtYXQpKTsKCiAgICAgICAgICAgIGlmKHBRdWFsaXR5TGV2ZWxzKQogICAgICAgICAgICAgICAgKnBRdWFsaXR5TGV2ZWxzID0gMTsgLyogR3Vlc3MgYXQgYSB2YWx1ZSEgKi8KICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RfT0s7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlVHlwZShJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIERpc3BsYXlGb3JtYXQsIFdJTkVEM0RGT1JNQVQgQmFja0J1ZmZlckZvcm1hdCwgQk9PTCBXaW5kb3dlZCkgewoKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIEhSRVNVTFQgaHIgPSBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgIFVJTlQgbm1vZGVzOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcCktPiAoU1RVQikgKEFkcHRyOiVkLCBDaGVja1R5cGU6KCV4LCVzKSwgRGlzcEZtdDooJXgsJXMpLCBCYWNrQnVmOigleCwlcyksIFdpbj8lZCk6IHN0dWJcbiIsCiAgICAgICAgICBUaGlzLAogICAgICAgICAgQWRhcHRlciwKICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICBEaXNwbGF5Rm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoRGlzcGxheUZvcm1hdCksCiAgICAgICAgICBCYWNrQnVmZmVyRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCksCiAgICAgICAgICBXaW5kb3dlZCk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpLCByZXR1cm5pbmcgV0lORUQzREVSUl9JTlZBTElEQ0FMTFxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVGhlIHRhc2sgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBjaGVjayB3aGV0aGVyIGEgY2VydGFpbiBkaXNwbGF5IC8gYmFja2J1ZmZlciBmb3JtYXQKICAgICAqIGNvbWJpbmF0aW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgZ2l2ZW4gYWRhcHRlci4gSW4gZnVsbHNjcmVlbiBtb2RlIG1pY3Jvc29mdCBzcGVjaWZpZWQKICAgICAqIHRoYXQgdGhlIGRpc3BsYXkgZm9ybWF0IHNob3VsZG4ndCBwcm92aWRlIGFscGhhIGFuZCB0aGF0IGlnbm9yaW5nIGFscGhhIHRoZSBiYWNrYnVmZmVyCiAgICAgKiBhbmQgZGlzcGxheSBmb3JtYXQgc2hvdWxkIG1hdGNoIGV4YWN0bHkuCiAgICAgKiBJbiB3aW5kb3dlZCBtb2RlIGZvcm1hdCBjb252ZXJzaW9uIGNhbiBvY2N1ciBhbmQgdGhpcyBkZXBlbmRzIG9uIHRoZSBkcml2ZXIuIFdoZW4gZm9ybWF0CiAgICAgKiBjb252ZXJzaW9uIGlzIGRvbmUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVydGhlbGVzcyBmYWlsIGFuZCBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UKICAgICAqIENoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbi4KICAgICAqIEF0IHRoZSBtb21lbnQgd2UgYXNzdW1lIHRoYXQgZnVsbHNjcmVlbiBhbmQgd2luZG93ZWQgaGF2ZSB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgKi8KCiAgICAvKiBUaGVyZSBhcmUgb25seSA0IGRpc3BsYXkgZm9ybWF0cyAqLwogICAgaWYoISgoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1I1RzZCNSkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YMVI1RzVCNSkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YOFI4RzhCOCkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9BMlIxMEcxMEIxMCkpKQogICAgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIkZvcm1hdCAlcyB1bnN1cHBvcnRlZCBhcyBkaXNwbGF5IGZvcm1hdFxuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogSWYgdGhlIHJlcXVlc3RlZCBEaXNwbGF5Rm9ybWF0IGlzIG5vdCBhdmFpbGFibGUsIGRvbid0IGNvbnRpbnVlICovCiAgICBubW9kZXMgPSBJV2luZUQzREltcGxfR2V0QWRhcHRlck1vZGVDb3VudChpZmFjZSwgQWRhcHRlciwgRGlzcGxheUZvcm1hdCk7CiAgICBpZighbm1vZGVzKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTm8gYXZhaWxhYmxlIG1vZGVzIGZvciBkaXNwbGF5IGZvcm1hdCAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogV2luZG93ZWQgbW9kZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgV0lORUQzREZNVF9VTktOT1dOIGZvciB0aGUgYmFja2J1ZmZlcmZvcm1hdCwgaXQgbWVhbnMgJ3JldXNlJyB0aGUgZGlzcGxheSBmb3JtYXQgZm9yIHRoZSBiYWNrYnVmZmVyICovCiAgICBpZighV2luZG93ZWQgJiYgQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX1VOS05PV04pIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJCYWNrQnVmZmVyRm9ybWF0IFdJTkVEM0ZNVF9VTktOT1dOIG5vdCBhdmFpbGFibGUgaW4gV2luZG93ZWQgbW9kZVxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgfQoKICAgIC8qIEluIEZVTExTQ1JFRU4gbW9kZSBSNUc2QjUgY2FuIG9ubHkgYmUgbWl4ZWQgd2l0aCBiYWNrYnVmZmVyIGZvcm1hdCBSNUc2QjUgKi8KICAgIGlmKCAoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1I1RzZCNSkgJiYgKEJhY2tCdWZmZXJGb3JtYXQgIT0gV0lORUQzREZNVF9SNUc2QjUpICkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlVuc3VwcG9ydGVkIGRpc3BsYXkvYmFja2J1ZmZlciBmb3JtYXQgY29tYmluYXRpb24gJXMvJXNcbiIsIGRlYnVnX2QzZGZvcm1hdChEaXNwbGF5Rm9ybWF0KSwgZGVidWdfZDNkZm9ybWF0KEJhY2tCdWZmZXJGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogSW4gRlVMTFNDUkVFTiBtb2RlIFgxUjVHNUI1IGNhbiBvbmx5IGJlIG1peGVkIHdpdGggYmFja2J1ZmZlciBmb3JtYXQgKjFSNUc1QjUgKi8KICAgIGlmKCAoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1gxUjVHNUI1KSAmJiAhKChCYWNrQnVmZmVyRm9ybWF0ID09IFdJTkVEM0RGTVRfWDFSNUc1QjUpIHx8IChCYWNrQnVmZmVyRm9ybWF0ID09IFdJTkVEM0RGTVRfQTFSNUc1QjUpKSApIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJVbnN1cHBvcnRlZCBkaXNwbGF5L2JhY2tidWZmZXIgZm9ybWF0IGNvbWJpbmF0aW9uICVzLyVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoRGlzcGxheUZvcm1hdCksIGRlYnVnX2QzZGZvcm1hdChCYWNrQnVmZmVyRm9ybWF0KSk7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgfQoKICAgIC8qIEluIEZVTExTQ1JFRU4gbW9kZSBYOFI4RzhCOCBjYW4gb25seSBiZSBtaXhlZCB3aXRoIGJhY2tidWZmZXIgZm9ybWF0ICo4UjhHOEI4ICovCiAgICBpZiggKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YOFI4RzhCOCkgJiYgISgoQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX1g4UjhHOEI4KSB8fCAoQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX0E4UjhHOEI4KSkgKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVW5zdXBwb3J0ZWQgZGlzcGxheS9iYWNrYnVmZmVyIGZvcm1hdCBjb21iaW5hdGlvbiAlcy8lc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpLCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCkpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgIH0KCiAgICAvKiBBMlIxMEcxMEIxMCBpcyBvbmx5IGFsbG93ZWQgaW4gZnVsbHNjcmVlbiBtb2RlIGFuZCBpdCBjYW4gb25seSBiZSBtaXhlZCB3aXRoIGJhY2tidWZmZXIgZm9ybWF0IEEyUjEwRzEwQjEwICovCiAgICBpZiggKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9BMlIxMEcxMEIxMCkgJiYgKChCYWNrQnVmZmVyRm9ybWF0ICE9IFdJTkVEM0RGTVRfQTJSMTBHMTBCMTApIHx8IFdpbmRvd2VkKSkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlVuc3VwcG9ydGVkIGRpc3BsYXkvYmFja2J1ZmZlciBmb3JtYXQgY29tYmluYXRpb24gJXMvJXNcbiIsIGRlYnVnX2QzZGZvcm1hdChEaXNwbGF5Rm9ybWF0KSwgZGVidWdfZDNkZm9ybWF0KEJhY2tCdWZmZXJGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogVXNlIENoZWNrRGV2aWNlRm9ybWF0IHRvIHNlZSBpZiB0aGUgQmFja0J1ZmZlckZvcm1hdCBpcyB1c2FibGUgd2l0aCB0aGUgZ2l2ZW4gRGlzcGxheUZvcm1hdCAqLwogICAgaHIgPSBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VGb3JtYXQoaWZhY2UsIEFkYXB0ZXIsIERldmljZVR5cGUsIERpc3BsYXlGb3JtYXQsIFdJTkVEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIFdJTkVEM0RSVFlQRV9TVVJGQUNFLCBCYWNrQnVmZmVyRm9ybWF0KTsKICAgIGlmKEZBSUxFRChocikpCiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVW5zdXBwb3J0ZWQgZGlzcGxheS9iYWNrYnVmZmVyIGZvcm1hdCBjb21iaW5hdGlvbiAlcy8lc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpLCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCkpOwoKICAgIHJldHVybiBocjsKfQoKCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIEFkYXB0ZXJzW0FkYXB0ZXJdLmdsX2luZm8KLyogQ2hlY2sgaWYgd2Ugc3VwcG9ydCBidW1wbWFwcGluZyBmb3IgYSBmb3JtYXQgKi8Kc3RhdGljIEJPT0wgQ2hlY2tCdW1wTWFwQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIGlmKEdMX1NVUFBPUlQoTlZfUkVHSVNURVJfQ09NQklORVJTKSAmJiBHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgLyogVE9ETzogT3RoZXIgYnVtcCBtYXAgZm9ybWF0cyAqLwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgIH0KICAgIGlmKEdMX1NVUFBPUlQoQVRJX0VOVk1BUF9CVU1QTUFQKSB8fCBHTF9TVVBQT1JUKEFUSV9GUkFHTUVOVF9TSEFERVIpKSB7CiAgICAgICAgc3dpdGNoIChDaGVja0Zvcm1hdCkgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjhVODoKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgfQogICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKiBDaGVjayBpZiB0aGUgZ2l2ZW4gRGlzcGxheUZvcm1hdCArIERlcHRoU3RlbmNpbEZvcm1hdCBjb21iaW5hdGlvbiBpcyB2YWxpZCBmb3IgdGhlIEFkYXB0ZXIgKi8Kc3RhdGljIEJPT0wgQ2hlY2tEZXB0aFN0ZW5jaWxDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBEaXNwbGF5Rm9ybWF0LCBXSU5FRDNERk9STUFUIERlcHRoU3RlbmNpbEZvcm1hdCkKewogICAgaW50IGl0PTA7CiAgICBXaW5lRDNEX1BpeGVsRm9ybWF0ICpjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoRGVwdGhTdGVuY2lsRm9ybWF0LCAmR0xJTkZPX0xPQ0FUSU9OLCAmZ2xEZXNjKTsKCiAgICAvKiBGYWlsIGlmIHdlIHdlcmVuJ3QgYWJsZSB0byBnZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0ICovCiAgICBpZighZGVzYyB8fCAhZ2xEZXNjKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBPbmx5IGFsbG93IGRlcHRoL3N0ZW5jaWwgZm9ybWF0cyAqLwogICAgaWYoIShnbERlc2MtPkZsYWdzICYgKFdJTkVEM0RGTVRfRkxBR19ERVBUSCB8IFdJTkVEM0RGTVRfRkxBR19TVEVOQ0lMKSkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFdhbGsgdGhyb3VnaCBhbGwgV0dMIHBpeGVsIGZvcm1hdHMgdG8gZmluZCBhIG1hdGNoICovCiAgICBjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIGZvciAoaXQgPSAwOyBpdCA8IEFkYXB0ZXJzW0FkYXB0ZXJdLm5DZmdzOyArK2l0KSB7CiAgICAgICAgaWYgKElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoJmNmZ3NbaXRdLCBEaXNwbGF5Rm9ybWF0KSkgewogICAgICAgICAgICBpZiAoSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KCZjZmdzW2l0XSwgRGVwdGhTdGVuY2lsRm9ybWF0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja0ZpbHRlckNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBjb25zdCBHbFBpeGVsRm9ybWF0RGVzYyAqZ2xEZXNjOwogICAgY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpkZXNjID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KENoZWNrRm9ybWF0LCAmR0xJTkZPX0xPQ0FUSU9OLCAmZ2xEZXNjKTsKCiAgICAvKiBGYWlsIGlmIHdlIHdlcmVuJ3QgYWJsZSB0byBnZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0ICovCiAgICBpZighZGVzYyB8fCAhZ2xEZXNjKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBUaGUgZmxhZ3MgZW50cnkgb2YgYSBmb3JtYXQgY29udGFpbnMgdGhlIGZpbHRlcmluZyBjYXBhYmlsaXR5ICovCiAgICBpZihnbERlc2MtPkZsYWdzICYgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORykKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qIENoZWNrIHRoZSByZW5kZXIgdGFyZ2V0IGNhcGFiaWxpdGllcyBvZiBhIGZvcm1hdCAqLwpzdGF0aWMgQk9PTCBDaGVja1JlbmRlclRhcmdldENhcGFiaWxpdHkoV0lORUQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBVSU5UIEFkYXB0ZXIgPSAwOwogICAgY29uc3QgR2xQaXhlbEZvcm1hdERlc2MgKmdsRGVzYzsKICAgIGNvbnN0IFN0YXRpY1BpeGVsRm9ybWF0RGVzYyAqZGVzYyA9IGdldEZvcm1hdERlc2NFbnRyeShDaGVja0Zvcm1hdCwgJkdMSU5GT19MT0NBVElPTiwgJmdsRGVzYyk7CgogICAgLyogRmFpbCBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gZ2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCAqLwogICAgaWYoIWRlc2MgfHwgIWdsRGVzYykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgLyogRmlsdGVyIG91dCBub24tUlQgZm9ybWF0cyAqLwogICAgaWYoIShnbERlc2MtPkZsYWdzICYgV0lORUQzREZNVF9GTEFHX1JFTkRFUlRBUkdFVCkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGlmKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID09IE9STV9CQUNLQlVGRkVSKSB7CiAgICAgICAgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZncyA9IEFkYXB0ZXJzW0FkYXB0ZXJdLmNmZ3M7CiAgICAgICAgaW50IGl0OwogICAgICAgIHNob3J0IEFkYXB0ZXJSZWQsIEFkYXB0ZXJHcmVlbiwgQWRhcHRlckJsdWUsIEFkYXB0ZXJBbHBoYSwgQWRhcHRlclRvdGFsU2l6ZTsKICAgICAgICBzaG9ydCBDaGVja1JlZCwgQ2hlY2tHcmVlbiwgQ2hlY2tCbHVlLCBDaGVja0FscGhhLCBDaGVja1RvdGFsU2l6ZTsKCiAgICAgICAgZ2V0Q29sb3JCaXRzKEFkYXB0ZXJGb3JtYXQsICZBZGFwdGVyUmVkLCAmQWRhcHRlckdyZWVuLCAmQWRhcHRlckJsdWUsICZBZGFwdGVyQWxwaGEsICZBZGFwdGVyVG90YWxTaXplKTsKICAgICAgICBnZXRDb2xvckJpdHMoQ2hlY2tGb3JtYXQsICZDaGVja1JlZCwgJkNoZWNrR3JlZW4sICZDaGVja0JsdWUsICZDaGVja0FscGhhLCAmQ2hlY2tUb3RhbFNpemUpOwoKICAgICAgICAvKiBJbiBiYWNrYnVmZmVyIG1vZGUgdGhlIGZyb250IGFuZCBiYWNrYnVmZmVyIHNoYXJlIHRoZSBzYW1lIFdHTCBwaXhlbGZvcm1hdC4KICAgICAgICAgKiBUaGUgZm9ybWF0IG11c3QgbWF0Y2ggaW4gUkdCLCBhbHBoYSBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudC4gKE9ubHkgdGhlIGJhY2tidWZmZXIgY2FuIGhhdmUgYWxwaGEpICovCiAgICAgICAgaWYoISgoQWRhcHRlclJlZCA9PSBDaGVja1JlZCkgJiYgKEFkYXB0ZXJHcmVlbiA9PSBDaGVja0dyZWVuKSAmJiAoQWRhcHRlckJsdWUgPT0gQ2hlY2tCbHVlKSkpIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIFdHTCBwaXhlbCBmb3JtYXQgbWF0Y2hpbmcgdGhlIHJlcXVpcmVtZW50cywgdGhlIGZvcm1hdCBzaG91bGQgYWxzbyBiZSB3aW5kb3cKICAgICAgICAgKiBkcmF3YWJsZSAobm90IG9mZnNjcmVlbjsgZS5nLiBOdmlkaWEgb2ZmZXJzIFI1RzZCNSBmb3IgcGJ1ZmZlcnMgZXZlbiB3aGVuIFggaXMgcnVubmluZyBhdCAyNGJpdCkgKi8KICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsgKytpdCkgewogICAgICAgICAgICBpZiAoY2Znc1tpdF0ud2luZG93RHJhd2FibGUgJiYgSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aFJlbmRlckZtdCgmY2Znc1tpdF0sIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiaVBpeGVsRm9ybWF0PSVkIGlzIGNvbXBhdGlibGUgd2l0aCBDaGVja0Zvcm1hdD0lc1xuIiwgY2Znc1tpdF0uaVBpeGVsRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID09IE9STV9QQlVGRkVSKSB7CiAgICAgICAgLyogV2UgY2FuIHByb2JhYmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGluIEZCTyBtb2RlIHRvbyBvbiBzb21lIGRyaXZlcnMgdG8gZ2V0IHNvbWUgYmFzaWMgaW5kaWNhdGlvbiBvZiB0aGUgY2FwYWJpbGl0aWVzLiAqLwogICAgICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5jZmdzOwogICAgICAgIGludCBpdDsKCiAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBXR0wgcGl4ZWwgZm9ybWF0IG1hdGNoaW5nIHRoZSByZXF1aXJlbWVudHMsIHRoZSBwaXhlbCBmb3JtYXQgc2hvdWxkIGFsc28gYmUgdXNhYmxlIHdpdGggcGJ1ZmZlcnMgKi8KICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsgKytpdCkgewogICAgICAgICAgICBpZiAoY2Znc1tpdF0ucGJ1ZmZlckRyYXdhYmxlICYmIElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoJmNmZ3NbaXRdLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoImlQaXhlbEZvcm1hdD0lZCBpcyBjb21wYXRpYmxlIHdpdGggQ2hlY2tGb3JtYXQ9JXNcbiIsIGNmZ3NbaXRdLmlQaXhlbEZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KENoZWNrRm9ybWF0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZih3aW5lZDNkX3NldHRpbmdzLm9mZnNjcmVlbl9yZW5kZXJpbmdfbW9kZSA9PSBPUk1fRkJPKXsKICAgICAgICAvKiBGb3Igbm93IHJldHVybiBUUlVFIGZvciBGQk9zIHVudGlsIHdlIGhhdmUgc29tZSBwcm9wZXIgY2hlY2tzLgogICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZm9ybWF0IGlzIGFyb3VuZCBmb3IgdGV4dHVyaW5nLiAqLwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1NyZ2JSZWFkQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIC8qIENoZWNrIGZvciBzdXBwb3J0ZWQgc1JHQiBmb3JtYXRzIChUZXh0dXJlIGxvYWRpbmcgYW5kIGZyYW1lYnVmZmVyKSAqLwogICAgaWYoIUdMX1NVUFBPUlQoRVhUX1RFWFRVUkVfU1JHQikpIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSBHTF9FWFRfdGV4dHVyZV9zUkdCIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjhHOEI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRSNEc0QjQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOEw4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQxOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQzOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ0OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ1OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIEdhbW1hIHRleHR1cmUgZm9ybWF0ICVzIG5vdCBzdXBwb3J0ZWQuXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1NyZ2JXcml0ZUNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICAvKiBPbmx5IG9mZmVyIFNSR0Igd3JpdGluZyBvbiBYOFI4RzhCOC9BOFI4RzhCOCB3aGVuIHdlIHVzZSBBUkIgb3IgR0xTTCBzaGFkZXJzIGFzIHdlIGFyZQogICAgICogZG9pbmcgdGhlIGNvbG9yIGZpeHVwIGluIHNoYWRlcnMuCiAgICAgKiBOb3RlIFdpbmRvd3MgZHJpdmVycyAoYXQgbGVhc3Qgb24gdGhlIEdlZm9yY2UgODgwMCkgYWxzbyBvZmZlciB0aGlzIG9uIFI1RzZCNS4gKi8KICAgIGlmKChDaGVja0Zvcm1hdCA9PSBXSU5FRDNERk1UX1g4UjhHOEI4KSB8fCAoQ2hlY2tGb3JtYXQgPT0gV0lORUQzREZNVF9BOFI4RzhCOCkpIHsKICAgICAgICBpbnQgdnNfc2VsZWN0ZWRfbW9kZTsKICAgICAgICBpbnQgcHNfc2VsZWN0ZWRfbW9kZTsKICAgICAgICBzZWxlY3Rfc2hhZGVyX21vZGUoJkdMSU5GT19MT0NBVElPTiwgRGV2aWNlVHlwZSwgJnBzX3NlbGVjdGVkX21vZGUsICZ2c19zZWxlY3RlZF9tb2RlKTsKCiAgICAgICAgaWYoKHBzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0FSQikgfHwgKHBzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0dMU0wpKSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBubyBTUkdCIHdyaXRpbmcgc3VwcG9ydCBvbiBmb3JtYXQ9JXNcbiIsIGRlYnVnX2QzZGZvcm1hdChDaGVja0Zvcm1hdCkpOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKiBDaGVjayBpZiBhIGZvcm1hdCBzdXBwb3J0IGJsZW5kaW5nIGluIGNvbWJpbmF0aW9uIHdpdGggcGl4ZWwgc2hhZGVycyAqLwpzdGF0aWMgQk9PTCBDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoQ2hlY2tGb3JtYXQsICZHTElORk9fTE9DQVRJT04sICZnbERlc2MpOwoKICAgIC8qIEZhaWwgaWYgd2Ugd2VyZW4ndCBhYmxlIHRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgKi8KICAgIGlmKCFkZXNjIHx8ICFnbERlc2MpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFRoZSBmbGFncyBlbnRyeSBvZiBhIGZvcm1hdCBjb250YWlucyB0aGUgcG9zdCBwaXhlbCBzaGFkZXIgYmxlbmRpbmcgY2FwYWJpbGl0eSAqLwogICAgaWYoZ2xEZXNjLT5GbGFncyAmIFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcpCiAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1dyYXBBbmRNaXBDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBDaGVja0Zvcm1hdCkgewogICAgLyogT3BlbkdMIHN1cHBvcnRzIG1pcG1hcHBpbmcgb24gYWxsIGZvcm1hdHMgYmFzaWNhbGx5LiBXcmFwcGluZyBpcyB1bnN1cHBvcnRlZCwKICAgICAqIGJ1dCB3ZSBoYXZlIHRvIHJlcG9ydCBtaXBtYXBwaW5nIHNvIHdlIGNhbm5vdCByZWplY3QgdGhpcyBmbGFnLiBUZXN0cyBzaG93IHRoYXQKICAgICAqIHdpbmRvd3MgcmVwb3J0cyBXUkFQQU5ETUlQIG9uIHVuZmlsdGVyYWJsZSBzdXJmYWNlcyBhcyB3ZWxsLCBhcHBhcmVudGx5IHRvIHNob3cKICAgICAqIHRoYXQgd3JhcHBpbmcgaXMgc3VwcG9ydGVkLiBUaGUgbGFjayBvZiBmaWx0ZXJpbmcgd2lsbCBzb3J0IG91dCB0aGUgbWlwbWFwcGluZwogICAgICogY2FwYWJpbGl0eSBhbnl3YXkuCiAgICAgKgogICAgICogRm9yIG5vdyBsZXRzIHJlcG9ydCB0aGlzIG9uIGFsbCBmb3JtYXRzLCBidXQgaW4gdGhlIGZ1dHVyZSB3ZSBtYXkgd2FudCB0bwogICAgICogcmVzdHJpY3QgaXQgdG8gc29tZSBzaG91bGQgZ2FtZXMgbmVlZCB0aGF0CiAgICAgKi8KICAgIHJldHVybiBUUlVFOwp9CgovKiBDaGVjayBpZiBhIHRleHR1cmUgZm9ybWF0IGlzIHN1cHBvcnRlZCBvbiB0aGUgZ2l2ZW4gYWRhcHRlciAqLwpzdGF0aWMgQk9PTCBDaGVja1RleHR1cmVDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBDaGVja0Zvcm1hdCkKewogICAgc3dpdGNoIChDaGVja0Zvcm1hdCkgewoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgc3VwcG9ydGVkOiBSR0IoQSkgZm9ybWF0cwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4Qjg6IC8qIEVuYWJsZSBmb3IgZHg3LCBibGFja2xpc3RlZCBmb3IgOCBhbmQgOSBhYm92ZSAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDFSNUc1QjU6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0ExUjVHNUI1OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BNFI0RzRCNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjNHM0IyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDRSNEc0QjQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4QjhHOFI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEI4RzhSODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTJSMTBHMTBCMTA6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0EyQjEwRzEwUjEwOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMTZSMTY6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKCiAgICAgICAgLyoqKioqCiAgICAgICAgICogIHN1cHBvcnRlZDogUGFsZXR0aXplZAogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9QODoKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIC8qIE5vIFdpbmRvd3MgZHJpdmVyIG9mZmVycyBBOFA4LCBzbyBkb24ndCBvZmZlciBpdCBlaXRoZXIgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThQODoKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgU3VwcG9ydGVkOiAoQWxwaGEpLUx1bWluYW5jZQogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9MODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThMODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRMNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDE2OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIC8qKioqKgogICAgICAgICAqICBTdXBwb3J0ZWQ6IERlcHRoL1N0ZW5jaWwgZm9ybWF0cwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMTZfTE9DS0FCTEU6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE1UzE6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYNFM0OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRTODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0RlM4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMzI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QzMkZfTE9DS0FCTEU6CiAgICAgICAgICAgIHJldHVybiBUUlVFOwoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgTm90IHN1cHBvcnRlZCBldmVyeXdoZXJlKGRlcGVuZHMgb24gR0xfQVRJX2Vudm1hcF9idW1wbWFwIG9yCiAgICAgICAgICogIEdMX05WX3RleHR1cmVfc2hhZGVyKSwgYnV0IGFkdmVydGl6ZWQgdG8gbWFrZSBhcHBzIGhhcHB5LgogICAgICAgICAqICBFbmFibGUgc29tZSBiZWNhdXNlIGdhbWVzIG9mdGVuIGZhaWwgd2hlbiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlCiAgICAgICAgICogIGFuZCBhcmUgc3RpbGwgcGxheWFibGUgZXZlbiB3aXRob3V0IGJ1bXAgbWFwcGluZwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkgfHwKICAgICAgICAgICAgICAgR0xfU1VQUE9SVChBVElfRlJBR01FTlRfU0hBREVSKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfRlJBR01FTlRfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9QUk9HUkFNKSkgewogICAgICAgICAgICAgICAgLyogU2hhZGVyIGVtdWxhdGVkICovCiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEw4VjhVODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9TSEFERVIpIHx8IEdMX1NVUFBPUlQoQVJCX0ZSQUdNRU5UX1BST0dSQU0pKSB7CiAgICAgICAgICAgICAgICAvKiBTaGFkZXIgZW11bGF0ZWQgKi8KICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9ROFc4VjhVODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjE2VTE2OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSKSkgewogICAgICAgICAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJbTm90IHN1cHBvcnRlZCwgYnV0IHByZXRlbmRlZCB0byBkb11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfRlJBR01FTlRfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9QUk9HUkFNKSkgewogICAgICAgICAgICAgICAgLyogU2hhZGVyIGVtdWxhdGVkICovCiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIC8qIFRob3NlIGFyZSBub3QgYWR2ZXJ0aXplZCBieSB0aGUgbnZpZGlhIHdpbmRvd3MgZHJpdmVyLCBhbmQgbm90CiAgICAgICAgICogc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IEdMX05WX3RleHR1cmVfc2hhZGVyIG9yIEdMX0FUSV9lbnZtYXBfYnVtcG1hcC4KICAgICAgICAgKiBXSU5FRDNERk1UX0EyVzEwVjEwVTEwIGNvdWxkIGJlIGxvYWRlZCBpbnRvIHNoYWRlcnMgdXNpbmcgdGhlIHVuc2lnbmVkCiAgICAgICAgICogQVJHQiBmb3JtYXQgaWYgbmVlZGVkCiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1cxMVYxMVUxMDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTJXMTBWMTBVMTA6CiAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQxOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQzOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ0OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ1OgogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9DT01QUkVTU0lPTl9TM1RDKSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCgogICAgICAgIC8qKioqKgogICAgICAgICAqICBPZGQgZm9ybWF0cyAtIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVkVSVEVYREFUQToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfSU5ERVgxNjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfSU5ERVgzMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUTE2VzE2VjE2VTE2OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7IC8qIEVuYWJsZSB3aGVuIGltcGxlbWVudGVkICovCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyoqKioqCiAgICAgICAgICogIFdJTkVEM0RGTVRfQ3hWOFU4OiBOb3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9DeFY4VTg6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsgLyogRW5hYmxlIHdoZW4gaW1wbGVtZW50ZWQgKi8KICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvKiBZVVYgZm9ybWF0cywgbm90IHN1cHBvcnRlZCBmb3Igbm93ICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VZVlk6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lVWTI6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsgLyogRW5hYmxlIHdoZW4gaW1wbGVtZW50ZWQgKi8KICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAgICAgLyogTm90IHN1cHBvcnRlZCAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9BMTZCMTZHMTZSMTY6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjNHM0IyOgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7IC8qIEVuYWJsZSB3aGVuIGltcGxlbWVudGVkICovCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IGZvcm1hdHMgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjE2RjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTE2QjE2RzE2UjE2RjoKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9GTE9BVCkgJiYgR0xfU1VQUE9SVChBUkJfSEFMRl9GTE9BVF9QSVhFTCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SMzJGOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BMzJCMzJHMzJSMzJGOgogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9GTE9BVCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMTZSMTZGOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMzJSMzJGOgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyogQVRJIGluc3RhbmNpbmcgaGFjazogQWx0aG91Z2ggQVRJIGNhcmRzIGRvIG5vdCBzdXBwb3J0IFNoYWRlciBNb2RlbCAzLjAsIHRoZXkgc3VwcG9ydAogICAgICAgICAqIGluc3RhbmNpbmcuIFRvIHF1ZXJ5IGlmIHRoZSBjYXJkIHN1cHBvcnRzIGluc3RhbmNpbmcgQ2hlY2tEZXZpY2VGb3JtYXQgd2l0aCB0aGUgc3BlY2lhbCBmb3JtYXQKICAgICAgICAgKiBNQUtFRk9VUkNDKCdJJywnTicsJ1MnLCdUJykgaXMgdXNlZC4gU2hvdWxkIGEgKGJyb2tlbikgYXBwIGNoZWNrIGZvciB0aGlzIHByb3ZpZGUgYSBwcm9wZXIgcmV0dXJuIHZhbHVlLgogICAgICAgICAqIFdlIGNhbiBkbyBpbnN0YW5jaW5nIHdpdGggYWxsIHNoYWRlciB2ZXJzaW9ucywgYnV0IHdlIG5lZWQgdmVydGV4IHNoYWRlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBBZGRpdGlvbmFsbHkgYXBwbGljYXRpb25zIGhhdmUgdG8gc2V0IHRoZSBEM0RSU19QT0lOVFNJWkUgcmVuZGVyIHN0YXRlIHRvIE1BS0VGT1VSQ0MoJ0knLCdOJywnUycsJ1QnKSBvbmNlCiAgICAgICAgICogdG8gZW5hYmxlIGluc3RhbmNpbmcuIFdpbmVEM0QgZG9lc24ndCBuZWVkIHRoYXQgYW5kIGp1c3QgaWdub3JlcyBpdC4KICAgICAgICAgKgogICAgICAgICAqIFdpdGggU2hhZGVyIE1vZGVsIDMuMCBjYXBhYmxlIGNhcmRzIEluc3RhbmNpbmcgJ2p1c3Qgd29ya3MnIGluIFdpbmRvd3MuCiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FTUFLRUZPVVJDQygnSScsJ04nLCdTJywnVCcpOgogICAgICAgICAgICBUUkFDRSgiQVRJIEluc3RhbmNpbmcgY2hlY2sgaGFja1xuIik7CiAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9QUk9HUkFNKSB8fCBHTF9TVVBQT1JUKEFSQl9WRVJURVhfU0hBREVSKSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyogU29tZSB3ZWlyZCBGT1VSQ0MgZm9ybWF0cyAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4X0I4Rzg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0c4UjhfRzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTVVMVEkyX0FSR0I4OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VOS05PV046CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgZm9ybWF0PSVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIENoZWNrVmVydGV4VGV4dHVyZUNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBpZiAoIUdMX0xJTUlUUyh2ZXJ0ZXhfc2FtcGxlcnMpKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0EzMkIzMkczMlIzMkY6CiAgICAgICAgICAgIGlmICghR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9GTE9BVCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlRm9ybWF0KElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGT1JNQVQgQWRhcHRlckZvcm1hdCwgRFdPUkQgVXNhZ2UsIFdJTkVEM0RSRVNPVVJDRVRZUEUgUlR5cGUsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIERXT1JEIFVzYWdlQ2FwcyA9IDA7CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKS0+IChTVFVCKSAoQWRwdHI6JWQsIERldlR5cGU6KCV1LCVzKSwgQWRwdEZtdDooJXUsJXMpLCBVc2U6KCV1LCVzLCVzKSwgUmVzVHlwOigleCwlcyksIENoZWNrRm10OigldSwlcykpXG4iLAogICAgICAgICAgVGhpcywKICAgICAgICAgIEFkYXB0ZXIsCiAgICAgICAgICBEZXZpY2VUeXBlLCBkZWJ1Z19kM2RkZXZpY2V0eXBlKERldmljZVR5cGUpLAogICAgICAgICAgQWRhcHRlckZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KEFkYXB0ZXJGb3JtYXQpLAogICAgICAgICAgVXNhZ2UsIGRlYnVnX2QzZHVzYWdlKFVzYWdlKSwgZGVidWdfZDNkdXNhZ2VxdWVyeShVc2FnZSksCiAgICAgICAgICBSVHlwZSwgZGVidWdfZDNkcmVzb3VyY2V0eXBlKFJUeXBlKSwKICAgICAgICAgIENoZWNrRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgaWYoUlR5cGUgPT0gV0lORUQzRFJUWVBFX0NVQkVURVhUVVJFKSB7CiAgICAgICAgLyogQ3ViZXRleHR1cmUgYWxsb3dzOgogICAgICAgICAqICAgICAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVAKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9ERVBUSFNURU5DSUwKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9EWU5BTUlDCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfTk9OU0VDVVJFIChkM2Q5ZXgpCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUkVOREVSVEFSR0VUCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUVVFUllfV1JBUEFORE1JUAogICAgICAgICAqLwogICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfQ1VCRV9NQVApKSB7CiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB0ZXh0dXJlIGZvcm1hdCBpcyBhcm91bmQgKi8KICAgICAgICAgICAgaWYoQ2hlY2tUZXh0dXJlQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApIHsKICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKFNHSVNfR0VORVJBVEVfTUlQTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogV2hlbiBhdXRvZ2VubWlwbWFwIGlzbid0IGFyb3VuZCBjb250aW51ZSBhbmQgcmV0dXJuIFdJTkVEM0RPS19OT0FVVE9HRU4gaW5zdGVhZCBvZiBEM0RfT0sgKi8KICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBhdXRvZ2VubWlwbWFwIHN1cHBvcnQsIGJ1dCBjb250aW51aW5nXG4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBkeW5hbWljIGxvY2tpbmcgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0RZTkFNSUMpCiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9EWU5BTUlDOwoKICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCkgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrUmVuZGVyVGFyZ2V0Q2FwYWJpbGl0eShBZGFwdGVyRm9ybWF0LCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9SRU5ERVJUQVJHRVQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyByZW5kZXJ0YXJnZXQgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBzb2Z0d2FyZSBwcm9jZXNzaW5nICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcpCiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkc7CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfRklMVEVSIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX0ZJTFRFUikgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrRmlsdGVyQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBmaWx0ZXIgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORykgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrUG9zdFBpeGVsU2hhZGVyQmxlbmRpbmdDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHBvc3QgcGl4ZWxzaGFkZXIgYmxlbmRpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQlJFQUQgc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQlJFQUQpIHsKICAgICAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JSZWFkQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2JyZWFkIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1NSR0JXUklURSBzdXBwb3J0ICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCV1JJVEUpIHsKICAgICAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JXcml0ZUNhcGFiaWxpdHkoQWRhcHRlciwgRGV2aWNlVHlwZSwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgc3JnYndyaXRlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1ZFUlRFWFRFWFRVUkUgc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRSkgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrVmVydGV4VGV4dHVyZUNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHZlcnRleHRleHR1cmUgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfV1JBUEFORE1JUCBzdXBwb3J0ICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoQ2hlY2tXcmFwQW5kTWlwQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gd3JhcHBpbmcgYW5kIG1pcG1hcHBpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIEN1YmUgdGV4dHVyZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGN1YmUgdGV4dHVyZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgIH0KICAgIH0gZWxzZSBpZihSVHlwZSA9PSBXSU5FRDNEUlRZUEVfU1VSRkFDRSkgewogICAgICAgIC8qIFN1cmZhY2UgYWxsb3dzOgogICAgICAgICAqICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfREVQVEhTVEVOQ0lMCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9OT05TRUNVUkUgKGQzZDlleCkKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1JFTkRFUlRBUkdFVAogICAgICAgICAqLwoKICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUwpIHsKICAgICAgICAgICAgaWYoQ2hlY2tEZXB0aFN0ZW5jaWxDYXBhYmlsaXR5KEFkYXB0ZXIsIEFkYXB0ZXJGb3JtYXQsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGRlcHRoc3RlbmNpbCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUKSB7CiAgICAgICAgICAgIGlmKENoZWNrUmVuZGVyVGFyZ2V0Q2FwYWJpbGl0eShBZGFwdGVyRm9ybWF0LCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyByZW5kZXJ0YXJnZXQgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVjayBRVUVSWV9QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgc3VwcG9ydCAqLwogICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORykgewogICAgICAgICAgICBpZihDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBwb3N0IHBpeGVsc2hhZGVyIGJsZW5kaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKFJUeXBlID09IFdJTkVEM0RSVFlQRV9URVhUVVJFKSB7CiAgICAgICAgLyogVGV4dHVyZSBhbGxvd3M6CiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9ERVBUSFNURU5DSUwKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0RNQVAKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0RZTkFNSUMKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX05PTlNFQ1VSRSAoZDNkOWV4KQogICAgICAgICAqICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUkVOREVSVEFSR0VUCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1RFWFRBUEkgKGQzZDlleCkKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVAKICAgICAgICAgKi8KCiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHRleHR1cmUgZm9ybWF0IGlzIGFyb3VuZCAqLwogICAgICAgIGlmKENoZWNrVGV4dHVyZUNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApIHsKICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChTR0lTX0dFTkVSQVRFX01JUE1BUCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gYXV0b2dlbm1pcG1hcCBpc24ndCBhcm91bmQgY29udGludWUgYW5kIHJldHVybiBXSU5FRDNET0tfTk9BVVRPR0VOIGluc3RlYWQgb2YgRDNEX09LICovCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBhdXRvZ2VubWlwbWFwIHN1cHBvcnQsIGJ1dCBjb250aW51aW5nXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBkeW5hbWljIGxvY2tpbmcgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfRFlOQU1JQykKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfRFlOQU1JQzsKCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tSZW5kZXJUYXJnZXRDYXBhYmlsaXR5KEFkYXB0ZXJGb3JtYXQsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHJlbmRlcnRhcmdldCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBzb2Z0d2FyZSBwcm9jZXNzaW5nICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1NPRlRXQVJFUFJPQ0VTU0lORykKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HOwoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfRklMVEVSIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfRklMVEVSKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja0ZpbHRlckNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgZmlsdGVyIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfTEVHQUNZQlVNUE1BUCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX0xFR0FDWUJVTVBNQVApIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrQnVtcE1hcENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9MRUdBQ1lCVU1QTUFQOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGxlZ2FjeSBidW1wbWFwIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBwb3N0IHBpeGVsc2hhZGVyIGJsZW5kaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQlJFQUQgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiUmVhZENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBzcmdicmVhZCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1NSR0JXUklURSBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JXUklURSkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiV3JpdGVDYXBhYmlsaXR5KEFkYXB0ZXIsIERldmljZVR5cGUsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2J3cml0ZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1ZFUlRFWFRFWFRVUkUgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9WRVJURVhURVhUVVJFKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1ZlcnRleFRleHR1cmVDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSB2ZXJ0ZXh0ZXh0dXJlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfV1JBUEFORE1JUCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVApIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrV3JhcEFuZE1pcENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHdyYXBwaW5nIGFuZCBtaXBtYXBwaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfREVQVEhTVEVOQ0lMKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja0RlcHRoU3RlbmNpbENhcGFiaWxpdHkoQWRhcHRlciwgQWRhcHRlckZvcm1hdCwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gZGVwdGggc3RlbmNpbCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIFRleHR1cmUgZm9ybWF0IG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgfQogICAgfSBlbHNlIGlmKChSVHlwZSA9PSBXSU5FRDNEUlRZUEVfVk9MVU1FKSB8fCAoUlR5cGUgPT0gV0lORUQzRFJUWVBFX1ZPTFVNRVRFWFRVUkUpKSB7CiAgICAgICAgLyogVm9sdW1lIGlzIHRvIFZvbHVtZVRleHR1cmUgd2hhdCBTdXJmYWNlIGlzIHRvIFRleHR1cmUgYnV0IGl0cyB1c2FnZSBjYXBzIGFyZSBub3QgZG9jdW1lbnRlZC4KICAgICAgICAgKiBNb3N0IGRyaXZlciBzZWVtIHRvIG9mZmVyIChuZWFybHkpIHRoZSBzYW1lIG9uIFZvbHVtZSBhbmQgVm9sdW1lVGV4dHVyZSwgc28gZG8gdGhhdCB0b28uCiAgICAgICAgICoKICAgICAgICAgKiBWb2x1bWV0ZXh0dXJlIGFsbG93czoKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0RZTkFNSUMKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX05PTlNFQ1VSRSAoZDNkOWV4KQogICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQCiAgICAgICAgICovCgogICAgICAgIC8qIENoZWNrIHZvbHVtZSB0ZXh0dXJlIGFuZCB2b2x1bWUgdXNhZ2UgY2FwcyAqLwogICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkUzRCkpIHsKICAgICAgICAgICAgaWYoQ2hlY2tUZXh0dXJlQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkgPT0gRkFMU0UpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gRm9ybWF0IG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBBbHdheXMgcmVwb3J0IGR5bmFtaWMgbG9ja2luZyAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9EWU5BTUlDKQogICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9EWU5BTUlDOwoKICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBzb2Z0d2FyZSBwcm9jZXNzaW5nICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1NPRlRXQVJFUFJPQ0VTU0lORykKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HOwoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfRklMVEVSIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfRklMVEVSKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja0ZpbHRlckNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgZmlsdGVyIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBwb3N0IHBpeGVsc2hhZGVyIGJsZW5kaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQlJFQUQgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiUmVhZENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBzcmdicmVhZCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1NSR0JXUklURSBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JXUklURSkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiV3JpdGVDYXBhYmlsaXR5KEFkYXB0ZXIsIERldmljZVR5cGUsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2J3cml0ZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1ZFUlRFWFRFWFRVUkUgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9WRVJURVhURVhUVVJFKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1ZlcnRleFRleHR1cmVDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSB2ZXJ0ZXh0ZXh0dXJlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfV1JBUEFORE1JUCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVApIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrV3JhcEFuZE1pcENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHdyYXBwaW5nIGFuZCBtaXBtYXBwaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gdm9sdW1lIHRleHR1cmUgc3VwcG9ydFxuIik7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICB9CgogICAgICAgIC8qIEZpbHRlciBmb3JtYXRzIHRoYXQgbmVlZCBjb252ZXJzaW9uOyBGb3Igb25lIHBhcnQsIHRoaXMgY29udmVyc2lvbiBpcyB1bmltcGxlbWVudGVkLAogICAgICAgICAqIGFuZCB2b2x1bWUgdGV4dHVyZXMgYXJlIGh1Z2UsIHNvIGl0IHdvdWxkIGJlIGEgYmlnIHBlcmZvcm1hbmNlIGhpdC4gVW5sZXNzIHdlIGhpdCBhbgogICAgICAgICAqIGFwcCBuZWVkaW5nIG9uZSBvZiB0aG9zZSBmb3JtYXRzLCBkb24ndCBhZHZlcnRpemUgdGhlbSB0byBhdm9pZCBsZWFkaW5nIGFwcHMgaW50bwogICAgICAgICAqIHRlbXB0YXRpb24uIFRoZSB3aW5kb3dzIGRyaXZlcnMgZG9uJ3Qgc3VwcG9ydCBtb3N0IG9mIHRob3NlIGZvcm1hdHMgb24gdm9sdW1lcyBhbnl3YXksCiAgICAgICAgICogZXhjZXB0IG9mIFIzMkYuCiAgICAgICAgICovCiAgICAgICAgc3dpdGNoKENoZWNrRm9ybWF0KSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9QODoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E0TDQ6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9SMzJGOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjE2RjoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g4TDhWOFU4OgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRzE2UjE2OgogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBjb252ZXJ0ZWQgZm9ybWF0cyBvbiB2b2x1bWVzXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9ROFc4VjhVODoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1YxNlUxNjoKICAgICAgICAgICAgaWYoIUdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIpKSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1Y4VTg6CiAgICAgICAgICAgIGlmKCFHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSKSB8fCAhR0xfU1VQUE9SVChBVElfRU5WTUFQX0JVTVBNQVApKSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDE6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQyOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMzoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDQ6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ1OgogICAgICAgICAgICAgICAgLyogVGhlIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMgc3BlYyByZXF1aXJlcyB0aGF0IGxvYWRpbmcgYW4gczN0YwogICAgICAgICAgICAgICAgICogY29tcHJlc3NlZCB0ZXh0dXJlIHJlc3VsdHMgaW4gYW4gZXJyb3IuIFdoaWxlIHRoZSBEM0QgcmVmcmFzdCBkb2VzCiAgICAgICAgICAgICAgICAgKiBzdXBwb3J0IHMzdGMgdm9sdW1lcywgYXQgbGVhc3QgdGhlIG52aWRpYSB3aW5kb3dzIGRyaXZlciBkb2VzIG5vdCwgc28KICAgICAgICAgICAgICAgICAqIHdlJ3JlIGZyZWUgbm90IHRvIHN1cHBvcnQgdGhpcyBmb3JtYXQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gRFhUbiBkb2VzIG5vdCBzdXBwb3J0IDNEIHRleHR1cmVzXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nLCBjb250aW51ZSB3aXRoIGNoZWNraW5nIHRoZSBmb3JtYXQgYmVsb3cgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0gZWxzZSBpZigoUlR5cGUgPT0gV0lORUQzRFJUWVBFX0lOREVYQlVGRkVSKSB8fCAoUlR5cGUgPT0gV0lORUQzRFJUWVBFX1ZFUlRFWEJVRkZFUikpewogICAgICAgIC8qIEZvciBpbnN0YW5jZSB2ZXJ0ZXhidWZmZXIvaW5kZXhidWZmZXIgYXJlbid0IHN1cHBvcnRlZCB5ZXQgYmVjYXVzZSBubyBXaW5kb3dzIGRyaXZlcnMgc2VlbSB0byBvZmZlciBpdCAqLwogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlVuaGFuZGxlZCByZXNvdXJjZSB0eXBlIEQzRFJUWVBFX0lOREVYQlVGRkVSIC8gRDNEUlRZUEVfVkVSVEVYQlVGRkVSXG4iKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgfQoKICAgIC8qIFRoaXMgZm9ybWF0IGlzIG5vdGhpbmcgc3BlY2lhbCBhbmQgaXQgaXMgc3VwcG9ydGVkIHBlcmZlY3RseS4KICAgICAqIEhvd2V2ZXIsIGF0aSBhbmQgbnZpZGlhIGRyaXZlciBvbiB3aW5kb3dzIGRvIG5vdCBtYXJrIHRoaXMgZm9ybWF0IGFzCiAgICAgKiBzdXBwb3J0ZWQgKHRlc3RlZCB3aXRoIHRoZSBkeENhcHNWaWV3ZXIpIGFuZCBwcmV0ZW5kaW5nIHRvCiAgICAgKiBzdXBwb3J0IHRoaXMgZm9ybWF0IHVuY292ZXJzIGEgYnVnIGluIEJhdHRsZWZpZWxkIDE5NDIgKGZvbnRzIGFyZSBtaXNzaW5nKQogICAgICogU28gZG8gdGhlIHNhbWUgYXMgV2luZG93cyBkcml2ZXJzIGFuZCBwcmV0ZW5kIG5vdCB0byBzdXBwb3J0IGl0IG9uIGR4OCBhbmQgOQogICAgICogRW5hYmxlIGl0IG9uIGR4Ny4gSXQgd2lsbCBuZWVkIGFkZGl0aW9uYWwgY2hlY2tpbmcgb24gZHgxMCB3aGVuIHdlIHN1cHBvcnQgaXQuCiAgICAgKi8KICAgIGlmKFRoaXMtPmR4VmVyc2lvbiA+IDcgJiYgQ2hlY2tGb3JtYXQgPT0gV0lORUQzREZNVF9SOEc4QjgpIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgfQoKICAgIC8qIFdoZW4gdGhlIFVzYWdlQ2FwcyBleGFjdGx5IG1hdGNoZXMgVXNhZ2UgcmV0dXJuIFdJTkVEM0RfT0sgZXhjZXB0IGZvciB0aGUgc2l0dWF0aW9uIGluIHdoaWNoCiAgICAgKiBXSU5FRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCBpc24ndCBhcm91bmQsIHRoZW4gV0lORUQzRE9LX05PQVVUT0dFTiBpcyByZXR1cm5lZCBpZiBhbGwgdGhlIG90aGVyCiAgICAgKiB1c2FnZSBmbGFncyBtYXRjaC4gKi8KICAgIGlmKFVzYWdlQ2FwcyA9PSBVc2FnZSkgewogICAgICAgIHJldHVybiBXSU5FRDNEX09LOwogICAgfSBlbHNlIGlmKChVc2FnZUNhcHMgPT0gKFVzYWdlICYgfldJTkVEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKSkgJiYgKFVzYWdlICYgV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApKXsKICAgICAgICByZXR1cm4gV0lORUQzRE9LX05PQVVUT0dFTjsKICAgIH0gZWxzZSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBVc2FnZT0lIzA4eCByZXF1ZXN0ZWQgZm9yIENoZWNrRm9ybWF0PSVzIGFuZCBSVHlwZT0lZCBidXQgb25seSAlIzA4eCBpcyBhdmFpbGFibGVcbiIsIFVzYWdlLCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpLCBSVHlwZSwgVXNhZ2VDYXBzKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9Cn0KCnN0YXRpYyBIUkVTVUxUICBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGT1JNQVQgU291cmNlRm9ybWF0LCBXSU5FRDNERk9STUFUIFRhcmdldEZvcm1hdCkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwoKICAgIEZJWE1FXyhkM2RfY2FwcykoIiglcCktPiAoU1RVQikgKEFkcHRyOiVkLCBEZXZUeXBlOigldSwlcyksIFNyY0ZtdDooJXUsJXMpLCBUZ3RGbXQ6KCV1LCVzKSlcbiIsCiAgICAgICAgICBUaGlzLAogICAgICAgICAgQWRhcHRlciwKICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICBTb3VyY2VGb3JtYXQsIGRlYnVnX2QzZGZvcm1hdChTb3VyY2VGb3JtYXQpLAogICAgICAgICAgVGFyZ2V0Rm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoVGFyZ2V0Rm9ybWF0KSk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKc3RhdGljIGNvbnN0IHNoYWRlcl9iYWNrZW5kX3QgKnNlbGVjdF9zaGFkZXJfYmFja2VuZChVSU5UIEFkYXB0ZXIsIFdJTkVEM0RERVZUWVBFIERldmljZVR5cGUpIHsKICAgIGNvbnN0IHNoYWRlcl9iYWNrZW5kX3QgKnJldDsKICAgIGludCB2c19zZWxlY3RlZF9tb2RlOwogICAgaW50IHBzX3NlbGVjdGVkX21vZGU7CgogICAgc2VsZWN0X3NoYWRlcl9tb2RlKCZHTElORk9fTE9DQVRJT04sIERldmljZVR5cGUsICZwc19zZWxlY3RlZF9tb2RlLCAmdnNfc2VsZWN0ZWRfbW9kZSk7CiAgICBpZiAodnNfc2VsZWN0ZWRfbW9kZSA9PSBTSEFERVJfR0xTTCB8fCBwc19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9HTFNMKSB7CiAgICAgICAgcmV0ID0gJmdsc2xfc2hhZGVyX2JhY2tlbmQ7CiAgICB9IGVsc2UgaWYgKHZzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0FSQiAmJiBwc19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmCiAgICAgICAgICAgICAgIUdMX1NVUFBPUlQoQVJCX0ZSQUdNRU5UX1BST0dSQU0pKSB7CiAgICAgICAgcmV0ID0gJmF0aWZzX3NoYWRlcl9iYWNrZW5kOwogICAgfSBlbHNlIGlmICh2c19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9BUkIgfHwgcHNfc2VsZWN0ZWRfbW9kZSA9PSBTSEFERVJfQVJCKSB7CiAgICAgICAgcmV0ID0gJmFyYl9wcm9ncmFtX3NoYWRlcl9iYWNrZW5kOwogICAgfSBlbHNlIHsKICAgICAgICByZXQgPSAmbm9uZV9zaGFkZXJfYmFja2VuZDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qIE5vdGU6IGQzZDggcGFzc2VzIGluIGEgcG9pbnRlciB0byBhIEQzRENBUFM4IHN0cnVjdHVyZSwgd2hpY2ggaXMgYSB0cnVlCiAgICAgIHN1YnNldCBvZiBhIEQzRENBUFM5IHN0cnVjdHVyZS4gSG93ZXZlciwgaXQgaGFzIHRvIGNvbWUgdmlhIGEgdm9pZCAqCiAgICAgIGFzIHRoZSBkM2Q4IGludGVyZmFjZSBjYW5ub3QgaW1wb3J0IHRoZSBkM2Q5IGhlYWRlciAgICAgICAgICAgICAgICAgICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfR2V0RGV2aWNlQ2FwcyhJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwgV0lORUQzRENBUFMqIHBDYXBzKSB7CgogICAgSVdpbmVEM0RJbXBsICAgICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgaW50IHZzX3NlbGVjdGVkX21vZGU7CiAgICBpbnQgcHNfc2VsZWN0ZWRfbW9kZTsKICAgIHN0cnVjdCBzaGFkZXJfY2FwcyBzaGFkZXJfY2FwczsKICAgIGNvbnN0IHNoYWRlcl9iYWNrZW5kX3QgKnNoYWRlcl9iYWNrZW5kOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcCktPihBZHB0cjolZCwgRGV2VHlwZTogJXgsIHBDYXBzOiAlcClcbiIsIFRoaXMsIEFkYXB0ZXIsIERldmljZVR5cGUsIHBDYXBzKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgc2VsZWN0X3NoYWRlcl9tb2RlKCZBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLCBEZXZpY2VUeXBlLCAmcHNfc2VsZWN0ZWRfbW9kZSwgJnZzX3NlbGVjdGVkX21vZGUpOwoKICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkICpub3QqIGJlIG1vZGlmeWluZyBHTCBjYXBzCiAgICAgKiBUT0RPOiBtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IHdoZXJlIGl0IGJlbG9uZ3MgKi8KICAgIHNlbGVjdF9zaGFkZXJfbWF4X2NvbnN0YW50cyhwc19zZWxlY3RlZF9tb2RlLCB2c19zZWxlY3RlZF9tb2RlLCAmQWRhcHRlcnNbQWRhcHRlcl0uZ2xfaW5mbyk7CgogICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcHBseSB0byBib3RoIGQzZDggYW5kIGQzZDkKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgcENhcHMtPkRldmljZVR5cGUgICAgICAgICAgICAgID0gKERldmljZVR5cGUgPT0gV0lORUQzRERFVlRZUEVfSEFMKSA/IFdJTkVEM0RERVZUWVBFX0hBTCA6IFdJTkVEM0RERVZUWVBFX1JFRjsgIC8qIE5vdCBxdWl0ZSB0cnVlLCBidXQgdXNlIGgvdyBzdXBwb3J0ZWQgYnkgb3BlbmdsIEkgc3VwcG9zZSAqLwogICAgcENhcHMtPkFkYXB0ZXJPcmRpbmFsICAgICAgICAgID0gQWRhcHRlcjsKCiAgICBwQ2Fwcy0+Q2FwcyAgICAgICAgICAgICAgICAgICAgPSAwOwogICAgcENhcHMtPkNhcHMyICAgICAgICAgICAgICAgICAgID0gV0lORUQzRENBUFMyX0NBTlJFTkRFUldJTkRPV0VEIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RDQVBTMl9GVUxMU0NSRUVOR0FNTUEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRENBUFMyX0RZTkFNSUNURVhUVVJFUzsKICAgIGlmKEdMX1NVUFBPUlQoU0dJU19HRU5FUkFURV9NSVBNQVApKSB7CiAgICAgICAgcENhcHMtPkNhcHMyIHw9IFdJTkVEM0RDQVBTMl9DQU5BVVRPR0VOTUlQTUFQOwogICAgfQogICAgcENhcHMtPkNhcHMzICAgICAgICAgICAgICAgICAgID0gV0lORUQzRENBUFMzX0FMUEhBX0ZVTExTQ1JFRU5fRkxJUF9PUl9ESVNDQVJEOwogICAgcENhcHMtPlByZXNlbnRhdGlvbkludGVydmFscyAgID0gV0lORUQzRFBSRVNFTlRfSU5URVJWQUxfSU1NRURJQVRFICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJFU0VOVF9JTlRFUlZBTF9PTkU7CgogICAgcENhcHMtPkN1cnNvckNhcHMgICAgICAgICAgICAgID0gV0lORUQzRENVUlNPUkNBUFNfQ09MT1IgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEQ1VSU09SQ0FQU19MT1dSRVM7CgogICAgcENhcHMtPkRldkNhcHMgICAgICAgICAgICAgICAgID0gV0lORUQzRERFVkNBUFNfRkxPQVRUTFZFUlRFWCAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19FWEVDVVRFU1lTVEVNTUVNT1JZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX1RMVkVSVEVYU1lTVEVNTUVNT1JZfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfRVhFQ1VURVZJREVPTUVNT1JZICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19QVVJFREVWSUNFICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0hXUkFTVEVSSVpBVElPTiAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19URVhUVVJFU1lTVEVNTUVNT1JZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0NBTlJFTkRFUkFGVEVSRkxJUCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzJFWCAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX1JUUEFUQ0hFUzsKCiAgICBwQ2Fwcy0+UHJpbWl0aXZlTWlzY0NhcHMgICAgICAgPSBXSU5FRDNEUE1JU0NDQVBTX0NVTExOT05FICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0NVTExDQ1cgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0NVTExDVyAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0NPTE9SV1JJVEVFTkFCTEUgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0NMSVBUTFZFUlRTICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0NMSVBQTEFORVNDQUxFRFBPSU5UUyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX01BU0taICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0JMRU5ET1AgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX01SVFBPU1RQSVhFTFNIQURFUkJMRU5ESU5HOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19OVUxMUkVGRVJFTkNFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0lOREVQRU5ERU5UV1JJVEVNQVNLUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19GT0dBTkRTUEVDVUxBUkFMUEhBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX01SVElOREVQRU5ERU5UQklUREVQVEhTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE1JU0NDQVBTX0ZPR1ZFUlRFWENMQU1QRUQgKi8KCiAgICBpZihHTF9TVVBQT1JUKEVYVF9CTEVORF9FUVVBVElPTl9TRVBBUkFURSkgJiYgR0xfU1VQUE9SVChFWFRfQkxFTkRfRlVOQ19TRVBBUkFURSkpCiAgICAgICAgcENhcHMtPlByaW1pdGl2ZU1pc2NDYXBzIHw9IFdJTkVEM0RQTUlTQ0NBUFNfU0VQQVJBVEVBTFBIQUJMRU5EOwoKICAgIHBDYXBzLT5SYXN0ZXJDYXBzICAgICAgICAgICAgICA9IFdJTkVEM0RQUkFTVEVSQ0FQU19ESVRIRVIgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX1BBVCAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfV0ZPRyAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19aRk9HICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19TVElQUExFICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX1NVQlBJWEVMICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfWlRFU1QgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19TQ0lTU09SVEVTVCAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19TTE9QRVNDQUxFREVQVEhCSUFTIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19ERVBUSEJJQVM7CgogICAgaWYgKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDKSkgewogICAgICAgIHBDYXBzLT5SYXN0ZXJDYXBzIHw9IFdJTkVEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfWkJJQVMgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX01JUE1BUExPREJJQVM7CiAgICB9CiAgICBpZihHTF9TVVBQT1JUKE5WX0ZPR19ESVNUQU5DRSkpIHsKICAgICAgICBwQ2Fwcy0+UmFzdGVyQ2FwcyAgICAgICAgIHw9IFdJTkVEM0RQUkFTVEVSQ0FQU19GT0dSQU5HRTsKICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgQWRkOgoJCQkgICBXSU5FRDNEUFJBU1RFUkNBUFNfQ09MT1JQRVJTUEVDVElWRQoJCQkgICBXSU5FRDNEUFJBU1RFUkNBUFNfU1RSRVRDSEJMVE1VTFRJU0FNUExFCgkJCSAgIFdJTkVEM0RQUkFTVEVSQ0FQU19BTlRJQUxJQVNFREdFUwoJCQkgICBXSU5FRDNEUFJBU1RFUkNBUFNfWkJVRkZFUkxFU1NIU1IKCQkJICAgV0lORUQzRFBSQVNURVJDQVBTX1dCVUZGRVIgKi8KCiAgICBwQ2Fwcy0+WkNtcENhcHMgPSBXSU5FRDNEUENNUENBUFNfQUxXQVlTICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19FUVVBTCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBDTVBDQVBTX0dSRUFURVIgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19MRVNTICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBDTVBDQVBTX0xFU1NFUVVBTCAgICB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTkVWRVIgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19OT1RFUVVBTDsKCiAgICBwQ2Fwcy0+U3JjQmxlbmRDYXBzICA9IFdJTkVEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0RFU1RBTFBIQSAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0RFU1RDT0xPUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX09ORSAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX1NSQ0NPTE9SICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQkxFTkRDQVBTX1pFUk87CgogICAgcENhcHMtPkRlc3RCbGVuZENhcHMgPSBXSU5FRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19PTkUgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19aRVJPOwogICAgLyogTk9URTogV0lORUQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgaXMgbm90IHN1cHBvcnRlZCBhcyBkZXN0IGJsZW5kIGZhY3RvciwKICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2xCbGVuZEZ1bmMgbWFucGFnZQogICAgICoKICAgICAqIFdJTkVEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSBhbmQgV0lORUQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBIGFyZQogICAgICogbGVnYWN5IHNldHRpbmdzIGZvciBzcmNibGVuZCBvbmx5CiAgICAgKi8KCiAgICBpZiggR0xfU1VQUE9SVChFWFRfQkxFTkRfQ09MT1IpKSB7CiAgICAgICAgcENhcHMtPlNyY0JsZW5kQ2FwcyB8PSBXSU5FRDNEUEJMRU5EQ0FQU19CTEVOREZBQ1RPUjsKICAgICAgICBwQ2Fwcy0+RGVzdEJsZW5kQ2FwcyB8PSBXSU5FRDNEUEJMRU5EQ0FQU19CTEVOREZBQ1RPUjsKICAgIH0KCgogICAgcENhcHMtPkFscGhhQ21wQ2FwcyA9IFdJTkVEM0RQQ01QQ0FQU19BTFdBWVMgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19FUVVBTCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19HUkVBVEVSICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19MRVNTICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19MRVNTRVFVQUwgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19ORVZFUiAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19OT1RFUVVBTDsKCiAgICBwQ2Fwcy0+U2hhZGVDYXBzICAgICA9IFdJTkVEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRFJHQiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0FMUEhBRkxBVEJMRU5EICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0NPTE9SRkxBVFJHQiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0ZPR0ZMQVQgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQU0hBREVDQVBTX1NQRUNVTEFSRkxBVFJHQjsKCiAgICBwQ2Fwcy0+VGV4dHVyZUNhcHMgPSAgV0lORUQzRFBURVhUVVJFQ0FQU19BTFBIQSAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEVYVFVSRUNBUFNfQUxQSEFQQUxFVFRFICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX0JPUkRFUiAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19NSVBNQVAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEVYVFVSRUNBUFNfUFJPSkVDVEVEICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFOwoKICAgIGlmKCAhR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9OT05fUE9XRVJfT0ZfVFdPKSkgewogICAgICAgIHBDYXBzLT5UZXh0dXJlQ2FwcyB8PSBXSU5FRDNEUFRFWFRVUkVDQVBTX1BPVzIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTDsKICAgIH0KCiAgICBpZiggR0xfU1VQUE9SVChFWFRfVEVYVFVSRTNEKSkgewogICAgICAgIHBDYXBzLT5UZXh0dXJlQ2FwcyB8PSAgV0lORUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQX1BPVzI7CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfQ1VCRV9NQVApKSB7CiAgICAgICAgcENhcHMtPlRleHR1cmVDYXBzIHw9IFdJTkVEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX01JUENVQkVNQVAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMjsKCiAgICB9CgogICAgcENhcHMtPlRleHR1cmVGaWx0ZXJDYXBzID0gV0lORUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVIgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTElORUFSICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUE5FQVJFU1QgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBMSU5FQVIgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQTkVBUkVTVCAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX05FQVJFU1Q7CgogICAgaWYgKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDKSkgewogICAgICAgIHBDYXBzLT5UZXh0dXJlRmlsdGVyQ2FwcyB8PSBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDOwogICAgfQoKICAgIGlmIChHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgIHBDYXBzLT5DdWJlVGV4dHVyZUZpbHRlckNhcHMgPSBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUiAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUExJTkVBUiAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUE5FQVJFU1QgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUExJTkVBUiAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUE5FQVJFU1QgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX05FQVJFU1Q7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKEVYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQykpIHsKICAgICAgICAgICAgcENhcHMtPkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyB8PSBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUM7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICAgICAgcENhcHMtPkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9IDA7CgogICAgaWYgKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkUzRCkpIHsKICAgICAgICBwQ2Fwcy0+Vm9sdW1lVGV4dHVyZUZpbHRlckNhcHMgPSBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUiAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTElORUFSICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBORUFSRVNUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUExJTkVBUiAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQTkVBUkVTVCAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19ORUFSRVNUOwogICAgfSBlbHNlCiAgICAgICAgcENhcHMtPlZvbHVtZVRleHR1cmVGaWx0ZXJDYXBzID0gMDsKCiAgICBwQ2Fwcy0+VGV4dHVyZUFkZHJlc3NDYXBzID0gIFdJTkVEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRBRERSRVNTQ0FQU19DTEFNUCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRBRERSRVNTQ0FQU19XUkFQOwoKICAgIGlmIChHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0JPUkRFUl9DTEFNUCkpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUFkZHJlc3NDYXBzIHw9IFdJTkVEM0RQVEFERFJFU1NDQVBTX0JPUkRFUjsKICAgIH0KICAgIGlmIChHTF9TVVBQT1JUKEFSQl9URVhUVVJFX01JUlJPUkVEX1JFUEVBVCkpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUFkZHJlc3NDYXBzIHw9IFdJTkVEM0RQVEFERFJFU1NDQVBTX01JUlJPUjsKICAgIH0KICAgIGlmIChHTF9TVVBQT1JUKEFUSV9URVhUVVJFX01JUlJPUl9PTkNFKSkgewogICAgICAgIHBDYXBzLT5UZXh0dXJlQWRkcmVzc0NhcHMgfD0gV0lORUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRTsKICAgIH0KCiAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRTNEKSkgewogICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgPSAgV0lORUQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVViB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRBRERSRVNTQ0FQU19DTEFNUCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBUQUREUkVTU0NBUFNfV1JBUDsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9CT1JERVJfQ0xBTVApKSB7CiAgICAgICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgfD0gV0lORUQzRFBUQUREUkVTU0NBUFNfQk9SREVSOwogICAgICAgIH0KICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9NSVJST1JFRF9SRVBFQVQpKSB7CiAgICAgICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgfD0gV0lORUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SOwogICAgICAgIH0KICAgICAgICBpZiAoR0xfU1VQUE9SVChBVElfVEVYVFVSRV9NSVJST1JfT05DRSkpIHsKICAgICAgICAgICAgcENhcHMtPlZvbHVtZVRleHR1cmVBZGRyZXNzQ2FwcyB8PSBXSU5FRDNEUFRBRERSRVNTQ0FQU19NSVJST1JPTkNFOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgPSAwOwoKICAgIHBDYXBzLT5MaW5lQ2FwcyA9IFdJTkVEM0RMSU5FQ0FQU19URVhUVVJFIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RMSU5FQ0FQU19aVEVTVDsKICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBBZGQKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRExJTkVDQVBTX0JMRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RMSU5FQ0FQU19BTFBIQUNNUAogICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNETElORUNBUFNfRk9HICovCgogICAgcENhcHMtPk1heFRleHR1cmVXaWR0aCAgPSBHTF9MSU1JVFModGV4dHVyZV9zaXplKTsKICAgIHBDYXBzLT5NYXhUZXh0dXJlSGVpZ2h0ID0gR0xfTElNSVRTKHRleHR1cmVfc2l6ZSk7CgogICAgaWYoR0xfU1VQUE9SVChFWFRfVEVYVFVSRTNEKSkKICAgICAgICBwQ2Fwcy0+TWF4Vm9sdW1lRXh0ZW50ID0gR0xfTElNSVRTKHRleHR1cmUzZF9zaXplKTsKICAgIGVsc2UKICAgICAgICBwQ2Fwcy0+TWF4Vm9sdW1lRXh0ZW50ID0gMDsKCiAgICBwQ2Fwcy0+TWF4VGV4dHVyZVJlcGVhdCA9IDMyNzY4OwogICAgcENhcHMtPk1heFRleHR1cmVBc3BlY3RSYXRpbyA9IEdMX0xJTUlUUyh0ZXh0dXJlX3NpemUpOwogICAgcENhcHMtPk1heFZlcnRleFcgPSAxLjA7CgogICAgcENhcHMtPkd1YXJkQmFuZExlZnQgPSAwOwogICAgcENhcHMtPkd1YXJkQmFuZFRvcCA9IDA7CiAgICBwQ2Fwcy0+R3VhcmRCYW5kUmlnaHQgPSAwOwogICAgcENhcHMtPkd1YXJkQmFuZEJvdHRvbSA9IDA7CgogICAgcENhcHMtPkV4dGVudHNBZGp1c3QgPSAwOwoKICAgIHBDYXBzLT5TdGVuY2lsQ2FwcyA9ICBXSU5FRDNEU1RFTkNJTENBUFNfREVDUlNBVCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTVEVOQ0lMQ0FQU19JTlZFUlQgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU1RFTkNJTENBUFNfS0VFUCAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNURU5DSUxDQVBTX1JFUExBQ0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTVEVOQ0lMQ0FQU19aRVJPOwogICAgaWYgKEdMX1NVUFBPUlQoRVhUX1NURU5DSUxfV1JBUCkpIHsKICAgICAgICBwQ2Fwcy0+U3RlbmNpbENhcHMgfD0gV0lORUQzRFNURU5DSUxDQVBTX0RFQ1IgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNURU5DSUxDQVBTX0lOQ1I7CiAgICB9CiAgICBpZiAoIFRoaXMtPmR4VmVyc2lvbiA+IDggJiYKICAgICAgICAoIEdMX1NVUFBPUlQoRVhUX1NURU5DSUxfVFdPX1NJREUpIHx8CiAgICAgICAgICAgIEdMX1NVUFBPUlQoQVRJX1NFUEFSQVRFX1NURU5DSUwpICkgKSB7CiAgICAgICAgcENhcHMtPlN0ZW5jaWxDYXBzIHw9IFdJTkVEM0RTVEVOQ0lMQ0FQU19UV09TSURFRDsKICAgIH0KCiAgICBwQ2Fwcy0+RlZGQ2FwcyA9IFdJTkVEM0RGVkZDQVBTX1BTSVpFIHwgMHgwMDA4OyAvKiA4IHRleHR1cmUgY29vcmRzICovCgogICAgcENhcHMtPk1heFVzZXJDbGlwUGxhbmVzICAgICAgID0gR0xfTElNSVRTKGNsaXBwbGFuZXMpOwogICAgcENhcHMtPk1heEFjdGl2ZUxpZ2h0cyAgICAgICAgID0gR0xfTElNSVRTKGxpZ2h0cyk7CgogICAgcENhcHMtPk1heFZlcnRleEJsZW5kTWF0cmljZXMgICAgICA9IEdMX0xJTUlUUyhibGVuZHMpOwogICAgcENhcHMtPk1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggICA9IDA7CgogICAgcENhcHMtPk1heEFuaXNvdHJvcHkgICA9IEdMX0xJTUlUUyhhbmlzb3Ryb3B5KTsKICAgIHBDYXBzLT5NYXhQb2ludFNpemUgICAgPSBHTF9MSU1JVFMocG9pbnRzaXplKTsKCgogICAgcENhcHMtPlZlcnRleFByb2Nlc3NpbmdDYXBzID0gV0lORUQzRFZUWFBDQVBTX0RJUkVDVElPTkFMTElHSFRTIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFZUWFBDQVBTX0xPQ0FMVklFV0VSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RWVFhQQ0FQU19WRVJURVhGT0cgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVlRYUENBUFNfVEVYR0VOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IEFkZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZUWFBDQVBTX1RXRUVOSU5HLCBEM0RWVFhQQ0FQU19URVhHRU5fU1BIRVJFTUFQICovCgogICAgcENhcHMtPk1heFByaW1pdGl2ZUNvdW50ICAgPSAweEZGRkZGOyAvKiBGb3Igbm93IHNldCAyXjIwLTEgd2hpY2ggaXMgdXNlZCBieSBtb3N0ID49R2Vmb3JjZTMvUmFkZW9uODUwMCBjYXJkcyAqLwogICAgcENhcHMtPk1heFZlcnRleEluZGV4ICAgICAgPSAweEZGRkZGOwogICAgcENhcHMtPk1heFN0cmVhbXMgICAgICAgICAgPSBNQVhfU1RSRUFNUzsKICAgIHBDYXBzLT5NYXhTdHJlYW1TdHJpZGUgICAgID0gMTAyNDsKCiAgICAvKiBkM2Q5LmRsbCBzZXRzIEQzRERFVkNBUFMyX0NBTl9TVFJFVENIUkVDVF9GUk9NX1RFWFRVUkVTIGhlcmUgYmVjYXVzZSBTdHJldGNoUmVjdHMgaXMgaW1wbGVtZW50ZWQgaW4gZDNkOSAqLwogICAgcENhcHMtPkRldkNhcHMyICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdJTkVEM0RERVZDQVBTMl9TVFJFQU1PRkZTRVQ7CiAgICAvKiBUT0RPOiBWUzMuMCBuZWVkcyBhdCBsZWFzdCBEM0RERVZDQVBTMl9WRVJURVhFTEVNRU5UU0NBTlNIQVJFU1RSRUFNT0ZGU0VUICovCiAgICBwQ2Fwcy0+TWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgICAgICAgID0gMDsKICAgIHBDYXBzLT5NYXN0ZXJBZGFwdGVyT3JkaW5hbCAgICAgICAgICAgICAgPSAwOwogICAgcENhcHMtPkFkYXB0ZXJPcmRpbmFsSW5Hcm91cCAgICAgICAgICAgICA9IDA7CiAgICBwQ2Fwcy0+TnVtYmVyT2ZBZGFwdGVyc0luR3JvdXAgICAgICAgICAgID0gMTsKCiAgICBwQ2Fwcy0+TnVtU2ltdWx0YW5lb3VzUlRzID0gR0xfTElNSVRTKGJ1ZmZlcnMpOwoKICAgIHBDYXBzLT5TdHJldGNoUmVjdEZpbHRlckNhcHMgICAgICAgICAgICAgPSBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVI7CiAgICBwQ2Fwcy0+VmVydGV4VGV4dHVyZUZpbHRlckNhcHMgICAgICAgICAgID0gMDsKCiAgICBtZW1zZXQoJnNoYWRlcl9jYXBzLCAwLCBzaXplb2Yoc2hhZGVyX2NhcHMpKTsKICAgIHNoYWRlcl9iYWNrZW5kID0gc2VsZWN0X3NoYWRlcl9iYWNrZW5kKEFkYXB0ZXIsIERldmljZVR5cGUpOwogICAgc2hhZGVyX2JhY2tlbmQtPnNoYWRlcl9nZXRfY2FwcyhEZXZpY2VUeXBlLCAmR0xJTkZPX0xPQ0FUSU9OLCAmc2hhZGVyX2NhcHMpOwoKICAgIC8qIEFkZCBzaGFkZXIgbWlzYyBjYXBzLiBPbmx5IHNvbWUgb2YgdGhlbSBiZWxvbmcgdG8gdGhlIHNoYWRlciBwYXJ0cyBvZiB0aGUgcGlwZWxpbmUgKi8KICAgIHBDYXBzLT5QcmltaXRpdmVNaXNjQ2FwcyB8PSBzaGFkZXJfY2Fwcy5QcmltaXRpdmVNaXNjQ2FwczsKCiAgICAvKiBUaGlzIHRha2VzIGNhcmUgZm9yIGRpc2FibGluZyB2ZXJ0ZXggc2hhZGVyIG9yIHBpeGVsIHNoYWRlciBjYXBzIHdoaWxlIGxlYXZpbmcgdGhlIG90aGVyIG9uZSBlbmFibGVkLgogICAgICogSWdub3JlIHNoYWRlciBtb2RlbCBjYXBhYmlsaXRpZXMgaWYgZGlzYWJsZWQgaW4gY29uZmlnCiAgICAgKi8KICAgIGlmKHZzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX05PTkUpIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJWZXJ0ZXggc2hhZGVyIGRpc2FibGVkIGluIGNvbmZpZywgcmVwb3J0aW5nIHZlcnNpb24gMC4wXG4iKTsKICAgICAgICBwQ2Fwcy0+VmVydGV4U2hhZGVyVmVyc2lvbiAgICAgICAgICA9IFdJTkVEM0RWU19WRVJTSU9OKDAsMCk7CiAgICAgICAgcENhcHMtPk1heFZlcnRleFNoYWRlckNvbnN0ICAgICAgICAgPSAwOwogICAgfSBlbHNlIHsKICAgICAgICBwQ2Fwcy0+VmVydGV4U2hhZGVyVmVyc2lvbiAgICAgICAgICA9IHNoYWRlcl9jYXBzLlZlcnRleFNoYWRlclZlcnNpb247CiAgICAgICAgcENhcHMtPk1heFZlcnRleFNoYWRlckNvbnN0ICAgICAgICAgPSBzaGFkZXJfY2Fwcy5NYXhWZXJ0ZXhTaGFkZXJDb25zdDsKICAgIH0KCiAgICBpZihwc19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9OT05FKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiUGl4ZWwgc2hhZGVyIGRpc2FibGVkIGluIGNvbmZpZywgcmVwb3J0aW5nIHZlcnNpb24gMC4wXG4iKTsKICAgICAgICBwQ2Fwcy0+UGl4ZWxTaGFkZXJWZXJzaW9uICAgICAgICAgICA9IFdJTkVEM0RQU19WRVJTSU9OKDAsMCk7CiAgICAgICAgcENhcHMtPlBpeGVsU2hhZGVyMXhNYXhWYWx1ZSAgICAgICAgPSAwLjA7CiAgICB9IGVsc2UgewogICAgICAgIHBDYXBzLT5QaXhlbFNoYWRlclZlcnNpb24gICAgICAgICAgID0gc2hhZGVyX2NhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uOwogICAgICAgIHBDYXBzLT5QaXhlbFNoYWRlcjF4TWF4VmFsdWUgICAgICAgID0gc2hhZGVyX2NhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlOwogICAgfQoKICAgIHBDYXBzLT5UZXh0dXJlT3BDYXBzICAgICAgICAgICAgICAgICAgICA9IHNoYWRlcl9jYXBzLlRleHR1cmVPcENhcHM7CiAgICBwQ2Fwcy0+TWF4VGV4dHVyZUJsZW5kU3RhZ2VzICAgICAgICAgICAgPSBzaGFkZXJfY2Fwcy5NYXhUZXh0dXJlQmxlbmRTdGFnZXM7CiAgICBwQ2Fwcy0+TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgICAgICAgICAgPSBzaGFkZXJfY2Fwcy5NYXhTaW11bHRhbmVvdXNUZXh0dXJlczsKICAgIHBDYXBzLT5WUzIwQ2FwcyAgICAgICAgICAgICAgICAgICAgICAgICA9IHNoYWRlcl9jYXBzLlZTMjBDYXBzOwogICAgcENhcHMtPk1heFZTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCAgID0gc2hhZGVyX2NhcHMuTWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkOwogICAgcENhcHMtPk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cz0gc2hhZGVyX2NhcHMuTWF4VmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzOwogICAgcENhcHMtPlBTMjBDYXBzICAgICAgICAgICAgICAgICAgICAgICAgID0gc2hhZGVyX2NhcHMuUFMyMENhcHM7CiAgICBwQ2Fwcy0+TWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgPSBzaGFkZXJfY2Fwcy5NYXhQU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQ7CiAgICBwQ2Fwcy0+TWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBzaGFkZXJfY2Fwcy5NYXhQaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90czsKCiAgICAvKiBUaGUgZm9sbG93aW5nIGNhcHMgYXJlIHNoYWRlciBzcGVjaWZpYywgYnV0IHRoZXkgYXJlIHRoaW5ncyB3ZSBjYW5ub3QgZGV0ZWN0LCBvciB3aGljaAogICAgICogYXJlIHRoZSBzYW1lIGFtb25nIGFsbCBzaGFkZXIgbW9kZWxzLiBTbyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uIHNldCB0aGUgc2hhZGVyIHZlcnNpb24KICAgICAqIHNwZWNpZmljLCBidXQgb3RoZXJ3aXNlIGNvbnN0YW50IGNhcHMgaGVyZQogICAgICovCiAgICBpZihwQ2Fwcy0+VmVydGV4U2hhZGVyVmVyc2lvbiA9PSBXSU5FRDNEVlNfVkVSU0lPTigzLDApKSB7CiAgICAgICAgLyogV2hlcmUgcG9zc2libGUgc2V0IHRoZSBjYXBzIGJhc2VkIG9uIE9wZW5HTCBleHRlbnNpb25zIGFuZCBpZiB0aGV5IGFyZW4ndCBzZXQgKGluIGNhc2Ugb2Ygc29mdHdhcmUgcmVuZGVyaW5nKQogICAgICAgIHVzZSB0aGUgVlMgMy4wIGZyb20gTVNETiBvciBlbHNlIGlmIHRoZXJlJ3MgT3BlbkdMIHNwZWMgdXNlIGEgaGFyZGNvZGVkIHZhbHVlIG1pbmltdW0gVlMzLjAgdmFsdWUuICovCiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkNhcHMgICAgICAgICAgICAgICAgICAgICA9IFdJTkVEM0RWUzIwQ0FQU19QUkVESUNBVElPTjsKICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggID0gV0lORUQzRFZTMjBfTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOyAvKiBWUyAzLjAgcmVxdWlyZXMgTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIICgyNCkgKi8KICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuTnVtVGVtcHMgICAgICAgICAgICAgICAgID0gbWF4KDMyLCBHTElORk9fTE9DQVRJT04udnNfYXJiX21heF90ZW1wcyk7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLlN0YXRpY0Zsb3dDb250cm9sRGVwdGggICA9IFdJTkVEM0RWUzIwX01BWF9TVEFUSUNGTE9XQ09OVFJPTERFUFRIIDsgLyogbGV2ZWwgb2YgbmVzdGluZyBpbiBsb29wcyAvIGlmLXN0YXRlbWVudHM7IFZTIDMuMCByZXF1aXJlcyBNQVggKDQpICovCgogICAgICAgIHBDYXBzLT5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgICAgPSA2NTUzNTsgLyogVlMgMy4wIG5lZWRzIGF0IGxlYXN0IDY1NTM1LCBzb21lIGNhcmRzIGV2ZW4gdXNlIDJeMzItMSAqLwogICAgICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBtYXgoNTEyLCBHTElORk9fTE9DQVRJT04udnNfYXJiX21heF9pbnN0cnVjdGlvbnMpOwogICAgfSBlbHNlIGlmKHBDYXBzLT5WZXJ0ZXhTaGFkZXJWZXJzaW9uID09IFdJTkVEM0RWU19WRVJTSU9OKDIsMCkpIHsKICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuQ2FwcyAgICAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggID0gV0lORUQzRFZTMjBfTUlOX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5OdW1UZW1wcyAgICAgICAgICAgICAgICAgPSBtYXgoMTIsIEdMSU5GT19MT0NBVElPTi52c19hcmJfbWF4X3RlbXBzKTsKICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCAgID0gMTsKCiAgICAgICAgcENhcHMtPk1heFZTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCAgICA9IDY1NTM1OwogICAgICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAwOwogICAgfSBlbHNlIHsgLyogVlMgMS54ICovCiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkNhcHMgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoICA9IDA7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLk51bVRlbXBzICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLlN0YXRpY0Zsb3dDb250cm9sRGVwdGggICA9IDA7CgogICAgICAgIHBDYXBzLT5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgICAgPSAwOwogICAgICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAwOwogICAgfQoKICAgIGlmKHBDYXBzLT5QaXhlbFNoYWRlclZlcnNpb24gPT0gV0lORUQzRFBTX1ZFUlNJT04oMywwKSkgewogICAgICAgIC8qIFdoZXJlIHBvc3NpYmxlIHNldCB0aGUgY2FwcyBiYXNlZCBvbiBPcGVuR0wgZXh0ZW5zaW9ucyBhbmQgaWYgdGhleSBhcmVuJ3Qgc2V0IChpbiBjYXNlIG9mIHNvZnR3YXJlIHJlbmRlcmluZykKICAgICAgICB1c2UgdGhlIFBTIDMuMCBmcm9tIE1TRE4gb3IgZWxzZSBpZiB0aGVyZSdzIE9wZW5HTCBzcGVjIHVzZSBhIGhhcmRjb2RlZCB2YWx1ZSBtaW5pbXVtIFBTIDMuMCB2YWx1ZS4gKi8KCiAgICAgICAgLyogQ2FwcyBpcyBtb3JlIG9yIGxlc3MgdW5kb2N1bWVudGVkIG9uIE1TRE4gYnV0IGl0IGFwcGVhcnMgdG8gYmUgdXNlZCBmb3IgUFMyMENhcHMgYmFzZWQgb24gcmVzdWx0cyBmcm9tIFI5NjAwL0ZYNTkwMC9HZWZvcmNlNjgwMCBjYXJkcyBmcm9tIFdpbmRvd3MgKi8KICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuQ2FwcyAgICAgICAgICAgICAgICAgICAgID0gV0lORUQzRFBTMjBDQVBTX0FSQklUUkFSWVNXSVpaTEUgICAgIHwKICAgICAgICAgICAgICAgIFdJTkVEM0RQUzIwQ0FQU19HUkFESUVOVElOU1RSVUNUSU9OUyB8CiAgICAgICAgICAgICAgICBXSU5FRDNEUFMyMENBUFNfUFJFRElDQVRJT04gICAgICAgICAgfAogICAgICAgICAgICAgICAgV0lORUQzRFBTMjBDQVBTX05PREVQRU5ERU5UUkVBRExJTUlUIHwKICAgICAgICAgICAgICAgIFdJTkVEM0RQUzIwQ0FQU19OT1RFWElOU1RSVUNUSU9OTElNSVQ7CiAgICAgICAgcENhcHMtPlBTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoICA9IFdJTkVEM0RQUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsgLyogUFMgMy4wIHJlcXVpcmVzIE1BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSCAoMjQpICovCiAgICAgICAgcENhcHMtPlBTMjBDYXBzLk51bVRlbXBzICAgICAgICAgICAgICAgICA9IG1heCgzMiwgR0xJTkZPX0xPQ0FUSU9OLnBzX2FyYl9tYXhfdGVtcHMpOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoICAgPSBXSU5FRDNEUFMyMF9NQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSDsgLyogUFMgMy4wIHJlcXVpcmVzIE1BWF9TVEFUSUNGTE9XQ09OVFJPTERFUFRIICg0KSAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1JbnN0cnVjdGlvblNsb3RzICAgICAgPSBXSU5FRDNEUFMyMF9NQVhfTlVNSU5TVFJVQ1RJT05TTE9UUzsgLyogUFMgMy4wIHJlcXVpcmVzIE1BWF9OVU1JTlNUUlVDVElPTlNMT1RTICg1MTIpICovCgogICAgICAgIHBDYXBzLT5NYXhQU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgICAgPSA2NTUzNTsKICAgICAgICBwQ2Fwcy0+TWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgID0gbWF4KFdJTkVEM0RNSU4zMFNIQURFUklOU1RSVUNUSU9OUywgR0xJTkZPX0xPQ0FUSU9OLnBzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zKTsKICAgIH0gZWxzZSBpZihwQ2Fwcy0+UGl4ZWxTaGFkZXJWZXJzaW9uID09IFdJTkVEM0RQU19WRVJTSU9OKDIsMCkpIHsKICAgICAgICAvKiBCZWxvdyB3ZSBhc3N1bWUgUFMyLjAgc3BlY3MsIG5vdCBleHRlbmRlZCAyLjBhKEdlZm9yY2VGWCkvMi4wYihSYWRlb24gUjN4eCkgb25lcyAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5DYXBzICAgICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCAgPSAwOyAvKiBXSU5FRDNEVlMyMF9NSU5fRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEggPSAwICovCiAgICAgICAgcENhcHMtPlBTMjBDYXBzLk51bVRlbXBzICAgICAgICAgICAgICAgICA9IG1heCgxMiwgR0xJTkZPX0xPQ0FUSU9OLnBzX2FyYl9tYXhfdGVtcHMpOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoICAgPSBXSU5FRDNEUFMyMF9NSU5fU1RBVElDRkxPV0NPTlRST0xERVBUSDsgLyogTWluaW11bTogMSAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1JbnN0cnVjdGlvblNsb3RzICAgICAgPSBXSU5FRDNEUFMyMF9NSU5fTlVNSU5TVFJVQ1RJT05TTE9UUzsgLyogTWluaW11bSBudW1iZXIgKDY0IEFMVSArIDMyIFRleHR1cmUpLCBhIEdlZm9yY2VGWCB1c2VzIDUxMiAqLwoKICAgICAgICBwQ2Fwcy0+TWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgID0gNTEyOyAvKiBNaW5pbXVtIHZhbHVlLCBhIEdlZm9yY2VGWCB1c2VzIDEwMjQgKi8KICAgICAgICBwQ2Fwcy0+TWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgID0gMDsKICAgIH0gZWxzZSB7IC8qIFBTIDEueCAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5DYXBzICAgICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCAgPSAwOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1UZW1wcyAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoICAgPSAwOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1JbnN0cnVjdGlvblNsb3RzICAgICAgPSAwOwoKICAgICAgICBwQ2Fwcy0+TWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgID0gMDsKICAgICAgICBwQ2Fwcy0+TWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgID0gMDsKICAgIH0KCiAgICBpZihwQ2Fwcy0+VmVydGV4U2hhZGVyVmVyc2lvbiA+PSBXSU5FRDNEVlNfVkVSU0lPTigyLDApKSB7CiAgICAgICAgLyogT3BlbkdMIHN1cHBvcnRzIGFsbCB0aGUgZm9ybWF0cyBiZWxvdywgcGVyaGFwcyBub3QgYWx3YXlzCiAgICAgICAgICogd2l0aG91dCBjb252ZXJzaW9uLCBidXQgaXQgc3VwcG9ydHMgdGhlbS4KICAgICAgICAgKiBGdXJ0aGVyIEdMU0wgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW4gb2ZmaWNpYWwgdW5zaWduZWQgdHlwZSBzbwogICAgICAgICAqIGRvbid0IGFkdmVydGlzZSBpdCB5ZXQgYXMgSSdtIG5vdCBzdXJlIGhvdyB3ZSBoYW5kbGUgaXQuCiAgICAgICAgICogV2UgbWlnaHQgbmVlZCB0byBhZGQgc29tZSBjbGFtcGluZyBpbiB0aGUgc2hhZGVyIGVuZ2luZSB0bwogICAgICAgICAqIHN1cHBvcnQgaXQuCiAgICAgICAgICogVE9ETzogV0lORUQzRERUQ0FQU19VU0hPUlQyTiwgV0lORUQzRERUQ0FQU19VU0hPUlQ0TiwgV0lORUQzRERUQ0FQU19VREVDMywgV0lORUQzRERUQ0FQU19ERUMzTiAqLwogICAgICAgIHBDYXBzLT5EZWNsVHlwZXMgPSBXSU5FRDNERFRDQVBTX1VCWVRFNCAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0REVENBUFNfVUJZVEU0TiAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERUQ0FQU19TSE9SVDJOICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERFRDQVBTX1NIT1JUNE47CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoTlZfSEFMRl9GTE9BVCkpIHsKICAgICAgICAgICAgcENhcHMtPkRlY2xUeXBlcyB8PSBXSU5FRDNERFRDQVBTX0ZMT0FUMTZfMiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERUQ0FQU19GTE9BVDE2XzQ7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICAgICAgcENhcHMtPkRlY2xUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCi8qIE5vdGUgZHVlIHRvIHN0cnVjdHVyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGR4OCBhbmQgZHg5IEQzRFBSRVNFTlRfUEFSQU1FVEVSUywKICAgYW5kIGZpZWxkcyBiZWluZyBpbnNlcnRlZCBpbiB0aGUgbWlkZGxlLCBhIG5ldyBzdHJ1Y3R1cmUgaXMgdXNlZCBpbiBwbGFjZSAgICAqLwpzdGF0aWMgSFJFU1VMVCAgV0lOQVBJIElXaW5lRDNESW1wbF9DcmVhdGVEZXZpY2UoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RERVZUWVBFIERldmljZVR5cGUsIEhXTkQgaEZvY3VzV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQmVoYXZpb3VyRmxhZ3MsIElXaW5lRDNERGV2aWNlKiogcHBSZXR1cm5lZERldmljZUludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpwYXJlbnQpIHsKCiAgICBJV2luZUQzRERldmljZUltcGwgKm9iamVjdCAgPSBOVUxMOwogICAgSVdpbmVEM0RJbXBsICAgICAgICpUaGlzICAgID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgV0lORUQzRERJU1BMQVlNT0RFICBtb2RlOwogICAgaW50IGk7CgogICAgLyogVmFsaWRhdGUgdGhlIGFkYXB0ZXIgbnVtYmVyLiBJZiBubyBhZGFwdGVycyBhcmUgYXZhaWxhYmxlKG5vIEdMKSwgaWdub3JlIHRoZSBhZGFwdGVyCiAgICAgKiBudW1iZXIgYW5kIGNyZWF0ZSBhIGRldmljZSB3aXRob3V0IGEgM0QgYWRhcHRlciBmb3IgMkQgb25seSBvcGVyYXRpb24uCiAgICAgKi8KICAgIGlmIChJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpICYmIEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgIC8qIENyZWF0ZSBhIFdpbmVEM0REZXZpY2Ugb2JqZWN0ICovCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElXaW5lRDNERGV2aWNlSW1wbCkpOwogICAgKnBwUmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAoSVdpbmVEM0REZXZpY2UgKilvYmplY3Q7CiAgICBUUkFDRSgiQ3JlYXRlZCBXaW5lRDNERGV2aWNlIG9iamVjdCBAICVwXG4iLCBvYmplY3QpOwogICAgaWYgKE5VTEwgPT0gb2JqZWN0KSB7CiAgICAgIHJldHVybiBXSU5FRDNERVJSX09VVE9GVklERU9NRU1PUlk7CiAgICB9CgogICAgLyogU2V0IHVwIGluaXRpYWwgQ09NIGluZm9ybWF0aW9uICovCiAgICBvYmplY3QtPmxwVnRibCAgPSAmSVdpbmVEM0REZXZpY2VfVnRibDsKICAgIG9iamVjdC0+cmVmICAgICA9IDE7CiAgICBvYmplY3QtPndpbmVEM0QgPSBpZmFjZTsKICAgIG9iamVjdC0+YWRhcHRlciA9IG51bUFkYXB0ZXJzID8gJkFkYXB0ZXJzW0FkYXB0ZXJdIDogTlVMTDsKICAgIElXaW5lRDNEX0FkZFJlZihvYmplY3QtPndpbmVEM0QpOwogICAgb2JqZWN0LT5wYXJlbnQgID0gcGFyZW50OwogICAgbGlzdF9pbml0KCZvYmplY3QtPnJlc291cmNlcyk7CiAgICBsaXN0X2luaXQoJm9iamVjdC0+c2hhZGVycyk7CgogICAgaWYoVGhpcy0+ZHhWZXJzaW9uID09IDcpIHsKICAgICAgICBvYmplY3QtPnN1cmZhY2VfYWxpZ25tZW50ID0gODsKICAgIH0gZWxzZSB7CiAgICAgICAgb2JqZWN0LT5zdXJmYWNlX2FsaWdubWVudCA9IDQ7CiAgICB9CiAgICBvYmplY3QtPnBvc0ZpeHVwWzBdID0gMS4wOyAvKiBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGhlIHggY29vcmQgdW5tb2RpZmllZCB0aHJvdWdoIGEgTUFEICovCgogICAgLyogU2V0IHRoZSBzdGF0ZSB1cCBhcyBpbnZhbGlkIHVudGlsIHRoZSBkZXZpY2UgaXMgZnVsbHkgY3JlYXRlZCAqLwogICAgb2JqZWN0LT5zdGF0ZSAgID0gV0lORUQzREVSUl9EUklWRVJJTlRFUk5BTEVSUk9SOwoKICAgIFRSQUNFKCIoJXApLT4oQWRwdHI6JWQsIERldlR5cGU6ICV4LCBGb2N1c0h3bmQ6ICVwLCBCZWhGbGFnczogJXgsIFJldERldkludDogJXApXG4iLCBUaGlzLCBBZGFwdGVyLCBEZXZpY2VUeXBlLAogICAgICAgICAgaEZvY3VzV2luZG93LCBCZWhhdmlvdXJGbGFncywgcHBSZXR1cm5lZERldmljZUludGVyZmFjZSk7CgogICAgLyogU2F2ZSB0aGUgY3JlYXRpb24gcGFyYW1ldGVycyAqLwogICAgb2JqZWN0LT5jcmVhdGVQYXJtcy5BZGFwdGVyT3JkaW5hbCA9IEFkYXB0ZXI7CiAgICBvYmplY3QtPmNyZWF0ZVBhcm1zLkRldmljZVR5cGUgICAgID0gRGV2aWNlVHlwZTsKICAgIG9iamVjdC0+Y3JlYXRlUGFybXMuaEZvY3VzV2luZG93ICAgPSBoRm9jdXNXaW5kb3c7CiAgICBvYmplY3QtPmNyZWF0ZVBhcm1zLkJlaGF2aW9yRmxhZ3MgID0gQmVoYXZpb3VyRmxhZ3M7CgogICAgLyogSW5pdGlhbGl6ZSBvdGhlciB1c2VmdWwgdmFsdWVzICovCiAgICBvYmplY3QtPmFkYXB0ZXJObyAgICAgICAgICAgICAgICAgICAgPSBBZGFwdGVyOwogICAgb2JqZWN0LT5kZXZUeXBlICAgICAgICAgICAgICAgICAgICAgID0gRGV2aWNlVHlwZTsKCiAgICBzZWxlY3Rfc2hhZGVyX21vZGUoJkdMSU5GT19MT0NBVElPTiwgRGV2aWNlVHlwZSwgJm9iamVjdC0+cHNfc2VsZWN0ZWRfbW9kZSwgJm9iamVjdC0+dnNfc2VsZWN0ZWRfbW9kZSk7CiAgICBvYmplY3QtPnNoYWRlcl9iYWNrZW5kID0gc2VsZWN0X3NoYWRlcl9iYWNrZW5kKEFkYXB0ZXIsIERldmljZVR5cGUpOwoKICAgIGNvbXBpbGVfc3RhdGVfdGFibGUob2JqZWN0LT5TdGF0ZVRhYmxlLCBvYmplY3QtPm11bHRpc3RhdGVfZnVuY3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGZmcF92ZXJ0ZXhzdGF0ZV90ZW1wbGF0ZSwgTlVMTCwgbWlzY19zdGF0ZV90ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LT5zaGFkZXJfYmFja2VuZC0+U3RhdGVUYWJsZV9yZW1vdmUpOwoKICAgIC8qIFByZWZlciB0aGUgdnRhYmxlIHdpdGggZnVuY3Rpb25zIG9wdGltaXplZCBmb3Igc2luZ2xlIGRpcnRpZnlhYmxlIG9iamVjdHMgaWYgdGhlIHNoYWRlcgogICAgICogbW9kZWwgY2FuIGRlYWwgd2l0aCB0aGF0LiBJdCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSwganVzdCB3aXRoIGFkanVzdGVkCiAgICAgKiBTZXQqU2hhZGVyQ29uc3RhbnRGIGltcGxlbWVudGF0aW9ucwogICAgICovCiAgICBpZihvYmplY3QtPnNoYWRlcl9iYWNrZW5kLT5zaGFkZXJfZGlydGlmeWFibGVfY29uc3RhbnRzKChJV2luZUQzRERldmljZSAqKSBvYmplY3QpKSB7CiAgICAgICAgb2JqZWN0LT5scFZ0YmwgID0gJklXaW5lRDNERGV2aWNlX0RpcnR5Q29uc3RfVnRibDsKICAgIH0KCiAgICAvKiBzZXQgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UgdG8gdmFsaWQgKi8KICAgIG9iamVjdC0+c3RhdGUgPSBXSU5FRDNEX09LOwoKICAgIC8qIEdldCB0aGUgaW5pdGlhbCBzY3JlZW4gc2V0dXAgZm9yIGRkcmF3ICovCiAgICBJV2luZUQzREltcGxfR2V0QWRhcHRlckRpc3BsYXlNb2RlKGlmYWNlLCBBZGFwdGVyLCAmbW9kZSk7CgogICAgb2JqZWN0LT5kZHJhd193aWR0aCA9IG1vZGUuV2lkdGg7CiAgICBvYmplY3QtPmRkcmF3X2hlaWdodCA9IG1vZGUuSGVpZ2h0OwogICAgb2JqZWN0LT5kZHJhd19mb3JtYXQgPSBtb2RlLkZvcm1hdDsKCiAgICBmb3IoaSA9IDA7IGkgPCBQQVRDSE1BUF9TSVpFOyBpKyspIHsKICAgICAgICBsaXN0X2luaXQoJm9iamVjdC0+cGF0Y2hlc1tpXSk7CiAgICB9CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQojdW5kZWYgR0xJTkZPX0xPQ0FUSU9OCgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldFBhcmVudChJV2luZUQzRCAqaWZhY2UsIElVbmtub3duICoqcFBhcmVudCkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgSVVua25vd25fQWRkUmVmKFRoaXMtPnBhcmVudCk7CiAgICAqcFBhcmVudCA9IFRoaXMtPnBhcmVudDsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpVTE9ORyBXSU5BUEkgRDNEQ0JfRGVmYXVsdERlc3Ryb3lTdXJmYWNlKElXaW5lRDNEU3VyZmFjZSAqcFN1cmZhY2UpIHsKICAgIElVbmtub3duKiBzdXJmYWNlUGFyZW50OwogICAgVFJBQ0UoIiglcCkgY2FsbCBiYWNrXG4iLCBwU3VyZmFjZSk7CgogICAgLyogTm93LCByZWxlYXNlIHRoZSBwYXJlbnQsIHdoaWNoIHdpbGwgdGFrZSBjYXJlIG9mIGNsZWFuaW5nIHVwIHRoZSBzdXJmYWNlIGZvciB1cyAqLwogICAgSVdpbmVEM0RTdXJmYWNlX0dldFBhcmVudChwU3VyZmFjZSwgJnN1cmZhY2VQYXJlbnQpOwogICAgSVVua25vd25fUmVsZWFzZShzdXJmYWNlUGFyZW50KTsKICAgIHJldHVybiBJVW5rbm93bl9SZWxlYXNlKHN1cmZhY2VQYXJlbnQpOwp9CgpVTE9ORyBXSU5BUEkgRDNEQ0JfRGVmYXVsdERlc3Ryb3lWb2x1bWUoSVdpbmVEM0RWb2x1bWUgKnBWb2x1bWUpIHsKICAgIElVbmtub3duKiB2b2x1bWVQYXJlbnQ7CiAgICBUUkFDRSgiKCVwKSBjYWxsIGJhY2tcbiIsIHBWb2x1bWUpOwoKICAgIC8qIE5vdywgcmVsZWFzZSB0aGUgcGFyZW50LCB3aGljaCB3aWxsIHRha2UgY2FyZSBvZiBjbGVhbmluZyB1cCB0aGUgdm9sdW1lIGZvciB1cyAqLwogICAgSVdpbmVEM0RWb2x1bWVfR2V0UGFyZW50KHBWb2x1bWUsICZ2b2x1bWVQYXJlbnQpOwogICAgSVVua25vd25fUmVsZWFzZSh2b2x1bWVQYXJlbnQpOwogICAgcmV0dXJuIElVbmtub3duX1JlbGVhc2Uodm9sdW1lUGFyZW50KTsKfQoKc3RhdGljIEJPT0wgaW1wbGVtZW50YXRpb25faXNfYXBwbGUoV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CiAgICAvKiBNYWNPUyBoYXMgdmFyaW91cyBzcGVjaWFsaXRpZXMgaW4gdGhlIGV4dGVuc2lvbnMgaXQgYWR2ZXJ0aXNlcy4gU29tZSBoYXZlIHRvIGJlIGxvYWRlZCBmcm9tCiAgICAgKiB0aGUgb3BlbmdsIDEuMisgY29yZSwgd2hpbGUgb3RoZXIgZXh0ZW5zaW9ucyBhcmUgYWR2ZXJ0aXNlZCwgYnV0IHNvZnR3YXJlIGVtdWxhdGVkLiBTbyB0cnkgdG8KICAgICAqIGRldGVjdCB0aGUgQXBwbGUgT3BlbkdMIGltcGxlbWVudGF0aW9uIHRvIGFwcGx5IHNvbWUgZXh0ZW5zaW9uIGZpeHVwcyBhZnRlcndhcmRzLgogICAgICoKICAgICAqIERldGVjdGluZyB0aGlzIGlzbid0IHJlYWxseSBlYXN5LiBUaGUgdmVuZG9yIHN0cmluZyBkb2Vzbid0IG1lbnRpb24gQXBwbGUuIENvbXBpbGUtdGltZSBjaGVja3MKICAgICAqIGFyZW4ndCBzdWZmaWNpZW50IGVpdGhlciBiZWNhdXNlIGEgTGludXggYmluYXJ5IG1heSBkaXNwbGF5IG9uIGEgbWFjb3MgWCBzZXJ2ZXIgdmlhIHJlbW90ZSBYMTEuCiAgICAgKiBTbyB0cnkgdG8gZGV0ZWN0IHRoZSBHTCBpbXBsZW1lbnRhdGlvbiBieSBsb29raW5nIGF0IGNlcnRhaW4gQXBwbGUgZXh0ZW5zaW9ucy4gU29tZSBleHRlbnNpb25zCiAgICAgKiBsaWtlIGNsaWVudCBzdG9yYWdlIG1pZ2h0IGJlIHN1cHBvcnRlZCBvbiBvdGhlciBpbXBsZW1lbnRhdGlvbnMgdG9vLCBidXQgR0xfQVBQTEVfZmx1c2hfcmVuZGVyCiAgICAgKiBpcyBzcGVjaWZpYyB0byB0aGUgTWFjIE9TIFggd2luZG93IG1hbmFnZW1lbnQsIGFuZCBHTF9BUFBMRV95Y2Jjcl80MjIgaXMgUXVpY2tUaW1lIHNwZWNpZmljLiBTbwogICAgICogdGhlIGNoYW5jZSB0aGF0IG90aGVyIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IHRoZW0gaXMgcmF0aGVyIHNtYWxsIHNpbmNlIFdpbjMyIFF1aWNrVGltZSB1c2VzCiAgICAgKiBEaXJlY3REcmF3LCBub3QgT3BlbkdMLgogICAgICovCiAgICBpZihnbF9pbmZvLT5zdXBwb3J0ZWRbQVBQTEVfRkVOQ0VdICYmCiAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVBQTEVfQ0xJRU5UX1NUT1JBR0VdICYmCiAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVBQTEVfRkxVU0hfUkVOREVSXSAmJgogICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FQUExFX1lDQkNSXzQyMl0pIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJHTF9BUFBMRV9mZW5jZSwgR0xfQVBQTEVfY2xpZW50X3N0b3JhZ2UsIEdMX0FQUExFX2ZsdXNoX3JlbmRlciBhbmQgR0xfeWNiY3JfNDIyIGFyZSBzdXBwb3J0ZWRcbiIpOwogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIkFjdGl2YXRpbmcgTWFjT1MgZml4dXBzXG4iKTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0gZWxzZSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiQXBwbGUgZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTm90IGFjdGl2YXRpbmcgTWFjT1MgZml4dXBzXG4iKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OICgqZ2xfaW5mbykKc3RhdGljIHZvaWQgdGVzdF9wYm9fZnVuY3Rpb25hbGl0eShXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8pIHsKICAgIC8qIFNvbWUgT3BlbkdMIGltcGxlbWVudGF0aW9ucywgbmFtZWx5IEFwcGxlJ3MgR2Vmb3JjZSA4IGRyaXZlciwgYWR2ZXJ0aXNlcyBQQk9zLAogICAgICogYnV0IGdsVGV4U3ViSW1hZ2UgZnJvbSBhIFBCTyBmYWlscyBtaXNlcmFibHksIHdpdGggdGhlIGZpcnN0IGxpbmUgcmVwZWF0ZWQgb3ZlcgogICAgICogYWxsIHRoZSB0ZXh0dXJlLiBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgdGhpcyBidWcgYnkgaXRzIHN5bXB0b20gYW5kIGRpc2FibGVzIFBCT3MKICAgICAqIGlmIHRoZSB0ZXN0IGZhaWxzLgogICAgICoKICAgICAqIFRoZSB0ZXN0IHVwbG9hZHMgYSA0eDQgdGV4dHVyZSB2aWEgdGhlIFBCTyBpbiB0aGUgIm5hdGl2ZSIgZm9ybWF0IEdMX0JHUkEsCiAgICAgKiBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYuIFRoaXMgZm9ybWF0IHRyaWdnZXJzIHRoZSBidWcsIGFuZCBpdCBpcyB3aGF0IHdlIHVzZQogICAgICogZm9yIEQzREZNVF9BOFI4RzhCOC4gVGhlbiB0aGUgdGV4dHVyZSBpcyByZWFkIGJhY2sgd2l0aG91dCBhbnkgUEJPIGFuZCB0aGUgZGF0YQogICAgICogcmVhZCBiYWNrIGlzIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbC4gSWYgdGhleSBhcmUgZXF1YWwgUEJPcyBhcmUgYXNzdW1lZCB0byB3b3JrLAogICAgICogb3RoZXJ3aXNlIHRoZSBQQk8gZXh0ZW5zaW9uIGlzIGRpc2FibGVkLgogICAgICovCiAgICBHTHVpbnQgdGV4dHVyZSwgcGJvOwogICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYXR0ZXJuW10gPSB7CiAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDBmZiwgMHgwMDAwZmYwMCwgMHg0MGZmMDAwMCwKICAgICAgICAweDgwZmZmZmZmLCAweDQwZmZmZjAwLCAweDAwZmYwMGZmLCAweDAwMDBmZmZmLAogICAgICAgIDB4MDBmZmZmMDAsIDB4MDBmZjAwZmYsIDB4MDAwMGZmZmYsIDB4MDAwMDAwZmYsCiAgICAgICAgMHg4MGZmMDBmZiwgMHgwMDAwZmZmZiwgMHgwMGZmMDBmZiwgMHg0MGZmMDBmZgogICAgfTsKICAgIHVuc2lnbmVkIGludCBjaGVja1tzaXplb2YocGF0dGVybikgLyBzaXplb2YocGF0dGVyblswXSldOwoKICAgIGlmKCFnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1BJWEVMX0JVRkZFUl9PQkpFQ1RdKSB7CiAgICAgICAgLyogTm8gUEJPIC0+IE5vIHBvaW50IGluIHRlc3RpbmcgdGhlbSAqLwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB3aGlsZShnbEdldEVycm9yKCkpOwogICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZSk7CiAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwogICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDQsIDQsIDAsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgMCk7CiAgICBjaGVja0dMY2FsbCgiU3BlY2lmeWluZyB0aGUgUEJPIHRlc3QgdGV4dHVyZVxuIik7CgogICAgR0xfRVhUQ0FMTChnbEdlbkJ1ZmZlcnNBUkIoMSwgJnBibykpOwogICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIsIHBibykpOwogICAgR0xfRVhUQ0FMTChnbEJ1ZmZlckRhdGFBUkIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIsIHNpemVvZihwYXR0ZXJuKSwgcGF0dGVybiwgR0xfU1RSRUFNX0RSQVdfQVJCKSk7CiAgICBjaGVja0dMY2FsbCgiU3BlY2lmeWluZyB0aGUgUEJPIHRlc3QgcGJvXG4iKTsKCiAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgNCwgNCwgR0xfQkdSQSwgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBOVUxMKTsKICAgIGNoZWNrR0xjYWxsKCJMb2FkaW5nIHRoZSBQQk8gdGVzdCB0ZXh0dXJlXG4iKTsKCiAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0FSQiwgMCkpOwogICAgZ2xGaW5pc2goKTsgLyoganVzdCB0byBiZSBzdXJlICovCgogICAgbWVtc2V0KGNoZWNrLCAwLCBzaXplb2YoY2hlY2spKTsKICAgIGdsR2V0VGV4SW1hZ2UoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQkdSQSwgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBjaGVjayk7CiAgICBjaGVja0dMY2FsbCgiUmVhZGluZyBiYWNrIHRoZSBQQk8gdGVzdCB0ZXh0dXJlXG4iKTsKCiAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKICAgIEdMX0VYVENBTEwoZ2xEZWxldGVCdWZmZXJzQVJCKDEsICZwYm8pKTsKICAgIGNoZWNrR0xjYWxsKCJQQk8gdGVzdCBjbGVhbnVwXG4iKTsKCiAgICBpZihtZW1jbXAoY2hlY2ssIHBhdHRlcm4sIHNpemVvZihjaGVjaykpICE9IDApIHsKICAgICAgICBXQVJOXyhkM2RfY2FwcykoIlBCTyB0ZXN0IGZhaWxlZCwgcmVhZCBiYWNrIGRhdGEgZG9lc24ndCBtYXRjaCBvcmlnaW5hbFxuIik7CiAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJEaXNhYmxpbmcgUEJPcy4gVGhpcyBtYXkgcmVzdWx0IGluIHNsb3dlciBwZXJmb3JtYW5jZVxuIik7CiAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9QSVhFTF9CVUZGRVJfT0JKRUNUXSA9IEZBTFNFOwogICAgfSBlbHNlIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJQQk8gdGVzdCBzdWNjZXNzZnVsXG4iKTsKICAgIH0KfQojdW5kZWYgR0xJTkZPX0xPQ0FUSU9OCgovKiBDZXJ0YWluIGFwcGxpY2F0aW9ucyhTdGVhbSkgY29tcGxhaW4gaWYgd2UgcmVwb3J0IGFuIG91dGRhdGVkIGRyaXZlciB2ZXJzaW9uLiBJbiBnZW5lcmFsLAogKiByZXBvcnRpbmcgYSBkcml2ZXIgdmVyc2lvbiBpcyBtb290IGJlY2F1c2Ugd2UgYXJlIG5vdCB0aGUgV2luZG93cyBkcml2ZXIsIGFuZCB3ZSBoYXZlIGRpZmZlcmVudAogKiBidWdzLCBmZWF0dXJlcywgZXRjLgogKgogKiBJZiBhIGNhcmQgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsIHRoZSBnbCBkcml2ZXIgdmVyc2lvbiBpcyByZXBvcnRlZAogKi8Kc3RydWN0IGRyaXZlcl92ZXJzaW9uX2luZm9ybWF0aW9uIHsKICAgIFdPUkQgdmVuZG9yOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcG9ydGVkIFBDSSBjYXJkIHZlbmRvciBJRCAgKi8KICAgIFdPUkQgY2FyZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcG9ydGVkIFBDSSBjYXJkIGRldmljZSBJRCAgKi8KICAgIFdPUkQgaGlwYXJ0X2hpLCBoaXBhcnRfbG87ICAgICAgICAgIC8qIGRyaXZlciBoaXdvcmQgdG8gcmVwb3J0ICAgICAgKi8KICAgIFdPUkQgbG9wYXJ0X2hpLCBsb3BhcnRfbG87ICAgICAgICAgIC8qIGRyaXZlciBsb3dvcmQgdG8gcmVwb3J0ICAgICAgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX3ZlcnNpb25faW5mb3JtYXRpb24gZHJpdmVyX3ZlcnNpb25fdGFibGVbXSA9IHsKICAgIC8qIE52aWRpYSBkcml2ZXJzLiBHZWZvcmNlNiBhbmQgbmV3ZXIgY2FyZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBkcml2ZXIgKDE3Ny54KSovCiAgICAvKiBHZWZvcmNlRlggc3VwcG9ydCBpcyB1cCB0byAxNzMueCwgR2Vmb3JjZTJNWC8zLzQgdXB0byA5Ni54LCBUTlQvR2Vmb3JjZTEvMiB1cHRvIDcxLnggKi8KICAgIC8qIE5vdGUgdGhhdCB2ZXJzaW9uIG51bWJlcnMgPjEwMCBsZXRzIHNheSAxMjMuNDUgdXNlID49IHgueS4xMS4yMzQ1IGFuZCBub3QgeC55LjEwLjEyMzQ1ICovCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VGWF81MjAwLCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VGWF81NjAwLCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VGWF81ODAwLCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNjIwMCwgICAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNjYwMEdULCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNjgwMCwgICAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNzQwMCwgICAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNzMwMCwgICAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNzYwMCwgICAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNzgwMEdULCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODMwMEdTLCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODYwMEdULCAgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODYwME1HVCwgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODgwMEdUUywgICAgNywgIDE1LCAxMSwgNzM0MSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfOTYwMEdULCAgICAgNywgIDE1LCAxMSwgNzM0MSAgICB9LAogICAge1ZFTkRPUl9OVklESUEsICAgICBDQVJEX05WSURJQV9HRUZPUkNFXzk4MDBHVCwgICAgIDcsICAxNSwgMTEsIDczNDEgICAgfSwKCiAgICAvKiBBVEkgY2FyZHMuIFRoZSBkcml2ZXIgdmVyc2lvbnMgYXJlIHNvbWV3aGF0IHNpbWlsYXIsIGJ1dCBub3QgcXVpdGUgdGhlIHNhbWUuIExldCdzIGhhcmRjb2RlICovCiAgICB7VkVORE9SX0FUSSwgICAgICAgIENBUkRfQVRJX1JBREVPTl85NTAwLCAgICAgICAgICAgNiwgIDE0LCAxMCwgNjc2NCAgICB9LAogICAge1ZFTkRPUl9BVEksICAgICAgICBDQVJEX0FUSV9SQURFT05fWDcwMCwgICAgICAgICAgIDYsICAxNCwgMTAsIDY3NjQgICAgfSwKICAgIHtWRU5ET1JfQVRJLCAgICAgICAgQ0FSRF9BVElfUkFERU9OX1gxNjAwLCAgICAgICAgICA2LCAgMTQsIDEwLCA2NzY0ICAgIH0sCiAgICB7VkVORE9SX0FUSSwgICAgICAgIENBUkRfQVRJX1JBREVPTl9IRDIzMDAsICAgICAgICAgNiwgIDE0LCAxMCwgNjc2NCAgICB9LAogICAge1ZFTkRPUl9BVEksICAgICAgICBDQVJEX0FUSV9SQURFT05fSEQyNjAwLCAgICAgICAgIDYsICAxNCwgMTAsIDY3NjQgICAgfSwKICAgIHtWRU5ET1JfQVRJLCAgICAgICAgQ0FSRF9BVElfUkFERU9OX0hEMjkwMCwgICAgICAgICA2LCAgMTQsIDEwLCA2NzY0ICAgIH0sCgogICAgLyogVE9ETzogQWRkIGluZm9ybWF0aW9uIGFib3V0IGxlZ2FjeSBudmlkaWEgYW5kIEFUSSBoYXJkd2FyZSwgSW50ZWwgYW5kIG90aGVyIGNhcmRzICovCn07CgpzdGF0aWMgdm9pZCBmaXh1cF9leHRlbnNpb25zKFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykgewogICAgdW5zaWduZWQgaW50IGk7CiAgICBCT09MIGFwcGxlID0gaW1wbGVtZW50YXRpb25faXNfYXBwbGUoZ2xfaW5mbyk7CgogICAgaWYoYXBwbGUpIHsKICAgICAgICAvKiBNYWNPUyBhZHZlcnRpc2VzIG1vcmUgR0xTTCB2ZXJ0ZXggc2hhZGVyIHVuaWZvcm1zIHRoYW4gc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSwgYW5kIGlmIG1vcmUgYXJlCiAgICAgICAgICogdXNlZCBpdCBmYWxscyBiYWNrIHRvIHNvZnR3YXJlLiBXaGlsZSB0aGUgY29tcGlsZXIgY2FuIGRldGVjdCBpZiB0aGUgc2hhZGVyIHVzZXMgYWxsIGRlY2xhcmVkCiAgICAgICAgICogdW5pZm9ybXMsIHRoZSBvcHRpbWl6YXRpb24gZmFpbHMgaWYgdGhlIHNoYWRlciB1c2VzIHJlbGF0aXZlIGFkZHJlc3NpbmcuIFNvIGFueSBHTFNMIHNoYWRlcgogICAgICAgICAqIHVzaW5nIHJlbGF0aXZlIGFkZHJlc3NpbmcgZmFsbHMgYmFjayB0byBzb2Z0d2FyZS4KICAgICAgICAgKgogICAgICAgICAqIEFSQiB2cCBnaXZlcyB0aGUgY29ycmVjdCBhbW91bnQgb2YgdW5pZm9ybXMsIHNvIHVzZSBpdCBpbnN0ZWFkIG9mIEdMU0wKICAgICAgICAgKi8KICAgICAgICBpZihnbF9pbmZvLT52c19nbHNsX2NvbnN0YW50c0YgPD0gZ2xfaW5mby0+dnNfYXJiX2NvbnN0YW50c0YpIHsKICAgICAgICAgICAgRklYTUUoIkdMU0wgZG9lc24ndCBhZHZlcnRpc2UgbW9yZSB2ZXJ0ZXggc2hhZGVyIHVuaWZvcm1zIHRoYW4gQVJCLiBEcml2ZXIgZml4dXAgb3V0ZGF0ZWQ/XG4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRSgiRHJpdmVyIGNsYWltcyAldSBHTFNMIHZzIHVuaWZvcm1zLCByZXBsYWNpbmcgd2l0aCAldSBBUkIgdnAgdW5pZm9ybXNcbiIsCiAgICAgICAgICAgICAgICAgIGdsX2luZm8tPnZzX2dsc2xfY29uc3RhbnRzRiwgZ2xfaW5mby0+dnNfYXJiX2NvbnN0YW50c0YpOwogICAgICAgICAgICBnbF9pbmZvLT52c19nbHNsX2NvbnN0YW50c0YgPSBnbF9pbmZvLT52c19hcmJfY29uc3RhbnRzRjsKICAgICAgICB9CgogICAgICAgIC8qIE1hY09TIGFkdmVydGlzZXMgR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byBvbiBBVEkgcjUwMCBhbmQgZWFybGllciBjYXJkcywgYWx0aG91Z2gKICAgICAgICAgKiB0aGVzZSBjYXJkcyBvbmx5IHN1cHBvcnQgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlKEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwpLgogICAgICAgICAqIElmIHJlYWwgTlAyIHRleHR1cmVzIGFyZSB1c2VkLCB0aGUgZHJpdmVyIGZhbGxzIGJhY2sgdG8gc29mdHdhcmUuIFNvIHJlbW92ZSB0aGUgc3VwcG9ydGVkCiAgICAgICAgICogZmxhZyBmb3IgdGhpcyBleHRlbnNpb24KICAgICAgICAgKi8KICAgICAgICBpZihnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXT10gJiYgZ2xfaW5mby0+Z2xfdmVuZG9yID09IFZFTkRPUl9BVEkpIHsKICAgICAgICAgICAgaWYoZ2xfaW5mby0+Z2xfY2FyZCA9PSBDQVJEX0FUSV9SQURFT05fWDcwMCB8fCBnbF9pbmZvLT5nbF9jYXJkID09IENBUkRfQVRJX1JBREVPTl9YMTYwMCB8fAogICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID09IENBUkRfQVRJX1JBREVPTl85NTAwIHx8IGdsX2luZm8tPmdsX2NhcmQgPT0gQ0FSRF9BVElfUkFERU9OXzg1MDAgIHx8CiAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPT0gQ0FSRF9BVElfUkFERU9OXzcyMDAgfHwgZ2xfaW5mby0+Z2xfY2FyZCA9PSBDQVJEX0FUSV9SQUdFXzEyOFBSTykgewogICAgICAgICAgICAgICAgVFJBQ0UoIkdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28gYWR2ZXJ0aXNlZCBvbiBSNTAwIG9yIGVhcmxpZXIgY2FyZCwgcmVtb3ZpbmdcbiIpOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX05PTl9QT1dFUl9PRl9UV09dID0gRkFMU0U7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfUkVDVEFOR0xFXSA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFRoZSBJbnRlbCBHUFVzIG9uIE1hY09TIHNldCB0aGUgLncgcmVnaXN0ZXIgb2YgdGV4Y29vcmRzIHRvIDAuMCBieSBkZWZhdWx0LCB3aGljaCBjYXVzZXMgcHJvYmxlbXMKICAgICAgICAgKiB3aXRoIGZpeGVkIGZ1bmN0aW9uIGZyYWdtZW50IHByb2Nlc3NpbmcuIElkZWFsbHkgdGhpcyBmbGFnIHNob3VsZCBiZSBkZXRlY3RlZCB3aXRoIGEgdGVzdCBzaGFkZXIKICAgICAgICAgKiBhbmQgT3BlbkdMIGZlZWRiYWNrIG1vZGUsIGJ1dCBzb21lIEdMIGltcGxlbWVudGF0aW9ucyAoTWFjT1MgQVRJIGF0IGxlYXN0LCBwcm9iYWJseSBhbGwgTWFjT1Mgb25lcykKICAgICAgICAgKiBkbyBub3QgbGlrZSB2ZXJ0ZXggc2hhZGVycyBpbiBmZWVkYmFjayBtb2RlIGFuZCByZXR1cm4gYW4gZXJyb3IsIGV2ZW4gdGhvdWdoIGl0IHNob3VsZCBiZSB2YWxpZAogICAgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlYy4KICAgICAgICAgKgogICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gZW5hYmxlIHRoaXMgb24gYWxsIGNhcmRzLCBhcyBpdCBhZGRzIGFuIGV4dHJhIGluc3RydWN0aW9uIHBlciB0ZXhjb29yZCB1c2VkLiBUaGlzCiAgICAgICAgICogbWFrZXMgdGhlIHNoYWRlciBzbG93ZXIgYW5kIGVhdHMgaW5zdHJ1Y3Rpb24gc2xvdHMgd2hpY2ggc2hvdWxkIGJlIGF2YWlsYWJsZSB0byB0aGUgZDNkIGFwcC4KICAgICAgICAgKgogICAgICAgICAqIEFUSSBSYWRlb24gSEQgMnh4eCBjYXJkcyBvbiBNYWNPUyBoYXZlIHRoZSBpc3N1ZS4gSW5zdGVhZCBvZiBjaGVja2luZyBmb3IgdGhlIGJ1Z2d5IGNhcmRzLCBibGFja2xpc3QKICAgICAgICAgKiBhbGwgcmFkZW9uIGNhcmRzIG9uIE1hY3MgYW5kIHdoaXRlbGlzdCB0aGUgZ29vZCBvbmVzLiBUaGF0IHdheSB3ZSdyZSBwcmVwYXJlZCBmb3IgdGhlIGZ1dHVyZS4gSWYKICAgICAgICAgKiB0aGlzIHdvcmthcm91bmQgaXMgYWN0aXZhdGVkIG9uIGNhcmRzIHRoYXQgZG8gbm90IG5lZWQgaXQsIGl0IHdvbid0IGJyZWFrIHRoaW5ncywganVzdCBhZmZlY3QKICAgICAgICAgKiBwZXJmb3JtYW5jZSBuZWdhdGl2ZWx5LgogICAgICAgICAqLwogICAgICAgIGlmKGdsX2luZm8tPmdsX3ZlbmRvciA9PSBWRU5ET1JfSU5URUwgfHwKICAgICAgICAgICAoZ2xfaW5mby0+Z2xfdmVuZG9yID09IFZFTkRPUl9BVEkgJiYgZ2xfaW5mby0+Z2xfY2FyZCAhPSBDQVJEX0FUSV9SQURFT05fWDE2MDApKSB7CiAgICAgICAgICAgIFRSQUNFKCJFbmFibGluZyB2ZXJ0ZXggdGV4dHVyZSBjb29yZCBmaXhlcyBpbiB2ZXJ0ZXggc2hhZGVyc1xuIik7CiAgICAgICAgICAgIGdsX2luZm8tPnNldF90ZXhjb29yZF93ID0gVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgLyogRmluZCBvdXQgaWYgUEJPcyB3b3JrIGFzIHRoZXkgYXJlIHN1cHBvc2VkIHRvICovCiAgICB0ZXN0X3Bib19mdW5jdGlvbmFsaXR5KGdsX2luZm8pOwoKICAgIC8qIEZpeHVwIHRoZSBkcml2ZXIgdmVyc2lvbiAqLwogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZihkcml2ZXJfdmVyc2lvbl90YWJsZSkgLyBzaXplb2YoZHJpdmVyX3ZlcnNpb25fdGFibGVbMF0pKTsgaSsrKSB7CiAgICAgICAgaWYoZ2xfaW5mby0+Z2xfdmVuZG9yID09IGRyaXZlcl92ZXJzaW9uX3RhYmxlW2ldLnZlbmRvciAmJgogICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgICA9PSBkcml2ZXJfdmVyc2lvbl90YWJsZVtpXS5jYXJkKSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIkZvdW5kIGNhcmQgMHglMDR4LCAweCUwNHggaW4gZHJpdmVyIHZlcnNpb24gREJcbiIsIGdsX2luZm8tPmdsX3ZlbmRvciwgZ2xfaW5mby0+Z2xfY2FyZCk7CgogICAgICAgICAgICBnbF9pbmZvLT5kcml2ZXJfdmVyc2lvbiAgICAgICAgPSBNQUtFRFdPUkRfVkVSU0lPTihkcml2ZXJfdmVyc2lvbl90YWJsZVtpXS5sb3BhcnRfaGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl92ZXJzaW9uX3RhYmxlW2ldLmxvcGFydF9sbyk7CiAgICAgICAgICAgIGdsX2luZm8tPmRyaXZlcl92ZXJzaW9uX2hpcGFydCA9IE1BS0VEV09SRF9WRVJTSU9OKGRyaXZlcl92ZXJzaW9uX3RhYmxlW2ldLmhpcGFydF9oaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX3ZlcnNpb25fdGFibGVbaV0uaGlwYXJ0X2xvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGludmFsaWRfZnVuYyh2b2lkICpkYXRhKSB7CiAgICBFUlIoIkludmFsaWQgdmVydGV4IGF0dHJpYnV0ZSBmdW5jdGlvbiBjYWxsZWRcbiIpOwogICAgRGVidWdCcmVhaygpOwp9CgojZGVmaW5lIEdMSU5GT19MT0NBVElPTiAoQWRhcHRlcnNbMF0uZ2xfaW5mbykKCi8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIHByb3ZpZGluZyB2ZXJ0ZXggZGF0YSB0byBvcGVuZ2wuIFRoZSBhcnJheXMgYXJlIGluaXRpYWxpemVkIGJhc2VkIG9uCiAqIHRoZSBleHRlbnNpb24gZGV0ZWN0aW9uIGFuZCBhcmUgdXNlZCBpbiBkcmF3U3RyaWRlZFNsb3cKICovCnN0YXRpYyB2b2lkIHBvc2l0aW9uX2QzZGNvbG9yKHZvaWQgKmRhdGEpIHsKICAgIERXT1JEIHBvcyA9ICooKERXT1JEICopIGRhdGEpOwoKICAgIEZJWE1FKCJBZGQgYSB0ZXN0IGZvciBmaXhlZCBmdW5jdGlvbiBwb3NpdGlvbiBmcm9tIGQzZGNvbG9yIHR5cGVcbiIpOwogICAgZ2xWZXJ0ZXg0cyhEM0RDT0xPUl9CX1IocG9zKSwKICAgICAgICAgICAgICAgRDNEQ09MT1JfQl9HKHBvcyksCiAgICAgICAgICAgICAgIEQzRENPTE9SX0JfQihwb3MpLAogICAgICAgICAgICAgICBEM0RDT0xPUl9CX0EocG9zKSk7Cn0Kc3RhdGljIHZvaWQgcG9zaXRpb25fZmxvYXQ0KHZvaWQgKmRhdGEpIHsKICAgIEdMZmxvYXQgKnBvcyA9IChmbG9hdCAqKSBkYXRhOwoKICAgIGlmIChwb3NbM10gPCBlcHMgJiYgcG9zWzNdID4gLWVwcykKICAgICAgICBnbFZlcnRleDNmdihwb3MpOwogICAgZWxzZSB7CiAgICAgICAgZmxvYXQgdyA9IDEuMCAvIHBvc1szXTsKCiAgICAgICAgZ2xWZXJ0ZXg0Zihwb3NbMF0gKiB3LCBwb3NbMV0gKiB3LCBwb3NbMl0gKiB3LCB3KTsKICAgIH0KfQoKc3RhdGljIHZvaWQgZGlmZnVzZV9kM2Rjb2xvcih2b2lkICpkYXRhKSB7CiAgICBEV09SRCBkaWZmdXNlQ29sb3IgPSAqKChEV09SRCAqKSBkYXRhKTsKCiAgICBnbENvbG9yNHViKEQzRENPTE9SX0JfUihkaWZmdXNlQ29sb3IpLAogICAgICAgICAgICAgICBEM0RDT0xPUl9CX0coZGlmZnVzZUNvbG9yKSwKICAgICAgICAgICAgICAgRDNEQ09MT1JfQl9CKGRpZmZ1c2VDb2xvciksCiAgICAgICAgICAgICAgIEQzRENPTE9SX0JfQShkaWZmdXNlQ29sb3IpKTsKfQoKc3RhdGljIHZvaWQgc3BlY3VsYXJfZDNkY29sb3Iodm9pZCAqZGF0YSkgewogICAgRFdPUkQgc3BlY3VsYXJDb2xvciA9ICooKERXT1JEICopIGRhdGEpOwoKICAgIEdMX0VYVENBTEwoZ2xTZWNvbmRhcnlDb2xvcjN1YkVYVCkoRDNEQ09MT1JfQl9SKHNwZWN1bGFyQ29sb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDT0xPUl9CX0coc3BlY3VsYXJDb2xvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENPTE9SX0JfQihzcGVjdWxhckNvbG9yKSk7Cn0Kc3RhdGljIHZvaWQgd2Fybl9ub19zcGVjdWxhcl9mdW5jKHZvaWQgKmRhdGEpIHsKICAgIFdBUk4oIkdMX0VYVF9zZWNvbmRhcnlfY29sb3Igbm90IHN1cHBvcnRlZFxuIik7Cn0KCnZvaWQgZmlsbEdMQXR0cmliRnVuY3MoV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMl0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDNdICAgICAgPSAodm9pZCAqKSBnbFZlcnRleDNmdjsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDRdICAgICAgPSAodm9pZCAqKSBwb3NpdGlvbl9mbG9hdDQ7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRDNEQ09MT1JdICAgID0gKHZvaWQgKikgcG9zaXRpb25fZDNkY29sb3I7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0XSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUMl0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDRdICAgICAgPSAodm9pZCAqKSBnbFZlcnRleDJzdjsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VQllURTROXSAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyTl0gICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNE5dICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VU0hPUlQyTl0gICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUNE5dICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VERUMzXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9ERUMzTl0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yXSAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNF0gICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKCiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDFdICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQyXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUM10gICAgICAgPSAodm9pZCAqKSBnbENvbG9yM2Z2OwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQ0XSAgICAgICA9ICh2b2lkICopIGdsQ29sb3I0ZnY7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9EM0RDT0xPUl0gICAgID0gKHZvaWQgKikgZGlmZnVzZV9kM2Rjb2xvcjsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VCWVRFNF0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDJdICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQ0XSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VCWVRFNE5dICAgICAgPSAodm9pZCAqKSBnbENvbG9yNHVidjsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUMk5dICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDROXSAgICAgID0gKHZvaWQgKikgZ2xDb2xvcjRzdjsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VTSE9SVDJOXSAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VU0hPUlQ0Tl0gICAgID0gKHZvaWQgKikgZ2xDb2xvcjR1c3Y7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VREVDM10gICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfREVDM05dICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfMl0gICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzRdICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwoKICAgIC8qIE5vIDQgY29tcG9uZW50IGVudHJ5IHBvaW50cyBoZXJlICovCiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMl0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGlmKEdMX1NVUFBPUlQoRVhUX1NFQ09OREFSWV9DT0xPUikpIHsKICAgICAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQzXSAgICAgID0gKHZvaWQgKikgR0xfRVhUQ0FMTChnbFNlY29uZGFyeUNvbG9yM2Z2RVhUKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUM10gICAgICA9ICh2b2lkICopIHdhcm5fbm9fc3BlY3VsYXJfZnVuYzsKICAgIH0KICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDRdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBpZihHTF9TVVBQT1JUKEVYVF9TRUNPTkRBUllfQ09MT1IpKSB7CiAgICAgICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0QzRENPTE9SXSAgICA9ICh2b2lkICopIHNwZWN1bGFyX2QzZGNvbG9yOwogICAgfSBlbHNlIHsKICAgICAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRDNEQ09MT1JdICAgICAgPSAodm9pZCAqKSB3YXJuX25vX3NwZWN1bGFyX2Z1bmM7CiAgICB9CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0XSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUMl0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDRdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0Tl0gICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUMk5dICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDROXSAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUMk5dICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VTSE9SVDROXSAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VREVDM10gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfREVDM05dICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfMl0gICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzRdICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CgogICAgLyogT25seSAzIGNvbXBvbmVudCBlbnRyeSBwb2ludHMgaGVyZS4gVGVzdCBob3cgb3RoZXJzIGJlaGF2ZS4gRmxvYXQ0IG5vcm1hbHMgYXJlIHVzZWQKICAgICAqIGJ5IG9uZSBvZiBvdXIgdGVzdHMsIHRyeWluZyB0byBwYXNzIGl0IHRvIHRoZSBwaXhlbCBzaGFkZXIsIHdoaWNoIGZhaWxzIG9uIFdpbmRvd3MuCiAgICAgKi8KICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxXSAgICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDJdICAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUM10gICAgICAgICA9ICh2b2lkICopIGdsTm9ybWFsM2Z2OwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDRdICAgICAgICAgPSAodm9pZCAqKSBnbE5vcm1hbDNmdjsgLyogSnVzdCBpZ25vcmUgdGhlIDR0aCB2YWx1ZSAqLwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9EM0RDT0xPUl0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VCWVRFNF0gICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyXSAgICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDRdICAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VCWVRFNE5dICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyTl0gICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDROXSAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VTSE9SVDJOXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUNE5dICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VREVDM10gICAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0RFQzNOXSAgICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzRdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7Cn0KCiNkZWZpbmUgUFVTSDEoYXR0KSAgICAgICAgYXR0cmlic1tuQXR0cmlicysrXSA9IChhdHQpOwpCT09MIEluaXRBZGFwdGVycyh2b2lkKSB7CiAgICBzdGF0aWMgSE1PRFVMRSBtb2RfZ2w7CiAgICBCT09MIHJldDsKICAgIGludCBwc19zZWxlY3RlZF9tb2RlLCB2c19zZWxlY3RlZF9tb2RlOwoKICAgIC8qIE5vIG5lZWQgdG8gaG9sZCBhbnkgbG9jay4gVGhlIGNhbGxpbmcgbGlicmFyeSBtYWtlcyBzdXJlIG9ubHkgb25lIHRocmVhZCBjYWxscwogICAgICogd2luZWQzZCBzaW11bHRhbmVvdXNseQogICAgICovCiAgICBpZihudW1BZGFwdGVycyA+IDApIHJldHVybiBBZGFwdGVyc1swXS5vcGVuZ2w7CgogICAgVFJBQ0UoIkluaXRpYWxpemluZyBhZGFwdGVyc1xuIik7CgogICAgaWYoIW1vZF9nbCkgewojaWZkZWYgVVNFX1dJTjMyX09QRU5HTAojZGVmaW5lIFVTRV9HTF9GVU5DKHBmbikgcGZuID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKG1vZF9nbCwgI3Bmbik7CiAgICAgICAgbW9kX2dsID0gTG9hZExpYnJhcnlBKCJvcGVuZ2wzMi5kbGwiKTsKICAgICAgICBpZighbW9kX2dsKSB7CiAgICAgICAgICAgIEVSUigiQ2FuJ3QgbG9hZCBvcGVuZ2wzMi5kbGwhXG4iKTsKICAgICAgICAgICAgZ290byBub2dsX2FkYXB0ZXI7CiAgICAgICAgfQojZWxzZQojZGVmaW5lIFVTRV9HTF9GVU5DKHBmbikgcGZuID0gKHZvaWQqKXB3Z2xHZXRQcm9jQWRkcmVzcygjcGZuKTsKICAgICAgICAvKiBUbyBieXBhc3MgdGhlIG9wZW5nbDMyIHRodW5rcyBsb2FkIHdnbEdldFByb2NBZGRyZXNzIGZyb20gZ2RpMzIgKGdsWEdldFByb2NBZGRyZXNzIHdyYXBwZXIpIGluc3RlYWQgb2Ygb3BlbmdsMzIncyAqLwogICAgICAgIG1vZF9nbCA9IEdldE1vZHVsZUhhbmRsZUEoImdkaTMyLmRsbCIpOwojZW5kaWYKICAgIH0KCi8qIExvYWQgV0dMIGNvcmUgZnVuY3Rpb25zIGZyb20gb3BlbmdsMzIuZGxsICovCiNkZWZpbmUgVVNFX1dHTF9GVU5DKHBmbikgcCMjcGZuID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKG1vZF9nbCwgI3Bmbik7CiAgICBXR0xfRlVOQ1NfR0VOOwojdW5kZWYgVVNFX1dHTF9GVU5DCgogICAgaWYoIXB3Z2xHZXRQcm9jQWRkcmVzcykgewogICAgICAgIEVSUigiVW5hYmxlIHRvIGxvYWQgd2dsR2V0UHJvY0FkZHJlc3MhXG4iKTsKICAgICAgICBnb3RvIG5vZ2xfYWRhcHRlcjsKICAgIH0KCi8qIER5bmFtaWNhbGx5IGxvYWQgYWxsIEdMIGNvcmUgZnVuY3Rpb25zICovCiAgICBHTF9GVU5DU19HRU47CiN1bmRlZiBVU0VfR0xfRlVOQwoKICAgIC8qIEZvciBub3cgb25seSBvbmUgZGVmYXVsdCBhZGFwdGVyICovCiAgICB7CiAgICAgICAgaW50IGlQaXhlbEZvcm1hdDsKICAgICAgICBpbnQgYXR0cmlic1sxMF07CiAgICAgICAgaW50IHZhbHVlc1sxMF07CiAgICAgICAgaW50IG5BdHRyaWJzID0gMDsKICAgICAgICBpbnQgcmVzOwogICAgICAgIGludCBpOwogICAgICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3M7CiAgICAgICAgaW50IGF0dHJpYnV0ZTsKICAgICAgICBESVNQTEFZX0RFVklDRVcgRGlzcGxheURldmljZTsKICAgICAgICBIREMgaGRjOwoKICAgICAgICBUUkFDRSgiSW5pdGlhbGl6aW5nIGRlZmF1bHQgYWRhcHRlclxuIik7CiAgICAgICAgQWRhcHRlcnNbMF0ubnVtID0gMDsKICAgICAgICBBZGFwdGVyc1swXS5tb25pdG9yUG9pbnQueCA9IC0xOwogICAgICAgIEFkYXB0ZXJzWzBdLm1vbml0b3JQb2ludC55ID0gLTE7CgogICAgICAgIGlmICghV2luZUQzRF9DcmVhdGVGYWtlR0xDb250ZXh0KCkpIHsKICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gZ2V0IGEgZ2wgY29udGV4dCBmb3IgZGVmYXVsdCBhZGFwdGVyXG4iKTsKICAgICAgICAgICAgV2luZUQzRF9SZWxlYXNlRmFrZUdMQ29udGV4dCgpOwogICAgICAgICAgICBnb3RvIG5vZ2xfYWRhcHRlcjsKICAgICAgICB9CgogICAgICAgIHJldCA9IElXaW5lRDNESW1wbF9GaWxsR0xDYXBzKCZBZGFwdGVyc1swXS5nbF9pbmZvKTsKICAgICAgICBpZighcmV0KSB7CiAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgZ2wgY2FwcyBmb3IgZGVmYXVsdCBhZGFwdGVyXG4iKTsKICAgICAgICAgICAgV2luZUQzRF9SZWxlYXNlRmFrZUdMQ29udGV4dCgpOwogICAgICAgICAgICBnb3RvIG5vZ2xfYWRhcHRlcjsKICAgICAgICB9CiAgICAgICAgcmV0ID0gaW5pdFBpeGVsRm9ybWF0cygmQWRhcHRlcnNbMF0uZ2xfaW5mbyk7CiAgICAgICAgaWYoIXJldCkgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBpbml0IGdsIGZvcm1hdHNcbiIpOwogICAgICAgICAgICBXaW5lRDNEX1JlbGVhc2VGYWtlR0xDb250ZXh0KCk7CiAgICAgICAgICAgIGdvdG8gbm9nbF9hZGFwdGVyOwogICAgICAgIH0KCiAgICAgICAgaGRjID0gcHdnbEdldEN1cnJlbnREQygpOwogICAgICAgIGlmKCFoZGMpIHsKICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gZ2V0IGdsIEhEQ1xuIik7CiAgICAgICAgICAgIFdpbmVEM0RfUmVsZWFzZUZha2VHTENvbnRleHQoKTsKICAgICAgICAgICAgZ290byBub2dsX2FkYXB0ZXI7CiAgICAgICAgfQoKICAgICAgICBBZGFwdGVyc1swXS5kcml2ZXIgPSAiRGlzcGxheSI7CiAgICAgICAgQWRhcHRlcnNbMF0uZGVzY3JpcHRpb24gPSAiRGlyZWN0M0QgSEFMIjsKCiAgICAgICAgLyogVXNlIHRoZSBWaWRlb1JhbVNpemUgcmVnaXN0cnkgc2V0dGluZyB3aGVuIHNldCAqLwogICAgICAgIGlmKHdpbmVkM2Rfc2V0dGluZ3MuZW11bGF0ZWRfdGV4dHVyZXJhbSkKICAgICAgICAgICAgQWRhcHRlcnNbMF0uVGV4dHVyZVJhbSA9IHdpbmVkM2Rfc2V0dGluZ3MuZW11bGF0ZWRfdGV4dHVyZXJhbTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIEFkYXB0ZXJzWzBdLlRleHR1cmVSYW0gPSBBZGFwdGVyc1swXS5nbF9pbmZvLnZpZG1lbTsKICAgICAgICBBZGFwdGVyc1swXS5Vc2VkVGV4dHVyZVJhbSA9IDA7CiAgICAgICAgVFJBQ0UoIkVtdWxhdGluZyAlZE1CIG9mIHRleHR1cmUgcmFtXG4iLCBBZGFwdGVyc1swXS5UZXh0dXJlUmFtLygxMDI0KjEwMjQpKTsKCiAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQWRhcHRlcidzIERldmljZU5hbWUgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIENoYW5nZURpc3BsYXlTZXR0aW5ncyBhbmQgZnJpZW5kcyAqLwogICAgICAgIERpc3BsYXlEZXZpY2UuY2IgPSBzaXplb2YoRGlzcGxheURldmljZSk7CiAgICAgICAgRW51bURpc3BsYXlEZXZpY2VzVyhOVUxMLCAwIC8qIEFkYXB0ZXIgMCA9IGlEZXZOdW0gMCAqLywgJkRpc3BsYXlEZXZpY2UsIDApOwogICAgICAgIFRSQUNFKCJEZXZpY2VOYW1lOiAlc1xuIiwgZGVidWdzdHJfdyhEaXNwbGF5RGV2aWNlLkRldmljZU5hbWUpKTsKICAgICAgICBzdHJjcHlXKEFkYXB0ZXJzWzBdLkRldmljZU5hbWUsIERpc3BsYXlEZXZpY2UuRGV2aWNlTmFtZSk7CgogICAgICAgIGF0dHJpYnV0ZSA9IFdHTF9OVU1CRVJfUElYRUxfRk9STUFUU19BUkI7CiAgICAgICAgR0xfRVhUQ0FMTCh3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCKGhkYywgMCwgMCwgMSwgJmF0dHJpYnV0ZSwgJkFkYXB0ZXJzWzBdLm5DZmdzKSk7CgogICAgICAgIEFkYXB0ZXJzWzBdLmNmZ3MgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgQWRhcHRlcnNbMF0ubkNmZ3MgKnNpemVvZihXaW5lRDNEX1BpeGVsRm9ybWF0KSk7CiAgICAgICAgY2ZncyA9IEFkYXB0ZXJzWzBdLmNmZ3M7CiAgICAgICAgUFVTSDEoV0dMX1JFRF9CSVRTX0FSQikKICAgICAgICBQVVNIMShXR0xfR1JFRU5fQklUU19BUkIpCiAgICAgICAgUFVTSDEoV0dMX0JMVUVfQklUU19BUkIpCiAgICAgICAgUFVTSDEoV0dMX0FMUEhBX0JJVFNfQVJCKQogICAgICAgIFBVU0gxKFdHTF9ERVBUSF9CSVRTX0FSQikKICAgICAgICBQVVNIMShXR0xfU1RFTkNJTF9CSVRTX0FSQikKICAgICAgICBQVVNIMShXR0xfRFJBV19UT19XSU5ET1dfQVJCKQogICAgICAgIFBVU0gxKFdHTF9QSVhFTF9UWVBFX0FSQikKICAgICAgICBQVVNIMShXR0xfRE9VQkxFX0JVRkZFUl9BUkIpCiAgICAgICAgUFVTSDEoV0dMX0FVWF9CVUZGRVJTX0FSQikKCiAgICAgICAgZm9yKGlQaXhlbEZvcm1hdD0xOyBpUGl4ZWxGb3JtYXQ8PUFkYXB0ZXJzWzBdLm5DZmdzOyBpUGl4ZWxGb3JtYXQrKykgewogICAgICAgICAgICByZXMgPSBHTF9FWFRDQUxMKHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoaGRjLCBpUGl4ZWxGb3JtYXQsIDAsIG5BdHRyaWJzLCBhdHRyaWJzLCB2YWx1ZXMpKTsKCiAgICAgICAgICAgIGlmKCFyZXMpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIC8qIENhY2hlIHRoZSBwaXhlbCBmb3JtYXQgKi8KICAgICAgICAgICAgY2Zncy0+aVBpeGVsRm9ybWF0ID0gaVBpeGVsRm9ybWF0OwogICAgICAgICAgICBjZmdzLT5yZWRTaXplID0gdmFsdWVzWzBdOwogICAgICAgICAgICBjZmdzLT5ncmVlblNpemUgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgIGNmZ3MtPmJsdWVTaXplID0gdmFsdWVzWzJdOwogICAgICAgICAgICBjZmdzLT5hbHBoYVNpemUgPSB2YWx1ZXNbM107CiAgICAgICAgICAgIGNmZ3MtPmRlcHRoU2l6ZSA9IHZhbHVlc1s0XTsKICAgICAgICAgICAgY2Zncy0+c3RlbmNpbFNpemUgPSB2YWx1ZXNbNV07CiAgICAgICAgICAgIGNmZ3MtPndpbmRvd0RyYXdhYmxlID0gdmFsdWVzWzZdOwogICAgICAgICAgICBjZmdzLT5pUGl4ZWxUeXBlID0gdmFsdWVzWzddOwogICAgICAgICAgICBjZmdzLT5kb3VibGVCdWZmZXIgPSB2YWx1ZXNbOF07CiAgICAgICAgICAgIGNmZ3MtPmF1eEJ1ZmZlcnMgPSB2YWx1ZXNbOV07CgogICAgICAgICAgICBjZmdzLT5wYnVmZmVyRHJhd2FibGUgPSBGQUxTRTsKICAgICAgICAgICAgLyogQ2hlY2sgZm9yIHBidWZmZXIgc3VwcG9ydCB3aGVuIGl0IGlzIGFyb3VuZCBhcyB3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2IGZhaWxzIGZvciB1bmtub3duIGF0dHJpYnV0ZXMuICovCiAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoV0dMX0FSQl9QQlVGRkVSKSkgewogICAgICAgICAgICAgICAgaW50IGF0dHJpYiA9IFdHTF9EUkFXX1RPX1BCVUZGRVJfQVJCOwogICAgICAgICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICAgICAgICAgaWYoR0xfRVhUQ0FMTCh3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCKGhkYywgaVBpeGVsRm9ybWF0LCAwLCAxLCAmYXR0cmliLCAmdmFsdWUpKSkKICAgICAgICAgICAgICAgICAgICBjZmdzLT5wYnVmZmVyRHJhd2FibGUgPSB2YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2Zncy0+bnVtU2FtcGxlcyA9IDA7CiAgICAgICAgICAgIC8qIENoZWNrIG11bHRpc2FtcGxlIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfTVVMVElTQU1QTEUpKSB7CiAgICAgICAgICAgICAgICBpbnQgYXR0cmliWzJdID0ge1dHTF9TQU1QTEVfQlVGRkVSU19BUkIsIFdHTF9TQU1QTEVTX0FSQn07CiAgICAgICAgICAgICAgICBpbnQgdmFsdWVbMl07CiAgICAgICAgICAgICAgICBpZihHTF9FWFRDQUxMKHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoaGRjLCBpUGl4ZWxGb3JtYXQsIDAsIDIsIGF0dHJpYiwgdmFsdWUpKSkgewogICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlWzBdID0gV0dMX1NBTVBMRV9CVUZGRVJTX0FSQiB3aGljaCB0ZWxscyB3aGV0aGVyIG11bHRpc2FtcGxpbmcgaXMgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgICAqIHZhbHVlWzFdID0gbnVtYmVyIG9mIG11bHRpIHNhbXBsZSBidWZmZXJzKi8KICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZVswXSkKICAgICAgICAgICAgICAgICAgICAgICAgY2Zncy0+bnVtU2FtcGxlcyA9IHZhbHVlWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBUUkFDRSgiaVBpeGVsRm9ybWF0PSVkLCBpUGl4ZWxUeXBlPSUjeCwgZG91YmxlQnVmZmVyPSVkLCBSR0JBPSVkLyVkLyVkLyVkLCBkZXB0aD0lZCwgc3RlbmNpbD0lZCwgd2luZG93RHJhd2FibGU9JWQsIHBidWZmZXJEcmF3YWJsZT0lZFxuIiwgY2Zncy0+aVBpeGVsRm9ybWF0LCBjZmdzLT5pUGl4ZWxUeXBlLCBjZmdzLT5kb3VibGVCdWZmZXIsIGNmZ3MtPnJlZFNpemUsIGNmZ3MtPmdyZWVuU2l6ZSwgY2Zncy0+Ymx1ZVNpemUsIGNmZ3MtPmFscGhhU2l6ZSwgY2Zncy0+ZGVwdGhTaXplLCBjZmdzLT5zdGVuY2lsU2l6ZSwgY2Zncy0+d2luZG93RHJhd2FibGUsIGNmZ3MtPnBidWZmZXJEcmF3YWJsZSk7CiAgICAgICAgICAgIGNmZ3MrKzsKICAgICAgICB9CgogICAgICAgIC8qIEQxNiwgRDI0WDggYW5kIEQyNFM4IGFyZSBjb21tb24gZGVwdGggLyBkZXB0aCtzdGVuY2lsIGZvcm1hdHMuIEFsbCBkcml2ZXJzIHN1cHBvcnQgdGhlbSB0aG91Z2ggdGhpcyBkb2Vzbid0CiAgICAgICAgICogbWVhbiB0aGF0IHRoZSBmb3JtYXQgaXMgb2ZmZXJlZCBpbiBoYXJkd2FyZS4gRm9yIGluc3RhbmNlIEdlZm9yY2U4IGNhcmRzIGRvbid0IGhhdmUgb2ZmZXIgRDE2IGluIGhhcmR3YXJlCiAgICAgICAgICogYnV0IGp1c3QgZmFrZSBpdCB1c2luZyBEMjQoWDg/KSB3aGljaCBpcyBmaW5lLiBEM0QgYWxzbyBhbGxvd3MgdGhhdC4KICAgICAgICAgKiBTb21lIGRpc3BsYXkgZHJpdmVycyAoaTkxNSBvbiBMaW51eCkgb25seSByZXBvcnQgbWl4ZWQgZGVwdGgrc3RlbmNpbCBmb3JtYXRzIGxpa2UgRDI0UzguIE1TRE4gY2xlYXJseSBtZW50aW9ucwogICAgICAgICAqIHRoYXQgb25seSBvbiBsb2NrYWJsZSBmb3JtYXRzIChlLmcuIEQxNl9sb2NrZWQpIHRoZSBiaXQgb3JkZXIgaXMgZ3VhcmFudGVlZCBhbmQgdGhhdCBvbiBvdGhlciBmb3JtYXRzIHRoZQogICAgICAgICAqIGRyaXZlciBpcyBhbGxvd2VkIHRvIGNvbnN1bWUgbW9yZSBiaXRzIEVYQ0VQVCBmb3Igc3RlbmNpbCBiaXRzLgogICAgICAgICAqCiAgICAgICAgICogTWFyayBhbiBhZGFwdGVyIHdpdGggdGhpcyBicm9rZW4gc3RlbmNpbCBiZWhhdmlvci4KICAgICAgICAgKi8KICAgICAgICBBZGFwdGVyc1swXS5icm9rZW5TdGVuY2lsID0gVFJVRTsKICAgICAgICBmb3IoaT0wLCBjZmdzPUFkYXB0ZXJzWzBdLmNmZ3M7IGk8QWRhcHRlcnNbMF0ubkNmZ3M7IGkrKykgewogICAgICAgICAgICAvKiBOZWFybHkgYWxsIGRyaXZlcnMgb2ZmZXIgZGVwdGggZm9ybWF0cyB3aXRob3V0IHN0ZW5jaWwsIG9ubHkgb24gaTkxNSB0aGlzIGlmLXN0YXRlbWVudCB3b24ndCBiZSBlbnRlcmVkLiAqLwogICAgICAgICAgICBpZihjZmdzW2ldLmRlcHRoU2l6ZSAmJiAhY2Znc1tpXS5zdGVuY2lsU2l6ZSkgewogICAgICAgICAgICAgICAgQWRhcHRlcnNbMF0uYnJva2VuU3RlbmNpbCA9IEZBTFNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZpeHVwX2V4dGVuc2lvbnMoJkFkYXB0ZXJzWzBdLmdsX2luZm8pOwoKICAgICAgICBXaW5lRDNEX1JlbGVhc2VGYWtlR0xDb250ZXh0KCk7CgogICAgICAgIHNlbGVjdF9zaGFkZXJfbW9kZSgmQWRhcHRlcnNbMF0uZ2xfaW5mbywgV0lORUQzRERFVlRZUEVfSEFMLCAmcHNfc2VsZWN0ZWRfbW9kZSwgJnZzX3NlbGVjdGVkX21vZGUpOwogICAgICAgIHNlbGVjdF9zaGFkZXJfbWF4X2NvbnN0YW50cyhwc19zZWxlY3RlZF9tb2RlLCB2c19zZWxlY3RlZF9tb2RlLCAmQWRhcHRlcnNbMF0uZ2xfaW5mbyk7CiAgICAgICAgZmlsbEdMQXR0cmliRnVuY3MoJkFkYXB0ZXJzWzBdLmdsX2luZm8pOwogICAgICAgIGluaXRfdHlwZV9sb29rdXAoJkFkYXB0ZXJzWzBdLmdsX2luZm8pOwogICAgICAgIEFkYXB0ZXJzWzBdLm9wZW5nbCA9IFRSVUU7CiAgICB9CiAgICBudW1BZGFwdGVycyA9IDE7CiAgICBUUkFDRSgiJWQgYWRhcHRlcnMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkXG4iLCBudW1BZGFwdGVycyk7CgogICAgcmV0dXJuIFRSVUU7Cgpub2dsX2FkYXB0ZXI6CiAgICAvKiBJbml0aWFsaXplIGFuIGFkYXB0ZXIgZm9yIGRkcmF3LW9ubHkgbWVtb3J5IGNvdW50aW5nICovCiAgICBtZW1zZXQoQWRhcHRlcnMsIDAsIHNpemVvZihBZGFwdGVycykpOwogICAgQWRhcHRlcnNbMF0ubnVtID0gMDsKICAgIEFkYXB0ZXJzWzBdLm9wZW5nbCA9IEZBTFNFOwogICAgQWRhcHRlcnNbMF0ubW9uaXRvclBvaW50LnggPSAtMTsKICAgIEFkYXB0ZXJzWzBdLm1vbml0b3JQb2ludC55ID0gLTE7CgogICAgQWRhcHRlcnNbMF0uZHJpdmVyID0gIkRpc3BsYXkiOwogICAgQWRhcHRlcnNbMF0uZGVzY3JpcHRpb24gPSAiV2luZUQzRCBEaXJlY3REcmF3IEVtdWxhdGlvbiI7CiAgICBpZih3aW5lZDNkX3NldHRpbmdzLmVtdWxhdGVkX3RleHR1cmVyYW0pIHsKICAgICAgICBBZGFwdGVyc1swXS5UZXh0dXJlUmFtID0gd2luZWQzZF9zZXR0aW5ncy5lbXVsYXRlZF90ZXh0dXJlcmFtOwogICAgfSBlbHNlIHsKICAgICAgICBBZGFwdGVyc1swXS5UZXh0dXJlUmFtID0gOCAqIDEwMjQgKiAxMDI0OyAvKiBUaGlzIGlzIHBsZW50eSBmb3IgYSBERHJhdy1vbmx5IGNhcmQgKi8KICAgIH0KCiAgICBudW1BZGFwdGVycyA9IDE7CiAgICByZXR1cm4gRkFMU0U7Cn0KI3VuZGVmIFBVU0gxCiN1bmRlZiBHTElORk9fTE9DQVRJT04KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEIFZUYmwgZm9sbG93cwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmNvbnN0IElXaW5lRDNEVnRibCBJV2luZUQzRF9WdGJsID0KewogICAgLyogSVVua25vd24gKi8KICAgIElXaW5lRDNESW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElXaW5lRDNESW1wbF9BZGRSZWYsCiAgICBJV2luZUQzREltcGxfUmVsZWFzZSwKICAgIC8qIElXaW5lRDNEICovCiAgICBJV2luZUQzREltcGxfR2V0UGFyZW50LAogICAgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJDb3VudCwKICAgIElXaW5lRDNESW1wbF9SZWdpc3RlclNvZnR3YXJlRGV2aWNlLAogICAgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb25pdG9yLAogICAgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb2RlQ291bnQsCiAgICBJV2luZUQzREltcGxfRW51bUFkYXB0ZXJNb2RlcywKICAgIElXaW5lRDNESW1wbF9HZXRBZGFwdGVyRGlzcGxheU1vZGUsCiAgICBJV2luZUQzREltcGxfR2V0QWRhcHRlcklkZW50aWZpZXIsCiAgICBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUsCiAgICBJV2luZUQzREltcGxfQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaCwKICAgIElXaW5lRDNESW1wbF9DaGVja0RldmljZVR5cGUsCiAgICBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VGb3JtYXQsCiAgICBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uLAogICAgSVdpbmVEM0RJbXBsX0dldERldmljZUNhcHMsCiAgICBJV2luZUQzREltcGxfQ3JlYXRlRGV2aWNlCn07Cg==