@covalent/guided-tour 4.0.0 → 4.1.0-develop.2
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/README.md +32 -15
- package/_guided-tour-theme.scss +6 -6
- package/covalent-guided-tour.d.ts +2 -1
- package/esm2020/covalent-guided-tour.mjs +5 -0
- package/esm2020/lib/guided-tour.module.mjs +19 -0
- package/esm2020/lib/guided-tour.service.mjs +163 -0
- package/esm2020/lib/guided.tour.mjs +438 -0
- package/esm2020/public_api.mjs +4 -0
- package/fesm2015/{covalent-guided-tour.js → covalent-guided-tour.mjs} +180 -615
- package/fesm2015/covalent-guided-tour.mjs.map +1 -0
- package/fesm2020/covalent-guided-tour.mjs +619 -0
- package/fesm2020/covalent-guided-tour.mjs.map +1 -0
- package/lib/guided-tour.module.d.ts +7 -0
- package/{guided-tour.service.d.ts → lib/guided-tour.service.d.ts} +4 -1
- package/{guided.tour.d.ts → lib/guided.tour.d.ts} +3 -7
- package/package.json +25 -21
- package/public_api.d.ts +3 -0
- package/{_guided-tour.scss → styles/guided-tour.scss} +17 -2
- package/bundles/covalent-guided-tour.umd.js +0 -1369
- package/bundles/covalent-guided-tour.umd.js.map +0 -1
- package/bundles/covalent-guided-tour.umd.min.js +0 -16
- package/bundles/covalent-guided-tour.umd.min.js.map +0 -1
- package/covalent-guided-tour.metadata.json +0 -1
- package/esm2015/covalent-guided-tour.js +0 -10
- package/esm2015/guided-tour.module.js +0 -19
- package/esm2015/guided-tour.service.js +0 -312
- package/esm2015/guided.tour.js +0 -722
- package/esm2015/index.js +0 -7
- package/esm2015/public-api.js +0 -9
- package/fesm2015/covalent-guided-tour.js.map +0 -1
- package/guided-tour.module.d.ts +0 -2
- package/index.d.ts +0 -1
- package/public-api.d.ts +0 -3
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: guided-tour.service.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { __awaiter } from "tslib";
|
|
7
|
-
import { Injectable } from '@angular/core';
|
|
8
|
-
import { HttpClient } from '@angular/common/http';
|
|
9
|
-
import { Router, ActivatedRoute, NavigationStart, } from '@angular/router';
|
|
10
|
-
import { tap, map, filter } from 'rxjs/operators';
|
|
11
|
-
import { fromEvent } from 'rxjs';
|
|
12
|
-
import { debounceTime } from 'rxjs/operators';
|
|
13
|
-
import { CovalentGuidedTour } from './guided.tour';
|
|
14
|
-
/**
|
|
15
|
-
* @record
|
|
16
|
-
*/
|
|
17
|
-
export function IGuidedTour() { }
|
|
18
|
-
if (false) {
|
|
19
|
-
/** @type {?} */
|
|
20
|
-
IGuidedTour.prototype.steps;
|
|
21
|
-
/** @type {?|undefined} */
|
|
22
|
-
IGuidedTour.prototype.finishButtonText;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* @record
|
|
26
|
-
*/
|
|
27
|
-
export function IGuidedTourStep() { }
|
|
28
|
-
if (false) {
|
|
29
|
-
/** @type {?|undefined} */
|
|
30
|
-
IGuidedTourStep.prototype.routing;
|
|
31
|
-
}
|
|
32
|
-
/** @enum {string} */
|
|
33
|
-
const TourEvents = {
|
|
34
|
-
complete: "complete",
|
|
35
|
-
cancel: "cancel",
|
|
36
|
-
hide: "hide",
|
|
37
|
-
show: "show",
|
|
38
|
-
start: "start",
|
|
39
|
-
active: "active",
|
|
40
|
-
inactive: "inactive",
|
|
41
|
-
};
|
|
42
|
-
export { TourEvents };
|
|
43
|
-
/**
|
|
44
|
-
* @record
|
|
45
|
-
*/
|
|
46
|
-
export function IGuidedTourEvent() { }
|
|
47
|
-
if (false) {
|
|
48
|
-
/** @type {?} */
|
|
49
|
-
IGuidedTourEvent.prototype.step;
|
|
50
|
-
/** @type {?} */
|
|
51
|
-
IGuidedTourEvent.prototype.previous;
|
|
52
|
-
/** @type {?} */
|
|
53
|
-
IGuidedTourEvent.prototype.tour;
|
|
54
|
-
}
|
|
55
|
-
export class CovalentGuidedTourService extends CovalentGuidedTour {
|
|
56
|
-
/**
|
|
57
|
-
* @param {?} _router
|
|
58
|
-
* @param {?} _route
|
|
59
|
-
* @param {?} _httpClient
|
|
60
|
-
*/
|
|
61
|
-
constructor(_router, _route, _httpClient) {
|
|
62
|
-
super();
|
|
63
|
-
this._router = _router;
|
|
64
|
-
this._route = _route;
|
|
65
|
-
this._httpClient = _httpClient;
|
|
66
|
-
this._toursMap = new Map();
|
|
67
|
-
this._tourStepURLs = new Map();
|
|
68
|
-
_router.events
|
|
69
|
-
.pipe(filter((/**
|
|
70
|
-
* @param {?} event
|
|
71
|
-
* @return {?}
|
|
72
|
-
*/
|
|
73
|
-
(event) => event instanceof NavigationStart && event.navigationTrigger === 'popstate')))
|
|
74
|
-
.subscribe((/**
|
|
75
|
-
* @param {?} event
|
|
76
|
-
* @return {?}
|
|
77
|
-
*/
|
|
78
|
-
(event) => {
|
|
79
|
-
if (this.shepherdTour.isActive) {
|
|
80
|
-
this.shepherdTour.cancel();
|
|
81
|
-
}
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* @param {?} str
|
|
86
|
-
* @return {?}
|
|
87
|
-
*/
|
|
88
|
-
tourEvent$(str) {
|
|
89
|
-
return fromEvent(this.shepherdTour, str);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* @param {?} tourName
|
|
93
|
-
* @param {?} tour
|
|
94
|
-
* @return {?}
|
|
95
|
-
*/
|
|
96
|
-
registerTour(tourName, tour) {
|
|
97
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
-
/** @type {?} */
|
|
99
|
-
const guidedTour = typeof tour === 'string' ? yield this._loadTour(tour) : tour;
|
|
100
|
-
this._toursMap.set(tourName, guidedTour);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* @param {?} tourName
|
|
105
|
-
* @return {?}
|
|
106
|
-
*/
|
|
107
|
-
startTour(tourName) {
|
|
108
|
-
/** @type {?} */
|
|
109
|
-
const guidedTour = this._getTour(tourName);
|
|
110
|
-
this.finish();
|
|
111
|
-
if (guidedTour && guidedTour.steps && guidedTour.steps.length) {
|
|
112
|
-
// remove steps from tour since we need to preprocess them first
|
|
113
|
-
this.newTour(Object.assign({}, guidedTour, { steps: undefined }));
|
|
114
|
-
/** @type {?} */
|
|
115
|
-
const tourInstance = this.shepherdTour.addSteps(this._configureRoutesForSteps(this._prepareTour(guidedTour.steps, guidedTour.finishButtonText)));
|
|
116
|
-
// init route transition if step URL is different then the current location.
|
|
117
|
-
this.tourEvent$(TourEvents.show).subscribe((/**
|
|
118
|
-
* @param {?} tourEvent
|
|
119
|
-
* @return {?}
|
|
120
|
-
*/
|
|
121
|
-
(tourEvent) => {
|
|
122
|
-
/** @type {?} */
|
|
123
|
-
const currentURL = this._router.url.split(/[?#]/)[0];
|
|
124
|
-
const { step: { id, options }, } = tourEvent;
|
|
125
|
-
if (this._tourStepURLs.has(id)) {
|
|
126
|
-
/** @type {?} */
|
|
127
|
-
const stepRoute = this._tourStepURLs.get(id);
|
|
128
|
-
if (stepRoute !== currentURL) {
|
|
129
|
-
this._router.navigate([stepRoute]);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
if (options && options.routing) {
|
|
134
|
-
this._tourStepURLs.set(id, options.routing.route);
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
this._tourStepURLs.set(id, currentURL);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}));
|
|
141
|
-
this.start();
|
|
142
|
-
return tourInstance;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
// tslint:disable-next-line:no-console
|
|
146
|
-
console.warn(`Tour ${tourName} does not exist. Please try another tour.`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// Finds the right registered tour by using queryParams
|
|
150
|
-
// finishes any other tour and starts the new one.
|
|
151
|
-
/**
|
|
152
|
-
* @param {?=} queryParam
|
|
153
|
-
* @return {?}
|
|
154
|
-
*/
|
|
155
|
-
initializeOnQueryParams(queryParam = 'tour') {
|
|
156
|
-
return this._route.queryParamMap.pipe(debounceTime(100), tap((/**
|
|
157
|
-
* @param {?} params
|
|
158
|
-
* @return {?}
|
|
159
|
-
*/
|
|
160
|
-
(params) => {
|
|
161
|
-
/** @type {?} */
|
|
162
|
-
const tourParam = params.get(queryParam);
|
|
163
|
-
if (tourParam) {
|
|
164
|
-
this.startTour(tourParam);
|
|
165
|
-
// get current search parameters
|
|
166
|
-
/** @type {?} */
|
|
167
|
-
const searchParams = new URLSearchParams(window.location.search);
|
|
168
|
-
// delete tour queryParam
|
|
169
|
-
searchParams.delete(queryParam);
|
|
170
|
-
// build new URL string without it
|
|
171
|
-
/** @type {?} */
|
|
172
|
-
let url = window.location.protocol + '//' + window.location.host + window.location.pathname;
|
|
173
|
-
if (searchParams.toString()) {
|
|
174
|
-
url += '?' + searchParams.toString();
|
|
175
|
-
}
|
|
176
|
-
// replace state in history without triggering a navigation
|
|
177
|
-
window.history.replaceState({ path: url }, '', url);
|
|
178
|
-
}
|
|
179
|
-
})));
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* @param {?} stepId
|
|
183
|
-
* @param {?} isDisabled
|
|
184
|
-
* @return {?}
|
|
185
|
-
*/
|
|
186
|
-
setNextBtnDisability(stepId, isDisabled) {
|
|
187
|
-
if (this.shepherdTour.getById(stepId)) {
|
|
188
|
-
/** @type {?} */
|
|
189
|
-
const stepOptions = ((/** @type {?} */ (this.shepherdTour.getById(stepId)))).options;
|
|
190
|
-
stepOptions.buttons.forEach((/**
|
|
191
|
-
* @param {?} button
|
|
192
|
-
* @return {?}
|
|
193
|
-
*/
|
|
194
|
-
(button) => {
|
|
195
|
-
if (button.text === 'chevron_right') {
|
|
196
|
-
button.disabled = isDisabled;
|
|
197
|
-
}
|
|
198
|
-
}));
|
|
199
|
-
this.shepherdTour.getById(stepId).updateStepOptions(stepOptions);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* @private
|
|
204
|
-
* @param {?} tourUrl
|
|
205
|
-
* @return {?}
|
|
206
|
-
*/
|
|
207
|
-
_loadTour(tourUrl) {
|
|
208
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
209
|
-
/** @type {?} */
|
|
210
|
-
const request = this._httpClient.get(tourUrl);
|
|
211
|
-
try {
|
|
212
|
-
return yield request
|
|
213
|
-
.pipe(map((/**
|
|
214
|
-
* @param {?} resultSet
|
|
215
|
-
* @return {?}
|
|
216
|
-
*/
|
|
217
|
-
(resultSet) => {
|
|
218
|
-
return JSON.parse(JSON.stringify(resultSet));
|
|
219
|
-
})))
|
|
220
|
-
.toPromise();
|
|
221
|
-
}
|
|
222
|
-
catch (_a) {
|
|
223
|
-
return undefined;
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* @private
|
|
229
|
-
* @param {?} key
|
|
230
|
-
* @return {?}
|
|
231
|
-
*/
|
|
232
|
-
_getTour(key) {
|
|
233
|
-
return this._toursMap.get(key);
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* @private
|
|
237
|
-
* @param {?} routedSteps
|
|
238
|
-
* @return {?}
|
|
239
|
-
*/
|
|
240
|
-
_configureRoutesForSteps(routedSteps) {
|
|
241
|
-
routedSteps.forEach((/**
|
|
242
|
-
* @param {?} step
|
|
243
|
-
* @return {?}
|
|
244
|
-
*/
|
|
245
|
-
(step) => {
|
|
246
|
-
if (step.routing) {
|
|
247
|
-
/** @type {?} */
|
|
248
|
-
const route = step.routing.route;
|
|
249
|
-
// if there is a beforeShowPromise, then we save it and call it after the navigation
|
|
250
|
-
if (step.beforeShowPromise) {
|
|
251
|
-
/** @type {?} */
|
|
252
|
-
const beforeShowPromise = step.beforeShowPromise;
|
|
253
|
-
step.beforeShowPromise = (/**
|
|
254
|
-
* @return {?}
|
|
255
|
-
*/
|
|
256
|
-
() => {
|
|
257
|
-
return this._router.navigate([route], step.routing.extras).then((/**
|
|
258
|
-
* @return {?}
|
|
259
|
-
*/
|
|
260
|
-
() => {
|
|
261
|
-
return beforeShowPromise();
|
|
262
|
-
}));
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
step.beforeShowPromise = (/**
|
|
267
|
-
* @return {?}
|
|
268
|
-
*/
|
|
269
|
-
() => this._router.navigate([route]));
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}));
|
|
273
|
-
return routedSteps;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
CovalentGuidedTourService.decorators = [
|
|
277
|
-
{ type: Injectable }
|
|
278
|
-
];
|
|
279
|
-
/** @nocollapse */
|
|
280
|
-
CovalentGuidedTourService.ctorParameters = () => [
|
|
281
|
-
{ type: Router },
|
|
282
|
-
{ type: ActivatedRoute },
|
|
283
|
-
{ type: HttpClient }
|
|
284
|
-
];
|
|
285
|
-
if (false) {
|
|
286
|
-
/**
|
|
287
|
-
* @type {?}
|
|
288
|
-
* @private
|
|
289
|
-
*/
|
|
290
|
-
CovalentGuidedTourService.prototype._toursMap;
|
|
291
|
-
/**
|
|
292
|
-
* @type {?}
|
|
293
|
-
* @private
|
|
294
|
-
*/
|
|
295
|
-
CovalentGuidedTourService.prototype._tourStepURLs;
|
|
296
|
-
/**
|
|
297
|
-
* @type {?}
|
|
298
|
-
* @private
|
|
299
|
-
*/
|
|
300
|
-
CovalentGuidedTourService.prototype._router;
|
|
301
|
-
/**
|
|
302
|
-
* @type {?}
|
|
303
|
-
* @private
|
|
304
|
-
*/
|
|
305
|
-
CovalentGuidedTourService.prototype._route;
|
|
306
|
-
/**
|
|
307
|
-
* @type {?}
|
|
308
|
-
* @private
|
|
309
|
-
*/
|
|
310
|
-
CovalentGuidedTourService.prototype._httpClient;
|
|
311
|
-
}
|
|
312
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vZ3VpZGVkLXRvdXIvIiwic291cmNlcyI6WyJndWlkZWQtdG91ci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFDTCxNQUFNLEVBQ04sY0FBYyxFQUdkLGVBQWUsR0FFaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQTJDLE1BQU0sZUFBZSxDQUFDOzs7O0FBRTVGLGlDQUdDOzs7SUFGQyw0QkFBeUI7O0lBQ3pCLHVDQUEwQjs7Ozs7QUFHNUIscUNBS0M7OztJQUpDLGtDQUdFOzs7QUFNSixNQUFZLFVBQVU7SUFDcEIsUUFBUSxZQUFhO0lBQ3JCLE1BQU0sVUFBVztJQUNqQixJQUFJLFFBQVM7SUFDYixJQUFJLFFBQVM7SUFDYixLQUFLLFNBQVU7SUFDZixNQUFNLFVBQVc7SUFDakIsUUFBUSxZQUFhO0VBQ3RCOzs7OztBQUVELHNDQUlDOzs7SUFIQyxnQ0FBVTs7SUFDVixvQ0FBYzs7SUFDZCxnQ0FBVTs7QUFJWixNQUFNLE9BQU8seUJBQTBCLFNBQVEsa0JBQWtCOzs7Ozs7SUFHL0QsWUFBb0IsT0FBZSxFQUFVLE1BQXNCLEVBQVUsV0FBdUI7UUFDbEcsS0FBSyxFQUFFLENBQUM7UUFEVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVUsV0FBTSxHQUFOLE1B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LENBQUM7Ozs7OztJQUVPLHdCQUF3QixDQUFDLFdBQThCO1FBQzdELFdBQVcsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFxQixFQUFFLEVBQUU7WUFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFOztzQkFDVixLQUFLLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUN4QyxvRkFBb0Y7Z0JBQ3BGLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFOzswQkFDcEIsaUJBQWlCLEdBQXdCLElBQUksQ0FBQyxpQkFBaUI7b0JBQ3JFLElBQUksQ0FBQyxpQkFBaUI7OztvQkFBRyxHQUFHLEVBQUU7d0JBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUk7Ozt3QkFBQyxHQUFHLEVBQUU7NEJBQ25FLE9BQU8saUJBQWlCLEVBQUUsQ0FBQzt3QkFDN0IsQ0FBQyxFQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFBLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGlCQUFpQjs7O29CQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDO2lCQUMvRDthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOzs7WUF6SUYsVUFBVTs7OztZQTVDVCxNQUFNO1lBQ04sY0FBYztZQUhQLFVBQVU7Ozs7Ozs7SUFnRGpCLDhDQUE2RTs7Ozs7SUFDN0Usa0RBQXVFOzs7OztJQUMzRCw0Q0FBdUI7Ozs7O0lBQUUsMkNBQThCOzs7OztJQUFFLGdEQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBSb3V0ZXIsXG4gIEFjdGl2YXRlZFJvdXRlLFxuICBQYXJhbU1hcCxcbiAgTmF2aWdhdGlvbkV4dHJhcyxcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBFdmVudCBhcyBOYXZpZ2F0aW9uRXZlbnQsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgU2hlcGhlcmQgZnJvbSAnc2hlcGhlcmQuanMnO1xuaW1wb3J0IHsgdGFwLCBtYXAsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ292YWxlbnRHdWlkZWRUb3VyLCBJVG91clN0ZXAsIElUb3VyT3B0aW9ucywgVG91clN0ZXBCdXR0b24gfSBmcm9tICcuL2d1aWRlZC50b3VyJztcblxuZXhwb3J0IGludGVyZmFjZSBJR3VpZGVkVG91ciBleHRlbmRzIElUb3VyT3B0aW9ucyB7XG4gIHN0ZXBzOiBJR3VpZGVkVG91clN0ZXBbXTtcbiAgZmluaXNoQnV0dG9uVGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3VpZGVkVG91clN0ZXAgZXh0ZW5kcyBJVG91clN0ZXAge1xuICByb3V0aW5nPzoge1xuICAgIHJvdXRlOiBzdHJpbmc7XG4gICAgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcztcbiAgfTtcbn1cblxuLyoqXG4gKiAgUm91dGVyIGVuYWJsZWQgU2hlcGhlcmQgdG91clxuICovXG5leHBvcnQgZW51bSBUb3VyRXZlbnRzIHtcbiAgY29tcGxldGUgPSAnY29tcGxldGUnLFxuICBjYW5jZWwgPSAnY2FuY2VsJyxcbiAgaGlkZSA9ICdoaWRlJyxcbiAgc2hvdyA9ICdzaG93JyxcbiAgc3RhcnQgPSAnc3RhcnQnLFxuICBhY3RpdmUgPSAnYWN0aXZlJyxcbiAgaW5hY3RpdmUgPSAnaW5hY3RpdmUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHdWlkZWRUb3VyRXZlbnQge1xuICBzdGVwOiBhbnk7XG4gIHByZXZpb3VzOiBhbnk7XG4gIHRvdXI6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvdmFsZW50R3VpZGVkVG91clNlcnZpY2UgZXh0ZW5kcyBDb3ZhbGVudEd1aWRlZFRvdXIge1xuICBwcml2YXRlIF90b3Vyc01hcDogTWFwPHN0cmluZywgSUd1aWRlZFRvdXI+ID0gbmV3IE1hcDxzdHJpbmcsIElHdWlkZWRUb3VyPigpO1xuICBwcml2YXRlIF90b3VyU3RlcFVSTHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcml2YXRlIF9odHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICBfcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQ6IE5hdmlnYXRpb25FdmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZXZlbnQubmF2aWdhdGlvblRyaWdnZXIgPT09ICdwb3BzdGF0ZScpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zaGVwaGVyZFRvdXIuaXNBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICB0b3VyRXZlbnQkKHN0cjogVG91ckV2ZW50cyk6IE9ic2VydmFibGU8SUd1aWRlZFRvdXJFdmVudD4ge1xuICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5zaGVwaGVyZFRvdXIsIHN0cik7XG4gIH1cblxuICBhc3luYyByZWdpc3RlclRvdXIodG91ck5hbWU6IHN0cmluZywgdG91cjogSUd1aWRlZFRvdXIgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBndWlkZWRUb3VyOiBJR3VpZGVkVG91ciA9IHR5cGVvZiB0b3VyID09PSAnc3RyaW5nJyA/IGF3YWl0IHRoaXMuX2xvYWRUb3VyKHRvdXIpIDogdG91cjtcbiAgICB0aGlzLl90b3Vyc01hcC5zZXQodG91ck5hbWUsIGd1aWRlZFRvdXIpO1xuICB9XG5cbiAgc3RhcnRUb3VyKHRvdXJOYW1lOiBzdHJpbmcpOiBTaGVwaGVyZC5Ub3VyIHtcbiAgICBjb25zdCBndWlkZWRUb3VyOiBJR3VpZGVkVG91ciA9IHRoaXMuX2dldFRvdXIodG91ck5hbWUpO1xuICAgIHRoaXMuZmluaXNoKCk7XG4gICAgaWYgKGd1aWRlZFRvdXIgJiYgZ3VpZGVkVG91ci5zdGVwcyAmJiBndWlkZWRUb3VyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgLy8gcmVtb3ZlIHN0ZXBzIGZyb20gdG91ciBzaW5jZSB3ZSBuZWVkIHRvIHByZXByb2Nlc3MgdGhlbSBmaXJzdFxuICAgICAgdGhpcy5uZXdUb3VyKE9iamVjdC5hc3NpZ24oe30sIGd1aWRlZFRvdXIsIHsgc3RlcHM6IHVuZGVmaW5lZCB9KSk7XG4gICAgICBjb25zdCB0b3VySW5zdGFuY2U6IFNoZXBoZXJkLlRvdXIgPSB0aGlzLnNoZXBoZXJkVG91ci5hZGRTdGVwcyhcbiAgICAgICAgdGhpcy5fY29uZmlndXJlUm91dGVzRm9yU3RlcHModGhpcy5fcHJlcGFyZVRvdXIoZ3VpZGVkVG91ci5zdGVwcywgZ3VpZGVkVG91ci5maW5pc2hCdXR0b25UZXh0KSksXG4gICAgICApO1xuICAgICAgLy8gaW5pdCByb3V0ZSB0cmFuc2l0aW9uIGlmIHN0ZXAgVVJMIGlzIGRpZmZlcmVudCB0aGVuIHRoZSBjdXJyZW50IGxvY2F0aW9uLlxuICAgICAgdGhpcy50b3VyRXZlbnQkKFRvdXJFdmVudHMuc2hvdykuc3Vic2NyaWJlKCh0b3VyRXZlbnQ6IElHdWlkZWRUb3VyRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFVSTDogc3RyaW5nID0gdGhpcy5fcm91dGVyLnVybC5zcGxpdCgvWz8jXS8pWzBdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc3RlcDogeyBpZCwgb3B0aW9ucyB9LFxuICAgICAgICB9ID0gdG91ckV2ZW50O1xuICAgICAgICBpZiAodGhpcy5fdG91clN0ZXBVUkxzLmhhcyhpZCkpIHtcbiAgICAgICAgICBjb25zdCBzdGVwUm91dGU6IHN0cmluZyA9IHRoaXMuX3RvdXJTdGVwVVJMcy5nZXQoaWQpO1xuICAgICAgICAgIGlmIChzdGVwUm91dGUgIT09IGN1cnJlbnRVUkwpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbc3RlcFJvdXRlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucm91dGluZykge1xuICAgICAgICAgICAgdGhpcy5fdG91clN0ZXBVUkxzLnNldChpZCwgb3B0aW9ucy5yb3V0aW5nLnJvdXRlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdG91clN0ZXBVUkxzLnNldChpZCwgY3VycmVudFVSTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgIHJldHVybiB0b3VySW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYFRvdXIgJHt0b3VyTmFtZX0gZG9lcyBub3QgZXhpc3QuIFBsZWFzZSB0cnkgYW5vdGhlciB0b3VyLmApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmRzIHRoZSByaWdodCByZWdpc3RlcmVkIHRvdXIgYnkgdXNpbmcgcXVlcnlQYXJhbXNcbiAgLy8gZmluaXNoZXMgYW55IG90aGVyIHRvdXIgYW5kIHN0YXJ0cyB0aGUgbmV3IG9uZS5cbiAgaW5pdGlhbGl6ZU9uUXVlcnlQYXJhbXMocXVlcnlQYXJhbTogc3RyaW5nID0gJ3RvdXInKTogT2JzZXJ2YWJsZTxQYXJhbU1hcD4ge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZS5xdWVyeVBhcmFtTWFwLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIHRhcCgocGFyYW1zOiBQYXJhbU1hcCkgPT4ge1xuICAgICAgICBjb25zdCB0b3VyUGFyYW06IHN0cmluZyA9IHBhcmFtcy5nZXQocXVlcnlQYXJhbSk7XG4gICAgICAgIGlmICh0b3VyUGFyYW0pIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0VG91cih0b3VyUGFyYW0pO1xuICAgICAgICAgIC8vIGdldCBjdXJyZW50IHNlYXJjaCBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICAgIC8vIGRlbGV0ZSB0b3VyIHF1ZXJ5UGFyYW1cbiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKHF1ZXJ5UGFyYW0pO1xuICAgICAgICAgIC8vIGJ1aWxkIG5ldyBVUkwgc3RyaW5nIHdpdGhvdXQgaXRcbiAgICAgICAgICBsZXQgdXJsOiBzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgICAgaWYgKHNlYXJjaFBhcmFtcy50b1N0cmluZygpKSB7XG4gICAgICAgICAgICB1cmwgKz0gJz8nICsgc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHJlcGxhY2Ugc3RhdGUgaW4gaGlzdG9yeSB3aXRob3V0IHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uXG4gICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsgcGF0aDogdXJsIH0sICcnLCB1cmwpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgc2V0TmV4dEJ0bkRpc2FiaWxpdHkoc3RlcElkOiBzdHJpbmcsIGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaGVwaGVyZFRvdXIuZ2V0QnlJZChzdGVwSWQpKSB7XG4gICAgICBjb25zdCBzdGVwT3B0aW9uczogSVRvdXJTdGVwID0gKHRoaXMuc2hlcGhlcmRUb3VyLmdldEJ5SWQoc3RlcElkKSBhcyBhbnkpLm9wdGlvbnM7XG4gICAgICBzdGVwT3B0aW9ucy5idXR0b25zLmZvckVhY2goKGJ1dHRvbjogVG91clN0ZXBCdXR0b24pID0+IHtcbiAgICAgICAgaWYgKGJ1dHRvbi50ZXh0ID09PSAnY2hldnJvbl9yaWdodCcpIHtcbiAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLmdldEJ5SWQoc3RlcElkKS51cGRhdGVTdGVwT3B0aW9ucyhzdGVwT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfbG9hZFRvdXIodG91clVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBPYnNlcnZhYmxlPG9iamVjdD4gPSB0aGlzLl9odHRwQ2xpZW50LmdldCh0b3VyVXJsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChyZXN1bHRTZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzdWx0U2V0KSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRUb3VyKGtleTogc3RyaW5nKTogSUd1aWRlZFRvdXIge1xuICAgIHJldHVybiB0aGlzLl90b3Vyc01hcC5nZXQoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVJvdXRlc0ZvclN0ZXBzKHJvdXRlZFN0ZXBzOiBJR3VpZGVkVG91clN0ZXBbXSk6IElHdWlkZWRUb3VyU3RlcFtdIHtcbiAgICByb3V0ZWRTdGVwcy5mb3JFYWNoKChzdGVwOiBJR3VpZGVkVG91clN0ZXApID0+IHtcbiAgICAgIGlmIChzdGVwLnJvdXRpbmcpIHtcbiAgICAgICAgY29uc3Qgcm91dGU6IHN0cmluZyA9IHN0ZXAucm91dGluZy5yb3V0ZTtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBiZWZvcmVTaG93UHJvbWlzZSwgdGhlbiB3ZSBzYXZlIGl0IGFuZCBjYWxsIGl0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uXG4gICAgICAgIGlmIChzdGVwLmJlZm9yZVNob3dQcm9taXNlKSB7XG4gICAgICAgICAgY29uc3QgYmVmb3JlU2hvd1Byb21pc2U6ICgpID0+IFByb21pc2U8dm9pZD4gPSBzdGVwLmJlZm9yZVNob3dQcm9taXNlO1xuICAgICAgICAgIHN0ZXAuYmVmb3JlU2hvd1Byb21pc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0sIHN0ZXAucm91dGluZy5leHRyYXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlU2hvd1Byb21pc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RlcC5iZWZvcmVTaG93UHJvbWlzZSA9ICgpID0+IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbcm91dGVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvdXRlZFN0ZXBzO1xuICB9XG59XG4iXX0=
|