@ethlete/contentful 3.3.0 → 3.4.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 +6 -0
- package/esm2022/lib/components/audio/contentful-audio.component.mjs +3 -3
- package/esm2022/lib/components/file/contentful-file.component.mjs +3 -3
- package/esm2022/lib/components/image/contentful-image.component.mjs +3 -3
- package/esm2022/lib/components/rich-text-renderer/rich-text-renderer.component.mjs +56 -49
- package/esm2022/lib/components/video/contentful-video.component.mjs +3 -3
- package/fesm2022/ethlete-contentful.mjs +69 -62
- package/fesm2022/ethlete-contentful.mjs.map +1 -1
- package/lib/components/rich-text-renderer/rich-text-renderer.component.d.ts +10 -0
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @ethlete/contentful
|
|
2
2
|
|
|
3
|
+
## 3.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`41a269c`](https://github.com/ethlete-io/ethdk/commit/41a269cd03c61d41f159116cf26b4c7be1312155) Thanks [@TomTomB](https://github.com/TomTomB)! - Add `createContentfulIncludeMap` util
|
|
8
|
+
|
|
3
9
|
## 3.3.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -25,8 +25,8 @@ export class ContentfulAudioComponent {
|
|
|
25
25
|
};
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
29
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulAudioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
29
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: ContentfulAudioComponent, isStandalone: true, selector: "et-contentful-audio", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, audioClass: { classPropertyName: "audioClass", publicName: "audioClass", isSignal: true, isRequired: false, transformFunction: null }, figureClass: { classPropertyName: "figureClass", publicName: "figureClass", isSignal: true, isRequired: false, transformFunction: null }, figcaptionClass: { classPropertyName: "figcaptionClass", publicName: "figcaptionClass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
30
30
|
@if (data(); as data) {
|
|
31
31
|
<figure [ngClass]="figureClass()">
|
|
32
32
|
<figcaption [ngClass]="figcaptionClass()">{{ data.title }}</figcaption>
|
|
@@ -35,7 +35,7 @@ export class ContentfulAudioComponent {
|
|
|
35
35
|
}
|
|
36
36
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
37
37
|
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulAudioComponent, decorators: [{
|
|
39
39
|
type: Component,
|
|
40
40
|
args: [{
|
|
41
41
|
selector: 'et-contentful-audio',
|
|
@@ -27,8 +27,8 @@ export class ContentfulFileComponent {
|
|
|
27
27
|
};
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
31
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.
|
|
30
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
31
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: ContentfulFileComponent, isStandalone: true, selector: "et-contentful-file", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, fileClass: { classPropertyName: "fileClass", publicName: "fileClass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
32
32
|
@if (data(); as data) {
|
|
33
33
|
<a [href]="data.url" [ngClass]="fileClass()" class="underline" target="_blank">
|
|
34
34
|
{{ data.title }} ({{ data.size }} Bytes)
|
|
@@ -36,7 +36,7 @@ export class ContentfulFileComponent {
|
|
|
36
36
|
}
|
|
37
37
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
38
38
|
}
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulFileComponent, decorators: [{
|
|
40
40
|
type: Component,
|
|
41
41
|
args: [{
|
|
42
42
|
selector: 'et-contentful-file',
|
|
@@ -57,8 +57,8 @@ export class ContentfulImageComponent {
|
|
|
57
57
|
return asset ? generateDefaultContentfulImageSource(asset) : null;
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
61
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.
|
|
60
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
61
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.5", type: ContentfulImageComponent, isStandalone: true, selector: "et-contentful-image", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, srcsetSizes: { classPropertyName: "srcsetSizes", publicName: "srcsetSizes", isSignal: true, isRequired: false, transformFunction: null }, quality: { classPropertyName: "quality", publicName: "quality", isSignal: true, isRequired: false, transformFunction: null }, focusArea: { classPropertyName: "focusArea", publicName: "focusArea", isSignal: true, isRequired: false, transformFunction: null }, resizeBehavior: { classPropertyName: "resizeBehavior", publicName: "resizeBehavior", isSignal: true, isRequired: false, transformFunction: null }, hasPriority: { classPropertyName: "hasPriority", publicName: "hasPriority", isSignal: true, isRequired: false, transformFunction: null }, imgClass: { classPropertyName: "imgClass", publicName: "imgClass", isSignal: true, isRequired: false, transformFunction: null }, figureClass: { classPropertyName: "figureClass", publicName: "figureClass", isSignal: true, isRequired: false, transformFunction: null }, figcaptionClass: { classPropertyName: "figcaptionClass", publicName: "figcaptionClass", isSignal: true, isRequired: false, transformFunction: null }, pictureClass: { classPropertyName: "pictureClass", publicName: "pictureClass", isSignal: true, isRequired: false, transformFunction: null }, sizes: { classPropertyName: "sizes", publicName: "sizes", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "et-contentful-image" }, ngImport: i0, template: `
|
|
62
62
|
<et-picture
|
|
63
63
|
[imgClass]="imgClass()"
|
|
64
64
|
[hasPriority]="hasPriority()"
|
|
@@ -75,7 +75,7 @@ export class ContentfulImageComponent {
|
|
|
75
75
|
/>
|
|
76
76
|
`, isInline: true, dependencies: [{ kind: "component", type: PictureComponent, selector: "et-picture", inputs: ["sources", "hasPriority", "imgClass", "figureClass", "figcaptionClass", "pictureClass", "defaultSrc", "alt", "figcaption", "width", "height", "sizes"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
77
77
|
}
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulImageComponent, decorators: [{
|
|
79
79
|
type: Component,
|
|
80
80
|
args: [{
|
|
81
81
|
selector: 'et-contentful-image',
|
|
@@ -110,6 +110,57 @@ export const isExecutedTextCommandCacheItem = (cache) => {
|
|
|
110
110
|
return isTextRenderCommand(cache.command);
|
|
111
111
|
};
|
|
112
112
|
export const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';
|
|
113
|
+
/**
|
|
114
|
+
* Create a contentful include map using the provided entries and assets.
|
|
115
|
+
*/
|
|
116
|
+
export const createContentfulIncludeMap = (config) => {
|
|
117
|
+
const { entries, assets } = config;
|
|
118
|
+
const assetMap = new Map(assets.map((asset) => [asset.sys.id, asset]));
|
|
119
|
+
const entryMap = new Map(entries.map((entry) => [entry.sys.id, entry]));
|
|
120
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
121
|
+
const getEntry = (id, contentTypeId) => {
|
|
122
|
+
const entry = entryMap.get(id);
|
|
123
|
+
if (!entry) {
|
|
124
|
+
if (isDevMode()) {
|
|
125
|
+
console.warn('Entry not found! Will return null. Is the include query param to low?', { id, entryMap });
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {
|
|
130
|
+
return entry;
|
|
131
|
+
}
|
|
132
|
+
if (entry.sys.contentType.sys.id !== contentTypeId) {
|
|
133
|
+
if (isDevMode()) {
|
|
134
|
+
console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {
|
|
135
|
+
entry,
|
|
136
|
+
sysId: contentTypeId,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return entry;
|
|
142
|
+
};
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
144
|
+
const getEntries = (ids, contentTypeId) => {
|
|
145
|
+
const entries = ids
|
|
146
|
+
.map((id) => (typeof id === 'string' ? id : id.sys.id))
|
|
147
|
+
.map((id) => getEntry(id, contentTypeId))
|
|
148
|
+
.filter((entry) => entry !== null);
|
|
149
|
+
return entries;
|
|
150
|
+
};
|
|
151
|
+
const getAsset = (id) => {
|
|
152
|
+
return assetMap.get(id) ?? null;
|
|
153
|
+
};
|
|
154
|
+
const getAssets = (ids) => {
|
|
155
|
+
return ids.map((id) => getAsset(id)).filter((asset) => asset !== null);
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
getEntry,
|
|
159
|
+
getEntries,
|
|
160
|
+
getAsset,
|
|
161
|
+
getAssets,
|
|
162
|
+
};
|
|
163
|
+
};
|
|
113
164
|
export class ContentfulRichTextRendererComponent {
|
|
114
165
|
constructor() {
|
|
115
166
|
this._viewContainerRef = inject(ViewContainerRef);
|
|
@@ -141,51 +192,7 @@ export class ContentfulRichTextRendererComponent {
|
|
|
141
192
|
const content = this.content();
|
|
142
193
|
const assets = content?.includes.Asset;
|
|
143
194
|
const entries = content?.includes.Entry;
|
|
144
|
-
|
|
145
|
-
const entryMap = new Map(entries?.map((entry) => [entry.sys.id, entry]) ?? []);
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
-
const getEntry = (id, contentTypeId) => {
|
|
148
|
-
const entry = entryMap.get(id);
|
|
149
|
-
if (!entry) {
|
|
150
|
-
if (isDevMode()) {
|
|
151
|
-
console.warn('Entry not found! Will return null. Is the include query param to low?', { id, entryMap });
|
|
152
|
-
}
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {
|
|
156
|
-
return entry;
|
|
157
|
-
}
|
|
158
|
-
if (entry.sys.contentType.sys.id !== contentTypeId) {
|
|
159
|
-
if (isDevMode()) {
|
|
160
|
-
console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {
|
|
161
|
-
entry,
|
|
162
|
-
sysId: contentTypeId,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
return entry;
|
|
168
|
-
};
|
|
169
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
170
|
-
const getEntries = (ids, contentTypeId) => {
|
|
171
|
-
const entries = ids
|
|
172
|
-
.map((id) => (typeof id === 'string' ? id : id.sys.id))
|
|
173
|
-
.map((id) => getEntry(id, contentTypeId))
|
|
174
|
-
.filter((entry) => entry !== null);
|
|
175
|
-
return entries;
|
|
176
|
-
};
|
|
177
|
-
const getAsset = (id) => {
|
|
178
|
-
return assetMap.get(id) ?? null;
|
|
179
|
-
};
|
|
180
|
-
const getAssets = (ids) => {
|
|
181
|
-
return ids.map((id) => getAsset(id)).filter((asset) => asset !== null);
|
|
182
|
-
};
|
|
183
|
-
return {
|
|
184
|
-
getEntry,
|
|
185
|
-
getEntries,
|
|
186
|
-
getAsset,
|
|
187
|
-
getAssets,
|
|
188
|
-
};
|
|
195
|
+
return createContentfulIncludeMap({ assets: assets ?? [], entries: entries ?? [] });
|
|
189
196
|
});
|
|
190
197
|
/**
|
|
191
198
|
* The rich text data that should be rendered.
|
|
@@ -720,10 +727,10 @@ export class ContentfulRichTextRendererComponent {
|
|
|
720
727
|
const command = this._stringifyRenderCommand(instruction[RENDER_INSTRUCTION_POSITION.COMMAND]);
|
|
721
728
|
return `${translatedType}: ${command}`;
|
|
722
729
|
}
|
|
723
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
724
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.
|
|
730
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulRichTextRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
731
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.5", type: ContentfulRichTextRendererComponent, isStandalone: true, selector: "et-contentful-rich-text-renderer", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, richTextPath: { classPropertyName: "richTextPath", publicName: "richTextPath", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "et-contentful-rich-text-renderer" }, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
725
732
|
}
|
|
726
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
733
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulRichTextRendererComponent, decorators: [{
|
|
727
734
|
type: Component,
|
|
728
735
|
args: [{
|
|
729
736
|
selector: 'et-contentful-rich-text-renderer',
|
|
@@ -750,4 +757,4 @@ function formatHTML(html) {
|
|
|
750
757
|
}
|
|
751
758
|
return result.join('\n');
|
|
752
759
|
}
|
|
753
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL2NvbXBvbmVudHMvcmljaC10ZXh0LXJlbmRlcmVyL3JpY2gtdGV4dC1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFVBQVUsRUFFVixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsTUFBTSxFQUFTLE9BQU8sRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQVF6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsU0FBUyxFQUFFLENBQUM7SUFDWixVQUFVLEVBQUUsQ0FBQztJQUNi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QUN6QixNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRTFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIGlzRGV2TW9kZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCTE9DS1MsIEJsb2NrLCBJTkxJTkVTLCBJbmxpbmUsIE1hcmssIFRleHQgfSBmcm9tICdAY29udGVudGZ1bC9yaWNoLXRleHQtdHlwZXMnO1xuaW1wb3J0IHsgZ2V0T2JqZWN0UHJvcGVydHksIGlzT2JqZWN0IH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQgeyBwYWlyd2lzZSwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENPTlRFTlRGVUxfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbnRlbnRmdWwuY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbnRlbnRmdWxDb2xsZWN0aW9uLFxuICBDb250ZW50ZnVsRW50cnksXG4gIENvbnRlbnRmdWxFbnRyeUxpbmtJdGVtLFxuICBDb250ZW50ZnVsUmVzdEFzc2V0LFxuICBSaWNoVGV4dFJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29udGVudGZ1bC1jb25maWcnO1xuaW1wb3J0IHsgcmljaFRleHRSZW5kZXJlckVycm9yIH0gZnJvbSAnLi9yaWNoLXRleHQtcmVuZGVyZXIuZXJyb3JzJztcbmltcG9ydCB7IGlzUmljaFRleHRSb290Tm9kZSwgdHJhbnNsYXRlQ29udGVudGZ1bE5vZGVUeXBlVG9IdG1sVGFnIH0gZnJvbSAnLi9yaWNoLXRleHQtcmVuZGVyZXIudXRpbCc7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfQ09NTUFORF9UWVBFID0ge1xuICBIVE1MX09QRU46IDAsXG4gIEhUTUxfQ0xPU0U6IDEsXG4gIFRFWFQ6IDIsXG4gIENPTVBPTkVOVDogMyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgVFlQRTogMCxcbiAgTkVTVElOR19MRVZFTDogMSxcbiAgRE9NX1BPU0lUSU9OOiAyLFxuICBJTkRFWDogMyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIEFUVFJJQlVURVM6IDQsXG4gIFRBR19OQU1FOiA1LFxuICBFTEVNRU5UX0lEOiA2LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEhUTUxfQ0xPU0VfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIFRBR19OQU1FOiA0LFxuICBFTEVNRU5UX0lEOiA1LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFRFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIFRFWFQ6IDQsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBBVFRSSUJVVEVTOiA0LFxuICBDT01QT05FTlQ6IDUsXG4gIElOUFVUUzogNixcbiAgQ09NUE9ORU5UX1RZUEU6IDcsXG59IGFzIGNvbnN0O1xuXG50eXBlIEh0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOLFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBlbGVtZW50SWQ6IHN0cmluZyxcbl07XG5cbnR5cGUgSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9DTE9TRSxcbiAgbmVzdGluZ0xldmVsOiBudW1iZXIsXG4gIGRvbVBvc2l0aW9uOiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgZWxlbWVudElkOiBzdHJpbmcsXG5dO1xuXG50eXBlIFRleHRSZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5URVhULFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgdGV4dDogc3RyaW5nLFxuXTtcblxudHlwZSBDb21wb25lbnRSZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQsXG4gIG5lc3RpbmdMZXZlbDogbnVtYmVyLFxuICBkb21Qb3NpdGlvbjogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8dW5rbm93bj4sXG4gIGlucHV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbXBvbmVudFR5cGU6IHN0cmluZyxcbl07XG5cbnR5cGUgUmVuZGVyQ29tbWFuZCA9IEh0bWxPcGVuUmVuZGVyQ29tbWFuZCB8IEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgfCBUZXh0UmVuZGVyQ29tbWFuZCB8IENvbXBvbmVudFJlbmRlckNvbW1hbmQ7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04gPSB7XG4gIFRZUEU6IDAsXG4gIENPTU1BTkQ6IDEsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUgPSB7XG4gIENSRUFURTogMCxcbiAgVVBEQVRFOiAxLFxuICBERUxFVEU6IDIsXG4gIE1PVkU6IDMsXG59IGFzIGNvbnN0O1xuXG50eXBlIFJlbmRlckluc3RydWN0aW9uVHlwZVZhbHVlID0gKHR5cGVvZiBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRSlba2V5b2YgdHlwZW9mIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFXTtcblxudHlwZSBSZW5kZXJJbnN0cnVjdGlvbiA9IFtSZW5kZXJJbnN0cnVjdGlvblR5cGVWYWx1ZSwgUmVuZGVyQ29tbWFuZF07XG5cbmNvbnN0IE1BUktfVEFJTFdJTkRfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBib2xkOiAnZm9udC1ib2xkJyxcbiAgaXRhbGljOiAnaXRhbGljJyxcbiAgdW5kZXJsaW5lOiAndW5kZXJsaW5lJyxcbiAgY29kZTogJ2ZvbnQtbW9ubycsXG59O1xuXG5leHBvcnQgY29uc3QgbWFya3NUb0NsYXNzID0gKG1hcmtzOiBNYXJrW10pID0+IHtcbiAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG1hcmsgb2YgbWFya3MpIHtcbiAgICBsZXQga2xhc3MgPSBNQVJLX1RBSUxXSU5EX01BUFttYXJrLnR5cGVdO1xuXG4gICAgaWYgKCFrbGFzcykge1xuICAgICAgY29uc29sZS53YXJuKGBObyBjbGFzcyBmb3VuZCBmb3IgbWFyayB0eXBlISBGYWxsaW5nIGJhY2sgdG8gXCIke21hcmsudHlwZX1cIi5gLCBtYXJrKTtcblxuICAgICAga2xhc3MgPSBtYXJrLnR5cGU7XG4gICAgfVxuXG4gICAgY2xhc3Nlcy5wdXNoKGtsYXNzKTtcbiAgfVxuXG4gIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBIdG1sT3BlblJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU47XG59O1xuXG5leHBvcnQgY29uc3QgaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpOiBjb21tYW5kIGlzIEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX0NMT1NFO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVGV4dFJlbmRlckNvbW1hbmQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCk6IGNvbW1hbmQgaXMgVGV4dFJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5URVhUO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBDb21wb25lbnRSZW5kZXJDb21tYW5kID0+IHtcbiAgcmV0dXJuIGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuQ09NUE9ORU5UO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbmRlckNvbW1hbmRJZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSA9PiB7XG4gIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5FTEVNRU5UX0lEXTtcbiAgfSBlbHNlIGlmIChpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICByZXR1cm4gY29tbWFuZFtIVE1MX0NMT1NFX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkVMRU1FTlRfSURdO1xuICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICByZXR1cm4gY29tbWFuZFtURVhUX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRFWFRdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21tYW5kW0NPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5DT01QT05FTlRfVFlQRV07XG4gIH1cbn07XG5cbmNvbnN0IENMQVNTX0FUVFIgPSAnY2xhc3MnO1xuY29uc3QgREVGQVVMVF9DT01QT05FTlRfVFlQRVMgPSB7XG4gIElNQUdFOiAnJCQkX2V0LWltYWdlJyxcbiAgVklERU86ICckJCRfZXQtdmlkZW8nLFxuICBBVURJTzogJyQkJF9ldC1hdWRpbycsXG4gIEZJTEU6ICckJCRfZXQtZmlsZScsXG59O1xuXG50eXBlIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2UgPSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufTtcblxudHlwZSBFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0gPSB7XG4gIGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQ7XG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+O1xufSAmIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2U7XG5cbnR5cGUgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbSA9IHtcbiAgY29tbWFuZDogSHRtbE9wZW5SZW5kZXJDb21tYW5kIHwgSHRtbENsb3NlUmVuZGVyQ29tbWFuZDtcbn0gJiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlO1xuXG50eXBlIEV4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW0gPSB7XG4gIGNvbW1hbmQ6IFRleHRSZW5kZXJDb21tYW5kO1xuICB0ZXh0Tm9kZTogdW5rbm93bjtcbn0gJiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlO1xuXG50eXBlIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSA9XG4gIHwgRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtXG4gIHwgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbVxuICB8IEV4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW07XG5cbmV4cG9ydCBjb25zdCBpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbSA9IChcbiAgY2FjaGU6IEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSxcbik6IGNhY2hlIGlzIEV4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFeGVjdXRlZEh0bWxPclRleHRDb21tYW5kQ2FjaGVJdGVtID0gKFxuICBjYWNoZTogRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtLFxuKTogY2FjaGUgaXMgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCkgfHwgaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFeGVjdXRlZFRleHRDb21tYW5kQ2FjaGVJdGVtID0gKFxuICBjYWNoZTogRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtLFxuKTogY2FjaGUgaXMgRXhlY3V0ZWRUZXh0Q29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc1RleHRSZW5kZXJDb21tYW5kKGNhY2hlLmNvbW1hbmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IEVUX0NPTlRFTlRGVUxfQU5ZX0VOVFJZX0NPTlRFTlRfVFlQRV9TWVNfSUQgPSAnJCQkX2V0LWNvbnRlbnRmdWwtYW55LWVudHJ5LWNvbnRlbnQtdHlwZS1zeXMtaWQnO1xuXG5leHBvcnQgdHlwZSBDb250ZW50ZnVsSW5jbHVkZU1hcCA9IHtcbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBlbnRyeSBieSBpdHMgSUQgYW5kIGNvbnRlbnQgdHlwZSBJRC5cbiAgICpcbiAgICogVGhlIGNvbnRlbnQgdHlwZSBJRCBjYW4gYmUgZm91bmQgaW5zaWRlIHRoZSBlbnRyeSAtPiBzeXMgLT4gY29udGVudFR5cGUgLT4gc3lzIC0+IGlkIHByb3BlcnR5LlxuICAgKlxuICAgKiBZb3UgY2FuIHByb3ZpZGUgdGhlIGBFVF9DT05URU5URlVMX0FOWV9FTlRSWV9DT05URU5UX1RZUEVfU1lTX0lEYCBjb25zdGFudCB0byBtYXRjaCBhbnkgZW50cnkgc3lzIElELlxuICAgKiBCdXQgYmUgYXdhcmUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBlbnRyeSBhcyBpcyB3aXRob3V0IGFueSB0eXBlIGNoZWNraW5nLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2V0RW50cnk6IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oaWQ6IHN0cmluZywgY29udGVudFR5cGVJZDogc3RyaW5nKSA9PiBDb250ZW50ZnVsRW50cnk8VD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgbXVsdGlwbGUgZW50cmllcyBieSB0aGVpciBJRHMgYW5kIGNvbnRlbnQgdHlwZSBJRC5cbiAgICogSWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBUaGUgY29udGVudCB0eXBlIElEIGNhbiBiZSBmb3VuZCBpbnNpZGUgdGhlIGVudHJ5IC0+IHN5cyAtPiBjb250ZW50VHlwZSAtPiBzeXMgLT4gaWQgcHJvcGVydHkuXG4gICAqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSB0aGUgYEVUX0NPTlRFTlRGVUxfQU5ZX0VOVFJZX0NPTlRFTlRfVFlQRV9TWVNfSURgIGNvbnN0YW50IHRvIG1hdGNoIGFueSBlbnRyeSBzeXMgSUQuXG4gICAqIEJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGVudHJ5IGFzIGlzIHdpdGhvdXQgYW55IHR5cGUgY2hlY2tpbmcuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRFbnRyaWVzOiA8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0+KFxuICAgIGlkczogc3RyaW5nW10gfCBDb250ZW50ZnVsRW50cnlMaW5rSXRlbVtdLFxuICAgIGNvbnRlbnRUeXBlSWQ6IHN0cmluZyxcbiAgKSA9PiBDb250ZW50ZnVsRW50cnk8VD5bXTtcblxuICAvKipcbiAgICogU2VsZWN0IGFuIGFzc2V0IGJ5IGl0cyBJRC5cbiAgICovXG4gIGdldEFzc2V0OiAoaWQ6IHN0cmluZykgPT4gQ29udGVudGZ1bFJlc3RBc3NldCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBtdWx0aXBsZSBhc3NldHMgYnkgdGhlaXIgSURzLiBJZiBhbiBhc3NldCBpcyBub3QgZm91bmQsIGl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuXG4gICAqL1xuICBnZXRBc3NldHM6IChpZHM6IHN0cmluZ1tdKSA9PiBDb250ZW50ZnVsUmVzdEFzc2V0W107XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb250ZW50ZnVsLXJpY2gtdGV4dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgYCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2V0LWNvbnRlbnRmdWwtcmljaC10ZXh0LXJlbmRlcmVyJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudGZ1bFJpY2hUZXh0UmVuZGVyZXJDb21wb25lbnQge1xuICBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgX2NvbmZpZyA9IGluamVjdChDT05URU5URlVMX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnKCk7XG5cbiAgLyoqXG4gICAqIEEgY2FjaGUgZm9yIGFsbCBleGVjdXRlZCBjb21tYW5kcyB0aGF0IGFyZSBub3QgZGVsZXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIGFuZCBjb21wb25lbnRzLlxuICAgKiBUaGUga2V5IGlzIHRoZSByZW5kZXIgY29tbWFuZCBlbGVtZW50IElELlxuICAgKi9cbiAgX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50ZnVsIHJlc3BvbnNlIGdvdHRlbiB2aWEgdGhlaXIgUkVTVCBhcGkuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1kZWxpdmVyeS1hcGkvIy9yZWZlcmVuY2UvZW50cmllcy9lbnRyaWVzLWNvbGxlY3Rpb25cbiAgICovXG4gIGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxDb250ZW50ZnVsQ29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoZXJlIHRoZSByaWNoIHRleHQgZmllbGQgaXMgaW5zaWRlIHRoZSBjb250ZW50ZnVsIHJlc3BvbnNlLiBEb3QgYW5kIGFycmF5IG5vdGF0aW9uIGlzIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFwiaXRlbXNbMF0uZmllbGRzLmh0bWxcIlxuICAgKi9cbiAgcmljaFRleHRQYXRoID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBhbGwgaW5jbHVkZXMgaW4gdGhlIGNvbnRlbnRmdWwgcmVzcG9uc2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb29raW5nIHVwIGFzc2V0cyBhbmQgZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSByaWNoIHRleHQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGxvb3BzLlxuICAgKi9cbiAgY29udGVudEluY2x1ZGVzTWFwID0gY29tcHV0ZWQ8Q29udGVudGZ1bEluY2x1ZGVNYXA+KCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgY29uc3QgYXNzZXRzID0gY29udGVudD8uaW5jbHVkZXMuQXNzZXQ7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQ/LmluY2x1ZGVzLkVudHJ5O1xuXG4gICAgY29uc3QgYXNzZXRNYXAgPSBuZXcgTWFwKGFzc2V0cz8ubWFwKChhc3NldCkgPT4gW2Fzc2V0LnN5cy5pZCwgYXNzZXRdKSA/PyBbXSk7XG4gICAgY29uc3QgZW50cnlNYXAgPSBuZXcgTWFwKGVudHJpZXM/Lm1hcCgoZW50cnkpID0+IFtlbnRyeS5zeXMuaWQsIGVudHJ5XSkgPz8gW10pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBnZXRFbnRyeSA9IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oaWQ6IHN0cmluZywgY29udGVudFR5cGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJ5TWFwLmdldChpZCk7XG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFbnRyeSBub3QgZm91bmQhIFdpbGwgcmV0dXJuIG51bGwuIElzIHRoZSBpbmNsdWRlIHF1ZXJ5IHBhcmFtIHRvIGxvdz8nLCB7IGlkLCBlbnRyeU1hcCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGVudFR5cGVJZCA9PT0gRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRCkge1xuICAgICAgICByZXR1cm4gZW50cnkgYXMgQ29udGVudGZ1bEVudHJ5PFQ+O1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3lzLmNvbnRlbnRUeXBlLnN5cy5pZCAhPT0gY29udGVudFR5cGVJZCkge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0VudHJ5IHN5cyBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgc3lzIElEISBXaWxsIHJldHVybiBudWxsLicsIHtcbiAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgc3lzSWQ6IGNvbnRlbnRUeXBlSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5IGFzIENvbnRlbnRmdWxFbnRyeTxUPjtcbiAgICB9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBnZXRFbnRyaWVzID0gPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICAgIGlkczogc3RyaW5nW10gfCBDb250ZW50ZnVsRW50cnlMaW5rSXRlbVtdLFxuICAgICAgY29udGVudFR5cGVJZDogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IGlkc1xuICAgICAgICAubWFwKChpZCkgPT4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBpZCA6IGlkLnN5cy5pZCkpXG4gICAgICAgIC5tYXAoKGlkKSA9PiBnZXRFbnRyeTxUPihpZCwgY29udGVudFR5cGVJZCkpXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgQ29udGVudGZ1bEVudHJ5PFQ+ID0+IGVudHJ5ICE9PSBudWxsKTtcblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEFzc2V0ID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBhc3NldE1hcC5nZXQoaWQpID8/IG51bGw7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEFzc2V0cyA9IChpZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IGdldEFzc2V0KGlkKSkuZmlsdGVyKChhc3NldCk6IGFzc2V0IGlzIENvbnRlbnRmdWxSZXN0QXNzZXQgPT4gYXNzZXQgIT09IG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RW50cnksXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgZ2V0QXNzZXQsXG4gICAgICBnZXRBc3NldHMsXG4gICAgfTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSByaWNoIHRleHQgZGF0YSB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICovXG4gIHJpY2hUZXh0RGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgY29uc3QgcmljaFRleHRQYXRoID0gdGhpcy5yaWNoVGV4dFBhdGgoKTtcblxuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmljaFRleHQgPSBnZXRPYmplY3RQcm9wZXJ0eShjb250ZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJpY2hUZXh0UGF0aCk7XG5cbiAgICBpZiAoIWlzT2JqZWN0KHJpY2hUZXh0KSkge1xuICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdyaWNoX3RleHRfdW5kZWZpbmVkJywgZmFsc2UsIHsgY29udGVudCwgcmljaFRleHRQYXRoIH0pO1xuICAgIH1cblxuICAgIGlmICghaXNSaWNoVGV4dFJvb3ROb2RlKHJpY2hUZXh0KSkge1xuICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdyaWNoX3RleHRfd3JvbmdfdHlwZScsIGZhbHNlLCB7IGNvbnRlbnQsIHJpY2hUZXh0UGF0aCB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmljaFRleHQgYXMgUmljaFRleHRSZXNwb25zZTtcbiAgfSk7XG5cbiAgcmVuZGVyQ29tbWFuZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcmljaFRleHREYXRhID0gdGhpcy5yaWNoVGV4dERhdGEoKTtcblxuICAgIGlmICghcmljaFRleHREYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJlbmRlckNvbW1hbmRzKHJpY2hUZXh0RGF0YSk7XG4gIH0pO1xuXG4gIHJlbmRlckNvbW1hbmRIaXN0b3J5ID0gdG9TaWduYWwoXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMucmVuZGVyQ29tbWFuZHMpLnBpcGUoc3RhcnRXaXRoKFtdIGFzIFJlbmRlckNvbW1hbmRbXSksIHBhaXJ3aXNlKCkpLFxuICAgIHsgaW5pdGlhbFZhbHVlOiBbW10sIFtdXSB9LFxuICApO1xuXG4gIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBbcHJldkNvbW1hbmRzXSA9IHRoaXMucmVuZGVyQ29tbWFuZEhpc3RvcnkoKTtcblxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVtYmVyLCBSZW5kZXJDb21tYW5kPigpO1xuXG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIHByZXZDb21tYW5kcykge1xuICAgICAgbWFwLnNldChnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCksIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH0pO1xuXG4gIHJlbmRlckluc3RydWN0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMucmVuZGVyQ29tbWFuZHMoKTtcbiAgICBjb25zdCBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAgPSBuZXcgTWFwKHRoaXMucHJldmlvdXNSZW5kZXJDb21tYW5kTWFwKCkpO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBSZW5kZXJJbnN0cnVjdGlvbltdID0gW107XG5cbiAgICAvLyByZW1vdmUgZGVsZXRlZCBjb21wb25lbnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGVsZW1lbnRzXG4gICAgZm9yIChjb25zdCBbLCBjb21tYW5kXSBvZiBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXApIHtcbiAgICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgLy8ga2VlcCB0aGUgY29tcG9uZW50IGFyb3VuZCBpZiBpdCdzIHN0aWxsIGluIHRoZSBuZXcgY29tbWFuZHNcbiAgICAgICAgaWYgKGNvbW1hbmRzLnNvbWUoKGMpID0+IGdldFJlbmRlckNvbW1hbmRJZChjKSA9PT0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKFtSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5ERUxFVEUsIGNvbW1hbmRdKTtcblxuICAgICAgLy8gcmVtb3ZlIGZyb20gbWFwIHRvIG1hcmsgYXMgdXNlZFxuICAgICAgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwLmRlbGV0ZShnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCkpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGluZGV4ZXMgb2YgdGhlIGNvbW1hbmRzIHJlbWFpbmluZyBpbiB0aGUgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwIGluIHRoZSBuZXcgY29tbWFuZHMgYXJyYXkuXG4gICAgY29uc3QgbGFzdENvbXBvbmVudEluZGV4ZXM6IHsgbmV3SW5kZXg6IG51bWJlcjsgcHJldkluZGV4OiBudW1iZXI7IGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQgfVtdID0gW107XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbW1hbmRdIG9mIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjb21tYW5kcy5maW5kSW5kZXgoKGMpID0+IGdldFJlbmRlckNvbW1hbmRJZChjKSA9PT0gaWQpO1xuICAgICAgY29uc3QgbmV3Q29tbWFuZCA9IGNvbW1hbmRzW2luZGV4XSE7XG5cbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICAgIH1cblxuICAgICAgbGFzdENvbXBvbmVudEluZGV4ZXMucHVzaCh7XG4gICAgICAgIG5ld0luZGV4OiBpbmRleCxcbiAgICAgICAgcHJldkluZGV4OiBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLklOREVYXSxcbiAgICAgICAgY29tbWFuZDogbmV3Q29tbWFuZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RDb21wb25lbnRJbmRleGVzLnNvcnQoKGEsIGIpID0+IGEubmV3SW5kZXggLSBiLm5ld0luZGV4KTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZSBwcmV2SW5kZXggYXJlIGluIG9yZGVyIGFzY2VuZGluZ1xuICAgIC8vIGZvciBpbmRleGVzIHRoYXQgYXJlIG5vdCBpbiBvcmRlciwgY3JlYXRlIGEgbW92ZSBpbnN0cnVjdGlvblxuICAgIC8vIGZvciBpbmRleGVzIHRoYXQgYXJlIGluIG9yZGVyLCBjcmVhdGUgYW4gdXBkYXRlIGluc3RydWN0aW9uXG4gICAgbGV0IG1vdmVDaGVja0luZGV4ID0gMDtcbiAgICB3aGlsZSAobW92ZUNoZWNrSW5kZXggPCBsYXN0Q29tcG9uZW50SW5kZXhlcy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBtb3ZlQ3VyciA9IGxhc3RDb21wb25lbnRJbmRleGVzW21vdmVDaGVja0luZGV4XTtcbiAgICAgIGNvbnN0IG1vdmVOZXh0ID0gbGFzdENvbXBvbmVudEluZGV4ZXNbbW92ZUNoZWNrSW5kZXggKyAxXTtcblxuICAgICAgaWYgKCFtb3ZlQ3VyciB8fCAhbW92ZU5leHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlQ3Vyci5wcmV2SW5kZXggPiBtb3ZlTmV4dC5wcmV2SW5kZXgpIHtcbiAgICAgICAgbGFzdENvbXBvbmVudEluZGV4ZXMuc3BsaWNlKG1vdmVDaGVja0luZGV4ICsgMSwgMSk7XG4gICAgICAgIGluc3RydWN0aW9ucy5wdXNoKFtSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5NT1ZFLCBtb3ZlTmV4dC5jb21tYW5kXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuVVBEQVRFLCBtb3ZlTmV4dC5jb21tYW5kXSk7XG4gICAgICAgIG1vdmVDaGVja0luZGV4Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKTtcblxuICAgICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0NvbW1hbmQgPSBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAuZ2V0KGlkKTtcblxuICAgICAgICBpZiAoIXByZXZpb3VzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIGNyZWF0ZVxuICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKFtSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5DUkVBVEUsIGNvbW1hbmRdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY3JlYXRlXG4gICAgICAgIGluc3RydWN0aW9ucy5wdXNoKFtSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5DUkVBVEUsIGNvbW1hbmRdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0b09ic2VydmFibGUodGhpcy5yZW5kZXJJbnN0cnVjdGlvbnMpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIHRhcCgoaW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZXhlY0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVJlbmRlckNvbW1hbmRzKHJpY2hUZXh0RGF0YTogUmljaFRleHRSZXNwb25zZSkge1xuICAgIC8qKiBMaXN0IG9mIGFsbCByZW5kZXIgY29tbWFuZHMgKi9cbiAgICBjb25zdCByb290Q29tbWFuZHM6IFJlbmRlckNvbW1hbmRbXSA9IFtdO1xuXG4gICAgLyoqIENvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGh0bWwgZWxlbWVudCBJRHMuICovXG4gICAgbGV0IGVsZW1lbnRJZCA9IDA7XG5cbiAgICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgY29tcG9uZW50IElEcy4gKi9cbiAgICBjb25zdCBjb21wb25lbnRJZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICAvKiogVGhlIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbm9kZS4gKi9cbiAgICBsZXQgbmVzdGluZ0xldmVsID0gMDtcblxuICAgIC8qKiBUaGUgcG9zaXRpb24gKGluZGV4KSBvZiB0aGUgY3VycmVudCBub2RlIGluc2lkZSB0aGUgcGFyZW50IG5vZGUuICovXG4gICAgbGV0IGRvbVBvc2l0aW9uID0gMDtcblxuICAgIGxldCBjb21tYW5kSW5kZXggPSAwO1xuXG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZTogQmxvY2sgfCBJbmxpbmUgfCBUZXh0LCBwYXJlbnQ6IFJlbmRlckNvbW1hbmQgfCBudWxsID0gbnVsbCkgPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgLy8gUmVuZGVyIG1lZGlhXG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJFTkRFUl9DT01NQU5EX1RZUEUuVEVYVDtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gbm9kZS52YWx1ZTtcblxuICAgICAgICAgIGlmICghdGV4dCkgYnJlYWs7XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kOiBUZXh0UmVuZGVyQ29tbWFuZCA9IFt0eXBlLCBuZXN0aW5nTGV2ZWwsIGRvbVBvc2l0aW9uLCBjb21tYW5kSW5kZXgrKywgdGV4dF07XG5cbiAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICAgICAgICBkb21Qb3NpdGlvbisrO1xuXG4gICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigndGV4dF9wYXJlbnRfbm90X2ZvdW5kJywgZmFsc2UsIHsgbm9kZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChwYXJlbnQpICYmICFpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQocGFyZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCd0ZXh0X3BhcmVudF93cm9uZ190eXBlJywgZmFsc2UsIHsgbm9kZSwgcGFyZW50IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNQb3NpdGlvbiA9XG4gICAgICAgICAgICBwYXJlbnRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOXG4gICAgICAgICAgICAgID8gSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkFUVFJJQlVURVNcbiAgICAgICAgICAgICAgOiBDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQVRUUklCVVRFUztcblxuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJlbnRbYXR0cmlidXRlc1Bvc2l0aW9uXTtcblxuICAgICAgICAgIGlmIChub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWFya0NsYXNzZXMgPSBtYXJrc1RvQ2xhc3Mobm9kZS5tYXJrcyk7XG5cbiAgICAgICAgICAgIGlmIChDTEFTU19BVFRSIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlc1tDTEFTU19BVFRSXSArPSBgICR7bWFya0NsYXNzZXN9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXNbQ0xBU1NfQVRUUl0gPSBtYXJrQ2xhc3NlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQkxPQ0tTLkVNQkVEREVEX0FTU0VUOiB7XG4gICAgICAgICAgLy8gUmVuZGVyIG1lZGlhXG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJFTkRFUl9DT01NQU5EX1RZUEUuQ09NUE9ORU5UO1xuICAgICAgICAgIGNvbnN0IGFzc2V0SWQgPSBub2RlLmRhdGFbJ3RhcmdldCddPy5zeXM/LmlkO1xuXG4gICAgICAgICAgaWYgKCFhc3NldElkKSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2Fzc2V0X2lkX25vdF9mb3VuZCcsIGZhbHNlLCB7IG5vZGUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXNzZXQgPSB0aGlzLmNvbnRlbnRJbmNsdWRlc01hcCgpLmdldEFzc2V0KGFzc2V0SWQpO1xuXG4gICAgICAgICAgaWYgKCFhc3NldCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdhc3NldF9ub3RfZm91bmQnLCBmYWxzZSwgeyBhc3NldElkLCBub2RlIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gYXNzZXQuZmllbGRzLmZpbGUuY29udGVudFR5cGU7XG4gICAgICAgICAgY29uc3QgYXNzZXRDb21wb25lbnRzID0gdGhpcy5fY29uZmlnLmNvbXBvbmVudHM7XG5cbiAgICAgICAgICBjb25zdCBpc0ltYWdlID0gY29udGVudFR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJyk7XG4gICAgICAgICAgY29uc3QgaXNWaWRlbyA9IGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpO1xuICAgICAgICAgIGNvbnN0IGlzQXVkaW8gPSBjb250ZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKTtcblxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzSW1hZ2VcbiAgICAgICAgICAgID8gYXNzZXRDb21wb25lbnRzLmltYWdlXG4gICAgICAgICAgICA6IGlzVmlkZW9cbiAgICAgICAgICAgICAgPyBhc3NldENvbXBvbmVudHMudmlkZW9cbiAgICAgICAgICAgICAgOiBpc0F1ZGlvXG4gICAgICAgICAgICAgICAgPyBhc3NldENvbXBvbmVudHMuYXVkaW9cbiAgICAgICAgICAgICAgICA6IGFzc2V0Q29tcG9uZW50cy5maWxlO1xuXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGlzSW1hZ2VcbiAgICAgICAgICAgID8gREVGQVVMVF9DT01QT05FTlRfVFlQRVMuSU1BR0VcbiAgICAgICAgICAgIDogaXNWaWRlb1xuICAgICAgICAgICAgICA/IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLlZJREVPXG4gICAgICAgICAgICAgIDogaXNBdWRpb1xuICAgICAgICAgICAgICAgID8gREVGQVVMVF9DT01QT05FTlRfVFlQRVMuQVVESU9cbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLkZJTEU7XG5cbiAgICAgICAgICBsZXQgY29tcG9uZW50SWQgPSBjb21wb25lbnRJZE1hcC5nZXQoY29tcG9uZW50VHlwZSkgPz8gLTE7XG4gICAgICAgICAgY29uc3QgaWQgPSBjb21wb25lbnRUeXBlICsgKytjb21wb25lbnRJZDtcbiAgICAgICAgICBjb21wb25lbnRJZE1hcC5zZXQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuXG4gICAgICAgICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICAgICAgYXNzZXQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQgPSBbXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmVzdGluZ0xldmVsLFxuICAgICAgICAgICAgZG9tUG9zaXRpb24sXG4gICAgICAgICAgICBjb21tYW5kSW5kZXgrKyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICBkb21Qb3NpdGlvbisrO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEJMT0NLUy5FTUJFRERFRF9FTlRSWTpcbiAgICAgICAgY2FzZSBJTkxJTkVTLkVNQkVEREVEX0VOVFJZOiB7XG4gICAgICAgICAgLy8gUmVuZGVyIGNvbXBvbmVudFxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLkNPTVBPTkVOVDtcbiAgICAgICAgICBjb25zdCBlbnRyeUlkID0gbm9kZS5kYXRhWyd0YXJnZXQnXT8uc3lzPy5pZDtcblxuICAgICAgICAgIGlmICghZW50cnlJZCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdlbnRyeV9pZF9ub3RfZm91bmQnLCBmYWxzZSwgeyBub2RlIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb250ZW50SW5jbHVkZXNNYXAoKS5nZXRFbnRyeShlbnRyeUlkLCBFVF9DT05URU5URlVMX0FOWV9FTlRSWV9DT05URU5UX1RZUEVfU1lTX0lEKTtcblxuICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignZW50cnlfbm90X2ZvdW5kJywgZmFsc2UsIHsgZW50cnlJZCwgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gZW50cnkuc3lzLmNvbnRlbnRUeXBlLnN5cy5pZDtcblxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2NvbmZpZy5jdXN0b21Db21wb25lbnRzW2NvbXBvbmVudFR5cGVdO1xuXG4gICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignY3VzdG9tX2NvbXBvbmVudF9ub3RfZm91bmQnLCBmYWxzZSwge1xuICAgICAgICAgICAgICBjb21wb25lbnRUeXBlLFxuICAgICAgICAgICAgICBjdXN0b21Db21wb25lbnRzOiB0aGlzLl9jb25maWcuY3VzdG9tQ29tcG9uZW50cyxcbiAgICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgbGV0IGNvbXBvbmVudElkID0gY29tcG9uZW50SWRNYXAuZ2V0KGNvbXBvbmVudFR5cGUpID8/IC0xO1xuICAgICAgICAgIGNvbnN0IGlkID0gY29tcG9uZW50VHlwZSArICsrY29tcG9uZW50SWQ7XG4gICAgICAgICAgY29tcG9uZW50SWRNYXAuc2V0KGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkKTtcblxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgICAgIGZpZWxkczogZW50cnkuZmllbGRzLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgICAgICAgc3lzOiBlbnRyeS5zeXMsXG4gICAgICAgICAgICBpbmNsdWRlczogdGhpcy5jb250ZW50SW5jbHVkZXNNYXAoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY29tbWFuZDogQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9IFtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICBkb21Qb3NpdGlvbixcbiAgICAgICAgICAgIGNvbW1hbmRJbmRleCsrLFxuICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgIGRvbVBvc2l0aW9uKys7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCB0eXBlID0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU47XG4gICAgICAgICAgY29uc3QgdGFnID0gdHJhbnNsYXRlQ29udGVudGZ1bE5vZGVUeXBlVG9IdG1sVGFnKG5vZGUubm9kZVR5cGUpO1xuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgICBjb25zdCBpZCA9ICdlJyArIGVsZW1lbnRJZCsrO1xuXG4gICAgICAgICAgY29uc3QgY29tbWFuZDogSHRtbE9wZW5SZW5kZXJDb21tYW5kID0gW3R5cGUsIG5lc3RpbmdMZXZlbCwgZG9tUG9zaXRpb24sIGNvbW1hbmRJbmRleCsrLCBhdHRyaWJ1dGVzLCB0YWcsIGlkXTtcblxuICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgICAgICAgY29uc3QgZG9tUG9zaXRpb25BdFRoaXNMZXZlbCA9IGRvbVBvc2l0aW9uO1xuICAgICAgICAgIC8vIE5vcm1hbCBodG1sIGVsZW1lbnRzIGNhbiBoYXZlIGNoaWxkcmVuXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGRvbVBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbCsrO1xuICAgICAgICAgICAgdHJhdmVyc2UoY2hpbGQsIGNvbW1hbmQpO1xuICAgICAgICAgICAgbmVzdGluZ0xldmVsLS07XG4gICAgICAgICAgICBkb21Qb3NpdGlvbiA9IGRvbVBvc2l0aW9uQXRUaGlzTGV2ZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbGFzdENvbW1hbmQgPSByb290Q29tbWFuZHNbcm9vdENvbW1hbmRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb21tYW5kPy5bUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBjb21tYW5kIGlzIGFuIG9wZW4gY29tbWFuZCwgd2UgY2FuIHJlbW92ZSBpdCBzaW5jZSBpdCdzIGVtcHR5XG4gICAgICAgICAgICByb290Q29tbWFuZHMucG9wKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlSWQgPSAnZScgKyBlbGVtZW50SWQrKztcblxuICAgICAgICAgICAgY29uc3QgY2xvc2VDb21tYW5kOiBIdG1sQ2xvc2VSZW5kZXJDb21tYW5kID0gW1xuICAgICAgICAgICAgICBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfQ0xPU0UsXG4gICAgICAgICAgICAgIG5lc3RpbmdMZXZlbCxcbiAgICAgICAgICAgICAgZG9tUG9zaXRpb24sXG4gICAgICAgICAgICAgIGNvbW1hbmRJbmRleCsrLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIGNsb3NlSWQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY2xvc2VDb21tYW5kKTtcblxuICAgICAgICAgICAgZG9tUG9zaXRpb24rKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gSU5MSU5FUy5IWVBFUkxJTkspIHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IG5vZGUuZGF0YVsndXJpJ107XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydocmVmJ10gPSB1cmk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9kb2N1bWVudC5sb2NhdGlvbi5ob3N0O1xuICAgICAgICAgICAgY29uc3QgaXNFeHRlcm5hbCA9ICF1cmkuaW5jbHVkZXMoaG9zdCk7XG5cbiAgICAgICAgICAgIGlmIChpc0V4dGVybmFsKSB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ3RhcmdldCddID0gJ19ibGFuayc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHJpY2hUZXh0RGF0YS5jb250ZW50KSB7XG4gICAgICB0cmF2ZXJzZShub2RlLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdENvbW1hbmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFJlbmRlckluc3RydWN0aW9uW10pIHtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uW1JFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTi5UWVBFXTtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBpbnN0cnVjdGlvbltSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04uQ09NTUFORF07XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkNSRUFURTpcbiAgICAgICAgICB0aGlzLl9ydW5DcmVhdGVJbnN0cnVjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5VUERBVEU6XG4gICAgICAgICAgdGhpcy5fcnVuVXBkYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuTU9WRTpcbiAgICAgICAgICB0aGlzLl9ydW5Nb3ZlSW5zdHJ1Y3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuREVMRVRFOlxuICAgICAgICAgIHRoaXMuX3J1bkRlbGV0ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3J1bkNyZWF0ZUluc3RydWN0aW9uKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBpZCA9IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKTtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5fZmluZFBhcmVudChjb21tYW5kKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IHRoaXMuX2ZpbmRGb2xsb3dpbmdFbGVtZW50KGNvbW1hbmQpO1xuXG4gICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tbWFuZFtDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQ09NUE9ORU5UXSk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUNvbXBvbmVudElucHV0cyhjb21tYW5kLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICBjb25zdCByb290Tm9kZSA9IHRoaXMuX2dldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZik7XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKHJvb3ROb2RlLCBwYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgICBlbGVtZW50OiByb290Tm9kZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNUZXh0UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgY29uc3QgdGV4dCA9IGNvbW1hbmRbVEVYVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5URVhUXTtcbiAgICAgIGNvbnN0IHRleHROb2RlID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlVGV4dCh0ZXh0KTtcbiAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChzcGFuLCB0ZXh0Tm9kZSk7XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKHNwYW4sIHBhcmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBlbGVtZW50OiBzcGFuLFxuICAgICAgICB0ZXh0Tm9kZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHRhZyA9IGNvbW1hbmRbSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRBR19OQU1FXTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5BVFRSSUJVVEVTXTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVySW5zZXJ0T3JBcHBlbmQoZWxlbWVudCwgcGFyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5VcGRhdGVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChpZCk7XG5cbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgaWYgKCFpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbShjYWNoZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgaXMgbm90IGEgY29tcG9uZW50IGNvbW1hbmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNhY2hlZC5jb21wb25lbnRSZWY7XG5cbiAgICAgIGlmICghY29tcG9uZW50UmVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IHJlZiBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUNvbXBvbmVudElucHV0cyhjb21tYW5kLCBjb21wb25lbnRSZWYpO1xuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgIC4uLmNhY2hlZCxcbiAgICAgIGNvbW1hbmQ6IGNvbW1hbmQgYXMgYW55LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcnVuTW92ZUluc3RydWN0aW9uKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBpZCA9IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuZ2V0KGlkKTtcblxuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBpZiAoIWlzRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtKGNhY2hlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBpcyBub3QgYSBjb21wb25lbnQgY29tbWFuZCEnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gY2FjaGVkLmNvbXBvbmVudFJlZjtcblxuICAgICAgaWYgKCFjb21wb25lbnRSZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgcmVmIG5vdCBmb3VuZCEnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm9vdE5vZGUgPSBjYWNoZWQuZWxlbWVudDtcbiAgICAgIGNvbnN0IG9sZFBhcmVudEVsZW1lbnQgPSBjYWNoZWQuZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDaGlsZChvbGRQYXJlbnRFbGVtZW50LCByb290Tm9kZSk7XG5cbiAgICAgIGNvbnN0IG5ld1BhcmVudEVsZW1lbnQgPSB0aGlzLl9maW5kUGFyZW50KGNvbW1hbmQpO1xuICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSB0aGlzLl9maW5kRm9sbG93aW5nRWxlbWVudChjb21tYW5kKTtcblxuICAgICAgdGhpcy5fcmVuZGVySW5zZXJ0T3JBcHBlbmQocm9vdE5vZGUsIG5ld1BhcmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fdXBkYXRlQ29tcG9uZW50SW5wdXRzKGNvbW1hbmQsIGNvbXBvbmVudFJlZik7XG5cbiAgICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgICAgLi4uY2FjaGVkLFxuICAgICAgICBjb21tYW5kOiBjb21tYW5kIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3J1bkRlbGV0ZUluc3RydWN0aW9uKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBpZCA9IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuZ2V0KGlkKTtcblxuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBpZiAoaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgaWYgKCFpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbShjYWNoZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgaXMgbm90IGEgY29tcG9uZW50IGNvbW1hbmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlZC5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKGNhY2hlZC5lbGVtZW50Py5wYXJlbnRFbGVtZW50LCBjYWNoZWQuZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2hpbGQoY2FjaGVkLmVsZW1lbnQ/LnBhcmVudEVsZW1lbnQsIGNhY2hlZC5lbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4pOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNvbXBvbmVudElucHV0cyhjb21tYW5kOiBDb21wb25lbnRSZW5kZXJDb21tYW5kLCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29tbWFuZFtDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uSU5QVVRTXSkpIHtcbiAgICAgIGlmICghY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0pIGNvbnRpbnVlO1xuXG4gICAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmluZFBhcmVudChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaG9zdEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgbmVzdGluZ0xldmVsID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXTtcbiAgICBsZXQgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVzdGluZ0xldmVsID09PSAwKSB7XG4gICAgICBwYXJlbnRFbGVtZW50ID0gaG9zdEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVyc2Ugc2VhcmNoIGFsbCByZW5kZXIgY29tbWFuZHMgYmVnaW5uaW5nIGZyb20gdGhlIGN1cnJlbnQgb25lIHVzaW5nIGEgZm9yIGxvb3AuXG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGZvdW5kIHdoZW4gdGhlIGNvbW1hbmQncyBuZXN0aW5nIGxldmVsIGlzdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBuZXN0aW5nIGxldmVsIG1pbnVzIDEuXG4gICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBmb3VuZCwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IHRoaXMucmVuZGVyQ29tbWFuZHMoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb21tYW5kSW5kZXggPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLklOREVYXTtcblxuICAgICAgbGV0IHBhcmVudENvbW1hbmQ6IFJlbmRlckNvbW1hbmQgfCBudWxsID0gbnVsbDtcblxuICAgICAgZm9yIChsZXQgaSA9IGN1cnJlbnRDb21tYW5kSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBjbWQgPSBhbGxDb21tYW5kc1tpXTtcblxuICAgICAgICBpZiAoIWNtZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY21kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdID09PSBuZXN0aW5nTGV2ZWwgLSAxKSB7XG4gICAgICAgICAgcGFyZW50Q29tbWFuZCA9IGNtZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXBhcmVudENvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgY29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEVsZW1lbnQgPSB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuZ2V0KGdldFJlbmRlckNvbW1hbmRJZChwYXJlbnRDb21tYW5kKSk/LmVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBlbGVtZW50IG5vdCBmb3VuZCEnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRGb2xsb3dpbmdFbGVtZW50KGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBjYWNoZUFycmF5ID0gQXJyYXkuZnJvbSh0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUudmFsdWVzKCkpO1xuICAgIGxldCBuZXh0RWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkb21Qb3NpdGlvbiA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uRE9NX1BPU0lUSU9OXTtcbiAgICBjb25zdCBuZXN0aW5nTGV2ZWwgPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdO1xuICAgIGNvbnN0IHR5cGUgPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdO1xuXG4gICAgLy8gIFRyeSB0byBmaW5kIGFuIGFscmVhZHkgcmVuZGVyZWQgZWxlbWVudCB3aXRoIGEgZG9tUG9zaXRpb24gdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgZG9tUG9zaXRpb24uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSwgdXNlIHRoZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgZG9tUG9zaXRpb24uXG4gICAgLy8gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHVzZSAuYXBwZW5kQ2hpbGQgdG8gc2ltcGx5IGFwcGVuZCB0aGUgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICAvLyBJZiBpdCBkb2VzIGV4aXN0LCB1c2UgLmluc2VydEJlZm9yZSB0byBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHRoZSBmb3VuZCBlbGVtZW50LlxuICAgIGZvciAoY29uc3QgY2FjaGVkIG9mIGNhY2hlQXJyYXkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2FjaGVkLmNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uRE9NX1BPU0lUSU9OXSA+IGRvbVBvc2l0aW9uICYmXG4gICAgICAgIGNhY2hlZC5jb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdID09PSBuZXN0aW5nTGV2ZWwgJiZcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGRvZXMgbm90IGZpbmQgaXRzZWxmXG4gICAgICAgIGNhY2hlZC5jb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdICE9PSB0eXBlXG4gICAgICApIHtcbiAgICAgICAgbmV4dEVsZW1lbnQgPSBjYWNoZWQuZWxlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW5zZXJ0T3JBcHBlbmQoXG4gICAgbm9kZVRvUmVuZGVyOiBIVE1MRWxlbWVudCxcbiAgICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBuZXh0RWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGlmIChuZXh0RWxlbWVudCkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHBhcmVudEVsZW1lbnQsIG5vZGVUb1JlbmRlciwgbmV4dEVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBub2RlVG9SZW5kZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RlYnVnVmlzdWFsaXplUmVuZGVyQ29tbWFuZHMoY29tbWFuZHM6IFJlbmRlckNvbW1hbmRbXSkge1xuICAgIGNvbnN0IGRlYnVnID0gY29tbWFuZHMubWFwKChjb21tYW5kKSA9PiB0aGlzLl9zdHJpbmdpZnlSZW5kZXJDb21tYW5kKGNvbW1hbmQpKS5mbGF0KCk7XG5cbiAgICBjb25zdCBwcmV0dGlmaWVkID0gZm9ybWF0SFRNTChkZWJ1Zyk7XG5cbiAgICByZXR1cm4gcHJldHRpZmllZDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0cmluZ2lmeVJlbmRlckNvbW1hbmQoY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IG5lc3RBdHRyID0gYG5lc3Q9XCIke2NvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF19XCJgO1xuICAgIGNvbnN0IGRvbUF0dHIgPSBgZG9tPVwiJHtjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkRPTV9QT1NJVElPTl19XCJgO1xuXG4gICAgaWYgKGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICByZXR1cm4gYDwke2NvbW1hbmRbSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRBR19OQU1FXX0gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gO1xuICAgIH0gZWxzZSBpZiAoaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICByZXR1cm4gYDwvJHtjb21tYW5kW0hUTUxfQ0xPU0VfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEFHX05BTUVdfSAke25lc3RBdHRyfSAke2RvbUF0dHJ9PmA7XG4gICAgfSBlbHNlIGlmIChpc1RleHRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICByZXR1cm4gW2A8c3BhbiAke25lc3RBdHRyfSAke2RvbUF0dHJ9PmAsIGNvbW1hbmRbVEVYVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5URVhUXSwgJzwvc3Bhbj4nXTtcbiAgICB9IGVsc2UgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb21tYW5kW0NPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5DT01QT05FTlRfVFlQRV07XG4gICAgICByZXR1cm4gW2A8JHtzZWxlY3Rvcn0gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gLCBgPC8ke3NlbGVjdG9yfT5gXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdVTktOT1dOJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdHJpbmdpZnlSZW5kZXJJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogUmVuZGVySW5zdHJ1Y3Rpb24pIHtcbiAgICBjb25zdCB0eXBlID0gaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLlRZUEVdO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWRUeXBlID0gT2JqZWN0LmVudHJpZXMoUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUpLmZpbmQoKFssIHZhbHVlXSkgPT4gdmFsdWUgPT09IHR5cGUpPy5bMF07XG5cbiAgICBjb25zdCBjb21tYW5kID0gdGhpcy5fc3RyaW5naWZ5UmVuZGVyQ29tbWFuZChpbnN0cnVjdGlvbltSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04uQ09NTUFORF0pO1xuXG4gICAgcmV0dXJuIGAke3RyYW5zbGF0ZWRUeXBlfTogJHtjb21tYW5kfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SFRNTChodG1sOiBzdHJpbmdbXSkge1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBpbmRlbnQgPSAwO1xuXG4gIGZvciAoY29uc3QgdGFnIG9mIGh0bWwpIHtcbiAgICBpZiAodGFnLnN0YXJ0c1dpdGgoJzwvJykpIHtcbiAgICAgIGluZGVudC0tO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKCcgJy5yZXBlYXQoaW5kZW50ICogMikgKyB0YWcpO1xuXG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKCc8JykgJiYgIXRhZy5zdGFydHNXaXRoKCc8LycpKSB7XG4gICAgICBpbmRlbnQrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xufVxuIl19
|
|
760
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL2NvbXBvbmVudHMvcmljaC10ZXh0LXJlbmRlcmVyL3JpY2gtdGV4dC1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFVBQVUsRUFFVixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsTUFBTSxFQUFTLE9BQU8sRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQVF6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsU0FBUyxFQUFFLENBQUM7SUFDWixVQUFVLEVBQUUsQ0FBQztJQUNi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Rjs7QUFtdEJELFNBQVMsVUFBVSxDQUFDLElBQWM7SUFDaEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxFQUFFLENBQUM7UUFDWCxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUUxQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakQsTUFBTSxFQUFFLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQkxPQ0tTLCBCbG9jaywgSU5MSU5FUywgSW5saW5lLCBNYXJrLCBUZXh0IH0gZnJvbSAnQGNvbnRlbnRmdWwvcmljaC10ZXh0LXR5cGVzJztcbmltcG9ydCB7IGdldE9iamVjdFByb3BlcnR5LCBpc09iamVjdCB9IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgcGFpcndpc2UsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDT05URU5URlVMX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb250ZW50ZnVsLmNvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb250ZW50ZnVsQ29sbGVjdGlvbixcbiAgQ29udGVudGZ1bEVudHJ5LFxuICBDb250ZW50ZnVsRW50cnlMaW5rSXRlbSxcbiAgQ29udGVudGZ1bFJlc3RBc3NldCxcbiAgUmljaFRleHRSZXNwb25zZSxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGVudGZ1bENvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbnRlbnRmdWwtY29uZmlnJztcbmltcG9ydCB7IHJpY2hUZXh0UmVuZGVyZXJFcnJvciB9IGZyb20gJy4vcmljaC10ZXh0LXJlbmRlcmVyLmVycm9ycyc7XG5pbXBvcnQgeyBpc1JpY2hUZXh0Um9vdE5vZGUsIHRyYW5zbGF0ZUNvbnRlbnRmdWxOb2RlVHlwZVRvSHRtbFRhZyB9IGZyb20gJy4vcmljaC10ZXh0LXJlbmRlcmVyLnV0aWwnO1xuXG5leHBvcnQgY29uc3QgUkVOREVSX0NPTU1BTkRfVFlQRSA9IHtcbiAgSFRNTF9PUEVOOiAwLFxuICBIVE1MX0NMT1NFOiAxLFxuICBURVhUOiAyLFxuICBDT01QT05FTlQ6IDMsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIFRZUEU6IDAsXG4gIE5FU1RJTkdfTEVWRUw6IDEsXG4gIERPTV9QT1NJVElPTjogMixcbiAgSU5ERVg6IDMsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBBVFRSSUJVVEVTOiA0LFxuICBUQUdfTkFNRTogNSxcbiAgRUxFTUVOVF9JRDogNixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBIVE1MX0NMT1NFX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBUQUdfTkFNRTogNCxcbiAgRUxFTUVOVF9JRDogNSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBURVhUX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBURVhUOiA0LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgQVRUUklCVVRFUzogNCxcbiAgQ09NUE9ORU5UOiA1LFxuICBJTlBVVFM6IDYsXG4gIENPTVBPTkVOVF9UWVBFOiA3LFxufSBhcyBjb25zdDtcblxudHlwZSBIdG1sT3BlblJlbmRlckNvbW1hbmQgPSBbXG4gIHR5cGU6IHR5cGVvZiBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTixcbiAgbmVzdGluZ0xldmVsOiBudW1iZXIsXG4gIGRvbVBvc2l0aW9uOiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgZWxlbWVudElkOiBzdHJpbmcsXG5dO1xuXG50eXBlIEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgPSBbXG4gIHR5cGU6IHR5cGVvZiBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfQ0xPU0UsXG4gIG5lc3RpbmdMZXZlbDogbnVtYmVyLFxuICBkb21Qb3NpdGlvbjogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIGVsZW1lbnRJZDogc3RyaW5nLFxuXTtcblxudHlwZSBUZXh0UmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuVEVYVCxcbiAgbmVzdGluZ0xldmVsOiBudW1iZXIsXG4gIGRvbVBvc2l0aW9uOiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHRleHQ6IHN0cmluZyxcbl07XG5cbnR5cGUgQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuQ09NUE9ORU5ULFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPHVua25vd24+LFxuICBpbnB1dHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb21wb25lbnRUeXBlOiBzdHJpbmcsXG5dO1xuXG50eXBlIFJlbmRlckNvbW1hbmQgPSBIdG1sT3BlblJlbmRlckNvbW1hbmQgfCBIdG1sQ2xvc2VSZW5kZXJDb21tYW5kIHwgVGV4dFJlbmRlckNvbW1hbmQgfCBDb21wb25lbnRSZW5kZXJDb21tYW5kO1xuXG5leHBvcnQgY29uc3QgUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OID0ge1xuICBUWVBFOiAwLFxuICBDT01NQU5EOiAxLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFID0ge1xuICBDUkVBVEU6IDAsXG4gIFVQREFURTogMSxcbiAgREVMRVRFOiAyLFxuICBNT1ZFOiAzLFxufSBhcyBjb25zdDtcblxudHlwZSBSZW5kZXJJbnN0cnVjdGlvblR5cGVWYWx1ZSA9ICh0eXBlb2YgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUpW2tleW9mIHR5cGVvZiBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRV07XG5cbnR5cGUgUmVuZGVySW5zdHJ1Y3Rpb24gPSBbUmVuZGVySW5zdHJ1Y3Rpb25UeXBlVmFsdWUsIFJlbmRlckNvbW1hbmRdO1xuXG5jb25zdCBNQVJLX1RBSUxXSU5EX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYm9sZDogJ2ZvbnQtYm9sZCcsXG4gIGl0YWxpYzogJ2l0YWxpYycsXG4gIHVuZGVybGluZTogJ3VuZGVybGluZScsXG4gIGNvZGU6ICdmb250LW1vbm8nLFxufTtcblxuZXhwb3J0IGNvbnN0IG1hcmtzVG9DbGFzcyA9IChtYXJrczogTWFya1tdKSA9PiB7XG4gIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBtYXJrIG9mIG1hcmtzKSB7XG4gICAgbGV0IGtsYXNzID0gTUFSS19UQUlMV0lORF9NQVBbbWFyay50eXBlXTtcblxuICAgIGlmICgha2xhc3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTm8gY2xhc3MgZm91bmQgZm9yIG1hcmsgdHlwZSEgRmFsbGluZyBiYWNrIHRvIFwiJHttYXJrLnR5cGV9XCIuYCwgbWFyayk7XG5cbiAgICAgIGtsYXNzID0gbWFyay50eXBlO1xuICAgIH1cblxuICAgIGNsYXNzZXMucHVzaChrbGFzcyk7XG4gIH1cblxuICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIdG1sT3BlblJlbmRlckNvbW1hbmQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCk6IGNvbW1hbmQgaXMgSHRtbE9wZW5SZW5kZXJDb21tYW5kID0+IHtcbiAgcmV0dXJuIGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBIdG1sQ2xvc2VSZW5kZXJDb21tYW5kID0+IHtcbiAgcmV0dXJuIGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9DTE9TRTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1RleHRSZW5kZXJDb21tYW5kID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpOiBjb21tYW5kIGlzIFRleHRSZW5kZXJDb21tYW5kID0+IHtcbiAgcmV0dXJuIGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuVEVYVDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCk6IGNvbW1hbmQgaXMgQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9PiB7XG4gIHJldHVybiBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkNPTVBPTkVOVDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZW5kZXJDb21tYW5kSWQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCkgPT4ge1xuICBpZiAoaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICByZXR1cm4gY29tbWFuZFtIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uRUxFTUVOVF9JRF07XG4gIH0gZWxzZSBpZiAoaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRbSFRNTF9DTE9TRV9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5FTEVNRU5UX0lEXTtcbiAgfSBlbHNlIGlmIChpc1RleHRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRbVEVYVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5URVhUXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tbWFuZFtDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQ09NUE9ORU5UX1RZUEVdO1xuICB9XG59O1xuXG5jb25zdCBDTEFTU19BVFRSID0gJ2NsYXNzJztcbmNvbnN0IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTID0ge1xuICBJTUFHRTogJyQkJF9ldC1pbWFnZScsXG4gIFZJREVPOiAnJCQkX2V0LXZpZGVvJyxcbiAgQVVESU86ICckJCRfZXQtYXVkaW8nLFxuICBGSUxFOiAnJCQkX2V0LWZpbGUnLFxufTtcblxudHlwZSBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlID0ge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn07XG5cbnR5cGUgRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtID0ge1xuICBjb21tYW5kOiBDb21wb25lbnRSZW5kZXJDb21tYW5kO1xuICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjx1bmtub3duPjtcbn0gJiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlO1xuXG50eXBlIEV4ZWN1dGVkSHRtbENvbW1hbmRDYWNoZUl0ZW0gPSB7XG4gIGNvbW1hbmQ6IEh0bWxPcGVuUmVuZGVyQ29tbWFuZCB8IEh0bWxDbG9zZVJlbmRlckNvbW1hbmQ7XG59ICYgRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtQmFzZTtcblxudHlwZSBFeGVjdXRlZFRleHRDb21tYW5kQ2FjaGVJdGVtID0ge1xuICBjb21tYW5kOiBUZXh0UmVuZGVyQ29tbWFuZDtcbiAgdGV4dE5vZGU6IHVua25vd247XG59ICYgRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtQmFzZTtcblxudHlwZSBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0gPVxuICB8IEV4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbVxuICB8IEV4ZWN1dGVkSHRtbENvbW1hbmRDYWNoZUl0ZW1cbiAgfCBFeGVjdXRlZFRleHRDb21tYW5kQ2FjaGVJdGVtO1xuXG5leHBvcnQgY29uc3QgaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0gPSAoXG4gIGNhY2hlOiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0sXG4pOiBjYWNoZSBpcyBFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0gPT4ge1xuICByZXR1cm4gaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNhY2hlLmNvbW1hbmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRXhlY3V0ZWRIdG1sT3JUZXh0Q29tbWFuZENhY2hlSXRlbSA9IChcbiAgY2FjaGU6IEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSxcbik6IGNhY2hlIGlzIEV4ZWN1dGVkSHRtbENvbW1hbmRDYWNoZUl0ZW0gPT4ge1xuICByZXR1cm4gaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kKGNhY2hlLmNvbW1hbmQpIHx8IGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNhY2hlLmNvbW1hbmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRXhlY3V0ZWRUZXh0Q29tbWFuZENhY2hlSXRlbSA9IChcbiAgY2FjaGU6IEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSxcbik6IGNhY2hlIGlzIEV4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW0gPT4ge1xuICByZXR1cm4gaXNUZXh0UmVuZGVyQ29tbWFuZChjYWNoZS5jb21tYW5kKTtcbn07XG5cbmV4cG9ydCBjb25zdCBFVF9DT05URU5URlVMX0FOWV9FTlRSWV9DT05URU5UX1RZUEVfU1lTX0lEID0gJyQkJF9ldC1jb250ZW50ZnVsLWFueS1lbnRyeS1jb250ZW50LXR5cGUtc3lzLWlkJztcblxuZXhwb3J0IHR5cGUgQ29udGVudGZ1bEluY2x1ZGVNYXAgPSB7XG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZW50cnkgYnkgaXRzIElEIGFuZCBjb250ZW50IHR5cGUgSUQuXG4gICAqXG4gICAqIFRoZSBjb250ZW50IHR5cGUgSUQgY2FuIGJlIGZvdW5kIGluc2lkZSB0aGUgZW50cnkgLT4gc3lzIC0+IGNvbnRlbnRUeXBlIC0+IHN5cyAtPiBpZCBwcm9wZXJ0eS5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIHRoZSBgRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRGAgY29uc3RhbnQgdG8gbWF0Y2ggYW55IGVudHJ5IHN5cyBJRC5cbiAgICogQnV0IGJlIGF3YXJlIHRoYXQgdGhpcyB3aWxsIHJldHVybiB0aGUgZW50cnkgYXMgaXMgd2l0aG91dCBhbnkgdHlwZSBjaGVja2luZy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGdldEVudHJ5OiA8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0+KGlkOiBzdHJpbmcsIGNvbnRlbnRUeXBlSWQ6IHN0cmluZykgPT4gQ29udGVudGZ1bEVudHJ5PFQ+IHwgbnVsbDtcblxuICAvKipcbiAgICogU2VsZWN0IG11bHRpcGxlIGVudHJpZXMgYnkgdGhlaXIgSURzIGFuZCBjb250ZW50IHR5cGUgSUQuXG4gICAqIElmIGFuIGVudHJ5IGlzIG5vdCBmb3VuZCwgaXQgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC5cbiAgICpcbiAgICogVGhlIGNvbnRlbnQgdHlwZSBJRCBjYW4gYmUgZm91bmQgaW5zaWRlIHRoZSBlbnRyeSAtPiBzeXMgLT4gY29udGVudFR5cGUgLT4gc3lzIC0+IGlkIHByb3BlcnR5LlxuICAgKlxuICAgKiBZb3UgY2FuIHByb3ZpZGUgdGhlIGBFVF9DT05URU5URlVMX0FOWV9FTlRSWV9DT05URU5UX1RZUEVfU1lTX0lEYCBjb25zdGFudCB0byBtYXRjaCBhbnkgZW50cnkgc3lzIElELlxuICAgKiBCdXQgYmUgYXdhcmUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBlbnRyeSBhcyBpcyB3aXRob3V0IGFueSB0eXBlIGNoZWNraW5nLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2V0RW50cmllczogPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICBpZHM6IHN0cmluZ1tdIHwgQ29udGVudGZ1bEVudHJ5TGlua0l0ZW1bXSxcbiAgICBjb250ZW50VHlwZUlkOiBzdHJpbmcsXG4gICkgPT4gQ29udGVudGZ1bEVudHJ5PFQ+W107XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBhc3NldCBieSBpdHMgSUQuXG4gICAqL1xuICBnZXRBc3NldDogKGlkOiBzdHJpbmcpID0+IENvbnRlbnRmdWxSZXN0QXNzZXQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgbXVsdGlwbGUgYXNzZXRzIGJ5IHRoZWlyIElEcy4gSWYgYW4gYXNzZXQgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICAgKi9cbiAgZ2V0QXNzZXRzOiAoaWRzOiBzdHJpbmdbXSkgPT4gQ29udGVudGZ1bFJlc3RBc3NldFtdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb250ZW50ZnVsSW5jbHVkZU1hcENvbmZpZyB7XG4gIC8qKiBUaGUgZW50cmllcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluc2lkZSB0aGUgbWFwICAqL1xuICBlbnRyaWVzOiBDb250ZW50ZnVsRW50cnlbXTtcblxuICAvKiogVGhlIGFzc2V0cyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluc2lkZSB0aGUgbWFwICAqL1xuICBhc3NldHM6IENvbnRlbnRmdWxSZXN0QXNzZXRbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb250ZW50ZnVsIGluY2x1ZGUgbWFwIHVzaW5nIHRoZSBwcm92aWRlZCBlbnRyaWVzIGFuZCBhc3NldHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZW50ZnVsSW5jbHVkZU1hcCA9IChjb25maWc6IENyZWF0ZUNvbnRlbnRmdWxJbmNsdWRlTWFwQ29uZmlnKTogQ29udGVudGZ1bEluY2x1ZGVNYXAgPT4ge1xuICBjb25zdCB7IGVudHJpZXMsIGFzc2V0cyB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IGFzc2V0TWFwID0gbmV3IE1hcChhc3NldHMubWFwKChhc3NldCkgPT4gW2Fzc2V0LnN5cy5pZCwgYXNzZXRdKSk7XG4gIGNvbnN0IGVudHJ5TWFwID0gbmV3IE1hcChlbnRyaWVzLm1hcCgoZW50cnkpID0+IFtlbnRyeS5zeXMuaWQsIGVudHJ5XSkpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IGdldEVudHJ5ID0gPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihpZDogc3RyaW5nLCBjb250ZW50VHlwZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJ5TWFwLmdldChpZCk7XG5cbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdFbnRyeSBub3QgZm91bmQhIFdpbGwgcmV0dXJuIG51bGwuIElzIHRoZSBpbmNsdWRlIHF1ZXJ5IHBhcmFtIHRvIGxvdz8nLCB7IGlkLCBlbnRyeU1hcCB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnRUeXBlSWQgPT09IEVUX0NPTlRFTlRGVUxfQU5ZX0VOVFJZX0NPTlRFTlRfVFlQRV9TWVNfSUQpIHtcbiAgICAgIHJldHVybiBlbnRyeSBhcyBDb250ZW50ZnVsRW50cnk8VD47XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnN5cy5jb250ZW50VHlwZS5zeXMuaWQgIT09IGNvbnRlbnRUeXBlSWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0VudHJ5IHN5cyBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgc3lzIElEISBXaWxsIHJldHVybiBudWxsLicsIHtcbiAgICAgICAgICBlbnRyeSxcbiAgICAgICAgICBzeXNJZDogY29udGVudFR5cGVJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRyeSBhcyBDb250ZW50ZnVsRW50cnk8VD47XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3QgZ2V0RW50cmllcyA9IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oXG4gICAgaWRzOiBzdHJpbmdbXSB8IENvbnRlbnRmdWxFbnRyeUxpbmtJdGVtW10sXG4gICAgY29udGVudFR5cGVJZDogc3RyaW5nLFxuICApID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gaWRzXG4gICAgICAubWFwKChpZCkgPT4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBpZCA6IGlkLnN5cy5pZCkpXG4gICAgICAubWFwKChpZCkgPT4gZ2V0RW50cnk8VD4oaWQsIGNvbnRlbnRUeXBlSWQpKVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBDb250ZW50ZnVsRW50cnk8VD4gPT4gZW50cnkgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH07XG5cbiAgY29uc3QgZ2V0QXNzZXQgPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBhc3NldE1hcC5nZXQoaWQpID8/IG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0QXNzZXRzID0gKGlkczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IGdldEFzc2V0KGlkKSkuZmlsdGVyKChhc3NldCk6IGFzc2V0IGlzIENvbnRlbnRmdWxSZXN0QXNzZXQgPT4gYXNzZXQgIT09IG51bGwpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0RW50cnksXG4gICAgZ2V0RW50cmllcyxcbiAgICBnZXRBc3NldCxcbiAgICBnZXRBc3NldHMsXG4gIH07XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb250ZW50ZnVsLXJpY2gtdGV4dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgYCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2V0LWNvbnRlbnRmdWwtcmljaC10ZXh0LXJlbmRlcmVyJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudGZ1bFJpY2hUZXh0UmVuZGVyZXJDb21wb25lbnQge1xuICBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgX2NvbmZpZyA9IGluamVjdChDT05URU5URlVMX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnKCk7XG5cbiAgLyoqXG4gICAqIEEgY2FjaGUgZm9yIGFsbCBleGVjdXRlZCBjb21tYW5kcyB0aGF0IGFyZSBub3QgZGVsZXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIGFuZCBjb21wb25lbnRzLlxuICAgKiBUaGUga2V5IGlzIHRoZSByZW5kZXIgY29tbWFuZCBlbGVtZW50IElELlxuICAgKi9cbiAgX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50ZnVsIHJlc3BvbnNlIGdvdHRlbiB2aWEgdGhlaXIgUkVTVCBhcGkuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1kZWxpdmVyeS1hcGkvIy9yZWZlcmVuY2UvZW50cmllcy9lbnRyaWVzLWNvbGxlY3Rpb25cbiAgICovXG4gIGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxDb250ZW50ZnVsQ29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoZXJlIHRoZSByaWNoIHRleHQgZmllbGQgaXMgaW5zaWRlIHRoZSBjb250ZW50ZnVsIHJlc3BvbnNlLiBEb3QgYW5kIGFycmF5IG5vdGF0aW9uIGlzIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFwiaXRlbXNbMF0uZmllbGRzLmh0bWxcIlxuICAgKi9cbiAgcmljaFRleHRQYXRoID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBhbGwgaW5jbHVkZXMgaW4gdGhlIGNvbnRlbnRmdWwgcmVzcG9uc2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb29raW5nIHVwIGFzc2V0cyBhbmQgZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSByaWNoIHRleHQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGxvb3BzLlxuICAgKi9cbiAgY29udGVudEluY2x1ZGVzTWFwID0gY29tcHV0ZWQ8Q29udGVudGZ1bEluY2x1ZGVNYXA+KCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgY29uc3QgYXNzZXRzID0gY29udGVudD8uaW5jbHVkZXMuQXNzZXQ7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQ/LmluY2x1ZGVzLkVudHJ5O1xuXG4gICAgcmV0dXJuIGNyZWF0ZUNvbnRlbnRmdWxJbmNsdWRlTWFwKHsgYXNzZXRzOiBhc3NldHMgPz8gW10sIGVudHJpZXM6IGVudHJpZXMgPz8gW10gfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGUgcmljaCB0ZXh0IGRhdGEgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAqL1xuICByaWNoVGV4dERhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudCgpO1xuICAgIGNvbnN0IHJpY2hUZXh0UGF0aCA9IHRoaXMucmljaFRleHRQYXRoKCk7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJpY2hUZXh0ID0gZ2V0T2JqZWN0UHJvcGVydHkoY29udGVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaWNoVGV4dFBhdGgpO1xuXG4gICAgaWYgKCFpc09iamVjdChyaWNoVGV4dCkpIHtcbiAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigncmljaF90ZXh0X3VuZGVmaW5lZCcsIGZhbHNlLCB7IGNvbnRlbnQsIHJpY2hUZXh0UGF0aCB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUmljaFRleHRSb290Tm9kZShyaWNoVGV4dCkpIHtcbiAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigncmljaF90ZXh0X3dyb25nX3R5cGUnLCBmYWxzZSwgeyBjb250ZW50LCByaWNoVGV4dFBhdGggfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJpY2hUZXh0IGFzIFJpY2hUZXh0UmVzcG9uc2U7XG4gIH0pO1xuXG4gIHJlbmRlckNvbW1hbmRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJpY2hUZXh0RGF0YSA9IHRoaXMucmljaFRleHREYXRhKCk7XG5cbiAgICBpZiAoIXJpY2hUZXh0RGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVSZW5kZXJDb21tYW5kcyhyaWNoVGV4dERhdGEpO1xuICB9KTtcblxuICByZW5kZXJDb21tYW5kSGlzdG9yeSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnJlbmRlckNvbW1hbmRzKS5waXBlKHN0YXJ0V2l0aChbXSBhcyBSZW5kZXJDb21tYW5kW10pLCBwYWlyd2lzZSgpKSxcbiAgICB7IGluaXRpYWxWYWx1ZTogW1tdLCBbXV0gfSxcbiAgKTtcblxuICBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgW3ByZXZDb21tYW5kc10gPSB0aGlzLnJlbmRlckNvbW1hbmRIaXN0b3J5KCk7XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgUmVuZGVyQ29tbWFuZD4oKTtcblxuICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBwcmV2Q29tbWFuZHMpIHtcbiAgICAgIG1hcC5zZXQoZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpLCBjb21tYW5kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9KTtcblxuICByZW5kZXJJbnN0cnVjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLnJlbmRlckNvbW1hbmRzKCk7XG4gICAgY29uc3QgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwID0gbmV3IE1hcCh0aGlzLnByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCgpKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uczogUmVuZGVySW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gcmVtb3ZlIGRlbGV0ZWQgY29tcG9uZW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBlbGVtZW50c1xuICAgIGZvciAoY29uc3QgWywgY29tbWFuZF0gb2YgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwKSB7XG4gICAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgIC8vIGtlZXAgdGhlIGNvbXBvbmVudCBhcm91bmQgaWYgaXQncyBzdGlsbCBpbiB0aGUgbmV3IGNvbW1hbmRzXG4gICAgICAgIGlmIChjb21tYW5kcy5zb21lKChjKSA9PiBnZXRSZW5kZXJDb21tYW5kSWQoYykgPT09IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuREVMRVRFLCBjb21tYW5kXSk7XG5cbiAgICAgIC8vIHJlbW92ZSBmcm9tIG1hcCB0byBtYXJrIGFzIHVzZWRcbiAgICAgIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcC5kZWxldGUoZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBpbmRleGVzIG9mIHRoZSBjb21tYW5kcyByZW1haW5pbmcgaW4gdGhlIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCBpbiB0aGUgbmV3IGNvbW1hbmRzIGFycmF5LlxuICAgIGNvbnN0IGxhc3RDb21wb25lbnRJbmRleGVzOiB7IG5ld0luZGV4OiBudW1iZXI7IHByZXZJbmRleDogbnVtYmVyOyBjb21tYW5kOiBSZW5kZXJDb21tYW5kIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2lkLCBjb21tYW5kXSBvZiBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gY29tbWFuZHMuZmluZEluZGV4KChjKSA9PiBnZXRSZW5kZXJDb21tYW5kSWQoYykgPT09IGlkKTtcbiAgICAgIGNvbnN0IG5ld0NvbW1hbmQgPSBjb21tYW5kc1tpbmRleF0hO1xuXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGxhc3RDb21wb25lbnRJbmRleGVzLnB1c2goe1xuICAgICAgICBuZXdJbmRleDogaW5kZXgsXG4gICAgICAgIHByZXZJbmRleDogY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5JTkRFWF0sXG4gICAgICAgIGNvbW1hbmQ6IG5ld0NvbW1hbmQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsYXN0Q29tcG9uZW50SW5kZXhlcy5zb3J0KChhLCBiKSA9PiBhLm5ld0luZGV4IC0gYi5uZXdJbmRleCk7XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgcHJldkluZGV4IGFyZSBpbiBvcmRlciBhc2NlbmRpbmdcbiAgICAvLyBmb3IgaW5kZXhlcyB0aGF0IGFyZSBub3QgaW4gb3JkZXIsIGNyZWF0ZSBhIG1vdmUgaW5zdHJ1Y3Rpb25cbiAgICAvLyBmb3IgaW5kZXhlcyB0aGF0IGFyZSBpbiBvcmRlciwgY3JlYXRlIGFuIHVwZGF0ZSBpbnN0cnVjdGlvblxuICAgIGxldCBtb3ZlQ2hlY2tJbmRleCA9IDA7XG4gICAgd2hpbGUgKG1vdmVDaGVja0luZGV4IDwgbGFzdENvbXBvbmVudEluZGV4ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbW92ZUN1cnIgPSBsYXN0Q29tcG9uZW50SW5kZXhlc1ttb3ZlQ2hlY2tJbmRleF07XG4gICAgICBjb25zdCBtb3ZlTmV4dCA9IGxhc3RDb21wb25lbnRJbmRleGVzW21vdmVDaGVja0luZGV4ICsgMV07XG5cbiAgICAgIGlmICghbW92ZUN1cnIgfHwgIW1vdmVOZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAobW92ZUN1cnIucHJldkluZGV4ID4gbW92ZU5leHQucHJldkluZGV4KSB7XG4gICAgICAgIGxhc3RDb21wb25lbnRJbmRleGVzLnNwbGljZShtb3ZlQ2hlY2tJbmRleCArIDEsIDEpO1xuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuTU9WRSwgbW92ZU5leHQuY29tbWFuZF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLlVQREFURSwgbW92ZU5leHQuY29tbWFuZF0pO1xuICAgICAgICBtb3ZlQ2hlY2tJbmRleCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBjb21tYW5kcykge1xuICAgICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG5cbiAgICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDb21tYW5kID0gcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbW1hbmQpIHtcbiAgICAgICAgICAvLyBjcmVhdGVcbiAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuQ1JFQVRFLCBjb21tYW5kXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNyZWF0ZVxuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuQ1JFQVRFLCBjb21tYW5kXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdG9PYnNlcnZhYmxlKHRoaXMucmVuZGVySW5zdHJ1Y3Rpb25zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGluc3RydWN0aW9ucykgPT4ge1xuICAgICAgICAgIHRoaXMuX2V4ZWNJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSZW5kZXJDb21tYW5kcyhyaWNoVGV4dERhdGE6IFJpY2hUZXh0UmVzcG9uc2UpIHtcbiAgICAvKiogTGlzdCBvZiBhbGwgcmVuZGVyIGNvbW1hbmRzICovXG4gICAgY29uc3Qgcm9vdENvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10gPSBbXTtcblxuICAgIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBodG1sIGVsZW1lbnQgSURzLiAqL1xuICAgIGxldCBlbGVtZW50SWQgPSAwO1xuXG4gICAgLyoqIENvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGNvbXBvbmVudCBJRHMuICovXG4gICAgY29uc3QgY29tcG9uZW50SWRNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgLyoqIFRoZSBuZXN0aW5nIGxldmVsIG9mIHRoZSBjdXJyZW50IG5vZGUuICovXG4gICAgbGV0IG5lc3RpbmdMZXZlbCA9IDA7XG5cbiAgICAvKiogVGhlIHBvc2l0aW9uIChpbmRleCkgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbnNpZGUgdGhlIHBhcmVudCBub2RlLiAqL1xuICAgIGxldCBkb21Qb3NpdGlvbiA9IDA7XG5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcblxuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGU6IEJsb2NrIHwgSW5saW5lIHwgVGV4dCwgcGFyZW50OiBSZW5kZXJDb21tYW5kIHwgbnVsbCA9IG51bGwpID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIC8vIFJlbmRlciBtZWRpYVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLlRFWFQ7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IG5vZGUudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIXRleHQpIGJyZWFrO1xuXG4gICAgICAgICAgY29uc3QgY29tbWFuZDogVGV4dFJlbmRlckNvbW1hbmQgPSBbdHlwZSwgbmVzdGluZ0xldmVsLCBkb21Qb3NpdGlvbiwgY29tbWFuZEluZGV4KyssIHRleHRdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG4gICAgICAgICAgZG9tUG9zaXRpb24rKztcblxuICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ3RleHRfcGFyZW50X25vdF9mb3VuZCcsIGZhbHNlLCB7IG5vZGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNIdG1sT3BlblJlbmRlckNvbW1hbmQocGFyZW50KSAmJiAhaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigndGV4dF9wYXJlbnRfd3JvbmdfdHlwZScsIGZhbHNlLCB7IG5vZGUsIHBhcmVudCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzUG9zaXRpb24gPVxuICAgICAgICAgICAgcGFyZW50W1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTlxuICAgICAgICAgICAgICA/IEhUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5BVFRSSUJVVEVTXG4gICAgICAgICAgICAgIDogQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkFUVFJJQlVURVM7XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyZW50W2F0dHJpYnV0ZXNQb3NpdGlvbl07XG5cbiAgICAgICAgICBpZiAobm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtDbGFzc2VzID0gbWFya3NUb0NsYXNzKG5vZGUubWFya3MpO1xuXG4gICAgICAgICAgICBpZiAoQ0xBU1NfQVRUUiBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXNbQ0xBU1NfQVRUUl0gKz0gYCAke21hcmtDbGFzc2VzfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzW0NMQVNTX0FUVFJdID0gbWFya0NsYXNzZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEJMT0NLUy5FTUJFRERFRF9BU1NFVDoge1xuICAgICAgICAgIC8vIFJlbmRlciBtZWRpYVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLkNPTVBPTkVOVDtcbiAgICAgICAgICBjb25zdCBhc3NldElkID0gbm9kZS5kYXRhWyd0YXJnZXQnXT8uc3lzPy5pZDtcblxuICAgICAgICAgIGlmICghYXNzZXRJZCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdhc3NldF9pZF9ub3RfZm91bmQnLCBmYWxzZSwgeyBub2RlIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gdGhpcy5jb250ZW50SW5jbHVkZXNNYXAoKS5nZXRBc3NldChhc3NldElkKTtcblxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignYXNzZXRfbm90X2ZvdW5kJywgZmFsc2UsIHsgYXNzZXRJZCwgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGFzc2V0LmZpZWxkcy5maWxlLmNvbnRlbnRUeXBlO1xuICAgICAgICAgIGNvbnN0IGFzc2V0Q29tcG9uZW50cyA9IHRoaXMuX2NvbmZpZy5jb21wb25lbnRzO1xuXG4gICAgICAgICAgY29uc3QgaXNJbWFnZSA9IGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpO1xuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSBjb250ZW50VHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKTtcbiAgICAgICAgICBjb25zdCBpc0F1ZGlvID0gY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJyk7XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBpc0ltYWdlXG4gICAgICAgICAgICA/IGFzc2V0Q29tcG9uZW50cy5pbWFnZVxuICAgICAgICAgICAgOiBpc1ZpZGVvXG4gICAgICAgICAgICAgID8gYXNzZXRDb21wb25lbnRzLnZpZGVvXG4gICAgICAgICAgICAgIDogaXNBdWRpb1xuICAgICAgICAgICAgICAgID8gYXNzZXRDb21wb25lbnRzLmF1ZGlvXG4gICAgICAgICAgICAgICAgOiBhc3NldENvbXBvbmVudHMuZmlsZTtcblxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBpc0ltYWdlXG4gICAgICAgICAgICA/IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLklNQUdFXG4gICAgICAgICAgICA6IGlzVmlkZW9cbiAgICAgICAgICAgICAgPyBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5WSURFT1xuICAgICAgICAgICAgICA6IGlzQXVkaW9cbiAgICAgICAgICAgICAgICA/IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLkFVRElPXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5GSUxFO1xuXG4gICAgICAgICAgbGV0IGNvbXBvbmVudElkID0gY29tcG9uZW50SWRNYXAuZ2V0KGNvbXBvbmVudFR5cGUpID8/IC0xO1xuICAgICAgICAgIGNvbnN0IGlkID0gY29tcG9uZW50VHlwZSArICsrY29tcG9uZW50SWQ7XG4gICAgICAgICAgY29tcG9uZW50SWRNYXAuc2V0KGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkKTtcblxuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcblxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgICAgIGFzc2V0LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kOiBDb21wb25lbnRSZW5kZXJDb21tYW5kID0gW1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbCxcbiAgICAgICAgICAgIGRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgY29tbWFuZEluZGV4KyssXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgICAgICAgZG9tUG9zaXRpb24rKztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBCTE9DS1MuRU1CRURERURfRU5UUlk6XG4gICAgICAgIGNhc2UgSU5MSU5FUy5FTUJFRERFRF9FTlRSWToge1xuICAgICAgICAgIC8vIFJlbmRlciBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCB0eXBlID0gUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQ7XG4gICAgICAgICAgY29uc3QgZW50cnlJZCA9IG5vZGUuZGF0YVsndGFyZ2V0J10/LnN5cz8uaWQ7XG5cbiAgICAgICAgICBpZiAoIWVudHJ5SWQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignZW50cnlfaWRfbm90X2ZvdW5kJywgZmFsc2UsIHsgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29udGVudEluY2x1ZGVzTWFwKCkuZ2V0RW50cnkoZW50cnlJZCwgRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRCk7XG5cbiAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2VudHJ5X25vdF9mb3VuZCcsIGZhbHNlLCB7IGVudHJ5SWQsIG5vZGUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGVudHJ5LnN5cy5jb250ZW50VHlwZS5zeXMuaWQ7XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9jb25maWcuY3VzdG9tQ29tcG9uZW50c1tjb21wb25lbnRUeXBlXTtcblxuICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2N1c3RvbV9jb21wb25lbnRfbm90X2ZvdW5kJywgZmFsc2UsIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50czogdGhpcy5fY29uZmlnLmN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICAgIGxldCBjb21wb25lbnRJZCA9IGNvbXBvbmVudElkTWFwLmdldChjb21wb25lbnRUeXBlKSA/PyAtMTtcbiAgICAgICAgICBjb25zdCBpZCA9IGNvbXBvbmVudFR5cGUgKyArK2NvbXBvbmVudElkO1xuICAgICAgICAgIGNvbXBvbmVudElkTWFwLnNldChjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7XG5cbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgICAgICBmaWVsZHM6IGVudHJ5LmZpZWxkcyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbnRyeS5tZXRhZGF0YSxcbiAgICAgICAgICAgIHN5czogZW50cnkuc3lzLFxuICAgICAgICAgICAgaW5jbHVkZXM6IHRoaXMuY29udGVudEluY2x1ZGVzTWFwKCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQgPSBbXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmVzdGluZ0xldmVsLFxuICAgICAgICAgICAgZG9tUG9zaXRpb24sXG4gICAgICAgICAgICBjb21tYW5kSW5kZXgrKyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICBkb21Qb3NpdGlvbisrO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOO1xuICAgICAgICAgIGNvbnN0IHRhZyA9IHRyYW5zbGF0ZUNvbnRlbnRmdWxOb2RlVHlwZVRvSHRtbFRhZyhub2RlLm5vZGVUeXBlKTtcbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgY29uc3QgaWQgPSAnZScgKyBlbGVtZW50SWQrKztcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IEh0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IFt0eXBlLCBuZXN0aW5nTGV2ZWwsIGRvbVBvc2l0aW9uLCBjb21tYW5kSW5kZXgrKywgYXR0cmlidXRlcywgdGFnLCBpZF07XG5cbiAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgIGNvbnN0IGRvbVBvc2l0aW9uQXRUaGlzTGV2ZWwgPSBkb21Qb3NpdGlvbjtcbiAgICAgICAgICAvLyBOb3JtYWwgaHRtbCBlbGVtZW50cyBjYW4gaGF2ZSBjaGlsZHJlblxuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jb250ZW50KSB7XG4gICAgICAgICAgICBkb21Qb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWwrKztcbiAgICAgICAgICAgIHRyYXZlcnNlKGNoaWxkLCBjb21tYW5kKTtcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbC0tO1xuICAgICAgICAgICAgZG9tUG9zaXRpb24gPSBkb21Qb3NpdGlvbkF0VGhpc0xldmVsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxhc3RDb21tYW5kID0gcm9vdENvbW1hbmRzW3Jvb3RDb21tYW5kcy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgIGlmIChsYXN0Q29tbWFuZD8uW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTikge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgY29tbWFuZCBpcyBhbiBvcGVuIGNvbW1hbmQsIHdlIGNhbiByZW1vdmUgaXQgc2luY2UgaXQncyBlbXB0eVxuICAgICAgICAgICAgcm9vdENvbW1hbmRzLnBvcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjbG9zZUlkID0gJ2UnICsgZWxlbWVudElkKys7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NlQ29tbWFuZDogSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9IFtcbiAgICAgICAgICAgICAgUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX0NMT1NFLFxuICAgICAgICAgICAgICBuZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICAgIGRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgICBjb21tYW5kSW5kZXgrKyxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICBjbG9zZUlkLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNsb3NlQ29tbWFuZCk7XG5cbiAgICAgICAgICAgIGRvbVBvc2l0aW9uKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IElOTElORVMuSFlQRVJMSU5LKSB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSBub2RlLmRhdGFbJ3VyaSddO1xuICAgICAgICAgICAgYXR0cmlidXRlc1snaHJlZiddID0gdXJpO1xuXG4gICAgICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5fZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbiAgICAgICAgICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSAhdXJpLmluY2x1ZGVzKGhvc3QpO1xuXG4gICAgICAgICAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzWyd0YXJnZXQnXSA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiByaWNoVGV4dERhdGEuY29udGVudCkge1xuICAgICAgdHJhdmVyc2Uobm9kZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3RDb21tYW5kcztcbiAgfVxuXG4gIHByaXZhdGUgX2V4ZWNJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBSZW5kZXJJbnN0cnVjdGlvbltdKSB7XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBpbnN0cnVjdGlvbltSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04uVFlQRV07XG4gICAgICBjb25zdCBjb21tYW5kID0gaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLkNPTU1BTkRdO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5DUkVBVEU6XG4gICAgICAgICAgdGhpcy5fcnVuQ3JlYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuVVBEQVRFOlxuICAgICAgICAgIHRoaXMuX3J1blVwZGF0ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLk1PVkU6XG4gICAgICAgICAgdGhpcy5fcnVuTW92ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkRFTEVURTpcbiAgICAgICAgICB0aGlzLl9ydW5EZWxldGVJbnN0cnVjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5DcmVhdGVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuX2ZpbmRQYXJlbnQoY29tbWFuZCk7XG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSB0aGlzLl9maW5kRm9sbG93aW5nRWxlbWVudChjb21tYW5kKTtcblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkNPTVBPTkVOVF0pO1xuXG4gICAgICB0aGlzLl91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZCwgY29tcG9uZW50UmVmKTtcblxuICAgICAgY29uc3Qgcm9vdE5vZGUgPSB0aGlzLl9nZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWYpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChyb290Tm9kZSwgcGFyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGNvbXBvbmVudFJlZixcbiAgICAgICAgZWxlbWVudDogcm9vdE5vZGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjb21tYW5kW1RFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEVYVF07XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZVRleHQodGV4dCk7XG4gICAgICBjb25zdCBzcGFuID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3BhbiwgdGV4dE5vZGUpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChzcGFuLCBwYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgZWxlbWVudDogc3BhbixcbiAgICAgICAgdGV4dE5vZGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBjb25zdCB0YWcgPSBjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UQUdfTkFNRV07XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY29tbWFuZFtIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQVRUUklCVVRFU107XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKGVsZW1lbnQsIHBhcmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuVXBkYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5nZXQoaWQpO1xuXG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGlmICghaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0oY2FjaGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIGlzIG5vdCBhIGNvbXBvbmVudCBjb21tYW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjYWNoZWQuY29tcG9uZW50UmVmO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudFJlZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCByZWYgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZCwgY29tcG9uZW50UmVmKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAuLi5jYWNoZWQsXG4gICAgICBjb21tYW5kOiBjb21tYW5kIGFzIGFueSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3J1bk1vdmVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChpZCk7XG5cbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgaWYgKCFpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbShjYWNoZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgaXMgbm90IGEgY29tcG9uZW50IGNvbW1hbmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNhY2hlZC5jb21wb25lbnRSZWY7XG5cbiAgICAgIGlmICghY29tcG9uZW50UmVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IHJlZiBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkLmVsZW1lbnQ7XG4gICAgICBjb25zdCBvbGRQYXJlbnRFbGVtZW50ID0gY2FjaGVkLmVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2hpbGQob2xkUGFyZW50RWxlbWVudCwgcm9vdE5vZGUpO1xuXG4gICAgICBjb25zdCBuZXdQYXJlbnRFbGVtZW50ID0gdGhpcy5fZmluZFBhcmVudChjb21tYW5kKTtcbiAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gdGhpcy5fZmluZEZvbGxvd2luZ0VsZW1lbnQoY29tbWFuZCk7XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKHJvb3ROb2RlLCBuZXdQYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUNvbXBvbmVudElucHV0cyhjb21tYW5kLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIC4uLmNhY2hlZCxcbiAgICAgICAgY29tbWFuZDogY29tbWFuZCBhcyBhbnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5EZWxldGVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChpZCk7XG5cbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgaWYgKGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGlmICghaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0oY2FjaGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIGlzIG5vdCBhIGNvbXBvbmVudCBjb21tYW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjYWNoZWQuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgfSBlbHNlIGlmIChpc1RleHRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDaGlsZChjYWNoZWQuZWxlbWVudD8ucGFyZW50RWxlbWVudCwgY2FjaGVkLmVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKGNhY2hlZC5lbGVtZW50Py5wYXJlbnRFbGVtZW50LCBjYWNoZWQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmRlbGV0ZShpZCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZDogQ29tcG9uZW50UmVuZGVyQ29tbWFuZCwgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pikge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLklOUFVUU10pKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldKSBjb250aW51ZTtcblxuICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnQoY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IG5lc3RpbmdMZXZlbCA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF07XG4gICAgbGV0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lc3RpbmdMZXZlbCA9PT0gMCkge1xuICAgICAgcGFyZW50RWxlbWVudCA9IGhvc3RFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnNlIHNlYXJjaCBhbGwgcmVuZGVyIGNvbW1hbmRzIGJlZ2lubmluZyBmcm9tIHRoZSBjdXJyZW50IG9uZSB1c2luZyBhIGZvciBsb29wLlxuICAgICAgLy8gVGhlIHBhcmVudCBpcyBmb3VuZCB3aGVuIHRoZSBjb21tYW5kJ3MgbmVzdGluZyBsZXZlbCBpc3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgbmVzdGluZyBsZXZlbCBtaW51cyAxLlxuICAgICAgLy8gSWYgdGhlIHBhcmVudCBpcyBub3QgZm91bmQsIHRocm93IGFuIGVycm9yLlxuICAgICAgY29uc3QgYWxsQ29tbWFuZHMgPSB0aGlzLnJlbmRlckNvbW1hbmRzKCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29tbWFuZEluZGV4ID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5JTkRFWF07XG5cbiAgICAgIGxldCBwYXJlbnRDb21tYW5kOiBSZW5kZXJDb21tYW5kIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIGZvciAobGV0IGkgPSBjdXJyZW50Q29tbWFuZEluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY21kID0gYWxsQ29tbWFuZHNbaV07XG5cbiAgICAgICAgaWYgKCFjbWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNtZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXSA9PT0gbmVzdGluZ0xldmVsIC0gMSkge1xuICAgICAgICAgIHBhcmVudENvbW1hbmQgPSBjbWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJlbnRDb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRFbGVtZW50ID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChnZXRSZW5kZXJDb21tYW5kSWQocGFyZW50Q29tbWFuZCkpPy5lbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghcGFyZW50RWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgZWxlbWVudCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRm9sbG93aW5nRWxlbWVudChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgY2FjaGVBcnJheSA9IEFycmF5LmZyb20odGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnZhbHVlcygpKTtcbiAgICBsZXQgbmV4dEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZG9tUG9zaXRpb24gPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkRPTV9QT1NJVElPTl07XG4gICAgY29uc3QgbmVzdGluZ0xldmVsID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXTtcbiAgICBjb25zdCB0eXBlID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXTtcblxuICAgIC8vICBUcnkgdG8gZmluZCBhbiBhbHJlYWR5IHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhIGRvbVBvc2l0aW9uIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGRvbVBvc2l0aW9uLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUsIHVzZSB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGRvbVBvc2l0aW9uLlxuICAgIC8vIElmIGl0IGRvZXMgbm90IGV4aXN0LCB1c2UgLmFwcGVuZENoaWxkIHRvIHNpbXBseSBhcHBlbmQgdGhlIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgLy8gSWYgaXQgZG9lcyBleGlzdCwgdXNlIC5pbnNlcnRCZWZvcmUgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgZm91bmQgZWxlbWVudC5cbiAgICBmb3IgKGNvbnN0IGNhY2hlZCBvZiBjYWNoZUFycmF5KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlZC5jb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkRPTV9QT1NJVElPTl0gPiBkb21Qb3NpdGlvbiAmJlxuICAgICAgICBjYWNoZWQuY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXSA9PT0gbmVzdGluZ0xldmVsICYmXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBkb2VzIG5vdCBmaW5kIGl0c2VsZlxuICAgICAgICBjYWNoZWQuY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSAhPT0gdHlwZVxuICAgICAgKSB7XG4gICAgICAgIG5leHRFbGVtZW50ID0gY2FjaGVkLmVsZW1lbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckluc2VydE9yQXBwZW5kKFxuICAgIG5vZGVUb1JlbmRlcjogSFRNTEVsZW1lbnQsXG4gICAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmV4dEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAobmV4dEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnRFbGVtZW50LCBub2RlVG9SZW5kZXIsIG5leHRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50RWxlbWVudCwgbm9kZVRvUmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWJ1Z1Zpc3VhbGl6ZVJlbmRlckNvbW1hbmRzKGNvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10pIHtcbiAgICBjb25zdCBkZWJ1ZyA9IGNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT4gdGhpcy5fc3RyaW5naWZ5UmVuZGVyQ29tbWFuZChjb21tYW5kKSkuZmxhdCgpO1xuXG4gICAgY29uc3QgcHJldHRpZmllZCA9IGZvcm1hdEhUTUwoZGVidWcpO1xuXG4gICAgcmV0dXJuIHByZXR0aWZpZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zdHJpbmdpZnlSZW5kZXJDb21tYW5kKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXN0QXR0ciA9IGBuZXN0PVwiJHtjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdfVwiYDtcbiAgICBjb25zdCBkb21BdHRyID0gYGRvbT1cIiR7Y29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ET01fUE9TSVRJT05dfVwiYDtcblxuICAgIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIGA8JHtjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UQUdfTkFNRV19ICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YDtcbiAgICB9IGVsc2UgaWYgKGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIGA8LyR7Y29tbWFuZFtIVE1MX0NMT1NFX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRBR19OQU1FXX0gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gO1xuICAgIH0gZWxzZSBpZiAoaXNUZXh0UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIFtgPHNwYW4gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gLCBjb21tYW5kW1RFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEVYVF0sICc8L3NwYW4+J107XG4gICAgfSBlbHNlIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29tbWFuZFtDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQ09NUE9ORU5UX1RZUEVdO1xuICAgICAgcmV0dXJuIFtgPCR7c2VsZWN0b3J9ICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YCwgYDwvJHtzZWxlY3Rvcn0+YF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RyaW5naWZ5UmVuZGVySW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFJlbmRlckluc3RydWN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uW1JFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTi5UWVBFXTtcbiAgICBjb25zdCB0cmFuc2xhdGVkVHlwZSA9IE9iamVjdC5lbnRyaWVzKFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFKS5maW5kKChbLCB2YWx1ZV0pID0+IHZhbHVlID09PSB0eXBlKT8uWzBdO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IHRoaXMuX3N0cmluZ2lmeVJlbmRlckNvbW1hbmQoaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLkNPTU1BTkRdKTtcblxuICAgIHJldHVybiBgJHt0cmFuc2xhdGVkVHlwZX06ICR7Y29tbWFuZH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhUTUwoaHRtbDogc3RyaW5nW10pIHtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5kZW50ID0gMDtcblxuICBmb3IgKGNvbnN0IHRhZyBvZiBodG1sKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKCc8LycpKSB7XG4gICAgICBpbmRlbnQtLTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaCgnICcucmVwZWF0KGluZGVudCAqIDIpICsgdGFnKTtcblxuICAgIGlmICh0YWcuc3RhcnRzV2l0aCgnPCcpICYmICF0YWcuc3RhcnRzV2l0aCgnPC8nKSkge1xuICAgICAgaW5kZW50Kys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbn1cbiJdfQ==
|
|
@@ -23,8 +23,8 @@ export class ContentfulVideoComponent {
|
|
|
23
23
|
};
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
27
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.
|
|
26
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: ContentfulVideoComponent, isStandalone: true, selector: "et-contentful-video", inputs: { asset: { classPropertyName: "asset", publicName: "asset", isSignal: true, isRequired: true, transformFunction: null }, videoClass: { classPropertyName: "videoClass", publicName: "videoClass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
28
28
|
@if (data(); as data) {
|
|
29
29
|
<video [ngClass]="videoClass()" controls>
|
|
30
30
|
<source src="{{ data.url }}" type="{{ data.contentType }}" />
|
|
@@ -32,7 +32,7 @@ export class ContentfulVideoComponent {
|
|
|
32
32
|
}
|
|
33
33
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
34
34
|
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ContentfulVideoComponent, decorators: [{
|
|
36
36
|
type: Component,
|
|
37
37
|
args: [{
|
|
38
38
|
selector: 'et-contentful-video',
|