From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1033159AbeCAQ14 (ORCPT ); Thu, 1 Mar 2018 11:27:56 -0500 Received: from mail-yw0-f195.google.com ([209.85.161.195]:37953 "EHLO mail-yw0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1033049AbeCAQ1v (ORCPT ); Thu, 1 Mar 2018 11:27:51 -0500 X-Google-Smtp-Source: AG47ELuKV+opgXNKaNj+wyifPmzgZm7J+kjOJ583prlEIhGoCaaL/mllu2urQAMCaPjQtAVQZNPQqwsQMmRBB52y8zk= MIME-Version: 1.0 In-Reply-To: References: <20180228221703.92391-1-mka@chromium.org> From: Alex Deucher Date: Thu, 1 Mar 2018 11:27:49 -0500 Message-ID: Subject: Re: [PATCH] drm/radeon/mkregtable: Delete unused list functions and macros To: Guenter Roeck Cc: Matthias Kaehlcke , David Airlie , linux-kernel , Maling list - DRI developers , Guenter Roeck , amd-gfx list , Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Mar 1, 2018 at 10:41 AM, Guenter Roeck wrote: > On Wed, Feb 28, 2018 at 2:17 PM, Matthias Kaehlcke wrote: >> The util mkregtable includes a copy of the kernel API for linked lists, >> only a small subset of it is used. Delete the unused functions and macros. >> >> Signed-off-by: Matthias Kaehlcke > > Reviewed-by: Guenter Roeck Applied. thanks! Alex > >> --- >> drivers/gpu/drm/radeon/mkregtable.c | 433 ---------------------------- >> 1 file changed, 433 deletions(-) >> >> diff --git a/drivers/gpu/drm/radeon/mkregtable.c b/drivers/gpu/drm/radeon/mkregtable.c >> index c21d8fa591ef..ba704633b072 100644 >> --- a/drivers/gpu/drm/radeon/mkregtable.c >> +++ b/drivers/gpu/drm/radeon/mkregtable.c >> @@ -43,10 +43,6 @@ struct list_head { >> struct list_head *next, *prev; >> }; >> >> -#define LIST_HEAD_INIT(name) { &(name), &(name) } >> - >> -#define LIST_HEAD(name) \ >> - struct list_head name = LIST_HEAD_INIT(name) >> >> static inline void INIT_LIST_HEAD(struct list_head *list) >> { >> @@ -74,19 +70,6 @@ extern void __list_add(struct list_head *new, >> struct list_head *prev, struct list_head *next); >> #endif >> >> -/** >> - * list_add - add a new entry >> - * @new: new entry to be added >> - * @head: list head to add it after >> - * >> - * Insert a new entry after the specified head. >> - * This is good for implementing stacks. >> - */ >> -static inline void list_add(struct list_head *new, struct list_head *head) >> -{ >> - __list_add(new, head, head->next); >> -} >> - >> /** >> * list_add_tail - add a new entry >> * @new: new entry to be added >> @@ -100,250 +83,6 @@ static inline void list_add_tail(struct list_head *new, struct list_head *head) >> __list_add(new, head->prev, head); >> } >> >> -/* >> - * Delete a list entry by making the prev/next entries >> - * point to each other. >> - * >> - * This is only for internal list manipulation where we know >> - * the prev/next entries already! >> - */ >> -static inline void __list_del(struct list_head *prev, struct list_head *next) >> -{ >> - next->prev = prev; >> - prev->next = next; >> -} >> - >> -/** >> - * list_del - deletes entry from list. >> - * @entry: the element to delete from the list. >> - * Note: list_empty() on entry does not return true after this, the entry is >> - * in an undefined state. >> - */ >> -#ifndef CONFIG_DEBUG_LIST >> -static inline void list_del(struct list_head *entry) >> -{ >> - __list_del(entry->prev, entry->next); >> - entry->next = (void *)0xDEADBEEF; >> - entry->prev = (void *)0xBEEFDEAD; >> -} >> -#else >> -extern void list_del(struct list_head *entry); >> -#endif >> - >> -/** >> - * list_replace - replace old entry by new one >> - * @old : the element to be replaced >> - * @new : the new element to insert >> - * >> - * If @old was empty, it will be overwritten. >> - */ >> -static inline void list_replace(struct list_head *old, struct list_head *new) >> -{ >> - new->next = old->next; >> - new->next->prev = new; >> - new->prev = old->prev; >> - new->prev->next = new; >> -} >> - >> -static inline void list_replace_init(struct list_head *old, >> - struct list_head *new) >> -{ >> - list_replace(old, new); >> - INIT_LIST_HEAD(old); >> -} >> - >> -/** >> - * list_del_init - deletes entry from list and reinitialize it. >> - * @entry: the element to delete from the list. >> - */ >> -static inline void list_del_init(struct list_head *entry) >> -{ >> - __list_del(entry->prev, entry->next); >> - INIT_LIST_HEAD(entry); >> -} >> - >> -/** >> - * list_move - delete from one list and add as another's head >> - * @list: the entry to move >> - * @head: the head that will precede our entry >> - */ >> -static inline void list_move(struct list_head *list, struct list_head *head) >> -{ >> - __list_del(list->prev, list->next); >> - list_add(list, head); >> -} >> - >> -/** >> - * list_move_tail - delete from one list and add as another's tail >> - * @list: the entry to move >> - * @head: the head that will follow our entry >> - */ >> -static inline void list_move_tail(struct list_head *list, >> - struct list_head *head) >> -{ >> - __list_del(list->prev, list->next); >> - list_add_tail(list, head); >> -} >> - >> -/** >> - * list_is_last - tests whether @list is the last entry in list @head >> - * @list: the entry to test >> - * @head: the head of the list >> - */ >> -static inline int list_is_last(const struct list_head *list, >> - const struct list_head *head) >> -{ >> - return list->next == head; >> -} >> - >> -/** >> - * list_empty - tests whether a list is empty >> - * @head: the list to test. >> - */ >> -static inline int list_empty(const struct list_head *head) >> -{ >> - return head->next == head; >> -} >> - >> -/** >> - * list_empty_careful - tests whether a list is empty and not being modified >> - * @head: the list to test >> - * >> - * Description: >> - * tests whether a list is empty _and_ checks that no other CPU might be >> - * in the process of modifying either member (next or prev) >> - * >> - * NOTE: using list_empty_careful() without synchronization >> - * can only be safe if the only activity that can happen >> - * to the list entry is list_del_init(). Eg. it cannot be used >> - * if another CPU could re-list_add() it. >> - */ >> -static inline int list_empty_careful(const struct list_head *head) >> -{ >> - struct list_head *next = head->next; >> - return (next == head) && (next == head->prev); >> -} >> - >> -/** >> - * list_is_singular - tests whether a list has just one entry. >> - * @head: the list to test. >> - */ >> -static inline int list_is_singular(const struct list_head *head) >> -{ >> - return !list_empty(head) && (head->next == head->prev); >> -} >> - >> -static inline void __list_cut_position(struct list_head *list, >> - struct list_head *head, >> - struct list_head *entry) >> -{ >> - struct list_head *new_first = entry->next; >> - list->next = head->next; >> - list->next->prev = list; >> - list->prev = entry; >> - entry->next = list; >> - head->next = new_first; >> - new_first->prev = head; >> -} >> - >> -/** >> - * list_cut_position - cut a list into two >> - * @list: a new list to add all removed entries >> - * @head: a list with entries >> - * @entry: an entry within head, could be the head itself >> - * and if so we won't cut the list >> - * >> - * This helper moves the initial part of @head, up to and >> - * including @entry, from @head to @list. You should >> - * pass on @entry an element you know is on @head. @list >> - * should be an empty list or a list you do not care about >> - * losing its data. >> - * >> - */ >> -static inline void list_cut_position(struct list_head *list, >> - struct list_head *head, >> - struct list_head *entry) >> -{ >> - if (list_empty(head)) >> - return; >> - if (list_is_singular(head) && (head->next != entry && head != entry)) >> - return; >> - if (entry == head) >> - INIT_LIST_HEAD(list); >> - else >> - __list_cut_position(list, head, entry); >> -} >> - >> -static inline void __list_splice(const struct list_head *list, >> - struct list_head *prev, struct list_head *next) >> -{ >> - struct list_head *first = list->next; >> - struct list_head *last = list->prev; >> - >> - first->prev = prev; >> - prev->next = first; >> - >> - last->next = next; >> - next->prev = last; >> -} >> - >> -/** >> - * list_splice - join two lists, this is designed for stacks >> - * @list: the new list to add. >> - * @head: the place to add it in the first list. >> - */ >> -static inline void list_splice(const struct list_head *list, >> - struct list_head *head) >> -{ >> - if (!list_empty(list)) >> - __list_splice(list, head, head->next); >> -} >> - >> -/** >> - * list_splice_tail - join two lists, each list being a queue >> - * @list: the new list to add. >> - * @head: the place to add it in the first list. >> - */ >> -static inline void list_splice_tail(struct list_head *list, >> - struct list_head *head) >> -{ >> - if (!list_empty(list)) >> - __list_splice(list, head->prev, head); >> -} >> - >> -/** >> - * list_splice_init - join two lists and reinitialise the emptied list. >> - * @list: the new list to add. >> - * @head: the place to add it in the first list. >> - * >> - * The list at @list is reinitialised >> - */ >> -static inline void list_splice_init(struct list_head *list, >> - struct list_head *head) >> -{ >> - if (!list_empty(list)) { >> - __list_splice(list, head, head->next); >> - INIT_LIST_HEAD(list); >> - } >> -} >> - >> -/** >> - * list_splice_tail_init - join two lists and reinitialise the emptied list >> - * @list: the new list to add. >> - * @head: the place to add it in the first list. >> - * >> - * Each of the lists is a queue. >> - * The list at @list is reinitialised >> - */ >> -static inline void list_splice_tail_init(struct list_head *list, >> - struct list_head *head) >> -{ >> - if (!list_empty(list)) { >> - __list_splice(list, head->prev, head); >> - INIT_LIST_HEAD(list); >> - } >> -} >> - >> /** >> * list_entry - get the struct for this entry >> * @ptr: the &struct list_head pointer. >> @@ -353,56 +92,6 @@ static inline void list_splice_tail_init(struct list_head *list, >> #define list_entry(ptr, type, member) \ >> container_of(ptr, type, member) >> >> -/** >> - * list_first_entry - get the first element from a list >> - * @ptr: the list head to take the element from. >> - * @type: the type of the struct this is embedded in. >> - * @member: the name of the list_head within the struct. >> - * >> - * Note, that list is expected to be not empty. >> - */ >> -#define list_first_entry(ptr, type, member) \ >> - list_entry((ptr)->next, type, member) >> - >> -/** >> - * list_for_each - iterate over a list >> - * @pos: the &struct list_head to use as a loop cursor. >> - * @head: the head for your list. >> - */ >> -#define list_for_each(pos, head) \ >> - for (pos = (head)->next; prefetch(pos->next), pos != (head); \ >> - pos = pos->next) >> - >> -/** >> - * list_for_each_prev - iterate over a list backwards >> - * @pos: the &struct list_head to use as a loop cursor. >> - * @head: the head for your list. >> - */ >> -#define list_for_each_prev(pos, head) \ >> - for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ >> - pos = pos->prev) >> - >> -/** >> - * list_for_each_safe - iterate over a list safe against removal of list entry >> - * @pos: the &struct list_head to use as a loop cursor. >> - * @n: another &struct list_head to use as temporary storage >> - * @head: the head for your list. >> - */ >> -#define list_for_each_safe(pos, n, head) \ >> - for (pos = (head)->next, n = pos->next; pos != (head); \ >> - pos = n, n = pos->next) >> - >> -/** >> - * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry >> - * @pos: the &struct list_head to use as a loop cursor. >> - * @n: another &struct list_head to use as temporary storage >> - * @head: the head for your list. >> - */ >> -#define list_for_each_prev_safe(pos, n, head) \ >> - for (pos = (head)->prev, n = pos->prev; \ >> - prefetch(pos->prev), pos != (head); \ >> - pos = n, n = pos->prev) >> - >> /** >> * list_for_each_entry - iterate over list of given type >> * @pos: the type * to use as a loop cursor. >> @@ -414,128 +103,6 @@ static inline void list_splice_tail_init(struct list_head *list, >> &pos->member != (head); \ >> pos = list_entry(pos->member.next, typeof(*pos), member)) >> >> -/** >> - * list_for_each_entry_reverse - iterate backwards over list of given type. >> - * @pos: the type * to use as a loop cursor. >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - */ >> -#define list_for_each_entry_reverse(pos, head, member) \ >> - for (pos = list_entry((head)->prev, typeof(*pos), member); \ >> - prefetch(pos->member.prev), &pos->member != (head); \ >> - pos = list_entry(pos->member.prev, typeof(*pos), member)) >> - >> -/** >> - * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() >> - * @pos: the type * to use as a start point >> - * @head: the head of the list >> - * @member: the name of the list_head within the struct. >> - * >> - * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). >> - */ >> -#define list_prepare_entry(pos, head, member) \ >> - ((pos) ? : list_entry(head, typeof(*pos), member)) >> - >> -/** >> - * list_for_each_entry_continue - continue iteration over list of given type >> - * @pos: the type * to use as a loop cursor. >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Continue to iterate over list of given type, continuing after >> - * the current position. >> - */ >> -#define list_for_each_entry_continue(pos, head, member) \ >> - for (pos = list_entry(pos->member.next, typeof(*pos), member); \ >> - prefetch(pos->member.next), &pos->member != (head); \ >> - pos = list_entry(pos->member.next, typeof(*pos), member)) >> - >> -/** >> - * list_for_each_entry_continue_reverse - iterate backwards from the given point >> - * @pos: the type * to use as a loop cursor. >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Start to iterate over list of given type backwards, continuing after >> - * the current position. >> - */ >> -#define list_for_each_entry_continue_reverse(pos, head, member) \ >> - for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ >> - prefetch(pos->member.prev), &pos->member != (head); \ >> - pos = list_entry(pos->member.prev, typeof(*pos), member)) >> - >> -/** >> - * list_for_each_entry_from - iterate over list of given type from the current point >> - * @pos: the type * to use as a loop cursor. >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Iterate over list of given type, continuing from current position. >> - */ >> -#define list_for_each_entry_from(pos, head, member) \ >> - for (; prefetch(pos->member.next), &pos->member != (head); \ >> - pos = list_entry(pos->member.next, typeof(*pos), member)) >> - >> -/** >> - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry >> - * @pos: the type * to use as a loop cursor. >> - * @n: another type * to use as temporary storage >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - */ >> -#define list_for_each_entry_safe(pos, n, head, member) \ >> - for (pos = list_entry((head)->next, typeof(*pos), member), \ >> - n = list_entry(pos->member.next, typeof(*pos), member); \ >> - &pos->member != (head); \ >> - pos = n, n = list_entry(n->member.next, typeof(*n), member)) >> - >> -/** >> - * list_for_each_entry_safe_continue >> - * @pos: the type * to use as a loop cursor. >> - * @n: another type * to use as temporary storage >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Iterate over list of given type, continuing after current point, >> - * safe against removal of list entry. >> - */ >> -#define list_for_each_entry_safe_continue(pos, n, head, member) \ >> - for (pos = list_entry(pos->member.next, typeof(*pos), member), \ >> - n = list_entry(pos->member.next, typeof(*pos), member); \ >> - &pos->member != (head); \ >> - pos = n, n = list_entry(n->member.next, typeof(*n), member)) >> - >> -/** >> - * list_for_each_entry_safe_from >> - * @pos: the type * to use as a loop cursor. >> - * @n: another type * to use as temporary storage >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Iterate over list of given type from current point, safe against >> - * removal of list entry. >> - */ >> -#define list_for_each_entry_safe_from(pos, n, head, member) \ >> - for (n = list_entry(pos->member.next, typeof(*pos), member); \ >> - &pos->member != (head); \ >> - pos = n, n = list_entry(n->member.next, typeof(*n), member)) >> - >> -/** >> - * list_for_each_entry_safe_reverse >> - * @pos: the type * to use as a loop cursor. >> - * @n: another type * to use as temporary storage >> - * @head: the head for your list. >> - * @member: the name of the list_head within the struct. >> - * >> - * Iterate backwards over list of given type, safe against removal >> - * of list entry. >> - */ >> -#define list_for_each_entry_safe_reverse(pos, n, head, member) \ >> - for (pos = list_entry((head)->prev, typeof(*pos), member), \ >> - n = list_entry(pos->member.prev, typeof(*pos), member); \ >> - &pos->member != (head); \ >> - pos = n, n = list_entry(n->member.prev, typeof(*n), member)) >> - >> struct offset { >> struct list_head list; >> unsigned offset; >> -- >> 2.16.2.395.g2e18187dfd-goog >> > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: Re: [PATCH] drm/radeon/mkregtable: Delete unused list functions and macros Date: Thu, 1 Mar 2018 11:27:49 -0500 Message-ID: References: <20180228221703.92391-1-mka@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: Guenter Roeck Cc: David Airlie , linux-kernel , amd-gfx list , Alex Deucher , Matthias Kaehlcke , Maling list - DRI developers , Guenter Roeck , =?UTF-8?Q?Christian_K=C3=B6nig?= List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBNYXIgMSwgMjAxOCBhdCAxMDo0MSBBTSwgR3VlbnRlciBSb2VjayA8Z3JvZWNrQGdv b2dsZS5jb20+IHdyb3RlOgo+IE9uIFdlZCwgRmViIDI4LCAyMDE4IGF0IDI6MTcgUE0sIE1hdHRo aWFzIEthZWhsY2tlIDxta2FAY2hyb21pdW0ub3JnPiB3cm90ZToKPj4gVGhlIHV0aWwgbWtyZWd0 YWJsZSBpbmNsdWRlcyBhIGNvcHkgb2YgdGhlIGtlcm5lbCBBUEkgZm9yIGxpbmtlZCBsaXN0cywK Pj4gb25seSBhIHNtYWxsIHN1YnNldCBvZiBpdCBpcyB1c2VkLiBEZWxldGUgdGhlIHVudXNlZCBm dW5jdGlvbnMgYW5kIG1hY3Jvcy4KPj4KPj4gU2lnbmVkLW9mZi1ieTogTWF0dGhpYXMgS2FlaGxj a2UgPG1rYUBjaHJvbWl1bS5vcmc+Cj4KPiBSZXZpZXdlZC1ieTogR3VlbnRlciBSb2VjayA8Z3Jv ZWNrQGNocm9taXVtLm9yZz4KCgpBcHBsaWVkLiAgdGhhbmtzIQoKQWxleAoKPgo+PiAtLS0KPj4g IGRyaXZlcnMvZ3B1L2RybS9yYWRlb24vbWtyZWd0YWJsZS5jIHwgNDMzIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPj4gIDEgZmlsZSBjaGFuZ2VkLCA0MzMgZGVsZXRpb25zKC0pCj4+Cj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL21rcmVndGFibGUuYyBiL2RyaXZl cnMvZ3B1L2RybS9yYWRlb24vbWtyZWd0YWJsZS5jCj4+IGluZGV4IGMyMWQ4ZmE1OTFlZi4uYmE3 MDQ2MzNiMDcyIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL21rcmVndGFi bGUuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL21rcmVndGFibGUuYwo+PiBAQCAt NDMsMTAgKzQzLDYgQEAgc3RydWN0IGxpc3RfaGVhZCB7Cj4+ICAgICAgICAgc3RydWN0IGxpc3Rf aGVhZCAqbmV4dCwgKnByZXY7Cj4+ICB9Owo+Pgo+PiAtI2RlZmluZSBMSVNUX0hFQURfSU5JVChu YW1lKSB7ICYobmFtZSksICYobmFtZSkgfQo+PiAtCj4+IC0jZGVmaW5lIExJU1RfSEVBRChuYW1l KSBcCj4+IC0gICAgICAgc3RydWN0IGxpc3RfaGVhZCBuYW1lID0gTElTVF9IRUFEX0lOSVQobmFt ZSkKPj4KPj4gIHN0YXRpYyBpbmxpbmUgdm9pZCBJTklUX0xJU1RfSEVBRChzdHJ1Y3QgbGlzdF9o ZWFkICpsaXN0KQo+PiAgewo+PiBAQCAtNzQsMTkgKzcwLDYgQEAgZXh0ZXJuIHZvaWQgX19saXN0 X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCj4+ICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IGxpc3RfaGVhZCAqcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCk7Cj4+ICAjZW5kaWYK Pj4KPj4gLS8qKgo+PiAtICogbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKPj4gLSAqIEBuZXc6 IG5ldyBlbnRyeSB0byBiZSBhZGRlZAo+PiAtICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQg YWZ0ZXIKPj4gLSAqCj4+IC0gKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmll ZCBoZWFkLgo+PiAtICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgo+PiAt ICovCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3 LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+PiAtewo+PiAtICAgICAgIF9fbGlzdF9hZGQobmV3 LCBoZWFkLCBoZWFkLT5uZXh0KTsKPj4gLX0KPj4gLQo+PiAgLyoqCj4+ICAgKiBsaXN0X2FkZF90 YWlsIC0gYWRkIGEgbmV3IGVudHJ5Cj4+ICAgKiBAbmV3OiBuZXcgZW50cnkgdG8gYmUgYWRkZWQK Pj4gQEAgLTEwMCwyNTAgKzgzLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwo c3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+PiAgICAgICAg IF9fbGlzdF9hZGQobmV3LCBoZWFkLT5wcmV2LCBoZWFkKTsKPj4gIH0KPj4KPj4gLS8qCj4+IC0g KiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKPj4g LSAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCj4+IC0gKgo+PiAtICogVGhpcyBpcyBvbmx5IGZvciBp bnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93Cj4+IC0gKiB0aGUgcHJldi9u ZXh0IGVudHJpZXMgYWxyZWFkeSEKPj4gLSAqLwo+PiAtc3RhdGljIGlubGluZSB2b2lkIF9fbGlz dF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKPj4g LXsKPj4gLSAgICAgICBuZXh0LT5wcmV2ID0gcHJldjsKPj4gLSAgICAgICBwcmV2LT5uZXh0ID0g bmV4dDsKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2RlbCAtIGRlbGV0ZXMgZW50cnkg ZnJvbSBsaXN0Lgo+PiAtICogQGVudHJ5OiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUg bGlzdC4KPj4gLSAqIE5vdGU6IGxpc3RfZW1wdHkoKSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4g dHJ1ZSBhZnRlciB0aGlzLCB0aGUgZW50cnkgaXMKPj4gLSAqIGluIGFuIHVuZGVmaW5lZCBzdGF0 ZS4KPj4gLSAqLwo+PiAtI2lmbmRlZiBDT05GSUdfREVCVUdfTElTVAo+PiAtc3RhdGljIGlubGlu ZSB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQo+PiAtewo+PiAtICAgICAg IF9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKPj4gLSAgICAgICBlbnRyeS0+ bmV4dCA9ICh2b2lkICopMHhERUFEQkVFRjsKPj4gLSAgICAgICBlbnRyeS0+cHJldiA9ICh2b2lk ICopMHhCRUVGREVBRDsKPj4gLX0KPj4gLSNlbHNlCj4+IC1leHRlcm4gdm9pZCBsaXN0X2RlbChz dHJ1Y3QgbGlzdF9oZWFkICplbnRyeSk7Cj4+IC0jZW5kaWYKPj4gLQo+PiAtLyoqCj4+IC0gKiBs aXN0X3JlcGxhY2UgLSByZXBsYWNlIG9sZCBlbnRyeSBieSBuZXcgb25lCj4+IC0gKiBAb2xkIDog dGhlIGVsZW1lbnQgdG8gYmUgcmVwbGFjZWQKPj4gLSAqIEBuZXcgOiB0aGUgbmV3IGVsZW1lbnQg dG8gaW5zZXJ0Cj4+IC0gKgo+PiAtICogSWYgQG9sZCB3YXMgZW1wdHksIGl0IHdpbGwgYmUgb3Zl cndyaXR0ZW4uCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3JlcGxhY2Uoc3Ry dWN0IGxpc3RfaGVhZCAqb2xkLCBzdHJ1Y3QgbGlzdF9oZWFkICpuZXcpCj4+IC17Cj4+IC0gICAg ICAgbmV3LT5uZXh0ID0gb2xkLT5uZXh0Owo+PiAtICAgICAgIG5ldy0+bmV4dC0+cHJldiA9IG5l dzsKPj4gLSAgICAgICBuZXctPnByZXYgPSBvbGQtPnByZXY7Cj4+IC0gICAgICAgbmV3LT5wcmV2 LT5uZXh0ID0gbmV3Owo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9yZXBs YWNlX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqb2xkLAo+PiAtICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV3KQo+PiAtewo+PiAtICAgICAgIGxp c3RfcmVwbGFjZShvbGQsIG5ldyk7Cj4+IC0gICAgICAgSU5JVF9MSVNUX0hFQUQob2xkKTsKPj4g LX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9t IGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KPj4gLSAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8g ZGVsZXRlIGZyb20gdGhlIGxpc3QuCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0 X2RlbF9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQo+PiAtewo+PiAtICAgICAgIF9fbGlz dF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKPj4gLSAgICAgICBJTklUX0xJU1RfSEVB RChlbnRyeSk7Cj4+IC19Cj4+IC0KPj4gLS8qKgo+PiAtICogbGlzdF9tb3ZlIC0gZGVsZXRlIGZy b20gb25lIGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgaGVhZAo+PiAtICogQGxpc3Q6IHRoZSBl bnRyeSB0byBtb3ZlCj4+IC0gKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIHByZWNlZGUgb3Vy IGVudHJ5Cj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X21vdmUoc3RydWN0IGxp c3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKPj4gLXsKPj4gLSAgICAgICBf X2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOwo+PiAtICAgICAgIGxpc3RfYWRkKGxp c3QsIGhlYWQpOwo+PiAtfQo+PiAtCj4+IC0vKioKPj4gLSAqIGxpc3RfbW92ZV90YWlsIC0gZGVs ZXRlIGZyb20gb25lIGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgdGFpbAo+PiAtICogQGxpc3Q6 IHRoZSBlbnRyeSB0byBtb3ZlCj4+IC0gKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxv dyBvdXIgZW50cnkKPj4gLSAqLwo+PiAtc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWls KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+PiAtewo+PiAtICAgICAgIF9fbGlzdF9kZWwo bGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7Cj4+IC0gICAgICAgbGlzdF9hZGRfdGFpbChsaXN0LCBo ZWFkKTsKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2lzX2xhc3QgLSB0ZXN0cyB3aGV0 aGVyIEBsaXN0IGlzIHRoZSBsYXN0IGVudHJ5IGluIGxpc3QgQGhlYWQKPj4gLSAqIEBsaXN0OiB0 aGUgZW50cnkgdG8gdGVzdAo+PiAtICogQGhlYWQ6IHRoZSBoZWFkIG9mIHRoZSBsaXN0Cj4+IC0g Ki8KPj4gLXN0YXRpYyBpbmxpbmUgaW50IGxpc3RfaXNfbGFzdChjb25zdCBzdHJ1Y3QgbGlzdF9o ZWFkICpsaXN0LAo+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0 IGxpc3RfaGVhZCAqaGVhZCkKPj4gLXsKPj4gLSAgICAgICByZXR1cm4gbGlzdC0+bmV4dCA9PSBo ZWFkOwo+PiAtfQo+PiAtCj4+IC0vKioKPj4gLSAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVy IGEgbGlzdCBpcyBlbXB0eQo+PiAtICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCj4+IC0gKi8K Pj4gLXN0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAq aGVhZCkKPj4gLXsKPj4gLSAgICAgICByZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOwo+PiAtfQo+ PiAtCj4+IC0vKioKPj4gLSAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBs aXN0IGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgbW9kaWZpZWQKPj4gLSAqIEBoZWFkOiB0aGUgbGlz dCB0byB0ZXN0Cj4+IC0gKgo+PiAtICogRGVzY3JpcHRpb246Cj4+IC0gKiB0ZXN0cyB3aGV0aGVy IGEgbGlzdCBpcyBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUK Pj4gLSAqIGluIHRoZSBwcm9jZXNzIG9mIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyIChuZXh0IG9y IHByZXYpCj4+IC0gKgo+PiAtICogTk9URTogdXNpbmcgbGlzdF9lbXB0eV9jYXJlZnVsKCkgd2l0 aG91dCBzeW5jaHJvbml6YXRpb24KPj4gLSAqIGNhbiBvbmx5IGJlIHNhZmUgaWYgdGhlIG9ubHkg YWN0aXZpdHkgdGhhdCBjYW4gaGFwcGVuCj4+IC0gKiB0byB0aGUgbGlzdCBlbnRyeSBpcyBsaXN0 X2RlbF9pbml0KCkuIEVnLiBpdCBjYW5ub3QgYmUgdXNlZAo+PiAtICogaWYgYW5vdGhlciBDUFUg Y291bGQgcmUtbGlzdF9hZGQoKSBpdC4KPj4gLSAqLwo+PiAtc3RhdGljIGlubGluZSBpbnQgbGlz dF9lbXB0eV9jYXJlZnVsKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4+IC17Cj4+IC0g ICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGhlYWQtPm5leHQ7Cj4+IC0gICAgICAgcmV0 dXJuIChuZXh0ID09IGhlYWQpICYmIChuZXh0ID09IGhlYWQtPnByZXYpOwo+PiAtfQo+PiAtCj4+ IC0vKioKPj4gLSAqIGxpc3RfaXNfc2luZ3VsYXIgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBoYXMg anVzdCBvbmUgZW50cnkuCj4+IC0gKiBAaGVhZDogdGhlIGxpc3QgdG8gdGVzdC4KPj4gLSAqLwo+ PiAtc3RhdGljIGlubGluZSBpbnQgbGlzdF9pc19zaW5ndWxhcihjb25zdCBzdHJ1Y3QgbGlzdF9o ZWFkICpoZWFkKQo+PiAtewo+PiAtICAgICAgIHJldHVybiAhbGlzdF9lbXB0eShoZWFkKSAmJiAo aGVhZC0+bmV4dCA9PSBoZWFkLT5wcmV2KTsKPj4gLX0KPj4gLQo+PiAtc3RhdGljIGlubGluZSB2 b2lkIF9fbGlzdF9jdXRfcG9zaXRpb24oc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKPj4gLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwK Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVh ZCAqZW50cnkpCj4+IC17Cj4+IC0gICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV3X2ZpcnN0ID0g ZW50cnktPm5leHQ7Cj4+IC0gICAgICAgbGlzdC0+bmV4dCA9IGhlYWQtPm5leHQ7Cj4+IC0gICAg ICAgbGlzdC0+bmV4dC0+cHJldiA9IGxpc3Q7Cj4+IC0gICAgICAgbGlzdC0+cHJldiA9IGVudHJ5 Owo+PiAtICAgICAgIGVudHJ5LT5uZXh0ID0gbGlzdDsKPj4gLSAgICAgICBoZWFkLT5uZXh0ID0g bmV3X2ZpcnN0Owo+PiAtICAgICAgIG5ld19maXJzdC0+cHJldiA9IGhlYWQ7Cj4+IC19Cj4+IC0K Pj4gLS8qKgo+PiAtICogbGlzdF9jdXRfcG9zaXRpb24gLSBjdXQgYSBsaXN0IGludG8gdHdvCj4+ IC0gKiBAbGlzdDogYSBuZXcgbGlzdCB0byBhZGQgYWxsIHJlbW92ZWQgZW50cmllcwo+PiAtICog QGhlYWQ6IGEgbGlzdCB3aXRoIGVudHJpZXMKPj4gLSAqIEBlbnRyeTogYW4gZW50cnkgd2l0aGlu IGhlYWQsIGNvdWxkIGJlIHRoZSBoZWFkIGl0c2VsZgo+PiAtICogICAgIGFuZCBpZiBzbyB3ZSB3 b24ndCBjdXQgdGhlIGxpc3QKPj4gLSAqCj4+IC0gKiBUaGlzIGhlbHBlciBtb3ZlcyB0aGUgaW5p dGlhbCBwYXJ0IG9mIEBoZWFkLCB1cCB0byBhbmQKPj4gLSAqIGluY2x1ZGluZyBAZW50cnksIGZy b20gQGhlYWQgdG8gQGxpc3QuIFlvdSBzaG91bGQKPj4gLSAqIHBhc3Mgb24gQGVudHJ5IGFuIGVs ZW1lbnQgeW91IGtub3cgaXMgb24gQGhlYWQuIEBsaXN0Cj4+IC0gKiBzaG91bGQgYmUgYW4gZW1w dHkgbGlzdCBvciBhIGxpc3QgeW91IGRvIG5vdCBjYXJlIGFib3V0Cj4+IC0gKiBsb3NpbmcgaXRz IGRhdGEuCj4+IC0gKgo+PiAtICovCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9jdXRfcG9z aXRpb24oc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKPj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCj4+IC0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKPj4gLXsKPj4gLSAg ICAgICBpZiAobGlzdF9lbXB0eShoZWFkKSkKPj4gLSAgICAgICAgICAgICAgIHJldHVybjsKPj4g LSAgICAgICBpZiAobGlzdF9pc19zaW5ndWxhcihoZWFkKSAmJiAoaGVhZC0+bmV4dCAhPSBlbnRy eSAmJiBoZWFkICE9IGVudHJ5KSkKPj4gLSAgICAgICAgICAgICAgIHJldHVybjsKPj4gLSAgICAg ICBpZiAoZW50cnkgPT0gaGVhZCkKPj4gLSAgICAgICAgICAgICAgIElOSVRfTElTVF9IRUFEKGxp c3QpOwo+PiAtICAgICAgIGVsc2UKPj4gLSAgICAgICAgICAgICAgIF9fbGlzdF9jdXRfcG9zaXRp b24obGlzdCwgaGVhZCwgZW50cnkpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQg X19saXN0X3NwbGljZShjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAo+PiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LCBzdHJ1Y3QgbGlz dF9oZWFkICpuZXh0KQo+PiAtewo+PiAtICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0g bGlzdC0+bmV4dDsKPj4gLSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJl djsKPj4gLQo+PiAtICAgICAgIGZpcnN0LT5wcmV2ID0gcHJldjsKPj4gLSAgICAgICBwcmV2LT5u ZXh0ID0gZmlyc3Q7Cj4+IC0KPj4gLSAgICAgICBsYXN0LT5uZXh0ID0gbmV4dDsKPj4gLSAgICAg ICBuZXh0LT5wcmV2ID0gbGFzdDsKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X3NwbGlj ZSAtIGpvaW4gdHdvIGxpc3RzLCB0aGlzIGlzIGRlc2lnbmVkIGZvciBzdGFja3MKPj4gLSAqIEBs aXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgo+PiAtICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQg aXQgaW4gdGhlIGZpcnN0IGxpc3QuCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0 X3NwbGljZShjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAo+PiAtICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKPj4gLXsKPj4gLSAgICAgICBp ZiAoIWxpc3RfZW1wdHkobGlzdCkpCj4+IC0gICAgICAgICAgICAgICBfX2xpc3Rfc3BsaWNlKGxp c3QsIGhlYWQsIGhlYWQtPm5leHQpOwo+PiAtfQo+PiAtCj4+IC0vKioKPj4gLSAqIGxpc3Rfc3Bs aWNlX3RhaWwgLSBqb2luIHR3byBsaXN0cywgZWFjaCBsaXN0IGJlaW5nIGEgcXVldWUKPj4gLSAq IEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgo+PiAtICogQGhlYWQ6IHRoZSBwbGFjZSB0byBh ZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBs aXN0X3NwbGljZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCj4+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4+IC17Cj4+IC0g ICAgICAgaWYgKCFsaXN0X2VtcHR5KGxpc3QpKQo+PiAtICAgICAgICAgICAgICAgX19saXN0X3Nw bGljZShsaXN0LCBoZWFkLT5wcmV2LCBoZWFkKTsKPj4gLX0KPj4gLQo+PiAtLyoqCj4+IC0gKiBs aXN0X3NwbGljZV9pbml0IC0gam9pbiB0d28gbGlzdHMgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZW1w dGllZCBsaXN0Lgo+PiAtICogQGxpc3Q6IHRoZSBuZXcgbGlzdCB0byBhZGQuCj4+IC0gKiBAaGVh ZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGlzdC4KPj4gLSAqCj4+IC0gKiBU aGUgbGlzdCBhdCBAbGlzdCBpcyByZWluaXRpYWxpc2VkCj4+IC0gKi8KPj4gLXN0YXRpYyBpbmxp bmUgdm9pZCBsaXN0X3NwbGljZV9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCj4+IC0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4+ IC17Cj4+IC0gICAgICAgaWYgKCFsaXN0X2VtcHR5KGxpc3QpKSB7Cj4+IC0gICAgICAgICAgICAg ICBfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQsIGhlYWQtPm5leHQpOwo+PiAtICAgICAgICAgICAg ICAgSU5JVF9MSVNUX0hFQUQobGlzdCk7Cj4+IC0gICAgICAgfQo+PiAtfQo+PiAtCj4+IC0vKioK Pj4gLSAqIGxpc3Rfc3BsaWNlX3RhaWxfaW5pdCAtIGpvaW4gdHdvIGxpc3RzIGFuZCByZWluaXRp YWxpc2UgdGhlIGVtcHRpZWQgbGlzdAo+PiAtICogQGxpc3Q6IHRoZSBuZXcgbGlzdCB0byBhZGQu Cj4+IC0gKiBAaGVhZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGlzdC4KPj4g LSAqCj4+IC0gKiBFYWNoIG9mIHRoZSBsaXN0cyBpcyBhIHF1ZXVlLgo+PiAtICogVGhlIGxpc3Qg YXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAo+PiAtICovCj4+IC1zdGF0aWMgaW5saW5lIHZvaWQg bGlzdF9zcGxpY2VfdGFpbF9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCj4+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkK Pj4gLXsKPj4gLSAgICAgICBpZiAoIWxpc3RfZW1wdHkobGlzdCkpIHsKPj4gLSAgICAgICAgICAg ICAgIF9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZC0+cHJldiwgaGVhZCk7Cj4+IC0gICAgICAgICAg ICAgICBJTklUX0xJU1RfSEVBRChsaXN0KTsKPj4gLSAgICAgICB9Cj4+IC19Cj4+IC0KPj4gIC8q Kgo+PiAgICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5Cj4+ICAg KiBAcHRyOiAgICAgICB0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KPj4gQEAgLTM1Myw1 NiArOTIsNiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfdGFpbF9pbml0KHN0cnVj dCBsaXN0X2hlYWQgKmxpc3QsCj4+ICAjZGVmaW5lIGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1i ZXIpIFwKPj4gICAgICAgICBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCj4+Cj4+IC0v KioKPj4gLSAqIGxpc3RfZmlyc3RfZW50cnkgLSBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBh IGxpc3QKPj4gLSAqIEBwdHI6ICAgICAgIHRoZSBsaXN0IGhlYWQgdG8gdGFrZSB0aGUgZWxlbWVu dCBmcm9tLgo+PiAtICogQHR5cGU6ICAgICAgdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlz IGVtYmVkZGVkIGluLgo+PiAtICogQG1lbWJlcjogICAgdGhlIG5hbWUgb2YgdGhlIGxpc3RfaGVh ZCB3aXRoaW4gdGhlIHN0cnVjdC4KPj4gLSAqCj4+IC0gKiBOb3RlLCB0aGF0IGxpc3QgaXMgZXhw ZWN0ZWQgdG8gYmUgbm90IGVtcHR5Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZmlyc3RfZW50 cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKPj4gLSAgICAgICBsaXN0X2VudHJ5KChwdHIpLT5uZXh0 LCB0eXBlLCBtZW1iZXIpCj4+IC0KPj4gLS8qKgo+PiAtICogbGlzdF9mb3JfZWFjaCAgICAgICAt ICAgICAgIGl0ZXJhdGUgb3ZlciBhIGxpc3QKPj4gLSAqIEBwb3M6ICAgICAgIHRoZSAmc3RydWN0 IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KPj4gLSAqIEBoZWFkOiAgICAgIHRo ZSBoZWFkIGZvciB5b3VyIGxpc3QuCj4+IC0gKi8KPj4gLSNkZWZpbmUgbGlzdF9mb3JfZWFjaChw b3MsIGhlYWQpIFwKPj4gLSAgICAgICBmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcHJlZmV0Y2go cG9zLT5uZXh0KSwgcG9zICE9IChoZWFkKTsgXAo+PiAtICAgICAgICAgICAgICAgcG9zID0gcG9z LT5uZXh0KQo+PiAtCj4+IC0vKioKPj4gLSAqIGxpc3RfZm9yX2VhY2hfcHJldiAgLSAgICAgICBp dGVyYXRlIG92ZXIgYSBsaXN0IGJhY2t3YXJkcwo+PiAtICogQHBvczogICAgICAgdGhlICZzdHJ1 Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgo+PiAtICogQGhlYWQ6ICAgICAg dGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KPj4gLSAqLwo+PiAtI2RlZmluZSBsaXN0X2Zvcl9lYWNo X3ByZXYocG9zLCBoZWFkKSBcCj4+IC0gICAgICAgZm9yIChwb3MgPSAoaGVhZCktPnByZXY7IHBy ZWZldGNoKHBvcy0+cHJldiksIHBvcyAhPSAoaGVhZCk7IFwKPj4gLSAgICAgICAgICAgICAgIHBv cyA9IHBvcy0+cHJldikKPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2Zvcl9lYWNoX3NhZmUgLSBp dGVyYXRlIG92ZXIgYSBsaXN0IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKPj4g LSAqIEBwb3M6ICAgICAgIHRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1 cnNvci4KPj4gLSAqIEBuOiAgICAgICAgIGFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNl IGFzIHRlbXBvcmFyeSBzdG9yYWdlCj4+IC0gKiBAaGVhZDogICAgICB0aGUgaGVhZCBmb3IgeW91 ciBsaXN0Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhl YWQpIFwKPj4gLSAgICAgICBmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgbiA9IHBvcy0+bmV4dDsg cG9zICE9IChoZWFkKTsgXAo+PiAtICAgICAgICAgICAgICAgcG9zID0gbiwgbiA9IHBvcy0+bmV4 dCkKPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2Zvcl9lYWNoX3ByZXZfc2FmZSAtIGl0ZXJhdGUg b3ZlciBhIGxpc3QgYmFja3dhcmRzIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkK Pj4gLSAqIEBwb3M6ICAgICAgIHRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29w IGN1cnNvci4KPj4gLSAqIEBuOiAgICAgICAgIGFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8g dXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCj4+IC0gKiBAaGVhZDogICAgICB0aGUgaGVhZCBmb3Ig eW91ciBsaXN0Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZm9yX2VhY2hfcHJldl9zYWZlKHBv cywgbiwgaGVhZCkgXAo+PiAtICAgICAgIGZvciAocG9zID0gKGhlYWQpLT5wcmV2LCBuID0gcG9z LT5wcmV2OyBcCj4+IC0gICAgICAgICAgICBwcmVmZXRjaChwb3MtPnByZXYpLCBwb3MgIT0gKGhl YWQpOyBcCj4+IC0gICAgICAgICAgICBwb3MgPSBuLCBuID0gcG9zLT5wcmV2KQo+PiAtCj4+ICAv KioKPj4gICAqIGxpc3RfZm9yX2VhY2hfZW50cnkgLSAgICAgICBpdGVyYXRlIG92ZXIgbGlzdCBv ZiBnaXZlbiB0eXBlCj4+ICAgKiBAcG9zOiAgICAgICB0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxv b3AgY3Vyc29yLgo+PiBAQCAtNDE0LDEyOCArMTAzLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGxp c3Rfc3BsaWNlX3RhaWxfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAo+PiAgICAgICAgICAg ICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgICAgXAo+PiAgICAgICAgICAgICAgcG9zID0gbGlz dF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCj4+Cj4+IC0v KioKPj4gLSAqIGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSAtIGl0ZXJhdGUgYmFja3dhcmRz IG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLgo+PiAtICogQHBvczogICAgICAgdGhlIHR5cGUgKiB0 byB1c2UgYXMgYSBsb29wIGN1cnNvci4KPj4gLSAqIEBoZWFkOiAgICAgIHRoZSBoZWFkIGZvciB5 b3VyIGxpc3QuCj4+IC0gKiBAbWVtYmVyOiAgICB0aGUgbmFtZSBvZiB0aGUgbGlzdF9oZWFkIHdp dGhpbiB0aGUgc3RydWN0Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlf cmV2ZXJzZShwb3MsIGhlYWQsIG1lbWJlcikgICAgICAgICAgICAgICAgIFwKPj4gLSAgICAgICBm b3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7 ICAgICAgXAo+PiAtICAgICAgICAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIucHJldiksICZwb3Mt Pm1lbWJlciAhPSAoaGVhZCk7ICAgICAgICBcCj4+IC0gICAgICAgICAgICBwb3MgPSBsaXN0X2Vu dHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKPj4gLQo+PiAtLyoq Cj4+IC0gKiBsaXN0X3ByZXBhcmVfZW50cnkgLSBwcmVwYXJlIGEgcG9zIGVudHJ5IGZvciB1c2Ug aW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSgpCj4+IC0gKiBAcG9zOiAgICAgICB0aGUg dHlwZSAqIHRvIHVzZSBhcyBhIHN0YXJ0IHBvaW50Cj4+IC0gKiBAaGVhZDogICAgICB0aGUgaGVh ZCBvZiB0aGUgbGlzdAo+PiAtICogQG1lbWJlcjogICAgdGhlIG5hbWUgb2YgdGhlIGxpc3RfaGVh ZCB3aXRoaW4gdGhlIHN0cnVjdC4KPj4gLSAqCj4+IC0gKiBQcmVwYXJlcyBhIHBvcyBlbnRyeSBm b3IgdXNlIGFzIGEgc3RhcnQgcG9pbnQgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSgp Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfcHJlcGFyZV9lbnRyeShwb3MsIGhlYWQsIG1lbWJl cikgXAo+PiAtICAgICAgICgocG9zKSA/IDogbGlzdF9lbnRyeShoZWFkLCB0eXBlb2YoKnBvcyks IG1lbWJlcikpCj4+IC0KPj4gLS8qKgo+PiAtICogbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51 ZSAtIGNvbnRpbnVlIGl0ZXJhdGlvbiBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQo+PiAtICogQHBv czogICAgICAgdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KPj4gLSAqIEBoZWFk OiAgICAgIHRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCj4+IC0gKiBAbWVtYmVyOiAgICB0aGUgbmFt ZSBvZiB0aGUgbGlzdF9oZWFkIHdpdGhpbiB0aGUgc3RydWN0Lgo+PiAtICoKPj4gLSAqIENvbnRp bnVlIHRvIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUsIGNvbnRpbnVpbmcgYWZ0ZXIK Pj4gLSAqIHRoZSBjdXJyZW50IHBvc2l0aW9uLgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZm9y X2VhY2hfZW50cnlfY29udGludWUocG9zLCBoZWFkLCBtZW1iZXIpICAgICAgICAgICAgICAgIFwK Pj4gLSAgICAgICBmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9m KCpwb3MpLCBtZW1iZXIpOyAgXAo+PiAtICAgICAgICAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIu bmV4dCksICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7ICAgICAgICBcCj4+IC0gICAgICAgICAgICBw b3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkK Pj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2Ug LSBpdGVyYXRlIGJhY2t3YXJkcyBmcm9tIHRoZSBnaXZlbiBwb2ludAo+PiAtICogQHBvczogICAg ICAgdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KPj4gLSAqIEBoZWFkOiAgICAg IHRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCj4+IC0gKiBAbWVtYmVyOiAgICB0aGUgbmFtZSBvZiB0 aGUgbGlzdF9oZWFkIHdpdGhpbiB0aGUgc3RydWN0Lgo+PiAtICoKPj4gLSAqIFN0YXJ0IHRvIGl0 ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgYmFja3dhcmRzLCBjb250aW51aW5nIGFmdGVy Cj4+IC0gKiB0aGUgY3VycmVudCBwb3NpdGlvbi4KPj4gLSAqLwo+PiAtI2RlZmluZSBsaXN0X2Zv cl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocG9zLCBoZWFkLCBtZW1iZXIpICAgICAgICAg ICAgICAgIFwKPj4gLSAgICAgICBmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJl diwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOyAgXAo+PiAtICAgICAgICAgICAgcHJlZmV0Y2gocG9z LT5tZW1iZXIucHJldiksICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7ICAgICAgICBcCj4+IC0gICAg ICAgICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwg bWVtYmVyKSkKPj4gLQo+PiAtLyoqCj4+IC0gKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20gLSBp dGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQKPj4g LSAqIEBwb3M6ICAgICAgIHRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCj4+IC0g KiBAaGVhZDogICAgICB0aGUgaGVhZCBmb3IgeW91ciBsaXN0Lgo+PiAtICogQG1lbWJlcjogICAg dGhlIG5hbWUgb2YgdGhlIGxpc3RfaGVhZCB3aXRoaW4gdGhlIHN0cnVjdC4KPj4gLSAqCj4+IC0g KiBJdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGZyb20gY3VycmVu dCBwb3NpdGlvbi4KPj4gLSAqLwo+PiAtI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20o cG9zLCBoZWFkLCBtZW1iZXIpICAgICAgICAgICAgICAgICAgICBcCj4+IC0gICAgICAgZm9yICg7 IHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAgICAg IFwKPj4gLSAgICAgICAgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlw ZW9mKCpwb3MpLCBtZW1iZXIpKQo+PiAtCj4+IC0vKioKPj4gLSAqIGxpc3RfZm9yX2VhY2hfZW50 cnlfc2FmZSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgc2FmZSBhZ2FpbnN0IHJl bW92YWwgb2YgbGlzdCBlbnRyeQo+PiAtICogQHBvczogICAgICAgdGhlIHR5cGUgKiB0byB1c2Ug YXMgYSBsb29wIGN1cnNvci4KPj4gLSAqIEBuOiAgICAgICAgIGFub3RoZXIgdHlwZSAqIHRvIHVz ZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQo+PiAtICogQGhlYWQ6ICAgICAgdGhlIGhlYWQgZm9yIHlv dXIgbGlzdC4KPj4gLSAqIEBtZW1iZXI6ICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X2hlYWQgd2l0 aGluIHRoZSBzdHJ1Y3QuCj4+IC0gKi8KPj4gLSNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9z YWZlKHBvcywgbiwgaGVhZCwgbWVtYmVyKSAgICAgICAgICAgICAgICAgXAo+PiAtICAgICAgIGZv ciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwg ICAgICBcCj4+IC0gICAgICAgICAgICAgICBuID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0 LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7IFwKPj4gLSAgICAgICAgICAgICZwb3MtPm1lbWJlciAh PSAoaGVhZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAtICAgICAg ICAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiks IG1lbWJlcikpCj4+IC0KPj4gLS8qKgo+PiAtICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Nv bnRpbnVlCj4+IC0gKiBAcG9zOiAgICAgICB0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vy c29yLgo+PiAtICogQG46ICAgICAgICAgYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFy eSBzdG9yYWdlCj4+IC0gKiBAaGVhZDogICAgICB0aGUgaGVhZCBmb3IgeW91ciBsaXN0Lgo+PiAt ICogQG1lbWJlcjogICAgdGhlIG5hbWUgb2YgdGhlIGxpc3RfaGVhZCB3aXRoaW4gdGhlIHN0cnVj dC4KPj4gLSAqCj4+IC0gKiBJdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51 aW5nIGFmdGVyIGN1cnJlbnQgcG9pbnQsCj4+IC0gKiBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBs aXN0IGVudHJ5Lgo+PiAtICovCj4+IC0jZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9j b250aW51ZShwb3MsIG4sIGhlYWQsIG1lbWJlcikgICAgICAgICAgICAgICAgXAo+PiAtICAgICAg IGZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1l bWJlciksICAgICAgICAgIFwKPj4gLSAgICAgICAgICAgICAgIG4gPSBsaXN0X2VudHJ5KHBvcy0+ bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsgICAgICAgICBcCj4+IC0gICAgICAg ICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAo+PiAtICAgICAgICAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnko bi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCj4+IC0KPj4gLS8qKgo+PiAtICog bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Zyb20KPj4gLSAqIEBwb3M6ICAgICAgIHRoZSB0eXBl ICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCj4+IC0gKiBAbjogICAgICAgICBhbm90aGVyIHR5 cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKPj4gLSAqIEBoZWFkOiAgICAgIHRoZSBo ZWFkIGZvciB5b3VyIGxpc3QuCj4+IC0gKiBAbWVtYmVyOiAgICB0aGUgbmFtZSBvZiB0aGUgbGlz dF9oZWFkIHdpdGhpbiB0aGUgc3RydWN0Lgo+PiAtICoKPj4gLSAqIEl0ZXJhdGUgb3ZlciBsaXN0 IG9mIGdpdmVuIHR5cGUgZnJvbSBjdXJyZW50IHBvaW50LCBzYWZlIGFnYWluc3QKPj4gLSAqIHJl bW92YWwgb2YgbGlzdCBlbnRyeS4KPj4gLSAqLwo+PiAtI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmVfZnJvbShwb3MsIG4sIGhlYWQsIG1lbWJlcikgICAgICAgICAgICAgICAgICAgIFwK Pj4gLSAgICAgICBmb3IgKG4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigq cG9zKSwgbWVtYmVyKTsgICAgICAgICAgICBcCj4+IC0gICAgICAgICAgICAmcG9zLT5tZW1iZXIg IT0gKGhlYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ PiAtICAgICAgICAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5 cGVvZigqbiksIG1lbWJlcikpCj4+IC0KPj4gLS8qKgo+PiAtICogbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlX3JldmVyc2UKPj4gLSAqIEBwb3M6ICAgICAgIHRoZSB0eXBlICogdG8gdXNlIGFzIGEg bG9vcCBjdXJzb3IuCj4+IC0gKiBAbjogICAgICAgICBhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMg dGVtcG9yYXJ5IHN0b3JhZ2UKPj4gLSAqIEBoZWFkOiAgICAgIHRoZSBoZWFkIGZvciB5b3VyIGxp c3QuCj4+IC0gKiBAbWVtYmVyOiAgICB0aGUgbmFtZSBvZiB0aGUgbGlzdF9oZWFkIHdpdGhpbiB0 aGUgc3RydWN0Lgo+PiAtICoKPj4gLSAqIEl0ZXJhdGUgYmFja3dhcmRzIG92ZXIgbGlzdCBvZiBn aXZlbiB0eXBlLCBzYWZlIGFnYWluc3QgcmVtb3ZhbAo+PiAtICogb2YgbGlzdCBlbnRyeS4KPj4g LSAqLwo+PiAtI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShwb3MsIG4s IGhlYWQsIG1lbWJlcikgICAgICAgICBcCj4+IC0gICAgICAgZm9yIChwb3MgPSBsaXN0X2VudHJ5 KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLCAgICAgIFwKPj4gLSAgICAgICAg ICAgICAgIG4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVt YmVyKTsgXAo+PiAtICAgICAgICAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+IC0gICAgICAgICAgICBwb3MgPSBuLCBuID0g bGlzdF9lbnRyeShuLT5tZW1iZXIucHJldiwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKPj4gLQo+PiAg c3RydWN0IG9mZnNldCB7Cj4+ICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+PiAgICAg ICAgIHVuc2lnbmVkIG9mZnNldDsKPj4gLS0KPj4gMi4xNi4yLjM5NS5nMmUxODE4N2RmZC1nb29n Cj4+Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBh bWQtZ2Z4IG1haWxpbmcgbGlzdAo+IGFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4Cl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmFtZC1nZnggbWFpbGlu ZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=