aril 2.0.1-dev.0 → 2.0.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/boot/config/apps/src/custom-route-reuse-strategy.class.d.ts +17 -0
- package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +109 -39
- package/esm2022/theme/layout/app/layout/mfe.layout.component.mjs +7 -9
- package/fesm2022/aril-boot-config-apps.mjs +108 -38
- package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
- package/fesm2022/aril-theme-layout.mjs +6 -8
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/package.json +183 -183
- package/theme/layout/app/layout/mfe.layout.component.d.ts +1 -7
- package/theme/layout/app/layout/mfe.layout.component.ts +7 -7
|
@@ -111,6 +111,23 @@ export declare class CustomRouteReuseStrategy implements RouteReuseStrategy, OnD
|
|
|
111
111
|
* Global hidden container'ı oluşturur veya döndürür
|
|
112
112
|
*/
|
|
113
113
|
private getHiddenContainer;
|
|
114
|
+
/**
|
|
115
|
+
* `el`'i `target`'ın son çocuğu olacak şekilde TAŞIR. `moveBefore` (atomic move) destekleniyor ve
|
|
116
|
+
* her iki düğüm de bağlıysa onu kullanır: nested browsing context (iframe) reload OLMADAN ve custom
|
|
117
|
+
* element'in connected/disconnected callback'leri tetiklenmeden taşır → iframe-tabanlı embed'lerin
|
|
118
|
+
* (Superset) auth handshake'i + scroll/filtre state'i korunur. Desteklenmiyorsa veya taşıma kısıtları
|
|
119
|
+
* ihlal edilirse (disconnected / cross-document) removeChild+appendChild'a düşer (eski davranış: iframe
|
|
120
|
+
* reload olur ama işlem güvenli tamamlanır).
|
|
121
|
+
*/
|
|
122
|
+
private moveInto;
|
|
123
|
+
/**
|
|
124
|
+
* `shouldDetach` içinden, Angular `outlet.detach()` çalışmadan ÖNCE çağrılır: canlı outlet'teki MFE
|
|
125
|
+
* element'ini `aril-tab-id` attribute'undan bulup atomic `moveBefore` ile hidden container'a taşır.
|
|
126
|
+
* Böylece Angular wrapper view'ını söktüğünde `<app-xxx>` element'i zaten güvenli/bağlı konumdadır ve
|
|
127
|
+
* barındırdığı iframe reload olmaz. Element bulunamaz ya da zaten hidden container'daysa no-op →
|
|
128
|
+
* `store()` eski yoluyla devreye girer (regresyon yok).
|
|
129
|
+
*/
|
|
130
|
+
private preserveLiveElementBeforeDetach;
|
|
114
131
|
/**
|
|
115
132
|
* Detached route view'ı içindeki plugin/MFE custom element'lerini (tag adında `-`
|
|
116
133
|
* bulunan ve `customElements`'a kayıtlı olanları) hidden container'a taşır ve
|
|
@@ -217,6 +217,13 @@ export class CustomRouteReuseStrategy {
|
|
|
217
217
|
return false;
|
|
218
218
|
}
|
|
219
219
|
const routeKey = this.getRouteKey(route);
|
|
220
|
+
// Angular `outlet.detach()`, `store()`'dan ÖNCE çalışıp wrapper view'ını DOM'dan söker →
|
|
221
|
+
// içindeki MFE `<app-xxx>` element'i disconnect olur ve barındırdığı iframe (örn. Superset embed)
|
|
222
|
+
// reload olup auth handshake'ini kalıcı kaybeder. Bu yüzden element'i HÂLÂ bağlıyken, detach'ten
|
|
223
|
+
// ÖNCE atomic `moveBefore` ile hidden container'a alıyoruz (bkz. preserveLiveElementBeforeDetach).
|
|
224
|
+
if (this.isMatcherRoute(route)) {
|
|
225
|
+
this.preserveLiveElementBeforeDetach(route);
|
|
226
|
+
}
|
|
220
227
|
console.log(`[Strategy] shouldDetach key="${routeKey}" → true`);
|
|
221
228
|
return true;
|
|
222
229
|
}
|
|
@@ -276,18 +283,16 @@ export class CustomRouteReuseStrategy {
|
|
|
276
283
|
return;
|
|
277
284
|
const element = componentInstance.element;
|
|
278
285
|
const hiddenContainer = this.getHiddenContainer();
|
|
279
|
-
// Flag —
|
|
280
|
-
//
|
|
286
|
+
// Flag — fallback (moveBefore desteklenmeyen tarayıcı) removeChild yaptığında disconnectedCallback
|
|
287
|
+
// bunu okuyup destroy'ı atlar. moveBefore yolunda callback hiç tetiklenmez (flag zararsız kalır).
|
|
281
288
|
element.__arilPreserveDuringDetach = true;
|
|
282
|
-
//
|
|
283
|
-
if (
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
console.log('Web component element hidden container\'a taşındı (state korunuyor)');
|
|
290
|
-
}
|
|
289
|
+
// `shouldDetach` çoğu durumda element'i detach'ten ÖNCE zaten taşıdı → burada no-op.
|
|
290
|
+
if (hiddenContainer.contains(element))
|
|
291
|
+
return;
|
|
292
|
+
// Taşınmadıysa (ör. shouldDetach element'i bulamadı): bu noktada element Angular tarafından
|
|
293
|
+
// zaten disconnect edilmiş olabilir; moveInto bağlıysa moveBefore, değilse appendChild kullanır.
|
|
294
|
+
this.moveInto(hiddenContainer, element);
|
|
295
|
+
console.log('Web component element hidden container\'a taşındı (state korunuyor)');
|
|
291
296
|
}
|
|
292
297
|
catch (error) {
|
|
293
298
|
console.warn('Web component element preserve edilirken hata:', error);
|
|
@@ -310,35 +315,45 @@ export class CustomRouteReuseStrategy {
|
|
|
310
315
|
return;
|
|
311
316
|
const element = componentInstance.element;
|
|
312
317
|
const hiddenContainer = this.getHiddenContainer();
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
console.log('Web component element component view\'a eklendi (retrieve sırasında)');
|
|
324
|
-
// Props'ları güncellemek için flag set et (component kendi populateProps'unu çağıracak)
|
|
325
|
-
componentInstance.propsUpdated = false;
|
|
326
|
-
return true;
|
|
327
|
-
}
|
|
318
|
+
if (!hiddenContainer.contains(element))
|
|
319
|
+
return;
|
|
320
|
+
// ÖNEMLI: element'i hidden container'dan ERKEN çıkarmıyoruz. `retrieve`, Angular
|
|
321
|
+
// `outlet.attach()`'ten ÖNCE çağrılır → vc henüz DOM'a bağlı değildir. Erken removeChild
|
|
322
|
+
// element'i disconnect eder ve iframe reload olur (tam kaçındığımız şey). Bunun yerine
|
|
323
|
+
// element'i hidden container'da (bağlı) bırakıp vc bağlanınca atomic moveBefore ile
|
|
324
|
+
// doğrudan hidden → vc taşıyoruz; iframe hiç reload olmaz.
|
|
325
|
+
const tryRestore = () => {
|
|
326
|
+
const vcNative = componentInstance.vc?.nativeElement;
|
|
327
|
+
if (!vcNative || !vcNative.isConnected)
|
|
328
328
|
return false;
|
|
329
|
-
|
|
330
|
-
//
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
329
|
+
this.moveInto(vcNative, element);
|
|
330
|
+
// Flag'i moveInto SONRASI sil: fallback removeChild yaparsa disconnectedCallback flag'i hâlâ görsün.
|
|
331
|
+
delete element.__arilPreserveDuringDetach;
|
|
332
|
+
componentInstance.propsUpdated = false;
|
|
333
|
+
console.log('Web component element component view\'a eklendi (retrieve sırasında)');
|
|
334
|
+
return true;
|
|
335
|
+
};
|
|
336
|
+
// Hemen dene (vc genelde bağlı değil) → değilse microtask'te tekrar dene. `outlet.attach()`
|
|
337
|
+
// retrieve'den hemen sonra SENKRON çalışır; microtask geçerli task bitince (attach tamamlanmış,
|
|
338
|
+
// vc bağlı) ama PAINT'ten ÖNCE koşar → element yerine oturur, tab geçişinde boş-flash olmaz.
|
|
339
|
+
if (tryRestore())
|
|
340
|
+
return;
|
|
341
|
+
queueMicrotask(() => {
|
|
342
|
+
if (tryRestore())
|
|
343
|
+
return;
|
|
344
|
+
// Son çare: vc hâlâ bağlı değil. Element'i yine de vc'ye taşı ki tab boş kalmasın
|
|
345
|
+
// (attach view'ı bağlayınca görünür olur — iframe reload olabilir ama eski davranış korunur).
|
|
346
|
+
const vcNative = componentInstance.vc?.nativeElement;
|
|
347
|
+
if (vcNative) {
|
|
348
|
+
this.moveInto(vcNative, element);
|
|
349
|
+
delete element.__arilPreserveDuringDetach;
|
|
350
|
+
componentInstance.propsUpdated = false;
|
|
340
351
|
}
|
|
341
|
-
|
|
352
|
+
else {
|
|
353
|
+
componentInstance.needsRestore = true;
|
|
354
|
+
console.log('Web component element restore edilecek (view hazır değil, ngAfterViewInit\'te tekrar denenecek)');
|
|
355
|
+
}
|
|
356
|
+
});
|
|
342
357
|
}
|
|
343
358
|
catch (error) {
|
|
344
359
|
console.warn('Web component element restore edilirken hata:', error);
|
|
@@ -362,6 +377,61 @@ export class CustomRouteReuseStrategy {
|
|
|
362
377
|
}
|
|
363
378
|
return container;
|
|
364
379
|
}
|
|
380
|
+
/**
|
|
381
|
+
* `el`'i `target`'ın son çocuğu olacak şekilde TAŞIR. `moveBefore` (atomic move) destekleniyor ve
|
|
382
|
+
* her iki düğüm de bağlıysa onu kullanır: nested browsing context (iframe) reload OLMADAN ve custom
|
|
383
|
+
* element'in connected/disconnected callback'leri tetiklenmeden taşır → iframe-tabanlı embed'lerin
|
|
384
|
+
* (Superset) auth handshake'i + scroll/filtre state'i korunur. Desteklenmiyorsa veya taşıma kısıtları
|
|
385
|
+
* ihlal edilirse (disconnected / cross-document) removeChild+appendChild'a düşer (eski davranış: iframe
|
|
386
|
+
* reload olur ama işlem güvenli tamamlanır).
|
|
387
|
+
*/
|
|
388
|
+
moveInto(target, el) {
|
|
389
|
+
const mover = target;
|
|
390
|
+
if (typeof mover.moveBefore === 'function' && el.isConnected && target.isConnected) {
|
|
391
|
+
try {
|
|
392
|
+
mover.moveBefore(el, null);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// moveBefore kısıtları ihlal edildi → aşağıdaki klasik taşımaya düş.
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (el.parentNode && el.parentNode !== target) {
|
|
400
|
+
el.parentNode.removeChild(el);
|
|
401
|
+
}
|
|
402
|
+
if (!target.contains(el)) {
|
|
403
|
+
target.appendChild(el);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* `shouldDetach` içinden, Angular `outlet.detach()` çalışmadan ÖNCE çağrılır: canlı outlet'teki MFE
|
|
408
|
+
* element'ini `aril-tab-id` attribute'undan bulup atomic `moveBefore` ile hidden container'a taşır.
|
|
409
|
+
* Böylece Angular wrapper view'ını söktüğünde `<app-xxx>` element'i zaten güvenli/bağlı konumdadır ve
|
|
410
|
+
* barındırdığı iframe reload olmaz. Element bulunamaz ya da zaten hidden container'daysa no-op →
|
|
411
|
+
* `store()` eski yoluyla devreye girer (regresyon yok).
|
|
412
|
+
*/
|
|
413
|
+
preserveLiveElementBeforeDetach(route) {
|
|
414
|
+
try {
|
|
415
|
+
const tabId = this.getTabIdFromRoute(route);
|
|
416
|
+
if (!tabId)
|
|
417
|
+
return;
|
|
418
|
+
const hiddenContainer = this.getHiddenContainer();
|
|
419
|
+
const candidates = document.querySelectorAll(`[aril-tab-id="${tabId}"]`);
|
|
420
|
+
for (const candidate of Array.from(candidates)) {
|
|
421
|
+
const el = candidate;
|
|
422
|
+
if (hiddenContainer.contains(el))
|
|
423
|
+
continue;
|
|
424
|
+
// Fallback removeChild yolunda disconnectedCallback'in destroy'ı atlaması için flag'i taşımadan ÖNCE set et.
|
|
425
|
+
el.__arilPreserveDuringDetach = true;
|
|
426
|
+
this.moveInto(hiddenContainer, el);
|
|
427
|
+
console.log(`[Strategy] pre-detach preserve: <${el.tagName.toLowerCase()}> tab="${tabId}" hidden container'a taşındı`);
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
console.warn('[Strategy] pre-detach preserve hatası:', error);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
365
435
|
/**
|
|
366
436
|
* Detached route view'ı içindeki plugin/MFE custom element'lerini (tag adında `-`
|
|
367
437
|
* bulunan ve `customElements`'a kayıtlı olanları) hidden container'a taşır ve
|
|
@@ -537,4 +607,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
537
607
|
providedIn: 'root'
|
|
538
608
|
}]
|
|
539
609
|
}], ctorParameters: () => [] });
|
|
540
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJvdXRlLXJldXNlLXN0cmF0ZWd5LmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L2NvbmZpZy9hcHBzL3NyYy9jdXN0b20tcm91dGUtcmV1c2Utc3RyYXRlZ3kuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixVQUFVLEVBQWMsVUFBVSxFQUFhLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJNUcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBNkIxRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBSUgsTUFBTSxPQUFPLHdCQUF3QjtJQVdwQztRQVZBLHNCQUFpQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxpQkFBWSxHQUF3QyxFQUFFLENBQUM7UUFFdkQ7Ozs7V0FJRztRQUNLLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO1FBR3BGLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ3JELElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU87WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsR0FBRyxpQkFBaUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUIscUZBQXFGO1lBQ3JGLHlGQUF5RjtZQUN6RixtRkFBbUY7WUFDbkYsdUZBQXVGO1lBQ3ZGLDhDQUE4QztZQUM5QyxJQUFJLEdBQUcsQ0FB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TyxLQUFLLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDO1FBQzNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUM7UUFDckYsT0FBTyxDQUFDLEdBQUcsQ0FDVix3Q0FBd0MsV0FBVyxhQUFhLFNBQVMsS0FBSyxVQUFVLFdBQVcsT0FBTyxLQUFLLFFBQVEsR0FBRyxDQUMxSCxDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQzs4R0E3Zlcsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGeEIsTUFBTTs7MkZBRU4sd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBEZXRhY2hlZFJvdXRlSGFuZGxlLCBSb3V0ZVJldXNlU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgUGx1Z2luQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgUm91dGVDbG9zZVNlcnZpY2UgfSBmcm9tICcuL3JvdXRlLWNsb3NlLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEFuZ3VsYXIgUm91dGVyIGBEZXRhY2hlZFJvdXRlSGFuZGxlYCfEsSByZXNtaSBvbGFyYWsgb3BhcXVlIChge31gKSBiaXIgdHlwZS5cclxuICogSW50ZXJuYWwgc2hhcGUnaSBwdWJsaWMgQVBJJ2RhIHlvaywgYW1hIGJpeiBwcmVzZXJ2ZS9yZXN0b3JlIGnDp2luIGNvbXBvbmVudFJlZidlXHJcbiAqIGVyacWfbWVtaXogZ2VyZWtpeW9yLiBCdSB5w7x6ZGVuIGludGVybmFsIHlhcMSxecSxIG1pbmltYWwgxZ9la2lsZGUgbW9kZWxsaXlvcnV6LlxyXG4gKi9cclxudHlwZSBJbnRlcm5hbERldGFjaGVkUm91dGVIYW5kbGUgPSBEZXRhY2hlZFJvdXRlSGFuZGxlICYge1xyXG5cdGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjx1bmtub3duPjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBcmlsV2ViQ29tcG9uZW50V3JhcHBlciBpbnN0YW5jZSfEsW5kYSBzdHJhdGVneSduaW4gZ8O2emxleWVjZcSfaSBhbGFubGFyLlxyXG4gKiBXcmFwcGVyJ2EgZG/En3J1ZGFuIGJhxJ/EsW1sxLEgb2xtYW1hayBpw6dpbiBkdWNrLXR5cGluZyBpbGUgbWluaW1hbCBpbnRlcmZhY2UuXHJcbiAqIGBuZWVkc1Jlc3RvcmVgIHZlIGBwcm9wc1VwZGF0ZWRgIGJheXJha2xhcsSxIHdyYXBwZXIgaWxlIHN0cmF0ZWd5IGFyYXPEsW5kYWtpIHPDtnpsZcWfbWU6XHJcbiAqIHN0cmF0ZWd5IGByZXRyaWV2ZWAgc8SxcmFzxLFuZGEgc2V0IGVkZXIsIHdyYXBwZXIgYG5nQWZ0ZXJWaWV3SW5pdGAndGUgdMO8a2V0aXIuXHJcbiAqL1xyXG50eXBlIFdyYXBwZXJJbnN0YW5jZSA9IHtcclxuXHRlbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcblx0dmM/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHRwcm9wc1VwZGF0ZWQ/OiBib29sZWFuO1xyXG5cdG5lZWRzUmVzdG9yZT86IGJvb2xlYW47XHJcbn07XHJcblxyXG5pbnRlcmZhY2UgUHJlc2VydmVkQ3VzdG9tRWwge1xyXG5cdGVsOiBIVE1MRWxlbWVudDtcclxuXHRwbGFjZWhvbGRlcjogQ29tbWVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRhYi1iYXpsxLEgbmF2aWdhdGlvbiBpw6dpbiBjdXN0b20gYFJvdXRlUmV1c2VTdHJhdGVneWAuXHJcbiAqXHJcbiAqICMjIFRhYiBpem9sYXN5b251IChgX3RhYmAgcXVlcnkgcGFyYW0pXHJcbiAqIGBOYXZTZXJ2aWNlYCBoZXIgdGFiJ2EgdW5pcXVlIGB0YWJJZGAgw7xyZXRpciB2ZSBVUkwnZSBgP190YWI9PHRhYklkPmAgcXVlcnkgcGFyYW1cclxuICogZWtsZXIuIFN0cmF0ZWd5IGJ1IHBhcmFtJ8SxIHJvdXRlIGtleSdpbiBwYXLDp2FzxLEgeWFwYXI6XHJcbiAqICAtIE1hdGNoZXIgKHdlYiBjb21wb25lbnQpIHJvdXRlJ2xhcjogYG1mZToke3JlbW90ZU5hbWV9OiR7dGFiSWR9YFxyXG4gKiAgLSBOb3JtYWwgcm91dGUnbGFyOiBgcGF0aEZyb21Sb290YCArIHTDvG0gcXVlcnlQYXJhbXMgKHphdGVuIGBfdGFiYCBkYWhpbClcclxuICpcclxuICogU29udcOnOiBheW7EsSBzYXlmYW7EsW4gaWtpIHRhYidpIGBzdG9yZWRSb3V0ZXNgIMO8emVyaW5kZSBmYXJrbMSxIHNsb3QnbGFyYSB5YXrEsWzEsXJcclxuICog4oaSIGJhxJ/EsW1zxLF6IGNvbXBvbmVudFJlZidsZXIsIGJhxJ/EsW1zxLF6IHN0YXRlLiBgc2hvdWxkUmV1c2VSb3V0ZWAgbWF0Y2hlciBrYXLFn8SxbGHFn3TEsXJtYXPEsVxyXG4gKiBgdGFiSWRgIGZhcmvEsW7EsSBkYSBkaWtrYXRlIGFsxLFyIOKAlCB0YWIgZGXEn2nFn2ltaW5kZSBmcmVzaCBjb21wb25lbnQgb2x1xZ91ci5cclxuICpcclxuICogIyMgTWltYXJpOiBpa2kgYmHEn8SxbXPEsXogaW5zdGFuY2VcclxuICogQnUgc3RyYXRlZ3kgaGVtIGBhcmlsL2Jvb3QvaG9zdC9zcmMvYm9vdHN0cmFwLnRzYCd0ZSBoZW0gaGVyIE1GRSByZW1vdGUndW51blxyXG4gKiBgYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzYCdpbmRlIHByb3ZpZGVyIG9sYXJhayB2ZXJpbGl5b3IuIENsYXNzXHJcbiAqIGBwcm92aWRlZEluOiAncm9vdCdgIG9sZHXEn3UgacOnaW4gKipoZXIgcm9vdCBpbmplY3RvcidkYSBBWVJJIGluc3RhbmNlKiogeWHFn2FyLlxyXG4gKiDEsGtpIGluc3RhbmNlIGJhxJ/EsW1zxLF6IGBzdG9yZWRSb3V0ZXNgIG1hcCdpIHR1dGFyIHZlIGJpcmJpcmluZGVuIGhhYmVyc2l6ZGlyOlxyXG4gKlxyXG4gKiAtICoqSG9zdCBpbnN0YW5jZSoqOiBtYXRjaGVyIHJvdXRlJ2xhcsSxIHnDtm5ldGlyOyBrZXkgYG1mZToke3JlbW90ZU5hbWV9OiR7dGFiSWR9YC5cclxuICogICBUYWIga2FwYW7EsXAgYG1mZTp3ZG06YWJjMTIzYCBzaWxpbmRpxJ9pbmRlIGVmZmVjdCByZW1vdGUnYSBhaXQgYCMwL3dkbS8uLi5gXHJcbiAqICAgcHJlZml4J2xpIFZFIGBfdGFiPWFiYzEyM2AgacOnZXJlbiBjaGlsZCBrZXknbGVyaSBkZSB0ZW1pemxlci5cclxuICogLSAqKk1GRSBpbnN0YW5jZSoqIChoZXIgcmVtb3RlJ3VuIGtlbmRpIGnDp2luZGUpOiBub3JtYWwgcm91dGUnbGFyIGnDp2luIMOnYWzEscWfxLFyLlxyXG4gKiAgIFF1ZXJ5IHBhcmFtcyB6YXRlbiBgZ2V0Um91dGVLZXlgIMOnxLFrdMSxc8SxbmEgZGFoaWwgb2xkdcSfdSBpw6dpbiB0YWIgaXpvbGFzeW9udVxyXG4gKiAgIGRvxJ9hbCBvbGFyYWsgZ2VsaXIg4oCUIGVrIMO2emVsIGRhdnJhbsSxxZ8gZ2VyZWttZXouXHJcbiAqXHJcbiAqICMjIFBsdWdpbiBjdXN0b20gZWxlbWVudCBwcmVzZXJ2YXRpb25cclxuICogYHByZXNlcnZlQ3VzdG9tRWxlbWVudHNJblRyZWVgIGRldGFjaGVkIHZpZXcnZGFraSBgPG1kLXNlYXJjaD5gIGdpYmkgY3VzdG9tXHJcbiAqIGVsZW1lbnQnbGVyaSBoaWRkZW4gY29udGFpbmVyJ2EgdGHFn8SxciDigJQgZWxlbWVudCBkb2N1bWVudCd0YW4gYXlyxLFsbWF6LCBBbmd1bGFyXHJcbiAqIEVsZW1lbnRzIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AgMTBtcyBkZXN0cm95IHRpbWVyJ8SxIHRldGlrbGVubWV6LCBwbHVnaW5cclxuICogY29tcG9uZW50UmVmJ2kgdmUgZGFoaWxpIHN0YXRlJ2kgKGZvcm0gaW5wdXQsIHNlYXJjaCBzb251w6dsYXLEsSkga29ydW51ci5cclxuICpcclxuICogIyMgQmlsaW5lbiBzxLFuxLFybGFtYWxhclxyXG4gKiAtIGBzaG91bGREZXRhY2hgIG1hdGNoZXIgcm91dGUnbGFyIGnDp2luIHRhYklkIHlva2tlbiBmYWxzZSBkw7ZuZXIgKHRhYnPEsXogb3JwaGFuXHJcbiAqICAgaGFuZGxlIG9sdcWfbWFzxLFuKSwgZGnEn2VyIGR1cnVtbGFyZGEgYHRydWVgIOKAlCB0w7xtIGRldGFjaGVkIHJvdXRlJ2xhciBjYWNoZSdsZW5pci5cclxuICogICBNZW1vcnkgbGVhaydpIHPEsW7EsXJsYW1hayBpw6dpbiBgTmF2U2VydmljZWAgdGFiIHNhecSxc8SxbsSxIGBNQVhfVEFCU2AgaWxlIGvEsXPEsXRsYXJcclxuICogICB2ZSBzb24gdGFiIGthcGF0xLFsZMSxxJ/EsW5kYSBlZmZlY3QgcmVtb3RlJ3VuIHTDvG0gY2hpbGQga2V5J2xlcmluaSB0ZW1pemxlci4gWWluZSBkZVxyXG4gKiAgIHRhYiBpw6dpbmRlIGHDp8SxbGFuIGRldGFpbC9lZGl0IGdpYmkgcGFyYW1ldHJlbGkgYWx0IHNheWZhbGFyxLFuIGhhbmRsZSdsYXLEsSwgcGFyZW50XHJcbiAqICAgdGFiIGthcGFuYW5hIGthZGFyIHN0b3JlZFJvdXRlcyd0YSBrYWzEsXIuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21Sb3V0ZVJldXNlU3RyYXRlZ3kgaW1wbGVtZW50cyBSb3V0ZVJldXNlU3RyYXRlZ3ksIE9uRGVzdHJveSB7XHJcblx0cm91dGVDbG9zZVNlcnZpY2U6IFJvdXRlQ2xvc2VTZXJ2aWNlID0gaW5qZWN0KFJvdXRlQ2xvc2VTZXJ2aWNlKTtcclxuXHRzdG9yZWRSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIERldGFjaGVkUm91dGVIYW5kbGU+ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIGAoZGV0YWNoZWRUcmVlIGFzIGFueSkuX19hcmlsUHJlc2VydmVkQ3VzdG9tRWxzID0gWy4uLl1gIHJ1bnRpbWUgcHJvcGVydHlcclxuXHQgKiBla2xlbWVrIHllcmluZSBoYW5kbGUnxLEga2V5IG9sYXJhayBrdWxsYW5hbiBiaXIgV2Vha01hcCB0dXR1eW9ydXog4oCUXHJcblx0ICogdHlwZS1zYWZlIHZlIGhhbmRsZSBHQyd5ZSB1xJ9yYWTEscSfxLFuZGEgYmVsbGVrIG90b21hdGlrIHRlbWl6bGVuaXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmVzZXJ2ZWRDdXN0b21FbHMgPSBuZXcgV2Vha01hcDxEZXRhY2hlZFJvdXRlSGFuZGxlLCBQcmVzZXJ2ZWRDdXN0b21FbFtdPigpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdGNvbnN0IGtleSA9IHRoaXMucm91dGVDbG9zZVNlcnZpY2UuZGVsZXRlUm91dGUoKS5rZXk7XHJcblx0XHRcdGlmICgha2V5KSByZXR1cm47XHJcblx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIGNsZWFudXAgdGV0aWtsZW5kaSBrZXk9XCIke2tleX1cIiBzdG9yZWRLZXlzPVske09iamVjdC5rZXlzKHRoaXMuc3RvcmVkUm91dGVzKS5qb2luKCcsJyl9XWApO1xyXG5cdFx0XHR0aGlzLnByb2Nlc3NDbGVhbnVwS2V5KGtleSk7XHJcblxyXG5cdFx0XHQvLyBDcm9zcy1pbmplY3RvciB5YXnEsW46IGBSb3V0ZUNsb3NlU2VydmljZWAgYHByb3ZpZGVkSW46ICdyb290J2Agb2xkdcSfdSBpw6dpbiBob3N0IHZlXHJcblx0XHRcdC8vIGhlciBNRkUgcmVtb3RlJ3VuZGEgQVlSSSBpbnN0YW5jZSB5YcWfYXIuIEhvc3QndGFuIHRldGlrbGVuZW4gY2xlYW51cCBNRkUgc3RyYXRlZ3knc2luaVxyXG5cdFx0XHQvLyBvdG9tYXRpayB1eWFuZMSxcm1hei4gV2luZG93IGV2ZW50IGlsZSBzaW55YWwgeWF5xLFubGF5xLFwIE1GRSBzdHJhdGVneSdzaW5pbiBrZW5kaVxyXG5cdFx0XHQvLyBgc3RvcmVkUm91dGVzYCd1bnUgdGVtaXpsZW1lc2luaSBzYcSfbMSxeW9ydXogKGFrc2kgdGFrZGlyZGUgTUZFJ2RlIGhpZGRlbiBjb250YWluZXInYVxyXG5cdFx0XHQvLyB0YcWfxLFubcSxxZ8gcGx1Z2luIGVsZW1lbnQnbGVyaSBvcnBoYW4ga2FsxLFyKS5cclxuXHRcdFx0aWYgKGtleS5zdGFydHNXaXRoKCdtZmU6JykpIHtcclxuXHRcdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlTWF0Y2hlcktleShrZXkpO1xyXG5cdFx0XHRcdGlmIChwYXJzZWQpIHtcclxuXHRcdFx0XHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KFxyXG5cdFx0XHRcdFx0XHRuZXcgQ3VzdG9tRXZlbnQoJ2FyaWw6cmVtb3RlLWNsZWFudXAnLCB7XHJcblx0XHRcdFx0XHRcdFx0ZGV0YWlsOiB7IHJlbW90ZU5hbWU6IHBhcnNlZC5yZW1vdGVOYW1lLCB0YWJJZDogcGFyc2VkLnRhYklkIH1cclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBLYXLFn8SxIHnDtm5kZSAoY3Jvc3MtaW5qZWN0b3IpOiBob3N0IHN0cmF0ZWd5J25pbiB5YXnEsW5sYWTEscSfxLEgYGFyaWw6cmVtb3RlLWNsZWFudXBgXHJcblx0XHQvLyBldmVudCdpbmkgaGVyIE1GRSBzdHJhdGVneSBpbnN0YW5jZSfEsSB5YWthbGFyLCBrZW5kaSBgc3RvcmVkUm91dGVzYCd1bmRha2kgbyByZW1vdGUnYVxyXG5cdFx0Ly8gKHZlIHZhcnNhIG8gdGFiSWQneWUpIGFpdCBrZXknbGVyaSB0ZW1pemxlci4gSG9zdCBzdHJhdGVneSBkZSBidSBsaXN0ZW5lcidhIHNhaGlwXHJcblx0XHQvLyBhbWEga2VuZGkgYCMwLyR7cmVtb3RlTmFtZX0vLi4uYCBrZXknbGVyaSBvbG1hZMSxxJ/EsSBpw6dpbiBuby1vcCDDp2FsxLHFn8SxciAoZ8O8dmVubGkpLlxyXG5cdFx0Y29uc3QgY2xlYW51cEhhbmRsZXIgPSAoZTogRXZlbnQpOiB2b2lkID0+IHtcclxuXHRcdFx0Y29uc3QgZGV0YWlsID0gKGUgYXMgQ3VzdG9tRXZlbnQ8eyByZW1vdGVOYW1lPzogc3RyaW5nOyB0YWJJZD86IHN0cmluZyB8IG51bGwgfT4pLmRldGFpbDtcclxuXHRcdFx0Y29uc3QgcmVtb3RlTmFtZSA9IGRldGFpbD8ucmVtb3RlTmFtZTtcclxuXHRcdFx0aWYgKCFyZW1vdGVOYW1lKSByZXR1cm47XHJcblx0XHRcdGNvbnN0IHRhYklkID0gZGV0YWlsPy50YWJJZCA/PyBudWxsO1xyXG5cdFx0XHRjb25zdCBwcmVmaXggPSBgIzAvJHtyZW1vdGVOYW1lfWA7XHJcblx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnN0b3JlZFJvdXRlcykuZmlsdGVyKChrKSA9PiB7XHJcblx0XHRcdFx0aWYgKCFrLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdC8vIHRhYklkIHZlcmlsZGl5c2UgU0FERUNFIG8gdGFiJ2EgYWl0IGNoaWxkIGhhbmRsZSdsYXLEsSB0ZW1pemxlLiBBa3NpIHRha2RpcmRlXHJcblx0XHRcdFx0Ly8gYXluxLEgcmVtb3RlJ3VuIGJhxZ9rYSB0YWInbGVyaW5pbiBzdGF0ZSdpIGRlIHlhbmzEscWfbMSxa2xhIHNpbGluaXIuXHJcblx0XHRcdFx0aWYgKHRhYklkICYmICFrLmluY2x1ZGVzKGBfdGFiPSR7dGFiSWR9YCkpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmICgha2V5cy5sZW5ndGgpIHJldHVybjtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gY3Jvc3MtaW5qZWN0b3IgY2xlYW51cCByZW1vdGVOYW1lPVwiJHtyZW1vdGVOYW1lfVwiIHRhYklkPVwiJHt0YWJJZCA/PyAnKid9XCIga2V5cz1bJHtrZXlzLmpvaW4oJywnKX1dYCk7XHJcblx0XHRcdGZvciAoY29uc3QgayBvZiBrZXlzKSB7XHJcblx0XHRcdFx0dGhpcy5jbGVhbnVwU3RvcmVkSGFuZGxlKHRoaXMuc3RvcmVkUm91dGVzW2tdKTtcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5zdG9yZWRSb3V0ZXNba107XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYXJpbDpyZW1vdGUtY2xlYW51cCcsIGNsZWFudXBIYW5kbGVyKTtcclxuXHRcdC8vIFN0cmF0ZWd5IGBwcm92aWRlZEluOiAncm9vdCdgIOKGkiByb290IGluamVjdG9yIGRlc3Ryb3kgZWRpbGRpxJ9pbmRlIGxpc3RlbmVyJ8SxIGthbGTEsXIuXHJcblx0XHQvLyBQcmF0aWt0ZSB1enVuIMO2bcO8cmzDvCBhbWEgdGVzdCBvcnRhbcSxIHZlIGdlbGVjZWt0ZWtpIGlmcmFtZSB2Yi4gbXVsdGktd2luZG93XHJcblx0XHQvLyBzZW5hcnlvbGFyZGEgb3JwaGFuIGxpc3RlbmVyIGLEsXJha21hbWFrIGnDp2luIGRlZmVuc2l2ZS5cclxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FyaWw6cmVtb3RlLWNsZWFudXAnLCBjbGVhbnVwSGFuZGxlcikpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5qZWN0b3IgZGVzdHJveSBlZGlsZGnEn2luZGUg4oCUIGhpYnJpdCBtb2RkYSBoZXIgdGFiJ8SxbiBjaGlsZCBgRW52aXJvbm1lbnRJbmplY3RvcmAnxLEgdGFiXHJcblx0ICoga2FwYW7EsW5jYSBgZGVzdHJveSgpYCBlZGlsaXI7IGJ1IHN0cmF0ZWd5IGBwcm92aWRlZEluOidyb290J2Agb2xkdcSfdW5kYW4gY2hpbGQgaW5qZWN0b3InZGFcclxuXHQgKiAocm9vdC1zY29wZSkgbWF0ZXJpYWxpemUgb2xtdcWfIGluc3RhbmNlIGRhIHnEsWvEsWzEsXIg4oCUIGBzdG9yZWRSb3V0ZXNgJ3RhIGthbGFuIFTDnE0gZGV0YWNoZWRcclxuXHQgKiBoYW5kbGUnbGFyxLEgdGVtaXpsZXIuIEFrc2kgaGFsZGUgYHByZXNlcnZlQ3VzdG9tRWxlbWVudHNJblRyZWVgIGlsZSBoaWRkZW4gY29udGFpbmVyJ2FcclxuXHQgKiB0YcWfxLFubcSxxZ8gcGx1Z2luIGN1c3RvbSBlbGVtZW50J2xlcmkgKMO2cm4uIGA8bWQtc2VhcmNoPmApIG9ycGhhbiBrYWzEsXIgKG1lbW9yeSBsZWFrKTogTUZFXHJcblx0ICogaW50ZXJuYWwgcm91dGUga2V5J2xlcmkgYF90YWJgIHRhxZ/EsW1hZMSxxJ/EsSBpw6dpbiBgYXJpbDpyZW1vdGUtY2xlYW51cGAgY3Jvc3MtaW5qZWN0b3IgdGVtaXpsacSfaVxyXG5cdCAqIG9ubGFyYSB1bGHFn2FtYXouIEluamVjdG9yLWRlc3Ryb3kgYmF6bMSxIGJ1IHPDvHDDvHJtZSBnYXJhbnRpbGkgdmUgaWRlbXBvdGVudHRpci5cclxuXHQgKi9cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnN0b3JlZFJvdXRlcyk7XHJcblx0XHRpZiAoa2V5cy5sZW5ndGgpIGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIG5nT25EZXN0cm95IOKGkiAke2tleXMubGVuZ3RofSBzdG9yZWQgaGFuZGxlIHRlbWl6bGVuaXlvciAodGFiIGthcGFuZMSxKWApO1xyXG5cdFx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG5cdFx0XHR0aGlzLmNsZWFudXBTdG9yZWRIYW5kbGUodGhpcy5zdG9yZWRSb3V0ZXNba2V5XSk7XHJcblx0XHRcdGRlbGV0ZSB0aGlzLnN0b3JlZFJvdXRlc1trZXldO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVmVyaWxlbiBrZXkgacOnaW4gZGlyZWN0ICsgY2hpbGQgY2xlYW51cCB1eWd1bGFyLiBFZmZlY3QgacOnaW5kZW4gYXlyxLHFn3TEsXLEsWxtxLHFnyBoZWxwZXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcm9jZXNzQ2xlYW51cEtleShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Ly8gRG/En3J1ZGFuIGXFn2xlxZ9lbiBrZXkgdmFyc2Egb251IHNpbC5cclxuXHRcdGlmICh0aGlzLnN0b3JlZFJvdXRlc1trZXldKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIGNsZWFudXAg4oaSIGRpcmVjdCBtYXRjaCBcIiR7a2V5fVwiYCk7XHJcblx0XHRcdHRoaXMuY2xlYW51cFN0b3JlZEhhbmRsZSh0aGlzLnN0b3JlZFJvdXRlc1trZXldKTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMuc3RvcmVkUm91dGVzW2tleV07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWF0Y2hlciBrZXkgc2lsaW5kacSfaW5kZSAoYG1mZTp3ZG06YWJjYCBnaWJpKSBvIHJlbW90ZSdhIGFpdCDigJQgdmFyc2EgbyB0YWInYSBhaXQg4oCUXHJcblx0XHQvLyBpbnRlcm5hbCByb3V0ZSBoYW5kbGUnbGFyxLFuxLEgZGEgdGVtaXpsZS4gQ29udmVudGlvbjogbWF0Y2hlciBrZXlcclxuXHRcdC8vIGBtZmU6JHtyZW1vdGVOYW1lfWAgdmV5YSBgbWZlOiR7cmVtb3RlTmFtZX06JHt0YWJJZH1gLCBub3JtYWwga2V5J2xlclxyXG5cdFx0Ly8gYCMwLyR7cmVtb3RlTmFtZX0vLi4uPy4uLiZfdGFiPSR7dGFiSWR9YCBmb3JtYXTEsW5kYS5cclxuXHRcdGlmIChrZXkuc3RhcnRzV2l0aCgnbWZlOicpKSB7XHJcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VNYXRjaGVyS2V5KGtleSk7XHJcblx0XHRcdGlmICghcGFyc2VkKSByZXR1cm47XHJcblx0XHRcdGNvbnN0IHsgcmVtb3RlTmFtZSwgdGFiSWQgfSA9IHBhcnNlZDtcclxuXHRcdFx0Y29uc3QgcHJlZml4ID0gYCMwLyR7cmVtb3RlTmFtZX1gO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5zdG9yZWRSb3V0ZXMpKSB7XHJcblx0XHRcdFx0aWYgKCFrLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XHJcblx0XHRcdFx0Ly8gdGFiSWQgdmVyaWxkaXlzZSBzYWRlY2UgbyB0YWInYSBhaXQgY2hpbGQgaGFuZGxlJ2xhcsSxIHRlbWl6bGVcclxuXHRcdFx0XHRpZiAodGFiSWQgJiYgIWsuaW5jbHVkZXMoYF90YWI9JHt0YWJJZH1gKSkgY29udGludWU7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gY2xlYW51cCDihpIgY2hpbGQgbWF0Y2ggXCIke2t9XCJgKTtcclxuXHRcdFx0XHR0aGlzLmNsZWFudXBTdG9yZWRIYW5kbGUodGhpcy5zdG9yZWRSb3V0ZXNba10pO1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnN0b3JlZFJvdXRlc1trXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogYG1mZToke3JlbW90ZU5hbWV9YCB2ZXlhIGBtZmU6JHtyZW1vdGVOYW1lfToke3RhYklkfWAgZm9ybWF0xLFuZGFraSBtYXRjaGVyIGtleSdpIHBhcnNlIGVkZXIuXHJcblx0ICogdGFiSWQgeW9rc2EgYG51bGxgIGTDtm5lciAoZ2VyaXllIGTDtm7DvGsgdXl1bWx1bHVrOiBsZWdhY3kgw6dhxJ9yxLFsYXIgdGFiSWQgdmVybWV5ZWJpbGlyKS5cclxuXHQgKi9cclxuXHRwcml2YXRlIHBhcnNlTWF0Y2hlcktleShrZXk6IHN0cmluZyk6IHsgcmVtb3RlTmFtZTogc3RyaW5nOyB0YWJJZDogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbCB7XHJcblx0XHRpZiAoIWtleS5zdGFydHNXaXRoKCdtZmU6JykpIHJldHVybiBudWxsO1xyXG5cdFx0Y29uc3QgdGFpbCA9IGtleS5zdWJzdHJpbmcoNCk7XHJcblx0XHRjb25zdCBjb2xvbklkeCA9IHRhaWwuaW5kZXhPZignOicpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0cmVtb3RlTmFtZTogY29sb25JZHggPT09IC0xID8gdGFpbCA6IHRhaWwuc3Vic3RyaW5nKDAsIGNvbG9uSWR4KSxcclxuXHRcdFx0dGFiSWQ6IGNvbG9uSWR4ID09PSAtMSA/IG51bGwgOiB0YWlsLnN1YnN0cmluZyhjb2xvbklkeCArIDEpXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcmVkIGhhbmRsZSfEsSB0YW1hbWVuIHRlbWl6bGU6IGhpZGRlbiBjb250YWluZXInZGFraSBwcmVzZXJ2ZWQgZWxlbWVudCdsZXJpIChwbHVnaW5cclxuXHQgKiBjdXN0b20gZWxlbWVudCdsZXJpICsgQXJpbFdlYkNvbXBvbmVudFdyYXBwZXInxLFuIGA8YXBwLXh4eD5gIGVsZW1lbnQnaSkgRE9NJ2RhbiBrYWxkxLFyLFxyXG5cdCAqIHNvbnJhIEFuZ3VsYXIgYGNvbXBvbmVudFJlZi5kZXN0cm95KClgIGlsZSB2aWV3IHRyZWUnc2luaSBkZXN0cm95IGV0LlxyXG5cdCAqXHJcblx0ICogYGNvbXBvbmVudFJlZi5kZXN0cm95KClgIHRlayBiYcWfxLFuYSB5ZXRlcmxpIGRlxJ9pbDogQW5ndWxhciBzYWRlY2UgdmlldyB0cmVlJ3NpbmkgYmlsaXIsXHJcblx0ICogYml6aW0gYHByZXNlcnZlQ3VzdG9tRWxlbWVudHNJblRyZWVgIHZlIGBwcmVzZXJ2ZVdlYkNvbXBvbmVudEVsZW1lbnRgIGlsZSBoaWRkZW5cclxuXHQgKiBjb250YWluZXInYSBtYW51ZWwgdGHFn8SxbmFuIGVsZW1lbnQnbGVyZGVuIGhhYmVyaSB5b2t0dXIg4oaSIG9ubGFyIG9ycGhhbiBrYWzEsXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjbGVhbnVwU3RvcmVkSGFuZGxlKGhhbmRsZTogRGV0YWNoZWRSb3V0ZUhhbmRsZSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuXHRcdGlmICghaGFuZGxlKSByZXR1cm47IC8vIEFuZ3VsYXIgUm91dGVyJ8SxbiBgc3RvcmUocm91dGUsIG51bGwpYCBpbGUgYsSxcmFrdMSxxJ/EsSBvcnBoYW4ga2V5J2xlciBpw6dpbiBkZWZlbnNpdmUgZ3VhcmQuXHJcblx0XHRjb25zdCBoaWRkZW5Db250YWluZXIgPSB0aGlzLmdldEhpZGRlbkNvbnRhaW5lcigpO1xyXG5cclxuXHRcdC8vIDEuIHByZXNlcnZlQ3VzdG9tRWxlbWVudHNJblRyZWUgaWxlIHRhxZ/EsW5hbiBwbHVnaW4gZWxlbWVudCdsZXJpICjDtnJuLiA8bWQtc2VhcmNoPilcclxuXHRcdGNvbnN0IHByZXNlcnZlZCA9IHRoaXMucHJlc2VydmVkQ3VzdG9tRWxzLmdldChoYW5kbGUpO1xyXG5cdFx0aWYgKHByZXNlcnZlZCkge1xyXG5cdFx0XHRmb3IgKGNvbnN0IHsgZWwgfSBvZiBwcmVzZXJ2ZWQpIHtcclxuXHRcdFx0XHRpZiAoaGlkZGVuQ29udGFpbmVyLmNvbnRhaW5zKGVsKSkge1xyXG5cdFx0XHRcdFx0aGlkZGVuQ29udGFpbmVyLnJlbW92ZUNoaWxkKGVsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wcmVzZXJ2ZWRDdXN0b21FbHMuZGVsZXRlKGhhbmRsZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gMi4gcHJlc2VydmVXZWJDb21wb25lbnRFbGVtZW50IGlsZSB0YcWfxLFuYW4gd3JhcHBlciBlbGVtZW50J2kgKMO2cm4uIDxhcHAtd2RtPilcclxuXHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IChoYW5kbGUgYXMgSW50ZXJuYWxEZXRhY2hlZFJvdXRlSGFuZGxlKS5jb21wb25lbnRSZWY7XHJcblx0XHRjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZj8uaW5zdGFuY2UgYXMgV3JhcHBlckluc3RhbmNlIHwgdW5kZWZpbmVkO1xyXG5cdFx0aWYgKGluc3RhbmNlPy5lbGVtZW50KSB7XHJcblx0XHRcdC8vIEZsYWcnaSB0ZW1pemxlIGtpIHJlbW92ZUNoaWxkIHNvbnJhc8SxIHRldGlrbGVuZW4gZGlzY29ubmVjdGVkQ2FsbGJhY2sgQXBwbGljYXRpb24nxLFcclxuXHRcdFx0Ly8gZ2Vyw6dla3RlbiBkZXN0cm95IGV0c2luIOKAlCBha3NpIGhhbGRlIE1GRUFwcEVsZW1lbnQgb3JwaGFuIGthbMSxciAobWVtb3J5IGxlYWspLlxyXG5cdFx0XHRkZWxldGUgKGluc3RhbmNlLmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgJiB7IF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoPzogYm9vbGVhbiB9KS5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaDtcclxuXHRcdFx0aWYgKGhpZGRlbkNvbnRhaW5lci5jb250YWlucyhpbnN0YW5jZS5lbGVtZW50KSkge1xyXG5cdFx0XHRcdGhpZGRlbkNvbnRhaW5lci5yZW1vdmVDaGlsZChpbnN0YW5jZS5lbGVtZW50KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDMuIEFuZ3VsYXIgdmlldyB0cmVlJ3NpbmkgZGVzdHJveSBldFxyXG5cdFx0Y29tcG9uZW50UmVmPy5kZXN0cm95KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNYXRjaGVyIChNRkUpIHJvdXRlJ2xhciBpw6dpbiB0YWJJZCB6b3J1bmx1LiBgZ2V0VGFiSWRGcm9tUm91dGVgIFVSTCBxdWVyeVBhcmFtcyArXHJcblx0ICogaGlzdG9yeS5zdGF0ZSdpIG9rdXIuIEhpw6diaXIga2F5bmFrIHRhYklkIHZlcm1lenNlIChpbGsgbmF2aWdhdGlvbiBpbnRlcmltJ2kpIGRldGFjaFxyXG5cdCAqIGVkaWxtZXo7IGBmaXJzdENoZWNrRm9yUm91dGVgIGBfdGFiYCBla2xleWlwIHllbmlkZW4gbmF2aWdhdGUgZWRlY2VrLlxyXG5cdCAqL1xyXG5cdHNob3VsZERldGFjaChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKHRoaXMuaXNNYXRjaGVyUm91dGUocm91dGUpICYmICF0aGlzLmdldFRhYklkRnJvbVJvdXRlKHJvdXRlKSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBzaG91bGREZXRhY2gga2V5PVwiJHt0aGlzLmdldFJvdXRlS2V5KHJvdXRlKX1cIiDihpIgZmFsc2UgKG1hdGNoZXIgcm91dGUsIHRhYklkIHlvaylgKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgcm91dGVLZXkgPSB0aGlzLmdldFJvdXRlS2V5KHJvdXRlKTtcclxuXHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHNob3VsZERldGFjaCBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiB0cnVlYCk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdHN0b3JlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBzdG9yZSBrZXk9XCIke3JvdXRlS2V5fVwiIGhhbmRsZT1gLCAhIWRldGFjaGVkVHJlZSk7XHJcblx0XHRpZiAoIWRldGFjaGVkVHJlZSkge1xyXG5cdFx0XHRkZWxldGUgdGhpcy5zdG9yZWRSb3V0ZXNbcm91dGVLZXldO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5pc01hdGNoZXJSb3V0ZShyb3V0ZSkgJiYgIXRoaXMuZ2V0VGFiSWRGcm9tUm91dGUocm91dGUpKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHN0b3JlIFNLSVAga2V5PVwiJHtyb3V0ZUtleX1cIiAobWF0Y2hlciByb3V0ZSwgdGFiSWQgeW9rKWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLnN0b3JlZFJvdXRlc1tyb3V0ZUtleV0gPSBkZXRhY2hlZFRyZWU7XHJcblx0XHR0aGlzLnByZXNlcnZlV2ViQ29tcG9uZW50RWxlbWVudChkZXRhY2hlZFRyZWUpO1xyXG5cdFx0dGhpcy5wcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGRldGFjaGVkVHJlZSk7XHJcblx0fVxyXG5cclxuXHRzaG91bGRBdHRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLmlzTWF0Y2hlclJvdXRlKHJvdXRlKSAmJiAhdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZSkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gc2hvdWxkQXR0YWNoIGtleT1cIiR7dGhpcy5nZXRSb3V0ZUtleShyb3V0ZSl9XCIg4oaSIGZhbHNlIChtYXRjaGVyIHJvdXRlLCB0YWJJZCB5b2spYCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zdCBzaG91bGRBdHRhY2ggPSAhIXRoaXMuc3RvcmVkUm91dGVzW3JvdXRlS2V5XTtcclxuXHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHNob3VsZEF0dGFjaCBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiAke3Nob3VsZEF0dGFjaH0gKHN0b3JlZEtleXM9WyR7T2JqZWN0LmtleXModGhpcy5zdG9yZWRSb3V0ZXMpLmpvaW4oJywnKX1dKWApO1xyXG5cdFx0cmV0dXJuIHNob3VsZEF0dGFjaDtcclxuXHR9XHJcblxyXG5cdHJldHJpZXZlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGV0YWNoZWRSb3V0ZUhhbmRsZSB8IG51bGwge1xyXG5cdFx0aWYgKHRoaXMuaXNNYXRjaGVyUm91dGUocm91dGUpICYmICF0aGlzLmdldFRhYklkRnJvbVJvdXRlKHJvdXRlKSkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zdCBoYW5kbGUgPSB0aGlzLnN0b3JlZFJvdXRlc1tyb3V0ZUtleV07XHJcblx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSByZXRyaWV2ZSBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiAke2hhbmRsZSA/ICdIQVMnIDogJ05VTEwnfWApO1xyXG5cdFx0aWYgKGhhbmRsZSkge1xyXG5cdFx0XHR0aGlzLnJlc3RvcmVXZWJDb21wb25lbnRFbGVtZW50KGhhbmRsZSk7XHJcblx0XHRcdHRoaXMucmVzdG9yZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGhhbmRsZSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaGFuZGxlIHx8IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXZWIgY29tcG9uZW50IGVsZW1lbnQnaW5pIGhpZGRlbiBjb250YWluZXInYSB0YcWfxLFyIChzdGF0ZSBrb3J1bm1hc8SxIGnDp2luKS5cclxuXHQgKlxyXG5cdCAqIEVsZW1lbnQnZSBgX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2hgIGZsYWcnaSB5YXrEsWzEsXI6IGByZW1vdmVDaGlsZGAgKyBgYXBwZW5kQ2hpbGRgXHJcblx0ICogYXJhc8SxbmRhIE1GRSBjdXN0b20gZWxlbWVudCdpbiBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgJ2kgdGV0aWtsZW5peW9yOyBmbGFnIG9yYWRha2lcclxuXHQgKiBkZXN0cm95IHRpbWVyJ8SxbsSxICoqZGV0ZXJtaW5pc3RpYyoqIMWfZWtpbGRlIGJ5cGFzcyBlZGVyLiBFc2tpZGVuIDUwbXMgaGFyZGNvZGVkIHRpbWVyXHJcblx0ICogeWFyxLHFnyBrb8WfdWx1IMO8cmV0aXlvcmR1ICh5YXZhxZ8gY2loYXpsYXJkYSBBcHBsaWNhdGlvbiBpc3RlbXNpeiBkZXN0cm95IG9sdXlvcmR1KS5cclxuXHQgKi9cclxuXHRwcml2YXRlIHByZXNlcnZlV2ViQ29tcG9uZW50RWxlbWVudChkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IChkZXRhY2hlZFRyZWUgYXMgSW50ZXJuYWxEZXRhY2hlZFJvdXRlSGFuZGxlKS5jb21wb25lbnRSZWY7XHJcblx0XHRcdGlmICghY29tcG9uZW50UmVmKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBXcmFwcGVySW5zdGFuY2UgfCB1bmRlZmluZWQ7XHJcblx0XHRcdGlmICghY29tcG9uZW50SW5zdGFuY2U/LmVsZW1lbnQpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnRJbnN0YW5jZS5lbGVtZW50IGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfTtcclxuXHRcdFx0Y29uc3QgaGlkZGVuQ29udGFpbmVyID0gdGhpcy5nZXRIaWRkZW5Db250YWluZXIoKTtcclxuXHJcblx0XHRcdC8vIEZsYWcg4oCUIGRpc2Nvbm5lY3RlZENhbGxiYWNrIGJ1bnUgb2t1eXVwIGRlc3Ryb3knxLEgYXRsYXlhY2FrLiByZW1vdmVDaGlsZCd0YW5cclxuXHRcdFx0Ly8gw5ZOQ0Ugc2V0IGVkaWxpeW9yIGtpIGNhbGxiYWNrIGlsayB0ZXRpa2xlbmRpxJ9pbmRlIGZsYWcgeWVyaW5kZSBvbHN1bi5cclxuXHRcdFx0ZWxlbWVudC5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaCA9IHRydWU7XHJcblxyXG5cdFx0XHQvLyBFxJ9lciBlbGVtZW50IHphdGVuIGJpciBwYXJlbnQnYSBzYWhpcHNlLCBvbmRhbiBhecSxclxyXG5cdFx0XHRpZiAoZWxlbWVudC5wYXJlbnROb2RlICYmIGVsZW1lbnQucGFyZW50Tm9kZSAhPT0gaGlkZGVuQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0ZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIaWRkZW4gY29udGFpbmVyJ2EgZWtsZSAoZcSfZXIgemF0ZW4gb3JhZGEgZGXEn2lsc2UpXHJcblx0XHRcdGlmICghaGlkZGVuQ29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpKSB7XHJcblx0XHRcdFx0aGlkZGVuQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdXZWIgY29tcG9uZW50IGVsZW1lbnQgaGlkZGVuIGNvbnRhaW5lclxcJ2EgdGHFn8SxbmTEsSAoc3RhdGUga29ydW51eW9yKScpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ1dlYiBjb21wb25lbnQgZWxlbWVudCBwcmVzZXJ2ZSBlZGlsaXJrZW4gaGF0YTonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXZWIgY29tcG9uZW50IGVsZW1lbnQnaW5pIGhpZGRlbiBjb250YWluZXInZGFuIMOnxLFrYXIgdmUgY29tcG9uZW50IHZpZXcnYSBla2xlbWV5aSBkZW5lLlxyXG5cdCAqXHJcblx0ICogYF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoYCBmbGFnJ2kgdGVtaXpsZW5pciDigJQgZcSfZXIgYnUgcmV0cmlldmUgc29ucmFzxLEgZWxlbWVudFxyXG5cdCAqIGdlcsOnZWsgYW5sYW1kYSBkZXN0cm95IGVkaWxpcnNlIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AgZmxhZyB5b2sga2FidWwgZWRpcCBBcHBsaWNhdGlvblxyXG5cdCAqIGNsZWFudXAnxLFuxLEgecO8csO8dGVjZWsuXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZXN0b3JlV2ViQ29tcG9uZW50RWxlbWVudChkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IChkZXRhY2hlZFRyZWUgYXMgSW50ZXJuYWxEZXRhY2hlZFJvdXRlSGFuZGxlKS5jb21wb25lbnRSZWY7XHJcblx0XHRcdGlmICghY29tcG9uZW50UmVmKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBXcmFwcGVySW5zdGFuY2UgfCB1bmRlZmluZWQ7XHJcblx0XHRcdGlmICghY29tcG9uZW50SW5zdGFuY2U/LmVsZW1lbnQpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnRJbnN0YW5jZS5lbGVtZW50IGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfTtcclxuXHRcdFx0Y29uc3QgaGlkZGVuQ29udGFpbmVyID0gdGhpcy5nZXRIaWRkZW5Db250YWluZXIoKTtcclxuXHJcblx0XHRcdC8vIEXEn2VyIGVsZW1lbnQgaGlkZGVuIGNvbnRhaW5lcidkYSBpc2UsIMOnxLFrYXJcclxuXHRcdFx0aWYgKGhpZGRlbkNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KSkge1xyXG5cdFx0XHRcdGhpZGRlbkNvbnRhaW5lci5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuXHRcdFx0XHRkZWxldGUgZWxlbWVudC5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaDtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnV2ViIGNvbXBvbmVudCBlbGVtZW50IGhpZGRlbiBjb250YWluZXJcXCdkYW4gw6fEsWthcsSxbGTEsScpO1xyXG5cclxuXHRcdFx0XHQvLyBDb21wb25lbnQgdmlldyfEsW4gbmF0aXZlIGVsZW1lbnQnaW5lIGVrbGVtZXlpIGRlbmVcclxuXHRcdFx0XHRjb25zdCB0cnlSZXN0b3JlID0gKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmMgPSBjb21wb25lbnRJbnN0YW5jZS52YztcclxuXHRcdFx0XHRcdGlmICh2Yz8ubmF0aXZlRWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHR2Yy5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnV2ViIGNvbXBvbmVudCBlbGVtZW50IGNvbXBvbmVudCB2aWV3XFwnYSBla2xlbmRpIChyZXRyaWV2ZSBzxLFyYXPEsW5kYSknKTtcclxuXHRcdFx0XHRcdFx0Ly8gUHJvcHMnbGFyxLEgZ8O8bmNlbGxlbWVrIGnDp2luIGZsYWcgc2V0IGV0IChjb21wb25lbnQga2VuZGkgcG9wdWxhdGVQcm9wcyd1bnUgw6dhxJ/EsXJhY2FrKVxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRJbnN0YW5jZS5wcm9wc1VwZGF0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Ly8gSGVtZW4gZGVuZVxyXG5cdFx0XHRcdGlmICghdHJ5UmVzdG9yZSgpKSB7XHJcblx0XHRcdFx0XHQvLyBWaWV3IGhlbsO8eiBoYXrEsXIgZGXEn2lsc2UsIGJpciBzb25yYWtpIHRpY2sndGUgdGVrcmFyIGRlbmVcclxuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRyeVJlc3RvcmUoKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbGEgYmHFn2FyxLFzxLF6c2EsIGZsYWcgc2V0IGV0IChuZ0FmdGVyVmlld0luaXQndGUgdGVrcmFyIGRlbmVuZWNlaylcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRJbnN0YW5jZS5uZWVkc1Jlc3RvcmUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdXZWIgY29tcG9uZW50IGVsZW1lbnQgcmVzdG9yZSBlZGlsZWNlayAodmlldyBoYXrEsXIgZGXEn2lsLCBuZ0FmdGVyVmlld0luaXRcXCd0ZSB0ZWtyYXIgZGVuZW5lY2VrKScpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LCAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignV2ViIGNvbXBvbmVudCBlbGVtZW50IHJlc3RvcmUgZWRpbGlya2VuIGhhdGE6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2xvYmFsIGhpZGRlbiBjb250YWluZXInxLEgb2x1xZ90dXJ1ciB2ZXlhIGTDtm5kw7xyw7xyXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRIaWRkZW5Db250YWluZXIoKTogSFRNTEVsZW1lbnQge1xyXG5cdFx0Y29uc3Qgc2xvdCA9IGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7IF9fYXJpbFdlYkNvbXBvbmVudEhpZGRlbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50IH07XHJcblx0XHRsZXQgY29udGFpbmVyID0gc2xvdC5fX2FyaWxXZWJDb21wb25lbnRIaWRkZW5Db250YWluZXI7XHJcblx0XHRpZiAoIWNvbnRhaW5lcikge1xyXG5cdFx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xyXG5cdFx0XHRjb250YWluZXIuc3R5bGUudG9wID0gJy05OTk5cHgnO1xyXG5cdFx0XHRjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblx0XHRcdHNsb3QuX19hcmlsV2ViQ29tcG9uZW50SGlkZGVuQ29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvbnRhaW5lcjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGFjaGVkIHJvdXRlIHZpZXcnxLEgacOnaW5kZWtpIHBsdWdpbi9NRkUgY3VzdG9tIGVsZW1lbnQnbGVyaW5pICh0YWcgYWTEsW5kYSBgLWBcclxuXHQgKiBidWx1bmFuIHZlIGBjdXN0b21FbGVtZW50c2AnYSBrYXnEsXRsxLEgb2xhbmxhcsSxKSBoaWRkZW4gY29udGFpbmVyJ2EgdGHFn8SxciB2ZVxyXG5cdCAqIHllcmxlcmluZSBiaXJlciBDb21tZW50IHBsYWNlaG9sZGVyIGLEsXJha8Sxci4gRWxlbWVudCBkb2N1bWVudCd0YW4gYXlyxLFsbWF6LFxyXG5cdCAqIEFuZ3VsYXIgRWxlbWVudHMgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYCAxMG1zIGRlc3Ryb3kgdGltZXInxLEga2FuYXQgw6fEsXJwbWF6IOKAlFxyXG5cdCAqIGRvbGF5xLFzxLF5bGEgcGx1Z2luJ2luIGBDb21wb25lbnRSZWZgIHZlIGRhaGlsaSBzdGF0ZSdpIChmb3JtIGRlxJ9lcmxlcmksIHNlYXJjaFxyXG5cdCAqIHNvbnXDp2xhcsSxIHZzLikgc29ucmFraSByZXRyaWV2ZSdlIGthZGFyIGtvcnVudXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGRldGFjaGVkVHJlZTogRGV0YWNoZWRSb3V0ZUhhbmRsZSk6IHZvaWQge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY29tcG9uZW50UmVmID0gKGRldGFjaGVkVHJlZSBhcyBJbnRlcm5hbERldGFjaGVkUm91dGVIYW5kbGUpLmNvbXBvbmVudFJlZjtcclxuXHRcdFx0Y29uc3Qgcm9vdEVsID0gY29tcG9uZW50UmVmPy5sb2NhdGlvbj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHRcdFx0aWYgKCFyb290RWwpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCk7XHJcblx0XHRcdGNvbnN0IGFsbCA9IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcblx0XHRcdGNvbnN0IHByZXNlcnZlZExpc3Q6IFByZXNlcnZlZEN1c3RvbUVsW10gPSBbXTtcclxuXHJcblx0XHRcdGZvciAoY29uc3QgZWwgb2YgQXJyYXkuZnJvbShhbGwpKSB7XHJcblx0XHRcdFx0Y29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdGlmICghdGFnLmluY2x1ZGVzKCctJykpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdGlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzPy5nZXQodGFnKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBlbCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoYGFyaWwtcHJlc2VydmVkOiR7dGFnfWApO1xyXG5cdFx0XHRcdG5vZGUucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCBub2RlKTtcclxuXHRcdFx0XHRoaWRkZW5Db250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XHJcblx0XHRcdFx0cHJlc2VydmVkTGlzdC5wdXNoKHsgZWw6IG5vZGUsIHBsYWNlaG9sZGVyIH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocHJlc2VydmVkTGlzdC5sZW5ndGgpIHtcclxuXHRcdFx0XHR0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5zZXQoZGV0YWNoZWRUcmVlLCBwcmVzZXJ2ZWRMaXN0KTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlOiAke3ByZXNlcnZlZExpc3QubGVuZ3RofSBlbGVtZW50IHRhxZ/EsW5kxLFgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdDdXN0b20gZWxlbWVudCBwcmVzZXJ2ZSBlZGlsaXJrZW4gaGF0YTonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlIGlsZSB0YcWfxLFuYW4gY3VzdG9tIGVsZW1lbnQnbGVyaSBvcmlqaW5hbFxyXG5cdCAqIHBsYWNlaG9sZGVyJ2xhcsSxbsSxbiB5ZXJpbmUgZ2VyaSBrb3lhci5cclxuXHQgKi9cclxuXHRwcml2YXRlIHJlc3RvcmVDdXN0b21FbGVtZW50c0luVHJlZShkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHByZXNlcnZlZExpc3QgPSB0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5nZXQoZGV0YWNoZWRUcmVlKTtcclxuXHRcdFx0aWYgKCFwcmVzZXJ2ZWRMaXN0Py5sZW5ndGgpIHJldHVybjtcclxuXHJcblx0XHRcdGZvciAoY29uc3QgeyBlbCwgcGxhY2Vob2xkZXIgfSBvZiBwcmVzZXJ2ZWRMaXN0KSB7XHJcblx0XHRcdFx0aWYgKHBsYWNlaG9sZGVyLnBhcmVudE5vZGUpIHtcclxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsLCBwbGFjZWhvbGRlcik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIFBsYWNlaG9sZGVyIGHEn2HDp3RhbiBrb3BhcsSxbG3EscWfIOKAlCBwYXJlbnQgdmlldyB0YW1hbWVuIGRlc3Ryb3kgZWRpbG1pxZ8gb2xhYmlsaXJcclxuXHRcdFx0XHRcdC8vICjDtnJuLiByZW1vdGUgdGFiIGthcGFubcSxxZ8pLiBFbGVtZW50J2kgaGlkZGVuIGNvbnRhaW5lcidkYSBixLFyYWttYW1hayBpw6dpbiBjbGVhbnVwLlxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbU3RyYXRlZ3ldIHJlc3RvcmU6IHBsYWNlaG9sZGVyIHBhcmVudCB5b2ssIGN1c3RvbSBlbGVtZW50IGNsZWFudXAgZWRpbGl5b3InLCBlbC50YWdOYW1lKTtcclxuXHRcdFx0XHRcdGlmIChlbC5wYXJlbnROb2RlID09PSB0aGlzLmdldEhpZGRlbkNvbnRhaW5lcigpKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCkucmVtb3ZlQ2hpbGQoZWwpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5kZWxldGUoZGV0YWNoZWRUcmVlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gcmVzdG9yZUN1c3RvbUVsZW1lbnRzSW5UcmVlOiAke3ByZXNlcnZlZExpc3QubGVuZ3RofSBlbGVtZW50IGdlcmkgeWVybGXFn3RpcmlsZGlgKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignQ3VzdG9tIGVsZW1lbnQgcmVzdG9yZSBlZGlsaXJrZW4gaGF0YTonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGlzTWF0Y2hlclJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuICEhcm91dGU/LnJvdXRlQ29uZmlnPy5tYXRjaGVyO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRSZW1vdGVOYW1lKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG5cdFx0cmV0dXJuIChyb3V0ZT8ucm91dGVDb25maWc/LmRhdGEgYXMgUGx1Z2luQ29uZmlnIHwgdW5kZWZpbmVkKT8ucmVtb3RlTmFtZSA/PyBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVVJMIGA/X3RhYj08dGFiSWQ+YCBxdWVyeSBwYXJhbSfEsW7EsSBva3Ug4oCUIGBOYXZTZXJ2aWNlYCBoZXIgdGFiIGnDp2luIHVuaXF1ZSBkZcSfZXIgw7xyZXRpci5cclxuXHQgKiBgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5YCBzYXllc2luZGUgaG9zdCBSb3V0ZXInYSB0YWJzxLF6IG5hdmlnYXRpb24gZ2VsbWV6LCBzYWRlY2VcclxuXHQgKiBgdGFiU3RhdGUoe190YWJ9KWAnbMSxIHRhYiB0xLFrbGFtYWxhcsSxIGdlbGlyIOKGkiBgcm91dGUucXVlcnlQYXJhbXNbJ190YWInXWAgaGVyIHphbWFuIGRvbHUuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcclxuXHRcdGNvbnN0IHYgPSByb3V0ZT8ucXVlcnlQYXJhbXM/LlsnX3RhYiddO1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDAgPyB2IDogbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdXRlIGtleSdpbmkgb2x1xZ90dXJ1ci4gTWF0Y2hlciAod2ViIGNvbXBvbmVudCkgcm91dGUnbGFyIGnDp2luIHJlbW90ZU5hbWUgKyB0YWJJZFxyXG5cdCAqIGJhemzEsSBrZXkga3VsbGFuxLFsxLFyIOKAlCBheW7EsSByZW1vdGUndW4gaGVyIHRhYidpIGF5csSxIE1GRSBjdXN0b20gZWxlbWVudCBpbnN0YW5jZSfEsW5hXHJcblx0ICogc2FoaXB0aXIgKGJhxJ/EsW1zxLF6IHN0YXRlKS5cclxuXHQgKlxyXG5cdCAqIE5vcm1hbCByb3V0ZSdsYXIgacOnaW4gYHBhdGhGcm9tUm9vdGAgw7x6ZXJpbmRlbiB0YW0geW9sIMO8cmV0aWxpciwgYXJkxLFuZGFuIHF1ZXJ5IHBhcmFtc1xyXG5cdCAqIGVrbGVuaXIgKHphdGVuIGBfdGFiYCBkYWhpbCkg4oCUIG5lc3RlZCBib8WfLXBhdGggKGBwYXRoOiAnJ2ApIGNoaWxkIHJvdXRlJ2xhcsSxbsSxbiBheW7EsSBgXCJcImBcclxuXHQgKiBrZXknaXlsZSDDp2FrxLHFn21hc8SxbsSxIGVuZ2VsbGVyIHZlIGF5bsSxIHBhdGgnaW4gaWtpIHRhYidpIGZhcmtsxLEga2V5IGFsxLFyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZ2V0Um91dGVLZXkocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRoaXMuaXNNYXRjaGVyUm91dGUocm91dGUpKSB7XHJcblx0XHRcdGNvbnN0IHJlbW90ZU5hbWUgPSB0aGlzLmdldFJlbW90ZU5hbWUocm91dGUpO1xyXG5cdFx0XHRpZiAocmVtb3RlTmFtZSkge1xyXG5cdFx0XHRcdGNvbnN0IHRhYklkID0gdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZSk7XHJcblx0XHRcdFx0cmV0dXJuIHRhYklkID8gYG1mZToke3JlbW90ZU5hbWV9OiR7dGFiSWR9YCA6IGBtZmU6JHtyZW1vdGVOYW1lfWA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIFRhbSBwYXRoOiBrw7ZrIOKGkiBpbnRlcm1lZGlhdGUg4oaSIHNlbGYuIEJvxZ8gc2VnbWVudGxlcmkgaW5kZXggaWxlIGtvcnV5YXJhayBoaXllcmFyxZ9pXHJcblx0XHQvLyBwb3ppc3lvbnVudSBrZXknZSBkYWhpbCBlZGVyaXogKGthcmRlxZ8gZW1wdHktcGF0aCByb3V0ZSdsYXIgZmFya2zEsSBrZXkgYWzEsXIpLlxyXG5cdFx0Y29uc3QgZnVsbFBhdGggPSByb3V0ZS5wYXRoRnJvbVJvb3RcclxuXHRcdFx0Lm1hcCgociwgaSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNlZyA9IHIudXJsLm1hcCgocykgPT4gcy5wYXRoKS5qb2luKCcvJyk7XHJcblx0XHRcdFx0cmV0dXJuIHNlZy5sZW5ndGggPiAwID8gc2VnIDogYCMke2l9YDtcclxuXHRcdFx0fSlcclxuXHRcdFx0LmpvaW4oJy8nKTtcclxuXHRcdGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5zZXJpYWxpemVRdWVyeVBhcmFtcyhyb3V0ZS5xdWVyeVBhcmFtcyk7XHJcblx0XHRjb25zdCBmcmFnbWVudCA9IHJvdXRlLmZyYWdtZW50ID8gJyMnICsgcm91dGUuZnJhZ21lbnQgOiAnJztcclxuXHJcblx0XHRyZXR1cm4gZnVsbFBhdGggKyBxdWVyeVBhcmFtcyArIGZyYWdtZW50O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnkgcGFyYW0nbGFyxLEgVVJMLXNhZmUgxZ9la2lsZGUgc2VyaWxlxZ90aXJpci4gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3IndW5hXHJcblx0ICogZG/En3J1ZGFuIG9iamVjdCB2ZXJpcnNlayBhcnJheSBkZcSfZXJsZXIgYD9pZHM9MSwyLDNgIGdpYmkgdGVrIGtleSBvbGFyYWsgeWF6xLFsxLFyO1xyXG5cdCAqIEFuZ3VsYXIgUm91dGVyJ8SxbiBgP2lkcz0xJmlkcz0yJmlkcz0zYCBkYXZyYW7EscWfxLF5bGEgdXl1bXN1eiBvbGFiaWxpci4gYGFwcGVuZGAgaWxlXHJcblx0ICogaGVyIGFycmF5IGVsZW1hbsSxIGF5csSxIGVudHJ5IG9sdXIgdmUgbnVsbC91bmRlZmluZWQgZGXEn2VybGVyIGF0bGFuxLFyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VyaWFsaXplUXVlcnlQYXJhbXMocGFyYW1zOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90WydxdWVyeVBhcmFtcyddKTogc3RyaW5nIHtcclxuXHRcdC8vIGBzb3J0KClgIGlsZSBkZXRlcm1pbmlzbSDigJQgYXluxLEgc2F5ZmFuxLFuIGZhcmtsxLEgaW5zZXJ0aW9uLW9yZGVyJ2zEsSBxdWVyeVBhcmFtcyfEsVxyXG5cdFx0Ly8gKGRlZXAgbGluayBzaGFyZSwgc2VydmVyLXNpZGUgcmVuZGVyLCBKUy1nZW5lcmF0ZWQgVVJMJ2xlcikgYXluxLEgcm91dGUga2V5IMO8cmV0aXIuXHJcblx0XHQvLyBBa3NpIHRha2RpcmRlIGA/Yj0xJmE9MmAgdmUgYD9hPTImYj0xYCBpa2kgYXlyxLEgaGFuZGxlIG9sYXJhayBjYWNoZSdsZW5pciDihpIgdGFiXHJcblx0XHQvLyBpem9sYXN5b251IGF5bsSxIHNheWZhbsSxbiBpa2kgYXlyxLEgaW5zdGFuY2UnxLFuxLEgYcOnYXIuXHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKS5zb3J0KCk7XHJcblx0XHRpZiAoIWtleXMubGVuZ3RoKSByZXR1cm4gJyc7XHJcblx0XHRjb25zdCBvdXQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcblx0XHRmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xyXG5cdFx0XHRjb25zdCB2ID0gcGFyYW1zW2tdO1xyXG5cdFx0XHRpZiAodiA9PSBudWxsKSBjb250aW51ZTtcclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodikpIHtcclxuXHRcdFx0XHR2LmZvckVhY2goKHZ2KSA9PiB2diAhPSBudWxsICYmIG91dC5hcHBlbmQoaywgU3RyaW5nKHZ2KSkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG91dC5hcHBlbmQoaywgU3RyaW5nKHYpKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgc3RyID0gb3V0LnRvU3RyaW5nKCk7XHJcblx0XHRyZXR1cm4gc3RyID8gJz8nICsgc3RyIDogJyc7XHJcblx0fVxyXG5cclxuXHRzaG91bGRSZXVzZVJvdXRlKGZ1dHVyZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY3VycjogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgZnV0dXJlTWF0Y2hlciA9IHRoaXMuaXNNYXRjaGVyUm91dGUoZnV0dXJlKTtcclxuXHRcdGNvbnN0IGN1cnJNYXRjaGVyID0gdGhpcy5pc01hdGNoZXJSb3V0ZShjdXJyKTtcclxuXHJcblx0XHRpZiAoZnV0dXJlTWF0Y2hlciAmJiBjdXJyTWF0Y2hlcikge1xyXG5cdFx0XHRjb25zdCBmciA9IHRoaXMuZ2V0UmVtb3RlTmFtZShmdXR1cmUpO1xyXG5cdFx0XHRjb25zdCBjciA9IHRoaXMuZ2V0UmVtb3RlTmFtZShjdXJyKTtcclxuXHRcdFx0Y29uc3QgZnQgPSB0aGlzLmdldFRhYklkRnJvbVJvdXRlKGZ1dHVyZSk7XHJcblx0XHRcdGNvbnN0IGN0ID0gdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShjdXJyKTtcclxuXHRcdFx0Ly8gQXluxLEgcmVtb3RlIG9sc2EgYmlsZSBmYXJrbMSxIHRhYidsZXJzZSBmcmVzaCBjb21wb25lbnQgaW5zdGFudGlhdGUgZWRpbG1lbGkg4oCUXHJcblx0XHRcdC8vIGFrc2kgdGFrZGlyZGUgaWtpIHRhYiB0ZWsgY29tcG9uZW50UmVmJ2kgcGF5bGHFn8SxciB2ZSBzdGF0ZSBpem9sYXN5b251IGtheWJvbHVyLlxyXG5cdFx0XHRjb25zdCBzaG91bGRSZXVzZSA9ICEhZnIgJiYgZnIgPT09IGNyICYmIGZ0ID09PSBjdDtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gc2hvdWxkUmV1c2VSb3V0ZSBtYXRjaGVyIOKGkiAke3Nob3VsZFJldXNlfS4gZnV0dXJlPSR7ZnJ9LyR7ZnR9IGN1cnI9JHtjcn0vJHtjdH1gKTtcclxuXHRcdFx0cmV0dXJuIHNob3VsZFJldXNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChmdXR1cmVNYXRjaGVyICE9PSBjdXJyTWF0Y2hlcikge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnW1N0cmF0ZWd5XSBzaG91bGRSZXVzZVJvdXRlIG1peGVkIOKGkiBmYWxzZScpO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2hvdWxkUmV1c2UgPSBmdXR1cmUucm91dGVDb25maWcgPT09IGN1cnIucm91dGVDb25maWc7XHJcblx0XHRjb25zdCBmdXR1cmVLZXkgPSB0aGlzLmdldFJvdXRlS2V5KGZ1dHVyZSk7XHJcblx0XHRjb25zdCBjdXJyS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShjdXJyKTtcclxuXHRcdGNvbnN0IGZ1dHVyZUNvbXAgPSBmdXR1cmUucm91dGVDb25maWc/LmNvbXBvbmVudD8ubmFtZSA/PyBmdXR1cmUuY29tcG9uZW50Py5uYW1lID8/ICdub25lJztcclxuXHRcdGNvbnN0IGN1cnJDb21wID0gY3Vyci5yb3V0ZUNvbmZpZz8uY29tcG9uZW50Py5uYW1lID8/IGN1cnIuY29tcG9uZW50Py5uYW1lID8/ICdub25lJztcclxuXHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRgW1N0cmF0ZWd5XSBzaG91bGRSZXVzZVJvdXRlIG5vcm1hbCDihpIgJHtzaG91bGRSZXVzZX0uIGZ1dHVyZT1cIiR7ZnV0dXJlS2V5fVwiKCR7ZnV0dXJlQ29tcH0pIGN1cnI9XCIke2N1cnJLZXl9XCIoJHtjdXJyQ29tcH0pYFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBzaG91bGRSZXVzZTtcclxuXHR9XHJcbn1cclxuIl19
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJvdXRlLXJldXNlLXN0cmF0ZWd5LmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L2NvbmZpZy9hcHBzL3NyYy9jdXN0b20tcm91dGUtcmV1c2Utc3RyYXRlZ3kuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixVQUFVLEVBQWMsVUFBVSxFQUFhLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJNUcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBNkIxRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBSUgsTUFBTSxPQUFPLHdCQUF3QjtJQVdwQztRQVZBLHNCQUFpQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxpQkFBWSxHQUF3QyxFQUFFLENBQUM7UUFFdkQ7Ozs7V0FJRztRQUNLLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO1FBR3BGLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ3JELElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU87WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsR0FBRyxpQkFBaUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUIscUZBQXFGO1lBQ3JGLHlGQUF5RjtZQUN6RixtRkFBbUY7WUFDbkYsdUZBQXVGO1lBQ3ZGLDhDQUE4QztZQUM5QyxJQUFJLEdBQUcsQ0FB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O1FBQzNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUM7UUFDckYsT0FBTyxDQUFDLEdBQUcsQ0FDVix3Q0FBd0MsV0FBVyxhQUFhLFNBQVMsS0FBSyxVQUFVLFdBQVcsT0FBTyxLQUFLLFFBQVEsR0FBRyxDQUMxSCxDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQzs4R0EzakJXLHdCQUF3QjtrSEFBeEIsd0JBQXdCLGNBRnhCLE1BQU07OzJGQUVOLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgRGV0YWNoZWRSb3V0ZUhhbmRsZSwgUm91dGVSZXVzZVN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IFBsdWdpbkNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFJvdXRlQ2xvc2VTZXJ2aWNlIH0gZnJvbSAnLi9yb3V0ZS1jbG9zZS5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBBbmd1bGFyIFJvdXRlciBgRGV0YWNoZWRSb3V0ZUhhbmRsZWAnxLEgcmVzbWkgb2xhcmFrIG9wYXF1ZSAoYHt9YCkgYmlyIHR5cGUuXHJcbiAqIEludGVybmFsIHNoYXBlJ2kgcHVibGljIEFQSSdkYSB5b2ssIGFtYSBiaXogcHJlc2VydmUvcmVzdG9yZSBpw6dpbiBjb21wb25lbnRSZWYnZVxyXG4gKiBlcmnFn21lbWl6IGdlcmVraXlvci4gQnUgecO8emRlbiBpbnRlcm5hbCB5YXDEsXnEsSBtaW5pbWFsIMWfZWtpbGRlIG1vZGVsbGl5b3J1ei5cclxuICovXHJcbnR5cGUgSW50ZXJuYWxEZXRhY2hlZFJvdXRlSGFuZGxlID0gRGV0YWNoZWRSb3V0ZUhhbmRsZSAmIHtcclxuXHRjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8dW5rbm93bj47XHJcbn07XHJcblxyXG4vKipcclxuICogQXJpbFdlYkNvbXBvbmVudFdyYXBwZXIgaW5zdGFuY2UnxLFuZGEgc3RyYXRlZ3knbmluIGfDtnpsZXllY2XEn2kgYWxhbmxhci5cclxuICogV3JhcHBlcidhIGRvxJ9ydWRhbiBiYcSfxLFtbMSxIG9sbWFtYWsgacOnaW4gZHVjay10eXBpbmcgaWxlIG1pbmltYWwgaW50ZXJmYWNlLlxyXG4gKiBgbmVlZHNSZXN0b3JlYCB2ZSBgcHJvcHNVcGRhdGVkYCBiYXlyYWtsYXLEsSB3cmFwcGVyIGlsZSBzdHJhdGVneSBhcmFzxLFuZGFraSBzw7Z6bGXFn21lOlxyXG4gKiBzdHJhdGVneSBgcmV0cmlldmVgIHPEsXJhc8SxbmRhIHNldCBlZGVyLCB3cmFwcGVyIGBuZ0FmdGVyVmlld0luaXRgJ3RlIHTDvGtldGlyLlxyXG4gKi9cclxudHlwZSBXcmFwcGVySW5zdGFuY2UgPSB7XHJcblx0ZWxlbWVudD86IEhUTUxFbGVtZW50O1xyXG5cdHZjPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblx0cHJvcHNVcGRhdGVkPzogYm9vbGVhbjtcclxuXHRuZWVkc1Jlc3RvcmU/OiBib29sZWFuO1xyXG59O1xyXG5cclxuaW50ZXJmYWNlIFByZXNlcnZlZEN1c3RvbUVsIHtcclxuXHRlbDogSFRNTEVsZW1lbnQ7XHJcblx0cGxhY2Vob2xkZXI6IENvbW1lbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUYWItYmF6bMSxIG5hdmlnYXRpb24gacOnaW4gY3VzdG9tIGBSb3V0ZVJldXNlU3RyYXRlZ3lgLlxyXG4gKlxyXG4gKiAjIyBUYWIgaXpvbGFzeW9udSAoYF90YWJgIHF1ZXJ5IHBhcmFtKVxyXG4gKiBgTmF2U2VydmljZWAgaGVyIHRhYidhIHVuaXF1ZSBgdGFiSWRgIMO8cmV0aXIgdmUgVVJMJ2UgYD9fdGFiPTx0YWJJZD5gIHF1ZXJ5IHBhcmFtXHJcbiAqIGVrbGVyLiBTdHJhdGVneSBidSBwYXJhbSfEsSByb3V0ZSBrZXknaW4gcGFyw6dhc8SxIHlhcGFyOlxyXG4gKiAgLSBNYXRjaGVyICh3ZWIgY29tcG9uZW50KSByb3V0ZSdsYXI6IGBtZmU6JHtyZW1vdGVOYW1lfToke3RhYklkfWBcclxuICogIC0gTm9ybWFsIHJvdXRlJ2xhcjogYHBhdGhGcm9tUm9vdGAgKyB0w7xtIHF1ZXJ5UGFyYW1zICh6YXRlbiBgX3RhYmAgZGFoaWwpXHJcbiAqXHJcbiAqIFNvbnXDpzogYXluxLEgc2F5ZmFuxLFuIGlraSB0YWInaSBgc3RvcmVkUm91dGVzYCDDvHplcmluZGUgZmFya2zEsSBzbG90J2xhcmEgeWF6xLFsxLFyXHJcbiAqIOKGkiBiYcSfxLFtc8SxeiBjb21wb25lbnRSZWYnbGVyLCBiYcSfxLFtc8SxeiBzdGF0ZS4gYHNob3VsZFJldXNlUm91dGVgIG1hdGNoZXIga2FyxZ/EsWxhxZ90xLFybWFzxLFcclxuICogYHRhYklkYCBmYXJrxLFuxLEgZGEgZGlra2F0ZSBhbMSxciDigJQgdGFiIGRlxJ9pxZ9pbWluZGUgZnJlc2ggY29tcG9uZW50IG9sdcWfdXIuXHJcbiAqXHJcbiAqICMjIE1pbWFyaTogaWtpIGJhxJ/EsW1zxLF6IGluc3RhbmNlXHJcbiAqIEJ1IHN0cmF0ZWd5IGhlbSBgYXJpbC9ib290L2hvc3Qvc3JjL2Jvb3RzdHJhcC50c2AndGUgaGVtIGhlciBNRkUgcmVtb3RlJ3VudW5cclxuICogYGFyaWwvYm9vdC9tZmUvc3JjL2Jvb3RzdHJhcC50c2AnaW5kZSBwcm92aWRlciBvbGFyYWsgdmVyaWxpeW9yLiBDbGFzc1xyXG4gKiBgcHJvdmlkZWRJbjogJ3Jvb3QnYCBvbGR1xJ91IGnDp2luICoqaGVyIHJvb3QgaW5qZWN0b3InZGEgQVlSSSBpbnN0YW5jZSoqIHlhxZ9hci5cclxuICogxLBraSBpbnN0YW5jZSBiYcSfxLFtc8SxeiBgc3RvcmVkUm91dGVzYCBtYXAnaSB0dXRhciB2ZSBiaXJiaXJpbmRlbiBoYWJlcnNpemRpcjpcclxuICpcclxuICogLSAqKkhvc3QgaW5zdGFuY2UqKjogbWF0Y2hlciByb3V0ZSdsYXLEsSB5w7ZuZXRpcjsga2V5IGBtZmU6JHtyZW1vdGVOYW1lfToke3RhYklkfWAuXHJcbiAqICAgVGFiIGthcGFuxLFwIGBtZmU6d2RtOmFiYzEyM2Agc2lsaW5kacSfaW5kZSBlZmZlY3QgcmVtb3RlJ2EgYWl0IGAjMC93ZG0vLi4uYFxyXG4gKiAgIHByZWZpeCdsaSBWRSBgX3RhYj1hYmMxMjNgIGnDp2VyZW4gY2hpbGQga2V5J2xlcmkgZGUgdGVtaXpsZXIuXHJcbiAqIC0gKipNRkUgaW5zdGFuY2UqKiAoaGVyIHJlbW90ZSd1biBrZW5kaSBpw6dpbmRlKTogbm9ybWFsIHJvdXRlJ2xhciBpw6dpbiDDp2FsxLHFn8Sxci5cclxuICogICBRdWVyeSBwYXJhbXMgemF0ZW4gYGdldFJvdXRlS2V5YCDDp8Sxa3TEsXPEsW5hIGRhaGlsIG9sZHXEn3UgacOnaW4gdGFiIGl6b2xhc3lvbnVcclxuICogICBkb8SfYWwgb2xhcmFrIGdlbGlyIOKAlCBlayDDtnplbCBkYXZyYW7EscWfIGdlcmVrbWV6LlxyXG4gKlxyXG4gKiAjIyBQbHVnaW4gY3VzdG9tIGVsZW1lbnQgcHJlc2VydmF0aW9uXHJcbiAqIGBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlYCBkZXRhY2hlZCB2aWV3J2Rha2kgYDxtZC1zZWFyY2g+YCBnaWJpIGN1c3RvbVxyXG4gKiBlbGVtZW50J2xlcmkgaGlkZGVuIGNvbnRhaW5lcidhIHRhxZ/EsXIg4oCUIGVsZW1lbnQgZG9jdW1lbnQndGFuIGF5csSxbG1heiwgQW5ndWxhclxyXG4gKiBFbGVtZW50cyBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgIDEwbXMgZGVzdHJveSB0aW1lcifEsSB0ZXRpa2xlbm1leiwgcGx1Z2luXHJcbiAqIGNvbXBvbmVudFJlZidpIHZlIGRhaGlsaSBzdGF0ZSdpIChmb3JtIGlucHV0LCBzZWFyY2ggc29udcOnbGFyxLEpIGtvcnVudXIuXHJcbiAqXHJcbiAqICMjIEJpbGluZW4gc8SxbsSxcmxhbWFsYXJcclxuICogLSBgc2hvdWxkRGV0YWNoYCBtYXRjaGVyIHJvdXRlJ2xhciBpw6dpbiB0YWJJZCB5b2trZW4gZmFsc2UgZMO2bmVyICh0YWJzxLF6IG9ycGhhblxyXG4gKiAgIGhhbmRsZSBvbHXFn21hc8SxbiksIGRpxJ9lciBkdXJ1bWxhcmRhIGB0cnVlYCDigJQgdMO8bSBkZXRhY2hlZCByb3V0ZSdsYXIgY2FjaGUnbGVuaXIuXHJcbiAqICAgTWVtb3J5IGxlYWsnaSBzxLFuxLFybGFtYWsgacOnaW4gYE5hdlNlcnZpY2VgIHRhYiBzYXnEsXPEsW7EsSBgTUFYX1RBQlNgIGlsZSBrxLFzxLF0bGFyXHJcbiAqICAgdmUgc29uIHRhYiBrYXBhdMSxbGTEscSfxLFuZGEgZWZmZWN0IHJlbW90ZSd1biB0w7xtIGNoaWxkIGtleSdsZXJpbmkgdGVtaXpsZXIuIFlpbmUgZGVcclxuICogICB0YWIgacOnaW5kZSBhw6fEsWxhbiBkZXRhaWwvZWRpdCBnaWJpIHBhcmFtZXRyZWxpIGFsdCBzYXlmYWxhcsSxbiBoYW5kbGUnbGFyxLEsIHBhcmVudFxyXG4gKiAgIHRhYiBrYXBhbmFuYSBrYWRhciBzdG9yZWRSb3V0ZXMndGEga2FsxLFyLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5IGltcGxlbWVudHMgUm91dGVSZXVzZVN0cmF0ZWd5LCBPbkRlc3Ryb3kge1xyXG5cdHJvdXRlQ2xvc2VTZXJ2aWNlOiBSb3V0ZUNsb3NlU2VydmljZSA9IGluamVjdChSb3V0ZUNsb3NlU2VydmljZSk7XHJcblx0c3RvcmVkUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBEZXRhY2hlZFJvdXRlSGFuZGxlPiA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBgKGRldGFjaGVkVHJlZSBhcyBhbnkpLl9fYXJpbFByZXNlcnZlZEN1c3RvbUVscyA9IFsuLi5dYCBydW50aW1lIHByb3BlcnR5XHJcblx0ICogZWtsZW1layB5ZXJpbmUgaGFuZGxlJ8SxIGtleSBvbGFyYWsga3VsbGFuYW4gYmlyIFdlYWtNYXAgdHV0dXlvcnV6IOKAlFxyXG5cdCAqIHR5cGUtc2FmZSB2ZSBoYW5kbGUgR0MneWUgdcSfcmFkxLHEn8SxbmRhIGJlbGxlayBvdG9tYXRpayB0ZW1pemxlbmlyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgcHJlc2VydmVkQ3VzdG9tRWxzID0gbmV3IFdlYWtNYXA8RGV0YWNoZWRSb3V0ZUhhbmRsZSwgUHJlc2VydmVkQ3VzdG9tRWxbXT4oKTtcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRlZmZlY3QoKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBrZXkgPSB0aGlzLnJvdXRlQ2xvc2VTZXJ2aWNlLmRlbGV0ZVJvdXRlKCkua2V5O1xyXG5cdFx0XHRpZiAoIWtleSkgcmV0dXJuO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBjbGVhbnVwIHRldGlrbGVuZGkga2V5PVwiJHtrZXl9XCIgc3RvcmVkS2V5cz1bJHtPYmplY3Qua2V5cyh0aGlzLnN0b3JlZFJvdXRlcykuam9pbignLCcpfV1gKTtcclxuXHRcdFx0dGhpcy5wcm9jZXNzQ2xlYW51cEtleShrZXkpO1xyXG5cclxuXHRcdFx0Ly8gQ3Jvc3MtaW5qZWN0b3IgeWF5xLFuOiBgUm91dGVDbG9zZVNlcnZpY2VgIGBwcm92aWRlZEluOiAncm9vdCdgIG9sZHXEn3UgacOnaW4gaG9zdCB2ZVxyXG5cdFx0XHQvLyBoZXIgTUZFIHJlbW90ZSd1bmRhIEFZUkkgaW5zdGFuY2UgeWHFn2FyLiBIb3N0J3RhbiB0ZXRpa2xlbmVuIGNsZWFudXAgTUZFIHN0cmF0ZWd5J3NpbmlcclxuXHRcdFx0Ly8gb3RvbWF0aWsgdXlhbmTEsXJtYXouIFdpbmRvdyBldmVudCBpbGUgc2lueWFsIHlhecSxbmxhecSxcCBNRkUgc3RyYXRlZ3knc2luaW4ga2VuZGlcclxuXHRcdFx0Ly8gYHN0b3JlZFJvdXRlc2AndW51IHRlbWl6bGVtZXNpbmkgc2HEn2zEsXlvcnV6IChha3NpIHRha2RpcmRlIE1GRSdkZSBoaWRkZW4gY29udGFpbmVyJ2FcclxuXHRcdFx0Ly8gdGHFn8Sxbm3EscWfIHBsdWdpbiBlbGVtZW50J2xlcmkgb3JwaGFuIGthbMSxcikuXHJcblx0XHRcdGlmIChrZXkuc3RhcnRzV2l0aCgnbWZlOicpKSB7XHJcblx0XHRcdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU1hdGNoZXJLZXkoa2V5KTtcclxuXHRcdFx0XHRpZiAocGFyc2VkKSB7XHJcblx0XHRcdFx0XHR3aW5kb3cuZGlzcGF0Y2hFdmVudChcclxuXHRcdFx0XHRcdFx0bmV3IEN1c3RvbUV2ZW50KCdhcmlsOnJlbW90ZS1jbGVhbnVwJywge1xyXG5cdFx0XHRcdFx0XHRcdGRldGFpbDogeyByZW1vdGVOYW1lOiBwYXJzZWQucmVtb3RlTmFtZSwgdGFiSWQ6IHBhcnNlZC50YWJJZCB9XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gS2FyxZ/EsSB5w7ZuZGUgKGNyb3NzLWluamVjdG9yKTogaG9zdCBzdHJhdGVneSduaW4geWF5xLFubGFkxLHEn8SxIGBhcmlsOnJlbW90ZS1jbGVhbnVwYFxyXG5cdFx0Ly8gZXZlbnQnaW5pIGhlciBNRkUgc3RyYXRlZ3kgaW5zdGFuY2UnxLEgeWFrYWxhciwga2VuZGkgYHN0b3JlZFJvdXRlc2AndW5kYWtpIG8gcmVtb3RlJ2FcclxuXHRcdC8vICh2ZSB2YXJzYSBvIHRhYklkJ3llKSBhaXQga2V5J2xlcmkgdGVtaXpsZXIuIEhvc3Qgc3RyYXRlZ3kgZGUgYnUgbGlzdGVuZXInYSBzYWhpcFxyXG5cdFx0Ly8gYW1hIGtlbmRpIGAjMC8ke3JlbW90ZU5hbWV9Ly4uLmAga2V5J2xlcmkgb2xtYWTEscSfxLEgacOnaW4gbm8tb3Agw6dhbMSxxZ/EsXIgKGfDvHZlbmxpKS5cclxuXHRcdGNvbnN0IGNsZWFudXBIYW5kbGVyID0gKGU6IEV2ZW50KTogdm9pZCA9PiB7XHJcblx0XHRcdGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50PHsgcmVtb3RlTmFtZT86IHN0cmluZzsgdGFiSWQ/OiBzdHJpbmcgfCBudWxsIH0+KS5kZXRhaWw7XHJcblx0XHRcdGNvbnN0IHJlbW90ZU5hbWUgPSBkZXRhaWw/LnJlbW90ZU5hbWU7XHJcblx0XHRcdGlmICghcmVtb3RlTmFtZSkgcmV0dXJuO1xyXG5cdFx0XHRjb25zdCB0YWJJZCA9IGRldGFpbD8udGFiSWQgPz8gbnVsbDtcclxuXHRcdFx0Y29uc3QgcHJlZml4ID0gYCMwLyR7cmVtb3RlTmFtZX1gO1xyXG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zdG9yZWRSb3V0ZXMpLmZpbHRlcigoaykgPT4ge1xyXG5cdFx0XHRcdGlmICghay5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHQvLyB0YWJJZCB2ZXJpbGRpeXNlIFNBREVDRSBvIHRhYidhIGFpdCBjaGlsZCBoYW5kbGUnbGFyxLEgdGVtaXpsZS4gQWtzaSB0YWtkaXJkZVxyXG5cdFx0XHRcdC8vIGF5bsSxIHJlbW90ZSd1biBiYcWfa2EgdGFiJ2xlcmluaW4gc3RhdGUnaSBkZSB5YW5sxLHFn2zEsWtsYSBzaWxpbmlyLlxyXG5cdFx0XHRcdGlmICh0YWJJZCAmJiAhay5pbmNsdWRlcyhgX3RhYj0ke3RhYklkfWApKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZiAoIWtleXMubGVuZ3RoKSByZXR1cm47XHJcblx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIGNyb3NzLWluamVjdG9yIGNsZWFudXAgcmVtb3RlTmFtZT1cIiR7cmVtb3RlTmFtZX1cIiB0YWJJZD1cIiR7dGFiSWQgPz8gJyonfVwiIGtleXM9WyR7a2V5cy5qb2luKCcsJyl9XWApO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xyXG5cdFx0XHRcdHRoaXMuY2xlYW51cFN0b3JlZEhhbmRsZSh0aGlzLnN0b3JlZFJvdXRlc1trXSk7XHJcblx0XHRcdFx0ZGVsZXRlIHRoaXMuc3RvcmVkUm91dGVzW2tdO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2FyaWw6cmVtb3RlLWNsZWFudXAnLCBjbGVhbnVwSGFuZGxlcik7XHJcblx0XHQvLyBTdHJhdGVneSBgcHJvdmlkZWRJbjogJ3Jvb3QnYCDihpIgcm9vdCBpbmplY3RvciBkZXN0cm95IGVkaWxkacSfaW5kZSBsaXN0ZW5lcifEsSBrYWxkxLFyLlxyXG5cdFx0Ly8gUHJhdGlrdGUgdXp1biDDtm3DvHJsw7wgYW1hIHRlc3Qgb3J0YW3EsSB2ZSBnZWxlY2VrdGVraSBpZnJhbWUgdmIuIG11bHRpLXdpbmRvd1xyXG5cdFx0Ly8gc2VuYXJ5b2xhcmRhIG9ycGhhbiBsaXN0ZW5lciBixLFyYWttYW1hayBpw6dpbiBkZWZlbnNpdmUuXHJcblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdhcmlsOnJlbW90ZS1jbGVhbnVwJywgY2xlYW51cEhhbmRsZXIpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluamVjdG9yIGRlc3Ryb3kgZWRpbGRpxJ9pbmRlIOKAlCBoaWJyaXQgbW9kZGEgaGVyIHRhYifEsW4gY2hpbGQgYEVudmlyb25tZW50SW5qZWN0b3JgJ8SxIHRhYlxyXG5cdCAqIGthcGFuxLFuY2EgYGRlc3Ryb3koKWAgZWRpbGlyOyBidSBzdHJhdGVneSBgcHJvdmlkZWRJbjoncm9vdCdgIG9sZHXEn3VuZGFuIGNoaWxkIGluamVjdG9yJ2RhXHJcblx0ICogKHJvb3Qtc2NvcGUpIG1hdGVyaWFsaXplIG9sbXXFnyBpbnN0YW5jZSBkYSB5xLFrxLFsxLFyIOKAlCBgc3RvcmVkUm91dGVzYCd0YSBrYWxhbiBUw5xNIGRldGFjaGVkXHJcblx0ICogaGFuZGxlJ2xhcsSxIHRlbWl6bGVyLiBBa3NpIGhhbGRlIGBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlYCBpbGUgaGlkZGVuIGNvbnRhaW5lcidhXHJcblx0ICogdGHFn8Sxbm3EscWfIHBsdWdpbiBjdXN0b20gZWxlbWVudCdsZXJpICjDtnJuLiBgPG1kLXNlYXJjaD5gKSBvcnBoYW4ga2FsxLFyIChtZW1vcnkgbGVhayk6IE1GRVxyXG5cdCAqIGludGVybmFsIHJvdXRlIGtleSdsZXJpIGBfdGFiYCB0YcWfxLFtYWTEscSfxLEgacOnaW4gYGFyaWw6cmVtb3RlLWNsZWFudXBgIGNyb3NzLWluamVjdG9yIHRlbWl6bGnEn2lcclxuXHQgKiBvbmxhcmEgdWxhxZ9hbWF6LiBJbmplY3Rvci1kZXN0cm95IGJhemzEsSBidSBzw7xww7xybWUgZ2FyYW50aWxpIHZlIGlkZW1wb3RlbnR0aXIuXHJcblx0ICovXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zdG9yZWRSb3V0ZXMpO1xyXG5cdFx0aWYgKGtleXMubGVuZ3RoKSBjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBuZ09uRGVzdHJveSDihpIgJHtrZXlzLmxlbmd0aH0gc3RvcmVkIGhhbmRsZSB0ZW1pemxlbml5b3IgKHRhYiBrYXBhbmTEsSlgKTtcclxuXHRcdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuXHRcdFx0dGhpcy5jbGVhbnVwU3RvcmVkSGFuZGxlKHRoaXMuc3RvcmVkUm91dGVzW2tleV0pO1xyXG5cdFx0XHRkZWxldGUgdGhpcy5zdG9yZWRSb3V0ZXNba2V5XTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZlcmlsZW4ga2V5IGnDp2luIGRpcmVjdCArIGNoaWxkIGNsZWFudXAgdXlndWxhci4gRWZmZWN0IGnDp2luZGVuIGF5csSxxZ90xLFyxLFsbcSxxZ8gaGVscGVyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgcHJvY2Vzc0NsZWFudXBLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdC8vIERvxJ9ydWRhbiBlxZ9sZcWfZW4ga2V5IHZhcnNhIG9udSBzaWwuXHJcblx0XHRpZiAodGhpcy5zdG9yZWRSb3V0ZXNba2V5XSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBjbGVhbnVwIOKGkiBkaXJlY3QgbWF0Y2ggXCIke2tleX1cImApO1xyXG5cdFx0XHR0aGlzLmNsZWFudXBTdG9yZWRIYW5kbGUodGhpcy5zdG9yZWRSb3V0ZXNba2V5XSk7XHJcblx0XHRcdGRlbGV0ZSB0aGlzLnN0b3JlZFJvdXRlc1trZXldO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1hdGNoZXIga2V5IHNpbGluZGnEn2luZGUgKGBtZmU6d2RtOmFiY2AgZ2liaSkgbyByZW1vdGUnYSBhaXQg4oCUIHZhcnNhIG8gdGFiJ2EgYWl0IOKAlFxyXG5cdFx0Ly8gaW50ZXJuYWwgcm91dGUgaGFuZGxlJ2xhcsSxbsSxIGRhIHRlbWl6bGUuIENvbnZlbnRpb246IG1hdGNoZXIga2V5XHJcblx0XHQvLyBgbWZlOiR7cmVtb3RlTmFtZX1gIHZleWEgYG1mZToke3JlbW90ZU5hbWV9OiR7dGFiSWR9YCwgbm9ybWFsIGtleSdsZXJcclxuXHRcdC8vIGAjMC8ke3JlbW90ZU5hbWV9Ly4uLj8uLi4mX3RhYj0ke3RhYklkfWAgZm9ybWF0xLFuZGEuXHJcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoJ21mZTonKSkge1xyXG5cdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlTWF0Y2hlcktleShrZXkpO1xyXG5cdFx0XHRpZiAoIXBhcnNlZCkgcmV0dXJuO1xyXG5cdFx0XHRjb25zdCB7IHJlbW90ZU5hbWUsIHRhYklkIH0gPSBwYXJzZWQ7XHJcblx0XHRcdGNvbnN0IHByZWZpeCA9IGAjMC8ke3JlbW90ZU5hbWV9YDtcclxuXHRcdFx0Zm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuc3RvcmVkUm91dGVzKSkge1xyXG5cdFx0XHRcdGlmICghay5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdC8vIHRhYklkIHZlcmlsZGl5c2Ugc2FkZWNlIG8gdGFiJ2EgYWl0IGNoaWxkIGhhbmRsZSdsYXLEsSB0ZW1pemxlXHJcblx0XHRcdFx0aWYgKHRhYklkICYmICFrLmluY2x1ZGVzKGBfdGFiPSR7dGFiSWR9YCkpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIGNsZWFudXAg4oaSIGNoaWxkIG1hdGNoIFwiJHtrfVwiYCk7XHJcblx0XHRcdFx0dGhpcy5jbGVhbnVwU3RvcmVkSGFuZGxlKHRoaXMuc3RvcmVkUm91dGVzW2tdKTtcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5zdG9yZWRSb3V0ZXNba107XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGBtZmU6JHtyZW1vdGVOYW1lfWAgdmV5YSBgbWZlOiR7cmVtb3RlTmFtZX06JHt0YWJJZH1gIGZvcm1hdMSxbmRha2kgbWF0Y2hlciBrZXknaSBwYXJzZSBlZGVyLlxyXG5cdCAqIHRhYklkIHlva3NhIGBudWxsYCBkw7ZuZXIgKGdlcml5ZSBkw7Zuw7xrIHV5dW1sdWx1azogbGVnYWN5IMOnYcSfcsSxbGFyIHRhYklkIHZlcm1leWViaWxpcikuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwYXJzZU1hdGNoZXJLZXkoa2V5OiBzdHJpbmcpOiB7IHJlbW90ZU5hbWU6IHN0cmluZzsgdGFiSWQ6IHN0cmluZyB8IG51bGwgfSB8IG51bGwge1xyXG5cdFx0aWYgKCFrZXkuc3RhcnRzV2l0aCgnbWZlOicpKSByZXR1cm4gbnVsbDtcclxuXHRcdGNvbnN0IHRhaWwgPSBrZXkuc3Vic3RyaW5nKDQpO1xyXG5cdFx0Y29uc3QgY29sb25JZHggPSB0YWlsLmluZGV4T2YoJzonKTtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHJlbW90ZU5hbWU6IGNvbG9uSWR4ID09PSAtMSA/IHRhaWwgOiB0YWlsLnN1YnN0cmluZygwLCBjb2xvbklkeCksXHJcblx0XHRcdHRhYklkOiBjb2xvbklkeCA9PT0gLTEgPyBudWxsIDogdGFpbC5zdWJzdHJpbmcoY29sb25JZHggKyAxKVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3JlZCBoYW5kbGUnxLEgdGFtYW1lbiB0ZW1pemxlOiBoaWRkZW4gY29udGFpbmVyJ2Rha2kgcHJlc2VydmVkIGVsZW1lbnQnbGVyaSAocGx1Z2luXHJcblx0ICogY3VzdG9tIGVsZW1lbnQnbGVyaSArIEFyaWxXZWJDb21wb25lbnRXcmFwcGVyJ8SxbiBgPGFwcC14eHg+YCBlbGVtZW50J2kpIERPTSdkYW4ga2FsZMSxcixcclxuXHQgKiBzb25yYSBBbmd1bGFyIGBjb21wb25lbnRSZWYuZGVzdHJveSgpYCBpbGUgdmlldyB0cmVlJ3NpbmkgZGVzdHJveSBldC5cclxuXHQgKlxyXG5cdCAqIGBjb21wb25lbnRSZWYuZGVzdHJveSgpYCB0ZWsgYmHFn8SxbmEgeWV0ZXJsaSBkZcSfaWw6IEFuZ3VsYXIgc2FkZWNlIHZpZXcgdHJlZSdzaW5pIGJpbGlyLFxyXG5cdCAqIGJpemltIGBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlYCB2ZSBgcHJlc2VydmVXZWJDb21wb25lbnRFbGVtZW50YCBpbGUgaGlkZGVuXHJcblx0ICogY29udGFpbmVyJ2EgbWFudWVsIHRhxZ/EsW5hbiBlbGVtZW50J2xlcmRlbiBoYWJlcmkgeW9rdHVyIOKGkiBvbmxhciBvcnBoYW4ga2FsxLFyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2xlYW51cFN0b3JlZEhhbmRsZShoYW5kbGU6IERldGFjaGVkUm91dGVIYW5kbGUgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcblx0XHRpZiAoIWhhbmRsZSkgcmV0dXJuOyAvLyBBbmd1bGFyIFJvdXRlcifEsW4gYHN0b3JlKHJvdXRlLCBudWxsKWAgaWxlIGLEsXJha3TEscSfxLEgb3JwaGFuIGtleSdsZXIgacOnaW4gZGVmZW5zaXZlIGd1YXJkLlxyXG5cdFx0Y29uc3QgaGlkZGVuQ29udGFpbmVyID0gdGhpcy5nZXRIaWRkZW5Db250YWluZXIoKTtcclxuXHJcblx0XHQvLyAxLiBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlIGlsZSB0YcWfxLFuYW4gcGx1Z2luIGVsZW1lbnQnbGVyaSAow7Zybi4gPG1kLXNlYXJjaD4pXHJcblx0XHRjb25zdCBwcmVzZXJ2ZWQgPSB0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5nZXQoaGFuZGxlKTtcclxuXHRcdGlmIChwcmVzZXJ2ZWQpIHtcclxuXHRcdFx0Zm9yIChjb25zdCB7IGVsIH0gb2YgcHJlc2VydmVkKSB7XHJcblx0XHRcdFx0aWYgKGhpZGRlbkNvbnRhaW5lci5jb250YWlucyhlbCkpIHtcclxuXHRcdFx0XHRcdGhpZGRlbkNvbnRhaW5lci5yZW1vdmVDaGlsZChlbCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMucHJlc2VydmVkQ3VzdG9tRWxzLmRlbGV0ZShoYW5kbGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDIuIHByZXNlcnZlV2ViQ29tcG9uZW50RWxlbWVudCBpbGUgdGHFn8SxbmFuIHdyYXBwZXIgZWxlbWVudCdpICjDtnJuLiA8YXBwLXdkbT4pXHJcblx0XHRjb25zdCBjb21wb25lbnRSZWYgPSAoaGFuZGxlIGFzIEludGVybmFsRGV0YWNoZWRSb3V0ZUhhbmRsZSkuY29tcG9uZW50UmVmO1xyXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWY/Lmluc3RhbmNlIGFzIFdyYXBwZXJJbnN0YW5jZSB8IHVuZGVmaW5lZDtcclxuXHRcdGlmIChpbnN0YW5jZT8uZWxlbWVudCkge1xyXG5cdFx0XHQvLyBGbGFnJ2kgdGVtaXpsZSBraSByZW1vdmVDaGlsZCBzb25yYXPEsSB0ZXRpa2xlbmVuIGRpc2Nvbm5lY3RlZENhbGxiYWNrIEFwcGxpY2F0aW9uJ8SxXHJcblx0XHRcdC8vIGdlcsOnZWt0ZW4gZGVzdHJveSBldHNpbiDigJQgYWtzaSBoYWxkZSBNRkVBcHBFbGVtZW50IG9ycGhhbiBrYWzEsXIgKG1lbW9yeSBsZWFrKS5cclxuXHRcdFx0ZGVsZXRlIChpbnN0YW5jZS5lbGVtZW50IGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfSkuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2g7XHJcblx0XHRcdGlmIChoaWRkZW5Db250YWluZXIuY29udGFpbnMoaW5zdGFuY2UuZWxlbWVudCkpIHtcclxuXHRcdFx0XHRoaWRkZW5Db250YWluZXIucmVtb3ZlQ2hpbGQoaW5zdGFuY2UuZWxlbWVudCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyAzLiBBbmd1bGFyIHZpZXcgdHJlZSdzaW5pIGRlc3Ryb3kgZXRcclxuXHRcdGNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWF0Y2hlciAoTUZFKSByb3V0ZSdsYXIgacOnaW4gdGFiSWQgem9ydW5sdS4gYGdldFRhYklkRnJvbVJvdXRlYCBVUkwgcXVlcnlQYXJhbXMgK1xyXG5cdCAqIGhpc3Rvcnkuc3RhdGUnaSBva3VyLiBIacOnYmlyIGtheW5hayB0YWJJZCB2ZXJtZXpzZSAoaWxrIG5hdmlnYXRpb24gaW50ZXJpbSdpKSBkZXRhY2hcclxuXHQgKiBlZGlsbWV6OyBgZmlyc3RDaGVja0ZvclJvdXRlYCBgX3RhYmAgZWtsZXlpcCB5ZW5pZGVuIG5hdmlnYXRlIGVkZWNlay5cclxuXHQgKi9cclxuXHRzaG91bGREZXRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLmlzTWF0Y2hlclJvdXRlKHJvdXRlKSAmJiAhdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZSkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gc2hvdWxkRGV0YWNoIGtleT1cIiR7dGhpcy5nZXRSb3V0ZUtleShyb3V0ZSl9XCIg4oaSIGZhbHNlIChtYXRjaGVyIHJvdXRlLCB0YWJJZCB5b2spYCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHQvLyBBbmd1bGFyIGBvdXRsZXQuZGV0YWNoKClgLCBgc3RvcmUoKWAnZGFuIMOWTkNFIMOnYWzEscWfxLFwIHdyYXBwZXIgdmlldyfEsW7EsSBET00nZGFuIHPDtmtlciDihpJcclxuXHRcdC8vIGnDp2luZGVraSBNRkUgYDxhcHAteHh4PmAgZWxlbWVudCdpIGRpc2Nvbm5lY3Qgb2x1ciB2ZSBiYXLEsW5kxLFyZMSxxJ/EsSBpZnJhbWUgKMO2cm4uIFN1cGVyc2V0IGVtYmVkKVxyXG5cdFx0Ly8gcmVsb2FkIG9sdXAgYXV0aCBoYW5kc2hha2UnaW5pIGthbMSxY8SxIGtheWJlZGVyLiBCdSB5w7x6ZGVuIGVsZW1lbnQnaSBIw4JMw4IgYmHEn2zEsXlrZW4sIGRldGFjaCd0ZW5cclxuXHRcdC8vIMOWTkNFIGF0b21pYyBgbW92ZUJlZm9yZWAgaWxlIGhpZGRlbiBjb250YWluZXInYSBhbMSxeW9ydXogKGJrei4gcHJlc2VydmVMaXZlRWxlbWVudEJlZm9yZURldGFjaCkuXHJcblx0XHRpZiAodGhpcy5pc01hdGNoZXJSb3V0ZShyb3V0ZSkpIHtcclxuXHRcdFx0dGhpcy5wcmVzZXJ2ZUxpdmVFbGVtZW50QmVmb3JlRGV0YWNoKHJvdXRlKTtcclxuXHRcdH1cclxuXHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHNob3VsZERldGFjaCBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiB0cnVlYCk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdHN0b3JlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBzdG9yZSBrZXk9XCIke3JvdXRlS2V5fVwiIGhhbmRsZT1gLCAhIWRldGFjaGVkVHJlZSk7XHJcblx0XHRpZiAoIWRldGFjaGVkVHJlZSkge1xyXG5cdFx0XHRkZWxldGUgdGhpcy5zdG9yZWRSb3V0ZXNbcm91dGVLZXldO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5pc01hdGNoZXJSb3V0ZShyb3V0ZSkgJiYgIXRoaXMuZ2V0VGFiSWRGcm9tUm91dGUocm91dGUpKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHN0b3JlIFNLSVAga2V5PVwiJHtyb3V0ZUtleX1cIiAobWF0Y2hlciByb3V0ZSwgdGFiSWQgeW9rKWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLnN0b3JlZFJvdXRlc1tyb3V0ZUtleV0gPSBkZXRhY2hlZFRyZWU7XHJcblx0XHR0aGlzLnByZXNlcnZlV2ViQ29tcG9uZW50RWxlbWVudChkZXRhY2hlZFRyZWUpO1xyXG5cdFx0dGhpcy5wcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGRldGFjaGVkVHJlZSk7XHJcblx0fVxyXG5cclxuXHRzaG91bGRBdHRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLmlzTWF0Y2hlclJvdXRlKHJvdXRlKSAmJiAhdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZSkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gc2hvdWxkQXR0YWNoIGtleT1cIiR7dGhpcy5nZXRSb3V0ZUtleShyb3V0ZSl9XCIg4oaSIGZhbHNlIChtYXRjaGVyIHJvdXRlLCB0YWJJZCB5b2spYCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zdCBzaG91bGRBdHRhY2ggPSAhIXRoaXMuc3RvcmVkUm91dGVzW3JvdXRlS2V5XTtcclxuXHRcdGNvbnNvbGUubG9nKGBbU3RyYXRlZ3ldIHNob3VsZEF0dGFjaCBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiAke3Nob3VsZEF0dGFjaH0gKHN0b3JlZEtleXM9WyR7T2JqZWN0LmtleXModGhpcy5zdG9yZWRSb3V0ZXMpLmpvaW4oJywnKX1dKWApO1xyXG5cdFx0cmV0dXJuIHNob3VsZEF0dGFjaDtcclxuXHR9XHJcblxyXG5cdHJldHJpZXZlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogRGV0YWNoZWRSb3V0ZUhhbmRsZSB8IG51bGwge1xyXG5cdFx0aWYgKHRoaXMuaXNNYXRjaGVyUm91dGUocm91dGUpICYmICF0aGlzLmdldFRhYklkRnJvbVJvdXRlKHJvdXRlKSkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHJvdXRlS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShyb3V0ZSk7XHJcblx0XHRjb25zdCBoYW5kbGUgPSB0aGlzLnN0b3JlZFJvdXRlc1tyb3V0ZUtleV07XHJcblx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSByZXRyaWV2ZSBrZXk9XCIke3JvdXRlS2V5fVwiIOKGkiAke2hhbmRsZSA/ICdIQVMnIDogJ05VTEwnfWApO1xyXG5cdFx0aWYgKGhhbmRsZSkge1xyXG5cdFx0XHR0aGlzLnJlc3RvcmVXZWJDb21wb25lbnRFbGVtZW50KGhhbmRsZSk7XHJcblx0XHRcdHRoaXMucmVzdG9yZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGhhbmRsZSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaGFuZGxlIHx8IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXZWIgY29tcG9uZW50IGVsZW1lbnQnaW5pIGhpZGRlbiBjb250YWluZXInYSB0YcWfxLFyIChzdGF0ZSBrb3J1bm1hc8SxIGnDp2luKS5cclxuXHQgKlxyXG5cdCAqIEVsZW1lbnQnZSBgX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2hgIGZsYWcnaSB5YXrEsWzEsXI6IGByZW1vdmVDaGlsZGAgKyBgYXBwZW5kQ2hpbGRgXHJcblx0ICogYXJhc8SxbmRhIE1GRSBjdXN0b20gZWxlbWVudCdpbiBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgJ2kgdGV0aWtsZW5peW9yOyBmbGFnIG9yYWRha2lcclxuXHQgKiBkZXN0cm95IHRpbWVyJ8SxbsSxICoqZGV0ZXJtaW5pc3RpYyoqIMWfZWtpbGRlIGJ5cGFzcyBlZGVyLiBFc2tpZGVuIDUwbXMgaGFyZGNvZGVkIHRpbWVyXHJcblx0ICogeWFyxLHFnyBrb8WfdWx1IMO8cmV0aXlvcmR1ICh5YXZhxZ8gY2loYXpsYXJkYSBBcHBsaWNhdGlvbiBpc3RlbXNpeiBkZXN0cm95IG9sdXlvcmR1KS5cclxuXHQgKi9cclxuXHRwcml2YXRlIHByZXNlcnZlV2ViQ29tcG9uZW50RWxlbWVudChkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IChkZXRhY2hlZFRyZWUgYXMgSW50ZXJuYWxEZXRhY2hlZFJvdXRlSGFuZGxlKS5jb21wb25lbnRSZWY7XHJcblx0XHRcdGlmICghY29tcG9uZW50UmVmKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBXcmFwcGVySW5zdGFuY2UgfCB1bmRlZmluZWQ7XHJcblx0XHRcdGlmICghY29tcG9uZW50SW5zdGFuY2U/LmVsZW1lbnQpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnRJbnN0YW5jZS5lbGVtZW50IGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfTtcclxuXHRcdFx0Y29uc3QgaGlkZGVuQ29udGFpbmVyID0gdGhpcy5nZXRIaWRkZW5Db250YWluZXIoKTtcclxuXHJcblx0XHRcdC8vIEZsYWcg4oCUIGZhbGxiYWNrIChtb3ZlQmVmb3JlIGRlc3Rla2xlbm1leWVuIHRhcmF5xLFjxLEpIHJlbW92ZUNoaWxkIHlhcHTEscSfxLFuZGEgZGlzY29ubmVjdGVkQ2FsbGJhY2tcclxuXHRcdFx0Ly8gYnVudSBva3V5dXAgZGVzdHJveSfEsSBhdGxhci4gbW92ZUJlZm9yZSB5b2x1bmRhIGNhbGxiYWNrIGhpw6cgdGV0aWtsZW5tZXogKGZsYWcgemFyYXJzxLF6IGthbMSxcikuXHJcblx0XHRcdGVsZW1lbnQuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2ggPSB0cnVlO1xyXG5cclxuXHRcdFx0Ly8gYHNob3VsZERldGFjaGAgw6dvxJ91IGR1cnVtZGEgZWxlbWVudCdpIGRldGFjaCd0ZW4gw5ZOQ0UgemF0ZW4gdGHFn8SxZMSxIOKGkiBidXJhZGEgbm8tb3AuXHJcblx0XHRcdGlmIChoaWRkZW5Db250YWluZXIuY29udGFpbnMoZWxlbWVudCkpIHJldHVybjtcclxuXHJcblx0XHRcdC8vIFRhxZ/EsW5tYWTEsXlzYSAow7ZyLiBzaG91bGREZXRhY2ggZWxlbWVudCdpIGJ1bGFtYWTEsSk6IGJ1IG5va3RhZGEgZWxlbWVudCBBbmd1bGFyIHRhcmFmxLFuZGFuXHJcblx0XHRcdC8vIHphdGVuIGRpc2Nvbm5lY3QgZWRpbG1pxZ8gb2xhYmlsaXI7IG1vdmVJbnRvIGJhxJ9sxLF5c2EgbW92ZUJlZm9yZSwgZGXEn2lsc2UgYXBwZW5kQ2hpbGQga3VsbGFuxLFyLlxyXG5cdFx0XHR0aGlzLm1vdmVJbnRvKGhpZGRlbkNvbnRhaW5lciwgZWxlbWVudCk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdXZWIgY29tcG9uZW50IGVsZW1lbnQgaGlkZGVuIGNvbnRhaW5lclxcJ2EgdGHFn8SxbmTEsSAoc3RhdGUga29ydW51eW9yKScpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdXZWIgY29tcG9uZW50IGVsZW1lbnQgcHJlc2VydmUgZWRpbGlya2VuIGhhdGE6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2ViIGNvbXBvbmVudCBlbGVtZW50J2luaSBoaWRkZW4gY29udGFpbmVyJ2RhbiDDp8Sxa2FyIHZlIGNvbXBvbmVudCB2aWV3J2EgZWtsZW1leWkgZGVuZS5cclxuXHQgKlxyXG5cdCAqIGBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaGAgZmxhZydpIHRlbWl6bGVuaXIg4oCUIGXEn2VyIGJ1IHJldHJpZXZlIHNvbnJhc8SxIGVsZW1lbnRcclxuXHQgKiBnZXLDp2VrIGFubGFtZGEgZGVzdHJveSBlZGlsaXJzZSBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgIGZsYWcgeW9rIGthYnVsIGVkaXAgQXBwbGljYXRpb25cclxuXHQgKiBjbGVhbnVwJ8SxbsSxIHnDvHLDvHRlY2VrLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgcmVzdG9yZVdlYkNvbXBvbmVudEVsZW1lbnQoZGV0YWNoZWRUcmVlOiBEZXRhY2hlZFJvdXRlSGFuZGxlKTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBjb21wb25lbnRSZWYgPSAoZGV0YWNoZWRUcmVlIGFzIEludGVybmFsRGV0YWNoZWRSb3V0ZUhhbmRsZSkuY29tcG9uZW50UmVmO1xyXG5cdFx0XHRpZiAoIWNvbXBvbmVudFJlZikgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgV3JhcHBlckluc3RhbmNlIHwgdW5kZWZpbmVkO1xyXG5cdFx0XHRpZiAoIWNvbXBvbmVudEluc3RhbmNlPy5lbGVtZW50KSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBlbGVtZW50ID0gY29tcG9uZW50SW5zdGFuY2UuZWxlbWVudCBhcyBIVE1MRWxlbWVudCAmIHsgX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2g/OiBib29sZWFuIH07XHJcblx0XHRcdGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCk7XHJcblxyXG5cdFx0XHRpZiAoIWhpZGRlbkNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gw5ZORU1MSTogZWxlbWVudCdpIGhpZGRlbiBjb250YWluZXInZGFuIEVSS0VOIMOnxLFrYXJtxLF5b3J1ei4gYHJldHJpZXZlYCwgQW5ndWxhclxyXG5cdFx0XHQvLyBgb3V0bGV0LmF0dGFjaCgpYCd0ZW4gw5ZOQ0Ugw6dhxJ9yxLFsxLFyIOKGkiB2YyBoZW7DvHogRE9NJ2EgYmHEn2zEsSBkZcSfaWxkaXIuIEVya2VuIHJlbW92ZUNoaWxkXHJcblx0XHRcdC8vIGVsZW1lbnQnaSBkaXNjb25uZWN0IGVkZXIgdmUgaWZyYW1lIHJlbG9hZCBvbHVyICh0YW0ga2HDp8SxbmTEscSfxLFtxLF6IMWfZXkpLiBCdW51biB5ZXJpbmVcclxuXHRcdFx0Ly8gZWxlbWVudCdpIGhpZGRlbiBjb250YWluZXInZGEgKGJhxJ9sxLEpIGLEsXJha8SxcCB2YyBiYcSfbGFuxLFuY2EgYXRvbWljIG1vdmVCZWZvcmUgaWxlXHJcblx0XHRcdC8vIGRvxJ9ydWRhbiBoaWRkZW4g4oaSIHZjIHRhxZ/EsXlvcnV6OyBpZnJhbWUgaGnDpyByZWxvYWQgb2xtYXouXHJcblx0XHRcdGNvbnN0IHRyeVJlc3RvcmUgPSAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmNOYXRpdmUgPSBjb21wb25lbnRJbnN0YW5jZS52Yz8ubmF0aXZlRWxlbWVudDtcclxuXHRcdFx0XHRpZiAoIXZjTmF0aXZlIHx8ICF2Y05hdGl2ZS5pc0Nvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdHRoaXMubW92ZUludG8odmNOYXRpdmUsIGVsZW1lbnQpO1xyXG5cdFx0XHRcdC8vIEZsYWcnaSBtb3ZlSW50byBTT05SQVNJIHNpbDogZmFsbGJhY2sgcmVtb3ZlQ2hpbGQgeWFwYXJzYSBkaXNjb25uZWN0ZWRDYWxsYmFjayBmbGFnJ2kgaMOibMOiIGfDtnJzw7xuLlxyXG5cdFx0XHRcdGRlbGV0ZSBlbGVtZW50Ll9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoO1xyXG5cdFx0XHRcdGNvbXBvbmVudEluc3RhbmNlLnByb3BzVXBkYXRlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdXZWIgY29tcG9uZW50IGVsZW1lbnQgY29tcG9uZW50IHZpZXdcXCdhIGVrbGVuZGkgKHJldHJpZXZlIHPEsXJhc8SxbmRhKScpO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Ly8gSGVtZW4gZGVuZSAodmMgZ2VuZWxkZSBiYcSfbMSxIGRlxJ9pbCkg4oaSIGRlxJ9pbHNlIG1pY3JvdGFzayd0ZSB0ZWtyYXIgZGVuZS4gYG91dGxldC5hdHRhY2goKWBcclxuXHRcdFx0Ly8gcmV0cmlldmUnZGVuIGhlbWVuIHNvbnJhIFNFTktST04gw6dhbMSxxZ/EsXI7IG1pY3JvdGFzayBnZcOnZXJsaSB0YXNrIGJpdGluY2UgKGF0dGFjaCB0YW1hbWxhbm3EscWfLFxyXG5cdFx0XHQvLyB2YyBiYcSfbMSxKSBhbWEgUEFJTlQndGVuIMOWTkNFIGtvxZ9hciDihpIgZWxlbWVudCB5ZXJpbmUgb3R1cnVyLCB0YWIgZ2XDp2nFn2luZGUgYm/Fny1mbGFzaCBvbG1hei5cclxuXHRcdFx0aWYgKHRyeVJlc3RvcmUoKSkgcmV0dXJuO1xyXG5cdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XHJcblx0XHRcdFx0aWYgKHRyeVJlc3RvcmUoKSkgcmV0dXJuO1xyXG5cdFx0XHRcdC8vIFNvbiDDp2FyZTogdmMgaMOibMOiIGJhxJ9sxLEgZGXEn2lsLiBFbGVtZW50J2kgeWluZSBkZSB2Yyd5ZSB0YcWfxLEga2kgdGFiIGJvxZ8ga2FsbWFzxLFuXHJcblx0XHRcdFx0Ly8gKGF0dGFjaCB2aWV3J8SxIGJhxJ9sYXnEsW5jYSBnw7Zyw7xuw7xyIG9sdXIg4oCUIGlmcmFtZSByZWxvYWQgb2xhYmlsaXIgYW1hIGVza2kgZGF2cmFuxLHFnyBrb3J1bnVyKS5cclxuXHRcdFx0XHRjb25zdCB2Y05hdGl2ZSA9IGNvbXBvbmVudEluc3RhbmNlLnZjPy5uYXRpdmVFbGVtZW50O1xyXG5cdFx0XHRcdGlmICh2Y05hdGl2ZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5tb3ZlSW50byh2Y05hdGl2ZSwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRkZWxldGUgZWxlbWVudC5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaDtcclxuXHRcdFx0XHRcdGNvbXBvbmVudEluc3RhbmNlLnByb3BzVXBkYXRlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb21wb25lbnRJbnN0YW5jZS5uZWVkc1Jlc3RvcmUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coJ1dlYiBjb21wb25lbnQgZWxlbWVudCByZXN0b3JlIGVkaWxlY2VrICh2aWV3IGhhesSxciBkZcSfaWwsIG5nQWZ0ZXJWaWV3SW5pdFxcJ3RlIHRla3JhciBkZW5lbmVjZWspJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignV2ViIGNvbXBvbmVudCBlbGVtZW50IHJlc3RvcmUgZWRpbGlya2VuIGhhdGE6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2xvYmFsIGhpZGRlbiBjb250YWluZXInxLEgb2x1xZ90dXJ1ciB2ZXlhIGTDtm5kw7xyw7xyXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRIaWRkZW5Db250YWluZXIoKTogSFRNTEVsZW1lbnQge1xyXG5cdFx0Y29uc3Qgc2xvdCA9IGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7IF9fYXJpbFdlYkNvbXBvbmVudEhpZGRlbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50IH07XHJcblx0XHRsZXQgY29udGFpbmVyID0gc2xvdC5fX2FyaWxXZWJDb21wb25lbnRIaWRkZW5Db250YWluZXI7XHJcblx0XHRpZiAoIWNvbnRhaW5lcikge1xyXG5cdFx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xyXG5cdFx0XHRjb250YWluZXIuc3R5bGUudG9wID0gJy05OTk5cHgnO1xyXG5cdFx0XHRjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblx0XHRcdHNsb3QuX19hcmlsV2ViQ29tcG9uZW50SGlkZGVuQ29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvbnRhaW5lcjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGBlbGAnaSBgdGFyZ2V0YCfEsW4gc29uIMOnb2N1xJ91IG9sYWNhayDFn2VraWxkZSBUQcWeSVIuIGBtb3ZlQmVmb3JlYCAoYXRvbWljIG1vdmUpIGRlc3Rla2xlbml5b3IgdmVcclxuXHQgKiBoZXIgaWtpIGTDvMSfw7xtIGRlIGJhxJ9sxLF5c2Egb251IGt1bGxhbsSxcjogbmVzdGVkIGJyb3dzaW5nIGNvbnRleHQgKGlmcmFtZSkgcmVsb2FkIE9MTUFEQU4gdmUgY3VzdG9tXHJcblx0ICogZWxlbWVudCdpbiBjb25uZWN0ZWQvZGlzY29ubmVjdGVkIGNhbGxiYWNrJ2xlcmkgdGV0aWtsZW5tZWRlbiB0YcWfxLFyIOKGkiBpZnJhbWUtdGFiYW5sxLEgZW1iZWQnbGVyaW5cclxuXHQgKiAoU3VwZXJzZXQpIGF1dGggaGFuZHNoYWtlJ2kgKyBzY3JvbGwvZmlsdHJlIHN0YXRlJ2kga29ydW51ci4gRGVzdGVrbGVubWl5b3JzYSB2ZXlhIHRhxZ/EsW1hIGvEsXPEsXRsYXLEsVxyXG5cdCAqIGlobGFsIGVkaWxpcnNlIChkaXNjb25uZWN0ZWQgLyBjcm9zcy1kb2N1bWVudCkgcmVtb3ZlQ2hpbGQrYXBwZW5kQ2hpbGQnYSBkw7zFn2VyIChlc2tpIGRhdnJhbsSxxZ86IGlmcmFtZVxyXG5cdCAqIHJlbG9hZCBvbHVyIGFtYSBpxZ9sZW0gZ8O8dmVubGkgdGFtYW1sYW7EsXIpLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgbW92ZUludG8odGFyZ2V0OiBIVE1MRWxlbWVudCwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcblx0XHRjb25zdCBtb3ZlciA9IHRhcmdldCBhcyBIVE1MRWxlbWVudCAmIHsgbW92ZUJlZm9yZT86IChub2RlOiBOb2RlLCBjaGlsZDogTm9kZSB8IG51bGwpID0+IHZvaWQgfTtcclxuXHRcdGlmICh0eXBlb2YgbW92ZXIubW92ZUJlZm9yZSA9PT0gJ2Z1bmN0aW9uJyAmJiBlbC5pc0Nvbm5lY3RlZCAmJiB0YXJnZXQuaXNDb25uZWN0ZWQpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRtb3Zlci5tb3ZlQmVmb3JlKGVsLCBudWxsKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdC8vIG1vdmVCZWZvcmUga8Sxc8SxdGxhcsSxIGlobGFsIGVkaWxkaSDihpIgYcWfYcSfxLFkYWtpIGtsYXNpayB0YcWfxLFtYXlhIGTDvMWfLlxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlICE9PSB0YXJnZXQpIHtcclxuXHRcdFx0ZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XHJcblx0XHR9XHJcblx0XHRpZiAoIXRhcmdldC5jb250YWlucyhlbCkpIHtcclxuXHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKGVsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGBzaG91bGREZXRhY2hgIGnDp2luZGVuLCBBbmd1bGFyIGBvdXRsZXQuZGV0YWNoKClgIMOnYWzEscWfbWFkYW4gw5ZOQ0Ugw6dhxJ9yxLFsxLFyOiBjYW5sxLEgb3V0bGV0J3Rla2kgTUZFXHJcblx0ICogZWxlbWVudCdpbmkgYGFyaWwtdGFiLWlkYCBhdHRyaWJ1dGUndW5kYW4gYnVsdXAgYXRvbWljIGBtb3ZlQmVmb3JlYCBpbGUgaGlkZGVuIGNvbnRhaW5lcidhIHRhxZ/EsXIuXHJcblx0ICogQsO2eWxlY2UgQW5ndWxhciB3cmFwcGVyIHZpZXcnxLFuxLEgc8O2a3TDvMSfw7xuZGUgYDxhcHAteHh4PmAgZWxlbWVudCdpIHphdGVuIGfDvHZlbmxpL2JhxJ9sxLEga29udW1kYWTEsXIgdmVcclxuXHQgKiBiYXLEsW5kxLFyZMSxxJ/EsSBpZnJhbWUgcmVsb2FkIG9sbWF6LiBFbGVtZW50IGJ1bHVuYW1heiB5YSBkYSB6YXRlbiBoaWRkZW4gY29udGFpbmVyJ2RheXNhIG5vLW9wIOKGklxyXG5cdCAqIGBzdG9yZSgpYCBlc2tpIHlvbHV5bGEgZGV2cmV5ZSBnaXJlciAocmVncmVzeW9uIHlvaykuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmVzZXJ2ZUxpdmVFbGVtZW50QmVmb3JlRGV0YWNoKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCB0YWJJZCA9IHRoaXMuZ2V0VGFiSWRGcm9tUm91dGUocm91dGUpO1xyXG5cdFx0XHRpZiAoIXRhYklkKSByZXR1cm47XHJcblx0XHRcdGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCk7XHJcblx0XHRcdGNvbnN0IGNhbmRpZGF0ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbYXJpbC10YWItaWQ9XCIke3RhYklkfVwiXWApO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBBcnJheS5mcm9tKGNhbmRpZGF0ZXMpKSB7XHJcblx0XHRcdFx0Y29uc3QgZWwgPSBjYW5kaWRhdGUgYXMgSFRNTEVsZW1lbnQgJiB7IF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoPzogYm9vbGVhbiB9O1xyXG5cdFx0XHRcdGlmIChoaWRkZW5Db250YWluZXIuY29udGFpbnMoZWwpKSBjb250aW51ZTtcclxuXHRcdFx0XHQvLyBGYWxsYmFjayByZW1vdmVDaGlsZCB5b2x1bmRhIGRpc2Nvbm5lY3RlZENhbGxiYWNrJ2luIGRlc3Ryb3knxLEgYXRsYW1hc8SxIGnDp2luIGZsYWcnaSB0YcWfxLFtYWRhbiDDlk5DRSBzZXQgZXQuXHJcblx0XHRcdFx0ZWwuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2ggPSB0cnVlO1xyXG5cdFx0XHRcdHRoaXMubW92ZUludG8oaGlkZGVuQ29udGFpbmVyLCBlbCk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gcHJlLWRldGFjaCBwcmVzZXJ2ZTogPCR7ZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gdGFiPVwiJHt0YWJJZH1cIiBoaWRkZW4gY29udGFpbmVyJ2EgdGHFn8SxbmTEsWApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ1tTdHJhdGVneV0gcHJlLWRldGFjaCBwcmVzZXJ2ZSBoYXRhc8SxOicsIGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGFjaGVkIHJvdXRlIHZpZXcnxLEgacOnaW5kZWtpIHBsdWdpbi9NRkUgY3VzdG9tIGVsZW1lbnQnbGVyaW5pICh0YWcgYWTEsW5kYSBgLWBcclxuXHQgKiBidWx1bmFuIHZlIGBjdXN0b21FbGVtZW50c2AnYSBrYXnEsXRsxLEgb2xhbmxhcsSxKSBoaWRkZW4gY29udGFpbmVyJ2EgdGHFn8SxciB2ZVxyXG5cdCAqIHllcmxlcmluZSBiaXJlciBDb21tZW50IHBsYWNlaG9sZGVyIGLEsXJha8Sxci4gRWxlbWVudCBkb2N1bWVudCd0YW4gYXlyxLFsbWF6LFxyXG5cdCAqIEFuZ3VsYXIgRWxlbWVudHMgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYCAxMG1zIGRlc3Ryb3kgdGltZXInxLEga2FuYXQgw6fEsXJwbWF6IOKAlFxyXG5cdCAqIGRvbGF5xLFzxLF5bGEgcGx1Z2luJ2luIGBDb21wb25lbnRSZWZgIHZlIGRhaGlsaSBzdGF0ZSdpIChmb3JtIGRlxJ9lcmxlcmksIHNlYXJjaFxyXG5cdCAqIHNvbnXDp2xhcsSxIHZzLikgc29ucmFraSByZXRyaWV2ZSdlIGthZGFyIGtvcnVudXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlKGRldGFjaGVkVHJlZTogRGV0YWNoZWRSb3V0ZUhhbmRsZSk6IHZvaWQge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY29tcG9uZW50UmVmID0gKGRldGFjaGVkVHJlZSBhcyBJbnRlcm5hbERldGFjaGVkUm91dGVIYW5kbGUpLmNvbXBvbmVudFJlZjtcclxuXHRcdFx0Y29uc3Qgcm9vdEVsID0gY29tcG9uZW50UmVmPy5sb2NhdGlvbj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHRcdFx0aWYgKCFyb290RWwpIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCk7XHJcblx0XHRcdGNvbnN0IGFsbCA9IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcblx0XHRcdGNvbnN0IHByZXNlcnZlZExpc3Q6IFByZXNlcnZlZEN1c3RvbUVsW10gPSBbXTtcclxuXHJcblx0XHRcdGZvciAoY29uc3QgZWwgb2YgQXJyYXkuZnJvbShhbGwpKSB7XHJcblx0XHRcdFx0Y29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdGlmICghdGFnLmluY2x1ZGVzKCctJykpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdGlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzPy5nZXQodGFnKSkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBlbCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoYGFyaWwtcHJlc2VydmVkOiR7dGFnfWApO1xyXG5cdFx0XHRcdG5vZGUucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKHBsYWNlaG9sZGVyLCBub2RlKTtcclxuXHRcdFx0XHRoaWRkZW5Db250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XHJcblx0XHRcdFx0cHJlc2VydmVkTGlzdC5wdXNoKHsgZWw6IG5vZGUsIHBsYWNlaG9sZGVyIH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocHJlc2VydmVkTGlzdC5sZW5ndGgpIHtcclxuXHRcdFx0XHR0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5zZXQoZGV0YWNoZWRUcmVlLCBwcmVzZXJ2ZWRMaXN0KTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhgW1N0cmF0ZWd5XSBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlOiAke3ByZXNlcnZlZExpc3QubGVuZ3RofSBlbGVtZW50IHRhxZ/EsW5kxLFgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdDdXN0b20gZWxlbWVudCBwcmVzZXJ2ZSBlZGlsaXJrZW4gaGF0YTonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBwcmVzZXJ2ZUN1c3RvbUVsZW1lbnRzSW5UcmVlIGlsZSB0YcWfxLFuYW4gY3VzdG9tIGVsZW1lbnQnbGVyaSBvcmlqaW5hbFxyXG5cdCAqIHBsYWNlaG9sZGVyJ2xhcsSxbsSxbiB5ZXJpbmUgZ2VyaSBrb3lhci5cclxuXHQgKi9cclxuXHRwcml2YXRlIHJlc3RvcmVDdXN0b21FbGVtZW50c0luVHJlZShkZXRhY2hlZFRyZWU6IERldGFjaGVkUm91dGVIYW5kbGUpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHByZXNlcnZlZExpc3QgPSB0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5nZXQoZGV0YWNoZWRUcmVlKTtcclxuXHRcdFx0aWYgKCFwcmVzZXJ2ZWRMaXN0Py5sZW5ndGgpIHJldHVybjtcclxuXHJcblx0XHRcdGZvciAoY29uc3QgeyBlbCwgcGxhY2Vob2xkZXIgfSBvZiBwcmVzZXJ2ZWRMaXN0KSB7XHJcblx0XHRcdFx0aWYgKHBsYWNlaG9sZGVyLnBhcmVudE5vZGUpIHtcclxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsLCBwbGFjZWhvbGRlcik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIFBsYWNlaG9sZGVyIGHEn2HDp3RhbiBrb3BhcsSxbG3EscWfIOKAlCBwYXJlbnQgdmlldyB0YW1hbWVuIGRlc3Ryb3kgZWRpbG1pxZ8gb2xhYmlsaXJcclxuXHRcdFx0XHRcdC8vICjDtnJuLiByZW1vdGUgdGFiIGthcGFubcSxxZ8pLiBFbGVtZW50J2kgaGlkZGVuIGNvbnRhaW5lcidkYSBixLFyYWttYW1hayBpw6dpbiBjbGVhbnVwLlxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbU3RyYXRlZ3ldIHJlc3RvcmU6IHBsYWNlaG9sZGVyIHBhcmVudCB5b2ssIGN1c3RvbSBlbGVtZW50IGNsZWFudXAgZWRpbGl5b3InLCBlbC50YWdOYW1lKTtcclxuXHRcdFx0XHRcdGlmIChlbC5wYXJlbnROb2RlID09PSB0aGlzLmdldEhpZGRlbkNvbnRhaW5lcigpKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SGlkZGVuQ29udGFpbmVyKCkucmVtb3ZlQ2hpbGQoZWwpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnByZXNlcnZlZEN1c3RvbUVscy5kZWxldGUoZGV0YWNoZWRUcmVlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gcmVzdG9yZUN1c3RvbUVsZW1lbnRzSW5UcmVlOiAke3ByZXNlcnZlZExpc3QubGVuZ3RofSBlbGVtZW50IGdlcmkgeWVybGXFn3RpcmlsZGlgKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignQ3VzdG9tIGVsZW1lbnQgcmVzdG9yZSBlZGlsaXJrZW4gaGF0YTonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGlzTWF0Y2hlclJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuICEhcm91dGU/LnJvdXRlQ29uZmlnPy5tYXRjaGVyO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRSZW1vdGVOYW1lKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG5cdFx0cmV0dXJuIChyb3V0ZT8ucm91dGVDb25maWc/LmRhdGEgYXMgUGx1Z2luQ29uZmlnIHwgdW5kZWZpbmVkKT8ucmVtb3RlTmFtZSA/PyBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVVJMIGA/X3RhYj08dGFiSWQ+YCBxdWVyeSBwYXJhbSfEsW7EsSBva3Ug4oCUIGBOYXZTZXJ2aWNlYCBoZXIgdGFiIGnDp2luIHVuaXF1ZSBkZcSfZXIgw7xyZXRpci5cclxuXHQgKiBgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5YCBzYXllc2luZGUgaG9zdCBSb3V0ZXInYSB0YWJzxLF6IG5hdmlnYXRpb24gZ2VsbWV6LCBzYWRlY2VcclxuXHQgKiBgdGFiU3RhdGUoe190YWJ9KWAnbMSxIHRhYiB0xLFrbGFtYWxhcsSxIGdlbGlyIOKGkiBgcm91dGUucXVlcnlQYXJhbXNbJ190YWInXWAgaGVyIHphbWFuIGRvbHUuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcclxuXHRcdGNvbnN0IHYgPSByb3V0ZT8ucXVlcnlQYXJhbXM/LlsnX3RhYiddO1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDAgPyB2IDogbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdXRlIGtleSdpbmkgb2x1xZ90dXJ1ci4gTWF0Y2hlciAod2ViIGNvbXBvbmVudCkgcm91dGUnbGFyIGnDp2luIHJlbW90ZU5hbWUgKyB0YWJJZFxyXG5cdCAqIGJhemzEsSBrZXkga3VsbGFuxLFsxLFyIOKAlCBheW7EsSByZW1vdGUndW4gaGVyIHRhYidpIGF5csSxIE1GRSBjdXN0b20gZWxlbWVudCBpbnN0YW5jZSfEsW5hXHJcblx0ICogc2FoaXB0aXIgKGJhxJ/EsW1zxLF6IHN0YXRlKS5cclxuXHQgKlxyXG5cdCAqIE5vcm1hbCByb3V0ZSdsYXIgacOnaW4gYHBhdGhGcm9tUm9vdGAgw7x6ZXJpbmRlbiB0YW0geW9sIMO8cmV0aWxpciwgYXJkxLFuZGFuIHF1ZXJ5IHBhcmFtc1xyXG5cdCAqIGVrbGVuaXIgKHphdGVuIGBfdGFiYCBkYWhpbCkg4oCUIG5lc3RlZCBib8WfLXBhdGggKGBwYXRoOiAnJ2ApIGNoaWxkIHJvdXRlJ2xhcsSxbsSxbiBheW7EsSBgXCJcImBcclxuXHQgKiBrZXknaXlsZSDDp2FrxLHFn21hc8SxbsSxIGVuZ2VsbGVyIHZlIGF5bsSxIHBhdGgnaW4gaWtpIHRhYidpIGZhcmtsxLEga2V5IGFsxLFyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZ2V0Um91dGVLZXkocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRoaXMuaXNNYXRjaGVyUm91dGUocm91dGUpKSB7XHJcblx0XHRcdGNvbnN0IHJlbW90ZU5hbWUgPSB0aGlzLmdldFJlbW90ZU5hbWUocm91dGUpO1xyXG5cdFx0XHRpZiAocmVtb3RlTmFtZSkge1xyXG5cdFx0XHRcdGNvbnN0IHRhYklkID0gdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShyb3V0ZSk7XHJcblx0XHRcdFx0cmV0dXJuIHRhYklkID8gYG1mZToke3JlbW90ZU5hbWV9OiR7dGFiSWR9YCA6IGBtZmU6JHtyZW1vdGVOYW1lfWA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIFRhbSBwYXRoOiBrw7ZrIOKGkiBpbnRlcm1lZGlhdGUg4oaSIHNlbGYuIEJvxZ8gc2VnbWVudGxlcmkgaW5kZXggaWxlIGtvcnV5YXJhayBoaXllcmFyxZ9pXHJcblx0XHQvLyBwb3ppc3lvbnVudSBrZXknZSBkYWhpbCBlZGVyaXogKGthcmRlxZ8gZW1wdHktcGF0aCByb3V0ZSdsYXIgZmFya2zEsSBrZXkgYWzEsXIpLlxyXG5cdFx0Y29uc3QgZnVsbFBhdGggPSByb3V0ZS5wYXRoRnJvbVJvb3RcclxuXHRcdFx0Lm1hcCgociwgaSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNlZyA9IHIudXJsLm1hcCgocykgPT4gcy5wYXRoKS5qb2luKCcvJyk7XHJcblx0XHRcdFx0cmV0dXJuIHNlZy5sZW5ndGggPiAwID8gc2VnIDogYCMke2l9YDtcclxuXHRcdFx0fSlcclxuXHRcdFx0LmpvaW4oJy8nKTtcclxuXHRcdGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5zZXJpYWxpemVRdWVyeVBhcmFtcyhyb3V0ZS5xdWVyeVBhcmFtcyk7XHJcblx0XHRjb25zdCBmcmFnbWVudCA9IHJvdXRlLmZyYWdtZW50ID8gJyMnICsgcm91dGUuZnJhZ21lbnQgOiAnJztcclxuXHJcblx0XHRyZXR1cm4gZnVsbFBhdGggKyBxdWVyeVBhcmFtcyArIGZyYWdtZW50O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnkgcGFyYW0nbGFyxLEgVVJMLXNhZmUgxZ9la2lsZGUgc2VyaWxlxZ90aXJpci4gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3IndW5hXHJcblx0ICogZG/En3J1ZGFuIG9iamVjdCB2ZXJpcnNlayBhcnJheSBkZcSfZXJsZXIgYD9pZHM9MSwyLDNgIGdpYmkgdGVrIGtleSBvbGFyYWsgeWF6xLFsxLFyO1xyXG5cdCAqIEFuZ3VsYXIgUm91dGVyJ8SxbiBgP2lkcz0xJmlkcz0yJmlkcz0zYCBkYXZyYW7EscWfxLF5bGEgdXl1bXN1eiBvbGFiaWxpci4gYGFwcGVuZGAgaWxlXHJcblx0ICogaGVyIGFycmF5IGVsZW1hbsSxIGF5csSxIGVudHJ5IG9sdXIgdmUgbnVsbC91bmRlZmluZWQgZGXEn2VybGVyIGF0bGFuxLFyLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VyaWFsaXplUXVlcnlQYXJhbXMocGFyYW1zOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90WydxdWVyeVBhcmFtcyddKTogc3RyaW5nIHtcclxuXHRcdC8vIGBzb3J0KClgIGlsZSBkZXRlcm1pbmlzbSDigJQgYXluxLEgc2F5ZmFuxLFuIGZhcmtsxLEgaW5zZXJ0aW9uLW9yZGVyJ2zEsSBxdWVyeVBhcmFtcyfEsVxyXG5cdFx0Ly8gKGRlZXAgbGluayBzaGFyZSwgc2VydmVyLXNpZGUgcmVuZGVyLCBKUy1nZW5lcmF0ZWQgVVJMJ2xlcikgYXluxLEgcm91dGUga2V5IMO8cmV0aXIuXHJcblx0XHQvLyBBa3NpIHRha2RpcmRlIGA/Yj0xJmE9MmAgdmUgYD9hPTImYj0xYCBpa2kgYXlyxLEgaGFuZGxlIG9sYXJhayBjYWNoZSdsZW5pciDihpIgdGFiXHJcblx0XHQvLyBpem9sYXN5b251IGF5bsSxIHNheWZhbsSxbiBpa2kgYXlyxLEgaW5zdGFuY2UnxLFuxLEgYcOnYXIuXHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKS5zb3J0KCk7XHJcblx0XHRpZiAoIWtleXMubGVuZ3RoKSByZXR1cm4gJyc7XHJcblx0XHRjb25zdCBvdXQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcblx0XHRmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xyXG5cdFx0XHRjb25zdCB2ID0gcGFyYW1zW2tdO1xyXG5cdFx0XHRpZiAodiA9PSBudWxsKSBjb250aW51ZTtcclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodikpIHtcclxuXHRcdFx0XHR2LmZvckVhY2goKHZ2KSA9PiB2diAhPSBudWxsICYmIG91dC5hcHBlbmQoaywgU3RyaW5nKHZ2KSkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG91dC5hcHBlbmQoaywgU3RyaW5nKHYpKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgc3RyID0gb3V0LnRvU3RyaW5nKCk7XHJcblx0XHRyZXR1cm4gc3RyID8gJz8nICsgc3RyIDogJyc7XHJcblx0fVxyXG5cclxuXHRzaG91bGRSZXVzZVJvdXRlKGZ1dHVyZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY3VycjogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgZnV0dXJlTWF0Y2hlciA9IHRoaXMuaXNNYXRjaGVyUm91dGUoZnV0dXJlKTtcclxuXHRcdGNvbnN0IGN1cnJNYXRjaGVyID0gdGhpcy5pc01hdGNoZXJSb3V0ZShjdXJyKTtcclxuXHJcblx0XHRpZiAoZnV0dXJlTWF0Y2hlciAmJiBjdXJyTWF0Y2hlcikge1xyXG5cdFx0XHRjb25zdCBmciA9IHRoaXMuZ2V0UmVtb3RlTmFtZShmdXR1cmUpO1xyXG5cdFx0XHRjb25zdCBjciA9IHRoaXMuZ2V0UmVtb3RlTmFtZShjdXJyKTtcclxuXHRcdFx0Y29uc3QgZnQgPSB0aGlzLmdldFRhYklkRnJvbVJvdXRlKGZ1dHVyZSk7XHJcblx0XHRcdGNvbnN0IGN0ID0gdGhpcy5nZXRUYWJJZEZyb21Sb3V0ZShjdXJyKTtcclxuXHRcdFx0Ly8gQXluxLEgcmVtb3RlIG9sc2EgYmlsZSBmYXJrbMSxIHRhYidsZXJzZSBmcmVzaCBjb21wb25lbnQgaW5zdGFudGlhdGUgZWRpbG1lbGkg4oCUXHJcblx0XHRcdC8vIGFrc2kgdGFrZGlyZGUgaWtpIHRhYiB0ZWsgY29tcG9uZW50UmVmJ2kgcGF5bGHFn8SxciB2ZSBzdGF0ZSBpem9sYXN5b251IGtheWJvbHVyLlxyXG5cdFx0XHRjb25zdCBzaG91bGRSZXVzZSA9ICEhZnIgJiYgZnIgPT09IGNyICYmIGZ0ID09PSBjdDtcclxuXHRcdFx0Y29uc29sZS5sb2coYFtTdHJhdGVneV0gc2hvdWxkUmV1c2VSb3V0ZSBtYXRjaGVyIOKGkiAke3Nob3VsZFJldXNlfS4gZnV0dXJlPSR7ZnJ9LyR7ZnR9IGN1cnI9JHtjcn0vJHtjdH1gKTtcclxuXHRcdFx0cmV0dXJuIHNob3VsZFJldXNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChmdXR1cmVNYXRjaGVyICE9PSBjdXJyTWF0Y2hlcikge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnW1N0cmF0ZWd5XSBzaG91bGRSZXVzZVJvdXRlIG1peGVkIOKGkiBmYWxzZScpO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2hvdWxkUmV1c2UgPSBmdXR1cmUucm91dGVDb25maWcgPT09IGN1cnIucm91dGVDb25maWc7XHJcblx0XHRjb25zdCBmdXR1cmVLZXkgPSB0aGlzLmdldFJvdXRlS2V5KGZ1dHVyZSk7XHJcblx0XHRjb25zdCBjdXJyS2V5ID0gdGhpcy5nZXRSb3V0ZUtleShjdXJyKTtcclxuXHRcdGNvbnN0IGZ1dHVyZUNvbXAgPSBmdXR1cmUucm91dGVDb25maWc/LmNvbXBvbmVudD8ubmFtZSA/PyBmdXR1cmUuY29tcG9uZW50Py5uYW1lID8/ICdub25lJztcclxuXHRcdGNvbnN0IGN1cnJDb21wID0gY3Vyci5yb3V0ZUNvbmZpZz8uY29tcG9uZW50Py5uYW1lID8/IGN1cnIuY29tcG9uZW50Py5uYW1lID8/ICdub25lJztcclxuXHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRgW1N0cmF0ZWd5XSBzaG91bGRSZXVzZVJvdXRlIG5vcm1hbCDihpIgJHtzaG91bGRSZXVzZX0uIGZ1dHVyZT1cIiR7ZnV0dXJlS2V5fVwiKCR7ZnV0dXJlQ29tcH0pIGN1cnI9XCIke2N1cnJLZXl9XCIoJHtjdXJyQ29tcH0pYFxyXG5cdFx0KTtcclxuXHRcdHJldHVybiBzaG91bGRSZXVzZTtcclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -14,13 +14,11 @@ import * as i4 from "primeng/messages";
|
|
|
14
14
|
import * as i5 from "primeng/toast";
|
|
15
15
|
export class MFELayoutComponent {
|
|
16
16
|
constructor() {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
this._breadcrumbPublisher = inject(BreadcrumbPublisherService);
|
|
17
|
+
// Side-effect injection — `BreadcrumbPublisherService` kendi constructor'ında Router
|
|
18
|
+
// subscription'ını kurar (breadcrumb yayınını başlatır). Field'a ATAMIYORUZ; DI'nın
|
|
19
|
+
// service'i instantiate etmesi yeterli. Field'a atasaydık `noUnusedLocals` (TS6133)
|
|
20
|
+
// strict tüketici build'lerinde (örn. yeap-mw) hata verirdi.
|
|
21
|
+
inject(BreadcrumbPublisherService);
|
|
24
22
|
}
|
|
25
23
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: MFELayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
26
24
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: MFELayoutComponent, isStandalone: true, selector: "mfe-layout", ngImport: i0, template: `
|
|
@@ -49,5 +47,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
49
47
|
`,
|
|
50
48
|
imports: [RouterOutlet, ConfirmDialogModule, ConfirmPopupModule, DialogModule, MessagesModule, ToastModule]
|
|
51
49
|
}]
|
|
52
|
-
}] });
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
}], ctorParameters: () => [] });
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZlLmxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3RoZW1lL2xheW91dC9hcHAvbGF5b3V0L21mZS5sYXlvdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7QUFnQnhGLE1BQU0sT0FBTyxrQkFBa0I7SUFDOUI7UUFDQyxxRkFBcUY7UUFDckYsb0ZBQW9GO1FBQ3BGLG9GQUFvRjtRQUNwRiw2REFBNkQ7UUFDN0QsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDcEMsQ0FBQzs4R0FQVyxrQkFBa0I7a0dBQWxCLGtCQUFrQixzRUFYcEI7Ozs7Ozs7O0VBUVQsNERBQ1MsWUFBWSwwSkFBRSxtQkFBbUIsb21CQUFFLGtCQUFrQix5UEFBRSxZQUFZLHV1QkFBRSxjQUFjLDJSQUFFLFdBQVc7OzJGQUU5RixrQkFBa0I7a0JBZDlCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUU7Ozs7Ozs7O0VBUVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDO2lCQUMzRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlck91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb25maXJtZGlhbG9nJztcclxuaW1wb3J0IHsgQ29uZmlybVBvcHVwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb25maXJtcG9wdXAnO1xyXG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1lc3NhZ2VzTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9tZXNzYWdlcyc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcblxyXG5pbXBvcnQgeyBCcmVhZGNydW1iUHVibGlzaGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvYnJlYWRjcnVtYi1wdWJsaXNoZXIuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnbWZlLWxheW91dCcsXHJcblx0dGVtcGxhdGU6IGBcclxuXHRcdDxyb3V0ZXItb3V0bGV0IC8+XHJcblxyXG5cdFx0PHAtdG9hc3Qga2V5PVwidG9hc3Qtcm9vdFwiPjwvcC10b2FzdD5cclxuXHRcdDxwLWRpYWxvZyBrZXk9XCJkaWFsb2ctcm9vdFwiPjwvcC1kaWFsb2c+XHJcblx0XHQ8cC1tZXNzYWdlcyBrZXk9XCJtZXNzYWdlcy1yb290XCI+PC9wLW1lc3NhZ2VzPlxyXG5cdFx0PHAtY29uZmlybVBvcHVwIGtleT1cImNvbmZpcm1Qb3B1cC1yb290XCI+PC9wLWNvbmZpcm1Qb3B1cD5cclxuXHRcdDxwLWNvbmZpcm1EaWFsb2cga2V5PVwiY29uZmlybURpYWxvZy1yb290XCI+PC9wLWNvbmZpcm1EaWFsb2c+XHJcblx0YCxcclxuXHRpbXBvcnRzOiBbUm91dGVyT3V0bGV0LCBDb25maXJtRGlhbG9nTW9kdWxlLCBDb25maXJtUG9wdXBNb2R1bGUsIERpYWxvZ01vZHVsZSwgTWVzc2FnZXNNb2R1bGUsIFRvYXN0TW9kdWxlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTUZFTGF5b3V0Q29tcG9uZW50IHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8vIFNpZGUtZWZmZWN0IGluamVjdGlvbiDigJQgYEJyZWFkY3J1bWJQdWJsaXNoZXJTZXJ2aWNlYCBrZW5kaSBjb25zdHJ1Y3RvcifEsW5kYSBSb3V0ZXJcclxuXHRcdC8vIHN1YnNjcmlwdGlvbifEsW7EsSBrdXJhciAoYnJlYWRjcnVtYiB5YXnEsW7EsW7EsSBiYcWfbGF0xLFyKS4gRmllbGQnYSBBVEFNSVlPUlVaOyBESSduxLFuXHJcblx0XHQvLyBzZXJ2aWNlJ2kgaW5zdGFudGlhdGUgZXRtZXNpIHlldGVybGkuIEZpZWxkJ2EgYXRhc2F5ZMSxayBgbm9VbnVzZWRMb2NhbHNgIChUUzYxMzMpXHJcblx0XHQvLyBzdHJpY3QgdMO8a2V0aWNpIGJ1aWxkJ2xlcmluZGUgKMO2cm4uIHllYXAtbXcpIGhhdGEgdmVyaXJkaS5cclxuXHRcdGluamVjdChCcmVhZGNydW1iUHVibGlzaGVyU2VydmljZSk7XHJcblx0fVxyXG59XHJcbiJdfQ==
|