@jax-data-science/sci-image-visualizer 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -277,6 +277,11 @@ export class RoutingVisualizerService {
277
277
  resetSurfaceCamera() { this.renderer().resetSurfaceCamera(); }
278
278
  setResolutionScale(scale) { this.renderer().setResolutionScale?.(scale); }
279
279
  getResolutionScale() { return this.renderer().getResolutionScale?.() ?? 1; }
280
+ /** The viewport of the backend on screen, for a contributed plot mode. Null
281
+ * when that backend cannot provide one (e.g. OSD fell back to Plotly). */
282
+ getPlotModeViewport() {
283
+ return this.renderer().getPlotModeViewport?.() ?? null;
284
+ }
280
285
  getPlotTypeDescriptors() {
281
286
  // Plotly enumerates the full PLOT_TYPE_DESCRIPTORS map, which already includes the
282
287
  // napari-js WebGPU types (jit-ui#102) — so this single source covers them (no duplicates).
@@ -742,4 +747,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
742
747
  type: Inject,
743
748
  args: [SPATIAL_DATA_PORT]
744
749
  }] }] });
745
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQTRCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN4RyxPQUFPLEVBQUUsUUFBUSxFQUFzQixVQUFVLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBJLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUV6RixPQUFPLEVBQWtCLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxtQkFBbUIsRUFBRSxjQUFjLEdBQ3BDLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFLMUUs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LHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQW1CbkIsTUFBTTsyQkFBQyxVQUFVOzswQkFLakIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgQ2xhc3NQcmVzZXQsIFByZXNldFNldCB9IGZyb20gJy4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBQbG90bHlTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL29zZC9vcGVuc2VhZHJhZ29uLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUGxvdFR5cGVEZXNjcmlwdG9yLCBpc05hcGFyaTNkLCBpc05hcGFyaVNjYXR0ZXIsIGlzU3BhdGlhbE9taWNzLCBpc1NwYXRpYWxPbWljczNkIH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzLCBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgU3BhdGlhbENvbG9yQnkgfSBmcm9tICcuL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0LCBpc0NhdGVnb3JpY2FsQ29sdW1uIH0gZnJvbSAnLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IHNlY3Rpb25zT2YgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1zZWN0aW9ucyc7XG5pbXBvcnQge1xuICBvYnNlcnZhdGlvbnNJblNsaWNlLCB2b2x1bWVJbWFnZVJlZixcbn0gZnJvbSAnLi9zcGF0aWFsL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7XG4gIGVtcHR5U2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxuICBzZWxlY3RCeUluZGljZXMsXG4gIHNlbGVjdEluUmVnaW9ucyxcbiAgc2VsZWN0SW5SZWdpb25zUHJvamVjdGVkLFxufSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMgfSBmcm9tICcuL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uRWRpdG9yQXBpIH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxIaXN0b2dyYW1BcGksIElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuL2NvbnRyYWN0cy92aXotY29uZmlnJztcblxuLyoqXG4gKiBCYWNrZW5kIHNlbGVjdG9yLiBSb3V0ZXMgcGVyIHBsb3QgdHlwZTpcbiAqICAtIHRoZSAqKkltYWdlKiogcGxvdCB0eXBlIHJlbmRlcnMgdGhyb3VnaCBPcGVuU2VhZHJhZ29uIOKAlCBhIG5hdGl2ZWx5LXRpbGVkLFxuICogICAgem9vbWFibGUgcmFzdGVyIGJhY2tlZCBieSB0aGUgaml0LXNlcnZpY2UgdGlsZSBlbmRwb2ludHMuIEl0J3MgdGhlIGRlZmF1bHRcbiAqICAgIHZpZXcgYW5kIHN1cHBvcnRzIHRoZSByZWdpb24gb3ZlcmxheS90b29scyBhbmQgKGZvciBncmF5c2NhbGUpIHRoZVxuICogICAgY29sb3JtYXAsIGFwcGxpZWQgY2xpZW50LXNpZGUgdmlhIHRoZSB0aWxlIHBpeGVsIHBpcGVsaW5lLlxuICogIC0gZXZlcnkgb3RoZXIgcGxvdCB0eXBlIChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLFxuICogICAgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXJzIHRocm91Z2ggUGxvdGx5LlxuICpcbiAqIE9ubHkgdGhlICoqcmVuZGVyICsgdmlld3BvcnQqKiBwYXRoIGlzIHJvdXRlZC4gUmVnaW9uIHN0YXRlLCBkaXNwbGF5IG9wdGlvbnNcbiAqIChjb2xvcm1hcC9MVVQpLCBhbmQgdGhlIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgYWx3YXlzIGxpdmUgaW4gUGxvdGx5ICh0aGVcbiAqIHNoYXJlZCBzdG9yZSkgc28gYm90aCBiYWNrZW5kcyBzdGF5IGluIHN5bmM7IE9TRCByZWFkcyB0aGVtIHRvIGRyaXZlIGl0cyBvd25cbiAqIG92ZXJsYXkgYW5kIHRpbGUgcmVjb2xvcmluZy5cbiAqXG4gKiBUaGUgSW1hZ2UgdHlwZSByZW5kZXJzIHRocm91Z2ggT3BlblNlYWRyYWdvbjsgYSBmYWlsZWQgT1NEIGxvYWQgZmFsbHMgYmFjayB0b1xuICogUGxvdGx5IGZvciB0aGF0IGltYWdlIG9ubHkgKHNlZSBgb3NkRmVsbEJhY2tgKSBzbyBpdCBzdGlsbCByZW5kZXJzLlxuICovXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqIFNhdHVyYXRpb24tYmFzZWQgYXV0by13aW5kb3c6IHBpY2sgW21pbixtYXhdIHNvIH5gc2F0dXJhdGlvbmAgb2YgcGl4ZWxzIGNsaXBcbiAqICBhdCBlYWNoIGVuZCBvZiB0aGUgaGlzdG9ncmFtLiBBIGRvbWluYW50IGZpcnN0L2xhc3QgYmluICh1bnNjYW5uZWQgcGFkZGluZyAvXG4gKiAgY2xpcHBlZCBiYWNrZ3JvdW5kKSBpcyBkcm9wcGVkIHNvIGl0IGRvZXNuJ3Qgc2tldyB0aGUgcmFuZ2UuICovXG5mdW5jdGlvbiBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbShoOiBJSGlzdG9ncmFtLCBzYXR1cmF0aW9uOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgY291bnRzID0gaC5jb3VudHMuc2xpY2UoKTtcbiAgY29uc3QgbiA9IGNvdW50cy5sZW5ndGg7XG4gIGlmIChuID09PSAwKSByZXR1cm4gWzAsIDI1NV07XG4gIGlmIChuID4gMiAmJiBjb3VudHNbMF0gPiBjb3VudHNbMV0pIGNvdW50c1swXSA9IDA7XG4gIGlmIChuID4gMiAmJiBjb3VudHNbbiAtIDFdID4gY291bnRzW24gLSAyXSkgY291bnRzW24gLSAxXSA9IDA7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBjb3VudHMpIHRvdGFsICs9IGM7XG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gWzAsIDI1NV07XG4gIGNvbnN0IHRhcmdldCA9IHRvdGFsICogTWF0aC5tYXgoMCwgTWF0aC5taW4oMC41LCBzYXR1cmF0aW9uKSk7XG4gIGxldCBhY2MgPSAwO1xuICBsZXQgbWluID0gaC5iaW5zWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGFjYyArPSBjb3VudHNbaV07XG4gICAgaWYgKGFjYyA+IHRhcmdldCkgeyBtaW4gPSBoLmJpbnNbaV07IGJyZWFrOyB9XG4gIH1cbiAgYWNjID0gMDtcbiAgbGV0IG1heCA9IGguYmluc1tuIC0gMV07XG4gIGZvciAobGV0IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBhY2MgKz0gY291bnRzW2ldO1xuICAgIGlmIChhY2MgPiB0YXJnZXQpIHsgbWF4ID0gaC5iaW5zW2ldOyBicmVhazsgfVxuICB9XG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyLCBJUmVnaW9uRWRpdG9yQXBpLCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSB7XG5cbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIHByaXZhdGUgbGFzdFJlbmRlcmVkOiBJVmlzdWFsaXplciB8IG51bGwgPSBudWxsO1xuICAvKiogT1NEIGZhaWxlZCBmb3IgdGhlICpjdXJyZW50KiByZW5kZXIgY3ljbGUgKGUuZy4gYSBmcmVzaCBmaWxlIHN0aWxsIGNhY2hpbmdcbiAgICogIHBhc3QgdGhlIGRlYWRsaW5lKSDihpIgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSBvbmx5LiBSZXNldCBieVxuICAgKiAgcmVzZXQoKSBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgcmVuZGVyIGN5Y2xlLCBzbyB0aGUgbmV4dCBmaWxlIOKAlCBvciBhXG4gICAqICByZS1zZWxlY3Qgb25jZSB0aGUgZmlsZSBpcyBjYWNoZWQg4oCUIHJldHJpZXMgT1NELiAoV2FzIGEgcGVybWFuZW50IGZsYWcsXG4gICAqICB3aGljaCBsZWZ0IHRoZSB3aG9sZSBzZXNzaW9uIHN0dWNrIG9uIFBsb3RseSBhZnRlciBvbmUgc2xvdyBsb2FkLikgKi9cbiAgcHJpdmF0ZSBvc2RGZWxsQmFjayA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGZhaWxlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGN5Y2xlIOKGkiBmYWxsIGJhY2sgdG8gT1NEICh0aGVuIFBsb3RseSkuXG4gICAqICBSZXNldCBieSByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSBjeWNsZSwgbGlrZSB7QGxpbmsgb3NkRmVsbEJhY2t9LiAqL1xuICBwcml2YXRlIG5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgb3NkOiBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgbmFwYXJpOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgICAgICAgICAgICBASW5qZWN0KFZJWl9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWaXpDb25maWcsXG4gICAgICAgICAgICAgIC8vIE9wdGlvbmFsOiBhIGhvc3QgdGhhdCBzZXJ2ZXMgbm8gc3BhdGlhbC1vbWljcyBkYXRhIGJpbmRzIG5vdGhpbmcsXG4gICAgICAgICAgICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb25TdG9yZTogU3BhdGlhbFNlbGVjdGlvblN0b3JlLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgICAgICAgICAgICBwcml2YXRlIHNwYXRpYWxEYXRhOiBTcGF0aWFsRGF0YVBvcnQgfCBudWxsID0gbnVsbCkge31cblxuICBwcml2YXRlIGlzSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLklNQUdFO1xuICB9XG5cbiAgLyoqIFRoZSAyRCBuYXBhcmkgdHlwZXMgKGltYWdlLCByZWdpb24tY2VudHJvaWQgc2NhdHRlciwgc3BhdGlhbCBvbWljcykg4oCUIGEgMkQgZmFsbGJhY2sgY2hhaW5cbiAgICogIChPU0QsIHRoZW4gUGxvdGx5KS5cbiAgICpcbiAgICogIE5PVEUgZm9yIFNQQVRJQUxfT01JQ1M6IG9ubHkgbmFwYXJpLWpzIGRyYXdzIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzLiBJZiBpdCBmYWlscyAobm8gV2ViR1BVLFxuICAgKiAgZGV2aWNlIGxvc3MpIHRoZSBmYWxsYmFjayByZW5kZXJzIHRoZSB0aXNzdWUgaW1hZ2UgQUxPTkUg4oCUIHRoZSBzcGF0aWFsIGxheWVyIGlzIGFic2VudCwgbm90XG4gICAqICBkZWdyYWRlZC4gVGhhdCBpcyBkZWxpYmVyYXRlIGZvciBub3c6IHNob3dpbmcgdGhlIHNsaWRlIGJlYXRzIHNob3dpbmcgbm90aGluZywgYW5kIGEgUGxvdGx5XG4gICAqICBgc2NhdHRlcmdsYCBzcGF0aWFsIG1vZGUgaXMgdGhlIHBsYW5uZWQgcmVhbCBmYWxsYmFjayAoc2VlIHRoZSBwbG90LW1vZGUgZGVzaWduIGRvYykuICovXG4gIHByaXZhdGUgaXNOYXBhcmlJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFIHx8IGlzTmFwYXJpU2NhdHRlcih0KSB8fCBpc1NwYXRpYWxPbWljcyh0KTtcbiAgfVxuXG4gIC8qKiBUaGUgM0QgbmFwYXJpIHR5cGVzICh2b2x1bWUvaXNvc3VyZmFjZS9zdXJmYWNlL3NjYXR0ZXIsIHBsdXMgdGhlIDNEIHNwYXRpYWwgY2xvdWQpIOKAlCBubyAyRFxuICAgKiAgZmFsbGJhY2sgZXhpc3RzIChPU0QgaXMgaW1hZ2Utb25seSksIHNvIHRoZXkgZmFsbCBzdHJhaWdodCB0byBQbG90bHkuICovXG4gIHByaXZhdGUgaXNOYXBhcmkzZFR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOYXBhcmkzZCh0KSB8fCBpc1NwYXRpYWxPbWljczNkKHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgdG8gYXR0ZW1wdCBmb3IgdGhlIGN1cnJlbnQgcGxvdCB0eXBlIHRoaXMgcmVuZGVyLiBUaGUgZmFsbGJhY2sgY2hhaW5zIGJlbG93IGFyZVxuICAgKiBtaXJyb3JlZCBleGFjdGx5IGJ5IHtAbGluayBsb2FkfSBzbyB0aGUgaGFuZGxlIGBwbG90KClgIHJlY2VpdmVzIGFsd2F5cyBjb21lcyBmcm9tIHRoZVxuICAgKiBiYWNrZW5kIGBwbG90KClgIHNlbGVjdHMgKG5vIGxvYWQvcGxvdCBiYWNrZW5kIG1pc21hdGNoKTpcbiAgICogIC0gMkQgaW1hZ2UgKGV4cGxpY2l0IGBOQVBBUklfSU1BR0VgLCBvciBgSU1BR0VgIHdpdGggdGhlIFdlYkdQVSBvcHQtaW4pOiBuYXBhcmktanMg4oaSIE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSBwbGFpbiBgSU1BR0VgIChubyBvcHQtaW4pOiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gM0QgbmFwYXJpIChgTkFQQVJJX1ZPTFVNRWAvYE5BUEFSSV9JU09TVVJGQUNFYCk6IG5hcGFyaS1qcyDihpIgUGxvdGx5IChPU0QgY2FuJ3QgcmVuZGVyIDNEKS5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VCYWNrZW5kKCk6IElWaXN1YWxpemVyIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50UGxvdFR5cGU7XG4gICAgLy8gMkQgaW1hZ2Ugd2l0aCBhIG5hcGFyaS1qcyBhdHRlbXB0IChleHBsaWNpdCBuYXBhcmkgaW1hZ2UsIG9yIG9wdC1pbiBvbiB0aGUgSW1hZ2UgdHlwZSkuXG4gICAgaWYgKHRoaXMuaXNOYXBhcmlJbWFnZVR5cGUodCkgfHwgKHRoaXMuaXNJbWFnZVR5cGUodCkgJiYgdGhpcy5jb25maWcudXNlTmFwYXJpUmVuZGVyZXIpKSB7XG4gICAgICBpZiAoIXRoaXMubmFwYXJpRmVsbEJhY2spIHJldHVybiB0aGlzLm5hcGFyaTtcbiAgICAgIGlmICghdGhpcy5vc2RGZWxsQmFjaykgcmV0dXJuIHRoaXMub3NkO1xuICAgICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICAgIH1cbiAgICAvLyBQbGFpbiBJbWFnZSB0eXBlIChubyBuYXBhcmkgb3B0LWluKTogT1NELCB0aGVuIFBsb3RseS5cbiAgICBpZiAodGhpcy5pc0ltYWdlVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMub3NkO1xuICAgIH1cbiAgICAvLyAzRCBuYXBhcmkgdHlwZXM6IG5hcGFyaS1qcywgd2l0aCBQbG90bHkgYXMgdGhlIG9ubHkgdmlhYmxlIGZhbGxiYWNrLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmlGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5uYXBhcmk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgfVxuXG4gIC8qKiBCYWNrZW5kIGN1cnJlbnRseSBvbiBzY3JlZW4g4oCUIHdoYXQgb25nb2luZyB6b29tL3Rvb2wvcmVnaW9uIG9wcyBhY3Qgb24uICovXG4gIHByaXZhdGUgcmVuZGVyZXIoKTogSVZpc3VhbGl6ZXIge1xuICAgIHJldHVybiB0aGlzLmxhc3RSZW5kZXJlZCA/PyB0aGlzLnBsb3RseTtcbiAgfVxuXG4gIC8vIFN5c3RlbSBjYXBhYmlsaXRpZXMgYXJlIFBsb3RseSdzICh0aGUgZnVsbC1mZWF0dXJlZCBiYWNrZW5kKSBzbyB0aGUgVUlcbiAgLy8ga2VlcHMgb2ZmZXJpbmcgZXZlcnkgcGxvdCB0eXBlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIG9uIHNjcmVlbi5cbiAgZ2V0IGNhcGFiaWxpdGllcygpOiBWaWV3ZXJDYXBhYmlsaXRpZXMgeyByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzOyB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuaW1hZ2VCYWNrZW5kKCk7XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5uYXBhcmkubG9hZChpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IHRydWU7XG4gICAgICAgIC8vIE1pcnJvciBpbWFnZUJhY2tlbmQoKSdzIGZhbGxiYWNrIHNvIGxvYWQgKyBwbG90IHBpY2sgdGhlIHNhbWUgYmFja2VuZDpcbiAgICAgICAgLy8gIC0gM0QgbmFwYXJpIHR5cGVzIGhhdmUgbm8gMkQgZmFsbGJhY2sg4oaSIHN0cmFpZ2h0IHRvIFBsb3RseS5cbiAgICAgICAgLy8gIC0gMkQgaW1hZ2Ug4oaSIE9TRCwgdGhlbiBQbG90bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHRoaXMuY3VycmVudFBsb3RUeXBlKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseS4nLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkVmlhT3NkVGhlblBsb3RseShpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gT3BlblNlYWRyYWdvbiBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZS4nLCBlcnIpO1xuICAgICAgdGhpcy5vc2RGZWxsQmFjayA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfVxuICB9XG4gIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogYW55LCBpbWFnZUluZm86IElJbWFnZUluZm8sIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgICAgIHBsb3RUeXBlOiBQbG90VHlwZSwgaW5QbGFjZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIHJldHVybiBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHsgdGhpcy5wbG90bHkucmVsb2FkQW5kUGxvdCgpOyB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IG9mIGEgcmVuZGVyIGN5Y2xlOiByZS1lbmFibGUgbmFwYXJpLWpzL09TRCBhdHRlbXB0cyAoY2xlYXIgYW55IHByaW9yXG4gICAgLy8gcGVyLWltYWdlIGZhbGxiYWNrKSBhbmQgdGVhciBkb3duIHdoYXRldmVyJ3Mgb24gc2NyZWVuLlxuICAgIHRoaXMub3NkRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLm5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlc2V0KCk7XG4gIH1cbiAgcmVsYXlvdXQodHJ1ZUltYWdlU2l6ZT86IG51bWJlcltdKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5yZWxheW91dCh0cnVlSW1hZ2VTaXplKTsgfVxuICByZXNldEF4ZXMoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTsgfVxuICBhdXRvc2NhbGUoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5hdXRvc2NhbGUoKTsgfVxuICB6b29tSW4oKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS56b29tSW4oKTsgfVxuICB6b29tT3V0KCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpOyB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXREcmFnTW9kZShtb2RlKTsgfVxuICAvLyBTZXQgb24gYm90aCBiYWNrZW5kcyAobm90IGp1c3QgdGhlIGFjdGl2ZSByZW5kZXJlcik6IGNvbnN1bWVycyBjYWxsIHRoaXNcbiAgLy8gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHdoZW4gYHJlbmRlcmVyKClgIGlzIHN0aWxsIHRoZSBQbG90bHkgZGVmYXVsdCwgc29cbiAgLy8gT1NEIG11c3QgcmVjZWl2ZSB0aGUgZmxhZyB0byBob25vdXIgaXQgYXQgdmlld2VyIGNyZWF0aW9uLlxuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9zZC5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICAgIHRoaXMucGxvdGx5LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gIH1cbiAgLy8gU2V0IG9uIGJvdGggYmFja2VuZHMgKHNlZSBzZXROYXZpZ2F0b3JWaXNpYmxlKTogY29uc3VtZXJzIG1heSBzZXQgaXQgYmVmb3JlXG4gIC8vIHRoZSBmaXJzdCByZW5kZXIsIHdoZW4gdGhlIGFjdGl2ZSByZW5kZXJlciBpcyBzdGlsbCBQbG90bHkuXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vc2Quc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgIHRoaXMucGxvdGx5LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRTaG93U3RhY2soc2hvd3N0YWNrKTsgfVxuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFpJbmRleCh6SW5kZXgpO1xuICB9XG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0VHJ1ZUltYWdlU2l6ZSgpOyB9XG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEN1cnJlbnRJbWFnZSgpOyB9XG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRQaXhlbERhdGEoKTsgfVxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFNvdXJjZVJlY3QoKTtcbiAgfVxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuZG93bmxvYWRJbWFnZSgpOyB9XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmV4cG9ydENvbXBvc2l0ZSgpOyB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnBsb3RseS5zZXRQbG90VHlwZShwbG90VHlwZSk7XG4gIH1cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpOyB9XG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlc2V0U3VyZmFjZUNhbWVyYSgpOyB9XG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRSZXNvbHV0aW9uU2NhbGU/LihzY2FsZSk7IH1cbiAgZ2V0UmVzb2x1dGlvblNjYWxlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0UmVzb2x1dGlvblNjYWxlPy4oKSA/PyAxOyB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7IHRoaXMucGxvdGx5LnNldFN0YWNrTG9hZGluZyhiKTsgfVxuICAvLyBDYW5jZWwgaW4tZmxpZ2h0IGxvYWRpbmcgb24gZXZlcnkgYmFja2VuZCDigJQgdGhlIHVzZXIncyBDYW5jZWwgc2hvdWxkbid0IGRlcGVuZCBvbiB3aGljaCBvbmUgaXNcbiAgLy8gYWN0aXZlLiBPbmx5IGJhY2tlbmRzIHRoYXQgc3RyZWFtIGZyYW1lcyAobmFwYXJpLWpzKSBkbyByZWFsIHdvcms7IHRoZSByZXN0IG5vLW9wLiBUaGUgY29uY3JldGVcbiAgLy8gYmFja2VuZCBjbGFzc2VzIGRvbid0IGFsbCBkZWNsYXJlIHRoZSBvcHRpb25hbCBjb250cmFjdCBtZXRob2QsIHNvIGNhbGwgaXQgdmlhIElWaXN1YWxpemVyLlxuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYmFja2VuZCBvZiBbdGhpcy5wbG90bHksIHRoaXMub3NkLCB0aGlzLm5hcGFyaV0gYXMgSVZpc3VhbGl6ZXJbXSkge1xuICAgICAgYmFja2VuZC5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICB9XG4gIH1cbiAgLy8gTG9hZGluZyBzdGF0ZSBpcyBzdXJmYWNlZCBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIGRvaW5nIHRoZSB3b3JrOiBPU0QgYW5kIG5hcGFyaS1qcyAodm9sdW1lXG4gIC8vIGFzc2VtYmx5KSBkcml2ZSB0aGVpciBvd24gc3ViamVjdHMsIHNvIG1lcmdlIGFsbCB0aHJlZSBpbnRvIG9uZSBzdGFibGUgc3RyZWFtIHRoZSBob3N0XG4gIC8vIHN1YnNjcmliZXMgdG8gb25jZS4gKFByZXZpb3VzbHkgaGFyZGNvZGVkIHRvIFBsb3RseSwgc28gbmFwYXJpL09TRCBwcm9ncmVzcyBuZXZlciBzaG93ZWQuKVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnBsb3RseS5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5vc2QuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMubmFwYXJpLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgXSkucGlwZShtYXAoKGZsYWdzKSA9PiBmbGFncy5zb21lKEJvb2xlYW4pKSk7XG4gIH1cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAvLyBSZXBvcnQgdGhlIHByb2dyZXNzIG9mIHdoaWNoZXZlciBiYWNrZW5kIGlzIEFDVElWRUxZIGxvYWRpbmcgKG1heCBhY3Jvc3MgYWN0aXZlIG9uZXMpLiBBIHBsYWluXG4gICAgLy8gbWVyZ2UgbGV0IGFuIGlkbGUgYmFja2VuZCdzIHN0YWxlIHZhbHVlIHdpbiB0aGUgc3RyZWFtIG9uIGEgcmUtbG9hZCDigJQgbGVhdmluZyB0aGUgYmFyIGJlbG93IHRoZVxuICAgIC8vIGFjdGl2ZSBiYWNrZW5kJ3MgcmVhbCBwcm9ncmVzcyAoZS5nLiBzdHVjayB+4oWTIHdoaWxlIHRoZSAlIHJlYWQgMTAwKS4gR2F0aW5nIGJ5IHRoZSBsb2FkaW5nIGZsYWdcbiAgICAvLyBpZ25vcmVzIGlkbGUgYmFja2VuZHMsIHNvIHRoZSBiYXIgdHJhY2tzIHRoZSBvbmUgZG9pbmcgdGhlIHdvcmsgYW5kIHJlYWNoZXMgMTAwJS5cbiAgICBjb25zdCB0cmFjayA9ICh2OiBJVmlzdWFsaXplcik6IE9ic2VydmFibGU8W251bWJlciwgYm9vbGVhbl0+ID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFt2LmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCksIHYuaXNTdGFja0xvYWRpbmcoKV0pO1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0cmFjayh0aGlzLnBsb3RseSksIHRyYWNrKHRoaXMub3NkKSwgdHJhY2sodGhpcy5uYXBhcmkpXSkucGlwZShcbiAgICAgIG1hcCgocGFpcnMpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gcGFpcnMuZmlsdGVyKChbLCBsb2FkaW5nXSkgPT4gbG9hZGluZykubWFwKChbcF0pID0+IHApO1xuICAgICAgICByZXR1cm4gYWN0aXZlLmxlbmd0aCA/IE1hdGgubWF4KC4uLmFjdGl2ZSkgOiAwO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPGFueT4geyByZXR1cm4gdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKTsgfVxuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4geyByZXR1cm4gdGhpcy5wbG90bHkuZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTsgfVxuICAvLyBUaGUgaW50ZW5zaXR5IGluc2V0IGlzIGEgUGxvdGx5IExJTkUgY2hhcnQg4oCUIHJlbmRlciBpdCB0aHJvdWdoIFBsb3RseSwgd2hpY2hcbiAgLy8gb3ducyB0aGUgcHJvZmlsZSBzdHJlYW0gcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTsgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiAqc3RhdGUqIGxpdmVzIGluIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmU7IGJvdGggYmFja2VuZHMgaW1wbGVtZW50XG4gIC8vIElSZWdpb25TdG9yZSBieSBkZWxlZ2F0aW5nIHRvIGl0LiBXZSByb3V0ZSB0aHJvdWdoIHRoZSBhY3RpdmUgcmVuZGVyZXJcbiAgLy8gKG5vdCBoYXJkY29kZWQgUGxvdGx5KSBzbyB0aGUgYmFja2VuZCBvbiBzY3JlZW4gYWxzbyAqcmVuZGVycyogdGhlIGNoYW5nZTpcbiAgLy8gUGxvdGx5IHJlbGF5b3V0cyBpdHMgc2hhcGVzLCBPcGVuU2VhZHJhZ29uJ3Mgb3ZlcmxheSByZWRyYXdzIGZyb20gdGhlIHN0b3JlXG4gIC8vIHVwZGF0ZSBldmVudC4gRWl0aGVyIHdheSB0aGUgc2FtZSBzdG9yZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgc2V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbiwgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgICAgICAgICAgIGZpbGxDb2xvcj86IHN0cmluZywgYXBwZW5kPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRSZWdpb25zKHJlZ2lvbnMsIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgYXBwZW5kKTtcbiAgfVxuICBnZXRSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRSZWdpb25zKCk7IH1cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W10geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvblBvbHlnb25zKCk7IH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7IH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpOyB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2VsZWN0UmVnaW9uKHJlZ2lvbik7IH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTsgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7IH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U2hvd1NoYXBlTGFiZWwoKTsgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U2hhcGVDb2xvcigpOyB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEZpbGxDb2xvcigpOyB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7IH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTsgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQgeyByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTsgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7IHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCQoKTsgfVxuICBzZXRQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiB2b2lkIHsgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTsgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7IHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTsgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5zdG9yZS5yZW1vdmVDbGFzcyhuYW1lKTsgfVxuICByZXNldFByZXNldHMoKTogdm9pZCB7IHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7IH1cbiAgcGxvdFByZXZpb3VzU2hhcGVzKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkucGxvdFByZXZpb3VzU2hhcGVzKCk7IH1cbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBhbnlbXSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTsgfVxuICBnZXRQcmV2aW91c1NoYXBlcygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0UHJldmlvdXNTaGFwZXMoKTsgfVxuICAvLyBVbmRvIHN0YXRlIGlzIG93bmVkIGJ5IHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgKHNhbWUgaW5zdGFuY2UgZm9yIGJvdGhcbiAgLy8gYmFja2VuZHMpLCBzbyByb3V0aW5nIHRocm91Z2ggdGhlIGFjdGl2ZSByZW5kZXJlciBpcyBzYWZlIGFuZCBzdGFibGUuXG4gIHVuZG8oKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS51bmRvKCk7IH1cbiAgcmVkbygpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlZG8oKTsgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmNhblVuZG8oKTsgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmNhblJlZG8oKTsgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRDYW5VbmRvJCgpOyB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldENhblJlZG8kKCk7IH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlc2V0VW5kb0hpc3RvcnkoKTsgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpOyB9XG4gIGV4cG9ydFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmV4cG9ydFJlZ2lvbnMocmVnaW9ucyk7IH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTsgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIChqaXQtdWkjOTMpIOKAlCB0aGUgUmVnaW9uU3RvcmUgaXMgc2hhcmVkIGFjcm9zc1xuICAvLyAgICBiYWNrZW5kcywgc28gcm91dGluZyB0byB0aGUgYWN0aXZlIHJlbmRlcmVyIGhpdHMgdGhlIHNhbWUgc3RvcmUuIOKUgOKUgOKUgOKUgOKUgOKUgFxuICBlbnRlclN0YWNrTW9kZShzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5lbnRlclN0YWNrTW9kZShzbGljZXMsIGluaXRpYWxaLCBzYXZlTGF5b3V0KTtcbiAgfVxuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuZXhpdFN0YWNrTW9kZSgpOyB9XG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmlzU3RhY2tNb2RlKCk7IH1cbiAgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVMYXlvdXQoKTsgfVxuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXREaXNwbGF5U2xpY2Uoeik7IH1cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTbGljZVJlZ2lvbnMoKTsgfVxuICBnZXRTdGFja1NhdmVTbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVTbGljZXMoKTsgfVxuICAvKiogQWxsIHNsaWNlcycgQU5OT1RBVElPTiByZWdpb25zIGZvciBhIHotc3RhY2sgc2F2ZSAoaml0LXVpIzkzKSwgZWFjaCB0YWdnZWRcbiAgICogIHdpdGggaXRzIHplcm8tYmFzZWQgUmVnaW9uLno7IHByb2ZpbGUgbGluZXMgZXhjbHVkZWQuIEZsYXQgYW5ub3RhdGlvbiBzZXRcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVTbGljZXMoKSkge1xuICAgICAgb3V0LnNldCh6LCByZWdzLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEF1dGhvcml0YXRpdmUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHNpemUgZm9yIG1hc2sgZXhwb3J0LiBQcmVmZXJzIHRoZVxuICAgKiAgYWN0aXZlIHJlbmRlcmVyJ3MgcmVwb3J0ZWQgc2l6ZSwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSAoeC95XG4gICAqICBhcmUgdGhlIGZ1bGwtcmVzIHBpeGVsIGRpbWVuc2lvbnMgdXNlZCBhY3Jvc3MgdGhlIGFwcCkuIFJlamVjdHMgbm9uLWZpbml0ZVxuICAgKiAgb3Igbm9uLXBvc2l0aXZlIHNpemVzIOKAlCB0aGUgUGxvdGx5IGJvdW5kcyBjYW4geWllbGQgTmFOIGJlZm9yZSBhIHBsb3QgaXNcbiAgICogIGZ1bGx5IGxhaWQgb3V0LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgY3Jhc2ggbWFzayBjcmVhdGlvbi4gKi9cbiAgZ2V0TWFza0ltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2YWxpZCA9IChzOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgcyAmJiBOdW1iZXIuaXNGaW5pdGUocy53aWR0aCkgJiYgTnVtYmVyLmlzRmluaXRlKHMuaGVpZ2h0KSAmJlxuICAgICAgcy53aWR0aCA+PSAxICYmIHMuaGVpZ2h0ID49IDFcbiAgICAgICAgPyB7IHdpZHRoOiBNYXRoLnJvdW5kKHMud2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQocy5oZWlnaHQpIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZnJvbVJlbmRlcmVyID0gdmFsaWQodGhpcy5nZXRUcnVlSW1hZ2VTaXplKCkpO1xuICAgIGlmIChmcm9tUmVuZGVyZXIpIHJldHVybiBmcm9tUmVuZGVyZXI7XG5cbiAgICBsZXQgbWV0YTogSUltYWdlTWV0YWRhdGFbXSA9IFtdO1xuICAgIHRoaXMuZ2V0SW1hZ2VNZXRhKCkuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKS51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IG0wID0gbWV0YT8uWzBdO1xuICAgIHJldHVybiBtMCA/IHZhbGlkKHsgd2lkdGg6IG0wLngsIGhlaWdodDogbTAueSB9KSA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRvckFwaTogYW5ub3RhdGlvbi1vbmx5IHN1cmZhY2UgZm9yIHRoZSBSZWdpb24gRWRpdG9yIOKUgOKUgOKUgFxuICAvLyBJbnRlbnNpdHktcHJvZmlsZSBsaW5lcyAoa2luZD0ncHJvZmlsZScpIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdFxuICAvLyB0aGUgZWRpdG9yLiBUaGVzZSBtZXRob2RzIGdpdmUgZXh0ZXJuYWwgY29uc3VtZXJzIGFuIGFubm90YXRpb24tb25seSB2aWV3XG4gIC8vIGFuZCBndWFyYW50ZWUgcHJvZmlsZSBsaW5lcyBhcmUgcHJlc2VydmVkLiBSb3V0aW5nIChub3QgdGhlIHN0b3JlKSBvd25zIHRoaXNcbiAgLy8gc28gd3JpdGVzL3NlbGVjdGlvbiBnbyB0aHJvdWdoIHJlbmRlcmVyKCkgYW5kIHRoZSBhY3RpdmUgYmFja2VuZCByZS1yZW5kZXJzXG4gIC8vIChQbG90bHkgcmVsYXlvdXRzIGl0cyBzaGFwZXMgaW4gc2V0UmVnaW9uczsgaXQgZG9lc24ndCBvbiByZWdpb25VcGRhdGUkKS5cblxuICBnZXRBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLCBmaWxsQ29sb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZS1hcHBlbmQgdGhlIHN0b3JlJ3MgcHJvZmlsZSBsaW5lcyBzbyBhbiBlZGl0b3Igc2F2ZS9kZWxldGUgY2FuJ3QgZHJvcFxuICAgIC8vIHRoZW0sIHRoZW4gcm91dGUgdGhyb3VnaCBzZXRSZWdpb25zIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZS1yZW5kZXJzLlxuICAgIGNvbnN0IHByb2ZpbGVzID0gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIGlkeHNcbiAgICAgICAgICAubWFwKChpKSA9PiByZWdzW2ldKVxuICAgICAgICAgIC5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIgJiYgIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIHNldFNlbGVjdGVkUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlbmRlcmVyKCkuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXMgPSAocmVnaW9ucyB8fCBbXSlcbiAgICAgIC5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSlcbiAgICAgIC5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0b29scyDihpIgYWN0aXZlIHJlbmRlcmVyIChydW4gb24gZWl0aGVyIGJhY2tlbmQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgd2FuZCwgdmVydGV4IGVyYXNlciBhbmQgem9vbS10by1ib3ggYXJlIGltcGxlbWVudGVkIG9uIGJvdGggYmFja2VuZHNcbiAgLy8gdmlhIElDb29yZGluYXRlVHJhbnNmb3JtICgrIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2sgZm9yIHRoZSB3YW5kKSwgc28gdGhleVxuICAvLyBmb2xsb3cgdGhlIGFjdGl2ZSByZW5kZXJlci5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogYW55KTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRXYW5kTW9kZShhY3RpdmUsIG9wdGlvbnMpOyB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0V2FuZE9wdGlvbnMob3B0aW9ucyk7IH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7IH1cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7IH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnMpOyB9XG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSk7IH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzKTsgfVxuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUpOyB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuc2VnbWVudFJlY3RhbmdsZXMoKTsgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOyB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFNhbU1vZGVsKGlkKTsgfVxuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTsgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5jb21taXRTYW1Qb2ludHMoKTsgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmNsZWFyU2FtUG9pbnRzKCk7IH1cblxuICAvLyDilIDilIAgZGlzcGxheSBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBTdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgcmVhZHMgZ28gc3RyYWlnaHQgdG8gaXQuXG4gIC8vIFRoZSB0d28gU0VUVEVSUyBzdGlsbCByb3V0ZSB0aHJvdWdoIFBsb3RseSBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbnNcbiAgLy8gY2FycnkgcmVuZGVyIGdsdWUgYmV5b25kIHRoZSBzdG9yZSB3cml0ZSAoYSBsaXZlIFBsb3RseS5yZXN0eWxlIG9mXG4gIC8vIGNvbG9yc2NhbGUvcmV2ZXJzZXNjYWxlIG9uIHRoZSBtb3VudGVkIGhlYXRtYXApOyBPU0QgcmVjb2xvcnMgdmlhIGl0cyBvd25cbiAgLy8gc3RvcmUgc3Vic2NyaXB0aW9uIGVpdGhlciB3YXkuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7IHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7IH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IGFueSk6IHZvaWQgeyB0aGlzLnBsb3RseS5zZXRDb2xvcm1hcChjb2xvcm1hcCk7IH1cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IGFueSB7IHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpOyB9XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCk7IH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGU6IGFueSk6IHZvaWQgeyB0aGlzLnBsb3RseS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZSk7IH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IHZvaWQgeyB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEpOyB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7IH1cblxuICAvLyDilIDilIAgSUNoYW5uZWxIaXN0b2dyYW1BcGk6IENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgc3VyZmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ2hhbm5lbC9ncmF5c2NhbGUvaW52ZXJ0IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlOyBib3RoXG4gIC8vIGJhY2tlbmRzIHN1YnNjcmliZSBhbmQgcmVjb2xvciBsaXZlLCBzbyBzZXR0ZXJzIGp1c3Qgd3JpdGUgdGhlIHN0b3JlLiBUaGVcbiAgLy8gaGlzdG9ncmFtIGNvbWVzIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuIChpdHMgbmF0aXZlIHBpeGVscykuXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgZGF0YSAoMTYtYml0IG11bHRpLWJhbmQgVElGRikgdmlhIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTsgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpOyB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7IHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4KTsgfVxuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCBwYXJ0aWFsKTtcbiAgfVxuICByZXNldENvbnRyYXN0KGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRnVsbCByZXNldDogd2luZG93ICgwLi4yNTUpLCBnYW1tYSAoMSkgQU5EIHRoZSBjaGFubmVsJ3MgZGVmYXVsdCB0aW50LlxuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB0aGlzLnN0b3JlLnJlc2V0Q2hhbm5lbFN0YXRlKGkpO1xuICB9XG4gIC8qKiBBdXRvLXdpbmRvdyBlYWNoIGNoYW5uZWwgYnkgc2F0dXJhdGluZyBgc2F0dXJhdGlvbmAgKDAuLjEpIG9mIHBpeGVscyBhdCBlYWNoXG4gICAqICBlbmQgb2YgaXRzIGhpc3RvZ3JhbSAoc2tpcHBpbmcgb3V0bGllciBmaXJzdC9sYXN0IGJpbnMpLiAqL1xuICBhdXRvQ29udHJhc3QoaW5kaWNlczogbnVtYmVyW10sIHNhdHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShpLCAyNTYpO1xuICAgICAgaWYgKCFoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbShoLCBzYXR1cmF0aW9uKTtcbiAgICAgIGlmIChtYXggPiBtaW4pIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGksIHsgbWluLCBtYXggfSk7XG4gICAgfVxuICB9XG4gIGdldEdyYXlzY2FsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnN0b3JlLmdldEdyYXlzY2FsZSgpOyB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQgeyB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7IH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCk7IH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7IHRoaXMuc3RvcmUuc2V0SW52ZXJ0KG9uKTsgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIGJhY2tlbmQncyByZWdpb24gb3ZlcmxheS4gRmFsbHMgYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZW5kZXJlcigpO1xuICAgIGlmIChyID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIGlmIChyID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogSXNvc3VyZmFjZSBjb250cm9scyB3aGVuIGF2YWlsYWJsZSDigJQgYWx3YXlzIFBsb3RseSdzLCBzaW5jZSB0aGUgaXNvc3VyZmFjZVxuICAgKiBwbG90IHR5cGUgcmVuZGVycyBvbiBQbG90bHkgKE9TRCBvbmx5IGhhbmRsZXMgdGhlIGltYWdlIHR5cGUpLlxuICAgKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKTsgfVxuXG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyDigJQgYWx3YXlzIFBsb3RseSdzLCBzaW5jZSB0aGUgM0QgcGxvdCB0eXBlcyByZW5kZXIgb25cbiAgICogIFBsb3RseSAoT1NEIG9ubHkgaGFuZGxlcyB0aGUgaW1hZ2UgdHlwZSkuICovXG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFN1cmZhY2UzZENvbnRyb2xzKCk7IH1cblxuICAvKiogSW50ZW5zaXR5IChsaW5lLVJPSSkgY29udHJvbHMg4oCUIGFsd2F5cyBQbG90bHkncywgc2luY2UgdGhlIGxpbmUgcHJvZmlsZXNcbiAgICogIHJlbmRlciB0aGVpciBpbnNldCBvbiBQbG90bHkgcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIGRyYXdzIHRoZSBpbWFnZS4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7IHJldHVybiB0aGlzLnBsb3RseS5nZXRJbnRlbnNpdHlDb250cm9scygpOyB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLlxuICAgKlxuICAgKiBJbXBsZW1lbnRlZCBIRVJFIHJhdGhlciB0aGFuIG9uIGEgYmFja2VuZCBiZWNhdXNlIHRoZSBzdGF0ZSBpc1xuICAgKiBiYWNrZW5kLW5ldXRyYWw6IHRoZSB2aWV3IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgYFZpc3VhbGl6ZXJTdG9yZWAgKGxpa2VcbiAgICogdGhlIGNvbG9ybWFwKSwgc28gdGhlIGNvbnRyb2xzIGtlZXAgd29ya2luZyBhY3Jvc3MgYSBwbG90LXR5cGUgc3dpdGNoIGFuZCBhXG4gICAqIGhvc3QgY2FuIGRyaXZlIHRoZW0gYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBpZiAoIXBvcnQpIHJldHVybiBudWxsO1xuICAgIC8vIE1pcnJvciB0aGUgZGF0YXNldCAoYW5kIGRyb3AgYSBzdGFsZSBzZWxlY3Rpb24gd2hlbiBpdCBjaGFuZ2VzIOKAlCB0aGUgbWFza3NcbiAgICAvLyBhcmUgaW5kZXgtYmFzZWQsIHNvIHRoZXkgYXJlIG1lYW5pbmdsZXNzIGFnYWluc3QgZGlmZmVyZW50IG9ic2VydmF0aW9ucykuXG4gICAgdGhpcy5zcGF0aWFsRGF0YXNldFN1YiA/Pz0gcG9ydC5nZXREYXRhc2V0JCgpLnN1YnNjcmliZSgoZGF0YXNldCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZCA9IGRhdGFzZXQ/LmlkICE9PSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uaWQ7XG4gICAgICB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RvcmUuc2V0KGVtcHR5U2VsZWN0aW9uKGRhdGFzZXQ/Lm9ic2VydmF0aW9ucy5jb3VudCA/PyAwKSk7XG4gICAgICAvLyBBIGNvbG91ciBzb3VyY2UgdGhlIG5ldyBkYXRhc2V0IGNhbm5vdCBzYXRpc2Z5IHdvdWxkIGxlYXZlIHRoZSBtYXAgZmxhdFxuICAgICAgLy8gd2hpbGUgdGhlIHBhbmVsIGFuZCB0aGUgY2hhcnRzIGtlcHQgbmFtaW5nIHRoZSBvbGQgY29sdW1uIOKAlCBzbyBkcm9wIGl0LFxuICAgICAgLy8gYW5kIG9ubHkgaXQ6IHBvaW50IHNpemUsIG9wYWNpdHkgYW5kIHRoZSByZXN0IGFyZSB0aGUgdXNlcidzIHByZWZlcmVuY2VzLFxuICAgICAgLy8gbm90IHRoZSBwcmV2aW91cyBkYXRhc2V0J3Mgc3RhdGUuXG4gICAgICBjb25zdCBieSA9IHRoaXMuc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCkuY29sb3JCeTtcbiAgICAgIGlmIChieSAmJiAhdGhpcy5jYW5Db2xvckJ5KGRhdGFzZXQsIGJ5KSkgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNvbG9yQnk6IG51bGwgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5zcGF0aWFsQ29udHJvbHMgPz89IHtcbiAgICAgIGdldERhdGFzZXQkOiAoKSA9PiBwb3J0LmdldERhdGFzZXQkKCksXG4gICAgICBnZXRWaWV3U3RhdGUkOiAoKSA9PiB0aGlzLnN0b3JlLmdldFNwYXRpYWxWaWV3JCgpLFxuICAgICAgdmlld1N0YXRlOiAoKSA9PiB0aGlzLnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLFxuICAgICAgc2V0Vmlld1N0YXRlOiAocGFydGlhbCkgPT4gdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyhwYXJ0aWFsKSxcbiAgICAgIC8vIFRoZSBoaW50IFNFRURTIHRoZSB0b2dnbGUgd2hlbiB0aGUgc291cmNlIGNoYW5nZXMsIGFuZCBub3RoaW5nIGNvbnN1bHRzIGl0XG4gICAgICAvLyBhZnRlcndhcmRzLiBJdCB1c2VkIHRvIGJlIE9SZWQgaW4gYXQgcmVuZGVyIHRpbWUsIHdoaWNoIG1lYW50IGFuIHVuY2hlY2tlZFxuICAgICAgLy8gYm94IGNvdWxkIG5vdCB0dXJuIGxvZyBzY2FsaW5nIG9mZiBmb3IgYSBoaW50ZWQgY29sdW1uIOKAlCBhbmQgdGhlIGxpbmtlZFxuICAgICAgLy8gY2hhcnQsIHdoaWNoIHJlYWRzIGBsb2dTY2FsZWAgYWxvbmUsIGRpc2FncmVlZCB3aXRoIHRoZSBtYXAgYWJvdXQgd2hhdCBpdFxuICAgICAgLy8gd2FzIHNob3dpbmcuIE9uZSBhdXRob3JpdHksIHNldCBvbmNlIHBlciBzb3VyY2UuXG4gICAgICBjb2xvckJ5Q29sdW1uOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBjb25zdCBoaW50ID0gbWV0YT8ua2luZCA9PT0gJ2NvbnRpbnVvdXMnID8gISFtZXRhLmxvZ1NjYWxlSGludCA6IGZhbHNlO1xuICAgICAgICB0aGlzLnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogeyBraW5kOiAnY29sdW1uJywgbmFtZSB9LCBsb2dTY2FsZTogaGludCB9KTtcbiAgICAgIH0sXG4gICAgICBjb2xvckJ5RmVhdHVyZTogKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7XG4gICAgICAgICAgY29sb3JCeTogeyBraW5kOiAnZmVhdHVyZScsIG5hbWUgfSxcbiAgICAgICAgICBsb2dTY2FsZTogISF0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uZmVhdHVyZXM/LmxvZ1NjYWxlSGludCxcbiAgICAgICAgfSksXG4gICAgICBjbGVhckNvbG9yQnk6ICgpID0+IHRoaXMuc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pLFxuICAgICAgc2VhcmNoRmVhdHVyZXM6IGFzeW5jIChxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKSA9PiB7XG4gICAgICAgIC8vIFByZWZlciB0aGUgcG9ydCdzIHNlYXJjaCAoYSAzMWstZ2VuZSBkYXRhc2V0IGRvZXMgbm90IHNoaXAgaXRzIG5hbWVzKTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbHRlciB3aGF0ZXZlciB0aGUgbWFuaWZlc3QgaW5saW5lZC5cbiAgICAgICAgaWYgKHBvcnQuc2VhcmNoRmVhdHVyZXMpIHJldHVybiBwb3J0LnNlYXJjaEZlYXR1cmVzKHF1ZXJ5LCBsaW1pdCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShwb3J0LmdldERhdGFzZXQkKCkpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGRhdGFzZXQ/LmZlYXR1cmVzPy5uYW1lcyA/PyBbXTtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgfSxcbiAgICAgIGNhdGVnb3J5Q29sb3JzOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc29sdmVkIGJ5IHRoZSBTQU1FIGZ1bmN0aW9uIHRoZSByZW5kZXJlciB1c2VzLCBzbyBhIGxlZ2VuZCBzd2F0Y2hcbiAgICAgICAgLy8gY2FuIG5ldmVyIGRpc2FncmVlIHdpdGggdGhlIGNvbG91ciBvbiBzY3JlZW4uXG4gICAgICAgIHJldHVybiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICAgICAgfSxcblxuICAgICAgY29udGludW91c1ZhbHVlczogYXN5bmMgKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlLmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuIHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihzb3VyY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbc3BhdGlhbF0gY29sdW1uIFwiJHtzb3VyY2UubmFtZX1cIiBpcyBjYXRlZ29yaWNhbCDigJQgaXQgaGFzIG5vIHZhbHVlcyB0byBjaGFydGAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uLnZhbHVlcztcbiAgICAgIH0sXG5cbiAgICAgIGNhdGVnb3JpY2FsVmlldzogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwcmVhZCByYXRoZXIgdGhhbiBhbHdheXMgZGVmaW5lZDogYGdldEVtYmVkZGluZ2AgaXMgb3B0aW9uYWwgb24gYm90aCB0aGUgcG9ydFxuICAgICAgLy8gYW5kIHRoaXMgZmFjYWRlLCBhbmQgYSBwYW5lbCBjaGVja3MgZm9yIGl0cyBwcmVzZW5jZSB0byBkZWNpZGUgd2hldGhlciB0aGUgdmlld1xuICAgICAgLy8gaXMgb2ZmZXJlZCBhdCBhbGwuIERlZmluaW5nIGl0IGFzIGEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHdvdWxkIG1ha2UgYW5cbiAgICAgIC8vIGVtYmVkZGluZy1sZXNzIHNvdXJjZSBsb29rIGxpa2UgYSBicm9rZW4gb25lLlxuICAgICAgLi4uKHBvcnQuZ2V0RW1iZWRkaW5nXG4gICAgICAgID8geyBnZXRFbWJlZGRpbmc6IChuYW1lOiBzdHJpbmcpID0+IHBvcnQuZ2V0RW1iZWRkaW5nIShuYW1lKSB9XG4gICAgICAgIDoge30pLFxuXG4gICAgICBjYXRlZ29yaWNhbENvbHVtbnM6ICgpID0+ICh0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uY29sdW1ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKVxuICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpLFxuXG4gICAgICAvLyBNZW1vaXplZCBvbiB0aGUgb2JzZXJ2YXRpb25zIG9iamVjdCwgc28gdGhlIHJlbmRlcmVyJ3Mgb3duIGxvb2t1cCBhbmRcbiAgICAgIC8vIHRoaXMgb25lIGFyZSB0aGUgc2FtZSBzaW5nbGUgc2NhbiBvZiB1cCB0byAzLjdNIHogdmFsdWVzLlxuICAgICAgc2FtcGxlZFNlY3Rpb25zOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9icyA9IHRoaXMuY3VycmVudFNwYXRpYWxEYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgICAgIHJldHVybiBvYnMgPyBzZWN0aW9uc09mKG9icykgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0aW9uJDogKCkgPT4gdGhpcy5zZWxlY3Rpb25TdG9yZS5nZXRTZWxlY3Rpb24kKCksXG5cbiAgICAgIHNlbGVjdEZyb21SZWdpb25zOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldDtcbiAgICAgICAgaWYgKCFkYXRhc2V0KSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgICAgICAvLyBUaGUgdW5pb24gb2YgZXZlcnkgZHJhd24gcmVnaW9uIOKAlCBzbyBldmVyeSBST0kgdG9vbCB0aGUgbGlicmFyeVxuICAgICAgICAvLyBhbHJlYWR5IGhhcyBkb3VibGVzIGFzIGEgc3BhdGlhbCBzZWxlY3Rpb24gdG9vbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkIHRoZXJlIGlzIG5vIGRhdGEtc3BhY2UgYWZmaW5lIHRvIHB1c2ggYSBkcmF3biBzaGFwZVxuICAgICAgICAvLyB0aHJvdWdoLCBzbyB0aGUgb2JzZXJ2YXRpb25zIGFyZSBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGVcbiAgICAgICAgLy8gcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSkgYW5kIHRlc3RlZCBpbiBzY3JlZW4gc3BhY2UgaW5zdGVhZC5cbiAgICAgICAgLy8gRmFsbHMgYmFjayB0byB0aGUgMkQgcGF0aCB3aGVuZXZlciB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpXG4gICAgICAgICAgPyB0aGlzLm5hcGFyaS5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihkYXRhc2V0Lm9ic2VydmF0aW9ucylcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIC8vIEluIHRoZSAyRCB2aWV3IG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkVcbiAgICAgICAgLy8gc2VjdGlvbiwgaW4gdGhlIHZvbHVtZSdzIHBpeGVsIGdyaWQ6IGl0IHNlbGVjdHMgdGhlIGNlbGxzIG9mIHRoYXRcbiAgICAgICAgLy8gc2VjdGlvbiwgbm90IHRoZSB3aG9sZSBkZXB0aCBvZiBicmFpbiBzdGFuZGluZyBiZWhpbmQgdGhlbS5cbiAgICAgICAgY29uc3Qgdm9sdW1lID0gIWRhdGFzZXQuaW1hZ2VSZWYgPyBkYXRhc2V0LnZvbHVtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gcHJvamVjdGVkXG4gICAgICAgICAgPyBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQocHJvamVjdGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgcmVnaW9ucylcbiAgICAgICAgICA6IHNlbGVjdEluUmVnaW9ucyhcbiAgICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICAgIHZvbHVtZSA/IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCkgOiBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICAgICAgICByZWdpb25zLFxuICAgICAgICAgICAgICB2b2x1bWVcbiAgICAgICAgICAgICAgICA/IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgdGhpcy5jdXJyZW50WkluZGV4KVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdENhdGVnb3J5OiBhc3luYyAoY29sdW1uOiBzdHJpbmcsIGNhdGVnb3J5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4obG9hZGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlDYXRlZ29yeShsb2FkZWQuY29kZXMsIGNhdGVnb3J5SW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SW5kaWNlczogKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDA7XG4gICAgICAgIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzLCBjb3VudCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbjogKCkgPT4gdGhpcy5zZWxlY3Rpb25TdG9yZS5jbGVhcigpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbENvbnRyb2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYGRhdGFzZXRgIGNhbiBhbnN3ZXIgdGhpcyBjb2xvdXIgc291cmNlLlxuICAgKlxuICAgKiBBIGNvbHVtbiBpcyBjaGVja2FibGUgYWdhaW5zdCB0aGUgZGVjbGFyZWQgbGlzdC4gQSBnZW5lIGlzIGNoZWNrYWJsZSBvbmx5IHdoZW5cbiAgICogdGhlIGRhdGFzZXQgaW5saW5lcyBpdHMgZmVhdHVyZSBuYW1lcyDigJQgYSBkYXRhc2V0IHRvbyB3aWRlIHRvIGlubGluZSB0aGVtXG4gICAqICh0eXBlYWhlYWQtb25seSkga2VlcHMgdGhlIHNvdXJjZSwgYW5kIGEgbmFtZSB0aGF0IHR1cm5zIG91dCBub3QgdG8gZXhpc3RcbiAgICogc3VyZmFjZXMgYXMgdGhlIGNoYXJ0J3MgXCJjb3VsZCBub3QgYmUgY2hhcnRlZFwiIHJhdGhlciB0aGFuIGFzIGEgc2lsZW50IHJlc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBjYW5Db2xvckJ5KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgYnk6IFNwYXRpYWxDb2xvckJ5KTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhc2V0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGJ5LmtpbmQgPT09ICdjb2x1bW4nKSByZXR1cm4gZGF0YXNldC5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk7XG4gICAgY29uc3QgbmFtZXMgPSBkYXRhc2V0LmZlYXR1cmVzPy5uYW1lcztcbiAgICByZXR1cm4gISFkYXRhc2V0LmZlYXR1cmVzICYmICghbmFtZXMgfHwgbmFtZXMuaW5jbHVkZXMoYnkubmFtZSkpO1xuICB9XG5cbiAgLyoqIE1lbW9pc2VkIHNvIGNvbnN1bWVycyBjYW4gaG9sZCB0aGUgb2JqZWN0IGFjcm9zcyBjYWxscy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsQ29udHJvbHM6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBkYXRhc2V0LCBtaXJyb3JlZCBzbyBgc2VsZWN0RnJvbVJlZ2lvbnMoKWAgY2FuIGFuc3dlciBzeW5jaHJvbm91c2x5XG4gICAqICDigJQgaXQgcnVucyBmcm9tIGEgYnV0dG9uIGNsaWNrIGFuZCBtdXN0IG5vdCBhd2FpdCBhIHJvdW5kLXRyaXAuICovXG4gIHByaXZhdGUgY3VycmVudFNwYXRpYWxEYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcbiAgcHJpdmF0ZSBzcGF0aWFsRGF0YXNldFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExvYWQgcGl4ZWwgZnJhbWVzIGZvciBpbnRlbnNpdHkgc2FtcGxpbmcgd2hlbiBPcGVuU2VhZHJhZ29uIG93bnMgdGhlIGltYWdlXG4gICAqICAoaXQgZG9lc24ndCBmZWVkIFBsb3RseSdzIGZyYW1lIGNhY2hlKS4gTm8tb3AgbmVlZGVkIHdoZW4gUGxvdGx5IHJlbmRlcnMuICovXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUtcmVnaW9uIGNoYW5nZXMgZnJvbSB0aGUgT3BlblNlYWRyYWdvbiB2aWV3ZXIgKGltYWdlLXBpeGVsIGNvb3JkcyksXG4gICAqICBzbyB0aGUgaW50ZW5zaXR5IGluc2V0IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC4gUGxvdGx5J3Mgb3duXG4gICAqICBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSwgc28gb25seSBPU0QgZmVlZHMgdGhpcy4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLm9zZC5nZXRWaWV3cG9ydENoYW5nZSQoKTtcbiAgfVxuXG4gIC8qKiBSZS1zYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyBmcm9tIGEgZnJlc2ggY3JvcCBvZiB0aGUgZ2l2ZW4gaW1hZ2UtcGl4ZWxcbiAgICogIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24gKHNhbXBsaW5nIGFsd2F5cyBsaXZlcyBpbiBQbG90bHkpLiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9zZC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
750
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQTRCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN4RyxPQUFPLEVBQUUsUUFBUSxFQUFzQixVQUFVLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBJLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUV6RixPQUFPLEVBQWtCLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxtQkFBbUIsRUFBRSxjQUFjLEdBQ3BDLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFLMUUs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LENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekIsQ0FBQzs4R0E5cUJVLHdCQUF3QixtS0FrQmYsVUFBVSw2RUFLRSxpQkFBaUI7a0hBdkJ0Qyx3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBbUJuQixNQUFNOzJCQUFDLFVBQVU7OzBCQUtqQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBsb3RseVNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvb3NkL29wZW5zZWFkcmFnb24tdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFBsb3RUeXBlLCBQbG90VHlwZURlc2NyaXB0b3IsIGlzTmFwYXJpM2QsIGlzTmFwYXJpU2NhdHRlciwgaXNTcGF0aWFsT21pY3MsIGlzU3BhdGlhbE9taWNzM2QgfSBmcm9tICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFBpeGVsRGF0YSwgSW50ZW5zaXR5UHJvZmlsZSwgSUlzb3N1cmZhY2VDb250cm9scywgSUludGVuc2l0eUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMsIElTcGF0aWFsQ29udHJvbHMgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNQQVRJQUxfREFUQV9QT1JULCBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgeyBTcGF0aWFsQ29sb3JCeSB9IGZyb20gJy4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgU3BhdGlhbERhdGFzZXQsIGlzQ2F0ZWdvcmljYWxDb2x1bW4gfSBmcm9tICcuL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgc2VjdGlvbnNPZiB9IGZyb20gJy4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7XG4gIG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmLFxufSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC12b2x1bWUtaW1hZ2UnO1xuaW1wb3J0IHtcbiAgZW1wdHlTZWxlY3Rpb24sXG4gIHNlbGVjdEJ5Q2F0ZWdvcnksXG4gIHNlbGVjdEJ5SW5kaWNlcyxcbiAgc2VsZWN0SW5SZWdpb25zLFxuICBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQsXG59IGZyb20gJy4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0b3JBcGkgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgUGxvdE1vZGVWaWV3cG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQgc2VsZWN0b3IuIFJvdXRlcyBwZXIgcGxvdCB0eXBlOlxuICogIC0gdGhlICoqSW1hZ2UqKiBwbG90IHR5cGUgcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24g4oCUIGEgbmF0aXZlbHktdGlsZWQsXG4gKiAgICB6b29tYWJsZSByYXN0ZXIgYmFja2VkIGJ5IHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cy4gSXQncyB0aGUgZGVmYXVsdFxuICogICAgdmlldyBhbmQgc3VwcG9ydHMgdGhlIHJlZ2lvbiBvdmVybGF5L3Rvb2xzIGFuZCAoZm9yIGdyYXlzY2FsZSkgdGhlXG4gKiAgICBjb2xvcm1hcCwgYXBwbGllZCBjbGllbnQtc2lkZSB2aWEgdGhlIHRpbGUgcGl4ZWwgcGlwZWxpbmUuXG4gKiAgLSBldmVyeSBvdGhlciBwbG90IHR5cGUgKGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsXG4gKiAgICBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpIHJlbmRlcnMgdGhyb3VnaCBQbG90bHkuXG4gKlxuICogT25seSB0aGUgKipyZW5kZXIgKyB2aWV3cG9ydCoqIHBhdGggaXMgcm91dGVkLiBSZWdpb24gc3RhdGUsIGRpc3BsYXkgb3B0aW9uc1xuICogKGNvbG9ybWFwL0xVVCksIGFuZCB0aGUgbG9uZy1saXZlZCBvYnNlcnZhYmxlcyBhbHdheXMgbGl2ZSBpbiBQbG90bHkgKHRoZVxuICogc2hhcmVkIHN0b3JlKSBzbyBib3RoIGJhY2tlbmRzIHN0YXkgaW4gc3luYzsgT1NEIHJlYWRzIHRoZW0gdG8gZHJpdmUgaXRzIG93blxuICogb3ZlcmxheSBhbmQgdGlsZSByZWNvbG9yaW5nLlxuICpcbiAqIFRoZSBJbWFnZSB0eXBlIHJlbmRlcnMgdGhyb3VnaCBPcGVuU2VhZHJhZ29uOyBhIGZhaWxlZCBPU0QgbG9hZCBmYWxscyBiYWNrIHRvXG4gKiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seSAoc2VlIGBvc2RGZWxsQmFja2ApIHNvIGl0IHN0aWxsIHJlbmRlcnMuXG4gKi9cbi8qKiBJbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgYXJlIG93bmVkIGJ5IHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBlZGl0b3IuXG4gKiAgUGFja2FnZS1pbnRlcm5hbCBwcmVkaWNhdGUgKHByb3BlcnR5LWJhc2VkIHNvIGl0IGFsc28gbWF0Y2hlcyBwbGFpbiBvYmplY3RzXG4gKiAgYWZ0ZXIgYSBkcmFnIHJvdW5kLXRyaXApLiAqL1xuZnVuY3Rpb24gaXNQcm9maWxlUmVnaW9uKHI6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcj8ua2luZCA9PT0gJ3Byb2ZpbGUnO1xufVxuXG4vKiogU2F0dXJhdGlvbi1iYXNlZCBhdXRvLXdpbmRvdzogcGljayBbbWluLG1heF0gc28gfmBzYXR1cmF0aW9uYCBvZiBwaXhlbHMgY2xpcFxuICogIGF0IGVhY2ggZW5kIG9mIHRoZSBoaXN0b2dyYW0uIEEgZG9taW5hbnQgZmlyc3QvbGFzdCBiaW4gKHVuc2Nhbm5lZCBwYWRkaW5nIC9cbiAqICBjbGlwcGVkIGJhY2tncm91bmQpIGlzIGRyb3BwZWQgc28gaXQgZG9lc24ndCBza2V3IHRoZSByYW5nZS4gKi9cbmZ1bmN0aW9uIGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtKGg6IElIaXN0b2dyYW0sIHNhdHVyYXRpb246IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBjb3VudHMgPSBoLmNvdW50cy5zbGljZSgpO1xuICBjb25zdCBuID0gY291bnRzLmxlbmd0aDtcbiAgaWYgKG4gPT09IDApIHJldHVybiBbMCwgMjU1XTtcbiAgaWYgKG4gPiAyICYmIGNvdW50c1swXSA+IGNvdW50c1sxXSkgY291bnRzWzBdID0gMDtcbiAgaWYgKG4gPiAyICYmIGNvdW50c1tuIC0gMV0gPiBjb3VudHNbbiAtIDJdKSBjb3VudHNbbiAtIDFdID0gMDtcbiAgbGV0IHRvdGFsID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIGNvdW50cykgdG90YWwgKz0gYztcbiAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBbMCwgMjU1XTtcbiAgY29uc3QgdGFyZ2V0ID0gdG90YWwgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigwLjUsIHNhdHVyYXRpb24pKTtcbiAgbGV0IGFjYyA9IDA7XG4gIGxldCBtaW4gPSBoLmJpbnNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgYWNjICs9IGNvdW50c1tpXTtcbiAgICBpZiAoYWNjID4gdGFyZ2V0KSB7IG1pbiA9IGguYmluc1tpXTsgYnJlYWs7IH1cbiAgfVxuICBhY2MgPSAwO1xuICBsZXQgbWF4ID0gaC5iaW5zW24gLSAxXTtcbiAgZm9yIChsZXQgaSA9IG4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIGFjYyArPSBjb3VudHNbaV07XG4gICAgaWYgKGFjYyA+IHRhcmdldCkgeyBtYXggPSBoLmJpbnNbaV07IGJyZWFrOyB9XG4gIH1cbiAgcmV0dXJuIFttaW4sIG1heF07XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpIHtcblxuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaXN1YWxpemVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBsb3RseTogUGxvdGx5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuYXBhcmk6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgICAgICAgICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAgICAgICAgICAgLy8gT3B0aW9uYWw6IGEgaG9zdCB0aGF0IHNlcnZlcyBubyBzcGF0aWFsLW9taWNzIGRhdGEgYmluZHMgbm90aGluZyxcbiAgICAgICAgICAgICAgLy8gYW5kIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgdGhlbiByZXR1cm5zIG51bGwuXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpXG4gICAgICAgICAgICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsKSB7fVxuXG4gIHByaXZhdGUgaXNJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIDJEIG5hcGFyaSB0eXBlcyAoaW1hZ2UsIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyLCBzcGF0aWFsIG9taWNzKSDigJQgYSAyRCBmYWxsYmFjayBjaGFpblxuICAgKiAgKE9TRCwgdGhlbiBQbG90bHkpLlxuICAgKlxuICAgKiAgTk9URSBmb3IgU1BBVElBTF9PTUlDUzogb25seSBuYXBhcmktanMgZHJhd3MgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMuIElmIGl0IGZhaWxzIChubyBXZWJHUFUsXG4gICAqICBkZXZpY2UgbG9zcykgdGhlIGZhbGxiYWNrIHJlbmRlcnMgdGhlIHRpc3N1ZSBpbWFnZSBBTE9ORSDigJQgdGhlIHNwYXRpYWwgbGF5ZXIgaXMgYWJzZW50LCBub3RcbiAgICogIGRlZ3JhZGVkLiBUaGF0IGlzIGRlbGliZXJhdGUgZm9yIG5vdzogc2hvd2luZyB0aGUgc2xpZGUgYmVhdHMgc2hvd2luZyBub3RoaW5nLCBhbmQgYSBQbG90bHlcbiAgICogIGBzY2F0dGVyZ2xgIHNwYXRpYWwgbW9kZSBpcyB0aGUgcGxhbm5lZCByZWFsIGZhbGxiYWNrIChzZWUgdGhlIHBsb3QtbW9kZSBkZXNpZ24gZG9jKS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaUltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmlTY2F0dGVyKHQpIHx8IGlzU3BhdGlhbE9taWNzKHQpO1xuICB9XG5cbiAgLyoqIFRoZSAzRCBuYXBhcmkgdHlwZXMgKHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2Uvc2NhdHRlciwgcGx1cyB0aGUgM0Qgc3BhdGlhbCBjbG91ZCkg4oCUIG5vIDJEXG4gICAqICBmYWxsYmFjayBleGlzdHMgKE9TRCBpcyBpbWFnZS1vbmx5KSwgc28gdGhleSBmYWxsIHN0cmFpZ2h0IHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaTNkVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05hcGFyaTNkKHQpIHx8IGlzU3BhdGlhbE9taWNzM2QodCk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCB0byBhdHRlbXB0IGZvciB0aGUgY3VycmVudCBwbG90IHR5cGUgdGhpcyByZW5kZXIuIFRoZSBmYWxsYmFjayBjaGFpbnMgYmVsb3cgYXJlXG4gICAqIG1pcnJvcmVkIGV4YWN0bHkgYnkge0BsaW5rIGxvYWR9IHNvIHRoZSBoYW5kbGUgYHBsb3QoKWAgcmVjZWl2ZXMgYWx3YXlzIGNvbWVzIGZyb20gdGhlXG4gICAqIGJhY2tlbmQgYHBsb3QoKWAgc2VsZWN0cyAobm8gbG9hZC9wbG90IGJhY2tlbmQgbWlzbWF0Y2gpOlxuICAgKiAgLSAyRCBpbWFnZSAoZXhwbGljaXQgYE5BUEFSSV9JTUFHRWAsIG9yIGBJTUFHRWAgd2l0aCB0aGUgV2ViR1BVIG9wdC1pbik6IG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIHBsYWluIGBJTUFHRWAgKG5vIG9wdC1pbik6IE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSAzRCBuYXBhcmkgKGBOQVBBUklfVk9MVU1FYC9gTkFQQVJJX0lTT1NVUkZBQ0VgKTogbmFwYXJpLWpzIOKGkiBQbG90bHkgKE9TRCBjYW4ndCByZW5kZXIgM0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUJhY2tlbmQoKTogSVZpc3VhbGl6ZXIge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQbG90VHlwZTtcbiAgICAvLyAyRCBpbWFnZSB3aXRoIGEgbmFwYXJpLWpzIGF0dGVtcHQgKGV4cGxpY2l0IG5hcGFyaSBpbWFnZSwgb3Igb3B0LWluIG9uIHRoZSBJbWFnZSB0eXBlKS5cbiAgICBpZiAodGhpcy5pc05hcGFyaUltYWdlVHlwZSh0KSB8fCAodGhpcy5pc0ltYWdlVHlwZSh0KSAmJiB0aGlzLmNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcikpIHtcbiAgICAgIGlmICghdGhpcy5uYXBhcmlGZWxsQmFjaykgcmV0dXJuIHRoaXMubmFwYXJpO1xuICAgICAgaWYgKCF0aGlzLm9zZEZlbGxCYWNrKSByZXR1cm4gdGhpcy5vc2Q7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gICAgfVxuICAgIC8vIFBsYWluIEltYWdlIHR5cGUgKG5vIG5hcGFyaSBvcHQtaW4pOiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2RGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5vc2Q7XG4gICAgfVxuICAgIC8vIDNEIG5hcGFyaSB0eXBlczogbmFwYXJpLWpzLCB3aXRoIFBsb3RseSBhcyB0aGUgb25seSB2aWFibGUgZmFsbGJhY2suXG4gICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaUZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm5hcGFyaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqIEJhY2tlbmQgY3VycmVudGx5IG9uIHNjcmVlbiDigJQgd2hhdCBvbmdvaW5nIHpvb20vdG9vbC9yZWdpb24gb3BzIGFjdCBvbi4gKi9cbiAgcHJpdmF0ZSByZW5kZXJlcigpOiBJVmlzdWFsaXplciB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlbmRlcmVkID8/IHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLy8gU3lzdGVtIGNhcGFiaWxpdGllcyBhcmUgUGxvdGx5J3MgKHRoZSBmdWxsLWZlYXR1cmVkIGJhY2tlbmQpIHNvIHRoZSBVSVxuICAvLyBrZWVwcyBvZmZlcmluZyBldmVyeSBwbG90IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgb24gc2NyZWVuLlxuICBnZXQgY2FwYWJpbGl0aWVzKCk6IFZpZXdlckNhcGFiaWxpdGllcyB7IHJldHVybiB0aGlzLnBsb3RseS5jYXBhYmlsaXRpZXM7IH1cblxuICAvLyDilIDilIAgcmVuZGVyIC8gdmlld3BvcnQg4oaSIGFjdGl2ZSByZW5kZXJlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBBIHN0YWNrIGNhbiBvcGVuIGF3YXkgZnJvbSBzbGljZSAwIChgaW5pdGlhbFpJbmRleGAg4oCUIGEgdm9sdW1lIG9wZW5zXG4gICAgLy8gbWlkLXNwZWNpbWVuKSwgYW5kIHRoYXQgYXJyaXZlcyBoZXJlIHJhdGhlciB0aGFuIHRocm91Z2ggc2V0WkluZGV4LlxuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5pbWFnZUJhY2tlbmQoKTtcbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5uYXBhcmkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm5hcGFyaS5sb2FkKGltYWdlSW5mbywgekluZGV4KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLm5hcGFyaUZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgICAgLy8gTWlycm9yIGltYWdlQmFja2VuZCgpJ3MgZmFsbGJhY2sgc28gbG9hZCArIHBsb3QgcGljayB0aGUgc2FtZSBiYWNrZW5kOlxuICAgICAgICAvLyAgLSAzRCBuYXBhcmkgdHlwZXMgaGF2ZSBubyAyRCBmYWxsYmFjayDihpIgc3RyYWlnaHQgdG8gUGxvdGx5LlxuICAgICAgICAvLyAgLSAyRCBpbWFnZSDihpIgT1NELCB0aGVuIFBsb3RseS5cbiAgICAgICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gbmFwYXJpLWpzIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5LicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIE9wZW5TZWFkcmFnb24uJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRyeSBPU0Q7IG9uIGZhaWx1cmUgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSAobm90IHBlcm1hbmVudCDigJQgc2VlIHJlc2V0KCkpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5vc2QubG9hZChpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gIH1cbiAgcGxvdChwbG90RGl2OiBzdHJpbmcsIGltYWdlTG9hZGVkOiBhbnksIGltYWdlSW5mbzogSUltYWdlSW5mbywgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgcGxvdFR5cGU6IFBsb3RUeXBlLCBpblBsYWNlPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgLy8gQXBwbHkgdGhlIHBlci1pbWFnZSByZWdpb24gY2FjaGUgKHNuYXBzaG90IG9sZCByZWdpb25zLCByZXN0b3JlIHRoZSBuZXdcbiAgICAvLyBpbWFnZSdzLCBjbGVhciBzZWxlY3Rpb24pIGZvciB3aGljaGV2ZXIgYmFja2VuZCByZW5kZXJzIOKAlCBQbG90bHkgZG9lc1xuICAgIC8vIHRoaXMgaW5zaWRlIGl0cyBvd24gcGxvdCgpLCBidXQgT1NEIGRvZXNuJ3QsIHNvIGRyaXZlIGl0IGhlcmUuIElkZW1wb3RlbnRcbiAgICAvLyBmb3IgdGhlIHNhbWUgaW1hZ2UsIHNvIGl0J3Mgc2FmZSB0byBjYWxsIG9uIGV2ZXJ5IChyZSlwbG90LlxuICAgIHRoaXMucGxvdGx5LnNldEFjdGl2ZUltYWdlKGltYWdlSW5mbyk7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW1hZ2VCYWNrZW5kKCk7XG4gICAgLy8gQm90aCBiYWNrZW5kcyBzaGFyZSB0aGUgc2FtZSBkaXYg4oCUIHRlYXIgZG93biB0aGUgb3V0Z29pbmcgb25lIG9uIHN3aXRjaC5cbiAgICAvLyBQbG90bHkgbXVzdCBiZSAqcHVyZ2VkKiAobm90IHJlc2V0LCB3aGljaCByZS1kcmF3cyBlbXB0eSBheGVzKSBiZWZvcmUgT1NEXG4gICAgLy8gdGFrZXMgdGhlIGRpdi5cbiAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgJiYgdGhpcy5sYXN0UmVuZGVyZWQgIT09IG5leHQpIHtcbiAgICAgIGlmICh0aGlzLmxhc3RSZW5kZXJlZCA9PT0gdGhpcy5wbG90bHkpIHRoaXMucGxvdGx5LnB1cmdlUGxvdCgpO1xuICAgICAgZWxzZSB0aGlzLmxhc3RSZW5kZXJlZC5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmxhc3RSZW5kZXJlZCA9IG5leHQ7XG4gICAgcmV0dXJuIG5leHQucGxvdChwbG90RGl2LCBpbWFnZUxvYWRlZCwgaW1hZ2VJbmZvLCBzY3JlZW5IZWlnaHQsIHBsb3RUeXBlLCBpblBsYWNlKTtcbiAgfVxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQgeyB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7IH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlbGF5b3V0KHRydWVJbWFnZVNpemUpOyB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlc2V0QXhlcygpOyB9XG4gIGF1dG9zY2FsZSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmF1dG9zY2FsZSgpOyB9XG4gIHpvb21JbigpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnpvb21JbigpOyB9XG4gIHpvb21PdXQoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS56b29tT3V0KCk7IH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpOyB9XG4gIC8vIFNldCBvbiBib3RoIGJhY2tlbmRzIChub3QganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIGNhbGwgdGhpc1xuICAvLyBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciwgd2hlbiBgcmVuZGVyZXIoKWAgaXMgc3RpbGwgdGhlIFBsb3RseSBkZWZhdWx0LCBzb1xuICAvLyBPU0QgbXVzdCByZWNlaXZlIHRoZSBmbGFnIHRvIGhvbm91ciBpdCBhdCB2aWV3ZXIgY3JlYXRpb24uXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub3NkLnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgdGhpcy5wbG90bHkuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvLyBTZXQgb24gYm90aCBiYWNrZW5kcyAoc2VlIHNldE5hdmlnYXRvclZpc2libGUpOiBjb25zdW1lcnMgbWF5IHNldCBpdCBiZWZvcmVcbiAgLy8gdGhlIGZpcnN0IHJlbmRlciwgd2hlbiB0aGUgYWN0aXZlIHJlbmRlcmVyIGlzIHN0aWxsIFBsb3RseS5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9zZC5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgdGhpcy5wbG90bHkuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICB9XG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spOyB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0WkluZGV4KHpJbmRleCk7XG4gIH1cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRUcnVlSW1hZ2VTaXplKCk7IH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Q3VycmVudEltYWdlKCk7IH1cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwgeyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFBpeGVsRGF0YSgpOyB9XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpO1xuICB9XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5kb3dubG9hZEltYWdlKCk7IH1cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0Q29tcG9zaXRlKCk7IH1cblxuICBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7IH1cbiAgcmVzZXRTdXJmYWNlQ2FtZXJhKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkucmVzZXRTdXJmYWNlQ2FtZXJhKCk7IH1cbiAgc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFJlc29sdXRpb25TY2FsZT8uKHNjYWxlKTsgfVxuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRSZXNvbHV0aW9uU2NhbGU/LigpID8/IDE7IH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7IHRoaXMucGxvdGx5LnNldFN0YWNrTG9hZGluZyhiKTsgfVxuICAvLyBDYW5jZWwgaW4tZmxpZ2h0IGxvYWRpbmcgb24gZXZlcnkgYmFja2VuZCDigJQgdGhlIHVzZXIncyBDYW5jZWwgc2hvdWxkbid0IGRlcGVuZCBvbiB3aGljaCBvbmUgaXNcbiAgLy8gYWN0aXZlLiBPbmx5IGJhY2tlbmRzIHRoYXQgc3RyZWFtIGZyYW1lcyAobmFwYXJpLWpzKSBkbyByZWFsIHdvcms7IHRoZSByZXN0IG5vLW9wLiBUaGUgY29uY3JldGVcbiAgLy8gYmFja2VuZCBjbGFzc2VzIGRvbid0IGFsbCBkZWNsYXJlIHRoZSBvcHRpb25hbCBjb250cmFjdCBtZXRob2QsIHNvIGNhbGwgaXQgdmlhIElWaXN1YWxpemVyLlxuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYmFja2VuZCBvZiBbdGhpcy5wbG90bHksIHRoaXMub3NkLCB0aGlzLm5hcGFyaV0gYXMgSVZpc3VhbGl6ZXJbXSkge1xuICAgICAgYmFja2VuZC5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICB9XG4gIH1cbiAgLy8gTG9hZGluZyBzdGF0ZSBpcyBzdXJmYWNlZCBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIGRvaW5nIHRoZSB3b3JrOiBPU0QgYW5kIG5hcGFyaS1qcyAodm9sdW1lXG4gIC8vIGFzc2VtYmx5KSBkcml2ZSB0aGVpciBvd24gc3ViamVjdHMsIHNvIG1lcmdlIGFsbCB0aHJlZSBpbnRvIG9uZSBzdGFibGUgc3RyZWFtIHRoZSBob3N0XG4gIC8vIHN1YnNjcmliZXMgdG8gb25jZS4gKFByZXZpb3VzbHkgaGFyZGNvZGVkIHRvIFBsb3RseSwgc28gbmFwYXJpL09TRCBwcm9ncmVzcyBuZXZlciBzaG93ZWQuKVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnBsb3RseS5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5vc2QuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMubmFwYXJpLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgXSkucGlwZShtYXAoKGZsYWdzKSA9PiBmbGFncy5zb21lKEJvb2xlYW4pKSk7XG4gIH1cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAvLyBSZXBvcnQgdGhlIHByb2dyZXNzIG9mIHdoaWNoZXZlciBiYWNrZW5kIGlzIEFDVElWRUxZIGxvYWRpbmcgKG1heCBhY3Jvc3MgYWN0aXZlIG9uZXMpLiBBIHBsYWluXG4gICAgLy8gbWVyZ2UgbGV0IGFuIGlkbGUgYmFja2VuZCdzIHN0YWxlIHZhbHVlIHdpbiB0aGUgc3RyZWFtIG9uIGEgcmUtbG9hZCDigJQgbGVhdmluZyB0aGUgYmFyIGJlbG93IHRoZVxuICAgIC8vIGFjdGl2ZSBiYWNrZW5kJ3MgcmVhbCBwcm9ncmVzcyAoZS5nLiBzdHVjayB+4oWTIHdoaWxlIHRoZSAlIHJlYWQgMTAwKS4gR2F0aW5nIGJ5IHRoZSBsb2FkaW5nIGZsYWdcbiAgICAvLyBpZ25vcmVzIGlkbGUgYmFja2VuZHMsIHNvIHRoZSBiYXIgdHJhY2tzIHRoZSBvbmUgZG9pbmcgdGhlIHdvcmsgYW5kIHJlYWNoZXMgMTAwJS5cbiAgICBjb25zdCB0cmFjayA9ICh2OiBJVmlzdWFsaXplcik6IE9ic2VydmFibGU8W251bWJlciwgYm9vbGVhbl0+ID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFt2LmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCksIHYuaXNTdGFja0xvYWRpbmcoKV0pO1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0cmFjayh0aGlzLnBsb3RseSksIHRyYWNrKHRoaXMub3NkKSwgdHJhY2sodGhpcy5uYXBhcmkpXSkucGlwZShcbiAgICAgIG1hcCgocGFpcnMpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gcGFpcnMuZmlsdGVyKChbLCBsb2FkaW5nXSkgPT4gbG9hZGluZykubWFwKChbcF0pID0+IHApO1xuICAgICAgICByZXR1cm4gYWN0aXZlLmxlbmd0aCA/IE1hdGgubWF4KC4uLmFjdGl2ZSkgOiAwO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPGFueT4geyByZXR1cm4gdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKTsgfVxuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4geyByZXR1cm4gdGhpcy5wbG90bHkuZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTsgfVxuICAvLyBUaGUgaW50ZW5zaXR5IGluc2V0IGlzIGEgUGxvdGx5IExJTkUgY2hhcnQg4oCUIHJlbmRlciBpdCB0aHJvdWdoIFBsb3RseSwgd2hpY2hcbiAgLy8gb3ducyB0aGUgcHJvZmlsZSBzdHJlYW0gcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTsgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiAqc3RhdGUqIGxpdmVzIGluIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmU7IGJvdGggYmFja2VuZHMgaW1wbGVtZW50XG4gIC8vIElSZWdpb25TdG9yZSBieSBkZWxlZ2F0aW5nIHRvIGl0LiBXZSByb3V0ZSB0aHJvdWdoIHRoZSBhY3RpdmUgcmVuZGVyZXJcbiAgLy8gKG5vdCBoYXJkY29kZWQgUGxvdGx5KSBzbyB0aGUgYmFja2VuZCBvbiBzY3JlZW4gYWxzbyAqcmVuZGVycyogdGhlIGNoYW5nZTpcbiAgLy8gUGxvdGx5IHJlbGF5b3V0cyBpdHMgc2hhcGVzLCBPcGVuU2VhZHJhZ29uJ3Mgb3ZlcmxheSByZWRyYXdzIGZyb20gdGhlIHN0b3JlXG4gIC8vIHVwZGF0ZSBldmVudC4gRWl0aGVyIHdheSB0aGUgc2FtZSBzdG9yZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgc2V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbiwgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgICAgICAgICAgIGZpbGxDb2xvcj86IHN0cmluZywgYXBwZW5kPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRSZWdpb25zKHJlZ2lvbnMsIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgYXBwZW5kKTtcbiAgfVxuICBnZXRSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRSZWdpb25zKCk7IH1cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogYW55W10geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvblBvbHlnb25zKCk7IH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7IH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpOyB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2VsZWN0UmVnaW9uKHJlZ2lvbik7IH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTsgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7IH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U2hvd1NoYXBlTGFiZWwoKTsgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U2hhcGVDb2xvcigpOyB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEZpbGxDb2xvcigpOyB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7IH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTsgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQgeyByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTsgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7IHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCQoKTsgfVxuICBzZXRQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiB2b2lkIHsgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTsgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7IHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTsgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5zdG9yZS5yZW1vdmVDbGFzcyhuYW1lKTsgfVxuICByZXNldFByZXNldHMoKTogdm9pZCB7IHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7IH1cbiAgcGxvdFByZXZpb3VzU2hhcGVzKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkucGxvdFByZXZpb3VzU2hhcGVzKCk7IH1cbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBhbnlbXSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTsgfVxuICBnZXRQcmV2aW91c1NoYXBlcygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0UHJldmlvdXNTaGFwZXMoKTsgfVxuICAvLyBVbmRvIHN0YXRlIGlzIG93bmVkIGJ5IHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgKHNhbWUgaW5zdGFuY2UgZm9yIGJvdGhcbiAgLy8gYmFja2VuZHMpLCBzbyByb3V0aW5nIHRocm91Z2ggdGhlIGFjdGl2ZSByZW5kZXJlciBpcyBzYWZlIGFuZCBzdGFibGUuXG4gIHVuZG8oKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS51bmRvKCk7IH1cbiAgcmVkbygpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlZG8oKTsgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmNhblVuZG8oKTsgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmNhblJlZG8oKTsgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRDYW5VbmRvJCgpOyB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldENhblJlZG8kKCk7IH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnJlc2V0VW5kb0hpc3RvcnkoKTsgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpOyB9XG4gIGV4cG9ydFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmV4cG9ydFJlZ2lvbnMocmVnaW9ucyk7IH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTsgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIChqaXQtdWkjOTMpIOKAlCB0aGUgUmVnaW9uU3RvcmUgaXMgc2hhcmVkIGFjcm9zc1xuICAvLyAgICBiYWNrZW5kcywgc28gcm91dGluZyB0byB0aGUgYWN0aXZlIHJlbmRlcmVyIGhpdHMgdGhlIHNhbWUgc3RvcmUuIOKUgOKUgOKUgOKUgOKUgOKUgFxuICBlbnRlclN0YWNrTW9kZShzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5lbnRlclN0YWNrTW9kZShzbGljZXMsIGluaXRpYWxaLCBzYXZlTGF5b3V0KTtcbiAgfVxuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuZXhpdFN0YWNrTW9kZSgpOyB9XG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmlzU3RhY2tNb2RlKCk7IH1cbiAgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVMYXlvdXQoKTsgfVxuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXREaXNwbGF5U2xpY2Uoeik7IH1cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTbGljZVJlZ2lvbnMoKTsgfVxuICBnZXRTdGFja1NhdmVTbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVTbGljZXMoKTsgfVxuICAvKiogQWxsIHNsaWNlcycgQU5OT1RBVElPTiByZWdpb25zIGZvciBhIHotc3RhY2sgc2F2ZSAoaml0LXVpIzkzKSwgZWFjaCB0YWdnZWRcbiAgICogIHdpdGggaXRzIHplcm8tYmFzZWQgUmVnaW9uLno7IHByb2ZpbGUgbGluZXMgZXhjbHVkZWQuIEZsYXQgYW5ub3RhdGlvbiBzZXRcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVuZGVyZXIoKS5nZXRTdGFja1NhdmVTbGljZXMoKSkge1xuICAgICAgb3V0LnNldCh6LCByZWdzLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEF1dGhvcml0YXRpdmUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHNpemUgZm9yIG1hc2sgZXhwb3J0LiBQcmVmZXJzIHRoZVxuICAgKiAgYWN0aXZlIHJlbmRlcmVyJ3MgcmVwb3J0ZWQgc2l6ZSwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSAoeC95XG4gICAqICBhcmUgdGhlIGZ1bGwtcmVzIHBpeGVsIGRpbWVuc2lvbnMgdXNlZCBhY3Jvc3MgdGhlIGFwcCkuIFJlamVjdHMgbm9uLWZpbml0ZVxuICAgKiAgb3Igbm9uLXBvc2l0aXZlIHNpemVzIOKAlCB0aGUgUGxvdGx5IGJvdW5kcyBjYW4geWllbGQgTmFOIGJlZm9yZSBhIHBsb3QgaXNcbiAgICogIGZ1bGx5IGxhaWQgb3V0LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgY3Jhc2ggbWFzayBjcmVhdGlvbi4gKi9cbiAgZ2V0TWFza0ltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2YWxpZCA9IChzOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgcyAmJiBOdW1iZXIuaXNGaW5pdGUocy53aWR0aCkgJiYgTnVtYmVyLmlzRmluaXRlKHMuaGVpZ2h0KSAmJlxuICAgICAgcy53aWR0aCA+PSAxICYmIHMuaGVpZ2h0ID49IDFcbiAgICAgICAgPyB7IHdpZHRoOiBNYXRoLnJvdW5kKHMud2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQocy5oZWlnaHQpIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZnJvbVJlbmRlcmVyID0gdmFsaWQodGhpcy5nZXRUcnVlSW1hZ2VTaXplKCkpO1xuICAgIGlmIChmcm9tUmVuZGVyZXIpIHJldHVybiBmcm9tUmVuZGVyZXI7XG5cbiAgICBsZXQgbWV0YTogSUltYWdlTWV0YWRhdGFbXSA9IFtdO1xuICAgIHRoaXMuZ2V0SW1hZ2VNZXRhKCkuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKS51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IG0wID0gbWV0YT8uWzBdO1xuICAgIHJldHVybiBtMCA/IHZhbGlkKHsgd2lkdGg6IG0wLngsIGhlaWdodDogbTAueSB9KSA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRvckFwaTogYW5ub3RhdGlvbi1vbmx5IHN1cmZhY2UgZm9yIHRoZSBSZWdpb24gRWRpdG9yIOKUgOKUgOKUgFxuICAvLyBJbnRlbnNpdHktcHJvZmlsZSBsaW5lcyAoa2luZD0ncHJvZmlsZScpIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdFxuICAvLyB0aGUgZWRpdG9yLiBUaGVzZSBtZXRob2RzIGdpdmUgZXh0ZXJuYWwgY29uc3VtZXJzIGFuIGFubm90YXRpb24tb25seSB2aWV3XG4gIC8vIGFuZCBndWFyYW50ZWUgcHJvZmlsZSBsaW5lcyBhcmUgcHJlc2VydmVkLiBSb3V0aW5nIChub3QgdGhlIHN0b3JlKSBvd25zIHRoaXNcbiAgLy8gc28gd3JpdGVzL3NlbGVjdGlvbiBnbyB0aHJvdWdoIHJlbmRlcmVyKCkgYW5kIHRoZSBhY3RpdmUgYmFja2VuZCByZS1yZW5kZXJzXG4gIC8vIChQbG90bHkgcmVsYXlvdXRzIGl0cyBzaGFwZXMgaW4gc2V0UmVnaW9uczsgaXQgZG9lc24ndCBvbiByZWdpb25VcGRhdGUkKS5cblxuICBnZXRBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLCBmaWxsQ29sb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZS1hcHBlbmQgdGhlIHN0b3JlJ3MgcHJvZmlsZSBsaW5lcyBzbyBhbiBlZGl0b3Igc2F2ZS9kZWxldGUgY2FuJ3QgZHJvcFxuICAgIC8vIHRoZW0sIHRoZW4gcm91dGUgdGhyb3VnaCBzZXRSZWdpb25zIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZS1yZW5kZXJzLlxuICAgIGNvbnN0IHByb2ZpbGVzID0gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZW5kZXJlcigpLmdldFJlZ2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIGlkeHNcbiAgICAgICAgICAubWFwKChpKSA9PiByZWdzW2ldKVxuICAgICAgICAgIC5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIgJiYgIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIHNldFNlbGVjdGVkUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlbmRlcmVyKCkuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXMgPSAocmVnaW9ucyB8fCBbXSlcbiAgICAgIC5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSlcbiAgICAgIC5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0b29scyDihpIgYWN0aXZlIHJlbmRlcmVyIChydW4gb24gZWl0aGVyIGJhY2tlbmQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgd2FuZCwgdmVydGV4IGVyYXNlciBhbmQgem9vbS10by1ib3ggYXJlIGltcGxlbWVudGVkIG9uIGJvdGggYmFja2VuZHNcbiAgLy8gdmlhIElDb29yZGluYXRlVHJhbnNmb3JtICgrIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2sgZm9yIHRoZSB3YW5kKSwgc28gdGhleVxuICAvLyBmb2xsb3cgdGhlIGFjdGl2ZSByZW5kZXJlci5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogYW55KTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRXYW5kTW9kZShhY3RpdmUsIG9wdGlvbnMpOyB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0V2FuZE9wdGlvbnMob3B0aW9ucyk7IH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7IH1cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7IH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnMpOyB9XG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSk7IH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzKTsgfVxuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQgeyB0aGlzLnJlbmRlcmVyKCkuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUpOyB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuc2VnbWVudFJlY3RhbmdsZXMoKTsgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7IHJldHVybiB0aGlzLnJlbmRlcmVyKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOyB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLnNldFNhbU1vZGVsKGlkKTsgfVxuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTsgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMucmVuZGVyZXIoKS5jb21taXRTYW1Qb2ludHMoKTsgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmNsZWFyU2FtUG9pbnRzKCk7IH1cblxuICAvLyDilIDilIAgZGlzcGxheSBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBTdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgcmVhZHMgZ28gc3RyYWlnaHQgdG8gaXQuXG4gIC8vIFRoZSB0d28gU0VUVEVSUyBzdGlsbCByb3V0ZSB0aHJvdWdoIFBsb3RseSBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbnNcbiAgLy8gY2FycnkgcmVuZGVyIGdsdWUgYmV5b25kIHRoZSBzdG9yZSB3cml0ZSAoYSBsaXZlIFBsb3RseS5yZXN0eWxlIG9mXG4gIC8vIGNvbG9yc2NhbGUvcmV2ZXJzZXNjYWxlIG9uIHRoZSBtb3VudGVkIGhlYXRtYXApOyBPU0QgcmVjb2xvcnMgdmlhIGl0cyBvd25cbiAgLy8gc3RvcmUgc3Vic2NyaXB0aW9uIGVpdGhlciB3YXkuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7IHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7IH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IGFueSk6IHZvaWQgeyB0aGlzLnBsb3RseS5zZXRDb2xvcm1hcChjb2xvcm1hcCk7IH1cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IGFueSB7IHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpOyB9XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCk7IH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGU6IGFueSk6IHZvaWQgeyB0aGlzLnBsb3RseS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzY2FsZSk7IH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IHZvaWQgeyB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEpOyB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7IH1cblxuICAvLyDilIDilIAgSUNoYW5uZWxIaXN0b2dyYW1BcGk6IENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgc3VyZmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ2hhbm5lbC9ncmF5c2NhbGUvaW52ZXJ0IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlOyBib3RoXG4gIC8vIGJhY2tlbmRzIHN1YnNjcmliZSBhbmQgcmVjb2xvciBsaXZlLCBzbyBzZXR0ZXJzIGp1c3Qgd3JpdGUgdGhlIHN0b3JlLiBUaGVcbiAgLy8gaGlzdG9ncmFtIGNvbWVzIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuIChpdHMgbmF0aXZlIHBpeGVscykuXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgZGF0YSAoMTYtYml0IG11bHRpLWJhbmQgVElGRikgdmlhIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHsgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTsgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpOyB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7IHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4KTsgfVxuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCBwYXJ0aWFsKTtcbiAgfVxuICByZXNldENvbnRyYXN0KGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRnVsbCByZXNldDogd2luZG93ICgwLi4yNTUpLCBnYW1tYSAoMSkgQU5EIHRoZSBjaGFubmVsJ3MgZGVmYXVsdCB0aW50LlxuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB0aGlzLnN0b3JlLnJlc2V0Q2hhbm5lbFN0YXRlKGkpO1xuICB9XG4gIC8qKiBBdXRvLXdpbmRvdyBlYWNoIGNoYW5uZWwgYnkgc2F0dXJhdGluZyBgc2F0dXJhdGlvbmAgKDAuLjEpIG9mIHBpeGVscyBhdCBlYWNoXG4gICAqICBlbmQgb2YgaXRzIGhpc3RvZ3JhbSAoc2tpcHBpbmcgb3V0bGllciBmaXJzdC9sYXN0IGJpbnMpLiAqL1xuICBhdXRvQ29udHJhc3QoaW5kaWNlczogbnVtYmVyW10sIHNhdHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShpLCAyNTYpO1xuICAgICAgaWYgKCFoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbShoLCBzYXR1cmF0aW9uKTtcbiAgICAgIGlmIChtYXggPiBtaW4pIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGksIHsgbWluLCBtYXggfSk7XG4gICAgfVxuICB9XG4gIGdldEdyYXlzY2FsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnN0b3JlLmdldEdyYXlzY2FsZSgpOyB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQgeyB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7IH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCk7IH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7IHRoaXMuc3RvcmUuc2V0SW52ZXJ0KG9uKTsgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIGJhY2tlbmQncyByZWdpb24gb3ZlcmxheS4gRmFsbHMgYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZW5kZXJlcigpO1xuICAgIGlmIChyID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIGlmIChyID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogSXNvc3VyZmFjZSBjb250cm9scyB3aGVuIGF2YWlsYWJsZSDigJQgYWx3YXlzIFBsb3RseSdzLCBzaW5jZSB0aGUgaXNvc3VyZmFjZVxuICAgKiBwbG90IHR5cGUgcmVuZGVycyBvbiBQbG90bHkgKE9TRCBvbmx5IGhhbmRsZXMgdGhlIGltYWdlIHR5cGUpLlxuICAgKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHsgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKTsgfVxuXG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyDigJQgYWx3YXlzIFBsb3RseSdzLCBzaW5jZSB0aGUgM0QgcGxvdCB0eXBlcyByZW5kZXIgb25cbiAgICogIFBsb3RseSAoT1NEIG9ubHkgaGFuZGxlcyB0aGUgaW1hZ2UgdHlwZSkuICovXG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFN1cmZhY2UzZENvbnRyb2xzKCk7IH1cblxuICAvKiogSW50ZW5zaXR5IChsaW5lLVJPSSkgY29udHJvbHMg4oCUIGFsd2F5cyBQbG90bHkncywgc2luY2UgdGhlIGxpbmUgcHJvZmlsZXNcbiAgICogIHJlbmRlciB0aGVpciBpbnNldCBvbiBQbG90bHkgcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIGRyYXdzIHRoZSBpbWFnZS4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7IHJldHVybiB0aGlzLnBsb3RseS5nZXRJbnRlbnNpdHlDb250cm9scygpOyB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLlxuICAgKlxuICAgKiBJbXBsZW1lbnRlZCBIRVJFIHJhdGhlciB0aGFuIG9uIGEgYmFja2VuZCBiZWNhdXNlIHRoZSBzdGF0ZSBpc1xuICAgKiBiYWNrZW5kLW5ldXRyYWw6IHRoZSB2aWV3IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgYFZpc3VhbGl6ZXJTdG9yZWAgKGxpa2VcbiAgICogdGhlIGNvbG9ybWFwKSwgc28gdGhlIGNvbnRyb2xzIGtlZXAgd29ya2luZyBhY3Jvc3MgYSBwbG90LXR5cGUgc3dpdGNoIGFuZCBhXG4gICAqIGhvc3QgY2FuIGRyaXZlIHRoZW0gYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBpZiAoIXBvcnQpIHJldHVybiBudWxsO1xuICAgIC8vIE1pcnJvciB0aGUgZGF0YXNldCAoYW5kIGRyb3AgYSBzdGFsZSBzZWxlY3Rpb24gd2hlbiBpdCBjaGFuZ2VzIOKAlCB0aGUgbWFza3NcbiAgICAvLyBhcmUgaW5kZXgtYmFzZWQsIHNvIHRoZXkgYXJlIG1lYW5pbmdsZXNzIGFnYWluc3QgZGlmZmVyZW50IG9ic2VydmF0aW9ucykuXG4gICAgdGhpcy5zcGF0aWFsRGF0YXNldFN1YiA/Pz0gcG9ydC5nZXREYXRhc2V0JCgpLnN1YnNjcmliZSgoZGF0YXNldCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZCA9IGRhdGFzZXQ/LmlkICE9PSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uaWQ7XG4gICAgICB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldCA9IGRhdGFzZXQ7XG4gICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RvcmUuc2V0KGVtcHR5U2VsZWN0aW9uKGRhdGFzZXQ/Lm9ic2VydmF0aW9ucy5jb3VudCA/PyAwKSk7XG4gICAgICAvLyBBIGNvbG91ciBzb3VyY2UgdGhlIG5ldyBkYXRhc2V0IGNhbm5vdCBzYXRpc2Z5IHdvdWxkIGxlYXZlIHRoZSBtYXAgZmxhdFxuICAgICAgLy8gd2hpbGUgdGhlIHBhbmVsIGFuZCB0aGUgY2hhcnRzIGtlcHQgbmFtaW5nIHRoZSBvbGQgY29sdW1uIOKAlCBzbyBkcm9wIGl0LFxuICAgICAgLy8gYW5kIG9ubHkgaXQ6IHBvaW50IHNpemUsIG9wYWNpdHkgYW5kIHRoZSByZXN0IGFyZSB0aGUgdXNlcidzIHByZWZlcmVuY2VzLFxuICAgICAgLy8gbm90IHRoZSBwcmV2aW91cyBkYXRhc2V0J3Mgc3RhdGUuXG4gICAgICBjb25zdCBieSA9IHRoaXMuc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCkuY29sb3JCeTtcbiAgICAgIGlmIChieSAmJiAhdGhpcy5jYW5Db2xvckJ5KGRhdGFzZXQsIGJ5KSkgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNvbG9yQnk6IG51bGwgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5zcGF0aWFsQ29udHJvbHMgPz89IHtcbiAgICAgIGdldERhdGFzZXQkOiAoKSA9PiBwb3J0LmdldERhdGFzZXQkKCksXG4gICAgICBnZXRWaWV3U3RhdGUkOiAoKSA9PiB0aGlzLnN0b3JlLmdldFNwYXRpYWxWaWV3JCgpLFxuICAgICAgdmlld1N0YXRlOiAoKSA9PiB0aGlzLnN0b3JlLmN1cnJlbnRTcGF0aWFsVmlldygpLFxuICAgICAgc2V0Vmlld1N0YXRlOiAocGFydGlhbCkgPT4gdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyhwYXJ0aWFsKSxcbiAgICAgIC8vIFRoZSBoaW50IFNFRURTIHRoZSB0b2dnbGUgd2hlbiB0aGUgc291cmNlIGNoYW5nZXMsIGFuZCBub3RoaW5nIGNvbnN1bHRzIGl0XG4gICAgICAvLyBhZnRlcndhcmRzLiBJdCB1c2VkIHRvIGJlIE9SZWQgaW4gYXQgcmVuZGVyIHRpbWUsIHdoaWNoIG1lYW50IGFuIHVuY2hlY2tlZFxuICAgICAgLy8gYm94IGNvdWxkIG5vdCB0dXJuIGxvZyBzY2FsaW5nIG9mZiBmb3IgYSBoaW50ZWQgY29sdW1uIOKAlCBhbmQgdGhlIGxpbmtlZFxuICAgICAgLy8gY2hhcnQsIHdoaWNoIHJlYWRzIGBsb2dTY2FsZWAgYWxvbmUsIGRpc2FncmVlZCB3aXRoIHRoZSBtYXAgYWJvdXQgd2hhdCBpdFxuICAgICAgLy8gd2FzIHNob3dpbmcuIE9uZSBhdXRob3JpdHksIHNldCBvbmNlIHBlciBzb3VyY2UuXG4gICAgICBjb2xvckJ5Q29sdW1uOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBjb25zdCBoaW50ID0gbWV0YT8ua2luZCA9PT0gJ2NvbnRpbnVvdXMnID8gISFtZXRhLmxvZ1NjYWxlSGludCA6IGZhbHNlO1xuICAgICAgICB0aGlzLnN0b3JlLnNldFNwYXRpYWxWaWV3KHsgY29sb3JCeTogeyBraW5kOiAnY29sdW1uJywgbmFtZSB9LCBsb2dTY2FsZTogaGludCB9KTtcbiAgICAgIH0sXG4gICAgICBjb2xvckJ5RmVhdHVyZTogKG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7XG4gICAgICAgICAgY29sb3JCeTogeyBraW5kOiAnZmVhdHVyZScsIG5hbWUgfSxcbiAgICAgICAgICBsb2dTY2FsZTogISF0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uZmVhdHVyZXM/LmxvZ1NjYWxlSGludCxcbiAgICAgICAgfSksXG4gICAgICBjbGVhckNvbG9yQnk6ICgpID0+IHRoaXMuc3RvcmUuc2V0U3BhdGlhbFZpZXcoeyBjb2xvckJ5OiBudWxsIH0pLFxuICAgICAgc2VhcmNoRmVhdHVyZXM6IGFzeW5jIChxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKSA9PiB7XG4gICAgICAgIC8vIFByZWZlciB0aGUgcG9ydCdzIHNlYXJjaCAoYSAzMWstZ2VuZSBkYXRhc2V0IGRvZXMgbm90IHNoaXAgaXRzIG5hbWVzKTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbHRlciB3aGF0ZXZlciB0aGUgbWFuaWZlc3QgaW5saW5lZC5cbiAgICAgICAgaWYgKHBvcnQuc2VhcmNoRmVhdHVyZXMpIHJldHVybiBwb3J0LnNlYXJjaEZlYXR1cmVzKHF1ZXJ5LCBsaW1pdCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShwb3J0LmdldERhdGFzZXQkKCkpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IGRhdGFzZXQ/LmZlYXR1cmVzPy5uYW1lcyA/PyBbXTtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgfSxcbiAgICAgIGNhdGVnb3J5Q29sb3JzOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKG5hbWUpO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7bmFtZX1cIiBpcyBjb250aW51b3VzIOKAlCBpdCBoYXMgbm8gY2F0ZWdvcmllc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc29sdmVkIGJ5IHRoZSBTQU1FIGZ1bmN0aW9uIHRoZSByZW5kZXJlciB1c2VzLCBzbyBhIGxlZ2VuZCBzd2F0Y2hcbiAgICAgICAgLy8gY2FuIG5ldmVyIGRpc2FncmVlIHdpdGggdGhlIGNvbG91ciBvbiBzY3JlZW4uXG4gICAgICAgIHJldHVybiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpO1xuICAgICAgfSxcblxuICAgICAgY29udGludW91c1ZhbHVlczogYXN5bmMgKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlLmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuIHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihzb3VyY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbc3BhdGlhbF0gY29sdW1uIFwiJHtzb3VyY2UubmFtZX1cIiBpcyBjYXRlZ29yaWNhbCDigJQgaXQgaGFzIG5vIHZhbHVlcyB0byBjaGFydGAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uLnZhbHVlcztcbiAgICAgIH0sXG5cbiAgICAgIGNhdGVnb3JpY2FsVmlldzogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICAgICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSBjb2x1bW4gXCIke25hbWV9XCIgaXMgY29udGludW91cyDigJQgaXQgaGFzIG5vIGNhdGVnb3JpZXNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcmllczogY29sdW1uLm1ldGEuY2F0ZWdvcmllcyxcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwcmVhZCByYXRoZXIgdGhhbiBhbHdheXMgZGVmaW5lZDogYGdldEVtYmVkZGluZ2AgaXMgb3B0aW9uYWwgb24gYm90aCB0aGUgcG9ydFxuICAgICAgLy8gYW5kIHRoaXMgZmFjYWRlLCBhbmQgYSBwYW5lbCBjaGVja3MgZm9yIGl0cyBwcmVzZW5jZSB0byBkZWNpZGUgd2hldGhlciB0aGUgdmlld1xuICAgICAgLy8gaXMgb2ZmZXJlZCBhdCBhbGwuIERlZmluaW5nIGl0IGFzIGEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHdvdWxkIG1ha2UgYW5cbiAgICAgIC8vIGVtYmVkZGluZy1sZXNzIHNvdXJjZSBsb29rIGxpa2UgYSBicm9rZW4gb25lLlxuICAgICAgLi4uKHBvcnQuZ2V0RW1iZWRkaW5nXG4gICAgICAgID8geyBnZXRFbWJlZGRpbmc6IChuYW1lOiBzdHJpbmcpID0+IHBvcnQuZ2V0RW1iZWRkaW5nIShuYW1lKSB9XG4gICAgICAgIDoge30pLFxuXG4gICAgICBjYXRlZ29yaWNhbENvbHVtbnM6ICgpID0+ICh0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8uY29sdW1ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKVxuICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpLFxuXG4gICAgICAvLyBNZW1vaXplZCBvbiB0aGUgb2JzZXJ2YXRpb25zIG9iamVjdCwgc28gdGhlIHJlbmRlcmVyJ3Mgb3duIGxvb2t1cCBhbmRcbiAgICAgIC8vIHRoaXMgb25lIGFyZSB0aGUgc2FtZSBzaW5nbGUgc2NhbiBvZiB1cCB0byAzLjdNIHogdmFsdWVzLlxuICAgICAgc2FtcGxlZFNlY3Rpb25zOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9icyA9IHRoaXMuY3VycmVudFNwYXRpYWxEYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgICAgIHJldHVybiBvYnMgPyBzZWN0aW9uc09mKG9icykgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0aW9uJDogKCkgPT4gdGhpcy5zZWxlY3Rpb25TdG9yZS5nZXRTZWxlY3Rpb24kKCksXG5cbiAgICAgIHNlbGVjdEZyb21SZWdpb25zOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldDtcbiAgICAgICAgaWYgKCFkYXRhc2V0KSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgICAgICAvLyBUaGUgdW5pb24gb2YgZXZlcnkgZHJhd24gcmVnaW9uIOKAlCBzbyBldmVyeSBST0kgdG9vbCB0aGUgbGlicmFyeVxuICAgICAgICAvLyBhbHJlYWR5IGhhcyBkb3VibGVzIGFzIGEgc3BhdGlhbCBzZWxlY3Rpb24gdG9vbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gdGhlIDNEIGNsb3VkIHRoZXJlIGlzIG5vIGRhdGEtc3BhY2UgYWZmaW5lIHRvIHB1c2ggYSBkcmF3biBzaGFwZVxuICAgICAgICAvLyB0aHJvdWdoLCBzbyB0aGUgb2JzZXJ2YXRpb25zIGFyZSBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGVcbiAgICAgICAgLy8gcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSkgYW5kIHRlc3RlZCBpbiBzY3JlZW4gc3BhY2UgaW5zdGVhZC5cbiAgICAgICAgLy8gRmFsbHMgYmFjayB0byB0aGUgMkQgcGF0aCB3aGVuZXZlciB0aGUgY2xvdWQgaXMgbm90IG1vdW50ZWQuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpXG4gICAgICAgICAgPyB0aGlzLm5hcGFyaS5nZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihkYXRhc2V0Lm9ic2VydmF0aW9ucylcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIC8vIEluIHRoZSAyRCB2aWV3IG9mIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkVcbiAgICAgICAgLy8gc2VjdGlvbiwgaW4gdGhlIHZvbHVtZSdzIHBpeGVsIGdyaWQ6IGl0IHNlbGVjdHMgdGhlIGNlbGxzIG9mIHRoYXRcbiAgICAgICAgLy8gc2VjdGlvbiwgbm90IHRoZSB3aG9sZSBkZXB0aCBvZiBicmFpbiBzdGFuZGluZyBiZWhpbmQgdGhlbS5cbiAgICAgICAgY29uc3Qgdm9sdW1lID0gIWRhdGFzZXQuaW1hZ2VSZWYgPyBkYXRhc2V0LnZvbHVtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gcHJvamVjdGVkXG4gICAgICAgICAgPyBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQocHJvamVjdGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgcmVnaW9ucylcbiAgICAgICAgICA6IHNlbGVjdEluUmVnaW9ucyhcbiAgICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICAgIHZvbHVtZSA/IHZvbHVtZUltYWdlUmVmKHZvbHVtZSwgZGF0YXNldC5taWNyb25zUGVyVW5pdCkgOiBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICAgICAgICByZWdpb25zLFxuICAgICAgICAgICAgICB2b2x1bWVcbiAgICAgICAgICAgICAgICA/IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgdGhpcy5jdXJyZW50WkluZGV4KVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdG9yZS5zZXQoc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5jb3VudDtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdENhdGVnb3J5OiBhc3luYyAoY29sdW1uOiBzdHJpbmcsIGNhdGVnb3J5SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4obG9hZGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIGNvbnRpbnVvdXMg4oCUIGl0IGhhcyBubyBjYXRlZ29yaWVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0QnlDYXRlZ29yeShsb2FkZWQuY29kZXMsIGNhdGVnb3J5SW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblN0b3JlLnNldChzZWxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SW5kaWNlczogKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmN1cnJlbnRTcGF0aWFsRGF0YXNldD8ub2JzZXJ2YXRpb25zLmNvdW50ID8/IDA7XG4gICAgICAgIGlmIChjb3VudCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzLCBjb3VudCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RvcmUuc2V0KHNlbGVjdGlvbik7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uY291bnQ7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbjogKCkgPT4gdGhpcy5zZWxlY3Rpb25TdG9yZS5jbGVhcigpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbENvbnRyb2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYGRhdGFzZXRgIGNhbiBhbnN3ZXIgdGhpcyBjb2xvdXIgc291cmNlLlxuICAgKlxuICAgKiBBIGNvbHVtbiBpcyBjaGVja2FibGUgYWdhaW5zdCB0aGUgZGVjbGFyZWQgbGlzdC4gQSBnZW5lIGlzIGNoZWNrYWJsZSBvbmx5IHdoZW5cbiAgICogdGhlIGRhdGFzZXQgaW5saW5lcyBpdHMgZmVhdHVyZSBuYW1lcyDigJQgYSBkYXRhc2V0IHRvbyB3aWRlIHRvIGlubGluZSB0aGVtXG4gICAqICh0eXBlYWhlYWQtb25seSkga2VlcHMgdGhlIHNvdXJjZSwgYW5kIGEgbmFtZSB0aGF0IHR1cm5zIG91dCBub3QgdG8gZXhpc3RcbiAgICogc3VyZmFjZXMgYXMgdGhlIGNoYXJ0J3MgXCJjb3VsZCBub3QgYmUgY2hhcnRlZFwiIHJhdGhlciB0aGFuIGFzIGEgc2lsZW50IHJlc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBjYW5Db2xvckJ5KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgYnk6IFNwYXRpYWxDb2xvckJ5KTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhc2V0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGJ5LmtpbmQgPT09ICdjb2x1bW4nKSByZXR1cm4gZGF0YXNldC5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk7XG4gICAgY29uc3QgbmFtZXMgPSBkYXRhc2V0LmZlYXR1cmVzPy5uYW1lcztcbiAgICByZXR1cm4gISFkYXRhc2V0LmZlYXR1cmVzICYmICghbmFtZXMgfHwgbmFtZXMuaW5jbHVkZXMoYnkubmFtZSkpO1xuICB9XG5cbiAgLyoqIE1lbW9pc2VkIHNvIGNvbnN1bWVycyBjYW4gaG9sZCB0aGUgb2JqZWN0IGFjcm9zcyBjYWxscy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsQ29udHJvbHM6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBkYXRhc2V0LCBtaXJyb3JlZCBzbyBgc2VsZWN0RnJvbVJlZ2lvbnMoKWAgY2FuIGFuc3dlciBzeW5jaHJvbm91c2x5XG4gICAqICDigJQgaXQgcnVucyBmcm9tIGEgYnV0dG9uIGNsaWNrIGFuZCBtdXN0IG5vdCBhd2FpdCBhIHJvdW5kLXRyaXAuICovXG4gIHByaXZhdGUgY3VycmVudFNwYXRpYWxEYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcbiAgcHJpdmF0ZSBzcGF0aWFsRGF0YXNldFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIExvYWQgcGl4ZWwgZnJhbWVzIGZvciBpbnRlbnNpdHkgc2FtcGxpbmcgd2hlbiBPcGVuU2VhZHJhZ29uIG93bnMgdGhlIGltYWdlXG4gICAqICAoaXQgZG9lc24ndCBmZWVkIFBsb3RseSdzIGZyYW1lIGNhY2hlKS4gTm8tb3AgbmVlZGVkIHdoZW4gUGxvdGx5IHJlbmRlcnMuICovXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUtcmVnaW9uIGNoYW5nZXMgZnJvbSB0aGUgT3BlblNlYWRyYWdvbiB2aWV3ZXIgKGltYWdlLXBpeGVsIGNvb3JkcyksXG4gICAqICBzbyB0aGUgaW50ZW5zaXR5IGluc2V0IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC4gUGxvdGx5J3Mgb3duXG4gICAqICBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSwgc28gb25seSBPU0QgZmVlZHMgdGhpcy4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLm9zZC5nZXRWaWV3cG9ydENoYW5nZSQoKTtcbiAgfVxuXG4gIC8qKiBSZS1zYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyBmcm9tIGEgZnJlc2ggY3JvcCBvZiB0aGUgZ2l2ZW4gaW1hZ2UtcGl4ZWxcbiAgICogIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24gKHNhbXBsaW5nIGFsd2F5cyBsaXZlcyBpbiBQbG90bHkpLiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9zZC51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=