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,207 +1,181 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectorRef, ElementRef, InjectionToken, Injector, Optional, SkipSelf, effect, inject, runInInjectionContext, } from '@angular/core';
2
+ import { ElementRef, InjectionToken, Optional, SkipSelf, effect, inject } from '@angular/core';
3
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
3
4
  import { Subject } from 'rxjs';
4
5
  import * as THREE from 'three';
5
- import { NGT_LOOP } from './loop';
6
- import { createInjectionToken } from './utils/create-injection-token';
6
+ import { injectNgtLoop } from './loop';
7
7
  import { is } from './utils/is';
8
8
  import { makeDpr } from './utils/make';
9
- import { safeDetectChanges } from './utils/safe-detect-changes';
10
9
  import { signalStore } from './utils/signal-store';
11
10
  import { updateCamera } from './utils/update';
12
- function storeFactory(loop, document, injector, parent) {
13
- return runInInjectionContext(injector, () => {
14
- const window = document.defaultView;
15
- if (!window) {
16
- // TODO: revisit this when we need to support multiple platforms
17
- throw new Error(`[NGT] Window is not available.`);
18
- }
19
- const cdr = inject(ChangeDetectorRef);
20
- // NOTE: using Subject because we do not care about late-subscribers
21
- const pointerMissed$ = new Subject();
22
- const store = signalStore(({ get, set }) => {
23
- const { invalidate, advance } = loop;
24
- const position = new THREE.Vector3();
25
- const defaultTarget = new THREE.Vector3();
26
- const tempTarget = new THREE.Vector3();
27
- function getCurrentViewport(camera = get('camera'), target = defaultTarget, size = get('size')) {
28
- const { width, height, top, left } = size;
29
- const aspect = width / height;
30
- if (target instanceof THREE.Vector3)
31
- tempTarget.copy(target);
32
- else
33
- tempTarget.set(...target);
34
- const distance = camera.getWorldPosition(position).distanceTo(tempTarget);
35
- if (is.orthographicCamera(camera)) {
36
- return {
37
- width: width / camera.zoom,
38
- height: height / camera.zoom,
39
- top,
40
- left,
41
- factor: 1,
42
- distance,
43
- aspect,
44
- };
45
- }
46
- else {
47
- const fov = (camera.fov * Math.PI) / 180; // convert vertical fov to radians
48
- const h = 2 * Math.tan(fov / 2) * distance; // visible height
49
- const w = h * (width / height);
50
- return { width: w, height: h, top, left, factor: width / w, distance, aspect };
51
- }
11
+ function storeFactory(previousStore) {
12
+ const document = inject(DOCUMENT);
13
+ const window = document.defaultView;
14
+ if (!window) {
15
+ // TODO: revisit this when we need to support multiple platforms
16
+ throw new Error(`[NGT] Window is not available.`);
17
+ }
18
+ const loop = injectNgtLoop();
19
+ // NOTE: using Subject because we do not care about late-subscribers
20
+ const pointerMissed$ = new Subject();
21
+ const store = signalStore(({ get, update }) => {
22
+ const { invalidate, advance } = loop;
23
+ const position = new THREE.Vector3();
24
+ const defaultTarget = new THREE.Vector3();
25
+ const tempTarget = new THREE.Vector3();
26
+ function getCurrentViewport(camera = get('camera'), target = defaultTarget, size = get('size')) {
27
+ const { width, height, top, left } = size;
28
+ const aspect = width / height;
29
+ if (target instanceof THREE.Vector3)
30
+ tempTarget.copy(target);
31
+ else
32
+ tempTarget.set(...target);
33
+ const distance = camera.getWorldPosition(position).distanceTo(tempTarget);
34
+ if (is.orthographicCamera(camera)) {
35
+ return { width: width / camera.zoom, height: height / camera.zoom, top, left, factor: 1, distance, aspect };
52
36
  }
53
- let performanceTimeout = undefined;
54
- const setPerformanceCurrent = (current) => set((state) => ({ performance: { ...state.performance, current } }));
55
- const pointer = new THREE.Vector2();
56
- return {
57
- pointerMissed$: pointerMissed$.asObservable(),
58
- events: { priority: 1, enabled: true, connected: false },
59
- invalidate: (frames = 1) => invalidate(store, frames),
60
- advance: (timestamp, runGlobalEffects) => advance(timestamp, runGlobalEffects, store),
61
- legacy: false,
62
- linear: false,
63
- flat: false,
64
- controls: null,
65
- clock: new THREE.Clock(),
66
- pointer,
67
- frameloop: 'always',
68
- performance: {
69
- current: 1,
70
- min: 0.5,
71
- max: 1,
72
- debounce: 200,
73
- regress: () => {
74
- const state = get();
75
- // Clear timeout
76
- if (performanceTimeout)
77
- clearTimeout(performanceTimeout);
78
- // Set lower bound performance
79
- if (state.performance.current !== state.performance.min)
80
- setPerformanceCurrent(state.performance.min);
81
- // Go back to upper bound performance after a while unless something regresses meanwhile
82
- performanceTimeout = setTimeout(() => {
83
- setPerformanceCurrent(get('performance', 'max'));
84
- safeDetectChanges(cdr);
85
- }, state.performance.debounce);
86
- },
87
- },
88
- size: { width: 0, height: 0, top: 0, left: 0, updateStyle: false },
89
- viewport: {
90
- initialDpr: 0,
91
- dpr: 0,
92
- width: 0,
93
- height: 0,
94
- top: 0,
95
- left: 0,
96
- aspect: 0,
97
- distance: 0,
98
- factor: 0,
99
- getCurrentViewport,
100
- },
101
- setEvents: (events) => set((state) => ({ ...state, events: { ...state.events, ...events } })),
102
- setSize: (width, height, top, left) => {
103
- const camera = get('camera');
104
- const size = { width, height, top: top || 0, left: left || 0 };
105
- set((state) => ({
106
- size,
107
- viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
108
- }));
37
+ const fov = (camera.fov * Math.PI) / 180; // convert vertical fov to radians
38
+ const h = 2 * Math.tan(fov / 2) * distance; // visible height
39
+ const w = h * (width / height);
40
+ return { width: w, height: h, top, left, factor: width / w, distance, aspect };
41
+ }
42
+ let performanceTimeout = undefined;
43
+ const setPerformanceCurrent = (current) => update((state) => ({ performance: { ...state.performance, current } }));
44
+ const pointer = new THREE.Vector2();
45
+ return {
46
+ pointerMissed$: pointerMissed$.asObservable(),
47
+ events: { priority: 1, enabled: true, connected: false },
48
+ invalidate: (frames = 1) => invalidate(store, frames),
49
+ advance: (timestamp, runGlobalEffects) => advance(timestamp, runGlobalEffects, store),
50
+ legacy: false,
51
+ linear: false,
52
+ flat: false,
53
+ controls: null,
54
+ clock: new THREE.Clock(),
55
+ pointer,
56
+ frameloop: 'always',
57
+ performance: {
58
+ current: 1,
59
+ min: 0.5,
60
+ max: 1,
61
+ debounce: 200,
62
+ regress: () => {
63
+ const state = get();
64
+ // Clear timeout
65
+ if (performanceTimeout)
66
+ clearTimeout(performanceTimeout);
67
+ // Set lower bound performance
68
+ if (state.performance.current !== state.performance.min)
69
+ setPerformanceCurrent(state.performance.min);
70
+ // Go back to upper bound performance after a while unless something regresses meanwhile
71
+ performanceTimeout = setTimeout(() => {
72
+ setPerformanceCurrent(get('performance', 'max'));
73
+ // safeDetectChanges(cdr);
74
+ }, state.performance.debounce);
109
75
  },
110
- setDpr: (dpr) => set((state) => {
111
- const resolved = makeDpr(dpr, window);
112
- return {
113
- viewport: {
114
- ...state.viewport,
115
- dpr: resolved,
116
- initialDpr: state.viewport.initialDpr || resolved,
117
- },
118
- };
119
- }),
120
- setFrameloop: (frameloop = 'always') => {
121
- const clock = get('clock');
122
- // if frameloop === "never" clock.elapsedTime is updated using advance(timestamp)
123
- clock.stop();
76
+ },
77
+ size: { width: 0, height: 0, top: 0, left: 0, updateStyle: false },
78
+ viewport: {
79
+ initialDpr: 0,
80
+ dpr: 0,
81
+ width: 0,
82
+ height: 0,
83
+ top: 0,
84
+ left: 0,
85
+ aspect: 0,
86
+ distance: 0,
87
+ factor: 0,
88
+ getCurrentViewport,
89
+ },
90
+ setEvents: (events) => update((state) => ({ ...state, events: { ...state.events, ...events } })),
91
+ setSize: (width, height, top, left) => {
92
+ const camera = get('camera');
93
+ const size = { width, height, top: top || 0, left: left || 0 };
94
+ update((state) => ({
95
+ size,
96
+ viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
97
+ }));
98
+ },
99
+ setDpr: (dpr) => update((state) => {
100
+ const resolved = makeDpr(dpr, window);
101
+ return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } };
102
+ }),
103
+ setFrameloop: (frameloop = 'always') => {
104
+ const clock = get('clock');
105
+ // if frameloop === "never" clock.elapsedTime is updated using advance(timestamp)
106
+ clock.stop();
107
+ clock.elapsedTime = 0;
108
+ if (frameloop !== 'never') {
109
+ clock.start();
124
110
  clock.elapsedTime = 0;
125
- if (frameloop !== 'never') {
126
- clock.start();
127
- clock.elapsedTime = 0;
128
- }
129
- set(() => ({ frameloop }));
130
- },
131
- previousRoot: parent,
132
- internal: {
133
- active: false,
134
- priority: 0,
135
- frames: 0,
136
- lastEvent: new ElementRef(null),
137
- interaction: [],
138
- hovered: new Map(),
139
- subscribers: [],
140
- initialClick: [0, 0],
141
- initialHits: [],
142
- capturedMap: new Map(),
143
- subscribe: (callback, priority = 0, _store = store) => {
111
+ }
112
+ update(() => ({ frameloop }));
113
+ },
114
+ previousRoot: previousStore,
115
+ internal: {
116
+ active: false,
117
+ priority: 0,
118
+ frames: 0,
119
+ lastEvent: new ElementRef(null),
120
+ interaction: [],
121
+ hovered: new Map(),
122
+ subscribers: [],
123
+ initialClick: [0, 0],
124
+ initialHits: [],
125
+ capturedMap: new Map(),
126
+ subscribe: (callback, priority = 0, _store = store) => {
127
+ const internal = get('internal');
128
+ // If this subscription was given a priority, it takes rendering into its own hands
129
+ // For that reason we switch off automatic rendering and increase the manual flag
130
+ // As long as this flag is positive there can be no internal rendering at all
131
+ // because there could be multiple render subscriptions
132
+ internal.priority = internal.priority + (priority > 0 ? 1 : 0);
133
+ internal.subscribers.push({ callback, priority, store: _store });
134
+ // Register subscriber and sort layers from lowest to highest, meaning,
135
+ // highest priority renders last (on top of the other frames)
136
+ internal.subscribers = internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
137
+ return () => {
144
138
  const internal = get('internal');
145
- // If this subscription was given a priority, it takes rendering into its own hands
146
- // For that reason we switch off automatic rendering and increase the manual flag
147
- // As long as this flag is positive there can be no internal rendering at all
148
- // because there could be multiple render subscriptions
149
- internal.priority = internal.priority + (priority > 0 ? 1 : 0);
150
- internal.subscribers.push({ callback, priority, store });
151
- // Register subscriber and sort layers from lowest to highest, meaning,
152
- // highest priority renders last (on top of the other frames)
153
- internal.subscribers = internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
154
- return () => {
155
- const internal = get('internal');
156
- if (internal?.subscribers) {
157
- // Decrease manual flag if this subscription had a priority
158
- internal.priority = internal.priority - (priority > 0 ? 1 : 0);
159
- // Remove subscriber from list
160
- internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
161
- }
162
- };
163
- },
139
+ if (internal?.subscribers) {
140
+ // Decrease manual flag if this subscription had a priority
141
+ internal.priority = internal.priority - (priority > 0 ? 1 : 0);
142
+ // Remove subscriber from list
143
+ internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
144
+ }
145
+ };
164
146
  },
165
- };
166
- });
167
- // NOTE: assign pointerMissed$ so we can use it in events
168
- Object.defineProperty(store, 'pointerMissed$', { get: () => pointerMissed$ });
169
- const state = store.get();
170
- let oldSize = state.size;
171
- let oldDpr = state.viewport.dpr;
172
- let oldCamera = state.camera;
173
- const _camera = store.select('camera');
174
- const _size = store.select('size');
175
- const _viewport = store.select('viewport');
176
- effect(() => {
177
- const [camera, size, viewport, gl] = [_camera(), _size(), _viewport(), store.get('gl')];
178
- // Resize camera and renderer on changes to size and pixelratio
179
- if (size !== oldSize || viewport.dpr !== oldDpr) {
180
- oldSize = size;
181
- oldDpr = viewport.dpr;
182
- // Update camera & renderer
183
- updateCamera(camera, size);
184
- gl.setPixelRatio(viewport.dpr);
185
- const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement;
186
- gl.setSize(size.width, size.height, updateStyle);
187
- }
188
- // Update viewport once the camera changes
189
- if (camera !== oldCamera) {
190
- oldCamera = camera;
191
- updateCamera(camera, size);
192
- // Update viewport
193
- store.set((state) => ({
194
- viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) },
195
- }));
196
- }
197
- });
198
- return store;
147
+ },
148
+ };
149
+ });
150
+ Object.defineProperty(store, 'pointerMissed$', { get: () => pointerMissed$ });
151
+ let { size: oldSize, viewport: { dpr: oldDpr }, camera: oldCamera, } = store.snapshot;
152
+ const [camera, size, viewportDpr] = [store.select('camera'), store.select('size'), store.select('viewport', 'dpr')];
153
+ effect(() => {
154
+ const [newCamera, newSize, newDpr, gl] = [camera(), size(), viewportDpr(), store.snapshot.gl];
155
+ // Resize camera and renderer on changes to size and pixel-ratio
156
+ if (newSize !== oldSize || newDpr !== oldDpr) {
157
+ oldSize = newSize;
158
+ oldDpr = newDpr;
159
+ // Update camera & renderer
160
+ updateCamera(newCamera, newSize);
161
+ gl.setPixelRatio(newDpr);
162
+ const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement;
163
+ gl.setSize(newSize.width, newSize.height, updateStyle);
164
+ }
165
+ // Update viewport once the camera changes
166
+ if (newCamera !== oldCamera) {
167
+ oldCamera = newCamera;
168
+ updateCamera(newCamera, newSize);
169
+ // Update viewport
170
+ store.update((state) => ({ viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(newCamera) } }));
171
+ }
199
172
  });
173
+ return store;
200
174
  }
201
- export const NGT_STORE = new InjectionToken('NgtStore token');
175
+ export const NGT_STORE = new InjectionToken('NgtStore Token');
202
176
  export const [injectNgtStore, provideNgtStore] = createInjectionToken(storeFactory, {
203
177
  isRoot: false,
204
- deps: [NGT_LOOP, DOCUMENT, Injector, [new Optional(), new SkipSelf(), NGT_STORE]],
178
+ deps: [[new Optional(), new SkipSelf(), NGT_STORE]],
205
179
  token: NGT_STORE,
206
180
  });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsY0FBYyxFQUNkLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04scUJBQXFCLEdBQ3JCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRy9CLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXNJOUMsU0FBUyxZQUFZLENBQUMsSUFBYSxFQUFFLFFBQWtCLEVBQUUsUUFBa0IsRUFBRSxNQUF1QztJQUNuSCxPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUVwQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1osZ0VBQWdFO1lBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztT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QUFFO0lBQ25GLE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakYsS0FBSyxFQUFFLFNBQVM7Q0FDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdEVsZW1lbnRSZWYsXG5cdEluamVjdGlvblRva2VuLFxuXHRJbmplY3Rvcixcblx0T3B0aW9uYWwsXG5cdFNraXBTZWxmLFxuXHRlZmZlY3QsXG5cdGluamVjdCxcblx0cnVuSW5JbmplY3Rpb25Db250ZXh0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHR5cGUgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RDYW1lcmEsIE5ndERvbUV2ZW50LCBOZ3RFdmVudE1hbmFnZXIsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0LCBOZ3RUaHJlZUV2ZW50IH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RJbnN0YW5jZU5vZGUgfSBmcm9tICcuL2luc3RhbmNlJztcbmltcG9ydCB7IE5HVF9MT09QLCB0eXBlIE5ndExvb3AgfSBmcm9tICcuL2xvb3AnO1xuaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuL3V0aWxzL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VEcHIgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuaW1wb3J0IHsgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICcuL3V0aWxzL3NhZmUtZGV0ZWN0LWNoYW5nZXMnO1xuaW1wb3J0IHsgc2lnbmFsU3RvcmUsIHR5cGUgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyB1cGRhdGVDYW1lcmEgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZSc7XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyID0geyByZW5kZXI6IChzY2VuZTogVEhSRUUuU2NlbmUsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSA9PiBhbnkgfTtcbmV4cG9ydCB0eXBlIE5ndENhbWVyYU1hbnVhbCA9IE5ndENhbWVyYSAmIHsgbWFudWFsPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgdHlwZSBOZ3REcHIgPSBudW1iZXIgfCBbbWluOiBudW1iZXIsIG1heDogbnVtYmVyXTtcbmV4cG9ydCB0eXBlIE5ndFNpemUgPSB7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xuXHR0b3A6IG51bWJlcjtcblx0bGVmdDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Vmlld3BvcnQgPSBOZ3RTaXplICYge1xuXHQvKiogVGhlIGluaXRpYWwgcGl4ZWwgcmF0aW8gKi9cblx0aW5pdGlhbERwcjogbnVtYmVyO1xuXHQvKiogQ3VycmVudCBwaXhlbCByYXRpbyAqL1xuXHRkcHI6IG51bWJlcjtcblx0LyoqIHNpemUud2lkdGggLyB2aWV3cG9ydC53aWR0aCAqL1xuXHRmYWN0b3I6IG51bWJlcjtcblx0LyoqIENhbWVyYSBkaXN0YW5jZSAqL1xuXHRkaXN0YW5jZTogbnVtYmVyO1xuXHQvKiogQ2FtZXJhIGFzcGVjdCByYXRpbzogd2lkdGggLyBoZWlnaHQgKi9cblx0YXNwZWN0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RQZXJmb3JtYW5jZSA9IHtcblx0LyoqIEN1cnJlbnQgcGVyZm9ybWFuY2Ugbm9ybWFsLCBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG5cdGN1cnJlbnQ6IG51bWJlcjtcblx0LyoqIEhvdyBsb3cgdGhlIHBlcmZvcm1hbmNlIGNhbiBnbywgYmV0d2VlbiAwIGFuZCBtYXggKi9cblx0bWluOiBudW1iZXI7XG5cdC8qKiBIb3cgaGlnaCB0aGUgcGVyZm9ybWFuY2UgY2FuIGdvLCBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG5cdG1heDogbnVtYmVyO1xuXHQvKiogVGltZSB1bnRpbCBjdXJyZW50IHJldHVybnMgdG8gbWF4IGluIG1zICovXG5cdGRlYm91bmNlOiBudW1iZXI7XG5cdC8qKiBTZXRzIGN1cnJlbnQgdG8gbWluLCBwdXRzIHRoZSBzeXN0ZW0gaW4gcmVncmVzc2lvbiAqL1xuXHRyZWdyZXNzOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyU3RhdGUgPSBOZ3RTdGF0ZSAmIHsgZGVsdGE6IG51bWJlcjsgZnJhbWU/OiBYUkZyYW1lIH07XG5cbmV4cG9ydCB0eXBlIE5ndEJlZm9yZVJlbmRlckV2ZW50PFRPYmplY3QgZXh0ZW5kcyBOZ3RJbnN0YW5jZU5vZGUgPSBOZ3RJbnN0YW5jZU5vZGU+ID0ge1xuXHRzdGF0ZTogTmd0UmVuZGVyU3RhdGU7XG5cdG9iamVjdDogVE9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEJlZm9yZVJlbmRlclJlY29yZCA9IHtcblx0Y2FsbGJhY2s6IChzdGF0ZTogTmd0UmVuZGVyU3RhdGUpID0+IHZvaWQ7XG5cdHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5cdHByaW9yaXR5PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0SW50ZXJuYWxTdGF0ZSA9IHtcblx0YWN0aXZlOiBib29sZWFuO1xuXHRwcmlvcml0eTogbnVtYmVyO1xuXHRmcmFtZXM6IG51bWJlcjtcblx0bGFzdEV2ZW50OiBFbGVtZW50UmVmPE5ndERvbUV2ZW50IHwgbnVsbD47XG5cdGludGVyYWN0aW9uOiBUSFJFRS5PYmplY3QzRFtdO1xuXHRob3ZlcmVkOiBNYXA8c3RyaW5nLCBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pj47XG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj47XG5cdGluaXRpYWxDbGljazogW3g6IG51bWJlciwgeTogbnVtYmVyXTtcblx0aW5pdGlhbEhpdHM6IFRIUkVFLk9iamVjdDNEW107XG5cdHN1YnNjcmliZXJzOiBOZ3RCZWZvcmVSZW5kZXJSZWNvcmRbXTtcblx0c3Vic2NyaWJlOiAoXG5cdFx0Y2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcblx0XHRwcmlvcml0eT86IG51bWJlcixcblx0XHRzdG9yZT86IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPixcblx0KSA9PiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0U3RhdGUgPSB7XG5cdC8qKiB3aGVuIGFsbCBidWlsZGluZyBibG9ja3MgYXJlIGluaXRpYWxpemVkICovXG5cdHJlYWR5OiBib29sZWFuO1xuXHQvKiogVGhlIGluc3RhbmNlIG9mIHRoZSByZW5kZXJlciAqL1xuXHRnbDogVEhSRUUuV2ViR0xSZW5kZXJlcjtcblx0LyoqIERlZmF1bHQgY2FtZXJhICovXG5cdGNhbWVyYTogTmd0Q2FtZXJhTWFudWFsO1xuXHQvKiogRGVmYXVsdCBzY2VuZSAqL1xuXHRzY2VuZTogVEhSRUUuU2NlbmU7XG5cdC8qKiBEZWZhdWx0IHJheWNhc3RlciAqL1xuXHRyYXljYXN0ZXI6IFRIUkVFLlJheWNhc3Rlcjtcblx0LyoqIERlZmF1bHQgY2xvY2sgKi9cblx0Y2xvY2s6IFRIUkVFLkNsb2NrO1xuXHQvKiogRXZlbnQgbGF5ZXIgaW50ZXJmYWNlLCBjb250YWlucyB0aGUgZXZlbnQgaGFuZGxlciBhbmQgdGhlIG5vZGUgdGhleSdyZSBjb25uZWN0ZWQgdG8gKi9cblx0ZXZlbnRzOiBOZ3RFdmVudE1hbmFnZXI8YW55Pjtcblx0LyoqIFhSIGludGVyZmFjZSAqL1xuXHR4cjogeyBjb25uZWN0OiAoKSA9PiB2b2lkOyBkaXNjb25uZWN0OiAoKSA9PiB2b2lkIH07XG5cdC8qKiBDdXJyZW50bHkgdXNlZCBjb250cm9scyAqL1xuXHRjb250cm9sczogVEhSRUUuRXZlbnREaXNwYXRjaGVyIHwgbnVsbDtcblx0LyoqIE5vcm1hbGl6ZWQgZXZlbnQgY29vcmRpbmF0ZXMgKi9cblx0cG9pbnRlcjogVEhSRUUuVmVjdG9yMjtcblx0LyogV2hldGhlciB0byBlbmFibGUgcjEzOSdzIFRIUkVFLkNvbG9yTWFuYWdlbWVudCAqL1xuXHRsZWdhY3k6IGJvb2xlYW47XG5cdC8qKiBTaG9ydGN1dCB0byBnbC5vdXRwdXRDb2xvclNwYWNlID0gVEhSRUUuTGluZWFyU1JHQkNvbG9yU3BhY2UgKi9cblx0bGluZWFyOiBib29sZWFuO1xuXHQvKiogU2hvcnRjdXQgdG8gZ2wudG9uZU1hcHBpbmcgPSBOb1RvbmVtYXBwaW5nICovXG5cdGZsYXQ6IGJvb2xlYW47XG5cdC8qKiBSZW5kZXIgbG9vcCBmbGFncyAqL1xuXHRmcmFtZWxvb3A6ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInO1xuXHQvKiogQWRhcHRpdmUgcGVyZm9ybWFuY2UgaW50ZXJmYWNlICovXG5cdHBlcmZvcm1hbmNlOiBOZ3RQZXJmb3JtYW5jZTtcblx0LyoqIFJlYWN0aXZlIHBpeGVsLXNpemUgb2YgdGhlIGNhbnZhcyAqL1xuXHRzaXplOiBOZ3RTaXplO1xuXHQvKiogUmVhY3RpdmUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgaW4gdGhyZWVqcyB1bml0cyAqL1xuXHR2aWV3cG9ydDogTmd0Vmlld3BvcnQgJiB7XG5cdFx0Z2V0Q3VycmVudFZpZXdwb3J0OiAoXG5cdFx0XHRjYW1lcmE/OiBOZ3RDYW1lcmEsXG5cdFx0XHR0YXJnZXQ/OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4sXG5cdFx0XHRzaXplPzogTmd0U2l6ZSxcblx0XHQpID0+IE9taXQ8Tmd0Vmlld3BvcnQsICdkcHInIHwgJ2luaXRpYWxEcHInPjtcblx0fTtcblx0LyoqIEZsYWdzIHRoZSBjYW52YXMgZm9yIHJlbmRlciwgYnV0IGRvZXNuJ3QgcmVuZGVyIGluIGl0c2VsZiAqL1xuXHRpbnZhbGlkYXRlOiAoZnJhbWVzPzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogQWR2YW5jZSAocmVuZGVyKSBvbmUgc3RlcCAqL1xuXHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gc2V0dGluZyB0aGUgZXZlbnQgbGF5ZXIgKi9cblx0c2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT4gdm9pZDtcblx0LyoqXG5cdCAqIFNob3J0Y3V0IHRvIG1hbnVhbCBzaXppbmdcblx0ICovXG5cdHNldFNpemU6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gbWFudWFsIHNldHRpbmcgdGhlIHBpeGVsIHJhdGlvICovXG5cdHNldERwcjogKGRwcjogTmd0RHByKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gZnJhbWVsb29wIGZsYWdzICovXG5cdHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcD86ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInKSA9PiB2b2lkO1xuXHQvKiogV2hlbiB0aGUgY2FudmFzIHdhcyBjbGlja2VkIGJ1dCBub3RoaW5nIHdhcyBoaXQgKi9cblx0LyoqIFBvaW50ZXJNaXNzZWQgT2JzZXJ2YWJsZSAqL1xuXHRwb2ludGVyTWlzc2VkJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50Pjtcblx0LyoqIElmIHRoaXMgc3RhdGUgbW9kZWwgaXMgbGF5ZXJkICh2aWEgY3JlYXRlUG9ydGFsKSB0aGVuIHRoaXMgY29udGFpbnMgdGhlIHByZXZpb3VzIGxheWVyICovXG5cdHByZXZpb3VzUm9vdDogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHwgbnVsbDtcblx0LyoqIEludGVybmFscyAqL1xuXHRpbnRlcm5hbDogTmd0SW50ZXJuYWxTdGF0ZTtcbn07XG5cbmZ1bmN0aW9uIHN0b3JlRmFjdG9yeShsb29wOiBOZ3RMb29wLCBkb2N1bWVudDogRG9jdW1lbnQsIGluamVjdG9yOiBJbmplY3RvciwgcGFyZW50OiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCBudWxsKSB7XG5cdHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCB3aW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICghd2luZG93KSB7XG5cdFx0XHQvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBuZWVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgcGxhdGZvcm1zXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFtOR1RdIFdpbmRvdyBpcyBub3QgYXZhaWxhYmxlLmApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cblx0XHQvLyBOT1RFOiB1c2luZyBTdWJqZWN0IGJlY2F1c2Ugd2UgZG8gbm90IGNhcmUgYWJvdXQgbGF0ZS1zdWJzY3JpYmVyc1xuXHRcdGNvbnN0IHBvaW50ZXJNaXNzZWQkID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuXHRcdGNvbnN0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gPSBzaWduYWxTdG9yZTxOZ3RTdGF0ZT4oKHsgZ2V0LCBzZXQgfSkgPT4ge1xuXHRcdFx0Y29uc3QgeyBpbnZhbGlkYXRlLCBhZHZhbmNlIH0gPSBsb29wO1xuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cdFx0XHRjb25zdCBkZWZhdWx0VGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IHRlbXBUYXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5cdFx0XHRmdW5jdGlvbiBnZXRDdXJyZW50Vmlld3BvcnQoXG5cdFx0XHRcdGNhbWVyYTogTmd0Q2FtZXJhID0gZ2V0KCdjYW1lcmEnKSxcblx0XHRcdFx0dGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4gPSBkZWZhdWx0VGFyZ2V0LFxuXHRcdFx0XHRzaXplOiBOZ3RTaXplID0gZ2V0KCdzaXplJyksXG5cdFx0XHQpOiBPbWl0PE5ndFZpZXdwb3J0LCAnZHByJyB8ICdpbml0aWFsRHByJz4ge1xuXHRcdFx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gc2l6ZTtcblx0XHRcdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG5cdFx0XHRcdGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB0ZW1wVGFyZ2V0LmNvcHkodGFyZ2V0KTtcblx0XHRcdFx0ZWxzZSB0ZW1wVGFyZ2V0LnNldCguLi50YXJnZXQpO1xuXHRcdFx0XHRjb25zdCBkaXN0YW5jZSA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKHBvc2l0aW9uKS5kaXN0YW5jZVRvKHRlbXBUYXJnZXQpO1xuXHRcdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0d2lkdGg6IHdpZHRoIC8gY2FtZXJhLnpvb20sXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGhlaWdodCAvIGNhbWVyYS56b29tLFxuXHRcdFx0XHRcdFx0dG9wLFxuXHRcdFx0XHRcdFx0bGVmdCxcblx0XHRcdFx0XHRcdGZhY3RvcjogMSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0YXNwZWN0LFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZm92ID0gKGNhbWVyYS5mb3YgKiBNYXRoLlBJKSAvIDE4MDsgLy8gY29udmVydCB2ZXJ0aWNhbCBmb3YgdG8gcmFkaWFuc1xuXHRcdFx0XHRcdGNvbnN0IGggPSAyICogTWF0aC50YW4oZm92IC8gMikgKiBkaXN0YW5jZTsgLy8gdmlzaWJsZSBoZWlnaHRcblx0XHRcdFx0XHRjb25zdCB3ID0gaCAqICh3aWR0aCAvIGhlaWdodCk7XG5cdFx0XHRcdFx0cmV0dXJuIHsgd2lkdGg6IHcsIGhlaWdodDogaCwgdG9wLCBsZWZ0LCBmYWN0b3I6IHdpZHRoIC8gdywgZGlzdGFuY2UsIGFzcGVjdCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBwZXJmb3JtYW5jZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc2V0UGVyZm9ybWFuY2VDdXJyZW50ID0gKGN1cnJlbnQ6IG51bWJlcikgPT5cblx0XHRcdFx0c2V0KChzdGF0ZSkgPT4gKHsgcGVyZm9ybWFuY2U6IHsgLi4uc3RhdGUucGVyZm9ybWFuY2UsIGN1cnJlbnQgfSB9KSk7XG5cblx0XHRcdGNvbnN0IHBvaW50ZXIgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRwb2ludGVyTWlzc2VkJDogcG9pbnRlck1pc3NlZCQuYXNPYnNlcnZhYmxlKCksXG5cdFx0XHRcdGV2ZW50czogeyBwcmlvcml0eTogMSwgZW5hYmxlZDogdHJ1ZSwgY29ubmVjdGVkOiBmYWxzZSB9LFxuXG5cdFx0XHRcdGludmFsaWRhdGU6IChmcmFtZXMgPSAxKSA9PiBpbnZhbGlkYXRlKHN0b3JlLCBmcmFtZXMpLFxuXHRcdFx0XHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiBhZHZhbmNlKHRpbWVzdGFtcCwgcnVuR2xvYmFsRWZmZWN0cywgc3RvcmUpLFxuXG5cdFx0XHRcdGxlZ2FjeTogZmFsc2UsXG5cdFx0XHRcdGxpbmVhcjogZmFsc2UsXG5cdFx0XHRcdGZsYXQ6IGZhbHNlLFxuXG5cdFx0XHRcdGNvbnRyb2xzOiBudWxsLFxuXHRcdFx0XHRjbG9jazogbmV3IFRIUkVFLkNsb2NrKCksXG5cdFx0XHRcdHBvaW50ZXIsXG5cblx0XHRcdFx0ZnJhbWVsb29wOiAnYWx3YXlzJyxcblxuXHRcdFx0XHRwZXJmb3JtYW5jZToge1xuXHRcdFx0XHRcdGN1cnJlbnQ6IDEsXG5cdFx0XHRcdFx0bWluOiAwLjUsXG5cdFx0XHRcdFx0bWF4OiAxLFxuXHRcdFx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRcdFx0cmVncmVzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBnZXQoKTtcblx0XHRcdFx0XHRcdC8vIENsZWFyIHRpbWVvdXRcblx0XHRcdFx0XHRcdGlmIChwZXJmb3JtYW5jZVRpbWVvdXQpIGNsZWFyVGltZW91dChwZXJmb3JtYW5jZVRpbWVvdXQpO1xuXHRcdFx0XHRcdFx0Ly8gU2V0IGxvd2VyIGJvdW5kIHBlcmZvcm1hbmNlXG5cdFx0XHRcdFx0XHRpZiAoc3RhdGUucGVyZm9ybWFuY2UuY3VycmVudCAhPT0gc3RhdGUucGVyZm9ybWFuY2UubWluKVxuXHRcdFx0XHRcdFx0XHRzZXRQZXJmb3JtYW5jZUN1cnJlbnQoc3RhdGUucGVyZm9ybWFuY2UubWluKTtcblxuXHRcdFx0XHRcdFx0Ly8gR28gYmFjayB0byB1cHBlciBib3VuZCBwZXJmb3JtYW5jZSBhZnRlciBhIHdoaWxlIHVubGVzcyBzb21ldGhpbmcgcmVncmVzc2VzIG1lYW53aGlsZVxuXHRcdFx0XHRcdFx0cGVyZm9ybWFuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHNldFBlcmZvcm1hbmNlQ3VycmVudChnZXQoJ3BlcmZvcm1hbmNlJywgJ21heCcpKTtcblx0XHRcdFx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMoY2RyKTtcblx0XHRcdFx0XHRcdH0sIHN0YXRlLnBlcmZvcm1hbmNlLmRlYm91bmNlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdHNpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwLCB1cGRhdGVTdHlsZTogZmFsc2UgfSxcblx0XHRcdFx0dmlld3BvcnQ6IHtcblx0XHRcdFx0XHRpbml0aWFsRHByOiAwLFxuXHRcdFx0XHRcdGRwcjogMCxcblx0XHRcdFx0XHR3aWR0aDogMCxcblx0XHRcdFx0XHRoZWlnaHQ6IDAsXG5cdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0YXNwZWN0OiAwLFxuXHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdGZhY3RvcjogMCxcblx0XHRcdFx0XHRnZXRDdXJyZW50Vmlld3BvcnQsXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0c2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT5cblx0XHRcdFx0XHRzZXQoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpLFxuXHRcdFx0XHRzZXRTaXplOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRvcD86IG51bWJlciwgbGVmdD86IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhbWVyYSA9IGdldCgnY2FtZXJhJyk7XG5cdFx0XHRcdFx0Y29uc3Qgc2l6ZSA9IHsgd2lkdGgsIGhlaWdodCwgdG9wOiB0b3AgfHwgMCwgbGVmdDogbGVmdCB8fCAwIH07XG5cdFx0XHRcdFx0c2V0KChzdGF0ZSkgPT4gKHtcblx0XHRcdFx0XHRcdHNpemUsXG5cdFx0XHRcdFx0XHR2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSwgZGVmYXVsdFRhcmdldCwgc2l6ZSkgfSxcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldERwcjogKGRwcjogTmd0RHByKSA9PlxuXHRcdFx0XHRcdHNldCgoc3RhdGUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc29sdmVkID0gbWFrZURwcihkcHIsIHdpbmRvdyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHR2aWV3cG9ydDoge1xuXHRcdFx0XHRcdFx0XHRcdC4uLnN0YXRlLnZpZXdwb3J0LFxuXHRcdFx0XHRcdFx0XHRcdGRwcjogcmVzb2x2ZWQsXG5cdFx0XHRcdFx0XHRcdFx0aW5pdGlhbERwcjogc3RhdGUudmlld3BvcnQuaW5pdGlhbERwciB8fCByZXNvbHZlZCxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcDogJ2Fsd2F5cycgfCAnZGVtYW5kJyB8ICduZXZlcicgPSAnYWx3YXlzJykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNsb2NrID0gZ2V0KCdjbG9jaycpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgZnJhbWVsb29wID09PSBcIm5ldmVyXCIgY2xvY2suZWxhcHNlZFRpbWUgaXMgdXBkYXRlZCB1c2luZyBhZHZhbmNlKHRpbWVzdGFtcClcblx0XHRcdFx0XHRjbG9jay5zdG9wKCk7XG5cdFx0XHRcdFx0Y2xvY2suZWxhcHNlZFRpbWUgPSAwO1xuXG5cdFx0XHRcdFx0aWYgKGZyYW1lbG9vcCAhPT0gJ25ldmVyJykge1xuXHRcdFx0XHRcdFx0Y2xvY2suc3RhcnQoKTtcblx0XHRcdFx0XHRcdGNsb2NrLmVsYXBzZWRUaW1lID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0KCgpID0+ICh7IGZyYW1lbG9vcCB9KSk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0cHJldmlvdXNSb290OiBwYXJlbnQsXG5cdFx0XHRcdGludGVybmFsOiB7XG5cdFx0XHRcdFx0YWN0aXZlOiBmYWxzZSxcblx0XHRcdFx0XHRwcmlvcml0eTogMCxcblx0XHRcdFx0XHRmcmFtZXM6IDAsXG5cdFx0XHRcdFx0bGFzdEV2ZW50OiBuZXcgRWxlbWVudFJlZihudWxsKSxcblx0XHRcdFx0XHRpbnRlcmFjdGlvbjogW10sXG5cdFx0XHRcdFx0aG92ZXJlZDogbmV3IE1hcCgpLFxuXHRcdFx0XHRcdHN1YnNjcmliZXJzOiBbXSxcblx0XHRcdFx0XHRpbml0aWFsQ2xpY2s6IFswLCAwXSxcblx0XHRcdFx0XHRpbml0aWFsSGl0czogW10sXG5cdFx0XHRcdFx0Y2FwdHVyZWRNYXA6IG5ldyBNYXAoKSxcblxuXHRcdFx0XHRcdHN1YnNjcmliZTogKFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcblx0XHRcdFx0XHRcdHByaW9yaXR5ID0gMCxcblx0XHRcdFx0XHRcdF9zdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+ID0gc3RvcmUsXG5cdFx0XHRcdFx0KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcm5hbCA9IGdldCgnaW50ZXJuYWwnKTtcblx0XHRcdFx0XHRcdC8vIElmIHRoaXMgc3Vic2NyaXB0aW9uIHdhcyBnaXZlbiBhIHByaW9yaXR5LCBpdCB0YWtlcyByZW5kZXJpbmcgaW50byBpdHMgb3duIGhhbmRzXG5cdFx0XHRcdFx0XHQvLyBGb3IgdGhhdCByZWFzb24gd2Ugc3dpdGNoIG9mZiBhdXRvbWF0aWMgcmVuZGVyaW5nIGFuZCBpbmNyZWFzZSB0aGUgbWFudWFsIGZsYWdcblx0XHRcdFx0XHRcdC8vIEFzIGxvbmcgYXMgdGhpcyBmbGFnIGlzIHBvc2l0aXZlIHRoZXJlIGNhbiBiZSBubyBpbnRlcm5hbCByZW5kZXJpbmcgYXQgYWxsXG5cdFx0XHRcdFx0XHQvLyBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHJlbmRlciBzdWJzY3JpcHRpb25zXG5cdFx0XHRcdFx0XHRpbnRlcm5hbC5wcmlvcml0eSA9IGludGVybmFsLnByaW9yaXR5ICsgKHByaW9yaXR5ID4gMCA/IDEgOiAwKTtcblx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzLnB1c2goeyBjYWxsYmFjaywgcHJpb3JpdHksIHN0b3JlIH0pO1xuXHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgc3Vic2NyaWJlciBhbmQgc29ydCBsYXllcnMgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCwgbWVhbmluZyxcblx0XHRcdFx0XHRcdC8vIGhpZ2hlc3QgcHJpb3JpdHkgcmVuZGVycyBsYXN0IChvbiB0b3Agb2YgdGhlIG90aGVyIGZyYW1lcylcblx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzID0gaW50ZXJuYWwuc3Vic2NyaWJlcnMuc29ydChcblx0XHRcdFx0XHRcdFx0KGEsIGIpID0+IChhLnByaW9yaXR5IHx8IDApIC0gKGIucHJpb3JpdHkgfHwgMCksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW50ZXJuYWwgPSBnZXQoJ2ludGVybmFsJyk7XG5cdFx0XHRcdFx0XHRcdGlmIChpbnRlcm5hbD8uc3Vic2NyaWJlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWNyZWFzZSBtYW51YWwgZmxhZyBpZiB0aGlzIHN1YnNjcmlwdGlvbiBoYWQgYSBwcmlvcml0eVxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgLSAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlbW92ZSBzdWJzY3JpYmVyIGZyb20gbGlzdFxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzID0gaW50ZXJuYWwuc3Vic2NyaWJlcnMuZmlsdGVyKChzKSA9PiBzLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gcG9pbnRlck1pc3NlZCQgc28gd2UgY2FuIHVzZSBpdCBpbiBldmVudHNcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RvcmUsICdwb2ludGVyTWlzc2VkJCcsIHsgZ2V0OiAoKSA9PiBwb2ludGVyTWlzc2VkJCB9KTtcblxuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cblx0XHRsZXQgb2xkU2l6ZSA9IHN0YXRlLnNpemU7XG5cdFx0bGV0IG9sZERwciA9IHN0YXRlLnZpZXdwb3J0LmRwcjtcblx0XHRsZXQgb2xkQ2FtZXJhID0gc3RhdGUuY2FtZXJhO1xuXG5cdFx0Y29uc3QgX2NhbWVyYSA9IHN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdFx0Y29uc3QgX3NpemUgPSBzdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0XHRjb25zdCBfdmlld3BvcnQgPSBzdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW2NhbWVyYSwgc2l6ZSwgdmlld3BvcnQsIGdsXSA9IFtfY2FtZXJhKCksIF9zaXplKCksIF92aWV3cG9ydCgpLCBzdG9yZS5nZXQoJ2dsJyldO1xuXG5cdFx0XHQvLyBSZXNpemUgY2FtZXJhIGFuZCByZW5kZXJlciBvbiBjaGFuZ2VzIHRvIHNpemUgYW5kIHBpeGVscmF0aW9cblx0XHRcdGlmIChzaXplICE9PSBvbGRTaXplIHx8IHZpZXdwb3J0LmRwciAhPT0gb2xkRHByKSB7XG5cdFx0XHRcdG9sZFNpemUgPSBzaXplO1xuXHRcdFx0XHRvbGREcHIgPSB2aWV3cG9ydC5kcHI7XG5cdFx0XHRcdC8vIFVwZGF0ZSBjYW1lcmEgJiByZW5kZXJlclxuXHRcdFx0XHR1cGRhdGVDYW1lcmEoY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0Z2wuc2V0UGl4ZWxSYXRpbyh2aWV3cG9ydC5kcHIpO1xuXG5cdFx0XHRcdGNvbnN0IHVwZGF0ZVN0eWxlID1cblx0XHRcdFx0XHR0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGdsLmRvbUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudDtcblx0XHRcdFx0Z2wuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCwgdXBkYXRlU3R5bGUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdmlld3BvcnQgb25jZSB0aGUgY2FtZXJhIGNoYW5nZXNcblx0XHRcdGlmIChjYW1lcmEgIT09IG9sZENhbWVyYSkge1xuXHRcdFx0XHRvbGRDYW1lcmEgPSBjYW1lcmE7XG5cdFx0XHRcdHVwZGF0ZUNhbWVyYShjYW1lcmEsIHNpemUpO1xuXHRcdFx0XHQvLyBVcGRhdGUgdmlld3BvcnRcblx0XHRcdFx0c3RvcmUuc2V0KChzdGF0ZSkgPT4gKHtcblx0XHRcdFx0XHR2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uc3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSkgfSxcblx0XHRcdFx0fSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHN0b3JlO1xuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0U3RvcmUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzdG9yZUZhY3Rvcnk+O1xuXG5leHBvcnQgY29uc3QgTkdUX1NUT1JFID0gbmV3IEluamVjdGlvblRva2VuPE5ndFN0b3JlPignTmd0U3RvcmUgdG9rZW4nKTtcbmV4cG9ydCBjb25zdCBbaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbihzdG9yZUZhY3RvcnksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW05HVF9MT09QLCBET0NVTUVOVCwgSW5qZWN0b3IsIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE5HVF9TVE9SRV1dLFxuXHR0b2tlbjogTkdUX1NUT1JFLFxufSk7XG4iXX0=
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQXVCLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOEg5QyxTQUFTLFlBQVksQ0FBQyxhQUE4QztJQUNuRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUVwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixnRUFBZ0U7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUU3QixvRUFBb0U7SUFDcEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztJQUVqRCxN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LEtBQUssV0FBVyxJQUFJLEVBQUUsQ0FBQyxVQUFVLFlBQVksaUJBQWlCLENBQUM7WUFDM0csRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ3RCLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDakMsa0JBQWtCO1lBQ2xCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakgsQ0FBQztJQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUEyQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRTtJQUNuRixNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELEtBQUssRUFBRSxTQUFTO0NBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCwgU2tpcFNlbGYsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ25neHRlbnNpb24vY3JlYXRlLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0eXBlIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB0eXBlIHsgTmd0Q2FtZXJhLCBOZ3REb21FdmVudCwgTmd0RXZlbnRNYW5hZ2VyLCBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCwgTmd0VGhyZWVFdmVudCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RMb29wIH0gZnJvbSAnLi9sb29wJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi91dGlscy9pcyc7XG5pbXBvcnQgeyBtYWtlRHByIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB7IHNpZ25hbFN0b3JlLCB0eXBlIE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuaW1wb3J0IHsgdXBkYXRlQ2FtZXJhIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlckxpa2UgPSB7IHJlbmRlcjogKHNjZW5lOiBUSFJFRS5TY2VuZSwgY2FtZXJhOiBUSFJFRS5DYW1lcmEpID0+IGFueSB9O1xuZXhwb3J0IHR5cGUgTmd0Q2FtZXJhTWFudWFsID0gTmd0Q2FtZXJhICYgeyBtYW51YWw/OiBib29sZWFuIH07XG5leHBvcnQgdHlwZSBOZ3REcHIgPSBudW1iZXIgfCBbbWluOiBudW1iZXIsIG1heDogbnVtYmVyXTtcbmV4cG9ydCB0eXBlIE5ndFNpemUgPSB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH07XG5cbmV4cG9ydCB0eXBlIE5ndFZpZXdwb3J0ID0gTmd0U2l6ZSAmIHtcblx0LyoqIFRoZSBpbml0aWFsIHBpeGVsIHJhdGlvICovXG5cdGluaXRpYWxEcHI6IG51bWJlcjtcblx0LyoqIEN1cnJlbnQgcGl4ZWwgcmF0aW8gKi9cblx0ZHByOiBudW1iZXI7XG5cdC8qKiBzaXplLndpZHRoIC8gdmlld3BvcnQud2lkdGggKi9cblx0ZmFjdG9yOiBudW1iZXI7XG5cdC8qKiBDYW1lcmEgZGlzdGFuY2UgKi9cblx0ZGlzdGFuY2U6IG51bWJlcjtcblx0LyoqIENhbWVyYSBhc3BlY3QgcmF0aW86IHdpZHRoIC8gaGVpZ2h0ICovXG5cdGFzcGVjdDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0UGVyZm9ybWFuY2UgPSB7XG5cdC8qKiBDdXJyZW50IHBlcmZvcm1hbmNlIG5vcm1hbCwgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuXHRjdXJyZW50OiBudW1iZXI7XG5cdC8qKiBIb3cgbG93IHRoZSBwZXJmb3JtYW5jZSBjYW4gZ28sIGJldHdlZW4gMCBhbmQgbWF4ICovXG5cdG1pbjogbnVtYmVyO1xuXHQvKiogSG93IGhpZ2ggdGhlIHBlcmZvcm1hbmNlIGNhbiBnbywgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuXHRtYXg6IG51bWJlcjtcblx0LyoqIFRpbWUgdW50aWwgY3VycmVudCByZXR1cm5zIHRvIG1heCBpbiBtcyAqL1xuXHRkZWJvdW5jZTogbnVtYmVyO1xuXHQvKiogU2V0cyBjdXJyZW50IHRvIG1pbiwgcHV0cyB0aGUgc3lzdGVtIGluIHJlZ3Jlc3Npb24gKi9cblx0cmVncmVzczogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlclN0YXRlID0gTmd0U3RhdGUgJiB7IGRlbHRhOiBudW1iZXI7IGZyYW1lPzogWFJGcmFtZSB9O1xuXG5leHBvcnQgdHlwZSBOZ3RCZWZvcmVSZW5kZXJFdmVudDxUT2JqZWN0IGV4dGVuZHMgTmd0SW5zdGFuY2VOb2RlID0gTmd0SW5zdGFuY2VOb2RlPiA9IHtcblx0c3RhdGU6IE5ndFJlbmRlclN0YXRlO1xuXHRvYmplY3Q6IFRPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RCZWZvcmVSZW5kZXJSZWNvcmQgPSB7XG5cdGNhbGxiYWNrOiAoc3RhdGU6IE5ndFJlbmRlclN0YXRlKSA9PiB2b2lkO1xuXHRzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXHRwcmlvcml0eT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEludGVybmFsU3RhdGUgPSB7XG5cdGFjdGl2ZTogYm9vbGVhbjtcblx0cHJpb3JpdHk6IG51bWJlcjtcblx0ZnJhbWVzOiBudW1iZXI7XG5cdGxhc3RFdmVudDogRWxlbWVudFJlZjxOZ3REb21FdmVudCB8IG51bGw+O1xuXHRpbnRlcmFjdGlvbjogVEhSRUUuT2JqZWN0M0RbXTtcblx0aG92ZXJlZDogTWFwPHN0cmluZywgTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4+O1xuXHRjYXB0dXJlZE1hcDogTWFwPG51bWJlciwgTWFwPFRIUkVFLk9iamVjdDNELCBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldD4+O1xuXHRpbml0aWFsQ2xpY2s6IFt4OiBudW1iZXIsIHk6IG51bWJlcl07XG5cdGluaXRpYWxIaXRzOiBUSFJFRS5PYmplY3QzRFtdO1xuXHRzdWJzY3JpYmVyczogTmd0QmVmb3JlUmVuZGVyUmVjb3JkW107XG5cdHN1YnNjcmliZTogKFxuXHRcdGNhbGxiYWNrOiBOZ3RCZWZvcmVSZW5kZXJSZWNvcmRbJ2NhbGxiYWNrJ10sXG5cdFx0cHJpb3JpdHk/OiBudW1iZXIsXG5cdFx0c3RvcmU/OiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4sXG5cdCkgPT4gKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFN0YXRlID0ge1xuXHQvKiogVGhlIGluc3RhbmNlIG9mIHRoZSByZW5kZXJlciAqL1xuXHRnbDogVEhSRUUuV2ViR0xSZW5kZXJlcjtcblx0LyoqIERlZmF1bHQgY2FtZXJhICovXG5cdGNhbWVyYTogTmd0Q2FtZXJhTWFudWFsO1xuXHQvKiogRGVmYXVsdCBzY2VuZSAqL1xuXHRzY2VuZTogVEhSRUUuU2NlbmU7XG5cdC8qKiBEZWZhdWx0IHJheWNhc3RlciAqL1xuXHRyYXljYXN0ZXI6IFRIUkVFLlJheWNhc3Rlcjtcblx0LyoqIERlZmF1bHQgY2xvY2sgKi9cblx0Y2xvY2s6IFRIUkVFLkNsb2NrO1xuXHQvKiogRXZlbnQgbGF5ZXIgaW50ZXJmYWNlLCBjb250YWlucyB0aGUgZXZlbnQgaGFuZGxlciBhbmQgdGhlIG5vZGUgdGhleSdyZSBjb25uZWN0ZWQgdG8gKi9cblx0ZXZlbnRzOiBOZ3RFdmVudE1hbmFnZXI8YW55Pjtcblx0LyoqIFhSIGludGVyZmFjZSAqL1xuXHR4cjogeyBjb25uZWN0OiAoKSA9PiB2b2lkOyBkaXNjb25uZWN0OiAoKSA9PiB2b2lkIH07XG5cdC8qKiBDdXJyZW50bHkgdXNlZCBjb250cm9scyAqL1xuXHRjb250cm9sczogVEhSRUUuRXZlbnREaXNwYXRjaGVyIHwgbnVsbDtcblx0LyoqIE5vcm1hbGl6ZWQgZXZlbnQgY29vcmRpbmF0ZXMgKi9cblx0cG9pbnRlcjogVEhSRUUuVmVjdG9yMjtcblx0LyogV2hldGhlciB0byBlbmFibGUgcjEzOSdzIFRIUkVFLkNvbG9yTWFuYWdlbWVudCAqL1xuXHRsZWdhY3k6IGJvb2xlYW47XG5cdC8qKiBTaG9ydGN1dCB0byBnbC5vdXRwdXRDb2xvclNwYWNlID0gVEhSRUUuTGluZWFyU1JHQkNvbG9yU3BhY2UgKi9cblx0bGluZWFyOiBib29sZWFuO1xuXHQvKiogU2hvcnRjdXQgdG8gZ2wudG9uZU1hcHBpbmcgPSBOb1RvbmVtYXBwaW5nICovXG5cdGZsYXQ6IGJvb2xlYW47XG5cdC8qKiBSZW5kZXIgbG9vcCBmbGFncyAqL1xuXHRmcmFtZWxvb3A6ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInO1xuXHQvKiogQWRhcHRpdmUgcGVyZm9ybWFuY2UgaW50ZXJmYWNlICovXG5cdHBlcmZvcm1hbmNlOiBOZ3RQZXJmb3JtYW5jZTtcblx0LyoqIFJlYWN0aXZlIHBpeGVsLXNpemUgb2YgdGhlIGNhbnZhcyAqL1xuXHRzaXplOiBOZ3RTaXplO1xuXHQvKiogUmVhY3RpdmUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgaW4gdGhyZWVqcyB1bml0cyAqL1xuXHR2aWV3cG9ydDogTmd0Vmlld3BvcnQgJiB7XG5cdFx0Z2V0Q3VycmVudFZpZXdwb3J0OiAoXG5cdFx0XHRjYW1lcmE/OiBOZ3RDYW1lcmEsXG5cdFx0XHR0YXJnZXQ/OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4sXG5cdFx0XHRzaXplPzogTmd0U2l6ZSxcblx0XHQpID0+IE9taXQ8Tmd0Vmlld3BvcnQsICdkcHInIHwgJ2luaXRpYWxEcHInPjtcblx0fTtcblx0LyoqIEZsYWdzIHRoZSBjYW52YXMgZm9yIHJlbmRlciwgYnV0IGRvZXNuJ3QgcmVuZGVyIGluIGl0c2VsZiAqL1xuXHRpbnZhbGlkYXRlOiAoZnJhbWVzPzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogQWR2YW5jZSAocmVuZGVyKSBvbmUgc3RlcCAqL1xuXHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gc2V0dGluZyB0aGUgZXZlbnQgbGF5ZXIgKi9cblx0c2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT4gdm9pZDtcblx0LyoqXG5cdCAqIFNob3J0Y3V0IHRvIG1hbnVhbCBzaXppbmdcblx0ICovXG5cdHNldFNpemU6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gbWFudWFsIHNldHRpbmcgdGhlIHBpeGVsIHJhdGlvICovXG5cdHNldERwcjogKGRwcjogTmd0RHByKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gZnJhbWVsb29wIGZsYWdzICovXG5cdHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcD86ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInKSA9PiB2b2lkO1xuXHQvKiogV2hlbiB0aGUgY2FudmFzIHdhcyBjbGlja2VkIGJ1dCBub3RoaW5nIHdhcyBoaXQgKi9cblx0LyoqIFBvaW50ZXJNaXNzZWQgT2JzZXJ2YWJsZSAqL1xuXHRwb2ludGVyTWlzc2VkJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50Pjtcblx0LyoqIElmIHRoaXMgc3RhdGUgbW9kZWwgaXMgbGF5ZXJlZCAodmlhIGNyZWF0ZVBvcnRhbCkgdGhlbiB0aGlzIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBsYXllciAqL1xuXHRwcmV2aW91c1Jvb3Q6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiB8IG51bGw7XG5cdC8qKiBJbnRlcm5hbHMgKi9cblx0aW50ZXJuYWw6IE5ndEludGVybmFsU3RhdGU7XG59O1xuXG5mdW5jdGlvbiBzdG9yZUZhY3RvcnkocHJldmlvdXNTdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHwgbnVsbCkge1xuXHRjb25zdCBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cdGNvbnN0IHdpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdGlmICghd2luZG93KSB7XG5cdFx0Ly8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgbmVlZCB0byBzdXBwb3J0IG11bHRpcGxlIHBsYXRmb3Jtc1xuXHRcdHRocm93IG5ldyBFcnJvcihgW05HVF0gV2luZG93IGlzIG5vdCBhdmFpbGFibGUuYCk7XG5cdH1cblxuXHRjb25zdCBsb29wID0gaW5qZWN0Tmd0TG9vcCgpO1xuXG5cdC8vIE5PVEU6IHVzaW5nIFN1YmplY3QgYmVjYXVzZSB3ZSBkbyBub3QgY2FyZSBhYm91dCBsYXRlLXN1YnNjcmliZXJzXG5cdGNvbnN0IHBvaW50ZXJNaXNzZWQkID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuXHRjb25zdCBzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+ID0gc2lnbmFsU3RvcmU8Tmd0U3RhdGU+KCh7IGdldCwgdXBkYXRlIH0pID0+IHtcblx0XHRjb25zdCB7IGludmFsaWRhdGUsIGFkdmFuY2UgfSA9IGxvb3A7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cdFx0Y29uc3QgZGVmYXVsdFRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cdFx0Y29uc3QgdGVtcFRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBnZXRDdXJyZW50Vmlld3BvcnQoXG5cdFx0XHRjYW1lcmE6IE5ndENhbWVyYSA9IGdldCgnY2FtZXJhJyksXG5cdFx0XHR0YXJnZXQ6IFRIUkVFLlZlY3RvcjMgfCBQYXJhbWV0ZXJzPFRIUkVFLlZlY3RvcjNbJ3NldCddPiA9IGRlZmF1bHRUYXJnZXQsXG5cdFx0XHRzaXplOiBOZ3RTaXplID0gZ2V0KCdzaXplJyksXG5cdFx0KTogT21pdDxOZ3RWaWV3cG9ydCwgJ2RwcicgfCAnaW5pdGlhbERwcic+IHtcblx0XHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBzaXplO1xuXHRcdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG5cblx0XHRcdGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB0ZW1wVGFyZ2V0LmNvcHkodGFyZ2V0KTtcblx0XHRcdGVsc2UgdGVtcFRhcmdldC5zZXQoLi4udGFyZ2V0KTtcblxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBjYW1lcmEuZ2V0V29ybGRQb3NpdGlvbihwb3NpdGlvbikuZGlzdGFuY2VUbyh0ZW1wVGFyZ2V0KTtcblxuXHRcdFx0aWYgKGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG5cdFx0XHRcdHJldHVybiB7IHdpZHRoOiB3aWR0aCAvIGNhbWVyYS56b29tLCBoZWlnaHQ6IGhlaWdodCAvIGNhbWVyYS56b29tLCB0b3AsIGxlZnQsIGZhY3RvcjogMSwgZGlzdGFuY2UsIGFzcGVjdCB9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmb3YgPSAoY2FtZXJhLmZvdiAqIE1hdGguUEkpIC8gMTgwOyAvLyBjb252ZXJ0IHZlcnRpY2FsIGZvdiB0byByYWRpYW5zXG5cdFx0XHRjb25zdCBoID0gMiAqIE1hdGgudGFuKGZvdiAvIDIpICogZGlzdGFuY2U7IC8vIHZpc2libGUgaGVpZ2h0XG5cdFx0XHRjb25zdCB3ID0gaCAqICh3aWR0aCAvIGhlaWdodCk7XG5cdFx0XHRyZXR1cm4geyB3aWR0aDogdywgaGVpZ2h0OiBoLCB0b3AsIGxlZnQsIGZhY3Rvcjogd2lkdGggLyB3LCBkaXN0YW5jZSwgYXNwZWN0IH07XG5cdFx0fVxuXG5cdFx0bGV0IHBlcmZvcm1hbmNlVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgc2V0UGVyZm9ybWFuY2VDdXJyZW50ID0gKGN1cnJlbnQ6IG51bWJlcikgPT5cblx0XHRcdHVwZGF0ZSgoc3RhdGUpID0+ICh7IHBlcmZvcm1hbmNlOiB7IC4uLnN0YXRlLnBlcmZvcm1hbmNlLCBjdXJyZW50IH0gfSkpO1xuXG5cdFx0Y29uc3QgcG9pbnRlciA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cG9pbnRlck1pc3NlZCQ6IHBvaW50ZXJNaXNzZWQkLmFzT2JzZXJ2YWJsZSgpLFxuXHRcdFx0ZXZlbnRzOiB7IHByaW9yaXR5OiAxLCBlbmFibGVkOiB0cnVlLCBjb25uZWN0ZWQ6IGZhbHNlIH0sXG5cblx0XHRcdGludmFsaWRhdGU6IChmcmFtZXMgPSAxKSA9PiBpbnZhbGlkYXRlKHN0b3JlLCBmcmFtZXMpLFxuXHRcdFx0YWR2YW5jZTogKHRpbWVzdGFtcDogbnVtYmVyLCBydW5HbG9iYWxFZmZlY3RzPzogYm9vbGVhbikgPT4gYWR2YW5jZSh0aW1lc3RhbXAsIHJ1bkdsb2JhbEVmZmVjdHMsIHN0b3JlKSxcblxuXHRcdFx0bGVnYWN5OiBmYWxzZSxcblx0XHRcdGxpbmVhcjogZmFsc2UsXG5cdFx0XHRmbGF0OiBmYWxzZSxcblxuXHRcdFx0Y29udHJvbHM6IG51bGwsXG5cdFx0XHRjbG9jazogbmV3IFRIUkVFLkNsb2NrKCksXG5cdFx0XHRwb2ludGVyLFxuXG5cdFx0XHRmcmFtZWxvb3A6ICdhbHdheXMnLFxuXG5cdFx0XHRwZXJmb3JtYW5jZToge1xuXHRcdFx0XHRjdXJyZW50OiAxLFxuXHRcdFx0XHRtaW46IDAuNSxcblx0XHRcdFx0bWF4OiAxLFxuXHRcdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0XHRyZWdyZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBnZXQoKTtcblx0XHRcdFx0XHQvLyBDbGVhciB0aW1lb3V0XG5cdFx0XHRcdFx0aWYgKHBlcmZvcm1hbmNlVGltZW91dCkgY2xlYXJUaW1lb3V0KHBlcmZvcm1hbmNlVGltZW91dCk7XG5cdFx0XHRcdFx0Ly8gU2V0IGxvd2VyIGJvdW5kIHBlcmZvcm1hbmNlXG5cdFx0XHRcdFx0aWYgKHN0YXRlLnBlcmZvcm1hbmNlLmN1cnJlbnQgIT09IHN0YXRlLnBlcmZvcm1hbmNlLm1pbikgc2V0UGVyZm9ybWFuY2VDdXJyZW50KHN0YXRlLnBlcmZvcm1hbmNlLm1pbik7XG5cdFx0XHRcdFx0Ly8gR28gYmFjayB0byB1cHBlciBib3VuZCBwZXJmb3JtYW5jZSBhZnRlciBhIHdoaWxlIHVubGVzcyBzb21ldGhpbmcgcmVncmVzc2VzIG1lYW53aGlsZVxuXHRcdFx0XHRcdHBlcmZvcm1hbmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0c2V0UGVyZm9ybWFuY2VDdXJyZW50KGdldCgncGVyZm9ybWFuY2UnLCAnbWF4JykpO1xuXHRcdFx0XHRcdFx0Ly8gc2FmZURldGVjdENoYW5nZXMoY2RyKTtcblx0XHRcdFx0XHR9LCBzdGF0ZS5wZXJmb3JtYW5jZS5kZWJvdW5jZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXG5cdFx0XHRzaXplOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCwgdXBkYXRlU3R5bGU6IGZhbHNlIH0sXG5cdFx0XHR2aWV3cG9ydDoge1xuXHRcdFx0XHRpbml0aWFsRHByOiAwLFxuXHRcdFx0XHRkcHI6IDAsXG5cdFx0XHRcdHdpZHRoOiAwLFxuXHRcdFx0XHRoZWlnaHQ6IDAsXG5cdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0YXNwZWN0OiAwLFxuXHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0ZmFjdG9yOiAwLFxuXHRcdFx0XHRnZXRDdXJyZW50Vmlld3BvcnQsXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRFdmVudHM6IChldmVudHM6IFBhcnRpYWw8Tmd0RXZlbnRNYW5hZ2VyPGFueT4+KSA9PlxuXHRcdFx0XHR1cGRhdGUoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpLFxuXHRcdFx0c2V0U2l6ZTogKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB0b3A/OiBudW1iZXIsIGxlZnQ/OiBudW1iZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgY2FtZXJhID0gZ2V0KCdjYW1lcmEnKTtcblx0XHRcdFx0Y29uc3Qgc2l6ZSA9IHsgd2lkdGgsIGhlaWdodCwgdG9wOiB0b3AgfHwgMCwgbGVmdDogbGVmdCB8fCAwIH07XG5cdFx0XHRcdHVwZGF0ZSgoc3RhdGUpID0+ICh7XG5cdFx0XHRcdFx0c2l6ZSxcblx0XHRcdFx0XHR2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSwgZGVmYXVsdFRhcmdldCwgc2l6ZSkgfSxcblx0XHRcdFx0fSkpO1xuXHRcdFx0fSxcblx0XHRcdHNldERwcjogKGRwcjogTmd0RHByKSA9PlxuXHRcdFx0XHR1cGRhdGUoKHN0YXRlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzb2x2ZWQgPSBtYWtlRHByKGRwciwgd2luZG93KTtcblx0XHRcdFx0XHRyZXR1cm4geyB2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgZHByOiByZXNvbHZlZCwgaW5pdGlhbERwcjogc3RhdGUudmlld3BvcnQuaW5pdGlhbERwciB8fCByZXNvbHZlZCB9IH07XG5cdFx0XHRcdH0pLFxuXHRcdFx0c2V0RnJhbWVsb29wOiAoZnJhbWVsb29wOiAnYWx3YXlzJyB8ICdkZW1hbmQnIHwgJ25ldmVyJyA9ICdhbHdheXMnKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNsb2NrID0gZ2V0KCdjbG9jaycpO1xuXG5cdFx0XHRcdC8vIGlmIGZyYW1lbG9vcCA9PT0gXCJuZXZlclwiIGNsb2NrLmVsYXBzZWRUaW1lIGlzIHVwZGF0ZWQgdXNpbmcgYWR2YW5jZSh0aW1lc3RhbXApXG5cdFx0XHRcdGNsb2NrLnN0b3AoKTtcblx0XHRcdFx0Y2xvY2suZWxhcHNlZFRpbWUgPSAwO1xuXG5cdFx0XHRcdGlmIChmcmFtZWxvb3AgIT09ICduZXZlcicpIHtcblx0XHRcdFx0XHRjbG9jay5zdGFydCgpO1xuXHRcdFx0XHRcdGNsb2NrLmVsYXBzZWRUaW1lID0gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHVwZGF0ZSgoKSA9PiAoeyBmcmFtZWxvb3AgfSkpO1xuXHRcdFx0fSxcblxuXHRcdFx0cHJldmlvdXNSb290OiBwcmV2aW91c1N0b3JlLFxuXHRcdFx0aW50ZXJuYWw6IHtcblx0XHRcdFx0YWN0aXZlOiBmYWxzZSxcblx0XHRcdFx0cHJpb3JpdHk6IDAsXG5cdFx0XHRcdGZyYW1lczogMCxcblx0XHRcdFx0bGFzdEV2ZW50OiBuZXcgRWxlbWVudFJlZihudWxsKSxcblx0XHRcdFx0aW50ZXJhY3Rpb246IFtdLFxuXHRcdFx0XHRob3ZlcmVkOiBuZXcgTWFwKCksXG5cdFx0XHRcdHN1YnNjcmliZXJzOiBbXSxcblx0XHRcdFx0aW5pdGlhbENsaWNrOiBbMCwgMF0sXG5cdFx0XHRcdGluaXRpYWxIaXRzOiBbXSxcblx0XHRcdFx0Y2FwdHVyZWRNYXA6IG5ldyBNYXAoKSxcblx0XHRcdFx0c3Vic2NyaWJlOiAoXG5cdFx0XHRcdFx0Y2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcblx0XHRcdFx0XHRwcmlvcml0eSA9IDAsXG5cdFx0XHRcdFx0X3N0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gPSBzdG9yZSxcblx0XHRcdFx0KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaW50ZXJuYWwgPSBnZXQoJ2ludGVybmFsJyk7XG5cdFx0XHRcdFx0Ly8gSWYgdGhpcyBzdWJzY3JpcHRpb24gd2FzIGdpdmVuIGEgcHJpb3JpdHksIGl0IHRha2VzIHJlbmRlcmluZyBpbnRvIGl0cyBvd24gaGFuZHNcblx0XHRcdFx0XHQvLyBGb3IgdGhhdCByZWFzb24gd2Ugc3dpdGNoIG9mZiBhdXRvbWF0aWMgcmVuZGVyaW5nIGFuZCBpbmNyZWFzZSB0aGUgbWFudWFsIGZsYWdcblx0XHRcdFx0XHQvLyBBcyBsb25nIGFzIHRoaXMgZmxhZyBpcyBwb3NpdGl2ZSB0aGVyZSBjYW4gYmUgbm8gaW50ZXJuYWwgcmVuZGVyaW5nIGF0IGFsbFxuXHRcdFx0XHRcdC8vIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgcmVuZGVyIHN1YnNjcmlwdGlvbnNcblx0XHRcdFx0XHRpbnRlcm5hbC5wcmlvcml0eSA9IGludGVybmFsLnByaW9yaXR5ICsgKHByaW9yaXR5ID4gMCA/IDEgOiAwKTtcblx0XHRcdFx0XHRpbnRlcm5hbC5zdWJzY3JpYmVycy5wdXNoKHsgY2FsbGJhY2ssIHByaW9yaXR5LCBzdG9yZTogX3N0b3JlIH0pO1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIHN1YnNjcmliZXIgYW5kIHNvcnQgbGF5ZXJzIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIG1lYW5pbmcsXG5cdFx0XHRcdFx0Ly8gaGlnaGVzdCBwcmlvcml0eSByZW5kZXJzIGxhc3QgKG9uIHRvcCBvZiB0aGUgb3RoZXIgZnJhbWVzKVxuXHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzID0gaW50ZXJuYWwuc3Vic2NyaWJlcnMuc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgfHwgMCkgLSAoYi5wcmlvcml0eSB8fCAwKSk7XG5cblx0XHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgaW50ZXJuYWwgPSBnZXQoJ2ludGVybmFsJyk7XG5cdFx0XHRcdFx0XHRpZiAoaW50ZXJuYWw/LnN1YnNjcmliZXJzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIERlY3JlYXNlIG1hbnVhbCBmbGFnIGlmIHRoaXMgc3Vic2NyaXB0aW9uIGhhZCBhIHByaW9yaXR5XG5cdFx0XHRcdFx0XHRcdGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgLSAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuXHRcdFx0XHRcdFx0XHQvLyBSZW1vdmUgc3Vic2NyaWJlciBmcm9tIGxpc3Rcblx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuc3Vic2NyaWJlcnMgPSBpbnRlcm5hbC5zdWJzY3JpYmVycy5maWx0ZXIoKHMpID0+IHMuY2FsbGJhY2sgIT09IGNhbGxiYWNrKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RvcmUsICdwb2ludGVyTWlzc2VkJCcsIHsgZ2V0OiAoKSA9PiBwb2ludGVyTWlzc2VkJCB9KTtcblxuXHRsZXQge1xuXHRcdHNpemU6IG9sZFNpemUsXG5cdFx0dmlld3BvcnQ6IHsgZHByOiBvbGREcHIgfSxcblx0XHRjYW1lcmE6IG9sZENhbWVyYSxcblx0fSA9IHN0b3JlLnNuYXBzaG90O1xuXG5cdGNvbnN0IFtjYW1lcmEsIHNpemUsIHZpZXdwb3J0RHByXSA9IFtzdG9yZS5zZWxlY3QoJ2NhbWVyYScpLCBzdG9yZS5zZWxlY3QoJ3NpemUnKSwgc3RvcmUuc2VsZWN0KCd2aWV3cG9ydCcsICdkcHInKV07XG5cblx0ZWZmZWN0KCgpID0+IHtcblx0XHRjb25zdCBbbmV3Q2FtZXJhLCBuZXdTaXplLCBuZXdEcHIsIGdsXSA9IFtjYW1lcmEoKSwgc2l6ZSgpLCB2aWV3cG9ydERwcigpLCBzdG9yZS5zbmFwc2hvdC5nbF07XG5cblx0XHQvLyBSZXNpemUgY2FtZXJhIGFuZCByZW5kZXJlciBvbiBjaGFuZ2VzIHRvIHNpemUgYW5kIHBpeGVsLXJhdGlvXG5cdFx0aWYgKG5ld1NpemUgIT09IG9sZFNpemUgfHwgbmV3RHByICE9PSBvbGREcHIpIHtcblx0XHRcdG9sZFNpemUgPSBuZXdTaXplO1xuXHRcdFx0b2xkRHByID0gbmV3RHByO1xuXHRcdFx0Ly8gVXBkYXRlIGNhbWVyYSAmIHJlbmRlcmVyXG5cdFx0XHR1cGRhdGVDYW1lcmEobmV3Q2FtZXJhLCBuZXdTaXplKTtcblx0XHRcdGdsLnNldFBpeGVsUmF0aW8obmV3RHByKTtcblxuXHRcdFx0Y29uc3QgdXBkYXRlU3R5bGUgPSB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGdsLmRvbUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudDtcblx0XHRcdGdsLnNldFNpemUobmV3U2l6ZS53aWR0aCwgbmV3U2l6ZS5oZWlnaHQsIHVwZGF0ZVN0eWxlKTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgdmlld3BvcnQgb25jZSB0aGUgY2FtZXJhIGNoYW5nZXNcblx0XHRpZiAobmV3Q2FtZXJhICE9PSBvbGRDYW1lcmEpIHtcblx0XHRcdG9sZENhbWVyYSA9IG5ld0NhbWVyYTtcblx0XHRcdHVwZGF0ZUNhbWVyYShuZXdDYW1lcmEsIG5ld1NpemUpO1xuXHRcdFx0Ly8gVXBkYXRlIHZpZXdwb3J0XG5cdFx0XHRzdG9yZS51cGRhdGUoKHN0YXRlKSA9PiAoeyB2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uc3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KG5ld0NhbWVyYSkgfSB9KSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBjb25zdCBOR1RfU1RPUkUgPSBuZXcgSW5qZWN0aW9uVG9rZW48Tmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PignTmd0U3RvcmUgVG9rZW4nKTtcbmV4cG9ydCBjb25zdCBbaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbihzdG9yZUZhY3RvcnksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE5HVF9TVE9SRV1dLFxuXHR0b2tlbjogTkdUX1NUT1JFLFxufSk7XG4iXX0=