@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.
- package/components/base/bundles/index.umd.js +86 -17
- package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
- package/components/base/esm2022/utils/widget-utils.mjs +3 -3
- package/components/base/esm2022/widgets/common/base/base.component.mjs +67 -7
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -3
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
- package/components/base/fesm2022/index.mjs +87 -18
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/base/pipes/custom-pipes.d.ts +5 -5
- 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 +371 -15
- package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table-column/table-column.directive.mjs +107 -3
- package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
- package/components/data/table/esm2022/table-cud.directive.mjs +8 -2
- package/components/data/table/esm2022/table-filter.directive.mjs +12 -2
- package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
- package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table.component.mjs +219 -12
- package/components/data/table/fesm2022/index.mjs +371 -15
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table-action/table-action.directive.d.ts +3 -2
- package/components/data/table/table-column/table-column.directive.d.ts +3 -2
- package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
- package/components/data/table/table-cud.directive.d.ts +3 -1
- package/components/data/table/table-filter.directive.d.ts +3 -1
- package/components/data/table/table-row/table-row.directive.d.ts +3 -2
- package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
- 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 +411 -82
- package/core/esm2022/public_api.mjs +3 -3
- package/core/esm2022/utils/utils.mjs +6 -2
- package/core/esm2022/utils/watcher.mjs +402 -81
- package/core/fesm2022/index.mjs +410 -84
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +2 -2
- package/core/utils/utils.d.ts +1 -0
- 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 +22 -2
- 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/esm2022/services/pipe-provider.service.mjs +4 -4
- package/runtime/base/fesm2022/index.mjs +23 -3
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/scripts/datatable/datatable.js +101 -15
|
@@ -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,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
|
-
|
|
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((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
|
-
|
|
2217
|
-
|
|
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
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
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
|
-
|
|
2235
|
-
|
|
2341
|
+
expr: expr.replace(regex, ARRAY_INDEX_ZERO),
|
|
2342
|
+
listener
|
|
2236
2343
|
};
|
|
2237
2344
|
}
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
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
|
-
|
|
2246
|
-
|
|
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
|
-
|
|
2251
|
-
|
|
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
|
-
|
|
2257
|
-
|
|
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
|
|
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
|
|
2526
|
+
return removedCount;
|
|
2265
2527
|
};
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
const
|
|
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(
|
|
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}'`);
|
|
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
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
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 <
|
|
2307
|
-
|
|
2308
|
-
|
|
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
|
-
|
|
2312
|
-
const
|
|
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 = () =>
|
|
2317
|
-
|
|
2318
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
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,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRJbWFnZVVybCxcbiAgICBpc1ZhbGlkV2ViVVJMLFxuICAgIGdldFJlc291cmNlVVJMLFxuICAgIHRyaWdnZXJGbixcbiAgICBoYXNPZmZzZXRTdHIsXG4gICAgZ2V0Rm9ybWF0dGVkRGF0ZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdlbmVyYXRlR1VJZCxcbiAgICB2YWxpZGF0ZUFjY2Vzc1JvbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICB4bWxUb0pzb24sXG4gICAgZmluZFZhbHVlT2YsXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNOdW1iZXJUeXBlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgaXNQYWdlYWJsZSxcbiAgICByZXBsYWNlLFxuICAgIGlzRGF0ZVRpbWVUeXBlLFxuICAgIGdldFZhbGlkRGF0ZU9iamVjdCxcbiAgICBnZXROYXRpdmVEYXRlT2JqZWN0LFxuICAgIGdldEJsb2IsXG4gICAgaXNFcXVhbFdpdGhGaWVsZHMsXG4gICAgbG9hZFN0eWxlU2hlZXQsXG4gICAgbG9hZFN0eWxlU2hlZXRzLFxuICAgIGxvYWRTY3JpcHQsXG4gICAgbG9hZFNjcmlwdHMsXG4gICAgX1dNX0FQUF9QUk9KRUNULFxuICAgIHNldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBnZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgbm9vcCxcbiAgICBjb252ZXJ0VG9CbG9iLFxuICAgIEFwcENvbnN0YW50cyxcbiAgICBvcGVuTGluayxcbiAgICBmZXRjaENvbnRlbnQsXG4gICAgdG9Qcm9taXNlLFxuICAgIHJldHJ5SWZGYWlscyxcbiAgICBnZXRBYm9ydGFibGVEZWZlcixcbiAgICBjcmVhdGVDU1NSdWxlLFxuICAgIGdldFVybFBhcmFtcyxcbiAgICBnZXRNb21lbnRMb2NhbGVPYmplY3QsXG4gICAgZ2V0Um91dGVOYW1lRnJvbUxpbmssXG4gICAgaXNBcHBsZVByb2R1Y3QsXG4gICAgZGVmZXIsXG4gICAgZXhlY3V0ZVByb21pc2VDaGFpbixcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICB2YWxpZGF0ZURhdGFTb3VyY2VDdHgsXG4gICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIHJlbW92ZUV4dHJhU2xhc2hlcyxcbiAgICBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQsXG4gICAgYWRkRm9ySWRBdHRyaWJ1dGVzLFxuICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLFxuICAgIGFkanVzdENvbnRhaW5lclJpZ2h0RWRnZXMsXG4gICAgc2V0VHJhbnNsYXRpb24zZFBvc2l0aW9uLFxuICAgIGdldFdlYmtpdFRyYXNsYXRpb25NYXRyaXgsXG4gICAgY2xvc2VQb3BvdmVyLFxuICAgIGRldGVjdENoYW5nZXMsXG4gICAgdHJpZ2dlckl0ZW1BY3Rpb24sXG4gICAgZ2V0RGF0YXNvdXJjZUZyb21FeHByLFxuICAgIGV4dHJhY3RDdXJyZW50SXRlbUV4cHIsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgVkFMSURBVE9SLFxuICAgIHRyYW5zZm9ybUZpbGVVUkksXG4gICAgYXBwZW5kU2NyaXB0VG9IZWFkLFxuICAgIGdldEFwcFNldHRpbmcsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGZpbmRQYXJlbnQsXG4gICAgZ2V0TmF2Q2xhc3MsXG4gICAgZ2V0U2hlZXRQb3NpdGlvbkNsYXNzXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuZXhwb3J0IHtcbiAgICBGSVJTVF9USU1FX1dBVENILFxuICAgIGlzRmlyc3RUaW1lQ2hhbmdlLFxuICAgIGRlYm91bmNlLFxuICAgIG11dGVXYXRjaGVycyxcbiAgICB1bk11dGVXYXRjaGVycyxcbiAgICAkd2F0Y2gsXG4gICAgJHVud2F0Y2gsXG4gICAgJHVud2F0Y2hBbGwsXG4gICAgJHVud2F0Y2hBbGxCeVNjb3BlLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==
|