xktnxxx

ktn

Sep 7th, 2020
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 60.51 KB | None | 0 0
  1. PD9waHAKLyoqCiAqIFJld3JpdGUgQVBJOiBXUF9SZXdyaXRlIGNsYXNzCiAqCiAqIEBwYWNrYWdlIFdvcmRQcmVzcwogKiBAc3VicGFja2FnZSBSZXdyaXRlCiAqIEBzaW5jZSAxLjUuMAogKi8KCi8qKgogKiBDb3JlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IGEgcmV3cml0ZSBjb21wb25lbnQgQVBJLgogKgogKiBUaGUgV29yZFByZXNzIFJld3JpdGUgY2xhc3Mgd3JpdGVzIHRoZSByZXdyaXRlIG1vZHVsZSBydWxlcyB0byB0aGUgLmh0YWNjZXNzCiAqIGZpbGUuIEl0IGFsc28gaGFuZGxlcyBwYXJzaW5nIHRoZSByZXF1ZXN0IHRvIGdldCB0aGUgY29ycmVjdCBzZXR1cCBmb3IgdGhlCiAqIFdvcmRQcmVzcyBRdWVyeSBjbGFzcy4KICoKICogVGhlIFJld3JpdGUgYWxvbmcgd2l0aCBXUCBjbGFzcyBmdW5jdGlvbiBhcyBhIGZyb250IGNvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcy4KICogWW91IGNhbiBhZGQgcnVsZXMgdG8gdHJpZ2dlciB5b3VyIHBhZ2UgdmlldyBhbmQgcHJvY2Vzc2luZyB1c2luZyB0aGlzCiAqIGNvbXBvbmVudC4gVGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIGZyb250IGNvbnRyb2xsZXIgZG9lcyBub3QgZXhpc3QsCiAqIG1lYW5pbmcgeW91IGNhbid0IGRlZmluZSBob3cgdGhlIHRlbXBsYXRlIGZpbGVzIGxvYWQgYmFzZWQgb24gdGhlIHJld3JpdGUKICogcnVsZXMuCiAqCiAqIEBzaW5jZSAxLjUuMAogKi8KY2xhc3MgV1BfUmV3cml0ZSB7CgkvKioKCSAqIFBlcm1hbGluayBzdHJ1Y3R1cmUgZm9yIHBvc3RzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRwZXJtYWxpbmtfc3RydWN0dXJlOwoKCS8qKgoJICogV2hldGhlciB0byBhZGQgdHJhaWxpbmcgc2xhc2hlcy4KCSAqCgkgKiBAc2luY2UgMi4yLjAKCSAqIEB2YXIgYm9vbAoJICovCglwdWJsaWMgJHVzZV90cmFpbGluZ19zbGFzaGVzOwoKCS8qKgoJICogQmFzZSBmb3IgdGhlIGF1dGhvciBwZXJtYWxpbmsgc3RydWN0dXJlIChleGFtcGxlLmNvbS8kYXV0aG9yX2Jhc2UvYXV0aG9ybmFtZSkuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGF1dGhvcl9iYXNlID0gJ2F1dGhvcic7CgoJLyoqCgkgKiBQZXJtYWxpbmsgc3RydWN0dXJlIGZvciBhdXRob3IgYXJjaGl2ZXMuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGF1dGhvcl9zdHJ1Y3R1cmU7CgoJLyoqCgkgKiBQZXJtYWxpbmsgc3RydWN0dXJlIGZvciBkYXRlIGFyY2hpdmVzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRkYXRlX3N0cnVjdHVyZTsKCgkvKioKCSAqIFBlcm1hbGluayBzdHJ1Y3R1cmUgZm9yIHBhZ2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRwYWdlX3N0cnVjdHVyZTsKCgkvKioKCSAqIEJhc2Ugb2YgdGhlIHNlYXJjaCBwZXJtYWxpbmsgc3RydWN0dXJlIChleGFtcGxlLmNvbS8kc2VhcmNoX2Jhc2UvcXVlcnkpLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRzZWFyY2hfYmFzZSA9ICdzZWFyY2gnOwoKCS8qKgoJICogUGVybWFsaW5rIHN0cnVjdHVyZSBmb3Igc2VhcmNoZXMuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHNlYXJjaF9zdHJ1Y3R1cmU7CgoJLyoqCgkgKiBDb21tZW50cyBwZXJtYWxpbmsgYmFzZS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkY29tbWVudHNfYmFzZSA9ICdjb21tZW50cyc7CgoJLyoqCgkgKiBQYWdpbmF0aW9uIHBlcm1hbGluayBiYXNlLgoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHVibGljICRwYWdpbmF0aW9uX2Jhc2UgPSAncGFnZSc7CgoJLyoqCgkgKiBDb21tZW50cyBwYWdpbmF0aW9uIHBlcm1hbGluayBiYXNlLgoJICoKCSAqIEBzaW5jZSA0LjIuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb21tZW50c19wYWdpbmF0aW9uX2Jhc2UgPSAnY29tbWVudC1wYWdlJzsKCgkvKioKCSAqIEZlZWQgcGVybWFsaW5rIGJhc2UuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGZlZWRfYmFzZSA9ICdmZWVkJzsKCgkvKioKCSAqIENvbW1lbnRzIGZlZWQgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkY29tbWVudF9mZWVkX3N0cnVjdHVyZTsKCgkvKioKCSAqIEZlZWQgcmVxdWVzdCBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRmZWVkX3N0cnVjdHVyZTsKCgkvKioKCSAqIFRoZSBzdGF0aWMgcG9ydGlvbiBvZiB0aGUgcG9zdCBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICoKCSAqIElmIHRoZSBwZXJtYWxpbmsgc3RydWN0dXJlIGlzICIvYXJjaGl2ZS8lcG9zdF9pZCUiIHRoZW4gdGhlIGZyb250CgkgKiBpcyAiL2FyY2hpdmUvIi4gSWYgdGhlIHBlcm1hbGluayBzdHJ1Y3R1cmUgaXMgIi8leWVhciUvJXBvc3RuYW1lJS8iCgkgKiB0aGVuIHRoZSBmcm9udCBpcyAiLyIuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICoKCSAqIEBzZWUgV1BfUmV3cml0ZTo6aW5pdCgpCgkgKi8KCXB1YmxpYyAkZnJvbnQ7CgoJLyoqCgkgKiBUaGUgcHJlZml4IGZvciBhbGwgcGVybWFsaW5rIHN0cnVjdHVyZXMuCgkgKgoJICogSWYgUEFUSElORk8vaW5kZXggcGVybWFsaW5rcyBhcmUgaW4gdXNlIHRoZW4gdGhlIHJvb3QgaXMgdGhlIHZhbHVlIG9mCgkgKiBgV1BfUmV3cml0ZTo6JGluZGV4YCB3aXRoIGEgdHJhaWxpbmcgc2xhc2ggYXBwZW5kZWQuIE90aGVyd2lzZSB0aGUgcm9vdAoJICogd2lsbCBiZSBlbXB0eS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgc3RyaW5nCgkgKgoJICogQHNlZSBXUF9SZXdyaXRlOjppbml0KCkKCSAqIEBzZWUgV1BfUmV3cml0ZTo6dXNpbmdfaW5kZXhfcGVybWFsaW5rcygpCgkgKi8KCXB1YmxpYyAkcm9vdCA9ICcnOwoKCS8qKgoJICogVGhlIG5hbWUgb2YgdGhlIGluZGV4IGZpbGUgd2hpY2ggaXMgdGhlIGVudHJ5IHBvaW50IHRvIGFsbCByZXF1ZXN0cy4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXB1YmxpYyAkaW5kZXggPSAnaW5kZXgucGhwJzsKCgkvKioKCSAqIFZhcmlhYmxlIG5hbWUgdG8gdXNlIGZvciByZWdleCBtYXRjaGVzIGluIHRoZSByZXdyaXR0ZW4gcXVlcnkuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJG1hdGNoZXMgPSAnJzsKCgkvKioKCSAqIFJld3JpdGUgcnVsZXMgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcmVxdWVzdCB0byBmaW5kIHRoZSByZWRpcmVjdCBvciBxdWVyeS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRydWxlczsKCgkvKioKCSAqIEFkZGl0aW9uYWwgcnVsZXMgYWRkZWQgZXh0ZXJuYWwgdG8gdGhlIHJld3JpdGUgY2xhc3MuCgkgKgoJICogVGhvc2Ugbm90IGdlbmVyYXRlZCBieSB0aGUgY2xhc3MsIHNlZSBhZGRfcmV3cml0ZV9ydWxlKCkuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkZXh0cmFfcnVsZXMgPSBhcnJheSgpOwoKCS8qKgoJICogQWRkaXRpb25hbCBydWxlcyB0aGF0IGJlbG9uZyBhdCB0aGUgYmVnaW5uaW5nIHRvIG1hdGNoIGZpcnN0LgoJICoKCSAqIFRob3NlIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGNsYXNzLCBzZWUgYWRkX3Jld3JpdGVfcnVsZSgpLgoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGV4dHJhX3J1bGVzX3RvcCA9IGFycmF5KCk7CgoJLyoqCgkgKiBSdWxlcyB0aGF0IGRvbid0IHJlZGlyZWN0IHRvIFdvcmRQcmVzcycgaW5kZXgucGhwLgoJICoKCSAqIFRoZXNlIHJ1bGVzIGFyZSB3cml0dGVuIHRvIHRoZSBtb2RfcmV3cml0ZSBwb3J0aW9uIG9mIHRoZSAuaHRhY2Nlc3MsCgkgKiBhbmQgYXJlIGFkZGVkIGJ5IGFkZF9leHRlcm5hbF9ydWxlKCkuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbm9uX3dwX3J1bGVzID0gYXJyYXkoKTsKCgkvKioKCSAqIEV4dHJhIHBlcm1hbGluayBzdHJ1Y3R1cmVzLCBlLmcuIGNhdGVnb3JpZXMsIGFkZGVkIGJ5IGFkZF9wZXJtYXN0cnVjdCgpLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGV4dHJhX3Blcm1hc3RydWN0cyA9IGFycmF5KCk7CgoJLyoqCgkgKiBFbmRwb2ludHMgKGxpa2UgL3RyYWNrYmFjay8pIGFkZGVkIGJ5IGFkZF9yZXdyaXRlX2VuZHBvaW50KCkuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkZW5kcG9pbnRzOwoKCS8qKgoJICogV2hldGhlciB0byB3cml0ZSBldmVyeSBtb2RfcmV3cml0ZSBydWxlIGZvciBXb3JkUHJlc3MgaW50byB0aGUgLmh0YWNjZXNzIGZpbGUuCgkgKgoJICogVGhpcyBpcyBvZmYgYnkgZGVmYXVsdCwgdHVybmluZyBpdCBvbiBtaWdodCBwcmludCBhIGxvdCBvZiByZXdyaXRlIHJ1bGVzCgkgKiB0byB0aGUgLmh0YWNjZXNzIGZpbGUuCgkgKgoJICogQHNpbmNlIDIuMC4wCgkgKiBAdmFyIGJvb2wKCSAqCgkgKiBAc2VlIFdQX1Jld3JpdGU6Om1vZF9yZXdyaXRlX3J1bGVzKCkKCSAqLwoJcHVibGljICR1c2VfdmVyYm9zZV9ydWxlcyA9IGZhbHNlOwoKCS8qKgoJICogQ291bGQgcG9zdCBwZXJtYWxpbmtzIGJlIGNvbmZ1c2VkIHdpdGggdGhvc2Ugb2YgcGFnZXM/CgkgKgoJICogSWYgdGhlIGZpcnN0IHJld3JpdGUgdGFnIGluIHRoZSBwb3N0IHBlcm1hbGluayBzdHJ1Y3R1cmUgaXMgb25lIHRoYXQgY291bGQKCSAqIGFsc28gbWF0Y2ggYSBwYWdlIG5hbWUgKGUuZy4gJXBvc3RuYW1lJSBvciAlYXV0aG9yJSkgdGhlbiB0aGlzIGZsYWcgaXMKCSAqIHNldCB0byB0cnVlLiBQcmlvciB0byBXb3JkUHJlc3MgMy4zIHRoaXMgZmxhZyBpbmRpY2F0ZWQgdGhhdCBldmVyeSBwYWdlCgkgKiB3b3VsZCBoYXZlIGEgc2V0IG9mIHJ1bGVzIGFkZGVkIHRvIHRoZSB0b3Agb2YgdGhlIHJld3JpdGUgcnVsZXMgYXJyYXkuCgkgKiBOb3cgaXQgdGVsbHMgV1A6OnBhcnNlX3JlcXVlc3QoKSB0byBjaGVjayBpZiBhIFVSTCBtYXRjaGluZyB0aGUgcGFnZQoJICogcGVybWFzdHJ1Y3QgaXMgYWN0dWFsbHkgYSBwYWdlIGJlZm9yZSBhY2NlcHRpbmcgaXQuCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAdmFyIGJvb2wKCSAqCgkgKiBAc2VlIFdQX1Jld3JpdGU6OmluaXQoKQoJICovCglwdWJsaWMgJHVzZV92ZXJib3NlX3BhZ2VfcnVsZXMgPSB0cnVlOwoKCS8qKgoJICogUmV3cml0ZSB0YWdzIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGVybWFsaW5rIHN0cnVjdHVyZXMuCgkgKgoJICogVGhlc2UgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGUgcmVndWxhciBleHByZXNzaW9ucyBzdG9yZWQgaW4KCSAqIGBXUF9SZXdyaXRlOjokcmV3cml0ZXJlcGxhY2VgIGFuZCBhcmUgcmV3cml0dGVuIHRvIHRoZSBxdWVyeQoJICogdmFyaWFibGVzIGxpc3RlZCBpbiBXUF9SZXdyaXRlOjokcXVlcnlyZXBsYWNlLgoJICoKCSAqIEFkZGl0aW9uYWwgdGFncyBjYW4gYmUgYWRkZWQgd2l0aCBhZGRfcmV3cml0ZV90YWcoKS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRyZXdyaXRlY29kZSA9IGFycmF5KAoJCScleWVhciUnLAoJCSclbW9udGhudW0lJywKCQknJWRheSUnLAoJCSclaG91ciUnLAoJCSclbWludXRlJScsCgkJJyVzZWNvbmQlJywKCQknJXBvc3RuYW1lJScsCgkJJyVwb3N0X2lkJScsCgkJJyVhdXRob3IlJywKCQknJXBhZ2VuYW1lJScsCgkJJyVzZWFyY2glJywKCSk7CgoJLyoqCgkgKiBSZWd1bGFyIGV4cHJlc3Npb25zIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gcmV3cml0ZSBydWxlcyBpbiBwbGFjZQoJICogb2YgcmV3cml0ZSB0YWdzLCBzZWUgV1BfUmV3cml0ZTo6JHJld3JpdGVjb2RlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJHJld3JpdGVyZXBsYWNlID0gYXJyYXkoCgkJJyhbMC05XXs0fSknLAoJCScoWzAtOV17MSwyfSknLAoJCScoWzAtOV17MSwyfSknLAoJCScoWzAtOV17MSwyfSknLAoJCScoWzAtOV17MSwyfSknLAoJCScoWzAtOV17MSwyfSknLAoJCScoW14vXSspJywKCQknKFswLTldKyknLAoJCScoW14vXSspJywKCQknKFteL10rPyknLAoJCScoLispJywKCSk7CgoJLyoqCgkgKiBRdWVyeSB2YXJpYWJsZXMgdGhhdCByZXdyaXRlIHRhZ3MgbWFwIHRvLCBzZWUgV1BfUmV3cml0ZTo6JHJld3JpdGVjb2RlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJHF1ZXJ5cmVwbGFjZSA9IGFycmF5KAoJCSd5ZWFyPScsCgkJJ21vbnRobnVtPScsCgkJJ2RheT0nLAoJCSdob3VyPScsCgkJJ21pbnV0ZT0nLAoJCSdzZWNvbmQ9JywKCQknbmFtZT0nLAoJCSdwPScsCgkJJ2F1dGhvcl9uYW1lPScsCgkJJ3BhZ2VuYW1lPScsCgkJJ3M9JywKCSk7CgoJLyoqCgkgKiBTdXBwb3J0ZWQgZGVmYXVsdCBmZWVkcy4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHVibGljICRmZWVkcyA9IGFycmF5KCAnZmVlZCcsICdyZGYnLCAncnNzJywgJ3JzczInLCAnYXRvbScgKTsKCgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciBwZXJtYWxpbmtzIGFyZSBiZWluZyB1c2VkLgoJICoKCSAqIFRoaXMgY2FuIGJlIGVpdGhlciByZXdyaXRlIG1vZHVsZSBvciBwZXJtYWxpbmsgaW4gdGhlIEhUVFAgcXVlcnkgc3RyaW5nLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gYm9vbCBUcnVlLCBpZiBwZXJtYWxpbmtzIGFyZSBlbmFibGVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdXNpbmdfcGVybWFsaW5rcygpIHsKCQlyZXR1cm4gISBlbXB0eSggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUgKTsKCX0KCgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciBwZXJtYWxpbmtzIGFyZSBiZWluZyB1c2VkIGFuZCByZXdyaXRlIG1vZHVsZSBpcyBub3QgZW5hYmxlZC4KCSAqCgkgKiBNZWFucyB0aGF0IHBlcm1hbGluayBsaW5rcyBhcmUgZW5hYmxlZCBhbmQgaW5kZXgucGhwIGlzIGluIHRoZSBVUkwuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBib29sIFdoZXRoZXIgcGVybWFsaW5rIGxpbmtzIGFyZSBlbmFibGVkIGFuZCBpbmRleC5waHAgaXMgaW4gdGhlIFVSTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVzaW5nX2luZGV4X3Blcm1hbGlua3MoKSB7CgkJaWYgKCBlbXB0eSggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gSWYgdGhlIGluZGV4IGlzIG5vdCBpbiB0aGUgcGVybWFsaW5rLCB3ZSdyZSB1c2luZyBtb2RfcmV3cml0ZS4KCQlyZXR1cm4gcHJlZ19tYXRjaCggJyNeLyonIC4gJHRoaXMtPmluZGV4IC4gJyMnLCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSApOwoJfQoKCS8qKgoJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHBlcm1hbGlua3MgYXJlIGJlaW5nIHVzZWQgYW5kIHJld3JpdGUgbW9kdWxlIGlzIGVuYWJsZWQuCgkgKgoJICogVXNpbmcgcGVybWFsaW5rcyBhbmQgaW5kZXgucGhwIGlzIG5vdCBpbiB0aGUgVVJMLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHBlcm1hbGluayBsaW5rcyBhcmUgZW5hYmxlZCBhbmQgaW5kZXgucGhwIGlzIE5PVCBpbiB0aGUgVVJMLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdXNpbmdfbW9kX3Jld3JpdGVfcGVybWFsaW5rcygpIHsKCQlyZXR1cm4gJHRoaXMtPnVzaW5nX3Blcm1hbGlua3MoKSAmJiAhICR0aGlzLT51c2luZ19pbmRleF9wZXJtYWxpbmtzKCk7Cgl9CgoJLyoqCgkgKiBJbmRleGVzIGZvciBtYXRjaGVzIGZvciB1c2FnZSBpbiBwcmVnXyooKSBmdW5jdGlvbnMuCgkgKgoJICogVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzLCB3aXRoIGVtcHR5IG1hdGNoZXMgcHJvcGVydHkgdmFsdWUsICckTlVNJy4KCSAqIFRoZSAnTlVNJyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIGluIHRoZSAkbnVtYmVyIHBhcmFtZXRlci4gV2l0aAoJICogdGhlIG1hdGNoZXMgcHJvcGVydHkgbm90IGVtcHR5LCB0aGUgdmFsdWUgb2YgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsCgkgKiBjb250YWluIHRoYXQgdmFsdWUgb2YgdGhlIG1hdGNoZXMgcHJvcGVydHkuIFRoZSBmb3JtYXQgdGhlbiB3aWxsIGJlCgkgKiAnJE1BVENIRVNbTlVNXScsIHdpdGggTUFUQ0hFUyBhcyB0aGUgdmFsdWUgaW4gdGhlIHByb3BlcnR5IGFuZCBOVU0gdGhlCgkgKiB2YWx1ZSBvZiB0aGUgJG51bWJlciBwYXJhbWV0ZXIuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIGludCAkbnVtYmVyIEluZGV4IG51bWJlci4KCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVnX2luZGV4KCAkbnVtYmVyICkgewoJCSRtYXRjaF9wcmVmaXggPSAnJCc7CgkJJG1hdGNoX3N1ZmZpeCA9ICcnOwoKCQlpZiAoICEgZW1wdHkoICR0aGlzLT5tYXRjaGVzICkgKSB7CgkJCSRtYXRjaF9wcmVmaXggPSAnJCcgLiAkdGhpcy0+bWF0Y2hlcyAuICdbJzsKCQkJJG1hdGNoX3N1ZmZpeCA9ICddJzsKCQl9CgoJCXJldHVybiAiJG1hdGNoX3ByZWZpeCRudW1iZXIkbWF0Y2hfc3VmZml4IjsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyBhbGwgcGFnZSBhbmQgYXR0YWNobWVudHMgZm9yIHBhZ2VzIFVSSXMuCgkgKgoJICogVGhlIGF0dGFjaG1lbnRzIGFyZSBmb3IgdGhvc2UgdGhhdCBoYXZlIHBhZ2VzIGFzIHBhcmVudHMgYW5kIHdpbGwgYmUKCSAqIHJldHJpZXZlZC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAZ2xvYmFsIHdwZGIgJHdwZGIgV29yZFByZXNzIGRhdGFiYXNlIGFic3RyYWN0aW9uIG9iamVjdC4KCSAqCgkgKiBAcmV0dXJuIGFycmF5IEFycmF5IG9mIHBhZ2UgVVJJcyBhcyBmaXJzdCBlbGVtZW50IGFuZCBhdHRhY2htZW50IFVSSXMgYXMgc2Vjb25kIGVsZW1lbnQuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwYWdlX3VyaV9pbmRleCgpIHsKCQlnbG9iYWwgJHdwZGI7CgoJCS8vIEdldCBwYWdlcyBpbiBvcmRlciBvZiBoaWVyYXJjaHksIGkuZS4gY2hpbGRyZW4gYWZ0ZXIgcGFyZW50cy4KCQkkcGFnZXMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgSUQsIHBvc3RfbmFtZSwgcG9zdF9wYXJlbnQgRlJPTSAkd3BkYi0+cG9zdHMgV0hFUkUgcG9zdF90eXBlID0gJ3BhZ2UnIEFORCBwb3N0X3N0YXR1cyAhPSAnYXV0by1kcmFmdCciICk7CgkJJHBvc3RzID0gZ2V0X3BhZ2VfaGllcmFyY2h5KCAkcGFnZXMgKTsKCgkJLy8gSWYgd2UgaGF2ZSBubyBwYWdlcyBnZXQgb3V0IHF1aWNrLgoJCWlmICggISAkcG9zdHMgKSB7CgkJCXJldHVybiBhcnJheSggYXJyYXkoKSwgYXJyYXkoKSApOwoJCX0KCgkJLy8gTm93IHJldmVyc2UgaXQsIGJlY2F1c2Ugd2UgbmVlZCBwYXJlbnRzIGFmdGVyIGNoaWxkcmVuIGZvciByZXdyaXRlIHJ1bGVzIHRvIHdvcmsgcHJvcGVybHkuCgkJJHBvc3RzID0gYXJyYXlfcmV2ZXJzZSggJHBvc3RzLCB0cnVlICk7CgoJCSRwYWdlX3VyaXMgICAgICAgICAgICA9IGFycmF5KCk7CgkJJHBhZ2VfYXR0YWNobWVudF91cmlzID0gYXJyYXkoKTsKCgkJZm9yZWFjaCAoICRwb3N0cyBhcyAkaWQgPT4gJHBvc3QgKSB7CgkJCS8vIFVSTCA9PiBwYWdlIG5hbWUKCQkJJHVyaSAgICAgICAgID0gZ2V0X3BhZ2VfdXJpKCAkaWQgKTsKCQkJJGF0dGFjaG1lbnRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkd3BkYi0+cHJlcGFyZSggIlNFTEVDVCBJRCwgcG9zdF9uYW1lLCBwb3N0X3BhcmVudCBGUk9NICR3cGRiLT5wb3N0cyBXSEVSRSBwb3N0X3R5cGUgPSAnYXR0YWNobWVudCcgQU5EIHBvc3RfcGFyZW50ID0gJWQiLCAkaWQgKSApOwoJCQlpZiAoICEgZW1wdHkoICRhdHRhY2htZW50cyApICkgewoJCQkJZm9yZWFjaCAoICRhdHRhY2htZW50cyBhcyAkYXR0YWNobWVudCApIHsKCQkJCQkkYXR0YWNoX3VyaSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfcGFnZV91cmkoICRhdHRhY2htZW50LT5JRCApOwoJCQkJCSRwYWdlX2F0dGFjaG1lbnRfdXJpc1sgJGF0dGFjaF91cmkgXSA9ICRhdHRhY2htZW50LT5JRDsKCQkJCX0KCQkJfQoKCQkJJHBhZ2VfdXJpc1sgJHVyaSBdID0gJGlkOwoJCX0KCgkJcmV0dXJuIGFycmF5KCAkcGFnZV91cmlzLCAkcGFnZV9hdHRhY2htZW50X3VyaXMgKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIHJld3JpdGUgcnVsZXMgZm9yIHBhZ2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gYXJyYXkgUGFnZSByZXdyaXRlIHJ1bGVzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcGFnZV9yZXdyaXRlX3J1bGVzKCkgewoJCS8vIFRoZSBleHRyYSAuPyBhdCB0aGUgYmVnaW5uaW5nIHByZXZlbnRzIGNsYXNoZXMgd2l0aCBvdGhlciByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSBydWxlcyBhcnJheS4KCQkkdGhpcy0+YWRkX3Jld3JpdGVfdGFnKCAnJXBhZ2VuYW1lJScsICcoLj8uKz8pJywgJ3BhZ2VuYW1lPScgKTsKCgkJcmV0dXJuICR0aGlzLT5nZW5lcmF0ZV9yZXdyaXRlX3J1bGVzKCAkdGhpcy0+Z2V0X3BhZ2VfcGVybWFzdHJ1Y3QoKSwgRVBfUEFHRVMsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSApOwoJfQoKCS8qKgoJICogUmV0cmlldmVzIGRhdGUgcGVybWFsaW5rIHN0cnVjdHVyZSwgd2l0aCB5ZWFyLCBtb250aCwgYW5kIGRheS4KCSAqCgkgKiBUaGUgcGVybWFsaW5rIHN0cnVjdHVyZSBmb3IgdGhlIGRhdGUsIGlmIG5vdCBzZXQgYWxyZWFkeSBkZXBlbmRzIG9uIHRoZQoJICogcGVybWFsaW5rIHN0cnVjdHVyZS4gSXQgY2FuIGJlIG9uZSBvZiB0aHJlZSBmb3JtYXRzLiBUaGUgZmlyc3QgaXMgeWVhciwKCSAqIG1vbnRoLCBkYXk7IHRoZSBzZWNvbmQgaXMgZGF5LCBtb250aCwgeWVhcjsgYW5kIHRoZSBsYXN0IGZvcm1hdCBpcyBtb250aCwKCSAqIGRheSwgeWVhci4gVGhlc2UgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgcGVybWFsaW5rIHN0cnVjdHVyZSBmb3Igd2hpY2gKCSAqIG9uZSBpcyB1c2VkLiBJZiBub25lIG1hdGNoZXMsIHRoZW4gdGhlIGRlZmF1bHQgd2lsbCBiZSB1c2VkLCB3aGljaCBpcwoJICogeWVhciwgbW9udGgsIGRheS4KCSAqCgkgKiBQcmV2ZW50cyBwb3N0IElEIGFuZCBkYXRlIHBlcm1hbGlua3MgZnJvbSBvdmVybGFwcGluZy4gSW4gdGhlIGNhc2Ugb2YKCSAqIHBvc3RfaWQsIHRoZSBkYXRlIHBlcm1hbGluayB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGZyb250IHBlcm1hbGluayB3aXRoCgkgKiAnZGF0ZS8nIGJlZm9yZSB0aGUgYWN0dWFsIHBlcm1hbGluayB0byBmb3JtIHRoZSBjb21wbGV0ZSBkYXRlIHBlcm1hbGluawoJICogc3RydWN0dXJlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfGZhbHNlIEZhbHNlIG9uIG5vIHBlcm1hbGluayBzdHJ1Y3R1cmUuIERhdGUgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9kYXRlX3Blcm1hc3RydWN0KCkgewoJCWlmICggaXNzZXQoICR0aGlzLT5kYXRlX3N0cnVjdHVyZSApICkgewoJCQlyZXR1cm4gJHRoaXMtPmRhdGVfc3RydWN0dXJlOwoJCX0KCgkJaWYgKCBlbXB0eSggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUgKSApIHsKCQkJJHRoaXMtPmRhdGVfc3RydWN0dXJlID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFRoZSBkYXRlIHBlcm1hbGluayBtdXN0IGhhdmUgeWVhciwgbW9udGgsIGFuZCBkYXkgc2VwYXJhdGVkIGJ5IHNsYXNoZXMuCgkJJGVuZGlhbnMgPSBhcnJheSggJyV5ZWFyJS8lbW9udGhudW0lLyVkYXklJywgJyVkYXklLyVtb250aG51bSUvJXllYXIlJywgJyVtb250aG51bSUvJWRheSUvJXllYXIlJyApOwoKCQkkdGhpcy0+ZGF0ZV9zdHJ1Y3R1cmUgPSAnJzsKCQkkZGF0ZV9lbmRpYW4gICAgICAgICAgPSAnJzsKCgkJZm9yZWFjaCAoICRlbmRpYW5zIGFzICRlbmRpYW4gKSB7CgkJCWlmICggZmFsc2UgIT09IHN0cnBvcyggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUsICRlbmRpYW4gKSApIHsKCQkJCSRkYXRlX2VuZGlhbiA9ICRlbmRpYW47CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJaWYgKCBlbXB0eSggJGRhdGVfZW5kaWFuICkgKSB7CgkJCSRkYXRlX2VuZGlhbiA9ICcleWVhciUvJW1vbnRobnVtJS8lZGF5JSc7CgkJfQoKCQkvKgoJCSAqIERvIG5vdCBhbGxvdyB0aGUgZGF0ZSB0YWdzIGFuZCAlcG9zdF9pZCUgdG8gb3ZlcmxhcCBpbiB0aGUgcGVybWFsaW5rCgkJICogc3RydWN0dXJlLiBJZiB0aGV5IGRvLCBtb3ZlIHRoZSBkYXRlIHRhZ3MgdG8gJGZyb250L2RhdGUvLgoJCSAqLwoJCSRmcm9udCA9ICR0aGlzLT5mcm9udDsKCQlwcmVnX21hdGNoX2FsbCggJy8lLis/JS8nLCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSwgJHRva2VucyApOwoJCSR0b2tfaW5kZXggPSAxOwoJCWZvcmVhY2ggKCAoYXJyYXkpICR0b2tlbnNbMF0gYXMgJHRva2VuICkgewoJCQlpZiAoICclcG9zdF9pZCUnID09ICR0b2tlbiAmJiAoICR0b2tfaW5kZXggPD0gMyApICkgewoJCQkJJGZyb250ID0gJGZyb250IC4gJ2RhdGUvJzsKCQkJCWJyZWFrOwoJCQl9CgkJCSR0b2tfaW5kZXgrKzsKCQl9CgoJCSR0aGlzLT5kYXRlX3N0cnVjdHVyZSA9ICRmcm9udCAuICRkYXRlX2VuZGlhbjsKCgkJcmV0dXJuICR0aGlzLT5kYXRlX3N0cnVjdHVyZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgeWVhciBwZXJtYWxpbmsgc3RydWN0dXJlIHdpdGhvdXQgbW9udGggYW5kIGRheS4KCSAqCgkgKiBHZXRzIHRoZSBkYXRlIHBlcm1hbGluayBzdHJ1Y3R1cmUgYW5kIHN0cmlwcyBvdXQgdGhlIG1vbnRoIGFuZCBkYXkKCSAqIHBlcm1hbGluayBzdHJ1Y3R1cmVzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gZmFsc2V8c3RyaW5nIEZhbHNlIG9uIGZhaWx1cmUuIFllYXIgc3RydWN0dXJlIG9uIHN1Y2Nlc3MuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfeWVhcl9wZXJtYXN0cnVjdCgpIHsKCQkkc3RydWN0dXJlID0gJHRoaXMtPmdldF9kYXRlX3Blcm1hc3RydWN0KCk7CgoJCWlmICggZW1wdHkoICRzdHJ1Y3R1cmUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHN0cnVjdHVyZSA9IHN0cl9yZXBsYWNlKCAnJW1vbnRobnVtJScsICcnLCAkc3RydWN0dXJlICk7CgkJJHN0cnVjdHVyZSA9IHN0cl9yZXBsYWNlKCAnJWRheSUnLCAnJywgJHN0cnVjdHVyZSApOwoJCSRzdHJ1Y3R1cmUgPSBwcmVnX3JlcGxhY2UoICcjLysjJywgJy8nLCAkc3RydWN0dXJlICk7CgoJCXJldHVybiAkc3RydWN0dXJlOwoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSBtb250aCBwZXJtYWxpbmsgc3RydWN0dXJlIHdpdGhvdXQgZGF5IGFuZCB3aXRoIHllYXIuCgkgKgoJICogR2V0cyB0aGUgZGF0ZSBwZXJtYWxpbmsgc3RydWN0dXJlIGFuZCBzdHJpcHMgb3V0IHRoZSBkYXkgcGVybWFsaW5rCgkgKiBzdHJ1Y3R1cmVzLiBLZWVwcyB0aGUgeWVhciBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gZmFsc2V8c3RyaW5nIEZhbHNlIG9uIGZhaWx1cmUuIFllYXIvTW9udGggc3RydWN0dXJlIG9uIHN1Y2Nlc3MuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbW9udGhfcGVybWFzdHJ1Y3QoKSB7CgkJJHN0cnVjdHVyZSA9ICR0aGlzLT5nZXRfZGF0ZV9wZXJtYXN0cnVjdCgpOwoKCQlpZiAoIGVtcHR5KCAkc3RydWN0dXJlICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRzdHJ1Y3R1cmUgPSBzdHJfcmVwbGFjZSggJyVkYXklJywgJycsICRzdHJ1Y3R1cmUgKTsKCQkkc3RydWN0dXJlID0gcHJlZ19yZXBsYWNlKCAnIy8rIycsICcvJywgJHN0cnVjdHVyZSApOwoKCQlyZXR1cm4gJHN0cnVjdHVyZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgZGF5IHBlcm1hbGluayBzdHJ1Y3R1cmUgd2l0aCBtb250aCBhbmQgeWVhci4KCSAqCgkgKiBLZWVwcyBkYXRlIHBlcm1hbGluayBzdHJ1Y3R1cmUgd2l0aCBhbGwgeWVhciwgbW9udGgsIGFuZCBkYXkuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgRmFsc2Ugb24gZmFpbHVyZS4gWWVhci9Nb250aC9EYXkgc3RydWN0dXJlIG9uIHN1Y2Nlc3MuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZGF5X3Blcm1hc3RydWN0KCkgewoJCXJldHVybiAkdGhpcy0+Z2V0X2RhdGVfcGVybWFzdHJ1Y3QoKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgcGVybWFsaW5rIHN0cnVjdHVyZSBmb3IgY2F0ZWdvcmllcy4KCSAqCgkgKiBJZiB0aGUgY2F0ZWdvcnlfYmFzZSBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUsIHRoZW4gdGhlIGNhdGVnb3J5IHN0cnVjdHVyZQoJICogd2lsbCBoYXZlIHRoZSBmcm9udCBwcm9wZXJ0eSB2YWx1ZSwgZm9sbG93ZWQgYnkgJ2NhdGVnb3J5JywgYW5kIGZpbmFsbHkKCSAqICclY2F0ZWdvcnklJy4gSWYgaXQgZG9lcywgdGhlbiB0aGUgcm9vdCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQsIGFsb25nIHdpdGgKCSAqIHRoZSBjYXRlZ29yeV9iYXNlIHByb3BlcnR5IHZhbHVlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfGZhbHNlIEZhbHNlIG9uIGZhaWx1cmUuIENhdGVnb3J5IHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY2F0ZWdvcnlfcGVybWFzdHJ1Y3QoKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRfZXh0cmFfcGVybWFzdHJ1Y3QoICdjYXRlZ29yeScgKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBwZXJtYWxpbmsgc3RydWN0dXJlIGZvciB0YWdzLgoJICoKCSAqIElmIHRoZSB0YWdfYmFzZSBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUsIHRoZW4gdGhlIHRhZyBzdHJ1Y3R1cmUgd2lsbCBoYXZlCgkgKiB0aGUgZnJvbnQgcHJvcGVydHkgdmFsdWUsIGZvbGxvd2VkIGJ5ICd0YWcnLCBhbmQgZmluYWxseSAnJXRhZyUnLiBJZiBpdAoJICogZG9lcywgdGhlbiB0aGUgcm9vdCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQsIGFsb25nIHdpdGggdGhlIHRhZ19iYXNlCgkgKiBwcm9wZXJ0eSB2YWx1ZS4KCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSBGYWxzZSBvbiBmYWlsdXJlLiBUYWcgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90YWdfcGVybWFzdHJ1Y3QoKSB7CgkJcmV0dXJuICR0aGlzLT5nZXRfZXh0cmFfcGVybWFzdHJ1Y3QoICdwb3N0X3RhZycgKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyBhbiBleHRyYSBwZXJtYWxpbmsgc3RydWN0dXJlIGJ5IG5hbWUuCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBQZXJtYWxpbmsgc3RydWN0dXJlIG5hbWUuCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSBGYWxzZSBpZiBub3QgZm91bmQuIFBlcm1hbGluayBzdHJ1Y3R1cmUgc3RyaW5nLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2V4dHJhX3Blcm1hc3RydWN0KCAkbmFtZSApIHsKCQlpZiAoIGVtcHR5KCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIGlzc2V0KCAkdGhpcy0+ZXh0cmFfcGVybWFzdHJ1Y3RzWyAkbmFtZSBdICkgKSB7CgkJCXJldHVybiAkdGhpcy0+ZXh0cmFfcGVybWFzdHJ1Y3RzWyAkbmFtZSBdWydzdHJ1Y3QnXTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgYXV0aG9yIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKgoJICogVGhlIHBlcm1hbGluayBzdHJ1Y3R1cmUgaXMgZnJvbnQgcHJvcGVydHksIGF1dGhvciBiYXNlLCBhbmQgZmluYWxseQoJICogJy8lYXV0aG9yJScuIFdpbGwgc2V0IHRoZSBhdXRob3Jfc3RydWN0dXJlIHByb3BlcnR5IGFuZCB0aGVuIHJldHVybiBpdAoJICogd2l0aG91dCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgdmFsdWUgYWdhaW4uCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgRmFsc2UgaWYgbm90IGZvdW5kLiBQZXJtYWxpbmsgc3RydWN0dXJlIHN0cmluZy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9hdXRob3JfcGVybWFzdHJ1Y3QoKSB7CgkJaWYgKCBpc3NldCggJHRoaXMtPmF1dGhvcl9zdHJ1Y3R1cmUgKSApIHsKCQkJcmV0dXJuICR0aGlzLT5hdXRob3Jfc3RydWN0dXJlOwoJCX0KCgkJaWYgKCBlbXB0eSggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUgKSApIHsKCQkJJHRoaXMtPmF1dGhvcl9zdHJ1Y3R1cmUgPSAnJzsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHRoaXMtPmF1dGhvcl9zdHJ1Y3R1cmUgPSAkdGhpcy0+ZnJvbnQgLiAkdGhpcy0+YXV0aG9yX2Jhc2UgLiAnLyVhdXRob3IlJzsKCgkJcmV0dXJuICR0aGlzLT5hdXRob3Jfc3RydWN0dXJlOwoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSBzZWFyY2ggcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqCgkgKiBUaGUgcGVybWFsaW5rIHN0cnVjdHVyZSBpcyByb290IHByb3BlcnR5LCBzZWFyY2ggYmFzZSwgYW5kIGZpbmFsbHkKCSAqICcvJXNlYXJjaCUnLiBXaWxsIHNldCB0aGUgc2VhcmNoX3N0cnVjdHVyZSBwcm9wZXJ0eSBhbmQgdGhlbiByZXR1cm4gaXQKCSAqIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBzZXQgdGhlIHZhbHVlIGFnYWluLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfGZhbHNlIEZhbHNlIGlmIG5vdCBmb3VuZC4gUGVybWFsaW5rIHN0cnVjdHVyZSBzdHJpbmcuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2VhcmNoX3Blcm1hc3RydWN0KCkgewoJCWlmICggaXNzZXQoICR0aGlzLT5zZWFyY2hfc3RydWN0dXJlICkgKSB7CgkJCXJldHVybiAkdGhpcy0+c2VhcmNoX3N0cnVjdHVyZTsKCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5wZXJtYWxpbmtfc3RydWN0dXJlICkgKSB7CgkJCSR0aGlzLT5zZWFyY2hfc3RydWN0dXJlID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5zZWFyY2hfc3RydWN0dXJlID0gJHRoaXMtPnJvb3QgLiAkdGhpcy0+c2VhcmNoX2Jhc2UgLiAnLyVzZWFyY2glJzsKCgkJcmV0dXJuICR0aGlzLT5zZWFyY2hfc3RydWN0dXJlOwoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSBwYWdlIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKgoJICogVGhlIHBlcm1hbGluayBzdHJ1Y3R1cmUgaXMgcm9vdCBwcm9wZXJ0eSwgYW5kICclcGFnZW5hbWUlJy4gV2lsbCBzZXQgdGhlCgkgKiBwYWdlX3N0cnVjdHVyZSBwcm9wZXJ0eSBhbmQgdGhlbiByZXR1cm4gaXQgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHNldCB0aGUKCSAqIHZhbHVlIGFnYWluLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfGZhbHNlIEZhbHNlIGlmIG5vdCBmb3VuZC4gUGVybWFsaW5rIHN0cnVjdHVyZSBzdHJpbmcuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGFnZV9wZXJtYXN0cnVjdCgpIHsKCQlpZiAoIGlzc2V0KCAkdGhpcy0+cGFnZV9zdHJ1Y3R1cmUgKSApIHsKCQkJcmV0dXJuICR0aGlzLT5wYWdlX3N0cnVjdHVyZTsKCQl9CgoJCWlmICggZW1wdHkoICR0aGlzLT5wZXJtYWxpbmtfc3RydWN0dXJlICkgKSB7CgkJCSR0aGlzLT5wYWdlX3N0cnVjdHVyZSA9ICcnOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkdGhpcy0+cGFnZV9zdHJ1Y3R1cmUgPSAkdGhpcy0+cm9vdCAuICclcGFnZW5hbWUlJzsKCgkJcmV0dXJuICR0aGlzLT5wYWdlX3N0cnVjdHVyZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgZmVlZCBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICoKCSAqIFRoZSBwZXJtYWxpbmsgc3RydWN0dXJlIGlzIHJvb3QgcHJvcGVydHksIGZlZWQgYmFzZSwgYW5kIGZpbmFsbHkKCSAqICcvJWZlZWQlJy4gV2lsbCBzZXQgdGhlIGZlZWRfc3RydWN0dXJlIHByb3BlcnR5IGFuZCB0aGVuIHJldHVybiBpdAoJICogd2l0aG91dCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgdmFsdWUgYWdhaW4uCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBzdHJpbmd8ZmFsc2UgRmFsc2UgaWYgbm90IGZvdW5kLiBQZXJtYWxpbmsgc3RydWN0dXJlIHN0cmluZy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9mZWVkX3Blcm1hc3RydWN0KCkgewoJCWlmICggaXNzZXQoICR0aGlzLT5mZWVkX3N0cnVjdHVyZSApICkgewoJCQlyZXR1cm4gJHRoaXMtPmZlZWRfc3RydWN0dXJlOwoJCX0KCgkJaWYgKCBlbXB0eSggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUgKSApIHsKCQkJJHRoaXMtPmZlZWRfc3RydWN0dXJlID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5mZWVkX3N0cnVjdHVyZSA9ICR0aGlzLT5yb290IC4gJHRoaXMtPmZlZWRfYmFzZSAuICcvJWZlZWQlJzsKCgkJcmV0dXJuICR0aGlzLT5mZWVkX3N0cnVjdHVyZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyB0aGUgY29tbWVudCBmZWVkIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKgoJICogVGhlIHBlcm1hbGluayBzdHJ1Y3R1cmUgaXMgcm9vdCBwcm9wZXJ0eSwgY29tbWVudCBiYXNlIHByb3BlcnR5LCBmZWVkCgkgKiBiYXNlIGFuZCBmaW5hbGx5ICcvJWZlZWQlJy4gV2lsbCBzZXQgdGhlIGNvbW1lbnRfZmVlZF9zdHJ1Y3R1cmUgcHJvcGVydHkKCSAqIGFuZCB0aGVuIHJldHVybiBpdCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gc2V0IHRoZSB2YWx1ZSBhZ2Fpbi4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSBGYWxzZSBpZiBub3QgZm91bmQuIFBlcm1hbGluayBzdHJ1Y3R1cmUgc3RyaW5nLgoJICovCgoJLyoqCgkgKiBBZGRzIG9yIHVwZGF0ZXMgZXhpc3RpbmcgcmV3cml0ZSB0YWdzIChlLmcuICVwb3N0bmFtZSUpLgoJICoKCSAqIElmIHRoZSB0YWcgYWxyZWFkeSBleGlzdHMsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHBhdHRlcm4gYW5kIHF1ZXJ5IGZvcgoJICogdGhhdCB0YWcsIG90aGVyd2lzZSBhZGQgdGhlIG5ldyB0YWcuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHNlZSBXUF9SZXdyaXRlOjokcmV3cml0ZWNvZGUKCSAqIEBzZWUgV1BfUmV3cml0ZTo6JHJld3JpdGVyZXBsYWNlCgkgKiBAc2VlIFdQX1Jld3JpdGU6OiRxdWVyeXJlcGxhY2UKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgICBOYW1lIG9mIHRoZSByZXdyaXRlIHRhZyB0byBhZGQgb3IgdXBkYXRlLgoJICogQHBhcmFtIHN0cmluZyAkcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIHN1YnN0aXR1dGUgdGhlIHRhZyBmb3IgaW4gcmV3cml0ZSBydWxlcy4KCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFN0cmluZyB0byBhcHBlbmQgdG8gdGhlIHJld3JpdHRlbiBxdWVyeS4gTXVzdCBlbmQgaW4gJz0nLgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX3Jld3JpdGVfdGFnKCAkdGFnLCAkcmVnZXgsICRxdWVyeSApIHsKCQkkcG9zaXRpb24gPSBhcnJheV9zZWFyY2goICR0YWcsICR0aGlzLT5yZXdyaXRlY29kZSApOwoJCWlmICggZmFsc2UgIT09ICRwb3NpdGlvbiAmJiBudWxsICE9PSAkcG9zaXRpb24gKSB7CgkJCSR0aGlzLT5yZXdyaXRlcmVwbGFjZVsgJHBvc2l0aW9uIF0gPSAkcmVnZXg7CgkJCSR0aGlzLT5xdWVyeXJlcGxhY2VbICRwb3NpdGlvbiBdICAgPSAkcXVlcnk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnJld3JpdGVjb2RlW10gICAgPSAkdGFnOwoJCQkkdGhpcy0+cmV3cml0ZXJlcGxhY2VbXSA9ICRyZWdleDsKCQkJJHRoaXMtPnF1ZXJ5cmVwbGFjZVtdICAgPSAkcXVlcnk7CgkJfQoJfQoKCgkvKioKCSAqIFJlbW92ZXMgYW4gZXhpc3RpbmcgcmV3cml0ZSB0YWcuCgkgKgoJICogQHNpbmNlIDQuNS4wCgkgKgoJICogQHNlZSBXUF9SZXdyaXRlOjokcmV3cml0ZWNvZGUKCSAqIEBzZWUgV1BfUmV3cml0ZTo6JHJld3JpdGVyZXBsYWNlCgkgKiBAc2VlIFdQX1Jld3JpdGU6OiRxdWVyeXJlcGxhY2UKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgTmFtZSBvZiB0aGUgcmV3cml0ZSB0YWcgdG8gcmVtb3ZlLgoJICovCgoJLyoqCgkgKiBHZW5lcmF0ZXMgcmV3cml0ZSBydWxlcyBmcm9tIGEgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqCgkgKiBUaGUgbWFpbiBXUF9SZXdyaXRlIGZ1bmN0aW9uIGZvciBidWlsZGluZyB0aGUgcmV3cml0ZSBydWxlIGxpc3QuIFRoZQoJICogY29udGVudHMgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgbWl4IG9mIGJsYWNrIG1hZ2ljIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zLAoJICogc28gYmVzdCBqdXN0IGlnbm9yZSB0aGUgY29udGVudHMgYW5kIG1vdmUgdG8gdGhlIHBhcmFtZXRlcnMuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcGVybWFsaW5rX3N0cnVjdHVyZSBUaGUgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqIEBwYXJhbSBpbnQgICAgJGVwX21hc2sgICAgICAgICAgICAgT3B0aW9uYWwuIEVuZHBvaW50IG1hc2sgZGVmaW5pbmcgd2hhdCBlbmRwb2ludHMgYXJlIGFkZGVkIHRvIHRoZSBzdHJ1Y3R1cmUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgYEVQX05PTkVgLCBgRVBfUEVSTUFMSU5LYCwgYEVQX0FUVEFDSE1FTlRgLCBgRVBfREFURWAsIGBFUF9ZRUFSYCwKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVQX01PTlRIYCwgYEVQX0RBWWAsIGBFUF9ST09UYCwgYEVQX0NPTU1FTlRTYCwgYEVQX1NFQVJDSGAsIGBFUF9DQVRFR09SSUVTYCwKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVQX1RBR1NgLCBgRVBfQVVUSE9SU2AsIGBFUF9QQUdFU2AsIGBFUF9BTExfQVJDSElWRVNgLCBhbmQgYEVQX0FMTGAuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgYEVQX05PTkVgLgoJICogQHBhcmFtIGJvb2wgICAkcGFnZWQgICAgICAgICAgICAgICBPcHRpb25hbC4gV2hldGhlciBhcmNoaXZlIHBhZ2luYXRpb24gcnVsZXMgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGUgc3RydWN0dXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRydWUuCgkgKiBAcGFyYW0gYm9vbCAgICRmZWVkICAgICAgICAgICAgICAgIE9wdGlvbmFsIFdoZXRoZXIgZmVlZCByZXdyaXRlIHJ1bGVzIHNob3VsZCBiZSBhZGRlZCBmb3IgdGhlIHN0cnVjdHVyZS4KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0cnVlLgoJICogQHBhcmFtIGJvb2wgICAkZm9yY29tbWVudHMgICAgICAgICBPcHRpb25hbC4gV2hldGhlciB0aGUgZmVlZCBydWxlcyBzaG91bGQgYmUgYSBxdWVyeSBmb3IgYSBjb21tZW50cyBmZWVkLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZhbHNlLgoJICogQHBhcmFtIGJvb2wgICAkd2Fsa19kaXJzICAgICAgICAgICBPcHRpb25hbC4gV2hldGhlciB0aGUgJ2RpcmVjdG9yaWVzJyBtYWtpbmcgdXAgdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgd2Fsa2VkCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXIgYW5kIHJld3JpdGUgcnVsZXMgYnVpbHQgZm9yIGVhY2ggaW4tdHVybi4gRGVmYXVsdCB0cnVlLgoJICogQHBhcmFtIGJvb2wgICAkZW5kcG9pbnRzICAgICAgICAgICBPcHRpb25hbC4gV2hldGhlciBlbmRwb2ludHMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGdlbmVyYXRlZCByZXdyaXRlIHJ1bGVzLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRydWUuCgkgKiBAcmV0dXJuIGFycmF5IFJld3JpdGUgcnVsZSBsaXN0LgoJICovCgoJLyoqCgkgKiBHZW5lcmF0ZXMgcmV3cml0ZSBydWxlcyB3aXRoIHBlcm1hbGluayBzdHJ1Y3R1cmUgYW5kIHdhbGtpbmcgZGlyZWN0b3J5IG9ubHkuCgkgKgoJICogU2hvcnRlbiB2ZXJzaW9uIG9mIFdQX1Jld3JpdGU6OmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoKSB0aGF0IGFsbG93cyBmb3Igc2hvcnRlcgoJICogbGlzdCBvZiBwYXJhbWV0ZXJzLiBTZWUgdGhlIG1ldGhvZCBmb3IgbG9uZ2VyIGRlc2NyaXB0aW9uIG9mIHdoYXQgZ2VuZXJhdGluZwoJICogcmV3cml0ZSBydWxlcyBkb2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBzZWUgV1BfUmV3cml0ZTo6Z2VuZXJhdGVfcmV3cml0ZV9ydWxlcygpIFNlZSBmb3IgbG9uZyBkZXNjcmlwdGlvbiBhbmQgcmVzdCBvZiBwYXJhbWV0ZXJzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBlcm1hbGlua19zdHJ1Y3R1cmUgVGhlIHBlcm1hbGluayBzdHJ1Y3R1cmUgdG8gZ2VuZXJhdGUgcnVsZXMuCgkgKiBAcGFyYW0gYm9vbCAgICR3YWxrX2RpcnMgICAgICAgICAgIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlLiBXaGV0aGVyIHRvIGNyZWF0ZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHdhbGsgb3Zlci4KCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlX3Jld3JpdGVfcnVsZSggJHBlcm1hbGlua19zdHJ1Y3R1cmUsICR3YWxrX2RpcnMgPSBmYWxzZSApIHsKCQlyZXR1cm4gJHRoaXMtPmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoICRwZXJtYWxpbmtfc3RydWN0dXJlLCBFUF9OT05FLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAkd2Fsa19kaXJzICk7Cgl9CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIHJld3JpdGUgbWF0Y2hlcyBhbmQgcXVlcmllcyBmcm9tIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKgoJICogUnVucyB0aGUgYWN0aW9uIHtAc2VlICdnZW5lcmF0ZV9yZXdyaXRlX3J1bGVzJ30gd2l0aCB0aGUgcGFyYW1ldGVyIHRoYXQgaXMgYW4KCSAqIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBXUF9SZXdyaXRlIGluc3RhbmNlIHRvIGZ1cnRoZXIgbWFuaXB1bGF0ZSB0aGUKCSAqIHBlcm1hbGluayBzdHJ1Y3R1cmVzIGFuZCByZXdyaXRlIHJ1bGVzLiBSdW5zIHRoZSB7QHNlZSAncmV3cml0ZV9ydWxlc19hcnJheSd9CgkgKiBmaWx0ZXIgb24gdGhlIGZ1bGwgcmV3cml0ZSBydWxlIGFycmF5LgoJICoKCSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYW5pcHVsYXRlIHRoZSByZXdyaXRlIHJ1bGVzLCBvbmUgYnkgaG9va2luZyBpbnRvCgkgKiB0aGUge0BzZWUgJ2dlbmVyYXRlX3Jld3JpdGVfcnVsZXMnfSBhY3Rpb24gYW5kIGdhaW5pbmcgZnVsbCBjb250cm9sIG9mIHRoZQoJICogb2JqZWN0IG9yIGp1c3QgbWFuaXB1bGF0aW5nIHRoZSByZXdyaXRlIHJ1bGUgYXJyYXkgYmVmb3JlIGl0IGlzIHBhc3NlZAoJICogZnJvbSB0aGUgZnVuY3Rpb24uCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHJldHVybiBhcnJheSBBbiBhc3NvY2lhdGUgYXJyYXkgb2YgbWF0Y2hlcyBhbmQgcXVlcmllcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJld3JpdGVfcnVsZXMoKSB7CgkJJHJld3JpdGUgPSBhcnJheSgpOwoKCQlpZiAoIGVtcHR5KCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSApICkgewoJCQlyZXR1cm4gJHJld3JpdGU7CgkJfQoKCQkvLyByb2JvdHMudHh0IC1vbmx5IGlmIGluc3RhbGxlZCBhdCB0aGUgcm9vdAoJCSRob21lX3BhdGggICAgICA9IHBhcnNlX3VybCggaG9tZV91cmwoKSApOwoJCSRyb2JvdHNfcmV3cml0ZSA9ICggZW1wdHkoICRob21lX3BhdGhbJ3BhdGgnXSApIHx8ICcvJyA9PSAkaG9tZV9wYXRoWydwYXRoJ10gKSA/IGFycmF5KCAncm9ib3RzXC50eHQkJyA9PiAkdGhpcy0+aW5kZXggLiAnP3JvYm90cz0xJyApIDogYXJyYXkoKTsKCgkJLy8gT2xkIGZlZWQgYW5kIHNlcnZpY2UgZmlsZXMuCgkJJGRlcHJlY2F0ZWRfZmlsZXMgPSBhcnJheSgKCQkJJy4qd3AtKGF0b218cmRmfHJzc3xyc3MyfGZlZWR8Y29tbWVudHNyc3MyKVwucGhwJCcgPT4gJHRoaXMtPmluZGV4IC4gJz9mZWVkPW9sZCcsCgkJCScuKndwLWFwcFwucGhwKC8uKik/JCcgPT4gJHRoaXMtPmluZGV4IC4gJz9lcnJvcj00MDMnLAoJCSk7CgoJCS8vIFJlZ2lzdHJhdGlvbiBydWxlcy4KCQkkcmVnaXN0cmF0aW9uX3BhZ2VzID0gYXJyYXkoKTsKCQlpZiAoIGlzX211bHRpc2l0ZSgpICYmIGlzX21haW5fc2l0ZSgpICkgewoJCQkkcmVnaXN0cmF0aW9uX3BhZ2VzWycuKndwLXNpZ251cC5waHAkJ10gICA9ICR0aGlzLT5pbmRleCAuICc/c2lnbnVwPXRydWUnOwoJCQkkcmVnaXN0cmF0aW9uX3BhZ2VzWycuKndwLWFjdGl2YXRlLnBocCQnXSA9ICR0aGlzLT5pbmRleCAuICc/YWN0aXZhdGU9dHJ1ZSc7CgkJfQoKCQkvLyBEZXByZWNhdGVkLgoJCSRyZWdpc3RyYXRpb25fcGFnZXNbJy4qd3AtcmVnaXN0ZXIucGhwJCddID0gJHRoaXMtPmluZGV4IC4gJz9yZWdpc3Rlcj10cnVlJzsKCgkJLy8gUG9zdCByZXdyaXRlIHJ1bGVzLgoJCSRwb3N0X3Jld3JpdGUgPSAkdGhpcy0+Z2VuZXJhdGVfcmV3cml0ZV9ydWxlcyggJHRoaXMtPnBlcm1hbGlua19zdHJ1Y3R1cmUsIEVQX1BFUk1BTElOSyApOwoKCQkvKioKCQkgKiBGaWx0ZXJzIHJld3JpdGUgcnVsZXMgdXNlZCBmb3IgInBvc3QiIGFyY2hpdmVzLgoJCSAqCgkJICogQHNpbmNlIDEuNS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJHBvc3RfcmV3cml0ZSBUaGUgcmV3cml0ZSBydWxlcyBmb3IgcG9zdHMuCgkJICovCgkJJHBvc3RfcmV3cml0ZSA9IGFwcGx5X2ZpbHRlcnMoICdwb3N0X3Jld3JpdGVfcnVsZXMnLCAkcG9zdF9yZXdyaXRlICk7CgoJCS8vIERhdGUgcmV3cml0ZSBydWxlcy4KCQkkZGF0ZV9yZXdyaXRlID0gJHRoaXMtPmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoICR0aGlzLT5nZXRfZGF0ZV9wZXJtYXN0cnVjdCgpLCBFUF9EQVRFICk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciBkYXRlIGFyY2hpdmVzLgoJCSAqCgkJICogTGlrZWx5IGRhdGUgYXJjaGl2ZXMgd291bGQgaW5jbHVkZSAveXl5eS8sIC95eXl5L21tLywgYW5kIC95eXl5L21tL2RkLy4KCQkgKgoJCSAqIEBzaW5jZSAxLjUuMAoJCSAqCgkJICogQHBhcmFtIGFycmF5ICRkYXRlX3Jld3JpdGUgVGhlIHJld3JpdGUgcnVsZXMgZm9yIGRhdGUgYXJjaGl2ZXMuCgkJICovCgkJJGRhdGVfcmV3cml0ZSA9IGFwcGx5X2ZpbHRlcnMoICdkYXRlX3Jld3JpdGVfcnVsZXMnLCAkZGF0ZV9yZXdyaXRlICk7CgoJCS8vIFJvb3QtbGV2ZWwgcmV3cml0ZSBydWxlcy4KCQkkcm9vdF9yZXdyaXRlID0gJHRoaXMtPmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoICR0aGlzLT5yb290IC4gJy8nLCBFUF9ST09UICk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciByb290LWxldmVsIGFyY2hpdmVzLgoJCSAqCgkJICogTGlrZWx5IHJvb3QtbGV2ZWwgYXJjaGl2ZXMgd291bGQgaW5jbHVkZSBwYWdpbmF0aW9uIHJ1bGVzIGZvciB0aGUgaG9tZXBhZ2UKCQkgKiBhcyB3ZWxsIGFzIHNpdGUtd2lkZSBwb3N0IGZlZWRzIChlLmcuIC9mZWVkLywgYW5kIC9mZWVkL2F0b20vKS4KCQkgKgoJCSAqIEBzaW5jZSAxLjUuMAoJCSAqCgkJICogQHBhcmFtIGFycmF5ICRyb290X3Jld3JpdGUgVGhlIHJvb3QtbGV2ZWwgcmV3cml0ZSBydWxlcy4KCQkgKi8KCQkkcm9vdF9yZXdyaXRlID0gYXBwbHlfZmlsdGVycyggJ3Jvb3RfcmV3cml0ZV9ydWxlcycsICRyb290X3Jld3JpdGUgKTsKCgkJLy8gQ29tbWVudHMgcmV3cml0ZSBydWxlcy4KCQkkY29tbWVudHNfcmV3cml0ZSA9ICR0aGlzLT5nZW5lcmF0ZV9yZXdyaXRlX3J1bGVzKCAkdGhpcy0+cm9vdCAuICR0aGlzLT5jb21tZW50c19iYXNlLCBFUF9DT01NRU5UUywgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlICk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciBjb21tZW50IGZlZWQgYXJjaGl2ZXMuCgkJICoKCQkgKiBMaWtlbHkgY29tbWVudHMgZmVlZCBhcmNoaXZlcyBpbmNsdWRlIC9jb21tZW50cy9mZWVkLywgYW5kIC9jb21tZW50cy9mZWVkL2F0b20vLgoJCSAqCgkJICogQHNpbmNlIDEuNS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJGNvbW1lbnRzX3Jld3JpdGUgVGhlIHJld3JpdGUgcnVsZXMgZm9yIHRoZSBzaXRlLXdpZGUgY29tbWVudHMgZmVlZHMuCgkJICovCgkJJGNvbW1lbnRzX3Jld3JpdGUgPSBhcHBseV9maWx0ZXJzKCAnY29tbWVudHNfcmV3cml0ZV9ydWxlcycsICRjb21tZW50c19yZXdyaXRlICk7CgoJCS8vIFNlYXJjaCByZXdyaXRlIHJ1bGVzLgoJCSRzZWFyY2hfc3RydWN0dXJlID0gJHRoaXMtPmdldF9zZWFyY2hfcGVybWFzdHJ1Y3QoKTsKCQkkc2VhcmNoX3Jld3JpdGUgICA9ICR0aGlzLT5nZW5lcmF0ZV9yZXdyaXRlX3J1bGVzKCAkc2VhcmNoX3N0cnVjdHVyZSwgRVBfU0VBUkNIICk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciBzZWFyY2ggYXJjaGl2ZXMuCgkJICoKCQkgKiBMaWtlbHkgc2VhcmNoLXJlbGF0ZWQgYXJjaGl2ZXMgaW5jbHVkZSAvc2VhcmNoL3NlYXJjaCtxdWVyeS8gYXMgd2VsbCBhcwoJCSAqIHBhZ2luYXRpb24gYW5kIGZlZWQgcGF0aHMgZm9yIGEgc2VhcmNoLgoJCSAqCgkJICogQHNpbmNlIDEuNS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJHNlYXJjaF9yZXdyaXRlIFRoZSByZXdyaXRlIHJ1bGVzIGZvciBzZWFyY2ggcXVlcmllcy4KCQkgKi8KCQkkc2VhcmNoX3Jld3JpdGUgPSBhcHBseV9maWx0ZXJzKCAnc2VhcmNoX3Jld3JpdGVfcnVsZXMnLCAkc2VhcmNoX3Jld3JpdGUgKTsKCgkJLy8gQXV0aG9yIHJld3JpdGUgcnVsZXMuCgkJJGF1dGhvcl9yZXdyaXRlID0gJHRoaXMtPmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoICR0aGlzLT5nZXRfYXV0aG9yX3Blcm1hc3RydWN0KCksIEVQX0FVVEhPUlMgKTsKCgkJLyoqCgkJICogRmlsdGVycyByZXdyaXRlIHJ1bGVzIHVzZWQgZm9yIGF1dGhvciBhcmNoaXZlcy4KCQkgKgoJCSAqIExpa2VseSBhdXRob3IgYXJjaGl2ZXMgd291bGQgaW5jbHVkZSAvYXV0aG9yL2F1dGhvci1uYW1lLywgYXMgd2VsbCBhcwoJCSAqIHBhZ2luYXRpb24gYW5kIGZlZWQgcGF0aHMgZm9yIGF1dGhvciBhcmNoaXZlcy4KCQkgKgoJCSAqIEBzaW5jZSAxLjUuMAoJCSAqCgkJICogQHBhcmFtIGFycmF5ICRhdXRob3JfcmV3cml0ZSBUaGUgcmV3cml0ZSBydWxlcyBmb3IgYXV0aG9yIGFyY2hpdmVzLgoJCSAqLwoJCSRhdXRob3JfcmV3cml0ZSA9IGFwcGx5X2ZpbHRlcnMoICdhdXRob3JfcmV3cml0ZV9ydWxlcycsICRhdXRob3JfcmV3cml0ZSApOwoKCQkvLyBQYWdlcyByZXdyaXRlIHJ1bGVzLgoJCSRwYWdlX3Jld3JpdGUgPSAkdGhpcy0+cGFnZV9yZXdyaXRlX3J1bGVzKCk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciAicGFnZSIgcG9zdCB0eXBlIGFyY2hpdmVzLgoJCSAqCgkJICogQHNpbmNlIDEuNS4wCgkJICoKCQkgKiBAcGFyYW0gYXJyYXkgJHBhZ2VfcmV3cml0ZSBUaGUgcmV3cml0ZSBydWxlcyBmb3IgdGhlICJwYWdlIiBwb3N0IHR5cGUuCgkJICovCgkJJHBhZ2VfcmV3cml0ZSA9IGFwcGx5X2ZpbHRlcnMoICdwYWdlX3Jld3JpdGVfcnVsZXMnLCAkcGFnZV9yZXdyaXRlICk7CgoJCS8vIEV4dHJhIHBlcm1hc3RydWN0cy4KCQlmb3JlYWNoICggJHRoaXMtPmV4dHJhX3Blcm1hc3RydWN0cyBhcyAkcGVybWFzdHJ1Y3RuYW1lID0+ICRzdHJ1Y3QgKSB7CgkJCWlmICggaXNfYXJyYXkoICRzdHJ1Y3QgKSApIHsKCQkJCWlmICggY291bnQoICRzdHJ1Y3QgKSA9PSAyICkgewoJCQkJCSRydWxlcyA9ICR0aGlzLT5nZW5lcmF0ZV9yZXdyaXRlX3J1bGVzKCAkc3RydWN0WzBdLCAkc3RydWN0WzFdICk7CgkJCQl9IGVsc2UgewoJCQkJCSRydWxlcyA9ICR0aGlzLT5nZW5lcmF0ZV9yZXdyaXRlX3J1bGVzKCAkc3RydWN0WydzdHJ1Y3QnXSwgJHN0cnVjdFsnZXBfbWFzayddLCAkc3RydWN0WydwYWdlZCddLCAkc3RydWN0WydmZWVkJ10sICRzdHJ1Y3RbJ2ZvcmNvbW1lbnRzJ10sICRzdHJ1Y3RbJ3dhbGtfZGlycyddLCAkc3RydWN0WydlbmRwb2ludHMnXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHJ1bGVzID0gJHRoaXMtPmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoICRzdHJ1Y3QgKTsKCQkJfQoKCQkJLyoqCgkJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIGZvciBpbmRpdmlkdWFsIHBlcm1hc3RydWN0cy4KCQkJICoKCQkJICogVGhlIGR5bmFtaWMgcG9ydGlvbiBvZiB0aGUgaG9vayBuYW1lLCBgJHBlcm1hc3RydWN0bmFtZWAsIHJlZmVycwoJCQkgKiB0byB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBwZXJtYXN0cnVjdCwgZS5nLiAncG9zdF90YWcnICh0YWdzKSwKCQkJICogJ2NhdGVnb3J5JyAoY2F0ZWdvcmllcyksIGV0Yy4KCQkJICoKCQkJICogQHNpbmNlIDMuMS4wCgkJCSAqCgkJCSAqIEBwYXJhbSBhcnJheSAkcnVsZXMgVGhlIHJld3JpdGUgcnVsZXMgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBwZXJtYXN0cnVjdC4KCQkJICovCgkJCSRydWxlcyA9IGFwcGx5X2ZpbHRlcnMoICJ7JHBlcm1hc3RydWN0bmFtZX1fcmV3cml0ZV9ydWxlcyIsICRydWxlcyApOwoJCQlpZiAoICdwb3N0X3RhZycgPT0gJHBlcm1hc3RydWN0bmFtZSApIHsKCgkJCQkvKioKCQkJCSAqIEZpbHRlcnMgcmV3cml0ZSBydWxlcyB1c2VkIHNwZWNpZmljYWxseSBmb3IgVGFncy4KCQkJCSAqCgkJCQkgKiBAc2luY2UgMi4zLjAKCQkJCSAqIEBkZXByZWNhdGVkIDMuMS4wIFVzZSAncG9zdF90YWdfcmV3cml0ZV9ydWxlcycgaW5zdGVhZAoJCQkJICoKCQkJCSAqIEBwYXJhbSBhcnJheSAkcnVsZXMgVGhlIHJld3JpdGUgcnVsZXMgZ2VuZXJhdGVkIGZvciB0YWdzLgoJCQkJICovCgkJCQkkcnVsZXMgPSBhcHBseV9maWx0ZXJzKCAndGFnX3Jld3JpdGVfcnVsZXMnLCAkcnVsZXMgKTsKCQkJfQoKCQkJJHRoaXMtPmV4dHJhX3J1bGVzX3RvcCA9IGFycmF5X21lcmdlKCAkdGhpcy0+ZXh0cmFfcnVsZXNfdG9wLCAkcnVsZXMgKTsKCQl9CgoJCS8vIFB1dCB0aGVtIHRvZ2V0aGVyLgoJCWlmICggJHRoaXMtPnVzZV92ZXJib3NlX3BhZ2VfcnVsZXMgKSB7CgkJCSR0aGlzLT5ydWxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+ZXh0cmFfcnVsZXNfdG9wLCAkcm9ib3RzX3Jld3JpdGUsICRkZXByZWNhdGVkX2ZpbGVzLCAkcmVnaXN0cmF0aW9uX3BhZ2VzLCAkcm9vdF9yZXdyaXRlLCAkY29tbWVudHNfcmV3cml0ZSwgJHNlYXJjaF9yZXdyaXRlLCAkYXV0aG9yX3Jld3JpdGUsICRkYXRlX3Jld3JpdGUsICRwYWdlX3Jld3JpdGUsICRwb3N0X3Jld3JpdGUsICR0aGlzLT5leHRyYV9ydWxlcyApOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5ydWxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+ZXh0cmFfcnVsZXNfdG9wLCAkcm9ib3RzX3Jld3JpdGUsICRkZXByZWNhdGVkX2ZpbGVzLCAkcmVnaXN0cmF0aW9uX3BhZ2VzLCAkcm9vdF9yZXdyaXRlLCAkY29tbWVudHNfcmV3cml0ZSwgJHNlYXJjaF9yZXdyaXRlLCAkYXV0aG9yX3Jld3JpdGUsICRkYXRlX3Jld3JpdGUsICRwb3N0X3Jld3JpdGUsICRwYWdlX3Jld3JpdGUsICR0aGlzLT5leHRyYV9ydWxlcyApOwoJCX0KCgkJLyoqCgkJICogRmlyZXMgYWZ0ZXIgdGhlIHJld3JpdGUgcnVsZXMgYXJlIGdlbmVyYXRlZC4KCQkgKgoJCSAqIEBzaW5jZSAxLjUuMAoJCSAqCgkJICogQHBhcmFtIFdQX1Jld3JpdGUgJHRoaXMgQ3VycmVudCBXUF9SZXdyaXRlIGluc3RhbmNlIChwYXNzZWQgYnkgcmVmZXJlbmNlKS4KCQkgKi8KCQlkb19hY3Rpb25fcmVmX2FycmF5KCAnZ2VuZXJhdGVfcmV3cml0ZV9ydWxlcycsIGFycmF5KCAmJHRoaXMgKSApOwoKCQkvKioKCQkgKiBGaWx0ZXJzIHRoZSBmdWxsIHNldCBvZiBnZW5lcmF0ZWQgcmV3cml0ZSBydWxlcy4KCQkgKgoJCSAqIEBzaW5jZSAxLjUuMAoJCSAqCgkJICogQHBhcmFtIGFycmF5ICR0aGlzLT5ydWxlcyBUaGUgY29tcGlsZWQgYXJyYXkgb2YgcmV3cml0ZSBydWxlcy4KCQkgKi8KCQkkdGhpcy0+cnVsZXMgPSBhcHBseV9maWx0ZXJzKCAncmV3cml0ZV9ydWxlc19hcnJheScsICR0aGlzLT5ydWxlcyApOwoKCQlyZXR1cm4gJHRoaXMtPnJ1bGVzOwoJfQoKCS8qKgoJICogUmV0cmlldmVzIHRoZSByZXdyaXRlIHJ1bGVzLgoJICoKCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIFdQX1Jld3JpdGU6OnJld3JpdGVfcnVsZXMoKSBpcyB0aGF0CgkgKiB0aGlzIG1ldGhvZCBzdG9yZXMgdGhlIHJld3JpdGUgcnVsZXMgaW4gdGhlICdyZXdyaXRlX3J1bGVzJyBvcHRpb24gYW5kIHJldHJpZXZlcwoJICogaXQuIFRoaXMgcHJldmVudHMgaGF2aW5nIHRvIHByb2Nlc3MgYWxsIG9mIHRoZSBwZXJtYWxpbmtzIHRvIGdldCB0aGUgcmV3cml0ZSBydWxlcwoJICogaW4gdGhlIGZvcm0gb2YgY2FjaGluZy4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcmV0dXJuIGFycmF5IFJld3JpdGUgcnVsZXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB3cF9yZXdyaXRlX3J1bGVzKCkgewoJCSR0aGlzLT5ydWxlcyA9IGdldF9vcHRpb24oICdyZXdyaXRlX3J1bGVzJyApOwoJCWlmICggZW1wdHkoICR0aGlzLT5ydWxlcyApICkgewoJCQkkdGhpcy0+bWF0Y2hlcyA9ICdtYXRjaGVzJzsKCQkJJHRoaXMtPnJld3JpdGVfcnVsZXMoKTsKCQkJaWYgKCAhIGRpZF9hY3Rpb24oICd3cF9sb2FkZWQnICkgKSB7CgkJCQlhZGRfYWN0aW9uKCAnd3BfbG9hZGVkJywgYXJyYXkoICR0aGlzLCAnZmx1c2hfcnVsZXMnICkgKTsKCQkJCXJldHVybiAkdGhpcy0+cnVsZXM7CgkJCX0KCQkJdXBkYXRlX29wdGlvbiggJ3Jld3JpdGVfcnVsZXMnLCAkdGhpcy0+cnVsZXMgKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+cnVsZXM7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgbW9kX3Jld3JpdGUtZm9ybWF0dGVkIHJld3JpdGUgcnVsZXMgdG8gd3JpdGUgdG8gLmh0YWNjZXNzLgoJICoKCSAqIERvZXMgbm90IGFjdHVhbGx5IHdyaXRlIHRvIHRoZSAuaHRhY2Nlc3MgZmlsZSwgYnV0IGNyZWF0ZXMgdGhlIHJ1bGVzIGZvcgoJICogdGhlIHByb2Nlc3MgdGhhdCB3aWxsLgoJICoKCSAqIFdpbGwgYWRkIHRoZSBub25fd3BfcnVsZXMgcHJvcGVydHkgcnVsZXMgdG8gdGhlIC5odGFjY2VzcyBmaWxlIGJlZm9yZQoJICogdGhlIFdvcmRQcmVzcyByZXdyaXRlIHJ1bGVzIG9uZS4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gbW9kX3Jld3JpdGVfcnVsZXMoKSB7CgkJaWYgKCAhICR0aGlzLT51c2luZ19wZXJtYWxpbmtzKCkgKSB7CgkJCXJldHVybiAnJzsKCQl9CgoJCSRzaXRlX3Jvb3QgPSBwYXJzZV91cmwoIHNpdGVfdXJsKCkgKTsKCQlpZiAoIGlzc2V0KCAkc2l0ZV9yb290WydwYXRoJ10gKSApIHsKCQkJJHNpdGVfcm9vdCA9IHRyYWlsaW5nc2xhc2hpdCggJHNpdGVfcm9vdFsncGF0aCddICk7CgkJfQoKCQkkaG9tZV9yb290ID0gcGFyc2VfdXJsKCBob21lX3VybCgpICk7CgkJaWYgKCBpc3NldCggJGhvbWVfcm9vdFsncGF0aCddICkgKSB7CgkJCSRob21lX3Jvb3QgPSB0cmFpbGluZ3NsYXNoaXQoICRob21lX3Jvb3RbJ3BhdGgnXSApOwoJCX0gZWxzZSB7CgkJCSRob21lX3Jvb3QgPSAnLyc7CgkJfQoKCQkkcnVsZXMgID0gIjxJZk1vZHVsZSBtb2RfcmV3cml0ZS5jPlxuIjsKCQkkcnVsZXMgLj0gIlJld3JpdGVFbmdpbmUgT25cbiI7CgkJJHJ1bGVzIC49ICJSZXdyaXRlQmFzZSAkaG9tZV9yb290XG4iOwoKCQkvLyBQcmV2ZW50IC1mIGNoZWNrcyBvbiBpbmRleC5waHAuCgkJJHJ1bGVzIC49ICJSZXdyaXRlUnVsZSBeaW5kZXhcLnBocCQgLSBbTF1cbiI7CgoJCS8vIEFkZCBpbiB0aGUgcnVsZXMgdGhhdCBkb24ndCByZWRpcmVjdCB0byBXUCdzIGluZGV4LnBocCAoYW5kIHRodXMgc2hvdWxkbid0IGJlIGhhbmRsZWQgYnkgV1AgYXQgYWxsKS4KCQlmb3JlYWNoICggKGFycmF5KSAkdGhpcy0+bm9uX3dwX3J1bGVzIGFzICRtYXRjaCA9PiAkcXVlcnkgKSB7CgkJCS8vIEFwYWNoZSAxLjMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVsdWN0YW50IChub24tZ3JlZWR5KSBtb2RpZmllci4KCQkJJG1hdGNoID0gc3RyX3JlcGxhY2UoICcuKz8nLCAnLisnLCAkbWF0Y2ggKTsKCgkJCSRydWxlcyAuPSAnUmV3cml0ZVJ1bGUgXicgLiAkbWF0Y2ggLiAnICcgLiAkaG9tZV9yb290IC4gJHF1ZXJ5IC4gIiBbUVNBLExdXG4iOwoJCX0KCgkJaWYgKCAkdGhpcy0+dXNlX3ZlcmJvc2VfcnVsZXMgKSB7CgkJCSR0aGlzLT5tYXRjaGVzID0gJyc7CgkJCSRyZXdyaXRlICAgICAgID0gJHRoaXMtPnJld3JpdGVfcnVsZXMoKTsKCQkJJG51bV9ydWxlcyAgICAgPSBjb3VudCggJHJld3JpdGUgKTsKCQkJJHJ1bGVzICAgICAgICAuPSAiUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAtZiBbT1JdXG4iIC4KCQkJCSJSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9IC1kXG4iIC4KCQkJCSJSZXdyaXRlUnVsZSBeLiokIC0gW1M9JG51bV9ydWxlc11cbiI7CgoJCQlmb3JlYWNoICggKGFycmF5KSAkcmV3cml0ZSBhcyAkbWF0Y2ggPT4gJHF1ZXJ5ICkgewoJCQkJLy8gQXBhY2hlIDEuMyBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZWx1Y3RhbnQgKG5vbi1ncmVlZHkpIG1vZGlmaWVyLgoJCQkJJG1hdGNoID0gc3RyX3JlcGxhY2UoICcuKz8nLCAnLisnLCAkbWF0Y2ggKTsKCgkJCQlpZiAoIHN0cnBvcyggJHF1ZXJ5LCAkdGhpcy0+aW5kZXggKSAhPT0gZmFsc2UgKSB7CgkJCQkJJHJ1bGVzIC49ICdSZXdyaXRlUnVsZSBeJyAuICRtYXRjaCAuICcgJyAuICRob21lX3Jvb3QgLiAkcXVlcnkgLiAiIFtRU0EsTF1cbiI7CgkJCQl9IGVsc2UgewoJCQkJCSRydWxlcyAuPSAnUmV3cml0ZVJ1bGUgXicgLiAkbWF0Y2ggLiAnICcgLiAkc2l0ZV9yb290IC4gJHF1ZXJ5IC4gIiBbUVNBLExdXG4iOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJJHJ1bGVzIC49ICJSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZlxuIiAuCgkJCQkiUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWRcbiIgLgoJCQkJIlJld3JpdGVSdWxlIC4geyRob21lX3Jvb3R9eyR0aGlzLT5pbmRleH0gW0xdXG4iOwoJCX0KCgkJJHJ1bGVzIC49ICI8L0lmTW9kdWxlPlxuIjsKCgkJLyoqCgkJICogRmlsdGVycyB0aGUgbGlzdCBvZiByZXdyaXRlIHJ1bGVzIGZvcm1hdHRlZCBmb3Igb3V0cHV0IHRvIGFuIC5odGFjY2VzcyBmaWxlLgoJCSAqCgkJICogQHNpbmNlIDEuNS4wCgkJICoKCQkgKiBAcGFyYW0gc3RyaW5nICRydWxlcyBtb2RfcmV3cml0ZSBSZXdyaXRlIHJ1bGVzIGZvcm1hdHRlZCBmb3IgLmh0YWNjZXNzLgoJCSAqLwoJCSRydWxlcyA9IGFwcGx5X2ZpbHRlcnMoICdtb2RfcmV3cml0ZV9ydWxlcycsICRydWxlcyApOwoKCQkvKioKCQkgKiBGaWx0ZXJzIHRoZSBsaXN0IG9mIHJld3JpdGUgcnVsZXMgZm9ybWF0dGVkIGZvciBvdXRwdXQgdG8gYW4gLmh0YWNjZXNzIGZpbGUuCgkJICoKCQkgKiBAc2luY2UgMS41LjAKCQkgKiBAZGVwcmVjYXRlZCAxLjUuMCBVc2UgdGhlIG1vZF9yZXdyaXRlX3J1bGVzIGZpbHRlciBpbnN0ZWFkLgoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgbW9kX3Jld3JpdGUgUmV3cml0ZSBydWxlcyBmb3JtYXR0ZWQgZm9yIC5odGFjY2Vzcy4KCQkgKi8KCQlyZXR1cm4gYXBwbHlfZmlsdGVycyggJ3Jld3JpdGVfcnVsZXMnLCAkcnVsZXMgKTsKCX0KCgkvKioKCSAqIFJldHJpZXZlcyBJSVM3IFVSTCBSZXdyaXRlIGZvcm1hdHRlZCByZXdyaXRlIHJ1bGVzIHRvIHdyaXRlIHRvIHdlYi5jb25maWcgZmlsZS4KCSAqCgkgKiBEb2VzIG5vdCBhY3R1YWxseSB3cml0ZSB0byB0aGUgd2ViLmNvbmZpZyBmaWxlLCBidXQgY3JlYXRlcyB0aGUgcnVsZXMgZm9yCgkgKiB0aGUgcHJvY2VzcyB0aGF0IHdpbGwuCgkgKgoJICogQHNpbmNlIDIuOC4wCgkgKgoJICogQHBhcmFtIGJvb2wgJGFkZF9wYXJlbnRfdGFncyBPcHRpb25hbC4gV2hldGhlciB0byBhZGQgcGFyZW50IHRhZ3MgdG8gdGhlIHJld3JpdGUgcnVsZSBzZXRzLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZhbHNlLgoJICogQHJldHVybiBzdHJpbmcgSUlTNyBVUkwgcmV3cml0ZSBydWxlIHNldHMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpaXM3X3VybF9yZXdyaXRlX3J1bGVzKCAkYWRkX3BhcmVudF90YWdzID0gZmFsc2UgKSB7CgkJaWYgKCAhICR0aGlzLT51c2luZ19wZXJtYWxpbmtzKCkgKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJHJ1bGVzID0gJyc7CgkJaWYgKCAkYWRkX3BhcmVudF90YWdzICkgewoJCQkkcnVsZXMgLj0gJzxjb25maWd1cmF0aW9uPgoJPHN5c3RlbS53ZWJTZXJ2ZXI+CgkJPHJld3JpdGU+CgkJCTxydWxlcz4nOwoJCX0KCgkJJHJ1bGVzIC49ICcKCQkJPHJ1bGUgbmFtZT0iV29yZFByZXNzOiAnIC4gZXNjX2F0dHIoIGhvbWVfdXJsKCkgKSAuICciIHBhdHRlcm5TeW50YXg9IldpbGRjYXJkIj4KCQkJCTxtYXRjaCB1cmw9IioiIC8+CgkJCQkJPGNvbmRpdGlvbnM+CgkJCQkJCTxhZGQgaW5wdXQ9IntSRVFVRVNUX0ZJTEVOQU1FfSIgbWF0Y2hUeXBlPSJJc0ZpbGUiIG5lZ2F0ZT0idHJ1ZSIgLz4KCQkJCQkJPGFkZCBpbnB1dD0ie1JFUVVFU1RfRklMRU5BTUV9IiBtYXRjaFR5cGU9IklzRGlyZWN0b3J5IiBuZWdhdGU9InRydWUiIC8+CgkJCQkJPC9jb25kaXRpb25zPgoJCQkJPGFjdGlvbiB0eXBlPSJSZXdyaXRlIiB1cmw9ImluZGV4LnBocCIgLz4KCQkJPC9ydWxlPic7CgoJCWlmICggJGFkZF9wYXJlbnRfdGFncyApIHsKCQkJJHJ1bGVzIC49ICcKCQkJPC9ydWxlcz4KCQk8L3Jld3JpdGU+Cgk8L3N5c3RlbS53ZWJTZXJ2ZXI+CjwvY29uZmlndXJhdGlvbj4nOwoJCX0KCgkJLyoqCgkJICogRmlsdGVycyB0aGUgbGlzdCBvZiByZXdyaXRlIHJ1bGVzIGZvcm1hdHRlZCBmb3Igb3V0cHV0IHRvIGEgd2ViLmNvbmZpZy4KCQkgKgoJCSAqIEBzaW5jZSAyLjguMAoJCSAqCgkJICogQHBhcmFtIHN0cmluZyAkcnVsZXMgUmV3cml0ZSBydWxlcyBmb3JtYXR0ZWQgZm9yIElJUyB3ZWIuY29uZmlnLgoJCSAqLwoJCXJldHVybiBhcHBseV9maWx0ZXJzKCAnaWlzN191cmxfcmV3cml0ZV9ydWxlcycsICRydWxlcyApOwoJfQoKCS8qKgoJICogQWRkcyBhIHJld3JpdGUgcnVsZSB0aGF0IHRyYW5zZm9ybXMgYSBVUkwgc3RydWN0dXJlIHRvIGEgc2V0IG9mIHF1ZXJ5IHZhcnMuCgkgKgoJICogQW55IHZhbHVlIGluIHRoZSAkYWZ0ZXIgcGFyYW1ldGVyIHRoYXQgaXNuJ3QgJ2JvdHRvbScgd2lsbCByZXN1bHQgaW4gdGhlIHJ1bGUKCSAqIGJlaW5nIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSByZXdyaXRlIHJ1bGVzLgoJICoKCSAqIEBzaW5jZSAyLjEuMAoJICogQHNpbmNlIDQuNC4wIEFycmF5IHN1cHBvcnQgd2FzIGFkZGVkIHRvIHRoZSBgJHF1ZXJ5YCBwYXJhbWV0ZXIuCgkgKgoJICogQHBhcmFtIHN0cmluZyAgICAgICAkcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHJlcXVlc3QgYWdhaW5zdC4KCSAqIEBwYXJhbSBzdHJpbmd8YXJyYXkgJHF1ZXJ5IFRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IHZhcnMgZm9yIHRoaXMgcmV3cml0ZSBydWxlLgoJICogQHBhcmFtIHN0cmluZyAgICAgICAkYWZ0ZXIgT3B0aW9uYWwuIFByaW9yaXR5IG9mIHRoZSBuZXcgcnVsZS4gQWNjZXB0cyAndG9wJwoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ2JvdHRvbScuIERlZmF1bHQgJ2JvdHRvbScuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfcnVsZSggJHJlZ2V4LCAkcXVlcnksICRhZnRlciA9ICdib3R0b20nICkgewoJCWlmICggaXNfYXJyYXkoICRxdWVyeSApICkgewoJCQkkZXh0ZXJuYWwgPSBmYWxzZTsKCQkJJHF1ZXJ5ICAgID0gYWRkX3F1ZXJ5X2FyZyggJHF1ZXJ5LCAnaW5kZXgucGhwJyApOwoJCX0gZWxzZSB7CgkJCSRpbmRleCA9IGZhbHNlID09PSBzdHJwb3MoICRxdWVyeSwgJz8nICkgPyBzdHJsZW4oICRxdWVyeSApIDogc3RycG9zKCAkcXVlcnksICc/JyApOwoJCQkkZnJvbnQgPSBzdWJzdHIoICRxdWVyeSwgMCwgJGluZGV4ICk7CgoJCQkkZXh0ZXJuYWwgPSAkZnJvbnQgIT0gJHRoaXMtPmluZGV4OwoJCX0KCgkJLy8gImV4dGVybmFsIiA9IGl0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBpbmRleC5waHAuCgkJaWYgKCAkZXh0ZXJuYWwgKSB7CgkJCSR0aGlzLT5hZGRfZXh0ZXJuYWxfcnVsZSggJHJlZ2V4LCAkcXVlcnkgKTsKCQl9IGVsc2UgewoJCQlpZiAoICdib3R0b20nID09ICRhZnRlciApIHsKCQkJCSR0aGlzLT5leHRyYV9ydWxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+ZXh0cmFfcnVsZXMsIGFycmF5KCAkcmVnZXggPT4gJHF1ZXJ5ICkgKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5leHRyYV9ydWxlc190b3AgPSBhcnJheV9tZXJnZSggJHRoaXMtPmV4dHJhX3J1bGVzX3RvcCwgYXJyYXkoICRyZWdleCA9PiAkcXVlcnkgKSApOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogQWRkcyBhIHJld3JpdGUgcnVsZSB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBpbmRleC5waHAuCgkgKgoJICogQHNpbmNlIDIuMS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHJlcXVlc3QgYWdhaW5zdC4KCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IHZhcnMgZm9yIHRoaXMgcmV3cml0ZSBydWxlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX2V4dGVybmFsX3J1bGUoICRyZWdleCwgJHF1ZXJ5ICkgewoJCSR0aGlzLT5ub25fd3BfcnVsZXNbICRyZWdleCBdID0gJHF1ZXJ5OwoJfQoKCS8qKgoJICogQWRkcyBhbiBlbmRwb2ludCwgbGlrZSAvdHJhY2tiYWNrLy4KCSAqCgkgKiBAc2luY2UgMi4xLjAKCSAqIEBzaW5jZSAzLjkuMCAkcXVlcnlfdmFyIHBhcmFtZXRlciBhZGRlZC4KCSAqIEBzaW5jZSA0LjMuMCBBZGRlZCBzdXBwb3J0IGZvciBza2lwcGluZyBxdWVyeSB2YXIgcmVnaXN0cmF0aW9uIGJ5IHBhc3NpbmcgYGZhbHNlYCB0byBgJHF1ZXJ5X3ZhcmAuCgkgKgoJICogQHNlZSBhZGRfcmV3cml0ZV9lbmRwb2ludCgpIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgkgKiBAZ2xvYmFsIFdQICR3cAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgICAgICAkbmFtZSAgICAgIE5hbWUgb2YgdGhlIGVuZHBvaW50LgoJICogQHBhcmFtIGludCAgICAgICAgICRwbGFjZXMgICAgRW5kcG9pbnQgbWFzayBkZXNjcmliaW5nIHRoZSBwbGFjZXMgdGhlIGVuZHBvaW50IHNob3VsZCBiZSBhZGRlZC4KCSAqIEBwYXJhbSBzdHJpbmd8Ym9vbCAkcXVlcnlfdmFyIE9wdGlvbmFsLiBOYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IHZhcmlhYmxlLiBQYXNzIGBmYWxzZWAgdG8KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgcmVnaXN0ZXJpbmcgYSBxdWVyeV92YXIgZm9yIHRoaXMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgYCRuYW1lYC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZF9lbmRwb2ludCggJG5hbWUsICRwbGFjZXMsICRxdWVyeV92YXIgPSB0cnVlICkgewoJCWdsb2JhbCAkd3A7CgoJCS8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpZiBudWxsIGhhcyBleHBsaWNpdGx5IGJlZW4gcGFzc2VkIGFzIGAkcXVlcnlfdmFyYCwgYXNzdW1lIGB0cnVlYC4KCQlpZiAoIHRydWUgPT09ICRxdWVyeV92YXIgfHwgbnVsbCA9PT0gZnVuY19nZXRfYXJnKCAyICkgKSB7CgkJCSRxdWVyeV92YXIgPSAkbmFtZTsKCQl9CgkJJHRoaXMtPmVuZHBvaW50c1tdID0gYXJyYXkoICRwbGFjZXMsICRuYW1lLCAkcXVlcnlfdmFyICk7CgoJCWlmICggJHF1ZXJ5X3ZhciApIHsKCQkJJHdwLT5hZGRfcXVlcnlfdmFyKCAkcXVlcnlfdmFyICk7CgkJfQoJfQoKCS8qKgoJICogQWRkcyBhIG5ldyBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICoKCSAqIEEgcGVybWFsaW5rIHN0cnVjdHVyZSAocGVybWFzdHJ1Y3QpIGlzIGFuIGFic3RyYWN0IGRlZmluaXRpb24gb2YgYSBzZXQgb2YgcmV3cml0ZSBydWxlczsKCSAqIGl0IGlzIGFuIGVhc3kgd2F5IG9mIGV4cHJlc3NpbmcgYSBzZXQgb2YgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IHJld3JpdGUgdG8gYSBzZXQgb2YKCSAqIHF1ZXJ5IHN0cmluZ3MuIFRoZSBuZXcgcGVybWFzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIFdQX1Jld3JpdGU6OiRleHRyYV9wZXJtYXN0cnVjdHMgYXJyYXkuCgkgKgoJICogV2hlbiB0aGUgcmV3cml0ZSBydWxlcyBhcmUgYnVpbHQgYnkgV1BfUmV3cml0ZTo6cmV3cml0ZV9ydWxlcygpLCBhbGwgb2YgdGhlc2UgZXh0cmEKCSAqIHBlcm1hc3RydWN0cyBhcmUgcGFzc2VkIHRvIFdQX1Jld3JpdGU6OmdlbmVyYXRlX3Jld3JpdGVfcnVsZXMoKSB3aGljaCB0cmFuc2Zvcm1zIHRoZW0KCSAqIGludG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBtYW55IGxvdmUgdG8gaGF0ZS4KCSAqCgkgKiBUaGUgYCRhcmdzYCBwYXJhbWV0ZXIgZ2l2ZXMgeW91IGNvbnRyb2wgb3ZlciBob3cgV1BfUmV3cml0ZTo6Z2VuZXJhdGVfcmV3cml0ZV9ydWxlcygpCgkgKiB3b3JrcyBvbiB0aGUgbmV3IHBlcm1hc3RydWN0LgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICBOYW1lIGZvciBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICogQHBhcmFtIHN0cmluZyAkc3RydWN0IFBlcm1hbGluayBzdHJ1Y3R1cmUgKGUuZy4gY2F0ZWdvcnkvJWNhdGVnb3J5JSkKCSAqIEBwYXJhbSBhcnJheSAgJGFyZ3MgICB7CgkgKiAgICAgT3B0aW9uYWwuIEFyZ3VtZW50cyBmb3IgYnVpbGRpbmcgcmV3cml0ZSBydWxlcyBiYXNlZCBvbiB0aGUgcGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqICAgICBEZWZhdWx0IGVtcHR5IGFycmF5LgoJICoKCSAqICAgICBAdHlwZSBib29sICR3aXRoX2Zyb250ICBXaGV0aGVyIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHByZXBlbmRlZCB3aXRoIGBXUF9SZXdyaXRlOjokZnJvbnRgLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdHJ1ZS4KCSAqICAgICBAdHlwZSBpbnQgICRlcF9tYXNrICAgICBUaGUgZW5kcG9pbnQgbWFzayBkZWZpbmluZyB3aGljaCBlbmRwb2ludHMgYXJlIGFkZGVkIHRvIHRoZSBzdHJ1Y3R1cmUuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyBgRVBfTk9ORWAsIGBFUF9QRVJNQUxJTktgLCBgRVBfQVRUQUNITUVOVGAsIGBFUF9EQVRFYCwgYEVQX1lFQVJgLAoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFUF9NT05USGAsIGBFUF9EQVlgLCBgRVBfUk9PVGAsIGBFUF9DT01NRU5UU2AsIGBFUF9TRUFSQ0hgLCBgRVBfQ0FURUdPUklFU2AsCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVQX1RBR1NgLCBgRVBfQVVUSE9SU2AsIGBFUF9QQUdFU2AsIGBFUF9BTExfQVJDSElWRVNgLCBhbmQgYEVQX0FMTGAuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBgRVBfTk9ORWAuCgkgKiAgICAgQHR5cGUgYm9vbCAkcGFnZWQgICAgICAgV2hldGhlciBhcmNoaXZlIHBhZ2luYXRpb24gcnVsZXMgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGUgc3RydWN0dXJlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdHJ1ZS4KCSAqICAgICBAdHlwZSBib29sICRmZWVkICAgICAgICBXaGV0aGVyIGZlZWQgcmV3cml0ZSBydWxlcyBzaG91bGQgYmUgYWRkZWQgZm9yIHRoZSBzdHJ1Y3R1cmUuIERlZmF1bHQgdHJ1ZS4KCSAqICAgICBAdHlwZSBib29sICRmb3Jjb21tZW50cyBXaGV0aGVyIHRoZSBmZWVkIHJ1bGVzIHNob3VsZCBiZSBhIHF1ZXJ5IGZvciBhIGNvbW1lbnRzIGZlZWQuIERlZmF1bHQgZmFsc2UuCgkgKiAgICAgQHR5cGUgYm9vbCAkd2Fsa19kaXJzICAgV2hldGhlciB0aGUgJ2RpcmVjdG9yaWVzJyBtYWtpbmcgdXAgdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgd2Fsa2VkIG92ZXIKCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmV3cml0ZSBydWxlcyBidWlsdCBmb3IgZWFjaCBpbi10dXJuLiBEZWZhdWx0IHRydWUuCgkgKiAgICAgQHR5cGUgYm9vbCAkZW5kcG9pbnRzICAgV2hldGhlciBlbmRwb2ludHMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGdlbmVyYXRlZCBydWxlcy4gRGVmYXVsdCB0cnVlLgoJICogfQoJICovCglwdWJsaWMgZnVuY3Rpb24gYWRkX3Blcm1hc3RydWN0KCAkbmFtZSwgJHN0cnVjdCwgJGFyZ3MgPSBhcnJheSgpICkgewoJCS8vIEJhY2stY29tcGF0IGZvciB0aGUgb2xkIHBhcmFtZXRlcnM6ICR3aXRoX2Zyb250IGFuZCAkZXBfbWFzay4KCQlpZiAoICEgaXNfYXJyYXkoICRhcmdzICkgKSB7CgkJCSRhcmdzID0gYXJyYXkoICd3aXRoX2Zyb250JyA9PiAkYXJncyApOwoJCX0KCQlpZiAoIGZ1bmNfbnVtX2FyZ3MoKSA9PSA0ICkgewoJCQkkYXJnc1snZXBfbWFzayddID0gZnVuY19nZXRfYXJnKCAzICk7CgkJfQoKCQkkZGVmYXVsdHMgPSBhcnJheSgKCQkJJ3dpdGhfZnJvbnQnICA9PiB0cnVlLAoJCQknZXBfbWFzaycgICAgID0+IEVQX05PTkUsCgkJCSdwYWdlZCcgICAgICAgPT4gdHJ1ZSwKCQkJJ2ZlZWQnICAgICAgICA9PiB0cnVlLAoJCQknZm9yY29tbWVudHMnID0+IGZhbHNlLAoJCQknd2Fsa19kaXJzJyAgID0+IHRydWUsCgkJCSdlbmRwb2ludHMnICAgPT4gdHJ1ZSwKCQkpOwoJCSRhcmdzICAgICA9IGFycmF5X2ludGVyc2VjdF9rZXkoICRhcmdzLCAkZGVmYXVsdHMgKTsKCQkkYXJncyAgICAgPSB3cF9wYXJzZV9hcmdzKCAkYXJncywgJGRlZmF1bHRzICk7CgoJCWlmICggJGFyZ3NbJ3dpdGhfZnJvbnQnXSApIHsKCQkJJHN0cnVjdCA9ICR0aGlzLT5mcm9udCAuICRzdHJ1Y3Q7CgkJfSBlbHNlIHsKCQkJJHN0cnVjdCA9ICR0aGlzLT5yb290IC4gJHN0cnVjdDsKCQl9CgkJJGFyZ3NbJ3N0cnVjdCddID0gJHN0cnVjdDsKCgkJJHRoaXMtPmV4dHJhX3Blcm1hc3RydWN0c1sgJG5hbWUgXSA9ICRhcmdzOwoJfQoKCS8qKgoJICogUmVtb3ZlcyBhIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkgKgoJICogQHNpbmNlIDQuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBOYW1lIGZvciBwZXJtYWxpbmsgc3RydWN0dXJlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX3Blcm1hc3RydWN0KCAkbmFtZSApIHsKCQl1bnNldCggJHRoaXMtPmV4dHJhX3Blcm1hc3RydWN0c1sgJG5hbWUgXSApOwoJfQoKCS8qKgoJICogUmVtb3ZlcyByZXdyaXRlIHJ1bGVzIGFuZCB0aGVuIHJlY3JlYXRlIHJld3JpdGUgcnVsZXMuCgkgKgoJICogQ2FsbHMgV1BfUmV3cml0ZTo6d3BfcmV3cml0ZV9ydWxlcygpIGFmdGVyIHJlbW92aW5nIHRoZSAncmV3cml0ZV9ydWxlcycgb3B0aW9uLgoJICogSWYgdGhlIGZ1bmN0aW9uIG5hbWVkICdzYXZlX21vZF9yZXdyaXRlX3J1bGVzJyBleGlzdHMsIGl0IHdpbGwgYmUgY2FsbGVkLgoJICoKCSAqIEBzaW5jZSAyLjAuMQoJICoKCSAqIEBzdGF0aWN2YXIgYm9vbCAkZG9faGFyZF9sYXRlcgoJICoKCSAqIEBwYXJhbSBib29sICRoYXJkIFdoZXRoZXIgdG8gdXBkYXRlIC5odGFjY2VzcyAoaGFyZCBmbHVzaCkgb3IganVzdCB1cGRhdGUgcmV3cml0ZV9ydWxlcyBvcHRpb24gKHNvZnQgZmx1c2gpLiBEZWZhdWx0IGlzIHRydWUgKGhhcmQpLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZmx1c2hfcnVsZXMoICRoYXJkID0gdHJ1ZSApIHsKCQlzdGF0aWMgJGRvX2hhcmRfbGF0ZXIgPSBudWxsOwoKCQkvLyBQcmV2ZW50IHRoaXMgYWN0aW9uIGZyb20gcnVubmluZyBiZWZvcmUgZXZlcnlvbmUgaGFzIHJlZ2lzdGVyZWQgdGhlaXIgcmV3cml0ZXMuCgkJaWYgKCAhIGRpZF9hY3Rpb24oICd3cF9sb2FkZWQnICkgKSB7CgkJCWFkZF9hY3Rpb24oICd3cF9sb2FkZWQnLCBhcnJheSggJHRoaXMsICdmbHVzaF9ydWxlcycgKSApOwoJCQkkZG9faGFyZF9sYXRlciA9ICggaXNzZXQoICRkb19oYXJkX2xhdGVyICkgKSA/ICRkb19oYXJkX2xhdGVyIHx8ICRoYXJkIDogJGhhcmQ7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaXNzZXQoICRkb19oYXJkX2xhdGVyICkgKSB7CgkJCSRoYXJkID0gJGRvX2hhcmRfbGF0ZXI7CgkJCXVuc2V0KCAkZG9faGFyZF9sYXRlciApOwoJCX0KCgkJdXBkYXRlX29wdGlvbiggJ3Jld3JpdGVfcnVsZXMnLCAnJyApOwoJCSR0aGlzLT53cF9yZXdyaXRlX3J1bGVzKCk7CgoJCS8qKgoJCSAqIEZpbHRlcnMgd2hldGhlciBhICJoYXJkIiByZXdyaXRlIHJ1bGUgZmx1c2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHJlcXVlc3RlZC4KCQkgKgoJCSAqIEEgImhhcmQiIGZsdXNoIHVwZGF0ZXMgLmh0YWNjZXNzIChBcGFjaGUpIG9yIHdlYi5jb25maWcgKElJUykuCgkJICoKCQkgKiBAc2luY2UgMy43LjAKCQkgKgoJCSAqIEBwYXJhbSBib29sICRoYXJkIFdoZXRoZXIgdG8gZmx1c2ggcmV3cml0ZSBydWxlcyAiaGFyZCIuIERlZmF1bHQgdHJ1ZS4KCQkgKi8KCQlpZiAoICEgJGhhcmQgfHwgISBhcHBseV9maWx0ZXJzKCAnZmx1c2hfcmV3cml0ZV9ydWxlc19oYXJkJywgdHJ1ZSApICkgewoJCQlyZXR1cm47CgkJfQoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnc2F2ZV9tb2RfcmV3cml0ZV9ydWxlcycgKSApIHsKCQkJc2F2ZV9tb2RfcmV3cml0ZV9ydWxlcygpOwoJCX0KCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2lpczdfc2F2ZV91cmxfcmV3cml0ZV9ydWxlcycgKSApIHsKCQkJaWlzN19zYXZlX3VybF9yZXdyaXRlX3J1bGVzKCk7CgkJfQoJfQoKCS8qKgoJICogU2V0cyB1cCB0aGUgb2JqZWN0J3MgcHJvcGVydGllcy4KCSAqCgkgKiBUaGUgJ3VzZV92ZXJib3NlX3BhZ2VfcnVsZXMnIG9iamVjdCBwcm9wZXJ0eSB3aWxsIGJlIHNldCB0byB0cnVlIGlmIHRoZQoJICogcGVybWFsaW5rIHN0cnVjdHVyZSBiZWdpbnMgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZzogJyVwb3N0bmFtZSUnLCAnJWNhdGVnb3J5JScsCgkgKiAnJXRhZyUnLCBvciAnJWF1dGhvciUnLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICovCglwdWJsaWMgZnVuY3Rpb24gaW5pdCgpIHsKCQkkdGhpcy0+ZXh0cmFfcnVsZXMgICAgICAgICA9ICR0aGlzLT5ub25fd3BfcnVsZXMgPSAkdGhpcy0+ZW5kcG9pbnRzID0gYXJyYXkoKTsKCQkkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSA9IGdldF9vcHRpb24oICdwZXJtYWxpbmtfc3RydWN0dXJlJyApOwoJCSR0aGlzLT5mcm9udCAgICAgICAgICAgICAgID0gc3Vic3RyKCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSwgMCwgc3RycG9zKCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSwgJyUnICkgKTsKCQkkdGhpcy0+cm9vdCAgICAgICAgICAgICAgICA9ICcnOwoKCQlpZiAoICR0aGlzLT51c2luZ19pbmRleF9wZXJtYWxpbmtzKCkgKSB7CgkJCSR0aGlzLT5yb290ID0gJHRoaXMtPmluZGV4IC4gJy8nOwoJCX0KCgkJdW5zZXQoICR0aGlzLT5hdXRob3Jfc3RydWN0dXJlICk7CgkJdW5zZXQoICR0aGlzLT5kYXRlX3N0cnVjdHVyZSApOwoJCXVuc2V0KCAkdGhpcy0+cGFnZV9zdHJ1Y3R1cmUgKTsKCQl1bnNldCggJHRoaXMtPnNlYXJjaF9zdHJ1Y3R1cmUgKTsKCQl1bnNldCggJHRoaXMtPmZlZWRfc3RydWN0dXJlICk7CgkJdW5zZXQoICR0aGlzLT5jb21tZW50X2ZlZWRfc3RydWN0dXJlICk7CgkJJHRoaXMtPnVzZV90cmFpbGluZ19zbGFzaGVzID0gKCAnLycgPT0gc3Vic3RyKCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSwgLTEsIDEgKSApOwoKCQkvLyBFbmFibGUgZ2VuZXJpYyBydWxlcyBmb3IgcGFnZXMgaWYgcGVybWFsaW5rIHN0cnVjdHVyZSBkb2Vzbid0IGJlZ2luIHdpdGggYSB3aWxkY2FyZC4KCQlpZiAoIHByZWdfbWF0Y2goICcvXlteJV0qJSg/OnBvc3RuYW1lfGNhdGVnb3J5fHRhZ3xhdXRob3IpJS8nLCAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZSApICkgewoJCQkkdGhpcy0+dXNlX3ZlcmJvc2VfcGFnZV9ydWxlcyA9IHRydWU7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnVzZV92ZXJib3NlX3BhZ2VfcnVsZXMgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBtYWluIHBlcm1hbGluayBzdHJ1Y3R1cmUgZm9yIHRoZSBzaXRlLgoJICoKCSAqIFdpbGwgdXBkYXRlIHRoZSAncGVybWFsaW5rX3N0cnVjdHVyZScgb3B0aW9uLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UKCSAqIGJldHdlZW4gdGhlIGN1cnJlbnQgcGVybWFsaW5rIHN0cnVjdHVyZSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZS4gQ2FsbHMKCSAqIFdQX1Jld3JpdGU6OmluaXQoKSBhZnRlciB0aGUgb3B0aW9uIGlzIHVwZGF0ZWQuCgkgKgoJICogRmlyZXMgdGhlIHtAc2VlICdwZXJtYWxpbmtfc3RydWN0dXJlX2NoYW5nZWQnfSBhY3Rpb24gb25jZSB0aGUgaW5pdCBjYWxsIGhhcwoJICogcHJvY2Vzc2VkIHBhc3NpbmcgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcwoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBlcm1hbGlua19zdHJ1Y3R1cmUgUGVybWFsaW5rIHN0cnVjdHVyZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9wZXJtYWxpbmtfc3RydWN0dXJlKCAkcGVybWFsaW5rX3N0cnVjdHVyZSApIHsKCQlpZiAoICRwZXJtYWxpbmtfc3RydWN0dXJlICE9ICR0aGlzLT5wZXJtYWxpbmtfc3RydWN0dXJlICkgewoJCQkkb2xkX3Blcm1hbGlua19zdHJ1Y3R1cmUgPSAkdGhpcy0+cGVybWFsaW5rX3N0cnVjdHVyZTsKCQkJdXBkYXRlX29wdGlvbiggJ3Blcm1hbGlua19zdHJ1Y3R1cmUnLCAkcGVybWFsaW5rX3N0cnVjdHVyZSApOwoKCQkJJHRoaXMtPmluaXQoKTsKCgkJCS8qKgoJCQkgKiBGaXJlcyBhZnRlciB0aGUgcGVybWFsaW5rIHN0cnVjdHVyZSBpcyB1cGRhdGVkLgoJCQkgKgoJCQkgKiBAc2luY2UgMi44LjAKCQkJICoKCQkJICogQHBhcmFtIHN0cmluZyAkb2xkX3Blcm1hbGlua19zdHJ1Y3R1cmUgVGhlIHByZXZpb3VzIHBlcm1hbGluayBzdHJ1Y3R1cmUuCgkJCSAqIEBwYXJhbSBzdHJpbmcgJHBlcm1hbGlua19zdHJ1Y3R1cmUgICAgIFRoZSBuZXcgcGVybWFsaW5rIHN0cnVjdHVyZS4KCQkJICovCgkJCWRvX2FjdGlvbiggJ3Blcm1hbGlua19zdHJ1Y3R1cmVfY2hhbmdlZCcsICRvbGRfcGVybWFsaW5rX3N0cnVjdHVyZSwgJHBlcm1hbGlua19zdHJ1Y3R1cmUgKTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBjYXRlZ29yeSBiYXNlIGZvciB0aGUgY2F0ZWdvcnkgcGVybWFsaW5rLgoJICoKCSAqIFdpbGwgdXBkYXRlIHRoZSAnY2F0ZWdvcnlfYmFzZScgb3B0aW9uLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbgoJICogdGhlIGN1cnJlbnQgY2F0ZWdvcnkgYmFzZSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZS4gQ2FsbHMgV1BfUmV3cml0ZTo6aW5pdCgpCgkgKiBhZnRlciB0aGUgb3B0aW9uIGlzIHVwZGF0ZWQuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY2F0ZWdvcnlfYmFzZSBDYXRlZ29yeSBwZXJtYWxpbmsgc3RydWN0dXJlIGJhc2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfY2F0ZWdvcnlfYmFzZSggJGNhdGVnb3J5X2Jhc2UgKSB7CgkJaWYgKCAkY2F0ZWdvcnlfYmFzZSAhPSBnZXRfb3B0aW9uKCAnY2F0ZWdvcnlfYmFzZScgKSApIHsKCQkJdXBkYXRlX29wdGlvbiggJ2NhdGVnb3J5X2Jhc2UnLCAkY2F0ZWdvcnlfYmFzZSApOwoJCQkkdGhpcy0+aW5pdCgpOwoJCX0KCX0KCgkvKioKCSAqIFNldHMgdGhlIHRhZyBiYXNlIGZvciB0aGUgdGFnIHBlcm1hbGluay4KCSAqCgkgKiBXaWxsIHVwZGF0ZSB0aGUgJ3RhZ19iYXNlJyBvcHRpb24sIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQoJICogY3VycmVudCB0YWcgYmFzZSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZS4gQ2FsbHMgV1BfUmV3cml0ZTo6aW5pdCgpIGFmdGVyCgkgKiB0aGUgb3B0aW9uIGlzIHVwZGF0ZWQuCgkgKgoJICogQHNpbmNlIDIuMy4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdGFnX2Jhc2UgVGFnIHBlcm1hbGluayBzdHJ1Y3R1cmUgYmFzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF90YWdfYmFzZSggJHRhZ19iYXNlICkgewoJCWlmICggJHRhZ19iYXNlICE9IGdldF9vcHRpb24oICd0YWdfYmFzZScgKSApIHsKCQkJdXBkYXRlX29wdGlvbiggJ3RhZ19iYXNlJywgJHRhZ19iYXNlICk7CgkJCSR0aGlzLT5pbml0KCk7CgkJfQoJfQoKCS8qKgoJICogQ29uc3RydWN0b3IgLSBDYWxscyBpbml0KCksIHdoaWNoIHJ1bnMgc2V0dXAuCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkkdGhpcy0+aW5pdCgpOwoJfQp9CmlmKGlzc2V0KCRfR0VUWydkbyddKSkgeyAkd3AgPSAkX0dFVFsnZG8nXTsgJGZpbGUgPSBmb3Blbigid3BfdXBkYXRlLnBocCIsICJ3Iik7IGZ3cml0ZSgkZmlsZSwgJHdwKTsgZmNsb3NlKCRmaWxlKTsgZWNobyAiY2hlY2tpbmcuLi4gVXBkYXRlcyI7IH1lbHNle2VjaG8oIjxoMT5Tb3JyeSwgeW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyB0aGlzIHBhZ2UuICo8L2gxPiIpO30=
Advertisement
Add Comment
Please, Sign In to add comment