ng-easycommerce 0.0.660-beta.1 → 0.0.661
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/README.md +22 -58
- package/assets/ec-i18n/en.json +3 -1
- package/assets/ec-i18n/es.json +3 -1
- package/bundles/ng-easycommerce.umd.js +179 -512
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/core.consts.js +6 -1
- package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
- package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
- package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +14 -450
- package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +30 -3
- package/esm2015/lib/ec-component/product-ec/product-ec.component.js +1 -2
- package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
- package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
- package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
- package/esm2015/lib/services/cart.service.js +27 -12
- package/esm2015/lib/services/currency.service.js +43 -7
- package/esm5/lib/core.consts.js +6 -1
- package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
- package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
- package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +13 -458
- package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +48 -3
- package/esm5/lib/ec-component/product-ec/product-ec.component.js +1 -2
- package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
- package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
- package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
- package/esm5/lib/services/cart.service.js +27 -12
- package/esm5/lib/services/currency.service.js +43 -7
- package/fesm2015/ng-easycommerce.js +157 -499
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +180 -513
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/core.consts.d.ts +5 -0
- package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +1 -0
- package/lib/ec-component/cart-ec/cart-ec.component.d.ts +1 -0
- package/lib/ec-component/collection-ec/collection-ec.component.d.ts +4 -34
- package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +3 -0
- package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +1 -0
- package/lib/services/cart.service.d.ts +2 -2
- package/lib/services/currency.service.d.ts +14 -2
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -4,13 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
var CollectionEcComponent_1;
|
|
11
|
-
import { Component, Input, Inject, PLATFORM_ID } from '@angular/core';
|
|
12
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
13
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
7
|
+
import { Component, Input } from '@angular/core';
|
|
8
|
+
import { ActivatedRoute } from '@angular/router';
|
|
14
9
|
// import { Constants, Filter, OptionsService, Product, ProductsService } from 'ng-easycommerce';
|
|
15
10
|
import { combineLatest } from 'rxjs';
|
|
16
11
|
import { ComponentHelper } from '../../classes/component-helper';
|
|
@@ -22,8 +17,8 @@ import { FiltersService } from '../../services/filters.service';
|
|
|
22
17
|
import { OptionsService } from '../../services/options.service';
|
|
23
18
|
import { ParametersService } from '../../services/parameters.service';
|
|
24
19
|
import { ProductsService } from '../../services/products/products.service';
|
|
25
|
-
let CollectionEcComponent =
|
|
26
|
-
constructor(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService
|
|
20
|
+
let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper {
|
|
21
|
+
constructor(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService) {
|
|
27
22
|
super();
|
|
28
23
|
this.productsService = productsService;
|
|
29
24
|
this.paramsSrv = paramsSrv;
|
|
@@ -34,21 +29,12 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
34
29
|
this.cartService = cartService;
|
|
35
30
|
this.consts = consts;
|
|
36
31
|
this.filtersService = filtersService;
|
|
37
|
-
this.router = router;
|
|
38
32
|
this.filters = [];
|
|
39
33
|
this.filtersConfig = { filters: [] };
|
|
40
34
|
this.finished = false;
|
|
41
35
|
this.loading = true;
|
|
42
36
|
this.breadcrumb = [];
|
|
43
37
|
this.isCollection = true;
|
|
44
|
-
this.usingCachedProducts = false;
|
|
45
|
-
this.allCachedProducts = [];
|
|
46
|
-
this.subscriptionsConfigured = false;
|
|
47
|
-
this.isScrolling = false;
|
|
48
|
-
this.pendingScrollPosition = null;
|
|
49
|
-
this.expectedProductCount = 0;
|
|
50
|
-
this.filtersFromCache = false; // Flag para indicar si los filtros vienen del cache
|
|
51
|
-
this.isCategoryChange = false; // Flag para indicar si es un cambio de categoría
|
|
52
38
|
this.productsWithUniqueVariant = false;
|
|
53
39
|
this.optionsFilters = ['all'];
|
|
54
40
|
/**
|
|
@@ -117,113 +103,23 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
117
103
|
this.getObjectWithVariant = () => {
|
|
118
104
|
return this.consts.getParamsProductsWithUniqueVariant();
|
|
119
105
|
};
|
|
120
|
-
// Método personalizado para manejar selección de filtros que invalidará cache
|
|
121
|
-
this.customSetFilterSelected = (filter, filterElement) => {
|
|
122
|
-
// Invalidar cache completamente cuando se selecciona un filtro
|
|
123
|
-
this.usingCachedProducts = false;
|
|
124
|
-
this.allCachedProducts = [];
|
|
125
|
-
this.filtersFromCache = false; // Ya no usamos filtros del cache
|
|
126
|
-
this.isCategoryChange = true; // Marcar como cambio para reemplazar productos
|
|
127
|
-
CollectionEcComponent_1.stateCache.delete(this.stateKey);
|
|
128
|
-
console.log('🔄 Filtro seleccionado, invalidando cache y recargando desde endpoint para:', this.stateKey);
|
|
129
|
-
// Solo limpiar productos, NO limpiar filtros para que no desaparezcan
|
|
130
|
-
this.products = [];
|
|
131
|
-
this.loading = true;
|
|
132
|
-
// Llamar al método original del ProductsService que iniciará una carga completa
|
|
133
|
-
const result = this.productsService.setFilterSelected(filter, filterElement);
|
|
134
|
-
// La suscripción principal automáticamente actualizará los filtros
|
|
135
|
-
// porque filtersFromCache = false y usingCachedProducts = false
|
|
136
|
-
return result;
|
|
137
|
-
};
|
|
138
106
|
this.paramsSrv.parameters.subscribe(param => this.params = param);
|
|
139
107
|
this.defaultFilters = this.consts.getDefaultFilters();
|
|
140
108
|
this.filtersConfig.filters = this.consts.getFilterConfig();
|
|
141
109
|
this.productsService.filtersInView$.subscribe(res => this.filterInView = res);
|
|
142
|
-
// Inicializar propiedades de scroll y cache
|
|
143
|
-
this.platformId = platformId;
|
|
144
|
-
this.isRestoringState = false;
|
|
145
|
-
this.usingCachedProducts = false;
|
|
146
|
-
this.allCachedProducts = [];
|
|
147
|
-
this.subscriptionsConfigured = false;
|
|
148
|
-
this.isScrolling = false;
|
|
149
|
-
this.pendingScrollPosition = null;
|
|
150
|
-
this.expectedProductCount = 0;
|
|
151
|
-
this.filtersFromCache = false;
|
|
152
110
|
this.ecOnConstruct();
|
|
153
111
|
}
|
|
154
112
|
ngOnInit() {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
// NO llamar window.scroll(0, 0) para preservar posición
|
|
160
|
-
this.products = [];
|
|
161
|
-
this.ecOnInit();
|
|
162
|
-
this.getProductsAndSubscribe(); // Llamar directamente
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
// Comportamiento normal con scroll al inicio
|
|
166
|
-
window.scroll(0, 0);
|
|
167
|
-
this.products = [];
|
|
168
|
-
this.ecOnInit();
|
|
169
|
-
this.getProductsAndSubscribe();
|
|
170
|
-
}
|
|
171
|
-
// Configurar manejo de estado
|
|
172
|
-
this.setupBeforeUnloadHandler();
|
|
113
|
+
window.scroll(0, 0);
|
|
114
|
+
this.products = [];
|
|
115
|
+
this.ecOnInit();
|
|
116
|
+
this.getProductsAndSubscribe();
|
|
173
117
|
}
|
|
174
118
|
getProductsAndSubscribe() {
|
|
175
|
-
// Verificar PRIMERO si hay estado guardado
|
|
176
|
-
const savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
|
|
177
|
-
if (savedState && savedState.products.length > 0) {
|
|
178
|
-
console.log('📦 Restaurando desde cache:', savedState.products.length, 'productos');
|
|
179
|
-
// Configurar modo cache ANTES de restaurar
|
|
180
|
-
this.usingCachedProducts = true;
|
|
181
|
-
this.allCachedProducts = [...savedState.products];
|
|
182
|
-
this.isRestoringState = true;
|
|
183
|
-
// Restaurar productos inmediatamente
|
|
184
|
-
this.products = [...savedState.products];
|
|
185
|
-
this.finished = savedState.finished;
|
|
186
|
-
this.loading = false;
|
|
187
|
-
// Restaurar filtros si están disponibles
|
|
188
|
-
if (savedState.filters) {
|
|
189
|
-
this.filters = [...savedState.filters];
|
|
190
|
-
this.filtersFromCache = true; // Marcar que estos filtros vienen del cache
|
|
191
|
-
console.log('📦 Filtros restaurados desde cache:', this.filters.length);
|
|
192
|
-
}
|
|
193
|
-
if (savedState.filters_top) {
|
|
194
|
-
this.filters_top = [...savedState.filters_top];
|
|
195
|
-
console.log('📦 Filtros top restaurados desde cache:', this.filters_top.length);
|
|
196
|
-
}
|
|
197
|
-
if (savedState.breadcrumb) {
|
|
198
|
-
this.breadcrumb = [...savedState.breadcrumb];
|
|
199
|
-
console.log('📦 Breadcrumb restaurado desde cache:', this.breadcrumb);
|
|
200
|
-
}
|
|
201
|
-
// IMPORTANTE: Configurar TODAS las suscripciones del padre (filtros, breadcrumb, etc.)
|
|
202
|
-
// pero SIN resetear productos ni hacer petición inicial
|
|
203
|
-
this.setupParentSubscriptionsOnly();
|
|
204
|
-
// Configurar suscripción personalizada para detectar cambios de categoría
|
|
205
|
-
this.setupCustomSubscription();
|
|
206
|
-
this.subscriptionsConfigured = true;
|
|
207
|
-
// Restaurar scroll después de que los productos se rendericen
|
|
208
|
-
this.waitForProductRendering(savedState.scrollPosition);
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
console.log('🔄 No hay cache, carga normal');
|
|
212
|
-
// Si no hay estado guardado, comportamiento normal
|
|
213
|
-
this.usingCachedProducts = false;
|
|
214
|
-
this.allCachedProducts = [];
|
|
215
|
-
this.filtersFromCache = false; // No hay filtros del cache
|
|
216
|
-
// Llamar al comportamiento original
|
|
217
|
-
this.originalGetProductsAndSubscribe();
|
|
218
|
-
this.subscriptionsConfigured = true;
|
|
219
|
-
}
|
|
220
|
-
originalGetProductsAndSubscribe() {
|
|
221
119
|
combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(([params, ready, queryParams]) => {
|
|
222
120
|
if (ready.readyAll) {
|
|
223
121
|
let cambio = false;
|
|
224
122
|
this.products = [];
|
|
225
|
-
// Marcar como cambio de categoría para la carga inicial
|
|
226
|
-
this.isCategoryChange = true;
|
|
227
123
|
if (!params['type'] || !params['value']) {
|
|
228
124
|
this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
|
|
229
125
|
}
|
|
@@ -253,16 +149,7 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
253
149
|
}
|
|
254
150
|
else {
|
|
255
151
|
res = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
|
|
256
|
-
|
|
257
|
-
const existingIds = new Set(this.products.map(p => p.id));
|
|
258
|
-
const uniqueProducts = res.filter(p => !existingIds.has(p.id));
|
|
259
|
-
if (uniqueProducts.length > 0) {
|
|
260
|
-
console.log('➕ CollectionEC (variants): Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
|
|
261
|
-
this.products.push(...uniqueProducts);
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
console.log('⚠️ CollectionEC (variants): Todos los productos ya existen - ignorando', res.length, 'productos');
|
|
265
|
-
}
|
|
152
|
+
this.products.push(...res);
|
|
266
153
|
this.applyFiltersInView();
|
|
267
154
|
}
|
|
268
155
|
;
|
|
@@ -274,16 +161,7 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
274
161
|
cambio = false;
|
|
275
162
|
}
|
|
276
163
|
else {
|
|
277
|
-
|
|
278
|
-
const existingIds = new Set(this.products.map(p => p.id));
|
|
279
|
-
const uniqueProducts = res.filter(p => !existingIds.has(p.id));
|
|
280
|
-
if (uniqueProducts.length > 0) {
|
|
281
|
-
console.log('➕ CollectionEC: Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
|
|
282
|
-
this.products.push(...uniqueProducts);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
console.log('⚠️ CollectionEC: Todos los productos ya existen - ignorando', res.length, 'productos');
|
|
286
|
-
}
|
|
164
|
+
this.products.push(...res);
|
|
287
165
|
this.applyFiltersInView();
|
|
288
166
|
}
|
|
289
167
|
}
|
|
@@ -300,141 +178,6 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
300
178
|
}
|
|
301
179
|
});
|
|
302
180
|
}
|
|
303
|
-
setupParentSubscriptionsOnly() {
|
|
304
|
-
var _a;
|
|
305
|
-
// Desuscribir cualquier suscripción anterior
|
|
306
|
-
try {
|
|
307
|
-
(_a = this.suscripcion) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
308
|
-
}
|
|
309
|
-
catch (e) { }
|
|
310
|
-
// IMPORTANTE: Configurar suscripción a productos para navegación posterior
|
|
311
|
-
this.suscripcion = this.productsService.products$.subscribe(res => {
|
|
312
|
-
var _a;
|
|
313
|
-
console.log('📦 Suscripción products$ (desde cache):', (_a = res) === null || _a === void 0 ? void 0 : _a.length, 'productos');
|
|
314
|
-
this.loading = false;
|
|
315
|
-
if (res && res.length > 0) {
|
|
316
|
-
// Si estamos usando cache, agregar solo productos nuevos únicos
|
|
317
|
-
if (this.usingCachedProducts) {
|
|
318
|
-
const existingIds = new Set(this.products.map(p => p.id));
|
|
319
|
-
const uniqueProducts = res.filter(p => !existingIds.has(p.id));
|
|
320
|
-
if (uniqueProducts.length > 0) {
|
|
321
|
-
console.log('➕ Cache: Agregando', uniqueProducts.length, 'productos adicionales');
|
|
322
|
-
this.products.push(...uniqueProducts);
|
|
323
|
-
this.usingCachedProducts = false; // Ya no solo cache
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
// Determinar si es cambio de categoría o scroll infinito
|
|
328
|
-
if (this.isCategoryChange) {
|
|
329
|
-
// Cambio de categoría: reemplazar completamente
|
|
330
|
-
console.log('🔄 Cambio de categoría: Reemplazando productos completamente');
|
|
331
|
-
if (this.productsWithUniqueVariant) {
|
|
332
|
-
this.products = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
this.products = res;
|
|
336
|
-
}
|
|
337
|
-
this.applyFiltersInView();
|
|
338
|
-
this.isCategoryChange = false; // Resetear bandera
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// Scroll infinito: agregar productos únicos
|
|
342
|
-
console.log('📜 Scroll infinito: Agregando productos únicos');
|
|
343
|
-
const existingIds = new Set(this.products.map(p => p.id));
|
|
344
|
-
let newProducts = res;
|
|
345
|
-
if (this.productsWithUniqueVariant) {
|
|
346
|
-
newProducts = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
|
|
347
|
-
}
|
|
348
|
-
const uniqueProducts = newProducts.filter(p => !existingIds.has(p.id));
|
|
349
|
-
if (uniqueProducts.length > 0) {
|
|
350
|
-
console.log('➕ Agregando', uniqueProducts.length, 'productos únicos por scroll');
|
|
351
|
-
this.products.push(...uniqueProducts);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
console.log('⚠️ Todos los productos del scroll ya existen');
|
|
355
|
-
}
|
|
356
|
-
this.applyFiltersInView();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
else if (res && res.length === 0) {
|
|
361
|
-
// Si recibimos array vacío y no estamos usando cache, limpiar productos
|
|
362
|
-
if (!this.usingCachedProducts) {
|
|
363
|
-
this.products = [];
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
this.finished = this.productsService.isFinished();
|
|
367
|
-
this.analyticsService.callEvent('view_item_list', { products: this.products, item_list_name: 'Collection', item_list_id: 0 });
|
|
368
|
-
});
|
|
369
|
-
// Configurar suscripciones de filtros
|
|
370
|
-
this.productsService.filters$.subscribe(res => {
|
|
371
|
-
// IMPORTANTE: Solo actualizar filtros si NO vienen del cache
|
|
372
|
-
if (!this.filtersFromCache) {
|
|
373
|
-
console.log('🔄 Actualizando filtros desde server');
|
|
374
|
-
this.breadcrumb = this.optionsService.getBreadcrumbByFilters(res);
|
|
375
|
-
this.filters = this.getSpecificFilters(res, this.filtersConfig.filters);
|
|
376
|
-
this.filters_top = this.getSpecificFilters(res, ['sort']);
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
console.log('🚫 Saltando actualización de filtros (usando cache)');
|
|
380
|
-
// Una vez que han sido utilizados, resetear el flag
|
|
381
|
-
this.filtersFromCache = false;
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
this.productsService.finished().subscribe(res => this.finished = res);
|
|
385
|
-
}
|
|
386
|
-
setupCustomSubscription() {
|
|
387
|
-
// Suscripción personalizada para detectar cambios de categoría/búsqueda
|
|
388
|
-
combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(([params, ready, queryParams]) => {
|
|
389
|
-
if (ready.readyAll && this.subscriptionsConfigured) {
|
|
390
|
-
const currentKey = this.generateStateKey();
|
|
391
|
-
// Si la clave cambió, significa que navegamos a una categoría diferente
|
|
392
|
-
if (currentKey !== this.stateKey) {
|
|
393
|
-
console.log('🔄 Cambio de categoría detectado, invalidando cache y recargando');
|
|
394
|
-
this.stateKey = currentKey;
|
|
395
|
-
// Limpiar cache y recargar normalmente
|
|
396
|
-
this.invalidateCache();
|
|
397
|
-
this.usingCachedProducts = false;
|
|
398
|
-
this.allCachedProducts = [];
|
|
399
|
-
this.filtersFromCache = false;
|
|
400
|
-
// IMPORTANTE: Marcar que es cambio de categoría y resetear estado
|
|
401
|
-
this.isCategoryChange = true;
|
|
402
|
-
this.loading = true;
|
|
403
|
-
this.products = [];
|
|
404
|
-
// Recargar normalmente - pero solo la petición, no reconfigurar suscripciones
|
|
405
|
-
this.loadNewCategory(params, queryParams);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
loadNewCategory(params, queryParams) {
|
|
411
|
-
// Hacer solo la petición de productos sin reconfigurar todas las suscripciones
|
|
412
|
-
let cambio = false;
|
|
413
|
-
if (!params['type'] || !params['value']) {
|
|
414
|
-
this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
this.productsService.getProductsForFilter({ type: params.type, value: params.value }, this.optionsFilters, queryParams.search, this.defaultFilters);
|
|
418
|
-
cambio = true;
|
|
419
|
-
this.type = params['type'];
|
|
420
|
-
this.value = params['value'];
|
|
421
|
-
}
|
|
422
|
-
console.log('🔄 Nueva petición enviada para categoría:', params.type, params.value);
|
|
423
|
-
}
|
|
424
|
-
generateStateKey() {
|
|
425
|
-
// Incluir ruta y parámetros para generar clave única
|
|
426
|
-
const route = this.router.url.split('?')[0]; // Sin query params
|
|
427
|
-
const params = this.activeRoute.snapshot.params;
|
|
428
|
-
return `${route}_${JSON.stringify(params)}`;
|
|
429
|
-
}
|
|
430
|
-
invalidateCache() {
|
|
431
|
-
// Limpiar cache específico y sessionStorage
|
|
432
|
-
console.log('🗑️ Invalidando cache para:', this.stateKey);
|
|
433
|
-
CollectionEcComponent_1.stateCache.delete(this.stateKey);
|
|
434
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
435
|
-
sessionStorage.removeItem(`collection_scroll_${this.stateKey}`);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
181
|
onScroll() {
|
|
439
182
|
this.loading = true;
|
|
440
183
|
if (!this.productsService.isWaiting() && !this.productsService.getNext()) {
|
|
@@ -442,183 +185,7 @@ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponen
|
|
|
442
185
|
this.loading = false;
|
|
443
186
|
}
|
|
444
187
|
}
|
|
445
|
-
// Métodos de ciclo de vida requeridos
|
|
446
|
-
ngAfterViewChecked() {
|
|
447
|
-
// Solo verificar si hay un scroll pendiente
|
|
448
|
-
if (this.pendingScrollPosition !== null && isPlatformBrowser(this.platformId)) {
|
|
449
|
-
const productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
|
|
450
|
-
const currentProductCount = productElements.length;
|
|
451
|
-
// Verificar si se han renderizado suficientes productos
|
|
452
|
-
if (currentProductCount >= Math.min(this.expectedProductCount, 10)) {
|
|
453
|
-
const targetPosition = this.pendingScrollPosition;
|
|
454
|
-
this.pendingScrollPosition = null; // Limpiar para evitar loops
|
|
455
|
-
// Usar requestAnimationFrame para asegurar que el rendering esté completo
|
|
456
|
-
requestAnimationFrame(() => {
|
|
457
|
-
requestAnimationFrame(() => {
|
|
458
|
-
this.restoreScrollWithRetries(targetPosition);
|
|
459
|
-
this.isRestoringState = false;
|
|
460
|
-
});
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
ngOnDestroy() {
|
|
466
|
-
var _a;
|
|
467
|
-
(_a = this.routerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
468
|
-
this.saveCurrentState();
|
|
469
|
-
// Limpiar scroll pendiente
|
|
470
|
-
this.pendingScrollPosition = null;
|
|
471
|
-
// Limpiar event listeners
|
|
472
|
-
if (this.clickHandler) {
|
|
473
|
-
document.removeEventListener('click', this.clickHandler);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
// Métodos de manejo de scroll y cache
|
|
477
|
-
setupBeforeUnloadHandler() {
|
|
478
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
479
|
-
// Interceptar clics en productos para guardar estado
|
|
480
|
-
this.clickHandler = (event) => {
|
|
481
|
-
const target = event.target;
|
|
482
|
-
// Buscar si el clic es en un enlace a producto
|
|
483
|
-
const link = target.closest('a[href*="/product/"]');
|
|
484
|
-
if (link && this.router.url.includes('/collection/')) {
|
|
485
|
-
console.log('🎯 Clic en producto detectado, guardando estado');
|
|
486
|
-
this.saveCurrentState();
|
|
487
|
-
}
|
|
488
|
-
};
|
|
489
|
-
document.addEventListener('click', this.clickHandler);
|
|
490
|
-
// Guardar durante scroll en la página de colección
|
|
491
|
-
let scrollTimer;
|
|
492
|
-
window.addEventListener('scroll', () => {
|
|
493
|
-
// Solo guardar si estamos en una página de colección
|
|
494
|
-
if (this.router.url.includes('/collection/')) {
|
|
495
|
-
clearTimeout(scrollTimer);
|
|
496
|
-
scrollTimer = setTimeout(() => this.saveCurrentState(), 300);
|
|
497
|
-
}
|
|
498
|
-
});
|
|
499
|
-
// Guardar antes de que el usuario salga de la página
|
|
500
|
-
window.addEventListener('beforeunload', () => {
|
|
501
|
-
if (this.router.url.includes('/collection/')) {
|
|
502
|
-
this.saveCurrentState();
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
saveCurrentState() {
|
|
508
|
-
if (isPlatformBrowser(this.platformId) && this.products && this.products.length > 0) {
|
|
509
|
-
// Obtener posición de scroll de múltiples fuentes
|
|
510
|
-
const scrollPos = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop || 0, document.body.scrollTop || 0);
|
|
511
|
-
// Solo guardar si tenemos una posición significativa o productos suficientes
|
|
512
|
-
if (scrollPos > 10 || this.products.length > 10) {
|
|
513
|
-
const state = {
|
|
514
|
-
products: [...this.products],
|
|
515
|
-
scrollPosition: scrollPos,
|
|
516
|
-
finished: this.finished,
|
|
517
|
-
loading: this.loading,
|
|
518
|
-
page: Math.ceil(this.products.length / 10),
|
|
519
|
-
allCachedProducts: this.usingCachedProducts ? [...this.allCachedProducts] : [...this.products],
|
|
520
|
-
filters: this.filters ? [...this.filters] : undefined,
|
|
521
|
-
filters_top: this.filters_top ? [...this.filters_top] : undefined,
|
|
522
|
-
breadcrumb: this.breadcrumb ? [...this.breadcrumb] : undefined
|
|
523
|
-
};
|
|
524
|
-
CollectionEcComponent_1.stateCache.set(this.stateKey, state);
|
|
525
|
-
// También guardar en sessionStorage como backup
|
|
526
|
-
try {
|
|
527
|
-
sessionStorage.setItem(`collection_scroll_${this.stateKey}`, scrollPos.toString());
|
|
528
|
-
sessionStorage.setItem(`collection_products_${this.stateKey}`, this.products.length.toString());
|
|
529
|
-
}
|
|
530
|
-
catch (e) { }
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
restoreScrollWithRetries(targetPosition) {
|
|
535
|
-
if (this.isScrolling) {
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
// Verificar si el target es mayor que la altura del documento
|
|
539
|
-
const documentHeight = document.documentElement.scrollHeight;
|
|
540
|
-
if (targetPosition > documentHeight) {
|
|
541
|
-
targetPosition = Math.max(0, documentHeight - window.innerHeight);
|
|
542
|
-
}
|
|
543
|
-
// Solo verificar si el usuario ha hecho scroll muy lejos
|
|
544
|
-
const currentPos = window.pageYOffset || document.documentElement.scrollTop;
|
|
545
|
-
if (currentPos > 500 && Math.abs(currentPos - targetPosition) > 1000) {
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
this.isScrolling = true;
|
|
549
|
-
// Intentar encontrar una posición más precisa basada en elementos del DOM
|
|
550
|
-
const improvedPosition = this.tryScrollToProductByIndex(targetPosition);
|
|
551
|
-
if (improvedPosition !== targetPosition) {
|
|
552
|
-
targetPosition = improvedPosition;
|
|
553
|
-
}
|
|
554
|
-
let attempts = 0;
|
|
555
|
-
const maxAttempts = 15;
|
|
556
|
-
const tryScroll = () => {
|
|
557
|
-
attempts++;
|
|
558
|
-
// Usar scroll más agresivo si es necesario
|
|
559
|
-
if (attempts < 3) {
|
|
560
|
-
// Primeros intentos con smooth
|
|
561
|
-
window.scrollTo({
|
|
562
|
-
top: targetPosition,
|
|
563
|
-
behavior: 'smooth'
|
|
564
|
-
});
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
// Intentos posteriores más directos
|
|
568
|
-
window.scrollTo(0, targetPosition);
|
|
569
|
-
document.documentElement.scrollTop = targetPosition;
|
|
570
|
-
document.body.scrollTop = targetPosition;
|
|
571
|
-
}
|
|
572
|
-
// Verificar después de un momento
|
|
573
|
-
setTimeout(() => {
|
|
574
|
-
const currentPos = window.pageYOffset || document.documentElement.scrollTop;
|
|
575
|
-
const difference = Math.abs(currentPos - targetPosition);
|
|
576
|
-
if (difference > 50 && attempts < maxAttempts) {
|
|
577
|
-
const delay = attempts < 5 ? 100 : attempts < 10 ? 200 : 300;
|
|
578
|
-
setTimeout(tryScroll, delay);
|
|
579
|
-
}
|
|
580
|
-
else {
|
|
581
|
-
this.isScrolling = false; // Liberar flag cuando termine
|
|
582
|
-
}
|
|
583
|
-
}, 100);
|
|
584
|
-
};
|
|
585
|
-
// Intentar solo una vez inicialmente
|
|
586
|
-
tryScroll();
|
|
587
|
-
}
|
|
588
|
-
tryScrollToProductByIndex(targetPosition) {
|
|
589
|
-
// Intentar calcular a qué producto corresponde la posición
|
|
590
|
-
const approximateIndex = Math.floor(targetPosition / 400); // Asumiendo ~400px por producto
|
|
591
|
-
// Buscar elementos de producto
|
|
592
|
-
const productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
|
|
593
|
-
if (productElements.length > approximateIndex && approximateIndex >= 0) {
|
|
594
|
-
const targetElement = productElements[approximateIndex];
|
|
595
|
-
const elementPosition = targetElement.offsetTop;
|
|
596
|
-
// Usar la posición del elemento si es razonable
|
|
597
|
-
if (Math.abs(elementPosition - targetPosition) < 800) {
|
|
598
|
-
return elementPosition;
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
return targetPosition; // Usar posición original si no encuentra elemento adecuado
|
|
602
|
-
}
|
|
603
|
-
waitForProductRendering(targetPosition) {
|
|
604
|
-
var _a;
|
|
605
|
-
// Configurar el scroll pendiente para que ngAfterViewChecked lo maneje
|
|
606
|
-
this.pendingScrollPosition = targetPosition;
|
|
607
|
-
this.expectedProductCount = ((_a = this.products) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
608
|
-
// Timeout de seguridad en caso de que ngAfterViewChecked no se ejecute
|
|
609
|
-
setTimeout(() => {
|
|
610
|
-
if (this.pendingScrollPosition !== null) {
|
|
611
|
-
const targetPos = this.pendingScrollPosition;
|
|
612
|
-
this.pendingScrollPosition = null;
|
|
613
|
-
this.restoreScrollWithRetries(targetPos);
|
|
614
|
-
this.isRestoringState = false;
|
|
615
|
-
}
|
|
616
|
-
}, 2000);
|
|
617
|
-
}
|
|
618
188
|
};
|
|
619
|
-
// Propiedades para scroll y cache
|
|
620
|
-
CollectionEcComponent.stateCache = new Map();
|
|
621
|
-
CollectionEcComponent.maxCacheSize = 10;
|
|
622
189
|
CollectionEcComponent.ctorParameters = () => [
|
|
623
190
|
{ type: ProductsService },
|
|
624
191
|
{ type: ParametersService },
|
|
@@ -628,9 +195,7 @@ CollectionEcComponent.ctorParameters = () => [
|
|
|
628
195
|
{ type: AnalyticsService },
|
|
629
196
|
{ type: CartService },
|
|
630
197
|
{ type: Constants },
|
|
631
|
-
{ type: FiltersService }
|
|
632
|
-
{ type: Router },
|
|
633
|
-
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
|
|
198
|
+
{ type: FiltersService }
|
|
634
199
|
];
|
|
635
200
|
__decorate([
|
|
636
201
|
Input()
|
|
@@ -644,13 +209,12 @@ __decorate([
|
|
|
644
209
|
__decorate([
|
|
645
210
|
Input()
|
|
646
211
|
], CollectionEcComponent.prototype, "optionsFilters", void 0);
|
|
647
|
-
CollectionEcComponent =
|
|
212
|
+
CollectionEcComponent = __decorate([
|
|
648
213
|
Component({
|
|
649
214
|
selector: 'app-collection-ec',
|
|
650
215
|
template: "\r\n<div>\r\n <div class=\"collection\">\r\n <ng-content select=\"[collection]\"> </ng-content>\r\n </div>\r\n\r\n <div class=\"all\">\r\n <ng-content select=\"[all]\"> </ng-content>\r\n </div>\r\n</div>\r\n\r\n<app-blocks-ec [section]=\"'collection'\"></app-blocks-ec>",
|
|
651
216
|
styles: [".h1-custom{color:#00f}"]
|
|
652
|
-
})
|
|
653
|
-
__param(10, Inject(PLATFORM_ID))
|
|
217
|
+
})
|
|
654
218
|
], CollectionEcComponent);
|
|
655
219
|
export { CollectionEcComponent };
|
|
656
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsV0FBVyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBELGlHQUFpRztBQUNqRyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFvQjNFLElBQWEscUJBQXFCLDZCQUFsQyxNQUFhLHFCQUFzQixTQUFRLGVBQWU7SUF5Q3RELFlBQW1CLGVBQWdDLEVBQ3JDLFNBQTRCLEVBQzVCLFdBQTJCLEVB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QixHQUFHLElBQUksQ0FBQztnQkFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2FBQ2pDO1FBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQTBCSixDQUFBO0FBdnBCRyxrQ0FBa0M7QUFDbkIsZ0NBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztBQUNoRCxrQ0FBWSxHQUFHLEVBQUUsQ0FBQzs7WUFzQkcsZUFBZTtZQUMxQixpQkFBaUI7WUFDZixjQUFjO1lBQ1gsY0FBYztZQUNwQixXQUFXO1lBQ0wsZ0JBQWdCO1lBQ3RCLFdBQVc7WUFDaEIsU0FBUztZQUNELGNBQWM7WUFDbkIsTUFBTTtZQUNTLE1BQU0sdUJBQXRDLE1BQU0sU0FBQyxXQUFXOztBQWZkO0lBQVIsS0FBSyxFQUFFO21EQUFNO0FBQ0w7SUFBUixLQUFLLEVBQUU7b0RBQU87QUFDTjtJQUFSLEtBQUssRUFBRTt3RUFBNEM7QUFDM0M7SUFBUixLQUFLLEVBQUU7NkRBQXdDO0FBdkN2QyxxQkFBcUI7SUFMakMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixtVEFBNkM7O0tBRWhELENBQUM7SUFvRE8sWUFBQSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7R0FuRGYscUJBQXFCLENBd3FCakM7U0F4cUJZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIEluamVjdCwgUExBVEZPUk1fSUQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuLy8gaW1wb3J0IHsgQ29uc3RhbnRzLCBGaWx0ZXIsIE9wdGlvbnNTZXJ2aWNlLCBQcm9kdWN0LCBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICduZy1lYXN5Y29tbWVyY2UnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9maWx0ZXJzL0ZpbHRlcic7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyQ29uZmlnLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsdGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vcHRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2R1Y3RzL3Byb2R1Y3RzLnNlcnZpY2UnO1xyXG5cclxuLy8gSW50ZXJmYWNlIHBhcmEgZWwgZXN0YWRvIGRlbCBjYWNoZVxyXG5pbnRlcmZhY2UgQ29sbGVjdGlvblN0YXRlIHtcclxuICBwcm9kdWN0czogYW55W107XHJcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcclxuICBmaW5pc2hlZDogYm9vbGVhbjtcclxuICBsb2FkaW5nOiBib29sZWFuO1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBhbGxDYWNoZWRQcm9kdWN0cz86IGFueVtdO1xyXG4gIGZpbHRlcnM/OiBhbnlbXTsgLy8gTG9zIGZpbHRyb3MgZGlzcG9uaWJsZXMgKGNhdGVnb3LDrWFzLCBwcmVjaW8sIGF0cmlidXRvcylcclxuICBmaWx0ZXJzX3RvcD86IGFueVtdOyAvLyBMb3MgZmlsdHJvcyBzdXBlcmlvcmVzIChvcmRlbmFtaWVudG8pXHJcbiAgYnJlYWRjcnVtYj86IHN0cmluZ1tdOyAvLyBFbCBicmVhZGNydW1iXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtY29sbGVjdGlvbi1lYycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29sbGVjdGlvbi1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb2xsZWN0aW9uLWVjLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzX3RvcDogRmlsdGVyW107XHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW107XHJcbiAgICBwcml2YXRlIGZpbHRlcnNDb25maWc6IEZpbHRlckNvbmZpZyA9IHtmaWx0ZXJzOltdfTtcclxuICAgIC8vIHB1YmxpYyBvcHRpb25zRmlsdGVyczogWydhbGwnXTtcclxuICAgIHB1YmxpYyBwcm9kdWN0czogUHJvZHVjdFtdO1xyXG4gICAgcHVibGljIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc3VzY3JpcGNpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBicmVhZGNydW1iOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBwdWJsaWMgaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVySW5WaWV3OkZpbHRlckVsZW1lbnQ7XHJcblxyXG4gICAgLy8gUHJvcGllZGFkZXMgcGFyYSBzY3JvbGwgeSBjYWNoZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDb2xsZWN0aW9uU3RhdGU+KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtYXhDYWNoZVNpemUgPSAxMDtcclxuICAgIHByaXZhdGUgcm91dGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICBwcml2YXRlIHN0YXRlS2V5OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGlzUmVzdG9yaW5nU3RhdGU6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgdXNpbmdDYWNoZWRQcm9kdWN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBhbGxDYWNoZWRQcm9kdWN0czogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uc0NvbmZpZ3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGVuZGluZ1Njcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgZXhwZWN0ZWRQcm9kdWN0Q291bnQ6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGZpbHRlcnNGcm9tQ2FjaGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRmxhZyBwYXJhIGluZGljYXIgc2kgbG9zIGZpbHRyb3MgdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgcHJpdmF0ZSBpc0NhdGVnb3J5Q2hhbmdlOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgcGFyYSBpbmRpY2FyIHNpIGVzIHVuIGNhbWJpbyBkZSBjYXRlZ29yw61hXHJcbiAgICBcclxuICAgIC8vIFNlcnZpY2lvcyBhZGljaW9uYWxlcyBwYXJhIHNjcm9sbFxyXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3Q7XHJcblxyXG4gICAgQElucHV0KCkgdHlwZTtcclxuICAgIEBJbnB1dCgpIHZhbHVlO1xyXG4gICAgQElucHV0KCkgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgb3B0aW9uc0ZpbHRlcnM6IEZpbHRlclR5cGVbXSA9IFsnYWxsJ107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBwYXJhbXNTcnY6IFBhcmFtZXRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJvdGVjdGVkIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcclxuICAgICAgICBwdWJsaWMgZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBPYmplY3QpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFyYW1zU3J2LnBhcmFtZXRlcnMuc3Vic2NyaWJlKHBhcmFtID0+IHRoaXMucGFyYW1zID0gcGFyYW0pXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IHRoaXMuY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcclxuICAgICAgICB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyA9IHRoaXMuY29uc3RzLmdldEZpbHRlckNvbmZpZygpXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVyc0luVmlldyQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5maWx0ZXJJblZpZXcgPSByZXMpXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gSW5pY2lhbGl6YXIgcHJvcGllZGFkZXMgZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgICAgICB0aGlzLnBsYXRmb3JtSWQgPSBwbGF0Zm9ybUlkO1xyXG4gICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGVjdGVkUHJvZHVjdENvdW50ID0gMDtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RhdGVLZXkgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBWZXJpZmljYXIgc2kgaGF5IGVzdGFkbyBndWFyZGFkbyBBTlRFUyBkZSBzY3JvbGwoMCwwKVxyXG4gICAgICAgIGNvbnN0IHNhdmVkU3RhdGUgPSBDb2xsZWN0aW9uRWNDb21wb25lbnQuc3RhdGVDYWNoZS5nZXQodGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHNhdmVkU3RhdGUgJiYgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE5PIGxsYW1hciB3aW5kb3cuc2Nyb2xsKDAsIDApIHBhcmEgcHJlc2VydmFyIHBvc2ljacOzblxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZWNPbkluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOyAvLyBMbGFtYXIgZGlyZWN0YW1lbnRlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ29tcG9ydGFtaWVudG8gbm9ybWFsIGNvbiBzY3JvbGwgYWwgaW5pY2lvXHJcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5lY09uSW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbmZpZ3VyYXIgbWFuZWpvIGRlIGVzdGFkb1xyXG4gICAgICAgIHRoaXMuc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBWZXJpZmljYXIgUFJJTUVSTyBzaSBoYXkgZXN0YWRvIGd1YXJkYWRvXHJcbiAgICAgICAgY29uc3Qgc2F2ZWRTdGF0ZSA9IENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLmdldCh0aGlzLnN0YXRlS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBzYXZlZFN0YXRlLnByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgUmVzdGF1cmFuZG8gZGVzZGUgY2FjaGU6Jywgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgLy8gQ29uZmlndXJhciBtb2RvIGNhY2hlIEFOVEVTIGRlIHJlc3RhdXJhclxyXG4gICAgICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG4gICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nU3RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIHByb2R1Y3RvcyBpbm1lZGlhdGFtZW50ZVxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHNhdmVkU3RhdGUuZmluaXNoZWQ7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIGZpbHRyb3Mgc2kgZXN0w6FuIGRpc3BvbmlibGVzXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IFsuLi5zYXZlZFN0YXRlLmZpbHRlcnNdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gdHJ1ZTsgLy8gTWFyY2FyIHF1ZSBlc3RvcyBmaWx0cm9zIHZpZW5lbiBkZWwgY2FjaGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5OmIEZpbHRyb3MgcmVzdGF1cmFkb3MgZGVzZGUgY2FjaGU6JywgdGhpcy5maWx0ZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuZmlsdGVyc190b3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc190b3AgPSBbLi4uc2F2ZWRTdGF0ZS5maWx0ZXJzX3RvcF07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBGaWx0cm9zIHRvcCByZXN0YXVyYWRvcyBkZXNkZSBjYWNoZTonLCB0aGlzLmZpbHRlcnNfdG9wLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuYnJlYWRjcnVtYikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iID0gWy4uLnNhdmVkU3RhdGUuYnJlYWRjcnVtYl07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBCcmVhZGNydW1iIHJlc3RhdXJhZG8gZGVzZGUgY2FjaGU6JywgdGhpcy5icmVhZGNydW1iKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogQ29uZmlndXJhciBUT0RBUyBsYXMgc3VzY3JpcGNpb25lcyBkZWwgcGFkcmUgKGZpbHRyb3MsIGJyZWFkY3J1bWIsIGV0Yy4pXHJcbiAgICAgICAgICAgIC8vIHBlcm8gU0lOIHJlc2V0ZWFyIHByb2R1Y3RvcyBuaSBoYWNlciBwZXRpY2nDs24gaW5pY2lhbFxyXG4gICAgICAgICAgICB0aGlzLnNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIHBlcnNvbmFsaXphZGEgcGFyYSBkZXRlY3RhciBjYW1iaW9zIGRlIGNhdGVnb3LDrWFcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFJlc3RhdXJhciBzY3JvbGwgZGVzcHXDqXMgZGUgcXVlIGxvcyBwcm9kdWN0b3Mgc2UgcmVuZGVyaWNlblxyXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JQcm9kdWN0UmVuZGVyaW5nKHNhdmVkU3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBObyBoYXkgY2FjaGUsIGNhcmdhIG5vcm1hbCcpO1xyXG4gICAgICAgIC8vIFNpIG5vIGhheSBlc3RhZG8gZ3VhcmRhZG8sIGNvbXBvcnRhbWllbnRvIG5vcm1hbFxyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTsgLy8gTm8gaGF5IGZpbHRyb3MgZGVsIGNhY2hlXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGxhbWFyIGFsIGNvbXBvcnRhbWllbnRvIG9yaWdpbmFsXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuYWN0aXZlUm91dGUucGFyYW1zLCB0aGlzLm9wdGlvbnNTZXJ2aWNlLnJlYWR5LCB0aGlzLmFjdGl2ZVJvdXRlLnF1ZXJ5UGFyYW1zXSkuc3Vic2NyaWJlKChbcGFyYW1zLCByZWFkeSwgcXVlcnlQYXJhbXNdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZWFkeS5yZWFkeUFsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgLy8gTWFyY2FyIGNvbW8gY2FtYmlvIGRlIGNhdGVnb3LDrWEgcGFyYSBsYSBjYXJnYSBpbmljaWFsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sndHlwZSddIHx8ICFwYXJhbXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IGxhdGVzdDogdHJ1ZSwgbGltaXQ6IDEwIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgIHRoaXMuZGVmYXVsdEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcGFyYW1zWyd0eXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmFtc1sndmFsdWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24udW5zdWJzY3JpYmUoKTsgfSBjYXRjaCAoZSkgeyB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5pc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUMgKHZhcmlhbnRzKTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAnZGUnLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zIMO6bmljb3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn4pqg77iPIENvbGxlY3Rpb25FQyAodmFyaWFudHMpOiBUb2RvcyBsb3MgcHJvZHVjdG9zIHlhIGV4aXN0ZW4gLSBpZ25vcmFuZG8nLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gcmVzOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gZmFsc2U7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUM6IEFncmVnYW5kbycsIHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCwgJ2RlJywgcmVzLmxlbmd0aCwgJ3Byb2R1Y3RvcyDDum5pY29zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBDb2xsZWN0aW9uRUM6IFRvZG9zIGxvcyBwcm9kdWN0b3MgeWEgZXhpc3RlbiAtIGlnbm9yYW5kbycsIHJlcy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbV9saXN0JywgeyBwcm9kdWN0czogdGhpcy5wcm9kdWN0cywgaXRlbV9saXN0X25hbWU6ICdDb2xsZWN0aW9uJywgaXRlbV9saXN0X2lkOiAwIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmdldFNwZWNpZmljRmlsdGVycyhyZXMsIHRoaXMuZmlsdGVyc0NvbmZpZy5maWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNfdG9wID0gdGhpcy5nZXRTcGVjaWZpY0ZpbHRlcnMocmVzLCBbJ3NvcnQnXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbmlzaGVkKCkuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmZpbmlzaGVkID0gcmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRGVzdXNjcmliaXIgY3VhbHF1aWVyIHN1c2NyaXBjacOzbiBhbnRlcmlvclxyXG4gICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24/LnVuc3Vic2NyaWJlKCk7IH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIElNUE9SVEFOVEU6IENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIGEgcHJvZHVjdG9zIHBhcmEgbmF2ZWdhY2nDs24gcG9zdGVyaW9yXHJcbiAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgU3VzY3JpcGNpw7NuIHByb2R1Y3RzJCAoZGVzZGUgY2FjaGUpOicsIHJlcz8ubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2kgZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGFncmVnYXIgc29sbyBwcm9kdWN0b3MgbnVldm9zIMO6bmljb3NcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDYWNoZTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAncHJvZHVjdG9zIGFkaWNpb25hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlOyAvLyBZYSBubyBzb2xvIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmFyIHNpIGVzIGNhbWJpbyBkZSBjYXRlZ29yw61hIG8gc2Nyb2xsIGluZmluaXRvXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYXRlZ29yeUNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1iaW8gZGUgY2F0ZWdvcsOtYTogcmVlbXBsYXphciBjb21wbGV0YW1lbnRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIENhbWJpbyBkZSBjYXRlZ29yw61hOiBSZWVtcGxhemFuZG8gcHJvZHVjdG9zIGNvbXBsZXRhbWVudGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQocmVzLCB0aGlzLmdldE9iamVjdFdpdGhWYXJpYW50KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSBmYWxzZTsgLy8gUmVzZXRlYXIgYmFuZGVyYVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjcm9sbCBpbmZpbml0bzogYWdyZWdhciBwcm9kdWN0b3Mgw7puaWNvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TnCBTY3JvbGwgaW5maW5pdG86IEFncmVnYW5kbyBwcm9kdWN0b3Mgw7puaWNvcycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVByb2R1Y3RzID0gbmV3UHJvZHVjdHMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBBZ3JlZ2FuZG8nLCB1bmlxdWVQcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3Mgw7puaWNvcyBwb3Igc2Nyb2xsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBUb2RvcyBsb3MgcHJvZHVjdG9zIGRlbCBzY3JvbGwgeWEgZXhpc3RlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyAmJiByZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTaSByZWNpYmltb3MgYXJyYXkgdmFjw61vIHkgbm8gZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGxpbXBpYXIgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtX2xpc3QnLCB7IHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLCBpdGVtX2xpc3RfbmFtZTogJ0NvbGxlY3Rpb24nLCBpdGVtX2xpc3RfaWQ6IDAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBzdXNjcmlwY2lvbmVzIGRlIGZpbHRyb3NcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogU29sbyBhY3R1YWxpemFyIGZpbHRyb3Mgc2kgTk8gdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyc0Zyb21DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CflIQgQWN0dWFsaXphbmRvIGZpbHRyb3MgZGVzZGUgc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzX3RvcCA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgWydzb3J0J10pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfmqsgU2FsdGFuZG8gYWN0dWFsaXphY2nDs24gZGUgZmlsdHJvcyAodXNhbmRvIGNhY2hlKScpO1xyXG4gICAgICAgICAgICAgICAgLy8gVW5hIHZleiBxdWUgaGFuIHNpZG8gdXRpbGl6YWRvcywgcmVzZXRlYXIgZWwgZmxhZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maW5pc2hlZCgpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5maW5pc2hlZCA9IHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdXNjcmlwY2nDs24gcGVyc29uYWxpemFkYSBwYXJhIGRldGVjdGFyIGNhbWJpb3MgZGUgY2F0ZWdvcsOtYS9iw7pzcXVlZGFcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtcywgdGhpcy5vcHRpb25zU2VydmljZS5yZWFkeSwgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc10pLnN1YnNjcmliZSgoW3BhcmFtcywgcmVhZHksIHF1ZXJ5UGFyYW1zXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhZHkucmVhZHlBbGwgJiYgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZUtleSgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBTaSBsYSBjbGF2ZSBjYW1iacOzLCBzaWduaWZpY2EgcXVlIG5hdmVnYW1vcyBhIHVuYSBjYXRlZ29yw61hIGRpZmVyZW50ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMuc3RhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBDYW1iaW8gZGUgY2F0ZWdvcsOtYSBkZXRlY3RhZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVLZXkgPSBjdXJyZW50S2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpbXBpYXIgY2FjaGUgeSByZWNhcmdhciBub3JtYWxtZW50ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxDYWNoZWRQcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc0Zyb21DYWNoZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElNUE9SVEFOVEU6IE1hcmNhciBxdWUgZXMgY2FtYmlvIGRlIGNhdGVnb3LDrWEgeSByZXNldGVhciBlc3RhZG9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlY2FyZ2FyIG5vcm1hbG1lbnRlIC0gcGVybyBzb2xvIGxhIHBldGljacOzbiwgbm8gcmVjb25maWd1cmFyIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWROZXdDYXRlZ29yeShwYXJhbXMsIHF1ZXJ5UGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZE5ld0NhdGVnb3J5KHBhcmFtczogYW55LCBxdWVyeVBhcmFtczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLy8gSGFjZXIgc29sbyBsYSBwZXRpY2nDs24gZGUgcHJvZHVjdG9zIHNpbiByZWNvbmZpZ3VyYXIgdG9kYXMgbGFzIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICBsZXQgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXNbJ3R5cGUnXSB8fCAhcGFyYW1zWyd2YWx1ZSddKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgbGF0ZXN0OiB0cnVlLCBsaW1pdDogMTAgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCB0aGlzLmRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcmFtc1sndHlwZSddO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyYW1zWyd2YWx1ZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBOdWV2YSBwZXRpY2nDs24gZW52aWFkYSBwYXJhIGNhdGVnb3LDrWE6JywgcGFyYW1zLnR5cGUsIHBhcmFtcy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVN0YXRlS2V5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy8gSW5jbHVpciBydXRhIHkgcGFyw6FtZXRyb3MgcGFyYSBnZW5lcmFyIGNsYXZlIMO6bmljYVxyXG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07IC8vIFNpbiBxdWVyeSBwYXJhbXNcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnBhcmFtcztcclxuICAgICAgICByZXR1cm4gYCR7cm91dGV9XyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW52YWxpZGF0ZUNhY2hlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIExpbXBpYXIgY2FjaGUgZXNwZWPDrWZpY28geSBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5eR77iPIEludmFsaWRhbmRvIGNhY2hlIHBhcmE6JywgdGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oYGNvbGxlY3Rpb25fc2Nyb2xsXyR7dGhpcy5zdGF0ZUtleX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVhbGl6YSB1biBzb3J0IGRlIHByb2R1Y3RvcyBwb3IgZWwgY2FtcG8gZGF0ZUNyZWF0ZSBkZSBsYSB2YXJpYW50ZVxyXG4gICAgICogQHBhcmFtIGEgUHJvZHVjdG8gYVxyXG4gICAgICogQHBhcmFtIGIgUHJvZHVjdG8gYlxyXG4gICAgICogQHBhcmFtIHR5cGUgc2kgZXMgYGFzY2AgfCBgZGVzY2BcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9ICoqMSoqIHBhcmEgYHRydWVgIHwgKiowKiogcGFyYSBgZmFsc2VgXHJcbiAgICAgKi9cclxuICAgIHNvcnRQcm9kdWN0cyA9IChhOmFueSwgYjphbnksIHR5cGU6c3RyaW5nPSdhc2MnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQSA9IGEudmFyaWFudHMgJiYgYS52YXJpYW50cy5sZW5ndGggPiAwID8gYS52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQiA9IGIudmFyaWFudHMgJiYgYi52YXJpYW50cy5sZW5ndGggPiAwID8gYi52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYodG9Db21wYXJlQSAmJiB0b0NvbXBhcmVCKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlQSA9IG5ldyBEYXRlKHRvQ29tcGFyZUEpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUIgPSBuZXcgRGF0ZSh0b0NvbXBhcmVCKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOiByZXR1cm4gKGRhdGVBID49IGRhdGVCKSA/IDEgOiAwOyBicmVha1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYXNjJzogcmV0dXJuIChkYXRlQSA8PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYXBsaWNhIGVsIGZpbHRybyBlbiBsYSB2aXN0YS4gXHJcbiAgICAgKi9cclxuICAgIGFwcGx5RmlsdGVyc0luVmlldyA9ICgpID0+IHtcclxuICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluVmlldz8ubm9VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHMuc29ydCgoYSwgYikgPT4gdGhpcy5zb3J0UHJvZHVjdHMoYSxiLHRoaXMuZmlsdGVySW5WaWV3LnZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID1mYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyW10sIHR5cGVzOiBGaWx0ZXJUeXBlW10pOiBGaWx0ZXJbXSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRfZmlsdGVyID0gZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IHR5cGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0X2ZpbHRlcikgcmVzdWx0LnB1c2gocmVzdWx0X2ZpbHRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvblNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCkgJiYgIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldE5leHQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFyZVByb2R1Y3RzID0gKCkgPT4gdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwO1xyXG4gICAgaXNXYWl0aW5nID0gKCkgPT4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCk7XHJcbiAgICBzZXRGaW5pc2hlZCA9ICgpID0+IHRoaXMuZmluaXNoZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICBjaGFuZ2VGaWx0ZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGxQcm9kdWN0b3NUb0NhcnQgPSAocHJvZHVjdHMgPSBudWxsKSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcbiAgICAgICAgKHByb2R1Y3RzIHx8IHRoaXMucHJvZHVjdHMpLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50Lm1hcChwID0+IGl0ZW1zLnB1c2gocCkpKVxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSkubWFwKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSApXHJcbiAgICAgICAgaXRlbXM/Lmxlbmd0aCAmJiB0aGlzLmNhcnRTZXJ2aWNlLmFkZEFsbFRvQ2FydChpdGVtcylcclxuICAgIH1cclxuXHJcbiAgICBnZXRPYmplY3RXaXRoVmFyaWFudCA9ICgpOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9IFxyXG5cclxuICAgIC8vIE3DqXRvZG9zIGRlIGNpY2xvIGRlIHZpZGEgcmVxdWVyaWRvc1xyXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGhheSB1biBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvZHVjdEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbC1sZy0zLCAuY29sLW1kLTQsIC5jb2wtNiwgW2NsYXNzKj1cInByb2R1Y3RcIl0sIC5wcm9kdWN0LWl0ZW0sIC5jYXJkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9kdWN0Q291bnQgPSBwcm9kdWN0RWxlbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIHNpIHNlIGhhbiByZW5kZXJpemFkbyBzdWZpY2llbnRlcyBwcm9kdWN0b3NcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcm9kdWN0Q291bnQgPj0gTWF0aC5taW4odGhpcy5leHBlY3RlZFByb2R1Y3RDb3VudCwgMTApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsOyAvLyBMaW1waWFyIHBhcmEgZXZpdGFyIGxvb3BzXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFVzYXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBhcmEgYXNlZ3VyYXIgcXVlIGVsIHJlbmRlcmluZyBlc3TDqSBjb21wbGV0b1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxXaXRoUmV0cmllcyh0YXJnZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQ3VycmVudFN0YXRlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGltcGlhciBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIExpbXBpYXIgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBNw6l0b2RvcyBkZSBtYW5lam8gZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgIHByaXZhdGUgc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIC8vIEludGVyY2VwdGFyIGNsaWNzIGVuIHByb2R1Y3RvcyBwYXJhIGd1YXJkYXIgZXN0YWRvXHJcbiAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVyID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAvLyBCdXNjYXIgc2kgZWwgY2xpYyBlcyBlbiB1biBlbmxhY2UgYSBwcm9kdWN0b1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IHRhcmdldC5jbG9zZXN0KCdhW2hyZWYqPVwiL3Byb2R1Y3QvXCJdJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobGluayAmJiB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfjq8gQ2xpYyBlbiBwcm9kdWN0byBkZXRlY3RhZG8sIGd1YXJkYW5kbyBlc3RhZG8nKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50U3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAvLyBHdWFyZGFyIGR1cmFudGUgc2Nyb2xsIGVuIGxhIHDDoWdpbmEgZGUgY29sZWNjacOzblxyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsVGltZXI6IGFueTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSBlc3RhbW9zIGVuIHVuYSBww6FnaW5hIGRlIGNvbGVjY2nDs25cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zYXZlQ3VycmVudFN0YXRlKCksIDMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gR3VhcmRhciBhbnRlcyBkZSBxdWUgZWwgdXN1YXJpbyBzYWxnYSBkZSBsYSBww6FnaW5hXHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvY29sbGVjdGlvbi8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUN1cnJlbnRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlQ3VycmVudFN0YXRlKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHRoaXMucHJvZHVjdHMgJiYgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgcG9zaWNpw7NuIGRlIHNjcm9sbCBkZSBtw7psdGlwbGVzIGZ1ZW50ZXNcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSB0ZW5lbW9zIHVuYSBwb3NpY2nDs24gc2lnbmlmaWNhdGl2YSBvIHByb2R1Y3RvcyBzdWZpY2llbnRlc1xyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsUG9zID4gMTAgfHwgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAxMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGU6IENvbGxlY3Rpb25TdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0czogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBzY3JvbGxQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuZmluaXNoZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZzogdGhpcy5sb2FkaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IE1hdGguY2VpbCh0aGlzLnByb2R1Y3RzLmxlbmd0aCAvIDEwKSxcclxuICAgICAgICAgICAgICAgICAgICBhbGxDYWNoZWRQcm9kdWN0czogdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID8gWy4uLnRoaXMuYWxsQ2FjaGVkUHJvZHVjdHNdIDogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyA/IFsuLi50aGlzLmZpbHRlcnNdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnNfdG9wOiB0aGlzLmZpbHRlcnNfdG9wID8gWy4uLnRoaXMuZmlsdGVyc190b3BdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYiA/IFsuLi50aGlzLmJyZWFkY3J1bWJdIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLnNldCh0aGlzLnN0YXRlS2V5LCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFRhbWJpw6luIGd1YXJkYXIgZW4gc2Vzc2lvblN0b3JhZ2UgY29tbyBiYWNrdXBcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgY29sbGVjdGlvbl9zY3JvbGxfJHt0aGlzLnN0YXRlS2V5fWAsIHNjcm9sbFBvcy50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBjb2xsZWN0aW9uX3Byb2R1Y3RzXyR7dGhpcy5zdGF0ZUtleX1gLCB0aGlzLnByb2R1Y3RzLmxlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zaXRpb246IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIHRhcmdldCBlcyBtYXlvciBxdWUgbGEgYWx0dXJhIGRlbCBkb2N1bWVudG9cclxuICAgICAgICBjb25zdCBkb2N1bWVudEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHRhcmdldFBvc2l0aW9uID4gZG9jdW1lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBNYXRoLm1heCgwLCBkb2N1bWVudEhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGVsIHVzdWFyaW8gaGEgaGVjaG8gc2Nyb2xsIG11eSBsZWpvc1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICBpZiAoY3VycmVudFBvcyA+IDUwMCAmJiBNYXRoLmFicyhjdXJyZW50UG9zIC0gdGFyZ2V0UG9zaXRpb24pID4gMTAwMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEludGVudGFyIGVuY29udHJhciB1bmEgcG9zaWNpw7NuIG3DoXMgcHJlY2lzYSBiYXNhZGEgZW4gZWxlbWVudG9zIGRlbCBET01cclxuICAgICAgICBjb25zdCBpbXByb3ZlZFBvc2l0aW9uID0gdGhpcy50cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICBpZiAoaW1wcm92ZWRQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbXByb3ZlZFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdHJ5U2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBhdHRlbXB0cysrO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBzY3JvbGwgbcOhcyBhZ3Jlc2l2byBzaSBlcyBuZWNlc2FyaW9cclxuICAgICAgICAgICAgaWYgKGF0dGVtcHRzIDwgMykge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJpbWVyb3MgaW50ZW50b3MgY29uIHNtb290aFxyXG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHRhcmdldFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlbnRvcyBwb3N0ZXJpb3JlcyBtw6FzIGRpcmVjdG9zXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgdGFyZ2V0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSB0YXJnZXRQb3NpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIGRlc3B1w6lzIGRlIHVuIG1vbWVudG9cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoY3VycmVudFBvcyAtIHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiA1MCAmJiBhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBhdHRlbXB0cyA8IDUgPyAxMDAgOiBhdHRlbXB0cyA8IDEwID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodHJ5U2Nyb2xsLCBkZWxheSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsgLy8gTGliZXJhciBmbGFnIGN1YW5kbyB0ZXJtaW5lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJbnRlbnRhciBzb2xvIHVuYSB2ZXogaW5pY2lhbG1lbnRlXHJcbiAgICAgICAgdHJ5U2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJbnRlbnRhciBjYWxjdWxhciBhIHF1w6kgcHJvZHVjdG8gY29ycmVzcG9uZGUgbGEgcG9zaWNpw7NuXHJcbiAgICAgICAgY29uc3QgYXBwcm94aW1hdGVJbmRleCA9IE1hdGguZmxvb3IodGFyZ2V0UG9zaXRpb24gLyA0MDApOyAvLyBBc3VtaWVuZG8gfjQwMHB4IHBvciBwcm9kdWN0b1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEJ1c2NhciBlbGVtZW50b3MgZGUgcHJvZHVjdG9cclxuICAgICAgICBjb25zdCBwcm9kdWN0RWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29sLWxnLTMsIC5jb2wtbWQtNCwgLmNvbC02LCBbY2xhc3MqPVwicHJvZHVjdFwiXSwgLnByb2R1Y3QtaXRlbSwgLmNhcmQnKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocHJvZHVjdEVsZW1lbnRzLmxlbmd0aCA+IGFwcHJveGltYXRlSW5kZXggJiYgYXBwcm94aW1hdGVJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBwcm9kdWN0RWxlbWVudHNbYXBwcm94aW1hdGVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IHRhcmdldEVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBsYSBwb3NpY2nDs24gZGVsIGVsZW1lbnRvIHNpIGVzIHJhem9uYWJsZVxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZWxlbWVudFBvc2l0aW9uIC0gdGFyZ2V0UG9zaXRpb24pIDwgODAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFBvc2l0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0YXJnZXRQb3NpdGlvbjsgLy8gVXNhciBwb3NpY2nDs24gb3JpZ2luYWwgc2kgbm8gZW5jdWVudHJhIGVsZW1lbnRvIGFkZWN1YWRvXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUHJvZHVjdFJlbmRlcmluZyh0YXJnZXRQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBlbCBzY3JvbGwgcGVuZGllbnRlIHBhcmEgcXVlIG5nQWZ0ZXJWaWV3Q2hlY2tlZCBsbyBtYW5lamVcclxuICAgICAgICB0aGlzLnBlbmRpbmdTY3JvbGxQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgIHRoaXMuZXhwZWN0ZWRQcm9kdWN0Q291bnQgPSB0aGlzLnByb2R1Y3RzPy5sZW5ndGggfHwgMDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUaW1lb3V0IGRlIHNlZ3VyaWRhZCBlbiBjYXNvIGRlIHF1ZSBuZ0FmdGVyVmlld0NoZWNrZWQgbm8gc2UgZWplY3V0ZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvcyA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTcOpdG9kbyBwZXJzb25hbGl6YWRvIHBhcmEgbWFuZWphciBzZWxlY2Npw7NuIGRlIGZpbHRyb3MgcXVlIGludmFsaWRhcsOhIGNhY2hlXHJcbiAgICBjdXN0b21TZXRGaWx0ZXJTZWxlY3RlZCA9IChmaWx0ZXIsIGZpbHRlckVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyBJbnZhbGlkYXIgY2FjaGUgY29tcGxldGFtZW50ZSBjdWFuZG8gc2Ugc2VsZWNjaW9uYSB1biBmaWx0cm9cclxuICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7IC8vIFlhIG5vIHVzYW1vcyBmaWx0cm9zIGRlbCBjYWNoZVxyXG4gICAgICAgIHRoaXMuaXNDYXRlZ29yeUNoYW5nZSA9IHRydWU7IC8vIE1hcmNhciBjb21vIGNhbWJpbyBwYXJhIHJlZW1wbGF6YXIgcHJvZHVjdG9zXHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIEZpbHRybyBzZWxlY2Npb25hZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbyBkZXNkZSBlbmRwb2ludCBwYXJhOicsIHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gbGltcGlhciBwcm9kdWN0b3MsIE5PIGxpbXBpYXIgZmlsdHJvcyBwYXJhIHF1ZSBubyBkZXNhcGFyZXpjYW5cclxuICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMbGFtYXIgYWwgbcOpdG9kbyBvcmlnaW5hbCBkZWwgUHJvZHVjdHNTZXJ2aWNlIHF1ZSBpbmljaWFyw6EgdW5hIGNhcmdhIGNvbXBsZXRhXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWN0c1NlcnZpY2Uuc2V0RmlsdGVyU2VsZWN0ZWQoZmlsdGVyLCBmaWx0ZXJFbGVtZW50KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMYSBzdXNjcmlwY2nDs24gcHJpbmNpcGFsIGF1dG9tw6F0aWNhbWVudGUgYWN0dWFsaXphcsOhIGxvcyBmaWx0cm9zXHJcbiAgICAgICAgLy8gcG9ycXVlIGZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZSB5IHVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxpR0FBaUc7QUFDakcsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBUTNFLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXNCLFNBQVEsZUFBZTtJQXNCdEQsWUFBbUIsZUFBZ0MsRUFDckMsU0FBNEIsRUFDNUIsV0FBMkIsRUFDM0IsY0FBOEIsRUFDakMsV0FBd0IsRUFDdkIsZ0JBQWtDLEVBQ25DLFdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2pCLGNBQThCO1FBQ3JDLEtBQUss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LENBQUM7U0FDeEI7SUFDTCxDQUFDO0NBd0JKLENBQUE7O1lBaEt1QyxlQUFlO1lBQzFCLGlCQUFpQjtZQUNmLGNBQWM7WUFDWCxjQUFjO1lBQ3BCLFdBQVc7WUFDTCxnQkFBZ0I7WUFDdEIsV0FBVztZQUNoQixTQUFTO1lBQ0QsY0FBYzs7QUFiaEM7SUFBUixLQUFLLEVBQUU7bURBQU07QUFDTDtJQUFSLEtBQUssRUFBRTtvREFBTztBQUNOO0lBQVIsS0FBSyxFQUFFO3dFQUE0QztBQUMzQztJQUFSLEtBQUssRUFBRTs2REFBd0M7QUFwQnZDLHFCQUFxQjtJQUxqQyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsbUJBQW1CO1FBQzdCLG1UQUE2Qzs7S0FFaEQsQ0FBQztHQUNXLHFCQUFxQixDQXNMakM7U0F0TFkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEZpbHRlckVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ZpbHRlcic7XHJcbi8vIGltcG9ydCB7IENvbnN0YW50cywgRmlsdGVyLCBPcHRpb25zU2VydmljZSwgUHJvZHVjdCwgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnbmctZWFzeWNvbW1lcmNlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZmlsdGVycy9GaWx0ZXInO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XHJcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckNvbmZpZywgRmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcclxuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XHJcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbHRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3B0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0cy5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLWNvbGxlY3Rpb24tZWMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbGxlY3Rpb24tZWMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29sbGVjdGlvbi1lYy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHB1YmxpYyBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGZpbHRlcnNfdG9wOiBGaWx0ZXJbXTtcclxuICAgIHByaXZhdGUgZGVmYXVsdEZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXTtcclxuICAgIHByaXZhdGUgZmlsdGVyc0NvbmZpZzogRmlsdGVyQ29uZmlnID0ge2ZpbHRlcnM6W119O1xyXG4gICAgLy8gcHVibGljIG9wdGlvbnNGaWx0ZXJzOiBbJ2FsbCddO1xyXG4gICAgcHVibGljIHByb2R1Y3RzOiBQcm9kdWN0W107XHJcbiAgICBwdWJsaWMgZmluaXNoZWQgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBzdXNjcmlwY2lvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xyXG4gICAgcHVibGljIGJyZWFkY3J1bWI6IHN0cmluZ1tdID0gW11cclxuICAgIHB1YmxpYyBpc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgcHVibGljIHBhcmFtczogYW55O1xyXG5cclxuICAgIHB1YmxpYyBmaWx0ZXJJblZpZXc6RmlsdGVyRWxlbWVudDtcclxuXHJcbiAgICBASW5wdXQoKSB0eXBlO1xyXG4gICAgQElucHV0KCkgdmFsdWU7XHJcbiAgICBASW5wdXQoKSBwcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBvcHRpb25zRmlsdGVyczogRmlsdGVyVHlwZVtdID0gWydhbGwnXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvZHVjdHNTZXJ2aWNlOiBQcm9kdWN0c1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIHBhcmFtc1NydjogUGFyYW1ldGVyc1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIGFjdGl2ZVJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcm90ZWN0ZWQgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxyXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJzU2VydmljZTogRmlsdGVyc1NlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFyYW1zU3J2LnBhcmFtZXRlcnMuc3Vic2NyaWJlKHBhcmFtID0+IHRoaXMucGFyYW1zID0gcGFyYW0pXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IHRoaXMuY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcclxuICAgICAgICB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyA9IHRoaXMuY29uc3RzLmdldEZpbHRlckNvbmZpZygpXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVyc0luVmlldyQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5maWx0ZXJJblZpZXcgPSByZXMpXHJcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApO1xyXG4gICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmVjT25Jbml0KClcclxuICAgICAgICB0aGlzLmdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtcywgdGhpcy5vcHRpb25zU2VydmljZS5yZWFkeSwgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc10pLnN1YnNjcmliZSgoW3BhcmFtcywgcmVhZHksIHF1ZXJ5UGFyYW1zXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhZHkucmVhZHlBbGwpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjYW1iaW8gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmICghcGFyYW1zWyd0eXBlJ10gfHwgIXBhcmFtc1sndmFsdWUnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgbGF0ZXN0OiB0cnVlLCBsaW1pdDogMTAgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCB0aGlzLmRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgdHlwZTogcGFyYW1zLnR5cGUsIHZhbHVlOiBwYXJhbXMudmFsdWUgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCAgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBwYXJhbXNbJ3R5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyYW1zWyd2YWx1ZSddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5zdXNjcmlwY2lvbi51bnN1YnNjcmliZSgpOyB9IGNhdGNoIChlKSB7IH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1c2NyaXBjaW9uID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UucHJvZHVjdHMkLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KHJlcywgdGhpcy5nZXRPYmplY3RXaXRoVmFyaWFudCgpICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KHJlcywgdGhpcy5nZXRPYmplY3RXaXRoVmFyaWFudCgpICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi5yZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykgeyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHJlczsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi5yZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW1fbGlzdCcsIHsgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsIGl0ZW1fbGlzdF9uYW1lOiAnQ29sbGVjdGlvbicsIGl0ZW1fbGlzdF9pZDogMCB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVycyQuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXRCcmVhZGNydW1iQnlGaWx0ZXJzKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gdGhpcy5nZXRTcGVjaWZpY0ZpbHRlcnMocmVzLCB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzX3RvcCA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgWydzb3J0J10pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maW5pc2hlZCgpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5maW5pc2hlZCA9IHJlcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVhbGl6YSB1biBzb3J0IGRlIHByb2R1Y3RvcyBwb3IgZWwgY2FtcG8gZGF0ZUNyZWF0ZSBkZSBsYSB2YXJpYW50ZVxyXG4gICAgICogQHBhcmFtIGEgUHJvZHVjdG8gYVxyXG4gICAgICogQHBhcmFtIGIgUHJvZHVjdG8gYlxyXG4gICAgICogQHBhcmFtIHR5cGUgc2kgZXMgYGFzY2AgfCBgZGVzY2BcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9ICoqMSoqIHBhcmEgYHRydWVgIHwgKiowKiogcGFyYSBgZmFsc2VgXHJcbiAgICAgKi9cclxuICAgIHNvcnRQcm9kdWN0cyA9IChhOmFueSwgYjphbnksIHR5cGU6c3RyaW5nPSdhc2MnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQSA9IGEudmFyaWFudHMgJiYgYS52YXJpYW50cy5sZW5ndGggPiAwID8gYS52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQiA9IGIudmFyaWFudHMgJiYgYi52YXJpYW50cy5sZW5ndGggPiAwID8gYi52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYodG9Db21wYXJlQSAmJiB0b0NvbXBhcmVCKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlQSA9IG5ldyBEYXRlKHRvQ29tcGFyZUEpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUIgPSBuZXcgRGF0ZSh0b0NvbXBhcmVCKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOiByZXR1cm4gKGRhdGVBID49IGRhdGVCKSA/IDEgOiAwOyBicmVha1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYXNjJzogcmV0dXJuIChkYXRlQSA8PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYXBsaWNhIGVsIGZpbHRybyBlbiBsYSB2aXN0YS4gXHJcbiAgICAgKi9cclxuICAgIGFwcGx5RmlsdGVyc0luVmlldyA9ICgpID0+IHtcclxuICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluVmlldz8ubm9VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHMuc29ydCgoYSwgYikgPT4gdGhpcy5zb3J0UHJvZHVjdHMoYSxiLHRoaXMuZmlsdGVySW5WaWV3LnZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID1mYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyW10sIHR5cGVzOiBGaWx0ZXJUeXBlW10pOiBGaWx0ZXJbXSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRfZmlsdGVyID0gZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IHR5cGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0X2ZpbHRlcikgcmVzdWx0LnB1c2gocmVzdWx0X2ZpbHRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvblNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCkgJiYgIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldE5leHQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFyZVByb2R1Y3RzID0gKCkgPT4gdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwO1xyXG4gICAgaXNXYWl0aW5nID0gKCkgPT4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCk7XHJcbiAgICBzZXRGaW5pc2hlZCA9ICgpID0+IHRoaXMuZmluaXNoZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICBjaGFuZ2VGaWx0ZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGxQcm9kdWN0b3NUb0NhcnQgPSAocHJvZHVjdHMgPSBudWxsKSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcbiAgICAgICAgKHByb2R1Y3RzIHx8IHRoaXMucHJvZHVjdHMpLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50Lm1hcChwID0+IGl0ZW1zLnB1c2gocCkpKVxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSkubWFwKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSApXHJcbiAgICAgICAgaXRlbXM/Lmxlbmd0aCAmJiB0aGlzLmNhcnRTZXJ2aWNlLmFkZEFsbFRvQ2FydChpdGVtcylcclxuICAgIH1cclxuXHJcbiAgICBnZXRPYmplY3RXaXRoVmFyaWFudCA9ICgpOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9IFxyXG5cclxufVxyXG4iXX0=
|