obsidian-dev-utils 29.0.2 → 30.1.0
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/CHANGELOG.md +9 -0
- package/dist/lib/cjs/Array.cjs +1 -1
- package/dist/lib/cjs/Async.cjs +1 -1
- package/dist/lib/cjs/AsyncEvents.cjs +1 -1
- package/dist/lib/cjs/Blob.cjs +1 -1
- package/dist/lib/cjs/CssClass.cjs +1 -1
- package/dist/lib/cjs/Debug.cjs +1 -1
- package/dist/lib/cjs/DebugController.cjs +1 -1
- package/dist/lib/cjs/Enum.cjs +1 -1
- package/dist/lib/cjs/Error.cjs +1 -1
- package/dist/lib/cjs/Function.cjs +1 -1
- package/dist/lib/cjs/HTMLElement.cjs +1 -1
- package/dist/lib/cjs/Library.cjs +2 -2
- package/dist/lib/cjs/ObjectUtils.cjs +430 -0
- package/dist/lib/cjs/Path.cjs +1 -1
- package/dist/lib/cjs/RegExp.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/CodeGenerator.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ESLint/index.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/Exec.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/Fs.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/JSON.cjs +5 -5
- package/dist/lib/cjs/ScriptUtils/NodeModules.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/Npm.cjs +8 -8
- package/dist/lib/cjs/ScriptUtils/NpmPublish.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/NpmRun.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/Root.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/build.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/index.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.cjs +17 -5
- package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/format.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/index.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/spellcheck.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/version.cjs +1 -1
- package/dist/lib/cjs/String.cjs +1 -1
- package/dist/lib/cjs/Transformers/DateTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/DurationTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/GroupTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/MapTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/SetTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/Transformer.cjs +4 -4
- package/dist/lib/cjs/Transformers/Transformer.d.cts +1 -1
- package/dist/lib/cjs/Transformers/TwoWayMapTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/TypedTransformer.cjs +1 -1
- package/dist/lib/cjs/Transformers/index.cjs +1 -1
- package/dist/lib/cjs/TwoWayMap.cjs +1 -1
- package/dist/lib/cjs/Type.cjs +1 -1
- package/dist/lib/cjs/ValueProvider.cjs +1 -1
- package/dist/lib/cjs/codemirror/StateFieldSpec.cjs +1 -1
- package/dist/lib/cjs/codemirror/index.cjs +1 -1
- package/dist/lib/cjs/index.cjs +5 -5
- package/dist/lib/cjs/index.d.cts +1 -1
- package/dist/lib/cjs/obsidian/App.cjs +2 -2
- package/dist/lib/cjs/obsidian/AttachmentPath.cjs +1 -1
- package/dist/lib/cjs/obsidian/Backlink.cjs +1 -1
- package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/AsyncEventsComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/CheckboxComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/CodeHighlighterComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/DateComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/DateTimeComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/EmailComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/FileComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/MonthComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleDropdownComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleEmailComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleFileComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleTextComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/NumberComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/PasswordComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/SettingComponentWrapper.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TelephoneComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TextBasedComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TimeComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TriStateCheckboxComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedDropdownComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedMultipleDropdownComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedRangeTextComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedTextComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/UrlComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/ValidatorComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/ValueComponentWithChangeTracking.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/WeekComponent.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/SettingComponents/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/Components/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/Dataview.cjs +1 -1
- package/dist/lib/cjs/obsidian/DataviewLink.cjs +1 -1
- package/dist/lib/cjs/obsidian/FileChange.cjs +9 -9
- package/dist/lib/cjs/obsidian/FileManager.cjs +4 -4
- package/dist/lib/cjs/obsidian/FileSystem.cjs +1 -1
- package/dist/lib/cjs/obsidian/Frontmatter.cjs +2 -2
- package/dist/lib/cjs/obsidian/Frontmatter.d.cts +1 -1
- package/dist/lib/cjs/obsidian/FrontmatterLinkCacheWithOffsets.cjs +1 -1
- package/dist/lib/cjs/obsidian/Link.cjs +12 -12
- package/dist/lib/cjs/obsidian/Logger.cjs +1 -1
- package/dist/lib/cjs/obsidian/Loop.cjs +1 -1
- package/dist/lib/cjs/obsidian/Markdown.cjs +1 -1
- package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.cjs +1 -1
- package/dist/lib/cjs/obsidian/MarkdownView.cjs +1 -1
- package/dist/lib/cjs/obsidian/MetadataCache.cjs +5 -5
- package/dist/lib/cjs/obsidian/Modals/Alert.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/Confirm.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/ModalBase.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/SelectItem.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/MonkeyAround.cjs +2 -2
- package/dist/lib/cjs/obsidian/ObsidianSettings.cjs +1 -1
- package/dist/lib/cjs/obsidian/Pdf.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/Plugin.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginContext.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginId.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +6 -6
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +5 -5
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsWrapper.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.cjs +1 -1
- package/dist/lib/cjs/obsidian/Plugin/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/Queue.cjs +1 -1
- package/dist/lib/cjs/obsidian/React/AppContext.cjs +1 -1
- package/dist/lib/cjs/obsidian/React/index.cjs +1 -1
- package/dist/lib/cjs/obsidian/Reference.cjs +1 -1
- package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +7 -7
- package/dist/lib/cjs/obsidian/ResourceUrl.cjs +1 -1
- package/dist/lib/cjs/obsidian/SettingEx.cjs +1 -1
- package/dist/lib/cjs/obsidian/ValidationMessage.cjs +1 -1
- package/dist/lib/cjs/obsidian/Vault.cjs +1 -1
- package/dist/lib/cjs/obsidian/VaultEx.cjs +1 -1
- package/dist/lib/cjs/obsidian/index.cjs +1 -1
- package/dist/lib/cjs/url.cjs +1 -1
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/ObjectUtils.mjs +396 -0
- package/dist/lib/esm/ScriptUtils/JSON.mjs +2 -2
- package/dist/lib/esm/ScriptUtils/Npm.mjs +2 -2
- package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.mjs +15 -3
- package/dist/lib/esm/Transformers/Transformer.d.mts +1 -1
- package/dist/lib/esm/Transformers/Transformer.mjs +2 -2
- package/dist/lib/esm/index.d.mts +1 -1
- package/dist/lib/esm/index.mjs +3 -3
- package/dist/lib/esm/obsidian/App.mjs +1 -1
- package/dist/lib/esm/obsidian/FileChange.mjs +2 -2
- package/dist/lib/esm/obsidian/FileManager.mjs +2 -2
- package/dist/lib/esm/obsidian/Frontmatter.d.mts +1 -1
- package/dist/lib/esm/obsidian/Frontmatter.mjs +1 -1
- package/dist/lib/esm/obsidian/Link.mjs +2 -2
- package/dist/lib/esm/obsidian/MetadataCache.mjs +2 -2
- package/dist/lib/esm/obsidian/MonkeyAround.mjs +1 -1
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +1 -1
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +2 -2
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +2 -2
- package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +2 -2
- package/package.json +5 -5
- package/dist/lib/cjs/Object.cjs +0 -430
- package/dist/lib/esm/Object.mjs +0 -396
- /package/dist/lib/cjs/{Object.d.cts → ObjectUtils.d.cts} +0 -0
- /package/dist/lib/esm/{Object.d.mts → ObjectUtils.d.mts} +0 -0
package/dist/lib/esm/Object.mjs
DELETED
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
-
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
(function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
errorToString,
|
|
10
|
-
throwExpression
|
|
11
|
-
} from "./Error.mjs";
|
|
12
|
-
import { replaceAll } from "./String.mjs";
|
|
13
|
-
var FunctionHandlingMode = /* @__PURE__ */ ((FunctionHandlingMode2) => {
|
|
14
|
-
FunctionHandlingMode2["Exclude"] = "exclude";
|
|
15
|
-
FunctionHandlingMode2["Full"] = "full";
|
|
16
|
-
FunctionHandlingMode2["NameOnly"] = "nameOnly";
|
|
17
|
-
return FunctionHandlingMode2;
|
|
18
|
-
})(FunctionHandlingMode || {});
|
|
19
|
-
const KEY_SEPARATOR = ".";
|
|
20
|
-
const equalityComparerEntries = createEqualityComparerEntries(
|
|
21
|
-
[
|
|
22
|
-
{ constructor: ArrayBuffer, equalityComparer: deepEqualArrayBuffer },
|
|
23
|
-
{ constructor: Date, equalityComparer: deepEqualDate },
|
|
24
|
-
{ constructor: RegExp, equalityComparer: deepEqualRegExp },
|
|
25
|
-
{ constructor: Map, equalityComparer: deepEqualMap },
|
|
26
|
-
{ constructor: Set, equalityComparer: deepEqualSet }
|
|
27
|
-
]
|
|
28
|
-
);
|
|
29
|
-
function assignWithNonEnumerableProperties(target, ...sources) {
|
|
30
|
-
return _assignWithNonEnumerableProperties(target, ...sources);
|
|
31
|
-
}
|
|
32
|
-
function cloneWithNonEnumerableProperties(obj) {
|
|
33
|
-
return Object.create(getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
|
|
34
|
-
}
|
|
35
|
-
function deepEqual(a, b) {
|
|
36
|
-
if (a === b) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
const aConstructor = a.constructor;
|
|
43
|
-
const bConstructor = b.constructor;
|
|
44
|
-
if (aConstructor !== bConstructor) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
if (aConstructor !== Object) {
|
|
48
|
-
const result = deepEqualTyped(a, b);
|
|
49
|
-
if (result !== void 0) {
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const keysA = getAllKeys(a);
|
|
54
|
-
const keysB = getAllKeys(b);
|
|
55
|
-
if (keysA.length !== keysB.length) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
const aRecord = a;
|
|
59
|
-
const bRecord = b;
|
|
60
|
-
for (const key of keysA) {
|
|
61
|
-
if (!keysB.includes(key) || !deepEqual(aRecord[key], bRecord[key])) {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
function deleteProperties(obj, propertyNames) {
|
|
68
|
-
let ans = false;
|
|
69
|
-
for (const propertyName of propertyNames) {
|
|
70
|
-
ans = deleteProperty(obj, propertyName) || ans;
|
|
71
|
-
}
|
|
72
|
-
return ans;
|
|
73
|
-
}
|
|
74
|
-
function deleteProperty(obj, propertyName) {
|
|
75
|
-
if (!Object.hasOwn(obj, propertyName)) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
delete obj[propertyName];
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
function getAllEntries(obj) {
|
|
82
|
-
return getAllKeys(obj).map((key) => [key, obj[key]]);
|
|
83
|
-
}
|
|
84
|
-
function getAllKeys(obj) {
|
|
85
|
-
const keys = [];
|
|
86
|
-
let current = obj;
|
|
87
|
-
while (current) {
|
|
88
|
-
const descriptors = Object.getOwnPropertyDescriptors(current);
|
|
89
|
-
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
90
|
-
if (key === "__proto__") {
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
if (typeof descriptor.value === "function") {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
const hasGetter = typeof descriptor.get === "function";
|
|
97
|
-
const hasSetter = typeof descriptor.set === "function";
|
|
98
|
-
if (hasGetter || hasSetter) {
|
|
99
|
-
if (hasGetter && hasSetter) {
|
|
100
|
-
keys.push(key);
|
|
101
|
-
}
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
if (descriptor.enumerable && descriptor.writable) {
|
|
105
|
-
keys.push(key);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
current = Object.getPrototypeOf(current);
|
|
109
|
-
}
|
|
110
|
-
return keys.sort();
|
|
111
|
-
}
|
|
112
|
-
function getNestedPropertyValue(obj, path) {
|
|
113
|
-
let node = obj;
|
|
114
|
-
const keys = path.split(KEY_SEPARATOR);
|
|
115
|
-
for (const key of keys) {
|
|
116
|
-
if (node === void 0) {
|
|
117
|
-
return void 0;
|
|
118
|
-
}
|
|
119
|
-
node = node[key];
|
|
120
|
-
}
|
|
121
|
-
return node;
|
|
122
|
-
}
|
|
123
|
-
function getPrototypeOf(instance) {
|
|
124
|
-
if (instance === void 0 || instance === null) {
|
|
125
|
-
return instance;
|
|
126
|
-
}
|
|
127
|
-
return Object.getPrototypeOf(instance);
|
|
128
|
-
}
|
|
129
|
-
function nameof(name) {
|
|
130
|
-
return name;
|
|
131
|
-
}
|
|
132
|
-
function normalizeOptionalProperties(obj) {
|
|
133
|
-
return obj;
|
|
134
|
-
}
|
|
135
|
-
function setNestedPropertyValue(obj, path, value) {
|
|
136
|
-
const error = new Error(`Property path ${path} not found`);
|
|
137
|
-
let node = obj;
|
|
138
|
-
const keys = path.split(KEY_SEPARATOR);
|
|
139
|
-
for (const key of keys.slice(0, -1)) {
|
|
140
|
-
if (node === void 0) {
|
|
141
|
-
throw error;
|
|
142
|
-
}
|
|
143
|
-
node = node[key];
|
|
144
|
-
}
|
|
145
|
-
const lastKey = keys.at(-1);
|
|
146
|
-
if (node === void 0 || lastKey === void 0) {
|
|
147
|
-
throw error;
|
|
148
|
-
}
|
|
149
|
-
node[lastKey] = value;
|
|
150
|
-
}
|
|
151
|
-
function toJson(value, options = {}) {
|
|
152
|
-
const DEFAULT_OPTIONS = {
|
|
153
|
-
functionHandlingMode: "exclude" /* Exclude */,
|
|
154
|
-
maxDepth: -1,
|
|
155
|
-
shouldCatchToJSONErrors: false,
|
|
156
|
-
shouldHandleCircularReferences: false,
|
|
157
|
-
shouldHandleErrors: false,
|
|
158
|
-
shouldHandleUndefined: false,
|
|
159
|
-
shouldSortKeys: false,
|
|
160
|
-
// eslint-disable-next-line no-magic-numbers
|
|
161
|
-
space: 2,
|
|
162
|
-
tokenSubstitutions: {
|
|
163
|
-
circularReference: makeObjectTokenSubstitution("CircularReference" /* CircularReference */),
|
|
164
|
-
maxDepthLimitReached: makeObjectTokenSubstitution("MaxDepthLimitReached" /* MaxDepthLimitReached */),
|
|
165
|
-
toJSONFailed: makeObjectTokenSubstitution("ToJSONFailed" /* ToJSONFailed */)
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
const fullOptions = {
|
|
169
|
-
...DEFAULT_OPTIONS,
|
|
170
|
-
...options,
|
|
171
|
-
tokenSubstitutions: {
|
|
172
|
-
...DEFAULT_OPTIONS.tokenSubstitutions,
|
|
173
|
-
...options.tokenSubstitutions
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
if (fullOptions.maxDepth === -1) {
|
|
177
|
-
fullOptions.maxDepth = Infinity;
|
|
178
|
-
}
|
|
179
|
-
const functionTexts = [];
|
|
180
|
-
const usedObjects = /* @__PURE__ */ new WeakSet();
|
|
181
|
-
const plainObject = toPlainObject(value, "", 0, true, fullOptions, functionTexts, usedObjects);
|
|
182
|
-
let json = JSON.stringify(plainObject, null, fullOptions.space) ?? "";
|
|
183
|
-
json = replaceAll(json, /"\[\[(?<Key>[A-Za-z]+)(?<Index>\d*)\]\]"/g, (_, key, indexStr) => applySubstitutions({
|
|
184
|
-
functionTexts,
|
|
185
|
-
index: indexStr ? parseInt(indexStr, 10) : 0,
|
|
186
|
-
key,
|
|
187
|
-
substitutions: fullOptions.tokenSubstitutions
|
|
188
|
-
}));
|
|
189
|
-
return json;
|
|
190
|
-
}
|
|
191
|
-
function _assignWithNonEnumerableProperties(target, ...sources) {
|
|
192
|
-
for (const source of sources) {
|
|
193
|
-
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
194
|
-
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
195
|
-
try {
|
|
196
|
-
if (key === "prototype" || Object.getOwnPropertyDescriptor(target, key)?.writable === false && !Object.getOwnPropertyDescriptor(target, key)?.configurable) {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
Object.defineProperty(target, key, descriptor);
|
|
200
|
-
} catch {
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
const sourcePrototypes = sources.map((source) => getPrototypeOf(source)).filter((proto) => !!proto);
|
|
205
|
-
if (sourcePrototypes.length > 0) {
|
|
206
|
-
const targetPrototype = _assignWithNonEnumerableProperties({}, getPrototypeOf(target), ...sourcePrototypes);
|
|
207
|
-
try {
|
|
208
|
-
Object.setPrototypeOf(target, targetPrototype);
|
|
209
|
-
} catch {
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return target;
|
|
213
|
-
}
|
|
214
|
-
function applySubstitutions(options) {
|
|
215
|
-
switch (options.key) {
|
|
216
|
-
case "CircularReference" /* CircularReference */:
|
|
217
|
-
return options.substitutions.circularReference;
|
|
218
|
-
case "Function" /* Function */:
|
|
219
|
-
return options.functionTexts[options.index] ?? throwExpression(new Error(`Function with index ${options.index.toString()} not found`));
|
|
220
|
-
case "MaxDepthLimitReached" /* MaxDepthLimitReached */:
|
|
221
|
-
return options.substitutions.maxDepthLimitReached;
|
|
222
|
-
case "MaxDepthLimitReachedArray" /* MaxDepthLimitReachedArray */:
|
|
223
|
-
return `Array(${options.index.toString()})`;
|
|
224
|
-
case "ToJSONFailed" /* ToJSONFailed */:
|
|
225
|
-
return options.substitutions.toJSONFailed;
|
|
226
|
-
case "Undefined" /* Undefined */:
|
|
227
|
-
return "undefined";
|
|
228
|
-
default:
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
function createEqualityComparerEntries(entries) {
|
|
233
|
-
return entries;
|
|
234
|
-
}
|
|
235
|
-
function deepEqualArrayBuffer(a, b) {
|
|
236
|
-
if (a.byteLength !== b.byteLength) {
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
const viewA = new Uint8Array(a);
|
|
240
|
-
const viewB = new Uint8Array(b);
|
|
241
|
-
return deepEqual(viewA, viewB);
|
|
242
|
-
}
|
|
243
|
-
function deepEqualDate(a, b) {
|
|
244
|
-
return a.getTime() === b.getTime();
|
|
245
|
-
}
|
|
246
|
-
function deepEqualMap(a, b) {
|
|
247
|
-
if (a.size !== b.size) {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
for (const [key, value] of a.entries()) {
|
|
251
|
-
if (!b.has(key) || !deepEqual(value, b.get(key))) {
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return true;
|
|
256
|
-
}
|
|
257
|
-
function deepEqualRegExp(a, b) {
|
|
258
|
-
return a.source === b.source && a.flags === b.flags;
|
|
259
|
-
}
|
|
260
|
-
function deepEqualSet(a, b) {
|
|
261
|
-
if (a.size !== b.size) {
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
for (const valueA of a) {
|
|
265
|
-
if (b.has(valueA)) {
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
let found = false;
|
|
269
|
-
for (const valueB of b) {
|
|
270
|
-
if (deepEqual(valueA, valueB)) {
|
|
271
|
-
found = true;
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
if (!found) {
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return true;
|
|
280
|
-
}
|
|
281
|
-
function deepEqualTyped(a, b) {
|
|
282
|
-
for (const { constructor, equalityComparer } of equalityComparerEntries) {
|
|
283
|
-
if (a instanceof constructor && b instanceof constructor) {
|
|
284
|
-
return equalityComparer(a, b);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return void 0;
|
|
288
|
-
}
|
|
289
|
-
function handleArray(value, depth, canUseToJSON, fullOptions, functionTexts, usedObjects) {
|
|
290
|
-
if (depth > fullOptions.maxDepth) {
|
|
291
|
-
return makePlaceholder("MaxDepthLimitReachedArray" /* MaxDepthLimitReachedArray */, value.length);
|
|
292
|
-
}
|
|
293
|
-
return value.map((item, index) => toPlainObject(item, index.toString(), depth + 1, canUseToJSON, fullOptions, functionTexts, usedObjects));
|
|
294
|
-
}
|
|
295
|
-
function handleCircularReference(value, key, fullOptions) {
|
|
296
|
-
if (fullOptions.shouldHandleCircularReferences) {
|
|
297
|
-
return makePlaceholder("CircularReference" /* CircularReference */);
|
|
298
|
-
}
|
|
299
|
-
const valueConstructorName = value.constructor.name || "Object";
|
|
300
|
-
throw new TypeError(`Converting circular structure to JSON
|
|
301
|
-
--> starting at object with constructor '${valueConstructorName}'
|
|
302
|
-
--- property '${key}' closes the circle`);
|
|
303
|
-
}
|
|
304
|
-
function handleFunction(value, functionTexts, fullOptions) {
|
|
305
|
-
if (fullOptions.functionHandlingMode === "exclude" /* Exclude */) {
|
|
306
|
-
return void 0;
|
|
307
|
-
}
|
|
308
|
-
const index = functionTexts.length;
|
|
309
|
-
const functionText = fullOptions.functionHandlingMode === "full" /* Full */ ? value.toString() : `function ${value.name || "anonymous"}() { /* ... */ }`;
|
|
310
|
-
functionTexts.push(functionText);
|
|
311
|
-
return makePlaceholder("Function" /* Function */, index);
|
|
312
|
-
}
|
|
313
|
-
function handleObject(value, key, depth, canUseToJSON, fullOptions, functionTexts, usedObjects) {
|
|
314
|
-
if (usedObjects.has(value)) {
|
|
315
|
-
return handleCircularReference(value, key, fullOptions);
|
|
316
|
-
}
|
|
317
|
-
usedObjects.add(value);
|
|
318
|
-
if (canUseToJSON) {
|
|
319
|
-
const toJSONResult = tryHandleToJSON(value, key, depth, fullOptions, functionTexts, usedObjects);
|
|
320
|
-
if (toJSONResult !== void 0) {
|
|
321
|
-
return toJSONResult;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
if (Array.isArray(value)) {
|
|
325
|
-
return handleArray(value, depth, canUseToJSON, fullOptions, functionTexts, usedObjects);
|
|
326
|
-
}
|
|
327
|
-
if (depth > fullOptions.maxDepth) {
|
|
328
|
-
return makePlaceholder("MaxDepthLimitReached" /* MaxDepthLimitReached */);
|
|
329
|
-
}
|
|
330
|
-
if (value instanceof Error && fullOptions.shouldHandleErrors) {
|
|
331
|
-
return errorToString(value);
|
|
332
|
-
}
|
|
333
|
-
return handlePlainObject(value, depth, canUseToJSON, fullOptions, functionTexts, usedObjects);
|
|
334
|
-
}
|
|
335
|
-
function handlePlainObject(value, depth, canUseToJSON, fullOptions, functionTexts, usedObjects) {
|
|
336
|
-
const entries = Object.entries(value);
|
|
337
|
-
if (fullOptions.shouldSortKeys) {
|
|
338
|
-
entries.sort(([key1], [key2]) => key1.localeCompare(key2));
|
|
339
|
-
}
|
|
340
|
-
return Object.fromEntries(
|
|
341
|
-
entries.map(([key2, value2]) => [
|
|
342
|
-
key2,
|
|
343
|
-
toPlainObject(value2, key2, depth + 1, canUseToJSON, fullOptions, functionTexts, usedObjects)
|
|
344
|
-
])
|
|
345
|
-
);
|
|
346
|
-
}
|
|
347
|
-
function makeObjectTokenSubstitution(key) {
|
|
348
|
-
return `{ "[[${key}]]": null }`;
|
|
349
|
-
}
|
|
350
|
-
function makePlaceholder(key, index) {
|
|
351
|
-
return `[[${key}${index?.toString() ?? ""}]]`;
|
|
352
|
-
}
|
|
353
|
-
function toPlainObject(value, key, depth, canUseToJSON, fullOptions, functionTexts, usedObjects) {
|
|
354
|
-
if (value === void 0) {
|
|
355
|
-
return depth === 0 || fullOptions.shouldHandleUndefined ? makePlaceholder("Undefined" /* Undefined */) : void 0;
|
|
356
|
-
}
|
|
357
|
-
if (typeof value === "function") {
|
|
358
|
-
return handleFunction(value, functionTexts, fullOptions);
|
|
359
|
-
}
|
|
360
|
-
if (typeof value !== "object" || value === null) {
|
|
361
|
-
return value;
|
|
362
|
-
}
|
|
363
|
-
return handleObject(value, key, depth, canUseToJSON, fullOptions, functionTexts, usedObjects);
|
|
364
|
-
}
|
|
365
|
-
function tryHandleToJSON(value, key, depth, fullOptions, functionTexts, usedObjects) {
|
|
366
|
-
const toJSON = value.toJSON;
|
|
367
|
-
if (typeof toJSON === "function") {
|
|
368
|
-
try {
|
|
369
|
-
const newValue = toJSON.call(value, key);
|
|
370
|
-
return toPlainObject(newValue, key, depth, false, fullOptions, functionTexts, usedObjects);
|
|
371
|
-
} catch (e) {
|
|
372
|
-
if (fullOptions.shouldCatchToJSONErrors) {
|
|
373
|
-
return makePlaceholder("ToJSONFailed" /* ToJSONFailed */);
|
|
374
|
-
}
|
|
375
|
-
throw e;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
return void 0;
|
|
379
|
-
}
|
|
380
|
-
export {
|
|
381
|
-
FunctionHandlingMode,
|
|
382
|
-
assignWithNonEnumerableProperties,
|
|
383
|
-
cloneWithNonEnumerableProperties,
|
|
384
|
-
deepEqual,
|
|
385
|
-
deleteProperties,
|
|
386
|
-
deleteProperty,
|
|
387
|
-
getAllEntries,
|
|
388
|
-
getAllKeys,
|
|
389
|
-
getNestedPropertyValue,
|
|
390
|
-
getPrototypeOf,
|
|
391
|
-
nameof,
|
|
392
|
-
normalizeOptionalProperties,
|
|
393
|
-
setNestedPropertyValue,
|
|
394
|
-
toJson
|
|
395
|
-
};
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL09iamVjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgT2JqZWN0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbnN0cnVjdG9yLFxuICBVbmRlZmluZWRPblBhcnRpYWxEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi9UeXBlLnRzJztcblxuaW1wb3J0IHtcbiAgZXJyb3JUb1N0cmluZyxcbiAgdGhyb3dFeHByZXNzaW9uXG59IGZyb20gJy4vRXJyb3IudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4vU3RyaW5nLnRzJztcblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IGZ1bmN0aW9ucyBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gKi9cbmV4cG9ydCBlbnVtIEZ1bmN0aW9uSGFuZGxpbmdNb2RlIHtcbiAgLyoqXG4gICAqIEV4Y2x1ZGVzIGZ1bmN0aW9ucyBmcm9tIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIEV4Y2x1ZGUgPSAnZXhjbHVkZScsXG4gIC8qKlxuICAgKiBJbmNsdWRlcyB0aGUgZnVsbCBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIEZ1bGwgPSAnZnVsbCcsXG4gIC8qKlxuICAgKiBJbmNsdWRlcyBvbmx5IHRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIE5hbWVPbmx5ID0gJ25hbWVPbmx5J1xufVxuXG5lbnVtIFRva2VuU3Vic3RpdHV0aW9uS2V5IHtcbiAgQ2lyY3VsYXJSZWZlcmVuY2UgPSAnQ2lyY3VsYXJSZWZlcmVuY2UnLFxuICBGdW5jdGlvbiA9ICdGdW5jdGlvbicsXG4gIE1heERlcHRoTGltaXRSZWFjaGVkID0gJ01heERlcHRoTGltaXRSZWFjaGVkJyxcbiAgTWF4RGVwdGhMaW1pdFJlYWNoZWRBcnJheSA9ICdNYXhEZXB0aExpbWl0UmVhY2hlZEFycmF5JyxcbiAgVG9KU09ORmFpbGVkID0gJ1RvSlNPTkZhaWxlZCcsXG4gIFVuZGVmaW5lZCA9ICdVbmRlZmluZWQnXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29udmVydGluZyBhbiBvYmplY3QgdG8gSlNPTi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0pzb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgZnVuY3Rpb25zIHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSBKU09OIG91dHB1dCAoZGVmYXVsdDogYGV4Y2x1ZGVgKS5cbiAgICovXG4gIGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0ZWQgb2JqZWN0cyB0byBpbmNsdWRlIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICogVXNlIGAtMWAgZm9yIG5vIGxpbWl0LlxuICAgKiBEZWZhdWx0cyB0byBgLTFgLlxuICAgKi9cbiAgbWF4RGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNhdGNoIGVycm9ycyBpbiBgdG9KU09OKClgIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhIHBsYWNlaG9sZGVyLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkQ2F0Y2hUb0pTT05FcnJvcnM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBoYW5kbGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRIYW5kbGVDaXJjdWxhclJlZmVyZW5jZXM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBoYW5kbGUgZXJyb3JzIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZEhhbmRsZUVycm9yczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZEhhbmRsZVVuZGVmaW5lZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHNvcnQgdGhlIGtleXMgb2YgdGhlIEpTT04gb3V0cHV0LlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkU29ydEtleXM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBKU09OIG91dHB1dC4gVGhpcyBjYW4gYmUgYSBudW1iZXIgb2Ygc3BhY2VzIG9yIGEgc3RyaW5nLiBEZWZhdWx0cyB0byBgMmAuXG4gICAqL1xuICBzcGFjZTogbnVtYmVyIHwgc3RyaW5nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzdWJzdGl0dXRpb25zIHRvIHVzZSBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICB0b2tlblN1YnN0aXR1dGlvbnM6IFBhcnRpYWw8VG9rZW5TdWJzdGl0dXRpb25zPjtcbn1cblxuaW50ZXJmYWNlIEFwcGx5U3Vic3RpdHV0aW9uc09wdGlvbnMge1xuICBmdW5jdGlvblRleHRzOiBzdHJpbmdbXTtcbiAgaW5kZXg6IG51bWJlcjtcbiAga2V5OiBUb2tlblN1YnN0aXR1dGlvbktleTtcbiAgc3Vic3RpdHV0aW9uczogVG9rZW5TdWJzdGl0dXRpb25zO1xufVxuXG5pbnRlcmZhY2UgRXF1YWxpdHlDb21wYXJlckVudHJ5PFQ+IHtcbiAgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+O1xuICBlcXVhbGl0eUNvbXBhcmVyOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEpTT05TZXJpYWxpemFibGUge1xuICB0b0pTT04oLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFRva2VuU3Vic3RpdHV0aW9ucyB7XG4gIGNpcmN1bGFyUmVmZXJlbmNlOiBzdHJpbmc7XG4gIG1heERlcHRoTGltaXRSZWFjaGVkOiBzdHJpbmc7XG4gIHRvSlNPTkZhaWxlZDogc3RyaW5nO1xufVxuXG5jb25zdCBLRVlfU0VQQVJBVE9SID0gJy4nO1xuY29uc3QgZXF1YWxpdHlDb21wYXJlckVudHJpZXMgPSBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cmllcyhcbiAgW1xuICAgIHsgY29uc3RydWN0b3I6IEFycmF5QnVmZmVyLCBlcXVhbGl0eUNvbXBhcmVyOiBkZWVwRXF1YWxBcnJheUJ1ZmZlciB9LFxuICAgIHsgY29uc3RydWN0b3I6IERhdGUsIGVxdWFsaXR5Q29tcGFyZXI6IGRlZXBFcXVhbERhdGUgfSxcbiAgICB7IGNvbnN0cnVjdG9yOiBSZWdFeHAsIGVxdWFsaXR5Q29tcGFyZXI6IGRlZXBFcXVhbFJlZ0V4cCB9LFxuICAgIHsgY29uc3RydWN0b3I6IE1hcCwgZXF1YWxpdHlDb21wYXJlcjogZGVlcEVxdWFsTWFwIH0sXG4gICAgeyBjb25zdHJ1Y3RvcjogU2V0LCBlcXVhbGl0eUNvbXBhcmVyOiBkZWVwRXF1YWxTZXQgfVxuICBdIGFzIGNvbnN0XG4pO1xuXG4vKipcbiAqIEEgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBnZW5lcmljIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG5cbi8qKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZTEgLSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHNvdXJjZTIgLSBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXM8VCBleHRlbmRzIG9iamVjdCwgVSwgVj4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogVCAmIFUgJiBWO1xuXG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZTEgLSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHNvdXJjZTIgLSBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UzIC0gVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXM8VCBleHRlbmRzIG9iamVjdCwgVSwgViwgVz4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWLCBzb3VyY2UzOiBXKTogVCAmIFUgJiBWICYgVztcblxuLyoqXG4gKiBBc3NpZ25zIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhIHRhcmdldCBvYmplY3QsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gVGhlIHNvdXJjZSBvYmplY3RzIHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBvYmplY3RbXSk6IG9iamVjdCB7XG4gIHJldHVybiBfYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBvcmlnaW5hbCBvYmplY3QsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVXaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKG9iaiksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaikpIGFzIFQ7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZGVlcGx5IGVxdWFsLlxuICpcbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gYiAtIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBkZWVwbHkgZXF1YWwsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnIHx8IGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFDb25zdHJ1Y3RvciA9IGEuY29uc3RydWN0b3I7XG4gIGNvbnN0IGJDb25zdHJ1Y3RvciA9IGIuY29uc3RydWN0b3I7XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gYkNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZGVlcEVxdWFsVHlwZWQoYSwgYik7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gZ2V0QWxsS2V5cyhhKTtcbiAgY29uc3Qga2V5c0IgPSBnZXRBbGxLZXlzKGIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFSZWNvcmQgPSBhIGFzIEdlbmVyaWNPYmplY3Q7XG4gIGNvbnN0IGJSZWNvcmQgPSBiIGFzIEdlbmVyaWNPYmplY3Q7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0EpIHtcbiAgICBpZiAoIWtleXNCLmluY2x1ZGVzKGtleSkgfHwgIWRlZXBFcXVhbChhUmVjb3JkW2tleV0sIGJSZWNvcmRba2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIG11bHRpcGxlIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZXMgLSBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gZGVsZXRlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGUgcHJvcGVydGllcyB3ZXJlIHByZXNlbnQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydGllczxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHByb3BlcnR5TmFtZXM6IChrZXlvZiBUKVtdKTogYm9vbGVhbiB7XG4gIGxldCBhbnMgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgYW5zID0gZGVsZXRlUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUpIHx8IGFucztcbiAgfVxuXG4gIHJldHVybiBhbnM7XG59XG5cbi8qKlxuICogRGVsZXRlcyBhIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBkZWxldGUgdGhlIHByb3BlcnR5IGZyb20uXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRlbGV0ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgd2FzIHByZXNlbnQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydHk8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKG9iaiwgcHJvcGVydHlOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpbcHJvcGVydHlOYW1lXTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2V0cyBhbGwgZW50cmllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBlbnRyaWVzIG9mLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIGVudHJpZXMgb2YgdGhlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEVudHJpZXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogW1N0cmluZ0tleXM8VD4sIFRbU3RyaW5nS2V5czxUPl1dW10ge1xuICByZXR1cm4gZ2V0QWxsS2V5cyhvYmopLm1hcCgoa2V5KSA9PiBba2V5LCBvYmpba2V5XV0pO1xufVxuXG4vKipcbiAqIEdldHMgYWxsIGtleXMgb2YgYW4gb2JqZWN0LlxuICogSW5jbHVkZXMgZmllbGRzIGFuZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGdldCB0aGUga2V5cyBvZi5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBrZXlzIG9mIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxLZXlzPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IFN0cmluZ0tleXM8VD5bXSB7XG4gIGNvbnN0IGtleXM6IFN0cmluZ0tleXM8VD5bXSA9IFtdO1xuICBsZXQgY3VycmVudDogbnVsbCB8IG9iamVjdCA9IG9iajtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGN1cnJlbnQpIGFzIFJlY29yZDxzdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvcj47XG4gICAgZm9yIChjb25zdCBba2V5LCBkZXNjcmlwdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdG9ycykpIHtcbiAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0dldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGNvbnN0IGhhc1NldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmIChoYXNHZXR0ZXIgfHwgaGFzU2V0dGVyKSB7XG4gICAgICAgIGlmIChoYXNHZXR0ZXIgJiYgaGFzU2V0dGVyKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSBhcyBTdHJpbmdLZXlzPFQ+KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkgYXMgU3RyaW5nS2V5czxUPik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KSBhcyBudWxsIHwgb2JqZWN0O1xuICB9XG4gIHJldHVybiBrZXlzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byB0aGUgbmVzdGVkIHByb3BlcnR5LlxuICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBuZXN0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKG9iajogR2VuZXJpY09iamVjdCwgcGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIGxldCBub2RlOiBHZW5lcmljT2JqZWN0IHwgdW5kZWZpbmVkID0gb2JqO1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChLRVlfU0VQQVJBVE9SKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlW2tleV0gYXMgR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByb3RvdHlwZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtIGluc3RhbmNlIC0gVGhlIG9iamVjdCBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgcHJvdG90eXBlIG9mLlxuICogQHJldHVybnMgVGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2Y8VD4oaW5zdGFuY2U6IFQpOiBUIHtcbiAgaWYgKGluc3RhbmNlID09PSB1bmRlZmluZWQgfHwgaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkgYXMgVDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBvZiBhIGdpdmVuIHR5cGUgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhcyBhIHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hbWVvZjxUPihuYW1lOiBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4pOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYWxsb3cgYHVuZGVmaW5lZGAgYXNzaWdubWVudCBpbiBzdHJpY3QgbW9kZS5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgcHJvdmlkZXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCBUeXBlU2NyaXB0IGZsYWcsXG4gKiB3aGljaCBwcm9oaWJpdHMgZGlyZWN0bHkgYXNzaWduaW5nIGB1bmRlZmluZWRgIHRvIG9wdGlvbmFsIHByb3BlcnRpZXMgd2hlbiB0aGUgdHlwZVxuICogZXhwbGljaXRseSBvbWl0cyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gV2l0aCBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXM6IHRydWVgXG4gKiBjb25zdCB4OiB7IHByb3A/OiBzdHJpbmcgfSA9IHsgcHJvcDogdW5kZWZpbmVkIH07IC8vIENvbXBpbGVyIGVycm9yXG4gKlxuICogLy8gVXNpbmcgdGhpcyB1dGlsaXR5OlxuICogY29uc3QgeTogeyBwcm9wPzogc3RyaW5nIH0gPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8eyBwcm9wPzogc3RyaW5nIH0+KHsgcHJvcDogdW5kZWZpbmVkIH0pOyAvLyBXb3Jrc1xuICogYGBgXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCB0eXBlIHdpdGggb3B0aW9uYWwgcHJvcGVydGllcyB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBub3JtYWxpemUsIGFsbG93aW5nIGV4cGxpY2l0IGB1bmRlZmluZWRgIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxUPihvYmo6IFVuZGVmaW5lZE9uUGFydGlhbERlZXA8VD4pOiBUIHtcbiAgcmV0dXJuIG9iaiBhcyBUO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgbmVzdGVkIHByb3BlcnR5IGluIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBzZXQgdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbi5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKG9iajogR2VuZXJpY09iamVjdCwgcGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aCAke3BhdGh9IG5vdCBmb3VuZGApO1xuICBsZXQgbm9kZTogR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZCA9IG9iajtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoS0VZX1NFUEFSQVRPUik7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMuc2xpY2UoMCwgLTEpKSB7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlW2tleV0gYXMgR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzLmF0KC0xKTtcbiAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCB8fCBsYXN0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIG5vZGVbbGFzdEtleV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIHZhbHVlIHRvIGEgSlNPTiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZCB0byBKU09OLiBUaGlzIGNhbiBiZSBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgdGhlIEpTT04gY29udmVyc2lvbiBwcm9jZXNzLlxuICogQHJldHVybnMgVGhlIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogUGFydGlhbDxUb0pzb25PcHRpb25zPiA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3QgREVGQVVMVF9PUFRJT05TOiB7IHRva2VuU3Vic3RpdHV0aW9uczogVG9rZW5TdWJzdGl0dXRpb25zIH0gJiBUb0pzb25PcHRpb25zID0ge1xuICAgIGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZS5FeGNsdWRlLFxuICAgIG1heERlcHRoOiAtMSxcbiAgICBzaG91bGRDYXRjaFRvSlNPTkVycm9yczogZmFsc2UsXG4gICAgc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzOiBmYWxzZSxcbiAgICBzaG91bGRIYW5kbGVFcnJvcnM6IGZhbHNlLFxuICAgIHNob3VsZEhhbmRsZVVuZGVmaW5lZDogZmFsc2UsXG4gICAgc2hvdWxkU29ydEtleXM6IGZhbHNlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgc3BhY2U6IDIsXG4gICAgdG9rZW5TdWJzdGl0dXRpb25zOiB7XG4gICAgICBjaXJjdWxhclJlZmVyZW5jZTogbWFrZU9iamVjdFRva2VuU3Vic3RpdHV0aW9uKFRva2VuU3Vic3RpdHV0aW9uS2V5LkNpcmN1bGFyUmVmZXJlbmNlKSxcbiAgICAgIG1heERlcHRoTGltaXRSZWFjaGVkOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQpLFxuICAgICAgdG9KU09ORmFpbGVkOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBmdWxsT3B0aW9ucyA9IHtcbiAgICAuLi5ERUZBVUxUX09QVElPTlMsXG4gICAgLi4ub3B0aW9ucyxcbiAgICB0b2tlblN1YnN0aXR1dGlvbnM6IHtcbiAgICAgIC4uLkRFRkFVTFRfT1BUSU9OUy50b2tlblN1YnN0aXR1dGlvbnMsXG4gICAgICAuLi5vcHRpb25zLnRva2VuU3Vic3RpdHV0aW9uc1xuICAgIH1cbiAgfTtcblxuICBpZiAoZnVsbE9wdGlvbnMubWF4RGVwdGggPT09IC0xKSB7XG4gICAgZnVsbE9wdGlvbnMubWF4RGVwdGggPSBJbmZpbml0eTtcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHVzZWRPYmplY3RzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIGNvbnN0IHBsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdCh2YWx1ZSwgJycsIDAsIHRydWUsIGZ1bGxPcHRpb25zLCBmdW5jdGlvblRleHRzLCB1c2VkT2JqZWN0cyk7XG4gIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGxhaW5PYmplY3QsIG51bGwsIGZ1bGxPcHRpb25zLnNwYWNlKSA/PyAnJztcbiAganNvbiA9IHJlcGxhY2VBbGwoanNvbiwgL1wiXFxbXFxbKD88S2V5PltBLVphLXpdKykoPzxJbmRleD5cXGQqKVxcXVxcXVwiL2csIChfLCBrZXksIGluZGV4U3RyKSA9PlxuICAgIGFwcGx5U3Vic3RpdHV0aW9ucyh7XG4gICAgICBmdW5jdGlvblRleHRzLFxuICAgICAgaW5kZXg6IGluZGV4U3RyID8gcGFyc2VJbnQoaW5kZXhTdHIsIDEwKSA6IDAsXG4gICAgICBrZXk6IGtleSBhcyBUb2tlblN1YnN0aXR1dGlvbktleSxcbiAgICAgIHN1YnN0aXR1dGlvbnM6IGZ1bGxPcHRpb25zLnRva2VuU3Vic3RpdHV0aW9uc1xuICAgIH0pKTtcbiAgcmV0dXJuIGpzb247XG59XG5cbmZ1bmN0aW9uIF9hc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXModGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IG9iamVjdFtdKTogb2JqZWN0IHtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBBdm9pZCByZWRlZmluaW5nIHJlYWQtb25seSBwcm9wZXJ0aWVzIChlc3BlY2lhbGx5IGBwcm90b3R5cGVgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAncHJvdG90eXBlJ1xuICAgICAgICAgIHx8IChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KT8ud3JpdGFibGUgPT09IGZhbHNlXG4gICAgICAgICAgICAmJiAhT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk/LmNvbmZpZ3VyYWJsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBpZiBkZWZpbmVQcm9wZXJ0eSBmYWlsc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNvdXJjZVByb3RvdHlwZXMgPSBzb3VyY2VzXG4gICAgLm1hcCgoc291cmNlKSA9PiBnZXRQcm90b3R5cGVPZjxvYmplY3QgfCB1bmRlZmluZWQ+KHNvdXJjZSkpXG4gICAgLmZpbHRlcigocHJvdG8pOiBwcm90byBpcyBvYmplY3QgPT4gISFwcm90byk7XG5cbiAgaWYgKHNvdXJjZVByb3RvdHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHRhcmdldFByb3RvdHlwZSA9IF9hc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXMoe30sIGdldFByb3RvdHlwZU9mKHRhcmdldCksIC4uLnNvdXJjZVByb3RvdHlwZXMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHRhcmdldFByb3RvdHlwZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaWxlbnRseSBpZ25vcmUgaWYgc2V0UHJvdG90eXBlT2YgZmFpbHNcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBhcHBseVN1YnN0aXR1dGlvbnMob3B0aW9uczogQXBwbHlTdWJzdGl0dXRpb25zT3B0aW9ucyk6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBzd2l0Y2ggKG9wdGlvbnMua2V5KSB7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5DaXJjdWxhclJlZmVyZW5jZTpcbiAgICAgIHJldHVybiBvcHRpb25zLnN1YnN0aXR1dGlvbnMuY2lyY3VsYXJSZWZlcmVuY2U7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5GdW5jdGlvbjpcbiAgICAgIHJldHVybiBvcHRpb25zLmZ1bmN0aW9uVGV4dHNbb3B0aW9ucy5pbmRleF0gPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcihgRnVuY3Rpb24gd2l0aCBpbmRleCAke29wdGlvbnMuaW5kZXgudG9TdHJpbmcoKX0gbm90IGZvdW5kYCkpO1xuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQ6XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdWJzdGl0dXRpb25zLm1heERlcHRoTGltaXRSZWFjaGVkO1xuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWRBcnJheTpcbiAgICAgIHJldHVybiBgQXJyYXkoJHtvcHRpb25zLmluZGV4LnRvU3RyaW5nKCl9KWA7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5Ub0pTT05GYWlsZWQ6XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdWJzdGl0dXRpb25zLnRvSlNPTkZhaWxlZDtcbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LlVuZGVmaW5lZDpcbiAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Q29tcGFyZXJFbnRyaWVzPGNvbnN0IFQgZXh0ZW5kcyByZWFkb25seSBFcXVhbGl0eUNvbXBhcmVyRW50cnk8YW55PltdPihlbnRyaWVzOiBUKTogVCB7XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBkZWVwRXF1YWxBcnJheUJ1ZmZlcihhOiBBcnJheUJ1ZmZlciwgYjogQXJyYXlCdWZmZXIpOiBib29sZWFuIHtcbiAgaWYgKGEuYnl0ZUxlbmd0aCAhPT0gYi5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgdmlld0EgPSBuZXcgVWludDhBcnJheShhKTtcbiAgY29uc3Qgdmlld0IgPSBuZXcgVWludDhBcnJheShiKTtcbiAgcmV0dXJuIGRlZXBFcXVhbCh2aWV3QSwgdmlld0IpO1xufVxuXG5mdW5jdGlvbiBkZWVwRXF1YWxEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbn1cblxuZnVuY3Rpb24gZGVlcEVxdWFsTWFwKGE6IE1hcDx1bmtub3duLCB1bmtub3duPiwgYjogTWFwPHVua25vd24sIHVua25vd24+KTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEuZW50cmllcygpKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFkZWVwRXF1YWwodmFsdWUsIGIuZ2V0KGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbFJlZ0V4cChhOiBSZWdFeHAsIGI6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbFNldChhOiBTZXQ8dW5rbm93bj4sIGI6IFNldDx1bmtub3duPik6IGJvb2xlYW4ge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IHZhbHVlQSBvZiBhKSB7XG4gICAgaWYgKGIuaGFzKHZhbHVlQSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlQiBvZiBiKSB7XG4gICAgICBpZiAoZGVlcEVxdWFsKHZhbHVlQSwgdmFsdWVCKSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbFR5cGVkKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB7IGNvbnN0cnVjdG9yLCBlcXVhbGl0eUNvbXBhcmVyIH0gb2YgZXF1YWxpdHlDb21wYXJlckVudHJpZXMpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yICYmIGIgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuICAgICAgcmV0dXJuIGVxdWFsaXR5Q29tcGFyZXIoYSBhcyBuZXZlciwgYiBhcyBuZXZlcik7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUFycmF5KFxuICB2YWx1ZTogdW5rbm93bltdLFxuICBkZXB0aDogbnVtYmVyLFxuICBjYW5Vc2VUb0pTT046IGJvb2xlYW4sXG4gIGZ1bGxPcHRpb25zOiBUb0pzb25PcHRpb25zLFxuICBmdW5jdGlvblRleHRzOiBzdHJpbmdbXSxcbiAgdXNlZE9iamVjdHM6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93biB7XG4gIGlmIChkZXB0aCA+IGZ1bGxPcHRpb25zLm1heERlcHRoKSB7XG4gICAgcmV0dXJuIG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5NYXhEZXB0aExpbWl0UmVhY2hlZEFycmF5LCB2YWx1ZS5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSwgaW5kZXgpID0+IHRvUGxhaW5PYmplY3QoaXRlbSwgaW5kZXgudG9TdHJpbmcoKSwgZGVwdGggKyAxLCBjYW5Vc2VUb0pTT04sIGZ1bGxPcHRpb25zLCBmdW5jdGlvblRleHRzLCB1c2VkT2JqZWN0cykpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZTogb2JqZWN0LCBrZXk6IHN0cmluZywgZnVsbE9wdGlvbnM6IFRvSnNvbk9wdGlvbnMpOiB1bmtub3duIHtcbiAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZEhhbmRsZUNpcmN1bGFyUmVmZXJlbmNlcykge1xuICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuQ2lyY3VsYXJSZWZlcmVuY2UpO1xuICB9XG4gIGNvbnN0IHZhbHVlQ29uc3RydWN0b3JOYW1lID0gdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTlxuLS0+IHN0YXJ0aW5nIGF0IG9iamVjdCB3aXRoIGNvbnN0cnVjdG9yICcke3ZhbHVlQ29uc3RydWN0b3JOYW1lfSdcbi0tLSBwcm9wZXJ0eSAnJHtrZXl9JyBjbG9zZXMgdGhlIGNpcmNsZWApO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG5mdW5jdGlvbiBoYW5kbGVGdW5jdGlvbih2YWx1ZTogRnVuY3Rpb24sIGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdLCBmdWxsT3B0aW9uczogVG9Kc29uT3B0aW9ucyk6IHVua25vd24ge1xuICBpZiAoZnVsbE9wdGlvbnMuZnVuY3Rpb25IYW5kbGluZ01vZGUgPT09IEZ1bmN0aW9uSGFuZGxpbmdNb2RlLkV4Y2x1ZGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGluZGV4ID0gZnVuY3Rpb25UZXh0cy5sZW5ndGg7XG4gIGNvbnN0IGZ1bmN0aW9uVGV4dCA9IGZ1bGxPcHRpb25zLmZ1bmN0aW9uSGFuZGxpbmdNb2RlID09PSBGdW5jdGlvbkhhbmRsaW5nTW9kZS5GdWxsXG4gICAgPyB2YWx1ZS50b1N0cmluZygpXG4gICAgOiBgZnVuY3Rpb24gJHt2YWx1ZS5uYW1lIHx8ICdhbm9ueW1vdXMnfSgpIHsgLyogLi4uICovIH1gO1xuICBmdW5jdGlvblRleHRzLnB1c2goZnVuY3Rpb25UZXh0KTtcbiAgcmV0dXJuIG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5GdW5jdGlvbiwgaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVPYmplY3QoXG4gIHZhbHVlOiBvYmplY3QsXG4gIGtleTogc3RyaW5nLFxuICBkZXB0aDogbnVtYmVyLFxuICBjYW5Vc2VUb0pTT046IGJvb2xlYW4sXG4gIGZ1bGxPcHRpb25zOiBUb0pzb25PcHRpb25zLFxuICBmdW5jdGlvblRleHRzOiBzdHJpbmdbXSxcbiAgdXNlZE9iamVjdHM6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93biB7XG4gIGlmICh1c2VkT2JqZWN0cy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGhhbmRsZUNpcmN1bGFyUmVmZXJlbmNlKHZhbHVlLCBrZXksIGZ1bGxPcHRpb25zKTtcbiAgfVxuXG4gIHVzZWRPYmplY3RzLmFkZCh2YWx1ZSk7XG5cbiAgaWYgKGNhblVzZVRvSlNPTikge1xuICAgIGNvbnN0IHRvSlNPTlJlc3VsdCA9IHRyeUhhbmRsZVRvSlNPTih2YWx1ZSwga2V5LCBkZXB0aCwgZnVsbE9wdGlvbnMsIGZ1bmN0aW9uVGV4dHMsIHVzZWRPYmplY3RzKTtcbiAgICBpZiAodG9KU09OUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0b0pTT05SZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGhhbmRsZUFycmF5KHZhbHVlLCBkZXB0aCwgY2FuVXNlVG9KU09OLCBmdWxsT3B0aW9ucywgZnVuY3Rpb25UZXh0cywgdXNlZE9iamVjdHMpO1xuICB9XG5cbiAgaWYgKGRlcHRoID4gZnVsbE9wdGlvbnMubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIGZ1bGxPcHRpb25zLnNob3VsZEhhbmRsZUVycm9ycykge1xuICAgIHJldHVybiBlcnJvclRvU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBoYW5kbGVQbGFpbk9iamVjdCh2YWx1ZSwgZGVwdGgsIGNhblVzZVRvSlNPTiwgZnVsbE9wdGlvbnMsIGZ1bmN0aW9uVGV4dHMsIHVzZWRPYmplY3RzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUGxhaW5PYmplY3QoXG4gIHZhbHVlOiBvYmplY3QsXG4gIGRlcHRoOiBudW1iZXIsXG4gIGNhblVzZVRvSlNPTjogYm9vbGVhbixcbiAgZnVsbE9wdGlvbnM6IFRvSnNvbk9wdGlvbnMsXG4gIGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdLFxuICB1c2VkT2JqZWN0czogV2Vha1NldDxvYmplY3Q+XG4pOiB1bmtub3duIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZFNvcnRLZXlzKSB7XG4gICAgZW50cmllcy5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgZW50cmllcy5tYXAoKFtrZXkyLCB2YWx1ZTJdKSA9PiBbXG4gICAgICBrZXkyLFxuICAgICAgdG9QbGFpbk9iamVjdCh2YWx1ZTIsIGtleTIsIGRlcHRoICsgMSwgY2FuVXNlVG9KU09OLCBmdWxsT3B0aW9ucywgZnVuY3Rpb25UZXh0cywgdXNlZE9iamVjdHMpXG4gICAgXSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gbWFrZU9iamVjdFRva2VuU3Vic3RpdHV0aW9uKGtleTogVG9rZW5TdWJzdGl0dXRpb25LZXkpOiBzdHJpbmcge1xuICByZXR1cm4gYHsgXCJbWyR7a2V5fV1dXCI6IG51bGwgfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VQbGFjZWhvbGRlcihrZXk6IFRva2VuU3Vic3RpdHV0aW9uS2V5LCBpbmRleD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgW1ske2tleX0ke2luZGV4Py50b1N0cmluZygpID8/ICcnfV1dYDtcbn1cblxuZnVuY3Rpb24gdG9QbGFpbk9iamVjdChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogc3RyaW5nLFxuICBkZXB0aDogbnVtYmVyLFxuICBjYW5Vc2VUb0pTT046IGJvb2xlYW4sXG4gIGZ1bGxPcHRpb25zOiBUb0pzb25PcHRpb25zLFxuICBmdW5jdGlvblRleHRzOiBzdHJpbmdbXSxcbiAgdXNlZE9iamVjdHM6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChkZXB0aCA9PT0gMCB8fCBmdWxsT3B0aW9ucy5zaG91bGRIYW5kbGVVbmRlZmluZWQpXG4gICAgICA/IG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5VbmRlZmluZWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaGFuZGxlRnVuY3Rpb24odmFsdWUsIGZ1bmN0aW9uVGV4dHMsIGZ1bGxPcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZU9iamVjdCh2YWx1ZSwga2V5LCBkZXB0aCwgY2FuVXNlVG9KU09OLCBmdWxsT3B0aW9ucywgZnVuY3Rpb25UZXh0cywgdXNlZE9iamVjdHMpO1xufVxuXG5mdW5jdGlvbiB0cnlIYW5kbGVUb0pTT04oXG4gIHZhbHVlOiBvYmplY3QsXG4gIGtleTogc3RyaW5nLFxuICBkZXB0aDogbnVtYmVyLFxuICBmdWxsT3B0aW9uczogVG9Kc29uT3B0aW9ucyxcbiAgZnVuY3Rpb25UZXh0czogc3RyaW5nW10sXG4gIHVzZWRPYmplY3RzOiBXZWFrU2V0PG9iamVjdD5cbik6IHVua25vd24ge1xuICBjb25zdCB0b0pTT04gPSAodmFsdWUgYXMgUGFydGlhbDxKU09OU2VyaWFsaXphYmxlPikudG9KU09OO1xuICBpZiAodHlwZW9mIHRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvSlNPTi5jYWxsKHZhbHVlLCBrZXkpO1xuICAgICAgcmV0dXJuIHRvUGxhaW5PYmplY3QobmV3VmFsdWUsIGtleSwgZGVwdGgsIGZhbHNlLCBmdWxsT3B0aW9ucywgZnVuY3Rpb25UZXh0cywgdXNlZE9iamVjdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChmdWxsT3B0aW9ucy5zaG91bGRDYXRjaFRvSlNPTkVycm9ycykge1xuICAgICAgICByZXR1cm4gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5LlRvSlNPTkZhaWxlZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBS3BCLElBQUssdUJBQUwsa0JBQUtBLDBCQUFMO0FBSUwsRUFBQUEsc0JBQUEsYUFBVTtBQUlWLEVBQUFBLHNCQUFBLFVBQU87QUFJUCxFQUFBQSxzQkFBQSxjQUFXO0FBWkQsU0FBQUE7QUFBQSxHQUFBO0FBK0ZaLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sMEJBQTBCO0FBQUEsRUFDOUI7QUFBQSxJQUNFLEVBQUUsYUFBYSxhQUFhLGtCQUFrQixxQkFBcUI7QUFBQSxJQUNuRSxFQUFFLGFBQWEsTUFBTSxrQkFBa0IsY0FBYztBQUFBLElBQ3JELEVBQUUsYUFBYSxRQUFRLGtCQUFr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
|
|
File without changes
|
|
File without changes
|