LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqIENvcHlyaWdodCCpIHsxOTk3LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBGaWxlIFdEQktUQkwuSAoqCiogV29yZEJyZWFrVGFibGUgaW1wbGVtZW50cyBhIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCioKKiBAcGFja2FnZSAgVGV4dCBhbmQgSW50ZXJuYXRpb25hbAoqIEBjYXRlZ29yeSBUZXh0IFNjYW5uaW5nCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDAyLzE4Lzk3ICAgIGFsaXUgICAgICAgIENvbnZlcnRlZCBmcm9tIE9wZW5DbGFzcy4gIE1hZGUgc3RhdGljcyBjb25zdC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgV0RCS1RCTF9ICiNkZWZpbmUgV0RCS1RCTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInR4dGJkYXQuaCIKCi8qKgogKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdGF0ZSB0cmFuc2l0aW9uIHRhYmxlLgogKiBBZnRlciBlYWNoIHRyYW5zaXRpb24sIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCB0aGUKICogbmV3IHN0YXRlIGlzIHJldHVybmVkIGFsb25nIHdpdGggaW5mb3JtYXRpb24gYWJvdXQKICogdGhlIHN0YXRlIGNoYW5nZSAoZXguIHdhcyBpdCBhICJtYXJrZWQiIHRyYW5zaXRpb24iKS4KICogRm9yIGVmZmljaWVuY3ksIG5vbmUgb2YgdGhlIGFyZ3VtZW50cyB0byBhbnkgb2YgdGhlc2UKICogbWV0aG9kcyBhcmUgdmFsaWRhdGVkLgogKi8KY2xhc3MgV29yZEJyZWFrVGFibGUgewpwdWJsaWM6CiAgICAvLyBGb3IgY29udmVuaWVuY2UKICAgIHR5cGVkZWYgVGV4dEJvdW5kYXJ5RGF0YTo6Tm9kZSBOb2RlOwogICAgdHlwZWRlZiBUZXh0Qm91bmRhcnlEYXRhOjpUeXBlIFR5cGU7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3QgYSB0YWJsZSBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLiAgU2VlIENoYXJhY3RlckJyZWFrRGF0YSBvcgogICAgICogdGhlIG90aGVyIFRleHRCb3VuZGFyeURhdGEgc3ViY2xhc3NlcyBmb3IgZXhhbXBsZXMuICBFYWNoIHJvdyByZXByZXNlbnRzCiAgICAgKiBhIHN0YXRlLCBlYWNoIGNvbHVtbiB3aXRoaW4gYSByb3cgcmVwcmVzZW50cyBhIHRyYW5zaXRpb24uICBUaGUgdmFsdWVzCiAgICAgKiBpbiB0aGUgdGFibGUgcmVwcmVzZW50IHRoZSBuZXcgc3RhdGUgYW5kIG1hcmsgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0gY29scyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUgKHRyYW5zaXRpb25zKQogICAgICogQHBhcmFtIGRhdGEgYW4gZW5jb2RlZCBieXRlIGFycmF5IGNvbnRhaW5pbmcgc3RhdGUgYW5kIHRyYW5zaXRpb24gZGF0YQogICAgICogQHBhcmFtIGRhdGFfbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXkgZGF0YQogICAgICovCiAgICBXb3JkQnJlYWtUYWJsZShpbnQzMl90IGNvbHMsIGNvbnN0IE5vZGUgZGF0YVtdLCBpbnQzMl90IGRhdGFfbGVuZ3RoKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgcmVzdWx0aW5nIHN0YXRlIG1vdmluZyBmcm9tIG9sZFN0YXRlIGFjY2VwdGluZyBpbnB1dC4KICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBjdXJyZW50IHN0YXRlCiAgICAgKiBAcGFyYW0gaW5wdXQgaW5wdXQKICAgICAqIEByZXR1cm4gcmVzdWx0aW5nIHN0YXRlIGFuZCB0cmFuc2l0aW9uIGRhdGEKICAgICAqLwogICAgTm9kZSBnZXQoTm9kZSBvbGRTdGF0ZSwgVHlwZSBpbnB1dCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB0cmFuc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBzdGF0ZSB3YXMgIm1hcmtlZC4iCiAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIGFzIHJldHVybmVkIGJ5IGdldCwgaW5pdGlhbFN0YXRlLCBvciBlbmRTdGF0ZQogICAgICogQHJldHVybiB0cnVlIGlmIHRyYW5zaXRpb24gaW50byBzdGF0ZSB3YXMgbWFya2VkLgogICAgICovCiAgICBVQm9vbCBpc01hcmtTdGF0ZShOb2RlIHN0YXRlKSBjb25zdDsKCiAgICAvKioKICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3RhdGUgaXMgdGhlIGVuZCBzdGF0ZQogICAgICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSB0byBjaGVjawogICAgICogQHJldHVybiB0cnVlIGlmIHN0YXRlIGlzIGFuIGVuZCBzdGF0ZQogICAgICovCiAgICBVQm9vbCBpc0VuZFN0YXRlKE5vZGUgc3RhdGUpIGNvbnN0OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBpbml0aWFsIHN0YXRlCiAgICAgKiBAcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlCiAgICAgKi8KICAgIE5vZGUgaW5pdGlhbFN0YXRlKHZvaWQpIGNvbnN0OwoKcHJpdmF0ZToKICAgIHN0YXRpYyBjb25zdCBOb2RlICBrTWFya19tYXNrOwogICAgc3RhdGljIGNvbnN0IE5vZGUgIGtJbmRleF9tYXNrOwoKICAgIHN0YXRpYyBjb25zdCBOb2RlICAga0luaXRpYWxfc3RhdGU7CiAgICBzdGF0aWMgY29uc3QgTm9kZSAgIGtFbmRfc3RhdGU7CgogICAgY29uc3QgVGV4dEJvdW5kYXJ5RGF0YTo6Tm9kZSogZkRhdGE7CiAgICBpbnQzMl90IGZEYXRhX2xlbmd0aDsKICAgIGludDMyX3QgZkNvbHM7Cn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbmxpbmUgV29yZEJyZWFrVGFibGU6Ok5vZGUKV29yZEJyZWFrVGFibGU6OmdldChXb3JkQnJlYWtUYWJsZTo6Tm9kZSBvbGRTdGF0ZSwgV29yZEJyZWFrVGFibGU6OlR5cGUgaW5wdXQpIGNvbnN0CnsKICAgIHJldHVybiBmRGF0YVsob2xkU3RhdGUgJiBrSW5kZXhfbWFzaykgKiBmQ29scyArIGlucHV0XTsKfQoKaW5saW5lIFVCb29sCldvcmRCcmVha1RhYmxlOjppc01hcmtTdGF0ZShXb3JkQnJlYWtUYWJsZTo6Tm9kZSBzdGF0ZSkgY29uc3QKewogICAgcmV0dXJuIChzdGF0ZSAmIGtNYXJrX21hc2spICE9IDA7Cn0KCmlubGluZSBVQm9vbApXb3JkQnJlYWtUYWJsZTo6aXNFbmRTdGF0ZShXb3JkQnJlYWtUYWJsZTo6Tm9kZSBzdGF0ZSkgY29uc3QKewogICAgcmV0dXJuIChzdGF0ZSAmIGtJbmRleF9tYXNrKSA9PSBrRW5kX3N0YXRlOwp9CgppbmxpbmUgV29yZEJyZWFrVGFibGU6Ok5vZGUKV29yZEJyZWFrVGFibGU6OmluaXRpYWxTdGF0ZSgpIGNvbnN0CnsKICAgIHJldHVybiBrSW5pdGlhbF9zdGF0ZTsKfQoKI2VuZGlmIC8vIF9XREJLVEJMCi8vZW9mCg==