From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Zachary Kanfer Newsgroups: gmane.emacs.bugs Subject: bug#9761: proposed list-buffers change -- revert buffer if point is in *Buffer List* buffer Date: Sat, 10 Dec 2011 01:48:39 -0500 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=e89a8ff1c094e245e904b3b74bf1 X-Trace: dough.gmane.org 1323499819 17174 80.91.229.12 (10 Dec 2011 06:50:19 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 10 Dec 2011 06:50:19 +0000 (UTC) Cc: 9761@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Dec 10 07:50:14 2011 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RZGlA-0002qW-Up for geb-bug-gnu-emacs@m.gmane.org; Sat, 10 Dec 2011 07:50:14 +0100 Original-Received: from localhost ([::1]:36390 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZGl9-0001xG-Go for geb-bug-gnu-emacs@m.gmane.org; Sat, 10 Dec 2011 01:50:11 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:45059) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZGl4-0001u5-QR for bug-gnu-emacs@gnu.org; Sat, 10 Dec 2011 01:50:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RZGl1-0004P9-Sc for bug-gnu-emacs@gnu.org; Sat, 10 Dec 2011 01:50:06 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:60110) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RZGl1-0004P5-OE for bug-gnu-emacs@gnu.org; Sat, 10 Dec 2011 01:50:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1RZGlx-0007WR-Vn for bug-gnu-emacs@gnu.org; Sat, 10 Dec 2011 01:51:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Zachary Kanfer Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 10 Dec 2011 06:51:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 9761 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 9761-submit@debbugs.gnu.org id=B9761.132349980728850 (code B ref 9761); Sat, 10 Dec 2011 06:51:01 +0000 Original-Received: (at 9761) by debbugs.gnu.org; 10 Dec 2011 06:50:07 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1RZGl2-0007VC-HI for submit@debbugs.gnu.org; Sat, 10 Dec 2011 01:50:06 -0500 Original-Received: from mail-pz0-f44.google.com ([209.85.210.44]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1RZGky-0007Uh-BN for 9761@debbugs.gnu.org; Sat, 10 Dec 2011 01:50:01 -0500 Original-Received: by dajz8 with SMTP id z8so3553061daj.3 for <9761@debbugs.gnu.org>; Fri, 09 Dec 2011 22:49:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=oQYMTVK0L2rdSyWOntjTbu9891Efk9gjumzoP8dqHkY=; b=MGQl9pxgnvP/ua777YYNVVM2DaUyp7NI80evdHcTFpnHpIEngrY0ceDO/JRc7ynjZU i4qkfyf8UAvXmbVaWsDXIe0ylXSawHRvnFEiazIyftqIg6ciFirfRZBWq3NuAl0cCe57 8kYFbF8R7obbjzKagHbNF5NQ5Qs+OKoT7kV6U= Original-Received: by 10.68.191.8 with SMTP id gu8mr12937224pbc.36.1323499740349; Fri, 09 Dec 2011 22:49:00 -0800 (PST) Original-Received: by 10.142.223.12 with HTTP; Fri, 9 Dec 2011 22:48:39 -0800 (PST) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Sat, 10 Dec 2011 01:51:01 -0500 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:54849 Archived-At: --e89a8ff1c094e245e904b3b74bf1 Content-Type: text/plain; charset=ISO-8859-1 I have included two diffs in this email. The first is the diff without whitespace, generated by bzr diff lisp/buff-menu.el --no-aliases --diff-options="-cp -w" . The second is the full diff, as generated by bzr diff lisp/buff-menu.el --no-aliases --diff-options=-cp . I introduced a `let` statement which wraps a large majority of the function, so a large part of the full diff is merely whitespace changes. The no-whitespace diff shows more clearly the code changes I've made. I could have used setq to avoid introducing a new level of nesting, but didn't want to leak new variables outside the function. I will change it, if advised that it's better practice. The majority of my changes happen near the end of the method. I get the *Buffer List* window, and the current window. If the *Buffer List* window exists, I select it. I then move point to the correct position, and restore the selected window if necessary. Diff #1 (diff ignoring whitespace): === modified file 'lisp/buff-menu.el' *** lisp/buff-menu.el 2011-09-18 20:43:20 +0000 --- lisp/buff-menu.el 2011-12-09 06:18:25 +0000 *************** For more information, see the function ` *** 807,812 **** --- 807,815 ---- (setq header (concat (propertize " " 'display '(space :align-to 0)) header))) (with-current-buffer (get-buffer-create "*Buffer List*") + (let ((line-number (line-number-at-pos)) + (column-number (current-column))) + (message (concat "line: " (number-to-string line-number) "\tcol: " (number-to-string column-number))) (setq buffer-read-only nil) (erase-buffer) (setq standard-output (current-buffer)) *************** For more information, see the function ` *** 857,863 **** ?\s))) (unless file ;; No visited file. Check local value of ! ;; list-buffers-directory and, for Info buffers, ;; Info-current-file. (cond ((and (boundp 'list-buffers-directory) list-buffers-directory) --- 860,866 ---- ?\s))) (unless file ;; No visited file. Check local value of ! ;; list-buffers-diectory and, for Info buffers, ;; Info-current-file. (cond ((and (boundp 'list-buffers-directory) list-buffers-directory) *************** For more information, see the function ` *** 896,903 **** (string< (nth Buffer-menu-sort-column a) (nth Buffer-menu-sort-column b))))) list)) - (if (eq (car buffer) old-buffer) - (setq desired-point (point))) (insert (cadr buffer) ;; Put the buffer name into a text property ;; so we don't have to extract it from the text. --- 899,904 ---- *************** For more information, see the function ` *** 929,941 **** (Buffer-menu-mode) (when Buffer-menu-use-header-line (setq header-line-format header)) ! ;; DESIRED-POINT doesn't have to be set; it is not when the ! ;; current buffer is not displayed for some reason. ! (and desired-point ! (goto-char desired-point)) (setq Buffer-menu-files-only files-only) (setq Buffer-menu--buffers buffer-list) (set-buffer-modified-p nil) ! (current-buffer)))) ;;; buff-menu.el ends here --- 930,950 ---- (Buffer-menu-mode) (when Buffer-menu-use-header-line (setq header-line-format header)) ! (let ((buffer-list-window (get-window-with-predicate ! (lambda (window) ! (string= "*Buffer List*" ! (buffer-name (window-buffer window)))))) ! (current-window (selected-window))) ! (when buffer-list-window ! (select-window buffer-list-window)) ! (goto-char (point-min)) ! (forward-line (1- line-number)) ! (forward-char column-number) ! (when buffer-list-window ! (select-window current-window))) (setq Buffer-menu-files-only files-only) (setq Buffer-menu--buffers buffer-list) (set-buffer-modified-p nil) ! (current-buffer))))) ;;; buff-menu.el ends here Diff #2 (full diff): === modified file 'lisp/buff-menu.el' *** lisp/buff-menu.el 2011-09-18 20:43:20 +0000 --- lisp/buff-menu.el 2011-12-09 06:18:25 +0000 *************** For more information, see the function ` *** 807,941 **** (setq header (concat (propertize " " 'display '(space :align-to 0)) header))) (with-current-buffer (get-buffer-create "*Buffer List*") ! (setq buffer-read-only nil) ! (erase-buffer) ! (setq standard-output (current-buffer)) ! ;; Force L2R direction, to avoid messing the display if the ! ;; first buffer in the list happens to begin with a strong R2L ! ;; character. ! (setq bidi-paragraph-direction 'left-to-right) ! (unless Buffer-menu-use-header-line ! ;; Use U+2014 (EM DASH) to underline if possible, else use ASCII ! ;; (i.e. U+002D, HYPHEN-MINUS). ! (let ((underline (if (char-displayable-p ?\u2014) ?\u2014 ?-))) ! (insert header ! (apply 'string ! (mapcar (lambda (c) ! (if (memq c '(?\n ?\s)) c underline)) ! header))))) ! ;; Collect info for every buffer we're interested in. ! (dolist (buffer (or buffer-list ! (buffer-list ! (when Buffer-menu-use-frame-buffer-list ! (selected-frame))))) ! (with-current-buffer buffer ! (let ((name (buffer-name)) ! (file buffer-file-name)) ! (unless (and (not buffer-list) ! (or ! ;; Don't mention internal buffers. ! (and (string= (substring name 0 1) " ") (null file)) ! ;; Maybe don't mention buffers without files. ! (and files-only (not file)) ! (string= name "*Buffer List*"))) ! ;; Otherwise output info. ! (let ((mode (concat (format-mode-line mode-name nil nil buffer) ! (if mode-line-process ! (format-mode-line mode-line-process ! nil nil buffer)))) ! (bits (string ! (if (eq buffer old-buffer) ?. ?\s) ! ;; Handle readonly status. The output buffer ! ;; is special cased to appear readonly; it is ! ;; actually made so at a later date. ! (if (or (eq buffer standard-output) ! buffer-read-only) ! ?% ?\s) ! ;; Identify modified buffers. ! (if (buffer-modified-p) ?* ?\s) ! ;; Space separator. ! ?\s))) ! (unless file ! ;; No visited file. Check local value of ! ;; list-buffers-directory and, for Info buffers, ! ;; Info-current-file. ! (cond ((and (boundp 'list-buffers-directory) ! list-buffers-directory) ! (setq file list-buffers-directory)) ! ((eq major-mode 'Info-mode) ! (setq file Info-current-file) ! (cond ! ((equal file "dir") ! (setq file "*Info Directory*")) ! ((eq file 'apropos) ! (setq file "*Info Apropos*")) ! ((eq file 'history) ! (setq file "*Info History*")) ! ((eq file 'toc) ! (setq file "*Info TOC*")) ! ((not (stringp file)) ;; avoid errors ! (setq file nil)) ! (t ! (setq file (concat "(" ! (file-name-nondirectory file) ! ") " ! Info-current-node))))))) ! (push (list buffer bits name (buffer-size) mode file) ! list)))))) ! ;; Preserve the original buffer-list ordering, just in case. ! (setq list (nreverse list)) ! ;; Place the buffers's info in the output buffer, sorted if necessary. ! (dolist (buffer ! (if Buffer-menu-sort-column ! (sort list ! (if (eq Buffer-menu-sort-column 3) ! (lambda (a b) ! (< (nth Buffer-menu-sort-column a) ! (nth Buffer-menu-sort-column b))) ! (lambda (a b) ! (string< (nth Buffer-menu-sort-column a) ! (nth Buffer-menu-sort-column b))))) ! list)) ! (if (eq (car buffer) old-buffer) ! (setq desired-point (point))) ! (insert (cadr buffer) ! ;; Put the buffer name into a text property ! ;; so we don't have to extract it from the text. ! ;; This way we avoid problems with unusual buffer names. ! (let ((name (nth 2 buffer)) ! (size (int-to-string (nth 3 buffer)))) ! (Buffer-menu-buffer+size name size ! `(buffer-name ,name ! buffer ,(car buffer) ! font-lock-face buffer-menu-buffer ! mouse-face highlight ! help-echo ! ,(if (>= (length name) ! (- Buffer-menu-buffer+size-width ! (max (length size) 3) ! 2)) ! name ! "mouse-2: select this buffer")))) ! " " ! (if (> (string-width (nth 4 buffer)) Buffer-menu-mode-width) ! (truncate-string-to-width (nth 4 buffer) ! Buffer-menu-mode-width) ! (nth 4 buffer))) ! (when (nth 5 buffer) ! (indent-to (+ Buffer-menu-buffer-column Buffer-menu-buffer+size-width ! Buffer-menu-mode-width 4) 1) ! (princ (abbreviate-file-name (nth 5 buffer)))) ! (princ "\n")) ! (Buffer-menu-mode) ! (when Buffer-menu-use-header-line ! (setq header-line-format header)) ! ;; DESIRED-POINT doesn't have to be set; it is not when the ! ;; current buffer is not displayed for some reason. ! (and desired-point ! (goto-char desired-point)) ! (setq Buffer-menu-files-only files-only) ! (setq Buffer-menu--buffers buffer-list) ! (set-buffer-modified-p nil) ! (current-buffer)))) ;;; buff-menu.el ends here --- 807,950 ---- (setq header (concat (propertize " " 'display '(space :align-to 0)) header))) (with-current-buffer (get-buffer-create "*Buffer List*") ! (let ((line-number (line-number-at-pos)) ! (column-number (current-column))) ! (message (concat "line: " (number-to-string line-number) "\tcol: " (number-to-string column-number))) ! (setq buffer-read-only nil) ! (erase-buffer) ! (setq standard-output (current-buffer)) ! ;; Force L2R direction, to avoid messing the display if the ! ;; first buffer in the list happens to begin with a strong R2L ! ;; character. ! (setq bidi-paragraph-direction 'left-to-right) ! (unless Buffer-menu-use-header-line ! ;; Use U+2014 (EM DASH) to underline if possible, else use ASCII ! ;; (i.e. U+002D, HYPHEN-MINUS). ! (let ((underline (if (char-displayable-p ?\u2014) ?\u2014 ?-))) ! (insert header ! (apply 'string ! (mapcar (lambda (c) ! (if (memq c '(?\n ?\s)) c underline)) ! header))))) ! ;; Collect info for every buffer we're interested in. ! (dolist (buffer (or buffer-list ! (buffer-list ! (when Buffer-menu-use-frame-buffer-list ! (selected-frame))))) ! (with-current-buffer buffer ! (let ((name (buffer-name)) ! (file buffer-file-name)) ! (unless (and (not buffer-list) ! (or ! ;; Don't mention internal buffers. ! (and (string= (substring name 0 1) " ") (null file)) ! ;; Maybe don't mention buffers without files. ! (and files-only (not file)) ! (string= name "*Buffer List*"))) ! ;; Otherwise output info. ! (let ((mode (concat (format-mode-line mode-name nil nil buffer) ! (if mode-line-process ! (format-mode-line mode-line-process ! nil nil buffer)))) ! (bits (string ! (if (eq buffer old-buffer) ?. ?\s) ! ;; Handle readonly status. The output buffer ! ;; is special cased to appear readonly; it is ! ;; actually made so at a later date. ! (if (or (eq buffer standard-output) ! buffer-read-only) ! ?% ?\s) ! ;; Identify modified buffers. ! (if (buffer-modified-p) ?* ?\s) ! ;; Space separator. ! ?\s))) ! (unless file ! ;; No visited file. Check local value of ! ;; list-buffers-diectory and, for Info buffers, ! ;; Info-current-file. ! (cond ((and (boundp 'list-buffers-directory) ! list-buffers-directory) ! (setq file list-buffers-directory)) ! ((eq major-mode 'Info-mode) ! (setq file Info-current-file) ! (cond ! ((equal file "dir") ! (setq file "*Info Directory*")) ! ((eq file 'apropos) ! (setq file "*Info Apropos*")) ! ((eq file 'history) ! (setq file "*Info History*")) ! ((eq file 'toc) ! (setq file "*Info TOC*")) ! ((not (stringp file)) ;; avoid errors ! (setq file nil)) ! (t ! (setq file (concat "(" ! (file-name-nondirectory file) ! ") " ! Info-current-node))))))) ! (push (list buffer bits name (buffer-size) mode file) ! list)))))) ! ;; Preserve the original buffer-list ordering, just in case. ! (setq list (nreverse list)) ! ;; Place the buffers's info in the output buffer, sorted if necessary. ! (dolist (buffer ! (if Buffer-menu-sort-column ! (sort list ! (if (eq Buffer-menu-sort-column 3) ! (lambda (a b) ! (< (nth Buffer-menu-sort-column a) ! (nth Buffer-menu-sort-column b))) ! (lambda (a b) ! (string< (nth Buffer-menu-sort-column a) ! (nth Buffer-menu-sort-column b))))) ! list)) ! (insert (cadr buffer) ! ;; Put the buffer name into a text property ! ;; so we don't have to extract it from the text. ! ;; This way we avoid problems with unusual buffer names. ! (let ((name (nth 2 buffer)) ! (size (int-to-string (nth 3 buffer)))) ! (Buffer-menu-buffer+size name size ! `(buffer-name ,name ! buffer ,(car buffer) ! font-lock-face buffer-menu-buffer ! mouse-face highlight ! help-echo ! ,(if (>= (length name) ! (- Buffer-menu-buffer+size-width ! (max (length size) 3) ! 2)) ! name ! "mouse-2: select this buffer")))) ! " " ! (if (> (string-width (nth 4 buffer)) Buffer-menu-mode-width) ! (truncate-string-to-width (nth 4 buffer) ! Buffer-menu-mode-width) ! (nth 4 buffer))) ! (when (nth 5 buffer) ! (indent-to (+ Buffer-menu-buffer-column Buffer-menu-buffer+size-width ! Buffer-menu-mode-width 4) 1) ! (princ (abbreviate-file-name (nth 5 buffer)))) ! (princ "\n")) ! (Buffer-menu-mode) ! (when Buffer-menu-use-header-line ! (setq header-line-format header)) ! (let ((buffer-list-window (get-window-with-predicate ! (lambda (window) ! (string= "*Buffer List*" ! (buffer-name (window-buffer window)))))) ! (current-window (selected-window))) ! (when buffer-list-window ! (select-window buffer-list-window)) ! (goto-char (point-min)) ! (forward-line (1- line-number)) ! (forward-char column-number) ! (when buffer-list-window ! (select-window current-window))) ! (setq Buffer-menu-files-only files-only) ! (setq Buffer-menu--buffers buffer-list) ! (set-buffer-modified-p nil) ! (current-buffer))))) ;;; buff-menu.el ends here -Zachary Kanfer On Sun, Oct 16, 2011 at 11:50 AM, Stefan Monnier wrote: > > ! (display-buffer (list-buffers-noselect files-only))) > [...] > > ! (if (string= (buffer-name) > > ! "*Buffer List*") > > ! (revert-buffer) > > ! (display-buffer (list-buffers-noselect files-only)))) > > I don't think calling revert-buffer is right. Much better would be for > list-buffer-noselect to try to preserve point when reusing a buffer > rather than creating a new one. > > > Stefan > --e89a8ff1c094e245e904b3b74bf1 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 SSBoYXZlIGluY2x1ZGVkIHR3byBkaWZmcyBpbiB0aGlzIGVtYWlsLiBUaGUgZmlyc3QgaXMgdGhl IGRpZmYgd2l0aG91dCB3aGl0ZXNwYWNlLCBnZW5lcmF0ZWQgYnkgYnpyIGRpZmYgbGlzcC9idWZm LW1lbnUuZWwgLS1uby1hbGlhc2VzIC0tZGlmZi1vcHRpb25zPSZxdW90Oy1jcCAtdyZxdW90OyAu IFRoZSBzZWNvbmQgaXMgdGhlIGZ1bGwgZGlmZiwgYXMgZ2VuZXJhdGVkIGJ5IGJ6ciBkaWZmIGxp c3AvYnVmZi1tZW51LmVsIC0tbm8tYWxpYXNlcyAtLWRpZmYtb3B0aW9ucz0tY3AgLiBJIGludHJv ZHVjZWQgYSBgbGV0YCBzdGF0ZW1lbnQgd2hpY2ggd3JhcHMgYSBsYXJnZSBtYWpvcml0eSBvZiB0 aGUgZnVuY3Rpb24sIHNvIGEgbGFyZ2UgcGFydCBvZiB0aGUgZnVsbCBkaWZmIGlzIG1lcmVseSB3 aGl0ZXNwYWNlIGNoYW5nZXMuIFRoZSBuby13aGl0ZXNwYWNlIGRpZmYgc2hvd3MgbW9yZSBjbGVh cmx5IHRoZSBjb2RlIGNoYW5nZXMgSSYjMzk7dmUgbWFkZS4gSSBjb3VsZCBoYXZlIHVzZWQgc2V0 cSB0byBhdm9pZCBpbnRyb2R1Y2luZyBhIG5ldyBsZXZlbCBvZiBuZXN0aW5nLCBidXQgZGlkbiYj Mzk7dCB3YW50IHRvIGxlYWsgbmV3IHZhcmlhYmxlcyBvdXRzaWRlIHRoZSBmdW5jdGlvbi4gSSB3 aWxsIGNoYW5nZSBpdCwgaWYgYWR2aXNlZCB0aGF0IGl0JiMzOTtzIGJldHRlciBwcmFjdGljZS48 YnI+Cgo8YnI+VGhlIG1ham9yaXR5IG9mIG15IGNoYW5nZXMgaGFwcGVuIG5lYXIgdGhlIGVuZCBv ZiB0aGUgbWV0aG9kLiBJIGdldCB0aGUgKkJ1ZmZlciBMaXN0KiB3aW5kb3csIGFuZCB0aGUgY3Vy cmVudCB3aW5kb3cuIElmIHRoZSAqQnVmZmVyIExpc3QqIHdpbmRvdyBleGlzdHMsIEkgc2VsZWN0 IGl0LiBJIHRoZW4gbW92ZSBwb2ludCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYW5kIHJlc3Rv cmUgdGhlIHNlbGVjdGVkIHdpbmRvdyBpZiBuZWNlc3NhcnkuPGJyPgoKPGJyPkRpZmYgIzEgKGRp ZmYgaWdub3Jpbmcgd2hpdGVzcGFjZSk6PGJyPjxicj49PT0gbW9kaWZpZWQgZmlsZSAmIzM5O2xp c3AvYnVmZi1tZW51LmVsJiMzOTs8YnI+KioqIGxpc3AvYnVmZi1tZW51LmVsoKCgIDIwMTEtMDkt MTggMjA6NDM6MjAgKzAwMDA8YnI+LS0tIGxpc3AvYnVmZi1tZW51LmVsoKCgIDIwMTEtMTItMDkg MDY6MTg6MjUgKzAwMDA8YnI+KioqKioqKioqKioqKioqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBz ZWUgdGhlIGZ1bmN0aW9uIGA8YnI+CgoqKiogODA3LDgxMiAqKioqPGJyPi0tLSA4MDcsODE1IC0t LS08YnI+oKCgoKCgoCAoc2V0cSBoZWFkZXIgKGNvbmNhdCAocHJvcGVydGl6ZSAmcXVvdDsgJnF1 b3Q7ICYjMzk7ZGlzcGxheSAmIzM5OyhzcGFjZSA6YWxpZ24tdG8gMCkpPGJyPqAgoKCgIKCgoCCg oKAgoKAgaGVhZGVyKSkpPGJyPqCgoKCgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChnZXQtYnVmZmVy LWNyZWF0ZSAmcXVvdDsqQnVmZmVyIExpc3QqJnF1b3Q7KTxicj4KCiugoKCgoKAgKGxldCAoKGxp bmUtbnVtYmVyIChsaW5lLW51bWJlci1hdC1wb3MpKTxicj4roKCgoKCgoKCgoKCgIChjb2x1bW4t bnVtYmVyIChjdXJyZW50LWNvbHVtbikpKTxicj4roKCgoKCgoKAgKG1lc3NhZ2UgKGNvbmNhdCAm cXVvdDtsaW5lOiAmcXVvdDsgKG51bWJlci10by1zdHJpbmcgbGluZS1udW1iZXIpICZxdW90O1x0 Y29sOiAmcXVvdDsgKG51bWJlci10by1zdHJpbmcgY29sdW1uLW51bWJlcikpKTxicj4KCqCgoKCg oKCgoCAoc2V0cSBidWZmZXItcmVhZC1vbmx5IG5pbCk8YnI+oKCgoKCgoKCgIChlcmFzZS1idWZm ZXIpPGJyPqCgoKCgoKCgoCAoc2V0cSBzdGFuZGFyZC1vdXRwdXQgKGN1cnJlbnQtYnVmZmVyKSk8 YnI+KioqKioqKioqKioqKioqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZ1bmN0aW9u IGA8YnI+KioqIDg1Nyw4NjMgKioqKjxicj6gIKCgoCCgoKAgoKCgIKCgID9ccykpKTxicj4KCqAg oKCgIKCgoCAodW5sZXNzIGZpbGU8YnI+oCCgoKAgoKCgIKAgOzsgTm8gdmlzaXRlZCBmaWxlLqAg Q2hlY2sgbG9jYWwgdmFsdWUgb2Y8YnI+ISCgoKAgoKCgIKAgOzsgbGlzdC1idWZmZXJzLWRpcmVj dG9yeSBhbmQsIGZvciBJbmZvIGJ1ZmZlcnMsPGJyPqAgoKCgIKCgoCCgIDs7IEluZm8tY3VycmVu dC1maWxlLjxicj6gIKCgoCCgoKAgoCAoY29uZCAoKGFuZCAoYm91bmRwICYjMzk7bGlzdC1idWZm ZXJzLWRpcmVjdG9yeSk8YnI+CgqgIKCgoCCgoKAgoKCgIKCgoKCgIGxpc3QtYnVmZmVycy1kaXJl Y3RvcnkpPGJyPi0tLSA4NjAsODY2IC0tLS08YnI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgID9ccykpKTxicj6goKCgoKCgoKCgoKCgoKCgoKCgICh1bmxlc3MgZmlsZTxicj6goKCgoKCg oKCgoKCgoKCgoKCgoKAgOzsgTm8gdmlzaXRlZCBmaWxlLqAgQ2hlY2sgbG9jYWwgdmFsdWUgb2Y8 YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgIDs7IGxpc3QtYnVmZmVycy1kaWVjdG9yeSBhbmQsIGZv ciBJbmZvIGJ1ZmZlcnMsPGJyPgoKoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDs7IEluZm8tY3VycmVu dC1maWxlLjxicj6goKCgoKCgoKCgoKCgoKCgoKCgoKAgKGNvbmQgKChhbmQgKGJvdW5kcCAmIzM5 O2xpc3QtYnVmZmVycy1kaXJlY3RvcnkpPGJyPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCBsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5KTxicj4qKioqKioqKioqKioqKiogRm9yIG1vcmUg aW5mb3JtYXRpb24sIHNlZSB0aGUgZnVuY3Rpb24gYDxicj4KCioqKiA4OTYsOTAzICoqKio8YnI+ oCCgoKAgoKCgIKCgoCCgoKCgIChzdHJpbmcmbHQ7IChudGggQnVmZmVyLW1lbnUtc29ydC1jb2x1 bW4gYSk8YnI+oCCgoKAgoKCgIKCgoCCgoKAgoKCgoKAgKG50aCBCdWZmZXItbWVudS1zb3J0LWNv bHVtbiBiKSkpKSk8YnI+oCCgoKAgoKCgIKBsaXN0KSk8YnI+LSCgoKAgKGlmIChlcSAoY2FyIGJ1 ZmZlcikgb2xkLWJ1ZmZlcik8YnI+LSCgoKAgoKCgIChzZXRxIGRlc2lyZWQtcG9pbnQgKHBvaW50 KSkpPGJyPgoKoCCgoKAgKGluc2VydCAoY2FkciBidWZmZXIpPGJyPqAgoKCgIKCgoCA7OyBQdXQg dGhlIGJ1ZmZlciBuYW1lIGludG8gYSB0ZXh0IHByb3BlcnR5PGJyPqAgoKCgIKCgoCA7OyBzbyB3 ZSBkb24mIzM5O3QgaGF2ZSB0byBleHRyYWN0IGl0IGZyb20gdGhlIHRleHQuPGJyPi0tLSA4OTks OTA0IC0tLS08YnI+KioqKioqKioqKioqKioqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhl IGZ1bmN0aW9uIGA8YnI+CgoqKiogOTI5LDk0MSAqKioqPGJyPqCgoKCgoKAgKEJ1ZmZlci1tZW51 LW1vZGUpPGJyPqCgoKCgoKAgKHdoZW4gQnVmZmVyLW1lbnUtdXNlLWhlYWRlci1saW5lPGJyPqAg oKCgIChzZXRxIGhlYWRlci1saW5lLWZvcm1hdCBoZWFkZXIpKTxicj4hoKCgoKCgIDs7IERFU0lS RUQtUE9JTlQgZG9lc24mIzM5O3QgaGF2ZSB0byBiZSBzZXQ7IGl0IGlzIG5vdCB3aGVuIHRoZTxi cj4hoKCgoKCgIDs7IGN1cnJlbnQgYnVmZmVyIGlzIG5vdCBkaXNwbGF5ZWQgZm9yIHNvbWUgcmVh c29uLjxicj4KCiGgoKCgoKAgKGFuZCBkZXNpcmVkLXBvaW50PGJyPiEgoKCgIKCgIChnb3RvLWNo YXIgZGVzaXJlZC1wb2ludCkpPGJyPqCgoKCgoKAgKHNldHEgQnVmZmVyLW1lbnUtZmlsZXMtb25s eSBmaWxlcy1vbmx5KTxicj6goKCgoKCgIChzZXRxIEJ1ZmZlci1tZW51LS1idWZmZXJzIGJ1ZmZl ci1saXN0KTxicj6goKCgoKCgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbmlsKTxicj4hoKCgoKCg IChjdXJyZW50LWJ1ZmZlcikpKSk8YnI+CgqgIDxicj6gIDs7OyBidWZmLW1lbnUuZWwgZW5kcyBo ZXJlPGJyPi0tLSA5MzAsOTUwIC0tLS08YnI+oKCgoKCgoKCgIChCdWZmZXItbWVudS1tb2RlKTxi cj6goKCgoKCgoKAgKHdoZW4gQnVmZmVyLW1lbnUtdXNlLWhlYWRlci1saW5lPGJyPqCgoKCgoKCg oKCgIChzZXRxIGhlYWRlci1saW5lLWZvcm1hdCBoZWFkZXIpKTxicj4hoKCgoKCgoKAgKGxldCAo KGJ1ZmZlci1saXN0LXdpbmRvdyAoZ2V0LXdpbmRvdy13aXRoLXByZWRpY2F0ZTxicj4KCiGgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAobGFtYmRhICh3aW5kb3cpPGJyPiGgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoc3RyaW5nPSAmcXVvdDsqQnVm ZmVyIExpc3QqJnF1b3Q7PGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoCAoYnVmZmVyLW5hbWUgKHdpbmRvdy1idWZmZXIgd2luZG93KSkpKSkpPGJy PgoKIaCgoKCgoKCgoKCgoKCgIChjdXJyZW50LXdpbmRvdyAoc2VsZWN0ZWQtd2luZG93KSkpPGJy PiGgoKCgoKCgoKCgICh3aGVuIGJ1ZmZlci1saXN0LXdpbmRvdzxicj4hoKCgoKCgoKCgoKCgIChz ZWxlY3Qtd2luZG93IGJ1ZmZlci1saXN0LXdpbmRvdykpPGJyPiGgoKCgoKCgoKCgIChnb3RvLWNo YXIgKHBvaW50LW1pbikpPGJyPiGgoKCgoKCgoKCgIChmb3J3YXJkLWxpbmUgKDEtIGxpbmUtbnVt YmVyKSk8YnI+CgohoKCgoKCgoKCgoCAoZm9yd2FyZC1jaGFyIGNvbHVtbi1udW1iZXIpPGJyPiGg oKCgoKCgoKCgICh3aGVuIGJ1ZmZlci1saXN0LXdpbmRvdzxicj4hoKCgoKCgoKCgoKCgIChzZWxl Y3Qtd2luZG93IGN1cnJlbnQtd2luZG93KSkpPGJyPqCgoKCgoKCgoCAoc2V0cSBCdWZmZXItbWVu dS1maWxlcy1vbmx5IGZpbGVzLW9ubHkpPGJyPqCgoKCgoKCgoCAoc2V0cSBCdWZmZXItbWVudS0t YnVmZmVycyBidWZmZXItbGlzdCk8YnI+CgqgoKCgoKCgoKAgKHNldC1idWZmZXItbW9kaWZpZWQt cCBuaWwpPGJyPiGgoKCgoKCgoCAoY3VycmVudC1idWZmZXIpKSkpKTxicj6gIDxicj6gIDs7OyBi dWZmLW1lbnUuZWwgZW5kcyBoZXJlPGJyPjxicj48YnI+PGJyPkRpZmYgIzIgKGZ1bGwgZGlmZik6 PGJyPjxicj49PT0gbW9kaWZpZWQgZmlsZSAmIzM5O2xpc3AvYnVmZi1tZW51LmVsJiMzOTs8YnI+ KioqIGxpc3AvYnVmZi1tZW51LmVsoKCgIDIwMTEtMDktMTggMjA6NDM6MjAgKzAwMDA8YnI+Cgot LS0gbGlzcC9idWZmLW1lbnUuZWygoKAgMjAxMS0xMi0wOSAwNjoxODoyNSArMDAwMDxicj4qKioq KioqKioqKioqKiogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZnVuY3Rpb24gYDxicj4q KiogODA3LDk0MSAqKioqPGJyPqCgoKCgoKAgKHNldHEgaGVhZGVyIChjb25jYXQgKHByb3BlcnRp emUgJnF1b3Q7ICZxdW90OyAmIzM5O2Rpc3BsYXkgJiMzOTsoc3BhY2UgOmFsaWduLXRvIDApKTxi cj4KCqAgoKCgIKCgoCCgoKAgoKAgaGVhZGVyKSkpPGJyPqCgoKCgICh3aXRoLWN1cnJlbnQtYnVm ZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAmcXVvdDsqQnVmZmVyIExpc3QqJnF1b3Q7KTxicj4hoKCg oKCgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgbmlsKTxicj4hoKCgoKCgIChlcmFzZS1idWZmZXIp PGJyPiGgoKCgoKAgKHNldHEgc3RhbmRhcmQtb3V0cHV0IChjdXJyZW50LWJ1ZmZlcikpPGJyPgoK IaCgoKCgoCA7OyBGb3JjZSBMMlIgZGlyZWN0aW9uLCB0byBhdm9pZCBtZXNzaW5nIHRoZSBkaXNw bGF5IGlmIHRoZTxicj4hoKCgoKCgIDs7IGZpcnN0IGJ1ZmZlciBpbiB0aGUgbGlzdCBoYXBwZW5z IHRvIGJlZ2luIHdpdGggYSBzdHJvbmcgUjJMPGJyPiGgoKCgoKAgOzsgY2hhcmFjdGVyLjxicj4h oKCgoKCgIChzZXRxIGJpZGktcGFyYWdyYXBoLWRpcmVjdGlvbiAmIzM5O2xlZnQtdG8tcmlnaHQp PGJyPgoKIaCgoKCgoCAodW5sZXNzIEJ1ZmZlci1tZW51LXVzZS1oZWFkZXItbGluZTxicj4hoKCg oKCgoKAgOzsgVXNlIFUrMjAxNCAoRU0gREFTSCkgdG8gdW5kZXJsaW5lIGlmIHBvc3NpYmxlLCBl bHNlIHVzZSBBU0NJSTxicj4hoKCgoKCgoKAgOzsgKGkuZS4gVSswMDJELCBIWVBIRU4tTUlOVVMp Ljxicj4hIKCgoCAobGV0ICgodW5kZXJsaW5lIChpZiAoY2hhci1kaXNwbGF5YWJsZS1wID9cdTIw MTQpID9cdTIwMTQgPy0pKSk8YnI+CgohIKCgoCCgIChpbnNlcnQgaGVhZGVyPGJyPiEgoKCgIKCg oCCgIChhcHBseSAmIzM5O3N0cmluZzxicj4hIKCgoCCgoKAgoKCgIKAobWFwY2FyIChsYW1iZGEg KGMpPGJyPiEgoKCgIKCgoCCgoKAgoKCgIKCgIChpZiAobWVtcSBjICYjMzk7KD9cbiA/XHMpKSBj IHVuZGVybGluZSkpPGJyPiEgoKCgIKCgoCCgoKAgoKCgIKBoZWFkZXIpKSkpKTxicj4hoKCgoKCg IDs7IENvbGxlY3QgaW5mbyBmb3IgZXZlcnkgYnVmZmVyIHdlJiMzOTtyZSBpbnRlcmVzdGVkIGlu Ljxicj4KCiGgoKCgoKAgKGRvbGlzdCAoYnVmZmVyIChvciBidWZmZXItbGlzdDxicj4hIKCgoCCg oKAgoKCgIKAgKGJ1ZmZlci1saXN0PGJyPiEgoKCgIKCgoCCgoKAgoKAgKHdoZW4gQnVmZmVyLW1l bnUtdXNlLWZyYW1lLWJ1ZmZlci1saXN0PGJyPiEgoKCgIKCgoCCgoKAgoKCgoCAoc2VsZWN0ZWQt ZnJhbWUpKSkpKTxicj4hIKCgoCAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXI8YnI+ISCgoKAg oCAobGV0ICgobmFtZSAoYnVmZmVyLW5hbWUpKTxicj4KCiEgoKCgIKCgoCAoZmlsZSBidWZmZXIt ZmlsZS1uYW1lKSk8YnI+ISCgoKAgoKCgICh1bmxlc3MgKGFuZCAobm90IGJ1ZmZlci1saXN0KTxi cj4hIKCgoCCgoKAgoKCgIKAob3I8YnI+ISCgoKAgoKCgIKCgoCCgIDs7IERvbiYjMzk7dCBtZW50 aW9uIGludGVybmFsIGJ1ZmZlcnMuPGJyPiEgoKCgIKCgoCCgoKAgoCAoYW5kIChzdHJpbmc9IChz dWJzdHJpbmcgbmFtZSAwIDEpICZxdW90OyAmcXVvdDspIChudWxsIGZpbGUpKTxicj4KCiEgoKCg IKCgoCCgoKAgoCA7OyBNYXliZSBkb24mIzM5O3QgbWVudGlvbiBidWZmZXJzIHdpdGhvdXQgZmls ZXMuPGJyPiEgoKCgIKCgoCCgoKAgoCAoYW5kIGZpbGVzLW9ubHkgKG5vdCBmaWxlKSk8YnI+ISCg oKAgoKCgIKCgoCCgIChzdHJpbmc9IG5hbWUgJnF1b3Q7KkJ1ZmZlciBMaXN0KiZxdW90OykpKTxi cj4hIKCgoCCgoKCgoCA7OyBPdGhlcndpc2Ugb3V0cHV0IGluZm8uPGJyPiEgoKCgIKCgoKCgIChs ZXQgKChtb2RlIChjb25jYXQgKGZvcm1hdC1tb2RlLWxpbmUgbW9kZS1uYW1lIG5pbCBuaWwgYnVm ZmVyKTxicj4KCiEgoKCgIKCgoCCgoKAgoKCgIKAgKGlmIG1vZGUtbGluZS1wcm9jZXNzPGJyPiEg oKCgIKCgoCCgoKAgoKCgIKCgoKCgIChmb3JtYXQtbW9kZS1saW5lIG1vZGUtbGluZS1wcm9jZXNz PGJyPiEgoKCgIKCgoCCgoKAgoKCgIKCgoCCgoKAgoKCgIG5pbCBuaWwgYnVmZmVyKSkpKTxicj4h IKCgoCCgoKAgoKCgIChiaXRzIChzdHJpbmc8YnI+ISCgoKAgoKCgIKCgoCCgoCAoaWYgKGVxIGJ1 ZmZlciBvbGQtYnVmZmVyKSA/LiA/XHMpPGJyPgoKISCgoKAgoKCgIKCgoCCgoCA7OyBIYW5kbGUg cmVhZG9ubHkgc3RhdHVzLqAgVGhlIG91dHB1dCBidWZmZXI8YnI+ISCgoKAgoKCgIKCgoCCgoCA7 OyBpcyBzcGVjaWFsIGNhc2VkIHRvIGFwcGVhciByZWFkb25seTsgaXQgaXM8YnI+ISCgoKAgoKCg IKCgoCCgoCA7OyBhY3R1YWxseSBtYWRlIHNvIGF0IGEgbGF0ZXIgZGF0ZS48YnI+ISCgoKAgoKCg IKCgoCCgoCAoaWYgKG9yIChlcSBidWZmZXIgc3RhbmRhcmQtb3V0cHV0KTxicj4KCiEgoKCgIKCg oCCgoKAgoKCgIKCgIGJ1ZmZlci1yZWFkLW9ubHkpPGJyPiEgoKCgIKCgoCCgoKAgoKCgoKCgID8l ID9ccyk8YnI+ISCgoKAgoKCgIKCgoCCgoCA7OyBJZGVudGlmeSBtb2RpZmllZCBidWZmZXJzLjxi cj4hIKCgoCCgoKAgoKCgIKCgIChpZiAoYnVmZmVyLW1vZGlmaWVkLXApID8qID9ccyk8YnI+ISCg oKAgoKCgIKCgoCCgoCA7OyBTcGFjZSBzZXBhcmF0b3IuPGJyPiEgoKCgIKCgoCCgoKAgoKAgP1xz KSkpPGJyPgoKISCgoKAgoKCgICh1bmxlc3MgZmlsZTxicj4hIKCgoCCgoKAgoCA7OyBObyB2aXNp dGVkIGZpbGUuoCBDaGVjayBsb2NhbCB2YWx1ZSBvZjxicj4hIKCgoCCgoKAgoCA7OyBsaXN0LWJ1 ZmZlcnMtZGlyZWN0b3J5IGFuZCwgZm9yIEluZm8gYnVmZmVycyw8YnI+ISCgoKAgoKCgIKAgOzsg SW5mby1jdXJyZW50LWZpbGUuPGJyPiEgoKCgIKCgoCCgIChjb25kICgoYW5kIChib3VuZHAgJiMz OTtsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5KTxicj4KCiEgoKCgIKCgoCCgoKAgoKCgoKAgbGlzdC1i dWZmZXJzLWRpcmVjdG9yeSk8YnI+ISCgoKAgoKCgIKCgoCCgKHNldHEgZmlsZSBsaXN0LWJ1ZmZl cnMtZGlyZWN0b3J5KSk8YnI+ISCgoKAgoKCgIKCgoCAoKGVxIG1ham9yLW1vZGUgJiMzOTtJbmZv LW1vZGUpPGJyPiEgoKCgIKCgoCCgoKAgoChzZXRxIGZpbGUgSW5mby1jdXJyZW50LWZpbGUpPGJy PiEgoKCgIKCgoCCgoKAgoChjb25kPGJyPgoKISCgoKAgoKCgIKCgoCCgICgoZXF1YWwgZmlsZSAm cXVvdDtkaXImcXVvdDspPGJyPiEgoKCgIKCgoCCgoKAgoKAgKHNldHEgZmlsZSAmcXVvdDsqSW5m byBEaXJlY3RvcnkqJnF1b3Q7KSk8YnI+ISCgoKAgoKCgIKCgoCCgICgoZXEgZmlsZSAmIzM5O2Fw cm9wb3MpPGJyPiEgoKCgIKCgoCCgoKAgoKAgKHNldHEgZmlsZSAmcXVvdDsqSW5mbyBBcHJvcG9z KiZxdW90OykpPGJyPiEgoKCgIKCgoCCgoKAgoCAoKGVxIGZpbGUgJiMzOTtoaXN0b3J5KTxicj4K CiEgoKCgIKCgoCCgoKAgoKAgKHNldHEgZmlsZSAmcXVvdDsqSW5mbyBIaXN0b3J5KiZxdW90Oykp PGJyPiEgoKCgIKCgoCCgoKAgoCAoKGVxIGZpbGUgJiMzOTt0b2MpPGJyPiEgoKCgIKCgoCCgoKAg oKAgKHNldHEgZmlsZSAmcXVvdDsqSW5mbyBUT0MqJnF1b3Q7KSk8YnI+ISCgoKAgoKCgIKCgoCCg ICgobm90IChzdHJpbmdwIGZpbGUpKaAgOzsgYXZvaWQgZXJyb3JzPGJyPiEgoKCgIKCgoCCgoKAg oKAgKHNldHEgZmlsZSBuaWwpKTxicj4KCiEgoKCgIKCgoCCgoKAgoCAodDxicj4hIKCgoCCgoKAg oKCgIKCgIChzZXRxIGZpbGUgKGNvbmNhdCAmcXVvdDsoJnF1b3Q7PGJyPiEgoKCgIKCgoCCgoKAg oKCgIKCgoCCgoKCgoCAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmaWxlKTxicj4hIKCgoCCgoKAg oKCgIKCgoCCgoKAgoKCgoKAgJnF1b3Q7KSAmcXVvdDs8YnI+ISCgoKAgoKCgIKCgoCCgoKAgoKCg IKCgoKCgIEluZm8tY3VycmVudC1ub2RlKSkpKSkpKTxicj4KCiEgoKCgIKCgoCAocHVzaCAobGlz dCBidWZmZXIgYml0cyBuYW1lIChidWZmZXItc2l6ZSkgbW9kZSBmaWxlKTxicj4hIKCgoCCgoKAg oKCgoKAgbGlzdCkpKSkpKTxicj4hoKCgoKCgIDs7IFByZXNlcnZlIHRoZSBvcmlnaW5hbCBidWZm ZXItbGlzdCBvcmRlcmluZywganVzdCBpbiBjYXNlLjxicj4hoKCgoKCgIChzZXRxIGxpc3QgKG5y ZXZlcnNlIGxpc3QpKTxicj4hoKCgoKCgIDs7IFBsYWNlIHRoZSBidWZmZXJzJiMzOTtzIGluZm8g aW4gdGhlIG91dHB1dCBidWZmZXIsIHNvcnRlZCBpZiBuZWNlc3NhcnkuPGJyPgoKIaCgoKCgoCAo ZG9saXN0IChidWZmZXI8YnI+ISCgoKAgoKCgoKCgIChpZiBCdWZmZXItbWVudS1zb3J0LWNvbHVt bjxicj4hIKCgoCCgoKAgoKAgKHNvcnQgbGlzdDxicj4hIKCgoCCgoKAgoKCgIKAoaWYgKGVxIEJ1 ZmZlci1tZW51LXNvcnQtY29sdW1uIDMpPGJyPiEgoKCgIKCgoCCgoKAgoKCgoCAobGFtYmRhIChh IGIpPGJyPiEgoKCgIKCgoCCgoKAgoKCgoKCgICgmbHQ7IChudGggQnVmZmVyLW1lbnUtc29ydC1j b2x1bW4gYSk8YnI+CgohIKCgoCCgoKAgoKCgIKCgoCCgIChudGggQnVmZmVyLW1lbnUtc29ydC1j b2x1bW4gYikpKTxicj4hIKCgoCCgoKAgoKCgIKCgIChsYW1iZGEgKGEgYik8YnI+ISCgoKAgoKCg IKCgoCCgoKCgIChzdHJpbmcmbHQ7IChudGggQnVmZmVyLW1lbnUtc29ydC1jb2x1bW4gYSk8YnI+ ISCgoKAgoKCgIKCgoCCgoKAgoKCgoKAgKG50aCBCdWZmZXItbWVudS1zb3J0LWNvbHVtbiBiKSkp KSk8YnI+CiEgoKCgIKCgoCCgbGlzdCkpPGJyPgohIKCgoCAoaWYgKGVxIChjYXIgYnVmZmVyKSBv bGQtYnVmZmVyKTxicj4hIKCgoCCgoKAgKHNldHEgZGVzaXJlZC1wb2ludCAocG9pbnQpKSk8YnI+ ISCgoKAgKGluc2VydCAoY2FkciBidWZmZXIpPGJyPiEgoKCgIKCgoCA7OyBQdXQgdGhlIGJ1ZmZl ciBuYW1lIGludG8gYSB0ZXh0IHByb3BlcnR5PGJyPiEgoKCgIKCgoCA7OyBzbyB3ZSBkb24mIzM5 O3QgaGF2ZSB0byBleHRyYWN0IGl0IGZyb20gdGhlIHRleHQuPGJyPgoKISCgoKAgoKCgIDs7IFRo aXMgd2F5IHdlIGF2b2lkIHByb2JsZW1zIHdpdGggdW51c3VhbCBidWZmZXIgbmFtZXMuPGJyPiEg oKCgIKCgoCAobGV0ICgobmFtZSAobnRoIDIgYnVmZmVyKSk8YnI+ISCgoKAgoKCgIKCgoKCgIChz aXplIChpbnQtdG8tc3RyaW5nIChudGggMyBidWZmZXIpKSkpPGJyPiEgoKCgIKCgoCCgIChCdWZm ZXItbWVudS1idWZmZXIrc2l6ZSBuYW1lIHNpemU8YnI+ISCgoKAgoKCgIKCgoKCgoKCgIGAoYnVm ZmVyLW5hbWUgLG5hbWU8YnI+CgohIKCgoCCgoKAgoKCgIKCgoCCgoKCgoKAgYnVmZmVyICwoY2Fy IGJ1ZmZlcik8YnI+ISCgoKAgoKCgIKCgoCCgoKAgoKCgoKCgIGZvbnQtbG9jay1mYWNlIGJ1ZmZl ci1tZW51LWJ1ZmZlcjxicj4hIKCgoCCgoKAgoKCgIKCgoCCgoKCgoKAgbW91c2UtZmFjZSBoaWdo bGlnaHQ8YnI+ISCgoKAgoKCgIKCgoCCgoKAgoKCgoKCgIGhlbHAtZWNobzxicj4hIKCgoCCgoKAg oKCgIKCgoCCgoKCgoKAgLChpZiAoJmd0Oz0gKGxlbmd0aCBuYW1lKTxicj4KCiEgoKCgIKCgoCCg oKAgoKCgIKCgoCCgoKAgKC0gQnVmZmVyLW1lbnUtYnVmZmVyK3NpemUtd2lkdGg8YnI+ISCgoKAg oKCgIKCgoCCgoKAgoKCgIKCgoCCgoCAobWF4IChsZW5ndGggc2l6ZSkgMyk8YnI+ISCgoKAgoKCg IKCgoCCgoKAgoKCgIKCgoCCgoCAyKSk8YnI+ISCgoKAgoKCgIKCgoCCgoKAgoKCgIKCgoCBuYW1l PGJyPiEgoKCgIKCgoCCgoKAgoKCgIKCgoCCgICZxdW90O21vdXNlLTI6IHNlbGVjdCB0aGlzIGJ1 ZmZlciZxdW90OykpKSk8YnI+CgohIKCgoCCgoKAgJnF1b3Q7oCAmcXVvdDs8YnI+ISCgoKAgoKCg IChpZiAoJmd0OyAoc3RyaW5nLXdpZHRoIChudGggNCBidWZmZXIpKSBCdWZmZXItbWVudS1tb2Rl LXdpZHRoKTxicj4hIKCgoCCgoKAgoKCgICh0cnVuY2F0ZS1zdHJpbmctdG8td2lkdGggKG50aCA0 IGJ1ZmZlcik8YnI+ISCgoKAgoKCgIKCgoCCgoKAgoKCgIKCgoKCgIEJ1ZmZlci1tZW51LW1vZGUt d2lkdGgpPGJyPiEgoKCgIKCgoCCgIChudGggNCBidWZmZXIpKSk8YnI+CgohIKCgoCAod2hlbiAo bnRoIDUgYnVmZmVyKTxicj4hIKCgoCCgIChpbmRlbnQtdG8gKCsgQnVmZmVyLW1lbnUtYnVmZmVy LWNvbHVtbiBCdWZmZXItbWVudS1idWZmZXIrc2l6ZS13aWR0aDxicj4hIKCgoCCgoKAgoKCgIEJ1 ZmZlci1tZW51LW1vZGUtd2lkdGggNCkgMSk8YnI+ISCgoKAgoCAocHJpbmMgKGFiYnJldmlhdGUt ZmlsZS1uYW1lIChudGggNSBidWZmZXIpKSkpPGJyPiEgoKCgIChwcmluYyAmcXVvdDtcbiZxdW90 OykpPGJyPgoKIaCgoKCgoCAoQnVmZmVyLW1lbnUtbW9kZSk8YnI+IaCgoKCgoCAod2hlbiBCdWZm ZXItbWVudS11c2UtaGVhZGVyLWxpbmU8YnI+ISCgoKAgKHNldHEgaGVhZGVyLWxpbmUtZm9ybWF0 IGhlYWRlcikpPGJyPiGgoKCgoKAgOzsgREVTSVJFRC1QT0lOVCBkb2VzbiYjMzk7dCBoYXZlIHRv IGJlIHNldDsgaXQgaXMgbm90IHdoZW4gdGhlPGJyPiGgoKCgoKAgOzsgY3VycmVudCBidWZmZXIg aXMgbm90IGRpc3BsYXllZCBmb3Igc29tZSByZWFzb24uPGJyPgoKIaCgoKCgoCAoYW5kIGRlc2ly ZWQtcG9pbnQ8YnI+ISCgoKAgoKAgKGdvdG8tY2hhciBkZXNpcmVkLXBvaW50KSk8YnI+IaCgoKCg oCAoc2V0cSBCdWZmZXItbWVudS1maWxlcy1vbmx5IGZpbGVzLW9ubHkpPGJyPiGgoKCgoKAgKHNl dHEgQnVmZmVyLW1lbnUtLWJ1ZmZlcnMgYnVmZmVyLWxpc3QpPGJyPiGgoKCgoKAgKHNldC1idWZm ZXItbW9kaWZpZWQtcCBuaWwpPGJyPiGgoKCgoKAgKGN1cnJlbnQtYnVmZmVyKSkpKTxicj4KCqAg PGJyPqAgOzs7IGJ1ZmYtbWVudS5lbCBlbmRzIGhlcmU8YnI+LS0tIDgwNyw5NTAgLS0tLTxicj6g oKCgoKCgIChzZXRxIGhlYWRlciAoY29uY2F0IChwcm9wZXJ0aXplICZxdW90OyAmcXVvdDsgJiMz OTtkaXNwbGF5ICYjMzk7KHNwYWNlIDphbGlnbi10byAwKSk8YnI+oCCgoKAgoKCgIKCgoCCgoCBo ZWFkZXIpKSk8YnI+oKCgoKAgKHdpdGgtY3VycmVudC1idWZmZXIgKGdldC1idWZmZXItY3JlYXRl ICZxdW90OypCdWZmZXIgTGlzdComcXVvdDspPGJyPgoKIaCgoKCgoCAobGV0ICgobGluZS1udW1i ZXIgKGxpbmUtbnVtYmVyLWF0LXBvcykpPGJyPiGgoKCgoKCgoKCgoKAgKGNvbHVtbi1udW1iZXIg KGN1cnJlbnQtY29sdW1uKSkpPGJyPiGgoKCgoKCgoCAobWVzc2FnZSAoY29uY2F0ICZxdW90O2xp bmU6ICZxdW90OyAobnVtYmVyLXRvLXN0cmluZyBsaW5lLW51bWJlcikgJnF1b3Q7XHRjb2w6ICZx dW90OyAobnVtYmVyLXRvLXN0cmluZyBjb2x1bW4tbnVtYmVyKSkpPGJyPgoKIaCgoKCgoKCgIChz ZXRxIGJ1ZmZlci1yZWFkLW9ubHkgbmlsKTxicj4hoKCgoKCgoKAgKGVyYXNlLWJ1ZmZlcik8YnI+ IaCgoKCgoKCgIChzZXRxIHN0YW5kYXJkLW91dHB1dCAoY3VycmVudC1idWZmZXIpKTxicj4hoKCg oKCgoKAgOzsgRm9yY2UgTDJSIGRpcmVjdGlvbiwgdG8gYXZvaWQgbWVzc2luZyB0aGUgZGlzcGxh eSBpZiB0aGU8YnI+IaCgoKCgoKCgIDs7IGZpcnN0IGJ1ZmZlciBpbiB0aGUgbGlzdCBoYXBwZW5z IHRvIGJlZ2luIHdpdGggYSBzdHJvbmcgUjJMPGJyPgoKIaCgoKCgoKCgIDs7IGNoYXJhY3Rlci48 YnI+IaCgoKCgoKCgIChzZXRxIGJpZGktcGFyYWdyYXBoLWRpcmVjdGlvbiAmIzM5O2xlZnQtdG8t cmlnaHQpPGJyPiGgoKCgoKCgoCAodW5sZXNzIEJ1ZmZlci1tZW51LXVzZS1oZWFkZXItbGluZTxi cj4hoKCgoKCgoKCgoCA7OyBVc2UgVSsyMDE0IChFTSBEQVNIKSB0byB1bmRlcmxpbmUgaWYgcG9z c2libGUsIGVsc2UgdXNlIEFTQ0lJPGJyPgohoKCgoKCgoKCgoCA7OyAoaS5lLiBVKzAwMkQsIEhZ UEhFTi1NSU5VUykuPGJyPgohoKCgoKCgoKCgoCAobGV0ICgodW5kZXJsaW5lIChpZiAoY2hhci1k aXNwbGF5YWJsZS1wID9cdTIwMTQpID9cdTIwMTQgPy0pKSk8YnI+IaCgoKCgoKCgoKCgoCAoaW5z ZXJ0IGhlYWRlcjxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGFwcGx5ICYjMzk7c3RyaW5nPGJy PiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKG1hcGNhciAobGFtYmRhIChjKTxicj4hoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoaWYgKG1lbXEgYyAmIzM5Oyg/XG4g P1xzKSkgYyB1bmRlcmxpbmUpKTxicj4KCiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCBoZWFkZXIpKSkpKTxicj4hoKCgoKCgoKAgOzsgQ29sbGVjdCBpbmZvIGZvciBldmVyeSBi dWZmZXIgd2UmIzM5O3JlIGludGVyZXN0ZWQgaW4uPGJyPiGgoKCgoKCgoCAoZG9saXN0IChidWZm ZXIgKG9yIGJ1ZmZlci1saXN0PGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChidWZm ZXItbGlzdDxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHdoZW4gQnVmZmVyLW1l bnUtdXNlLWZyYW1lLWJ1ZmZlci1saXN0PGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKAgKHNlbGVjdGVkLWZyYW1lKSkpKSk8YnI+IaCgoKCgoKCgoKAgKHdpdGgtY3VycmVudC1i dWZmZXIgYnVmZmVyPGJyPiGgoKCgoKCgoKCgoKAgKGxldCAoKG5hbWUgKGJ1ZmZlci1uYW1lKSk8 YnI+IaCgoKCgoKCgoKCgoKCgoKCgoCAoZmlsZSBidWZmZXItZmlsZS1uYW1lKSk8YnI+IaCgoKCg oKCgoKCgoKCgICh1bmxlc3MgKGFuZCAobm90IGJ1ZmZlci1saXN0KTxicj4KCiGgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKAgKG9yPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDs7 IERvbiYjMzk7dCBtZW50aW9uIGludGVybmFsIGJ1ZmZlcnMuPGJyPiGgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgIChhbmQgKHN0cmluZz0gKHN1YnN0cmluZyBuYW1lIDAgMSkgJnF1b3Q7ICZx dW90OykgKG51bGwgZmlsZSkpPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDs7IE1h eWJlIGRvbiYjMzk7dCBtZW50aW9uIGJ1ZmZlcnMgd2l0aG91dCBmaWxlcy48YnI+CgohoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoYW5kIGZpbGVzLW9ubHkgKG5vdCBmaWxlKSk8YnI+IaCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHN0cmluZz0gbmFtZSAmcXVvdDsqQnVmZmVyIExp c3QqJnF1b3Q7KSkpPGJyPiGgoKCgoKCgoKCgoKCgoKCgIDs7IE90aGVyd2lzZSBvdXRwdXQgaW5m by48YnI+IaCgoKCgoKCgoKCgoKCgoKAgKGxldCAoKG1vZGUgKGNvbmNhdCAoZm9ybWF0LW1vZGUt bGluZSBtb2RlLW5hbWUgbmlsIG5pbCBidWZmZXIpPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoCAoaWYgbW9kZS1saW5lLXByb2Nlc3M8YnI+IaCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGZvcm1hdC1tb2RlLWxpbmUgbW9kZS1saW5lLXBy b2Nlc3M8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKAgbmlsIG5pbCBidWZmZXIpKSkpPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCg oKAgKGJpdHMgKHN0cmluZzxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGlmIChl cSBidWZmZXIgb2xkLWJ1ZmZlcikgPy4gP1xzKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKAgOzsgSGFuZGxlIHJlYWRvbmx5IHN0YXR1cy6gIFRoZSBvdXRwdXQgYnVmZmVyPGJyPiGg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA7OyBpcyBzcGVjaWFsIGNhc2VkIHRvIGFwcGVh ciByZWFkb25seTsgaXQgaXM8YnI+CgohoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgOzsg YWN0dWFsbHkgbWFkZSBzbyBhdCBhIGxhdGVyIGRhdGUuPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCAoaWYgKG9yIChlcSBidWZmZXIgc3RhbmRhcmQtb3V0cHV0KTxicj4hoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBidWZmZXItcmVhZC1vbmx5KTxicj4hoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgID8lID9ccyk8YnI+CgohoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKAgOzsgSWRlbnRpZnkgbW9kaWZpZWQgYnVmZmVycy48YnI+IaCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChpZiAoYnVmZmVyLW1vZGlmaWVkLXApID8qID9ccyk8 YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDs7IFNwYWNlIHNlcGFyYXRvci48YnI+ IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgID9ccykpKTxicj4KCiGgoKCgoKCgoKCgoKCg oKCgoKAgKHVubGVzcyBmaWxlPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoCA7OyBObyB2aXNpdGVk IGZpbGUuoCBDaGVjayBsb2NhbCB2YWx1ZSBvZjxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKAgOzsg bGlzdC1idWZmZXJzLWRpZWN0b3J5IGFuZCwgZm9yIEluZm8gYnVmZmVycyw8YnI+IaCgoKCgoKCg oKCgoKCgoKCgoKCgIDs7IEluZm8tY3VycmVudC1maWxlLjxicj4KCiGgoKCgoKCgoKCgoKCgoKCg oKCgoCAoY29uZCAoKGFuZCAoYm91bmRwICYjMzk7bGlzdC1idWZmZXJzLWRpcmVjdG9yeSk8YnI+ IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGxpc3QtYnVmZmVycy1kaXJlY3Rvcnkp PGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHNldHEgZmlsZSBsaXN0LWJ1ZmZlcnMt ZGlyZWN0b3J5KSk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgICgoZXEgbWFqb3ItbW9k ZSAmIzM5O0luZm8tbW9kZSk8YnI+CgohoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChzZXRx IGZpbGUgSW5mby1jdXJyZW50LWZpbGUpPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg KGNvbmQ8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKChlcXVhbCBmaWxlICZxdW90 O2RpciZxdW90Oyk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChzZXRxIGZpbGUg JnF1b3Q7KkluZm8gRGlyZWN0b3J5KiZxdW90OykpPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKAgKChlcSBmaWxlICYjMzk7YXByb3Bvcyk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIChzZXRxIGZpbGUgJnF1b3Q7KkluZm8gQXByb3BvcyomcXVvdDspKTxicj4hoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoKGVxIGZpbGUgJiMzOTtoaXN0b3J5KTxicj4hoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHNldHEgZmlsZSAmcXVvdDsqSW5mbyBIaXN0b3J5 KiZxdW90OykpPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKChlcSBmaWxlICYj Mzk7dG9jKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHNldHEgZmlsZSAmcXVv dDsqSW5mbyBUT0MqJnF1b3Q7KSk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKChu b3QgKHN0cmluZ3AgZmlsZSkpoCA7OyBhdm9pZCBlcnJvcnM8YnI+IaCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgIChzZXRxIGZpbGUgbmlsKSk8YnI+CgohoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoCAodDxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHNldHEgZmlsZSAo Y29uY2F0ICZxdW90OygmcXVvdDs8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoCAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmaWxlKTxicj4hoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgICZxdW90OykgJnF1b3Q7 PGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBJ bmZvLWN1cnJlbnQtbm9kZSkpKSkpKSk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoCAocHVzaCAobGlz dCBidWZmZXIgYml0cyBuYW1lIChidWZmZXItc2l6ZSkgbW9kZSBmaWxlKTxicj4hoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIGxpc3QpKSkpKSk8YnI+IaCgoKCgoKCgIDs7IFByZXNlcnZlIHRoZSBv cmlnaW5hbCBidWZmZXItbGlzdCBvcmRlcmluZywganVzdCBpbiBjYXNlLjxicj4KCiGgoKCgoKCg oCAoc2V0cSBsaXN0IChucmV2ZXJzZSBsaXN0KSk8YnI+IaCgoKCgoKCgIDs7IFBsYWNlIHRoZSBi dWZmZXJzJiMzOTtzIGluZm8gaW4gdGhlIG91dHB1dCBidWZmZXIsIHNvcnRlZCBpZiBuZWNlc3Nh cnkuPGJyPiGgoKCgoKCgoCAoZG9saXN0IChidWZmZXI8YnI+IaCgoKCgoKCgoKCgoKCgoKCgIChp ZiBCdWZmZXItbWVudS1zb3J0LWNvbHVtbjxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChzb3J0 IGxpc3Q8YnI+CgohoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChpZiAoZXEgQnVmZmVyLW1l bnUtc29ydC1jb2x1bW4gMyk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGxh bWJkYSAoYSBiKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgICgmbHQ7IChu dGggQnVmZmVyLW1lbnUtc29ydC1jb2x1bW4gYSk8YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoCAobnRoIEJ1ZmZlci1tZW51LXNvcnQtY29sdW1uIGIpKSk8YnI+CgohoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGxhbWJkYSAoYSBiKTxicj4hoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoCAoc3RyaW5nJmx0OyAobnRoIEJ1ZmZlci1tZW51LXNvcnQtY29s dW1uIGEpPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIChudGgg QnVmZmVyLW1lbnUtc29ydC1jb2x1bW4gYikpKSkpPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgIGxp c3QpKTxicj4KCiGgoKCgoKCgoKCgIChpbnNlcnQgKGNhZHIgYnVmZmVyKTxicj4hoKCgoKCgoKCg oKCgoKCgoKCgIDs7IFB1dCB0aGUgYnVmZmVyIG5hbWUgaW50byBhIHRleHQgcHJvcGVydHk8YnI+ IaCgoKCgoKCgoKCgoKCgoKCgoCA7OyBzbyB3ZSBkb24mIzM5O3QgaGF2ZSB0byBleHRyYWN0IGl0 IGZyb20gdGhlIHRleHQuPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKAgOzsgVGhpcyB3YXkgd2UgYXZv aWQgcHJvYmxlbXMgd2l0aCB1bnVzdWFsIGJ1ZmZlciBuYW1lcy48YnI+CgohoKCgoKCgoKCgoKCg oKCgoKCgIChsZXQgKChuYW1lIChudGggMiBidWZmZXIpKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgIChzaXplIChpbnQtdG8tc3RyaW5nIChudGggMyBidWZmZXIpKSkpPGJyPiGgoKCgoKCg oKCgoKCgoKCgoKCgoCAoQnVmZmVyLW1lbnUtYnVmZmVyK3NpemUgbmFtZSBzaXplPGJyPiGgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgYChidWZmZXItbmFtZSAs bmFtZTxicj4KCiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoCBidWZmZXIgLChjYXIgYnVmZmVyKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgZm9udC1sb2NrLWZhY2Ug YnVmZmVyLW1lbnUtYnVmZmVyPGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBtb3VzZS1mYWNlIGhpZ2hsaWdodDxicj4KCiGgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBo ZWxwLWVjaG88YnI+IaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgICwoaWYgKCZndDs9IChsZW5ndGggbmFtZSk8YnI+IaCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg ICgtIEJ1ZmZlci1tZW51LWJ1ZmZlcitzaXplLXdpZHRoPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgICht YXggKGxlbmd0aCBzaXplKSAzKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgMikpPGJyPiGgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIG5h bWU8YnI+CgohoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKAgJnF1b3Q7bW91c2UtMjogc2VsZWN0IHRoaXMgYnVmZmVyJnF1b3Q7KSkp KTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgICZxdW90O6AgJnF1b3Q7PGJyPiGgoKCgoKCgoKCgoKCg oKCgoKAgKGlmICgmZ3Q7IChzdHJpbmctd2lkdGggKG50aCA0IGJ1ZmZlcikpIEJ1ZmZlci1tZW51 LW1vZGUtd2lkdGgpPGJyPgoKIaCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKHRydW5jYXRlLXN0cmlu Zy10by13aWR0aCAobnRoIDQgYnVmZmVyKTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgIEJ1ZmZlci1tZW51LW1vZGUtd2lkdGgpPGJyPiGgoKCgoKCg oKCgoKCgoKCgoKCgoCAobnRoIDQgYnVmZmVyKSkpPGJyPiGgoKCgoKCgoKCgICh3aGVuIChudGgg NSBidWZmZXIpPGJyPgoKIaCgoKCgoKCgoKCgoCAoaW5kZW50LXRvICgrIEJ1ZmZlci1tZW51LWJ1 ZmZlci1jb2x1bW4gQnVmZmVyLW1lbnUtYnVmZmVyK3NpemUtd2lkdGg8YnI+IaCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIEJ1ZmZlci1tZW51LW1vZGUtd2lkdGggNCkgMSk8YnI+IaCgoKCgoKCg oKCgoCAocHJpbmMgKGFiYnJldmlhdGUtZmlsZS1uYW1lIChudGggNSBidWZmZXIpKSkpPGJyPiGg oKCgoKCgoKCgIChwcmluYyAmcXVvdDtcbiZxdW90OykpPGJyPgoKIaCgoKCgoKCgIChCdWZmZXIt bWVudS1tb2RlKTxicj4hoKCgoKCgoKAgKHdoZW4gQnVmZmVyLW1lbnUtdXNlLWhlYWRlci1saW5l PGJyPiGgoKCgoKCgoKCgIChzZXRxIGhlYWRlci1saW5lLWZvcm1hdCBoZWFkZXIpKTxicj4hoKCg oKCgoKAgKGxldCAoKGJ1ZmZlci1saXN0LXdpbmRvdyAoZ2V0LXdpbmRvdy13aXRoLXByZWRpY2F0 ZTxicj4hoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgKGxhbWJkYSAod2luZG93 KTxicj4KCiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoc3RyaW5n PSAmcXVvdDsqQnVmZmVyIExpc3QqJnF1b3Q7PGJyPiGgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAoYnVmZmVyLW5hbWUgKHdpbmRvdy1idWZmZXIgd2lu ZG93KSkpKSkpPGJyPiGgoKCgoKCgoKCgoKCgoCAoY3VycmVudC13aW5kb3cgKHNlbGVjdGVkLXdp bmRvdykpKTxicj4KCiGgoKCgoKCgoKCgICh3aGVuIGJ1ZmZlci1saXN0LXdpbmRvdzxicj4hoKCg oKCgoKCgoKCgIChzZWxlY3Qtd2luZG93IGJ1ZmZlci1saXN0LXdpbmRvdykpPGJyPiGgoKCgoKCg oKCgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpPGJyPiGgoKCgoKCgoKCgIChmb3J3YXJkLWxpbmUg KDEtIGxpbmUtbnVtYmVyKSk8YnI+IaCgoKCgoKCgoKAgKGZvcndhcmQtY2hhciBjb2x1bW4tbnVt YmVyKTxicj4KCiGgoKCgoKCgoKCgICh3aGVuIGJ1ZmZlci1saXN0LXdpbmRvdzxicj4hoKCgoKCg oKCgoKCgIChzZWxlY3Qtd2luZG93IGN1cnJlbnQtd2luZG93KSkpPGJyPiGgoKCgoKCgoCAoc2V0 cSBCdWZmZXItbWVudS1maWxlcy1vbmx5IGZpbGVzLW9ubHkpPGJyPiGgoKCgoKCgoCAoc2V0cSBC dWZmZXItbWVudS0tYnVmZmVycyBidWZmZXItbGlzdCk8YnI+IaCgoKCgoKCgIChzZXQtYnVmZmVy LW1vZGlmaWVkLXAgbmlsKTxicj4KCiGgoKCgoKCgoCAoY3VycmVudC1idWZmZXIpKSkpKTxicj6g IDxicj6gIDs7OyBidWZmLW1lbnUuZWwgZW5kcyBoZXJlPGJyPjxicj4tWmFjaGFyeSBLYW5mZXI8 YnI+PGJyPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24gU3VuLCBPY3QgMTYsIDIwMTEg YXQgMTE6NTAgQU0sIFN0ZWZhbiBNb25uaWVyIDxzcGFuIGRpcj0ibHRyIj4mbHQ7PGEgaHJlZj0i bWFpbHRvOm1vbm5pZXJAaXJvLnVtb250cmVhbC5jYSI+bW9ubmllckBpcm8udW1vbnRyZWFsLmNh PC9hPiZndDs8L3NwYW4+IHdyb3RlOjxicj4KCjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90 ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3Bh ZGRpbmctbGVmdDoxZXgiPiZndDsgISCgIChkaXNwbGF5LWJ1ZmZlciAobGlzdC1idWZmZXJzLW5v c2VsZWN0IGZpbGVzLW9ubHkpKSk8YnI+ClsuLi5dPGJyPgo8ZGl2IGNsYXNzPSJpbSI+Jmd0OyAh IKAgKGlmIChzdHJpbmc9IChidWZmZXItbmFtZSk8YnI+CiZndDsgISCgIKAgoCCgIKAgoCCgIKAm cXVvdDsqQnVmZmVyIExpc3QqJnF1b3Q7KTxicj4KJmd0OyAhIKAgoCCgIChyZXZlcnQtYnVmZmVy KTxicj4KPC9kaXY+Jmd0OyAhIKAgoCAoZGlzcGxheS1idWZmZXIgKGxpc3QtYnVmZmVycy1ub3Nl bGVjdCBmaWxlcy1vbmx5KSkpKTxicj4KPGJyPgpJIGRvbiYjMzk7dCB0aGluayBjYWxsaW5nIHJl dmVydC1idWZmZXIgaXMgcmlnaHQuIKBNdWNoIGJldHRlciB3b3VsZCBiZSBmb3I8YnI+Cmxpc3Qt YnVmZmVyLW5vc2VsZWN0IHRvIHRyeSB0byBwcmVzZXJ2ZSBwb2ludCB3aGVuIHJldXNpbmcgYSBi dWZmZXI8YnI+CnJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS48YnI+CjxzcGFuIGNsYXNz PSJIT0VuWmIiPjxmb250IGNvbG9yPSIjODg4ODg4Ij48YnI+Cjxicj4KIKAgoCCgIKBTdGVmYW48 YnI+CjwvZm9udD48L3NwYW4+PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj4K --e89a8ff1c094e245e904b3b74bf1--