From dev-return-51916-apmail-cocoon-dev-archive=cocoon.apache.org@cocoon.apache.org Mon Nov 24 10:26:04 2003 Return-Path: Delivered-To: apmail-cocoon-dev-archive@www.apache.org Received: (qmail 25397 invoked from network); 24 Nov 2003 10:26:03 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 24 Nov 2003 10:26:03 -0000 Received: (qmail 54235 invoked by uid 500); 24 Nov 2003 10:25:35 -0000 Delivered-To: apmail-cocoon-dev-archive@cocoon.apache.org Received: (qmail 53856 invoked by uid 500); 24 Nov 2003 10:25:32 -0000 Mailing-List: contact dev-help@cocoon.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: dev@cocoon.apache.org Delivered-To: mailing list dev@cocoon.apache.org Received: (qmail 53843 invoked from network); 24 Nov 2003 10:25:31 -0000 Received: from unknown (HELO web25204.mail.ukl.yahoo.com) (217.12.10.64) by daedalus.apache.org with SMTP; 24 Nov 2003 10:25:31 -0000 Message-ID: <20031124102544.67490.qmail@web25204.mail.ukl.yahoo.com> Received: from [80.245.39.158] by web25204.mail.ukl.yahoo.com via HTTP; Mon, 24 Nov 2003 11:25:44 CET Date: Mon, 24 Nov 2003 11:25:44 +0100 (CET) From: =?iso-8859-1?q?Borges=20Charles?= Subject: Re: SVGSerializer patch To: dev@cocoon.apache.org In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-270688782-1069669544=:66409" Content-Transfer-Encoding: 8bit X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N --0-270688782-1069669544=:66409 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Content-Id: Content-Disposition: inline > >I think that in cocoon 2.1.3 the sitemap parameters > are not available for serializers. They're always > set to empty parameters when the > SitemapModelComponent is a Serializer. > >Is that correct? > > > > > > It is correct that... you found a bug :-/ > > The sitemap engine wasn't updated to take into > account the ability for > serializers to implement SitemapModelComponent. > > I just fixed it in the CVS. > > Sylvain > Given this bug fix, i propose a SVGSerializer patch which support sitemap parameters (see attached files). Thus, 1. in the serializer configuration you define the transcoding hints which can be overriden by the sitemap parameters, say: 2. Override in a serialize node: Charles ___________________________________________________________ Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français ! Yahoo! Mail : http://fr.mail.yahoo.com --0-270688782-1069669544=:66409 Content-Type: text/plain; name="SVGSerializer.diff" Content-Description: SVGSerializer.diff Content-Disposition: inline; filename="SVGSerializer.diff" Index: SVGSerializer.java =================================================================== RCS file: /home/cvspublic/cocoon-2.1/src/blocks/batik/java/org/apache/cocoon/serialization/SVGSerializer.java,v retrieving revision 1.9 diff -u -r1.9 SVGSerializer.java --- SVGSerializer.java 9 Oct 2003 15:26:54 -0000 1.9 +++ SVGSerializer.java 24 Nov 2003 10:17:39 -0000 @@ -51,7 +51,13 @@ package org.apache.cocoon.serialization; import java.awt.Color; +import java.io.IOException; import java.io.OutputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; import org.apache.avalon.excalibur.pool.Poolable; import org.apache.avalon.framework.component.ComponentManager; @@ -62,18 +68,22 @@ import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.parameters.Parameters; import org.apache.batik.transcoder.Transcoder; +import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; -import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.util.ParsedURL; import org.apache.cocoon.Constants; +import org.apache.cocoon.ProcessingException; import org.apache.cocoon.caching.CacheableProcessingComponent; import org.apache.cocoon.components.transcoder.ExtendableTranscoderFactory; import org.apache.cocoon.components.transcoder.TranscoderFactory; import org.apache.cocoon.components.url.ParsedContextURLProtocolHandler; import org.apache.cocoon.components.url.ParsedResourceURLProtocolHandler; +import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.sitemap.SitemapModelComponent; import org.apache.cocoon.util.ClassUtils; import org.apache.cocoon.xml.dom.SVGBuilder; import org.apache.excalibur.source.SourceValidity; @@ -89,7 +99,7 @@ * @version CVS $Id: SVGSerializer.java,v 1.9 2003/10/09 15:26:54 sylvain Exp $ */ public class SVGSerializer extends SVGBuilder -implements Composable, Serializer, Configurable, Poolable, CacheableProcessingComponent, Contextualizable { +implements Composable, Serializer, Configurable, Poolable, CacheableProcessingComponent, Contextualizable, SitemapModelComponent { /** * Get the context @@ -112,7 +122,22 @@ /** The Transcoder Factory to use */ TranscoderFactory factory = ExtendableTranscoderFactory.getTranscoderFactoryImplementation(); - + + /** The current caching key */ + private Serializable cachingKey; + + /** The default Batik TranscodingHints set up in configuration step */ + private TranscodingHints defaultTranscodingHints; + + /** The current Batik TranscodingHints can overrides the default one */ + private TranscodingHints currentTranscodingHints; + + /** The map holding information for the Batik TranscodingHints.Keys */ + private Map transcodingHintKeysInfo; + + /** Override default TranscodingHints with sitemap parameters? */ + private boolean overrideTranscodingHints = false; + private boolean _overrideTranscodingHints = false; /** * Set the OutputStream where the XML should be serialized. */ @@ -157,8 +182,10 @@ ); } - // Now run through the other parameters, using them as hints - // to the transcoder + // Now run through the other parameters, adding them to the + // default transcoding hints + defaultTranscodingHints = new TranscodingHints(); + transcodingHintKeysInfo = new HashMap(); for (int i = 0; i < parameters.length; i++ ) { String name = parameters[i].getAttribute("name"); // Skip over the parameters we've dealt with. Ensure this @@ -169,48 +196,93 @@ // Now try and get the hints out try { - // Turn it into a key name (assume the current Batik style continues! - name = ("KEY_" + name).toUpperCase(); - // Use reflection to get a reference to the key object - TranscodingHints.Key key = (TranscodingHints.Key) - (transcoder.getClass().getField(name).get(transcoder)); - Object value; - String keyType = parameters[i].getAttribute("type", "STRING").toUpperCase(); - if ("FLOAT".equals(keyType)) { - // Can throw an exception. - value = new Float(parameters[i].getAttributeAsFloat("value")); - } else if ("INTEGER".equals(keyType)) { - // Can throw an exception. - value = new Integer(parameters[i].getAttributeAsInteger("value")); - } else if ("BOOLEAN".equals(keyType)) { - // Can throw an exception. - value = new Boolean(parameters[i].getAttributeAsBoolean("value")); - } else if ("COLOR".equals(keyType)) { - // Can throw an exception - String stringValue = parameters[i].getAttribute("value"); - if (stringValue.startsWith("#")) { - stringValue = stringValue.substring(1); + String batikKeyName = "KEY_" + name.toUpperCase(); + String batikKeyType = parameters[i].getAttribute("type", "STRING").toUpperCase(); + //Use reflection to get a reference to the key object + TranscodingHints.Key key = (TranscodingHints.Key) (this.transcoder.getClass().getField(batikKeyName).get(this.transcoder)); + + //The value is not required. It can only declares a default value for a key + Object value = computeBatikKeyValue(batikKeyType, parameters[i].getAttribute("value", null)); + + // Adding transcoding hint value + if (value != null) { + if(getLogger().isDebugEnabled()) { + getLogger().debug("Adding default hint \"" + name + "\" with value \"" + value.toString() + "\""); } - value = new Color(Integer.parseInt(stringValue, 16)); - } else { - // Assume String, and get the value. Allow an empty string. - value = parameters[i].getAttribute("value", ""); + defaultTranscodingHints.put(key, value); } - if(getLogger().isDebugEnabled()) { - getLogger().debug("Adding hint \"" + name + "\" with value \"" + value.toString() + "\""); - } - transcoder.addTranscodingHint(key, value); + + // Adding info for all declared keys + TranscodingHintKeyInfo keyInfo = new TranscodingHintKeyInfo(batikKeyName, batikKeyType, key); + transcodingHintKeysInfo.put(name, keyInfo); + } catch (ClassCastException ex) { // This is only thrown from the String keyType... line throw new ConfigurationException("Specified key (" + name + ") is not a valid Batik Transcoder key.", ex); - } catch (ConfigurationException ex) { - throw new ConfigurationException("Name or value not specified.", ex); } catch (IllegalAccessException ex) { throw new ConfigurationException("Cannot access the key for parameter \"" + name + "\"", ex); } catch (NoSuchFieldException ex) { throw new ConfigurationException("No field available for parameter \"" + name + "\"", ex); } } + + // Setting default value to enable overriding default transcoding hints + overrideTranscodingHints = + conf.getChild("override-transcoding-hints").getValueAsBoolean(false); + if (getLogger().isDebugEnabled() && overrideTranscodingHints) { + getLogger().debug( + "The transcoding hints may be overrinden by sitemap parameters"); + } + } + + /** + * Set the SourceResolver, the Map with + * the object model, the source and sitemap + * Parameters used to process the request. + */ + public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException { + currentTranscodingHints = (TranscodingHints) defaultTranscodingHints.clone(); + cachingKey = "1"; + // Overrides configured batik transcoding hints values with sitemap parameters? + this._overrideTranscodingHints = par.getParameterAsBoolean("override-transcoding-hints", overrideTranscodingHints); + if (this._overrideTranscodingHints) { + StringBuffer cachingKeyBuffer = new StringBuffer(); + Set entries = transcodingHintKeysInfo.entrySet(); + // Looking for sitemap parameters we have the batik keys info + for(Iterator i=entries.iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry) i.next(); + String keyName = (String) entry.getKey(); + // Any sitemap parameter ? + String keyValue = par.getParameter(keyName, null); + if (keyValue != null) { + TranscodingHintKeyInfo keyInfo = (TranscodingHintKeyInfo) entry.getValue(); + String batikKeyName = keyInfo.getName(); + String batikKeyType = keyInfo.getType(); + TranscodingHints.Key batikKey = keyInfo.getTranscodingHintKey(); + Object batikKeyValue = + computeBatikKeyValue(batikKeyType, keyValue); + if (batikKeyValue == null) { + getLogger().info("Cannot compute value for parameter \"" + keyName + "\" (" +batikKeyName + "). If a default value was set, it will be used instead."); + } else { + if (getLogger().isDebugEnabled()) { + getLogger().debug("Setting parameter \"" + keyName + "\" (" + batikKeyName + ") value to " + batikKeyValue.toString()); + } + currentTranscodingHints.put(batikKey, batikKeyValue); + cachingKeyBuffer.append(";"); + cachingKeyBuffer.append(keyName); + cachingKeyBuffer.append("="); + cachingKeyBuffer.append(keyValue); + } + } + + } + // Set the caching key + String currentCachingKey = cachingKeyBuffer.toString().trim(); + if (currentCachingKey.length() > 0) { + cachingKey = currentCachingKey; + } + } + } /** @@ -229,6 +301,8 @@ // Buffering is done by the pipeline (See shouldSetContentLength) TranscoderOutput transOutput = new TranscoderOutput(this.output); + // Setting current transcoding hints to transcoder + transcoder.setTranscodingHints(currentTranscodingHints); transcoder.transcode(transInput, transOutput); } catch (TranscoderException ex) { if (ex.getException() != null) { @@ -265,8 +339,8 @@ * @return The generated key or 0 if the component * is currently not cacheable. */ - public java.io.Serializable getKey() { - return "1"; + public Serializable getKey() { + return cachingKey; } /** @@ -293,4 +367,119 @@ public boolean shouldSetContentLength() { return true; } + + /** + * Computes the transcoding hint value for a key type declared in + * the configuration of this serializer. + * + * @param keyType The key type. + * @param value The string value to be converted into an object. + * @return The object value. it will return null if the value + * cannot be computed or the key type is unknown. + */ + private Object computeBatikKeyValue(String type, String value) { + if (value == null) { + return null; + } + if ("STRING".equals(type)) { + return value; + } + if (value.length() == 0) { + return null; + } + if ("FLOAT".equals(type)) { + try { + return Float.valueOf(value); + } catch (NumberFormatException e) { + return null; + } + } + if ("INTEGER".equals(type)) { + + try { + return Integer.valueOf(value); + } catch (NumberFormatException e) { + return null; + } + + } + if ("BOOLEAN".equals(type)) { + return Boolean.valueOf(value); + } + if ("COLOR".equals(type)) { + // Can throw an exception + if (value.startsWith("#")) { + value = value.substring(1); + } + try { + return new Color(Integer.parseInt(value, 16)); + } catch (NumberFormatException e) { + return null; + } + } + return null; + } + + /** + * This is a convinience class to hold information on the configured + * Batik keys + */ + private static final class TranscodingHintKeyInfo { + + /** key type as of INTEGER, ... */ + private String type; + + /** batik key name starting with KEY_ */ + private String name; + + /** batik TranscodingHints.Key */ + private TranscodingHints.Key key; + + /** + * Constructor + * + * @param name The batik key name + * @param type The configured key type + * @param batikKey The TranscodingHints.Key + */ + public TranscodingHintKeyInfo( + String name, + String type, + TranscodingHints.Key batikKey){ + this.name = name; + this.type = type; + this.key = batikKey; + + } + + /** + * Gets the batik key name + * + * @return The batik key name + */ + public String getName() { + return name; + } + + /** + * Gets the configured key type + * + * @return The key type + */ + public String getType() { + return type; + } + + /** + * Gets the TranscodingHints.Key + * + * @return The TranscodingHints.Key + */ + public TranscodingHints.Key getTranscodingHintKey() { + return key; + } + + } + + } --0-270688782-1069669544=:66409 Content-Type: application/octet-stream; name="SVGSerializer.java" Content-Transfer-Encoding: base64 Content-Description: SVGSerializer.java Content-Disposition: attachment; filename="SVGSerializer.java" LyoKCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAg ICAgICAgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNp b24gMS4xCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogQ29w eXJpZ2h0IChDKSAxOTk5LTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKIFJlZGlzdHJpYnV0aW9u IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig d2l0aG91dCBtb2RpZmljYS0KIHRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAx LiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFp biB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCiAgICB0aGlzIGxpc3Qg b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoK IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAgIHRoaXMgbGlz dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg aW4gdGhlIGRvY3VtZW50YXRpb24KICAgIGFuZC9vciBvdGhlciBtYXRlcmlh bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKIDMuIFRoZSBl bmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlz dHJpYnV0aW9uLCBpZiBhbnksIG11c3QKICAgIGluY2x1ZGUgIHRoZSBmb2xs b3dpbmcgIGFja25vd2xlZGdtZW50OiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRl cyAgc29mdHdhcmUKICAgIGRldmVsb3BlZCAgYnkgdGhlICBBcGFjaGUgU29m dHdhcmUgRm91bmRhdGlvbiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIK ICAgIEFsdGVybmF0ZWx5LCB0aGlzICBhY2tub3dsZWRnbWVudCBtYXkgIGFw cGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCAgaWYKICAgIGFuZCB3aGVy ZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxs eSBhcHBlYXIuCgogNC4gVGhlIG5hbWVzICJBcGFjaGUgQ29jb29uIiBhbmQg ICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAgbm90ICBiZQog ICAgdXNlZCB0byAgZW5kb3JzZSBvciBwcm9tb3RlICBwcm9kdWN0cyBkZXJp dmVkIGZyb20gIHRoaXMgc29mdHdhcmUgd2l0aG91dAogICAgcHJpb3Igd3Jp dHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVh c2UgY29udGFjdAogICAgYXBhY2hlQGFwYWNoZS5vcmcuCgogNS4gUHJvZHVj dHMgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgIGJlIGNh bGxlZCAiQXBhY2hlIiwgbm9yIG1heQogICAgIkFwYWNoZSIgYXBwZWFyICBp biB0aGVpciBuYW1lLCAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Np b24gIG9mIHRoZQogICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgog VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBF WFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogSU5DTFVESU5HLCBC VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZIEFORAogRklUTkVTUyAgRk9SIEEgUEFSVElDVUxB UiAgUFVSUE9TRSBBUkUgIERJU0NMQUlNRUQuICBJTiBOTyAgRVZFTlQgU0hB TEwgIFRIRQogQVBBQ0hFIFNPRlRXQVJFICBGT1VOREFUSU9OICBPUiBJVFMg Q09OVFJJQlVUT1JTICBCRSBMSUFCTEUgRk9SICBBTlkgRElSRUNULAogSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsICBFWEVNUExBUlksIE9SIENP TlNFUVVFTlRJQUwgIERBTUFHRVMgKElOQ0xVLQogRElORywgQlVUIE5PVCBM SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAgT0YgU1VCU1RJVFVURSBHT09EUyBP UiBTRVJWSUNFUzsgTE9TUwogT0YgVVNFLCBEQVRBLCBPUiAgUFJPRklUUzsg T1IgQlVTSU5FU1MgIElOVEVSUlVQVElPTikgIEhPV0VWRVIgQ0FVU0VEIEFO RCBPTgogQU5ZICBUSEVPUlkgT0YgTElBQklMSVRZLCAgV0hFVEhFUiAgSU4g Q09OVFJBQ1QsICBTVFJJQ1QgTElBQklMSVRZLCAgT1IgVE9SVAogKElOQ0xV RElORyAgTkVHTElHRU5DRSBPUiAgT1RIRVJXSVNFKSBBUklTSU5HIElOICBB TlkgV0FZIE9VVCBPRiBUSEUgIFVTRSBPRgogVEhJUyBTT0ZUV0FSRSwgRVZF TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH RS4KCiBUaGlzIHNvZnR3YXJlICBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29u dHJpYnV0aW9ucyBtYWRlICBieSBtYW55IGluZGl2aWR1YWxzCiBvbiAgYmVo YWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24gYW5kIHdh cyAgb3JpZ2luYWxseSBjcmVhdGVkIGJ5CiBTdGVmYW5vIE1henpvY2NoaSAg PHN0ZWZhbm9AYXBhY2hlLm9yZz4uIEZvciBtb3JlICBpbmZvcm1hdGlvbiBv biB0aGUgQXBhY2hlCiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2Vl IDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KCiovCnBhY2thZ2Ugb3JnLmFw YWNoZS5jb2Nvb24uc2VyaWFsaXphdGlvbjsKCmltcG9ydCBqYXZhLmF3dC5D b2xvcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZh LmlvLk91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxl OwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwu SXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51 dGlsLlNldDsKCmltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIu cG9vbC5Qb29sYWJsZTsKaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1l d29yay5jb21wb25lbnQuQ29tcG9uZW50TWFuYWdlcjsKaW1wb3J0IG9yZy5h cGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb21wb25lbnQuQ29tcG9zYWJsZTsK aW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yay5jb25maWd1cmF0 aW9uLkNvbmZpZ3VyYWJsZTsKaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmZy YW1ld29yay5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CmltcG9ydCBv cmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29uZmlndXJhdGlvbi5Db25m aWd1cmF0aW9uRXhjZXB0aW9uOwppbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24u ZnJhbWV3b3JrLmNvbnRleHQuQ29udGV4dDsKaW1wb3J0IG9yZy5hcGFjaGUu YXZhbG9uLmZyYW1ld29yay5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Cmlt cG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuY29udGV4dC5Db250 ZXh0dWFsaXphYmxlOwppbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3 b3JrLnBhcmFtZXRlcnMuUGFyYW1ldGVyczsKaW1wb3J0IG9yZy5hcGFjaGUu YmF0aWsudHJhbnNjb2Rlci5UcmFuc2NvZGVyOwppbXBvcnQgb3JnLmFwYWNo ZS5iYXRpay50cmFuc2NvZGVyLlRyYW5zY29kZXJFeGNlcHRpb247CmltcG9y dCBvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuVHJhbnNjb2RlcklucHV0 OwppbXBvcnQgb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLlRyYW5zY29k ZXJPdXRwdXQ7CmltcG9ydCBvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIu VHJhbnNjb2RpbmdIaW50czsKaW1wb3J0IG9yZy5hcGFjaGUuYmF0aWsudXRp bC5QYXJzZWRVUkw7CmltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Db25zdGFu dHM7CmltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5Qcm9jZXNzaW5nRXhjZXB0 aW9uOwppbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uY2FjaGluZy5DYWNoZWFi bGVQcm9jZXNzaW5nQ29tcG9uZW50OwppbXBvcnQgb3JnLmFwYWNoZS5jb2Nv b24uY29tcG9uZW50cy50cmFuc2NvZGVyLkV4dGVuZGFibGVUcmFuc2NvZGVy RmFjdG9yeTsKaW1wb3J0IG9yZy5hcGFjaGUuY29jb29uLmNvbXBvbmVudHMu dHJhbnNjb2Rlci5UcmFuc2NvZGVyRmFjdG9yeTsKaW1wb3J0IG9yZy5hcGFj aGUuY29jb29uLmNvbXBvbmVudHMudXJsLlBhcnNlZENvbnRleHRVUkxQcm90 b2NvbEhhbmRsZXI7CmltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi5jb21wb25l bnRzLnVybC5QYXJzZWRSZXNvdXJjZVVSTFByb3RvY29sSGFuZGxlcjsKaW1w b3J0IG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LlNvdXJjZVJlc29s dmVyOwppbXBvcnQgb3JnLmFwYWNoZS5jb2Nvb24uc2l0ZW1hcC5TaXRlbWFw TW9kZWxDb21wb25lbnQ7CmltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi51dGls LkNsYXNzVXRpbHM7CmltcG9ydCBvcmcuYXBhY2hlLmNvY29vbi54bWwuZG9t LlNWR0J1aWxkZXI7CmltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1ci5zb3Vy Y2UuU291cmNlVmFsaWRpdHk7CmltcG9ydCBvcmcuYXBhY2hlLmV4Y2FsaWJ1 ci5zb3VyY2UuaW1wbC52YWxpZGl0eS5OT1BWYWxpZGl0eTsKaW1wb3J0IG9y Zy53M2MuZG9tLkRvY3VtZW50OwppbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhj ZXB0aW9uOwoKLyoqCiAqIEEgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUu b3JnL2JhdGlrLyI+QmF0aWs8L2E+IGJhc2VkIFNlcmlhbGl6ZXIgZm9yIGdl bmVyYXRpbmcgUE5HL0pQRUcgaW1hZ2VzCiAqCiAqIEBhdXRob3IgPGEgaHJl Zj0ibWFpbHRvOmRpbXNAeWFob28uY29tIj5EYXZhbnVtIFNyaW5pdmFzPC9h PgogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyb3NzYkBhcGFjaGUub3Jn Ij5Sb3NzIEJ1cnRvbjwvYT4KICogQHZlcnNpb24gQ1ZTICRJZDogU1ZHU2Vy aWFsaXplci5qYXZhLHYgMS45IDIwMDMvMTAvMDkgMTU6MjY6NTQgc3lsdmFp biBFeHAgJAogKi8KcHVibGljIGNsYXNzIFNWR1NlcmlhbGl6ZXIgZXh0ZW5k cyBTVkdCdWlsZGVyCmltcGxlbWVudHMgQ29tcG9zYWJsZSwgU2VyaWFsaXpl ciwgQ29uZmlndXJhYmxlLCBQb29sYWJsZSwgQ2FjaGVhYmxlUHJvY2Vzc2lu Z0NvbXBvbmVudCwgQ29udGV4dHVhbGl6YWJsZSwgU2l0ZW1hcE1vZGVsQ29t cG9uZW50IHsKCiAgICAvKioKICAgICAqIEdldCB0aGUgY29udGV4dAogICAg ICovCiAgICBwdWJsaWMgdm9pZCBjb250ZXh0dWFsaXplKENvbnRleHQgY29u dGV4dCkgdGhyb3dzIENvbnRleHRFeGNlcHRpb24gewogICAgICAgIFBhcnNl ZENvbnRleHRVUkxQcm90b2NvbEhhbmRsZXIuc2V0Q29udGV4dCgKICAgICAg ICAgICAgKG9yZy5hcGFjaGUuY29jb29uLmVudmlyb25tZW50LkNvbnRleHQp Y29udGV4dC5nZXQoQ29uc3RhbnRzLkNPTlRFWFRfRU5WSVJPTk1FTlRfQ09O VEVYVCkpOwogICAgICAgIFBhcnNlZFVSTC5yZWdpc3RlckhhbmRsZXIobmV3 IFBhcnNlZENvbnRleHRVUkxQcm90b2NvbEhhbmRsZXIoKSk7CiAgICAgICAg UGFyc2VkVVJMLnJlZ2lzdGVySGFuZGxlcihuZXcgUGFyc2VkUmVzb3VyY2VV UkxQcm90b2NvbEhhbmRsZXIoKSk7CiAgICB9CgogICAgLyoqIFRoZSBjdXJy ZW50IDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uICovCiAgICBwcml2YXRl IE91dHB1dFN0cmVhbSBvdXRwdXQ7CgogICAgLyoqIFRoZSBjdXJyZW50IDxj b2RlPm1pbWUtdHlwZTwvY29kZT4uICovCiAgICBwcml2YXRlIFN0cmluZyBt aW1ldHlwZTsKCiAgICAvKiogVGhlIGN1cnJlbnQgPGNvZGU+VHJhbnNjb2Rl cjwvY29kZT4uICAqLwogICAgVHJhbnNjb2RlciB0cmFuc2NvZGVyOwoKICAg IC8qKiBUaGUgVHJhbnNjb2RlciBGYWN0b3J5IHRvIHVzZSAqLwogICAgVHJh bnNjb2RlckZhY3RvcnkgZmFjdG9yeSA9IEV4dGVuZGFibGVUcmFuc2NvZGVy RmFjdG9yeS5nZXRUcmFuc2NvZGVyRmFjdG9yeUltcGxlbWVudGF0aW9uKCk7 CiAgICAKICAgIC8qKiBUaGUgY3VycmVudCBjYWNoaW5nIGtleSAqLwogICAg cHJpdmF0ZSBTZXJpYWxpemFibGUgY2FjaGluZ0tleTsKICAgIAogICAgLyoq IFRoZSBkZWZhdWx0IEJhdGlrIDxjb2RlPlRyYW5zY29kaW5nSGludHM8L2Nv ZGU+IHNldCB1cCBpbiBjb25maWd1cmF0aW9uIHN0ZXAgKi8KICAgIHByaXZh dGUgVHJhbnNjb2RpbmdIaW50cyBkZWZhdWx0VHJhbnNjb2RpbmdIaW50czsK ICAgIAogICAgLyoqIFRoZSBjdXJyZW50IEJhdGlrIDxjb2RlPlRyYW5zY29k aW5nSGludHM8L2NvZGU+IGNhbiBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb25l ICovCiAgICBwcml2YXRlIFRyYW5zY29kaW5nSGludHMgY3VycmVudFRyYW5z Y29kaW5nSGludHM7CiAgICAKICAgIC8qKiBUaGUgbWFwIGhvbGRpbmcgaW5m b3JtYXRpb24gZm9yIHRoZSBCYXRpayA8Y29kZT5UcmFuc2NvZGluZ0hpbnRz LktleTwvY29kZT5zICovCiAgICBwcml2YXRlIE1hcCB0cmFuc2NvZGluZ0hp bnRLZXlzSW5mbzsKICAgIAogICAgLyoqIE92ZXJyaWRlIGRlZmF1bHQgPGNv ZGU+VHJhbnNjb2RpbmdIaW50czwvY29kZT4gd2l0aCBzaXRlbWFwIHBhcmFt ZXRlcnM/ICovCiAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGVUcmFuc2Nv ZGluZ0hpbnRzID0gZmFsc2U7CiAgICBwcml2YXRlIGJvb2xlYW4gX292ZXJy aWRlVHJhbnNjb2RpbmdIaW50cyA9IGZhbHNlOwogICAgLyoqCiAgICAgKiBT ZXQgdGhlIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gd2hlcmUgdGhlIFhN TCBzaG91bGQgYmUgc2VyaWFsaXplZC4KICAgICAqLwogICAgcHVibGljIHZv aWQgc2V0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKICAgICAg ICB0aGlzLm91dHB1dCA9IG91dDsKICAgIH0KCiAgICAvKioKICAgICAqIFNl dCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgc2VyaWFsaXplci4KICAg ICAqLwogICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYXRpb24g Y29uZikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewogICAgICAg IHRoaXMubWltZXR5cGUgPSBjb25mLmdldEF0dHJpYnV0ZSgibWltZS10eXBl Iik7CiAgICAgICAgaWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkp IHsKICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIm1pbWUtdHlwZTog IiArIG1pbWV0eXBlKTsKICAgICAgICB9CgogICAgICAgIC8vIFVzaW5nIHRo ZSBUcmFuc2NvZGVyIEZhY3RvcnksIGdldCB0aGUgZGVmYXVsdCB0cmFuc2Nv ZGVyCiAgICAgICAgLy8gZm9yIHRoaXMgTUlNRSB0eXBlLgogICAgICAgIHRo aXMudHJhbnNjb2RlciA9IGZhY3RvcnkuY3JlYXRlVHJhbnNjb2RlcihtaW1l dHlwZSk7CgogICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGFyYW1l dGVycywgbG9va2luZyBmb3IgYSB0cmFuc2NvZGVyIHJlZmVyZW5jZQogICAg ICAgIENvbmZpZ3VyYXRpb25bXSBwYXJhbWV0ZXJzID0gY29uZi5nZXRDaGls ZHJlbigicGFyYW1ldGVyIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIFN0cmlu ZyBuYW1lID0gcGFyYW1ldGVyc1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsK ICAgICAgICAgICAgaWYgKCJ0cmFuc2NvZGVyIi5lcXVhbHMobmFtZSkpIHsK ICAgICAgICAgICAgICAgIFN0cmluZyB0cmFuc2NvZGVyTmFtZSA9IHBhcmFt ZXRlcnNbaV0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwogICAgICAgICAgICAg ICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zY29kZXIg PSAoVHJhbnNjb2RlcilDbGFzc1V0aWxzLm5ld0luc3RhbmNlKHRyYW5zY29k ZXJOYW1lKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBl eCkgewogICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb2dnZXIoKS5pc0Rl YnVnRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldExv Z2dlcigpLmRlYnVnKCJDYW5ub3QgbG9hZCAgY2xhc3MgIiArIHRyYW5zY29k ZXJOYW1lLCBleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJD YW5ub3QgbG9hZCBjbGFzcyAiICsgdHJhbnNjb2Rlck5hbWUsIGV4KTsKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAg ICAvLyBEbyB3ZSBoYXZlIGEgdHJhbnNjb2RlciB5ZXQ/CiAgICAgICAgaWYg KHRoaXMudHJhbnNjb2RlciA9PSBudWxsICkgewogICAgICAgICAgICB0aHJv dyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAg ICJDb3VsZCBub3QgYXV0b2RldGVjdCB0cmFuc2NvZGVyIGZvciBTVkdTZXJp YWxpemVyIGFuZCAiCiAgICAgICAgICAgICAgICArICJubyB0cmFuc2NvZGVy IHdhcyBzcGVjaWZpZWQgaW4gdGhlIHNpdGVtYXAgY29uZmlndXJhdGlvbi4i CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvLyBOb3cgcnVu IHRocm91Z2ggdGhlIG90aGVyIHBhcmFtZXRlcnMsIGFkZGluZyB0aGVtIHRv IHRoZSAKICAgICAgICAvLyBkZWZhdWx0IHRyYW5zY29kaW5nIGhpbnRzCiAg ICAgICAgZGVmYXVsdFRyYW5zY29kaW5nSGludHMgPSBuZXcgVHJhbnNjb2Rp bmdIaW50cygpOwogICAgICAgIHRyYW5zY29kaW5nSGludEtleXNJbmZvID0g bmV3IEhhc2hNYXAoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBh cmFtZXRlcnMubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIFN0cmluZyBu YW1lID0gcGFyYW1ldGVyc1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAg ICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBwYXJhbWV0ZXJzIHdlJ3ZlIGRl YWx0IHdpdGguIEVuc3VyZSB0aGlzCiAgICAgICAgICAgIC8vIGlzIGtlcHQg aW4gc3luYyB3aXRoIHRoZSBhYm92ZSBsaXN0IQogICAgICAgICAgICBpZiAo InRyYW5zY29kZXIiLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAg Y29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE5vdyB0 cnkgYW5kIGdldCB0aGUgaGludHMgb3V0CiAgICAgICAgICAgIHRyeSB7CiAg ICAgICAgICAgICAgICBTdHJpbmcgYmF0aWtLZXlOYW1lID0gIktFWV8iICsg bmFtZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgU3RyaW5nIGJh dGlrS2V5VHlwZSA9IHBhcmFtZXRlcnNbaV0uZ2V0QXR0cmlidXRlKCJ0eXBl IiwgIlNUUklORyIpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAv L1VzZSByZWZsZWN0aW9uIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUga2V5 IG9iamVjdAogICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdIaW50cy5LZXkg a2V5ID0gKFRyYW5zY29kaW5nSGludHMuS2V5KSAodGhpcy50cmFuc2NvZGVy LmdldENsYXNzKCkuZ2V0RmllbGQoYmF0aWtLZXlOYW1lKS5nZXQodGhpcy50 cmFuc2NvZGVyKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg IC8vVGhlIHZhbHVlIGlzIG5vdCByZXF1aXJlZC4gSXQgY2FuIG9ubHkgZGVj bGFyZXMgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGtleQogICAgICAgICAgICAg ICAgT2JqZWN0IHZhbHVlID0gY29tcHV0ZUJhdGlrS2V5VmFsdWUoYmF0aWtL ZXlUeXBlLCBwYXJhbWV0ZXJzW2ldLmdldEF0dHJpYnV0ZSgidmFsdWUiLCBu dWxsKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIEFk ZGluZyB0cmFuc2NvZGluZyBoaW50IHZhbHVlCiAgICAgICAgICAgICAgICBp ZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmKGdl dExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAg ICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoIkFkZGluZyBkZWZhdWx0IGhp bnQgXCIiICsgbmFtZSArICJcIiB3aXRoIHZhbHVlIFwiIiArIHZhbHVlLnRv U3RyaW5nKCkgKyAiXCIiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICAgICAgICAgZGVmYXVsdFRyYW5zY29kaW5nSGludHMucHV0KGtl eSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAvLyBBZGRpbmcgaW5mbyBmb3IgYWxsIGRlY2xh cmVkIGtleXMgCiAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ0hpbnRLZXlJ bmZvIGtleUluZm8gPSBuZXcgVHJhbnNjb2RpbmdIaW50S2V5SW5mbyhiYXRp a0tleU5hbWUsIGJhdGlrS2V5VHlwZSwga2V5KTsKICAgICAgICAgICAgICAg IHRyYW5zY29kaW5nSGludEtleXNJbmZvLnB1dChuYW1lLCBrZXlJbmZvKTsK ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nh c3RFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMg b25seSB0aHJvd24gZnJvbSB0aGUgU3RyaW5nIGtleVR5cGUuLi4gbGluZQog ICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRp b24oIlNwZWNpZmllZCBrZXkgKCIgKyBuYW1lICsgIikgaXMgbm90IGEgdmFs aWQgQmF0aWsgVHJhbnNjb2RlciBrZXkuIiwgZXgpOwogICAgICAgICAgICB9 IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CiAgICAgICAg ICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ2Fu bm90IGFjY2VzcyB0aGUga2V5IGZvciBwYXJhbWV0ZXIgXCIiICsgbmFtZSAr ICJcIiIsIGV4KTsKICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRF eGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25m aWd1cmF0aW9uRXhjZXB0aW9uKCJObyBmaWVsZCBhdmFpbGFibGUgZm9yIHBh cmFtZXRlciBcIiIgKyBuYW1lICsgIlwiIiwgZXgpOwogICAgICAgICAgICB9 CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFNldHRpbmcgZGVmYXVs dCB2YWx1ZSB0byBlbmFibGUgb3ZlcnJpZGluZyBkZWZhdWx0IHRyYW5zY29k aW5nIGhpbnRzCiAgICAgICAgb3ZlcnJpZGVUcmFuc2NvZGluZ0hpbnRzID0K ICAgICAgICAgICAgY29uZi5nZXRDaGlsZCgib3ZlcnJpZGUtdHJhbnNjb2Rp bmctaGludHMiKS5nZXRWYWx1ZUFzQm9vbGVhbihmYWxzZSk7CiAgICAgICAg aWYgKGdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkgJiYgb3ZlcnJpZGVU cmFuc2NvZGluZ0hpbnRzKSB7CiAgICAgICAgICAgIGdldExvZ2dlcigpLmRl YnVnKAogICAgICAgICAgICAgICAgIlRoZSB0cmFuc2NvZGluZyBoaW50cyBt YXkgYmUgb3ZlcnJpbmRlbiBieSBzaXRlbWFwIHBhcmFtZXRlcnMiKTsKICAg ICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2V0IHRoZSA8Y29k ZT5Tb3VyY2VSZXNvbHZlcjwvY29kZT4sIHRoZSA8Y29kZT5NYXA8L2NvZGU+ IHdpdGgKICAgICAqIHRoZSBvYmplY3QgbW9kZWwsIHRoZSBzb3VyY2UgYW5k IHNpdGVtYXAKICAgICAqIDxjb2RlPlBhcmFtZXRlcnM8L2NvZGU+IHVzZWQg dG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KICAgICAqLwogICAgcHVibGljIHZv aWQgc2V0dXAoU291cmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIE1hcCBvYmplY3RN b2RlbCwgU3RyaW5nIHNyYywgUGFyYW1ldGVycyBwYXIpIHRocm93cyBQcm9j ZXNzaW5nRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsK ICAgICAgICBjdXJyZW50VHJhbnNjb2RpbmdIaW50cyA9IChUcmFuc2NvZGlu Z0hpbnRzKSBkZWZhdWx0VHJhbnNjb2RpbmdIaW50cy5jbG9uZSgpOwogICAg ICAgIGNhY2hpbmdLZXkgPSAiMSI7CiAgICAgICAgLy8gT3ZlcnJpZGVzIGNv bmZpZ3VyZWQgYmF0aWsgdHJhbnNjb2RpbmcgaGludHMgdmFsdWVzIHdpdGgg c2l0ZW1hcCBwYXJhbWV0ZXJzPwogICAgICAgIHRoaXMuX292ZXJyaWRlVHJh bnNjb2RpbmdIaW50cyA9IHBhci5nZXRQYXJhbWV0ZXJBc0Jvb2xlYW4oIm92 ZXJyaWRlLXRyYW5zY29kaW5nLWhpbnRzIiwgb3ZlcnJpZGVUcmFuc2NvZGlu Z0hpbnRzKTsKICAgICAgICBpZiAodGhpcy5fb3ZlcnJpZGVUcmFuc2NvZGlu Z0hpbnRzKSB7CiAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjYWNoaW5nS2V5 QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICBTZXQg ZW50cmllcyA9IHRyYW5zY29kaW5nSGludEtleXNJbmZvLmVudHJ5U2V0KCk7 CiAgICAgICAgICAgIC8vIExvb2tpbmcgZm9yIHNpdGVtYXAgcGFyYW1ldGVy cyB3ZSBoYXZlIHRoZSBiYXRpayBrZXlzIGluZm8KICAgICAgICAgICAgZm9y KEl0ZXJhdG9yIGk9ZW50cmllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsp IHsKICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50 cnkpIGkubmV4dCgpOwogICAgICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUg PSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgICAgIC8v IEFueSBzaXRlbWFwIHBhcmFtZXRlciA/IAogICAgICAgICAgICAgICAgU3Ry aW5nIGtleVZhbHVlID0gcGFyLmdldFBhcmFtZXRlcihrZXlOYW1lLCBudWxs KTsKICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZSAhPSBudWxsKSB7CiAg ICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdIaW50S2V5SW5mbyBrZXlJ bmZvID0gKFRyYW5zY29kaW5nSGludEtleUluZm8pIGVudHJ5LmdldFZhbHVl KCk7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhdGlrS2V5TmFtZSA9 IGtleUluZm8uZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgICAgIFN0cmlu ZyBiYXRpa0tleVR5cGUgPSBrZXlJbmZvLmdldFR5cGUoKTsKICAgICAgICAg ICAgICAgICAgICBUcmFuc2NvZGluZ0hpbnRzLktleSBiYXRpa0tleSA9IGtl eUluZm8uZ2V0VHJhbnNjb2RpbmdIaW50S2V5KCk7CiAgICAgICAgICAgICAg ICAgICAgT2JqZWN0IGJhdGlrS2V5VmFsdWUgPQogICAgICAgICAgICAgICAg ICAgICAgICBjb21wdXRlQmF0aWtLZXlWYWx1ZShiYXRpa0tleVR5cGUsIGtl eVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmF0aWtLZXlWYWx1 ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZ2dl cigpLmluZm8oIkNhbm5vdCBjb21wdXRlIHZhbHVlIGZvciBwYXJhbWV0ZXIg XCIiICsga2V5TmFtZSArICJcIiAoIiArYmF0aWtLZXlOYW1lICsgIikuIElm IGEgZGVmYXVsdCB2YWx1ZSB3YXMgc2V0LCBpdCB3aWxsIGJlIHVzZWQgaW5z dGVhZC4iKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAg ICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJs ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2Vy KCkuZGVidWcoIlNldHRpbmcgcGFyYW1ldGVyIFwiIiArIGtleU5hbWUgKyAi XCIgKCIgKyBiYXRpa0tleU5hbWUgKyAiKSB2YWx1ZSB0byAiICsgYmF0aWtL ZXlWYWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhbnNjb2RpbmdI aW50cy5wdXQoYmF0aWtLZXksIGJhdGlrS2V5VmFsdWUpOwogICAgICAgICAg ICAgICAgICAgICAgICBjYWNoaW5nS2V5QnVmZmVyLmFwcGVuZCgiOyIpOwog ICAgICAgICAgICAgICAgICAgICAgICBjYWNoaW5nS2V5QnVmZmVyLmFwcGVu ZChrZXlOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGluZ0tl eUJ1ZmZlci5hcHBlbmQoIj0iKTsKICAgICAgICAgICAgICAgICAgICAgICAg Y2FjaGluZ0tleUJ1ZmZlci5hcHBlbmQoa2V5VmFsdWUpOwogICAgICAgICAg ICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAg ICAgLy8gU2V0IHRoZSBjYWNoaW5nIGtleQogICAgICAgICAgICBTdHJpbmcg Y3VycmVudENhY2hpbmdLZXkgPSBjYWNoaW5nS2V5QnVmZmVyLnRvU3RyaW5n KCkudHJpbSgpOwogICAgICAgICAgICBpZiAoY3VycmVudENhY2hpbmdLZXku bGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICBjYWNoaW5nS2V5ID0g Y3VycmVudENhY2hpbmdLZXk7CiAgICAgICAgICAgIH0gICAgICAgICAgICAK ICAgICAgICB9CiAgICAgICAgCiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQg dGhlIGN1cnJlbnQgPGNvZGU+Q29tcG9uZW50TWFuYWdlcjwvY29kZT4gaW5z dGFuY2UgdXNlZCBieSB0aGlzCiAgICAgKiA8Y29kZT5Db21wb3NhYmxlPC9j b2RlPi4KICAgICAqLwogICAgcHVibGljIHZvaWQgY29tcG9zZShDb21wb25l bnRNYW5hZ2VyIG1hbmFnZXIpIHsKICAgIH0KCiAgICAvKioKICAgICAqIFJl Y2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRl ZCBET00gdHJlZSBnZW5lcmF0aW9uLgogICAgICovCiAgICBwdWJsaWMgdm9p ZCBub3RpZnkoRG9jdW1lbnQgZG9jKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsK ICAgICAgICB0cnkgewogICAgICAgICAgICBUcmFuc2NvZGVySW5wdXQgdHJh bnNJbnB1dCA9IG5ldyBUcmFuc2NvZGVySW5wdXQoZG9jKTsKCiAgICAgICAg ICAgIC8vIEJ1ZmZlcmluZyBpcyBkb25lIGJ5IHRoZSBwaXBlbGluZSAoU2Vl IHNob3VsZFNldENvbnRlbnRMZW5ndGgpCiAgICAgICAgICAgIFRyYW5zY29k ZXJPdXRwdXQgdHJhbnNPdXRwdXQgPSBuZXcgVHJhbnNjb2Rlck91dHB1dCh0 aGlzLm91dHB1dCk7CiAgICAgICAgICAgIC8vIFNldHRpbmcgY3VycmVudCB0 cmFuc2NvZGluZyBoaW50cyB0byB0cmFuc2NvZGVyCiAgICAgICAgICAgIHRy YW5zY29kZXIuc2V0VHJhbnNjb2RpbmdIaW50cyhjdXJyZW50VHJhbnNjb2Rp bmdIaW50cyk7CiAgICAgICAgICAgIHRyYW5zY29kZXIudHJhbnNjb2RlKHRy YW5zSW5wdXQsIHRyYW5zT3V0cHV0KTsKICAgICAgICB9IGNhdGNoIChUcmFu c2NvZGVyRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgIGlmIChleC5nZXRF eGNlcHRpb24oKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoZ2V0 TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAg ICAgIGdldExvZ2dlcigpLmRlYnVnKCJHb3QgdHJhbnNjb2RlciBleGNlcHRp b24gd3JpdGluZyBpbWFnZSwgcmV0aHJvd2luZyBuZXN0ZWQgZXhjZXB0aW9u IiwgZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhy b3cgbmV3IFNBWEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdyaXRpbmcgaW1hZ2Ui LCBleC5nZXRFeGNlcHRpb24oKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAg ICAgIGlmIChnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CiAgICAg ICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygiR290IHRyYW5zY29kZXIg ZXhjZXB0aW9uIHdyaXRpbmcgaW1hZ2UsIHJldGhyb3dpbmciLCBleCk7CiAg ICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlv bigiRXhjZXB0aW9uIHdyaXRpbmcgaW1hZ2UiLCBleCk7CiAgICAgICAgfSBj YXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgIGlmIChnZXRMb2dn ZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICBnZXRM b2dnZXIoKS5kZWJ1ZygiR290IGV4Y2VwdGlvbiB3cml0aW5nIGltYWdlLCBy ZXRocm93aW5nIiwgZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRo cm93IG5ldyBTQVhFeGNlcHRpb24oIkV4Y2VwdGlvbiB3cml0aW5nIGltYWdl IiwgZXgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVy biB0aGUgTUlNRSB0eXBlLgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGdl dE1pbWVUeXBlKCkgewogICAgICAgIHJldHVybiBtaW1ldHlwZTsKICAgIH0K CiAgICAvKioKICAgICAqIEdlbmVyYXRlIHRoZSB1bmlxdWUga2V5LgogICAg ICogVGhpcyBrZXkgbXVzdCBiZSB1bmlxdWUgaW5zaWRlIHRoZSBzcGFjZSBv ZiB0aGlzIGNvbXBvbmVudC4KICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUg aW52b2tlZCBiZWZvcmUgdGhlIGdldFZhbGlkaXR5KCkgbWV0aG9kLgogICAg ICoKICAgICAqIEByZXR1cm4gVGhlIGdlbmVyYXRlZCBrZXkgb3IgPGNvZGU+ MDwvY29kZT4gaWYgdGhlIGNvbXBvbmVudAogICAgICogICAgICAgICAgICAg IGlzIGN1cnJlbnRseSBub3QgY2FjaGVhYmxlLgogICAgICovCiAgICBwdWJs aWMgU2VyaWFsaXphYmxlIGdldEtleSgpIHsKICAgICAgICByZXR1cm4gY2Fj aGluZ0tleTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIHRoZSB2 YWxpZGl0eSBvYmplY3QuCiAgICAgKiBCZWZvcmUgdGhpcyBtZXRob2QgY2Fu IGJlIGludm9rZWQgdGhlIGdldEtleSgpIG1ldGhvZAogICAgICogbXVzdCBi ZSBpbnZva2VkLgogICAgICoKICAgICAqIEByZXR1cm4gVGhlIGdlbmVyYXRl ZCB2YWxpZGl0eSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhl CiAgICAgKiAgICAgICAgIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgbm90IGNh Y2hlYWJsZS4KICAgICAqLwogICAgcHVibGljIFNvdXJjZVZhbGlkaXR5IGdl dFZhbGlkaXR5KCkgewogICAgICAgIHJldHVybiBOT1BWYWxpZGl0eS5TSEFS RURfSU5TVEFOQ0U7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRy dWUgc28gdGhlIHBpcGVsaW5lIGltcGxlbWVudGF0aW9uIHdpbGwgYnVmZmVy IGdlbmVyYXRlZAogICAgICogb3V0cHV0IGFuZCB3cml0ZSBjb250ZW50IGxl bmd0aCB0byB0aGUgcmVzcG9uc2UuCiAgICAgKiA8cD5CYXRpaydzIFBOR1Ry YW5zY29kZXIgY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtLCB0aGVyZWZvcmUg d2UKICAgICAqIGNhbm5vdCBwYXNzIHRoZSBvdXRwdXQgc3RyZWFtIGRpcmVj dGx5IHRvIEJhdGlrIGFuZCBoYXZlIHRvCiAgICAgKiBpbnN0cnVjdCBwaXBl bGluZSB0byBidWZmZXIgaXQuIElmIHdlIGRvIG5vdCBidWZmZXIsIHdlIHdv dWxkIGdldAogICAgICogYW4gZXhjZXB0aW9uIHdoZW4ge0BsaW5rIG9yZy5h cGFjaGUuY29jb29uLkNvY29vbiNwcm9jZXNzfQogICAgICogdHJpZXMgdG8g Y2xvc2UgdGhlIHN0cmVhbS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4g c2hvdWxkU2V0Q29udGVudExlbmd0aCgpIHsKICAgICAgICByZXR1cm4gdHJ1 ZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgdHJh bnNjb2RpbmcgaGludCB2YWx1ZSBmb3IgYSBrZXkgdHlwZSBkZWNsYXJlZCBp biAKICAgICAqIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgc2VyaWFsaXpl ci4gCiAgICAgKiAKICAgICAqIEBwYXJhbSBrZXlUeXBlIFRoZSBrZXkgdHlw ZS4KICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHZhbHVlIHRvIGJl IGNvbnZlcnRlZCBpbnRvIGFuIG9iamVjdC4KICAgICAqIEByZXR1cm4gVGhl IG9iamVjdCB2YWx1ZS4gaXQgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgdmFs dWUKICAgICAqICAgICAgICAgY2Fubm90IGJlIGNvbXB1dGVkIG9yIHRoZSBr ZXkgdHlwZSBpcyB1bmtub3duLgogICAgICovCiAgICBwcml2YXRlIE9iamVj dCBjb21wdXRlQmF0aWtLZXlWYWx1ZShTdHJpbmcgdHlwZSwgU3RyaW5nIHZh bHVlKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAg ICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgiU1RSSU5H Ii5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwog ICAgICAgIH0KICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewog ICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYg KCJGTE9BVCIuZXF1YWxzKHR5cGUpKSB7CiAgICAgICAgICAgIHRyeSB7CiAg ICAgICAgICAgICAgICByZXR1cm4gRmxvYXQudmFsdWVPZih2YWx1ZSk7CiAg ICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7 CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQog ICAgICAgIH0KICAgICAgICBpZiAoIklOVEVHRVIiLmVxdWFscyh0eXBlKSkg ewoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBJ bnRlZ2VyLnZhbHVlT2YodmFsdWUpOwogICAgICAgICAgICB9IGNhdGNoIChO dW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgcmV0 dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGlm ICgiQk9PTEVBTiIuZXF1YWxzKHR5cGUpKSB7CiAgICAgICAgICAgIHJldHVy biBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwogICAgICAgIH0KICAgICAgICBp ZiAoIkNPTE9SIi5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgLy8gQ2Fu IHRocm93IGFuIGV4Y2VwdGlvbgogICAgICAgICAgICBpZiAodmFsdWUuc3Rh cnRzV2l0aCgiIyIpKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVl LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkg ewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihJbnRlZ2VyLnBh cnNlSW50KHZhbHVlLCAxNikpOwogICAgICAgICAgICB9IGNhdGNoIChOdW1i ZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgcmV0dXJu IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJu IG51bGw7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogVGhpcyBpcyBhIGNv bnZpbmllbmNlIGNsYXNzIHRvIGhvbGQgaW5mb3JtYXRpb24gb24gdGhlIGNv bmZpZ3VyZWQgCiAgICAgKiBCYXRpayBrZXlzICAKICAgICAqLwogICAgcHJp dmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVHJhbnNjb2RpbmdIaW50S2V5SW5m byB7CgogICAgICAgIC8qKiBrZXkgdHlwZSBhcyBvZiBJTlRFR0VSLCAuLi4g Ki8KICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOwoKICAgICAgICAvKiog YmF0aWsga2V5IG5hbWUgc3RhcnRpbmcgd2l0aCBLRVlfICovCiAgICAgICAg cHJpdmF0ZSBTdHJpbmcgbmFtZTsKCiAgICAgICAgLyoqIGJhdGlrIDxjb2Rl PlRyYW5zY29kaW5nSGludHMuS2V5PC9jb2RlPiAqLwogICAgICAgIHByaXZh dGUgVHJhbnNjb2RpbmdIaW50cy5LZXkga2V5OwoKICAgICAgICAvKioKICAg ICAgICAgKiBDb25zdHJ1Y3RvcgogICAgICAgICAqIAogICAgICAgICAqIEBw YXJhbSBuYW1lIFRoZSBiYXRpayBrZXkgbmFtZQogICAgICAgICAqIEBwYXJh bSB0eXBlIFRoZSBjb25maWd1cmVkIGtleSB0eXBlCiAgICAgICAgICogQHBh cmFtIGJhdGlrS2V5IFRoZSA8Y29kZT5UcmFuc2NvZGluZ0hpbnRzLktleTwv Y29kZT4gCiAgICAgICAgICovCiAgICAgICAgcHVibGljIFRyYW5zY29kaW5n SGludEtleUluZm8oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLAogICAgICAg ICAgICBTdHJpbmcgdHlwZSwKICAgICAgICAgICAgVHJhbnNjb2RpbmdIaW50 cy5LZXkgYmF0aWtLZXkpewogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1l OwogICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICB0 aGlzLmtleSA9IGJhdGlrS2V5OwogICAgICAgICAgCiAgICAgICAgfQogICAg ICAgIAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGJhdGlrIGtl eSBuYW1lCiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiBUaGUgYmF0 aWsga2V5IG5hbWUKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgU3RyaW5n IGdldE5hbWUoKSB7CiAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAg IH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgY29uZmlndXJl ZCBrZXkgdHlwZQogICAgICAgICAqIAogICAgICAgICAqIEByZXR1cm4gVGhl IGtleSB0eXBlCiAgICAgICAgICovCiAgICAgICAgcHVibGljIFN0cmluZyBn ZXRUeXBlKCkgewogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9 CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIDxjb2RlPlRyYW5z Y29kaW5nSGludHMuS2V5PC9jb2RlPgogICAgICAgICAqIAogICAgICAgICAq IEByZXR1cm4gVGhlIDxjb2RlPlRyYW5zY29kaW5nSGludHMuS2V5PC9jb2Rl PgogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBUcmFuc2NvZGluZ0hpbnRz LktleSBnZXRUcmFuc2NvZGluZ0hpbnRLZXkoKSB7CiAgICAgICAgICAgIHJl dHVybiBrZXk7CiAgICAgICAgfQoKICAgIH0KCgp9Cg== --0-270688782-1069669544=:66409--