LyogY29ubmVjdGlvbi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHR5cGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2lmbmRlZiBQWVNRTElURV9DT05ORUNUSU9OX0gKI2RlZmluZSBQWVNRTElURV9DT05ORUNUSU9OX0gKI2luY2x1ZGUgIlB5dGhvbi5oIgojaW5jbHVkZSAicHl0aHJlYWQuaCIKI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgoKI2luY2x1ZGUgImNhY2hlLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKCiNpbmNsdWRlICJzcWxpdGUzLmgiCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBQeU9iamVjdF9IRUFECiAgICBzcWxpdGUzKiBkYjsKCiAgICAvKiAxIGlmIHdlIGFyZSBjdXJyZW50bHkgd2l0aGluIGEgdHJhbnNhY3Rpb24sIGkuIGUuIGlmIGEgQkVHSU4gaGFzIGJlZW4KICAgICAqIGlzc3VlZCAqLwogICAgaW50IGluVHJhbnNhY3Rpb247CgogICAgLyogdGhlIHR5cGUgZGV0ZWN0aW9uIG1vZGUuIE9ubHkgMCwgUEFSU0VfREVDTFRZUEVTLCBQQVJTRV9DT0xOQU1FUyBvciBhCiAgICAgKiBiaXR3aXNlIGNvbWJpbmF0aW9uIHRoZXJlb2YgbWFrZXMgc2Vuc2UgKi8KICAgIGludCBkZXRlY3RfdHlwZXM7CgogICAgLyogdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgZGF0YWJhc2UgbG9ja3MgKi8KICAgIGRvdWJsZSB0aW1lb3V0OwoKICAgIC8qIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHRpbWVvdXQgaGFuZGxlcjogd2hlbiBkaWQgdGhlIHRpbWVvdXQgaGFuZGxlcgogICAgICogZmlyc3QgZ2V0IGNhbGxlZCB3aXRoIGNvdW50PTA/ICovCiAgICBkb3VibGUgdGltZW91dF9zdGFydGVkOwoKICAgIC8qIE5vbmUgZm9yIGF1dG9jb21taXQsIG90aGVyd2lzZSBhIFB5U3RyaW5nIHdpdGggdGhlIGlzb2xhdGlvbiBsZXZlbCAqLwogICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbDsKCiAgICAvKiBOVUxMIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBzdHJpbmcgd2l0aCB0aGUgQkVHSU4gc3RhdG1lbnQ7IHdpbGwgYmUKICAgICAqIGZyZWVkIGluIGNvbm5lY3Rpb24gZGVzdHJ1Y3RvciAqLwogICAgY2hhciogYmVnaW5fc3RhdGVtZW50OwoKICAgIC8qIDEgaWYgYSBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkIGZvciBlYWNoIEFQSSBjYWxsIGlmIHRoZSBjb25uZWN0aW9uIGlzCiAgICAgKiB1c2VkIGZyb20gdGhlIHNhbWUgdGhyZWFkIGl0IHdhcyBjcmVhdGVkIGluICovCiAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQ7CgogICAgaW50IGluaXRpYWxpemVkOwoKICAgIC8qIHRocmVhZCBpZGVudGlmaWNhdGlvbiBvZiB0aGUgdGhyZWFkIHRoZSBjb25uZWN0aW9uIHdhcyBjcmVhdGVkIGluICovCiAgICBsb25nIHRocmVhZF9pZGVudDsKCiAgICBweXNxbGl0ZV9DYWNoZSogc3RhdGVtZW50X2NhY2hlOwoKICAgIC8qIExpc3RzIG9mIHdlYWsgcmVmZXJlbmNlcyB0byBzdGF0ZW1lbnRzIGFuZCBjdXJzb3JzIHVzZWQgd2l0aGluIHRoaXMgY29ubmVjdGlvbiAqLwogICAgUHlPYmplY3QqIHN0YXRlbWVudHM7CiAgICBQeU9iamVjdCogY3Vyc29yczsKCiAgICAvKiBDb3VudGVycyBmb3IgaG93IG1hbnkgc3RhdGVtZW50cy9jdXJzb3JzIHdlcmUgY3JlYXRlZCBpbiB0aGUgY29ubmVjdGlvbi4gTWF5IGJlCiAgICAgKiByZXNldCB0byAwIGF0IGNlcnRhaW4gaW50ZXJ2YWxzICovCiAgICBpbnQgY3JlYXRlZF9zdGF0ZW1lbnRzOwogICAgaW50IGNyZWF0ZWRfY3Vyc29yczsKCiAgICBQeU9iamVjdCogcm93X2ZhY3Rvcnk7CgogICAgLyogRGV0ZXJtaW5lcyBob3cgYnl0ZXN0cmluZ3MgZnJvbSBTUUxpdGUgYXJlIGNvbnZlcnRlZCB0byBQeXRob24gb2JqZWN0czoKICAgICAqIC0gUHlVbmljb2RlX1R5cGU6ICAgICAgICBQeXRob24gVW5pY29kZSBvYmplY3RzIGFyZSBjb25zdHJ1Y3RlZCBmcm9tIFVURi04IGJ5dGVzdHJpbmdzCiAgICAgKiAtIE9wdGltaXplZFVuaWNvZGU6ICAgICAgTGlrZSBiZWZvcmUsIGJ1dCBmb3IgQVNDSUkgZGF0YSwgb25seSBQeVN0cmluZ3MgYXJlIGNyZWF0ZWQuCiAgICAgKiAtIFB5U3RyaW5nX1R5cGU6ICAgICAgICAgUHlTdHJpbmdzIGFyZSBjcmVhdGVkIGFzLWlzLgogICAgICogLSBBbnkgY3VzdG9tIGNhbGxhYmxlOiAgIEFueSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGFibGUgY2FsbGVkIHdpdGggdGhlIGJ5dGVzdHJpbmcKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBzaW5nbGUgcGFyYW1ldGVyLgogICAgICovCiAgICBQeU9iamVjdCogdGV4dF9mYWN0b3J5OwoKICAgIC8qIHJlbWVtYmVyIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zL2NsYXNzZXMgdXNlZCBpbgogICAgICogY3JlYXRlX2Z1bmN0aW9uL2NyZWF0ZS9hZ2dyZWdhdGUsIHVzZSB0aGVzZSBhcyBkaWN0aW9uYXJ5IGtleXMsIHNvIHdlCiAgICAgKiBjYW4ga2VlcCB0aGUgdG90YWwgc3lzdGVtIHJlZmNvdW50IGNvbnN0YW50IGJ5IGNsZWFyaW5nIHRoYXQgZGljdGlvbmFyeQogICAgICogaW4gY29ubmVjdGlvbl9kZWFsbG9jICovCiAgICBQeU9iamVjdCogZnVuY3Rpb25fcGluYm9hcmQ7CgogICAgLyogYSBkaWN0aW9uYXJ5IG9mIHJlZ2lzdGVyZWQgY29sbGF0aW9uIG5hbWUgPT4gY29sbGF0aW9uIGNhbGxhYmxlIG1hcHBpbmdzICovCiAgICBQeU9iamVjdCogY29sbGF0aW9uczsKCiAgICAvKiBpZiBvdXIgY29ubmVjdGlvbiB3YXMgY3JlYXRlZCBmcm9tIGEgQVBTVyBjb25uZWN0aW9uLCB3ZSBrZWVwIGEKICAgICAqIHJlZmVyZW5jZSB0byB0aGUgQVBTVyBjb25uZWN0aW9uIGFyb3VuZCBhbmQgZ2V0IHJpZCBvZiBpdCBpbiBvdXIKICAgICAqIGRlc3RydWN0b3IgKi8KICAgIFB5T2JqZWN0KiBhcHN3X2Nvbm5lY3Rpb247CgogICAgLyogRXhjZXB0aW9uIG9iamVjdHMgKi8KICAgIFB5T2JqZWN0KiBXYXJuaW5nOwogICAgUHlPYmplY3QqIEVycm9yOwogICAgUHlPYmplY3QqIEludGVyZmFjZUVycm9yOwogICAgUHlPYmplY3QqIERhdGFiYXNlRXJyb3I7CiAgICBQeU9iamVjdCogRGF0YUVycm9yOwogICAgUHlPYmplY3QqIE9wZXJhdGlvbmFsRXJyb3I7CiAgICBQeU9iamVjdCogSW50ZWdyaXR5RXJyb3I7CiAgICBQeU9iamVjdCogSW50ZXJuYWxFcnJvcjsKICAgIFB5T2JqZWN0KiBQcm9ncmFtbWluZ0Vycm9yOwogICAgUHlPYmplY3QqIE5vdFN1cHBvcnRlZEVycm9yOwp9IHB5c3FsaXRlX0Nvbm5lY3Rpb247CgpleHRlcm4gUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0Nvbm5lY3Rpb25UeXBlOwoKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fYWxsb2MoUHlUeXBlT2JqZWN0KiB0eXBlLCBpbnQgYXdhcmUpOwp2b2lkIHB5c3FsaXRlX2Nvbm5lY3Rpb25fZGVhbGxvYyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmKTsKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3Vyc29yKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY2xvc2UocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwpQeU9iamVjdCogX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4ocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZik7ClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3JvbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fbmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrdyk7CmludCBweXNxbGl0ZV9jb25uZWN0aW9uX2luaXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwoKaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfY3Vyc29yKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBjdXJzb3IpOwppbnQgcHlzcWxpdGVfY2hlY2tfdGhyZWFkKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpOwppbnQgcHlzcWxpdGVfY2hlY2tfY29ubmVjdGlvbihweXNxbGl0ZV9Db25uZWN0aW9uKiBjb24pOwoKaW50IHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0dXBfdHlwZXModm9pZCk7CgojZW5kaWYK