velocious 1.0.561 → 1.0.563

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.
Files changed (44) hide show
  1. package/README.md +3 -1
  2. package/build/configuration-types.js +1 -0
  3. package/build/configuration.js +44 -3
  4. package/build/http-server/client/websocket-session.js +3 -3
  5. package/build/http-server/client-delivery-queue.js +168 -0
  6. package/build/http-server/server-client.js +9 -0
  7. package/build/http-server/websocket-events-host.js +42 -12
  8. package/build/http-server/worker-handler/in-process.js +53 -14
  9. package/build/http-server/worker-handler/index.js +88 -18
  10. package/build/http-server/worker-handler/worker-thread.js +2 -2
  11. package/build/src/configuration-types.d.ts +8 -0
  12. package/build/src/configuration-types.d.ts.map +1 -1
  13. package/build/src/configuration-types.js +2 -1
  14. package/build/src/configuration.d.ts +34 -1
  15. package/build/src/configuration.d.ts.map +1 -1
  16. package/build/src/configuration.js +40 -4
  17. package/build/src/http-server/client/websocket-session.js +4 -4
  18. package/build/src/http-server/client-delivery-queue.d.ts +121 -0
  19. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
  20. package/build/src/http-server/client-delivery-queue.js +152 -0
  21. package/build/src/http-server/server-client.d.ts +6 -0
  22. package/build/src/http-server/server-client.d.ts.map +1 -1
  23. package/build/src/http-server/server-client.js +10 -1
  24. package/build/src/http-server/websocket-events-host.d.ts +15 -4
  25. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  26. package/build/src/http-server/websocket-events-host.js +39 -13
  27. package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
  28. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  29. package/build/src/http-server/worker-handler/in-process.js +50 -14
  30. package/build/src/http-server/worker-handler/index.d.ts +36 -4
  31. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  32. package/build/src/http-server/worker-handler/index.js +82 -18
  33. package/build/src/http-server/worker-handler/worker-thread.js +3 -3
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +4 -3
  36. package/src/configuration-types.js +1 -0
  37. package/src/configuration.js +44 -3
  38. package/src/http-server/client/websocket-session.js +3 -3
  39. package/src/http-server/client-delivery-queue.js +168 -0
  40. package/src/http-server/server-client.js +9 -0
  41. package/src/http-server/websocket-events-host.js +42 -12
  42. package/src/http-server/worker-handler/in-process.js +53 -14
  43. package/src/http-server/worker-handler/index.js +88 -18
  44. package/src/http-server/worker-handler/worker-thread.js +2 -2
@@ -374,7 +374,7 @@ export default class VelociousHttpServerClientWebsocketSession {
374
374
  */
375
375
  sendGoodbye(client) {
376
376
  const frame = Buffer.from([WEBSOCKET_FINAL_FRAME | WEBSOCKET_OPCODE_CLOSE, 0x00]);
377
- client.events.emit("output", frame);
377
+ client.events.emit("output", frame, { websocketFrame: true });
378
378
  }
379
379
  /**
380
380
  * Runs handle message.
@@ -845,7 +845,7 @@ export default class VelociousHttpServerClientWebsocketSession {
845
845
  const header = Buffer.alloc(2);
846
846
  header[0] = WEBSOCKET_FINAL_FRAME | opcode;
847
847
  header[1] = payload.length;
848
- this.client.events.emit("output", Buffer.concat([header, payload]));
848
+ this.client.events.emit("output", Buffer.concat([header, payload]), { websocketFrame: true });
849
849
  }
850
850
  /**
851
851
  * Runs send json.
@@ -885,7 +885,7 @@ export default class VelociousHttpServerClientWebsocketSession {
885
885
  header.writeBigUInt64BE(BigInt(payload.length), 2);
886
886
  }
887
887
  header[0] = WEBSOCKET_FINAL_FRAME | WEBSOCKET_OPCODE_TEXT;
888
- this.client.events.emit("output", Buffer.concat([header, payload]));
888
+ this.client.events.emit("output", Buffer.concat([header, payload]), { websocketFrame: true });
889
889
  }
890
890
  /**
891
891
  * Flushes the paused outbound queue over the current socket.
@@ -1704,4 +1704,4 @@ export default class VelociousHttpServerClientWebsocketSession {
1704
1704
  }
1705
1705
  }
1706
1706
  }
1707
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsbUVBQW1FO0FBQ25FLE1BQU0sK0JBQStCLEdBQUcsc0NBQXNDLENBQUE7QUFFOUUsTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUV4Riw2REFBNkQ7QUFDN0QsTUFBTSwwQ0FBMEMsR0FBRyxJQUFJLENB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QUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHt3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL3dlYnNvY2tldC1ldmVudC1sb2ctc3RvcmUuanNcIlxuXG5jb25zdCBXRUJTT0NLRVRfRklOQUxfRlJBTUUgPSAweDgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTiA9IDB4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSA9IDB4MlxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuLyoqIENhcCBvbiB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlOyBvbGRlc3QgZnJhbWVzIGRyb3Agb24gb3ZlcmZsb3cuICovXG5jb25zdCBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCA9IDEwMDBcblxuLyoqIENhcCBvbiB0b3RhbCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0XG5cbi8qKiBDYXAgb24gcGF5bG9hZCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZmluYWwgZGF0YSBmcmFtZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMgPSBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuXG5jb25zdCBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UID0gQmlnSW50KFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMpXG5cbi8qKiBDYXAgb24gZnJhZ21lbnQgY291bnQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UUyA9IDEwMjRcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwge3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YT86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBSZWNvcmQ8c3RyaW5nLCA/Pn0gV2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIFJ1bnMgc3Vic2NyaWJlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCBudWxsfSAtIFN1YnNjcmliZSBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnR5cGUgPT09IFwic3Vic2NyaWJlXCJcbiAgICA/IC8qKiBAdHlwZSB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gKi8gKG1lc3NhZ2UpXG4gICAgOiBudWxsXG59XG5cbi8qKlxuICogUnVucyByZXF1ZXN0IG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBudWxsfSAtIFJlcXVlc3QgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKG1lc3NhZ2UudHlwZSAmJiBtZXNzYWdlLnR5cGUgIT09IFwicmVxdWVzdFwiKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAvKiogQHR5cGUge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ319ICovIChtZXNzYWdlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBpZGVudGl0eSB2YWx1ZXMgZnJvbSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLlxuICogTnVsbGlzaCB2YWx1ZXMgY29tcGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGJ1dCBub3QgdG8gYSByZWFsIGlkZW50aXR5LlxuICogUGxhaW4gb2JqZWN0cyBhcmUgY29tcGFyZWQgdmlhIEpTT04gcm91bmQtdHJpcCBzbyBhcHBzIGNhbiByZXR1cm4gYVxuICogYHt1c2VySWQsIHRlbmFudElkfWAtc3R5bGUgb2JqZWN0IHdpdGhvdXQgYnVpbGRpbmcgdGhlaXIgb3duIGVxdWFsaXR5LlxuICogQHBhcmFtIHs/fSBhIC0gUGF1c2VkLXRpbWUgaWRlbnRpdHkuXG4gKiBAcGFyYW0gez99IGIgLSBSZXN1bWUtdGltZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgd2hlbiB0aGUgdHdvIGlkZW50aXRpZXMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0aWVzTWF0Y2goYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWVcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50V2Vic29ja2V0U2Vzc2lvbiB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdWJzY3JpcHRpb25zID0gbmV3IFNldCgpXG4gIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gIHN1YnNjcmlwdGlvbkhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGhhbmRsZXJTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxUZW5hbnRzID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxSZXBsYXlTdGF0ZXMgPSBuZXcgTWFwKClcbiAgLyoqXG4gICAqIE1lc3NhZ2UgcXVldWUuXG4gICAqIEB0eXBlIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVtdfSAqL1xuICBtZXNzYWdlUXVldWUgPSBbXVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJQcm9taXNlXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIgcHJvbWlzZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIHVwZ3JhZGVSZXF1ZXN0LCBtZXNzYWdlSGFuZGxlciwgbWVzc2FnZUhhbmRsZXJQcm9taXNlfSkge1xuICAgIC8qKiBAdHlwZSB7QnVmZmVyW119ICovXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRGcmFtZUNvcHlCeXRlcyA9IDBcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnVwZ3JhZGVSZXF1ZXN0ID0gdXBncmFkZVJlcXVlc3RcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXJcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IG1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gQm9vbGVhbihtZXNzYWdlSGFuZGxlclByb21pc2UpXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIExvbmctbGl2ZWQgcGVyLXNlc3Npb24gc3RhdGUgYmFnLiBTdGFibGUgYWNyb3NzIHJlY29ubmVjdHMgb25jZVxuICAgICAqIGdyYWNlLXBlcmlvZCByZXN1bXB0aW9uIGxhbmRzIGluIFBoYXNlIDI7IHRvZGF5IGl0IGp1c3QgbGl2ZXNcbiAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59XG4gICAgICovXG4gICAgdGhpcy5kYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vd2Vic29ja2V0LWNvbm5lY3Rpb24uanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywge2NoYW5uZWxUeXBlOiBzdHJpbmcsIHN1YnNjcmlwdGlvbjogaW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdH0+fSAqL1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWQgYXNzaWduZWQgdG8gdGhpcyBzZXNzaW9uIG9uIGZpcnN0IGNvbm5lY3QuIFNlbnQgdG8gdGhlXG4gICAgICogY2xpZW50IHZpYSBgc2Vzc2lvbi1lc3RhYmxpc2hlZGA7IHRoZSBjbGllbnQgZWNob2VzIGl0IGJhY2sgdmlhXG4gICAgICogYHNlc3Npb24tcmVzdW1lYCBhZnRlciBhIFdTIGRyb3AgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAgICogd2l0aGluIHRoZSBncmFjZSBwZXJpb2QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnNlc3Npb25JZCA9IHJhbmRvbVVVSUQoKVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtib29sZWFufSAtIHRydWUgYWZ0ZXIgYF9oYW5kbGVDbG9zZWAgcGF1c2VzIGluc3RlYWQgb2YgdGVhcmluZyBkb3duLlxuICAgICAqL1xuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PD8+fSAtIGZyYW1lcyBwcm9kdWNlZCB3aGlsZSBwYXVzZWQ7IGZsdXNoZWQgb24gcmVzdW1lLlxuICAgICAqL1xuICAgIHRoaXMuX291dGJvdW5kUXVldWUgPSBbXVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGFpbCBvZiBhIHBlci1zZXNzaW9uIHByb21pc2UgY2hhaW4gdGhhdCBzZXJpYWxpemVzIG1lc3NhZ2VcbiAgICAgKiBoYW5kbGluZy4gUHJldmVudHMgcmFjZXMgd2hlcmUgbWVzc2FnZSBCIHJlYWRzIGBzZXNzaW9uLmRhdGFgXG4gICAgICogYmVmb3JlIG1lc3NhZ2UgQSdzIGhhbmRsZXIgZmluaXNoZXMgd3JpdGluZyBpdCAoZS5nLiBhXG4gICAgICogY29ubmVjdGlvbi1tZXNzYWdlIHNldHRpbmcgdGhlIGxvY2FsZSB2cy4gYSBzdWJzZXF1ZW50IHJlcXVlc3RcbiAgICAgKiB3aG9zZSBhcm91bmRSZXF1ZXN0IHdyYXBwZXIgcmVhZHMgaXQpLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHRoaXMuX21lc3NhZ2VDaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF1dGggaWRlbnRpdHkgY2FwdHVyZWQgYXQgcGF1c2VcbiAgICAgKiB0aW1lIGJ5IGBnZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcmAuIEF3YWl0ZWQgYXQgcmVzdW1lXG4gICAgICogdGltZSB0byBjb21wYXJlIGFnYWluc3QgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5LiBVbmRlZmluZWRcbiAgICAgKiBvbiBhIGxpdmUgKG5vbi1wYXVzZWQpIHNlc3Npb24uXG4gICAgICogQHR5cGUge1Byb21pc2U8Pz4gfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBBY2N1bXVsYXRlcyBwYXlsb2FkcyBmb3IgYSBmcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIHBlclxuICAgICAqIFJGQyA2NDU1LiBOb24tbnVsbCB3aGlsZSBtaWQtZnJhZ21lbnQ7IGNsZWFyZWQgd2hlbiB0aGUgZnJhbWVcbiAgICAgKiB3aXRoIEZJTj0xIGNvbXBsZXRlcyBhbmQgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QnVmZmVyW10gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIE9wY29kZSAoVEVYVC9CSU5BUlkpIGNhcHR1cmVkIGZyb20gdGhlIGZpcnN0IGZyYW1lIG9mIGFcbiAgICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIENvbnRpbnVhdGlvbiBmcmFtZXMgKG9wY29kZSAwKSBpbmhlcml0IGl0XG4gICAgICogYXQgcmVhc3NlbWJseSB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXIgfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBSdW5uaW5nIGJ5dGUgdG90YWwgZm9yIGBfZnJhZ21lbnRlZFBheWxvYWRzYC4gVXNlZCB0byBlbmZvcmNlXG4gICAgICogYFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTYCBzbyBhIHBlZXIgY2Fubm90XG4gICAgICogZXhoYXVzdCBtZW1vcnkgYnkgc3RyZWFtaW5nIG5vbi1maW5hbCBmcmFnbWVudHMgaW5kZWZpbml0ZWx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5hZGQodGhpcylcblxuICAgIC8qKlxuICAgICAqIEhlYXJ0YmVhdCBsaXZlbmVzcyBmbGFnLiBTZXQgdHJ1ZSBvbiBldmVyeSBpbmJvdW5kIGZyYW1lXG4gICAgICogKGluY2x1ZGluZyB0aGUgY2xpZW50J3MgYXV0by1wb25nKSBhbmQgY2xlYXJlZCBlYWNoIHRpbWUgYSBwaW5nXG4gICAgICogaXMgc2VudDsgYSBzdGlsbC1mYWxzZSBmbGFnIGF0IHRoZSBuZXh0IHRpY2sgbWVhbnMgdGhlIHNvY2tldFxuICAgICAqIGhhcyBnb25lIHNpbGVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIFBlci1zZXNzaW9uIGhlYXJ0YmVhdCBpbnRlcnZhbCBoYW5kbGUuIFN0YXJ0ZWQgZnJvbVxuICAgICAqIGBzZW5kU2Vzc2lvbkVzdGFibGlzaGVkYCBvbmNlIHRoZSBzb2NrZXQgaXMgbGl2ZSwgbm90IGF0XG4gICAgICogY29uc3RydWN0aW9uLCBzbyBkaXJlY3RseS1jb25zdHJ1Y3RlZCBzZXNzaW9ucyBpbiB0ZXN0cyBkb24ndFxuICAgICAqIHNwaW4gdXAgYSBiYWNrZ3JvdW5kIHRpbWVyLlxuICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBjbGllbnQgaXRzIHNlc3Npb25JZCArIGdyYWNlIHdpbmRvdy4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50YCBhZnRlciB0aGUgV1MgdXBncmFkZSBjb21wbGV0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZCgpIHtcbiAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgIHR5cGU6IFwic2Vzc2lvbi1lc3RhYmxpc2hlZFwiLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIGdyYWNlU2Vjb25kczogdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25HcmFjZVNlY29uZHM/LigpIHx8IDMwMFxuICAgIH0pXG5cbiAgICAvLyBUaGUgc29ja2V0IGlzIGxpdmUgbm93LCBzbyBiZWdpbiByZWFwaW5nIGl0IGlmIGl0IGdvZXMgc2lsZW50LlxuICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xvc2VkIGNvbm5lY3Rpb24gZnJvbSB0aGUgc2Vzc2lvbiByZWdpc3RyeS4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNXZWJzb2NrZXRDb25uZWN0aW9uLmNsb3NlKClgIGFmdGVyIGl0IHNlbmRzIHRoZSBmaW5hbFxuICAgKiBgY29ubmVjdGlvbi1jbG9zZWRgIGZyYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29ubmVjdGlvbklkIC0gQ2xvc2VkIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbklkKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIENsaWVudC1wcm92aWRlZCBtZXRhZGF0YSAoZGVmZW5zaXZlIGNvcHkpLlxuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHsuLi50aGlzLl9tZXRhZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHBhdXNlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBpbiB0aGUgcGF1c2VkL2dyYWNlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdXNlZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZFN1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGFubmVsKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkRhdGEoZGF0YSkge1xuICAgIC8vIEFueSBpbmJvdW5kIGJ5dGVzIOKAlCBhIGRhdGEgZnJhbWUsIHRoZSBhdXRvLXBvbmcgYW5zd2VyaW5nIG91clxuICAgIC8vIGhlYXJ0YmVhdCwgb3IgYSBwYXJ0aWFsIGZyYW1lIHN0aWxsIGJlaW5nIHVwbG9hZGVkIOKAlCBwcm92ZSB0aGVcbiAgICAvLyBzb2NrZXQgaXMgYWxpdmUuIE1hcmsgaXQgaGVyZSwgYmVmb3JlIGBfcHJvY2Vzc0J1ZmZlcmAgbWF5IHJldHVyblxuICAgIC8vIGVhcmx5IHdhaXRpbmcgZm9yIHRoZSByZXN0IG9mIGFuIGluY29tcGxldGUgZnJhbWUuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIHRoaXMuX2J1ZmZlckNodW5rcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBkYXRhLmxlbmd0aFxuICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7P30gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHt7Y3JlYXRlZEF0Pzogc3RyaW5nLCBldmVudElkPzogc3RyaW5nLCByZXBsYXllZD86IGJvb2xlYW4sIHNlcXVlbmNlPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY2hhbm5lbEhhbmRsZXJzID0gdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbClcbiAgICBjb25zdCBoYXNDaGFubmVsSGFuZGxlcnMgPSBCb29sZWFuKGNoYW5uZWxIYW5kbGVycyAmJiBjaGFubmVsSGFuZGxlcnMuc2l6ZSA+IDApXG4gICAgY29uc3QgcmVwbGF5U3RhdGUgPSB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAocmVwbGF5U3RhdGU/LnJlcGxheWluZyAmJiAhb3B0aW9ucy5yZXBsYXllZCkge1xuICAgICAgcmVwbGF5U3RhdGUuYnVmZmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKGNoYW5uZWwpICYmICFoYXNDaGFubmVsSGFuZGxlcnMpIHJldHVyblxuXG4gICAgaWYgKGhhc0NoYW5uZWxIYW5kbGVycykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShjaGFubmVsSGFuZGxlcnMpLm1hcChhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChoYW5kbGVyKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLnJlY2VpdmVkQnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgZXZlbnRJZDogb3B0aW9ucy5ldmVudElkLFxuICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgICAgICAgICAgc2VxdWVuY2U6IG9wdGlvbnMuc2VxdWVuY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICBjaGFubmVsLFxuICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgIHBheWxvYWQsXG4gICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlLFxuICAgICAgdHlwZTogXCJldmVudFwiXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluaXRpYWxpemUgY2hhbm5lbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpXG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe30pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbCAmJiAhKGNoYW5uZWwgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGdvb2RieWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRHb29kYnllKGNsaWVudCkge1xuICAgIGNvbnN0IGZyYW1lID0gQnVmZmVyLmZyb20oW1dFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UsIDB4MDBdKVxuXG4gICAgY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGZyYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgLy8gU2VyaWFsaXplIHBlci1zZXNzaW9uOiBjaGFpbiBvbnRvIGBfbWVzc2FnZUNoYWluYCBzbyBtZXNzYWdlc1xuICAgIC8vIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZS4gV2l0aG91dCB0aGlzLCBmaXJlLWFuZC1mb3JnZXRcbiAgICAvLyBkaXNwYXRjaCBmcm9tIGBfcHJvY2Vzc0J1ZmZlcmAgbGV0cyBtZXNzYWdlIEIgcmVhZFxuICAgIC8vIGBzZXNzaW9uLmRhdGFgIGJlZm9yZSBBIGhhcyBmaW5pc2hlZCB3cml0aW5nIGl0LlxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLnRoZW4oKCkgPT4gdGhpcy5fZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UpKVxuXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gbmV4dC5jYXRjaCgoKSA9PiB7fSlcbiAgICBhd2FpdCBuZXh0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkaXNwYXRjaCBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRBcm91bmRSZXF1ZXN0Py4oKVxuXG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIGF3YWl0IHdyYXBwZXIodGhpcywgKCkgPT4gdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdHVhbCBtZXNzYWdlIGRpc3BhdGNoLCBleHRyYWN0ZWQgc29cbiAgICogYGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdCgpYCBjYW4gd3JhcCBpdCBpbiBhbnlcbiAgICogcGVyLXJlcXVlc3QgY29udGV4dCAoQXN5bmNMb2NhbFN0b3JhZ2UsIHRyYWNpbmcsIGV0Yy4pLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gRGVjb2RlZCBjbGllbnQgZnJhbWUgdG8gZGlzcGF0Y2ggYnkgbWVzc2FnZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlSW5uZXIobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIG1lc3NhZ2VIYW5kbGVyIHNob3J0LWNpcmN1aXRzIGRlZmF1bHQgcm91dGluZyBvbmx5IHdoZW4gdGhlXG4gICAgLy8gYXBwIGFjdHVhbGx5IGRlY2xhcmVkIGFuIGBvbk1lc3NhZ2VgIGhvb2suIEFwcHMgdGhhdCBvbmx5IHdhbnRcbiAgICAvLyBzZXNzaW9uLWxpZmVjeWNsZSB0cmFja2luZyAoYG9uT3BlbmAvYG9uQ2xvc2VgKSBzdGlsbCBuZWVkIHRoZVxuICAgIC8vIGJ1aWx0LWluIHN1YnNjcmliZS9jb25uZWN0aW9uL2NoYW5uZWwtc3Vic2NyaWJlIHJvdXRpbmcgYmVsb3csXG4gICAgLy8gb3RoZXJ3aXNlIGV2ZXJ5IGluY29taW5nIG1lc3NhZ2UgaXMgc2lsZW50bHkgZHJvcHBlZC5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlciAmJiB0eXBlb2YgdGhpcy5tZXNzYWdlSGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpYmVQYXlsb2FkID0gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgaWYgKHN1YnNjcmliZVBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSA9IHN1YnNjcmliZVBheWxvYWRcblxuICAgICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIGlzIHJlcXVpcmVkIGZvciBzdWJzY3JpYmVcIilcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJtZXRhZGF0YVwiKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YVBheWxvYWQgPSAvKiogQHR5cGUge3tkYXRhPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAobWVzc2FnZSlcblxuICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YVBheWxvYWQuZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGFQYXlsb2FkLmRhdGEgPT09IFwib2JqZWN0XCIgPyB7Li4ubWV0YWRhdGFQYXlsb2FkLmRhdGF9IDoge31cblxuICAgICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCh0aGlzLl9tZXRhZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5cIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC11bnN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmICghcmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7Ym9keSwgaGVhZGVycywgaWQsIG1ldGhvZCwgcGF0aH0gPSByZXF1ZXN0UGF5bG9hZFxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihcIm1ldGhvZCBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghcGF0aCkgdGhyb3cgbmV3IEVycm9yKFwicGF0aCBpcyByZXF1aXJlZFwiKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBXZWJzb2NrZXRSZXF1ZXN0KHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0TWV0YWRhdGEoKSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLnJlbW90ZUFkZHJlc3MoKVxuICAgIH0pXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3RcbiAgICB9KVxuXG4gICAgcmVxdWVzdFJ1bm5lci5ldmVudHMub24oXCJkb25lXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdFJ1bm5lci5yZXNwb25zZVxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgICAgdm9pZCByZXF1ZXN0UnVubmVyLmxvZ0NvbXBsZXRlZFJlcXVlc3QoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBsb2cgY29tcGxldGVkIHJlcXVlc3RcIiwgZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcm9jZXNzIGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPj0gMikge1xuICAgICAgY29uc3QgaW5pdGlhbEhlYWRlciA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKDIpXG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSBpbml0aWFsSGVhZGVyWzBdXG4gICAgICBjb25zdCBzZWNvbmRCeXRlID0gaW5pdGlhbEhlYWRlclsxXVxuICAgICAgY29uc3QgaXNGaW5hbCA9IChmaXJzdEJ5dGUgJiBXRUJTT0NLRVRfRklOQUxfRlJBTUUpID09PSBXRUJTT0NLRVRfRklOQUxfRlJBTUVcbiAgICAgIGNvbnN0IG9wY29kZSA9IGZpcnN0Qnl0ZSAmIDB4MEZcbiAgICAgIGNvbnN0IGlzTWFza2VkID0gKHNlY29uZEJ5dGUgJiAweDgwKSA9PT0gMHg4MFxuICAgICAgbGV0IHBheWxvYWRMZW5ndGggPSBzZWNvbmRCeXRlICYgMHg3RlxuICAgICAgbGV0IG9mZnNldCA9IDJcblxuICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IG9mZnNldCArIDIpIHJldHVyblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMob2Zmc2V0ICsgMikucmVhZFVJbnQxNkJFKG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IDJcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKG9mZnNldCArIDgpLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgaWYgKGJpZ0xlbmd0aCA+IFdFQlNPQ0tFVF9NQVhfSU5CT1VORF9GUkFNRV9CWVRFU19CSUdJTlQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgICAgICAgIFwiV2Vic29ja2V0IGZyYW1lIGV4Y2VlZGVkIGJ5dGUgY2FwOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgICAgICAgIHtmcmFtZUJ5dGVzOiBiaWdMZW5ndGgudG9TdHJpbmcoKSwgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVN9XG4gICAgICAgICAgXSlcbiAgICAgICAgICB0aGlzLl9jbG9zZUZvckluYm91bmRMaW1pdCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gTnVtYmVyKGJpZ0xlbmd0aClcbiAgICAgICAgb2Zmc2V0ICs9IDhcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFza0xlbmd0aCA9IGlzTWFza2VkID8gNCA6IDBcblxuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aFxuXG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IGZyYW1lTGVuZ3RoKSByZXR1cm5cblxuICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLl9jb25zdW1lQnVmZmVyZWRCeXRlcyhmcmFtZUxlbmd0aClcblxuICAgICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgcGF5bG9hZCA9IGZyYW1lLnN1YmFycmF5KG9mZnNldCArIG1hc2tMZW5ndGgsIGZyYW1lTGVuZ3RoKVxuXG4gICAgICBpZiAoaXNNYXNrZWQpIHtcbiAgICAgICAgY29uc3QgbWFzayA9IGZyYW1lLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbWFza0xlbmd0aClcbiAgICAgICAgdGhpcy5fdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKVxuICAgICAgfVxuXG4gICAgICAvLyBDb250cm9sIGZyYW1lcyAob3Bjb2RlID49IDB4OCkgbXVzdCBub3QgYmUgZnJhZ21lbnRlZCBwZXJcbiAgICAgIC8vIFJGQyA2NDU1IGFuZCBjYW4gYXJyaXZlIGludGVybGVhdmVkIHdpdGggYSBmcmFnbWVudGVkIGRhdGFcbiAgICAgIC8vIG1lc3NhZ2UuIEhhbmRsZSB0aGVtIGZpcnN0IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGZyYWdtZW50XG4gICAgICAvLyBhY2N1bXVsYXRvci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUElORykge1xuICAgICAgICB0aGlzLl9zZW5kQ29udHJvbEZyYW1lKFdFQlNPQ0tFVF9PUENPREVfUE9ORywgcGF5bG9hZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DTE9TRSkge1xuICAgICAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUE9ORykge1xuICAgICAgICAvLyBBbnN3ZXIgdG8gYSBoZWFydGJlYXQgcGluZzsgbGl2ZW5lc3MgaXMgcmVjb3JkZWQgaW4gb25EYXRhLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID49IDB4OCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgY29udHJvbCBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIERhdGEgZnJhbWUgKFRFWFQvQklOQVJZL0NPTlRJTlVBVElPTikuIFJlYXNzZW1ibGUgZnJhZ21lbnRzXG4gICAgICAvLyBiZWZvcmUgZGlzcGF0Y2hpbmcuIEJyb3dzZXJzIChDaHJvbWUpIGxlZ2l0aW1hdGVseSBmcmFnbWVudFxuICAgICAgLy8gbG9uZ2VyIGNsaWVudOKGknNlcnZlciB0ZXh0IGZyYW1lczsgYSBwcmlvciB2ZXJzaW9uIGRyb3BwZWRcbiAgICAgIC8vIGV2ZXJ5IGZyYWdtZW50ZWQgbWVzc2FnZSBzaWxlbnRseSwgc28gYW55IHBheWxvYWQgbGFyZ2VcbiAgICAgIC8vIGVub3VnaCB0byBoaXQgdGhlIGJyb3dzZXIncyBmcmFnbWVudGF0aW9uIHRocmVzaG9sZFxuICAgICAgLy8gKGUuZy4gYSBjaGFubmVsLXN1YnNjcmliZSB3aXRoIGFuIGF1dGggdG9rZW4pIG5ldmVyIHJlYWNoZWRcbiAgICAgIC8vIHRoZSBoYW5kbGVyLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBjb250aW51YXRpb24gZnJhbWUgd2l0aCBubyBmcmFnbWVudGVkIG1lc3NhZ2UgaW4gcHJvZ3Jlc3NcIilcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hcHBlbmRGcmFnbWVudChwYXlsb2FkKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCB8fCBvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgbmV3IGRhdGEgZnJhbWUgd2hpbGUgYSBmcmFnbWVudGVkIG1lc3NhZ2Ugd2FzIGluIHByb2dyZXNzOyBkaXNjYXJkaW5nIHByaW9yIGZyYWdtZW50c1wiKVxuICAgICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gW3BheWxvYWRdXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG9wY29kZVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IHBheWxvYWQubGVuZ3RoXG5cbiAgICAgICAgICBpZiAoIXRoaXMuX2VuZm9yY2VGcmFnbWVudExpbWl0cygpKSByZXR1cm5cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmVzIGZpbmFsUGF5bG9hZC5cbiAgICAgICAqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgZmluYWxQYXlsb2FkXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxPcGNvZGUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgbGV0IGZpbmFsT3Bjb2RlXG5cbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBCdWZmZXIuY29uY2F0KHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcylcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPz8gV0VCU09DS0VUX09QQ09ERV9URVhUXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbE9wY29kZSAhPT0gV0VCU09DS0VUX09QQ09ERV9URVhUKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZSBhZnRlciByZWFzc2VtYmx5OiAke2ZpbmFsT3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGZpbmFsUGF5bG9hZC50b1N0cmluZyhcInV0Zi04XCIpKVxuXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IFwiSW52YWxpZCB3ZWJzb2NrZXQgbWVzc2FnZVwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIGxlYWRpbmcgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBjb25zdW1pbmcgdGhlbS4gSGVhZGVyXG4gICAqIGluc3BlY3Rpb24gaXMgYm91bmRlZCB0byB0aGUgd2Vic29ja2V0IGhlYWRlciBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYnl0ZUNvdW50IC0gTnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBDb3BpZWQgcHJlZml4LlxuICAgKi9cbiAgX3BlZWtCdWZmZXJlZEJ5dGVzKGJ5dGVDb3VudCkge1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShieXRlQ291bnQpXG4gICAgbGV0IGNvcGllZEJ5dGVzID0gMFxuICAgIGxldCBjaHVua09mZnNldCA9IHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0XG5cbiAgICBmb3IgKGxldCBjaHVua0luZGV4ID0gdGhpcy5fYnVmZmVyQ2h1bmtJbmRleDsgY2h1bmtJbmRleCA8IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGg7IGNodW5rSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9idWZmZXJDaHVua3NbY2h1bmtJbmRleF1cbiAgICAgIGNvbnN0IGJ5dGVzRnJvbUNodW5rID0gTWF0aC5taW4oY2h1bmsubGVuZ3RoIC0gY2h1bmtPZmZzZXQsIGJ5dGVDb3VudCAtIGNvcGllZEJ5dGVzKVxuXG4gICAgICBjaHVuay5jb3B5KHByZWZpeCwgY29waWVkQnl0ZXMsIGNodW5rT2Zmc2V0LCBjaHVua09mZnNldCArIGJ5dGVzRnJvbUNodW5rKVxuICAgICAgY29waWVkQnl0ZXMgKz0gYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIGNodW5rT2Zmc2V0ID0gMFxuICAgICAgaWYgKGNvcGllZEJ5dGVzID09PSBieXRlQ291bnQpIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGEgY29tcGxldGUgZnJhbWUgZnJvbSB0aGUgY2h1bmsgcXVldWUgd2l0aCBvbmUgYm91bmRlZCBjb3B5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYnl0ZUNvdW50IC0gQ29tcGxldGUgZnJhbWUgYnl0ZSBjb3VudC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBDb250aWd1b3VzIGZyYW1lIGJ5dGVzLlxuICAgKi9cbiAgX2NvbnN1bWVCdWZmZXJlZEJ5dGVzKGJ5dGVDb3VudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShieXRlQ291bnQpXG4gICAgbGV0IGNvcGllZEJ5dGVzID0gMFxuXG4gICAgd2hpbGUgKGNvcGllZEJ5dGVzIDwgYnl0ZUNvdW50KSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2J1ZmZlckNodW5rc1t0aGlzLl9idWZmZXJDaHVua0luZGV4XVxuICAgICAgY29uc3QgYnl0ZXNGcm9tQ2h1bmsgPSBNYXRoLm1pbihjaHVuay5sZW5ndGggLSB0aGlzLl9idWZmZXJDaHVua09mZnNldCwgYnl0ZUNvdW50IC0gY29waWVkQnl0ZXMpXG5cbiAgICAgIGNodW5rLmNvcHkoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgY29waWVkQnl0ZXMsXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0LFxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCArIGJ5dGVzRnJvbUNodW5rXG4gICAgICApXG4gICAgICBjb3BpZWRCeXRlcyArPSBieXRlc0Zyb21DaHVua1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgKz0gYnl0ZXNGcm9tQ2h1bmtcblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID09PSBjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCArPSAxXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9idWZmZXJDaHVua0luZGV4ID09PSB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA+PSA2NCAmJlxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCAqIDIgPj0gdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gdGhpcy5fYnVmZmVyQ2h1bmtzLnNsaWNlKHRoaXMuX2J1ZmZlckNodW5rSW5kZXgpXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIH1cblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gYnl0ZUNvdW50XG4gICAgdGhpcy5fYnVmZmVyZWRGcmFtZUNvcHlCeXRlcyArPSBieXRlQ291bnRcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhbGwgaW5jb21wbGV0ZSBmcmFtZSBjaHVua3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2NsZWFyQnVmZmVyZWRGcmFtZUNodW5rcygpIHtcbiAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWZ0ZXIgYW4gaW5ib3VuZCBidWZmZXJpbmcgbGltaXQgYW5kIHJlbGVhc2VzIGFsbCBwYXJzZXItb3duZWQgaW5wdXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2Nsb3NlRm9ySW5ib3VuZExpbWl0KCkge1xuICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgIHRoaXMuX2NsZWFyQnVmZmVyZWRGcmFtZUNodW5rcygpXG4gICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNvbnRpbnVhdGlvbi1mcmFtZSBwYXlsb2FkIHRvIHRoZSBpbi1wcm9ncmVzc1xuICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWRcbiAgICogYW5kIGZhbHNlIHdoZW4gdGhlIHBlci1tZXNzYWdlIGNhcCB3YXMgaGl0IGFuZCB0aGUgc29ja2V0IGhhc1xuICAgKiBiZWVuIGNsb3NlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBDb250aW51YXRpb24tZnJhbWUgYnl0ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWQuXG4gICAqL1xuICBfYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkge1xuICAgIC8vIEd1YXJkIHB1c2hpbmcgZmlyc3Qgc28gYF9lbmZvcmNlRnJhZ21lbnRMaW1pdHNgIHNlZXMgdGhlIGZpbmFsXG4gICAgLy8gc3RhdGU7IG9uIG92ZXJmbG93IHRoZSByZXNldCBpbnNpZGUgdGhlIGVuZm9yY2VyIGRyb3BzIHRoZVxuICAgIC8vIGJ1ZmZlcmVkIGZyYWdtZW50cy5cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHM/LnB1c2gocGF5bG9hZClcbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgKz0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHJldHVybiB0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBmcmFnbWVudGVkIG1lc3NhZ2UgaGFzIG5vdCBleGNlZWRlZCB0aGUgYnl0ZSBvclxuICAgKiBmcmFnbWVudC1jb3VudCBjYXBzLiBPbiBvdmVyZmxvdywgY2xlYXJzIHRoZSBidWZmZXIsIHNlbmRzIGFcbiAgICogY2xvc2UgZnJhbWUsIGFuZCB0ZWFycyB0aGUgc2Vzc2lvbiBkb3duLiBSZXR1cm5zIHRydWUgd2hlbiB0aGVcbiAgICogY2FsbGVyIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nLCBmYWxzZSB3aGVuIHRoZSBzZXNzaW9uIGlzIGJlaW5nXG4gICAqIGNsb3NlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmcmFnbWVudCBwcm9jZXNzaW5nIG1heSBjb250aW51ZS5cbiAgICovXG4gIF9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSB7XG4gICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGZyYWdtZW50Q291bnQgPSB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMubGVuZ3RoXG4gICAgY29uc3Qgb3ZlckJ5dGVzID0gdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVNcbiAgICBjb25zdCBvdmVyRnJhZ21lbnRzID0gZnJhZ21lbnRDb3VudCA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuXG4gICAgaWYgKCFvdmVyQnl0ZXMgJiYgIW92ZXJGcmFnbWVudHMpIHJldHVybiB0cnVlXG5cbiAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgIFwiRnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBleGNlZWRlZCBjYXBzOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgIHtcbiAgICAgICAgZnJhZ21lbnRCeXRlczogdGhpcy5fZnJhZ21lbnRlZEJ5dGVzLFxuICAgICAgICBmcmFnbWVudENvdW50LFxuICAgICAgICBtYXhCeXRlczogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMsXG4gICAgICAgIG1heEZyYWdtZW50czogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG4gICAgICB9XG4gICAgXSlcblxuICAgIHRoaXMuX2Nsb3NlRm9ySW5ib3VuZExpbWl0KClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzZXQgZnJhZ21lbnQgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKSB7XG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0LiBFYWNoIHRpY2sgcGluZ3MgdGhlIGNsaWVudCBhbmRcbiAgICogcmVhcHMgdGhlIHNlc3Npb24gaWYgdGhlIHByZXZpb3VzIHBpbmcgd2VudCB1bmFuc3dlcmVkLCBzbyBhXG4gICAqIGhhbGYtb3BlbiBzb2NrZXQgKGNsaWVudCBnb25lIHdpdGhvdXQgYSBUQ1AgRklOIC8gY2xvc2UgZnJhbWUpXG4gICAqIGNhbm5vdCBsaW5nZXIgZm9yZXZlciBob2xkaW5nIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gRGlzYWJsZWQgd2hlblxuICAgKiB0aGUgY29uZmlndXJlZCBpbnRlcnZhbCBpcyAwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICBjb25zdCBpbnRlcnZhbFNlY29uZHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkhlYXJ0YmVhdFNlY29uZHMoKVxuXG4gICAgaWYgKCFpbnRlcnZhbFNlY29uZHMgfHwgaW50ZXJ2YWxTZWNvbmRzIDw9IDApIHJldHVyblxuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9oZWFydGJlYXRUaWNrKCksIGludGVydmFsU2Vjb25kcyAqIDEwMDApXG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLlxuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBoZWFydGJlYXQgY3ljbGUuIFJlYXBzIHRoZSBzZXNzaW9uIHZpYSB0aGUgbm9ybWFsIGNsb3NlIHBhdGhcbiAgICogd2hlbiB0aGUgcHJldmlvdXMgcGluZyB3YXMgbm90IGFuc3dlcmVkOyBvdGhlcndpc2UgbWFya3MgaXRcbiAgICogcGVuZGluZyBhbmQgcGluZ3MgYWdhaW4uIEJyb3dzZXJzIGFuZCBSZWFjdCBOYXRpdmUgc29ja2V0cyBhbnN3ZXJcbiAgICogc2VydmVyIHBpbmdzIHdpdGggYW4gYXV0b21hdGljIHBvbmcsIHdoaWNoIGxhbmRzIGluIGBfcHJvY2Vzc0J1ZmZlcmBcbiAgICogYW5kIHJlLW1hcmtzIHRoZSBzZXNzaW9uIGFsaXZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oZWFydGJlYXRUaWNrKCkge1xuICAgIGlmICh0aGlzLl9wYXVzZWQgfHwgIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9oZWFydGJlYXRBbGl2ZSkge1xuICAgICAgLy8gTm8gZnJhbWUgYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCBwaW5nIOKAlCB0aGUgc29ja2V0IGlzIGRlYWQuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGBfaGFuZGxlQ2xvc2VgIHNvIHJlc3VtYWJsZSBzdGF0ZSBzdGlsbCBwYXVzZXNcbiAgICAgIC8vIGZvciB0aGUgZ3JhY2Ugd2luZG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgdG9ybiBkb3duLlxuICAgICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BJTkcsIEJ1ZmZlci5hbGxvYygwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0IHRpbWVyLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3N0b3BIZWFydGJlYXQoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKVxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBjb250cm9sIGZyYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGpzb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN1YnNjcmliZSB0byBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3Vic2NyaXB0aW9uQ2hhbm5lbD86IHN0cmluZ319IFtvcHRpb25zXSAtIFN1YnNjcmliZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gd2FzIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZSA9IHRydWUsIGNoYW5uZWxIYW5kbGVyLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCBzdWJzY3JpcHRpb25DaGFubmVsfSA9IHt9KSB7XG4gICAgYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKS5tYXJrQ2hhbm5lbEludGVyZXN0ZWQoY2hhbm5lbClcblxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gYXdhaXQgdGhpcy5fcHJlcGFyZVJlcGxheVN0YXRlKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBsYXN0RXZlbnRJZCxcbiAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwgfHwgY2hhbm5lbCxcbiAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zXG4gICAgfSlcblxuICAgIGlmIChyZXBsYXlTdGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgIGlmIChyZXBsYXlTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLnNldChjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICB9XG5cbiAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihjaGFubmVsKVxuXG4gICAgaWYgKGNoYW5uZWxIYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuaGFzKGNoYW5uZWwpKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuc2V0KGNoYW5uZWwsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbCk/LmFkZChjaGFubmVsSGFuZGxlcilcblxuICAgICAgaWYgKCF0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsSGFuZGxlcikpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5zZXQoY2hhbm5lbEhhbmRsZXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZXIpPy5hZGQoY2hhbm5lbClcbiAgICB9XG5cbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2tub3dsZWRnZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgdHlwZTogXCJzdWJzY3JpYmVkXCJ9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2hhbmRsZUNsb3NlKCkge1xuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcImdyYWNlX2V4cGlyZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNvbmZpZ3VyZWQgaWRlbnRpdHkgcmVzb2x2ZXIgYWdhaW5zdCB0aGlzIHNlc3Npb24uXG4gICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHN0b3JlZCBhdCBwYXVzZSB0aW1lIGFuZCBhd2FpdGVkIGF0XG4gICAqIHJlc3VtZSB0aW1lIHNvIHdlIGNhbiByZWplY3QgcmVzdW1lIGF0dGVtcHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogYXV0aGVudGljYXRlZCBjYWxsZXIgKHNpZ25lZCBvdXQsIHN3YXBwZWQgdXNlciwgZXhwaXJlZCBjb29raWUpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBDYXB0dXJlZCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByZXN1bWUgdmFsaWRhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHBhdXNlXCIsIGVycm9yXSlcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uRGlzY29ubmVjdGAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBzb1xuICAgKiBhcHBzIGNhbiBwYXVzZSBwZXItaW5zdGFuY2Ugd29yayB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuXG4gICAqIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcmV0aHJvd24g4oCUIG9uZSBicm9rZW4gaGFuZGxlciBtdXN0IG5vdFxuICAgKiBibG9jayB0aGUgcmVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uRGlzY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvbkRpc2Nvbm5lY3RcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25SZXN1bWVgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgYWZ0ZXJcbiAgICogYSBzdWNjZXNzZnVsIGBzZXNzaW9uLXJlc3VtZWAgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uUmVzdW1lKCkge1xuICAgIGF3YWl0IHRoaXMuX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhcIm9uUmVzdW1lXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaXJlIGxpZmVjeWNsZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtcIm9uRGlzY29ubmVjdFwiIHwgXCJvblJlc3VtZVwifSBjYWxsYmFja05hbWUgTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGZpcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxpdmUgaGFuZGxlciBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBfZmlyZUxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbltjYWxsYmFja05hbWVdPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2Ake2NhbGxiYWNrTmFtZX0gZmFpbGVkIGZvciAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgY2hhbm5lbCBzdWIgJHtzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwifWAuIFRoaXMgc2Vzc2lvbiAodGhlIG5ld2x5LVxuICAgKiBjcmVhdGVkIG9uZSB3aG9zZSBzb2NrZXQganVzdCBjb25uZWN0ZWQpIHRyYW5zZmVycyBzdGF0ZSBmcm9tXG4gICAqIHRoZSBwYXVzZWQgc2Vzc2lvbiBhbmQgaW5zdHJ1Y3RzIHRoZSBjbGllbnQgdmlhXG4gICAqIGBzZXNzaW9uLXJlc3VtZWRgIG9yIGBzZXNzaW9uLWdvbmVgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gU2Vzc2lvbi1yZXN1bWUgZnJhbWUgY29udGFpbmluZyB0aGUgcGF1c2VkIHNlc3Npb24gaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdW1lU2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcblxuICAgIGlmICh0eXBlb2YgcmVzdW1lU2Vzc2lvbklkICE9PSBcInN0cmluZ1wiIHx8ICFyZXN1bWVTZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2VkID0gdGhpcy5jb25maWd1cmF0aW9uLl9maW5kUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBBdXRoIHJlLXZlcmlmeTogY29tcGFyZSB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkgYWdhaW5zdCB0aGVcbiAgICAvLyBvbmUgY2FwdHVyZWQgYXQgcGF1c2UuIE1pc21hdGNoIG1lYW5zIGEgZGlmZmVyZW50IHVzZXIgKG9yIGFcbiAgICAvLyBzaWduZWQtb3V0IHNlc3Npb24pIGlzIHRyeWluZyB0byByZWNsYWltIHN0YXRlIHRoYXQgaXNuJ3RcbiAgICAvLyB0aGVpcnMg4oCUIGRlc3Ryb3kgdGhlIHBhdXNlZCBzZXNzaW9uIG91dHJpZ2h0LlxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyPy4oKVxuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBwYXVzZWRJZGVudGl0eSA9IGF3YWl0IHBhdXNlZC5fcmVzdW1lSWRlbnRpdHlQcm9taXNlXG4gICAgICBsZXQgZnJlc2hJZGVudGl0eVxuXG4gICAgICB0cnkge1xuICAgICAgICBmcmVzaElkZW50aXR5ID0gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCByZXN1bWVcIiwgZXJyb3JdKVxuICAgICAgICBmcmVzaElkZW50aXR5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghaWRlbnRpdGllc01hdGNoKHBhdXNlZElkZW50aXR5LCBmcmVzaElkZW50aXR5KSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG4gICAgICAgIHBhdXNlZC5fZmluYWxpemVHcmFjZUV4cGlyeSgpXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICAvLyBUcmFuc2ZlciByZXN1bWFibGUgc3RhdGUgb250byB0aGlzIChsaXZlKSBzZXNzaW9uLiBUaGUgcGF1c2VkXG4gICAgLy8gc2Vzc2lvbiBzaGVsbCBpcyBkaXNjYXJkZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyLlxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb25JZCwgY29ubmVjdGlvbl0gb2YgcGF1c2VkLl9jb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJJZCwgZW50cnldIG9mIHBhdXNlZC5fY2hhbm5lbFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YklkLCBlbnRyeSlcbiAgICB9XG5cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHsuLi5wYXVzZWQuX21ldGFkYXRhfVxuICAgIHRoaXMuZGF0YSA9IHBhdXNlZC5kYXRhXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZXN1bWVTZXNzaW9uSWRcblxuICAgIC8vIFRyYW5zZmVyIGFueSBmcmFtZXMgcXVldWVkIHdoaWxlIHRoZSBwYXVzZWQgc2Vzc2lvbiBoYWQgbm9cbiAgICAvLyBzb2NrZXQuIFRoZXkgZmx1c2ggQUZURVIgc2Vzc2lvbi1yZXN1bWVkIHNvIHRoZSBjbGllbnQga25vd3NcbiAgICAvLyB3aGljaCBzZXNzaW9uIHRoZXkgYmVsb25nIHRvLlxuICAgIGNvbnN0IHF1ZXVlZCA9IHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgcGF1c2VkLl9vdXRib3VuZFF1ZXVlID0gW11cbiAgICBwYXVzZWQuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX3BhdXNlZCA9IGZhbHNlXG4gICAgcGF1c2VkLmRlc3Ryb3koKVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLXJlc3VtZWRcIiwgc2Vzc2lvbklkOiByZXN1bWVTZXNzaW9uSWR9KVxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZWQpIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICBhd2FpdCB0aGlzLl9maXJlT25SZXN1bWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkNsb3NlKHJlYXNvbilgIG9uIGV2ZXJ5IGxpdmUgYXBwLWRlZmluZWQgY29ubmVjdGlvbiwgdGhlblxuICAgKiBkcm9wcyB0aGVtIGZyb20gdGhlIHJlZ2lzdHJ5LiBObyBuZXR3b3JrIGZyYW1lIGlzIHNlbnQg4oCUIHRoZVxuICAgKiBzb2NrZXQgaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcGFyYW0ge1wic2Vzc2lvbl9kZXN0cm95ZWRcIiB8IFwiZ3JhY2VfZXhwaXJlZFwiIHwgXCJlcnJvclwifSByZWFzb24gLSBQZXJtYW5lbnQgdGVhcmRvd24gcmVhc29uIHBhc3NlZCB0byBlYWNoIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLW1lc3NhZ2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIgYW5kIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiVW5rbm93biBjb25uZWN0aW9uIGlkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25NZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIGhhbmRsZSBjb25uZWN0aW9uLW1lc3NhZ2UgZm9yICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBoYW5kbGUgbWVzc2FnZVwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlXCJ9YCBmcm9tIHRoZSBjbGllbnQg4oCUIGZpcmVzXG4gICAqIGBvbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpYCBhbmQgY29uZmlybXMgd2l0aCBgY29ubmVjdGlvbi1jbG9zZWRgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1jbG9zZSBmcmFtZSBjb250YWluaW5nIHRoZSB0YXJnZXQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgICAvLyBNYXJrIGNsb3NlZCBiZWZvcmUgZmlyaW5nIG9uQ2xvc2Ugc28gYXBwIGNvZGUgaG9sZGluZyB0aGVcbiAgICAvLyBoYW5kbGUgc2VlcyBgaXNDbG9zZWQoKSA9PT0gdHJ1ZWAgYW5kIGNhbid0IHJlLWVudGVyIHNlbmRNZXNzYWdlLlxuICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VkXCIsIGNvbm5lY3Rpb25JZCwgcmVhc29uOiBcImNsaWVudF9jbG9zZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwifWAg4oCUIHJ1bnMgYGNhblN1YnNjcmliZSgpYCxcbiAgICogcmVnaXN0ZXJzIHdpdGggdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcm91dGluZyByZWdpc3RyeSBvblxuICAgKiBzdWNjZXNzLCBhbmQgc2VuZHMgYGNoYW5uZWwtc3Vic2NyaWJlZGAgb3IgYGNoYW5uZWwtZXJyb3JgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtdW5zdWJzY3JpYmUgZnJhbWUgY29udGFpbmluZyB0aGUgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGNoYW5uZWwgJHtlbnRyeS5jaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYHVuc3Vic2NyaWJlZCgpYCBvbiBldmVyeSBsaXZlIGNoYW5uZWwtdjIgc3Vic2NyaXB0aW9uLFxuICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByZWdpc3RyeSwgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uJ3Mgb3duIG1hcC4gTm8gbmV0d29yayBmcmFtZXMg4oCUIHRoZSBzb2NrZXRcbiAgICogaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZWQoKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlYXJkb3duIHNpbmdsZSBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb25DaGFubmVsIG9mIHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LmRlbGV0ZShjaGFubmVsKVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbkNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5kZWxldGUoY2hhbm5lbClcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLmRlbGV0ZShjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsIHwgdW5kZWZpbmVkfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSB0ZW5hbnQgLSBUZW5hbnQga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVyblxuXG4gICAgdGhpcy5jaGFubmVscy5hZGQoY2hhbm5lbClcbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLnNldChjaGFubmVsLCB0ZW5hbnQpXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjaGFubmVsPy5zdWJzY3JpYmVkPy4oKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3dpdGhDb25uZWN0aW9ucyhjYWxsYmFjaykge1xuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJXZWJzb2NrZXQgc2Vzc2lvblwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gYXJncyAtIFN1YnNjcmlwdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGVuYW50IHJlc29sdXRpb24gY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzLCBzbyBpdCBtdXN0IGhhcHBlbiBpbnNpZGUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBzY29wZSAoc2VlIF9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKS5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWwsIHBhcmFtc30pXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjoge2NoYW5uZWwsIHBhcmFtc30sXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxJbnN0YW5jZSA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICBsYXN0RXZlbnRJZCxcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsSW5zdGFuY2UgJiYgIShjaGFubmVsSW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsSW5zdGFuY2UsIHRlbmFudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJXZWJzb2NrZXQgY2hhbm5lbCBzdWJzY3JpcHRpb24gZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByZXBhcmUgcmVwbGF5IHN0YXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBJbnRlcm5hbCBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmxhc3RFdmVudElkIC0gTGFzdCByZWNlaXZlZCBldmVudCBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3Vic2NyaXB0aW9uQ2hhbm5lbCAtIENsaWVudC1mYWNpbmcgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSBhcmdzLnN1YnNjcmlwdGlvblBhcmFtcyAtIENsaWVudC1mYWNpbmcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxmYWxzZSB8IHtidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59IHwgbnVsbD59IC0gUmVwbGF5IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3ByZXBhcmVSZXBsYXlTdGF0ZSh7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbkNoYW5uZWwsIHN1YnNjcmlwdGlvblBhcmFtc30pIHtcbiAgICBpZiAoIWxhc3RFdmVudElkKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHN0b3JlLmdldEV2ZW50QnlJZCh7Y2hhbm5lbCwgaWQ6IGxhc3RFdmVudElkfSlcblxuICAgIGlmICghY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbDogc3Vic2NyaXB0aW9uQ2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtczogc3Vic2NyaXB0aW9uUGFyYW1zLCB0eXBlOiBcInJlcGxheS1nYXBcIn0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyZWQ6IGZhbHNlLFxuICAgICAgY2VpbGluZ1NlcXVlbmNlOiAoYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbCkpIHx8IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICBjaGVja3BvaW50U2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICByZXBsYXlpbmc6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXBsYXkgY2hhbm5lbCBldmVudHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufX0gYXJncy5yZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZXBsYXkgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBzZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2hlY2twb2ludFNlcXVlbmNlLFxuICAgICAgdXBUb1NlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICByZXBsYXllZDogdHJ1ZSxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmlzaCByZXBsYXkgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSByZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBidWZmZXJlZCBldmVudHMgYXJlIGZsdXNoZWQuXG4gICAqL1xuICBhc3luYyBfZmluaXNoUmVwbGF5U3RhdGUoY2hhbm5lbCwgcmVwbGF5U3RhdGUpIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHJlcGxheVN0YXRlLnJlcGxheWluZyA9IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmRlbGV0ZShjaGFubmVsKVxuXG4gICAgaWYgKCFyZXBsYXlTdGF0ZS5idWZmZXJlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBsaXZlRXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBsaXZlRXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgdGVuYW50LlxuICAgKiBAcGFyYW0ge3tjaGFubmVsPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19IGFyZ3MgLSBUZW5hbnQgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5wYXJhbXM/LigpXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zID0ge1xuICAgICAgLi4uKHJlcXVlc3RQYXJhbXMgJiYgdHlwZW9mIHJlcXVlc3RQYXJhbXMgPT09IFwib2JqZWN0XCIgPyByZXF1ZXN0UGFyYW1zIDoge30pLFxuICAgICAgLi4uKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiID8gcGFyYW1zIDoge30pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gKi8gKHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB1bmRlZmluZWQsXG4gICAgICBzdWJzY3JpcHRpb246IGNoYW5uZWwgPyB7Y2hhbm5lbCwgcGFyYW1zfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5tYXNrIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBheWxvYWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBheWxvYWRbaV0gXj0gbWFza1tpICUgNF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25PcGVuID0gaGFuZGxlciA/IGhhbmRsZXIub25PcGVuIDogbnVsbFxuXG4gICAgICBpZiAob25PcGVuKSB7XG4gICAgICAgIGF3YWl0IG9uT3Blbih7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBvcGVuIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gbWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBJbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25NZXNzYWdlID0gaGFuZGxlciA/IGhhbmRsZXIub25NZXNzYWdlIDogbnVsbFxuXG4gICAgICBpZiAob25NZXNzYWdlKSB7XG4gICAgICAgIGF3YWl0IG9uTWVzc2FnZSh7bWVzc2FnZSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkVycm9yID0gaGFuZGxlciA/IGhhbmRsZXIub25FcnJvciA6IG51bGxcblxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgb25FcnJvcih7ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkNsb3NlID0gaGFuZGxlciA/IGhhbmRsZXIub25DbG9zZSA6IG51bGxcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgb25DbG9zZSh7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBjbG9zZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3RlIGFkZHJlc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gUmVtb3RlIGFkZHJlc3MgcmVzb2x2ZWQgZnJvbSB0aGUgd2Vic29ja2V0IHVwZ3JhZGUgcmVxdWVzdC5cbiAgICovXG4gIHJlbW90ZUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBncmFkZVJlcXVlc3Q/LnJlbW90ZUFkZHJlc3MoKSB8fCB0aGlzLmNsaWVudC5yZW1vdGVBZGRyZXNzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgbWVzc2FnZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJ9IGhhbmRsZXIgLSBIYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlclxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgfVxuXG4gIGFzeW5jIF9yZXNvbHZlTWVzc2FnZUhhbmRsZXJQcm9taXNlKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuXG4gICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIC8vIEluc3RhbGwgaGFuZGxlciBhbmQgZHJhaW4gb25PcGVuIGJlZm9yZSByZXBsYXlpbmcgcXVldWVkXG4gICAgICAgIC8vIG1lc3NhZ2VzLiBzZXRNZXNzYWdlSGFuZGxlcigpIGZpcmVzIG9uT3BlbiBhcyBmaXJlLWFuZC1mb3JnZXQ7XG4gICAgICAgIC8vIGF3YWl0aW5nIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSBkaXJlY3RseSBoZXJlIGNsb3NlcyB0aGVcbiAgICAgICAgLy8gcmFjZSB3aGVyZSBxdWV1ZWQgc3Vic2NyaWJlL2Nvbm5lY3Rpb24tKiBmcmFtZXMgd291bGRcbiAgICAgICAgLy8gZGlzcGF0Y2ggd2hpbGUgYW4gYXN5bmMgb25PcGVuIGlzIHN0aWxsIHNldHRpbmcgdXAgc2Vzc2lvblxuICAgICAgICAvLyBzdGF0ZS5cbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgICAgYXdhaXQgdGhpcy5fZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcjogdHlwZW9mIGhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciByZXNvbHZlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZsdXNoIHF1ZXVlZCBtZXNzYWdlcy5cbiAgICogQHBhcmFtIHt7dXNlSGFuZGxlcjogYm9vbGVhbn19IGFyZ3MgLSBBcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm1lc3NhZ2VRdWV1ZS5zbGljZSgpXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHF1ZXVlZCkge1xuICAgICAgaWYgKHVzZUhhbmRsZXIgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
1707
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsbUVBQW1FO0FBQ25FLE1BQU0sK0JBQStCLEdBQUcsc0NBQXNDLENBQUE7QUFFOUUsTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUV4Riw2REFBNkQ7QUFDN0QsTUFBTSwwQ0FBMEMsR0FBRyxJQUFJLENB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SSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7UUFFdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHt3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL3dlYnNvY2tldC1ldmVudC1sb2ctc3RvcmUuanNcIlxuXG5jb25zdCBXRUJTT0NLRVRfRklOQUxfRlJBTUUgPSAweDgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTiA9IDB4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSA9IDB4MlxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuLyoqIENhcCBvbiB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlOyBvbGRlc3QgZnJhbWVzIGRyb3Agb24gb3ZlcmZsb3cuICovXG5jb25zdCBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCA9IDEwMDBcblxuLyoqIENhcCBvbiB0b3RhbCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0XG5cbi8qKiBDYXAgb24gcGF5bG9hZCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZmluYWwgZGF0YSBmcmFtZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMgPSBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuXG5jb25zdCBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UID0gQmlnSW50KFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMpXG5cbi8qKiBDYXAgb24gZnJhZ21lbnQgY291bnQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UUyA9IDEwMjRcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwge3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YT86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBSZWNvcmQ8c3RyaW5nLCA/Pn0gV2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIFJ1bnMgc3Vic2NyaWJlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCBudWxsfSAtIFN1YnNjcmliZSBtZXNzYWdlIHdoZW4gbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnR5cGUgPT09IFwic3Vic2NyaWJlXCJcbiAgICA/IC8qKiBAdHlwZSB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gKi8gKG1lc3NhZ2UpXG4gICAgOiBudWxsXG59XG5cbi8qKlxuICogUnVucyByZXF1ZXN0IG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ30gfCBudWxsfSAtIFJlcXVlc3QgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKG1lc3NhZ2UudHlwZSAmJiBtZXNzYWdlLnR5cGUgIT09IFwicmVxdWVzdFwiKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAvKiogQHR5cGUge3t0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiA/LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgPz4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ319ICovIChtZXNzYWdlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBpZGVudGl0eSB2YWx1ZXMgZnJvbSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLlxuICogTnVsbGlzaCB2YWx1ZXMgY29tcGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGJ1dCBub3QgdG8gYSByZWFsIGlkZW50aXR5LlxuICogUGxhaW4gb2JqZWN0cyBhcmUgY29tcGFyZWQgdmlhIEpTT04gcm91bmQtdHJpcCBzbyBhcHBzIGNhbiByZXR1cm4gYVxuICogYHt1c2VySWQsIHRlbmFudElkfWAtc3R5bGUgb2JqZWN0IHdpdGhvdXQgYnVpbGRpbmcgdGhlaXIgb3duIGVxdWFsaXR5LlxuICogQHBhcmFtIHs/fSBhIC0gUGF1c2VkLXRpbWUgaWRlbnRpdHkuXG4gKiBAcGFyYW0gez99IGIgLSBSZXN1bWUtdGltZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgd2hlbiB0aGUgdHdvIGlkZW50aXRpZXMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0aWVzTWF0Y2goYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWVcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50V2Vic29ja2V0U2Vzc2lvbiB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdWJzY3JpcHRpb25zID0gbmV3IFNldCgpXG4gIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gIHN1YnNjcmlwdGlvbkhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGhhbmRsZXJTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxUZW5hbnRzID0gbmV3IE1hcCgpXG4gIGNoYW5uZWxSZXBsYXlTdGF0ZXMgPSBuZXcgTWFwKClcbiAgLyoqXG4gICAqIE1lc3NhZ2UgcXVldWUuXG4gICAqIEB0eXBlIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVtdfSAqL1xuICBtZXNzYWdlUXVldWUgPSBbXVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJQcm9taXNlXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIgcHJvbWlzZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIHVwZ3JhZGVSZXF1ZXN0LCBtZXNzYWdlSGFuZGxlciwgbWVzc2FnZUhhbmRsZXJQcm9taXNlfSkge1xuICAgIC8qKiBAdHlwZSB7QnVmZmVyW119ICovXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRGcmFtZUNvcHlCeXRlcyA9IDBcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnVwZ3JhZGVSZXF1ZXN0ID0gdXBncmFkZVJlcXVlc3RcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXJcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IG1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gQm9vbGVhbihtZXNzYWdlSGFuZGxlclByb21pc2UpXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIExvbmctbGl2ZWQgcGVyLXNlc3Npb24gc3RhdGUgYmFnLiBTdGFibGUgYWNyb3NzIHJlY29ubmVjdHMgb25jZVxuICAgICAqIGdyYWNlLXBlcmlvZCByZXN1bXB0aW9uIGxhbmRzIGluIFBoYXNlIDI7IHRvZGF5IGl0IGp1c3QgbGl2ZXNcbiAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59XG4gICAgICovXG4gICAgdGhpcy5kYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vd2Vic29ja2V0LWNvbm5lY3Rpb24uanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywge2NoYW5uZWxUeXBlOiBzdHJpbmcsIHN1YnNjcmlwdGlvbjogaW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdH0+fSAqL1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWQgYXNzaWduZWQgdG8gdGhpcyBzZXNzaW9uIG9uIGZpcnN0IGNvbm5lY3QuIFNlbnQgdG8gdGhlXG4gICAgICogY2xpZW50IHZpYSBgc2Vzc2lvbi1lc3RhYmxpc2hlZGA7IHRoZSBjbGllbnQgZWNob2VzIGl0IGJhY2sgdmlhXG4gICAgICogYHNlc3Npb24tcmVzdW1lYCBhZnRlciBhIFdTIGRyb3AgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAgICogd2l0aGluIHRoZSBncmFjZSBwZXJpb2QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnNlc3Npb25JZCA9IHJhbmRvbVVVSUQoKVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtib29sZWFufSAtIHRydWUgYWZ0ZXIgYF9oYW5kbGVDbG9zZWAgcGF1c2VzIGluc3RlYWQgb2YgdGVhcmluZyBkb3duLlxuICAgICAqL1xuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PD8+fSAtIGZyYW1lcyBwcm9kdWNlZCB3aGlsZSBwYXVzZWQ7IGZsdXNoZWQgb24gcmVzdW1lLlxuICAgICAqL1xuICAgIHRoaXMuX291dGJvdW5kUXVldWUgPSBbXVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGFpbCBvZiBhIHBlci1zZXNzaW9uIHByb21pc2UgY2hhaW4gdGhhdCBzZXJpYWxpemVzIG1lc3NhZ2VcbiAgICAgKiBoYW5kbGluZy4gUHJldmVudHMgcmFjZXMgd2hlcmUgbWVzc2FnZSBCIHJlYWRzIGBzZXNzaW9uLmRhdGFgXG4gICAgICogYmVmb3JlIG1lc3NhZ2UgQSdzIGhhbmRsZXIgZmluaXNoZXMgd3JpdGluZyBpdCAoZS5nLiBhXG4gICAgICogY29ubmVjdGlvbi1tZXNzYWdlIHNldHRpbmcgdGhlIGxvY2FsZSB2cy4gYSBzdWJzZXF1ZW50IHJlcXVlc3RcbiAgICAgKiB3aG9zZSBhcm91bmRSZXF1ZXN0IHdyYXBwZXIgcmVhZHMgaXQpLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHRoaXMuX21lc3NhZ2VDaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF1dGggaWRlbnRpdHkgY2FwdHVyZWQgYXQgcGF1c2VcbiAgICAgKiB0aW1lIGJ5IGBnZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcmAuIEF3YWl0ZWQgYXQgcmVzdW1lXG4gICAgICogdGltZSB0byBjb21wYXJlIGFnYWluc3QgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5LiBVbmRlZmluZWRcbiAgICAgKiBvbiBhIGxpdmUgKG5vbi1wYXVzZWQpIHNlc3Npb24uXG4gICAgICogQHR5cGUge1Byb21pc2U8Pz4gfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBBY2N1bXVsYXRlcyBwYXlsb2FkcyBmb3IgYSBmcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIHBlclxuICAgICAqIFJGQyA2NDU1LiBOb24tbnVsbCB3aGlsZSBtaWQtZnJhZ21lbnQ7IGNsZWFyZWQgd2hlbiB0aGUgZnJhbWVcbiAgICAgKiB3aXRoIEZJTj0xIGNvbXBsZXRlcyBhbmQgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QnVmZmVyW10gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIE9wY29kZSAoVEVYVC9CSU5BUlkpIGNhcHR1cmVkIGZyb20gdGhlIGZpcnN0IGZyYW1lIG9mIGFcbiAgICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIENvbnRpbnVhdGlvbiBmcmFtZXMgKG9wY29kZSAwKSBpbmhlcml0IGl0XG4gICAgICogYXQgcmVhc3NlbWJseSB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXIgfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBSdW5uaW5nIGJ5dGUgdG90YWwgZm9yIGBfZnJhZ21lbnRlZFBheWxvYWRzYC4gVXNlZCB0byBlbmZvcmNlXG4gICAgICogYFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTYCBzbyBhIHBlZXIgY2Fubm90XG4gICAgICogZXhoYXVzdCBtZW1vcnkgYnkgc3RyZWFtaW5nIG5vbi1maW5hbCBmcmFnbWVudHMgaW5kZWZpbml0ZWx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5hZGQodGhpcylcblxuICAgIC8qKlxuICAgICAqIEhlYXJ0YmVhdCBsaXZlbmVzcyBmbGFnLiBTZXQgdHJ1ZSBvbiBldmVyeSBpbmJvdW5kIGZyYW1lXG4gICAgICogKGluY2x1ZGluZyB0aGUgY2xpZW50J3MgYXV0by1wb25nKSBhbmQgY2xlYXJlZCBlYWNoIHRpbWUgYSBwaW5nXG4gICAgICogaXMgc2VudDsgYSBzdGlsbC1mYWxzZSBmbGFnIGF0IHRoZSBuZXh0IHRpY2sgbWVhbnMgdGhlIHNvY2tldFxuICAgICAqIGhhcyBnb25lIHNpbGVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIFBlci1zZXNzaW9uIGhlYXJ0YmVhdCBpbnRlcnZhbCBoYW5kbGUuIFN0YXJ0ZWQgZnJvbVxuICAgICAqIGBzZW5kU2Vzc2lvbkVzdGFibGlzaGVkYCBvbmNlIHRoZSBzb2NrZXQgaXMgbGl2ZSwgbm90IGF0XG4gICAgICogY29uc3RydWN0aW9uLCBzbyBkaXJlY3RseS1jb25zdHJ1Y3RlZCBzZXNzaW9ucyBpbiB0ZXN0cyBkb24ndFxuICAgICAqIHNwaW4gdXAgYSBiYWNrZ3JvdW5kIHRpbWVyLlxuICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBjbGllbnQgaXRzIHNlc3Npb25JZCArIGdyYWNlIHdpbmRvdy4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50YCBhZnRlciB0aGUgV1MgdXBncmFkZSBjb21wbGV0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZCgpIHtcbiAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgIHR5cGU6IFwic2Vzc2lvbi1lc3RhYmxpc2hlZFwiLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIGdyYWNlU2Vjb25kczogdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25HcmFjZVNlY29uZHM/LigpIHx8IDMwMFxuICAgIH0pXG5cbiAgICAvLyBUaGUgc29ja2V0IGlzIGxpdmUgbm93LCBzbyBiZWdpbiByZWFwaW5nIGl0IGlmIGl0IGdvZXMgc2lsZW50LlxuICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xvc2VkIGNvbm5lY3Rpb24gZnJvbSB0aGUgc2Vzc2lvbiByZWdpc3RyeS4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNXZWJzb2NrZXRDb25uZWN0aW9uLmNsb3NlKClgIGFmdGVyIGl0IHNlbmRzIHRoZSBmaW5hbFxuICAgKiBgY29ubmVjdGlvbi1jbG9zZWRgIGZyYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29ubmVjdGlvbklkIC0gQ2xvc2VkIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbklkKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIENsaWVudC1wcm92aWRlZCBtZXRhZGF0YSAoZGVmZW5zaXZlIGNvcHkpLlxuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHsuLi50aGlzLl9tZXRhZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHBhdXNlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBpbiB0aGUgcGF1c2VkL2dyYWNlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdXNlZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZFN1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGFubmVsKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkRhdGEoZGF0YSkge1xuICAgIC8vIEFueSBpbmJvdW5kIGJ5dGVzIOKAlCBhIGRhdGEgZnJhbWUsIHRoZSBhdXRvLXBvbmcgYW5zd2VyaW5nIG91clxuICAgIC8vIGhlYXJ0YmVhdCwgb3IgYSBwYXJ0aWFsIGZyYW1lIHN0aWxsIGJlaW5nIHVwbG9hZGVkIOKAlCBwcm92ZSB0aGVcbiAgICAvLyBzb2NrZXQgaXMgYWxpdmUuIE1hcmsgaXQgaGVyZSwgYmVmb3JlIGBfcHJvY2Vzc0J1ZmZlcmAgbWF5IHJldHVyblxuICAgIC8vIGVhcmx5IHdhaXRpbmcgZm9yIHRoZSByZXN0IG9mIGFuIGluY29tcGxldGUgZnJhbWUuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIHRoaXMuX2J1ZmZlckNodW5rcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBkYXRhLmxlbmd0aFxuICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7P30gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHt7Y3JlYXRlZEF0Pzogc3RyaW5nLCBldmVudElkPzogc3RyaW5nLCByZXBsYXllZD86IGJvb2xlYW4sIHNlcXVlbmNlPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY2hhbm5lbEhhbmRsZXJzID0gdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbClcbiAgICBjb25zdCBoYXNDaGFubmVsSGFuZGxlcnMgPSBCb29sZWFuKGNoYW5uZWxIYW5kbGVycyAmJiBjaGFubmVsSGFuZGxlcnMuc2l6ZSA+IDApXG4gICAgY29uc3QgcmVwbGF5U3RhdGUgPSB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAocmVwbGF5U3RhdGU/LnJlcGxheWluZyAmJiAhb3B0aW9ucy5yZXBsYXllZCkge1xuICAgICAgcmVwbGF5U3RhdGUuYnVmZmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKGNoYW5uZWwpICYmICFoYXNDaGFubmVsSGFuZGxlcnMpIHJldHVyblxuXG4gICAgaWYgKGhhc0NoYW5uZWxIYW5kbGVycykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShjaGFubmVsSGFuZGxlcnMpLm1hcChhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChoYW5kbGVyKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLnJlY2VpdmVkQnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgZXZlbnRJZDogb3B0aW9ucy5ldmVudElkLFxuICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgICAgICAgICAgc2VxdWVuY2U6IG9wdGlvbnMuc2VxdWVuY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICBjaGFubmVsLFxuICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgIHBheWxvYWQsXG4gICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlLFxuICAgICAgdHlwZTogXCJldmVudFwiXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluaXRpYWxpemUgY2hhbm5lbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpXG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe30pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbCAmJiAhKGNoYW5uZWwgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGdvb2RieWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRHb29kYnllKGNsaWVudCkge1xuICAgIGNvbnN0IGZyYW1lID0gQnVmZmVyLmZyb20oW1dFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UsIDB4MDBdKVxuXG4gICAgY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIGZyYW1lLCB7d2Vic29ja2V0RnJhbWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgLy8gU2VyaWFsaXplIHBlci1zZXNzaW9uOiBjaGFpbiBvbnRvIGBfbWVzc2FnZUNoYWluYCBzbyBtZXNzYWdlc1xuICAgIC8vIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZS4gV2l0aG91dCB0aGlzLCBmaXJlLWFuZC1mb3JnZXRcbiAgICAvLyBkaXNwYXRjaCBmcm9tIGBfcHJvY2Vzc0J1ZmZlcmAgbGV0cyBtZXNzYWdlIEIgcmVhZFxuICAgIC8vIGBzZXNzaW9uLmRhdGFgIGJlZm9yZSBBIGhhcyBmaW5pc2hlZCB3cml0aW5nIGl0LlxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLnRoZW4oKCkgPT4gdGhpcy5fZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UpKVxuXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gbmV4dC5jYXRjaCgoKSA9PiB7fSlcbiAgICBhd2FpdCBuZXh0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkaXNwYXRjaCBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRBcm91bmRSZXF1ZXN0Py4oKVxuXG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIGF3YWl0IHdyYXBwZXIodGhpcywgKCkgPT4gdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdHVhbCBtZXNzYWdlIGRpc3BhdGNoLCBleHRyYWN0ZWQgc29cbiAgICogYGNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdCgpYCBjYW4gd3JhcCBpdCBpbiBhbnlcbiAgICogcGVyLXJlcXVlc3QgY29udGV4dCAoQXN5bmNMb2NhbFN0b3JhZ2UsIHRyYWNpbmcsIGV0Yy4pLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gRGVjb2RlZCBjbGllbnQgZnJhbWUgdG8gZGlzcGF0Y2ggYnkgbWVzc2FnZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlSW5uZXIobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIG1lc3NhZ2VIYW5kbGVyIHNob3J0LWNpcmN1aXRzIGRlZmF1bHQgcm91dGluZyBvbmx5IHdoZW4gdGhlXG4gICAgLy8gYXBwIGFjdHVhbGx5IGRlY2xhcmVkIGFuIGBvbk1lc3NhZ2VgIGhvb2suIEFwcHMgdGhhdCBvbmx5IHdhbnRcbiAgICAvLyBzZXNzaW9uLWxpZmVjeWNsZSB0cmFja2luZyAoYG9uT3BlbmAvYG9uQ2xvc2VgKSBzdGlsbCBuZWVkIHRoZVxuICAgIC8vIGJ1aWx0LWluIHN1YnNjcmliZS9jb25uZWN0aW9uL2NoYW5uZWwtc3Vic2NyaWJlIHJvdXRpbmcgYmVsb3csXG4gICAgLy8gb3RoZXJ3aXNlIGV2ZXJ5IGluY29taW5nIG1lc3NhZ2UgaXMgc2lsZW50bHkgZHJvcHBlZC5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlciAmJiB0eXBlb2YgdGhpcy5tZXNzYWdlSGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpYmVQYXlsb2FkID0gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgaWYgKHN1YnNjcmliZVBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSA9IHN1YnNjcmliZVBheWxvYWRcblxuICAgICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIGlzIHJlcXVpcmVkIGZvciBzdWJzY3JpYmVcIilcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJtZXRhZGF0YVwiKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YVBheWxvYWQgPSAvKiogQHR5cGUge3tkYXRhPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAobWVzc2FnZSlcblxuICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YVBheWxvYWQuZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGFQYXlsb2FkLmRhdGEgPT09IFwib2JqZWN0XCIgPyB7Li4ubWV0YWRhdGFQYXlsb2FkLmRhdGF9IDoge31cblxuICAgICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCh0aGlzLl9tZXRhZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5cIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC11bnN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmICghcmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7Ym9keSwgaGVhZGVycywgaWQsIG1ldGhvZCwgcGF0aH0gPSByZXF1ZXN0UGF5bG9hZFxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihcIm1ldGhvZCBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghcGF0aCkgdGhyb3cgbmV3IEVycm9yKFwicGF0aCBpcyByZXF1aXJlZFwiKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBXZWJzb2NrZXRSZXF1ZXN0KHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0TWV0YWRhdGEoKSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLnJlbW90ZUFkZHJlc3MoKVxuICAgIH0pXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3RcbiAgICB9KVxuXG4gICAgcmVxdWVzdFJ1bm5lci5ldmVudHMub24oXCJkb25lXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdFJ1bm5lci5yZXNwb25zZVxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgICAgdm9pZCByZXF1ZXN0UnVubmVyLmxvZ0NvbXBsZXRlZFJlcXVlc3QoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBsb2cgY29tcGxldGVkIHJlcXVlc3RcIiwgZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcm9jZXNzIGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPj0gMikge1xuICAgICAgY29uc3QgaW5pdGlhbEhlYWRlciA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKDIpXG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSBpbml0aWFsSGVhZGVyWzBdXG4gICAgICBjb25zdCBzZWNvbmRCeXRlID0gaW5pdGlhbEhlYWRlclsxXVxuICAgICAgY29uc3QgaXNGaW5hbCA9IChmaXJzdEJ5dGUgJiBXRUJTT0NLRVRfRklOQUxfRlJBTUUpID09PSBXRUJTT0NLRVRfRklOQUxfRlJBTUVcbiAgICAgIGNvbnN0IG9wY29kZSA9IGZpcnN0Qnl0ZSAmIDB4MEZcbiAgICAgIGNvbnN0IGlzTWFza2VkID0gKHNlY29uZEJ5dGUgJiAweDgwKSA9PT0gMHg4MFxuICAgICAgbGV0IHBheWxvYWRMZW5ndGggPSBzZWNvbmRCeXRlICYgMHg3RlxuICAgICAgbGV0IG9mZnNldCA9IDJcblxuICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IG9mZnNldCArIDIpIHJldHVyblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMob2Zmc2V0ICsgMikucmVhZFVJbnQxNkJFKG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IDJcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKG9mZnNldCArIDgpLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgaWYgKGJpZ0xlbmd0aCA+IFdFQlNPQ0tFVF9NQVhfSU5CT1VORF9GUkFNRV9CWVRFU19CSUdJTlQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgICAgICAgIFwiV2Vic29ja2V0IGZyYW1lIGV4Y2VlZGVkIGJ5dGUgY2FwOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgICAgICAgIHtmcmFtZUJ5dGVzOiBiaWdMZW5ndGgudG9TdHJpbmcoKSwgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVN9XG4gICAgICAgICAgXSlcbiAgICAgICAgICB0aGlzLl9jbG9zZUZvckluYm91bmRMaW1pdCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkTGVuZ3RoID0gTnVtYmVyKGJpZ0xlbmd0aClcbiAgICAgICAgb2Zmc2V0ICs9IDhcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFza0xlbmd0aCA9IGlzTWFza2VkID8gNCA6IDBcblxuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aFxuXG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IGZyYW1lTGVuZ3RoKSByZXR1cm5cblxuICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLl9jb25zdW1lQnVmZmVyZWRCeXRlcyhmcmFtZUxlbmd0aClcblxuICAgICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgcGF5bG9hZCA9IGZyYW1lLnN1YmFycmF5KG9mZnNldCArIG1hc2tMZW5ndGgsIGZyYW1lTGVuZ3RoKVxuXG4gICAgICBpZiAoaXNNYXNrZWQpIHtcbiAgICAgICAgY29uc3QgbWFzayA9IGZyYW1lLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbWFza0xlbmd0aClcbiAgICAgICAgdGhpcy5fdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKVxuICAgICAgfVxuXG4gICAgICAvLyBDb250cm9sIGZyYW1lcyAob3Bjb2RlID49IDB4OCkgbXVzdCBub3QgYmUgZnJhZ21lbnRlZCBwZXJcbiAgICAgIC8vIFJGQyA2NDU1IGFuZCBjYW4gYXJyaXZlIGludGVybGVhdmVkIHdpdGggYSBmcmFnbWVudGVkIGRhdGFcbiAgICAgIC8vIG1lc3NhZ2UuIEhhbmRsZSB0aGVtIGZpcnN0IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGZyYWdtZW50XG4gICAgICAvLyBhY2N1bXVsYXRvci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUElORykge1xuICAgICAgICB0aGlzLl9zZW5kQ29udHJvbEZyYW1lKFdFQlNPQ0tFVF9PUENPREVfUE9ORywgcGF5bG9hZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DTE9TRSkge1xuICAgICAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUE9ORykge1xuICAgICAgICAvLyBBbnN3ZXIgdG8gYSBoZWFydGJlYXQgcGluZzsgbGl2ZW5lc3MgaXMgcmVjb3JkZWQgaW4gb25EYXRhLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID49IDB4OCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgY29udHJvbCBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIERhdGEgZnJhbWUgKFRFWFQvQklOQVJZL0NPTlRJTlVBVElPTikuIFJlYXNzZW1ibGUgZnJhZ21lbnRzXG4gICAgICAvLyBiZWZvcmUgZGlzcGF0Y2hpbmcuIEJyb3dzZXJzIChDaHJvbWUpIGxlZ2l0aW1hdGVseSBmcmFnbWVudFxuICAgICAgLy8gbG9uZ2VyIGNsaWVudOKGknNlcnZlciB0ZXh0IGZyYW1lczsgYSBwcmlvciB2ZXJzaW9uIGRyb3BwZWRcbiAgICAgIC8vIGV2ZXJ5IGZyYWdtZW50ZWQgbWVzc2FnZSBzaWxlbnRseSwgc28gYW55IHBheWxvYWQgbGFyZ2VcbiAgICAgIC8vIGVub3VnaCB0byBoaXQgdGhlIGJyb3dzZXIncyBmcmFnbWVudGF0aW9uIHRocmVzaG9sZFxuICAgICAgLy8gKGUuZy4gYSBjaGFubmVsLXN1YnNjcmliZSB3aXRoIGFuIGF1dGggdG9rZW4pIG5ldmVyIHJlYWNoZWRcbiAgICAgIC8vIHRoZSBoYW5kbGVyLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBjb250aW51YXRpb24gZnJhbWUgd2l0aCBubyBmcmFnbWVudGVkIG1lc3NhZ2UgaW4gcHJvZ3Jlc3NcIilcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hcHBlbmRGcmFnbWVudChwYXlsb2FkKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCB8fCBvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgbmV3IGRhdGEgZnJhbWUgd2hpbGUgYSBmcmFnbWVudGVkIG1lc3NhZ2Ugd2FzIGluIHByb2dyZXNzOyBkaXNjYXJkaW5nIHByaW9yIGZyYWdtZW50c1wiKVxuICAgICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gW3BheWxvYWRdXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG9wY29kZVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IHBheWxvYWQubGVuZ3RoXG5cbiAgICAgICAgICBpZiAoIXRoaXMuX2VuZm9yY2VGcmFnbWVudExpbWl0cygpKSByZXR1cm5cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmVzIGZpbmFsUGF5bG9hZC5cbiAgICAgICAqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgZmluYWxQYXlsb2FkXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxPcGNvZGUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgbGV0IGZpbmFsT3Bjb2RlXG5cbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBCdWZmZXIuY29uY2F0KHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcylcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPz8gV0VCU09DS0VUX09QQ09ERV9URVhUXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbE9wY29kZSAhPT0gV0VCU09DS0VUX09QQ09ERV9URVhUKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZSBhZnRlciByZWFzc2VtYmx5OiAke2ZpbmFsT3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGZpbmFsUGF5bG9hZC50b1N0cmluZyhcInV0Zi04XCIpKVxuXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IFwiSW52YWxpZCB3ZWJzb2NrZXQgbWVzc2FnZVwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIGxlYWRpbmcgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBjb25zdW1pbmcgdGhlbS4gSGVhZGVyXG4gICAqIGluc3BlY3Rpb24gaXMgYm91bmRlZCB0byB0aGUgd2Vic29ja2V0IGhlYWRlciBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYnl0ZUNvdW50IC0gTnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBDb3BpZWQgcHJlZml4LlxuICAgKi9cbiAgX3BlZWtCdWZmZXJlZEJ5dGVzKGJ5dGVDb3VudCkge1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShieXRlQ291bnQpXG4gICAgbGV0IGNvcGllZEJ5dGVzID0gMFxuICAgIGxldCBjaHVua09mZnNldCA9IHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0XG5cbiAgICBmb3IgKGxldCBjaHVua0luZGV4ID0gdGhpcy5fYnVmZmVyQ2h1bmtJbmRleDsgY2h1bmtJbmRleCA8IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGg7IGNodW5rSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9idWZmZXJDaHVua3NbY2h1bmtJbmRleF1cbiAgICAgIGNvbnN0IGJ5dGVzRnJvbUNodW5rID0gTWF0aC5taW4oY2h1bmsubGVuZ3RoIC0gY2h1bmtPZmZzZXQsIGJ5dGVDb3VudCAtIGNvcGllZEJ5dGVzKVxuXG4gICAgICBjaHVuay5jb3B5KHByZWZpeCwgY29waWVkQnl0ZXMsIGNodW5rT2Zmc2V0LCBjaHVua09mZnNldCArIGJ5dGVzRnJvbUNodW5rKVxuICAgICAgY29waWVkQnl0ZXMgKz0gYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIGNodW5rT2Zmc2V0ID0gMFxuICAgICAgaWYgKGNvcGllZEJ5dGVzID09PSBieXRlQ291bnQpIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGEgY29tcGxldGUgZnJhbWUgZnJvbSB0aGUgY2h1bmsgcXVldWUgd2l0aCBvbmUgYm91bmRlZCBjb3B5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYnl0ZUNvdW50IC0gQ29tcGxldGUgZnJhbWUgYnl0ZSBjb3VudC5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBDb250aWd1b3VzIGZyYW1lIGJ5dGVzLlxuICAgKi9cbiAgX2NvbnN1bWVCdWZmZXJlZEJ5dGVzKGJ5dGVDb3VudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShieXRlQ291bnQpXG4gICAgbGV0IGNvcGllZEJ5dGVzID0gMFxuXG4gICAgd2hpbGUgKGNvcGllZEJ5dGVzIDwgYnl0ZUNvdW50KSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2J1ZmZlckNodW5rc1t0aGlzLl9idWZmZXJDaHVua0luZGV4XVxuICAgICAgY29uc3QgYnl0ZXNGcm9tQ2h1bmsgPSBNYXRoLm1pbihjaHVuay5sZW5ndGggLSB0aGlzLl9idWZmZXJDaHVua09mZnNldCwgYnl0ZUNvdW50IC0gY29waWVkQnl0ZXMpXG5cbiAgICAgIGNodW5rLmNvcHkoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgY29waWVkQnl0ZXMsXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0LFxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCArIGJ5dGVzRnJvbUNodW5rXG4gICAgICApXG4gICAgICBjb3BpZWRCeXRlcyArPSBieXRlc0Zyb21DaHVua1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgKz0gYnl0ZXNGcm9tQ2h1bmtcblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID09PSBjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCArPSAxXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9idWZmZXJDaHVua0luZGV4ID09PSB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA+PSA2NCAmJlxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCAqIDIgPj0gdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gdGhpcy5fYnVmZmVyQ2h1bmtzLnNsaWNlKHRoaXMuX2J1ZmZlckNodW5rSW5kZXgpXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIH1cblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gYnl0ZUNvdW50XG4gICAgdGhpcy5fYnVmZmVyZWRGcmFtZUNvcHlCeXRlcyArPSBieXRlQ291bnRcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhbGwgaW5jb21wbGV0ZSBmcmFtZSBjaHVua3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2NsZWFyQnVmZmVyZWRGcmFtZUNodW5rcygpIHtcbiAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWZ0ZXIgYW4gaW5ib3VuZCBidWZmZXJpbmcgbGltaXQgYW5kIHJlbGVhc2VzIGFsbCBwYXJzZXItb3duZWQgaW5wdXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2Nsb3NlRm9ySW5ib3VuZExpbWl0KCkge1xuICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgIHRoaXMuX2NsZWFyQnVmZmVyZWRGcmFtZUNodW5rcygpXG4gICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNvbnRpbnVhdGlvbi1mcmFtZSBwYXlsb2FkIHRvIHRoZSBpbi1wcm9ncmVzc1xuICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWRcbiAgICogYW5kIGZhbHNlIHdoZW4gdGhlIHBlci1tZXNzYWdlIGNhcCB3YXMgaGl0IGFuZCB0aGUgc29ja2V0IGhhc1xuICAgKiBiZWVuIGNsb3NlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBDb250aW51YXRpb24tZnJhbWUgYnl0ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWQuXG4gICAqL1xuICBfYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkge1xuICAgIC8vIEd1YXJkIHB1c2hpbmcgZmlyc3Qgc28gYF9lbmZvcmNlRnJhZ21lbnRMaW1pdHNgIHNlZXMgdGhlIGZpbmFsXG4gICAgLy8gc3RhdGU7IG9uIG92ZXJmbG93IHRoZSByZXNldCBpbnNpZGUgdGhlIGVuZm9yY2VyIGRyb3BzIHRoZVxuICAgIC8vIGJ1ZmZlcmVkIGZyYWdtZW50cy5cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHM/LnB1c2gocGF5bG9hZClcbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgKz0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHJldHVybiB0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBmcmFnbWVudGVkIG1lc3NhZ2UgaGFzIG5vdCBleGNlZWRlZCB0aGUgYnl0ZSBvclxuICAgKiBmcmFnbWVudC1jb3VudCBjYXBzLiBPbiBvdmVyZmxvdywgY2xlYXJzIHRoZSBidWZmZXIsIHNlbmRzIGFcbiAgICogY2xvc2UgZnJhbWUsIGFuZCB0ZWFycyB0aGUgc2Vzc2lvbiBkb3duLiBSZXR1cm5zIHRydWUgd2hlbiB0aGVcbiAgICogY2FsbGVyIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nLCBmYWxzZSB3aGVuIHRoZSBzZXNzaW9uIGlzIGJlaW5nXG4gICAqIGNsb3NlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmcmFnbWVudCBwcm9jZXNzaW5nIG1heSBjb250aW51ZS5cbiAgICovXG4gIF9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSB7XG4gICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGZyYWdtZW50Q291bnQgPSB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMubGVuZ3RoXG4gICAgY29uc3Qgb3ZlckJ5dGVzID0gdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVNcbiAgICBjb25zdCBvdmVyRnJhZ21lbnRzID0gZnJhZ21lbnRDb3VudCA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuXG4gICAgaWYgKCFvdmVyQnl0ZXMgJiYgIW92ZXJGcmFnbWVudHMpIHJldHVybiB0cnVlXG5cbiAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgIFwiRnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBleGNlZWRlZCBjYXBzOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgIHtcbiAgICAgICAgZnJhZ21lbnRCeXRlczogdGhpcy5fZnJhZ21lbnRlZEJ5dGVzLFxuICAgICAgICBmcmFnbWVudENvdW50LFxuICAgICAgICBtYXhCeXRlczogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMsXG4gICAgICAgIG1heEZyYWdtZW50czogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG4gICAgICB9XG4gICAgXSlcblxuICAgIHRoaXMuX2Nsb3NlRm9ySW5ib3VuZExpbWl0KClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzZXQgZnJhZ21lbnQgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKSB7XG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0LiBFYWNoIHRpY2sgcGluZ3MgdGhlIGNsaWVudCBhbmRcbiAgICogcmVhcHMgdGhlIHNlc3Npb24gaWYgdGhlIHByZXZpb3VzIHBpbmcgd2VudCB1bmFuc3dlcmVkLCBzbyBhXG4gICAqIGhhbGYtb3BlbiBzb2NrZXQgKGNsaWVudCBnb25lIHdpdGhvdXQgYSBUQ1AgRklOIC8gY2xvc2UgZnJhbWUpXG4gICAqIGNhbm5vdCBsaW5nZXIgZm9yZXZlciBob2xkaW5nIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gRGlzYWJsZWQgd2hlblxuICAgKiB0aGUgY29uZmlndXJlZCBpbnRlcnZhbCBpcyAwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICBjb25zdCBpbnRlcnZhbFNlY29uZHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkhlYXJ0YmVhdFNlY29uZHMoKVxuXG4gICAgaWYgKCFpbnRlcnZhbFNlY29uZHMgfHwgaW50ZXJ2YWxTZWNvbmRzIDw9IDApIHJldHVyblxuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9oZWFydGJlYXRUaWNrKCksIGludGVydmFsU2Vjb25kcyAqIDEwMDApXG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLlxuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBoZWFydGJlYXQgY3ljbGUuIFJlYXBzIHRoZSBzZXNzaW9uIHZpYSB0aGUgbm9ybWFsIGNsb3NlIHBhdGhcbiAgICogd2hlbiB0aGUgcHJldmlvdXMgcGluZyB3YXMgbm90IGFuc3dlcmVkOyBvdGhlcndpc2UgbWFya3MgaXRcbiAgICogcGVuZGluZyBhbmQgcGluZ3MgYWdhaW4uIEJyb3dzZXJzIGFuZCBSZWFjdCBOYXRpdmUgc29ja2V0cyBhbnN3ZXJcbiAgICogc2VydmVyIHBpbmdzIHdpdGggYW4gYXV0b21hdGljIHBvbmcsIHdoaWNoIGxhbmRzIGluIGBfcHJvY2Vzc0J1ZmZlcmBcbiAgICogYW5kIHJlLW1hcmtzIHRoZSBzZXNzaW9uIGFsaXZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oZWFydGJlYXRUaWNrKCkge1xuICAgIGlmICh0aGlzLl9wYXVzZWQgfHwgIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9oZWFydGJlYXRBbGl2ZSkge1xuICAgICAgLy8gTm8gZnJhbWUgYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCBwaW5nIOKAlCB0aGUgc29ja2V0IGlzIGRlYWQuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGBfaGFuZGxlQ2xvc2VgIHNvIHJlc3VtYWJsZSBzdGF0ZSBzdGlsbCBwYXVzZXNcbiAgICAgIC8vIGZvciB0aGUgZ3JhY2Ugd2luZG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgdG9ybiBkb3duLlxuICAgICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BJTkcsIEJ1ZmZlci5hbGxvYygwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0IHRpbWVyLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3N0b3BIZWFydGJlYXQoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKVxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBjb250cm9sIGZyYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSksIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGpzb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSwge3dlYnNvY2tldEZyYW1lOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN1YnNjcmliZSB0byBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3Vic2NyaXB0aW9uQ2hhbm5lbD86IHN0cmluZ319IFtvcHRpb25zXSAtIFN1YnNjcmliZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gd2FzIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZSA9IHRydWUsIGNoYW5uZWxIYW5kbGVyLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCBzdWJzY3JpcHRpb25DaGFubmVsfSA9IHt9KSB7XG4gICAgYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKS5tYXJrQ2hhbm5lbEludGVyZXN0ZWQoY2hhbm5lbClcblxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gYXdhaXQgdGhpcy5fcHJlcGFyZVJlcGxheVN0YXRlKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBsYXN0RXZlbnRJZCxcbiAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwgfHwgY2hhbm5lbCxcbiAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zXG4gICAgfSlcblxuICAgIGlmIChyZXBsYXlTdGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgIGlmIChyZXBsYXlTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLnNldChjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICB9XG5cbiAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihjaGFubmVsKVxuXG4gICAgaWYgKGNoYW5uZWxIYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuaGFzKGNoYW5uZWwpKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuc2V0KGNoYW5uZWwsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbCk/LmFkZChjaGFubmVsSGFuZGxlcilcblxuICAgICAgaWYgKCF0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsSGFuZGxlcikpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5zZXQoY2hhbm5lbEhhbmRsZXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZXIpPy5hZGQoY2hhbm5lbClcbiAgICB9XG5cbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2tub3dsZWRnZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgdHlwZTogXCJzdWJzY3JpYmVkXCJ9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2hhbmRsZUNsb3NlKCkge1xuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcImdyYWNlX2V4cGlyZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNvbmZpZ3VyZWQgaWRlbnRpdHkgcmVzb2x2ZXIgYWdhaW5zdCB0aGlzIHNlc3Npb24uXG4gICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHN0b3JlZCBhdCBwYXVzZSB0aW1lIGFuZCBhd2FpdGVkIGF0XG4gICAqIHJlc3VtZSB0aW1lIHNvIHdlIGNhbiByZWplY3QgcmVzdW1lIGF0dGVtcHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogYXV0aGVudGljYXRlZCBjYWxsZXIgKHNpZ25lZCBvdXQsIHN3YXBwZWQgdXNlciwgZXhwaXJlZCBjb29raWUpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBDYXB0dXJlZCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByZXN1bWUgdmFsaWRhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHBhdXNlXCIsIGVycm9yXSlcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uRGlzY29ubmVjdGAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBzb1xuICAgKiBhcHBzIGNhbiBwYXVzZSBwZXItaW5zdGFuY2Ugd29yayB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuXG4gICAqIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcmV0aHJvd24g4oCUIG9uZSBicm9rZW4gaGFuZGxlciBtdXN0IG5vdFxuICAgKiBibG9jayB0aGUgcmVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uRGlzY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvbkRpc2Nvbm5lY3RcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25SZXN1bWVgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgYWZ0ZXJcbiAgICogYSBzdWNjZXNzZnVsIGBzZXNzaW9uLXJlc3VtZWAgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uUmVzdW1lKCkge1xuICAgIGF3YWl0IHRoaXMuX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhcIm9uUmVzdW1lXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaXJlIGxpZmVjeWNsZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtcIm9uRGlzY29ubmVjdFwiIHwgXCJvblJlc3VtZVwifSBjYWxsYmFja05hbWUgTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGZpcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxpdmUgaGFuZGxlciBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBfZmlyZUxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbltjYWxsYmFja05hbWVdPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2Ake2NhbGxiYWNrTmFtZX0gZmFpbGVkIGZvciAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgY2hhbm5lbCBzdWIgJHtzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwifWAuIFRoaXMgc2Vzc2lvbiAodGhlIG5ld2x5LVxuICAgKiBjcmVhdGVkIG9uZSB3aG9zZSBzb2NrZXQganVzdCBjb25uZWN0ZWQpIHRyYW5zZmVycyBzdGF0ZSBmcm9tXG4gICAqIHRoZSBwYXVzZWQgc2Vzc2lvbiBhbmQgaW5zdHJ1Y3RzIHRoZSBjbGllbnQgdmlhXG4gICAqIGBzZXNzaW9uLXJlc3VtZWRgIG9yIGBzZXNzaW9uLWdvbmVgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gU2Vzc2lvbi1yZXN1bWUgZnJhbWUgY29udGFpbmluZyB0aGUgcGF1c2VkIHNlc3Npb24gaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdW1lU2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcblxuICAgIGlmICh0eXBlb2YgcmVzdW1lU2Vzc2lvbklkICE9PSBcInN0cmluZ1wiIHx8ICFyZXN1bWVTZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2VkID0gdGhpcy5jb25maWd1cmF0aW9uLl9maW5kUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBBdXRoIHJlLXZlcmlmeTogY29tcGFyZSB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkgYWdhaW5zdCB0aGVcbiAgICAvLyBvbmUgY2FwdHVyZWQgYXQgcGF1c2UuIE1pc21hdGNoIG1lYW5zIGEgZGlmZmVyZW50IHVzZXIgKG9yIGFcbiAgICAvLyBzaWduZWQtb3V0IHNlc3Npb24pIGlzIHRyeWluZyB0byByZWNsYWltIHN0YXRlIHRoYXQgaXNuJ3RcbiAgICAvLyB0aGVpcnMg4oCUIGRlc3Ryb3kgdGhlIHBhdXNlZCBzZXNzaW9uIG91dHJpZ2h0LlxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyPy4oKVxuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBwYXVzZWRJZGVudGl0eSA9IGF3YWl0IHBhdXNlZC5fcmVzdW1lSWRlbnRpdHlQcm9taXNlXG4gICAgICBsZXQgZnJlc2hJZGVudGl0eVxuXG4gICAgICB0cnkge1xuICAgICAgICBmcmVzaElkZW50aXR5ID0gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCByZXN1bWVcIiwgZXJyb3JdKVxuICAgICAgICBmcmVzaElkZW50aXR5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghaWRlbnRpdGllc01hdGNoKHBhdXNlZElkZW50aXR5LCBmcmVzaElkZW50aXR5KSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG4gICAgICAgIHBhdXNlZC5fZmluYWxpemVHcmFjZUV4cGlyeSgpXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICAvLyBUcmFuc2ZlciByZXN1bWFibGUgc3RhdGUgb250byB0aGlzIChsaXZlKSBzZXNzaW9uLiBUaGUgcGF1c2VkXG4gICAgLy8gc2Vzc2lvbiBzaGVsbCBpcyBkaXNjYXJkZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyLlxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb25JZCwgY29ubmVjdGlvbl0gb2YgcGF1c2VkLl9jb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJJZCwgZW50cnldIG9mIHBhdXNlZC5fY2hhbm5lbFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YklkLCBlbnRyeSlcbiAgICB9XG5cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHsuLi5wYXVzZWQuX21ldGFkYXRhfVxuICAgIHRoaXMuZGF0YSA9IHBhdXNlZC5kYXRhXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZXN1bWVTZXNzaW9uSWRcblxuICAgIC8vIFRyYW5zZmVyIGFueSBmcmFtZXMgcXVldWVkIHdoaWxlIHRoZSBwYXVzZWQgc2Vzc2lvbiBoYWQgbm9cbiAgICAvLyBzb2NrZXQuIFRoZXkgZmx1c2ggQUZURVIgc2Vzc2lvbi1yZXN1bWVkIHNvIHRoZSBjbGllbnQga25vd3NcbiAgICAvLyB3aGljaCBzZXNzaW9uIHRoZXkgYmVsb25nIHRvLlxuICAgIGNvbnN0IHF1ZXVlZCA9IHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgcGF1c2VkLl9vdXRib3VuZFF1ZXVlID0gW11cbiAgICBwYXVzZWQuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX3BhdXNlZCA9IGZhbHNlXG4gICAgcGF1c2VkLmRlc3Ryb3koKVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLXJlc3VtZWRcIiwgc2Vzc2lvbklkOiByZXN1bWVTZXNzaW9uSWR9KVxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZWQpIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICBhd2FpdCB0aGlzLl9maXJlT25SZXN1bWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkNsb3NlKHJlYXNvbilgIG9uIGV2ZXJ5IGxpdmUgYXBwLWRlZmluZWQgY29ubmVjdGlvbiwgdGhlblxuICAgKiBkcm9wcyB0aGVtIGZyb20gdGhlIHJlZ2lzdHJ5LiBObyBuZXR3b3JrIGZyYW1lIGlzIHNlbnQg4oCUIHRoZVxuICAgKiBzb2NrZXQgaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcGFyYW0ge1wic2Vzc2lvbl9kZXN0cm95ZWRcIiB8IFwiZ3JhY2VfZXhwaXJlZFwiIHwgXCJlcnJvclwifSByZWFzb24gLSBQZXJtYW5lbnQgdGVhcmRvd24gcmVhc29uIHBhc3NlZCB0byBlYWNoIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLW1lc3NhZ2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIgYW5kIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiVW5rbm93biBjb25uZWN0aW9uIGlkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25NZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIGhhbmRsZSBjb25uZWN0aW9uLW1lc3NhZ2UgZm9yICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBoYW5kbGUgbWVzc2FnZVwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlXCJ9YCBmcm9tIHRoZSBjbGllbnQg4oCUIGZpcmVzXG4gICAqIGBvbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpYCBhbmQgY29uZmlybXMgd2l0aCBgY29ubmVjdGlvbi1jbG9zZWRgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1jbG9zZSBmcmFtZSBjb250YWluaW5nIHRoZSB0YXJnZXQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgICAvLyBNYXJrIGNsb3NlZCBiZWZvcmUgZmlyaW5nIG9uQ2xvc2Ugc28gYXBwIGNvZGUgaG9sZGluZyB0aGVcbiAgICAvLyBoYW5kbGUgc2VlcyBgaXNDbG9zZWQoKSA9PT0gdHJ1ZWAgYW5kIGNhbid0IHJlLWVudGVyIHNlbmRNZXNzYWdlLlxuICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VkXCIsIGNvbm5lY3Rpb25JZCwgcmVhc29uOiBcImNsaWVudF9jbG9zZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwifWAg4oCUIHJ1bnMgYGNhblN1YnNjcmliZSgpYCxcbiAgICogcmVnaXN0ZXJzIHdpdGggdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcm91dGluZyByZWdpc3RyeSBvblxuICAgKiBzdWNjZXNzLCBhbmQgc2VuZHMgYGNoYW5uZWwtc3Vic2NyaWJlZGAgb3IgYGNoYW5uZWwtZXJyb3JgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtdW5zdWJzY3JpYmUgZnJhbWUgY29udGFpbmluZyB0aGUgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGNoYW5uZWwgJHtlbnRyeS5jaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYHVuc3Vic2NyaWJlZCgpYCBvbiBldmVyeSBsaXZlIGNoYW5uZWwtdjIgc3Vic2NyaXB0aW9uLFxuICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByZWdpc3RyeSwgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uJ3Mgb3duIG1hcC4gTm8gbmV0d29yayBmcmFtZXMg4oCUIHRoZSBzb2NrZXRcbiAgICogaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZWQoKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlYXJkb3duIHNpbmdsZSBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb25DaGFubmVsIG9mIHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LmRlbGV0ZShjaGFubmVsKVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbkNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5kZWxldGUoY2hhbm5lbClcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLmRlbGV0ZShjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsIHwgdW5kZWZpbmVkfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSB0ZW5hbnQgLSBUZW5hbnQga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVyblxuXG4gICAgdGhpcy5jaGFubmVscy5hZGQoY2hhbm5lbClcbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLnNldChjaGFubmVsLCB0ZW5hbnQpXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjaGFubmVsPy5zdWJzY3JpYmVkPy4oKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3dpdGhDb25uZWN0aW9ucyhjYWxsYmFjaykge1xuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJXZWJzb2NrZXQgc2Vzc2lvblwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gYXJncyAtIFN1YnNjcmlwdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGVuYW50IHJlc29sdXRpb24gY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzLCBzbyBpdCBtdXN0IGhhcHBlbiBpbnNpZGUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBzY29wZSAoc2VlIF9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKS5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWwsIHBhcmFtc30pXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjoge2NoYW5uZWwsIHBhcmFtc30sXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxJbnN0YW5jZSA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICBsYXN0RXZlbnRJZCxcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsSW5zdGFuY2UgJiYgIShjaGFubmVsSW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsSW5zdGFuY2UsIHRlbmFudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJXZWJzb2NrZXQgY2hhbm5lbCBzdWJzY3JpcHRpb24gZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByZXBhcmUgcmVwbGF5IHN0YXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBJbnRlcm5hbCBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmxhc3RFdmVudElkIC0gTGFzdCByZWNlaXZlZCBldmVudCBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3Vic2NyaXB0aW9uQ2hhbm5lbCAtIENsaWVudC1mYWNpbmcgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSBhcmdzLnN1YnNjcmlwdGlvblBhcmFtcyAtIENsaWVudC1mYWNpbmcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxmYWxzZSB8IHtidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59IHwgbnVsbD59IC0gUmVwbGF5IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3ByZXBhcmVSZXBsYXlTdGF0ZSh7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbkNoYW5uZWwsIHN1YnNjcmlwdGlvblBhcmFtc30pIHtcbiAgICBpZiAoIWxhc3RFdmVudElkKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHN0b3JlLmdldEV2ZW50QnlJZCh7Y2hhbm5lbCwgaWQ6IGxhc3RFdmVudElkfSlcblxuICAgIGlmICghY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbDogc3Vic2NyaXB0aW9uQ2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtczogc3Vic2NyaXB0aW9uUGFyYW1zLCB0eXBlOiBcInJlcGxheS1nYXBcIn0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyZWQ6IGZhbHNlLFxuICAgICAgY2VpbGluZ1NlcXVlbmNlOiAoYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbCkpIHx8IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICBjaGVja3BvaW50U2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICByZXBsYXlpbmc6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXBsYXkgY2hhbm5lbCBldmVudHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufX0gYXJncy5yZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZXBsYXkgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBzZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2hlY2twb2ludFNlcXVlbmNlLFxuICAgICAgdXBUb1NlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICByZXBsYXllZDogdHJ1ZSxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmlzaCByZXBsYXkgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSByZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBidWZmZXJlZCBldmVudHMgYXJlIGZsdXNoZWQuXG4gICAqL1xuICBhc3luYyBfZmluaXNoUmVwbGF5U3RhdGUoY2hhbm5lbCwgcmVwbGF5U3RhdGUpIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHJlcGxheVN0YXRlLnJlcGxheWluZyA9IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmRlbGV0ZShjaGFubmVsKVxuXG4gICAgaWYgKCFyZXBsYXlTdGF0ZS5idWZmZXJlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBsaXZlRXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBsaXZlRXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgdGVuYW50LlxuICAgKiBAcGFyYW0ge3tjaGFubmVsPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19IGFyZ3MgLSBUZW5hbnQgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5wYXJhbXM/LigpXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zID0ge1xuICAgICAgLi4uKHJlcXVlc3RQYXJhbXMgJiYgdHlwZW9mIHJlcXVlc3RQYXJhbXMgPT09IFwib2JqZWN0XCIgPyByZXF1ZXN0UGFyYW1zIDoge30pLFxuICAgICAgLi4uKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiID8gcGFyYW1zIDoge30pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gKi8gKHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB1bmRlZmluZWQsXG4gICAgICBzdWJzY3JpcHRpb246IGNoYW5uZWwgPyB7Y2hhbm5lbCwgcGFyYW1zfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5tYXNrIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBheWxvYWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBheWxvYWRbaV0gXj0gbWFza1tpICUgNF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25PcGVuID0gaGFuZGxlciA/IGhhbmRsZXIub25PcGVuIDogbnVsbFxuXG4gICAgICBpZiAob25PcGVuKSB7XG4gICAgICAgIGF3YWl0IG9uT3Blbih7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBvcGVuIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gbWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBJbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25NZXNzYWdlID0gaGFuZGxlciA/IGhhbmRsZXIub25NZXNzYWdlIDogbnVsbFxuXG4gICAgICBpZiAob25NZXNzYWdlKSB7XG4gICAgICAgIGF3YWl0IG9uTWVzc2FnZSh7bWVzc2FnZSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkVycm9yID0gaGFuZGxlciA/IGhhbmRsZXIub25FcnJvciA6IG51bGxcblxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgb25FcnJvcih7ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkNsb3NlID0gaGFuZGxlciA/IGhhbmRsZXIub25DbG9zZSA6IG51bGxcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgb25DbG9zZSh7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBjbG9zZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3RlIGFkZHJlc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gUmVtb3RlIGFkZHJlc3MgcmVzb2x2ZWQgZnJvbSB0aGUgd2Vic29ja2V0IHVwZ3JhZGUgcmVxdWVzdC5cbiAgICovXG4gIHJlbW90ZUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBncmFkZVJlcXVlc3Q/LnJlbW90ZUFkZHJlc3MoKSB8fCB0aGlzLmNsaWVudC5yZW1vdGVBZGRyZXNzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgbWVzc2FnZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJ9IGhhbmRsZXIgLSBIYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlclxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgfVxuXG4gIGFzeW5jIF9yZXNvbHZlTWVzc2FnZUhhbmRsZXJQcm9taXNlKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuXG4gICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIC8vIEluc3RhbGwgaGFuZGxlciBhbmQgZHJhaW4gb25PcGVuIGJlZm9yZSByZXBsYXlpbmcgcXVldWVkXG4gICAgICAgIC8vIG1lc3NhZ2VzLiBzZXRNZXNzYWdlSGFuZGxlcigpIGZpcmVzIG9uT3BlbiBhcyBmaXJlLWFuZC1mb3JnZXQ7XG4gICAgICAgIC8vIGF3YWl0aW5nIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSBkaXJlY3RseSBoZXJlIGNsb3NlcyB0aGVcbiAgICAgICAgLy8gcmFjZSB3aGVyZSBxdWV1ZWQgc3Vic2NyaWJlL2Nvbm5lY3Rpb24tKiBmcmFtZXMgd291bGRcbiAgICAgICAgLy8gZGlzcGF0Y2ggd2hpbGUgYW4gYXN5bmMgb25PcGVuIGlzIHN0aWxsIHNldHRpbmcgdXAgc2Vzc2lvblxuICAgICAgICAvLyBzdGF0ZS5cbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgICAgYXdhaXQgdGhpcy5fZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcjogdHlwZW9mIGhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciByZXNvbHZlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZsdXNoIHF1ZXVlZCBtZXNzYWdlcy5cbiAgICogQHBhcmFtIHt7dXNlSGFuZGxlcjogYm9vbGVhbn19IGFyZ3MgLSBBcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm1lc3NhZ2VRdWV1ZS5zbGljZSgpXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHF1ZXVlZCkge1xuICAgICAgaWYgKHVzZUhhbmRsZXIgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==