@serenityjs/plugins 0.8.6-beta-20250630153821 → 0.8.6-beta-20250701034207

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # @serenityjs/plugins
2
2
 
3
- ## 0.8.6-beta-20250630153821
3
+ ## 0.8.6-beta-20250701034207
4
4
 
5
5
  ### Patch Changes
6
6
 
7
7
  - [`97946e1`](https://github.com/SerenityJS/serenity/commit/97946e147082d9eb9d482eae2be3b1767f9f6450) Thanks [@PMK744](https://github.com/PMK744)! - init v0.8.6-beta
8
8
 
9
9
  - Updated dependencies [[`97946e1`](https://github.com/SerenityJS/serenity/commit/97946e147082d9eb9d482eae2be3b1767f9f6450)]:
10
- - @serenityjs/core@0.8.6-beta-20250630153821
11
- - @serenityjs/emitter@0.8.6-beta-20250630153821
12
- - @serenityjs/logger@0.8.6-beta-20250630153821
13
- - @serenityjs/protocol@0.8.6-beta-20250630153821
10
+ - @serenityjs/core@0.8.6-beta-20250701034207
11
+ - @serenityjs/emitter@0.8.6-beta-20250701034207
12
+ - @serenityjs/logger@0.8.6-beta-20250701034207
13
+ - @serenityjs/protocol@0.8.6-beta-20250701034207
14
14
 
15
15
  ## 0.8.5
16
16
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use strict";var w=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var l=(o,t)=>w(o,"name",{value:t,configurable:!0});var q=(o,t)=>{for(var e in t)w(o,e,{get:t[e],enumerable:!0})},C=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of j(t))!N.call(o,i)&&i!==e&&w(o,i,{get:()=>t[i],enumerable:!(s=L(t,i))||s.enumerable});return o};var _=o=>C(w({},"__esModule",{value:!0}),o);var H={};q(H,{DefaultPipelineProperties:()=>F,Pipeline:()=>K,Plugin:()=>T,PluginType:()=>d});module.exports=_(H);var p=require("fs"),n=require("path"),x=require("zlib"),b=require("child_process"),v=require("@serenityjs/logger"),m=require("@serenityjs/core"),z=require("@serenityjs/binarystream");var P=require("@serenityjs/logger"),R=require("@serenityjs/emitter");var d=function(o){return o[o.Addon=0]="Addon",o[o.Api=1]="Api",o}(d||{});var A=class{static{l(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var O=class{static{l(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var I=class{static{l(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var E=function(o){return o[o.Low=0]="Low",o[o.Normal=1]="Normal",o[o.High=2]="High",o}(E||{});var T=class extends R.Emitter{static{l(this,"Plugin")}identifier;version;logger;type;priority=E.Normal;blocks=new A;items=new O;entities=new I;path;isBundled;pipeline;serenity;constructor(t,e,s){super(s?.maxListeners),this.identifier=t,this.version=e,this.logger=s?.logger??new P.Logger(`${t}@${e}`,P.LoggerColors.Blue),this.type=s?.type??d.Addon,s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(t){if(!this.pipeline)return null;let e=this.pipeline.plugins.get(t);return e||null}onInitialize(t){}onStartUp(t){}onShutDown(t){}};var U=require("path");var k=require("@serenityjs/core");var y=class extends k.CustomEnum{static{l(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends k.CustomEnum{static{l(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=l((o,t)=>{o.commandPalette.register("plugins","Interact with the plugins of the server",e=>{e.permissions=["serenity.operator"],e.overload({action:B},({action:s})=>{if(s.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let i=[...t.plugins.values()],r=[];for(let a of i)r.push(`\xA7u${a.identifier} v${a.version}\xA7r`);return{message:`\xA77Active Plugins (${i.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),e.overload({action:B,plugin:y},({action:s,plugin:i})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=t.plugins.get(i.result);if(!r)throw new Error(`Plugin ${i.result} is not found.`);if(s.result==="reload")return t.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${(0,U.relative)(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),D=W;var F={path:"./plugins",commands:!0,initialize:!0},K=class{static{l(this,"Pipeline")}serenity;properties;logger=new v.Logger("Plugins",v.LoggerColors.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,e){this.serenity=t,this.properties={...F,...e},t.on(m.ServerEvent.Start,this.start.bind(this)),t.on(m.ServerEvent.Stop,this.stop.bind(this)),t.on(m.WorldEvent.WorldInitialize,({world:s})=>{this.properties.commands&&D(s,this);for(let[,i]of this.plugins)s.blockPalette.registerType(...i.blocks.types).registerTrait(...i.blocks.traits),s.itemPalette.registerType(...i.items.types).registerTrait(...i.items.traits),s.entityPalette.registerType(...i.entities.types).registerTrait(...i.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,p.existsSync)((0,n.resolve)(this.path))||(0,p.mkdirSync)((0,n.resolve)(this.path),{recursive:!0});let e=(0,p.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of e)try{let a=(0,n.resolve)(this.path,r.name),u=(0,x.inflateSync)((0,p.readFileSync)(a)),c=new z.BinaryStream(u),S=c.readByte();if(S===d.Addon){let h=c.readRemainingBuffer().toString("utf-8"),g=(0,n.resolve)(this.path,r.name.slice(0,-7));(0,p.writeFileSync)(g,h);let f=require(g).default;if(this.plugins.has(f.identifier)){this.logger.warn(`Unable to load plugin \xA71${f.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}f.pipeline=this,f.serenity=this.serenity,f.path=a,f.isBundled=!0,this.plugins.set(f.identifier,f),s.push(f),y.options.push(f.identifier),this.tempPaths.add(g)}else if(S===d.Api){let h=c.readRemainingBuffer();(0,p.unlinkSync)(a);let g=(0,n.resolve)(this.path,r.name.slice(0,-7));(0,p.writeFileSync)(g,h),(0,b.execSync)(`tar -xzf ${g} -C ${this.path}`,{stdio:"ignore"}),(0,p.unlinkSync)(g);let $=r.name.slice(0,-7);(0,p.renameSync)((0,n.resolve)(this.path,"package"),(0,n.resolve)(this.path,$)),(0,b.execSync)("npm install",{cwd:(0,n.resolve)(this.path,$),stdio:"ignore"})}}catch(a){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,a)}let i=(0,p.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of i)try{let a=(0,n.resolve)(this.path,r.name);if(!(0,p.existsSync)((0,n.resolve)(a,"package.json")))continue;let u=JSON.parse((0,p.readFileSync)((0,n.resolve)(a,"package.json"),"utf-8")),c=(0,n.resolve)(a,u.main);if(!(0,p.existsSync)((0,n.resolve)(a,c))){this.logger.warn(`Unable to load plugin \xA71${u.name}\xA78@\xA71${u.version}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(a,c))}\xA7r" was not found in the directory.`);continue}let h=require((0,n.resolve)(a,c)).default;if(this.plugins.has(h.identifier)){this.logger.warn(`Unable to load plugin \xA71${h.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}h.pipeline=this,h.serenity=this.serenity,h.path=a,h.isBundled=!1,this.plugins.set(h.identifier,h),y.options.push(h.identifier),s.push(h)}catch(a){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,a)}s.sort((r,a)=>r.priority!==a.priority?a.priority-r.priority:r.identifier<a.identifier?-1:r.identifier>a.identifier?1:0);for(let r of s)r.onInitialize(r),this.bindEvents(r)}start(){for(let t of this.plugins.values())t.onStartUp(t)}stop(){for(let t of this.plugins.values())t.onShutDown(t);for(let t of this.tempPaths)(0,p.unlinkSync)(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let e=t.path;delete require.cache[require.resolve(e)],this.serenity.removePath(e);try{let i=require(e).default;if(!(i instanceof T)){this.logger.warn(`Unable to reload plugin from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r, the plugin is not an instance of the Plugin class.`);return}i.pipeline=this,i.serenity=this.serenity,i.path=e,this.plugins.set(i.identifier,i),i.onInitialize(i),this.bindEvents(i),i.onStartUp(i),this.logger.info(`Successfully reloaded plugin \xA71${i.identifier}\xA7r from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r.`)}catch(s){this.logger.error(`Failed to reload plugin from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r, skipping the plugin.`,s)}}bundle(t){let e=new z.BinaryStream;if(e.writeByte(t.type),t.type===d.Addon){let s=(0,n.resolve)(t.path,"dist"),i=(0,p.readFileSync)((0,n.resolve)(s,"index.js"));e.writeBuffer(i),(0,p.writeFileSync)((0,n.resolve)(this.path,`${t.identifier}.plugin`),(0,x.deflateSync)(e.getBuffer()))}else if(t.type===d.Api){(0,b.execSync)("npm pack",{cwd:t.path,stdio:"ignore"});let s=(0,p.readdirSync)(t.path).find(r=>r.endsWith(".tgz"));if(!s)throw new Error("Packed tarball not found.");let i=(0,p.readFileSync)((0,n.resolve)(t.path,s));(0,p.unlinkSync)((0,n.resolve)(t.path,s)),e.writeBuffer(i),(0,p.writeFileSync)((0,n.resolve)(this.path,`${t.identifier}.plugin`),(0,x.deflateSync)(e.getBuffer()))}}bindEvents(t){let e=Object.getPrototypeOf(t),s=Object.getOwnPropertyNames(e),i=Object.keys(m.WorldEvent);i=i.slice(i.length/2);for(let r of i){let a=i.indexOf(r);if(s.includes("on"+r)){let u=t["on"+r];typeof u=="function"&&this.serenity.on(a,u.bind(t))}if(s.includes("before"+r)){let u=t["before"+r];typeof u=="function"&&this.serenity.before(a,u.bind(t))}if(s.includes("after"+r)){let u=t["after"+r];typeof u=="function"&&this.serenity.after(a,u.bind(t))}}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsdWdpblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZW5hbWVTeW5jLFxuICB1bmxpbmtTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGRlZmxhdGVTeW5jLCBpbmZsYXRlU3luYyB9IGZyb20gXCJub2RlOnpsaWJcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcblxuaW50ZXJmYWNlIFBpcGVsaW5lUHJvcGVydGllcyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tbWFuZHM6IGJvb2xlYW47XG4gIGluaXRpYWxpemU6IGJvb2xlYW47XG59XG5cbmNvbnN0IERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcyA9IHtcbiAgcGF0aDogXCIuL3BsdWdpbnNcIixcbiAgY29tbWFuZHM6IHRydWUsXG4gIGluaXRpYWxpemU6IHRydWVcbn07XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlBsdWdpbnNcIiwgTG9nZ2VyQ29sb3JzLk1hdGVyaWFsTGFwaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2lucyBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnMgPSBuZXcgTWFwPHN0cmluZywgUGx1Z2luPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcG9yYXJ5IHBhdGhzIHVzZWQgYnkgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRlbXBQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nIGluIEVTTSBtb2RlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVzbTogYm9vbGVhbiA9XG4gICAgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGU/LmV4cG9ydHMgIT09IGV4cG9ydHM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgc2V0IHBhdGgoXykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXRoIHByb3BlcnR5IGlzIHJlYWQtb25seS5cIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwZWxpbmUgY2xhc3MuXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQaXBlbGluZVByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gTWVyZ2UgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHNlcmVuaXR5IHNlcnZlciBldmVudHNcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdGFydCwgdGhpcy5zdGFydC5iaW5kKHRoaXMpKTtcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdG9wLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT4ge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGZvciB0aGUgcGx1Z2luc1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5jb21tYW5kcykgQ29tbWFuZCh3b3JsZCwgdGhpcyk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCByZWdpc3RlciB0aGUgYmxvY2tzLCBpdGVtcywgYW5kIGVudGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IFssIHBsdWdpbl0gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9ja3MgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5ibG9ja3MudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmJsb2Nrcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLml0ZW1QYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uaXRlbXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLml0ZW1zLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0aWVzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmVudGl0aWVzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5lbnRpdGllcy50cmFpdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMucHJvcGVydGllcy5pbml0aWFsaXplKSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZmlsZXMgdGhhdCBoYXZlIGEgLnBsdWdpbiBleHRlbnNpb25cbiAgICBjb25zdCBidW5kbGVzID0gZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT5cbiAgICAgIGRpcmVudC5pc0ZpbGUoKSA/IGRpcmVudC5uYW1lLmVuZHNXaXRoKFwiLnBsdWdpblwiKSA6IGZhbHNlXG4gICAgKTtcblxuICAgIC8vIEFycmF5IHRvIGhvbGQgdGhlIG9yZGVyZWQgcGx1Z2luc1xuICAgIGNvbnN0IG9yZGVyZWRQbHVnaW5zOiBBcnJheTxQbHVnaW4+ID0gW107XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcInBhY2thZ2VcIiksIHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBlbnRyaWVzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZGlyZWN0b3JpZXMsIGNoZWNraW5nIGlmIHRoZXkgYXJlIHZhbGlkIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGEgcGFja2FnZS5qc29uIGZpbGUsIGlmIG5vdCwgc2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgdGhpcy5lc20gPyBtYW5pZmVzdC5tb2R1bGUgOiBtYW5pZmVzdC5tYWluKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgbWFuaWZlc3QubWFpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7bWFuaWZlc3QubmFtZX3CpzhAwqcxJHttYW5pZmVzdC52ZXJzaW9ufcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGgsIG1haW4pKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gRHluYW1pYyBkZWxldGUgaXMgcmVxdWlyZWQgaGVyZVxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcblxuaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdHlwZTogUGx1Z2luVHlwZTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1heExpc3RlbmVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqICMgSW50cm9kdWN0aW9uXG4gKiBQbHVnaW5zIGFyZSB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIFNlcmVuaXR5SlMuXG4gKiBUaGV5IGFyZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2hpY2ggYWxsb3dzIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyLlxuICpcbiAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIHBsdWdpbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYFBsdWdpblR5cGVgIGVudW06IGBBZGRvbmAgJiBgQXBpYFxuICpcbiAqIEFkZG9uIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2Fubm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICogQXBpIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbiBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqXG4gKiAjIyBDbGFzcyBFeHRlbmRpbmcgUGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5UeXBlLCBQbHVnaW5FdmVudHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcGx1Z2luc1wiO1xuICpcbiAqIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gKiAgIHB1YmxpYyByZWFkb25seSB0eXBlID0gUGx1Z2luVHlwZS5BZGRvbjtcbiAqXG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcInNhbXBsZS1wbHVnaW5cIiwgXCIxLjAuMFwiKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIG9uSW5pdGlhbGl6ZSgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TdGFydFVwKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblNodXREb3duKCk6IHZvaWQge31cbiAqIH1cbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBuZXcgU2FtcGxlUGx1Z2luKCk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGx1Z2luPFQgPSB1bmtub3duPiBleHRlbmRzIEVtaXR0ZXI8VD4gaW1wbGVtZW50cyBQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggcGx1Z2lucyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eSA9IFBsdWdpblByaW9yaXR5Lk5vcm1hbDtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gb3B0aW9ucy5vbkluaXRpYWxpemU7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBvcHRpb25zLm9uU3RhcnRVcDtcbiAgICBpZiAob3B0aW9ucz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gb3B0aW9ucy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwbHVnaW4gYnkgaXRzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGluc3RhbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgZXh0ZW5kcyBQbHVnaW4+KGlkZW50aWZpZXI6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoIXRoaXMucGlwZWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBpcGVsaW5lLnBsdWdpbnMuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBkZWZpbmVkXG4gICAgaWYgKCFwbHVnaW4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gcGx1Z2luIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luT3B0aW9ucyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVN0YWNrVHJhaXQsIEN1c3RvbUl0ZW1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luSXRlbVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUl0ZW1UeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVN0YWNrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luSXRlbVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBFbnRpdHlUcmFpdCwgQ3VzdG9tRW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkVudGl0eVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tRW50aXR5VHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkVudGl0eVJlZ2lzdHJ5IH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcblxuICAvKipcbiAgICogQSBsb3cgcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgcmVhY3RpbmcgdG8gY2hhbmdlcyBvciBmaW5hbCBhZGp1c3RtZW50cy5cbiAgICovXG4gIExvdyxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGEgcGx1Z2luLlxuICAgKiBTdWl0YWJsZSBmb3Igc3RhbmRhcmQgcGx1Z2luIGJlaGF2aW9yLlxuICAgKi9cbiAgTm9ybWFsLFxuXG4gIC8qKlxuICAgKiBBIGhpZ2ggcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIGVhcmx5IHNldHVwIG9yIG92ZXJyaWRpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBIaWdoXG59XG5cblxuZXhwb3J0IHsgUGx1Z2luUHJpb3JpdHkgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iXSwKICAibWFwcGluZ3MiOiAiNGRBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLCtCQUFBRSxFQUFBLGFBQUFDLEVBQUEsV0FBQUMsRUFBQSxlQUFBQyxJQUFBLGVBQUFDLEVBQUFOLEdDQ0EsSUFBQU8sRUFRTyxjQUNQQyxFQUFrQyxnQkFDbENDLEVBQXlDLGdCQUN6Q0MsRUFBeUIseUJBRXpCQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZjdCLElBQUFDLEVBQXFDLDhCQUNyQ0MsRUFBd0IsK0JDQ3hCLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEs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LENBRWhDLENBQ0YsQ0FFVWYsV0FBVzNFLEVBQXNCLENBRXpDLElBQU04RixFQUFZQyxPQUFPQyxlQUFlaEcsQ0FBQUEsRUFHbENpRyxFQUFhRixPQUFPRyxvQkFBb0JKLENBQUFBLEVBRzFDSyxFQUFZSixPQUFPSyxLQUFLeEcsWUFBQUEsRUFDNUJ1RyxFQUFZQSxFQUFVN0QsTUFBTTZELEVBQVVFLE9BQVMsQ0FBQSxFQUcvQyxRQUFXQyxLQUFZSCxFQUFXLENBRWhDLElBQU1qRSxFQUFRaUUsRUFBVUksUUFBUUQsQ0FBQUEsRUFHaEMsR0FBSUwsRUFBV08sU0FBUyxLQUFPRixDQUFBQSxFQUFXLENBRXhDLElBQU1HLEVBQVF6RyxFQUFRLEtBQU9zRyxDQUFBQSxFQUd6QixPQUFPRyxHQUFVLFlBRW5CLEtBQUtuSSxTQUFTZSxHQUFHNkMsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUN2QyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFNBQVdGLENBQUFBLEVBQVcsQ0FFNUMsSUFBTUcsRUFBUXpHLEVBQVEsU0FBV3NHLENBQUFBLEVBRzdCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNvSSxPQUFPeEUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMzQyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFFBQVVGLENBQUFBLEVBQVcsQ0FFM0MsSUFBTUcsRUFBUXpHLEVBQVEsUUFBVXNHLENBQUFBLEVBRzVCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNxSSxNQUFNekUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMxQyxDQUNGLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbm9kZV9jaGlsZF9wcm9jZXNzIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgInByaW9yaXR5IiwgIlBsdWdpblByaW9yaXR5IiwgIk5vcm1hbCIsICJibG9ja3MiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJpdGVtcyIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAiZW50aXRpZXMiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlc29sdmUiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiZ2V0IiwgIl9wbHVnaW4iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJwdXNoIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsdWdpblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZW5hbWVTeW5jLFxuICB1bmxpbmtTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGRlZmxhdGVTeW5jLCBpbmZsYXRlU3luYyB9IGZyb20gXCJub2RlOnpsaWJcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcblxuaW50ZXJmYWNlIFBpcGVsaW5lUHJvcGVydGllcyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tbWFuZHM6IGJvb2xlYW47XG4gIGluaXRpYWxpemU6IGJvb2xlYW47XG59XG5cbmNvbnN0IERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcyA9IHtcbiAgcGF0aDogXCIuL3BsdWdpbnNcIixcbiAgY29tbWFuZHM6IHRydWUsXG4gIGluaXRpYWxpemU6IHRydWVcbn07XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlBsdWdpbnNcIiwgTG9nZ2VyQ29sb3JzLk1hdGVyaWFsTGFwaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2lucyBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnMgPSBuZXcgTWFwPHN0cmluZywgUGx1Z2luPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcG9yYXJ5IHBhdGhzIHVzZWQgYnkgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRlbXBQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nIGluIEVTTSBtb2RlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVzbTogYm9vbGVhbiA9XG4gICAgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGU/LmV4cG9ydHMgIT09IGV4cG9ydHM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgc2V0IHBhdGgoXykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXRoIHByb3BlcnR5IGlzIHJlYWQtb25seS5cIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwZWxpbmUgY2xhc3MuXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQaXBlbGluZVByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gTWVyZ2UgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHNlcmVuaXR5IHNlcnZlciBldmVudHNcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdGFydCwgdGhpcy5zdGFydC5iaW5kKHRoaXMpKTtcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdG9wLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT4ge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGZvciB0aGUgcGx1Z2luc1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5jb21tYW5kcykgQ29tbWFuZCh3b3JsZCwgdGhpcyk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCByZWdpc3RlciB0aGUgYmxvY2tzLCBpdGVtcywgYW5kIGVudGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IFssIHBsdWdpbl0gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9ja3MgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5ibG9ja3MudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmJsb2Nrcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLml0ZW1QYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uaXRlbXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLml0ZW1zLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0aWVzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmVudGl0aWVzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5lbnRpdGllcy50cmFpdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMucHJvcGVydGllcy5pbml0aWFsaXplKSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZmlsZXMgdGhhdCBoYXZlIGEgLnBsdWdpbiBleHRlbnNpb25cbiAgICBjb25zdCBidW5kbGVzID0gZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT5cbiAgICAgIGRpcmVudC5pc0ZpbGUoKSA/IGRpcmVudC5uYW1lLmVuZHNXaXRoKFwiLnBsdWdpblwiKSA6IGZhbHNlXG4gICAgKTtcblxuICAgIC8vIEFycmF5IHRvIGhvbGQgdGhlIG9yZGVyZWQgcGx1Z2luc1xuICAgIGNvbnN0IG9yZGVyZWRQbHVnaW5zOiBBcnJheTxQbHVnaW4+ID0gW107XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcInBhY2thZ2VcIiksIHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBlbnRyaWVzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZGlyZWN0b3JpZXMsIGNoZWNraW5nIGlmIHRoZXkgYXJlIHZhbGlkIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGEgcGFja2FnZS5qc29uIGZpbGUsIGlmIG5vdCwgc2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgdGhpcy5lc20gPyBtYW5pZmVzdC5tb2R1bGUgOiBtYW5pZmVzdC5tYWluKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgbWFuaWZlc3QubWFpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7bWFuaWZlc3QubmFtZX3CpzhAwqcxJHttYW5pZmVzdC52ZXJzaW9ufcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGgsIG1haW4pKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcblxuaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdHlwZTogUGx1Z2luVHlwZTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1heExpc3RlbmVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqICMgSW50cm9kdWN0aW9uXG4gKiBQbHVnaW5zIGFyZSB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIFNlcmVuaXR5SlMuXG4gKiBUaGV5IGFyZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2hpY2ggYWxsb3dzIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyLlxuICpcbiAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIHBsdWdpbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYFBsdWdpblR5cGVgIGVudW06IGBBZGRvbmAgJiBgQXBpYFxuICpcbiAqIEFkZG9uIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2Fubm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICogQXBpIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbiBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqXG4gKiAjIyBDbGFzcyBFeHRlbmRpbmcgUGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5UeXBlLCBQbHVnaW5FdmVudHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcGx1Z2luc1wiO1xuICpcbiAqIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gKiAgIHB1YmxpYyByZWFkb25seSB0eXBlID0gUGx1Z2luVHlwZS5BZGRvbjtcbiAqXG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcInNhbXBsZS1wbHVnaW5cIiwgXCIxLjAuMFwiKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIG9uSW5pdGlhbGl6ZSgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TdGFydFVwKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblNodXREb3duKCk6IHZvaWQge31cbiAqIH1cbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBuZXcgU2FtcGxlUGx1Z2luKCk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGx1Z2luPFQgPSB1bmtub3duPiBleHRlbmRzIEVtaXR0ZXI8VD4gaW1wbGVtZW50cyBQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggcGx1Z2lucyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eSA9IFBsdWdpblByaW9yaXR5Lk5vcm1hbDtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gb3B0aW9ucy5vbkluaXRpYWxpemU7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBvcHRpb25zLm9uU3RhcnRVcDtcbiAgICBpZiAob3B0aW9ucz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gb3B0aW9ucy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwbHVnaW4gYnkgaXRzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGluc3RhbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgZXh0ZW5kcyBQbHVnaW4+KGlkZW50aWZpZXI6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoIXRoaXMucGlwZWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBpcGVsaW5lLnBsdWdpbnMuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBkZWZpbmVkXG4gICAgaWYgKCFwbHVnaW4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gcGx1Z2luIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luT3B0aW9ucyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVN0YWNrVHJhaXQsIEN1c3RvbUl0ZW1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luSXRlbVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUl0ZW1UeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVN0YWNrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luSXRlbVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBFbnRpdHlUcmFpdCwgQ3VzdG9tRW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkVudGl0eVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tRW50aXR5VHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkVudGl0eVJlZ2lzdHJ5IH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcblxuICAvKipcbiAgICogQSBsb3cgcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgcmVhY3RpbmcgdG8gY2hhbmdlcyBvciBmaW5hbCBhZGp1c3RtZW50cy5cbiAgICovXG4gIExvdyxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGEgcGx1Z2luLlxuICAgKiBTdWl0YWJsZSBmb3Igc3RhbmRhcmQgcGx1Z2luIGJlaGF2aW9yLlxuICAgKi9cbiAgTm9ybWFsLFxuXG4gIC8qKlxuICAgKiBBIGhpZ2ggcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIGVhcmx5IHNldHVwIG9yIG92ZXJyaWRpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBIaWdoXG59XG5cblxuZXhwb3J0IHsgUGx1Z2luUHJpb3JpdHkgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iXSwKICAibWFwcGluZ3MiOiAiNGRBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLCtCQUFBRSxFQUFBLGFBQUFDLEVBQUEsV0FBQUMsRUFBQSxlQUFBQyxJQUFBLGVBQUFDLEVBQUFOLEdDQ0EsSUFBQU8sRUFRTyxjQUNQQyxFQUFrQyxnQkFDbENDLEVBQXlDLGdCQUN6Q0MsRUFBeUIseUJBRXpCQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZjdCLElBQUFDLEVBQXFDLDhCQUNyQ0MsRUFBd0IsK0JDQ3hCLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEsS0FBS04sTUFBTU8sUUFBUUYsQ0FBQUEsRUFHakMsT0FBSUMsSUFBVSxJQUFJLEtBQUtOLE1BQU1RLE9BQU9GLEVBQU8sQ0FBQSxFQUdwQyxJQUNULENBUU9HLGlCQUFpQlIsRUFBd0Ms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RzFDSyxFQUFZSixPQUFPSyxLQUFLeEcsWUFBQUEsRUFDNUJ1RyxFQUFZQSxFQUFVN0QsTUFBTTZELEVBQVVFLE9BQVMsQ0FBQSxFQUcvQyxRQUFXQyxLQUFZSCxFQUFXLENBRWhDLElBQU1qRSxFQUFRaUUsRUFBVUksUUFBUUQsQ0FBQUEsRUFHaEMsR0FBSUwsRUFBV08sU0FBUyxLQUFPRixDQUFBQSxFQUFXLENBRXhDLElBQU1HLEVBQVF6RyxFQUFRLEtBQU9zRyxDQUFBQSxFQUd6QixPQUFPRyxHQUFVLFlBRW5CLEtBQUtuSSxTQUFTZSxHQUFHNkMsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUN2QyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFNBQVdGLENBQUFBLEVBQVcsQ0FFNUMsSUFBTUcsRUFBUXpHLEVBQVEsU0FBV3NHLENBQUFBLEVBRzdCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNvSSxPQUFPeEUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMzQyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFFBQVVGLENBQUFBLEVBQVcsQ0FFM0MsSUFBTUcsRUFBUXpHLEVBQVEsUUFBVXNHLENBQUFBLEVBRzVCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNxSSxNQUFNekUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMxQyxDQUNGLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbm9kZV9jaGlsZF9wcm9jZXNzIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luUHJpb3JpdHkiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgInByaW9yaXR5IiwgIlBsdWdpblByaW9yaXR5IiwgIk5vcm1hbCIsICJibG9ja3MiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJpdGVtcyIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAiZW50aXRpZXMiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlc29sdmUiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiZ2V0IiwgIl9wbHVnaW4iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJwdXNoIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  var j=Object.defineProperty;var p=(n,t)=>j(n,"name",{value:t,configurable:!0}),g=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});import{existsSync as E,mkdirSync as K,readdirSync as T,readFileSync as x,renameSync as H,unlinkSync as w,writeFileSync as P}from"node:fs";import{relative as m,resolve as a}from"node:path";import{deflateSync as U,inflateSync as M}from"node:zlib";import{execSync as k}from"node:child_process";import{Logger as J,LoggerColors as G}from"@serenityjs/logger";import{ServerEvent as D,WorldEvent as F}from"@serenityjs/core";import{BinaryStream as L}from"@serenityjs/binarystream";import{Logger as N,LoggerColors as q}from"@serenityjs/logger";import{Emitter as C}from"@serenityjs/emitter";var f=function(n){return n[n.Addon=0]="Addon",n[n.Api=1]="Api",n}(f||{});var B=class{static{p(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var z=class{static{p(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var A=class{static{p(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let e=this.types.indexOf(t);return e!==-1&&this.types.splice(e,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let e=this.traits.indexOf(t);return e!==-1&&this.traits.splice(e,1),this}};var S=function(n){return n[n.Low=0]="Low",n[n.Normal=1]="Normal",n[n.High=2]="High",n}(S||{});var O=class extends C{static{p(this,"Plugin")}identifier;version;logger;type;priority=S.Normal;blocks=new B;items=new z;entities=new A;path;isBundled;pipeline;serenity;constructor(t,e,r){super(r?.maxListeners),this.identifier=t,this.version=e,this.logger=r?.logger??new N(`${t}@${e}`,q.Blue),this.type=r?.type??f.Addon,r?.onInitialize&&(this.onInitialize=r.onInitialize),r?.onStartUp&&(this.onStartUp=r.onStartUp),r?.onShutDown&&(this.onShutDown=r.onShutDown)}resolve(t){if(!this.pipeline)return null;let e=this.pipeline.plugins.get(t);return e||null}onInitialize(t){}onStartUp(t){}onShutDown(t){}};import{relative as _}from"path";import{CustomEnum as I}from"@serenityjs/core";var y=class extends I{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},$=class extends I{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=p((n,t)=>{n.commandPalette.register("plugins","Interact with the plugins of the server",e=>{e.permissions=["serenity.operator"],e.overload({action:$},({action:r})=>{if(r.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let s=[...t.plugins.values()],i=[];for(let o of s)i.push(`\xA7u${o.identifier} v${o.version}\xA7r`);return{message:`\xA77Active Plugins (${s.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),e.overload({action:$,plugin:y},({action:r,plugin:s})=>{if(r.result!=="reload"&&r.result!=="bundle")return;let i=t.plugins.get(s.result);if(!i)throw new Error(`Plugin ${s.result} is not found.`);if(r.result==="reload")return t.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${_(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),R=W;var Q={path:"./plugins",commands:!0,initialize:!0},Kt=class{static{p(this,"Pipeline")}serenity;properties;logger=new J("Plugins",G.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,e){this.serenity=t,this.properties={...Q,...e},t.on(D.Start,this.start.bind(this)),t.on(D.Stop,this.stop.bind(this)),t.on(F.WorldInitialize,({world:r})=>{this.properties.commands&&R(r,this);for(let[,s]of this.plugins)r.blockPalette.registerType(...s.blocks.types).registerTrait(...s.blocks.traits),r.itemPalette.registerType(...s.items.types).registerTrait(...s.items.traits),r.entityPalette.registerType(...s.entities.types).registerTrait(...s.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){E(a(this.path))||K(a(this.path),{recursive:!0});let e=T(a(this.path),{withFileTypes:!0}).filter(i=>i.isFile()?i.name.endsWith(".plugin"):!1),r=[];for(let i of e)try{let o=a(this.path,i.name),l=M(x(o)),d=new L(l),b=d.readByte();if(b===f.Addon){let u=d.readRemainingBuffer().toString("utf-8"),c=a(this.path,i.name.slice(0,-7));P(c,u);let h=g(c).default;if(this.plugins.has(h.identifier)){this.logger.warn(`Unable to load plugin \xA71${h.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}h.pipeline=this,h.serenity=this.serenity,h.path=o,h.isBundled=!0,this.plugins.set(h.identifier,h),r.push(h),y.options.push(h.identifier),this.tempPaths.add(c)}else if(b===f.Api){let u=d.readRemainingBuffer();w(o);let c=a(this.path,i.name.slice(0,-7));P(c,u),k(`tar -xzf ${c} -C ${this.path}`,{stdio:"ignore"}),w(c);let v=i.name.slice(0,-7);H(a(this.path,"package"),a(this.path,v)),k("npm install",{cwd:a(this.path,v),stdio:"ignore"})}}catch(o){this.logger.error(`Failed to load plugin from "${m(process.cwd(),a(this.path,i.name))}", skipping the plugin.`,o)}let s=T(a(this.path),{withFileTypes:!0}).filter(i=>i.isDirectory());for(let i of s)try{let o=a(this.path,i.name);if(!E(a(o,"package.json")))continue;let l=JSON.parse(x(a(o,"package.json"),"utf-8")),d=a(o,l.main);if(!E(a(o,d))){this.logger.warn(`Unable to load plugin \xA71${l.name}\xA78@\xA71${l.version}\xA7r, the main entry path "\xA78${m(process.cwd(),a(o,d))}\xA7r" was not found in the directory.`);continue}let u=g(a(o,d)).default;if(this.plugins.has(u.identifier)){this.logger.warn(`Unable to load plugin \xA71${u.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}u.pipeline=this,u.serenity=this.serenity,u.path=o,u.isBundled=!1,this.plugins.set(u.identifier,u),y.options.push(u.identifier),r.push(u)}catch(o){this.logger.error(`Failed to load plugin from "${m(process.cwd(),a(this.path,i.name))}", skipping the plugin.`,o)}r.sort((i,o)=>i.priority!==o.priority?o.priority-i.priority:i.identifier<o.identifier?-1:i.identifier>o.identifier?1:0);for(let i of r)i.onInitialize(i),this.bindEvents(i)}start(){for(let t of this.plugins.values())t.onStartUp(t)}stop(){for(let t of this.plugins.values())t.onShutDown(t);for(let t of this.tempPaths)w(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let e=t.path;delete g.cache[g.resolve(e)],this.serenity.removePath(e);try{let s=g(e).default;if(!(s instanceof O)){this.logger.warn(`Unable to reload plugin from \xA78${m(process.cwd(),e)}\xA7r, the plugin is not an instance of the Plugin class.`);return}s.pipeline=this,s.serenity=this.serenity,s.path=e,this.plugins.set(s.identifier,s),s.onInitialize(s),this.bindEvents(s),s.onStartUp(s),this.logger.info(`Successfully reloaded plugin \xA71${s.identifier}\xA7r from \xA78${m(process.cwd(),e)}\xA7r.`)}catch(r){this.logger.error(`Failed to reload plugin from \xA78${m(process.cwd(),e)}\xA7r, skipping the plugin.`,r)}}bundle(t){let e=new L;if(e.writeByte(t.type),t.type===f.Addon){let r=a(t.path,"dist"),s=x(a(r,"index.js"));e.writeBuffer(s),P(a(this.path,`${t.identifier}.plugin`),U(e.getBuffer()))}else if(t.type===f.Api){k("npm pack",{cwd:t.path,stdio:"ignore"});let r=T(t.path).find(i=>i.endsWith(".tgz"));if(!r)throw new Error("Packed tarball not found.");let s=x(a(t.path,r));w(a(t.path,r)),e.writeBuffer(s),P(a(this.path,`${t.identifier}.plugin`),U(e.getBuffer()))}}bindEvents(t){let e=Object.getPrototypeOf(t),r=Object.getOwnPropertyNames(e),s=Object.keys(F);s=s.slice(s.length/2);for(let i of s){let o=s.indexOf(i);if(r.includes("on"+i)){let l=t["on"+i];typeof l=="function"&&this.serenity.on(o,l.bind(t))}if(r.includes("before"+i)){let l=t["before"+i];typeof l=="function"&&this.serenity.before(o,l.bind(t))}if(r.includes("after"+i)){let l=t["after"+i];typeof l=="function"&&this.serenity.after(o,l.bind(t))}}}};export{Q as DefaultPipelineProperties,Kt as Pipeline,O as Plugin,f as PluginType};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wb3JhcnkgcGF0aHMgdXNlZCBieSB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVtcFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgY29tbWFuZHMgZm9yIHRoZSBwbHVnaW5zXG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgIGZvciAoY29uc3QgWywgcGx1Z2luXSBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmJsb2Nrcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZW50aXRpZXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmVudGl0aWVzLnRyYWl0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gdHlwZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gdHlwZSBpcyB2YWxpZFxuICAgICAgICBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgb3IgbWFpbiBlbnRyeSBwb2ludHMgdG8gdGVtcG9yYXJ5IGZpbGVzXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIHBsdWdpbnMgYnkgdGhlaXIgcHJpb3JpdHlcbiAgICBvcmRlcmVkUGx1Z2lucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IGZpcnN0XG4gICAgICBpZiAoYS5wcmlvcml0eSAhPT0gYi5wcmlvcml0eSkge1xuICAgICAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7IC8vIEhpZ2hlciBwcmlvcml0eSBjb21lcyBmaXJzdFxuICAgICAgfVxuXG4gICAgICAvLyBJZiBwcmlvcml0eSBpcyB0aGUgc2FtZSwgc29ydCBieSBpZGVudGlmaWVyIGFscGhhYmV0aWNhbGx5XG4gICAgICBpZiAoYS5pZGVudGlmaWVyIDwgYi5pZGVudGlmaWVyKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYS5pZGVudGlmaWVyID4gYi5pZGVudGlmaWVyKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIGluaXRpYWxpemUgdGhlbVxuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIG9yZGVyZWRQbHVnaW5zKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBQbHVnaW5FdmVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGx1Z2luQmxvY2tSZWdpc3RyeSxcbiAgUGx1Z2luRW50aXR5UmVnaXN0cnksXG4gIFBsdWdpbkl0ZW1SZWdpc3RyeVxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgUGx1Z2luUHJpb3JpdHkgfSBmcm9tIFwiLi9lbnVtcy9wcmlvcml0eVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWF4TGlzdGVuZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW48VCA9IHVua25vd24+IGV4dGVuZHMgRW1pdHRlcjxUPiBpbXBsZW1lbnRzIFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFBsdWdpbk9wdGlvbnM+XG4gICkge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZCB3aXRoIHRoZSBtYXggbGlzdGVuZXJzXG4gICAgc3VwZXIob3B0aW9ucz8ubWF4TGlzdGVuZXJzKTtcblxuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBvcHRpb25zPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gb3B0aW9ucz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBvcHRpb25zLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAob3B0aW9ucz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IG9wdGlvbnMub25TdGFydFVwO1xuICAgIGlmIChvcHRpb25zPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBvcHRpb25zLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHBsdWdpbiBieSBpdHMgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCBleHRlbmRzIFBsdWdpbj4oaWRlbnRpZmllcjogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBpcyBkZWZpbmVkLlxuICAgIGlmICghdGhpcy5waXBlbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGlwZWxpbmUucGx1Z2lucy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGRlZmluZWRcbiAgICBpZiAoIXBsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgIHJldHVybiBwbHVnaW4gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiIsICIvKipcbiAqIFRoZSBwcmlvcml0eSBvZiBhIHBsdWdpbiBkZXRlcm1pbmVzIHdoZW4gaXQgd2lsbCBiZSBsb2FkZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGx1Z2lucy5cbiAqIEEgcGx1Z2luIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgd2lsbCBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHdpdGggYSBsb3dlciBwcmlvcml0eS5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIG9yIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaWJyYXJ5IHBsdWdpbiBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHRoYXQgdXNlcyBpdCxcbiAqIG9yIGEgcGx1Z2luIHRoYXQgbW9kaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHNlcmVuaXR5J3MgQVBJcyBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYWZ0ZXIgaXQuXG4gKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyBOb3JtYWwuXG4gKi9cbmVudW0gUGx1Z2luUHJpb3JpdHkge1xuXG4gIC8qKlxuICAgKiBBIGxvdyBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciByZWFjdGluZyB0byBjaGFuZ2VzIG9yIGZpbmFsIGFkanVzdG1lbnRzLlxuICAgKi9cbiAgTG93LFxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgYSBwbHVnaW4uXG4gICAqIFN1aXRhYmxlIGZvciBzdGFuZGFyZCBwbHVnaW4gYmVoYXZpb3IuXG4gICAqL1xuICBOb3JtYWwsXG5cbiAgLyoqXG4gICAqIEEgaGlnaCBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYmVmb3JlIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgZWFybHkgc2V0dXAgb3Igb3ZlcnJpZGluZyBiZWhhdmlvci5cbiAgICovXG4gIEhpZ2hcbn1cblxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBQ3pDLE9BQVNDLFlBQUFBLE1BQWdCLHFCQUV6QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQW1CQyxlQUFBQSxFQUFhQyxjQUFBQSxNQUFrQixtQkFDbEQsT0FBU0MsZ0JBQUFBLE1BQW9CLDJCQ2Y3QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQVNDLFdBQUFBLE1BQWUsc0JDQ3hCLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEsS0FBS04s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Q0FFVWYsV0FBVzNFLEVBQXNCLENBRXpDLElBQU04RixFQUFZQyxPQUFPQyxlQUFlaEcsQ0FBQUEsRUFHbENpRyxFQUFhRixPQUFPRyxvQkFBb0JKLENBQUFBLEVBRzFDSyxFQUFZSixPQUFPSyxLQUFLeEcsQ0FBQUEsRUFDNUJ1RyxFQUFZQSxFQUFVN0QsTUFBTTZELEVBQVVFLE9BQVMsQ0FBQSxFQUcvQyxRQUFXQyxLQUFZSCxFQUFXLENBRWhDLElBQU1qRSxFQUFRaUUsRUFBVUksUUFBUUQsQ0FBQUEsRUFHaEMsR0FBSUwsRUFBV08sU0FBUyxLQUFPRixDQUFBQSxFQUFXLENBRXhDLElBQU1HLEVBQVF6RyxFQUFRLEtBQU9zRyxDQUFBQSxFQUd6QixPQUFPRyxHQUFVLFlBRW5CLEtBQUtuSSxTQUFTZSxHQUFHNkMsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUN2QyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFNBQVdGLENBQUFBLEVBQVcsQ0FFNUMsSUFBTUcsRUFBUXpHLEVBQVEsU0FBV3NHLENBQUFBLEVBRzdCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNvSSxPQUFPeEUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMzQyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFFBQVVGLENBQUFBLEVBQVcsQ0FFM0MsSUFBTUcsRUFBUXpHLEVBQVEsUUFBVXNHLENBQUFBLEVBRzVCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNxSSxNQUFNekUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMxQyxDQUNGLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAicmVuYW1lU3luYyIsICJ1bmxpbmtTeW5jIiwgIndyaXRlRmlsZVN5bmMiLCAicmVsYXRpdmUiLCAicmVzb2x2ZSIsICJkZWZsYXRlU3luYyIsICJpbmZsYXRlU3luYyIsICJleGVjU3luYyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlNlcnZlckV2ZW50IiwgIldvcmxkRXZlbnQiLCAiQmluYXJ5U3RyZWFtIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiRW1pdHRlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkN1c3RvbUVudW0iLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJwdXNoIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wb3JhcnkgcGF0aHMgdXNlZCBieSB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVtcFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgY29tbWFuZHMgZm9yIHRoZSBwbHVnaW5zXG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgIGZvciAoY29uc3QgWywgcGx1Z2luXSBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmJsb2Nrcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZW50aXRpZXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmVudGl0aWVzLnRyYWl0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gdHlwZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gdHlwZSBpcyB2YWxpZFxuICAgICAgICBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgb3IgbWFpbiBlbnRyeSBwb2ludHMgdG8gdGVtcG9yYXJ5IGZpbGVzXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgdGhlIHBsdWdpbnMgYnkgdGhlaXIgcHJpb3JpdHlcbiAgICBvcmRlcmVkUGx1Z2lucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IGZpcnN0XG4gICAgICBpZiAoYS5wcmlvcml0eSAhPT0gYi5wcmlvcml0eSkge1xuICAgICAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7IC8vIEhpZ2hlciBwcmlvcml0eSBjb21lcyBmaXJzdFxuICAgICAgfVxuXG4gICAgICAvLyBJZiBwcmlvcml0eSBpcyB0aGUgc2FtZSwgc29ydCBieSBpZGVudGlmaWVyIGFscGhhYmV0aWNhbGx5XG4gICAgICBpZiAoYS5pZGVudGlmaWVyIDwgYi5pZGVudGlmaWVyKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYS5pZGVudGlmaWVyID4gYi5pZGVudGlmaWVyKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIGluaXRpYWxpemUgdGhlbVxuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIG9yZGVyZWRQbHVnaW5zKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBQbHVnaW5FdmVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGx1Z2luQmxvY2tSZWdpc3RyeSxcbiAgUGx1Z2luRW50aXR5UmVnaXN0cnksXG4gIFBsdWdpbkl0ZW1SZWdpc3RyeVxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgUGx1Z2luUHJpb3JpdHkgfSBmcm9tIFwiLi9lbnVtcy9wcmlvcml0eVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWF4TGlzdGVuZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW48VCA9IHVua25vd24+IGV4dGVuZHMgRW1pdHRlcjxUPiBpbXBsZW1lbnRzIFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFBsdWdpbk9wdGlvbnM+XG4gICkge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZCB3aXRoIHRoZSBtYXggbGlzdGVuZXJzXG4gICAgc3VwZXIob3B0aW9ucz8ubWF4TGlzdGVuZXJzKTtcblxuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBvcHRpb25zPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gb3B0aW9ucz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBvcHRpb25zLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAob3B0aW9ucz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IG9wdGlvbnMub25TdGFydFVwO1xuICAgIGlmIChvcHRpb25zPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBvcHRpb25zLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHBsdWdpbiBieSBpdHMgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCBleHRlbmRzIFBsdWdpbj4oaWRlbnRpZmllcjogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBpcyBkZWZpbmVkLlxuICAgIGlmICghdGhpcy5waXBlbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGlwZWxpbmUucGx1Z2lucy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGRlZmluZWRcbiAgICBpZiAoIXBsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgIHJldHVybiBwbHVnaW4gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiIsICIvKipcbiAqIFRoZSBwcmlvcml0eSBvZiBhIHBsdWdpbiBkZXRlcm1pbmVzIHdoZW4gaXQgd2lsbCBiZSBsb2FkZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGx1Z2lucy5cbiAqIEEgcGx1Z2luIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgd2lsbCBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHdpdGggYSBsb3dlciBwcmlvcml0eS5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIG9yIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaWJyYXJ5IHBsdWdpbiBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHRoYXQgdXNlcyBpdCxcbiAqIG9yIGEgcGx1Z2luIHRoYXQgbW9kaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHNlcmVuaXR5J3MgQVBJcyBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYWZ0ZXIgaXQuXG4gKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyBOb3JtYWwuXG4gKi9cbmVudW0gUGx1Z2luUHJpb3JpdHkge1xuXG4gIC8qKlxuICAgKiBBIGxvdyBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciByZWFjdGluZyB0byBjaGFuZ2VzIG9yIGZpbmFsIGFkanVzdG1lbnRzLlxuICAgKi9cbiAgTG93LFxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgYSBwbHVnaW4uXG4gICAqIFN1aXRhYmxlIGZvciBzdGFuZGFyZCBwbHVnaW4gYmVoYXZpb3IuXG4gICAqL1xuICBOb3JtYWwsXG5cbiAgLyoqXG4gICAqIEEgaGlnaCBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYmVmb3JlIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgZWFybHkgc2V0dXAgb3Igb3ZlcnJpZGluZyBiZWhhdmlvci5cbiAgICovXG4gIEhpZ2hcbn1cblxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBQ3pDLE9BQVNDLFlBQUFBLE1BQWdCLHFCQUV6QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQW1CQyxlQUFBQSxFQUFhQyxjQUFBQSxNQUFrQixtQkFDbEQsT0FBU0MsZ0JBQUFBLE1BQW9CLDJCQ2Y3QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQVNDLFdBQUFBLE1BQWUsc0JDQ3hCLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEsS0FBS04sTUFBTU8sUUFBUUYsQ0FBQUEsRUFHakMsT0FBSUMsSUFBVSxJQUFJLEtBQUtOLE1BQU1RLE9BQU9GLEVBQU8sQ0FBQSxFQUdwQyxJQUNULENBUU9HLGlCQUFpQlIsRUFBd0MsQ0FFOUQs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QUFPSyxLQUFLeEcsQ0FBQUEsRUFDNUJ1RyxFQUFZQSxFQUFVN0QsTUFBTTZELEVBQVVFLE9BQVMsQ0FBQSxFQUcvQyxRQUFXQyxLQUFZSCxFQUFXLENBRWhDLElBQU1qRSxFQUFRaUUsRUFBVUksUUFBUUQsQ0FBQUEsRUFHaEMsR0FBSUwsRUFBV08sU0FBUyxLQUFPRixDQUFBQSxFQUFXLENBRXhDLElBQU1HLEVBQVF6RyxFQUFRLEtBQU9zRyxDQUFBQSxFQUd6QixPQUFPRyxHQUFVLFlBRW5CLEtBQUtuSSxTQUFTZSxHQUFHNkMsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUN2QyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFNBQVdGLENBQUFBLEVBQVcsQ0FFNUMsSUFBTUcsRUFBUXpHLEVBQVEsU0FBV3NHLENBQUFBLEVBRzdCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNvSSxPQUFPeEUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMzQyxDQUdBLEdBQUlpRyxFQUFXTyxTQUFTLFFBQVVGLENBQUFBLEVBQVcsQ0FFM0MsSUFBTUcsRUFBUXpHLEVBQVEsUUFBVXNHLENBQUFBLEVBRzVCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS25JLFNBQVNxSSxNQUFNekUsRUFBT3VFLEVBQU1oSCxLQUFLTyxDQUFBQSxDQUFBQSxDQUMxQyxDQUNGLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAicmVuYW1lU3luYyIsICJ1bmxpbmtTeW5jIiwgIndyaXRlRmlsZVN5bmMiLCAicmVsYXRpdmUiLCAicmVzb2x2ZSIsICJkZWZsYXRlU3luYyIsICJpbmZsYXRlU3luYyIsICJleGVjU3luYyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlNlcnZlckV2ZW50IiwgIldvcmxkRXZlbnQiLCAiQmluYXJ5U3RyZWFtIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiRW1pdHRlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkN1c3RvbUVudW0iLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJwdXNoIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@serenityjs/plugins",
3
3
  "author": "Serenity",
4
4
  "license": "MIT",
5
- "version": "0.8.6-beta-20250630153821",
5
+ "version": "0.8.6-beta-20250701034207",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "typecheck": "tsc --noEmit"
21
21
  },
22
22
  "devDependencies": {
23
- "@serenityjs/internal-config": "0.8.6-beta-20250630153821",
23
+ "@serenityjs/internal-config": "0.8.6-beta-20250701034207",
24
24
  "@swc/core": "1.7.42",
25
25
  "@types/node": "22.8.6",
26
26
  "eslint": "9.13.0",
@@ -29,9 +29,9 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@serenityjs/binarystream": "^2.7.1",
32
- "@serenityjs/core": "0.8.6-beta-20250630153821",
33
- "@serenityjs/emitter": "0.8.6-beta-20250630153821",
34
- "@serenityjs/logger": "0.8.6-beta-20250630153821",
35
- "@serenityjs/protocol": "0.8.6-beta-20250630153821"
32
+ "@serenityjs/core": "0.8.6-beta-20250701034207",
33
+ "@serenityjs/emitter": "0.8.6-beta-20250701034207",
34
+ "@serenityjs/logger": "0.8.6-beta-20250701034207",
35
+ "@serenityjs/protocol": "0.8.6-beta-20250701034207"
36
36
  }
37
37
  }