@decaf-ts/for-typeorm 0.0.17 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-typeorm.cjs +1 -1
- package/dist/for-typeorm.esm.cjs +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/for-typeorm.cjs
CHANGED
|
@@ -3342,7 +3342,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
3342
3342
|
* @const VERSION
|
|
3343
3343
|
* @memberOf module:for-typeorm
|
|
3344
3344
|
*/
|
|
3345
|
-
const VERSION = "0.0.
|
|
3345
|
+
const VERSION = "0.0.18";
|
|
3346
3346
|
|
|
3347
3347
|
exports.IndexError = IndexError;
|
|
3348
3348
|
exports.TypeORMAdapter = TypeORMAdapter;
|
package/dist/for-typeorm.esm.cjs
CHANGED
|
@@ -3345,7 +3345,7 @@ Adapter.setCurrent(TypeORMFlavour);
|
|
|
3345
3345
|
* @const VERSION
|
|
3346
3346
|
* @memberOf module:for-typeorm
|
|
3347
3347
|
*/
|
|
3348
|
-
const VERSION = "0.0.
|
|
3348
|
+
const VERSION = "0.0.18";
|
|
3349
3349
|
|
|
3350
3350
|
export { IndexError, SQLOperator, TypeORMAdapter, TypeORMConst, TypeORMDispatch, TypeORMFlavour, TypeORMGroupOperator, TypeORMKeys, TypeORMOperator, TypeORMPaginator, TypeORMQueryLimit, TypeORMRepository, TypeORMSequence, TypeORMStatement, VERSION, convertJsRegexToPostgres, generateIndexes, reservedAttributes, splitEagerRelations, translateOperators };
|
|
3351
3351
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9lcnJvcnMudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyIsIi4uL3NyYy9xdWVyeS90cmFuc2xhdGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvcXVlcnkvU3RhdGVtZW50LnRzIiwiLi4vc3JjL3NlcXVlbmNlcy9TZXF1ZW5jZS50cyIsIi4uL3NyYy9pbmRleGVzL2dlbmVyYXRvci50cyIsIi4uL3NyYy9UeXBlT1JNUmVwb3NpdG9yeS50cyIsIi4uL3NyYy9UeXBlT1JNRXZlbnRTdWJzY3JpYmVyLnRzIiwiLi4vc3JjL1R5cGVPUk1EaXNwYXRjaC50cyIsIi4uL3NyYy9vdmVycmlkZXMvdXRpbHMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL0NvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ3JlYXRlRGF0ZUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvT2JqZWN0VXRpbHMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PbmVUb01hbnkudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL01hbnlUb09uZS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvUHJpbWFyeUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvRW50aXR5LnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvVHlwZU9STUFkYXB0ZXIudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVndWxhciBleHByZXNzaW9uIHRvIGlkZW50aWZ5IHJlc2VydmVkIGF0dHJpYnV0ZXMgZm9yIFNRTCBjb250ZXh0cy5cbiAqIEBzdW1tYXJ5IE1hdGNoZXMgYXR0cmlidXRlIG5hbWVzIHRoYXQgY29uZmxpY3Qgd2l0aCBTUUwgcmVzZXJ2ZWQga2V5d29yZHMgdG8gcHJldmVudCBpbnZhbGlkIHNjaGVtYSBvciBxdWVyeSBnZW5lcmF0aW9uLlxuICogQGNvbnN0IHJlc2VydmVkQXR0cmlidXRlc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzID1cbiAgL14oc2VsZWN0fGZyb218d2hlcmV8YW5kfG9yfGluc2VydHx1cGRhdGV8ZGVsZXRlfGRyb3B8Y3JlYXRlfHRhYmxlfGluZGV4fHByaW1hcnl8a2V5fGZvcmVpZ258cmVmZXJlbmNlc3xjb25zdHJhaW50fHVuaXF1ZXxjaGVja3xkZWZhdWx0fG51bGx8bm90fGFzfG9yZGVyfGJ5fGdyb3VwfGhhdmluZ3xsaW1pdHxvZmZzZXR8am9pbnxpbm5lcnxvdXRlcnxsZWZ0fHJpZ2h0fGZ1bGx8b258dXNpbmd8dmFsdWVzfHJldHVybmluZ3xzZXR8aW50b3xjYXNlfHdoZW58dGhlbnxlbHNlfGVuZHxjYXN0fGNvYWxlc2NlfGV4aXN0c3xhbnl8YWxsfHNvbWV8aW58YmV0d2VlbnxsaWtlfGlsaWtlfHNpbWlsYXJ8dG98aXN8dHJ1ZXxmYWxzZXxhc2N8ZGVzY3xkaXN0aW5jdHx1bmlvbnxpbnRlcnNlY3R8ZXhjZXB0fG5hdHVyYWx8bGF0ZXJhbHx3aW5kb3d8b3ZlcnxwYXJ0aXRpb258cmFuZ2V8cm93c3x1bmJvdW5kZWR8cHJlY2VkaW5nfGZvbGxvd2luZ3xjdXJyZW50fHJvd3x3aXRofHJlY3Vyc2l2ZXxtYXRlcmlhbGl6ZWR8dmlld3xmdW5jdGlvbnx0cmlnZ2VyfHByb2NlZHVyZXxsYW5ndWFnZXxyZXR1cm5zfHJldHVybnxkZWNsYXJlfGJlZ2lufGNvbW1pdHxyb2xsYmFja3xzYXZlcG9pbnR8dHJhbnNhY3Rpb258dGVtcG9yYXJ5fHRlbXB8aWZ8bG9vcHx3aGlsZXxmb3J8Y29udGludWV8ZXhpdHxyYWlzZXxleGNlcHRpb258bm90aWNlfGluZm98bG9nfGRlYnVnfGFzc2VydHxleGVjdXRlfHBlcmZvcm18Z2V0fGRpYWdub3N0aWNzfGNhbGx8ZG98YWxpYXN8Y29tbWVudHx2YWN1dW18YW5hbHl6ZXxleHBsYWlufGNvcHl8Z3JhbnR8cmV2b2tlfHByaXZpbGVnZXN8cHVibGljfHVzYWdlfHNjaGVtYXxzZXF1ZW5jZXxvd25lZHxvd25lcnx0YWJsZXNwYWNlfHN0b3JhZ2V8aW5oZXJpdHN8dHlwZXxvcGVyYXRvcnxjb2xsYXRlfGNvbGxhdGlvbnxjYXNjYWRlfHJlc3RyaWN0fGFkZHxhbHRlcnxjb2x1bW58cmVuYW1lfHRvfGVuYWJsZXxkaXNhYmxlfGZvcmNlfG5vfGluc3RlYWR8b2Z8YmVmb3JlfGFmdGVyfGVhY2h8c3RhdGVtZW50fHJvd3xleGVjdXRlfGFsc298b25seXxleGNsdWRlfG51bGxzfG90aGVyc3xvcmRpbmFsaXR5fHRpZXN8bm90aGluZ3xjYWNoZXxjeWNsZXxpbmNyZW1lbnR8bWludmFsdWV8bWF4dmFsdWV8c3RhcnR8cmVzdGFydHxieXxjYWxsZWR8cmV0dXJuc3xsYW5ndWFnZXxpbW11dGFibGV8c3RhYmxlfHZvbGF0aWxlfHN0cmljdHxzZWN1cml0eXxkZWZpbmVyfGludm9rZXJ8Y29zdHxyb3dzfHN1cHBvcnR8aGFuZGxlcnxpbmxpbmV8dmFsaWRhdG9yfG9wdGlvbnN8c3RvcmFnZXxpbmhlcml0YW5jZXxvaWRzfHdpdGhvdXR8ZGF0YXxkaWN0aW9uYXJ5fGVuY29kaW5nfGxjX2NvbGxhdGV8bGNfY3R5cGV8Y29ubmVjdGlvbnxsaW1pdHxwYXNzd29yZHx2YWxpZHx1bnRpbHxzdXBlcnVzZXJ8bm9zdXBlcnVzZXJ8Y3JlYXRlZGJ8bm9jcmVhdGVkYnxjcmVhdGVyb2xlfG5vY3JlYXRlcm9sZXxpbmhlcml0fG5vaW5oZXJpdHxsb2dpbnxub2xvZ2lufHJlcGxpY2F0aW9ufG5vcmVwbGljYXRpb258YnlwYXNzcmxzfG5vYnlwYXNzcmxzfGVuY3J5cHRlZHx1bmVuY3J5cHRlZHxuZXd8b2xkfHNlc3Npb25fdXNlcnxjdXJyZW50X3VzZXJ8Y3VycmVudF9yb2xlfGN1cnJlbnRfc2NoZW1hfGN1cnJlbnRfY2F0YWxvZ3xjdXJyZW50X2RhdGV8Y3VycmVudF90aW1lfGN1cnJlbnRfdGltZXN0YW1wfGxvY2FsdGltZXxsb2NhbHRpbWVzdGFtcHxjdXJyZW50X2RhdGFiYXNlfGluZXR8Y2lkcnxtYWNhZGRyfG1hY2FkZHI4fGJpdHx2YXJiaXR8dHN2ZWN0b3J8dHNxdWVyeXx1dWlkfHhtbHxqc29ufGpzb25ifGludHxpbnRlZ2VyfHNtYWxsaW50fGJpZ2ludHxkZWNpbWFsfG51bWVyaWN8cmVhbHxkb3VibGV8cHJlY2lzaW9ufGZsb2F0fGJvb2xlYW58Ym9vbHxjaGFyfGNoYXJhY3Rlcnx2YXJjaGFyfHRleHR8Ynl0ZWF8ZGF0ZXx0aW1lfHRpbWVzdGFtcHxpbnRlcnZhbHxwb2ludHxsaW5lfGxzZWd8Ym94fHBhdGh8cG9seWdvbnxjaXJjbGV8bW9uZXl8dm9pZCkkL2k7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgc3RyaW5nIGZvciB0aGUgVHlwZU9STSBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHJlZ2lzdGVyIGFuZCByZXNvbHZlIHRoZSBUeXBlT1JNIGltcGxlbWVudGF0aW9uIHdpdGhpbiB0aGUgRGVjYWYudHMgYWRhcHRlciBmYWN0b3J5IHN5c3RlbS5cbiAqIEBjb25zdCBUeXBlT1JNRmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUZsYXZvdXIgPSBcInR5cGUtb3JtXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBUeXBlT1JNS2V5cyBjb25zdGFudC5cbiAqIEBzdW1tYXJ5IERlc2NyaWJlcyB0aGUga2V5cyBhbmQgdGhlaXIgbWVhbmluZ3MgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHR5cGVkZWYgVHlwZU9STUtleXNEZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVBBUkFUT1IgU2VwYXJhdG9yIHVzZWQgdG8gam9pbiB0YWJsZSBhbmQgY29sdW1uIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElEIERlZmF1bHQgcHJpbWFyeSBrZXkgZmllbGQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRVJTSU9OIFZlcnNpb24gZmllbGQgdXNlZCBmb3Igb3B0aW1pc3RpYyBsb2NraW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFTEVURUQgU29mdC1kZWxldGUgdGltZXN0YW1wIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRBQkxFIERhdGFiYXNlIHRhYmxlIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNDSEVNQSBEYXRhYmFzZSBzY2hlbWEgaWRlbnRpZmllciBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VRVUVOQ0UgRGF0YWJhc2Ugc2VxdWVuY2UgbmFtZSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5ERVggSW5kZXggaWRlbnRpZmllciBrZXkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHRoYXQgaWRlbnRpZnkgY29tbW9uIGRhdGFiYXNlIHByb3BlcnRpZXMgYW5kIGFkYXB0ZXItc3BlY2lmaWMga2V5cy5cbiAqIEBjb25zdCBUeXBlT1JNS2V5c1xuICogQHR5cGUge1R5cGVPUk1LZXlzRGVmfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUtleXMgPSB7XG4gIFNFUEFSQVRPUjogXCIuXCIsXG4gIElEOiBcImlkXCIsXG4gIFZFUlNJT046IFwidmVyc2lvblwiLFxuICBERUxFVEVEOiBcImRlbGV0ZWRfYXRcIixcbiAgVEFCTEU6IFwidGFibGVfbmFtZVwiLFxuICBTQ0hFTUE6IFwic2NoZW1hX25hbWVcIixcbiAgU0VRVUVOQ0U6IFwic2VxdWVuY2VfbmFtZVwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxufTtcbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIFR5cGVPUk0gaW5kZXhlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gZXJyb3IgcmVsYXRlZCB0byBpbmRleCBnZW5lcmF0aW9uIG9yIGhhbmRsaW5nIHdpdGhpbiB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIEluZGV4RXJyb3JcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgY29kZSB0aGF0IG1pZ2h0IHRocm93IGFuIGluZGV4IGVycm9yXG4gKiAgIHRocm93IG5ldyBJbmRleEVycm9yKFwiSW5kZXggbm90IGZvdW5kXCIpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW5kZXhFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXCJJbmRleCBlcnJvciBvY2N1cnJlZDpcIiwgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoSW5kZXhFcnJvci5uYW1lLCBtc2csIDQwNCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTUUwgb3BlcmF0b3JzIGF2YWlsYWJsZSBmb3IgYnVpbGRpbmcgVHlwZU9STSBxdWVyaWVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgY29tbW9uIFNRTCBvcGVyYXRvcnMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoaW4gVHlwZU9STSBxdWVyeSBjb25zdHJ1Y3Rpb24gYW5kIHRyYW5zbGF0aW9uIGxheWVycy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNRTCBvcGVyYXRvcnMgYXZhaWxhYmxlIGZvciBidWlsZGluZyBUeXBlT1JNIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBjb21tb24gU1FMIG9wZXJhdG9ycyBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiBUeXBlT1JNIHF1ZXJ5IGNvbnN0cnVjdGlvbiBhbmQgdHJhbnNsYXRpb24gbGF5ZXJzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIC8qKiBFeGFjdCBlcXVhbGl0eSBjb21wYXJpc29uICg9KSAqL1xuICBFUVVBTCA9IFwiPVwiLFxuICAvKiogSW5lcXVhbGl0eSBjb21wYXJpc29uICg8PikgKi9cbiAgTk9UX0VRVUFMID0gXCI8PlwiLFxuICAvKiogTGVzcy10aGFuIGNvbXBhcmlzb24gKDwpICovXG4gIExFU1NfVEhBTiA9IFwiPFwiLFxuICAvKiogTGVzcy10aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKDw9KSAqL1xuICBMRVNTX1RIQU5fT1JfRVFVQUwgPSBcIjw9XCIsXG4gIC8qKiBHcmVhdGVyLXRoYW4gY29tcGFyaXNvbiAoPikgKi9cbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIC8qKiBHcmVhdGVyLXRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPj0pICovXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgLyoqIE1lbWJlcnNoaXAgaW4gYSBzZXQgKElOKSAqL1xuICBJTiA9IFwiSU5cIixcbiAgLyoqIE5vbi1tZW1iZXJzaGlwIGluIGEgc2V0IChOT1QgSU4pICovXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIC8qKiBQYXR0ZXJuIG1hdGNoIHVzaW5nIExJS0UgKi9cbiAgTElLRSA9IFwiTElLRVwiLFxuICAvKiogQ2FzZS1pbnNlbnNpdGl2ZSBwYXR0ZXJuIG1hdGNoIHVzaW5nIElMSUtFIChQb3N0Z3JlcykgKi9cbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIC8qKiBSYW5nZSBjb21wYXJpc29uIHVzaW5nIEJFVFdFRU4gKi9cbiAgQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICAvKiogTnVsbCBjaGVjayAoSVMgTlVMTCkgKi9cbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICAvKiogTm90LW51bGwgY2hlY2sgKElTIE5PVCBOVUxMKSAqL1xuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgLyoqIEV4aXN0ZW5jZSBvZiByb3dzIChFWElTVFMpICovXG4gIEVYSVNUUyA9IFwiRVhJU1RTXCIsXG4gIC8qKiBOb24tZXhpc3RlbmNlIG9mIHJvd3MgKE5PVCBFWElTVFMpICovXG4gIE5PVF9FWElTVFMgPSBcIk5PVCBFWElTVFNcIixcbiAgLyoqIENvbXBhcmUgdG8gYW55IHZhbHVlIGluIGFuIGFycmF5IChBTlkpICovXG4gIEFOWSA9IFwiQU5ZXCIsXG4gIC8qKiBDb21wYXJlIHRvIGFsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgKEFMTCkgKi9cbiAgQUxMID0gXCJBTExcIixcbiAgLyoqIENvbXBhcmUgdG8gc29tZSB2YWx1ZXMgaW4gYW4gYXJyYXkgKFNPTUUpICovXG4gIFNPTUUgPSBcIlNPTUVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUXVlcnkgY29udGFpbmVyIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZWl0aGVyIGEgcmF3IFNRTCBzdHJpbmcgb3IgYSBUeXBlT1JNIFNlbGVjdFF1ZXJ5QnVpbGRlciBhbG9uZyB3aXRoIG9wdGlvbmFsIGJvdW5kIHZhbHVlcyB0byBiZSBleGVjdXRlZCBieSB0aGUgYWRhcHRlci5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBNb2RlbCB0eXBlIGZvciB3aGljaCB0aGUgU2VsZWN0UXVlcnlCdWlsZGVyIGlzIHBhcmFtZXRlcml6ZWQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgdW5kZXJseWluZyBxdWVyeSB0eXBlLCBlaXRoZXIgYSBzdHJpbmcgb3IgYSBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4uXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1RdWVyeVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1RdWVyeTxcbiAgTSBleHRlbmRzIE1vZGVsID0gTW9kZWwsXG4gIFQgZXh0ZW5kcyBzdHJpbmcgfCBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4gPSBzdHJpbmcsXG4+IHtcbiAgcXVlcnk6IFQ7XG4gIHZhbHVlcz86IGFueVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZsYWdzIGZvciBUeXBlT1JNIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBFeHRlbmRlZCByZXBvc2l0b3J5IGZsYWdzIGluY2x1ZGluZyBjb25uZWN0aW9uL3VzZXIgY29udGV4dCB0aGF0IGNhbiBiZSBsZXZlcmFnZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBpbnRlcmZhY2UgVHlwZU9STUZsYWdzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU9STUZsYWdzIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVc2VyIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZvciBQb3N0Z3JlcyBkYXRhYmFzZSBjb25uZWN0aW9uc1xuICAgKi9cbiAgdXNlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpY2F0aW9uIGZvciBhIHRhYmxlIGNyZWF0aW9uL2NoYW5nZSBzdGF0ZW1lbnQgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgRXh0ZW5kcyBhIFR5cGVPUk1RdWVyeSB3aXRoIHRhYmxlIG1ldGFkYXRhIHN1Y2ggYXMgcHJpbWFyeSBrZXkgZmxhZywgY29uc3RyYWludHMsIGFuZCBmb3JlaWduIGtleXMuXG4gKiBAdHlwZWRlZiBUeXBlT1JNVGFibGVTcGVjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaW1hcnlLZXkgSW5kaWNhdGVzIGlmIHRoZSB0YXJnZXQgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY29uc3RyYWludHMgQSBsaXN0IG9mIHJhdyBTUUwgY29uc3RyYWludHMgdG8gYXBwbHkgdG8gdGhlIHRhYmxlL2NvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZvcmVpZ25LZXlzIEEgbGlzdCBvZiBmb3JlaWduIGtleSBjb25zdHJhaW50IGRlZmluaXRpb25zLlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgdHlwZSBUeXBlT1JNVGFibGVTcGVjID0gVHlwZU9STVF1ZXJ5ICYge1xuICBwcmltYXJ5S2V5OiBib29sZWFuO1xuICBjb25zdHJhaW50czogc3RyaW5nW107XG4gIGZvcmVpZ25LZXlzOiBzdHJpbmdbXTtcbn07XG4iLCJpbXBvcnQgeyBTUUxPcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHF1ZXJ5IGxpbWl0IGZvciBUeXBlT1JNLWJhY2tlZCBxdWVyaWVzLlxuICogQHN1bW1hcnkgTWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4gaW4gYSBzaW5nbGUgcGFnZSB3aGVuIHBhZ2luYXRpbmcgcmVzdWx0cy5cbiAqIEBjb25zdCBUeXBlT1JNUXVlcnlMaW1pdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STVF1ZXJ5TGltaXQgPSAyNTA7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2Ygb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCB3aGVuIHRyYW5zbGF0aW5nIGhpZ2gtbGV2ZWwgZmlsdGVycyBpbnRvIFNRTCB2aWEgVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTCBFcXVhbGl0eSBvcGVyYXRvciAoPSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGRVJFTlQgSW5lcXVhbGl0eSBvcGVyYXRvciAoPD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSIEdyZWF0ZXIgdGhhbiBvcGVyYXRvciAoPilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVJfRVEgR3JlYXRlciB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yICg+PSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSIExlc3MgdGhhbiBvcGVyYXRvciAoPClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSX0VRIExlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9UIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU4gSW4gYXJyYXkgb3BlcmF0b3IgKElOKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFR0VYUCBSZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVJFR0VYUCBDYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAofiopXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElLRSBQYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9yIChMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElMSUtFIENhc2UtaW5zZW5zaXRpdmUgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoSUxJS0UpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQkVUV0VFTiBSYW5nZSBvcGVyYXRvciAoQkVUV0VFTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJU19OVUxMIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5VTEwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTk9UX05VTEwgTk9UIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5PVCBOVUxMKVxuICogQGNvbnN0IFR5cGVPUk1PcGVyYXRvclxuICogQHR5cGUge1Bvc3RncmVTUUxPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIFNRTE9wZXJhdG9yIHwgc3RyaW5nPiA9IHtcbiAgRVFVQUw6IFNRTE9wZXJhdG9yLkVRVUFMLFxuICBESUZGRVJFTlQ6IFNRTE9wZXJhdG9yLk5PVF9FUVVBTCxcbiAgQklHR0VSOiBTUUxPcGVyYXRvci5HUkVBVEVSX1RIQU4sXG4gIEJJR0dFUl9FUTogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxuICBTTUFMTEVSOiBTUUxPcGVyYXRvci5MRVNTX1RIQU4sXG4gIFNNQUxMRVJfRVE6IFNRTE9wZXJhdG9yLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgQkVUV0VFTjogU1FMT3BlcmF0b3IuQkVUV0VFTixcbiAgTk9UOiBcIk5PVFwiLFxuICBJTjogU1FMT3BlcmF0b3IuSU4sXG4gIElTX05VTEw6IFNRTE9wZXJhdG9yLklTX05VTEwsXG4gIElTX05PVF9OVUxMOiBTUUxPcGVyYXRvci5JU19OT1RfTlVMTCxcbiAgUkVHRVhQOiBcIn5cIixcbiAgSVJFR0VYUDogXCJ+KlwiLFxuICBMSUtFOiBTUUxPcGVyYXRvci5MSUtFLFxuICBJTElLRTogU1FMT3BlcmF0b3IuSUxJS0UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGxvZ2ljYWwgb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgbG9naWNhbCBvcGVyYXRvcnMgdXNlZCB3aGVuIGJ1aWxkaW5nIFdIRVJFIGNsYXVzZSBncm91cHMgaW4gVHlwZU9STSBxdWVyaWVzLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5EIExvZ2ljYWwgQU5EIG9wZXJhdG9yIChBTkQpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT1IgTG9naWNhbCBPUiBvcGVyYXRvciAoT1IpXG4gKiBAY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNR3JvdXBPcGVyYXRvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQU5EOiBcIkFORFwiLFxuICBPUjogXCJPUlwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lhbCBjb25zdGFudCB2YWx1ZXMgdXNlZCBpbiBxdWVyaWVzLlxuICogQHN1bW1hcnkgU3RyaW5nIGNvbnN0YW50cyByZXByZXNlbnRpbmcgc3BlY2lhbCB2YWx1ZXMgdXNlZCB3aGlsZSBjb21wb3NpbmcgU1FMIHdpdGggVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxDb25zdFR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVUxMIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBudWxsIHZhbHVlLlxuICogQGNvbnN0IFR5cGVPUk1Db25zdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUNvbnN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBOVUxMOiBcIk5VTExcIixcbn07XG4iLCJpbXBvcnQgeyBQYWdpbmF0b3IsIFBhZ2luZ0Vycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZ2luYXRvciBmb3IgVHlwZU9STSBxdWVyeSByZXN1bHRzLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyBwYWdpbmF0aW9uIGZvciBUeXBlT1JNLWJ1aWx0IHF1ZXJpZXMgdXNpbmcgdGFrZS9za2lwIGZvciBlZmZpY2llbnQgbmF2aWdhdGlvbiB0aHJvdWdoIHJlc3VsdCBzZXRzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSBjb250YWluZXIgdG8gcGFnaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICogQGNsYXNzIFR5cGVPUk1QYWdpbmF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIFR5cGVPUk1QYWdpbmF0b3JcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBUeXBlT1JNUGFnaW5hdG9yKGFkYXB0ZXIsIHsgcXVlcnk6IHFiIH0sIDEwLCBVc2VyKTtcbiAqIGNvbnN0IHBhZ2UxID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKiBjb25zdCBwYWdlMiA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDIpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBSLFxuICBUeXBlT1JNUXVlcnlcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gdGhlIHJlY29yZCBjb3VudCBhbmQgcGFnZSBzaXplXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBtYXRjaGluZyB0aGUgcXVlcnlcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqL1xuICBvdmVycmlkZSBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIF9fcmVwbz86IFJlcG88YW55PjtcblxuICBwcm90ZWN0ZWQgZ2V0IHJlcG8oKSB7XG4gICAgaWYgKCF0aGlzLl9fcmVwbykge1xuICAgICAgdGhpcy5fX3JlcG8gPSAodGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyKS5jbGllbnQuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgdGhpcy5jbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXp6XVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19yZXBvO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFR5cGVPUk1QYWdpbmF0b3IgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgcGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHF1ZXJ5IFRoZSBUeXBlT1JNIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsXG4gICAgcXVlcnk6IFR5cGVPUk1RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSB0byBpbmNsdWRlIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIFBvc3RncmVTUUwgcXVlcnlcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgcHJlcGFyZWQgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogVHlwZU9STVF1ZXJ5KTogVHlwZU9STVF1ZXJ5IHtcbiAgICBjb25zdCBxdWVyeTogVHlwZU9STVF1ZXJ5ID0geyAuLi5yYXdTdGF0ZW1lbnQgfTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0cy5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2U9MV0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqIEB0aHJvd3Mge1BhZ2luZ0Vycm9yfSBJZiB0cnlpbmcgdG8gYWNjZXNzIGFuIGludmFsaWQgcGFnZSBvciBpZiBubyBjbGFzcyBpcyBkZWZpbmVkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3IgYXMgVHlwZU9STVBhZ2luYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICAgKlxuICAgKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZShwYWdlTnVtYmVyKVxuICAgKiAgIE5vdGUgb3ZlciBQYWdpbmF0b3I6IFByZXBhcmUgb3B0aW9ucyAoc2tpcC90YWtlKVxuICAgKlxuICAgKiAgIGFsdCBGaXJzdCB0aW1lIG9yIG5lZWQgY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEdldCBjb3VudFxuICAgKiAgICAgQWRhcHRlci0+PkRCOiBFeGVjdXRlIENPVU5UXG4gICAqICAgICBEQi0tPj5BZGFwdGVyOiBjb3VudFxuICAgKiAgICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IGNvdW50XG4gICAqICAgICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IENhbGN1bGF0ZSB0b3RhbCBwYWdlc1xuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBBZGFwdGVyLT4+REI6IGZpbmRBbmRDb3VudChvcHRpb25zKVxuICAgKiAgIERCLS0+PkFkYXB0ZXI6IHJvd3MsIGNvdW50XG4gICAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJvd3MsIGNvdW50XG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBNYXAgcm93cyB0byBtb2RlbHNcbiAgICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXN1bHRzXG4gICAqL1xuXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0geyAuLi50aGlzLnN0YXRlbWVudCB9O1xuXG4gICAgLy8gR2V0IHRvdGFsIGNvdW50IGlmIG5vdCBhbHJlYWR5IGNhbGN1bGF0ZWRcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdGhpcy5fcmVjb3JkQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHM6IEZpbmRNYW55T3B0aW9uczxNPiA9IE9iamVjdC5hc3NpZ24oc3RhdGVtZW50LCB7XG4gICAgICBza2lwOiAodGhpcy5jdXJyZW50IHx8IDApICogdGhpcy5zaXplLFxuICAgICAgdGFrZTogdGhpcy5zaXplLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG8uZmluZEFuZENvdW50KG9wdHMpO1xuXG4gICAgdGhpcy5fcmVjb3JkQ291bnQgPSByZXN1bHRbMV07XG4gICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHRoaXMuc2l6ZSk7XG5cbiAgICBpZiAoIXRoaXMuY2xhenopIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIHN0YXRlbWVudCB0YXJnZXQgZGVmaW5lZFwiKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhenooKSk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3VsdFswXSB8fCBbXTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPVxuICAgICAgLy8gc3RhdGVtZW50LmNvbHVtbnMgJiYgc3RhdGVtZW50LmNvbHVtbnMubGVuZ3RoXG4gICAgICAvLyAgID8gcm93cyAvLyBoYXMgY29sdW1ucyBtZWFucyBpdCdzIG5vdCBmdWxsIG1vZGVsXG4gICAgICByb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocm93LCB0aGlzLmNsYXp6LCBwa0RlZi5pZCwgcm93W3BrRGVmLmlkXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyB1bmtub3duIGFzIFJbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1Hcm91cE9wZXJhdG9yLCBUeXBlT1JNT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNRTE9wZXJhdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgY29yZSBvcGVyYXRvcnMgdG8gVHlwZU9STSBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29udmVydHMgRGVjYWYudHMgY29yZSBvcGVyYXRvcnMgdG8gdGhlaXIgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3JzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7R3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yfSBvcGVyYXRvciBUaGUgY29yZSBvcGVyYXRvciB0byB0cmFuc2xhdGUuXG4gKiBAcmV0dXJuIHtTUUxPcGVyYXRvciB8IHN0cmluZ30gVGhlIGVxdWl2YWxlbnQgU1FMIG9wZXJhdG9yLlxuICogQHRocm93cyB7UXVlcnlFcnJvcn0gSWYgbm8gdHJhbnNsYXRpb24gZXhpc3RzIGZvciB0aGUgZ2l2ZW4gb3BlcmF0b3IuXG4gKiBAZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTE9wZXJhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKlxuICogICBDYWxsZXItPj50cmFuc2xhdGVPcGVyYXRvcnM6IG9wZXJhdG9yXG4gKlxuICogICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMT3BlcmF0b3I6IENoZWNrIGZvciBtYXRjaFxuICogICBhbHQgRm91bmQgaW4gUG9zdGdyZVNRTE9wZXJhdG9yXG4gKiAgICAgUG9zdGdyZVNRTE9wZXJhdG9yLS0+PnRyYW5zbGF0ZU9wZXJhdG9yczogUmV0dXJuIG1hdGNoaW5nIG9wZXJhdG9yXG4gKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIFNRTE9wZXJhdG9yXG4gKiAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLT4+UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3I6IENoZWNrIGZvciBtYXRjaFxuICogICAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclxuICogICAgICAgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFJldHVybiBzdHJpbmdcbiAqICAgICBlbHNlIE5vdCBmb3VuZFxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogVGhyb3cgUXVlcnlFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9wZXJhdG9ycyhcbiAgb3BlcmF0b3I6IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuKTogU1FMT3BlcmF0b3IgfCBzdHJpbmcge1xuICBmb3IgKGNvbnN0IG9wZXJhdG9ycyBvZiBbVHlwZU9STU9wZXJhdG9yLCBUeXBlT1JNR3JvdXBPcGVyYXRvcl0pIHtcbiAgICBjb25zdCBlbCA9IE9iamVjdC5rZXlzKG9wZXJhdG9ycykuZmluZCgoaykgPT4gayA9PT0gb3BlcmF0b3IpO1xuICAgIGlmIChlbCkgcmV0dXJuIG9wZXJhdG9yc1tlbF07XG4gIH1cbiAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgYENvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgdHJhbnNsYXRpb24gZm9yIG9wZXJhdG9yICR7b3BlcmF0b3J9YFxuICApO1xufVxuIiwiaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBSZWdFeHAgcGF0dGVybiB0byBhIFBvc3RncmVTUUwgUE9TSVggcGF0dGVybiBzdHJpbmcuXG4gKiBAc3VtbWFyeSBBY2NlcHRzIGVpdGhlciBhIFJlZ0V4cCBvYmplY3Qgb3IgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKC9wYXR0ZXJuL2ZsYWdzKSBhbmQgcmV0dXJucyB0aGUgcmF3IHBhdHRlcm4gY29tcGF0aWJsZSB3aXRoIFBvc3RncmVTUUwncyB+IGFuZCB+KiBvcGVyYXRvcnMuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IGpzUmVnZXggSmF2YVNjcmlwdCBSZWdFeHAgb2JqZWN0IG9yIHBhdHRlcm4gc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBQb3N0Z3JlU1FMLWNvbXBhdGlibGUgcmVnZXggcGF0dGVybiBzdHJpbmcuXG4gKiBAZnVuY3Rpb24gY29udmVydEpzUmVnZXhUb1Bvc3RncmVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBVdGlscyBhcyBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqICAgQXBwLT4+VXRpbHM6IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyhSZWdFeHAoXCJmb28uKlwiLFwiaVwiKSlcbiAqICAgVXRpbHMtPj5VdGlsczogUGFyc2Ugc3RyaW5nIG9yIHVzZSBSZWdFeHAuc291cmNlXG4gKiAgIFV0aWxzLS0+PkFwcDogXCJmb28uKlwiXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMoanNSZWdleDogUmVnRXhwIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcnhwID0gbmV3IFJlZ0V4cCgvXlxcLyguKylcXC8oXFx3KykkL2cpO1xuICBpZiAodHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJ4cC5leGVjKGpzUmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgWywgcF0gPSBtYXRjaDtcbiAgICAgIGpzUmVnZXggPSBwO1xuICAgIH1cbiAgfVxuICBjb25zdCByZWdleCA9IHR5cGVvZiBqc1JlZ2V4ID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChqc1JlZ2V4KSA6IGpzUmVnZXg7XG5cbiAgY29uc3QgcGF0dGVybiA9IHJlZ2V4LnNvdXJjZTtcblxuICByZXR1cm4gcGF0dGVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0RWFnZXJSZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbik6IHsgbm9uRWFnZXI6IHN0cmluZ1tdOyByZWxhdGlvbnM6IHN0cmluZ1tdIH0ge1xuICBsZXQgaW5zdGFuY2U6IE07XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgbSgpO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGluc3RhbnRpYXRlIG1vZGVsICR7bS5uYW1lfSBmb3IgZWFnZXIgcmVsYXRpb24gY2FsY3VsYXRpb246ICR7ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCByZWxzID0gUmVwb3NpdG9yeS5yZWxhdGlvbnMobSk7XG4gIGNhY2hlW20ubmFtZV0gPSBjYWNoZVttLm5hbWVdIHx8IHVuZGVmaW5lZDtcbiAgaWYgKGNhY2hlW20ubmFtZV0pIHtcbiAgICByZXR1cm4gY2FjaGVbbS5uYW1lXTtcbiAgfVxuICBjb25zdCByZWxhdGlvbnMgPSByZWxzLnJlZHVjZShcbiAgICAoYWNjdW06IHsgcmVsYXRpb25zOiBzdHJpbmdbXTsgbm9uRWFnZXI6IHN0cmluZ1tdIH0sIGF0dHIpID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OKSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGF0dHIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgICFkZWNvcmF0b3JzIHx8XG4gICAgICAgICFkZWNvcmF0b3JzLmRlY29yYXRvcnMgfHxcbiAgICAgICAgIWRlY29yYXRvcnMuZGVjb3JhdG9ycy5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGRlY29yYXRvcnMgZm91bmQgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YFxuICAgICAgICApO1xuICAgICAgaWYgKGRlY29yYXRvcnMuZGVjb3JhdG9ycy5sZW5ndGggPiAxKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgZGVjb3JhdG9ycyBmb3VuZCBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICBjb25zdCBkZWNvcmF0b3I6IGFueSA9IGRlY29yYXRvcnMuZGVjb3JhdG9yc1swXTtcbiAgICAgIGNvbnN0IGVhZ2VyID0gZGVjb3JhdG9yLnByb3BzLnBvcHVsYXRlO1xuICAgICAgbGV0IGNsYXp6ID0gZGVjb3JhdG9yLnByb3BzLmNsYXNzO1xuICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIikgY2xhenogPSBNb2RlbC5nZXQoY2xhenopIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lKSBjbGF6eiA9IGNsYXp6KCk7XG4gICAgICBpZiAoIWNsYXp6KVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgY2xhc3MgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YFxuICAgICAgICApO1xuXG4gICAgICBpZiAoIWVhZ2VyKSB7XG4gICAgICAgIGFjY3VtLm5vbkVhZ2VyLnB1c2goYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bS5yZWxhdGlvbnMucHVzaChhdHRyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjY3VtLnJlbGF0aW9ucy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMoY2xhenosIGNhY2hlKTtcbiAgICAgICAgaWYgKG5vbkVhZ2VyLmxlbmd0aCAmJiBhY2N1bS5yZWxhdGlvbnMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICBjb25zdCBub25FYWdlclJlbGF0aW9ucyA9IG5vbkVhZ2VyLm1hcCgobmUpID0+IGAke2F0dHJ9LiR7bmV9YCk7XG4gICAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaCguLi5ub25FYWdlclJlbGF0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5yZWxhdGlvbnMucHVzaCguLi5yZWxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7IG5vbkVhZ2VyOiBbXSwgcmVsYXRpb25zOiBbXSB9XG4gICk7XG4gIGNhY2hlW20ubmFtZV0gPSByZWxhdGlvbnM7XG4gIHJldHVybiByZWxhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IHNwbGl0RWFnZXJSZWxhdGlvbnMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhdGVtZW50IGJ1aWxkZXIgZm9yIFR5cGVPUk0tYmFja2VkIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZsdWVudCBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIFNRTCBxdWVyaWVzIHZpYSBUeXBlT1JNJ3MgU2VsZWN0UXVlcnlCdWlsZGVyIHdpdGggdHlwZSBzYWZldHkgYW5kIERlY2FmLnRzIGFic3RyYWN0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZSByZXR1cm5lZCBmcm9tIGV4ZWN1dGlvbi5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBjbGFzcyBUeXBlT1JNU3RhdGVtZW50XG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2luZyBUeXBlT1JNU3RhdGVtZW50XG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgVHlwZU9STVN0YXRlbWVudDxVc2VyLCBVc2VyW10+KGFkYXB0ZXIpO1xuICogY29uc3QgdXNlcnMgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGU8VXNlcj4oJ2FnZScpLmd0KDE4KSlcbiAqICAgLm9yZGVyQnkoJ2xhc3ROYW1lJywgJ2FzYycpXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFN0YXRlbWVudDxcbiAgVHlwZU9STVF1ZXJ5PE0+LFxuICBNLFxuICBSXG4+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFkYXB0ZXIhOiBUeXBlT1JNQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcikge1xuICAgIHN1cGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBUeXBlT1JNIFNlbGVjdFF1ZXJ5QnVpbGRlciBmcm9tIHRoZSBzdGF0ZW1lbnQuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBUeXBlT1JNLWJhY2tlZCBxdWVyeSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1R5cGVPUk1RdWVyeX0gVGhlIGJ1aWx0IFR5cGVPUk0gcXVlcnkgY29udGFpbmVyLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgYXJlIGludmFsaWQgcXVlcnkgY29uZGl0aW9ucy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBidWlsZCgpXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogSW5pdGlhbGl6ZSBxdWVyeVxuICAgKiAgIFN0YXRlbWVudC0+PlJlcG9zaXRvcnk6IEdldCB0YWJsZSBuYW1lXG4gICAqICAgUmVwb3NpdG9yeS0tPj5TdGF0ZW1lbnQ6IFJldHVybiB0YWJsZSBuYW1lXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgYmFzZSBxdWVyeVxuICAgKlxuICAgKiAgIGFsdCBIYXMgc2VsZWN0U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQWRkIGNvbHVtbnMgdG8gcXVlcnlcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIHdoZXJlQ29uZGl0aW9uXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBjb21iaW5lZCBjb25kaXRpb24gd2l0aCB0YWJsZVxuICAgKiAgICAgU3RhdGVtZW50LT4+cGFyc2VDb25kaXRpb246IFBhcnNlIGNvbmRpdGlvblxuICAgKiAgICAgcGFyc2VDb25kaXRpb24tLT4+U3RhdGVtZW50OiBSZXR1cm4gcGFyc2VkIGNvbmRpdGlvbnNcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQWRkIGNvbmRpdGlvbnMgdG8gcXVlcnlcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9yZGVyQnlTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgb3JkZXJCeSB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgbGltaXRTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBTZXQgbGltaXRcbiAgICogICBlbHNlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFVzZSBkZWZhdWx0IGxpbWl0XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBvZmZzZXRTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBTZXQgb2Zmc2V0XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGQoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgbSA9IG5ldyB0aGlzLmZyb21TZWxlY3RvcigpO1xuXG4gICAgY29uc3QgcTogVHlwZU9STVF1ZXJ5PE0sIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPj4gPSB7XG4gICAgICBxdWVyeTogdGhpcy5hZGFwdGVyLmNsaWVudFxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICBxLnF1ZXJ5ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICBxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+XG4gICAgICApLnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuXG4gICAgbGV0IG9yZGVyQnlBcmdzOiBbc3RyaW5nLCBcIkRFU0NcIiB8IFwiQVNDXCJdO1xuICAgIGlmICghdGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICBvcmRlckJ5QXJncyA9IFtcbiAgICAgICAgYCR7dGFibGVOYW1lfS4ke2ZpbmRQcmltYXJ5S2V5KG0pLmlkIGFzIHN0cmluZ31gLFxuICAgICAgICBPcmRlckRpcmVjdGlvbi5BU0MudG9VcHBlckNhc2UoKSBhcyBcIkFTQ1wiLFxuICAgICAgXTtcbiAgICBlbHNlXG4gICAgICBvcmRlckJ5QXJncyA9IFtcbiAgICAgICAgYCR7dGFibGVOYW1lfS4ke3RoaXMub3JkZXJCeVNlbGVjdG9yWzBdIGFzIHN0cmluZ31gLFxuICAgICAgICB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1VwcGVyQ2FzZSgpIGFzIFwiREVTQ1wiIHwgXCJBU0NcIixcbiAgICAgIF07XG5cbiAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLm9yZGVyQnkoLi4ub3JkZXJCeUFyZ3MpO1xuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikubGltaXQodGhpcy5saW1pdFNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBsaW1pdCBvZiAke1R5cGVPUk1RdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KFR5cGVPUk1RdWVyeUxpbWl0KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgb2Zmc2V0XG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpXG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLnNraXAodGhpcy5vZmZzZXRTZWxlY3Rvcik7XG5cbiAgICByZXR1cm4gcSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwYWdpbmF0b3IgZm9yIHRoZSBzdGF0ZW1lbnQuXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYSBUeXBlT1JNUGFnaW5hdG9yIGZvciBwYWdpbmF0ZWQgcmVzdWx0cy5cbiAgICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBUeXBlT1JNUXVlcnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYWdpbmF0b3IuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlJ3MgYW4gZXJyb3IgYnVpbGRpbmcgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgYXN5bmMgcGFnaW5hdGU8Uj4oc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFF1ZXJ5OiBGaW5kTWFueU9wdGlvbnM8TT4gPSB7fTtcbiAgICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5LndoZXJlID0gdGhpcy5wYXJzZUNvbmRpdGlvbkZvclBhZ2luYXRpb24oXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKVxuICAgICAgICApO1xuXG4gICAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkub3JkZXIgPSB7XG4gICAgICAgICAgW3RoaXMub3JkZXJCeVNlbGVjdG9yWzBdXTogdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9TdHJpbmcoKSxcbiAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIHJldHVybiBuZXcgVHlwZU9STVBhZ2luYXRvcihcbiAgICAgICAgdGhpcy5hZGFwdGVyIGFzIGFueSxcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeSBhcyBhbnksXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgcmF3IHJlc3VsdCByb3cgdG8gYSBtb2RlbCBpbnN0YW5jZSB1c2luZyB0aGUgYWRhcHRlci5cbiAgICogQHBhcmFtIHthbnl9IHIgVGhlIHJhdyByZWNvcmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcblxuICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgLy8gZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICByYXdJbnB1dC5xdWVyeSA9IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5zZXRGaW5kT3B0aW9ucyh7XG4gICAgICBsb2FkRWFnZXJSZWxhdGlvbnM6IHRydWUsXG4gICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55O1xuICAgIC8vIH1cbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBzZXF1ZW5jZV9uYW1lLCBzdGFydF92YWx1ZSwgbWluaW11bV92YWx1ZSwgaW5jcmVtZW50IEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgbm8gc2VxdWVuY2UgZXhpc3RzLCBmb3JjZSBhIGNsZWFyLCBjb25zaXN0ZW50IGVycm9yIGZvciBjYWxsZXJzXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93cykgfHwgcm93cy5sZW5ndGggPT09IDApXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBTZXF1ZW5jZSAke25hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgLy8gaW5mb3JtYXRpb25fc2NoZW1hIGRvZXMgbm90IGV4cG9zZSB0aGUgY3VycmVudCBydW50aW1lIHZhbHVlIHJlbGlhYmx5OyBmYWxsIGJhY2sgdG8gc3RhcnRfdmFsdWVcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbMF0gYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIHJvd1tcImN1cnJlbnRfdmFsdWVcIl0gPz8gcm93W1wibGFzdF92YWx1ZVwiXSA/PyByb3dbXCJzdGFydF92YWx1ZVwiXTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKGNhbmRpZGF0ZSBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMuYWRhcHRlci5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIHtAbGluayBTZXF1ZW5jZX0gdmFsdWVcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgcGFyc2UodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgcmV0dXJuIFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLnR5cGUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBpbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2VxdWVuY2Ugc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IGN1cnJlbnRcbiAgICogQHBhcmFtIGNvdW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5jcmVtZW50KFxuICAgIGN1cnJlbnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICBjb3VudD86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgdHlwZSwgaW5jcmVtZW50QnksIG5hbWUsIHN0YXJ0V2l0aCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmICh0eXBlICE9PSBcIk51bWJlclwiICYmIHR5cGUgIT09IFwiQmlnSW50XCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENhbm5vdCBpbmNyZW1lbnQgc2VxdWVuY2Ugb2YgdHlwZSAke3R5cGV9IHdpdGggJHtjb3VudH1gXG4gICAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpIEFTIG5leHR2YWw7YCxcbiAgICAgICAgdmFsdWVzOiBbbmFtZV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHZhbCA9IEFycmF5LmlzQXJyYXkocm93cykgJiYgcm93c1swXSA/IHJvd3NbMF1bXCJuZXh0dmFsXCJdIDogcm93cztcbiAgICAgIHJldHVybiB2YWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIGlmICghbmFtZSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBpbmNyZW1lbnQgc2VxdWVuY2Ugd2l0aG91dCBhIG5hbWU6ICR7bmFtZX1gXG4gICAgICAgICk7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNlcXVlbmNlIGlmIG1pc3NpbmcuIElkZW50aWZpZXJzIGNhbm5vdCBiZSBwYXJhbWV0ZXJpemVkLCBzbyBxdW90ZSB0aGUgbmFtZS5cbiAgICAgIGNvbnN0IHF1b3RlZCA9IGBcIiR7bmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICR7cXVvdGVkfSBTVEFSVCBXSVRIICR7c3RhcnRXaXRofSBJTkNSRU1FTlQgQlkgJHtpbmNyZW1lbnRCeX0gTk8gQ1lDTEU7YCxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgcm93czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgbmV4dHZhbCgkMSkgQVMgbmV4dHZhbDtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsID0gQXJyYXkuaXNBcnJheShyb3dzKSAmJiByb3dzWzBdID8gcm93c1swXVtcIm5leHR2YWxcIl0gOiByb3dzO1xuICAgICAgcmV0dXJuIHZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIsIFJlcG9zaXRvcnkgYXMgTmF0aXZlUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gTW9kZWwgdXNpbmcgdGhlIFR5cGVPUk1BZGFwdGVyLCBpbmNsdWRpbmcgYnVsayBvcGVyYXRpb25zIGFuZCBxdWVyeSBidWlsZGVyIGFjY2VzcyB3aGlsZSBwcmVzZXJ2aW5nIERlY2FmLnRzIHJlcG9zaXRvcnkgc2VtYW50aWNzLlxuICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWwgdGhhdCB0aGlzIHJlcG9zaXRvcnkgd2lsbCBtYW5hZ2UuXG4gKiBAcGFyYW0ge0FkYXB0ZXI8RGF0YVNvdXJjZU9wdGlvbnMsIGFueSwgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNRmxhZ3MsIENvbnRleHQ8VHlwZU9STUZsYWdzPj59IGFkYXB0ZXIgVGhlIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgTW9kZWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS5cbiAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgYmFzZSBSZXBvc2l0b3J5LlxuICogQGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5XG4gKiBjb25zdCByZXBvID0gbmV3IFR5cGVPUk1SZXBvc2l0b3J5PFVzZXI+KGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoY3JlYXRlZC5pZCk7XG4gKlxuICogLy8gQnVsayBjcmVhdGVcbiAqIGF3YWl0IHJlcG8uY3JlYXRlQWxsKFtuZXcgVXNlcih7IG5hbWU6IFwiQVwiIH0pLCBuZXcgVXNlcih7IG5hbWU6IFwiQlwiIH0pXSk7XG4gKlxuICogLy8gVXNpbmcgdGhlIHF1ZXJ5IGJ1aWxkZXJcbiAqIGNvbnN0IHFiID0gcmVwby5xdWVyeUJ1aWxkZXIoKTtcbiAqIGNvbnN0IHJvd3MgPSBhd2FpdCBxYi53aGVyZShcIm5hbWUgPSA6bmFtZVwiLCB7IG5hbWU6IFwiQWxpY2VcIiB9KS5nZXRNYW55KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIFR5cGVPUk0vRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZShtb2RlbCwgcGspXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIC4uLmFyZ3MpXG4gKiAgIEFkYXB0ZXItPj5EQjogSU5TRVJUIC4uLlxuICogICBEQi0tPj5BZGFwdGVyOiByb3dcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByb3dcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHJldmVydChyb3csIGNsYXp6LCBwaywgaWQpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogbW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB1c2VzKFR5cGVPUk1GbGF2b3VyKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBUeXBlT1JNUXVlcnk8TSwgYW55PixcbiAgQWRhcHRlcjxcbiAgICBEYXRhU291cmNlT3B0aW9ucyxcbiAgICBhbnksXG4gICAgVHlwZU9STVF1ZXJ5LFxuICAgIFR5cGVPUk1GbGFncyxcbiAgICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbiAgPixcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBBZGFwdGVyPFxuICAgICAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgICBhbnksXG4gICAgICBUeXBlT1JNUXVlcnksXG4gICAgICBUeXBlT1JNRmxhZ3MsXG4gICAgICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbiAgICA+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSByZXBvc2l0b3J5IGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFNlbGVjdFF1ZXJ5QnVpbGRlciBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nLlxuICAgKiBAcmV0dXJuIHtRdWVyeUJ1aWxkZXI8TT59IEEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgaW5zdGFuY2UuXG4gICAqL1xuICBxdWVyeUJ1aWxkZXIoKTogUXVlcnlCdWlsZGVyPE0+IHtcbiAgICBjb25zdCByZXBvID0gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICAgIHJldHVybiByZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgVHlwZU9STSBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciB0aGUgZW50aXR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUmVwb3NpdG9yeSBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIG5hdGl2ZSBmdW5jdGlvbmFsaXR5LlxuICAgKiBAcmV0dXJuIHtOYXRpdmVSZXBvPE0+fSBBIFR5cGVPUk0gUmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICovXG4gIHR5cGVvcm1SZXBvKCk6IE5hdGl2ZVJlcG88TT4ge1xuICAgIHJldHVybiAodGhpcy5hZGFwdGVyIGFzIGFueSkuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgdGhpcy5jbGFzc1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXNzXVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIGluc2VydGlvbiB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc10sXG4gICAgICBpZCxcbiAgICAgIG1vZGVsIGFzIGFueSxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBsZXQgYzogQ29udGV4dDxUeXBlT1JNRmxhZ3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDb250ZXh0PFR5cGVPUk1GbGFncz47XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhbmQgcHJlcGFyZXMgbW9kZWxzIGZvciBidWxrIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBBcHBsaWVzIGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9ucyBhbmQgcmV0dXJucyB0cmFuc2Zvcm1lZCBtb2RlbHMgd2l0aCBjb250ZXh0IGFyZ3MgZm9yIGNyZWF0ZUFsbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgVHlwZU9STUV2ZW50U3Vic2NyaWJlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICogICBELT4+RFM6IG9ic2VydmUoYWRhcHRlciwgb3B0aW9ucylcbiAqICAgRFMtPj5EOiBpbml0aWFsaXplKClcbiAqICAgRC0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFMpXG4gKiAgIFMtLT4+RDogZW1pdHMgaW5zZXJ0L3VwZGF0ZS9yZW1vdmVcbiAqICAgRC0+Pk86IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaCB7XG4gIHByaXZhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlPzogc3RyaW5nO1xuICBwcml2YXRlIGF0dGVtcHRDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGltZW91dCA9IDUwMDApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgVHlwZU9STSBub3RpZmljYXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGNoYW5nZSBub3RpZmljYXRpb25zICh0cmFuc2xhdGVkIGZyb20gVHlwZU9STSBldmVudHMpIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgcmVjb3JkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWRzIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIFBvc3RncmVTUUxEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAgICogICBOb3RlIG92ZXIgRDogUmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbSBQb3N0Z3JlU1FMXG4gICAqICAgRC0+PkQ6IFBhcnNlIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gICAqICAgRC0+PkQ6IEV4dHJhY3QgdGFibGUsIG9wZXJhdGlvbiwgYW5kIGlkc1xuICAgKiAgIEQtPj5POiB1cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKVxuICAgKiAgIEQtPj5EOiBVcGRhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlXG4gICAqICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIGRpc3BhdGNoXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3RpZnkgb2JzZXJ2ZXJzXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpO1xuICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsb2cudmVyYm9zZShgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7b3BlcmF0aW9ufSBmb3IgJHt0YWJsZX1gKTtcbiAgICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIG5vdGlmaWNhdGlvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoZXIgYW5kIHN1YnNjcmliZXMgdG8gVHlwZU9STSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgb24gdGhlIERhdGFTb3VyY2UgYW5kIGxvZ3MgdGhlIHN1YnNjcmlwdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgRC0+PlM6IENhbGwgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAqICAgUy0+PlM6IENoZWNrIGFkYXB0ZXIgYW5kIG5hdGl2ZVxuICAgKiAgIGFsdCBObyBhZGFwdGVyIG9yIG5hdGl2ZVxuICAgKiAgICAgUy0tPj5TOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUy0+PkRTOiBpbml0aWFsaXplKClcbiAgICogICBTLT4+RFM6IHN1YnNjcmliZXJzLnB1c2goVHlwZU9STUV2ZW50U3Vic2NyaWJlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgRFMtLT4+UzogU3Vic2NyaXB0aW9uIGVzdGFibGlzaGVkXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVzb2x2ZXNcbiAgICogICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBzdWJzY3JpcHRpb25cbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEUy0tPj5TOiBFcnJvclxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlamVjdHNcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHN1YnNjcmliZVRvVHlwZU9STSh0aGlzOiBUeXBlT1JNRGlzcGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLmNsaWVudC5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHRoaXMuYWRhcHRlci5jbGllbnQuc3Vic2NyaWJlcnMucHVzaChcbiAgICAgICAgICBuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIuYmluZCh0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAgICAuY2FsbCh0aGlzKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWJzY3JpYmVkIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9uc2ApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnM6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFdoZW4gbm8gYWRhcHRlciBpcyBvYnNlcnZlZCAoZS5nLiwgaW4gdW5pdCB0ZXN0cyBpbnZva2luZyB0aGUgaGFuZGxlciBkaXJlY3RseSksXG4gICAgLy8gc2tpcCBub3RpZnlpbmcgb2JzZXJ2ZXJzIGluc3RlYWQgb2YgdGhyb3dpbmcsIHNvIHRoZSBkaXNwYXRjaGVyIGNhbiBwcm9jZWVkLlxuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgc2VtYW50aWNzIG9mIFwiYmVzdCBlZmZvcnRcIiBub3RpZmljYXRpb25zLlxuICAgIC8vIERlbGVnYXRlIHRvIGJhc2UgaW1wbGVtZW50YXRpb24gd2hlbiBhbiBhZGFwdGVyIGlzIHByZXNlbnQuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3RhYmxlfToke29wZXJhdGlvbn1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgY2xhc3MgcHJvcGVydHkgYXMgYSBkYXRhYmFzZSBjb2x1bW4uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBtdWx0aXBsZSBvdmVybG9hZHMgdG8gZGVmaW5lIGNvbHVtbiBtZXRhZGF0YSBzdWNoIGFzIHR5cGUsIGxlbmd0aCwgcHJlY2lzaW9uLCB3aWR0aCwgZW51bSwgc2V0LCBoc3RvcmUsIGFuZCBlbWJlZGRlZCB0eXBlcy4gQWdncmVnYXRlcyB3aXRoIGV4aXN0aW5nIG1ldGFkYXRhIHRvIGF2b2lkIGR1cGxpY2F0ZXMgYW5kIGRlbGVnYXRlcyB0byBUeXBlT1JNIG1ldGFkYXRhIHN0b3JhZ2UuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKiBAZnVuY3Rpb24gQ29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uV2l0aFdpZHRoT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFdpdGhXaWR0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aFdpZHRoT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5OdW1lcmljT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbk51bWVyaWNPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZX0gdHlwZSBUeXBlIG9mIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0ge0NvbHVtbkVudW1PcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJlbnVtXCIsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uRW51bU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uRW51bU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcInNpbXBsZS1lbnVtXCIsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uRW51bU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uRW51bU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcInNldFwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZX0gdHlwZSBUeXBlIG9mIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0ge0NvbHVtbkhzdG9yZU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgY29sdW1uLlxuICovXG4vLyBAdHMtZXhwZWN0LWVycm9yIHNvbWUgdHlwZW9ybSB0aGluZ1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJoc3RvcmVcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5Ic3RvcmVPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqXG4gKiBQcm9wZXJ0eSBpbiBlbnRpdHkgY2FuIGJlIG1hcmtlZCBhcyBFbWJlZGRlZCwgYW5kIG9uIHBlcnNpc3QgYWxsIGNvbHVtbnMgZnJvbSB0aGUgZW1iZWRkZWQgYXJlIG1hcHBlZCB0byB0aGVcbiAqIHNpbmdsZSB0YWJsZSBvZiB0aGUgZW50aXR5IHdoZXJlIEVtYmVkZGVkIGlzIHVzZWQuIEFuZCBvbiBoeWRyYXRpb24gYWxsIGNvbHVtbnMgd2hpY2ggc3VwcG9zZWQgdG8gYmUgaW4gdGhlXG4gKiBlbWJlZGRlZCB3aWxsIGJlIG1hcHBlZCB0byBpdCBmcm9tIHRoZSBzaW5nbGUgdGFibGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGFueSk6IEZ1bmN0aW9ufSB0eXBlIFR5cGUgb2YgdGhlIGVtYmVkZGVkLlxuICogQHBhcmFtIHtDb2x1bW5FbWJlZGRlZE9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgZW1iZWRkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgdHlwZTogKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uLFxuICBvcHRpb25zPzogQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZXxDb2x1bW5PcHRpb25zfGZ1bmN0aW9uKGFueSk6IEZ1bmN0aW9ufSBbdHlwZU9yT3B0aW9uc10gRWl0aGVyIGFuIGV4cGxpY2l0IGNvbHVtbiB0eXBlIG9yIHRoZSBjb2x1bW4gb3B0aW9ucy5cbiAqIEBwYXJhbSB7Q29sdW1uT3B0aW9uc30gW29wdGlvbnNdIFRoZSBjb2x1bW4gb3B0aW9ucyB3aGVuIGEgdHlwZSBpcyBzcGVjaWZpZWQuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHwgKCh0eXBlPzogYW55KSA9PiBGdW5jdGlvbilcbiAgICB8IENvbHVtblR5cGVcbiAgICB8IChDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zKSxcbiAgb3B0aW9ucz86IENvbHVtbk9wdGlvbnMgJiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IG9iamVjdCwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIGxldCB0eXBlOiBDb2x1bW5UeXBlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICB0eXBlID0gPENvbHVtblR5cGU+dHlwZU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHR5cGVPck9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSA8Q29sdW1uT3B0aW9ucz50eXBlT3JPcHRpb25zO1xuICAgICAgdHlwZSA9IHR5cGVPck9wdGlvbnMudHlwZTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgQ29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpXG4gICAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgICB0eXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHR5cGUgaW4gY29sdW1uIG9wdGlvbnMgdGhlbiBzZXQgdHlwZSBmcm9tIGZpcnN0IGZ1bmN0aW9uIGFyZ3VtZW50LCBvciBndWVzc2VkIG9uZVxuICAgIGlmICghb3B0aW9ucy50eXBlICYmIHR5cGUpIG9wdGlvbnMudHlwZSA9IHR5cGU7XG5cbiAgICAvLyBzcGVjaWZ5IEhTVE9SRSB0eXBlIGlmIGNvbHVtbiBpcyBIU1RPUkVcbiAgICBpZiAob3B0aW9ucy50eXBlID09PSBcImhzdG9yZVwiICYmICFvcHRpb25zLmhzdG9yZVR5cGUpXG4gICAgICBvcHRpb25zLmhzdG9yZVR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBPYmplY3QgPyBcIm9iamVjdFwiIDogXCJzdHJpbmdcIjtcblxuICAgIGlmICh0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyByZWdpc3RlciBhbiBlbWJlZGRlZFxuICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVtYmVkZGVkcy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBpc0FycmF5OiByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBBcnJheSB8fCBvcHRpb25zLmFycmF5ID09PSB0cnVlLFxuICAgICAgICBwcmVmaXg6IG9wdGlvbnMucHJlZml4ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnByZWZpeCA6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICB0eXBlOiB0eXBlT3JPcHRpb25zIGFzICh0eXBlPzogYW55KSA9PiBGdW5jdGlvbixcbiAgICAgIH0gYXMgRW1iZWRkZWRNZXRhZGF0YUFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZWdpc3RlciBhIHJlZ3VsYXIgY29sdW1uXG5cbiAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgICBpZiAoIW9wdGlvbnMudHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAgIC8vIGNyZWF0ZSB1bmlxdWVcbiAgICAgIGlmIChvcHRpb25zLnVuaXF1ZSA9PT0gdHJ1ZSlcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnVuaXF1ZXMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgY29sdW1uczogW3Byb3BlcnR5TmFtZV0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICAgIG1ldGFkYXRhLnJlbGF0aW9ucyxcbiAgICAgICAgb3B0aW9ucy51bmlxdWUgPyBtZXRhZGF0YS5pbmRpY2VzIDogdW5kZWZpbmVkXG4gICAgICApO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuZ2VuZXJhdGVkID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYW4gYXV0by1tYW5hZ2VkIHVwZGF0ZSB0aW1lc3RhbXAgY29sdW1uLlxuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgY29sdW1uIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIGRhdGFiYXNlL09STSB3aGVuZXZlciB0aGUgcm93IGlzIG1vZGlmaWVkLiBXcmFwcyBUeXBlT1JNIG1ldGFkYXRhIHJlZ2lzdHJhdGlvbiB0byBhZ2dyZWdhdGUgd2l0aCBleGlzdGluZyBjb2x1bW4gbWV0YWRhdGEgd2hlbiBwcmVzZW50LlxuICogQHBhcmFtIHtDb2x1bW5PcHRpb25zfSBbb3B0aW9uc10gT3B0aW9uYWwgVHlwZU9STSBjb2x1bW4gb3B0aW9ucy5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBVcGRhdGVEYXRlQ29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldiBhcyBEZXZlbG9wZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBVcGRhdGVEYXRlQ29sdW1uXG4gKiAgIHBhcnRpY2lwYW50IE1ldGEgYXMgVHlwZU9STSBNZXRhZGF0YVxuICogICBEZXYtPj5EZWNvcjogQFVwZGF0ZURhdGVDb2x1bW4ob3B0aW9ucylcbiAqICAgRGVjb3ItPj5EZXY6IHJldHVybnMgUHJvcGVydHlEZWNvcmF0b3JcbiAqICAgRGV2LT4+RGVjb3I6IGFwcGx5IG9uIHRhcmdldCBwcm9wZXJ0eVxuICogICBEZWNvci0+Pk1ldGE6IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKC4uLiwgXCJ1cGRhdGVEYXRlXCIsIC4uLilcbiAqICAgTWV0YS0tPj5EZWNvcjogY29sdW1uIG1ldGFkYXRhIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZGF0ZURhdGVDb2x1bW4ob3B0aW9ucz86IENvbHVtbk9wdGlvbnMpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwidXBkYXRlRGF0ZVwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGFuIGF1dG8tbWFuYWdlZCBjcmVhdGlvbiB0aW1lc3RhbXAgY29sdW1uLlxuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgY29sdW1uIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgZGF0YWJhc2UvT1JNIHdoZW4gdGhlIHJvdyBpcyBmaXJzdCBjcmVhdGVkLiBXcmFwcyBUeXBlT1JNIG1ldGFkYXRhIHJlZ2lzdHJhdGlvbiB0byBhZ2dyZWdhdGUgd2l0aCBleGlzdGluZyBjb2x1bW4gbWV0YWRhdGEgd2hlbiBwcmVzZW50LlxuICogQHBhcmFtIHtDb2x1bW5PcHRpb25zfSBbb3B0aW9uc10gT3B0aW9uYWwgVHlwZU9STSBjb2x1bW4gb3B0aW9ucy5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldiBhcyBEZXZlbG9wZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBDcmVhdGVEYXRlQ29sdW1uXG4gKiAgIHBhcnRpY2lwYW50IE1ldGEgYXMgVHlwZU9STSBNZXRhZGF0YVxuICogICBEZXYtPj5EZWNvcjogQENyZWF0ZURhdGVDb2x1bW4ob3B0aW9ucylcbiAqICAgRGVjb3ItPj5EZXY6IHJldHVybnMgUHJvcGVydHlEZWNvcmF0b3JcbiAqICAgRGV2LT4+RGVjb3I6IGFwcGx5IG9uIHRhcmdldCBwcm9wZXJ0eVxuICogICBEZWNvci0+Pk1ldGE6IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKC4uLiwgXCJjcmVhdGVEYXRlXCIsIC4uLilcbiAqICAgTWV0YS0tPj5EZWNvcjogY29sdW1uIG1ldGFkYXRhIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZURhdGVDb2x1bW4ob3B0aW9ucz86IENvbHVtbk9wdGlvbnMpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwiY3JlYXRlRGF0ZVwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3QodmFsOiBhbnkpOiB2YWwgaXMgb2JqZWN0IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICogV2UgY2Fubm90IHVzZSBpbnN0YW5jZW9mIGJlY2F1c2UgaXQgaGFzIHByb2JsZW1zIHdoZW4gcnVubmluZyBvbiBkaWZmZXJlbnQgY29udGV4dHMuXG4gICAqIEFuZCB3ZSBkb24ndCBzaW1wbHkgdXNlIHR5cGVvZiBiZWNhdXNlIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLlxuICAgKi9cbiAgc3RhdGljIGlzT2JqZWN0V2l0aE5hbWUodmFsOiBhbnkpOiB2YWwgaXMgb2JqZWN0ICYgeyBuYW1lOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbFtcIm5hbWVcIl0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlMSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTIgVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVLCBWPih0YXJnZXQ6IFQsIHNvdXJjZTE6IFUsIHNvdXJjZTI6IFYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UzIFRoZSB0aGlyZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVLCBWLCBXPihcbiAgICB0YXJnZXQ6IFQsXG4gICAgc291cmNlMTogVSxcbiAgICBzb3VyY2UyOiBWLFxuICAgIHNvdXJjZTM6IFdcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlcyBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGFzc2lnbih0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogYW55W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlKSkge1xuICAgICAgICAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vXG4gIC8vIC8qKlxuICAvLyAgKiBDb252ZXJ0cyBNaXhlZExpc3Q8VD4gdG8gc3RyaWN0bHkgYW4gYXJyYXkgb2YgaXRzIFQgaXRlbXMuXG4gIC8vICAqL1xuICAvLyBzdGF0aWMgbWl4ZWRMaXN0VG9BcnJheTxUPihsaXN0OiBNaXhlZExpc3Q8VD4pOiBUW10ge1xuICAvLyAgIGlmIChsaXN0ICE9PSBudWxsICYmIHR5cGVvZiBsaXN0ID09PSBcIm9iamVjdFwiKSB7XG4gIC8vICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKFxuICAvLyAgICAgICAoa2V5KSA9PiAobGlzdCBhcyB7IFtrZXk6IHN0cmluZ106IFQgfSlba2V5XVxuICAvLyAgICAgKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIGxpc3Q7XG4gIC8vICAgfVxuICAvLyB9XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oYW55KTogT2JqZWN0VHlwZTxUPn0gdHlwZUZ1bmN0aW9uT3JUYXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oVCk6IGFueX0gaW52ZXJzZVNpZGVPck9wdGlvbnNcbiAqIEBwYXJhbSB7UmVsYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uZVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICByZWxhdGlvblR5cGU6IFwib25lLXRvLW9uZVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuLyoqXG4gKiBBIG9uZS10by1tYW55IHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLFxuICogYnV0IEVudGl0eTIgaGFzIG9ubHkgb25lIEVudGl0eTEuIEVudGl0eTIgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mIEVudGl0eTEgb24gaXRzXG4gKiBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKGFueSk6IE9iamVjdFR5cGU8VD59IHR5cGVGdW5jdGlvbk9yVGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKFQpOiBhbnl9IGludmVyc2VTaWRlXG4gKiBAcGFyYW0ge1JlbGF0aW9uT3B0aW9uc30gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGU6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICByZWxhdGlvblR5cGU6IFwib25lLXRvLW1hbnlcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKGFueSk6IE9iamVjdFR5cGU8VD59IHR5cGVGdW5jdGlvbk9yVGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKFQpOiBhbnl9IGludmVyc2VTaWRlT3JPcHRpb25zXG4gKiBAcGFyYW0ge1JlbGF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZU9yT3B0aW9ucz86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpIHwgUmVsYXRpb25PcHRpb25zLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIE5vcm1hbGl6ZSBwYXJhbWV0ZXJzLlxuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1vbmVcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihhbnkpOiBPYmplY3RUeXBlPFQ+fSB0eXBlRnVuY3Rpb25PclRhcmdldFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihUKTogYW55fSBpbnZlcnNlU2lkZU9yT3B0aW9uc1xuICogQHBhcmFtIHtSZWxhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1tYW55XCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgcHJpbWFyeSBrZXkgd2l0aCBnZW5lcmF0ZWQgdmFsdWUuXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBwcmltYXJ5IGNvbHVtbiB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBkYXRhYmFzZS9PUk0uIE92ZXJsb2FkcyBhbGxvdyBzZWxlY3RpbmcgdGhlIGdlbmVyYXRpb24gc3RyYXRlZ3kgYW5kIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKiBAZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtblxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgb3B0aW9uczogUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJ1dWlkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJyb3dpZFwiLFxuICBvcHRpb25zPzogUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcImlkZW50aXR5XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFRoaXMgY29sdW1uIGNyZWF0ZXMgYW4gaW50ZWdlciBQUklNQVJZIENPTFVNTiB3aXRoIGdlbmVyYXRlZCBzZXQgdG8gdHJ1ZS5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBwcm9wZXJ0eSBhcyBhIGdlbmVyYXRlZCBwcmltYXJ5IGtleSB3aXRoIHNwZWNpZmljIHN0cmF0ZWd5LlxuICogQHN1bW1hcnkgTm9ybWFsaXplcyBvdmVybG9hZHMsIGluZmVycyBjb2x1bW4gdHlwZSBmcm9tIHN0cmF0ZWd5IHdoZW4gYWJzZW50LCBzZXRzIHByaW1hcnkgZmxhZywgYWdncmVnYXRlcyBjb2x1bW4gbWV0YWRhdGEsIGFuZCByZWdpc3RlcnMgZ2VuZXJhdGlvbiBzdHJhdGVneSBpbiBUeXBlT1JNIG1ldGFkYXRhLlxuICogQHBhcmFtIHsoJ2luY3JlbWVudCd8J3V1aWQnfCdyb3dpZCd8J2lkZW50aXR5J3xQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zfFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnMpfSBbc3RyYXRlZ3lPck9wdGlvbnNdIFRoZSBnZW5lcmF0aW9uIHN0cmF0ZWd5IG9yIGFuIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zfFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnN9IFttYXliZU9wdGlvbnNdIE9wdGlvbnMgdG8gY29tcGxlbWVudCB0aGUgY2hvc2VuIHN0cmF0ZWd5LlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbihzdHJhdGVneU9yT3B0aW9ucywgbWF5YmVPcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+RGVjb3I6IGRlcml2ZSBvcHRpb25zLCBpbmZlciB0eXBlIGJ5IHN0cmF0ZWd5XG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uKVxuICogICBEZWNvci0+Pk1ldGE6IGdlbmVyYXRpb25zLnB1c2goeyBzdHJhdGVneSB9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3lPck9wdGlvbnM/OlxuICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgIHwgXCJ1dWlkXCJcbiAgICB8IFwicm93aWRcIlxuICAgIHwgXCJpZGVudGl0eVwiXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzpcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IG9wdGlvbnM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgbGV0IHN0cmF0ZWd5OiBcImluY3JlbWVudFwiIHwgXCJ1dWlkXCIgfCBcInJvd2lkXCIgfCBcImlkZW50aXR5XCI7XG4gIGlmIChzdHJhdGVneU9yT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RyYXRlZ3lPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICBzdHJhdGVneSA9IHN0cmF0ZWd5T3JPcHRpb25zIGFzXG4gICAgICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgICAgICB8IFwidXVpZFwiXG4gICAgICAgIHwgXCJyb3dpZFwiXG4gICAgICAgIHwgXCJpZGVudGl0eVwiO1xuXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KHN0cmF0ZWd5T3JPcHRpb25zKSkge1xuICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgfVxuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QobWF5YmVPcHRpb25zKSkgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiIHx8IHN0cmF0ZWd5ID09PSBcImlkZW50aXR5XCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInJvd2lkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG4gIFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBwcmltYXJ5IGtleSBjb2x1bW4ncyBvcHRpb25zLlxuICogSWYgc3BlY2lmaWVkLCB0aGUgbnVsbGFibGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gZmFsc2UuXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIGEgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHN1bW1hcnkgRXh0ZW5kcyBUeXBlT1JNIENvbHVtbk9wdGlvbnMgZW5mb3JjaW5nIHRoYXQgcHJpbWFyeSBjb2x1bW5zIGNhbm5vdCBiZSBudWxsYWJsZS5cbiAqIEB0ZW1wbGF0ZSBUIEV4dGVuZHMgQ29sdW1uT3B0aW9ucyB0byBkZWZpbmUgcHJpbWFyeS1zcGVjaWZpYyBvcHRpb25zLlxuICogQGludGVyZmFjZSBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgdHlwZSBQcmltYXJ5Q29sdW1uT3B0aW9ucyA9IENvbHVtbk9wdGlvbnMgJiB7IG51bGxhYmxlPzogZmFsc2UgfTtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBwcm9wZXJ0eSBhcyBhIHByaW1hcnkga2V5IGNvbHVtbi5cbiAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5vbi1udWxsYWJsZSBjb2x1bW4gYXMgUFJJTUFSWSBLRVkgaW4gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuIFN1cHBvcnRzIG9wdGlvbmFsIHR5cGUgYW5kIGdlbmVyYXRpb24gc3RyYXRlZ2llcyB2aWEgQ29sdW1uT3B0aW9ucy5cbiAqIEBwYXJhbSB7UHJpbWFyeUNvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBDb2x1bW4gb3B0aW9ucyB3aGVuIG5vIGV4cGxpY2l0IHR5cGUgaXMgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKiBAZnVuY3Rpb24gUHJpbWFyeUNvbHVtblxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGU/OiBDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgcHJpbWFyeSBrZXkgY29sdW1uIHdpdGggb3B0aW9uYWwgZXhwbGljaXQgdHlwZS5cbiAqIEBzdW1tYXJ5IE5vcm1hbGl6ZXMgcGFyYW1ldGVycywgZW5mb3JjZXMgbm9uLW51bGxhYmlsaXR5LCBzZXRzIHByaW1hcnkgZmxhZywgYWdncmVnYXRlcyBjb2x1bW4gbWV0YWRhdGEsIGFuZCByZWdpc3RlcnMgZ2VuZXJhdGlvbiBzdHJhdGVneSB3aGVuIHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZXxQcmltYXJ5Q29sdW1uT3B0aW9uc30gW3R5cGVPck9wdGlvbnNdIEVpdGhlciBhbiBleHBsaWNpdCBjb2x1bW4gdHlwZSBvciB0aGUgY29sdW1uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge1ByaW1hcnlDb2x1bW5PcHRpb25zfSBbb3B0aW9uc10gVGhlIGNvbHVtbiBvcHRpb25zIHdoZW4gYSB0eXBlIGlzIHNwZWNpZmllZC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldiBhcyBEZXZlbG9wZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBQcmltYXJ5Q29sdW1uXG4gKiAgIHBhcnRpY2lwYW50IE1ldGEgYXMgVHlwZU9STSBNZXRhZGF0YVxuICogICBEZXYtPj5EZWNvcjogQFByaW1hcnlDb2x1bW4odHlwZU9yT3B0aW9ucywgb3B0aW9ucylcbiAqICAgRGVjb3ItPj5EZXY6IHJldHVybnMgUHJvcGVydHlEZWNvcmF0b3JcbiAqICAgRGV2LT4+RGVjb3I6IGFwcGx5IG9uIHRhcmdldCBwcm9wZXJ0eVxuICogICBEZWNvci0+PkRlY29yOiBub3JtYWxpemUgcGFyYW1zLCBlbmZvcmNlIG5vbi1udWxsYWJsZVxuICogICBEZWNvci0+Pk1ldGE6IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKC4uLilcbiAqICAgYWx0IG9wdGlvbnMuZ2VuZXJhdGVkXG4gKiAgICAgRGVjb3ItPj5NZXRhOiBnZW5lcmF0aW9ucy5wdXNoKHsgc3RyYXRlZ3kgfSlcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogQ29sdW1uVHlwZSB8IFByaW1hcnlDb2x1bW5PcHRpb25zLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIGxldCB0eXBlOiBDb2x1bW5UeXBlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBTdHJpbmcgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IEJvb2xlYW4gfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IE51bWJlclxuICAgICkge1xuICAgICAgdHlwZSA9IHR5cGVPck9wdGlvbnMgYXMgQ29sdW1uVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIDxQcmltYXJ5Q29sdW1uT3B0aW9ucz50eXBlT3JPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUHJpbWFyeUNvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKSB0eXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHR5cGUgaW4gY29sdW1uIG9wdGlvbnMgdGhlbiBzZXQgdHlwZSBmcm9tIGZpcnN0IGZ1bmN0aW9uIGFyZ3VtZW50LCBvciBndWVzc2VkIG9uZVxuICAgIGlmICghb3B0aW9ucy50eXBlICYmIHR5cGUpIG9wdGlvbnMudHlwZSA9IHR5cGU7XG5cbiAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgIGlmICghb3B0aW9ucy50eXBlKSB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcblxuICAgIC8vIGNoZWNrIGlmIGNvbHVtbiBpcyBub3QgbnVsbGFibGUsIGJlY2F1c2Ugd2UgY2Fubm90IGFsbG93IGEgcHJpbWFyeSBrZXkgdG8gYmUgbnVsbGFibGVcbiAgICBpZiAob3B0aW9ucy5udWxsYWJsZSlcbiAgICAgIHRocm93IG5ldyBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcblxuICAgIC8vIGV4cGxpY2l0bHkgc2V0IGEgcHJpbWFyeSB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgc3RyYXRlZ3k6XG4gICAgICAgICAgdHlwZW9mIG9wdGlvbnMuZ2VuZXJhdGVkID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IG9wdGlvbnMuZ2VuZXJhdGVkXG4gICAgICAgICAgICA6IFwiaW5jcmVtZW50XCIsXG4gICAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgRW50aXR5T3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IFRhYmxlTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9UYWJsZU1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhbiBlbnRpdHkgKHRhYmxlIG9yIGRvY3VtZW50IGRlcGVuZCBvbiBkYXRhYmFzZSB0eXBlKS5cbiAqIERhdGFiYXNlIHNjaGVtYSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGFsbCBjbGFzc2VzIGRlY29yYXRlZCB3aXRoIGl0LCBhbmQgUmVwb3NpdG9yeSBjYW4gYmUgcmV0cmlldmVkIGFuZCB1c2VkIGZvciBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudGl0eShvcHRpb25zPzogRW50aXR5T3B0aW9ucyk6IENsYXNzRGVjb3JhdG9yO1xuXG4vKipcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhbiBlbnRpdHkgKHRhYmxlIG9yIGRvY3VtZW50IGRlcGVuZCBvbiBkYXRhYmFzZSB0eXBlKS5cbiAqIERhdGFiYXNlIHNjaGVtYSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGFsbCBjbGFzc2VzIGRlY29yYXRlZCB3aXRoIGl0LCBhbmQgUmVwb3NpdG9yeSBjYW4gYmUgcmV0cmlldmVkIGFuZCB1c2VkIGZvciBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudGl0eShuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogRW50aXR5T3B0aW9ucyk6IENsYXNzRGVjb3JhdG9yO1xuXG4vKipcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhbiBlbnRpdHkgKHRhYmxlIG9yIGRvY3VtZW50IGRlcGVuZCBvbiBkYXRhYmFzZSB0eXBlKS5cbiAqIERhdGFiYXNlIHNjaGVtYSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGFsbCBjbGFzc2VzIGRlY29yYXRlZCB3aXRoIGl0LCBhbmQgUmVwb3NpdG9yeSBjYW4gYmUgcmV0cmlldmVkIGFuZCB1c2VkIGZvciBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudGl0eShcbiAgbmFtZU9yT3B0aW9ucz86IHN0cmluZyB8IEVudGl0eU9wdGlvbnMsXG4gIG1heWJlT3B0aW9ucz86IEVudGl0eU9wdGlvbnNcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3B0aW9ucyA9XG4gICAgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG5hbWVPck9wdGlvbnMpXG4gICAgICA/IChuYW1lT3JPcHRpb25zIGFzIEVudGl0eU9wdGlvbnMpXG4gICAgICA6IG1heWJlT3B0aW9ucykgfHwge307XG4gIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG5hbWVPck9wdGlvbnMgOiBvcHRpb25zLm5hbWU7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBjb25zdCB0YWJsZXMgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkudGFibGVzO1xuICAgIHRhYmxlcy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHR5cGU6IFwicmVndWxhclwiLFxuICAgICAgb3JkZXJCeTogb3B0aW9ucy5vcmRlckJ5ID8gb3B0aW9ucy5vcmRlckJ5IDogdW5kZWZpbmVkLFxuICAgICAgZW5naW5lOiBvcHRpb25zLmVuZ2luZSA/IG9wdGlvbnMuZW5naW5lIDogdW5kZWZpbmVkLFxuICAgICAgZGF0YWJhc2U6IG9wdGlvbnMuZGF0YWJhc2UgPyBvcHRpb25zLmRhdGFiYXNlIDogdW5kZWZpbmVkLFxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSA/IG9wdGlvbnMuc2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMuc3luY2hyb25pemUsXG4gICAgICB3aXRob3V0Um93aWQ6IG9wdGlvbnMud2l0aG91dFJvd2lkLFxuICAgICAgY29tbWVudDogb3B0aW9ucy5jb21tZW50ID8gb3B0aW9ucy5jb21tZW50IDogdW5kZWZpbmVkLFxuICAgIH0gYXMgVGFibGVNZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsS2V5cyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBwYXRoIHNwbGl0dGVyIHVzZWQgdG8gbmF2aWdhdGUgbmVzdGVkIG1ldGFkYXRhIG9iamVjdHMuXG4gKiBAc3VtbWFyeSBLZXlzIGluIG5lc3RlZCBtZXRhZGF0YSBhcmUgam9pbmVkIHVzaW5nIHRoaXMgc3RyaW5nIHRvIGFsbG93IHNhZmUgcmVhZC93cml0ZSBieSBwYXRoLlxuICogQGNvbnN0IE9iamVjdEtleVNwbGl0dGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUm9vdCBrZXkgdXNlZCB0byBtaXJyb3IgbW9kZWwtYXNzb2NpYXRlZCBtZXRhZGF0YSBvbiB0aGUgY29uc3RydWN0b3IuXG4gKiBAc3VtbWFyeSBXaGVuIG1pcnJvcmluZyBpcyBlbmFibGVkLCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHdpdGggdGhpcyBrZXkgaXMgYXR0YWNoZWQgdG8gdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIGV4cG9zZSBjb2xsZWN0ZWQgbWV0YWRhdGEuXG4gKiBAY29uc3QgQmFzZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgQmFzZUtleSA9IFwiZGVjYWZcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2FmZWx5IHJldHJpZXZlcyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBhIHBhdGggYW5kIHNwbGl0dGVyLlxuICogQHN1bW1hcnkgU3BsaXRzIHRoZSBwcm92aWRlZCBwYXRoIGJ5IHRoZSBzcGxpdHRlciBhbmQgd2Fsa3MgdGhlIG9iamVjdCwgcmV0dXJuaW5nIHVuZGVmaW5lZCBpZiBhbnkgaW50ZXJtZWRpYXRlIGtleSBpcyBtaXNzaW5nLCBudWxsLCBvciB1bmRlZmluZWQuIEludGVuZGVkIGZvciBpbnRlcm5hbCBtZXRhZGF0YSBhY2Nlc3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBUaGUgc291cmNlIG9iamVjdCB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byByZXNvbHZlIChlLmcuLCBcImEuYi5jXCIpLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzcGxpdHRlcj1PYmplY3RLZXlTcGxpdHRlcl0gVGhlIGNoYXJhY3RlcihzKSB1c2VkIHRvIHNwbGl0IHRoZSBwYXRoLlxuICogQHJldHVybiB7YW55fSBUaGUgcmVzb2x2ZWQgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAqIEBmdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXJcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEZuIGFzIGdldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPYmogYXMgT2JqZWN0XG4gKiAgIEZuLT4+T2JqOiBzcGxpdChwYXRoKVxuICogICBsb29wIGtleXNcbiAqICAgICBGbi0+Pk9iajogaGFzT3duUHJvcGVydHkoa2V5KT9cbiAqICAgICBhbHQgbWlzc2luZy9udWxsL3VuZGVmaW5lZFxuICogICAgICAgRm4tLT4+T2JqOiByZXR1cm4gdW5kZWZpbmVkXG4gKiAgICAgZWxzZSBwcmVzZW50XG4gKiAgICAgICBGbi0+Pk9iajogY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRm4tLT4+T2JqOiByZXR1cm4gY3VycmVudFxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBhIG5lc3RlZCB2YWx1ZSBvbiBhbiBvYmplY3QgdXNpbmcgYSBwYXRoIGFuZCBzcGxpdHRlciwgY3JlYXRpbmcgbWlzc2luZyBvYmplY3RzIGFsb25nIHRoZSB3YXkuXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgYWxsIHBhdGggc2VnbWVudHMgZXhpc3QgYW5kIGFzc2lnbnMgdGhlIHByb3ZpZGVkIHZhbHVlIGF0IHRoZSB0ZXJtaW5hbCBrZXkuIEludGVuZGVkIGZvciBpbnRlcm5hbCBtZXRhZGF0YSBtdXRhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIFRoZSB0YXJnZXQgb2JqZWN0IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHNldCAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzcGxpdHRlcj1PYmplY3RLZXlTcGxpdHRlcl0gVGhlIGNoYXJhY3RlcihzKSB1c2VkIHRvIHNwbGl0IHRoZSBwYXRoLlxuICogQHJldHVybiB7dm9pZH1cbiAqIEBmdW5jdGlvbiBzZXRWYWx1ZUJ5U3BsaXR0ZXJcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEZuIGFzIHNldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPYmogYXMgT2JqZWN0XG4gKiAgIEZuLT4+T2JqOiBzcGxpdChwYXRoKVxuICogICBsb29wIGtleXNcbiAqICAgICBhbHQga2V5IG1pc3NpbmdcbiAqICAgICAgIEZuLT4+T2JqOiBjdXJyZW50W2tleV0gPSB7fVxuICogICAgIGVuZFxuICogICAgIEZuLT4+T2JqOiBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gKiAgIGVuZFxuICogICBGbi0tPj5PYmo6IGN1cnJlbnRbbGFzdEtleV0gPSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyXG4pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudDogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKCEoa2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuXG4gIGN1cnJlbnRba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdHJ1Y3R1cmUgb2YgY29sbGVjdGVkIG1vZGVsIG1ldGFkYXRhIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlciBkZWNvcmF0b3JzLlxuICogQHN1bW1hcnkgQ2FwdHVyZXMgcHJvcGVydHkgZGVzaWduIHR5cGVzLCB2YWxpZGF0aW9uIG1ldGFkYXRhLCByZWxhdGlvbiBtYXBwaW5ncywgZ2VuZXJhdGVkIGZpZWxkcywgcHJpbWFyeS9mb3JlaWduIGtleXMsIGFuZCBpbmRleCBzcGVjaWZpY2F0aW9ucywgd2hpY2ggYXJlIG1pcnJvcmVkIG9udG8gdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHdoZW4gZW5hYmxlZC5cbiAqIEB0eXBlZGVmIE1vZGVsTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcGVydGllcyBNYXAgb2YgcHJvcGVydHkgbmFtZXMgdG8gdGhlaXIgZGVzaWduLXRpbWUgdHlwZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueVtdPn0gW3ZhbGlkYXRpb25dIE9wdGlvbmFsIHZhbGlkYXRpb24gcnVsZXMgZ3JvdXBlZCBieSB2YWxpZGF0aW9uIGtleS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3JlbGF0aW9uc10gT3B0aW9uYWwgcmVsYXRpb24gbWV0YWRhdGEga2V5ZWQgYnkgcHJvcGVydHkuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtnZW5lcmF0ZWRdIE9wdGlvbmFsIG1hcCBvZiBnZW5lcmF0ZWQgY29sdW1uIHN0cmF0ZWdpZXMgcGVyIHByb3BlcnR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrIFByaW1hcnkga2V5IGZpZWxkIG5hbWUgZm9yIHRoZSBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2Zrc10gT3B0aW9uYWwgZm9yZWlnbiBrZXkgZGVmaW5pdGlvbnMga2V5ZWQgYnkgcHJvcGVydHkuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtpbmRleGVzXSBPcHRpb25hbCBpbmRleCBkZWZpbml0aW9ucyBrZXllZCBieSBpbmRleCBuYW1lLlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgdHlwZSBNb2RlbE1ldGFkYXRhID0ge1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB2YWxpZGF0aW9uPzogUmVjb3JkPHN0cmluZywgYW55W10+O1xuICByZWxhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBnZW5lcmF0ZWQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwazogc3RyaW5nO1xuICBma3M/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBpbmRleGVzPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWwgcmVnaXN0cnkgZm9yIG1vZGVsIG1ldGFkYXRhIHVzZWQgYnkgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHN0YXRpYyBoZWxwZXJzIHRvIGNvbGxlY3QsIG1pcnJvciwgYW5kIHF1ZXJ5IG1ldGFkYXRhIGZvciBtb2RlbHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuIEl0IHN1cHBvcnRzIG5lc3RlZCBrZXkgYWNjZXNzIHZpYSBhIHNwbGl0dGVyLCBvcHRpb25hbCBtaXJyb3Jpbmcgb2YgbWV0YWRhdGEgb250byB0aGUgbW9kZWwgY29uc3RydWN0b3IsIGFuZCB1dGlsaXRpZXMgdG8gaW5mZXIgZGVzaWduIHR5cGVzIGNvbWJpbmVkIHdpdGggdmFsaWRhdGlvbiBoaW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGxpdHRlciBUaGUgcGF0aCBzcGxpdHRlciB1c2VkIHRvIG5hdmlnYXRlIG5lc3RlZCBtZXRhZGF0YSAoc2VlIE9iamVjdEtleVNwbGl0dGVyKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlS2V5IFRoZSBub24tZW51bWVyYWJsZSBrZXkgdXNlZCB0byBtaXJyb3IgbWV0YWRhdGEgb250byB0aGUgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG1pcnJvciBJZiB0cnVlLCBtZXRhZGF0YSBpcyBtaXJyb3JlZCBvbiB0aGUgbW9kZWwgY29uc3RydWN0b3IgdW5kZXIgYmFzZUtleS5cbiAqIEBjbGFzcyBNZXRhZGF0YVxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFVzZXIge31cbiAqIC8vIHJlZ2lzdGVyIGEgcHJvcGVydHkgdHlwZVxuICogTWV0YWRhdGEuc2V0KFVzZXIgYXMgYW55LCBgcHJvcGVydGllcy5pZGAsIFN0cmluZyk7XG4gKiAvLyByZWFkIGJhY2tcbiAqIGNvbnN0IHByb3BzID0gTWV0YWRhdGEuZ2V0UHJvcGVydGllcyhVc2VyIGFzIGFueSk7IC8vIFsnaWQnXVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGVjb3IgYXMgRGVjb3JhdG9yc1xuICogICBwYXJ0aWNpcGFudCBTdG9yZSBhcyBNZXRhZGF0YSBTdG9yZVxuICogICBwYXJ0aWNpcGFudCBNb2RlbCBhcyBNb2RlbCBDdG9yXG4gKiAgIERlY29yLT4+U3RvcmU6IHNldChNb2RlbCwgXCJwcm9wZXJ0aWVzLmVtYWlsXCIsIFN0cmluZylcbiAqICAgYWx0IG1pcnJvciBlbmFibGVkXG4gKiAgICAgU3RvcmUtPj5Nb2RlbDogZGVmaW5lUHJvcGVydHkoQmFzZUtleSwgbWV0YWRhdGEpXG4gKiAgIGVuZFxuICogICBEZWNvci0+PlN0b3JlOiBnZXRQcm9wZXJ0aWVzKE1vZGVsKVxuICogICBTdG9yZS0tPj5EZWNvcjogW1wiZW1haWxcIl1cbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBNb2RlbE1ldGFkYXRhPiA9IHt9O1xuXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICBzdGF0aWMgYmFzZUtleSA9IEJhc2VLZXk7XG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMgYWxsIHJlZ2lzdGVyZWQgcHJvcGVydHkgbmFtZXMgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBzdG9yZSBmb3IgdGhlIGdpdmVuIG1vZGVsIGFuZCByZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm9wZXJ0aWVzIG1hcCBvciB1bmRlZmluZWQgaWYgbm9uZSBleGlzdC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3Igd2hvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIHVuZGVmaW5lZCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0UHJvcGVydGllcyhtb2RlbDogQ29uc3RydWN0b3I8YW55Pikge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWUgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGZpcnN0IGtleSBvZiB0aGUgcGsgbWFwIGluIG1ldGFkYXRhLCBvciB1bmRlZmluZWQgaWYgbm8gbWV0YWRhdGEgaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lIG9yIHVuZGVmaW5lZC5cbiAgICovXG4gIHN0YXRpYyBwayhtb2RlbDogQ29uc3RydWN0b3I8YW55Pikge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnBrKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgZmlyc3QgcmVzb2x2ZWQgdHlwZSBmb3IgYSBnaXZlbiBtb2RlbCBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgQ29tYmluZXMgZGVzaWduLXRpbWUgbWV0YWRhdGEgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uLXByb3ZpZGVkIHR5cGUgaGludHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc29sdmVkIHR5cGUuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byByZXNvbHZlIHRoZSB0eXBlIGZvci5cbiAgICogQHJldHVybiB7YW55fSBUaGUgZmlyc3QgcmVzb2x2ZWQgdHlwZS5cbiAgICovXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcyhtb2RlbCwgcHJvcClbMF07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIGFsbCBrbm93biB0eXBlcyBmb3IgYSBnaXZlbiBtb2RlbCBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBkZXNpZ24tdGltZSB0eXBlIGZvbGxvd2VkIGJ5IGFueSBhZGRpdGlvbmFsIHR5cGVzIGRlcml2ZWQgZnJvbSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIHByb3BlcnR5IG5hbWUgdG8gcmVzb2x2ZSB0eXBlcyBmb3IuXG4gICAqIEByZXR1cm4ge2FueVtdfSBPcmRlcmVkIGxpc3Qgb2YgcmVzb2x2ZWQgdHlwZXMgd2l0aCBmYWxzeSB2YWx1ZXMgcmVtb3ZlZC5cbiAgICovXG4gIHN0YXRpYyB0eXBlcyhtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKSB7XG4gICAgbGV0IGRlc2lnblR5cGU6IGFueSA9IHRoaXMuZ2V0KG1vZGVsLCBgcHJvcGVydGllcy4ke3Byb3B9YCk7XG4gICAgaWYgKCFkZXNpZ25UeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke3Byb3B9IG5vdCBmb3VuZCBpbiAke21vZGVsLm5hbWV9YCk7XG4gICAgZGVzaWduVHlwZSA9IFtkZXNpZ25UeXBlXTtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSB7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICAgIGlmIChtZXRhLnZhbGlkYXRpb24pIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IG1ldGEudmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25bVmFsaWRhdGlvbktleXMuVFlQRV0pXG4gICAgICAgICAgZGVzaWduVHlwZSA9IGRlc2lnblR5cGUuY29uY2F0KHZhbGlkYXRpb25bVmFsaWRhdGlvbktleXMuVFlQRV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzaWduVHlwZS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBvciBhIG5lc3RlZCB2YWx1ZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBvbmx5IHRoZSBtb2RlbCwgcmV0dXJucyB0aGUgZW50aXJlIE1vZGVsTWV0YWRhdGEgaWYgaXQgZXhpc3RzOyB3aGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIG5lc3RlZCB2YWx1ZSByZXNvbHZlZCB2aWEgdGhlIHNwbGl0dGVyLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIE9wdGlvbmFsIGRvdC1zZXBhcmF0ZWQgcGF0aCB0byBhIG5lc3RlZCB2YWx1ZSB3aXRoaW4gdGhlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHtNb2RlbE1ldGFkYXRhfGFueXx1bmRlZmluZWR9IFRoZSBmdWxsIG1ldGFkYXRhIG9iamVjdCwgdGhlIG5lc3RlZCB2YWx1ZSBhdCBrZXksIG9yIHVuZGVmaW5lZCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KTogTW9kZWxNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5OiBzdHJpbmcpOiBhbnk7XG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleT86IHN0cmluZykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICByZXR1cm4gZ2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdGhpcy5zcGxpdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFzc2lnbnMgYSB2YWx1ZSBpbnRvIHRoZSBtb2RlbCdzIG1ldGFkYXRhIGF0IHRoZSBwcm92aWRlZCBrZXkgcGF0aC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG1ldGFkYXRhIGNvbnRhaW5lciBpZiBuZWVkZWQsIG1pcnJvcnMgaXQgb250byB0aGUgbW9kZWwgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLCBhbmQgc2V0cyB0aGUgbmVzdGVkIHZhbHVlIHVzaW5nIHRoZSBjdXJyZW50IHNwbGl0dGVyLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEb3Qtc2VwYXJhdGVkIHBhdGggd2l0aGluIHRoZSBtZXRhZGF0YSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduIGF0IHRoZSBwYXRoLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSA9IHt9IGFzIGFueTtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdmFsdWUsIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRoYXQgYXNzaWducyBhIHZhbHVlIGludG8gbW9kZWwgbWV0YWRhdGEgYXQgYSBnaXZlbiBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIGEgZGVjb3JhdG9yIHVzYWJsZSBvbiBjbGFzc2VzIG9yIHByb3BlcnRpZXMgdGhhdCB3cml0ZXMgdGhlIHByb3ZpZGVkIHZhbHVlIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5IHBhdGggZm9yIHRoZSBvd25pbmcgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBkb3Qtc2VwYXJhdGVkIG1ldGFkYXRhIHBhdGggdG8gYXNzaWduLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihvYmplY3QsIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gVGhlIGRlY29yYXRvciBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvbiBhc3NpZ25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldiBhcyBEZXZlbG9wZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBGbiBhcyBhc3NpZ24oa2V5LCB2YWx1ZSlcbiAqICAgcGFydGljaXBhbnQgRGVjb3IgYXMgRGVjb3JhdG9yXG4gKiAgIERldi0+PkZuOiBjYWxsIHdpdGgga2V5LCB2YWx1ZVxuICogICBGbi0tPj5EZXY6IHJldHVybnMgRGVjb3JhdG9yXG4gKiAgIERldi0+PkRlY29yOiBhcHBseSBvbiBjbGFzcy9wcm9wZXJ0eVxuICogICBEZWNvci0+Pk1ldGFkYXRhOiBNZXRhZGF0YS5zZXQobW9kZWwsIGtleSwgdmFsdWUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFzc2lnbihcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm9wPzogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIE1ldGFkYXRhLnNldChtb2RlbCBhcyBhbnksIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZmFjdG9yeSB0byByZWdpc3RlciBhIHByb3BlcnR5IGRlc2lnbiB0eXBlIGluIG1vZGVsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgVXNlcyBSZWZsZWN0IG1ldGFkYXRhIHRvIGRpc2NvdmVyIHRoZSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLCB0aGVuIGRlbGVnYXRlcyB0byBhc3NpZ24gdG8gcGVyc2lzdCBpdCB1bmRlciBwcm9wZXJ0aWVzLjxwcm9wPi5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55KTogdm9pZH0gVGhlIGRlY29yYXRvciBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvbiBwcm9wZXJ0eVxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KCkge1xuICByZXR1cm4gZnVuY3Rpb24gcHJvcGVydHkobW9kZWw6IG9iamVjdCwgcHJvcDogYW55KSB7XG4gICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIG1vZGVsLCBwcm9wKTtcbiAgICByZXR1cm4gYXNzaWduKGBwcm9wZXJ0eS4ke3Byb3B9YCwgZGVzaWduVHlwZSkobW9kZWwsIHByb3ApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ2FzY2FkZSxcbiAgQ2FzY2FkZU1ldGFkYXRhLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIGZpbmFsLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBTZXF1ZW5jZSxcbiAgc2VxdWVuY2VOYW1lRm9yTW9kZWwsXG4gIHR5cGUgU2VxdWVuY2VPcHRpb25zLFxuICBKb2luVGFibGVPcHRpb25zLFxuICBPcmRlckRpcmVjdGlvbixcbiAgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyByZXNlcnZlZEF0dHJpYnV0ZXMsIFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIERCS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyBhcyBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxuICByZWFkb25seSxcbiAgVXBkYXRlVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgZGF0ZSxcbiAgRGVjb3JhdGlvbixcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgbGlzdCxcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluVmFsaWRhdG9yT3B0aW9ucyxcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbiAgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHR5cGUsXG4gIFR5cGVNZXRhZGF0YSxcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEluZGV4RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9xdWVyeVwiO1xuaW1wb3J0IHsgVHlwZU9STVNlcXVlbmNlIH0gZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluZGV4ZXMgfSBmcm9tIFwiLi9pbmRleGVzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRmxhZ3MsIFR5cGVPUk1RdWVyeSwgVHlwZU9STVRhYmxlU3BlYyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVHlwZU9STVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVHlwZU9STURpc3BhdGNoIH0gZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5pbXBvcnQgeyBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMsIHNwbGl0RWFnZXJSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgRmluZE9uZU9wdGlvbnMsXG4gIEluLFxuICBJbnNlcnRSZXN1bHQsXG4gIFJlbGF0aW9uT3B0aW9ucyxcbiAgSm9pbkNvbHVtbixcbiAgU2VsZWN0UXVlcnlCdWlsZGVyLFxuICBWZXJzaW9uQ29sdW1uLFxuICBKb2luVGFibGUsXG4gIENvbHVtblR5cGUsXG4gIENvbHVtbk9wdGlvbnMsXG4gIEluZGV4LFxuICBKb2luQ29sdW1uT3B0aW9ucyxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGF0YS1zb3VyY2UvRGF0YVNvdXJjZU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9Db2x1bW5cIjtcbmltcG9ydCB7IFVwZGF0ZURhdGVDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBPbmVUb09uZSB9IGZyb20gXCIuL292ZXJyaWRlcy9PbmVUb09uZVwiO1xuaW1wb3J0IHsgT25lVG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvTWFueVwiO1xuaW1wb3J0IHsgTWFueVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb09uZVwiO1xuaW1wb3J0IHsgTWFueVRvTWFueSB9IGZyb20gXCIuL292ZXJyaWRlcy9NYW55VG9NYW55XCI7XG5pbXBvcnQgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmltcG9ydCB7IFByaW1hcnlDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUNvbHVtblwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0VudGl0eVwiO1xuaW1wb3J0IHsgYXNzaWduLCBNZXRhZGF0YSwgcHJvcGVydHkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIERhdGFTb3VyY2UsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgbW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5hbGlhcyk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBtb2RlbHMubWFwKChjKSA9PiBjW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNdKTtcbiAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgeyBlbnRpdGllczogZW50aXRpZXMgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0YVNvdXJjZU9wdGlvbnMsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIob3B0aW9ucywgVHlwZU9STUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKCk7XG4gICAgaWYgKHRoaXMuX2NsaWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICBjb25zdCBmID0gYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpO1xuICAgIGNvbnN0IG5ld09iajogYW55ID0ge1xuICAgICAgdXNlcjogKHRoaXMuY29uZmlnIGFzIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMpLnVzZXJuYW1lLFxuICAgIH07XG4gICAgY29uc3QgbSA9IG5ldyBtb2RlbCgpO1xuXG4gICAgY29uc3QgZXhjZXB0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtKS5pZDtcbiAgICAgIGV4Y2VwdGlvbnMucHVzaChwayBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgfHxcbiAgICAgIG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlY3MgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZWMgPSBkZWNzLmRlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAoZGVjOiBhbnkpID0+XG4gICAgICAgICAgICBkZWMua2V5ID09PSBEQktleXMuVElNRVNUQU1QICYmXG4gICAgICAgICAgICBkZWMucHJvcHMub3BlcmF0aW9uLmluZGV4T2Yob3BlcmF0aW9uKSAhPT0gLTFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlYykge1xuICAgICAgICAgIGFjY3VtW2tleV0gPSBkZWMucHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgICBleGNlcHRpb25zLnB1c2goLi4uT2JqZWN0LmtleXMoZGVjcykpO1xuICAgIH1cblxuICAgIG5ld09iai5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPSAoXG4gICAgICBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA/IGYuaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzIDogW11cbiAgICApLmNvbmNhdCguLi5leGNlcHRpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihmLCBuZXdPYmopIGFzIFR5cGVPUk1GbGFncztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBvdmVycmlkZSBEaXNwYXRjaCgpOiBUeXBlT1JNRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgVHlwZU9STURpc3BhdGNoKCk7XG4gIH1cblxuICBAZmluYWwoKVxuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uc3RydWN0b3I8VHlwZU9STVJlcG9zaXRvcnk8TT4+IHtcbiAgICByZXR1cm4gVHlwZU9STVJlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZXMgc3RhdGVtZW50IGZvciBxdWVyeWluZ1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNU3RhdGVtZW50PE0sIGFueT59IEEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBUeXBlT1JNU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVN0YXRlbWVudCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMU2VxdWVuY2UgaW5zdGFuY2UgZm9yIG1hbmFnaW5nIHNlcXVlbmNlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IFNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBhZGFwdGVyIGJ5IGNyZWF0aW5nIGluZGV4ZXMgZm9yIGFsbCBtYW5hZ2VkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBuZWNlc3NhcnkgZGF0YWJhc2UgaW5kZXhlcyBmb3IgYWxsIG1vZGVscyBtYW5hZ2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jbGllbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRzLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGxvZy52ZXJib3NlKGAke3RoaXMudG9TdHJpbmcoKX0gaW5pdGlhbGl6ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gY3JlYXRlIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWxzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHsuLi5Db25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBjcmVhdGUgaW5kZXhlcyBmb3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgaW5kZXhlcyBhcmUgY3JlYXRlZFxuICAgKi9cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IFR5cGVPUk1RdWVyeVtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoXCJCRUdJTlwiKTtcblxuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpO1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZXhlY3V0ZSByYXcgU1FMIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHEgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocTogVHlwZU9STVF1ZXJ5KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNsaWVudC5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmNsaWVudC5pbml0aWFsaXplKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBxdWVyeSwgdmFsdWVzIH0gPSBxO1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgZXhlY3V0aW5nIHF1ZXJ5OiAkeyhxdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5nZXRTcWwoKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgY2hpbGQgPSBmYWxzZVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG5cbiAgICBwcmVwYXJlZC5yZWNvcmQgPSBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSB8fCB0aGlzLmlzUmVzZXJ2ZWQoa2V5KSlcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChNb2RlbC5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5wcmVwYXJlKHZhbHVlLCBmaW5kUHJpbWFyeUtleSh2YWx1ZSkuaWQsIHRydWUpLnJlY29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vZG8gbm90aGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IE1vZGVsLmdldChcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICAgIGlmICghY29uc3RyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZCBpbiByZWdpc3RyeWBcbiAgICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2hpbGRcbiAgICAgID8gbmV3IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdKClcbiAgICAgIDogbmV3IGNvbnN0cigpO1xuICAgIGlmIChjaGlsZClcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLmZvckVhY2goXG4gICAgICAoW2tleSwgdmFsXSkgPT4gKHJlc3VsdFtrZXkgYXMga2V5b2YgdHlwZW9mIHJlc3VsdF0gPSB2YWwpXG4gICAgKTtcbiAgICBwcmVwYXJlZC5yZWNvcmQgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHt0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBjbGF6eiA6IGNsYXp6Lm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgYSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgUmVjb3JkIGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7UmVwb3NpdG9yeS50YWJsZShtKX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyhtKTtcblxuICAgICAgY29uc3QgcTogRmluZE9uZU9wdGlvbnMgPSB7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aW9uczogcmVsYXRpb25zLFxuICAgICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgICByZWxhdGlvbnM6IG5vbkVhZ2VyLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCByZXBvLmZpbmRPbmVPckZhaWwocSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHVwZGF0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmNsaWVudC5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlbGV0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCByZXN1bHQ6IEluc2VydFJlc3VsdCA9IGF3YWl0IHJlcG8uaW5zZXJ0KG1vZGVsKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcmVzdWx0LmlkZW50aWZpZXJzLm1hcCgoaWQpID0+IGlkLmlkKSxcbiAgICAgICAgXCJpZFwiXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZC5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5maW5kQnkoeyBbcGtdOiBJbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVsKSB7XG4gICAgICByZXN1bHQucHVzaChhd2FpdCB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIG1bcGtdLCBtLCBwaywgLi4uYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZHxDb3VsZCBub3QgZmluZC9nKSlcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwibnVtZXJpY1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwidmFyY2hhclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUNvbHVtbih7XG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUgYXMgQ29sdW1uVHlwZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKShvcmlnaW5hbCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHBrS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihNb2RlbEtleXMuQVRUUklCVVRFKVxuICAgICAgLmV4dGVuZChwcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAY29sdW1uKFwiY29sdW1uTmFtZVwiKSA9PiBAQ29sdW1uKHtuYW1lOiBcImNvbHVtbk5hbWVcIn0pXG4gICAgY29uc3QgY29sdW1uS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY29sdW1uS2V5KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1tKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKG5hbWUpIG9wdHMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBjb25zdCBwayA9IE1ldGFkYXRhLmdldChvYmosIFwicGtcIik7XG4gICAgICAgICAgICBpZiAocGsgIT09IHByb3ApIHtcbiAgICAgICAgICAgICAgb3B0cy5udWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKG9wdHMpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luQ29sdW1uT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgT25lVG9PbmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luQ29sdW1uKFxuICAgICAgICAgICAgICBqb2luQ29sdW1uT3B0cyB8fCBtZXRhZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlDb25zdHJhaW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICh1bmRlZmluZWQgYXMgYW55KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9NYW55KGNsYXp6KSA9PiBAT25lVG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvTWFueUtleSwgbWV0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBPbmVUb01hbnlXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIE9uZVRvTWFueShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGF6eiA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGRlYy5wcm9wcy5jbGFzcyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWRlYy5wcm9wcy5jbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlYy5wcm9wcy5jbGFzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy5wcm9wcy5jbGFzcztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hbnlUb09uZVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIHJldHVybiBNYW55VG9PbmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBsZXQgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0RGVjKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpc3REZWMuY2xhenpbMF0oKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NSZWxhdGlvbktleSA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKVxuICAgICAgICAgICAgICAgICAgICApLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvTWFueShjbGF6eikgPT4gQE1hbnlUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE1hbnlUb01hbnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luVGFibGUoam9pblRhYmxlT3B0cyBhcyBhbnkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBpbmRleCgpID0+IEBJbmRleCgpXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLklOREVYKVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gaW5kZXgoXG4gICAgICAgICAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgbmFtZT86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW5kZXgob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvc2l0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBuYW1lID0gY29tcG9zaXRpb25zO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9ucyAmJiBkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgIVtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10uaW5jbHVkZXMoZCBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSBkaXJlY3Rpb25zIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBJbmRleChbcHJvcCwgLi4uY29tcG9zaXRpb25zXSkob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEluZGV4KCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICAgIC8vIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoVHlwZU9STUZsYXZvdXIpO1xuIiwiaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5leHBvcnQgeyBUeXBlT1JNQWRhcHRlciB9O1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1EaXNwYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STVJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlT1JNIGludGVncmF0aW9uIGZvciBEZWNhZi50cy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBUeXBlT1JNLWJhY2tlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGVjYWYudHMgZGF0YSBhY2Nlc3MgYWJzdHJhY3Rpb25zLCBpbmNsdWRpbmcgdGhlIGFkYXB0ZXIsIHJlcG9zaXRvcnksIHN0YXRlbWVudCBidWlsZGVyLCBwYWdpbmF0aW9uIHV0aWxpdGllcywgaW5kZXggaGVscGVycywgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIEtleSBleHBvcnRzIGluY2x1ZGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSwge0BsaW5rIFR5cGVPUk1SZXBvc2l0b3J5fSwge0BsaW5rIFR5cGVPUk1TdGF0ZW1lbnR9LCB7QGxpbmsgVHlwZU9STVBhZ2luYXRvcn0sIGFuZCBpbmRleCBnZW5lcmF0aW9uIHV0aWxpdGllcy5cbiAqIEBtb2R1bGUgZm9yLXR5cGVvcm1cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uLlxuICogQHN1bW1hcnkgVGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBmb3ItdHlwZW9ybSBwYWNrYWdlLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7Ozs7O0FBS0c7QUFDSSxNQUFNLGtCQUFrQixHQUM3QjtBQUVGOzs7OztBQUtHO0FBQ0ksTUFBTSxjQUFjLEdBQUc7QUFF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
|
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
|
@@ -20,5 +20,5 @@ export * from "./utils.js";
|
|
|
20
20
|
* @const VERSION
|
|
21
21
|
* @memberOf module:for-typeorm
|
|
22
22
|
*/
|
|
23
|
-
export const VERSION = "0.0.
|
|
23
|
+
export const VERSION = "0.0.18";
|
|
24
24
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSw0QkFBeUI7QUFFbEQsbUNBQTBCO0FBQzFCLGlDQUF3QjtBQUN4QixxQ0FBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO0FBQzFCLCtCQUE0QjtBQUM1Qiw0QkFBeUI7QUFDekIscUNBQWtDO0FBQ2xDLHVDQUFvQztBQUNwQywyQkFBd0I7QUFDeEIsMkJBQXdCO0FBRXhCOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCB7IFR5cGVPUk1BZGFwdGVyIH07XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
|
package/lib/index.cjs
CHANGED
|
@@ -37,5 +37,5 @@ __exportStar(require("./utils.cjs"), exports);
|
|
|
37
37
|
* @const VERSION
|
|
38
38
|
* @memberOf module:for-typeorm
|
|
39
39
|
*/
|
|
40
|
-
exports.VERSION = "0.0.
|
|
40
|
+
exports.VERSION = "0.0.18";
|
|
41
41
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBa0Q7QUFLekMsK0ZBTEEsK0JBQWMsT0FLQTtBQUh2QixzREFBMEI7QUFDMUIsb0RBQXdCO0FBQ3hCLHdEQUE0QjtBQUU1QixrREFBNEI7QUFDNUIsK0NBQXlCO0FBQ3pCLHdEQUFrQztBQUNsQywwREFBb0M7QUFDcEMsOENBQXdCO0FBQ3hCLDhDQUF3QjtBQUV4Qjs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCB7IFR5cGVPUk1BZGFwdGVyIH07XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
|
package/lib/index.d.ts
CHANGED