sliftutils 1.7.67 → 1.7.69
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/dist/test.ts.cache +3 -3
- package/index.d.ts +68 -14
- package/package.json +1 -1
- package/storage/ArchivesDisk.d.ts +2 -2
- package/storage/ArchivesDisk.ts +8 -4
- package/storage/IArchives.d.ts +15 -2
- package/storage/IArchives.ts +19 -3
- package/storage/backblaze.d.ts +2 -2
- package/storage/backblaze.ts +20 -3
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/IArchives.ts.cache +3 -3
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +2 -2
- package/storage/remoteStorage/ArchivesRemote.ts +3 -3
- package/storage/remoteStorage/accessStats.d.ts +25 -0
- package/storage/remoteStorage/accessStats.ts +86 -0
- package/storage/remoteStorage/blobStore.d.ts +1 -0
- package/storage/remoteStorage/blobStore.ts +31 -12
- package/storage/remoteStorage/createArchives.d.ts +2 -2
- package/storage/remoteStorage/createArchives.ts +6 -3
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +78 -0
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +51 -14
- package/storage/remoteStorage/dist/storageServerState.ts.cache +25 -74
- package/storage/remoteStorage/storageController.d.ts +9 -1
- package/storage/remoteStorage/storageController.ts +52 -11
- package/storage/remoteStorage/storageServerState.d.ts +6 -3
- package/storage/remoteStorage/storageServerState.ts +46 -73
- package/test.ts +1 -1
- package/treeSummary.d.ts +31 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SummaryEntry } from "../../treeSummary";
|
|
2
|
+
export type AccessSummaryState = {
|
|
3
|
+
total: number;
|
|
4
|
+
};
|
|
5
|
+
export type AccessTotals = {
|
|
6
|
+
[operation: string]: {
|
|
7
|
+
count: number;
|
|
8
|
+
size: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
/** Counts one storage access, in memory only. size is the bytes involved (0 when the target does not exist); omit it entirely for operations that only count calls, which then only get a count tree. */
|
|
12
|
+
export declare function trackAccess(config: {
|
|
13
|
+
account: string;
|
|
14
|
+
operation: string;
|
|
15
|
+
path: string;
|
|
16
|
+
size?: number;
|
|
17
|
+
}): void;
|
|
18
|
+
export declare function getAccessTotals(account: string): AccessTotals;
|
|
19
|
+
export declare function readAccessSummaries(config: {
|
|
20
|
+
account: string;
|
|
21
|
+
operation: string;
|
|
22
|
+
maxCount: number;
|
|
23
|
+
weightBySize?: boolean;
|
|
24
|
+
}): SummaryEntry<AccessSummaryState>[];
|
|
25
|
+
export declare function clearAccountAccessStats(account: string): void;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { TreeSummary, SummaryEntry } from "../../treeSummary";
|
|
2
|
+
|
|
3
|
+
const EXPECTED_OUTPUT_COUNT = 100;
|
|
4
|
+
|
|
5
|
+
export type AccessSummaryState = { total: number };
|
|
6
|
+
export type AccessTotals = { [operation: string]: { count: number; size: number } };
|
|
7
|
+
|
|
8
|
+
type AccessValue = { path: string; size: number };
|
|
9
|
+
type OperationStats = {
|
|
10
|
+
totalCount: number;
|
|
11
|
+
totalSize: number;
|
|
12
|
+
countTree: TreeSummary<AccessValue, AccessSummaryState>;
|
|
13
|
+
// Only exists for operations tracked with sizes; count-only operations (getInfo, del, ...) have no meaningful size breakdown.
|
|
14
|
+
sizeTree?: TreeSummary<AccessValue, AccessSummaryState>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const accounts = new Map<string, Map<string, OperationStats>>();
|
|
18
|
+
|
|
19
|
+
function makeTree(getValue: (value: AccessValue) => number): TreeSummary<AccessValue, AccessSummaryState> {
|
|
20
|
+
return new TreeSummary<AccessValue, AccessSummaryState>({
|
|
21
|
+
getPath: value => value.path,
|
|
22
|
+
createSummary: () => ({ total: 0 }),
|
|
23
|
+
addToSummary: (value, summary) => {
|
|
24
|
+
summary.total += getValue(value);
|
|
25
|
+
},
|
|
26
|
+
mergeSummaries: (target, source) => {
|
|
27
|
+
target.total += source.total;
|
|
28
|
+
},
|
|
29
|
+
getWeight: summary => summary.total,
|
|
30
|
+
expectedOutputCount: EXPECTED_OUTPUT_COUNT,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Counts one storage access, in memory only. size is the bytes involved (0 when the target does not exist); omit it entirely for operations that only count calls, which then only get a count tree. */
|
|
35
|
+
export function trackAccess(config: { account: string; operation: string; path: string; size?: number }): void {
|
|
36
|
+
let operations = accounts.get(config.account);
|
|
37
|
+
if (!operations) {
|
|
38
|
+
operations = new Map();
|
|
39
|
+
accounts.set(config.account, operations);
|
|
40
|
+
}
|
|
41
|
+
let stats = operations.get(config.operation);
|
|
42
|
+
if (!stats) {
|
|
43
|
+
stats = { totalCount: 0, totalSize: 0, countTree: makeTree(() => 1) };
|
|
44
|
+
operations.set(config.operation, stats);
|
|
45
|
+
}
|
|
46
|
+
let value: AccessValue = { path: config.path, size: config.size || 0 };
|
|
47
|
+
stats.totalCount++;
|
|
48
|
+
stats.countTree.add(value);
|
|
49
|
+
if (config.size !== undefined) {
|
|
50
|
+
let sizeTree = stats.sizeTree;
|
|
51
|
+
if (!sizeTree) {
|
|
52
|
+
sizeTree = makeTree(v => v.size);
|
|
53
|
+
stats.sizeTree = sizeTree;
|
|
54
|
+
}
|
|
55
|
+
stats.totalSize += config.size;
|
|
56
|
+
sizeTree.add(value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getAccessTotals(account: string): AccessTotals {
|
|
61
|
+
let result: AccessTotals = {};
|
|
62
|
+
let operations = accounts.get(account);
|
|
63
|
+
if (!operations) return result;
|
|
64
|
+
for (let [operation, stats] of operations) {
|
|
65
|
+
result[operation] = { count: stats.totalCount, size: stats.totalSize };
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function readAccessSummaries(config: { account: string; operation: string; maxCount: number; weightBySize?: boolean }): SummaryEntry<AccessSummaryState>[] {
|
|
71
|
+
let operations = accounts.get(config.account);
|
|
72
|
+
let stats = operations && operations.get(config.operation);
|
|
73
|
+
if (!stats) return [];
|
|
74
|
+
// Count-only operations have no size tree, in which case weightBySize is ignored and the count breakdown is returned.
|
|
75
|
+
let sizeTree = stats.sizeTree;
|
|
76
|
+
if (config.weightBySize && sizeTree) {
|
|
77
|
+
return sizeTree.getSummaries(config.maxCount);
|
|
78
|
+
}
|
|
79
|
+
return stats.countTree.getSummaries(config.maxCount);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function clearAccountAccessStats(account: string): void {
|
|
83
|
+
if (accounts.delete(account)) {
|
|
84
|
+
console.log(`Cleared the in-memory access statistics for account ${account}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -175,6 +175,7 @@ export declare class BlobStore implements IBucketStore {
|
|
|
175
175
|
private cacheRead;
|
|
176
176
|
set(key: string, data: Buffer, config?: WriteConfig): Promise<string>;
|
|
177
177
|
del(key: string, config?: WriteConfig): Promise<void>;
|
|
178
|
+
private setOrDelete;
|
|
178
179
|
private getWritableSources;
|
|
179
180
|
private writeToSources;
|
|
180
181
|
getInfo(key: string, config?: GetInfoConfig): Promise<{
|
|
@@ -674,9 +674,9 @@ export class BlobStore implements IBucketStore {
|
|
|
674
674
|
if (theirTime !== undefined && theirTime >= entry.writeTime) continue;
|
|
675
675
|
try {
|
|
676
676
|
if (entry.size === 0) {
|
|
677
|
-
// A deletion only needs pushing while the source still holds an older copy
|
|
677
|
+
// A deletion only needs pushing while the source still holds an older copy. It travels as del (never as an empty set - set rejects empty buffers), with the ORIGINAL deletion time so ordering survives.
|
|
678
678
|
if (theirTime === undefined) continue;
|
|
679
|
-
await source.
|
|
679
|
+
await source.del(key, { lastModified: entry.writeTime, noChecks: true, internal: true });
|
|
680
680
|
pushed++;
|
|
681
681
|
consecutiveFailures = 0;
|
|
682
682
|
continue;
|
|
@@ -893,7 +893,8 @@ export class BlobStore implements IBucketStore {
|
|
|
893
893
|
if (holderArchives) {
|
|
894
894
|
try {
|
|
895
895
|
let answer = await holderArchives.get2(key, { range, internal: true });
|
|
896
|
-
|
|
896
|
+
// Empty data counts as absent: an empty file IS a deletion (a tombstone stored on b2/disk), never content. NOTE: a ranged read of a real file can legitimately be empty (range past EOF), so only unranged emptiness means absent.
|
|
897
|
+
if (answer && answer.data && (answer.data.length || range && answer.size)) {
|
|
897
898
|
result = { data: answer.data, writeTime: answer.writeTime, size: answer.size };
|
|
898
899
|
}
|
|
899
900
|
} catch (e) {
|
|
@@ -919,7 +920,8 @@ export class BlobStore implements IBucketStore {
|
|
|
919
920
|
let fallback: { data: Buffer; writeTime: number; size: number } | undefined;
|
|
920
921
|
try {
|
|
921
922
|
let answer = await this.sources[i].source.get2(key, { internal: true });
|
|
922
|
-
|
|
923
|
+
// Empty data counts as absent - a tombstone, not content (this read is unranged, so emptiness is unambiguous)
|
|
924
|
+
if (answer && answer.data && answer.data.length) {
|
|
923
925
|
fallback = { data: answer.data, writeTime: answer.writeTime, size: answer.size };
|
|
924
926
|
}
|
|
925
927
|
} catch {
|
|
@@ -943,7 +945,10 @@ export class BlobStore implements IBucketStore {
|
|
|
943
945
|
public async getInternal2(key: string, config?: GetConfig): Promise<{ data: Buffer; writeTime: number; size: number } | undefined> {
|
|
944
946
|
await this.init();
|
|
945
947
|
let result = await this.getDiskSource().disk.get2(key, { range: config?.range });
|
|
946
|
-
|
|
948
|
+
if (!result || !result.data) return undefined;
|
|
949
|
+
// An empty file on disk is a tombstone, not content (a ranged read of a real file can be legitimately empty though - range past EOF)
|
|
950
|
+
if (!result.data.length && !(config?.range && result.size)) return undefined;
|
|
951
|
+
return { data: result.data, writeTime: result.writeTime, size: result.size };
|
|
947
952
|
}
|
|
948
953
|
|
|
949
954
|
/** Internal (store-to-store) write: the local disk plus our index, with NO downstream fan-out - the pushing store owns propagation, and fanning its pushes back out is how write loops between stores form. Window/route acceptance is the caller's (writeBucketFile's) job; only-take-latest still applies here. */
|
|
@@ -970,6 +975,19 @@ export class BlobStore implements IBucketStore {
|
|
|
970
975
|
}
|
|
971
976
|
|
|
972
977
|
public async set(key: string, data: Buffer, config?: WriteConfig): Promise<string> {
|
|
978
|
+
if (!data.length) {
|
|
979
|
+
throw new Error(`set was called with an empty buffer for ${JSON.stringify(key)} (store ${this.folder}): an empty file IS a deletion in this system and would read back as missing - call del instead`);
|
|
980
|
+
}
|
|
981
|
+
return await this.setOrDelete(key, data, config);
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
public async del(key: string, config?: WriteConfig): Promise<void> {
|
|
985
|
+
// Deletes are tombstone writes (an empty file IS a missing file): the size-0 index entry is ordered by write time like any other write, propagates through synchronization, and expires after TOMBSTONE_EXPIRY
|
|
986
|
+
await this.setOrDelete(key, Buffer.alloc(0), config);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
// The shared engine of set and del: an empty buffer is exactly a deletion here, which is why the empty-buffer rejection lives in set (the public API), not in this machinery
|
|
990
|
+
private async setOrDelete(key: string, data: Buffer, config?: WriteConfig): Promise<string> {
|
|
973
991
|
await this.init();
|
|
974
992
|
this.config?.onWriteCounted?.("original", data.length);
|
|
975
993
|
let lastModified = config?.lastModified;
|
|
@@ -1004,11 +1022,6 @@ export class BlobStore implements IBucketStore {
|
|
|
1004
1022
|
return key;
|
|
1005
1023
|
}
|
|
1006
1024
|
|
|
1007
|
-
public async del(key: string, config?: WriteConfig): Promise<void> {
|
|
1008
|
-
// Deletes are tombstone writes (an empty file IS a missing file): the size-0 index entry is ordered by write time like any other write, propagates through synchronization, and expires after TOMBSTONE_EXPIRY
|
|
1009
|
-
await this.set(key, Buffer.alloc(0), config);
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
1025
|
private getWritableSources(config?: { ignoreWindow?: boolean }): number[] {
|
|
1013
1026
|
let writable: number[] = [];
|
|
1014
1027
|
for (let i = 0; i < this.sources.length; i++) {
|
|
@@ -1040,8 +1053,14 @@ export class BlobStore implements IBucketStore {
|
|
|
1040
1053
|
let route = getRoute(key);
|
|
1041
1054
|
for (let i of writable) {
|
|
1042
1055
|
if (!routeContains(this.sources[i].route, route)) continue;
|
|
1043
|
-
//
|
|
1044
|
-
|
|
1056
|
+
// Deletions travel as del carrying the original write time (never as empty sets - set rejects empty buffers). Backblaze materializes such dels as real empty files, so its listings still show the deletion for other stores to scan in as a tombstone.
|
|
1057
|
+
let push: Promise<unknown>;
|
|
1058
|
+
if (data.length === 0) {
|
|
1059
|
+
push = this.sources[i].source.del(key, { lastModified: writeTime, noChecks: true, internal: true });
|
|
1060
|
+
} else {
|
|
1061
|
+
push = this.sources[i].source.set(key, data, { lastModified: writeTime, forceSetImmutable: true, noChecks: true, internal: true });
|
|
1062
|
+
}
|
|
1063
|
+
void push.catch((e: Error) => {
|
|
1045
1064
|
console.error(`Background write of ${key} to sync source ${this.sources[i].source.getDebugName()} failed: ${e.stack ?? e}`);
|
|
1046
1065
|
});
|
|
1047
1066
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { IArchives, RemoteConfig, RemoteConfigBase, HostedConfig, BackblazeConfig, ArchiveFileInfo, ArchivesConfig, ArchivesSyncStatus, ChangesAfterConfig, GetConfig, GetInfoConfig, SetConfig } from "../IArchives";
|
|
3
|
+
import { IArchives, RemoteConfig, RemoteConfigBase, HostedConfig, BackblazeConfig, ArchiveFileInfo, ArchivesConfig, ArchivesSyncStatus, ChangesAfterConfig, DelConfig, GetConfig, GetInfoConfig, SetConfig } from "../IArchives";
|
|
4
4
|
import { ServerBucketInfo, ActiveBucketInfo } from "./storageServerState";
|
|
5
5
|
/** The address, port, account, and bucket name a bucket routing URL addresses. Throws when the URL isn't a hosted bucket routing URL (https://host:port/file/<account>/<bucketName>/storage/storagerouting.json). */
|
|
6
6
|
export { parseHostedUrl, parseBackblazeUrl, getBucketBaseUrl } from "./remoteConfig";
|
|
@@ -96,7 +96,7 @@ export declare class ArchivesChain implements IArchives {
|
|
|
96
96
|
hasWriteAccess(): Promise<boolean>;
|
|
97
97
|
set(fileName: string, data: Buffer, config?: SetConfig): Promise<string>;
|
|
98
98
|
private setRoutingConfig;
|
|
99
|
-
del(fileName: string): Promise<void>;
|
|
99
|
+
del(fileName: string, config?: DelConfig): Promise<void>;
|
|
100
100
|
private getVariableShardTargets;
|
|
101
101
|
/** The key setVariableShard would materialize for this VARIABLE_SHARD key (a value in the preferred shard's route range), without writing anything. */
|
|
102
102
|
getShardKey(key: string): Promise<string>;
|
|
@@ -2,7 +2,7 @@ import { isNode, sort, watchSlowPromise } from "socket-function/src/misc";
|
|
|
2
2
|
import { delay } from "socket-function/src/batching";
|
|
3
3
|
import {
|
|
4
4
|
IArchives, RemoteConfig, RemoteConfigBase, HostedConfig, BackblazeConfig,
|
|
5
|
-
ArchiveFileInfo, ArchivesConfig, ArchivesSyncStatus, ChangesAfterConfig, GetConfig, GetInfoConfig, SetConfig, STORAGE_WRONG_VALID_WINDOW,
|
|
5
|
+
ArchiveFileInfo, ArchivesConfig, ArchivesSyncStatus, ChangesAfterConfig, DelConfig, GetConfig, GetInfoConfig, SetConfig, STORAGE_WRONG_VALID_WINDOW,
|
|
6
6
|
STORAGE_WRONG_ROUTE, FULL_ROUTE, VARIABLE_SHARD,
|
|
7
7
|
} from "../IArchives";
|
|
8
8
|
import {
|
|
@@ -720,6 +720,9 @@ export class ArchivesChain implements IArchives {
|
|
|
720
720
|
}
|
|
721
721
|
|
|
722
722
|
public async set(fileName: string, data: Buffer, config?: SetConfig): Promise<string> {
|
|
723
|
+
if (!data.length) {
|
|
724
|
+
throw new Error(`set was called with an empty buffer for ${JSON.stringify(fileName)}: an empty file IS a deletion in this system and would read back as missing - call del instead`);
|
|
725
|
+
}
|
|
723
726
|
if (fileName === ROUTING_FILE) {
|
|
724
727
|
return await this.setRoutingConfig(data, config);
|
|
725
728
|
}
|
|
@@ -754,8 +757,8 @@ export class ArchivesChain implements IArchives {
|
|
|
754
757
|
}
|
|
755
758
|
return ROUTING_FILE;
|
|
756
759
|
}
|
|
757
|
-
public async del(fileName: string): Promise<void> {
|
|
758
|
-
await this.request({ write: true, route: getRoute(fileName), timeout: { uploadBytes: 0 } }, archives => archives.del(fileName));
|
|
760
|
+
public async del(fileName: string, config?: DelConfig): Promise<void> {
|
|
761
|
+
await this.request({ write: true, route: getRoute(fileName), timeout: { uploadBytes: 0 } }, archives => archives.del(fileName, config));
|
|
759
762
|
}
|
|
760
763
|
|
|
761
764
|
// One write target per route range, lowest latency first. Within a shard the target is ALWAYS the first source in config order (see runPrimary - writes must stay on the same node): connectivity only decides which SHARD we pick, never which node within it, so a shard whose node is disconnected is dropped entirely when connectedOnly is set.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.ArchivesRemote = exports.authenticateStorage = exports.parseStorageUrl = void 0;
|
|
4
4
|
const SocketFunction_1 = require("socket-function/SocketFunction");
|
|
@@ -182,4 +182,4 @@ class ArchivesRemote {
|
|
|
182
182
|
}
|
|
183
183
|
exports.ArchivesRemote = ArchivesRemote;
|
|
184
184
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNSZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1JlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBZ0U7QUFDaEUsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxrREFBNkU7QUFFN0UsaURBQWdGO0FBQ2hGLDJEQUc2QjtBQUU3QixrVkFBa1Y7QUFFbFYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFVN0MsU0FBZ0IsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBTkQsMENBTUM7QUFFRCx1RkFBdUY7QUFDaEYsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXlEO0lBQy9GLG9KQUFvSjtJQUNwSiwrQkFBYyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0Qs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ZXNDb250ZW50IjpbImltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHlDQSwgbG9hZElkZW50aXR5Q0EsIHNpZ24gfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgR2V0Q29uZmlnLCBHZXRJbmZvQ29uZmlnLCBTZXRDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBwYXJzZUhvc3RlZFVybCwgZ2V0QnVja2V0QmFzZVVybCwgYnVpbGRGaWxlVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX0FVVEhfUFVSUE9TRSxcbiAgICBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVELCBTVE9SQUdFX0FDQ0VTU19ERU5JRUQsXG59IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5cbi8vIEEgYnVja2V0IG9uIG91ciByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIgKHN0b3JhZ2VTZXJ2ZXIudHMpLCB1c2VkIGxpa2UgQXJjaGl2ZXNCYWNrYmxhemUuIFdvcmtzIGluIE5vZGUuanMgYW5kIHRoZSBicm93c2VyLiBBdXRoZW50aWNhdGVzIHdpdGggdGhpcyBtYWNoaW5lJ3MgY2VydHMudHMgaWRlbnRpdHk7IGlmIHRoZSBhY2NvdW50IGhhc24ndCB0cnVzdGVkIHRoaXMgbWFjaGluZSB5ZXQgaXQgcmVxdWVzdHMgYWNjZXNzLCBhbmQgYnkgZGVmYXVsdCB3YWl0cywgbG9nZ2luZyBpbnN0cnVjdGlvbnMgZXZlcnkgbWludXRlIChjYWxscyBibG9jayB1bnRpbCBhY2Nlc3MgaXMgZ3JhbnRlZCkuXG5cbmNvbnN0IEFDQ0VTU19SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc1JlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBUaGUgYnVja2V0J3Mgcm91dGluZyBVUkwsIHdoaWNoIGFkZHJlc3NlcyB0aGUgc2VydmVyLCBhY2NvdW50LCBhbmQgYnVja2V0IGluIG9uZTpcbiAgICAvLyAgaHR0cHM6Ly9zdG9yYWdlLmV4YW1wbGUuY29tOjQ0NDQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIGZhbHNlOiBhY2Nlc3MtZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5ICh0aGUgZXJyb3IgaW5jbHVkZXMgdGhlIGFjY2VzcyBwYWdlIGxpbmspIGluc3RlYWQgb2YgcmVxdWVzdGluZyBhY2Nlc3MgYW5kIGJsb2NraW5nIHVudGlsIGl0IGlzIGdyYW50ZWQgKHRoZSBkZWZhdWx0KS5cbiAgICB3YWl0Rm9yQWNjZXNzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0b3JhZ2VVcmwodXJsOiBzdHJpbmcpOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0ge1xuICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGFkZHJlc3M6IHUuaG9zdG5hbWUsIHBvcnQ6ICt1LnBvcnQgfHwgNDQzIH07XG59XG5cbi8vIEF1dGhlbnRpY2F0ZXMgYSBjb25uZWN0aW9uIHRvIGEgc3RvcmFnZSBzZXJ2ZXIgd2l0aCB0aGlzIG1hY2hpbmUncyBjZXJ0cy50cyBpZGVudGl0eVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZVN0b3JhZ2UoY29uZmlnOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyOyBub2RlSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAvLyBob3N0U2VydmVyIG5vZGVJZHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMsIHNvIGNvbm5lY3Rpb25zIGJ5IGRvbWFpbiBtdXN0IHRhcmdldCBcImFueSBzZXJ2ZXIgYXQgdGhpcyBhZGRyZXNzXCIgKHdoaWNoIGlzIGhvdyBicm93c2VycyBhbHdheXMgY29ubmVjdClcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCByb290RG9tYWluID0gY29uZmlnLmFkZHJlc3Muc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShyb290RG9tYWluKTtcbiAgICBsZXQgY2EgPSBnZXRJZGVudGl0eUNBKHJvb3REb21haW4pO1xuICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwdXJwb3NlOiBTVE9SQUdFX0FVVEhfUFVSUE9TRSxcbiAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgc2VydmVyOiBgJHtjb25maWcuYWRkcmVzc306JHtjb25maWcucG9ydH1gLFxuICAgIH07XG4gICAgbGV0IHNpZ25hdHVyZSA9IHNpZ24oeyBrZXk6IGNhLmtleSB9LCBkYXRhKTtcbiAgICByZXR1cm4gYXdhaXQgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbY29uZmlnLm5vZGVJZF0uYXV0aGVudGljYXRlKHsgY2VydFBlbTogY2EuY2VydC50b1N0cmluZygpLCBzaWduYXR1cmUsIGRhdGEgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc1JlbW90ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IEFyY2hpdmVzUmVtb3RlQ29uZmlnKSB7XG4gICAgICAgIC8vIGhvc3RTZXJ2ZXIgbm9kZUlkcyBhcmUgbWFjaGluZS1zcGVjaWZpYywgc28gY29ubmVjdGlvbnMgYnkgZG9tYWluIG11c3QgdGFyZ2V0IFwiYW55IHNlcnZlciBhdCB0aGlzIGFkZHJlc3NcIiAod2hpY2ggaXMgaG93IGJyb3dzZXJzIGFsd2F5cyBjb25uZWN0KVxuICAgICAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwodGhpcy5jb25maWcudXJsKTtcbiAgICBwcml2YXRlIGFjY291bnQgPSB0aGlzLnBhcnNlZC5hY2NvdW50O1xuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMucGFyc2VkLmJ1Y2tldE5hbWU7XG4gICAgcHJpdmF0ZSBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5jb25uZWN0KHsgYWRkcmVzczogdGhpcy5wYXJzZWQuYWRkcmVzcywgcG9ydDogdGhpcy5wYXJzZWQucG9ydCB9KTtcbiAgICBwcml2YXRlIGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1t0aGlzLm5vZGVJZF07XG4gICAgcHJpdmF0ZSBsYXN0RGVuaWVkTG9nID0gMDtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgcmVtb3RlU3RvcmFnZSAke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0gYWNjb3VudCAke3RoaXMuYWNjb3VudH0gYnVja2V0ICR7dGhpcy5idWNrZXROYW1lfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU29ja2V0RnVuY3Rpb24uaXNOb2RlQ29ubmVjdGVkKHRoaXMubm9kZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcGluZygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRyb2xsZXIucGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXV0aGVudGljYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBhdXRoZW50aWNhdGVTdG9yYWdlKHsgYWRkcmVzczogdGhpcy5wYXJzZWQuYWRkcmVzcywgcG9ydDogdGhpcy5wYXJzZWQucG9ydCwgbm9kZUlkOiB0aGlzLm5vZGVJZCB9KTtcbiAgICB9XG5cbiAgICAvLyBSdW5zIGEgY2FsbCwgYXV0aGVudGljYXRpbmcgKGFuZCByZS1hdXRoZW50aWNhdGluZyBhZnRlciByZWNvbm5lY3RzKSBhcyBuZWVkZWQuIFVubGlrZSBjYWxsKCksIGRvZXMgTk9UIHdhaXQgZm9yIGFjY291bnQgYWNjZXNzLlxuICAgIHByaXZhdGUgYXN5bmMgY2FsbEF1dGhlZDxUPihmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIVN0cmluZyhlLnN0YWNrIHx8IGUpLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB0aHJvdyBlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoaXMgbWFjaGluZSBoYXMgYWNjZXNzIHRvIHRoZSBhY2NvdW50LiBPdGhlcndpc2UgcHV0cyBpbiBhbiBhY2Nlc3MgcmVxdWVzdCBhbmQgcmV0dXJucyBvdXIgbWFjaGluZUlkICsgaXAgKHNvIHRoZSBjYWxsZXIgY2FuIGRpc3BsYXkgdGhlbSBhbG9uZ3NpZGUgdGhlIGxpbmssIGZvciB0aGUgYXBwcm92ZXIgdG8gbWF0Y2ggdGhlIGluY29taW5nIHJlcXVlc3QpIGFuZCB0aGUgbGluayB0byB0aGUgZ3JhbnQgcGFnZS5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdGluZ0ZvckFjY2VzcygpOiBQcm9taXNlPHsgbGluazogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjZXNzU3RhdGUodGhpcy5hY2NvdW50KSk7XG4gICAgICAgIGlmIChzdGF0ZS5oYXNBY2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByZXF1ZXN0ZWQgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLnJlcXVlc3RBY2Nlc3ModGhpcy5hY2NvdW50KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5rOiBgaHR0cHM6Ly8ke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0vJHt0aGlzLmFjY291bnR9YCxcbiAgICAgICAgICAgIG1hY2hpbmVJZDogcmVxdWVzdGVkLm1hY2hpbmVJZCxcbiAgICAgICAgICAgIGlwOiByZXF1ZXN0ZWQuaXAsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEFjY2Vzc1N0YXRlKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICByZXR1cm4gISFzdGF0ZS5oYXNBY2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSAoc28gYW4gYWRtaW4gaGFzIGEgcmVxdWVzdElkIHRvIGdyYW50KSBhbmQgbG9ncyB0aGUgZ3JhbnQgaW5zdHJ1Y3Rpb25zLCBhdCBtb3N0IG9uY2UgYSBtaW51dGVcbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RlZCA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIucmVxdWVzdEFjY2Vzcyh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3REZW5pZWRMb2cgPiB0aW1lSW5NaW51dGUpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdERlbmllZExvZyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTm8gYWNjZXNzIHRvIHN0b3JhZ2UgYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KHRoaXMuYWNjb3VudCl9IG9uICR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fSAob3VyIG1hY2hpbmUgJHtyZXF1ZXN0ZWQubWFjaGluZUlkfSwgaXAgJHtyZXF1ZXN0ZWQuaXB9KS4gU2VlIGh0dHBzOi8vJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fSAtIG9yIGdyYW50IGl0IHdpdGg6ICR7cmVxdWVzdGVkLmdyYW50QWNjZXNzQ29tbWFuZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1bnMgYSBjYWxsLCBhdXRoZW50aWNhdGluZyAoYW5kIHJlLWF1dGhlbnRpY2F0aW5nIGFmdGVyIHJlY29ubmVjdHMpIGFuZCB3YWl0aW5nIGZvciBhY2NvdW50IGFjY2VzcyBhcyBuZWVkZWQuIFdpdGggd2FpdEZvckFjY2VzcyBmYWxzZSwgZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5IGluc3RlYWQgLSBidXQgdGhlIGFjY2VzcyByZXF1ZXN0IGlzIHN0aWxsIHJlZ2lzdGVyZWQgKGluIHRoZSBiYWNrZ3JvdW5kKSwgc28gdGhlIGRlbmlhbCBpcyBncmFudGFibGUuXG4gICAgcHJpdmF0ZSBhc3luYyBjYWxsPFQ+KGZuYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZyhlLnN0YWNrIHx8IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX0FDQ0VTU19ERU5JRUQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy53YWl0Rm9yQWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBY2Nlc3NSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KEFDQ0VTU19SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldDIodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lLCBjb25maWc/LnJhbmdlLCBjb25maWc/LmludGVybmFsKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgeyBkYXRhOiBCdWZmZXIuZnJvbShyZXN1bHQuZGF0YSksIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLnNldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZz8ubGFzdE1vZGlmaWVkLCBjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlLCBjb25maWc/LmludGVybmFsKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZGVsKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmZpbmRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBwcmVmaXgsIGNvbmZpZykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldENoYW5nZXNBZnRlcjIodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGNvbmZpZykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QXJjaGl2ZXNDb25maWcodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0U3luY1N0YXR1cyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBFbnN1cmUgd2UncmUgYXV0aGVudGljYXRlZCB3aXRoIGFjY2VzcyBCRUZPUkUgY29uc3VtaW5nIGFueSBkYXRhICh0aGUgc3RyZWFtIGNhbm5vdCBiZSByZXdvdW5kLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIHJldHJ5IGxvb3AgYXJvdW5kIHRoZSBhY3R1YWwgdXBsb2FkKVxuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEluZm8odGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGNvbmZpZy5wYXRoKSk7XG4gICAgICAgIGxldCB1cGxvYWRJZCA9IGF3YWl0IHRoaXMuY29udHJvbGxlci5zdGFydExhcmdlRmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGF0YS5sZW5ndGg7IG9mZnNldCArPSBMQVJHRV9GSUxFX1BBUlRfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIudXBsb2FkUGFydCh1cGxvYWRJZCwgZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLmZpbmlzaExhcmdlRmlsZSh1cGxvYWRJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLmNhbmNlbExhcmdlRmlsZSh1cGxvYWRJZCk7XG4gICAgICAgICAgICB9IGNhdGNoIHsgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gT25seSBhY3R1YWxseSBsb2FkcyBmb3IgcHVibGljIGJ1Y2tldHMgKHRoZSBzZXJ2ZXIgcmVqZWN0cyBwbGFpbiBVUkwgcmVhZHMgb3RoZXJ3aXNlKVxuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwodGhpcy5jb25maWcudXJsKSwgcGF0aCk7XG4gICAgfVxufVxuIl19
|
|
185
|
-
/* _JS_SOURCE_HASH = "
|
|
185
|
+
/* _JS_SOURCE_HASH = "7643a4f7eb91fc3d67bb4fcb65557d9e582fafbeba72cf7b7a3bb44921966139"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.ArchivesUrl = void 0;
|
|
4
4
|
const https_1 = require("socket-function/src/https");
|
|
@@ -99,4 +99,4 @@ class ArchivesUrl {
|
|
|
99
99
|
}
|
|
100
100
|
exports.ArchivesUrl = ArchivesUrl;
|
|
101
101
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNVcmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1VybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBNEU7QUFFNUUsaURBQThDO0FBRTlDLGtGQUFrRjtBQUNsRixnTUFBZ007QUFFaE0sTUFBYSxXQUFXO0lBQ3BCLDJGQUEyRjtJQUMzRixZQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFJLENBQUM7SUFFOUIsWUFBWTtRQUNmLE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyx5R0FBeUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkosQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFrQjtRQUNqRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsTUFBa0I7UUFDbEQsSUFBSSxHQUFHLEdBQUcsSUFBQSwyQkFBWSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDO1FBQzFCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFF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LENBQUMsR0FBRyxDQUFDLFFBQWdCO1FBQzdCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ00sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFvRTtRQUMxRixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQXlEO1FBQ3ZGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDTSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxNQUF5RDtRQUMzRixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ00sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQTBCO1FBQ3BELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFBLDJCQUFZLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ00sS0FBSyxDQUFDLFNBQVM7UUFDbEIsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBMUZELGtDQTBGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGh0dHBzUmVxdWVzdCwgSHR0cHNSZXNwb25zZUluZm8gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9odHRwc1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGJ1aWxkRmlsZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vLyBSZWFkLW9ubHkgSUFyY2hpdmVzIG92ZXIgYSBwdWJsaWMgYnVja2V0J3MgcGxhaW4tVVJMIGZvcm0gKG91ciBzdG9yYWdlIHNlcnZlcidzXG4vLyAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiByb3V0ZSwgb3IgYSBiYWNrYmxhemUgZnJpZW5kbHkgVVJMKS4gVXNlZCB3aGVuIHdlIGhhdmUgbm8gQVBJIGFjY2VzcyB0byBhIHNvdXJjZS4gT25seSBzaW5nbGUtZmlsZSByZWFkcyB3b3JrOiB0aGVyZSBpcyBubyBsaXN0aW5nLCBhbmQgd3JpdGVzIGFsd2F5cyB0aHJvdy5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzVXJsIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICAvLyBiYXNlIGlzIHRoZSBidWNrZXQncyBwdWJsaWMgYmFzZSBVUkwsIGUuZy4gaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXNlOiBzdHJpbmcpIHsgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGB1cmwgJHt0aGlzLmJhc2V9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRPbmx5RXJyb3Iob3BlcmF0aW9uOiBzdHJpbmcpOiBFcnJvciB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgVVJMLWZvcm0gYWNjZXNzIChubyBBUEkgYWNjZXNzIHRvIHRoaXMgc291cmNlLCBvbmx5IHB1YmxpYyBVUkwgcmVhZHMpLiBTb3VyY2U6ICR7dGhpcy5iYXNlfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgdXJsID0gYnVpbGRGaWxlVXJsKHRoaXMuYmFzZSwgZmlsZU5hbWUpO1xuICAgICAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IGBieXRlcz0ke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICBsZXQgZGF0YTogQnVmZmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGh0dHBzUmVxdWVzdCh1cmwsIHVuZGVmaW5lZCwgXCJHRVRcIiwgZmFsc2UsIHsgaGVhZGVycywgb3V0UmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBodHRwc1JlcXVlc3QgdGhyb3dzIG9uIGFueSBub24tMnh4OyBhIG1pc3NpbmcgZmlsZSBpcyBhIG5vcm1hbCBhYnNlbnQgcmVzdWx0LCBub3QgYW4gZXJyb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHJlYWwgMjA2IG9ubHkgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHNsaWNlLCBzbyB0aGUgZnVsbCBzaXplIGxpdmVzIGluIENvbnRlbnQtUmFuZ2UncyB0b3RhbC5cbiAgICAgICAgbGV0IHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgICAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgICAgICBpZiAodG90YWwgJiYgTnVtYmVyLmlzRmluaXRlKHRvdGFsKSkge1xuICAgICAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlcnZlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHJhbmdlcyByZXR1cm4gdGhlIGZ1bGwgZmlsZSB3aXRoIGEgMjAwIChvdXJzIHNlcnZlcyByZWFsIDIwNnMsIGJ1dCBiYWNrYmxhemUgZnJpZW5kbHkgVVJMcyBhbmQgcHJveGllcyBtYXkgbm90KVxuICAgICAgICBpZiAocmFuZ2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IHJlc3BvbnNlLmhlYWRlcnNbXCJsYXN0LW1vZGlmaWVkXCJdO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gbGFzdE1vZGlmaWVkICYmIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkuZ2V0VGltZSgpIHx8IDA7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZSwgc2l6ZSB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAvLyBBIDEtYnl0ZSByYW5nZWQgcmVhZDogQ29udGVudC1SYW5nZSBjYXJyaWVzIHRoZSBmdWxsIHNpemUgYW5kIExhc3QtTW9kaWZpZWQgdGhlIHdyaXRlIHRpbWUsIHNvIG1ldGFkYXRhIG5ldmVyIGRvd25sb2FkcyB0aGUgZmlsZVxuICAgICAgICBsZXQgcmVzdWx0OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgeyByYW5nZTogeyBzdGFydDogMCwgZW5kOiAxIH0gfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU29tZSBzZXJ2ZXJzIHJlamVjdCByYW5nZWQgcmVhZHMgb2YgZW1wdHkgZmlsZXMgKDQxNiBpbnN0ZWFkIG9mIGFuIGVtcHR5IDIwNik7IGEgZnVsbCByZWFkIGlzIHRoZSBmYWxsYmFjaywgYW5kIGZvciBhbiBlbXB0eSBmaWxlIGl0IGlzIGZyZWUgYW55d2F5XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXJlc3VsdC5zaXplICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJzZXRcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJkZWxcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwic2V0TGFyZ2VGaWxlXCIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwiZmluZCAobGlzdGluZylcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwiZmluZEluZm8gKGxpc3RpbmcpXCIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwiZ2V0Q2hhbmdlc0FmdGVyMiAobGlzdGluZylcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKHRoaXMuYmFzZSwgcGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19
|
|
102
|
-
/* _JS_SOURCE_HASH = "
|
|
102
|
+
/* _JS_SOURCE_HASH = "240f0553a33aeccfa5eb4c1317f2d12d415b7cbccd0668b3d1ba72660640c1ce"; */
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.clearAccountAccessStats = exports.readAccessSummaries = exports.getAccessTotals = exports.trackAccess = void 0;
|
|
4
|
+
const treeSummary_1 = require("../../treeSummary");
|
|
5
|
+
const EXPECTED_OUTPUT_COUNT = 100;
|
|
6
|
+
const accounts = new Map();
|
|
7
|
+
function makeTree(getValue) {
|
|
8
|
+
return new treeSummary_1.TreeSummary({
|
|
9
|
+
getPath: value => value.path,
|
|
10
|
+
createSummary: () => ({ total: 0 }),
|
|
11
|
+
addToSummary: (value, summary) => {
|
|
12
|
+
summary.total += getValue(value);
|
|
13
|
+
},
|
|
14
|
+
mergeSummaries: (target, source) => {
|
|
15
|
+
target.total += source.total;
|
|
16
|
+
},
|
|
17
|
+
getWeight: summary => summary.total,
|
|
18
|
+
expectedOutputCount: EXPECTED_OUTPUT_COUNT,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Counts one storage access, in memory only. size is the bytes involved (0 when the target does not exist); omit it entirely for operations that only count calls, which then only get a count tree. */
|
|
22
|
+
function trackAccess(config) {
|
|
23
|
+
let operations = accounts.get(config.account);
|
|
24
|
+
if (!operations) {
|
|
25
|
+
operations = new Map();
|
|
26
|
+
accounts.set(config.account, operations);
|
|
27
|
+
}
|
|
28
|
+
let stats = operations.get(config.operation);
|
|
29
|
+
if (!stats) {
|
|
30
|
+
stats = { totalCount: 0, totalSize: 0, countTree: makeTree(() => 1) };
|
|
31
|
+
operations.set(config.operation, stats);
|
|
32
|
+
}
|
|
33
|
+
let value = { path: config.path, size: config.size || 0 };
|
|
34
|
+
stats.totalCount++;
|
|
35
|
+
stats.countTree.add(value);
|
|
36
|
+
if (config.size !== undefined) {
|
|
37
|
+
let sizeTree = stats.sizeTree;
|
|
38
|
+
if (!sizeTree) {
|
|
39
|
+
sizeTree = makeTree(v => v.size);
|
|
40
|
+
stats.sizeTree = sizeTree;
|
|
41
|
+
}
|
|
42
|
+
stats.totalSize += config.size;
|
|
43
|
+
sizeTree.add(value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.trackAccess = trackAccess;
|
|
47
|
+
function getAccessTotals(account) {
|
|
48
|
+
let result = {};
|
|
49
|
+
let operations = accounts.get(account);
|
|
50
|
+
if (!operations)
|
|
51
|
+
return result;
|
|
52
|
+
for (let [operation, stats] of operations) {
|
|
53
|
+
result[operation] = { count: stats.totalCount, size: stats.totalSize };
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
exports.getAccessTotals = getAccessTotals;
|
|
58
|
+
function readAccessSummaries(config) {
|
|
59
|
+
let operations = accounts.get(config.account);
|
|
60
|
+
let stats = operations && operations.get(config.operation);
|
|
61
|
+
if (!stats)
|
|
62
|
+
return [];
|
|
63
|
+
// Count-only operations have no size tree, in which case weightBySize is ignored and the count breakdown is returned.
|
|
64
|
+
let sizeTree = stats.sizeTree;
|
|
65
|
+
if (config.weightBySize && sizeTree) {
|
|
66
|
+
return sizeTree.getSummaries(config.maxCount);
|
|
67
|
+
}
|
|
68
|
+
return stats.countTree.getSummaries(config.maxCount);
|
|
69
|
+
}
|
|
70
|
+
exports.readAccessSummaries = readAccessSummaries;
|
|
71
|
+
function clearAccountAccessStats(account) {
|
|
72
|
+
if (accounts.delete(account)) {
|
|
73
|
+
console.log(`Cleared the in-memory access statistics for account ${account}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.clearAccountAccessStats = clearAccountAccessStats;
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzU3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhY2Nlc3NTdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBOEQ7QUFFOUQsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFjbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXVDLENBQUM7QUFFaEUsU0FBUyxRQUFRLENBQUMsUUFBd0M7SUFDdEQsT0FBTyxJQUFJLHlCQUFXLENBQWtDO1FBQ3BELE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJO1FBQzVCLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ25DLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM3QixPQUFPLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxDQUFDO1FBQ0QsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUs7UUFDbkMsbUJBQW1CLEVBQUUscUJBQXFCO0tBQzdDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCx5TUFBeU07QUFDek0sU0FBZ0IsV0FBVyxDQUFDLE1BQTJFO0lBQ25HLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNkLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1QsS0FBSyxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUksS0FBSyxHQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzlCLENBQUM7UUFDRCxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDL0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0FBQ0wsQ0FBQztBQXZCRCxrQ0F1QkM7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FBZTtJQUMzQyxJQUFJLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBQzlCLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQVJELDBDQVFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsTUFBd0Y7SUFDeEgsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsSUFBSSxLQUFLLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEIsc0hBQXNIO0lBQ3RILElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUIsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFWRCxrREFVQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQWU7SUFDbkQsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1REFBdUQsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0FBQ0wsQ0FBQztBQUpELDBEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJlZVN1bW1hcnksIFN1bW1hcnlFbnRyeSB9IGZyb20gXCIuLi8uLi90cmVlU3VtbWFyeVwiO1xuXG5jb25zdCBFWFBFQ1RFRF9PVVRQVVRfQ09VTlQgPSAxMDA7XG5cbmV4cG9ydCB0eXBlIEFjY2Vzc1N1bW1hcnlTdGF0ZSA9IHsgdG90YWw6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgQWNjZXNzVG90YWxzID0geyBbb3BlcmF0aW9uOiBzdHJpbmddOiB7IGNvdW50OiBudW1iZXI7IHNpemU6IG51bWJlciB9IH07XG5cbnR5cGUgQWNjZXNzVmFsdWUgPSB7IHBhdGg6IHN0cmluZzsgc2l6ZTogbnVtYmVyIH07XG50eXBlIE9wZXJhdGlvblN0YXRzID0ge1xuICAgIHRvdGFsQ291bnQ6IG51bWJlcjtcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBjb3VudFRyZWU6IFRyZWVTdW1tYXJ5PEFjY2Vzc1ZhbHVlLCBBY2Nlc3NTdW1tYXJ5U3RhdGU+O1xuICAgIC8vIE9ubHkgZXhpc3RzIGZvciBvcGVyYXRpb25zIHRyYWNrZWQgd2l0aCBzaXplczsgY291bnQtb25seSBvcGVyYXRpb25zIChnZXRJbmZvLCBkZWwsIC4uLikgaGF2ZSBubyBtZWFuaW5nZnVsIHNpemUgYnJlYWtkb3duLlxuICAgIHNpemVUcmVlPzogVHJlZVN1bW1hcnk8QWNjZXNzVmFsdWUsIEFjY2Vzc1N1bW1hcnlTdGF0ZT47XG59O1xuXG5jb25zdCBhY2NvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBPcGVyYXRpb25TdGF0cz4+KCk7XG5cbmZ1bmN0aW9uIG1ha2VUcmVlKGdldFZhbHVlOiAodmFsdWU6IEFjY2Vzc1ZhbHVlKSA9PiBudW1iZXIpOiBUcmVlU3VtbWFyeTxBY2Nlc3NWYWx1ZSwgQWNjZXNzU3VtbWFyeVN0YXRlPiB7XG4gICAgcmV0dXJuIG5ldyBUcmVlU3VtbWFyeTxBY2Nlc3NWYWx1ZSwgQWNjZXNzU3VtbWFyeVN0YXRlPih7XG4gICAgICAgIGdldFBhdGg6IHZhbHVlID0+IHZhbHVlLnBhdGgsXG4gICAgICAgIGNyZWF0ZVN1bW1hcnk6ICgpID0+ICh7IHRvdGFsOiAwIH0pLFxuICAgICAgICBhZGRUb1N1bW1hcnk6ICh2YWx1ZSwgc3VtbWFyeSkgPT4ge1xuICAgICAgICAgICAgc3VtbWFyeS50b3RhbCArPSBnZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmdlU3VtbWFyaWVzOiAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIHRhcmdldC50b3RhbCArPSBzb3VyY2UudG90YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFdlaWdodDogc3VtbWFyeSA9PiBzdW1tYXJ5LnRvdGFsLFxuICAgICAgICBleHBlY3RlZE91dHB1dENvdW50OiBFWFBFQ1RFRF9PVVRQVVRfQ09VTlQsXG4gICAgfSk7XG59XG5cbi8qKiBDb3VudHMgb25lIHN0b3JhZ2UgYWNjZXNzLCBpbiBtZW1vcnkgb25seS4gc2l6ZSBpcyB0aGUgYnl0ZXMgaW52b2x2ZWQgKDAgd2hlbiB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0KTsgb21pdCBpdCBlbnRpcmVseSBmb3Igb3BlcmF0aW9ucyB0aGF0IG9ubHkgY291bnQgY2FsbHMsIHdoaWNoIHRoZW4gb25seSBnZXQgYSBjb3VudCB0cmVlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrQWNjZXNzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG9wZXJhdGlvbjogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNpemU/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGxldCBvcGVyYXRpb25zID0gYWNjb3VudHMuZ2V0KGNvbmZpZy5hY2NvdW50KTtcbiAgICBpZiAoIW9wZXJhdGlvbnMpIHtcbiAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgYWNjb3VudHMuc2V0KGNvbmZpZy5hY2NvdW50LCBvcGVyYXRpb25zKTtcbiAgICB9XG4gICAgbGV0IHN0YXRzID0gb3BlcmF0aW9ucy5nZXQoY29uZmlnLm9wZXJhdGlvbik7XG4gICAgaWYgKCFzdGF0cykge1xuICAgICAgICBzdGF0cyA9IHsgdG90YWxDb3VudDogMCwgdG90YWxTaXplOiAwLCBjb3VudFRyZWU6IG1ha2VUcmVlKCgpID0+IDEpIH07XG4gICAgICAgIG9wZXJhdGlvbnMuc2V0KGNvbmZpZy5vcGVyYXRpb24sIHN0YXRzKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlOiBBY2Nlc3NWYWx1ZSA9IHsgcGF0aDogY29uZmlnLnBhdGgsIHNpemU6IGNvbmZpZy5zaXplIHx8IDAgfTtcbiAgICBzdGF0cy50b3RhbENvdW50Kys7XG4gICAgc3RhdHMuY291bnRUcmVlLmFkZCh2YWx1ZSk7XG4gICAgaWYgKGNvbmZpZy5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IHNpemVUcmVlID0gc3RhdHMuc2l6ZVRyZWU7XG4gICAgICAgIGlmICghc2l6ZVRyZWUpIHtcbiAgICAgICAgICAgIHNpemVUcmVlID0gbWFrZVRyZWUodiA9PiB2LnNpemUpO1xuICAgICAgICAgICAgc3RhdHMuc2l6ZVRyZWUgPSBzaXplVHJlZTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0cy50b3RhbFNpemUgKz0gY29uZmlnLnNpemU7XG4gICAgICAgIHNpemVUcmVlLmFkZCh2YWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzVG90YWxzKGFjY291bnQ6IHN0cmluZyk6IEFjY2Vzc1RvdGFscyB7XG4gICAgbGV0IHJlc3VsdDogQWNjZXNzVG90YWxzID0ge307XG4gICAgbGV0IG9wZXJhdGlvbnMgPSBhY2NvdW50cy5nZXQoYWNjb3VudCk7XG4gICAgaWYgKCFvcGVyYXRpb25zKSByZXR1cm4gcmVzdWx0O1xuICAgIGZvciAobGV0IFtvcGVyYXRpb24sIHN0YXRzXSBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIHJlc3VsdFtvcGVyYXRpb25dID0geyBjb3VudDogc3RhdHMudG90YWxDb3VudCwgc2l6ZTogc3RhdHMudG90YWxTaXplIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQWNjZXNzU3VtbWFyaWVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG9wZXJhdGlvbjogc3RyaW5nOyBtYXhDb3VudDogbnVtYmVyOyB3ZWlnaHRCeVNpemU/OiBib29sZWFuIH0pOiBTdW1tYXJ5RW50cnk8QWNjZXNzU3VtbWFyeVN0YXRlPltdIHtcbiAgICBsZXQgb3BlcmF0aW9ucyA9IGFjY291bnRzLmdldChjb25maWcuYWNjb3VudCk7XG4gICAgbGV0IHN0YXRzID0gb3BlcmF0aW9ucyAmJiBvcGVyYXRpb25zLmdldChjb25maWcub3BlcmF0aW9uKTtcbiAgICBpZiAoIXN0YXRzKSByZXR1cm4gW107XG4gICAgLy8gQ291bnQtb25seSBvcGVyYXRpb25zIGhhdmUgbm8gc2l6ZSB0cmVlLCBpbiB3aGljaCBjYXNlIHdlaWdodEJ5U2l6ZSBpcyBpZ25vcmVkIGFuZCB0aGUgY291bnQgYnJlYWtkb3duIGlzIHJldHVybmVkLlxuICAgIGxldCBzaXplVHJlZSA9IHN0YXRzLnNpemVUcmVlO1xuICAgIGlmIChjb25maWcud2VpZ2h0QnlTaXplICYmIHNpemVUcmVlKSB7XG4gICAgICAgIHJldHVybiBzaXplVHJlZS5nZXRTdW1tYXJpZXMoY29uZmlnLm1heENvdW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRzLmNvdW50VHJlZS5nZXRTdW1tYXJpZXMoY29uZmlnLm1heENvdW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQWNjb3VudEFjY2Vzc1N0YXRzKGFjY291bnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChhY2NvdW50cy5kZWxldGUoYWNjb3VudCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYENsZWFyZWQgdGhlIGluLW1lbW9yeSBhY2Nlc3Mgc3RhdGlzdGljcyBmb3IgYWNjb3VudCAke2FjY291bnR9YCk7XG4gICAgfVxufVxuIl19
|
|
78
|
+
/* _JS_SOURCE_HASH = "de9041173e44efbb817f16cf2d6e727c50e54558d6609dfe8b563e27d5ce3a71"; */
|