@rudderstack/integrations-lib 0.2.34 → 0.2.36

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.
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Benchmark utilities for performance testing
3
+ *
4
+ * Provides easy-to-use tools for measuring function performance,
5
+ * memory usage, and creating performance comparisons.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { benchmark, createBenchmarkSuite } from './benchmark';
10
+ *
11
+ * // Simple benchmark
12
+ * const result = await benchmark('myFunction', () => myFunction(data));
13
+ * console.log(`Duration: ${result.duration}ms`);
14
+ *
15
+ * // Benchmark suite
16
+ * const suite = createBenchmarkSuite('Array Operations');
17
+ * suite.add('native map', () => data.map(x => x * 2));
18
+ * suite.add('custom map', () => customMap(data, x => x * 2));
19
+ * await suite.run();
20
+ * ```
21
+ */
22
+ /**
23
+ * Result of a benchmark measurement
24
+ */
25
+ export type BenchmarkResult = {
26
+ /** Name of the benchmark */
27
+ name: string;
28
+ /** Total duration in milliseconds */
29
+ duration: number;
30
+ /** Operations per second */
31
+ opsPerSecond: number;
32
+ /** Memory used in bytes (heap difference) */
33
+ memoryUsed: number;
34
+ /** Number of iterations run */
35
+ iterations: number;
36
+ /** Average duration per iteration in milliseconds */
37
+ avgDuration: number;
38
+ /** Standard deviation of durations */
39
+ stdDev: number;
40
+ /** Minimum duration observed */
41
+ minDuration: number;
42
+ /** Maximum duration observed */
43
+ maxDuration: number;
44
+ };
45
+ /**
46
+ * Configuration options for benchmarks
47
+ */
48
+ export type BenchmarkOptions = {
49
+ /** Number of iterations to run (default: 1) */
50
+ iterations?: number;
51
+ /** Number of warmup runs before measuring (default: 1) */
52
+ warmupRuns?: number;
53
+ /** Whether to force garbage collection between runs (default: false) */
54
+ forceGC?: boolean;
55
+ /** Whether to measure memory usage (default: true) */
56
+ measureMemory?: boolean;
57
+ /** Timeout in milliseconds for the entire benchmark (default: 30000) */
58
+ timeout?: number;
59
+ };
60
+ /**
61
+ * Benchmark function type
62
+ */
63
+ export type BenchmarkFunction<T = unknown> = () => T | Promise<T>;
64
+ /**
65
+ * Run a benchmark for a single function
66
+ *
67
+ * @param name - Name of the benchmark
68
+ * @param fn - Function to benchmark
69
+ * @param options - Benchmark configuration options
70
+ * @returns Promise resolving to benchmark results
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const result = await benchmark('Array.map', () => {
75
+ * return largeArray.map(x => x * 2);
76
+ * }, { iterations: 10, warmupRuns: 3 });
77
+ *
78
+ * console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms avg`);
79
+ * ```
80
+ */
81
+ export declare function benchmark(name: string, fn: BenchmarkFunction, options?: BenchmarkOptions): Promise<BenchmarkResult>;
82
+ /**
83
+ * Compare multiple functions with the same benchmark configuration
84
+ *
85
+ * @param benchmarks - Object with benchmark names and functions
86
+ * @param options - Benchmark configuration options
87
+ * @returns Promise resolving to array of benchmark results
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const results = await compareBenchmarks({
92
+ * 'native map': () => data.map(x => x * 2),
93
+ * 'for loop': () => {
94
+ * const result = [];
95
+ * for (let i = 0; i < data.length; i++) {
96
+ * result.push(data[i] * 2);
97
+ * }
98
+ * return result;
99
+ * }
100
+ * }, { iterations: 5 });
101
+ *
102
+ * results.forEach(result => {
103
+ * console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms`);
104
+ * });
105
+ * ```
106
+ */
107
+ export declare function compareBenchmarks(benchmarks: Record<string, BenchmarkFunction>, options?: BenchmarkOptions): Promise<BenchmarkResult[]>;
108
+ /**
109
+ * Benchmark suite for organizing and running multiple related benchmarks
110
+ */
111
+ export declare class BenchmarkSuite {
112
+ readonly suiteName: string;
113
+ private benchmarks;
114
+ private options;
115
+ constructor(suiteName: string, options?: BenchmarkOptions);
116
+ /**
117
+ * Add a benchmark to the suite
118
+ *
119
+ * @param name - Name of the benchmark
120
+ * @param fn - Function to benchmark
121
+ * @returns This suite instance for chaining
122
+ */
123
+ add(name: string, fn: BenchmarkFunction): this;
124
+ /**
125
+ * Run all benchmarks in the suite
126
+ *
127
+ * @param customOptions - Override suite options for this run
128
+ * @returns Promise resolving to array of benchmark results
129
+ */
130
+ run(customOptions?: BenchmarkOptions): Promise<BenchmarkResult[]>;
131
+ /**
132
+ * Get the number of benchmarks in the suite
133
+ */
134
+ get size(): number;
135
+ /**
136
+ * Clear all benchmarks from the suite
137
+ */
138
+ clear(): this;
139
+ }
140
+ /**
141
+ * Create a new benchmark suite
142
+ *
143
+ * @param suiteName - Name of the benchmark suite
144
+ * @param options - Default options for all benchmarks in the suite
145
+ * @returns New BenchmarkSuite instance
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * const suite = createBenchmarkSuite('String Operations', {
150
+ * iterations: 10,
151
+ * warmupRuns: 2
152
+ * });
153
+ *
154
+ * suite
155
+ * .add('concat', () => str1 + str2)
156
+ * .add('template', () => `${str1}${str2}`)
157
+ * .add('join', () => [str1, str2].join(''));
158
+ *
159
+ * await suite.run();
160
+ * ```
161
+ */
162
+ export declare function createBenchmarkSuite(suiteName: string, options?: BenchmarkOptions): BenchmarkSuite;
163
+ /**
164
+ * Utility to measure memory usage of a function
165
+ *
166
+ * @param fn - Function to measure
167
+ * @param forceGC - Whether to force garbage collection before measuring
168
+ * @returns Memory usage in bytes
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const memoryUsed = await measureMemory(() => {
173
+ * return new Array(100000).fill(0).map(x => ({ value: x }));
174
+ * });
175
+ *
176
+ * console.log(`Memory used: ${(memoryUsed / 1024 / 1024).toFixed(2)}MB`);
177
+ * ```
178
+ */
179
+ export declare function measureMemory(fn: BenchmarkFunction, forceGC?: boolean): Promise<number>;
180
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/utils/benchmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAqBlE;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA4E1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B;AAED;;GAEG;AACH,qBAAa,cAAc;aAKG,SAAS,EAAE,MAAM;IAJ7C,OAAO,CAAC,UAAU,CAAsD;IAExE,OAAO,CAAC,OAAO,CAAmB;gBAEN,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAI7E;;;;;;OAMG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAK9C;;;;;OAKG;IACG,GAAG,CAAC,aAAa,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAkEvE;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,CAEhB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1F"}
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ /**
3
+ * Benchmark utilities for performance testing
4
+ *
5
+ * Provides easy-to-use tools for measuring function performance,
6
+ * memory usage, and creating performance comparisons.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { benchmark, createBenchmarkSuite } from './benchmark';
11
+ *
12
+ * // Simple benchmark
13
+ * const result = await benchmark('myFunction', () => myFunction(data));
14
+ * console.log(`Duration: ${result.duration}ms`);
15
+ *
16
+ * // Benchmark suite
17
+ * const suite = createBenchmarkSuite('Array Operations');
18
+ * suite.add('native map', () => data.map(x => x * 2));
19
+ * suite.add('custom map', () => customMap(data, x => x * 2));
20
+ * await suite.run();
21
+ * ```
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.BenchmarkSuite = void 0;
25
+ exports.benchmark = benchmark;
26
+ exports.compareBenchmarks = compareBenchmarks;
27
+ exports.createBenchmarkSuite = createBenchmarkSuite;
28
+ exports.measureMemory = measureMemory;
29
+ /**
30
+ * Force garbage collection if available
31
+ */
32
+ function forceGarbageCollection() {
33
+ if (typeof global !== 'undefined' && global.gc) {
34
+ global.gc();
35
+ }
36
+ }
37
+ /**
38
+ * Calculate standard deviation of an array of numbers
39
+ */
40
+ function calculateStdDev(values) {
41
+ const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
42
+ const squaredDiffs = values.map((val) => (val - mean) ** 2);
43
+ const avgSquaredDiff = squaredDiffs.reduce((sum, val) => sum + val, 0) / values.length;
44
+ return Math.sqrt(avgSquaredDiff);
45
+ }
46
+ /**
47
+ * Run a benchmark for a single function
48
+ *
49
+ * @param name - Name of the benchmark
50
+ * @param fn - Function to benchmark
51
+ * @param options - Benchmark configuration options
52
+ * @returns Promise resolving to benchmark results
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const result = await benchmark('Array.map', () => {
57
+ * return largeArray.map(x => x * 2);
58
+ * }, { iterations: 10, warmupRuns: 3 });
59
+ *
60
+ * console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms avg`);
61
+ * ```
62
+ */
63
+ // eslint-disable-next-line require-await
64
+ async function benchmark(name, fn, options = {}) {
65
+ const { iterations = 1, warmupRuns = 1, forceGC = false, measureMemory: shouldMeasureMemory = true, timeout = 30000, } = options;
66
+ // Timeout protection
67
+ let timeoutId;
68
+ const timeoutPromise = new Promise((_, reject) => {
69
+ timeoutId = setTimeout(() => reject(new Error(`Benchmark "${name}" timed out after ${timeout}ms`)), timeout);
70
+ });
71
+ const benchmarkPromise = async () => {
72
+ // Warmup runs
73
+ await Promise.all(Array.from({ length: warmupRuns }, async () => {
74
+ await fn();
75
+ }));
76
+ if (forceGC) {
77
+ forceGarbageCollection();
78
+ }
79
+ const durations = [];
80
+ const startMemory = shouldMeasureMemory ? process.memoryUsage().heapUsed : 0;
81
+ const overallStart = performance.now();
82
+ // Actual benchmark runs
83
+ for (let i = 0; i < iterations; i += 1) {
84
+ if (forceGC && i > 0) {
85
+ forceGarbageCollection();
86
+ }
87
+ const iterationStart = performance.now();
88
+ // eslint-disable-next-line no-await-in-loop
89
+ await fn();
90
+ const iterationEnd = performance.now();
91
+ durations.push(iterationEnd - iterationStart);
92
+ }
93
+ const overallEnd = performance.now();
94
+ const endMemory = shouldMeasureMemory ? process.memoryUsage().heapUsed : 0;
95
+ const totalDuration = overallEnd - overallStart;
96
+ const avgDuration = durations.length > 0 ? durations.reduce((sum, d) => sum + d, 0) / durations.length : 0;
97
+ const minDuration = durations.length > 0 ? Math.min(...durations) : 0;
98
+ const maxDuration = durations.length > 0 ? Math.max(...durations) : 0;
99
+ const stdDev = durations.length > 0 ? calculateStdDev(durations) : 0;
100
+ const opsPerSecond = totalDuration > 0 ? iterations / (totalDuration / 1000) : 0;
101
+ const memoryUsed = endMemory - startMemory;
102
+ return {
103
+ name,
104
+ duration: totalDuration,
105
+ opsPerSecond,
106
+ memoryUsed,
107
+ iterations,
108
+ avgDuration,
109
+ stdDev,
110
+ minDuration,
111
+ maxDuration,
112
+ };
113
+ };
114
+ return Promise.race([benchmarkPromise(), timeoutPromise]).finally(() => {
115
+ clearTimeout(timeoutId);
116
+ });
117
+ }
118
+ /**
119
+ * Compare multiple functions with the same benchmark configuration
120
+ *
121
+ * @param benchmarks - Object with benchmark names and functions
122
+ * @param options - Benchmark configuration options
123
+ * @returns Promise resolving to array of benchmark results
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const results = await compareBenchmarks({
128
+ * 'native map': () => data.map(x => x * 2),
129
+ * 'for loop': () => {
130
+ * const result = [];
131
+ * for (let i = 0; i < data.length; i++) {
132
+ * result.push(data[i] * 2);
133
+ * }
134
+ * return result;
135
+ * }
136
+ * }, { iterations: 5 });
137
+ *
138
+ * results.forEach(result => {
139
+ * console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms`);
140
+ * });
141
+ * ```
142
+ */
143
+ async function compareBenchmarks(benchmarks, options = {}) {
144
+ const results = await Promise.all(Object.entries(benchmarks).map(([name, fn]) => benchmark(name, fn, options)));
145
+ return results.sort((a, b) => a.avgDuration - b.avgDuration);
146
+ }
147
+ /**
148
+ * Benchmark suite for organizing and running multiple related benchmarks
149
+ */
150
+ class BenchmarkSuite {
151
+ constructor(suiteName, options = {}) {
152
+ this.suiteName = suiteName;
153
+ this.benchmarks = [];
154
+ this.options = options;
155
+ }
156
+ /**
157
+ * Add a benchmark to the suite
158
+ *
159
+ * @param name - Name of the benchmark
160
+ * @param fn - Function to benchmark
161
+ * @returns This suite instance for chaining
162
+ */
163
+ add(name, fn) {
164
+ this.benchmarks.push({ name, fn });
165
+ return this;
166
+ }
167
+ /**
168
+ * Run all benchmarks in the suite
169
+ *
170
+ * @param customOptions - Override suite options for this run
171
+ * @returns Promise resolving to array of benchmark results
172
+ */
173
+ async run(customOptions) {
174
+ const options = { ...this.options, ...customOptions };
175
+ const results = [];
176
+ // eslint-disable-next-line no-console
177
+ console.log(`\n🚀 Running benchmark suite: ${this.suiteName}`);
178
+ // eslint-disable-next-line no-console
179
+ console.log('='.repeat(60));
180
+ // eslint-disable-next-line no-restricted-syntax
181
+ for (const { name, fn } of this.benchmarks) {
182
+ // eslint-disable-next-line no-console
183
+ console.log(`\n⏱️ Running: ${name}...`);
184
+ try {
185
+ // eslint-disable-next-line no-await-in-loop
186
+ const result = await benchmark(name, fn, options);
187
+ results.push(result);
188
+ // eslint-disable-next-line no-console
189
+ console.log(` ✅ ${result.avgDuration.toFixed(2)}ms avg (${result.opsPerSecond.toFixed(0)} ops/sec)`);
190
+ if (options.measureMemory) {
191
+ // eslint-disable-next-line no-console
192
+ console.log(` 💾 Memory: ${(result.memoryUsed / 1024 / 1024).toFixed(2)}MB`);
193
+ }
194
+ }
195
+ catch (error) {
196
+ // eslint-disable-next-line no-console
197
+ console.log(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
198
+ }
199
+ }
200
+ // Summary
201
+ if (results.length > 1) {
202
+ // eslint-disable-next-line no-console
203
+ console.log(`\n📊 Summary (sorted by performance):`);
204
+ const sortedResults = [...results].sort((a, b) => a.avgDuration - b.avgDuration);
205
+ const fastest = sortedResults[0];
206
+ sortedResults.forEach((result, index) => {
207
+ const relative = result.avgDuration / fastest.avgDuration;
208
+ let icon = ' ';
209
+ if (index === 0)
210
+ icon = '🥇';
211
+ else if (index === 1)
212
+ icon = '🥈';
213
+ else if (index === 2)
214
+ icon = '🥉';
215
+ // eslint-disable-next-line no-console
216
+ console.log(` ${icon} ${result.name.padEnd(25)} | ${result.avgDuration.toFixed(2)}ms | ${relative.toFixed(2)}x`);
217
+ });
218
+ }
219
+ // eslint-disable-next-line no-console
220
+ console.log(`\n✅ Suite completed: ${results.length}/${this.benchmarks.length} benchmarks successful\n`);
221
+ return results;
222
+ }
223
+ /**
224
+ * Get the number of benchmarks in the suite
225
+ */
226
+ get size() {
227
+ return this.benchmarks.length;
228
+ }
229
+ /**
230
+ * Clear all benchmarks from the suite
231
+ */
232
+ clear() {
233
+ this.benchmarks = [];
234
+ return this;
235
+ }
236
+ }
237
+ exports.BenchmarkSuite = BenchmarkSuite;
238
+ /**
239
+ * Create a new benchmark suite
240
+ *
241
+ * @param suiteName - Name of the benchmark suite
242
+ * @param options - Default options for all benchmarks in the suite
243
+ * @returns New BenchmarkSuite instance
244
+ *
245
+ * @example
246
+ * ```typescript
247
+ * const suite = createBenchmarkSuite('String Operations', {
248
+ * iterations: 10,
249
+ * warmupRuns: 2
250
+ * });
251
+ *
252
+ * suite
253
+ * .add('concat', () => str1 + str2)
254
+ * .add('template', () => `${str1}${str2}`)
255
+ * .add('join', () => [str1, str2].join(''));
256
+ *
257
+ * await suite.run();
258
+ * ```
259
+ */
260
+ function createBenchmarkSuite(suiteName, options) {
261
+ return new BenchmarkSuite(suiteName, options);
262
+ }
263
+ /**
264
+ * Utility to measure memory usage of a function
265
+ *
266
+ * @param fn - Function to measure
267
+ * @param forceGC - Whether to force garbage collection before measuring
268
+ * @returns Memory usage in bytes
269
+ *
270
+ * @example
271
+ * ```typescript
272
+ * const memoryUsed = await measureMemory(() => {
273
+ * return new Array(100000).fill(0).map(x => ({ value: x }));
274
+ * });
275
+ *
276
+ * console.log(`Memory used: ${(memoryUsed / 1024 / 1024).toFixed(2)}MB`);
277
+ * ```
278
+ */
279
+ async function measureMemory(fn, forceGC = true) {
280
+ if (forceGC) {
281
+ forceGarbageCollection();
282
+ }
283
+ const startMemory = process.memoryUsage().heapUsed;
284
+ await fn();
285
+ const endMemory = process.memoryUsage().heapUsed;
286
+ return endMemory - startMemory;
287
+ }
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFvRkgsOEJBZ0ZDO0FBMkJELDhDQVNDO0FBd0lELG9EQUtDO0FBa0JELHNDQVVDO0FBbFVEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFnQjtJQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILHlDQUF5QztBQUNsQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixJQUFZLEVBQ1osRUFBcUIsRUFDckIsVUFBNEIs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QUksY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FBQyxFQUFxQixFQUFFLE9BQU8sR0FBRyxJQUFJO0lBQ3ZFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixzQkFBc0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25ELE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDWCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBRWpELE9BQU8sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZW5jaG1hcmsgdXRpbGl0aWVzIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nXG4gKlxuICogUHJvdmlkZXMgZWFzeS10by11c2UgdG9vbHMgZm9yIG1lYXN1cmluZyBmdW5jdGlvbiBwZXJmb3JtYW5jZSxcbiAqIG1lbW9yeSB1c2FnZSwgYW5kIGNyZWF0aW5nIHBlcmZvcm1hbmNlIGNvbXBhcmlzb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBiZW5jaG1hcmssIGNyZWF0ZUJlbmNobWFya1N1aXRlIH0gZnJvbSAnLi9iZW5jaG1hcmsnO1xuICpcbiAqIC8vIFNpbXBsZSBiZW5jaG1hcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyaygnbXlGdW5jdGlvbicsICgpID0+IG15RnVuY3Rpb24oZGF0YSkpO1xuICogY29uc29sZS5sb2coYER1cmF0aW9uOiAke3Jlc3VsdC5kdXJhdGlvbn1tc2ApO1xuICpcbiAqIC8vIEJlbmNobWFyayBzdWl0ZVxuICogY29uc3Qgc3VpdGUgPSBjcmVhdGVCZW5jaG1hcmtTdWl0ZSgnQXJyYXkgT3BlcmF0aW9ucycpO1xuICogc3VpdGUuYWRkKCduYXRpdmUgbWFwJywgKCkgPT4gZGF0YS5tYXAoeCA9PiB4ICogMikpO1xuICogc3VpdGUuYWRkKCdjdXN0b20gbWFwJywgKCkgPT4gY3VzdG9tTWFwKGRhdGEsIHggPT4geCAqIDIpKTtcbiAqIGF3YWl0IHN1aXRlLnJ1bigpO1xuICogYGBgXG4gKi9cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBiZW5jaG1hcmsgbWVhc3VyZW1lbnRcbiAqL1xuZXhwb3J0IHR5cGUgQmVuY2htYXJrUmVzdWx0ID0ge1xuICAvKiogTmFtZSBvZiB0aGUgYmVuY2htYXJrICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRvdGFsIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKiogT3BlcmF0aW9ucyBwZXIgc2Vjb25kICovXG4gIG9wc1BlclNlY29uZDogbnVtYmVyO1xuICAvKiogTWVtb3J5IHVzZWQgaW4gYnl0ZXMgKGhlYXAgZGlmZmVyZW5jZSkgKi9cbiAgbWVtb3J5VXNlZDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgcnVuICovXG4gIGl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgLyoqIEF2ZXJhZ2UgZHVyYXRpb24gcGVyIGl0ZXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKi9cbiAgYXZnRHVyYXRpb246IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBkdXJhdGlvbnMgKi9cbiAgc3RkRGV2OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGR1cmF0aW9uIG9ic2VydmVkICovXG4gIG1pbkR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGR1cmF0aW9uIG9ic2VydmVkICovXG4gIG1heER1cmF0aW9uOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYmVuY2htYXJrc1xuICovXG5leHBvcnQgdHlwZSBCZW5jaG1hcmtPcHRpb25zID0ge1xuICAvKiogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuIChkZWZhdWx0OiAxKSAqL1xuICBpdGVyYXRpb25zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHdhcm11cCBydW5zIGJlZm9yZSBtZWFzdXJpbmcgKGRlZmF1bHQ6IDEpICovXG4gIHdhcm11cFJ1bnM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBiZXR3ZWVuIHJ1bnMgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBmb3JjZUdDPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gbWVhc3VyZSBtZW1vcnkgdXNhZ2UgKGRlZmF1bHQ6IHRydWUpICovXG4gIG1lYXN1cmVNZW1vcnk/OiBib29sZWFuO1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBlbnRpcmUgYmVuY2htYXJrIChkZWZhdWx0OiAzMDAwMCkgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQmVuY2htYXJrIGZ1bmN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQmVuY2htYXJrRnVuY3Rpb248VCA9IHVua25vd24+ID0gKCkgPT4gVCB8IFByb21pc2U8VD47XG5cbi8qKlxuICogRm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk6IHZvaWQge1xuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmdjKSB7XG4gICAgZ2xvYmFsLmdjKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGFuIGFycmF5IG9mIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlU3RkRGV2KHZhbHVlczogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCBtZWFuID0gdmFsdWVzLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCkgLyB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBzcXVhcmVkRGlmZnMgPSB2YWx1ZXMubWFwKCh2YWwpID0+ICh2YWwgLSBtZWFuKSAqKiAyKTtcbiAgY29uc3QgYXZnU3F1YXJlZERpZmYgPSBzcXVhcmVkRGlmZnMucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKSAvIHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBNYXRoLnNxcnQoYXZnU3F1YXJlZERpZmYpO1xufVxuXG4vKipcbiAqIFJ1biBhIGJlbmNobWFyayBmb3IgYSBzaW5nbGUgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGJlbmNobWFya1xuICogQHBhcmFtIGZuIC0gRnVuY3Rpb24gdG8gYmVuY2htYXJrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEJlbmNobWFyayBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGJlbmNobWFyayByZXN1bHRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyaygnQXJyYXkubWFwJywgKCkgPT4ge1xuICogICByZXR1cm4gbGFyZ2VBcnJheS5tYXAoeCA9PiB4ICogMik7XG4gKiB9LCB7IGl0ZXJhdGlvbnM6IDEwLCB3YXJtdXBSdW5zOiAzIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKGAke3Jlc3VsdC5uYW1lfTogJHtyZXN1bHQuYXZnRHVyYXRpb24udG9GaXhlZCgyKX1tcyBhdmdgKTtcbiAqIGBgYFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlbmNobWFyayhcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogQmVuY2htYXJrRnVuY3Rpb24sXG4gIG9wdGlvbnM6IEJlbmNobWFya09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QmVuY2htYXJrUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBpdGVyYXRpb25zID0gMSxcbiAgICB3YXJtdXBSdW5zID0gMSxcbiAgICBmb3JjZUdDID0gZmFsc2UsXG4gICAgbWVhc3VyZU1lbW9yeTogc2hvdWxkTWVhc3VyZU1lbW9yeSA9IHRydWUsXG4gICAgdGltZW91dCA9IDMwMDAwLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBUaW1lb3V0IHByb3RlY3Rpb25cbiAgbGV0IHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXQ7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgQmVuY2htYXJrIFwiJHtuYW1lfVwiIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgKSksXG4gICAgICB0aW1lb3V0LFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGJlbmNobWFya1Byb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxCZW5jaG1hcmtSZXN1bHQ+ID0+IHtcbiAgICAvLyBXYXJtdXAgcnVuc1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogd2FybXVwUnVucyB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZuKCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKGZvcmNlR0MpIHtcbiAgICAgIGZvcmNlR2FyYmFnZUNvbGxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbnM6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgc3RhcnRNZW1vcnkgPSBzaG91bGRNZWFzdXJlTWVtb3J5ID8gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkIDogMDtcbiAgICBjb25zdCBvdmVyYWxsU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFjdHVhbCBiZW5jaG1hcmsgcnVuc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSArPSAxKSB7XG4gICAgICBpZiAoZm9yY2VHQyAmJiBpID4gMCkge1xuICAgICAgICBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZXJhdGlvblN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgYXdhaXQgZm4oKTtcbiAgICAgIGNvbnN0IGl0ZXJhdGlvbkVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICBkdXJhdGlvbnMucHVzaChpdGVyYXRpb25FbmQgLSBpdGVyYXRpb25TdGFydCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmFsbEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGVuZE1lbW9yeSA9IHNob3VsZE1lYXN1cmVNZW1vcnkgPyBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgOiAwO1xuXG4gICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IG92ZXJhbGxFbmQgLSBvdmVyYWxsU3RhcnQ7XG4gICAgY29uc3QgYXZnRHVyYXRpb24gPVxuICAgICAgZHVyYXRpb25zLmxlbmd0aCA+IDAgPyBkdXJhdGlvbnMucmVkdWNlKChzdW0sIGQpID0+IHN1bSArIGQsIDApIC8gZHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbWluRHVyYXRpb24gPSBkdXJhdGlvbnMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLmR1cmF0aW9ucykgOiAwO1xuICAgIGNvbnN0IG1heER1cmF0aW9uID0gZHVyYXRpb25zLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5kdXJhdGlvbnMpIDogMDtcbiAgICBjb25zdCBzdGREZXYgPSBkdXJhdGlvbnMubGVuZ3RoID4gMCA/IGNhbGN1bGF0ZVN0ZERldihkdXJhdGlvbnMpIDogMDtcbiAgICBjb25zdCBvcHNQZXJTZWNvbmQgPSB0b3RhbER1cmF0aW9uID4gMCA/IGl0ZXJhdGlvbnMgLyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogMDtcbiAgICBjb25zdCBtZW1vcnlVc2VkID0gZW5kTWVtb3J5IC0gc3RhcnRNZW1vcnk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGR1cmF0aW9uOiB0b3RhbER1cmF0aW9uLFxuICAgICAgb3BzUGVyU2Vjb25kLFxuICAgICAgbWVtb3J5VXNlZCxcbiAgICAgIGl0ZXJhdGlvbnMsXG4gICAgICBhdmdEdXJhdGlvbixcbiAgICAgIHN0ZERldixcbiAgICAgIG1pbkR1cmF0aW9uLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtiZW5jaG1hcmtQcm9taXNlKCksIHRpbWVvdXRQcm9taXNlXSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmUgbXVsdGlwbGUgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgYmVuY2htYXJrIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gYmVuY2htYXJrcyAtIE9iamVjdCB3aXRoIGJlbmNobWFyayBuYW1lcyBhbmQgZnVuY3Rpb25zXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEJlbmNobWFyayBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGJlbmNobWFyayByZXN1bHRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjb21wYXJlQmVuY2htYXJrcyh7XG4gKiAgICduYXRpdmUgbWFwJzogKCkgPT4gZGF0YS5tYXAoeCA9PiB4ICogMiksXG4gKiAgICdmb3IgbG9vcCc6ICgpID0+IHtcbiAqICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAqICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAqICAgICAgIHJlc3VsdC5wdXNoKGRhdGFbaV0gKiAyKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHJlc3VsdDtcbiAqICAgfVxuICogfSwgeyBpdGVyYXRpb25zOiA1IH0pO1xuICpcbiAqIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICogICBjb25zb2xlLmxvZyhgJHtyZXN1bHQubmFtZX06ICR7cmVzdWx0LmF2Z0R1cmF0aW9uLnRvRml4ZWQoMil9bXNgKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlQmVuY2htYXJrcyhcbiAgYmVuY2htYXJrczogUmVjb3JkPHN0cmluZywgQmVuY2htYXJrRnVuY3Rpb24+LFxuICBvcHRpb25zOiBCZW5jaG1hcmtPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPEJlbmNobWFya1Jlc3VsdFtdPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBPYmplY3QuZW50cmllcyhiZW5jaG1hcmtzKS5tYXAoKFtuYW1lLCBmbl0pID0+IGJlbmNobWFyayhuYW1lLCBmbiwgb3B0aW9ucykpLFxuICApO1xuXG4gIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGEuYXZnRHVyYXRpb24gLSBiLmF2Z0R1cmF0aW9uKTtcbn1cblxuLyoqXG4gKiBCZW5jaG1hcmsgc3VpdGUgZm9yIG9yZ2FuaXppbmcgYW5kIHJ1bm5pbmcgbXVsdGlwbGUgcmVsYXRlZCBiZW5jaG1hcmtzXG4gKi9cbmV4cG9ydCBjbGFzcyBCZW5jaG1hcmtTdWl0ZSB7XG4gIHByaXZhdGUgYmVuY2htYXJrczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGZuOiBCZW5jaG1hcmtGdW5jdGlvbiB9PiA9IFtdO1xuXG4gIHByaXZhdGUgb3B0aW9uczogQmVuY2htYXJrT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3VpdGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEJlbmNobWFya09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgYmVuY2htYXJrIHRvIHRoZSBzdWl0ZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGJlbmNobWFya1xuICAgKiBAcGFyYW0gZm4gLSBGdW5jdGlvbiB0byBiZW5jaG1hcmtcbiAgICogQHJldHVybnMgVGhpcyBzdWl0ZSBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZChuYW1lOiBzdHJpbmcsIGZuOiBCZW5jaG1hcmtGdW5jdGlvbik6IHRoaXMge1xuICAgIHRoaXMuYmVuY2htYXJrcy5wdXNoKHsgbmFtZSwgZm4gfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFsbCBiZW5jaG1hcmtzIGluIHRoZSBzdWl0ZVxuICAgKlxuICAgKiBAcGFyYW0gY3VzdG9tT3B0aW9ucyAtIE92ZXJyaWRlIHN1aXRlIG9wdGlvbnMgZm9yIHRoaXMgcnVuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGJlbmNobWFyayByZXN1bHRzXG4gICAqL1xuICBhc3luYyBydW4oY3VzdG9tT3B0aW9ucz86IEJlbmNobWFya09wdGlvbnMpOiBQcm9taXNlPEJlbmNobWFya1Jlc3VsdFtdPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zLCAuLi5jdXN0b21PcHRpb25zIH07XG4gICAgY29uc3QgcmVzdWx0czogQmVuY2htYXJrUmVzdWx0W10gPSBbXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coYFxcbvCfmoAgUnVubmluZyBiZW5jaG1hcmsgc3VpdGU6ICR7dGhpcy5zdWl0ZU5hbWV9YCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDYwKSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZm4gfSBvZiB0aGlzLmJlbmNobWFya3MpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhgXFxu4o+x77iPICBSdW5uaW5nOiAke25hbWV9Li4uYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyayhuYW1lLCBmbiwgb3B0aW9ucyk7XG4gICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgICDinIUgJHtyZXN1bHQuYXZnRHVyYXRpb24udG9GaXhlZCgyKX1tcyBhdmcgKCR7cmVzdWx0Lm9wc1BlclNlY29uZC50b0ZpeGVkKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApfSBvcHMvc2VjKWAsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLm1lYXN1cmVNZW1vcnkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDwn5K+IE1lbW9yeTogJHsocmVzdWx0Lm1lbW9yeVVzZWQgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKX1NQmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhgICAg4p2MIEZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdW1tYXJ5XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGBcXG7wn5OKIFN1bW1hcnkgKHNvcnRlZCBieSBwZXJmb3JtYW5jZSk6YCk7XG4gICAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0gWy4uLnJlc3VsdHNdLnNvcnQoKGEsIGIpID0+IGEuYXZnRHVyYXRpb24gLSBiLmF2Z0R1cmF0aW9uKTtcbiAgICAgIGNvbnN0IGZhc3Rlc3QgPSBzb3J0ZWRSZXN1bHRzWzBdO1xuXG4gICAgICBzb3J0ZWRSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmUgPSByZXN1bHQuYXZnRHVyYXRpb24gLyBmYXN0ZXN0LmF2Z0R1cmF0aW9uO1xuICAgICAgICBsZXQgaWNvbiA9ICcgICc7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkgaWNvbiA9ICfwn6WHJztcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IDEpIGljb24gPSAn8J+liCc7XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSAyKSBpY29uID0gJ/CfpYknO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgICAke2ljb259ICR7cmVzdWx0Lm5hbWUucGFkRW5kKDI1KX0gfCAke3Jlc3VsdC5hdmdEdXJhdGlvbi50b0ZpeGVkKFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfW1zIHwgJHtyZWxhdGl2ZS50b0ZpeGVkKDIpfXhgLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBcXG7inIUgU3VpdGUgY29tcGxldGVkOiAke3Jlc3VsdHMubGVuZ3RofS8ke3RoaXMuYmVuY2htYXJrcy5sZW5ndGh9IGJlbmNobWFya3Mgc3VjY2Vzc2Z1bFxcbmAsXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGJlbmNobWFya3MgaW4gdGhlIHN1aXRlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJlbmNobWFya3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBiZW5jaG1hcmtzIGZyb20gdGhlIHN1aXRlXG4gICAqL1xuICBjbGVhcigpOiB0aGlzIHtcbiAgICB0aGlzLmJlbmNobWFya3MgPSBbXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBiZW5jaG1hcmsgc3VpdGVcbiAqXG4gKiBAcGFyYW0gc3VpdGVOYW1lIC0gTmFtZSBvZiB0aGUgYmVuY2htYXJrIHN1aXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERlZmF1bHQgb3B0aW9ucyBmb3IgYWxsIGJlbmNobWFya3MgaW4gdGhlIHN1aXRlXG4gKiBAcmV0dXJucyBOZXcgQmVuY2htYXJrU3VpdGUgaW5zdGFuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3VpdGUgPSBjcmVhdGVCZW5jaG1hcmtTdWl0ZSgnU3RyaW5nIE9wZXJhdGlvbnMnLCB7XG4gKiAgIGl0ZXJhdGlvbnM6IDEwLFxuICogICB3YXJtdXBSdW5zOiAyXG4gKiB9KTtcbiAqXG4gKiBzdWl0ZVxuICogICAuYWRkKCdjb25jYXQnLCAoKSA9PiBzdHIxICsgc3RyMilcbiAqICAgLmFkZCgndGVtcGxhdGUnLCAoKSA9PiBgJHtzdHIxfSR7c3RyMn1gKVxuICogICAuYWRkKCdqb2luJywgKCkgPT4gW3N0cjEsIHN0cjJdLmpvaW4oJycpKTtcbiAqXG4gKiBhd2FpdCBzdWl0ZS5ydW4oKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmVuY2htYXJrU3VpdGUoXG4gIHN1aXRlTmFtZTogc3RyaW5nLFxuICBvcHRpb25zPzogQmVuY2htYXJrT3B0aW9ucyxcbik6IEJlbmNobWFya1N1aXRlIHtcbiAgcmV0dXJuIG5ldyBCZW5jaG1hcmtTdWl0ZShzdWl0ZU5hbWUsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gbWVhc3VyZSBtZW1vcnkgdXNhZ2Ugb2YgYSBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSBmbiAtIEZ1bmN0aW9uIHRvIG1lYXN1cmVcbiAqIEBwYXJhbSBmb3JjZUdDIC0gV2hldGhlciB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIG1lYXN1cmluZ1xuICogQHJldHVybnMgTWVtb3J5IHVzYWdlIGluIGJ5dGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1lbW9yeVVzZWQgPSBhd2FpdCBtZWFzdXJlTWVtb3J5KCgpID0+IHtcbiAqICAgcmV0dXJuIG5ldyBBcnJheSgxMDAwMDApLmZpbGwoMCkubWFwKHggPT4gKHsgdmFsdWU6IHggfSkpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYE1lbW9yeSB1c2VkOiAkeyhtZW1vcnlVc2VkIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMil9TUJgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWVhc3VyZU1lbW9yeShmbjogQmVuY2htYXJrRnVuY3Rpb24sIGZvcmNlR0MgPSB0cnVlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKGZvcmNlR0MpIHtcbiAgICBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XG4gIH1cblxuICBjb25zdCBzdGFydE1lbW9yeSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZDtcbiAgYXdhaXQgZm4oKTtcbiAgY29uc3QgZW5kTWVtb3J5ID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkO1xuXG4gIHJldHVybiBlbmRNZW1vcnkgLSBzdGFydE1lbW9yeTtcbn1cbiJdfQ==
@@ -137,16 +137,33 @@ export declare const generateRandomString: (length?: number) => string;
137
137
  */
138
138
  export declare const flattenQueryParams: (qParams: Record<string, any | any[]>) => Record<string, any>;
139
139
  /**
140
- * Recursively freezes an object and all its properties.
141
- * This makes the object and its nested properties immutable.
142
- *
143
- * @template T - The type of the object to freeze
144
- * @param {T} obj - The object to freeze
145
- * @returns {Readonly<T>} - The frozen object
140
+ * Locks a property of an object, making it immutable.
141
+ * @param obj - The object to lock the property of.
142
+ * @param key - The key of the property to lock.
143
+ * @returns The object with the property locked.
144
+ */
145
+ export declare const lockProperty: <T extends object, K extends keyof T>(obj: T, key: K) => T;
146
+ /**
147
+ * Deep freezes an object, making it immutable.
148
+ * @param obj - The object to deep freeze.
149
+ * @returns {T | Readonly<T>} - If `propKey` is provided, returns the original object `T` with `obj[propKey]` deep frozen and `propKey` locked. Otherwise, returns a `Readonly<T>` version of the entire object.
146
150
  *
147
151
  * @example
148
152
  * const config = deepFreeze({ api: { key: 'secret', timeout: 1000 } });
149
153
  * // Attempting to modify config.api.key will throw an error in strict mode
150
154
  */
151
- export declare const deepFreeze: <T>(obj: T) => Readonly<T>;
155
+ export declare const deepFreeze: <T extends Record<string, unknown>>(obj: T) => Readonly<T>;
156
+ /**
157
+ * Deep freezes a specific property of an object and locks that property from reassignment.
158
+ * @template T - The type of the object.
159
+ * @param {T} obj - The object containing the property to freeze.
160
+ * @param {keyof T} propKey - The key of the property to deep freeze and lock.
161
+ * @returns {T} - The original object `T` with `obj[propKey]` deep frozen and `propKey` locked.
162
+ *
163
+ * @example
164
+ * const myObject = { data: { value: 123 } };
165
+ * deepFreezeProperty(myObject, 'data');
166
+ * // myObject.data is now immutable, and myObject.data cannot be reassigned.
167
+ */
168
+ export declare const deepFreezeProperty: <T extends Record<string, unknown>>(obj: T, propKey: keyof T) => T;
152
169
  //# sourceMappingURL=misc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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"}