Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaWZuZGVmIFBVQkxJQ19GUERGX0RPQ19IXwojZGVmaW5lIFBVQkxJQ19GUERGX0RPQ19IXwoKI2luY2x1ZGUgImZwZGZ2aWV3LmgiCgovLyBFeHBvcnRlZCBGdW5jdGlvbnMKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZAovLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbCBib29rbWFyayBpdGVtLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCi8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGN1cnJlbnQgYm9va21hcmsuIENhbiBiZSBOVUxMIGlmIHlvdSB3YW50IHRvIGdldCB0aGUgZmlyc3QgdG9wIGxldmVsIGl0ZW0uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubyBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nCi8vICAgICAgICAgIEdldCBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2Fubm90IGJlIE5VTEwuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuIE5VTEwgaWYgdGhpcyBpcyB0aGUgbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgovLwpETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19HZXROZXh0U2libGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0VGl0bGUKLy8gICAgICAgICAgR2V0IHRpdGxlIG9mIGEgYm9va21hcmsuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQnVmZmVyIGZvciB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRSBlbmNvZGluZy4gVGhhdCBtZWFucyB0aGUgYnVmZmVyCi8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLCBlYWNoIFdPUkQgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9mCi8vICAgICAgICAgIGEgY2hhcmFjdGVyKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLlRoZSBzdHJpbmcgaXMgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KLy8gICAgICAgICAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi8vCi8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKLy8gICAgICAgICAgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhlc2UgY2FzZXMsIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19GaW5kCi8vICAgICAgICAgIEZpbmQgYSBib29rbWFyayBpbiB0aGUgZG9jdW1lbnQsIHVzaW5nIHRoZSBib29rbWFyayB0aXRsZS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLyAgICAgICAgICB0aXRsZSAgICAgICAtICAgVGhlIFVURi0xNkxFIGVuY29kZWQgVW5pY29kZSBzdHJpbmcgZm9yIHRoZSBib29rbWFyayB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGZvdW5kIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgdGhlIHRpdGxlIGNhbid0IGJlIGZvdW5kLgovLyBDb21tZW50czoKLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0RGVzdAovLyAgICAgICAgICBHZXQgdGhlIGRlc3RpbmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBib29rbWFyay4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0QWN0aW9uCi8vICAgICAgICAgIEdldCB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEuIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQovLyAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZCb29rbWFya19HZXREZXN0LgovLwpETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgYm9va21hcmspOwoKI2RlZmluZSBQREZBQ1RJT05fVU5TVVBQT1JURUQgICAgICAgMCAgICAgICAvLyBVbnN1cHBvcnRlZCBhY3Rpb24gdHlwZS4KI2RlZmluZSBQREZBQ1RJT05fR09UTyAgICAgICAgICAgICAgMSAgICAgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBjdXJyZW50IGRvY3VtZW50LgojZGVmaW5lIFBERkFDVElPTl9SRU1PVEVHT1RPICAgICAgICAyICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuCiNkZWZpbmUgUERGQUNUSU9OX1VSSSAgICAgICAgICAgICAgIDMgICAgICAgLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgSW50ZXJuZXQgYmFzZWQgcmVzb3VyY2VzLgojZGVmaW5lIFBERkFDVElPTl9MQVVOQ0ggICAgICAgICAgICA0ICAgICAgIC8vIExhdW5jaCBhbiBhcHBsaWNhdGlvbiBvciBvcGVuIGEgZmlsZS4KCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUKLy8gICAgICAgICAgR2V0IHR5cGUgb2YgYW4gYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBhY3Rpb24gICAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgQSB0eXBlIG51bWJlciBhcyBkZWZpbmVkIGFib3ZlLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBhY3Rpb24pOwoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0RGVzdAovLyAgICAgICAgICBHZXQgZGVzdGluYXRpb24gb2YgYW4gYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvciBSRU1PVEVHT1RPIGFjdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBJbiBjYXNlIG9mIHJlbW90ZSBnb3RvIGFjdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmaXJzdCB1c2UgRlBERkFjdGlvbl9HZXRGaWxlUGF0aCB0bwovLyAgICAgICAgICBnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cyBkb2N1bWVudCBoYW5kbGUgdG8gY2FsbCB0aGlzCi8vICAgICAgICAgIGZ1bmN0aW9uLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbik7CgovLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXRVUklQYXRoCi8vICAgICAgICAgIEdldCBVUkkgcGF0aCBvZiBhIFVSSSBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLyAgICAgICAgICBhY3Rpb24gICAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE11c3QgYmUgYSBVUkkgYWN0aW9uLgovLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgcGF0aCBzdHJpbmcuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgVVJJIHBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KLy8gQ29tbWVudHM6Ci8vICAgICAgICAgIFRoZSBVUkkgcGF0aCBpcyBhbHdheXMgZW5jb2RlZCBpbiA3LWJpdCBBU0NJSS4KLy8KLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCi8vICAgICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAovLyAgICAgICAgICBiZSBtb2RpZmllZC4KLy8KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFVSSVBhdGgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9BQ1RJT04gYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKCi8vIEZ1bmN0aW9uOiBGUERGRGVzdF9HZXRQYWdlSW5kZXgKLy8gICAgICAgICAgR2V0IHBhZ2UgaW5kZXggb2YgYSBkZXN0aW5hdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGRlc3QgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIFRoZSBwYWdlIGluZGV4LiBTdGFydGluZyBmcm9tIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0RFU1QgZGVzdCk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0TGlua0F0UG9pbnQKLy8gICAgICAgICAgRmluZCBhIGxpbmsgYXQgc3BlY2lmaWVkIHBvaW50IG9uIGEgZG9jdW1lbnQgcGFnZS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQgcGFnZS4KLy8gICAgICAgICAgeCAgICAgICAgICAgLSAgIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGxpbmsuIE5VTEwgaWYgbm8gbGluayBmb3VuZCBhdCB0aGF0IHBvaW50LgovLyBDb21tZW50czoKLy8gICAgICAgICAgVGhlIHBvaW50IGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4gWW91IGNhbiBjb252ZXJ0IGNvb3JkaW5hdGVzCi8vICAgICAgICAgIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZyBGUERGX0RldmljZVRvUGFnZSBmdW5jdGlvbnMuCi8vCkRMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXREZXN0Ci8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5IEZQREZMaW5rX0dldExpbmtBdFBvaW50LgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKLy8gICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgRlBERkxpbmtfR2V0QWN0aW9uLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0xJTksgbGluayk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QWN0aW9uCi8vICAgICAgICAgIEdldCBhY3Rpb24gaW5mbyBvZiBhIGxpbmsuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4KLy8KRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19FbnVtZXJhdGUKLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlIFBERiBwYWdlLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBwYWdlW2luXSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuCi8vICAgICAgICAgIHN0YXJ0UG9zW2luLG91dF0gICAgLSAgIFRoZSBzdGFydCBwb3NpdGlvbiB0byBlbnVtZXJhdGUgdGhlIGxpbmsgYW5ub3RhdGlvbnMsIHdoaWNoIHNob3VsZCBiZSBzcGVjaWZpZWQgdG8gc3RhcnQgZnJvbQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAwIGZvciB0aGUgZmlyc3QgY2FsbCwgYW5kIHdvdWxkIHJlY2VpdmUgdGhlIG5leHQgcG9zaXRpb24gZm9yIGVudW1lcmF0aW5nIHRvIHN0YXJ0IGZyb20uCi8vICAgICAgICAgIGxpbmtBbm5vdFtvdXRdICAgICAgLSAgIFJlY2VpdmUgdGhlIGxpbmsgaGFuZGxlLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIFRSVUUgaWYgc3VjY2NlZWQsIGVsc2UgRmFsc2U7Ci8vCkRMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsIGludCogc3RhcnRQb3MsIEZQREZfTElOSyogbGlua0Fubm90KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLy8gICAgICAgICAgR2V0IHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gKFNwZWNpZmllZCBieSB0aGUgobBSZWN0obEgZW50cnkgb2YgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgbGlua0Fubm90W2luXSAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vICAgICAgICAgIHJlY3Rbb3V0XSAgICAgICAgICAgLSAgIFRoZSBhbm5vdGF0aW9uIHJlY3QuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LCBGU19SRUNURiogcmVjdCk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzCi8vICAgICAgICAgIEdldCB0aGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgbGlua0Fubm90W2luXSAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgVGhlIGNvdW50IG9mIHF1YWRyaWxhdGVyYWwgcG9pbnRzLgovLwpETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QpOwoKLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCiNpZm5kZWYgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCiNkZWZpbmUgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCnR5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRgp7CiAgICBGU19GTE9BVCAgeDE7CiAgICBGU19GTE9BVCAgeTE7CiAgICBGU19GTE9BVCAgeDI7CiAgICBGU19GTE9BVCAgeTI7CiAgICBGU19GTE9BVCAgeDM7CiAgICBGU19GTE9BVCAgeTM7CiAgICBGU19GTE9BVCAgeDQ7CiAgICBGU19GTE9BVCAgeTQ7Cn0gRlNfUVVBRFBPSU5UU0Y7CiNlbmRpZiAvKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRRdWFkUG9pbnRzCi8vICAgICAgICAgIEdldCB0aGUgcXVhZHJpbGF0ZXJhbCBwb2ludHMgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgbGlua0Fubm90W2luXSAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vICAgICAgICAgIHF1YWRJbmRleFtpbl0gICAgICAgLSAgIFRoZSBzcGVjaWZpZWQgcXVhZCBwb2ludHMgaW5kZXguCi8vICAgICAgICAgIHF1YWRQb2ludHNbb3V0XSAgICAgLSAgIFJlY2VpdmUgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIFRydWUgaWYgc3VjY2VlZCwgZWxzZSBGYWxzZS4KLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwgaW50IHF1YWRJbmRleCwgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpOwoKLy8gRnVuY3Rpb246IEZQREZfR2V0TWV0YVRleHQKLy8gICAgICAgICAgR2V0IGEgdGV4dCBmcm9tIG1ldGEgZGF0YSBvZiB0aGUgZG9jdW1lbnQuIFJlc3VsdCBpcyBlbmNvZGVkIGluIFVURi0xNkxFLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIGEgZG9jdW1lbnQKLy8gICAgICAgICAgdGFnICAgICAgICAgLSAgIFRoZSB0YWcgZm9yIHRoZSBtZXRhIGRhdGEuIEN1cnJlbnRseSwgSXQgY2FuIGJlICJUaXRsZSIsICJBdXRob3IiLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YmplY3QiLCAiS2V5d29yZHMiLCAiQ3JlYXRvciIsICJQcm9kdWNlciIsICJDcmVhdGlvbkRhdGUiLCBvciAiTW9kRGF0ZSIuCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlc2UgdGFncyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLCAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCi8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIGJ1ZmZlciBmb3Igb3V0cHV0IHRoZSB0aXRsZS4gQ2FuIGJlIE5VTEwuCi8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSB0aXRsZSBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgovLyBDb21tZW50czoKLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFIGVuY29kaW5nLCB3aGljaCBtZWFucyB0aGUgYnVmZmVyCi8vICAgICAgICAgIGNhbiBiZSByZWdhcmRlZCBhcyBhbiBhcnJheSBvZiBXT1JEIChvbiBJbnRlbCBhbmQgY29tcGF0aWJsZSBDUFVzKSwgZWFjaCBXT1JEIHJlcHJlc2VudCB0aGUgVW5pY29kZSBvZgovLyAgICAgICAgICBhIGNoYXJhY3RlciAoc29tZSBzcGVjaWFsIFVuaWNvZGUgbWF5IHRha2UgMiBXT1JEcykuIFRoZSBzdHJpbmcgaXMgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KLy8gICAgICAgICAgaW5kaWNhdGluZyBlbmQgb2YgdGhlIHN0cmluZy4KLy8KLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCi8vICAgICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAovLyAgICAgICAgICBiZSBtb2RpZmllZC4KLy8KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLCBGUERGX0JZVEVTVFJJTkcgdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CgoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgIC8vIFBVQkxJQ19GUERGX0RPQ19IXwo=