LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgQ29weXJpZ2h0IChDKSAyMDAxIElCTSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAwMy8yMi8yMDAwICAgaGVsZW5hICAgICAgQ3JlYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgU1RTRUFSQ0hfSAojZGVmaW5lIFNUU0VBUkNIX0gKCiNpbmNsdWRlICJ1bmljb2RlL3RibGNvbGwuaCIKI2luY2x1ZGUgInVuaWNvZGUvY29sZWl0ci5oIgojaW5jbHVkZSAidW5pY29kZS9zZWFyY2guaCIKClVfTkFNRVNQQUNFX0JFR0lOCgovKioKICogPHR0PlN0cmluZ1NlYXJjaDwvdHQ+IGlzIGEgPHR0PlNlYXJjaEl0ZXJhdG9yPC90dD4gdGhhdCBwcm92aWRlcwogKiBsYW5ndWFnZS1zZW5zaXRpdmUgdGV4dCBzZWFyY2hpbmcgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gcnVsZXMgZGVmaW5lZAogKiBpbiBhIHtAbGluayBSdWxlQmFzZWRDb2xsYXRvcn0gb2JqZWN0LgogKiBTdHJpbmdTZWFyY2ggZW5zdXJlcyB0aGF0IGxhbmd1YWdlIGVjY2VudHJpY2l0eSBjYW4gYmUgCiAqIGhhbmRsZWQsIGUuZy4gZm9yIHRoZSBHZXJtYW4gY29sbGF0b3IsIGNoYXJhY3RlcnMg3yBhbmQgU1Mgd2lsbCBiZSBtYXRjaGVkIAogKiBpZiBjYXNlIGlzIGNob3NlbiB0byBiZSBpZ25vcmVkLiAKICogU2VlIHRoZSA8YSBocmVmPWh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9pY3UvZGV2ZWxvcC9jb2xsYXRpb24vSUNVX2NvbGxhdGlvbl9kZXNpZ24uaHRtPgogKiAiSUNVIENvbGxhdGlvbiBEZXNpZ24gRG9jdW1lbnQiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICogPHA+IAogKiBUaGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGlzIGEgbW9kaWZpZWQgZm9ybSBvZiB0aGUgQm95ZXIgTW9vcmUncyBzZWFyY2guCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uICBzZWUgCiAqIDxhIGhyZWY9aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS9kb2NzL3BhcGVycy90ZXh0LXNlYXJjaC5odG1sPgogKiAiRWZmaWNpZW50IFRleHQgU2VhcmNoaW5nIGluIEphdmEiPC9hPiwgcHVibGlzaGVkIGluIDxpPkphdmEgUmVwb3J0PC9pPiAKICogaW4gRmVicnVhcnksIDE5OTksIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBhbGdvcml0aG0uCiAqIDxwPgogKiBUaGVyZSBhcmUgMiBtYXRjaCBvcHRpb25zIGZvciBzZWxlY3Rpb246PGJyPgogKiBMZXQgUycgYmUgdGhlIHN1Yi1zdHJpbmcgb2YgYSB0ZXh0IHN0cmluZyBTIGJldHdlZW4gdGhlIG9mZnNldHMgc3RhcnQgYW5kIAogKiBlbmQgPHN0YXJ0LCBlbmQ+LgogKiA8YnI+CiAqIEEgcGF0dGVybiBzdHJpbmcgUCBtYXRjaGVzIGEgdGV4dCBzdHJpbmcgUyBhdCB0aGUgb2Zmc2V0cyA8c3RhcnQsIGVuZD4gCiAqIGlmCiAqIDxwcmU+IAogKiBvcHRpb24gMS4gU29tZSBjYW5vbmljYWwgZXF1aXZhbGVudCBvZiBQIG1hdGNoZXMgc29tZSBjYW5vbmljYWwgZXF1aXZhbGVudCAKICogICAgICAgICAgIG9mIFMnCiAqIG9wdGlvbiAyLiBQIG1hdGNoZXMgUycgYW5kIGlmIFAgc3RhcnRzIG9yIGVuZHMgd2l0aCBhIGNvbWJpbmluZyBtYXJrLCAKICogICAgICAgICAgIHRoZXJlIGV4aXN0cyBubyBub24taWdub3JhYmxlIGNvbWJpbmluZyBtYXJrIGJlZm9yZSBvciBhZnRlciBTPyAKICogICAgICAgICAgIGluIFMgcmVzcGVjdGl2ZWx5LiAKICogPC9wcmU+CiAqIE9wdGlvbiAyLiB3aWxsIGJlIHRoZSBkZWZhdWx0twogKiA8cD4KICogVGhpcyBzZWFyY2ggaGFzIEFQSXMgc2ltaWxhciB0byB0aGF0IG9mIG90aGVyIHRleHQgaXRlcmF0aW9uIG1lY2hhbmlzbXMgCiAqIHN1Y2ggYXMgdGhlIGJyZWFrIGl0ZXJhdG9ycyBpbiA8dHQ+QnJlYWtJdGVyYXRvcjwvdHQ+LiBVc2luZyB0aGVzZSAKICogQVBJcywgaXQgaXMgZWFzeSB0byBzY2FuIHRocm91Z2ggdGV4dCBsb29raW5nIGZvciBhbGwgb2NjdXJhbmNlcyBvZiAKICogYSBnaXZlbiBwYXR0ZXJuLiBUaGlzIHNlYXJjaCBpdGVyYXRvciBhbGxvd3MgY2hhbmdpbmcgb2YgZGlyZWN0aW9uIGJ5IAogKiBjYWxsaW5nIGEgPHR0PnJlc2V0PC90dD4gZm9sbG93ZWQgYnkgYSA8dHQ+bmV4dDwvdHQ+IG9yIDx0dD5wcmV2aW91czwvdHQ+LiAKICogVGhvdWdoIGEgZGlyZWN0aW9uIGNoYW5nZSBjYW4gb2NjdXIgd2l0aG91dCBjYWxsaW5nIDx0dD5yZXNldDwvdHQ+IGZpcnN0LCAgCiAqIHRoaXMgb3BlcmF0aW9uIGNvbWVzIHdpdGggc29tZSBzcGVlZCBwZW5hbHR5LgogKiBNYXRjaCByZXN1bHRzIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiB3aWxsIG1hdGNoIHRoZSByZXN1bHQgbWF0Y2hlcyBpbiAKICogdGhlIGJhY2t3YXJkcyBkaXJlY3Rpb24gaW4gdGhlIHJldmVyc2Ugb3JkZXIKICogPHA+CiAqIDx0dD5TZWFyY2hJdGVyYXRvcjwvdHQ+IHByb3ZpZGVzIEFQSXMgdG8gc3BlY2lmeSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gCiAqIHdpdGhpbiB0aGUgdGV4dCBzdHJpbmcgdG8gYmUgc2VhcmNoZWQsIGUuZy4gPHR0PnNldE9mZnNldDwvdHQ+LAogKiA8dHQ+cHJlY2VkaW5nPC90dD4gYW5kIDx0dD5mb2xsb3dpbmc8L3R0Pi4gU2luY2UgdGhlIAogKiBzdGFydGluZyBwb3NpdGlvbiB3aWxsIGJlIHNldCBhcyBpdCBpcyBzcGVjaWZpZWQsIHBsZWFzZSB0YWtlIG5vdGUgdGhhdCAKICogdGhlcmUgYXJlIHNvbWUgZGFuZ2VyIHBvaW50cyB3aGljaCB0aGUgc2VhcmNoIG1heSByZW5kZXIgaW5jb3JyZWN0IAogKiByZXN1bHRzOgogKiA8dWw+CiAqIDxsaT4gVGhlIG1pZHN0IG9mIGEgc3Vic3RyaW5nIHRoYXQgcmVxdWlyZXMgbm9ybWFsaXphdGlvbi4KICogPGxpPiBJZiB0aGUgZm9sbG93aW5nIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCB0aGUgcG9zaXRpb24gc2hvdWxkIG5vdCBiZSB0aGUKICogICAgICBzZWNvbmQgY2hhcmFjdGVyIHdoaWNoIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgcHJlY2VkaW5nIAogKiAgICAgIGNoYXJhY3Rlci4gVmljZSB2ZXJzYSwgaWYgdGhlIHByZWNlZGluZyBtYXRjaCBpcyB0byBiZSBmb3VuZCwgCiAqICAgICAgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20gc2hvdWxkIG5vdCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIAogKiAgICAgIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgbmV4dCBjaGFyYWN0ZXIuIEUuZyBjZXJ0YWluIFRoYWkgYW5kCiAqICAgICAgTGFvIGNoYXJhY3RlcnMgcmVxdWlyZSBzd2FwcGluZy4KICogPGxpPiBJZiBhIGZvbGxvd2luZyBwYXR0ZXJuIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCBhbnkgcG9zaXRpb24gd2l0aGluIGEgCiAqICAgICAgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBmaXJzdCB3aWxsIGZhaWwuIFZpY2UgdmVyc2EgaWYgYSAKICogICAgICBwcmVjZWRpbmcgcGF0dGVybiBtYXRjaCBpcyB0byBiZSBmb3VuZCwgYSBpbnZhbGlkIHN0YXJ0aW5nIHBvaW50IAogKiAgICAgIHdvdWxkIGJlIGFueSBjaGFyYWN0ZXIgd2l0aGluIGEgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBsYXN0LgogKiA8XHVsPgogKiA8cD4KICogQSBicmVha2l0ZXJhdG9yIGNhbiBiZSB1c2VkIGlmIG9ubHkgbWF0Y2hlcyBhdCBsb2dpY2FsIGJyZWFrcyBhcmUgZGVzaXJlZC4KICogVXNpbmcgYSBicmVha2l0ZXJhdG9yIHdpbGwgb25seSBnaXZlIHlvdSByZXN1bHRzIHRoYXQgZXhhY3RseSBtYXRjaGVzIHRoZQogKiBib3VuZGFyaWVzIGdpdmVuIGJ5IHRoZSBicmVha2l0ZXJhdG9yLiBGb3IgaW5zdGFuY2UgdGhlIHBhdHRlcm4gImUiIHdpbGwKICogbm90IGJlIGZvdW5kIGluIHRoZSBzdHJpbmcgIlx1MDBlOSIgaWYgYSBjaGFyYWN0ZXIgYnJlYWsgaXRlcmF0b3IgaXMgdXNlZC4KICogPHA+CiAqIE9wdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGhhbmRsZSBvdmVybGFwcGluZyBtYXRjaGVzLiAKICogRS5nLiBJbiBFbmdsaXNoLCBvdmVybGFwcGluZyBtYXRjaGVzIHByb2R1Y2VzIHRoZSByZXN1bHQgMCBhbmQgMiAKICogZm9yIHRoZSBwYXR0ZXJuICJhYmFiIiBpbiB0aGUgdGV4dCAiYWJhYmFiIiwgd2hlcmUgZWxzZSBtdXR1YWxseSAKICogZXhjbHVzaXZlIG1hdGNoZXMgb25seSBwcm9kdWNlIHRoZSByZXN1bHQgb2YgMC4KICogPHA+CiAqIFRob3VnaCBjb2xsYXRvciBhdHRyaWJ1dGVzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoaWxlIAogKiBwZXJmb3JtaW5nIG1hdGNoZXMsIHRoZXJlIGFyZSBubyBBUElzIGhlcmUgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcgdGhlIAogKiBhdHRyaWJ1dGVzLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgZ2V0dGluZyB0aGUgY29sbGF0b3IKICogZnJvbSA8dHQ+Z2V0Q29sbGF0b3I8L3R0PiBhbmQgdXNpbmcgdGhlIEFQSXMgaW4gPHR0PmNvbGwuaDwvdHQ+LgogKiBMYXN0bHkgdG8gdXBkYXRlIFN0cmluZ1NlYXJjaCB0byB0aGUgbmV3IGNvbGxhdG9yIGF0dHJpYnV0ZXMsIAogKiByZXNldCgpIGhhcyB0byBiZSBjYWxsZWQuCiAqIDxwPiAKICogUmVzdHJpY3Rpb246IDxicj4KICogQ3VycmVudGx5IHRoZXJlIGFyZSBubyBjb21wb3NpdGUgY2hhcmFjdGVycyB0aGF0IGNvbnNpc3RzIG9mIGEKICogY2hhcmFjdGVyIHdpdGggY29tYmluaW5nIGNsYXNzID4gMCBiZWZvcmUgYSBjaGFyYWN0ZXIgd2l0aCBjb21iaW5pbmcgCiAqIGNsYXNzID09IDAuIEhvd2V2ZXIsIGlmIHN1Y2ggYSBjaGFyYWN0ZXIgZXhpc3RzIGluIHRoZSBmdXR1cmUsICAKICogU3RyaW5nU2VhcmNoIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgcmVzdWx0cyBmb3Igb3B0aW9uIDEuCiAqIDxwPgogKiBDb25zdWx0IHRoZSA8dHQ+U2VhcmNoSXRlcmF0b3I8L3R0PiBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbgogKiBhbmQgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBpbXBsZW1lbnQgdGV4dAogKiBzZWFyY2hpbmcuCiAqIDxwcmU+PGNvZGU+CiAqIFVuaWNvZGVTdHJpbmcgdGFyZ2V0KCJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGZveCIpOwogKiBVbmljb2RlU3RyaW5nIHBhdHRlcm4oImZveCIpOwogKgogKiBTZWFyY2hJdGVyYXRvciAqaXRlciA9IG5ldyBTdHJpbmdTZWFyY2gocGF0dGVybiwgdGFyZ2V0KTsKICoKICogZm9yIChpbnQgcG9zID0gaXRlci0+Zmlyc3QoKTsgcG9zICE9IFVTRUFSQ0hfRE9ORTsgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGl0ZXItPm5leHQoKSkgewogKiAgICAgcHJpbnRmKCJGb3VuZCBtYXRjaCBhdCAlZCBwb3MsIGxlbmd0aCBpcyAlZFxuIiwgcG9zLCAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmdldE1hdGNoTGVuZ3RoKCkpOwogKiB9CiAqIDwvY29kZT48L3ByZT4KICogQHNlZSBTZWFyY2hJdGVyYXRvcgogKiBAc2VlIFJ1bGVCYXNlZENvbGxhdG9yCiAqIEBzaW5jZSBJQ1UgMi4wCiAqLwoKY2xhc3MgVV9JMThOX0FQSSBTdHJpbmdTZWFyY2ggOiBwdWJsaWMgU2VhcmNoSXRlcmF0b3IKewpwdWJsaWM6CgogICAgLy8gcHVibGljIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIENyZWF0aW5nIGEgPHR0PlN0cmluZ1NlYXJjaDwvdHQ+IGluc3RhbmNlIHVzaW5nIHRoZSBhcmd1bWVudCBsb2NhbGUgCiAgICAgKiBsYW5ndWFnZSBydWxlIHNldC4gQSBjb2xsYXRvciB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIAogICAgICogd2lsbCBiZSBvd25lZCBieSB0aGlzIGluc3RhbmNlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gZHVyaW5nIAogICAgICogZGVzdHJ1Y3Rpb24KICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSB0ZXh0IGZvciB3aGljaCB0aGlzIG9iamVjdCB3aWxsIHNlYXJjaC4KICAgICAqIEBwYXJhbSB0ZXh0ICAgIFRoZSB0ZXh0IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIHBhdHRlcm4uCiAgICAgKiBAcGFyYW0gbG9jYWxlICBBIGxvY2FsZSB3aGljaCBkZWZpbmVzIHRoZSBsYW5ndWFnZS1zZW5zaXRpdmUgCiAgICAgKiAgICAgICAgICAgICAgICBjb21wYXJpc29uIHJ1bGVzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGV4dCBpbiB0aGUgCiAgICAgKiAgICAgICAgICAgICAgICBwYXR0ZXJuIGFuZCB0YXJnZXQgbWF0Y2hlcy4gCiAgICAgKiBAcGFyYW0gYnJlYWtpdGVyIEEgPHR0PkJyZWFrSXRlcmF0b3I8L3R0PiBvYmplY3QgdXNlZCB0byBjb25zdHJhaW4gCiAgICAgKiAgICAgICAgICAgICAgICB0aGUgbWF0Y2hlcyB0aGF0IGFyZSBmb3VuZC4gTWF0Y2hlcyB3aG9zZSBzdGFydCBhbmQgZW5kIAogICAgICogICAgICAgICAgICAgICAgaW5kaWNlcyBpbiB0aGUgdGFyZ2V0IHRleHQgYXJlIG5vdCBib3VuZGFyaWVzIGFzIAogICAgICogICAgICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PkJyZWFrSXRlcmF0b3I8L3R0PiBhcmUgCiAgICAgKiAgICAgICAgICAgICAgICBpZ25vcmVkLiBJZiB0aGlzIGJlaGF2aW9yIGlzIG5vdCBkZXNpcmVkLCAKICAgICAqICAgICAgICAgICAgICAgIDx0dD5OVUxMPC90dD4gY2FuIGJlIHBhc3NlZCBpbiBpbnN0ZWFkLgogICAgICogQHBhcmFtIHN0YXR1cyAgZm9yIGVycm9ycyBpZiBhbnkuIElmIHBhdHRlcm4gb3IgdGV4dCBpcyBOVUxMLCBvciBpZgogICAgICogICAgICAgICAgICAgICBlaXRoZXIgdGhlIGxlbmd0aCBvZiBwYXR0ZXJuIG9yIHRleHQgaXMgMCB0aGVuIGFuIAogICAgICogICAgICAgICAgICAgICBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgaXMgcmV0dXJuZWQuCiAgICAgKiBAZHJhZnQgSUNVIDIuMAogICAgICovCiAgICBTdHJpbmdTZWFyY2goY29uc3QgVW5pY29kZVN0cmluZyAmcGF0dGVybiwgY29uc3QgVW5pY29kZVN0cmluZyAmdGV4dCwKICAgICAgICAgICAgICAgICBjb25zdCBMb2NhbGUgICAgICAgICZsb2NhbGUsICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IgKmJyZWFraXRlciwKICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICZzdGF0dXMpOwoKICAgIC8qKgogICAgICogQ3JlYXRpbmcgYSA8dHQ+U3RyaW5nU2VhcmNoPC90dD4gaW5zdGFuY2UgdXNpbmcgdGhlIGFyZ3VtZW50IGNvbGxhdG9yIAogICAgICogbGFuZ3VhZ2UgcnVsZSBzZXQuIE5vdGUsIHVzZXIgcmV0YWlucyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgY29sbGF0b3IsIAogICAgICogaXQgZG9lcyBub3QgZ2V0IGRlc3Ryb3llZCBkdXJpbmcgdGhpcyBpbnN0YW5jZSdzIGRlc3RydWN0aW9uLgogICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHRleHQgZm9yIHdoaWNoIHRoaXMgb2JqZWN0IHdpbGwgc2VhcmNoLgogICAgICogQHBhcmFtIHRleHQgICAgVGhlIHRleHQgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgcGF0dGVybi4KICAgICAqIEBwYXJhbSBjb2xsICAgIEEgPHR0PlJ1bGVCYXNlZENvbGxhdG9yPC90dD4gb2JqZWN0IHdoaWNoIGRlZmluZXMgCiAgICAgKiAgICAgICAgICAgICAgICB0aGUgbGFuZ3VhZ2Utc2Vuc2l0aXZlIGNvbXBhcmlzb24gcnVsZXMgdXNlZCB0byAKICAgICAqICAgICAgICAgICAgICAgIGRldGVybWluZSB3aGV0aGVyIHRleHQgaW4gdGhlIHBhdHRlcm4gYW5kIHRhcmdldCAKICAgICAqICAgICAgICAgICAgICAgIG1hdGNoZXMuIFVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBjbGVhcmluZyBvZiB0aGlzCiAgICAgKiAgICAgICAgICAgICAgICBvYmplY3QuCiAgICAgKiBAcGFyYW0gYnJlYWtpdGVyIEEgPHR0PkJyZWFrSXRlcmF0b3I8L3R0PiBvYmplY3QgdXNlZCB0byBjb25zdHJhaW4gCiAgICAgKiAgICAgICAgICAgICAgICB0aGUgbWF0Y2hlcyB0aGF0IGFyZSBmb3VuZC4gTWF0Y2hlcyB3aG9zZSBzdGFydCBhbmQgZW5kIAogICAgICogICAgICAgICAgICAgICAgaW5kaWNlcyBpbiB0aGUgdGFyZ2V0IHRleHQgYXJlIG5vdCBib3VuZGFyaWVzIGFzIAogICAgICogICAgICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PkJyZWFrSXRlcmF0b3I8L3R0PiBhcmUgCiAgICAgKiAgICAgICAgICAgICAgICBpZ25vcmVkLiBJZiB0aGlzIGJlaGF2aW9yIGlzIG5vdCBkZXNpcmVkLCAKICAgICAqICAgICAgICAgICAgICAgIDx0dD5OVUxMPC90dD4gY2FuIGJlIHBhc3NlZCBpbiBpbnN0ZWFkLgogICAgICogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGFueS4gSWYgZWl0aGVyIHRoZSBsZW5ndGggb2YgcGF0dGVybiBvciAKICAgICAqICAgICAgICAgICAgICAgdGV4dCBpcyAwIHRoZW4gYW4gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkLgogICAgICogQGRyYWZ0IElDVSAyLjAKICAgICAqLwogICAgU3RyaW5nU2VhcmNoKGNvbnN0IFVuaWNvZGVTdHJpbmcgICAgICZwYXR0ZXJuLCAKICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nICAgICAmdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciAqY29sbCwgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgQnJlYWtJdGVyYXRvciAgICAgKmJyZWFraXRlciwKICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAmc3RhdHVzKTsKCiAgICAvKioKICAgICAqIENyZWF0aW5nIGEgPHR0PlN0cmluZ1NlYXJjaDwvdHQ+IGluc3RhbmNlIHVzaW5nIHRoZSBhcmd1bWVudCBsb2NhbGUgCiAgICAgKiBsYW5ndWFnZSBydWxlIHNldC4gQSBjb2xsYXRvciB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIAogICAgICogd2lsbCBiZSBvd25lZCBieSB0aGlzIGluc3RhbmNlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gZHVyaW5nIAogICAgICogZGVzdHJ1Y3Rpb24KICAgICAqIDxwPgogICAgICogTm90ZTogTm8gcGFyc2luZyBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIDx0dD5DaGFyYWN0ZXJJdGVyYXRvcjwvdHQ+IAogICAgICogd2lsbCBiZSBkb25lIGR1cmluZyBzZWFyY2hpbmcgZm9yIHRoaXMgdmVyc2lvbi4gVGhlIGJsb2NrIG9mIHRleHQgCiAgICAgKiBpbiA8dHQ+Q2hhcmFjdGVySXRlcmF0b3I8L3R0PiB3aWxsIGJlIHVzZWQgYXMgaXQgaXMuCiAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgdGV4dCBmb3Igd2hpY2ggdGhpcyBvYmplY3Qgd2lsbCBzZWFyY2guCiAgICAgKiBAcGFyYW0gdGV4dCAgICBUaGUgdGV4dCBpdGVyYXRvciBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBwYXR0ZXJuLgogICAgICogQHBhcmFtIGxvY2FsZSAgQSBsb2NhbGUgd2hpY2ggZGVmaW5lcyB0aGUgbGFuZ3VhZ2Utc2Vuc2l0aXZlIAogICAgICogICAgICAgICAgICAgICAgY29tcGFyaXNvbiBydWxlcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRleHQgaW4gdGhlIAogICAgICogICAgICAgICAgICAgICAgcGF0dGVybiBhbmQgdGFyZ2V0IG1hdGNoZXMuIFVzZXIgaXMgcmVzcG9uc2libGUgZm9yIAogICAgICogICAgICAgICAgICAgICAgdGhlIGNsZWFyaW5nIG9mIHRoaXMgb2JqZWN0LgogICAgICogQHBhcmFtIGJyZWFraXRlciBBIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4gb2JqZWN0IHVzZWQgdG8gY29uc3RyYWluIAogICAgICogICAgICAgICAgICAgICAgdGhlIG1hdGNoZXMgdGhhdCBhcmUgZm91bmQuIE1hdGNoZXMgd2hvc2Ugc3RhcnQgYW5kIGVuZCAKICAgICAqICAgICAgICAgICAgICAgIGluZGljZXMgaW4gdGhlIHRhcmdldCB0ZXh0IGFyZSBub3QgYm91bmRhcmllcyBhcyAKICAgICAqICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4gYXJlIAogICAgICogICAgICAgICAgICAgICAgaWdub3JlZC4gSWYgdGhpcyBiZWhhdmlvciBpcyBub3QgZGVzaXJlZCwgCiAgICAgKiAgICAgICAgICAgICAgICA8dHQ+TlVMTDwvdHQ+IGNhbiBiZSBwYXNzZWQgaW4gaW5zdGVhZC4KICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBhbnkuIElmIGVpdGhlciB0aGUgbGVuZ3RoIG9mIHBhdHRlcm4gb3IgCiAgICAgKiAgICAgICAgICAgICAgIHRleHQgaXMgMCB0aGVuIGFuIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZC4KICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIFN0cmluZ1NlYXJjaChjb25zdCBVbmljb2RlU3RyaW5nICZwYXR0ZXJuLCBDaGFyYWN0ZXJJdGVyYXRvciAmdGV4dCwKICAgICAgICAgICAgICAgICBjb25zdCBMb2NhbGUgICAgICAgICZsb2NhbGUsIAogICAgICAgICAgICAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IgKmJyZWFraXRlciwKICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICZzdGF0dXMpOwoKICAgIC8qKgogICAgICogQ3JlYXRpbmcgYSA8dHQ+U3RyaW5nU2VhcmNoPC90dD4gaW5zdGFuY2UgdXNpbmcgdGhlIGFyZ3VtZW50IGNvbGxhdG9yIAogICAgICogbGFuZ3VhZ2UgcnVsZSBzZXQuIE5vdGUsIHVzZXIgcmV0YWlucyB0aGUgb3duZXJzaGlwIG9mIHRoaXMgY29sbGF0b3IsIAogICAgICogaXQgZG9lcyBub3QgZ2V0IGRlc3Ryb3llZCBkdXJpbmcgdGhpcyBpbnN0YW5jZSdzIGRlc3RydWN0aW9uLgogICAgICogPHA+CiAgICAgKiBOb3RlOiBObyBwYXJzaW5nIG9mIHRoZSB0ZXh0IHdpdGhpbiB0aGUgPHR0PkNoYXJhY3Rlckl0ZXJhdG9yPC90dD4gCiAgICAgKiB3aWxsIGJlIGRvbmUgZHVyaW5nIHNlYXJjaGluZyBmb3IgdGhpcyB2ZXJzaW9uLiBUaGUgYmxvY2sgb2YgdGV4dCAKICAgICAqIGluIDx0dD5DaGFyYWN0ZXJJdGVyYXRvcjwvdHQ+IHdpbGwgYmUgdXNlZCBhcyBpdCBpcy4KICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSB0ZXh0IGZvciB3aGljaCB0aGlzIG9iamVjdCB3aWxsIHNlYXJjaC4KICAgICAqIEBwYXJhbSB0ZXh0ICAgIFRoZSB0ZXh0IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIHBhdHRlcm4uCiAgICAgKiBAcGFyYW0gY29sbCAgICBBIDx0dD5SdWxlQmFzZWRDb2xsYXRvcjwvdHQ+IG9iamVjdCB3aGljaCBkZWZpbmVzIAogICAgICogICAgICAgICAgICAgICAgdGhlIGxhbmd1YWdlLXNlbnNpdGl2ZSBjb21wYXJpc29uIHJ1bGVzIHVzZWQgdG8gCiAgICAgKiAgICAgICAgICAgICAgICBkZXRlcm1pbmUgd2hldGhlciB0ZXh0IGluIHRoZSBwYXR0ZXJuIGFuZCB0YXJnZXQgCiAgICAgKiAgICAgICAgICAgICAgICBtYXRjaGVzLiBVc2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY2xlYXJpbmcgb2YgdGhpcwogICAgICogICAgICAgICAgICAgICAgb2JqZWN0LgogICAgICogQHBhcmFtIGJyZWFraXRlciBBIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4gb2JqZWN0IHVzZWQgdG8gY29uc3RyYWluIAogICAgICogICAgICAgICAgICAgICAgdGhlIG1hdGNoZXMgdGhhdCBhcmUgZm91bmQuIE1hdGNoZXMgd2hvc2Ugc3RhcnQgYW5kIGVuZCAKICAgICAqICAgICAgICAgICAgICAgIGluZGljZXMgaW4gdGhlIHRhcmdldCB0ZXh0IGFyZSBub3QgYm91bmRhcmllcyBhcyAKICAgICAqICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4gYXJlIAogICAgICogICAgICAgICAgICAgICAgaWdub3JlZC4gSWYgdGhpcyBiZWhhdmlvciBpcyBub3QgZGVzaXJlZCwgCiAgICAgKiAgICAgICAgICAgICAgICA8dHQ+TlVMTDwvdHQ+IGNhbiBiZSBwYXNzZWQgaW4gaW5zdGVhZC4KICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBhbnkuIElmIGVpdGhlciB0aGUgbGVuZ3RoIG9mIHBhdHRlcm4gb3IgCiAgICAgKiAgICAgICAgICAgICAgIHRleHQgaXMgMCB0aGVuIGFuIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZC4KICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIFN0cmluZ1NlYXJjaChjb25zdCBVbmljb2RlU3RyaW5nICAgICAmcGF0dGVybiwgQ2hhcmFjdGVySXRlcmF0b3IgJnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3IgKmNvbGwsIAogICAgICAgICAgICAgICAgICAgICAgIEJyZWFrSXRlcmF0b3IgICAgICpicmVha2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgJnN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhIFN0cmluZ1NlYXJjaCBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIAogICAgICogYmVoYXZpb3IsIGFuZCBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSB0ZXh0LgogICAgICogQHBhcmFtIHRoYXQgU3RyaW5nU2VhcmNoIGluc3RhbmNlIHRvIGJlIGNvcGllZC4KICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIFN0cmluZ1NlYXJjaChjb25zdCBTdHJpbmdTZWFyY2ggJnRoYXQpOwoKICAgIC8qKgogICAgKiBEZXN0cnVjdG9yLiBDbGVhbnMgdXAgdGhlIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdC4KICAgICogSWYgYSBjb2xsYXRvciBpcyBjcmVhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciwgaXQgd2lsbCBiZSBkZXN0cm95ZWQgaGVyZS4KICAgICogQGRyYWZ0IElDVSAyLjAKICAgICovCiAgICB2aXJ0dWFsIH5TdHJpbmdTZWFyY2godm9pZCk7CgogICAgLy8gb3BlcmF0b3Igb3ZlcmxvYWRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yLiBTZXRzIHRoaXMgaXRlcmF0b3IgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciwKICAgICAqIGFuZCBpdGVyYXRlIG92ZXIgdGhlIHNhbWUgdGV4dCwgYXMgdGhlIG9uZSBwYXNzZWQgaW4uCiAgICAgKiBAcGFyYW0gdGhhdCBpbnN0YW5jZSB0byBiZSBjb3BpZWQuCiAgICAgKiBAZHJhZnQgSUNVIDIuMAogICAgICovCiAgICBTdHJpbmdTZWFyY2ggJiBvcGVyYXRvcj0oY29uc3QgU3RyaW5nU2VhcmNoICZ0aGF0KTsKCiAgICAvKioKICAgICAqIEVxdWFsaXR5IG9wZXJhdG9yLiAKICAgICAqIEBwYXJhbSB0aGF0IGluc3RhbmNlIHRvIGJlIGNvbXBhcmVkLgogICAgICogQHJldHVybiBUUlVFIGlmIGJvdGggaW5zdGFuY2VzIGhhdmUgdGhlIHNhbWUgYXR0cmlidXRlcywgCiAgICAgKiAgICAgICAgIGJyZWFraXRlcmF0b3JzLCBjb2xsYXRvcnMgYW5kIGl0ZXJhdGUgb3ZlciB0aGUgc2FtZSB0ZXh0IAogICAgICogICAgICAgICB3aGlsZSBsb29raW5nIGZvciB0aGUgc2FtZSBwYXR0ZXJuLgogICAgICogQGRyYWZ0IElDVSAyLjAKICAgICAqLwogICAgdmlydHVhbCBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlYXJjaEl0ZXJhdG9yICZ0aGF0KSBjb25zdDsKCiAgICAvLyBwdWJsaWMgZ2V0IGFuZCBzZXQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBpbmRleCB0byBwb2ludCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24sIGFuZCBjbGVhcnMgYW55IHN0YXRlIAogICAgICogdGhhdCdzIGFmZmVjdGVkLgogICAgICogPHA+CiAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgYXJndW1lbnQgaW5kZXggYW5kIHNldHMgdGhlIHBvc2l0aW9uIGluIHRoZSB0ZXh0IAogICAgICogc3RyaW5nIGFjY29yZGluZ2x5IHdpdGhvdXQgY2hlY2tpbmcgaWYgdGhlIGluZGV4IGlzIHBvaW50aW5nIHRvIGEgCiAgICAgKiB2YWxpZCBzdGFydGluZyBwb2ludCB0byBiZWdpbiBzZWFyY2hpbmcuIAogICAgICogQHBhcmFtIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB0byBiZSBzZXQKICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBzZXRPZmZzZXQoaW50MzJfdCBwb3NpdGlvbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgdGV4dCBiZWluZyBzZWFyY2hlZC4KICAgICAqIElmIHRoZSBpdGVyYXRpb24gaGFzIGdvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSB0ZXh0CiAgICAgKiAob3IgcGFzdCB0aGUgYmVnaW5uaW5nIGZvciBhIGJhY2t3YXJkcyBzZWFyY2gpLCB7QGxpbmsgI1VTRUFSQ0hfRE9ORX0gCiAgICAgKiBpcyByZXR1cm5lZC4KICAgICAqIEByZXR1cm4gY3VycmVudCBpbmRleCBpbiB0aGUgdGV4dCBiZWluZyBzZWFyY2hlZC4KICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRPZmZzZXQodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHRhcmdldCB0ZXh0IHRvIGJlIHNlYXJjaGVkLgogICAgICogVGV4dCBpdGVyYXRpb24gd2lsbCBoZW5jZSBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc3RyaW5nLiAKICAgICAqIFRoaXMgbWV0aG9kIGlzIAogICAgICogdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlLXVzZSBhbiBpdGVyYXRvciB0byBzZWFyY2ggZm9yIHRoZSBzYW1lIAogICAgICogcGF0dGVybiB3aXRoaW4gYSBkaWZmZXJlbnQgYm9keSBvZiB0ZXh0LgogICAgICogQHBhcmFtIHRleHQgdGV4dCBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBhbnkuIElmIHRoZSB0ZXh0IGxlbmd0aCBpcyAwIHRoZW4gYW4gCiAgICAgKiAgICAgICAgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkLgogICAgICogQGRyYWZ0IElDVSAyLjAKICAgICAqLwogICAgdmlydHVhbCB2b2lkIHNldFRleHQoY29uc3QgVW5pY29kZVN0cmluZyAmdGV4dCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKICAgIAogICAgLyoqCiAgICAgKiBTZXQgdGhlIHRhcmdldCB0ZXh0IHRvIGJlIHNlYXJjaGVkLgogICAgICogVGV4dCBpdGVyYXRpb24gd2lsbCBoZW5jZSBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc3RyaW5nLiAKICAgICAqIFRoaXMgbWV0aG9kIGlzIAogICAgICogdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlLXVzZSBhbiBpdGVyYXRvciB0byBzZWFyY2ggZm9yIHRoZSBzYW1lIAogICAgICogcGF0dGVybiB3aXRoaW4gYSBkaWZmZXJlbnQgYm9keSBvZiB0ZXh0LgogICAgICogTm90ZTogTm8gcGFyc2luZyBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIDx0dD5DaGFyYWN0ZXJJdGVyYXRvcjwvdHQ+IAogICAgICogd2lsbCBiZSBkb25lIGR1cmluZyBzZWFyY2hpbmcgZm9yIHRoaXMgdmVyc2lvbi4gVGhlIGJsb2NrIG9mIHRleHQgCiAgICAgKiBpbiA8dHQ+Q2hhcmFjdGVySXRlcmF0b3I8L3R0PiB3aWxsIGJlIHVzZWQgYXMgaXQgaXMuCiAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0IHN0cmluZyB0byBiZSBzZWFyY2hlZAogICAgICogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGFueS4gSWYgdGhlIHRleHQgbGVuZ3RoIGlzIDAgdGhlbiBhbiAKICAgICAqICAgICAgICBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgaXMgcmV0dXJuZWQuCiAgICAgKiBAZHJhZnQgSUNVIDIuMAogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciAmdGV4dCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIGNvbGxhdG9yIHVzZWQgZm9yIHRoZSBsYW5ndWFnZSBydWxlcy4gCiAgICAgKiA8cD4KICAgICAqIERlbGV0aW5nIHRoZSByZXR1cm5lZCA8dHQ+UnVsZUJhc2VkQ29sbGF0b3I8L3R0PiBiZWZvcmUgY2FsbGluZyAKICAgICAqIHRoZSBkZXN0cnVjdG9yIHdvdWxkIGNhdXNlIHRoZSBzdHJpbmcgc2VhcmNoIHRvIGZhaWwuCiAgICAgKiBUaGUgZGVzdHJ1Y3RvciB3aWxsIGRlbGV0ZSB0aGUgY29sbGF0b3IgaWYgdGhpcyBpbnN0YW5jZSBvd25zIGl0CiAgICAgKiBAcmV0dXJuIGNvbGxhdG9yIHVzZWQgZm9yIHN0cmluZyBzZWFyY2gKICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIFJ1bGVCYXNlZENvbGxhdG9yICogZ2V0Q29sbGF0b3IoKSBjb25zdDsKICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBjb2xsYXRvciB1c2VkIGZvciB0aGUgbGFuZ3VhZ2UgcnVsZXMuIFVzZXIgcmV0YWlucyB0aGUgCiAgICAgKiBvd25lcnNoaXAgb2YgdGhpcyBjb2xsYXRvciwgdGh1cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgZGVsZXRpb24gbGllcyAKICAgICAqIHdpdGggdGhlIHVzZXIuIFRoaXMgbWV0aG9kIGNhdXNlcyBpbnRlcm5hbCBkYXRhIHN1Y2ggYXMgQm95ZXItTW9vcmUgCiAgICAgKiBzaGlmdCB0YWJsZXMgdG8gYmUgcmVjYWxjdWxhdGVkLCBidXQgdGhlIGl0ZXJhdG9yJ3MgcG9zaXRpb24gaXMgCiAgICAgKiB1bmNoYW5nZWQuCiAgICAgKiBAcGFyYW0gY29sbCAgICBjb2xsYXRvciAKICAgICAqIEBwYXJhbSBzdGF0dXMgIGZvciBlcnJvcnMgaWYgYW55CiAgICAgKiBAZHJhZnQgSUNVIDIuMAogICAgICovCiAgICB2b2lkIHNldENvbGxhdG9yKFJ1bGVCYXNlZENvbGxhdG9yICpjb2xsLCBVRXJyb3JDb2RlICZzdGF0dXMpOwogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHBhdHRlcm4gdXNlZCBmb3IgbWF0Y2hpbmcuCiAgICAgKiBJbnRlcm5hbCBkYXRhIGxpa2UgdGhlIEJveWVyIE1vb3JlIHRhYmxlIHdpbGwgYmUgcmVjYWxjdWxhdGVkLCBidXQgCiAgICAgKiB0aGUgaXRlcmF0b3IncyBwb3NpdGlvbiBpcyB1bmNoYW5nZWQuCiAgICAgKiBAcGFyYW0gcGF0dGVybiBzZWFyY2ggcGF0dGVybiB0byBiZSBmb3VuZAogICAgICogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGFueS4gSWYgdGhlIHBhdHRlcm4gbGVuZ3RoIGlzIDAgdGhlbiBhbiAKICAgICAqICAgICAgICAgICAgICAgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkLgogICAgICogQGRyYWZ0IElDVSAyLjAKICAgICAqLwogICAgdm9pZCBzZXRQYXR0ZXJuKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnBhdHRlcm4sIFVFcnJvckNvZGUgJnN0YXR1cyk7CiAgICAKICAgIC8qKgogICAgICogR2V0cyB0aGUgc2VhcmNoIHBhdHRlcm4uCiAgICAgKiBAcmV0dXJuIHBhdHRlcm4gdXNlZCBmb3IgbWF0Y2hpbmcKICAgICAqIEBkcmFmdCBJQ1UgMi4wCiAgICAgKi8KICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcgJiBnZXRQYXR0ZXJuKCkgY29uc3Q7CgogICAgLy8gcHVibGljIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKiAKICAgICAqIFJlc2V0IHRoZSBpdGVyYXRpb24uCiAgICAgKiBTZWFyY2ggd2lsbCBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc3RyaW5nIGlmIGEgZm9yd2FyZCAKICAgICAqIGl0ZXJhdGlvbiBpcyBpbml0aWF0ZWQgYmVmb3JlIGEgYmFja3dhcmRzIGl0ZXJhdGlvbi4gT3RoZXJ3aXNlIGlmIAogICAgICogYSBiYWNrd2FyZHMgaXRlcmF0aW9uIGlzIGluaXRpYXRlZCBiZWZvcmUgYSBmb3J3YXJkcyBpdGVyYXRpb24sIHRoZSAKICAgICAqIHNlYXJjaCB3aWxsIGJlZ2luIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQgc3RyaW5nLgogICAgICogQGRyYWZ0IElDVSAyLjAKICAgICAqLwogICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiBTdHJpbmdTZWFyY2ggd2l0aCB0aGUgc2FtZSBiZWhhdmlvciwgYW5kIAogICAgICogaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgdGV4dCwgYXMgdGhpcyBvbmUuIE5vdGUgdGhhdCBhbGwgZGF0YSB3aWxsIGJlCiAgICAgKiByZXBsaWNhdGVkLCBleGNlcHQgZm9yIHRoZSB1c2VyLXNwZWNpZmllZCBjb2xsYXRvciBhbmQgdGhlCiAgICAgKiBicmVha2l0ZXJhdG9yLgogICAgICogQHJldHVybiBjbG9uZWQgb2JqZWN0CiAgICAgKiBAZHJhZnQgSUNVIDIuMAogICAgICovCiAgICB2aXJ0dWFsIFNlYXJjaEl0ZXJhdG9yICogc2FmZUNsb25lKHZvaWQpIGNvbnN0OwogICAgCnByb3RlY3RlZDoKCiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFNlYXJjaCBmb3J3YXJkIGZvciBtYXRjaGluZyB0ZXh0LCBzdGFydGluZyBhdCBhIGdpdmVuIGxvY2F0aW9uLgogICAgICogQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHk7IGluc3RlYWQgdGhleSBzaG91bGQgCiAgICAgKiBjYWxsIHtAbGluayBTZWFyY2hJdGVyYXRvciNuZXh0fS4KICAgICAqIDxwPgogICAgICogSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIG1hdGNoCiAgICAgKiBzdGFydHMgYW5kIGNhbGxzIHtAbGluayBTZWFyY2hJdGVyYXRvciNzZXRNYXRjaExlbmd0aH0gd2l0aCB0aGUgbnVtYmVyIAogICAgICogb2YgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHRleHQgdGhhdCBtYWtlIHVwIHRoZSBtYXRjaC4gSWYgbm8gbWF0Y2ggCiAgICAgKiBpcyBmb3VuZCwgdGhlIG1ldGhvZCByZXR1cm5zIDx0dD5VU0VBUkNIX0RPTkU8L3R0Pi4KICAgICAqIDxwPgogICAgICogVGhlIDx0dD5TdHJpbmdTZWFyY2g8L3R0PiBpcyBhZGp1c3RlZCBzbyB0aGF0IGl0cyBjdXJyZW50IGluZGV4IAogICAgICogKGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0T2Zmc2V0fSkgaXMgdGhlIG1hdGNoIHBvc2l0aW9uIGlmIG9uZSB3YXMgCiAgICAgKiBmb3VuZC4KICAgICAqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gd2lsbCBiZSByZXR1cm5lZCBhbmQKICAgICAqIHRoZSA8dHQ+U3RyaW5nU2VhcmNoPC90dD4gd2lsbCBiZSBhZGp1c3RlZCB0byB0aGUgaW5kZXggVVNFQVJDSF9ET05FLgogICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBpbiB0aGUgdGFyZ2V0IHRleHQgYXQgd2hpY2ggdGhlIHNlYXJjaCAKICAgICAqICAgICAgICAgICAgICAgICBzdGFydHMKICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBhbnkgb2NjdXJzCiAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgbWF0Y2hlZCB0ZXh0IGluIHRoZSB0YXJnZXQgc3RhcnRzLCBvciAKICAgICAqICAgICAgICAgVVNFQVJDSF9ET05FIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGhhbmRsZU5leHQoaW50MzJfdCBwb3NpdGlvbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNlYXJjaCBiYWNrd2FyZCBmb3IgbWF0Y2hpbmcgdGV4dCwgc3RhcnRpbmcgYXQgYSBnaXZlbiBsb2NhdGlvbi4KICAgICAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5OyBpbnN0ZWFkIHRoZXkgc2hvdWxkIGNhbGwKICAgICAqIDx0dD5TZWFyY2hJdGVyYXRvci5wcmV2aW91cygpPC90dD4sIHdoaWNoIHRoaXMgbWV0aG9kIG92ZXJyaWRlcy4KICAgICAqIDxwPgogICAgICogSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIG1hdGNoCiAgICAgKiBzdGFydHMgYW5kIGNhbGxzIHtAbGluayBTZWFyY2hJdGVyYXRvciNzZXRNYXRjaExlbmd0aH0gd2l0aCB0aGUgbnVtYmVyIAogICAgICogb2YgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHRleHQgdGhhdCBtYWtlIHVwIHRoZSBtYXRjaC4gSWYgbm8gbWF0Y2ggCiAgICAgKiBpcyBmb3VuZCwgdGhlIG1ldGhvZCByZXR1cm5zIDx0dD5VU0VBUkNIX0RPTkU8L3R0Pi4KICAgICAqIDxwPgogICAgICogVGhlIDx0dD5TdHJpbmdTZWFyY2g8L3R0PiBpcyBhZGp1c3RlZCBzbyB0aGF0IGl0cyBjdXJyZW50IGluZGV4IAogICAgICogKGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0T2Zmc2V0fSkgaXMgdGhlIG1hdGNoIHBvc2l0aW9uIGlmIG9uZSB3YXMgCiAgICAgKiBmb3VuZC4KICAgICAqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gd2lsbCBiZSByZXR1cm5lZCBhbmQKICAgICAqIHRoZSA8dHQ+U3RyaW5nU2VhcmNoPC90dD4gd2lsbCBiZSBhZGp1c3RlZCB0byB0aGUgaW5kZXggVVNFQVJDSF9ET05FLgogICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBpbiB0aGUgdGFyZ2V0IHRleHQgYXQgd2hpY2ggdGhlIHNlYXJjaCAKICAgICAqICAgICAgICAgICAgICAgICBzdGFydHMuCiAgICAgKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgYW55IG9jY3VycwogICAgICogQHJldHVybiBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIG1hdGNoZWQgdGV4dCBpbiB0aGUgdGFyZ2V0IHN0YXJ0cywgb3IgCiAgICAgKiAgICAgICAgIFVTRUFSQ0hfRE9ORSBpZiBubyBtYXRjaCB3YXMgZm91bmQuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBoYW5kbGVQcmV2KGludDMyX3QgcG9zaXRpb24sIFVFcnJvckNvZGUgJnN0YXR1cyk7CiAgICAKcHJpdmF0ZSA6CgogICAgLy8gcHJpdmF0ZSBkYXRhIG1lbWJlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgKiBSdWxlQmFzZWRDb2xsYXRvciwgY29udGFpbnMgZXhhY3RseSB0aGUgc2FtZSBVQ29sbGF0b3IgKiBpbiBtX3N0cnNyY2hfCiAgICAqLwogICAgUnVsZUJhc2VkQ29sbGF0b3IgIG1fY29sbGF0b3JfOwogICAgLyoqCiAgICAqIFBhdHRlcm4gdGV4dAogICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgICAgICBtX3BhdHRlcm5fOwogICAgLyoqCiAgICAqIENvcnJlc3BvbmRpbmcgY29sbGF0aW9uIHJ1bGVzCiAgICAqLwogICAgVW5pY29kZVN0cmluZyAgICAgIG1fY29sbGF0aW9uX3J1bGVzXzsKICAgIC8qKgogICAgKiBTdHJpbmcgc2VhcmNoIHN0cnVjdCBkYXRhCiAgICAqLwogICAgVVN0cmluZ1NlYXJjaCAgICAgKm1fc3Ryc3JjaF87Cn07CgpVX05BTUVTUEFDRV9FTkQKCiNlbmRpZgoK