angular-three 2.0.0-beta.21 → 2.0.0-beta.223

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 (109) hide show
  1. package/esm2022/index.mjs +4 -11
  2. package/esm2022/lib/canvas.mjs +81 -156
  3. package/esm2022/lib/directives/args.mjs +6 -6
  4. package/esm2022/lib/directives/common.mjs +15 -14
  5. package/esm2022/lib/directives/parent.mjs +6 -6
  6. package/esm2022/lib/dom/events.mjs +2 -2
  7. package/esm2022/lib/events.mjs +28 -25
  8. package/esm2022/lib/instance.mjs +39 -34
  9. package/esm2022/lib/loader.mjs +12 -14
  10. package/esm2022/lib/loop.mjs +9 -10
  11. package/esm2022/lib/portal.mjs +122 -135
  12. package/esm2022/lib/ref.mjs +18 -20
  13. package/esm2022/lib/renderer/catalogue.mjs +2 -2
  14. package/esm2022/lib/renderer/constants.mjs +2 -2
  15. package/esm2022/lib/renderer/index.mjs +58 -62
  16. package/esm2022/lib/renderer/store.mjs +129 -120
  17. package/esm2022/lib/renderer/utils.mjs +35 -42
  18. package/esm2022/lib/roots.mjs +41 -38
  19. package/esm2022/lib/routed-scene.mjs +6 -7
  20. package/esm2022/lib/store.mjs +163 -189
  21. package/esm2022/lib/utils/apply-props.mjs +12 -17
  22. package/esm2022/lib/utils/attach.mjs +6 -6
  23. package/esm2022/lib/utils/before-render.mjs +12 -0
  24. package/esm2022/lib/utils/cd-aware-signal.mjs +24 -0
  25. package/esm2022/lib/utils/create-api-token.mjs +13 -0
  26. package/esm2022/lib/utils/is.mjs +6 -5
  27. package/esm2022/lib/utils/make.mjs +15 -12
  28. package/esm2022/lib/utils/signal-store.mjs +67 -57
  29. package/esm2022/lib/utils/update.mjs +3 -2
  30. package/fesm2022/angular-three.mjs +1621 -1795
  31. package/fesm2022/angular-three.mjs.map +1 -1
  32. package/index.d.ts +6 -10
  33. package/lib/canvas.d.ts +24 -37
  34. package/lib/directives/common.d.ts +12 -1
  35. package/lib/events.d.ts +2 -2
  36. package/lib/instance.d.ts +19 -10
  37. package/lib/loader.d.ts +13 -4
  38. package/lib/loop.d.ts +6 -29
  39. package/lib/portal.d.ts +18 -26
  40. package/lib/ref.d.ts +0 -1
  41. package/lib/renderer/catalogue.d.ts +5 -1
  42. package/lib/renderer/constants.d.ts +1 -1
  43. package/lib/renderer/index.d.ts +55 -4
  44. package/lib/renderer/store.d.ts +18 -21
  45. package/lib/renderer/utils.d.ts +2 -3
  46. package/lib/roots.d.ts +4 -3
  47. package/lib/store.d.ts +9 -11
  48. package/lib/utils/apply-props.d.ts +0 -1
  49. package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
  50. package/lib/utils/cd-aware-signal.d.ts +4 -0
  51. package/lib/utils/create-api-token.d.ts +23 -0
  52. package/lib/utils/is.d.ts +11 -12
  53. package/lib/utils/make.d.ts +3 -2
  54. package/lib/utils/signal-store.d.ts +16 -3
  55. package/metadata.json +1 -1
  56. package/package.json +30 -11
  57. package/plugin/generators.json +0 -32
  58. package/plugin/src/generators/init/compat.d.ts +1 -3
  59. package/plugin/src/generators/init/files/experience/{experience.component.ts.__tmpl__ → experience.component.ts__tmpl__} +1 -0
  60. package/plugin/src/generators/init/generator.d.ts +2 -5
  61. package/plugin/src/generators/init/generator.js +94 -95
  62. package/plugin/src/generators/init/generator.js.map +1 -1
  63. package/plugin/src/generators/init/schema.json +1 -12
  64. package/plugin/src/generators/utils.js.map +1 -1
  65. package/plugin/src/generators/{versions.d.ts → version.d.ts} +5 -3
  66. package/plugin/src/generators/version.js +18 -0
  67. package/plugin/src/generators/version.js.map +1 -0
  68. package/plugin/src/index.d.ts +0 -3
  69. package/plugin/src/index.js +0 -9
  70. package/plugin/src/index.js.map +1 -1
  71. package/web-types.json +1 -1
  72. package/esm2022/lib/before-render.mjs +0 -13
  73. package/esm2022/lib/directives/key.mjs +0 -29
  74. package/esm2022/lib/directives/repeat.mjs +0 -17
  75. package/esm2022/lib/three-types.mjs +0 -2
  76. package/esm2022/lib/utils/assert-injection-context.mjs +0 -14
  77. package/esm2022/lib/utils/create-injection-token.mjs +0 -47
  78. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
  79. package/lib/directives/key.d.ts +0 -10
  80. package/lib/directives/repeat.d.ts +0 -7
  81. package/lib/three-types.d.ts +0 -306
  82. package/lib/utils/assert-injection-context.d.ts +0 -2
  83. package/lib/utils/create-injection-token.d.ts +0 -27
  84. package/lib/utils/safe-detect-changes.d.ts +0 -2
  85. package/plugin/package.json +0 -6
  86. package/plugin/src/generators/init-cannon/compat.d.ts +0 -2
  87. package/plugin/src/generators/init-cannon/compat.js +0 -6
  88. package/plugin/src/generators/init-cannon/compat.js.map +0 -1
  89. package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
  90. package/plugin/src/generators/init-cannon/generator.js +0 -22
  91. package/plugin/src/generators/init-cannon/generator.js.map +0 -1
  92. package/plugin/src/generators/init-cannon/schema.json +0 -6
  93. package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
  94. package/plugin/src/generators/init-postprocessing/compat.js +0 -6
  95. package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
  96. package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
  97. package/plugin/src/generators/init-postprocessing/generator.js +0 -20
  98. package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
  99. package/plugin/src/generators/init-postprocessing/schema.json +0 -6
  100. package/plugin/src/generators/init-soba/compat.d.ts +0 -2
  101. package/plugin/src/generators/init-soba/compat.js +0 -6
  102. package/plugin/src/generators/init-soba/compat.js.map +0 -1
  103. package/plugin/src/generators/init-soba/generator.d.ts +0 -2
  104. package/plugin/src/generators/init-soba/generator.js +0 -26
  105. package/plugin/src/generators/init-soba/generator.js.map +0 -1
  106. package/plugin/src/generators/init-soba/schema.json +0 -6
  107. package/plugin/src/generators/versions.js +0 -16
  108. package/plugin/src/generators/versions.js.map +0 -1
  109. /package/plugin/src/generators/init/files/experience/{experience.component.html.__tmpl__ → experience.component.html__tmpl__} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectorRef, Injectable, Injector, NgZone, RendererFactory2, effect, getDebugNode, inject, makeEnvironmentProviders, provideZoneChangeDetection, signal, untracked, } from '@angular/core';
2
+ import { Injectable, Injector, RendererFactory2, effect, getDebugNode, inject, makeEnvironmentProviders, provideZoneChangeDetection, } from '@angular/core';
3
3
  import { getLocalState, prepare } from '../instance';
4
4
  import { injectNgtStore, provideNgtStore } from '../store';
5
5
  import { is } from '../utils/is';
@@ -8,66 +8,56 @@ import { HTML, ROUTED_SCENE, SPECIAL_DOM_TAG } from './constants';
8
8
  import { NGT_COMPOUND_PREFIXES, NgtRendererStore } from './store';
9
9
  import { NgtCompoundClassId, NgtRendererClassId, attachThreeChild, kebabToPascal, processThreeEvent, removeThreeChild, } from './utils';
10
10
  import * as i0 from "@angular/core";
11
- class NgtRendererFactory {
11
+ export class NgtRendererFactory {
12
12
  constructor() {
13
13
  this.delegateRendererFactory = inject(RendererFactory2, { skipSelf: true });
14
- this.zone = inject(NgZone);
15
14
  this.catalogue = injectNgtCatalogue();
16
- this.cdr = inject(ChangeDetectorRef);
17
15
  this.rendererMap = new Map();
18
16
  this.routedSet = new Set();
19
- // all Renderer instances share the same Store
17
+ // NOTE: all Renderer instances under the same NgtCanvas share the same Store
20
18
  this.rendererStore = new NgtRendererStore({
21
- portals: [],
22
19
  store: injectNgtStore(),
23
20
  compoundPrefixes: inject(NGT_COMPOUND_PREFIXES),
24
21
  document: inject(DOCUMENT),
25
22
  });
26
23
  }
27
24
  createRenderer(hostElement, type) {
28
- const delegate = this.delegateRendererFactory.createRenderer(hostElement, type);
25
+ const delegateRenderer = this.delegateRendererFactory.createRenderer(hostElement, type);
29
26
  if (!type)
30
- return delegate;
31
- // TODO: handle html in canvas
27
+ return delegateRenderer;
28
+ // NOTE: might need to revisit this
32
29
  if (type['type'][HTML]) {
33
- this.rendererMap.set(type.id, delegate);
34
- return delegate;
30
+ this.rendererMap.set(type.id, delegateRenderer);
31
+ return delegateRenderer;
35
32
  }
36
33
  if (type['type'][ROUTED_SCENE]) {
37
34
  this.routedSet.add(type.id);
38
35
  }
39
36
  let renderer = this.rendererMap.get(type.id);
40
37
  if (!renderer) {
41
- renderer = new NgtRenderer(delegate, this.rendererStore, this.catalogue, this.zone, this.cdr,
38
+ this.rendererMap.set(type.id, (renderer = new NgtRenderer(delegateRenderer, this.rendererStore, this.catalogue,
42
39
  // setting root scene if there's no routed scene OR this component is the routed Scene
43
- !hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)));
44
- this.rendererMap.set(type.id, renderer);
40
+ !hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)))));
45
41
  }
46
42
  return renderer;
47
43
  }
48
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
49
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory }); }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: NgtRendererFactory }); }
50
46
  }
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtRendererFactory, decorators: [{
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: NgtRendererFactory, decorators: [{
52
48
  type: Injectable
53
49
  }] });
54
- /**
55
- * Anything abbreviated with rS/RS stands for RendererState
56
- */
57
- class NgtRenderer {
58
- constructor(delegate, store, catalogue, zone, cdr, root = true) {
50
+ export class NgtRenderer {
51
+ constructor(delegate, store, catalogue, isRoot = true) {
59
52
  this.delegate = delegate;
60
53
  this.store = store;
61
54
  this.catalogue = catalogue;
62
- this.zone = zone;
63
- this.cdr = cdr;
64
- this.root = root;
55
+ this.isRoot = isRoot;
65
56
  this.createText = this.delegate.createText.bind(this.delegate);
66
57
  this.destroy = this.delegate.destroy.bind(this.delegate);
67
58
  this.destroyNode = null;
68
59
  this.selectRootElement = this.delegate.selectRootElement.bind(this.delegate);
69
60
  this.nextSibling = this.delegate.nextSibling.bind(this.delegate);
70
- this.removeAttribute = this.delegate.removeAttribute.bind(this.delegate);
71
61
  this.addClass = this.delegate.addClass.bind(this.delegate);
72
62
  this.removeClass = this.delegate.removeClass.bind(this.delegate);
73
63
  this.setStyle = this.delegate.setStyle.bind(this.delegate);
@@ -77,41 +67,37 @@ class NgtRenderer {
77
67
  createElement(name, namespace) {
78
68
  const element = this.delegate.createElement(name, namespace);
79
69
  // on first pass, we return the Root Scene as the root node
80
- if (this.root) {
81
- this.root = false;
70
+ if (this.isRoot) {
71
+ this.isRoot = false;
82
72
  const node = this.store.createNode('three', this.store.rootScene);
83
- node.__ngt_renderer__[NgtRendererClassId.injectorFactory] = () => getDebugNode(element).injector;
73
+ node.__ngt_renderer__[NgtRendererClassId.injectorFactory] = () => getDebugNode(element)?.injector;
84
74
  return node;
85
75
  }
86
- // handle compound
87
76
  if (this.store.isCompound(name)) {
88
77
  return this.store.createNode('compound', element);
89
78
  }
90
- // handle portal
91
79
  if (name === SPECIAL_DOM_TAG.NGT_PORTAL) {
92
80
  return this.store.createNode('portal', element);
93
81
  }
94
- // handle raw value
95
82
  if (name === SPECIAL_DOM_TAG.NGT_VALUE) {
96
83
  return this.store.createNode('three', Object.assign({ __ngt_renderer__: { rawValue: undefined } },
97
84
  // NOTE: we assign this manually to a raw value node
98
85
  // because we say it is a 'three' node but we're not using prepare()
99
- { __ngt__: { isRaw: true, parent: signal(null) } }));
86
+ { __ngt__: { isRaw: true, parent: () => null } }));
100
87
  }
101
- const { injectedArgs, injectedParent, store } = this.store.getCreationState();
88
+ const [injectedArgs, injectedParent, store] = this.store.getCreationState();
102
89
  let parent = injectedParent;
103
90
  if (typeof injectedParent === 'string') {
104
91
  parent = store
105
92
  .get('scene')
106
93
  .getObjectByName(injectedParent);
107
94
  }
108
- // handle primitive
109
95
  if (name === SPECIAL_DOM_TAG.NGT_PRIMITIVE) {
110
96
  if (!injectedArgs[0])
111
97
  throw new Error(`[NGT] ngt-primitive without args is invalid`);
112
98
  const object = injectedArgs[0];
113
99
  let localState = getLocalState(object);
114
- if (!Object.keys(localState).length) {
100
+ if (!localState) {
115
101
  // NOTE: if an object isn't already "prepared", we prepare it
116
102
  localState = getLocalState(prepare(object, { store, args: injectedArgs, primitive: true }));
117
103
  }
@@ -123,8 +109,7 @@ class NgtRenderer {
123
109
  }
124
110
  return node;
125
111
  }
126
- const threeTag = name.startsWith('ngt') ? name.slice(4) : name;
127
- const threeName = kebabToPascal(threeTag);
112
+ const threeName = kebabToPascal(name.startsWith('ngt') ? name.slice(4) : name);
128
113
  const threeTarget = this.catalogue[threeName];
129
114
  // we have the THREE constructor here, handle it
130
115
  if (threeTarget) {
@@ -172,13 +157,14 @@ class NgtRenderer {
172
157
  }
173
158
  if (cRS?.[NgtRendererClassId.injectedParent]) {
174
159
  if (is.ref(cRS[NgtRendererClassId.injectedParent])) {
175
- const injector = cRS[NgtRendererClassId.injectorFactory]().get(Injector, null);
160
+ const injector = cRS[NgtRendererClassId.injectorFactory]()?.get(Injector, null);
176
161
  if (!injector) {
177
162
  console.warn(`[NGT] NgtRenderer is attempting to start an effect for injectedParent but no Injector is found.`);
178
163
  return;
179
164
  }
180
165
  const watcher = effect(() => {
181
- const injectedParent = cRS[NgtRendererClassId.injectedParent].nativeElement;
166
+ const injectedParent = cRS[NgtRendererClassId.injectedParent]
167
+ .nativeElement;
182
168
  if (injectedParent && injectedParent !== parent) {
183
169
  this.appendChild(injectedParent, newChild);
184
170
  // only run this effect once
@@ -213,8 +199,9 @@ class NgtRenderer {
213
199
  }
214
200
  // if both are three instances, straightforward case
215
201
  if (pRS[NgtRendererClassId.type] === 'three' && cRS?.[NgtRendererClassId.type] === 'three') {
202
+ const cLS = getLocalState(newChild);
216
203
  // if child already attached to a parent, skip
217
- if (getLocalState(newChild).parent && untracked(getLocalState(newChild).parent))
204
+ if (cLS?.instanceStore?.get('parent'))
218
205
  return;
219
206
  // attach THREE child
220
207
  attachThreeChild(parent, newChild);
@@ -229,7 +216,7 @@ class NgtRenderer {
229
216
  }
230
217
  // if only the parent is the THREE instance
231
218
  if (pRS[NgtRendererClassId.type] === 'three') {
232
- for (const renderChild of cRS?.[NgtRendererClassId.children]) {
219
+ for (const renderChild of cRS?.[NgtRendererClassId.children] || []) {
233
220
  this.appendChild(parent, renderChild);
234
221
  }
235
222
  }
@@ -304,23 +291,34 @@ class NgtRenderer {
304
291
  return rS[NgtRendererClassId.parent];
305
292
  return this.delegate.parentNode(node);
306
293
  }
307
- setAttribute(el, name, value, namespace) {
294
+ setAttributeInternal(el, name, value, namespace) {
308
295
  const rS = el.__ngt_renderer__;
309
296
  if (rS[NgtRendererClassId.type] === 'compound') {
310
297
  // we don't have the compound instance yet
311
298
  rS[NgtRendererClassId.attributes][name] = value;
312
299
  if (!rS[NgtRendererClassId.compounded]) {
313
300
  this.store.queueOperation(el, ['op', () => this.setAttribute(el, name, value, namespace)]);
314
- return;
301
+ return false;
315
302
  }
316
- this.setAttribute(rS[NgtRendererClassId.compounded], name, value, namespace);
317
- return;
303
+ return this.setAttributeInternal(rS[NgtRendererClassId.compounded], name, value, namespace);
318
304
  }
319
305
  if (rS[NgtRendererClassId.type] === 'three') {
320
306
  this.store.applyAttribute(el, name, value);
321
- return;
307
+ return false;
308
+ }
309
+ return true;
310
+ }
311
+ setAttribute(el, name, value, namespace) {
312
+ const useDelegate = this.setAttributeInternal(el, name, value, namespace);
313
+ if (useDelegate) {
314
+ this.delegate.setAttribute(el, name, value);
315
+ }
316
+ }
317
+ removeAttribute(el, name, namespace) {
318
+ const useDelegate = this.setAttributeInternal(el, name, undefined, namespace);
319
+ if (useDelegate) {
320
+ this.delegate.removeAttribute(el, name, namespace);
322
321
  }
323
- return this.delegate.setAttribute(el, name, value);
324
322
  }
325
323
  setProperty(el, name, value) {
326
324
  // TODO: should we support ref value
@@ -347,17 +345,16 @@ class NgtRenderer {
347
345
  listen(target, eventName, callback) {
348
346
  const rS = target.__ngt_renderer__;
349
347
  // if the target doesn't have __ngt_renderer__, we delegate
350
- // if target is DOM node, then we pass that to delegate Renderer
348
+ // if target is DOM node, we delegate
351
349
  if (!rS || this.store.isDOM(target)) {
352
350
  return this.delegate.listen(target, eventName, callback);
353
351
  }
354
352
  if (rS[NgtRendererClassId.type] === 'three' ||
355
353
  (rS[NgtRendererClassId.type] === 'compound' && rS[NgtRendererClassId.compounded])) {
356
354
  const instance = rS[NgtRendererClassId.compounded] || target;
357
- const priority = getLocalState(target).priority;
358
- const targetCdr = rS[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null) ||
359
- rS[NgtRendererClassId.parent]?.__ngt_renderer__?.[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null);
360
- return processThreeEvent(instance, priority || 0, eventName, callback, this.zone, this.cdr, targetCdr);
355
+ const localState = getLocalState(instance);
356
+ const priority = localState?.priority ?? 0;
357
+ return processThreeEvent(instance, priority || 0, eventName, callback);
361
358
  }
362
359
  if (rS[NgtRendererClassId.type] === 'compound' && !rS[NgtRendererClassId.compounded]) {
363
360
  this.store.queueOperation(target, [
@@ -385,35 +382,34 @@ class NgtRenderer {
385
382
  const cType = cRS[NgtRendererClassId.type];
386
383
  const isParentCompounded = pRS[NgtRendererClassId.compounded];
387
384
  const isChildCompounded = cRS[NgtRendererClassId.compounded];
385
+ const cLS = getLocalState(child);
388
386
  // if child is three but haven't been attached to a parent yet
389
- const isDanglingThreeChild = cType === 'three' && !untracked(getLocalState(child).parent);
387
+ const isDanglingThreeChild = cType === 'three' && !cLS?.instanceStore?.get('parent');
390
388
  // or both parent and child are DOM elements
391
389
  // or they are compound AND haven't had a THREE instance yet
392
390
  const isParentStillDOM = pType === 'dom' || (pType === 'compound' && !isParentCompounded);
393
391
  const isChildStillDOM = cType === 'dom' || (cType === 'compound' && !isChildCompounded);
394
392
  // and the child is a compounded compound
395
393
  const isCompoundChildCompounded = cType === 'compound' && !!isChildCompounded;
396
- return (isDanglingThreeChild ||
397
- (isParentStillDOM && isChildStillDOM) ||
398
- (isParentStillDOM && isCompoundChildCompounded));
394
+ return (isDanglingThreeChild || (isParentStillDOM && isChildStillDOM) || (isParentStillDOM && isCompoundChildCompounded));
399
395
  }
400
396
  get data() {
401
397
  return this.delegate.data;
402
398
  }
403
399
  }
404
- export function provideNgtRenderer(store, compoundPrefixes, cdr) {
400
+ export function provideNgtRenderer(store, compoundPrefixes) {
405
401
  if (!compoundPrefixes.includes('ngts'))
406
402
  compoundPrefixes.push('ngts');
407
403
  if (!compoundPrefixes.includes('ngtp'))
408
404
  compoundPrefixes.push('ngtp');
409
405
  return makeEnvironmentProviders([
410
- { provide: RendererFactory2, useClass: NgtRendererFactory },
406
+ NgtRendererFactory,
407
+ { provide: RendererFactory2, useExisting: NgtRendererFactory },
411
408
  { provide: NGT_COMPOUND_PREFIXES, useValue: compoundPrefixes },
412
- { provide: ChangeDetectorRef, useValue: cdr },
413
409
  provideNgtStore(store),
414
410
  provideZoneChangeDetection({ runCoalescing: true, eventCoalescing: true }),
415
411
  ]);
416
412
  }
417
413
  export { extend } from './catalogue';
418
- export { HTML } from './constants';
419
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixNQUFNLEVBQ04sU0FBUyxHQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFpQixNQUFNLFVBQVUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBK0MsTUFBTSxTQUFTLENBQUM7QUFDL0csT0FBTyxFQUNOLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2hCLE1BQU0sU0FBUyxDQUFDOztBQUVqQixNQUNNLGtCQUFrQjtJQUR4QjtRQUVTLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIs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QUFDO0tBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0SW5qZWN0YWJsZSxcblx0SW5qZWN0b3IsXG5cdE5nWm9uZSxcblx0UmVuZGVyZXJGYWN0b3J5Mixcblx0ZWZmZWN0LFxuXHRnZXREZWJ1Z05vZGUsXG5cdGluamVjdCxcblx0bWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuXHRwcm92aWRlWm9uZUNoYW5nZURldGVjdGlvbixcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHR5cGUgUmVuZGVyZXIyLFxuXHR0eXBlIFJlbmRlcmVyVHlwZTIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB0eXBlIHsgTmd0SW5qZWN0ZWRSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZSwgdHlwZSBOZ3RTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgeyBpbmplY3ROZ3RDYXRhbG9ndWUsIHR5cGUgTmd0QW55Q29uc3RydWN0b3IgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5pbXBvcnQgeyBIVE1MLCBST1VURURfU0NFTkUsIFNQRUNJQUxfRE9NX1RBRyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5HVF9DT01QT1VORF9QUkVGSVhFUywgTmd0UmVuZGVyZXJTdG9yZSwgdHlwZSBOZ3RSZW5kZXJlck5vZGUsIHR5cGUgTmd0UmVuZGVyZXJTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHtcblx0Tmd0Q29tcG91bmRDbGFzc0lkLFxuXHROZ3RSZW5kZXJlckNsYXNzSWQsXG5cdGF0dGFjaFRocmVlQ2hpbGQsXG5cdGtlYmFiVG9QYXNjYWwsXG5cdHByb2Nlc3NUaHJlZUV2ZW50LFxuXHRyZW1vdmVUaHJlZUNoaWxkLFxufSBmcm9tICcuL3V0aWxzJztcblxuQEluamVjdGFibGUoKVxuY2xhc3MgTmd0UmVuZGVyZXJGYWN0b3J5IGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5MiB7XG5cdHByaXZhdGUgZGVsZWdhdGVSZW5kZXJlckZhY3RvcnkgPSBpbmplY3QoUmVuZGVyZXJGYWN0b3J5MiwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcblx0cHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cdHByaXZhdGUgY2F0YWxvZ3VlID0gaW5qZWN0Tmd0Q2F0YWxvZ3VlKCk7XG5cdHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuXHRwcml2YXRlIHJlbmRlcmVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlbmRlcmVyMj4oKTtcblx0cHJpdmF0ZSByb3V0ZWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXHQvLyBhbGwgUmVuZGVyZXIgaW5zdGFuY2VzIHNoYXJlIHRoZSBzYW1lIFN0b3JlXG5cdHByaXZhdGUgcmVuZGVyZXJTdG9yZSA9IG5ldyBOZ3RSZW5kZXJlclN0b3JlKHtcblx0XHRwb3J0YWxzOiBbXSxcblx0XHRzdG9yZTogaW5qZWN0Tmd0U3RvcmUoKSxcblx0XHRjb21wb3VuZFByZWZpeGVzOiBpbmplY3QoTkdUX0NPTVBPVU5EX1BSRUZJWEVTKSxcblx0XHRkb2N1bWVudDogaW5qZWN0KERPQ1VNRU5UKSxcblx0fSk7XG5cblx0Y3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQ6IGFueSwgdHlwZTogUmVuZGVyZXJUeXBlMiB8IG51bGwpOiBSZW5kZXJlcjIge1xuXHRcdGNvbnN0IGRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZVJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihob3N0RWxlbWVudCwgdHlwZSk7XG5cdFx0aWYgKCF0eXBlKSByZXR1cm4gZGVsZWdhdGU7XG5cdFx0Ly8gVE9ETzogaGFuZGxlIGh0bWwgaW4gY2FudmFzXG5cdFx0aWYgKCh0eXBlIGFzIE5ndEFueVJlY29yZClbJ3R5cGUnXVtIVE1MXSkge1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgZGVsZWdhdGUpO1xuXHRcdFx0cmV0dXJuIGRlbGVnYXRlO1xuXHRcdH1cblx0XHRpZiAoKHR5cGUgYXMgTmd0QW55UmVjb3JkKVsndHlwZSddW1JPVVRFRF9TQ0VORV0pIHtcblx0XHRcdHRoaXMucm91dGVkU2V0LmFkZCh0eXBlLmlkKTtcblx0XHR9XG5cblx0XHRsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyTWFwLmdldCh0eXBlLmlkKTtcblxuXHRcdGlmICghcmVuZGVyZXIpIHtcblx0XHRcdHJlbmRlcmVyID0gbmV3IE5ndFJlbmRlcmVyKFxuXHRcdFx0XHRkZWxlZ2F0ZSxcblx0XHRcdFx0dGhpcy5yZW5kZXJlclN0b3JlLFxuXHRcdFx0XHR0aGlzLmNhdGFsb2d1ZSxcblx0XHRcdFx0dGhpcy56b25lLFxuXHRcdFx0XHR0aGlzLmNkcixcblx0XHRcdFx0Ly8gc2V0dGluZyByb290IHNjZW5lIGlmIHRoZXJlJ3Mgbm8gcm91dGVkIHNjZW5lIE9SIHRoaXMgY29tcG9uZW50IGlzIHRoZSByb3V0ZWQgU2NlbmVcblx0XHRcdFx0IWhvc3RFbGVtZW50ICYmICh0aGlzLnJvdXRlZFNldC5zaXplID09PSAwIHx8IHRoaXMucm91dGVkU2V0Lmhhcyh0eXBlLmlkKSksXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgcmVuZGVyZXIpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVuZGVyZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBBbnl0aGluZyBhYmJyZXZpYXRlZCB3aXRoIHJTL1JTIHN0YW5kcyBmb3IgUmVuZGVyZXJTdGF0ZVxuICovXG5jbGFzcyBOZ3RSZW5kZXJlciBpbXBsZW1lbnRzIFJlbmRlcmVyMiB7XG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgZGVsZWdhdGU6IFJlbmRlcmVyMixcblx0XHRwcml2YXRlIHN0b3JlOiBOZ3RSZW5kZXJlclN0b3JlLFxuXHRcdHByaXZhdGUgY2F0YWxvZ3VlOiBSZWNvcmQ8c3RyaW5nLCBOZ3RBbnlDb25zdHJ1Y3Rvcj4sXG5cdFx0cHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG5cdFx0cHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdHByaXZhdGUgcm9vdCA9IHRydWUsXG5cdCkge31cblxuXHRjcmVhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTtcblxuXHRcdC8vIG9uIGZpcnN0IHBhc3MsIHdlIHJldHVybiB0aGUgUm9vdCBTY2VuZSBhcyB0aGUgcm9vdCBub2RlXG5cdFx0aWYgKHRoaXMucm9vdCkge1xuXHRcdFx0dGhpcy5yb290ID0gZmFsc2U7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMuc3RvcmUucm9vdFNjZW5lKTtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KSEuaW5qZWN0b3I7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgY29tcG91bmRcblx0XHRpZiAodGhpcy5zdG9yZS5pc0NvbXBvdW5kKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21wb3VuZCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSBwb3J0YWxcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QT1JUQUwpIHtcblx0XHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3BvcnRhbCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByYXcgdmFsdWVcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9WQUxVRSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZShcblx0XHRcdFx0J3RocmVlJyxcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7IF9fbmd0X3JlbmRlcmVyX186IHsgcmF3VmFsdWU6IHVuZGVmaW5lZCB9IH0sXG5cdFx0XHRcdFx0Ly8gTk9URTogd2UgYXNzaWduIHRoaXMgbWFudWFsbHkgdG8gYSByYXcgdmFsdWUgbm9kZVxuXHRcdFx0XHRcdC8vIGJlY2F1c2Ugd2Ugc2F5IGl0IGlzIGEgJ3RocmVlJyBub2RlIGJ1dCB3ZSdyZSBub3QgdXNpbmcgcHJlcGFyZSgpXG5cdFx0XHRcdFx0eyBfX25ndF9fOiB7IGlzUmF3OiB0cnVlLCBwYXJlbnQ6IHNpZ25hbChudWxsKSB9IH0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfSA9IHRoaXMuc3RvcmUuZ2V0Q3JlYXRpb25TdGF0ZSgpO1xuXG5cdFx0bGV0IHBhcmVudCA9IGluamVjdGVkUGFyZW50IGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHRpZiAodHlwZW9mIGluamVjdGVkUGFyZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cGFyZW50ID0gc3RvcmVcblx0XHRcdFx0LmdldCgnc2NlbmUnKVxuXHRcdFx0XHQuZ2V0T2JqZWN0QnlOYW1lKGluamVjdGVkUGFyZW50KSBhcyB1bmtub3duIGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgcHJpbWl0aXZlXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfRE9NX1RBRy5OR1RfUFJJTUlUSVZFKSB7XG5cdFx0XHRpZiAoIWluamVjdGVkQXJnc1swXSkgdGhyb3cgbmV3IEVycm9yKGBbTkdUXSBuZ3QtcHJpbWl0aXZlIHdpdGhvdXQgYXJncyBpcyBpbnZhbGlkYCk7XG5cdFx0XHRjb25zdCBvYmplY3QgPSBpbmplY3RlZEFyZ3NbMF07XG5cdFx0XHRsZXQgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUob2JqZWN0KTtcblx0XHRcdGlmICghT2JqZWN0LmtleXMobG9jYWxTdGF0ZSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIE5PVEU6IGlmIGFuIG9iamVjdCBpc24ndCBhbHJlYWR5IFwicHJlcGFyZWRcIiwgd2UgcHJlcGFyZSBpdFxuXHRcdFx0XHRsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwcmVwYXJlKG9iamVjdCwgeyBzdG9yZSwgYXJnczogaW5qZWN0ZWRBcmdzLCBwcmltaXRpdmU6IHRydWUgfSkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFsb2NhbFN0YXRlLnN0b3JlKSBsb2NhbFN0YXRlLnN0b3JlID0gc3RvcmU7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIG9iamVjdCk7XG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGhyZWVUYWcgPSBuYW1lLnN0YXJ0c1dpdGgoJ25ndCcpID8gbmFtZS5zbGljZSg0KSA6IG5hbWU7XG5cdFx0Y29uc3QgdGhyZWVOYW1lID0ga2ViYWJUb1Bhc2NhbCh0aHJlZVRhZyk7XG5cdFx0Y29uc3QgdGhyZWVUYXJnZXQgPSB0aGlzLmNhdGFsb2d1ZVt0aHJlZU5hbWVdO1xuXHRcdC8vIHdlIGhhdmUgdGhlIFRIUkVFIGNvbnN0cnVjdG9yIGhlcmUsIGhhbmRsZSBpdFxuXHRcdGlmICh0aHJlZVRhcmdldCkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBwcmVwYXJlKG5ldyB0aHJlZVRhcmdldCguLi5pbmplY3RlZEFyZ3MpLCB7IHN0b3JlLCBhcmdzOiBpbmplY3RlZEFyZ3MgfSk7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIGluc3RhbmNlKTtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcblxuXHRcdFx0Ly8gYXV0by1hdHRhY2ggZm9yIGdlb21ldHJ5IGFuZCBtYXRlcmlhbFxuXHRcdFx0aWYgKGlzLmdlb21ldHJ5KGluc3RhbmNlKSkge1xuXHRcdFx0XHRsb2NhbFN0YXRlLmF0dGFjaCA9IFsnZ2VvbWV0cnknXTtcblx0XHRcdH0gZWxzZSBpZiAoaXMubWF0ZXJpYWwoaW5zdGFuY2UpKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuYXR0YWNoID0gWydtYXRlcmlhbCddO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50KTtcblx0fVxuXG5cdGNyZWF0ZUNvbW1lbnQodmFsdWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ2NvbW1lbnQnLCB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpKTtcblx0fVxuXG5cdGFwcGVuZENoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlKTogdm9pZCB7XG5cdFx0Y29uc3QgcFJTID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX187XG5cdFx0Y29uc3QgY1JTID0gbmV3Q2hpbGQuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChcblx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nICYmXG5cdFx0XHQobmV3Q2hpbGQgaW5zdGFuY2VvZiBUZXh0IHx8IGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5zdG9yZS5hZGRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdHRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0UGFyZW50KG5ld0NoaWxkLCBwYXJlbnQpO1xuXHRcdFx0XHRpZiAodGhpcy5zaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlMsIGNSUywgbmV3Q2hpbGQpKSB7XG5cdFx0XHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0XHRcdGNvbnN0IGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlID0gdGhpcy5zdG9yZS5nZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKHBhcmVudCk7XG5cdFx0XHRcdFx0aWYgKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlKSB0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlLCBuZXdDaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0dGhpcy5zdG9yZS5zZXRQYXJlbnQobmV3Q2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pIHtcblx0XHRcdGlmIChpcy5yZWYoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pKSB7XG5cdFx0XHRcdGNvbnN0IGluamVjdG9yID0gY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCkuZ2V0KEluamVjdG9yLCBudWxsKTtcblx0XHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdGBbTkdUXSBOZ3RSZW5kZXJlciBpcyBhdHRlbXB0aW5nIHRvIHN0YXJ0IGFuIGVmZmVjdCBmb3IgaW5qZWN0ZWRQYXJlbnQgYnV0IG5vIEluamVjdG9yIGlzIGZvdW5kLmAsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGVmZmVjdChcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbmplY3RlZFBhcmVudCA9IChcblx0XHRcdFx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0gYXMgTmd0SW5qZWN0ZWRSZWY8Tmd0UmVuZGVyZXJOb2RlPlxuXHRcdFx0XHRcdFx0KS5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRcdFx0aWYgKGluamVjdGVkUGFyZW50ICYmIGluamVjdGVkUGFyZW50ICE9PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChpbmplY3RlZFBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0XHQvLyBvbmx5IHJ1biB0aGlzIGVmZmVjdCBvbmNlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHNvb24gYXMgd2UgcmUtcnVuIGFwcGVuZENoaWxkIHdpdGggdGhlIGluamVjdGVkUGFyZW50LCB3ZSBzdG9wIHRoZSBlZmZlY3Rcblx0XHRcdFx0XHRcdFx0d2F0Y2hlci5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7IGluamVjdG9yLCBtYW51YWxDbGVhbnVwOiB0cnVlIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAocGFyZW50ICE9PSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdLCBuZXdDaGlsZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHR0aGlzLnN0b3JlLmFkZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgbmV3IGNoaWxkIGlzIGEgcG9ydGFsXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHRoaXMuc3RvcmUucHJvY2Vzc1BvcnRhbENvbnRhaW5lcihuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIHBhcmVudCBpcyBhIHBvcnRhbFxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0dGhpcy5zdG9yZS5wcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBhcmVudCk7XG5cdFx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdLCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgYm90aCBhcmUgdGhyZWUgaW5zdGFuY2VzLCBzdHJhaWdodGZvcndhcmQgY2FzZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Ly8gaWYgY2hpbGQgYWxyZWFkeSBhdHRhY2hlZCB0byBhIHBhcmVudCwgc2tpcFxuXHRcdFx0aWYgKGdldExvY2FsU3RhdGUobmV3Q2hpbGQpLnBhcmVudCAmJiB1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShuZXdDaGlsZCkucGFyZW50KSkgcmV0dXJuO1xuXHRcdFx0Ly8gYXR0YWNoIFRIUkVFIGNoaWxkXG5cdFx0XHRhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0Ly8gaGVyZSwgd2UgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgaWYgdGhlIHBhcmVudCBoYXMgYSBjb21wb3VuZFBhcmVudCwgd2hpY2ggbWVhbnMgdGhpcyBjaGlsZCBpcyBwYXJ0IG9mIGEgY29tcG91bmQgcGFyZW50IHRlbXBsYXRlXG5cdFx0XHRpZiAoIWNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSByZXR1cm47XG5cdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRXaXRoQ29tcG91bmQgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQocGFyZW50KTtcblx0XHRcdGlmICghY2xvc2VzdEdyYW5kcGFyZW50V2l0aENvbXBvdW5kKSByZXR1cm47XG5cdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudFdpdGhDb21wb3VuZCwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIG9ubHkgdGhlIHBhcmVudCBpcyB0aGUgVEhSRUUgaW5zdGFuY2Vcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Zm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiBjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCByZW5kZXJDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gaWYgcGFyZW50IGlzIGEgY29tcG91bmRcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gaWYgY29tcG91bmQgZG9lc24ndCBoYXZlIGEgVEhSRUUgaW5zdGFuY2Ugc2V0IHlldFxuXHRcdFx0aWYgKCFwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdFx0Ly8gaWYgY2hpbGQgaXMgaW5kZWVkIGFuIG5ndENvbXBvdW5kXG5cdFx0XHRcdGlmIChjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSkgdGhpcy5zdG9yZS5zZXRDb21wb3VuZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdFx0Ly8gaWYgbm90LCB3ZSB0cmFjayB0aGUgcGFyZW50ICh0aGF0IGlzIHN1cHBvc2VkbHkgdGhlIGNvbXBvdW5kIGNvbXBvbmVudCkgb24gdGhpcyB0aHJlZSBpbnN0YW5jZVxuXHRcdFx0XHRlbHNlIGlmICghY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0pIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZXNldCB0aGUgY29tcG91bmQgaWYgaXQncyBjaGFuZ2VkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gJiZcblx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuXHRcdFx0XHRjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSAmJlxuXHRcdFx0XHRwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICE9PSBuZXdDaGlsZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0Q29tcG91bmQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTLCBjUlMsIG5ld0NoaWxkKSkge1xuXHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydEJlZm9yZShcblx0XHRwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHRuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdC8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdGhlc2U/XG5cdFx0Ly8gcmVmQ2hpbGQ6IE5ndFJlbmRlcmVyTm9kZVxuXHRcdC8vIGlzTW92ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXyB8fCBwYXJlbnQgPT09IG5ld0NoaWxkKSByZXR1cm47XG5cdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0fVxuXG5cdHJlbW92ZUNoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBvbGRDaGlsZDogTmd0UmVuZGVyZXJOb2RlLCBpc0hvc3RFbGVtZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGNvbnN0IGNSUyA9IG9sZENoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHRpZiAoXG5cdFx0XHQoIWNSUyB8fCAhcFJTKSAmJlxuXHRcdFx0cGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuXHRcdFx0KG9sZENoaWxkIGluc3RhbmNlb2YgRWxlbWVudCB8fCBvbGRDaGlsZCBpbnN0YW5jZW9mIFRleHQgfHwgb2xkQ2hpbGQgaW5zdGFuY2VvZiBDb21tZW50KVxuXHRcdCkge1xuXHRcdFx0dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKTtcblx0XHRcdHRoaXMuc3RvcmUuZGVzdHJveShvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiYgKCFwUlMgfHwgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQpO1xuXHRcdFx0dGhpcy5zdG9yZS5kZXN0cm95KG9sZENoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KTtcblx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlIGFzIE5ndFJlbmRlcmVyTm9kZSk7XG5cdH1cblxuXHRwYXJlbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSByZXR1cm4gclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUucGFyZW50Tm9kZShub2RlKTtcblx0fVxuXG5cdHNldEF0dHJpYnV0ZShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gd2UgZG9uJ3QgaGF2ZSB0aGUgY29tcG91bmQgaW5zdGFuY2UgeWV0XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11bbmFtZV0gPSB2YWx1ZTtcblx0XHRcdGlmICghclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24oZWwsIFsnb3AnLCAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSldKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZShyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0sIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHRoaXMuc3RvcmUuYXBwbHlBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdHNldFByb3BlcnR5KGVsOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdC8vIFRPRE86IHNob3VsZCB3ZSBzdXBwb3J0IHJlZiB2YWx1ZVxuXG5cdFx0Y29uc3QgclMgPSBlbC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdC8vIHdlIGRvbid0IGhhdmUgdGhlIGNvbXBvdW5kIGluc3RhbmNlIHlldFxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW25hbWVdID0gdmFsdWU7XG5cdFx0XHRpZiAoIXJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKGVsLCBbJ29wJywgKCkgPT4gdGhpcy5zZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpXSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdW1xuXHRcdFx0XHRcdFx0Tmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR7IFtuYW1lXTogdmFsdWUgfSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0UHJvcGVydHkoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0dGhpcy5zdG9yZS5hcHBseVByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGxpc3Rlbih0YXJnZXQ6IE5ndFJlbmRlcmVyTm9kZSwgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gYm9vbGVhbiB8IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRjb25zdCByUyA9IHRhcmdldC5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0Ly8gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgX19uZ3RfcmVuZGVyZXJfXywgd2UgZGVsZWdhdGVcblx0XHQvLyBpZiB0YXJnZXQgaXMgRE9NIG5vZGUsIHRoZW4gd2UgcGFzcyB0aGF0IHRvIGRlbGVnYXRlIFJlbmRlcmVyXG5cdFx0aWYgKCFyUyB8fCB0aGlzLnN0b3JlLmlzRE9NKHRhcmdldCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyB8fFxuXHRcdFx0KHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSB8fCB0YXJnZXQ7XG5cdFx0XHRjb25zdCBwcmlvcml0eSA9IGdldExvY2FsU3RhdGUodGFyZ2V0KS5wcmlvcml0eTtcblx0XHRcdGNvbnN0IHRhcmdldENkciA9XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldPy4oKS5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpIHx8XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdPy5fX25ndF9yZW5kZXJlcl9fPy5bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0/LigpLmdldChcblx0XHRcdFx0XHRDaGFuZ2VEZXRlY3RvclJlZixcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gcHJvY2Vzc1RocmVlRXZlbnQoaW5zdGFuY2UsIHByaW9yaXR5IHx8IDAsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIHRoaXMuem9uZSwgdGhpcy5jZHIsIHRhcmdldENkcik7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiAhclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgW1xuXHRcdFx0XHQnb3AnLFxuXHRcdFx0XHQoKSA9PiB0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgWydjbGVhblVwJywgdGhpcy5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKV0pLFxuXHRcdFx0XSk7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGtub3cgdGhhdCB0YXJnZXQgaXMgbm90IERPTSBub2RlXG5cdFx0aWYgKHRhcmdldCA9PT0gdGhpcy5zdG9yZS5yb290U2NlbmUpIHtcblx0XHRcdGxldCBbZG9tVGFyZ2V0LCBldmVudF0gPSBldmVudE5hbWUuc3BsaXQoJzonKTtcblx0XHRcdGlmIChldmVudCA9PSBudWxsKSB7XG5cdFx0XHRcdGV2ZW50ID0gZG9tVGFyZ2V0O1xuXHRcdFx0XHRkb21UYXJnZXQgPSAnJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV2ZW50VGFyZ2V0ID1cblx0XHRcdFx0ZG9tVGFyZ2V0ID09PSAnd2luZG93J1xuXHRcdFx0XHRcdD8gKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J11bJ2RlZmF1bHRWaWV3J11cblx0XHRcdFx0XHQ6ICh0YXJnZXQgYXMgTmd0QW55UmVjb3JkKVsnb3duZXJEb2N1bWVudCddO1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKGV2ZW50VGFyZ2V0LCBldmVudCwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiB7fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTOiBOZ3RSZW5kZXJlclN0YXRlLCBjUlM6IE5ndFJlbmRlcmVyU3RhdGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBwVHlwZSA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV07XG5cdFx0Y29uc3QgY1R5cGUgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdO1xuXHRcdGNvbnN0IGlzUGFyZW50Q29tcG91bmRlZCA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF07XG5cdFx0Y29uc3QgaXNDaGlsZENvbXBvdW5kZWQgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdO1xuXG5cdFx0Ly8gaWYgY2hpbGQgaXMgdGhyZWUgYnV0IGhhdmVuJ3QgYmVlbiBhdHRhY2hlZCB0byBhIHBhcmVudCB5ZXRcblx0XHRjb25zdCBpc0RhbmdsaW5nVGhyZWVDaGlsZCA9IGNUeXBlID09PSAndGhyZWUnICYmICF1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShjaGlsZCkucGFyZW50KTtcblx0XHQvLyBvciBib3RoIHBhcmVudCBhbmQgY2hpbGQgYXJlIERPTSBlbGVtZW50c1xuXHRcdC8vIG9yIHRoZXkgYXJlIGNvbXBvdW5kIEFORCBoYXZlbid0IGhhZCBhIFRIUkVFIGluc3RhbmNlIHlldFxuXHRcdGNvbnN0IGlzUGFyZW50U3RpbGxET00gPSBwVHlwZSA9PT0gJ2RvbScgfHwgKHBUeXBlID09PSAnY29tcG91bmQnICYmICFpc1BhcmVudENvbXBvdW5kZWQpO1xuXHRcdGNvbnN0IGlzQ2hpbGRTdGlsbERPTSA9IGNUeXBlID09PSAnZG9tJyB8fCAoY1R5cGUgPT09ICdjb21wb3VuZCcgJiYgIWlzQ2hpbGRDb21wb3VuZGVkKTtcblx0XHQvLyBhbmQgdGhlIGNoaWxkIGlzIGEgY29tcG91bmRlZCBjb21wb3VuZFxuXHRcdGNvbnN0IGlzQ29tcG91bmRDaGlsZENvbXBvdW5kZWQgPSBjVHlwZSA9PT0gJ2NvbXBvdW5kJyAmJiAhIWlzQ2hpbGRDb21wb3VuZGVkO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGlzRGFuZ2xpbmdUaHJlZUNoaWxkIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NoaWxkU3RpbGxET00pIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NvbXBvdW5kQ2hpbGRDb21wb3VuZGVkKVxuXHRcdCk7XG5cdH1cblxuXHRjcmVhdGVUZXh0ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVUZXh0LmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGRlc3Ryb3kgPSB0aGlzLmRlbGVnYXRlLmRlc3Ryb3kuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0ZGVzdHJveU5vZGU6ICgobm9kZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXHRzZWxlY3RSb290RWxlbWVudCA9IHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0bmV4dFNpYmxpbmcgPSB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZUF0dHJpYnV0ZSA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGFkZENsYXNzID0gdGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRyZW1vdmVDbGFzcyA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0c2V0U3R5bGUgPSB0aGlzLmRlbGVnYXRlLnNldFN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZVN0eWxlID0gdGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRzZXRWYWx1ZSA9IHRoaXMuZGVsZWdhdGUuc2V0VmFsdWUuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0Z2V0IGRhdGEoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZU5ndFJlbmRlcmVyKHN0b3JlOiBOZ3RTdG9yZSwgY29tcG91bmRQcmVmaXhlczogc3RyaW5nW10sIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0aWYgKCFjb21wb3VuZFByZWZpeGVzLmluY2x1ZGVzKCduZ3RzJykpIGNvbXBvdW5kUHJlZml4ZXMucHVzaCgnbmd0cycpO1xuXHRpZiAoIWNvbXBvdW5kUHJlZml4ZXMuaW5jbHVkZXMoJ25ndHAnKSkgY29tcG91bmRQcmVmaXhlcy5wdXNoKCduZ3RwJyk7XG5cblx0cmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG5cdFx0eyBwcm92aWRlOiBSZW5kZXJlckZhY3RvcnkyLCB1c2VDbGFzczogTmd0UmVuZGVyZXJGYWN0b3J5IH0sXG5cdFx0eyBwcm92aWRlOiBOR1RfQ09NUE9VTkRfUFJFRklYRVMsIHVzZVZhbHVlOiBjb21wb3VuZFByZWZpeGVzIH0sXG5cdFx0eyBwcm92aWRlOiBDaGFuZ2VEZXRlY3RvclJlZiwgdXNlVmFsdWU6IGNkciB9LFxuXHRcdHByb3ZpZGVOZ3RTdG9yZShzdG9yZSksXG5cdFx0cHJvdmlkZVpvbmVDaGFuZ2VEZXRlY3Rpb24oeyBydW5Db2FsZXNjaW5nOiB0cnVlLCBldmVudENvYWxlc2Npbmc6IHRydWUgfSksXG5cdF0pO1xufVxuXG5leHBvcnQgeyBleHRlbmQgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5leHBvcnQgeyBIVE1MIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
414
+ export { HTML, ROUTED_SCENE } from './constants';
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLHdCQUF3QixFQUN4QiwwQkFBMEIsR0FHMUIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQXNCLE1BQU0sYUFBYSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFpQixNQUFNLFVBQVUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBK0MsTUFBTSxTQUFTLENBQUM7QUFDL0csT0FBTyxFQUNOLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2hCLE1BQU0sU0FBUyxDQUFDOztBQUdqQixNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRVMsNEJBQXVCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsY0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFFakMsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztRQUMzQyxjQUFTLEdB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QyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRFLE9BQU8sd0JBQXdCLENBQUM7UUFDL0Isa0JBQWtCO1FBQ2xCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRTtRQUM5RCxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUU7UUFDOUQsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUN0QiwwQkFBMEIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0SW5qZWN0YWJsZSxcblx0SW5qZWN0b3IsXG5cdFJlbmRlcmVyRmFjdG9yeTIsXG5cdGVmZmVjdCxcblx0Z2V0RGVidWdOb2RlLFxuXHRpbmplY3QsXG5cdG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcblx0cHJvdmlkZVpvbmVDaGFuZ2VEZXRlY3Rpb24sXG5cdHR5cGUgUmVuZGVyZXIyLFxuXHR0eXBlIFJlbmRlcmVyVHlwZTIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSwgdHlwZSBOZ3RMb2NhbFN0YXRlIH0gZnJvbSAnLi4vaW5zdGFuY2UnO1xuaW1wb3J0IHR5cGUgeyBOZ3RJbmplY3RlZFJlZiB9IGZyb20gJy4uL3JlZic7XG5pbXBvcnQgeyBpbmplY3ROZ3RTdG9yZSwgcHJvdmlkZU5ndFN0b3JlLCB0eXBlIE5ndFN0YXRlIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB0eXBlIHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuLi91dGlscy9zaWduYWwtc3RvcmUnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0Q2F0YWxvZ3VlLCB0eXBlIE5ndEFueUNvbnN0cnVjdG9yIH0gZnJvbSAnLi9jYXRhbG9ndWUnO1xuaW1wb3J0IHsgSFRNTCwgUk9VVEVEX1NDRU5FLCBTUEVDSUFMX0RPTV9UQUcgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOR1RfQ09NUE9VTkRfUFJFRklYRVMsIE5ndFJlbmRlcmVyU3RvcmUsIHR5cGUgTmd0UmVuZGVyZXJOb2RlLCB0eXBlIE5ndFJlbmRlcmVyU3RhdGUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7XG5cdE5ndENvbXBvdW5kQ2xhc3NJZCxcblx0Tmd0UmVuZGVyZXJDbGFzc0lkLFxuXHRhdHRhY2hUaHJlZUNoaWxkLFxuXHRrZWJhYlRvUGFzY2FsLFxuXHRwcm9jZXNzVGhyZWVFdmVudCxcblx0cmVtb3ZlVGhyZWVDaGlsZCxcbn0gZnJvbSAnLi91dGlscyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlckZhY3RvcnkgaW1wbGVtZW50cyBSZW5kZXJlckZhY3RvcnkyIHtcblx0cHJpdmF0ZSBkZWxlZ2F0ZVJlbmRlcmVyRmFjdG9yeSA9IGluamVjdChSZW5kZXJlckZhY3RvcnkyLCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuXHRwcml2YXRlIGNhdGFsb2d1ZSA9IGluamVjdE5ndENhdGFsb2d1ZSgpO1xuXG5cdHByaXZhdGUgcmVuZGVyZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyZXIyPigpO1xuXHRwcml2YXRlIHJvdXRlZFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cdC8vIE5PVEU6IGFsbCBSZW5kZXJlciBpbnN0YW5jZXMgdW5kZXIgdGhlIHNhbWUgTmd0Q2FudmFzIHNoYXJlIHRoZSBzYW1lIFN0b3JlXG5cdHByaXZhdGUgcmVuZGVyZXJTdG9yZSA9IG5ldyBOZ3RSZW5kZXJlclN0b3JlKHtcblx0XHRzdG9yZTogaW5qZWN0Tmd0U3RvcmUoKSxcblx0XHRjb21wb3VuZFByZWZpeGVzOiBpbmplY3QoTkdUX0NPTVBPVU5EX1BSRUZJWEVTKSxcblx0XHRkb2N1bWVudDogaW5qZWN0KERPQ1VNRU5UKSxcblx0fSk7XG5cblx0Y3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQ6IGFueSwgdHlwZTogUmVuZGVyZXJUeXBlMiB8IG51bGwpOiBSZW5kZXJlcjIge1xuXHRcdGNvbnN0IGRlbGVnYXRlUmVuZGVyZXIgPSB0aGlzLmRlbGVnYXRlUmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50LCB0eXBlKTtcblxuXHRcdGlmICghdHlwZSkgcmV0dXJuIGRlbGVnYXRlUmVuZGVyZXI7XG5cblx0XHQvLyBOT1RFOiBtaWdodCBuZWVkIHRvIHJldmlzaXQgdGhpc1xuXHRcdGlmICgodHlwZSBhcyBOZ3RBbnlSZWNvcmQpWyd0eXBlJ11bSFRNTF0pIHtcblx0XHRcdHRoaXMucmVuZGVyZXJNYXAuc2V0KHR5cGUuaWQsIGRlbGVnYXRlUmVuZGVyZXIpO1xuXHRcdFx0cmV0dXJuIGRlbGVnYXRlUmVuZGVyZXI7XG5cdFx0fVxuXG5cdFx0aWYgKCh0eXBlIGFzIE5ndEFueVJlY29yZClbJ3R5cGUnXVtST1VURURfU0NFTkVdKSB7XG5cdFx0XHR0aGlzLnJvdXRlZFNldC5hZGQodHlwZS5pZCk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlck1hcC5nZXQodHlwZS5pZCk7XG5cdFx0aWYgKCFyZW5kZXJlcikge1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQoXG5cdFx0XHRcdHR5cGUuaWQsXG5cdFx0XHRcdChyZW5kZXJlciA9IG5ldyBOZ3RSZW5kZXJlcihcblx0XHRcdFx0XHRkZWxlZ2F0ZVJlbmRlcmVyLFxuXHRcdFx0XHRcdHRoaXMucmVuZGVyZXJTdG9yZSxcblx0XHRcdFx0XHR0aGlzLmNhdGFsb2d1ZSxcblx0XHRcdFx0XHQvLyBzZXR0aW5nIHJvb3Qgc2NlbmUgaWYgdGhlcmUncyBubyByb3V0ZWQgc2NlbmUgT1IgdGhpcyBjb21wb25lbnQgaXMgdGhlIHJvdXRlZCBTY2VuZVxuXHRcdFx0XHRcdCFob3N0RWxlbWVudCAmJiAodGhpcy5yb3V0ZWRTZXQuc2l6ZSA9PT0gMCB8fCB0aGlzLnJvdXRlZFNldC5oYXModHlwZS5pZCkpLFxuXHRcdFx0XHQpKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiByZW5kZXJlcjtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXIgaW1wbGVtZW50cyBSZW5kZXJlcjIge1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGRlbGVnYXRlOiBSZW5kZXJlcjIsXG5cdFx0cHJpdmF0ZSBzdG9yZTogTmd0UmVuZGVyZXJTdG9yZSxcblx0XHRwcml2YXRlIGNhdGFsb2d1ZTogUmVjb3JkPHN0cmluZywgTmd0QW55Q29uc3RydWN0b3I+LFxuXHRcdHByaXZhdGUgaXNSb290ID0gdHJ1ZSxcblx0KSB7fVxuXG5cdGNyZWF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpO1xuXG5cdFx0Ly8gb24gZmlyc3QgcGFzcywgd2UgcmV0dXJuIHRoZSBSb290IFNjZW5lIGFzIHRoZSByb290IG5vZGVcblx0XHRpZiAodGhpcy5pc1Jvb3QpIHtcblx0XHRcdHRoaXMuaXNSb290ID0gZmFsc2U7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMuc3RvcmUucm9vdFNjZW5lKTtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KT8uaW5qZWN0b3I7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zdG9yZS5pc0NvbXBvdW5kKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21wb3VuZCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX0RPTV9UQUcuTkdUX1BPUlRBTCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZSgncG9ydGFsJywgZWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfRE9NX1RBRy5OR1RfVkFMVUUpIHtcblx0XHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoXG5cdFx0XHRcdCd0aHJlZScsXG5cdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0eyBfX25ndF9yZW5kZXJlcl9fOiB7IHJhd1ZhbHVlOiB1bmRlZmluZWQgfSB9LFxuXHRcdFx0XHRcdC8vIE5PVEU6IHdlIGFzc2lnbiB0aGlzIG1hbnVhbGx5IHRvIGEgcmF3IHZhbHVlIG5vZGVcblx0XHRcdFx0XHQvLyBiZWNhdXNlIHdlIHNheSBpdCBpcyBhICd0aHJlZScgbm9kZSBidXQgd2UncmUgbm90IHVzaW5nIHByZXBhcmUoKVxuXHRcdFx0XHRcdHsgX19uZ3RfXzogeyBpc1JhdzogdHJ1ZSwgcGFyZW50OiAoKSA9PiBudWxsIH0gfSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgW2luamVjdGVkQXJncywgaW5qZWN0ZWRQYXJlbnQsIHN0b3JlXSA9IHRoaXMuc3RvcmUuZ2V0Q3JlYXRpb25TdGF0ZSgpO1xuXG5cdFx0bGV0IHBhcmVudCA9IGluamVjdGVkUGFyZW50IGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHRpZiAodHlwZW9mIGluamVjdGVkUGFyZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cGFyZW50ID0gc3RvcmVcblx0XHRcdFx0LmdldCgnc2NlbmUnKVxuXHRcdFx0XHQuZ2V0T2JqZWN0QnlOYW1lKGluamVjdGVkUGFyZW50KSBhcyB1bmtub3duIGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QUklNSVRJVkUpIHtcblx0XHRcdGlmICghaW5qZWN0ZWRBcmdzWzBdKSB0aHJvdyBuZXcgRXJyb3IoYFtOR1RdIG5ndC1wcmltaXRpdmUgd2l0aG91dCBhcmdzIGlzIGludmFsaWRgKTtcblx0XHRcdGNvbnN0IG9iamVjdCA9IGluamVjdGVkQXJnc1swXTtcblx0XHRcdGxldCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShvYmplY3QpO1xuXHRcdFx0aWYgKCFsb2NhbFN0YXRlKSB7XG5cdFx0XHRcdC8vIE5PVEU6IGlmIGFuIG9iamVjdCBpc24ndCBhbHJlYWR5IFwicHJlcGFyZWRcIiwgd2UgcHJlcGFyZSBpdFxuXHRcdFx0XHRsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwcmVwYXJlKG9iamVjdCwgeyBzdG9yZSwgYXJnczogaW5qZWN0ZWRBcmdzLCBwcmltaXRpdmU6IHRydWUgfSkpIGFzIE5ndExvY2FsU3RhdGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWxvY2FsU3RhdGUuc3RvcmUpIGxvY2FsU3RhdGUuc3RvcmUgPSBzdG9yZTtcblx0XHRcdGNvbnN0IG5vZGUgPSB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3RocmVlJywgb2JqZWN0KTtcblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0gPSBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRjb25zdCB0aHJlZU5hbWUgPSBrZWJhYlRvUGFzY2FsKG5hbWUuc3RhcnRzV2l0aCgnbmd0JykgPyBuYW1lLnNsaWNlKDQpIDogbmFtZSk7XG5cdFx0Y29uc3QgdGhyZWVUYXJnZXQgPSB0aGlzLmNhdGFsb2d1ZVt0aHJlZU5hbWVdO1xuXG5cdFx0Ly8gd2UgaGF2ZSB0aGUgVEhSRUUgY29uc3RydWN0b3IgaGVyZSwgaGFuZGxlIGl0XG5cdFx0aWYgKHRocmVlVGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IHByZXBhcmUobmV3IHRocmVlVGFyZ2V0KC4uLmluamVjdGVkQXJncyksIHsgc3RvcmUsIGFyZ3M6IGluamVjdGVkQXJncyB9KTtcblx0XHRcdGNvbnN0IG5vZGUgPSB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3RocmVlJywgaW5zdGFuY2UpO1xuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpIGFzIE5ndExvY2FsU3RhdGU7XG5cblx0XHRcdC8vIGF1dG8tYXR0YWNoIGZvciBnZW9tZXRyeSBhbmQgbWF0ZXJpYWxcblx0XHRcdGlmIChpcy5nZW9tZXRyeShpbnN0YW5jZSkpIHtcblx0XHRcdFx0bG9jYWxTdGF0ZS5hdHRhY2ggPSBbJ2dlb21ldHJ5J107XG5cdFx0XHR9IGVsc2UgaWYgKGlzLm1hdGVyaWFsKGluc3RhbmNlKSkge1xuXHRcdFx0XHRsb2NhbFN0YXRlLmF0dGFjaCA9IFsnbWF0ZXJpYWwnXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSA9IHBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZSgnZG9tJywgZWxlbWVudCk7XG5cdH1cblxuXHRjcmVhdGVDb21tZW50KHZhbHVlOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21tZW50JywgdGhpcy5kZWxlZ2F0ZS5jcmVhdGVDb21tZW50KHZhbHVlKSk7XG5cdH1cblxuXHRhcHBlbmRDaGlsZChwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSwgbmV3Q2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSk6IHZvaWQge1xuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGNvbnN0IGNSUyA9IG5ld0NoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHRpZiAoXG5cdFx0XHRwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnZG9tJyAmJlxuXHRcdFx0KG5ld0NoaWxkIGluc3RhbmNlb2YgVGV4dCB8fCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnZG9tJylcblx0XHQpIHtcblx0XHRcdHRoaXMuc3RvcmUuYWRkQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0aWYgKGNSUykge1xuXHRcdFx0XHR0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHRcdFx0aWYgKHRoaXMuc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTLCBjUlMsIG5ld0NoaWxkKSkge1xuXHRcdFx0XHRcdC8vIHdlJ2xsIHRyeSB0byBnZXQgdGhlIGdyYW5kcGFyZW50IGluc3RhbmNlIGhlcmUgc28gdGhhdCB3ZSBjYW4gcnVuIGFwcGVuZENoaWxkIHdpdGggYm90aCBpbnN0YW5jZXNcblx0XHRcdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSA9IHRoaXMuc3RvcmUuZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShwYXJlbnQpO1xuXHRcdFx0XHRcdGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTPy5bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcblx0XHRcdHRoaXMuc3RvcmUuc2V0UGFyZW50KG5ld0NoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdKSB7XG5cdFx0XHRpZiAoaXMucmVmKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdKSkge1xuXHRcdFx0XHRjb25zdCBpbmplY3RvciA9IGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpPy5nZXQoSW5qZWN0b3IsIG51bGwpO1xuXHRcdFx0XHRpZiAoIWluamVjdG9yKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0YFtOR1RdIE5ndFJlbmRlcmVyIGlzIGF0dGVtcHRpbmcgdG8gc3RhcnQgYW4gZWZmZWN0IGZvciBpbmplY3RlZFBhcmVudCBidXQgbm8gSW5qZWN0b3IgaXMgZm91bmQuYCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB3YXRjaGVyID0gZWZmZWN0KFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGluamVjdGVkUGFyZW50ID0gKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdIGFzIE5ndEluamVjdGVkUmVmPE5ndFJlbmRlcmVyTm9kZT4pXG5cdFx0XHRcdFx0XHRcdC5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRcdFx0aWYgKGluamVjdGVkUGFyZW50ICYmIGluamVjdGVkUGFyZW50ICE9PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChpbmplY3RlZFBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0XHQvLyBvbmx5IHJ1biB0aGlzIGVmZmVjdCBvbmNlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHNvb24gYXMgd2UgcmUtcnVuIGFwcGVuZENoaWxkIHdpdGggdGhlIGluamVjdGVkUGFyZW50LCB3ZSBzdG9wIHRoZSBlZmZlY3Rcblx0XHRcdFx0XHRcdFx0d2F0Y2hlci5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7IGluamVjdG9yLCBtYW51YWxDbGVhbnVwOiB0cnVlIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAocGFyZW50ICE9PSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdLCBuZXdDaGlsZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHR0aGlzLnN0b3JlLmFkZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgbmV3IGNoaWxkIGlzIGEgcG9ydGFsXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHRoaXMuc3RvcmUucHJvY2Vzc1BvcnRhbENvbnRhaW5lcihuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIHBhcmVudCBpcyBhIHBvcnRhbFxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0dGhpcy5zdG9yZS5wcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBhcmVudCk7XG5cdFx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdLCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgYm90aCBhcmUgdGhyZWUgaW5zdGFuY2VzLCBzdHJhaWdodGZvcndhcmQgY2FzZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Y29uc3QgY0xTID0gZ2V0TG9jYWxTdGF0ZShuZXdDaGlsZCk7XG5cdFx0XHQvLyBpZiBjaGlsZCBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgcGFyZW50LCBza2lwXG5cdFx0XHRpZiAoY0xTPy5pbnN0YW5jZVN0b3JlPy5nZXQoJ3BhcmVudCcpKSByZXR1cm47XG5cdFx0XHQvLyBhdHRhY2ggVEhSRUUgY2hpbGRcblx0XHRcdGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHQvLyBoZXJlLCB3ZSBoYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBpZiB0aGUgcGFyZW50IGhhcyBhIGNvbXBvdW5kUGFyZW50LCB3aGljaCBtZWFucyB0aGlzIGNoaWxkIGlzIHBhcnQgb2YgYSBjb21wb3VuZCBwYXJlbnQgdGVtcGxhdGVcblx0XHRcdGlmICghY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHJldHVybjtcblx0XHRcdGNvbnN0IGNsb3Nlc3RHcmFuZHBhcmVudFdpdGhDb21wb3VuZCA9IHRoaXMuc3RvcmUuZ2V0Q2xvc2VzdFBhcmVudFdpdGhDb21wb3VuZChwYXJlbnQpO1xuXHRcdFx0aWYgKCFjbG9zZXN0R3JhbmRwYXJlbnRXaXRoQ29tcG91bmQpIHJldHVybjtcblx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50V2l0aENvbXBvdW5kLCBuZXdDaGlsZCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgb25seSB0aGUgcGFyZW50IGlzIHRoZSBUSFJFRSBpbnN0YW5jZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHJlbmRlckNoaWxkIG9mIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gfHwgW10pIHtcblx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIHJlbmRlckNoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBpZiBwYXJlbnQgaXMgYSBjb21wb3VuZFxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHQvLyBpZiBjb21wb3VuZCBkb2Vzbid0IGhhdmUgYSBUSFJFRSBpbnN0YW5jZSBzZXQgeWV0XG5cdFx0XHRpZiAoIXBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gJiYgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0XHQvLyBpZiBjaGlsZCBpcyBpbmRlZWQgYW4gbmd0Q29tcG91bmRcblx0XHRcdFx0aWYgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSB0aGlzLnN0b3JlLnNldENvbXBvdW5kKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0XHQvLyBpZiBub3QsIHdlIHRyYWNrIHRoZSBwYXJlbnQgKHRoYXQgaXMgc3VwcG9zZWRseSB0aGUgY29tcG91bmQgY29tcG9uZW50KSBvbiB0aGlzIHRocmVlIGluc3RhbmNlXG5cdFx0XHRcdGVsc2UgaWYgKCFjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gPSBwYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlc2V0IHRoZSBjb21wb3VuZCBpZiBpdCdzIGNoYW5nZWRcblx0XHRcdGlmIChcblx0XHRcdFx0cFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSAmJlxuXHRcdFx0XHRjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmXG5cdFx0XHRcdGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdICYmXG5cdFx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gIT09IG5ld0NoaWxkXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5zdG9yZS5zZXRDb21wb3VuZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlMsIGNSUywgbmV3Q2hpbGQpKSB7XG5cdFx0XHQvLyB3ZSdsbCB0cnkgdG8gZ2V0IHRoZSBncmFuZHBhcmVudCBpbnN0YW5jZSBoZXJlIHNvIHRoYXQgd2UgY2FuIHJ1biBhcHBlbmRDaGlsZCB3aXRoIGJvdGggaW5zdGFuY2VzXG5cdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSA9IHRoaXMuc3RvcmUuZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShwYXJlbnQpO1xuXHRcdFx0aWYgKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlKSB0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlLCBuZXdDaGlsZCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0aW5zZXJ0QmVmb3JlKFxuXHRcdHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdG5ld0NoaWxkOiBOZ3RSZW5kZXJlck5vZGUsXG5cdFx0Ly8gVE9ETzogd2UgbWlnaHQgbmVlZCB0aGVzZT9cblx0XHQvLyBfcmVmQ2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHQvLyBfaXNNb3ZlPzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXyB8fCBwYXJlbnQgPT09IG5ld0NoaWxkKSByZXR1cm47XG5cdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0fVxuXG5cdHJlbW92ZUNoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBvbGRDaGlsZDogTmd0UmVuZGVyZXJOb2RlLCBpc0hvc3RFbGVtZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGNvbnN0IGNSUyA9IG9sZENoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHRpZiAoXG5cdFx0XHQoIWNSUyB8fCAhcFJTKSAmJlxuXHRcdFx0cGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuXHRcdFx0KG9sZENoaWxkIGluc3RhbmNlb2YgRWxlbWVudCB8fCBvbGRDaGlsZCBpbnN0YW5jZW9mIFRleHQgfHwgb2xkQ2hpbGQgaW5zdGFuY2VvZiBDb21tZW50KVxuXHRcdCkge1xuXHRcdFx0dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKTtcblx0XHRcdHRoaXMuc3RvcmUuZGVzdHJveShvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiYgKCFwUlMgfHwgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQpO1xuXHRcdFx0dGhpcy5zdG9yZS5kZXN0cm95KG9sZENoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KTtcblx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlIGFzIE5ndFJlbmRlcmVyTm9kZSk7XG5cdH1cblxuXHRwYXJlbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSByZXR1cm4gclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUucGFyZW50Tm9kZShub2RlKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0QXR0cmlidXRlSW50ZXJuYWwoXG5cdFx0ZWw6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHRuYW1lOiBzdHJpbmcsXG5cdFx0dmFsdWU6IHN0cmluZyxcblx0XHRuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gd2UgZG9uJ3QgaGF2ZSB0aGUgY29tcG91bmQgaW5zdGFuY2UgeWV0XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11bbmFtZV0gPSB2YWx1ZTtcblx0XHRcdGlmICghclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24oZWwsIFsnb3AnLCAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSldKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRBdHRyaWJ1dGVJbnRlcm5hbChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0sIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHRoaXMuc3RvcmUuYXBwbHlBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHNldEF0dHJpYnV0ZShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCB1c2VEZWxlZ2F0ZSA9IHRoaXMuc2V0QXR0cmlidXRlSW50ZXJuYWwoZWwsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXG5cdFx0aWYgKHVzZURlbGVnYXRlKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdHJlbW92ZUF0dHJpYnV0ZShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCB1c2VEZWxlZ2F0ZSA9IHRoaXMuc2V0QXR0cmlidXRlSW50ZXJuYWwoZWwsIG5hbWUsIHVuZGVmaW5lZCEsIG5hbWVzcGFjZSk7XG5cblx0XHRpZiAodXNlRGVsZWdhdGUpIHtcblx0XHRcdHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlKGVsLCBuYW1lLCBuYW1lc3BhY2UpO1xuXHRcdH1cblx0fVxuXG5cdHNldFByb3BlcnR5KGVsOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdC8vIFRPRE86IHNob3VsZCB3ZSBzdXBwb3J0IHJlZiB2YWx1ZVxuXHRcdGNvbnN0IHJTID0gZWwuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHQvLyB3ZSBkb24ndCBoYXZlIHRoZSBjb21wb3VuZCBpbnN0YW5jZSB5ZXRcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXVtuYW1lXSA9IHZhbHVlO1xuXHRcdFx0aWYgKCFyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pIHtcblx0XHRcdFx0dGhpcy5zdG9yZS5xdWV1ZU9wZXJhdGlvbihlbCwgWydvcCcsICgpID0+IHRoaXMuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKV0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXVtOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdLFxuXHRcdFx0XHRcdHsgW25hbWVdOiB2YWx1ZSB9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zZXRQcm9wZXJ0eShyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0sIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLnN0b3JlLmFwcGx5UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0bGlzdGVuKHRhcmdldDogTmd0UmVuZGVyZXJOb2RlLCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiBib29sZWFuIHwgdm9pZCk6ICgpID0+IHZvaWQge1xuXHRcdGNvbnN0IHJTID0gdGFyZ2V0Ll9fbmd0X3JlbmRlcmVyX187XG5cblx0XHQvLyBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBfX25ndF9yZW5kZXJlcl9fLCB3ZSBkZWxlZ2F0ZVxuXHRcdC8vIGlmIHRhcmdldCBpcyBET00gbm9kZSwgd2UgZGVsZWdhdGVcblx0XHRpZiAoIXJTIHx8IHRoaXMuc3RvcmUuaXNET00odGFyZ2V0KSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjayk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG5cdFx0XHQoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IGluc3RhbmNlID0gclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdIHx8IHRhcmdldDtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcblx0XHRcdGNvbnN0IHByaW9yaXR5ID0gbG9jYWxTdGF0ZT8ucHJpb3JpdHkgPz8gMDtcblx0XHRcdHJldHVybiBwcm9jZXNzVGhyZWVFdmVudChpbnN0YW5jZSwgcHJpb3JpdHkgfHwgMCwgZXZlbnROYW1lLCBjYWxsYmFjayk7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiAhclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgW1xuXHRcdFx0XHQnb3AnLFxuXHRcdFx0XHQoKSA9PiB0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgWydjbGVhblVwJywgdGhpcy5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKV0pLFxuXHRcdFx0XSk7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGtub3cgdGhhdCB0YXJnZXQgaXMgbm90IERPTSBub2RlXG5cdFx0aWYgKHRhcmdldCA9PT0gdGhpcy5zdG9yZS5yb290U2NlbmUpIHtcblx0XHRcdGxldCBbZG9tVGFyZ2V0LCBldmVudF0gPSBldmVudE5hbWUuc3BsaXQoJzonKTtcblx0XHRcdGlmIChldmVudCA9PSBudWxsKSB7XG5cdFx0XHRcdGV2ZW50ID0gZG9tVGFyZ2V0O1xuXHRcdFx0XHRkb21UYXJnZXQgPSAnJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV2ZW50VGFyZ2V0ID1cblx0XHRcdFx0ZG9tVGFyZ2V0ID09PSAnd2luZG93J1xuXHRcdFx0XHRcdD8gKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J11bJ2RlZmF1bHRWaWV3J11cblx0XHRcdFx0XHQ6ICh0YXJnZXQgYXMgTmd0QW55UmVjb3JkKVsnb3duZXJEb2N1bWVudCddO1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKGV2ZW50VGFyZ2V0LCBldmVudCwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiB7fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTOiBOZ3RSZW5kZXJlclN0YXRlLCBjUlM6IE5ndFJlbmRlcmVyU3RhdGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBwVHlwZSA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV07XG5cdFx0Y29uc3QgY1R5cGUgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdO1xuXHRcdGNvbnN0IGlzUGFyZW50Q29tcG91bmRlZCA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF07XG5cdFx0Y29uc3QgaXNDaGlsZENvbXBvdW5kZWQgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdO1xuXG5cdFx0Y29uc3QgY0xTID0gZ2V0TG9jYWxTdGF0ZShjaGlsZCk7XG5cdFx0Ly8gaWYgY2hpbGQgaXMgdGhyZWUgYnV0IGhhdmVuJ3QgYmVlbiBhdHRhY2hlZCB0byBhIHBhcmVudCB5ZXRcblx0XHRjb25zdCBpc0RhbmdsaW5nVGhyZWVDaGlsZCA9IGNUeXBlID09PSAndGhyZWUnICYmICFjTFM/Lmluc3RhbmNlU3RvcmU/LmdldCgncGFyZW50Jyk7XG5cdFx0Ly8gb3IgYm90aCBwYXJlbnQgYW5kIGNoaWxkIGFyZSBET00gZWxlbWVudHNcblx0XHQvLyBvciB0aGV5IGFyZSBjb21wb3VuZCBBTkQgaGF2ZW4ndCBoYWQgYSBUSFJFRSBpbnN0YW5jZSB5ZXRcblx0XHRjb25zdCBpc1BhcmVudFN0aWxsRE9NID0gcFR5cGUgPT09ICdkb20nIHx8IChwVHlwZSA9PT0gJ2NvbXBvdW5kJyAmJiAhaXNQYXJlbnRDb21wb3VuZGVkKTtcblx0XHRjb25zdCBpc0NoaWxkU3RpbGxET00gPSBjVHlwZSA9PT0gJ2RvbScgfHwgKGNUeXBlID09PSAnY29tcG91bmQnICYmICFpc0NoaWxkQ29tcG91bmRlZCk7XG5cdFx0Ly8gYW5kIHRoZSBjaGlsZCBpcyBhIGNvbXBvdW5kZWQgY29tcG91bmRcblx0XHRjb25zdCBpc0NvbXBvdW5kQ2hpbGRDb21wb3VuZGVkID0gY1R5cGUgPT09ICdjb21wb3VuZCcgJiYgISFpc0NoaWxkQ29tcG91bmRlZDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRpc0RhbmdsaW5nVGhyZWVDaGlsZCB8fCAoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NoaWxkU3RpbGxET00pIHx8IChpc1BhcmVudFN0aWxsRE9NICYmIGlzQ29tcG91bmRDaGlsZENvbXBvdW5kZWQpXG5cdFx0KTtcblx0fVxuXG5cdGNyZWF0ZVRleHQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0ZGVzdHJveSA9IHRoaXMuZGVsZWdhdGUuZGVzdHJveS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRkZXN0cm95Tm9kZTogKChub2RlOiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cdHNlbGVjdFJvb3RFbGVtZW50ID0gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudC5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRuZXh0U2libGluZyA9IHRoaXMuZGVsZWdhdGUubmV4dFNpYmxpbmcuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0YWRkQ2xhc3MgPSB0aGlzLmRlbGVnYXRlLmFkZENsYXNzLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZUNsYXNzID0gdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRzZXRTdHlsZSA9IHRoaXMuZGVsZWdhdGUuc2V0U3R5bGUuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0cmVtb3ZlU3R5bGUgPSB0aGlzLmRlbGVnYXRlLnJlbW92ZVN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHNldFZhbHVlID0gdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRnZXQgZGF0YSgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5kYXRhO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlTmd0UmVuZGVyZXIoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgY29tcG91bmRQcmVmaXhlczogc3RyaW5nW10pIHtcblx0aWYgKCFjb21wb3VuZFByZWZpeGVzLmluY2x1ZGVzKCduZ3RzJykpIGNvbXBvdW5kUHJlZml4ZXMucHVzaCgnbmd0cycpO1xuXHRpZiAoIWNvbXBvdW5kUHJlZml4ZXMuaW5jbHVkZXMoJ25ndHAnKSkgY29tcG91bmRQcmVmaXhlcy5wdXNoKCduZ3RwJyk7XG5cblx0cmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG5cdFx0Tmd0UmVuZGVyZXJGYWN0b3J5LFxuXHRcdHsgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwgdXNlRXhpc3Rpbmc6IE5ndFJlbmRlcmVyRmFjdG9yeSB9LFxuXHRcdHsgcHJvdmlkZTogTkdUX0NPTVBPVU5EX1BSRUZJWEVTLCB1c2VWYWx1ZTogY29tcG91bmRQcmVmaXhlcyB9LFxuXHRcdHByb3ZpZGVOZ3RTdG9yZShzdG9yZSksXG5cdFx0cHJvdmlkZVpvbmVDaGFuZ2VEZXRlY3Rpb24oeyBydW5Db2FsZXNjaW5nOiB0cnVlLCBldmVudENvYWxlc2Npbmc6IHRydWUgfSksXG5cdF0pO1xufVxuXG5leHBvcnQgeyBleHRlbmQgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5leHBvcnQgeyBIVE1MLCBST1VURURfU0NFTkUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG4iXX0=