@wavemaker/app-ng-runtime 11.14.1-6.6324 → 11.14.1-8.6337
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/components/base/bundles/index.umd.js +74 -7
- package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
- package/components/base/esm2022/widgets/common/base/base.component.mjs +67 -7
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +4 -2
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
- package/components/base/fesm2022/index.mjs +75 -8
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/basic/label/bundles/index.umd.js +9 -1
- package/components/basic/label/esm2022/label.directive.mjs +10 -2
- package/components/basic/label/fesm2022/index.mjs +9 -1
- package/components/basic/label/fesm2022/index.mjs.map +1 -1
- package/components/data/pagination/bundles/index.umd.js +4 -0
- package/components/data/pagination/esm2022/pagination.component.mjs +5 -1
- package/components/data/pagination/fesm2022/index.mjs +4 -0
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +226 -13
- package/components/data/table/esm2022/table-cud.directive.mjs +2 -2
- package/components/data/table/esm2022/table-filter.directive.mjs +8 -2
- package/components/data/table/esm2022/table.component.mjs +219 -12
- package/components/data/table/fesm2022/index.mjs +226 -13
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table.component.d.ts +6 -2
- package/components/navigation/menu/bundles/index.umd.js +5 -0
- package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
- package/components/navigation/menu/fesm2022/index.mjs +5 -0
- package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/bundles/index.umd.js +6 -6
- package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
- package/components/navigation/popover/fesm2022/index.mjs +3 -3
- package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/popover.component.d.ts +6 -0
- package/core/bundles/index.umd.js +395 -82
- package/core/esm2022/public_api.mjs +2 -2
- package/core/esm2022/utils/watcher.mjs +392 -81
- package/core/fesm2022/index.mjs +395 -84
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +1 -1
- package/core/utils/watcher.d.ts +28 -5
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +20 -0
- package/runtime/base/esm2022/components/app-component/app.component.mjs +4 -2
- package/runtime/base/esm2022/components/base-page.component.mjs +6 -2
- package/runtime/base/esm2022/components/base-partial.component.mjs +7 -2
- package/runtime/base/esm2022/components/base-prefab.component.mjs +7 -2
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +6 -2
- package/runtime/base/fesm2022/index.mjs +21 -1
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/scripts/datatable/datatable.js +34 -2
|
@@ -1450,11 +1450,11 @@
|
|
|
1450
1450
|
}
|
|
1451
1451
|
};
|
|
1452
1452
|
|
|
1453
|
-
const $RAF
|
|
1453
|
+
const $RAF = window.requestAnimationFrame;
|
|
1454
1454
|
const $RAFQueue = [];
|
|
1455
1455
|
const invokeLater = fn => {
|
|
1456
1456
|
if (!$RAFQueue.length) {
|
|
1457
|
-
$RAF
|
|
1457
|
+
$RAF(() => {
|
|
1458
1458
|
$RAFQueue.forEach(f => f());
|
|
1459
1459
|
$RAFQueue.length = 0;
|
|
1460
1460
|
});
|
|
@@ -2191,14 +2191,89 @@
|
|
|
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
|
-
|
|
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
|
-
|
|
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(bucket => count += bucket.size);
|
|
2225
|
+
return count;
|
|
2226
|
+
}
|
|
2227
|
+
const cleanupStaleWatchers = () => {
|
|
2228
|
+
// console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
|
|
2229
|
+
let removed = 0;
|
|
2230
|
+
registry.forEach((bucket, widgetId) => {
|
|
2231
|
+
if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
|
|
2232
|
+
for (const key in bucket) {
|
|
2233
|
+
if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
|
|
2234
|
+
let watchInfo = bucket[key];
|
|
2235
|
+
if (watchInfo && watchInfo.destroyFn) {
|
|
2236
|
+
watchInfo.destroyFn();
|
|
2237
|
+
}
|
|
2238
|
+
}
|
|
2239
|
+
}
|
|
2240
|
+
removed++;
|
|
2241
|
+
registry.delete(widgetId);
|
|
2242
|
+
return;
|
|
2243
|
+
}
|
|
2244
|
+
});
|
|
2245
|
+
return removed;
|
|
2246
|
+
};
|
|
2247
|
+
const scheduleThresholdCleanup = () => {
|
|
2248
|
+
const now = performance.now();
|
|
2249
|
+
let lastTriggerPeriod = now - lastScheduledTime;
|
|
2250
|
+
// If a cleanup was scheduled recently, skip scheduling
|
|
2251
|
+
if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
|
|
2252
|
+
return;
|
|
2253
|
+
}
|
|
2254
|
+
const current = getWatcherCount();
|
|
2255
|
+
const delta = Math.abs(current - lastWatcherCount); // significant + or -
|
|
2256
|
+
// If change not large enough, skip scheduling
|
|
2257
|
+
if (delta <= CLEANUP_TRIGGER_DELTA) {
|
|
2258
|
+
lastWatcherCount = current;
|
|
2259
|
+
return;
|
|
2260
|
+
}
|
|
2261
|
+
// Prevent re-scheduling: set timestamp early
|
|
2262
|
+
lastScheduledTime = now;
|
|
2263
|
+
// Clear previous scheduled cleanup (if any)
|
|
2264
|
+
if (scheduledCleanup) {
|
|
2265
|
+
clearTimeout(scheduledCleanup);
|
|
2266
|
+
}
|
|
2267
|
+
// Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
|
|
2268
|
+
scheduledCleanup = setTimeout(() => {
|
|
2269
|
+
cleanupStaleWatchers();
|
|
2270
|
+
scheduledCleanup = null;
|
|
2271
|
+
}, CLEANUP_DELAY);
|
|
2272
|
+
lastWatcherCount = current;
|
|
2273
|
+
};
|
|
2274
|
+
// Utility functions
|
|
2275
|
+
const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
|
|
2276
|
+
const debounce = (fn, wait = DEBOUNCE_WAIT) => {
|
|
2202
2277
|
let timeout;
|
|
2203
2278
|
return (...args) => {
|
|
2204
2279
|
window['__zone_symbol__clearTimeout'](timeout);
|
|
@@ -2212,115 +2287,350 @@
|
|
|
2212
2287
|
muted = false;
|
|
2213
2288
|
triggerWatchers();
|
|
2214
2289
|
};
|
|
2290
|
+
/**
|
|
2291
|
+
* Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
|
|
2292
|
+
*/
|
|
2293
|
+
const getWidgetId = (identifier) => {
|
|
2294
|
+
if (!identifier || typeof identifier !== 'string') {
|
|
2295
|
+
return null;
|
|
2296
|
+
}
|
|
2297
|
+
const match = identifier.match(WIDGET_ID_REGEX);
|
|
2298
|
+
return match ? match[1] : null;
|
|
2299
|
+
};
|
|
2300
|
+
/**
|
|
2301
|
+
* Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
|
|
2302
|
+
*/
|
|
2303
|
+
const getPropertyName = (identifier) => {
|
|
2304
|
+
if (!identifier || typeof identifier !== 'string') {
|
|
2305
|
+
return identifier;
|
|
2306
|
+
}
|
|
2307
|
+
const match = identifier.match(WIDGET_PROPERTY_REGEX);
|
|
2308
|
+
return match ? match[1] : identifier;
|
|
2309
|
+
};
|
|
2310
|
+
/**
|
|
2311
|
+
* Array consumer wrapper for array-based expressions
|
|
2312
|
+
*/
|
|
2215
2313
|
const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
formattedData = lodashEs.flatten(formattedData);
|
|
2224
|
-
}
|
|
2225
|
-
listenerFn(formattedData, oldVal);
|
|
2314
|
+
if (!lodashEs.isArray(newVal)) {
|
|
2315
|
+
return;
|
|
2316
|
+
}
|
|
2317
|
+
let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
|
|
2318
|
+
// Flatten if result is array of arrays
|
|
2319
|
+
if (lodashEs.isArray(formattedData[0])) {
|
|
2320
|
+
formattedData = lodashEs.flatten(formattedData);
|
|
2226
2321
|
}
|
|
2322
|
+
listenerFn(formattedData, oldVal);
|
|
2227
2323
|
};
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2324
|
+
/**
|
|
2325
|
+
* Updates watch info for array expressions
|
|
2326
|
+
*/
|
|
2327
|
+
const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
|
|
2328
|
+
const regex = /\[\$i\]/g;
|
|
2232
2329
|
if (!acceptsArray) {
|
|
2233
2330
|
return {
|
|
2234
|
-
|
|
2235
|
-
|
|
2331
|
+
expr: expr.replace(regex, ARRAY_INDEX_ZERO),
|
|
2332
|
+
listener
|
|
2236
2333
|
};
|
|
2237
2334
|
}
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2335
|
+
const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
|
|
2336
|
+
const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
|
|
2337
|
+
const restExpr = expr.substring(lastIndex + 5);
|
|
2338
|
+
const arrayConsumerFn = restExpr
|
|
2339
|
+
? arrayConsumer.bind(undefined, listener, restExpr)
|
|
2340
|
+
: listener;
|
|
2244
2341
|
return {
|
|
2245
|
-
|
|
2246
|
-
|
|
2342
|
+
expr: baseExpr,
|
|
2343
|
+
listener: arrayConsumerFn
|
|
2247
2344
|
};
|
|
2248
2345
|
};
|
|
2346
|
+
/**
|
|
2347
|
+
* Determines if an expression is static (doesn't need to be watched)
|
|
2348
|
+
*/
|
|
2349
|
+
const STATIC_EXPRESSION_NAMES = [
|
|
2350
|
+
"row.getProperty('investment')",
|
|
2351
|
+
"row.getProperty('factsheetLink')",
|
|
2352
|
+
"row.getProperty('isRebalanceEligible')"
|
|
2353
|
+
];
|
|
2354
|
+
const isStaticExpression = (expr) => {
|
|
2355
|
+
if (typeof expr !== 'string') {
|
|
2356
|
+
return false;
|
|
2357
|
+
}
|
|
2358
|
+
const trimmedExpr = expr.trim();
|
|
2359
|
+
// Expressions that always evaluate to localization strings
|
|
2360
|
+
// if (trimmedExpr.includes('appLocale')) {
|
|
2361
|
+
// return true;
|
|
2362
|
+
// }
|
|
2363
|
+
// Hard-coded static expression names
|
|
2364
|
+
if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
|
|
2365
|
+
return true;
|
|
2366
|
+
}
|
|
2367
|
+
return false;
|
|
2368
|
+
};
|
|
2369
|
+
/**
|
|
2370
|
+
* Gets the scope type from the scope object
|
|
2371
|
+
*/
|
|
2372
|
+
const getScopeType = ($scope) => {
|
|
2373
|
+
if (!$scope) {
|
|
2374
|
+
return null;
|
|
2375
|
+
}
|
|
2376
|
+
if ($scope.pageName)
|
|
2377
|
+
return 'Page';
|
|
2378
|
+
if ($scope.prefabName)
|
|
2379
|
+
return 'Prefab';
|
|
2380
|
+
if ($scope.partialName)
|
|
2381
|
+
return 'Partial';
|
|
2382
|
+
// Check for App scope
|
|
2383
|
+
if ($scope.Variables !== undefined &&
|
|
2384
|
+
$scope.Actions !== undefined &&
|
|
2385
|
+
!$scope.pageName &&
|
|
2386
|
+
!$scope.prefabName &&
|
|
2387
|
+
!$scope.partialName) {
|
|
2388
|
+
return 'App';
|
|
2389
|
+
}
|
|
2390
|
+
if ($scope.constructor?.name === 'AppRef') {
|
|
2391
|
+
return 'App';
|
|
2392
|
+
}
|
|
2393
|
+
return null;
|
|
2394
|
+
};
|
|
2395
|
+
/**
|
|
2396
|
+
* Gets scope name based on scope type
|
|
2397
|
+
*/
|
|
2398
|
+
const getScopeName = ($scope, scopeType) => {
|
|
2399
|
+
if (!scopeType || !$scope) {
|
|
2400
|
+
return null;
|
|
2401
|
+
}
|
|
2402
|
+
switch (scopeType) {
|
|
2403
|
+
case 'Prefab': return $scope.prefabName || null;
|
|
2404
|
+
case 'Partial': return $scope.partialName || null;
|
|
2405
|
+
case 'Page': return $scope.pageName || null;
|
|
2406
|
+
default: return null;
|
|
2407
|
+
}
|
|
2408
|
+
};
|
|
2409
|
+
/**
|
|
2410
|
+
* Main watch function
|
|
2411
|
+
*/
|
|
2249
2412
|
const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
|
|
2250
|
-
|
|
2251
|
-
|
|
2413
|
+
// Handle array expressions
|
|
2414
|
+
if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
|
|
2415
|
+
const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
|
|
2252
2416
|
expr = watchInfo.expr;
|
|
2253
2417
|
listener = watchInfo.listener;
|
|
2254
2418
|
}
|
|
2419
|
+
// Handle static expressions
|
|
2420
|
+
if (isStaticExpression(expr)) {
|
|
2421
|
+
try {
|
|
2422
|
+
const fn = $parseExpr(expr);
|
|
2423
|
+
const staticValue = fn($scope, $locals);
|
|
2424
|
+
listener(staticValue, FIRST_TIME_WATCH);
|
|
2425
|
+
}
|
|
2426
|
+
catch (e) {
|
|
2427
|
+
console.warn(`Error evaluating static expression '${expr}':`, e);
|
|
2428
|
+
listener(undefined, FIRST_TIME_WATCH);
|
|
2429
|
+
}
|
|
2430
|
+
return () => { }; // No-op unsubscribe
|
|
2431
|
+
}
|
|
2255
2432
|
const fn = $parseExpr(expr);
|
|
2256
|
-
|
|
2257
|
-
|
|
2433
|
+
const scopeType = getScopeType($scope);
|
|
2434
|
+
const scopeName = getScopeName($scope, scopeType);
|
|
2435
|
+
const destroyFn = () => $unwatch(identifier);
|
|
2436
|
+
const watchInfo = {
|
|
2437
|
+
fn: fn.bind(null, $scope, $locals),
|
|
2258
2438
|
listener,
|
|
2259
2439
|
expr,
|
|
2260
2440
|
last: FIRST_TIME_WATCH,
|
|
2261
2441
|
doNotClone,
|
|
2262
|
-
isMuted
|
|
2442
|
+
isMuted,
|
|
2443
|
+
scopeType,
|
|
2444
|
+
scopeName,
|
|
2445
|
+
destroyFn
|
|
2446
|
+
};
|
|
2447
|
+
// Store in registry
|
|
2448
|
+
const widgetId = getWidgetId(identifier);
|
|
2449
|
+
if (widgetId) {
|
|
2450
|
+
const propertyName = getPropertyName(identifier);
|
|
2451
|
+
if (!registry.has(widgetId)) {
|
|
2452
|
+
registry.set(widgetId, {});
|
|
2453
|
+
}
|
|
2454
|
+
const widgetGroup = registry.get(widgetId);
|
|
2455
|
+
widgetGroup[propertyName] = watchInfo;
|
|
2456
|
+
}
|
|
2457
|
+
else {
|
|
2458
|
+
registry.set(identifier, watchInfo);
|
|
2459
|
+
}
|
|
2460
|
+
return destroyFn;
|
|
2461
|
+
};
|
|
2462
|
+
/**
|
|
2463
|
+
* Unwatches a single identifier
|
|
2464
|
+
*/
|
|
2465
|
+
const $unwatch = (identifier) => {
|
|
2466
|
+
const widgetId = getWidgetId(identifier);
|
|
2467
|
+
if (widgetId) {
|
|
2468
|
+
const propertyName = getPropertyName(identifier);
|
|
2469
|
+
const widgetGroup = registry.get(widgetId);
|
|
2470
|
+
//@ts-ignore
|
|
2471
|
+
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2472
|
+
const watchInfo = widgetGroup[propertyName];
|
|
2473
|
+
if (watchInfo) {
|
|
2474
|
+
delete widgetGroup[propertyName];
|
|
2475
|
+
// Clean up empty widget groups
|
|
2476
|
+
if (Object.keys(widgetGroup).length === 0) {
|
|
2477
|
+
registry.delete(widgetId);
|
|
2478
|
+
}
|
|
2479
|
+
return true;
|
|
2480
|
+
}
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
// Fallback to direct lookup
|
|
2484
|
+
if (registry.has(identifier)) {
|
|
2485
|
+
registry.delete(identifier);
|
|
2486
|
+
return true;
|
|
2487
|
+
}
|
|
2488
|
+
return false;
|
|
2489
|
+
};
|
|
2490
|
+
/**
|
|
2491
|
+
* Unwatches all watchers for a specific widget ID
|
|
2492
|
+
*/
|
|
2493
|
+
const $unwatchAll = (widgetId) => {
|
|
2494
|
+
if (!widgetId || typeof widgetId !== 'string') {
|
|
2495
|
+
return 0;
|
|
2496
|
+
}
|
|
2497
|
+
const widgetGroup = registry.get(widgetId);
|
|
2498
|
+
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
2499
|
+
const count = Object.keys(widgetGroup).length;
|
|
2500
|
+
registry.delete(widgetId);
|
|
2501
|
+
return count;
|
|
2502
|
+
}
|
|
2503
|
+
// Fallback: find all identifiers starting with this widget ID
|
|
2504
|
+
let removedCount = 0;
|
|
2505
|
+
const identifiersToRemove = [];
|
|
2506
|
+
registry.forEach((_, key) => {
|
|
2507
|
+
if (key.startsWith(widgetId + '_')) {
|
|
2508
|
+
identifiersToRemove.push(key);
|
|
2509
|
+
}
|
|
2263
2510
|
});
|
|
2264
|
-
|
|
2511
|
+
identifiersToRemove.forEach(identifier => {
|
|
2512
|
+
if ($unwatch(identifier)) {
|
|
2513
|
+
removedCount++;
|
|
2514
|
+
}
|
|
2515
|
+
});
|
|
2516
|
+
return removedCount;
|
|
2265
2517
|
};
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
const
|
|
2518
|
+
/**
|
|
2519
|
+
* Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
|
|
2520
|
+
* Now works directly with the main registry instead of separate scoped registries
|
|
2521
|
+
*/
|
|
2522
|
+
const $unwatchAllByScope = (scopeType, scopeName) => {
|
|
2523
|
+
if (!scopeType) {
|
|
2524
|
+
return 0;
|
|
2525
|
+
}
|
|
2526
|
+
let removedCount = 0;
|
|
2527
|
+
const identifiersToRemove = [];
|
|
2528
|
+
registry.forEach((value, key) => {
|
|
2529
|
+
// Handle grouped structure (widget groups)
|
|
2530
|
+
if (value && typeof value === 'object' && !value.fn) {
|
|
2531
|
+
Object.entries(value).forEach(([propertyName, watchInfo]) => {
|
|
2532
|
+
if (watchInfo?.scopeType === scopeType &&
|
|
2533
|
+
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2534
|
+
identifiersToRemove.push(`${key}_${propertyName}`);
|
|
2535
|
+
}
|
|
2536
|
+
});
|
|
2537
|
+
}
|
|
2538
|
+
else {
|
|
2539
|
+
// Direct watchInfo
|
|
2540
|
+
const watchInfo = value;
|
|
2541
|
+
if (watchInfo?.scopeType === scopeType &&
|
|
2542
|
+
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
2543
|
+
identifiersToRemove.push(key);
|
|
2544
|
+
}
|
|
2545
|
+
}
|
|
2546
|
+
});
|
|
2547
|
+
// Unwatch all collected identifiers
|
|
2548
|
+
identifiersToRemove.forEach(identifier => {
|
|
2549
|
+
if ($unwatch(identifier)) {
|
|
2550
|
+
removedCount++;
|
|
2551
|
+
}
|
|
2552
|
+
});
|
|
2553
|
+
return removedCount;
|
|
2554
|
+
};
|
|
2555
|
+
/**
|
|
2556
|
+
* Processes a single watch info during trigger cycle
|
|
2557
|
+
*/
|
|
2558
|
+
const processWatchInfo = (watchInfo) => {
|
|
2559
|
+
if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
|
|
2560
|
+
return false;
|
|
2561
|
+
}
|
|
2562
|
+
let newValue;
|
|
2563
|
+
try {
|
|
2564
|
+
newValue = watchInfo.fn();
|
|
2565
|
+
}
|
|
2566
|
+
catch (e) {
|
|
2567
|
+
console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
|
|
2568
|
+
return false;
|
|
2569
|
+
}
|
|
2570
|
+
if (lodashEs.isEqual(newValue, watchInfo.last)) {
|
|
2571
|
+
return false;
|
|
2572
|
+
}
|
|
2573
|
+
// Change detected
|
|
2574
|
+
changedByWatch = true;
|
|
2575
|
+
watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
|
|
2576
|
+
? lodashEs.clone(newValue)
|
|
2577
|
+
: newValue;
|
|
2578
|
+
watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
|
|
2579
|
+
changedByWatch = false;
|
|
2580
|
+
return true;
|
|
2581
|
+
};
|
|
2582
|
+
/**
|
|
2583
|
+
* Triggers all watchers
|
|
2584
|
+
*/
|
|
2585
|
+
const triggerWatchers = (ignoreMuted = false) => {
|
|
2271
2586
|
if (muted && !ignoreMuted) {
|
|
2272
2587
|
return;
|
|
2273
2588
|
}
|
|
2274
|
-
const limit = 5;
|
|
2275
2589
|
let pass = 1;
|
|
2276
2590
|
let changeDetected;
|
|
2277
2591
|
do {
|
|
2278
2592
|
changeDetected = false;
|
|
2279
|
-
registry.forEach(
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
try {
|
|
2288
|
-
nv = fn();
|
|
2289
|
-
}
|
|
2290
|
-
catch (e) {
|
|
2291
|
-
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
2593
|
+
registry.forEach((value) => {
|
|
2594
|
+
// Handle grouped structure
|
|
2595
|
+
if (value && typeof value === 'object' && !value.fn) {
|
|
2596
|
+
Object.values(value).forEach((watchInfo) => {
|
|
2597
|
+
if (processWatchInfo(watchInfo)) {
|
|
2598
|
+
changeDetected = true;
|
|
2599
|
+
}
|
|
2600
|
+
});
|
|
2292
2601
|
}
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
// @ts-ignore
|
|
2298
|
-
if (lodashEs.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
2299
|
-
watchInfo.last = lodashEs.clone(nv);
|
|
2602
|
+
else {
|
|
2603
|
+
// Direct watchInfo
|
|
2604
|
+
if (processWatchInfo(value)) {
|
|
2605
|
+
changeDetected = true;
|
|
2300
2606
|
}
|
|
2301
|
-
listener(nv, ov);
|
|
2302
|
-
resetChangeFromWatch();
|
|
2303
2607
|
}
|
|
2304
2608
|
});
|
|
2305
2609
|
pass++;
|
|
2306
|
-
} while (changeDetected && pass <
|
|
2307
|
-
|
|
2308
|
-
|
|
2610
|
+
} while (changeDetected && pass < MAX_WATCH_CYCLES);
|
|
2611
|
+
// Schedule cleanup after watchers are triggered
|
|
2612
|
+
scheduleThresholdCleanup();
|
|
2613
|
+
if (changeDetected && pass === MAX_WATCH_CYCLES) {
|
|
2614
|
+
console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
|
|
2309
2615
|
}
|
|
2310
2616
|
};
|
|
2311
|
-
|
|
2312
|
-
const
|
|
2617
|
+
// Angular zone integration
|
|
2618
|
+
const setNgZone = (zone) => {
|
|
2619
|
+
ngZone = zone;
|
|
2620
|
+
};
|
|
2621
|
+
const setAppRef = (ref) => {
|
|
2313
2622
|
appRef = ref;
|
|
2314
2623
|
};
|
|
2315
2624
|
const isChangeFromWatch = () => changedByWatch;
|
|
2316
|
-
const resetChangeFromWatch = () =>
|
|
2317
|
-
|
|
2318
|
-
|
|
2625
|
+
const resetChangeFromWatch = () => {
|
|
2626
|
+
changedByWatch = false;
|
|
2627
|
+
};
|
|
2628
|
+
// Debounced trigger
|
|
2319
2629
|
const debouncedTriggerWatchers = debounce(() => {
|
|
2320
2630
|
skipWatchers = true;
|
|
2321
2631
|
ngZone.run(() => triggerWatchers());
|
|
2322
|
-
},
|
|
2323
|
-
const $invokeWatchers = (force, ignoreMuted) => {
|
|
2632
|
+
}, DEBOUNCE_WAIT);
|
|
2633
|
+
const $invokeWatchers = (force = false, ignoreMuted = false) => {
|
|
2324
2634
|
if (force) {
|
|
2325
2635
|
triggerWatchers(ignoreMuted);
|
|
2326
2636
|
}
|
|
@@ -2334,7 +2644,8 @@
|
|
|
2334
2644
|
};
|
|
2335
2645
|
const $appDigest = (() => {
|
|
2336
2646
|
let queued = false;
|
|
2337
|
-
|
|
2647
|
+
const $RAF = window.requestAnimationFrame;
|
|
2648
|
+
return (force = false) => {
|
|
2338
2649
|
if (!appRef) {
|
|
2339
2650
|
return;
|
|
2340
2651
|
}
|
|
@@ -2346,16 +2657,16 @@
|
|
|
2346
2657
|
if (queued) {
|
|
2347
2658
|
return;
|
|
2348
2659
|
}
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
});
|
|
2355
|
-
}
|
|
2660
|
+
queued = true;
|
|
2661
|
+
$RAF(() => {
|
|
2662
|
+
ngZone.run(() => appRef.tick());
|
|
2663
|
+
queued = false;
|
|
2664
|
+
});
|
|
2356
2665
|
}
|
|
2357
2666
|
};
|
|
2358
2667
|
})();
|
|
2668
|
+
// Export registry for debugging
|
|
2669
|
+
window.watchRegistry = registry;
|
|
2359
2670
|
|
|
2360
2671
|
exports.ComponentType = void 0;
|
|
2361
2672
|
(function (ComponentType) {
|
|
@@ -5164,6 +5475,8 @@
|
|
|
5164
5475
|
exports.$parseEvent = $parseEvent;
|
|
5165
5476
|
exports.$parseExpr = $parseExpr;
|
|
5166
5477
|
exports.$unwatch = $unwatch;
|
|
5478
|
+
exports.$unwatchAll = $unwatchAll;
|
|
5479
|
+
exports.$unwatchAllByScope = $unwatchAllByScope;
|
|
5167
5480
|
exports.$watch = $watch;
|
|
5168
5481
|
exports.AbstractDialogService = AbstractDialogService;
|
|
5169
5482
|
exports.AbstractHttpService = AbstractHttpService;
|
|
@@ -8,7 +8,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
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, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
|
|
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,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRJbWFnZVVybCxcbiAgICBpc1ZhbGlkV2ViVVJMLFxuICAgIGdldFJlc291cmNlVVJMLFxuICAgIHRyaWdnZXJGbixcbiAgICBoYXNPZmZzZXRTdHIsXG4gICAgZ2V0Rm9ybWF0dGVkRGF0ZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdlbmVyYXRlR1VJZCxcbiAgICB2YWxpZGF0ZUFjY2Vzc1JvbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICB4bWxUb0pzb24sXG4gICAgZmluZFZhbHVlT2YsXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNOdW1iZXJUeXBlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgaXNQYWdlYWJsZSxcbiAgICByZXBsYWNlLFxuICAgIGlzRGF0ZVRpbWVUeXBlLFxuICAgIGdldFZhbGlkRGF0ZU9iamVjdCxcbiAgICBnZXROYXRpdmVEYXRlT2JqZWN0LFxuICAgIGdldEJsb2IsXG4gICAgaXNFcXVhbFdpdGhGaWVsZHMsXG4gICAgbG9hZFN0eWxlU2hlZXQsXG4gICAgbG9hZFN0eWxlU2hlZXRzLFxuICAgIGxvYWRTY3JpcHQsXG4gICAgbG9hZFNjcmlwdHMsXG4gICAgX1dNX0FQUF9QUk9KRUNULFxuICAgIHNldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBnZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgbm9vcCxcbiAgICBjb252ZXJ0VG9CbG9iLFxuICAgIEFwcENvbnN0YW50cyxcbiAgICBvcGVuTGluayxcbiAgICBmZXRjaENvbnRlbnQsXG4gICAgdG9Qcm9taXNlLFxuICAgIHJldHJ5SWZGYWlscyxcbiAgICBnZXRBYm9ydGFibGVEZWZlcixcbiAgICBjcmVhdGVDU1NSdWxlLFxuICAgIGdldFVybFBhcmFtcyxcbiAgICBnZXRNb21lbnRMb2NhbGVPYmplY3QsXG4gICAgZ2V0Um91dGVOYW1lRnJvbUxpbmssXG4gICAgaXNBcHBsZVByb2R1Y3QsXG4gICAgZGVmZXIsXG4gICAgZXhlY3V0ZVByb21pc2VDaGFpbixcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICB2YWxpZGF0ZURhdGFTb3VyY2VDdHgsXG4gICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIHJlbW92ZUV4dHJhU2xhc2hlcyxcbiAgICBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQsXG4gICAgYWRkRm9ySWRBdHRyaWJ1dGVzLFxuICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLFxuICAgIGFkanVzdENvbnRhaW5lclJpZ2h0RWRnZXMsXG4gICAgc2V0VHJhbnNsYXRpb24zZFBvc2l0aW9uLFxuICAgIGdldFdlYmtpdFRyYXNsYXRpb25NYXRyaXgsXG4gICAgY2xvc2VQb3BvdmVyLFxuICAgIGRldGVjdENoYW5nZXMsXG4gICAgdHJpZ2dlckl0ZW1BY3Rpb24sXG4gICAgZ2V0RGF0YXNvdXJjZUZyb21FeHByLFxuICAgIGV4dHJhY3RDdXJyZW50SXRlbUV4cHIsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgVkFMSURBVE9SLFxuICAgIHRyYW5zZm9ybUZpbGVVUkksXG4gICAgYXBwZW5kU2NyaXB0VG9IZWFkLFxuICAgIGdldEFwcFNldHRpbmcsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGZpbmRQYXJlbnQsXG4gICAgZ2V0TmF2Q2xhc3MsXG4gICAgZ2V0U2hlZXRQb3NpdGlvbkNsYXNzXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuZXhwb3J0IHtcbiAgICBGSVJTVF9USU1FX1dBVENILFxuICAgIGlzRmlyc3RUaW1lQ2hhbmdlLFxuICAgIGRlYm91bmNlLFxuICAgIG11dGVXYXRjaGVycyxcbiAgICB1bk11dGVXYXRjaGVycyxcbiAgICAkd2F0Y2gsXG4gICAgJHVud2F0Y2gsXG4gICAgJHVud2F0Y2hBbGwsXG4gICAgJHVud2F0Y2hBbGxCeVNjb3BlLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==
|