@pepperi-addons/ngx-lib 0.4.2-beta.321 → 0.4.2-beta.323

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.
Files changed (26) hide show
  1. package/core/common/services/addon.service.d.ts +3 -0
  2. package/esm2020/core/common/services/addon.service.mjs +58 -13
  3. package/esm2020/core/common/services/utilities.service.mjs +8 -13
  4. package/esm2020/group-buttons/group-buttons.component.mjs +19 -6
  5. package/esm2020/list/list.component.mjs +23 -6
  6. package/esm2020/remote-loader/remote-loader-element.component.mjs +57 -1
  7. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +18 -5
  8. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -1
  9. package/fesm2015/pepperi-addons-ngx-lib-list.mjs +23 -5
  10. package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -1
  11. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +61 -5
  12. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -1
  13. package/fesm2015/pepperi-addons-ngx-lib.mjs +65 -24
  14. package/fesm2015/pepperi-addons-ngx-lib.mjs.map +1 -1
  15. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +18 -5
  16. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -1
  17. package/fesm2020/pepperi-addons-ngx-lib-list.mjs +22 -5
  18. package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -1
  19. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +56 -1
  20. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -1
  21. package/fesm2020/pepperi-addons-ngx-lib.mjs +64 -24
  22. package/fesm2020/pepperi-addons-ngx-lib.mjs.map +1 -1
  23. package/group-buttons/group-buttons.component.d.ts +4 -2
  24. package/list/list.component.d.ts +5 -0
  25. package/package.json +1 -1
  26. package/remote-loader/remote-loader-element.component.d.ts +1 -0
@@ -45,6 +45,9 @@ export declare class PepAddonService {
45
45
  }): void;
46
46
  defineCustomElement(elementName: string, component: Type<any>, injector: Injector): void;
47
47
  connectInternalRouter(elementName: string): void;
48
+ disconnectInternalRouter(elementName: string): void;
49
+ private static _routerConnections;
50
+ static stripBaseHref(path: string): string;
48
51
  private connectRouter;
49
52
  static createMultiTranslateLoader(addonUUID: string, addonService: PepAddonService, libsName?: string[]): import("ngx-translate-multi-http-loader").MultiTranslateHttpLoader;
50
53
  static ɵfac: i0.ɵɵFactoryDeclaration<PepAddonService, [null, null, null, null, null, { optional: true; }, { optional: true; }]>;
@@ -165,7 +165,11 @@ export class PepAddonService {
165
165
  PepAddonService._customElementsMap.set(elementName, { injector: injector });
166
166
  }
167
167
  }
168
- // Fix internal routing bug.
168
+ // Fix internal routing bug. Callable repeatedly (once at mount, then again whenever the
169
+ // shell's own route changes while the same addon element instance stays mounted — e.g. a
170
+ // settings_block child segment change) — see PepRemoteLoaderElementComponent's route
171
+ // subscription, since without a repeat call the addon's own internal router is only ever
172
+ // told the location once, at initial mount.
169
173
  connectInternalRouter(elementName) {
170
174
  const customElementObject = PepAddonService._customElementsMap.get(elementName);
171
175
  let router = customElementObject?.injector.get(Router);
@@ -176,24 +180,60 @@ export class PepAddonService {
176
180
  }
177
181
  if (router) {
178
182
  const useHash = location.href.includes('#');
179
- this.connectRouter(router, useHash);
183
+ this.connectRouter(elementName, router, useHash);
180
184
  }
181
185
  }
182
- connectRouter(router, useHash = false) {
183
- let url;
186
+ // Removes the popstate/hashchange listener connectRouter() registered for this element —
187
+ // call from the hosting component's ngOnDestroy so a destroyed addon instance doesn't keep
188
+ // reacting to browser navigation.
189
+ disconnectInternalRouter(elementName) {
190
+ const existing = PepAddonService._routerConnections.get(elementName);
191
+ if (!existing)
192
+ return;
193
+ window.removeEventListener(existing.eventName, existing.listener);
194
+ PepAddonService._routerConnections.delete(elementName);
195
+ }
196
+ // Strips this app's own base href prefix (e.g. dev-only /angular — see angular.json's
197
+ // baseHref/servePath) from a path, so it can be handed to code that expects a path
198
+ // relative to real root — an addon's own internal router (connectRouter below), or a
199
+ // remote's one-time bootstrap-time location read (see PepRemoteLoaderElementComponent).
200
+ static stripBaseHref(path) {
201
+ const basePath = document.querySelector('base')?.getAttribute('href') || '/';
202
+ if (basePath === '/')
203
+ return path;
204
+ const normalizedBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
205
+ const prefixRe = new RegExp(`^${normalizedBase}(?=/|$)`);
206
+ return prefixRe.test(path) ? (path.replace(prefixRe, '') || '/') : path;
207
+ }
208
+ connectRouter(elementName, router, useHash = false) {
209
+ // This app may be served under its own base href (e.g. dev-only /angular — see
210
+ // angular.json's baseHref/servePath) — strip it before handing the path to the addon's
211
+ // OWN internal router, which expects a path relative to ITS OWN root, not this shell's.
212
+ const stripBase = PepAddonService.stripBaseHref;
213
+ const existing = PepAddonService._routerConnections.get(elementName);
184
214
  if (!useHash) {
185
- url = `${location.pathname.substr(1)}${location.search}`;
215
+ const url = `${stripBase(location.pathname).replace(/^\//, '')}${location.search}`;
186
216
  router.navigateByUrl(url);
187
- window.addEventListener('popstate', () => {
188
- router.navigateByUrl(url);
189
- });
217
+ if (existing) {
218
+ existing.url = url;
219
+ }
220
+ else {
221
+ const connection = { url, eventName: 'popstate', listener: () => router.navigateByUrl(connection.url) };
222
+ window.addEventListener('popstate', connection.listener);
223
+ PepAddonService._routerConnections.set(elementName, connection);
224
+ }
190
225
  }
191
226
  else {
192
- url = `${location.hash.substr(1)}${location.search}`;
227
+ const url = `${stripBase(location.hash.replace(/^#/, '')).replace(/^\//, '')}${location.search}`;
193
228
  router.navigateByUrl(url);
194
- window.addEventListener('hashchange', () => {
195
- router.navigateByUrl(url);
196
- });
229
+ if (existing) {
230
+ existing.url = url;
231
+ }
232
+ else {
233
+ const connection = { url, eventName: 'hashchange', listener: () => router.navigateByUrl(connection.url) };
234
+ window.addEventListener('hashchange', connection.listener);
235
+ PepAddonService._routerConnections.set(elementName, connection);
236
+ }
197
237
  }
198
238
  }
199
239
  static createMultiTranslateLoader(addonUUID, addonService, libsName = ['ngx-lib']) {
@@ -212,6 +252,11 @@ export class PepAddonService {
212
252
  }
213
253
  }
214
254
  PepAddonService._customElementsMap = new Map();
255
+ // Tracks, per addon element, the popstate/hashchange listener already registered by a
256
+ // previous connectRouter() call (and the mutable "current url" it reads), so a repeat call
257
+ // updates that same listener's target instead of piling up a new, independently-stale one on
258
+ // every navigation.
259
+ PepAddonService._routerConnections = new Map();
215
260
  PepAddonService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepAddonService, deps: [{ token: i1.PepSessionService }, { token: i2.PepHttpService }, { token: i3.PepLoaderService }, { token: i4.PepTranslateService }, { token: i5.PepFileService }, { token: i6.Router, optional: true }, { token: i6.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
216
261
  PepAddonService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepAddonService, providedIn: 'root' });
217
262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepAddonService, decorators: [{
@@ -224,4 +269,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
224
269
  }] }, { type: i6.ActivatedRoute, decorators: [{
225
270
  type: Optional
226
271
  }] }]; } });
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWIvc3JjL2NvcmUvY29tbW9uL3NlcnZpY2VzL2FkZG9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFZekQ7O0VBRUU7QUFJRixNQUFNLE9BQU8sZUFBZTtJQWF4QixZQUNZLGNBQWlDLEVBQ2pDLFdBQTJCLEVBQzNCLGFBQStCLEVBQ2hDLGdCQUFxQyxFQUNyQyxXQUEyQixFQUNkLE1BQWMsRUFDZCxLQUFxQjtRQU5qQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUNoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQW5CNUIscUJBQWdCLEdBQUcsc0NBQXNDLENBQUM7UUFDM0UsOERBQThEO1FBQzdDLHNDQUFpQyxHQUFHLDRCQUE0QixDQUFDO1FBQ2pFLDRCQUF1QixHQUFHLGFBQWEsQ0FBQztRQUN4QyxrQ0FBNkIsR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsUUFBUSxDQUFDO1FBaUJyRixFQUFFO0lBQ04sQ0FBQztJQWRELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxH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QywwQkFBMEIsQ0FDcEMsU0FBaUIsRUFDakIsWUFBNkIsRUFDN0IsUUFBUSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBRXRCLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFDO1FBRXRDLElBQUksUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNsRztTQUNKO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxZQUFZLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckYsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUM7WUFDNUQsR0FBRywwQkFBMEI7WUFDN0Isd0JBQXdCO1NBQzNCLENBQUMsQ0FBQztJQUNQLENBQUM7O0FBN1BjLGtDQUFrQixHQUFxQixJQUFJLEdBQUcsRUFBRyxDQUFBOzRHQVB2RCxlQUFlO2dIQUFmLGVBQWUsY0FGWixNQUFNOzJGQUVULGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFvQlEsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbCwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQ3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2VsZW1lbnRzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUGVwU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuL3Nlc3Npb24uc2VydmljZSc7XG5pbXBvcnQgeyBQZXBGaWxlU2VydmljZSB9IGZyb20gJy4vZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaHR0cC9zZXJ2aWNlcy9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVwTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2h0dHAvc2VydmljZXMvbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElUcmFuc2xhdGlvblJlc291cmNlIH0gZnJvbSAnbmd4LXRyYW5zbGF0ZS1tdWx0aS1odHRwLWxvYWRlcic7XG5pbXBvcnQgeyBQZXBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBjb25uZWN0Um91dGVyIH0gZnJvbSAnQGFuZ3VsYXItYXJjaGl0ZWN0cy9tb2R1bGUtZmVkZXJhdGlvbi10b29scyc7XG5cbi8qXG4gICAgVGhpcyBzZXJ2aWNlIGlzIHRoZSB3ZWJhcHAgYXBpIGZvciBhZGRvbiB1c2VnZS5cbiovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBQZXBBZGRvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUEFHRVNfQURET05fVVVJRCA9ICc1MDA2MmUwYy05OTY3LTRlZDQtOTEwMi1mMmJjNTA2MDJkNDEnO1xuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgQURET05fQVNTRVRTX1BBVEhfS0VZID0gJ0FkZG9uQXNzZXRzUGF0aCc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBBRERPTlNfRElDVElPTkFSWV9BU1NFVFNfUEFUSF9LRVkgPSAnQWRkb25zRGljdGlvbmFyeUFzc2V0c1BhdGgnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQURET05fQVBJX1JFTEFUSVZFX1BBVEggPSAnL2FkZG9ucy9hcGknO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQURET05fQVBJX0FTWU5DX1JFTEFUSVZFX1BBVEggPSBgJHt0aGlzLkFERE9OX0FQSV9SRUxBVElWRV9QQVRIfS9hc3luY2A7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfY3VzdG9tRWxlbWVudHNNYXA6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgZ2V0IGRldlNlcnZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGUgPyB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdkZXZTZXJ2ZXInKSA9PT0gJ3RydWUnIDogZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFBlcFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGh0dHBTZXJ2aWNlOiBQZXBIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOiBQZXBMb2FkZXJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZTogUGVwVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHVibGljIGZpbGVTZXJ2aWNlOiBQZXBGaWxlU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgKSB7XG4gICAgICAgIC8vXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBZGRvbkJhc2VSZWxhdGl2ZVBhdGgoaXNBc3luYyA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzQXN5bmNcbiAgICAgICAgICAgID8gdGhpcy5BRERPTl9BUElfQVNZTkNfUkVMQVRJVkVfUEFUSFxuICAgICAgICAgICAgOiB0aGlzLkFERE9OX0FQSV9SRUxBVElWRV9QQVRIO1xuICAgIH1cblxuICAgIGdldEFkZG9uU3RhdGljRm9sZGVyKGFkZG9uVVVJRDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gaWYgKGFkZG9uVVVJRC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRvbnNEaWN0aW9uYXJ5ID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRPYmplY3QodGhpcy5BRERPTlNfRElDVElPTkFSWV9BU1NFVFNfUEFUSF9LRVkpO1xuICAgICAgICAgICAgcmV0dXJuIGFkZG9uc0RpY3Rpb25hcnkgJiYgYWRkb25zRGljdGlvbmFyeVthZGRvblVVSURdID8gYWRkb25zRGljdGlvbmFyeVthZGRvblVVSURdIDogJyc7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRPYmplY3QodGhpcy5BRERPTl9BU1NFVFNfUEFUSF9LRVkpIHx8ICcnO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgc2V0QWRkb25TdGF0aWNGb2xkZXIocGF0aDogc3RyaW5nLCBhZGRvblVVSUQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBpZiAoYWRkb25VVUlELmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uc0RpY3Rpb25hcnkgPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdCh0aGlzLkFERE9OU19ESUNUSU9OQVJZX0FTU0VUU19QQVRIX0tFWSkgPz8ge307XG4gICAgICAgICAgICBhZGRvbnNEaWN0aW9uYXJ5W2FkZG9uVVVJRF0gPSBwYXRoO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5zZXRPYmplY3QodGhpcy5BRERPTlNfRElDVElPTkFSWV9BU1NFVFNfUEFUSF9LRVksIGFkZG9uc0RpY3Rpb25hcnkpO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KHRoaXMuQURET05fQVNTRVRTX1BBVEhfS0VZLCBwYXRoKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGdldFNlcnZlckJhc2VVcmwoYWRkb25VVUlEOiBzdHJpbmcsIGZpbGVOYW1lID0gJycsIGlzQXN5bmMgPSBmYWxzZSwgbG9jYWxob3N0UG9ydCA9IDQ1MDApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmaWxlVG9BZGQgPSBmaWxlTmFtZS5sZW5ndGggPiAwID8gYC8ke2ZpbGVOYW1lfWAgOiAnJztcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBkZXZTZXJ2ZXIgcnVuIHNlcnZlciBvbiBsb2NhbGhvc3QuXG4gICAgICAgIGlmKHRoaXMuZGV2U2VydmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtsb2NhbGhvc3RQb3J0fSR7ZmlsZVRvQWRkfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRQYXBpQmFzZVVybCgpO1xuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9JHt0aGlzLmdldEFkZG9uQmFzZVJlbGF0aXZlUGF0aChpc0FzeW5jKX0vJHthZGRvblVVSUR9JHtmaWxlVG9BZGR9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEFkZG9uQXBpQ2FsbChcbiAgICAgICAgYWRkb25VVUlEOiBzdHJpbmcsXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBodHRwT3B0aW9ucyA9IHt9LFxuICAgICAgICBpc0FzeW5jID0gZmFsc2VcbiAgICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICAvLyByZXR1cm4gdGhpcy5odHRwU2VydmljZS5nZXRQYXBpQXBpQ2FsbChcbiAgICAgICAgLy8gICAgIGAke3RoaXMuZ2V0QWRkb25CYXNlUmVsYXRpdmVQYXRoKFxuICAgICAgICAvLyAgICAgICAgIGlzQXN5bmNcbiAgICAgICAgLy8gICAgICl9LyR7YWRkb25VVUlEfS8ke2ZpbGVOYW1lfS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAvLyAgICAgaHR0cE9wdGlvbnNcbiAgICAgICAgLy8gKTtcblxuICAgICAgICBjb25zdCBwYXBpQmFzZVVybCA9IHRoaXMuZ2V0U2VydmVyQmFzZVVybChhZGRvblVVSUQsIGZpbGVOYW1lLCBpc0FzeW5jKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZ2V0SHR0cENhbGwoYCR7cGFwaUJhc2VVcmx9LyR7ZnVuY3Rpb25OYW1lfWAsIGh0dHBPcHRpb25zKTtcbiAgICB9XG5cbiAgICBwb3N0QWRkb25BcGlDYWxsKFxuICAgICAgICBhZGRvblVVSUQ6IHN0cmluZyxcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIGJvZHkgPSB7fSxcbiAgICAgICAgaHR0cE9wdGlvbnMgPSB7fSxcbiAgICAgICAgaXNBc3luYyA9IGZhbHNlXG4gICAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UucG9zdFBhcGlBcGlDYWxsKFxuICAgICAgICAvLyAgICAgYCR7dGhpcy5nZXRBZGRvbkJhc2VSZWxhdGl2ZVBhdGgoXG4gICAgICAgIC8vICAgICAgICAgaXNBc3luY1xuICAgICAgICAvLyAgICAgKX0vJHthZGRvblVVSUR9LyR7ZmlsZU5hbWV9LyR7ZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgIC8vICAgICBib2R5LFxuICAgICAgICAvLyAgICAgaHR0cE9wdGlvbnNcbiAgICAgICAgLy8gKTtcblxuICAgICAgICBjb25zdCBwYXBpQmFzZVVybCA9IHRoaXMuZ2V0U2VydmVyQmFzZVVybChhZGRvblVVSUQsIGZpbGVOYW1lLCBpc0FzeW5jKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UucG9zdEh0dHBDYWxsKGAke3BhcGlCYXNlVXJsfS8ke2Z1bmN0aW9uTmFtZX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWRkb25DUElDYWxsKFxuICAgICAgICBhZGRvblVVSUQ6IHN0cmluZyxcbiAgICAgICAgdXJsOiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5lbWl0RXZlbnQoXCJBZGRvbkFQSVwiLCB7XG4gICAgICAgICAgICBBZGRvblVVSUQ6IGFkZG9uVVVJRCxcbiAgICAgICAgICAgIFJlbGF0aXZlVVJMOiB1cmwsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlcy5TdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMuVmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLlZhbHVlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdEFkZG9uQ1BJQ2FsbChcbiAgICAgICAgYWRkb25VVUlEOiBzdHJpbmcsXG4gICAgICAgIHVybDogc3RyaW5nLFxuICAgICAgICBib2R5OiBhbnlcbiAgICApIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5lbWl0RXZlbnQoXCJBZGRvbkFQSVwiLCB7XG4gICAgICAgICAgICBBZGRvblVVSUQ6IGFkZG9uVVVJRCxcbiAgICAgICAgICAgIFJlbGF0aXZlVVJMOiB1cmwsXG4gICAgICAgICAgICBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIEJvZHk6IGJvZHlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAocmVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcy5WYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuVmFsdWUpXG4gICAgICAgIH1cbiAgICB9ICAgXG5cbiAgICBlbWl0RXZlbnQoZXZlbnRLZXk6IHN0cmluZywgZXZlbnREYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2VtaXQtZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50S2V5LFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IGV2ZW50RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbjogcmVzb2x2ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIFRPRE86IG5lZWQgdG8gY2hlayB0aGlzIGlmIHRoZSBsb2FkZXIgaXMgd29ya2luZy5cbiAgICBmZXRjaChpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLnNob3coKTtcblxuICAgICAgICByZXR1cm4gd2luZG93LmZldGNoKGlucHV0LCBpbml0KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyU2VydmljZS5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE5neExpYlRyYW5zbGF0aW9uUmVzb3VyY2UoYWRkb25VVUlEOiBzdHJpbmcsIGxpYk5hbWUgPSAnbmd4LWxpYicpOiBJVHJhbnNsYXRpb25SZXNvdXJjZSB7XG4gICAgICAgIGNvbnN0IGFkZG9uU3RhdGljRm9sZGVyID0gdGhpcy5nZXRBZGRvblN0YXRpY0ZvbGRlcihhZGRvblVVSUQpO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoOiBzdHJpbmcgPSB0aGlzLmZpbGVTZXJ2aWNlLmdldEFzc2V0c1RyYW5zbGF0aW9uc1BhdGgoYWRkb25TdGF0aWNGb2xkZXIsIGxpYk5hbWUpO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnNTdWZmaXg6IHN0cmluZyA9IHRoaXMuZmlsZVNlcnZpY2UuZ2V0QXNzZXRzVHJhbnNsYXRpb25zU3VmZml4KGxpYk5hbWUpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6IHRyYW5zbGF0aW9uc1BhdGgsXG4gICAgICAgICAgICBzdWZmaXg6IHRyYW5zbGF0aW9uc1N1ZmZpeCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRBZGRvblRyYW5zbGF0aW9uUmVzb3VyY2UoYWRkb25VVUlEOiBzdHJpbmcpOiBJVHJhbnNsYXRpb25SZXNvdXJjZSB7XG4gICAgICAgIGNvbnN0IGFkZG9uU3RhdGljRm9sZGVyID0gdGhpcy5nZXRBZGRvblN0YXRpY0ZvbGRlcihhZGRvblVVSUQpO1xuICAgICAgICBjb25zdCBkZWZhdWx0U3ViRm9sZGVyID0gJ2Fzc2V0cy9pMThuLyc7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZWZpeDogYWRkb25TdGF0aWNGb2xkZXIubGVuZ3RoID4gMCA/IGAke2FkZG9uU3RhdGljRm9sZGVyfSR7ZGVmYXVsdFN1YkZvbGRlcn1gIDogYC8ke2RlZmF1bHRTdWJGb2xkZXJ9YCxcbiAgICAgICAgICAgIHN1ZmZpeDogJy5qc29uJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXREZWZhdWx0VHJhbnNsYXRlTGFuZyh0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsIHVybExhbmdQYXJhbSA9ICd1c2VyTGFuZycpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldERlZmF1bHRUcmFuc2xhdGVMYW5nKHRyYW5zbGF0ZSwgdXJsTGFuZ1BhcmFtKTtcbiAgICB9XG5cbiAgICBnZXRQYWdlc0FkZG9uVVVJRCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUEFHRVNfQURET05fVVVJRDtcbiAgICB9XG5cbiAgICBzZXRTaGVsbFJvdXRlckRhdGEoZGF0YTogeyBhZGRQYWRkaW5nPzogYm9vbGVhbiwgc2hvd1NpZGViYXI/OiBib29sZWFuLCBzaG93SGVhZGVyPzogYm9vbGVhbiB9KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAgIGRldGFpbDogZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc2V0LXJvdXRlci1kYXRhJywgZXZlbnREYXRhKTtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuICAgIH1cblxuICAgIGRlZmluZUN1c3RvbUVsZW1lbnQoZWxlbWVudE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBUeXBlPGFueT4sIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBpZiAoIWN1c3RvbUVsZW1lbnRzLmdldChlbGVtZW50TmFtZSkpIHsgIFxuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGVsZW1lbnROYW1lLCBjcmVhdGVDdXN0b21FbGVtZW50KGNvbXBvbmVudCwge2luamVjdG9yOiBpbmplY3Rvcn0pKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBlbGVtZW50TmFtZSBpbiB0aGUgX2N1c3RvbUVsZW1lbnRzTWFwIChGaXggaW50ZXJuYWwgcm91dGluZyBidWcpLlxuICAgICAgICAgICAgUGVwQWRkb25TZXJ2aWNlLl9jdXN0b21FbGVtZW50c01hcC5zZXQoZWxlbWVudE5hbWUsIHtpbmplY3RvcjogaW5qZWN0b3J9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpeCBpbnRlcm5hbCByb3V0aW5nIGJ1Zy5cbiAgICBjb25uZWN0SW50ZXJuYWxSb3V0ZXIoZWxlbWVudE5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50T2JqZWN0ID0gUGVwQWRkb25TZXJ2aWNlLl9jdXN0b21FbGVtZW50c01hcC5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBsZXQgcm91dGVyID0gY3VzdG9tRWxlbWVudE9iamVjdD8uaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG5cbiAgICAgICAgLy8gVGhpcyBjYXVzZSBhIHJlZnJlc2ggKGV2ZXJpdGhpbmcgaXMgbG9hZGluZyB0d2ljZSkgd2hlbiByZWxvYWRpbmcgdGhlIHBhZ2UuLi5cbiAgICAgICAgLy8gQnV0IGlmIHdlIHJlbW92ZSB0aGlzIHRoZSBmaXJzdCBuYXZpZ2F0aW9uIGlzIGNsZWFyIGFsbCBoaXN0b3J5IGNhdXNlIHRoZSByb3V0ZXIgaXMgbm90IGNvbm5lY3RlZC5cbiAgICAgICAgaWYgKCFyb3V0ZXIpIHtcbiAgICAgICAgICAgIHJvdXRlciA9IHRoaXMucm91dGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlSGFzaCA9IGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyMnKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFJvdXRlcihyb3V0ZXIsIHVzZUhhc2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHByaXZhdGUgY29ubmVjdFJvdXRlcihyb3V0ZXIsIHVzZUhhc2ggPSBmYWxzZSkge1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBpZiAoIXVzZUhhc2gpIHtcbiAgICAgICAgICAgIHVybCA9IGAke2xvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cigxKX0ke2xvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICByb3V0ZXIubmF2aWdhdGVCeVVybCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmwgPSBgJHtsb2NhdGlvbi5oYXNoLnN1YnN0cigxKX0ke2xvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlTXVsdGlUcmFuc2xhdGVMb2FkZXIoXG4gICAgICAgIGFkZG9uVVVJRDogc3RyaW5nLFxuICAgICAgICBhZGRvblNlcnZpY2U6IFBlcEFkZG9uU2VydmljZSxcbiAgICAgICAgbGlic05hbWUgPSBbJ25neC1saWInXSxcbiAgICApIHtcbiAgICAgICAgY29uc3Qgbmd4TGliVHJhbnNsYXRpb25SZXNvdXJjZXMgPSBbXTtcblxuICAgICAgICBpZiAobGlic05hbWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaWJzTmFtZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaWJOYW1lID0gbGlic05hbWVbaW5kZXhdO1xuICAgICAgICAgICAgICAgIG5neExpYlRyYW5zbGF0aW9uUmVzb3VyY2VzLnB1c2goYWRkb25TZXJ2aWNlLmdldE5neExpYlRyYW5zbGF0aW9uUmVzb3VyY2UoYWRkb25VVUlELCBsaWJOYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRvblRyYW5zbGF0aW9uUmVzb3VyY2UgPSBhZGRvblNlcnZpY2UuZ2V0QWRkb25UcmFuc2xhdGlvblJlc291cmNlKGFkZG9uVVVJRCk7XG5cbiAgICAgICAgcmV0dXJuIGFkZG9uU2VydmljZS50cmFuc2xhdGVTZXJ2aWNlLmNyZWF0ZU11bHRpVHJhbnNsYXRlTG9hZGVyKFtcbiAgICAgICAgICAgIC4uLm5neExpYlRyYW5zbGF0aW9uUmVzb3VyY2VzLFxuICAgICAgICAgICAgYWRkb25UcmFuc2xhdGlvblJlc291cmNlXG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiJdfQ==
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWIvc3JjL2NvcmUvY29tbW9uL3NlcnZpY2VzL2FkZG9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFZekQ7O0VBRUU7QUFJRixNQUFNLE9BQU8sZUFBZTtJQWF4QixZQUNZLGNBQWlDLEVBQ2pDLFdBQTJCLEVBQzNCLGFBQStCLEVBQ2hDLGdCQUFxQyxFQUNyQyxXQUEyQixFQUNkLE1BQWMsRUFDZCxLQUFxQjtRQU5qQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUNoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQW5CNUIscUJBQWdCLEdBQUcsc0NBQXNDLENBQUM7UUFDM0UsOERBQThEO1FBQzdDLHNDQUFpQyxHQUFHLDRCQUE0QixDQUFDO1FBQ2pFLDRCQUF1QixHQUFHLGFBQWEsQ0FBQztRQUN4QyxrQ0FBNkIsR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsUUFBUSxDQUFDO1FBaUJyRixFQUFFO0lBQ04sQ0FBQztJQWRELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxH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QUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2xHO1NBQ0o7UUFFRCxNQUFNLHdCQUF3QixHQUFHLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyRixPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztZQUM1RCxHQUFHLDBCQUEwQjtZQUM3Qix3QkFBd0I7U0FDM0IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7QUExU2Msa0NBQWtCLEdBQXFCLElBQUksR0FBRyxFQUFHLENBQUE7QUFxT2hFLHNGQUFzRjtBQUN0RiwyRkFBMkY7QUFDM0YsNkZBQTZGO0FBQzdGLG9CQUFvQjtBQUNMLGtDQUFrQixHQUE2RixJQUFJLEdBQUcsRUFBRyxDQUFBOzRHQWhQL0gsZUFBZTtnSEFBZixlQUFlLGNBRlosTUFBTTsyRkFFVCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBb0JRLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWwsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUN1c3RvbUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9lbGVtZW50cyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFBlcFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVwRmlsZVNlcnZpY2UgfSBmcm9tICcuL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBQZXBIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL2h0dHAvc2VydmljZXMvaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9odHRwL3NlcnZpY2VzL2xvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJVHJhbnNsYXRpb25SZXNvdXJjZSB9IGZyb20gJ25neC10cmFuc2xhdGUtbXVsdGktaHR0cC1sb2FkZXInO1xuaW1wb3J0IHsgUGVwVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4vdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29ubmVjdFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyLWFyY2hpdGVjdHMvbW9kdWxlLWZlZGVyYXRpb24tdG9vbHMnO1xuXG4vKlxuICAgIFRoaXMgc2VydmljZSBpcyB0aGUgd2ViYXBwIGFwaSBmb3IgYWRkb24gdXNlZ2UuXG4qL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwQWRkb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFBBR0VTX0FERE9OX1VVSUQgPSAnNTAwNjJlMGMtOTk2Ny00ZWQ0LTkxMDItZjJiYzUwNjAyZDQxJztcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IEFERE9OX0FTU0VUU19QQVRIX0tFWSA9ICdBZGRvbkFzc2V0c1BhdGgnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQURET05TX0RJQ1RJT05BUllfQVNTRVRTX1BBVEhfS0VZID0gJ0FkZG9uc0RpY3Rpb25hcnlBc3NldHNQYXRoJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IEFERE9OX0FQSV9SRUxBVElWRV9QQVRIID0gJy9hZGRvbnMvYXBpJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IEFERE9OX0FQSV9BU1lOQ19SRUxBVElWRV9QQVRIID0gYCR7dGhpcy5BRERPTl9BUElfUkVMQVRJVkVfUEFUSH0vYXN5bmNgO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2N1c3RvbUVsZW1lbnRzTWFwOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGdldCBkZXZTZXJ2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlID8gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZGV2U2VydmVyJykgPT09ICd0cnVlJyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBQZXBTZXNzaW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBodHRwU2VydmljZTogUGVwSHR0cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9hZGVyU2VydmljZTogUGVwTG9hZGVyU2VydmljZSxcbiAgICAgICAgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IFBlcFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBmaWxlU2VydmljZTogUGVwRmlsZVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWRkb25CYXNlUmVsYXRpdmVQYXRoKGlzQXN5bmMgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpc0FzeW5jXG4gICAgICAgICAgICA/IHRoaXMuQURET05fQVBJX0FTWU5DX1JFTEFUSVZFX1BBVEhcbiAgICAgICAgICAgIDogdGhpcy5BRERPTl9BUElfUkVMQVRJVkVfUEFUSDtcbiAgICB9XG5cbiAgICBnZXRBZGRvblN0YXRpY0ZvbGRlcihhZGRvblVVSUQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIGlmIChhZGRvblVVSUQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWRkb25zRGljdGlvbmFyeSA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KHRoaXMuQURET05TX0RJQ1RJT05BUllfQVNTRVRTX1BBVEhfS0VZKTtcbiAgICAgICAgICAgIHJldHVybiBhZGRvbnNEaWN0aW9uYXJ5ICYmIGFkZG9uc0RpY3Rpb25hcnlbYWRkb25VVUlEXSA/IGFkZG9uc0RpY3Rpb25hcnlbYWRkb25VVUlEXSA6ICcnO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KHRoaXMuQURET05fQVNTRVRTX1BBVEhfS0VZKSB8fCAnJztcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHNldEFkZG9uU3RhdGljRm9sZGVyKHBhdGg6IHN0cmluZywgYWRkb25VVUlEOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKGFkZG9uVVVJRC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRvbnNEaWN0aW9uYXJ5ID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRPYmplY3QodGhpcy5BRERPTlNfRElDVElPTkFSWV9BU1NFVFNfUEFUSF9LRVkpID8/IHt9O1xuICAgICAgICAgICAgYWRkb25zRGljdGlvbmFyeVthZGRvblVVSURdID0gcGF0aDtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KHRoaXMuQURET05TX0RJQ1RJT05BUllfQVNTRVRTX1BBVEhfS0VZLCBhZGRvbnNEaWN0aW9uYXJ5KTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnNldE9iamVjdCh0aGlzLkFERE9OX0FTU0VUU19QQVRIX0tFWSwgcGF0aCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBnZXRTZXJ2ZXJCYXNlVXJsKGFkZG9uVVVJRDogc3RyaW5nLCBmaWxlTmFtZSA9ICcnLCBpc0FzeW5jID0gZmFsc2UsIGxvY2FsaG9zdFBvcnQgPSA0NTAwKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmlsZVRvQWRkID0gZmlsZU5hbWUubGVuZ3RoID4gMCA/IGAvJHtmaWxlTmFtZX1gIDogJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBGb3IgZGV2U2VydmVyIHJ1biBzZXJ2ZXIgb24gbG9jYWxob3N0LlxuICAgICAgICBpZih0aGlzLmRldlNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7bG9jYWxob3N0UG9ydH0ke2ZpbGVUb0FkZH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0UGFwaUJhc2VVcmwoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlVXJsfSR7dGhpcy5nZXRBZGRvbkJhc2VSZWxhdGl2ZVBhdGgoaXNBc3luYyl9LyR7YWRkb25VVUlEfSR7ZmlsZVRvQWRkfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBZGRvbkFwaUNhbGwoXG4gICAgICAgIGFkZG9uVVVJRDogc3RyaW5nLFxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgaHR0cE9wdGlvbnMgPSB7fSxcbiAgICAgICAgaXNBc3luYyA9IGZhbHNlXG4gICAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuZ2V0UGFwaUFwaUNhbGwoXG4gICAgICAgIC8vICAgICBgJHt0aGlzLmdldEFkZG9uQmFzZVJlbGF0aXZlUGF0aChcbiAgICAgICAgLy8gICAgICAgICBpc0FzeW5jXG4gICAgICAgIC8vICAgICApfS8ke2FkZG9uVVVJRH0vJHtmaWxlTmFtZX0vJHtmdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgLy8gICAgIGh0dHBPcHRpb25zXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgY29uc3QgcGFwaUJhc2VVcmwgPSB0aGlzLmdldFNlcnZlckJhc2VVcmwoYWRkb25VVUlELCBmaWxlTmFtZSwgaXNBc3luYyk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmdldEh0dHBDYWxsKGAke3BhcGlCYXNlVXJsfS8ke2Z1bmN0aW9uTmFtZX1gLCBodHRwT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcG9zdEFkZG9uQXBpQ2FsbChcbiAgICAgICAgYWRkb25VVUlEOiBzdHJpbmcsXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBib2R5ID0ge30sXG4gICAgICAgIGh0dHBPcHRpb25zID0ge30sXG4gICAgICAgIGlzQXN5bmMgPSBmYWxzZVxuICAgICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLnBvc3RQYXBpQXBpQ2FsbChcbiAgICAgICAgLy8gICAgIGAke3RoaXMuZ2V0QWRkb25CYXNlUmVsYXRpdmVQYXRoKFxuICAgICAgICAvLyAgICAgICAgIGlzQXN5bmNcbiAgICAgICAgLy8gICAgICl9LyR7YWRkb25VVUlEfS8ke2ZpbGVOYW1lfS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAvLyAgICAgYm9keSxcbiAgICAgICAgLy8gICAgIGh0dHBPcHRpb25zXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgY29uc3QgcGFwaUJhc2VVcmwgPSB0aGlzLmdldFNlcnZlckJhc2VVcmwoYWRkb25VVUlELCBmaWxlTmFtZSwgaXNBc3luYyk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLnBvc3RIdHRwQ2FsbChgJHtwYXBpQmFzZVVybH0vJHtmdW5jdGlvbk5hbWV9YCwgYm9keSwgaHR0cE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFkZG9uQ1BJQ2FsbChcbiAgICAgICAgYWRkb25VVUlEOiBzdHJpbmcsXG4gICAgICAgIHVybDogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZW1pdEV2ZW50KFwiQWRkb25BUElcIiwge1xuICAgICAgICAgICAgQWRkb25VVUlEOiBhZGRvblVVSUQsXG4gICAgICAgICAgICBSZWxhdGl2ZVVSTDogdXJsLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzLlZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5WYWx1ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHBvc3RBZGRvbkNQSUNhbGwoXG4gICAgICAgIGFkZG9uVVVJRDogc3RyaW5nLFxuICAgICAgICB1cmw6IHN0cmluZyxcbiAgICAgICAgYm9keTogYW55XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZW1pdEV2ZW50KFwiQWRkb25BUElcIiwge1xuICAgICAgICAgICAgQWRkb25VVUlEOiBhZGRvblVVSUQsXG4gICAgICAgICAgICBSZWxhdGl2ZVVSTDogdXJsLFxuICAgICAgICAgICAgTWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBCb2R5OiBib2R5XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlcy5TdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMuVmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLlZhbHVlKVxuICAgICAgICB9XG4gICAgfSAgIFxuXG4gICAgZW1pdEV2ZW50KGV2ZW50S2V5OiBzdHJpbmcsIGV2ZW50RGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdlbWl0LWV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBldmVudEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiBldmVudERhdGEsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IHJlc29sdmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWsgdGhpcyBpZiB0aGUgbG9hZGVyIGlzIHdvcmtpbmcuXG4gICAgZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIHRoaXMubG9hZGVyU2VydmljZS5zaG93KCk7XG5cbiAgICAgICAgcmV0dXJuIHdpbmRvdy5mZXRjaChpbnB1dCwgaW5pdCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlclNlcnZpY2UuaGlkZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXROZ3hMaWJUcmFuc2xhdGlvblJlc291cmNlKGFkZG9uVVVJRDogc3RyaW5nLCBsaWJOYW1lID0gJ25neC1saWInKTogSVRyYW5zbGF0aW9uUmVzb3VyY2Uge1xuICAgICAgICBjb25zdCBhZGRvblN0YXRpY0ZvbGRlciA9IHRoaXMuZ2V0QWRkb25TdGF0aWNGb2xkZXIoYWRkb25VVUlEKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zUGF0aDogc3RyaW5nID0gdGhpcy5maWxlU2VydmljZS5nZXRBc3NldHNUcmFuc2xhdGlvbnNQYXRoKGFkZG9uU3RhdGljRm9sZGVyLCBsaWJOYW1lKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zU3VmZml4OiBzdHJpbmcgPSB0aGlzLmZpbGVTZXJ2aWNlLmdldEFzc2V0c1RyYW5zbGF0aW9uc1N1ZmZpeChsaWJOYW1lKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlZml4OiB0cmFuc2xhdGlvbnNQYXRoLFxuICAgICAgICAgICAgc3VmZml4OiB0cmFuc2xhdGlvbnNTdWZmaXgsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0QWRkb25UcmFuc2xhdGlvblJlc291cmNlKGFkZG9uVVVJRDogc3RyaW5nKTogSVRyYW5zbGF0aW9uUmVzb3VyY2Uge1xuICAgICAgICBjb25zdCBhZGRvblN0YXRpY0ZvbGRlciA9IHRoaXMuZ2V0QWRkb25TdGF0aWNGb2xkZXIoYWRkb25VVUlEKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFN1YkZvbGRlciA9ICdhc3NldHMvaTE4bi8nO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6IGFkZG9uU3RhdGljRm9sZGVyLmxlbmd0aCA+IDAgPyBgJHthZGRvblN0YXRpY0ZvbGRlcn0ke2RlZmF1bHRTdWJGb2xkZXJ9YCA6IGAvJHtkZWZhdWx0U3ViRm9sZGVyfWAsXG4gICAgICAgICAgICBzdWZmaXg6ICcuanNvbicsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFRyYW5zbGF0ZUxhbmcodHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCB1cmxMYW5nUGFyYW0gPSAndXNlckxhbmcnKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXREZWZhdWx0VHJhbnNsYXRlTGFuZyh0cmFuc2xhdGUsIHVybExhbmdQYXJhbSk7XG4gICAgfVxuXG4gICAgZ2V0UGFnZXNBZGRvblVVSUQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlBBR0VTX0FERE9OX1VVSUQ7XG4gICAgfVxuXG4gICAgc2V0U2hlbGxSb3V0ZXJEYXRhKGRhdGE6IHsgYWRkUGFkZGluZz86IGJvb2xlYW4sIHNob3dTaWRlYmFyPzogYm9vbGVhbiwgc2hvd0hlYWRlcj86IGJvb2xlYW4gfSkge1xuICAgICAgICBjb25zdCBldmVudERhdGEgPSB7XG4gICAgICAgICAgICBkZXRhaWw6IGRhdGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3NldC1yb3V0ZXItZGF0YScsIGV2ZW50RGF0YSk7XG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICB9XG5cbiAgICBkZWZpbmVDdXN0b21FbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+LCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgaWYgKCFjdXN0b21FbGVtZW50cy5nZXQoZWxlbWVudE5hbWUpKSB7ICBcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShlbGVtZW50TmFtZSwgY3JlYXRlQ3VzdG9tRWxlbWVudChjb21wb25lbnQsIHtpbmplY3RvcjogaW5qZWN0b3J9KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZWxlbWVudE5hbWUgaW4gdGhlIF9jdXN0b21FbGVtZW50c01hcCAoRml4IGludGVybmFsIHJvdXRpbmcgYnVnKS5cbiAgICAgICAgICAgIFBlcEFkZG9uU2VydmljZS5fY3VzdG9tRWxlbWVudHNNYXAuc2V0KGVsZW1lbnROYW1lLCB7aW5qZWN0b3I6IGluamVjdG9yfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaXggaW50ZXJuYWwgcm91dGluZyBidWcuIENhbGxhYmxlIHJlcGVhdGVkbHkgKG9uY2UgYXQgbW91bnQsIHRoZW4gYWdhaW4gd2hlbmV2ZXIgdGhlXG4gICAgLy8gc2hlbGwncyBvd24gcm91dGUgY2hhbmdlcyB3aGlsZSB0aGUgc2FtZSBhZGRvbiBlbGVtZW50IGluc3RhbmNlIHN0YXlzIG1vdW50ZWQg4oCUIGUuZy4gYVxuICAgIC8vIHNldHRpbmdzX2Jsb2NrIGNoaWxkIHNlZ21lbnQgY2hhbmdlKSDigJQgc2VlIFBlcFJlbW90ZUxvYWRlckVsZW1lbnRDb21wb25lbnQncyByb3V0ZVxuICAgIC8vIHN1YnNjcmlwdGlvbiwgc2luY2Ugd2l0aG91dCBhIHJlcGVhdCBjYWxsIHRoZSBhZGRvbidzIG93biBpbnRlcm5hbCByb3V0ZXIgaXMgb25seSBldmVyXG4gICAgLy8gdG9sZCB0aGUgbG9jYXRpb24gb25jZSwgYXQgaW5pdGlhbCBtb3VudC5cbiAgICBjb25uZWN0SW50ZXJuYWxSb3V0ZXIoZWxlbWVudE5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50T2JqZWN0ID0gUGVwQWRkb25TZXJ2aWNlLl9jdXN0b21FbGVtZW50c01hcC5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBsZXQgcm91dGVyID0gY3VzdG9tRWxlbWVudE9iamVjdD8uaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG5cbiAgICAgICAgLy8gVGhpcyBjYXVzZSBhIHJlZnJlc2ggKGV2ZXJpdGhpbmcgaXMgbG9hZGluZyB0d2ljZSkgd2hlbiByZWxvYWRpbmcgdGhlIHBhZ2UuLi5cbiAgICAgICAgLy8gQnV0IGlmIHdlIHJlbW92ZSB0aGlzIHRoZSBmaXJzdCBuYXZpZ2F0aW9uIGlzIGNsZWFyIGFsbCBoaXN0b3J5IGNhdXNlIHRoZSByb3V0ZXIgaXMgbm90IGNvbm5lY3RlZC5cbiAgICAgICAgaWYgKCFyb3V0ZXIpIHtcbiAgICAgICAgICAgIHJvdXRlciA9IHRoaXMucm91dGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlSGFzaCA9IGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyMnKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFJvdXRlcihlbGVtZW50TmFtZSwgcm91dGVyLCB1c2VIYXNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZXMgdGhlIHBvcHN0YXRlL2hhc2hjaGFuZ2UgbGlzdGVuZXIgY29ubmVjdFJvdXRlcigpIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudCDigJRcbiAgICAvLyBjYWxsIGZyb20gdGhlIGhvc3RpbmcgY29tcG9uZW50J3MgbmdPbkRlc3Ryb3kgc28gYSBkZXN0cm95ZWQgYWRkb24gaW5zdGFuY2UgZG9lc24ndCBrZWVwXG4gICAgLy8gcmVhY3RpbmcgdG8gYnJvd3NlciBuYXZpZ2F0aW9uLlxuICAgIGRpc2Nvbm5lY3RJbnRlcm5hbFJvdXRlcihlbGVtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gUGVwQWRkb25TZXJ2aWNlLl9yb3V0ZXJDb25uZWN0aW9ucy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV4aXN0aW5nLmV2ZW50TmFtZSwgZXhpc3RpbmcubGlzdGVuZXIpO1xuICAgICAgICBQZXBBZGRvblNlcnZpY2UuX3JvdXRlckNvbm5lY3Rpb25zLmRlbGV0ZShlbGVtZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2tzLCBwZXIgYWRkb24gZWxlbWVudCwgdGhlIHBvcHN0YXRlL2hhc2hjaGFuZ2UgbGlzdGVuZXIgYWxyZWFkeSByZWdpc3RlcmVkIGJ5IGFcbiAgICAvLyBwcmV2aW91cyBjb25uZWN0Um91dGVyKCkgY2FsbCAoYW5kIHRoZSBtdXRhYmxlIFwiY3VycmVudCB1cmxcIiBpdCByZWFkcyksIHNvIGEgcmVwZWF0IGNhbGxcbiAgICAvLyB1cGRhdGVzIHRoYXQgc2FtZSBsaXN0ZW5lcidzIHRhcmdldCBpbnN0ZWFkIG9mIHBpbGluZyB1cCBhIG5ldywgaW5kZXBlbmRlbnRseS1zdGFsZSBvbmUgb25cbiAgICAvLyBldmVyeSBuYXZpZ2F0aW9uLlxuICAgIHByaXZhdGUgc3RhdGljIF9yb3V0ZXJDb25uZWN0aW9uczogTWFwPHN0cmluZywgeyB1cmw6IHN0cmluZzsgZXZlbnROYW1lOiAncG9wc3RhdGUnIHwgJ2hhc2hjaGFuZ2UnOyBsaXN0ZW5lcjogKCkgPT4gdm9pZCB9PiA9IG5ldyBNYXAoKTtcblxuICAgIC8vIFN0cmlwcyB0aGlzIGFwcCdzIG93biBiYXNlIGhyZWYgcHJlZml4IChlLmcuIGRldi1vbmx5IC9hbmd1bGFyIOKAlCBzZWUgYW5ndWxhci5qc29uJ3NcbiAgICAvLyBiYXNlSHJlZi9zZXJ2ZVBhdGgpIGZyb20gYSBwYXRoLCBzbyBpdCBjYW4gYmUgaGFuZGVkIHRvIGNvZGUgdGhhdCBleHBlY3RzIGEgcGF0aFxuICAgIC8vIHJlbGF0aXZlIHRvIHJlYWwgcm9vdCDigJQgYW4gYWRkb24ncyBvd24gaW50ZXJuYWwgcm91dGVyIChjb25uZWN0Um91dGVyIGJlbG93KSwgb3IgYVxuICAgIC8vIHJlbW90ZSdzIG9uZS10aW1lIGJvb3RzdHJhcC10aW1lIGxvY2F0aW9uIHJlYWQgKHNlZSBQZXBSZW1vdGVMb2FkZXJFbGVtZW50Q29tcG9uZW50KS5cbiAgICBzdGF0aWMgc3RyaXBCYXNlSHJlZihwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKT8uZ2V0QXR0cmlidXRlKCdocmVmJykgfHwgJy8nO1xuICAgICAgICBpZiAoYmFzZVBhdGggPT09ICcvJykgcmV0dXJuIHBhdGg7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gYmFzZVBhdGguZW5kc1dpdGgoJy8nKSA/IGJhc2VQYXRoLnNsaWNlKDAsIC0xKSA6IGJhc2VQYXRoO1xuICAgICAgICBjb25zdCBwcmVmaXhSZSA9IG5ldyBSZWdFeHAoYF4ke25vcm1hbGl6ZWRCYXNlfSg/PS98JClgKTtcbiAgICAgICAgcmV0dXJuIHByZWZpeFJlLnRlc3QocGF0aCkgPyAocGF0aC5yZXBsYWNlKHByZWZpeFJlLCAnJykgfHwgJy8nKSA6IHBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25uZWN0Um91dGVyKGVsZW1lbnROYW1lOiBzdHJpbmcsIHJvdXRlciwgdXNlSGFzaCA9IGZhbHNlKSB7XG4gICAgICAgIC8vIFRoaXMgYXBwIG1heSBiZSBzZXJ2ZWQgdW5kZXIgaXRzIG93biBiYXNlIGhyZWYgKGUuZy4gZGV2LW9ubHkgL2FuZ3VsYXIg4oCUIHNlZVxuICAgICAgICAvLyBhbmd1bGFyLmpzb24ncyBiYXNlSHJlZi9zZXJ2ZVBhdGgpIOKAlCBzdHJpcCBpdCBiZWZvcmUgaGFuZGluZyB0aGUgcGF0aCB0byB0aGUgYWRkb24nc1xuICAgICAgICAvLyBPV04gaW50ZXJuYWwgcm91dGVyLCB3aGljaCBleHBlY3RzIGEgcGF0aCByZWxhdGl2ZSB0byBJVFMgT1dOIHJvb3QsIG5vdCB0aGlzIHNoZWxsJ3MuXG4gICAgICAgIGNvbnN0IHN0cmlwQmFzZSA9IFBlcEFkZG9uU2VydmljZS5zdHJpcEJhc2VIcmVmO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gUGVwQWRkb25TZXJ2aWNlLl9yb3V0ZXJDb25uZWN0aW9ucy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoIXVzZUhhc2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3N0cmlwQmFzZShsb2NhdGlvbi5wYXRobmFtZSkucmVwbGFjZSgvXlxcLy8sICcnKX0ke2xvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnVybCA9IHVybDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHsgdXJsLCBldmVudE5hbWU6ICdwb3BzdGF0ZScgYXMgY29uc3QsIGxpc3RlbmVyOiAoKSA9PiByb3V0ZXIubmF2aWdhdGVCeVVybChjb25uZWN0aW9uLnVybCkgfTtcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBjb25uZWN0aW9uLmxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICBQZXBBZGRvblNlcnZpY2UuX3JvdXRlckNvbm5lY3Rpb25zLnNldChlbGVtZW50TmFtZSwgY29ubmVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgJHtzdHJpcEJhc2UobG9jYXRpb24uaGFzaC5yZXBsYWNlKC9eIy8sICcnKSkucmVwbGFjZSgvXlxcLy8sICcnKX0ke2xvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnVybCA9IHVybDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHsgdXJsLCBldmVudE5hbWU6ICdoYXNoY2hhbmdlJyBhcyBjb25zdCwgbGlzdGVuZXI6ICgpID0+IHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGNvbm5lY3Rpb24udXJsKSB9O1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgY29ubmVjdGlvbi5saXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgUGVwQWRkb25TZXJ2aWNlLl9yb3V0ZXJDb25uZWN0aW9ucy5zZXQoZWxlbWVudE5hbWUsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVNdWx0aVRyYW5zbGF0ZUxvYWRlcihcbiAgICAgICAgYWRkb25VVUlEOiBzdHJpbmcsXG4gICAgICAgIGFkZG9uU2VydmljZTogUGVwQWRkb25TZXJ2aWNlLFxuICAgICAgICBsaWJzTmFtZSA9IFsnbmd4LWxpYiddLFxuICAgICkge1xuICAgICAgICBjb25zdCBuZ3hMaWJUcmFuc2xhdGlvblJlc291cmNlcyA9IFtdO1xuXG4gICAgICAgIGlmIChsaWJzTmFtZT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpYnNOYW1lLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpYk5hbWUgPSBsaWJzTmFtZVtpbmRleF07XG4gICAgICAgICAgICAgICAgbmd4TGliVHJhbnNsYXRpb25SZXNvdXJjZXMucHVzaChhZGRvblNlcnZpY2UuZ2V0Tmd4TGliVHJhbnNsYXRpb25SZXNvdXJjZShhZGRvblVVSUQsIGxpYk5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZG9uVHJhbnNsYXRpb25SZXNvdXJjZSA9IGFkZG9uU2VydmljZS5nZXRBZGRvblRyYW5zbGF0aW9uUmVzb3VyY2UoYWRkb25VVUlEKTtcblxuICAgICAgICByZXR1cm4gYWRkb25TZXJ2aWNlLnRyYW5zbGF0ZVNlcnZpY2UuY3JlYXRlTXVsdGlUcmFuc2xhdGVMb2FkZXIoW1xuICAgICAgICAgICAgLi4ubmd4TGliVHJhbnNsYXRpb25SZXNvdXJjZXMsXG4gICAgICAgICAgICBhZGRvblRyYW5zbGF0aW9uUmVzb3VyY2VcbiAgICAgICAgXSk7XG4gICAgfVxufVxuIl19
@@ -79,19 +79,14 @@ export class PepUtilitiesService {
79
79
  if (!isDateTime) {
80
80
  const index = dateStr.indexOf('T');
81
81
  if (index > 0) {
82
- // Full UTC timestamp: use local date getters to derive the correct local calendar
83
- // date. Stripping the T-prefix and parsing literally yields the UTC calendar date,
84
- // which is one day behind for UTC+ users (e.g. NZ UTC+12).
85
- retVal = new Date(retVal.getFullYear(), retVal.getMonth(), retVal.getDate(), 0, retVal.getTimezoneOffset() * -1);
82
+ dateStr = dateStr.substring(0, index);
86
83
  }
87
- else {
88
- const dateText = dateStr.split('-');
89
- if (dateText.length === 3) {
90
- const year = Number(dateText[0]);
91
- const month = Number(dateText[1]) - 1;
92
- const day = Number(dateText[2]);
93
- retVal = new Date(year, month, day, 0, retVal.getTimezoneOffset() * -1);
94
- }
84
+ const dateText = dateStr.split('-');
85
+ if (dateText.length === 3) {
86
+ const year = Number(dateText[0]);
87
+ const month = Number(dateText[1]) - 1;
88
+ const day = Number(dateText[2]);
89
+ retVal = new Date(year, month, day, 0, retVal.getTimezoneOffset() * -1);
95
90
  }
96
91
  }
97
92
  else {
@@ -303,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
303
298
  }], ctorParameters: function () { return [{ type: i1.TranslateService, decorators: [{
304
299
  type: Optional
305
300
  }] }]; } });
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL3NyYy9jb3JlL2NvbW1vbi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU1yRCxNQUFNLE9BQU8sbUJBQW1CO0lBRzVCLFlBQWdDLFlBQThCLElBQUk7UUFBbEMsY0FBUyxHQUFULFNBQVMsQ0FBeUI7UUFGMUQsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUd0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxPQUFPLENBQUM7UUFFbEUsUUFBUTtRQUNSLGdFQUFnRTtRQUNoRSxhQUFhO0lBQ2pCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsYUFBYSxHQUFHLENBQUM7UUFDMUQsbURBQW1EO1FBQ25ELElBQUksS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsaUZBQWlGO1lBQ2pGLEtBQUssR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsc0ZBQXNGO1NBQ3pGO1FBRUQsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCwrREFBK0Q7SUFDdkQsT0FBTyxDQUFDLFlBQW9CO1FBQ2hDLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtTQUMzQztRQUVELE9BQU87WUFDSCxJQUFJLEVBQUUsSUFB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O1NBQ3ZFO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGFBQWEsQ0FBQyxjQUFzQixFQUFFLGVBQXVCO1FBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUQsT0FBTyxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQzlCLENBQUM7O2dIQTNWUSxtQkFBbUI7b0hBQW5CLG1CQUFtQixjQUZoQixNQUFNOzJGQUVULG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUlnQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHksIF9pc051bWJlclZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBmb3JtYXROdW1iZXIsIGZvcm1hdFBlcmNlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwVXRpbGl0aWVzU2VydmljZSB7XG4gICAgcHJpdmF0ZSBjdWx0dXJlID0gJ2VuLVVTJztcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlID0gbnVsbCkge1xuICAgICAgICB0aGlzLmN1bHR1cmUgPSB0aGlzLnRyYW5zbGF0ZT8uZ2V0QnJvd3NlckN1bHR1cmVMYW5nKCkgfHwgJ2VuLVVTJztcblxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgaW1wb3J0KGBAYW5ndWxhci9jb21tb24vbG9jYWxlcy9nbG9iYWwvJHt0aGlzLmN1bHR1cmV9YCk7XG4gICAgICAgIC8vIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZTogc3RyaW5nLCBmYWxsYmFja1ZhbHVlID0gMCk6IG51bWJlciB7XG4gICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyAnLCcgY2hhbmdlIGl0IHRvICcuJ1xuICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyAnLCcgY2hhbmdlIGl0IHRvICcuJyBmb3IgbGV0IHRoZSBmb3JtYXR0aW5nIHdvcmtzLlxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNoYW5nZURlY2ltYWxTZXBhcmF0b3JXaGVuSXRzQ29tbWEodmFsdWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NvZXJjZU51bWJlclByb3BlcnR5IGFmdGVyIGNoYW5nZSBkZWNpbWFsIHNlcGFyYXRvciB2YWx1ZSBpcycsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgZmFsbGJhY2tWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcGFyc2UtbXMuXG4gICAgLy8gbW92ZWQgdG8gaW50ZXJuYWwgZnVuY3Rpb24gYmVjYXVzZSBwYXJzZS1tcyBpcyBub3cgcHVyZSBFU00uXG4gICAgcHJpdmF0ZSBwYXJzZU1zKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWlsbGlzZWNvbmRzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBudW1iZXInKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgICAgICAgaG91cnM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICAgICAgICBzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzKSAlIDEwMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcmFmYWVscmluYWxkaS9hZGQtemVyby5cbiAgICAvLyBtb3ZlZCB0byBpbnRlcm5hbCBmdW5jdGlvbiBiL2MgYWRkWmVybyBpcyB1bm1haW50YWluZWQgKDcrIHllYXJzKS5cbiAgICAvLyBzdHJpcHBlZCBvdXQgbmVnYXRpdmUgc2lnbiBsb2dpYyBzaW5jZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIGl0IGVsc2V3aGVyZS5cbiAgICBwcml2YXRlIGFkZFplcm8odmFsdWU6IG51bWJlciwgZGlnaXRzID0gMikge1xuICAgICAgICBkaWdpdHMgPSBkaWdpdHMgfHwgMlxuXG4gICAgICAgIGxldCBzdHIgPSB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgIGxldCBzaXplID0gMFxuXG4gICAgICAgIHNpemUgPSBkaWdpdHMgLSBzdHIubGVuZ3RoICsgMVxuICAgICAgICBzdHIgPSBuZXcgQXJyYXkoc2l6ZSkuam9pbignMCcpLmNvbmNhdChzdHIpXG5cbiAgICAgICAgcmV0dXJuIHN0clxuICAgIH1cblxuICAgIHByaXZhdGUgaXNDdXJyZW5jeVNob3VsZEJlT25SaWdodChjdXJyZW5jeVN5bWJvbDogc3RyaW5nKSB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAoY3VycmVuY3lTeW1ib2wgPT0gXCLigqxcIiB8fFxuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPT0gXCLigqpcIiB8fFxuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPT0gXCJGdFwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcIkvEjVwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcItGA0YPQsVwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcInrFglwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcImtyLlwiKSB7XG4gICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGN1dFZhbHVlQnlGcmFjdGlvbkRpZ2l0cyh2YWx1ZTogc3RyaW5nLCBtYXhGcmFjdGlvbkRpZ2l0czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlcyA9IHZhbHVlO1xuICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzIHx8IDI7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSB0aGlzLmdldERlY2ltYWxTZXBhcmF0b3IoKTtcblxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZGVjaW1hbFNlcGFyYXRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXJyID0gdmFsdWUuc3BsaXQoZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICAgICAgICAgIC8vIGlmICh2YWx1ZUFyclsxXS5sZW5ndGggPCBtYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgdmFsdWVBcnJbMV0gPSB2YWx1ZUFyclsxXS5wYWRFbmQobWF4RnJhY3Rpb25EaWdpdHMsICcwJyk7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHJlcyA9IGAke3ZhbHVlQXJyWzBdfSR7ZGVjaW1hbFNlcGFyYXRvcn0ke3ZhbHVlQXJyWzFdLnNsaWNlKDAsIG1heEZyYWN0aW9uRGlnaXRzKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nLCBpc0RhdGVUaW1lID0gZmFsc2UpOiBEYXRlIHtcbiAgICAgICAgbGV0IHJldFZhbDogRGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChkYXRlU3RyICE9PSAnJykge1xuICAgICAgICAgICAgcmV0VmFsID0gbmV3IERhdGUoZGF0ZVN0cik7XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gZGF0ZSB3aXRoIG5vIG9mZnNldC5cbiAgICAgICAgICAgIGlmICghaXNEYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0ZVN0ci5pbmRleE9mKCdUJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1bGwgVVRDIHRpbWVzdGFtcDogdXNlIGxvY2FsIGRhdGUgZ2V0dGVycyB0byBkZXJpdmUgdGhlIGNvcnJlY3QgbG9jYWwgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGF0ZS4gU3RyaXBwaW5nIHRoZSBULXByZWZpeCBhbmQgcGFyc2luZyBsaXRlcmFsbHkgeWllbGRzIHRoZSBVVEMgY2FsZW5kYXIgZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgb25lIGRheSBiZWhpbmQgZm9yIFVUQysgdXNlcnMgKGUuZy4gTlogVVRDKzEyKS5cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbmV3IERhdGUocmV0VmFsLmdldEZ1bGxZZWFyKCksIHJldFZhbC5nZXRNb250aCgpLCByZXRWYWwuZ2V0RGF0ZSgpLCAwLCByZXRWYWwuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIC0xKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlVGV4dCA9IGRhdGVTdHIuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVUZXh0Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeWVhciA9IE51bWJlcihkYXRlVGV4dFswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb250aCA9IE51bWJlcihkYXRlVGV4dFsxXSkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKGRhdGVUZXh0WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIDAsIHJldFZhbC5nZXRUaW1lem9uZU9mZnNldCgpICogLTEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmdldEZ1bGxZZWFyKCksIHJldFZhbC5nZXRNb250aCgpLCByZXRWYWwuZ2V0RGF0ZSgpLCByZXRWYWwuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmdldE1pbnV0ZXMoKSArIHJldFZhbC5nZXRUaW1lem9uZU9mZnNldCgpICogLTEsIHJldFZhbC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwgJiYgaXNOYU4ocmV0VmFsLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdHJpbmdpZnlEYXRlKGRhdGU6IERhdGUsIGlzRGF0ZVRpbWUgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7IC8vIGluY2x1ZGUgLSBvZmZzZXRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICBkYXRlVGV4dC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICctJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgJy0nLFxuICAgICAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUZXh0LmpvaW4oJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNWYWx1ZUh0bWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IFJFR0VYUCA9IC88XFwvP1thLXpdW1xcc1xcU10qPi9pO1xuICAgICAgICByZXMgPSBSRUdFWFAudGVzdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpc0pzb25TdHJpbmcoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIEpTT04ucGFyc2Uoc3RyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFN2Z0VsZW1lbnRGcm9tU3RyaW5nKGRvY3VtZW50LCBzdmdDb250ZW50OiBzdHJpbmcpOiBTVkdFbGVtZW50IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIC8vIGRpdi5jbGFzc05hbWUgPSAnc3ZnLWljb24nO1xuICAgICAgICAvLyBBZGQgY2xhc3Mgc3ZnLWljb25cbiAgICAgICAgaWYgKHN2Z0NvbnRlbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBzdmdDb250ZW50LnJlcGxhY2UoJzxzdmcgJywgJzxzdmcgY2xhc3M9XCJzdmctaWNvblwiICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0UGVyY2VudCh2YWx1ZTogYW55LCBkaWdpdHNJbmZvID0gJzEuMC0yJykge1xuICAgIGZvcm1hdFBlcmNlbnQodmFsdWU6IGFueSwgbWluRnJhY3Rpb25EaWdpdHMgPSAwLCBtYXhGcmFjdGlvbkRpZ2l0cyA9IDIpIHtcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtaW5GcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG4gICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29lcmNlTnVtYmVyUHJvcGVydHkobWF4RnJhY3Rpb25EaWdpdHMsIG51bGwpO1xuXG4gICAgICAgIHZhbHVlID0gdGhpcy5jdXRWYWx1ZUJ5RnJhY3Rpb25EaWdpdHModmFsdWU/LnRvU3RyaW5nKCksIE1hdGgubWF4KG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cykpO1xuICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0UGVyY2VudChudW1iZXIgLyAxMDAsIHRoaXMuY3VsdHVyZSwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiAncGVyY2VudCcsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBtaW5GcmFjdGlvbkRpZ2l0cyB8fCAwLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlciAvIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXRDdXJyZW5jeSh2YWx1ZTogYW55LCBjdXJyZW5jeVNpZ24gPSAnJywgZGlnaXRzSW5mbyA9ICcxLjItMicpIHtcbiAgICBmb3JtYXRDdXJyZW5jeSh2YWx1ZTogYW55LCBjdXJyZW5jeVNpZ24gPSAnJywgbWluRnJhY3Rpb25EaWdpdHMgPSAyLCBtYXhGcmFjdGlvbkRpZ2l0cyA9IDIsIHVzZUdyb3VwaW5nID0gdHJ1ZSkge1xuICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KG1pbkZyYWN0aW9uRGlnaXRzLCBudWxsKTtcbiAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtYXhGcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG5cbiAgICAgICAgbGV0IHJlcyA9ICcnO1xuXG4gICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyB0aGUgbGFzdCBkaWdpdFxuICAgICAgICAvLyBpZiAodmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5pbmRleE9mKHRoaXMuZ2V0RGVjaW1hbFNlcGFyYXRvcigpKSA9PT0gdmFsdWUubGVuZ3RoIC0xKSB7XG4gICAgICAgIC8vICAgICByZXMgPSB2YWx1ZTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jdXRWYWx1ZUJ5RnJhY3Rpb25EaWdpdHModmFsdWU/LnRvU3RyaW5nKCksIE1hdGgubWF4KG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cykpO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyID0gdGhpcy5wcmVwYXJlTnVtYmVyVG9Gb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbmN5U2lnbjogY3VycmVuY3lTaWduLFxuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uRGlnaXRzIHx8IE1hdGgubWluKDIsIG1heEZyYWN0aW9uRGlnaXRzIHx8IDIpLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfTtcbiAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0Q3VycmVuY3koMCwgdGhpcy5jdWx0dXJlLCBjdXJyZW5jeVNpZ24sIHVuZGVmaW5lZCwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwgc3R5bGVPcHRpb25zKS5mb3JtYXQoMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSwgdGhpcy5jdWx0dXJlLCBjdXJyZW5jeVNpZ24sIHVuZGVmaW5lZCwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwgc3R5bGVPcHRpb25zKS5mb3JtYXQobnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmIChjdXJyZW5jeVNpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuaXNDdXJyZW5jeVNob3VsZEJlT25SaWdodChjdXJyZW5jeVNpZ24pID8gYCR7cmVzfSAke2N1cnJlbmN5U2lnbn1gIDogYCR7Y3VycmVuY3lTaWdufSAke3Jlc31gXG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdERlY2ltYWwodmFsdWU6IGFueSwgZGlnaXRzSW5mbyA9ICcxLjItMicpIHtcbiAgICBmb3JtYXREZWNpbWFsKHZhbHVlOiBhbnksIG1pbkZyYWN0aW9uRGlnaXRzID0gMiwgbWF4RnJhY3Rpb25EaWdpdHMgPSAyLCB1c2VHcm91cGluZyA9IHRydWUpIHtcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtaW5GcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmb3JtYXREZWNpbWFsIG1pbkZyYWN0aW9uRGlnaXRzIHZhbHVlIGlzJywgbWluRnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KG1heEZyYWN0aW9uRGlnaXRzLCBudWxsKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2Zvcm1hdERlY2ltYWwgbWluRnJhY3Rpb25EaWdpdHMgdmFsdWUgaXMnLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG5cbiAgICAgICAgdmFsdWUgPSB0aGlzLmN1dFZhbHVlQnlGcmFjdGlvbkRpZ2l0cyh2YWx1ZT8udG9TdHJpbmcoKSwgTWF0aC5tYXgobWluRnJhY3Rpb25EaWdpdHMsIG1heEZyYWN0aW9uRGlnaXRzKSk7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KHZhbHVlKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdudW1iZXIgdmFsdWUgaXMnLCBudW1iZXIpO1xuXG4gICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmN1bHR1cmUsIGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uRGlnaXRzIHx8IE1hdGgubWluKDIsIG1heEZyYWN0aW9uRGlnaXRzIHx8IDIpLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJbnRsLk51bWJlckZvcm1hdCB2YWx1ZSBpcycsIHJlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXROdW1iZXIodmFsdWU6IGFueSwgZGlnaXRzSW5mbyA9ICcxLjAtMCcpOiBzdHJpbmcge1xuICAgIGZvcm1hdE51bWJlcih2YWx1ZTogYW55LCB1c2VHcm91cGluZyA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBmb3JtYXROdW1iZXIodmFsdWUsIHRoaXMuY3VsdHVyZSwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAwLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBudW1iZXIgaW4gbWlsbGlzZWNvbmRzIHRvIGEgc3RhbmRhcmQgZHVyYXRpb24gc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGVMb2FkZXJPcHRpb25zIC0gZm9ybWF0RHVyYXRpb24gb3B0aW9ucyBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW1vdGVMb2FkZXJPcHRpb25zLmxlYWRpbmc9ZmFsc2VdIC0gYWRkIGxlYWRpbmcgemVyb1xuICAgICAqIEByZXR1cm5zIHN0cmluZyAtIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmdcbiAgICAqL1xuICAgIGZvcm1hdER1cmF0aW9uKHZhbHVlLCBvcHRpb25zOiB7IGxlYWRpbmc/OiBib29sZWFuLCBkdXJhdGlvbj86ICdtaWxsaXNlY29uZHMnIHwgJ3NlY29uZHMnIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGlzTnVtYmVyID0gX2lzTnVtYmVyVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIGlmICghaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmcgPSBvcHRpb25zPy5sZWFkaW5nIHx8IHRydWU7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG9wdGlvbnM/LmR1cmF0aW9uIHx8ICdtaWxsaXNlY29uZHMnO1xuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09PSAnc2Vjb25kcycpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMDAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1bnNpZ25lZE1zID0gbnVtYmVyIDwgMCA/IC1udW1iZXIgOiBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCBzaWduID0gbnVtYmVyIDw9IC0xMDAwID8gJy0nIDogJyc7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wYXJzZU1zKHVuc2lnbmVkTXMpO1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMuYWRkWmVybyh0LnNlY29uZHMpO1xuXG4gICAgICAgICAgICBpZiAodC5kYXlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyB0LmRheXMgKyAnOicgKyB0aGlzLmFkZFplcm8odC5ob3VycykgKyAnOicgKyB0aGlzLmFkZFplcm8odC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQuaG91cnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArIChsZWFkaW5nID8gdGhpcy5hZGRaZXJvKHQuaG91cnMpIDogdC5ob3VycykgKyAnOicgKyB0aGlzLmFkZFplcm8odC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyAobGVhZGluZyA/IHRoaXMuYWRkWmVybyh0Lm1pbnV0ZXMpIDogdC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluY3JlbWVudE51bWJlcih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG51bWJlclZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIDApO1xuICAgICAgICByZXR1cm4gKCsrbnVtYmVyVmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50TnVtYmVyKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbnVtYmVyVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgMCk7XG4gICAgICAgIHJldHVybiAoLS1udW1iZXJWYWx1ZSkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBnZXREZWNpbWFsU2VwYXJhdG9yKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG51bWJlcldpdGhEZWNpbWFsU2VwYXJhdG9yID0gMS4xO1xuXG4gICAgICAgIHJldHVybiBudW1iZXJXaXRoRGVjaW1hbFNlcGFyYXRvclxuICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKHRoaXMuY3VsdHVyZSlcbiAgICAgICAgICAgIC5zdWJzdHJpbmcoMSwgMik7XG4gICAgfVxuXG4gICAgY2hhbmdlRGVjaW1hbFNlcGFyYXRvcldoZW5JdHNDb21tYSh2YWx1ZTogc3RyaW5nLCByZXZlcnNlID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvLyBJZiB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgaXMgJywnXG4gICAgICAgIGlmICh0aGlzLmdldERlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJywnKSB7XG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoYXQgdGhlIHZhbHVlIGlzbid0IHN0cmluZy5cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAgICAgICAgIC8vIElmIHJldmVyc2UgY2hhbmdlIHRoZSBudW1iZXIgZnJvbSAnLicgdG8gJywnIGVsc2UgZG8gdGhlIG9wcG9zaXRlLlxuICAgICAgICAgICAgdmFsdWUgPSByZXZlcnNlID8gdmFsdWUucmVwbGFjZSgnLicsICcsJykgOiB2YWx1ZS5yZXBsYWNlKCcsJywgJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpc0VxdWFsTnVtYmVyKG51bWJlckFzU3RyaW5nOiBzdHJpbmcsIG51bWJlckFzU3RyaW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KG51bWJlckFzU3RyaW5nKTtcbiAgICAgICAgY29uc3QgbnVtYmVyMiA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KG51bWJlckFzU3RyaW5nMik7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gbnVtYmVyMjtcbiAgICB9XG59XG4iXX0=
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL3NyYy9jb3JlL2NvbW1vbi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU1yRCxNQUFNLE9BQU8sbUJBQW1CO0lBRzVCLFlBQWdDLFlBQThCLElBQUk7UUFBbEMsY0FBUyxHQUFULFNBQVMsQ0FBeUI7UUFGMUQsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUd0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxPQUFPLENBQUM7UUFFbEUsUUFBUTtRQUNSLGdFQUFnRTtRQUNoRSxhQUFhO0lBQ2pCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsYUFBYSxHQUFHLENBQUM7UUFDMUQsbURBQW1EO1FBQ25ELElBQUksS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsaUZBQWlGO1lBQ2pGLEtBQUssR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsc0ZBQXNGO1NBQ3pGO1FBRUQsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCwrREFBK0Q7SUFDdkQsT0FBTyxDQUFDLFlBQW9CO1FBQ2hDLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtTQUMzQztRQUVELE9BQU87WUFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzlDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQzlDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzdDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUk7U0FDaEQsQ0FBQTtJQUNMLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQscUVBQXFFO0lBQ3JFLDJFQUEyRTtJQUNuRSxPQUFPLENBQUMsS0FBYSxFQUFFLE1BQU0sR0FBRyxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFBO1FBRXBCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUMxQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUE7UUFFWixJQUFJLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQzlCLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRTNDLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztJQUVPLHlCQUF5QixDQUFDLGNBQXNCO1FBQ3BELElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUVoQixJQUFJLGNBQWMsSUFBSSxHQUFHO1lBQ3JCLGNBQWMsSUFBSSxHQUFHO1lBQ3JCLGNBQWMsSUFBSSxJQUFJO1lBQ3RCLGNBQWMsSUFBSSxJQUFJO1lBQ3RCLGNBQWMsSUFBSSxLQUFLO1lBQ3ZCLGNBQWMsSUFBSSxJQUFJO1lBQ3RCLGNBQWMsSUFBSSxLQUFLLEVBQUU7WUFDekIsR0FBRyxHQUFHLElBQUksQ0FBQztTQUNkO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sd0JBQXdCLENBQUMsS0FBYSxFQUFFLGlCQUF5QjtRQUNyRSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsaUJBQWlCLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFcEQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDbEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRS9DLGdEQUFnRDtZQUNoRCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6RCxJQUFJO1lBRUosR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztTQUN2RjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFlLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDekMsSUFBSSxNQUFNLEdBQVMsSUFBSSxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTtZQUNoQixNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0Isa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUNYLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDekM7Z0JBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0U7YUFDSjtpQkFBTTtnQkFDSCxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQ2IsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUM1RSxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDbkY7U0FDSjtRQUNELElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFVLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDeEMsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLFVBQVUsRUFBRTtnQkFDWixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjthQUNqRDtpQkFBTTtnQkFDSCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNsQixHQUFHLEVBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFDbkIsR0FBRyxFQUNILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FDakIsQ0FBQztnQkFDRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUI7U0FDSjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUNyQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUM7UUFDcEMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVc7UUFDcEIsSUFBSTtZQUNBLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHVCQUF1QixDQUFDLFFBQVEsRUFBRSxVQUFrQjtRQUNoRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLDhCQUE4QjtRQUM5QixxQkFBcUI7UUFDckIsSUFBSSxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixHQUFHLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDLENBQUM7U0FDekU7UUFDRCxPQUFPLENBQ0gsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDeEIsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxNQUFNLENBQUMsQ0FDakUsQ0FBQztJQUNOLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsYUFBYSxDQUFDLEtBQVUsRUFBRSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQztRQUNsRSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUN6RyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsZ0VBQWdFO1lBQ2hFLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZDLEtBQUssRUFBRSxTQUFTO2dCQUNoQixxQkFBcUIsRUFBRSxpQkFBaUIsSUFBSSxDQUFDO2dCQUM3QyxxQkFBcUIsRUFBRSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQzthQUM3RSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsY0FBYyxDQUFDLEtBQVUsRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixHQUFHLENBQUMsRUFBRSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLElBQUk7UUFDMUcsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWIsNkNBQTZDO1FBQzdDLDJGQUEyRjtRQUMzRixtQkFBbUI7UUFDbkIsV0FBVztRQUNQLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxNQUFNLFlBQVksR0FBRztZQUNqQixxQkFBcUI7WUFDckIsOEJBQThCO1lBQzlCLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLHFCQUFxQixFQUFFLGlCQUFpQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixJQUFJLENBQUMsQ0FBQztZQUMvRSxxQkFBcUIsRUFBRSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQztTQUM3RSxDQUFDO1FBRUYsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2QsK0VBQStFO1lBQy9FLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckU7YUFBTTtZQUNILG1GQUFtRjtZQUNuRixHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixHQUFHLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLElBQUksR0FBRyxFQUFFLENBQUE7U0FDM0c7UUFDTCxJQUFJO1FBRUosT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGFBQWEsQ0FBQyxLQUFVLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsSUFBSTtRQUN0RixpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSw4RUFBOEU7UUFDOUUsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsOEVBQThFO1FBRTlFLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRCwwQ0FBMEM7UUFFMUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2QsT0FBTyxHQUFHLENBQUM7U0FDZDthQUFNO1lBQ0gsd0RBQXdEO1lBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxXQUFXLEVBQUUsV0FBVztnQkFDeEIscUJBQXFCLEVBQUUsaUJBQWlCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2dCQUMvRSxxQkFBcUIsRUFBRSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQzthQUM3RSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWxCLGtEQUFrRDtZQUVsRCxPQUFPLEdBQUcsQ0FBQztTQUNkO0lBQ0wsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxZQUFZLENBQUMsS0FBVSxFQUFFLFdBQVcsR0FBRyxJQUFJO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRCxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDZCxPQUFPLEdBQUcsQ0FBQztTQUNkO2FBQU07WUFDSCx3REFBd0Q7WUFDeEQsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDdkMsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hCLHFCQUFxQixFQUFFLENBQUM7YUFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNwQjtJQUNMLENBQUM7SUFFRDs7Ozs7O01BTUU7SUFDRixjQUFjLENBQUMsS0FBSyxFQUFFLFVBQXdFLEVBQUU7UUFDNUYsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPLEtBQUssQ0FBQztTQUNoQjthQUFNO1lBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9DLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksY0FBYyxDQUFDO1lBQ3JELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsTUFBTSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDMUI7WUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV4QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ1IsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUE7YUFDckc7WUFFRCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUE7YUFDNUc7WUFFRCxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFBO1NBQ2hGO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFVO1FBQ3RCLElBQUksV0FBVyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVU7UUFDdEIsSUFBSSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxtQkFBbUI7UUFDZixNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztRQUV2QyxPQUFPLDBCQUEwQjthQUM1QixjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUM1QixTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQ0FBa0MsQ0FBQyxLQUFhLEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDN0Qsa0NBQWtDO1FBQ2xDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssR0FBRyxFQUFFO1lBQ3BDLHVDQUF1QztZQUN2QyxLQUFLLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUVoQyxxRUFBcUU7WUFDckUsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGFBQWEsQ0FBQyxjQUFzQixFQUFFLGVBQXVCO1FBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUQsT0FBTyxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQzlCLENBQUM7O2dIQXhWUSxtQkFBbUI7b0hBQW5CLG1CQUFtQixjQUZoQixNQUFNOzJGQUVULG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUlnQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHksIF9pc051bWJlclZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBmb3JtYXROdW1iZXIsIGZvcm1hdFBlcmNlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwVXRpbGl0aWVzU2VydmljZSB7XG4gICAgcHJpdmF0ZSBjdWx0dXJlID0gJ2VuLVVTJztcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlID0gbnVsbCkge1xuICAgICAgICB0aGlzLmN1bHR1cmUgPSB0aGlzLnRyYW5zbGF0ZT8uZ2V0QnJvd3NlckN1bHR1cmVMYW5nKCkgfHwgJ2VuLVVTJztcblxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgaW1wb3J0KGBAYW5ndWxhci9jb21tb24vbG9jYWxlcy9nbG9iYWwvJHt0aGlzLmN1bHR1cmV9YCk7XG4gICAgICAgIC8vIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZTogc3RyaW5nLCBmYWxsYmFja1ZhbHVlID0gMCk6IG51bWJlciB7XG4gICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyAnLCcgY2hhbmdlIGl0IHRvICcuJ1xuICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyAnLCcgY2hhbmdlIGl0IHRvICcuJyBmb3IgbGV0IHRoZSBmb3JtYXR0aW5nIHdvcmtzLlxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNoYW5nZURlY2ltYWxTZXBhcmF0b3JXaGVuSXRzQ29tbWEodmFsdWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NvZXJjZU51bWJlclByb3BlcnR5IGFmdGVyIGNoYW5nZSBkZWNpbWFsIHNlcGFyYXRvciB2YWx1ZSBpcycsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgZmFsbGJhY2tWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcGFyc2UtbXMuXG4gICAgLy8gbW92ZWQgdG8gaW50ZXJuYWwgZnVuY3Rpb24gYmVjYXVzZSBwYXJzZS1tcyBpcyBub3cgcHVyZSBFU00uXG4gICAgcHJpdmF0ZSBwYXJzZU1zKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWlsbGlzZWNvbmRzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBudW1iZXInKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgICAgICAgaG91cnM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICAgICAgICBzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzKSAlIDEwMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcmFmYWVscmluYWxkaS9hZGQtemVyby5cbiAgICAvLyBtb3ZlZCB0byBpbnRlcm5hbCBmdW5jdGlvbiBiL2MgYWRkWmVybyBpcyB1bm1haW50YWluZWQgKDcrIHllYXJzKS5cbiAgICAvLyBzdHJpcHBlZCBvdXQgbmVnYXRpdmUgc2lnbiBsb2dpYyBzaW5jZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIGl0IGVsc2V3aGVyZS5cbiAgICBwcml2YXRlIGFkZFplcm8odmFsdWU6IG51bWJlciwgZGlnaXRzID0gMikge1xuICAgICAgICBkaWdpdHMgPSBkaWdpdHMgfHwgMlxuXG4gICAgICAgIGxldCBzdHIgPSB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgIGxldCBzaXplID0gMFxuXG4gICAgICAgIHNpemUgPSBkaWdpdHMgLSBzdHIubGVuZ3RoICsgMVxuICAgICAgICBzdHIgPSBuZXcgQXJyYXkoc2l6ZSkuam9pbignMCcpLmNvbmNhdChzdHIpXG5cbiAgICAgICAgcmV0dXJuIHN0clxuICAgIH1cblxuICAgIHByaXZhdGUgaXNDdXJyZW5jeVNob3VsZEJlT25SaWdodChjdXJyZW5jeVN5bWJvbDogc3RyaW5nKSB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAoY3VycmVuY3lTeW1ib2wgPT0gXCLigqxcIiB8fFxuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPT0gXCLigqpcIiB8fFxuICAgICAgICAgICAgY3VycmVuY3lTeW1ib2wgPT0gXCJGdFwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcIkvEjVwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcItGA0YPQsVwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcInrFglwiIHx8XG4gICAgICAgICAgICBjdXJyZW5jeVN5bWJvbCA9PSBcImtyLlwiKSB7XG4gICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGN1dFZhbHVlQnlGcmFjdGlvbkRpZ2l0cyh2YWx1ZTogc3RyaW5nLCBtYXhGcmFjdGlvbkRpZ2l0czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlcyA9IHZhbHVlO1xuICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzIHx8IDI7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSB0aGlzLmdldERlY2ltYWxTZXBhcmF0b3IoKTtcblxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZGVjaW1hbFNlcGFyYXRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXJyID0gdmFsdWUuc3BsaXQoZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICAgICAgICAgIC8vIGlmICh2YWx1ZUFyclsxXS5sZW5ndGggPCBtYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgdmFsdWVBcnJbMV0gPSB2YWx1ZUFyclsxXS5wYWRFbmQobWF4RnJhY3Rpb25EaWdpdHMsICcwJyk7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHJlcyA9IGAke3ZhbHVlQXJyWzBdfSR7ZGVjaW1hbFNlcGFyYXRvcn0ke3ZhbHVlQXJyWzFdLnNsaWNlKDAsIG1heEZyYWN0aW9uRGlnaXRzKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwYXJzZURhdGUoZGF0ZVN0cjogc3RyaW5nLCBpc0RhdGVUaW1lID0gZmFsc2UpOiBEYXRlIHtcbiAgICAgICAgbGV0IHJldFZhbDogRGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChkYXRlU3RyICE9PSAnJykge1xuICAgICAgICAgICAgcmV0VmFsID0gbmV3IERhdGUoZGF0ZVN0cik7XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gZGF0ZSB3aXRoIG5vIG9mZnNldC5cbiAgICAgICAgICAgIGlmICghaXNEYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0ZVN0ci5pbmRleE9mKCdUJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHIgPSBkYXRlU3RyLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRleHQgPSBkYXRlU3RyLnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVUZXh0Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGRhdGVUZXh0WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIoZGF0ZVRleHRbMV0pIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKGRhdGVUZXh0WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgMCwgcmV0VmFsLmdldFRpbWV6b25lT2Zmc2V0KCkgKiAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmdldEZ1bGxZZWFyKCksIHJldFZhbC5nZXRNb250aCgpLCByZXRWYWwuZ2V0RGF0ZSgpLCByZXRWYWwuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmdldE1pbnV0ZXMoKSArIHJldFZhbC5nZXRUaW1lem9uZU9mZnNldCgpICogLTEsIHJldFZhbC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwgJiYgaXNOYU4ocmV0VmFsLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdHJpbmdpZnlEYXRlKGRhdGU6IERhdGUsIGlzRGF0ZVRpbWUgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7IC8vIGluY2x1ZGUgLSBvZmZzZXRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICBkYXRlVGV4dC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICctJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgJy0nLFxuICAgICAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUZXh0LmpvaW4oJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNWYWx1ZUh0bWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IFJFR0VYUCA9IC88XFwvP1thLXpdW1xcc1xcU10qPi9pO1xuICAgICAgICByZXMgPSBSRUdFWFAudGVzdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpc0pzb25TdHJpbmcoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIEpTT04ucGFyc2Uoc3RyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFN2Z0VsZW1lbnRGcm9tU3RyaW5nKGRvY3VtZW50LCBzdmdDb250ZW50OiBzdHJpbmcpOiBTVkdFbGVtZW50IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIC8vIGRpdi5jbGFzc05hbWUgPSAnc3ZnLWljb24nO1xuICAgICAgICAvLyBBZGQgY2xhc3Mgc3ZnLWljb25cbiAgICAgICAgaWYgKHN2Z0NvbnRlbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBzdmdDb250ZW50LnJlcGxhY2UoJzxzdmcgJywgJzxzdmcgY2xhc3M9XCJzdmctaWNvblwiICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0UGVyY2VudCh2YWx1ZTogYW55LCBkaWdpdHNJbmZvID0gJzEuMC0yJykge1xuICAgIGZvcm1hdFBlcmNlbnQodmFsdWU6IGFueSwgbWluRnJhY3Rpb25EaWdpdHMgPSAwLCBtYXhGcmFjdGlvbkRpZ2l0cyA9IDIpIHtcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtaW5GcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG4gICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29lcmNlTnVtYmVyUHJvcGVydHkobWF4RnJhY3Rpb25EaWdpdHMsIG51bGwpO1xuXG4gICAgICAgIHZhbHVlID0gdGhpcy5jdXRWYWx1ZUJ5RnJhY3Rpb25EaWdpdHModmFsdWU/LnRvU3RyaW5nKCksIE1hdGgubWF4KG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cykpO1xuICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0UGVyY2VudChudW1iZXIgLyAxMDAsIHRoaXMuY3VsdHVyZSwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiAncGVyY2VudCcsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBtaW5GcmFjdGlvbkRpZ2l0cyB8fCAwLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlciAvIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXRDdXJyZW5jeSh2YWx1ZTogYW55LCBjdXJyZW5jeVNpZ24gPSAnJywgZGlnaXRzSW5mbyA9ICcxLjItMicpIHtcbiAgICBmb3JtYXRDdXJyZW5jeSh2YWx1ZTogYW55LCBjdXJyZW5jeVNpZ24gPSAnJywgbWluRnJhY3Rpb25EaWdpdHMgPSAyLCBtYXhGcmFjdGlvbkRpZ2l0cyA9IDIsIHVzZUdyb3VwaW5nID0gdHJ1ZSkge1xuICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KG1pbkZyYWN0aW9uRGlnaXRzLCBudWxsKTtcbiAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtYXhGcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG5cbiAgICAgICAgbGV0IHJlcyA9ICcnO1xuXG4gICAgICAgIC8vIElmIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyB0aGUgbGFzdCBkaWdpdFxuICAgICAgICAvLyBpZiAodmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5pbmRleE9mKHRoaXMuZ2V0RGVjaW1hbFNlcGFyYXRvcigpKSA9PT0gdmFsdWUubGVuZ3RoIC0xKSB7XG4gICAgICAgIC8vICAgICByZXMgPSB2YWx1ZTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jdXRWYWx1ZUJ5RnJhY3Rpb25EaWdpdHModmFsdWU/LnRvU3RyaW5nKCksIE1hdGgubWF4KG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cykpO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyID0gdGhpcy5wcmVwYXJlTnVtYmVyVG9Gb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbmN5U2lnbjogY3VycmVuY3lTaWduLFxuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uRGlnaXRzIHx8IE1hdGgubWluKDIsIG1heEZyYWN0aW9uRGlnaXRzIHx8IDIpLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfTtcbiAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0Q3VycmVuY3koMCwgdGhpcy5jdWx0dXJlLCBjdXJyZW5jeVNpZ24sIHVuZGVmaW5lZCwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwgc3R5bGVPcHRpb25zKS5mb3JtYXQoMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSwgdGhpcy5jdWx0dXJlLCBjdXJyZW5jeVNpZ24sIHVuZGVmaW5lZCwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwgc3R5bGVPcHRpb25zKS5mb3JtYXQobnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmIChjdXJyZW5jeVNpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuaXNDdXJyZW5jeVNob3VsZEJlT25SaWdodChjdXJyZW5jeVNpZ24pID8gYCR7cmVzfSAke2N1cnJlbmN5U2lnbn1gIDogYCR7Y3VycmVuY3lTaWdufSAke3Jlc31gXG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdERlY2ltYWwodmFsdWU6IGFueSwgZGlnaXRzSW5mbyA9ICcxLjItMicpIHtcbiAgICBmb3JtYXREZWNpbWFsKHZhbHVlOiBhbnksIG1pbkZyYWN0aW9uRGlnaXRzID0gMiwgbWF4RnJhY3Rpb25EaWdpdHMgPSAyLCB1c2VHcm91cGluZyA9IHRydWUpIHtcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eShtaW5GcmFjdGlvbkRpZ2l0cywgbnVsbCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmb3JtYXREZWNpbWFsIG1pbkZyYWN0aW9uRGlnaXRzIHZhbHVlIGlzJywgbWluRnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KG1heEZyYWN0aW9uRGlnaXRzLCBudWxsKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2Zvcm1hdERlY2ltYWwgbWluRnJhY3Rpb25EaWdpdHMgdmFsdWUgaXMnLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG5cbiAgICAgICAgdmFsdWUgPSB0aGlzLmN1dFZhbHVlQnlGcmFjdGlvbkRpZ2l0cyh2YWx1ZT8udG9TdHJpbmcoKSwgTWF0aC5tYXgobWluRnJhY3Rpb25EaWdpdHMsIG1heEZyYWN0aW9uRGlnaXRzKSk7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KHZhbHVlKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdudW1iZXIgdmFsdWUgaXMnLCBudW1iZXIpO1xuXG4gICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmN1bHR1cmUsIGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uRGlnaXRzIHx8IE1hdGgubWluKDIsIG1heEZyYWN0aW9uRGlnaXRzIHx8IDIpLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb25EaWdpdHMgfHwgTWF0aC5tYXgoMiwgbWluRnJhY3Rpb25EaWdpdHMpLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJbnRsLk51bWJlckZvcm1hdCB2YWx1ZSBpcycsIHJlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXROdW1iZXIodmFsdWU6IGFueSwgZGlnaXRzSW5mbyA9ICcxLjAtMCcpOiBzdHJpbmcge1xuICAgIGZvcm1hdE51bWJlcih2YWx1ZTogYW55LCB1c2VHcm91cGluZyA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBmb3JtYXROdW1iZXIodmFsdWUsIHRoaXMuY3VsdHVyZSwgZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VsdHVyZSwge1xuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB1c2VHcm91cGluZyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAwLFxuICAgICAgICAgICAgfSkuZm9ybWF0KG51bWJlcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBudW1iZXIgaW4gbWlsbGlzZWNvbmRzIHRvIGEgc3RhbmRhcmQgZHVyYXRpb24gc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGVMb2FkZXJPcHRpb25zIC0gZm9ybWF0RHVyYXRpb24gb3B0aW9ucyBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW1vdGVMb2FkZXJPcHRpb25zLmxlYWRpbmc9ZmFsc2VdIC0gYWRkIGxlYWRpbmcgemVyb1xuICAgICAqIEByZXR1cm5zIHN0cmluZyAtIGZvcm1hdHRlZCBkdXJhdGlvbiBzdHJpbmdcbiAgICAqL1xuICAgIGZvcm1hdER1cmF0aW9uKHZhbHVlLCBvcHRpb25zOiB7IGxlYWRpbmc/OiBib29sZWFuLCBkdXJhdGlvbj86ICdtaWxsaXNlY29uZHMnIHwgJ3NlY29uZHMnIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGlzTnVtYmVyID0gX2lzTnVtYmVyVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIGlmICghaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBudW1iZXIgPSB0aGlzLnByZXBhcmVOdW1iZXJUb0Zvcm1hdCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRpbmcgPSBvcHRpb25zPy5sZWFkaW5nIHx8IHRydWU7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG9wdGlvbnM/LmR1cmF0aW9uIHx8ICdtaWxsaXNlY29uZHMnO1xuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09PSAnc2Vjb25kcycpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMDAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1bnNpZ25lZE1zID0gbnVtYmVyIDwgMCA/IC1udW1iZXIgOiBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCBzaWduID0gbnVtYmVyIDw9IC0xMDAwID8gJy0nIDogJyc7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wYXJzZU1zKHVuc2lnbmVkTXMpO1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMuYWRkWmVybyh0LnNlY29uZHMpO1xuXG4gICAgICAgICAgICBpZiAodC5kYXlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyB0LmRheXMgKyAnOicgKyB0aGlzLmFkZFplcm8odC5ob3VycykgKyAnOicgKyB0aGlzLmFkZFplcm8odC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQuaG91cnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArIChsZWFkaW5nID8gdGhpcy5hZGRaZXJvKHQuaG91cnMpIDogdC5ob3VycykgKyAnOicgKyB0aGlzLmFkZFplcm8odC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyAobGVhZGluZyA/IHRoaXMuYWRkWmVybyh0Lm1pbnV0ZXMpIDogdC5taW51dGVzKSArICc6JyArIHNlY29uZHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluY3JlbWVudE51bWJlcih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG51bWJlclZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIDApO1xuICAgICAgICByZXR1cm4gKCsrbnVtYmVyVmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50TnVtYmVyKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbnVtYmVyVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSwgMCk7XG4gICAgICAgIHJldHVybiAoLS1udW1iZXJWYWx1ZSkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBnZXREZWNpbWFsU2VwYXJhdG9yKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG51bWJlcldpdGhEZWNpbWFsU2VwYXJhdG9yID0gMS4xO1xuXG4gICAgICAgIHJldHVybiBudW1iZXJXaXRoRGVjaW1hbFNlcGFyYXRvclxuICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKHRoaXMuY3VsdHVyZSlcbiAgICAgICAgICAgIC5zdWJzdHJpbmcoMSwgMik7XG4gICAgfVxuXG4gICAgY2hhbmdlRGVjaW1hbFNlcGFyYXRvcldoZW5JdHNDb21tYSh2YWx1ZTogc3RyaW5nLCByZXZlcnNlID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvLyBJZiB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgaXMgJywnXG4gICAgICAgIGlmICh0aGlzLmdldERlY2ltYWxTZXBhcmF0b3IoKSA9PT0gJywnKSB7XG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoYXQgdGhlIHZhbHVlIGlzbid0IHN0cmluZy5cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAgICAgICAgIC8vIElmIHJldmVyc2UgY2hhbmdlIHRoZSBudW1iZXIgZnJvbSAnLicgdG8gJywnIGVsc2UgZG8gdGhlIG9wcG9zaXRlLlxuICAgICAgICAgICAgdmFsdWUgPSByZXZlcnNlID8gdmFsdWUucmVwbGFjZSgnLicsICcsJykgOiB2YWx1ZS5yZXBsYWNlKCcsJywgJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpc0VxdWFsTnVtYmVyKG51bWJlckFzU3RyaW5nOiBzdHJpbmcsIG51bWJlckFzU3RyaW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KG51bWJlckFzU3RyaW5nKTtcbiAgICAgICAgY29uc3QgbnVtYmVyMiA9IHRoaXMucHJlcGFyZU51bWJlclRvRm9ybWF0KG51bWJlckFzU3RyaW5nMik7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gbnVtYmVyMjtcbiAgICB9XG59XG4iXX0=