LyoKICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZwogKgogKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CiAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHUtYm9vdAogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KCiNpZm5kZWYgX0ZBVF9IXwojZGVmaW5lIF9GQVRfSF8KCiNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAoKI2RlZmluZSBTRUNUT1JfU0laRSBGU19CTE9DS19TSVpFCgojZGVmaW5lIEZTX0JMT0NLX1NJWkUgNTEyCgojaWYgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRQojZXJyb3IgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRSAtIFRoaXMgY29kZSBuZWVkcyB0byBiZSBmaXhlZCEKI2VuZGlmCgojZGVmaW5lIE1BWF9DTFVTVFNJWkUJNjU1MzYKI2RlZmluZSBESVJFTlRTUEVSQkxPQ0sJKEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGRpcl9lbnRyeSkpCiNkZWZpbmUgRElSRU5UU1BFUkNMVVNUCSgobXlkYXRhLT5jbHVzdF9zaXplKlNFQ1RPUl9TSVpFKS9zaXplb2YoZGlyX2VudHJ5KSkKCiNkZWZpbmUgRkFUQlVGQkxPQ0tTCTYKI2RlZmluZSBGQVRCVUZTSVpFCShGU19CTE9DS19TSVpFKkZBVEJVRkJMT0NLUykKI2RlZmluZSBGQVQxMkJVRlNJWkUJKChGQVRCVUZTSVpFKjMpLzIpCiNkZWZpbmUgRkFUMTZCVUZTSVpFCShGQVRCVUZTSVpFLzIpCiNkZWZpbmUgRkFUMzJCVUZTSVpFCShGQVRCVUZTSVpFLzQpCgoKLyogRmlsZXN5c3RlbSBpZGVudGlmaWVycyAqLwojZGVmaW5lIEZBVDEyX1NJR04JIkZBVDEyICAgIgojZGVmaW5lIEZBVDE2X1NJR04JIkZBVDE2ICAgIgojZGVmaW5lIEZBVDMyX1NJR04JIkZBVDMyICAgIgojZGVmaW5lIFNJR05MRU4JCTgKCi8qIEZpbGUgYXR0cmlidXRlcyAqLwojZGVmaW5lIEFUVFJfUk8gICAgICAxCiNkZWZpbmUgQVRUUl9ISURERU4gIDIKI2RlZmluZSBBVFRSX1NZUyAgICAgNAojZGVmaW5lIEFUVFJfVk9MVU1FICA4CiNkZWZpbmUgQVRUUl9ESVIgICAgIDE2CiNkZWZpbmUgQVRUUl9BUkNIICAgIDMyCgojZGVmaW5lIEFUVFJfVkZBVCAgICAgKEFUVFJfUk8gfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTIHwgQVRUUl9WT0xVTUUpCgojZGVmaW5lIERFTEVURURfRkxBRwkoKGNoYXIpMHhlNSkgLyogTWFya3MgZGVsZXRlZCBmaWxlcyB3aGVuIGluIG5hbWVbMF0gKi8KI2RlZmluZSBhUklORwkJMHgwNQkgICAgIC8qIFVzZWQgdG8gcmVwcmVzZW50ICflJyBpbiBuYW1lWzBdICovCgoKLyogRmxhZ3MgdGVsbGluZyB3aGV0aGVyIHdlIHNob3VsZCByZWFkIGEgZmlsZSBvciBsaXN0IGEgZGlyZWN0b3J5ICovCiNkZWZpbmUgTFNfTk8JMAojZGVmaW5lIExTX1lFUwkxCiNkZWZpbmUgTFNfRElSCTEKI2RlZmluZSBMU19ST09UCTIKCiNpZmRlZiBERUJVRwojZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikJcHJpbnRmKGFyZ3MpCiNlbHNlCiNkZWZpbmUgRkFUX0RQUklOVChhcmdzLi4uKQojZW5kaWYKI2RlZmluZSBGQVRfRVJST1IoYXJnKQkJcHJpbnRmKGFyZykKCiNkZWZpbmUgSVNESVJERUxJTShjKSAgICgoYykgPT0gJy8nIHx8IChjKSA9PSAnXFwnKQoKI2RlZmluZSBGU1RZUEVfTk9ORQkoLTEpCgojaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19LRVJORUxfXykKI2RlZmluZSBGQVQyQ1BVMTYJbGUxNl90b19jcHUKI2RlZmluZSBGQVQyQ1BVMzIJbGUzMl90b19jcHUKI2Vsc2UKI2lmIDEKI2RlZmluZSBGQVQyQ1BVMTYoeCkJKHgpCiNkZWZpbmUgRkFUMkNQVTMyKHgpCSh4KQojZWxzZQojZGVmaW5lIEZBVDJDUFUxNih4KQkoKCgoeCkgJiAweDAwZmYpIDw8IDgpIHwgKCgoeCkgJiAweGZmMDApID4+IDgpKQojZGVmaW5lIEZBVDJDUFUzMih4KQkoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgIHwJXAoJIAkJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwJXAoJCQkgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiA4KSAgfAlcCgkJCSAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSkKI2VuZGlmCiNlbmRpZgoKI2RlZmluZSBUT0xPV0VSKGMpCWlmKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJyl7KGMpKz0oJ2EnIC0gJ0EnKTt9CiNkZWZpbmUgU1RBUlQoZGVudCkJKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0KSBcCgkJCSsgKG15ZGF0YS0+ZmF0c2l6ZSAhPSAzMiA/IDAgOiBcCgkJCSAgKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0aGkpIDw8IDE2KSkpCgoKdHlwZWRlZiBzdHJ1Y3QgYm9vdF9zZWN0b3IgewoJX191OAlpZ25vcmVkWzNdOwkvKiBCb290c3RyYXAgY29kZSAqLwoJY2hhcglzeXN0ZW1faWRbOF07CS8qIE5hbWUgb2YgZnMgKi8KCV9fdTgJc2VjdG9yX3NpemVbMl07CS8qIEJ5dGVzL3NlY3RvciAqLwoJX191OAljbHVzdGVyX3NpemU7CS8qIFNlY3RvcnMvY2x1c3RlciAqLwoJX191MTYJcmVzZXJ2ZWQ7CS8qIE51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzICovCglfX3U4CWZhdHM7CQkvKiBOdW1iZXIgb2YgRkFUcyAqLwoJX191OAlkaXJfZW50cmllc1syXTsJLyogTnVtYmVyIG9mIHJvb3QgZGlyZWN0b3J5IGVudHJpZXMgKi8KCV9fdTgJc2VjdG9yc1syXTsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKi8KCV9fdTgJbWVkaWE7CQkvKiBNZWRpYSBjb2RlICovCglfX3UxNglmYXRfbGVuZ3RoOwkvKiBTZWN0b3JzL0ZBVCAqLwoJX191MTYJc2Vjc190cmFjazsJLyogU2VjdG9ycy90cmFjayAqLwoJX191MTYJaGVhZHM7CQkvKiBOdW1iZXIgb2YgaGVhZHMgKi8KCV9fdTMyCWhpZGRlbjsJCS8qIE51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAqLwoJX191MzIJdG90YWxfc2VjdDsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKGlmIHNlY3RvcnMgPT0gMCkgKi8KCgkvKiBGQVQzMiBvbmx5ICovCglfX3UzMglmYXQzMl9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCglfX3UxNglmbGFnczsJCS8qIEJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLwoJX191OAl2ZXJzaW9uWzJdOwkvKiBGaWxlc3lzdGVtIHZlcnNpb24gKi8KCV9fdTMyCXJvb3RfY2x1c3RlcjsJLyogRmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLwoJX191MTYJaW5mb19zZWN0b3I7CS8qIEZpbGVzeXN0ZW0gaW5mbyBzZWN0b3IgKi8KCV9fdTE2CWJhY2t1cF9ib290OwkvKiBCYWNrdXAgYm9vdCBzZWN0b3IgKi8KCV9fdTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCn0gYm9vdF9zZWN0b3I7Cgp0eXBlZGVmIHN0cnVjdCB2b2x1bWVfaW5mbwp7CglfX3U4IGRyaXZlX251bWJlcjsJLyogQklPUyBkcml2ZSBudW1iZXIgKi8KCV9fdTggcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KCV9fdTggZXh0X2Jvb3Rfc2lnbjsJLyogMHgyOSBpZiBmaWVsZHMgYmVsb3cgZXhpc3QgKERPUyAzLjMrKSAqLwoJX191OCB2b2x1bWVfaWRbNF07CS8qIFZvbHVtZSBJRCBudW1iZXIgKi8KCWNoYXIgdm9sdW1lX2xhYmVsWzExXTsJLyogVm9sdW1lIGxhYmVsICovCgljaGFyIGZzX3R5cGVbOF07CS8qIFR5cGljYWxseSBGQVQxMiwgRkFUMTYsIG9yIEZBVDMyICovCgkvKiBCb290IGNvZGUgY29tZXMgbmV4dCwgYWxsIGJ1dCAyIGJ5dGVzIHRvIGZpbGwgdXAgc2VjdG9yICovCgkvKiBCb290IHNpZ24gY29tZXMgbGFzdCwgMiBieXRlcyAqLwp9IHZvbHVtZV9pbmZvOwoKdHlwZWRlZiBzdHJ1Y3QgZGlyX2VudHJ5IHsKCWNoYXIJbmFtZVs4XSxleHRbM107CS8qIE5hbWUgYW5kIGV4dGVuc2lvbiAqLwoJX191OAlhdHRyOwkJLyogQXR0cmlidXRlIGJpdHMgKi8KCV9fdTgJbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KCV9fdTgJY3RpbWVfbXM7CS8qIENyZWF0aW9uIHRpbWUsIG1pbGxpc2Vjb25kcyAqLwoJX191MTYJY3RpbWU7CQkvKiBDcmVhdGlvbiB0aW1lICovCglfX3UxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KCV9fdTE2CWFkYXRlOwkJLyogTGFzdCBhY2Nlc3MgZGF0ZSAqLwoJX191MTYJc3RhcnRoaTsJLyogSGlnaCAxNiBiaXRzIG9mIGNsdXN0ZXIgaW4gRkFUMzIgKi8KCV9fdTE2CXRpbWUsZGF0ZSxzdGFydDsvKiBUaW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCglfX3UzMglzaXplOwkJLyogRmlsZSBzaXplIGluIGJ5dGVzICovCn0gZGlyX2VudHJ5OwoKdHlwZWRlZiBzdHJ1Y3QgZGlyX3Nsb3QgewoJX191OCAgICBpZDsJCS8qIFNlcXVlbmNlIG51bWJlciBmb3Igc2xvdCAqLwoJX191OCAgICBuYW1lMF80WzEwXTsJLyogRmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KCV9fdTggICAgYXR0cjsJCS8qIEF0dHJpYnV0ZSBieXRlICovCglfX3U4ICAgIHJlc2VydmVkOwkvKiBVbnVzZWQgKi8KCV9fdTggICAgYWxpYXNfY2hlY2tzdW07LyogQ2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLwoJX191OCAgICBuYW1lNV8xMFsxMl07CS8qIDYgbW9yZSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KCV9fdTE2ICAgc3RhcnQ7CQkvKiBVbnVzZWQgKi8KCV9fdTggICAgbmFtZTExXzEyWzRdOwkvKiBMYXN0IDIgY2hhcmFjdGVycyBpbiBuYW1lICovCn0gZGlyX3Nsb3Q7CgovKiBQcml2YXRlIGZpbGVzeXN0ZW0gcGFyYW1ldGVycyAqLwp0eXBlZGVmIHN0cnVjdCB7CglpbnQJZmF0c2l6ZTsJLyogU2l6ZSBvZiBGQVQgaW4gYml0cyAqLwoJX191MTYJZmF0bGVuZ3RoOwkvKiBMZW5ndGggb2YgRkFUIGluIHNlY3RvcnMgKi8KCV9fdTE2CWZhdF9zZWN0OwkvKiBTdGFydGluZyBzZWN0b3Igb2YgdGhlIEZBVCAqLwoJX191MTYJcm9vdGRpcl9zZWN0OwkvKiBTdGFydCBzZWN0b3Igb2Ygcm9vdCBkaXJlY3RvcnkgKi8KCV9fdTE2CWNsdXN0X3NpemU7CS8qIFNpemUgb2YgY2x1c3RlcnMgaW4gc2VjdG9ycyAqLwoJX191MTYJZGF0YV9iZWdpbjsJLyogVGhlIHNlY3RvciBvZiB0aGUgZmlyc3QgY2x1c3RlciAqLwoJX191OAlmYXRidWZbRkFUQlVGU0laRV07IC8qIEN1cnJlbnQgRkFUIGJ1ZmZlciAqLwoJaW50CWZhdGJ1Zm51bTsJLyogVXNlZCBieSBnZXRfZmF0ZW50LCBpbml0IHRvIC0xICovCn0gZnNkYXRhOwoKdHlwZWRlZiBpbnQJKGZpbGVfZGV0ZWN0ZnNfZnVuYykodm9pZCk7CnR5cGVkZWYgaW50CShmaWxlX2xzX2Z1bmMpKGNvbnN0IGNoYXIgKmRpcik7CnR5cGVkZWYgbG9uZwkoZmlsZV9yZWFkX2Z1bmMpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsCgkJCQkgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKCnN0cnVjdCBmaWxlc3lzdGVtIHsKCWZpbGVfZGV0ZWN0ZnNfZnVuYyAqZGV0ZWN0OwoJZmlsZV9sc19mdW5jCSAgICpsczsKCWZpbGVfcmVhZF9mdW5jCSAgICpyZWFkOwoJY29uc3QgY2hhcgkgICAgbmFtZVsxMl07Cn07CgovKiBGQVQgdGFibGVzICovCmZpbGVfZGV0ZWN0ZnNfZnVuYwlmaWxlX2ZhdF9kZXRlY3RmczsKZmlsZV9sc19mdW5jCQlmaWxlX2ZhdF9sczsKZmlsZV9yZWFkX2Z1bmMJCWZpbGVfZmF0X3JlYWQ7CgovKiBDdXJyZW50bHkgdGhpcyBkb2Vzbid0IGNoZWNrIGlmIHRoZSBkaXIgZXhpc3RzIG9yIGlzIHZhbGlkLi4uICovCmludCBmaWxlX2NkKGNvbnN0IGNoYXIgKnBhdGgpOwppbnQgZmlsZV9mYXRfZGV0ZWN0ZnModm9pZCk7CmludCBmaWxlX2ZhdF9scyhjb25zdCBjaGFyICpkaXIpOwpsb25nIGZpbGVfZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKY29uc3QgY2hhciAqZmlsZV9nZXRmc25hbWUoaW50IGlkeCk7CmludCBmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubyk7CgojZW5kaWYgLyogX0ZBVF9IXyAqLwo=