@worktile/planet 18.0.0 → 19.0.0-next.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 +25 -0
- package/application/ng-planet-application-ref.d.ts +2 -2
- package/application/ng-planet-application-ref.d.ts.map +1 -1
- package/application/planet-application.service.d.ts.map +1 -1
- package/fesm2022/worktile-planet.mjs +45 -36
- package/fesm2022/worktile-planet.mjs.map +1 -1
- package/package.json +3 -5
- package/esm2022/application/ng-planet-application-ref.mjs +0 -108
- package/esm2022/application/planet-application-loader.mjs +0 -459
- package/esm2022/application/planet-application-ref.mjs +0 -2
- package/esm2022/application/planet-application.service.mjs +0 -85
- package/esm2022/application/portal-application.mjs +0 -25
- package/esm2022/assets-loader.mjs +0 -304
- package/esm2022/component/planet-component-loader.mjs +0 -213
- package/esm2022/component/planet-component-outlet.mjs +0 -72
- package/esm2022/component/planet-component-types.mjs +0 -3
- package/esm2022/component/plant-component.config.mjs +0 -7
- package/esm2022/debug.mjs +0 -33
- package/esm2022/empty/empty.component.mjs +0 -17
- package/esm2022/global-event-dispatcher.mjs +0 -70
- package/esm2022/global-planet.mjs +0 -63
- package/esm2022/helpers.mjs +0 -185
- package/esm2022/inner-types.mjs +0 -2
- package/esm2022/module.mjs +0 -33
- package/esm2022/planet.class.mjs +0 -9
- package/esm2022/planet.mjs +0 -97
- package/esm2022/public-api.mjs +0 -19
- package/esm2022/router/route-redirect.mjs +0 -63
- package/esm2022/sandbox/constants.mjs +0 -7
- package/esm2022/sandbox/exec.mjs +0 -15
- package/esm2022/sandbox/index.mjs +0 -20
- package/esm2022/sandbox/proxy/patches/document.mjs +0 -12
- package/esm2022/sandbox/proxy/patches/eventListener.mjs +0 -41
- package/esm2022/sandbox/proxy/patches/index.mjs +0 -11
- package/esm2022/sandbox/proxy/patches/storage.mjs +0 -40
- package/esm2022/sandbox/proxy/patches/timer.mjs +0 -43
- package/esm2022/sandbox/proxy/proxies/common.mjs +0 -132
- package/esm2022/sandbox/proxy/proxies/document.mjs +0 -126
- package/esm2022/sandbox/proxy/proxies/window.mjs +0 -158
- package/esm2022/sandbox/proxy/proxy-sandbox.mjs +0 -49
- package/esm2022/sandbox/proxy/types.mjs +0 -2
- package/esm2022/sandbox/sandbox.mjs +0 -7
- package/esm2022/sandbox/snapshot/snapshot-sandbox.mjs +0 -12
- package/esm2022/sandbox/types.mjs +0 -2
- package/esm2022/worktile-planet.mjs +0 -5
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { shareReplay, map } from 'rxjs/operators';
|
|
4
|
-
import { coerceArray } from '../helpers';
|
|
5
|
-
import { AssetsLoader } from '../assets-loader';
|
|
6
|
-
import { getApplicationService } from '../global-planet';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common/http";
|
|
9
|
-
import * as i2 from "../assets-loader";
|
|
10
|
-
export class PlanetApplicationService {
|
|
11
|
-
constructor(http, assetsLoader) {
|
|
12
|
-
this.http = http;
|
|
13
|
-
this.assetsLoader = assetsLoader;
|
|
14
|
-
this.apps = [];
|
|
15
|
-
this.appsMap = {};
|
|
16
|
-
if (getApplicationService()) {
|
|
17
|
-
throw new Error('PlanetApplicationService has been injected in the portal, repeated injection is not allowed');
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
register(appOrApps) {
|
|
21
|
-
const apps = coerceArray(appOrApps);
|
|
22
|
-
apps.forEach(app => {
|
|
23
|
-
if (this.appsMap[app.name]) {
|
|
24
|
-
throw new Error(`${app.name} has be registered.`);
|
|
25
|
-
}
|
|
26
|
-
this.apps.push(app);
|
|
27
|
-
this.appsMap[app.name] = app;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
registerByUrl(url) {
|
|
31
|
-
const result = this.http.get(`${url}`).pipe(map(apps => {
|
|
32
|
-
if (apps && Array.isArray(apps)) {
|
|
33
|
-
this.register(apps);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
this.register(apps);
|
|
37
|
-
}
|
|
38
|
-
}), shareReplay());
|
|
39
|
-
result.subscribe();
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
unregister(name) {
|
|
43
|
-
if (this.appsMap[name]) {
|
|
44
|
-
delete this.appsMap[name];
|
|
45
|
-
this.apps = this.apps.filter(app => {
|
|
46
|
-
return app.name !== name;
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
getAppsByMatchedUrl(url) {
|
|
51
|
-
return this.getApps().filter(app => {
|
|
52
|
-
if (app.routerPathPrefix instanceof RegExp) {
|
|
53
|
-
return app.routerPathPrefix.test(url);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
return url.startsWith(app.routerPathPrefix);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
getAppByName(name) {
|
|
61
|
-
return this.appsMap[name];
|
|
62
|
-
}
|
|
63
|
-
getAppsToPreload(excludeAppNames) {
|
|
64
|
-
return this.getApps().filter(app => {
|
|
65
|
-
if (excludeAppNames) {
|
|
66
|
-
return app.preload && !excludeAppNames.includes(app.name);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return app.preload;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
getApps() {
|
|
74
|
-
return this.apps;
|
|
75
|
-
}
|
|
76
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, deps: [{ token: i1.HttpClient }, { token: i2.AssetsLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
77
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, providedIn: 'root' }); }
|
|
78
|
-
}
|
|
79
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PlanetApplicationService, decorators: [{
|
|
80
|
-
type: Injectable,
|
|
81
|
-
args: [{
|
|
82
|
-
providedIn: 'root'
|
|
83
|
-
}]
|
|
84
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.AssetsLoader }] });
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGFuZXQvc3JjL2FwcGxpY2F0aW9uL3BsYW5ldC1hcHBsaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLekQsTUFBTSxPQUFPLHdCQUF3QjtJQUtqQyxZQUFvQixJQUFnQixFQUFVLFlBQTBCO1FBQXBELFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUpoRSxTQUFJLEdBQXdCLEVBQUUsQ0FBQztRQUUvQixZQUFPLEdBQXlDLEVBQUUsQ0FBQztRQUd2RCxJQUFJLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLDZGQUE2RixDQUNoRyxDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQVMsU0FBa0U7UUFDL0UsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVc7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1AsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQXlCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsV0FBVyxFQUFFLENBQ2hCLENBQUM7UUFDRixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBbUIsR0FBVztRQUM3QyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLFlBQVksTUFBTSxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLGVBQTBCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvQixJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7OEdBMUVRLHdCQUF3QjtrSEFBeEIsd0JBQXdCLGNBRnJCLE1BQU07OzJGQUVULHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3BsYW5ldC5jbGFzcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXksIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBc3NldHNMb2FkZXIgfSBmcm9tICcuLi9hc3NldHMtbG9hZGVyJztcbmltcG9ydCB7IGdldEFwcGxpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2dsb2JhbC1wbGFuZXQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYW5ldEFwcGxpY2F0aW9uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBhcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICBwcml2YXRlIGFwcHNNYXA6IHsgW2tleTogc3RyaW5nXTogUGxhbmV0QXBwbGljYXRpb24gfSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGFzc2V0c0xvYWRlcjogQXNzZXRzTG9hZGVyKSB7XG4gICAgICAgIGlmIChnZXRBcHBsaWNhdGlvblNlcnZpY2UoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdQbGFuZXRBcHBsaWNhdGlvblNlcnZpY2UgaGFzIGJlZW4gaW5qZWN0ZWQgaW4gdGhlIHBvcnRhbCwgcmVwZWF0ZWQgaW5qZWN0aW9uIGlzIG5vdCBhbGxvd2VkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyPFRFeHRyYT4oYXBwT3JBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbjxURXh0cmE+IHwgUGxhbmV0QXBwbGljYXRpb248VEV4dHJhPltdKSB7XG4gICAgICAgIGNvbnN0IGFwcHMgPSBjb2VyY2VBcnJheShhcHBPckFwcHMpO1xuICAgICAgICBhcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFwcHNNYXBbYXBwLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FwcC5uYW1lfSBoYXMgYmUgcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICB0aGlzLmFwcHNNYXBbYXBwLm5hbWVdID0gYXBwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWdpc3RlckJ5VXJsKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaHR0cC5nZXQoYCR7dXJsfWApLnBpcGUoXG4gICAgICAgICAgICBtYXAoYXBwcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcHMgJiYgQXJyYXkuaXNBcnJheShhcHBzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGFwcHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoYXBwcyBhcyBQbGFuZXRBcHBsaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSgpXG4gICAgICAgICk7XG4gICAgICAgIHJlc3VsdC5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1bnJlZ2lzdGVyKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5hcHBzTWFwW25hbWVdKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hcHBzTWFwW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5hcHBzID0gdGhpcy5hcHBzLmZpbHRlcihhcHAgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHAubmFtZSAhPT0gbmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QXBwc0J5TWF0Y2hlZFVybDxURXh0cmEgPSB1bmtub3duPih1cmw6IHN0cmluZyk6IFBsYW5ldEFwcGxpY2F0aW9uPFRFeHRyYT5bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcHMoKS5maWx0ZXIoYXBwID0+IHtcbiAgICAgICAgICAgIGlmIChhcHAucm91dGVyUGF0aFByZWZpeCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHAucm91dGVyUGF0aFByZWZpeC50ZXN0KHVybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aChhcHAucm91dGVyUGF0aFByZWZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEFwcEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwc01hcFtuYW1lXTtcbiAgICB9XG5cbiAgICBnZXRBcHBzVG9QcmVsb2FkKGV4Y2x1ZGVBcHBOYW1lcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcHMoKS5maWx0ZXIoYXBwID0+IHtcbiAgICAgICAgICAgIGlmIChleGNsdWRlQXBwTmFtZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwLnByZWxvYWQgJiYgIWV4Y2x1ZGVBcHBOYW1lcy5pbmNsdWRlcyhhcHAubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHAucHJlbG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QXBwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwcztcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export class PlanetPortalApplication {
|
|
2
|
-
constructor() {
|
|
3
|
-
this.name = 'portal';
|
|
4
|
-
}
|
|
5
|
-
navigateByUrl(url, extras) {
|
|
6
|
-
return this.ngZone.run(() => {
|
|
7
|
-
return this.router.navigateByUrl(url, extras);
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
run(fn) {
|
|
11
|
-
return this.ngZone.run(() => {
|
|
12
|
-
return fn();
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
tick() {
|
|
16
|
-
this.applicationRef.tick();
|
|
17
|
-
}
|
|
18
|
-
getComponentFactory() {
|
|
19
|
-
return this.componentFactory;
|
|
20
|
-
}
|
|
21
|
-
registerComponentFactory(componentFactory) {
|
|
22
|
-
this.componentFactory = componentFactory;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLWFwcGxpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhbmV0L3NyYy9hcHBsaWNhdGlvbi9wb3J0YWwtYXBwbGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLHVCQUF1QjtJQUFwQztRQU9JLFNBQUksR0FBWSxRQUFRLENBQUM7SUEwQjdCLENBQUM7SUF2QkcsYUFBYSxDQUFDLEdBQXFCLEVBQUUsTUFBeUI7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsR0FBRyxDQUFJLEVBQXlCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFO1lBQzVCLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxjQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELG1CQUFtQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxnQkFBdUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciwgVXJsVHJlZSwgTmF2aWdhdGlvbkV4dHJhcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOZ1pvbmUsIEluamVjdG9yLCBBcHBsaWNhdGlvblJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxhbnRDb21wb25lbnRGYWN0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50L3BsYW5ldC1jb21wb25lbnQtdHlwZXMnO1xuaW1wb3J0IHsgR2xvYmFsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vZ2xvYmFsLWV2ZW50LWRpc3BhdGNoZXInO1xuXG5leHBvcnQgY2xhc3MgUGxhbmV0UG9ydGFsQXBwbGljYXRpb248VERhdGEgPSBhbnk+IHtcbiAgICBhcHBsaWNhdGlvblJlZj86IEFwcGxpY2F0aW9uUmVmO1xuICAgIGluamVjdG9yPzogSW5qZWN0b3I7XG4gICAgcm91dGVyPzogUm91dGVyO1xuICAgIG5nWm9uZT86IE5nWm9uZTtcbiAgICBnbG9iYWxFdmVudERpc3BhdGNoZXI/OiBHbG9iYWxFdmVudERpc3BhdGNoZXI7XG4gICAgZGF0YT86IFREYXRhO1xuICAgIG5hbWU/OiBzdHJpbmcgPSAncG9ydGFsJztcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk/OiBQbGFudENvbXBvbmVudEZhY3Rvcnk7XG5cbiAgICBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nIHwgVXJsVHJlZSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUhLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIhLm5hdmlnYXRlQnlVcmwodXJsLCBleHRyYXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBydW48VD4oZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUhLnJ1bjxUPigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGljaygpIHtcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZiEudGljaygpO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudEZhY3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZhY3Rvcnk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudEZhY3Rvcnk6IFBsYW50Q29tcG9uZW50RmFjdG9yeSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnkgPSBjb21wb25lbnRGYWN0b3J5O1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { hashCode, isEmpty, getResourceFileName, getExtName, isObject, getAssetsBasePath, getScriptsAndStylesAssets } from './helpers';
|
|
3
|
-
import { of, Observable, forkJoin, concat } from 'rxjs';
|
|
4
|
-
import { map, switchMap, concatAll } from 'rxjs/operators';
|
|
5
|
-
import { HttpClient } from '@angular/common/http';
|
|
6
|
-
import { createSandbox } from './sandbox';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common/http";
|
|
9
|
-
const STYLE_LINK_OR_SCRIPT_REG = /<[script|link].*?>/gi;
|
|
10
|
-
const LINK_OR_SRC_REG = /(src|href)=["'](.*?[\.js|\.css])["']/i;
|
|
11
|
-
const TAG_ATTRS_REG = /(type|defer|async)((=["'].*?["'])|\s|\>)/gi;
|
|
12
|
-
export class AssetsLoader {
|
|
13
|
-
constructor(http) {
|
|
14
|
-
this.http = http;
|
|
15
|
-
this.loadedSources = [];
|
|
16
|
-
}
|
|
17
|
-
loadScript(src, tagAttributes) {
|
|
18
|
-
const id = hashCode(src);
|
|
19
|
-
if (this.loadedSources.includes(id)) {
|
|
20
|
-
return of({
|
|
21
|
-
src: src,
|
|
22
|
-
hashCode: id,
|
|
23
|
-
loaded: true,
|
|
24
|
-
status: 'Loaded'
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
return new Observable((observer) => {
|
|
28
|
-
const script = document.createElement('script');
|
|
29
|
-
script.type = tagAttributes?.type || 'text/javascript';
|
|
30
|
-
script.src = src;
|
|
31
|
-
if (!tagAttributes?.defer || tagAttributes?.defer !== 'false') {
|
|
32
|
-
script.defer = true;
|
|
33
|
-
}
|
|
34
|
-
if (!tagAttributes?.async && tagAttributes?.async === 'false') {
|
|
35
|
-
script.async = true;
|
|
36
|
-
}
|
|
37
|
-
if (script['readyState']) {
|
|
38
|
-
// IE
|
|
39
|
-
script['onreadystatechange'] = () => {
|
|
40
|
-
if (script['readyState'] === 'loaded' || script['readyState'] === 'complete') {
|
|
41
|
-
script['onreadystatechange'] = null;
|
|
42
|
-
observer.next({
|
|
43
|
-
src: src,
|
|
44
|
-
hashCode: id,
|
|
45
|
-
loaded: true,
|
|
46
|
-
status: 'Loaded'
|
|
47
|
-
});
|
|
48
|
-
observer.complete();
|
|
49
|
-
this.loadedSources.push(id);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
// Others
|
|
55
|
-
script.onload = () => {
|
|
56
|
-
observer.next({
|
|
57
|
-
src: src,
|
|
58
|
-
hashCode: id,
|
|
59
|
-
loaded: true,
|
|
60
|
-
status: 'Loaded'
|
|
61
|
-
});
|
|
62
|
-
observer.complete();
|
|
63
|
-
this.loadedSources.push(id);
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
script.onerror = error => {
|
|
67
|
-
observer.error({
|
|
68
|
-
src: src,
|
|
69
|
-
hashCode: id,
|
|
70
|
-
loaded: false,
|
|
71
|
-
status: 'Error',
|
|
72
|
-
error: error
|
|
73
|
-
});
|
|
74
|
-
observer.complete();
|
|
75
|
-
};
|
|
76
|
-
document.body.appendChild(script);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
loadScriptWithSandbox(app, src) {
|
|
80
|
-
const id = hashCode(src);
|
|
81
|
-
if (this.loadedSources.includes(id)) {
|
|
82
|
-
return of({
|
|
83
|
-
src: src,
|
|
84
|
-
hashCode: id,
|
|
85
|
-
loaded: true,
|
|
86
|
-
status: 'Loaded'
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return new Observable((observer) => {
|
|
90
|
-
this.http.get(src, { responseType: 'text' }).subscribe((code) => {
|
|
91
|
-
this.loadedSources.push(id);
|
|
92
|
-
const sandbox = createSandbox(app);
|
|
93
|
-
sandbox.execScript(code, src);
|
|
94
|
-
observer.next({
|
|
95
|
-
src: src,
|
|
96
|
-
hashCode: id,
|
|
97
|
-
loaded: true,
|
|
98
|
-
status: 'Loaded'
|
|
99
|
-
});
|
|
100
|
-
observer.complete();
|
|
101
|
-
}, error => {
|
|
102
|
-
observer.error({
|
|
103
|
-
src: src,
|
|
104
|
-
hashCode: id,
|
|
105
|
-
loaded: false,
|
|
106
|
-
status: 'Error',
|
|
107
|
-
error: error
|
|
108
|
-
});
|
|
109
|
-
observer.complete();
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
loadStyle(src) {
|
|
114
|
-
const id = hashCode(src);
|
|
115
|
-
if (this.loadedSources.includes(id)) {
|
|
116
|
-
return of({
|
|
117
|
-
src: src,
|
|
118
|
-
hashCode: id,
|
|
119
|
-
loaded: true,
|
|
120
|
-
status: 'Loaded'
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
return new Observable((observer) => {
|
|
124
|
-
const head = document.getElementsByTagName('head')[0];
|
|
125
|
-
const link = document.createElement('link');
|
|
126
|
-
link.rel = 'stylesheet';
|
|
127
|
-
link.type = 'text/css';
|
|
128
|
-
link.href = src;
|
|
129
|
-
link.media = 'all';
|
|
130
|
-
link.onload = () => {
|
|
131
|
-
observer.next({
|
|
132
|
-
src: src,
|
|
133
|
-
hashCode: id,
|
|
134
|
-
loaded: true,
|
|
135
|
-
status: 'Loaded'
|
|
136
|
-
});
|
|
137
|
-
observer.complete();
|
|
138
|
-
this.loadedSources.push(id);
|
|
139
|
-
};
|
|
140
|
-
link.onerror = error => {
|
|
141
|
-
observer.error({
|
|
142
|
-
src: src,
|
|
143
|
-
hashCode: id,
|
|
144
|
-
loaded: true,
|
|
145
|
-
status: 'Loaded',
|
|
146
|
-
error: error
|
|
147
|
-
});
|
|
148
|
-
observer.complete();
|
|
149
|
-
};
|
|
150
|
-
head.appendChild(link);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
loadScripts(sources, options = {
|
|
154
|
-
serial: false,
|
|
155
|
-
sandbox: false
|
|
156
|
-
}) {
|
|
157
|
-
if (isEmpty(sources)) {
|
|
158
|
-
return of(null);
|
|
159
|
-
}
|
|
160
|
-
const observables = sources.map(source => {
|
|
161
|
-
// TODO: 暂时只支持Proxy沙箱
|
|
162
|
-
if (options.sandbox && window.Proxy) {
|
|
163
|
-
return this.loadScriptWithSandbox(options.app, source.src);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
return this.loadScript(source.src, source.attributes);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
if (options.serial) {
|
|
170
|
-
const a = concat(...observables).pipe(map(item => {
|
|
171
|
-
return of([item]);
|
|
172
|
-
}), concatAll());
|
|
173
|
-
return a;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
return forkJoin(observables).pipe();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
loadStyles(sources) {
|
|
180
|
-
if (isEmpty(sources)) {
|
|
181
|
-
return of(null);
|
|
182
|
-
}
|
|
183
|
-
return forkJoin(sources.map(source => {
|
|
184
|
-
return this.loadStyle(source.src);
|
|
185
|
-
}));
|
|
186
|
-
}
|
|
187
|
-
loadScriptsAndStyles(scripts = [], styles = [], options) {
|
|
188
|
-
return forkJoin([this.loadScripts(scripts, options), this.loadStyles(styles)]);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* <script type="module" src="http://127.0.0.1:3001/main.js" async defer></script>
|
|
192
|
-
* => [`type="module"`, "async ", "defer>"] as attributeStrMatchArr
|
|
193
|
-
* => { type: "module", async: "async", defer: "defer" } as attributes
|
|
194
|
-
*/
|
|
195
|
-
parseTagAttributes(tag) {
|
|
196
|
-
const attributeStrMatchArr = tag.match(TAG_ATTRS_REG);
|
|
197
|
-
if (attributeStrMatchArr) {
|
|
198
|
-
const attributes = {};
|
|
199
|
-
attributeStrMatchArr.forEach(item => {
|
|
200
|
-
const equalSignIndex = item.indexOf('=');
|
|
201
|
-
if (equalSignIndex > 0) {
|
|
202
|
-
// 'type="module"' => { type: "module" }
|
|
203
|
-
const key = item.slice(0, equalSignIndex);
|
|
204
|
-
attributes[key] = item.slice(equalSignIndex + 2, item.length - 1);
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
// 'async ' => 'async'
|
|
208
|
-
// 'defer>' => 'defer'
|
|
209
|
-
const key = item.slice(0, item.length - 1);
|
|
210
|
-
attributes[key] = key;
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
return attributes;
|
|
214
|
-
}
|
|
215
|
-
return undefined;
|
|
216
|
-
}
|
|
217
|
-
parseManifestFromHTML(html) {
|
|
218
|
-
const result = {};
|
|
219
|
-
const matchResult = html.match(STYLE_LINK_OR_SCRIPT_REG);
|
|
220
|
-
matchResult.forEach(item => {
|
|
221
|
-
const linkOrSrcResult = item.match(LINK_OR_SRC_REG);
|
|
222
|
-
if (linkOrSrcResult && linkOrSrcResult[2]) {
|
|
223
|
-
const src = linkOrSrcResult[2];
|
|
224
|
-
const hashName = getResourceFileName(src);
|
|
225
|
-
let barSplitIndex = hashName.indexOf('-');
|
|
226
|
-
let dotSplitIndex = hashName.indexOf('.');
|
|
227
|
-
const splitIndex = barSplitIndex > -1 ? barSplitIndex : dotSplitIndex;
|
|
228
|
-
if (splitIndex > -1) {
|
|
229
|
-
const name = hashName.slice(0, splitIndex);
|
|
230
|
-
const ext = getExtName(hashName);
|
|
231
|
-
const assetsTag = {
|
|
232
|
-
src: src
|
|
233
|
-
};
|
|
234
|
-
result[ext ? `${name}.${ext}` : name] = assetsTag;
|
|
235
|
-
const attributes = this.parseTagAttributes(item);
|
|
236
|
-
if (attributes) {
|
|
237
|
-
assetsTag.attributes = attributes;
|
|
238
|
-
}
|
|
239
|
-
// const typeTagResult = item.match(TAG_TYPE_REG);
|
|
240
|
-
// if (typeTagResult && typeTagResult[1]) {
|
|
241
|
-
// assetsTag.attributes = {
|
|
242
|
-
// type: typeTagResult[1]
|
|
243
|
-
// };
|
|
244
|
-
// }
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
return result;
|
|
249
|
-
}
|
|
250
|
-
loadAppAssets(app) {
|
|
251
|
-
const basePath = getAssetsBasePath(app);
|
|
252
|
-
const manifest = app.entry ? (isObject(app.entry) ? app.entry.manifest : app.entry) : app.manifest;
|
|
253
|
-
if (manifest) {
|
|
254
|
-
const manifestExt = getExtName(manifest);
|
|
255
|
-
const isHtml = manifestExt === 'html';
|
|
256
|
-
const responseType = isHtml ? 'text' : 'json';
|
|
257
|
-
return this.loadManifest(`${manifest}?t=${new Date().getTime()}`, responseType).pipe(switchMap(manifestResult => {
|
|
258
|
-
const { scripts, styles } = getScriptsAndStylesAssets(app, basePath, manifestResult);
|
|
259
|
-
return this.loadScriptsAndStyles(scripts, styles, {
|
|
260
|
-
app: app.name,
|
|
261
|
-
sandbox: app.sandbox,
|
|
262
|
-
serial: app.loadSerial
|
|
263
|
-
});
|
|
264
|
-
}));
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
const { scripts, styles } = getScriptsAndStylesAssets(app, basePath);
|
|
268
|
-
return this.loadScriptsAndStyles(scripts, styles, {
|
|
269
|
-
app: app.name,
|
|
270
|
-
sandbox: app.sandbox,
|
|
271
|
-
serial: app.loadSerial
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
loadManifest(url, responseType = 'json') {
|
|
276
|
-
return this.http
|
|
277
|
-
.get(url, {
|
|
278
|
-
responseType: responseType
|
|
279
|
-
})
|
|
280
|
-
.pipe(map((response) => {
|
|
281
|
-
if (responseType === 'text') {
|
|
282
|
-
return this.parseManifestFromHTML(response);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
const result = {};
|
|
286
|
-
Object.keys(response).forEach(key => {
|
|
287
|
-
result[key] = {
|
|
288
|
-
src: response[key]
|
|
289
|
-
};
|
|
290
|
-
});
|
|
291
|
-
return result;
|
|
292
|
-
}
|
|
293
|
-
}));
|
|
294
|
-
}
|
|
295
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
296
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, providedIn: 'root' }); }
|
|
297
|
-
}
|
|
298
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: AssetsLoader, decorators: [{
|
|
299
|
-
type: Injectable,
|
|
300
|
-
args: [{
|
|
301
|
-
providedIn: 'root'
|
|
302
|
-
}]
|
|
303
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
304
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldC9zcmMvYXNzZXRzLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkksT0FBTyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBRzFDLE1BQU0sd0JBQXdCLEdBQUcsc0JBQXNCLENBQUM7QUFDeEQsTUFBTSxlQUFlLEdBQUcsdUNBQXVDLENBQUM7QUFDaEUsTUFBTSxhQUFhLEdBQUcsNENBQTRDLENBQUM7QUFZbkUsTUFBTSxPQUFPLFlBQVk7SUFHckIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUY1QixrQkFBYSxHQUFhLEVBQUUsQ0FBQztJQUVFLENBQUM7SUFFeEMsVUFBVSxDQUFDLEdBQVcsRUFBRSxhQUFtQztRQUN2RCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxHQUFHO2dCQUNSLFFBQVEs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QUksQ0FBQyxJQUFJO2FBQ1gsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLFlBQVksRUFBRSxZQUFzQjtTQUN2QyxDQUFDO2FBQ0QsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ2xCLElBQUksWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFrQixDQUFDLENBQUM7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sTUFBTSxHQUFrQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUc7d0JBQ1YsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7cUJBQ3JCLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDVixDQUFDOzhHQXpUUSxZQUFZO2tIQUFaLFlBQVksY0FGVCxNQUFNOzsyRkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGhhc2hDb2RlLCBpc0VtcHR5LCBnZXRSZXNvdXJjZUZpbGVOYW1lLCBnZXRFeHROYW1lLCBpc09iamVjdCwgZ2V0QXNzZXRzQmFzZVBhdGgsIGdldFNjcmlwdHNBbmRTdHlsZXNBc3NldHMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgb2YsIE9ic2VydmFibGUsIE9ic2VydmVyLCBmb3JrSm9pbiwgY29uY2F0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgY29uY2F0QWxsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFBsYW5ldEFwcGxpY2F0aW9uLCBQbGFuZXRBcHBsaWNhdGlvbkVudHJ5IH0gZnJvbSAnLi9wbGFuZXQuY2xhc3MnO1xuaW1wb3J0IHsgY3JlYXRlU2FuZGJveCB9IGZyb20gJy4vc2FuZGJveCc7XG5pbXBvcnQgeyBBc3NldHNUYWdJdGVtLCBTY3JpcHRUYWdBdHRyaWJ1dGVzIH0gZnJvbSAnLi9pbm5lci10eXBlcyc7XG5cbmNvbnN0IFNUWUxFX0xJTktfT1JfU0NSSVBUX1JFRyA9IC88W3NjcmlwdHxsaW5rXS4qPz4vZ2k7XG5jb25zdCBMSU5LX09SX1NSQ19SRUcgPSAvKHNyY3xocmVmKT1bXCInXSguKj9bXFwuanN8XFwuY3NzXSlbXCInXS9pO1xuY29uc3QgVEFHX0FUVFJTX1JFRyA9IC8odHlwZXxkZWZlcnxhc3luYykoKD1bXCInXS4qP1tcIiddKXxcXHN8XFw+KS9naTtcblxuZXhwb3J0IGludGVyZmFjZSBBc3NldHNMb2FkUmVzdWx0IHtcbiAgICBzcmM6IHN0cmluZztcbiAgICBoYXNoQ29kZTogbnVtYmVyO1xuICAgIGxvYWRlZDogYm9vbGVhbjtcbiAgICBzdGF0dXM6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBc3NldHNMb2FkZXIge1xuICAgIHByaXZhdGUgbG9hZGVkU291cmNlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICAgIGxvYWRTY3JpcHQoc3JjOiBzdHJpbmcsIHRhZ0F0dHJpYnV0ZXM/OiBTY3JpcHRUYWdBdHRyaWJ1dGVzKTogT2JzZXJ2YWJsZTxBc3NldHNMb2FkUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGlkID0gaGFzaENvZGUoc3JjKTtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkU291cmNlcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxBc3NldHNMb2FkUmVzdWx0PikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSB0YWdBdHRyaWJ1dGVzPy50eXBlIHx8ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHNyYztcbiAgICAgICAgICAgIGlmICghdGFnQXR0cmlidXRlcz8uZGVmZXIgfHwgdGFnQXR0cmlidXRlcz8uZGVmZXIgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHQuZGVmZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0YWdBdHRyaWJ1dGVzPy5hc3luYyAmJiB0YWdBdHRyaWJ1dGVzPy5hc3luYyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NyaXB0WydyZWFkeVN0YXRlJ10pIHtcbiAgICAgICAgICAgICAgICAvLyBJRVxuICAgICAgICAgICAgICAgIHNjcmlwdFsnb25yZWFkeXN0YXRlY2hhbmdlJ10gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRbJ3JlYWR5U3RhdGUnXSA9PT0gJ2xvYWRlZCcgfHwgc2NyaXB0WydyZWFkeVN0YXRlJ10gPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFsnb25yZWFkeXN0YXRlY2hhbmdlJ10gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdMb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFNvdXJjZXMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcnNcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRTb3VyY2VzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY3JpcHQub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRTY3JpcHRXaXRoU2FuZGJveChhcHA6IHN0cmluZywgc3JjOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFzc2V0c0xvYWRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBoYXNoQ29kZShzcmMpO1xuICAgICAgICBpZiAodGhpcy5sb2FkZWRTb3VyY2VzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0xvYWRlZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPEFzc2V0c0xvYWRSZXN1bHQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0KHNyYywgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFNvdXJjZXMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbmRib3ggPSBjcmVhdGVTYW5kYm94KGFwcCk7XG4gICAgICAgICAgICAgICAgICAgIHNhbmRib3guZXhlY1NjcmlwdChjb2RlLCBzcmMpO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRTdHlsZShzcmM6IHN0cmluZyk6IE9ic2VydmFibGU8QXNzZXRzTG9hZFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBpZCA9IGhhc2hDb2RlKHNyYyk7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFNvdXJjZXMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZCxcbiAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnTG9hZGVkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8QXNzZXRzTG9hZFJlc3VsdD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICAgICAgbGluay50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHNyYztcbiAgICAgICAgICAgIGxpbmsubWVkaWEgPSAnYWxsJztcbiAgICAgICAgICAgIGxpbmsub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ0xvYWRlZCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkU291cmNlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsaW5rLm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6IGlkLFxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ0xvYWRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZFNjcmlwdHMoXG4gICAgICAgIHNvdXJjZXM6IEFzc2V0c1RhZ0l0ZW1bXSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYXBwPzogc3RyaW5nO1xuICAgICAgICAgICAgc2FuZGJveD86IGJvb2xlYW47XG4gICAgICAgICAgICBzZXJpYWw/OiBib29sZWFuO1xuICAgICAgICB9ID0ge1xuICAgICAgICAgICAgc2VyaWFsOiBmYWxzZSxcbiAgICAgICAgICAgIHNhbmRib3g6IGZhbHNlXG4gICAgICAgIH1cbiAgICApOiBPYnNlcnZhYmxlPEFzc2V0c0xvYWRSZXN1bHRbXT4ge1xuICAgICAgICBpZiAoaXNFbXB0eShzb3VyY2VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ic2VydmFibGVzID0gc291cmNlcy5tYXAoc291cmNlID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IOaaguaXtuWPquaUr+aMgVByb3h55rKZ566xXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zYW5kYm94ICYmIHdpbmRvdy5Qcm94eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRTY3JpcHRXaXRoU2FuZGJveChvcHRpb25zLmFwcCwgc291cmNlLnNyYyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRTY3JpcHQoc291cmNlLnNyYywgc291cmNlLmF0dHJpYnV0ZXMgYXMgU2NyaXB0VGFnQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3B0aW9ucy5zZXJpYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjb25jYXQoLi4ub2JzZXJ2YWJsZXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoW2l0ZW1dKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjb25jYXRBbGwoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzKS5waXBlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkU3R5bGVzKHNvdXJjZXM6IEFzc2V0c1RhZ0l0ZW1bXSk6IE9ic2VydmFibGU8QXNzZXRzTG9hZFJlc3VsdFtdPiB7XG4gICAgICAgIGlmIChpc0VtcHR5KHNvdXJjZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxuICAgICAgICAgICAgc291cmNlcy5tYXAoc291cmNlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkU3R5bGUoc291cmNlLnNyYyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxvYWRTY3JpcHRzQW5kU3R5bGVzKFxuICAgICAgICBzY3JpcHRzOiBBc3NldHNUYWdJdGVtW10gPSBbXSxcbiAgICAgICAgc3R5bGVzOiBBc3NldHNUYWdJdGVtW10gPSBbXSxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGFwcD86IHN0cmluZztcbiAgICAgICAgICAgIHNhbmRib3g/OiBib29sZWFuO1xuICAgICAgICAgICAgc2VyaWFsPzogYm9vbGVhbjtcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oW3RoaXMubG9hZFNjcmlwdHMoc2NyaXB0cywgb3B0aW9ucyksIHRoaXMubG9hZFN0eWxlcyhzdHlsZXMpXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCIgc3JjPVwiaHR0cDovLzEyNy4wLjAuMTozMDAxL21haW4uanNcIiBhc3luYyBkZWZlcj48L3NjcmlwdD5cbiAgICAgKiA9PiBbYHR5cGU9XCJtb2R1bGVcImAsIFwiYXN5bmMgXCIsIFwiZGVmZXI+XCJdIGFzIGF0dHJpYnV0ZVN0ck1hdGNoQXJyXG4gICAgICogPT4geyB0eXBlOiBcIm1vZHVsZVwiLCBhc3luYzogXCJhc3luY1wiLCBkZWZlcjogXCJkZWZlclwiIH0gYXMgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBhcnNlVGFnQXR0cmlidXRlcyh0YWc6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVTdHJNYXRjaEFyciA9IHRhZy5tYXRjaChUQUdfQVRUUlNfUkVHKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVN0ck1hdGNoQXJyKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBhdHRyaWJ1dGVTdHJNYXRjaEFyci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVxdWFsU2lnbkluZGV4ID0gaXRlbS5pbmRleE9mKCc9Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGVxdWFsU2lnbkluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAndHlwZT1cIm1vZHVsZVwiJyA9PiB7IHR5cGU6IFwibW9kdWxlXCIgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBpdGVtLnNsaWNlKDAsIGVxdWFsU2lnbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gaXRlbS5zbGljZShlcXVhbFNpZ25JbmRleCArIDIsIGl0ZW0ubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJ2FzeW5jICcgPT4gJ2FzeW5jJ1xuICAgICAgICAgICAgICAgICAgICAvLyAnZGVmZXI+JyA9PiAnZGVmZXInXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGl0ZW0uc2xpY2UoMCwgaXRlbS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwYXJzZU1hbmlmZXN0RnJvbUhUTUwoaHRtbDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQXNzZXRzVGFnSXRlbT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFzc2V0c1RhZ0l0ZW0+ID0ge307XG4gICAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gaHRtbC5tYXRjaChTVFlMRV9MSU5LX09SX1NDUklQVF9SRUcpO1xuICAgICAgICBtYXRjaFJlc3VsdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlua09yU3JjUmVzdWx0ID0gaXRlbS5tYXRjaChMSU5LX09SX1NSQ19SRUcpO1xuICAgICAgICAgICAgaWYgKGxpbmtPclNyY1Jlc3VsdCAmJiBsaW5rT3JTcmNSZXN1bHRbMl0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBsaW5rT3JTcmNSZXN1bHRbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzaE5hbWUgPSBnZXRSZXNvdXJjZUZpbGVOYW1lKHNyYyk7XG4gICAgICAgICAgICAgICAgbGV0IGJhclNwbGl0SW5kZXggPSBoYXNoTmFtZS5pbmRleE9mKCctJyk7XG4gICAgICAgICAgICAgICAgbGV0IGRvdFNwbGl0SW5kZXggPSBoYXNoTmFtZS5pbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IGJhclNwbGl0SW5kZXggPiAtMSA/IGJhclNwbGl0SW5kZXggOiBkb3RTcGxpdEluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhhc2hOYW1lLnNsaWNlKDAsIHNwbGl0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHQgPSBnZXRFeHROYW1lKGhhc2hOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXRzVGFnOiBBc3NldHNUYWdJdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4dCA/IGAke25hbWV9LiR7ZXh0fWAgOiBuYW1lXSA9IGFzc2V0c1RhZztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZVRhZ0F0dHJpYnV0ZXMoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NldHNUYWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgdHlwZVRhZ1Jlc3VsdCA9IGl0ZW0ubWF0Y2goVEFHX1RZUEVfUkVHKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVUYWdSZXN1bHQgJiYgdHlwZVRhZ1Jlc3VsdFsxXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYXNzZXRzVGFnLmF0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHlwZTogdHlwZVRhZ1Jlc3VsdFsxXVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbG9hZEFwcEFzc2V0cyhhcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gZ2V0QXNzZXRzQmFzZVBhdGgoYXBwKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBhcHAuZW50cnkgPyAoaXNPYmplY3Q8UGxhbmV0QXBwbGljYXRpb25FbnRyeT4oYXBwLmVudHJ5KSA/IGFwcC5lbnRyeS5tYW5pZmVzdCA6IGFwcC5lbnRyeSkgOiBhcHAubWFuaWZlc3Q7XG4gICAgICAgIGlmIChtYW5pZmVzdCkge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RFeHQgPSBnZXRFeHROYW1lKG1hbmlmZXN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzSHRtbCA9IG1hbmlmZXN0RXh0ID09PSAnaHRtbCc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSBpc0h0bWwgPyAndGV4dCcgOiAnanNvbic7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoYCR7bWFuaWZlc3R9P3Q9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLCByZXNwb25zZVR5cGUpLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKG1hbmlmZXN0UmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzY3JpcHRzLCBzdHlsZXMgfSA9IGdldFNjcmlwdHNBbmRTdHlsZXNBc3NldHMoYXBwLCBiYXNlUGF0aCwgbWFuaWZlc3RSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkU2NyaXB0c0FuZFN0eWxlcyhzY3JpcHRzLCBzdHlsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW5kYm94OiBhcHAuc2FuZGJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbDogYXBwLmxvYWRTZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcmlwdHMsIHN0eWxlcyB9ID0gZ2V0U2NyaXB0c0FuZFN0eWxlc0Fzc2V0cyhhcHAsIGJhc2VQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRTY3JpcHRzQW5kU3R5bGVzKHNjcmlwdHMsIHN0eWxlcywge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLm5hbWUsXG4gICAgICAgICAgICAgICAgc2FuZGJveDogYXBwLnNhbmRib3gsXG4gICAgICAgICAgICAgICAgc2VyaWFsOiBhcHAubG9hZFNlcmlhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkTWFuaWZlc3QodXJsOiBzdHJpbmcsIHJlc3BvbnNlVHlwZTogJ3RleHQnIHwgJ2pzb24nID0gJ2pzb24nKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBBc3NldHNUYWdJdGVtPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAuZ2V0KHVybCwge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogcmVzcG9uc2VUeXBlIGFzICdqc29uJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTWFuaWZlc3RGcm9tSFRNTChyZXNwb25zZSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBc3NldHNUYWdJdGVtPiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzcG9uc2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiByZXNwb25zZVtrZXldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|