ZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvTWFrZWZpbGUgYi9saWJ1cGdyYWRlL01ha2VmaWxlCmluZGV4IDJkMjFlYTguLjhjMjhkYjkgMTAwNjQ0Ci0tLSBhL2xpYnVwZ3JhZGUvTWFrZWZpbGUKKysrIGIvbGlidXBncmFkZS9NYWtlZmlsZQpAQCAtMTEsOSArMTEsOCBAQAogCiBDRkxBR1MgPSAtZyAtT3MKIAotIyB1dGlsLmMgaW5jbHVkZXMgaHR5cGUuaCwgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4gU2tpcCBpdCwgd2UgZG9uJ3QgbmVlZCBpdCByaWdodCBub3cuCi1TUkNTID0gaG14X3VwZ3JhZGUuYyBobXhfdXBncmFkZV9mbGFzaC5jIGhteF91cGdyYWRlX252cmFtLmMgaG14X3VwZ3JhZGVfc3lzdGVtLmMgbGliX3F1ZXVlLmMKLUlOQ1MgPSBobXhfdXBncmFkZS5oIGhteF91cGdyYWRlX2ZsYXNoLmggaG14X3VwZ3JhZGVfbnZyYW0uaCBobXhfdXBncmFkZV9zeXN0ZW0uaCBsaWJfcXVldWUuaCB1dGlsLmgKK1NSQ1MgPSBobXhfdXBncmFkZV9mbGFzaC5jIGhteF91cGdyYWRlX252cmFtLmMKK0lOQ1MgPSBobXhfdXBncmFkZV9udnJhbS5oIGhudnJhbV9kbGlzdC5oCiBPQkpTID0gJChTUkNTOi5jPS5vKQogCiBhbGw6IGxpYmhteHVwZ3JhZGUuYQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZS5jIGIvbGlidXBncmFkZS9obXhfdXBncmFkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIwNDg4Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZS5jICAkCi0gKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQKLSAqIE9yaWdpbmFsIEF1dGhvcjoJCVlhbmcgSHl1biBVayAkCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJAotICogRGF0ZToJCQkkRGF0ZTogMjAxMS4wOS4zMAotICogRmlsZSBEZXNjcmlwdGlvbjoJSFRUUCBMaXZlIFN0cmVhbWluZwotICogTW9kdWxlOgotICogUmVtYXJrczoKLSAqLwotCi0vKioKLSAqCi0gKiBAZGVmZ3JvdXAgVVBHUkFERSBVcGdyYWRlIEFQSXMKLSAqCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQotICogQGRhdGUgMzAgU2VwdCAyMDExCi0gKi8KLQotLyoqCi0gKiBAbm90ZQotICogQ29weXJpZ2h0IChDKSAyMDExIEh1bWF4IENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiA8YnI+Ci0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uCi0gKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IGFwcGxpY2FibGUgbGljZW5zZQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91LgotICovCi0KLSAvKkB7Ki8KLQotLyoqCi0gKiBAZmlsZSBobXhfdXBncmFkZS5jCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiaG14X3VwZ3JhZGUuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0vKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICAJSE1YX1VQR1JBREVfTlVNQkVSX09GX1FVRVVFCTY0Ci0jZGVmaW5lCUhNWF9VUEdSQURFX1RBU0tfUFJJT1JJVFkJCQkJMTAKLSNkZWZpbmUJSE1YX1VQR1JBREVfVEFTS19TVEFDS19TSVpFCQkJCSgxMDI0KjEyOCkKLQotLyogRW5kICNkZWZpbmUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhcnQgdHlwZWRlZiAqLwotLyogRW5kIHR5cGVkZWYgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8KLQotLyoqCi0gKiBVcGdyYWRlIFN0YXR1cyBDYWxsYmFjayBub3RpZmllcyBzdGF0dXMgdG8gQVBQCi0gKi8KLUhNWF9VcGdyYWRlRXZlbnRDYWxsYmFjayBnX2ZVcGdyYWRlU3RhdHVzQ2FsbGJhY2sgPSBOVUxMOwotSE1YX1VQR1JBREVfQ09NTUFORF90IGdfdFVwZ3JhZGVDb21tYW5kOwotLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCXNfdWxVcGdyYWRlVGFza0lkID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIAkJc191bFVwZ3JhZGVNZXNzZ3NlSWQ9MDsKLS8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8KLQotc3RhdGljIHZvaWQgUF9ITVhfVXBncmFkZV9UYXNrKHZvaWQqIHBhcmFtKTsKLQotCi0vKioKLSAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4KLSAqIFN0YXJ0IEh1bWF4IFVwZ3JhZGUgTW9kdWxlLiBpdCBjcmVhdGVzIGEgdGhyZWFkIGZvciBVcGdyYWRpbmcuIDxicj4KLSAqCi0gKiBAcGFyYW1baW5dIGNhbGxiYWNrIDogc3BlY2lmeSBhIGNhbGxiYWNrIHRvIGdldCBVcGdyYWRlIFN0YXR1cy4gaWYgTlVMTCwgVXBncmFkZSBNb2R1bGUgY2FuJ3QgYmUgc3RhcnRlZC4KLSAqIEBwYXJhbVtpbl0gZmlsZSA6IHNwZWNpZnkgYSBmaWxlIHBhdGguIGFsc28gaHR0cCBhZGRyZXNzIHdpbGwgYmUgcG9zc2libGUuIGlmIE5VTEwsIFVwZ3JhZGUgTW9kdWxlIGNhbid0IGJlIHN0YXJ0ZWQuCi0gKgotICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPgotICogICAgICAgICAgIyAgMSA6IGZhaWxlZCA8YnI+Ci0gKgotICovCi1pbnQgSE1YX1VQR1JBREVfU3RhcnQoIEhNWF9VcGdyYWRlRXZlbnRDYWxsYmFjayBjYWxsYmFjaywgIHVuc2lnbmVkIGNoYXIgKiBmaWxlKQotewotCWludCBlcnI7Ci0JSE1YX1VQR1JBREVfQ09NTUFORF90IHVwZ3JhZGVfbXNnOwotCi0JLyogQWRkIENhbGxiYWNrICovCi0JaWYoIGNhbGxiYWNrID09IE5VTEwgKQotCXsKLQkJcHJpbnRmKCJbJXNdIEVSUk9SIGNhbGxiYWNrIHBvcmludGVyIGlzIE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gMTsKLQl9Ci0JZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0KLQlpZiAoIGZpbGUgPT0gTlVMTCApCi0JewotCQlwcmludGYoIlslc10gRVJST1IgZmlsZSBwYXRoIGlzIG5VTExcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQotCWVyciA9IEhNWF9NU0dfQ3JlYXRlKEhNWF9VUEdSQURFX05VTUJFUl9PRl9RVUVVRSwgc2l6ZW9mKEhNWF9VUEdSQURFX0NPTU1BTkRfdCksCSAiVXBncmFkZU1zZ1EiLCAmc191bFVwZ3JhZGVNZXNzZ3NlSWQsIEhNWF9TVVNQRU5EVFlQRV9GSUZPKTsKLQlpZihlcnIgIT0gSE1YX09LKQotCXsKLQkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOwotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCWVyciA9IEhNWF9UQVNLX0NyZWF0ZSggUF9ITVhfVXBncmFkZV9UYXNrLCBITVhfVVBHUkFERV9UQVNLX1BSSU9SSVRZLCBITVhfVVBHUkFERV9UQVNLX1NUQUNLX1NJWkUsICJVcGdyYWRlVGFzayIsIE5VTEwsICZzX3VsVXBncmFkZVRhc2tJZCwgMCk7Ci0JaWYoIGVyciAhPSBITVhfT0sgKQotCXsKLQkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOwotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCUhNWF9UQVNLX1N0YXJ0KHNfdWxVcGdyYWRlVGFza0lkKTsKLQotCXVwZ3JhZGVfbXNnLmNvbW1hbmQgPSBITVhfVVBHUkFERV9GRVRDSDsKLQkvKiB0aGlzIHNob3VsZCBiZSBmcmVlZCBhdCBSZWNpZXZlciAqLwotCXVwZ3JhZGVfbXNnLmZpbGVfcGF0aCA9IHN0cmR1cChmaWxlKTsKLQotCWVyciA9IEhNWF9NU0dfU2VuZChzX3VsVXBncmFkZU1lc3Nnc2VJZCwgJnVwZ3JhZGVfbXNnLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsKLQlpZihlcnIgIT0gSE1YX09LKQotCXsKLQkJcHJpbnRmKCAiW0hNWF9VUEdSQURFX1N0YXJ0XSBITVhfTVNHX1NlbmQgZXJyb3IgOiBlcnIgaXMgMHgleFxuIiwgZXJyKTsKLQkJcmV0dXJuIEhNWF9FUlJPUjsKLQl9Ci0KLQlyZXR1cm4gSE1YX09LOwotfQotCi0vKioKLSAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4KLSAqIFN0b3AgSHVtYXggVXBncmFkZSBNb2R1bGUuIGV2ZW4gaXQgY2FuIGJlIHN0b3BlZCB3aGlsZSBpdCBpcyBSZWFkaW5nIG9yIEZsYXNoaW5nLiA8YnI+Ci0gKgotICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPgotICogICAgICAgICAgIyAgMSA6IGZhaWxlZCA8YnI+Ci0gKgotICovCi1pbnQgSE1YX1VQR1JBREVfU3RvcCh2b2lkKQotewotCWludCBlcnI7Ci0JSE1YX1VQR1JBREVfQ09NTUFORF90IHVwZ3JhZGVfbXNnOwotCXVwZ3JhZGVfbXNnLmNvbW1hbmQgPSBITVhfVVBHUkFERV9TVE9QOwotCi0JZXJyID0gSE1YX01TR19TZW5kVXJnZW50KHNfdWxVcGdyYWRlTWVzc2dzZUlkLCAmdXBncmFkZV9tc2csIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOwotCWlmKGVyciAhPSBITVhfT0spCi0JewotCQlwcmludGYoICJbSE1YX1VQR1JBREVfU3RvcF0gSE1YX01TR19TZW5kIGVycm9yIDogZXJyIGlzIDB4JXhcbiIsIGVycik7Ci0JCXJldHVybiBITVhfRVJST1I7Ci0JfQotCi0JSE1YX1RBU0tfU3RvcChzX3VsVXBncmFkZVRhc2tJZCk7Ci0KLQllcnIgPSBITVhfVEFTS19EZXN0cm95KHNfdWxVcGdyYWRlVGFza0lkKTsKLQlpZiggZXJyICE9IEhNWF9PSyApCi0JewotCQlwcmludGYoIlslc10gWyVkXSBFcnJvcigweCV4KSBcblxyIixfX0ZVTkNUSU9OX18sX19MSU5FX18sIGVycik7Ci0JCXJldHVybiBITVhfRVJST1I7Ci0JfQotCi0JZXJyID0gSE1YX01TR19EZXN0cm95KHNfdWxVcGdyYWRlTWVzc2dzZUlkKTsKLQlpZihlcnIgIT0gSE1YX09LKQotCXsKLQkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOwotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCXJldHVybiBITVhfT0s7Ci19Ci0KLSNpZiAwCi0vKioKLSAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4KLSAqIFNwZWNpZnkgYSBmaWxlIHRvIHVwZ3JhZGUgPGJyPgotICoKLSAqIEBwYXJhbVtpbl0gZmlsZSA6IHNwZWNpZnkgZnVsbCBmaWxlIHBhdGguCi0gKgotICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPgotICogICAgICAgICAgIyAgMSA6IGZhaWxlZCA8YnI+Ci0gKgotICovCi1pbnQgSE1YX1VQR1JBREVfRmV0Y2hGaWxlVG9VcGdyYWRlKHVuc2lnbmVkIGNoYXIgKiBmaWxlKQotewotCWludCBuRXJyOwotCUhNWF9VUEdSQURFX0NPTU1BTkRfdCB1cGdyYWRlX21zZzsKLQotCWlmICggZmlsZSA9PSBOVUxMICkKLQl7Ci0JCXByaW50ZigiWyVzXSBmaWxlIHBhdGggaXMgblVMTFxuIiwgX19GVU5DVElPTl9fKTsKLQl9Ci0KLQl1cGdyYWRlX21zZy5jb21tYW5kID0gSE1YX1VQR1JBREVfRkVUQ0g7Ci0JLyogdGhpcyBzaG91bGQgYmUgZnJlZWQgYXQgUmVjaWV2ZXIgKi8KLQl1cGdyYWRlX21zZy5maWxlX3BhdGggPSBzdHJkdXAoZmlsZSk7Ci0KLQlwcmludGYoIlslc10gZmlsZSBwYXRoIGlzICVzXG4iLCBfX0ZVTkNUSU9OX18sIHVwZ3JhZGVfbXNnLmZpbGVfcGF0aCk7Ci0KLQotCW5FcnIgPSBITVhfTVNHX1NlbmRUaW1lb3V0KHNfdWxVcGdyYWRlTWVzc2dzZUlkLCAmdXBncmFkZV9tc2csIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOwotCWlmKG5FcnIgIT0gSE1YX09LKQotCXsKLQkJcHJpbnRmKCAiW0hNWF9VUEdSQURFX0ZldGNoRmlsZVRvVXBncmFkZV0gSE1YX01TR19TZW5kIGVycm9yIDogZXJyIGlzIDB4JXhcbiIsIG5FcnIpOwotCQlyZXR1cm4gSE1YX0VSUjsKLQl9Ci0KLQlyZXR1cm4gSE1YX09LOwotfQotI2VuZGlmCi0KLXZvaWQgSE1YX1VQR1JBREVfQ2FsbF9DYWxsYmFjayhITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QgKiB1cGdyYWRlX3N0YXR1c19tc2cgKQotewotCWlmICggZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrICE9IE5VTEwgKQotCXsKLQkJZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrKHVwZ3JhZGVfc3RhdHVzX21zZyk7Ci0JfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgZnVudGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIEhNWF9VUEdSQURFX0VWRU5UX2UgUF9ITVhfVVBHUkFERV9GSUxFKHVuc2lnbmVkIGNoYXIgKiBwYXRoKQotewotCUhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdCAqIHVwZ3JhZGVfc3RhdHVzX21zZzsKLQlpbnQgcmV0OwotCXVwZ3JhZGVfc3RhdHVzX21zZyA9IG1hbGxvYyhzaXplb2YoSE1YX1VQR1JBREVfU1RBVFVTX01zZ190KSk7Ci0KLQlwcmludGYgKCJbJXNdIFxuIiwgX19GVU5DVElPTl9fICk7Ci0KLQotCXJldCA9IEhNWF9VUEdSQURFX0hERl9Eb19GbGFzaCggcGF0aCApOwotCWlmICggcmV0ICE9IEhNWF9PSyApCi0JewotCQlwcmludGYgKCJbJXNdIEhNWF9VUEdSQURFX0hERl9Eb19GbGFzaCByZXQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0ICk7Ci0JCXVwZ3JhZGVfc3RhdHVzX21zZy0+ZXZlbnQgPSByZXQ7Ci0JCUhNWF9VUEdSQURFX0NhbGxfQ2FsbGJhY2sodXBncmFkZV9zdGF0dXNfbXNnKTsKLQkJcmV0dXJuIEhNWF9VUEdSQURFX0ZJTEVfTk9UX0VYSVNUOwotCX0KLQotCWZyZWUodXBncmFkZV9zdGF0dXNfbXNnKTsKLQlyZXR1cm4gSE1YX1VQR1JBREVfRE9ORTsKLX0KLQotc3RhdGljIHZvaWQgUF9ITVhfVXBncmFkZV9UYXNrKHZvaWQqIHBhcmFtKQotewotCUhNWF9VUEdSQURFX0VWRU5UX2UgbkVycjsKLQlpbnQgdXBncmFkZV9pc19kb25lID0gMDsKLQlITVhfVVBHUkFERV9DT01NQU5EX3QgcmVjaWV2ZWRfY29tbWFuZDsKLQl1bnNpZ25lZCBjaGFyICogZmlsZV9wYXRoPU5VTEw7Ci0JSE1YX1VQR1JBREVfQ09NTUFORF90IHNlbmRfY29tbWFuZDsKLQotCUhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdCAqIHVwZ3JhZGVfc3RhdHVzX21zZzsKLQl1cGdyYWRlX3N0YXR1c19tc2cgPSBtYWxsb2Moc2l6ZW9mKHVwZ3JhZGVfc3RhdHVzX21zZykpOwotCi0Jd2hpbGUoMSkKLQl7Ci0JCW5FcnIgPSBITVhfTVNHX1JlY2VpdmUoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZyZWNpZXZlZF9jb21tYW5kLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSk7Ci0JCWlmKG5FcnIgIT0gSE1YX09LKQotCQl7Ci0JCQlwcmludGYgKCIlcyAoJWQpIEVycm9yPiAgRXJyb3IgVktfTVNHX1JlY2VpdmVUaW1lb3V0XG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd2l0Y2goIHJlY2lldmVkX2NvbW1hbmQuY29tbWFuZCkKLQkJCXsKLQkJCQljYXNlIEhNWF9VUEdSQURFX1NUQVJUOgotCQkJCQl7Ci0JCQkJCQlwcmludGYoIlslc10gUmVjZWl2ZSBITVhfVVBHUkFERV9TVEFSVCBjb21tYW5kIFxuIixfX0ZVTkNUSU9OX18pOwotCi0JCQkJCQkvKiBETyBVcGdyYWRlIC4uLi4uLi4uIGhlcmUgKi8KLQkJCQkJCW5FcnIgPSBQX0hNWF9VUEdSQURFX0ZJTEUoZmlsZV9wYXRoKTsKLQotCQkJCQkJc2VuZF9jb21tYW5kLmNvbW1hbmQgPSBITVhfVVBHUkFERV9TVE9QOwotCQkJCQkJKHZvaWQpSE1YX01TR19TZW5kKHNfdWxVcGdyYWRlTWVzc2dzZUlkLCAmc2VuZF9jb21tYW5kLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJY2FzZSBITVhfVVBHUkFERV9TVE9QOgotCQkJCQl7Ci0JCQkJCQlwcmludGYoIlslc10gSE1YX1VQR1JBREVfU1RPUCBcclxuIixfX0ZVTkNUSU9OX18pOwotCi0JCQkJCQlmcmVlKHVwZ3JhZGVfc3RhdHVzX21zZyk7Ci0JCQkJCQlmcmVlKGZpbGVfcGF0aCk7Ci0KLQkJCQkJCS8qIE5vdGlmeSB0byBhcHAsIFVQZ3JlYWRlIGlzIGRvbmUuICovCi0JCQkJCQl1cGdyYWRlX3N0YXR1c19tc2ctPmV2ZW50ID0gSE1YX1VQR1JBREVfRE9ORTsKLQkJCQkJCUhNWF9VUEdSQURFX0NhbGxfQ2FsbGJhY2sodXBncmFkZV9zdGF0dXNfbXNnKTsKLQotCQkJCQkJLyogVEFTSyBraWxscyBpdHNlbGYuICovCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCWNhc2UgSE1YX1VQR1JBREVfRkVUQ0g6Ci0JCQkJCXsKLQkJCQkJCXByaW50ZigiWyVzXSBITVhfVVBHUkFERV9GRVRDSCBcclxuIixfX0ZVTkNUSU9OX18pOwotCQkJCQkJZmlsZV9wYXRoID0gc3RyZHVwKHJlY2lldmVkX2NvbW1hbmQuZmlsZV9wYXRoKTsKLQotCQkJCQkJcHJpbnRmKCJbJXNdIGZpbGUgcGF0aCA9ICVzIFxyXG4iLF9fRlVOQ1RJT05fXywgZmlsZV9wYXRoKTsKLQotCQkJCQkJLyogY29tbWFuZCBmaWxlX3BhdGggZnJlZSAqLwotCQkJCQkJZnJlZShyZWNpZXZlZF9jb21tYW5kLmZpbGVfcGF0aCk7Ci0KLQkJCQkJCXNlbmRfY29tbWFuZC5jb21tYW5kID0gSE1YX1VQR1JBREVfU1RBUlQ7Ci0JCQkJCQkodm9pZClITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZzZW5kX2NvbW1hbmQsIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXByaW50ZigiWyVzXSBSZWNlaXZlIFVua25vd24gQ29tbWFuZCBcclxuIixfX0ZVTkNUSU9OX18pOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotLypAfSovCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlLmggYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDRhNDMuLjAwMDAwMDAKLS0tIGEvbGlidXBncmFkZS9obXhfdXBncmFkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlLmggICQKLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJAotICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJAotICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzAKLSAqIEZpbGUgRGVzY3JpcHRpb246CVVwZ3JhZGUgQVBJcwotICogTW9kdWxlOgotICogUmVtYXJrczoKLSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBVUEdSQURFIFVwZ3JhZGUgQVBJcwotICovCi0KLS8qKgotICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkKLSAqIEBkYXRlIDMwIFNlcHQgMjAxMQotICovCi0KLS8qKgotICogQG5vdGUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPgotICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbgotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLSAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UKLSAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4KLSAqLwotCi0gLypAeyovCi0KLS8qKgotICogQGZpbGUgaG14X3VwZ3JhZGUuaAotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSAiaG14X3VwZ3JhZGVfc3lzdGVtLmgiCi0jaW5jbHVkZSAiaG14X3VwZ3JhZGVfZmxhc2guaCIKLS8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRlcm4gdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8KLQotLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8KLS8qIEVuZCBNYWNybyBkZWZpbml0aW9uICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCB0eXBlZGVmICovCi0KLXR5cGVkZWYgZW51bQotewotCUhNWF9VUEdSQURFX1NUQVJULCAJCS8qKjwgKi8KLQlITVhfVVBHUkFERV9TVE9QLCAJCS8qKjwgICovCi0JSE1YX1VQR1JBREVfRkVUQ0gsIAkJLyoqPCAgKi8KLX1ITVhfVVBHUkFERV9DT01NQU5EX2U7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0JSE1YX1VQR1JBREVfQ09NTUFORF9lIGNvbW1hbmQ7Ci0JdW5zaWduZWQgY2hhciAqIGZpbGVfcGF0aDsKLX1ITVhfVVBHUkFERV9DT01NQU5EX3Q7Ci0KLS8qKgotICogSE1YX1VQR1JBREUgU3RhdHVzIGNhc2VzLgotICovCi10eXBlZGVmIGVudW0KLXsKLQlITVhfVVBHUkFERV9TVEFSVEVELCAJCQkJCQkvKio8IFVwZ3JhZGUgTW9kdWxlIGlzIGp1c3Qgc3RhcnRlZCAqLwotCUhNWF9VUEdSQURFX0dFVF9WRVJTSU9OLCAJCQkJLyoqPCB0aGlzIGNvbWVzIHdpdGggdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotCUhNWF9VUEdSQURFX1JFQURJTkcsIAkJCQkJCS8qKjwgcmVhZGluZyBmaWxlLiBVcGdyYWRlIGlzIGluIHByb2dyZXNzLiAqLwotCUhNWF9VUEdSQURFX0ZMQVNISU5HLCAJCQkJCS8qKjwgRmxhc2hpbmcuIFVwZ3JhZGUgaXMgaW4gcHJvZ3Jlc3MuICAqLwotCUhNWF9VUEdSQURFX0RPTkUsIAkJCQkJCS8qKjwgVXBncmFkZSBpcyBkb25lIHdpdGhvdXQgYW55IGVycm9yLCBBZnRlciB0aGlzIG1lc3NhZ2UsIFVwZ3JhZGUgbW9kdWxlIHdpbGwgYmUgZGVzdHJveSBpdHNlbGYuICovCi0JSE1YX1VQR1JBREVfU1RPUEVEX0JZX1VTRVIsIAkJCQkvKio8IFVwZ3JhZGUgaXMgc3RvcHBlZCBieSB1c2VyLiBBZnRlciB0aGlzIG1lc3NhZ2UsIFVwZ3JhZGUgbW9kdWxlIHdpbGwgYmUgZGVzdHJveSBpdHNlbGYuICovCi0JSE1YX1VQR1JBREVfRkFJTEVELCAJCQkJCQkvKio8IFVwZ3JhZGUgaXMgZmFpbGVkLCBpdCBzaG91bGRuJ3QgaGFwcGVuLiBBZnRlciB0aGlzIG1lc3NhZ2UsIFVwZ3JhZGUgbW9kdWxlIHdpbGwgYmUgZGVzdHJveSBpdHNlbGYuKi8KLQlITVhfVVBHUkFERV9WRVJTSU9OX0ZBSUxFRCwgCQkJCS8qKjwgVXBncmFkZSBpcyBmYWlsZWQsIHZlcnNpb24gcHJvYmxlbS4gKi8KLQlITVhfVVBHUkFERV9GSUxFX05PVF9FWElTVCwgCQkJCS8qKjwgVXBncmFkZSBpcyBmYWlsZWQsIHRoZXJlIGlzIG5vIGZpbGUgZXhpc3QgICovCi0JSE1YX1VQR1JBREVfRklMRV9GT1JNQVRfRVJST1IsIAkJCS8qKjwgVXBncmFkZSBpcyBmYWlsZWQsIGZpbGUgaXMgbm90IEhERiBGb3JtYXQgICAqLwotCi19SE1YX1VQR1JBREVfRVZFTlRfZTsKLQotCi0vKioKLSAqIEhNWF9VUEdSQURFX1N0YXR1c19NZXNzYWdlcwotICovCi10eXBlZGVmIHN0cnVjdAotewotCUhNWF9VUEdSQURFX0VWRU5UX2UgZXZlbnQ7CQkvKio8IGV2ZW50IGZyb20gVXBncmFkZSBtb2R1bGUgKi8KLQl1bnNpZ25lZCBpbnQgcGVyY2VudGFnZTsJCS8qKjwgcGVyY2VudGFnZSBwcm9ncmVzcyAqLwotCXVuc2lnbmVkIGludCBjdXJyZW50X3ZlcnNpb247CQkvKio8IHZlcnNpb24gY3VycmVudCAqLwotCXVuc2lnbmVkIGludCB2ZXJzaW9uX3RvX3VwZ3JhZGU7CQkvKio8IHZlcnNpb24gdG8gdXBncmFkZSAqLwotfSBITVhfVVBHUkFERV9TVEFUVVNfTXNnX3Q7Ci0KLS8qKgotICogIFByb3RvdHlwZSBvZiB1cGdyYWRlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIDxicj4KLSAqICBDYWxsYmFjayBjYW4gYmUgYWRkZWQgYnkgSE1YX1VQR1JBREVfU3RhcnQgPGJyPjxicj4KLSAqICBITVhfVVBHUkFERV9SRUFESU5HLCBITVhfVVBHUkFERV9GTEFTSElORyBldmVudHMgYWx3YXlzIGNvbWVzIHdpdGggdmFsdWUgb2YgcGVyY2VudGFnZS4KLSAqLwotdHlwZWRlZiB2b2lkICgqSE1YX1VwZ3JhZGVFdmVudENhbGxiYWNrKSAoSE1YX1VQR1JBREVfU1RBVFVTX01zZ190ICogVXBncmFkZVN0YXR1c01lc3NhZ2VzKTsKLQotLyogRW5kIHR5cGVkZWYgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotZXh0ZXJuIEhNWF9VcGdyYWRlRXZlbnRDYWxsYmFjayBnX2ZVcGdyYWRlU3RhdHVzQ2FsbGJhY2s7Ci0vKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotaW50IEhNWF9VUEdSQURFX1N0YXJ0KCBITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgY2FsbGJhY2ssICB1bnNpZ25lZCBjaGFyICogZmlsZSk7Ci1pbnQgSE1YX1VQR1JBREVfU3RvcCggdm9pZCk7Ci0KLS8qQH0qLwpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5jIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5jCmluZGV4IDEyMzY2MWYuLjEwZTlhYWEgMTAwNjQ0Ci0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guYworKysgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX2ZsYXNoLmMgICQKLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJAotICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQKLSAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkCi0gKiBEYXRlOgkJCSREYXRlOiAyMDExLjA5LjMwCi0gKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMKKy8qIEZpbGUgTmFtZTogICAgICAgICAgICRXb3JrZmlsZTogICBobXhfdXByYWRlX2ZsYXNoLmMgICQKKyAqIFZlcnNpb246ICAgICAgICAgICAgICRSZXZpc2lvbjogICAxLjAgICQKKyAqIE9yaWdpbmFsIEF1dGhvcjogICAgIFlhbmcgSHl1biBVayAkCisgKiBDdXJyZW50IEF1dGhvcjogICAgICAkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkCisgKiBEYXRlOiAgICAgICAgICAgICAgICAkRGF0ZTogMjAxMS4wOS4zMAorICogRmlsZSBEZXNjcmlwdGlvbjogICAgSHVtYXggVXBncmFkZSBBUElzCiAgKiBNb2R1bGU6CiAgKiBSZW1hcmtzOgogICovCkBAIC00OSwyOCArNDksMTcgQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KLSNpbmNsdWRlICJobXhfdXBncmFkZV9mbGFzaC5oIgogLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgI2RlZmluZSAqLworLyogdGhpcyBpcyBmb3IgdGVzdCAqLworI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREICAgICAgICAiL2Rldi9tdGRibG9jazEiCisjZGVmaW5lIFRBUkdFVF9OVlJBTV9NVERDICAgICAgICIvZGV2L210ZDEiCiAvKiBFbmQgI2RlZmluZSAqLwotLyogdGhpcyBpcyBmb3IgdGVzdCAqLwotI2RlZmluZSBUQVJHRVRfQk9PVF9MT0FERVJfTVRECSIvZGV2L210ZGJsb2NrMCIKLQotI2RlZmluZSBUQVJHRVRfTlZSQU1fTVRECSIvZGV2L210ZGJsb2NrMSIKLSNkZWZpbmUgVEFSR0VUX05WUkFNX01UREMJIi9kZXYvbXRkMSIKLQotLyogdGhpcyBpcyBmb3IgdGVzdCAqLwotI2RlZmluZSBUQVJHRVRfS0VSTkVMX01URAkiL2Rldi9tdGRibG9jazEwIgotCi0vKiB0aGlzIGlzIGZvciB0ZXN0IHViaSBtYXBwZWQgKi8KLSNkZWZpbmUgVEFSR0VUX1JPT1RGU19VQklfTVRECSIvZGV2L210ZGJsb2NrMTEiCi0KLQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MSwzNTAgKzgwLDEyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwotaW50IGZkX2tlcm5lbCA9IDA7Ci1pbnQgZmRfcm9vdGZzID0gMDsKLWludCBmZF9ib29ybG9hZGVyID0gMDsKIGludCBmZF9udnJhbSA9IDA7CiBpbnQgZmRfbnZyYW1fYyA9IC0xOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlzX0ZsYXNoVG90YWxTaXplOwotc3RhdGljIHVuc2lnbmVkIGxvbmcJc19GbGFzaEJsb2NrU2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICAgIHNfRmxhc2hUb3RhbFNpemU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBzX0ZsYXNoQmxvY2tTaXplOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNfQmxvY2tCdWZmOwotCiAvKiBFbmQgc3RhdGljIHZhcmlhYmxlICovCi1pbnQgSE1YX1VQR1JBREVfRmxhc2hfS2VybmVsKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsKLWludCBITVhfVVBHUkFERV9GbGFzaF9Sb290ZnModW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOwotaW50IEhNWF9VUEdSQURFX0ZsYXNoX0Jvb3RMb2FkZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOwotCi0KLQotdW5zaWduZWQgY2hhciAqIEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9LZXJuZWxfTVREKHZvaWQpCi17Ci0JcmV0dXJuIFRBUkdFVF9LRVJORUxfTVREOwotfQotCi11bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX1Jvb3Rmc19NVEQodm9pZCkKLXsKLQlyZXR1cm4gVEFSR0VUX1JPT1RGU19VQklfTVREOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICkKK2ludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKQogewotCWludCByZXQ7Ci0Jc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKLQl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7Ci0JdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsKKyAgaW50IHJldDsKKyAgc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOworICB1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOwogCi0JaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOworICBpZiAobGlidXBncmFkZV92ZXJib3NlKSBwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKIAotCS8qICovCi0JaWYgKCBmZF9udnJhbSA9PSAwICkKLQl7Ci0JCWZkX252cmFtID0gb3BlbihUQVJHRVRfTlZSQU1fTVRELCAoT19SRFdSIHwgT19TWU5DKSApOwotCQlpZiggZmRfbnZyYW0gPCAwICkKLQkJewotCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgIC8qICovCisgIGlmICggZmRfbnZyYW0gPT0gMCApIHsKKyAgICBmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKKyAgICBpZiggZmRfbnZyYW0gPCAwICkgeworICAgICAgcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CiAKLQlpZiAoIGZkX252cmFtX2MgPCAwICkKLQl7Ci0JCWZkX252cmFtX2MgPSBvcGVuKFRBUkdFVF9OVlJBTV9NVERDLCAoT19SRFdSIHwgT19TWU5DKSApOwotCQlpZiggZmRfbnZyYW1fYyA8IDAgKQotCQl7Ci0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgaWYgKCBmZF9udnJhbV9jIDwgMCApIHsKKyAgICBmZF9udnJhbV9jID0gb3BlbihUQVJHRVRfTlZSQU1fTVREQywgKE9fUkRXUiB8IE9fU1lOQykgKTsKKyAgICBpZiggZmRfbnZyYW1fYyA8IDAgKSB7CisgICAgICBwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KIAotCXJldCA9IGlvY3RsKGZkX252cmFtX2MsIE1FTUdFVElORk8sKHZvaWQgKikmaW5mbyk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgcmV0ID0gaW9jdGwoZmRfbnZyYW1fYywgTUVNR0VUSU5GTywodm9pZCAqKSZpbmZvKTsKKyAgaWYocmV0IDwgMCkgeworICAgIHByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsKKyAgICByZXR1cm4gLTE7CisgIH0KIAotCXJlbWFpbl9zaXplID0gc2l6ZTsKLQltb3Zfb2Zmc2V0ID0gb2Zmc2V0OworICByZW1haW5fc2l6ZSA9IHNpemU7CisgIG1vdl9vZmZzZXQgPSBvZmZzZXQ7CiAKLQl3aGlsZShyZW1haW5fc2l6ZSA+IDApCi0JewotCQkvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLwotCQl3cml0ZV9zaXplID0gaW5mby5lcmFzZXNpemU7Ci0JCXdyaXRlX3NpemUgLT0gKChtb3Zfb2Zmc2V0ICsgaW5mby5lcmFzZXNpemUpJWluZm8uZXJhc2VzaXplKTsKKyAgd2hpbGUocmVtYWluX3NpemUgPiAwKSB7CisgICAgLyogb2Zmc2V0wMwgYmxvY2sgs9G+7rytuOkgvsi1yLTZLi4gKi8KKyAgICB3cml0ZV9zaXplID0gaW5mby5lcmFzZXNpemU7CisgICAgd3JpdGVfc2l6ZSAtPSAoKG1vdl9vZmZzZXQgKyBpbmZvLmVyYXNlc2l6ZSklaW5mby5lcmFzZXNpemUpOwogCi0JCS8qILi2wfa4t8C6ILOquNPB9iC4uMWtLi4gKi8KLQkJaWYoIHJlbWFpbl9zaXplIDwgd3JpdGVfc2l6ZSkKLQkJewotCQkJd3JpdGVfc2l6ZSA9IHJlbWFpbl9zaXplOwotCQl9CisgICAgLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLworICAgIGlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpIHsKKyAgICAgIHdyaXRlX3NpemUgPSByZW1haW5fc2l6ZTsKKyAgICB9CiAKLQkJaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCIgd3JpdGUgOiBvZmZzZXQgLSAweCV4LCBzaXplICVkXG4iLCBtb3Zfb2Zmc2V0LCB3cml0ZV9zaXplKTsKKyAgICBpZiAobGlidXBncmFkZV92ZXJib3NlKSB7CisgICAgICBwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOworICAgIH0KIAotCQlyZXQgPSBsc2VlayhmZF9udnJhbSwgbW92X29mZnNldCwgU0VFS19TRVQpOwotCQlpZihyZXQgPCAwKQotCQl7Ci0JCQlwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICByZXQgPSBsc2VlayhmZF9udnJhbSwgbW92X29mZnNldCwgU0VFS19TRVQpOworICAgIGlmKHJldCA8IDApIHsKKyAgICAgIHByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkJcmV0ID0gd3JpdGUoZmRfbnZyYW0sIGRhdGErKG1vdl9vZmZzZXQtb2Zmc2V0KSwgd3JpdGVfc2l6ZSk7Ci0JCWlmKHJldCA8IDApCi0JCXsKLQkJCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIHJldCA9IHdyaXRlKGZkX252cmFtLCBkYXRhKyhtb3Zfb2Zmc2V0LW9mZnNldCksIHdyaXRlX3NpemUpOworICAgIGlmKHJldCA8IDApIHsKKyAgICAgIHByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkJbW92X29mZnNldCArPSB3cml0ZV9zaXplOwotCQlyZW1haW5fc2l6ZSAtPSB3cml0ZV9zaXplOwotCX0KKyAgICBtb3Zfb2Zmc2V0ICs9IHdyaXRlX3NpemU7CisgICAgcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsKKyAgfQogCi0JcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi1pbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICkKK2ludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplICkKIHsKLQlpbnQgcmV0OwotCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87Ci0JdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOwotCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7CisgIGludCByZXQ7CisgIHN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87CisgIHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgd3JpdGVfc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsKIAotCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKKyAgaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7CiAKLQkvKiAqLwotCWlmICggZmRfbnZyYW0gPT0gMCApCi0JewotCQlmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKLQkJaWYoIGZkX252cmFtIDwgMCApCi0JCXsKLQkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAvKiAqLworICBpZiAoIGZkX252cmFtID09IDAgKSB7CisgICAgZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7CisgICAgaWYoIGZkX252cmFtIDwgMCApIHsKKyAgICAgIHByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQogCiAKLQlyZXQgPSBsc2VlayhmZF9udnJhbSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOworICBpZihyZXQgPCAwKSB7CisgICAgcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOworICAgIHJldHVybiAtMTsKKyAgfQogCi0JcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKyAgcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7CisgIGlmKHJldCA8IDApIHsKKyAgICBwcmludGYoImNhbid0IHJlYWQgZGF0YSEgKCVkKVxuIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKIAotCi1pbnQgSE1YX1VQR1JBREVfRmxhc2hfS2VybmVsKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciAqIGNvbV9idWY7Ci0KLQlwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7Ci0JLyogKi8KLQlpZiAoIGZkX2tlcm5lbCA9PSAwICkKLQl7Ci0JCWZkX2tlcm5lbCA9IG9wZW4oSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX0tlcm5lbF9NVEQoKSwgKE9fUkRXUiB8IE9fU1lOQykgKTsKLQkJaWYoIGZkX2tlcm5lbCA8IDAgKQotCQl7Ci0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiBmZF9rZXJuZWwhXG4iICk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBsc2VlayhmZF9rZXJuZWwsIG9mZnNldCwgU0VFS19TRVQpOwotCWlmKHJldCA8IDApCi0JewotCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHdyaXRlKGZkX2tlcm5lbCwgZGF0YSwgc2l6ZSk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBSZWFkIGFuZCBDb21wYXJlICovCi0JcmV0ID0gbHNlZWsoZmRfa2VybmVsLCBvZmZzZXQsIFNFRUtfU0VUKTsKLQlpZihyZXQgPCAwKQotCXsKLQkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljb21fYnVmID0gbWFsbG9jKHNpemUpOwotCWlmIChjb21fYnVmID09IE5VTEwgKQotCXsKLQkJcHJpbnRmKCJtYWxsb2MgZmFpZWQhISEgXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IHJlYWQoZmRfa2VybmVsLCBjb21fYnVmLCBzaXplKTsKLQlpZihyZXQgPCAwKQotCXsKLQkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApCi0JewotCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZnJlZShjb21fYnVmKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgSE1YX1VQR1JBREVfRmxhc2hfQm9vdExvYWRlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87Ci0JdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOwotCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7Ci0KLQlwcmludGYgKCAiU0tJUCBCT09UIExPQURFUi4uLiBcbiIpOwotCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKLQotCXJldHVybiAwOwotCi0JLyogKi8KLQlpZiAoIGZkX2Jvb3Jsb2FkZXIgPT0gMCApCi0JewotCQlmZF9ib29ybG9hZGVyID0gb3BlbihUQVJHRVRfQk9PVF9MT0FERVJfTVRELCAoT19SRFdSIHwgT19TWU5DKSApOwotCQlpZiggZmRfYm9vcmxvYWRlciA8IDAgKQotCQl7Ci0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldCA9IGlvY3RsKGZkX2Jvb3Jsb2FkZXIsIE1FTUdFVElORk8sKHZvaWQgKikmaW5mbyk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJlbWFpbl9zaXplID0gc2l6ZTsKLQltb3Zfb2Zmc2V0ID0gb2Zmc2V0OwotCi0Jd2hpbGUocmVtYWluX3NpemUgPiAwKQotCXsKLQkJLyogb2Zmc2V0wMwgYmxvY2sgs9G+7rytuOkgvsi1yLTZLi4gKi8KLQkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOwotCQl3cml0ZV9zaXplIC09ICgobW92X29mZnNldCArIGluZm8uZXJhc2VzaXplKSVpbmZvLmVyYXNlc2l6ZSk7Ci0KLQkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLwotCQlpZiggcmVtYWluX3NpemUgPCB3cml0ZV9zaXplKQotCQl7Ci0JCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7Ci0JCX0KLQotCQlwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOwotCi0JCXJldCA9IGxzZWVrKGZkX2Jvb3Jsb2FkZXIsIG1vdl9vZmZzZXQsIFNFRUtfU0VUKTsKLQkJaWYocmV0IDwgMCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcmV0ID0gd3JpdGUoZmRfYm9vcmxvYWRlciwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsKLQkJaWYocmV0IDwgMCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbW92X29mZnNldCArPSB3cml0ZV9zaXplOwotCQlyZW1haW5fc2l6ZSAtPSB3cml0ZV9zaXplOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgSE1YX1VQR1JBREVfRmxhc2hfUm9vdGZzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciAqIGNvbV9idWY7Ci0JcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOwotCi0JLyogKi8KLQlpZiAoIGZkX3Jvb3RmcyA9PSAwICkKLQl7Ci0JCWZkX3Jvb3RmcyA9IG9wZW4oSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX1Jvb3Rmc19NVEQoKSwgKE9fUkRXUiB8IE9fU1lOQykgKTsKLQkJaWYoIGZkX3Jvb3RmcyA8IDAgKQotCQl7Ci0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiBmZF9rZXJuZWwhXG4iICk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBsc2VlayhmZF9yb290ZnMsIG9mZnNldCwgU0VFS19TRVQpOwotCWlmKHJldCA8IDApCi0JewotCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHdyaXRlKGZkX3Jvb3RmcywgZGF0YSwgc2l6ZSk7Ci0JaWYocmV0IDwgMCkKLQl7Ci0JCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBSZWFkIGFuZCBDb21wYXJlICovCi0JcmV0ID0gbHNlZWsoZmRfcm9vdGZzLCBvZmZzZXQsIFNFRUtfU0VUKTsKLQlpZihyZXQgPCAwKQotCXsKLQkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljb21fYnVmID0gbWFsbG9jKHNpemUpOwotCWlmIChjb21fYnVmID09IE5VTEwgKQotCXsKLQkJcHJpbnRmKCJtYWxsb2MgZmFpZWQhISEgXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldCA9IHJlYWQoZmRfcm9vdGZzLCBjb21fYnVmLCBzaXplKTsKLQlpZihyZXQgPCAwKQotCXsKLQkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApCi0JewotCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZnJlZShjb21fYnVmKTsKLQotCXJldHVybiAwOwotCi0KLX0KLQotCi0KIC8qQH0qLwpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIzYTJlLi4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX2ZsYXNoLmggICQKLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJAotICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJAotICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzAKLSAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcwotICogTW9kdWxlOgotICogUmVtYXJrczoKLSAqLwotCi0vKioKLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCi0gKiBAZGF0ZSAzMCBTZXB0IDIwMTEKLSAqLwotCi0vKioKLSAqIEBub3RlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4KLSAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KLSAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlCi0gKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuCi0gKi8KLQotIC8qQHsqLwotCi0vKioKLSAqIEBmaWxlIGhteF91cGdyYWRlX2ZsYXNoLmgKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovCi0KLS8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRlcm4gdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8KLQotLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8KLQotLyogRW5kIE1hY3JvIGRlZmluaXRpb24gKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IHR5cGVkZWYgKi8KLQotCi0vKiBFbmQgdHlwZWRlZiAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLS8qIEVuZCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi0vKkB9Ki8KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uYyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uYwppbmRleCA3NzZiNDdmLi42YmM2ZDczIDEwMDY0NAotLS0gYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX252cmFtLmMKKysrIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5jCkBAIC0xLDEyICsxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9udnJhbS5jICAkCi0gKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQKLSAqIE9yaWdpbmFsIEF1dGhvcjoJCVlhbmcgSHl1biBVayAkCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJAotICogRGF0ZToJCQkkRGF0ZTogMjAxMS4xMS4wNwotICogRmlsZSBEZXNjcmlwdGlvbjoJSHVtYXggVXBncmFkZSBBUElzCisvKiBGaWxlIE5hbWU6ICAgICAgICAgICAkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9udnJhbS5jICAkCisgKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCisgKiBPcmlnaW5hbCBBdXRob3I6ICAgICBZYW5nIEh5dW4gVWsgJAorICogQ3VycmVudCBBdXRob3I6ICAgICAgJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJAorICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMTEuMDcKKyAqIEZpbGUgRGVzY3JpcHRpb246ICAgIEh1bWF4IFVwZ3JhZGUgQVBJcwogICogTW9kdWxlOgogICogUmVtYXJrczoKICAqLwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi0jaW5jbHVkZSAibGliX3F1ZXVlLmgiCisjaW5jbHVkZSAiaG52cmFtX2RsaXN0LmgiCiAjaW5jbHVkZSAiaG14X3VwZ3JhZGVfbnZyYW0uaCIKIC8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLwogCkBAIC01MiwxODMgKzUyLDEyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgI2RlZmluZSAqLworI2RlZmluZSBOVlJBTV9UWVBFX0xFTiAgICAgICAgICAxCisjZGVmaW5lIE5WUkFNX1JFQ09SRF9MRU5HX0xFTiAgIDQKKyNkZWZpbmUgTlZSQU1fTkFNRV9MRU5HX0xFTiAgICAgMQorI2RlZmluZSBOVlJBTV9EQVRBX0xFTkdfTEVOICAgICA0CiAKLSNkZWZpbmUgTlZSQU1fVFlQRV9MRU4JCQkxCi0jZGVmaW5lIE5WUkFNX1JFQ09SRF9MRU5HX0xFTgk0Ci0jZGVmaW5lIE5WUkFNX05BTUVfTEVOR19MRU4JCTEKLSNkZWZpbmUgTlZSQU1fREFUQV9MRU5HX0xFTgkJNAorI2RlZmluZSBNQVhfTkFNRV9MRU4gICAgICAgICAgICAoMjU2KQorI2RlZmluZSBNQVhfREFUQV9MRU4gICAgICAgICAgICAoMjU2KjEwMjQpCisjZGVmaW5lIE1BWF9GSUVMRF9MRU4gICAgICAgICAgIChNQVhfREFUQV9MRU4rTUFYX05BTUVfTEVOKjIpCiAKLSNkZWZpbmUgTUFYX05BTUVfTEVOCQkoMjU2KQotI2RlZmluZSBNQVhfREFUQV9MRU4JCSgyNTYqMTAyNCkKLSNkZWZpbmUgTUFYX0ZJRUxEX0xFTgkJKE1BWF9EQVRBX0xFTitNQVhfTkFNRV9MRU4qMikKLQotI2RlZmluZSBOVlJBTV9UTFZfVFlQRV9FTkQJMHgwMAotI2RlZmluZSBOVlJBTV9UTFZfVFlQRV9FTlYJMHgwMQorI2RlZmluZSBOVlJBTV9UTFZfVFlQRV9FTkQgICAgICAweDAwCisjZGVmaW5lIE5WUkFNX1RMVl9UWVBFX0VOViAgICAgIDB4MDEKIAogI2RlZmluZSBnZXQ4Yml0KHEpICh1bnNpZ25lZCBjaGFyKSgocSlbMF0pCi0jZGVmaW5lIGdldDMyYml0KHEpICh1bnNpZ25lZCBpbnQpKCgoKih1bnNpZ25lZCBjaGFyICopKHEpKSA8PCAyNCkgfCAoKigodW5zaWduZWQgY2hhciAqKShxKSsxKSA8PCAxNikgfCAoKigodW5zaWduZWQgY2hhciAqKShxKSsyKSA8PCA4KSB8ICgqKCh1bnNpZ25lZCBjaGFyICopKHEpKzMpKSApCisjZGVmaW5lIGdldDMyYml0KHEpICh1bnNpZ25lZCBpbnQpKCgoKih1bnNpZ25lZCBjaGFyICopKHEpKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh1bnNpZ25lZCBjaGFyICopKHEpKzEpIDw8IDE2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHVuc2lnbmVkIGNoYXIgKikocSkrMikgPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh1bnNpZ25lZCBjaGFyICopKHEpKzMpKSApCiAKICNkZWZpbmUgREVCVUdfRVJSKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgI2FyZ3MpCiAjZGVmaW5lIERFQlVHX0lORk8oZm10LCBhcmdzLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjYXJncykKICNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQogCi0jZGVmaW5lIE1BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEgJMzIKKyNkZWZpbmUgTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSCAgICAgICAzMgogCi0jZGVmaW5lIFNFTV9HZXQoeCkJKHZvaWQpKHgpCi0jZGVmaW5lIFNFTV9SZWxlYXNlKHgpCSh2b2lkKSh4KQorI2RlZmluZSBTRU1fR2V0KHgpICAgICAgKHZvaWQpKHgpCisjZGVmaW5lIFNFTV9SZWxlYXNlKHgpICAodm9pZCkoeCkKIAotI2RlZmluZSBOVlJBTV9ST19PRkZTRVQJMHgwCi0jZGVmaW5lIE5WUkFNX1JPX1NJWkUJCTB4MDAxMDAwMDAKLSNkZWZpbmUgTlZSQU1fUldfT0ZGU0VUCSggTlZSQU1fUk9fT0ZGU0VUICsgTlZSQU1fUk9fU0laRSApCi0jZGVmaW5lIE5WUkFNX1JXX1NJWkUJCTB4MDAwNDAwMDAKLSNkZWZpbmUgTlZSQU1fUldCX09GRlNFVAkoIE5WUkFNX1JXX09GRlNFVCArIE5WUkFNX1JXX1NJWkUpCi0jZGVmaW5lIE5WUkFNX1JXQl9TSVpFCQkweDAwMDIwMDAwCi0jZGVmaW5lIFJBV19GU19PRkZTRVQJCSggTlZSQU1fUldCX09GRlNFVCArIE5WUkFNX1JXQl9TSVpFKQotI2RlZmluZSBSQVdfRlNfU0laRQkJMHgwMDAyMDAwMAotCisjZGVmaW5lIE5WUkFNX1JPX09GRlNFVCAgICAgICAgIDB4MAorI2RlZmluZSBOVlJBTV9ST19TSVpFICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WUkFNX1JXX09GRlNFVCAoIE5WUkFNX1JPX09GRlNFVCArIE5WUkFNX1JPX1NJWkUgKQorI2RlZmluZSBOVlJBTV9SV19TSVpFICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIE5WUkFNX1JXQl9PRkZTRVQgICAgICAgICggTlZSQU1fUldfT0ZGU0VUICsgTlZSQU1fUldfU0laRSkKKyNkZWZpbmUgTlZSQU1fUldCX1NJWkUgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBSQVdfRlNfT0ZGU0VUICAgICAgICAgICAoIE5WUkFNX1JXQl9PRkZTRVQgKyBOVlJBTV9SV0JfU0laRSkKKyNkZWZpbmUgUkFXX0ZTX1NJWkUgICAgICAgICAgICAgMHgwMDAyMDAwMAogLyogRW5kICNkZWZpbmUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU3RhcnQgdHlwZWRlZiAqLwotCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9FVk5WQVJfdHsKLSAgICBxdWV1ZV90IHFiOwotCXVuc2lnbmVkIGludCByZWNMZW47Ci0JdW5zaWduZWQgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBjaGFyIG5hbWVMZW47Ci0JdW5zaWduZWQgY2hhciAqdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbHVlTGVuOwordHlwZWRlZiBzdHJ1Y3QgTlZSQU1fRVZOVkFSX3QgeworICBkbGlzdF9oZHJfdCBkbGlzdF9oZHI7CisgIHVuc2lnbmVkIGludCByZWNMZW47CisgIHVuc2lnbmVkIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGNoYXIgbmFtZUxlbjsKKyAgdW5zaWduZWQgY2hhciAqdmFsdWU7CisgIHVuc2lnbmVkIGludCB2YWx1ZUxlbjsKIH0gTlZSQU1fRVZOVkFSX1Q7CiAKLQotCi10eXBlZGVmIHN0cnVjdCBITVhfTlZSQU1fTUFQX3QKLXsKLQlOVlJBTV9GSUVMRF9UCQl0eXBlOwotCXVuc2lnbmVkIGNoYXIJCQkJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07Ci0JSE1YX05WUkFNX1BBUlRJVElPTl9FCXN0b3JlUGFydGl0aW9uOwotCXVuc2lnbmVkIGludAkJCQkJZGVmYXVsdFNpemU7Cit0eXBlZGVmIHN0cnVjdCBITVhfTlZSQU1fTUFQX3QgeworICBOVlJBTV9GSUVMRF9UICAgICAgICAgdHlwZTsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgIHN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07CisgIEhNWF9OVlJBTV9QQVJUSVRJT05fRSBzdG9yZVBhcnRpdGlvbjsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgIGRlZmF1bHRTaXplOwogfSBITVhfTlZSQU1fRklFTERfSU5GT19UOwogCi1ITVhfTlZSQU1fRklFTERfSU5GT19UIHNfbnZyYW1GaWVsZEluZm9bXSA9Ci17Ci0Je05WUkFNX0ZJRUxEX1NZU1RFTV9JRAkJCSAsICJTWVNURU1fSUQiICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX1NGTEFTSAkJCQkgLCAiU0ZMQVNIIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9TRVJJQUxfTk8gICAgICAgICAgICAsICJTRVJJQUxfTk8iICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0RUQ1BfS0VZICAgICAgICAgICAgICwgIkRUQ1BfS0VZIiAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKLQl7TlZSQU1fRklFTERfQ0lfUExVU19LRVkgICAgICAgICAgLCAiQ0lfUExVU19LRVkiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9NQUNfQUREUiAgICAgICAgICAgICAsICJNQUNfQUREUiIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0hEQ1BfS0VZICAgICAgICAgICAgICwgIkhEQ1BfS0VZIiAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKLQl7TlZSQU1fRklFTERfUEFSSU5HX0RBVEEgICAgICAgICAgLCAiUEFSSU5HX0RBVEEiICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9DTV9TRVJJQUxfTk8gICAgICAgICAsICJDTV9TRVJJQUxfTk8iICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0NNX01BQ19BRERSICAgICAgICAgICwgIkNNX01BQ19BRERSIiAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKLQl7TlZSQU1fRklFTERfQ01fTUFDX0FERFJfQU5PVEhFUiAgLCAiQ01fTUFDX0FERFJfQU5PVEhFUiIgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9JUkRFVE9fQkJDQiAgICAgICAgICAsICJJUkRFVE9fQkJDQiIgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0lSREVUT19DUENCIAkJICwgIklSREVUT19DUENCIgkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfSVJERVRPX0NQQ0JfRU5DUllQVEVELCAiSVJERVRPX0NQQ0JfRU5DUllQVEVEIiAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9QUklWQVRFICAgICAgICAgICAgICAsICJQUkFWQVRFIiAgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0NTQ19LRVkgICAgICAgICAgICAgICwgIkNTQ19LRVkiICAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKLQl7TlZSQU1fRklFTERfMVNUX1NFUklBTF9OVU1CRVIJCQksICIxU1RfU0VSSUFMX05VTUJFUiIJCSwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEXzJORF9TRVJJQUxfTlVNQkVSCQkJLCAiMk5EX1NFUklBTF9OVU1CRVIiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9HUE4JCQksICJHUE4iCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9NQUNfQUREUl9NT0NBCQksICJNQUNfQUREUl9NT0NBIgksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9NQUNfQUREUl9CVAkJLCAiTUFDX0FERFJfQlQiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAotCXtOVlJBTV9GSUVMRF9HT09HTEVfU1NMX1BFTQksICJHT09HTEVfU1NMX1BFTSIJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKLQl7TlZSQU1fRklFTERfR09PR0xFX1NTTF9DUlQJLCAiR09PR0xFX1NTTF9DUlQiCSwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCi0Je05WUkFNX0ZJRUxEX0xPQURFUl9WRVIJCQkgLCAiTE9BREVSX1ZFUiIgCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9BUFBfVkVSIAkJCSAsICJBUFBfVkVSIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0xBTkdVQUdFCQkJICwgIkxBTkdVQUdFIiAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfVFZfU1RBTkRBUkQJCQkgLCAiVFZfU1RBTkRBUkQiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9TQ0FSVF9SR0IJCQkgLCAiU0NBUlRfUkdCIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9IRF9SRVNPVUxUSU9OCQkgLCAiSERfUkVTT1VMVElPTiIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0ZJRUxEX1JBVEUJCSAgICAgLCAiRklFTERfUkFURSIJCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9PVEFfRkxBRzEJCQkgLCAiT1RBX0ZMQUcxIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9PVEFfRkxBRzIJCQkgLCAiT1RBX0ZMQUcyIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9PVEFfRkxBRzMJCQkgLCAiT1RBX0ZMQUczIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9PVEFfVFlQRTEJCQkgLCAiT1RBX1RZUEUxIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX09UQV9UWVBFMgkJCSAsICJPVEFfVFlQRTIiCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfT1RBX1RZUEUzCQkJICwgIk9UQV9UWVBFMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9DSF9UWVBFMSAJCQkgLCAiQ0hfVFlQRTEiCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQ0hfVFlQRTIgCQkJICwgIkNIX1RZUEUyIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0NIX1RZUEUzIAkJCSAsICJDSF9UWVBFMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9UVU5FUl9JRDEJCQkgLCAiVFVORVJfSUQxIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1RVTkVSX0lEMgkJCSAsICJUVU5FUl9JRDIiCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfVFVORVJfSUQzCQkJICwgIlRVTkVSX0lEMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIxCQkgLCAiQU5URU5BX1BPV0VSMSIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjIJCSAsICJBTlRFTkFfUE9XRVIyIgkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQU5URU5BX1BPV0VSMwkJICwgIkFOVEVOQV9QT1dFUjMiCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9FU19QSUQxCQkJCSAsICJFU19QSUQxIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9FU19QSUQyCQkJCSAsICJFU19QSUQyIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9FU19QSUQzCQkJCSAsICJFU19QSUQzIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDEJCSAsICJUUkFOU0FDVElPTl9JRDEiIAkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDIJCSAsICJUUkFOU0FDVElPTl9JRDIiIAkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDMJCSAsICJUUkFOU0FDVElPTl9JRDMiICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0FQUF9WRVJTSU9OCQkJICwgIkFQUF9WRVJTSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfT1RBTERSX1ZFUlNJT04JCSAsICJPVEFMRFJfVkVSU0lPTiIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0NVUl9PVEFJTUFHRV9WRVJTSU9OICwgIkNVUl9PVEFJTUFHRV9WRVJTSU9OIiAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfT0FEX1ZFUlNJT04JCQkgLCAiT0FEX1ZFUlNJT04iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9ORVRfSVBfQ09ORklHIAkJICwgIk5FVF9JUF9DT05GSUciICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfTkVUX0lQX1NFVFRJTkcJCSAsICJORVRfSVBfU0VUVElORyIgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERQkJICwgIlJDVV9DVVNUT01fQ09ERSIgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfUkNVX0NVU1RPTV9DT0RFMgkgLCAiUkNVX0NVU1RPTV9DT0RFMiIgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9QQU5FTF9ESVNQTEFZCQkgLCAiUEFORUxfRElTUExBWSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1BBTkVMX0RJTU1JTkcgCQkgLCAiUEFORUxfRElNTUlORyIgCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9BU1BFQ1RfUkFUSU8gCQkgLCAiQVNQRUNUX1JBVElPIiAJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0NPVU5UUllfQ09ERQkJICwgIkNPVU5UUllfQ09ERSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1VTQUdFX0lECQkJICwgIlVTQUdFX0lEIiAgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQ0hfSU5GT19TCQkJICwgIkNIX0lORk9fUyIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQ0hfSU5GT19UCQkJICwgIkNIX0lORk9fVCIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQ0hfSU5GT19DCQkJICwgIkNIX0lORk9fQyIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfT1RBX0ZUUF9JTkZPCQkgLCAiRlRQX09UQV9JTkZPIgkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfTkVUX1BPUlRBTF9JUAkJICwgIk5FVF9QT1JUQUxfSVAiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9ORVRfRE9XTl9QQVRIIAkJICwgIk5FVF9ET1dOX1BBVEgiIAkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04JCSAsICJMT0FERVJfVkVSU0lPTiIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX09TRF9ESVNQTEFZCQkJICwgIk9TRF9ESVNQTEFZIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sICJBQ1RJVkFURURfS0VSTkVMX05VTSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX01URF9UWVBFX0ZPUl9LRVJORUwJCQkgLCAiTVREX1RZUEVfRk9SX0tFUk5FTCIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRQkJLCAiQUNUSVZBVEVEX0tFUk5FTF9OQU1FIgksIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAotCXtOVlJBTV9GSUVMRF9FWFRSQV9LRVJORUxfT1BUCQkJLCAiRVhUUkFfS0VSTkVMX09QVCIJCSwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1BMQVRGT1JNX05BTUUJCQksICJQTEFURk9STV9OQU1FIgkJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQl7TlZSQU1fRklFTERfUEFJUkVEX0RJU0sJCQksICJQQUlSRURfRElTSyIJCSwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCi0Je05WUkFNX0ZJRUxEX1BBUlRJVElPTl9WRVIJCQksICJQQVJUSVRJT05fVkVSIgkJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKLQotCXtOVlJBTV9GSUVMRF9CSU44SwkJCQkgLCAiQklOOEsiCQkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMHgyMDAwfSwKLQl7TlZSQU1fRklFTERfUkFXRlMJCQkJICwgIlJBV0ZTIiAJCQkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMsIFJBV19GU19TSVpFfSwKLQl7TlZSQU1fRklFTERfRFVNTVkgCQkJCSAsICJEVU1NWSIgCQkJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0KK0hNWF9OVlJBTV9GSUVMRF9JTkZPX1Qgc19udnJhbUZpZWxkSW5mb1tdID0geworICB7TlZSQU1fRklFTERfU1lTVEVNX0lELCAiU1lTVEVNX0lEIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCisgIHtOVlJBTV9GSUVMRF9TRVJJQUxfTk8sICJTRVJJQUxfTk8iLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX01BQ19BRERSLCAiTUFDX0FERFIiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX0hEQ1BfS0VZLCAiSERDUF9LRVkiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX0RUQ1BfS0VZLCAiRFRDUF9LRVkiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEXzFTVF9TRVJJQUxfTlVNQkVSLCAiMVNUX1NFUklBTF9OVU1CRVIiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLAorICAgIDB9LAorICB7TlZSQU1fRklFTERfMk5EX1NFUklBTF9OVU1CRVIsICIyTkRfU0VSSUFMX05VTUJFUiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sCisgICAgMH0sCisgIHtOVlJBTV9GSUVMRF9HUE4sICJHUE4iLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX01BQ19BRERSX01PQ0EsICJNQUNfQUREUl9NT0NBIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCisgIHtOVlJBTV9GSUVMRF9NQUNfQUREUl9CVCwgIk1BQ19BRERSX0JUIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCisgIHtOVlJBTV9GSUVMRF9HT09HTEVfU1NMX1BFTSwgIkdPT0dMRV9TU0xfUEVNIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCisgIHtOVlJBTV9GSUVMRF9HT09HTEVfU1NMX0NSVCwgIkdPT0dMRV9TU0xfQ1JUIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sCisgIHtOVlJBTV9GSUVMRF9MT0FERVJfVkVSU0lPTiwgIkxPQURFUl9WRVJTSU9OIiwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9BQ1RJVkFURURfS0VSTkVMX05VTSwgIkFDVElWQVRFRF9LRVJORUxfTlVNIiwKKyAgICBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKKyAge05WUkFNX0ZJRUxEX01URF9UWVBFX0ZPUl9LRVJORUwsICJNVERfVFlQRV9GT1JfS0VSTkVMIiwKKyAgICBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKKyAge05WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRSwgIkFDVElWQVRFRF9LRVJORUxfTkFNRSIsCisgICAgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9FWFRSQV9LRVJORUxfT1BULCAiRVhUUkFfS0VSTkVMX09QVCIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAorICB7TlZSQU1fRklFTERfUExBVEZPUk1fTkFNRSwgIlBMQVRGT1JNX05BTUUiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKKyAge05WUkFNX0ZJRUxEX1BBSVJFRF9ESVNLLCAiUEFJUkVEX0RJU0siLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKKyAge05WUkFNX0ZJRUxEX1BBUlRJVElPTl9WRVIsICJQQVJUSVRJT05fVkVSIiwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9EVU1NWSwgIkRVTU1ZIiwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0KIH07Ci0KIC8qIEVuZCB0eXBlZGVmICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLwotc3RhdGljIHF1ZXVlX3Qgc19udnJhbV9lbnZ2YXJzW0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsKLQkJCQkJCQl7JnNfbnZyYW1fZW52dmFyc1swXSwmc19udnJhbV9lbnZ2YXJzWzBdfSwKLQkJCQkJCQl7JnNfbnZyYW1fZW52dmFyc1sxXSwmc19udnJhbV9lbnZ2YXJzWzFdfSwKLQkJCQkJCQl7JnNfbnZyYW1fZW52dmFyc1syXSwmc19udnJhbV9lbnZ2YXJzWzJdfSwKLQkJCQkJCQl9Oworc3RhdGljIGRsaXN0X2hkcl90IHNfbnZyYW1fZW52dmFyc1tITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7CisgIERMSVNUX0lOSVQoc19udnJhbV9lbnZ2YXJzWzBdKSwKKyAgRExJU1RfSU5JVChzX252cmFtX2VudnZhcnNbMV0pLAorICBETElTVF9JTklUKHNfbnZyYW1fZW52dmFyc1syXSksCit9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fb2Zmc2V0W0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsKLQkJCQkJCQlOVlJBTV9ST19PRkZTRVQsCi0JCQkJCQkJTlZSQU1fUldfT0ZGU0VULAotCQkJCQkJCVJBV19GU19PRkZTRVQKLQkJCQkJCQl9OworICBOVlJBTV9ST19PRkZTRVQsCisgIE5WUkFNX1JXX09GRlNFVCwKKyAgUkFXX0ZTX09GRlNFVAorfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzX252cmFtX2JhY2t1cF9vZmZzZXRbSE1YX05WUkFNX1BBUlRJVElPTl9NQVhdID0gewotCQkJCQkJCTAsCi0JCQkJCQkJTlZSQU1fUldCX09GRlNFVCwKLQkJCQkJCQkwCi0JCQkJCQkJfTsKKyAgMCwKKyAgTlZSQU1fUldCX09GRlNFVCwKKyAgMAorfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzX252cmFtX3NpemVbSE1YX05WUkFNX1BBUlRJVElPTl9NQVhdID0gewotCQkJCQkJCU5WUkFNX1JPX1NJWkUsCi0JCQkJCQkJTlZSQU1fUldfU0laRSwKLQkJCQkJCQlSQVdfRlNfU0laRQotCQkJCQkJCX07Ci0KKyAgTlZSQU1fUk9fU0laRSwKKyAgTlZSQU1fUldfU0laRSwKKyAgUkFXX0ZTX1NJWkUKK307CiAvKiBFbmQgZ2xvYmFsIHZhcmlhYmxlICovCiAKIApAQCAtMjM3LDggKzE3NSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc19udnJhbVNlbWE7Ci0KLQogLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLwogCiAKQEAgLTI1MSwyNCArMTg3LDI0IEBACiAgICAgKiAgUmVhZCBkYXRhIGZyb20gdGhlIE5WUkFNIGRldmljZTAKICAgICAqCiAgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoKLSAgICAqICAJICAgYnVmZmVyIC0gZGVzdGluYXRpb24gYnVmZmVyCi0gICAgKiAgCSAgIG9mZnNldCAtIG9mZnNldCBvZiBkYXRhIHRvIHJlYWQKLSAgICAqICAJICAgbGVuZ3RoIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICAqICAgICAgYnVmZmVyIC0gZGVzdGluYXRpb24gYnVmZmVyCisgICAgKiAgICAgIG9mZnNldCAtIG9mZnNldCBvZiBkYXRhIHRvIHJlYWQKKyAgICAqICAgICAgbGVuZ3RoIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPDAgaWYgZXJyb3Igb2NjdXJlZAorICAgICogICAgICBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPDAgaWYgZXJyb3Igb2NjdXJlZAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludCBkcnZfTlZSQU1fUmVhZCh1bnNpZ25lZCBjaGFyICpidWZmZXIsdW5zaWduZWQgaW50IG9mZnNldCx1bnNpZ25lZCBpbnQgbGVuZ3RoKQorc3RhdGljIGludCBkcnZfTlZSQU1fUmVhZCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7Ci0JRFJWX0Vycm9yCWRydl9lcnJvcjsKKyAgRFJWX0Vycm9yICAgICBkcnZfZXJyb3I7CiAKLQlkcnZfZXJyb3IgPSBITVhfVVBHUkFERV9OVlJBTV9SZWFkKG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpOwotCWlmIChkcnZfZXJyb3IgIT0gMCkKLQl7Ci0JCXJldHVybiAtMTsKLQl9CisgIGRydl9lcnJvciA9IEhNWF9VUEdSQURFX05WUkFNX1JlYWQob2Zmc2V0LCBidWZmZXIsIGxlbmd0aCk7CisgIGlmIChkcnZfZXJyb3IgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQogCi0JcmV0dXJuIGxlbmd0aDsKKyAgcmV0dXJuIGxlbmd0aDsKIH0KIAogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc3LDI0ICsyMTMsMjQgQEAKICAgICAqICBXcml0ZSBkYXRhIHRvIHRoZSBOVlJBTSBkZXZpY2UKICAgICAqCiAgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoKLSAgICAqICAJICAgYnVmZmVyIC0gc291cmNlIGJ1ZmZlcgotICAgICogIAkgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byB3cml0ZQotICAgICogIAkgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAqICAgICAgYnVmZmVyIC0gc291cmNlIGJ1ZmZlcgorICAgICogICAgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byB3cml0ZQorICAgICogICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgaWYgZXJyb3Igb2NjdXJlZAorICAgICogICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgaWYgZXJyb3Igb2NjdXJlZAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludCBkcnZfTlZSQU1fV3JpdGUodW5zaWduZWQgY2hhciAqYnVmZmVyLHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IGxlbmd0aCkKK3N0YXRpYyBpbnQgZHJ2X05WUkFNX1dyaXRlKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7Ci0JRFJWX0Vycm9yCWRydl9lcnJvcjsKKyAgRFJWX0Vycm9yICAgICBkcnZfZXJyb3I7CiAKLQlkcnZfZXJyb3IgPSBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZShvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoKTsKLQlpZiAoZHJ2X2Vycm9yICE9IDApCi0JewotCQlyZXR1cm4gLTE7Ci0JfQorICBkcnZfZXJyb3IgPSBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZShvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgaWYgKGRydl9lcnJvciAhPSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CiAKLQlyZXR1cm4gbGVuZ3RoOworICByZXR1cm4gbGVuZ3RoOwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMDMsMjkgKzIzOSwyNyBAQAogICAgICogIExvY2F0ZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgaW4tbWVtb3J5IGxpc3QKICAgICAqCiAgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoKLSAgICAqICAJICAgbmFtZSAtIG5hbWUgb2YgZW52IHZhciB0byBmaW5kCisgICAgKiAgICAgIG5hbWUgLSBuYW1lIG9mIGVudiB2YXIgdG8gZmluZAogICAgICoKICAgICAqICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgCSAgIE5WUkFNX0VWTlZBUl9UIHBvaW50ZXIsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgICAgKiAgICAgIE5WUkFNX0VWTlZBUl9UIHBvaW50ZXIsIG9yIE5VTEwgaWYgbm90IGZvdW5kCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBOVlJBTV9FVk5WQVJfVCAqZHJ2X05WUkFNX0ZpbmRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkKK3N0YXRpYyBOVlJBTV9FVk5WQVJfVCAqZHJ2X05WUkFNX0ZpbmRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkKIHsKLSAgICBxdWV1ZV90ICpxYjsKLSAgICBOVlJBTV9FVk5WQVJfVCAqZW52OworICBkbGlzdF9oZHJfdCAqZW50cnk7CisgIE5WUkFNX0VWTlZBUl9UICplbnY7CiAKLSAgICBmb3IgKHFiID0gc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0ucV9uZXh0OyBxYiAhPSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl07IHFiID0gcWItPnFfbmV4dCkKLSAgICB7Ci0JCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsKLQkJaWYgKHN0cmNtcCgoY2hhciopZW52LT5uYW1lLCAoY2hhciopbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KKyAgRExJU1RfRk9SX0VBQ0goJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLCBlbnRyeSkgeworICAgIGVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBlbnRyeTsKKyAgICBpZiAoc3RyY21wKChjaGFyKillbnYtPm5hbWUsIChjaGFyKiluYW1lKSA9PSAwKQorICAgICAgYnJlYWs7CisgIH0KIAotICAgIGlmIChxYiA9PSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0pCi0gICAgCXJldHVybiBOVUxMOworICBpZiAoZW50cnkgPT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dKQorICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIChOVlJBTV9FVk5WQVJfVCAqKSBxYjsKLQorICByZXR1cm4gKE5WUkFNX0VWTlZBUl9UICopIGVudHJ5OwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzksNDUgKzI3Myw0NCBAQAogICAgICogIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCiAgICAgKgogICAgICogIElucHV0IHBhcmFtZXRlcnM6Ci0gICAgKiAgCSAgIGlkeCAtIHZhcmlhYmxlIGluZGV4IHRvIGZpbmQgKHN0YXJ0aW5nIHdpdGggemVybykKLSAgICAqICAJICAgbmFtZSxuYW1lbGVuIC0gbmFtZSBidWZmZXIgYW5kIGxlbmd0aAotICAgICogIAkgICB2YWwsdmFsbGVuIC0gdmFsdWUgYnVmZmVyIGFuZCBsZW5ndGgKKyAgICAqICAgICAgaWR4IC0gdmFyaWFibGUgaW5kZXggdG8gZmluZCAoc3RhcnRpbmcgd2l0aCB6ZXJvKQorICAgICogICAgICBuYW1lLG5hbWVsZW4gLSBuYW1lIGJ1ZmZlciBhbmQgbGVuZ3RoCisgICAgKiAgICAgIHZhbCx2YWxsZW4gLSB2YWx1ZSBidWZmZXIgYW5kIGxlbmd0aAogICAgICoKICAgICAqICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgCSAgIDAgaWYgb2sKLSAgICAqICAJICAgZWxzZSBlcnJvciBjb2RlCisgICAgKiAgICAgIDAgaWYgb2sKKyAgICAqICAgICAgZWxzZSBlcnJvciBjb2RlCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50ICpuYW1lbGVuLCB1bnNpZ25lZCBjaGFyICp2YWwsIHVuc2lnbmVkIGludCAqdmFsbGVuKQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm5hbWVsZW4sIHVuc2lnbmVkIGNoYXIgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp2YWxsZW4pCiB7Ci0JcXVldWVfdCAqcWI7Ci0JTlZSQU1fRVZOVkFSX1QgKmVudjsKKyAgZGxpc3RfaGRyX3QgKmVudHJ5OworICBOVlJBTV9FVk5WQVJfVCAqZW52OwogCi0JZm9yIChxYiA9IHNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLnFfbmV4dDsgcWIgIT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dOyBxYiA9IHFiLT5xX25leHQpIHsKLQkJaWYgKGlkeCA9PSAwKQotCQkJYnJlYWs7Ci0JCWlkeC0tOwotCX0KKyAgRExJU1RfRk9SX0VBQ0goJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLCBlbnRyeSkgeworICAgIGlmIChpZHggPT0gMCkKKyAgICAgIGJyZWFrOworICAgIGlkeC0tOworICB9CiAKLQlpZiAocWIgPT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dKQotCXsKLQkJcmV0dXJuIERSVl9FUlI7Ci0JfQotCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsKKyAgaWYgKGVudHJ5ID09ICZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSkgeworICAgIHJldHVybiBEUlZfRVJSOworICB9CisgIGVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBlbnRyeTsKIAotCWlmIChuYW1lICE9IE5VTEwpCi0JewotCQlzdHJuY3B5KChjaGFyKiluYW1lLCAoY2hhciopZW52LT5uYW1lLCBlbnYtPm5hbWVMZW4pOwotCQluYW1lW2Vudi0+bmFtZUxlbl0gPSAwOwotCX0KLQkqbmFtZWxlbiA9IGVudi0+bmFtZUxlbjsKLQlpZiAodmFsICE9IE5VTEwpCi0JewotCQltZW1jcHkodmFsLCBlbnYtPnZhbHVlLCBlbnYtPnZhbHVlTGVuKTsKLQl9Ci0JKnZhbGxlbiAgPSBlbnYtPnZhbHVlTGVuOworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc3RybmNweSgoY2hhciopbmFtZSwgKGNoYXIqKWVudi0+bmFtZSwgZW52LT5uYW1lTGVuKTsKKyAgICBuYW1lW2Vudi0+bmFtZUxlbl0gPSAwOworICB9CisgICpuYW1lbGVuID0gZW52LT5uYW1lTGVuOworICBpZiAodmFsICE9IE5VTEwpIHsKKyAgICBtZW1jcHkodmFsLCBlbnYtPnZhbHVlLCBlbnYtPnZhbHVlTGVuKTsKKyAgfQorICAqdmFsbGVuICA9IGVudi0+dmFsdWVMZW47CiAKLQlyZXR1cm4gRFJWX09LOworICByZXR1cm4gRFJWX09LOwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODYsMjYgKzMxOSwyNSBAQAogICAgICogIERlbGV0ZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgICoKICAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgotICAgICogIAkgICBuYW1lIC0gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZGVsZXRlCisgICAgKiAgICAgIG5hbWUgLSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZWxldGUKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICAwIGlmIG9rCi0gICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQorICAgICogICAgICAwIGlmIG9rCisgICAgKiAgICAgIGVsc2UgZXJyb3IgY29kZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1zdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9EZWxldGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkKK3N0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0RlbGV0ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCiB7Ci0gICAgTlZSQU1fRVZOVkFSX1QgKmVudjsKKyAgTlZSQU1fRVZOVkFSX1QgKmVudjsKIAotICAgIGVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7Ci0gICAgaWYgKGVudiA9PSBOVUxMKQotICAgIHsKLSAgICAJcmV0dXJuIERSVl9FUlI7Ci0gICAgfQorICBlbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOworICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRFJWX0VSUjsKKyAgfQogCi0JcV9kZXF1ZXVlKChxdWV1ZV90ICopIGVudik7Ci0JZnJlZShlbnYpOwotCXJldHVybiBEUlZfT0s7CisgIGRsaXN0X2RlbCgoZGxpc3RfaGRyX3QgKikgZW52KTsKKyAgZnJlZShlbnYpOworICByZXR1cm4gRFJWX09LOwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MTQsMzAgKzM0NiwzMSBAQAogICAgICogIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgICoKICAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgotICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBmaW5kCisgICAgKiAgICAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQKKyAgICAqICAgICAgdmFsdWUsIG9yIE5VTEwgaWYgdmFyaWFibGUgaXMgbm90IGZvdW5kCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0dldEVudihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgaW50IHJlYWRMZW4pCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9HZXRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCByZWFkTGVuKQogewotCU5WUkFNX0VWTlZBUl9UCSplbnY7Ci0JdW5zaWduZWQgaW50CWxlbjsKKyAgTlZSQU1fRVZOVkFSX1QgICAgICAgICplbnY7CisgIHVuc2lnbmVkIGludCAgbGVuOwogCi0JbWVtc2V0KHZhbHVlLCAwLCByZWFkTGVuKTsKLQllbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOwotCWlmIChlbnYgIT0gTlVMTCkKLQl7Ci0JCWlmIChyZWFkTGVuID4gZW52LT52YWx1ZUxlbiAtIG9mZnNldCkKLQkJCWxlbiA9IGVudi0+dmFsdWVMZW4gLSBvZmZzZXQ7Ci0JCWVsc2UKLQkJCWxlbiA9IHJlYWRMZW47CisgIG1lbXNldCh2YWx1ZSwgMCwgcmVhZExlbik7CisgIGVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7CisgIGlmIChlbnYgIT0gTlVMTCkgeworICAgIGlmIChyZWFkTGVuID4gZW52LT52YWx1ZUxlbiAtIG9mZnNldCkKKyAgICAgIGxlbiA9IGVudi0+dmFsdWVMZW4gLSBvZmZzZXQ7CisgICAgZWxzZQorICAgICAgbGVuID0gcmVhZExlbjsKIAotCQltZW1jcHkodmFsdWUsIGVudi0+dmFsdWUrb2Zmc2V0LCBsZW4pOwotCX0KKyAgICBtZW1jcHkodmFsdWUsIGVudi0+dmFsdWUrb2Zmc2V0LCBsZW4pOworICB9CiAKLQlyZXR1cm4gRFJWX09LOworICByZXR1cm4gRFJWX09LOwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NDYsMjQgKzM3OSwyNCBAQAogICAgICogIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgICoKICAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgotICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBmaW5kCisgICAgKiAgICAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQKKyAgICAqICAgICAgdmFsdWUsIG9yIE5VTEwgaWYgdmFyaWFibGUgaXMgbm90IGZvdW5kCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0dldExlbmd0aChITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKnBMZW4pCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9HZXRMZW5ndGgoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcExlbikKIHsKLQlOVlJBTV9FVk5WQVJfVAkqZW52OworICBOVlJBTV9FVk5WQVJfVCAgICAgICAgKmVudjsKIAotCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7Ci0JaWYgKGVudiAhPSBOVUxMKQotCXsKLQkJKnBMZW4gPSBlbnYtPnZhbHVlTGVuOwotCQlyZXR1cm4gRFJWX09LOwotCX0KKyAgZW52ID0gZHJ2X05WUkFNX0ZpbmRFbnYocGFydGl0aW9uLCBuYW1lKTsKKyAgaWYgKGVudiAhPSBOVUxMKSB7CisgICAgKnBMZW4gPSBlbnYtPnZhbHVlTGVuOworICAgIHJldHVybiBEUlZfT0s7CisgIH0KIAotCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU1FVEVSOworICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKIH0KIAogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDcyLDQ2ICs0MDUsNDYgQEAKICAgICAqICBTZXQgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgKgogICAgICogIElucHV0IHBhcmFtZXRlcnM6Ci0gICAgKiAgCSAgIG5hbWUgLSBuYW1lIG9mIHZhcmlhYmxlCi0gICAgKiAgCSAgIHZhbHVlIC0gdmFsdWUgb2YgdmFyaWFibGUKLSAgICAqICAJICAgZmxhZ3MgLSBmbGFncyBmb3IgdmFyaWFibGUgKEVOVl9GTEdfeHh4KQorICAgICogICAgICBuYW1lIC0gbmFtZSBvZiB2YXJpYWJsZQorICAgICogICAgICB2YWx1ZSAtIHZhbHVlIG9mIHZhcmlhYmxlCisgICAgKiAgICAgIGZsYWdzIC0gZmxhZ3MgZm9yIHZhcmlhYmxlIChFTlZfRkxHX3h4eCkKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICAwIGlmIG9rCi0gICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQorICAgICogICAgICAwIGlmIG9rCisgICAgKiAgICAgIGVsc2UgZXJyb3IgY29kZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1zdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9TZXRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCB2YWx1ZUxlbikKK3N0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX1NldEVudihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCB2YWx1ZUxlbikKIHsKLQlOVlJBTV9FVk5WQVJfVCAqZW52OwotCXVuc2lnbmVkIGludCBuYW1lbGVuOworICBOVlJBTV9FVk5WQVJfVCAqZW52OworICB1bnNpZ25lZCBpbnQgbmFtZWxlbjsKIAotCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7Ci0JaWYgKGVudikKLQl7Ci0JCXFfZGVxdWV1ZSgocXVldWVfdCAqKSBlbnYpOwotCQlmcmVlKGVudik7Ci0JfQorICBlbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOworICBpZiAoZW52KSB7CisgICAgZGxpc3RfZGVsKChkbGlzdF9oZHJfdCAqKSBlbnYpOworICAgIGZyZWUoZW52KTsKKyAgfQogCi0JbmFtZWxlbiA9IHN0cmxlbigoY2hhciopbmFtZSk7Ci0JZW52ID0gbWFsbG9jKHNpemVvZihOVlJBTV9FVk5WQVJfVCkgKyBuYW1lbGVuICsgMSArIHZhbHVlTGVuKTsKLQlpZiAoIWVudikKLQl7Ci0JCXJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOwotCX0KLQllbnYtPm5hbWUgPSAodW5zaWduZWQgY2hhciAqKSAoZW52KzEpOwotCWVudi0+dmFsdWUgPSBlbnYtPm5hbWUgKyBuYW1lbGVuICsgMTsKLQllbnYtPm5hbWVMZW4gPSBuYW1lbGVuOwotCWVudi0+dmFsdWVMZW4gPSB2YWx1ZUxlbjsKLQllbnYtPnJlY0xlbiA9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZWxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKyB2YWx1ZUxlbik7CisgIG5hbWVsZW4gPSBzdHJsZW4oKGNoYXIqKW5hbWUpOworICBlbnYgPSBtYWxsb2Moc2l6ZW9mKE5WUkFNX0VWTlZBUl9UKSArIG5hbWVsZW4gKyAxICsgdmFsdWVMZW4pOworICBpZiAoIWVudikgeworICAgIHJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOworICB9CisgIGVudi0+bmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIChlbnYrMSk7CisgIGVudi0+dmFsdWUgPSBlbnYtPm5hbWUgKyBuYW1lbGVuICsgMTsKKyAgZW52LT5uYW1lTGVuID0gbmFtZWxlbjsKKyAgZW52LT52YWx1ZUxlbiA9IHZhbHVlTGVuOworICBlbnYtPnJlY0xlbiA9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZWxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKworICAgICAgICAgICAgICAgICB2YWx1ZUxlbik7CiAKLQlzdHJuY3B5KChjaGFyKillbnYtPm5hbWUsIChjaGFyKiluYW1lLCBuYW1lbGVuKTsKLQllbnYtPm5hbWVbbmFtZWxlbl0gPSAwOwotCW1lbWNweShlbnYtPnZhbHVlLCB2YWx1ZSwgdmFsdWVMZW4pOworICBzdHJuY3B5KChjaGFyKillbnYtPm5hbWUsIChjaGFyKiluYW1lLCBuYW1lbGVuKTsKKyAgZW52LT5uYW1lW25hbWVsZW5dID0gMDsKKyAgbWVtY3B5KGVudi0+dmFsdWUsIHZhbHVlLCB2YWx1ZUxlbik7CiAKLQlxX2VucXVldWUoJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLChxdWV1ZV90ICopIGVudik7CisgIGRsaXN0X2FkZCgmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0sIChkbGlzdF9oZHJfdCAqKSBlbnYpOwogCi0JcmV0dXJuIERSVl9PSzsKKyAgcmV0dXJuIERSVl9PSzsKIH0KIAogCkBAIC01MjEsMTUyICs0NTQsMTQzIEBACiAgICAgKiAgTG9hZCB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgTlZSQU0gZGV2aWNlLgogICAgICoKICAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgotICAgICogIAkgICBub3RoaW5nCisgICAgKiAgICAgIG5vdGhpbmcKICAgICAqCiAgICAgKiAgUmV0dXJuIHZhbHVlOgotICAgICogIAkgICAwIGlmIG9rCi0gICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQorICAgICogICAgICAwIGlmIG9rCisgICAgKiAgICAgIGVsc2UgZXJyb3IgY29kZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLXN0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKQorc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IG52cmFtX3NpemU7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyOwotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQl1bnNpZ25lZCBpbnQgcmVjTGVuOwotCXVuc2lnbmVkIGludCByZWNUeXBlOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0JdW5zaWduZWQgaW50IHJldHZhbDsKLQl1bnNpZ25lZCBjaGFyIGZpbGVOYW1lW01BWF9OQU1FX0xFTl07Ci0JdW5zaWduZWQgY2hhciBuYW1lTGVuOwotCXVuc2lnbmVkIGludCBkYXRhTGVuOworICB1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICB1bnNpZ25lZCBjaGFyICpwdHI7CisgIHVuc2lnbmVkIGludCByZWNMZW47CisgIHVuc2lnbmVkIGludCByZWNUeXBlOworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgcmV0dmFsOworICB1bnNpZ25lZCBjaGFyIGZpbGVOYW1lW01BWF9OQU1FX0xFTl07CisgIHVuc2lnbmVkIGNoYXIgbmFtZUxlbjsKKyAgdW5zaWduZWQgaW50IGRhdGFMZW47CiAKLSAgICBudnJhbV9zaXplID0gc2l6ZTsKLSAgICBidWZmZXIgPSBtYWxsb2MoTUFYX0ZJRUxEX0xFTik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgIHsKLSAgICAJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7CisgIG52cmFtX3NpemUgPSBzaXplOworICBidWZmZXIgPSBtYWxsb2MoTUFYX0ZJRUxEX0xFTik7CisgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOworICB9CisKKyAgcHRyID0gYnVmZmVyOworICBvZmZzZXQgPSAwOworCisgIHJldHZhbCA9IERSVl9PSzsKKyAgLyogUmVhZCB0aGUgcmVjb3JkIHR5cGUgYW5kIGxlbmd0aCAqLworICBpZiAoZHJ2X05WUkFNX1JlYWQocHRyLCBvZmZzZXQrYWRkcmVzcywgTlZSQU1fVFlQRV9MRU4pICE9IE5WUkFNX1RZUEVfTEVOKSB7CisgICAgcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgd2hpbGUgKCgqcHRyICE9IE5WUkFNX1RMVl9UWVBFX0VORCkgICYmIChudnJhbV9zaXplID4gTlZSQU1fVFlQRV9MRU4pKSB7CisgICAgLyogQWRqdXN0IHBvaW50ZXIgZm9yIFRMViB0eXBlICovCisgICAgcmVjVHlwZSA9IGdldDhiaXQocHRyKTsKKyAgICBudnJhbV9zaXplIC09IE5WUkFNX1RZUEVfTEVOOworICAgIG9mZnNldCArPSBOVlJBTV9UWVBFX0xFTjsKKworICAgIGlmIChyZWNUeXBlICE9IE5WUkFNX1RMVl9UWVBFX0VOVikgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTjsKKyAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCisgICAgLyogUmVhZCB0aGUgcmVjb3JkIHR5cGUgYW5kIGxlbmd0aCAtIDE2IGJpdHMsIE1TQiBmaXJzdCAqLworICAgIGlmIChkcnZfTlZSQU1fUmVhZChwdHIsIG9mZnNldCthZGRyZXNzLCBOVlJBTV9SRUNPUkRfTEVOR19MRU4pICE9CisgICAgICAgIE5WUkFNX1JFQ09SRF9MRU5HX0xFTikgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHJlY0xlbiA9IGdldDMyYml0KHB0cik7CisgICAgbnZyYW1fc2l6ZSAtPSBOVlJBTV9SRUNPUkRfTEVOR19MRU47CisgICAgb2Zmc2V0ICs9IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsKKworICAgIGlmIChyZWNMZW4gPiBNQVhfRklFTERfTEVOKSB7CisgICAgICByZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHJlY0xlbiA+IG52cmFtX3NpemUpIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047CisgICAgICBnb3RvIGVycm9yOyAvKiBzaG91bGQgbm90IGhhcHBlbiwgYmFkIE5WUkFNICovCisgICAgfQorCisgICAgLyogUmVhZCB0aGUgVExWIGRhdGEgKi8KKyAgICBpZiAoZHJ2X05WUkFNX1JlYWQocHRyLG9mZnNldCthZGRyZXNzLHJlY0xlbikgIT0gKGludClyZWNMZW4pIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG5hbWVMZW4gPSBnZXQ4Yml0KHB0cik7CisgICAgcHRyICs9IE5WUkFNX05BTUVfTEVOR19MRU47CisgICAgaWYgKG5hbWVMZW4pIHsKKyAgICAgIG1lbWNweShmaWxlTmFtZSwgcHRyLCBuYW1lTGVuKTsKKyAgICB9CisgICAgZmlsZU5hbWVbbmFtZUxlbl0gPSAwOworICAgIHB0ciArPSBuYW1lTGVuOworCisgICAgZGF0YUxlbiA9IGdldDMyYml0KHB0cik7CisgICAgcHRyICs9IE5WUkFNX0RBVEFfTEVOR19MRU47CisgICAgaWYgKGRhdGFMZW4gPiBNQVhfREFUQV9MRU4pIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChyZWNMZW4gIT0gKE5WUkFNX05BTUVfTEVOR19MRU4gKyBuYW1lTGVuICsgTlZSQU1fREFUQV9MRU5HX0xFTiArCisgICAgICAgICAgICAgICAgICAgZGF0YUxlbikpIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGRydl9OVlJBTV9TZXRFbnYocGFydGl0aW9uLCBmaWxlTmFtZSwgcHRyLCBkYXRhTGVuKTsKKworICAgIG52cmFtX3NpemUgLT0gKHVuc2lnbmVkIGludClyZWNMZW47CisgICAgb2Zmc2V0ICs9IHJlY0xlbjsKKworICAgIC8qIFJlYWQgdGhlIG5leHQgcmVjb3JkIHR5cGUgKi8KICAgICBwdHIgPSBidWZmZXI7Ci0gICAgb2Zmc2V0ID0gMDsKLQotICAgIHJldHZhbCA9IERSVl9PSzsKLSAgICAvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSBhbmQgbGVuZ3RoICovCi0gICAgaWYgKGRydl9OVlJBTV9SZWFkKHB0cixvZmZzZXQrYWRkcmVzcyxOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pCi0gICAgewotCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOwotCQlnb3RvIGVycm9yOwotCX0KLQotICAgIHdoaWxlICgoKnB0ciAhPSBOVlJBTV9UTFZfVFlQRV9FTkQpICAmJiAobnZyYW1fc2l6ZSA+IE5WUkFNX1RZUEVfTEVOKSkKLSAgICB7Ci0JCS8qIEFkanVzdCBwb2ludGVyIGZvciBUTFYgdHlwZSAqLwotCQlyZWNUeXBlID0gZ2V0OGJpdChwdHIpOwotCQludnJhbV9zaXplIC09IE5WUkFNX1RZUEVfTEVOOwotCQlvZmZzZXQgKz0gTlZSQU1fVFlQRV9MRU47Ci0KLQkJaWYgKHJlY1R5cGUgIT0gTlZSQU1fVExWX1RZUEVfRU5WKQotCQl7Ci0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCS8qIFJlYWQgdGhlIHJlY29yZCB0eXBlIGFuZCBsZW5ndGggLSAxNiBiaXRzLCBNU0IgZmlyc3QgKi8KLQkJaWYgKGRydl9OVlJBTV9SZWFkKHB0ciwgb2Zmc2V0K2FkZHJlc3MsIE5WUkFNX1JFQ09SRF9MRU5HX0xFTikgIT0gTlZSQU1fUkVDT1JEX0xFTkdfTEVOKQotCQl7Ci0JCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlyZWNMZW4gPSBnZXQzMmJpdChwdHIpOwotCQludnJhbV9zaXplIC09IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsKLQkJb2Zmc2V0ICs9IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsKLQotCQlpZiAocmVjTGVuID4gTUFYX0ZJRUxEX0xFTikKLQkJewotCQkJcmV0dmFsID0gRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTjsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaWYgKHJlY0xlbiA+IG52cmFtX3NpemUpCi0JCXsKLQkJCXJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047Ci0JCQlnb3RvIGVycm9yOyAvKiBzaG91bGQgbm90IGhhcHBlbiwgYmFkIE5WUkFNICovCi0JCX0KLQotCQkvKiBSZWFkIHRoZSBUTFYgZGF0YSAqLwotCQlpZiAoZHJ2X05WUkFNX1JlYWQocHRyLG9mZnNldCthZGRyZXNzLHJlY0xlbikgIT0gKGludClyZWNMZW4pCi0JCXsKLQkJCXJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJbmFtZUxlbiA9IGdldDhiaXQocHRyKTsKLQkJcHRyICs9IE5WUkFNX05BTUVfTEVOR19MRU47Ci0JCWlmIChuYW1lTGVuKQotCQl7Ci0JCSAgICBtZW1jcHkoZmlsZU5hbWUsIHB0ciwgbmFtZUxlbik7Ci0JCX0KLQkJZmlsZU5hbWVbbmFtZUxlbl0gPSAwOwotCQlwdHIgKz0gbmFtZUxlbjsKLQotCQlkYXRhTGVuID0gZ2V0MzJiaXQocHRyKTsKLQkJcHRyICs9IE5WUkFNX0RBVEFfTEVOR19MRU47Ci0JCWlmIChkYXRhTGVuID4gTUFYX0RBVEFfTEVOKQotCQl7Ci0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChyZWNMZW4gIT0gKE5WUkFNX05BTUVfTEVOR19MRU4gKyBuYW1lTGVuICsgTlZSQU1fREFUQV9MRU5HX0xFTiArIGRhdGFMZW4pKQotCQl7Ci0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWRydl9OVlJBTV9TZXRFbnYocGFydGl0aW9uLCBmaWxlTmFtZSwgcHRyLCBkYXRhTGVuKTsKLQotCQludnJhbV9zaXplIC09ICh1bnNpZ25lZCBpbnQpcmVjTGVuOwotCQlvZmZzZXQgKz0gcmVjTGVuOwotCi0JCS8qIFJlYWQgdGhlIG5leHQgcmVjb3JkIHR5cGUgKi8KLQkJcHRyID0gYnVmZmVyOwotCQlpZiAoZHJ2X05WUkFNX1JlYWQocHRyLG9mZnNldCthZGRyZXNzLCBOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pCi0JCXsKLQkJCXJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQorICAgIGlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MsIE5WUkFNX1RZUEVfTEVOKSAhPSBOVlJBTV9UWVBFX0xFTikgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9CiAKIGVycm9yOgotICAgIGZyZWUoYnVmZmVyKTsKKyAgZnJlZShidWZmZXIpOwogCi0gICAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dXJuIHJldHZhbDsKIAogfQogCiBzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9Mb2FkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24pCiB7Ci0JRFJWX0Vycm9yCWRydl9lcnJvcjsKKyAgRFJWX0Vycm9yICAgICBkcnZfZXJyb3I7CiAKLQlkcnZfZXJyb3IgID0gZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MocGFydGl0aW9uLCBzX252cmFtX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7Ci0JaWYgKGRydl9lcnJvciAhPSBEUlZfT0spCi0JewotCQlERUJVR19FUlIoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgcGFydGl0aW9uICglZClcbiIsIGRydl9lcnJvciwgcGFydGl0aW9uKTsKLQkJaWYgKHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dICE9IDApCi0JCXsKLQkJCWRydl9lcnJvciAgPSBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhwYXJ0aXRpb24sIHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7Ci0JCQlpZiAoZHJ2X2Vycm9yICE9IERSVl9PSykKLQkJCXsKLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgYmFja3VwIHBhcnRpdGlvbiAoJWQpXG4iLCBkcnZfZXJyb3IsIHBhcnRpdGlvbik7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREVCVUdfSU5GTygiW0hNWF9OVlJBTV9Mb2FkXSBsb2FkIE9LIGxvYWRpbmcgYmFja3VwIHBhcnRpdGlvbiAoJWQpXG4iLCBwYXJ0aXRpb24pOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBkcnZfZXJyb3I7CisgIGRydl9lcnJvciAgPSBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhwYXJ0aXRpb24sIHNfbnZyYW1fb2Zmc2V0W3BhcnRpdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7CisgIGlmIChkcnZfZXJyb3IgIT0gRFJWX09LKSB7CisgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0xvYWRdIGVycm9yKCVkKSBsb2FkaW5nIHBhcnRpdGlvbiAoJWQpXG4iLCBkcnZfZXJyb3IsIHBhcnRpdGlvbik7CisgICAgaWYgKHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dICE9IDApIHsKKyAgICAgIGRydl9lcnJvciAgPSBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19udnJhbV9iYWNrdXBfb2Zmc2V0W3BhcnRpdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19udnJhbV9zaXplW3BhcnRpdGlvbl0pOworICAgICAgaWYgKGRydl9lcnJvciAhPSBEUlZfT0spIHsKKyAgICAgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0xvYWRdIGVycm9yKCVkKSBsb2FkaW5nIGJhY2t1cCBwYXJ0aXRpb24gKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIGRydl9lcnJvciwgcGFydGl0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHX0lORk8oIltITVhfTlZSQU1fTG9hZF0gbG9hZCBPSyBsb2FkaW5nIGJhY2t1cCBwYXJ0aXRpb24gKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZHJ2X2Vycm9yOwogfQogCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NzUsNDIzICs1OTksNDA4IEBACiAgICAgKiAgV3JpdGUgdGhlIGVudmlyb25tZW50IHRvIHRoZSBOVlJBTSBkZXZpY2UuCiAgICAgKgogICAgICogIElucHV0IHBhcmFtZXRlcnM6Ci0gICAgKiAgCSAgIG5vdGhpbmcKKyAgICAqICAgICAgbm90aGluZwogICAgICoKICAgICAqICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgCSAgIDAgaWYgb2ssIGVsc2UgZXJyb3IgY29kZQorICAgICogICAgICAwIGlmIG9rLCBlbHNlIGVycm9yIGNvZGUKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQogc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2F2ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uKQogewotICAgIHVuc2lnbmVkIGludCBudnJhbV9zaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfZW5kOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBxdWV1ZV90ICpxYjsKLSAgICBOVlJBTV9FVk5WQVJfVCAqZW52OwotICAgIHVuc2lnbmVkIGNoYXIgbmFtZWxlbjsKLSAgICB1bnNpZ25lZCBpbnQgdmFsdWVsZW47Ci0gICAgdW5zaWduZWQgaW50IHJlY0xlbjsKKyAgdW5zaWduZWQgaW50IG52cmFtX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyX2VuZDsKKyAgdW5zaWduZWQgY2hhciAqcHRyOworICBkbGlzdF9oZHJfdCAqZW50cnk7CisgIE5WUkFNX0VWTlZBUl9UICplbnY7CisgIHVuc2lnbmVkIGNoYXIgbmFtZWxlbjsKKyAgdW5zaWduZWQgaW50IHZhbHVlbGVuOworICB1bnNpZ25lZCBpbnQgcmVjTGVuOwogCi0gICAgbnZyYW1fc2l6ZSA9IHNfbnZyYW1fc2l6ZVtwYXJ0aXRpb25dOwotICAgIGJ1ZmZlciA9IG1hbGxvYyhudnJhbV9zaXplKTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgewotICAgIAlyZXR1cm4gRFJWX0VSUl9PVVRPRk1FTU9SWTsKLQl9Ci0gICAgYnVmZmVyX2VuZCA9IGJ1ZmZlciArIG52cmFtX3NpemUgLSAxOworICBudnJhbV9zaXplID0gc19udnJhbV9zaXplW3BhcnRpdGlvbl07CisgIGJ1ZmZlciA9IG1hbGxvYyhudnJhbV9zaXplKTsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7CisgIH0KKyAgYnVmZmVyX2VuZCA9IGJ1ZmZlciArIG52cmFtX3NpemUgLSAxOwogCi0gICAgcHRyID0gYnVmZmVyOworICBwdHIgPSBidWZmZXI7CiAKLSAgICBmb3IgKHFiID0gc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0ucV9uZXh0OyBxYiAhPSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl07IHFiID0gcWItPnFfbmV4dCkKLSAgICB7Ci0JCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsKKyAgRExJU1RfRk9SX0VBQ0goJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLCBlbnRyeSkgeworICAgIGVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBlbnRyeTsKIAotCQluYW1lbGVuID0gZW52LT5uYW1lTGVuOwotCQl2YWx1ZWxlbiA9IGVudi0+dmFsdWVMZW47Ci0JCXJlY0xlbiA9IGVudi0+cmVjTGVuOworICAgIG5hbWVsZW4gPSBlbnYtPm5hbWVMZW47CisgICAgdmFsdWVsZW4gPSBlbnYtPnZhbHVlTGVuOworICAgIHJlY0xlbiA9IGVudi0+cmVjTGVuOwogCi0JCWlmICgocHRyICsgTlZSQU1fVFlQRV9MRU4gKyBOVlJBTV9SRUNPUkRfTEVOR19MRU4gKyByZWNMZW4pID4gYnVmZmVyX2VuZCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KKyAgICBpZiAoKHB0ciArIE5WUkFNX1RZUEVfTEVOICsgTlZSQU1fUkVDT1JEX0xFTkdfTEVOICsgcmVjTGVuKSA+IGJ1ZmZlcl9lbmQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KIAotCQkqcHRyKysgPSBOVlJBTV9UTFZfVFlQRV9FTlY7CQkvKiBUTFYgcmVjb3JkIHR5cGUgKi8KKyAgICAqcHRyKysgPSBOVlJBTV9UTFZfVFlQRV9FTlY7ICAgICAgICAvKiBUTFYgcmVjb3JkIHR5cGUgKi8KIAotCQkqcHRyKysgPSAocmVjTGVuPj4yNCkgJiAweEZGOwkJCS8qIFRMViByZWNvcmQgbGVuZ3RoICovCi0JCSpwdHIrKyA9IChyZWNMZW4+PjE2KSAmIDB4RkY7CQkJLyogVExWIHJlY29yZCBsZW5ndGggKi8KLQkJKnB0cisrID0gKHJlY0xlbj4+OCkgJiAweEZGOwkJCS8qIFRMViByZWNvcmQgbGVuZ3RoICovCi0JCSpwdHIrKyA9IChyZWNMZW4+PjApICYgMHhGRjsJCQkvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLworICAgICpwdHIrKyA9IChyZWNMZW4+PjI0KSAmIDB4RkY7ICAgICAgIC8qIFRMViByZWNvcmQgbGVuZ3RoICovCisgICAgKnB0cisrID0gKHJlY0xlbj4+MTYpICYgMHhGRjsgICAgICAgLyogVExWIHJlY29yZCBsZW5ndGggKi8KKyAgICAqcHRyKysgPSAocmVjTGVuPj44KSAmIDB4RkY7ICAgICAgICAvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLworICAgICpwdHIrKyA9IChyZWNMZW4+PjApICYgMHhGRjsgICAgICAgIC8qIFRMViByZWNvcmQgbGVuZ3RoICovCiAKLQkJKnB0cisrID0gKG5hbWVsZW4+PjApICYgMHhGRjsJCQkvKiBOQU1FIHJlY29yZCBsZW5ndGggKi8KKyAgICAqcHRyKysgPSAobmFtZWxlbj4+MCkgJiAweEZGOyAgICAgICAvKiBOQU1FIHJlY29yZCBsZW5ndGggKi8KIAotCQltZW1jcHkocHRyLCBlbnYtPm5hbWUsIG5hbWVsZW4pOwkJLyogTkFNRSByZWNvcmQgZGF0YSAqLwotCQlwdHIgKz0gbmFtZWxlbjsKKyAgICBtZW1jcHkocHRyLCBlbnYtPm5hbWUsIG5hbWVsZW4pOyAgICAvKiBOQU1FIHJlY29yZCBkYXRhICovCisgICAgcHRyICs9IG5hbWVsZW47CiAKLQkJKnB0cisrID0gKHZhbHVlbGVuPj4yNCkgJiAweEZGOwkJCS8qIFZBTFVFIHJlY29yZCBsZW5ndGggKi8KLQkJKnB0cisrID0gKHZhbHVlbGVuPj4xNikgJiAweEZGOwkJCS8qIFZBTFVFIHJlY29yZCBsZW5ndGggKi8KLQkJKnB0cisrID0gKHZhbHVlbGVuPj44KSAmIDB4RkY7CQkJLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLwotCQkqcHRyKysgPSAodmFsdWVsZW4+PjApICYgMHhGRjsJCQkvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovCisgICAgKnB0cisrID0gKHZhbHVlbGVuPj4yNCkgJiAweEZGOyAgICAgLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLworICAgICpwdHIrKyA9ICh2YWx1ZWxlbj4+MTYpICYgMHhGRjsgICAgIC8qIFZBTFVFIHJlY29yZCBsZW5ndGggKi8KKyAgICAqcHRyKysgPSAodmFsdWVsZW4+PjgpICYgMHhGRjsgICAgICAvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovCisgICAgKnB0cisrID0gKHZhbHVlbGVuPj4wKSAmIDB4RkY7ICAgICAgLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLwogCi0JCW1lbWNweShwdHIsZW52LT52YWx1ZSwgdmFsdWVsZW4pOwotCQlwdHIgKz0gdmFsdWVsZW47CisgICAgbWVtY3B5KHB0cixlbnYtPnZhbHVlLCB2YWx1ZWxlbik7CisgICAgcHRyICs9IHZhbHVlbGVuOwogCi0JfQorICB9CiAKLSAgICAqcHRyKysgPSBOVlJBTV9UTFZfVFlQRV9FTkQ7CisgICpwdHIrKyA9IE5WUkFNX1RMVl9UWVBFX0VORDsKIAotICAgIG52cmFtX3NpemUgPSBkcnZfTlZSQU1fV3JpdGUoYnVmZmVyLDArc19udnJhbV9vZmZzZXRbcGFydGl0aW9uXSxwdHItYnVmZmVyKTsKLQlpZiAoc19udnJhbV9iYWNrdXBfb2Zmc2V0W3BhcnRpdGlvbl0gIT0gMCkKLQl7Ci0JCWRydl9OVlJBTV9Xcml0ZShidWZmZXIsMCtzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSxwdHItYnVmZmVyKTsKLQl9CisgIG52cmFtX3NpemUgPSBkcnZfTlZSQU1fV3JpdGUoYnVmZmVyLDArc19udnJhbV9vZmZzZXRbcGFydGl0aW9uXSxwdHItYnVmZmVyKTsKKyAgaWYgKHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dICE9IDApIHsKKyAgICBkcnZfTlZSQU1fV3JpdGUoYnVmZmVyLDArc19udnJhbV9iYWNrdXBfb2Zmc2V0W3BhcnRpdGlvbl0scHRyLWJ1ZmZlcik7CisgIH0KIAotICAgIGZyZWUoYnVmZmVyKTsKKyAgZnJlZShidWZmZXIpOwogCi0gICAgcmV0dXJuIChudnJhbV9zaXplID09ICh1bnNpZ25lZCBpbnQpKHB0ci1idWZmZXIpKSA/IERSVl9PSyA6IERSVl9FUlJfRVhURVJOQUxfRVJST1I7CisgIHJldHVybiAobnZyYW1fc2l6ZSA9PSAodW5zaWduZWQgaW50KShwdHItYnVmZmVyKSkgPyBEUlZfT0sgOgorICAgICAgRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBOVlJBTV9TV0FQMzIodW5zaWduZWQgaW50IEEpCiB7Ci0JcmV0dXJuICgoQSA8PCAyNCkgfCAoKEEgPDwgOCkgJiAgMHhGRjAwMDApIHwgKChBID4+IDgpICYgIDB4RkYwMCkgfChBID4+IDI0KSk7CisgIHJldHVybiAoKEEgPDwgMjQpIHwgKChBIDw8IDgpICYgIDB4RkYwMDAwKSB8ICgoQSA+PiA4KSAmICAweEZGMDApIHwoQSA+PiAyNCkpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzX252cmFtU2VtYTsKIAotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGNvbnN0IE5WUkFNX0ZJRUxEX1QgdHlwZSwgSE1YX05WUkFNX1BBUlRJVElPTl9FICpwUGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwc3pGaWxlTmFtZSwgdW5zaWduZWQgaW50ICpkZWZhdWx0U2l6ZSkKK3N0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhjb25zdCBOVlJBTV9GSUVMRF9UIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1YX05WUkFNX1BBUlRJVElPTl9FICpwUGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBzekZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGVmYXVsdFNpemUpCiB7Ci0JaW50CWk7CisgIGludCBpOwogCi0JU0VNX0dldChzX252cmFtU2VtYSk7Ci0JZm9yIChpPTA7O2krKykKLQl7Ci0JCWlmIChOVlJBTV9GSUVMRF9EVU1NWSA9PSBzX252cmFtRmllbGRJbmZvW2ldLnR5cGUpCi0JCQlicmVhazsKLQkJaWYgKHR5cGUgIT0gc19udnJhbUZpZWxkSW5mb1tpXS50eXBlKQotCQkJY29udGludWU7Ci0JCXN0cm5jcHkoKGNoYXIqKXBzekZpbGVOYW1lLCAoY2hhciopKHNfbnZyYW1GaWVsZEluZm9baV0uc3pGaWxlTmFtZSksIE1BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEgpOwotCQkqcFBhcnRpdGlvbiA9IHNfbnZyYW1GaWVsZEluZm9baV0uc3RvcmVQYXJ0aXRpb247Ci0JCSpkZWZhdWx0U2l6ZSA9IHNfbnZyYW1GaWVsZEluZm9baV0uZGVmYXVsdFNpemU7Ci0JCVNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKLQkJcmV0dXJuIERSVl9PSzsKLQl9Ci0JU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOwotCXJldHVybiAxOworICBTRU1fR2V0KHNfbnZyYW1TZW1hKTsKKyAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICBpZiAoTlZSQU1fRklFTERfRFVNTVkgPT0gc19udnJhbUZpZWxkSW5mb1tpXS50eXBlKQorICAgICAgYnJlYWs7CisgICAgaWYgKHR5cGUgIT0gc19udnJhbUZpZWxkSW5mb1tpXS50eXBlKQorICAgICAgY29udGludWU7CisgICAgc3RybmNweSgoY2hhciopcHN6RmlsZU5hbWUsIChjaGFyKikoc19udnJhbUZpZWxkSW5mb1tpXS5zekZpbGVOYW1lKSwKKyAgICAgICAgICAgIE1BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEgpOworICAgICpwUGFydGl0aW9uID0gc19udnJhbUZpZWxkSW5mb1tpXS5zdG9yZVBhcnRpdGlvbjsKKyAgICAqZGVmYXVsdFNpemUgPSBzX252cmFtRmllbGRJbmZvW2ldLmRlZmF1bHRTaXplOworICAgIFNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKKyAgICByZXR1cm4gRFJWX09LOworICB9CisgIFNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKKyAgcmV0dXJuIDE7CiB9CiAKIAotRFJWX0Vycm9yCUhNWF9OVlJBTV9Jbml0KHZvaWQpCitEUlZfRXJyb3IgSE1YX05WUkFNX0luaXQodm9pZCkKIHsKLQlkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JPKTsKLQlkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JXKTsKLQlyZXR1cm4gRFJWX09LOworICBkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JPKTsKKyAgZHJ2X05WUkFNX0xvYWQoSE1YX05WUkFNX1BBUlRJVElPTl9SVyk7CisgIHJldHVybiBEUlZfT0s7CiB9CiAKLURSVl9FcnJvcglITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSkKK0RSVl9FcnJvciBITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSkKIHsKLQlEUlZfRXJyb3IJZHJ2X2Vycm9yOworICBEUlZfRXJyb3IgZHJ2X2Vycm9yOwogCi0JVU5VU0VEKG9mZnNldCk7CisgIFVOVVNFRChvZmZzZXQpOwogCi0JU0VNX0dldChzX252cmFtU2VtYSk7Ci0JZHJ2X2Vycm9yID0gZHJ2X05WUkFNX1NldEVudihwYXJ0aXRpb24sIHBOYW1lLCBwVmFsdWUsIHVsU2l6ZSk7Ci0JZHJ2X2Vycm9yID0gZHJ2X05WUkFNX1NhdmUocGFydGl0aW9uKTsKLQlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7Ci0JcmV0dXJuIGRydl9lcnJvcjsKKyAgU0VNX0dldChzX252cmFtU2VtYSk7CisgIGRydl9lcnJvciA9IGRydl9OVlJBTV9TZXRFbnYocGFydGl0aW9uLCBwTmFtZSwgcFZhbHVlLCB1bFNpemUpOworICBkcnZfZXJyb3IgPSBkcnZfTlZSQU1fU2F2ZShwYXJ0aXRpb24pOworICBTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7CisgIHJldHVybiBkcnZfZXJyb3I7CiB9CiAKLURSVl9FcnJvcglITVhfTlZSQU1fUmVhZChITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwTmFtZSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqcFZhbHVlLCB1bnNpZ25lZCBpbnQgdWxTaXplKQorRFJWX0Vycm9yIEhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWxTaXplKQogewotCURSVl9FcnJvcglkcnZfZXJyb3I7CisgIERSVl9FcnJvciAgICAgZHJ2X2Vycm9yOwogCi0JU0VNX0dldChzX252cmFtU2VtYSk7Ci0JbWVtc2V0KHBWYWx1ZSwgMCwgdWxTaXplKTsKLQlkcnZfZXJyb3IgPSBkcnZfTlZSQU1fR2V0RW52KHBhcnRpdGlvbiwgcE5hbWUsIG9mZnNldCwgcFZhbHVlLCB1bFNpemUpOwotCVNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKLQlyZXR1cm4gZHJ2X2Vycm9yOworICBTRU1fR2V0KHNfbnZyYW1TZW1hKTsKKyAgbWVtc2V0KHBWYWx1ZSwgMCwgdWxTaXplKTsKKyAgZHJ2X2Vycm9yID0gZHJ2X05WUkFNX0dldEVudihwYXJ0aXRpb24sIHBOYW1lLCBvZmZzZXQsIHBWYWx1ZSwgdWxTaXplKTsKKyAgU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOworICByZXR1cm4gZHJ2X2Vycm9yOwogfQogCi1EUlZfRXJyb3IgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpCitEUlZfRXJyb3IgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpCiB7Ci0JRFJWX0Vycm9yIGVyckNvZGUgPSBEUlZfRVJSOwotCXVuc2lnbmVkIGNoYXIJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07Ci0JSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbjsKLQlpbnQJCQkJCW52cmFtSGFuZGxlOwotCXVuc2lnbmVkIGludAkJCQlkZWZhdWx0U2l6ZTsKKyAgRFJWX0Vycm9yIGVyckNvZGUgPSBEUlZfRVJSOworICB1bnNpZ25lZCBjaGFyICAgICAgICAgc3pGaWxlTmFtZVtNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIXTsKKyAgSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbjsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudnJhbUhhbmRsZTsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2l6ZTsKIAotCWlmKCBkYXRhID09IE5VTEwgfHwgZmllbGQgPT0gTlZSQU1fRklFTERfRFVNTVkgKQotCXsKLQkJcmV0dXJuIDI7Ci0JfQorICBpZiggZGF0YSA9PSBOVUxMIHx8IGZpZWxkID09IE5WUkFNX0ZJRUxEX0RVTU1ZICkgeworICAgIHJldHVybiAyOworICB9CiAKLQllcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsKLQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spCi0JewotCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIGZpZWxkKCVkKSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm9cbiIsIGZpZWxkLCBlcnJDb2RlKTsKLQkJcmV0dXJuIGVyckNvZGU7Ci0JfQorICBlcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsKKyAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBmaWVsZCglZCkgZXJyb3IoJTA4WCkgOiAiCisgICAgICAgICAgICAgICJITVhfTlZSQU1fR2V0RmllbGRJbmZvXG4iLCBmaWVsZCwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KIAotCXN3aXRjaCAocGFydGl0aW9uKQotCXsKLQljYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUyA6Ci0JCWJyZWFrOwotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9STyA6Ci0JY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JXIDoKLQkJaWYgKGRlZmF1bHRTaXplID09IDApCi0JCXsKLQkJCWVyckNvZGUgPSBITVhfTlZSQU1fUmVhZChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIG9mZnNldCwgZGF0YSwgbkRhdGFTaXplKTsKLQkJCWlmIChlcnJDb2RlICE9IERSVl9PSykKLQkJCXsKLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIGZpZWxkKCVkKS0lcyBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9SZWFkXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7Ci0JCQkJcmV0dXJuIGVyckNvZGU7Ci0JCQl9Ci0JCQlpZiAoZmllbGQgPT0gTlZSQU1fRklFTERfU1lTVEVNX0lEICYmIGVyckNvZGUgPT0gMCkKLQkJCXsKLQkJCQkqKCh1bnNpZ25lZCBpbnQqKWRhdGEpID0gTlZSQU1fU1dBUDMyKCh1bnNpZ25lZCBpbnQpKih1bnNpZ25lZCBpbnQqKWRhdGEpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdW5zaWduZWQgY2hhciAqcEJ1ZjsKKyAgc3dpdGNoIChwYXJ0aXRpb24pIHsKKyAgICBjYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUyA6CisgICAgICBicmVhazsKKyAgICBjYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8gOgorICAgIGNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9SVyA6CisgICAgICBpZiAoZGVmYXVsdFNpemUgPT0gMCkgeworICAgICAgICBlcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCBvZmZzZXQsIGRhdGEsIG5EYXRhU2l6ZSk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgICAiSE1YX05WUkFNX1JlYWRcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsKKyAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQgPT0gTlZSQU1fRklFTERfU1lTVEVNX0lEICYmIGVyckNvZGUgPT0gMCkgeworICAgICAgICAgICooKHVuc2lnbmVkIGludCopZGF0YSkgPSBOVlJBTV9TV0FQMzIoKHVuc2lnbmVkIGludCkqKHVuc2lnbmVkIGludCopZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CiAKLQkJCXBCdWYgPSBtYWxsb2MoZGVmYXVsdFNpemUpOwotCQkJaWYgKHBCdWYgPT0gTlVMTCkKLQkJCXsKLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIG1hbGxvY1xuIik7Ci0JCQkJcmV0dXJuIDM7Ci0JCQl9Ci0JCQllcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7Ci0JCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spCi0JCQl7Ci0JCQkJbWVtc2V0KHBCdWYsIDAsIGRlZmF1bHRTaXplKTsKLQkJCX0KLQkJCW1lbWNweShkYXRhLCBwQnVmICsgb2Zmc2V0LCBuRGF0YVNpemUpOwotCQkJZnJlZShwQnVmKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0IDoKLQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBESV9FUlJfSU5WQUxJRF9QQVJBTSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsKLQkJcmV0dXJuIDI7Ci0JfQorICAgICAgICBwQnVmID0gbWFsbG9jKGRlZmF1bHRTaXplKTsKKyAgICAgICAgaWYgKHBCdWYgPT0gTlVMTCkgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gbWFsbG9jXG4iKTsKKyAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBlcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIG1lbXNldChwQnVmLCAwLCBkZWZhdWx0U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRhdGEsIHBCdWYgKyBvZmZzZXQsIG5EYXRhU2l6ZSk7CisgICAgICAgIGZyZWUocEJ1Zik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gRElfRVJSX0lOVkFMSURfUEFSQU0gZmllbGQoJWQpLSVzICIKKyAgICAgICAgICAgICAgICAiZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsKKyAgICAgIHJldHVybiAyOworICB9CiAKLQlyZXR1cm4gZXJyQ29kZTsKKyAgcmV0dXJuIGVyckNvZGU7CiB9CiAKIERSVl9FcnJvciBITVhfTlZSQU1fU2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSkKIHsKLQlEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7Ci0JdW5zaWduZWQgY2hhcgkJc3pGaWxlTmFtZVtNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIXTsKLQlITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOwotCWludAkJCQkJbnZyYW1IYW5kbGU7Ci0JdW5zaWduZWQgaW50CQkJCWRlZmF1bHRTaXplOwotCXVuc2lnbmVkIGNoYXIJCQkJKnBCdWY7Ci0JdW5zaWduZWQgaW50CQkJCXN5c3RlbUlkOworICBEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOworICBITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52cmFtSGFuZGxlOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaXplOworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkOwogCi0JaWYoIGRhdGEgPT0gTlVMTCB8fCBmaWVsZCA9PSBOVlJBTV9GSUVMRF9EVU1NWSApCi0JewotCQlyZXR1cm4gMjsKLQl9CisgIGlmKCBkYXRhID09IE5VTEwgfHwgZmllbGQgPT0gTlZSQU1fRklFTERfRFVNTVkgKSB7CisgICAgcmV0dXJuIDI7CisgIH0KIAotCXBCdWYgPSBtYWxsb2MobkRhdGFTaXplKTsKLQlpZiAocEJ1ZiA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIDU7Ci0JfQorICBwQnVmID0gbWFsbG9jKG5EYXRhU2l6ZSk7CisgIGlmIChwQnVmID09IE5VTEwpIHsKKyAgICByZXR1cm4gNTsKKyAgfQogCi0JZXJyQ29kZSA9IEhNWF9OVlJBTV9HZXRGaWVsZChmaWVsZCwgb2Zmc2V0LCBwQnVmLCBuRGF0YVNpemUpOwotCWlmIChlcnJDb2RlID09IERSVl9PSykKLQl7Ci0JCWlmIChtZW1jbXAocEJ1ZiwgZGF0YSwgbkRhdGFTaXplKSA9PSAwKQotCQl7Ci0JCQlmcmVlKHBCdWYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZnJlZShwQnVmKTsKKyAgZXJyQ29kZSA9IEhNWF9OVlJBTV9HZXRGaWVsZChmaWVsZCwgb2Zmc2V0LCBwQnVmLCBuRGF0YVNpemUpOworICBpZiAoZXJyQ29kZSA9PSBEUlZfT0spIHsKKyAgICBpZiAobWVtY21wKHBCdWYsIGRhdGEsIG5EYXRhU2l6ZSkgPT0gMCkgeworICAgICAgZnJlZShwQnVmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBmcmVlKHBCdWYpOwogCi0JZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRGaWVsZEluZm8oZmllbGQsICZwYXJ0aXRpb24sIHN6RmlsZU5hbWUsICZkZWZhdWx0U2l6ZSk7Ci0JaWYgKGVyckNvZGUgIT0gRFJWX09LKQotCXsKLQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sIGZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsKLQkJcmV0dXJuIGVyckNvZGU7Ci0JfQorICBlcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsKKyAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sICIKKyAgICAgICAgICAgICAgImZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQogCi0Jc3dpdGNoIChwYXJ0aXRpb24pCi0JewotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTIDoKLQkJZXJyQ29kZSA9IERSVl9OQU5ERkxBU0hfR2V0TnZyYW1IYW5kbGUoJm52cmFtSGFuZGxlKTsKLQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQotCQl7Ci0JCQlyZXR1cm4gZXJyQ29kZTsKLQkJfQorICBzd2l0Y2ggKHBhcnRpdGlvbikgeworICAgIGNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTIDoKKyAgICAgIGVyckNvZGUgPSBEUlZfTkFOREZMQVNIX0dldE52cmFtSGFuZGxlKCZudnJhbUhhbmRsZSk7CisgICAgICBpZiAoZXJyQ29kZSAhPSBEUlZfT0spIHsKKyAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICB9CiAKLQkJZXJyQ29kZSA9IERSVl9GTEFTSF9Xcml0ZShzX252cmFtX29mZnNldFtITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlNdICsgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOwotCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spCi0JCXsKLQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7Ci0JCQlyZXR1cm4gZXJyQ29kZTsKLQkJfQotCQlicmVhazsKLQljYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8gOgotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9SVyA6Ci0JCWlmIChkZWZhdWx0U2l6ZSA9PSAwKQotCQl7Ci0JCQlpZiAoZmllbGQgPT0gTlZSQU1fRklFTERfU1lTVEVNX0lEICYmIGVyckNvZGUgPT0gMCkKLQkJCXsKLQkJCQlzeXN0ZW1JZCA9IE5WUkFNX1NXQVAzMigodW5zaWduZWQgaW50KSoodW5zaWduZWQgaW50KilkYXRhKTsKLQkJCQlkYXRhID0gKHZvaWQqKSZzeXN0ZW1JZDsKLQkJCX0KLQkJCWVyckNvZGUgPSBITVhfTlZSQU1fV3JpdGUocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBkYXRhLCBuRGF0YVNpemUpOwotCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQotCQkJewotCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7Ci0JCQkJcmV0dXJuIGVyckNvZGU7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl1bnNpZ25lZCBjaGFyICpwQnVmOworICAgICAgZXJyQ29kZSA9IERSVl9GTEFTSF9Xcml0ZShzX252cmFtX29mZnNldFtITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOworICAgICAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgIkhNWF9OVlJBTV9Xcml0ZVxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOworICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9STyA6CisgICAgY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JXIDoKKyAgICAgIGlmIChkZWZhdWx0U2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChmaWVsZCA9PSBOVlJBTV9GSUVMRF9TWVNURU1fSUQgJiYgZXJyQ29kZSA9PSAwKSB7CisgICAgICAgICAgc3lzdGVtSWQgPSBOVlJBTV9TV0FQMzIoKHVuc2lnbmVkIGludCkqKHVuc2lnbmVkIGludCopZGF0YSk7CisgICAgICAgICAgZGF0YSA9ICh2b2lkKikmc3lzdGVtSWQ7CisgICAgICAgIH0KKyAgICAgICAgZXJyQ29kZSA9IEhNWF9OVlJBTV9Xcml0ZShwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIGRhdGEsIG5EYXRhU2l6ZSk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgICAiSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7CisgICAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CiAKLQkJCXBCdWYgPSBtYWxsb2MoZGVmYXVsdFNpemUpOwotCQkJaWYgKHBCdWYgPT0gTlVMTCkKLQkJCXsKLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIG1hbGxvY1xuIik7Ci0JCQkJcmV0dXJuIDM7Ci0JCQl9Ci0JCQllcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7Ci0JCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spCi0JCQl7Ci0JCQkJbWVtc2V0KHBCdWYsIDAsIGRlZmF1bHRTaXplKTsKLQkJCX0KLQkJCW1lbWNweShwQnVmICsgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOworICAgICAgICBwQnVmID0gbWFsbG9jKGRlZmF1bHRTaXplKTsKKyAgICAgICAgaWYgKHBCdWYgPT0gTlVMTCkgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gbWFsbG9jXG4iKTsKKyAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBlcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIG1lbXNldChwQnVmLCAwLCBkZWZhdWx0U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBCdWYgKyBvZmZzZXQsIGRhdGEsIG5EYXRhU2l6ZSk7CiAKLQkJCWVyckNvZGUgPSBITVhfTlZSQU1fV3JpdGUocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7Ci0JCQlmcmVlKHBCdWYpOwotCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQotCQkJewotCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7Ci0JCQkJcmV0dXJuIGVyckNvZGU7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gRElfRVJSX0lOVkFMSURfUEFSQU0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7Ci0JCXJldHVybiAxOwotCX0KKyAgICAgICAgZXJyQ29kZSA9IEhNWF9OVlJBTV9Xcml0ZShwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIHBCdWYsIGRlZmF1bHRTaXplKTsKKyAgICAgICAgZnJlZShwQnVmKTsKKyAgICAgICAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgICAgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiAiCisgICAgICAgICAgICAgICAgICAgICJITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsKKyAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIERJX0VSUl9JTlZBTElEX1BBUkFNIGZpZWxkKCVkKS0lcyAiCisgICAgICAgICAgICAgICAgImVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7CisgICAgICByZXR1cm4gMTsKKyAgfQogCi0JcmV0dXJuIGVyckNvZGU7CisgIHJldHVybiBlcnJDb2RlOwogfQogCiBEUlZfRXJyb3IgSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pCiB7Ci0JRFJWX0Vycm9yIGVyckNvZGUgPSBEUlZfRVJSOwotCXVuc2lnbmVkIGNoYXIJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07Ci0JSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbjsKLQlpbnQJCQkJCW52cmFtSGFuZGxlOwotCXVuc2lnbmVkIGludAkJCQlkZWZhdWx0U2l6ZTsKLQl1bnNpZ25lZCBjaGFyCQkJCSpwQnVmOworICBEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOworICBITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52cmFtSGFuZGxlOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaXplOworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmOwogCi0JaWYoIHBMZW4gPT0gTlVMTCkKLQl7Ci0JCXJldHVybiAyOwotCX0KKyAgaWYoIHBMZW4gPT0gTlVMTCkgeworICAgIHJldHVybiAyOworICB9CiAKLQkqcExlbiA9IDA7CisgICpwTGVuID0gMDsKIAotCWVyckNvZGUgPSBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGZpZWxkLCAmcGFydGl0aW9uLCBzekZpbGVOYW1lLCAmZGVmYXVsdFNpemUpOwotCWlmIChlcnJDb2RlICE9IERSVl9PSykKLQl7Ci0JCURFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRMZW5ndGhdIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX0dldEZpZWxkSW5mbywgZmllbGQgKCVkKVxuIiwgZXJyQ29kZSwgZmllbGQpOwotCQlyZXR1cm4gZXJyQ29kZTsKLQl9CisgIGVyckNvZGUgPSBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGZpZWxkLCAmcGFydGl0aW9uLCBzekZpbGVOYW1lLCAmZGVmYXVsdFNpemUpOworICBpZiAoZXJyQ29kZSAhPSBEUlZfT0spIHsKKyAgICBERUJVR19FUlIoIltITVhfTlZSQU1fR2V0TGVuZ3RoXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sICIKKyAgICAgICAgICAgICAgImZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQogCi0JZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRMZW5ndGgocGFydGl0aW9uLCBzekZpbGVOYW1lLCBwTGVuKTsKKyAgZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRMZW5ndGgocGFydGl0aW9uLCBzekZpbGVOYW1lLCBwTGVuKTsKIAotCXJldHVybiBEUlZfT0s7CisgIHJldHVybiBEUlZfT0s7CiB9CiAKLURSVl9FcnJvcglITVhfTlZSQU1fUmVtb3ZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lKQorRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9SZW1vdmUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUpCiB7Ci0JaW50CXJlc3VsdDsKKyAgaW50ICAgcmVzdWx0OwogCi0JU0VNX0dldChzX252cmFtU2VtYSk7Ci0JcmVzdWx0ID0gZHJ2X05WUkFNX0RlbGV0ZShwYXJ0aXRpb24sIHBOYW1lKTsKLQlpZiAocmVzdWx0ID09IDApCi0JewotCQlyZXN1bHQgPSBkcnZfTlZSQU1fU2F2ZShwYXJ0aXRpb24pOwotCX0KLQlTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgU0VNX0dldChzX252cmFtU2VtYSk7CisgIHJlc3VsdCA9IGRydl9OVlJBTV9EZWxldGUocGFydGl0aW9uLCBwTmFtZSk7CisgIGlmIChyZXN1bHQgPT0gMCkgeworICAgIHJlc3VsdCA9IGRydl9OVlJBTV9TYXZlKHBhcnRpdGlvbik7CisgIH0KKyAgU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOworICByZXR1cm4gcmVzdWx0OwogfQogCiBEUlZfRXJyb3IgSE1YX05WUkFNX0R1bXAodW5zaWduZWQgY2hhciogcHVjQnVmZmVyLCB1bnNpZ25lZCBpbnQgdWlMZW4sIHVuc2lnbmVkIGludCB1aUFsaWduKQogewotCXVuc2lnbmVkIGludCB1aUluZGV4OwotCXVuc2lnbmVkIGludCBza2lwOworICB1bnNpZ25lZCBpbnQgdWlJbmRleDsKKyAgdW5zaWduZWQgaW50IHNraXA7CiAKLQlza2lwID0gMTsKLQlmb3IgKHVpSW5kZXg9MCA7IHVpSW5kZXg8dWlMZW4gOyB1aUluZGV4KyspCi0JewotCQlpZiAodWlBbGlnbiE9MCAmJiAodWlJbmRleCV1aUFsaWduKT09MCkKLQkJewotCQkJaWYgKHNraXAgPT0gMCkKLQkJCXsKLQkJCQlwcmludGYoIlxuIik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc2tpcCA9IDA7Ci0JCX0KLQkJcHJpbnRmKCIlMDJYICIsICoocHVjQnVmZmVyK3VpSW5kZXgpKTsKLQl9Ci0JcHJpbnRmKCJcbiIpOwotCXJldHVybiBEUlZfT0s7CisgIHNraXAgPSAxOworICBmb3IgKHVpSW5kZXg9MCA7IHVpSW5kZXg8dWlMZW4gOyB1aUluZGV4KyspIHsKKyAgICBpZiAodWlBbGlnbiE9MCAmJiAodWlJbmRleCV1aUFsaWduKT09MCkgeworICAgICAgaWYgKHNraXAgPT0gMCkgeworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNraXAgPSAwOworICAgIH0KKyAgICBwcmludGYoIiUwMlggIiwgKihwdWNCdWZmZXIrdWlJbmRleCkpOworICB9CisgIHByaW50ZigiXG4iKTsKKyAgcmV0dXJuIERSVl9PSzsKK30KKwordm9pZCBITVhfTlZSQU1fUHJpbnRfU2VwYXJhdG9yKHZvaWQpIHsKKyAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAiCisgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogfQogCiBEUlZfRXJyb3IgSE1YX05WUkFNX0Rpcih2b2lkKQogewotICAgIGNoYXIgbmFtZVs4MF07Ci0gICAgY2hhciAqdmFsdWU7Ci0gICAgaW50IG5hbWVMZW4sIHZhbHVlTGVuOwotICAgIGludCBpZHg7CisgIGNoYXIgbmFtZVs4MF07CisgIGNoYXIgKnZhbHVlOworICBpbnQgbmFtZUxlbiwgdmFsdWVMZW47CisgIGludCBpZHg7CiAKLQl2YWx1ZSA9IG1hbGxvYyhNQVhfREFUQV9MRU4pOwotCWlmICh2YWx1ZSA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7Ci0JfQorICB2YWx1ZSA9IG1hbGxvYyhNQVhfREFUQV9MRU4pOworICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOworICB9CiAKLQlTRU1fR2V0KHNfbnZyYW1TZW1hKTsKKyAgU0VNX0dldChzX252cmFtU2VtYSk7CiAKLSAgICBwcmludGYoIlJPTSBOYW1lICAgICAgICBWYWx1ZVxuIik7Ci0gICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIHByaW50ZigiUk9NIE5hbWUgICAgICAgIFZhbHVlXG4iKTsKKyAgSE1YX05WUkFNX1ByaW50X1NlcGFyYXRvcigpOwogCi0gICAgZm9yIChpZHg9MDs7aWR4KyspCi0JewotCQlpZiAoZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9STywgaWR4LCAodW5zaWduZWQgY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCopJm5hbWVMZW4sICh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgKHVuc2lnbmVkIGludCopJnZhbHVlTGVuKSAhPSBEUlZfT0spCi0JCQlicmVhazsKLQkJcHJpbnRmKCIlMjBzICIsIG5hbWUpOwotCQkodm9pZClITVhfTlZSQU1fRHVtcCgodW5zaWduZWQgY2hhciopdmFsdWUsIHZhbHVlTGVuLCAxNik7Ci0JfQotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICBmb3IgKGlkeD0wOztpZHgrKykgeworICAgIGlmIChkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX1JPLCBpZHgsICh1bnNpZ25lZCBjaGFyKiluYW1lLCAodW5zaWduZWQgaW50KikmbmFtZUxlbiwgKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCAodW5zaWduZWQgaW50KikmdmFsdWVMZW4pICE9IERSVl9PSykKKyAgICAgIGJyZWFrOworICAgIHByaW50ZigiJTIwcyAiLCBuYW1lKTsKKyAgICAodm9pZClITVhfTlZSQU1fRHVtcCgodW5zaWduZWQgY2hhciopdmFsdWUsIHZhbHVlTGVuLCAxNik7CisgIH0KKyAgSE1YX05WUkFNX1ByaW50X1NlcGFyYXRvcigpOwogCi0gICAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuIik7CiAKLSAgICBwcmludGYoIlZhcmlhYmxlIE5hbWUgICAgICAgIFZhbHVlXG4iKTsKLSAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcHJpbnRmKCJWYXJpYWJsZSBOYW1lICAgICAgICBWYWx1ZVxuIik7CisgIEhNWF9OVlJBTV9QcmludF9TZXBhcmF0b3IoKTsKIAotICAgIGZvciAoaWR4PTA7O2lkeCsrKQotCXsKLQkJaWYgKGRydl9OVlJBTV9TY2FuRGlyKEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIGlkeCwgKHVuc2lnbmVkIGNoYXIqKW5hbWUsICh1bnNpZ25lZCBpbnQqKSZuYW1lTGVuLCAodW5zaWduZWQgY2hhciopdmFsdWUsICh1bnNpZ25lZCBpbnQqKSZ2YWx1ZUxlbikgIT0gRFJWX09LKQotCQkJYnJlYWs7Ci0JCXByaW50ZigiJTIwcyAiLCBuYW1lKTsKLQkJKHZvaWQpSE1YX05WUkFNX0R1bXAoKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCB2YWx1ZUxlbiwgMTYpOwotCX0KLSAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgZm9yIChpZHg9MDs7aWR4KyspIHsKKyAgICBpZiAoZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9SVywgaWR4LCAodW5zaWduZWQgY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCopJm5hbWVMZW4sICh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgKHVuc2lnbmVkIGludCopJnZhbHVlTGVuKSAhPSBEUlZfT0spCisgICAgICBicmVhazsKKyAgICBwcmludGYoIiUyMHMgIiwgbmFtZSk7CisgICAgKHZvaWQpSE1YX05WUkFNX0R1bXAoKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCB2YWx1ZUxlbiwgMTYpOworICB9CisgIEhNWF9OVlJBTV9QcmludF9TZXBhcmF0b3IoKTsKIAotCWZyZWUodmFsdWUpOworICBmcmVlKHZhbHVlKTsKIAotCVNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKLSAgICByZXR1cm4gRFJWX09LOworICBTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7CisgIHJldHVybiBEUlZfT0s7CiB9CiAKIC8qQH0qLwpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5oCmluZGV4IDc1MzNiN2MuLmI3NzIwZjcgMTAwNjQ0Ci0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uaAorKysgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX252cmFtLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX252cmFtLmggICQKLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJAotICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJAotICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMTEuMDcKLSAqIEZpbGUgRGVzY3JpcHRpb246CVVwZ3JhZGUgQVBJcworLyogRmlsZSBOYW1lOiAgICAgICAgICAgJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uaCAgJAorICogVmVyc2lvbjogICAgICAgICAgICAgJFJldmlzaW9uOiAgIDEuMCAgJAorICogT3JpZ2luYWwgQXV0aG9yOiAgICAgWWFuZyBIeXVuIFVrICQKKyAqIEN1cnJlbnQgQXV0aG9yOiAgICAgICRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKKyAqIERhdGU6ICAgICAgICAgICAgICAgICREYXRlOiAyMDExLjExLjA3CisgKiBGaWxlIERlc2NyaXB0aW9uOiAgICBVcGdyYWRlIEFQSXMKICAqIE1vZHVsZToKICAqIFJlbWFya3M6CiAgKi8KQEAgLTYxLDI2MSArNjEsNDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU3RhcnQgdHlwZWRlZiAqLwogCi10eXBlZGVmIGVudW0KLXsKLQlOVlJBTV9PU0RfT04gPSAwLAotCU5WUkFNX09TRF9PRkYKLX1OVlJBTV9PU0RfRElTUExBWV9FOwotCi10eXBlZGVmIGVudW0KLXsKLQlOVlJBTV9GUk9OVFBBTkVMX0RJU1BMQVlfT04gPSAwLAotCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PRkYKLX1OVlJBTV9GUk9OVFBBTkVMX0RJU1BMQVlfRTsKLQotdHlwZWRlZiBlbnVtCi17Ci0JTlZSQU1fQVNQRUNUX1JBVElPXzRfMyA9IDAsCi0JTlZSQU1fQVNQRUNUX1JBVElPXzE2XzkKLX1OVlJBTV9BU1BFQ1RfUkFUSU9fRTsKLQotdHlwZWRlZiBlbnVtCi17Ci0JTlZSQU1fT1RBX1NTVSA9IDEsCi0JTlZSQU1fT1RBX0RURyA9IDIsCi0JTlZSQU1fT1RBX0hVTUFYID0gMywKLQlOVlJBTV9PVEFfTk9SRElHID0gNCwKLQlOVlJBTV9PVEFfRklMRSA9IDUsCi0JTlZSQU1fT1RBX1NLWUQgPSA2LAotCU5WUkFNX09UQV9NQVgKLX1OVlJBTV9PVEFfVFlQRV9FOwotCi0KLXR5cGVkZWYgZW51bQotewotCU5WUkFNX09UQV9DSEFOTkVMX1NBVAkJPSAxLAotCU5WUkFNX09UQV9DSEFOTkVMX0NBQgkJPSAyLAotCU5WUkFNX09UQV9DSEFOTkVMX1RFUgkJPSAzLAotCU5WUkFNX09UQV9DSEFOTkVMX0ZMQVNICQk9IDQsCi0JTlZSQU1fT1RBX0NIQU5ORUxfRlRQCQk9IDUKLX1OVlJBTV9PVEFfQ0hBTk5FTF9FOwotCi10eXBlZGVmIGVudW0KLXsKLQlOVlJBTV9SRVNPTFVUSU9OX1Vua25vd24JCQk9MHgwMDAwMDAwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzcyMHgyNDBQCQk9MHgwMDAwMDAwMSwKLQlOVlJBTV9SRVNPTFVUSU9OXzI4ODB4MjQwUAkJPTB4MDAwMDAwMDIsCi0JTlZSQU1fUkVTT0xVVElPTl82NDB4NDgwUAkJPTB4MDAwMDAwMDQsCi0JTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwSQkJPTB4MDAwMDAwMDgsCi0JTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwUAkJPTB4MDAwMDAwMTAsCi0JTlZSQU1fUkVTT0xVVElPTl8xNDQweDQ4MFAJCT0weDAwMDAwMDIwLAotCU5WUkFNX1JFU09MVVRJT05fMjg4MHg0ODBJCQk9MHgwMDAwMDA0MCwKLQlOVlJBTV9SRVNPTFVUSU9OXzI4ODB4NDgwUAkJPTB4MDAwMDAwODAsCi0JTlZSQU1fUkVTT0xVVElPTl83MjB4Mjg4UAkJPTB4MDAwMDAxMDAsCi0JTlZSQU1fUkVTT0xVVElPTl8yODgweDI4OFAgCQk9MHgwMDAwMDIwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzcyMHg1NzZJCQk9MHgwMDAwMDQwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzcyMHg1NzZQCQk9MHgwMDAwMDgwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NTc2UAkJPTB4MDAwMDEwMDAsCi0JTlZSQU1fUkVTT0xVVElPTl8yODgweDU3NkkgCQk9MHgwMDAwMjAwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzI4ODB4NTc2UAkJPTB4MDAwMDQwMDAsCi0JTlZSQU1fUkVTT0xVVElPTl8xMDgweDcyMFAJCT0weDAwMDA4MDAwLAotCU5WUkFNX1JFU09MVVRJT05fMTI4MHg3MjBQCQk9MHgwMDAxMDAwMCwKLQlOVlJBTV9SRVNPTFVUSU9OXzE5MjB4MTA4MEkJCT0weDAwMDIwMDAwLAotCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwUAkJPTB4MDAwNDAwMDAsCi0JTlZSQU1fUkVTT0xVVElPTl9EVU1NWQkJCT0weDAwMEZGRkZGCi19IE5WUkFNX1ZJREVPX1JFU09MVVRJT05fRTsKLQotdHlwZWRlZiBlbnVtCi17Ci0JTlZSQU1fSERNSV9GSUVMRF9SQVRFX1Vua25vd24JPTB4MDAwMCwKLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjRIWgkJPTB4MDAwMSwKLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjVIWiAJCT0weDAwMDIsCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzMwSFogCQk9MHgwMDA0LAotCU5WUkFNX0hETUlfRklFTERfUkFURV81MEhaIAkJPTB4MDAwOCwKLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfNjBIWiAJCT0weDAwMTAsCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEwMEhaIAkJPTB4MDAyMCwKLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMTIwSFogCQk9MHgwMDQwLAotCU5WUkFNX0hETUlfRklFTERfUkFURV8yMDBIWgkJPTB4MDA4MCwKLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjQwSFoJCT0weDAxMDAsCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFX0RVTU1ZCQk9MHhGRkZGCi19IE5WUkFNX0hETUlfVklERU9fRklFTERfUkFURV9FOwotCi0KLXR5cGVkZWYgZW51bQotewotCU5WUkFNX0hETUlfVklERU9fQVJfZU5vRGF0YSA9IDAsCi0JTlZSQU1fSERNSV9WSURFT19BUl9lNF8zLAotCU5WUkFNX0hETUlfVklERU9fQVJfZTE2XzkKLX1OVlJBTV9IRE1JX1ZJREVPX0FSX0U7Ci0KLQotdHlwZWRlZiBlbnVtCi17Ci0JTlZSQU1fU0NBUlRfT1VUUFVUX0NWQlM9MywKLQlOVlJBTV9TQ0FSVF9PVVRQVVRfUkdCLAotCU5WUkFNX1NDQVJUX09VVFBVVF9TVklERU8sCi0KLQlOVlJBTV9TQ0FSVF9NQVgKLX0gTlZSQU1fU0NBUlRfU0VUVElOR19WQUxVRTsKLQotdHlwZWRlZiBlbnVtIHRhZ05WUkFNX0ZJRUxECi17Ci0JTlZSQU1fRklFTERfU1lTVEVNX0lEID0gMCwJCQkJCS8vIHVuc2lnbmVkIGludAkJCQkvLyA0CQkJCS8vIFN5c3RlbSBJZAotCU5WUkFNX0ZJRUxEX1NGTEFTSCwKLQlOVlJBTV9GSUVMRF9TRVJJQUxfTk8sCi0JTlZSQU1fRklFTERfTUFDX0FERFIsCi0JTlZSQU1fRklFTERfSERDUF9LRVksCi0JTlZSQU1fRklFTERfRFRDUF9LRVksCi0JTlZSQU1fRklFTERfQ0lfUExVU19LRVksCi0JTlZSQU1fRklFTERfUEFSSU5HX0RBVEEsCi0JTlZSQU1fRklFTERfUFJJVkFURSwKLQlOVlJBTV9GSUVMRF9DU0NfS0VZLAotCU5WUkFNX0ZJRUxEXzFTVF9TRVJJQUxfTlVNQkVSLAotCU5WUkFNX0ZJRUxEXzJORF9TRVJJQUxfTlVNQkVSLAotCU5WUkFNX0ZJRUxEX0dQTiwKLQlOVlJBTV9GSUVMRF9NQUNfQUREUl9NT0NBLAotCU5WUkFNX0ZJRUxEX01BQ19BRERSX0JULAotCU5WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfUEVNLAotCU5WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfQ1JULAotCU5WUkFNX0ZJRUxEX0NNX1NFUklBTF9OTywKLQlOVlJBTV9GSUVMRF9DTV9NQUNfQUREUiwKLQlOVlJBTV9GSUVMRF9DTV9NQUNfQUREUl9BTk9USEVSLAotCU5WUkFNX0ZJRUxEX0lSREVUT19CQkNCLAotCi0JTlZSQU1fRklFTERfT1RBX1RZUEUxID0gMHgxMDAsCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UKLQlOVlJBTV9GSUVMRF9PVEFfVFlQRTIsIAkJCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UKLQlOVlJBTV9GSUVMRF9PVEFfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX1RZUEVfRQotCU5WUkFNX0ZJRUxEX0NIX1RZUEUxLAkJCQkJCS8vIE5WUkFNX09UQV9DSEFOTkVMX0UKLQlOVlJBTV9GSUVMRF9DSF9UWVBFMiwJCQkJCQkvLyBOVlJBTV9PVEFfQ0hBTk5FTF9FCi0JTlZSQU1fRklFTERfQ0hfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX0NIQU5ORUxfRQotCU5WUkFNX0ZJRUxEX09UQV9GTEFHMSwJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FCi0JTlZSQU1fRklFTERfT1RBX0ZMQUcyLAkJCQkJCS8vIE5WUkFNX09UQV9GTEFHX0UKLQlOVlJBTV9GSUVMRF9PVEFfRkxBRzMsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQotCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMSwJCQkJCQkvLyBUdW5lciBJZAotCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMiwJCQkJCQkvLyBUdW5lciBJZAotCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMywJCQkJCQkvLyBUdW5lciBJZAotCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjEsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbgotCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjIsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbgotCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjMsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbgotCU5WUkFNX0ZJRUxEX0VTX1BJRDEsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBCi0JTlZSQU1fRklFTERfRVNfUElEMiwJCQkJCQkJLy8gRWxlbWVudCBTdHJlYW0gUElEIGZvciBPVEEKLQlOVlJBTV9GSUVMRF9FU19QSUQzLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQotCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMSwJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBCi0JTlZSQU1fRklFTERfVFJBTlNBQ1RJT05fSUQyLAkJCQkJLy8gVHJhbnNhY3Rpb24gSWQgZm9yIE5vcmRpYyBPVEEKLQlOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDMsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQotCU5WUkFNX0ZJRUxEX0NIX0lORk9fUywJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNCi0JTlZSQU1fRklFTERfQ0hfSU5GT19ULAkJCQkJCS8vIERJX0NIQU5ORUxfUEFSQU0KLQlOVlJBTV9GSUVMRF9DSF9JTkZPX0MsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQotCU5WUkFNX0ZJRUxEX05FVF9QT1JUQUxfSVAsCQkJCQkvLyBwb3J0YWwgaXAgYWRkcmVzcwotCU5WUkFNX0ZJRUxEX05FVF9ET1dOX1BBVEgsCQkJCQkvLyBOZXR3b3JrIERvd25sb2FkIFBhdGgKLQlOVlJBTV9GSUVMRF9ORVRfREVWSUNFX0lELAkJCQkJLy8gZXRoZXJuZXQgZGV2aWNlIGlkIDAgPSBldGgwCi0JTlZSQU1fRklFTERfTkVUX0lQX0NPTkZJRywJCQkJCS8vIERIQ1AvTWFudWFsCi0JTlZSQU1fRklFTERfTkVUX0lQX1NFVFRJTkcsCQkJCQkvLyBNYW51YWwgSVAgc2V0dGluZwotCU5WUkFNX0ZJRUxEX09UQV9GVFBfSU5GTywJCQkJCS8vIE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UCi0JTlZSQU1fRklFTERfRklMRV9TSVpFLAkJCQkJCS8vIGZpbGUgc2l6ZSBvZiBiYWNrZ3JvdWxkIG90YQotCi0JTlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04sCQkJCQkvLyBWZXJzaW9uIG9mIGJvb3QgTG9hZGVyCi0JTlZSQU1fRklFTERfQVBQX1ZFUlNJT04sCQkJCQkJLy8gVmVyc2lvbiBudW1iZXIgb2YgQXBwbGljYXRpb24KLQlOVlJBTV9GSUVMRF9PVEFMRFJfVkVSU0lPTiwJCQkJCS8vIFZlcnNpb24gb2YgT1RBIExvYWRlcgotCU5WUkFNX0ZJRUxEX0NVUl9PVEFJTUFHRV9WRVJTSU9OLAkJCS8vIFZlcnNpb24gbnVtYmVyIG9mIE9UQSBpbWFnZQotCU5WUkFNX0ZJRUxEX0xPQURFUl9WRVIsCi0JTlZSQU1fRklFTERfQVBQX1ZFUiwKLQotCU5WUkFNX0ZJRUxEX0xBTkdVQUdFLAkJCQkJCS8vIE9TRCBsYW5ndWFnZSBjb2RlIGluIElTTyA2MzkgY29kZQotCU5WUkFNX0ZJRUxEX0NPVU5UUllfQ09ERSwJCQkJCS8vIHVuc2lnbmVkIGNoYXIgYVszXQotCU5WUkFNX0ZJRUxEX1RWX1NUQU5EQVJELAkJCQkJCS8vIERJX1ZJREVPX1NEX1NUQU5EQVJECi0JTlZSQU1fRklFTERfU0NBUlRfUkdCLAkJCQkJCS8vIE5WUkFNX1NDQVJUX1NFVFRJTkdfVkFMVUUKLQlOVlJBTV9GSUVMRF9IRF9SRVNPVUxUSU9OLAkJCQkJLy8gTlZSQU1fVklERU9fUkVTT0xVVElPTl9FCi0JTlZSQU1fRklFTERfRklFTERfUkFURSwJCQkJCQkvLyBOVlJBTV9IRE1JX1ZJREVPX0ZJRUxEX1JBVEVfRQotCU5WUkFNX0ZJRUxEX09BRF9WRVJTSU9OLAkJCQkJCS8vIGZvciBNSEVHID8/PwotCU5WUkFNX0ZJRUxEX1JDVV9DVVNUT01fQ09ERSwJCQkJCS8vIGZvciBSQ1UgY3VzdG9tIGNvZGUKLQlOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUyLAkJCQkvLyBmb3IgYWx0ZXJuYXRpdmUgUkNVIGN1c3RvbSBjb2RlCi0JTlZSQU1fRklFTERfUEFORUxfRElTUExBWSwJCQkJCS8vIERJX09UQV9QQU5FTERJU1BMQVlfdAotCU5WUkFNX0ZJRUxEX1BBTkVMX0RJTU1JTkcsCQkJCQkvLyB1bnNpZ25lZCBjaGFyCi0JTlZSQU1fRklFTERfT1NEX0RJU1BMQVksCQkJCQkJLy8gTlZSQU1fT1NEX0RJU1BMQVlfRQotCU5WUkFNX0ZJRUxEX1NUQVJUX0JBTktfRkxBRywJCQkJCS8vILXOILCzwMcgYmFua8HfIL7utfC3ziC6zsbDIMfSIMH2ILDhwaQKLQlOVlJBTV9GSUVMRF9DSEVDS19VU0IsCQkJCQkJLy8gus7GwyC9wyBVU0IguLa/7saux9i8rSBoZGa4piCwy7vnx9LB9iC4u8H2ILDhwaQKLQlOVlJBTV9GSUVMRF9DSEVDS19VU0JfQ09VTlQsCQkJCQkvLyDApyC1v8DbIL3HxtAgvcMguO4gufggwOcgvcO1tSDH0sH2IGNvdW50uKYgwPrA5QotCU5WUkFNX0ZJRUxEX0FTUEVDVF9SQVRJTywJCQkJCS8vIE5WUkFNX0FTUEVDVF9SQVRJT19FCi0JTlZSQU1fRklFTERfVVNBR0VfSUQsCQkJCQkJLy8gZm9yIFVQQyBPVEEKLQlOVlJBTV9GSUVMRF9CSU44SywJCQkJCQkJLy8gZm9yIGVlcHJvbSBlbXVsYXRpb24KLQlOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQiwJCQkJCQkvLyBmb3IgSVJERVRPIENQQ0IKLQlOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQl9FTkNSWVBURUQsIAkJCS8vIGZvciBJUkRFVE8gQ1BDQiAoZW5jcnlwdGVkKQotCi0JTlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sIAkJCS8vIEFDVElWQVRFRF9LRVJORUxfTlVNCi0JTlZSQU1fRklFTERfTVREX1RZUEVfRk9SX0tFUk5FTCwgCQkJLy8gTVREX1RZUEVfRk9SX0tFUk5FTAotCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRSwJCQkvLyAia2VybmVsMCIsIGxvb2t1cCBtdGQgcGFydGl0aW9uCi0JTlZSQU1fRklFTERfUExBVEZPUk1fTkFNRSwJCQkJLy8gUGxhdGZvcm0gbmFtZSwgZS5nLiAiZ2ZoZDEwMCIKLQlOVlJBTV9GSUVMRF9FWFRSQV9LRVJORUxfT1BULAkJCQkvLyBzdHJpbmcgdG8gYXBwZW5kIHRvIGNtZGxpbmUKLQlOVlJBTV9GSUVMRF9QQUlSRURfRElTSywJCQkJLy8gc2VyaWFsIG51bWJlciBvZiB0aGUgZGlzawotCU5WUkFNX0ZJRUxEX1BBUlRJVElPTl9WRVIsCQkgICAgICAgIAkvLyBwYXJ0aXRpb24gdmVyc2lvbgotCi0JTlZSQU1fRklFTERfUkFXRlMgPSAweDEwMDAsCi0JTlZSQU1fRklFTERfRFVNTVkgPSAweEZGRkYKK3R5cGVkZWYgZW51bSB0YWdOVlJBTV9GSUVMRCB7CisgIE5WUkFNX0ZJRUxEX1NZU1RFTV9JRCA9IDAsICAgICAgICAgICAgLy8gU3lzdGVtIElkCisgIE5WUkFNX0ZJRUxEX1NFUklBTF9OTywKKyAgTlZSQU1fRklFTERfTUFDX0FERFIsCisgIE5WUkFNX0ZJRUxEX0hEQ1BfS0VZLAorICBOVlJBTV9GSUVMRF9EVENQX0tFWSwKKyAgTlZSQU1fRklFTERfMVNUX1NFUklBTF9OVU1CRVIsCisgIE5WUkFNX0ZJRUxEXzJORF9TRVJJQUxfTlVNQkVSLAorICBOVlJBTV9GSUVMRF9HUE4sCisgIE5WUkFNX0ZJRUxEX01BQ19BRERSX01PQ0EsCisgIE5WUkFNX0ZJRUxEX01BQ19BRERSX0JULAorICBOVlJBTV9GSUVMRF9HT09HTEVfU1NMX1BFTSwKKyAgTlZSQU1fRklFTERfR09PR0xFX1NTTF9DUlQsCisgIE5WUkFNX0ZJRUxEX0xPQURFUl9WRVJTSU9OLCAgICAgICAgICAgLy8gVmVyc2lvbiBvZiBib290IExvYWRlcgorICBOVlJBTV9GSUVMRF9BQ1RJVkFURURfS0VSTkVMX05VTSwgICAgIC8vIEFDVElWQVRFRF9LRVJORUxfTlVNCisgIE5WUkFNX0ZJRUxEX01URF9UWVBFX0ZPUl9LRVJORUwsICAgICAgLy8gTVREX1RZUEVfRk9SX0tFUk5FTAorICBOVlJBTV9GSUVMRF9BQ1RJVkFURURfS0VSTkVMX05BTUUsICAgIC8vICJrZXJuZWwwIiwgbG9va3VwIG10ZCBwYXJ0aXRpb24KKyAgTlZSQU1fRklFTERfUExBVEZPUk1fTkFNRSwgICAgICAgICAgICAvLyBQbGF0Zm9ybSBuYW1lLCBlLmcuICJnZmhkMTAwIgorICBOVlJBTV9GSUVMRF9FWFRSQV9LRVJORUxfT1BULCAgICAgICAgIC8vIHN0cmluZyB0byBhcHBlbmQgdG8gY21kbGluZQorICBOVlJBTV9GSUVMRF9QQUlSRURfRElTSywgICAgICAgICAgICAgIC8vIHNlcmlhbCBudW1iZXIgb2YgdGhlIGRpc2sKKyAgTlZSQU1fRklFTERfUEFSVElUSU9OX1ZFUiwgICAgICAgICAgICAvLyBwYXJ0aXRpb24gdmVyc2lvbgorICBOVlJBTV9GSUVMRF9EVU1NWSA9IDB4RkZGRgogfSBOVlJBTV9GSUVMRF9UOwogCi10eXBlZGVmIGVudW0KLXsKLQlOVlJBTV9PVEFfRkxBR19OT19PVEEJCQk9IDB4MDAsCi0JTlZSQU1fT1RBX0ZMQUdfREVURUNURUQJCQk9IDB4MDEsCi0JTlZSQU1fT1RBX0ZMQUdfQ09NUExFVEVECQkJPSAweDAyLAotCU5WUkFNX09UQV9GTEFHX0ZPUkNFX1VQR1JBREUJCT0gMHgwNCwKLQlOVlJBTV9PVEFfRkxBR19OQUdSQV9SRUNPVkVSWQk9IDB4MDgsCi0JTlZSQU1fT1RBX0ZMQUdfRE9XTkxPQURJTkcJCT0gMHgxMCwKLQlOVlJBTV9PVEFfRkxBR19XUklUSU5HCQkJPSAweDIwLAotCU5WUkFNX09UQV9GTEFHX0VSUk9SCQkJCT0gMHg4MAotfSBOVlJBTV9PVEFfRkxBR19FOwotCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9ORVRfSVBfU0VUVElOR19UYWcKLXsKLSNkZWZpbmUgTkVUX0FERFJfTEVOR1RIIDQKLQl1bnNpZ25lZCBjaGFyCQlpcFtORVRfQUREUl9MRU5HVEhdOwotCXVuc2lnbmVkIGNoYXIJCW1hc2tbTkVUX0FERFJfTEVOR1RIXTsKLQl1bnNpZ25lZCBjaGFyIAkJZ2F0ZXdheVtORVRfQUREUl9MRU5HVEhdOwotCXVuc2lnbmVkIGNoYXIJCWRuc1tORVRfQUREUl9MRU5HVEhdOwotfSBOVlJBTV9ORVRfSVBfU0VUVElOR19UOwotCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVGFnCi17Ci0jZGVmaW5lIE5WUkFNX0ZUUF9VU0VSX0xFTkdUSCAJCTIwCi0jZGVmaW5lIE5WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIIAkJMjAKLSNkZWZpbmUgTlZSQU1fRlRQX0RJUl9QQVRIX0xFTkdUSCAJMjAwCi0jZGVmaW5lIE5WUkFNX0ZUUF9GSUxFX05BTUVfTEVOR1RIIAk1MAotCXVuc2lnbmVkIGNoYXIJCWFTZXJ2ZXJJcFtORVRfQUREUl9MRU5HVEhdOwotCXVuc2lnbmVkIGNoYXIgCQlhVXNlck5hbWVbTlZSQU1fRlRQX1VTRVJfTEVOR1RIXTsKLQl1bnNpZ25lZCBjaGFyIAkJYVBhc3N3ZFtOVlJBTV9GVFBfUEFTU1dEX0xFTkdUSF07Ci0JdW5zaWduZWQgY2hhciAJCWFEaXJQYXRoW05WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEhdOwotCXVuc2lnbmVkIGNoYXIgCQlhRmlsZU5hbWVbTlZSQU1fRlRQX0ZJTEVfTkFNRV9MRU5HVEhdOwotfSBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVDsKLQotdHlwZWRlZiBlbnVtCi17Ci0JTlZSQU1fSVBfREhDUCA9IDAsCi0JTlZSQU1fSVBfTUFOVUFMCi19IE5WUkFNX05FVF9JUF9DT05GSUdfRTsKLQogLyogU3RhcnQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgZW51bSBITVhfTlZSQU1fUEFSVElUSU9OX2UKLXsKLQlITVhfTlZSQU1fUEFSVElUSU9OX1JPLAotCUhNWF9OVlJBTV9QQVJUSVRJT05fUlcsCi0JSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTLAotCUhNWF9OVlJBTV9QQVJUSVRJT05fTUFYCi19SE1YX05WUkFNX1BBUlRJVElPTl9FOwordHlwZWRlZiBlbnVtIEhNWF9OVlJBTV9QQVJUSVRJT05fZSB7CisgIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sCisgIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsCisgIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUywKKyAgSE1YX05WUkFNX1BBUlRJVElPTl9NQVgKK30gSE1YX05WUkFNX1BBUlRJVElPTl9FOwogCiAKLXR5cGVkZWYgZW51bQotewotCURSVl9PSwkJCT0JMCwKLSAJRFJWX0VSUiwKLQotCURSVl9FUlJfSU5WQUxJRF9QQVJBTUVURVIsCi0JRFJWX0VSUl9JTklUSUFMSVpBVElPTiwKLQlEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OLAotCURSVl9FUlJfT1VUT0ZNRU1PUlksCi0JRFJWX0VSUl9FWFRFUk5BTF9FUlJPUgotCi19RFJWX0Vycm9yOwordHlwZWRlZiBlbnVtIHsKKyAgRFJWX09LID0gMCwKKyAgRFJWX0VSUiwKKyAgRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwKKyAgRFJWX0VSUl9JTklUSUFMSVpBVElPTiwKKyAgRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTiwKKyAgRFJWX0VSUl9PVVRPRk1FTU9SWSwKKyAgRFJWX0VSUl9FWFRFUk5BTF9FUlJPUgorfSBEUlZfRXJyb3I7CiAKIC8qIEVuZCB0eXBlZGVmICovCiAKQEAgLTMyMywyMyArMTEwLDI5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IEhNWF9VUEdSQURFX05WUkFNX1dyaXRlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwgdW5zaWduZWQgaW50IHNpemUgKTsKLWV4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICk7Ci0KK2V4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSApOworZXh0ZXJuIGludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1EUlZfRXJyb3IJSE1YX05WUkFNX0luaXQodm9pZCk7Ci1EUlZfRXJyb3IJSE1YX05WUkFNX1dyaXRlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOwotRFJWX0Vycm9yCUhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOwotRFJWX0Vycm9yCUhNWF9OVlJBTV9HZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsKLURSVl9FcnJvcglITVhfTlZSQU1fU2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSk7Ci1EUlZfRXJyb3IJSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pOwotRFJWX0Vycm9yCUhNWF9OVlJBTV9SZW1vdmUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUpOwotRFJWX0Vycm9yCUhNWF9OVlJBTV9EaXIodm9pZCk7Ci0KLQorRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9Jbml0KHZvaWQpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9Xcml0ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwTmFtZSwgdW5zaWduZWQgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcFZhbHVlLCB1bnNpZ25lZCBpbnQgdWxTaXplKTsKK0RSVl9FcnJvciAgICAgICBITVhfTlZSQU1fUmVhZChITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7CitEUlZfRXJyb3IgICAgICAgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsKK0RSVl9FcnJvciAgICAgICBITVhfTlZSQU1fR2V0TGVuZ3RoKE5WUkFNX0ZJRUxEX1QgZmllbGQsIGludCAqcExlbik7CitEUlZfRXJyb3IgICAgICAgSE1YX05WUkFNX1JlbW92ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE5hbWUpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9EaXIodm9pZCk7CiAvKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIAogCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5jIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9zeXN0ZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkMTY5OS4uMDAwMDAwMAotLS0gYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9zeXN0ZW0uYyAgJAotICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkCi0gKiBPcmlnaW5hbCBBdXRob3I6CQlZYW5nIEh5dW4gVWsgJAotICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzAKLSAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcwotICogTW9kdWxlOgotICogUmVtYXJrczoKLSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBVUEdSQURFX1NZU1RFTSBTeXN0ZW0gQVBJcyBmb3IgVXBncmFkZSBNb2R1bGUKLSAqIEBpbmdyb3VwIFVQR1JBREUKLSAqLwotCi0vKioKLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCi0gKiBAZGF0ZSAzMCBTZXB0IDIwMTEKLSAqLwotCi0vKioKLSAqIEBub3RlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4KLSAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KLSAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlCi0gKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuCi0gKi8KLQotIC8qQHsqLwotCi0vKioKLSAqIEBmaWxlIGhteF91cGdyYWRlX3N5c3RlbS5jCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLwotI2luY2x1ZGUgImhteF91cGdyYWRlX3N5c3RlbS5oIgotLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVEFTS19ERUJVRwotI2RlZmluZSBQcmludERlYnVnKGZtdCwgLi4uKSAJCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikgICAgCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgUHJpbnRFbnRlciguLi4pCQkJcHJpbnRmKCIoKyklc1xuIiwgX19GVU5DVElPTl9fKQotI2RlZmluZSBQcmludEV4aXQoLi4uKQkJCQlwcmludGYoIigtKSVzXG4iLCBfX0ZVTkNUSU9OX18pCi0jZWxzZQotI2RlZmluZSBQcmludERlYnVnKGZtdCwgLi4uKSAgICAJd2hpbGUgKDApICgoaW50ICgqKShjaGFyICosIC4uLikpIDApCi0jZGVmaW5lIFByaW50RXJyb3IoZm10LCAuLi4pCQlwcmludGYgKGZtdCwgIyMgX19WQV9BUkdTX18pCi0jZGVmaW5lIFByaW50RW50ZXIoLi4uKSAJCQl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkKLSNkZWZpbmUgUHJpbnRFeGl0KC4uLikJCQkJd2hpbGUgKDApICgoaW50ICgqKShjaGFyICosIC4uLikpIDApCi0jZW5kaWYKLQotCi0jZGVmaW5lIGxpc3Rfc2l6ZShsaXN0KSAoKGxpc3QpLT5jdXJyX21zZ19jb3VudF8pCi0KLSNkZWZpbmUgbGlzdF9iaXRtYXBfc2l6ZShsaXN0LCBpKSAoKGxpc3QpLT5iaXRtYXBfY291bnRbKGkpXSkKLQotI2RlZmluZSBsaXN0X2hlYWQobGlzdCwgaSkgKChsaXN0KS0+aGVhZFtpXSkKLQotI2RlZmluZSBsaXN0X3RhaWwobGlzdCwgaSkgKChsaXN0KS0+dGFpbFtpXSkKLQotI2RlZmluZSBsaXN0X2lzX2hlYWQobGlzdCwgZWxlbWVudCkgKChlbGVtZW50KSA9PSAobGlzdCktPmhlYWQgPyAxIDogMCkKLQotI2RlZmluZSBsaXN0X2lzX3RhaWwoZWxlbWVudCkgKChlbGVtZW50KS0+bmV4dCA9PSBOVUxMID8gMSA6IDApCi0KLSNkZWZpbmUgbGlzdF9kYXRhKGVsZW1lbnQpICgoZWxlbWVudCktPmRhdGEpCi0KLSNkZWZpbmUgbGlzdF9uZXh0KGVsZW1lbnQpICgoZWxlbWVudCktPm5leHQpCi0KLSNkZWZpbmUgSEFQUFkoYSkgKHZvaWQpKGEpCi0KLS8qIEVuZCAjZGVmaW5lICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IHR5cGVkZWYgKi8KLS8qIEVuZCB0eXBlZGVmICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovCi0KLS8qIEVuZCBnbG9iYWwgdmFyaWFibGUgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCBzdGF0aWMgdmFyaWFibGUgKi8KLS8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgUF9NU0dfQ2hlY2soc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIHVuc2lnbmVkIGxvbmcgcV9pZCk7Ci0KLQotLyoKLSAgICBsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAKLSAgICBiaXRtYXC/obytILChwOUgs/TAuiC/7LyxvPjAp7imIMOjtMK02S4KLSovCi11bnNpZ25lZCBsb25nIGxpc3RfZmluZF9oaWdoZXN0X3ByaW9yaXR5X2JpdG1hcChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvcihpPU1TR19QUklPUklUWV9NQVgtMTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgaWYobGlzdC0+Yml0bWFwW2ldID09IDEpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLS8qCi0gICAgcHJpbnRfbGlzdAotICAgIEhNWF9NU0dfcXVldWUgsbjBtsO8IMD8w7y4piBQcmludMfRtNkuCi0qLwotdm9pZCBwcmludF9saXN0KGNvbnN0IHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0KQotewotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICplbGVtZW50OwotICAgIGludCAgICAgICAgICAgICAgICAqZGF0YSwgaSwgY291bnQ7Ci0KLSAgICBmcHJpbnRmKHN0ZG91dCwgIk1zZyBRdWV1ZSBDdXJyZW50IHRvdGFsIHNpemUgaXMgJWxkXG4iLCBsaXN0X3NpemUobGlzdCkpOwotCi0gICAgZm9yKGNvdW50PTA7IGNvdW50PE1TR19QUklPUklUWV9NQVg7IGNvdW50KyspCi0gICAgewotICAgICAgICBpID0gMDsKLQotICAgICAgICBpZiggbGlzdC0+Yml0bWFwW2NvdW50XSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50ID0gbGlzdF9oZWFkKGxpc3QsIGNvdW50KTsKLQotICAgICAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBkYXRhID0gbGlzdF9kYXRhKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJwcmlvcml0eVslZF0gOiBxbGlzdFslMDNkXT0lMDNkXG4iLCBjb3VudCwgaSwgKmRhdGEpOwotCi0gICAgICAgICAgICAgICBpKys7Ci0KLSAgICAgICAgICAgICAgIGlmIChsaXN0X2lzX3RhaWwoZWxlbWVudCkpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0X25leHQoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotCi0vKgotICAgIGxpc3Rfc2V0X2JpdG1hcAotICAgIL/svLG8+MCnv6Egx9i058fPtMIguvHGrrjKwLsgc2V0IMfRtNkuCi0qLwotdm9pZCBsaXN0X3NldF9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykKLXsKLSAgICBsaXN0LT5iaXRtYXBbcHJpb10gPSAxOwotfQotCi0KLQotLyoKLSAgICBsaXN0X2NsZWFyX2JpdG1hcAotICAgIL/svLG8+MCnv6Egx9i058fPtMIguvHGrrjKwLsgY2xlYXIgx9G02S4KLSovCi12b2lkIGxpc3RfY2xlYXJfYml0bWFwKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8pCi17Ci0gICAgbGlzdC0+Yml0bWFwW3ByaW9dID0gMDsKLX0KLQotCi0KLQotCi0KLQotLyoKLSAgICBsaXN0X2JpdG1hcF9jb3VudF9pbmNyZWFzZQotICAgIMfYtOfHz7TCIL/svLG8+MCnwMcgYml0bWFwIENvdW50uKYgwfWwoSC9w8WytNkuCi0qLwotdm9pZCBsaXN0X2JpdG1hcF9jb3VudF9pbmNyZWFzZShzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdW5zaWduZWQgbG9uZyBwcmlvKQotewotICAgIGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXSsrOwotfQotCi0KLQotLyoKLSAgICBsaXN0X2JpdG1hcF9jb3VudF9kZWNyZWFzZQotICAgIMfYtOfHz7TCIL/svLG8+MCnwMcgYml0bWFwIENvdW50uKYgsKi80iC9w8WytNkuCi0qLwotdm9pZCBsaXN0X2JpdG1hcF9jb3VudF9kZWNyZWFzZShzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdW5zaWduZWQgbG9uZyBwcmlvKQotewotICAgIGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXS0tOwotfQotCi0KLS8qCi0gICAgbGlzdF9tYXBwaW5nX3Rhc2tfcHJpb3JpdHlfdG9fbXNncQotICAgIMXCvbrFqSC/7LyxvPjAp7imILHiwdjAuLfOILjevLzB9sWlIL/svLG8+MCnuKYgsOHBpMfRtNkuCi0qLwotaW50IGxpc3RfZmluZF9tc2dfcV9wcmlvcml0eV9mcm9tX3Rhc2tfcHJpb3JpdHkodW5zaWduZWQgbG9uZyAqcHJpbykKLXsKLSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0JcGFyYW07Ci0gICAgaW50IHBvbGljeSA9IDA7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0oIHB0aHJlYWRfc2VsZigpLCAmcG9saWN5LCAmcGFyYW0pOwotICAgIGlmKHJjICE9IEhNWF9PSykKLSAgICB7Ci0JCSpwcmlvID0gTVNHX1BSSU9SSVRZMDsKLQkJcmV0dXJuIEhNWF9PSzsKLSAgICB9Ci0gICAgUHJpbnREZWJ1ZygicG9saWN5ID0gJWRcbiIsIHBvbGljeSk7Ci0gICAgUHJpbnREZWJ1ZygicGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAlZFxuIiwgcGFyYW0uc2NoZWRfcHJpb3JpdHkpOwotCi0gICAgc3dpdGNoKHBhcmFtLnNjaGVkX3ByaW9yaXR5KQotICAgIHsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMDoKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxOgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTI6Ci0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMzoKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk0OgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTU6Ci0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNjoKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk3OgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk3OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTg6Ci0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZOToKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZOTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxMDoKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTE6Ci0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTExOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTEyOgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxMzoKLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTQ6Ci0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTE1OgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBITVhfT0s7Ci19Ci0KLQotLyoKLQlxX2luc2VydF90ZW1wX3RhaWxfZWxlbWVudAotCXRlbXAgUWV1Zb+hIGVsZW1lbnS4piC/rLDhIMfRtNkuCi0qLwotdm9pZCBxX2luc2VydF90ZW1wX3RhaWxfZWxlbWVudChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSwgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqZWxlbWVudCkKLXsKLQlpZihxLT50ZW1wX3RhaWwgPT0gTlVMTCkKLQl7Ci0JCXEtPnRlbXBfaGVhZCA9IGVsZW1lbnQ7Ci0JCWVsZW1lbnQtPm5leHQgPSBOVUxMOwotCQllbGVtZW50LT5wcmV2ID0gTlVMTDsKLQkJcS0+dGVtcF90YWlsID0gZWxlbWVudDsKLQl9Ci0JZWxzZQotCXsKLQkJcS0+dGVtcF90YWlsLT5uZXh0ID0gZWxlbWVudDsKLQkJZWxlbWVudC0+bmV4dCA9IE5VTEw7Ci0JCWVsZW1lbnQtPnByZXYgPSBxLT50ZW1wX3RhaWw7Ci0JCXEtPnRlbXBfdGFpbCA9IGVsZW1lbnQ7Ci0JfQotfQotCi0vKgotCXFfcmVtb3ZlX3RlbXBfdGFpbF9lbGVtZW50Ci0JdGVtcCBRZXVlv6G8rSC4tsH2uLcgZWxlbWVudLimIMGmsMXHz7+pILPRsNzB2LTZLgotKi8KLXZvaWQgcV9yZW1vdmVfdGVtcF90YWlsX2VsZW1lbnQoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIAlzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICoqZWxlbWVudCkKLXsKLQlQcmludEVudGVyKCk7Ci0KLSAgICAgIAkqZWxlbWVudCA9IHEtPnRlbXBfdGFpbDsKLQotCWlmKHEtPnRlbXBfaGVhZC0+bmV4dCA9PSBOVUxMKSAvL2VsZW1lbnQgMbCzILOywLogsOa/7C4KLQl7Ci0JCXEtPnRlbXBfaGVhZCA9IE5VTEw7Ci0JCXEtPnRlbXBfdGFpbCA9IE5VTEw7Ci0JfQotCWVsc2UKLQl7Ci0JCXEtPnRlbXBfdGFpbC0+cHJldi0+bmV4dCA9IE5VTEw7Ci0JCXEtPnRlbXBfdGFpbCA9IHEtPnRlbXBfdGFpbC0+cHJldjsKLQl9Ci0JUHJpbnRFeGl0KCk7Ci19Ci0KLS8qCi0JcV9kZXN0b3J5X3RlbXBfdGFpbAotCXRlbXAgUWV1ZcDHIGVsZW1lbnQgbWVtb3J5uKYgvNK46r3DxbK02S4KLSovCi12b2lkIHFfZGVzdG9yeV90ZW1wX3RhaWwoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEpCi17Ci0Jc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqcV9lbGVtZW50OwotCi0JUHJpbnRFbnRlcigpOwotCi0JZG8KLQl7Ci0JCXFfZWxlbWVudCA9IHEtPnRlbXBfdGFpbDsKLQkJcS0+dGVtcF90YWlsID0gcS0+dGVtcF90YWlsLT5wcmV2OwotCi0KLQl9IHdoaWxlKHEtPnRlbXBfdGFpbCAhPSBOVUxMKTsKLQlpZiAocS0+cFBvb2wpCi0JewotCQlmcmVlKHEtPnBQb29sKTsKLQkJcS0+cFBvb2wgPSBOVUxMOwotCX0KLQlpZiAocS0+cERhdGFQb29sKQotCXsKLQkJZnJlZShxLT5wRGF0YVBvb2wpOwotCQlxLT5wRGF0YVBvb2wgPSBOVUxMOwotCX0KLQotCVByaW50RXhpdCgpOwotfQotCi0KLS8qCi0gICAgbGlzdF9yZW1fbmV4dAotICAgIGVsZW1lbnS/obytIGRhdGG4piC76MGmx9G02S4KLSovCi1pbnQgbGlzdF9yZW1fbmV4dChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBjaGFyIHRpbWVvdXRmbGFnLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvKQotewotCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpvbGRfZWxlbWVudDsKLQl1bnNpZ25lZCBsb25nIHByaW87Ci0JaW50IHJjID0gMDsKLQotCVByaW50RW50ZXIoKTsKLQotCWxpc3QtPnJlYWRlcl9jb3VudF8rKzsKLQotCWlmICgobGlzdF9zaXplKGxpc3QpID09IDAgfHwgbGlzdC0+cmVhZGVyX2NvdW50XyA+IDEpICYmIDAgPT0gcmMpCi0JewotCQlpZihUUlVFID09IHRpbWVvdXRmbGFnKQotCQl7Ci0JCQlyYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmxpc3QtPnFfbm90X2VtcHR5XywgJmxpc3QtPnFfbG9ja18sIHRpbWVvKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJjID0gcHRocmVhZF9jb25kX3dhaXQoJmxpc3QtPnFfbm90X2VtcHR5XywgJmxpc3QtPnFfbG9ja18pOwotCQl9Ci0JfQotCi0JbGlzdC0+cmVhZGVyX2NvdW50Xy0tOwotCi0JaWYocmMgIT0gMCkKLQl7Ci0JCVByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaW8gPSBsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAobGlzdCk7Ci0JUHJpbnREZWJ1ZygibGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwIDogcHJpbyA9ICVkXG4iLCBwcmlvKTsKLQotCW1lbWNweShkYXRhLCBsaXN0LT5oZWFkW3ByaW9dLT5kYXRhLCBzaXplKTsKLQlvbGRfZWxlbWVudCA9IGxpc3QtPmhlYWRbcHJpb107Ci0JaWYoTlVMTCA9PSBsaXN0LT5oZWFkW3ByaW9dLT5uZXh0KQotCXsKLQkJbGlzdC0+aGVhZFtwcmlvXSA9IE5VTEw7Ci0JCWxpc3QtPnRhaWxbcHJpb10gPSBOVUxMOwotCX0KLQllbHNlCi0JewotCQlsaXN0LT5oZWFkW3ByaW9dID0gbGlzdC0+aGVhZFtwcmlvXS0+bmV4dDsKLQl9Ci0KLQlxX2luc2VydF90ZW1wX3RhaWxfZWxlbWVudChsaXN0LCBvbGRfZWxlbWVudCk7Ci0JbGlzdC0+Y3Vycl9tc2dfY291bnRfLS07Ci0JbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UobGlzdCwgcHJpbyk7Ci0KLQlpZihsaXN0LT5iaXRtYXBfY291bnRbcHJpb10gPT0gMCkKLQkgICAgbGlzdF9jbGVhcl9iaXRtYXAobGlzdCwgcHJpbyk7Ci0KLQlpZiAobGlzdC0+d3JpdGVyX2NvdW50XyA+IDApCi0JICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxpc3QtPnFfbm90X2Z1bGxfKTsKLQotCVByaW50RXhpdCgpOwotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyB2b2lkICp0aHJlYWRfZnVuY18odm9pZCAqYXJnKQotewotCXN0cnVjdCBITVhfVEFTS19hcmcgKnAgPSAoc3RydWN0IEhNWF9UQVNLX2FyZyAqKWFyZzsKLQlpbnQgcmMgPSAwOwotCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi0JcC0+cGlkID0gZ2V0cGlkKCk7Ci0JcC0+dGlkID0gKGxvbmcgaW50KXN5c2NhbGwoNDIyMik7Ci0jZW5kaWYKLQotCXB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bG9ja18pOwotCi0Jd2hpbGUgKHAtPnN0YXJ0ID09IDAgJiYgMCA9PSByYykgLy93YWl0IHNpZ25hbAotCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZwLT5jb25kXywgJnAtPmxvY2tfKTsKLQotCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5sb2NrXyk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQotCXAtPnRocmVhZF9pZCA9IHB0aHJlYWRfc2VsZigpOwotCVByaW50RGVidWcoIlslc10gdGFzayBzdGFydGVkLi4uXG4iLCBwLT5uYW1lKTsKLSNlbmRpZgotCi0JKCpwLT5zdGFydF9mdW5jXykocC0+YXJnXyk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotICAgIEhNWF9UQVNLX0NyZWF0ZQotICAgIMXCvbrFqbimILv9vLrH0bTZLgotKi8KLWludCBITVhfVEFTS19DcmVhdGUodm9pZCAoKnN0YXJ0X2Z1bmMpKHZvaWQgKiksIHVuc2lnbmVkIGxvbmcgcHJpbyx1bnNpZ25lZCBsb25nIHN0YWNrX3NpemUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyAqdGFza0lkLCBpbnQgSXNKb2luYWJsZSkKLXsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IEhNWF9UQVNLICp0YXNrOwotICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOwotICAgIHN0cnVjdCBzY2hlZF9wYXJhbQlzY2hQYXJhbTsKLSAgICB1bnNpZ25lZCBjaGFyICpwdWNEc3RTdGFja0FkZHIgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgKnB1Y1Rhc2tTdGFjazsKLQotICAgIHJjID0gcHRocmVhZF9hdHRyX2luaXQgKCZ0aHJlYWRfYXR0cik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotCi0JcmMgPSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgKCZ0aHJlYWRfYXR0ciwgSE1YX1RBU0tfUFRIUkVBRF9ERUZBVUxUX1BSSU8pOwotCWlmIChyYykgewotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCXB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaFBhcmFtKTsKLQlzY2hQYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW87Ci0JcmMgPSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSAoJnRocmVhZF9hdHRyLCAmc2NoUGFyYW0pOwotCWlmIChyYykgewotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotICAgIGlmIChzdGFja19zaXplIDwgSE1YX1RBU0tfUFRIUkVBRF9TVEFDS19NSU4pCi0gICAgICAgIHN0YWNrX3NpemUgPSBITVhfVEFTS19QVEhSRUFEX1NUQUNLX01JTjsKLQotCXB1Y1Rhc2tTdGFjayA9IG1hbGxvYyhzdGFja19zaXplK0hNWF9UQVNLX1NUQUNLX09WRVJIRUFEX1NJWkUrSE1YX1RBU0tfR1VBUkRfU0laRSk7Ci0JaWYgKHB1Y1Rhc2tTdGFjayA9PSBOVUxMKQotCQlyZXR1cm4gSE1YX0VSUk9SOwotICAgIG1lbXNldChwdWNUYXNrU3RhY2ssIDB4QTUsIHN0YWNrX3NpemUrSE1YX1RBU0tfU1RBQ0tfT1ZFUkhFQURfU0laRStITVhfVEFTS19HVUFSRF9TSVpFICk7Ci0KLSAgICBQcmludERlYnVnKCIlcyglZCkgOiBwdWNUYXNrU3RhY2sgPSAlcCwgc3RhY2tfc2l6ZT0gJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHB1Y1Rhc2tTdGFjaywgc3RhY2tfc2l6ZSk7Ci0gICAgcmMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2soJnRocmVhZF9hdHRyLCAodm9pZCAqKXB1Y1Rhc2tTdGFjaywgc3RhY2tfc2l6ZSApOwotICAgIGlmIChyYykgewotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLQotICAgIHJjID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCZ0aHJlYWRfYXR0ciwodm9pZCAqKSZwdWNEc3RTdGFja0FkZHIsIChzaXplX3QgKikmc3RhY2tfc2l6ZSApOwotICAgIGlmIChyYykgewotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLSAgICBQcmludERlYnVnKCIlcyglZCkgOiBwdWNEc3RTdGFja0FkZHIgPSAlcCwgc3RhY2tfc2l6ZT0gJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHB1Y0RzdFN0YWNrQWRkciwgc3RhY2tfc2l6ZSk7Ci0KLSAgICBpZiAoSXNKb2luYWJsZSA9PSBUUlVFKQotICAgIHsKLSAgICAgICAgcmMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0gICAgfQotICAgIGVsc2UgaWYoSXNKb2luYWJsZSA9PSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQcmludEVycm9yKCIlcyglcykgOiBJc0pvaW5hYmxlIFBhcmFtZXRlciBFcnJvciEhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChyYykgewotICAgICAgICBQcmludEVycm9yICgiJXMoJWQpIDogRmFpbGVkIHRvIElzSm9pbmFibGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yIChyYykpOwotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLQotICAgIGlmICh0YXNrID0gKHN0cnVjdCBITVhfVEFTSyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9UQVNLKSksIE5VTEwgPT0gdGFzaykgewotICAgICAgICAqdGFza0lkID0gMDsKLSAgICAgICAgZnJlZShwdWNUYXNrU3RhY2spOwotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLQotICAgIHRhc2stPnRhcmdfLnN0YXJ0X2Z1bmNfCT0gc3RhcnRfZnVuYzsKLSAgICB0YXNrLT50YXJnXy5hcmdfIAkJPSBhcmc7Ci0gICAgdGFzay0+dGFyZ18ucHJpb3JpdHlfCT0gcHJpbzsKLSAgICB0YXNrLT50YXJnXy5zdGFja1NpemVfCT0gc3RhY2tfc2l6ZTsKLSAgICB0YXNrLT50YXJnXy5Jc0pvaW5hYmxlCT0gSXNKb2luYWJsZTsKLSAgICB0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXB1Y1Rhc2tTdGFjazsKLSAgICB0YXNrLT50YXJnXy5wdWxTdGFja1N0YXJ0QWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nICopcHVjRHN0U3RhY2tBZGRyOwotCi0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ0YXNrLT50YXJnXy5sb2NrXywgTlVMTCk7Ci0gICAgcHRocmVhZF9jb25kX2luaXQoJnRhc2stPnRhcmdfLmNvbmRfLCBOVUxMKTsKLSAgICB0YXNrLT50YXJnXy5zdGFydCA9IDA7Ci0KLSAgICBzdHJuY3B5KHRhc2stPnRhcmdfLm5hbWUsIG5hbWUsIHNpemVvZih0YXNrLT50YXJnXy5uYW1lKS0xKTsKLQotICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJnRhc2stPnRhc2tfLCAmdGhyZWFkX2F0dHIsIHRocmVhZF9mdW5jXywgJnRhc2stPnRhcmdfKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgZnJlZShwdWNUYXNrU3RhY2spOwotICAgICAgICBmcmVlKHRhc2spOwotICAgICAgICAqdGFza0lkID0gMDsKLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKLSAgICB9Ci0KLSAgICAqdGFza0lkID0gKHVuc2lnbmVkIGxvbmcpdGFzazsKLQotI2lmIGRlZmluZWQoQ09ORklHX1RBU0tfUFJJT1JJVFkpCi0JcHRocmVhZF9zZXRzY2hlZHBhcmFtKHRhc2stPnRhc2tfLCBITVhfVEFTS19QVEhSRUFEX0RFRkFVTFRfUFJJTywgJnNjaFBhcmFtKTsKLSNlbmRpZgotCi0gICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZF9hdHRyKTsKLSAgICBQcmludERlYnVnKCIlcyglZCkgOiBzX3VjVGFza0NvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc191Y1Rhc2tDb3VudCk7Ci0gICAgcmV0dXJuIEhNWF9PSzsKLX0KLQotaW50IEhNWF9UQVNLX1N0YXJ0KHVuc2lnbmVkIGxvbmcgdGFza0lkKQotewotICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7Ci0gICAgUHJpbnRFbnRlcigpOwotCi0gICAgaWYoTlVMTCA9PSB0YXNrKQotICAgIHsKLSAgICAgICAgUHJpbnRFcnJvcigiJXMoJWQpIDogdGFzayBpcyBOVUxMISFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7Ci0gICAgaWYgKHRhc2stPnRhcmdfLnN0YXJ0ID09IDApIHsKLSAgICAJdGFzay0+dGFyZ18uc3RhcnQgPSAxOwotICAgIAlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0YXNrLT50YXJnXy5jb25kXyk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7Ci0gICAgUHJpbnRFeGl0KCk7Ci0gICAgcmV0dXJuIEhNWF9PSzsKLX0KLQotLyoKLSAgICBITVhfVEFTS19TdG9wCi0gICAgVGFza7imILz2x+C1yCDAzMjEv6EgwMwgx9S89rimIMijw+LH2LW1IFNUT1DAuiC1x8H2IL7KtMK02S4KLSAgICC03MH2IGNvdW50uLggMMC4t84guLi157TZLgotKi8KLWludCBITVhfVEFTS19TdG9wKHVuc2lnbmVkIGxvbmcgdGFza0lkKQotewotICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7Ci0KLSAgICBQcmludEVudGVyKCk7Ci0KLSAgICBpZiAodGFzayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBITVhfT0s7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7Ci0gICAgaWYgKHRhc2stPnRhcmdfLnN0YXJ0ICE9IDApCi0gICAgICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwotCi0gICAgcmV0dXJuIEhNWF9PSzsKLX0KLQotLyoKLSAgICBzbGVlcAotICAgIMXCvbrFqbimIMDhwOe/7rTZLgotKi8KLWludCBITVhfU2xlZXAodW5zaWduZWQgbG9uZyB1bHRpbWUpCi17Ci0Jc3RydWN0IHRpbWVzcGVjIGRlbGF5OwotCXN0cnVjdCB0aW1lc3BlYyByZW07Ci0JaW50IHJjOwotCi0JaWYgKHVsdGltZSAhPSAwKQotCXsKLQkJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwotCX0KLQlkZWxheS50dl9zZWMgPSB1bHRpbWUgLyAxMDAwOwotCWRlbGF5LnR2X25zZWMgPSAodWx0aW1lICUgMTAwMCkgKiAxMDAwMDAwOwotCi0JZm9yICg7OykgewotCQlyYyA9IG5hbm9zbGVlcCgmZGVsYXksICZyZW0pOwotCQlpZiAoMCAhPSByYykgewotCQkJaWYgKEVJTlRSID09IGVycm5vKSB7Ci0JCQkJZGVsYXkgPSByZW07Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXR1cm4gSE1YX0VSUk9SOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBITVhfT0s7Ci19Ci0KLS8qCi0gICAgSE1YX1RBU0tfRGVzdHJveQotICAgIMXCvbrFqbimILzSuOrH0bTZLgotKi8KLWludCBITVhfVEFTS19EZXN0cm95KHVuc2lnbmVkIGxvbmcgdGFza0lkKQotewotICAgIGludCByYzsKLSAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOwotCi0gICAgaWYoIHRhc2tJZCA9PSAodW5zaWduZWQgbG9uZylOVUxMICkKLSAgICB7Ci0gICAgICAgIFByaW50RGVidWcoIiVzKCVkKSB0YXNrSWQgPT0gTlVMTFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwotCQlpZiAodGFzay0+dGFyZ18uc3RhcnQgPT0gMSkKLQkJewotCQkJdGFzay0+dGFyZ18uc3RhcnQgPSAwOwotCQl9Ci0JCXJjID0gcHRocmVhZF9jYW5jZWwodGFzay0+dGFza18pOwotCQlpZiAocmMpCi0JCXsKLQkJCVByaW50RXJyb3IoIltITVhfVEFTS19EZXN0cm95XSB3YXJuaW5nIDogdGhlcmUgaXMgbm8gdGhyZWFkIGluIHB0aHJlYWQgdGFza0lkKCUwOFgpIHB0aHJlYWRJZCglMDhYKVxuIiwgdGFza0lkLCB0YXNrLT50YXNrXyk7Ci0JCX0KLQkJSE1YX1NsZWVwKDEpOwotI2lmIGRlZmluZWQoQ09ORklHX1RIUkVBRF9KT0lOX1RFTVBPUkFSWSkKLSNlbHNlCi0JCWlmICh0YXNrLT50YXJnXy5Jc0pvaW5hYmxlKQotI2VuZGlmCi0JCQlwdGhyZWFkX2pvaW4odGFzay0+dGFza18sIE5VTEwpOwotCi0JCWZyZWUodGFzay0+dGFyZ18ucHVjVGFza1N0YWNrKTsKLQkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsKLSAgICB9Ci0KLSAgICBmcmVlKHRhc2spOwotCi0gICAgcmV0dXJuIEhNWF9PSzsKLX0KLQotLyoKLSAgICBITVhfVEFTS19TZXRDdXJyZW50UHJpb3JpdHkKLSAgICC79bfOv+4gv+y8sbz4wKe4piC8vMbDx9G02S4KLSovCi1pbnQgSE1YX1RBU0tfU2V0Q3VycmVudFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgdGFza0lkLCB1bnNpZ25lZCBsb25nIG5ld3ByaW9yaXR5KQotewotCWludCByYzsKLQlpbnQgcG9saWN5OwotCXN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7Ci0Jc3RydWN0IHNjaGVkX3BhcmFtCXNjaFBhcmFtOwotCi0JaWYgKHRhc2sgPT0gTlVMTCkKLQl7Ci0JCXJldHVybiBITVhfRVJST1I7Ci0JfQotCi0JcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGFzay0+dGFza18sICZwb2xpY3ksICZzY2hQYXJhbSk7Ci0JaWYgKHNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5ID09IChpbnQpbmV3cHJpb3JpdHkpCi0JewotCQlyZXR1cm4gSE1YX09LOwotCX0KLQotCXNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5IAk9IG5ld3ByaW9yaXR5OwotCi0JcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7Ci0JcmMgPSBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIHBvbGljeSwgJnNjaFBhcmFtKTsKLQlwdGhyZWFkX211dGV4X3VubG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwotCi0JaWYgKHJjKSB7Ci0JCXJldHVybiBITVhfRVJST1I7Ci0JfQotCi0JcmV0dXJuIEhNWF9PSzsKLX0KLQotCi0KLS8qCi0gICAgbGlzdF9pbml0Ci0gICAgSE1YX01TR19xdWV1ZSCxuMG2w7y4piDDyrHiyK0gx9G02S4KLSovCi12b2lkIGxpc3RfaW5pdChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdW5zaWduZWQgbG9uZyB1bFNpemUsIHVuc2lnbmVkIGxvbmcgdWxDb3VudCwgdW5zaWduZWQgY2hhciB1Y1N1c3BlbmRUeXBlKQotewotICAgIGludCBpOwotCi0gICAgbGlzdC0+Y3Vycl9tc2dfY291bnRfID0gMDsKLSAgICBsaXN0LT5tc2dfc2l6ZV8gPSB1bFNpemU7Ci0gICAgbGlzdC0+bXNnX2NvdW50XyA9IHVsQ291bnQ7Ci0gICAgbGlzdC0+d3JpdGVyX2NvdW50XyA9IDA7Ci0gICAgbGlzdC0+cmVhZGVyX2NvdW50XyA9IDA7Ci0gICAgbGlzdC0+c3VzcGVuZF90eXBlXyA9IHVjU3VzcGVuZFR5cGU7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZsaXN0LT5xX2xvY2tfLCBOVUxMKTsKLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbGlzdC0+cV9ub3RfZW1wdHlfLCBOVUxMKTsKLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbGlzdC0+cV9ub3RfZnVsbF8sIE5VTEwpOwotCi0gICAgbGlzdC0+dGVtcF9oZWFkID0gTlVMTDsKLSAgICBsaXN0LT50ZW1wX3RhaWwgPSBOVUxMOwotCi0gICAgZm9yKGk9MDsgaTxNU0dfUFJJT1JJVFlfTUFYOyBpKyspCi0gICAgewotICAgICAgICBsaXN0LT5oZWFkW2ldID0gTlVMTDsKLSAgICAgICAgbGlzdC0+dGFpbFtpXSA9IE5VTEw7Ci0gICAgICAgIGxpc3QtPmJpdG1hcF9jb3VudFtpXSA9IDA7Ci0gICAgICAgIGxpc3QtPmJpdG1hcFtpXSA9IDA7Ci0gICAgfQotCi0jaWZkZWYgSE1YX01TR19ERUJVRwotICAgIGxpc3QtPnNlbmRUaWNrID0gMDsKLSAgICBsaXN0LT5yZWNlaXZlVGljayA9IDA7Ci0gICAgbGlzdC0+bGFzdFNlbmRUaWNrID0gMDsKLSAgICBsaXN0LT5sYXN0UmVjZWl2ZVRpY2sgPSAwOwotI2VuZGlmCi0gICAgcmV0dXJuOwotfQotCi0KLQotLyoKLSAgICBsaXN0X2Rlc3Ryb3kKLSAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimILzSuOq9w8WytNkuCi0qLwotdm9pZCBsaXN0X2Rlc3Ryb3koc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QpCi17Ci0Jdm9pZCAgICAgICAgICAgICAgICpkYXRhOwotCi0JZGF0YSA9IChjaGFyICopbWFsbG9jKGxpc3QtPm1zZ19zaXplXyk7Ci0KLQl3aGlsZSAobGlzdF9zaXplKGxpc3QpID4gMCkKLQl7Ci0JCWlmICggbGlzdF9yZW1fbmV4dChsaXN0LCAodm9pZCAqKWRhdGEsIGxpc3QtPm1zZ19zaXplXywgRkFMU0UsIEZBTFNFKSAhPSAwICkKLQkJewotCQkJUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0IEVycm9yISFcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLQotCWZyZWUoZGF0YSk7Ci0JcmV0dXJuOwotfQotCi0KLQotLyoKLSAgICBsaXN0X2luc19uZXh0Ci0gICAgZWxlbWVudL+hIGRhdGG4piDD37Chx9G02S4KLSovCi1pbnQgbGlzdF9pbnNfbmV4dChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdW5zaWduZWQgbG9uZyBwcmlvLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgdGltZW91dGZsYWcsIHN0cnVjdCB0aW1lc3BlYyAqdGltZW8pCi17Ci0Jc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKm5ld19lbGVtZW50OwotCWludCByYyA9IDA7Ci0KLQlQcmludEVudGVyKCk7Ci0KLQlsaXN0LT53cml0ZXJfY291bnRfKys7Ci0KLQl3aGlsZSAobGlzdC0+bXNnX2NvdW50XyA9PSBsaXN0LT5jdXJyX21zZ19jb3VudF8gJiYgMCA9PSByYykKLQl7Ci0JICAgIGlmKFRSVUUgPT0gdGltZW91dGZsYWcpCi0JICAgIHsKLQkgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfLCB0aW1lbyk7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgICByYyA9IHB0aHJlYWRfY29uZF93YWl0KCZsaXN0LT5xX25vdF9mdWxsXywgJmxpc3QtPnFfbG9ja18pOwotCSAgICB9Ci0JfQotCi0JbGlzdC0+d3JpdGVyX2NvdW50Xy0tOwotCi0JaWYocmMgIT0gMCkKLQl7Ci0JICAgIFByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKLQkgICAgcmV0dXJuIHJjOwotCX0KLQotCXFfcmVtb3ZlX3RlbXBfdGFpbF9lbGVtZW50KGxpc3QsICZuZXdfZWxlbWVudCk7Ci0KLQltZW1jcHkobmV3X2VsZW1lbnQtPmRhdGEsIGRhdGEsIHNpemUpOwotCi0JaWYobGlzdC0+dGFpbFtwcmlvXSA9PSBOVUxMKQotCXsKLQkJbGlzdC0+aGVhZFtwcmlvXSA9IG5ld19lbGVtZW50OwotCQluZXdfZWxlbWVudC0+bmV4dCA9IE5VTEw7Ci0JCW5ld19lbGVtZW50LT5wcmV2ID0gTlVMTDsKLQkJbGlzdC0+dGFpbFtwcmlvXSA9IG5ld19lbGVtZW50OwotCX0KLQllbHNlCi0JewotCQlsaXN0LT50YWlsW3ByaW9dLT5uZXh0ID0gbmV3X2VsZW1lbnQ7Ci0JCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsKLQkJbmV3X2VsZW1lbnQtPnByZXYgPSBsaXN0LT50YWlsW3ByaW9dOwotCQlsaXN0LT50YWlsW3ByaW9dID0gbmV3X2VsZW1lbnQ7Ci0JfQotCi0JbGlzdC0+Y3Vycl9tc2dfY291bnRfKys7Ci0JbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2UobGlzdCwgcHJpbyk7Ci0JbGlzdF9zZXRfYml0bWFwKGxpc3QsIHByaW8pOwotCi0JaWYgKGxpc3QtPnJlYWRlcl9jb3VudF8gPiAwKQotCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZsaXN0LT5xX25vdF9lbXB0eV8pOwotCi0JUHJpbnRFeGl0KCk7Ci0JcmV0dXJuIEhNWF9PSzsKLX0KLQotCi0KLQotLyoKLSAgICBITVhfTVNHX0luaXQKLSAgICC43ry8wfYgxaW4piDDyrHiyK0gx9G02S4KLSovCi1pbnQgSE1YX01TR19Jbml0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKQotCVRBSUxRX0lOSVQoJm1zZ19xX2xpc3RfaGVhZCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gSE1YX09LOwotfQotCi0KLS8qCi0gICAgSE1YX01TR19DcmVhdGUKLSAgICC43ry8wfYgxaW4piC7/by6x9G02S4KLSovCi1pbnQgSE1YX01TR19DcmVhdGUodW5zaWduZWQgbG9uZyBxX2NvdW50LCB1bnNpZ25lZCBsb25nIG1zZ19zaXplLAotCWNvbnN0IGNoYXIgKnFfbmFtZSwgdW5zaWduZWQgbG9uZyAqcV9pZCwgSE1YX1NVU1BFTkRUWVBFIHN1c3BlbmRUeXBlKQotewotICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7Ci0gICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKnFfZWxlbWVudDsKLSAgICB1bnNpZ25lZCBsb25nCQkJCQlpOwotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnRfcG9vbDsKLQl1bnNpZ25lZCBjaGFyCQkJCQkqZGF0YV9wb29sOwotCUhBUFBZKHFfbmFtZSk7Ci0KLSAgICBQcmludEVudGVyKCk7Ci0KLSAgICBpZihzdXNwZW5kVHlwZSA+PSBITVhfU1VTUEVORFRZUEVfTUFYKQotICAgIHsKLSAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogdWxTdXNwZW5kVHlwZSAlZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIHN1c3BlbmRUeXBlKTsKLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZigocSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfcXVldWUpKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IG1hbGxvYyBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotCi0JbWVtc2V0KHEsIDAsIHNpemVvZihzdHJ1Y3QgSE1YX01TR19xdWV1ZSkpOwotCi0gICAgbGlzdF9pbml0KHEsIG1zZ19zaXplLCBxX2NvdW50LCBzdXNwZW5kVHlwZSk7Ci0JcV9lbGVtZW50X3Bvb2wgPSAoc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfZWxlbWVudCkqcV9jb3VudCk7Ci0JZGF0YV9wb29sID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MobXNnX3NpemUqcV9jb3VudCk7Ci0gICAgZm9yKGk9MDsgaTxxX2NvdW50OyBpKyspCi0gICAgewotCQlxX2VsZW1lbnQgPSAmcV9lbGVtZW50X3Bvb2xbaV07Ci0JCXFfZWxlbWVudC0+ZGF0YSA9ICZkYXRhX3Bvb2xbaSptc2dfc2l6ZV07Ci0gICAgICAgIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHEsIHFfZWxlbWVudCk7Ci0gICAgfQotCXEtPnBEYXRhUG9vbCA9IGRhdGFfcG9vbDsKLQlxLT5wUG9vbCA9IHFfZWxlbWVudF9wb29sOwotCi0gICAgKnFfaWQgPSAodW5zaWduZWQgbG9uZylxOwotCi0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKQotCVRBSUxRX0lOU0VSVF9UQUlMKCZtc2dfcV9saXN0X2hlYWQsIHEsIGVudHJpZXMpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi0JaWYgKHFfbmFtZSkKLQkJc3RybmNweShxLT5uYW1lLCBxX25hbWUsIHNpemVvZihxLT5uYW1lKS0xKTsKLQllbHNlCi0JCXEtPm5hbWVbMF0gPSAwOwotI2VuZGlmCi0JUHJpbnRFeGl0KCk7Ci0KLSAgICByZXR1cm4gSE1YX09LOwotfQotCi0KLS8qCi0gICAgSE1YX01TR19EZXN0cm95Ci0gICAguN68vMH2xaW4piC80rjqvcPFsrTZLgotKi8KLWludCBITVhfTVNHX0Rlc3Ryb3kodW5zaWduZWQgbG9uZyBxX2lkKQotewotCXN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOwotCi0JUHJpbnRFbnRlcigpOwotCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7Ci0KLQlpZihxID09IE5VTEwpCi0JewotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9mdWxsXyk7Ci0JcHRocmVhZF9jb25kX2Rlc3Ryb3koJnEtPnFfbm90X2VtcHR5Xyk7Ci0JcHRocmVhZF9tdXRleF9kZXN0cm95KCZxLT5xX2xvY2tfKTsKLQotCWxpc3RfZGVzdHJveShxKTsKLQlxX2Rlc3RvcnlfdGVtcF90YWlsKHEpOwotCi0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKQotCVRBSUxRX1JFTU9WRSgmbXNnX3FfbGlzdF9oZWFkLCBxLCBlbnRyaWVzKTsKLSNlbmRpZgotCi0JaWYocSAhPSBOVUxMKQotCXsKLQkJZnJlZShxKTsKLQl9Ci0KLQlQcmludEV4aXQoKTsKLQotCXJldHVybiBITVhfT0s7Ci19Ci0KLWludCBITVhfTVNHX0NsZWFyKHVuc2lnbmVkIGxvbmcgcV9pZCkKLXsKLQlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAJCQkgICpxOwotCWludCByYyA9IEhNWF9PSzsKLQkvLwkgIHN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsKLQlsb25nIGxvbmcgZXhwX25zZWM7Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvLCBjdXJfdGltZTsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jdm9pZAkJCSpwQnVmOwotCi0KLQlQcmludEVudGVyKCk7Ci0KLQlxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKLQotCXNpemUgPSBxLT5tc2dfc2l6ZV87Ci0JcEJ1ZiA9IG1hbGxvYyhzaXplKTsKLQlpZiAocEJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gSE1YX0VSUk9SOwotCi0JKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsKLQlkbwotCXsKLQotCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOwotCQlleHBfbnNlYyA9IChsb25nIGxvbmcpY3VyX3RpbWUudHZfc2VjICogKGxvbmcgbG9uZykxMDAwICogKGxvbmcgbG9uZykxMDAwICogKGxvbmcgbG9uZykxMDAwICsgKGxvbmcgbG9uZyljdXJfdGltZS50dl9uc2VjOwotCQl0aW1lby50dl9zZWMgPSBleHBfbnNlYyAvICgxMDAwICogMTAwMCAqIDEwMDApOwotCQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKLQotCQlyYyA9IGxpc3RfcmVtX25leHQocSwgcEJ1Ziwgc2l6ZSwgVFJVRSwgJnRpbWVvKTsKLQkJaWYoSE1YX09LICE9IHJjKQotCQl7Ci0JCQlpZihFVElNRURPVVQgPT0gcmMpCi0JCQl7Ci0JCQkJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCQkJCWZyZWUocEJ1Zik7Ci0JCQkJcmV0dXJuIEhNWF9PSzsKLQkJCX0KLQkJfQotCX13aGlsZSAoMSk7Ci0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKLQlwcmludF9saXN0KHEpOwotI2VuZGlmCi0KLQkodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7Ci0KLQlmcmVlKHBCdWYpOwotCVByaW50RXhpdCgpOwotCXJldHVybiBITVhfT0s7Ci19Ci0KLQotLyoKLSAgICBITVhfTVNHX1NlbmQKLSAgICC43ry8wfa4piC6uLO9tNkuCi0qLwotaW50IEhNWF9NU0dfU2VuZCh1bnNpZ25lZCBsb25nIHFfaWQsIGNvbnN0IHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOwotICAgIGludCByYyA9IEhNWF9PSzsKLSAgICB1bnNpZ25lZCBsb25nIHByaW87Ci0KLSAgICBQcmludEVudGVyKCk7Ci0KLSAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKLQotICAgIGlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pCi0gICAgewotICAgICAgICBQcmludEVycm9yKCIlc1slZF0gOiBzaXplICVsZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotCi0JSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwotCi0JcmMgPSBQX01TR19DaGVjayhxLCBxX2lkKTsKLQlpZiAoSE1YX09LICE9IHJjKQotCXsKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7Ci0jZW5kaWYKLQkJcmV0dXJuIHJjOwotCX0KLQotICAgIGlmKEhNWF9TVVNQRU5EVFlQRV9QUklPUklUWSA9PSBxLT5zdXNwZW5kX3R5cGVfKQotICAgIHsKLSAgICAgICAgcmMgPSBsaXN0X2ZpbmRfbXNnX3FfcHJpb3JpdHlfZnJvbV90YXNrX3ByaW9yaXR5KCZwcmlvKTsKLSAgICAgICAgaWYocmMgIT0gSE1YX09LKQotICAgICAgICB7Ci0JCQlwcmlvID0gTVNHX1BSSU9SSVRZMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsKLSAgICB9Ci0KLSAgICAodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOwotCi0gICAgcmMgPSBsaXN0X2luc19uZXh0KHEsIHByaW8sIG1zZywgc2l6ZSwgRkFMU0UsIE5VTEwpOwotCi0gICAgaWYoSE1YX09LICE9IHJjKQotICAgIHsKLSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSNpZmRlZiBERUJVR19NU0dfTElTVF9QUklOVAotICAgIHByaW50X2xpc3QocSk7Ci0jZW5kaWYKLQotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKLQotI2lmZGVmIEhNWF9NU0dfREVCVUcKLSAgICBxLT5sYXN0U2VuZFRpY2sgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7Ci0jZW5kaWYKLQotICAgIFByaW50RXhpdCgpOwotCi0gICAgcmV0dXJuIEhNWF9PSzsKLX0KLQotCi0KLS8qCi0gICAgSE1YX01TR19TZW5kVGltZW91dAotICAgILjevLzB9rimIFRpbWVvdXSzu7+hILq4s7202S4KLSovCi1pbnQgSE1YX01TR19TZW5kVGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIGNvbnN0IHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7Ci0JaW50IHJjID0gSE1YX09LOwotCXVuc2lnbmVkIGxvbmcgcHJpbyA9IDA7Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvOwotCXN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsKLQlsb25nIGxvbmcgZXhwX25zZWM7Ci0KLQlQcmludEVudGVyKCk7Ci0KLQlpZiAodGltZW91dCAhPSAwKQotCXsKLS8vCQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7Ci0JfQotCWlmICh0aW1lb3V0ID09IDB4RkZGRkZGRkYpCi0JewotCQlyZXR1cm4gSE1YX01TR19TZW5kKHFfaWQsIG1zZywgc2l6ZSk7Ci0JfQotCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7Ci0KLQlpZihzaXplID4gcS0+bXNnX3NpemVfKQotCXsKLQkJUHJpbnRFcnJvcigiJXNbJWRdIDogc2l6ZSAlbGQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNpemUpOwotCQlyZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7Ci0JaWYgKEhNWF9PSyAhPSByYykKLQl7Ci0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi0JCVByaW50RXJyb3IoIiVzKCVkKSA6IFBfTVNHX0NoZWNrIDogSE1YX01TR19GVUxMISEgcXVldWUgbmFtZSA6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHEtPm5hbWUpOwotI2VuZGlmCi0JCXJldHVybiByYzsKLQl9Ci0KLQlpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykKLQl7Ci0JCXJjID0gbGlzdF9maW5kX21zZ19xX3ByaW9yaXR5X2Zyb21fdGFza19wcmlvcml0eSgmcHJpbyk7Ci0JCWlmKHJjICE9IEhNWF9PSykKLQkJewotCQkJcHJpbyA9IE1TR19QUklPUklUWTA7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcHJpbyA9IE1TR19QUklPUklUWTA7Ci0JfQotCi0JY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsKLQlleHBfbnNlYyA9IChsb25nIGxvbmcpY3VyX3RpbWUudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgY3VyX3RpbWUudHZfbnNlYzsKLQlpZiAodGltZW91dCAhPSAwKQotCQlleHBfbnNlYyArPSAodGltZW91dCAqIDEwMDAgLSA5OTkpICogMTAwMDsKLQl0aW1lby50dl9zZWMgPSBleHBfbnNlYyAvICgxMDAwICogMTAwMCAqIDEwMDApOwotCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOwotCi0JKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsKLQotCXJjID0gbGlzdF9pbnNfbmV4dChxLCBwcmlvLCBtc2csIHNpemUsIFRSVUUsICZ0aW1lbyk7Ci0JaWYoSE1YX09LICE9IHJjKQotCXsKLQkgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCi0JICAgIGlmKEVUSU1FRE9VVCA9PSByYykKLQkgICAgewotCSAgICAgICAgUHJpbnREZWJ1ZygiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEhNWF9USU1FT1VUISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotCSAgICAgICAgcmV0dXJuIEhNWF9USU1FT1VUOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotCSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKLQkgICAgfQotCX0KLQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UCi0JcHJpbnRfbGlzdChxKTsKLSNlbmRpZgotCi0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCi0JUHJpbnRFeGl0KCk7Ci0KLQlyZXR1cm4gSE1YX09LOwotfQotCi0KLS8qCi0gICAgSE1YX01TR19TZW5kVXJnZW50Ci0gICAgseSx3iC43ry8wfa4piC6uLO9tNkuCi0qLwotaW50IEhNWF9NU0dfU2VuZFVyZ2VudCh1bnNpZ25lZCBsb25nIHFfaWQsIGNvbnN0IHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOwotICAgIGludCByYyA9IEhNWF9PSzsKLSAgICB1bnNpZ25lZCBsb25nIHByaW87Ci0KLSAgICBQcmludEVudGVyKCk7Ci0KLSAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKLQotICAgIGlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pCi0gICAgewotICAgICAgICBQcmludEVycm9yKCIlc1slZF0gOiBzaXplICVsZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBITVhfRVJST1I7Ci0gICAgfQotCi0JcmMgPSBQX01TR19DaGVjayhxLCBxX2lkKTsKLQlpZiAoSE1YX09LICE9IHJjKQotCXsKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7Ci0jZW5kaWYKLQkJcmV0dXJuIHJjOwotCX0KLQotICAgIGlmKEhNWF9TVVNQRU5EVFlQRV9QUklPUklUWSA9PSBxLT5zdXNwZW5kX3R5cGVfKQotICAgIHsKLSAgICAgICAgcHJpbyA9IE1TR19QUklPUklUWV9NQVgtMTsgLy+wocDlILP0wLogv+y8sbz4wKe3ziC6uLO9tNkuCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW8gPSBNU0dfUFJJT1JJVFkwOwotICAgIH0KLQotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7Ci0KLSAgICByYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBGQUxTRSwgRkFMU0UpOwotICAgIGlmKEhNWF9PSyAhPSByYykKLSAgICB7Ci0gICAgICAgIFByaW50RXJyb3IoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKLSAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKLSAgICBwcmludF9saXN0KHEpOwotI2VuZGlmCi0KLSAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7Ci0KLSNpZmRlZiBITVhfTVNHX0RFQlVHCi0gICAgcS0+bGFzdFNlbmRUaWNrID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOwotI2VuZGlmCi0KLSAgICBQcmludEV4aXQoKTsKLQotICAgIHJldHVybiBITVhfT0s7Ci19Ci0KLQotLyoKLSAgICBITVhfTVNHX1NlbmRVcmdlbnRUaW1lb3V0Ci0gICAgseSx3iC43ry8wfa4piBUaW1lb3V0ILO7v6EgurizvbTZLgotKi8KLWludCBITVhfTVNHX1NlbmRVcmdlbnRUaW1lb3V0KHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsKLQlpbnQgcmMgPSBITVhfT0s7Ci0JdW5zaWduZWQgbG9uZyBwcmlvID0gMDsKLQlzdHJ1Y3QgdGltZXNwZWMgdGltZW87Ci0Jc3RydWN0IHRpbWVzcGVjIGN1cl90aW1lOwotCWxvbmcgbG9uZyBleHBfbnNlYzsKLQotCVByaW50RW50ZXIoKTsKLQotCWlmICh0aW1lb3V0ID09IDB4RkZGRkZGRkYpCi0JewotCQlyZXR1cm4gSE1YX01TR19TZW5kVXJnZW50KHFfaWQsIG1zZywgc2l6ZSk7Ci0JfQotCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7Ci0KLQlpZihzaXplID4gcS0+bXNnX3NpemVfKQotCXsKLQkgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogc2l6ZSAlbGQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNpemUpOwotCSAgICByZXR1cm4gSE1YX0VSUk9SOwotCX0KLQotCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7Ci0JaWYgKEhNWF9PSyAhPSByYykKLQl7Ci0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi0JCVByaW50RXJyb3IoIiVzKCVkKSA6IFBfTVNHX0NoZWNrIDogSE1YX01TR19GVUxMISEgcXVldWUgbmFtZSglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7Ci0jZW5kaWYKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmKEhNWF9TVVNQRU5EVFlQRV9QUklPUklUWSA9PSBxLT5zdXNwZW5kX3R5cGVfKQotCXsKLQkgICAgcHJpbyA9IE1TR19QUklPUklUWV9NQVgtMTsgLy+wocDlILP0wLogv+y8sbz4wKe3ziC6uLO9tNkuCi0JfQotCWVsc2UKLQl7Ci0JICAgIHByaW8gPSBNU0dfUFJJT1JJVFkwOwotCX0KLQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZjdXJfdGltZSk7Ci0JZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIGN1cl90aW1lLnR2X25zZWM7Ci0JaWYgKHRpbWVvdXQgIT0gMCkKLQkJZXhwX25zZWMgKz0gKHRpbWVvdXQgKiAxMDAwIC0gOTk5KSAqIDEwMDA7Ci0JdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKLQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKLQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7Ci0KLQlyYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBUUlVFLCAmdGltZW8pOwotCi0JaWYoSE1YX09LICE9IHJjKQotCXsKLQkgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCi0JICAgIGlmKEVUSU1FRE9VVCA9PSByYykKLQkgICAgewotCSAgICAgICAgUHJpbnREZWJ1ZygiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEhNWF9USU1FT1VUISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotCSAgICAgICAgcmV0dXJuIEhNWF9USU1FT1VUOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwotCSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKLQkgICAgfQotCX0KLQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UCi0JcHJpbnRfbGlzdChxKTsKLSNlbmRpZgotCi0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCi0JUHJpbnRFeGl0KCk7Ci0KLQlyZXR1cm4gSE1YX09LOwotfQotCi0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpCi0jZGVmaW5lIEhNWF9NU0dfQ1JJVElDQUxfREVMQVlfVElDSwkyMAotI2RlZmluZSBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLCTIwMAotI2VuZGlmCi0vKgotICAgIEhNWF9NU0dfUmVjZWl2ZQotICAgILjevLzB9rimILnetMK02S4KLSovCi1pbnQgSE1YX01TR19SZWNlaXZlKHVuc2lnbmVkIGxvbmcgcV9pZCwgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgc3RydWN0IEhNWF9NU0dfcXVldWUgICAgICAgICAgICAgICAqcTsKLS8vICB1bnNpZ25lZCBsb25nIHByaW87Ci0gICAgaW50IHJjID0gSE1YX09LOwotCi0gICAgUHJpbnRFbnRlcigpOwotCi0JSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwotCi0gICAgcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7Ci0KLSAgICBpZihzaXplID4gcS0+bXNnX3NpemVfKQotICAgIHsKLSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBzaXplICVsZCBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHNpemUpOwotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgIH0KLQotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7Ci0KLSNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykKLQlxLT5yZWNlaXZlVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsKLQlpZiAocS0+bGFzdFJlY2VpdmVUaWNrICE9IDAgJiYgKHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrID4gSE1YX01TR19OT1JNQUxfREVMQVlfVElDSykpCi0JewotCQlpZiAoKHEtPnJlY2VpdmVUaWNrIC0gdGlja0ZvclZrRGVidWcpID4gSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLKQotCQl7Ci0JCQlQcmludEVycm9yKCJITVhfTVNHX1JlY2VpdmUgOiBJdCBoYXMgZXhjdXRlZCB0b28gbG9uZyB0aW1lICglZCkgcXVldWUoJXMpXG4iLCBxLT5yZWNlaXZlVGljayAtIHEtPmxhc3RSZWNlaXZlVGljaywgcS0+bmFtZSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLSAgICByYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7Ci0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpCi0JcS0+bGFzdFJlY2VpdmVUaWNrID0gdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7Ci0jZW5kaWYKLSAgICBpZihITVhfT0sgIT0gcmMpCi0gICAgewotICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7Ci0gICAgICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UCi0gICAgcHJpbnRfbGlzdChxKTsKLSNlbmRpZgotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKLQotICAgIFByaW50RXhpdCgpOwotICAgIHJldHVybiBITVhfT0s7Ci19Ci0KLS8qCi0gICAgSE1YX01TR19SZWNlaXZlVGltZW91dAotICAgILjevLzB9rimIFRpbWVvdXSzu7+hILnetMK02S4KLSovCi1pbnQgSE1YX01TR19SZWNlaXZlVGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IEhNWF9NU0dfcXVldWUgICAgICAgICAgICAgICAqcTsKLQlpbnQgcmMgPSBITVhfT0s7Ci0JLy8gICAgc3RydWN0IHRpbWVzcGVjIGN1cl90aW1lOwotCWxvbmcgbG9uZyBleHBfbnNlYzsKLQlzdHJ1Y3QgdGltZXNwZWMgdGltZW8sIGN1cl90aW1lOwotCi0JUHJpbnRFbnRlcigpOwotCWlmICh0aW1lb3V0ICE9IDApCi0JewotCQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7Ci0JfQotCi0JaWYgKHRpbWVvdXQgPT0gMHhGRkZGRkZGRikKLQl7Ci0JCXJldHVybiBITVhfTVNHX1JlY2VpdmUocV9pZCwgbXNnLCBzaXplKTsKLQl9Ci0KLQlxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKLQotCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pCi0JewotCQlQcmludEVycm9yKCIlcyA6IHNpemUgJWxkIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgc2l6ZSk7Ci0JCXJldHVybiBITVhfRVJST1I7Ci0JfQotCi0JY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsKLQlleHBfbnNlYyA9IChsb25nIGxvbmcpY3VyX3RpbWUudHZfc2VjICogKGxvbmcgbG9uZykxMDAwICogKGxvbmcgbG9uZykxMDAwICogKGxvbmcgbG9uZykxMDAwICsgKGxvbmcgbG9uZyljdXJfdGltZS50dl9uc2VjOwotCWlmICh0aW1lb3V0ICE9IDApCi0JCWV4cF9uc2VjICs9IChsb25nIGxvbmcpKHRpbWVvdXQgKiAobG9uZyBsb25nKTEwMDAgLSA5OTkpICogKGxvbmcgbG9uZykxMDAwOwotCXRpbWVvLnR2X3NlYyA9IGV4cF9uc2VjIC8gKDEwMDAgKiAxMDAwICogMTAwMCk7Ci0JdGltZW8udHZfbnNlYyA9IGV4cF9uc2VjICUgKDEwMDAgKiAxMDAwICogMTAwMCk7Ci0KLQkodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOwotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQotCXEtPnJlY2VpdmVUaWNrID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOwotCWlmIChxLT5sYXN0UmVjZWl2ZVRpY2sgIT0gMCAmJiAocS0+cmVjZWl2ZVRpY2sgLSBxLT5sYXN0UmVjZWl2ZVRpY2sgPiBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLKSkKLQl7Ci0JCWlmICgocS0+cmVjZWl2ZVRpY2sgLSB0aWNrRm9yVmtEZWJ1ZykgPiBITVhfTVNHX0NSSVRJQ0FMX0RFTEFZX1RJQ0spCi0JCXsKLQkJCVByaW50RXJyb3IoIkhNWF9NU0dfUmVjZWl2ZVRpbWVvdXQgOiBJdCBoYXMgZXhjdXRlZCB0b28gbG9uZyB0aW1lICglZCkgcXVldWUoJXMpXG4iLCBxLT5yZWNlaXZlVGljayAtIHEtPmxhc3RSZWNlaXZlVGljaywgcS0+bmFtZSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJjID0gbGlzdF9yZW1fbmV4dChxLCBtc2csIHNpemUsIFRSVUUsICZ0aW1lbyk7Ci0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpCi0JcS0+bGFzdFJlY2VpdmVUaWNrID0gdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7Ci0jZW5kaWYKLQlpZihITVhfT0sgIT0gcmMpCi0JewotICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7Ci0KLSAgICAgICAgaWYoRVRJTUVET1VUID09IHJjKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmludERlYnVnKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gSE1YX1RJTUVPVVQhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7Ci0gICAgICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7Ci0gICAgICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwotICAgICAgICB9Ci0JfQotCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKLQlwcmludF9saXN0KHEpOwotI2VuZGlmCi0KLQkodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7Ci0KLQlQcmludEV4aXQoKTsKLQlyZXR1cm4gSE1YX09LOwotfQotCi1pbnQJSE1YX01TR19HZXRNZXNzYWdlQ291bnQodW5zaWduZWQgbG9uZyBxX2lkLCB1bnNpZ25lZCBsb25nICpwdWxNc2dDb3VudCwgdW5zaWduZWQgbG9uZyAqcHVsTWF4TXNnQ291bnQpCi17Ci0gICAgc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7Ci0KLSAgICBQcmludEVudGVyKCk7Ci0KLSAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKLQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7Ci0JKnB1bE1zZ0NvdW50ID0gcS0+Y3Vycl9tc2dfY291bnRfOwotCSpwdWxNYXhNc2dDb3VudCA9IHEtPm1zZ19jb3VudF87Ci0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwotCi0JUHJpbnRFeGl0KCk7Ci0JcmV0dXJuIEhNWF9PSzsKLX0KLQotc3RhdGljIGludCBQX01TR19DaGVjayhzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyBxX2lkKQotewotCXVuc2lnbmVkIGxvbmcgdWxOZWFybHlGdWxsQ291bnQ7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHKQotCVVOVVNFRChxX2lkKTsKLSNlbmRpZgotCi0JdWxOZWFybHlGdWxsQ291bnQgPSAocS0+bXNnX2NvdW50XyAqIDMpOwotCXVsTmVhcmx5RnVsbENvdW50ID0gdWxOZWFybHlGdWxsQ291bnQvNDsKLQotCWlmKHEtPm1zZ19jb3VudF8gPT0gcS0+Y3Vycl9tc2dfY291bnRfKQotCXsKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQkJaWYgKFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKSAtIHRpY2tGb3JWa0RlYnVnID4gNTAwMCkKLQkJewotCQkJdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7Ci0JCQkvLyBxdWV1ZSBpcyBmdWxsLgotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQotCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIG5hbWU6JXMgZnVsbCAhISElY1xuISEhXG4iLCBfX0ZVTkNUSU9OX18sIHFfaWQsIHEtPm5hbWUsIDcpOwotCSNpZiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpCi0JCQlWS19UQVNLX1ByaW50VGFza0xpc3QoKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKQotCQkJSE1YX01TR19QcmludE1zZ1FMaXN0KCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQoVktfU0VNX0RFQlVHKQotCQkJVktfU0VNX1ByaW50U2VtTGlzdCgpOwotCSNlbmRpZgotI2Vsc2UKLQkJCVByaW50RXJyb3IoIlxuISFcbiEhISAlcygpOiBXQVJOSU5HOiBxdWV1ZV9pZCAweCVYLCBmdWxsICEhISVjXG4hISFcbiIsIF9fRlVOQ1RJT05fXywgcV9pZCwgNyk7Ci0jZW5kaWYKLQkJfQotI2VuZGlmCi0JCXJldHVybiBITVhfTVNHX0ZVTEw7Ci0JfQotCWVsc2UgaWYoIHEtPmN1cnJfbXNnX2NvdW50XyA+IHVsTmVhcmx5RnVsbENvdW50ICkKLQl7Ci0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi0JCVByaW50RXJyb3IoIltITVhfTVNHX1NlbmRdIE1zZ1F1ZSBpcyBuZWFybHkgZnVsbCAtIFNlbmRUYXNrOiVkLCBRdWVJZDoweCVYLCAoJWxkLCAlbGQpLCBuYW1lOiVzXHJcbiIsCi0JCQkJcHRocmVhZF9zZWxmKCksIHFfaWQsIHEtPm1zZ19jb3VudF8sIHEtPmN1cnJfbXNnX2NvdW50XywgcS0+bmFtZSk7Ci0jZW5kaWYKLQl9Ci0KLQlyZXR1cm4gSE1YX09LOwotfQotCi0KLS8qCi0gICAgSE1YX01TR19QcmludE1zZ1FMaXN0Ci0gICAguN68vMH2xaUgwaS6uLimIMPit8LH0bTZLgotKi8KLSNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCi12b2lkIEhNWF9NU0dfUHJpbnRNc2dRTGlzdCh2b2lkKQotewotCUhJTlQzMgl1bENudD0wOwotCXN0cnVjdCBITVhfTVNHX3F1ZXVlICpwTXNnUTsKLQotICAgIFByaW50RGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotICAgIFByaW50RGVidWcoIiAgICAgICAgICAgICAgICBOYW1lIFFpZCAgICAgICAgU2l6ZSBDb3VudCBDdXJfQ291bnQgVHlwZVxuIik7Ci0gICAgZm9yIChwTXNnUSA9IG1zZ19xX2xpc3RfaGVhZC50cWhfZmlyc3Q7IHBNc2dRICE9IE5VTEw7IHBNc2dRID0gcE1zZ1EtPmVudHJpZXMudHFlX25leHQpCi0gICAgewotICAgICAgICBQcmludERlYnVnKCJbJTAzZF0lMjBzIDB4JTA4WCAlMDRkICUwNWQgJTA5ZCAlMDRkXG4iLHVsQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXNnUS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpcE1zZ1EsIHBNc2dRLT5tc2dfc2l6ZV8sIHBNc2dRLT5tc2dfY291bnRfLCBwTXNnUS0+Y3Vycl9tc2dfY291bnRfLCBwTXNnUS0+c3VzcGVuZF90eXBlXyk7Ci0gICAgICAgIHVsQ250Kys7Ci0gICAgfQotICAgIFByaW50RGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotfQotI2VuZGlmCi0KLQotLypAfSovCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxNmNlYy4uMDAwMDAwMAotLS0gYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX3N5c3RlbS5oICAkCi0gKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQKLSAqIE9yaWdpbmFsIEF1dGhvcjogWWFuZyBIeXVuIFVrICQKLSAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkCi0gKiBEYXRlOgkJCSREYXRlOiAyMDExLjA5LjMwCi0gKiBGaWxlIERlc2NyaXB0aW9uOglVcGdyYWRlIEFQSXMKLSAqIE1vZHVsZToKLSAqIFJlbWFya3M6Ci0gKi8KLQotCi0vKioKLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCi0gKiBAZGF0ZSAzMCBTZXB0IDIwMTEKLSAqLwotCi0vKioKLSAqIEBub3RlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4KLSAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KLSAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlCi0gKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuCi0gKi8KLQotIC8qQHsqLwotCi0vKioKLSAqIEBmaWxlIGhteF91cGdyYWRlX3N5c3RlbS5oCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3lzL3F1ZXVlLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLS8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBFeHRlcm4gdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8KLQotLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpCi0jZGVmaW5lIEhNWF9PSwkwCi0jZGVmaW5lIEhNWF9FUlJPUgkxCi0jZGVmaW5lIEhNWF9USU1FT1VUCQkyCi0jZGVmaW5lIEhNWF9JTlZBTElEX0lECQkzCi0jZGVmaW5lIEhNWF9BTExPQ19FUlJPUgkJNAotI2RlZmluZSBITVhfTk9fTVNHCQkJNQotI2RlZmluZSBITVhfQ1JFQVRFX0VSUk9SCQkxMAotI2RlZmluZSBITVhfREVTVFJPWV9FUlJPUgkxMQotI2RlZmluZSBITVhfTE9DS19FUlJPUgkJMTIKLSNkZWZpbmUgSE1YX1VOTE9DS19FUlJPUgkJMTMKLSNkZWZpbmUgSE1YX1RJTUVfSU5GSU5JVEUgICAgMTQKLSNkZWZpbmUgSE1YX0lOVkFMSURfQ0xPQ0sJMTUKLSNkZWZpbmUgSE1YX01TR19GVUxMCQkJMTcKLQotI2RlZmluZSBUUlVFIDEKLSNkZWZpbmUgRkFMU0UgMAotCi0KLSNkZWZpbmUgSE1YX1RBU0tfUFRIUkVBRF9TVEFDS19NSU4JKDE2KjEwMjQpCi0jZGVmaW5lIEhNWF9UQVNLX1BUSFJFQURfREVGQVVMVF9QUklPCVNDSEVEX1JSCi0KLSNkZWZpbmUgSE1YX1RBU0tfU1RBQ0tfT1ZFUkhFQURfU0laRSAJCQkweDIwMDAKLSNkZWZpbmUgSE1YX1RBU0tfR1VBUkRfU0laRSAJCQkxNgotCi0vKiBFbmQgTWFjcm8gZGVmaW5pdGlvbiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFydCB0eXBlZGVmICovCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUYXNrIFByaW9yaXR5IFNldAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8qCi0gICAgwdbAx7vnx9cKLSAgICBQcmlvcml0ebimIMH1sKEgvcPFsrTZuOkgVktfTVNHX1BSSU9SSVRZwMcgsKq1tSCwsMDMIMH1sKEgvcPE0b7fIMfRtNkuCi0gICAgVktfTVNHX1BSSU9SSVRZwMcgsKrAuiDH17vzIHByaW9yaXR5wMcgsKoguri02SAxILi5vsa+3yCx17ehvt8gVXJnZW50IG1zZ7imIMOzuK4gx9G02S4KLSovCi0vKiBCYXNpYyBQcmlvcml0eSBTZXQgKi8KLSNkZWZpbmUJQkFTRV9QUklPUklUWQkJCTYwCi0jZGVmaW5lCUhJR0hFU1RfUFJJT1JJVFkJCTEwOAotCi0jZGVmaW5lCVBSSU9SSVRZX0lOQ1JFTUVOVAkxCi0KLS8vdGVtcCA6OiBOZXZlciB1c2UKLSNkZWZpbmUJVVNFUl9QUklPUklUWTAJCQlCQVNFX1BSSU9SSVRZCQkJCQkJCS8vIDYwCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMSkKLSNkZWZpbmUJVVNFUl9QUklPUklUWTIJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoyKQotI2RlZmluZQlVU0VSX1BSSU9SSVRZMwkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjMpCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk0CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNCkKLQotLy/Az7TcIGRlZmF1bHQgcHJpb3JpdHm3ziA2ufggu+e/6wk1MMC7ILHiwdjAuLfOIDjAzCDA+7Tnx9Igte0uCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk1CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNSkKLSNkZWZpbmUJVVNFUl9QUklPUklUWTYJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo2KQotI2RlZmluZQlVU0VSX1BSSU9SSVRZNwkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjcpCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk4CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqOCkKLSNkZWZpbmUJVVNFUl9QUklPUklUWTkJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCo5KQotCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxMAkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjEwKQkvLyA4MAotI2RlZmluZQlVU0VSX1BSSU9SSVRZMTEJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoxMSkKLSNkZWZpbmUJVVNFUl9QUklPUklUWTEyCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMTIpCi0KLS8vdGVtcCA6OiBmb3IgdGhlIGhpZ2hlc3QgREQKLSNkZWZpbmUJVVNFUl9QUklPUklUWTEzCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMTMpCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxNAkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjE0KQotCi0vL1VTRVJfUFJJT1JJVFkxNbTCILvnv+vHz8H2ILi7ILDNLi4uLi4gLy8yMDA3MTAxMSBUZXN0QnlQb29oCi0vL09ubHkgdGFzayBwcmlvcml0eSBhZGp1c3QKLSNkZWZpbmUJVVNFUl9QUklPUklUWTE1CQkJSElHSEVTVF9QUklPUklUWQotCi0KLQotLy9NU0dfUFJJT1JJVFnAxyCwqsC6IFRhc2sgUHJpb3JpdHnAxyCwubz2uri02SAxsLMguLm+xr7fIMfRtNkuCi10eXBlZGVmIGVudW0KLXsKLSAgICBNU0dfUFJJT1JJVFkwLAotICAgIE1TR19QUklPUklUWTEsCi0gICAgTVNHX1BSSU9SSVRZMiwKLSAgICBNU0dfUFJJT1JJVFkzLAotICAgIE1TR19QUklPUklUWTQsCi0gICAgTVNHX1BSSU9SSVRZNSwKLSAgICBNU0dfUFJJT1JJVFk2LAotICAgIE1TR19QUklPUklUWTcsCi0gICAgTVNHX1BSSU9SSVRZOCwKLSAgICBNU0dfUFJJT1JJVFk5LAotICAgIE1TR19QUklPUklUWTEwLAotICAgIE1TR19QUklPUklUWTExLAotICAgIE1TR19QUklPUklUWTEyLAotICAgIE1TR19QUklPUklUWTEzLAotICAgIE1TR19QUklPUklUWTE0LAotICAgIE1TR19QUklPUklUWTE1LAotICAgIE1TR19QUklPUklUWTE2LAotICAgIE1TR19QUklPUklUWV9NQVggICAvL8PWu/PAp8DHIFBSSU9SSVRZtMIgVXJnZW50t84gu+e/68fULi4KLX1ITVhfTVNHX1BSSU9SSVRZOwotCi10eXBlZGVmIGVudW0KLXsKLQlITVhfU1VTUEVORFRZUEVfRklGTywKLQlITVhfU1VTUEVORFRZUEVfUFJJT1JJVFksCi0JSE1YX1NVU1BFTkRUWVBFX01BWAotfUhNWF9TVVNQRU5EVFlQRTsKLQotCi0vKiBFbmQgdHlwZWRlZiAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLS8qIEVuZCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi0KLXN0cnVjdCBITVhfVEFTS19hcmcgewotCXB0aHJlYWRfbXV0ZXhfdAlsb2NrXzsKLQlwdGhyZWFkX2NvbmRfdAljb25kXzsKLQl1bnNpZ25lZCBsb25nCQlwcmlvcml0eV87Ci0JdW5zaWduZWQgbG9uZwkJc3RhY2tTaXplXzsKLQlpbnQJCQkJCUlzSm9pbmFibGU7Ci0JaW50IAkJCQlzdGFydDsKLQl1bnNpZ25lZCBsb25nCQkqcHVjVGFza1N0YWNrOwotCXVuc2lnbmVkIGxvbmcJCSpwdWxTdGFja1N0YXJ0QWRkcmVzczsKLQl2b2lkICgqc3RhcnRfZnVuY18pKHZvaWQgKik7Ci0Jdm9pZCAqYXJnXzsKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQlwaWRfdCBwaWQ7Ci0JcGlkX3QgdGlkOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKLQlpbnQgdGhyZWFkX2lkOwotI2VuZGlmCi0JY2hhciBuYW1lWzMyXTsKLX07Ci0KLXN0cnVjdCBITVhfVEFTSyB7Ci0JcHRocmVhZF90IHRhc2tfOwotCXN0cnVjdCBITVhfVEFTS19hcmcgdGFyZ187Ci19OwotCi1zdHJ1Y3QgIEhNWF9NU0dfZWxlbWVudAotewotICAgIHZvaWQgICAgICAgICAgICAgKmRhdGE7Ci0gICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgKm5leHQ7Ci0gICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgKnByZXY7Ci19OwotCi1zdHJ1Y3QgSE1YX01TR19xdWV1ZQotewotCi0gICAgcHRocmVhZF9tdXRleF90ICAgICBxX2xvY2tfOwotICAgIHB0aHJlYWRfY29uZF90ICAgICAgcV9ub3RfZW1wdHlfOwotICAgIHB0aHJlYWRfY29uZF90ICAgICAgcV9ub3RfZnVsbF87Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBjdXJyX21zZ19jb3VudF87Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBtc2dfc2l6ZV87Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBtc2dfY291bnRfOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgYml0bWFwX2NvdW50W01TR19QUklPUklUWV9NQVhdOwotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgYml0bWFwW01TR19QUklPUklUWV9NQVhdOwotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgc3VzcGVuZF90eXBlXzsKLQl2b2lkCQkJCSpwUG9vbDsKLQl2b2lkCQkJCSpwRGF0YVBvb2w7Ci0KLSAgICBpbnQgd3JpdGVyX2NvdW50XzsKLSAgICBpbnQgcmVhZGVyX2NvdW50XzsKLQotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICp0ZW1wX2hlYWQ7Ci0gICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKnRlbXBfdGFpbDsKLSAgICBzdHJ1Y3QgIEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAqaGVhZFtNU0dfUFJJT1JJVFlfTUFYXTsKLSAgICBzdHJ1Y3QgIEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAqdGFpbFtNU0dfUFJJT1JJVFlfTUFYXTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQotICAgIHVuc2lnbmVkIGxvbmcgc2VuZFRpY2s7Ci0gICAgdW5zaWduZWQgbG9uZyByZWNlaXZlVGljazsKLSAgICB1bnNpZ25lZCBsb25nIGxhc3RTZW5kVGljazsKLSAgICB1bnNpZ25lZCBsb25nIGxhc3RSZWNlaXZlVGljazsKLSAgICBjaGFyIG5hbWVbMzJdOwotICAgIFRBSUxRX0VOVFJZKEhNWF9NU0dfcXVldWUpIGVudHJpZXM7Ci0jZW5kaWYKLX07Ci0KLSNpZiBkZWZpbmVkKFZLX01TR19ERUJVRykKLVRBSUxRX0hFQUQobGlzdGhlYWQsIEhNWF9NU0dfcXVldWUpIG1zZ19xX2xpc3RfaGVhZDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCi11bnNpZ25lZCBsb25nCXRpY2tGb3JWa0RlYnVnOwotI2VuZGlmCi0KLS8qQH0qLwpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obnZyYW1fZGxpc3QuaCBiL2xpYnVwZ3JhZGUvaG52cmFtX2RsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwNGEzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnVwZ3JhZGUvaG52cmFtX2RsaXN0LmgKQEAgLTAsMCArMSwzMSBAQAorLyogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9ITlZSQU1fRExJU1RfSF8KKyNkZWZpbmUgX0hOVlJBTV9ETElTVF9IXworCit0eXBlZGVmIHN0cnVjdCBkbGlzdF9oZHIgeworICBzdHJ1Y3QgZGxpc3RfaGRyICpuZXh0OworICBzdHJ1Y3QgZGxpc3RfaGRyICpwcmV2OworfSBkbGlzdF9oZHJfdDsKKworI2RlZmluZSBETElTVF9JTklUKGRsaXN0KSB7ICYoZGxpc3QpLCAmKGRsaXN0KSB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbGlzdF9hZGQoc3RydWN0IGRsaXN0X2hkciAqZGxpc3QsIHN0cnVjdCBkbGlzdF9oZHIgKmVudHJ5KQoreworICBlbnRyeS0+bmV4dCA9IGRsaXN0OworICBlbnRyeS0+cHJldiA9IGRsaXN0LT5wcmV2OworICBkbGlzdC0+cHJldi0+bmV4dCA9IGVudHJ5OworICBkbGlzdC0+cHJldiA9IGVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGxpc3RfZGVsKHN0cnVjdCBkbGlzdF9oZHIgKmVudHJ5KQoreworICBlbnRyeS0+cHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OworICBlbnRyeS0+bmV4dC0+cHJldiA9IGVudHJ5LT5wcmV2OworfQorCisjZGVmaW5lIERMSVNUX0ZPUl9FQUNIKGRsaXN0LCBlbnRyeSkgXAorICAgIGZvciAoZW50cnkgPSAoZGxpc3QpLT5uZXh0OyBlbnRyeSAhPSAoZGxpc3QpOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorCisjZW5kaWYgIC8qIF9ITlZSQU1fRExJU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmMgYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU3MzM5Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQotICAgICogIAotICAgICogIFF1ZXVlIE1hbmFnZW1lbnQgcm91dGluZXMJCUZpbGU6IGxpYl9xdWV1ZS5jCi0gICAgKiAgCi0gICAgKiAgUm91dGluZXMgdG8gbWFuYWdlIGRvdWJseS1saW5rZWQgcXVldWVzLgotICAgICogIAotICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnIChtcGxAYnJvYWRjb20uY29tKQotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCi0gICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEKLSAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgCi0gICAgKiAgY29waWVkIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIAotICAgICogIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIAotICAgICogIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQgCi0gICAgKiAgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gIE5vIHRpdGxlIAotICAgICogIG9yIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBoZXJlYnkuCi0gICAgKiAgCi0gICAgKiAgMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIAotICAgICogICAgIGFuZCByZXRhaW4gdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgCi0gICAgKiAgICAgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICogIAotICAgICogIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIAotICAgICogICAgIGxvZ28gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJCcm9hZGNvbSAKLSAgICAqICAgICBDb3Jwb3JhdGlvbiIgbmFtZSBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIEJyb2FkY29tIAotICAgICogICAgIENvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKLSAgICAqICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIAotICAgICogICAgIHBlcm1pc3Npb24gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uCi0gICAgKiAgCi0gICAgKiAgMykgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBBTlkgRVhQUkVTUyBPUgotICAgICogICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgCi0gICAgKiAgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAgICAqICAgICBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKLSAgICAqICAgICBTSEFMTCBCUk9BRENPTSBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIEFORCBJTiAKLSAgICAqICAgICBQQVJUSUNVTEFSLCBCUk9BRENPTSBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBESVJFQ1QsIElORElSRUNULCAKLSAgICAqICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKLSAgICAqICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgCi0gICAgKiAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICAgICogICAgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgCi0gICAgKiAgICAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAKLSAgICAqICAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpLCBFVkVOIElGIEFEVklTRUQgT0YgCi0gICAgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaW5jbHVkZSAibGliX3F1ZXVlLmgiCi0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfRU5RVUVVRShxYixpdGVtKQkKLSAgICAqICAJCQkJCi0gICAgKiAgQWRkIGl0ZW0gdG8gYSBxdWV1ZQotICAgICogIAkJCQkKLSAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCi0gICAgKiAgICAgIHFiIC0gcXVldWUgYmxvY2sJCi0gICAgKiAgICAgIGl0ZW0gLSBpdGVtIHRvIGFkZAkKLSAgICAqICAgICAgCQkJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgkJCi0gICAgKiAgICAgIE5vdGhpbmcuCQkKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotdm9pZCBxX2VucXVldWUocXVldWVfdCAqcWIscXVldWVfdCAqaXRlbSkKLXsKLSAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBpdGVtOwotICAgIGl0ZW0tPnFfbmV4dCA9IHFiOwotICAgIGl0ZW0tPnFfcHJldiA9IHFiLT5xX3ByZXY7Ci0gICAgcWItPnFfcHJldiA9IGl0ZW07Ci19Ci0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfREVRVUVVRShlbGVtZW50KQkKLSAgICAqICAJCQkJCi0gICAgKiAgUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUKLSAgICAqICAJCQkJCQotICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkJCi0gICAgKiAgICAgIGVsZW1lbnQgLSBlbGVtZW50IHRvIHJlbW92ZQkKLSAgICAqICAgICAgCQkJCQotICAgICogIFJldHVybiBWYWx1ZToJCQkKLSAgICAqICAgICAgTm90aGluZy4JCQkKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotdm9pZCBxX2RlcXVldWUocXVldWVfdCAqaXRlbSkKLXsKLSAgICBpdGVtLT5xX3ByZXYtPnFfbmV4dCA9IGl0ZW0tPnFfbmV4dDsKLSAgICBpdGVtLT5xX25leHQtPnFfcHJldiA9IGl0ZW0tPnFfcHJldjsKLX0KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgUV9ERVFORVhUKHFiKQotICAgICoKLSAgICAqICBEZXF1ZXVlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgcXVldWUKLSAgICAqIAotICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkKLSAgICAqICAgICAgcWIgLSBxdWV1ZSBibG9jawkKLSAgICAqICAgICAgCQkJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgkJCi0gICAgKiAgICAgIG5leHQgZWxlbWVudCwgb3IgTlVMTAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1xdWV1ZV90ICpxX2RlcW5leHQocXVldWVfdCAqcWIpCi17Ci0gICAgaWYgKHFiLT5xX25leHQgPT0gcWIpIHsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICBxYiA9IHFiLT5xX25leHQ7Ci0KLSAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBxYi0+cV9uZXh0OwotICAgIHFiLT5xX25leHQtPnFfcHJldiA9IHFiLT5xX3ByZXY7Ci0KLSAgICByZXR1cm4gcWI7Ci19Ci0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfTUFQKHFiKQotICAgICogCi0gICAgKiAgIk1hcCIgYSBxdWV1ZSwgY2FsbGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoCi0gICAgKiAgZWxlbWVudCBpbiB0aGUgcXVldWUKLSAgICAqICAKLSAgICAqICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBub256ZXJvLCBxX21hcCB3aWxsIHRlcm1pbmF0ZS4KLSAgICAqICAKLSAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCQotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkKLSAgICAqICAgICAgZm4gLSBmdW5jdGlvbiBwb2ludGVyCQotICAgICogICAgICBhLGIgLSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24KLSAgICAqICAKLSAgICAqICBSZXR1cm4gVmFsdWU6CQotICAgICogICAgICByZXR1cm4gdmFsdWUgZnJvbSBmdW5jdGlvbiwgb3IgemVybyBpZiBlbnRpcmUgcXVldWUgCi0gICAgKiAgICAgIHdhcyBtYXBwZWQuCQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1pbnQgcV9tYXAocXVldWVfdCAqcWIsIGludCAoKmZ1bmMpKHF1ZXVlX3QgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KSwKLQkgIHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKQotewotICAgIHF1ZXVlX3QgKnFlOwotICAgIHF1ZXVlX3QgKm5leHRxOwotICAgIGludCByZXM7Ci0KLSAgICBxZSA9IHFiOwotCi0gICAgcWUgPSBxYi0+cV9uZXh0OwotCi0gICAgd2hpbGUgKHFlICE9IHFiKSB7Ci0JbmV4dHEgPSBxZS0+cV9uZXh0OwotCWlmICgocmVzID0gKCpmdW5jKShxZSxhLGIpKSkgcmV0dXJuIHJlczsKLQlxZSA9IG5leHRxOwotCX0KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBRX0NPVU5UKHFiKQkJCQkJCQkqCi0gICAgKiAgCQkJCQkJCQkJKgotICAgICogIENvdW50cyB0aGUgZWxlbWVudHMgb24gYSBxdWV1ZSAobm90IGludGVybG9ja2VkKQkJCSoKLSAgICAqICAJCQkJCQkJCQkqCi0gICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQkJCQkJKgotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkJCQkJKgotICAgICogICAgICAJCQkJCQkJCSoKLSAgICAqICBSZXR1cm4gVmFsdWU6CQkJCQkJCSoKLSAgICAqICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzCQkJCQkJKgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50IHFfY291bnQocXVldWVfdCAqcWIpCi17Ci0gICAgcXVldWVfdCAqcWU7Ci0gICAgaW50IHJlcyA9IDA7Ci0KLSAgICBxZSA9IHFiOwotCi0gICAgd2hpbGUgKHFlLT5xX25leHQgIT0gcWIpIHsKLQlxZSA9IHFlLT5xX25leHQ7Ci0JcmVzKys7Ci0JfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfRklORChxYixpdGVtKQotICAgICogIAotICAgICogIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIGVsZW1lbnQgaXMgb24gYSBxdWV1ZS4KLSAgICAqICAJCQkJCi0gICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCi0gICAgKiAgICAgIGl0ZW0gLSBxdWV1ZSBlbGVtZW50IAotICAgICogICAgICAJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgotICAgICogICAgICAwIC0gbm90IG9uIHF1ZXVlICAgICAgICAKLSAgICAqICAgICAgPjAgLSBwb3NpdGlvbiBvbiBxdWV1ZSAgCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQgcV9maW5kKHF1ZXVlX3QgKnFiLHF1ZXVlX3QgKml0ZW0pCi17Ci0gICAgcXVldWVfdCAqcTsKLSAgICBpbnQgcmVzID0gMTsKLQotICAgIHEgPSBxYi0+cV9uZXh0OwotCi0gICAgd2hpbGUgKHEgIT0gaXRlbSkgewotCWlmIChxID09IHFiKSByZXR1cm4gMDsKLQlxID0gcS0+cV9uZXh0OwotCXJlcysrOwotCX0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmggYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFiMmY1Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQotICAgICogIAotICAgICogIFF1ZXVlIG1hbmFnZW1lbnQgcHJvdG90eXBlcwkJRmlsZTogbGliX3F1ZXVlLmgKLSAgICAqICAKLSAgICAqICBDb25zdGFudHMsIHN0cnVjdHVyZXMsIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUgcXVldWUKLSAgICAqICBtYW5hZ2VyLgotICAgICogIAotICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnIChtcGxAYnJvYWRjb20uY29tKQotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCi0gICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEKLSAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgCi0gICAgKiAgY29waWVkIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIAotICAgICogIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIAotICAgICogIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQgCi0gICAgKiAgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gIE5vIHRpdGxlIAotICAgICogIG9yIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBoZXJlYnkuCi0gICAgKiAgCi0gICAgKiAgMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIAotICAgICogICAgIGFuZCByZXRhaW4gdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgCi0gICAgKiAgICAgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICogIAotICAgICogIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIAotICAgICogICAgIGxvZ28gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJCcm9hZGNvbSAKLSAgICAqICAgICBDb3Jwb3JhdGlvbiIgbmFtZSBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIEJyb2FkY29tIAotICAgICogICAgIENvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKLSAgICAqICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIAotICAgICogICAgIHBlcm1pc3Npb24gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uCi0gICAgKiAgCi0gICAgKiAgMykgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBBTlkgRVhQUkVTUyBPUgotICAgICogICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgCi0gICAgKiAgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAgICAqICAgICBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKLSAgICAqICAgICBTSEFMTCBCUk9BRENPTSBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIEFORCBJTiAKLSAgICAqICAgICBQQVJUSUNVTEFSLCBCUk9BRENPTSBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBESVJFQ1QsIElORElSRUNULCAKLSAgICAqICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKLSAgICAqICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgCi0gICAgKiAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICAgICogICAgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgCi0gICAgKiAgICAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAKLSAgICAqICAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpLCBFVkVOIElGIEFEVklTRUQgT0YgCi0gICAgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgX0xJQl9RVUVVRV9ICi0jZGVmaW5lIF9MSUJfUVVFVUVfSAotCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgTWFjcm9zCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNkZWZpbmUgcV9pbml0KHEpIChxKS0+cV9wcmV2ID0gKHEpLCAocSktPnFfbmV4dCA9IChxKQotI2RlZmluZSBxX2lzZW1wdHkocSkgKChxKS0+cV9uZXh0ID09IChxKSkKLSNkZWZpbmUgcV9nZXRmaXJzdChxKSAoKHEpLT5xX25leHQpCi0jZGVmaW5lIHFfZ2V0bGFzdChxKSAoKHEpLT5xX3ByZXYpCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBUeXBlcwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgcXVldWVfcyB7Ci0gICAgc3RydWN0IHF1ZXVlX3MgKnFfbmV4dDsKLSAgICBzdHJ1Y3QgcXVldWVfcyAqcV9wcmV2OwotfSBxdWV1ZV90OwotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBQcm90b3R5cGVzCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXZvaWQgcV9lbnF1ZXVlKHF1ZXVlX3QgKixxdWV1ZV90ICopOwotdm9pZCBxX2RlcXVldWUocXVldWVfdCAqKTsKLXF1ZXVlX3QgKnFfZGVxbmV4dChxdWV1ZV90ICopOwotaW50IHFfbWFwKHF1ZXVlX3QgKnFiLGludCAoKmZ1bmMpKHF1ZXVlX3QgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KSwKLQkgIHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKTsKLWludCBxX2NvdW50KHF1ZXVlX3QgKik7Ci1pbnQgcV9maW5kKHF1ZXVlX3QgKixxdWV1ZV90ICopOwotCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvdXRpbC5jIGIvbGlidXBncmFkZS91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDZhOWEuLjAwMDAwMDAKLS0tIGEvbGlidXBncmFkZS91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTUgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdvcmtmaWxlICAgOiB1dGlsLmMKLSAqIFByb2plY3QgICAgOiBLcmFrZW4KLSAqIEF1dGhvciAgICAgOiBraHdvbwotICogRGVzY3JpcHRpb246IENvbW1hbmRzIFRlbXBsYXRlCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSFVNQVggQ28uLCBMdGQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fSEVBREVSX0ZJTEVTX19fXwotI2luY2x1ZGUgImh0eXBlLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0jZGVmaW5lIF9fX19NQUNST19ERUZJTklUSU9OX19fXwotCi0KLSNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSNkZWZpbmUgX19fX0VYVEVSTkFMX1ZBUklBQkxFX0RFRklOSVRJT05fX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fRVhURVJOQUxfRlVOQ1RJT05fREVGSU5JVElPTl9fX18KLQotCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0jZGVmaW5lIF9fX19UWVBFX0RFRklOSVRJT05fX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fR0xPQkFMX1ZBUklBQkxFX0RFRklOSVRJT05fX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fU1RBVElDX1ZBUklBQkxFX0RFRklOSVRJT05fX19fCi1jb25zdCBzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ1JDXzE2X1RBQkxFWzI1Nl0gPQotewotCTB4MDAwMCwgMHhjMGMxLCAweGMxODEsIDB4MDE0MCwgMHhjMzAxLCAweDAzYzAsIDB4MDI4MCwgMHhjMjQxLAotCTB4YzYwMSwgMHgwNmMwLCAweDA3ODAsIDB4Yzc0MSwgMHgwNTAwLCAweGM1YzEsIDB4YzQ4MSwgMHgwNDQwLAotCTB4Y2MwMSwgMHgwY2MwLCAweDBkODAsIDB4Y2Q0MSwgMHgwZjAwLCAweGNmYzEsIDB4Y2U4MSwgMHgwZTQwLAotCTB4MGEwMCwgMHhjYWMxLCAweGNiODEsIDB4MGI0MCwgMHhjOTAxLCAweDA5YzAsIDB4MDg4MCwgMHhjODQxLAotCTB4ZDgwMSwgMHgxOGMwLCAweDE5ODAsIDB4ZDk0MSwgMHgxYjAwLCAweGRiYzEsIDB4ZGE4MSwgMHgxYTQwLAotCTB4MWUwMCwgMHhkZWMxLCAweGRmODEsIDB4MWY0MCwgMHhkZDAxLCAweDFkYzAsIDB4MWM4MCwgMHhkYzQxLAotCTB4MTQwMCwgMHhkNGMxLCAweGQ1ODEsIDB4MTU0MCwgMHhkNzAxLCAweDE3YzAsIDB4MTY4MCwgMHhkNjQxLAotCTB4ZDIwMSwgMHgxMmMwLCAweDEzODAsIDB4ZDM0MSwgMHgxMTAwLCAweGQxYzEsIDB4ZDA4MSwgMHgxMDQwLAotCTB4ZjAwMSwgMHgzMGMwLCAweDMxODAsIDB4ZjE0MSwgMHgzMzAwLCAweGYzYzEsIDB4ZjI4MSwgMHgzMjQwLAotCTB4MzYwMCwgMHhmNmMxLCAweGY3ODEsIDB4Mzc0MCwgMHhmNTAxLCAweDM1YzAsIDB4MzQ4MCwgMHhmNDQxLAotCTB4M2MwMCwgMHhmY2MxLCAweGZkODEsIDB4M2Q0MCwgMHhmZjAxLCAweDNmYzAsIDB4M2U4MCwgMHhmZTQxLAotCTB4ZmEwMSwgMHgzYWMwLCAweDNiODAsIDB4ZmI0MSwgMHgzOTAwLCAweGY5YzEsIDB4Zjg4MSwgMHgzODQwLAotCTB4MjgwMCwgMHhlOGMxLCAweGU5ODEsIDB4Mjk0MCwgMHhlYjAxLCAweDJiYzAsIDB4MmE4MCwgMHhlYTQxLAotCTB4ZWUwMSwgMHgyZWMwLCAweDJmODAsIDB4ZWY0MSwgMHgyZDAwLCAweGVkYzEsIDB4ZWM4MSwgMHgyYzQwLAotCTB4ZTQwMSwgMHgyNGMwLCAweDI1ODAsIDB4ZTU0MSwgMHgyNzAwLCAweGU3YzEsIDB4ZTY4MSwgMHgyNjQwLAotCTB4MjIwMCwgMHhlMmMxLCAweGUzODEsIDB4MjM0MCwgMHhlMTAxLCAweDIxYzAsIDB4MjA4MCwgMHhlMDQxLAotCTB4YTAwMSwgMHg2MGMwLCAweDYxODAsIDB4YTE0MSwgMHg2MzAwLCAweGEzYzEsIDB4YTI4MSwgMHg2MjQwLAotCTB4NjYwMCwgMHhhNmMxLCAweGE3ODEsIDB4Njc0MCwgMHhhNTAxLCAweDY1YzAsIDB4NjQ4MCwgMHhhNDQxLAotCTB4NmMwMCwgMHhhY2MxLCAweGFkODEsIDB4NmQ0MCwgMHhhZjAxLCAweDZmYzAsIDB4NmU4MCwgMHhhZTQxLAotCTB4YWEwMSwgMHg2YWMwLCAweDZiODAsIDB4YWI0MSwgMHg2OTAwLCAweGE5YzEsIDB4YTg4MSwgMHg2ODQwLAotCTB4NzgwMCwgMHhiOGMxLCAweGI5ODEsIDB4Nzk0MCwgMHhiYjAxLCAweDdiYzAsIDB4N2E4MCwgMHhiYTQxLAotCTB4YmUwMSwgMHg3ZWMwLCAweDdmODAsIDB4YmY0MSwgMHg3ZDAwLCAweGJkYzEsIDB4YmM4MSwgMHg3YzQwLAotCTB4YjQwMSwgMHg3NGMwLCAweDc1ODAsIDB4YjU0MSwgMHg3NzAwLCAweGI3YzEsIDB4YjY4MSwgMHg3NjQwLAotCTB4NzIwMCwgMHhiMmMxLCAweGIzODEsIDB4NzM0MCwgMHhiMTAxLCAweDcxYzAsIDB4NzA4MCwgMHhiMDQxLAotCTB4NTAwMCwgMHg5MGMxLCAweDkxODEsIDB4NTE0MCwgMHg5MzAxLCAweDUzYzAsIDB4NTI4MCwgMHg5MjQxLAotCTB4OTYwMSwgMHg1NmMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1YzEsIDB4OTQ4MSwgMHg1NDQwLAotCTB4OWMwMSwgMHg1Y2MwLCAweDVkODAsIDB4OWQ0MSwgMHg1ZjAwLCAweDlmYzEsIDB4OWU4MSwgMHg1ZTQwLAotCTB4NWEwMCwgMHg5YWMxLCAweDliODEsIDB4NWI0MCwgMHg5OTAxLCAweDU5YzAsIDB4NTg4MCwgMHg5ODQxLAotCTB4ODgwMSwgMHg0OGMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0YjAwLCAweDhiYzEsIDB4OGE4MSwgMHg0YTQwLAotCTB4NGUwMCwgMHg4ZWMxLCAweDhmODEsIDB4NGY0MCwgMHg4ZDAxLCAweDRkYzAsIDB4NGM4MCwgMHg4YzQxLAotCTB4NDQwMCwgMHg4NGMxLCAweDg1ODEsIDB4NDU0MCwgMHg4NzAxLCAweDQ3YzAsIDB4NDY4MCwgMHg4NjQxLAotCTB4ODIwMSwgMHg0MmMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxYzEsIDB4ODA4MSwgMHg0MDQwCi19OwotCi1jb25zdCBzdGF0aWMgdW5zaWduZWQgbG9uZwlfY3JjMzJUYmxbMjU2XSA9Ci17Ci0JMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwKLQkweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLAotCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCi0JMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywgMHg5MGJmMWQ5MSwKLQkweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLAotCTB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCi0JMHgxMzZjOTg1NiwgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywKLQkweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LAotCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCi0JMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwKLQkweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLAotCTB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCi0JMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwKLQkweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LCAweGI4YmRhNTBmLAotCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCi0JMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwKLQkweDc2ZGM0MTkwLCAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLAotCTB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCi0JMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwKLQkweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLAotCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCi0JMHg2YzA2OTVlZCwgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywKLQkweDY1YjBkOWM2LCAweDEyYjdlOTUwLCAweDhiYmViOGVhLCAweGZjYjk4ODdjLAotCTB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCi0JMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMiwKLQkweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLAotCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCi0JMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwKLQkweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LAotCTB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCi0JMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwKLQkweDU5YjMzZDE3LCAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLAotCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCi0JMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwgMHg3M2RjMTY4MywKLQkweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LAotCTB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCi0JMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwKLQkweGY3NjI1NzVkLCAweDgwNjU2N2NiLCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LAotCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCi0JMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwKLQkweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLAotCTB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCi0JMHhkODBkMmJkYSwgMHhhZjBhMWI0YywgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwKLQkweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LAotCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCi0JMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwKLQkweGM1YmEzYmJlLCAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LAotCTB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCi0JMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywgMHgwMjZkOTMwYSwKLQkweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAotCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCi0JMHg5MmQyOGU5YiwgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwKLQkweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLAotCTB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCi0JMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywKLQkweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LAotCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCi0JMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwKLQkweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLAotCTB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCi0JMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwKLQkweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLAotCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCi0JMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZCwKLX07CS8qIF9jcmMzMlRibCAqLwotCi0jZGVmaW5lIE5fQklUX0J5dGUJCTgKLSNkZWZpbmUgU0laRV9CaXRCdWYgCShOX0JJVF9CeXRlICogc2l6ZW9mKF9iaXRCdWYpKQotI2RlZmluZSBOX0JJVF9EaWMJCTEzCi0jZGVmaW5lIFNJWkVfRGljCQkoMSA8PCBOX0JJVF9EaWMpCi0jZGVmaW5lIE1BWF9NYXRjaAkJMjU2Ci0jZGVmaW5lIFRIUkVTSE9MRAkJMwotI2RlZmluZSBNQVhfQnl0ZU51bSAJMjU1Ci0jZGVmaW5lIE5DCQkJCShNQVhfQnl0ZU51bSArIE1BWF9NYXRjaCsyLVRIUkVTSE9MRCkKLSNkZWZpbmUgTl9CSVRfQyAJCTkKLSNkZWZpbmUgTl9CSVRfQ29kZQkJMTYKLQotCi0jZGVmaW5lIE5QCQkJCShOX0JJVF9EaWMrMSkKLSNkZWZpbmUgTlQJCQkJKE5fQklUX0NvZGUrMykKLSNkZWZpbmUgUEJJVAkJCTQJCQkJLy8gc21hbGxlc3QgaW50ZWdlciBzdWNoIHRoYXQgKDFVPDxQQklUKSA+IE5QCi0jZGVmaW5lIFRCSVQJCQk1CQkJCS8vIHNtYWxsZXN0IGludGVnZXIgc3VjaCB0aGF0ICgxVTw8VEJJVCkgPiBOVAotI2lmIE5UPk5QCi0JI2RlZmluZSBOUFQgCQlOVAotI2Vsc2UKLQkjZGVmaW5lIE5QVCAJCU5QCi0jZW5kaWYKLQotZXh0ZXJuCXVuc2lnbmVkIGxvbmcJX2NvbXBEYXRhU2l6ZSA7CQkJLy8gY29tcHJlc3NlZCBkYXRhIHNpemUKLWV4dGVybgl1bnNpZ25lZCBsb25nCV9vcmdEYXRhU2l6ZSA7CQkJLy8gb3JpZ2luYWwgZGF0YSBzaXplCi1leHRlcm4JdW5zaWduZWQgY2hhcglfZGVjb21wQnVmWzB4ODAwMF0gOwkvLyBkZWNvbXByZXNzIGJ1ZmZlcgotCi11bnNpZ25lZCBjaGFyCV9jTGVuW05DXSwgX3B0TGVuW05QVCArIDEwMF0sICpfb3JnRGF0YSwgX2RpY0J1ZltTSVpFX0RpY107Ci11bnNpZ25lZCBzaG9ydAlfbGVmdFsyKk5DLTFdLCBfcmlnaHRbMipOQy0xXSwgX2Jsa1NpemUsIF9jVGJsWzQwOTZdLAotCQkJCV9wdFRibFsyNTZdLCBfYml0QnVmLCBfc3ViQml0QnVmLAotCQkJCV9zdGFydFsxOF0sIF9jb3VudFsxN10sIF93ZWlnaHRbMTddOwotc2hvcnQJCQlfYml0Q291bnQ7Ci11bnNpZ25lZCBzaG9ydAlfY29tcFNpemU7Ci0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fU1RBVElDX0ZVTkNUSU9OX0RFRklOSVRJT05fX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fU1RBVElDX0ZVTkNUSU9OX0JPRFlfX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fR0xPQkFMX0ZVTkNUSU9OX0JPRFlfX19fCi0KLXVuc2lnbmVkIHNob3J0IEdldENSQzE2KHVuc2lnbmVkIGNoYXIgKkJ1ZmZlclB0ciwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpCi17Ci0JdW5zaWduZWQgc2hvcnQJCUNSQyA7Ci0KLQlDUkMgPSAwOwotCXdoaWxlIChOdW1iZXJPZkJ5dGUtLSkKLQl7Ci0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7Ci0JfQotCi0JcmV0dXJuIENSQyA7Ci19IC8qIEdldENyYzE2ICovCi0KLXVuc2lnbmVkIHNob3J0IEdldENSQzE2RmFzdCh2b2lkICppblAsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKQotewotCXVuc2lnbmVkIHNob3J0CQlDUkMgOwotCXVuc2lnbmVkIGxvbmcgKmFsaWduZWRfNDsKLQl1bnNpZ25lZCBsb25nIHByZV9jb3VudCwgZW5kX2NvdW50LGxvb3BfNDsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JdW5zaWduZWQgY2hhciAqQnVmZmVyUHRyID0gaW5QOwotCi0JaWYgKE51bWJlck9mQnl0ZSA8IDQpCi0JewotCQlyZXR1cm4gR2V0Q1JDMTYoaW5QLCBOdW1iZXJPZkJ5dGUpOwotCX0KLQlwcmVfY291bnQgPSAoKHVuc2lnbmVkIGxvbmcpQnVmZmVyUHRyICYgMHgwMyk7Ci0JaWYocHJlX2NvdW50IT0wKQotCQlwcmVfY291bnQgPSA0LXByZV9jb3VudDsKLQlhbGlnbmVkXzQgPSAodW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgbG9uZylCdWZmZXJQdHIgKyBwcmVfY291bnQpOwotCWxvb3BfNCA9IChOdW1iZXJPZkJ5dGUtcHJlX2NvdW50KT4+MjsKLQllbmRfY291bnQgPSBOdW1iZXJPZkJ5dGUtKGxvb3BfNDw8MiktcHJlX2NvdW50OwotCi0JQ1JDPTA7Ci0Jd2hpbGUoKHByZV9jb3VudC0tKSE9MCkKLQl7Ci0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7Ci0JfQotCi0JQnVmZmVyUHRyPSh1bnNpZ25lZCBjaGFyICopYWxpZ25lZF80Kyhsb29wXzQ8PDIpOwotCi0Jd2hpbGUoKGxvb3BfNC0tKSE9MCkKLQl7Ci0JCWRhdGE9ICphbGlnbmVkXzQrKzsKLSNpZiBkZWZpbmVkKENPTkZJR19CSUdfRU5ESUFOKQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+MTYpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YQkpKSAmIDB4ZmZdOwotI2Vsc2UKLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGEJKSkgJiAweGZmXTsKLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PiA4KSkgJiAweGZmXTsKLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PjE2KSkgJiAweGZmXTsKLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PjI0KSkgJiAweGZmXTsKLSNlbmRpZgotCX0KLQotCXdoaWxlKChlbmRfY291bnQtLSkhPTApCi0JewotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAqQnVmZmVyUHRyKyspICYgMHhmZl07Ci0JfQotCi0JcmV0dXJuIENSQyA7Ci0KLX0gLyogR2V0Q3JjMTYgKi8KLQotdW5zaWduZWQgbG9uZyBHZXRDcmMzMih1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JdW5zaWduZWQgbG9uZwljcmMsICp0Ymw7Ci0JdW5zaWduZWQgbG9uZwlsZW47Ci0KLQlsZW4gPSBuOwotCi0JY3JjID0gMHhGRkZGRkZGRjsKLQl0YmwgPSAodW5zaWduZWQgbG9uZyopX2NyYzMyVGJsOwotCXdoaWxlIChuLS0pCi0JewotCQkgIGNyYyA9IChjcmMgPj4gOCkgXiB0YmxbKGNyYyBeICpwKSAmIDB4ZmZdOwotCQkgIHArKzsKLQl9Ci0JcmV0dXJuIH5jcmM7Ci19IC8qIEdldENyYzMyICovCi0KLXVuc2lnbmVkIGxvbmcgR2V0Q1JDMzJGYXN0KHZvaWQgKmluUCwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpCi17Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZwkJQ1JDIDsKLQl1bnNpZ25lZCBsb25nICphbGlnbmVkXzQ7Ci0JdW5zaWduZWQgbG9uZyBwcmVfY291bnQsIGVuZF9jb3VudCxsb29wXzQ7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCXVuc2lnbmVkIGNoYXIgKkJ1ZmZlclB0ciA9IGluUDsKLQotCWlmIChOdW1iZXJPZkJ5dGUgPCA0KQotCXsKLQkJcmV0dXJuIEdldENyYzMyKGluUCwgTnVtYmVyT2ZCeXRlKTsKLQl9Ci0JcHJlX2NvdW50ID0gKCh1bnNpZ25lZCBsb25nKUJ1ZmZlclB0ciAmIDB4MDMpOwotCWlmKHByZV9jb3VudCE9MCkKLQkJcHJlX2NvdW50ID0gNC1wcmVfY291bnQ7Ci0JYWxpZ25lZF80ID0gKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpQnVmZmVyUHRyICsgcHJlX2NvdW50KTsKLQlsb29wXzQgPSAoTnVtYmVyT2ZCeXRlLXByZV9jb3VudCk+PjI7Ci0JZW5kX2NvdW50ID0gTnVtYmVyT2ZCeXRlLShsb29wXzQ8PDIpLXByZV9jb3VudDsKLQotCUNSQyA9IDB4RkZGRkZGRkY7Ci0Jd2hpbGUoKHByZV9jb3VudC0tKSE9MCkKLQl7Ci0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7Ci0JfQotCi0JQnVmZmVyUHRyPSh1bnNpZ25lZCBjaGFyICopYWxpZ25lZF80Kyhsb29wXzQ8PDIpOwotCi0Jd2hpbGUoKGxvb3BfNC0tKSE9MCkKLQl7Ci0JCWRhdGE9ICphbGlnbmVkXzQrKzsKLSNpZiBkZWZpbmVkKENPTkZJR19CSUdfRU5ESUFOKQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MTYpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YQkgKSkgJiAweGZmXTsKLSNlbHNlCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhCSApKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MTYpKSAmIDB4ZmZdOwotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOwotI2VuZGlmCi0JfQotCi0Jd2hpbGUoKGVuZF9jb3VudC0tKSE9MCkKLQl7Ci0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7Ci0JfQotCi0JcmV0dXJuIH5DUkMgOwotCi19IC8qIEdldENyYzE2ICovCi0KLQotdW5zaWduZWQgc2hvcnQgR2V0MTJCaXRzKHVuc2lnbmVkIGNoYXIgKiBiYXNlKQotewotCXVuc2lnbmVkIHNob3J0IHRlbXAgPSAwIDsKLQotCXRlbXAgfD0gKihiYXNlICsgMCkgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMSkgOwotCi0JcmV0dXJuIHRlbXAgJiAweDBGRkYgOwotfSAvKiBHZXQxMkJpdHMgKi8KLQotdW5zaWduZWQgc2hvcnQgR2V0MTZCaXRzKHVuc2lnbmVkIGNoYXIgKmJhc2UpCi17Ci0JdW5zaWduZWQgc2hvcnQgdGVtcCA9IDAgOwotCi0JdGVtcCB8PSAqKGJhc2UgKyAwKSA7Ci0JdGVtcCA8PD0gOCA7Ci0JdGVtcCB8PSAqKGJhc2UgKyAxKSA7Ci0KLQlyZXR1cm4gdGVtcCA7Ci19IC8qIEdldDE2Qml0cyAqLwotCi11bnNpZ25lZCBsb25nICBHZXQyNEJpdHModW5zaWduZWQgY2hhciAqYmFzZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRlbXAgPSAwIDsKLQotCXRlbXAgfD0gKihiYXNlICsgMCkgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMSkgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMikgOwotCi0JcmV0dXJuIHRlbXAgOwotfSAvKiBHZXQyNEJpdHMgKi8KLQotdW5zaWduZWQgbG9uZyBHZXQzMkJpdHModW5zaWduZWQgY2hhciAqYmFzZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRlbXAgPSAwIDsKLQotCXRlbXAgfD0gKihiYXNlICsgMCkgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMSkgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMikgOwotCXRlbXAgPDw9IDggOwotCXRlbXAgfD0gKihiYXNlICsgMykgOwotCi0JcmV0dXJuIHRlbXAgOwotfSAvKiBHZXQzMkJpdHMgKi8KLQotdW5zaWduZWQgc2hvcnQgU1dBUDE2KHVuc2lnbmVkIHNob3J0IEEpCi17Ci0JcmV0dXJuICgoKEEgPj4gOCkgfCAoQSA8PCA4KSkpOwotfQotCi11bnNpZ25lZCBpbnQgU1dBUDMyKHVuc2lnbmVkIGxvbmcgQSkKLXsKLQlyZXR1cm4gKChBIDw8IDI0KSB8ICgoQSA8PCA4KSAmICAweEZGMDAwMCkgfCAoKEEgPj4gOCkgJiAgMHhGRjAwKSB8KEEgPj4gMjQpKTsKLX0KLQotdm9pZCBNYWtlVGJsKHVuc2lnbmVkIHNob3J0IG5DaGFyLCB1bnNpZ25lZCBjaGFyICpiaXRMZW4sIHVuc2lnbmVkIHNob3J0IHRibEJpdHMsIHVuc2lnbmVkIHNob3J0ICp0YmwpCi17Ci0JdW5zaWduZWQgc2hvcnQJKndwLCAqd3BwLCAqd3BwcCwgaSwgaywgYXZhaWwsIG1hc2s7Ci0JdW5zaWduZWQgc2hvcnQJbGVuLCBjaCwganV0Qml0cywgbmV4dENvZGU7Ci0JdW5zaWduZWQgY2hhcgkqYnA7Ci0KLQlmb3IgKHdwPSZfY291bnRbMV0saT0xOyBpPD0xNjsgaSsrKQotCQkqd3ArKyA9IDA7Ci0JZm9yICh3cD1fY291bnQsIGJwPWJpdExlbiwgaT0wOyBpPG5DaGFyOyBpKyspCi0JCXdwWypicCsrXSsrOwotCi0JZm9yICh3cD0mX3N0YXJ0WzFdLHdwcD0mX2NvdW50WzFdLCp3cD0wLGk9MSxrPTE1OyBpPD0xNjsgaSsrLGstLSx3cCsrKQotCQl3cFsxXSA9ICp3cCArICgqd3BwKysgPDwgayk7Ci0KLQlpZiAoX3N0YXJ0WzE3XSAhPSAodW5zaWduZWQgc2hvcnQpKDFVIDw8IDE2KSkKLQkJcHJpbnRmKCJcblxuRGVjb21wcmVzc2lvbiBlcnJvcjogQkFEIFRBQkxFXHJcblxyXG4iKTsKLQotCWp1dEJpdHMgPSAxNi10YmxCaXRzOwotCi0JZm9yICh3cD0mX3N0YXJ0WzFdLHdwcD0mX3dlaWdodFsxXSxpPTEsaz10YmxCaXRzLTE7IGk8PXRibEJpdHM7IGkrKyxrLS0pCi0JewotCQkqd3AgPj49IGp1dEJpdHM7Ci0JCXdwKys7Ci0JCSp3cHArKyA9IDFVIDw8IGs7Ci0JfQotCi0JZm9yIChrPTE2LWksd3A9Jl93ZWlnaHRbaV07IGk8PTE2OyBpKyssay0tKQotCQkqd3ArKyA9IDFVIDw8IGs7Ci0KLQlpID0gX3N0YXJ0W3RibEJpdHMrMV0gPj4ganV0Qml0czsKLQlpZiAoaSAhPSAodW5zaWduZWQgc2hvcnQpKDFVIDw8IDE2KSkKLQl7Ci0JCWsgPSAxVSA8PCB0YmxCaXRzOwotCQl3aGlsZSAoaSE9aykKLQkJCXRibFtpKytdID0gMDsKLQl9Ci0KLQlhdmFpbCA9IG5DaGFyOwotCW1hc2sgPSAxVSA8PCAoMTUtdGJsQml0cyk7Ci0Jd3BwID0gX3JpZ2h0OwotCXdwcHAgPSBfbGVmdDsKLQlmb3IgKGNoPTAsYnA9Yml0TGVuOyBjaDxuQ2hhcjsgY2grKykKLQl7Ci0JCWlmICgobGVuID0gKmJwKyspID09IDApCi0JCQljb250aW51ZTsKLQotCQlrID0gX3N0YXJ0W2xlbl07Ci0JCW5leHRDb2RlID0gayArIF93ZWlnaHRbbGVuXTsKLQotCQlpZiAobGVuIDw9IHRibEJpdHMpCi0JCXsKLQkJCWZvciAod3A9dGJsK2s7IGs8bmV4dENvZGU7IGsrKykKLQkJCQkqd3ArKyA9IGNoOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJd3AgPSB0YmwgKyAoayA+PiBqdXRCaXRzKTsKLQkJCWkgPSBsZW4tdGJsQml0czsKLQkJCXdoaWxlIChpICE9IDApCi0JCQl7Ci0JCQkJaWYgKCp3cCA9PSAwKQotCQkJCXsKLQkJCQkJd3BwW2F2YWlsXSA9IHdwcHBbYXZhaWxdID0gMDsKLQkJCQkJKndwID0gYXZhaWwrKzsKLQkJCQl9Ci0JCQkJd3AgPSAoayZtYXNrID8gd3BwIDogd3BwcCkgKyAqd3A7Ci0JCQkJayA8PD0gMTsKLQkJCQlpLS07Ci0JCQl9Ci0JCQkqd3AgPSBjaDsKLQkJfQotCQlfc3RhcnRbbGVuXSA9IG5leHRDb2RlOwotCX0KLX0gLyogTWFrZVRibCAqLwotCi0KLXZvaWQgRmlsbEJ1Zih1bnNpZ25lZCBzaG9ydCBuKQkvKiBTaGlmdCBfYml0QnVmIG4gYml0cyBsZWZ0LCByZWFkIG4gYml0cyAqLwotewotCV9iaXRCdWYgPDw9IG47Ci0Jd2hpbGUgKG4gPiBfYml0Q291bnQpCi0JewotCQluIC09IF9iaXRDb3VudDsKLQkJX2JpdEJ1ZiB8PSBfc3ViQml0QnVmIDw8IG47Ci0JCWlmIChfY29tcFNpemUgIT0gMCkKLQkJewotCQkJX2NvbXBTaXplLS07Ci0JCQlfc3ViQml0QnVmID0gKl9vcmdEYXRhKys7Ci0JCX0KLQkJZWxzZQotCQkJX3N1YkJpdEJ1ZiA9IDA7Ci0JCV9iaXRDb3VudCA9IE5fQklUX0J5dGU7Ci0JfQotCV9iaXRDb3VudCAtPSBuOwotCV9iaXRCdWYgfD0gX3N1YkJpdEJ1ZiA+PiBfYml0Q291bnQ7Ci19IC8qIEZpbGxCdWYgKi8KLQotCi11bnNpZ25lZCBzaG9ydCBHZXRCaXRzKHVuc2lnbmVkIHNob3J0IG4pCi17Ci0JdW5zaWduZWQgc2hvcnQJeDsKLQotCXggPSBfYml0QnVmID4+IChTSVpFX0JpdEJ1Zi1uKTsKLQlGaWxsQnVmKG4pOwotCi0JcmV0dXJuIHg7Ci19IC8qIEdldEJpdHMgKi8KLQotCi12b2lkIFJlYWRQdExlbihzaWduZWQgc2hvcnQgbm4sIHNpZ25lZCBzaG9ydCBuQml0LCBzaWduZWQgc2hvcnQgaVNwZWNpYWwpCi17Ci0Jc2lnbmVkIHNob3J0CWksYyxuOwotCXVuc2lnbmVkIHNob3J0CW1hc2ssICp3cDsKLQl1bnNpZ25lZCBjaGFyCSpicDsKLQotCW4gPSBHZXRCaXRzKG5CaXQpOwotCWlmIChuID09IDApCi0JewotCQljID0gR2V0Qml0cyhuQml0KTsKLQotCQlmb3IgKGJwPV9wdExlbixpPTA7IGk8bm47IGkrKykKLQkJCSpicCsrID0gMDsKLQkJZm9yICh3cD1fcHRUYmwsaT0wOyBpPDI1NjsgaSsrKQotCQkJKndwKysgPSBjOwotCX0KLQllbHNlCi0JewotCQlpID0gMDsKLQkJYnAgPSBfcHRMZW47Ci0JCXdoaWxlIChpIDwgbikKLQkJewotCQkJYyA9IF9iaXRCdWYgPj4gKFNJWkVfQml0QnVmLTMpOwotCQkJaWYgKGMgPT0gNykKLQkJCXsKLQkJCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtMyk7Ci0JCQkJd2hpbGUgKG1hc2sgJiBfYml0QnVmKQotCQkJCXsKLQkJCQkJbWFzayA+Pj0gMTsKLQkJCQkJYysrOwotCQkJCX0KLQkJCX0KLQkJCUZpbGxCdWYoYzw3ID8gMyA6IGMtMyk7Ci0JCQlicFtpKytdID0gKHVuc2lnbmVkIGNoYXIpYzsKLQkJCWlmIChpID09IGlTcGVjaWFsKQotCQkJewotCQkJCWMgPSBHZXRCaXRzKDIpOwotCQkJCXdoaWxlICgtLWMgPj0gMCkKLQkJCQkJYnBbaSsrXSA9IDA7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGk8bm4pCi0JCQlicFtpKytdID0gMDsKLQkJTWFrZVRibChubiwgYnAsIDgsIF9wdFRibCk7Ci0JfQotfSAvKiBSZWFkUHRMZW4gKi8KLQotCi12b2lkIFJlYWRDTGVuKHZvaWQpCi17Ci0Jc2lnbmVkIHNob3J0CWksIGMsIG47Ci0JdW5zaWduZWQgc2hvcnQJbWFzaywgKndwLCAqd3BwOwotCXVuc2lnbmVkIGNoYXIJKmJwLCAqYnBwOwotCi0JbiA9IEdldEJpdHMoTl9CSVRfQyk7Ci0JYnAgPSBfY0xlbjsKLQlpZiAobiA9PSAwKQotCXsKLQkJYyA9IEdldEJpdHMoTl9CSVRfQyk7Ci0JCWZvciAoaT0wOyBpPE5DOyBpKyspCi0JCQkqYnArKyA9IDA7Ci0JCWZvciAod3A9X2NUYmwsaT0wOyBpPDQwOTY7IGkrKykKLQkJCSp3cCsrID0gYzsKLQl9Ci0JZWxzZQotCXsKLQkJaSA9IDA7Ci0JCWJwcCA9IF9wdExlbjsKLQkJd3AgPSBfcmlnaHQ7Ci0JCXdwcCA9IF9sZWZ0OwotCQl3aGlsZSAoaSA8IG4pCi0JCXsKLQkJCWMgPSBfcHRUYmxbX2JpdEJ1Zj4+KFNJWkVfQml0QnVmLTgpXTsKLQkJCWlmIChjID49IE5UKQotCQkJewotCQkJCW1hc2sgPSAxVSA8PCAoU0laRV9CaXRCdWYtMS04KTsKLQkJCQlkbwotCQkJCXsKLQkJCQkJYyA9IChfYml0QnVmICYgbWFzaykgPyB3cFtjXSA6IHdwcFtjXTsKLQkJCQkJbWFzayA+Pj0gMTsKLQkJCQl9IHdoaWxlIChjID49IE5UKTsKLQkJCX0KLQkJCUZpbGxCdWYoYnBwW2NdKTsKLQkJCWlmIChjIDw9IDIpCi0JCQl7Ci0JCQkJaWYgKGMgPT0gMCkgYyA9IDE7Ci0JCQkJZWxzZSBpZiAoYyA9PSAxKSBjID0gR2V0Qml0cyg0KSArIDM7Ci0JCQkJZWxzZQkJYyA9IEdldEJpdHMoTl9CSVRfQykgKyAyMDsKLQotCQkJCXdoaWxlICgtLWMgPj0gMCkKLQkJCQkJYnBbaSsrXT0wOwotCQkJfQotCQkJZWxzZQotCQkJCWJwW2krK10gPSBjLTI7Ci0JCX0KLQkJd2hpbGUgKGkgPCBOQykKLQkJCWJwW2krK10gPSAwOwotCQlNYWtlVGJsKE5DLCBicCwgMTIsIF9jVGJsKTsKLQl9Ci19IC8qIFJlYWRDTGVuICovCi0KLQotdW5zaWduZWQgc2hvcnQgRGVjb2RlQyh2b2lkKQotewotCXVuc2lnbmVkIHNob3J0CWksIG1hc2ssICp3cCwgKndwcDsKLQotCWlmIChfYmxrU2l6ZSA9PSAwKQotCXsKLQkJX2Jsa1NpemUgPSBHZXRCaXRzKDE2KTsKLQkJUmVhZFB0TGVuKE5ULCBUQklULCAzKTsKLQkJUmVhZENMZW4oKTsKLQkJUmVhZFB0TGVuKE5QLCBQQklULCAodW5zaWduZWQgc2hvcnQpLTEpOwotCX0KLQlfYmxrU2l6ZS0tOwotCWkgPSBfY1RibFtfYml0QnVmID4+IChTSVpFX0JpdEJ1Zi0xMildOwotCWlmIChpID49IE5DKQotCXsKLQkJbWFzayA9IDFVIDw8IChTSVpFX0JpdEJ1Zi0xLTEyKTsKLQkJd3AgPSBfcmlnaHQ7Ci0JCXdwcCA9IF9sZWZ0OwotCQlkbwotCQl7Ci0JCQlpID0gKF9iaXRCdWYgJiBtYXNrKSA/IHdwW2ldIDogd3BwW2ldOwotCQkJbWFzayA+Pj0gMTsKLQkJfSB3aGlsZSAoaSA+PSBOQyk7Ci0JfQotCUZpbGxCdWYoX2NMZW5baV0pOwotCi0JcmV0dXJuIGk7Ci19IC8qIERlY29kZUMgKi8KLQotCi11bnNpZ25lZCBzaG9ydCBEZWNvZGVQKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQJaSwgbWFzaywgKndwLCAqd3BwOwotCi0JaSA9IF9wdFRibFtfYml0QnVmID4+IChTSVpFX0JpdEJ1Zi04KV07Ci0JaWYgKGkgPj0gTlApCi0JewotCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtOCk7Ci0JCXdwID0gX3JpZ2h0OwotCQl3cHAgPSBfbGVmdDsKLQkJZG8KLQkJewotCQkJaSA9IChfYml0QnVmICYgbWFzaykgPyB3cFtpXSA6IHdwcFtpXTsKLQkJCW1hc2sgPj49IDE7Ci0JCX0gd2hpbGUgKGkgPj0gTlApOwotCX0KLQlGaWxsQnVmKF9wdExlbltpXSk7Ci0JaWYgKGkgIT0gMCkKLQkJaSA9ICgxVSA8PCAoaS0xKSkgKyBHZXRCaXRzKGktMSk7Ci0KLQlyZXR1cm4gaTsKLX0gLyogRGVjb2RlUCAqLwotCi0KLXVuc2lnbmVkIGNoYXIgKkRlY29tcHJlc3NEYXRhKHVuc2lnbmVkIGNoYXIgKmRhdGEpCi17Ci0Jc2lnbmVkIHNob3J0CXJlbSwgbiwgaSwgciwgYzsJLy8gcmVtOiByZW1haW5pbmcgdW5zaWduZWQgY2hhcnMgdG8gY29weQotCXVuc2lnbmVkIGNoYXIJKmRpY0J1ZiwgKmRlY29tcEJ1ZjsKLQl1bnNpZ25lZCBzaG9ydAlvcmdTaXplOwotCi0JX29yZ0RhdGEJPSBkYXRhOwotCW9yZ1NpemUJCT0gKHVuc2lnbmVkIHNob3J0KV9vcmdEYXRhU2l6ZTsKLQlfY29tcFNpemUJPSAodW5zaWduZWQgc2hvcnQpX2NvbXBEYXRhU2l6ZTsKLQlkZWNvbXBCdWYJPSBfZGVjb21wQnVmOwotCi0JX2JpdEJ1ZiA9IF9zdWJCaXRCdWYgPSAwOwotCV9iaXRDb3VudCA9IDA7Ci0JRmlsbEJ1ZihTSVpFX0JpdEJ1Zik7Ci0JX2Jsa1NpemUgPSAwOwotCXJlbSA9IDA7Ci0JaSA9IDA7Ci0KLQl3aGlsZSAob3JnU2l6ZSAhPSAwKQotCXsKLQkJZGljQnVmID0gX2RpY0J1ZjsKLQotCQluID0gKG9yZ1NpemUgPiBTSVpFX0RpYykgPyBTSVpFX0RpYyA6IG9yZ1NpemU7Ci0KLQkJciA9IDA7Ci0JCXdoaWxlICgtLXJlbSA+PSAwKQotCQl7Ci0JCQlkaWNCdWZbcl0gPSBkaWNCdWZbaV07Ci0JCQlpID0gKGkrMSkgJiAoU0laRV9EaWMtMSk7Ci0JCQlpZiAoKytyID09IG4pCi0JCQkJZ290byBORVhUOwotCQl9Ci0KLQkJd2hpbGUoMSkKLQkJewotCQkJYyA9IERlY29kZUMoKTsKLQkJCWlmIChjIDw9IE1BWF9CeXRlTnVtKQotCQkJewotCQkJCWRpY0J1ZltyXSA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0JCQkJaWYgKCsrciA9PSBuKQotCQkJCQlnb3RvIE5FWFQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmVtID0gYyAtIChNQVhfQnl0ZU51bSsxLVRIUkVTSE9MRCk7Ci0JCQkJaSA9IChyLURlY29kZVAoKS0xKSAmIChTSVpFX0RpYy0xKTsKLQkJCQl3aGlsZSAoLS1yZW0gPj0gMCkKLQkJCQl7Ci0JCQkJCWRpY0J1ZltyXSA9IGRpY0J1ZltpXTsKLQkJCQkJaSA9IChpKzEpICYgKFNJWkVfRGljLTEpOwotCQkJCQlpZiAoKytyID09IG4pCi0JCQkJCQlnb3RvIE5FWFQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTkVYVDoKLQotCQlmb3IgKHI9MDsgcjxuOyByKyspCi0JCQkqZGVjb21wQnVmKysgPSAqZGljQnVmKys7Ci0KLQkJb3JnU2l6ZSAtPSBuOwotCX0KLQotLy8JRFNJX3ByaW50ZigwLCAiRGVjb21wIGVuZFxyXG4iKTsKLQotCXJldHVybiBfZGVjb21wQnVmOwotfSAvKiBEZWNvbXByZXNzICovCi0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvdXRpbC5oIGIvbGlidXBncmFkZS91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NThlYmEuLjAwMDAwMDAKLS0tIGEvbGlidXBncmFkZS91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0KLSNpZm5kZWYgX1VUSUxfSF8KLSNkZWZpbmUgX1VUSUxfSF8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV29ya2ZpbGUgICA6IHV0aWwuaAotICogUHJvamVjdCAgICA6IEtyYWtlbgotICogQXV0aG9yICAgICA6IGtod29vCi0gKiBEZXNjcmlwdGlvbjogQ29tbWFuZHMgVGVtcGxhdGUKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBIVU1BWCBDby4sIEx0ZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0jZGVmaW5lIF9fX19IRUFERVJfRklMRVNfX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fTUFDUk9fREVGSU5JVElPTl9fX18KLQotCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0jZGVmaW5lIF9fX19UWVBFX0RFRklOSVRJT05fX19fCi0KLQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotI2RlZmluZSBfX19fRVhURVJOQUxfVkFSSUFCTEVfREVGSU5JVElPTl9fX18KLQotCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0jZGVmaW5lIF9fX19FWFRFUk5BTF9GVU5DVElPTl9ERUZJTklUSU9OX19fXwotdW5zaWduZWQgc2hvcnQgR2V0Q1JDMTYodW5zaWduZWQgY2hhciAqQnVmZmVyUHRyLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSk7Ci11bnNpZ25lZCBzaG9ydCBHZXRDUkMxNkZhc3Qodm9pZCAqaW5QLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSk7Ci11bnNpZ25lZCBsb25nIEdldENyYzMyKHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGxvbmcgbik7Ci11bnNpZ25lZCBsb25nIEdldENSQzMyRmFzdCh2b2lkICppblAsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKTsKLXVuc2lnbmVkIHNob3J0IEdldDEyQml0cyh1bnNpZ25lZCBjaGFyICogYmFzZSk7Ci11bnNpZ25lZCBzaG9ydCBHZXQxNkJpdHModW5zaWduZWQgY2hhciAqYmFzZSk7Ci11bnNpZ25lZCBsb25nICBHZXQyNEJpdHModW5zaWduZWQgY2hhciAqYmFzZSk7Ci11bnNpZ25lZCBsb25nIEdldDMyQml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKTsKLXVuc2lnbmVkIHNob3J0IFNXQVAxNih1bnNpZ25lZCBzaG9ydCBBKTsKLXVuc2lnbmVkIGludCBTV0FQMzIodW5zaWduZWQgbG9uZyBBKTsKLQotdW5zaWduZWQgY2hhciAqRGVjb21wcmVzc0RhdGEodW5zaWduZWQgY2hhciAqZGF0YSk7Ci0KLS8vbG9uZyBhdG9sKGNvbnN0IGNoYXIgKmRlc3QpOwotLy9jaGFyIHRvbG93ZXIoY2hhciBjKTsKLQotI2VuZGlmIC8qIF9VVElMX0hfICovCi0KLQo=