@wavemaker/app-ng-runtime 11.14.1-1.6289 → 11.14.1-10.6348

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.
Files changed (67) hide show
  1. package/components/base/bundles/index.umd.js +86 -17
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
  3. package/components/base/esm2022/utils/widget-utils.mjs +3 -3
  4. package/components/base/esm2022/widgets/common/base/base.component.mjs +67 -7
  5. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -3
  6. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
  7. package/components/base/fesm2022/index.mjs +87 -18
  8. package/components/base/fesm2022/index.mjs.map +1 -1
  9. package/components/base/pipes/custom-pipes.d.ts +5 -5
  10. package/components/basic/label/bundles/index.umd.js +9 -1
  11. package/components/basic/label/esm2022/label.directive.mjs +10 -2
  12. package/components/basic/label/fesm2022/index.mjs +9 -1
  13. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  14. package/components/data/pagination/bundles/index.umd.js +4 -0
  15. package/components/data/pagination/esm2022/pagination.component.mjs +5 -1
  16. package/components/data/pagination/fesm2022/index.mjs +4 -0
  17. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  18. package/components/data/table/bundles/index.umd.js +371 -15
  19. package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
  20. package/components/data/table/esm2022/table-column/table-column.directive.mjs +107 -3
  21. package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
  22. package/components/data/table/esm2022/table-cud.directive.mjs +8 -2
  23. package/components/data/table/esm2022/table-filter.directive.mjs +12 -2
  24. package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
  25. package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
  26. package/components/data/table/esm2022/table.component.mjs +219 -12
  27. package/components/data/table/fesm2022/index.mjs +371 -15
  28. package/components/data/table/fesm2022/index.mjs.map +1 -1
  29. package/components/data/table/table-action/table-action.directive.d.ts +3 -2
  30. package/components/data/table/table-column/table-column.directive.d.ts +3 -2
  31. package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
  32. package/components/data/table/table-cud.directive.d.ts +3 -1
  33. package/components/data/table/table-filter.directive.d.ts +3 -1
  34. package/components/data/table/table-row/table-row.directive.d.ts +3 -2
  35. package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
  36. package/components/data/table/table.component.d.ts +6 -2
  37. package/components/navigation/menu/bundles/index.umd.js +5 -0
  38. package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
  39. package/components/navigation/menu/fesm2022/index.mjs +5 -0
  40. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  41. package/components/navigation/popover/bundles/index.umd.js +6 -6
  42. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  43. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  44. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  45. package/components/navigation/popover/popover.component.d.ts +6 -0
  46. package/core/bundles/index.umd.js +411 -82
  47. package/core/esm2022/public_api.mjs +3 -3
  48. package/core/esm2022/utils/utils.mjs +6 -2
  49. package/core/esm2022/utils/watcher.mjs +402 -81
  50. package/core/fesm2022/index.mjs +410 -84
  51. package/core/fesm2022/index.mjs.map +1 -1
  52. package/core/public_api.d.ts +2 -2
  53. package/core/utils/utils.d.ts +1 -0
  54. package/core/utils/watcher.d.ts +28 -5
  55. package/npm-shrinkwrap.json +2 -2
  56. package/package-lock.json +2 -2
  57. package/package.json +1 -1
  58. package/runtime/base/bundles/index.umd.js +22 -2
  59. package/runtime/base/esm2022/components/app-component/app.component.mjs +4 -2
  60. package/runtime/base/esm2022/components/base-page.component.mjs +6 -2
  61. package/runtime/base/esm2022/components/base-partial.component.mjs +7 -2
  62. package/runtime/base/esm2022/components/base-prefab.component.mjs +7 -2
  63. package/runtime/base/esm2022/components/base-spa-page.component.mjs +6 -2
  64. package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
  65. package/runtime/base/fesm2022/index.mjs +23 -3
  66. package/runtime/base/fesm2022/index.mjs.map +1 -1
  67. package/scripts/datatable/datatable.js +101 -15
@@ -1450,11 +1450,11 @@
1450
1450
  }
1451
1451
  };
1452
1452
 
1453
- const $RAF$1 = window.requestAnimationFrame;
1453
+ const $RAF = window.requestAnimationFrame;
1454
1454
  const $RAFQueue = [];
1455
1455
  const invokeLater = fn => {
1456
1456
  if (!$RAFQueue.length) {
1457
- $RAF$1(() => {
1457
+ $RAF(() => {
1458
1458
  $RAFQueue.forEach(f => f());
1459
1459
  $RAFQueue.length = 0;
1460
1460
  });
@@ -2191,14 +2191,99 @@
2191
2191
  return fnExecutor(expr, ExpressionType.Action);
2192
2192
  };
2193
2193
 
2194
+ // Constants
2195
+ const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
2196
+ const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
2197
+ const ARRAY_INDEX_PLACEHOLDER = '[$i]';
2198
+ const ARRAY_INDEX_ZERO = '[0]';
2199
+ const DEBOUNCE_WAIT = 100;
2200
+ const MAX_WATCH_CYCLES = 5;
2194
2201
  const registry = new Map();
2195
2202
  const watchIdGenerator = new IDGenerator('watch-id-');
2196
- const FIRST_TIME_WATCH = {};
2197
- Object.freeze(FIRST_TIME_WATCH);
2198
- const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
2203
+ const FIRST_TIME_WATCH = Object.freeze({});
2204
+ // State
2199
2205
  let muted = false;
2206
+ let changedByWatch = false;
2207
+ let skipWatchers = false;
2208
+ let ngZone;
2200
2209
  let appRef;
2201
- const debounce = (fn, wait = 50) => {
2210
+ /********************************************************************
2211
+ * CLEANUP SCHEDULER WITH:
2212
+ * - Significant watcher delta trigger (+/-)
2213
+ * - UI stabilization delay (1–2 seconds)
2214
+ * - Cooldown to prevent repeated scheduling
2215
+ ********************************************************************/
2216
+ const CLEANUP_TRIGGER_DELTA = 300; // watcher change threshold
2217
+ const CLEANUP_DELAY = 1500; // delay before running cleanup
2218
+ const CLEANUP_COOLDOWN = 4000; // prevent re-scheduling for 4s
2219
+ let lastWatcherCount = 0;
2220
+ let scheduledCleanup = null;
2221
+ let lastScheduledTime = 0;
2222
+ function getWatcherCount() {
2223
+ let count = 0;
2224
+ registry.forEach((value) => {
2225
+ // Check if it's a grouped structure (widget groups) or a direct watchInfo
2226
+ if (value && typeof value === 'object' && !value.fn) {
2227
+ // It's a widget group - count the properties (excluding metadata)
2228
+ count += Object.keys(value).filter(k => k !== 'scopeType' && k !== 'scopeName').length;
2229
+ }
2230
+ else {
2231
+ // It's a direct watchInfo
2232
+ count += 1;
2233
+ }
2234
+ });
2235
+ return count;
2236
+ }
2237
+ const cleanupStaleWatchers = () => {
2238
+ // console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
2239
+ let removed = 0;
2240
+ registry.forEach((bucket, widgetId) => {
2241
+ if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
2242
+ for (const key in bucket) {
2243
+ if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
2244
+ let watchInfo = bucket[key];
2245
+ if (watchInfo && watchInfo.destroyFn) {
2246
+ watchInfo.destroyFn();
2247
+ }
2248
+ }
2249
+ }
2250
+ removed++;
2251
+ registry.delete(widgetId);
2252
+ return;
2253
+ }
2254
+ });
2255
+ return removed;
2256
+ };
2257
+ const scheduleThresholdCleanup = () => {
2258
+ const now = performance.now();
2259
+ let lastTriggerPeriod = now - lastScheduledTime;
2260
+ // If a cleanup was scheduled recently, skip scheduling
2261
+ if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
2262
+ return;
2263
+ }
2264
+ const current = getWatcherCount();
2265
+ const delta = Math.abs(current - lastWatcherCount); // significant + or -
2266
+ // If change not large enough, skip scheduling
2267
+ if (delta <= CLEANUP_TRIGGER_DELTA) {
2268
+ lastWatcherCount = current;
2269
+ return;
2270
+ }
2271
+ // Prevent re-scheduling: set timestamp early
2272
+ lastScheduledTime = now;
2273
+ // Clear previous scheduled cleanup (if any)
2274
+ if (scheduledCleanup) {
2275
+ clearTimeout(scheduledCleanup);
2276
+ }
2277
+ // Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
2278
+ scheduledCleanup = setTimeout(() => {
2279
+ cleanupStaleWatchers();
2280
+ scheduledCleanup = null;
2281
+ }, CLEANUP_DELAY);
2282
+ lastWatcherCount = current;
2283
+ };
2284
+ // Utility functions
2285
+ const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
2286
+ const debounce = (fn, wait = DEBOUNCE_WAIT) => {
2202
2287
  let timeout;
2203
2288
  return (...args) => {
2204
2289
  window['__zone_symbol__clearTimeout'](timeout);
@@ -2212,115 +2297,350 @@
2212
2297
  muted = false;
2213
2298
  triggerWatchers();
2214
2299
  };
2300
+ /**
2301
+ * Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
2302
+ */
2303
+ const getWidgetId = (identifier) => {
2304
+ if (!identifier || typeof identifier !== 'string') {
2305
+ return null;
2306
+ }
2307
+ const match = identifier.match(WIDGET_ID_REGEX);
2308
+ return match ? match[1] : null;
2309
+ };
2310
+ /**
2311
+ * Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
2312
+ */
2313
+ const getPropertyName = (identifier) => {
2314
+ if (!identifier || typeof identifier !== 'string') {
2315
+ return identifier;
2316
+ }
2317
+ const match = identifier.match(WIDGET_PROPERTY_REGEX);
2318
+ return match ? match[1] : identifier;
2319
+ };
2320
+ /**
2321
+ * Array consumer wrapper for array-based expressions
2322
+ */
2215
2323
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
2216
- let data = newVal, formattedData;
2217
- if (lodashEs.isArray(data)) {
2218
- formattedData = data.map(function (datum) {
2219
- return findValueOf(datum, restExpr);
2220
- });
2221
- // If resulting structure is an array of array, flatten it
2222
- if (lodashEs.isArray(formattedData[0])) {
2223
- formattedData = lodashEs.flatten(formattedData);
2224
- }
2225
- listenerFn(formattedData, oldVal);
2324
+ if (!lodashEs.isArray(newVal)) {
2325
+ return;
2226
2326
  }
2327
+ let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
2328
+ // Flatten if result is array of arrays
2329
+ if (lodashEs.isArray(formattedData[0])) {
2330
+ formattedData = lodashEs.flatten(formattedData);
2331
+ }
2332
+ listenerFn(formattedData, oldVal);
2227
2333
  };
2228
- const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
2229
- // listener doesn't accept array
2230
- // replace all `[$i]` with `[0]` and return the expression
2231
- let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
2334
+ /**
2335
+ * Updates watch info for array expressions
2336
+ */
2337
+ const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
2338
+ const regex = /\[\$i\]/g;
2232
2339
  if (!acceptsArray) {
2233
2340
  return {
2234
- 'expr': expr.replace(regex, $0),
2235
- 'listener': listener
2341
+ expr: expr.replace(regex, ARRAY_INDEX_ZERO),
2342
+ listener
2236
2343
  };
2237
2344
  }
2238
- // listener accepts array
2239
- // replace all except the last `[$i]` with `[0]` and return the expression.
2240
- var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
2241
- if (restExpr) {
2242
- arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
2243
- }
2345
+ const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
2346
+ const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
2347
+ const restExpr = expr.substring(lastIndex + 5);
2348
+ const arrayConsumerFn = restExpr
2349
+ ? arrayConsumer.bind(undefined, listener, restExpr)
2350
+ : listener;
2244
2351
  return {
2245
- 'expr': _expr,
2246
- 'listener': arrayConsumerFn
2352
+ expr: baseExpr,
2353
+ listener: arrayConsumerFn
2247
2354
  };
2248
2355
  };
2356
+ /**
2357
+ * Determines if an expression is static (doesn't need to be watched)
2358
+ */
2359
+ const STATIC_EXPRESSION_NAMES = [
2360
+ "row.getProperty('investment')",
2361
+ "row.getProperty('factsheetLink')",
2362
+ "row.getProperty('isRebalanceEligible')"
2363
+ ];
2364
+ const isStaticExpression = (expr) => {
2365
+ if (typeof expr !== 'string') {
2366
+ return false;
2367
+ }
2368
+ const trimmedExpr = expr.trim();
2369
+ // Expressions that always evaluate to localization strings
2370
+ // if (trimmedExpr.includes('appLocale')) {
2371
+ // return true;
2372
+ // }
2373
+ // Hard-coded static expression names
2374
+ if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
2375
+ return true;
2376
+ }
2377
+ return false;
2378
+ };
2379
+ /**
2380
+ * Gets the scope type from the scope object
2381
+ */
2382
+ const getScopeType = ($scope) => {
2383
+ if (!$scope) {
2384
+ return null;
2385
+ }
2386
+ if ($scope.pageName)
2387
+ return 'Page';
2388
+ if ($scope.prefabName)
2389
+ return 'Prefab';
2390
+ if ($scope.partialName)
2391
+ return 'Partial';
2392
+ // Check for App scope
2393
+ if ($scope.Variables !== undefined &&
2394
+ $scope.Actions !== undefined &&
2395
+ !$scope.pageName &&
2396
+ !$scope.prefabName &&
2397
+ !$scope.partialName) {
2398
+ return 'App';
2399
+ }
2400
+ if ($scope.constructor?.name === 'AppRef') {
2401
+ return 'App';
2402
+ }
2403
+ return null;
2404
+ };
2405
+ /**
2406
+ * Gets scope name based on scope type
2407
+ */
2408
+ const getScopeName = ($scope, scopeType) => {
2409
+ if (!scopeType || !$scope) {
2410
+ return null;
2411
+ }
2412
+ switch (scopeType) {
2413
+ case 'Prefab': return $scope.prefabName || null;
2414
+ case 'Partial': return $scope.partialName || null;
2415
+ case 'Page': return $scope.pageName || null;
2416
+ default: return null;
2417
+ }
2418
+ };
2419
+ /**
2420
+ * Main watch function
2421
+ */
2249
2422
  const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
2250
- if (expr.indexOf('[$i]') !== -1) {
2251
- let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
2423
+ // Handle array expressions
2424
+ if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
2425
+ const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
2252
2426
  expr = watchInfo.expr;
2253
2427
  listener = watchInfo.listener;
2254
2428
  }
2429
+ // Handle static expressions
2430
+ if (isStaticExpression(expr)) {
2431
+ try {
2432
+ const fn = $parseExpr(expr);
2433
+ const staticValue = fn($scope, $locals);
2434
+ listener(staticValue, FIRST_TIME_WATCH);
2435
+ }
2436
+ catch (e) {
2437
+ console.warn(`Error evaluating static expression '${expr}':`, e);
2438
+ listener(undefined, FIRST_TIME_WATCH);
2439
+ }
2440
+ return () => { }; // No-op unsubscribe
2441
+ }
2255
2442
  const fn = $parseExpr(expr);
2256
- registry.set(identifier, {
2257
- fn: fn.bind(expr, $scope, $locals),
2443
+ const scopeType = getScopeType($scope);
2444
+ const scopeName = getScopeName($scope, scopeType);
2445
+ const destroyFn = () => $unwatch(identifier);
2446
+ const watchInfo = {
2447
+ fn: fn.bind(null, $scope, $locals),
2258
2448
  listener,
2259
2449
  expr,
2260
2450
  last: FIRST_TIME_WATCH,
2261
2451
  doNotClone,
2262
- isMuted: isMuted
2452
+ isMuted,
2453
+ scopeType,
2454
+ scopeName,
2455
+ destroyFn
2456
+ };
2457
+ // Store in registry
2458
+ const widgetId = getWidgetId(identifier);
2459
+ if (widgetId) {
2460
+ const propertyName = getPropertyName(identifier);
2461
+ if (!registry.has(widgetId)) {
2462
+ registry.set(widgetId, {});
2463
+ }
2464
+ const widgetGroup = registry.get(widgetId);
2465
+ widgetGroup[propertyName] = watchInfo;
2466
+ }
2467
+ else {
2468
+ registry.set(identifier, watchInfo);
2469
+ }
2470
+ return destroyFn;
2471
+ };
2472
+ /**
2473
+ * Unwatches a single identifier
2474
+ */
2475
+ const $unwatch = (identifier) => {
2476
+ const widgetId = getWidgetId(identifier);
2477
+ if (widgetId) {
2478
+ const propertyName = getPropertyName(identifier);
2479
+ const widgetGroup = registry.get(widgetId);
2480
+ //@ts-ignore
2481
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2482
+ const watchInfo = widgetGroup[propertyName];
2483
+ if (watchInfo) {
2484
+ delete widgetGroup[propertyName];
2485
+ // Clean up empty widget groups
2486
+ if (Object.keys(widgetGroup).length === 0) {
2487
+ registry.delete(widgetId);
2488
+ }
2489
+ return true;
2490
+ }
2491
+ }
2492
+ }
2493
+ // Fallback to direct lookup
2494
+ if (registry.has(identifier)) {
2495
+ registry.delete(identifier);
2496
+ return true;
2497
+ }
2498
+ return false;
2499
+ };
2500
+ /**
2501
+ * Unwatches all watchers for a specific widget ID
2502
+ */
2503
+ const $unwatchAll = (widgetId) => {
2504
+ if (!widgetId || typeof widgetId !== 'string') {
2505
+ return 0;
2506
+ }
2507
+ const widgetGroup = registry.get(widgetId);
2508
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2509
+ const count = Object.keys(widgetGroup).length;
2510
+ registry.delete(widgetId);
2511
+ return count;
2512
+ }
2513
+ // Fallback: find all identifiers starting with this widget ID
2514
+ let removedCount = 0;
2515
+ const identifiersToRemove = [];
2516
+ registry.forEach((_, key) => {
2517
+ if (key.startsWith(widgetId + '_')) {
2518
+ identifiersToRemove.push(key);
2519
+ }
2520
+ });
2521
+ identifiersToRemove.forEach(identifier => {
2522
+ if ($unwatch(identifier)) {
2523
+ removedCount++;
2524
+ }
2263
2525
  });
2264
- return () => $unwatch(identifier);
2526
+ return removedCount;
2265
2527
  };
2266
- const $unwatch = identifier => registry.delete(identifier);
2267
- let changedByWatch = false;
2268
- const $RAF = window.requestAnimationFrame;
2269
- let ngZone;
2270
- const triggerWatchers = (ignoreMuted) => {
2528
+ /**
2529
+ * Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
2530
+ * Now works directly with the main registry instead of separate scoped registries
2531
+ */
2532
+ const $unwatchAllByScope = (scopeType, scopeName) => {
2533
+ if (!scopeType) {
2534
+ return 0;
2535
+ }
2536
+ let removedCount = 0;
2537
+ const identifiersToRemove = [];
2538
+ registry.forEach((value, key) => {
2539
+ // Handle grouped structure (widget groups)
2540
+ if (value && typeof value === 'object' && !value.fn) {
2541
+ Object.entries(value).forEach(([propertyName, watchInfo]) => {
2542
+ if (watchInfo?.scopeType === scopeType &&
2543
+ (!scopeName || watchInfo.scopeName === scopeName)) {
2544
+ identifiersToRemove.push(`${key}_${propertyName}`);
2545
+ }
2546
+ });
2547
+ }
2548
+ else {
2549
+ // Direct watchInfo
2550
+ const watchInfo = value;
2551
+ if (watchInfo?.scopeType === scopeType &&
2552
+ (!scopeName || watchInfo.scopeName === scopeName)) {
2553
+ identifiersToRemove.push(key);
2554
+ }
2555
+ }
2556
+ });
2557
+ // Unwatch all collected identifiers
2558
+ identifiersToRemove.forEach(identifier => {
2559
+ if ($unwatch(identifier)) {
2560
+ removedCount++;
2561
+ }
2562
+ });
2563
+ return removedCount;
2564
+ };
2565
+ /**
2566
+ * Processes a single watch info during trigger cycle
2567
+ */
2568
+ const processWatchInfo = (watchInfo) => {
2569
+ if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
2570
+ return false;
2571
+ }
2572
+ let newValue;
2573
+ try {
2574
+ newValue = watchInfo.fn();
2575
+ }
2576
+ catch (e) {
2577
+ console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
2578
+ return false;
2579
+ }
2580
+ if (lodashEs.isEqual(newValue, watchInfo.last)) {
2581
+ return false;
2582
+ }
2583
+ // Change detected
2584
+ changedByWatch = true;
2585
+ watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
2586
+ ? lodashEs.clone(newValue)
2587
+ : newValue;
2588
+ watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
2589
+ changedByWatch = false;
2590
+ return true;
2591
+ };
2592
+ /**
2593
+ * Triggers all watchers
2594
+ */
2595
+ const triggerWatchers = (ignoreMuted = false) => {
2271
2596
  if (muted && !ignoreMuted) {
2272
2597
  return;
2273
2598
  }
2274
- const limit = 5;
2275
2599
  let pass = 1;
2276
2600
  let changeDetected;
2277
2601
  do {
2278
2602
  changeDetected = false;
2279
- registry.forEach(watchInfo => {
2280
- if (watchInfo.isMuted && watchInfo.isMuted()) {
2281
- return;
2282
- }
2283
- const fn = watchInfo.fn;
2284
- const listener = watchInfo.listener;
2285
- const ov = watchInfo.last;
2286
- let nv;
2287
- try {
2288
- nv = fn();
2289
- }
2290
- catch (e) {
2291
- console.warn(`error in executing expression: '${watchInfo.expr}'`);
2603
+ registry.forEach((value) => {
2604
+ // Handle grouped structure
2605
+ if (value && typeof value === 'object' && !value.fn) {
2606
+ Object.values(value).forEach((watchInfo) => {
2607
+ if (processWatchInfo(watchInfo)) {
2608
+ changeDetected = true;
2609
+ }
2610
+ });
2292
2611
  }
2293
- if (!lodashEs.isEqual(nv, ov)) {
2294
- changeDetected = true;
2295
- changedByWatch = true;
2296
- watchInfo.last = nv;
2297
- // @ts-ignore
2298
- if (lodashEs.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2299
- watchInfo.last = lodashEs.clone(nv);
2612
+ else {
2613
+ // Direct watchInfo
2614
+ if (processWatchInfo(value)) {
2615
+ changeDetected = true;
2300
2616
  }
2301
- listener(nv, ov);
2302
- resetChangeFromWatch();
2303
2617
  }
2304
2618
  });
2305
2619
  pass++;
2306
- } while (changeDetected && pass < limit);
2307
- if (changeDetected && pass === limit) {
2308
- console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
2620
+ } while (changeDetected && pass < MAX_WATCH_CYCLES);
2621
+ // Schedule cleanup after watchers are triggered
2622
+ scheduleThresholdCleanup();
2623
+ if (changeDetected && pass === MAX_WATCH_CYCLES) {
2624
+ console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
2309
2625
  }
2310
2626
  };
2311
- const setNgZone = zone => ngZone = zone;
2312
- const setAppRef = ref => {
2627
+ // Angular zone integration
2628
+ const setNgZone = (zone) => {
2629
+ ngZone = zone;
2630
+ };
2631
+ const setAppRef = (ref) => {
2313
2632
  appRef = ref;
2314
2633
  };
2315
2634
  const isChangeFromWatch = () => changedByWatch;
2316
- const resetChangeFromWatch = () => changedByWatch = false;
2317
- window.watchRegistry = registry;
2318
- let skipWatchers;
2635
+ const resetChangeFromWatch = () => {
2636
+ changedByWatch = false;
2637
+ };
2638
+ // Debounced trigger
2319
2639
  const debouncedTriggerWatchers = debounce(() => {
2320
2640
  skipWatchers = true;
2321
2641
  ngZone.run(() => triggerWatchers());
2322
- }, 100);
2323
- const $invokeWatchers = (force, ignoreMuted) => {
2642
+ }, DEBOUNCE_WAIT);
2643
+ const $invokeWatchers = (force = false, ignoreMuted = false) => {
2324
2644
  if (force) {
2325
2645
  triggerWatchers(ignoreMuted);
2326
2646
  }
@@ -2334,7 +2654,8 @@
2334
2654
  };
2335
2655
  const $appDigest = (() => {
2336
2656
  let queued = false;
2337
- return (force) => {
2657
+ const $RAF = window.requestAnimationFrame;
2658
+ return (force = false) => {
2338
2659
  if (!appRef) {
2339
2660
  return;
2340
2661
  }
@@ -2346,16 +2667,16 @@
2346
2667
  if (queued) {
2347
2668
  return;
2348
2669
  }
2349
- else {
2350
- queued = true;
2351
- $RAF(() => {
2352
- ngZone.run(() => appRef.tick());
2353
- queued = false;
2354
- });
2355
- }
2670
+ queued = true;
2671
+ $RAF(() => {
2672
+ ngZone.run(() => appRef.tick());
2673
+ queued = false;
2674
+ });
2356
2675
  }
2357
2676
  };
2358
2677
  })();
2678
+ // Export registry for debugging
2679
+ window.watchRegistry = registry;
2359
2680
 
2360
2681
  exports.ComponentType = void 0;
2361
2682
  (function (ComponentType) {
@@ -2452,6 +2773,7 @@
2452
2773
  SUPPORTED_AUDIO_FORMAT: /\.(mp3|ogg|webm|wma|3gp|wav|m4a)$/i,
2453
2774
  SUPPORTED_VIDEO_FORMAT: /\.(mp4|ogg|webm|wmv|mpeg|mpg|avi|mov)$/i,
2454
2775
  VALID_WEB_URL: /^(http[s]?:\/\/)(www\.){0,1}[a-zA-Z0-9=:?\/\.\-]+(\.[a-zA-Z]{2,5}[\.]{0,1})?/,
2776
+ VALID_IMAGE_URL: /^(https?|blob|data|file|ftp):/i,
2455
2777
  REPLACE_PATTERN: /\$\{([^\}]+)\}/g,
2456
2778
  DATA_URL: /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i,
2457
2779
  ISO_DATE_FORMAT: /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\.\d+)?([+-]\d{2}:?\d{2}|Z)$/
@@ -2674,6 +2996,9 @@
2674
2996
  const isValidWebURL = (url) => {
2675
2997
  return (REGEX.VALID_WEB_URL).test(url);
2676
2998
  };
2999
+ const isValidImageUrl = (url) => {
3000
+ return (REGEX.VALID_IMAGE_URL).test(url?.trim());
3001
+ };
2677
3002
  /*This function returns the url to the resource after checking the validity of url*/
2678
3003
  const getResourceURL = (urlString) => {
2679
3004
  return urlString;
@@ -3927,6 +4252,7 @@
3927
4252
  isPageable: isPageable,
3928
4253
  isSafari: isSafari,
3929
4254
  isTablet: isTablet,
4255
+ isValidImageUrl: isValidImageUrl,
3930
4256
  isValidWebURL: isValidWebURL,
3931
4257
  isVideoFile: isVideoFile,
3932
4258
  loadScript: loadScript,
@@ -5159,6 +5485,8 @@
5159
5485
  exports.$parseEvent = $parseEvent;
5160
5486
  exports.$parseExpr = $parseExpr;
5161
5487
  exports.$unwatch = $unwatch;
5488
+ exports.$unwatchAll = $unwatchAll;
5489
+ exports.$unwatchAllByScope = $unwatchAllByScope;
5162
5490
  exports.$watch = $watch;
5163
5491
  exports.AbstractDialogService = AbstractDialogService;
5164
5492
  exports.AbstractHttpService = AbstractHttpService;
@@ -5282,6 +5610,7 @@
5282
5610
  exports.isObject = isObject;
5283
5611
  exports.isPageable = isPageable;
5284
5612
  exports.isSafari = isSafari;
5613
+ exports.isValidImageUrl = isValidImageUrl;
5285
5614
  exports.isValidWebURL = isValidWebURL;
5286
5615
  exports.isVideoFile = isVideoFile;
5287
5616
  exports.loadScript = loadScript;
@@ -7,8 +7,8 @@ export { appendNode, insertBefore, insertAfter, removeNode, removeClass, addClas
7
7
  export * from './enums/enums';
8
8
  export * from './utils/event-notifier';
9
9
  export { $parseExpr, $parseEvent, registerFnByExpr, setPipeProvider, getFnByExpr, getFnForBindExpr, getFnForEventExpr } from './utils/expression-parser';
10
- export { isDefined, isObject, toBoolean, isIE, isAndroid, isAndroidTablet, isIphone, isIpod, isIpad, isIos, isSafari, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, getAndroidVersion, isKitkatDevice, encodeUrl, encodeUrlParams, initCaps, spaceSeparate, replaceAt, periodSeparate, prettifyLabel, deHyphenate, prettifyLabels, isInsecureContentRequest, stringStartsWith, getEvaluatedExprValue, isImageFile, isAudioFile, isVideoFile, isValidWebURL, getResourceURL, triggerFn, hasOffsetStr, getFormattedDate, getDateObj, addEventListenerOnElement, getClonedObject, getFiles, generateGUId, validateAccessRoles, getValidJSON, xmlToJson, findValueOf, extractType, isNumberType, isEmptyObject, scrollToElement, isElementInViewport, isPageable, replace, isDateTimeType, getValidDateObject, getNativeDateObject, getBlob, isEqualWithFields, loadStyleSheet, loadStyleSheets, loadScript, loadScripts, _WM_APP_PROJECT, setSessionStorageItem, getSessionStorageItem, noop, convertToBlob, AppConstants, openLink, fetchContent, toPromise, retryIfFails, getAbortableDefer, createCSSRule, getUrlParams, getMomentLocaleObject, getRouteNameFromLink, isAppleProduct, defer, executePromiseChain, isDataSourceEqual, validateDataSourceCtx, processFilterExpBindNode, extendProto, removeExtraSlashes, getDisplayDateTimeFormat, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, setTranslation3dPosition, getWebkitTraslationMatrix, closePopover, detectChanges, triggerItemAction, getDatasourceFromExpr, extractCurrentItemExpr, findRootContainer, VALIDATOR, transformFileURI, appendScriptToHead, getAppSetting, setListClass, findParent, getNavClass, getSheetPositionClass } from './utils/utils';
11
- export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
10
+ export { isDefined, isObject, toBoolean, isIE, isAndroid, isAndroidTablet, isIphone, isIpod, isIpad, isIos, isSafari, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, getAndroidVersion, isKitkatDevice, encodeUrl, encodeUrlParams, initCaps, spaceSeparate, replaceAt, periodSeparate, prettifyLabel, deHyphenate, prettifyLabels, isInsecureContentRequest, stringStartsWith, getEvaluatedExprValue, isImageFile, isAudioFile, isVideoFile, isValidImageUrl, isValidWebURL, getResourceURL, triggerFn, hasOffsetStr, getFormattedDate, getDateObj, addEventListenerOnElement, getClonedObject, getFiles, generateGUId, validateAccessRoles, getValidJSON, xmlToJson, findValueOf, extractType, isNumberType, isEmptyObject, scrollToElement, isElementInViewport, isPageable, replace, isDateTimeType, getValidDateObject, getNativeDateObject, getBlob, isEqualWithFields, loadStyleSheet, loadStyleSheets, loadScript, loadScripts, _WM_APP_PROJECT, setSessionStorageItem, getSessionStorageItem, noop, convertToBlob, AppConstants, openLink, fetchContent, toPromise, retryIfFails, getAbortableDefer, createCSSRule, getUrlParams, getMomentLocaleObject, getRouteNameFromLink, isAppleProduct, defer, executePromiseChain, isDataSourceEqual, validateDataSourceCtx, processFilterExpBindNode, extendProto, removeExtraSlashes, getDisplayDateTimeFormat, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, setTranslation3dPosition, getWebkitTraslationMatrix, closePopover, detectChanges, triggerItemAction, getDatasourceFromExpr, extractCurrentItemExpr, findRootContainer, VALIDATOR, transformFileURI, appendScriptToHead, getAppSetting, setListClass, findParent, getNavClass, getSheetPositionClass } from './utils/utils';
11
+ export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, $unwatchAll, $unwatchAllByScope, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
12
12
  export * from './utils/id-generator';
13
13
  export * from './types/types';
14
14
  export { Viewport } from './services/viewport.service';
@@ -23,4 +23,4 @@ export { StatePersistence } from './services/state-persistence.service';
23
23
  export { PaginationService } from './services/pagination.service';
24
24
  export * from './utils/wm-project-properties';
25
25
  export * from './utils/lru-cache';
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixlQUFlLEVBQ2YsUUFBUSxFQUNSLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLFNBQVMsRUFDVCxXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixhQUFhLEVBQ2IsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsRUFDZixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLElBQUksRUFDSixhQUFhLEVBQ2IsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFlBQVksRUFDWixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLGFBQWEsRUFDYixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLHFCQUFxQixFQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsWUFBWSxFQUNaLGNBQWMsRUFDZCxNQUFNLEVBQ04sUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRXZWJVUkwsXG4gICAgZ2V0UmVzb3VyY2VVUkwsXG4gICAgdHJpZ2dlckZuLFxuICAgIGhhc09mZnNldFN0cixcbiAgICBnZXRGb3JtYXR0ZWREYXRlLFxuICAgIGdldERhdGVPYmosXG4gICAgYWRkRXZlbnRMaXN0ZW5lck9uRWxlbWVudCxcbiAgICBnZXRDbG9uZWRPYmplY3QsXG4gICAgZ2V0RmlsZXMsXG4gICAgZ2VuZXJhdGVHVUlkLFxuICAgIHZhbGlkYXRlQWNjZXNzUm9sZXMsXG4gICAgZ2V0VmFsaWRKU09OLFxuICAgIHhtbFRvSnNvbixcbiAgICBmaW5kVmFsdWVPZixcbiAgICBleHRyYWN0VHlwZSxcbiAgICBpc051bWJlclR5cGUsXG4gICAgaXNFbXB0eU9iamVjdCxcbiAgICBzY3JvbGxUb0VsZW1lbnQsXG4gICAgaXNFbGVtZW50SW5WaWV3cG9ydCxcbiAgICBpc1BhZ2VhYmxlLFxuICAgIHJlcGxhY2UsXG4gICAgaXNEYXRlVGltZVR5cGUsXG4gICAgZ2V0VmFsaWREYXRlT2JqZWN0LFxuICAgIGdldE5hdGl2ZURhdGVPYmplY3QsXG4gICAgZ2V0QmxvYixcbiAgICBpc0VxdWFsV2l0aEZpZWxkcyxcbiAgICBsb2FkU3R5bGVTaGVldCxcbiAgICBsb2FkU3R5bGVTaGVldHMsXG4gICAgbG9hZFNjcmlwdCxcbiAgICBsb2FkU2NyaXB0cyxcbiAgICBfV01fQVBQX1BST0pFQ1QsXG4gICAgc2V0U2Vzc2lvblN0b3JhZ2VJdGVtLFxuICAgIGdldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBub29wLFxuICAgIGNvbnZlcnRUb0Jsb2IsXG4gICAgQXBwQ29uc3RhbnRzLFxuICAgIG9wZW5MaW5rLFxuICAgIGZldGNoQ29udGVudCxcbiAgICB0b1Byb21pc2UsXG4gICAgcmV0cnlJZkZhaWxzLFxuICAgIGdldEFib3J0YWJsZURlZmVyLFxuICAgIGNyZWF0ZUNTU1J1bGUsXG4gICAgZ2V0VXJsUGFyYW1zLFxuICAgIGdldE1vbWVudExvY2FsZU9iamVjdCxcbiAgICBnZXRSb3V0ZU5hbWVGcm9tTGluayxcbiAgICBpc0FwcGxlUHJvZHVjdCxcbiAgICBkZWZlcixcbiAgICBleGVjdXRlUHJvbWlzZUNoYWluLFxuICAgIGlzRGF0YVNvdXJjZUVxdWFsLFxuICAgIHZhbGlkYXRlRGF0YVNvdXJjZUN0eCxcbiAgICBwcm9jZXNzRmlsdGVyRXhwQmluZE5vZGUsXG4gICAgZXh0ZW5kUHJvdG8sXG4gICAgcmVtb3ZlRXh0cmFTbGFzaGVzLFxuICAgIGdldERpc3BsYXlEYXRlVGltZUZvcm1hdCxcbiAgICBhZGRGb3JJZEF0dHJpYnV0ZXMsXG4gICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sXG4gICAgYWRqdXN0Q29udGFpbmVyUmlnaHRFZGdlcyxcbiAgICBzZXRUcmFuc2xhdGlvbjNkUG9zaXRpb24sXG4gICAgZ2V0V2Via2l0VHJhc2xhdGlvbk1hdHJpeCxcbiAgICBjbG9zZVBvcG92ZXIsXG4gICAgZGV0ZWN0Q2hhbmdlcyxcbiAgICB0cmlnZ2VySXRlbUFjdGlvbixcbiAgICBnZXREYXRhc291cmNlRnJvbUV4cHIsXG4gICAgZXh0cmFjdEN1cnJlbnRJdGVtRXhwcixcbiAgICBmaW5kUm9vdENvbnRhaW5lcixcbiAgICBWQUxJREFUT1IsXG4gICAgdHJhbnNmb3JtRmlsZVVSSSxcbiAgICBhcHBlbmRTY3JpcHRUb0hlYWQsXG4gICAgZ2V0QXBwU2V0dGluZyxcbiAgICBzZXRMaXN0Q2xhc3MsXG4gICAgZmluZFBhcmVudCxcbiAgICBnZXROYXZDbGFzcyxcbiAgICBnZXRTaGVldFBvc2l0aW9uQ2xhc3Ncbn0gZnJvbSAnLi91dGlscy91dGlscyc7XG5leHBvcnQge1xuICAgIEZJUlNUX1RJTUVfV0FUQ0gsXG4gICAgaXNGaXJzdFRpbWVDaGFuZ2UsXG4gICAgZGVib3VuY2UsXG4gICAgbXV0ZVdhdGNoZXJzLFxuICAgIHVuTXV0ZVdhdGNoZXJzLFxuICAgICR3YXRjaCxcbiAgICAkdW53YXRjaCxcbiAgICBzZXROZ1pvbmUsXG4gICAgc2V0QXBwUmVmLFxuICAgIGlzQ2hhbmdlRnJvbVdhdGNoLFxuICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoLFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICAkYXBwRGlnZXN0XG59IGZyb20gJy4vdXRpbHMvd2F0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2lkLWdlbmVyYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL3R5cGVzJztcbmV4cG9ydCB7IFZpZXdwb3J0LCBWaWV3cG9ydEV2ZW50IH0gZnJvbSAnLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvY29uc3RhbnQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL3V0aWxzLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9maWVsZC10eXBlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9maWVsZC13aWRnZXQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL3NjcmlwdC1sb2FkZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL3VzZXItY3VzdG9tLXBpcGUtbWFuYWdlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvY3VzdG9tLWljb25zLWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFN0YXRlUGVyc2lzdGVuY2UgfSBmcm9tICcuL3NlcnZpY2VzL3N0YXRlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuZXhwb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3dtLXByb2plY3QtcHJvcGVydGllcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2xydS1jYWNoZSc7XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRJbWFnZVVybCxcbiAgICBpc1ZhbGlkV2ViVVJMLFxuICAgIGdldFJlc291cmNlVVJMLFxuICAgIHRyaWdnZXJGbixcbiAgICBoYXNPZmZzZXRTdHIsXG4gICAgZ2V0Rm9ybWF0dGVkRGF0ZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdlbmVyYXRlR1VJZCxcbiAgICB2YWxpZGF0ZUFjY2Vzc1JvbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICB4bWxUb0pzb24sXG4gICAgZmluZFZhbHVlT2YsXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNOdW1iZXJUeXBlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgaXNQYWdlYWJsZSxcbiAgICByZXBsYWNlLFxuICAgIGlzRGF0ZVRpbWVUeXBlLFxuICAgIGdldFZhbGlkRGF0ZU9iamVjdCxcbiAgICBnZXROYXRpdmVEYXRlT2JqZWN0LFxuICAgIGdldEJsb2IsXG4gICAgaXNFcXVhbFdpdGhGaWVsZHMsXG4gICAgbG9hZFN0eWxlU2hlZXQsXG4gICAgbG9hZFN0eWxlU2hlZXRzLFxuICAgIGxvYWRTY3JpcHQsXG4gICAgbG9hZFNjcmlwdHMsXG4gICAgX1dNX0FQUF9QUk9KRUNULFxuICAgIHNldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBnZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgbm9vcCxcbiAgICBjb252ZXJ0VG9CbG9iLFxuICAgIEFwcENvbnN0YW50cyxcbiAgICBvcGVuTGluayxcbiAgICBmZXRjaENvbnRlbnQsXG4gICAgdG9Qcm9taXNlLFxuICAgIHJldHJ5SWZGYWlscyxcbiAgICBnZXRBYm9ydGFibGVEZWZlcixcbiAgICBjcmVhdGVDU1NSdWxlLFxuICAgIGdldFVybFBhcmFtcyxcbiAgICBnZXRNb21lbnRMb2NhbGVPYmplY3QsXG4gICAgZ2V0Um91dGVOYW1lRnJvbUxpbmssXG4gICAgaXNBcHBsZVByb2R1Y3QsXG4gICAgZGVmZXIsXG4gICAgZXhlY3V0ZVByb21pc2VDaGFpbixcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICB2YWxpZGF0ZURhdGFTb3VyY2VDdHgsXG4gICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIHJlbW92ZUV4dHJhU2xhc2hlcyxcbiAgICBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQsXG4gICAgYWRkRm9ySWRBdHRyaWJ1dGVzLFxuICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLFxuICAgIGFkanVzdENvbnRhaW5lclJpZ2h0RWRnZXMsXG4gICAgc2V0VHJhbnNsYXRpb24zZFBvc2l0aW9uLFxuICAgIGdldFdlYmtpdFRyYXNsYXRpb25NYXRyaXgsXG4gICAgY2xvc2VQb3BvdmVyLFxuICAgIGRldGVjdENoYW5nZXMsXG4gICAgdHJpZ2dlckl0ZW1BY3Rpb24sXG4gICAgZ2V0RGF0YXNvdXJjZUZyb21FeHByLFxuICAgIGV4dHJhY3RDdXJyZW50SXRlbUV4cHIsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgVkFMSURBVE9SLFxuICAgIHRyYW5zZm9ybUZpbGVVUkksXG4gICAgYXBwZW5kU2NyaXB0VG9IZWFkLFxuICAgIGdldEFwcFNldHRpbmcsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGZpbmRQYXJlbnQsXG4gICAgZ2V0TmF2Q2xhc3MsXG4gICAgZ2V0U2hlZXRQb3NpdGlvbkNsYXNzXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuZXhwb3J0IHtcbiAgICBGSVJTVF9USU1FX1dBVENILFxuICAgIGlzRmlyc3RUaW1lQ2hhbmdlLFxuICAgIGRlYm91bmNlLFxuICAgIG11dGVXYXRjaGVycyxcbiAgICB1bk11dGVXYXRjaGVycyxcbiAgICAkd2F0Y2gsXG4gICAgJHVud2F0Y2gsXG4gICAgJHVud2F0Y2hBbGwsXG4gICAgJHVud2F0Y2hBbGxCeVNjb3BlLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==