discord-player 6.2.0 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -5
- package/dist/index.mjs +4 -5
- package/package.json +1 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1499,7 +1499,7 @@ var GuildQueueStatistics = class {
|
|
|
1499
1499
|
memoryUsage: process.memoryUsage(),
|
|
1500
1500
|
versions: {
|
|
1501
1501
|
node: process.version,
|
|
1502
|
-
player: "6.2.
|
|
1502
|
+
player: "6.2.1"
|
|
1503
1503
|
}
|
|
1504
1504
|
};
|
|
1505
1505
|
}
|
|
@@ -3126,8 +3126,8 @@ import {
|
|
|
3126
3126
|
AF_VAPORWAVE_RATE,
|
|
3127
3127
|
FiltersChain as FiltersChain2
|
|
3128
3128
|
} from "@discord-player/equalizer";
|
|
3129
|
-
import { createAudioPlayer as createAudioPlayer2, AudioPlayer as AudioPlayer3
|
|
3130
|
-
var version2 = "6.2.
|
|
3129
|
+
import { createAudioPlayer as createAudioPlayer2, AudioPlayer as AudioPlayer3 } from "@discordjs/voice";
|
|
3130
|
+
var version2 = "6.2.1";
|
|
3131
3131
|
if (!djsVersion.startsWith("14")) {
|
|
3132
3132
|
process.emitWarning(`Discord.js v${djsVersion} is incompatible with Discord Player v${version2}! Please use >=v14.x of Discord.js`);
|
|
3133
3133
|
}
|
|
@@ -3142,7 +3142,6 @@ export {
|
|
|
3142
3142
|
BASS_EQ_BANDS,
|
|
3143
3143
|
BaseExtractor,
|
|
3144
3144
|
FilterType as BiquadFilterType,
|
|
3145
|
-
CreateAudioPlayerOptions,
|
|
3146
3145
|
DiscordPlayerQueryResultCache,
|
|
3147
3146
|
EqualizerConfigurationPreset,
|
|
3148
3147
|
ErrorStatusCode,
|
|
@@ -3189,4 +3188,4 @@ export {
|
|
|
3189
3188
|
useTimeline,
|
|
3190
3189
|
version2 as version
|
|
3191
3190
|
};
|
|
3192
|
-
//# sourceMappingURL=index.mjs.map
|
|
3191
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9UeXBlVXRpbC50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvUGxheWxpc3QudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvR3VpbGRRdWV1ZUhpc3RvcnkudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5UmVzb2x2ZXIudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL1RyYWNrLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL19jb250YWluZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9hZGRQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9jbGVhclBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldFBsYXllcnMudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRHbG9iYWxSZWdpc3RyeS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvUGxheWVyRXJyb3IudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXIudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvaG9va3MvY29tbW9uLnRzIiwgIi4uL3NyYy9ob29rcy91c2VIaXN0b3J5LnRzIiwgIi4uL3NyYy9ob29rcy91c2VQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVF1ZXVlLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNYXN0ZXJQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lc3RhbXAudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9TdHJ1Y3R1cmVzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi4yLjEnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBUaW1lRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzcmMubGVuZ3RoKV07XG4gICAgfVxufVxuXG5leHBvcnQgeyBVdGlsIH07XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5jbGFzcyBBdWRpb0ZpbHRlcnMge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICAgICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgICAgIGJhc3Nib29zdDogYmFzcygyMCksXG4gICAgICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAgICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICAgICAgdmFwb3J3YXZlOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOCcsXG4gICAgICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICAgICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgICAgIHBoYXNlcjogJ2FwaGFzZXI9aW5fZ2Fpbj0wLjQnLFxuICAgICAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICAgICAgcmV2ZXJzZTogJ2FyZXZlcnNlJyxcbiAgICAgICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgICAgIG5vcm1hbGl6ZXI6ICdhY29tcHJlc3NvcicsXG4gICAgICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgICAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICAgICAgc3ViYm9vc3Q6ICdhc3ViYm9vc3QnLFxuICAgICAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICAgICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgICAgICBnYXRlOiAnYWdhdGUnLFxuICAgICAgICBoYWFzOiAnaGFhcycsXG4gICAgICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgICAgICBtb25vOiAncGFuPW1vbm98YzA9LjUqYzArLjUqYzEnLFxuICAgICAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgICAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgICAgICBjb21wcmVzc29yOiAnY29tcGFuZD1wb2ludHM9LTgwLy0xMDV8LTYyLy04MHwtMTUuNC8tMTUuNHwwLy0xMnwyMC8tNy42JyxcbiAgICAgICAgZXhwYW5kZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICAgICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgICAgICBjaG9ydXMyZDogJ2Nob3J1cz0wLjY6MC45OjUwfDYwOjAuNHwwLjMyOjAuMjV8MC40OjJ8MS4zJyxcbiAgICAgICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICAgICAgZGltOiBgYWZmdGZpbHQ9XCIncmVhbD1yZSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknOmltYWc9J2ltICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSdcImAsXG4gICAgICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCdcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGhpcy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8eyBuYW1lOiBGaWx0ZXJzTmFtZTsgdmFsdWU6IHN0cmluZyB9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgICAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEF1ZGlvRmlsdGVycy5sZW5ndGhcbiAgICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogS1tdKSB7XG4gICAgICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAubWFwKChtKSA9PiB0aGlzLmdldChtKSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKSB7XG4gICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF1ZGlvRmlsdGVycztcbmV4cG9ydCB7IEF1ZGlvRmlsdGVycyB9O1xuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vU3RydWN0dXJlcy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwJztcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxSZWFkYWJsZSB8IHN0cmluZz4ge1xuICAgICAgICB2b2lkIGluZm87XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IEltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gaGFuZGxlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShxdWVyeTogc3RyaW5nLCBjb250ZXh0OiBFeHRyYWN0b3JTZWFyY2hDb250ZXh0KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgY29udGV4dDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgSW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3ModHJhY2s6IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZWFyY2hDb250ZXh0IHtcbiAgICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAgIHJlcXVlc3RPcHRpb25zPzogUmVxdWVzdE9wdGlvbnM7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dO1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAgICovXG4gICAgcmVnaXN0ZXJlZDogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAgICovXG4gICAgdW5yZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGRlYWN0aXZhdGU6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGVycm9yOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGVmYXVsdCBleHRyYWN0b3JzIGZyb20gYEBkaXNjb3JkLXBsYXllci9leHRyYWN0b3JgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBVdGlsLmltcG9ydChrbm93bkV4dHJhY3RvckxpYik7XG4gICAgICAgIGlmIChtb2QuZXJyb3IpIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbW9kLmVycm9yIGFzIEVycm9yIH07XG5cbiAgICAgICAga25vd25FeHRyYWN0b3JLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKSB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgICAgICBpZiAoIWV4dHJhY3RvcikgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBleHRyYWN0b3IuaWRlbnRpZmllciB8fCB0aGlzLnN0b3JlLmZpbmRLZXkoKGUpID0+IGUgPT09IGV4dHJhY3RvcikhO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkZWFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlckFsbCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZmlsdGVyQmxvY2tlZCBGaWx0ZXIgYmxvY2tlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiB0aGlzLnN0b3JlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgICBzdHJhdGVneT86IFF1ZXVlU3RyYXRlZ3k7XG4gICAgdm9sdW1lPzogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbjtcbiAgICByZXNhbXBsZXI/OiBudW1iZXIgfCBib29sZWFuO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKHNlcnZlci5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChzZXJ2ZXIuaWQpIGFzIEd1aWxkUXVldWU8VD47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgICAgIG9wdGlvbnMudm9sdW1lID8/PSAxMDA7XG4gICAgICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgICAgIG9wdGlvbnMuZGlzYWJsZUhpc3RvcnkgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnNraXBPbk5vU3RyZWFtID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3AgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICAgICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgICAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IEd1aWxkUXVldWU8VD4odGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGd1aWxkOiBzZXJ2ZXIsXG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgICAgdm9sdW1lOiBvcHRpb25zLnZvbHVtZSxcbiAgICAgICAgICAgIGVxdWFsaXplcjogb3B0aW9ucy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBmaWx0ZXJlcjogb3B0aW9ucy5hX2ZpbHRlcixcbiAgICAgICAgICAgIGJpcXVhZDogb3B0aW9ucy5iaXF1YWQsXG4gICAgICAgICAgICByZXNhbXBsZXI6IG9wdGlvbnMucmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZUhpc3Rvcnk6IG9wdGlvbnMuZGlzYWJsZUhpc3RvcnksXG4gICAgICAgICAgICBza2lwT25Ob1N0cmVhbTogb3B0aW9ucy5za2lwT25Ob1N0cmVhbSxcbiAgICAgICAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICAgICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcblxuICAgICAgICBxdWV1ZS5ub2RlLnN0b3AodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gdW5rbm93bj4ge1xuICAgIGd1aWxkOiBHdWlsZDtcbiAgICBxdWV1ZVN0cmF0ZWd5OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gICAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gICAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gICAgZmZtcGVnRmlsdGVyczogRmlsdGVyc05hbWVbXTtcbiAgICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbTogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wOiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBlbnVtIEd1aWxkUXVldWVFdmVudCB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQgPSAnYXVkaW9UcmFja2FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkID0gJ2F1ZGlvVHJhY2tzQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tSZW1vdmUgPSAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlID0gJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uID0gJ2Nvbm5lY3Rpb24nLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAgICovXG4gICAgZGlzY29ubmVjdCA9ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnID0gJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvciA9ICdlcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsID0gJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWUgPSAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0ID0gJ3BsYXllclN0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRXJyb3IgPSAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaCA9ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwID0gJ3BsYXllclNraXAnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXIgPSAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZSA9ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2UgPSAndm9sdW1lQ2hhbmdlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlID0gJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWUgPSAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlID0gJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGUgPSAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlID0gJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGUgPSAnYXVkaW9GaWx0ZXJzVXBkYXRlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IHVua25vd24+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllcidzIHZvbHVtZSBpcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgICAqIEBwYXJhbSBuZXdWb2x1bWUgVGhlIHVwZGF0ZWQgdm9sdW1lXG4gICAgICovXG4gICAgdm9sdW1lQ2hhbmdlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLCBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogUENNRmlsdGVyc1tdLCBuZXdGaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYXVkaW9GaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyB0cmFja3M6IFF1ZXVlPFRyYWNrPjtcbiAgICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBub2RlID0gbmV3IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICAgIHB1YmxpYyBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+ICh7XG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgICB9KTtcbiAgICBwdWJsaWMgcmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gICAgcHVibGljIHRpbWVvdXRzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBOb2RlSlMuVGltZW91dD4oKTtcbiAgICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHVibGljIG9wdGlvbnM6IEd1aWxkTm9kZUluaXQ8TWV0YT4pIHtcbiAgICAgICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaChvcHRpb25zLnJlcGVhdE1vZGUpKSB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2RlYnVnJywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIGlmIChpc011bHRpKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYXVkaW9UcmFja3NBZGQnLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYXVkaW9UcmFja0FkZCcsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMClcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAgICovXG4gICAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBkZXN0IFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdm9pY2UgYmFzZWQgY2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSksIHJlY2VpdmVkICR7Y2hhbm5lbD8udHlwZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgICAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBxdWV1ZTogdGhpcyxcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllclxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnY29ubmVjdGlvbicsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2Vycm9yJywgdGhpcywgZSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkZWJ1ZycsIChtKSA9PiB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnZGVidWcnLCB0aGlzLCBtKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZHNwJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdkc3BVcGRhdGUnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYmlxdWFkRmlsdGVyc1VwZGF0ZScsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcUJhbmRzJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2VxdWFsaXplclVwZGF0ZScsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCd2b2x1bWUnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgIT09IGYpIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCd2b2x1bWVDaGFuZ2UnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLCBmKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICB9KX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclRyaWdnZXInLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclN0YXJ0JywgdGhpcywgdHJhY2spO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIH1cblxuICAgICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgICAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZXNldFByb2dyZXNzKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyRmluaXNoJywgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ05vIG1vcmUgdHJhY2tzIGxlZnQgaW4gdGhlIHF1ZXVlIHRvIHBsYXkgYW5kIHJlcGVhdCBtb2RlIGlzIG9mZiwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tzLmFkZCh0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gYXV0b3BsYXksIGluaXRpYXRpbmcgYXV0b3BsYXkgaGFuZGxlci4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKSE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgI2VtaXRFbmQoKSB7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2VtcHR5UXVldWUnLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2spKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHRvIHByb3ZpZGUgcmVzdWx0cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCF0cmFja3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IE5vIHJlbGF0ZWQgdHJhY2tzIGZvdW5kLmApO1xuICAgICAgICAgICAgICAgIHRocm93ICdubyByZWxhdGVkIHRyYWNrcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFBpY2tpbmcgcmFuZG9tIHRyYWNrIGZyb20gZmlyc3QgNSB0cmFja3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICAgIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgICAgICogLSBgYWxidW1gXG4gICAgICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgICAgICogLSBgeW91dHViZWBcbiAgICAgICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgICAgICogLSBgc3BvdGlmeWBcbiAgICAgICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAgICovXG4gICAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCAoKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUubm9kZS5za2lwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgICAqL1xuICAgIHB1YmxpYyBiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cygpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGxheU9wdGlvbnMge1xuICAgIHF1ZXVlPzogYm9vbGVhbjtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHRyYW5zaXRpb25Nb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAgICovXG4gICAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgICAgIHJldHVybiBkdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgICAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgICAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVyc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMucXVldWUuY3VycmVudFRyYWNrLmR1cmF0aW9uTVMgOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKChjdXJyZW50IC8gdG90YWwpICogMTAwKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB7IGluZGljYXRvciA9ICdcdUQ4M0RcdUREMTgnLCBsZW5ndGggPSAxNSwgbGluZSA9ICdcdTI1QUMnLCB0aW1lY29kZXMgPSB0cnVlIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvZ3Jlc3NiYXIgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxpbmUucmVwZWF0KGxlbmd0aCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5zcGxpY2UoaW5kZXgsIDAsIGluZGljYXRvcik7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtiYXIuam9pbignJyl9IFx1MjUwMyAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX0gXHUyNTAzICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2b2x1bWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdm9sdW1lXG4gICAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBiaXQgcmF0ZVxuICAgICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvVHJhY2tSZW1vdmUnLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrc1JlbW92ZScsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYWNrJyk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrQWRkJywgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgICAgICBpZiAoIXNyYykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICAgICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICAgICAgaWYgKHNyYyA8IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICAgICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGxheVN0cmVhbShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoYFJlY2VpdmVkIHBsYXkgcmVxdWVzdCBmcm9tIGd1aWxkICR7dGhpcy5xdWV1ZS5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5xdWV1ZS5ndWlsZC5pZH0pYCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2sgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMFxuICAgICAgICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApITtcblxuICAgICAgICBpZiAocmVzICYmIG9wdGlvbnMucXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEluaXRpYXRpbmcgc3RyZWFtIGV4dHJhY3Rpb24gcHJvY2Vzcy4uLmApO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdHJhY2sucmF3Py5zb3VyY2UgfHwgdHJhY2suc291cmNlO1xuICAgICAgICAgICAgY29uc3QgcXQ6IFNlYXJjaFF1ZXJ5VHlwZSA9IHRyYWNrLnF1ZXJ5VHlwZSB8fCAoc3JjID09PSAnc3BvdGlmeScgPyAnc3BvdGlmeVNvbmcnIDogc3JjID09PSAnYXBwbGVfbXVzaWMnID8gJ2FwcGxlTXVzaWNTb25nJyA6IHNyYyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgUmVhZGFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IHRyYWNrLnJhdz8uc291cmNlID09PSAneW91dHViZScgPyAoPGFueT50aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnl0ZGxPcHRpb25zPy5yZXF1ZXN0T3B0aW9ucyk/LmhlYWRlcnM/LmNvb2tpZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBjbVN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW1TcmMuc3RyZWFtLCB0cmFjaywgb3B0aW9ucy5zZWVrID8/IDAsIGNvb2tpZXMpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmJpcXVhZCA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZXF1YWxpemVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5maWx0ZXJlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/IHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vlazogb3B0aW9ucy5zZWVrXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShwY21TdHJlYW0sIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuYmlxdWFkID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZXF1YWxpemVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmZpbHRlcmVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvIHBsYXllcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyU2tpcCcsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJFcnJvcicsIHRoaXMucXVldWUsIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCwgdHJhY2spO1xuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgICAgIGlmIChuZXh0VHJhY2spIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0O1xuICAgIH1cblxuICAgIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIhLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuZmlsdGVycy5sZW5ndGggPyBbJy1hZicsIHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9TdHJpbmcoKV0gOiBbXSxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6ICdzMTZsZScsXG4gICAgICAgICAgICAgICAgY29va2llc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gY2xvc2VkIGR1ZSB0byBhbiBlcnJvciBmcm9tIEZGbXBlZyBzdHJlYW06ICR7ZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gKTtcblxuICAgICAgICAgICAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyRXJyb3InLCB0aGlzLnF1ZXVlLCBlcnIsIHRyYWNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmZm1wZWdTdHJlYW07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFlvdVR1YmUgfSBmcm9tICd5b3V0dWJlLXNyJztcbmltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHNvdW5kY2xvdWQgZnJvbSAnc291bmRjbG91ZC1zY3JhcGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9hbGJ1bVxcLy4rXFwvKFswLTldKykkLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBRdWVyeSByZXNvbHZlclxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgICAgICAgdmltZW9SZWdleCxcbiAgICAgICAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0ge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBxdWVyeSAke3R5cGVvZiBxdWVyeX0sIGV4cGVjdGVkIGEgc3RyaW5nLmApO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdRdWVyeSBpcyByZXF1aXJlZCEnKTtcbiAgICAgICAgcXVlcnkgPSAhcXVlcnkuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykgPyBxdWVyeS50cmltKCkgOiBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBpZiAoKHNvdW5kY2xvdWQudmFsaWRhdGVVUkwgfHwgc291bmRjbG91ZC5kZWZhdWx0LnZhbGlkYXRlVVJMKShxdWVyeSwgJ3RyYWNrJykpIHJldHVybiBRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSztcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBpZiAoKHNvdW5kY2xvdWQudmFsaWRhdGVVUkwgfHwgc291bmRjbG91ZC5kZWZhdWx0LnZhbGlkYXRlVVJMKShxdWVyeSwgJ3BsYXlsaXN0JykgfHwgcXVlcnkuaW5jbHVkZXMoJy9zZXRzLycpKSByZXR1cm4gUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1Q7XG4gICAgICAgIGlmIChZb3VUdWJlLmlzUGxheWxpc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1Q7XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLllPVVRVQkVfVklERU87XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfU09ORztcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1Q7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNO1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5WSU1FTztcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlJFVkVSQk5BVElPTjtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1Q7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkc7XG4gICAgICAgIGlmIChhdHRhY2htZW50UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVJCSVRSQVJZO1xuXG4gICAgICAgIHJldHVybiBmYWxsYmFja1NlYXJjaEVuZ2luZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpID09PSBRdWVyeVR5cGUuVklNRU9cbiAgICAgICAgICAgID8gcXVlcnlcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpXG4gICAgICAgICAgICAgICAgICAucG9wKClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFlvdVR1YmUuUmVnZXguVklERU9fSUQudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBZb3VUdWJlLlJlZ2V4LlZJREVPX1VSTC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZSwgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vU3RydWN0dXJlcy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL1N0cnVjdHVyZXMvUGxheWxpc3QnO1xuaW1wb3J0IHsgZG93bmxvYWRPcHRpb25zIH0gZnJvbSAneXRkbC1jb3JlJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuLi91dGlscy9RdWVyeUNhY2hlJztcblxuZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXVkaW9GaWx0ZXJzfSBRdWV1ZUZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFRyYWNrU291cmNlXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhd1RyYWNrRGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3c1xuICogQHByb3BlcnR5IHtVc2VyfSByZXF1ZXN0ZWRCeSBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3R9IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0XG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBbc291cmNlPVwiYXJiaXRyYXJ5XCJdIFRoZSBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7YW55fSBbZW5naW5lXSBUaGUgZW5naW5lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsaXZlXSBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3XSBUaGUgcmF3IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHNvdXJjZT86IFRyYWNrU291cmNlO1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZURhdGFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXlzIFRpbWUgaW4gZGF5c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhvdXJzIFRpbWUgaW4gaG91cnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW51dGVzIFRpbWUgaW4gbWludXRlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlY29uZHMgVGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAgIGRheXM6IG51bWJlcjtcbiAgICBob3VyczogbnVtYmVyO1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aW1lY29kZXNdIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVldWVdIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVuZ3RoXSBUaGUgYmFyIGxlbmd0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsaW5lXSBUaGUgYmFyIHRyYWNrXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGljYXRvcl0gVGhlIGluZGljYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gICAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgbGluZT86IHN0cmluZztcbiAgICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWx0ZXJzVXBkYXRlPWZhbHNlXSBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmNvZGVyQXJncz1bXV0gRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2Vla10gVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbW1lZGlhdGU9ZmFsc2VdIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhcmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHtVc2VyUmVzb2x2YWJsZX0gcmVxdWVzdGVkQnkgVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICogQHByb3BlcnR5IHt0eXBlb2YgUXVlcnlUeXBlfHN0cmluZ30gW3NlYXJjaEVuZ2luZT0nYXV0byddIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc1tdXSBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVDYWNoZV0gSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAqIEBwcm9wZXJ0eSB7U2VhcmNoUXVlcnlUeXBlfSBbZmFsbGJhY2tTZWFyY2hFbmdpbmU9J2F1dG9TZWFyY2gnXSBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlclJlc29sdmFibGU7XG4gICAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgaWdub3JlQ2FjaGU/OiBib29sZWFuO1xuICAgIGZhbGxiYWNrU2VhcmNoRW5naW5lPzogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqIEB0eXBlZGVmIHtudW1iZXJ9IFF1ZXVlUmVwZWF0TW9kZVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIE9GRiA9IDAsXG4gICAgVFJBQ0sgPSAxLFxuICAgIFFVRVVFID0gMixcbiAgICBBVVRPUExBWSA9IDNcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5bGlzdEluaXREYXRhXG4gKiBAcHJvcGVydHkge1RyYWNrW119IHRyYWNrcyBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgcGxheWxpc3Qgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBwbGF5bGlzdCBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgcGxheWxpc3QgdXJsXG4gKiBAcHJvcGVydHkge2FueX0gW3Jhd1BsYXlsaXN0XSBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgICB0cmFja3M6IFRyYWNrW107XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUcmFja0pTT05cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgdHJhY2sgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3IgVGhlIGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkdXJhdGlvbiBUaGUgZHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbk1TIFRoZSBkdXJhdGlvbiBpbiBtc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3cyBjb3VudFxuICogQHByb3BlcnR5IHtTbm93Zmxha2V9IHJlcXVlc3RlZEJ5IFRoZSBpZCBvZiB0aGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3RKU09OfSBbcGxheWxpc3RdIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tKU09OIHtcbiAgICBpZDogU25vd2ZsYWtlO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgICB2aWV3czogbnVtYmVyO1xuICAgIHJlcXVlc3RlZEJ5OiBTbm93Zmxha2U7XG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWxpc3RKU09OXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIHBsYXlsaXN0IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBwbGF5bGlzdCB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgdHJhY2sgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtUcmFja0pTT05bXX0gdHJhY2tzIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVySW5pdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2F1dG9SZWdpc3RlckV4dHJhY3Rvcj10cnVlXSBJZiBpdCBzaG91bGQgYXV0b21hdGljYWxseSByZWdpc3RlciBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAqIEBwcm9wZXJ0eSB7WVRETERvd25sb2FkT3B0aW9uc30gW3l0ZGxPcHRpb25zXSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gYHl0ZGwtY29yZWBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY29ubmVjdGlvblRpbWVvdXQ9MjAwMDBdIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Ntb290aFZvbHVtZT10cnVlXSBUb2dnbGUgc21vb3RoIHZvbHVtZSB0cmFuc2l0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsYWdNb25pdG9yPTMwMDAwXSBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvY2tWb2ljZVN0YXRlSGFuZGxlcl0gUHJldmVudCB2b2ljZSBzdGF0ZSBoYW5kbGVyIGZyb20gYmVpbmcgb3ZlcnJpZGRlblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc10gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrU3RyZWFtRnJvbV0gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgc3RyZWFtaW5nIGZyb21cbiAqIEBwcm9wZXJ0eSB7UXVlcnlDYWNoZSB8IG51bGx9IFtxdWVyeUNhY2hlXSBRdWVyeSBjYWNoZSBwcm92aWRlclxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlSW5zdGFuY2VdIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgYXV0b1JlZ2lzdGVyRXh0cmFjdG9yPzogYm9vbGVhbjtcbiAgICB5dGRsT3B0aW9ucz86IGRvd25sb2FkT3B0aW9ucztcbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICBzbW9vdGhWb2x1bWU/OiBib29sZWFuO1xuICAgIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyPzogYm9vbGVhbjtcbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZSB8IG51bGw7XG4gICAgaWdub3JlSW5zdGFuY2U/OiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFRyYWNrSlNPTiB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrIHtcbiAgICBwdWJsaWMgcGxheWVyITogUGxheWVyO1xuICAgIHB1YmxpYyB0aXRsZSE6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24hOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvciE6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsITogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWwhOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uITogc3RyaW5nO1xuICAgIHB1YmxpYyB2aWV3cyE6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICBwdWJsaWMgcmF3OiBSYXdUcmFja0RhdGEgPSB7XG4gICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICB9IGFzIFJhd1RyYWNrRGF0YTtcbiAgICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIFRyYWNrXG4gICAgICogQHBhcmFtIHtSYXdUcmFja0RhdGF9IGRhdGEgVHJhY2sgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBSYXdUcmFja0RhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgICAgICAgKiBAbmFtZSBUcmFjayNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BsYXllcicsIHsgdmFsdWU6IHBsYXllciwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpdGxlIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlc2NyaXB0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF1dGhvciBvZiB0aGlzIHRyYWNrXG4gICAgICAgICAqIEBuYW1lIFRyYWNrI2F1dGhvclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVVJMIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaHVtYm5haWwgb2YgdGhpcyB0cmFja1xuICAgICAgICAgKiBAbmFtZSBUcmFjayN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIER1cmF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZHVyYXRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFZpZXdzIGNvdW50IG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdmlld3NcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcnNvbiB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjcmVxdWVzdGVkQnlcbiAgICAgICAgICogQHR5cGUge1VzZXJ9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGlzIHRyYWNrIGJlbG9uZ3MgdG8gcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZnJvbVBsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmF3IHRyYWNrIGRhdGFcbiAgICAgICAgICogQG5hbWUgVHJhY2sjcmF3XG4gICAgICAgICAqIEB0eXBlIHtSYXdUcmFja0RhdGF9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHJhY2sgaWRcbiAgICAgICAgICogQG5hbWUgVHJhY2sjaWRcbiAgICAgICAgICogQHR5cGUge1Nub3dmbGFrZX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3Qgd2hpY2ggdHJhY2sgYmVsb25nc1xuICAgICAgICAgKiBAbmFtZSBUcmFjayNwbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7UGxheWxpc3R9XG4gICAgICAgICAqL1xuXG4gICAgICAgIHZvaWQgdGhpcy5fcGF0Y2goZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGF0Y2goZGF0YTogUmF3VHJhY2tEYXRhKSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybCA/PyAnJztcbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgICAgIHRoaXMudmlld3MgPSBkYXRhLnZpZXdzID8/IDA7XG4gICAgICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgICAgIHRoaXMucGxheWxpc3QgPSBkYXRhLnBsYXlsaXN0O1xuICAgICAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oe30sIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sIGRhdGEucmF3ID8/IGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKiBAdHlwZSB7UXVldWV9XG4gICAgICovXG4gICAgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGltZXMgPSAobjogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCB0biA9IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykgdG4gKj0gbjtcbiAgICAgICAgICAgIHJldHVybiB0IDw9IDAgPyAxMDAwIDogdG4gKiAxMDAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLm1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqIEB0eXBlIHtUcmFja1NvdXJjZX1cbiAgICAgKi9cbiAgICBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICogQHJldHVybnMge1RyYWNrSlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04oaGlkZVBsYXlsaXN0PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICAgICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgICAgIH0gYXMgVHJhY2tKU09OO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjb25zdW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNvbnN1bWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhY3F1aXJlKG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgZW50cnkuY29uc3VtZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSB0aGUgY3VycmVudCBhY3F1aXNpdGlvbiBhbmQgbW92ZSB0byBuZXh0IGVudHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBBc3luY1F1ZXVlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICAgICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlRW50cnkge1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICBwdWJsaWMgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVqZWN0ITogKGVycjogRXJyb3IpID0+IHZvaWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLCBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhc2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgQXVkaW9GaWx0ZXJzIGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplciwgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgRkZtcGVnU3RyZWFtT3B0aW9ucywgY3JlYXRlRkZtcGVnU3RyZWFtIH0gZnJvbSAnLi4vdXRpbHMvRkZtcGVnU3RyZWFtJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgICAgICB9KVxuICAgICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQgPSB7XG4gICAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl0pLFxuICAgIENsdWI6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDguMCwgNS42LCA1LjYsIDUuNiwgMy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXSksXG4gICAgRnVsbEJhc3NUcmVibGU6IG1ha2VCYW5kcyhbNy4yLCA1LjYsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTQuOCwgMS42LCA4LjAsIDExLjIsIDEyLjAsIDEyLjBdKSxcbiAgICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICAgIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdKSxcbiAgICBMYXJnZUhhbGw6IG1ha2VCYW5kcyhbMTAuNCwgMTAuNCwgNS42LCA1LjYsIC0xLjExMDIyZS0xNSwgLTQuOCwgLTQuOCwgLTQuOCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgICBQYXJ0eTogbWFrZUJhbmRzKFs3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdKSxcbiAgICBQb3A6IG1ha2VCYW5kcyhbLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdKSxcbiAgICBSZWdnYWU6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gICAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICAgIFNvZnRSb2NrOiBtYWtlQmFuZHMoWzQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF0pLFxuICAgIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWcuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogbVxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICBcIi1yZWNvbm5lY3RcIiwgXCIxXCIsXG4gICAgICAgIFwiLXJlY29ubmVjdF9zdHJlYW1lZFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X2RlbGF5X21heFwiLCBcIjVcIixcbiAgICAgICAgXCItaVwiLCBzdHJlYW0sXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBbXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsIG9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgY29uc3QgYXJncyA9IHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID8gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOiBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihvcHRpb25zLnNlZWspKSBhcmdzLnVuc2hpZnQoJy1zcycsIFN0cmluZyhvcHRpb25zLnNlZWspKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB0cmFuc2NvZGVyID0gbmV3IChwcmlzbS5GRm1wZWcgfHwgKDxhbnk+cHJpc20pLmRlZmF1bHQuRkZtcGVnKSh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcbiAgICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICAgIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgICAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNjb2Rlcjtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgICBsYXRlbmN5OiB7XG4gICAgICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgICAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXR1czoge1xuICAgICAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgICAgIHBhdXNlZDogYm9vbGVhbjtcbiAgICAgICAgaWRsZTogYm9vbGVhbjtcbiAgICB9O1xuICAgIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gICAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgICBleHRyYWN0b3JzOiBudW1iZXI7XG4gICAgbGlzdGVuZXJzOiBudW1iZXI7XG4gICAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBzdHJpbmc7XG4gICAgICAgIHBsYXllcjogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRlbmN5OiB7XG4gICAgICAgICAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgICAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXJpbmc6IHRoaXMucXVldWUubm9kZS5pc0J1ZmZlcmluZygpLFxuICAgICAgICAgICAgICAgIHBsYXlpbmc6IHRoaXMucXVldWUubm9kZS5pc1BsYXlpbmcoKSxcbiAgICAgICAgICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICAgICAgICAgIGlkbGU6IHRoaXMucXVldWUubm9kZS5pc0lkbGUoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNrc0NvdW50OiB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplLFxuICAgICAgICAgICAgaGlzdG9yeVNpemU6IHRoaXMucXVldWUuaGlzdG9yeS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcnM6IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuc2l6ZSxcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcigobSkgPT4gIW0udXNlci5ib3QpLnNpemUgfHwgMCxcbiAgICAgICAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgICAgICAgICBwbGF5ZXI6ICc2LjIuMSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlcyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgUGxheWVyPigpO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpO1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkUGxheWVyKHBsYXllcjogUGxheWVyKSB7XG4gICAgaWYgKGluc3RhbmNlcy5oYXMocGxheWVyLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpbnN0YW5jZXMuc2V0KHBsYXllci5pZCwgcGxheWVyKTtcblxuICAgIHJldHVybiBpbnN0YW5jZXMuaGFzKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIHJldHVybiBpbnN0YW5jZXMuZGVsZXRlKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYXllcnMoKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5hcnJheSgpO1xufVxuIiwgImltcG9ydCB7IGdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn1cbiIsICJpbXBvcnQgeyBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2gsIHR5cGUgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRW5kQmVoYXZpb3JUeXBlIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlUmVjZWl2ZXJPcHRpb25zIHtcbiAgICBtb2RlPzogJ29wdXMnIHwgJ3BjbSc7XG4gICAgZW5kPzogRW5kQmVoYXZpb3JUeXBlO1xuICAgIHNpbGVuY2VEdXJhdGlvbj86IG51bWJlcjtcbiAgICBjcmM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBSYXdUcmFja0luaXQgPSBQYXJ0aWFsPE9taXQ8UmF3VHJhY2tEYXRhLCAnYXV0aG9yJyB8ICdwbGF5bGlzdCcgfCAnc291cmNlJyB8ICdlbmdpbmUnIHwgJ3JhdycgfCAncXVlcnlUeXBlJyB8ICdkZXNjcmlwdGlvbicgfCAndmlld3MnPj47XG5cbmV4cG9ydCBjbGFzcyBWb2ljZVJlY2VpdmVyTm9kZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZVJhd1RyYWNrKHN0cmVhbTogUmVhZGFibGUsIGRhdGE6IFJhd1RyYWNrSW5pdCA9IHt9KSB7XG4gICAgICAgIGRhdGEudGl0bGUgPz89IGBSZWNvcmRpbmcgJHtEYXRlLm5vdygpfWA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUcmFjayh0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLCB7XG4gICAgICAgICAgICBhdXRob3I6ICdEaXNjb3JkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICBkdXJhdGlvbjogZGF0YS5kdXJhdGlvbiB8fCAnMDowMCcsXG4gICAgICAgICAgICB2aWV3czogMCxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgdGh1bWJuYWlsOiBkYXRhLnRodW1ibmFpbCB8fCAnaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vZW1iZWQvYXZhdGFycy8wLnBuZycsXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsIHx8ICdodHRwczovL2Rpc2NvcmQuY29tJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICAgICAgICByYXc6IHtcbiAgICAgICAgICAgICAgICBlbmdpbmU6IHN0cmVhbSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIG11bHRpcGxlIHN0cmVhbXMgdG9nZXRoZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtcyBUaGUgYXJyYXkgb2Ygc3RyZWFtcyB0byBtZXJnZVxuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZVJlY29yZGluZ3Moc3RyZWFtczogUmVhZGFibGVbXSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHZvaWQgc3RyZWFtcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQgYSB1c2VyIGluIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB0byByZWNvcmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBSZWNvcmRpbmcgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWNvcmRVc2VyKFxuICAgICAgICB1c2VyOiBVc2VyUmVzb2x2YWJsZSxcbiAgICAgICAgb3B0aW9uczogVm9pY2VSZWNlaXZlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBlbmQ6IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICBtb2RlOiAncGNtJyxcbiAgICAgICAgICAgIHNpbGVuY2VEdXJhdGlvbjogMTAwMFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IF91c2VyID0gdGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZUlkKHVzZXIpO1xuXG4gICAgICAgIGNvbnN0IHBhc3NUaHJvdWdoID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpcy5kaXNwYXRjaGVyLnZvaWNlQ29ubmVjdGlvbi5yZWNlaXZlcjtcblxuICAgICAgICBpZiAoIXJlY2VpdmVyKSB0aHJvdyBuZXcgRXJyb3IoJ1ZvaWNlIHJlY2VpdmVyIGlzIG5vdCBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuXG4gICAgICAgIHJlY2VpdmVyLnNwZWFraW5nLm9uKCdzdGFydCcsICh1c2VySWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VySWQgPT09IF91c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZVN0cmVhbSA9IHJlY2VpdmVyLnN1YnNjcmliZShfdXNlciwge1xuICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBvcHRpb25zLmVuZCB8fCBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuc2lsZW5jZUR1cmF0aW9uID8/IDEwMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ3BjbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbSA9IHJlY2VpdmVTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAocHJpc20ub3B1cyB8fCAoPGFueT5wcmlzbSkuZGVmYXVsdC5vcHVzKS5EZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlU3RyZWFtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoIGFzIFJlYWRhYmxlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGVudW0gRXJyb3JTdGF0dXNDb2RlIHtcbiAgICBTVFJFQU1fRVJST1IgPSAnU3RyZWFtRXJyb3InLFxuICAgIEFVRElPX1BMQVlFUl9FUlJPUiA9ICdBdWRpb1BsYXllckVycm9yJyxcbiAgICBQTEFZRVJfRVJST1IgPSAnUGxheWVyRXJyb3InLFxuICAgIE5PX0FVRElPX1JFU09VUkNFID0gJ05vQXVkaW9SZXNvdXJjZScsXG4gICAgVU5LTk9XTl9HVUlMRCA9ICdVbmtub3duR3VpbGQnLFxuICAgIElOVkFMSURfQVJHX1RZUEUgPSAnSW52YWxpZEFyZ1R5cGUnLFxuICAgIFVOS05PV05fRVhUUkFDVE9SID0gJ1Vua25vd25FeHRyYWN0b3InLFxuICAgIElOVkFMSURfRVhUUkFDVE9SID0gJ0ludmFsaWRFeHRyYWN0b3InLFxuICAgIElOVkFMSURfQ0hBTk5FTF9UWVBFID0gJ0ludmFsaWRDaGFubmVsVHlwZScsXG4gICAgSU5WQUxJRF9UUkFDSyA9ICdJbnZhbGlkVHJhY2snLFxuICAgIFVOS05PV05fUkVQRUFUX01PREUgPSAnVW5rbm93blJlcGVhdE1vZGUnLFxuICAgIFRSQUNLX05PVF9GT1VORCA9ICdUcmFja05vdEZvdW5kJyxcbiAgICBOT19DT05ORUNUSU9OID0gJ05vQ29ubmVjdGlvbicsXG4gICAgREVTVFJPWUVEX1FVRVVFID0gJ0Rlc3Ryb3llZFF1ZXVlJ1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHN0YXR1c0NvZGU6IEVycm9yU3RhdHVzQ29kZTtcbiAgICBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlOiBFcnJvclN0YXR1c0NvZGUgPSBFcnJvclN0YXR1c0NvZGUuUExBWUVSX0VSUk9SKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlID0gYFske2NvZGV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5uYW1lID0gY29kZTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzKTtcbiAgICB9XG5cbiAgICBnZXQgY3JlYXRlZFRpbWVzdGFtcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICB2YWx1ZU9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgICAgICAgY29kZTogdGhpcy5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkVGltZXN0YW1wXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLCBqb2luVm9pY2VDaGFubmVsLCBWb2ljZUNvbm5lY3Rpb24sIGdldFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLCBBdWRpb1BsYXllciB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gICAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgdXRpbHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIHdoZXJlIHZvaWNlIHV0aWxzIHN0b3JlcyBzdHJlYW0gbWFuYWdlcnNcbiAgICAgICAgICogQHR5cGUge0NvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgRXJyb3IoJ0d1aWxkUXVldWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoY2hhbm5lbC5ndWlsZC5pZCwgc3ViKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcygnZGVidWcnKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGd1aWxkKSB8fCBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24sXG4gICAgdmVyc2lvblxufSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXJyb3IsIEVycm9yU3RhdHVzQ29kZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMvUGxheWVyRXJyb3InO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBQb3N0UHJvY2Vzc2VkUmVzdWx0IH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBWb2ljZVJlY2VpdmVyTm9kZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVm9pY2VSZWNlaXZlck5vZGUnO1xuXG5jb25zdCBuZWVkc0tlZXBBbGl2ZVBhdGNoID0gKCgpID0+IHtcbiAgICBpZiAoJ0RQX05PX0tFRVBBTElWRV9QQVRDSCcgaW4gcHJvY2Vzcy5lbnYpIHJldHVybiBmYWxzZTtcbiAgICAvLyB3ZSBkb250IGNhcmUgYWJvdXQgZGV2IHZlcnNpb24gYW5kIHNlbXZlcjptYWpvciA+PSAxXG4gICAgaWYgKHZlcnNpb24uaW5jbHVkZXMoJy1kZXYnKSB8fCB2ZXJzaW9uLnN0YXJ0c1dpdGgoJzEnKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCBbLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbi5zcGxpdCgnLicpLm1hcCgobikgPT4gcGFyc2VJbnQobikpO1xuXG4gICAgaWYgKGlzTmFOKG1pbm9yKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gd2UgbmVlZCBhIHBhdGNoIGlmIHNlbXZlcjptaW5vciBpcyA8IDE1IGFuZCBzZW12ZXI6cGF0Y2ggPCAxXG4gICAgcmV0dXJuIG1pbm9yID4gMTQgPyBmYWxzZSA6IG1pbm9yIDwgMTUgJiYgcGF0Y2ggPCAxO1xufSkoKTtcblxuaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gICAgdHlwZT86IFN0cmVhbVR5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogYW55O1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICAgIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gICAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICAgIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgICBzYW1wbGVSYXRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gICAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IG51bWJlcikgPT4gYW55O1xuICAgIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICAgIHB1YmxpYyByZWFkb25seSBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gICAgcHVibGljIHJlY2VpdmVyID0gbmV3IFZvaWNlUmVjZWl2ZXJOb2RlKHRoaXMpO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkeUxvY2sgPSBmYWxzZTtcbiAgICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLCBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgICAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICAgICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5ldmVudE5hbWVzKCkuaW5jbHVkZXMoJ2RlYnVnJylcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICAgICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcikgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZXF1YWxpemVyKSB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB0aGlzLmVtaXQoJ3ZvbHVtZScsIHRoaXMuZHNwLnZvbHVtZS52b2x1bWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLnRhcmdldFNhbXBsZVJhdGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ3N0YXRlQ2hhbmdlJywgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lZWRzS2VlcEFsaXZlUGF0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBEZXRlY3RlZCBAZGlzY29yZGpzL3ZvaWNlIHZlcnNpb24gJHt2ZXJzaW9ufSB3aGljaCBuZWVkcyBrZWVwQWxpdmUgcGF0Y2gsIGFwcGx5aW5nIHBhdGNoLi4uYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkTmV0d29ya2luZyA9IFJlZmxlY3QuZ2V0KG9sZFN0YXRlLCAnbmV0d29ya2luZycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05ldHdvcmtpbmcgPSBSZWZsZWN0LmdldChuZXdTdGF0ZSwgJ25ldHdvcmtpbmcnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIgPSAoXzogb2JqZWN0LCBuZXdOZXR3b3JrU3RhdGU6IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdVZHAgPSBSZWZsZWN0LmdldChuZXdOZXR3b3JrU3RhdGUsICd1ZHAnKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChuZXdVZHA/LmtlZXBBbGl2ZUludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgb2xkTmV0d29ya2luZz8ub2ZmKCdzdGF0ZUNoYW5nZScsIG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIG5ld05ldHdvcmtpbmc/Lm9uKCdzdGF0ZUNoYW5nZScsIG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucmVhZHlMb2NrICYmIChuZXdTdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nIHx8IG5ld1N0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeUxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyUGF1c2UnLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclJlc3VtZScsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYXRpbmcgRFNQIGZpbHRlcnMgcGlwZWxpbmUuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgID8gdGhpcy5kc3AuY3JlYXRlKHNyYywge1xuICAgICAgICAgICAgICAgICAgZHNwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdm9sdW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHNyYztcblxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICAgICAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHBsYXllclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVuZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIucGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgc3RyZWFtXG4gICAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICAgICAgaWYgKCFyZXNvdXJjZSkgdGhyb3cgbmV3IFBsYXllckVycm9yKCdBdWRpbyByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlIScsIEVycm9yU3RhdHVzQ29kZS5OT19BVURJT19SRVNPVVJDRSk7XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgICBjaGVja0ludGVydmFsPzogbnVtYmVyO1xufVxuXG4vLyA1aFxuY29uc3QgREVGQVVMVF9FWFBJUllfVElNRU9VVCA9IDE4XzAwMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIHtcbiAgICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgICAgICAgcHVibGljIG9wdGlvbnM6IFF1ZXJ5Q2FjaGVPcHRpb25zID0ge1xuICAgICAgICAgICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNsZWFudXAuYmluZCh0aGlzKSwgdGhpcy5jaGVja0ludGVydmFsKS51bnJlZigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogVCwgZXhwaXJlQWZ0ZXI6IG51bWJlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fCBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fCB0aGlzLmV4cGlyZUFmdGVyIDwgMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59XG4iLCAiaW1wb3J0IHsgQ2xpZW50LCBTbm93Zmxha2VVdGlsLCBWb2ljZVN0YXRlLCBJbnRlbnRzQml0RmllbGQsIFVzZXIsIENoYW5uZWxUeXBlLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgR3VpbGRRdWV1ZUV2ZW50cywgVm9pY2VDb25uZWN0Q29uZmlnLCBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLCBHdWlsZE5vZGVNYW5hZ2VyLCBTZWFyY2hSZXN1bHQsIEd1aWxkUXVldWUgfSBmcm9tICcuL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFF1ZXJ5VHlwZSwgU2VhcmNoT3B0aW9ucywgUGxheWVySW5pdE9wdGlvbnMsIFBsYXlsaXN0SW5pdERhdGEsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcbmltcG9ydCB7IGdlbmVyYXRlRGVwZW5kZW5jeVJlcG9ydCB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5cbmNvbnN0IGtTaW5nbGV0b24gPSBTeW1ib2woJ0luc3RhbmNlRGlzY29yZFBsYXllclNpbmdsZXRvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lcjtcbiAgICBwdWJsaWMgc3RhdGljIF9zaW5nbGV0b25LZXkgPSBrU2luZ2xldG9uO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFsnZXJyb3InLCAncGxheWVyRXJyb3InXSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnN0YW5jZSAmJiBrU2luZ2xldG9uIGluIFBsYXllcikgcmV0dXJuICg8YW55PlBsYXllcilba1NpbmdsZXRvbl0gYXMgUGxheWVyO1xuXG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgICAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xpZW50Py5vcHRpb25zPy5pbnRlbnRzICYmICFuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Py5vcHRpb25zPy5pbnRlbnRzKS5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGV4dHJhY3RvcnMgY29sbGVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7RXh0cmFjdG9yTW9kZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhdXRvUmVnaXN0ZXJFeHRyYWN0b3I6IHRydWUsXG4gICAgICAgICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgICAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICAgICAgICBzbW9vdGhWb2x1bWU6IHRydWUsXG4gICAgICAgICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB5dGRsT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEgPDwgMjUsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy55dGRsT3B0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvUmVnaXN0ZXJFeHRyYWN0b3IpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignVXNlIG9mIFwiPFBsYXllcj5bb3B0aW9ucy5hdXRvUmVnaXN0ZXJFeHRyYWN0b3JdXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwiYXdhaXQgPFBsYXllcj4uZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpXCIgaW5zdGVhZCEnKTtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoci5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBkZWZhdWx0IGV4dHJhY3RvcnM6ICR7ci5lcnJvcj8uc3RhY2sgPz8gci5lcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRGVmYXVsdCBleHRyYWN0b3JzIGxvYWRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBbRGVwZW5kZW5jaWVzIFJlcG9ydF1cXG4ke3RoaXMuc2NhbkRlcHMoKX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYFtMYWcgTW9uaXRvcl0gRXZlbnQgbG9vcCBsYXRlbmN5OiAke3RoaXMuI2xhc3RMYXRlbmN5fW1zYCk7XG4gICAgICAgICAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRpc2NvcmQtcGxheWVyIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgcGxheWVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNpbmdsZXRvbihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBpZ25vcmVJbnN0YW5jZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBhY3RpdmUgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmdldFBsYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWxsUGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIF9pbnRlcm5hbHMuaW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcXVlcnkgY2FjaGUgcHJvdmlkZXIgaW4gdXNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAgICogc29tZSBleHBlbnNpdmUgdGFzayBpcyBiZWluZyBleGVjdXRlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQgd2hpY2ggaXMgc2xvd2luZyBkb3duIHRoZSBldmVudCBsb29wLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldCBldmVudExvb3BMYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHN0YXRzKTtcbiAgICAgKlxuICAgICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICAgKiAvLyB7XG4gICAgICogLy8gICBpbnN0YW5jZXM6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAgICogLy8gICBxdWVyeUNhY2hlRW5hYmxlZDogYm9vbGVhbixcbiAgICAgKiAvLyAgIHF1ZXVlczogW1xuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgLi4uXG4gICAgICogLy8gICBdXG4gICAgICogLy8gfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnN0YW5jZXM6IF9pbnRlcm5hbHMuaW5zdGFuY2VzLnNpemUsXG4gICAgICAgICAgICBxdWV1ZXNDb3VudDogdGhpcy5xdWV1ZXMuY2FjaGUuc2l6ZSxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiB0aGlzLnF1ZXJ5Q2FjaGUgIT0gbnVsbCxcbiAgICAgICAgICAgIHF1ZXVlczogdGhpcy5xdWV1ZXMuY2FjaGUubWFwKChtKSA9PiBtLnN0YXRzLmdlbmVyYXRlKCkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuICAgICAgICB0aGlzLmNsaWVudC5vZmYoJ3ZvaWNlU3RhdGVVcGRhdGUnLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICAgICAgICBfaW50ZXJuYWxzLmNsZWFyUGxheWVyKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgICAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KCd2b2ljZVN0YXRlVXBkYXRlJywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLyogbm9vcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5ldmVudHMuZW1pdCgnZGlzY29ubmVjdCcsIHF1ZXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWw/LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSAmJiBuZXdTdGF0ZS5zdXBwcmVzcyAhPSBudWxsICYmIG9sZFN0YXRlLnN1cHByZXNzICE9PSBuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdCgnZW1wdHlDaGFubmVsJywgcXVldWUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICAgKlxuICAgICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICAgKiB9IGNhdGNoKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gICAgICAgIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgICAgICAgcXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgU2VhcmNoUmVzdWx0IHwgVHJhY2tbXSB8IFBsYXlsaXN0LFxuICAgICAgICBvcHRpb25zOiBTZWFyY2hPcHRpb25zICYge1xuICAgICAgICAgICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgICAgICAgICAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gICAgICAgICAgICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xuICAgICAgICB9ID0ge31cbiAgICApOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCcpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IG9wdGlvbnMuYWZ0ZXJTZWFyY2g/LihvcmlnaW5hbFJlc3VsdCkpIHx8IG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtyZXN1bHQuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnBsYXlsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcXVldWUuaXNQbGF5aW5nKCkpIGF3YWl0IHF1ZXVlLm5vZGUucGxheSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIHF1ZXVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRyYWNrc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge1NlYXJjaE9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlYXJjaCBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VhcmNoUXVlcnkgPSAncGFzcyB1cmwgb3IgdGV4dCBvciBkaXNjb3JkLXBsYXllciB0cmFjayBjb25zdHJ1Y3RhYmxlIG9iamVjdHMsIHdlIGdvdCB5b3UgY292ZXJlZCBcdUQ4M0RcdURFMEUnO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gTG9ncyBgU2VhcmNoUmVzdWx0YCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdCwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICAgICAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gcXVlcnk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbCkgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuICAgICAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICAgICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFRyYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiBbcXVlcnldLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IHF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBxdWVyeSxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHF1ZXJ5LnRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBxdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkge1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID0gcXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgICAgIHRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtxdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgcXVlcnlUeXBlID0gb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5LCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6IG9wdGlvbnMuc2VhcmNoRW5naW5lO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX1gKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgLy8gY2FjaGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICAgICAgICAgIGlmIChyZXM/Lmhhc1RyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9ycy4uLmApO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSBtaXNzXG4gICAgICAgICAgICBleHRyYWN0b3IgPVxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8uZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ01ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIScpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiByZXMucGxheWxpc3QsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlclxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgICAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgQGRpc2NvcmRqcy92b2ljZWAgbW9kdWxlLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgICAqIC8vIC0+IGxvZ3MgZGVwZW5kZW5jaWVzIHJlcG9ydFxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgICAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKTtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yUmVwb3J0ID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiBgJHtkZXBzUmVwb3J0fVxcbkxvYWRlZCBFeHRyYWN0b3JzOlxcbiR7ZXh0cmFjdG9yUmVwb3J0IHx8ICdOb25lJ31cXG4ke2xpbmV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbml0aWFsaXplIGEgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlLm5vZGU7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZTtcbn1cbiIsICJpbXBvcnQgeyBnZXRQbGF5ZXIgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYXN0ZXJQbGF5ZXIoKSB7XG4gICAgcmV0dXJuIGdldFBsYXllcigpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOPFQsIFA+ID0gKHByZXZpb3VzOiBQKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxUPihub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICAgIH07XG5cbiAgICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucyB7XG4gICAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsV0FBVyxrQkFBa0I7OztBQ0V0QyxTQUFTLG9CQUFvQjs7O0FD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OztBQ0pULFNBQVMsb0JBQW9CLFNBQXFDO0FBQ3JFLG9CQUFrQixFQUFFLElBQUksMEJBQTBCLE9BQU87QUFDN0Q7QUFGZ0I7OztBQ0FULFNBQVMscUJBQXFCLFNBQXNDO0FBQ3ZFLG9CQUFrQixFQUFFLElBQUksMkJBQTJCLE9BQU87QUFDOUQ7QUFGZ0I7OztBdkNlaEI7QUFBQSxFQUNvQixnQkFBaEJDO0FBQUEsRUFFYztBQUFBLEVBRWQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxPQUNHO0FBQ1AsU0FBUyxxQkFBQUMsb0JBQW1CLGVBQUFDLG9CQUFrRDtBQUd2RSxJQUFNQyxXQUFrQjtBQUUvQixJQUFJLENBQUMsV0FBVyxXQUFXLElBQUksR0FBRztBQUM5QixVQUFRLFlBQVksZUFBZSxtREFBbURBLDRDQUEyQztBQUNySTsiLAogICJuYW1lcyI6IFsic2V0VGltZW91dCIsICJzZXRUaW1lb3V0IiwgIkNvbGxlY3Rpb24iLCAiQ29sbGVjdGlvbiIsICJRdWV1ZSIsICJTdHJlYW1UeXBlIiwgIlBsYXllckV2ZW50IiwgIlF1ZXVlUmVwZWF0TW9kZSIsICJTbm93Zmxha2VVdGlsIiwgIlNub3dmbGFrZVV0aWwiLCAic2V0VGltZW91dCIsICJHdWlsZFF1ZXVlRXZlbnQiLCAiU3RyZWFtVHlwZSIsICJDb2xsZWN0aW9uIiwgIlF1ZXVlIiwgInNldFRpbWVvdXQiLCAiQ29sbGVjdGlvbiIsICJDb2xsZWN0aW9uIiwgInByaXNtIiwgIkVycm9yU3RhdHVzQ29kZSIsICJWb2ljZUNvbm5lY3Rpb25TdGF0dXMiLCAiU3RyZWFtVHlwZSIsICJFdmVudEVtaXR0ZXIiLCAiRXZlbnRFbWl0dGVyIiwgIlN0cmVhbVR5cGUiLCAiQ29sbGVjdGlvbiIsICJDb2xsZWN0aW9uIiwgIlZvaWNlQ29ubmVjdGlvblN0YXR1cyIsICJTbm93Zmxha2VVdGlsIiwgIkNoYW5uZWxUeXBlIiwgIlNub3dmbGFrZVV0aWwiLCAiQ2hhbm5lbFR5cGUiLCAicmVzIiwgInJlc3VsdCIsICJBdWRpb0ZpbHRlcnMiLCAiRmlsdGVyc0NoYWluIiwgImNyZWF0ZUF1ZGlvUGxheWVyIiwgIkF1ZGlvUGxheWVyIiwgInZlcnNpb24iXQp9Cg==
|