semantifold 0.1.1 → 0.2.0
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/README.md +13 -6
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +22 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +339 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +10 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +19 -37
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +9 -6
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +6 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +372 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +29 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +207 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +83 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +413 -0
- package/docs/architecture.md +7 -3
- package/docs/language-support.md +25 -4
- package/docs/parser-qualification.md +70 -0
- package/docs/source-maps.md +31 -4
- package/docs/testing.md +21 -2
- package/index.js +109 -4
- package/package.json +4 -2
- package/src/acceptance.js +359 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/identifiers.js +9 -1
- package/src/backends/index.js +16 -32
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +8 -5
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +5 -0
- package/src/language-registry.js +403 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +203 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +444 -0
- package/tsconfig.json +1 -0
package/build/src/mapping.js
CHANGED
|
@@ -980,7 +980,8 @@ function validPoint(value) {
|
|
|
980
980
|
* @returns {value is import("./semantic/types.js").SemanticLanguage} Whether supported.
|
|
981
981
|
*/
|
|
982
982
|
function isLanguage(value) {
|
|
983
|
-
return value == "php" || value == "ruby" || value == "javascript" || value == "typescript" || value == "java"
|
|
983
|
+
return value == "php" || value == "ruby" || value == "javascript" || value == "typescript" || value == "java" ||
|
|
984
|
+
value == "python";
|
|
984
985
|
}
|
|
985
986
|
/**
|
|
986
987
|
* Builds one stable lookup result.
|
|
@@ -1117,4 +1118,4 @@ function sortJson(value) {
|
|
|
1117
1118
|
function definedProperties(value) {
|
|
1118
1119
|
return /** @type {Value} */ (Object.fromEntries(Object.entries(value).filter(([, child]) => child !== undefined)));
|
|
1119
1120
|
}
|
|
1120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBwaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0csT0FBTyxFQUNMLFdBQVcsRUFDWCxtQkFBbUIsSUFBSSx3QkFBd0IsRUFDL0MsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFBO0FBQ2xDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDbEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBRXhELG1FQUFtRTtBQUNuRSxzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVwQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFFcEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVsRyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMs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QyxHQUFHLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFdBQVcsS0FBSyxTQUFTO1FBQzlFLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3RSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM3RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRyxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNySSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxLQUFLLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUE7QUFDL0csQ0FBQztBQUVE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QVEsRUFBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsS0FBSztJQUNyQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hILEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3BILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHthZGRTZWdtZW50LCBHZW5NYXBwaW5nLCBtYXliZUFkZFNlZ21lbnQsIHNldFNvdXJjZUNvbnRlbnQsIHRvRW5jb2RlZE1hcH0gZnJvbSBcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCJcbmltcG9ydCB7XG4gIGVhY2hNYXBwaW5nLFxuICBvcmlnaW5hbFBvc2l0aW9uRm9yIGFzIHRyYWNlT3JpZ2luYWxQb3NpdGlvbkZvcixcbiAgc291cmNlQ29udGVudEZvcixcbiAgVHJhY2VNYXBcbn0gZnJvbSBcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtjcmVhdGVDb29yZGluYXRlSW5kZXgsIGluZGV4ZWRPZmZzZXRBdCwgaW5kZXhlZFBvaW50QXQsIGxvY2F0aW9uRnJvbU9mZnNldHN9IGZyb20gXCIuL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7cHJpbWFyeUxvY2F0aW9ufSBmcm9tIFwiLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBidWlsZE1hcHBpbmdJbmRleD59IE1hcHBpbmdJbmRleCAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nLCBNYXBwaW5nSW5kZXg+fSAqL1xuY29uc3QgbWFwcGluZ0luZGV4ZXMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogUHJvamVjdHMgYW4gYXV0aG9yaXRhdGl2ZSBTZW1hbnRpZm9sZCBtYXBwaW5nIHRvIFNvdXJjZSBNYXAgdjMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IFNvdXJjZSBNYXAgdjMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBuZXcgR2VuTWFwcGluZyh7ZmlsZTogbWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWV9KVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG1hcHBpbmcuc291cmNlcykgc2V0U291cmNlQ29udGVudChnZW5lcmF0ZWQsIHNvdXJjZS5maWxlbmFtZSwgc291cmNlLmNvbnRlbnQpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIG1hcHBpbmcuc3BhbnMpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHByaW1hcnlMb2NhdGlvbihzcGFuLm9yaWdpbilcbiAgICBjb25zdCBsaW5lID0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQubGluZSAtIDFcbiAgICBjb25zdCBjb2x1bW4gPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5jb2x1bW4gLSAxXG5cbiAgICBpZiAoIWxvY2F0aW9uIHx8IHNwYW4ubWFwcGluZ0tpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgICAgbWF5YmVBZGRTZWdtZW50KGdlbmVyYXRlZCwgbGluZSwgY29sdW1uKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlcmVkID0gc291cmNlRm9yT3JpZ2luKG1hcHBpbmcsIHNwYW4ub3JpZ2luLCBsb2NhdGlvbiwgaW5kZXguc291cmNlc0J5SWQpXG5cbiAgICBpZiAoc3Bhbi5uYW1lKSB7XG4gICAgICBhZGRTZWdtZW50KGdlbmVyYXRlZCwgbGluZSwgY29sdW1uLCByZWdpc3RlcmVkLmZpbGVuYW1lLCBsb2NhdGlvbi5zdGFydC5saW5lIC0gMSwgbG9jYXRpb24uc3RhcnQuY29sdW1uIC0gMSwgc3Bhbi5uYW1lLCByZWdpc3RlcmVkLmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFNlZ21lbnQoZ2VuZXJhdGVkLCBsaW5lLCBjb2x1bW4sIHJlZ2lzdGVyZWQuZmlsZW5hbWUsIGxvY2F0aW9uLnN0YXJ0LmxpbmUgLSAxLCBsb2NhdGlvbi5zdGFydC5jb2x1bW4gLSAxLCBudWxsLCByZWdpc3RlcmVkLmNvbnRlbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvRW5jb2RlZE1hcChnZW5lcmF0ZWQpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb3JpZ2luYWwgcHJvdmVuYW5jZSBmb3Igb25lIGdlbmVyYXRlZCBVVEYtMTYgcG9zaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHt7b2Zmc2V0OiBudW1iZXJ9IHwge2xpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fSBwb3NpdGlvbiAtIEdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHt7Z2VuZXJhdGVkTG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkLCBtYXBwaW5nS2luZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NYXBwaW5nS2luZCwgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzeW1ib2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkfX0gTG9va3VwIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwcGluZywgcG9zaXRpb24pIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgY29uc3Qgb2Zmc2V0ID0gcG9zaXRpb25PZmZzZXQoaW5kZXguZ2VuZXJhdGVkQ29vcmRpbmF0ZXMsIHBvc2l0aW9uKVxuICBjb25zdCBzcGFuID0gc3BhbkZvckdlbmVyYXRlZChtYXBwaW5nLnNwYW5zLCBvZmZzZXQpXG5cbiAgaWYgKCFzcGFuKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gZ2VuZXJhdGVkIG1hcHBpbmcgYXQgb2Zmc2V0ICR7b2Zmc2V0fS5gKVxuXG4gIHJldHVybiBtYXBwaW5nUmVzdWx0KHNwYW4pXG59XG5cbi8qKlxuICogTG9va3MgdXAgZXZlcnkgZ2VuZXJhdGVkIHNwYW4gY29udGFpbmluZyBvbmUgb3JpZ2luYWwgVVRGLTE2IHBvc2l0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7KHtmaWxlbmFtZTogc3RyaW5nfSB8IHtzb3VyY2VJZDogc3RyaW5nfSkgJiAoe29mZnNldDogbnVtYmVyfSB8IHtsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfSl9IHBvc2l0aW9uIC0gT3JpZ2luYWwgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRlZExvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCwgbWFwcGluZ0tpbmQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTWFwcGluZ0tpbmQsIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgbm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ltYm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZH1bXX0gR2VuZXJhdGVkIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkZvcihtYXBwaW5nLCBwb3NpdGlvbikge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuICBjb25zdCBzb3VyY2UgPSBcInNvdXJjZUlkXCIgaW4gcG9zaXRpb25cbiAgICA/IGluZGV4LnNvdXJjZXNCeUlkLmdldChwb3NpdGlvbi5zb3VyY2VJZClcbiAgICA6IG1hcHBpbmcuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBwb3NpdGlvbi5maWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgcmV0dXJuIFtdXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsICYmICEoXCJvZmZzZXRcIiBpbiBwb3NpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTb3VyY2UgY29udGVudCBpcyByZXF1aXJlZCBmb3IgbGluZS9jb2x1bW4gbG9va3VwIG9mICR7c291cmNlLmZpbGVuYW1lfS5gKVxuICB9XG5cbiAgbGV0IG9mZnNldFxuXG4gIGlmIChcIm9mZnNldFwiIGluIHBvc2l0aW9uKSB7XG4gICAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbi5vZmZzZXQpIHx8IHBvc2l0aW9uLm9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHNvdXJjZSBvZmZzZXQ6ICR7cG9zaXRpb24ub2Zmc2V0fWApXG4gICAgfSBlbHNlIGluZGV4ZWRQb2ludEF0KC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn0gKi8gKGluZGV4LnNvdXJjZUNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSwgcG9zaXRpb24ub2Zmc2V0KVxuICAgIG9mZnNldCA9IHBvc2l0aW9uLm9mZnNldFxuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IGluZGV4ZWRPZmZzZXRBdCgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChpbmRleC5zb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksXG4gICAgICBwb3NpdGlvbi5saW5lLCBwb3NpdGlvbi5jb2x1bW4pXG4gIH1cbiAgY29uc3QgZW50cmllcyA9IGluZGV4Lm9yaWdpbmFsQnlTb3VyY2UuZ2V0KHNvdXJjZS5pZCkgPz8gW11cbiAgbGV0IGxvdyA9IDBcbiAgbGV0IGhpZ2ggPSBlbnRyaWVzLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKGVudHJpZXNbbWlkZGxlXS5zdGFydCA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbj59ICovXG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgaW5kZXgub3JpZ2luYWxQb2ludHNCeVNvdXJjZS5nZXQoc291cmNlLmlkKT8uZ2V0KG9mZnNldCkgPz8gW10pIG1hdGNoZXMuYWRkKHNwYW4pXG5cbiAgZm9yIChsZXQgY2FuZGlkYXRlID0gbG93IC0gMTsgY2FuZGlkYXRlID49IDAgJiYgZW50cmllc1tjYW5kaWRhdGVdLnByZWZpeEVuZCA+IG9mZnNldDsgY2FuZGlkYXRlLS0pIHtcbiAgICBpZiAoZW50cmllc1tjYW5kaWRhdGVdLmVuZCA+IG9mZnNldCkgbWF0Y2hlcy5hZGQoZW50cmllc1tjYW5kaWRhdGVdLnNwYW4pXG4gIH1cblxuICByZXR1cm4gWy4uLm1hdGNoZXNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgLSByaWdodC5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KS5tYXAobWFwcGluZ1Jlc3VsdClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV2ZXJ5IGdlbmVyYXRlZCBzcGFuIGFzc29jaWF0ZWQgd2l0aCBvbmUgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCAtIENhbm9uaWNhbCBub2RlIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBNYXRjaGluZyBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zRm9yTm9kZShtYXBwaW5nLCBub2RlSWQpIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgaWYgKCFpbmRleC5ub2RlU3BhbnMuaGFzKG5vZGVJZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHNlbWFudGljIG5vZGU6ICR7bm9kZUlkfWApXG5cbiAgcmV0dXJuIFsuLi4oaW5kZXgubm9kZVNwYW5zLmdldChub2RlSWQpID8/IFtdKV1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV2ZXJ5IGdlbmVyYXRlZCBzcGFuIGFzc29jaWF0ZWQgd2l0aCBvbmUgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sSWQgLSBDYW5vbmljYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBNYXRjaGluZyBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zRm9yU3ltYm9sKG1hcHBpbmcsIHN5bWJvbElkKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG4gIGlmICghaW5kZXguc3ltYm9sU3BhbnMuaGFzKHN5bWJvbElkKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgc3ltYm9sOiAke3N5bWJvbElkfWApXG5cbiAgcmV0dXJuIFsuLi4oaW5kZXguc3ltYm9sU3BhbnMuZ2V0KHN5bWJvbElkKSA/PyBbXSldXG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIHZhbGlkYXRlZCByaWNoIG1hcHBpbmcgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gQ2Fub25pY2FsIHByZXR0eSBKU09OIHdpdGggb25lIHRyYWlsaW5nIExGLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5TWFwcGluZyhtYXBwaW5nKSB7XG4gIG1hcHBpbmdJbmRleChtYXBwaW5nKVxuXG4gIHJldHVybiBgJHtKU09OLnN0cmluZ2lmeShzb3J0SnNvbihtYXBwaW5nKSwgbnVsbCwgMil9XFxuYFxufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgcmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcmlhbGl6ZWQgLSBNYXBwaW5nIEpTT04uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IFBhcnNlZCBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXBwaW5nKHNlcmlhbGl6ZWQpIHtcbiAgY29uc3QgbWFwcGluZyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpXG5cbiAgcmV0dXJuIGZpbmFsaXplTWFwcGluZyhtYXBwaW5nKVxufVxuXG4vKipcbiAqIENvbXBvc2VzIGFuIG91dGVyIHJpY2ggbWFwIHRocm91Z2ggYW4gaW5uZXIgcmljaCBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBvdXRlciAtIEZpbmFsIG91dHB1dCB0byBpbnRlcm1lZGlhdGUgbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gaW5uZXIgLSBJbnRlcm1lZGlhdGUgdG8gb3JpZ2luYWwgbWFwLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBDb21wb3NlZCByaWNoIG1hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VNYXBwaW5ncyhvdXRlciwgaW5uZXIpIHtcbiAgY29uc3Qgb3V0ZXJJbmRleCA9IG1hcHBpbmdJbmRleChvdXRlcilcblxuICBtYXBwaW5nSW5kZXgoaW5uZXIpXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IGlubmVyLnNvdXJjZXMubWFwKChzb3VyY2UpID0+ICh7Li4uc291cmNlfSkpXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gc291cmNlLmlkKSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBvdXRlclNvdXJjZUlkcyA9IG5ldyBNYXAoKVxuICBsZXQgbmV4dFNvdXJjZUluZGV4ID0gMFxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG91dGVyLnNvdXJjZXMpIHtcbiAgICBpZiAoc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGlubmVyLmdlbmVyYXRlZCkpIGNvbnRpbnVlXG4gICAgcmV0YWluT3V0ZXJTb3VyY2Uoc291cmNlLmlkKVxuICB9XG5cbiAgY29uc3Qgc3BhbnMgPSBvdXRlci5zcGFucy5mbGF0TWFwKChzcGFuKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cmFjZVJlbGF0ZWRPcmlnaW4+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0cmFjZVxuXG4gICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgdHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcbiAgICAgIGlmICh0cmFjZT8udHJhY2VkKSBicmVha1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbiA9IHRyYWNlPy5yZWxhdGVkLmxvY2F0aW9uXG4gICAgY29uc3Qgb3ZlcmxhcHBpbmcgPSB0cmFjZT8ub3ZlcmxhcHBpbmcgPz8gW11cbiAgICBjb25zdCB0cmFjZWQgPSB0cmFjZT8udHJhY2VkXG5cbiAgICBpZiAoIXRyYWNlZCkge1xuICAgICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgICBjb25zdCByZWxhdGVkVHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcblxuICAgICAgICBpZiAocmVsYXRlZFRyYWNlICYmIGlzR2VuZXJhdGVkRW9mUG9pbnQocmVsYXRlZCkpIHJldGFpbk91dGVyU291cmNlKHJlbGF0ZWQuc291cmNlSWQpXG4gICAgICB9XG4gICAgICBjb25zdCB1bmlkZW50aWZpZWQgPSB7Li4uc3Bhbn1cblxuICAgICAgZGVsZXRlIHVuaWRlbnRpZmllZC5ub2RlSWRcbiAgICAgIGRlbGV0ZSB1bmlkZW50aWZpZWQuc3ltYm9sSWRcblxuICAgICAgcmV0dXJuIFt7Li4udW5pZGVudGlmaWVkLCBvcmlnaW46IHJlbWFwT3JpZ2luU291cmNlSWRzKHNwYW4ub3JpZ2luLCBvdXRlclNvdXJjZUlkcyl9XVxuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZFJlbGF0ZWQgPSB0cmFjZT8ucmVsYXRlZFxuXG4gICAgaWYgKCFzZWxlY3RlZFJlbGF0ZWQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW50ZXJtZWRpYXRlIHRyYWNlIHNlbGVjdGlvbiBpcyBtaXNzaW5nIGl0cyByZWxhdGVkIG9yaWdpbi5cIilcblxuICAgIGlmIChsb2NhdGlvbiAmJiBvdmVybGFwcGluZy5sZW5ndGggPiAxICYmIHNwYW4ubWFwcGluZ0tpbmQgPT0gXCJleGFjdFwiICYmXG4gICAgICBzcGFuLmdlbmVyYXRlZC5lbmQub2Zmc2V0IC0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ID09IGxvY2F0aW9uLmVuZC5vZmZzZXQgLSBsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgIHJldHVybiBvdmVybGFwcGluZy5tYXAoKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBvdmVybGFwU3RhcnQgPSBNYXRoLm1heChsb2NhdGlvbi5zdGFydC5vZmZzZXQsIGNhbmRpZGF0ZS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KVxuICAgICAgICBjb25zdCBvdmVybGFwRW5kID0gTWF0aC5taW4obG9jYXRpb24uZW5kLm9mZnNldCwgY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0KVxuICAgICAgICBjb25zdCBnZW5lcmF0ZWRTdGFydCA9IHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCArIG92ZXJsYXBTdGFydCAtIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldFxuICAgICAgICBjb25zdCBnZW5lcmF0ZWRFbmQgPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgKyBvdmVybGFwRW5kIC0gbG9jYXRpb24uc3RhcnQub2Zmc2V0XG4gICAgICAgIGNvbnN0IHByZXNlcnZlc1dob2xlT3JpZ2luID0gb3ZlcmxhcFN0YXJ0ID09IGNhbmRpZGF0ZS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICYmIG92ZXJsYXBFbmQgPT0gY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2VkU3BhbihzcGFuLCBjYW5kaWRhdGUsIGxvY2F0aW9uRnJvbU9mZnNldHMoXG4gICAgICAgICAgb3V0ZXIuZ2VuZXJhdGVkLmZpbGVuYW1lLFxuICAgICAgICAgIG91dGVyLmdlbmVyYXRlZC5jb250ZW50LFxuICAgICAgICAgIGdlbmVyYXRlZFN0YXJ0LFxuICAgICAgICAgIGdlbmVyYXRlZEVuZFxuICAgICAgICApLCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiwgc2VsZWN0ZWRSZWxhdGVkLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiA9IEJvb2xlYW4obG9jYXRpb24gJiYgbG9jYXRpb24uc3RhcnQub2Zmc2V0ID09IHRyYWNlZC5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICYmXG4gICAgICBsb2NhdGlvbi5lbmQub2Zmc2V0ID09IHRyYWNlZC5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICBjb25zdCBjb21wb3NlZCA9IGNvbXBvc2VkU3BhbihzcGFuLCB0cmFjZWQsIHNwYW4uZ2VuZXJhdGVkLCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiwgc2VsZWN0ZWRSZWxhdGVkKVxuXG4gICAgaWYgKHNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIiAmJiBvdmVybGFwcGluZy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBvcmlnaW5zID0gY29tcG9zZVJlbGF0ZWRPcmlnaW5zKFtzZWxlY3RlZFJlbGF0ZWRdLCBzZWxlY3RlZFJlbGF0ZWQsIHRyYWNlZCwgZmFsc2UpXG5cbiAgICAgIGlmIChvcmlnaW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFt7Li4uY29tcG9zZWQsIG1hcHBpbmdLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJhbmNob3JcIiksIG9yaWdpbjoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImRlcml2ZWRcIiksXG4gICAgICAgICAgb3JpZ2luc1xuICAgICAgICB9fV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2NvbXBvc2VkXVxuICB9KVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBnZW5lcmF0ZWQ6IG91dGVyLmdlbmVyYXRlZCxcbiAgICBub2RlczogaW5uZXIubm9kZXMsXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkTWFwcGluZ1wiLFxuICAgIHNvdXJjZXMsXG4gICAgc3BhbnMsXG4gICAgc3ltYm9sczogaW5uZXIuc3ltYm9scyxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgLyoqXG4gICAqIENvbXBvc2VzIG9uZSBvdXRlciBnZW5lcmF0ZWQgcmFuZ2Ugd2l0aCBhbiBpbm5lciByYW5nZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IG91dGVyU3BhbiAtIE91dGVyIHNwYW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBpbm5lclNwYW4gLSBJbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEZpbmFsIGdlbmVyYXRlZCBzdWJyYW5nZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiAtIFdoZXRoZXIgYWRvcHRpbmcgdGhlIGlubmVyIG9yaWdpbiByZXRhaW5zIGl0cyBjb21wbGV0ZSByYW5nZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHNlbGVjdGVkUmVsYXRlZCAtIE91dGVyIG9yaWdpbiB0cmFjZWQgdGhyb3VnaCB0aGlzIGlubmVyIHNwYW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc3RyaWN0U2VsZWN0ZWRUcmFjZV0gLSBXaGV0aGVyIGFuIGV4YWN0IHNwbGl0IHNlbGVjdHMgb25seSB0aGlzIGlubmVyIHNwYW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IENvbXBvc2VkIHNwYW4uXG4gICAqL1xuICBmdW5jdGlvbiBjb21wb3NlZFNwYW4ob3V0ZXJTcGFuLCBpbm5lclNwYW4sIGdlbmVyYXRlZCwgcHJlc2VydmVzV2hvbGVPcmlnaW4sIHNlbGVjdGVkUmVsYXRlZCwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlID0gZmFsc2UpIHtcbiAgICBpZiAob3V0ZXJTcGFuLm1hcHBpbmdLaW5kID09IFwic3ludGhldGljXCIgJiYgb3V0ZXJTcGFuLm9yaWdpbi5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIHJldHVybiBkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICAgIGdlbmVyYXRlZCxcbiAgICAgICAgbWFwcGluZ0tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgbmFtZTogb3V0ZXJTcGFuLm5hbWUsXG4gICAgICAgIG9yaWdpbjoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgICByZWFzb246IG91dGVyU3Bhbi5vcmlnaW4ucmVhc29uLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5yZWxhdGVkT3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBpbm5lclNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSlcbiAgICAgICAgfSxcbiAgICAgICAgcm9sZTogb3V0ZXJTcGFuLnJvbGVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9zZWREZXJpdmVkT3JpZ2lucyA9IG91dGVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIlxuICAgICAgPyBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5vcmlnaW5zLCBzZWxlY3RlZFJlbGF0ZWQsIGlubmVyU3BhbiwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIiA/IGlubmVyU3Bhbi5vcmlnaW4gOiBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCJcbiAgICAgID8gY29tcG9zZWREZXJpdmVkT3JpZ2lucz8ubGVuZ3RoID09IDAgJiYgaW5uZXJTcGFuLm9yaWdpbi5raW5kID09IFwic3ludGhldGljXCJcbiAgICAgICAgPyBpbm5lclNwYW4ub3JpZ2luXG4gICAgICAgIDoge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImRlcml2ZWRcIiksIG9yaWdpbnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119ICovIChjb21wb3NlZERlcml2ZWRPcmlnaW5zKX1cbiAgICAgIDoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgICByZWFzb246IG91dGVyU3Bhbi5vcmlnaW4ucmVhc29uLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5yZWxhdGVkT3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBpbm5lclNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSlcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgIC4uLm91dGVyU3BhbixcbiAgICAgIGdlbmVyYXRlZCxcbiAgICAgIG1hcHBpbmdLaW5kOiBpbm5lclNwYW4ubWFwcGluZ0tpbmQgPT0gXCJzeW50aGV0aWNcIiA/IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSA6XG4gICAgICAgIG91dGVyU3Bhbi5tYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgaW5uZXJTcGFuLm1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJiBwcmVzZXJ2ZXNXaG9sZU9yaWdpblxuICAgICAgICAgID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZXhhY3RcIilcbiAgICAgICAgICA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImFuY2hvclwiKSxcbiAgICAgIG5hbWU6IG91dGVyU3Bhbi5uYW1lID8/IGlubmVyU3Bhbi5uYW1lLFxuICAgICAgbm9kZUlkOiBpbm5lclNwYW4ubm9kZUlkLFxuICAgICAgb3JpZ2luLFxuICAgICAgcm9sZTogaW5uZXJTcGFuLnJvbGUgPz8gb3V0ZXJTcGFuLnJvbGUsXG4gICAgICBzeW1ib2xJZDogaW5uZXJTcGFuLnN5bWJvbElkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgaW5uZXIgc3BhbiBzZWxlY3RlZCBieSBvbmUgcmVsYXRlZCBpbnRlcm1lZGlhdGUgb3JpZ2luLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIE91dGVyIHJlbGF0ZWQgb3JpZ2luLlxuICAgKiBAcmV0dXJucyB7e1xuICAgKiAgIG92ZXJsYXBwaW5nOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXSxcbiAgICogICByZWxhdGVkOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW4sXG4gICAqICAgdHJhY2VkOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW4gfCB1bmRlZmluZWRcbiAgICogfSB8IHVuZGVmaW5lZH0gVHJhY2Ugc2VsZWN0aW9uIHdoZW4gdGhlIHJlbGF0ZWQgc291cmNlIGlzIHRoZSBpbnRlcm1lZGlhdGUgYXJ0aWZhY3QuXG4gICAqL1xuICBmdW5jdGlvbiB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IG91dGVySW5kZXguc291cmNlc0J5SWQuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGlubmVyLmdlbmVyYXRlZCkpIHJldHVybiB1bmRlZmluZWRcbiAgICBjb25zdCBvdmVybGFwcGluZyA9IHNwYW5zT3ZlcmxhcHBpbmdHZW5lcmF0ZWQoaW5uZXIuc3BhbnMsIHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0LCByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgb3ZlcmxhcHBpbmcsXG4gICAgICByZWxhdGVkLFxuICAgICAgdHJhY2VkOiBvdmVybGFwcGluZ1swXSA/PyBzcGFuRm9yR2VuZXJhdGVkKGlubmVyLnNwYW5zLCByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2VzIGludGVybWVkaWF0ZSByZWxhdGVkIG9yaWdpbnMgYW5kIHJlbWFwcyB1bnJlbGF0ZWQgc291cmNlIGlkZW50aXRpZXMgaW4gb3JkZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3V0ZXIgcmVsYXRlZCBvcmlnaW5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gc2VsZWN0ZWRSZWxhdGVkIC0gT3JpZ2luIHVzaW5nIHRoZSBzZWxlY3RlZCBpbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gc2VsZWN0ZWRTcGFuIC0gU2VsZWN0ZWQgaW5uZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtib29sZWFufSByZXN0cmljdFNlbGVjdGVkVHJhY2UgLSBXaGV0aGVyIGFuIGV4YWN0IHNwbGl0IHNlbGVjdHMgb25seSB0aGUgc3VwcGxpZWQgc3Bhbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBDb21wb3NlZCByZWxhdGVkIG9yaWdpbnMuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wb3NlUmVsYXRlZE9yaWdpbnMocmVsYXRlZE9yaWdpbnMsIHNlbGVjdGVkUmVsYXRlZCwgc2VsZWN0ZWRTcGFuLCByZXN0cmljdFNlbGVjdGVkVHJhY2UpIHtcbiAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnMuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3V0ZXJJbmRleC5zb3VyY2VzQnlJZC5nZXQocmVsYXRlZC5zb3VyY2VJZClcblxuICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZVJlcHJlc2VudHNHZW5lcmF0ZWQoc291cmNlLCBpbm5lci5nZW5lcmF0ZWQpKSB7XG4gICAgICAgIHJldHVybiBbcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgb3V0ZXJTb3VyY2VJZHMpXVxuICAgICAgfVxuICAgICAgY29uc3QgdHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcbiAgICAgIGNvbnN0IHRyYWNlZFNwYW5zID0gcmVzdHJpY3RTZWxlY3RlZFRyYWNlICYmIHJlbGF0ZWQgPT09IHNlbGVjdGVkUmVsYXRlZFxuICAgICAgICA/IFtzZWxlY3RlZFNwYW5dXG4gICAgICAgIDogdHJhY2U/Lm92ZXJsYXBwaW5nLmxlbmd0aFxuICAgICAgICAgID8gdHJhY2Uub3ZlcmxhcHBpbmdcbiAgICAgICAgICA6IHRyYWNlPy50cmFjZWQgPyBbdHJhY2UudHJhY2VkXSA6IFtdXG5cbiAgICAgIGlmICh0cmFjZWRTcGFucy5sZW5ndGggPT0gMCkge1xuICAgICAgICBpZiAoIWlzR2VuZXJhdGVkRW9mUG9pbnQocmVsYXRlZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmFibGUgdG8gdHJhY2UgaW50ZXJtZWRpYXRlIG9yaWdpbiAnJHtyZWxhdGVkLmxvY2F0aW9uLmZpbGVuYW1lfScuYClcbiAgICAgICAgcmV0YWluT3V0ZXJTb3VyY2UocmVsYXRlZC5zb3VyY2VJZClcblxuICAgICAgICByZXR1cm4gW3JlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIG91dGVyU291cmNlSWRzKV1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYWNlZFNwYW5zLmZsYXRNYXAoKHRyYWNlZFNwYW4pID0+IHJlbGF0ZWRPcmlnaW5zRm9yU3Bhbih0cmFjZWRTcGFuKS5tYXAoKHRyYWNlZFJlbGF0ZWQpID0+IGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAuLi50cmFjZWRSZWxhdGVkLFxuICAgICAgICAgIG5vZGVJZDogdHJhY2VkUmVsYXRlZC5ub2RlSWQgPz8gdHJhY2VkU3Bhbi5ub2RlSWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IHRyYWNlZFJlbGF0ZWQucm9sZSxcbiAgICAgICAgICBzeW1ib2xJZDogdHJhY2VkUmVsYXRlZC5zeW1ib2xJZCA/PyB0cmFjZWRTcGFuLnN5bWJvbElkXG4gICAgICAgIH0pKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbnMgb25lIG91dGVyIHNvdXJjZSB0aGF0IHN1cnZpdmVzIGNvbXBvc2l0aW9uIGFuZCBhc3NpZ25zIGl0cyBjb21wb3NlZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUlkIC0gT3V0ZXIgc291cmNlIHJlZ2lzdHJ5IGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHJldGFpbk91dGVyU291cmNlKHNvdXJjZUlkKSB7XG4gICAgaWYgKG91dGVyU291cmNlSWRzLmhhcyhzb3VyY2VJZCkpIHJldHVyblxuICAgIGNvbnN0IHNvdXJjZSA9IG91dGVySW5kZXguc291cmNlc0J5SWQuZ2V0KHNvdXJjZUlkKVxuXG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIG91dGVyIG1hcHBpbmcgc291cmNlICcke3NvdXJjZUlkfScuYClcbiAgICBsZXQgY29tcG9zZWRTb3VyY2UgPSBzb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gc2FtZVJlZ2lzdGVyZWRTb3VyY2UoY2FuZGlkYXRlLCBzb3VyY2UpKVxuXG4gICAgaWYgKCFjb21wb3NlZFNvdXJjZSkge1xuICAgICAgd2hpbGUgKHNvdXJjZUlkcy5oYXMoYHNvdXJjZToke25leHRTb3VyY2VJbmRleH1gKSkgbmV4dFNvdXJjZUluZGV4KytcbiAgICAgIGNvbXBvc2VkU291cmNlID0gey4uLnNvdXJjZSwgaWQ6IGBzb3VyY2U6JHtuZXh0U291cmNlSW5kZXh9YH1cbiAgICAgIHNvdXJjZUlkcy5hZGQoY29tcG9zZWRTb3VyY2UuaWQpXG4gICAgICBzb3VyY2VzLnB1c2goY29tcG9zZWRTb3VyY2UpXG4gICAgfVxuICAgIG91dGVyU291cmNlSWRzLnNldChzb3VyY2UuaWQsIGNvbXBvc2VkU291cmNlLmlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIHdoZXRoZXIgb25lIGludGVybWVkaWF0ZSBvcmlnaW4gaXMgdGhlIGV4YWN0IHBvaW50IGFmdGVyIGFsbCBnZW5lcmF0ZWQgY29kZSB1bml0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBDYW5kaWRhdGUgaW50ZXJtZWRpYXRlIG9yaWdpbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyBhbiBFT0YgcG9pbnQgcmF0aGVyIHRoYW4gYSBnZW5lcmF0ZWQgaGFsZi1vcGVuIHJhbmdlLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNHZW5lcmF0ZWRFb2ZQb2ludChyZWxhdGVkKSB7XG4gICAgcmV0dXJuIHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0ID09IGlubmVyLmdlbmVyYXRlZC5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0ID09IGlubmVyLmdlbmVyYXRlZC5jb250ZW50Lmxlbmd0aFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIG1hcHBlZCBzcGFuJ3MgY2xvc2VkIG9yaWdpbiBpbnRvIHJlbGF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBzcGFuIC0gVHJhY2VkIGlubmVyIHNwYW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvclNwYW4oc3Bhbikge1xuICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4oc3Bhbi5vcmlnaW4pXG59XG5cbi8qKlxuICogUmV0dXJucyBldmVyeSByZWxhdGVkIHJhbmdlIGluIG9uZSBjbG9zZWQgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBSZWxhdGVkIHJhbmdlcyBpbiBzZW1hbnRpYyBvcmRlci5cbiAqL1xuZnVuY3Rpb24gcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4ob3JpZ2luKSB7XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSByZXR1cm4gW3tsb2NhdGlvbjogb3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VJZDogb3JpZ2luLnNvdXJjZUlkfV1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNcblxuICByZXR1cm4gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVnaXN0ZXJlZCBzb3VyY2UgaXMgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdCBjb25zdW1lZCBieSBhbiBpbm5lciBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gT3V0ZXIgc291cmNlIHJlZ2lzdHJ5IGVudHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gSW5uZXIgZ2VuZXJhdGVkIGFydGlmYWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaWRlbnRpdHktc2VsZWN0ZWQgcHJvdmVuYW5jZSBtYXkgYmUgdHJhY2VkIHRocm91Z2ggdGhlIGlubmVyIG1hcC5cbiAqL1xuZnVuY3Rpb24gc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGdlbmVyYXRlZCkge1xuICByZXR1cm4gc291cmNlLmZpbGVuYW1lID09IGdlbmVyYXRlZC5maWxlbmFtZSAmJiBzb3VyY2UuY29udGVudCA9PSBnZW5lcmF0ZWQuY29udGVudCAmJlxuICAgIChzb3VyY2UubGFuZ3VhZ2UgPT0gbnVsbCB8fCBzb3VyY2UubGFuZ3VhZ2UgPT0gZ2VuZXJhdGVkLmxhbmd1YWdlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIGNvbXBsZXRlIHJlZ2lzdGVyZWQtc291cmNlIGlkZW50aXR5IGZpZWxkcyBvdGhlciB0aGFuIHJlZ2lzdHJ5LWxvY2FsIElELlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IGxlZnQgLSBGaXJzdCByZWdpc3RlcmVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSByaWdodCAtIFNlY29uZCByZWdpc3RlcmVkIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGJvdGggZW50cmllcyByZXByZXNlbnQgdGhlIHNhbWUgc291cmNlIGFydGlmYWN0LlxuICovXG5mdW5jdGlvbiBzYW1lUmVnaXN0ZXJlZFNvdXJjZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdC5maWxlbmFtZSA9PSByaWdodC5maWxlbmFtZSAmJiBsZWZ0LmNvbnRlbnQgPT0gcmlnaHQuY29udGVudCAmJiBsZWZ0Lmxhbmd1YWdlID09IHJpZ2h0Lmxhbmd1YWdlXG59XG5cbi8qKlxuICogQ29tcG9zZXMgU291cmNlIE1hcCB2MyBtYXBzIHdpdGggbWFpbnRhaW5lZCB0cmFjaW5nIG1hY2hpbmVyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBJbnB1dH0gb3V0ZXIgLSBGaW5hbCBvdXRwdXQgdG8gaW50ZXJtZWRpYXRlIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBJbnB1dH0gaW5uZXIgLSBJbnRlcm1lZGlhdGUgdG8gb3JpZ2luYWwgbWFwLlxuICogQHJldHVybnMge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IENvbXBvc2VkIHYzIG1hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VTb3VyY2VNYXBzKG91dGVyLCBpbm5lcikge1xuICBjb25zdCBvdXRlck1hcCA9IG5ldyBUcmFjZU1hcChvdXRlcilcbiAgY29uc3QgaW5uZXJNYXAgPSBuZXcgVHJhY2VNYXAoaW5uZXIpXG4gIGNvbnN0IGNvbXBvc2VkID0gbmV3IEdlbk1hcHBpbmcoe2ZpbGU6IG91dGVyTWFwLmZpbGV9KVxuICBjb25zdCBpbnRlcm1lZGlhdGVJbmRleGVzID0gdHlwZW9mIGlubmVyTWFwLmZpbGUgPT0gXCJzdHJpbmdcIlxuICAgID8gb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzLmZsYXRNYXAoKHNvdXJjZSwgaW5kZXgpID0+IHNvdXJjZSA9PSBpbm5lck1hcC5maWxlID8gW2luZGV4XSA6IFtdKVxuICAgIDogW11cbiAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXggPSBpbnRlcm1lZGlhdGVJbmRleGVzLmxlbmd0aCA9PSAxID8gaW50ZXJtZWRpYXRlSW5kZXhlc1swXSA6IHVuZGVmaW5lZFxuICBjb25zdCBpbnRlcm1lZGlhdGVTb3VyY2UgPSBpbnRlcm1lZGlhdGVJbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzW2ludGVybWVkaWF0ZUluZGV4XVxuXG4gIGlubmVyTWFwLnNvdXJjZXMuZm9yRWFjaCgocmF3U291cmNlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IGlubmVyTWFwLnJlc29sdmVkU291cmNlc1tpbmRleF0gPz8gcmF3U291cmNlXG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHNldFNvdXJjZUNvbnRlbnQoY29tcG9zZWQsIHNvdXJjZSwgaW5uZXJNYXAuc291cmNlc0NvbnRlbnQ/LltpbmRleF0gPz8gbnVsbClcbiAgfSlcbiAgb3V0ZXJNYXAuc291cmNlcy5mb3JFYWNoKChyYXdTb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyByYXdTb3VyY2VcblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBpbmRleCAhPSBpbnRlcm1lZGlhdGVJbmRleCkge1xuICAgICAgc2V0U291cmNlQ29udGVudChjb21wb3NlZCwgc291cmNlLCBvdXRlck1hcC5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsKVxuICAgIH1cbiAgfSlcblxuICBlYWNoTWFwcGluZyhvdXRlck1hcCwgKG1hcHBpbmcpID0+IHtcbiAgICBpZiAobWFwcGluZy5zb3VyY2UgPT0gbnVsbCB8fCBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gbnVsbCkge1xuICAgICAgbWF5YmVBZGRTZWdtZW50KGNvbXBvc2VkLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUgLSAxLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGlzSW50ZXJtZWRpYXRlID0gaW50ZXJtZWRpYXRlU291cmNlICE9PSB1bmRlZmluZWQgJiYgbWFwcGluZy5zb3VyY2UgPT0gaW50ZXJtZWRpYXRlU291cmNlXG4gICAgY29uc3QgdHJhY2VkID0gaXNJbnRlcm1lZGlhdGVcbiAgICAgID8gdHJhY2VPcmlnaW5hbFBvc2l0aW9uRm9yKGlubmVyTWFwLCB7Y29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLCBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZX0pXG4gICAgICA6IHtjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLCBuYW1lOiBtYXBwaW5nLm5hbWUsIHNvdXJjZTogbWFwcGluZy5zb3VyY2V9XG5cbiAgICBpZiAodHJhY2VkLnNvdXJjZSA9PSBudWxsIHx8IHRyYWNlZC5saW5lID09IG51bGwgfHwgdHJhY2VkLmNvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXliZUFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGlzSW50ZXJtZWRpYXRlID8gc291cmNlQ29udGVudEZvcihpbm5lck1hcCwgdHJhY2VkLnNvdXJjZSkgOiBzb3VyY2VDb250ZW50Rm9yKG91dGVyTWFwLCB0cmFjZWQuc291cmNlKVxuICAgIGNvbnN0IG5hbWUgPSB0cmFjZWQubmFtZSA/PyBtYXBwaW5nLm5hbWVcblxuICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgIGFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLCB0cmFjZWQuc291cmNlLCB0cmFjZWQubGluZSAtIDEsIHRyYWNlZC5jb2x1bW4sIG51bGwsIGNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLCB0cmFjZWQuc291cmNlLCB0cmFjZWQubGluZSAtIDEsIHRyYWNlZC5jb2x1bW4sIG5hbWUsIGNvbnRlbnQpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0b0VuY29kZWRNYXAoY29tcG9zZWQpXG59XG5cbi8qKlxuICogSW1wb3J0cyBhIHBvaW50LWJhc2VkIFNvdXJjZSBNYXAgdjMgYXMgYSByYW5nZS1iYXNlZCBTZW1hbnRpZm9sZCBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuU291cmNlTWFwSW5wdXR9IHNvdXJjZU1hcCAtIFNvdXJjZSBNYXAgdjMuXG4gKiBAcGFyYW0ge29iamVjdH0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gZ2VuZXJhdGVkLmNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgY29udGVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBnZW5lcmF0ZWQuZmlsZW5hbWUgLSBHZW5lcmF0ZWQgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gZ2VuZXJhdGVkLmxhbmd1YWdlIC0gR2VuZXJhdGVkIGxhbmd1YWdlLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW2dlbmVyYXRlZC5zb3VyY2VzXSAtIEV4YWN0IHNvdXJjZSBjb250ZW50IG92ZXJyaWRlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gSW1wb3J0ZWQgcmljaCBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBwaW5nRnJvbVNvdXJjZU1hcChzb3VyY2VNYXAsIHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2UsIHNvdXJjZXM6IHByb3ZpZGVkID0gW119KSB7XG4gIGNvbnN0IHRyYWNlID0gbmV3IFRyYWNlTWFwKHNvdXJjZU1hcClcbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoY29udGVudClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IFtdXG4gIC8qKiBAdHlwZSB7TWFwPG51bWJlciwge2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9Pn0gKi9cbiAgY29uc3Qgb3ZlcnJpZGVzQnlTb3VyY2VJbmRleCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgcHJvdmlkZWQpIHtcbiAgICBjb25zdCBleGFjdCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2UgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgfHwgcmVzb2x2ZWQgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgPyBbaW5kZXhdIDogW11cbiAgICB9KVxuXG4gICAgaWYgKGV4YWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgZXhhY3QpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KGluZGV4LCBvdmVycmlkZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2U/LmVuZHNXaXRoKGAvJHtvdmVycmlkZS5maWxlbmFtZX1gKSB8fCByZXNvbHZlZD8uZW5kc1dpdGgoYC8ke292ZXJyaWRlLmZpbGVuYW1lfWApID8gW2luZGV4XSA6IFtdXG4gICAgfSlcblxuICAgIGlmIChzdWZmaXgubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEFtYmlndW91cyBTb3VyY2UgTWFwIHNvdXJjZSBjb250ZW50IG92ZXJyaWRlICcke292ZXJyaWRlLmZpbGVuYW1lfScgbWF0Y2hlcyBtdWx0aXBsZSBzb3VyY2VzLmApXG4gICAgfVxuICAgIGlmIChzdWZmaXgubGVuZ3RoID09IDEgJiYgIW92ZXJyaWRlc0J5U291cmNlSW5kZXguaGFzKHN1ZmZpeFswXSkpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KHN1ZmZpeFswXSwgb3ZlcnJpZGUpXG4gIH1cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSAqL1xuICBjb25zdCBzb3VyY2VzQnlNYXBOYW1lID0gbmV3IE1hcCgpXG5cbiAgdHJhY2Uuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc29sdmVkU291cmNlID0gdHJhY2UucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyBzb3VyY2VcbiAgICBjb25zdCBwcm92aWRlZFNvdXJjZSA9IG92ZXJyaWRlc0J5U291cmNlSW5kZXguZ2V0KGluZGV4KVxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSB7XG4gICAgICBjb250ZW50OiBwcm92aWRlZFNvdXJjZT8uY29udGVudCA/PyB0cmFjZS5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsLFxuICAgICAgZmlsZW5hbWU6IHByb3ZpZGVkU291cmNlPy5maWxlbmFtZSA/PyByZXNvbHZlZFNvdXJjZSxcbiAgICAgIGlkOiBgc291cmNlOiR7c291cmNlcy5sZW5ndGh9YCxcbiAgICAgIGxhbmd1YWdlOiBwcm92aWRlZFNvdXJjZT8ubGFuZ3VhZ2UgPz8gbnVsbFxuICAgIH1cblxuICAgIHNvdXJjZXMucHVzaChyZWdpc3RlcmVkKVxuICAgIGlmICghc291cmNlc0J5TWFwTmFtZS5oYXMocmVzb2x2ZWRTb3VyY2UpKSBzb3VyY2VzQnlNYXBOYW1lLnNldChyZXNvbHZlZFNvdXJjZSwgcmVnaXN0ZXJlZClcbiAgfSlcbiAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBuZXcgTWFwKHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG4gICAgLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXSkpXG5cbiAgLyoqIEB0eXBlIHt7Z2VuZXJhdGVkT2Zmc2V0OiBudW1iZXIsIG1hcHBpbmc6IGltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRWFjaE1hcHBpbmd9W119ICovXG4gIGNvbnN0IHBvaW50cyA9IFtdXG5cbiAgZWFjaE1hcHBpbmcodHJhY2UsIChtYXBwaW5nKSA9PiB7XG4gICAgcG9pbnRzLnB1c2goe2dlbmVyYXRlZE9mZnNldDogaW5kZXhlZE9mZnNldEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICsgMSksIG1hcHBpbmd9KVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IG1hcHBlZFNwYW5zID0gW11cblxuICBwb2ludHMuZm9yRWFjaCgoe2dlbmVyYXRlZE9mZnNldCwgbWFwcGluZ30sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHBvaW50c1tpbmRleCArIDFdXG4gICAgY29uc3QgZW5kID0gbmV4dD8ubWFwcGluZy5nZW5lcmF0ZWRMaW5lID09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgPyBuZXh0LmdlbmVyYXRlZE9mZnNldFxuICAgICAgOiBsaW5lRW5kT2Zmc2V0KGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldClcblxuICAgIGlmIChlbmQgPD0gZ2VuZXJhdGVkT2Zmc2V0KSByZXR1cm5cblxuICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxMaW5lID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXBwZWRTcGFucy5wdXNoKHtcbiAgICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBnZW5lcmF0ZWRPZmZzZXQsIGVuZCksXG4gICAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgICBvcmlnaW46IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwidW5tYXBwZWQgU291cmNlIE1hcCBzZWdtZW50XCIsIHJlbGF0ZWRPcmlnaW5zOiBbXX1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzQnlNYXBOYW1lLmdldChtYXBwaW5nLnNvdXJjZSlcblxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIE1hcCByZWZlcmVuY2VzIHVucmVnaXN0ZXJlZCBzb3VyY2UgJyR7bWFwcGluZy5zb3VyY2V9Jy5gKVxuICAgIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIGNvbnRlbnQgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IG1hcHBlZCBwb3NpdGlvbnMgZm9yICcke3NvdXJjZS5maWxlbmFtZX0nLmApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxPZmZzZXQgPSBpbmRleGVkT2Zmc2V0QXQoXG4gICAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChzb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksXG4gICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gKyAxXG4gICAgKVxuICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gTWF0aC5taW4oc291cmNlLmNvbnRlbnQubGVuZ3RoLCBvcmlnaW5hbE9mZnNldCArIDEpXG4gICAgY29uc3Qgb3JpZ2luYWxMb2NhdGlvbiA9IGxvY2F0aW9uRnJvbU9mZnNldHMoc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudCwgb3JpZ2luYWxPZmZzZXQsIG9yaWdpbmFsRW5kKVxuXG4gICAgbWFwcGVkU3BhbnMucHVzaChkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcImFuY2hvclwiLFxuICAgICAgbmFtZTogbWFwcGluZy5uYW1lID8/IHVuZGVmaW5lZCxcbiAgICAgIG9yaWdpbjoge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uOiBvcmlnaW5hbExvY2F0aW9uLCBzb3VyY2VJZDogc291cmNlLmlkfVxuICAgIH0pKVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IHNwYW5zID0gW11cbiAgbGV0IGN1cnNvciA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgbWFwcGVkU3BhbnMpIHtcbiAgICBpZiAoc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ID4gY3Vyc29yKSBzcGFucy5wdXNoKHVubWFwcGVkU3BhbihjdXJzb3IsIHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCkpXG4gICAgaWYgKHNwYW4uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPiBjdXJzb3IpIHtcbiAgICAgIHNwYW5zLnB1c2goc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgY3Vyc29yID8ge1xuICAgICAgICAuLi5zcGFuLFxuICAgICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGN1cnNvciwgc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICAgIH0gOiBzcGFuKVxuICAgICAgY3Vyc29yID0gc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldFxuICAgIH1cbiAgfVxuICBpZiAoY3Vyc29yIDwgY29udGVudC5sZW5ndGgpIHNwYW5zLnB1c2godW5tYXBwZWRTcGFuKGN1cnNvciwgY29udGVudC5sZW5ndGgpKVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBnZW5lcmF0ZWQ6IHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2V9LFxuICAgIG5vZGVzOiBbXSxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgc291cmNlcyxcbiAgICBzcGFucyxcbiAgICBzeW1ib2xzOiBbXSxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb25lIGV4cGxpY2l0IHVubWFwcGVkIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBHZW5lcmF0ZWQgc3RhcnQgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gR2VuZXJhdGVkIGVuZCBvZmZzZXQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IFN5bnRoZXRpYyBzcGFuLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5tYXBwZWRTcGFuKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBzdGFydCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgb3JpZ2luOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBcInVubWFwcGVkIFNvdXJjZSBNYXAgcmFuZ2VcIiwgcmVsYXRlZE9yaWdpbnM6IFtdfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbWFwcyBhIGdlbmVyYXRlZCBsb2NhdGlvbiB3aGlsZSByZXRhaW5pbmcgdGhlIGdlbmVyYXRlZCByYW5nZSBpbiB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEdlbmVyYXRlZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2Ygb3JpZ2luYWxQb3NpdGlvbkZvcj59IFJlbWFwcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwTG9jYXRpb24obG9jYXRpb24sIG1hcHBpbmcpIHtcbiAgaWYgKGxvY2F0aW9uLmZpbGVuYW1lICE9IG1hcHBpbmcuZ2VuZXJhdGVkLmZpbGVuYW1lKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTG9jYXRpb24gaXMgbm90IGluICR7bWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWV9LmApXG5cbiAgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwcGluZywge29mZnNldDogbG9jYXRpb24uc3RhcnQub2Zmc2V0fSlcbn1cblxuLyoqXG4gKiBSZW1hcHMgYSBTZW1hbnRpZm9sZCBkaWFnbm9zdGljIGFuZCBwcmVzZXJ2ZXMgaXRzIGdlbmVyYXRlZCBsb2NhdGlvbiBhbmQgY2F1c2UuXG4gKiBAcGFyYW0ge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZGlhZ25vc3RpYyAtIEdlbmVyYXRlZC1wcm9ncmFtIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gUmVtYXBwZWQgZGlhZ25vc3RpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwRGlhZ25vc3RpYyhkaWFnbm9zdGljLCBtYXBwaW5nKSB7XG4gIGlmICghZGlhZ25vc3RpYy5sb2NhdGlvbikgcmV0dXJuIGRpYWdub3N0aWNcblxuICBjb25zdCByZW1hcHBlZCA9IHJlbWFwTG9jYXRpb24oZGlhZ25vc3RpYy5sb2NhdGlvbiwgbWFwcGluZylcblxuICBpZiAoIXJlbWFwcGVkLmxvY2F0aW9uKSByZXR1cm4gZGlhZ25vc3RpY1xuXG4gIHJldHVybiBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZGlhZ25vc3RpYyxcbiAgICBjb2RlOiBkaWFnbm9zdGljLmNvZGUsXG4gICAgZ2VuZXJhdGVkTG9jYXRpb246IGRpYWdub3N0aWMubG9jYXRpb24sXG4gICAgbGFuZ3VhZ2U6IGRpYWdub3N0aWMubGFuZ3VhZ2UsXG4gICAgbG9jYXRpb246IHJlbWFwcGVkLmxvY2F0aW9uLFxuICAgIG1lc3NhZ2U6IGRpYWdub3N0aWMuZGV0YWlsXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwdWJsaWMgbWFwcGluZyBlbnZlbG9wZSBhbmQgb3JkZXJlZCBoYWxmLW9wZW4gZ2VuZXJhdGVkIHJhbmdlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbWFwcGluZy5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBOb3RoaW5nIHdoZW4gdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hcHBpbmcodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJzY2hlbWFcIikgIT0gXCJTZW1hbnRpZm9sZE1hcHBpbmdcIiB8fFxuICAgIFJlZmxlY3QuZ2V0KHZhbHVlLCBcInZlcnNpb25cIikgIT0gMSB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJjb29yZGluYXRlU3lzdGVtXCIpICE9IFwidXRmMTZcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIFNlbWFudGlmb2xkTWFwcGluZyB2MSB2YWx1ZS5cIilcbiAgfVxuXG4gIGNvbnN0IG1hcHBpbmcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gIGNvbnN0IGdlbmVyYXRlZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChtYXBwaW5nLmdlbmVyYXRlZClcbiAgY29uc3Qgc3BhbnMgPSBtYXBwaW5nLnNwYW5zXG5cbiAgaWYgKCFnZW5lcmF0ZWQgfHwgdHlwZW9mIGdlbmVyYXRlZCAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiZmlsZW5hbWVcIikgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiY29udGVudFwiKSAhPSBcInN0cmluZ1wiIHx8ICFpc0xhbmd1YWdlKFJlZmxlY3QuZ2V0KGdlbmVyYXRlZCwgXCJsYW5ndWFnZVwiKSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShtYXBwaW5nLnNvdXJjZXMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkobWFwcGluZy5ub2RlcykgfHwgIUFycmF5LmlzQXJyYXkobWFwcGluZy5zeW1ib2xzKSB8fCAhQXJyYXkuaXNBcnJheShzcGFucykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIFNlbWFudGlmb2xkTWFwcGluZyB2MSBlbnZlbG9wZS5cIilcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGdlbmVyYXRlZC5jb250ZW50KVxuICBjb25zdCBmaWxlbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZ2VuZXJhdGVkLmZpbGVuYW1lKVxuXG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwiXFxyXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWZvbGRNYXBwaW5nIGdlbmVyYXRlZCBjb250ZW50IG11c3QgdXNlIExGIGxpbmUgZW5kaW5ncy5cIilcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBtYXBwaW5nLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIHNvdXJjZS5pZCAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pZC5sZW5ndGggPT0gMCB8fCBzb3VyY2VJZHMuaGFzKHNvdXJjZS5pZCkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UuZmlsZW5hbWUubGVuZ3RoID09IDAgfHwgc291cmNlLmNvbnRlbnQgIT09IG51bGwgJiYgdHlwZW9mIHNvdXJjZS5jb250ZW50ICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIHNvdXJjZS5sYW5ndWFnZSAhPT0gbnVsbCAmJiAhaXNMYW5ndWFnZShzb3VyY2UubGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBTZW1hbnRpZm9sZE1hcHBpbmcgc291cmNlLlwiKVxuICAgIH1cbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgfVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuICAgIC5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKV0pKVxuICBjb25zdCBzb3VyY2VzQnlJZCA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBzb3VyY2VdKSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXT59ICovXG4gIGNvbnN0IHNvdXJjZXNCeUZpbGVuYW1lID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbWFwcGluZy5zb3VyY2VzKSB7XG4gICAgY29uc3Qgc2FtZU5hbWUgPSBzb3VyY2VzQnlGaWxlbmFtZS5nZXQoc291cmNlLmZpbGVuYW1lKSA/PyBbXVxuXG4gICAgc2FtZU5hbWUucHVzaChzb3VyY2UpXG4gICAgc291cmNlc0J5RmlsZW5hbWUuc2V0KHNvdXJjZS5maWxlbmFtZSwgc2FtZU5hbWUpXG4gIH1cbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoY29udGVudClcblxuICBjb25zdCBub2RlSWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG5vZGVQYXRocyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXBwaW5nLm5vZGVzKSB7XG4gICAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIG5vZGUuaWQgIT0gXCJzdHJpbmdcIiB8fCBub2RlLmlkLmxlbmd0aCA9PSAwIHx8IG5vZGVJZHMuaGFzKG5vZGUuaWQpIHx8XG4gICAgICB0eXBlb2Ygbm9kZS5wYXRoICE9IFwic3RyaW5nXCIgfHwgbm9kZVBhdGhzLmhhcyhub2RlLnBhdGgpIHx8XG4gICAgICB0eXBlb2Ygbm9kZS5raW5kICE9IFwic3RyaW5nXCIgfHwgbm9kZS5raW5kLmxlbmd0aCA9PSAwIHx8ICFub2RlLm9yaWdpbiB8fCB0eXBlb2Ygbm9kZS5yYW5nZXMgIT0gXCJvYmplY3RcIiB8fFxuICAgICAgbm9kZS5yYW5nZXMgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShub2RlLnJhbmdlcykpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXCIpXG4gICAgbm9kZUlkcy5hZGQobm9kZS5pZClcbiAgICBub2RlUGF0aHMuYWRkKG5vZGUucGF0aClcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbElkcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc3ltYm9sIG9mIG1hcHBpbmcuc3ltYm9scykge1xuICAgIGlmICghc3ltYm9sIHx8IHR5cGVvZiBzeW1ib2wgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygc3ltYm9sLmlkICE9IFwic3RyaW5nXCIgfHwgc3ltYm9sLmlkLmxlbmd0aCA9PSAwIHx8IHN5bWJvbElkcy5oYXMoc3ltYm9sLmlkKSB8fFxuICAgICAgdHlwZW9mIHN5bWJvbC5uYW1lICE9IFwic3RyaW5nXCIgfHwgc3ltYm9sLm5hbWUubGVuZ3RoID09IDAgfHwgIVtcImZ1bmN0aW9uXCIsIFwicGFyYW1ldGVyXCIsIFwibG9jYWxcIl0uaW5jbHVkZXMoc3ltYm9sLmtpbmQpIHx8XG4gICAgICAhbm9kZUlkcy5oYXMoc3ltYm9sLmRlY2xhcmF0aW9uTm9kZUlkKSB8fCAhQXJyYXkuaXNBcnJheShzeW1ib2wucmVmZXJlbmNlcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cIilcbiAgICB9XG4gICAgc3ltYm9sSWRzLmFkZChzeW1ib2wuaWQpXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwcGluZy5ub2Rlcykge1xuICAgIHZhbGlkYXRlT3JpZ2luKG5vZGUub3JpZ2luLCBzb3VyY2VzQnlJZCwgc291cmNlQ29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcylcbiAgICBmb3IgKGNvbnN0IFtyb2xlLCBsb2NhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMobm9kZS5yYW5nZXMpKSB7XG4gICAgICBpZiAocm9sZS5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGljIG5vZGUgcmFuZ2Ugcm9sZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcbiAgICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKGxvY2F0aW9uLCBzb3VyY2VzQnlGaWxlbmFtZSwgc291cmNlQ29vcmRpbmF0ZXMpXG4gICAgfVxuICAgIGlmIChub2RlLnN5bWJvbElkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBub2RlLnN5bWJvbElkICE9IFwic3RyaW5nXCIgfHwgIXN5bWJvbElkcy5oYXMobm9kZS5zeW1ib2xJZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWMgbm9kZSByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sLlwiKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3ltYm9sIG9mIG1hcHBpbmcuc3ltYm9scykge1xuICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKHN5bWJvbC5sb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICBpZiAoIXJlZmVyZW5jZSB8fCB0eXBlb2YgcmVmZXJlbmNlICE9IFwib2JqZWN0XCIgfHwgIW5vZGVJZHMuaGFzKHJlZmVyZW5jZS5ub2RlSWQpIHx8XG4gICAgICAgICFbXCJkZWNsYXJhdGlvblwiLCBcInJlYWRcIiwgXCJ3cml0ZVwiLCBcImNhbGxcIl0uaW5jbHVkZXMocmVmZXJlbmNlLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc2VtYW50aWMgc3ltYm9sIHJlZmVyZW5jZS5cIilcbiAgICAgIH1cbiAgICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKHJlZmVyZW5jZS5sb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIH1cbiAgfVxuXG4gIGxldCBwcmV2aW91c0VuZCA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHtcbiAgICBpZiAoIXNwYW4gfHwgdHlwZW9mIHNwYW4gIT0gXCJvYmplY3RcIiB8fCAhW1wiZXhhY3RcIiwgXCJhbmNob3JcIiwgXCJzeW50aGV0aWNcIl0uaW5jbHVkZXMoUmVmbGVjdC5nZXQoc3BhbiwgXCJtYXBwaW5nS2luZFwiKSkgfHxcbiAgICAgICFSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSB8fCAhUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgU2VtYW50aWZvbGRNYXBwaW5nIHNwYW4uXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259ICovIChSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSlcblxuICAgIGlmICghbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fCBsb2NhdGlvbi5maWxlbmFtZSAhPSBmaWxlbmFtZSB8fCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgIT0gcHJldmlvdXNFbmQgfHxcbiAgICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPD0gbG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPiBjb250ZW50Lmxlbmd0aCB8fFxuICAgICAgIXNhbWVQb2ludChpbmRleGVkUG9pbnRBdChnZW5lcmF0ZWRDb29yZGluYXRlcywgbG9jYXRpb24uc3RhcnQub2Zmc2V0KSwgbG9jYXRpb24uc3RhcnQpIHx8XG4gICAgICAhc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBsb2NhdGlvbi5lbmQub2Zmc2V0KSwgbG9jYXRpb24uZW5kKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGV4YWN0bHkgY292ZXIgb3JkZXJlZCBub3JtYWxpemVkIGdlbmVyYXRlZCByYW5nZXMuXCIpXG4gICAgfVxuICAgIHZhbGlkYXRlT3JpZ2luKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSAqLyAoUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpLFxuICAgICAgc291cmNlc0J5SWQsXG4gICAgICBzb3VyY2VDb29yZGluYXRlcyxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBzeW1ib2xJZHNcbiAgICApXG4gICAgY29uc3Qgbm9kZUlkID0gUmVmbGVjdC5nZXQoc3BhbiwgXCJub2RlSWRcIilcbiAgICBjb25zdCBzeW1ib2xJZCA9IFJlZmxlY3QuZ2V0KHNwYW4sIFwic3ltYm9sSWRcIilcblxuICAgIGlmIChub2RlSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG5vZGVJZCAhPSBcInN0cmluZ1wiIHx8ICFub2RlSWRzLmhhcyhub2RlSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgICBpZiAoc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHN5bWJvbElkICE9IFwic3RyaW5nXCIgfHwgIXN5bWJvbElkcy5oYXMoc3ltYm9sSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sLlwiKVxuICAgIGlmIChSZWZsZWN0LmdldChzcGFuLCBcInJvbGVcIikgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgUmVmbGVjdC5nZXQoc3BhbiwgXCJyb2xlXCIpICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KHNwYW4sIFwibmFtZVwiKSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBSZWZsZWN0LmdldChzcGFuLCBcIm5hbWVcIikgIT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByb2xlcyBhbmQgbmFtZXMgbXVzdCBiZSBzdHJpbmdzLlwiKVxuICAgIH1cbiAgICBwcmV2aW91c0VuZCA9IGxvY2F0aW9uLmVuZC5vZmZzZXRcbiAgfVxuXG4gIGlmIChwcmV2aW91c0VuZCAhPSBjb250ZW50Lmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGNvdmVyIGFsbCBnZW5lcmF0ZWQgY29udGVudC5cIilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMsIGZyZWV6ZXMsIGFuZCBpbmRleGVzIG9uZSBtYXBwaW5nIHByb2R1Y2VkIGF0IGEgdHJ1c3QgYm91bmRhcnkuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IEltbXV0YWJsZSBpbmRleGVkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU1hcHBpbmcodmFsdWUpIHtcbiAgLy8gUHJvZHVjZXJzIG1heSByZXRhaW4gcmVmZXJlbmNlcyB0byBtdXRhYmxlIHNlbWFudGljIGxvY2F0aW9uczsgbWFwcGluZ3Mgb3duIHRoZWlyIGltbXV0YWJsZSBjb3B5LlxuICBjb25zdCBtYXBwaW5nID0gc3RydWN0dXJlZENsb25lKHZhbHVlKVxuXG4gIHZhbGlkYXRlTWFwcGluZyhtYXBwaW5nKVxuICBmcmVlemVKc29uKG1hcHBpbmcpXG4gIG1hcHBpbmdJbmRleGVzLnNldChtYXBwaW5nLCBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSlcblxuICByZXR1cm4gbWFwcGluZ1xufVxuXG4vKipcbiAqIEdldHMgYW4gaW5kZXgsIHZhbGlkYXRpbmcgbXV0YWJsZSBjYWxsZXIgbWFwcGluZ3Mgb24gZXZlcnkgdHJ1c3QtYm91bmRhcnkgdXNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIE1hcHBpbmcuXG4gKiBAcmV0dXJucyB7TWFwcGluZ0luZGV4fSBMb29rdXAgaW5kZXguXG4gKi9cbmZ1bmN0aW9uIG1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGNhY2hlZCA9IG1hcHBpbmdJbmRleGVzLmdldChtYXBwaW5nKVxuXG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICB2YWxpZGF0ZU1hcHBpbmcobWFwcGluZylcblxuICByZXR1cm4gYnVpbGRNYXBwaW5nSW5kZXgobWFwcGluZylcbn1cblxuLyoqXG4gKiBCdWlsZHMgZ2VuZXJhdGVkLCBvcmlnaW5hbCwgbm9kZSwgYW5kIHN5bWJvbCBpbmRleGVzIGluIG9uZSBwYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFZhbGlkYXRlZCBtYXBwaW5nLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRDb29yZGluYXRlczogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Piwgbm9kZVNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT4sIG9yaWdpbmFsQnlTb3VyY2U6IE1hcDxzdHJpbmcsIHtlbmQ6IG51bWJlciwgcHJlZml4RW5kOiBudW1iZXIsIHNwYW46IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbiwgc3RhcnQ6IG51bWJlcn1bXT4sIG9yaWdpbmFsUG9pbnRzQnlTb3VyY2U6IE1hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj4sIHNvdXJjZUNvb3JkaW5hdGVzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+Piwgc291cmNlc0J5SWQ6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT4sIHN5bWJvbFNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT59fSBNYXBwaW5nIGluZGV4LlxuICovXG5mdW5jdGlvbiBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGdlbmVyYXRlZENvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQpXG4gIGNvbnN0IHNvdXJjZXNCeUlkID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIHNvdXJjZV0pKVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuICAgIC5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKV0pKVxuICBjb25zdCBub2RlU3BhbnMgPSBuZXcgTWFwKG1hcHBpbmcubm9kZXMubWFwKChub2RlKSA9PiBbbm9kZS5pZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi8gKFtdKV0pKVxuICBjb25zdCBzeW1ib2xTcGFucyA9IG5ldyBNYXAobWFwcGluZy5zeW1ib2xzLm1hcCgoc3ltYm9sKSA9PiBbc3ltYm9sLmlkLCAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSAqLyAoW10pXSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2VuZDogbnVtYmVyLCBwcmVmaXhFbmQ6IG51bWJlciwgc3BhbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBzdGFydDogbnVtYmVyfVtdPn0gKi9cbiAgY29uc3Qgb3JpZ2luYWxCeVNvdXJjZSA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBbXV0pKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj59ICovXG4gIGNvbnN0IG9yaWdpbmFsUG9pbnRzQnlTb3VyY2UgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgbmV3IE1hcCgpXSkpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIG1hcHBpbmcuc3BhbnMpIHtcbiAgICBjb25zdCBzcGFuTm9kZUlkcyA9IG5ldyBTZXQoc3Bhbi5ub2RlSWQgPyBbc3Bhbi5ub2RlSWRdIDogW10pXG4gICAgY29uc3Qgc3BhblN5bWJvbElkcyA9IG5ldyBTZXQoc3Bhbi5zeW1ib2xJZCA/IFtzcGFuLnN5bWJvbElkXSA6IFtdKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgaWYgKHJlbGF0ZWQubm9kZUlkKSBzcGFuTm9kZUlkcy5hZGQocmVsYXRlZC5ub2RlSWQpXG4gICAgICBpZiAocmVsYXRlZC5zeW1ib2xJZCkgc3BhblN5bWJvbElkcy5hZGQocmVsYXRlZC5zeW1ib2xJZClcbiAgICAgIGlmIChyZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQgPT0gcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gb3JpZ2luYWxQb2ludHNCeVNvdXJjZS5nZXQocmVsYXRlZC5zb3VyY2VJZClcbiAgICAgICAgY29uc3QgcG9pbnRTcGFucyA9IHBvaW50cz8uZ2V0KHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0KSA/PyBbXVxuXG4gICAgICAgIHBvaW50U3BhbnMucHVzaChzcGFuKVxuICAgICAgICBwb2ludHM/LnNldChyZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCwgcG9pbnRTcGFucylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsQnlTb3VyY2UuZ2V0KHJlbGF0ZWQuc291cmNlSWQpPy5wdXNoKHtcbiAgICAgICAgZW5kOiByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgIHByZWZpeEVuZDogcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgICAgICBzcGFuLFxuICAgICAgICBzdGFydDogcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIHNwYW5Ob2RlSWRzKSBub2RlU3BhbnMuZ2V0KG5vZGVJZCk/LnB1c2goc3BhbilcbiAgICBmb3IgKGNvbnN0IHN5bWJvbElkIG9mIHNwYW5TeW1ib2xJZHMpIHN5bWJvbFNwYW5zLmdldChzeW1ib2xJZCk/LnB1c2goc3BhbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cmllcyBvZiBvcmlnaW5hbEJ5U291cmNlLnZhbHVlcygpKSB7XG4gICAgZW50cmllcy5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zdGFydCAtIHJpZ2h0LnN0YXJ0IHx8IGxlZnQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IC0gcmlnaHQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KVxuICAgIGxldCBwcmVmaXhFbmQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIHByZWZpeEVuZCA9IE1hdGgubWF4KHByZWZpeEVuZCwgZW50cnkuZW5kKVxuICAgICAgZW50cnkucHJlZml4RW5kID0gcHJlZml4RW5kXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtnZW5lcmF0ZWRDb29yZGluYXRlcywgbm9kZVNwYW5zLCBvcmlnaW5hbEJ5U291cmNlLCBvcmlnaW5hbFBvaW50c0J5U291cmNlLCBzb3VyY2VDb29yZGluYXRlcywgc291cmNlc0J5SWQsIHN5bWJvbFNwYW5zfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBnZW5lcmF0ZWQgc3BhbiBjb250YWluaW5nIGFuIG9mZnNldCBieSBiaW5hcnkgc2VhcmNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIEdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuIHwgdW5kZWZpbmVkfSBDb250YWluaW5nIHNwYW4uXG4gKi9cbmZ1bmN0aW9uIHNwYW5Gb3JHZW5lcmF0ZWQoc3BhbnMsIG9mZnNldCkge1xuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSBzcGFuc1tsb3cgLSAxXVxuXG4gIHJldHVybiBjYW5kaWRhdGUgJiYgb2Zmc2V0IDwgY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0ID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRmluZHMgb3JkZXJlZCBnZW5lcmF0ZWQgc3BhbnMgaW50ZXJzZWN0aW5nIGEgaGFsZi1vcGVuIHJhbmdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5jbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gRXhjbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IE92ZXJsYXBwaW5nIHNwYW5zLlxuICovXG5mdW5jdGlvbiBzcGFuc092ZXJsYXBwaW5nR2VuZXJhdGVkKHNwYW5zLCBzdGFydCwgZW5kKSB7XG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICBjb25zdCBjb250YWluaW5nID0gc3BhbkZvckdlbmVyYXRlZChzcGFucywgc3RhcnQpXG5cbiAgICByZXR1cm4gY29udGFpbmluZyA/IFtjb250YWluaW5nXSA6IFtdXG4gIH1cblxuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPD0gc3RhcnQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBvdmVybGFwcGluZyA9IFtdXG5cbiAgZm9yIChsZXQgaW5kZXggPSBsb3c7IGluZGV4IDwgc3BhbnMubGVuZ3RoICYmIHNwYW5zW2luZGV4XS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgZW5kOyBpbmRleCsrKSB7XG4gICAgb3ZlcmxhcHBpbmcucHVzaChzcGFuc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gb3ZlcmxhcHBpbmdcbn1cblxuLyoqXG4gKiBEZWVwLWZyZWV6ZXMgYSBKU09OIHRyZWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSlNPTiB2YWx1ZS5cbiAqIEBwYXJhbSB7V2Vha1NldDxvYmplY3Q+fSBbdmlzaXRlZF0gLSBDeWNsZSBwcm90ZWN0aW9uIGZvciByZWplY3RlZCBjYWxsZXIgZXh0cmFzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGZyZWV6ZUpzb24odmFsdWUsIHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmlzaXRlZC5oYXModmFsdWUpKSByZXR1cm5cblxuICB2aXNpdGVkLmFkZCh2YWx1ZSlcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZnJlZXplSnNvbihjaGlsZCwgdmlzaXRlZClcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgY2xvc2VkIG1hcHBpbmcgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHNvdXJjZXNCeUlkIC0gU291cmNlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXhlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbbm9kZUlkc10gLSBLbm93biBzZW1hbnRpYyBub2Rlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbc3ltYm9sSWRzXSAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPcmlnaW4ob3JpZ2luLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykge1xuICBpZiAoIW9yaWdpbiB8fCB0eXBlb2Ygb3JpZ2luICE9IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXBwaW5nIG9yaWdpbiBtdXN0IGJlIGEgY2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXCIpXG5cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHtcbiAgICB2YWxpZGF0ZVJlbGF0ZWQoe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9LCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcylcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JpZ2luLm9yaWdpbnMpIHx8IG9yaWdpbi5vcmlnaW5zLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBwcm92ZW5hbmNlIHJlcXVpcmVzIG9yaWdpbnMuXCIpXG4gICAgb3JpZ2luLm9yaWdpbnMuZm9yRWFjaCgocmVsYXRlZCkgPT4gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luLnJlYXNvbiAhPSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KG9yaWdpbi5yZWxhdGVkT3JpZ2lucykpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc3ludGhldGljIHByb3ZlbmFuY2UuXCIpXG4gICAgb3JpZ2luLnJlbGF0ZWRPcmlnaW5zLmZvckVhY2goKHJlbGF0ZWQpID0+IHZhbGlkYXRlUmVsYXRlZChyZWxhdGVkLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBwcm92ZW5hbmNlIGtpbmQuXCIpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzb3VyY2UtcmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIFJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBzb3VyY2VzQnlJZCAtIFNvdXJjZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcGFyYW0ge1NldDx1bmtub3duPiB8IHVuZGVmaW5lZH0gbm9kZUlkcyAtIEtub3duIHNlbWFudGljIG5vZGVzLlxuICogQHBhcmFtIHtTZXQ8dW5rbm93bj4gfCB1bmRlZmluZWR9IHN5bWJvbElkcyAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeUlkLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gIGlmICghc291cmNlIHx8ICFyZWxhdGVkLmxvY2F0aW9uIHx8IHJlbGF0ZWQubG9jYXRpb24uZmlsZW5hbWUgIT0gc291cmNlLmZpbGVuYW1lIHx8XG4gICAgcmVsYXRlZC5ub2RlSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5ub2RlSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHJlbGF0ZWQuc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5zeW1ib2xJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgcmVsYXRlZC5yb2xlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlbGF0ZWQucm9sZSAhPSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzb3VyY2UuXCIpXG4gIGlmIChub2RlSWRzICYmIHJlbGF0ZWQubm9kZUlkICE9PSB1bmRlZmluZWQgJiYgIW5vZGVJZHMuaGFzKHJlbGF0ZWQubm9kZUlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9yaWdpbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgaWYgKHN5bWJvbElkcyAmJiByZWxhdGVkLnN5bWJvbElkICE9PSB1bmRlZmluZWQgJiYgIXN5bWJvbElkcy5oYXMocmVsYXRlZC5zeW1ib2xJZCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzeW1ib2wuXCIpXG4gIH1cbiAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZShyZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGxvY2F0aW9uIGFnYWluc3QgYXQgbGVhc3Qgb25lIHNhbWUtZmlsZW5hbWUgc291cmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW10+fSBzb3VyY2VzQnlGaWxlbmFtZSAtIFNvdXJjZXMgYnkgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXModmFsdWUsIHNvdXJjZXNCeUZpbGVuYW1lLCBjb29yZGluYXRlcykge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yaWdpbmFsIGxvY2F0aW9uLlwiKVxuICBjb25zdCBsb2NhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKVxuICBjb25zdCBjYW5kaWRhdGVzID0gc291cmNlc0J5RmlsZW5hbWUuZ2V0KGxvY2F0aW9uLmZpbGVuYW1lKSA/PyBbXVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PSAwIHx8ICFjYW5kaWRhdGVzLnNvbWUoKHNvdXJjZSkgPT4gbG9jYXRpb25NYXRjaGVzU291cmNlKGxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBsb2NhdGlvbiBhZ2FpbnN0IGl0cyBpZGVudGlmaWVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2UodmFsdWUsIHNvdXJjZSwgY29vcmRpbmF0ZXMpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCAhbG9jYXRpb25NYXRjaGVzU291cmNlKFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKSwgc291cmNlLCBjb29yZGluYXRlc1xuICApKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG59XG5cbi8qKlxuICogVGVzdHMgYSBsb2NhdGlvbiBhZ2FpbnN0IG9uZSBzb3VyY2UgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJhbmdlIGlzIG5vcm1hbGl6ZWQgZm9yIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0aW9uTWF0Y2hlc1NvdXJjZShsb2NhdGlvbiwgc291cmNlLCBjb29yZGluYXRlcykge1xuICBpZiAoIWxvY2F0aW9uIHx8IGxvY2F0aW9uLmZpbGVuYW1lICE9IHNvdXJjZS5maWxlbmFtZSB8fCAhbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fFxuICAgICF2YWxpZFBvaW50KGxvY2F0aW9uLnN0YXJ0KSB8fCAhdmFsaWRQb2ludChsb2NhdGlvbi5lbmQpIHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHJldHVybiBmYWxzZVxuXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBsb2NhdGlvbi5lbmQub2Zmc2V0IDw9IHNvdXJjZS5jb250ZW50Lmxlbmd0aCAmJiBjb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpXG59XG5cbi8qKlxuICogVGVzdHMgdGhlIHN0cnVjdHVyYWwgdmFsaWRpdHkgb2Ygb25lIHNvdXJjZSBwb2ludC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gV2hldGhlciBpdCBpcyBhIHBvaW50LlxuICovXG5mdW5jdGlvbiB2YWxpZFBvaW50KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICBjb25zdCBwb2ludCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb2ludC5vZmZzZXQpICYmIE51bWJlci5pc0ludGVnZXIocG9pbnQubGluZSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwb2ludC5jb2x1bW4pICYmXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5vZmZzZXQpID49IDAgJiYgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5saW5lKSA+PSAxICYmIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocG9pbnQuY29sdW1uKSA+PSAxXG59XG5cbi8qKlxuICogVGVzdHMgYSBzdXBwb3J0ZWQgc2VtYW50aWMgbGFuZ3VhZ2UgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGxhbmd1YWdlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gV2hldGhlciBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IFwicGhwXCIgfHwgdmFsdWUgPT0gXCJydWJ5XCIgfHwgdmFsdWUgPT0gXCJqYXZhc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJqYXZhXCJcbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIHN0YWJsZSBsb29rdXAgcmVzdWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IHNwYW4gLSBNYXBwaW5nIHNwYW4uXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRlZExvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCwgbWFwcGluZ0tpbmQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTWFwcGluZ0tpbmQsIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgbm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ltYm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZH19IExvb2t1cCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG1hcHBpbmdSZXN1bHQoc3Bhbikge1xuICByZXR1cm4ge1xuICAgIGdlbmVyYXRlZExvY2F0aW9uOiBzcGFuLmdlbmVyYXRlZCxcbiAgICBsb2NhdGlvbjogcHJpbWFyeUxvY2F0aW9uKHNwYW4ub3JpZ2luKSxcbiAgICBtYXBwaW5nS2luZDogc3Bhbi5tYXBwaW5nS2luZCxcbiAgICBuYW1lOiBzcGFuLm5hbWUsXG4gICAgbm9kZUlkOiBzcGFuLm5vZGVJZCxcbiAgICByb2xlOiBzcGFuLnJvbGUsXG4gICAgc3ltYm9sSWQ6IHNwYW4uc3ltYm9sSWRcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIG9mZnNldC1mb3JtIG9yIGxpbmUvY29sdW1uLWZvcm0gcG9zaXRpb24uXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXguXG4gKiBAcGFyYW0ge3tvZmZzZXQ6IG51bWJlcn0gfCB7bGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcn19IHBvc2l0aW9uIC0gUG9zaXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBVVEYtMTYgb2Zmc2V0LlxuICovXG5mdW5jdGlvbiBwb3NpdGlvbk9mZnNldChjb29yZGluYXRlcywgcG9zaXRpb24pIHtcbiAgaWYgKFwib2Zmc2V0XCIgaW4gcG9zaXRpb24pIHtcbiAgICBpbmRleGVkUG9pbnRBdChjb29yZGluYXRlcywgcG9zaXRpb24ub2Zmc2V0KVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uLm9mZnNldFxuICB9XG5cbiAgcmV0dXJuIGluZGV4ZWRPZmZzZXRBdChjb29yZGluYXRlcywgcG9zaXRpb24ubGluZSwgcG9zaXRpb24uY29sdW1uKVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBleGNsdXNpdmUgY29udGVudCBvZmZzZXQgYmVmb3JlIHRoZSBuZXh0IGdlbmVyYXRlZCBsaW5lIGJyZWFrLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBHZW5lcmF0ZWQgY29udGVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBPZmZzZXQgb24gdGhlIGN1cnJlbnQgbGluZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IEVuZCBvZiB0aGUgY3VycmVudCBsaW5lIG9yIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGxpbmVFbmRPZmZzZXQoY29udGVudCwgb2Zmc2V0KSB7XG4gIGNvbnN0IG5ld2xpbmUgPSBjb250ZW50LmluZGV4T2YoXCJcXG5cIiwgb2Zmc2V0KVxuXG4gIHJldHVybiBuZXdsaW5lID09IC0xID8gY29udGVudC5sZW5ndGggOiBuZXdsaW5lXG59XG5cbi8qKlxuICogQ29tcGFyZXMgY29tcGxldGUgbm9ybWFsaXplZCBwb2ludHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlUG9pbnR9IGxlZnQgLSBMZWZ0IHBvaW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSByaWdodCAtIFJpZ2h0IHBvaW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgY29vcmRpbmF0ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIHNhbWVQb2ludChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdC5vZmZzZXQgPT0gcmlnaHQub2Zmc2V0ICYmIGxlZnQubGluZSA9PSByaWdodC5saW5lICYmIGxlZnQuY29sdW1uID09IHJpZ2h0LmNvbHVtblxufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgc291cmNlIHJlZ2lzdHJ5IGVudHJ5IGZvciBhbiBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gTWFwcGluZy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gT3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFByaW1hcnkgbG9jYXRpb24uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHNvdXJjZXNCeUlkIC0gSW5kZXhlZCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gUmVnaXN0ZXJlZCBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZUZvck9yaWdpbihtYXBwaW5nLCBvcmlnaW4sIGxvY2F0aW9uLCBzb3VyY2VzQnlJZCkge1xuICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZUlkRm9yT3JpZ2luKG9yaWdpbilcbiAgY29uc3Qgc291cmNlID0gc291cmNlc0J5SWQuZ2V0KHNvdXJjZUlkID8/IFwiXCIpID8/XG4gICAgbWFwcGluZy5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKVxuXG4gIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBtYXBwaW5nIHNvdXJjZSBmb3IgJHtsb2NhdGlvbi5maWxlbmFtZX0uYClcblxuICByZXR1cm4gc291cmNlXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHJlZ2lzdHJ5IGlkZW50aXR5IG9mIGFuIG9yaWdpbidzIHByaW1hcnkgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIE9yaWdpbi5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFNvdXJjZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gc291cmNlSWRGb3JPcmlnaW4ob3JpZ2luKSB7XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSByZXR1cm4gb3JpZ2luLnNvdXJjZUlkXG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIG9yaWdpbi5vcmlnaW5zWzBdPy5zb3VyY2VJZFxuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNbMF0/LnNvdXJjZUlkXG59XG5cbi8qKlxuICogUmV3cml0ZXMgY2xvc2VkLW9yaWdpbiBzb3VyY2UgaWRlbnRpdGllcyBhZ2FpbnN0IGEgY29tcG9zZWQgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIE9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gc291cmNlSWRzIC0gT3JpZ2luYWwtdG8tY29tcG9zZWQgc291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUmV3cml0dGVuIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gcmVtYXBPcmlnaW5Tb3VyY2VJZHMob3JpZ2luLCBzb3VyY2VJZHMpIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHtcbiAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZUlkcy5nZXQob3JpZ2luLnNvdXJjZUlkKVxuXG4gICAgaWYgKCFzb3VyY2VJZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbXBvc2VkIG1hcHBpbmcgb21pdHRlZCBzb3VyY2UgJyR7b3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lfScuYClcblxuICAgIHJldHVybiB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb246IG9yaWdpbi5sb2NhdGlvbiwgc291cmNlSWR9XG4gIH1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4ge2tpbmQ6IFwiZGVyaXZlZFwiLCBvcmlnaW5zOiBvcmlnaW4ub3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IHJlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIHNvdXJjZUlkcykpfVxuXG4gIHJldHVybiB7XG4gICAga2luZDogXCJzeW50aGV0aWNcIixcbiAgICByZWFzb246IG9yaWdpbi5yZWFzb24sXG4gICAgcmVsYXRlZE9yaWdpbnM6IG9yaWdpbi5yZWxhdGVkT3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IHJlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIHNvdXJjZUlkcykpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXdyaXRlcyBvbmUgcmVsYXRlZCBzb3VyY2UgaWRlbnRpdHkgd2hpbGUgZHJvcHBpbmcgaWRlbnRpdGllcyBmcm9tIGEgZGlzY2FyZGVkIG5vZGUgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIFJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBzb3VyY2VJZHMgLSBPcmlnaW5hbC10by1jb21wb3NlZCBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IFJld3JpdHRlbiByZWxhdGVkIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgc291cmNlSWRzKSB7XG4gIGNvbnN0IHNvdXJjZUlkID0gc291cmNlSWRzLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gIGlmICghc291cmNlSWQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBDb21wb3NlZCBtYXBwaW5nIG9taXR0ZWQgc291cmNlICcke3JlbGF0ZWQubG9jYXRpb24uZmlsZW5hbWV9Jy5gKVxuXG4gIGNvbnN0IHVuaWRlbnRpZmllZCA9IHsuLi5yZWxhdGVkfVxuXG4gIGRlbGV0ZSB1bmlkZW50aWZpZWQubm9kZUlkXG4gIGRlbGV0ZSB1bmlkZW50aWZpZWQuc3ltYm9sSWRcblxuICByZXR1cm4gey4uLnVuaWRlbnRpZmllZCwgc291cmNlSWR9XG59XG5cbi8qKlxuICogU29ydHMgb2JqZWN0IGtleXMgcmVjdXJzaXZlbHkgd2hpbGUgcHJlc2VydmluZyBzZW1hbnRpYyBhcnJheSBvcmRlci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBKU09OIHZhbHVlLlxuICogQHJldHVybnMge3Vua25vd259IERldGVybWluaXN0aWNhbGx5IGtleWVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzb3J0SnNvbih2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoc29ydEpzb24pXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModmFsdWUpLnNvcnQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMClcbiAgICAgIC5tYXAoKFtrZXksIGNoaWxkXSkgPT4gW2tleSwgc29ydEpzb24oY2hpbGQpXSkpXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHVuZGVmaW5lZCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gYSBwdWJsaWMgSlNPTiB2YWx1ZS5cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFZhbHVlXG4gKiBAcGFyYW0ge1ZhbHVlfSB2YWx1ZSAtIENhbmRpZGF0ZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7VmFsdWV9IENvbXBhY3QgSlNPTi1zYWZlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZFByb3BlcnRpZXModmFsdWUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7VmFsdWV9ICovIChPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModmFsdWUpLmZpbHRlcigoWywgY2hpbGRdKSA9PiBjaGlsZCAhPT0gdW5kZWZpbmVkKSkpXG59XG4iXX0=
|
|
1121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBwaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0csT0FBTyxFQUNMLFdBQVcsRUFDWCxtQkFBbUIsSUFBSSx3QkFBd0IsRUFDL0MsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFBO0FBQ2xDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDbEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBRXhELG1FQUFtRTtBQUNuRSxzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVwQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFPO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFFcEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVsRyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMs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QyxHQUFHLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFdBQVcsS0FBSyxTQUFTO1FBQzlFLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3RSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM3RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRyxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNySSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxLQUFLLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxNQUFNO1FBQzNHLEtBQUssSUFBSSxRQUFR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ZW5NYXBwaW5nLCBtYXliZUFkZFNlZ21lbnQsIHNldFNvdXJjZUNvbnRlbnQsIHRvRW5jb2RlZE1hcH0gZnJvbSBcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCJcbmltcG9ydCB7XG4gIGVhY2hNYXBwaW5nLFxuICBvcmlnaW5hbFBvc2l0aW9uRm9yIGFzIHRyYWNlT3JpZ2luYWxQb3NpdGlvbkZvcixcbiAgc291cmNlQ29udGVudEZvcixcbiAgVHJhY2VNYXBcbn0gZnJvbSBcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtjcmVhdGVDb29yZGluYXRlSW5kZXgsIGluZGV4ZWRPZmZzZXRBdCwgaW5kZXhlZFBvaW50QXQsIGxvY2F0aW9uRnJvbU9mZnNldHN9IGZyb20gXCIuL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7cHJpbWFyeUxvY2F0aW9ufSBmcm9tIFwiLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBidWlsZE1hcHBpbmdJbmRleD59IE1hcHBpbmdJbmRleCAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nLCBNYXBwaW5nSW5kZXg+fSAqL1xuY29uc3QgbWFwcGluZ0luZGV4ZXMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogUHJvamVjdHMgYW4gYXV0aG9yaXRhdGl2ZSBTZW1hbnRpZm9sZCBtYXBwaW5nIHRvIFNvdXJjZSBNYXAgdjMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IFNvdXJjZSBNYXAgdjMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBuZXcgR2VuTWFwcGluZyh7ZmlsZTogbWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWV9KVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG1hcHBpbmcuc291cmNlcykgc2V0U291cmNlQ29udGVudChnZW5lcmF0ZWQsIHNvdXJjZS5maWxlbmFtZSwgc291cmNlLmNvbnRlbnQpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIG1hcHBpbmcuc3BhbnMpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHByaW1hcnlMb2NhdGlvbihzcGFuLm9yaWdpbilcbiAgICBjb25zdCBsaW5lID0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQubGluZSAtIDFcbiAgICBjb25zdCBjb2x1bW4gPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5jb2x1bW4gLSAxXG5cbiAgICBpZiAoIWxvY2F0aW9uIHx8IHNwYW4ubWFwcGluZ0tpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgICAgbWF5YmVBZGRTZWdtZW50KGdlbmVyYXRlZCwgbGluZSwgY29sdW1uKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlcmVkID0gc291cmNlRm9yT3JpZ2luKG1hcHBpbmcsIHNwYW4ub3JpZ2luLCBsb2NhdGlvbiwgaW5kZXguc291cmNlc0J5SWQpXG5cbiAgICBpZiAoc3Bhbi5uYW1lKSB7XG4gICAgICBhZGRTZWdtZW50KGdlbmVyYXRlZCwgbGluZSwgY29sdW1uLCByZWdpc3RlcmVkLmZpbGVuYW1lLCBsb2NhdGlvbi5zdGFydC5saW5lIC0gMSwgbG9jYXRpb24uc3RhcnQuY29sdW1uIC0gMSwgc3Bhbi5uYW1lLCByZWdpc3RlcmVkLmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFNlZ21lbnQoZ2VuZXJhdGVkLCBsaW5lLCBjb2x1bW4sIHJlZ2lzdGVyZWQuZmlsZW5hbWUsIGxvY2F0aW9uLnN0YXJ0LmxpbmUgLSAxLCBsb2NhdGlvbi5zdGFydC5jb2x1bW4gLSAxLCBudWxsLCByZWdpc3RlcmVkLmNvbnRlbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvRW5jb2RlZE1hcChnZW5lcmF0ZWQpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb3JpZ2luYWwgcHJvdmVuYW5jZSBmb3Igb25lIGdlbmVyYXRlZCBVVEYtMTYgcG9zaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHt7b2Zmc2V0OiBudW1iZXJ9IHwge2xpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fSBwb3NpdGlvbiAtIEdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHt7Z2VuZXJhdGVkTG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkLCBtYXBwaW5nS2luZDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NYXBwaW5nS2luZCwgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzeW1ib2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkfX0gTG9va3VwIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwcGluZywgcG9zaXRpb24pIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgY29uc3Qgb2Zmc2V0ID0gcG9zaXRpb25PZmZzZXQoaW5kZXguZ2VuZXJhdGVkQ29vcmRpbmF0ZXMsIHBvc2l0aW9uKVxuICBjb25zdCBzcGFuID0gc3BhbkZvckdlbmVyYXRlZChtYXBwaW5nLnNwYW5zLCBvZmZzZXQpXG5cbiAgaWYgKCFzcGFuKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gZ2VuZXJhdGVkIG1hcHBpbmcgYXQgb2Zmc2V0ICR7b2Zmc2V0fS5gKVxuXG4gIHJldHVybiBtYXBwaW5nUmVzdWx0KHNwYW4pXG59XG5cbi8qKlxuICogTG9va3MgdXAgZXZlcnkgZ2VuZXJhdGVkIHNwYW4gY29udGFpbmluZyBvbmUgb3JpZ2luYWwgVVRGLTE2IHBvc2l0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFJpY2ggbWFwcGluZy5cbiAqIEBwYXJhbSB7KHtmaWxlbmFtZTogc3RyaW5nfSB8IHtzb3VyY2VJZDogc3RyaW5nfSkgJiAoe29mZnNldDogbnVtYmVyfSB8IHtsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfSl9IHBvc2l0aW9uIC0gT3JpZ2luYWwgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7e2dlbmVyYXRlZExvY2F0aW9uOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBsb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCwgbWFwcGluZ0tpbmQ6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTWFwcGluZ0tpbmQsIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgbm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ltYm9sSWQ6IHN0cmluZyB8IHVuZGVmaW5lZH1bXX0gR2VuZXJhdGVkIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkZvcihtYXBwaW5nLCBwb3NpdGlvbikge1xuICBjb25zdCBpbmRleCA9IG1hcHBpbmdJbmRleChtYXBwaW5nKVxuICBjb25zdCBzb3VyY2UgPSBcInNvdXJjZUlkXCIgaW4gcG9zaXRpb25cbiAgICA/IGluZGV4LnNvdXJjZXNCeUlkLmdldChwb3NpdGlvbi5zb3VyY2VJZClcbiAgICA6IG1hcHBpbmcuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBwb3NpdGlvbi5maWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgcmV0dXJuIFtdXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsICYmICEoXCJvZmZzZXRcIiBpbiBwb3NpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTb3VyY2UgY29udGVudCBpcyByZXF1aXJlZCBmb3IgbGluZS9jb2x1bW4gbG9va3VwIG9mICR7c291cmNlLmZpbGVuYW1lfS5gKVxuICB9XG5cbiAgbGV0IG9mZnNldFxuXG4gIGlmIChcIm9mZnNldFwiIGluIHBvc2l0aW9uKSB7XG4gICAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbi5vZmZzZXQpIHx8IHBvc2l0aW9uLm9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHNvdXJjZSBvZmZzZXQ6ICR7cG9zaXRpb24ub2Zmc2V0fWApXG4gICAgfSBlbHNlIGluZGV4ZWRQb2ludEF0KC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn0gKi8gKGluZGV4LnNvdXJjZUNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSwgcG9zaXRpb24ub2Zmc2V0KVxuICAgIG9mZnNldCA9IHBvc2l0aW9uLm9mZnNldFxuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IGluZGV4ZWRPZmZzZXRBdCgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChpbmRleC5zb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksXG4gICAgICBwb3NpdGlvbi5saW5lLCBwb3NpdGlvbi5jb2x1bW4pXG4gIH1cbiAgY29uc3QgZW50cmllcyA9IGluZGV4Lm9yaWdpbmFsQnlTb3VyY2UuZ2V0KHNvdXJjZS5pZCkgPz8gW11cbiAgbGV0IGxvdyA9IDBcbiAgbGV0IGhpZ2ggPSBlbnRyaWVzLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKGVudHJpZXNbbWlkZGxlXS5zdGFydCA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbj59ICovXG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgaW5kZXgub3JpZ2luYWxQb2ludHNCeVNvdXJjZS5nZXQoc291cmNlLmlkKT8uZ2V0KG9mZnNldCkgPz8gW10pIG1hdGNoZXMuYWRkKHNwYW4pXG5cbiAgZm9yIChsZXQgY2FuZGlkYXRlID0gbG93IC0gMTsgY2FuZGlkYXRlID49IDAgJiYgZW50cmllc1tjYW5kaWRhdGVdLnByZWZpeEVuZCA+IG9mZnNldDsgY2FuZGlkYXRlLS0pIHtcbiAgICBpZiAoZW50cmllc1tjYW5kaWRhdGVdLmVuZCA+IG9mZnNldCkgbWF0Y2hlcy5hZGQoZW50cmllc1tjYW5kaWRhdGVdLnNwYW4pXG4gIH1cblxuICByZXR1cm4gWy4uLm1hdGNoZXNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgLSByaWdodC5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KS5tYXAobWFwcGluZ1Jlc3VsdClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV2ZXJ5IGdlbmVyYXRlZCBzcGFuIGFzc29jaWF0ZWQgd2l0aCBvbmUgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCAtIENhbm9uaWNhbCBub2RlIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBNYXRjaGluZyBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zRm9yTm9kZShtYXBwaW5nLCBub2RlSWQpIHtcbiAgY29uc3QgaW5kZXggPSBtYXBwaW5nSW5kZXgobWFwcGluZylcbiAgaWYgKCFpbmRleC5ub2RlU3BhbnMuaGFzKG5vZGVJZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHNlbWFudGljIG5vZGU6ICR7bm9kZUlkfWApXG5cbiAgcmV0dXJuIFsuLi4oaW5kZXgubm9kZVNwYW5zLmdldChub2RlSWQpID8/IFtdKV1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV2ZXJ5IGdlbmVyYXRlZCBzcGFuIGFzc29jaWF0ZWQgd2l0aCBvbmUgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sSWQgLSBDYW5vbmljYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBNYXRjaGluZyBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zRm9yU3ltYm9sKG1hcHBpbmcsIHN5bWJvbElkKSB7XG4gIGNvbnN0IGluZGV4ID0gbWFwcGluZ0luZGV4KG1hcHBpbmcpXG4gIGlmICghaW5kZXguc3ltYm9sU3BhbnMuaGFzKHN5bWJvbElkKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgc3ltYm9sOiAke3N5bWJvbElkfWApXG5cbiAgcmV0dXJuIFsuLi4oaW5kZXguc3ltYm9sU3BhbnMuZ2V0KHN5bWJvbElkKSA/PyBbXSldXG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIHZhbGlkYXRlZCByaWNoIG1hcHBpbmcgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gQ2Fub25pY2FsIHByZXR0eSBKU09OIHdpdGggb25lIHRyYWlsaW5nIExGLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5TWFwcGluZyhtYXBwaW5nKSB7XG4gIG1hcHBpbmdJbmRleChtYXBwaW5nKVxuXG4gIHJldHVybiBgJHtKU09OLnN0cmluZ2lmeShzb3J0SnNvbihtYXBwaW5nKSwgbnVsbCwgMil9XFxuYFxufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgcmljaCBtYXBwaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcmlhbGl6ZWQgLSBNYXBwaW5nIEpTT04uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IFBhcnNlZCBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXBwaW5nKHNlcmlhbGl6ZWQpIHtcbiAgY29uc3QgbWFwcGluZyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpXG5cbiAgcmV0dXJuIGZpbmFsaXplTWFwcGluZyhtYXBwaW5nKVxufVxuXG4vKipcbiAqIENvbXBvc2VzIGFuIG91dGVyIHJpY2ggbWFwIHRocm91Z2ggYW4gaW5uZXIgcmljaCBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBvdXRlciAtIEZpbmFsIG91dHB1dCB0byBpbnRlcm1lZGlhdGUgbWFwLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gaW5uZXIgLSBJbnRlcm1lZGlhdGUgdG8gb3JpZ2luYWwgbWFwLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBDb21wb3NlZCByaWNoIG1hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VNYXBwaW5ncyhvdXRlciwgaW5uZXIpIHtcbiAgY29uc3Qgb3V0ZXJJbmRleCA9IG1hcHBpbmdJbmRleChvdXRlcilcblxuICBtYXBwaW5nSW5kZXgoaW5uZXIpXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IGlubmVyLnNvdXJjZXMubWFwKChzb3VyY2UpID0+ICh7Li4uc291cmNlfSkpXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gc291cmNlLmlkKSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBvdXRlclNvdXJjZUlkcyA9IG5ldyBNYXAoKVxuICBsZXQgbmV4dFNvdXJjZUluZGV4ID0gMFxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIG91dGVyLnNvdXJjZXMpIHtcbiAgICBpZiAoc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGlubmVyLmdlbmVyYXRlZCkpIGNvbnRpbnVlXG4gICAgcmV0YWluT3V0ZXJTb3VyY2Uoc291cmNlLmlkKVxuICB9XG5cbiAgY29uc3Qgc3BhbnMgPSBvdXRlci5zcGFucy5mbGF0TWFwKChzcGFuKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiB0cmFjZVJlbGF0ZWRPcmlnaW4+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0cmFjZVxuXG4gICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgdHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcbiAgICAgIGlmICh0cmFjZT8udHJhY2VkKSBicmVha1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbiA9IHRyYWNlPy5yZWxhdGVkLmxvY2F0aW9uXG4gICAgY29uc3Qgb3ZlcmxhcHBpbmcgPSB0cmFjZT8ub3ZlcmxhcHBpbmcgPz8gW11cbiAgICBjb25zdCB0cmFjZWQgPSB0cmFjZT8udHJhY2VkXG5cbiAgICBpZiAoIXRyYWNlZCkge1xuICAgICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgICBjb25zdCByZWxhdGVkVHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcblxuICAgICAgICBpZiAocmVsYXRlZFRyYWNlICYmIGlzR2VuZXJhdGVkRW9mUG9pbnQocmVsYXRlZCkpIHJldGFpbk91dGVyU291cmNlKHJlbGF0ZWQuc291cmNlSWQpXG4gICAgICB9XG4gICAgICBjb25zdCB1bmlkZW50aWZpZWQgPSB7Li4uc3Bhbn1cblxuICAgICAgZGVsZXRlIHVuaWRlbnRpZmllZC5ub2RlSWRcbiAgICAgIGRlbGV0ZSB1bmlkZW50aWZpZWQuc3ltYm9sSWRcblxuICAgICAgcmV0dXJuIFt7Li4udW5pZGVudGlmaWVkLCBvcmlnaW46IHJlbWFwT3JpZ2luU291cmNlSWRzKHNwYW4ub3JpZ2luLCBvdXRlclNvdXJjZUlkcyl9XVxuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZFJlbGF0ZWQgPSB0cmFjZT8ucmVsYXRlZFxuXG4gICAgaWYgKCFzZWxlY3RlZFJlbGF0ZWQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW50ZXJtZWRpYXRlIHRyYWNlIHNlbGVjdGlvbiBpcyBtaXNzaW5nIGl0cyByZWxhdGVkIG9yaWdpbi5cIilcblxuICAgIGlmIChsb2NhdGlvbiAmJiBvdmVybGFwcGluZy5sZW5ndGggPiAxICYmIHNwYW4ubWFwcGluZ0tpbmQgPT0gXCJleGFjdFwiICYmXG4gICAgICBzcGFuLmdlbmVyYXRlZC5lbmQub2Zmc2V0IC0gc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ID09IGxvY2F0aW9uLmVuZC5vZmZzZXQgLSBsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgIHJldHVybiBvdmVybGFwcGluZy5tYXAoKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBvdmVybGFwU3RhcnQgPSBNYXRoLm1heChsb2NhdGlvbi5zdGFydC5vZmZzZXQsIGNhbmRpZGF0ZS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KVxuICAgICAgICBjb25zdCBvdmVybGFwRW5kID0gTWF0aC5taW4obG9jYXRpb24uZW5kLm9mZnNldCwgY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0KVxuICAgICAgICBjb25zdCBnZW5lcmF0ZWRTdGFydCA9IHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCArIG92ZXJsYXBTdGFydCAtIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldFxuICAgICAgICBjb25zdCBnZW5lcmF0ZWRFbmQgPSBzcGFuLmdlbmVyYXRlZC5zdGFydC5vZmZzZXQgKyBvdmVybGFwRW5kIC0gbG9jYXRpb24uc3RhcnQub2Zmc2V0XG4gICAgICAgIGNvbnN0IHByZXNlcnZlc1dob2xlT3JpZ2luID0gb3ZlcmxhcFN0YXJ0ID09IGNhbmRpZGF0ZS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICYmIG92ZXJsYXBFbmQgPT0gY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2VkU3BhbihzcGFuLCBjYW5kaWRhdGUsIGxvY2F0aW9uRnJvbU9mZnNldHMoXG4gICAgICAgICAgb3V0ZXIuZ2VuZXJhdGVkLmZpbGVuYW1lLFxuICAgICAgICAgIG91dGVyLmdlbmVyYXRlZC5jb250ZW50LFxuICAgICAgICAgIGdlbmVyYXRlZFN0YXJ0LFxuICAgICAgICAgIGdlbmVyYXRlZEVuZFxuICAgICAgICApLCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiwgc2VsZWN0ZWRSZWxhdGVkLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiA9IEJvb2xlYW4obG9jYXRpb24gJiYgbG9jYXRpb24uc3RhcnQub2Zmc2V0ID09IHRyYWNlZC5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ICYmXG4gICAgICBsb2NhdGlvbi5lbmQub2Zmc2V0ID09IHRyYWNlZC5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICBjb25zdCBjb21wb3NlZCA9IGNvbXBvc2VkU3BhbihzcGFuLCB0cmFjZWQsIHNwYW4uZ2VuZXJhdGVkLCBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiwgc2VsZWN0ZWRSZWxhdGVkKVxuXG4gICAgaWYgKHNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIiAmJiBvdmVybGFwcGluZy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBvcmlnaW5zID0gY29tcG9zZVJlbGF0ZWRPcmlnaW5zKFtzZWxlY3RlZFJlbGF0ZWRdLCBzZWxlY3RlZFJlbGF0ZWQsIHRyYWNlZCwgZmFsc2UpXG5cbiAgICAgIGlmIChvcmlnaW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFt7Li4uY29tcG9zZWQsIG1hcHBpbmdLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJhbmNob3JcIiksIG9yaWdpbjoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImRlcml2ZWRcIiksXG4gICAgICAgICAgb3JpZ2luc1xuICAgICAgICB9fV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2NvbXBvc2VkXVxuICB9KVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBnZW5lcmF0ZWQ6IG91dGVyLmdlbmVyYXRlZCxcbiAgICBub2RlczogaW5uZXIubm9kZXMsXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkTWFwcGluZ1wiLFxuICAgIHNvdXJjZXMsXG4gICAgc3BhbnMsXG4gICAgc3ltYm9sczogaW5uZXIuc3ltYm9scyxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgLyoqXG4gICAqIENvbXBvc2VzIG9uZSBvdXRlciBnZW5lcmF0ZWQgcmFuZ2Ugd2l0aCBhbiBpbm5lciByYW5nZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IG91dGVyU3BhbiAtIE91dGVyIHNwYW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBpbm5lclNwYW4gLSBJbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEZpbmFsIGdlbmVyYXRlZCBzdWJyYW5nZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBwcmVzZXJ2ZXNXaG9sZU9yaWdpbiAtIFdoZXRoZXIgYWRvcHRpbmcgdGhlIGlubmVyIG9yaWdpbiByZXRhaW5zIGl0cyBjb21wbGV0ZSByYW5nZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHNlbGVjdGVkUmVsYXRlZCAtIE91dGVyIG9yaWdpbiB0cmFjZWQgdGhyb3VnaCB0aGlzIGlubmVyIHNwYW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc3RyaWN0U2VsZWN0ZWRUcmFjZV0gLSBXaGV0aGVyIGFuIGV4YWN0IHNwbGl0IHNlbGVjdHMgb25seSB0aGlzIGlubmVyIHNwYW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IENvbXBvc2VkIHNwYW4uXG4gICAqL1xuICBmdW5jdGlvbiBjb21wb3NlZFNwYW4ob3V0ZXJTcGFuLCBpbm5lclNwYW4sIGdlbmVyYXRlZCwgcHJlc2VydmVzV2hvbGVPcmlnaW4sIHNlbGVjdGVkUmVsYXRlZCwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlID0gZmFsc2UpIHtcbiAgICBpZiAob3V0ZXJTcGFuLm1hcHBpbmdLaW5kID09IFwic3ludGhldGljXCIgJiYgb3V0ZXJTcGFuLm9yaWdpbi5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIHJldHVybiBkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICAgIGdlbmVyYXRlZCxcbiAgICAgICAgbWFwcGluZ0tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgbmFtZTogb3V0ZXJTcGFuLm5hbWUsXG4gICAgICAgIG9yaWdpbjoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgICByZWFzb246IG91dGVyU3Bhbi5vcmlnaW4ucmVhc29uLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5yZWxhdGVkT3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBpbm5lclNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSlcbiAgICAgICAgfSxcbiAgICAgICAgcm9sZTogb3V0ZXJTcGFuLnJvbGVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9zZWREZXJpdmVkT3JpZ2lucyA9IG91dGVyU3Bhbi5vcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIlxuICAgICAgPyBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5vcmlnaW5zLCBzZWxlY3RlZFJlbGF0ZWQsIGlubmVyU3BhbiwgcmVzdHJpY3RTZWxlY3RlZFRyYWNlKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIiA/IGlubmVyU3Bhbi5vcmlnaW4gOiBvdXRlclNwYW4ub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCJcbiAgICAgID8gY29tcG9zZWREZXJpdmVkT3JpZ2lucz8ubGVuZ3RoID09IDAgJiYgaW5uZXJTcGFuLm9yaWdpbi5raW5kID09IFwic3ludGhldGljXCJcbiAgICAgICAgPyBpbm5lclNwYW4ub3JpZ2luXG4gICAgICAgIDoge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImRlcml2ZWRcIiksIG9yaWdpbnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119ICovIChjb21wb3NlZERlcml2ZWRPcmlnaW5zKX1cbiAgICAgIDoge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgICByZWFzb246IG91dGVyU3Bhbi5vcmlnaW4ucmVhc29uLFxuICAgICAgICAgIHJlbGF0ZWRPcmlnaW5zOiBjb21wb3NlUmVsYXRlZE9yaWdpbnMob3V0ZXJTcGFuLm9yaWdpbi5yZWxhdGVkT3JpZ2lucywgc2VsZWN0ZWRSZWxhdGVkLCBpbm5lclNwYW4sIHJlc3RyaWN0U2VsZWN0ZWRUcmFjZSlcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgIC4uLm91dGVyU3BhbixcbiAgICAgIGdlbmVyYXRlZCxcbiAgICAgIG1hcHBpbmdLaW5kOiBpbm5lclNwYW4ubWFwcGluZ0tpbmQgPT0gXCJzeW50aGV0aWNcIiA/IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSA6XG4gICAgICAgIG91dGVyU3Bhbi5tYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgaW5uZXJTcGFuLm1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJiBwcmVzZXJ2ZXNXaG9sZU9yaWdpblxuICAgICAgICAgID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZXhhY3RcIilcbiAgICAgICAgICA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImFuY2hvclwiKSxcbiAgICAgIG5hbWU6IG91dGVyU3Bhbi5uYW1lID8/IGlubmVyU3Bhbi5uYW1lLFxuICAgICAgbm9kZUlkOiBpbm5lclNwYW4ubm9kZUlkLFxuICAgICAgb3JpZ2luLFxuICAgICAgcm9sZTogaW5uZXJTcGFuLnJvbGUgPz8gb3V0ZXJTcGFuLnJvbGUsXG4gICAgICBzeW1ib2xJZDogaW5uZXJTcGFuLnN5bWJvbElkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgaW5uZXIgc3BhbiBzZWxlY3RlZCBieSBvbmUgcmVsYXRlZCBpbnRlcm1lZGlhdGUgb3JpZ2luLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIE91dGVyIHJlbGF0ZWQgb3JpZ2luLlxuICAgKiBAcmV0dXJucyB7e1xuICAgKiAgIG92ZXJsYXBwaW5nOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXSxcbiAgICogICByZWxhdGVkOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW4sXG4gICAqICAgdHJhY2VkOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW4gfCB1bmRlZmluZWRcbiAgICogfSB8IHVuZGVmaW5lZH0gVHJhY2Ugc2VsZWN0aW9uIHdoZW4gdGhlIHJlbGF0ZWQgc291cmNlIGlzIHRoZSBpbnRlcm1lZGlhdGUgYXJ0aWZhY3QuXG4gICAqL1xuICBmdW5jdGlvbiB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IG91dGVySW5kZXguc291cmNlc0J5SWQuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG5cbiAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGlubmVyLmdlbmVyYXRlZCkpIHJldHVybiB1bmRlZmluZWRcbiAgICBjb25zdCBvdmVybGFwcGluZyA9IHNwYW5zT3ZlcmxhcHBpbmdHZW5lcmF0ZWQoaW5uZXIuc3BhbnMsIHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0LCByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgb3ZlcmxhcHBpbmcsXG4gICAgICByZWxhdGVkLFxuICAgICAgdHJhY2VkOiBvdmVybGFwcGluZ1swXSA/PyBzcGFuRm9yR2VuZXJhdGVkKGlubmVyLnNwYW5zLCByZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2VzIGludGVybWVkaWF0ZSByZWxhdGVkIG9yaWdpbnMgYW5kIHJlbWFwcyB1bnJlbGF0ZWQgc291cmNlIGlkZW50aXRpZXMgaW4gb3JkZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3V0ZXIgcmVsYXRlZCBvcmlnaW5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gc2VsZWN0ZWRSZWxhdGVkIC0gT3JpZ2luIHVzaW5nIHRoZSBzZWxlY3RlZCBpbm5lciBzcGFuLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbn0gc2VsZWN0ZWRTcGFuIC0gU2VsZWN0ZWQgaW5uZXIgc3Bhbi5cbiAgICogQHBhcmFtIHtib29sZWFufSByZXN0cmljdFNlbGVjdGVkVHJhY2UgLSBXaGV0aGVyIGFuIGV4YWN0IHNwbGl0IHNlbGVjdHMgb25seSB0aGUgc3VwcGxpZWQgc3Bhbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBDb21wb3NlZCByZWxhdGVkIG9yaWdpbnMuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wb3NlUmVsYXRlZE9yaWdpbnMocmVsYXRlZE9yaWdpbnMsIHNlbGVjdGVkUmVsYXRlZCwgc2VsZWN0ZWRTcGFuLCByZXN0cmljdFNlbGVjdGVkVHJhY2UpIHtcbiAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnMuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3V0ZXJJbmRleC5zb3VyY2VzQnlJZC5nZXQocmVsYXRlZC5zb3VyY2VJZClcblxuICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZVJlcHJlc2VudHNHZW5lcmF0ZWQoc291cmNlLCBpbm5lci5nZW5lcmF0ZWQpKSB7XG4gICAgICAgIHJldHVybiBbcmVtYXBSZWxhdGVkT3JpZ2luU291cmNlSWQocmVsYXRlZCwgb3V0ZXJTb3VyY2VJZHMpXVxuICAgICAgfVxuICAgICAgY29uc3QgdHJhY2UgPSB0cmFjZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZClcbiAgICAgIGNvbnN0IHRyYWNlZFNwYW5zID0gcmVzdHJpY3RTZWxlY3RlZFRyYWNlICYmIHJlbGF0ZWQgPT09IHNlbGVjdGVkUmVsYXRlZFxuICAgICAgICA/IFtzZWxlY3RlZFNwYW5dXG4gICAgICAgIDogdHJhY2U/Lm92ZXJsYXBwaW5nLmxlbmd0aFxuICAgICAgICAgID8gdHJhY2Uub3ZlcmxhcHBpbmdcbiAgICAgICAgICA6IHRyYWNlPy50cmFjZWQgPyBbdHJhY2UudHJhY2VkXSA6IFtdXG5cbiAgICAgIGlmICh0cmFjZWRTcGFucy5sZW5ndGggPT0gMCkge1xuICAgICAgICBpZiAoIWlzR2VuZXJhdGVkRW9mUG9pbnQocmVsYXRlZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmFibGUgdG8gdHJhY2UgaW50ZXJtZWRpYXRlIG9yaWdpbiAnJHtyZWxhdGVkLmxvY2F0aW9uLmZpbGVuYW1lfScuYClcbiAgICAgICAgcmV0YWluT3V0ZXJTb3VyY2UocmVsYXRlZC5zb3VyY2VJZClcblxuICAgICAgICByZXR1cm4gW3JlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIG91dGVyU291cmNlSWRzKV1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYWNlZFNwYW5zLmZsYXRNYXAoKHRyYWNlZFNwYW4pID0+IHJlbGF0ZWRPcmlnaW5zRm9yU3Bhbih0cmFjZWRTcGFuKS5tYXAoKHRyYWNlZFJlbGF0ZWQpID0+IGRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAuLi50cmFjZWRSZWxhdGVkLFxuICAgICAgICAgIG5vZGVJZDogdHJhY2VkUmVsYXRlZC5ub2RlSWQgPz8gdHJhY2VkU3Bhbi5ub2RlSWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IHRyYWNlZFJlbGF0ZWQucm9sZSxcbiAgICAgICAgICBzeW1ib2xJZDogdHJhY2VkUmVsYXRlZC5zeW1ib2xJZCA/PyB0cmFjZWRTcGFuLnN5bWJvbElkXG4gICAgICAgIH0pKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbnMgb25lIG91dGVyIHNvdXJjZSB0aGF0IHN1cnZpdmVzIGNvbXBvc2l0aW9uIGFuZCBhc3NpZ25zIGl0cyBjb21wb3NlZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUlkIC0gT3V0ZXIgc291cmNlIHJlZ2lzdHJ5IGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHJldGFpbk91dGVyU291cmNlKHNvdXJjZUlkKSB7XG4gICAgaWYgKG91dGVyU291cmNlSWRzLmhhcyhzb3VyY2VJZCkpIHJldHVyblxuICAgIGNvbnN0IHNvdXJjZSA9IG91dGVySW5kZXguc291cmNlc0J5SWQuZ2V0KHNvdXJjZUlkKVxuXG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIG91dGVyIG1hcHBpbmcgc291cmNlICcke3NvdXJjZUlkfScuYClcbiAgICBsZXQgY29tcG9zZWRTb3VyY2UgPSBzb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gc2FtZVJlZ2lzdGVyZWRTb3VyY2UoY2FuZGlkYXRlLCBzb3VyY2UpKVxuXG4gICAgaWYgKCFjb21wb3NlZFNvdXJjZSkge1xuICAgICAgd2hpbGUgKHNvdXJjZUlkcy5oYXMoYHNvdXJjZToke25leHRTb3VyY2VJbmRleH1gKSkgbmV4dFNvdXJjZUluZGV4KytcbiAgICAgIGNvbXBvc2VkU291cmNlID0gey4uLnNvdXJjZSwgaWQ6IGBzb3VyY2U6JHtuZXh0U291cmNlSW5kZXh9YH1cbiAgICAgIHNvdXJjZUlkcy5hZGQoY29tcG9zZWRTb3VyY2UuaWQpXG4gICAgICBzb3VyY2VzLnB1c2goY29tcG9zZWRTb3VyY2UpXG4gICAgfVxuICAgIG91dGVyU291cmNlSWRzLnNldChzb3VyY2UuaWQsIGNvbXBvc2VkU291cmNlLmlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIHdoZXRoZXIgb25lIGludGVybWVkaWF0ZSBvcmlnaW4gaXMgdGhlIGV4YWN0IHBvaW50IGFmdGVyIGFsbCBnZW5lcmF0ZWQgY29kZSB1bml0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBDYW5kaWRhdGUgaW50ZXJtZWRpYXRlIG9yaWdpbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyBhbiBFT0YgcG9pbnQgcmF0aGVyIHRoYW4gYSBnZW5lcmF0ZWQgaGFsZi1vcGVuIHJhbmdlLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNHZW5lcmF0ZWRFb2ZQb2ludChyZWxhdGVkKSB7XG4gICAgcmV0dXJuIHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0ID09IGlubmVyLmdlbmVyYXRlZC5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0ID09IGlubmVyLmdlbmVyYXRlZC5jb250ZW50Lmxlbmd0aFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIG1hcHBlZCBzcGFuJ3MgY2xvc2VkIG9yaWdpbiBpbnRvIHJlbGF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBzcGFuIC0gVHJhY2VkIGlubmVyIHNwYW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvclNwYW4oc3Bhbikge1xuICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4oc3Bhbi5vcmlnaW4pXG59XG5cbi8qKlxuICogUmV0dXJucyBldmVyeSByZWxhdGVkIHJhbmdlIGluIG9uZSBjbG9zZWQgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBSZWxhdGVkIHJhbmdlcyBpbiBzZW1hbnRpYyBvcmRlci5cbiAqL1xuZnVuY3Rpb24gcmVsYXRlZE9yaWdpbnNGb3JPcmlnaW4ob3JpZ2luKSB7XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSByZXR1cm4gW3tsb2NhdGlvbjogb3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VJZDogb3JpZ2luLnNvdXJjZUlkfV1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNcblxuICByZXR1cm4gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVnaXN0ZXJlZCBzb3VyY2UgaXMgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdCBjb25zdW1lZCBieSBhbiBpbm5lciBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gT3V0ZXIgc291cmNlIHJlZ2lzdHJ5IGVudHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gSW5uZXIgZ2VuZXJhdGVkIGFydGlmYWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaWRlbnRpdHktc2VsZWN0ZWQgcHJvdmVuYW5jZSBtYXkgYmUgdHJhY2VkIHRocm91Z2ggdGhlIGlubmVyIG1hcC5cbiAqL1xuZnVuY3Rpb24gc291cmNlUmVwcmVzZW50c0dlbmVyYXRlZChzb3VyY2UsIGdlbmVyYXRlZCkge1xuICByZXR1cm4gc291cmNlLmZpbGVuYW1lID09IGdlbmVyYXRlZC5maWxlbmFtZSAmJiBzb3VyY2UuY29udGVudCA9PSBnZW5lcmF0ZWQuY29udGVudCAmJlxuICAgIChzb3VyY2UubGFuZ3VhZ2UgPT0gbnVsbCB8fCBzb3VyY2UubGFuZ3VhZ2UgPT0gZ2VuZXJhdGVkLmxhbmd1YWdlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIGNvbXBsZXRlIHJlZ2lzdGVyZWQtc291cmNlIGlkZW50aXR5IGZpZWxkcyBvdGhlciB0aGFuIHJlZ2lzdHJ5LWxvY2FsIElELlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IGxlZnQgLSBGaXJzdCByZWdpc3RlcmVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSByaWdodCAtIFNlY29uZCByZWdpc3RlcmVkIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGJvdGggZW50cmllcyByZXByZXNlbnQgdGhlIHNhbWUgc291cmNlIGFydGlmYWN0LlxuICovXG5mdW5jdGlvbiBzYW1lUmVnaXN0ZXJlZFNvdXJjZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdC5maWxlbmFtZSA9PSByaWdodC5maWxlbmFtZSAmJiBsZWZ0LmNvbnRlbnQgPT0gcmlnaHQuY29udGVudCAmJiBsZWZ0Lmxhbmd1YWdlID09IHJpZ2h0Lmxhbmd1YWdlXG59XG5cbi8qKlxuICogQ29tcG9zZXMgU291cmNlIE1hcCB2MyBtYXBzIHdpdGggbWFpbnRhaW5lZCB0cmFjaW5nIG1hY2hpbmVyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBJbnB1dH0gb3V0ZXIgLSBGaW5hbCBvdXRwdXQgdG8gaW50ZXJtZWRpYXRlIG1hcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiKS5Tb3VyY2VNYXBJbnB1dH0gaW5uZXIgLSBJbnRlcm1lZGlhdGUgdG8gb3JpZ2luYWwgbWFwLlxuICogQHJldHVybnMge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9IENvbXBvc2VkIHYzIG1hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VTb3VyY2VNYXBzKG91dGVyLCBpbm5lcikge1xuICBjb25zdCBvdXRlck1hcCA9IG5ldyBUcmFjZU1hcChvdXRlcilcbiAgY29uc3QgaW5uZXJNYXAgPSBuZXcgVHJhY2VNYXAoaW5uZXIpXG4gIGNvbnN0IGNvbXBvc2VkID0gbmV3IEdlbk1hcHBpbmcoe2ZpbGU6IG91dGVyTWFwLmZpbGV9KVxuICBjb25zdCBpbnRlcm1lZGlhdGVJbmRleGVzID0gdHlwZW9mIGlubmVyTWFwLmZpbGUgPT0gXCJzdHJpbmdcIlxuICAgID8gb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzLmZsYXRNYXAoKHNvdXJjZSwgaW5kZXgpID0+IHNvdXJjZSA9PSBpbm5lck1hcC5maWxlID8gW2luZGV4XSA6IFtdKVxuICAgIDogW11cbiAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXggPSBpbnRlcm1lZGlhdGVJbmRleGVzLmxlbmd0aCA9PSAxID8gaW50ZXJtZWRpYXRlSW5kZXhlc1swXSA6IHVuZGVmaW5lZFxuICBjb25zdCBpbnRlcm1lZGlhdGVTb3VyY2UgPSBpbnRlcm1lZGlhdGVJbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzW2ludGVybWVkaWF0ZUluZGV4XVxuXG4gIGlubmVyTWFwLnNvdXJjZXMuZm9yRWFjaCgocmF3U291cmNlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IGlubmVyTWFwLnJlc29sdmVkU291cmNlc1tpbmRleF0gPz8gcmF3U291cmNlXG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHNldFNvdXJjZUNvbnRlbnQoY29tcG9zZWQsIHNvdXJjZSwgaW5uZXJNYXAuc291cmNlc0NvbnRlbnQ/LltpbmRleF0gPz8gbnVsbClcbiAgfSlcbiAgb3V0ZXJNYXAuc291cmNlcy5mb3JFYWNoKChyYXdTb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gb3V0ZXJNYXAucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyByYXdTb3VyY2VcblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBpbmRleCAhPSBpbnRlcm1lZGlhdGVJbmRleCkge1xuICAgICAgc2V0U291cmNlQ29udGVudChjb21wb3NlZCwgc291cmNlLCBvdXRlck1hcC5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsKVxuICAgIH1cbiAgfSlcblxuICBlYWNoTWFwcGluZyhvdXRlck1hcCwgKG1hcHBpbmcpID0+IHtcbiAgICBpZiAobWFwcGluZy5zb3VyY2UgPT0gbnVsbCB8fCBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gbnVsbCkge1xuICAgICAgbWF5YmVBZGRTZWdtZW50KGNvbXBvc2VkLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUgLSAxLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGlzSW50ZXJtZWRpYXRlID0gaW50ZXJtZWRpYXRlU291cmNlICE9PSB1bmRlZmluZWQgJiYgbWFwcGluZy5zb3VyY2UgPT0gaW50ZXJtZWRpYXRlU291cmNlXG4gICAgY29uc3QgdHJhY2VkID0gaXNJbnRlcm1lZGlhdGVcbiAgICAgID8gdHJhY2VPcmlnaW5hbFBvc2l0aW9uRm9yKGlubmVyTWFwLCB7Y29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLCBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZX0pXG4gICAgICA6IHtjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLCBuYW1lOiBtYXBwaW5nLm5hbWUsIHNvdXJjZTogbWFwcGluZy5zb3VyY2V9XG5cbiAgICBpZiAodHJhY2VkLnNvdXJjZSA9PSBudWxsIHx8IHRyYWNlZC5saW5lID09IG51bGwgfHwgdHJhY2VkLmNvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXliZUFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGlzSW50ZXJtZWRpYXRlID8gc291cmNlQ29udGVudEZvcihpbm5lck1hcCwgdHJhY2VkLnNvdXJjZSkgOiBzb3VyY2VDb250ZW50Rm9yKG91dGVyTWFwLCB0cmFjZWQuc291cmNlKVxuICAgIGNvbnN0IG5hbWUgPSB0cmFjZWQubmFtZSA/PyBtYXBwaW5nLm5hbWVcblxuICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgIGFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLCB0cmFjZWQuc291cmNlLCB0cmFjZWQubGluZSAtIDEsIHRyYWNlZC5jb2x1bW4sIG51bGwsIGNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFNlZ21lbnQoY29tcG9zZWQsIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAtIDEsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLCB0cmFjZWQuc291cmNlLCB0cmFjZWQubGluZSAtIDEsIHRyYWNlZC5jb2x1bW4sIG5hbWUsIGNvbnRlbnQpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0b0VuY29kZWRNYXAoY29tcG9zZWQpXG59XG5cbi8qKlxuICogSW1wb3J0cyBhIHBvaW50LWJhc2VkIFNvdXJjZSBNYXAgdjMgYXMgYSByYW5nZS1iYXNlZCBTZW1hbnRpZm9sZCBtYXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuU291cmNlTWFwSW5wdXR9IHNvdXJjZU1hcCAtIFNvdXJjZSBNYXAgdjMuXG4gKiBAcGFyYW0ge29iamVjdH0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gZ2VuZXJhdGVkLmNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgY29udGVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBnZW5lcmF0ZWQuZmlsZW5hbWUgLSBHZW5lcmF0ZWQgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gZ2VuZXJhdGVkLmxhbmd1YWdlIC0gR2VuZXJhdGVkIGxhbmd1YWdlLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW2dlbmVyYXRlZC5zb3VyY2VzXSAtIEV4YWN0IHNvdXJjZSBjb250ZW50IG92ZXJyaWRlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gSW1wb3J0ZWQgcmljaCBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBwaW5nRnJvbVNvdXJjZU1hcChzb3VyY2VNYXAsIHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2UsIHNvdXJjZXM6IHByb3ZpZGVkID0gW119KSB7XG4gIGNvbnN0IHRyYWNlID0gbmV3IFRyYWNlTWFwKHNvdXJjZU1hcClcbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoY29udGVudClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IFtdXG4gIC8qKiBAdHlwZSB7TWFwPG51bWJlciwge2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9Pn0gKi9cbiAgY29uc3Qgb3ZlcnJpZGVzQnlTb3VyY2VJbmRleCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgcHJvdmlkZWQpIHtcbiAgICBjb25zdCBleGFjdCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2UgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgfHwgcmVzb2x2ZWQgPT0gb3ZlcnJpZGUuZmlsZW5hbWUgPyBbaW5kZXhdIDogW11cbiAgICB9KVxuXG4gICAgaWYgKGV4YWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgZXhhY3QpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KGluZGV4LCBvdmVycmlkZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeCA9IHRyYWNlLnNvdXJjZXMuZmxhdE1hcCgoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cmFjZS5yZXNvbHZlZFNvdXJjZXNbaW5kZXhdXG5cbiAgICAgIHJldHVybiBzb3VyY2U/LmVuZHNXaXRoKGAvJHtvdmVycmlkZS5maWxlbmFtZX1gKSB8fCByZXNvbHZlZD8uZW5kc1dpdGgoYC8ke292ZXJyaWRlLmZpbGVuYW1lfWApID8gW2luZGV4XSA6IFtdXG4gICAgfSlcblxuICAgIGlmIChzdWZmaXgubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEFtYmlndW91cyBTb3VyY2UgTWFwIHNvdXJjZSBjb250ZW50IG92ZXJyaWRlICcke292ZXJyaWRlLmZpbGVuYW1lfScgbWF0Y2hlcyBtdWx0aXBsZSBzb3VyY2VzLmApXG4gICAgfVxuICAgIGlmIChzdWZmaXgubGVuZ3RoID09IDEgJiYgIW92ZXJyaWRlc0J5U291cmNlSW5kZXguaGFzKHN1ZmZpeFswXSkpIG92ZXJyaWRlc0J5U291cmNlSW5kZXguc2V0KHN1ZmZpeFswXSwgb3ZlcnJpZGUpXG4gIH1cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSAqL1xuICBjb25zdCBzb3VyY2VzQnlNYXBOYW1lID0gbmV3IE1hcCgpXG5cbiAgdHJhY2Uuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc29sdmVkU291cmNlID0gdHJhY2UucmVzb2x2ZWRTb3VyY2VzW2luZGV4XSA/PyBzb3VyY2VcbiAgICBjb25zdCBwcm92aWRlZFNvdXJjZSA9IG92ZXJyaWRlc0J5U291cmNlSW5kZXguZ2V0KGluZGV4KVxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSB7XG4gICAgICBjb250ZW50OiBwcm92aWRlZFNvdXJjZT8uY29udGVudCA/PyB0cmFjZS5zb3VyY2VzQ29udGVudD8uW2luZGV4XSA/PyBudWxsLFxuICAgICAgZmlsZW5hbWU6IHByb3ZpZGVkU291cmNlPy5maWxlbmFtZSA/PyByZXNvbHZlZFNvdXJjZSxcbiAgICAgIGlkOiBgc291cmNlOiR7c291cmNlcy5sZW5ndGh9YCxcbiAgICAgIGxhbmd1YWdlOiBwcm92aWRlZFNvdXJjZT8ubGFuZ3VhZ2UgPz8gbnVsbFxuICAgIH1cblxuICAgIHNvdXJjZXMucHVzaChyZWdpc3RlcmVkKVxuICAgIGlmICghc291cmNlc0J5TWFwTmFtZS5oYXMocmVzb2x2ZWRTb3VyY2UpKSBzb3VyY2VzQnlNYXBOYW1lLnNldChyZXNvbHZlZFNvdXJjZSwgcmVnaXN0ZXJlZClcbiAgfSlcbiAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBuZXcgTWFwKHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG4gICAgLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBjcmVhdGVDb29yZGluYXRlSW5kZXgoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXSkpXG5cbiAgLyoqIEB0eXBlIHt7Z2VuZXJhdGVkT2Zmc2V0OiBudW1iZXIsIG1hcHBpbmc6IGltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRWFjaE1hcHBpbmd9W119ICovXG4gIGNvbnN0IHBvaW50cyA9IFtdXG5cbiAgZWFjaE1hcHBpbmcodHJhY2UsIChtYXBwaW5nKSA9PiB7XG4gICAgcG9pbnRzLnB1c2goe2dlbmVyYXRlZE9mZnNldDogaW5kZXhlZE9mZnNldEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBtYXBwaW5nLmdlbmVyYXRlZExpbmUsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICsgMSksIG1hcHBpbmd9KVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IG1hcHBlZFNwYW5zID0gW11cblxuICBwb2ludHMuZm9yRWFjaCgoe2dlbmVyYXRlZE9mZnNldCwgbWFwcGluZ30sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHBvaW50c1tpbmRleCArIDFdXG4gICAgY29uc3QgZW5kID0gbmV4dD8ubWFwcGluZy5nZW5lcmF0ZWRMaW5lID09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgPyBuZXh0LmdlbmVyYXRlZE9mZnNldFxuICAgICAgOiBsaW5lRW5kT2Zmc2V0KGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldClcblxuICAgIGlmIChlbmQgPD0gZ2VuZXJhdGVkT2Zmc2V0KSByZXR1cm5cblxuICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PSBudWxsIHx8IG1hcHBpbmcub3JpZ2luYWxMaW5lID09IG51bGwgfHwgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBudWxsKSB7XG4gICAgICBtYXBwZWRTcGFucy5wdXNoKHtcbiAgICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBnZW5lcmF0ZWRPZmZzZXQsIGVuZCksXG4gICAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgICBvcmlnaW46IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwidW5tYXBwZWQgU291cmNlIE1hcCBzZWdtZW50XCIsIHJlbGF0ZWRPcmlnaW5zOiBbXX1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzQnlNYXBOYW1lLmdldChtYXBwaW5nLnNvdXJjZSlcblxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIE1hcCByZWZlcmVuY2VzIHVucmVnaXN0ZXJlZCBzb3VyY2UgJyR7bWFwcGluZy5zb3VyY2V9Jy5gKVxuICAgIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU291cmNlIGNvbnRlbnQgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IG1hcHBlZCBwb3NpdGlvbnMgZm9yICcke3NvdXJjZS5maWxlbmFtZX0nLmApXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxPZmZzZXQgPSBpbmRleGVkT2Zmc2V0QXQoXG4gICAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59ICovIChzb3VyY2VDb29yZGluYXRlcy5nZXQoc291cmNlLmlkKSksXG4gICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gKyAxXG4gICAgKVxuICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gTWF0aC5taW4oc291cmNlLmNvbnRlbnQubGVuZ3RoLCBvcmlnaW5hbE9mZnNldCArIDEpXG4gICAgY29uc3Qgb3JpZ2luYWxMb2NhdGlvbiA9IGxvY2F0aW9uRnJvbU9mZnNldHMoc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudCwgb3JpZ2luYWxPZmZzZXQsIG9yaWdpbmFsRW5kKVxuXG4gICAgbWFwcGVkU3BhbnMucHVzaChkZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGdlbmVyYXRlZE9mZnNldCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcImFuY2hvclwiLFxuICAgICAgbmFtZTogbWFwcGluZy5uYW1lID8/IHVuZGVmaW5lZCxcbiAgICAgIG9yaWdpbjoge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uOiBvcmlnaW5hbExvY2F0aW9uLCBzb3VyY2VJZDogc291cmNlLmlkfVxuICAgIH0pKVxuICB9KVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gIGNvbnN0IHNwYW5zID0gW11cbiAgbGV0IGN1cnNvciA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2YgbWFwcGVkU3BhbnMpIHtcbiAgICBpZiAoc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0ID4gY3Vyc29yKSBzcGFucy5wdXNoKHVubWFwcGVkU3BhbihjdXJzb3IsIHNwYW4uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCkpXG4gICAgaWYgKHNwYW4uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPiBjdXJzb3IpIHtcbiAgICAgIHNwYW5zLnB1c2goc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgY3Vyc29yID8ge1xuICAgICAgICAuLi5zcGFuLFxuICAgICAgICBnZW5lcmF0ZWQ6IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIGNvbnRlbnQsIGN1cnNvciwgc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldClcbiAgICAgIH0gOiBzcGFuKVxuICAgICAgY3Vyc29yID0gc3Bhbi5nZW5lcmF0ZWQuZW5kLm9mZnNldFxuICAgIH1cbiAgfVxuICBpZiAoY3Vyc29yIDwgY29udGVudC5sZW5ndGgpIHNwYW5zLnB1c2godW5tYXBwZWRTcGFuKGN1cnNvciwgY29udGVudC5sZW5ndGgpKVxuXG4gIHJldHVybiBmaW5hbGl6ZU1hcHBpbmcoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBnZW5lcmF0ZWQ6IHtjb250ZW50LCBmaWxlbmFtZSwgbGFuZ3VhZ2V9LFxuICAgIG5vZGVzOiBbXSxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgc291cmNlcyxcbiAgICBzcGFucyxcbiAgICBzeW1ib2xzOiBbXSxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb25lIGV4cGxpY2l0IHVubWFwcGVkIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBHZW5lcmF0ZWQgc3RhcnQgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gR2VuZXJhdGVkIGVuZCBvZmZzZXQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW59IFN5bnRoZXRpYyBzcGFuLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5tYXBwZWRTcGFuKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkOiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBjb250ZW50LCBzdGFydCwgZW5kKSxcbiAgICAgIG1hcHBpbmdLaW5kOiBcInN5bnRoZXRpY1wiLFxuICAgICAgb3JpZ2luOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBcInVubWFwcGVkIFNvdXJjZSBNYXAgcmFuZ2VcIiwgcmVsYXRlZE9yaWdpbnM6IFtdfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbWFwcyBhIGdlbmVyYXRlZCBsb2NhdGlvbiB3aGlsZSByZXRhaW5pbmcgdGhlIGdlbmVyYXRlZCByYW5nZSBpbiB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEdlbmVyYXRlZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBSaWNoIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2Ygb3JpZ2luYWxQb3NpdGlvbkZvcj59IFJlbWFwcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwTG9jYXRpb24obG9jYXRpb24sIG1hcHBpbmcpIHtcbiAgaWYgKGxvY2F0aW9uLmZpbGVuYW1lICE9IG1hcHBpbmcuZ2VuZXJhdGVkLmZpbGVuYW1lKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTG9jYXRpb24gaXMgbm90IGluICR7bWFwcGluZy5nZW5lcmF0ZWQuZmlsZW5hbWV9LmApXG5cbiAgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwcGluZywge29mZnNldDogbG9jYXRpb24uc3RhcnQub2Zmc2V0fSlcbn1cblxuLyoqXG4gKiBSZW1hcHMgYSBTZW1hbnRpZm9sZCBkaWFnbm9zdGljIGFuZCBwcmVzZXJ2ZXMgaXRzIGdlbmVyYXRlZCBsb2NhdGlvbiBhbmQgY2F1c2UuXG4gKiBAcGFyYW0ge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZGlhZ25vc3RpYyAtIEdlbmVyYXRlZC1wcm9ncmFtIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gUmljaCBtYXBwaW5nLlxuICogQHJldHVybnMge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gUmVtYXBwZWQgZGlhZ25vc3RpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwRGlhZ25vc3RpYyhkaWFnbm9zdGljLCBtYXBwaW5nKSB7XG4gIGlmICghZGlhZ25vc3RpYy5sb2NhdGlvbikgcmV0dXJuIGRpYWdub3N0aWNcblxuICBjb25zdCByZW1hcHBlZCA9IHJlbWFwTG9jYXRpb24oZGlhZ25vc3RpYy5sb2NhdGlvbiwgbWFwcGluZylcblxuICBpZiAoIXJlbWFwcGVkLmxvY2F0aW9uKSByZXR1cm4gZGlhZ25vc3RpY1xuXG4gIHJldHVybiBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZGlhZ25vc3RpYyxcbiAgICBjb2RlOiBkaWFnbm9zdGljLmNvZGUsXG4gICAgZ2VuZXJhdGVkTG9jYXRpb246IGRpYWdub3N0aWMubG9jYXRpb24sXG4gICAgbGFuZ3VhZ2U6IGRpYWdub3N0aWMubGFuZ3VhZ2UsXG4gICAgbG9jYXRpb246IHJlbWFwcGVkLmxvY2F0aW9uLFxuICAgIG1lc3NhZ2U6IGRpYWdub3N0aWMuZGV0YWlsXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwdWJsaWMgbWFwcGluZyBlbnZlbG9wZSBhbmQgb3JkZXJlZCBoYWxmLW9wZW4gZ2VuZXJhdGVkIHJhbmdlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbWFwcGluZy5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBOb3RoaW5nIHdoZW4gdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hcHBpbmcodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJzY2hlbWFcIikgIT0gXCJTZW1hbnRpZm9sZE1hcHBpbmdcIiB8fFxuICAgIFJlZmxlY3QuZ2V0KHZhbHVlLCBcInZlcnNpb25cIikgIT0gMSB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJjb29yZGluYXRlU3lzdGVtXCIpICE9IFwidXRmMTZcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIFNlbWFudGlmb2xkTWFwcGluZyB2MSB2YWx1ZS5cIilcbiAgfVxuXG4gIGNvbnN0IG1hcHBpbmcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG4gIGNvbnN0IGdlbmVyYXRlZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChtYXBwaW5nLmdlbmVyYXRlZClcbiAgY29uc3Qgc3BhbnMgPSBtYXBwaW5nLnNwYW5zXG5cbiAgaWYgKCFnZW5lcmF0ZWQgfHwgdHlwZW9mIGdlbmVyYXRlZCAhPSBcIm9iamVjdFwiIHx8IHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiZmlsZW5hbWVcIikgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiBSZWZsZWN0LmdldChnZW5lcmF0ZWQsIFwiY29udGVudFwiKSAhPSBcInN0cmluZ1wiIHx8ICFpc0xhbmd1YWdlKFJlZmxlY3QuZ2V0KGdlbmVyYXRlZCwgXCJsYW5ndWFnZVwiKSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShtYXBwaW5nLnNvdXJjZXMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkobWFwcGluZy5ub2RlcykgfHwgIUFycmF5LmlzQXJyYXkobWFwcGluZy5zeW1ib2xzKSB8fCAhQXJyYXkuaXNBcnJheShzcGFucykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIFNlbWFudGlmb2xkTWFwcGluZyB2MSBlbnZlbG9wZS5cIilcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGdlbmVyYXRlZC5jb250ZW50KVxuICBjb25zdCBmaWxlbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZ2VuZXJhdGVkLmZpbGVuYW1lKVxuXG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwiXFxyXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWZvbGRNYXBwaW5nIGdlbmVyYXRlZCBjb250ZW50IG11c3QgdXNlIExGIGxpbmUgZW5kaW5ncy5cIilcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBtYXBwaW5nLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIHNvdXJjZS5pZCAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pZC5sZW5ndGggPT0gMCB8fCBzb3VyY2VJZHMuaGFzKHNvdXJjZS5pZCkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UuZmlsZW5hbWUubGVuZ3RoID09IDAgfHwgc291cmNlLmNvbnRlbnQgIT09IG51bGwgJiYgdHlwZW9mIHNvdXJjZS5jb250ZW50ICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIHNvdXJjZS5sYW5ndWFnZSAhPT0gbnVsbCAmJiAhaXNMYW5ndWFnZShzb3VyY2UubGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBTZW1hbnRpZm9sZE1hcHBpbmcgc291cmNlLlwiKVxuICAgIH1cbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgfVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuICAgIC5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKV0pKVxuICBjb25zdCBzb3VyY2VzQnlJZCA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBzb3VyY2VdKSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXT59ICovXG4gIGNvbnN0IHNvdXJjZXNCeUZpbGVuYW1lID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbWFwcGluZy5zb3VyY2VzKSB7XG4gICAgY29uc3Qgc2FtZU5hbWUgPSBzb3VyY2VzQnlGaWxlbmFtZS5nZXQoc291cmNlLmZpbGVuYW1lKSA/PyBbXVxuXG4gICAgc2FtZU5hbWUucHVzaChzb3VyY2UpXG4gICAgc291cmNlc0J5RmlsZW5hbWUuc2V0KHNvdXJjZS5maWxlbmFtZSwgc2FtZU5hbWUpXG4gIH1cbiAgY29uc3QgZ2VuZXJhdGVkQ29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoY29udGVudClcblxuICBjb25zdCBub2RlSWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG5vZGVQYXRocyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXBwaW5nLm5vZGVzKSB7XG4gICAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9IFwib2JqZWN0XCIgfHwgdHlwZW9mIG5vZGUuaWQgIT0gXCJzdHJpbmdcIiB8fCBub2RlLmlkLmxlbmd0aCA9PSAwIHx8IG5vZGVJZHMuaGFzKG5vZGUuaWQpIHx8XG4gICAgICB0eXBlb2Ygbm9kZS5wYXRoICE9IFwic3RyaW5nXCIgfHwgbm9kZVBhdGhzLmhhcyhub2RlLnBhdGgpIHx8XG4gICAgICB0eXBlb2Ygbm9kZS5raW5kICE9IFwic3RyaW5nXCIgfHwgbm9kZS5raW5kLmxlbmd0aCA9PSAwIHx8ICFub2RlLm9yaWdpbiB8fCB0eXBlb2Ygbm9kZS5yYW5nZXMgIT0gXCJvYmplY3RcIiB8fFxuICAgICAgbm9kZS5yYW5nZXMgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShub2RlLnJhbmdlcykpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXCIpXG4gICAgbm9kZUlkcy5hZGQobm9kZS5pZClcbiAgICBub2RlUGF0aHMuYWRkKG5vZGUucGF0aClcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbElkcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc3ltYm9sIG9mIG1hcHBpbmcuc3ltYm9scykge1xuICAgIGlmICghc3ltYm9sIHx8IHR5cGVvZiBzeW1ib2wgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygc3ltYm9sLmlkICE9IFwic3RyaW5nXCIgfHwgc3ltYm9sLmlkLmxlbmd0aCA9PSAwIHx8IHN5bWJvbElkcy5oYXMoc3ltYm9sLmlkKSB8fFxuICAgICAgdHlwZW9mIHN5bWJvbC5uYW1lICE9IFwic3RyaW5nXCIgfHwgc3ltYm9sLm5hbWUubGVuZ3RoID09IDAgfHwgIVtcImZ1bmN0aW9uXCIsIFwicGFyYW1ldGVyXCIsIFwibG9jYWxcIl0uaW5jbHVkZXMoc3ltYm9sLmtpbmQpIHx8XG4gICAgICAhbm9kZUlkcy5oYXMoc3ltYm9sLmRlY2xhcmF0aW9uTm9kZUlkKSB8fCAhQXJyYXkuaXNBcnJheShzeW1ib2wucmVmZXJlbmNlcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cIilcbiAgICB9XG4gICAgc3ltYm9sSWRzLmFkZChzeW1ib2wuaWQpXG4gIH1cblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwcGluZy5ub2Rlcykge1xuICAgIHZhbGlkYXRlT3JpZ2luKG5vZGUub3JpZ2luLCBzb3VyY2VzQnlJZCwgc291cmNlQ29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcylcbiAgICBmb3IgKGNvbnN0IFtyb2xlLCBsb2NhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMobm9kZS5yYW5nZXMpKSB7XG4gICAgICBpZiAocm9sZS5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGljIG5vZGUgcmFuZ2Ugcm9sZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcbiAgICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKGxvY2F0aW9uLCBzb3VyY2VzQnlGaWxlbmFtZSwgc291cmNlQ29vcmRpbmF0ZXMpXG4gICAgfVxuICAgIGlmIChub2RlLnN5bWJvbElkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBub2RlLnN5bWJvbElkICE9IFwic3RyaW5nXCIgfHwgIXN5bWJvbElkcy5oYXMobm9kZS5zeW1ib2xJZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWMgbm9kZSByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sLlwiKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3ltYm9sIG9mIG1hcHBpbmcuc3ltYm9scykge1xuICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKHN5bWJvbC5sb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICBpZiAoIXJlZmVyZW5jZSB8fCB0eXBlb2YgcmVmZXJlbmNlICE9IFwib2JqZWN0XCIgfHwgIW5vZGVJZHMuaGFzKHJlZmVyZW5jZS5ub2RlSWQpIHx8XG4gICAgICAgICFbXCJkZWNsYXJhdGlvblwiLCBcInJlYWRcIiwgXCJ3cml0ZVwiLCBcImNhbGxcIl0uaW5jbHVkZXMocmVmZXJlbmNlLnJvbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc2VtYW50aWMgc3ltYm9sIHJlZmVyZW5jZS5cIilcbiAgICAgIH1cbiAgICAgIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2VzKHJlZmVyZW5jZS5sb2NhdGlvbiwgc291cmNlc0J5RmlsZW5hbWUsIHNvdXJjZUNvb3JkaW5hdGVzKVxuICAgIH1cbiAgfVxuXG4gIGxldCBwcmV2aW91c0VuZCA9IDBcblxuICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHtcbiAgICBpZiAoIXNwYW4gfHwgdHlwZW9mIHNwYW4gIT0gXCJvYmplY3RcIiB8fCAhW1wiZXhhY3RcIiwgXCJhbmNob3JcIiwgXCJzeW50aGV0aWNcIl0uaW5jbHVkZXMoUmVmbGVjdC5nZXQoc3BhbiwgXCJtYXBwaW5nS2luZFwiKSkgfHxcbiAgICAgICFSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSB8fCAhUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgU2VtYW50aWZvbGRNYXBwaW5nIHNwYW4uXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259ICovIChSZWZsZWN0LmdldChzcGFuLCBcImdlbmVyYXRlZFwiKSlcblxuICAgIGlmICghbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fCBsb2NhdGlvbi5maWxlbmFtZSAhPSBmaWxlbmFtZSB8fCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgIT0gcHJldmlvdXNFbmQgfHxcbiAgICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPD0gbG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPiBjb250ZW50Lmxlbmd0aCB8fFxuICAgICAgIXNhbWVQb2ludChpbmRleGVkUG9pbnRBdChnZW5lcmF0ZWRDb29yZGluYXRlcywgbG9jYXRpb24uc3RhcnQub2Zmc2V0KSwgbG9jYXRpb24uc3RhcnQpIHx8XG4gICAgICAhc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGdlbmVyYXRlZENvb3JkaW5hdGVzLCBsb2NhdGlvbi5lbmQub2Zmc2V0KSwgbG9jYXRpb24uZW5kKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGV4YWN0bHkgY292ZXIgb3JkZXJlZCBub3JtYWxpemVkIGdlbmVyYXRlZCByYW5nZXMuXCIpXG4gICAgfVxuICAgIHZhbGlkYXRlT3JpZ2luKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSAqLyAoUmVmbGVjdC5nZXQoc3BhbiwgXCJvcmlnaW5cIikpLFxuICAgICAgc291cmNlc0J5SWQsXG4gICAgICBzb3VyY2VDb29yZGluYXRlcyxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBzeW1ib2xJZHNcbiAgICApXG4gICAgY29uc3Qgbm9kZUlkID0gUmVmbGVjdC5nZXQoc3BhbiwgXCJub2RlSWRcIilcbiAgICBjb25zdCBzeW1ib2xJZCA9IFJlZmxlY3QuZ2V0KHNwYW4sIFwic3ltYm9sSWRcIilcblxuICAgIGlmIChub2RlSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG5vZGVJZCAhPSBcInN0cmluZ1wiIHx8ICFub2RlSWRzLmhhcyhub2RlSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgICBpZiAoc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHN5bWJvbElkICE9IFwic3RyaW5nXCIgfHwgIXN5bWJvbElkcy5oYXMoc3ltYm9sSWQpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sLlwiKVxuICAgIGlmIChSZWZsZWN0LmdldChzcGFuLCBcInJvbGVcIikgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgUmVmbGVjdC5nZXQoc3BhbiwgXCJyb2xlXCIpICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KHNwYW4sIFwibmFtZVwiKSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBSZWZsZWN0LmdldChzcGFuLCBcIm5hbWVcIikgIT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hcHBpbmcgc3BhbiByb2xlcyBhbmQgbmFtZXMgbXVzdCBiZSBzdHJpbmdzLlwiKVxuICAgIH1cbiAgICBwcmV2aW91c0VuZCA9IGxvY2F0aW9uLmVuZC5vZmZzZXRcbiAgfVxuXG4gIGlmIChwcmV2aW91c0VuZCAhPSBjb250ZW50Lmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGlmb2xkTWFwcGluZyBzcGFucyBtdXN0IGNvdmVyIGFsbCBnZW5lcmF0ZWQgY29udGVudC5cIilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMsIGZyZWV6ZXMsIGFuZCBpbmRleGVzIG9uZSBtYXBwaW5nIHByb2R1Y2VkIGF0IGEgdHJ1c3QgYm91bmRhcnkuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IEltbXV0YWJsZSBpbmRleGVkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU1hcHBpbmcodmFsdWUpIHtcbiAgLy8gUHJvZHVjZXJzIG1heSByZXRhaW4gcmVmZXJlbmNlcyB0byBtdXRhYmxlIHNlbWFudGljIGxvY2F0aW9uczsgbWFwcGluZ3Mgb3duIHRoZWlyIGltbXV0YWJsZSBjb3B5LlxuICBjb25zdCBtYXBwaW5nID0gc3RydWN0dXJlZENsb25lKHZhbHVlKVxuXG4gIHZhbGlkYXRlTWFwcGluZyhtYXBwaW5nKVxuICBmcmVlemVKc29uKG1hcHBpbmcpXG4gIG1hcHBpbmdJbmRleGVzLnNldChtYXBwaW5nLCBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSlcblxuICByZXR1cm4gbWFwcGluZ1xufVxuXG4vKipcbiAqIEdldHMgYW4gaW5kZXgsIHZhbGlkYXRpbmcgbXV0YWJsZSBjYWxsZXIgbWFwcGluZ3Mgb24gZXZlcnkgdHJ1c3QtYm91bmRhcnkgdXNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIE1hcHBpbmcuXG4gKiBAcmV0dXJucyB7TWFwcGluZ0luZGV4fSBMb29rdXAgaW5kZXguXG4gKi9cbmZ1bmN0aW9uIG1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGNhY2hlZCA9IG1hcHBpbmdJbmRleGVzLmdldChtYXBwaW5nKVxuXG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICB2YWxpZGF0ZU1hcHBpbmcobWFwcGluZylcblxuICByZXR1cm4gYnVpbGRNYXBwaW5nSW5kZXgobWFwcGluZylcbn1cblxuLyoqXG4gKiBCdWlsZHMgZ2VuZXJhdGVkLCBvcmlnaW5hbCwgbm9kZSwgYW5kIHN5bWJvbCBpbmRleGVzIGluIG9uZSBwYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIFZhbGlkYXRlZCBtYXBwaW5nLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRDb29yZGluYXRlczogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Piwgbm9kZVNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT4sIG9yaWdpbmFsQnlTb3VyY2U6IE1hcDxzdHJpbmcsIHtlbmQ6IG51bWJlciwgcHJlZml4RW5kOiBudW1iZXIsIHNwYW46IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3Bhbiwgc3RhcnQ6IG51bWJlcn1bXT4sIG9yaWdpbmFsUG9pbnRzQnlTb3VyY2U6IE1hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj4sIHNvdXJjZUNvb3JkaW5hdGVzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+Piwgc291cmNlc0J5SWQ6IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT4sIHN5bWJvbFNwYW5zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXT59fSBNYXBwaW5nIGluZGV4LlxuICovXG5mdW5jdGlvbiBidWlsZE1hcHBpbmdJbmRleChtYXBwaW5nKSB7XG4gIGNvbnN0IGdlbmVyYXRlZENvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQpXG4gIGNvbnN0IHNvdXJjZXNCeUlkID0gbmV3IE1hcChtYXBwaW5nLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuaWQsIHNvdXJjZV0pKVxuICBjb25zdCBzb3VyY2VDb29yZGluYXRlcyA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuICAgIC5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKV0pKVxuICBjb25zdCBub2RlU3BhbnMgPSBuZXcgTWFwKG1hcHBpbmcubm9kZXMubWFwKChub2RlKSA9PiBbbm9kZS5pZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi8gKFtdKV0pKVxuICBjb25zdCBzeW1ib2xTcGFucyA9IG5ldyBNYXAobWFwcGluZy5zeW1ib2xzLm1hcCgoc3ltYm9sKSA9PiBbc3ltYm9sLmlkLCAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSAqLyAoW10pXSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2VuZDogbnVtYmVyLCBwcmVmaXhFbmQ6IG51bWJlciwgc3BhbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBzdGFydDogbnVtYmVyfVtdPn0gKi9cbiAgY29uc3Qgb3JpZ2luYWxCeVNvdXJjZSA9IG5ldyBNYXAobWFwcGluZy5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBbc291cmNlLmlkLCBbXV0pKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIE1hcDxudW1iZXIsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbltdPj59ICovXG4gIGNvbnN0IG9yaWdpbmFsUG9pbnRzQnlTb3VyY2UgPSBuZXcgTWFwKG1hcHBpbmcuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5pZCwgbmV3IE1hcCgpXSkpXG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIG1hcHBpbmcuc3BhbnMpIHtcbiAgICBjb25zdCBzcGFuTm9kZUlkcyA9IG5ldyBTZXQoc3Bhbi5ub2RlSWQgPyBbc3Bhbi5ub2RlSWRdIDogW10pXG4gICAgY29uc3Qgc3BhblN5bWJvbElkcyA9IG5ldyBTZXQoc3Bhbi5zeW1ib2xJZCA/IFtzcGFuLnN5bWJvbElkXSA6IFtdKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGVkIG9mIHJlbGF0ZWRPcmlnaW5zRm9yT3JpZ2luKHNwYW4ub3JpZ2luKSkge1xuICAgICAgaWYgKHJlbGF0ZWQubm9kZUlkKSBzcGFuTm9kZUlkcy5hZGQocmVsYXRlZC5ub2RlSWQpXG4gICAgICBpZiAocmVsYXRlZC5zeW1ib2xJZCkgc3BhblN5bWJvbElkcy5hZGQocmVsYXRlZC5zeW1ib2xJZClcbiAgICAgIGlmIChyZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQgPT0gcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXQpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gb3JpZ2luYWxQb2ludHNCeVNvdXJjZS5nZXQocmVsYXRlZC5zb3VyY2VJZClcbiAgICAgICAgY29uc3QgcG9pbnRTcGFucyA9IHBvaW50cz8uZ2V0KHJlbGF0ZWQubG9jYXRpb24uc3RhcnQub2Zmc2V0KSA/PyBbXVxuXG4gICAgICAgIHBvaW50U3BhbnMucHVzaChzcGFuKVxuICAgICAgICBwb2ludHM/LnNldChyZWxhdGVkLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCwgcG9pbnRTcGFucylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsQnlTb3VyY2UuZ2V0KHJlbGF0ZWQuc291cmNlSWQpPy5wdXNoKHtcbiAgICAgICAgZW5kOiByZWxhdGVkLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgICAgIHByZWZpeEVuZDogcmVsYXRlZC5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgICAgICBzcGFuLFxuICAgICAgICBzdGFydDogcmVsYXRlZC5sb2NhdGlvbi5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIHNwYW5Ob2RlSWRzKSBub2RlU3BhbnMuZ2V0KG5vZGVJZCk/LnB1c2goc3BhbilcbiAgICBmb3IgKGNvbnN0IHN5bWJvbElkIG9mIHNwYW5TeW1ib2xJZHMpIHN5bWJvbFNwYW5zLmdldChzeW1ib2xJZCk/LnB1c2goc3BhbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cmllcyBvZiBvcmlnaW5hbEJ5U291cmNlLnZhbHVlcygpKSB7XG4gICAgZW50cmllcy5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zdGFydCAtIHJpZ2h0LnN0YXJ0IHx8IGxlZnQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IC0gcmlnaHQuc3Bhbi5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0KVxuICAgIGxldCBwcmVmaXhFbmQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIHByZWZpeEVuZCA9IE1hdGgubWF4KHByZWZpeEVuZCwgZW50cnkuZW5kKVxuICAgICAgZW50cnkucHJlZml4RW5kID0gcHJlZml4RW5kXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtnZW5lcmF0ZWRDb29yZGluYXRlcywgbm9kZVNwYW5zLCBvcmlnaW5hbEJ5U291cmNlLCBvcmlnaW5hbFBvaW50c0J5U291cmNlLCBzb3VyY2VDb29yZGluYXRlcywgc291cmNlc0J5SWQsIHN5bWJvbFNwYW5zfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBnZW5lcmF0ZWQgc3BhbiBjb250YWluaW5nIGFuIG9mZnNldCBieSBiaW5hcnkgc2VhcmNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIEdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuIHwgdW5kZWZpbmVkfSBDb250YWluaW5nIHNwYW4uXG4gKi9cbmZ1bmN0aW9uIHNwYW5Gb3JHZW5lcmF0ZWQoc3BhbnMsIG9mZnNldCkge1xuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLnN0YXJ0Lm9mZnNldCA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSBzcGFuc1tsb3cgLSAxXVxuXG4gIHJldHVybiBjYW5kaWRhdGUgJiYgb2Zmc2V0IDwgY2FuZGlkYXRlLmdlbmVyYXRlZC5lbmQub2Zmc2V0ID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRmluZHMgb3JkZXJlZCBnZW5lcmF0ZWQgc3BhbnMgaW50ZXJzZWN0aW5nIGEgaGFsZi1vcGVuIHJhbmdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIHNwYW5zLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5jbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gRXhjbHVzaXZlIGdlbmVyYXRlZCBvZmZzZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119IE92ZXJsYXBwaW5nIHNwYW5zLlxuICovXG5mdW5jdGlvbiBzcGFuc092ZXJsYXBwaW5nR2VuZXJhdGVkKHNwYW5zLCBzdGFydCwgZW5kKSB7XG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICBjb25zdCBjb250YWluaW5nID0gc3BhbkZvckdlbmVyYXRlZChzcGFucywgc3RhcnQpXG5cbiAgICByZXR1cm4gY29udGFpbmluZyA/IFtjb250YWluaW5nXSA6IFtdXG4gIH1cblxuICBsZXQgbG93ID0gMFxuICBsZXQgaGlnaCA9IHNwYW5zLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKHNwYW5zW21pZGRsZV0uZ2VuZXJhdGVkLmVuZC5vZmZzZXQgPD0gc3RhcnQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBvdmVybGFwcGluZyA9IFtdXG5cbiAgZm9yIChsZXQgaW5kZXggPSBsb3c7IGluZGV4IDwgc3BhbnMubGVuZ3RoICYmIHNwYW5zW2luZGV4XS5nZW5lcmF0ZWQuc3RhcnQub2Zmc2V0IDwgZW5kOyBpbmRleCsrKSB7XG4gICAgb3ZlcmxhcHBpbmcucHVzaChzcGFuc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gb3ZlcmxhcHBpbmdcbn1cblxuLyoqXG4gKiBEZWVwLWZyZWV6ZXMgYSBKU09OIHRyZWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSlNPTiB2YWx1ZS5cbiAqIEBwYXJhbSB7V2Vha1NldDxvYmplY3Q+fSBbdmlzaXRlZF0gLSBDeWNsZSBwcm90ZWN0aW9uIGZvciByZWplY3RlZCBjYWxsZXIgZXh0cmFzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGZyZWV6ZUpzb24odmFsdWUsIHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmlzaXRlZC5oYXModmFsdWUpKSByZXR1cm5cblxuICB2aXNpdGVkLmFkZCh2YWx1ZSlcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZnJlZXplSnNvbihjaGlsZCwgdmlzaXRlZClcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgY2xvc2VkIG1hcHBpbmcgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHNvdXJjZXNCeUlkIC0gU291cmNlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59IGNvb3JkaW5hdGVzIC0gU291cmNlIGNvb3JkaW5hdGUgaW5kZXhlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbbm9kZUlkc10gLSBLbm93biBzZW1hbnRpYyBub2Rlcy5cbiAqIEBwYXJhbSB7U2V0PHVua25vd24+fSBbc3ltYm9sSWRzXSAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPcmlnaW4ob3JpZ2luLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykge1xuICBpZiAoIW9yaWdpbiB8fCB0eXBlb2Ygb3JpZ2luICE9IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXBwaW5nIG9yaWdpbiBtdXN0IGJlIGEgY2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXCIpXG5cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHtcbiAgICB2YWxpZGF0ZVJlbGF0ZWQoe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9LCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcylcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JpZ2luLm9yaWdpbnMpIHx8IG9yaWdpbi5vcmlnaW5zLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBwcm92ZW5hbmNlIHJlcXVpcmVzIG9yaWdpbnMuXCIpXG4gICAgb3JpZ2luLm9yaWdpbnMuZm9yRWFjaCgocmVsYXRlZCkgPT4gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luLnJlYXNvbiAhPSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KG9yaWdpbi5yZWxhdGVkT3JpZ2lucykpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc3ludGhldGljIHByb3ZlbmFuY2UuXCIpXG4gICAgb3JpZ2luLnJlbGF0ZWRPcmlnaW5zLmZvckVhY2goKHJlbGF0ZWQpID0+IHZhbGlkYXRlUmVsYXRlZChyZWxhdGVkLCBzb3VyY2VzQnlJZCwgY29vcmRpbmF0ZXMsIG5vZGVJZHMsIHN5bWJvbElkcykpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBwcm92ZW5hbmNlIGtpbmQuXCIpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzb3VyY2UtcmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIFJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBzb3VyY2VzQnlJZCAtIFNvdXJjZXMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcGFyYW0ge1NldDx1bmtub3duPiB8IHVuZGVmaW5lZH0gbm9kZUlkcyAtIEtub3duIHNlbWFudGljIG5vZGVzLlxuICogQHBhcmFtIHtTZXQ8dW5rbm93bj4gfCB1bmRlZmluZWR9IHN5bWJvbElkcyAtIEtub3duIHNlbWFudGljIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGVkKHJlbGF0ZWQsIHNvdXJjZXNCeUlkLCBjb29yZGluYXRlcywgbm9kZUlkcywgc3ltYm9sSWRzKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeUlkLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuXG4gIGlmICghc291cmNlIHx8ICFyZWxhdGVkLmxvY2F0aW9uIHx8IHJlbGF0ZWQubG9jYXRpb24uZmlsZW5hbWUgIT0gc291cmNlLmZpbGVuYW1lIHx8XG4gICAgcmVsYXRlZC5ub2RlSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5ub2RlSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgIHJlbGF0ZWQuc3ltYm9sSWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVsYXRlZC5zeW1ib2xJZCAhPSBcInN0cmluZ1wiIHx8XG4gICAgcmVsYXRlZC5yb2xlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlbGF0ZWQucm9sZSAhPSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzb3VyY2UuXCIpXG4gIGlmIChub2RlSWRzICYmIHJlbGF0ZWQubm9kZUlkICE9PSB1bmRlZmluZWQgJiYgIW5vZGVJZHMuaGFzKHJlbGF0ZWQubm9kZUlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9yaWdpbiByZWZlcmVuY2VzIGFuIHVua25vd24gbm9kZS5cIilcbiAgaWYgKHN5bWJvbElkcyAmJiByZWxhdGVkLnN5bWJvbElkICE9PSB1bmRlZmluZWQgJiYgIXN5bWJvbElkcy5oYXMocmVsYXRlZC5zeW1ib2xJZCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT3JpZ2luIHJlZmVyZW5jZXMgYW4gdW5rbm93biBzeW1ib2wuXCIpXG4gIH1cbiAgdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZShyZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGxvY2F0aW9uIGFnYWluc3QgYXQgbGVhc3Qgb25lIHNhbWUtZmlsZW5hbWUgc291cmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW10+fSBzb3VyY2VzQnlGaWxlbmFtZSAtIFNvdXJjZXMgYnkgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD4+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2NhdGlvbkZvclNvdXJjZXModmFsdWUsIHNvdXJjZXNCeUZpbGVuYW1lLCBjb29yZGluYXRlcykge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIG9yaWdpbmFsIGxvY2F0aW9uLlwiKVxuICBjb25zdCBsb2NhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKVxuICBjb25zdCBjYW5kaWRhdGVzID0gc291cmNlc0J5RmlsZW5hbWUuZ2V0KGxvY2F0aW9uLmZpbGVuYW1lKSA/PyBbXVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PSAwIHx8ICFjYW5kaWRhdGVzLnNvbWUoKHNvdXJjZSkgPT4gbG9jYXRpb25NYXRjaGVzU291cmNlKGxvY2F0aW9uLCBzb3VyY2UsIGNvb3JkaW5hdGVzLmdldChzb3VyY2UuaWQpKSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBsb2NhdGlvbiBhZ2FpbnN0IGl0cyBpZGVudGlmaWVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTG9jYXRpb25Gb3JTb3VyY2UodmFsdWUsIHNvdXJjZSwgY29vcmRpbmF0ZXMpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCAhbG9jYXRpb25NYXRjaGVzU291cmNlKFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gKi8gKHZhbHVlKSwgc291cmNlLCBjb29yZGluYXRlc1xuICApKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhbGUgb3JpZ2luYWwgbG9jYXRpb24uXCIpXG59XG5cbi8qKlxuICogVGVzdHMgYSBsb2NhdGlvbiBhZ2FpbnN0IG9uZSBzb3VyY2UgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+IHwgdW5kZWZpbmVkfSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlcyB3aGVuIGNvbnRlbnQgZXhpc3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJhbmdlIGlzIG5vcm1hbGl6ZWQgZm9yIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0aW9uTWF0Y2hlc1NvdXJjZShsb2NhdGlvbiwgc291cmNlLCBjb29yZGluYXRlcykge1xuICBpZiAoIWxvY2F0aW9uIHx8IGxvY2F0aW9uLmZpbGVuYW1lICE9IHNvdXJjZS5maWxlbmFtZSB8fCAhbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fFxuICAgICF2YWxpZFBvaW50KGxvY2F0aW9uLnN0YXJ0KSB8fCAhdmFsaWRQb2ludChsb2NhdGlvbi5lbmQpIHx8IGxvY2F0aW9uLmVuZC5vZmZzZXQgPCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHJldHVybiBmYWxzZVxuXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBsb2NhdGlvbi5lbmQub2Zmc2V0IDw9IHNvdXJjZS5jb250ZW50Lmxlbmd0aCAmJiBjb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpXG59XG5cbi8qKlxuICogVGVzdHMgdGhlIHN0cnVjdHVyYWwgdmFsaWRpdHkgb2Ygb25lIHNvdXJjZSBwb2ludC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gV2hldGhlciBpdCBpcyBhIHBvaW50LlxuICovXG5mdW5jdGlvbiB2YWxpZFBvaW50KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICBjb25zdCBwb2ludCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcblxuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb2ludC5vZmZzZXQpICYmIE51bWJlci5pc0ludGVnZXIocG9pbnQubGluZSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwb2ludC5jb2x1bW4pICYmXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5vZmZzZXQpID49IDAgJiYgLyoqIEB0eXBlIHtudW1iZXJ9ICovIChwb2ludC5saW5lKSA+PSAxICYmIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocG9pbnQuY29sdW1uKSA+PSAxXG59XG5cbi8qKlxuICogVGVzdHMgYSBzdXBwb3J0ZWQgc2VtYW50aWMgbGFuZ3VhZ2UgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGxhbmd1YWdlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gV2hldGhlciBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IFwicGhwXCIgfHwgdmFsdWUgPT0gXCJydWJ5XCIgfHwgdmFsdWUgPT0gXCJqYXZhc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdmFsdWUgPT0gXCJqYXZhXCIgfHxcbiAgICB2YWx1ZSA9PSBcInB5dGhvblwiXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBzdGFibGUgbG9va3VwIHJlc3VsdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFufSBzcGFuIC0gTWFwcGluZyBzcGFuLlxuICogQHJldHVybnMge3tnZW5lcmF0ZWRMb2NhdGlvbjogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbG9jYXRpb246IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQsIG1hcHBpbmdLaW5kOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLk1hcHBpbmdLaW5kLCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN5bWJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWR9fSBMb29rdXAgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBtYXBwaW5nUmVzdWx0KHNwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRMb2NhdGlvbjogc3Bhbi5nZW5lcmF0ZWQsXG4gICAgbG9jYXRpb246IHByaW1hcnlMb2NhdGlvbihzcGFuLm9yaWdpbiksXG4gICAgbWFwcGluZ0tpbmQ6IHNwYW4ubWFwcGluZ0tpbmQsXG4gICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgIG5vZGVJZDogc3Bhbi5ub2RlSWQsXG4gICAgcm9sZTogc3Bhbi5yb2xlLFxuICAgIHN5bWJvbElkOiBzcGFuLnN5bWJvbElkXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbiBvZmZzZXQtZm9ybSBvciBsaW5lL2NvbHVtbi1mb3JtIHBvc2l0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+fSBjb29yZGluYXRlcyAtIFNvdXJjZSBjb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHt7b2Zmc2V0OiBudW1iZXJ9IHwge2xpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fSBwb3NpdGlvbiAtIFBvc2l0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gVVRGLTE2IG9mZnNldC5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpb25PZmZzZXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uKSB7XG4gIGlmIChcIm9mZnNldFwiIGluIHBvc2l0aW9uKSB7XG4gICAgaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uLm9mZnNldClcblxuICAgIHJldHVybiBwb3NpdGlvbi5vZmZzZXRcbiAgfVxuXG4gIHJldHVybiBpbmRleGVkT2Zmc2V0QXQoY29vcmRpbmF0ZXMsIHBvc2l0aW9uLmxpbmUsIHBvc2l0aW9uLmNvbHVtbilcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZXhjbHVzaXZlIGNvbnRlbnQgb2Zmc2V0IGJlZm9yZSB0aGUgbmV4dCBnZW5lcmF0ZWQgbGluZSBicmVhay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gR2VuZXJhdGVkIGNvbnRlbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gT2Zmc2V0IG9uIHRoZSBjdXJyZW50IGxpbmUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBFbmQgb2YgdGhlIGN1cnJlbnQgbGluZSBvciBjb250ZW50LlxuICovXG5mdW5jdGlvbiBsaW5lRW5kT2Zmc2V0KGNvbnRlbnQsIG9mZnNldCkge1xuICBjb25zdCBuZXdsaW5lID0gY29udGVudC5pbmRleE9mKFwiXFxuXCIsIG9mZnNldClcblxuICByZXR1cm4gbmV3bGluZSA9PSAtMSA/IGNvbnRlbnQubGVuZ3RoIDogbmV3bGluZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIGNvbXBsZXRlIG5vcm1hbGl6ZWQgcG9pbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBsZWZ0IC0gTGVmdCBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gcmlnaHQgLSBSaWdodCBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGNvb3JkaW5hdGVzIG1hdGNoLlxuICovXG5mdW5jdGlvbiBzYW1lUG9pbnQobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQub2Zmc2V0ID09IHJpZ2h0Lm9mZnNldCAmJiBsZWZ0LmxpbmUgPT0gcmlnaHQubGluZSAmJiBsZWZ0LmNvbHVtbiA9PSByaWdodC5jb2x1bW5cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHNvdXJjZSByZWdpc3RyeSBlbnRyeSBmb3IgYW4gb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIE1hcHBpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIE9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBQcmltYXJ5IGxvY2F0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBzb3VyY2VzQnlJZCAtIEluZGV4ZWQgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IFJlZ2lzdGVyZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBzb3VyY2VGb3JPcmlnaW4obWFwcGluZywgb3JpZ2luLCBsb2NhdGlvbiwgc291cmNlc0J5SWQpIHtcbiAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VJZEZvck9yaWdpbihvcmlnaW4pXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNCeUlkLmdldChzb3VyY2VJZCA/PyBcIlwiKSA/P1xuICAgIG1hcHBpbmcuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gbWFwcGluZyBzb3VyY2UgZm9yICR7bG9jYXRpb24uZmlsZW5hbWV9LmApXG5cbiAgcmV0dXJuIHNvdXJjZVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSByZWdpc3RyeSBpZGVudGl0eSBvZiBhbiBvcmlnaW4ncyBwcmltYXJ5IGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3VyY2UgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZUlkRm9yT3JpZ2luKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIG9yaWdpbi5zb3VyY2VJZFxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1swXT8uc291cmNlSWRcblxuICByZXR1cm4gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zWzBdPy5zb3VyY2VJZFxufVxuXG4vKipcbiAqIFJld3JpdGVzIGNsb3NlZC1vcmlnaW4gc291cmNlIGlkZW50aXRpZXMgYWdhaW5zdCBhIGNvbXBvc2VkIHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBPcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHNvdXJjZUlkcyAtIE9yaWdpbmFsLXRvLWNvbXBvc2VkIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IFJld3JpdHRlbiBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHJlbWFwT3JpZ2luU291cmNlSWRzKG9yaWdpbiwgc291cmNlSWRzKSB7XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSB7XG4gICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VJZHMuZ2V0KG9yaWdpbi5zb3VyY2VJZClcblxuICAgIGlmICghc291cmNlSWQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBDb21wb3NlZCBtYXBwaW5nIG9taXR0ZWQgc291cmNlICcke29yaWdpbi5sb2NhdGlvbi5maWxlbmFtZX0nLmApXG5cbiAgICByZXR1cm4ge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkfVxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIHtraW5kOiBcImRlcml2ZWRcIiwgb3JpZ2luczogb3JpZ2luLm9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiByZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBzb3VyY2VJZHMpKX1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6IFwic3ludGhldGljXCIsXG4gICAgcmVhc29uOiBvcmlnaW4ucmVhc29uLFxuICAgIHJlbGF0ZWRPcmlnaW5zOiBvcmlnaW4ucmVsYXRlZE9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiByZW1hcFJlbGF0ZWRPcmlnaW5Tb3VyY2VJZChyZWxhdGVkLCBzb3VyY2VJZHMpKVxuICB9XG59XG5cbi8qKlxuICogUmV3cml0ZXMgb25lIHJlbGF0ZWQgc291cmNlIGlkZW50aXR5IHdoaWxlIGRyb3BwaW5nIGlkZW50aXRpZXMgZnJvbSBhIGRpc2NhcmRlZCBub2RlIHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBSZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gc291cmNlSWRzIC0gT3JpZ2luYWwtdG8tY29tcG9zZWQgc291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBSZXdyaXR0ZW4gcmVsYXRlZCBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHJlbWFwUmVsYXRlZE9yaWdpblNvdXJjZUlkKHJlbGF0ZWQsIHNvdXJjZUlkcykge1xuICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZUlkcy5nZXQocmVsYXRlZC5zb3VyY2VJZClcblxuICBpZiAoIXNvdXJjZUlkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29tcG9zZWQgbWFwcGluZyBvbWl0dGVkIHNvdXJjZSAnJHtyZWxhdGVkLmxvY2F0aW9uLmZpbGVuYW1lfScuYClcblxuICBjb25zdCB1bmlkZW50aWZpZWQgPSB7Li4ucmVsYXRlZH1cblxuICBkZWxldGUgdW5pZGVudGlmaWVkLm5vZGVJZFxuICBkZWxldGUgdW5pZGVudGlmaWVkLnN5bWJvbElkXG5cbiAgcmV0dXJuIHsuLi51bmlkZW50aWZpZWQsIHNvdXJjZUlkfVxufVxuXG4vKipcbiAqIFNvcnRzIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IHdoaWxlIHByZXNlcnZpbmcgc2VtYW50aWMgYXJyYXkgb3JkZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSlNPTiB2YWx1ZS5cbiAqIEByZXR1cm5zIHt1bmtub3dufSBEZXRlcm1pbmlzdGljYWxseSBrZXllZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc29ydEpzb24odmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKHNvcnRKc29uKVxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDApXG4gICAgICAubWFwKChba2V5LCBjaGlsZF0pID0+IFtrZXksIHNvcnRKc29uKGNoaWxkKV0pKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUmVtb3ZlcyB1bmRlZmluZWQgb3B0aW9uYWwgcHJvcGVydGllcyBmcm9tIGEgcHVibGljIEpTT04gdmFsdWUuXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBWYWx1ZVxuICogQHBhcmFtIHtWYWx1ZX0gdmFsdWUgLSBDYW5kaWRhdGUgb2JqZWN0LlxuICogQHJldHVybnMge1ZhbHVlfSBDb21wYWN0IEpTT04tc2FmZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZWRQcm9wZXJ0aWVzKHZhbHVlKSB7XG4gIHJldHVybiAvKiogQHR5cGUge1ZhbHVlfSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5maWx0ZXIoKFssIGNoaWxkXSkgPT4gY2hpbGQgIT09IHVuZGVmaW5lZCkpKVxufVxuIl19
|