From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=AWL,DNS_FROM_RFC_ABUSE, DNS_FROM_RFC_POST autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by yquem.inria.fr (Postfix) with ESMTP id 9841BBBC4 for ; Sun, 8 Mar 2009 00:22:23 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkMCAOCQsknZkrEHmWdsb2JhbACMcYgxAQEBAQEICwoHEa05gQePCQEEhAU X-IronPort-AV: E=Sophos;i="4.38,321,1233529200"; d="mll'?scan'208";a="24004652" Received: from web27007.mail.ukl.yahoo.com ([217.146.177.7]) by mail3-smtp-sop.national.inria.fr with SMTP; 08 Mar 2009 00:21:43 +0100 Received: (qmail 54129 invoked by uid 60001); 7 Mar 2009 23:21:43 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.fr; s=s1024; t=1236468103; bh=cPmqIqSF2EFDbZfciJz1tpHPzf2RlGPDOr0NFBakTiQ=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:MIME-Version:Content-Type; b=WCxEWs60cU1TSRjIjscepCpEJd59K6nLobxD1Zh3pBHY8DOE0yNtXIoFfH/GxZcAd385ApFRJ1ZOvm4gTDBQwm4kZaS1AYMYaaxqiniSTeOIXhMHxRTj8T5YGXDKbOjubukW25GnOtQGe/EswzMfXD26dSurljKMXHpqYn5AS+0= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.fr; h=Message-ID:X-YMail-OSG:Received:X-Mailer:References:Date:From:Subject:To:MIME-Version:Content-Type; b=lutZPyD1DsePlREDV60AxygIk+J5PW4STaPb6UBINiEm7ez5VAfcxRopBWFb6SF/idCfYNpqGC9PkB5P9Sz0o4k1GKlvIwkQ8GJRyeNuu1Q2OIBWqS7fWzQA5pEtIexNtcIX+1lqNwalFDGdWbh2F4kTjXLuI9L5+hOPAbDQ97Y=; Message-ID: <46331.52510.qm@web27007.mail.ukl.yahoo.com> X-YMail-OSG: KZ.wR_QVM1nYv_rbHSI76dCU0pHxes66z0XR71KZYjO7vtbCIhLMM8koRnG2jLBRudXyNFxuq.OncFre4Tsj6sjWifeKcdx3jexwThZenTrKD_UiYQx2eqEX4IzCM5D_6Rr1tVidKLE5CX2H68xuoZBTpY3okNoFa1zVedjL9N_6ZQBIf.5Wqt9_dEaSnVoEBKCE3_WPUb2acTgJOmZJjcEaKE._ONPGYcHy52fO7NnKsGI- Received: from [82.242.132.106] by web27007.mail.ukl.yahoo.com via HTTP; Sat, 07 Mar 2009 23:21:42 GMT X-Mailer: YahooMailRC/1155.45 YahooMailWebService/0.7.289.1 References: <24D11586-4F15-4B6E-8FB7-58651317164D@gmail.com> Date: Sat, 7 Mar 2009 23:21:42 +0000 (GMT) From: Matthieu Wipliez Subject: Re : [Caml-list] Re: camlp4 stream parser syntax To: O'Caml Mailing List MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1713747008-1236468102=:52510" X-Spam: no; 0.00; matthieu:01 camlp:01 parser:01 syntax:01 parsers:01 camlp:01 grammars:01 parser:01 'int:01 'string:01 bool:01 bool:01 semantically:01 lexer:01 lexer:01 X-Attachments: type="application/octet-stream" name="cal_lexer.mll" name="cal_lexer.mll" --0-1713747008-1236468102=:52510 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Hi Joel,=0A=0Awhy are you using stream parsers instead of Camlp4 grammars ?= =0AThis:=0A=0A> let rec parse_primary =3D parser=0A> =0A> | [< 'INT n >] = -> Int n=0A> | [< 'FLOAT n >] -> Float n=0A> | [< 'STRING n >] -> Str n= =0A> | [< 'TRUE >] -> Bool true=0A> | [< 'FALSE >] -> Bool false=0A> = =0A> | [< >] -> raise (Stream.Error "unknown token when expecting an expr= ession.")=0A=0Acould be written as:=0Aexpression: [=0A [ (i, _) =3D INT ->= Int i=0A | (s, _) =3D STRING -> Str s=0A ... ]=0A];=0A=0ANote that Camlp= 4 will automatically raise an exception if the input cannot be parsed with = the grammar given.=0A=0AAlso if you have input that is syntactically correc= t but is not semantically correct, and you want to raise an exception with = the error location during parsing, you might want to use Loc.raise as follo= ws:=0Aexpression: [=0A [ e1 =3D SELF; "/"; e2 =3D SELF ->=0A if e2 =3D = Int 0 then=0A Loc.raise _loc (Failure "division by zero")=0A else= =0A BinaryOp (e1, Div, e2) ]=0A];=0A=0ABy the way, do you need you own= tailor-made lexer? Camlp4 provides one that might satisfy your needs.=0AOt= herwise, you can always define your own lexer (I had to do that for the pro= ject I'm working on, see file attached).=0A=0AYour parser would then look l= ike=0A=0A(* functor application *)=0Amodule Camlp4Loc =3D Camlp4.Struct.Loc= =0Amodule Lexer =3D Cal_lexer.Make(Camlp4Loc)=0Amodule Gram =3D Camlp4.Stru= ct.Grammar.Static.Make(Lexer)=0A=0A(* exposes EOI and other stuff *)=0Aopen= Lexer=0A=0A(* rule definition *)=0Alet rule =3D Gram.Entry.mk "rule"=0A=0A= (* grammar definition *)=0AEXTEND Gram=0A rule: [ [ ... ] ];=0AEND=0A=0A(*= to parse a file *)=0AGram.parse rule (Loc.mk file) (Stream.of_channel ch)= =0A=0A=0AThis should be compiled with camlp4of.=0A=0AI hope this helps you = with what you'd like to do,=0A=0ACheers,=0A=0AMatthieu=0A=0A=0A----- Messag= e d'origine ----=0A> De : Joel Reymont =0A> =C0 : O'Caml = Mailing List =0A> Envoy=E9 le : Samedi, 7 Mars 20= 09, 23h52mn 52s=0A> Objet : [Caml-list] Re: camlp4 stream parser syntax=0A>= =0A> > Where can I read up on the syntax of the following in a camlp4 stre= am parser?=0A> > =0A> > | [<' INT n >] -> Int n=0A> > =0A> > For example, = where are [< ... >] described and why is the ' needed in between?=0A> =0A> = =0A> To be more precise, I'm using camlp4 to parse a language into a non-OC= aml AST.=0A> =0A> I'm trying to figure out the meaning of [<, >], [[ and ]]= =0A> =0A> My ocamllex lexer is wrapped to make it look like a stream lexer = (below) and I'm =0A> returning a tuple of (tok, loc) because I don't see an= other way of making token =0A> location available to the parser.=0A> =0A> S= till, I'm how to integrate the reporting of error location into ?? in somet= hing =0A> like this=0A> =0A> | [< 'Token.Kwd '('; e=3Dparse_expr; 'Token.Kw= d ')' ?? "expected ')'" >] -> e=0A> =0A> Would someone kindly shed light on= this?=0A> =0A> Thanks in advance, Joel=0A> =0A> P.S. ocamllex wrapper = to return a' Stream.t=0A> =0A> {=0A> let from_lexbuf tab lb =3D=0A> let n= ext _ =3D=0A> let tok =3D token tab lb in=0A> let loc =3D Loc.of_le= xbuf lb in=0A> Some (tok, loc)=0A> in Stream.from next=0A> =0A> let s= etup_loc lb loc =3D=0A> let start_pos =3D Loc.start_pos loc in=0A> lb.l= ex_abs_pos <- start_pos.pos_cnum;=0A> lb.lex_curr_p <- start_pos=0A> =0A= > let from_string loc tab str =3D=0A> let lb =3D Lexing.from_string str i= n=0A> setup_loc lb loc;=0A> from_lexbuf tab lb=0A> =0A> }=0A> =0A> ---= =0A> http://tinyco.de=0A> Mac, C++, OCaml=0A> =0A> =0A> =0A> ______________= _________________________________=0A> Caml-list mailing list. Subscription = management:=0A> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list=0A= > Archives: http://caml.inria.fr=0A> Beginner's list: http://groups.yahoo.c= om/group/ocaml_beginners=0A> Bug reports: http://caml.inria.fr/bin/caml-bug= s=0A=0A=0A=0A --0-1713747008-1236468102=:52510 Content-Type: application/octet-stream; name="cal_lexer.mll" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="cal_lexer.mll" KCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKQooKiBDYWwyQyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICopCigqIENvcHlyaWdodCAoYykgMjAw Ny0yMDA4LCBJRVRSL0lOU0Egb2YgUmVubmVzLiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKikKKCogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqKQooKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCigqIFRo aXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIENlQ0lMTC1CIGxpY2Vu c2UgdW5kZXIgRnJlbmNoIGxhdyBhbmQgICAgKikKKCogYWJpZGluZyBieSB0 aGUgcnVsZXMgb2YgZGlzdHJpYnV0aW9uIG9mIGZyZWUgc29mdHdhcmUuIFlv dSBjYW4gIHVzZSwgICAgICAqKQooKiBtb2RpZnkgYW5kLyBvciByZWRpc3Ry aWJ1dGUgdGhlIHNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ2VD SUxMLUIgICopCigqIGxpY2Vuc2UgYXMgY2lyY3VsYXRlZCBieSBDRUEsIENO UlMgYW5kIElOUklBIGF0IHRoZSBmb2xsb3dpbmcgVVJMICAgICAgICAgKikK KCogImh0dHA6Ly93d3cuY2VjaWxsLmluZm8iLiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQooKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICopCigqIE1hdHRoaWV1IFdJUExJRVog PE1hdHRoaWV1LldpcGxpZXpAaW5zYS1yZW5uZXMuZnIgICAgICAgICAgICAg ICAgICAgICAgICAgKikKKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKQoKKCogRmlsZSBjYWxfbGV4ZXIubWxsICopCnsKb3BlbiBQcmludGYK b3BlbiBGb3JtYXQKCm1vZHVsZSBNYWtlIChMb2MgOiBDYW1scDQuU2lnLkxv YykgPSBzdHJ1Y3QKICBtb2R1bGUgTG9jID0gTG9jCgoJdHlwZSB0b2tlbiA9 CgkJfCBLRVlXT1JEIG9mIHN0cmluZwoJCXwgU1lNQk9MICBvZiBzdHJpbmcK ICAgIHwgSURFTlQgICBvZiBzdHJpbmcKICAgIHwgSU5UICAgICBvZiBpbnQg KiBzdHJpbmcKICAgIHwgRkxPQVQgICBvZiBmbG9hdCAqIHN0cmluZwogICAg fCBDSEFSICAgIG9mIGNoYXIgKiBzdHJpbmcKICAgIHwgU1RSSU5HICBvZiBz dHJpbmcgKiBzdHJpbmcKCSAgfCBFT0kKCQoJbW9kdWxlIFRva2VuID0gc3Ry dWN0CgkJbW9kdWxlIExvYyA9IExvYwoJCiAgICB0eXBlIHQgPSB0b2tlbgoK CSAgbGV0IHRvX3N0cmluZyA9CgkgICAgZnVuY3Rpb24KCSAgICAgIEtFWVdP UkQgcyAgICAgLT4gc3ByaW50ZiAiS0VZV09SRCAlUyIgcwoJICAgIHwgU1lN Qk9MIHMgICAgICAtPiBzcHJpbnRmICJTWU1CT0wgJVMiIHMKCSAgICB8IElE RU5UIHMgICAgICAgLT4gc3ByaW50ZiAiSURFTlQgJVMiIHMKCSAgICB8IElO VCAoXywgcykgICAgLT4gc3ByaW50ZiAiSU5UICVzIiBzCgkgICAgfCBGTE9B VCAoXywgcykgIC0+IHNwcmludGYgIkZMT0FUICVzIiBzCgkgICAgfCBDSEFS IChfLCBzKSAgIC0+IHNwcmludGYgIkNIQVIgJyVzJyIgcwoJICAgIHwgU1RS SU5HIChfLCBzKSAtPiBzcHJpbnRmICJTVFJJTkcgXCIlc1wiIiBzCgkgICAg ICAgICAgICAgICAgICAgICAgKCogaGVyZSBpdCdzIG5vdCAlUyBzaW5jZSB0 aGUgc3RyaW5nIGlzIGFscmVhZHkgZXNjYXBlZCAqKQoJICAgIHwgRU9JICAg ICAgICAgICAtPiBzcHJpbnRmICJFT0kiCgoJICBsZXQgcHJpbnQgcHBmIHgg PSBwcF9wcmludF9zdHJpbmcgcHBmICh0b19zdHJpbmcgeCkKCQoJICBsZXQg bWF0Y2hfa2V5d29yZCBrd2QgPSBmdW5jdGlvbgoJICAgICAgS0VZV09SRCBr d2QnIHdoZW4ga3dkID0ga3dkJyAtPiB0cnVlCgkgICAgfCBfIC0+IGZhbHNl CgkKCSAgbGV0IGV4dHJhY3Rfc3RyaW5nID0KCSAgICBmdW5jdGlvbgoJICAg ICAgS0VZV09SRCBzCgkJCXwgSURFTlQgcwoJCQl8IElOVCAoXywgcykKCQkJ fCBGTE9BVCAoXywgcykKCQkJfCBDSEFSIChfLCBzKQoJCQl8IFNUUklORyAo XywgcykgLT4gcwoJICAgIHwgdG9rIC0+CgkgICAgICAgIGludmFsaWRfYXJn ICgiQ2Fubm90IGV4dHJhY3QgYSBzdHJpbmcgZnJvbSB0aGlzIHRva2VuOiAi XgoJICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nIHRvaykKCQoJICBt b2R1bGUgRXJyb3IgPSBzdHJ1Y3QKCSAgICB0eXBlIHQgPQoJICAgICAgICBJ bGxlZ2FsX3Rva2VuIG9mIHN0cmluZwoJICAgICAgfCBLZXl3b3JkX2FzX2xh YmVsIG9mIHN0cmluZwoJICAgICAgfCBJbGxlZ2FsX3Rva2VuX3BhdHRlcm4g b2Ygc3RyaW5nICogc3RyaW5nCgkgICAgICB8IElsbGVnYWxfY29uc3RydWN0 b3Igb2Ygc3RyaW5nCgkKCSAgICBleGNlcHRpb24gRSBvZiB0CgkKCSAgICBs ZXQgcHJpbnQgcHBmID0KCSAgICAgIGZ1bmN0aW9uCgkgICAgICAgIElsbGVn YWxfdG9rZW4gcyAtPgoJICAgICAgICAgIGZwcmludGYgcHBmICJJbGxlZ2Fs IHRva2VuICglcykiIHMKCSAgICAgIHwgS2V5d29yZF9hc19sYWJlbCBrd2Qg LT4KCSAgICAgICAgICBmcHJpbnRmIHBwZiAiYCVzJyBpcyBhIGtleXdvcmQs IGl0IGNhbm5vdCBiZSB1c2VkIGFzIGxhYmVsIG5hbWUiIGt3ZAoJICAgICAg fCBJbGxlZ2FsX3Rva2VuX3BhdHRlcm4gKHBfY29uLCBwX3BybSkgLT4KCSAg ICAgICAgICBmcHJpbnRmIHBwZiAiSWxsZWdhbCB0b2tlbiBwYXR0ZXJuOiAl cyAlUyIgcF9jb24gcF9wcm0KCSAgICAgIHwgSWxsZWdhbF9jb25zdHJ1Y3Rv ciBjb24gLT4KCSAgICAgICAgICBmcHJpbnRmIHBwZiAiSWxsZWdhbCBjb25z dHJ1Y3RvciAlUyIgY29uCgkKCSAgICBsZXQgdG9fc3RyaW5nIHggPQoJICAg ICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDUwIGluCgkgICAgICBsZXQgKCkg PSBicHJpbnRmIGIgIiVhIiBwcmludCB4IGluIEJ1ZmZlci5jb250ZW50cyBi CgkgIGVuZAoJCQoJICBtb2R1bGUgTSA9IENhbWxwNC5FcnJvckhhbmRsZXIu UmVnaXN0ZXIoRXJyb3IpCgkKCSAgbW9kdWxlIEZpbHRlciA9IHN0cnVjdAoJ ICAgIHR5cGUgdG9rZW5fZmlsdGVyID0gKHQsIExvYy50KSBDYW1scDQuU2ln LnN0cmVhbV9maWx0ZXIKCQkJCgkgICAgdHlwZSB0ID0KCSAgICAgIHsgaXNf a3dkIDogc3RyaW5nIC0+IGJvb2w7CgkgICAgICAgIG11dGFibGUgZmlsdGVy IDogdG9rZW5fZmlsdGVyIH0KCQoJICAgIGxldCBtayBpc19rd2QgPQoJICAg ICAgeyBpc19rd2QgPSBpc19rd2Q7CgkgICAgICAgIGZpbHRlciA9IGZ1biBz IC0+IHMgfQoJCgkgICAgbGV0IGtleXdvcmRfY29udmVyc2lvbiB0b2sgaXNf a3dkID0KICAgICAgICBtYXRjaCB0b2sgd2l0aAogICAgICAgICAgU1lNQk9M IHMgfCBJREVOVCBzIHdoZW4gaXNfa3dkIHMgLT4gS0VZV09SRCBzCiAgICAg ICAgfCBfIC0+IHRvawoJCgkgICAgbGV0IGZpbHRlciB4ID0KCSAgICAgIGxl dCBmIHRvayBsb2MgPQogICAgICAgICAgbGV0IHRvaycgPSBrZXl3b3JkX2Nv bnZlcnNpb24gdG9rIHguaXNfa3dkIGluCgkgICAgICAgICh0b2snLCBsb2Mp CgkgICAgICBpbgoJICAgICAgbGV0IHJlYyBmaWx0ZXIgPQoJICAgICAgICBw YXJzZXIKCSAgICAgICAgfCBbPCAnKHRvaywgbG9jKTsgcyA+XSAtPiBbPCAn IGYgdG9rIGxvYzsgZmlsdGVyIHMgPl0KCSAgICAgICAgfCBbPCA+XSAtPiBb PCA+XQoJICAgICAgaW4KCSAgICAgIGZ1biBzdHJtIC0+IHguZmlsdGVyIChm aWx0ZXIgc3RybSkKCQoJICAgIGxldCBkZWZpbmVfZmlsdGVyIHggZiA9IHgu ZmlsdGVyIDwtIGYgeC5maWx0ZXIKCQoJICAgIGxldCBrZXl3b3JkX2FkZGVk IF8gXyBfID0gKCkKCSAgICBsZXQga2V5d29yZF9yZW1vdmVkIF8gXyA9ICgp CgkgIGVuZAoJZW5kCgkKICBvcGVuIExleGluZwoJCgkoKiBFcnJvciByZXBv cnQgKikKICBtb2R1bGUgRXJyb3IgPSBzdHJ1Y3QKCiAgICB0eXBlIHQgPQog ICAgICB8IElsbGVnYWxfY2hhcmFjdGVyIG9mIGNoYXIKICAgICAgfCBJbGxl Z2FsX2VzY2FwZSAgICBvZiBzdHJpbmcKICAgICAgfCBVbnRlcm1pbmF0ZWRf Y29tbWVudAogICAgICB8IFVudGVybWluYXRlZF9zdHJpbmcKICAgICAgfCBV bnRlcm1pbmF0ZWRfcXVvdGF0aW9uCiAgICAgIHwgVW50ZXJtaW5hdGVkX2Fu dGlxdW90CiAgICAgIHwgVW50ZXJtaW5hdGVkX3N0cmluZ19pbl9jb21tZW50 CiAgICAgIHwgQ29tbWVudF9zdGFydAogICAgICB8IENvbW1lbnRfbm90X2Vu ZAogICAgICB8IExpdGVyYWxfb3ZlcmZsb3cgb2Ygc3RyaW5nCgogICAgZXhj ZXB0aW9uIEUgb2YgdAoKICAgIG9wZW4gRm9ybWF0CgogICAgbGV0IHByaW50 IHBwZiA9CiAgICAgIGZ1bmN0aW9uCiAgICAgIHwgSWxsZWdhbF9jaGFyYWN0 ZXIgYyAtPgogICAgICAgICAgZnByaW50ZiBwcGYgIklsbGVnYWwgY2hhcmFj dGVyICglcykiIChDaGFyLmVzY2FwZWQgYykKICAgICAgfCBJbGxlZ2FsX2Vz Y2FwZSBzIC0+CiAgICAgICAgICBmcHJpbnRmIHBwZiAiSWxsZWdhbCBiYWNr c2xhc2ggZXNjYXBlIGluIHN0cmluZyBvciBjaGFyYWN0ZXIgKCVzKSIgcwog ICAgICB8IFVudGVybWluYXRlZF9jb21tZW50IC0+CiAgICAgICAgICBmcHJp bnRmIHBwZiAiQ29tbWVudCBub3QgdGVybWluYXRlZCIKICAgICAgfCBVbnRl cm1pbmF0ZWRfc3RyaW5nIC0+CiAgICAgICAgICBmcHJpbnRmIHBwZiAiU3Ry aW5nIGxpdGVyYWwgbm90IHRlcm1pbmF0ZWQiCiAgICAgIHwgVW50ZXJtaW5h dGVkX3N0cmluZ19pbl9jb21tZW50IC0+CiAgICAgICAgICBmcHJpbnRmIHBw ZiAiVGhpcyBjb21tZW50IGNvbnRhaW5zIGFuIHVudGVybWluYXRlZCBzdHJp bmcgbGl0ZXJhbCIKICAgICAgfCBVbnRlcm1pbmF0ZWRfcXVvdGF0aW9uIC0+ CiAgICAgICAgICBmcHJpbnRmIHBwZiAiUXVvdGF0aW9uIG5vdCB0ZXJtaW5h dGVkIgogICAgICB8IFVudGVybWluYXRlZF9hbnRpcXVvdCAtPgogICAgICAg ICAgZnByaW50ZiBwcGYgIkFudGlxdW90YXRpb24gbm90IHRlcm1pbmF0ZWQi CiAgICAgIHwgTGl0ZXJhbF9vdmVyZmxvdyB0eSAtPgogICAgICAgICAgZnBy aW50ZiBwcGYgIkludGVnZXIgbGl0ZXJhbCBleGNlZWRzIHRoZSByYW5nZSBv ZiByZXByZXNlbnRhYmxlIGludGVnZXJzIG9mIHR5cGUgJXMiIHR5CiAgICAg IHwgQ29tbWVudF9zdGFydCAtPgogICAgICAgICAgZnByaW50ZiBwcGYgInRo aXMgaXMgdGhlIHN0YXJ0IG9mIGEgY29tbWVudCIKICAgICAgfCBDb21tZW50 X25vdF9lbmQgLT4KICAgICAgICAgIGZwcmludGYgcHBmICJ0aGlzIGlzIG5v dCB0aGUgZW5kIG9mIGEgY29tbWVudCIKCiAgICBsZXQgdG9fc3RyaW5nIHgg PQogICAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgNTAgaW4KICAgICAgbGV0 ICgpID0gYnByaW50ZiBiICIlYSIgcHJpbnQgeCBpbiBCdWZmZXIuY29udGVu dHMgYgogIGVuZAoKICBsZXQgbW9kdWxlIE0gPSBDYW1scDQuRXJyb3JIYW5k bGVyLlJlZ2lzdGVyKEVycm9yKSBpbiAoKQoKICBvcGVuIEVycm9yCgkKCW9w ZW4gQ2FsMmNfdXRpbAogIGV4Y2VwdGlvbiBFb2YKCigqIFN0cmluZyBjb25z dHJ1Y3Rpb24gKikKbGV0IHN0ciA9IHJlZiAiIgoKdHlwZSBjb250ZXh0ID0g ewogIGxvYyAgICAgICAgOiBMb2MudDsKICBpbl9jb21tZW50IDogYm9vbDsK ICBxdW90YXRpb25zIDogYm9vbDsKICBhbnRpcXVvdHMgIDogYm9vbDsKICBs ZXhidWYgICAgIDogbGV4YnVmOwogIGJ1ZmZlciAgICAgOiBCdWZmZXIudAp9 CgooKiBVcGRhdGUgdGhlIGN1cnJlbnQgbG9jYXRpb24gd2l0aCBmaWxlIG5h bWUgYW5kIGxpbmUgbnVtYmVyLiAqKQpsZXQgdXBkYXRlX2xvYyBjIGZpbGUg bGluZSBhYnNvbHV0ZSBjaGFycyA9CiAgbGV0IGxleGJ1ZiA9IGMubGV4YnVm IGluCiAgbGV0IHBvcyA9IGxleGJ1Zi5sZXhfY3Vycl9wIGluCiAgbGV0IG5l d19maWxlID0KCQltYXRjaCBmaWxlIHdpdGgKICAgIHwgTm9uZSAtPiBwb3Mu cG9zX2ZuYW1lCiAgICB8IFNvbWUgcyAtPiBzCiAgaW4KICBsZXhidWYubGV4 X2N1cnJfcCA8LSB7IHBvcyB3aXRoCiAgICBwb3NfZm5hbWUgPSBuZXdfZmls ZTsKICAgIHBvc19sbnVtID0gaWYgYWJzb2x1dGUgdGhlbiBsaW5lIGVsc2Ug cG9zLnBvc19sbnVtICsgbGluZTsKICAgIHBvc19ib2wgPSBwb3MucG9zX2Nu dW0gLSBjaGFyczsKICB9CgooKiBNYXRjaGVzIGVpdGhlciBcIG9yICQuIFdo eSBzbyBtYW55IGJhY2tzbGFzaGVzPyBCZWNhdXNlIFwgaGFzIHRvIGJlIGVz Y2FwZWQqKQooKiBpbiBzdHJpbmdzLCBzbyB3ZSBnZXQgXFwuIFwsIHwgYW5k ICQgYWxzbyBoYXZlIHRvIGJlIGVzY2FwZWQgaW4gcmVnZXhwcywgKikKKCog c28gd2UgaGF2ZSBcXFxcIFxcfCBcXCQuICopCmxldCByZV9pZCA9IFN0ci5y ZWdleHAgIlxcXFxcXHxcXCQiCn0KCigqIE51bWJlcnMgKikKbGV0IG5vblpl cm9EZWNpbWFsRGlnaXQgPSBbJzEnLSc5J10KCmxldCBkZWNpbWFsRGlnaXQg PSAnMCcgfCBub25aZXJvRGVjaW1hbERpZ2l0CmxldCBkZWNpbWFsTGl0ZXJh bCA9IG5vblplcm9EZWNpbWFsRGlnaXQgKGRlY2ltYWxEaWdpdCkqCgpsZXQg aGV4YWRlY2ltYWxEaWdpdCA9IGRlY2ltYWxEaWdpdCB8IFsnYSctJ2YnXSB8 IFsnQSctJ0YnXQpsZXQgaGV4YWRlY2ltYWxMaXRlcmFsID0gJzAnICgneCd8 J1gnKSBoZXhhZGVjaW1hbERpZ2l0IChoZXhhZGVjaW1hbERpZ2l0KSoKCmxl dCBvY3RhbERpZ2l0ID0gWycwJy0nNyddCmxldCBvY3RhbExpdGVyYWwgPSAn MCcgKG9jdGFsRGlnaXQpKgoKbGV0IGludGVnZXIgPSBkZWNpbWFsTGl0ZXJh bCB8IGhleGFkZWNpbWFsTGl0ZXJhbCB8IG9jdGFsTGl0ZXJhbAoKbGV0IGV4 cG9uZW50ID0gKCdlJ3wnRScpICgnKyd8Jy0nKT8gZGVjaW1hbERpZ2l0Kwps ZXQgcmVhbCA9IGRlY2ltYWxEaWdpdCsgJy4nIChkZWNpbWFsRGlnaXQpKiBl eHBvbmVudD8KfCAnLicgZGVjaW1hbERpZ2l0KyBleHBvbmVudD8KfCBkZWNp bWFsRGlnaXQrIGV4cG9uZW50CgooKiBJZGVudGlmaWVycyAqKQpsZXQgY2hh ciA9IFsnYSctJ3onICdBJy0nWiddCmxldCBhbnlfaWRlbnRpZmllciA9IChj aGFyIHwgJ18nIHwgZGVjaW1hbERpZ2l0IHwgJyQnKSsKbGV0IG90aGVyX2lk ZW50aWZpZXIgPQogICAgKGNoYXIgfCAnXycpIChjaGFyIHwgJ18nIHwgZGVj aW1hbERpZ2l0IHwgJyQnKSoKICB8ICckJyAoY2hhciB8ICdfJyB8IGRlY2lt YWxEaWdpdCB8ICckJykrCmxldCBpZGVudGlmaWVyID0gJ1xcJyBhbnlfaWRl bnRpZmllciAnXFwnIHwgb3RoZXJfaWRlbnRpZmllcgoKbGV0IG5ld2xpbmUg PSAoJ1wwMTAnIHwgJ1wwMTMnIHwgIlwwMTNcMDEwIikKCigqIFRva2VuIHJ1 bGUgKikKcnVsZSB0b2tlbiBjID0gcGFyc2UKICB8IFsnICcgJ1x0J10ge3Rv a2VuIGMgbGV4YnVmfQoJfCBuZXdsaW5lIHsgdXBkYXRlX2xvYyBjIE5vbmUg MSBmYWxzZSAwOyB0b2tlbiBjIGxleGJ1ZiB9CgoJfCAiXiIgeyBTWU1CT0wg Il4iIH0KCXwgIi0+IiB7IFNZTUJPTCAiLT4iIH0KCXwgJzonIHsgU1lNQk9M ICI6IiB9Cgl8ICI6PSIgeyBTWU1CT0wgIjo9IiB9Cgl8ICcsJyB7IFNZTUJP TCAiLCIgfQoJfCAiIT0iIHsgU1lNQk9MICIhPSIgfQoJfCAnLycgeyBTWU1C T0wgIi8iIH0KCXwgJy4nIHsgU1lNQk9MICIuIiB9Cgl8ICIuLiIgeyBTWU1C T0wgIi4uIiB9Cgl8ICI6OiIgeyBTWU1CT0wgIjo6IiB9Cgl8ICItLT4iIHsg U1lNQk9MICItLT4iIH0KCXwgIj09PiIgeyBTWU1CT0wgIj09PiIgfQoJfCAn PScgeyBTWU1CT0wgIj0iIH0KCXwgIj49IiB7IFNZTUJPTCAiPj0iIH0KCXwg Jz4nIHsgU1lNQk9MICI+IiB9Cgl8ICd7JyB7IFNZTUJPTCAieyIgfQoJfCAn WycgeyBTWU1CT0wgIlsiIH0KCXwgIjw9IiB7IFNZTUJPTCAiPD0iIH0KCXwg JzwnIHsgU1lNQk9MICI8IiB9Cgl8ICcoJyB7IFNZTUJPTCAiKCIgfQoJfCAn LScgeyBTWU1CT0wgIi0iIH0KCXwgJysnIHsgU1lNQk9MICIrIiB9Cgl8ICd9 JyB7IFNZTUJPTCAifSIgfQoJfCAnXScgeyBTWU1CT0wgIl0iIH0KCXwgJykn IHsgU1lNQk9MICIpIiB9Cgl8ICc7JyB7IFNZTUJPTCAiOyIgfQoJfCAnIycg eyBTWU1CT0wgIiMiIH0KCXwgJyonIHsgU1lNQk9MICIqIiB9CgogIHwgaW50 ZWdlciBhcyBseG0geyBJTlQgKGludF9vZl9zdHJpbmcgbHhtLCBseG0pIH0K ICB8IHJlYWwgYXMgbHhtIHsgRkxPQVQgKGZsb2F0X29mX3N0cmluZyBseG0s IGx4bSkgfQogIHwgaWRlbnRpZmllciBhcyBpZGVudCB7CgkJCQlsZXQgaWRl bnQgPSBTdHIuZ2xvYmFsX3JlcGxhY2UgcmVfaWQgIl8iIGlkZW50IGluCgkJ CQlJREVOVCBpZGVudCB9CiAgfCAnIicgeyBsZXQgc3RyID0gc3RyaW5nIGMg bGV4YnVmIGluIFNUUklORyAoc3RyLCBzdHIpIH0KICB8ICIvLyIgeyBzaW5n bGVfbGluZV9jb21tZW50IGMgbGV4YnVmIH0KCXwgIi8qIiB7IG11bHRpX2xp bmVfY29tbWVudCBjIGxleGJ1ZiB9CiAgfCBlb2YgeyBFT0kgfQphbmQgc3Ry aW5nIGN0eCA9IHBhcnNlCgl8ICJcXFwiIiB7IHN0ciA6PSAhc3RyIF4gIlxc XCIiOyBzdHJpbmcgY3R4IGxleGJ1ZiB9Cgl8ICciJyB7IGxldCBzID0gIXN0 ciBpbiBzdHIgOj0gIiI7IHMgfQoJfCBfIGFzIGMgeyBzdHIgOj0gIXN0ciBe IChTdHJpbmcubWFrZSAxIGMpOyBzdHJpbmcgY3R4IGxleGJ1ZiB9CmFuZCBz aW5nbGVfbGluZV9jb21tZW50IGMgPSBwYXJzZQogIHwgbmV3bGluZSB7IHVw ZGF0ZV9sb2MgYyBOb25lIDEgZmFsc2UgMDsgdG9rZW4gYyBsZXhidWYgfQoJ fCBfIHsgc2luZ2xlX2xpbmVfY29tbWVudCBjIGxleGJ1ZiB9CmFuZCBtdWx0 aV9saW5lX2NvbW1lbnQgYyA9IHBhcnNlCiAgfCAiKi8iIHsgdG9rZW4gYyBs ZXhidWYgfQoJfCBuZXdsaW5lIHsgdXBkYXRlX2xvYyBjIE5vbmUgMSBmYWxz ZSAwOyBtdWx0aV9saW5lX2NvbW1lbnQgYyBsZXhidWYgfQoJfCBfIHsgbXVs dGlfbGluZV9jb21tZW50IGMgbGV4YnVmIH0KICAgIAp7CQkKICBsZXQgZGVm YXVsdF9jb250ZXh0IGxiID0KICB7IGxvYyAgICAgICAgPSBMb2MuZ2hvc3Qg OwogICAgaW5fY29tbWVudCA9IGZhbHNlICAgICA7CiAgICBxdW90YXRpb25z ID0gdHJ1ZSAgICAgIDsKICAgIGFudGlxdW90cyAgPSBmYWxzZSAgICAgOwog ICAgbGV4YnVmICAgICA9IGxiICAgICAgICA7CiAgICBidWZmZXIgICAgID0g QnVmZmVyLmNyZWF0ZSAyNTYgfQoJCiAgbGV0IHVwZGF0ZV9sb2MgYyA9IHsg KGMpIHdpdGggbG9jID0gTG9jLm9mX2xleGJ1ZiBjLmxleGJ1ZiB9CgogIGxl dCB3aXRoX2N1cnJfbG9jIGYgYyA9IGYgKHVwZGF0ZV9sb2MgYykgYy5sZXhi dWYKCQogIGxldCBsZXhpbmdfc3RvcmUgcyBidWZmIG1heCA9CiAgICBsZXQg cmVjIHNlbGYgbiBzID0KICAgICAgaWYgbiA+PSBtYXggdGhlbiBuCiAgICAg IGVsc2UKICAgICAgICBtYXRjaCBTdHJlYW0ucGVlayBzIHdpdGgKICAgICAg ICB8IFNvbWUgeCAtPgogICAgICAgICAgICBTdHJlYW0uanVuayBzOwogICAg ICAgICAgICBidWZmLltuXSA8LSB4OwogICAgICAgICAgICBzdWNjIG4KICAg ICAgICB8IF8gLT4gbgogICAgaW4KICAgIHNlbGYgMCBzCgogIGxldCBmcm9t X2NvbnRleHQgYyA9CiAgICBsZXQgbmV4dCBfID0KICAgICAgbGV0IHRvayA9 IHdpdGhfY3Vycl9sb2MgdG9rZW4gYyBpbgogICAgICBsZXQgbG9jID0gTG9j Lm9mX2xleGJ1ZiBjLmxleGJ1ZiBpbgogICAgICBTb21lICgodG9rLCBsb2Mp KQogICAgaW4gU3RyZWFtLmZyb20gbmV4dAoKICBsZXQgZnJvbV9sZXhidWYg PyhxdW90YXRpb25zID0gdHJ1ZSkgbGIgPQogICAgbGV0IGMgPSB7IChkZWZh dWx0X2NvbnRleHQgbGIpIHdpdGgKICAgICAgICAgICAgICBsb2MgICAgICAg ID0gTG9jLm9mX2xleGJ1ZiBsYjsKICAgICAgICAgICAgICBhbnRpcXVvdHMg ID0gIUNhbWxwNF9jb25maWcuYW50aXF1b3RhdGlvbnM7CiAgICAgICAgICAg ICAgcXVvdGF0aW9ucyA9IHF1b3RhdGlvbnMgICAgICB9CiAgICBpbiBmcm9t X2NvbnRleHQgYwoKICBsZXQgc2V0dXBfbG9jIGxiIGxvYyA9CiAgICBsZXQg c3RhcnRfcG9zID0gTG9jLnN0YXJ0X3BvcyBsb2MgaW4KICAgIGxiLmxleF9h YnNfcG9zIDwtIHN0YXJ0X3Bvcy5wb3NfY251bTsKICAgIGxiLmxleF9jdXJy X3AgIDwtIHN0YXJ0X3BvcwoKICBsZXQgZnJvbV9zdHJpbmcgP3F1b3RhdGlv bnMgbG9jIHN0ciA9CiAgICBsZXQgbGIgPSBMZXhpbmcuZnJvbV9zdHJpbmcg c3RyIGluCiAgICBzZXR1cF9sb2MgbGIgbG9jOwogICAgZnJvbV9sZXhidWYg P3F1b3RhdGlvbnMgbGIKCiAgbGV0IGZyb21fc3RyZWFtID9xdW90YXRpb25z IGxvYyBzdHJtID0KICAgIGxldCBsYiA9IExleGluZy5mcm9tX2Z1bmN0aW9u IChsZXhpbmdfc3RvcmUgc3RybSkgaW4KICAgIHNldHVwX2xvYyBsYiBsb2M7 CiAgICBmcm9tX2xleGJ1ZiA/cXVvdGF0aW9ucyBsYgoKICBsZXQgbWsgKCkg bG9jIHN0cm0gPQogICAgZnJvbV9zdHJlYW0gfnF1b3RhdGlvbnM6IUNhbWxw NF9jb25maWcucXVvdGF0aW9ucyBsb2Mgc3RybQplbmQKfQ== --0-1713747008-1236468102=:52510--