@eui/showcase 15.4.0 → 15.4.1
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/LICENSE +296 -296
- package/README.md +26 -26
- package/esm2020/eui-showcase.mjs +4 -4
- package/esm2020/index.mjs +3 -3
- package/esm2020/lib/components/doc-page/doc-page.component.mjs +357 -357
- package/esm2020/lib/components/doc-page-code/doc-page-code.component.mjs +27 -27
- package/esm2020/lib/components/doc-page-code-fab/doc-page-code-fab.component.mjs +39 -39
- package/esm2020/lib/components/doc-page-pattern/doc-page-pattern.component.mjs +114 -114
- package/esm2020/lib/components/doc-sample/doc-sample.component.mjs +158 -158
- package/esm2020/lib/components/doc-sample-api/doc-sample-api.component.mjs +11 -11
- package/esm2020/lib/components/doc-section/doc-section.component.mjs +27 -27
- package/esm2020/lib/components/doc-section-code/doc-section-code.component.mjs +106 -106
- package/esm2020/lib/components/eui-code-highlighter/eui-code-highlighter.component.mjs +21 -21
- package/esm2020/lib/components/index.mjs +13 -13
- package/esm2020/lib/components/lorem-ipsum/lorem-ipsum-sample.component.mjs +17 -17
- package/esm2020/lib/components/playground/playground.component.mjs +198 -198
- package/esm2020/lib/components/playground/stackblitz.files.mjs +210 -210
- package/esm2020/lib/eui-showcase.module.mjs +150 -150
- package/fesm2015/eui-showcase.mjs +1307 -1307
- package/fesm2015/eui-showcase.mjs.map +1 -1
- package/fesm2020/eui-showcase.mjs +1309 -1309
- package/fesm2020/eui-showcase.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/lib/components/doc-page/doc-page.component.d.ts +90 -90
- package/lib/components/doc-page-code/doc-page-code.component.d.ts +8 -8
- package/lib/components/doc-page-code-fab/doc-page-code-fab.component.d.ts +15 -15
- package/lib/components/doc-page-pattern/doc-page-pattern.component.d.ts +43 -43
- package/lib/components/doc-sample/doc-sample.component.d.ts +45 -45
- package/lib/components/doc-sample-api/doc-sample-api.component.d.ts +5 -5
- package/lib/components/doc-section/doc-section.component.d.ts +10 -10
- package/lib/components/doc-section-code/doc-section-code.component.d.ts +44 -44
- package/lib/components/eui-code-highlighter/eui-code-highlighter.component.d.ts +9 -9
- package/lib/components/index.d.ts +12 -12
- package/lib/components/lorem-ipsum/lorem-ipsum-sample.component.d.ts +6 -6
- package/lib/components/playground/playground.component.d.ts +61 -61
- package/lib/components/playground/stackblitz.files.d.ts +15 -15
- package/lib/eui-showcase.module.d.ts +29 -29
- package/package.json +2 -2
|
@@ -1,198 +1,198 @@
|
|
|
1
|
-
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import sdk from '@stackblitz/sdk';
|
|
3
|
-
import { lastValueFrom } from 'rxjs';
|
|
4
|
-
import { angularJsonFile, indexHtmlFile, mainFile, PACKAGE_JSON, polyfillsFile, tsConfig } from './stackblitz.files';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@eui/core";
|
|
7
|
-
import * as i2 from "@angular/common/http";
|
|
8
|
-
import * as i3 from "@eui/components/eui-block-content";
|
|
9
|
-
export class PlaygroundComponent {
|
|
10
|
-
constructor(renderer, elementRef, appShell, http) {
|
|
11
|
-
this.renderer = renderer;
|
|
12
|
-
this.elementRef = elementRef;
|
|
13
|
-
this.appShell = appShell;
|
|
14
|
-
this.http = http;
|
|
15
|
-
this.title = 'eUI Playground';
|
|
16
|
-
this.activated = false;
|
|
17
|
-
this.isLoaded = false;
|
|
18
|
-
}
|
|
19
|
-
ngOnChanges(changes) {
|
|
20
|
-
if (changes.activated) {
|
|
21
|
-
if (changes.activated.currentValue) {
|
|
22
|
-
this.initStackblitz();
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
this.isLoaded = false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
initStackblitz() {
|
|
30
|
-
this.getStackblitzDependencies()
|
|
31
|
-
.then((deps) => {
|
|
32
|
-
const { dependencies, devDependencies } = deps;
|
|
33
|
-
const { selector } = this.extractComponentMetadata(this.typescriptContent);
|
|
34
|
-
const moduleName = this.extractModuleName(this.typescriptContent);
|
|
35
|
-
return sdk.embedProject('stackblitz', {
|
|
36
|
-
title: this.title,
|
|
37
|
-
description: `An eUI example for the ${this.title}.`,
|
|
38
|
-
template: 'angular-cli',
|
|
39
|
-
files: {
|
|
40
|
-
'src/component.html': this.htmlContent,
|
|
41
|
-
'src/component.ts': this.appendVitalNgModules(this.typescriptContent),
|
|
42
|
-
// 'src/app.module.ts': moduleFile(className, this.modules),
|
|
43
|
-
'src/main.ts': mainFile(moduleName),
|
|
44
|
-
'src/polyfills.ts': polyfillsFile,
|
|
45
|
-
'src/index.html': indexHtmlFile(selector),
|
|
46
|
-
'angular.json': angularJsonFile,
|
|
47
|
-
'package.json': JSON.stringify({
|
|
48
|
-
...PACKAGE_JSON,
|
|
49
|
-
dependencies,
|
|
50
|
-
devDependencies,
|
|
51
|
-
}, null, 2),
|
|
52
|
-
'tsconfig.json': tsConfig,
|
|
53
|
-
},
|
|
54
|
-
settings: {
|
|
55
|
-
compile: {
|
|
56
|
-
trigger: 'auto',
|
|
57
|
-
clearConsole: false,
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
dependencies,
|
|
61
|
-
}, {
|
|
62
|
-
openFile: ['component.ts'],
|
|
63
|
-
height: 500,
|
|
64
|
-
});
|
|
65
|
-
})
|
|
66
|
-
.then((instance) => {
|
|
67
|
-
this.stackblitzInstance = instance;
|
|
68
|
-
this.isLoaded = true;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Retrieve only the dependencies that stackblitz will need filtered from @eui/deps-base
|
|
73
|
-
*
|
|
74
|
-
* @private
|
|
75
|
-
*/
|
|
76
|
-
getStackblitzDependencies() {
|
|
77
|
-
// a list of dependencies only stackblitz needs
|
|
78
|
-
const stackblitzDependencies = [
|
|
79
|
-
'@angular/animations',
|
|
80
|
-
'@angular/cdk',
|
|
81
|
-
'@angular/common',
|
|
82
|
-
'@angular/compiler',
|
|
83
|
-
'@angular/core',
|
|
84
|
-
'@angular/forms',
|
|
85
|
-
'@angular/material',
|
|
86
|
-
'@angular/material-moment-adapter',
|
|
87
|
-
'@angular/platform-browser',
|
|
88
|
-
'@angular/platform-browser-dynamic',
|
|
89
|
-
'@angular/router',
|
|
90
|
-
'@eui/base',
|
|
91
|
-
'@eui/components',
|
|
92
|
-
'@eui/core',
|
|
93
|
-
'@eui/styles',
|
|
94
|
-
'@eui/styles-base',
|
|
95
|
-
'@ngrx/effects',
|
|
96
|
-
'@ngrx/store',
|
|
97
|
-
'@ngx-translate/core',
|
|
98
|
-
'localforage',
|
|
99
|
-
'lodash-es',
|
|
100
|
-
'reselect',
|
|
101
|
-
'rxjs',
|
|
102
|
-
'tslib',
|
|
103
|
-
'zone.js',
|
|
104
|
-
];
|
|
105
|
-
const stackblitzDevDependencies = ['@angular-devkit/build-angular', '@angular/cli', '@angular/compiler-cli', 'typescript'];
|
|
106
|
-
return this.getCurrentShowcaseEuiVersion()
|
|
107
|
-
.then((version) => this.retrievePackageDependencies(version))
|
|
108
|
-
.then((dependencies) => {
|
|
109
|
-
// filter dependencies to only what stackblitz needs
|
|
110
|
-
let filteredArr = Object.entries(dependencies).filter((v) => stackblitzDependencies.find((s) => s === v[0]));
|
|
111
|
-
const filteredObj = Object.fromEntries(filteredArr);
|
|
112
|
-
const extraDependencies = {
|
|
113
|
-
uuid: '8.3.2',
|
|
114
|
-
'ngx-device-detector': '3.0.0',
|
|
115
|
-
'ngx-moment': '~6.0.0',
|
|
116
|
-
'ngx-mask': '^14.0.0',
|
|
117
|
-
'cleave.js': '^1.6.0',
|
|
118
|
-
moment: '^2.19.3',
|
|
119
|
-
extend: '^3.0.2',
|
|
120
|
-
};
|
|
121
|
-
// filter devDependencies to only what stackblitz needs
|
|
122
|
-
filteredArr = Object.entries(dependencies).filter((v) => stackblitzDevDependencies.find((s) => s === v[0]));
|
|
123
|
-
dependencies = { ...extraDependencies, ...filteredObj };
|
|
124
|
-
const devDependencies = Object.fromEntries(filteredArr);
|
|
125
|
-
return { dependencies, devDependencies };
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Retrieve the dependencies from the package.json file of @eui/deps-base for the given version.
|
|
130
|
-
*
|
|
131
|
-
* @param version
|
|
132
|
-
* @private
|
|
133
|
-
*/
|
|
134
|
-
retrievePackageDependencies(version) {
|
|
135
|
-
return fetch(`https://unpkg.com/@eui/deps-base@${version}/package.json`)
|
|
136
|
-
.then((response) => response.json())
|
|
137
|
-
.then((pkg) => pkg?.dependencies);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Retrieve the eUI version used to build the showcase from application app-metadata.json
|
|
141
|
-
*
|
|
142
|
-
* @private
|
|
143
|
-
*/
|
|
144
|
-
getCurrentShowcaseEuiVersion() {
|
|
145
|
-
return lastValueFrom(this.http.get('assets/app-metadata.json', { responseType: 'json' })).then((res) => res?.appVersion || 'latest');
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* extract the name of the component class name and selector name from the typescript content
|
|
149
|
-
*
|
|
150
|
-
* @param contents
|
|
151
|
-
* @private
|
|
152
|
-
*/
|
|
153
|
-
extractComponentMetadata(contents) {
|
|
154
|
-
const className = contents.match(/export class ([\w\d]+)/);
|
|
155
|
-
const selectorName = contents.match(/selector: '([\w\d-]+)'/);
|
|
156
|
-
return {
|
|
157
|
-
className: className ? className[1] : '',
|
|
158
|
-
selector: selectorName ? selectorName[1] : '',
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* extract module class name from the typescript content
|
|
163
|
-
*
|
|
164
|
-
* @param contents
|
|
165
|
-
* @private
|
|
166
|
-
*/
|
|
167
|
-
extractModuleName(contents) {
|
|
168
|
-
const moduleClass = contents.match(/export class (\w+Module)/);
|
|
169
|
-
return moduleClass ? moduleClass[1] : '';
|
|
170
|
-
}
|
|
171
|
-
appendVitalNgModules(contents) {
|
|
172
|
-
// const imports = contents.match(/imports: \[([\s\S]*?)\]/);
|
|
173
|
-
// appends BrowserModule to imports
|
|
174
|
-
contents = contents.replace(/imports: \[([\s\S]*?)\]/, `imports: [BrowserModule, $1]`);
|
|
175
|
-
// appends import of BrowserModule
|
|
176
|
-
return `import { BrowserModule } from '@angular/platform-browser';\n${contents}`;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
/** @nocollapse */ PlaygroundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.UxAppShellService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
180
|
-
/** @nocollapse */ PlaygroundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaygroundComponent, selector: "eui-playground", inputs: { title: "title", htmlContent: "htmlContent", typescriptContent: "typescriptContent", activated: "activated", modules: "modules" }, viewQueries: [{ propertyName: "stackblitzElWrapper", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<eui-block-content [isBlocked]=\"!isLoaded\">\n <iframe #container id=\"stackblitz\"></iframe>\n</eui-block-content>\n", dependencies: [{ kind: "component", type: i3.EuiBlockContentComponent, selector: "eui-block-content", inputs: ["isBlocked"] }] });
|
|
181
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, decorators: [{
|
|
182
|
-
type: Component,
|
|
183
|
-
args: [{ selector: 'eui-playground', template: "<eui-block-content [isBlocked]=\"!isLoaded\">\n <iframe #container id=\"stackblitz\"></iframe>\n</eui-block-content>\n" }]
|
|
184
|
-
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.UxAppShellService }, { type: i2.HttpClient }]; }, propDecorators: { title: [{
|
|
185
|
-
type: Input
|
|
186
|
-
}], htmlContent: [{
|
|
187
|
-
type: Input
|
|
188
|
-
}], typescriptContent: [{
|
|
189
|
-
type: Input
|
|
190
|
-
}], activated: [{
|
|
191
|
-
type: Input
|
|
192
|
-
}], modules: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}], stackblitzElWrapper: [{
|
|
195
|
-
type: ViewChild,
|
|
196
|
-
args: ['container', { read: ElementRef, static: true }]
|
|
197
|
-
}] } });
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWdyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGxheWdyb3VuZC9wbGF5Z3JvdW5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wbGF5Z3JvdW5kL3BsYXlncm91bmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxHQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBTXJILE1BQU0sT0FBTyxtQkFBbUI7SUFpQjVCLFlBQ1ksUUFBbUIsRUFDbkIsVUFBc0IsRUFDdEIsUUFBMkIsRUFDM0IsSUFBZ0I7UUFIaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQzNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFuQnJCLFVBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQU16QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFXckIsQ0FBQztJQUVKLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2FBQ3pCO1NBQ0o7SUFDTCxDQUFDO0lBRU8sY0FBYztRQUNsQixJQUFJLENBQUMseUJBQXlCLEVBQUU7YUFDM0IsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQztZQUMvQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRSxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQ25CLFlBQVksRUFDWjtnQkFDSSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFdBQVcsRUFBRSwwQkFBMEIsSUFBSSxDQUFDLEtBQUssR0FBRztnQkFDcEQsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLEtBQUssRUFBRTtvQkFDSCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsV0FBVztvQkFDdEMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztvQkFDckUsNERBQTREO29CQUM1RCxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQztvQkFDbkMsa0JBQWtCLEVBQUUsYUFBYTtvQkFDakMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQztvQkFDekMsY0FBYyxFQUFFLGVBQWU7b0JBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUMxQjt3QkFDSSxHQUFHLFlBQVk7d0JBQ2YsWUFBWTt3QkFDWixlQUFlO3FCQUNsQixFQUNELElBQUksRUFDSixDQUFDLENBQ0o7b0JBQ0QsZUFBZSxFQUFFLFFBQVE7aUJBQzVCO2dCQUNELFFBQVEsRUFBRTtvQkFDTixPQUFPLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLE1BQU07d0JBQ2YsWUFBWSxFQUFFLEtBQUs7cUJBQ3RCO2lCQUNKO2dCQUNELFlBQVk7YUFDZixFQUNEO2dCQUNJLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztnQkFDMUIsTUFBTSxFQUFFLEdBQUc7YUFDZCxDQUNKLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxRQUFZLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx5QkFBeUI7UUFJN0IsK0NBQStDO1FBQy9DLE1BQU0sc0JBQXNCLEdBQUc7WUFDM0IscUJBQXFCO1lBQ3JCLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLGtDQUFrQztZQUNsQywyQkFBMkI7WUFDM0IsbUNBQW1DO1lBQ25DLGlCQUFpQjtZQUNqQixXQUFXO1lBQ1gsaUJBQWlCO1lBQ2pCLFdBQVc7WUFDWCxhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLGVBQWU7WUFDZixhQUFhO1lBQ2IscUJBQXFCO1lBQ3JCLGFBQWE7WUFDYixXQUFXO1lBQ1gsVUFBVTtZQUNWLE1BQU07WUFDTixPQUFPO1lBQ1AsU0FBUztTQUNaLENBQUM7UUFFRixNQUFNLHlCQUF5QixHQUFHLENBQUMsK0JBQStCLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTNILE9BQU8sSUFBSSxDQUFDLDRCQUE0QixFQUFFO2FBQ3JDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVELElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ25CLG9EQUFvRDtZQUNwRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3RCLElBQUksRUFBRSxPQUFPO2dCQUNiLHFCQUFxQixFQUFFLE9BQU87Z0JBQzlCLFlBQVksRUFBRSxRQUFRO2dCQUN0QixVQUFVLEVBQUUsU0FBUztnQkFDckIsV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNuQixDQUFDO1lBQ0YsdURBQXVEO1lBQ3ZELFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RyxZQUFZLEdBQUcsRUFBRSxHQUFHLGlCQUFpQixFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDeEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUV4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssMkJBQTJCLENBQUMsT0FBTztRQUN2QyxPQUFPLEtBQUssQ0FBQyxvQ0FBb0MsT0FBTyxlQUFlLENBQUM7YUFDbkUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbkMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw0QkFBNEI7UUFDaEMsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sMEJBQTBCLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0YsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLElBQUksUUFBUSxDQUN2QyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssd0JBQXdCLENBQUMsUUFBZ0I7UUFJN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5RCxPQUFPO1lBQ0gsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNoRCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssaUJBQWlCLENBQUMsUUFBZ0I7UUFDdEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBZ0I7UUFDekMsNkRBQTZEO1FBQzdELG1DQUFtQztRQUNuQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZGLGtDQUFrQztRQUNsQyxPQUFPLCtEQUErRCxRQUFRLEVBQUUsQ0FBQztJQUNyRixDQUFDOzttSUEvTVEsbUJBQW1CO3VIQUFuQixtQkFBbUIsK1JBWUksVUFBVSxnRUN2QjlDLDJIQUdBOzJGRFFhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDSSxnQkFBZ0I7a0xBS25CLEtBQUs7c0JBRFgsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUlFLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVeEFwcFNoZWxsU2VydmljZSB9IGZyb20gJ0BldWkvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHNkaywgeyBQcm9qZWN0RGVwZW5kZW5jaWVzLCBWTSB9IGZyb20gJ0BzdGFja2JsaXR6L3Nkayc7XG5pbXBvcnQgeyBsYXN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhbmd1bGFySnNvbkZpbGUsIGluZGV4SHRtbEZpbGUsIG1haW5GaWxlLCBQQUNLQUdFX0pTT04sIHBvbHlmaWxsc0ZpbGUsIHRzQ29uZmlnIH0gZnJvbSAnLi9zdGFja2JsaXR6LmZpbGVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdldWktcGxheWdyb3VuZCcsXG4gICAgdGVtcGxhdGVVcmw6IGBwbGF5Z3JvdW5kLmNvbXBvbmVudC5odG1sYCxcbn0pXG5leHBvcnQgY2xhc3MgUGxheWdyb3VuZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGl0bGUgPSAnZVVJIFBsYXlncm91bmQnO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGh0bWxDb250ZW50OiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHlwZXNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtb2R1bGVzOiBbeyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XTtcbiAgICBwdWJsaWMgaXNMb2FkZWQgPSBmYWxzZTtcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgc3RhY2tibGl0ekVsV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MSUZyYW1lRWxlbWVudD47XG4gICAgLyoqIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHN0YWNrYmxpdHogVk0gb2JqZWN0ICovXG4gICAgcHJpdmF0ZSBzdGFja2JsaXR6SW5zdGFuY2U6IFZNO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGFwcFNoZWxsOiBVeEFwcFNoZWxsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XG4gICAgKSB7fVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5hY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmFjdGl2YXRlZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTdGFja2JsaXR6KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFN0YWNrYmxpdHooKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0U3RhY2tibGl0ekRlcGVuZGVuY2llcygpXG4gICAgICAgICAgICAudGhlbigoZGVwcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMgfSA9IGRlcHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3RvciB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50TWV0YWRhdGEodGhpcy50eXBlc2NyaXB0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IHRoaXMuZXh0cmFjdE1vZHVsZU5hbWUodGhpcy50eXBlc2NyaXB0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNkay5lbWJlZFByb2plY3QoXG4gICAgICAgICAgICAgICAgICAgICdzdGFja2JsaXR6JyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYEFuIGVVSSBleGFtcGxlIGZvciB0aGUgJHt0aGlzLnRpdGxlfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdhbmd1bGFyLWNsaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29tcG9uZW50Lmh0bWwnOiB0aGlzLmh0bWxDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29tcG9uZW50LnRzJzogdGhpcy5hcHBlbmRWaXRhbE5nTW9kdWxlcyh0aGlzLnR5cGVzY3JpcHRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnc3JjL2FwcC5tb2R1bGUudHMnOiBtb2R1bGVGaWxlKGNsYXNzTmFtZSwgdGhpcy5tb2R1bGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL21haW4udHMnOiBtYWluRmlsZShtb2R1bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL3BvbHlmaWxscy50cyc6IHBvbHlmaWxsc0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9pbmRleC5odG1sJzogaW5kZXhIdG1sRmlsZShzZWxlY3RvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuZ3VsYXIuanNvbic6IGFuZ3VsYXJKc29uRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZS5qc29uJzogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlBBQ0tBR0VfSlNPTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RzY29uZmlnLmpzb24nOiB0c0NvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckNvbnNvbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuRmlsZTogWydjb21wb25lbnQudHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNTAwLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoaW5zdGFuY2U6IFZNKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFja2JsaXR6SW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIG9ubHkgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHN0YWNrYmxpdHogd2lsbCBuZWVkIGZpbHRlcmVkIGZyb20gQGV1aS9kZXBzLWJhc2VcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTdGFja2JsaXR6RGVwZW5kZW5jaWVzKCk6IFByb21pc2U8e1xuICAgICAgICBkZXBlbmRlbmNpZXM6IFByb2plY3REZXBlbmRlbmNpZXM7XG4gICAgICAgIGRldkRlcGVuZGVuY2llczogUHJvamVjdERlcGVuZGVuY2llcztcbiAgICB9PiB7XG4gICAgICAgIC8vIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb25seSBzdGFja2JsaXR6IG5lZWRzXG4gICAgICAgIGNvbnN0IHN0YWNrYmxpdHpEZXBlbmRlbmNpZXMgPSBbXG4gICAgICAgICAgICAnQGFuZ3VsYXIvYW5pbWF0aW9ucycsXG4gICAgICAgICAgICAnQGFuZ3VsYXIvY2RrJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9jb21tb24nLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2NvbXBpbGVyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9jb3JlJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9mb3JtcycsXG4gICAgICAgICAgICAnQGFuZ3VsYXIvbWF0ZXJpYWwnLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJyxcbiAgICAgICAgICAgICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnLFxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3JvdXRlcicsXG4gICAgICAgICAgICAnQGV1aS9iYXNlJyxcbiAgICAgICAgICAgICdAZXVpL2NvbXBvbmVudHMnLFxuICAgICAgICAgICAgJ0BldWkvY29yZScsXG4gICAgICAgICAgICAnQGV1aS9zdHlsZXMnLFxuICAgICAgICAgICAgJ0BldWkvc3R5bGVzLWJhc2UnLFxuICAgICAgICAgICAgJ0BuZ3J4L2VmZmVjdHMnLFxuICAgICAgICAgICAgJ0BuZ3J4L3N0b3JlJyxcbiAgICAgICAgICAgICdAbmd4LXRyYW5zbGF0ZS9jb3JlJyxcbiAgICAgICAgICAgICdsb2NhbGZvcmFnZScsXG4gICAgICAgICAgICAnbG9kYXNoLWVzJyxcbiAgICAgICAgICAgICdyZXNlbGVjdCcsXG4gICAgICAgICAgICAncnhqcycsXG4gICAgICAgICAgICAndHNsaWInLFxuICAgICAgICAgICAgJ3pvbmUuanMnLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrYmxpdHpEZXZEZXBlbmRlbmNpZXMgPSBbJ0Bhbmd1bGFyLWRldmtpdC9idWlsZC1hbmd1bGFyJywgJ0Bhbmd1bGFyL2NsaScsICdAYW5ndWxhci9jb21waWxlci1jbGknLCAndHlwZXNjcmlwdCddO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTaG93Y2FzZUV1aVZlcnNpb24oKVxuICAgICAgICAgICAgLnRoZW4oKHZlcnNpb24pID0+IHRoaXMucmV0cmlldmVQYWNrYWdlRGVwZW5kZW5jaWVzKHZlcnNpb24pKVxuICAgICAgICAgICAgLnRoZW4oKGRlcGVuZGVuY2llcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBkZXBlbmRlbmNpZXMgdG8gb25seSB3aGF0IHN0YWNrYmxpdHogbmVlZHNcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRBcnIgPSBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigodikgPT4gc3RhY2tibGl0ekRlcGVuZGVuY2llcy5maW5kKChzKSA9PiBzID09PSB2WzBdKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRPYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZmlsdGVyZWRBcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhRGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAgICAgICAgICAgICB1dWlkOiAnOC4zLjInLFxuICAgICAgICAgICAgICAgICAgICAnbmd4LWRldmljZS1kZXRlY3Rvcic6ICczLjAuMCcsXG4gICAgICAgICAgICAgICAgICAgICduZ3gtbW9tZW50JzogJ342LjAuMCcsXG4gICAgICAgICAgICAgICAgICAgICduZ3gtbWFzayc6ICdeMTQuMC4wJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NsZWF2ZS5qcyc6ICdeMS42LjAnLFxuICAgICAgICAgICAgICAgICAgICBtb21lbnQ6ICdeMi4xOS4zJyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kOiAnXjMuMC4yJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBkZXZEZXBlbmRlbmNpZXMgdG8gb25seSB3aGF0IHN0YWNrYmxpdHogbmVlZHNcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZEFyciA9IE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykuZmlsdGVyKCh2KSA9PiBzdGFja2JsaXR6RGV2RGVwZW5kZW5jaWVzLmZpbmQoKHMpID0+IHMgPT09IHZbMF0pKTtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSB7IC4uLmV4dHJhRGVwZW5kZW5jaWVzLCAuLi5maWx0ZXJlZE9iaiB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IE9iamVjdC5mcm9tRW50cmllcyhmaWx0ZXJlZEFycik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcyB9O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBAZXVpL2RlcHMtYmFzZSBmb3IgdGhlIGdpdmVuIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXRyaWV2ZVBhY2thZ2VEZXBlbmRlbmNpZXModmVyc2lvbik6IFByb21pc2U8UHJvamVjdERlcGVuZGVuY2llcz4ge1xuICAgICAgICByZXR1cm4gZmV0Y2goYGh0dHBzOi8vdW5wa2cuY29tL0BldWkvZGVwcy1iYXNlQCR7dmVyc2lvbn0vcGFja2FnZS5qc29uYClcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgICAgICAgLnRoZW4oKHBrZykgPT4gcGtnPy5kZXBlbmRlbmNpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBlVUkgdmVyc2lvbiB1c2VkIHRvIGJ1aWxkIHRoZSBzaG93Y2FzZSBmcm9tIGFwcGxpY2F0aW9uIGFwcC1tZXRhZGF0YS5qc29uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbGFzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZ2V0PGFueT4oJ2Fzc2V0cy9hcHAtbWV0YWRhdGEuanNvbicsIHsgcmVzcG9uc2VUeXBlOiAnanNvbicgfSkpLnRoZW4oXG4gICAgICAgICAgICAocmVzKSA9PiByZXM/LmFwcFZlcnNpb24gfHwgJ2xhdGVzdCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgbmFtZSBhbmQgc2VsZWN0b3IgbmFtZSBmcm9tIHRoZSB0eXBlc2NyaXB0IGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZW50c1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50TWV0YWRhdGEoY29udGVudHM6IHN0cmluZyk6IHtcbiAgICAgICAgc2VsZWN0b3I6IHN0cmluZztcbiAgICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNvbnRlbnRzLm1hdGNoKC9leHBvcnQgY2xhc3MgKFtcXHdcXGRdKykvKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JOYW1lID0gY29udGVudHMubWF0Y2goL3NlbGVjdG9yOiAnKFtcXHdcXGQtXSspJy8pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgPyBjbGFzc05hbWVbMV0gOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rvck5hbWUgPyBzZWxlY3Rvck5hbWVbMV0gOiAnJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHRyYWN0IG1vZHVsZSBjbGFzcyBuYW1lIGZyb20gdGhlIHR5cGVzY3JpcHQgY29udGVudFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRlbnRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RNb2R1bGVOYW1lKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtb2R1bGVDbGFzcyA9IGNvbnRlbnRzLm1hdGNoKC9leHBvcnQgY2xhc3MgKFxcdytNb2R1bGUpLyk7XG4gICAgICAgIHJldHVybiBtb2R1bGVDbGFzcyA/IG1vZHVsZUNsYXNzWzFdIDogJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRWaXRhbE5nTW9kdWxlcyhjb250ZW50czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gY29uc3QgaW1wb3J0cyA9IGNvbnRlbnRzLm1hdGNoKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vKTtcbiAgICAgICAgLy8gYXBwZW5kcyBCcm93c2VyTW9kdWxlIHRvIGltcG9ydHNcbiAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vLCBgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGUsICQxXWApO1xuICAgICAgICAvLyBhcHBlbmRzIGltcG9ydCBvZiBCcm93c2VyTW9kdWxlXG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgQnJvd3Nlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xcbiR7Y29udGVudHN9YDtcbiAgICB9XG59XG4iLCI8ZXVpLWJsb2NrLWNvbnRlbnQgW2lzQmxvY2tlZF09XCIhaXNMb2FkZWRcIj5cbiAgICA8aWZyYW1lICNjb250YWluZXIgaWQ9XCJzdGFja2JsaXR6XCI+PC9pZnJhbWU+XG48L2V1aS1ibG9jay1jb250ZW50PlxuIl19
|
|
1
|
+
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import sdk from '@stackblitz/sdk';
|
|
3
|
+
import { lastValueFrom } from 'rxjs';
|
|
4
|
+
import { angularJsonFile, indexHtmlFile, mainFile, PACKAGE_JSON, polyfillsFile, tsConfig } from './stackblitz.files';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@eui/core";
|
|
7
|
+
import * as i2 from "@angular/common/http";
|
|
8
|
+
import * as i3 from "@eui/components/eui-block-content";
|
|
9
|
+
export class PlaygroundComponent {
|
|
10
|
+
constructor(renderer, elementRef, appShell, http) {
|
|
11
|
+
this.renderer = renderer;
|
|
12
|
+
this.elementRef = elementRef;
|
|
13
|
+
this.appShell = appShell;
|
|
14
|
+
this.http = http;
|
|
15
|
+
this.title = 'eUI Playground';
|
|
16
|
+
this.activated = false;
|
|
17
|
+
this.isLoaded = false;
|
|
18
|
+
}
|
|
19
|
+
ngOnChanges(changes) {
|
|
20
|
+
if (changes.activated) {
|
|
21
|
+
if (changes.activated.currentValue) {
|
|
22
|
+
this.initStackblitz();
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
this.isLoaded = false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
initStackblitz() {
|
|
30
|
+
this.getStackblitzDependencies()
|
|
31
|
+
.then((deps) => {
|
|
32
|
+
const { dependencies, devDependencies } = deps;
|
|
33
|
+
const { selector } = this.extractComponentMetadata(this.typescriptContent);
|
|
34
|
+
const moduleName = this.extractModuleName(this.typescriptContent);
|
|
35
|
+
return sdk.embedProject('stackblitz', {
|
|
36
|
+
title: this.title,
|
|
37
|
+
description: `An eUI example for the ${this.title}.`,
|
|
38
|
+
template: 'angular-cli',
|
|
39
|
+
files: {
|
|
40
|
+
'src/component.html': this.htmlContent,
|
|
41
|
+
'src/component.ts': this.appendVitalNgModules(this.typescriptContent),
|
|
42
|
+
// 'src/app.module.ts': moduleFile(className, this.modules),
|
|
43
|
+
'src/main.ts': mainFile(moduleName),
|
|
44
|
+
'src/polyfills.ts': polyfillsFile,
|
|
45
|
+
'src/index.html': indexHtmlFile(selector),
|
|
46
|
+
'angular.json': angularJsonFile,
|
|
47
|
+
'package.json': JSON.stringify({
|
|
48
|
+
...PACKAGE_JSON,
|
|
49
|
+
dependencies,
|
|
50
|
+
devDependencies,
|
|
51
|
+
}, null, 2),
|
|
52
|
+
'tsconfig.json': tsConfig,
|
|
53
|
+
},
|
|
54
|
+
settings: {
|
|
55
|
+
compile: {
|
|
56
|
+
trigger: 'auto',
|
|
57
|
+
clearConsole: false,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
dependencies,
|
|
61
|
+
}, {
|
|
62
|
+
openFile: ['component.ts'],
|
|
63
|
+
height: 500,
|
|
64
|
+
});
|
|
65
|
+
})
|
|
66
|
+
.then((instance) => {
|
|
67
|
+
this.stackblitzInstance = instance;
|
|
68
|
+
this.isLoaded = true;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Retrieve only the dependencies that stackblitz will need filtered from @eui/deps-base
|
|
73
|
+
*
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
getStackblitzDependencies() {
|
|
77
|
+
// a list of dependencies only stackblitz needs
|
|
78
|
+
const stackblitzDependencies = [
|
|
79
|
+
'@angular/animations',
|
|
80
|
+
'@angular/cdk',
|
|
81
|
+
'@angular/common',
|
|
82
|
+
'@angular/compiler',
|
|
83
|
+
'@angular/core',
|
|
84
|
+
'@angular/forms',
|
|
85
|
+
'@angular/material',
|
|
86
|
+
'@angular/material-moment-adapter',
|
|
87
|
+
'@angular/platform-browser',
|
|
88
|
+
'@angular/platform-browser-dynamic',
|
|
89
|
+
'@angular/router',
|
|
90
|
+
'@eui/base',
|
|
91
|
+
'@eui/components',
|
|
92
|
+
'@eui/core',
|
|
93
|
+
'@eui/styles',
|
|
94
|
+
'@eui/styles-base',
|
|
95
|
+
'@ngrx/effects',
|
|
96
|
+
'@ngrx/store',
|
|
97
|
+
'@ngx-translate/core',
|
|
98
|
+
'localforage',
|
|
99
|
+
'lodash-es',
|
|
100
|
+
'reselect',
|
|
101
|
+
'rxjs',
|
|
102
|
+
'tslib',
|
|
103
|
+
'zone.js',
|
|
104
|
+
];
|
|
105
|
+
const stackblitzDevDependencies = ['@angular-devkit/build-angular', '@angular/cli', '@angular/compiler-cli', 'typescript'];
|
|
106
|
+
return this.getCurrentShowcaseEuiVersion()
|
|
107
|
+
.then((version) => this.retrievePackageDependencies(version))
|
|
108
|
+
.then((dependencies) => {
|
|
109
|
+
// filter dependencies to only what stackblitz needs
|
|
110
|
+
let filteredArr = Object.entries(dependencies).filter((v) => stackblitzDependencies.find((s) => s === v[0]));
|
|
111
|
+
const filteredObj = Object.fromEntries(filteredArr);
|
|
112
|
+
const extraDependencies = {
|
|
113
|
+
uuid: '8.3.2',
|
|
114
|
+
'ngx-device-detector': '3.0.0',
|
|
115
|
+
'ngx-moment': '~6.0.0',
|
|
116
|
+
'ngx-mask': '^14.0.0',
|
|
117
|
+
'cleave.js': '^1.6.0',
|
|
118
|
+
moment: '^2.19.3',
|
|
119
|
+
extend: '^3.0.2',
|
|
120
|
+
};
|
|
121
|
+
// filter devDependencies to only what stackblitz needs
|
|
122
|
+
filteredArr = Object.entries(dependencies).filter((v) => stackblitzDevDependencies.find((s) => s === v[0]));
|
|
123
|
+
dependencies = { ...extraDependencies, ...filteredObj };
|
|
124
|
+
const devDependencies = Object.fromEntries(filteredArr);
|
|
125
|
+
return { dependencies, devDependencies };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Retrieve the dependencies from the package.json file of @eui/deps-base for the given version.
|
|
130
|
+
*
|
|
131
|
+
* @param version
|
|
132
|
+
* @private
|
|
133
|
+
*/
|
|
134
|
+
retrievePackageDependencies(version) {
|
|
135
|
+
return fetch(`https://unpkg.com/@eui/deps-base@${version}/package.json`)
|
|
136
|
+
.then((response) => response.json())
|
|
137
|
+
.then((pkg) => pkg?.dependencies);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Retrieve the eUI version used to build the showcase from application app-metadata.json
|
|
141
|
+
*
|
|
142
|
+
* @private
|
|
143
|
+
*/
|
|
144
|
+
getCurrentShowcaseEuiVersion() {
|
|
145
|
+
return lastValueFrom(this.http.get('assets/app-metadata.json', { responseType: 'json' })).then((res) => res?.appVersion || 'latest');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* extract the name of the component class name and selector name from the typescript content
|
|
149
|
+
*
|
|
150
|
+
* @param contents
|
|
151
|
+
* @private
|
|
152
|
+
*/
|
|
153
|
+
extractComponentMetadata(contents) {
|
|
154
|
+
const className = contents.match(/export class ([\w\d]+)/);
|
|
155
|
+
const selectorName = contents.match(/selector: '([\w\d-]+)'/);
|
|
156
|
+
return {
|
|
157
|
+
className: className ? className[1] : '',
|
|
158
|
+
selector: selectorName ? selectorName[1] : '',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* extract module class name from the typescript content
|
|
163
|
+
*
|
|
164
|
+
* @param contents
|
|
165
|
+
* @private
|
|
166
|
+
*/
|
|
167
|
+
extractModuleName(contents) {
|
|
168
|
+
const moduleClass = contents.match(/export class (\w+Module)/);
|
|
169
|
+
return moduleClass ? moduleClass[1] : '';
|
|
170
|
+
}
|
|
171
|
+
appendVitalNgModules(contents) {
|
|
172
|
+
// const imports = contents.match(/imports: \[([\s\S]*?)\]/);
|
|
173
|
+
// appends BrowserModule to imports
|
|
174
|
+
contents = contents.replace(/imports: \[([\s\S]*?)\]/, `imports: [BrowserModule, $1]`);
|
|
175
|
+
// appends import of BrowserModule
|
|
176
|
+
return `import { BrowserModule } from '@angular/platform-browser';\n${contents}`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** @nocollapse */ PlaygroundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.UxAppShellService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
180
|
+
/** @nocollapse */ PlaygroundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaygroundComponent, selector: "eui-playground", inputs: { title: "title", htmlContent: "htmlContent", typescriptContent: "typescriptContent", activated: "activated", modules: "modules" }, viewQueries: [{ propertyName: "stackblitzElWrapper", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<eui-block-content [isBlocked]=\"!isLoaded\">\r\n <iframe #container id=\"stackblitz\"></iframe>\r\n</eui-block-content>\r\n", dependencies: [{ kind: "component", type: i3.EuiBlockContentComponent, selector: "eui-block-content", inputs: ["isBlocked"] }] });
|
|
181
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaygroundComponent, decorators: [{
|
|
182
|
+
type: Component,
|
|
183
|
+
args: [{ selector: 'eui-playground', template: "<eui-block-content [isBlocked]=\"!isLoaded\">\r\n <iframe #container id=\"stackblitz\"></iframe>\r\n</eui-block-content>\r\n" }]
|
|
184
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.UxAppShellService }, { type: i2.HttpClient }]; }, propDecorators: { title: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], htmlContent: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], typescriptContent: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}], activated: [{
|
|
191
|
+
type: Input
|
|
192
|
+
}], modules: [{
|
|
193
|
+
type: Input
|
|
194
|
+
}], stackblitzElWrapper: [{
|
|
195
|
+
type: ViewChild,
|
|
196
|
+
args: ['container', { read: ElementRef, static: true }]
|
|
197
|
+
}] } });
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWdyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGxheWdyb3VuZC9wbGF5Z3JvdW5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wbGF5Z3JvdW5kL3BsYXlncm91bmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxHQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBTXJILE1BQU0sT0FBTyxtQkFBbUI7SUFpQjVCLFlBQ1ksUUFBbUIsRUFDbkIsVUFBc0IsRUFDdEIsUUFBMkIsRUFDM0IsSUFBZ0I7UUFIaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQzNCLFNBQUksR0FBSixJQUFJLENBQVk7UUFuQnJCLFVBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQU16QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFXckIsQ0FBQztJQUVKLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNI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QUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3ZGLGtDQUFrQztRQUNsQyxPQUFPLCtEQUErRCxRQUFRLEVBQUUsQ0FBQztJQUNyRixDQUFDOzttSUEvTVEsbUJBQW1CO3VIQUFuQixtQkFBbUIsK1JBWUksVUFBVSxnRUN2QjlDLGlJQUdBOzJGRFFhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDSSxnQkFBZ0I7a0xBS25CLEtBQUs7c0JBRFgsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUlFLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFV4QXBwU2hlbGxTZXJ2aWNlIH0gZnJvbSAnQGV1aS9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHNkaywgeyBQcm9qZWN0RGVwZW5kZW5jaWVzLCBWTSB9IGZyb20gJ0BzdGFja2JsaXR6L3Nkayc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgYW5ndWxhckpzb25GaWxlLCBpbmRleEh0bWxGaWxlLCBtYWluRmlsZSwgUEFDS0FHRV9KU09OLCBwb2x5ZmlsbHNGaWxlLCB0c0NvbmZpZyB9IGZyb20gJy4vc3RhY2tibGl0ei5maWxlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZXVpLXBsYXlncm91bmQnLFxyXG4gICAgdGVtcGxhdGVVcmw6IGBwbGF5Z3JvdW5kLmNvbXBvbmVudC5odG1sYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYXlncm91bmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0aXRsZSA9ICdlVUkgUGxheWdyb3VuZCc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGh0bWxDb250ZW50OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHR5cGVzY3JpcHRDb250ZW50OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGFjdGl2YXRlZCA9IGZhbHNlO1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBtb2R1bGVzOiBbeyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XTtcclxuICAgIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc3RhY2tibGl0ekVsV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MSUZyYW1lRWxlbWVudD47XHJcbiAgICAvKiogaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgc3RhY2tibGl0eiBWTSBvYmplY3QgKi9cclxuICAgIHByaXZhdGUgc3RhY2tibGl0ekluc3RhbmNlOiBWTTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgYXBwU2hlbGw6IFV4QXBwU2hlbGxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5hY3RpdmF0ZWQpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuYWN0aXZhdGVkLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U3RhY2tibGl0eigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFN0YWNrYmxpdHooKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nZXRTdGFja2JsaXR6RGVwZW5kZW5jaWVzKClcclxuICAgICAgICAgICAgLnRoZW4oKGRlcHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMgfSA9IGRlcHM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbGVjdG9yIH0gPSB0aGlzLmV4dHJhY3RDb21wb25lbnRNZXRhZGF0YSh0aGlzLnR5cGVzY3JpcHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSB0aGlzLmV4dHJhY3RNb2R1bGVOYW1lKHRoaXMudHlwZXNjcmlwdENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNkay5lbWJlZFByb2plY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgJ3N0YWNrYmxpdHonLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQW4gZVVJIGV4YW1wbGUgZm9yIHRoZSAke3RoaXMudGl0bGV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnYW5ndWxhci1jbGknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb21wb25lbnQuaHRtbCc6IHRoaXMuaHRtbENvbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvbXBvbmVudC50cyc6IHRoaXMuYXBwZW5kVml0YWxOZ01vZHVsZXModGhpcy50eXBlc2NyaXB0Q29udGVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnc3JjL2FwcC5tb2R1bGUudHMnOiBtb2R1bGVGaWxlKGNsYXNzTmFtZSwgdGhpcy5tb2R1bGVzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvbWFpbi50cyc6IG1haW5GaWxlKG1vZHVsZU5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9wb2x5ZmlsbHMudHMnOiBwb2x5ZmlsbHNGaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9pbmRleC5odG1sJzogaW5kZXhIdG1sRmlsZShzZWxlY3RvciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5ndWxhci5qc29uJzogYW5ndWxhckpzb25GaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbic6IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uUEFDS0FHRV9KU09OLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0c2NvbmZpZy5qc29uJzogdHNDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ2F1dG8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQ29uc29sZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5GaWxlOiBbJ2NvbXBvbmVudC50cyddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbigoaW5zdGFuY2U6IFZNKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrYmxpdHpJbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgb25seSB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgc3RhY2tibGl0eiB3aWxsIG5lZWQgZmlsdGVyZWQgZnJvbSBAZXVpL2RlcHMtYmFzZVxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0U3RhY2tibGl0ekRlcGVuZGVuY2llcygpOiBQcm9taXNlPHtcclxuICAgICAgICBkZXBlbmRlbmNpZXM6IFByb2plY3REZXBlbmRlbmNpZXM7XHJcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzOiBQcm9qZWN0RGVwZW5kZW5jaWVzO1xyXG4gICAgfT4ge1xyXG4gICAgICAgIC8vIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgb25seSBzdGFja2JsaXR6IG5lZWRzXHJcbiAgICAgICAgY29uc3Qgc3RhY2tibGl0ekRlcGVuZGVuY2llcyA9IFtcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnLFxyXG4gICAgICAgICAgICAnQGFuZ3VsYXIvY2RrJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2NvbW1vbicsXHJcbiAgICAgICAgICAgICdAYW5ndWxhci9jb21waWxlcicsXHJcbiAgICAgICAgICAgICdAYW5ndWxhci9jb3JlJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL2Zvcm1zJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInLFxyXG4gICAgICAgICAgICAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJyxcclxuICAgICAgICAgICAgJ0Bhbmd1bGFyL3JvdXRlcicsXHJcbiAgICAgICAgICAgICdAZXVpL2Jhc2UnLFxyXG4gICAgICAgICAgICAnQGV1aS9jb21wb25lbnRzJyxcclxuICAgICAgICAgICAgJ0BldWkvY29yZScsXHJcbiAgICAgICAgICAgICdAZXVpL3N0eWxlcycsXHJcbiAgICAgICAgICAgICdAZXVpL3N0eWxlcy1iYXNlJyxcclxuICAgICAgICAgICAgJ0BuZ3J4L2VmZmVjdHMnLFxyXG4gICAgICAgICAgICAnQG5ncngvc3RvcmUnLFxyXG4gICAgICAgICAgICAnQG5neC10cmFuc2xhdGUvY29yZScsXHJcbiAgICAgICAgICAgICdsb2NhbGZvcmFnZScsXHJcbiAgICAgICAgICAgICdsb2Rhc2gtZXMnLFxyXG4gICAgICAgICAgICAncmVzZWxlY3QnLFxyXG4gICAgICAgICAgICAncnhqcycsXHJcbiAgICAgICAgICAgICd0c2xpYicsXHJcbiAgICAgICAgICAgICd6b25lLmpzJyxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFja2JsaXR6RGV2RGVwZW5kZW5jaWVzID0gWydAYW5ndWxhci1kZXZraXQvYnVpbGQtYW5ndWxhcicsICdAYW5ndWxhci9jbGknLCAnQGFuZ3VsYXIvY29tcGlsZXItY2xpJywgJ3R5cGVzY3JpcHQnXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpXHJcbiAgICAgICAgICAgIC50aGVuKCh2ZXJzaW9uKSA9PiB0aGlzLnJldHJpZXZlUGFja2FnZURlcGVuZGVuY2llcyh2ZXJzaW9uKSlcclxuICAgICAgICAgICAgLnRoZW4oKGRlcGVuZGVuY2llcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGRlcGVuZGVuY2llcyB0byBvbmx5IHdoYXQgc3RhY2tibGl0eiBuZWVkc1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkQXJyID0gT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKS5maWx0ZXIoKHYpID0+IHN0YWNrYmxpdHpEZXBlbmRlbmNpZXMuZmluZCgocykgPT4gcyA9PT0gdlswXSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRPYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZmlsdGVyZWRBcnIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmFEZXBlbmRlbmNpZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXVpZDogJzguMy4yJyxcclxuICAgICAgICAgICAgICAgICAgICAnbmd4LWRldmljZS1kZXRlY3Rvcic6ICczLjAuMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ25neC1tb21lbnQnOiAnfjYuMC4wJyxcclxuICAgICAgICAgICAgICAgICAgICAnbmd4LW1hc2snOiAnXjE0LjAuMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NsZWF2ZS5qcyc6ICdeMS42LjAnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbWVudDogJ14yLjE5LjMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZDogJ14zLjAuMicsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGRldkRlcGVuZGVuY2llcyB0byBvbmx5IHdoYXQgc3RhY2tibGl0eiBuZWVkc1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRBcnIgPSBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigodikgPT4gc3RhY2tibGl0ekRldkRlcGVuZGVuY2llcy5maW5kKChzKSA9PiBzID09PSB2WzBdKSk7XHJcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSB7IC4uLmV4dHJhRGVwZW5kZW5jaWVzLCAuLi5maWx0ZXJlZE9iaiB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKGZpbHRlcmVkQXJyKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcyB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgb2YgQGV1aS9kZXBzLWJhc2UgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2ZXJzaW9uXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJldHJpZXZlUGFja2FnZURlcGVuZGVuY2llcyh2ZXJzaW9uKTogUHJvbWlzZTxQcm9qZWN0RGVwZW5kZW5jaWVzPiB7XHJcbiAgICAgICAgcmV0dXJuIGZldGNoKGBodHRwczovL3VucGtnLmNvbS9AZXVpL2RlcHMtYmFzZUAke3ZlcnNpb259L3BhY2thZ2UuanNvbmApXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgICAgICAgICAudGhlbigocGtnKSA9PiBwa2c/LmRlcGVuZGVuY2llcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZVVJIHZlcnNpb24gdXNlZCB0byBidWlsZCB0aGUgc2hvd2Nhc2UgZnJvbSBhcHBsaWNhdGlvbiBhcHAtbWV0YWRhdGEuanNvblxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFNob3djYXNlRXVpVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8YW55PignYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJywgeyByZXNwb25zZVR5cGU6ICdqc29uJyB9KSkudGhlbihcclxuICAgICAgICAgICAgKHJlcykgPT4gcmVzPy5hcHBWZXJzaW9uIHx8ICdsYXRlc3QnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lIGFuZCBzZWxlY3RvciBuYW1lIGZyb20gdGhlIHR5cGVzY3JpcHQgY29udGVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50c1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50TWV0YWRhdGEoY29udGVudHM6IHN0cmluZyk6IHtcclxuICAgICAgICBzZWxlY3Rvcjogc3RyaW5nO1xyXG4gICAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gICAgfSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gY29udGVudHMubWF0Y2goL2V4cG9ydCBjbGFzcyAoW1xcd1xcZF0rKS8pO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yTmFtZSA9IGNvbnRlbnRzLm1hdGNoKC9zZWxlY3RvcjogJyhbXFx3XFxkLV0rKScvKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSA/IGNsYXNzTmFtZVsxXSA6ICcnLFxyXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3JOYW1lID8gc2VsZWN0b3JOYW1lWzFdIDogJycsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGV4dHJhY3QgbW9kdWxlIGNsYXNzIG5hbWUgZnJvbSB0aGUgdHlwZXNjcmlwdCBjb250ZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV4dHJhY3RNb2R1bGVOYW1lKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gY29udGVudHMubWF0Y2goL2V4cG9ydCBjbGFzcyAoXFx3K01vZHVsZSkvKTtcclxuICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3MgPyBtb2R1bGVDbGFzc1sxXSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXBwZW5kVml0YWxOZ01vZHVsZXMoY29udGVudHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgLy8gY29uc3QgaW1wb3J0cyA9IGNvbnRlbnRzLm1hdGNoKC9pbXBvcnRzOiBcXFsoW1xcc1xcU10qPylcXF0vKTtcclxuICAgICAgICAvLyBhcHBlbmRzIEJyb3dzZXJNb2R1bGUgdG8gaW1wb3J0c1xyXG4gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZSgvaW1wb3J0czogXFxbKFtcXHNcXFNdKj8pXFxdLywgYGltcG9ydHM6IFtCcm93c2VyTW9kdWxlLCAkMV1gKTtcclxuICAgICAgICAvLyBhcHBlbmRzIGltcG9ydCBvZiBCcm93c2VyTW9kdWxlXHJcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XFxuJHtjb250ZW50c31gO1xyXG4gICAgfVxyXG59XHJcbiIsIjxldWktYmxvY2stY29udGVudCBbaXNCbG9ja2VkXT1cIiFpc0xvYWRlZFwiPlxyXG4gICAgPGlmcmFtZSAjY29udGFpbmVyIGlkPVwic3RhY2tibGl0elwiPjwvaWZyYW1lPlxyXG48L2V1aS1ibG9jay1jb250ZW50PlxyXG4iXX0=
|