@dbx-tools/appkit-mastra 0.9.144 → 0.9.145

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.
@@ -9,12 +9,12 @@
9
9
  * otherwise, so ONE decision - do we enter that scope for this request - moves
10
10
  * every call site together.
11
11
  *
12
- * The decision itself is NOT Mastra-specific (the Teams messaging endpoint and
13
- * the tunnel gate face it too), so it lives in `@dbx-tools/appkit`'s `identity`
14
- * module - which also documents the measured AppKit behavior that makes `"auto"`
15
- * necessary. This module is the Mastra-facing binding: the plugin's own config
16
- * field and env var, re-exporting the shared vocabulary so a consumer importing
17
- * `@dbx-tools/appkit-mastra` needs no second import.
12
+ * The decision itself is NOT Mastra-specific (authenticated webhooks and the
13
+ * tunnel gate face it too), so it lives in `@dbx-tools/appkit`'s `identity`
14
+ * module - which also documents the measured AppKit behavior that makes
15
+ * `"auto"` necessary. This module is the Mastra-facing binding: the plugin's own
16
+ * config field and env var, re-exporting the shared vocabulary so a consumer
17
+ * importing `@dbx-tools/appkit-mastra` needs no second import.
18
18
  *
19
19
  * Why the option exists: OBO requires the caller to be a member of the
20
20
  * WORKSPACE, not merely of the Databricks account. An app shared with an
@@ -38,7 +38,8 @@
38
38
  * - `"auto"`: OBO when the request carries an OBO token, the service principal
39
39
  * when it does not. The mode for an app that serves BOTH the platform front
40
40
  * door and a door with no OBO token to forward (a `@dbx-tools/tunnel`
41
- * gate, a Teams channel), since a single container serves both at once.
41
+ * gate or an authenticated webhook), since a single container serves both
42
+ * at once.
42
43
  *
43
44
  * What the service-principal path does NOT change is WHO the turn belongs to.
44
45
  * The memory thread's `resourceId`, the per-user cache namespace, and the user
@@ -84,4 +85,4 @@ export const requestUserEmail = identity.requestUserEmail;
84
85
  * `"auto"` only when the request carries no OBO token for AppKit to use.
85
86
  */
86
87
  export const useServicePrincipal = identity.useServicePrincipal;
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSzdDLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUM7QUFFcEQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0FBRXREOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztBQUVwRSxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7QUFFdEQsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBOEI7SUFDaEUsT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO0FBRXBELHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSBhIGNoYXQgdHVybidzIHdvcmtzcGFjZSBjYWxscyBydW4gYXMuXG4gKlxuICogRXZlcnkgRGF0YWJyaWNrcyBjYWxsIGEgdHVybiBtYWtlcyAtIHRoZSBgL3NlcnZpbmctZW5kcG9pbnRzYCBjYXRhbG9ndWUgdGhlXG4gKiBtb2RlbCBwaWNrZXIgcmVhZHMsIEdlbmllIHN1Z2dlc3Rpb25zLCBgYXNrX2dlbmllYCwgYW5kIHRoZSBTdGF0ZW1lbnRcbiAqIEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gIGVtYmVkIC0gZ29lcyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBvbiB0aGUgYW1iaWVudCBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuIFRoYXQgY29udGV4dCBpcyB1c2VyLXNjb3BlZFxuICogKE9CTykgd2hlbmV2ZXIgdGhlIHBsdWdpbiBlbnRlcnMgYGFzVXNlcihyZXEpYCBhbmQgdGhlIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiBvdGhlcndpc2UsIHNvIE9ORSBkZWNpc2lvbiAtIGRvIHdlIGVudGVyIHRoYXQgc2NvcGUgZm9yIHRoaXMgcmVxdWVzdCAtIG1vdmVzXG4gKiBldmVyeSBjYWxsIHNpdGUgdG9nZXRoZXIuXG4gKlxuICogVGhlIGRlY2lzaW9uIGl0c2VsZiBpcyBOT1QgTWFzdHJhLXNwZWNpZmljICh0aGUgVGVhbXMgbWVzc2FnaW5nIGVuZHBvaW50IGFuZFxuICogdGhlIHR1bm5lbCBnYXRlIGZhY2UgaXQgdG9vKSwgc28gaXQgbGl2ZXMgaW4gYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBpZGVudGl0eWBcbiAqIG1vZHVsZSAtIHdoaWNoIGFsc28gZG9jdW1lbnRzIHRoZSBtZWFzdXJlZCBBcHBLaXQgYmVoYXZpb3IgdGhhdCBtYWtlcyBgXCJhdXRvXCJgXG4gKiBuZWNlc3NhcnkuIFRoaXMgbW9kdWxlIGlzIHRoZSBNYXN0cmEtZmFjaW5nIGJpbmRpbmc6IHRoZSBwbHVnaW4ncyBvd24gY29uZmlnXG4gKiBmaWVsZCBhbmQgZW52IHZhciwgcmUtZXhwb3J0aW5nIHRoZSBzaGFyZWQgdm9jYWJ1bGFyeSBzbyBhIGNvbnN1bWVyIGltcG9ydGluZ1xuICogYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAgbmVlZHMgbm8gc2Vjb25kIGltcG9ydC5cbiAqXG4gKiBXaHkgdGhlIG9wdGlvbiBleGlzdHM6IE9CTyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGJlIGEgbWVtYmVyIG9mIHRoZVxuICogV09SS1NQQUNFLCBub3QgbWVyZWx5IG9mIHRoZSBEYXRhYnJpY2tzIGFjY291bnQuIEFuIGFwcCBzaGFyZWQgd2l0aCBhblxuICogYWNjb3VudC1sZXZlbCBncm91cCBjYW4gdGhlcmVmb3JlIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIE9CTyB0b2tlbiBpc1xuICogcGVyZmVjdGx5IHZhbGlkIGJ1dCB3aG9zZSBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWRcbiAqIGFjY2VzcyB0byBPcmc6IDx3b3Jrc3BhY2UtaWQ+YCwgYW5kIGdyYW50aW5nIHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIG5vdFxuICogYWx3YXlzIGF2YWlsYWJsZSAtIGEgd29ya3NwYWNlIGNhcHMgbWVtYmVyc2hpcCBmYXIgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZVxuICogYWNjb3VudCdzIHVzZXIgZ3JvdXAuIFRoZSBhcHAncyBvd24gc2VydmljZSBwcmluY2lwYWwgYWxyZWFkeSBob2xkcyB0aGUgR2VuaWVcbiAqIC8gd2FyZWhvdXNlIC8gc2VydmluZyAvIFVuaXR5IENhdGFsb2cgZ3JhbnRzIHRoZSBhcHAgd2FzIGRlcGxveWVkIHdpdGgsIGFuZFxuICogd29ya3MgZm9yIGV2ZXJ5IGNhbGxlci5cbiAqXG4gKiBUaGUgbW9kZXMsIGZyb20gYGNvbmZpZy5nZW5pZUlkZW50aXR5YCAoZW52OiB7QGxpbmsgSURFTlRJVFlfRU5WfSk6XG4gKlxuICogICAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBDYWxscyBhcmUgYXR0cmlidXRlZCBwZXIgdXNlciBhbmQgR2VuaWUgL1xuICogICAgIFVuaXR5IENhdGFsb2cgcm93IGZpbHRlcnMgYXBwbHkgcGVyIHVzZXIuIENvcnJlY3Qgd2hlbmV2ZXIgZXZlcnkgY2FsbGVyIGlzXG4gKiAgICAgYSB3b3Jrc3BhY2UgbWVtYmVyLiBUaGlzIGlzIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yLCBzbyB0aGUgb3B0aW9uIGlzXG4gKiAgICAgcHVyZWx5IGFkZGl0aXZlIC0gYW4gYXBwIHRoYXQgbmV2ZXIgc2V0cyBpdCBpcyB1bmNoYW5nZWQuXG4gKiAgIC0gYFwic2VydmljZS1wcmluY2lwYWxcImA6IGFsd2F5cyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLiBOZWVkcyBubyBPQk9cbiAqICAgICBzY29wZXMgYW5kIHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwLCBhdCB0aGUgY29zdCBvZlxuICogICAgIHBlci11c2VyIGF0dHJpYnV0aW9uIGluIEdlbmllIC8gVW5pdHkgQ2F0YWxvZy5cbiAqICAgLSBgXCJhdXRvXCJgOiBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiAgICAgd2hlbiBpdCBkb2VzIG5vdC4gVGhlIG1vZGUgZm9yIGFuIGFwcCB0aGF0IHNlcnZlcyBCT1RIIHRoZSBwbGF0Zm9ybSBmcm9udFxuICogICAgIGRvb3IgYW5kIGEgZG9vciB3aXRoIG5vIE9CTyB0b2tlbiB0byBmb3J3YXJkIChhIGBAZGJ4LXRvb2xzL3R1bm5lbGBcbiAqICAgICBnYXRlLCBhIFRlYW1zIGNoYW5uZWwpLCBzaW5jZSBhIHNpbmdsZSBjb250YWluZXIgc2VydmVzIGJvdGggYXQgb25jZS5cbiAqXG4gKiBXaGF0IHRoZSBzZXJ2aWNlLXByaW5jaXBhbCBwYXRoIGRvZXMgTk9UIGNoYW5nZSBpcyBXSE8gdGhlIHR1cm4gYmVsb25ncyB0by5cbiAqIFRoZSBtZW1vcnkgdGhyZWFkJ3MgYHJlc291cmNlSWRgLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdGhlIHVzZXJcbiAqIG1ldGFkYXRhIG9uIHRyYWNlcyBzdGlsbCBjb21lIGZyb20gdGhlIGZvcndhcmRlZCByZXF1ZXN0IGhlYWRlcnMsIHNvIHR3b1xuICogYWNjb3VudCB1c2VycyBzaGFyaW5nIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCdzIGRhdGEgYWNjZXNzIHN0aWxsIGdldCBzZXBhcmF0ZVxuICogY29udmVyc2F0aW9ucyBhbmQgY2Fubm90IHJlYWQgZWFjaCBvdGhlcidzIHRocmVhZHMgb3IgY2FjaGVkIGNoYXJ0cy4gT25seSB0aGVcbiAqIERhdGFicmlja3MgY3JlZGVudGlhbCBpcyBzaGFyZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5cbi8qKiBJZGVudGl0eSBhIGNoYXQgdHVybidzIERhdGFicmlja3MgY2FsbHMgcnVuIGFzLiBTZWUgdGhlIG1vZHVsZSBkb2NzLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhSWRlbnRpdHlNb2RlID0gaWRlbnRpdHkuSWRlbnRpdHlNb2RlO1xuXG4vKiogRW52aXJvbm1lbnQgZmFsbGJhY2sgZm9yIGBjb25maWcuZ2VuaWVJZGVudGl0eWAuICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfRU5WID0gXCJNQVNUUkFfR0VOSUVfSURFTlRJVFlcIjtcblxuLyoqIEV2ZXJ5IGFjY2VwdGVkIHtAbGluayBNYXN0cmFJZGVudGl0eU1vZGV9LiAqL1xuZXhwb3J0IGNvbnN0IElERU5USVRZX01PREVTID0gaWRlbnRpdHkuSURFTlRJVFlfTU9ERVM7XG5cbi8qKlxuICogRGVmYXVsdCBtb2RlLiBgXCJ1c2VyXCJgIGtlZXBzIE9CTyB0aGUgb25seSBpZGVudGl0eSB1bmxlc3MgYW4gYXBwIG9wdHMgaW4sIHNvXG4gKiBhZG9wdGluZyB0aGlzIG9wdGlvbiBjYW4gbmV2ZXIgc2lsZW50bHkgd2lkZW4gYW4gZXhpc3RpbmcgYXBwJ3MgZGF0YSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lERU5USVRZX01PREUgPSBpZGVudGl0eS5ERUZBVUxUX0lERU5USVRZX01PREU7XG5cbi8qKiBIZWFkZXIgRGF0YWJyaWNrcyBBcHBzIGZvcndhcmQgdGhlIHNpZ25lZC1pbiB1c2VyJ3MgaWQgb24uICovXG5leHBvcnQgY29uc3QgVVNFUl9JRF9IRUFERVIgPSBpZGVudGl0eS5VU0VSX0lEX0hFQURFUjtcblxuLyoqIEhlYWRlciBEYXRhYnJpY2tzIEFwcHMgZm9yd2FyZCB0aGUgc2lnbmVkLWluIHVzZXIncyBlbWFpbCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0VNQUlMX0hFQURFUiA9IGlkZW50aXR5LlVTRVJfRU1BSUxfSEVBREVSO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbmZpZ3VyZWQgbW9kZTogZXhwbGljaXQgcGx1Z2luIGNvbmZpZywgdGhlbiB7QGxpbmsgSURFTlRJVFlfRU5WfSxcbiAqIHRoZW4ge0BsaW5rIERFRkFVTFRfSURFTlRJVFlfTU9ERX0uIEFuIHVucmVjb2duaXplZCB2YWx1ZSB0aHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWRlbnRpdHlNb2RlKGNvbmZpZ3VyZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE1hc3RyYUlkZW50aXR5TW9kZSB7XG4gIHJldHVybiBpZGVudGl0eS5yZXNvbHZlSWRlbnRpdHlNb2RlKGNvbmZpZ3VyZWQsIElERU5USVRZX0VOViwgXCJnZW5pZUlkZW50aXR5XCIpO1xufVxuXG4vKipcbiAqIFRoZSBmb3J3YXJkZWQgdXNlciBpZCBvbiBgcmVxYCwgb3IgYHVuZGVmaW5lZGAuIFVzZWQgdG8gYXR0cmlidXRlIGEgdHVybiB0b1xuICogdGhlIHJlYWwgY2FsbGVyIHdoZW4gdGhlIERhdGFicmlja3MgY2xpZW50IGlzIHRoZSBhcHAgU1AgYnV0IG1lbW9yeSAvIGNhY2hlIC9cbiAqIHRyYWNlcyBtdXN0IHN0aWxsIGtleSBvZmYgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0VXNlcklkID0gaWRlbnRpdHkucmVxdWVzdFVzZXJJZDtcblxuLyoqIFRoZSBmb3J3YXJkZWQgdXNlciBlbWFpbCBvbiBgcmVxYCwgb3IgYHVuZGVmaW5lZGAuICovXG5leHBvcnQgY29uc3QgcmVxdWVzdFVzZXJFbWFpbCA9IGlkZW50aXR5LnJlcXVlc3RVc2VyRW1haWw7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcXVlc3Qgc2hvdWxkIHJ1biBpdHMgRGF0YWJyaWNrcyBjYWxscyBhcyB0aGUgYXBwIHNlcnZpY2VcbiAqIHByaW5jaXBhbCByYXRoZXIgdGhhbiBPQk8gLSBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYCBhbHdheXMsIGBcInVzZXJcImAgbmV2ZXIsIGFuZFxuICogYFwiYXV0b1wiYCBvbmx5IHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBubyBPQk8gdG9rZW4gZm9yIEFwcEtpdCB0byB1c2UuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VTZXJ2aWNlUHJpbmNpcGFsID0gaWRlbnRpdHkudXNlU2VydmljZVByaW5jaXBhbDtcbiJdfQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs3Qyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDO0FBRXBELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUV0RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7QUFFcEUsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0FBRXRELG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQThCO0lBQ2hFLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztBQUVwRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgYSBjaGF0IHR1cm4ncyB3b3Jrc3BhY2UgY2FsbHMgcnVuIGFzLlxuICpcbiAqIEV2ZXJ5IERhdGFicmlja3MgY2FsbCBhIHR1cm4gbWFrZXMgLSB0aGUgYC9zZXJ2aW5nLWVuZHBvaW50c2AgY2F0YWxvZ3VlIHRoZVxuICogbW9kZWwgcGlja2VyIHJlYWRzLCBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50XG4gKiBFeGVjdXRpb24gZmV0Y2ggYmVoaW5kIGEgYFtkYXRhOjxpZD5dYCBlbWJlZCAtIGdvZXMgdGhyb3VnaCB0aGUgd29ya3NwYWNlXG4gKiBjbGllbnQgb24gdGhlIGFtYmllbnQgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiBUaGF0IGNvbnRleHQgaXMgdXNlci1zY29wZWRcbiAqIChPQk8pIHdoZW5ldmVyIHRoZSBwbHVnaW4gZW50ZXJzIGBhc1VzZXIocmVxKWAgYW5kIHRoZSBhcHAncyBzZXJ2aWNlIHByaW5jaXBhbFxuICogb3RoZXJ3aXNlLCBzbyBPTkUgZGVjaXNpb24gLSBkbyB3ZSBlbnRlciB0aGF0IHNjb3BlIGZvciB0aGlzIHJlcXVlc3QgLSBtb3Zlc1xuICogZXZlcnkgY2FsbCBzaXRlIHRvZ2V0aGVyLlxuICpcbiAqIFRoZSBkZWNpc2lvbiBpdHNlbGYgaXMgTk9UIE1hc3RyYS1zcGVjaWZpYyAoYXV0aGVudGljYXRlZCB3ZWJob29rcyBhbmQgdGhlXG4gKiB0dW5uZWwgZ2F0ZSBmYWNlIGl0IHRvbyksIHNvIGl0IGxpdmVzIGluIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgaWRlbnRpdHlgXG4gKiBtb2R1bGUgLSB3aGljaCBhbHNvIGRvY3VtZW50cyB0aGUgbWVhc3VyZWQgQXBwS2l0IGJlaGF2aW9yIHRoYXQgbWFrZXNcbiAqIGBcImF1dG9cImAgbmVjZXNzYXJ5LiBUaGlzIG1vZHVsZSBpcyB0aGUgTWFzdHJhLWZhY2luZyBiaW5kaW5nOiB0aGUgcGx1Z2luJ3Mgb3duXG4gKiBjb25maWcgZmllbGQgYW5kIGVudiB2YXIsIHJlLWV4cG9ydGluZyB0aGUgc2hhcmVkIHZvY2FidWxhcnkgc28gYSBjb25zdW1lclxuICogaW1wb3J0aW5nIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgIG5lZWRzIG5vIHNlY29uZCBpbXBvcnQuXG4gKlxuICogV2h5IHRoZSBvcHRpb24gZXhpc3RzOiBPQk8gcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIG1lbWJlciBvZiB0aGVcbiAqIFdPUktTUEFDRSwgbm90IG1lcmVseSBvZiB0aGUgRGF0YWJyaWNrcyBhY2NvdW50LiBBbiBhcHAgc2hhcmVkIHdpdGggYW5cbiAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIHRoZXJlZm9yZSBiZSBvcGVuZWQgYnkgc29tZW9uZSB3aG9zZSBPQk8gdG9rZW4gaXNcbiAqIHBlcmZlY3RseSB2YWxpZCBidXQgd2hvc2UgZXZlcnkgd29ya3NwYWNlIGNhbGwgZmFpbHMgd2l0aCBgVW5hdXRob3JpemVkXG4gKiBhY2Nlc3MgdG8gT3JnOiA8d29ya3NwYWNlLWlkPmAsIGFuZCBncmFudGluZyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBub3RcbiAqIGFsd2F5cyBhdmFpbGFibGUgLSBhIHdvcmtzcGFjZSBjYXBzIG1lbWJlcnNoaXAgZmFyIGJlbG93IHRoZSBzaXplIG9mIGEgbGFyZ2VcbiAqIGFjY291bnQncyB1c2VyIGdyb3VwLiBUaGUgYXBwJ3Mgb3duIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIEdlbmllXG4gKiAvIHdhcmVob3VzZSAvIHNlcnZpbmcgLyBVbml0eSBDYXRhbG9nIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLCBhbmRcbiAqIHdvcmtzIGZvciBldmVyeSBjYWxsZXIuXG4gKlxuICogVGhlIG1vZGVzLCBmcm9tIGBjb25maWcuZ2VuaWVJZGVudGl0eWAgKGVudjoge0BsaW5rIElERU5USVRZX0VOVn0pOlxuICpcbiAqICAgLSBgXCJ1c2VyXCJgIChkZWZhdWx0KTogYWx3YXlzIE9CTy4gQ2FsbHMgYXJlIGF0dHJpYnV0ZWQgcGVyIHVzZXIgYW5kIEdlbmllIC9cbiAqICAgICBVbml0eSBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW5ldmVyIGV2ZXJ5IGNhbGxlciBpc1xuICogICAgIGEgd29ya3NwYWNlIG1lbWJlci4gVGhpcyBpcyB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvciwgc28gdGhlIG9wdGlvbiBpc1xuICogICAgIHB1cmVseSBhZGRpdGl2ZSAtIGFuIGFwcCB0aGF0IG5ldmVyIHNldHMgaXQgaXMgdW5jaGFuZ2VkLlxuICogICAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gKiAgICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAqICAgICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gKiAgIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogICAgIHdoZW4gaXQgZG9lcyBub3QuIFRoZSBtb2RlIGZvciBhbiBhcHAgdGhhdCBzZXJ2ZXMgQk9USCB0aGUgcGxhdGZvcm0gZnJvbnRcbiAqICAgICBkb29yIGFuZCBhIGRvb3Igd2l0aCBubyBPQk8gdG9rZW4gdG8gZm9yd2FyZCAoYSBgQGRieC10b29scy90dW5uZWxgXG4gKiAgICAgZ2F0ZSBvciBhbiBhdXRoZW50aWNhdGVkIHdlYmhvb2spLCBzaW5jZSBhIHNpbmdsZSBjb250YWluZXIgc2VydmVzIGJvdGhcbiAqICAgICBhdCBvbmNlLlxuICpcbiAqIFdoYXQgdGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggZG9lcyBOT1QgY2hhbmdlIGlzIFdITyB0aGUgdHVybiBiZWxvbmdzIHRvLlxuICogVGhlIG1lbW9yeSB0aHJlYWQncyBgcmVzb3VyY2VJZGAsIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0aGUgdXNlclxuICogbWV0YWRhdGEgb24gdHJhY2VzIHN0aWxsIGNvbWUgZnJvbSB0aGUgZm9yd2FyZGVkIHJlcXVlc3QgaGVhZGVycywgc28gdHdvXG4gKiBhY2NvdW50IHVzZXJzIHNoYXJpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsJ3MgZGF0YSBhY2Nlc3Mgc3RpbGwgZ2V0IHNlcGFyYXRlXG4gKiBjb252ZXJzYXRpb25zIGFuZCBjYW5ub3QgcmVhZCBlYWNoIG90aGVyJ3MgdGhyZWFkcyBvciBjYWNoZWQgY2hhcnRzLiBPbmx5IHRoZVxuICogRGF0YWJyaWNrcyBjcmVkZW50aWFsIGlzIHNoYXJlZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcblxuLyoqIElkZW50aXR5IGEgY2hhdCB0dXJuJ3MgRGF0YWJyaWNrcyBjYWxscyBydW4gYXMuIFNlZSB0aGUgbW9kdWxlIGRvY3MuICovXG5leHBvcnQgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgPSBpZGVudGl0eS5JZGVudGl0eU1vZGU7XG5cbi8qKiBFbnZpcm9ubWVudCBmYWxsYmFjayBmb3IgYGNvbmZpZy5nZW5pZUlkZW50aXR5YC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVElUWV9FTlYgPSBcIk1BU1RSQV9HRU5JRV9JREVOVElUWVwiO1xuXG4vKiogRXZlcnkgYWNjZXB0ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX0uICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfTU9ERVMgPSBpZGVudGl0eS5JREVOVElUWV9NT0RFUztcblxuLyoqXG4gKiBEZWZhdWx0IG1vZGUuIGBcInVzZXJcImAga2VlcHMgT0JPIHRoZSBvbmx5IGlkZW50aXR5IHVubGVzcyBhbiBhcHAgb3B0cyBpbiwgc29cbiAqIGFkb3B0aW5nIHRoaXMgb3B0aW9uIGNhbiBuZXZlciBzaWxlbnRseSB3aWRlbiBhbiBleGlzdGluZyBhcHAncyBkYXRhIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURFTlRJVFlfTU9ERSA9IGlkZW50aXR5LkRFRkFVTFRfSURFTlRJVFlfTU9ERTtcblxuLyoqIEhlYWRlciBEYXRhYnJpY2tzIEFwcHMgZm9yd2FyZCB0aGUgc2lnbmVkLWluIHVzZXIncyBpZCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0lEX0hFQURFUiA9IGlkZW50aXR5LlVTRVJfSURfSEVBREVSO1xuXG4vKiogSGVhZGVyIERhdGFicmlja3MgQXBwcyBmb3J3YXJkIHRoZSBzaWduZWQtaW4gdXNlcidzIGVtYWlsIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFVTRVJfRU1BSUxfSEVBREVSID0gaWRlbnRpdHkuVVNFUl9FTUFJTF9IRUFERVI7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY29uZmlndXJlZCBtb2RlOiBleHBsaWNpdCBwbHVnaW4gY29uZmlnLCB0aGVuIHtAbGluayBJREVOVElUWV9FTlZ9LFxuICogdGhlbiB7QGxpbmsgREVGQVVMVF9JREVOVElUWV9NT0RFfS4gQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFzdHJhSWRlbnRpdHlNb2RlIHtcbiAgcmV0dXJuIGlkZW50aXR5LnJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZCwgSURFTlRJVFlfRU5WLCBcImdlbmllSWRlbnRpdHlcIik7XG59XG5cbi8qKlxuICogVGhlIGZvcndhcmRlZCB1c2VyIGlkIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gVXNlZCB0byBhdHRyaWJ1dGUgYSB0dXJuIHRvXG4gKiB0aGUgcmVhbCBjYWxsZXIgd2hlbiB0aGUgRGF0YWJyaWNrcyBjbGllbnQgaXMgdGhlIGFwcCBTUCBidXQgbWVtb3J5IC8gY2FjaGUgL1xuICogdHJhY2VzIG11c3Qgc3RpbGwga2V5IG9mZiB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RVc2VySWQgPSBpZGVudGl0eS5yZXF1ZXN0VXNlcklkO1xuXG4vKiogVGhlIGZvcndhcmRlZCB1c2VyIGVtYWlsIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0VXNlckVtYWlsID0gaWRlbnRpdHkucmVxdWVzdFVzZXJFbWFpbDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBzaG91bGQgcnVuIGl0cyBEYXRhYnJpY2tzIGNhbGxzIGFzIHRoZSBhcHAgc2VydmljZVxuICogcHJpbmNpcGFsIHJhdGhlciB0aGFuIE9CTyAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIGFsd2F5cywgYFwidXNlclwiYCBuZXZlciwgYW5kXG4gKiBgXCJhdXRvXCJgIG9ubHkgd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIG5vIE9CTyB0b2tlbiBmb3IgQXBwS2l0IHRvIHVzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVNlcnZpY2VQcmluY2lwYWwgPSBpZGVudGl0eS51c2VTZXJ2aWNlUHJpbmNpcGFsO1xuIl19
@@ -83,6 +83,11 @@ export declare function directMlflowTracingConfigured(): boolean;
83
83
  export declare function appMlflowTraceInfoConfigured(): boolean;
84
84
  /** Initialize the App service-principal client used to persist V4 trace tags and metadata. */
85
85
  export declare function initializeAppMlflowTraceInfo(client?: WorkspaceClient): Promise<boolean>;
86
+ /**
87
+ * Retry Apps trace-location discovery once with a request-scoped workspace
88
+ * client after service-principal startup discovery failed.
89
+ */
90
+ export declare function initializeRequestMlflowTraceInfo(client: WorkspaceClient): Promise<boolean>;
86
91
  /** Trace-level values persisted beside spans already exported by the Apps OTLP sidecar. */
87
92
  export interface AppMlflowTraceInfo {
88
93
  traceId: string;
package/lib/src/mlflow.js CHANGED
@@ -39,6 +39,7 @@ let directMlflowInitStarted = false;
39
39
  let directMlflowProvider;
40
40
  let directMlflowProcessor;
41
41
  let appMlflowTraceInfoInitStarted = false;
42
+ let appMlflowTraceInfoRequestInitStarted = false;
42
43
  let appMlflowTraceInfoClient;
43
44
  let appMlflowTracePrefix;
44
45
  const pendingAppMlflowTraceInfo = new Set();
@@ -194,7 +195,17 @@ async function resolveUcTracePrefix(client) {
194
195
  const experiment = await fetchExperiment(client);
195
196
  if (!experiment)
196
197
  return undefined;
197
- const prefix = ucTracePrefixFromExperimentTags(experiment.tags);
198
+ const location = experiment.trace_location?.uc_trace_location;
199
+ const prefix = ucTracePrefixFromExperimentTags(experiment.tags) ??
200
+ (location
201
+ ? [
202
+ location.catalog,
203
+ location.schema,
204
+ location.effective_table_prefix ?? location.table_prefix,
205
+ ]
206
+ .filter(Boolean)
207
+ .join(".")
208
+ : undefined);
198
209
  loadedUcPrefix = { prefix };
199
210
  return prefix;
200
211
  }
@@ -210,6 +221,23 @@ const MlflowExperimentResponseSchema = z
210
221
  .object({
211
222
  experiment_id: z.string().min(1).describe("Workspace MLflow experiment identifier."),
212
223
  tags: z.unknown().optional().describe("Experiment tags, including the UC trace location."),
224
+ trace_location: z
225
+ .object({
226
+ uc_trace_location: z
227
+ .object({
228
+ catalog: z.string().describe("Unity Catalog catalog name."),
229
+ schema: z.string().describe("Unity Catalog schema name."),
230
+ table_prefix: z.string().describe("Configured trace table prefix."),
231
+ effective_table_prefix: z
232
+ .string()
233
+ .optional()
234
+ .describe("Effective trace table prefix selected by Databricks."),
235
+ })
236
+ .optional()
237
+ .describe("Unity Catalog trace location."),
238
+ })
239
+ .optional()
240
+ .describe("Experiment trace storage location."),
213
241
  })
214
242
  .passthrough()
215
243
  .describe("Configured MLflow experiment."),
@@ -322,11 +350,11 @@ export async function initializeAppMlflowTraceInfo(client) {
322
350
  appMlflowTraceInfoInitStarted = true;
323
351
  try {
324
352
  const resolvedClient = client ?? createWorkspaceClient();
353
+ appMlflowTraceInfoClient ??= resolvedClient;
325
354
  const prefix = await resolveUcTracePrefix(resolvedClient);
326
355
  if (!prefix || prefix.split(".").length !== 3) {
327
356
  throw new ConfigurationError("Databricks Apps MLflow trace-info promotion requires a UC-linked experiment or MLFLOW_UC_TRACE_PREFIX.");
328
357
  }
329
- appMlflowTraceInfoClient = resolvedClient;
330
358
  appMlflowTracePrefix = prefix;
331
359
  logger.info("Databricks Apps MLflow trace-info promotion enabled", { prefix });
332
360
  return true;
@@ -335,9 +363,26 @@ export async function initializeAppMlflowTraceInfo(client) {
335
363
  logger.warn("Databricks Apps MLflow trace-info promotion disabled", {
336
364
  error: errorUtils.toError(err),
337
365
  });
366
+ // Startup uses the service principal. Permit one later request-scoped
367
+ // client to resolve experiment metadata when that principal cannot read it.
368
+ if (client === undefined)
369
+ appMlflowTraceInfoInitStarted = false;
338
370
  return false;
339
371
  }
340
372
  }
373
+ /**
374
+ * Retry Apps trace-location discovery once with a request-scoped workspace
375
+ * client after service-principal startup discovery failed.
376
+ */
377
+ export async function initializeRequestMlflowTraceInfo(client) {
378
+ if (appMlflowTraceInfoClient && appMlflowTracePrefix)
379
+ return true;
380
+ if (appMlflowTraceInfoRequestInitStarted || !appMlflowTraceInfoConfigured())
381
+ return false;
382
+ appMlflowTraceInfoRequestInitStarted = true;
383
+ appMlflowTraceInfoInitStarted = false;
384
+ return initializeAppMlflowTraceInfo(client);
385
+ }
341
386
  /** Persist MLflow V4 trace info for one Databricks Apps OTel root without re-exporting spans. */
342
387
  export function persistAppMlflowTraceInfo(params) {
343
388
  const client = appMlflowTraceInfoClient;
@@ -389,6 +434,7 @@ export function persistAppMlflowTraceInfo(params) {
389
434
  /** Reset Apps trace-info promotion state for tests. */
390
435
  export function resetAppMlflowTraceInfo() {
391
436
  appMlflowTraceInfoInitStarted = false;
437
+ appMlflowTraceInfoRequestInitStarted = false;
392
438
  appMlflowTraceInfoClient = undefined;
393
439
  appMlflowTracePrefix = undefined;
394
440
  pendingAppMlflowTraceInfo.clear();
@@ -637,4 +683,4 @@ export async function logFeedback(client, params) {
637
683
  }
638
684
  return undefined;
639
685
  }
640
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFJNUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFLM0MsSUFBSSxZQUFzQyxDQUFDO0FBQzNDLElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLElBQUksb0JBQW9ELENBQUM7QUFDekQsSUFBSSxxQkFBZ0QsQ0FBQztBQUNyRCxJQUFJLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUMxQyxJQUFJLHdCQUFxRCxDQUFDO0FBQzFELElBQUksb0JBQXdDLENBQUM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztBQUUzRCxNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNDLHdDQUF3QztJQUN4QyxxQ0FBcUM7SUFDckMsNkJBQTZCO0NBQzlCLENBQUMsQ0FBQztBQUVILFNBQVMsZ0JBQWdCLENBQUMsSUFBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsSUFBYTtJQUM1QyxPQUFPLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBSUw7SUFIWixRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM3QixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU3QyxZQUE2QixRQUF1QjtRQUF2QixhQUFRLEdBQVIsUUFBUSxDQUFlO0lBQUcsQ0FBQztJQUV4RCxPQUFPLENBQUMsSUFBYSxFQUFFLGFBQXNCO1FBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQy9DLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBYTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQWtCO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTztRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU07WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBS0QseUVBQXlFO0FBQ3pFLE1BQU0sMEJBQTBCLEdBQUcsa0RBQWtELENBQUM7QUFDdEYseUZBQXlGO0FBQ3pGLE1BQU0sNEJBQTRCLEdBQUcsbURBQW1ELENBQUM7QUFFekY7Ozs7R0FJRztBQUNILElBQUksY0FBMEQsQ0FBQztBQUUvRCw2RUFBNkU7QUFDN0UsU0FBUyxpQkFBaUIsQ0FBQyxHQUF1QjtJQUNoRCxNQUFNLEtBQUssR0FBRyxHQUFHO1FBQ2YsRUFBRSxJQUFJLEVBQUU7U0FDUCxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztTQUN4QixPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxJQUFJLFNBQVMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUF5QjtJQUNwRCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRSxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFZO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFGLFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxPQUFnQjtJQUM5RCxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztJQUM1RSxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDMUUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsbURBQW1EO0FBQ25ELE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsY0FBYyxHQUFHLFNBQVMsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxPQUFlLEVBQUUsTUFBZTtJQUN0RSxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM5RCxDQUFDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLE1BQXVCO0lBQ3pELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0RSxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixJQUFJLGNBQWM7UUFBRSxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsQyxNQUFNLE1BQU0sR0FBRywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEUsY0FBYyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDNUIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFLENBQ2xELDBCQUEwQixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBRXRFLDhFQUE4RTtBQUM5RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1Qiw4RUFBOEU7QUFDOUUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFFbEMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLFVBQVUsRUFBRSxDQUFDO1NBQ1YsTUFBTSxDQUFDO1FBQ04sYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLHlDQUF5QyxDQUFDO1FBQ3BGLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLG1EQUFtRCxDQUFDO0tBQzNGLENBQUM7U0FDRCxXQUFXLEVBQUU7U0FDYixRQUFRLENBQUMsK0JBQStCLENBQUM7Q0FDN0MsQ0FBQztLQUNELFdBQVcsRUFBRTtLQUNiLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRS9DLE1BQU0seUJBQXlCLEdBQUcsQ0FBQztLQUNoQyxNQUFNLENBQUM7SUFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQztJQUN4RSxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztJQUMxRixXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQztJQUM5RSxNQUFNLEVBQUUsQ0FBQztTQUNOLEtBQUssQ0FDSixDQUFDO1NBQ0UsTUFBTSxDQUFDO1FBQ04sS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7UUFDcEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7S0FDekUsQ0FBQztTQUNELFdBQVcsRUFBRSxDQUNqQjtTQUNBLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztDQUN6RCxDQUFDO0tBQ0QsV0FBVyxFQUFFO0tBQ2IsUUFBUSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFFckQsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDO0tBQzFDLE1BQU0sQ0FBQztJQUNOLG1CQUFtQixFQUFFLENBQUM7U0FDbkIsS0FBSyxDQUNKLENBQUM7U0FDRSxNQUFNLENBQUM7UUFDTixTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztRQUNuRSxzQkFBc0IsRUFBRSxDQUFDO2FBQ3RCLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQztRQUNoRCxlQUFlLEVBQUUsQ0FBQzthQUNmLEtBQUssQ0FDSixDQUFDO2FBQ0UsTUFBTSxDQUFDO1lBQ04sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsQ0FBQztTQUNoRixDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQ2pCO2FBQ0EsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUFDLHNEQUFzRCxDQUFDO0tBQ3BFLENBQUM7U0FDRCxXQUFXLEVBQUUsQ0FDakI7U0FDQSxRQUFRLEVBQUU7U0FDVixRQUFRLENBQUMsb0NBQW9DLENBQUM7Q0FDbEQsQ0FBQztLQUNELFdBQVcsRUFBRTtLQUNiLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0FBRTNELFNBQVMsb0JBQW9CO0lBQzNCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLElBQUksZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELElBQUksVUFBVSxJQUFJLFVBQVUsS0FBSyxZQUFZO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDNUQsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUseUJBQXlCO0lBRXZDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9ELElBQUksV0FBVyxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3JFLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6RCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RFLE9BQU87UUFDTCxXQUFXLEVBQUUsYUFBYTtRQUMxQixVQUFVLEVBQUUsWUFBWTtRQUN4QixXQUFXLEVBQUUsV0FBVztLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLE9BQU8sT0FBTyxDQUNaLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUU7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7UUFDeEMsdUJBQXVCLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLE9BQU8sQ0FDWixnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRTtRQUNyQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4RixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDMUQsQ0FBQztBQUNKLENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxNQUF3QjtJQUN6RSxJQUFJLHdCQUF3QixJQUFJLG9CQUFvQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2xFLElBQUksNkJBQTZCLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ25GLDZCQUE2QixHQUFHLElBQUksQ0FBQztJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUsscUJBQXFCLEVBQXNCLENBQUM7UUFDOUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsd0dBQXdHLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBQ0Qsd0JBQXdCLEdBQUcsY0FBYyxDQUFDO1FBQzFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsRUFBRTtZQUNsRSxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQWVELGlHQUFpRztBQUNqRyxNQUFNLFVBQVUseUJBQXlCLENBQUMsTUFBMEI7SUFDbEUsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQy9CLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPO0lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1FBQzlCLE9BQU8sRUFBRSxVQUFVLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQzdDLGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxlQUFlO1lBQ3ZDLGFBQWEsRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO1NBQ3hEO1FBQ0QsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7UUFDM0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3RELEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUUsYUFBYSxFQUFFO1lBQ2IsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO1lBQ3RDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNwRjtRQUNELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRywwQkFBMEIsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sT0FBTyxDQUFDO0lBQzNGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7U0FDeEYsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUN2QixJQUFJLFFBQVEsQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFO1lBQ2hFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxvREFBb0QsRUFBRTtZQUNoRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1RCx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELHVEQUF1RDtBQUN2RCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLDZCQUE2QixHQUFHLEtBQUssQ0FBQztJQUN0Qyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7SUFDckMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRCxLQUFLLFVBQVUsaUNBQWlDLENBQzlDLE1BQW9CLEVBQ3BCLFdBQW1CLEVBQ25CLFlBQW9CLEVBQ3BCLElBQXdCO0lBRXhCLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixFQUFFLENBQUM7SUFDN0MsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQzdDLFdBQVc7WUFDWCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEMsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMvRixNQUFNLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsT0FBTztZQUNMLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDL0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELEVBQUU7WUFDOUQsWUFBWTtZQUNaLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztTQUMvQixDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QjtJQUNqRCxJQUFJLFlBQVk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM5QixJQUFJLHVCQUF1QixJQUFJLENBQUMsNkJBQTZCLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RSx1QkFBdUIsR0FBRyxJQUFJLENBQUM7SUFFL0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsRUFBRyxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3BELE1BQU0sSUFBSSxHQUFHLE9BQU87WUFDbEIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUM3QixDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsV0FBVyxPQUFPLEVBQUU7WUFDeEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sYUFBYSxHQUFHLE1BQU0saUNBQWlDLENBQzNELE1BQU0sRUFDTixXQUFXLEVBQ1gsWUFBWSxFQUNaLElBQUksQ0FDTCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsd0ZBQXdGLENBQ3pGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxDQUFDLEVBQUUsNkJBQTZCLEVBQUUsOEJBQThCLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FDNUUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQztZQUNqRCxNQUFNLENBQUMsK0JBQStCLENBQUM7U0FDeEMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQzdDLFdBQVc7WUFDWCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxRQUFRLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHVCQUF1QixDQUMzQyxJQUFJLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FDNUQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztRQUNoQyxxQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUMzQyxZQUFZO1lBQ1osV0FBVztZQUNYLGFBQWE7U0FDZCxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRTtZQUM1QyxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBa0M7SUFDeEUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLDJCQUEyQixDQUFDLElBQTRCO0lBQ3RFLHVCQUF1QixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxxQkFBcUIsS0FBSyxTQUFTLENBQUM7QUFDN0MsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QjtJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFDLE1BQU0sb0JBQW9CLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhO0lBQzNCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUU7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLEVBQUUsQ0FDdkQsQ0FBQztJQUNGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUN2RixDQUFDO0lBQ0YsT0FBTyxhQUFhLElBQUksQ0FBQyxXQUFXLElBQUksNkJBQTZCLEVBQUUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLE1BQXVCO0lBRXZCLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsaUNBQWlDLENBQzlDLE1BQXVCO0lBRXZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVwQyxNQUFNLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQy9ELGVBQWUsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDekUsZUFBZSxDQUNiLE1BQU0sRUFDTixvQ0FBb0Msa0JBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFDdEUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQ2xCO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFckUsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUM3RixNQUFNLFdBQVcsR0FBRyxtQ0FBbUMsQ0FBQyxTQUFTLENBQy9ELE1BQU0sZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQztJQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUUvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FDdkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FDbEYsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQ0YsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUN4QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FDekQsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3BFLENBQ0YsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUM1RSxNQUFNLE9BQU8sR0FDWCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsS0FBSyxDQUFDLHNCQUFzQixLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzNGLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQ0wsT0FBTztZQUNQLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2hDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEtBQUssWUFBWSxDQUM3RCxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFakMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RCxPQUFPLElBQUksR0FBRyxDQUFDLG1CQUFtQixrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3pGLENBQUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUM1QixNQUF1QjtJQUV2QixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQzFDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxFQUFFO1FBQ3hCLENBQUMsQ0FBQyxpREFBaUQsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3RGLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNmLENBQUMsQ0FBQywyREFBMkQsa0JBQWtCLENBQzNFLFVBQVUsQ0FBQyxJQUFJLENBQ2hCLEVBQUU7WUFDTCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLE1BQU0sTUFBTSxHQUFHLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUYsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsTUFBdUI7SUFDeEQsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUMxQyxJQUFJLFVBQVUsQ0FBQyxFQUFFO1FBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQztBQUN4RCxDQUFDO0FBUUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLE1BQXVCLEVBQ3ZCLE1BQXlCO0lBRXpCLHFFQUFxRTtJQUNyRSxrRUFBa0U7SUFDbEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQ1IsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDbkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDOUUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQy9DLE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FDbkMsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUE0QjtRQUMxQyxRQUFRLEVBQUUsaUJBQWlCO1FBQzNCLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLE1BQU0sRUFBRTtZQUNOLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU07U0FDN0M7UUFDRCxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDbkIsR0FBRyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM3RSxDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUU1QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUM5RCxJQUFJLEdBQWEsQ0FBQztRQUNsQixJQUFJLENBQUM7WUFDSCxHQUFHLEdBQUcsTUFBTSxlQUFlLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUN0RSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJO2FBQ0wsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQ3ZCLGlCQUFpQjtnQkFDakIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2FBQy9CLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLEdBQ2YsTUFBdUQsRUFBRSxVQUFVLEVBQUUsYUFBYTtnQkFDbEYsTUFBc0MsRUFBRSxhQUFhLENBQUM7WUFDekQsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFDRCxrRUFBa0U7UUFDbEUsMERBQTBEO1FBQzFELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDdEQsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0QsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ25DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixpQkFBaUI7WUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUxmbG93IHVzZXItZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFVDLWJhY2tlZCBBcHBzIHRyYWNlcyBuZWVkXG4gKiB0aGUgZXhwZXJpbWVudCdzIHRhYmxlLXByZWZpeCBVUkkgKGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YClcbiAqIHJhdGhlciB0aGFuIHRoZSBleHBlcmltZW50LXN0b3JlIGlkIHRoZSBVSSBkb2VzIG5vdCBzdG9yZS4gVGhhdCBwcmVmaXggaXNcbiAqIHJlYWQgZnJvbSB0aGUgZXhwZXJpbWVudCdzIGBtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhgXG4gKiB0YWcgKG9yIHRoZSBzcGFucy10YWJsZSB0YWcpOyBgTUxGTE9XX1VDX1RSQUNFX1BSRUZJWGAgcmVtYWlucyBhbiBvcHRpb25hbFxuICogb3ZlcnJpZGUuIFRyYWNlIGV4cG9ydCBpcyBhc3luY2hyb25vdXMsIHNvIHRoZSBqdXN0LWZpbmlzaGVkIHRyYWNlIG1heSBub3RcbiAqIGV4aXN0IGluIE1MZmxvdyB5ZXQgd2hlbiB0aGUgdXNlciByZWFjdHM7IHRoZSBsb2cgY2FsbCByZXRyaWVzIGJyaWVmbHkgb25cbiAqIFwibm90IGZvdW5kXCIgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlbnZpcm9ubWVudFV0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IFRyYWNlTG9jYXRpb25UeXBlLCBUcmFjZU1ldGFkYXRhS2V5IH0gZnJvbSBcIkBtbGZsb3cvY29yZVwiO1xuaW1wb3J0IHsgVHJhY2VJbmZvIH0gZnJvbSBcIkBtbGZsb3cvY29yZS9kaXN0L2NvcmUvZW50aXRpZXMvdHJhY2VfaW5mby5qc1wiO1xuaW1wb3J0IHsgVHJhY2VTdGF0ZSB9IGZyb20gXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2VudGl0aWVzL3RyYWNlX3N0YXRlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlU3BhbiwgU3BhbiBhcyBTZGtTcGFuLCBTcGFuUHJvY2Vzc29yIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUcmFjZXJQcm92aWRlciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGRhdGFicmlja3NGZXRjaCwgcmVhZFJlc3BvbnNlSnNvbiwgcmVhZFJlc3BvbnNlVGV4dCB9IGZyb20gXCIuL3Jlc3QudHNcIjtcbmltcG9ydCB7IEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIgfSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWxmbG93XCIpO1xuXG50eXBlIE1sZmxvd01vZHVsZSA9IHR5cGVvZiBpbXBvcnQoXCJAbWxmbG93L2NvcmVcIik7XG50eXBlIFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMgPSBQYXJhbWV0ZXJzPE1sZmxvd01vZHVsZVtcInVwZGF0ZUN1cnJlbnRUcmFjZVwiXT5bMF07XG5cbmxldCBkaXJlY3RNbGZsb3c6IE1sZmxvd01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBkaXJlY3RNbGZsb3dJbml0U3RhcnRlZCA9IGZhbHNlO1xubGV0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyOiBOb2RlVHJhY2VyUHJvdmlkZXIgfCB1bmRlZmluZWQ7XG5sZXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xubGV0IGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5sZXQgYXBwTWxmbG93VHJhY2VQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmNvbnN0IHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8gPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG5cbmNvbnN0IE5PSVNZX0lOU1RSVU1FTlRBVElPTl9TQ09QRVMgPSBuZXcgU2V0KFtcbiAgXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24tZXhwcmVzc1wiLFxuICBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwXCIsXG4gIFwiY2FjaGUtbWFuYWdlci1jYWNoZS1tYW5hZ2VyXCIsXG5dKTtcblxuZnVuY3Rpb24gaXNBZ2VudFRyYWNlUm9vdChzcGFuOiBTZGtTcGFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGFuLmF0dHJpYnV0ZXNbQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUl0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW46IFNka1NwYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFOT0lTWV9JTlNUUlVNRU5UQVRJT05fU0NPUEVTLmhhcyhzcGFuLmluc3RydW1lbnRhdGlvblNjb3BlLm5hbWUpO1xufVxuXG4vKipcbiAqIFJlc3RyaWN0IHRoZSBkaXJlY3QgTUxmbG93IHByb3ZpZGVyIHRvIGNoYXQgcm9vdHMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzLlxuICogQXBwS2l0IGFuZCBNYXN0cmEgY3JlYXRlIG90aGVyIE9UZWwgcm9vdHMgZm9yIGNhY2hlIGFuZCBwbHVnaW4gb3BlcmF0aW9ucztcbiAqIGZvcndhcmRpbmcgdGhvc2Ugd291bGQgcmVjcmVhdGUgdGhlIG9uZS10cmFjZS1wZXItcmVxdWVzdCBub2lzZSB0aGlzIHBhdGggaXNcbiAqIGludGVuZGVkIHRvIGF2b2lkLlxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRUcmFjZVNwYW5Qcm9jZXNzb3IgaW1wbGVtZW50cyBTcGFuUHJvY2Vzc29yIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFjZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlbGVnYXRlOiBTcGFuUHJvY2Vzc29yKSB7fVxuXG4gIG9uU3RhcnQoc3BhbjogU2RrU3BhbiwgcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBpc1Jvb3QgPSAhc3Bhbi5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGlmICghaXNBZ2VudFRyYWNlUm9vdChzcGFuKSkgcmV0dXJuO1xuICAgICAgdGhpcy50cmFjZUlkcy5hZGQodHJhY2VJZCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy50cmFjZUlkcy5oYXModHJhY2VJZCkgfHwgIWlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Bhbklkcy5hZGQoc3Bhbi5zcGFuQ29udGV4dCgpLnNwYW5JZCk7XG4gICAgdGhpcy5kZWxlZ2F0ZS5vblN0YXJ0KHNwYW4sIHBhcmVudENvbnRleHQpO1xuICB9XG5cbiAgb25FbmRpbmcoc3BhbjogU2RrU3Bhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmhhcyhzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZWdhdGUub25FbmRpbmc/LihzcGFuKTtcbiAgfVxuXG4gIG9uRW5kKHNwYW46IFJlYWRhYmxlU3Bhbik6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBzcGFuSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkO1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmRlbGV0ZShzcGFuSWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxlZ2F0ZS5vbkVuZChzcGFuKTtcbiAgICBpZiAoIXNwYW4ucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZCkgdGhpcy50cmFjZUlkcy5kZWxldGUodHJhY2VJZCk7XG4gIH1cblxuICBmb3JjZUZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmZvcmNlRmx1c2goKTtcbiAgfVxuXG4gIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudHJhY2VJZHMuY2xlYXIoKTtcbiAgICB0aGlzLnNwYW5JZHMuY2xlYXIoKTtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbi8qKiBXb3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIEV4cGVyaW1lbnQgdGFnIERhdGFicmlja3Mgc3RvcmVzIGFzIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgLiAqL1xuY29uc3QgVFJBQ0VfREVTVElOQVRJT05fUEFUSF9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZURlc3RpbmF0aW9uUGF0aFwiO1xuLyoqIEV4cGVyaW1lbnQgdGFnIG5hbWluZyB0aGUgT1RlbCBzcGFucyB0YWJsZSAoYGNhdGFsb2cuc2NoZW1hLntwcmVmaXh9X290ZWxfc3BhbnNgKS4gKi9cbmNvbnN0IFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZVNwYW5TdG9yYWdlVGFibGVcIjtcblxuLyoqXG4gKiBDYWNoZWQgVUMgdGFibGUgcHJlZml4IHJlc29sdmVkIGZyb20gdGhlIGV4cGVyaW1lbnQuIGBsb2FkZWRgIGRpc3Rpbmd1aXNoZXNcbiAqIFwibm90IGZldGNoZWQgeWV0XCIgZnJvbSBcImZldGNoZWQsIGV4cGVyaW1lbnQgaGFzIG5vIFVDIGxvY2F0aW9uXCIuIE5ldHdvcmtcbiAqIGZhaWx1cmVzIGFyZSBub3QgY2FjaGVkIHNvIGEgbGF0ZXIgdGh1bWJzIGNsaWNrIGNhbiByZXRyeS5cbiAqL1xubGV0IGxvYWRlZFVjUHJlZml4OiB7IHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJpcCB0aGUgYHRyYWNlOi9gIFVSSSB3cmFwcGVyIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZyb20gYSBVQyBwcmVmaXguICovXG5mdW5jdGlvbiBub3JtYWxpemVVY1ByZWZpeChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcmF3XG4gICAgPy50cmltKClcbiAgICAucmVwbGFjZSgvXnRyYWNlOlxcLy8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIHJldHVybiB2YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVyaXZlIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgIGZyb20gYSBzcGFucyB0YWJsZSBuYW1lLlxuICogRGF0YWJyaWNrcyBuYW1lcyB0aGUgdGFibGUgYHtwcmVmaXh9X290ZWxfc3BhbnNgLlxuICovXG5mdW5jdGlvbiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhYmxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBuYW1lID0gdGFibGU/LnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIl9vdGVsX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfb3RlbF9zcGFuc1wiLmxlbmd0aCk7XG4gIGlmIChuYW1lLmVuZHNXaXRoKFwiX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfc3BhbnNcIi5sZW5ndGgpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHBlcmltZW50VGFnTWFwKHJhdzogdW5rbm93bik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHJhdykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQodGFnKSB8fCB0eXBlb2YgdGFnLmtleSAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdGFnLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFncy5zZXQodGFnLmtleSwgdGFnLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3M7XG4gIH1cbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQocmF3KSkgcmV0dXJuIHRhZ3M7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhdykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0YWdzLnNldChrZXksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGFncztcbn1cblxuLyoqXG4gKiBVQyB0YWJsZSBwcmVmaXggdGhlIGFzc2Vzc21lbnRzIEFQSSBuZWVkcywgcmVhZCBmcm9tIGV4cGVyaW1lbnQgdGFncy5cbiAqXG4gKiBQcmVmZXJzIHRoZSB0aHJlZS1wYXJ0IGRlc3RpbmF0aW9uIHBhdGggRGF0YWJyaWNrcyB3cml0ZXMgd2hlbiB0aGVcbiAqIGV4cGVyaW1lbnQgaXMgbGlua2VkIHRvIGEgdGFibGUtcHJlZml4IGxvY2F0aW9uLiBGYWxscyBiYWNrIHRvIHN0cmlwcGluZ1xuICogYF9vdGVsX3NwYW5zYCBmcm9tIHRoZSBzcGFucy10YWJsZSB0YWcuIFR3by1wYXJ0IHNjaGVtYS1saW5rZWQgZGVzdGluYXRpb25zXG4gKiBhcmUgaWdub3JlZCAodGhleSBhcmUgbm90IGEgdGFibGUgcHJlZml4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVjVHJhY2VQcmVmaXhGcm9tRXhwZXJpbWVudFRhZ3MocmF3VGFnczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ3MgPSBleHBlcmltZW50VGFnTWFwKHJhd1RhZ3MpO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVVjUHJlZml4KHRhZ3MuZ2V0KFRSQUNFX0RFU1RJTkFUSU9OX1BBVEhfVEFHKSk7XG4gIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5zcGxpdChcIi5cIikubGVuZ3RoID49IDMpIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgcmV0dXJuIHByZWZpeEZyb21TcGFuVGFibGUodGFncy5nZXQoVFJBQ0VfU1BBTl9TVE9SQUdFX1RBQkxFX1RBRykpO1xufVxuXG4vKiogRHJvcCB0aGUgaW4tcHJvY2VzcyBVQyBwcmVmaXggY2FjaGUgKHRlc3RzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFVjVHJhY2VQcmVmaXhDYWNoZSgpOiB2b2lkIHtcbiAgbG9hZGVkVWNQcmVmaXggPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJhY2UgaWQgdGhlIGFzc2Vzc21lbnRzIFJFU1QgQVBJIGFjY2VwdHMgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBEYXRhYnJpY2tzIEFwcHMgcGVyc2lzdCB0cmFjZXMgaW4gVW5pdHkgQ2F0YWxvZy4gVGhlIGV4cGVyaW1lbnQgVUkgbGlzdHNcbiAqIHRob3NlIHJvd3MsIGJ1dCBgUE9TVCAvYXBpLzMuMC9tbGZsb3cvdHJhY2VzL3tpZH0vYXNzZXNzbWVudHNgIGxvb2tzIHVwIHRoZVxuICogZXhwZXJpbWVudCBzdG9yZSB1bmxlc3MgYHtpZH1gIGlzIHRoZSBVQyBVUkkgYHRyYWNlOi97Y2F0YWxvZ30ue3NjaGVtYX0ue3ByZWZpeH0ve3RyLWhleH1gLlxuICogQSBiYXJlIGB0ci08aGV4PmAgNDA0cyBhbmQgdGhlIGFzc2Vzc21lbnQgbmV2ZXIgYXBwZWFycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKHRyYWNlSWQ6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVVY1ByZWZpeChwcmVmaXgpO1xuICByZXR1cm4gcmVzb2x2ZWQgPyBgdHJhY2U6LyR7cmVzb2x2ZWR9LyR7dHJhY2VJZH1gIDogdHJhY2VJZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVVjVHJhY2VQcmVmaXgoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmcm9tRW52ID0gbm9ybWFsaXplVWNQcmVmaXgocHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1RSQUNFX1BSRUZJWCk7XG4gIGlmIChmcm9tRW52KSByZXR1cm4gZnJvbUVudjtcbiAgaWYgKGxvYWRlZFVjUHJlZml4KSByZXR1cm4gbG9hZGVkVWNQcmVmaXgucHJlZml4O1xuICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcHJlZml4ID0gdWNUcmFjZVByZWZpeEZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpO1xuICBsb2FkZWRVY1ByZWZpeCA9IHsgcHJlZml4IH07XG4gIHJldHVybiBwcmVmaXg7XG59XG5cbi8qKiBBc3Nlc3NtZW50cyBSRVNUIHBhdGggZm9yIGEgdHJhY2UuIGAzLjBgIGlzIHRoZSBjdXJyZW50IE1MZmxvdyBBUEkgdmVyc2lvbi4gKi9cbmNvbnN0IGFzc2Vzc21lbnRzUGF0aCA9ICh0cmFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYC9hcGkvMy4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJhY2VJZCl9L2Fzc2Vzc21lbnRzYDtcblxuLyoqIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIFwidHJhY2Ugbm90IGZvdW5kXCIgcmVzcG9uc2UgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IE5PVF9GT1VORF9SRVRSSUVTID0gMztcbi8qKiBCYXNlIGJhY2tvZmYgYmV0d2VlbiBcInRyYWNlIG5vdCBmb3VuZFwiIHJldHJpZXMsIGluIG1zIChncm93cyBsaW5lYXJseSkuICovXG5jb25zdCBOT1RfRk9VTkRfQkFDS09GRl9NUyA9IDEyMDA7XG5cbmNvbnN0IE1sZmxvd0V4cGVyaW1lbnRSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZXhwZXJpbWVudDogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGV4cGVyaW1lbnRfaWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiV29ya3NwYWNlIE1MZmxvdyBleHBlcmltZW50IGlkZW50aWZpZXIuXCIpLFxuICAgICAgICB0YWdzOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXhwZXJpbWVudCB0YWdzLCBpbmNsdWRpbmcgdGhlIFVDIHRyYWNlIGxvY2F0aW9uLlwiKSxcbiAgICAgIH0pXG4gICAgICAucGFzc3Rocm91Z2goKVxuICAgICAgLmRlc2NyaWJlKFwiQ29uZmlndXJlZCBNTGZsb3cgZXhwZXJpbWVudC5cIiksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpXG4gIC5kZXNjcmliZShcIk1MZmxvdyBnZXQtZXhwZXJpbWVudCByZXNwb25zZS5cIik7XG5cbmNvbnN0IEN1cnJlbnRVc2VyUmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHVzZXJOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJDdXJyZW50IHdvcmtzcGFjZSB1c2VyIG5hbWUuXCIpLFxuICAgIGFwcGxpY2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgc2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgIGRpc3BsYXlOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJDdXJyZW50IHByaW5jaXBhbCBkaXNwbGF5IG5hbWUuXCIpLFxuICAgIGdyb3VwczogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB2YWx1ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV29ya3NwYWNlIGdyb3VwIGlkZW50aWZpZXIuXCIpLFxuICAgICAgICAgICAgZGlzcGxheTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV29ya3NwYWNlIGdyb3VwIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJHcm91cHMgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgcHJpbmNpcGFsLlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBDdXJyZW50IFVzZXIgQVBJIHJlc3BvbnNlLlwiKTtcblxuY29uc3QgRXhwZXJpbWVudFBlcm1pc3Npb25zUmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGFjY2Vzc19jb250cm9sX2xpc3Q6IHpcbiAgICAgIC5hcnJheShcbiAgICAgICAgelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgdXNlcl9uYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJVc2VyIHByaW5jaXBhbCBuYW1lLlwiKSxcbiAgICAgICAgICAgIGdyb3VwX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkdyb3VwIHByaW5jaXBhbCBuYW1lLlwiKSxcbiAgICAgICAgICAgIHNlcnZpY2VfcHJpbmNpcGFsX25hbWU6IHpcbiAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIlNlcnZpY2UgcHJpbmNpcGFsIGFwcGxpY2F0aW9uIGlkLlwiKSxcbiAgICAgICAgICAgIGFsbF9wZXJtaXNzaW9uczogelxuICAgICAgICAgICAgICAuYXJyYXkoXG4gICAgICAgICAgICAgICAgelxuICAgICAgICAgICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25fbGV2ZWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJFZmZlY3RpdmUgZXhwZXJpbWVudCBwZXJtaXNzaW9uIGxldmVsLlwiKSxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCJEaXJlY3QgYW5kIGluaGVyaXRlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBwcmluY2lwYWwuXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBhc3N0aHJvdWdoKCksXG4gICAgICApXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRXhwZXJpbWVudCBhY2Nlc3MgY29udHJvbCBlbnRyaWVzLlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBleHBlcmltZW50IHBlcm1pc3Npb25zIHJlc3BvbnNlLlwiKTtcblxuZnVuY3Rpb24gY29uZmlndXJlZEV4cGVyaW1lbnQoKTogeyBpZD86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9IHtcbiAgY29uc3QgaWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpO1xuICBjb25zdCBuYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfTkFNRT8udHJpbSgpO1xuICByZXR1cm4ge1xuICAgIC4uLihpZCA/IHsgaWQgfSA6IHt9KSxcbiAgICAuLi4obmFtZSA/IHsgbmFtZSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogVHJhY2tpbmcgVVJJIGZvciBkaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcsIHdpdGggQ0xJLXByb2ZpbGUgYXV0aCBpbmplY3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFja2luZ1VyaSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY29uZmlndXJlZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19UUkFDS0lOR19VUkk/LnRyaW0oKTtcbiAgaWYgKGNvbmZpZ3VyZWQgJiYgY29uZmlndXJlZCAhPT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBjb25maWd1cmVkO1xuICBjb25zdCBwcm9maWxlID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRT8udHJpbSgpO1xuICByZXR1cm4gcHJvZmlsZSA/IGBkYXRhYnJpY2tzOi8vJHtwcm9maWxlfWAgOiBcImRhdGFicmlja3NcIjtcbn1cblxuLyoqIFBhcnNlIHRoZSBvcHRpb25hbCBVQyB0YWJsZS1wcmVmaXggbG9jYXRpb24gdXNlZCBieSBkaXJlY3QgbG9jYWwgdHJhY2luZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKCk6XG4gIHsgY2F0YWxvZ05hbWU6IHN0cmluZzsgc2NoZW1hTmFtZTogc3RyaW5nOyB0YWJsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYXRhbG9nTmFtZSA9IHByb2Nlc3MuZW52Lk1MRkxPV19VQ19DQVRBTE9HPy50cmltKCk7XG4gIGNvbnN0IHNjaGVtYU5hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfVUNfU0NIRU1BPy50cmltKCk7XG4gIGNvbnN0IHRhYmxlUHJlZml4ID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1RBQkxFX1BSRUZJWD8udHJpbSgpO1xuICBpZiAoY2F0YWxvZ05hbWUgJiYgc2NoZW1hTmFtZSAmJiB0YWJsZVByZWZpeCkge1xuICAgIHJldHVybiB7IGNhdGFsb2dOYW1lLCBzY2hlbWFOYW1lLCB0YWJsZVByZWZpeCB9O1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gbm9ybWFsaXplVWNQcmVmaXgocHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1RSQUNFX1BSRUZJWCk7XG4gIGlmICghcHJlZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJ0cyA9IHByZWZpeC5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtwcmVmaXhDYXRhbG9nLCBwcmVmaXhTY2hlbWEsIHByZWZpeFRhYmxlXSA9IHBhcnRzO1xuICBpZiAoIXByZWZpeENhdGFsb2cgfHwgIXByZWZpeFNjaGVtYSB8fCAhcHJlZml4VGFibGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgY2F0YWxvZ05hbWU6IHByZWZpeENhdGFsb2csXG4gICAgc2NoZW1hTmFtZTogcHJlZml4U2NoZW1hLFxuICAgIHRhYmxlUHJlZml4OiBwcmVmaXhUYWJsZSxcbiAgfTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGxvY2FsIGRpcmVjdC10by1leHBlcmltZW50IE1MZmxvdyBTREsgaGFzIGVub3VnaCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNpbmdDb25maWd1cmVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAhZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSAmJlxuICAgIHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCkgJiZcbiAgICBkaXJlY3RNbGZsb3dUcmFja2luZ1VyaSgpLFxuICApO1xufVxuXG4vKiogV2hldGhlciBhIERhdGFicmlja3MgQXBwIGNhbiBwcm9tb3RlIE9UTFAgc3BhbnMgaW50byBmdWxsIE1MZmxvdyB0cmFjZSBpbmZvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KCkgJiZcbiAgICAocHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCkpICYmXG4gICAgKHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVD8udHJpbSgpIHx8XG4gICAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UPy50cmltKCkpLFxuICApO1xufVxuXG4vKiogSW5pdGlhbGl6ZSB0aGUgQXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudCB1c2VkIHRvIHBlcnNpc3QgVjQgdHJhY2UgdGFncyBhbmQgbWV0YWRhdGEuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyhjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCAmJiBhcHBNbGZsb3dUcmFjZVByZWZpeCkgcmV0dXJuIHRydWU7XG4gIGlmIChhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCB8fCAhYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNvbHZlZENsaWVudCA9IGNsaWVudCA/PyAoY3JlYXRlV29ya3NwYWNlQ2xpZW50KCkgYXMgV29ya3NwYWNlQ2xpZW50KTtcbiAgICBjb25zdCBwcmVmaXggPSBhd2FpdCByZXNvbHZlVWNUcmFjZVByZWZpeChyZXNvbHZlZENsaWVudCk7XG4gICAgaWYgKCFwcmVmaXggfHwgcHJlZml4LnNwbGl0KFwiLlwiKS5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgIFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiByZXF1aXJlcyBhIFVDLWxpbmtlZCBleHBlcmltZW50IG9yIE1MRkxPV19VQ19UUkFDRV9QUkVGSVguXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBhcHBNbGZsb3dUcmFjZUluZm9DbGllbnQgPSByZXNvbHZlZENsaWVudDtcbiAgICBhcHBNbGZsb3dUcmFjZVByZWZpeCA9IHByZWZpeDtcbiAgICBsb2dnZXIuaW5mbyhcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gZW5hYmxlZFwiLCB7IHByZWZpeCB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGRpc2FibGVkXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFRyYWNlLWxldmVsIHZhbHVlcyBwZXJzaXN0ZWQgYmVzaWRlIHNwYW5zIGFscmVhZHkgZXhwb3J0ZWQgYnkgdGhlIEFwcHMgT1RMUCBzaWRlY2FyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBNbGZsb3dUcmFjZUluZm8ge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIHJlcXVlc3RUaW1lOiBudW1iZXI7XG4gIGV4ZWN1dGlvbkR1cmF0aW9uOiBudW1iZXI7XG4gIGVycm9yOiBib29sZWFuO1xuICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB1c2VyPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHJlcXVlc3RQcmV2aWV3Pzogc3RyaW5nO1xuICByZXNwb25zZVByZXZpZXc/OiBzdHJpbmc7XG59XG5cbi8qKiBQZXJzaXN0IE1MZmxvdyBWNCB0cmFjZSBpbmZvIGZvciBvbmUgRGF0YWJyaWNrcyBBcHBzIE9UZWwgcm9vdCB3aXRob3V0IHJlLWV4cG9ydGluZyBzcGFucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHBhcmFtczogQXBwTWxmbG93VHJhY2VJbmZvKTogdm9pZCB7XG4gIGNvbnN0IGNsaWVudCA9IGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudDtcbiAgY29uc3QgcHJlZml4ID0gYXBwTWxmbG93VHJhY2VQcmVmaXg7XG4gIGlmICghY2xpZW50IHx8ICFwcmVmaXgpIHJldHVybjtcbiAgY29uc3QgW2NhdGFsb2dOYW1lLCBzY2hlbWFOYW1lLCB0YWJsZVByZWZpeF0gPSBwcmVmaXguc3BsaXQoXCIuXCIpO1xuICBpZiAoIWNhdGFsb2dOYW1lIHx8ICFzY2hlbWFOYW1lIHx8ICF0YWJsZVByZWZpeCkgcmV0dXJuO1xuICBjb25zdCB0cmFjZUluZm8gPSBuZXcgVHJhY2VJbmZvKHtcbiAgICB0cmFjZUlkOiBgdHJhY2U6LyR7cHJlZml4fS8ke3BhcmFtcy50cmFjZUlkfWAsXG4gICAgdHJhY2VMb2NhdGlvbjoge1xuICAgICAgdHlwZTogVHJhY2VMb2NhdGlvblR5cGUuVUNfVEFCTEVfUFJFRklYLFxuICAgICAgdWNUYWJsZVByZWZpeDogeyBjYXRhbG9nTmFtZSwgc2NoZW1hTmFtZSwgdGFibGVQcmVmaXggfSxcbiAgICB9LFxuICAgIHJlcXVlc3RUaW1lOiBwYXJhbXMucmVxdWVzdFRpbWUsXG4gICAgZXhlY3V0aW9uRHVyYXRpb246IHBhcmFtcy5leGVjdXRpb25EdXJhdGlvbixcbiAgICBzdGF0ZTogcGFyYW1zLmVycm9yID8gVHJhY2VTdGF0ZS5FUlJPUiA6IFRyYWNlU3RhdGUuT0ssXG4gICAgLi4uKHBhcmFtcy5yZXF1ZXN0UHJldmlldyA/IHsgcmVxdWVzdFByZXZpZXc6IHBhcmFtcy5yZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgIC4uLihwYXJhbXMucmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXc6IHBhcmFtcy5yZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICB0cmFjZU1ldGFkYXRhOiB7XG4gICAgICBbVHJhY2VNZXRhZGF0YUtleS5TQ0hFTUFfVkVSU0lPTl06IFwiNFwiLFxuICAgICAgLi4uKHBhcmFtcy51c2VyID8geyBbVHJhY2VNZXRhZGF0YUtleS5UUkFDRV9VU0VSXTogcGFyYW1zLnVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMuc2Vzc2lvbklkID8geyBbVHJhY2VNZXRhZGF0YUtleS5UUkFDRV9TRVNTSU9OXTogcGFyYW1zLnNlc3Npb25JZCB9IDoge30pLFxuICAgIH0sXG4gICAgdGFnczogcGFyYW1zLnRhZ3MsXG4gICAgYXNzZXNzbWVudHM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGF0aCA9IGAvYXBpLzQuMC9tbGZsb3cvdHJhY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHByZWZpeCl9LyR7cGFyYW1zLnRyYWNlSWR9L2luZm9gO1xuICBjb25zdCBwZW5kaW5nID0gZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgcGF0aCwgeyBtZXRob2Q6IFwiUE9TVFwiLCBib2R5OiB0cmFjZUluZm8udG9Kc29uKCkgfSlcbiAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuO1xuICAgICAgbG9nZ2VyLndhcm4oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgIHRyYWNlSWQ6IHBhcmFtcy50cmFjZUlkLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgYm9keTogYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXNwb25zZSksXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4gcGVuZGluZ0FwcE1sZmxvd1RyYWNlSW5mby5kZWxldGUocGVuZGluZykpO1xuICBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmFkZChwZW5kaW5nKTtcbn1cblxuLyoqIFJlc2V0IEFwcHMgdHJhY2UtaW5mbyBwcm9tb3Rpb24gc3RhdGUgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0QXBwTWxmbG93VHJhY2VJbmZvKCk6IHZvaWQge1xuICBhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCA9IGZhbHNlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9DbGllbnQgPSB1bmRlZmluZWQ7XG4gIGFwcE1sZmxvd1RyYWNlUHJlZml4ID0gdW5kZWZpbmVkO1xuICBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmNsZWFyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgbWxmbG93OiBNbGZsb3dNb2R1bGUsXG4gIHRyYWNraW5nVXJpOiBzdHJpbmcsXG4gIGV4cGVyaW1lbnRJZDogc3RyaW5nLFxuICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHsgY2F0YWxvZ05hbWU6IHN0cmluZzsgc2NoZW1hTmFtZTogc3RyaW5nOyB0YWJsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKCk7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIGV4cGxpY2l0O1xuICB0cnkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgY2xpZW50LmdldEV4cGVyaW1lbnQoZXhwZXJpbWVudElkKTtcbiAgICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyB1Y0xvY2F0aW9uRnJvbUV4cGVyaW1lbnRUYWdzIH0gPSBhd2FpdCBpbXBvcnQoXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2Rlc3RpbmF0aW9uLmpzXCIpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdWNMb2NhdGlvbkZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpO1xuICAgIGlmICghbG9jYXRpb24/LnRhYmxlUHJlZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjYXRhbG9nTmFtZTogbG9jYXRpb24uY2F0YWxvZ05hbWUsXG4gICAgICBzY2hlbWFOYW1lOiBsb2NhdGlvbi5zY2hlbWFOYW1lLFxuICAgICAgdGFibGVQcmVmaXg6IGxvY2F0aW9uLnRhYmxlUHJlZml4LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGlyZWN0IE1MZmxvdyBVQyB0cmFjZS1sb2NhdGlvbiBkZXRlY3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIE1MZmxvdyBOb2RlIHRyYWNlciBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgd2hlbiBBcHBLaXQgaGFzIG5vIE9UTFBcbiAqIGV4cG9ydGVyLiBUaGlzIHByb3ZpZGVyIGlzIG5ldmVyIHN0YXJ0ZWQgaW4gdGhlIGRlcGxveWVkIEFwcHMgcGF0aCwgYXZvaWRpbmdcbiAqIGEgc2Vjb25kIGdsb2JhbCBPVGVsIHByb3ZpZGVyIHJhY2luZyBBcHBLaXQncyB0ZWxlbWV0cnkgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVEaXJlY3RNbGZsb3dUcmFjaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZGlyZWN0TWxmbG93KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRpcmVjdE1sZmxvd0luaXRTdGFydGVkIHx8ICFkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gIGRpcmVjdE1sZmxvd0luaXRTdGFydGVkID0gdHJ1ZTtcblxuICBjb25zdCBleHBlcmltZW50SWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRCEudHJpbSgpO1xuICBjb25zdCB0cmFja2luZ1VyaSA9IGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCkhO1xuICB0cnkge1xuICAgIGNvbnN0IG1sZmxvdyA9IGF3YWl0IGltcG9ydChcIkBtbGZsb3cvY29yZVwiKTtcbiAgICBjb25zdCByYXdIb3N0ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gICAgY29uc3QgaG9zdCA9IHJhd0hvc3RcbiAgICAgID8gL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdIb3N0KVxuICAgICAgICA/IHJhd0hvc3RcbiAgICAgICAgOiBgaHR0cHM6Ly8ke3Jhd0hvc3R9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJhY2VMb2NhdGlvbiA9IGF3YWl0IGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgICAgIG1sZmxvdyxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgaG9zdCxcbiAgICApO1xuICAgIGlmICghdHJhY2VMb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgXCJEaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcgcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgW3sgRGF0YWJyaWNrc1VDVGFibGVTcGFuRXhwb3J0ZXIsIERhdGFicmlja3NVQ1RhYmxlU3BhblByb2Nlc3NvciB9LCBzZGtdID1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW1wb3J0KFwiQG1sZmxvdy9jb3JlL2Rpc3QvZXhwb3J0ZXJzL3VjX3RhYmxlLmpzXCIpLFxuICAgICAgICBpbXBvcnQoXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiKSxcbiAgICAgIF0pO1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5FeHBvcnRlcihjbGllbnQpO1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvcihcbiAgICAgIG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5Qcm9jZXNzb3IoZXhwb3J0ZXIsIHRyYWNlTG9jYXRpb24pLFxuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc2RrLk5vZGVUcmFjZXJQcm92aWRlcih7IHNwYW5Qcm9jZXNzb3JzOiBbcHJvY2Vzc29yXSB9KTtcbiAgICBwcm92aWRlci5yZWdpc3RlcigpO1xuICAgIGRpcmVjdE1sZmxvdyA9IG1sZmxvdztcbiAgICBkaXJlY3RNbGZsb3dQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIGRpcmVjdE1sZmxvd1Byb2Nlc3NvciA9IHByb2Nlc3NvcjtcbiAgICBsb2dnZXIuaW5mbyhcImRpcmVjdCBNTGZsb3cgdHJhY2luZyBlbmFibGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgdHJhY2VMb2NhdGlvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkaXJlY3QgTUxmbG93IHRyYWNpbmcgZGlzYWJsZWRcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogUGVyc2lzdCB0cmFjZS1sZXZlbCBmaWVsZHMgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgaW4gdGhlIGN1cnJlbnQgT1RlbCBjb250ZXh0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlKG9wdGlvbnM6IFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMpOiB2b2lkIHtcbiAgZGlyZWN0TWxmbG93Py51cGRhdGVDdXJyZW50VHJhY2Uob3B0aW9ucyk7XG59XG5cbi8qKiBQZXJzaXN0IHRhZ3Mgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgYWN0aXZlIGluIHRoZSBjdXJyZW50IE9UZWwgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3ModGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7IHRhZ3MgfSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBvd25zIHRoZSBmaWx0ZXJlZCBsb2NhbCBNTGZsb3cgdHJhY2VyIHByb3ZpZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBkaXJlY3RNbGZsb3dQcm9jZXNzb3IgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIEZsdXNoIHBlbmRpbmcgZGlyZWN0IGxvY2FsIHRyYWNlIGV4cG9ydHMgZHVyaW5nIGdyYWNlZnVsIHNodXRkb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm9dKTtcbiAgYXdhaXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yPy5mb3JjZUZsdXNoKCk7XG4gIGF3YWl0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyPy5mb3JjZUZsdXNoKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBNTGZsb3cgZmVlZGJhY2sgbG9nZ2luZyBpcyBhdmFpbGFibGUgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBFbmFibGVkIHdoZW4gYW4gTUxmbG93IGV4cGVyaW1lbnQgaXMgY29uZmlndXJlZCBhbmQgdHJhY2VzIGhhdmUgYW4gZXhwb3J0XG4gKiBwYXRoOiBBcHBLaXQgT1RMUCBpbiBhIERhdGFicmlja3MgQXBwLCBvciB0aGUgZGlyZWN0IE1MZmxvdyBOb2RlIFNESyBvdXRzaWRlXG4gKiBvbmUuIEJvdGggcGF0aHMgYXJlIHNlbGVjdGVkIGZyb20gc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWxmbG93RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgaGFzRXhwb3J0ZXIgPSBCb29sZWFuKFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVD8udHJpbSgpIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVD8udHJpbSgpLFxuICApO1xuICBjb25zdCBoYXNFeHBlcmltZW50ID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSxcbiAgKTtcbiAgcmV0dXJuIGhhc0V4cGVyaW1lbnQgJiYgKGhhc0V4cG9ydGVyIHx8IGRpcmVjdE1sZmxvd1RyYWNpbmdDb25maWd1cmVkKCkpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY29uZmlndXJlZCBleHBlcmltZW50IFVSTCBvbmx5IHdoZW4gdGhlIGFjdGl2ZSBEYXRhYnJpY2tzXG4gKiBwcmluY2lwYWwgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi4gUGVybWlzc2lvbiBsb29rdXAgaXNcbiAqIGludGVudGlvbmFsbHkgYmVzdC1lZmZvcnQgc28gQXBwcyBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgZXhwb3NlIHRoZVxuICogcmVxdWlyZWQgQVBJcyBzaW1wbHkgb21pdCB0aGUgZGVidWcgYWZmb3JkYW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50SWQgPSBhd2FpdCByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudElkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtjdXJyZW50UmVzcG9uc2UsIHBlcm1pc3Npb25zUmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRhdGFicmlja3NGZXRjaChjbGllbnQsIFwiL2FwaS8yLjAvcHJldmlldy9zY2ltL3YyL01lXCIsIHsgbWV0aG9kOiBcIkdFVFwiIH0pLFxuICAgIGRhdGFicmlja3NGZXRjaChcbiAgICAgIGNsaWVudCxcbiAgICAgIGAvYXBpLzIuMC9wZXJtaXNzaW9ucy9leHBlcmltZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50SWQpfWAsXG4gICAgICB7IG1ldGhvZDogXCJHRVRcIiB9LFxuICAgICksXG4gIF0pO1xuICBpZiAoIWN1cnJlbnRSZXNwb25zZS5vayB8fCAhcGVybWlzc2lvbnNSZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBjdXJyZW50ID0gQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihjdXJyZW50UmVzcG9uc2UpKTtcbiAgY29uc3QgcGVybWlzc2lvbnMgPSBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoXG4gICAgYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihwZXJtaXNzaW9uc1Jlc3BvbnNlKSxcbiAgKTtcbiAgaWYgKCFjdXJyZW50LnN1Y2Nlc3MgfHwgIXBlcm1pc3Npb25zLnN1Y2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdXNlck5hbWVzID0gbmV3IFNldChcbiAgICBbY3VycmVudC5kYXRhLnVzZXJOYW1lLCBjdXJyZW50LmRhdGEuYXBwbGljYXRpb25JZCwgY3VycmVudC5kYXRhLmRpc3BsYXlOYW1lXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBOYW1lcyA9IG5ldyBTZXQoXG4gICAgKGN1cnJlbnQuZGF0YS5ncm91cHMgPz8gW10pLmZsYXRNYXAoKHsgdmFsdWUsIGRpc3BsYXkgfSkgPT5cbiAgICAgIFt2YWx1ZSwgZGlzcGxheV0uZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiBCb29sZWFuKGVudHJ5KSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgY2FuTWFuYWdlID0gKHBlcm1pc3Npb25zLmRhdGEuYWNjZXNzX2NvbnRyb2xfbGlzdCA/PyBbXSkuc29tZSgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgIChlbnRyeS51c2VyX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnVzZXJfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSAhPT0gdW5kZWZpbmVkICYmIHVzZXJOYW1lcy5oYXMoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuZ3JvdXBfbmFtZSAhPT0gdW5kZWZpbmVkICYmIGdyb3VwTmFtZXMuaGFzKGVudHJ5Lmdyb3VwX25hbWUpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbWF0Y2hlcyAmJlxuICAgICAgKGVudHJ5LmFsbF9wZXJtaXNzaW9ucyA/PyBbXSkuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbl9sZXZlbCA9PT0gXCJDQU5fTUFOQUdFXCIsXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG4gIGlmICghY2FuTWFuYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiBuZXcgVVJMKGAvbWwvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLCBob3N0KS50b1N0cmluZygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEV4cGVyaW1lbnQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTx7IGV4cGVyaW1lbnRfaWQ6IHN0cmluZzsgdGFncz86IHVua25vd24gfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50ID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgY29uc3QgcGF0aCA9IGV4cGVyaW1lbnQuaWRcbiAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0P2V4cGVyaW1lbnRfaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudC5pZCl9YFxuICAgIDogZXhwZXJpbWVudC5uYW1lXG4gICAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0LWJ5LW5hbWU/ZXhwZXJpbWVudF9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgIGV4cGVyaW1lbnQubmFtZSxcbiAgICAgICAgKX1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRhdGFicmlja3NGZXRjaChjbGllbnQsIHBhdGgsIHsgbWV0aG9kOiBcIkdFVFwiIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzcG9uc2UpKTtcbiAgcmV0dXJuIHBhcnNlZC5zdWNjZXNzID8gcGFyc2VkLmRhdGEuZXhwZXJpbWVudCA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4cGVyaW1lbnRJZChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25maWd1cmVkRXhwZXJpbWVudCgpO1xuICBpZiAoY29uZmlndXJlZC5pZCkgcmV0dXJuIGNvbmZpZ3VyZWQuaWQ7XG4gIHJldHVybiAoYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCkpPy5leHBlcmltZW50X2lkO1xufVxuXG4vKiogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvZ0ZlZWRiYWNrfS4gKi9cbmV4cG9ydCB0eXBlIExvZ0ZlZWRiYWNrUGFyYW1zID0gZmVlZGJhY2suTWxmbG93RmVlZGJhY2tSZXF1ZXN0ICYge1xuICAvKiogSWRlbnRpdHkgdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gKHVzZXIgZW1haWwgLyBpZCkuICovXG4gIHNvdXJjZUlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBMb2cgYSBIVU1BTiBmZWVkYmFjayBhc3Nlc3NtZW50IHRvIGEgdHJhY2UuIFJldHVybnMgdGhlIGNyZWF0ZWRcbiAqIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdHJhY2UgY2FuJ3QgYmVcbiAqIGZvdW5kIChldmVuIGFmdGVyIHJldHJ5aW5nIGZvciBleHBvcnQgbGFnKSBvciB0aGUgcmVxdWVzdCBvdGhlcndpc2VcbiAqIGZhaWxzIC0gY2FsbGVycyBzdXJmYWNlIHRoYXQgYXMgYSBzb2Z0IFwibm90IHJlY29yZGVkXCIgcmF0aGVyIHRoYW4gYW5cbiAqIGVycm9yLCBrZWVwaW5nIHRoZSBjaGF0IHVzYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ0ZlZWRiYWNrKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGFyYW1zOiBMb2dGZWVkYmFja1BhcmFtcyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIEEgY29tbWVudCB3aXRoIG5vIHRodW1icyB2YWx1ZSBpcyBsb2dnZWQgYXMgdGV4dCBmZWVkYmFjazsgYSB2YWx1ZVxuICAvLyAod2l0aCBhbiBvcHRpb25hbCBjb21tZW50IGFzIHRoZSByYXRpb25hbGUpIGlzIHRoZSB0aHVtYnMgcGF0aC5cbiAgY29uc3QgaGFzVmFsdWUgPSBwYXJhbXMudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbmFtZSA9XG4gICAgcGFyYW1zLm5hbWU/LnRyaW0oKSB8fFxuICAgIChoYXNWYWx1ZSA/IGZlZWRiYWNrLkRFRkFVTFRfRkVFREJBQ0tfTkFNRSA6IGZlZWRiYWNrLkRFRkFVTFRfQ09NTUVOVF9OQU1FKTtcbiAgY29uc3QgdmFsdWUgPSBoYXNWYWx1ZSA/IHBhcmFtcy52YWx1ZSA6IHBhcmFtcy5jb21tZW50O1xuICBjb25zdCBhc3Nlc3NtZW50VHJhY2VJZCA9IG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKFxuICAgIHBhcmFtcy50cmFjZUlkLFxuICAgIGF3YWl0IHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudCksXG4gICk7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKGFzc2Vzc21lbnRUcmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzKTtcbiAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50PzogeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9IH0pPy5hc3Nlc3NtZW50Py5hc3Nlc3NtZW50X2lkID8/XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9KT8uYXNzZXNzbWVudF9pZDtcbiAgICAgIHJldHVybiB0eXBlb2YgYXNzZXNzbWVudElkID09PSBcInN0cmluZ1wiID8gYXNzZXNzbWVudElkIDogXCJcIjtcbiAgICB9XG4gICAgLy8gVHJhY2UgZXhwb3J0IGlzIGFzeW5jOyBhIGZyZXNoIHRyYWNlIG1heSBub3QgZXhpc3QgeWV0LiBSZXRyeSBhXG4gICAgLy8gZmV3IHRpbWVzIHdpdGggYSBzaG9ydCBiYWNrb2ZmIGJlZm9yZSBnaXZpbmcgdXAgc29mdGx5LlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgJiYgYXR0ZW1wdCA8IE5PVF9GT1VORF9SRVRSSUVTKSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKE5PVF9GT1VORF9CQUNLT0ZGX01TICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCJmZWVkYmFjayBub3QgcmVjb3JkZWRcIiwge1xuICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGJvZHk6IGF3YWl0IHJlYWRSZXNwb25zZVRleHQocmVzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
686
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFJNUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFLM0MsSUFBSSxZQUFzQyxDQUFDO0FBQzNDLElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLElBQUksb0JBQW9ELENBQUM7QUFDekQsSUFBSSxxQkFBZ0QsQ0FBQztBQUNyRCxJQUFJLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUMxQyxJQUFJLG9DQUFvQyxHQUFHLEtBQUssQ0FBQztBQUNqRCxJQUFJLHdCQUFxRCxDQUFDO0FBQzFELElBQUksb0JBQXdDLENBQUM7QUFDN0MsTUFBTSx5QkFB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QUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLEdBQ2YsTUFBdUQsRUFBRSxVQUFVLEVBQUUsYUFBYTtnQkFDbEYsTUFBc0MsRUFBRSxhQUFhLENBQUM7WUFDekQsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFDRCxrRUFBa0U7UUFDbEUsMERBQTBEO1FBQzFELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDdEQsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0QsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ25DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixpQkFBaUI7WUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUxmbG93IHVzZXItZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFVDLWJhY2tlZCBBcHBzIHRyYWNlcyBuZWVkXG4gKiB0aGUgZXhwZXJpbWVudCdzIHRhYmxlLXByZWZpeCBVUkkgKGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YClcbiAqIHJhdGhlciB0aGFuIHRoZSBleHBlcmltZW50LXN0b3JlIGlkIHRoZSBVSSBkb2VzIG5vdCBzdG9yZS4gVGhhdCBwcmVmaXggaXNcbiAqIHJlYWQgZnJvbSB0aGUgZXhwZXJpbWVudCdzIGBtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhgXG4gKiB0YWcgKG9yIHRoZSBzcGFucy10YWJsZSB0YWcpOyBgTUxGTE9XX1VDX1RSQUNFX1BSRUZJWGAgcmVtYWlucyBhbiBvcHRpb25hbFxuICogb3ZlcnJpZGUuIFRyYWNlIGV4cG9ydCBpcyBhc3luY2hyb25vdXMsIHNvIHRoZSBqdXN0LWZpbmlzaGVkIHRyYWNlIG1heSBub3RcbiAqIGV4aXN0IGluIE1MZmxvdyB5ZXQgd2hlbiB0aGUgdXNlciByZWFjdHM7IHRoZSBsb2cgY2FsbCByZXRyaWVzIGJyaWVmbHkgb25cbiAqIFwibm90IGZvdW5kXCIgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlbnZpcm9ubWVudFV0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IFRyYWNlTG9jYXRpb25UeXBlLCBUcmFjZU1ldGFkYXRhS2V5IH0gZnJvbSBcIkBtbGZsb3cvY29yZVwiO1xuaW1wb3J0IHsgVHJhY2VJbmZvIH0gZnJvbSBcIkBtbGZsb3cvY29yZS9kaXN0L2NvcmUvZW50aXRpZXMvdHJhY2VfaW5mby5qc1wiO1xuaW1wb3J0IHsgVHJhY2VTdGF0ZSB9IGZyb20gXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2VudGl0aWVzL3RyYWNlX3N0YXRlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlU3BhbiwgU3BhbiBhcyBTZGtTcGFuLCBTcGFuUHJvY2Vzc29yIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUcmFjZXJQcm92aWRlciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGRhdGFicmlja3NGZXRjaCwgcmVhZFJlc3BvbnNlSnNvbiwgcmVhZFJlc3BvbnNlVGV4dCB9IGZyb20gXCIuL3Jlc3QudHNcIjtcbmltcG9ydCB7IEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIgfSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWxmbG93XCIpO1xuXG50eXBlIE1sZmxvd01vZHVsZSA9IHR5cGVvZiBpbXBvcnQoXCJAbWxmbG93L2NvcmVcIik7XG50eXBlIFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMgPSBQYXJhbWV0ZXJzPE1sZmxvd01vZHVsZVtcInVwZGF0ZUN1cnJlbnRUcmFjZVwiXT5bMF07XG5cbmxldCBkaXJlY3RNbGZsb3c6IE1sZmxvd01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBkaXJlY3RNbGZsb3dJbml0U3RhcnRlZCA9IGZhbHNlO1xubGV0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyOiBOb2RlVHJhY2VyUHJvdmlkZXIgfCB1bmRlZmluZWQ7XG5sZXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xubGV0IGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUmVxdWVzdEluaXRTdGFydGVkID0gZmFsc2U7XG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5sZXQgYXBwTWxmbG93VHJhY2VQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmNvbnN0IHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8gPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG5cbmNvbnN0IE5PSVNZX0lOU1RSVU1FTlRBVElPTl9TQ09QRVMgPSBuZXcgU2V0KFtcbiAgXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24tZXhwcmVzc1wiLFxuICBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwXCIsXG4gIFwiY2FjaGUtbWFuYWdlci1jYWNoZS1tYW5hZ2VyXCIsXG5dKTtcblxuZnVuY3Rpb24gaXNBZ2VudFRyYWNlUm9vdChzcGFuOiBTZGtTcGFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGFuLmF0dHJpYnV0ZXNbQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUl0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW46IFNka1NwYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFOT0lTWV9JTlNUUlVNRU5UQVRJT05fU0NPUEVTLmhhcyhzcGFuLmluc3RydW1lbnRhdGlvblNjb3BlLm5hbWUpO1xufVxuXG4vKipcbiAqIFJlc3RyaWN0IHRoZSBkaXJlY3QgTUxmbG93IHByb3ZpZGVyIHRvIGNoYXQgcm9vdHMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzLlxuICogQXBwS2l0IGFuZCBNYXN0cmEgY3JlYXRlIG90aGVyIE9UZWwgcm9vdHMgZm9yIGNhY2hlIGFuZCBwbHVnaW4gb3BlcmF0aW9ucztcbiAqIGZvcndhcmRpbmcgdGhvc2Ugd291bGQgcmVjcmVhdGUgdGhlIG9uZS10cmFjZS1wZXItcmVxdWVzdCBub2lzZSB0aGlzIHBhdGggaXNcbiAqIGludGVuZGVkIHRvIGF2b2lkLlxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRUcmFjZVNwYW5Qcm9jZXNzb3IgaW1wbGVtZW50cyBTcGFuUHJvY2Vzc29yIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFjZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlbGVnYXRlOiBTcGFuUHJvY2Vzc29yKSB7fVxuXG4gIG9uU3RhcnQoc3BhbjogU2RrU3BhbiwgcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBpc1Jvb3QgPSAhc3Bhbi5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGlmICghaXNBZ2VudFRyYWNlUm9vdChzcGFuKSkgcmV0dXJuO1xuICAgICAgdGhpcy50cmFjZUlkcy5hZGQodHJhY2VJZCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy50cmFjZUlkcy5oYXModHJhY2VJZCkgfHwgIWlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Bhbklkcy5hZGQoc3Bhbi5zcGFuQ29udGV4dCgpLnNwYW5JZCk7XG4gICAgdGhpcy5kZWxlZ2F0ZS5vblN0YXJ0KHNwYW4sIHBhcmVudENvbnRleHQpO1xuICB9XG5cbiAgb25FbmRpbmcoc3BhbjogU2RrU3Bhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmhhcyhzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZWdhdGUub25FbmRpbmc/LihzcGFuKTtcbiAgfVxuXG4gIG9uRW5kKHNwYW46IFJlYWRhYmxlU3Bhbik6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBzcGFuSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkO1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmRlbGV0ZShzcGFuSWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxlZ2F0ZS5vbkVuZChzcGFuKTtcbiAgICBpZiAoIXNwYW4ucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZCkgdGhpcy50cmFjZUlkcy5kZWxldGUodHJhY2VJZCk7XG4gIH1cblxuICBmb3JjZUZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmZvcmNlRmx1c2goKTtcbiAgfVxuXG4gIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudHJhY2VJZHMuY2xlYXIoKTtcbiAgICB0aGlzLnNwYW5JZHMuY2xlYXIoKTtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbi8qKiBXb3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIEV4cGVyaW1lbnQgdGFnIERhdGFicmlja3Mgc3RvcmVzIGFzIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgLiAqL1xuY29uc3QgVFJBQ0VfREVTVElOQVRJT05fUEFUSF9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZURlc3RpbmF0aW9uUGF0aFwiO1xuLyoqIEV4cGVyaW1lbnQgdGFnIG5hbWluZyB0aGUgT1RlbCBzcGFucyB0YWJsZSAoYGNhdGFsb2cuc2NoZW1hLntwcmVmaXh9X290ZWxfc3BhbnNgKS4gKi9cbmNvbnN0IFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZVNwYW5TdG9yYWdlVGFibGVcIjtcblxuLyoqXG4gKiBDYWNoZWQgVUMgdGFibGUgcHJlZml4IHJlc29sdmVkIGZyb20gdGhlIGV4cGVyaW1lbnQuIGBsb2FkZWRgIGRpc3Rpbmd1aXNoZXNcbiAqIFwibm90IGZldGNoZWQgeWV0XCIgZnJvbSBcImZldGNoZWQsIGV4cGVyaW1lbnQgaGFzIG5vIFVDIGxvY2F0aW9uXCIuIE5ldHdvcmtcbiAqIGZhaWx1cmVzIGFyZSBub3QgY2FjaGVkIHNvIGEgbGF0ZXIgdGh1bWJzIGNsaWNrIGNhbiByZXRyeS5cbiAqL1xubGV0IGxvYWRlZFVjUHJlZml4OiB7IHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJpcCB0aGUgYHRyYWNlOi9gIFVSSSB3cmFwcGVyIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZyb20gYSBVQyBwcmVmaXguICovXG5mdW5jdGlvbiBub3JtYWxpemVVY1ByZWZpeChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcmF3XG4gICAgPy50cmltKClcbiAgICAucmVwbGFjZSgvXnRyYWNlOlxcLy8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIHJldHVybiB2YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVyaXZlIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgIGZyb20gYSBzcGFucyB0YWJsZSBuYW1lLlxuICogRGF0YWJyaWNrcyBuYW1lcyB0aGUgdGFibGUgYHtwcmVmaXh9X290ZWxfc3BhbnNgLlxuICovXG5mdW5jdGlvbiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhYmxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBuYW1lID0gdGFibGU/LnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIl9vdGVsX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfb3RlbF9zcGFuc1wiLmxlbmd0aCk7XG4gIGlmIChuYW1lLmVuZHNXaXRoKFwiX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfc3BhbnNcIi5sZW5ndGgpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHBlcmltZW50VGFnTWFwKHJhdzogdW5rbm93bik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHJhdykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQodGFnKSB8fCB0eXBlb2YgdGFnLmtleSAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdGFnLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFncy5zZXQodGFnLmtleSwgdGFnLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3M7XG4gIH1cbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQocmF3KSkgcmV0dXJuIHRhZ3M7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhdykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0YWdzLnNldChrZXksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGFncztcbn1cblxuLyoqXG4gKiBVQyB0YWJsZSBwcmVmaXggdGhlIGFzc2Vzc21lbnRzIEFQSSBuZWVkcywgcmVhZCBmcm9tIGV4cGVyaW1lbnQgdGFncy5cbiAqXG4gKiBQcmVmZXJzIHRoZSB0aHJlZS1wYXJ0IGRlc3RpbmF0aW9uIHBhdGggRGF0YWJyaWNrcyB3cml0ZXMgd2hlbiB0aGVcbiAqIGV4cGVyaW1lbnQgaXMgbGlua2VkIHRvIGEgdGFibGUtcHJlZml4IGxvY2F0aW9uLiBGYWxscyBiYWNrIHRvIHN0cmlwcGluZ1xuICogYF9vdGVsX3NwYW5zYCBmcm9tIHRoZSBzcGFucy10YWJsZSB0YWcuIFR3by1wYXJ0IHNjaGVtYS1saW5rZWQgZGVzdGluYXRpb25zXG4gKiBhcmUgaWdub3JlZCAodGhleSBhcmUgbm90IGEgdGFibGUgcHJlZml4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVjVHJhY2VQcmVmaXhGcm9tRXhwZXJpbWVudFRhZ3MocmF3VGFnczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ3MgPSBleHBlcmltZW50VGFnTWFwKHJhd1RhZ3MpO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVVjUHJlZml4KHRhZ3MuZ2V0KFRSQUNFX0RFU1RJTkFUSU9OX1BBVEhfVEFHKSk7XG4gIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5zcGxpdChcIi5cIikubGVuZ3RoID49IDMpIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgcmV0dXJuIHByZWZpeEZyb21TcGFuVGFibGUodGFncy5nZXQoVFJBQ0VfU1BBTl9TVE9SQUdFX1RBQkxFX1RBRykpO1xufVxuXG4vKiogRHJvcCB0aGUgaW4tcHJvY2VzcyBVQyBwcmVmaXggY2FjaGUgKHRlc3RzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFVjVHJhY2VQcmVmaXhDYWNoZSgpOiB2b2lkIHtcbiAgbG9hZGVkVWNQcmVmaXggPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJhY2UgaWQgdGhlIGFzc2Vzc21lbnRzIFJFU1QgQVBJIGFjY2VwdHMgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBEYXRhYnJpY2tzIEFwcHMgcGVyc2lzdCB0cmFjZXMgaW4gVW5pdHkgQ2F0YWxvZy4gVGhlIGV4cGVyaW1lbnQgVUkgbGlzdHNcbiAqIHRob3NlIHJvd3MsIGJ1dCBgUE9TVCAvYXBpLzMuMC9tbGZsb3cvdHJhY2VzL3tpZH0vYXNzZXNzbWVudHNgIGxvb2tzIHVwIHRoZVxuICogZXhwZXJpbWVudCBzdG9yZSB1bmxlc3MgYHtpZH1gIGlzIHRoZSBVQyBVUkkgYHRyYWNlOi97Y2F0YWxvZ30ue3NjaGVtYX0ue3ByZWZpeH0ve3RyLWhleH1gLlxuICogQSBiYXJlIGB0ci08aGV4PmAgNDA0cyBhbmQgdGhlIGFzc2Vzc21lbnQgbmV2ZXIgYXBwZWFycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKHRyYWNlSWQ6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVVY1ByZWZpeChwcmVmaXgpO1xuICByZXR1cm4gcmVzb2x2ZWQgPyBgdHJhY2U6LyR7cmVzb2x2ZWR9LyR7dHJhY2VJZH1gIDogdHJhY2VJZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVVjVHJhY2VQcmVmaXgoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmcm9tRW52ID0gbm9ybWFsaXplVWNQcmVmaXgocHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1RSQUNFX1BSRUZJWCk7XG4gIGlmIChmcm9tRW52KSByZXR1cm4gZnJvbUVudjtcbiAgaWYgKGxvYWRlZFVjUHJlZml4KSByZXR1cm4gbG9hZGVkVWNQcmVmaXgucHJlZml4O1xuICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYXRpb24gPSBleHBlcmltZW50LnRyYWNlX2xvY2F0aW9uPy51Y190cmFjZV9sb2NhdGlvbjtcbiAgY29uc3QgcHJlZml4ID1cbiAgICB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzKGV4cGVyaW1lbnQudGFncykgPz9cbiAgICAobG9jYXRpb25cbiAgICAgID8gW1xuICAgICAgICAgIGxvY2F0aW9uLmNhdGFsb2csXG4gICAgICAgICAgbG9jYXRpb24uc2NoZW1hLFxuICAgICAgICAgIGxvY2F0aW9uLmVmZmVjdGl2ZV90YWJsZV9wcmVmaXggPz8gbG9jYXRpb24udGFibGVfcHJlZml4LFxuICAgICAgICBdXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5qb2luKFwiLlwiKVxuICAgICAgOiB1bmRlZmluZWQpO1xuICBsb2FkZWRVY1ByZWZpeCA9IHsgcHJlZml4IH07XG4gIHJldHVybiBwcmVmaXg7XG59XG5cbi8qKiBBc3Nlc3NtZW50cyBSRVNUIHBhdGggZm9yIGEgdHJhY2UuIGAzLjBgIGlzIHRoZSBjdXJyZW50IE1MZmxvdyBBUEkgdmVyc2lvbi4gKi9cbmNvbnN0IGFzc2Vzc21lbnRzUGF0aCA9ICh0cmFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYC9hcGkvMy4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJhY2VJZCl9L2Fzc2Vzc21lbnRzYDtcblxuLyoqIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIFwidHJhY2Ugbm90IGZvdW5kXCIgcmVzcG9uc2UgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IE5PVF9GT1VORF9SRVRSSUVTID0gMztcbi8qKiBCYXNlIGJhY2tvZmYgYmV0d2VlbiBcInRyYWNlIG5vdCBmb3VuZFwiIHJldHJpZXMsIGluIG1zIChncm93cyBsaW5lYXJseSkuICovXG5jb25zdCBOT1RfRk9VTkRfQkFDS09GRl9NUyA9IDEyMDA7XG5cbmNvbnN0IE1sZmxvd0V4cGVyaW1lbnRSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZXhwZXJpbWVudDogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGV4cGVyaW1lbnRfaWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiV29ya3NwYWNlIE1MZmxvdyBleHBlcmltZW50IGlkZW50aWZpZXIuXCIpLFxuICAgICAgICB0YWdzOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXhwZXJpbWVudCB0YWdzLCBpbmNsdWRpbmcgdGhlIFVDIHRyYWNlIGxvY2F0aW9uLlwiKSxcbiAgICAgICAgdHJhY2VfbG9jYXRpb246IHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHVjX3RyYWNlX2xvY2F0aW9uOiB6XG4gICAgICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGNhdGFsb2c6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJVbml0eSBDYXRhbG9nIGNhdGFsb2cgbmFtZS5cIiksXG4gICAgICAgICAgICAgICAgc2NoZW1hOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVW5pdHkgQ2F0YWxvZyBzY2hlbWEgbmFtZS5cIiksXG4gICAgICAgICAgICAgICAgdGFibGVfcHJlZml4OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ29uZmlndXJlZCB0cmFjZSB0YWJsZSBwcmVmaXguXCIpLFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV90YWJsZV9wcmVmaXg6IHpcbiAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIkVmZmVjdGl2ZSB0cmFjZSB0YWJsZSBwcmVmaXggc2VsZWN0ZWQgYnkgRGF0YWJyaWNrcy5cIiksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIlVuaXR5IENhdGFsb2cgdHJhY2UgbG9jYXRpb24uXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IHRyYWNlIHN0b3JhZ2UgbG9jYXRpb24uXCIpLFxuICAgICAgfSlcbiAgICAgIC5wYXNzdGhyb3VnaCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb25maWd1cmVkIE1MZmxvdyBleHBlcmltZW50LlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiTUxmbG93IGdldC1leHBlcmltZW50IHJlc3BvbnNlLlwiKTtcblxuY29uc3QgQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXNlck5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya3NwYWNlIHVzZXIgbmFtZS5cIiksXG4gICAgYXBwbGljYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCBzZXJ2aWNlIHByaW5jaXBhbCBhcHBsaWNhdGlvbiBpZC5cIiksXG4gICAgZGlzcGxheU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgcHJpbmNpcGFsIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgZ3JvdXBzOiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHZhbHVlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgaWRlbnRpZmllci5cIiksXG4gICAgICAgICAgICBkaXNwbGF5OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgZGlzcGxheSBuYW1lLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkdyb3VwcyBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBwcmluY2lwYWwuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEN1cnJlbnQgVXNlciBBUEkgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjZXNzX2NvbnRyb2xfbGlzdDogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB1c2VyX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlVzZXIgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgZ3JvdXBfbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiR3JvdXAgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgc2VydmljZV9wcmluY2lwYWxfbmFtZTogelxuICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgICAgICAgICAgYWxsX3Blcm1pc3Npb25zOiB6XG4gICAgICAgICAgICAgIC5hcnJheShcbiAgICAgICAgICAgICAgICB6XG4gICAgICAgICAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbl9sZXZlbDogei5zdHJpbmcoKS5kZXNjcmliZShcIkVmZmVjdGl2ZSBleHBlcmltZW50IHBlcm1pc3Npb24gbGV2ZWwuXCIpLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIkRpcmVjdCBhbmQgaW5oZXJpdGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHByaW5jaXBhbC5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IGFjY2VzcyBjb250cm9sIGVudHJpZXMuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGV4cGVyaW1lbnQgcGVybWlzc2lvbnMgcmVzcG9uc2UuXCIpO1xuXG5mdW5jdGlvbiBjb25maWd1cmVkRXhwZXJpbWVudCgpOiB7IGlkPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCk7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCk7XG4gIHJldHVybiB7XG4gICAgLi4uKGlkID8geyBpZCB9IDoge30pLFxuICAgIC4uLihuYW1lID8geyBuYW1lIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBUcmFja2luZyBVUkkgZm9yIGRpcmVjdCBsb2NhbCBNTGZsb3cgdHJhY2luZywgd2l0aCBDTEktcHJvZmlsZSBhdXRoIGluamVjdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1RSQUNLSU5HX1VSST8udHJpbSgpO1xuICBpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkICE9PSBcImRhdGFicmlja3NcIikgcmV0dXJuIGNvbmZpZ3VyZWQ7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFPy50cmltKCk7XG4gIHJldHVybiBwcm9maWxlID8gYGRhdGFicmlja3M6Ly8ke3Byb2ZpbGV9YCA6IFwiZGF0YWJyaWNrc1wiO1xufVxuXG4vKiogUGFyc2UgdGhlIG9wdGlvbmFsIFVDIHRhYmxlLXByZWZpeCBsb2NhdGlvbiB1c2VkIGJ5IGRpcmVjdCBsb2NhbCB0cmFjaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNlTG9jYXRpb24oKTpcbiAgeyBjYXRhbG9nTmFtZTogc3RyaW5nOyBzY2hlbWFOYW1lOiBzdHJpbmc7IHRhYmxlUHJlZml4OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhdGFsb2dOYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1VDX0NBVEFMT0c/LnRyaW0oKTtcbiAgY29uc3Qgc2NoZW1hTmFtZSA9IHByb2Nlc3MuZW52Lk1MRkxPV19VQ19TQ0hFTUE/LnRyaW0oKTtcbiAgY29uc3QgdGFibGVQcmVmaXggPSBwcm9jZXNzLmVudi5NTEZMT1dfVUNfVEFCTEVfUFJFRklYPy50cmltKCk7XG4gIGlmIChjYXRhbG9nTmFtZSAmJiBzY2hlbWFOYW1lICYmIHRhYmxlUHJlZml4KSB7XG4gICAgcmV0dXJuIHsgY2F0YWxvZ05hbWUsIHNjaGVtYU5hbWUsIHRhYmxlUHJlZml4IH07XG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBub3JtYWxpemVVY1ByZWZpeChwcm9jZXNzLmVudi5NTEZMT1dfVUNfVFJBQ0VfUFJFRklYKTtcbiAgaWYgKCFwcmVmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnRzID0gcHJlZml4LnNwbGl0KFwiLlwiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW3ByZWZpeENhdGFsb2csIHByZWZpeFNjaGVtYSwgcHJlZml4VGFibGVdID0gcGFydHM7XG4gIGlmICghcHJlZml4Q2F0YWxvZyB8fCAhcHJlZml4U2NoZW1hIHx8ICFwcmVmaXhUYWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjYXRhbG9nTmFtZTogcHJlZml4Q2F0YWxvZyxcbiAgICBzY2hlbWFOYW1lOiBwcmVmaXhTY2hlbWEsXG4gICAgdGFibGVQcmVmaXg6IHByZWZpeFRhYmxlLFxuICB9O1xufVxuXG4vKiogV2hldGhlciB0aGUgbG9jYWwgZGlyZWN0LXRvLWV4cGVyaW1lbnQgTUxmbG93IFNESyBoYXMgZW5vdWdoIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0TWxmbG93VHJhY2luZ0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpICYmXG4gICAgcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSAmJlxuICAgIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCksXG4gICk7XG59XG5cbi8qKiBXaGV0aGVyIGEgRGF0YWJyaWNrcyBBcHAgY2FuIHByb21vdGUgT1RMUCBzcGFucyBpbnRvIGZ1bGwgTUxmbG93IHRyYWNlIGluZm8uICovXG5leHBvcnQgZnVuY3Rpb24gYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSAmJlxuICAgIChwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSkgJiZcbiAgICAocHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UPy50cmltKCkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSksXG4gICk7XG59XG5cbi8qKiBJbml0aWFsaXplIHRoZSBBcHAgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IHVzZWQgdG8gcGVyc2lzdCBWNCB0cmFjZSB0YWdzIGFuZCBtZXRhZGF0YS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50ICYmIGFwcE1sZmxvd1RyYWNlUHJlZml4KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkIHx8ICFhcHBNbGZsb3dUcmFjZUluZm9Db25maWd1cmVkKCkpIHJldHVybiBmYWxzZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvSW5pdFN0YXJ0ZWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkQ2xpZW50ID0gY2xpZW50ID8/IChjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSBhcyBXb3Jrc3BhY2VDbGllbnQpO1xuICAgIGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCA/Pz0gcmVzb2x2ZWRDbGllbnQ7XG4gICAgY29uc3QgcHJlZml4ID0gYXdhaXQgcmVzb2x2ZVVjVHJhY2VQcmVmaXgocmVzb2x2ZWRDbGllbnQpO1xuICAgIGlmICghcHJlZml4IHx8IHByZWZpeC5zcGxpdChcIi5cIikubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICBcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXBwTWxmbG93VHJhY2VQcmVmaXggPSBwcmVmaXg7XG4gICAgbG9nZ2VyLmluZm8oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGVuYWJsZWRcIiwgeyBwcmVmaXggfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiBkaXNhYmxlZFwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gICAgLy8gU3RhcnR1cCB1c2VzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gUGVybWl0IG9uZSBsYXRlciByZXF1ZXN0LXNjb3BlZFxuICAgIC8vIGNsaWVudCB0byByZXNvbHZlIGV4cGVyaW1lbnQgbWV0YWRhdGEgd2hlbiB0aGF0IHByaW5jaXBhbCBjYW5ub3QgcmVhZCBpdC5cbiAgICBpZiAoY2xpZW50ID09PSB1bmRlZmluZWQpIGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0cnkgQXBwcyB0cmFjZS1sb2NhdGlvbiBkaXNjb3Zlcnkgb25jZSB3aXRoIGEgcmVxdWVzdC1zY29wZWQgd29ya3NwYWNlXG4gKiBjbGllbnQgYWZ0ZXIgc2VydmljZS1wcmluY2lwYWwgc3RhcnR1cCBkaXNjb3ZlcnkgZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlcXVlc3RNbGZsb3dUcmFjZUluZm8oY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCAmJiBhcHBNbGZsb3dUcmFjZVByZWZpeCkgcmV0dXJuIHRydWU7XG4gIGlmIChhcHBNbGZsb3dUcmFjZUluZm9SZXF1ZXN0SW5pdFN0YXJ0ZWQgfHwgIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9SZXF1ZXN0SW5pdFN0YXJ0ZWQgPSB0cnVlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCA9IGZhbHNlO1xuICByZXR1cm4gaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyhjbGllbnQpO1xufVxuXG4vKiogVHJhY2UtbGV2ZWwgdmFsdWVzIHBlcnNpc3RlZCBiZXNpZGUgc3BhbnMgYWxyZWFkeSBleHBvcnRlZCBieSB0aGUgQXBwcyBPVExQIHNpZGVjYXIuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcE1sZmxvd1RyYWNlSW5mbyB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcmVxdWVzdFRpbWU6IG51bWJlcjtcbiAgZXhlY3V0aW9uRHVyYXRpb246IG51bWJlcjtcbiAgZXJyb3I6IGJvb2xlYW47XG4gIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHVzZXI/OiBzdHJpbmc7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgcmVxdWVzdFByZXZpZXc/OiBzdHJpbmc7XG4gIHJlc3BvbnNlUHJldmlldz86IHN0cmluZztcbn1cblxuLyoqIFBlcnNpc3QgTUxmbG93IFY0IHRyYWNlIGluZm8gZm9yIG9uZSBEYXRhYnJpY2tzIEFwcHMgT1RlbCByb290IHdpdGhvdXQgcmUtZXhwb3J0aW5nIHNwYW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8ocGFyYW1zOiBBcHBNbGZsb3dUcmFjZUluZm8pOiB2b2lkIHtcbiAgY29uc3QgY2xpZW50ID0gYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50O1xuICBjb25zdCBwcmVmaXggPSBhcHBNbGZsb3dUcmFjZVByZWZpeDtcbiAgaWYgKCFjbGllbnQgfHwgIXByZWZpeCkgcmV0dXJuO1xuICBjb25zdCBbY2F0YWxvZ05hbWUsIHNjaGVtYU5hbWUsIHRhYmxlUHJlZml4XSA9IHByZWZpeC5zcGxpdChcIi5cIik7XG4gIGlmICghY2F0YWxvZ05hbWUgfHwgIXNjaGVtYU5hbWUgfHwgIXRhYmxlUHJlZml4KSByZXR1cm47XG4gIGNvbnN0IHRyYWNlSW5mbyA9IG5ldyBUcmFjZUluZm8oe1xuICAgIHRyYWNlSWQ6IGB0cmFjZTovJHtwcmVmaXh9LyR7cGFyYW1zLnRyYWNlSWR9YCxcbiAgICB0cmFjZUxvY2F0aW9uOiB7XG4gICAgICB0eXBlOiBUcmFjZUxvY2F0aW9uVHlwZS5VQ19UQUJMRV9QUkVGSVgsXG4gICAgICB1Y1RhYmxlUHJlZml4OiB7IGNhdGFsb2dOYW1lLCBzY2hlbWFOYW1lLCB0YWJsZVByZWZpeCB9LFxuICAgIH0sXG4gICAgcmVxdWVzdFRpbWU6IHBhcmFtcy5yZXF1ZXN0VGltZSxcbiAgICBleGVjdXRpb25EdXJhdGlvbjogcGFyYW1zLmV4ZWN1dGlvbkR1cmF0aW9uLFxuICAgIHN0YXRlOiBwYXJhbXMuZXJyb3IgPyBUcmFjZVN0YXRlLkVSUk9SIDogVHJhY2VTdGF0ZS5PSyxcbiAgICAuLi4ocGFyYW1zLnJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldzogcGFyYW1zLnJlcXVlc3RQcmV2aWV3IH0gOiB7fSksXG4gICAgLi4uKHBhcmFtcy5yZXNwb25zZVByZXZpZXcgPyB7IHJlc3BvbnNlUHJldmlldzogcGFyYW1zLnJlc3BvbnNlUHJldmlldyB9IDoge30pLFxuICAgIHRyYWNlTWV0YWRhdGE6IHtcbiAgICAgIFtUcmFjZU1ldGFkYXRhS2V5LlNDSEVNQV9WRVJTSU9OXTogXCI0XCIsXG4gICAgICAuLi4ocGFyYW1zLnVzZXIgPyB7IFtUcmFjZU1ldGFkYXRhS2V5LlRSQUNFX1VTRVJdOiBwYXJhbXMudXNlciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zZXNzaW9uSWQgPyB7IFtUcmFjZU1ldGFkYXRhS2V5LlRSQUNFX1NFU1NJT05dOiBwYXJhbXMuc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgfSxcbiAgICB0YWdzOiBwYXJhbXMudGFncyxcbiAgICBhc3Nlc3NtZW50czogW10sXG4gIH0pO1xuICBjb25zdCBwYXRoID0gYC9hcGkvNC4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4KX0vJHtwYXJhbXMudHJhY2VJZH0vaW5mb2A7XG4gIGNvbnN0IHBlbmRpbmcgPSBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBwYXRoLCB7IG1ldGhvZDogXCJQT1NUXCIsIGJvZHk6IHRyYWNlSW5mby50b0pzb24oKSB9KVxuICAgIC50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSByZXR1cm47XG4gICAgICBsb2dnZXIud2FybihcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBib2R5OiBhd2FpdCByZWFkUmVzcG9uc2VUZXh0KHJlc3BvbnNlKSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiBmYWlsZWRcIiwge1xuICAgICAgICB0cmFjZUlkOiBwYXJhbXMudHJhY2VJZCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmRlbGV0ZShwZW5kaW5nKSk7XG4gIHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8uYWRkKHBlbmRpbmcpO1xufVxuXG4vKiogUmVzZXQgQXBwcyB0cmFjZS1pbmZvIHByb21vdGlvbiBzdGF0ZSBmb3IgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRBcHBNbGZsb3dUcmFjZUluZm8oKTogdm9pZCB7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1JlcXVlc3RJbml0U3RhcnRlZCA9IGZhbHNlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9DbGllbnQgPSB1bmRlZmluZWQ7XG4gIGFwcE1sZmxvd1RyYWNlUHJlZml4ID0gdW5kZWZpbmVkO1xuICBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmNsZWFyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgbWxmbG93OiBNbGZsb3dNb2R1bGUsXG4gIHRyYWNraW5nVXJpOiBzdHJpbmcsXG4gIGV4cGVyaW1lbnRJZDogc3RyaW5nLFxuICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHsgY2F0YWxvZ05hbWU6IHN0cmluZzsgc2NoZW1hTmFtZTogc3RyaW5nOyB0YWJsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKCk7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIGV4cGxpY2l0O1xuICB0cnkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgY2xpZW50LmdldEV4cGVyaW1lbnQoZXhwZXJpbWVudElkKTtcbiAgICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyB1Y0xvY2F0aW9uRnJvbUV4cGVyaW1lbnRUYWdzIH0gPSBhd2FpdCBpbXBvcnQoXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2Rlc3RpbmF0aW9uLmpzXCIpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdWNMb2NhdGlvbkZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpO1xuICAgIGlmICghbG9jYXRpb24/LnRhYmxlUHJlZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjYXRhbG9nTmFtZTogbG9jYXRpb24uY2F0YWxvZ05hbWUsXG4gICAgICBzY2hlbWFOYW1lOiBsb2NhdGlvbi5zY2hlbWFOYW1lLFxuICAgICAgdGFibGVQcmVmaXg6IGxvY2F0aW9uLnRhYmxlUHJlZml4LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGlyZWN0IE1MZmxvdyBVQyB0cmFjZS1sb2NhdGlvbiBkZXRlY3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIE1MZmxvdyBOb2RlIHRyYWNlciBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgd2hlbiBBcHBLaXQgaGFzIG5vIE9UTFBcbiAqIGV4cG9ydGVyLiBUaGlzIHByb3ZpZGVyIGlzIG5ldmVyIHN0YXJ0ZWQgaW4gdGhlIGRlcGxveWVkIEFwcHMgcGF0aCwgYXZvaWRpbmdcbiAqIGEgc2Vjb25kIGdsb2JhbCBPVGVsIHByb3ZpZGVyIHJhY2luZyBBcHBLaXQncyB0ZWxlbWV0cnkgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVEaXJlY3RNbGZsb3dUcmFjaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZGlyZWN0TWxmbG93KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRpcmVjdE1sZmxvd0luaXRTdGFydGVkIHx8ICFkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gIGRpcmVjdE1sZmxvd0luaXRTdGFydGVkID0gdHJ1ZTtcblxuICBjb25zdCBleHBlcmltZW50SWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRCEudHJpbSgpO1xuICBjb25zdCB0cmFja2luZ1VyaSA9IGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCkhO1xuICB0cnkge1xuICAgIGNvbnN0IG1sZmxvdyA9IGF3YWl0IGltcG9ydChcIkBtbGZsb3cvY29yZVwiKTtcbiAgICBjb25zdCByYXdIb3N0ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gICAgY29uc3QgaG9zdCA9IHJhd0hvc3RcbiAgICAgID8gL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdIb3N0KVxuICAgICAgICA/IHJhd0hvc3RcbiAgICAgICAgOiBgaHR0cHM6Ly8ke3Jhd0hvc3R9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJhY2VMb2NhdGlvbiA9IGF3YWl0IGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgICAgIG1sZmxvdyxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgaG9zdCxcbiAgICApO1xuICAgIGlmICghdHJhY2VMb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgXCJEaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcgcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgW3sgRGF0YWJyaWNrc1VDVGFibGVTcGFuRXhwb3J0ZXIsIERhdGFicmlja3NVQ1RhYmxlU3BhblByb2Nlc3NvciB9LCBzZGtdID1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW1wb3J0KFwiQG1sZmxvdy9jb3JlL2Rpc3QvZXhwb3J0ZXJzL3VjX3RhYmxlLmpzXCIpLFxuICAgICAgICBpbXBvcnQoXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiKSxcbiAgICAgIF0pO1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5FeHBvcnRlcihjbGllbnQpO1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvcihcbiAgICAgIG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5Qcm9jZXNzb3IoZXhwb3J0ZXIsIHRyYWNlTG9jYXRpb24pLFxuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc2RrLk5vZGVUcmFjZXJQcm92aWRlcih7IHNwYW5Qcm9jZXNzb3JzOiBbcHJvY2Vzc29yXSB9KTtcbiAgICBwcm92aWRlci5yZWdpc3RlcigpO1xuICAgIGRpcmVjdE1sZmxvdyA9IG1sZmxvdztcbiAgICBkaXJlY3RNbGZsb3dQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIGRpcmVjdE1sZmxvd1Byb2Nlc3NvciA9IHByb2Nlc3NvcjtcbiAgICBsb2dnZXIuaW5mbyhcImRpcmVjdCBNTGZsb3cgdHJhY2luZyBlbmFibGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgdHJhY2VMb2NhdGlvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkaXJlY3QgTUxmbG93IHRyYWNpbmcgZGlzYWJsZWRcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogUGVyc2lzdCB0cmFjZS1sZXZlbCBmaWVsZHMgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgaW4gdGhlIGN1cnJlbnQgT1RlbCBjb250ZXh0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlKG9wdGlvbnM6IFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMpOiB2b2lkIHtcbiAgZGlyZWN0TWxmbG93Py51cGRhdGVDdXJyZW50VHJhY2Uob3B0aW9ucyk7XG59XG5cbi8qKiBQZXJzaXN0IHRhZ3Mgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgYWN0aXZlIGluIHRoZSBjdXJyZW50IE9UZWwgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3ModGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7IHRhZ3MgfSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBvd25zIHRoZSBmaWx0ZXJlZCBsb2NhbCBNTGZsb3cgdHJhY2VyIHByb3ZpZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBkaXJlY3RNbGZsb3dQcm9jZXNzb3IgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIEZsdXNoIHBlbmRpbmcgZGlyZWN0IGxvY2FsIHRyYWNlIGV4cG9ydHMgZHVyaW5nIGdyYWNlZnVsIHNodXRkb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm9dKTtcbiAgYXdhaXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yPy5mb3JjZUZsdXNoKCk7XG4gIGF3YWl0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyPy5mb3JjZUZsdXNoKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBNTGZsb3cgZmVlZGJhY2sgbG9nZ2luZyBpcyBhdmFpbGFibGUgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBFbmFibGVkIHdoZW4gYW4gTUxmbG93IGV4cGVyaW1lbnQgaXMgY29uZmlndXJlZCBhbmQgdHJhY2VzIGhhdmUgYW4gZXhwb3J0XG4gKiBwYXRoOiBBcHBLaXQgT1RMUCBpbiBhIERhdGFicmlja3MgQXBwLCBvciB0aGUgZGlyZWN0IE1MZmxvdyBOb2RlIFNESyBvdXRzaWRlXG4gKiBvbmUuIEJvdGggcGF0aHMgYXJlIHNlbGVjdGVkIGZyb20gc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWxmbG93RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgaGFzRXhwb3J0ZXIgPSBCb29sZWFuKFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVD8udHJpbSgpIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVD8udHJpbSgpLFxuICApO1xuICBjb25zdCBoYXNFeHBlcmltZW50ID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSxcbiAgKTtcbiAgcmV0dXJuIGhhc0V4cGVyaW1lbnQgJiYgKGhhc0V4cG9ydGVyIHx8IGRpcmVjdE1sZmxvd1RyYWNpbmdDb25maWd1cmVkKCkpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY29uZmlndXJlZCBleHBlcmltZW50IFVSTCBvbmx5IHdoZW4gdGhlIGFjdGl2ZSBEYXRhYnJpY2tzXG4gKiBwcmluY2lwYWwgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi4gUGVybWlzc2lvbiBsb29rdXAgaXNcbiAqIGludGVudGlvbmFsbHkgYmVzdC1lZmZvcnQgc28gQXBwcyBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgZXhwb3NlIHRoZVxuICogcmVxdWlyZWQgQVBJcyBzaW1wbHkgb21pdCB0aGUgZGVidWcgYWZmb3JkYW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50SWQgPSBhd2FpdCByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudElkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtjdXJyZW50UmVzcG9uc2UsIHBlcm1pc3Npb25zUmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRhdGFicmlja3NGZXRjaChjbGllbnQsIFwiL2FwaS8yLjAvcHJldmlldy9zY2ltL3YyL01lXCIsIHsgbWV0aG9kOiBcIkdFVFwiIH0pLFxuICAgIGRhdGFicmlja3NGZXRjaChcbiAgICAgIGNsaWVudCxcbiAgICAgIGAvYXBpLzIuMC9wZXJtaXNzaW9ucy9leHBlcmltZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50SWQpfWAsXG4gICAgICB7IG1ldGhvZDogXCJHRVRcIiB9LFxuICAgICksXG4gIF0pO1xuICBpZiAoIWN1cnJlbnRSZXNwb25zZS5vayB8fCAhcGVybWlzc2lvbnNSZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBjdXJyZW50ID0gQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihjdXJyZW50UmVzcG9uc2UpKTtcbiAgY29uc3QgcGVybWlzc2lvbnMgPSBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoXG4gICAgYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihwZXJtaXNzaW9uc1Jlc3BvbnNlKSxcbiAgKTtcbiAgaWYgKCFjdXJyZW50LnN1Y2Nlc3MgfHwgIXBlcm1pc3Npb25zLnN1Y2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdXNlck5hbWVzID0gbmV3IFNldChcbiAgICBbY3VycmVudC5kYXRhLnVzZXJOYW1lLCBjdXJyZW50LmRhdGEuYXBwbGljYXRpb25JZCwgY3VycmVudC5kYXRhLmRpc3BsYXlOYW1lXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBOYW1lcyA9IG5ldyBTZXQoXG4gICAgKGN1cnJlbnQuZGF0YS5ncm91cHMgPz8gW10pLmZsYXRNYXAoKHsgdmFsdWUsIGRpc3BsYXkgfSkgPT5cbiAgICAgIFt2YWx1ZSwgZGlzcGxheV0uZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiBCb29sZWFuKGVudHJ5KSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgY2FuTWFuYWdlID0gKHBlcm1pc3Npb25zLmRhdGEuYWNjZXNzX2NvbnRyb2xfbGlzdCA/PyBbXSkuc29tZSgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgIChlbnRyeS51c2VyX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnVzZXJfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSAhPT0gdW5kZWZpbmVkICYmIHVzZXJOYW1lcy5oYXMoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuZ3JvdXBfbmFtZSAhPT0gdW5kZWZpbmVkICYmIGdyb3VwTmFtZXMuaGFzKGVudHJ5Lmdyb3VwX25hbWUpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbWF0Y2hlcyAmJlxuICAgICAgKGVudHJ5LmFsbF9wZXJtaXNzaW9ucyA/PyBbXSkuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbl9sZXZlbCA9PT0gXCJDQU5fTUFOQUdFXCIsXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG4gIGlmICghY2FuTWFuYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiBuZXcgVVJMKGAvbWwvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLCBob3N0KS50b1N0cmluZygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEV4cGVyaW1lbnQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWE+W1wiZXhwZXJpbWVudFwiXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50ID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgY29uc3QgcGF0aCA9IGV4cGVyaW1lbnQuaWRcbiAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0P2V4cGVyaW1lbnRfaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudC5pZCl9YFxuICAgIDogZXhwZXJpbWVudC5uYW1lXG4gICAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0LWJ5LW5hbWU/ZXhwZXJpbWVudF9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgIGV4cGVyaW1lbnQubmFtZSxcbiAgICAgICAgKX1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRhdGFicmlja3NGZXRjaChjbGllbnQsIHBhdGgsIHsgbWV0aG9kOiBcIkdFVFwiIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzcG9uc2UpKTtcbiAgcmV0dXJuIHBhcnNlZC5zdWNjZXNzID8gcGFyc2VkLmRhdGEuZXhwZXJpbWVudCA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4cGVyaW1lbnRJZChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25maWd1cmVkRXhwZXJpbWVudCgpO1xuICBpZiAoY29uZmlndXJlZC5pZCkgcmV0dXJuIGNvbmZpZ3VyZWQuaWQ7XG4gIHJldHVybiAoYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCkpPy5leHBlcmltZW50X2lkO1xufVxuXG4vKiogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvZ0ZlZWRiYWNrfS4gKi9cbmV4cG9ydCB0eXBlIExvZ0ZlZWRiYWNrUGFyYW1zID0gZmVlZGJhY2suTWxmbG93RmVlZGJhY2tSZXF1ZXN0ICYge1xuICAvKiogSWRlbnRpdHkgdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gKHVzZXIgZW1haWwgLyBpZCkuICovXG4gIHNvdXJjZUlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBMb2cgYSBIVU1BTiBmZWVkYmFjayBhc3Nlc3NtZW50IHRvIGEgdHJhY2UuIFJldHVybnMgdGhlIGNyZWF0ZWRcbiAqIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdHJhY2UgY2FuJ3QgYmVcbiAqIGZvdW5kIChldmVuIGFmdGVyIHJldHJ5aW5nIGZvciBleHBvcnQgbGFnKSBvciB0aGUgcmVxdWVzdCBvdGhlcndpc2VcbiAqIGZhaWxzIC0gY2FsbGVycyBzdXJmYWNlIHRoYXQgYXMgYSBzb2Z0IFwibm90IHJlY29yZGVkXCIgcmF0aGVyIHRoYW4gYW5cbiAqIGVycm9yLCBrZWVwaW5nIHRoZSBjaGF0IHVzYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ0ZlZWRiYWNrKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGFyYW1zOiBMb2dGZWVkYmFja1BhcmFtcyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIEEgY29tbWVudCB3aXRoIG5vIHRodW1icyB2YWx1ZSBpcyBsb2dnZWQgYXMgdGV4dCBmZWVkYmFjazsgYSB2YWx1ZVxuICAvLyAod2l0aCBhbiBvcHRpb25hbCBjb21tZW50IGFzIHRoZSByYXRpb25hbGUpIGlzIHRoZSB0aHVtYnMgcGF0aC5cbiAgY29uc3QgaGFzVmFsdWUgPSBwYXJhbXMudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbmFtZSA9XG4gICAgcGFyYW1zLm5hbWU/LnRyaW0oKSB8fFxuICAgIChoYXNWYWx1ZSA/IGZlZWRiYWNrLkRFRkFVTFRfRkVFREJBQ0tfTkFNRSA6IGZlZWRiYWNrLkRFRkFVTFRfQ09NTUVOVF9OQU1FKTtcbiAgY29uc3QgdmFsdWUgPSBoYXNWYWx1ZSA/IHBhcmFtcy52YWx1ZSA6IHBhcmFtcy5jb21tZW50O1xuICBjb25zdCBhc3Nlc3NtZW50VHJhY2VJZCA9IG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKFxuICAgIHBhcmFtcy50cmFjZUlkLFxuICAgIGF3YWl0IHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudCksXG4gICk7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKGFzc2Vzc21lbnRUcmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzKTtcbiAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50PzogeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9IH0pPy5hc3Nlc3NtZW50Py5hc3Nlc3NtZW50X2lkID8/XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9KT8uYXNzZXNzbWVudF9pZDtcbiAgICAgIHJldHVybiB0eXBlb2YgYXNzZXNzbWVudElkID09PSBcInN0cmluZ1wiID8gYXNzZXNzbWVudElkIDogXCJcIjtcbiAgICB9XG4gICAgLy8gVHJhY2UgZXhwb3J0IGlzIGFzeW5jOyBhIGZyZXNoIHRyYWNlIG1heSBub3QgZXhpc3QgeWV0LiBSZXRyeSBhXG4gICAgLy8gZmV3IHRpbWVzIHdpdGggYSBzaG9ydCBiYWNrb2ZmIGJlZm9yZSBnaXZpbmcgdXAgc29mdGx5LlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgJiYgYXR0ZW1wdCA8IE5PVF9GT1VORF9SRVRSSUVTKSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKE5PVF9GT1VORF9CQUNLT0ZGX01TICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCJmZWVkYmFjayBub3QgcmVjb3JkZWRcIiwge1xuICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGJvZHk6IGF3YWl0IHJlYWRSZXNwb25zZVRleHQocmVzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -177,8 +177,8 @@ export declare class MastraPlugin extends Plugin<MastraPluginConfig> {
177
177
  getMastra: () => Mastra<Record<string, Agent<any, import("@mastra/core/agent").ToolsInput, undefined, any, import("@mastra/core/agent").AgentEditorConfig | undefined>>, Record<string, AnyWorkflow>, Record<string, import("@mastra/core/vector").MastraVector<any>>, Record<string, import("@mastra/core/tts").MastraTTS>, import("@mastra/core/logger").IMastraLogger, Record<string, import("@mastra/core/mcp").MCPServerBase<any>>, Record<string, import("@mastra/core/evals").MastraScorer<any, any, any, any>>, Record<string, import("@mastra/core/tools").ToolAction<any, any, any, any, any, any, unknown>>, Record<string, import("@mastra/core/processors").Processor<any, unknown>>, Record<string, import("@mastra/core/memory").MastraMemory>, Record<string, import("@mastra/core/channels").ChannelProvider>, Record<string, import("@mastra/core/classifier").Classifier<any>>> | null;
178
178
  /**
179
179
  * Build the `RequestContext` an agent turn driven from OUTSIDE this
180
- * plugin's routes needs (a Teams activity on another plugin's endpoint, a
181
- * scheduled job).
180
+ * plugin's routes needs, such as another plugin's endpoint or a scheduled
181
+ * job.
182
182
  *
183
183
  * Mastra's user-scoped tools - `ask_genie` most visibly - read the AppKit
184
184
  * user off the request context, which only the HTTP middleware stamps.