@esfaenza/httpservice 15.2.13 → 15.2.14

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.
@@ -1,5 +1,5 @@
1
1
  // Angular
2
- import { HttpErrorResponse, HttpEventType, HttpHeaders } from "@angular/common/http";
2
+ import { HttpErrorResponse, HttpEventType, HttpHeaders, HttpParams } from "@angular/common/http";
3
3
  import { Injectable, Inject, Optional } from "@angular/core";
4
4
  // Direttive, Componenti, Librerie
5
5
  import { catchError, concatMap, delay, finalize, first, map, scan } from "rxjs/operators";
@@ -23,7 +23,7 @@ export class HTTPService {
23
23
  /**
24
24
  * @ignore
25
25
  */
26
- constructor(EXTENSION_CLASS, HTTP_INVALIDATION, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE, bc, http, localStorage, utisExts) {
26
+ constructor(EXTENSION_CLASS, HTTP_INVALIDATION, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, HTTP_DEBUG_MODE, bc, http, localStorage, hash, utisExts) {
27
27
  this.EXTENSION_CLASS = EXTENSION_CLASS;
28
28
  this.HTTP_INVALIDATION = HTTP_INVALIDATION;
29
29
  this.APP_NAME = APP_NAME;
@@ -33,6 +33,7 @@ export class HTTPService {
33
33
  this.bc = bc;
34
34
  this.http = http;
35
35
  this.localStorage = localStorage;
36
+ this.hash = hash;
36
37
  this.utisExts = utisExts;
37
38
  /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
38
39
  this.callStatus = {};
@@ -50,6 +51,12 @@ export class HTTPService {
50
51
  this.PersistUntimedCacheASAP = false;
51
52
  /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
52
53
  this.LastThreeCompletedCalls = [];
54
+ /*****************************************************************************************************************************************
55
+ ***************************************************** TRANSACTION HELPERS ***************************************************************
56
+ *****************************************************************************************************************************************/
57
+ this.GET_Trans_BeginTrans = "/api/Trans/BeginTrans";
58
+ this.GET_Trans_CheckExecution = "/api/Trans/CheckExecution";
59
+ this.GET_Trans_EndTrans = "/api/Trans/EndTrans";
53
60
  this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
54
61
  this.localStorageHttpCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpCache";
55
62
  this.localStorageHttpTimedCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpTimedCache";
@@ -755,8 +762,41 @@ export class HTTPService {
755
762
  // Togliamo velocemente ste localizzazioni inutili....
756
763
  return message;
757
764
  }
765
+ /**
766
+ * Helper per lanciare la selezione di tutto quello che è relativo a un api di ricerca con AppSearch (di cui non utilizzo il tipo vero per ridurre le dipendenze)
767
+ */
768
+ getAll(view, api, pars, transaction) {
769
+ if (!view.selection.all)
770
+ return of(view.selection.items);
771
+ var jsonView = this.utisExts.deepClone(view);
772
+ jsonView.page = 1;
773
+ jsonView.itemsperpageoverride = 999999;
774
+ return this.post(api, jsonView, pars, transaction).pipe(map(res => {
775
+ let items = res.items;
776
+ items.forEach(t => t.hash = this.hash.hashObject(t, null, false));
777
+ if (res.selection.exclusions?.length > 0)
778
+ items = items.filter((t) => !res.selection.exclusions.find((e) => this.hash.hashObject(e, null, false) == t.hash));
779
+ return items;
780
+ }));
781
+ }
782
+ beginTransaction(executionKey, secondsTimeout) {
783
+ this.log("beginTransaction call received: " + executionKey);
784
+ var pars = new HttpParams().set("executionKey", executionKey);
785
+ if (secondsTimeout)
786
+ pars = pars.set("secondsTimeout", secondsTimeout.toString());
787
+ return this.get(this.GET_Trans_BeginTrans, pars);
788
+ }
789
+ checkTransaction(executionKey) {
790
+ this.log("checkTransaction call received: " + executionKey);
791
+ return this.get(this.GET_Trans_CheckExecution, new HttpParams().set("executionKey", executionKey));
792
+ }
793
+ endTransaction(transactionKey, transactionResult) {
794
+ this.log("endTransaction call received: " + transactionKey + " Commit: " + transactionResult);
795
+ let pars = new HttpParams().set("idtrans", transactionKey).set("success", transactionResult.toString());
796
+ return this.get(this.GET_Trans_EndTrans, pars);
797
+ }
758
798
  }
759
- HTTPService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HTTPService, deps: [{ token: i1.HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: APP_NAME }, { token: CLIENT_CACHE_DURATION_S }, { token: CACHE_BY_USER }, { token: HTTP_DEBUG_MODE }, { token: i2.BaseLocalization }, { token: i3.HttpClient }, { token: i4.CacheService }, { token: i5.UtilityService }], target: i0.ɵɵFactoryTarget.Injectable });
799
+ HTTPService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HTTPService, deps: [{ token: i1.HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: APP_NAME }, { token: CLIENT_CACHE_DURATION_S }, { token: CACHE_BY_USER }, { token: HTTP_DEBUG_MODE }, { token: i2.BaseLocalization }, { token: i3.HttpClient }, { token: i4.CacheService }, { token: i5.HashingService }, { token: i5.UtilityService }], target: i0.ɵɵFactoryTarget.Injectable });
760
800
  HTTPService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HTTPService, providedIn: 'root' });
761
801
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HTTPService, decorators: [{
762
802
  type: Injectable,
@@ -778,5 +818,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
778
818
  }] }, { type: undefined, decorators: [{
779
819
  type: Inject,
780
820
  args: [HTTP_DEBUG_MODE]
781
- }] }, { type: i2.BaseLocalization }, { type: i3.HttpClient }, { type: i4.CacheService }, { type: i5.UtilityService }]; } });
782
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQStDLE1BQU0sc0JBQXNCLENBQUM7QUFDekosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzdELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEUsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoSCxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBUWpEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBMkJ0Qjs7T0FFRztJQUNILFlBQ1UsZUFBc0MsRUFDQyxpQkFBaUIsRUFDdEMsUUFBUSxFQUNPLHVCQUF1QixFQUNqQyxhQUFzQixFQUNwQixlQUF3QixFQUNqRCxFQUFvQixFQUNwQixJQUFnQixFQUNoQixZQUEwQixFQUMxQixRQUF3QjtRQVR4QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDQyxz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QUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUN4RSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxHQUFHLENBQUMsT0FBZTtRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEdBQUcsQ0FBQyxPQUFlO1FBQ3pCLHNEQUFzRDtRQUN0RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzt3R0ExM0JVLFdBQVcsdURBZ0NBLGlCQUFpQiw2QkFDN0IsUUFBUSxhQUNSLHVCQUF1QixhQUN2QixhQUFhLGFBQ2IsZUFBZTs0R0FwQ2QsV0FBVyxjQURDLE1BQU07MkZBQ2xCLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOzswQkFpQzNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDcEMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBQzlCLE1BQU07MkJBQUMsYUFBYTs7MEJBQ3BCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBQcm9ncmVzc0V2ZW50LCBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFcyBGYWVuemFcclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9wcmVmZXJlbmNlc1wiO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzY2FuIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLyBDaGlhbWF0ZSBhaSBSZXBvc2l0b3J5IC8gdG9rZW5zXHJcbmltcG9ydCB7IEhUVFBfSU5WQUxJREFUSU9OLCBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUywgQVBQX05BTUUsIENBQ0hFX0JZX1VTRVIsIEhUVFBfREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBDYWNoZUluZm9zIH0gZnJvbSBcIi4vbW9kZWxzL0NhY2hlSW5mb3NcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBIVFRQU2VydmljZSB7XHJcblxyXG4gIC8qKiBDYWNoZSBkZWxsbyBzdGF0byBkZWxsZSBjaGlhbWF0ZSBIVFRQIGF0dHVhbG1lbnRlIGVmZmV0dHVhdGUuIE9nbmkgY2hpYW1hdGEgw6ggcmFwcHJlc2VudGF0YSBkYSB1biBHVUlEIGUgbG8gc3RhdHVzIGFzc3VtZSB2YWxvcmUgKipmYWxzZSoqIHNvbG8gc3VnbGkgZXJyb3JpICovXHJcbiAgcHJpdmF0ZSBjYWxsU3RhdHVzOiB7IFtpZDogc3RyaW5nXTogeyB1cmw6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiB9IH0gPSB7fTtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnkgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5LCBzb2xvIHBlciBsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGVmaW5pdG8gZGkgY2FjaGluZyAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgPSBudWxsO1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbG8gc2NhZGVyZSBkZWxsYSBjYWNoZSBzdGVzc2EgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSA9IG51bGw7XHJcbiAgLyoqIElkZW50aXTDoCBjb2xsZWdhdGEgYWwgdG9rZW4gZGkgYXV0ZW50aWNhemlvbmUgZGEgdXNhcmUsIHJpY2hpZXN0YSBhbCBwcm9ncmFtbWEgY2hlIHV0aWxpenphIGxhIGxpYnJlcmlhIGF0dHJhdmVyc28gbCdob29rICoqcmV0cmlldmVJZGVudGl0eSoqIGRlbGxhICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogKi9cclxuICBwcml2YXRlIG1lOiB7IElkdGVuYW50OiBzdHJpbmcsIElkVXNlcjogc3RyaW5nIH0gPSBudWxsO1xyXG4gIC8qKiBJbmRpY2EgY2hlIGxhIGNhY2hlIGEgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgc2VuemEgbGltaXRpIGRpIHRlbXBvIGRldidlc3NlcmUgcGVyc2lzdGl0YSBpbCBwcmltYSBwb3NzaWJpbGUgKi9cclxuICBwcml2YXRlIFBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudGF6aW9uZSBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZSBwZXIgY29sbGVnYXJlIGkgY29tcG9ydGFtZW50aSBkZWxsYSBsaWJyZXJpYSBhbGwnYXBwbGljYXppb25lIGluIGN1aSDDqCB1c2F0YS4gXHJcbiAgICogXHJcbiAgICogU2Ugw6ggc3RhdG8gZWZmZXR0dWF0byBpbCBwcm92aWRlIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIHZlcnLDoCB1c2F0byBxdWVsIHByb3ZpZGVyLCBhbHRyaW1lbnRpIHZlcnLDoCBjcmVhdGEgdW5hIG51b3ZhIGlzdGFuemEgZGkgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgRXh0ZW5zaW9uc0ltcGw6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucztcclxuXHJcbiAgLyoqIExpc3RhIGRlbGxlIHVsdGltZSAzIGNoaWFtYXRlIGNvbXBsZXRhdGUgY29uIHN1Y2Nlc3NvIGluIG9yZGluZSBkaSBjb21wbGV0YW1lbnRvIChpbiBwb3NpemlvbmUgMCBjJ8OoIGwndWx0aW1hIGNvbXBsZXRhdGEgZWNjZXRlcmEuLi4pICovXHJcbiAgcHVibGljIExhc3RUaHJlZUNvbXBsZXRlZENhbGxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIEVYVEVOU0lPTl9DTEFTUzogSHR0cFNlcnZpY2VFeHRlbnNpb25zLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0lOVkFMSURBVElPTikgcHJpdmF0ZSBIVFRQX0lOVkFMSURBVElPTixcclxuICAgIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBASW5qZWN0KEhUVFBfREVCVUdfTU9ERSkgcHJpdmF0ZSBIVFRQX0RFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGJjOiBCYXNlTG9jYWxpemF0aW9uLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgdXRpc0V4dHM6IFV0aWxpdHlTZXJ2aWNlXHJcbiAgKSB7XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbCA9IHRoaXMuRVhURU5TSU9OX0NMQVNTIHx8IG5ldyBIdHRwU2VydmljZUV4dGVuc2lvbnMoKTtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gKHRoaXMuQVBQX05BTUUpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cENhY2hlXCI7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5ID0gKHRoaXMuQVBQX05BTUUpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIHZlZG8gY2hlIGNpIHNvbm8gZWxlbWVudGkgc2FsdmF0aSBuZWwgbG9jYWxTdG9yYWdlIHByb3ZvIGEgdG9nbGllcmxpIGUgYSByaXNhbHZhcmxpIHZpYSBwcmVmZXJlbmNlLlxyXG4gICAqIE5lbCBjYXNvIG1pZ2xpb3JlIGxpIHNwb3N0byBkYWwgbG9jYWxTdG9yYWdlIGFsIERCIGRpIHByZWZlcmVuY2UsIG5lbCBjYXNvIHBlZ2dpb3JlIGxpIHRvbGdvIGUgbGkgcmlzYWx2byBuZWwgbG9jYWxTdG9yYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGp1c3RPbGRTdG9yYWdlU3lzdGVtKCkge1xyXG4gICAgdmFyIGxzVGltZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5KTtcclxuICAgIHZhciBsc1VudGltZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBpZiAoIWxzVGltZWQgJiYgIWxzVW50aW1lZClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkpO1xyXG4gICAgbHNUaW1lZCA9IGxzVGltZWQgPyBKU09OLnBhcnNlKGxzVGltZWQpIDoge307XHJcbiAgICBsc1VudGltZWQgPSBsc1VudGltZWQgPyBKU09OLnBhcnNlKGxzVW50aW1lZCkgOiB7fTtcclxuXHJcbiAgICBhd2FpdCBmb3JrSm9pbihbXHJcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwgbHNUaW1lZCksXHJcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIGxzVW50aW1lZClcclxuICAgIF0pLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ29udmVydGVkIG9sZCBzdG9yYWdlIHN5c3RlbSB0byBuZXcgb25lXCIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBIVFRQIGNvbiBldmVudHVhbG1lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIGNhY2hlIHF1YWxvcmEgbGEgY2hpYW1hdGEgdGVybWluaSBjb24gbGEgY29udmVuemlvbmUgXCIjY2FjaGVcIlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgQ2FsbGJhY2sgY2hpYW1hdG8gaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIGdldDxUPih1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlLCBlcnJvckNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNhY2hlZEluZm9zID0gdGhpcy50cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmwsIHBhcmFtcyk7XHJcbiAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mPFQ+KGNhY2hlZEluZm9zLmNhY2hlSXRlbSkucGlwZShkZWxheSgwKSwgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLmdldDxUPihjYWNoZWRJbmZvcy5maW5hbFVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZSh0aGlzLnV0aXNFeHRzLmRlZXBDbG9uZShyZXNwb25zZUl0ZW0pLCBjYWNoZWRJbmZvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlSXRlbTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQsIGNhY2hlZEluZm9zKTsgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBIVFRQIGNvbiBldmVudHVhbG1lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIGNhY2hlIHF1YWxvcmEgbGEgY2hpYW1hdGEgdGVybWluaSBjb24gbGEgY29udmVuemlvbmUgXCIjY2FjaGVcIlxyXG4gICAqIFxyXG4gICAqIENhc28gc3BlY2lmaWNvIGRpIGNoaWFtYXRhIGNoZSBkZXZlIHJlc3RpdHVpcmUgdW4gQmxvYiBvIHVuIEFycmF5QnVmZmVyIG5hdGl2byBkYSBlbGFib3JhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7XCJhcnJheWJ1ZmZlclwifCBcImJsb2JcIn0gdHlwZSBUaXBvIGRpIHJpdG9ybm8gcmljaGllc3RvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgQ2FsbGJhY2sgY2hpYW1hdG8gaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UmF3KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0eXBlOiBcImFycmF5YnVmZmVyXCIgfCBcImJsb2JcIiA9IFwiYXJyYXlidWZmZXJcIiwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlLCBlcnJvckNhbGxiYWNrID0gbnVsbCk6IE9ic2VydmFibGU8QmxvYiB8IEFycmF5QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgICAgICByZXR1cm4gb2Y8YW55PihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLmdldChjYWNoZWRJbmZvcy5maW5hbFVybCwgeyByZXNwb25zZVR5cGU6IDxhbnk+dHlwZSwgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgbWFwKChibG9iOiBCbG9iIHwgQXJyYXlCdWZmZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZShibG9iLCBjYWNoZWRJbmZvcyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZWQgcmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGJsb2I7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxCbG9iPiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkLCBjYWNoZWRJbmZvcyk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICogXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIERFTEVURSBIVFRQXHJcbiAgKlxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIGRlbGV0ZTxUPih1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLmRlbGV0ZTxUPih1cmwsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUFVUIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7YW55fSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgICogXHJcbiAgICogQ2FzaXN0aWNhIHBhcnRpY29sYXJlIGluIGN1aSBiaXNvZ25hIGFuY2hlIGludmlhcmUgZGVpIEZpbGVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7YW55fSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtGaWxlW10gfCBGaWxlfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBmaWxlIG8gbGlzdGEgZGkgZmlsZSBkYSBpbnZpYXJlLiBJbCB0aXBvICoqRmlsZSoqIMOoIHF1ZWxsbyBuYXRpdm8gZGVsIEphdmFzY3JpcHRcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3R3aXRoRmlsZXM8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIGZpbGVBcnJheU9yRmlsZTogRmlsZVtdIHwgRmlsZSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBmb3JtRGF0YSA9IHRoaXMuZ2V0RmlsZXNGb3JtRGF0YShmaWxlQXJyYXlPckZpbGUpO1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImJvZHlcIiwgSlNPTi5zdHJpbmdpZnkoYm9keURhdGEpKTtcclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBmb3JtRGF0YSwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIG51bGwsIHRydWUsIG51bGwsIG51bGwpIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7IHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7IH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgICogXHJcbiAgICogQ2FzaXN0aWNhIHBhcnRpY29sYXJlIGluIGN1aSB2aWVuZSByZXN0aXR1aXRvIHVuIGZpbGUgZ2VzdGl0byBjb21lIE9iamVjdFVSTCBpbCBjdWkgVVJMIHNpIHB1w7IgZ2VzdGlyZSBkYWwgcGFyYW1ldHJvIGRpIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKiouIFxyXG4gICAqIExhIGNoaWFtYXRhIG5vbiBoYSB1biB0aXBvIHJlc3RpdHVpdG8gaW4gcXVhbnRvIGlsIHJpc3VsdGF0byBkZXYnZXNzZXJlIGdlc3RpdG8gYXR0cmF2ZXJzbyBsYSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0t9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgTm9tZSBkZWwgZmlsZSBjaGUgc2kgc3RhIHJpY2hpZWRlbmRvLCByaW1hbmUgbGF0byBGcm9udGVuZCBlIHNlcnZlIHBlciBhc3NlZ25hcmUgYXJiaXRyYXJpYW1lbnRlIHVuIG5vbWUgYWwgZmlsZSByZXN0aXR1aXRvLCBzZSB2dW90byB2aWVuZSB1dGlsaXp6YXRhIGxhIENvbnRlbnQtRGlzcG9zaXRpb24gZGVsbGEgcmlzcG9zdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXJHZXRGaWxlIENhbGxiYWNrIGRhIGNoaWFtYXJlIGRvcG8gYXZlciBnZXN0aXRvIGxhIHJpc3Bvc3RhIGRlbCAqKmdldEZpbGVDYWxsYmFjayoqLCBpbiBjYXNvICoqaGFuZGxlRXJyb3IqKiBmb3NzZSAqKmZhbHNlKiogdmVycsOgIHJpY2hpYW1hdG8gYW5jaGUgaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBkaSBkZWZhdWx0IGdsaSBlcnJvcmkgZGV2b25vIGVzc2VyZSBnZXN0aXRpIGRhbGxhIGxpYnJlcmlhIG8gc2UgZGV2b25vIGVzc2VyZSBpZ25vcmF0aVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBwb3N0R2V0RmlsZTxLPih1cmw6IHN0cmluZywgYm9keURhdGE6IEssIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlLCBwYXJzPzogSHR0cFBhcmFtcykge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG4gICAgbGV0IGxvY2FsZSA9IGF3YWl0IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5RGF0YSwgeyBwYXJhbXM6IHBhcnMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhsb2NhbGUpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0RmlsZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuICAgIGxldCBsb2NhbGUgPSBhd2FpdCB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQodXJsLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobG9jYWxlKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgbmF0aXZvIGRpIHVuIGZpbGUuIEludGVybmFtZW50ZSB1dGlsaXp6YSBpbCBwYXR0ZXJuICoqd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi4uLlwiKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlTmF0aXZlKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsKTogdm9pZCB7XHJcblxyXG4gICAgLy8gRW5jb2RvIHR1dHRpIGkgcGFyYW1ldHJpIHBlciBldml0YXJlIGNhc2kgcGFydGljb2xhcmlcclxuICAgIC8vIHZhciBlbmNvZGVkUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIC8vIGxldCBwYXJLZXlzID0gcGFyYW1zLmtleXMoKTtcclxuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyS2V5cy5sZW5ndGg7IGkrKylcclxuICAgIC8vICAgZW5jb2RlZFBhcmFtcyA9IGVuY29kZWRQYXJhbXMuc2V0KHBhcktleXNbaV0sIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZ2V0KHBhcktleXNbaV0pKSk7XHJcblxyXG4gICAgbGV0IGZpbmFsVXJsID0gdXJsICsgKHBhcmFtcyA/IFwiP1wiICsgcGFyYW1zLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwrL2csICclMmInKSA6IFwiXCIpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBmaW5hbFVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBkaSB1biBmaWxlIGNoZSBlbWV0dGUgaSB2YXJpIGV2ZW50aSBkaSBwcm9ncmVzc28gZGkgZG93bmxvYWQuXHJcbiAgICogVXRpbGl6emFybGEgcGVyIG92ZXJyaWRhcmUgbGEgZGlhbG9nIG5hdGl2YSBkaSBwcm9ncmVzcyBkZWwgYnJvd3NlciBlIHNvc3RpdHVpcmxhIGNvbiBxdWFsY29zYSB0aXBvIHF1ZWxsbyBjaGUgZmEgTUVHQS5cclxuICAgKiBcclxuICAgKiBJbiBjYXNvIHNpIHZvZ2xpYSBvdHRlbmVyZSBpbCByaXN1bHRhdG8gbmF0aXZvIGRlbCBicm93c2VyIGRlbCBkb3dubG9hZCB1dGlsaXp6YXJlICoqZ2V0RmlsZU5hdGl2ZSh1cmwsIHBhcnMpKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxEb3dubG9hZD59IE9ic2VydmFibGUgZGVpIHZhcmkgc3RlcCBkaSBwcm9ncmVzc28gZGVsIGRvd25sb2FkXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpbGVXaXRoUHJvZ3Jlc3ModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnkpOiBPYnNlcnZhYmxlPERvd25sb2FkPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdldmVudHMnLCByZXBvcnRQcm9ncmVzczogdHJ1ZSB9KVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIHNjYW4oKHByZXZpb3VzOiBEb3dubG9hZCwgZXZlbnQ6IEh0dHBFdmVudDxCbG9iPik6IERvd25sb2FkID0+IHtcclxuICAgIFxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBldmVudC50b3RhbCA/IChldmVudC5sb2FkZWQgPiBldmVudC50b3RhbCA/IDEwMCA6IE1hdGgucm91bmQoKDEwMCAqIGV2ZW50LmxvYWRlZCkgLyBldmVudC50b3RhbCkpIDogcHJldmlvdXMucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogcHJvZ3Jlc3MsIHN0YXRlOiAnSU5fUFJPR1JFU1MnLCBjb250ZW50OiBudWxsIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0h0dHBSZXNwb25zZShldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjZGlzcCA9IGV2ZW50LmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjZGlzcEZpbGVuYW1lID0gY2Rpc3Auc3BsaXQoJzsnKVsxXS5zcGxpdCgnZmlsZW5hbWUnKVsxXS5zcGxpdCgnPScpWzFdLnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuICAgICAgICAgICAgICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBjZGlzcEZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiAxMDAsIHN0YXRlOiAnRE9ORScsIGNvbnRlbnQ6IGV2ZW50LmJvZHkgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICAgICAgfSwgeyBzdGF0ZTogJ1BFTkRJTkcnLCBwcm9ncmVzczogMCwgY29udGVudDogbnVsbCB9KSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBfKTogT2JzZXJ2YWJsZTxEb3dubG9hZD4gPT4geyByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCkgfSksXHJcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBSZXNwb25zZSoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgIHByaXZhdGUgaXNIdHRwUmVzcG9uc2U8VD4oZXZlbnQ6IEh0dHBFdmVudDxUPik6IGV2ZW50IGlzIEh0dHBSZXNwb25zZTxUPiB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFByb2dyZXNzRXZlbnQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwUHJvZ3Jlc3NFdmVudChldmVudDogSHR0cEV2ZW50PHVua25vd24+KTogZXZlbnQgaXMgSHR0cFByb2dyZXNzRXZlbnQge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuRG93bmxvYWRQcm9ncmVzcyB8fCBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aW9uZSBkZWxsJ2luaXppbyBkaSB1bmEgY2hpYW1hdGEgYWQgdW4gY2VydG8gVVJMLCB2aWVuZSBnZW5lcmF0byB1biBHVUlEIGRhIGFzc2VnbmFyY2ksIGNvbnRyb2xsYXRhIGxhIHNjYWRlbnphIGRlbGxhIGNhY2hlLCBcclxuICAgKiBlIGV2ZW50dWFsbWVudGUgbG9nZ2F0byBpbCBmYXR0byBjaGUgc3RhIHBlciBlc3NlcmUgZWZmZXR0dWF0YSB1bmEgY2hpYW1hdGEgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVXJsIGEgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHVUlEIGFzc2VnbmF0byBhbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWZhdWx0U3RhcnRDYWxsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmdldEdVSUQoKTtcclxuICAgIHRoaXMuY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmwpO1xyXG4gICAgdGhpcy5jYWxsU3RhdHVzW215R3VpZF0gPSB7IHVybDogdXJsLCBzdWNjZXNzOiB0cnVlIH07XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlN0YXJ0aW5nIGNhbGxcIikgKyBcIiBcIiArIG15R3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJhdCBVUkxcIikgKyBcIjogXCIgKyB1cmwpO1xyXG4gICAgcmV0dXJuIG15R3VpZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gdXJsIHZlbmdvbm8gY29udHJvbGxhdGUgbGUgaW5mb3JtYXppb25pIHN1IHR1dHRpIGdsaSB1cmwgZGEgaW52YWxpZGFyZSBjb2xsZWdhdGkgYWxsJ3VybCBjaGlhbWF0byBlLCBzZSBwcmVzZW50aSBpbiBjYWNoZSwgaW52YWxpZGF0aVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHBlciBjdWkgY29udHJvbGxhcmUgc2UgY2kgc29ubyBjaGlhbWF0ZSBpbiBjYWNoZSBkYSBpbnZhbGlkYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0NhY2hlSW52YWxpZGF0aW9uKHVybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgY2FjaGUgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW08YW55Pih0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgIGxldCBjYWNoZVRpbWUgPSB0bXAgPyB0bXBbMl0gOiBudWxsO1xyXG4gICAgbGV0IG5vcm1hbGl6ZWRVcmxfdG1wID0gIHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICBsZXQgbm9ybWFsaXplZFVybCA9IG5vcm1hbGl6ZWRVcmxfdG1wLnN1YnN0cmluZyhub3JtYWxpemVkVXJsX3RtcC5pbmRleE9mKCcvYXBpJykpXHJcblxyXG4gICAgaWYgKCFjYWNoZSB8fCAhdGhpcy5IVFRQX0lOVkFMSURBVElPTiB8fCAhdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBhcGlzVG9JbnZhbGlkYXRlOiBzdHJpbmdbXSA9IHRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF07XHJcbiAgICBpZiAoIWFwaXNUb0ludmFsaWRhdGUgfHwgYXBpc1RvSW52YWxpZGF0ZS5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBrZXlzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcbiAgICBhcGlzVG9JbnZhbGlkYXRlLmZvckVhY2goYXBpID0+IHtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gdGhpcy5tYWtlQ2FjaGVLZXkoYXBpLCBudWxsKTtcclxuICAgICAgZm9yIChsZXQgaXRlbSBpbiBjYWNoZSlcclxuICAgICAgICBpZiAoaXRlbS5pbmRleE9mKGNhY2hlS2V5KSAhPSAtMSlcclxuICAgICAgICAgIGtleXNUb1JlbW92ZS5wdXNoKGl0ZW0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGsgPSBrZXlzVG9SZW1vdmVbaV07XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiSW52bGFsaWRhdGluZyBjYWNoZSBlbGVtZW50XCIpICsgXCIgXCIgKyBrKTtcclxuICAgICAgZGVsZXRlIGNhY2hlW2tdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIGNhY2hlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmFsaXp6YXppb25lIGRpIHVuYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIEdVSUQgY29sbGVnYXRvIGFsbGEgY2hpYW1hdGEgYXBwZW5hIHRlcm1pbmF0YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGVyc2lzdENhY2hlSWZJZGxlIEVmZmV0dHVhIGlsIHBlcnNpc3QgZGVsbGEgY2FjaGUgSFRUUCBzb2xvIHNlIG5vbiBjaSBzb25vIGFsdHJlIGNoaWFtYXRlIGluIGNvcnNvLCBwZXIgZXZpdGFyZVxyXG4gICAqIGNoZSBtaSBjYW1iaSBzb3R0byBsJ29nZ2V0dG8gZGkgY2FjaGUgbWVudHJlIHN0byBzYWx2YW5kbyBsZSBpbmZvcm1hemlvbmlcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHRyeUZpbmFsaXplQnlHdWlkKGd1aWQ6IHN0cmluZywgY2FjaGVJbmZvcz86IENhY2hlSW5mb3MpIHtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRmluYWxpemluZyBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggc3RhdHVzXCIpICsgXCI6IFwiICsgKCF0aGlzLmNhbGxTdGF0dXNbZ3VpZF0gPyAnVW5rbm93bicgOiB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA/IHRoaXMubG9jKCdTdWNjZXNzJykgOiB0aGlzLmxvYygnRmFpbHVyZScpKSk7XHJcblxyXG4gICAgLy8gVE9ETzogUGVyZGVyZSAzLTQgb3JlIHBlciBjYXBpcmUgcGVyY2jDqSBvZ25pIHRhbnRvIGFycml2YSBudWxsIGluIGNhc2kgcGVzYW50aSBkaSBPYnNlcnZhYmxlIHNwYW1tYXRpIGEgcmFuZG9tXHJcbiAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdKSB7XHJcbiAgICAgIC8vIEFsbGEgcHJpbWEgY2hpYW1hdGEgYnVvbmEsIHNpZ25pZmljYSBjaGUgYWxtZW5vIGlsIGxvZ2luIGNlIGwnaG8uIFBvc3NvIG1ldHRlcm1pIGluIG1vZGFsaXTDoCByZWRpcmVjdEluUHJvZ3Jlc3MgZmFsc2VcclxuICAgICAgLy8gZSByaWluaXppYXJlIGEgdmFsdXRhcmUgZXJyb3JpIGRpIGphdmFzaGl0XHJcbiAgICAgIGlmICh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyAmJiB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKVxyXG4gICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyhmYWxzZSk7XHJcblxyXG4gICAgICAvLyBBZ2dpdW5nbyBsYSBjaGlhbWF0YSBhbGxhIGxpc3RhIGRlbGxlIHVsdGltZSAzIGNvbXBsZXRhdGVcclxuICAgICAgdGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy51bnNoaWZ0KHRoaXMuY2FsbFN0YXR1c1tndWlkXS51cmwpXHJcbiAgICAgIGlmICh0aGlzLkxhc3RUaHJlZUNvbXBsZXRlZENhbGxzLmxlbmd0aCA+IDMpXHJcbiAgICAgICAgdGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5wb3AoKTtcclxuXHJcbiAgICAgIC8vIEluIG9nbmkgY2FzbyBxdWVzdGEgcG9zc28gcmltdW92ZXJsYVxyXG4gICAgICBkZWxldGUgdGhpcy5jYWxsU3RhdHVzW2d1aWRdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIHZlbmdvIGRhIHVuYSBjaGlhbWF0YSBjaGUgaGEgYWdnaW9ybmF0byBsYSBjYWNoZSBhIHRpbWVyIG8gZ2xvYmFsZSBtYXJjbyBpbCBmYXR0byBjaGUgcXVlbGxhIGNhY2hlIGRldidlc3NlcmUgYWdnaW9ybmF0YVxyXG4gICAgaWYgKGNhY2hlSW5mb3MgJiYgY2FjaGVJbmZvcy5jYWNoZSkge1xyXG4gICAgICB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCA9IHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8ICEhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiTWFya2luZyBjYWNoZSB0byBiZSBwZXJzaXN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgdW5hIGRlbGxlIGR1ZSBjYWNoZSBkZXZvbm8gZXNzZXJlIGFnZ2lvcm5hdGUgZSBub24gaG8gbmVzc3VuYSBjaGlhbWF0YSBpbiBjb3JzbyBlZmZldHR1byBsJ2FnZ2lvcm5hbWVudG8gaW4gYmFzZSBhIHF1YWxlIGRlbGxlIGR1ZSB2YSBhZ2dpb3JuYXRhXHJcbiAgICAvLyBBbGxhIGZpbmUgZGkgdHV0dG8gbWFyY28gY29tZSBmYXR0b1xyXG4gICAgaWYgKCh0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSAmJiBPYmplY3Qua2V5cyh0aGlzLmNhbGxTdGF0dXMpLmxlbmd0aCA9PSAwKSB7XHJcblxyXG4gICAgICB2YXIgdG9DYWxsID0gW107XHJcbiAgICAgIGxldCB0bXBLZXkgPSBcIlwiO1xyXG4gICAgICBpZiAodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5O1xyXG4gICAgICAgIHRvQ2FsbC5wdXNoKHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odG1wS2V5LCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0odG1wS2V5KSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkge1xyXG4gICAgICAgIHRtcEtleSA9IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5O1xyXG4gICAgICAgIHRvQ2FsbC5wdXNoKHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odG1wS2V5LCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0odG1wS2V5KSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk5vIG1vcmUgSFRUUCBjYWxscyB0byBiZSBleGVjdXRlZCwgZW50ZXJpbmcgaWRsZSBzdGF0ZSBhbmQgcGVyc2lzdGluZyBtb2RpZmllZCBjYWNoZXNcIikgKyBcIi4uLlwiKTtcclxuICAgICAgdmFyIHJldCA9IGF3YWl0IGZvcmtKb2luKHRvQ2FsbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXQpXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpKTtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBkYXRvIHVuIHVuaWNvIEZpbGUgbyB1bmEgbGlzdGEgZGkgRmlsZSBjcmVhIHVuIG9nZ2V0dG8gRm9ybURhdGEgY2hlIHB1w7IgZXNzZXJlIGludmlhdG8gY29tb2RhbWVudGUgXHJcbiAgICogYWQgdW4gYmFja2VuZCBBU1AuTkVUIGRhIGN1aSBzaSBwb3Ryw6AgYWNjZWRlcmUgYSBSZXF1ZXN0LkZvcm0uRmlsZXNcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0ZpbGUgfCBGaWxlW119IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIEZpbGUgbyBsaXN0YSBkaSBGaWxlLiBOLkI6IG5lbGxhIGZpcm1hIGRlbGxhIGZ1bnppb25lIHZpZW5lIGNvbnNpZGVyYXRvICoqYW55KiogcGVyIGZhcmUgdGVzdCBzdWxsZSBwcm9wcmlldMOgIFxyXG4gICAqIGludmVjZSBjaGUgZmFyZSB0ZXN0IGNvbiBsJyoqaXN0YW5jZW9mKipcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IEZvcm1EYXRhIGNvbnRlbmVudGUgdHV0dGkgaSBmaWxlIHBhc3NhdGlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlOiBhbnkpOiBGb3JtRGF0YSB7XHJcbiAgICB2YXIgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgaWYgKGZpbGVBcnJheU9yRmlsZSkge1xyXG4gICAgICBpZiAoZmlsZUFycmF5T3JGaWxlLmxlbmd0aClcclxuICAgICAgICBmaWxlQXJyYXlPckZpbGUuZm9yRWFjaCh0ID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCB0LCB0Lm5hbWUpOyB9KTtcclxuICAgICAgZWxzZSBpZiAoZmlsZUFycmF5T3JGaWxlLm5hbWUpXHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZUFycmF5T3JGaWxlLCBmaWxlQXJyYXlPckZpbGUubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBkaXNwb25pYmlsaSBnZW5lcmEgZ2xpIEhlYWRlciBIVFRQIHBlciBsYSBjaGlhbWF0YSBkYSBlZmZldHR1YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQ29udGVudC1UeXBlXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkFjY2VwdFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUF1dGggSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBdXRob3JpemF0aW9uXCIsIHZhbG9yaXp6YXRvIGNvbCB0b2tlbiByZWN1cGVyYXRvIGRhbGwnaG9vayAqKnJldHJpZXZlQWNjZXNzVG9rZW4qKiBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbklkIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiWC1UWC1JRFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtIdHRwSGVhZGVyc30gSGVhZGVyIGdlbmVyYXRpIGluIGJhc2UgYWkgcGFyYW1ldHJpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKGxvY2FsZSA9ICdpdC1JVCcsIHRyYW5zYWN0aW9uSWQgPSBcIlwiLCBpbmNsdWRlQXV0aDogYm9vbGVhbiA9IHRydWUsIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIiwgYWNjZXB0OiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IEh0dHBIZWFkZXJzIHtcclxuICAgIHZhciBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICB2YXIgYXV0aHRva2VuID0gdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUFjY2Vzc1Rva2VuKCk7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xyXG5cclxuICAgIGlmICh0cmFuc2FjdGlvbklkKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJYLVRYLUlEXCIsIHRyYW5zYWN0aW9uSWQpO1xyXG5cclxuICAgIGlmIChhdXRodG9rZW4gJiYgaW5jbHVkZUF1dGgpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBhdXRodG9rZW4pO1xyXG5cclxuICAgIGlmIChhY2NlcHQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdFwiLCBhY2NlcHQpO1xyXG5cclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdC1MYW5ndWFnZVwiLCBsb2NhbGUpO1xyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aW9uZSBkaSBkZWZhdWx0IGRlZ2xpIGVycm9yaVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIG9uRXJyb3IocmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IFR5cGVFcnJvciwgZ3VpZDogc3RyaW5nKSB7XHJcbiAgICBpZih0aGlzLmNhbGxTdGF0dXNbZ3VpZF0pXHJcbiAgICAgIHRoaXMuY2FsbFN0YXR1c1tndWlkXS5zdWNjZXNzID0gZmFsc2U7XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdHV0dGkgZ2xpIGVycm9yaSBkdXJhbnRlIGlsIHJlZGlyZWN0IGFsIGxvZ2luIHZlbmdhbm8gaWdub3JhdGlcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGluZ1RvTG9naW4oKSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlZGlyZWN0aW5nIHRvIExvZ2luLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdmVuZ2EgZ2VzdGl0byB1biBzb2xvIGVycm9yZSBwZXIgdm9sdGFcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRIYW5kbGluZ0Vycm9yU3RhdHVzKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJBbHJlYWR5IEhhbmRsaW5nIGFuIGVycm9yLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVIYW5kbGluZ0Vycm9yU3RhdHVzKHRydWUpO1xyXG5cclxuICAgIGxldCBmaW5hbEVycm9yID0gXCJcIjtcclxuICAgIGxldCBmaW5hbFN0YXR1cyA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5pc1R5cGVFcnJvcihyZXMpKSB7XHJcbiAgICAgIGZpbmFsRXJyb3IgPSByZXMubWVzc2FnZTtcclxuICAgICAgZmluYWxTdGF0dXMgPSBcIkhUVFAgU2VydmljZSBJbnRlcm5hbCBFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc0h0dHBFcnJvclJlc3BvbnNlKHJlcykpIHtcclxuXHJcbiAgICAgIGZpbmFsRXJyb3IgPSBhd2FpdCB0aGlzLmdldEh0dHBFcnJvclRleHQocmVzLmVycm9yKTtcclxuICAgICAgZmluYWxTdGF0dXMgPSByZXMuc3RhdHVzLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHJlcy5zdGF0dXMpIHtcclxuICAgICAgICAvLyBVbmF1dGhvcml6ZWRcclxuICAgICAgICBjYXNlIDQwMTpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCByZWRpcmVjdCBhbHJlYWR5IGluIHByb2dyZXNzLiBJZ25vcmluZyB0aGlzIGV2ZW50XCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0MDEgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZWRpcmVjdGluZyB0byBsb2dpbi5cIikpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW9uU3RhdHVzKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW5nVG9Mb2dpbih0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVkaXJlY3RUb0xvZ2luKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gSGFuZGxlZCBleGNlcHRpb25cclxuICAgICAgICBjYXNlIDQwMDpcclxuICAgICAgICAvLyBObyBQZXJtaXNzaW9uc1xyXG4gICAgICAgIGNhc2UgNDAzOlxyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVCbG9ja2luZ0V4Y2VwdGlvbihyZXMuc3RhdHVzLCBmaW5hbEVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3QgZm91bmRcclxuICAgICAgICBjYXNlIDQwNDpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgdGhpcy5sb2MoXCJSZXNvdXJjZSBub3QgZm91bmRcIikpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIE5vdENvbmZpZ3VyZWRFeGNlcHRpb25cclxuICAgICAgICBjYXNlIDQ0NDpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKVxyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQ0NCBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICBlbHNlIGlmICghdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVOb3RDb25maWd1cmVkRXhjZXB0aW9uKCkpXHJcbiAgICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZmluYWxFcnJvciA9IFwiU2VydmVyIG1pZ2h0IGJlIG9mZmxpbmVcIiArIChyZXMuc3RhdHVzVGV4dCA/IFwiIChcIiArIHJlcy5zdGF0dXNUZXh0ICsgXCIpIFwiIDogXCJcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUV4Y2VwdGlvbihmaW5hbFN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIGVycm9yZSByZXN0aXR1aXNjZSB1bmEgcHJvbWlzZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmUgaW4gbW9kbyBkYSBwb3RlciBmYXJlIHVuIGF3YWl0XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIGNoZSByaXNvbHZlIGNvbiBsYSBzdHJpbmdhIGZpbmFsZSBkZWxsJ2Vycm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHR0cEVycm9yVGV4dChlcnI6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAvLyBTZSBobyB1biBCbG9iIHB1w7IgZXNzZXJlIG8gdW4gQ2FsbFJlc3VsdCBvIHN1cHBvbmdvIHVuYSBzZW1wbGljZSBzdHJpbmdhLFxyXG4gICAgLy8gYWx0cmltZW50aSBwb3RyZWJiZSBlc3NlcmUgZGlyZXR0YW1lbnRlIHVuIENhbGxSZXN1bHQsIG9wcHVyZSB1bmEgc2VtcGxpY2Ugc3RyaW5nYVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyTXNnID0gKDxhbnk+ZS50YXJnZXQpLnJlc3VsdDtcclxuICAgICAgICAgIGxldCBqc29uZXJyTXNnOiBhbnk7XHJcbiAgICAgICAgICB0cnkgeyBqc29uZXJyTXNnID0gSlNPTi5wYXJzZShlcnJNc2cpOyB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKGpzb25lcnJNc2cgJiYgdGhpcy5pc0NhbGxSZXN1bHQoanNvbmVyck1zZykgPyBqc29uZXJyTXNnLmVycm9yLm1lc3NhZ2UgOiBlcnJNc2cpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZXJyKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuaXNDYWxsUmVzdWx0KGVycikpXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyPy50b1N0cmluZygpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnb2dnZXR0byDDqCBkaSB0aXBvICoqQ2FsbFJlc3VsdCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzQ2FsbFJlc3VsdChlcnI6IGFueSk6IGVyciBpcyB7IGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9IH0ge1xyXG4gICAgcmV0dXJuICEhZXJyPy5lcnJvcj8ubWVzc2FnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2Vycm9yZSDDqCBkaSB0aXBvICoqSHR0cEVycm9yUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBFcnJvclJlc3BvbnNlKGVycjogYW55KTogZXJyIGlzIEh0dHBFcnJvclJlc3BvbnNlIHtcclxuICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZTtcclxuICB9XHJcblxyXG4gICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKlR5cGVFcnJvcioqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzVHlwZUVycm9yKGVycjogYW55KTogZXJyIGlzIFR5cGVFcnJvciB7XHJcbiAgICByZXR1cm4gZXJyLm5hbWUgPT0gXCJUeXBlRXJyb3JcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbWUgZGljZSBpbCBub21lLCByZWdpc3RyYSB1biBlcnJvcmUgZSByZXN0aXR1aXNjZSB1biBPYnNlcnZhYmxlIHZ1b3RvIGNvbWUgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IHJlcyBSaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIElkZW50aWZpY2F0aXZvIEdVSUQgZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGdlc3RpcmUgbCdlcnJvcmUgdmlhIGxpYnJlcmlhIG8gc2UgbGltaXRhcnNpIGEgcmVzdGl0dWlyZSBsJ09ic2VydmFibGUgdnVvdG9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fSBPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKHJlczogYW55LCBndWlkOiBzdHJpbmcsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoaGFuZGxlRXJyb3IpXHJcbiAgICAgIHRoaXMub25FcnJvcihyZXMsIGd1aWQpO1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCgpID0+IHsgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIFVybCBlIGRlaSBwYXJhbWV0cmkgY2VyY2EgZGkgcmVjdXBlcmFyZSBsJ2V2ZW50dWFsZSBvZ2dldHRvIGdpw6Agc2FsdmF0byBpbiBjYWNoZSBjb24gbGUgaW5mb3JtYXppb25pIGJhc2UgZGVsbGEgY2FjaGUgc3Rlc3NhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGEgKG51bGxpIGluIGNhc28gZGkgUE9TVClcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q2FjaGVJbmZvc30gT2dnZXR0byBjb250ZW5lbnRlIGxlIGluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSBwZXIgbCdvZ2dldHRvIHNwZWNpZmljYXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogQ2FjaGVJbmZvcyB7XHJcblxyXG4gICAgbGV0IGNhY2hpbmdLZXkgPSBudWxsLCBjYWNoZVRpbWUgPSBudWxsLCBpdGVtID0gbnVsbDtcclxuICAgIGxldCB1c2VDYWNoaW5nID0gISEoLyNjYWNoZS9naS5leGVjKHVybCkpO1xyXG5cclxuICAgIGlmICh1c2VDYWNoaW5nKSB7XHJcbiAgICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgICBjYWNoZVRpbWUgPSB0bXAgPyB0bXBbMl0gOiBudWxsO1xyXG5cclxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKTtcclxuICAgICAgaWYgKHRoaXMudW50aW1lZENhY2hlRXhwaXJlZCgpICYmICFjYWNoZVRpbWUpXHJcbiAgICAgICAgdGhpcy5yZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCk7XHJcblxyXG4gICAgICBjYWNoaW5nS2V5ID0gdGhpcy5tYWtlQ2FjaGVLZXkodXJsLCBwYXJhbXMpO1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSBjYWNoZVRpbWUgPyB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5IDogdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXlcclxuICAgICAgbGV0IGNhY2hlTHMgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0oY2FjaGVLZXkpO1xyXG4gICAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgICAgaWYgKGNhY2hlICYmIGNhY2hlW2NhY2hpbmdLZXldICYmICF0aGlzLnRpbWVkQ2FjaGVJdGVtRXhwaXJlZChjYWNoZVtjYWNoaW5nS2V5XSkpIHtcclxuICAgICAgICAvLyBTZSBnZXN0aXNjbyBpbCB0ZW1wbyBlc2F0dG8gZGVsbGEgY2FjaGUgcHJpbWEgZGkgcmVzdGl0dWlyZSBsJ29nZ2V0dG8gY2FjaGF0byBsbyByaXB1bGlzY28gXHJcbiAgICAgICAgLy8gZGFsbGUgcHJvcHJpZXTDoCBpbnRlcm5lIGNoZSBnbGkgaG8gYWdnaXVudG8gcGVyIGNvbnRyb2xsYXJuZSBsYSBzY2FkZW56YVxyXG4gICAgICAgIGlmIChjYWNoZVRpbWUpXHJcbiAgICAgICAgICBkZWxldGUgY2FjaGVbY2FjaGluZ0tleV0uX19leHBpcmU7XHJcblxyXG4gICAgICAgIGl0ZW0gPSBjYWNoZVtjYWNoaW5nS2V5XVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyIGFzc2ljdXJhcm1pIGNoZSBpbCByaWZlaXJtZW50byBkZWdsaSBvZ2dldHRpIHNpYSBkaXZlcnNvIHV0aWxpenpvIGlsIGRlZXBDbG9uZVxyXG4gICAgcmV0dXJuIG5ldyBDYWNoZUluZm9zKHVybCwgdXNlQ2FjaGluZywgY2FjaGluZ0tleSwgY2FjaGVUaW1lLCB0aGlzLnV0aXNFeHRzLmRlZXBDbG9uZShpdGVtKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcmlzY2UgdW4gb2dnZXR0byBuZWxsYSBjYWNoZSBhcHByb3ByaWF0YSBpbiBiYXNlIGFsbGUgaW5mb3JtYXppb25pIGNvbnRlbnV0ZSBuZWwgcGFyYW1ldHJvICoqY2FjaGVJbmZvcyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtUfSBpdGVtIE9nZ2V0dG8gZGEgaW5zZXJpcmUgbmVsbGEgY2FjaGVcclxuICAgKiBAcGFyYW0ge0NhY2hlSW5mb3N9IGNhY2hlSW5mb3MgSW5mb3JtYXppb25pIHN1bGxhIGNhY2hlIHJlY3VwZXJhdGUgZGEgdW5hIGNoaWFtYXRhIHByZWNlZGVudGUgYSAqKnRyeUdldENhY2hlSW5mb3JtYXRpb25zKipcclxuICAgKi9cclxuICBwcml2YXRlIGNhY2hlUmVzcG9uc2U8VD4oaXRlbTogVCwgY2FjaGVJbmZvczogQ2FjaGVJbmZvcyk6IHZvaWQge1xyXG4gICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVJbmZvcy5jYWNoZVRpbWUgPyB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5IDogdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXlcclxuICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgIGxldCBjYWNoZSA9IGNhY2hlTHMgPyBjYWNoZUxzIDoge307XHJcblxyXG4gICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0gPSBpdGVtO1xyXG4gICAgaWYgKGNhY2hlSW5mb3MuY2FjaGVUaW1lKVxyXG4gICAgICBjYWNoZVtjYWNoZUluZm9zLmNhY2hlS2V5XS5fX2V4cGlyZSA9IGRheWpzKCkuYWRkKGNhY2hlSW5mb3MuY2FjaGVUaW1lLCBcInNlY29uZHNcIik7XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0TG9jYWxJdGVtKGNhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIGxlIGNoaWFtYXRlIHNlbnphIGV4cGlyZSB0aW1lIMOoIHNjYWR1dGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bnRpbWVkQ2FjaGVFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkpKTtcclxuICAgIHJldHVybiAhZXhwaXJlIHx8IGV4cGlyZSAmJiBkYXlqcyhleHBpcmUpIDwgZGF5anMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBzZSBsYSBjYWNoZSBwZXIgdW5hIGNoaWFtYXRhIGNoZSBoYSB1biB0ZW1wbyBkaSB2aXRhIGJlbiBkZWZpbml0byDDqCBzY2FkdXRhIG8gbWVub1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gcmVjdXBlcmF0byBkYWxsYSBjYWNoZSBhIGN1aSBobyBhZ2dpdW50byBsYSBjaGlhdmUgaW50ZXJuYSBfX2V4cGlyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsYSBjYWNoZSDDqCBzY2FkdXRhIGUgZGV2J2Vzc2VyZSByaXB1bGl0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgKi9cclxuICBwcml2YXRlIHRpbWVkQ2FjaGVJdGVtRXhwaXJlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXlqcyhpdGVtLl9fZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZSBpbXBvc3RhIGxhIHByb3NzaW1hIHNjYWRlbnphIGFkIGFkZXNzbyArICoqQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MqKiAodG9rZW4gdmFsb3JpenphdG8gaW4gZmFzZSBkaSBjb25maWd1cmF6aW9uZSBkYWxsYSBwcm9wcmlldMOgICoqY2xpZW50Q2FjaGVEdXJhdGlvblMqKiBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZU1vZHVsZUNvbmZpZyoqKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCkge1xyXG4gICAgYXdhaXQgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwge30pLnRvUHJvbWlzZSgpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXksIEpTT04uc3RyaW5naWZ5KGRheWpzKCkuYWRkKHRoaXMuQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MsIFwic2Vjb25kXCIpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZGVsbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRpIGV4cGlyZSBkZWZpbml0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZXNldEh0dHBUaW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwge30pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIHVuYSBjaGlhdmUgcGVyIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGluIGJhc2UgYWQgVVJMIGUgUGFyYW1ldHJpIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENoaWF2ZSBjaGUgcmFwcHJlc2VudGEgaW4gbWFuaWVyYSB1bml2b2NhIGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgIHByaXZhdGUgbWFrZUNhY2hlS2V5KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgdGhpcy5tZSA9IHRoaXMubWUgfHwgdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUlkZW50aXR5KCk7XHJcblxyXG4gICAgbGV0IGF1dGhLZXlQYXJ0ID0gKHRoaXMubWUgPyB0aGlzLm1lLklkdGVuYW50IDogXCJcIikgKyAodGhpcy5tZSAmJiB0aGlzLkNBQ0hFX0JZX1VTRVIgPyB0aGlzLm1lLklkVXNlciA6IFwiXCIpO1xyXG4gICAgbGV0IHBhcmFtc0tleVBhcnQgPSBwYXJhbXMgJiYgcGFyYW1zLmtleXMoKS5sZW5ndGggPiAwID8gcGFyYW1zLmtleXMoKS5yZWR1Y2UoKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiBwcmV2ICsgXCIsXCIgKyBuZXh0ICsgJz0nICsgcGFyYW1zLmdldChuZXh0KSwgXCJcIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIGF1dGhLZXlQYXJ0ICsgXCJfXCIgKyB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiYXBpXCIpICsgNCkgKyBcIj9cIiArIHBhcmFtc0tleVBhcnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF6aW9uZSBHVUlEXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTnVvdm8gR1VJRCBnZW5lcmF0byBpbiBtYW5pZXJhIGNhc3VhbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEdVSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNjcml2ZXJlIGxvZyBhIGNvbnNvbGUgcXVhbG9yYSAqKkRFQlVHX01PREUqKiByaXN1bHRhc3NlICoqdHJ1ZSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRpIGxvZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuSFRUUF9ERUJVR19NT0RFKVxyXG4gICAgICBjb25zb2xlLmxvZyhcIkBodHRwc2VydmljZTogXCIgKyBtZXNzYWdlKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIHBlciBsYSBsb2NhbGl6emF6aW9uZSBkZWkgbWVzc2FnZ2lcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGEgbG9jYWxpenphcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdnaW8gbG9jYWxpenphdG9cclxuICAgKi9cclxuICBwcml2YXRlIGxvYyhtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gVG9nbGlhbW8gdmVsb2NlbWVudGUgc3RlIGxvY2FsaXp6YXppb25pIGludXRpbGkuLi4uXHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcbn0iXX0=
821
+ }] }, { type: i2.BaseLocalization }, { type: i3.HttpClient }, { type: i4.CacheService }, { type: i5.HashingService }, { type: i5.UtilityService }]; } });
822
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFtQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3pKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU83RCxrQ0FBa0M7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxFLGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEgsV0FBVztBQUNYLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVFqRDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sV0FBVztJQTJCdEI7O09BRUc7SUFDSCxZQUNVLGVBQXNDLEVBQ0MsaUJBQWlCLEVBQ3RDLFFBQVEsRUFDTyx1QkFBdUIsRUFDakMsYUFBc0IsRUFDcEIsZUFBd0IsRUFDakQsRUFBb0IsRUFDcEIsSUFBZ0IsRUFDaEIsWUFBMEIsRUFDMUIsSUFBb0IsRUFDcEIsUUFBd0I7UUFWeEIsb0JBQWUs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c291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFByb2dyZXNzRXZlbnQsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzIEZhZW56YVxyXG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL3ByZWZlcmVuY2VzXCI7XHJcbmltcG9ydCB7IEhhc2hpbmdTZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzY2FuIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLyBDaGlhbWF0ZSBhaSBSZXBvc2l0b3J5IC8gdG9rZW5zXHJcbmltcG9ydCB7IEhUVFBfSU5WQUxJREFUSU9OLCBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUywgQVBQX05BTUUsIENBQ0hFX0JZX1VTRVIsIEhUVFBfREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBDYWNoZUluZm9zIH0gZnJvbSBcIi4vbW9kZWxzL0NhY2hlSW5mb3NcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBIVFRQU2VydmljZSB7XHJcblxyXG4gIC8qKiBDYWNoZSBkZWxsbyBzdGF0byBkZWxsZSBjaGlhbWF0ZSBIVFRQIGF0dHVhbG1lbnRlIGVmZmV0dHVhdGUuIE9nbmkgY2hpYW1hdGEgw6ggcmFwcHJlc2VudGF0YSBkYSB1biBHVUlEIGUgbG8gc3RhdHVzIGFzc3VtZSB2YWxvcmUgKipmYWxzZSoqIHNvbG8gc3VnbGkgZXJyb3JpICovXHJcbiAgcHJpdmF0ZSBjYWxsU3RhdHVzOiB7IFtpZDogc3RyaW5nXTogeyB1cmw6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiB9IH0gPSB7fTtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnkgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5LCBzb2xvIHBlciBsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGVmaW5pdG8gZGkgY2FjaGluZyAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgPSBudWxsO1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbG8gc2NhZGVyZSBkZWxsYSBjYWNoZSBzdGVzc2EgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSA9IG51bGw7XHJcbiAgLyoqIElkZW50aXTDoCBjb2xsZWdhdGEgYWwgdG9rZW4gZGkgYXV0ZW50aWNhemlvbmUgZGEgdXNhcmUsIHJpY2hpZXN0YSBhbCBwcm9ncmFtbWEgY2hlIHV0aWxpenphIGxhIGxpYnJlcmlhIGF0dHJhdmVyc28gbCdob29rICoqcmV0cmlldmVJZGVudGl0eSoqIGRlbGxhICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogKi9cclxuICBwcml2YXRlIG1lOiB7IElkdGVuYW50OiBzdHJpbmcsIElkVXNlcjogc3RyaW5nIH0gPSBudWxsO1xyXG4gIC8qKiBJbmRpY2EgY2hlIGxhIGNhY2hlIGEgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgc2VuemEgbGltaXRpIGRpIHRlbXBvIGRldidlc3NlcmUgcGVyc2lzdGl0YSBpbCBwcmltYSBwb3NzaWJpbGUgKi9cclxuICBwcml2YXRlIFBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudGF6aW9uZSBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZSBwZXIgY29sbGVnYXJlIGkgY29tcG9ydGFtZW50aSBkZWxsYSBsaWJyZXJpYSBhbGwnYXBwbGljYXppb25lIGluIGN1aSDDqCB1c2F0YS4gXHJcbiAgICogXHJcbiAgICogU2Ugw6ggc3RhdG8gZWZmZXR0dWF0byBpbCBwcm92aWRlIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIHZlcnLDoCB1c2F0byBxdWVsIHByb3ZpZGVyLCBhbHRyaW1lbnRpIHZlcnLDoCBjcmVhdGEgdW5hIG51b3ZhIGlzdGFuemEgZGkgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgRXh0ZW5zaW9uc0ltcGw6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucztcclxuXHJcbiAgLyoqIExpc3RhIGRlbGxlIHVsdGltZSAzIGNoaWFtYXRlIGNvbXBsZXRhdGUgY29uIHN1Y2Nlc3NvIGluIG9yZGluZSBkaSBjb21wbGV0YW1lbnRvIChpbiBwb3NpemlvbmUgMCBjJ8OoIGwndWx0aW1hIGNvbXBsZXRhdGEgZWNjZXRlcmEuLi4pICovXHJcbiAgcHVibGljIExhc3RUaHJlZUNvbXBsZXRlZENhbGxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIEVYVEVOU0lPTl9DTEFTUzogSHR0cFNlcnZpY2VFeHRlbnNpb25zLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0lOVkFMSURBVElPTikgcHJpdmF0ZSBIVFRQX0lOVkFMSURBVElPTixcclxuICAgIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBASW5qZWN0KEhUVFBfREVCVUdfTU9ERSkgcHJpdmF0ZSBIVFRQX0RFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGJjOiBCYXNlTG9jYWxpemF0aW9uLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgaGFzaDogSGFzaGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHV0aXNFeHRzOiBVdGlsaXR5U2VydmljZVxyXG4gICkge1xyXG5cclxuICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwgPSB0aGlzLkVYVEVOU0lPTl9DTEFTUyB8fCBuZXcgSHR0cFNlcnZpY2VFeHRlbnNpb25zKCk7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBUaW1lZENhY2hlXCI7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSA9IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ICsgXCJfRXhwaXJlXCI7XHJcblxyXG4gICAgdGhpcy5hZGp1c3RPbGRTdG9yYWdlU3lzdGVtKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZSB2ZWRvIGNoZSBjaSBzb25vIGVsZW1lbnRpIHNhbHZhdGkgbmVsIGxvY2FsU3RvcmFnZSBwcm92byBhIHRvZ2xpZXJsaSBlIGEgcmlzYWx2YXJsaSB2aWEgcHJlZmVyZW5jZS5cclxuICAgKiBOZWwgY2FzbyBtaWdsaW9yZSBsaSBzcG9zdG8gZGFsIGxvY2FsU3RvcmFnZSBhbCBEQiBkaSBwcmVmZXJlbmNlLCBuZWwgY2FzbyBwZWdnaW9yZSBsaSB0b2xnbyBlIGxpIHJpc2Fsdm8gbmVsIGxvY2FsU3RvcmFnZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRqdXN0T2xkU3RvcmFnZVN5c3RlbSgpIHtcclxuICAgIHZhciBsc1RpbWVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICB2YXIgbHNVbnRpbWVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkpO1xyXG4gICAgaWYgKCFsc1RpbWVkICYmICFsc1VudGltZWQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5KTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGxzVGltZWQgPSBsc1RpbWVkID8gSlNPTi5wYXJzZShsc1RpbWVkKSA6IHt9O1xyXG4gICAgbHNVbnRpbWVkID0gbHNVbnRpbWVkID8gSlNPTi5wYXJzZShsc1VudGltZWQpIDoge307XHJcblxyXG4gICAgYXdhaXQgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIGxzVGltZWQpLFxyXG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBsc1VudGltZWQpXHJcbiAgICBdKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNvbnZlcnRlZCBvbGQgc3RvcmFnZSBzeXN0ZW0gdG8gbmV3IG9uZVwiKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUCBjb24gZXZlbnR1YWxtZW50ZSBsYSBnZXN0aW9uZSBkZWxsYSBjYWNoZSBxdWFsb3JhIGxhIGNoaWFtYXRhIHRlcm1pbmkgY29uIGxhIGNvbnZlbnppb25lIFwiI2NhY2hlXCJcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIENhbGxiYWNrIGNoaWFtYXRvIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSwgZXJyb3JDYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlICYmIGNhY2hlZEluZm9zLmNhY2hlSXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5nZXQ8VD4oY2FjaGVkSW5mb3MuZmluYWxVcmwsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJldC5sb2NhbGUsIHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlSXRlbSA9IDxUPnJlcztcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UodGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUocmVzcG9uc2VJdGVtKSwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZWQgcmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkLCBjYWNoZWRJbmZvcyk7IH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUCBjb24gZXZlbnR1YWxtZW50ZSBsYSBnZXN0aW9uZSBkZWxsYSBjYWNoZSBxdWFsb3JhIGxhIGNoaWFtYXRhIHRlcm1pbmkgY29uIGxhIGNvbnZlbnppb25lIFwiI2NhY2hlXCJcclxuICAgKiBcclxuICAgKiBDYXNvIHNwZWNpZmljbyBkaSBjaGlhbWF0YSBjaGUgZGV2ZSByZXN0aXR1aXJlIHVuIEJsb2IgbyB1biBBcnJheUJ1ZmZlciBuYXRpdm8gZGEgZWxhYm9yYXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge1wiYXJyYXlidWZmZXJcInwgXCJibG9iXCJ9IHR5cGUgVGlwbyBkaSByaXRvcm5vIHJpY2hpZXN0b1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIENhbGxiYWNrIGNoaWFtYXRvIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8QmxvYiB8IEFycmF5QnVmZmVyPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIGdldFJhdyh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHlwZTogXCJhcnJheWJ1ZmZlclwiIHwgXCJibG9iXCIgPSBcImFycmF5YnVmZmVyXCIsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSwgZXJyb3JDYWxsYmFjayA9IG51bGwpOiBPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgbGV0IGNhY2hlZEluZm9zID0gdGhpcy50cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmwsIHBhcmFtcyk7XHJcbiAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlICYmIGNhY2hlZEluZm9zLmNhY2hlSXRlbSkge1xyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwgKyBcIiBcIiArIHRoaXMubG9jKFwicmV0cmlldmVkIGZyb20gY2FjaGVcIikpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mPGFueT4oY2FjaGVkSW5mb3MuY2FjaGVJdGVtKS5waXBlKGRlbGF5KDApLCBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5nZXQoY2FjaGVkSW5mb3MuZmluYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiA8YW55PnR5cGUsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIG1hcCgoYmxvYjogQmxvYiB8IEFycmF5QnVmZmVyKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UoYmxvYiwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBibG9iO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8QmxvYj4gPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAqIFxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7YW55fSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgKiBcclxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAqL1xyXG4gIHB1YmxpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgKiBFc2VjdXppb25lIGRpIHVuYSBERUxFVEUgSFRUUFxyXG4gICpcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgKiBcclxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAqL1xyXG4gIHB1YmxpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBVVCBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHB1dDxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnB1dDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgYmlzb2duYSBhbmNoZSBpbnZpYXJlIGRlaSBGaWxlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RmlsZVtdIHwgRmlsZX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gZmlsZSBvIGxpc3RhIGRpIGZpbGUgZGEgaW52aWFyZS4gSWwgdGlwbyAqKkZpbGUqKiDDqCBxdWVsbG8gbmF0aXZvIGRlbCBKYXZhc2NyaXB0XHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0d2l0aEZpbGVzPFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBmaWxlQXJyYXlPckZpbGU6IEZpbGVbXSB8IEZpbGUsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG5cclxuICAgICAgICB2YXIgZm9ybURhdGEgPSB0aGlzLmdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlKTtcclxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJib2R5XCIsIEpTT04uc3RyaW5naWZ5KGJvZHlEYXRhKSk7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgZm9ybURhdGEsIHsgcGFyYW1zOiBwYXJhbXMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCBudWxsLCB0cnVlLCBudWxsLCBudWxsKSB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4geyByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpOyB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtLfSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcG9zdEdldEZpbGU8Sz4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBLLCBmaWxlbmFtZTogc3RyaW5nLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55LCBhZnRlckdldEZpbGU6ICgpID0+IGFueSA9IG51bGwsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSwgcGFycz86IEh0dHBQYXJhbXMpIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuICAgIGxldCBsb2NhbGUgPSBhd2FpdCB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keURhdGEsIHsgcGFyYW1zOiBwYXJzLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobG9jYWxlKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbGUodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcbiAgICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKGxvY2FsZSksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICBzY2FuKChwcmV2aW91czogRG93bmxvYWQsIGV2ZW50OiBIdHRwRXZlbnQ8QmxvYj4pOiBEb3dubG9hZCA9PiB7XHJcbiAgICBcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gZXZlbnQudG90YWwgPyAoZXZlbnQubG9hZGVkID4gZXZlbnQudG90YWwgPyAxMDAgOiBNYXRoLnJvdW5kKCgxMDAgKiBldmVudC5sb2FkZWQpIC8gZXZlbnQudG90YWwpKSA6IHByZXZpb3VzLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3AgPSBldmVudC5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChldmVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgY2Rpc3BGaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogMTAwLCBzdGF0ZTogJ0RPTkUnLCBjb250ZW50OiBldmVudC5ib2R5IH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgICAgIH0sIHsgc3RhdGU6ICdQRU5ESU5HJywgcHJvZ3Jlc3M6IDAsIGNvbnRlbnQ6IG51bGwgfSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gICBwcml2YXRlIGlzSHR0cFJlc3BvbnNlPFQ+KGV2ZW50OiBIdHRwRXZlbnQ8VD4pOiBldmVudCBpcyBIdHRwUmVzcG9uc2U8VD4ge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBQcm9ncmVzc0V2ZW50KiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICBwcml2YXRlIGlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQ6IEh0dHBFdmVudDx1bmtub3duPik6IGV2ZW50IGlzIEh0dHBQcm9ncmVzc0V2ZW50IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3MgfHwgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGVsbCdpbml6aW8gZGkgdW5hIGNoaWFtYXRhIGFkIHVuIGNlcnRvIFVSTCwgdmllbmUgZ2VuZXJhdG8gdW4gR1VJRCBkYSBhc3NlZ25hcmNpLCBjb250cm9sbGF0YSBsYSBzY2FkZW56YSBkZWxsYSBjYWNoZSwgXHJcbiAgICogZSBldmVudHVhbG1lbnRlIGxvZ2dhdG8gaWwgZmF0dG8gY2hlIHN0YSBwZXIgZXNzZXJlIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVybCBhIGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gR1VJRCBhc3NlZ25hdG8gYWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVmYXVsdFN0YXJ0Q2FsbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5nZXRHVUlEKCk7XHJcbiAgICB0aGlzLmNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsKTtcclxuICAgIHRoaXMuY2FsbFN0YXR1c1tteUd1aWRdID0geyB1cmw6IHVybCwgc3VjY2VzczogdHJ1ZSB9O1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJTdGFydGluZyBjYWxsXCIpICsgXCIgXCIgKyBteUd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwiYXQgVVJMXCIpICsgXCI6IFwiICsgdXJsKTtcclxuICAgIHJldHVybiBteUd1aWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIHVybCB2ZW5nb25vIGNvbnRyb2xsYXRlIGxlIGluZm9ybWF6aW9uaSBzdSB0dXR0aSBnbGkgdXJsIGRhIGludmFsaWRhcmUgY29sbGVnYXRpIGFsbCd1cmwgY2hpYW1hdG8gZSwgc2UgcHJlc2VudGkgaW4gY2FjaGUsIGludmFsaWRhdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBwZXIgY3VpIGNvbnRyb2xsYXJlIHNlIGNpIHNvbm8gY2hpYW1hdGUgaW4gY2FjaGUgZGEgaW52YWxpZGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmw6IHN0cmluZykge1xyXG4gICAgbGV0IGNhY2hlID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtPGFueT4odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkpO1xyXG4gICAgbGV0IHRtcCA9IC8jY2FjaGUoOj8tKFxcZCspKS9naS5leGVjKHVybCk7XHJcbiAgICBsZXQgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuICAgIGxldCBub3JtYWxpemVkVXJsX3RtcCA9ICB1cmwucmVwbGFjZShcIiNjYWNoZVwiICsgKGNhY2hlVGltZSA/IFwiLVwiICsgY2FjaGVUaW1lIDogXCJcIiksIFwiXCIpO1xyXG4gICAgbGV0IG5vcm1hbGl6ZWRVcmwgPSBub3JtYWxpemVkVXJsX3RtcC5zdWJzdHJpbmcobm9ybWFsaXplZFVybF90bXAuaW5kZXhPZignL2FwaScpKVxyXG5cclxuICAgIGlmICghY2FjaGUgfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT04gfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF0pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgYXBpc1RvSW52YWxpZGF0ZTogc3RyaW5nW10gPSB0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdO1xyXG4gICAgaWYgKCFhcGlzVG9JbnZhbGlkYXRlIHx8IGFwaXNUb0ludmFsaWRhdGUubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQga2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgYXBpc1RvSW52YWxpZGF0ZS5mb3JFYWNoKGFwaSA9PiB7XHJcbiAgICAgIGxldCBjYWNoZUtleSA9IHRoaXMubWFrZUNhY2hlS2V5KGFwaSwgbnVsbCk7XHJcbiAgICAgIGZvciAobGV0IGl0ZW0gaW4gY2FjaGUpXHJcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXhPZihjYWNoZUtleSkgIT0gLTEpXHJcbiAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChpdGVtKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrID0ga2V5c1RvUmVtb3ZlW2ldO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkludmxhbGlkYXRpbmcgY2FjaGUgZWxlbWVudFwiKSArIFwiIFwiICsgayk7XHJcbiAgICAgIGRlbGV0ZSBjYWNoZVtrXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5hbGl6emF6aW9uZSBkaSB1bmEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBHVUlEIGNvbGxlZ2F0byBhbGxhIGNoaWFtYXRhIGFwcGVuYSB0ZXJtaW5hdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RDYWNoZUlmSWRsZSBFZmZldHR1YSBpbCBwZXJzaXN0IGRlbGxhIGNhY2hlIEhUVFAgc29sbyBzZSBub24gY2kgc29ubyBhbHRyZSBjaGlhbWF0ZSBpbiBjb3JzbywgcGVyIGV2aXRhcmVcclxuICAgKiBjaGUgbWkgY2FtYmkgc290dG8gbCdvZ2dldHRvIGRpIGNhY2hlIG1lbnRyZSBzdG8gc2FsdmFuZG8gbGUgaW5mb3JtYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB0cnlGaW5hbGl6ZUJ5R3VpZChndWlkOiBzdHJpbmcsIGNhY2hlSW5mb3M/OiBDYWNoZUluZm9zKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICghdGhpcy5jYWxsU3RhdHVzW2d1aWRdID8gJ1Vua25vd24nIDogdGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIFRPRE86IFBlcmRlcmUgMy00IG9yZSBwZXIgY2FwaXJlIHBlcmNow6kgb2duaSB0YW50byBhcnJpdmEgbnVsbCBpbiBjYXNpIHBlc2FudGkgZGkgT2JzZXJ2YWJsZSBzcGFtbWF0aSBhIHJhbmRvbVxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSkge1xyXG4gICAgICAvLyBBbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMudW5zaGlmdCh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0udXJsKVxyXG4gICAgICBpZiAodGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5sZW5ndGggPiAzKVxyXG4gICAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgICAvLyBJbiBvZ25pIGNhc28gcXVlc3RhIHBvc3NvIHJpbXVvdmVybGFcclxuICAgICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgY2hpYW1hdGEgY2hlIGhhIGFnZ2lvcm5hdG8gbGEgY2FjaGUgYSB0aW1lciBvIGdsb2JhbGUgbWFyY28gaWwgZmF0dG8gY2hlIHF1ZWxsYSBjYWNoZSBkZXYnZXNzZXJlIGFnZ2lvcm5hdGFcclxuICAgIGlmIChjYWNoZUluZm9zICYmIGNhY2hlSW5mb3MuY2FjaGUpIHtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk1hcmtpbmcgY2FjaGUgdG8gYmUgcGVyc2lzdGVkIGFzIHNvb24gYXMgcG9zc2libGVcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIHVuYSBkZWxsZSBkdWUgY2FjaGUgZGV2b25vIGVzc2VyZSBhZ2dpb3JuYXRlIGUgbm9uIGhvIG5lc3N1bmEgY2hpYW1hdGEgaW4gY29yc28gZWZmZXR0dW8gbCdhZ2dpb3JuYW1lbnRvIGluIGJhc2UgYSBxdWFsZSBkZWxsZSBkdWUgdmEgYWdnaW9ybmF0YVxyXG4gICAgLy8gQWxsYSBmaW5lIGRpIHR1dHRvIG1hcmNvIGNvbWUgZmF0dG9cclxuICAgIGlmICgodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsU3RhdHVzKS5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgdmFyIHRvQ2FsbCA9IFtdO1xyXG4gICAgICBsZXQgdG1wS2V5ID0gXCJcIjtcclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJObyBtb3JlIEhUVFAgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIGVudGVyaW5nIGlkbGUgc3RhdGUgYW5kIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpICsgXCIuLi5cIik7XHJcbiAgICAgIHZhciByZXQgPSBhd2FpdCBmb3JrSm9pbih0b0NhbGwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmV0KVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVzIHN1Y2Nlc2Z1bGx5IHBlcnNpc3RlZFwiKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9ycyBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiKSk7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgZGF0byB1biB1bmljbyBGaWxlIG8gdW5hIGxpc3RhIGRpIEZpbGUgY3JlYSB1biBvZ2dldHRvIEZvcm1EYXRhIGNoZSBwdcOyIGVzc2VyZSBpbnZpYXRvIGNvbW9kYW1lbnRlIFxyXG4gICAqIGFkIHVuIGJhY2tlbmQgQVNQLk5FVCBkYSBjdWkgc2kgcG90csOgIGFjY2VkZXJlIGEgUmVxdWVzdC5Gb3JtLkZpbGVzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtGaWxlIHwgRmlsZVtdfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBGaWxlIG8gbGlzdGEgZGkgRmlsZS4gTi5COiBuZWxsYSBmaXJtYSBkZWxsYSBmdW56aW9uZSB2aWVuZSBjb25zaWRlcmF0byAqKmFueSoqIHBlciBmYXJlIHRlc3Qgc3VsbGUgcHJvcHJpZXTDoCBcclxuICAgKiBpbnZlY2UgY2hlIGZhcmUgdGVzdCBjb24gbCcqKmlzdGFuY2VvZioqXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSBGb3JtRGF0YSBjb250ZW5lbnRlIHR1dHRpIGkgZmlsZSBwYXNzYXRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZTogYW55KTogRm9ybURhdGEge1xyXG4gICAgdmFyIGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIGlmIChmaWxlQXJyYXlPckZpbGUpIHtcclxuICAgICAgaWYgKGZpbGVBcnJheU9yRmlsZS5sZW5ndGgpXHJcbiAgICAgICAgZmlsZUFycmF5T3JGaWxlLmZvckVhY2godCA9PiB7IGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgdCwgdC5uYW1lKTsgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGZpbGVBcnJheU9yRmlsZS5uYW1lKVxyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGZpbGVBcnJheU9yRmlsZSwgZmlsZUFycmF5T3JGaWxlLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgaW4gYmFzZSBhaSBwYXJhbWV0cmkgZGlzcG9uaWJpbGkgZ2VuZXJhIGdsaSBIZWFkZXIgSFRUUCBwZXIgbGEgY2hpYW1hdGEgZGEgZWZmZXR0dWFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkNvbnRlbnQtVHlwZVwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHQgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBY2NlcHRcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBdXRoIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQXV0aG9yaXphdGlvblwiLCB2YWxvcml6emF0byBjb2wgdG9rZW4gcmVjdXBlcmF0byBkYWxsJ2hvb2sgKipyZXRyaWV2ZUFjY2Vzc1Rva2VuKiogZGVsbGEgY2xhc3NlIGRpIGVzdGVuc2lvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIlgtVFgtSURcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7SHR0cEhlYWRlcnN9IEhlYWRlciBnZW5lcmF0aSBpbiBiYXNlIGFpIHBhcmFtZXRyaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SGVhZGVycyhsb2NhbGUgPSAnaXQtSVQnLCB0cmFuc2FjdGlvbklkID0gXCJcIiwgaW5jbHVkZUF1dGg6IGJvb2xlYW4gPSB0cnVlLCBjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIsIGFjY2VwdDogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpOiBIdHRwSGVhZGVycyB7XHJcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgdmFyIGF1dGh0b2tlbiA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVBY2Nlc3NUb2tlbigpO1xyXG5cclxuICAgIGlmIChjb250ZW50VHlwZSlcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcclxuXHJcbiAgICBpZiAodHJhbnNhY3Rpb25JZClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiWC1UWC1JRFwiLCB0cmFuc2FjdGlvbklkKTtcclxuXHJcbiAgICBpZiAoYXV0aHRva2VuICYmIGluY2x1ZGVBdXRoKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgYXV0aHRva2VuKTtcclxuXHJcbiAgICBpZiAoYWNjZXB0KVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHRcIiwgYWNjZXB0KTtcclxuXHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHQtTGFuZ3VhZ2VcIiwgbG9jYWxlKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZVtjYWNoaW5nS2V5XSAmJiAhdGhpcy50aW1lZENhY2hlSXRlbUV4cGlyZWQoY2FjaGVbY2FjaGluZ0tleV0pKSB7XHJcbiAgICAgICAgLy8gU2UgZ2VzdGlzY28gaWwgdGVtcG8gZXNhdHRvIGRlbGxhIGNhY2hlIHByaW1hIGRpIHJlc3RpdHVpcmUgbCdvZ2dldHRvIGNhY2hhdG8gbG8gcmlwdWxpc2NvIFxyXG4gICAgICAgIC8vIGRhbGxlIHByb3ByaWV0w6AgaW50ZXJuZSBjaGUgZ2xpIGhvIGFnZ2l1bnRvIHBlciBjb250cm9sbGFybmUgbGEgc2NhZGVuemFcclxuICAgICAgICBpZiAoY2FjaGVUaW1lKVxyXG4gICAgICAgICAgZGVsZXRlIGNhY2hlW2NhY2hpbmdLZXldLl9fZXhwaXJlO1xyXG5cclxuICAgICAgICBpdGVtID0gY2FjaGVbY2FjaGluZ0tleV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlciBhc3NpY3VyYXJtaSBjaGUgaWwgcmlmZWlybWVudG8gZGVnbGkgb2dnZXR0aSBzaWEgZGl2ZXJzbyB1dGlsaXp6byBpbCBkZWVwQ2xvbmVcclxuICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvcyh1cmwsIHVzZUNhY2hpbmcsIGNhY2hpbmdLZXksIGNhY2hlVGltZSwgdGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExvY2FsSXRlbShjYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBcInNlY29uZFwiKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkaSBleHBpcmUgZGVmaW5pdG9cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVGltZWRDYWNoZVN0b3JhZ2UoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gICBwcml2YXRlIG1ha2VDYWNoZUtleSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIHRoaXMubWUgPSB0aGlzLm1lIHx8IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG5cclxuICAgIGxldCBhdXRoS2V5UGFydCA9ICh0aGlzLm1lID8gdGhpcy5tZS5JZHRlbmFudCA6IFwiXCIpICsgKHRoaXMubWUgJiYgdGhpcy5DQUNIRV9CWV9VU0VSID8gdGhpcy5tZS5JZFVzZXIgOiBcIlwiKTtcclxuICAgIGxldCBwYXJhbXNLZXlQYXJ0ID0gcGFyYW1zICYmIHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCA/IHBhcmFtcy5rZXlzKCkucmVkdWNlKChwcmV2OiBhbnksIG5leHQ6IGFueSkgPT4gcHJldiArIFwiLFwiICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIFwiX1wiICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihcImFwaVwiKSArIDQpICsgXCI/XCIgKyBwYXJhbXNLZXlQYXJ0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhemlvbmUgR1VJRFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE51b3ZvIEdVSUQgZ2VuZXJhdG8gaW4gbWFuaWVyYSBjYXN1YWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzY3JpdmVyZSBsb2cgYSBjb25zb2xlIHF1YWxvcmEgKipERUJVR19NT0RFKiogcmlzdWx0YXNzZSAqKnRydWUqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkaSBsb2dcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkhUVFBfREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIFRvZ2xpYW1vIHZlbG9jZW1lbnRlIHN0ZSBsb2NhbGl6emF6aW9uaSBpbnV0aWxpLi4uLlxyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgcGVyIGxhbmNpYXJlIGxhIHNlbGV6aW9uZSBkaSB0dXR0byBxdWVsbG8gY2hlIMOoIHJlbGF0aXZvIGEgdW4gYXBpIGRpIHJpY2VyY2EgY29uIEFwcFNlYXJjaCAoZGkgY3VpIG5vbiB1dGlsaXp6byBpbCB0aXBvIHZlcm8gcGVyIHJpZHVycmUgbGUgZGlwZW5kZW56ZSlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0QWxsPFQ+KHZpZXc6IHsgaXRlbXM6IFRbXSwgcGFnZTogbnVtYmVyLCBpdGVtc3BlcnBhZ2VvdmVycmlkZTogbnVtYmVyLCBzZWxlY3Rpb246IHsgZXhjbHVzaW9uczogVFtdLCBhbGw6IGJvb2xlYW4sIGl0ZW1zOiBUW10gfSB9LCBhcGk6IHN0cmluZywgcGFycz86IEh0dHBQYXJhbXMsIHRyYW5zYWN0aW9uPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxUW10+IHtcclxuICAgIGlmICghdmlldy5zZWxlY3Rpb24uYWxsKVxyXG4gICAgICByZXR1cm4gb2Yodmlldy5zZWxlY3Rpb24uaXRlbXMpO1xyXG5cclxuICAgIHZhciBqc29uVmlldyA9IHRoaXMudXRpc0V4dHMuZGVlcENsb25lKHZpZXcpO1xyXG4gICAganNvblZpZXcucGFnZSA9IDE7XHJcbiAgICBqc29uVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSA9IDk5OTk5OTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wb3N0PHsgaXRlbXM6IFRbXSwgc2VsZWN0aW9uOiB7IGV4Y2x1c2lvbnM6IFRbXSB9IH0+KGFwaSwganNvblZpZXcsIHBhcnMsIHRyYW5zYWN0aW9uKS5waXBlKG1hcDx7IGl0ZW1zOiBUW10sIHNlbGVjdGlvbjogeyBleGNsdXNpb25zOiBUW10gfSB9LCBUW10+KHJlcyA9PiB7XHJcbiAgICAgIGxldCBpdGVtcyA9IDxUW10+cmVzLml0ZW1zO1xyXG4gICAgICBpdGVtcy5mb3JFYWNoKHQgPT4gKDxhbnk+dCkuaGFzaCA9IHRoaXMuaGFzaC5oYXNoT2JqZWN0KHQsIG51bGwsIGZhbHNlKSk7XHJcbiAgICAgIGlmIChyZXMuc2VsZWN0aW9uLmV4Y2x1c2lvbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKHQ6IGFueSkgPT4gIXJlcy5zZWxlY3Rpb24uZXhjbHVzaW9ucy5maW5kKChlOiBhbnkpID0+IHRoaXMuaGFzaC5oYXNoT2JqZWN0KGUsIG51bGwsIGZhbHNlKSA9PSB0Lmhhc2gpKTtcclxuICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRSQU5TQUNUSU9OIEhFTFBFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gIHByaXZhdGUgR0VUX1RyYW5zX0JlZ2luVHJhbnM6IHN0cmluZyA9IFwiL2FwaS9UcmFucy9CZWdpblRyYW5zXCI7XHJcbiAgcHJpdmF0ZSBHRVRfVHJhbnNfQ2hlY2tFeGVjdXRpb246IHN0cmluZyA9IFwiL2FwaS9UcmFucy9DaGVja0V4ZWN1dGlvblwiO1xyXG4gIHByaXZhdGUgR0VUX1RyYW5zX0VuZFRyYW5zOiBzdHJpbmcgPSBcIi9hcGkvVHJhbnMvRW5kVHJhbnNcIjtcclxuXHJcbiAgcHVibGljIGJlZ2luVHJhbnNhY3Rpb24oZXhlY3V0aW9uS2V5OiBzdHJpbmcsIHNlY29uZHNUaW1lb3V0PzogbnVtYmVyKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHRoaXMubG9nKFwiYmVnaW5UcmFuc2FjdGlvbiBjYWxsIHJlY2VpdmVkOiBcIiArIGV4ZWN1dGlvbktleSk7XHJcbiAgICB2YXIgcGFycyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiZXhlY3V0aW9uS2V5XCIsIGV4ZWN1dGlvbktleSk7XHJcbiAgICBpZiAoc2Vjb25kc1RpbWVvdXQpXHJcbiAgICAgIHBhcnMgPSBwYXJzLnNldChcInNlY29uZHNUaW1lb3V0XCIsIHNlY29uZHNUaW1lb3V0LnRvU3RyaW5nKCkpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0PHN0cmluZz4odGhpcy5HRVRfVHJhbnNfQmVnaW5UcmFucywgcGFycyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tUcmFuc2FjdGlvbihleGVjdXRpb25LZXk6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcblxyXG4gICAgdGhpcy5sb2coXCJjaGVja1RyYW5zYWN0aW9uIGNhbGwgcmVjZWl2ZWQ6IFwiICsgZXhlY3V0aW9uS2V5KTtcclxuICAgIHJldHVybiB0aGlzLmdldDxudW1iZXI+KHRoaXMuR0VUX1RyYW5zX0NoZWNrRXhlY3V0aW9uLCBuZXcgSHR0cFBhcmFtcygpLnNldChcImV4ZWN1dGlvbktleVwiLCBleGVjdXRpb25LZXkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbktleTogc3RyaW5nLCB0cmFuc2FjdGlvblJlc3VsdDogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICB0aGlzLmxvZyhcImVuZFRyYW5zYWN0aW9uIGNhbGwgcmVjZWl2ZWQ6IFwiICsgdHJhbnNhY3Rpb25LZXkgKyBcIiBDb21taXQ6IFwiICsgdHJhbnNhY3Rpb25SZXN1bHQpO1xyXG4gICAgbGV0IHBhcnMgPSBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkdHJhbnNcIiwgdHJhbnNhY3Rpb25LZXkpLnNldChcInN1Y2Nlc3NcIiwgdHJhbnNhY3Rpb25SZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXQ8c3RyaW5nPih0aGlzLkdFVF9UcmFuc19FbmRUcmFucywgcGFycyk7XHJcbiAgfVxyXG59Il19