@serenityjs/plugins 0.6.0 → 0.6.1-beta-20241119000959
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 +11 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +5 -8
- package/bin/bundle.js +0 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @serenityjs/plugins
|
|
2
2
|
|
|
3
|
+
## 0.6.1-beta-20241119000959
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`5994a69`](https://github.com/SerenityJS/serenity/commit/5994a699c705402ae044c262588c1668e876a972) Thanks [@PMK744](https://github.com/PMK744)! - init v0.6.1-beta
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`5994a69`](https://github.com/SerenityJS/serenity/commit/5994a699c705402ae044c262588c1668e876a972)]:
|
|
10
|
+
- @serenityjs/protocol@0.6.1-beta-20241119000959
|
|
11
|
+
- @serenityjs/logger@0.6.1-beta-20241119000959
|
|
12
|
+
- @serenityjs/core@0.6.1-beta-20241119000959
|
|
13
|
+
|
|
3
14
|
## 0.6.0
|
|
4
15
|
|
|
5
16
|
### Minor Changes
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var $=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var h=(a,t)=>$(a,"name",{value:t,configurable:!0});var _=(a,t)=>{for(var i in t)$(a,i,{get:t[i],enumerable:!0})},V=(a,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of C(t))!L.call(a,r)&&r!==i&&$(a,r,{get:()=>t[r],enumerable:!(n=j(t,r))||n.enumerable});return a};var W=a=>V($({},"__esModule",{value:!0}),a);var N={};_(N,{DefaultPipelineProperties:()=>F,Pipeline:()=>T,Plugin:()=>v,PluginType:()=>f});module.exports=W(N);var s=require("fs"),e=require("path"),w=require("zlib"),b=require("child_process"),x=require("@serenityjs/logger"),y=require("@serenityjs/core"),z=require("@serenityjs/binarystream");var P=require("@serenityjs/logger");var f=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(f||{});var v=class{static{h(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(t,i,n){this.identifier=t,this.version=i,this.logger=n?.logger??new P.Logger(`${t}@${i}`,P.LoggerColors.Blue),this.type=n?.type??f.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};var U=require("path"),k=require("@serenityjs/protocol");var E=require("@serenityjs/core");var g=class extends E.CustomEnum{static{h(this,"PluginsEnum")}static identifier="plugins";static options=[]},A=class extends E.CustomEnum{static{h(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var q=h((a,t)=>{a.commands.register("plugins","Interact with the plugins of the server",i=>{i.permissionLevel=k.CommandPermissionLevel.Operator,i.overload({action:A},({action:n})=>{if(n.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let r=[...t.plugins.values()],o=[];for(let l of r)o.push(`\xA7u${l.identifier} v${l.version}\xA7r`);return{message:`\xA77Active Plugins (${r.length}):\xA7r ${o.join("\xA77,\xA7r ")}`}}),i.overload({action:A,plugin:g},({action:n,plugin:r})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let o=t.plugins.get(r.result);if(!o)throw new Error(`Plugin ${r.result} is not found.`);if(n.result==="reload")return t.reload(o),{message:`\xA7aSuccessfully reloaded \xA72${o.identifier}\xA7a.`};if(o.isBundled)throw new Error(`Plugin ${o.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(o),{message:`\xA7aSuccessfully bundled \xA72${o.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=q;var F={path:"./plugins",commands:!0},T=class{static{h(this,"Pipeline")}serenity;properties;logger=new x.Logger("Plugins",x.LoggerColors.CyanBright);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,i){this.serenity=t,this.properties={...F,...i},t.on(y.ServerEvent.Start,this.start.bind(this)),t.on(y.ServerEvent.Stop,this.stop.bind(this)),this.properties.commands&&t.on(y.WorldEvent.WorldInitialize,({world:n})=>D(n,this))}async initialize(t){(0,s.existsSync)((0,e.resolve)(this.path))||(0,s.mkdirSync)((0,e.resolve)(this.path),{recursive:!0});let n=(0,s.readdirSync)((0,e.resolve)(this.path),{withFileTypes:!0}).filter(o=>o.isFile()?o.name.endsWith(".plugin"):!1);for(let o of n)try{let l=(0,e.resolve)(this.path,o.name),c=(0,w.inflateSync)((0,s.readFileSync)(l)),d=new z.BinaryStream(c),B=d.readByte();if(B===f.Addon){let p=d.readVarInt(),m=d.readBuffer(p).toString("utf-8");p=d.readVarInt();let S=d.readBuffer(p).toString("utf-8"),I=(0,e.resolve)(this.path,`~${o.name.slice(0,-7)}`);(0,s.writeFileSync)(I,this.esm?m:S);let u=(await import(`file://${I}`)).default;if(!(u instanceof v)){this.logger.warn(`Unable to load plugin from \xA78${(0,e.relative)(process.cwd(),l)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}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=l,u.isBundled=!0,this.plugins.set(u.identifier,u),u.onInitialize(u),g.options.push(u.identifier),this.tempPaths.add(I)}else if(B===f.Api){let p=d.readRemainingBuffer();(0,s.unlinkSync)(l);let m=(0,e.resolve)(this.path,`~${o.name.slice(0,-7)}`);(0,s.writeFileSync)(m,p),(0,b.execSync)(`tar -xzf ${m} -C ${this.path}`,{stdio:"ignore"}),(0,s.unlinkSync)(m);let S=o.name.slice(0,-7);(0,s.renameSync)((0,e.resolve)(this.path,"package"),(0,e.resolve)(this.path,`${S}.api`)),(0,b.execSync)("npm install",{cwd:(0,e.resolve)(this.path,`${S}.api`),stdio:"ignore"})}}catch(l){this.logger.
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bGUgYW5kIG1haW4gZW50cnkgcG9pbnRzXG4gICAgICAgICAgbGV0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgICAgY29uc3QgZXNtID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gICAgICAgICAgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgICBjb25zdCBjanMgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgdGhpcy5lc20gPyBlc20gOiBjanMpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHt0ZW1wUGF0aH1gKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgICAgIGlmICghKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSxcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7bWFuaWZlc3QubmFtZX3CpzhAwqcxJHttYW5pZmVzdC52ZXJzaW9ufcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHtyZXNvbHZlKHBhdGgsIG1haW4pfWApO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCB0aGUgY29tcGxldGUgY2FsbGJhY2tcbiAgICByZXR1cm4gY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgLS0gUmVxdWlyZSBpcyB1c2VkIGhlcmUgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIEVTTSBhbmQgQ0pTIGluZGV4IGZpbGVzIGZyb20gdGhlIGlucHV0IHBhdGhcbiAgICAgIGNvbnN0IGVzbUluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4Lm1qc1wiKSk7XG4gICAgICBjb25zdCBjanNJbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIEVTTSBpbmRleCBmaWxlIGFuZCB0aGVuIHdyaXRlIHRoZSBjb21wcmVzc2VkIEVTTSBpbmRleCBmaWxlXG4gICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoZXNtSW5kZXgubGVuZ3RoKTtcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihlc21JbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIENKUyBpbmRleCBmaWxlIGFuZCB0aGVuIHdyaXRlIHRoZSBjb21wcmVzc2VkIENKUyBpbmRleCBmaWxlXG4gICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoY2pzSW5kZXgubGVuZ3RoKTtcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihjanNJbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAvLyBQYWNrIHRoZSBwbHVnaW5cbiAgICAgIGV4ZWNTeW5jKFwibnBtIHBhY2tcIiwgeyBjd2Q6IHBsdWdpbi5wYXRoLCBzdGRpbzogXCJpZ25vcmVcIiB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB0YXJiYWxsIHBhdGhcbiAgICAgIGNvbnN0IHRhcmJhbGwgPSByZWFkZGlyU3luYyhwbHVnaW4ucGF0aCkuZmluZCgoZmlsZSkgPT5cbiAgICAgICAgZmlsZS5lbmRzV2l0aChcIi50Z3pcIilcbiAgICAgICk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGV4aXN0c1xuICAgICAgaWYgKCF0YXJiYWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQYWNrZWQgdGFyYmFsbCBub3QgZm91bmQuXCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG4gIG9uSW5pdGlhbGl6ZTogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblN0YXJ0VXA6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TaHV0RG93bjogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBQbHVnaW4ge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbHVnaW5Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgcHJvcGVydGllcz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IHByb3BlcnRpZXM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gcHJvcGVydGllc1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gcHJvcGVydGllcy5vbkluaXRpYWxpemU7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBwcm9wZXJ0aWVzLm9uU3RhcnRVcDtcbiAgICBpZiAocHJvcGVydGllcz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gcHJvcGVydGllcy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpblByb3BlcnRpZXMgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNF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LE9BQVNFLEVBQVcyQixJQUFLLElBRXpDRyxZQUFTLFdBQVksQ0FBRWQsSUFBS04sRUFBTzdELEtBQU1rRixNQUFPLFFBQVMsQ0FBQSxFQUd6RCxJQUFNNkIsS0FBVTNFLGVBQVl5QixFQUFPN0QsSUFBSSxFQUFFZ0gsS0FBTUMsR0FDN0NBLEVBQUt2RSxTQUFTLE1BQUEsQ0FBQSxFQUloQixHQUFJLENBQUNxRSxFQUFTLE1BQU0sSUFBSTlGLE1BQU0sMkJBQUEsRUFHOUIsSUFBTTJCLEtBQVNFLG1CQUFhZCxXQUFRNkIsRUFBTzdELEtBQU0rRyxDQUFBQSxDQUFBQSxLQUdqRC9CLGlCQUFXaEQsV0FBUTZCLEVBQU83RCxLQUFNK0csQ0FBQUEsQ0FBQUEsRUFHaENoRSxFQUFPNkQsWUFBWWhFLENBQUFBLEtBR25CZ0Isb0JBQ0U1QixXQUFRLEtBQUtoQyxLQUFNLEdBQUc2RCxFQUFPUSxVQUFVLFNBQVMsS0FDaER3QyxlQUFZOUQsRUFBTytELFVBQVMsQ0FBQSxDQUFBLENBRWhDLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJzcmNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5UeXBlIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3psaWIiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xvZ2dlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAiX3BsdWdpbiIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgIlBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQ3lhbkJyaWdodCIsICJwbHVnaW5zIiwgIk1hcCIsICJ0ZW1wUGF0aHMiLCAiU2V0IiwgImVzbSIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJfIiwgIkVycm9yIiwgIm9uIiwgIlNlcnZlckV2ZW50IiwgIlN0YXJ0IiwgInN0YXJ0IiwgImJpbmQiLCAiU3RvcCIsICJzdG9wIiwgIldvcmxkRXZlbnQiLCAiV29ybGRJbml0aWFsaXplIiwgIndvcmxkIiwgIkNvbW1hbmQiLCAiaW5pdGlhbGl6ZSIsICJjb21wbGV0ZSIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJsZW5ndGgiLCAicmVhZFZhckludCIsICJyZWFkQnVmZmVyIiwgInRvU3RyaW5nIiwgImNqcyIsICJ0ZW1wUGF0aCIsICJzbGljZSIsICJ3cml0ZUZpbGVTeW5jIiwgInBsdWdpbiIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidW5saW5rU3luYyIsICJleGVjU3luYyIsICJzdGRpbyIsICJyZW5hbWVTeW5jIiwgInJlYXNvbiIsICJkaXJlY3RvcmllcyIsICJpc0RpcmVjdG9yeSIsICJkaXJlY3RvcnkiLCAibWFuaWZlc3QiLCAiSlNPTiIsICJwYXJzZSIsICJtYWluIiwgInZlcnNpb24iLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlbG9hZCIsICJkZWxldGUiLCAicmVxdWlyZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiaW5mbyIsICJ3cml0ZUJ5dGUiLCAiaW5wdXRQYXRoIiwgImVzbUluZGV4IiwgImNqc0luZGV4IiwgIndyaXRlVmFySW50IiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJ0YXJiYWxsIiwgImZpbmQiLCAiZmlsZSJdCn0K
|
|
1
|
+
"use strict";var $=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var h=(a,t)=>$(a,"name",{value:t,configurable:!0});var _=(a,t)=>{for(var i in t)$(a,i,{get:t[i],enumerable:!0})},V=(a,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of C(t))!L.call(a,r)&&r!==i&&$(a,r,{get:()=>t[r],enumerable:!(n=j(t,r))||n.enumerable});return a};var W=a=>V($({},"__esModule",{value:!0}),a);var N={};_(N,{DefaultPipelineProperties:()=>F,Pipeline:()=>T,Plugin:()=>v,PluginType:()=>f});module.exports=W(N);var s=require("fs"),e=require("path"),w=require("zlib"),b=require("child_process"),x=require("@serenityjs/logger"),y=require("@serenityjs/core"),z=require("@serenityjs/binarystream");var P=require("@serenityjs/logger");var f=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(f||{});var v=class{static{h(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(t,i,n){this.identifier=t,this.version=i,this.logger=n?.logger??new P.Logger(`${t}@${i}`,P.LoggerColors.Blue),this.type=n?.type??f.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};var U=require("path"),k=require("@serenityjs/protocol");var E=require("@serenityjs/core");var g=class extends E.CustomEnum{static{h(this,"PluginsEnum")}static identifier="plugins";static options=[]},A=class extends E.CustomEnum{static{h(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var q=h((a,t)=>{a.commands.register("plugins","Interact with the plugins of the server",i=>{i.permissionLevel=k.CommandPermissionLevel.Operator,i.overload({action:A},({action:n})=>{if(n.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let r=[...t.plugins.values()],o=[];for(let l of r)o.push(`\xA7u${l.identifier} v${l.version}\xA7r`);return{message:`\xA77Active Plugins (${r.length}):\xA7r ${o.join("\xA77,\xA7r ")}`}}),i.overload({action:A,plugin:g},({action:n,plugin:r})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let o=t.plugins.get(r.result);if(!o)throw new Error(`Plugin ${r.result} is not found.`);if(n.result==="reload")return t.reload(o),{message:`\xA7aSuccessfully reloaded \xA72${o.identifier}\xA7a.`};if(o.isBundled)throw new Error(`Plugin ${o.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(o),{message:`\xA7aSuccessfully bundled \xA72${o.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=q;var F={path:"./plugins",commands:!0},T=class{static{h(this,"Pipeline")}serenity;properties;logger=new x.Logger("Plugins",x.LoggerColors.CyanBright);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,i){this.serenity=t,this.properties={...F,...i},t.on(y.ServerEvent.Start,this.start.bind(this)),t.on(y.ServerEvent.Stop,this.stop.bind(this)),this.properties.commands&&t.on(y.WorldEvent.WorldInitialize,({world:n})=>D(n,this))}async initialize(t){(0,s.existsSync)((0,e.resolve)(this.path))||(0,s.mkdirSync)((0,e.resolve)(this.path),{recursive:!0});let n=(0,s.readdirSync)((0,e.resolve)(this.path),{withFileTypes:!0}).filter(o=>o.isFile()?o.name.endsWith(".plugin"):!1);for(let o of n)try{let l=(0,e.resolve)(this.path,o.name),c=(0,w.inflateSync)((0,s.readFileSync)(l)),d=new z.BinaryStream(c),B=d.readByte();if(B===f.Addon){let p=d.readVarInt(),m=d.readBuffer(p).toString("utf-8");p=d.readVarInt();let S=d.readBuffer(p).toString("utf-8"),I=(0,e.resolve)(this.path,`~${o.name.slice(0,-7)}`);(0,s.writeFileSync)(I,this.esm?m:S);let u=(await import(`file://${I}`)).default;if(!(u instanceof v)){this.logger.warn(`Unable to load plugin from \xA78${(0,e.relative)(process.cwd(),l)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}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=l,u.isBundled=!0,this.plugins.set(u.identifier,u),u.onInitialize(u),g.options.push(u.identifier),this.tempPaths.add(I)}else if(B===f.Api){let p=d.readRemainingBuffer();(0,s.unlinkSync)(l);let m=(0,e.resolve)(this.path,`~${o.name.slice(0,-7)}`);(0,s.writeFileSync)(m,p),(0,b.execSync)(`tar -xzf ${m} -C ${this.path}`,{stdio:"ignore"}),(0,s.unlinkSync)(m);let S=o.name.slice(0,-7);(0,s.renameSync)((0,e.resolve)(this.path,"package"),(0,e.resolve)(this.path,`${S}.api`)),(0,b.execSync)("npm install",{cwd:(0,e.resolve)(this.path,`${S}.api`),stdio:"ignore"})}}catch(l){this.logger.error(`Failed to load plugin from "${(0,e.relative)(process.cwd(),(0,e.resolve)(this.path,o.name))}", skipping the plugin.`,l)}let r=(0,s.readdirSync)((0,e.resolve)(this.path),{withFileTypes:!0}).filter(o=>o.isDirectory());for(let o of r)try{let l=(0,e.resolve)(this.path,o.name);if(!(0,s.existsSync)((0,e.resolve)(l,"package.json")))continue;let c=JSON.parse((0,s.readFileSync)((0,e.resolve)(l,"package.json"),"utf-8")),d=(0,e.resolve)(l,this.esm?c.module:c.main);if(!(0,s.existsSync)((0,e.resolve)(l,d))){this.logger.warn(`Unable to load plugin \xA71${c.name}\xA78@\xA71${c.version}\xA7r, the main entry path "\xA78${(0,e.relative)(process.cwd(),(0,e.resolve)(l,d))}\xA7r" was not found in the directory.`);continue}let p=(await import(`file://${(0,e.resolve)(l,d)}`)).default;if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=l,p.isBundled=!1,this.plugins.set(p.identifier,p),g.options.push(p.identifier),p.onInitialize(p)}catch(l){this.logger.error(`Failed to load plugin from "${(0,e.relative)(process.cwd(),(0,e.resolve)(this.path,o.name))}", skipping the plugin.`,l)}return t()}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,s.unlinkSync)(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let i=t.path;delete require.cache[require.resolve(i)],this.serenity.removePath(i);try{let r=require(i).default;if(!(r instanceof v)){this.logger.warn(`Unable to reload plugin from \xA78${(0,e.relative)(process.cwd(),i)}\xA7r, the plugin is not an instance of the Plugin class.`);return}r.pipeline=this,r.serenity=this.serenity,r.path=i,this.plugins.set(r.identifier,r),r.onInitialize(r),r.onStartUp(r),this.logger.info(`Successfully reloaded plugin \xA71${r.identifier}\xA7r from \xA78${(0,e.relative)(process.cwd(),i)}\xA7r.`)}catch(n){this.logger.warn(`Failed to reload plugin from \xA78${(0,e.relative)(process.cwd(),i)}\xA7r, skipping the plugin.`,n)}}bundle(t){let i=new z.BinaryStream;if(i.writeByte(t.type),t.type===f.Addon){let n=(0,e.resolve)(t.path,"dist"),r=(0,s.readFileSync)((0,e.resolve)(n,"index.mjs")),o=(0,s.readFileSync)((0,e.resolve)(n,"index.js"));i.writeVarInt(r.length),i.writeBuffer(r),i.writeVarInt(o.length),i.writeBuffer(o),(0,s.writeFileSync)((0,e.resolve)(this.path,`${t.identifier}.plugin`),(0,w.deflateSync)(i.getBuffer()))}else if(t.type===f.Api){(0,b.execSync)("npm pack",{cwd:t.path,stdio:"ignore"});let n=(0,s.readdirSync)(t.path).find(o=>o.endsWith(".tgz"));if(!n)throw new Error("Packed tarball not found.");let r=(0,s.readFileSync)((0,e.resolve)(t.path,n));(0,s.unlinkSync)((0,e.resolve)(t.path,n)),i.writeBuffer(r),(0,s.writeFileSync)((0,e.resolve)(this.path,`${t.identifier}.plugin`),(0,w.deflateSync)(i.getBuffer()))}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bGUgYW5kIG1haW4gZW50cnkgcG9pbnRzXG4gICAgICAgICAgbGV0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgICAgY29uc3QgZXNtID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gICAgICAgICAgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgICBjb25zdCBjanMgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgdGhpcy5lc20gPyBlc20gOiBjanMpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHt0ZW1wUGF0aH1gKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgICAgIGlmICghKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSxcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBlbnRyaWVzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZGlyZWN0b3JpZXMsIGNoZWNraW5nIGlmIHRoZXkgYXJlIHZhbGlkIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGEgcGFja2FnZS5qc29uIGZpbGUsIGlmIG5vdCwgc2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgdGhpcy5lc20gPyBtYW5pZmVzdC5tb2R1bGUgOiBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoYGZpbGU6Ly8ke3Jlc29sdmUocGF0aCwgbWFpbil9YCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGwgdGhlIGNvbXBsZXRlIGNhbGxiYWNrXG4gICAgcmV0dXJuIGNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gRHluYW1pYyBkZWxldGUgaXMgcmVxdWlyZWQgaGVyZVxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzIC0tIFJlcXVpcmUgaXMgdXNlZCBoZXJlIHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBFU00gYW5kIENKUyBpbmRleCBmaWxlcyBmcm9tIHRoZSBpbnB1dCBwYXRoXG4gICAgICBjb25zdCBlc21JbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5tanNcIikpO1xuICAgICAgY29uc3QgY2pzSW5kZXggPSByZWFkRmlsZVN5bmMocmVzb2x2ZShpbnB1dFBhdGgsIFwiaW5kZXguanNcIikpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBFU00gaW5kZXggZmlsZSBhbmQgdGhlbiB3cml0ZSB0aGUgY29tcHJlc3NlZCBFU00gaW5kZXggZmlsZVxuICAgICAgc3RyZWFtLndyaXRlVmFySW50KGVzbUluZGV4Lmxlbmd0aCk7XG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoZXNtSW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBDSlMgaW5kZXggZmlsZSBhbmQgdGhlbiB3cml0ZSB0aGUgY29tcHJlc3NlZCBDSlMgaW5kZXggZmlsZVxuICAgICAgc3RyZWFtLndyaXRlVmFySW50KGNqc0luZGV4Lmxlbmd0aCk7XG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoY2pzSW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51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LE9BQVNFLEVBQVcyQixJQUFLLElBRXpDRyxZQUFTLFdBQVksQ0FBRWQsSUFBS04sRUFBTzdELEtBQU1rRixNQUFPLFFBQVMsQ0FBQSxFQUd6RCxJQUFNOEIsS0FBVTVFLGVBQVl5QixFQUFPN0QsSUFBSSxFQUFFaUgsS0FBTUMsR0FDN0NBLEVBQUt4RSxTQUFTLE1BQUEsQ0FBQSxFQUloQixHQUFJLENBQUNzRSxFQUFTLE1BQU0sSUFBSS9GLE1BQU0sMkJBQUEsRUFHOUIsSUFBTTJCLEtBQVNFLG1CQUFhZCxXQUFRNkIsRUFBTzdELEtBQU1nSCxDQUFBQSxDQUFBQSxLQUdqRGhDLGlCQUFXaEQsV0FBUTZCLEVBQU83RCxLQUFNZ0gsQ0FBQUEsQ0FBQUEsRUFHaENqRSxFQUFPOEQsWUFBWWpFLENBQUFBLEtBR25CZ0Isb0JBQ0U1QixXQUFRLEtBQUtoQyxLQUFNLEdBQUc2RCxFQUFPUSxVQUFVLFNBQVMsS0FDaER5QyxlQUFZL0QsRUFBT2dFLFVBQVMsQ0FBQSxDQUFBLENBRWhDLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJzcmNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5UeXBlIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3psaWIiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xvZ2dlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAiX3BsdWdpbiIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgIlBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQ3lhbkJyaWdodCIsICJwbHVnaW5zIiwgIk1hcCIsICJ0ZW1wUGF0aHMiLCAiU2V0IiwgImVzbSIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJfIiwgIkVycm9yIiwgIm9uIiwgIlNlcnZlckV2ZW50IiwgIlN0YXJ0IiwgInN0YXJ0IiwgImJpbmQiLCAiU3RvcCIsICJzdG9wIiwgIldvcmxkRXZlbnQiLCAiV29ybGRJbml0aWFsaXplIiwgIndvcmxkIiwgIkNvbW1hbmQiLCAiaW5pdGlhbGl6ZSIsICJjb21wbGV0ZSIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJsZW5ndGgiLCAicmVhZFZhckludCIsICJyZWFkQnVmZmVyIiwgInRvU3RyaW5nIiwgImNqcyIsICJ0ZW1wUGF0aCIsICJzbGljZSIsICJ3cml0ZUZpbGVTeW5jIiwgInBsdWdpbiIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidW5saW5rU3luYyIsICJleGVjU3luYyIsICJzdGRpbyIsICJyZW5hbWVTeW5jIiwgInJlYXNvbiIsICJlcnJvciIsICJkaXJlY3RvcmllcyIsICJpc0RpcmVjdG9yeSIsICJkaXJlY3RvcnkiLCAibWFuaWZlc3QiLCAiSlNPTiIsICJwYXJzZSIsICJtYWluIiwgInZlcnNpb24iLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlbG9hZCIsICJkZWxldGUiLCAicmVxdWlyZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiaW5mbyIsICJ3cml0ZUJ5dGUiLCAiaW5wdXRQYXRoIiwgImVzbUluZGV4IiwgImNqc0luZGV4IiwgIndyaXRlVmFySW50IiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJ0YXJiYWxsIiwgImZpbmQiLCAiZmlsZSJdCn0K
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var j=Object.defineProperty;var d=(a,t)=>j(a,"name",{value:t,configurable:!0}),S=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as I,mkdirSync as q,readdirSync as E,readFileSync as w,renameSync as T,unlinkSync as $,writeFileSync as P}from"node:fs";import{relative as f,resolve as r}from"node:path";import{deflateSync as k,inflateSync as N}from"node:zlib";import{execSync as A}from"node:child_process";import{Logger as O,LoggerColors as J}from"@serenityjs/logger";import{ServerEvent as D,WorldEvent as M}from"@serenityjs/core";import{BinaryStream as F}from"@serenityjs/binarystream";import{Logger as C,LoggerColors as L}from"@serenityjs/logger";var h=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(h||{});var x=class{static{d(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(t,i,n){this.identifier=t,this.version=i,this.logger=n?.logger??new C(`${t}@${i}`,L.Blue),this.type=n?.type??h.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};import{relative as _}from"path";import{CommandPermissionLevel as V}from"@serenityjs/protocol";import{CustomEnum as z}from"@serenityjs/core";var g=class extends z{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends z{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=d((a,t)=>{a.commands.register("plugins","Interact with the plugins of the server",i=>{i.permissionLevel=V.Operator,i.overload({action:B},({action:n})=>{if(n.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let o=[...t.plugins.values()],e=[];for(let s of o)e.push(`\xA7u${s.identifier} v${s.version}\xA7r`);return{message:`\xA77Active Plugins (${o.length}):\xA7r ${e.join("\xA77,\xA7r ")}`}}),i.overload({action:B,plugin:g},({action:n,plugin:o})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let e=t.plugins.get(o.result);if(!e)throw new Error(`Plugin ${o.result} is not found.`);if(n.result==="reload")return t.reload(e),{message:`\xA7aSuccessfully reloaded \xA72${e.identifier}\xA7a.`};if(e.isBundled)throw new Error(`Plugin ${e.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(e),{message:`\xA7aSuccessfully bundled \xA72${e.identifier}\xA7a, output file was placed at \xA77${_(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),U=W;var R={path:"./plugins",commands:!0},It=class{static{d(this,"Pipeline")}serenity;properties;logger=new O("Plugins",J.CyanBright);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,i){this.serenity=t,this.properties={...R,...i},t.on(D.Start,this.start.bind(this)),t.on(D.Stop,this.stop.bind(this)),this.properties.commands&&t.on(M.WorldInitialize,({world:n})=>U(n,this))}async initialize(t){I(r(this.path))||q(r(this.path),{recursive:!0});let n=E(r(this.path),{withFileTypes:!0}).filter(e=>e.isFile()?e.name.endsWith(".plugin"):!1);for(let e of n)try{let s=r(this.path,e.name),c=N(w(s)),u=new F(c),v=u.readByte();if(v===h.Addon){let l=u.readVarInt(),m=u.readBuffer(l).toString("utf-8");l=u.readVarInt();let y=u.readBuffer(l).toString("utf-8"),b=r(this.path,`~${e.name.slice(0,-7)}`);P(b,this.esm?m:y);let p=(await import(`file://${b}`)).default;if(!(p instanceof x)){this.logger.warn(`Unable to load plugin from \xA78${f(process.cwd(),s)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=s,p.isBundled=!0,this.plugins.set(p.identifier,p),p.onInitialize(p),g.options.push(p.identifier),this.tempPaths.add(b)}else if(v===h.Api){let l=u.readRemainingBuffer();$(s);let m=r(this.path,`~${e.name.slice(0,-7)}`);P(m,l),A(`tar -xzf ${m} -C ${this.path}`,{stdio:"ignore"}),$(m);let y=e.name.slice(0,-7);T(r(this.path,"package"),r(this.path,`${y}.api`)),A("npm install",{cwd:r(this.path,`${y}.api`),stdio:"ignore"})}}catch(s){this.logger.
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bGUgYW5kIG1haW4gZW50cnkgcG9pbnRzXG4gICAgICAgICAgbGV0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgICAgY29uc3QgZXNtID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gICAgICAgICAgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgICBjb25zdCBjanMgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgdGhpcy5lc20gPyBlc20gOiBjanMpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHt0ZW1wUGF0aH1gKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgICAgIGlmICghKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSxcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7bWFuaWZlc3QubmFtZX3CpzhAwqcxJHttYW5pZmVzdC52ZXJzaW9ufcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHtyZXNvbHZlKHBhdGgsIG1haW4pfWApO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCB0aGUgY29tcGxldGUgY2FsbGJhY2tcbiAgICByZXR1cm4gY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgLS0gUmVxdWlyZSBpcyB1c2VkIGhlcmUgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIEVTTSBhbmQgQ0pTIGluZGV4IGZpbGVzIGZyb20gdGhlIGlucHV0IHBhdGhcbiAgICAgIGNvbnN0IGVzbUluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4Lm1qc1wiKSk7XG4gICAgICBjb25zdCBjanNJbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIEVTTSBpbmRleCBmaWxlIGFuZCB0aGVuIHdyaXRlIHRoZSBjb21wcmVzc2VkIEVTTSBpbmRleCBmaWxlXG4gICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoZXNtSW5kZXgubGVuZ3RoKTtcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihlc21JbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIENKUyBpbmRleCBmaWxlIGFuZCB0aGVuIHdyaXRlIHRoZSBjb21wcmVzc2VkIENKUyBpbmRleCBmaWxlXG4gICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoY2pzSW5kZXgubGVuZ3RoKTtcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihjanNJbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAvLyBQYWNrIHRoZSBwbHVnaW5cbiAgICAgIGV4ZWNTeW5jKFwibnBtIHBhY2tcIiwgeyBjd2Q6IHBsdWdpbi5wYXRoLCBzdGRpbzogXCJpZ25vcmVcIiB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB0YXJiYWxsIHBhdGhcbiAgICAgIGNvbnN0IHRhcmJhbGwgPSByZWFkZGlyU3luYyhwbHVnaW4ucGF0aCkuZmluZCgoZmlsZSkgPT5cbiAgICAgICAgZmlsZS5lbmRzV2l0aChcIi50Z3pcIilcbiAgICAgICk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGV4aXN0c1xuICAgICAgaWYgKCF0YXJiYWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQYWNrZWQgdGFyYmFsbCBub3QgZm91bmQuXCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG4gIG9uSW5pdGlhbGl6ZTogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblN0YXJ0VXA6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TaHV0RG93bjogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBQbHVnaW4ge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbHVnaW5Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgcHJvcGVydGllcz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IHByb3BlcnRpZXM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gcHJvcGVydGllc1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gcHJvcGVydGllcy5vbkluaXRpYWxpemU7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBwcm9wZXJ0aWVzLm9uU3RhcnRVcDtcbiAgICBpZiAocHJvcGVydGllcz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gcHJvcGVydGllcy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpblByb3BlcnRpZXMgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIm9VQUFBLE9BQ0VBLGNBQUFBLEVBQ0FDLGFBQUFBLEVBQ0FDLGVBQUFBLEVBQ0FDLGdCQUFBQSxFQUNBQyxjQUFB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LENBRWhDLFNBQVdqRCxFQUFPWixPQUFTRSxFQUFXMkIsSUFBSyxDQUV6Q0csRUFBUyxXQUFZLENBQUVkLElBQUtOLEVBQU83RCxLQUFNa0YsTUFBTyxRQUFTLENBQUEsRUFHekQsSUFBTTZCLEVBQVUzRSxFQUFZeUIsRUFBTzdELElBQUksRUFBRWdILEtBQU1DLEdBQzdDQSxFQUFLdkUsU0FBUyxNQUFBLENBQUEsRUFJaEIsR0FBSSxDQUFDcUUsRUFBUyxNQUFNLElBQUk5RixNQUFNLDJCQUFBLEVBRzlCLElBQU0yQixFQUFTRSxFQUFhZCxFQUFRNkIsRUFBTzdELEtBQU0rRyxDQUFBQSxDQUFBQSxFQUdqRC9CLEVBQVdoRCxFQUFRNkIsRUFBTzdELEtBQU0rRyxDQUFBQSxDQUFBQSxFQUdoQ2hFLEVBQU82RCxZQUFZaEUsQ0FBQUEsRUFHbkJnQixFQUNFNUIsRUFBUSxLQUFLaEMsS0FBTSxHQUFHNkQsRUFBT1EsVUFBVSxTQUFTLEVBQ2hEd0MsRUFBWTlELEVBQU8rRCxVQUFTLENBQUEsQ0FBQSxDQUVoQyxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsiZXhpc3RzU3luYyIsICJta2RpclN5bmMiLCAicmVhZGRpclN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInJlbmFtZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiZXhlY1N5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiQ3VzdG9tRW51bSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJpbml0aWFsaXplIiwgImNvbXBsZXRlIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAiY2pzIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicGx1Z2luIiwgImRlZmF1bHQiLCAiUGx1Z2luIiwgIndhcm4iLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImFkZCIsICJBcGkiLCAicmVhZFJlbWFpbmluZ0J1ZmZlciIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAicmVhc29uIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJyZXF1aXJlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAiZXNtSW5kZXgiLCAiY2pzSW5kZXgiLCAid3JpdGVWYXJJbnQiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
|
|
1
|
+
var j=Object.defineProperty;var d=(a,t)=>j(a,"name",{value:t,configurable:!0}),S=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as I,mkdirSync as q,readdirSync as E,readFileSync as w,renameSync as T,unlinkSync as $,writeFileSync as P}from"node:fs";import{relative as f,resolve as r}from"node:path";import{deflateSync as k,inflateSync as N}from"node:zlib";import{execSync as A}from"node:child_process";import{Logger as O,LoggerColors as J}from"@serenityjs/logger";import{ServerEvent as D,WorldEvent as M}from"@serenityjs/core";import{BinaryStream as F}from"@serenityjs/binarystream";import{Logger as C,LoggerColors as L}from"@serenityjs/logger";var h=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(h||{});var x=class{static{d(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(t,i,n){this.identifier=t,this.version=i,this.logger=n?.logger??new C(`${t}@${i}`,L.Blue),this.type=n?.type??h.Addon,n?.onInitialize&&(this.onInitialize=n.onInitialize),n?.onStartUp&&(this.onStartUp=n.onStartUp),n?.onShutDown&&(this.onShutDown=n.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};import{relative as _}from"path";import{CommandPermissionLevel as V}from"@serenityjs/protocol";import{CustomEnum as z}from"@serenityjs/core";var g=class extends z{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},B=class extends z{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=d((a,t)=>{a.commands.register("plugins","Interact with the plugins of the server",i=>{i.permissionLevel=V.Operator,i.overload({action:B},({action:n})=>{if(n.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let o=[...t.plugins.values()],e=[];for(let s of o)e.push(`\xA7u${s.identifier} v${s.version}\xA7r`);return{message:`\xA77Active Plugins (${o.length}):\xA7r ${e.join("\xA77,\xA7r ")}`}}),i.overload({action:B,plugin:g},({action:n,plugin:o})=>{if(n.result!=="reload"&&n.result!=="bundle")return;let e=t.plugins.get(o.result);if(!e)throw new Error(`Plugin ${o.result} is not found.`);if(n.result==="reload")return t.reload(e),{message:`\xA7aSuccessfully reloaded \xA72${e.identifier}\xA7a.`};if(e.isBundled)throw new Error(`Plugin ${e.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(e),{message:`\xA7aSuccessfully bundled \xA72${e.identifier}\xA7a, output file was placed at \xA77${_(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),U=W;var R={path:"./plugins",commands:!0},It=class{static{d(this,"Pipeline")}serenity;properties;logger=new O("Plugins",J.CyanBright);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,i){this.serenity=t,this.properties={...R,...i},t.on(D.Start,this.start.bind(this)),t.on(D.Stop,this.stop.bind(this)),this.properties.commands&&t.on(M.WorldInitialize,({world:n})=>U(n,this))}async initialize(t){I(r(this.path))||q(r(this.path),{recursive:!0});let n=E(r(this.path),{withFileTypes:!0}).filter(e=>e.isFile()?e.name.endsWith(".plugin"):!1);for(let e of n)try{let s=r(this.path,e.name),c=N(w(s)),u=new F(c),v=u.readByte();if(v===h.Addon){let l=u.readVarInt(),m=u.readBuffer(l).toString("utf-8");l=u.readVarInt();let y=u.readBuffer(l).toString("utf-8"),b=r(this.path,`~${e.name.slice(0,-7)}`);P(b,this.esm?m:y);let p=(await import(`file://${b}`)).default;if(!(p instanceof x)){this.logger.warn(`Unable to load plugin from \xA78${f(process.cwd(),s)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=s,p.isBundled=!0,this.plugins.set(p.identifier,p),p.onInitialize(p),g.options.push(p.identifier),this.tempPaths.add(b)}else if(v===h.Api){let l=u.readRemainingBuffer();$(s);let m=r(this.path,`~${e.name.slice(0,-7)}`);P(m,l),A(`tar -xzf ${m} -C ${this.path}`,{stdio:"ignore"}),$(m);let y=e.name.slice(0,-7);T(r(this.path,"package"),r(this.path,`${y}.api`)),A("npm install",{cwd:r(this.path,`${y}.api`),stdio:"ignore"})}}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,e.name))}", skipping the plugin.`,s)}let o=E(r(this.path),{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of o)try{let s=r(this.path,e.name);if(!I(r(s,"package.json")))continue;let c=JSON.parse(w(r(s,"package.json"),"utf-8")),u=r(s,this.esm?c.module:c.main);if(!I(r(s,u))){this.logger.warn(`Unable to load plugin \xA71${c.name}\xA78@\xA71${c.version}\xA7r, the main entry path "\xA78${f(process.cwd(),r(s,u))}\xA7r" was not found in the directory.`);continue}let l=(await import(`file://${r(s,u)}`)).default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=s,l.isBundled=!1,this.plugins.set(l.identifier,l),g.options.push(l.identifier),l.onInitialize(l)}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,e.name))}", skipping the plugin.`,s)}return t()}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)$(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let i=t.path;delete S.cache[S.resolve(i)],this.serenity.removePath(i);try{let o=S(i).default;if(!(o instanceof x)){this.logger.warn(`Unable to reload plugin from \xA78${f(process.cwd(),i)}\xA7r, the plugin is not an instance of the Plugin class.`);return}o.pipeline=this,o.serenity=this.serenity,o.path=i,this.plugins.set(o.identifier,o),o.onInitialize(o),o.onStartUp(o),this.logger.info(`Successfully reloaded plugin \xA71${o.identifier}\xA7r from \xA78${f(process.cwd(),i)}\xA7r.`)}catch(n){this.logger.warn(`Failed to reload plugin from \xA78${f(process.cwd(),i)}\xA7r, skipping the plugin.`,n)}}bundle(t){let i=new F;if(i.writeByte(t.type),t.type===h.Addon){let n=r(t.path,"dist"),o=w(r(n,"index.mjs")),e=w(r(n,"index.js"));i.writeVarInt(o.length),i.writeBuffer(o),i.writeVarInt(e.length),i.writeBuffer(e),P(r(this.path,`${t.identifier}.plugin`),k(i.getBuffer()))}else if(t.type===h.Api){A("npm pack",{cwd:t.path,stdio:"ignore"});let n=E(t.path).find(e=>e.endsWith(".tgz"));if(!n)throw new Error("Packed tarball not found.");let o=w(r(t.path,n));$(r(t.path,n)),i.writeBuffer(o),P(r(this.path,`${t.identifier}.plugin`),k(i.getBuffer()))}}};export{R as DefaultPipelineProperties,It as Pipeline,x as Plugin,h as PluginType};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bGUgYW5kIG1haW4gZW50cnkgcG9pbnRzXG4gICAgICAgICAgbGV0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgICAgY29uc3QgZXNtID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gICAgICAgICAgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgICBjb25zdCBjanMgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgdGhpcy5lc20gPyBlc20gOiBjanMpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHt0ZW1wUGF0aH1gKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgICAgIGlmICghKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGB+JHtidW5kbGUubmFtZS5zbGljZSgwLCAtNyl9YCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSxcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtuYW1lfS5hcGlgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBlbnRyaWVzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZGlyZWN0b3JpZXMsIGNoZWNraW5nIGlmIHRoZXkgYXJlIHZhbGlkIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGEgcGFja2FnZS5qc29uIGZpbGUsIGlmIG5vdCwgc2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgdGhpcy5lc20gPyBtYW5pZmVzdC5tb2R1bGUgOiBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoYGZpbGU6Ly8ke3Jlc29sdmUocGF0aCwgbWFpbil9YCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGwgdGhlIGNvbXBsZXRlIGNhbGxiYWNrXG4gICAgcmV0dXJuIGNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gRHluYW1pYyBkZWxldGUgaXMgcmVxdWlyZWQgaGVyZVxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzIC0tIFJlcXVpcmUgaXMgdXNlZCBoZXJlIHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBFU00gYW5kIENKUyBpbmRleCBmaWxlcyBmcm9tIHRoZSBpbnB1dCBwYXRoXG4gICAgICBjb25zdCBlc21JbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5tanNcIikpO1xuICAgICAgY29uc3QgY2pzSW5kZXggPSByZWFkRmlsZVN5bmMocmVzb2x2ZShpbnB1dFBhdGgsIFwiaW5kZXguanNcIikpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBFU00gaW5kZXggZmlsZSBhbmQgdGhlbiB3cml0ZSB0aGUgY29tcHJlc3NlZCBFU00gaW5kZXggZmlsZVxuICAgICAgc3RyZWFtLndyaXRlVmFySW50KGVzbUluZGV4Lmxlbmd0aCk7XG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoZXNtSW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBDSlMgaW5kZXggZmlsZSBhbmQgdGhlbiB3cml0ZSB0aGUgY29tcHJlc3NlZCBDSlMgaW5kZXggZmlsZVxuICAgICAgc3RyZWFtLndyaXRlVmFySW50KGNqc0luZGV4Lmxlbmd0aCk7XG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoY2pzSW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xuICBvbkluaXRpYWxpemU6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TdGFydFVwOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU2h1dERvd246IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbn1cblxuY2xhc3MgUGx1Z2luIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFBQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEs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LENBRWhDLFNBQVdsRCxFQUFPWixPQUFTRSxFQUFXMkIsSUFBSyxDQUV6Q0csRUFBUyxXQUFZLENBQUVkLElBQUtOLEVBQU83RCxLQUFNa0YsTUFBTyxRQUFTLENBQUEsRUFHekQsSUFBTThCLEVBQVU1RSxFQUFZeUIsRUFBTzdELElBQUksRUFBRWlILEtBQU1DLEdBQzdDQSxFQUFLeEUsU0FBUyxNQUFBLENBQUEsRUFJaEIsR0FBSSxDQUFDc0UsRUFBUyxNQUFNLElBQUkvRixNQUFNLDJCQUFBLEVBRzlCLElBQU0yQixFQUFTRSxFQUFhZCxFQUFRNkIsRUFBTzdELEtBQU1nSCxDQUFBQSxDQUFBQSxFQUdqRGhDLEVBQVdoRCxFQUFRNkIsRUFBTzdELEtBQU1nSCxDQUFBQSxDQUFBQSxFQUdoQ2pFLEVBQU84RCxZQUFZakUsQ0FBQUEsRUFHbkJnQixFQUNFNUIsRUFBUSxLQUFLaEMsS0FBTSxHQUFHNkQsRUFBT1EsVUFBVSxTQUFTLEVBQ2hEeUMsRUFBWS9ELEVBQU9nRSxVQUFTLENBQUEsQ0FBQSxDQUVoQyxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsiZXhpc3RzU3luYyIsICJta2RpclN5bmMiLCAicmVhZGRpclN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInJlbmFtZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiZXhlY1N5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiQ3VzdG9tRW51bSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJpbml0aWFsaXplIiwgImNvbXBsZXRlIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAiY2pzIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicGx1Z2luIiwgImRlZmF1bHQiLCAiUGx1Z2luIiwgIndhcm4iLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImFkZCIsICJBcGkiLCAicmVhZFJlbWFpbmluZ0J1ZmZlciIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAicmVhc29uIiwgImVycm9yIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJyZXF1aXJlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAiZXNtSW5kZXgiLCAiY2pzSW5kZXgiLCAid3JpdGVWYXJJbnQiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@serenityjs/plugins",
|
|
3
3
|
"author": "Serenity",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.1-beta-20241119000959",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
@@ -19,11 +19,8 @@
|
|
|
19
19
|
"lint": "eslint src/",
|
|
20
20
|
"typecheck": "tsc --noEmit"
|
|
21
21
|
},
|
|
22
|
-
"bin": {
|
|
23
|
-
"bundle": "./bin/bundle.js"
|
|
24
|
-
},
|
|
25
22
|
"devDependencies": {
|
|
26
|
-
"@serenityjs/internal-config": "
|
|
23
|
+
"@serenityjs/internal-config": "0.6.1-beta-20241119000959",
|
|
27
24
|
"@swc/core": "1.7.42",
|
|
28
25
|
"@types/node": "22.8.6",
|
|
29
26
|
"eslint": "9.13.0",
|
|
@@ -32,8 +29,8 @@
|
|
|
32
29
|
},
|
|
33
30
|
"dependencies": {
|
|
34
31
|
"@serenityjs/binarystream": "^2.6.6",
|
|
35
|
-
"@serenityjs/core": "
|
|
36
|
-
"@serenityjs/logger": "
|
|
37
|
-
"@serenityjs/protocol": "
|
|
32
|
+
"@serenityjs/core": "0.6.1-beta-20241119000959",
|
|
33
|
+
"@serenityjs/logger": "0.6.1-beta-20241119000959",
|
|
34
|
+
"@serenityjs/protocol": "0.6.1-beta-20241119000959"
|
|
38
35
|
}
|
|
39
36
|
}
|
package/bin/bundle.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const { readFileSync, existsSync, mkdirSync, writeFileSync } = require("fs");
|
|
4
|
-
const { resolve } = require("node:path");
|
|
5
|
-
const { deflateSync } = require("node:zlib");
|
|
6
|
-
|
|
7
|
-
const { BinaryStream } = require("@serenityjs/binarystream");
|
|
8
|
-
|
|
9
|
-
// Get the input and output paths from the command line arguments
|
|
10
|
-
const inputPath = process.argv[2];
|
|
11
|
-
const outputPath = process.argv[3];
|
|
12
|
-
const fileName = process.argv[4] || "my-plugin";
|
|
13
|
-
|
|
14
|
-
// Check if the input path exists
|
|
15
|
-
if (!existsSync(inputPath)) {
|
|
16
|
-
console.error(`Input path "${inputPath}" does not exist.`);
|
|
17
|
-
process.exit(1);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Create the output directory if it does not exist
|
|
21
|
-
if (!existsSync(outputPath)) {
|
|
22
|
-
mkdirSync(outputPath, { recursive: true });
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Read the ESM and CJS index files from the input path
|
|
26
|
-
const esmIndex = readFileSync(resolve(inputPath, "index.mjs"));
|
|
27
|
-
const cjsIndex = readFileSync(resolve(inputPath, "index.js"));
|
|
28
|
-
|
|
29
|
-
// Create a new BinaryStream instance
|
|
30
|
-
const stream = new BinaryStream();
|
|
31
|
-
|
|
32
|
-
// Write the length of the ESM index file and then write the compressed ESM index file
|
|
33
|
-
stream.writeVarInt(esmIndex.length);
|
|
34
|
-
stream.writeBuffer(esmIndex);
|
|
35
|
-
|
|
36
|
-
// Write the length of the CJS index file and then write the compressed CJS index file
|
|
37
|
-
stream.writeVarInt(cjsIndex.length);
|
|
38
|
-
stream.writeBuffer(cjsIndex);
|
|
39
|
-
|
|
40
|
-
// Get the buffer from the BinaryStream
|
|
41
|
-
const buffer = stream.getBuffer();
|
|
42
|
-
|
|
43
|
-
// Write the BinaryStream to the output path
|
|
44
|
-
writeFileSync(resolve(outputPath, `${fileName}.plugin`), deflateSync(buffer));
|