From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Kelvin White Newsgroups: gmane.emacs.bugs Subject: bug#17755: 24.3; ERC user mode support Date: Wed, 18 Jun 2014 12:08:53 -0400 Message-ID: References: <87wqcnag57.fsf@localhost.i-did-not-set--mail-host-address--so-tickle-me> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a1133d162110c6404fc1e7ac3 X-Trace: ger.gmane.org 1403110458 29854 80.91.229.3 (18 Jun 2014 16:54:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 18 Jun 2014 16:54:18 +0000 (UTC) Cc: Lawrence Mitchell , Michael Olson , 17755@debbugs.gnu.org, Mario Lang , Diane Murray , Alex Schroeder , Julien Danjou , Francis Litterio , Jorgen Schaefer To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Jun 18 18:54:10 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WxJ7h-0007Na-84 for geb-bug-gnu-emacs@m.gmane.org; Wed, 18 Jun 2014 18:54:09 +0200 Original-Received: from localhost ([::1]:59331 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxJ7g-0006Tb-VC for geb-bug-gnu-emacs@m.gmane.org; Wed, 18 Jun 2014 12:54:08 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59876) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxIR6-0007lN-Hl for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 12:10:16 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WxIR1-0002eS-5c for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 12:10:08 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:60819) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxIR1-0002dg-2C for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 12:10:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1WxIQz-0006ta-TN for bug-gnu-emacs@gnu.org; Wed, 18 Jun 2014 12:10:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Kelvin White Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 18 Jun 2014 16:10:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17755 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 17755-submit@debbugs.gnu.org id=B17755.140310775126429 (code B ref 17755); Wed, 18 Jun 2014 16:10:01 +0000 Original-Received: (at 17755) by debbugs.gnu.org; 18 Jun 2014 16:09:11 +0000 Original-Received: from localhost ([127.0.0.1]:51969 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WxIQ6-0006s8-RX for submit@debbugs.gnu.org; Wed, 18 Jun 2014 12:09:10 -0400 Original-Received: from mail-lb0-f178.google.com ([209.85.217.178]:36239) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WxIQ0-0006rX-8y for 17755@debbugs.gnu.org; Wed, 18 Jun 2014 12:09:04 -0400 Original-Received: by mail-lb0-f178.google.com with SMTP id 10so683852lbg.9 for <17755@debbugs.gnu.org>; Wed, 18 Jun 2014 09:08:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=NKuOMn5Ux9BbGBfiCGZuTzGFcJ0O4z+ysjrxqLBqPl8=; b=cM3KThIPL6MynUMt3hhiyTI7ykPNq/OTdqRsJCbmEL9l5vS1iaoUuSjaP4OXvOGUdy G7Xyv+4AnLmmfgCAmNJi+2AOWgbuKd6spCU+umNJ0QcbMoEtWL+VYz8LPPEZjoLoyUE/ RCc4HOeKpE+LX850enhzzwfjM/3XQ3pN2C+8kjUHjZoUb3jfNOEuBhrAvtczAMjHMjt6 RU2hHkS7a1lJf6RIoe/5P10zYNAkgUIWEooOi+uO6Mdedm3vRVRAU8c8vCmI/I7SJLcu qP2jENW/TSgE6bOz+UVBnuiLgQG9Ll72WEH31mLL0VhAxC95TMLLmIu1UKCNtONZYszI qq/g== X-Received: by 10.112.13.7 with SMTP id d7mr1808312lbc.98.1403107733990; Wed, 18 Jun 2014 09:08:53 -0700 (PDT) Original-Received: by 10.112.57.45 with HTTP; Wed, 18 Jun 2014 09:08:53 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-Mailman-Approved-At: Wed, 18 Jun 2014 12:54:03 -0400 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:90513 Archived-At: --001a1133d162110c6404fc1e7ac3 Content-Type: multipart/alternative; boundary=001a1133d162110c5f04fc1e7ac1 --001a1133d162110c5f04fc1e7ac1 Content-Type: text/plain; charset=UTF-8 Apologies, I just realized I didn't include the whole patch in the last submission. Here is the entire diff. On Wed, Jun 18, 2014 at 10:40 AM, Kelvin White wrote: > > Thanks, here are some comments on it. I wish someone who has worked on > > ERC could say something. I never use(d) IRC and have hence no clue what > is > > a "user mode prefix", for example. > > A user mode prefix is referring to a symbol prefixed to your nickname to > display to other users that you have a certain user mode. > Take "&nickname" for instance. The "&" is the user mode prefix showing you > have +a (admin) user mode. > > > > *************** > > > *** 1244,1250 **** > > > (erc-format-message > > > 'JOIN ?n nick ?u login ?h host ?c chnl)))))) > > > (when buffer (set-buffer buffer)) > > > ! (erc-update-channel-member chnl nick nick t nil nil host > login) > > > ;; on join, we want to stay in the new channel buffer > > > ;;(set-buffer ob) > > > (erc-display-message parsed nil buffer str)))))) > > > --- 1244,1250 ---- > > > (erc-format-message > > > 'JOIN ?n nick ?u login ?h host ?c chnl)))))) > > > (when buffer (set-buffer buffer)) > > > ! (erc-update-channel-member chnl nick nick t nil nil nil > nil nil host login) > > > ;; on join, we want to stay in the new channel buffer > > > ;;(set-buffer ob) > > > (erc-display-message parsed nil buffer str)))))) > > > > In my opinion, erc-update-channel-member had too many arguments already. > > Maybe some of these args should be combined into an erc-channel-user > object? > > My first approach was to change the erc-channel-user struct to use a list > of modes, > eliminating some of the args, but it seemed to cause issues elsewhere. > I'll revisit this again soon. > > > > + (defsubst erc-channel-user-owner-p (nick) > > > + "Return t if NICK is an owner of the current channel." > > > > Usually we say "non-nil" rather than "t", unless the callers need to > > rely on the return value being t rather than some other non-nil value. > > Indeed, the callers do rely on the value being t in this case. rather than > just non-nil > > > > + (defface erc-nick-prefix-face '((t :weight bold)) > > > + "ERC face used for user mode prefix." > > > + :group 'erc-faces) > > > + > > > + (defface erc-my-nick-prefix-face '((t :weight bold)) > > > + "ERC face used for my user mode prefix." > > > + :group 'erc-faces) > > > > Try to use the :inherit property at least to link those two (so users > > who just want to change the two without making them different only need > > to change one of the two) and ideally by inheriting from some other face. > > Good idea. I have updated this so each of these two faces inherits from > the appropriate nick faces. > By default the prefix will be the same color unless these are changed > individually. > > > > + (defun erc-get-user-mode-prefix (user) > > > + (when user > > > + (cond ((erc-channel-user-voice-p user) "+") > > > + ((erc-channel-user-half-op-p user) "%") > > > + ((erc-channel-user-op-p user) "@") > > > + ((erc-channel-user-admin-p user) "&") > > > + ((erc-channel-user-owner-p user) "~") > > > + (t "")))) > > > > Here I assume there's some kind of logic or convention. If not, maybe > > it would be appropriate to do something like add some `help-echo' > > property to those extra chars? > > Sure, I've updated the patch to add help-echo props > > > One more thing: the above suggests that maybe > > voice/halfop/op/admin/owner are mutually exclusive. Is that the case? > > Could these be collapsed into a single element which could have values > > `voice', `halfop', `op', `admin', or `owner' (or nil)? > > These are actually not mutually exclusive. A user could have all of these > modes enabled, but it isn't typical. > In that case we only want to display the most valuable. If a user has +vo > we want to display @. > If a user has +oa we display &. etc. Glad you noticed this though, this > should check in reverse order. > > > > (defun erc-format-@nick (&optional user channel-data) > > > "Format the nickname of USER showing if USER is an operator or has > voice. > > > Operators have \"@\" and users with voice have \"+\" as a prefix. > > > Use CHANNEL-DATA to determine op and voice status. > > > See also `erc-format-nick-function'." > > > (when user > > > ! (let ((nick (erc-server-user-nickname user))) > > > ! (concat (erc-propertize (erc-get-user-mode-prefix nick) 'face > 'erc-nick-prefix-face) nick)))) > > > Please try to stay with 80 columns. > > Ok > > > BTW, IIUC, ERC is not distributed separately from Emacs any more, so we > > don't need to use compatibility crutches like erc-propertize any more > > (tho it's fine to use it as well for now, and it could be removed "all at > > once" in another patch). > > Good point, I'll clean that up in another patch. > > > > ! "(ov)@+")) > > [...] > > > ! "(qaohv)~&@%+")) > > >Yay! Magic! > > ;D these are the default user modes > > > ! (let (prefix op-ch voice-ch names name op voice) > > (setq prefix (erc-parse-prefix)) > > ! (setq op-ch (cdr (assq ?o prefix)) > > ! voice-ch (cdr (assq ?v prefix))) > > > > this should have been > > > > (let* ((prefix (erc-parse-prefix)) > > (op-ch (cdr (assq ?o prefix))) > > (voice-ch (cdr (assq ?v prefix))) > > names name op voice) > > > > Which is both cleaner and faster. > > > > So when you change such code, you can take advantage of the change to > > try and reduce occurrences of those "let-without-init followed by setq". > > This has been updated, thanks. > > > This also makes it sound like those op/voice/admin/owner are mutually > > exclusive and should be combined into a single element. > > > Otherwise, please simplify the code with: > > > (setq op 'off voice 'off halfop 'off admin 'off owner 'off) > > (cond > > ((eq (elt item 0) voice-ch) > > (setq name (substring item 1) > > voice 'on)) > > [...]) > > Yes, I agree. I have simplified it. > > > > + (when (and voice > > > + (not (eq (erc-channel-user-voice cuser) voice))) > > > + (setq changed t) > > > + (setf (erc-channel-user-voice cuser) > > > + (cond ((eq voice 'on) t) > > > + ((eq voice 'off) nil) > > > + (t voice)))) > > > > Won't this cause `changed' to "always" be set to t, since > > (erc-channel-user-voice cuser) will never be `on' or `off' and hence > > never be equal to `voice'? > > > Also, instead of using on/off and converting them from&to nil/t, maybe > > it would be simpler to use nil/t plus a special value > > (e.g. `:unspecified') for the case where the value is simply > > not provided. > > Sure, I will look at revising this in a separate patch. I tried to keep > this as simple > as possible but I have noticed things like this and others that could be > simplified > and cleaned up a bit. > > Attached is the new patch cleaned up per your suggestions. > > Thanks > > --001a1133d162110c5f04fc1e7ac1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Apologies, I just realized I didn't include the whole = patch in the last submission.=C2=A0
Here is the entire diff.


On Wed, Jun = 18, 2014 at 10:40 AM, Kelvin White <kelvin.white77@gmail.com>= ; wrote:
> Thanks= , here are some comments on it. =C2=A0I wish someone who has worked on
&= gt; ERC could say something. =C2=A0I never use(d) IRC and have hence no clu= e what is
> a "user mode prefix", for example.

A user mode prefix is referring to a symbol prefixed t= o your nickname to display to other users that you have a certain user mode= .=C2=A0
Take "&nickname" for instance. The &quo= t;&" is the user mode prefix showing you have +a (admin) user mode= .

> > ***************
> > *** 1244,= 1250 ****
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(erc-format-message
> > =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 'JOIN ?n nick ?u login ?h host ?c chnl))))))
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when buffer (set-buffe= r buffer))
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-update-ch= annel-member chnl nick nick t nil nil host login)
> > =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; on join, we want to stay in the new chan= nel buffer
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;;(set-buffer ob)
&g= t; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-display-message pars= ed nil buffer str))))))
> > --- 1244,1250 ----
> > =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(erc-format-message
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'JOIN ?n ni= ck ?u login ?h host ?c chnl))))))
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when buffer (set-buffe= r buffer))
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-update-ch= annel-member chnl nick nick t nil nil nil nil nil host login)
> > = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; on join, we want to stay in th= e new channel buffer
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;;(set-buffer ob)
&g= t; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-display-message pars= ed nil buffer str))))))
>
> In my opinion, erc-update-channel-m= ember had too many arguments already.
> Maybe some of these args shou= ld be combined into an erc-channel-user object?

My first approach was to change the erc-channel-user struct to use a list = of modes,
eliminating some of the args, but= it seemed to cause issues elsewhere. =C2=A0I'll revisit this again soo= n.

> > += (defsubst erc-channel-user-owner-p (nick)
> > + =C2=A0 "Retu= rn t if NICK is an owner of the current channel."
>
> Usually we say "non-nil" rather than "t", = unless the callers need to
> rely on the r= eturn value being t rather than some other non-nil value.

Indeed, the callers do rely on t= he value being t in this case. rather than just non-nil

> >= + (defface erc-nick-prefix-face '((t :weight bold))
> > + =C2=A0 "ERC face used for user mode prefix."
> = > + =C2=A0 :group 'erc-faces)
> > +
> > + (defface= erc-my-nick-prefix-face '((t :weight bold))
> > + =C2=A0 &quo= t;ERC face used for my user mode prefix."
> > + =C2=A0 :group 'erc-faces)
>
> Try to use the :i= nherit property at least to link those two (so users
> who just want = to change the two without making them different only need
> to change= one of the two) and ideally by inheriting from some other face.

Good idea. I have updated this so each of these two faces inherits from th= e appropriate nick faces.
By default the pr= efix will be the same color unless these are changed individually.

> > += (defun erc-get-user-mode-prefix (user)
> > + =C2=A0 (when user> > + =C2=A0 =C2=A0 (cond ((erc-channel-user-voice-p user) "+&q= uot;)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-= half-op-p user) "%")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-op-p user= ) "@")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((erc-ch= annel-user-admin-p user) "&")
> > + =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ((erc-channel-user-owner-p user) "~")
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t ""))))
>
> Here I assume there's some kind of logic or convention. = =C2=A0If not, maybe
> it would be appropriate to do something like ad= d some `help-echo'
> property to those extra chars?

Sure, I've updated the patch= to add help-echo props=C2=A0

> One more thing: the above sugg= ests that maybe
> voice/halfop/op/admin/owner are mutually exclusive. =C2=A0Is that the = case?
> Could these be collapsed into a single element which could have values=
> `voice', `halfop', `op', `admin', or `owner' (= or nil)?

These are actually not mutually exclusive. A user could have all of these m= odes enabled, but it isn't typical.
In = that case we only want to display the most valuable. If a user has +vo we w= ant to display @.=C2=A0
If a user has +oa we display &. etc. Glad yo= u noticed this though, this should check in reverse order.

> = > =C2=A0 (defun erc-format-@nick (&optional user channel-data)
> > =C2=A0 =C2=A0 "Format the nickname of USER showing if USER i= s an operator or has voice.
> > =C2=A0 Operators have \"@\&qu= ot; and users with voice have \"+\" as a prefix.
> > =C2= =A0 Use CHANNEL-DATA to determine op and voice status.
> > =C2=A0 See also `erc-format-nick-function'."
> >= ; =C2=A0 =C2=A0 (when user
> > ! =C2=A0 =C2=A0 (let ((nick (erc-se= rver-user-nickname user)))
> > ! =C2=A0 =C2=A0 =C2=A0 (concat (erc= -propertize (erc-get-user-mode-prefix nick) 'face 'erc-nick-prefix-= face) nick))))

> Please try to stay with 80 columns.

Ok

> BTW, IIUC, ERC is not distribute= d separately from Emacs any more, so we
> don't need to use compa= tibility crutches like erc-propertize any more
> (tho it's fine to use it as well for now, and it could be removed = "all at
> once" in another patch).

Good point, I'll= clean that up in another patch.

> > != =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"(ov)@+")= )
> [...]
> > ! =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0"(qaohv)~&@%+"))

>Yay! =C2=A0Ma= gic!

;D these are the default user mo= des

> ! =C2=A0 (let (prefix op-ch voice-ch names name op voice= )
> =C2=A0 =C2=A0 =C2=A0 (setq prefix (erc-parse-prefix))
> ! =C2=A0 =C2=A0 (setq op-ch (cdr (assq ?o prefix))
> ! =C2=A0 = =C2=A0 =C2=A0 =C2=A0 voice-ch (cdr (assq ?v prefix)))
>
> this = should have been
>
> =C2=A0 =C2=A0 =C2=A0(let* ((prefix (erc-pa= rse-prefix))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(op-ch (cdr (= assq ?o prefix)))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (voice-ch (cdr (assq ?v pref= ix)))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 names name op voice= )
>
> Which is both cleaner and faster.
>
> So when= you change such code, you can take advantage of the change to
> try and reduce occurrences of those "let-without-init followed by= setq".

This has been updated, thanks.=C2=A0
=

> This also makes it sound like those o= p/voice/admin/owner are mutually
> e= xclusive and should be combined into a single element.

> Otherwis= e, please simplify the code with:

> =C2=A0 (setq op 'off voice 'off halfop 'off admin '= ;off owner 'off)
> =C2=A0 (cond
> =C2=A0 =C2=A0((eq (elt it= em 0) voice-ch)
> =C2=A0 =C2=A0 (setq name (substring item 1)
>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 voice 'on))
> =C2=A0 =C2=A0[...])

Yes, I agree. I have simplified it.

= > > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (and voice
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0(not (eq (erc-channel-user-voice cuser) voice)))
> > = + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq changed t)
> > += =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (erc-channel-user-voice cu= ser)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 (cond ((eq voice 'on) t)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ((eq voice 'off) nil)
> > + =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t v= oice))))
>
> Won't this cause `changed' to "always= " be set to t, since
> (erc-channel-user-voice cuser) will never= be `on' or `off' and hence
> never be equal to `voice'?

> Also, instead of using on/off and conver= ting them from&to nil/t, maybe
> it would be simpler to use nil/t= plus a special value
> (e.g. `:unspecified') for the case where the value is simply
> not provided.

Sure, I will look at revising this in a separate pat= ch. I tried to keep this as simple=C2=A0
as= possible but I have noticed things like this and others that could be simp= lified=C2=A0
and cleaned up a bit.

Attached is the new patch cleane= d up per your suggestions.

Thanks


--001a1133d162110c5f04fc1e7ac1-- --001a1133d162110c6404fc1e7ac3 Content-Type: text/plain; charset=US-ASCII; name="erc-patch.diff" Content-Disposition: attachment; filename="erc-patch.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hwku3vyc1 ZGlmZiAtLWlnbm9yZS1zcGFjZS1jaGFuZ2UgLWMgJy1GXltfYS16QS1aMC05JF0rICooJyBwcm9q ZWN0cy9lbWFjcy9saXNwL2VyYy9DaGFuZ2VMb2cgcHJvamVjdHMvZW1hY3MtZGV2L2xpc3AvZXJj L0NoYW5nZUxvZwoqKiogcHJvamVjdHMvZW1hY3MvbGlzcC9lcmMvQ2hhbmdlTG9nCTIwMTQtMDYt MTMgMTA6MjE6MTAuMjMyNDk0ODQyIC0wNDAwCi0tLSBwcm9qZWN0cy9lbWFjcy1kZXYvbGlzcC9l cmMvQ2hhbmdlTG9nCTIwMTQtMDYtMTggMTI6MDY6MzcuMjIyMzk5NTY1IC0wNDAwCioqKioqKioq KioqKioqKgoqKiogMSwzICoqKioKLS0tIDEsMTUgLS0tLQorIDIwMTQtMDYtMTEgIEtlbHZpbiBX aGl0ZSAgPGtlbHZpbi53aGl0ZTc3QGdtYWlsLmNvbT4KKyAKKyAJKiBlcmMtYmFja2VuZC5lbDog SGFuZGxlIHVzZXIgbW9kZXMgaW4gcmVsZXZlbnQgc2VydmVyIHJlc3BvbnNlcworIAkqIGVyYy5l bDogQmV0dGVyIHVzZXIgbW9kZSBzdXBwb3J0LgorIAkoZXJjLWNoYW5uZWwtdXNlcik6IEFkZCBt ZW1iZXJzIGZvciBuZXcgbW9kZXMuCisgCShlcmMtY2hhbm5lbC1tZW1iZXItaGFsZm9wLXAsIGVy Yy1jaGFubmVsLXVzZXItYWRtaW4tcCwgZXJjLWNoYW5uZWwtdXNlci1vd25lci1wKTogVXNlIG5l dyBzdHJ1Y3QgbWVtYmVycy4KKyAJKGVyYy1mb3JtYXQtbmljaywgZXJjLWZvcm1hdC1Abmljayk6 IERpc3BsYXkgdXNlciBtb2RlcyBhcyBuaWNrIHByZWZpeC4KKyAJKGVyYy1uaWNrLXByZWZpeC1m YWNlLCBlcmMtbXktbmljay1wcmVmaXgtZmFjZSk6IEFkZCBuZXcgZmFjZXMgdG8gc2VwYXJhdGUg Y29sb3JzIGlmIGRlc2lyZWQuCisgCShlcmMtZ2V0LXVzZXItbW9kZS1wcmVmaXgpOiBSZXR1cm4g c3ltYm9sIGZvciBtb2RlIHByZWZpeC4KKyAJKGVyYy11cGRhdGUtY2hhbm5lbC1tZW1iZXIsIGVy Yy11cGRhdGUtY3VycmVudC1jaGFubmVsLW1lbWJlciwgZXJjLWNoYW5uZWwtcmVjZWl2ZS1uYW1l cyk6IFVwZGF0ZSBjaGFubmVsIHVzZXJzLgorIAkoZXJjLW5pY2stYXQtcG9pbnQpOiBSZXR1cm4g Y29ycmVjdCB1c2VyIGluZm8uCisgCiAgMjAxNC0wNC0wNCAgU3RlZmFuIE1vbm5pZXIgIDxtb25u aWVyQGlyby51bW9udHJlYWwuY2E+CiAgCiAgCSogZXJjLmVsIChlcmMtaW52aXRlLW9ubHktbW9k ZSwgZXJjLXRvZ2dsZS1jaGFubmVsLW1vZGUpOiBTaW1wbGlmeS4KKioqKioqKioqKioqKioqCioq KiA2MTUsNjE4ICoqKioKICA7OyBjb2Rpbmc6IHV0Zi04CiAgOzsgYWRkLWxvZy10aW1lLXpvbmUt cnVsZTogdAogIDs7IEVuZDoKLSAKLS0tIDYyNyw2MjkgLS0tLQpkaWZmIC0taWdub3JlLXNwYWNl LWNoYW5nZSAtYyAnLUZeW19hLXpBLVowLTkkXSsgKignIHByb2plY3RzL2VtYWNzL2xpc3AvZXJj L2VyYy1iYWNrZW5kLmVsIHByb2plY3RzL2VtYWNzLWRldi9saXNwL2VyYy9lcmMtYmFja2VuZC5l bAoqKiogcHJvamVjdHMvZW1hY3MvbGlzcC9lcmMvZXJjLWJhY2tlbmQuZWwJMjAxNC0wNi0xMyAx MDoyMToxMC4yMzU4MjgwNzQgLTA0MDAKLS0tIHByb2plY3RzL2VtYWNzLWRldi9saXNwL2VyYy9l cmMtYmFja2VuZC5lbAkyMDE0LTA2LTE4IDEyOjA0OjIxLjcxNjYzNTg1NCAtMDQwMAoqKioqKioq KioqKioqKioKKioqIDUsMTEgKioqKgogIDs7IEZpbGVuYW1lOiBlcmMtYmFja2VuZC5lbAogIDs7 IEF1dGhvcjogTGF3cmVuY2UgTWl0Y2hlbGwgPHdlbmNlQGdteC5saT4KICA7OyBNYWludGFpbmVy OiBlbWFjcy1kZXZlbEBnbnUub3JnCiEgOzsgQ3JlYXRlZDogMjAwNC0wNS03CiAgOzsgS2V5d29y ZHM6IElSQyBjaGF0IGNsaWVudCBpbnRlcm5ldAogIAogIDs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEdOVSBFbWFjcy4KLS0tIDUsMTMgLS0tLQogIDs7IEZpbGVuYW1lOiBlcmMtYmFja2VuZC5lbAog IDs7IEF1dGhvcjogTGF3cmVuY2UgTWl0Y2hlbGwgPHdlbmNlQGdteC5saT4KICA7OyBNYWludGFp bmVyOiBlbWFjcy1kZXZlbEBnbnUub3JnCiEgOzsgSGFja2VyOiBsM3RoYWxAc21hc2h0aGVzdGFj ay5vcmcKISA7OyBDcmVhdGVkOiAyMDA0LTA1LTA3CiEgOzsgSGFja2VkOiAyMDE0LTA2LTA4CiAg OzsgS2V5d29yZHM6IElSQyBjaGF0IGNsaWVudCBpbnRlcm5ldAogIAogIDs7IFRoaXMgZmlsZSBp cyBwYXJ0IG9mIEdOVSBFbWFjcy4KKioqKioqKioqKioqKioqCioqKiAxMjA4LDEyMTYgKioqKgog ICAgICAgICAgIHBhcnNlZCAnbm90aWNlICdhY3RpdmUKICAgICAgICAgICAnSU5WSVRFID9uIG5p Y2sgP3UgbG9naW4gP2ggaG9zdCA/YyBjaG5sKSkpKSkKICAKISAKICAoZGVmaW5lLWVyYy1yZXNw b25zZS1oYW5kbGVyIChKT0lOKQohICAgIkhhbmRsZSBqb2luIG1lc3NhZ2VzLiIKICAgIG5pbAog ICAgKGxldCAoKGNobmwgKGVyYy1yZXNwb25zZS5jb250ZW50cyBwYXJzZWQpKQogICAgICAgICAg KGJ1ZmZlciBuaWwpKQotLS0gMTIxMCwxMjE4IC0tLS0KICAgICAgICAgICBwYXJzZWQgJ25vdGlj ZSAnYWN0aXZlCiAgICAgICAgICAgJ0lOVklURSA/biBuaWNrID91IGxvZ2luID9oIGhvc3QgP2Mg Y2hubCkpKSkpCiAgCiEgOzs7IGhhY2tlZAogIChkZWZpbmUtZXJjLXJlc3BvbnNlLWhhbmRsZXIg KEpPSU4pCiEgICAiSEFDS0VEOiBIYW5kbGUgam9pbiBtZXNzYWdlcy4iCiAgICBuaWwKICAgIChs ZXQgKChjaG5sIChlcmMtcmVzcG9uc2UuY29udGVudHMgcGFyc2VkKSkKICAgICAgICAgIChidWZm ZXIgbmlsKSkKKioqKioqKioqKioqKioqCioqKiAxMjQ0LDEyNTAgKioqKgogICAgICAgICAgICAg ICAgICAgICAgICAgKGVyYy1mb3JtYXQtbWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAg ICdKT0lOID9uIG5pY2sgP3UgbG9naW4gP2ggaG9zdCA/YyBjaG5sKSkpKSkpCiAgICAgICAgICAg ICh3aGVuIGJ1ZmZlciAoc2V0LWJ1ZmZlciBidWZmZXIpKQohICAgICAgICAgICAoZXJjLXVwZGF0 ZS1jaGFubmVsLW1lbWJlciBjaG5sIG5pY2sgbmljayB0IG5pbCBuaWwgaG9zdCBsb2dpbikKICAg ICAgICAgICAgOzsgb24gam9pbiwgd2Ugd2FudCB0byBzdGF5IGluIHRoZSBuZXcgY2hhbm5lbCBi dWZmZXIKICAgICAgICAgICAgOzsoc2V0LWJ1ZmZlciBvYikKICAgICAgICAgICAgKGVyYy1kaXNw bGF5LW1lc3NhZ2UgcGFyc2VkIG5pbCBidWZmZXIgc3RyKSkpKSkpCi0tLSAxMjQ2LDEyNTIgLS0t LQogICAgICAgICAgICAgICAgICAgICAgICAgKGVyYy1mb3JtYXQtbWVzc2FnZQogICAgICAgICAg ICAgICAgICAgICAgICAgICdKT0lOID9uIG5pY2sgP3UgbG9naW4gP2ggaG9zdCA/YyBjaG5sKSkp KSkpCiAgICAgICAgICAgICh3aGVuIGJ1ZmZlciAoc2V0LWJ1ZmZlciBidWZmZXIpKQohICAgICAg ICAgICAoZXJjLXVwZGF0ZS1jaGFubmVsLW1lbWJlciBjaG5sIG5pY2sgbmljayB0IG5pbCBuaWwg bmlsIG5pbCBuaWwgaG9zdCBsb2dpbikKICAgICAgICAgICAgOzsgb24gam9pbiwgd2Ugd2FudCB0 byBzdGF5IGluIHRoZSBuZXcgY2hhbm5lbCBidWZmZXIKICAgICAgICAgICAgOzsoc2V0LWJ1ZmZl ciBvYikKICAgICAgICAgICAgKGVyYy1kaXNwbGF5LW1lc3NhZ2UgcGFyc2VkIG5pbCBidWZmZXIg c3RyKSkpKSkpCioqKioqKioqKioqKioqKgoqKiogMTM4NSwxMzkyICoqKioKICAgICAgICAgICA/ cyAoaWYgKC89IGVyYy1zZXJ2ZXItbGFnIDEpICJzIiAiIikpKQogICAgICAgIChlcmMtdXBkYXRl LW1vZGUtbGluZSkpKSkKICAKICAoZGVmaW5lLWVyYy1yZXNwb25zZS1oYW5kbGVyIChQUklWTVNH IE5PVElDRSkKISAgICJIYW5kbGUgcHJpdmF0ZSBtZXNzYWdlcywgaW5jbHVkaW5nIG1lc3NhZ2Vz IGluIGNoYW5uZWxzLiIgbmlsCiAgICAobGV0ICgoc2VuZGVyLXNwZWMgKGVyYy1yZXNwb25zZS5z ZW5kZXIgcGFyc2VkKSkKICAgICAgICAgIChjbWQgKGVyYy1yZXNwb25zZS5jb21tYW5kIHBhcnNl ZCkpCiAgICAgICAgICAodGd0IChjYXIgKGVyYy1yZXNwb25zZS5jb21tYW5kLWFyZ3MgcGFyc2Vk KSkpCi0tLSAxMzg3LDEzOTUgLS0tLQogICAgICAgICAgID9zIChpZiAoLz0gZXJjLXNlcnZlci1s YWcgMSkgInMiICIiKSkpCiAgICAgICAgKGVyYy11cGRhdGUtbW9kZS1saW5lKSkpKQogIAorIDs7 OyBoYWNrZWQKICAoZGVmaW5lLWVyYy1yZXNwb25zZS1oYW5kbGVyIChQUklWTVNHIE5PVElDRSkK ISAgICJIQUNLRUQ6IEhhbmRsZSBwcml2YXRlIG1lc3NhZ2VzLCBpbmNsdWRpbmcgbWVzc2FnZXMg aW4gY2hhbm5lbHMuIiBuaWwKICAgIChsZXQgKChzZW5kZXItc3BlYyAoZXJjLXJlc3BvbnNlLnNl bmRlciBwYXJzZWQpKQogICAgICAgICAgKGNtZCAoZXJjLXJlc3BvbnNlLmNvbW1hbmQgcGFyc2Vk KSkKICAgICAgICAgICh0Z3QgKGNhciAoZXJjLXJlc3BvbnNlLmNvbW1hbmQtYXJncyBwYXJzZWQp KSkKKioqKioqKioqKioqKioqCioqKiAxNDEzLDE0MTkgKioqKgogICAgICAgICAgICAgIDs7IG1l c3NhZ2UuICBXZSB3aWxsIGFjY3VtdWxhdGUgcHJpdmF0ZSBpZGVudGl0aWVzIGluZGVmaW5pdGVs eQogICAgICAgICAgICAgIDs7IGF0IHRoaXMgcG9pbnQuCiAgICAgICAgICAgICAgKGVyYy11cGRh dGUtY2hhbm5lbC1tZW1iZXIgKGlmIHByaXZwIG5pY2sgdGd0KSBuaWNrIG5pY2sKISAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2cCBuaWwgbmlsIGhvc3QgbG9naW4g bmlsIG5pbCB0KQogICAgICAgICAgICAgIChsZXQgKChjZGF0YSAoZXJjLWdldC1jaGFubmVsLXVz ZXIgbmljaykpKQogICAgICAgICAgICAgICAgKHNldHEgZm5pY2sgKGZ1bmNhbGwgZXJjLWZvcm1h dC1uaWNrLWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Fy IGNkYXRhKSAoY2RyIGNkYXRhKSkpKSkpCi0tLSAxNDE2LDE0MjIgLS0tLQogICAgICAgICAgICAg IDs7IG1lc3NhZ2UuICBXZSB3aWxsIGFjY3VtdWxhdGUgcHJpdmF0ZSBpZGVudGl0aWVzIGluZGVm aW5pdGVseQogICAgICAgICAgICAgIDs7IGF0IHRoaXMgcG9pbnQuCiAgICAgICAgICAgICAgKGVy Yy11cGRhdGUtY2hhbm5lbC1tZW1iZXIgKGlmIHByaXZwIG5pY2sgdGd0KSBuaWNrIG5pY2sKISAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2cCBuaWwgbmlsIG5pbCBu aWwgbmlsIGhvc3QgbG9naW4gbmlsIG5pbCB0KQogICAgICAgICAgICAgIChsZXQgKChjZGF0YSAo ZXJjLWdldC1jaGFubmVsLXVzZXIgbmljaykpKQogICAgICAgICAgICAgICAgKHNldHEgZm5pY2sg KGZ1bmNhbGwgZXJjLWZvcm1hdC1uaWNrLWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoY2FyIGNkYXRhKSAoY2RyIGNkYXRhKSkpKSkpCioqKioqKioqKioqKioq KgoqKiogMTQ2MSwxNDc2ICoqKioKICAgICAgICAoZXJjLWRpc3BsYXktbWVzc2FnZSBwYXJzZWQg J25vdGljZSBidWZzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1FVSVQgP24gbmljayA/ dSBsb2dpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgID9oIGhvc3QgP3IgcmVhc29uKSkp KQohIAogIChkZWZpbmUtZXJjLXJlc3BvbnNlLWhhbmRsZXIgKFRPUElDKQohICAgIlRoZSBjaGFu bmVsIHRvcGljIGhhcyBjaGFuZ2VkLiIgbmlsCiAgICAobGV0KiAoKGNoIChjYXIgKGVyYy1yZXNw b25zZS5jb21tYW5kLWFyZ3MgcGFyc2VkKSkpCiAgICAgICAgICAgKHRvcGljIChlcmMtdHJpbS1z dHJpbmcgKGVyYy1yZXNwb25zZS5jb250ZW50cyBwYXJzZWQpKSkKICAgICAgICAgICAodGltZSAo Zm9ybWF0LXRpbWUtc3RyaW5nIGVyYy1zZXJ2ZXItdGltZXN0YW1wLWZvcm1hdAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtdGltZSkpKSkKICAgICAgKHBjYXNl LWxldCAoKGAoLG5pY2sgLGxvZ2luICxob3N0KQogICAgICAgICAgICAgICAgICAgKGVyYy1wYXJz ZS11c2VyIChlcmMtcmVzcG9uc2Uuc2VuZGVyIHBhcnNlZCkpKSkKISAgICAgICAoZXJjLXVwZGF0 ZS1jaGFubmVsLW1lbWJlciBjaCBuaWNrIG5pY2sgbmlsIG5pbCBuaWwgaG9zdCBsb2dpbikKICAg ICAgICAoZXJjLXVwZGF0ZS1jaGFubmVsLXRvcGljIGNoIChmb3JtYXQgIiVzXEMtbyAoJXMsICVz KSIgdG9waWMgbmljayB0aW1lKSkKICAgICAgICAoZXJjLWRpc3BsYXktbWVzc2FnZSBwYXJzZWQg J25vdGljZSAoZXJjLWdldC1idWZmZXIgY2ggcHJvYykKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAnVE9QSUMgP24gbmljayA/dSBsb2dpbiA/aCBob3N0Ci0tLSAxNDY0LDE0NzkgLS0tLQog ICAgICAgIChlcmMtZGlzcGxheS1tZXNzYWdlIHBhcnNlZCAnbm90aWNlIGJ1ZnMKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAnUVVJVCA/biBuaWNrID91IGxvZ2luCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgP2ggaG9zdCA/ciByZWFzb24pKSkpCiEgOzs7IGhhY2tlZAogIChkZWZp bmUtZXJjLXJlc3BvbnNlLWhhbmRsZXIgKFRPUElDKQohICAgIkhBQ0tFRDogVGhlIGNoYW5uZWwg dG9waWMgaGFzIGNoYW5nZWQuIiBuaWwKICAgIChsZXQqICgoY2ggKGNhciAoZXJjLXJlc3BvbnNl LmNvbW1hbmQtYXJncyBwYXJzZWQpKSkKICAgICAgICAgICAodG9waWMgKGVyYy10cmltLXN0cmlu ZyAoZXJjLXJlc3BvbnNlLmNvbnRlbnRzIHBhcnNlZCkpKQogICAgICAgICAgICh0aW1lIChmb3Jt YXQtdGltZS1zdHJpbmcgZXJjLXNlcnZlci10aW1lc3RhbXAtZm9ybWF0CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC10aW1lKSkpKQogICAgICAocGNhc2UtbGV0 ICgoYCgsbmljayAsbG9naW4gLGhvc3QpCiAgICAgICAgICAgICAgICAgICAoZXJjLXBhcnNlLXVz ZXIgKGVyYy1yZXNwb25zZS5zZW5kZXIgcGFyc2VkKSkpKQohICAgICAgIChlcmMtdXBkYXRlLWNo YW5uZWwtbWVtYmVyIGNoIG5pY2sgbmljayBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBob3N0IGxv Z2luKQogICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtdG9waWMgY2ggKGZvcm1hdCAiJXNcQy1v ICglcywgJXMpIiB0b3BpYyBuaWNrIHRpbWUpKQogICAgICAgIChlcmMtZGlzcGxheS1tZXNzYWdl IHBhcnNlZCAnbm90aWNlIChlcmMtZ2V0LWJ1ZmZlciBjaCBwcm9jKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdUT1BJQyA/biBuaWNrID91IGxvZ2luID9oIGhvc3QKKioqKioqKioqKioq KioqCioqKiAxNzkxLDE3OTggKioqKgogICAgICAoZXJjLWRpc3BsYXktbWVzc2FnZSBwYXJzZWQg J25vdGljZSAoZXJjLWdldC1idWZmZXIgY2hhbm5lbCBwcm9jKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAnczM0MSA/biBuaWNrID9jIGNoYW5uZWwpKSkKICAKICAoZGVmaW5lLWVyYy1yZXNw b25zZS1oYW5kbGVyICgzNTIpCiEgICAiV0hPIG5vdGljZS4iIG5pbAogICAgKHBjYXNlLWxldCAo KGAoLGNoYW5uZWwgLHVzZXIgLGhvc3QgLHNlcnZlciAsbmljayAsYXdheS1mbGFnKQogICAgICAg ICAgICAgICAgIChjZHIgKGVyYy1yZXNwb25zZS5jb21tYW5kLWFyZ3MgcGFyc2VkKSkpKQogICAg ICAobGV0ICgoZnVsbC1uYW1lIChlcmMtcmVzcG9uc2UuY29udGVudHMgcGFyc2VkKSkKLS0tIDE3 OTQsMTgwMiAtLS0tCiAgICAgIChlcmMtZGlzcGxheS1tZXNzYWdlIHBhcnNlZCAnbm90aWNlIChl cmMtZ2V0LWJ1ZmZlciBjaGFubmVsIHByb2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdz MzQxID9uIG5pY2sgP2MgY2hhbm5lbCkpKQogIAorIDs7OyBoYWNrZWQKICAoZGVmaW5lLWVyYy1y ZXNwb25zZS1oYW5kbGVyICgzNTIpCiEgICAiSEFDS0VEOiBXSE8gbm90aWNlLiIgbmlsCiAgICAo cGNhc2UtbGV0ICgoYCgsY2hhbm5lbCAsdXNlciAsaG9zdCAsc2VydmVyICxuaWNrICxhd2F5LWZs YWcpCiAgICAgICAgICAgICAgICAgKGNkciAoZXJjLXJlc3BvbnNlLmNvbW1hbmQtYXJncyBwYXJz ZWQpKSkpCiAgICAgIChsZXQgKChmdWxsLW5hbWUgKGVyYy1yZXNwb25zZS5jb250ZW50cyBwYXJz ZWQpKQoqKioqKioqKioqKioqKioKKioqIDE4MDAsMTgwNyAqKioqCiAgICAgICAgKHdoZW4gKHN0 cmluZy1tYXRjaCAiXFwoXlswLTldKyBcXClcXCguKlxcKSQiIGZ1bGwtbmFtZSkKICAgICAgICAg IChzZXRxIGhvcGNvdW50IChtYXRjaC1zdHJpbmcgMSBmdWxsLW5hbWUpKQogICAgICAgICAgKHNl dHEgZnVsbC1uYW1lIChtYXRjaC1zdHJpbmcgMiBmdWxsLW5hbWUpKSkKISAgICAgICAoZXJjLXVw ZGF0ZS1jaGFubmVsLW1lbWJlciBjaGFubmVsIG5pY2sgbmljayBuaWwgbmlsIG5pbCBob3N0CiEg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBmdWxsLW5hbWUpCiAgICAgICAg KGVyYy1kaXNwbGF5LW1lc3NhZ2UgcGFyc2VkICdub3RpY2UgJ2FjdGl2ZSAnczM1MgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgID9jIGNoYW5uZWwgP24gbmljayA/YSBhd2F5LWZsYWcKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA/dSB1c2VyID9oIGhvc3QgP2YgZnVsbC1uYW1lKSkp KQotLS0gMTgwNCwxODEwIC0tLS0KICAgICAgICAod2hlbiAoc3RyaW5nLW1hdGNoICJcXCheWzAt OV0rIFxcKVxcKC4qXFwpJCIgZnVsbC1uYW1lKQogICAgICAgICAgKHNldHEgaG9wY291bnQgKG1h dGNoLXN0cmluZyAxIGZ1bGwtbmFtZSkpCiAgICAgICAgICAoc2V0cSBmdWxsLW5hbWUgKG1hdGNo LXN0cmluZyAyIGZ1bGwtbmFtZSkpKQohICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVy IGNoYW5uZWwgbmljayBuaWNrIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIGhvc3QgdXNlciBmdWxs LW5hbWUpCiAgICAgICAgKGVyYy1kaXNwbGF5LW1lc3NhZ2UgcGFyc2VkICdub3RpY2UgJ2FjdGl2 ZSAnczM1MgogICAgICAgICAgICAgICAgICAgICAgICAgICAgID9jIGNoYW5uZWwgP24gbmljayA/ YSBhd2F5LWZsYWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/dSB1c2VyID9oIGhvc3Qg P2YgZnVsbC1uYW1lKSkpKQpkaWZmIC0taWdub3JlLXNwYWNlLWNoYW5nZSAtYyAnLUZeW19hLXpB LVowLTkkXSsgKignIHByb2plY3RzL2VtYWNzL2xpc3AvZXJjL2VyYy5lbCBwcm9qZWN0cy9lbWFj cy1kZXYvbGlzcC9lcmMvZXJjLmVsCioqKiBwcm9qZWN0cy9lbWFjcy9saXNwL2VyYy9lcmMuZWwJ MjAxNC0wNi0xOCAxMDowODoxNS42Mzk1MTkxNTcgLTA0MDAKLS0tIHByb2plY3RzL2VtYWNzLWRl di9saXNwL2VyYy9lcmMuZWwJMjAxNC0wNi0xOCAxMDoxNTo0MS4zOTU3MTg1NTQgLTA0MDAKKioq KioqKioqKioqKioqCioqKiAzNzAsMzc2ICoqKioKICAgICkKICAKICAoY2wtZGVmc3RydWN0IChl cmMtY2hhbm5lbC11c2VyICg6dHlwZSB2ZWN0b3IpIDpuYW1lZCkKISAgIG9wIHZvaWNlCiAgICA7 OyBMYXN0IG1lc3NhZ2UgdGltZSAoaW4gdGhlIGZvcm0gb2YgdGhlIHJldHVybiB2YWx1ZSBvZgog ICAgOzsgKGN1cnJlbnQtdGltZSkKICAgIDs7Ci0tLSAzNzAsMzc2IC0tLS0KICAgICkKICAKICAo Y2wtZGVmc3RydWN0IChlcmMtY2hhbm5lbC11c2VyICg6dHlwZSB2ZWN0b3IpIDpuYW1lZCkKISAg IHZvaWNlIGhhbGZvcCBvcCBhZG1pbiBvd25lcgogICAgOzsgTGFzdCBtZXNzYWdlIHRpbWUgKGlu IHRoZSBmb3JtIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YKICAgIDs7IChjdXJyZW50LXRpbWUpCiAg ICA7OwoqKioqKioqKioqKioqKioKKioqIDQ3NSw0ODAgKioqKgotLS0gNDc1LDQ5NiAtLS0tCiAg ICAgICAgICAgICAgIGVyYy1jaGFubmVsLXVzZXJzKQogICAgICAoY2xyaGFzaCBlcmMtY2hhbm5l bC11c2VycykpKQogIAorIChkZWZzdWJzdCBlcmMtY2hhbm5lbC11c2VyLW93bmVyLXAgKG5pY2sp CisgICAiUmV0dXJuIHQgaWYgTklDSyBpcyBhbiBvd25lciBvZiB0aGUgY3VycmVudCBjaGFubmVs LiIKKyAgIChhbmQgbmljaworICAgICAgICAoaGFzaC10YWJsZS1wIGVyYy1jaGFubmVsLXVzZXJz KQorICAgICAgICAobGV0ICgoY2RhdGEgKGVyYy1nZXQtY2hhbm5lbC11c2VyIG5pY2spKSkKKyAg ICAgICAgICAoYW5kIGNkYXRhIChjZHIgY2RhdGEpCisgICAgICAgICAgICAgICAoZXJjLWNoYW5u ZWwtdXNlci1vd25lciAoY2RyIGNkYXRhKSkpKSkpCisgCisgKGRlZnN1YnN0IGVyYy1jaGFubmVs LXVzZXItYWRtaW4tcCAobmljaykKKyAgICJSZXR1cm4gdCBpZiBOSUNLIGlzIGFuIGFkbWluIGlu IHRoZSBjdXJyZW50IGNoYW5uZWwuIgorICAgKGFuZCBuaWNrCisgICAgICAgIChoYXNoLXRhYmxl LXAgZXJjLWNoYW5uZWwtdXNlcnMpCisgICAgICAgIChsZXQgKChjZGF0YSAoZXJjLWdldC1jaGFu bmVsLXVzZXIgbmljaykpKQorICAgICAgICAgIChhbmQgY2RhdGEgKGNkciBjZGF0YSkKKyAgICAg ICAgICAgICAgIChlcmMtY2hhbm5lbC11c2VyLWFkbWluIChjZHIgY2RhdGEpKSkpKSkKKyAKICAo ZGVmc3Vic3QgZXJjLWNoYW5uZWwtdXNlci1vcC1wIChuaWNrKQogICAgIlJldHVybiB0IGlmIE5J Q0sgaXMgYW4gb3BlcmF0b3IgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4iCiAgICAoYW5kIG5pY2sK KioqKioqKioqKioqKioqCioqKiA0ODMsNDg4ICoqKioKLS0tIDQ5OSw1MTIgLS0tLQogICAgICAg ICAgIChhbmQgY2RhdGEgKGNkciBjZGF0YSkKICAgICAgICAgICAgICAgIChlcmMtY2hhbm5lbC11 c2VyLW9wIChjZHIgY2RhdGEpKSkpKSkKICAKKyAoZGVmc3Vic3QgZXJjLWNoYW5uZWwtdXNlci1o YWxmb3AtcCAobmljaykKKyAgICJSZXR1cm4gdCBpZiBOSUNLIGlzIGEgaGFsZi1vcGVyYXRvciBp biB0aGUgY3VycmVudCBjaGFubmVsLiIKKyAgIChhbmQgbmljaworICAgICAgICAoaGFzaC10YWJs ZS1wIGVyYy1jaGFubmVsLXVzZXJzKQorICAgICAgICAobGV0ICgoY2RhdGEgKGVyYy1nZXQtY2hh bm5lbC11c2VyIG5pY2spKSkKKyAgICAgICAgICAoYW5kIGNkYXRhIChjZHIgY2RhdGEpCisgICAg ICAgICAgICAgICAoZXJjLWNoYW5uZWwtdXNlci1oYWxmb3AgKGNkciBjZGF0YSkpKSkpKQorIAog IChkZWZzdWJzdCBlcmMtY2hhbm5lbC11c2VyLXZvaWNlLXAgKG5pY2spCiAgICAiUmV0dXJuIHQg aWYgTklDSyBoYXMgdm9pY2UgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4iCiAgICAoYW5kIG5pY2sK KioqKioqKioqKioqKioqCioqKiAxMTIyLDExMjcgKioqKgotLS0gMTE0NiwxMTU5IC0tLS0KICAg ICJFUkMgZGVmYXVsdCBmYWNlLiIKICAgIDpncm91cCAnZXJjLWZhY2VzKQogIAorIChkZWZmYWNl IGVyYy1uaWNrLXByZWZpeC1mYWNlICcoKHQgOmluaGVyaXQgZXJjLW5pY2stZGVmYXVsdC1mYWNl IDp3ZWlnaHQgYm9sZCkpCisgICAiRVJDIGZhY2UgdXNlZCBmb3IgdXNlciBtb2RlIHByZWZpeC4i CisgICA6Z3JvdXAgJ2VyYy1mYWNlcykKKyAKKyAoZGVmZmFjZSBlcmMtbXktbmljay1wcmVmaXgt ZmFjZSAnKCh0IDppbmhlcml0IGVyYy1teS1uaWNrLWZhY2UgOndlaWdodCBib2xkKSkKKyAgICJF UkMgZmFjZSB1c2VkIGZvciBteSB1c2VyIG1vZGUgcHJlZml4LiIKKyAgIDpncm91cCAnZXJjLWZh Y2VzKQorIAogIChkZWZmYWNlIGVyYy1kaXJlY3QtbXNnLWZhY2UgJygodCA6Zm9yZWdyb3VuZCAi SW5kaWFuUmVkIikpCiAgICAiRVJDIGZhY2UgdXNlZCBmb3IgbWVzc2FnZXMgeW91IHJlY2VpdmUg aW4gdGhlIG1haW4gZXJjIGJ1ZmZlci4iCiAgICA6Z3JvdXAgJ2VyYy1mYWNlcykKKioqKioqKioq KioqKioqCioqKiA0MTkwLDQxOTYgKioqKgogIChkZWZ1biBlcmMtZm9ybWF0LW5pY2sgKCZvcHRp b25hbCB1c2VyIF9jaGFubmVsLWRhdGEpCiAgICAiUmV0dXJuIHRoZSBuaWNrbmFtZSBvZiBVU0VS LgogIFNlZSBhbHNvIGBlcmMtZm9ybWF0LW5pY2stZnVuY3Rpb24nLiIKISAgICh3aGVuIHVzZXIg KGVyYy1zZXJ2ZXItdXNlci1uaWNrbmFtZSB1c2VyKSkpCiAgCiAgKGRlZnVuIGVyYy1mb3JtYXQt QG5pY2sgKCZvcHRpb25hbCB1c2VyIGNoYW5uZWwtZGF0YSkKICAgICJGb3JtYXQgdGhlIG5pY2tu YW1lIG9mIFVTRVIgc2hvd2luZyBpZiBVU0VSIGlzIGFuIG9wZXJhdG9yIG9yIGhhcyB2b2ljZS4K LS0tIDQyMjIsNDI0NSAtLS0tCiAgKGRlZnVuIGVyYy1mb3JtYXQtbmljayAoJm9wdGlvbmFsIHVz ZXIgX2NoYW5uZWwtZGF0YSkKICAgICJSZXR1cm4gdGhlIG5pY2tuYW1lIG9mIFVTRVIuCiAgU2Vl IGFsc28gYGVyYy1mb3JtYXQtbmljay1mdW5jdGlvbicuIgohICAgKGxldCAoKG5pY2sgKGVyYy1z ZXJ2ZXItdXNlci1uaWNrbmFtZSB1c2VyKSkpCiEgICAgIChjb25jYXQgKGVyYy1wcm9wZXJ0aXpl CiEgICAgICAgICAgICAgIChlcmMtZ2V0LXVzZXItbW9kZS1wcmVmaXggbmljaykKISAgICAgICAg ICAgICAgJ2ZhY2UgJ2VyYy1uaWNrLXByZWZpeC1mYWNlKSBuaWNrKSkpCiEgCiEgKGRlZnVuIGVy Yy1nZXQtdXNlci1tb2RlLXByZWZpeCAodXNlcikKISAgICh3aGVuIHVzZXIKISAgICAgKGNvbmQg KChlcmMtY2hhbm5lbC11c2VyLW93bmVyLXAgdXNlcikKISAgICAgICAgICAgIChwcm9wZXJ0aXpl ICJ+IiAnaGVscC1lY2hvICJvd25lciIpKQohICAgICAgICAgICAoKGVyYy1jaGFubmVsLXVzZXIt YWRtaW4tcCB1c2VyKQohICAgICAgICAgICAgKHByb3BlcnRpemUgIiYiICdoZWxwLWVjaG8gImFk bWluIikpCiEgICAgICAgICAgICgoZXJjLWNoYW5uZWwtdXNlci1vcC1wIHVzZXIpCiEgICAgICAg ICAgICAocHJvcGVydGl6ZSAiQCIgJ2hlbHAtZWNobyAib3BlcmF0b3IiKSkKISAgICAgICAgICAg KChlcmMtY2hhbm5lbC11c2VyLWhhbGZvcC1wIHVzZXIpCiEgICAgICAgICAgICAocHJvcGVydGl6 ZSAiJSIgJ2hlbHAtZWNobyAiaGFsZi1vcCIpKQohICAgICAgICAgICAoKGVyYy1jaGFubmVsLXVz ZXItdm9pY2UtcCB1c2VyKQohICAgICAgICAgICAgcHJvcGVydGl6ZSAiKyIgJ2hlbHAtZWNobyAi dm9pY2UiKQohICAgICAgICAgICAodCAiIikpKSkKICAKICAoZGVmdW4gZXJjLWZvcm1hdC1Abmlj ayAoJm9wdGlvbmFsIHVzZXIgY2hhbm5lbC1kYXRhKQogICAgIkZvcm1hdCB0aGUgbmlja25hbWUg b2YgVVNFUiBzaG93aW5nIGlmIFVTRVIgaXMgYW4gb3BlcmF0b3Igb3IgaGFzIHZvaWNlLgoqKioq KioqKioqKioqKioKKioqIDQxOTgsNDIxNSAqKioqCiAgVXNlIENIQU5ORUwtREFUQSB0byBkZXRl cm1pbmUgb3AgYW5kIHZvaWNlIHN0YXR1cy4KICBTZWUgYWxzbyBgZXJjLWZvcm1hdC1uaWNrLWZ1 bmN0aW9uJy4iCiAgICAod2hlbiB1c2VyCiEgICAgIChsZXQgKChvcCAoYW5kIGNoYW5uZWwtZGF0 YSAoZXJjLWNoYW5uZWwtdXNlci1vcCBjaGFubmVsLWRhdGEpICJAIikpCiEgCSAgKHZvaWNlIChh bmQgY2hhbm5lbC1kYXRhIChlcmMtY2hhbm5lbC11c2VyLXZvaWNlIGNoYW5uZWwtZGF0YSkgIisi KSkpCiEgICAgICAgKGNvbmNhdCB2b2ljZSBvcCAoZXJjLXNlcnZlci11c2VyLW5pY2tuYW1lIHVz ZXIpKSkpKQogIAogIChkZWZ1biBlcmMtZm9ybWF0LW15LW5pY2sgKCkKICAgICJSZXR1cm4gdGhl IGJlZ2lubmluZyBvZiB0aGlzIHVzZXIncyBtZXNzYWdlLCBjb3JyZWN0bHkgcHJvcGVydGl6ZWQu IgogICAgKGlmIGVyYy1zaG93LW15LW5pY2sKISAgICAgICAobGV0ICgob3BlbiAiPCIpCiAgCSAg ICAoY2xvc2UgIj4gIikKISAJICAgIChuaWNrIChlcmMtY3VycmVudC1uaWNrKSkpCiAgCShjb25j YXQKICAJIChlcmMtcHJvcGVydGl6ZSBvcGVuICdmYWNlICdlcmMtZGVmYXVsdC1mYWNlKQogIAkg KGVyYy1wcm9wZXJ0aXplIG5pY2sgJ2ZhY2UgJ2VyYy1teS1uaWNrLWZhY2UpCiAgCSAoZXJjLXBy b3BlcnRpemUgY2xvc2UgJ2ZhY2UgJ2VyYy1kZWZhdWx0LWZhY2UpKSkKICAgICAgKGxldCAoKHBy ZWZpeCAiPiAiKSkKLS0tIDQyNDcsNDI2NyAtLS0tCiAgVXNlIENIQU5ORUwtREFUQSB0byBkZXRl cm1pbmUgb3AgYW5kIHZvaWNlIHN0YXR1cy4KICBTZWUgYWxzbyBgZXJjLWZvcm1hdC1uaWNrLWZ1 bmN0aW9uJy4iCiAgICAod2hlbiB1c2VyCiEgICAgIChsZXQgKChuaWNrIChlcmMtc2VydmVyLXVz ZXItbmlja25hbWUgdXNlcikpKQohICAgICAgIChjb25jYXQgKGVyYy1wcm9wZXJ0aXplCiEgICAg ICAgICAgICAgICAgKGVyYy1nZXQtdXNlci1tb2RlLXByZWZpeCBuaWNrKQohICAgICAgICAgICAg ICAgICdmYWNlICdlcmMtbmljay1wcmVmaXgtZmFjZSkgbmljayBuaWNrKSkpKQogIAogIChkZWZ1 biBlcmMtZm9ybWF0LW15LW5pY2sgKCkKICAgICJSZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGlz IHVzZXIncyBtZXNzYWdlLCBjb3JyZWN0bHkgcHJvcGVydGl6ZWQuIgogICAgKGlmIGVyYy1zaG93 LW15LW5pY2sKISAgICAgICAobGV0KiAoKG9wZW4gIjwiKQogICAgICAgICAgICAgICAoY2xvc2Ug Ij4gIikKISAgICAgICAgICAgICAgKG5pY2sgKGVyYy1jdXJyZW50LW5pY2spKQohICAgICAgICAg ICAgICAobW9kZSAoZXJjLWdldC11c2VyLW1vZGUtcHJlZml4IG5pY2spKSkKICAgICAgICAgIChj b25jYXQKICAgICAgICAgICAoZXJjLXByb3BlcnRpemUgb3BlbiAnZmFjZSAnZXJjLWRlZmF1bHQt ZmFjZSkKKyAgICAgICAgICAoZXJjLXByb3BlcnRpemUgbW9kZSAnZmFjZSAnZXJjLW15LW5pY2st cHJlZml4LWZhY2UpCiAgICAgICAgICAgKGVyYy1wcm9wZXJ0aXplIG5pY2sgJ2ZhY2UgJ2VyYy1t eS1uaWNrLWZhY2UpCiAgICAgICAgICAgKGVyYy1wcm9wZXJ0aXplIGNsb3NlICdmYWNlICdlcmMt ZGVmYXVsdC1mYWNlKSkpCiAgICAgIChsZXQgKChwcmVmaXggIj4gIikpCioqKioqKioqKioqKioq KgoqKiogNDY4NSw0NjkxICoqKioKICAgIChsZXQgKChzdHIgKG9yIChjZHIgKGFzc29jICJQUkVG SVgiIChlcmMtd2l0aC1zZXJ2ZXItYnVmZmVyCiAgCQkJCQllcmMtc2VydmVyLXBhcmFtZXRlcnMp KSkKICAJCSA7OyBwcm92aWRlIGEgc2FuZSBkZWZhdWx0CiEgCQkgIihvdilAKyIpKQogIAl0eXBl cyBjaGFycykKICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaCAiXihcXChbXildK1xcKSlcXCguK1xc KSQiIHN0cikKICAgICAgICAoc2V0cSB0eXBlcyAobWF0Y2gtc3RyaW5nIDEgc3RyKQotLS0gNDcz Nyw0NzQzIC0tLS0KICAgIChsZXQgKChzdHIgKG9yIChjZHIgKGFzc29jICJQUkVGSVgiIChlcmMt d2l0aC1zZXJ2ZXItYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGVyYy1zZXJ2ZXItcGFyYW1ldGVycykpKQogICAgICAgICAgICAgICAgICAgOzsgcHJvdmlk ZSBhIHNhbmUgZGVmYXVsdAohICAgICAgICAgICAgICAgICAgIihxYW9odil+JkAlKyIpKQogICAg ICAgICAgdHlwZXMgY2hhcnMpCiAgICAgICh3aGVuIChzdHJpbmctbWF0Y2ggIl4oXFwoW14pXStc XCkpXFwoLitcXCkkIiBzdHIpCiAgICAgICAgKHNldHEgdHlwZXMgKG1hdGNoLXN0cmluZyAxIHN0 cikKKioqKioqKioqKioqKioqCioqKiA0NzA1LDQ3NDQgKioqKgogIFVwZGF0ZSBgZXJjLWNoYW5u ZWwtdXNlcnMnIGFjY29yZGluZyB0byBOQU1FUy1TVFJJTkcuCiAgTkFNRVMtU1RSSU5HIGlzIGEg c3RyaW5nIGxpc3Rpbmcgc29tZSBvZiB0aGUgbmFtZXMgb24gdGhlCiAgY2hhbm5lbC4iCiEgICAo bGV0IChwcmVmaXggb3AtY2ggdm9pY2UtY2ggbmFtZXMgbmFtZSBvcCB2b2ljZSkKISAgICAgKHNl dHEgcHJlZml4IChlcmMtcGFyc2UtcHJlZml4KSkKISAgICAgKHNldHEgb3AtY2ggKGNkciAoYXNz cSA/byBwcmVmaXgpKQohIAkgIHZvaWNlLWNoIChjZHIgKGFzc3EgP3YgcHJlZml4KSkpCiEgICAg IDs7IFdlIG5lZWQgdG8gZGVsZXRlICIiIGJlY2F1c2UgaW4gWEVtYWNzLCAoc3BsaXQtc3RyaW5n ICJhICIpCiEgICAgIDs7IHJldHVybnMgKCJhIiAiIikuCiAgICAgIChzZXRxIG5hbWVzIChkZWxl dGUgIiIgKHNwbGl0LXN0cmluZyBuYW1lcy1zdHJpbmcpKSkKICAgICAgKGxldCAoKGVyYy1jaGFu bmVsLW1lbWJlcnMtY2hhbmdlZC1ob29rIG5pbCkpCiAgICAgICAgKGRvbGlzdCAoaXRlbSBuYW1l cykKICAJKGxldCAoKHVwZGF0ZXAgdCkpCiAgCSAgKGlmIChyYXNzcSAoZWx0IGl0ZW0gMCkgcHJl Zml4KQogIAkgICAgICAoY29uZCAoKD0gKGxlbmd0aCBpdGVtKSAxKQogIAkJICAgICAoc2V0cSB1 cGRhdGVwIG5pbCkpCi0gCQkgICAgKChlcSAoZWx0IGl0ZW0gMCkgb3AtY2gpCi0gCQkgICAgIChz ZXRxIG5hbWUgKHN1YnN0cmluZyBpdGVtIDEpCi0gCQkJICAgb3AgJ29uCi0gCQkJICAgdm9pY2Ug J29mZikpCiAgCQkgICAgKChlcSAoZWx0IGl0ZW0gMCkgdm9pY2UtY2gpCiAgCQkgICAgIChzZXRx IG5hbWUgKHN1YnN0cmluZyBpdGVtIDEpCi0gCQkJICAgb3AgJ29mZgogIAkJCSAgIHZvaWNlICdv bikpCiEgCQkgICAgKHQgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0ZW0gMSkKISAJCQkgICAgIG9w ICdvZmYKISAJCQkgICAgIHZvaWNlICdvZmYpKSkKISAJICAgIChzZXRxIG5hbWUgaXRlbQohIAkJ ICBvcCAnb2ZmCiEgCQkgIHZvaWNlICdvZmYpKQogIAkgICh3aGVuIHVwZGF0ZXAKICAJICAgIChw dXRoYXNoIChlcmMtZG93bmNhc2UgbmFtZSkgdAogIAkJICAgICBlcmMtY2hhbm5lbC1uZXctbWVt YmVyLW5hbWVzKQogIAkgICAgKGVyYy11cGRhdGUtY3VycmVudC1jaGFubmVsLW1lbWJlcgohIAkg ICAgIG5hbWUgbmFtZSB0IG9wIHZvaWNlKSkpKSkKICAgICAgKHJ1bi1ob29rcyAnZXJjLWNoYW5u ZWwtbWVtYmVycy1jaGFuZ2VkLWhvb2spKSkKICAKICAoZGVmY3VzdG9tIGVyYy1jaGFubmVsLW1l bWJlcnMtY2hhbmdlZC1ob29rIG5pbAogICAgIlRoaXMgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGlt ZSB0aGUgdmFyaWFibGUgYGNoYW5uZWwtbWVtYmVycycgY2hhbmdlcy4KICBUaGUgYnVmZmVyIHdo ZXJlIHRoZSBjaGFuZ2UgaGFwcGVuZWQgaXMgY3VycmVudCB3aGlsZSB0aGlzIGhvb2sgaXMgY2Fs bGVkLiIKLS0tIDQ3NTcsNDgwMCAtLS0tCiAgVXBkYXRlIGBlcmMtY2hhbm5lbC11c2VycycgYWNj b3JkaW5nIHRvIE5BTUVTLVNUUklORy4KICBOQU1FUy1TVFJJTkcgaXMgYSBzdHJpbmcgbGlzdGlu ZyBzb21lIG9mIHRoZSBuYW1lcyBvbiB0aGUKICBjaGFubmVsLiIKISAgIChsZXQqICgocHJlZml4 IChlcmMtcGFyc2UtcHJlZml4KSkKISAgICAgICAgICAob3AtY2ggKGNkciAoYXNzcSA/byBwcmVm aXgpKSkKISAgICAgICAgICAodm9pY2UtY2ggKGNkciAoYXNzcSA/diBwcmVmaXgpKSkKISAgICAg ICAgICAoYWRtLWNoIChjZHIgKGFzc3EgP2EgcHJlZml4KSkpCiEgICAgICAgICAgKG93bi1jaCAo Y2RyIChhc3NxID9xIHByZWZpeCkpKQohICAgICAgICAgIG5hbWVzIG5hbWUgb3Agdm9pY2UgaGFs Zm9wIGFkbWluIG93bmVyKQogICAgICAoc2V0cSBuYW1lcyAoZGVsZXRlICIiIChzcGxpdC1zdHJp bmcgbmFtZXMtc3RyaW5nKSkpCiAgICAgIChsZXQgKChlcmMtY2hhbm5lbC1tZW1iZXJzLWNoYW5n ZWQtaG9vayBuaWwpKQogICAgICAgIChkb2xpc3QgKGl0ZW0gbmFtZXMpCiAgICAgICAgICAobGV0 ICgodXBkYXRlcCB0KSkKKyAgICAgICAgICAgKHNldHEgbmFtZSBpdGVtIG9wICdvZmYgdm9pY2Ug J29mZiBoYWxmb3AgJ29mZiBhZG1pbiAnb2ZmIG93bmVyICdvZmYpCiAgICAgICAgICAgIChpZiAo cmFzc3EgKGVsdCBpdGVtIDApIHByZWZpeCkKICAgICAgICAgICAgICAgIChjb25kICgoPSAobGVu Z3RoIGl0ZW0pIDEpCiAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgdXBkYXRlcCBuaWwpKQog ICAgICAgICAgICAgICAgICAgICAgKChlcSAoZWx0IGl0ZW0gMCkgdm9pY2UtY2gpCiAgICAgICAg ICAgICAgICAgICAgICAgKHNldHEgbmFtZSAoc3Vic3RyaW5nIGl0ZW0gMSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB2b2ljZSAnb24pKQohICAgICAgICAgICAgICAgICAgICAgKChlcSAo ZWx0IGl0ZW0gMCkgaG9wLWNoKQohICAgICAgICAgICAgICAgICAgICAgIChzZXRxIG5hbWUgKHN1 YnN0cmluZyBpdGVtIDEpCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZm9wICdvbikp CiEgICAgICAgICAgICAgICAgICAgICAoKGVxIChlbHQgaXRlbSAwKSBvcC1jaCkKISAgICAgICAg ICAgICAgICAgICAgICAoc2V0cSBuYW1lIChzdWJzdHJpbmcgaXRlbSAxKQohICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG9wICdvbikpCiEgICAgICAgICAgICAgICAgICAgICAoKGVxIChlbHQg aXRlbSAwKSBhZG0tY2gpCiEgICAgICAgICAgICAgICAgICAgICAgKHNldHEgbmFtZSAoc3Vic3Ry aW5nIGl0ZW0gMSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbiAnb24pKQohICAg ICAgICAgICAgICAgICAgICAgKChlcSAoZWx0IGl0ZW0gMCkgb3duLWNoKQohICAgICAgICAgICAg ICAgICAgICAgIChzZXRxIG5hbWUgKHN1YnN0cmluZyBpdGVtIDEpCiEgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb3duZXIgJ29uKSkKISAgICAgICAgICAgICAgICAgICAgICh0IChzZXRxIG5h bWUgKHN1YnN0cmluZyBpdGVtIDEpKSkpKQogICAgICAgICAgICAod2hlbiB1cGRhdGVwCiAgICAg ICAgICAgICAgKHB1dGhhc2ggKGVyYy1kb3duY2FzZSBuYW1lKSB0CiAgICAgICAgICAgICAgICAg ICAgICAgZXJjLWNoYW5uZWwtbmV3LW1lbWJlci1uYW1lcykKICAgICAgICAgICAgICAoZXJjLXVw ZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyCiEgICAgICAgICAgICAgIG5hbWUgbmFtZSB0IHZv aWNlIGhhbGZvcCBvcCBhZG1pbiBvd25lcikpKSkpCiAgICAgIChydW4taG9va3MgJ2VyYy1jaGFu bmVsLW1lbWJlcnMtY2hhbmdlZC1ob29rKSkpCiAgCisgCiAgKGRlZmN1c3RvbSBlcmMtY2hhbm5l bC1tZW1iZXJzLWNoYW5nZWQtaG9vayBuaWwKICAgICJUaGlzIGhvb2sgaXMgY2FsbGVkIGV2ZXJ5 IHRpbWUgdGhlIHZhcmlhYmxlIGBjaGFubmVsLW1lbWJlcnMnIGNoYW5nZXMuCiAgVGhlIGJ1ZmZl ciB3aGVyZSB0aGUgY2hhbmdlIGhhcHBlbmVkIGlzIGN1cnJlbnQgd2hpbGUgdGhpcyBob29rIGlz IGNhbGxlZC4iCioqKioqKioqKioqKioqKgoqKiogNDc5NSw0ODEwICoqKioKICAgICAgY2hhbmdl ZCkpCiAgCiAgKGRlZnVuIGVyYy11cGRhdGUtY3VycmVudC1jaGFubmVsLW1lbWJlcgohICAgKG5p Y2sgbmV3LW5pY2sgJm9wdGlvbmFsIGFkZCBvcCB2b2ljZSBob3N0IGxvZ2luIGZ1bGwtbmFtZSBp bmZvCiAgCXVwZGF0ZS1tZXNzYWdlLXRpbWUpCiAgICAiVXBkYXRlIHRoZSBzdG9yZWQgdXNlciBp bmZvcm1hdGlvbiBmb3IgdGhlIHVzZXIgd2l0aCBuaWNrbmFtZSBOSUNLLgogIGBlcmMtdXBkYXRl LXVzZXInIGlzIGNhbGxlZCB0byBoYW5kbGUgY2hhbmdlcyB0byBuaWNrbmFtZSwKISBIT1NULCBM T0dJTiwgRlVMTC1OQU1FLCBhbmQgSU5GTy4gIElmIE9QIG9yIFZPSUNFIGFyZSBub24tbmlsLAoh IHRoZXkgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgYG9uJyBvciBgb2ZmJywgaW4gd2hpY2ggY2Fz ZSB0aGUKISBvcGVyYXRvciBvciB2b2ljZSBzdGF0dXMgb2YgdGhlIHVzZXIgaW4gdGhlIGN1cnJl bnQgY2hhbm5lbCBpcwohIGNoYW5nZWQgYWNjb3JkaW5nbHkuICBJZiBVUERBVEUtTUVTU0FHRS1U SU1FIGlzIG5vbi1uaWwsIHRoZQohIGxhc3QtbWVzc2FnZS10aW1lIG9mIHRoZSB1c2VyIGluIHRo ZSBjdXJyZW50IGNoYW5uZWwgaXMgc2V0CiEgdG8gKGN1cnJlbnQtdGltZSkuCiAgCiAgSWYgQURE IGlzIG5vbi1uaWwsIHRoZSB1c2VyIHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgc3BlY2lmaWVkCiAg aW5mb3JtYXRpb24gaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgdXNlciBvciBj aGFubmVsCi0tLSA0ODUxLDQ4NjUgLS0tLQogICAgICBjaGFuZ2VkKSkKICAKICAoZGVmdW4gZXJj LXVwZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyCiEgICAobmljayBuZXctbmljayAmb3B0aW9u YWwgYWRkIHZvaWNlIGhhbGZvcCBvcCBhZG1pbiBvd25lciBob3N0IGxvZ2luIGZ1bGwtbmFtZSBp bmZvCiAgICAgICAgICB1cGRhdGUtbWVzc2FnZS10aW1lKQogICAgIlVwZGF0ZSB0aGUgc3RvcmVk IHVzZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIHdpdGggbmlja25hbWUgTklDSy4KICBgZXJj LXVwZGF0ZS11c2VyJyBpcyBjYWxsZWQgdG8gaGFuZGxlIGNoYW5nZXMgdG8gbmlja25hbWUsCiEg SE9TVCwgTE9HSU4sIEZVTEwtTkFNRSwgYW5kIElORk8uICBJZiBWT0lDRSBIQUxGT1AgT1AgQURN SU4gb3IgT1dORVIKISBhcmUgbm9uLW5pbCwgdGhleSBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciBg b24nIG9yIGBvZmYnLCBpbiB3aGljaAohIGNhc2UgdGhlIHN0YXR1cyBvZiB0aGUgdXNlciBpbiB0 aGUgY3VycmVudCBjaGFubmVsIGlzIGNoYW5nZWQgYWNjb3JkaW5nbHkuCiEgSWYgVVBEQVRFLU1F U1NBR0UtVElNRSBpcyBub24tbmlsLCB0aGUgbGFzdC1tZXNzYWdlLXRpbWUgb2YgdGhlIHVzZXIK ISAgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbCBpcyBzZXQgdG8gKGN1cnJlbnQtdGltZSkuCiAgCiAg SWYgQUREIGlzIG5vbi1uaWwsIHRoZSB1c2VyIHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgc3BlY2lm aWVkCiAgaW5mb3JtYXRpb24gaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgdXNl ciBvciBjaGFubmVsCioqKioqKioqKioqKioqKgoqKiogNDgyMiw0ODI3ICoqKioKLS0tIDQ4Nzcs NDg5NiAtLS0tCiAgICAgIChpZiBjdXNlcgogICAgICAgICAgKHByb2duCiAgICAgICAgICAgIChl cmMtbG9nIChmb3JtYXQgInVwZGF0ZS1tZW1iZXI6IHVzZXIgPSAlUywgY3VzZXIgPSAlUyIgdXNl ciBjdXNlcikpCisgICAgICAgICAgICh3aGVuIChhbmQgdm9pY2UKKyAgICAgICAgICAgICAgICAg ICAgICAobm90IChlcSAoZXJjLWNoYW5uZWwtdXNlci12b2ljZSBjdXNlcikgdm9pY2UpKSkKKyAg ICAgICAgICAgICAoc2V0cSBjaGFuZ2VkIHQpCisgICAgICAgICAgICAgKHNldGYgKGVyYy1jaGFu bmVsLXVzZXItdm9pY2UgY3VzZXIpCisgICAgICAgICAgICAgICAgICAgKGNvbmQgKChlcSB2b2lj ZSAnb24pIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgKChlcSB2b2ljZSAnb2ZmKSBuaWwp CisgICAgICAgICAgICAgICAgICAgICAgICAgKHQgdm9pY2UpKSkpCisgICAgICAgICAgICh3aGVu IChhbmQgaGFsZm9wCisgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoZXEgKGVyYy1jaGFubmVs LXVzZXItaGFsZm9wIGN1c2VyKSBoYWxmb3ApKSkKKyAgICAgICAgICAgICAoc2V0cSBjaGFuZ2Vk IHQpCisgICAgICAgICAgICAgKHNldGYgKGVyYy1jaGFubmVsLXVzZXItaGFsZm9wIGN1c2VyKQor ICAgICAgICAgICAgICAgICAgIChjb25kICgoZXEgaGFsZm9wICdvbikgdCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAoKGVxIGhhbGZvcCAnb2ZmKSBuaWwpCisgICAgICAgICAgICAgICAgICAg ICAgICAgKHQgaGFsZm9wKSkpKQogICAgICAgICAgICAod2hlbiAoYW5kIG9wCiAgICAgICAgICAg ICAgICAgICAgICAgKG5vdCAoZXEgKGVyYy1jaGFubmVsLXVzZXItb3AgY3VzZXIpIG9wKSkpCiAg ICAgICAgICAgICAgKHNldHEgY2hhbmdlZCB0KQoqKioqKioqKioqKioqKioKKioqIDQ4MjksNDg0 MSAqKioqCiAgCQkgIChjb25kICgoZXEgb3AgJ29uKSB0KQogIAkJCSgoZXEgb3AgJ29mZikgbmls KQogIAkJCSh0IG9wKSkpKQohIAkgICh3aGVuIChhbmQgdm9pY2UKISAJCSAgICAgKG5vdCAoZXEg KGVyYy1jaGFubmVsLXVzZXItdm9pY2UgY3VzZXIpIHZvaWNlKSkpCiAgCSAgICAgIChzZXRxIGNo YW5nZWQgdCkKISAJICAgIChzZXRmIChlcmMtY2hhbm5lbC11c2VyLXZvaWNlIGN1c2VyKQohIAkJ ICAoY29uZCAoKGVxIHZvaWNlICdvbikgdCkKISAJCQkoKGVxIHZvaWNlICdvZmYpIG5pbCkKISAJ CQkodCB2b2ljZSkpKSkKICAJICAod2hlbiB1cGRhdGUtbWVzc2FnZS10aW1lCiAgCSAgICAoc2V0 ZiAoZXJjLWNoYW5uZWwtdXNlci1sYXN0LW1lc3NhZ2UtdGltZSBjdXNlcikgKGN1cnJlbnQtdGlt ZSkpKQogIAkgIChzZXRxIHVzZXItY2hhbmdlZAotLS0gNDg5OCw0OTE3IC0tLS0KICAgICAgICAg ICAgICAgICAgICAoY29uZCAoKGVxIG9wICdvbikgdCkKICAgICAgICAgICAgICAgICAgICAgICAg ICAoKGVxIG9wICdvZmYpIG5pbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAodCBvcCkpKSkK ISAgICAgICAgICAgKHdoZW4gKGFuZCBhZG1pbgohICAgICAgICAgICAgICAgICAgICAgIChub3Qg KGVxIChlcmMtY2hhbm5lbC11c2VyLWFkbWluIGN1c2VyKSBhZG1pbikpKQogICAgICAgICAgICAg IChzZXRxIGNoYW5nZWQgdCkKISAgICAgICAgICAgICAoc2V0ZiAoZXJjLWNoYW5uZWwtdXNlci1h ZG1pbiBjdXNlcikKISAgICAgICAgICAgICAgICAgICAoY29uZCAoKGVxIGFkbWluICdvbikgdCkK ISAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIGFkbWluICdvZmYpIG5pbCkKISAgICAgICAg ICAgICAgICAgICAgICAgICAodCBhZG1pbikpKSkKISAgICAgICAgICAgKHdoZW4gKGFuZCBvd25l cgohICAgICAgICAgICAgICAgICAgICAgIChub3QgKGVxIChlcmMtY2hhbm5lbC11c2VyLW93bmVy IGN1c2VyKSBvd25lcikpKQohICAgICAgICAgICAgIChzZXRxIGNoYW5nZWQgdCkKISAgICAgICAg ICAgICAoc2V0ZiAoZXJjLWNoYW5uZWwtdXNlci1vd25lciBjdXNlcikKISAgICAgICAgICAgICAg ICAgICAoY29uZCAoKGVxIG93bmVyICdvbikgdCkKISAgICAgICAgICAgICAgICAgICAgICAgICAo KGVxIG93bmVyICdvZmYpIG5pbCkKISAgICAgICAgICAgICAgICAgICAgICAgICAodCBvd25lcikp KSkKICAgICAgICAgICAgKHdoZW4gdXBkYXRlLW1lc3NhZ2UtdGltZQogICAgICAgICAgICAgIChz ZXRmIChlcmMtY2hhbm5lbC11c2VyLWxhc3QtbWVzc2FnZS10aW1lIGN1c2VyKSAoY3VycmVudC10 aW1lKSkpCiAgICAgICAgICAgIChzZXRxIHVzZXItY2hhbmdlZAoqKioqKioqKioqKioqKioKKioq IDQ4NTYsNDg2NyAqKioqCiAgCQkoY29ucyAoY3VycmVudC1idWZmZXIpCiAgCQkgICAgICAoZXJj LXNlcnZlci11c2VyLWJ1ZmZlcnMgdXNlcikpKSkKICAJKHNldHEgY3VzZXIgKG1ha2UtZXJjLWNo YW5uZWwtdXNlcgotIAkJICAgICA6b3AgKGNvbmQgKChlcSBvcCAnb24pIHQpCi0gCQkJICAgICAg ICgoZXEgb3AgJ29mZikgbmlsKQotIAkJCSAgICAgICAodCBvcCkpCiAgCQkgICAgIDp2b2ljZSAo Y29uZCAoKGVxIHZvaWNlICdvbikgdCkKICAJCQkJICAoKGVxIHZvaWNlICdvZmYpIG5pbCkKICAJ CQkJICAodCB2b2ljZSkpCiAgCQkgICAgIDpsYXN0LW1lc3NhZ2UtdGltZQogIAkJICAgICAoaWYg dXBkYXRlLW1lc3NhZ2UtdGltZSAoY3VycmVudC10aW1lKSkpKQogIAkocHV0aGFzaCAoZXJjLWRv d25jYXNlIG5pY2spIChjb25zIHVzZXIgY3VzZXIpCi0tLSA0OTMyLDQ5NTIgLS0tLQogICAgICAg ICAgICAgICAgICAoY29ucyAoY3VycmVudC1idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAg IChlcmMtc2VydmVyLXVzZXItYnVmZmVycyB1c2VyKSkpKQogICAgICAgICAgKHNldHEgY3VzZXIg KG1ha2UtZXJjLWNoYW5uZWwtdXNlcgogICAgICAgICAgICAgICAgICAgICAgIDp2b2ljZSAoY29u ZCAoKGVxIHZvaWNlICdvbikgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KChlcSB2b2ljZSAnb2ZmKSBuaWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICh0IHZvaWNlKSkKKyAgICAgICAgICAgICAgICAgICAgICA6aGFsZm9wIChjb25kICgoZXEgaGFs Zm9wICdvbikgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEgaGFsZm9w ICdvZmYpIG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0IGhhbGZvcCkp CisgICAgICAgICAgICAgICAgICAgICAgOm9wIChjb25kICgoZXEgb3AgJ29uKSB0KQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIG9wICdvZmYpIG5pbCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHQgb3ApKQorICAgICAgICAgICAgICAgICAgICAgIDphZG1p biAoY29uZCAoKGVxIGFkbWluICdvbikgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKChlcSBhZG1pbiAnb2ZmKSBuaWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICh0IGFkbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICA6b3duZXIgKGNvbmQgKChl cSBvd25lciAnb24pIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXEg b3duZXIgJ29mZikgbmlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCBv d25lcikpCiAgICAgICAgICAgICAgICAgICAgICAgOmxhc3QtbWVzc2FnZS10aW1lCiAgICAgICAg ICAgICAgICAgICAgICAgKGlmIHVwZGF0ZS1tZXNzYWdlLXRpbWUgKGN1cnJlbnQtdGltZSkpKSkK ICAgICAgICAgIChwdXRoYXNoIChlcmMtZG93bmNhc2UgbmljaykgKGNvbnMgdXNlciBjdXNlcikK KioqKioqKioqKioqKioqCioqKiA0ODcyLDQ4NzggKioqKgogICAgICAob3IgY2hhbmdlZCB1c2Vy LWNoYW5nZWQgYWRkKSkpCiAgCiAgKGRlZnVuIGVyYy11cGRhdGUtY2hhbm5lbC1tZW1iZXIgKGNo YW5uZWwgbmljayBuZXctbmljawohIAkJCQkgICZvcHRpb25hbCBhZGQgb3Agdm9pY2UgaG9zdCBs b2dpbgogIAkJCQkgIGZ1bGwtbmFtZSBpbmZvIHVwZGF0ZS1tZXNzYWdlLXRpbWUpCiAgICAiVXBk YXRlIHVzZXIgYW5kIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIHdpdGgKICBuaWNr bmFtZSBOSUNLIGluIGNoYW5uZWwgQ0hBTk5FTC4KLS0tIDQ5NTcsNDk2MyAtLS0tCiAgICAgIChv ciBjaGFuZ2VkIHVzZXItY2hhbmdlZCBhZGQpKSkKICAKICAoZGVmdW4gZXJjLXVwZGF0ZS1jaGFu bmVsLW1lbWJlciAoY2hhbm5lbCBuaWNrIG5ldy1uaWNrCiEgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbmFsIGFkZCB2b2ljZSBoYWxmb3Agb3AgYWRtaW4g b3duZXIgaG9zdCBsb2dpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZ1bGwtbmFtZSBpbmZvIHVwZGF0ZS1tZXNzYWdlLXRpbWUpCiAgICAiVXBkYXRlIHVzZXIg YW5kIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIHdpdGgKICBuaWNrbmFtZSBOSUNL IGluIGNoYW5uZWwgQ0hBTk5FTC4KKioqKioqKioqKioqKioqCioqKiA0ODgwLDQ4ODYgKioqKgog IFNlZSBhbHNvOiBgZXJjLXVwZGF0ZS1jdXJyZW50LWNoYW5uZWwtbWVtYmVyJy4iCiAgICAoZXJj LXdpdGgtYnVmZmVyCiAgICAgKGNoYW5uZWwpCiEgICAgKGVyYy11cGRhdGUtY3VycmVudC1jaGFu bmVsLW1lbWJlciBuaWNrIG5ldy1uaWNrIGFkZCBvcCB2b2ljZSBob3N0CiAgCQkJCSAgICAgIGxv Z2luIGZ1bGwtbmFtZSBpbmZvCiAgCQkJCSAgICAgIHVwZGF0ZS1tZXNzYWdlLXRpbWUpKSkKICAK LS0tIDQ5NjUsNDk3MSAtLS0tCiAgU2VlIGFsc286IGBlcmMtdXBkYXRlLWN1cnJlbnQtY2hhbm5l bC1tZW1iZXInLiIKICAgIChlcmMtd2l0aC1idWZmZXIKICAgICAgICAoY2hhbm5lbCkKISAgICAg KGVyYy11cGRhdGUtY3VycmVudC1jaGFubmVsLW1lbWJlciBuaWNrIG5ldy1uaWNrIGFkZCB2b2lj ZSBoYWxmb3Agb3AgYWRtaW4gb3duZXIgaG9zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxvZ2luIGZ1bGwtbmFtZSBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdXBkYXRlLW1lc3NhZ2UtdGltZSkpKQogIAoqKioqKioqKioqKioq KioKKioqIDQ5NzksNDk4NSAqKioqCiAgCSh3aGlsZSBjaGFycwogIAkgIChjb25kICgoc3RyaW5n PSAoY2FyIGNoYXJzKSAiKyIpIChzZXRxIGFkZC1wIHQpKQogIAkJKChzdHJpbmc9IChjYXIgY2hh cnMpICItIikgKHNldHEgYWRkLXAgbmlsKSkKISAJCSgoc3RyaW5nLW1hdGNoICJeW292Yk9WQl0i IChjYXIgY2hhcnMpKQogIAkJIChzZXRxIGFyZy1tb2RlcyAoY29ucyAobGlzdCAoY2FyIGNoYXJz KQogIAkJCQkJICAgICAoaWYgYWRkLXAgJ29uICdvZmYpCiAgCQkJCQkgICAgIChpZiBhcmdzIChj YXIgYXJncykgbmlsKSkKLS0tIDUwNjQsNTA3MCAtLS0tCiAgICAgICAgICAod2hpbGUgY2hhcnMK ICAgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IChjYXIgY2hhcnMpICIrIikgKHNldHEgYWRkLXAg dCkpCiAgICAgICAgICAgICAgICAgICgoc3RyaW5nPSAoY2FyIGNoYXJzKSAiLSIpIChzZXRxIGFk ZC1wIG5pbCkpCiEgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW3Fhb3ZoYlFBT1ZI Ql0iIChjYXIgY2hhcnMpKQogICAgICAgICAgICAgICAgICAgKHNldHEgYXJnLW1vZGVzIChjb25z IChsaXN0IChjYXIgY2hhcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGlmIGFkZC1wICdvbiAnb2ZmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChpZiBhcmdzIChjYXIgYXJncykgbmlsKSkKKioqKioqKioqKioq KioqCioqKiA1MDM1LDUwNDUgKioqKgogIAkJIChsZXQgKChtb2RlIChudGggMCAoY2FyIGFyZy1t b2RlcykpKQogIAkJICAgICAgIChvbm9mZiAobnRoIDEgKGNhciBhcmctbW9kZXMpKSkKICAJCSAg ICAgICAoYXJnIChudGggMiAoY2FyIGFyZy1tb2RlcykpKSkKISAJCSAgIChjb25kICgoc3RyaW5n LW1hdGNoICJeW29PXSIgbW9kZSkKICAJCQkgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIHRn dCBhcmcgYXJnIG5pbCBvbm9mZikpCiEgCQkJICgoc3RyaW5nLW1hdGNoICJeW1Z2XSIgbW9kZSkK ISAJCQkgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIHRndCBhcmcgYXJnIG5pbCBuaWwKISAJ CQkJCQkgICAgIG9ub2ZmKSkKICAJCQkgKChzdHJpbmctbWF0Y2ggIl5bTGxdIiBtb2RlKQogIAkJ CSAgKGVyYy11cGRhdGUtY2hhbm5lbC1saW1pdCB0Z3Qgb25vZmYgYXJnKSkKICAJCQkgKChzdHJp bmctbWF0Y2ggIl5bS2tdIiBtb2RlKQotLS0gNTEyMCw1MTM1IC0tLS0KICAgICAgICAgICAgICAg ICAgIChsZXQgKChtb2RlIChudGggMCAoY2FyIGFyZy1tb2RlcykpKQogICAgICAgICAgICAgICAg ICAgICAgICAgKG9ub2ZmIChudGggMSAoY2FyIGFyZy1tb2RlcykpKQogICAgICAgICAgICAgICAg ICAgICAgICAgKGFyZyAobnRoIDIgKGNhciBhcmctbW9kZXMpKSkpCiEgICAgICAgICAgICAgICAg ICAgIChjb25kICgoc3RyaW5nLW1hdGNoICJeW1Z2XSIgbW9kZSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIHRndCBhcmcgYXJnIG5pbCBvbm9m ZikpCiEgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW2hIXSIgbW9k ZSkKISAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVy IHRndCBhcmcgYXJnIG5pbCBuaWwgb25vZmYpKQohICAgICAgICAgICAgICAgICAgICAgICAgICAo KHN0cmluZy1tYXRjaCAiXltvT10iIG1vZGUpCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAo ZXJjLXVwZGF0ZS1jaGFubmVsLW1lbWJlciB0Z3QgYXJnIGFyZyBuaWwgbmlsIG5pbCBvbm9mZikp CiEgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nLW1hdGNoICJeW2FBXSIgbW9kZSkK ISAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIHRn dCBhcmcgYXJnIG5pbCBuaWwgbmlsIG5pbCBvbm9mZikpCiEgICAgICAgICAgICAgICAgICAgICAg ICAgICgoc3RyaW5nLW1hdGNoICJeW3FRXSIgbW9kZSkKISAgICAgICAgICAgICAgICAgICAgICAg ICAgIChlcmMtdXBkYXRlLWNoYW5uZWwtbWVtYmVyIHRndCBhcmcgYXJnIG5pbCBuaWwgbmlsIG5p bCBuaWwgb25vZmYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmluZy1tYXRjaCAi XltMbF0iIG1vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJjLXVwZGF0ZS1jaGFu bmVsLWxpbWl0IHRndCBvbm9mZiBhcmcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0 cmluZy1tYXRjaCAiXltLa10iIG1vZGUpCioqKioqKioqKioqKioqKgoqKiogNTk3OCw2MDAzICoq KioKICAJICh1c2VyIChpZiBjaGFubmVsLWRhdGEKICAJCSAgIChjYXIgY2hhbm5lbC1kYXRhKQog IAkJIChlcmMtZ2V0LXNlcnZlci11c2VyIHdvcmQpKSkKISAJIGhvc3QgbG9naW4gZnVsbC1uYW1l IG5pY2sgb3Agdm9pY2UpCiAgICAgICh3aGVuIHVzZXIKICAgICAgICAoc2V0cSBuaWNrIChlcmMt c2VydmVyLXVzZXItbmlja25hbWUgdXNlcikKICAJICAgIGhvc3QgKGVyYy1zZXJ2ZXItdXNlci1o b3N0IHVzZXIpCiAgCSAgICBsb2dpbiAoZXJjLXNlcnZlci11c2VyLWxvZ2luIHVzZXIpCiAgCSAg ICBmdWxsLW5hbWUgKGVyYy1zZXJ2ZXItdXNlci1mdWxsLW5hbWUgdXNlcikpCiAgICAgICAgKGlm IGN1c2VyCiEgCSAgKHNldHEgb3AgKGVyYy1jaGFubmVsLXVzZXItb3AgY3VzZXIpCiEgCQl2b2lj ZSAoZXJjLWNoYW5uZWwtdXNlci12b2ljZSBjdXNlcikpKQogICAgICAgIChpZiAoY2FsbGVkLWlu dGVyYWN0aXZlbHktcCAnaW50ZXJhY3RpdmUpCiAgCSAgKG1lc3NhZ2UgIiVzIGlzICVzQCVzJXMl cyIKICAJCSAgIG5pY2sgbG9naW4gaG9zdAogIAkJICAgKGlmIGZ1bGwtbmFtZSAoZm9ybWF0ICIg KCVzKSIgZnVsbC1uYW1lKSAiIikKISAJCSAgIChpZiAob3Igb3Agdm9pY2UpCiAgCQkJICAgICAg IChmb3JtYXQgIiBhbmQgaXMgKyVzJXMgb24gJXMiCi0gCQkJICAgICAgIChpZiBvcCAibyIgIiIp CiAgCQkJICAgICAgIChpZiB2b2ljZSAidiIgIiIpCiAgCQkJICAgICAgIChlcmMtZGVmYXVsdC10 YXJnZXQpKQogIAkJCSAgICAgIiIpKQohIAl1c2VyKSkpKQogIAogIChkZWZ1biBlcmMtYXdheS10 aW1lICgpCiAgICAiUmV0dXJuIG5vbi1uaWwgaWYgdGhlIGN1cnJlbnQgRVJDIHByb2Nlc3MgaXMg c2V0IGF3YXkuCi0tLSA2MDY4LDYwOTkgLS0tLQogICAgICAgICAgICh1c2VyIChpZiBjaGFubmVs LWRhdGEKICAgICAgICAgICAgICAgICAgICAgKGNhciBjaGFubmVsLWRhdGEpCiAgICAgICAgICAg ICAgICAgICAoZXJjLWdldC1zZXJ2ZXItdXNlciB3b3JkKSkpCiEgICAgICAgICAgaG9zdCBsb2dp biBmdWxsLW5hbWUgbmljayB2b2ljZSBoYWxmb3Agb3AgYWRtaW4gb3duZXIpCiAgICAgICh3aGVu IHVzZXIKICAgICAgICAoc2V0cSBuaWNrIChlcmMtc2VydmVyLXVzZXItbmlja25hbWUgdXNlcikK ICAgICAgICAgICAgICBob3N0IChlcmMtc2VydmVyLXVzZXItaG9zdCB1c2VyKQogICAgICAgICAg ICAgIGxvZ2luIChlcmMtc2VydmVyLXVzZXItbG9naW4gdXNlcikKICAgICAgICAgICAgICBmdWxs LW5hbWUgKGVyYy1zZXJ2ZXItdXNlci1mdWxsLW5hbWUgdXNlcikpCiAgICAgICAgKGlmIGN1c2Vy CiEgICAgICAgICAgIChzZXRxIHZvaWNlIChlcmMtY2hhbm5lbC11c2VyLXZvaWNlIGN1c2VyKQoh ICAgICAgICAgICAgICAgICBoYWxmb3AgKGVyYy1jaGFubmVsLXVzZXItaGFsZm9wIGN1c2VyKQoh ICAgICAgICAgICAgICAgICBvcCAoZXJjLWNoYW5uZWwtdXNlci1vcCBjdXNlcikKISAgICAgICAg ICAgICAgICAgYWRtaW4gKGVyYy1jaGFubmVsLXVzZXItYWRtaW4gY3VzZXIpCiEgICAgICAgICAg ICAgICAgIG93bmVyIChlcmMtY2hhbm5lbC11c2VyLW93bmVyIGN1c2VyKSkpKQogICAgICAoaWYg KGNhbGxlZC1pbnRlcmFjdGl2ZWx5LXAgJ2ludGVyYWN0aXZlKQogICAgICAgICAgKG1lc3NhZ2Ug IiVzIGlzICVzQCVzJXMlcyIKICAgICAgICAgICAgICAgICAgIG5pY2sgbG9naW4gaG9zdAogICAg ICAgICAgICAgICAgICAgKGlmIGZ1bGwtbmFtZSAoZm9ybWF0ICIgKCVzKSIgZnVsbC1uYW1lKSAi IikKISAgICAgICAgICAgICAgICAgIChpZiAob3Igdm9pY2UgaGFsZm9wIG9wIGFkbWluIG93bmVy KQogICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiBhbmQgaXMgKyVzJXMgb24gJXMiCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgdm9pY2UgInYiICIiKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGlmIGhhbGZvcCAiaCIgIiIpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoaWYgb3AgIm8iICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGlmIGFkbWluICJhIiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBv d25lciAicSIgIiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJjLWRlZmF1bHQt dGFyZ2V0KSkKICAgICAgICAgICAgICAgICAgICAgIiIpKQohICAgICAgIHVzZXIpKSkKICAKICAo ZGVmdW4gZXJjLWF3YXktdGltZSAoKQogICAgIlJldHVybiBub24tbmlsIGlmIHRoZSBjdXJyZW50 IEVSQyBwcm9jZXNzIGlzIHNldCBhd2F5Lgo= --001a1133d162110c6404fc1e7ac3--