aril 2.0.1-dev.1 → 2.0.1-dev.3

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,6 +1,6 @@
1
1
  import { Location, LocationStrategy } from '@angular/common';
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { APP_INITIALIZER, ApplicationRef, createComponent, createEnvironmentInjector, importProvidersFrom, isDevMode, ɵINJECTOR_SCOPE } from '@angular/core';
3
+ import { APP_INITIALIZER, ApplicationRef, EnvironmentInjector, createComponent, createEnvironmentInjector, importProvidersFrom, inject, isDevMode, ɵINJECTOR_SCOPE } from '@angular/core';
4
4
  import { createApplication } from '@angular/platform-browser';
5
5
  import { RouteReuseStrategy, Router, UrlSerializer, provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router';
6
6
  import { ConfirmationService, MessageService, PrimeNGConfig } from 'primeng/api';
@@ -111,9 +111,41 @@ export const boot = (_appName, _routes, _menuItems) => {
111
111
  // detection almaz. AppComponent'i biz açıkça `sharedAppRef.attachView` ile bağladığımız için
112
112
  // çalışır; ama `inject(ApplicationRef)` yapan üçüncü taraf kod (PrimeNG `DialogService` →
113
113
  // `this.appRef.attachView`) child-local sahte appRef'i alıp dialog'u ona bağlıyordu → dialog
114
- // yaratılıyor ama `*ngIf="visible"` hiç render edilmiyordu (boş açılıyordu). Gerçek (tek,
115
- // tick alan) `sharedAppRef`'e sabitliyoruz.
116
- { provide: ApplicationRef, useFactory: () => sharedAppRef },
114
+ // yaratılıyor ama `*ngIf="visible"` hiç render edilmiyordu (boş açılıyordu).
115
+ //
116
+ // Çözüm `sharedAppRef`'i saran Proxy: TÜM üyeler (attachView/detachView/tick/components…)
117
+ // gerçek `sharedAppRef`'e delege olur (method'lar `target`'a bind'li → private field dahil
118
+ // doğru `this`), TEK fark `.injector` → bu tab'ın child injector'ı. Neden kritik: PrimeNG
119
+ // `DialogService` dialog'u `createComponent(..., { environmentInjector: this.appRef.injector })`
120
+ // ile yaratır. Düz `sharedAppRef` dönersek dialog içeriği shared ROOT'ta çözülür, sayfa ise
121
+ // child injector'da → `providedIn:'root'` her servis İKİ ayrı instance olur (split-brain) ve
122
+ // BehaviorSubject tabanlı sayfa↔dialog state senkronize OLMAZ (seçili kayıt dialog'da null).
123
+ // `.injector`'ı child'a yönlendirince dialog içeriği sayfayla AYNI injector'da çözer → otomatik
124
+ // tek instance, TÜM (mevcut+gelecek) servisler için — servis listesi tutmaya gerek yok.
125
+ // `attachView` yine `sharedAppRef`'e gittiği için tek tick döngüsü/change detection korunur.
126
+ {
127
+ provide: ApplicationRef,
128
+ useFactory: () => {
129
+ const tabInjector = inject(EnvironmentInjector);
130
+ return new Proxy(sharedAppRef, {
131
+ get(target, prop) {
132
+ if (prop === 'injector')
133
+ return tabInjector;
134
+ // `ngOnDestroy`'u GİZLE (undefined döndür). Aksi halde `inject(ApplicationRef)`
135
+ // yapan tab child injector'ı (PrimeNG DialogService veya aşağıdaki dev guard)
136
+ // proxy'yi kendi `_ngOnDestroyHooks`'una kaydeder (R3Injector.hydrate →
137
+ // hasOnDestroy=true) ve tab kapanışında `childInjector.destroy()` →
138
+ // `sharedAppRef.ngOnDestroy()` → açık TÜM tab'ların view'larını destroy edip
139
+ // shared app'i öldürür. Shared app'in lifecycle'ı bootstrap'a aittir, tab'a değil
140
+ // (gerçek `sharedAppRef.ngOnDestroy` etkilenmez; yalnızca proxy üzerinden gizlenir).
141
+ if (prop === 'ngOnDestroy')
142
+ return undefined;
143
+ const value = Reflect.get(target, prop, target);
144
+ return typeof value === 'function' ? value.bind(target) : value;
145
+ }
146
+ });
147
+ }
148
+ },
117
149
  // Tarama (log15) ile saptanan, child-local olunca bozulan ek `providedIn:'root'` servisleri:
118
150
  // • PubSubService — MFE'nin `breadcrumbUpdated` event'i host `history.service`'e ulaşmalı;
119
151
  // child-local olunca MFE↔host event köprüsü kopuyordu.
@@ -166,6 +198,14 @@ export const boot = (_appName, _routes, _menuItems) => {
166
198
  console.error(`[boot:${_appName}] HİBRİT İZOLASYON BOZULDU: child Router shared root ile aynı instance! ` +
167
199
  `ɵINJECTOR_SCOPE davranışı değişmiş olabilir (Angular upgrade?) — tab izolasyonu çalışmaz.`);
168
200
  }
201
+ // [Dialog injector köprüsü guard — kalıcı] ApplicationRef proxy'sinin `.injector`'ı bu
202
+ // tab'ın child injector'ını göstermeli; aksi halde PrimeNG DialogService dialog içeriğini
203
+ // shared root'ta çözer → sayfa↔dialog `providedIn:'root'` split-brain geri döner. PrimeNG
204
+ // ya da Angular upgrade'i `appRef.injector` kullanımını değiştirirse burada yakalanır.
205
+ if (isDevMode() && this.childInjector.get(ApplicationRef).injector !== this.childInjector) {
206
+ console.error(`[boot:${_appName}] DIALOG INJECTOR KÖPRÜSÜ BOZULDU: ApplicationRef.injector tab child ` +
207
+ `injector'ı göstermiyor — dialog içeriği sayfadan farklı injector'da çözülür (split-brain).`);
208
+ }
169
209
  // AppComponent'i child injector context'inde yarat → inject(Router)/LocationStrategy
170
210
  // child-local; inject(MfeBridge)/HttpClient/Keycloak/TranslocoService vb. parent'tan
171
211
  // paylaşımlı. `attachView` shared app'in change detection döngüsüne bağlar. (`bootstrap`
@@ -232,4 +272,4 @@ export const boot = (_appName, _routes, _menuItems) => {
232
272
  throw e;
233
273
  }
234
274
  };
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNOLGVBQWUsRUFFZixjQUFjLEVBS2QsZUFBZSxFQUNmLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsU0FBUyxFQUNULGVBQWUsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBRU4sa0JBQWtCLEVBQ2xCLE1BQU0sRUFFTixhQUFhLEVBQ2IsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFRLHdCQUF3QixFQUFrQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsTUFBTSxDQUFDLElBQUksT0FBYSxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBcUIsRUFBRSxDQUFDO0FBRTVDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBYyxFQUFFLE9BQWUsRUFBRSxVQUE0QixFQUFFLEVBQUU7SUFDckYsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUFFLE9BQU87SUFDOUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV6QixPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ25CLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFFdkI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxnQkFBZ0IsR0FBc0I7UUFDM0MsU0FBUyxFQUFFO1lBQ1YsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDN0MsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNyQixTQUFTLEVBQUU7WUFDWDtnQkFDQyxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsVUFBVSxFQUFFLENBQUMsVUFBc0IsRUFBRSxRQUF5QixFQUFFLFVBQWlDLEVBQUUsRUFBRTtvQkFDcEcsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUE2QixDQUFDLENBQUM7b0JBQzlGLE1BQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxDQUFDO29CQUNyQyxPQUFPLEtBQUssSUFBSSxFQUFFO3dCQUNqQixNQUFNLFVBQVUsRUFBRSxDQUFDO3dCQUNuQixjQUFjLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7YUFDbkQ7WUFDRCxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqRCxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO1NBQzdEO0tBQ0QsQ0FBQztJQUVGOzs7Ozs7Ozs7T0FTRztJQUNILElBQUksWUFBWSxHQUEwQixJQUFJLENBQUM7SUFDL0MsSUFBSSxnQkFBZ0IsR0FBbUMsSUFBSSxDQUFDO0lBRTVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsTUFBTSxjQUFjLEdBQTJDO1FBQzlELEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO1FBQzlDLGFBQWEsQ0FDWixPQUFPLEVBQ1AseUJBQXlCLEVBQUUsRUFDM0IsZ0JBQWdCLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUNuRDtRQUNELEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRTtRQUNqRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtRQUN6QyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDdEUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRTtRQUM5RCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUM3RiwyRkFBMkY7UUFDM0Ysd0ZBQXdGO1FBQ3hGLDRGQUE0RjtRQUM1Riw2RkFBNkY7UUFDN0YsMEZBQTBGO1FBQzFGLDZGQUE2RjtRQUM3RiwwRkFBMEY7UUFDMUYsNENBQTRDO1FBQzVDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxFQUFFO1FBQzVELDZGQUE2RjtRQUM3RiwyRkFBMkY7UUFDM0YseURBQXlEO1FBQ3pELHlGQUF5RjtRQUN6RiwwRkFBMEY7UUFDMUYseUZBQXlGO1FBQ3pGLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDdkYsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUN2RiwwRkFBMEY7UUFDMUYsdUZBQXVGO1FBQ3ZGLHFHQUFxRztRQUNyRyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3pGLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO0tBQ25HLENBQUM7SUFFRixNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFFakQsTUFBTSxhQUFjLFNBQVEsV0FBVztRQUF2Qzs7WUFDUyxrQkFBYSxHQUErQixJQUFJLENBQUM7WUFDakQsWUFBTyxHQUFpQyxJQUFJLENBQUM7WUFDN0Msb0JBQWUsR0FBRyxLQUFLLENBQUM7WUFDeEIsaUJBQVksR0FBeUMsSUFBSSxDQUFDO1FBMkZuRSxDQUFDO1FBekZBLEtBQUssQ0FBQyxpQkFBaUI7WUFDdEIsMkVBQTJFO1lBQzNFLG1FQUFtRTtZQUNuRSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsT0FBTztZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUM7Z0JBQ0osaUZBQWlGO2dCQUNqRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdkIsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDMUYsWUFBWSxHQUFHLE1BQU0sQ0FBQztnQkFFdEIsOERBQThEO2dCQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyx5QkFBeUIsQ0FDN0MsY0FBYyxFQUNkLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsT0FBTyxRQUFRLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUN2QyxDQUFDO2dCQUVGLG1GQUFtRjtnQkFDbkYsOEVBQThFO2dCQUM5RSxxRkFBcUY7Z0JBQ3JGLHNGQUFzRjtnQkFDdEYsSUFBSSxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNuRixPQUFPLENBQUMsS0FBSyxDQUNaLFNBQVMsUUFBUSwwRUFBMEU7d0JBQzFGLDJGQUEyRixDQUM1RixDQUFDO2dCQUNILENBQUM7Z0JBRUQscUZBQXFGO2dCQUNyRixxRkFBcUY7Z0JBQ3JGLHlGQUF5RjtnQkFDekYsaUZBQWlGO2dCQUNqRiwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLFlBQXFCLEVBQUU7b0JBQ3JELG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhO29CQUN2QyxXQUFXLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekMsc0ZBQXNGO2dCQUN0RixtRkFBbUY7Z0JBQ25GLGtFQUFrRTtnQkFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDOUIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLFFBQVEsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixxRkFBcUY7Z0JBQ3JGLHVGQUF1RjtnQkFDdkYsOEVBQThFO2dCQUM5RSxrRkFBa0Y7Z0JBQ2xGLElBQUksQ0FBQyxZQUFZO29CQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM1QyxDQUFDO1FBQ0YsQ0FBQztRQUVELG9CQUFvQjtZQUNuQixtRkFBbUY7WUFDbkYsbUZBQW1GO1lBQ25GLGdGQUFnRjtZQUNoRiw2RUFBNkU7WUFDN0UsTUFBTSxZQUFZLEdBQUksSUFBK0QsQ0FBQywwQkFBMEIsQ0FBQztZQUNqSCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNsQixPQUFPO1lBQ1IsQ0FBQztZQUNELGlGQUFpRjtZQUNqRiwrRUFBK0U7WUFDL0UsSUFBSSxJQUFJLENBQUMsWUFBWTtnQkFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsUUFBUSxrREFBa0QsQ0FBQyxDQUFDO29CQUNqRixrRkFBa0Y7b0JBQ2xGLElBQUksWUFBWTt3QkFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUNEO0lBRUQsSUFBSSxDQUFDO1FBQ0osY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFlBQVksWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztZQUNqRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsT0FBTyxnREFBZ0QsQ0FBQyxDQUFDO1lBQy9FLE9BQU87UUFDUixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVCxDQUFDO0FBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24sIExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG5cdEFQUF9JTklUSUFMSVpFUixcclxuXHRBcHBsaWNhdGlvbkNvbmZpZyxcclxuXHRBcHBsaWNhdGlvblJlZixcclxuXHRDb21wb25lbnRSZWYsXHJcblx0RW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRFbnZpcm9ubWVudFByb3ZpZGVycyxcclxuXHRQcm92aWRlcixcclxuXHRjcmVhdGVDb21wb25lbnQsXHJcblx0Y3JlYXRlRW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRpbXBvcnRQcm92aWRlcnNGcm9tLFxyXG5cdGlzRGV2TW9kZSxcclxuXHTJtUlOSkVDVE9SX1NDT1BFXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7XHJcblx0Q2hpbGRyZW5PdXRsZXRDb250ZXh0cyxcclxuXHRSb3V0ZVJldXNlU3RyYXRlZ3ksXHJcblx0Um91dGVyLFxyXG5cdFJvdXRlcyxcclxuXHRVcmxTZXJpYWxpemVyLFxyXG5cdHByb3ZpZGVSb3V0ZXIsXHJcblx0d2l0aENvbXBvbmVudElucHV0QmluZGluZyxcclxuXHR3aXRoUm91dGVyQ29uZmlnXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBQcmltZU5HQ29uZmlnIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBNb25hY29FZGl0b3JNb2R1bGUsIE5HWF9NT05BQ09fRURJVE9SX0NPTkZJRyB9IGZyb20gJ25neC1tb25hY28tZWRpdG9yLXYyJztcclxuXHJcbmltcG9ydCB7IGNyZWF0ZUJhc2VBcHBDb25maWcgfSBmcm9tICdhcmlsL2Jvb3QvYmFzZSc7XHJcbmltcG9ydCB7IHNldEFwaUNvbmZpZ09uTUZFTW9kZSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBpJztcclxuaW1wb3J0IHsgQXBwcywgQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5LCBQbHVnaW5NZW51SXRlbSwgVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuaW1wb3J0IHsgZ2V0Tmdab25lLCBsb2FkUGx1Z2lucyB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvcGx1Z2lucyc7XHJcbmltcG9ydCB7IGkxOG5Gb2xkZXJOYW1lIH0gZnJvbSAnYXJpbC9pMThuJztcclxuaW1wb3J0IHsgcHJvdmlkZUhvc3QgfSBmcm9tICdhcmlsL3Byb3ZpZGVyJztcclxuaW1wb3J0IHsgUHViU3ViU2VydmljZSB9IGZyb20gJ2FyaWwvdXRpbC9wdWItc3ViJztcclxuXHJcbmltcG9ydCB7IGFwcENvbXBvbmVudExvYWRlciB9IGZyb20gJy4vYXBwQ29tcG9uZW50TG9hZGVyJztcclxuaW1wb3J0IHsgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9pc29sYXRlZC1sb2NhdGlvbi1zdHJhdGVneSc7XHJcbmltcG9ydCB7IG1vbmFjb0NvbmZpZyB9IGZyb20gJy4vbW9uYWNvLmNvbmZpZyc7XHJcblxyXG5leHBvcnQgdmFyIGFwcE5hbWU6IEFwcHM7XHJcbmV4cG9ydCB2YXIgbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdID0gW107XHJcblxyXG4vKipcclxuICogYGJvb3RgIMOnYcSfcsSxbGFyxLFuxLFuIGlkZW1wb3RlbnQga2FsbWFzxLFuxLEgc2HEn2xheWFuIHN5bmMgZ3VhcmQuIEF5bsSxIHJlbW90ZSBpw6dpblxyXG4gKiBiaXJkZW4gZmF6bGEgcGFyYWxlbCBgYm9vdCgnd2RtJywgLi4uKWAgw6dhxJ9yxLFzxLEgZ2VsZGnEn2luZGUsIGlsayBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYFxyXG4gKiB0YW1hbWxhbm1hZGFuIGlraW5jaSDDp2HEn3LEsSBgY3VzdG9tRWxlbWVudHMuZ2V0YCBndWFyZCfEsW7EsSBnZcOnaXlvcmR1IOKGkiBoZXIgaWtpc2kgZGVcclxuICogZGVmaW5lIGV0bWV5ZSDDp2FsxLHFn8SxcCBgTm90U3VwcG9ydGVkRXJyb3I6IHRoZSBuYW1lIFwiYXBwLXdkbVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZGBcclxuICogaGF0YXPEsSBmxLFybGF0xLFsxLF5b3JkdS4gU2V0IGlsZSBzeW5jIG1hcmsgZWRlcmVrIHRlayBiaXIgZGVmaW5lIGN5Y2xlJ8SxIGdhcmFudGkgZWRpeW9ydXouXHJcbiAqL1xyXG5jb25zdCBib290ZWRBcHBzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG5leHBvcnQgY29uc3QgYm9vdCA9IChfYXBwTmFtZTogQXBwcywgX3JvdXRlczogUm91dGVzLCBfbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdKSA9PiB7XHJcblx0aWYgKGJvb3RlZEFwcHMuaGFzKF9hcHBOYW1lKSB8fCBjdXN0b21FbGVtZW50cy5nZXQoYGFwcC0ke19hcHBOYW1lfWApKSByZXR1cm47XHJcblx0Ym9vdGVkQXBwcy5hZGQoX2FwcE5hbWUpO1xyXG5cclxuXHRhcHBOYW1lID0gX2FwcE5hbWU7XHJcblx0bWVudUl0ZW1zID0gX21lbnVJdGVtcztcclxuXHJcblx0LyoqXHJcblx0ICogKipQYXlsYcWfxLFsYW4gYmFzZSBjb25maWcqKiDigJQgcmVtb3RlIGJhxZ/EsW5hIFRFSyBgY3JlYXRlQXBwbGljYXRpb25gLiBBxJ/EsXIgc2VydmlzbGVyXHJcblx0ICogKEh0dHBDbGllbnQgKyBpbnRlcmNlcHRvciBjaGFpbiwgS2V5Y2xvYWssIGkxOG4vVHJhbnNsb2NvLCBNb25hY28sIGFuaW1hdGlvbnMpIGJ1cmFkYVxyXG5cdCAqIHlhxZ9hcjsgYHByb3ZpZGVkSW5gIHRhxZ/EsW1heWFuIGV4cGxpY2l0IHByb3ZpZGVyIG9sZHVrbGFyxLEgacOnaW4gdMO8bSB0YWInbGFyxLFuIGNoaWxkXHJcblx0ICogaW5qZWN0b3InbGFyxLFuZGFuIHBhcmVudCBvbGFyYWsgcGF5bGHFn8SxbMSxciDihpIgUkFNIGxpbmVlciBiw7x5w7xtZXouIFJvdXRlci9Mb2NhdGlvbi9cclxuXHQgKiBSZXVzZVN0cmF0ZWd5L1VybFNlcmlhbGl6ZXIgYnVyYWRhIFlPSzsgb25sYXIgdGFiIGJhxZ/EsW5hIGl6b2xlIGNoaWxkIGluamVjdG9yJ2RhIHZlcmlsaXIuXHJcblx0ICovXHJcblx0Y29uc3Qgc2hhcmVkQmFzZUNvbmZpZzogQXBwbGljYXRpb25Db25maWcgPSB7XHJcblx0XHRwcm92aWRlcnM6IFtcclxuXHRcdFx0Y3JlYXRlQmFzZUFwcENvbmZpZyh7IGkxOG5Gb2xkZXI6IF9hcHBOYW1lIH0pLFxyXG5cdFx0XHRwcm92aWRlSG9zdChfYXBwTmFtZSksXHJcblx0XHRcdGdldE5nWm9uZSgpLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxyXG5cdFx0XHRcdHVzZUZhY3Rvcnk6IChodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlLCBmb2xkZXJOYW1lOiB0eXBlb2YgaTE4bkZvbGRlck5hbWUpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkFwaUluaXQgPSBzZXRBcGlDb25maWdPbk1GRU1vZGUoaHR0cENsaWVudCwga2V5Y2xvYWssIGZvbGRlck5hbWUgYXMgdW5rbm93biBhcyBBcHBzKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkxvYWRQbHVnaW5zID0gbG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdHJldHVybiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bkFwaUluaXQoKTtcclxuXHRcdFx0XHRcdFx0cnVuTG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRtdWx0aTogdHJ1ZSxcclxuXHRcdFx0XHRkZXBzOiBbSHR0cENsaWVudCwgS2V5Y2xvYWtTZXJ2aWNlLCBpMThuRm9sZGVyTmFtZV1cclxuXHRcdFx0fSxcclxuXHRcdFx0aW1wb3J0UHJvdmlkZXJzRnJvbShNb25hY29FZGl0b3JNb2R1bGUuZm9yUm9vdCgpKSxcclxuXHRcdFx0eyBwcm92aWRlOiBOR1hfTU9OQUNPX0VESVRPUl9DT05GSUcsIHVzZVZhbHVlOiBtb25hY29Db25maWcgfVxyXG5cdFx0XVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW90ZSBiYcWfxLFuYSBURUsgcGF5bGHFn8SxbGFuIGBBcHBsaWNhdGlvblJlZmAg4oCUIGNsb3N1cmUtc2NvcGUuIMSwbGsgYDxhcHAtJHthcHBOYW1lfT5gXHJcblx0ICogZWxlbWVudCdpIGBjcmVhdGVBcHBsaWNhdGlvbihzaGFyZWRCYXNlQ29uZmlnKWAgw6dhxJ/EsXLEsXIsIHNvbnJha2kgdMO8bSBlbGVtZW50J2xlciBheW7EsVxyXG5cdCAqIHByb21pc2UnxLEgYmVrbGVyIChkdXBsaWNhdGUgQXBwbGljYXRpb24geWFyYXTEsW3EsSBpbWvDom5zxLF6KS4gSGVyIGVsZW1lbnQga2VuZGkgY2hpbGRcclxuXHQgKiBpbmplY3RvciArIGBjcmVhdGVDb21wb25lbnRgIGlsZSBrZW5kaSBgQXBwQ29tcG9uZW50YCB2aWV3J8SxbsSxIHlhcmF0xLFwIHNoYXJlZCBhcHAnZVxyXG5cdCAqIGBhdHRhY2hWaWV3YCBpbGUgYmHEn2xhci4gU2hhcmVkIGFwcCB1enVuIMO2bcO8cmzDvGTDvHIgKHRhYidsYXIga2FwYW5zYSBkYSBkZXN0cm95IGVkaWxtZXopLlxyXG5cdCAqXHJcblx0ICogYGNoaWxkUHJvdmlkZXJzYCd0YWtpIGBUcmFuc2xvY29TZXJ2aWNlYCBmYWN0b3J5J3NpIGJ1IHJlZmVyYW5zxLEga3VsbGFuZMSxxJ/EsSBpw6dpblxyXG5cdCAqIGBjaGlsZFByb3ZpZGVyc2AndGFuIMOWTkNFIHRhbsSxbWxhbsSxciAoZm9yd2FyZCBURFoneWkgw7ZubGVyKS5cclxuXHQgKi9cclxuXHRsZXQgc2hhcmVkQXBwUmVmOiBBcHBsaWNhdGlvblJlZiB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBzaGFyZWRBcHBQcm9taXNlOiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiAqKlRhYiBiYcWfxLFuYSBpem9sZSBSb3V0ZXIgc3RhY2sqKiDigJQgaGVyIGA8YXBwLSR7YXBwTmFtZX0+YCBrZW5kaSBjaGlsZFxyXG5cdCAqIGBFbnZpcm9ubWVudEluamVjdG9yYCfEsW5kYSBidW5sYXLEsSBhbMSxci4gYMm1SU5KRUNUT1JfU0NPUEU6ICdyb290J2AgY2hpbGQnxLEgJ3Jvb3QnXHJcblx0ICogc2NvcGUgeWFwYXIgKEFuZ3VsYXIgYFIzSW5qZWN0b3JgIGN0b3I6IGBzY29wZXMuYWRkKCdyb290JylgKTsgYsO2eWxlY2UgYHByb3ZpZGVSb3V0ZXJgJ8SxblxyXG5cdCAqIGluamVjdCBldHRpxJ9pIGBwcm92aWRlZEluOidyb290J2AgUm91dGVyIHNlcnZpc2xlcmkg4oCUIGBSb3V0ZXJgLCBgQ2hpbGRyZW5PdXRsZXRDb250ZXh0c2AsXHJcblx0ICogYExvY2F0aW9uYCwgYE5hdmlnYXRpb25UcmFuc2l0aW9uc2AgdmIuIOKAlCBjaGlsZC1MT0NBTCDDvHJldGlsaXIuIFNvbnXDpzogaGVyIHRhYiBrZW5kaVxyXG5cdCAqIFJvdXRlciArIGtlbmRpIGBSb3V0ZXJPdXRsZXRgIGNvbnRleHQnaW5lIHNhaGlwIG9sdXIg4oaSICoqMSBSb3V0ZXIgOiAxIG91dGxldCoqLlxyXG5cdCAqXHJcblx0ICogTmVkZW4gZ2VyZWtsaTogcGF5bGHFn8SxbGFuIHRlayBBcHBsaWNhdGlvbidkYSBOIGA8cm91dGVyLW91dGxldD5gIGF5bsSxIHRla1xyXG5cdCAqIGBDaGlsZHJlbk91dGxldENvbnRleHRzYCdlIFwicHJpbWFyeVwiIGRpeWUga2F5ZG9sdXAgYmlyYmlyaW5pIGV6aXlvcmR1IChgY29udGV4dHMuc2V0YFxyXG5cdCAqIG92ZXJ3cml0ZSkg4oaSIHRhYiBnZcOnacWfaSBzb25yYXPEsSBheW7EsSB0YWIgacOnaSBuYXZpZ2FzeW9uIChsaXN04oaSZGV0YWlsKSB5YW5sxLHFnyBvdXRsZXQnZVxyXG5cdCAqIHJlbmRlciBvbHV5b3JkdS4gQ2hpbGQtaW5qZWN0b3IgaXpvbGFzeW9udSBidW51IGvDtmt0ZW4gw6fDtnplci5cclxuXHQgKlxyXG5cdCAqICoqVHJhbnNsb2NvU2VydmljZSBpc3Rpc25hc8SxKio6IGAncm9vdCdgIHNjb3BlIG9udSBkYSBjaGlsZC1sb2NhbCB5YXBhcmTEsTsgYW1hIGdsb2JhbFxyXG5cdCAqIChzY29wZSdzdXopIMOnZXZpcmlsZXIgc2hhcmVkIGFwcCdpbiBpbml0IGFrxLHFn8SxbmRhIHnDvGtsZW5kacSfaW5kZW4g4oCUIGBjcmVhdGVDb21wb25lbnRgXHJcblx0ICogYEFQUF9JTklUSUFMSVpFUmAgw6dhbMSxxZ90xLFybWF6IOKAlCBjaGlsZC1sb2NhbCBzZXJ2aWNlJ2luIGdsb2JhbCBjYWNoZSdpIGJvxZ8ga2FsxLFwIGhhbSBrZXlcclxuXHQgKiBnw7ZzdGVyaXlvcmR1LiBUYWIgYmHFn8SxbmEgYXlyxLEgZGlsIHNlbmFyeW9zdSB5b2s7IHNlcnZpY2UnaSBzaGFyZWQgYXBwJ3RlbiBwYXlsYcWfdMSxcsSxeW9ydXpcclxuXHQgKiAoZ2xvYmFsIMOnZXZpcmkgdGVrIHllcmRlIHnDvGtsZW5pciwgdGVrIHRyYW5zbGF0aW9uIGNhY2hlIOKGkiBlayBSQU0ga2F6YW5jxLEpLiBTY29wZSDDp2V2aXJpbGVyaVxyXG5cdCAqIChgcHJvdmlkZWkxOG5TY29wZWApIGNvbXBvbmVudC1sZXZlbCBzYcSfbGFuZMSxxJ/EsSBpw6dpbiBwYXlsYcWfxLFsYW4gc2VydmljZSdsZSBkZSDDp2FsxLHFn8Sxci5cclxuXHQgKlxyXG5cdCAqIE5PVDogYMm1SU5KRUNUT1JfU0NPUEVgIEFuZ3VsYXIgcHJpdmF0ZSBBUEknc2lkaXI7IG1pbm9yIHPDvHLDvG0gecO8a3NlbHRtZWxlcmluZGUgZGF2cmFuxLHFn8SxXHJcblx0ICogZG/En3J1bGFubWFsxLEgKGHFn2HEn8SxZGFraSBQT0MgaXpvbGFzeW9uIGxvZyd1IGJ1bnVuIGnDp2luIGLEsXJha8SxbGTEsSkuXHJcblx0ICovXHJcblx0Y29uc3QgY2hpbGRQcm92aWRlcnM6IEFycmF5PFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnM+ID0gW1xyXG5cdFx0eyBwcm92aWRlOiDJtUlOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sXHJcblx0XHRwcm92aWRlUm91dGVyKFxyXG5cdFx0XHRfcm91dGVzLFxyXG5cdFx0XHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nKCksXHJcblx0XHRcdHdpdGhSb3V0ZXJDb25maWcoeyBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJyB9KVxyXG5cdFx0KSxcclxuXHRcdHsgcHJvdmlkZTogTG9jYXRpb25TdHJhdGVneSwgdXNlQ2xhc3M6IElzb2xhdGVkTG9jYXRpb25TdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBMb2NhdGlvbiwgdXNlQ2xhc3M6IExvY2F0aW9uIH0sXHJcblx0XHR7IHByb3ZpZGU6IFJvdXRlUmV1c2VTdHJhdGVneSwgdXNlRXhpc3Rpbmc6IEN1c3RvbVJvdXRlUmV1c2VTdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBVcmxTZXJpYWxpemVyLCB1c2VFeGlzdGluZzogVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0sXHJcblx0XHR7IHByb3ZpZGU6IFRyYW5zbG9jb1NlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KFRyYW5zbG9jb1NlcnZpY2UpIH0sXHJcblx0XHQvLyBgybVJTkpFQ1RPUl9TQ09QRToncm9vdCdgIHlhbiBldGtpc2k6IGBBcHBsaWNhdGlvblJlZmAgZGUgYHByb3ZpZGVkSW46J3Jvb3QnYCBvbGR1xJ91IGnDp2luXHJcblx0XHQvLyBjaGlsZCBpbmplY3RvcidkYSBjaGlsZC1MT0tBTCAoc2FodGUpIGJpciBpbnN0YW5jZSDDvHJldGlsaXJkaSDigJQgYnUgaW5zdGFuY2UgTmdab25lJ3VuXHJcblx0XHQvLyB0aWNrIGTDtm5nw7xzw7xuZSBiYcSfbMSxIERFxJ7EsExExLBSLiBTb251w6c6IGJ1IGFwcFJlZidlIGBhdHRhY2hWaWV3YCBlZGlsZW4gdmlldydsYXIgaGnDpyBjaGFuZ2VcclxuXHRcdC8vIGRldGVjdGlvbiBhbG1hei4gQXBwQ29tcG9uZW50J2kgYml6IGHDp8Sxa8OnYSBgc2hhcmVkQXBwUmVmLmF0dGFjaFZpZXdgIGlsZSBiYcSfbGFkxLHEn8SxbcSxeiBpw6dpblxyXG5cdFx0Ly8gw6dhbMSxxZ/EsXI7IGFtYSBgaW5qZWN0KEFwcGxpY2F0aW9uUmVmKWAgeWFwYW4gw7zDp8O8bmPDvCB0YXJhZiBrb2QgKFByaW1lTkcgYERpYWxvZ1NlcnZpY2VgIOKGklxyXG5cdFx0Ly8gYHRoaXMuYXBwUmVmLmF0dGFjaFZpZXdgKSBjaGlsZC1sb2NhbCBzYWh0ZSBhcHBSZWYnaSBhbMSxcCBkaWFsb2cndSBvbmEgYmHEn2zEsXlvcmR1IOKGkiBkaWFsb2dcclxuXHRcdC8vIHlhcmF0xLFsxLF5b3IgYW1hIGAqbmdJZj1cInZpc2libGVcImAgaGnDpyByZW5kZXIgZWRpbG1peW9yZHUgKGJvxZ8gYcOnxLFsxLF5b3JkdSkuIEdlcsOnZWsgKHRlayxcclxuXHRcdC8vIHRpY2sgYWxhbikgYHNoYXJlZEFwcFJlZmAnZSBzYWJpdGxpeW9ydXouXHJcblx0XHR7IHByb3ZpZGU6IEFwcGxpY2F0aW9uUmVmLCB1c2VGYWN0b3J5OiAoKSA9PiBzaGFyZWRBcHBSZWYhIH0sXHJcblx0XHQvLyBUYXJhbWEgKGxvZzE1KSBpbGUgc2FwdGFuYW4sIGNoaWxkLWxvY2FsIG9sdW5jYSBib3p1bGFuIGVrIGBwcm92aWRlZEluOidyb290J2Agc2VydmlzbGVyaTpcclxuXHRcdC8vIOKAoiBQdWJTdWJTZXJ2aWNlIOKAlCBNRkUnbmluIGBicmVhZGNydW1iVXBkYXRlZGAgZXZlbnQnaSBob3N0IGBoaXN0b3J5LnNlcnZpY2VgJ2UgdWxhxZ9tYWzEsTtcclxuXHRcdC8vICAgY2hpbGQtbG9jYWwgb2x1bmNhIE1GReKGlGhvc3QgZXZlbnQga8O2cHLDvHPDvCBrb3B1eW9yZHUuXHJcblx0XHQvLyDigKIgUHJpbWVOR0NvbmZpZyDigJQgZGluYW1payBkaWFsb2cnbGFyIHNoYXJlZCByb290IGNvbnRleHQnaW5kZSB5YXJhdMSxbGTEscSfxLEgacOnaW4gUHJpbWVOR1xyXG5cdFx0Ly8gICDDp2V2aXJpbGVyaSAoY2FsZW5kYXIvcGFnaW5hdG9yIHZiLikgdmUgYHNldFRyYW5zbGF0aW9uYCBzaGFyZWQgaW5zdGFuY2UndGFuIG9rdW5tYWzEsS5cclxuXHRcdC8vIChCcmVhZGNydW1iU2VydmljZSBiaWxpbsOnbGkgb2xhcmFrIGNoaWxkLWxvY2FsIGLEsXJha8SxbGTEsTogaGVyIHRhYiBrZW5kaSBicmVhZGNydW1iJ8SxLilcclxuXHRcdHsgcHJvdmlkZTogUHViU3ViU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHViU3ViU2VydmljZSkgfSxcclxuXHRcdHsgcHJvdmlkZTogUHJpbWVOR0NvbmZpZywgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHJpbWVOR0NvbmZpZykgfSxcclxuXHRcdC8vIFRvYXN0L2NvbmZpcm0gR0xPQkFMOiB0ZWsgc2hhcmVkIE1lc3NhZ2VTZXJ2aWNlL0NvbmZpcm1hdGlvblNlcnZpY2UuIEFrc2kgaGFsZGUgaGVyIHRhYlxyXG5cdFx0Ly8ga2VuZGkgaW5zdGFuY2UnxLFuYSBzYWhpcCBvbHVyIOKGkiBob3N0J3RhbiB0ZXRpa2xlbmVuIHRvYXN0IE1GRSB0YWInxLFuZGEgKHlhIGRhIHRlcnNpKVxyXG5cdFx0Ly8gZ8O2csO8bm1lei4gU2hhcmVkIGluc3RhbmNlIGlsZSB0w7xtIGA8cC10b2FzdCBrZXk9XCJ0b2FzdC1yb290XCI+YCBjb250YWluZXInbGFyxLEgYXluxLEga3V5cnXEn3UgZGlubGVyLlxyXG5cdFx0eyBwcm92aWRlOiBNZXNzYWdlU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UpIH0sXHJcblx0XHR7IHByb3ZpZGU6IENvbmZpcm1hdGlvblNlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpIH1cclxuXHRdO1xyXG5cclxuXHRjb25zdCBhcHBDb21wb25lbnRQcm9taXNlID0gYXBwQ29tcG9uZW50TG9hZGVyKCk7XHJcblxyXG5cdGNsYXNzIE1GRUFwcEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcblx0XHRwcml2YXRlIGNoaWxkSW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgfCBudWxsID0gbnVsbDtcclxuXHRcdHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRwcml2YXRlIGlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0cHJpdmF0ZSBkZXN0cm95VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0YXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRcdC8vIFN0cmF0ZWd5IGhpZGRlbiBjb250YWluZXIg4oaUIHZpZXcgYXJhc8SxIHRhxZ/EsW1hbGFyZGEgcmUtYm9vdHN0cmFwJ8SxIMO2bmxlIOKAlFxyXG5cdFx0XHQvLyB2aWV3IHphdGVuIHlhcmF0xLFsZMSxeXNhIHNraXAuIGRlc3Ryb3lUaW1lciBwZW5kaW5nIGlzZSBpcHRhbCBldC5cclxuXHRcdFx0aWYgKHRoaXMuY29tcFJlZiB8fCB0aGlzLmlzQm9vdHN0cmFwcGluZykge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikge1xyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gdHJ1ZTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXlsYcWfxLFsYW4gQXBwbGljYXRpb24g4oCUIGlsayDDp2HEn8SxcmFuIHlhcmF0xLFyLCBkacSfZXJsZXJpIGF5bsSxIHByb21pc2UnxLEgYmVrbGVyLlxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0c2hhcmVkQXBwUHJvbWlzZSA9IGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBbYXBwUmVmLCBBcHBDb21wb25lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3NoYXJlZEFwcFByb21pc2UsIGFwcENvbXBvbmVudFByb21pc2VdKTtcclxuXHRcdFx0XHRzaGFyZWRBcHBSZWYgPSBhcHBSZWY7XHJcblxyXG5cdFx0XHRcdC8vIEJ1IHRhYiBpw6dpbiBpem9sZSBSb3V0ZXIgc3RhY2snaSBiYXLEsW5kxLFyYW4gY2hpbGQgaW5qZWN0b3IuXHJcblx0XHRcdFx0Y29uc3QgdGFiSWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnKSA/PyAnJztcclxuXHRcdFx0XHR0aGlzLmNoaWxkSW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFxyXG5cdFx0XHRcdFx0Y2hpbGRQcm92aWRlcnMsXHJcblx0XHRcdFx0XHRhcHBSZWYuaW5qZWN0b3IsXHJcblx0XHRcdFx0XHRgbWZlOiR7X2FwcE5hbWV9OiR7dGFiSWQgfHwgJ3BlbmRpbmcnfWBcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHQvLyBbSGlicml0IGl6b2xhc3lvbiBndWFyZCDigJQga2FsxLFjxLFdIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgaWxlIGNoaWxkIGluamVjdG9yJ8SxblxyXG5cdFx0XHRcdC8vIEtFTkTEsCBSb3V0ZXIgKyBDaGlsZHJlbk91dGxldENvbnRleHRzJ2kgb2xtYXPEsSwgdGFiIGl6b2xhc3lvbnVudW4gdGVtZWxpZGlyXHJcblx0XHRcdFx0Ly8gKFwiMSBSb3V0ZXIgOiAxIG91dGxldFwiKS4gQnUgcHJpdmF0ZSBBUEkgQW5ndWxhciB1cGdyYWRlJ2luZGUgZGF2cmFuxLHFnyBkZcSfacWfdGlyaXJzZVxyXG5cdFx0XHRcdC8vIGJ1cmFkYSBlcmtlbiB5YWthbGFuxLFyOyBha3NpIGhhbGRlIFwiMSBSb3V0ZXIgOiBOIG91dGxldFwiIGJ1ZyfEsSBzZXNzaXpjZSBnZXJpIGTDtm5lci5cclxuXHRcdFx0XHRpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5jaGlsZEluamVjdG9yLmdldChSb3V0ZXIpID09PSBhcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gSMSwQlLEsFQgxLBaT0xBU1lPTiBCT1pVTERVOiBjaGlsZCBSb3V0ZXIgc2hhcmVkIHJvb3QgaWxlIGF5bsSxIGluc3RhbmNlISBgICtcclxuXHRcdFx0XHRcdFx0XHRgybVJTkpFQ1RPUl9TQ09QRSBkYXZyYW7EscWfxLEgZGXEn2nFn21pxZ8gb2xhYmlsaXIgKEFuZ3VsYXIgdXBncmFkZT8pIOKAlCB0YWIgaXpvbGFzeW9udSDDp2FsxLHFn21hei5gXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQXBwQ29tcG9uZW50J2kgY2hpbGQgaW5qZWN0b3IgY29udGV4dCdpbmRlIHlhcmF0IOKGkiBpbmplY3QoUm91dGVyKS9Mb2NhdGlvblN0cmF0ZWd5XHJcblx0XHRcdFx0Ly8gY2hpbGQtbG9jYWw7IGluamVjdChNZmVCcmlkZ2UpL0h0dHBDbGllbnQvS2V5Y2xvYWsvVHJhbnNsb2NvU2VydmljZSB2Yi4gcGFyZW50J3RhblxyXG5cdFx0XHRcdC8vIHBheWxhxZ/EsW1sxLEuIGBhdHRhY2hWaWV3YCBzaGFyZWQgYXBwJ2luIGNoYW5nZSBkZXRlY3Rpb24gZMO2bmfDvHPDvG5lIGJhxJ9sYXIuIChgYm9vdHN0cmFwYFxyXG5cdFx0XHRcdC8vIGRlxJ9pbDogQVBQX0JPT1RTVFJBUF9MSVNURU5FUiDDp2FsxLHFn21heiwgY2hpbGQgUm91dGVyJ8SxbiBpbml0aWFsIG5hdmlnYXRpb24nxLFuxLFcclxuXHRcdFx0XHQvLyBBcHBDb21wb25lbnQgaG9zdC1Sb3V0ZXIgc3luYydpIGBzYWZlTmF2aWdhdGVgIGlsZSB5YXDEsXlvci4pXHJcblx0XHRcdFx0dGhpcy5jb21wUmVmID0gY3JlYXRlQ29tcG9uZW50KEFwcENvbXBvbmVudCBhcyBuZXZlciwge1xyXG5cdFx0XHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5jaGlsZEluamVjdG9yLFxyXG5cdFx0XHRcdFx0aG9zdEVsZW1lbnQ6IHRoaXNcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRhcHBSZWYuYXR0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdC8vIEJhxZ9hcsSxbMSxIGJvb3Q6IGd1YXJkIGFydMSxayBgY29tcFJlZmAgw7x6ZXJpbmRlbiDDp2FsxLHFn8SxciDihpIgYGlzQm9vdHN0cmFwcGluZ2AnaSBixLFyYWsuXHJcblx0XHRcdFx0Ly8gKGF3YWl0IHPEsXJhc8SxbmRhIGRpc2Nvbm5lY3Qgb2x1cCBoYXRhIG9sdcWfbWF6c2EgZmxhZyB0YWvEsWzEsSBrYWxtYXPEsW47IGFrc2kgaGFsZGVcclxuXHRcdFx0XHQvLyByZWNvbm5lY3QndGUgZ3VhcmQgZXJrZW4gcmV0dXJuIGVkaXAgdGFiJ8SxIGthbMSxY8SxIGJvxZ8gYsSxcmFrxLFyLilcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbYm9vdDoke19hcHBOYW1lfV0gYXBwbGljYXRpb24gYm9vdHN0cmFwIGhhdGFzxLE6YCwgZXJyKTtcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdC8vIHNoYXJlZEFwcCBoZW7DvHogc2V0IGVkaWxtZWRpeXNlIChjcmVhdGVBcHBsaWNhdGlvbiBiYcWfYXLEsXPEsXopIHByb21pc2UnxLEgc8SxZsSxcmxhIGtpXHJcblx0XHRcdFx0Ly8gc29ucmFraSB0YWIgcmV0cnkgZWRlYmlsc2luIOKAlCBha3NpIGhhbGRlIHJlamVjdGVkIHByb21pc2UgY2xvc3VyZSdkYSBrYWzEsWPEsSBrYWzEsXIgdmVcclxuXHRcdFx0XHQvLyByZW1vdGUgc2F5ZmEgeWVuaWxlbWVkZW4gYmlyIGRhaGEgYm9vdCBlZGlsZW1lei4gKGNyZWF0ZUNvbXBvbmVudCBoYXRhc8SxbmRhXHJcblx0XHRcdFx0Ly8gc2hhcmVkQXBwUmVmIHphdGVuIHNldCd0aXI7IG8gZHVydW1kYSBwcm9taXNlIGtvcnVudXIsIGFwcCB5ZW5pZGVuIHlhcmF0xLFsbWF6LilcclxuXHRcdFx0XHRpZiAoIXNoYXJlZEFwcFJlZikgc2hhcmVkQXBwUHJvbWlzZSA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcclxuXHRcdFx0Ly8gU3RyYXRlZ3kgaGlkZGVuIGNvbnRhaW5lciDihpQgdmlldyBhcmFzxLEgdGHFn8SxbWFsYXJkYSBgcmVtb3ZlQ2hpbGRgICsgYGFwcGVuZENoaWxkYFxyXG5cdFx0XHQvLyBhcmTEscWfxLFrIG9sZHXEn3UgacOnaW4gZGlzY29ubmVjdGVkQ2FsbGJhY2sgcGFyZW50IGRlxJ9pxZ9pbWl5bGUgdGV0aWtsZW5pciDigJQgZWxlbWVudFxyXG5cdFx0XHQvLyBnZXLDp2VrdGVuIGRlc3Ryb3kgZWRpbG1peW9yLiBgcHJlc2VydmVXZWJDb21wb25lbnRFbGVtZW50YCDDtm5jZXNpbmRlIFN0cmF0ZWd5XHJcblx0XHRcdC8vIGBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaGAgZmxhZydpIHNldCBlZGl5b3I7IG8gZmxhZyB2YXJzYSB2aWV3IGtvcnVudXIuXHJcblx0XHRcdGNvbnN0IHByZXNlcnZlRmxhZyA9ICh0aGlzIGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfSkuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2g7XHJcblx0XHRcdGlmIChwcmVzZXJ2ZUZsYWcpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRmxhZyB5b2sg4oaSIGdlcsOnZWsgZGVzdHJveS4gQXN5bmMgcmUtY29ubmVjdCBpaHRpbWFsaW5lIGthcsWfxLEgbWljcm90YXNrIHPEsW7EsXJsxLFcclxuXHRcdFx0Ly8gZGVmYW5zaWYgZ2VjaWttZTsgYmlyIHNvbnJha2kgdGljayd0ZSBow6Jsw6IgZGlzY29ubmVjdGVkIG3EsSBkaXllIHNvbiBrb250cm9sLlxyXG5cdFx0XHRpZiAodGhpcy5kZXN0cm95VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmRlc3Ryb3lUaW1lcik7XHJcblx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLmlzQ29ubmVjdGVkICYmIHRoaXMuY29tcFJlZikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coYFtib290OiR7X2FwcE5hbWV9XSBnZXLDp2VrIGRlc3Ryb3kg4oaSIHZpZXcgKyBjaGlsZCBpbmplY3RvciBkZXN0cm95YCk7XHJcblx0XHRcdFx0XHQvLyBTaGFyZWQgYXBwJ2UgQVNMQSBkb2t1bm1hOyBzYWRlY2UgYnUgdGFiJ8SxbiB2aWV3J8SxbsSxIHZlIGNoaWxkIGluamVjdG9yJ8SxbsSxIHnEsWsuXHJcblx0XHRcdFx0XHRpZiAoc2hhcmVkQXBwUmVmKSBzaGFyZWRBcHBSZWYuZGV0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmLmRlc3Ryb3koKTtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3Rvcj8uZGVzdHJveSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3RvciA9IG51bGw7XHJcblx0XHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmRlc3Ryb3lUaW1lciA9IG51bGw7XHJcblx0XHRcdH0sIDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dHJ5IHtcclxuXHRcdGN1c3RvbUVsZW1lbnRzLmRlZmluZShgYXBwLSR7YXBwTmFtZX1gLCBNRkVBcHBFbGVtZW50KTtcclxuXHR9IGNhdGNoIChlKSB7XHJcblx0XHRpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdOb3RTdXBwb3J0ZWRFcnJvcicpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKGBbYm9vdDoke2FwcE5hbWV9XSBjdXN0b20gZWxlbWVudCB6YXRlbiB0YW7EsW1sxLEsIGRlZmluZSBhdGxhbmTEsWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aHJvdyBlO1xyXG5cdH1cclxufTtcclxuIl19
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNOLGVBQWUsRUFFZixjQUFjLEVBRWQsbUJBQW1CLEVBR25CLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFFTixrQkFBa0IsRUFDbEIsTUFBTSxFQUVOLGFBQWEsRUFDYixhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGdCQUFnQixFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQVEsd0JBQXdCLEVBQWtCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxX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Q0FBQztZQUMvRSxPQUFPO1FBQ1IsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUFDO0lBQ1QsQ0FBQztBQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uLCBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuXHRBUFBfSU5JVElBTElaRVIsXHJcblx0QXBwbGljYXRpb25Db25maWcsXHJcblx0QXBwbGljYXRpb25SZWYsXHJcblx0Q29tcG9uZW50UmVmLFxyXG5cdEVudmlyb25tZW50SW5qZWN0b3IsXHJcblx0RW52aXJvbm1lbnRQcm92aWRlcnMsXHJcblx0UHJvdmlkZXIsXHJcblx0Y3JlYXRlQ29tcG9uZW50LFxyXG5cdGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3IsXHJcblx0aW1wb3J0UHJvdmlkZXJzRnJvbSxcclxuXHRpbmplY3QsXHJcblx0aXNEZXZNb2RlLFxyXG5cdMm1SU5KRUNUT1JfU0NPUEVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHtcclxuXHRDaGlsZHJlbk91dGxldENvbnRleHRzLFxyXG5cdFJvdXRlUmV1c2VTdHJhdGVneSxcclxuXHRSb3V0ZXIsXHJcblx0Um91dGVzLFxyXG5cdFVybFNlcmlhbGl6ZXIsXHJcblx0cHJvdmlkZVJvdXRlcixcclxuXHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nLFxyXG5cdHdpdGhSb3V0ZXJDb25maWdcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UsIFByaW1lTkdDb25maWcgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nO1xyXG5cclxuaW1wb3J0IHsgS2V5Y2xvYWtTZXJ2aWNlIH0gZnJvbSAna2V5Y2xvYWstYW5ndWxhcic7XHJcbmltcG9ydCB7IE1vbmFjb0VkaXRvck1vZHVsZSwgTkdYX01PTkFDT19FRElUT1JfQ09ORklHIH0gZnJvbSAnbmd4LW1vbmFjby1lZGl0b3ItdjInO1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlQmFzZUFwcENvbmZpZyB9IGZyb20gJ2FyaWwvYm9vdC9iYXNlJztcclxuaW1wb3J0IHsgc2V0QXBpQ29uZmlnT25NRkVNb2RlIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcGknO1xyXG5pbXBvcnQgeyBBcHBzLCBDdXN0b21Sb3V0ZVJldXNlU3RyYXRlZ3ksIFBsdWdpbk1lbnVJdGVtLCBUYWJBd2FyZVVybFNlcmlhbGl6ZXIgfSBmcm9tICdhcmlsL2Jvb3QvY29uZmlnL2FwcHMnO1xyXG5pbXBvcnQgeyBnZXROZ1pvbmUsIGxvYWRQbHVnaW5zIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9wbHVnaW5zJztcclxuaW1wb3J0IHsgaTE4bkZvbGRlck5hbWUgfSBmcm9tICdhcmlsL2kxOG4nO1xyXG5pbXBvcnQgeyBwcm92aWRlSG9zdCB9IGZyb20gJ2FyaWwvcHJvdmlkZXInO1xyXG5pbXBvcnQgeyBQdWJTdWJTZXJ2aWNlIH0gZnJvbSAnYXJpbC91dGlsL3B1Yi1zdWInO1xyXG5cclxuaW1wb3J0IHsgYXBwQ29tcG9uZW50TG9hZGVyIH0gZnJvbSAnLi9hcHBDb21wb25lbnRMb2FkZXInO1xyXG5pbXBvcnQgeyBJc29sYXRlZExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2lzb2xhdGVkLWxvY2F0aW9uLXN0cmF0ZWd5JztcclxuaW1wb3J0IHsgbW9uYWNvQ29uZmlnIH0gZnJvbSAnLi9tb25hY28uY29uZmlnJztcclxuXHJcbmV4cG9ydCB2YXIgYXBwTmFtZTogQXBwcztcclxuZXhwb3J0IHZhciBtZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW10gPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBgYm9vdGAgw6dhxJ9yxLFsYXLEsW7EsW4gaWRlbXBvdGVudCBrYWxtYXPEsW7EsSBzYcSfbGF5YW4gc3luYyBndWFyZC4gQXluxLEgcmVtb3RlIGnDp2luXHJcbiAqIGJpcmRlbiBmYXpsYSBwYXJhbGVsIGBib290KCd3ZG0nLCAuLi4pYCDDp2HEn3LEsXPEsSBnZWxkacSfaW5kZSwgaWxrIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgXHJcbiAqIHRhbWFtbGFubWFkYW4gaWtpbmNpIMOnYcSfcsSxIGBjdXN0b21FbGVtZW50cy5nZXRgIGd1YXJkJ8SxbsSxIGdlw6dpeW9yZHUg4oaSIGhlciBpa2lzaSBkZVxyXG4gKiBkZWZpbmUgZXRtZXllIMOnYWzEscWfxLFwIGBOb3RTdXBwb3J0ZWRFcnJvcjogdGhlIG5hbWUgXCJhcHAtd2RtXCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkYFxyXG4gKiBoYXRhc8SxIGbEsXJsYXTEsWzEsXlvcmR1LiBTZXQgaWxlIHN5bmMgbWFyayBlZGVyZWsgdGVrIGJpciBkZWZpbmUgY3ljbGUnxLEgZ2FyYW50aSBlZGl5b3J1ei5cclxuICovXHJcbmNvbnN0IGJvb3RlZEFwcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBib290ID0gKF9hcHBOYW1lOiBBcHBzLCBfcm91dGVzOiBSb3V0ZXMsIF9tZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW10pID0+IHtcclxuXHRpZiAoYm9vdGVkQXBwcy5oYXMoX2FwcE5hbWUpIHx8IGN1c3RvbUVsZW1lbnRzLmdldChgYXBwLSR7X2FwcE5hbWV9YCkpIHJldHVybjtcclxuXHRib290ZWRBcHBzLmFkZChfYXBwTmFtZSk7XHJcblxyXG5cdGFwcE5hbWUgPSBfYXBwTmFtZTtcclxuXHRtZW51SXRlbXMgPSBfbWVudUl0ZW1zO1xyXG5cclxuXHQvKipcclxuXHQgKiAqKlBheWxhxZ/EsWxhbiBiYXNlIGNvbmZpZyoqIOKAlCByZW1vdGUgYmHFn8SxbmEgVEVLIGBjcmVhdGVBcHBsaWNhdGlvbmAuIEHEn8SxciBzZXJ2aXNsZXJcclxuXHQgKiAoSHR0cENsaWVudCArIGludGVyY2VwdG9yIGNoYWluLCBLZXljbG9haywgaTE4bi9UcmFuc2xvY28sIE1vbmFjbywgYW5pbWF0aW9ucykgYnVyYWRhXHJcblx0ICogeWHFn2FyOyBgcHJvdmlkZWRJbmAgdGHFn8SxbWF5YW4gZXhwbGljaXQgcHJvdmlkZXIgb2xkdWtsYXLEsSBpw6dpbiB0w7xtIHRhYidsYXLEsW4gY2hpbGRcclxuXHQgKiBpbmplY3RvcidsYXLEsW5kYW4gcGFyZW50IG9sYXJhayBwYXlsYcWfxLFsxLFyIOKGkiBSQU0gbGluZWVyIGLDvHnDvG1lei4gUm91dGVyL0xvY2F0aW9uL1xyXG5cdCAqIFJldXNlU3RyYXRlZ3kvVXJsU2VyaWFsaXplciBidXJhZGEgWU9LOyBvbmxhciB0YWIgYmHFn8SxbmEgaXpvbGUgY2hpbGQgaW5qZWN0b3InZGEgdmVyaWxpci5cclxuXHQgKi9cclxuXHRjb25zdCBzaGFyZWRCYXNlQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuXHRcdHByb3ZpZGVyczogW1xyXG5cdFx0XHRjcmVhdGVCYXNlQXBwQ29uZmlnKHsgaTE4bkZvbGRlcjogX2FwcE5hbWUgfSksXHJcblx0XHRcdHByb3ZpZGVIb3N0KF9hcHBOYW1lKSxcclxuXHRcdFx0Z2V0Tmdab25lKCksXHJcblx0XHRcdHtcclxuXHRcdFx0XHRwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXHJcblx0XHRcdFx0dXNlRmFjdG9yeTogKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2UsIGZvbGRlck5hbWU6IHR5cGVvZiBpMThuRm9sZGVyTmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgcnVuQXBpSW5pdCA9IHNldEFwaUNvbmZpZ09uTUZFTW9kZShodHRwQ2xpZW50LCBrZXljbG9haywgZm9sZGVyTmFtZSBhcyB1bmtub3duIGFzIEFwcHMpO1xyXG5cdFx0XHRcdFx0Y29uc3QgcnVuTG9hZFBsdWdpbnMgPSBsb2FkUGx1Z2lucygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0YXdhaXQgcnVuQXBpSW5pdCgpO1xyXG5cdFx0XHRcdFx0XHRydW5Mb2FkUGx1Z2lucygpO1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG11bHRpOiB0cnVlLFxyXG5cdFx0XHRcdGRlcHM6IFtIdHRwQ2xpZW50LCBLZXljbG9ha1NlcnZpY2UsIGkxOG5Gb2xkZXJOYW1lXVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRpbXBvcnRQcm92aWRlcnNGcm9tKE1vbmFjb0VkaXRvck1vZHVsZS5mb3JSb290KCkpLFxyXG5cdFx0XHR7IHByb3ZpZGU6IE5HWF9NT05BQ09fRURJVE9SX0NPTkZJRywgdXNlVmFsdWU6IG1vbmFjb0NvbmZpZyB9XHJcblx0XHRdXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3RlIGJhxZ/EsW5hIFRFSyBwYXlsYcWfxLFsYW4gYEFwcGxpY2F0aW9uUmVmYCDigJQgY2xvc3VyZS1zY29wZS4gxLBsayBgPGFwcC0ke2FwcE5hbWV9PmBcclxuXHQgKiBlbGVtZW50J2kgYGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpYCDDp2HEn8SxcsSxciwgc29ucmFraSB0w7xtIGVsZW1lbnQnbGVyIGF5bsSxXHJcblx0ICogcHJvbWlzZSfEsSBiZWtsZXIgKGR1cGxpY2F0ZSBBcHBsaWNhdGlvbiB5YXJhdMSxbcSxIGlta8OibnPEsXopLiBIZXIgZWxlbWVudCBrZW5kaSBjaGlsZFxyXG5cdCAqIGluamVjdG9yICsgYGNyZWF0ZUNvbXBvbmVudGAgaWxlIGtlbmRpIGBBcHBDb21wb25lbnRgIHZpZXcnxLFuxLEgeWFyYXTEsXAgc2hhcmVkIGFwcCdlXHJcblx0ICogYGF0dGFjaFZpZXdgIGlsZSBiYcSfbGFyLiBTaGFyZWQgYXBwIHV6dW4gw7Ztw7xybMO8ZMO8ciAodGFiJ2xhciBrYXBhbnNhIGRhIGRlc3Ryb3kgZWRpbG1leikuXHJcblx0ICpcclxuXHQgKiBgY2hpbGRQcm92aWRlcnNgJ3Rha2kgYFRyYW5zbG9jb1NlcnZpY2VgIGZhY3Rvcnknc2kgYnUgcmVmZXJhbnPEsSBrdWxsYW5kxLHEn8SxIGnDp2luXHJcblx0ICogYGNoaWxkUHJvdmlkZXJzYCd0YW4gw5ZOQ0UgdGFuxLFtbGFuxLFyIChmb3J3YXJkIFREWid5aSDDtm5sZXIpLlxyXG5cdCAqL1xyXG5cdGxldCBzaGFyZWRBcHBSZWY6IEFwcGxpY2F0aW9uUmVmIHwgbnVsbCA9IG51bGw7XHJcblx0bGV0IHNoYXJlZEFwcFByb21pc2U6IFByb21pc2U8QXBwbGljYXRpb25SZWY+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdC8qKlxyXG5cdCAqICoqVGFiIGJhxZ/EsW5hIGl6b2xlIFJvdXRlciBzdGFjayoqIOKAlCBoZXIgYDxhcHAtJHthcHBOYW1lfT5gIGtlbmRpIGNoaWxkXHJcblx0ICogYEVudmlyb25tZW50SW5qZWN0b3JgJ8SxbmRhIGJ1bmxhcsSxIGFsxLFyLiBgybVJTkpFQ1RPUl9TQ09QRTogJ3Jvb3QnYCBjaGlsZCfEsSAncm9vdCdcclxuXHQgKiBzY29wZSB5YXBhciAoQW5ndWxhciBgUjNJbmplY3RvcmAgY3RvcjogYHNjb3Blcy5hZGQoJ3Jvb3QnKWApOyBiw7Z5bGVjZSBgcHJvdmlkZVJvdXRlcmAnxLFuXHJcblx0ICogaW5qZWN0IGV0dGnEn2kgYHByb3ZpZGVkSW46J3Jvb3QnYCBSb3V0ZXIgc2VydmlzbGVyaSDigJQgYFJvdXRlcmAsIGBDaGlsZHJlbk91dGxldENvbnRleHRzYCxcclxuXHQgKiBgTG9jYXRpb25gLCBgTmF2aWdhdGlvblRyYW5zaXRpb25zYCB2Yi4g4oCUIGNoaWxkLUxPQ0FMIMO8cmV0aWxpci4gU29udcOnOiBoZXIgdGFiIGtlbmRpXHJcblx0ICogUm91dGVyICsga2VuZGkgYFJvdXRlck91dGxldGAgY29udGV4dCdpbmUgc2FoaXAgb2x1ciDihpIgKioxIFJvdXRlciA6IDEgb3V0bGV0KiouXHJcblx0ICpcclxuXHQgKiBOZWRlbiBnZXJla2xpOiBwYXlsYcWfxLFsYW4gdGVrIEFwcGxpY2F0aW9uJ2RhIE4gYDxyb3V0ZXItb3V0bGV0PmAgYXluxLEgdGVrXHJcblx0ICogYENoaWxkcmVuT3V0bGV0Q29udGV4dHNgJ2UgXCJwcmltYXJ5XCIgZGl5ZSBrYXlkb2x1cCBiaXJiaXJpbmkgZXppeW9yZHUgKGBjb250ZXh0cy5zZXRgXHJcblx0ICogb3ZlcndyaXRlKSDihpIgdGFiIGdlw6dpxZ9pIHNvbnJhc8SxIGF5bsSxIHRhYiBpw6dpIG5hdmlnYXN5b24gKGxpc3TihpJkZXRhaWwpIHlhbmzEscWfIG91dGxldCdlXHJcblx0ICogcmVuZGVyIG9sdXlvcmR1LiBDaGlsZC1pbmplY3RvciBpem9sYXN5b251IGJ1bnUga8O2a3RlbiDDp8O2emVyLlxyXG5cdCAqXHJcblx0ICogKipUcmFuc2xvY29TZXJ2aWNlIGlzdGlzbmFzxLEqKjogYCdyb290J2Agc2NvcGUgb251IGRhIGNoaWxkLWxvY2FsIHlhcGFyZMSxOyBhbWEgZ2xvYmFsXHJcblx0ICogKHNjb3BlJ3N1eikgw6dldmlyaWxlciBzaGFyZWQgYXBwJ2luIGluaXQgYWvEscWfxLFuZGEgecO8a2xlbmRpxJ9pbmRlbiDigJQgYGNyZWF0ZUNvbXBvbmVudGBcclxuXHQgKiBgQVBQX0lOSVRJQUxJWkVSYCDDp2FsxLHFn3TEsXJtYXog4oCUIGNoaWxkLWxvY2FsIHNlcnZpY2UnaW4gZ2xvYmFsIGNhY2hlJ2kgYm/FnyBrYWzEsXAgaGFtIGtleVxyXG5cdCAqIGfDtnN0ZXJpeW9yZHUuIFRhYiBiYcWfxLFuYSBheXLEsSBkaWwgc2VuYXJ5b3N1IHlvazsgc2VydmljZSdpIHNoYXJlZCBhcHAndGVuIHBheWxhxZ90xLFyxLF5b3J1elxyXG5cdCAqIChnbG9iYWwgw6dldmlyaSB0ZWsgeWVyZGUgecO8a2xlbmlyLCB0ZWsgdHJhbnNsYXRpb24gY2FjaGUg4oaSIGVrIFJBTSBrYXphbmPEsSkuIFNjb3BlIMOnZXZpcmlsZXJpXHJcblx0ICogKGBwcm92aWRlaTE4blNjb3BlYCkgY29tcG9uZW50LWxldmVsIHNhxJ9sYW5kxLHEn8SxIGnDp2luIHBheWxhxZ/EsWxhbiBzZXJ2aWNlJ2xlIGRlIMOnYWzEscWfxLFyLlxyXG5cdCAqXHJcblx0ICogTk9UOiBgybVJTkpFQ1RPUl9TQ09QRWAgQW5ndWxhciBwcml2YXRlIEFQSSdzaWRpcjsgbWlub3Igc8O8csO8bSB5w7xrc2VsdG1lbGVyaW5kZSBkYXZyYW7EscWfxLFcclxuXHQgKiBkb8SfcnVsYW5tYWzEsSAoYcWfYcSfxLFkYWtpIFBPQyBpem9sYXN5b24gbG9nJ3UgYnVudW4gacOnaW4gYsSxcmFrxLFsZMSxKS5cclxuXHQgKi9cclxuXHRjb25zdCBjaGlsZFByb3ZpZGVyczogQXJyYXk8UHJvdmlkZXIgfCBFbnZpcm9ubWVudFByb3ZpZGVycz4gPSBbXHJcblx0XHR7IHByb3ZpZGU6IMm1SU5KRUNUT1JfU0NPUEUsIHVzZVZhbHVlOiAncm9vdCcgfSxcclxuXHRcdHByb3ZpZGVSb3V0ZXIoXHJcblx0XHRcdF9yb3V0ZXMsXHJcblx0XHRcdHdpdGhDb21wb25lbnRJbnB1dEJpbmRpbmcoKSxcclxuXHRcdFx0d2l0aFJvdXRlckNvbmZpZyh7IG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnIH0pXHJcblx0XHQpLFxyXG5cdFx0eyBwcm92aWRlOiBMb2NhdGlvblN0cmF0ZWd5LCB1c2VDbGFzczogSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IH0sXHJcblx0XHR7IHByb3ZpZGU6IExvY2F0aW9uLCB1c2VDbGFzczogTG9jYXRpb24gfSxcclxuXHRcdHsgcHJvdmlkZTogUm91dGVSZXVzZVN0cmF0ZWd5LCB1c2VFeGlzdGluZzogQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5IH0sXHJcblx0XHR7IHByb3ZpZGU6IFVybFNlcmlhbGl6ZXIsIHVzZUV4aXN0aW5nOiBUYWJBd2FyZVVybFNlcmlhbGl6ZXIgfSxcclxuXHRcdHsgcHJvdmlkZTogVHJhbnNsb2NvU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoVHJhbnNsb2NvU2VydmljZSkgfSxcclxuXHRcdC8vIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgeWFuIGV0a2lzaTogYEFwcGxpY2F0aW9uUmVmYCBkZSBgcHJvdmlkZWRJbjoncm9vdCdgIG9sZHXEn3UgacOnaW5cclxuXHRcdC8vIGNoaWxkIGluamVjdG9yJ2RhIGNoaWxkLUxPS0FMIChzYWh0ZSkgYmlyIGluc3RhbmNlIMO8cmV0aWxpcmRpIOKAlCBidSBpbnN0YW5jZSBOZ1pvbmUndW5cclxuXHRcdC8vIHRpY2sgZMO2bmfDvHPDvG5lIGJhxJ9sxLEgREXEnsSwTETEsFIuIFNvbnXDpzogYnUgYXBwUmVmJ2UgYGF0dGFjaFZpZXdgIGVkaWxlbiB2aWV3J2xhciBoacOnIGNoYW5nZVxyXG5cdFx0Ly8gZGV0ZWN0aW9uIGFsbWF6LiBBcHBDb21wb25lbnQnaSBiaXogYcOnxLFrw6dhIGBzaGFyZWRBcHBSZWYuYXR0YWNoVmlld2AgaWxlIGJhxJ9sYWTEscSfxLFtxLF6IGnDp2luXHJcblx0XHQvLyDDp2FsxLHFn8SxcjsgYW1hIGBpbmplY3QoQXBwbGljYXRpb25SZWYpYCB5YXBhbiDDvMOnw7xuY8O8IHRhcmFmIGtvZCAoUHJpbWVORyBgRGlhbG9nU2VydmljZWAg4oaSXHJcblx0XHQvLyBgdGhpcy5hcHBSZWYuYXR0YWNoVmlld2ApIGNoaWxkLWxvY2FsIHNhaHRlIGFwcFJlZidpIGFsxLFwIGRpYWxvZyd1IG9uYSBiYcSfbMSxeW9yZHUg4oaSIGRpYWxvZ1xyXG5cdFx0Ly8geWFyYXTEsWzEsXlvciBhbWEgYCpuZ0lmPVwidmlzaWJsZVwiYCBoacOnIHJlbmRlciBlZGlsbWl5b3JkdSAoYm/FnyBhw6fEsWzEsXlvcmR1KS5cclxuXHRcdC8vXHJcblx0XHQvLyDDh8O2esO8bSDigJQgYHNoYXJlZEFwcFJlZmAnaSBzYXJhbiBQcm94eTogVMOcTSDDvHllbGVyIChhdHRhY2hWaWV3L2RldGFjaFZpZXcvdGljay9jb21wb25lbnRz4oCmKVxyXG5cdFx0Ly8gZ2Vyw6dlayBgc2hhcmVkQXBwUmVmYCdlIGRlbGVnZSBvbHVyIChtZXRob2QnbGFyIGB0YXJnZXRgJ2EgYmluZCdsaSDihpIgcHJpdmF0ZSBmaWVsZCBkYWhpbFxyXG5cdFx0Ly8gZG/En3J1IGB0aGlzYCksIFRFSyBmYXJrIGAuaW5qZWN0b3JgIOKGkiBidSB0YWInxLFuIGNoaWxkIGluamVjdG9yJ8SxLiBOZWRlbiBrcml0aWs6IFByaW1lTkdcclxuXHRcdC8vIGBEaWFsb2dTZXJ2aWNlYCBkaWFsb2cndSBgY3JlYXRlQ29tcG9uZW50KC4uLiwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmFwcFJlZi5pbmplY3RvciB9KWBcclxuXHRcdC8vIGlsZSB5YXJhdMSxci4gRMO8eiBgc2hhcmVkQXBwUmVmYCBkw7ZuZXJzZWsgZGlhbG9nIGnDp2VyacSfaSBzaGFyZWQgUk9PVCd0YSDDp8O2esO8bMO8ciwgc2F5ZmEgaXNlXHJcblx0XHQvLyBjaGlsZCBpbmplY3RvcidkYSDihpIgYHByb3ZpZGVkSW46J3Jvb3QnYCBoZXIgc2VydmlzIMSwS8SwIGF5csSxIGluc3RhbmNlIG9sdXIgKHNwbGl0LWJyYWluKSB2ZVxyXG5cdFx0Ly8gQmVoYXZpb3JTdWJqZWN0IHRhYmFubMSxIHNheWZh4oaUZGlhbG9nIHN0YXRlIHNlbmtyb25pemUgT0xNQVogKHNlw6dpbGkga2F5xLF0IGRpYWxvZydkYSBudWxsKS5cclxuXHRcdC8vIGAuaW5qZWN0b3JgJ8SxIGNoaWxkJ2EgecO2bmxlbmRpcmluY2UgZGlhbG9nIGnDp2VyacSfaSBzYXlmYXlsYSBBWU5JIGluamVjdG9yJ2RhIMOnw7Z6ZXIg4oaSIG90b21hdGlrXHJcblx0XHQvLyB0ZWsgaW5zdGFuY2UsIFTDnE0gKG1ldmN1dCtnZWxlY2VrKSBzZXJ2aXNsZXIgacOnaW4g4oCUIHNlcnZpcyBsaXN0ZXNpIHR1dG1heWEgZ2VyZWsgeW9rLlxyXG5cdFx0Ly8gYGF0dGFjaFZpZXdgIHlpbmUgYHNoYXJlZEFwcFJlZmAnZSBnaXR0acSfaSBpw6dpbiB0ZWsgdGljayBkw7ZuZ8O8c8O8L2NoYW5nZSBkZXRlY3Rpb24ga29ydW51ci5cclxuXHRcdHtcclxuXHRcdFx0cHJvdmlkZTogQXBwbGljYXRpb25SZWYsXHJcblx0XHRcdHVzZUZhY3Rvcnk6ICgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB0YWJJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcclxuXHRcdFx0XHRyZXR1cm4gbmV3IFByb3h5KHNoYXJlZEFwcFJlZiEsIHtcclxuXHRcdFx0XHRcdGdldCh0YXJnZXQsIHByb3ApIHtcclxuXHRcdFx0XHRcdFx0aWYgKHByb3AgPT09ICdpbmplY3RvcicpIHJldHVybiB0YWJJbmplY3RvcjtcclxuXHRcdFx0XHRcdFx0Ly8gYG5nT25EZXN0cm95YCd1IEfEsFpMRSAodW5kZWZpbmVkIGTDtm5kw7xyKS4gQWtzaSBoYWxkZSBgaW5qZWN0KEFwcGxpY2F0aW9uUmVmKWBcclxuXHRcdFx0XHRcdFx0Ly8geWFwYW4gdGFiIGNoaWxkIGluamVjdG9yJ8SxIChQcmltZU5HIERpYWxvZ1NlcnZpY2UgdmV5YSBhxZ9hxJ/EsWRha2kgZGV2IGd1YXJkKVxyXG5cdFx0XHRcdFx0XHQvLyBwcm94eSd5aSBrZW5kaSBgX25nT25EZXN0cm95SG9va3NgJ3VuYSBrYXlkZWRlciAoUjNJbmplY3Rvci5oeWRyYXRlIOKGklxyXG5cdFx0XHRcdFx0XHQvLyBoYXNPbkRlc3Ryb3k9dHJ1ZSkgdmUgdGFiIGthcGFuxLHFn8SxbmRhIGBjaGlsZEluamVjdG9yLmRlc3Ryb3koKWAg4oaSXHJcblx0XHRcdFx0XHRcdC8vIGBzaGFyZWRBcHBSZWYubmdPbkRlc3Ryb3koKWAg4oaSIGHDp8SxayBUw5xNIHRhYidsYXLEsW4gdmlldydsYXLEsW7EsSBkZXN0cm95IGVkaXBcclxuXHRcdFx0XHRcdFx0Ly8gc2hhcmVkIGFwcCdpIMO2bGTDvHLDvHIuIFNoYXJlZCBhcHAnaW4gbGlmZWN5Y2xlJ8SxIGJvb3RzdHJhcCdhIGFpdHRpciwgdGFiJ2EgZGXEn2lsXHJcblx0XHRcdFx0XHRcdC8vIChnZXLDp2VrIGBzaGFyZWRBcHBSZWYubmdPbkRlc3Ryb3lgIGV0a2lsZW5tZXo7IHlhbG7EsXpjYSBwcm94eSDDvHplcmluZGVuIGdpemxlbmlyKS5cclxuXHRcdFx0XHRcdFx0aWYgKHByb3AgPT09ICduZ09uRGVzdHJveScpIHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCB0YXJnZXQpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYmluZCh0YXJnZXQpIDogdmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvLyBUYXJhbWEgKGxvZzE1KSBpbGUgc2FwdGFuYW4sIGNoaWxkLWxvY2FsIG9sdW5jYSBib3p1bGFuIGVrIGBwcm92aWRlZEluOidyb290J2Agc2VydmlzbGVyaTpcclxuXHRcdC8vIOKAoiBQdWJTdWJTZXJ2aWNlIOKAlCBNRkUnbmluIGBicmVhZGNydW1iVXBkYXRlZGAgZXZlbnQnaSBob3N0IGBoaXN0b3J5LnNlcnZpY2VgJ2UgdWxhxZ9tYWzEsTtcclxuXHRcdC8vICAgY2hpbGQtbG9jYWwgb2x1bmNhIE1GReKGlGhvc3QgZXZlbnQga8O2cHLDvHPDvCBrb3B1eW9yZHUuXHJcblx0XHQvLyDigKIgUHJpbWVOR0NvbmZpZyDigJQgZGluYW1payBkaWFsb2cnbGFyIHNoYXJlZCByb290IGNvbnRleHQnaW5kZSB5YXJhdMSxbGTEscSfxLEgacOnaW4gUHJpbWVOR1xyXG5cdFx0Ly8gICDDp2V2aXJpbGVyaSAoY2FsZW5kYXIvcGFnaW5hdG9yIHZiLikgdmUgYHNldFRyYW5zbGF0aW9uYCBzaGFyZWQgaW5zdGFuY2UndGFuIG9rdW5tYWzEsS5cclxuXHRcdC8vIChCcmVhZGNydW1iU2VydmljZSBiaWxpbsOnbGkgb2xhcmFrIGNoaWxkLWxvY2FsIGLEsXJha8SxbGTEsTogaGVyIHRhYiBrZW5kaSBicmVhZGNydW1iJ8SxLilcclxuXHRcdHsgcHJvdmlkZTogUHViU3ViU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHViU3ViU2VydmljZSkgfSxcclxuXHRcdHsgcHJvdmlkZTogUHJpbWVOR0NvbmZpZywgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHJpbWVOR0NvbmZpZykgfSxcclxuXHRcdC8vIFRvYXN0L2NvbmZpcm0gR0xPQkFMOiB0ZWsgc2hhcmVkIE1lc3NhZ2VTZXJ2aWNlL0NvbmZpcm1hdGlvblNlcnZpY2UuIEFrc2kgaGFsZGUgaGVyIHRhYlxyXG5cdFx0Ly8ga2VuZGkgaW5zdGFuY2UnxLFuYSBzYWhpcCBvbHVyIOKGkiBob3N0J3RhbiB0ZXRpa2xlbmVuIHRvYXN0IE1GRSB0YWInxLFuZGEgKHlhIGRhIHRlcnNpKVxyXG5cdFx0Ly8gZ8O2csO8bm1lei4gU2hhcmVkIGluc3RhbmNlIGlsZSB0w7xtIGA8cC10b2FzdCBrZXk9XCJ0b2FzdC1yb290XCI+YCBjb250YWluZXInbGFyxLEgYXluxLEga3V5cnXEn3UgZGlubGVyLlxyXG5cdFx0eyBwcm92aWRlOiBNZXNzYWdlU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UpIH0sXHJcblx0XHR7IHByb3ZpZGU6IENvbmZpcm1hdGlvblNlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpIH1cclxuXHRdO1xyXG5cclxuXHRjb25zdCBhcHBDb21wb25lbnRQcm9taXNlID0gYXBwQ29tcG9uZW50TG9hZGVyKCk7XHJcblxyXG5cdGNsYXNzIE1GRUFwcEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcblx0XHRwcml2YXRlIGNoaWxkSW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgfCBudWxsID0gbnVsbDtcclxuXHRcdHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRwcml2YXRlIGlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0cHJpdmF0ZSBkZXN0cm95VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0YXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRcdC8vIFN0cmF0ZWd5IGhpZGRlbiBjb250YWluZXIg4oaUIHZpZXcgYXJhc8SxIHRhxZ/EsW1hbGFyZGEgcmUtYm9vdHN0cmFwJ8SxIMO2bmxlIOKAlFxyXG5cdFx0XHQvLyB2aWV3IHphdGVuIHlhcmF0xLFsZMSxeXNhIHNraXAuIGRlc3Ryb3lUaW1lciBwZW5kaW5nIGlzZSBpcHRhbCBldC5cclxuXHRcdFx0aWYgKHRoaXMuY29tcFJlZiB8fCB0aGlzLmlzQm9vdHN0cmFwcGluZykge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikge1xyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gdHJ1ZTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXlsYcWfxLFsYW4gQXBwbGljYXRpb24g4oCUIGlsayDDp2HEn8SxcmFuIHlhcmF0xLFyLCBkacSfZXJsZXJpIGF5bsSxIHByb21pc2UnxLEgYmVrbGVyLlxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0c2hhcmVkQXBwUHJvbWlzZSA9IGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBbYXBwUmVmLCBBcHBDb21wb25lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3NoYXJlZEFwcFByb21pc2UsIGFwcENvbXBvbmVudFByb21pc2VdKTtcclxuXHRcdFx0XHRzaGFyZWRBcHBSZWYgPSBhcHBSZWY7XHJcblxyXG5cdFx0XHRcdC8vIEJ1IHRhYiBpw6dpbiBpem9sZSBSb3V0ZXIgc3RhY2snaSBiYXLEsW5kxLFyYW4gY2hpbGQgaW5qZWN0b3IuXHJcblx0XHRcdFx0Y29uc3QgdGFiSWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnKSA/PyAnJztcclxuXHRcdFx0XHR0aGlzLmNoaWxkSW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFxyXG5cdFx0XHRcdFx0Y2hpbGRQcm92aWRlcnMsXHJcblx0XHRcdFx0XHRhcHBSZWYuaW5qZWN0b3IsXHJcblx0XHRcdFx0XHRgbWZlOiR7X2FwcE5hbWV9OiR7dGFiSWQgfHwgJ3BlbmRpbmcnfWBcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHQvLyBbSGlicml0IGl6b2xhc3lvbiBndWFyZCDigJQga2FsxLFjxLFdIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgaWxlIGNoaWxkIGluamVjdG9yJ8SxblxyXG5cdFx0XHRcdC8vIEtFTkTEsCBSb3V0ZXIgKyBDaGlsZHJlbk91dGxldENvbnRleHRzJ2kgb2xtYXPEsSwgdGFiIGl6b2xhc3lvbnVudW4gdGVtZWxpZGlyXHJcblx0XHRcdFx0Ly8gKFwiMSBSb3V0ZXIgOiAxIG91dGxldFwiKS4gQnUgcHJpdmF0ZSBBUEkgQW5ndWxhciB1cGdyYWRlJ2luZGUgZGF2cmFuxLHFnyBkZcSfacWfdGlyaXJzZVxyXG5cdFx0XHRcdC8vIGJ1cmFkYSBlcmtlbiB5YWthbGFuxLFyOyBha3NpIGhhbGRlIFwiMSBSb3V0ZXIgOiBOIG91dGxldFwiIGJ1ZyfEsSBzZXNzaXpjZSBnZXJpIGTDtm5lci5cclxuXHRcdFx0XHRpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5jaGlsZEluamVjdG9yLmdldChSb3V0ZXIpID09PSBhcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gSMSwQlLEsFQgxLBaT0xBU1lPTiBCT1pVTERVOiBjaGlsZCBSb3V0ZXIgc2hhcmVkIHJvb3QgaWxlIGF5bsSxIGluc3RhbmNlISBgICtcclxuXHRcdFx0XHRcdFx0XHRgybVJTkpFQ1RPUl9TQ09QRSBkYXZyYW7EscWfxLEgZGXEn2nFn21pxZ8gb2xhYmlsaXIgKEFuZ3VsYXIgdXBncmFkZT8pIOKAlCB0YWIgaXpvbGFzeW9udSDDp2FsxLHFn21hei5gXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gW0RpYWxvZyBpbmplY3RvciBrw7ZwcsO8c8O8IGd1YXJkIOKAlCBrYWzEsWPEsV0gQXBwbGljYXRpb25SZWYgcHJveHknc2luaW4gYC5pbmplY3RvcmAnxLEgYnVcclxuXHRcdFx0XHQvLyB0YWInxLFuIGNoaWxkIGluamVjdG9yJ8SxbsSxIGfDtnN0ZXJtZWxpOyBha3NpIGhhbGRlIFByaW1lTkcgRGlhbG9nU2VydmljZSBkaWFsb2cgacOnZXJpxJ9pbmlcclxuXHRcdFx0XHQvLyBzaGFyZWQgcm9vdCd0YSDDp8O2emVyIOKGkiBzYXlmYeKGlGRpYWxvZyBgcHJvdmlkZWRJbjoncm9vdCdgIHNwbGl0LWJyYWluIGdlcmkgZMO2bmVyLiBQcmltZU5HXHJcblx0XHRcdFx0Ly8geWEgZGEgQW5ndWxhciB1cGdyYWRlJ2kgYGFwcFJlZi5pbmplY3RvcmAga3VsbGFuxLFtxLFuxLEgZGXEn2nFn3Rpcmlyc2UgYnVyYWRhIHlha2FsYW7EsXIuXHJcblx0XHRcdFx0aWYgKGlzRGV2TW9kZSgpICYmIHRoaXMuY2hpbGRJbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpLmluamVjdG9yICE9PSB0aGlzLmNoaWxkSW5qZWN0b3IpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gRElBTE9HIElOSkVDVE9SIEvDllBSw5xTw5wgQk9aVUxEVTogQXBwbGljYXRpb25SZWYuaW5qZWN0b3IgdGFiIGNoaWxkIGAgK1xyXG5cdFx0XHRcdFx0XHRcdGBpbmplY3RvcifEsSBnw7ZzdGVybWl5b3Ig4oCUIGRpYWxvZyBpw6dlcmnEn2kgc2F5ZmFkYW4gZmFya2zEsSBpbmplY3RvcidkYSDDp8O2esO8bMO8ciAoc3BsaXQtYnJhaW4pLmBcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBBcHBDb21wb25lbnQnaSBjaGlsZCBpbmplY3RvciBjb250ZXh0J2luZGUgeWFyYXQg4oaSIGluamVjdChSb3V0ZXIpL0xvY2F0aW9uU3RyYXRlZ3lcclxuXHRcdFx0XHQvLyBjaGlsZC1sb2NhbDsgaW5qZWN0KE1mZUJyaWRnZSkvSHR0cENsaWVudC9LZXljbG9hay9UcmFuc2xvY29TZXJ2aWNlIHZiLiBwYXJlbnQndGFuXHJcblx0XHRcdFx0Ly8gcGF5bGHFn8SxbWzEsS4gYGF0dGFjaFZpZXdgIHNoYXJlZCBhcHAnaW4gY2hhbmdlIGRldGVjdGlvbiBkw7ZuZ8O8c8O8bmUgYmHEn2xhci4gKGBib290c3RyYXBgXHJcblx0XHRcdFx0Ly8gZGXEn2lsOiBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSIMOnYWzEscWfbWF6LCBjaGlsZCBSb3V0ZXInxLFuIGluaXRpYWwgbmF2aWdhdGlvbifEsW7EsVxyXG5cdFx0XHRcdC8vIEFwcENvbXBvbmVudCBob3N0LVJvdXRlciBzeW5jJ2kgYHNhZmVOYXZpZ2F0ZWAgaWxlIHlhcMSxeW9yLilcclxuXHRcdFx0XHR0aGlzLmNvbXBSZWYgPSBjcmVhdGVDb21wb25lbnQoQXBwQ29tcG9uZW50IGFzIG5ldmVyLCB7XHJcblx0XHRcdFx0XHRlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmNoaWxkSW5qZWN0b3IsXHJcblx0XHRcdFx0XHRob3N0RWxlbWVudDogdGhpc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGFwcFJlZi5hdHRhY2hWaWV3KHRoaXMuY29tcFJlZi5ob3N0Vmlldyk7XHJcblx0XHRcdFx0Ly8gQmHFn2FyxLFsxLEgYm9vdDogZ3VhcmQgYXJ0xLFrIGBjb21wUmVmYCDDvHplcmluZGVuIMOnYWzEscWfxLFyIOKGkiBgaXNCb290c3RyYXBwaW5nYCdpIGLEsXJhay5cclxuXHRcdFx0XHQvLyAoYXdhaXQgc8SxcmFzxLFuZGEgZGlzY29ubmVjdCBvbHVwIGhhdGEgb2x1xZ9tYXpzYSBmbGFnIHRha8SxbMSxIGthbG1hc8SxbjsgYWtzaSBoYWxkZVxyXG5cdFx0XHRcdC8vIHJlY29ubmVjdCd0ZSBndWFyZCBlcmtlbiByZXR1cm4gZWRpcCB0YWInxLEga2FsxLFjxLEgYm/FnyBixLFyYWvEsXIuKVxyXG5cdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtib290OiR7X2FwcE5hbWV9XSBhcHBsaWNhdGlvbiBib290c3RyYXAgaGF0YXPEsTpgLCBlcnIpO1xyXG5cdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0Ly8gc2hhcmVkQXBwIGhlbsO8eiBzZXQgZWRpbG1lZGl5c2UgKGNyZWF0ZUFwcGxpY2F0aW9uIGJhxZ9hcsSxc8SxeikgcHJvbWlzZSfEsSBzxLFmxLFybGEga2lcclxuXHRcdFx0XHQvLyBzb25yYWtpIHRhYiByZXRyeSBlZGViaWxzaW4g4oCUIGFrc2kgaGFsZGUgcmVqZWN0ZWQgcHJvbWlzZSBjbG9zdXJlJ2RhIGthbMSxY8SxIGthbMSxciB2ZVxyXG5cdFx0XHRcdC8vIHJlbW90ZSBzYXlmYSB5ZW5pbGVtZWRlbiBiaXIgZGFoYSBib290IGVkaWxlbWV6LiAoY3JlYXRlQ29tcG9uZW50IGhhdGFzxLFuZGFcclxuXHRcdFx0XHQvLyBzaGFyZWRBcHBSZWYgemF0ZW4gc2V0J3RpcjsgbyBkdXJ1bWRhIHByb21pc2Uga29ydW51ciwgYXBwIHllbmlkZW4geWFyYXTEsWxtYXouKVxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUmVmKSBzaGFyZWRBcHBQcm9taXNlID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xyXG5cdFx0XHQvLyBTdHJhdGVneSBoaWRkZW4gY29udGFpbmVyIOKGlCB2aWV3IGFyYXPEsSB0YcWfxLFtYWxhcmRhIGByZW1vdmVDaGlsZGAgKyBgYXBwZW5kQ2hpbGRgXHJcblx0XHRcdC8vIGFyZMSxxZ/EsWsgb2xkdcSfdSBpw6dpbiBkaXNjb25uZWN0ZWRDYWxsYmFjayBwYXJlbnQgZGXEn2nFn2ltaXlsZSB0ZXRpa2xlbmlyIOKAlCBlbGVtZW50XHJcblx0XHRcdC8vIGdlcsOnZWt0ZW4gZGVzdHJveSBlZGlsbWl5b3IuIGBwcmVzZXJ2ZVdlYkNvbXBvbmVudEVsZW1lbnRgIMO2bmNlc2luZGUgU3RyYXRlZ3lcclxuXHRcdFx0Ly8gYF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoYCBmbGFnJ2kgc2V0IGVkaXlvcjsgbyBmbGFnIHZhcnNhIHZpZXcga29ydW51ci5cclxuXHRcdFx0Y29uc3QgcHJlc2VydmVGbGFnID0gKHRoaXMgYXMgSFRNTEVsZW1lbnQgJiB7IF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoPzogYm9vbGVhbiB9KS5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaDtcclxuXHRcdFx0aWYgKHByZXNlcnZlRmxhZykge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBGbGFnIHlvayDihpIgZ2Vyw6dlayBkZXN0cm95LiBBc3luYyByZS1jb25uZWN0IGlodGltYWxpbmUga2FyxZ/EsSBtaWNyb3Rhc2sgc8SxbsSxcmzEsVxyXG5cdFx0XHQvLyBkZWZhbnNpZiBnZWNpa21lOyBiaXIgc29ucmFraSB0aWNrJ3RlIGjDomzDoiBkaXNjb25uZWN0ZWQgbcSxIGRpeWUgc29uIGtvbnRyb2wuXHJcblx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0dGhpcy5kZXN0cm95VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy5jb21wUmVmKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhgW2Jvb3Q6JHtfYXBwTmFtZX1dIGdlcsOnZWsgZGVzdHJveSDihpIgdmlldyArIGNoaWxkIGluamVjdG9yIGRlc3Ryb3lgKTtcclxuXHRcdFx0XHRcdC8vIFNoYXJlZCBhcHAnZSBBU0xBIGRva3VubWE7IHNhZGVjZSBidSB0YWInxLFuIHZpZXcnxLFuxLEgdmUgY2hpbGQgaW5qZWN0b3InxLFuxLEgecSxay5cclxuXHRcdFx0XHRcdGlmIChzaGFyZWRBcHBSZWYpIHNoYXJlZEFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29tcFJlZi5ob3N0Vmlldyk7XHJcblx0XHRcdFx0XHR0aGlzLmNvbXBSZWYuZGVzdHJveSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlsZEluamVjdG9yPy5kZXN0cm95KCk7XHJcblx0XHRcdFx0XHR0aGlzLmNvbXBSZWYgPSBudWxsO1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlsZEluamVjdG9yID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0fSwgMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y3VzdG9tRWxlbWVudHMuZGVmaW5lKGBhcHAtJHthcHBOYW1lfWAsIE1GRUFwcEVsZW1lbnQpO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGlmIChlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGUubmFtZSA9PT0gJ05vdFN1cHBvcnRlZEVycm9yJykge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oYFtib290OiR7YXBwTmFtZX1dIGN1c3RvbSBlbGVtZW50IHphdGVuIHRhbsSxbWzEsSwgZGVmaW5lIGF0bGFuZMSxYCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRocm93IGU7XHJcblx0fVxyXG59O1xyXG4iXX0=
@@ -627,6 +627,13 @@ class CustomRouteReuseStrategy {
627
627
  return false;
628
628
  }
629
629
  const routeKey = this.getRouteKey(route);
630
+ // Angular `outlet.detach()`, `store()`'dan ÖNCE çalışıp wrapper view'ını DOM'dan söker →
631
+ // içindeki MFE `<app-xxx>` element'i disconnect olur ve barındırdığı iframe (örn. Superset embed)
632
+ // reload olup auth handshake'ini kalıcı kaybeder. Bu yüzden element'i HÂLÂ bağlıyken, detach'ten
633
+ // ÖNCE atomic `moveBefore` ile hidden container'a alıyoruz (bkz. preserveLiveElementBeforeDetach).
634
+ if (this.isMatcherRoute(route)) {
635
+ this.preserveLiveElementBeforeDetach(route);
636
+ }
630
637
  console.log(`[Strategy] shouldDetach key="${routeKey}" → true`);
631
638
  return true;
632
639
  }
@@ -686,18 +693,16 @@ class CustomRouteReuseStrategy {
686
693
  return;
687
694
  const element = componentInstance.element;
688
695
  const hiddenContainer = this.getHiddenContainer();
689
- // Flag — disconnectedCallback bunu okuyup destroy'ı atlayacak. removeChild'tan
690
- // ÖNCE set ediliyor ki callback ilk tetiklendiğinde flag yerinde olsun.
696
+ // Flag — fallback (moveBefore desteklenmeyen tarayıcı) removeChild yaptığında disconnectedCallback
697
+ // bunu okuyup destroy'ı atlar. moveBefore yolunda callback hiç tetiklenmez (flag zararsız kalır).
691
698
  element.__arilPreserveDuringDetach = true;
692
- // Eğer element zaten bir parent'a sahipse, ondan ayır
693
- if (element.parentNode && element.parentNode !== hiddenContainer) {
694
- element.parentNode.removeChild(element);
695
- }
696
- // Hidden container'a ekle (eğer zaten orada değilse)
697
- if (!hiddenContainer.contains(element)) {
698
- hiddenContainer.appendChild(element);
699
- console.log('Web component element hidden container\'a taşındı (state korunuyor)');
700
- }
699
+ // `shouldDetach` çoğu durumda element'i detach'ten ÖNCE zaten taşıdı burada no-op.
700
+ if (hiddenContainer.contains(element))
701
+ return;
702
+ // Taşınmadıysa (ör. shouldDetach element'i bulamadı): bu noktada element Angular tarafından
703
+ // zaten disconnect edilmiş olabilir; moveInto bağlıysa moveBefore, değilse appendChild kullanır.
704
+ this.moveInto(hiddenContainer, element);
705
+ console.log('Web component element hidden container\'a taşındı (state korunuyor)');
701
706
  }
702
707
  catch (error) {
703
708
  console.warn('Web component element preserve edilirken hata:', error);
@@ -720,35 +725,45 @@ class CustomRouteReuseStrategy {
720
725
  return;
721
726
  const element = componentInstance.element;
722
727
  const hiddenContainer = this.getHiddenContainer();
723
- // Eğer element hidden container'da ise, çıkar
724
- if (hiddenContainer.contains(element)) {
725
- hiddenContainer.removeChild(element);
726
- delete element.__arilPreserveDuringDetach;
727
- console.log('Web component element hidden container\'dan çıkarıldı');
728
- // Component view'ın native element'ine eklemeyi dene
729
- const tryRestore = () => {
730
- const vc = componentInstance.vc;
731
- if (vc?.nativeElement) {
732
- vc.nativeElement.appendChild(element);
733
- console.log('Web component element component view\'a eklendi (retrieve sırasında)');
734
- // Props'ları güncellemek için flag set et (component kendi populateProps'unu çağıracak)
735
- componentInstance.propsUpdated = false;
736
- return true;
737
- }
728
+ if (!hiddenContainer.contains(element))
729
+ return;
730
+ // ÖNEMLI: element'i hidden container'dan ERKEN çıkarmıyoruz. `retrieve`, Angular
731
+ // `outlet.attach()`'ten ÖNCE çağrılır → vc henüz DOM'a bağlı değildir. Erken removeChild
732
+ // element'i disconnect eder ve iframe reload olur (tam kaçındığımız şey). Bunun yerine
733
+ // element'i hidden container'da (bağlı) bırakıp vc bağlanınca atomic moveBefore ile
734
+ // doğrudan hidden vc taşıyoruz; iframe hiç reload olmaz.
735
+ const tryRestore = () => {
736
+ const vcNative = componentInstance.vc?.nativeElement;
737
+ if (!vcNative || !vcNative.isConnected)
738
738
  return false;
739
- };
740
- // Hemen dene
741
- if (!tryRestore()) {
742
- // View henüz hazır değilse, bir sonraki tick'te tekrar dene
743
- setTimeout(() => {
744
- if (!tryRestore()) {
745
- // Hala başarısızsa, flag set et (ngAfterViewInit'te tekrar denenecek)
746
- componentInstance.needsRestore = true;
747
- console.log('Web component element restore edilecek (view hazır değil, ngAfterViewInit\'te tekrar denenecek)');
748
- }
749
- }, 0);
739
+ this.moveInto(vcNative, element);
740
+ // Flag'i moveInto SONRASI sil: fallback removeChild yaparsa disconnectedCallback flag'i hâlâ görsün.
741
+ delete element.__arilPreserveDuringDetach;
742
+ componentInstance.propsUpdated = false;
743
+ console.log('Web component element component view\'a eklendi (retrieve sırasında)');
744
+ return true;
745
+ };
746
+ // Hemen dene (vc genelde bağlı değil) → değilse microtask'te tekrar dene. `outlet.attach()`
747
+ // retrieve'den hemen sonra SENKRON çalışır; microtask geçerli task bitince (attach tamamlanmış,
748
+ // vc bağlı) ama PAINT'ten ÖNCE koşar → element yerine oturur, tab geçişinde boş-flash olmaz.
749
+ if (tryRestore())
750
+ return;
751
+ queueMicrotask(() => {
752
+ if (tryRestore())
753
+ return;
754
+ // Son çare: vc hâlâ bağlı değil. Element'i yine de vc'ye taşı ki tab boş kalmasın
755
+ // (attach view'ı bağlayınca görünür olur — iframe reload olabilir ama eski davranış korunur).
756
+ const vcNative = componentInstance.vc?.nativeElement;
757
+ if (vcNative) {
758
+ this.moveInto(vcNative, element);
759
+ delete element.__arilPreserveDuringDetach;
760
+ componentInstance.propsUpdated = false;
750
761
  }
751
- }
762
+ else {
763
+ componentInstance.needsRestore = true;
764
+ console.log('Web component element restore edilecek (view hazır değil, ngAfterViewInit\'te tekrar denenecek)');
765
+ }
766
+ });
752
767
  }
753
768
  catch (error) {
754
769
  console.warn('Web component element restore edilirken hata:', error);
@@ -772,6 +787,61 @@ class CustomRouteReuseStrategy {
772
787
  }
773
788
  return container;
774
789
  }
790
+ /**
791
+ * `el`'i `target`'ın son çocuğu olacak şekilde TAŞIR. `moveBefore` (atomic move) destekleniyor ve
792
+ * her iki düğüm de bağlıysa onu kullanır: nested browsing context (iframe) reload OLMADAN ve custom
793
+ * element'in connected/disconnected callback'leri tetiklenmeden taşır → iframe-tabanlı embed'lerin
794
+ * (Superset) auth handshake'i + scroll/filtre state'i korunur. Desteklenmiyorsa veya taşıma kısıtları
795
+ * ihlal edilirse (disconnected / cross-document) removeChild+appendChild'a düşer (eski davranış: iframe
796
+ * reload olur ama işlem güvenli tamamlanır).
797
+ */
798
+ moveInto(target, el) {
799
+ const mover = target;
800
+ if (typeof mover.moveBefore === 'function' && el.isConnected && target.isConnected) {
801
+ try {
802
+ mover.moveBefore(el, null);
803
+ return;
804
+ }
805
+ catch {
806
+ // moveBefore kısıtları ihlal edildi → aşağıdaki klasik taşımaya düş.
807
+ }
808
+ }
809
+ if (el.parentNode && el.parentNode !== target) {
810
+ el.parentNode.removeChild(el);
811
+ }
812
+ if (!target.contains(el)) {
813
+ target.appendChild(el);
814
+ }
815
+ }
816
+ /**
817
+ * `shouldDetach` içinden, Angular `outlet.detach()` çalışmadan ÖNCE çağrılır: canlı outlet'teki MFE
818
+ * element'ini `aril-tab-id` attribute'undan bulup atomic `moveBefore` ile hidden container'a taşır.
819
+ * Böylece Angular wrapper view'ını söktüğünde `<app-xxx>` element'i zaten güvenli/bağlı konumdadır ve
820
+ * barındırdığı iframe reload olmaz. Element bulunamaz ya da zaten hidden container'daysa no-op →
821
+ * `store()` eski yoluyla devreye girer (regresyon yok).
822
+ */
823
+ preserveLiveElementBeforeDetach(route) {
824
+ try {
825
+ const tabId = this.getTabIdFromRoute(route);
826
+ if (!tabId)
827
+ return;
828
+ const hiddenContainer = this.getHiddenContainer();
829
+ const candidates = document.querySelectorAll(`[aril-tab-id="${tabId}"]`);
830
+ for (const candidate of Array.from(candidates)) {
831
+ const el = candidate;
832
+ if (hiddenContainer.contains(el))
833
+ continue;
834
+ // Fallback removeChild yolunda disconnectedCallback'in destroy'ı atlaması için flag'i taşımadan ÖNCE set et.
835
+ el.__arilPreserveDuringDetach = true;
836
+ this.moveInto(hiddenContainer, el);
837
+ console.log(`[Strategy] pre-detach preserve: <${el.tagName.toLowerCase()}> tab="${tabId}" hidden container'a taşındı`);
838
+ break;
839
+ }
840
+ }
841
+ catch (error) {
842
+ console.warn('[Strategy] pre-detach preserve hatası:', error);
843
+ }
844
+ }
775
845
  /**
776
846
  * Detached route view'ı içindeki plugin/MFE custom element'lerini (tag adında `-`
777
847
  * bulunan ve `customElements`'a kayıtlı olanları) hidden container'a taşır ve