Return-Path: X-Original-To: apmail-hadoop-common-user-archive@www.apache.org Delivered-To: apmail-hadoop-common-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BFA16108D7 for ; Fri, 29 Nov 2013 08:51:03 +0000 (UTC) Received: (qmail 4032 invoked by uid 500); 29 Nov 2013 08:50:54 -0000 Delivered-To: apmail-hadoop-common-user-archive@hadoop.apache.org Received: (qmail 3719 invoked by uid 500); 29 Nov 2013 08:50:51 -0000 Mailing-List: contact user-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@hadoop.apache.org Delivered-To: mailing list user@hadoop.apache.org Delivered-To: moderator for user@hadoop.apache.org Received: (qmail 15545 invoked by uid 99); 28 Nov 2013 08:09:03 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=Oe8wUGlnmOA2dOIf7Nj4KkV4RjCAAryblRr+ODisHG4=; b=Btbz+8J9WnfEPEK8QSw+pW+zyRdvk7jS0LFzBsqSkIqgjNHdymyJpIxrHmj4b6raag c0yOXXCxAiM0MAGmUtM3xaOOniAFhjwUj8+GdAcI8nZUtWtGB5HWw+EW+0GtBQt76t5Z m4Dpsm5ATAKkHJwkYegMW91glul4cDpy5/v4wm3n3SxMyDhPE7vVsK/xJH2KDY1Tkz0W rAxdu0o0H01l6lGEviwc74l4LJVKnINKihXOv6jpB0m2D7M4k8ZNY2wUvElUrdws+oQq KBww/DtzuLTWPuvmWE+NNUdtGW81sgPk5xUbsmbdE87Meyqca+WRVkP+yQ8y7gK5L7ZP bfqA== MIME-Version: 1.0 X-Received: by 10.182.19.132 with SMTP id f4mr37690992obe.14.1385626142061; Thu, 28 Nov 2013 00:09:02 -0800 (PST) In-Reply-To: <969B118F8FF0104281DFF098C334754051D6B9DC85@PUNINMSMBX01.puneodc.lntinfotech.com> References: <969B118F8FF0104281DFF098C334754051D6B9DC85@PUNINMSMBX01.puneodc.lntinfotech.com> Date: Thu, 28 Nov 2013 13:39:01 +0530 Message-ID: Subject: Re: XML parsing in Hadoop From: Devaraj K To: user@hadoop.apache.org Content-Type: multipart/alternative; boundary=001a11c2aa6afd3f7104ec383936 --001a11c2aa6afd3f7104ec383936 Content-Type: text/plain; charset=ISO-8859-1 Hi, Here this map() function will be called for every (key,value) pair (i.e. for every line of split in your Job because of TextInputFormat). This xml parsing code which you have written in map() function will be executed for every line of your input which is causing the problem. You can customize your InputFormat to read the xml file, instead of parsing in map() or you could place this parsing code in run() method by overriding it from Mapper.run(Context context). On Thu, Nov 28, 2013 at 12:15 PM, Chhaya Vishwakarma < Chhaya.Vishwakarma@lntinfotech.com> wrote: > Hi, > > > > > > The below code parses XML file, Here the output of the code is correct but > the job takes long time for completion. > > It took 20 hours to parse 2MB file. > > Kindly suggest what changes could be done to increase the performance. > > > > > > > > package xml; > > > > import java.io.FileInputStream; > > import java.io.FileNotFoundException; > > import java.io.IOException; > > import java.util.*; > > > > import javax.xml.parsers.DocumentBuilder; > > import javax.xml.parsers.DocumentBuilderFactory; > > import javax.xml.parsers.ParserConfigurationException; > > import javax.xml.xpath.XPath; > > import javax.xml.xpath.XPathConstants; > > import javax.xml.xpath.XPathExpressionException; > > import javax.xml.xpath.XPathFactory; > > > > import org.apache.hadoop.fs.FSDataInputStream; > > import org.apache.hadoop.fs.FSInputStream; > > import org.apache.hadoop.fs.FileSystem; > > import org.apache.hadoop.fs.Path; > > > > import org.apache.hadoop.conf.*; > > import org.apache.hadoop.io.*; > > > > import org.apache.hadoop.mapred.JobConf; > > import org.apache.hadoop.mapreduce.*; > > import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; > > import org.apache.hadoop.mapreduce.lib.input.FileSplit; > > import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; > > import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; > > import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; > > > > > > import org.apache.log4j.Logger; > > import org.w3c.dom.Document; > > import org.w3c.dom.Element; > > import org.w3c.dom.NodeList; > > import org.xml.sax.SAXException; > > > > > > public class ReadXmlMR > > { > > static Logger log = > Logger.getLogger(ReadXmlMR.class.getName()); > > public static String fileName = new String(); > > public static Document dom; > > public void configure(JobConf job) { > > fileName = job.get("map.input.file"); > > } > > > > > > public static class Map extends > Mapper > > { > > > > public void map(LongWritable key, Text > value,Context context ) throws IOException, InterruptedException > > { > > try { > > FileSplit > fileSplit = (FileSplit)context.getInputSplit(); > > > Configuration conf = context.getConfiguration(); > > > > > DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); > > > > > FSDataInputStream fstream1; > > Path file > = fileSplit.getPath(); > > FileSystem fs = > file.getFileSystem(conf); > > fstream1 = > fs.open(fileSplit.getPath()); > > > DocumentBuilder db = dbf.newDocumentBuilder(); > > dom = > db.parse(fstream1); > > Element > docEle = null; > > docEle = > dom.getDocumentElement(); > > > > XPath > xpath = XPathFactory.newInstance().newXPath(); > > > > Object > result = xpath.compile("//*").evaluate(dom, XPathConstants.NODESET); > > > > NodeList > nodes = (NodeList) result; > > > > > > for (int n > = 2; n < nodes.getLength(); n++) > > > > { > > > Text colvalue=new Text(""); > > > Text nodename= new Text(""); > > > > > nodename = new Text(nodes.item(n).getNodeName()); > > > try{colvalue = new > Text(nodes.item(n).getFirstChild().getNodeValue());}catch(Exception e){} > > > if(colvalue.toString().equalsIgnoreCase(null)){colvalue=new Text("");} > > > context.write(nodename, colvalue); > > } > > > > > > } catch > (ParserConfigurationException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > } catch > (SAXException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > > > } catch > (XPathExpressionException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > } > > > > } > > > > } > > > > > > > > public static void main(String[] args) throws Exception > > > > { > > > > Configuration conf = new Configuration(); > > > > Job job = new Job(conf, "XmlParsing"); > > job.setJarByClass(ReadXmlMR.class); > > job.setOutputKeyClass(Text.class); > > job.setOutputValueClass(Text.class); > > > > > > job.setMapperClass(Map.class); > > > > > > job.setInputFormatClass(TextInputFormat.class); > > job.setOutputFormatClass(TextOutputFormat.class); > > > > FileInputFormat.addInputPath(job, new Path(args[0])); > > FileOutputFormat.setOutputPath(job, new Path(args[1])); > > > > > > job.submit(); > > > > job.waitForCompletion(true); > > > > > > } > > > > } > > > > > > > > Regards, > > Chhaya Vishwakarma > > > > ------------------------------ > The contents of this e-mail and any attachment(s) may contain confidential > or privileged information for the intended recipient(s). Unintended > recipients are prohibited from taking action on the basis of information in > this e-mail and using or disseminating the information, and must notify the > sender and delete it from their system. L&T Infotech will not accept > responsibility or liability for the accuracy or completeness of, or the > presence of any virus or disabling code in this e-mail" > -- Thanks Devaraj K --001a11c2aa6afd3f7104ec383936 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2PkhpLDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SGVy ZSB0aGlzIG1hcCgpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBldmVyeSAoa2V5LHZhbHVl KSBwYWlyIChpLmUuIGZvciBldmVyeSBsaW5lIG9mIHNwbGl0IGluIHlvdXIgSm9iIGJlY2F1c2Ug b2YgVGV4dElucHV0Rm9ybWF0KS4gVGhpcyB4bWwgcGFyc2luZyBjb2RlIHdoaWNoIHlvdSBoYXZl IHdyaXR0ZW4gaW4gbWFwKCkgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCBmb3IgZXZlcnkgbGlu ZSBvZiB5b3VyIGlucHV0IHdoaWNoIGlzIGNhdXNpbmcgdGhlIHByb2JsZW0uoDwvZGl2Pg0KPGRp dj48YnI+PC9kaXY+PGRpdj5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIElucHV0Rm9ybWF0IHRvIHJl YWQgdGhlIHhtbCBmaWxlLCBpbnN0ZWFkIG9mIHBhcnNpbmcgaW4gbWFwKCkgb3IgeW91IGNvdWxk IHBsYWNlIHRoaXMgcGFyc2luZyBjb2RlIGluIHJ1bigpIG1ldGhvZCBieSBvdmVycmlkaW5nIGl0 IGZyb20gTWFwcGVyLnJ1bihDb250ZXh0IGNvbnRleHQpLqA8L2Rpdj48L2Rpdj4NCjxkaXYgY2xh c3M9ImdtYWlsX2V4dHJhIj48YnI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5PbiBUaHUs IE5vdiAyOCwgMjAxMyBhdCAxMjoxNSBQTSwgQ2hoYXlhIFZpc2h3YWthcm1hIDxzcGFuIGRpcj0i bHRyIj4mbHQ7PGEgaHJlZj0ibWFpbHRvOkNoaGF5YS5WaXNod2FrYXJtYUBsbnRpbmZvdGVjaC5j b20iIHRhcmdldD0iX2JsYW5rIj5DaGhheWEuVmlzaHdha2FybWFAbG50aW5mb3RlY2guY29tPC9h PiZndDs8L3NwYW4+IHdyb3RlOjxicj4NCjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIg c3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9y ZGVyLWxlZnQtY29sb3I6cmdiKDIwNCwyMDQsMjA0KTtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtw YWRkaW5nLWxlZnQ6MWV4Ij4NCg0KDQoNCg0KDQo8ZGl2IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVl IiB2bGluaz0icHVycGxlIj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5IaSw8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTomIzM5O1NlZ29lIFVJ JiMzOTssc2Fucy1zZXJpZiI+VGhlIGJlbG93IGNvZGUgcGFyc2VzIFhNTCBmaWxlLCBIZXJlIHRo ZSBvdXRwdXQgb2YgdGhlIGNvZGUgaXMgY29ycmVjdCBidXQgdGhlIGpvYiB0YWtlcyBsb25nIHRp bWUgZm9yIGNvbXBsZXRpb24uPHU+PC91Pjx1PjwvdT48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6JiMzOTtT ZWdvZSBVSSYjMzk7LHNhbnMtc2VyaWYiPkl0IHRvb2sgMjAgaG91cnMgdG8gcGFyc2UgMk1CIGZp bGUuPHU+PC91Pjx1PjwvdT48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g c3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OiYjMzk7U2Vnb2UgVUkmIzM5OyxzYW5z LXNlcmlmIj5LaW5kbHkgc3VnZ2VzdCB3aGF0IGNoYW5nZXMgY291bGQgYmUgZG9uZSB0byBpbmNy ZWFzZSB0aGUgcGVyZm9ybWFuY2UuPHU+PC91Pjx1PjwvdT48L3NwYW4+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB0O2ZvbnQtZmFtaWx5OiYjMzk7 VGltZXMgTmV3IFJvbWFuJiMzOTssc2VyaWYiPjx1PjwvdT6gPHU+PC91Pjwvc3Bhbj48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5wYWNrYWdlIHht bDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVh bTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZhLmlv LkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOzx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IGphdmEudXRpbC4qOzx1PjwvdT48dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+aW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5E b2N1bWVudEJ1aWxkZXJGYWN0b3J5Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+aW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRp b247PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgu eG1sLnhwYXRoLlhQYXRoOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ aW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czs8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNz aW9uRXhjZXB0aW9uOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1w b3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YUlucHV0U3RyZWFtOzx1 PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUu aGFkb29wLmZzLkZTSW5wdXRTdHJlYW07PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5m cy5QYXRoOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29w LmNvbmYuKjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBv cmcuYXBhY2hlLmhhZG9vcC5pby4qOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9y Zy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS4qOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFk b29wLm1hcHJlZHVjZS5saWIuaW5wdXQuRmlsZUlucHV0Rm9ybWF0Ozx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVj ZS5saWIuaW5wdXQuRmlsZVNwbGl0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIuaW5wdXQuVGV4dElu cHV0Rm9ybWF0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0 IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LkZpbGVPdXRwdXRGb3JtYXQ7 PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNo ZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5vdXRwdXQuVGV4dE91dHB1dEZvcm1hdDs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PmltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDs8dT48L3U+PHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ozx1 PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy53M2MuZG9t Lk5vZGVMaXN0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0 IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1Pjwv dT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPnB1YmxpYyBjbGFzcyBSZWFkWG1s TVIgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj57PHU+PC91Pjx1Pjwv dT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgc3RhdGljIExvZ2dl ciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlYWRYbWxNUi5jbGFzcy5nZXROYW1lKCkpOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKAgoKCgoKCgoKCgoKCgIKBwdWJs aWMgc3RhdGljIFN0cmluZyBmaWxlTmFtZSA9IG5ldyBTdHJpbmcoKTs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoCCgoKCgoKCgoKCgoCCgcHVibGljIHN0YXRpYyBE b2N1bWVudCBkb207PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKAg oKCgoKCgoKCgoKAgoHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShKb2JDb25mIGpvYikgezx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKAgZmlsZU5hbWUgPSBqb2Iu Z2V0KCZxdW90O21hcC5pbnB1dC5maWxlJnF1b3Q7KTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPn08dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi Pjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgIDx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIHB1YmxpYyBzdGF0 aWMgY2xhc3MgTWFwIGV4dGVuZHMgTWFwcGVyJmx0O0xvbmdXcml0YWJsZSxUZXh0LFRleHQsVGV4 dCZndDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgIHsgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBwdWJsaWMgdm9pZCBtYXAoTG9u Z1dyaXRhYmxlIGtleSwgVGV4dCB2YWx1ZSxDb250ZXh0IGNvbnRleHQgKSB0aHJvd3MgSU9FeGNl cHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uoA0KPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIHsgPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB0cnkgezx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgIEZpbGVTcGxpdCBmaWxlU3BsaXQgPSAoRmlsZVNwbGl0KWNvbnRl eHQuZ2V0SW5wdXRTcGxpdCgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIENvbmZpZ3VyYXRpb24gY29uZiA9IGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigp Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgDQo8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBEb2N1bWVudEJ1aWxkZXJG YWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTs8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIEZTRGF0YUlucHV0U3RyZWFtIGZzdHJlYW0xOzx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIFBhdGggZmlsZSA9IGZpbGVTcGxpdC5n ZXRQYXRoKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCg oKCgoCCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBGaWxlU3lzdGVtIGZzID0g ZmlsZS5nZXRGaWxlU3lzdGVtKGNvbmYpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+oKCgoKCgoKCgoCCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg ZnN0cmVhbTEgPSBmcy5vcGVuKGZpbGVTcGxpdC5nZXRQYXRoKCkpOzx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5u ZXdEb2N1bWVudEJ1aWxkZXIoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCBkb20gPSBkYi5wYXJzZShmc3RyZWFtMSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgRWxlbWVudCBkb2NFbGUgPSBudWxsOzx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGRvY0VsZSA9IGRvbS5nZXRE b2N1bWVudEVsZW1lbnQoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIFhQYXRoIHhwYXRoID0gWFBh dGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg IE9iamVjdCByZXN1bHQgPaAgeHBhdGguY29tcGlsZSgmcXVvdDsvLyomcXVvdDspLmV2YWx1YXRl KGRvbSwgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6g oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKAgTm9kZUxpc3Qgbm9kZXMgPSAoTm9kZUxpc3QpIHJlc3VsdDs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgZm9yIChpbnQgbiA9IDI7IG4g Jmx0OyBub2Rlcy5nZXRMZW5ndGgoKTsgbisrKQ0KPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKANCjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgIHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKAgVGV4dCBjb2x2YWx1ZT1uZXcgVGV4dCgmcXVvdDsmcXVvdDsp Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoCBUZXh0IG5vZGVuYW1lPSBuZXcgVGV4dCgmcXVvdDsmcXVvdDspOzx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBub2RlbmFtZSA9IG5ldyBUZXh0 KG5vZGVzLml0ZW0obikuZ2V0Tm9kZU5hbWUoKSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIHRyeXtjb2x2YWx1ZSA9IG5ldyBU ZXh0KG5vZGVzLml0ZW0obikuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTt9Y2F0Y2go RXhjZXB0aW9uIGUpe308dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKAgaWYoY29sdmFsdWUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVD YXNlKG51bGwpKXtjb2x2YWx1ZT1uZXcgVGV4dCgmcXVvdDsmcXVvdDspO308dT48L3U+PHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgY29udGV4 dC53cml0ZShub2RlbmFtZSwgY29sdmFsdWUpO6CgoKCgDQo8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB9IGNhdGNoIChQYXJzZXJDb25maWd1 cmF0aW9uRXhjZXB0aW9uIGUpIHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrPHU+PC91Pjx1Pjwv dT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgZS5wcmludFN0YWNrVHJhY2UoKTs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB9IGNhdGNoIChT QVhFeGNlcHRpb24gZSkgezx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2s8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIKCgoKCgoKCgoKCgoKCgoCBlLnByaW50U3RhY2tUcmFjZSgpOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oCB9IGNhdGNoIChYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24gZSkgezx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0 Y2ggYmxvY2s8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBl LnByaW50U3RhY2tUcmFjZSgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIH08dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIH08dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgfTx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIDx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoCBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0 aHJvd3MgRXhjZXB0aW9uPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6g oKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6g oKCgoKCgoKCgoKCgoKAgezx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKCgoKCgoKCgoKCgoKCgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7 PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAg oKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoEpvYiBq b2IgPSBuZXcgSm9iKGNvbmYsICZxdW90O1htbFBhcnNpbmcmcXVvdDspOzx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoCBqb2Iuc2V0SmFyQnlDbGFzcyhSZWFk WG1sTVIuY2xhc3MpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKAg oKCgoKCgoKCgoKCgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgIKCgoKCgoKCgoKCgoCBqb2Iuc2V0T3V0 cHV0VmFsdWVDbGFzcyhUZXh0LmNsYXNzKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgIGpvYi5zZXRNYXBwZXJDbGFzcyhNYXAuY2xhc3MpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+oKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goKCgoKCgoDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCg oKCgoKCgoKCgoKCgIGpvYi5zZXRJbnB1dEZvcm1hdENsYXNzKFRleHRJbnB1dEZvcm1hdC5jbGFz cyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKAgoKCgoKCgoKCg oKAgam9iLnNldE91dHB1dEZvcm1hdENsYXNzKFRleHRPdXRwdXRGb3JtYXQuY2xhc3MpOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoCA8dT48L3U+PHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCBGaWxlSW5wdXRGb3Jt YXQuYWRkSW5wdXRQYXRoKGpvYiwgbmV3IFBhdGgoYXJnc1swXSkpOzx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgIKCgoKCgoKCgoKCgIEZpbGVPdXRwdXRGb3JtYXQu c2V0T3V0cHV0UGF0aChqb2IsIG5ldyBQYXRoKGFyZ3NbMV0pKTs8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoKA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoCBqb2Iuc3VibWl0KCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+oKCgoKCgoKCgoKCgoKCgIGpvYi53YWl0Rm9yQ29tcGxldGlvbih0cnVlKTs8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+ oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgfTx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+fTx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+UmVnYXJkcyw8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPkNoaGF5YSBWaXNod2FrYXJtYTx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPC9kaXY+DQo8YnI+DQo8aHI+DQo8Zm9u dCBmYWNlPSJBcmlhbCIgY29sb3I9IkJsYWNrIiBzaXplPSIzIj5UaGUgY29udGVudHMgb2YgdGhp cyBlLW1haWwgYW5kIGFueSBhdHRhY2htZW50KHMpIG1heSBjb250YWluIGNvbmZpZGVudGlhbCBv ciBwcml2aWxlZ2VkIGluZm9ybWF0aW9uIGZvciB0aGUgaW50ZW5kZWQgcmVjaXBpZW50KHMpLiBV bmludGVuZGVkIHJlY2lwaWVudHMgYXJlIHByb2hpYml0ZWQgZnJvbSB0YWtpbmcgYWN0aW9uIG9u IHRoZSBiYXNpcyBvZiBpbmZvcm1hdGlvbg0KIGluIHRoaXMgZS1tYWlsIGFuZCB1c2luZyBvciBk aXNzZW1pbmF0aW5nIHRoZSBpbmZvcm1hdGlvbiwgYW5kIG11c3Qgbm90aWZ5IHRoZSBzZW5kZXIg YW5kIGRlbGV0ZSBpdCBmcm9tIHRoZWlyIHN5c3RlbS4gTCZhbXA7VCBJbmZvdGVjaCB3aWxsIG5v dCBhY2NlcHQgcmVzcG9uc2liaWxpdHkgb3IgbGlhYmlsaXR5IGZvciB0aGUgYWNjdXJhY3kgb3Ig Y29tcGxldGVuZXNzIG9mLCBvciB0aGUgcHJlc2VuY2Ugb2YgYW55IHZpcnVzIG9yIGRpc2FibGlu ZyBjb2RlDQogaW4gdGhpcyBlLW1haWwmcXVvdDs8YnI+DQo8L2ZvbnQ+DQo8L2Rpdj4NCg0KPC9i bG9ja3F1b3RlPjwvZGl2Pjxicj48YnIgY2xlYXI9ImFsbCI+PGRpdj48YnI+PC9kaXY+LS0gPGJy PjxkaXYgZGlyPSJsdHIiPjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhhbmtz PC9kaXY+PGRpdj5EZXZhcmFqIEs8L2Rpdj48L2Rpdj4NCjwvZGl2PjwvZGl2Pg0K --001a11c2aa6afd3f7104ec383936--