@angular/core 18.1.0-next.2 → 18.1.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/primitives/event-dispatch/src/eventcontract.mjs +2 -2
- package/esm2022/rxjs-interop/src/to_signal.mjs +7 -3
- package/esm2022/src/authoring/model/model_signal.mjs +2 -3
- package/esm2022/src/change_detection/change_detector_ref.mjs +3 -2
- package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +2 -2
- package/esm2022/src/core_render3_private_export.mjs +2 -2
- package/esm2022/src/defer/instructions.mjs +3 -11
- package/esm2022/src/di/host_tag_name_token.mjs +4 -1
- package/esm2022/src/errors.mjs +1 -1
- package/esm2022/src/event_delegation_utils.mjs +3 -2
- package/esm2022/src/hydration/annotate.mjs +27 -16
- package/esm2022/src/hydration/error_handling.mjs +3 -1
- package/esm2022/src/hydration/event_replay.mjs +34 -15
- package/esm2022/src/hydration/i18n.mjs +102 -18
- package/esm2022/src/hydration/node_lookup_utils.mjs +12 -6
- package/esm2022/src/linker/component_factory.mjs +1 -1
- package/esm2022/src/render3/after_render_hooks.mjs +2 -2
- package/esm2022/src/render3/chained_injector.mjs +34 -0
- package/esm2022/src/render3/collect_native_nodes.mjs +6 -1
- package/esm2022/src/render3/component.mjs +1 -1
- package/esm2022/src/render3/component_ref.mjs +23 -35
- package/esm2022/src/render3/index.mjs +2 -2
- package/esm2022/src/render3/instructions/all.mjs +2 -1
- package/esm2022/src/render3/instructions/i18n_icu_container_visitor.mjs +61 -51
- package/esm2022/src/render3/instructions/let_declaration.mjs +62 -0
- package/esm2022/src/render3/instructions/projection.mjs +14 -11
- package/esm2022/src/render3/instructions/shared.mjs +1 -1
- package/esm2022/src/render3/interfaces/node.mjs +2 -1
- package/esm2022/src/render3/jit/environment.mjs +4 -1
- package/esm2022/src/render3/node_assert.mjs +9 -8
- package/esm2022/src/render3/node_manipulation.mjs +10 -3
- package/esm2022/src/render3/util/injector_discovery_utils.mjs +14 -5
- package/esm2022/src/render3/util/injector_utils.mjs +10 -1
- package/esm2022/src/version.mjs +1 -1
- package/esm2022/testing/src/logger.mjs +3 -3
- package/fesm2022/core.mjs +440 -210
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives/event-dispatch.mjs +2 -2
- package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
- package/fesm2022/primitives/signals.mjs +1 -1
- package/fesm2022/rxjs-interop.mjs +7 -3
- package/fesm2022/rxjs-interop.mjs.map +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/index.d.ts +45 -9
- package/package.json +1 -1
- package/primitives/event-dispatch/index.d.ts +2 -2
- package/primitives/signals/index.d.ts +1 -1
- package/rxjs-interop/index.d.ts +13 -6
- package/schematics/migrations/after-render-phase/bundle.js +52 -31
- package/schematics/migrations/after-render-phase/bundle.js.map +2 -2
- package/schematics/migrations/invalid-two-way-bindings/bundle.js +272 -65
- package/schematics/migrations/invalid-two-way-bindings/bundle.js.map +4 -4
- package/schematics/ng-generate/control-flow-migration/bundle.js +279 -65
- package/schematics/ng-generate/control-flow-migration/bundle.js.map +4 -4
- package/schematics/ng-generate/standalone-migration/bundle.js +288 -84
- package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
- package/testing/index.d.ts +1 -1
|
@@ -13,9 +13,10 @@ import { setStashFn } from '../render3/instructions/listener';
|
|
|
13
13
|
import { CLEANUP } from '../render3/interfaces/view';
|
|
14
14
|
import { isPlatformBrowser } from '../render3/util/misc_utils';
|
|
15
15
|
import { unwrapRNode } from '../render3/util/view_utils';
|
|
16
|
-
import { IS_EVENT_REPLAY_ENABLED, IS_GLOBAL_EVENT_DELEGATION_ENABLED } from './tokens';
|
|
16
|
+
import { EVENT_REPLAY_ENABLED_DEFAULT, IS_EVENT_REPLAY_ENABLED, IS_GLOBAL_EVENT_DELEGATION_ENABLED, } from './tokens';
|
|
17
17
|
import { GlobalEventDelegation, sharedStashFunction, removeListeners, invokeRegisteredListeners, } from '../event_delegation_utils';
|
|
18
18
|
import { APP_ID } from '../application/application_tokens';
|
|
19
|
+
import { performanceMarkFeature } from '../util/performance';
|
|
19
20
|
export const CONTRACT_PROPERTY = 'ngContracts';
|
|
20
21
|
/**
|
|
21
22
|
* A set of DOM elements with `jsaction` attributes.
|
|
@@ -24,6 +25,13 @@ const jsactionSet = new Set();
|
|
|
24
25
|
function isGlobalEventDelegationEnabled(injector) {
|
|
25
26
|
return injector.get(IS_GLOBAL_EVENT_DELEGATION_ENABLED, false);
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Determines whether Event Replay feature should be activated on the client.
|
|
30
|
+
*/
|
|
31
|
+
function shouldEnableEventReplay(injector) {
|
|
32
|
+
return (injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT) &&
|
|
33
|
+
!isGlobalEventDelegationEnabled(injector));
|
|
34
|
+
}
|
|
27
35
|
/**
|
|
28
36
|
* Returns a set of providers required to setup support for event replay.
|
|
29
37
|
* Requires hydration to be enabled separately.
|
|
@@ -32,19 +40,31 @@ export function withEventReplay() {
|
|
|
32
40
|
return [
|
|
33
41
|
{
|
|
34
42
|
provide: IS_EVENT_REPLAY_ENABLED,
|
|
35
|
-
|
|
43
|
+
useFactory: () => {
|
|
44
|
+
let isEnabled = true;
|
|
45
|
+
if (isPlatformBrowser()) {
|
|
46
|
+
// Note: globalThis[CONTRACT_PROPERTY] may be undefined in case Event Replay feature
|
|
47
|
+
// is enabled, but there are no events configured in this application, in which case
|
|
48
|
+
// we don't activate this feature, since there are no events to replay.
|
|
49
|
+
const appId = inject(APP_ID);
|
|
50
|
+
isEnabled = !!globalThis[CONTRACT_PROPERTY]?.[appId];
|
|
51
|
+
}
|
|
52
|
+
if (isEnabled) {
|
|
53
|
+
performanceMarkFeature('NgEventReplay');
|
|
54
|
+
}
|
|
55
|
+
return isEnabled;
|
|
56
|
+
},
|
|
36
57
|
},
|
|
37
58
|
{
|
|
38
59
|
provide: ENVIRONMENT_INITIALIZER,
|
|
39
60
|
useValue: () => {
|
|
40
61
|
const injector = inject(Injector);
|
|
41
|
-
if (
|
|
42
|
-
|
|
62
|
+
if (isPlatformBrowser(injector) && shouldEnableEventReplay(injector)) {
|
|
63
|
+
setStashFn((rEl, eventName, listenerFn) => {
|
|
64
|
+
sharedStashFunction(rEl, eventName, listenerFn);
|
|
65
|
+
jsactionSet.add(rEl);
|
|
66
|
+
});
|
|
43
67
|
}
|
|
44
|
-
setStashFn((rEl, eventName, listenerFn) => {
|
|
45
|
-
sharedStashFunction(rEl, eventName, listenerFn);
|
|
46
|
-
jsactionSet.add(rEl);
|
|
47
|
-
});
|
|
48
68
|
},
|
|
49
69
|
multi: true,
|
|
50
70
|
},
|
|
@@ -55,13 +75,13 @@ export function withEventReplay() {
|
|
|
55
75
|
const injector = inject(Injector);
|
|
56
76
|
const appRef = inject(ApplicationRef);
|
|
57
77
|
return () => {
|
|
78
|
+
if (!shouldEnableEventReplay(injector)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
58
81
|
// Kick off event replay logic once hydration for the initial part
|
|
59
82
|
// of the application is completed. This timing is similar to the unclaimed
|
|
60
83
|
// dehydrated views cleanup timing.
|
|
61
84
|
whenStable(appRef).then(() => {
|
|
62
|
-
if (isGlobalEventDelegationEnabled(injector)) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
85
|
const globalEventDelegation = injector.get(GlobalEventDelegation);
|
|
66
86
|
initEventReplay(globalEventDelegation, injector);
|
|
67
87
|
jsactionSet.forEach(removeListeners);
|
|
@@ -84,11 +104,10 @@ function getJsactionData(container) {
|
|
|
84
104
|
const initEventReplay = (eventDelegation, injector) => {
|
|
85
105
|
const appId = injector.get(APP_ID);
|
|
86
106
|
// This is set in packages/platform-server/src/utils.ts
|
|
87
|
-
// Note: globalThis[CONTRACT_PROPERTY] may be undefined in case Event Replay feature
|
|
88
|
-
// is enabled, but there are no events configured in an application.
|
|
89
107
|
const container = globalThis[CONTRACT_PROPERTY]?.[appId];
|
|
90
108
|
const earlyJsactionData = getJsactionData(container);
|
|
91
|
-
const eventContract = (eventDelegation.eventContract = new EventContract(new EventContractContainer(earlyJsactionData.c)
|
|
109
|
+
const eventContract = (eventDelegation.eventContract = new EventContract(new EventContractContainer(earlyJsactionData.c),
|
|
110
|
+
/* useActionResolver= */ false));
|
|
92
111
|
for (const et of earlyJsactionData.et) {
|
|
93
112
|
eventContract.addEvent(et);
|
|
94
113
|
}
|
|
@@ -145,4 +164,4 @@ export function collectDomEventsInfo(tView, lView, eventTypesToReplay) {
|
|
|
145
164
|
}
|
|
146
165
|
return events;
|
|
147
166
|
}
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRfcmVwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvaHlkcmF0aW9uL2V2ZW50X3JlcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGVBQWUsRUFDZixrQkFBa0IsR0FFbkIsTUFBTSx5Q0FBeUMsQ0FBQztBQUVqRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxRQUFRLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDeEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXBELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUU1RCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXZELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxrQ0FBa0MsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNyRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YseUJBQXlCLEdBQzFCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBTXpELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFXLENBQUM7QUFFdkMsU0FBUyw4QkFBOEIs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QUM1QixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQW1CLENBQUM7UUFDMUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxzRUFBc0U7UUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2Qyx1REFBdUQ7UUFDdkQsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxPQUFPLGdCQUFnQixLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtcbiAgaXNTdXBwb3J0ZWRFdmVudCxcbiAgaXNDYXB0dXJlRXZlbnQsXG4gIEV2ZW50Q29udHJhY3RDb250YWluZXIsXG4gIEV2ZW50Q29udHJhY3QsXG4gIEV2ZW50RGlzcGF0Y2hlcixcbiAgcmVnaXN0ZXJEaXNwYXRjaGVyLFxuICBFYXJseUpzYWN0aW9uRGF0YUNvbnRhaW5lcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS9wcmltaXRpdmVzL2V2ZW50LWRpc3BhdGNoJztcblxuaW1wb3J0IHtBUFBfQk9PVFNUUkFQX0xJU1RFTkVSLCBBcHBsaWNhdGlvblJlZiwgd2hlblN0YWJsZX0gZnJvbSAnLi4vYXBwbGljYXRpb24vYXBwbGljYXRpb25fcmVmJztcbmltcG9ydCB7RU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIEluamVjdG9yfSBmcm9tICcuLi9kaSc7XG5pbXBvcnQge2luamVjdH0gZnJvbSAnLi4vZGkvaW5qZWN0b3JfY29tcGF0aWJpbGl0eSc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICcuLi9kaS9pbnRlcmZhY2UvcHJvdmlkZXInO1xuaW1wb3J0IHtzZXRTdGFzaEZufSBmcm9tICcuLi9yZW5kZXIzL2luc3RydWN0aW9ucy9saXN0ZW5lcic7XG5pbXBvcnQge1JFbGVtZW50fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXJfZG9tJztcbmltcG9ydCB7Q0xFQU5VUCwgTFZpZXcsIFRWaWV3fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge2lzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvbWlzY191dGlscyc7XG5pbXBvcnQge3Vud3JhcFJOb2RlfSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvdmlld191dGlscyc7XG5cbmltcG9ydCB7SVNfRVZFTlRfUkVQTEFZX0VOQUJMRUQsIElTX0dMT0JBTF9FVkVOVF9ERUxFR0FUSU9OX0VOQUJMRUR9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7XG4gIEdsb2JhbEV2ZW50RGVsZWdhdGlvbixcbiAgc2hhcmVkU3Rhc2hGdW5jdGlvbixcbiAgcmVtb3ZlTGlzdGVuZXJzLFxuICBpbnZva2VSZWdpc3RlcmVkTGlzdGVuZXJzLFxufSBmcm9tICcuLi9ldmVudF9kZWxlZ2F0aW9uX3V0aWxzJztcbmltcG9ydCB7QVBQX0lEfSBmcm9tICcuLi9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbl90b2tlbnMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBuZ0NvbnRyYWN0czoge1trZXk6IHN0cmluZ106IEVhcmx5SnNhY3Rpb25EYXRhQ29udGFpbmVyfTtcbn1cblxuZXhwb3J0IGNvbnN0IENPTlRSQUNUX1BST1BFUlRZID0gJ25nQ29udHJhY3RzJztcblxuLyoqXG4gKiBBIHNldCBvZiBET00gZWxlbWVudHMgd2l0aCBganNhY3Rpb25gIGF0dHJpYnV0ZXMuXG4gKi9cbmNvbnN0IGpzYWN0aW9uU2V0ID0gbmV3IFNldDxFbGVtZW50PigpO1xuXG5mdW5jdGlvbiBpc0dsb2JhbEV2ZW50RGVsZWdhdGlvbkVuYWJsZWQoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gIHJldHVybiBpbmplY3Rvci5nZXQoSVNfR0xPQkFMX0VWRU5UX0RFTEVHQVRJT05fRU5BQkxFRCwgZmFsc2UpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzZXQgb2YgcHJvdmlkZXJzIHJlcXVpcmVkIHRvIHNldHVwIHN1cHBvcnQgZm9yIGV2ZW50IHJlcGxheS5cbiAqIFJlcXVpcmVzIGh5ZHJhdGlvbiB0byBiZSBlbmFibGVkIHNlcGFyYXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRXZlbnRSZXBsYXkoKTogUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogSVNfRVZFTlRfUkVQTEFZX0VOQUJMRUQsXG4gICAgICB1c2VWYWx1ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlVmFsdWU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgICAgICBpZiAoaXNHbG9iYWxFdmVudERlbGVnYXRpb25FbmFibGVkKGluamVjdG9yKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdGFzaEZuKChyRWw6IFJFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgbGlzdGVuZXJGbjogVm9pZEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgc2hhcmVkU3Rhc2hGdW5jdGlvbihyRWwsIGV2ZW50TmFtZSwgbGlzdGVuZXJGbik7XG4gICAgICAgICAganNhY3Rpb25TZXQuYWRkKHJFbCBhcyB1bmtub3duIGFzIEVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9CT09UU1RSQVBfTElTVEVORVIsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcigpKSB7XG4gICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEtpY2sgb2ZmIGV2ZW50IHJlcGxheSBsb2dpYyBvbmNlIGh5ZHJhdGlvbiBmb3IgdGhlIGluaXRpYWwgcGFydFxuICAgICAgICAgICAgLy8gb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbXBsZXRlZC4gVGhpcyB0aW1pbmcgaXMgc2ltaWxhciB0byB0aGUgdW5jbGFpbWVkXG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVkIHZpZXdzIGNsZWFudXAgdGltaW5nLlxuICAgICAgICAgICAgd2hlblN0YWJsZShhcHBSZWYpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNHbG9iYWxFdmVudERlbGVnYXRpb25FbmFibGVkKGluamVjdG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxFdmVudERlbGVnYXRpb24gPSBpbmplY3Rvci5nZXQoR2xvYmFsRXZlbnREZWxlZ2F0aW9uKTtcbiAgICAgICAgICAgICAgaW5pdEV2ZW50UmVwbGF5KGdsb2JhbEV2ZW50RGVsZWdhdGlvbiwgaW5qZWN0b3IpO1xuICAgICAgICAgICAgICBqc2FjdGlvblNldC5mb3JFYWNoKHJlbW92ZUxpc3RlbmVycyk7XG4gICAgICAgICAgICAgIC8vIEFmdGVyIGh5ZHJhdGlvbiwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gZG8gYW55bW9yZSB3b3JrIHJlbGF0ZWQgdG9cbiAgICAgICAgICAgICAgLy8gZXZlbnQgcmVwbGF5IGFueW1vcmUuXG4gICAgICAgICAgICAgIHNldFN0YXNoRm4oKCkgPT4ge30pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307IC8vIG5vb3AgZm9yIHRoZSBzZXJ2ZXIgY29kZVxuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF07XG59XG5cbi8vIFRPRE86IFVwc3RyZWFtIHRoaXMgYmFjayBpbnRvIGV2ZW50LWRpc3BhdGNoLlxuZnVuY3Rpb24gZ2V0SnNhY3Rpb25EYXRhKGNvbnRhaW5lcjogRWFybHlKc2FjdGlvbkRhdGFDb250YWluZXIpIHtcbiAgcmV0dXJuIGNvbnRhaW5lci5fZWpzYTtcbn1cblxuY29uc3QgaW5pdEV2ZW50UmVwbGF5ID0gKGV2ZW50RGVsZWdhdGlvbjogR2xvYmFsRXZlbnREZWxlZ2F0aW9uLCBpbmplY3RvcjogSW5qZWN0b3IpID0+IHtcbiAgY29uc3QgYXBwSWQgPSBpbmplY3Rvci5nZXQoQVBQX0lEKTtcbiAgLy8gVGhpcyBpcyBzZXQgaW4gcGFja2FnZXMvcGxhdGZvcm0tc2VydmVyL3NyYy91dGlscy50c1xuICAvLyBOb3RlOiBnbG9iYWxUaGlzW0NPTlRSQUNUX1BST1BFUlRZXSBtYXkgYmUgdW5kZWZpbmVkIGluIGNhc2UgRXZlbnQgUmVwbGF5IGZlYXR1cmVcbiAgLy8gaXMgZW5hYmxlZCwgYnV0IHRoZXJlIGFyZSBubyBldmVudHMgY29uZmlndXJlZCBpbiBhbiBhcHBsaWNhdGlvbi5cbiAgY29uc3QgY29udGFpbmVyID0gZ2xvYmFsVGhpc1tDT05UUkFDVF9QUk9QRVJUWV0/LlthcHBJZF07XG4gIGNvbnN0IGVhcmx5SnNhY3Rpb25EYXRhID0gZ2V0SnNhY3Rpb25EYXRhKGNvbnRhaW5lcikhO1xuICBjb25zdCBldmVudENvbnRyYWN0ID0gKGV2ZW50RGVsZWdhdGlvbi5ldmVudENvbnRyYWN0ID0gbmV3IEV2ZW50Q29udHJhY3QoXG4gICAgbmV3IEV2ZW50Q29udHJhY3RDb250YWluZXIoZWFybHlKc2FjdGlvbkRhdGEuYyksXG4gICkpO1xuICBmb3IgKGNvbnN0IGV0IG9mIGVhcmx5SnNhY3Rpb25EYXRhLmV0KSB7XG4gICAgZXZlbnRDb250cmFjdC5hZGRFdmVudChldCk7XG4gIH1cbiAgZm9yIChjb25zdCBldCBvZiBlYXJseUpzYWN0aW9uRGF0YS5ldGMpIHtcbiAgICBldmVudENvbnRyYWN0LmFkZEV2ZW50KGV0KTtcbiAgfVxuICBldmVudENvbnRyYWN0LnJlcGxheUVhcmx5RXZlbnRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKGludm9rZVJlZ2lzdGVyZWRMaXN0ZW5lcnMpO1xuICByZWdpc3RlckRpc3BhdGNoZXIoZXZlbnRDb250cmFjdCwgZGlzcGF0Y2hlcik7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBET00gZXZlbnRzIChhZGRlZCBpbiBhIHRlbXBsYXRlKSByZWdpc3RlcmVkIG9uIGVsZW1lbnRzIGluIGEgZ2l2ZVxuICogTFZpZXcuIE1hcHMgY29sbGVjdGVkIGV2ZW50cyB0byBhIGNvcnJlc3BvbmRpbmcgRE9NIGVsZW1lbnQgKGFuIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGtleSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RG9tRXZlbnRzSW5mbyhcbiAgdFZpZXc6IFRWaWV3LFxuICBsVmlldzogTFZpZXcsXG4gIGV2ZW50VHlwZXNUb1JlcGxheToge3JlZ3VsYXI6IFNldDxzdHJpbmc+OyBjYXB0dXJlOiBTZXQ8c3RyaW5nPn0sXG4pOiBNYXA8RWxlbWVudCwgc3RyaW5nW10+IHtcbiAgY29uc3QgZXZlbnRzID0gbmV3IE1hcDxFbGVtZW50LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgbENsZWFudXAgPSBsVmlld1tDTEVBTlVQXTtcbiAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwO1xuICBpZiAoIXRDbGVhbnVwIHx8ICFsQ2xlYW51cCkge1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGZpcnN0UGFyYW0gPSB0Q2xlYW51cFtpKytdO1xuICAgIGNvbnN0IHNlY29uZFBhcmFtID0gdENsZWFudXBbaSsrXTtcbiAgICBpZiAodHlwZW9mIGZpcnN0UGFyYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZTogc3RyaW5nID0gZmlyc3RQYXJhbTtcbiAgICBpZiAoIWlzU3VwcG9ydGVkRXZlbnQobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNDYXB0dXJlRXZlbnQobmFtZSkpIHtcbiAgICAgIGV2ZW50VHlwZXNUb1JlcGxheS5jYXB0dXJlLmFkZChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnRUeXBlc1RvUmVwbGF5LnJlZ3VsYXIuYWRkKG5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lckVsZW1lbnQgPSB1bndyYXBSTm9kZShsVmlld1tzZWNvbmRQYXJhbV0pIGFzIGFueSBhcyBFbGVtZW50O1xuICAgIGkrKzsgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHBvc2l0aW9uIChsb2NhdGlvbiBvZiB0aGUgbGlzdGVuZXIgaWR4KVxuICAgIGNvbnN0IHVzZUNhcHR1cmVPckluZHggPSB0Q2xlYW51cFtpKytdO1xuICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy5cbiAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIHBvc2l0aXZlIG51bWJlciB0aGVuIGl0IGluIHVuc3Vic2NyaWJlIG1ldGhvZFxuICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgbmVnYXRpdmUgbnVtYmVyIHRoZW4gaXQgaXMgYSBTdWJzY3JpcHRpb25cbiAgICBjb25zdCBpc0RvbUV2ZW50ID0gdHlwZW9mIHVzZUNhcHR1cmVPckluZHggPT09ICdib29sZWFuJyB8fCB1c2VDYXB0dXJlT3JJbmR4ID49IDA7XG4gICAgaWYgKCFpc0RvbUV2ZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFldmVudHMuaGFzKGxpc3RlbmVyRWxlbWVudCkpIHtcbiAgICAgIGV2ZW50cy5zZXQobGlzdGVuZXJFbGVtZW50LCBbbmFtZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudHMuZ2V0KGxpc3RlbmVyRWxlbWVudCkhLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBldmVudHM7XG59XG4iXX0=
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRfcmVwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvaHlkcmF0aW9uL2V2ZW50X3JlcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGVBQWUsRUFDZixrQkFBa0IsR0FFbkIsTUFBTSx5Q0FBeUMsQ0FBQztBQUVqRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxRQUFRLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDeEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXBELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUU1RCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXZELE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLGtDQUFrQyxHQUNuQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YseUJBQXlCLEdBQzFCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBTTNELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztBQUUvQzs7R0FF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QUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2Qyx1REFBdUQ7UUFDdkQsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxPQUFPLGdCQUFnQixLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtcbiAgaXNTdXBwb3J0ZWRFdmVudCxcbiAgaXNDYXB0dXJlRXZlbnQsXG4gIEV2ZW50Q29udHJhY3RDb250YWluZXIsXG4gIEV2ZW50Q29udHJhY3QsXG4gIEV2ZW50RGlzcGF0Y2hlcixcbiAgcmVnaXN0ZXJEaXNwYXRjaGVyLFxuICBFYXJseUpzYWN0aW9uRGF0YUNvbnRhaW5lcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS9wcmltaXRpdmVzL2V2ZW50LWRpc3BhdGNoJztcblxuaW1wb3J0IHtBUFBfQk9PVFNUUkFQX0xJU1RFTkVSLCBBcHBsaWNhdGlvblJlZiwgd2hlblN0YWJsZX0gZnJvbSAnLi4vYXBwbGljYXRpb24vYXBwbGljYXRpb25fcmVmJztcbmltcG9ydCB7RU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIEluamVjdG9yfSBmcm9tICcuLi9kaSc7XG5pbXBvcnQge2luamVjdH0gZnJvbSAnLi4vZGkvaW5qZWN0b3JfY29tcGF0aWJpbGl0eSc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICcuLi9kaS9pbnRlcmZhY2UvcHJvdmlkZXInO1xuaW1wb3J0IHtzZXRTdGFzaEZufSBmcm9tICcuLi9yZW5kZXIzL2luc3RydWN0aW9ucy9saXN0ZW5lcic7XG5pbXBvcnQge1JFbGVtZW50fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXJfZG9tJztcbmltcG9ydCB7Q0xFQU5VUCwgTFZpZXcsIFRWaWV3fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge2lzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvbWlzY191dGlscyc7XG5pbXBvcnQge3Vud3JhcFJOb2RlfSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvdmlld191dGlscyc7XG5cbmltcG9ydCB7XG4gIEVWRU5UX1JFUExBWV9FTkFCTEVEX0RFRkFVTFQsXG4gIElTX0VWRU5UX1JFUExBWV9FTkFCTEVELFxuICBJU19HTE9CQUxfRVZFTlRfREVMRUdBVElPTl9FTkFCTEVELFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQge1xuICBHbG9iYWxFdmVudERlbGVnYXRpb24sXG4gIHNoYXJlZFN0YXNoRnVuY3Rpb24sXG4gIHJlbW92ZUxpc3RlbmVycyxcbiAgaW52b2tlUmVnaXN0ZXJlZExpc3RlbmVycyxcbn0gZnJvbSAnLi4vZXZlbnRfZGVsZWdhdGlvbl91dGlscyc7XG5pbXBvcnQge0FQUF9JRH0gZnJvbSAnLi4vYXBwbGljYXRpb24vYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7cGVyZm9ybWFuY2VNYXJrRmVhdHVyZX0gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZSc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIG5nQ29udHJhY3RzOiB7W2tleTogc3RyaW5nXTogRWFybHlKc2FjdGlvbkRhdGFDb250YWluZXJ9O1xufVxuXG5leHBvcnQgY29uc3QgQ09OVFJBQ1RfUFJPUEVSVFkgPSAnbmdDb250cmFjdHMnO1xuXG4vKipcbiAqIEEgc2V0IG9mIERPTSBlbGVtZW50cyB3aXRoIGBqc2FjdGlvbmAgYXR0cmlidXRlcy5cbiAqL1xuY29uc3QganNhY3Rpb25TZXQgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG5cbmZ1bmN0aW9uIGlzR2xvYmFsRXZlbnREZWxlZ2F0aW9uRW5hYmxlZChpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgcmV0dXJuIGluamVjdG9yLmdldChJU19HTE9CQUxfRVZFTlRfREVMRUdBVElPTl9FTkFCTEVELCBmYWxzZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIEV2ZW50IFJlcGxheSBmZWF0dXJlIHNob3VsZCBiZSBhY3RpdmF0ZWQgb24gdGhlIGNsaWVudC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkRW5hYmxlRXZlbnRSZXBsYXkoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gIHJldHVybiAoXG4gICAgaW5qZWN0b3IuZ2V0KElTX0VWRU5UX1JFUExBWV9FTkFCTEVELCBFVkVOVF9SRVBMQVlfRU5BQkxFRF9ERUZBVUxUKSAmJlxuICAgICFpc0dsb2JhbEV2ZW50RGVsZWdhdGlvbkVuYWJsZWQoaW5qZWN0b3IpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNldCBvZiBwcm92aWRlcnMgcmVxdWlyZWQgdG8gc2V0dXAgc3VwcG9ydCBmb3IgZXZlbnQgcmVwbGF5LlxuICogUmVxdWlyZXMgaHlkcmF0aW9uIHRvIGJlIGVuYWJsZWQgc2VwYXJhdGVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhFdmVudFJlcGxheSgpOiBQcm92aWRlcltdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBJU19FVkVOVF9SRVBMQVlfRU5BQkxFRCxcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgbGV0IGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcigpKSB7XG4gICAgICAgICAgLy8gTm90ZTogZ2xvYmFsVGhpc1tDT05UUkFDVF9QUk9QRVJUWV0gbWF5IGJlIHVuZGVmaW5lZCBpbiBjYXNlIEV2ZW50IFJlcGxheSBmZWF0dXJlXG4gICAgICAgICAgLy8gaXMgZW5hYmxlZCwgYnV0IHRoZXJlIGFyZSBubyBldmVudHMgY29uZmlndXJlZCBpbiB0aGlzIGFwcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlXG4gICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0aXZhdGUgdGhpcyBmZWF0dXJlLCBzaW5jZSB0aGVyZSBhcmUgbm8gZXZlbnRzIHRvIHJlcGxheS5cbiAgICAgICAgICBjb25zdCBhcHBJZCA9IGluamVjdChBUFBfSUQpO1xuICAgICAgICAgIGlzRW5hYmxlZCA9ICEhZ2xvYmFsVGhpc1tDT05UUkFDVF9QUk9QRVJUWV0/LlthcHBJZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgIHBlcmZvcm1hbmNlTWFya0ZlYXR1cmUoJ05nRXZlbnRSZXBsYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlVmFsdWU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIoaW5qZWN0b3IpICYmIHNob3VsZEVuYWJsZUV2ZW50UmVwbGF5KGluamVjdG9yKSkge1xuICAgICAgICAgIHNldFN0YXNoRm4oKHJFbDogUkVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBsaXN0ZW5lckZuOiBWb2lkRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHNoYXJlZFN0YXNoRnVuY3Rpb24ockVsLCBldmVudE5hbWUsIGxpc3RlbmVyRm4pO1xuICAgICAgICAgICAganNhY3Rpb25TZXQuYWRkKHJFbCBhcyB1bmtub3duIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4ge1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIoKSkge1xuICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICAgICAgICBjb25zdCBhcHBSZWYgPSBpbmplY3QoQXBwbGljYXRpb25SZWYpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNob3VsZEVuYWJsZUV2ZW50UmVwbGF5KGluamVjdG9yKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEtpY2sgb2ZmIGV2ZW50IHJlcGxheSBsb2dpYyBvbmNlIGh5ZHJhdGlvbiBmb3IgdGhlIGluaXRpYWwgcGFydFxuICAgICAgICAgICAgLy8gb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbXBsZXRlZC4gVGhpcyB0aW1pbmcgaXMgc2ltaWxhciB0byB0aGUgdW5jbGFpbWVkXG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVkIHZpZXdzIGNsZWFudXAgdGltaW5nLlxuICAgICAgICAgICAgd2hlblN0YWJsZShhcHBSZWYpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxFdmVudERlbGVnYXRpb24gPSBpbmplY3Rvci5nZXQoR2xvYmFsRXZlbnREZWxlZ2F0aW9uKTtcbiAgICAgICAgICAgICAgaW5pdEV2ZW50UmVwbGF5KGdsb2JhbEV2ZW50RGVsZWdhdGlvbiwgaW5qZWN0b3IpO1xuICAgICAgICAgICAgICBqc2FjdGlvblNldC5mb3JFYWNoKHJlbW92ZUxpc3RlbmVycyk7XG4gICAgICAgICAgICAgIC8vIEFmdGVyIGh5ZHJhdGlvbiwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gZG8gYW55bW9yZSB3b3JrIHJlbGF0ZWQgdG9cbiAgICAgICAgICAgICAgLy8gZXZlbnQgcmVwbGF5IGFueW1vcmUuXG4gICAgICAgICAgICAgIHNldFN0YXNoRm4oKCkgPT4ge30pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307IC8vIG5vb3AgZm9yIHRoZSBzZXJ2ZXIgY29kZVxuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF07XG59XG5cbi8vIFRPRE86IFVwc3RyZWFtIHRoaXMgYmFjayBpbnRvIGV2ZW50LWRpc3BhdGNoLlxuZnVuY3Rpb24gZ2V0SnNhY3Rpb25EYXRhKGNvbnRhaW5lcjogRWFybHlKc2FjdGlvbkRhdGFDb250YWluZXIpIHtcbiAgcmV0dXJuIGNvbnRhaW5lci5fZWpzYTtcbn1cblxuY29uc3QgaW5pdEV2ZW50UmVwbGF5ID0gKGV2ZW50RGVsZWdhdGlvbjogR2xvYmFsRXZlbnREZWxlZ2F0aW9uLCBpbmplY3RvcjogSW5qZWN0b3IpID0+IHtcbiAgY29uc3QgYXBwSWQgPSBpbmplY3Rvci5nZXQoQVBQX0lEKTtcbiAgLy8gVGhpcyBpcyBzZXQgaW4gcGFja2FnZXMvcGxhdGZvcm0tc2VydmVyL3NyYy91dGlscy50c1xuICBjb25zdCBjb250YWluZXIgPSBnbG9iYWxUaGlzW0NPTlRSQUNUX1BST1BFUlRZXT8uW2FwcElkXTtcbiAgY29uc3QgZWFybHlKc2FjdGlvbkRhdGEgPSBnZXRKc2FjdGlvbkRhdGEoY29udGFpbmVyKSE7XG4gIGNvbnN0IGV2ZW50Q29udHJhY3QgPSAoZXZlbnREZWxlZ2F0aW9uLmV2ZW50Q29udHJhY3QgPSBuZXcgRXZlbnRDb250cmFjdChcbiAgICBuZXcgRXZlbnRDb250cmFjdENvbnRhaW5lcihlYXJseUpzYWN0aW9uRGF0YS5jKSxcbiAgICAvKiB1c2VBY3Rpb25SZXNvbHZlcj0gKi8gZmFsc2UsXG4gICkpO1xuICBmb3IgKGNvbnN0IGV0IG9mIGVhcmx5SnNhY3Rpb25EYXRhLmV0KSB7XG4gICAgZXZlbnRDb250cmFjdC5hZGRFdmVudChldCk7XG4gIH1cbiAgZm9yIChjb25zdCBldCBvZiBlYXJseUpzYWN0aW9uRGF0YS5ldGMpIHtcbiAgICBldmVudENvbnRyYWN0LmFkZEV2ZW50KGV0KTtcbiAgfVxuICBldmVudENvbnRyYWN0LnJlcGxheUVhcmx5RXZlbnRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKGludm9rZVJlZ2lzdGVyZWRMaXN0ZW5lcnMpO1xuICByZWdpc3RlckRpc3BhdGNoZXIoZXZlbnRDb250cmFjdCwgZGlzcGF0Y2hlcik7XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBET00gZXZlbnRzIChhZGRlZCBpbiBhIHRlbXBsYXRlKSByZWdpc3RlcmVkIG9uIGVsZW1lbnRzIGluIGEgZ2l2ZVxuICogTFZpZXcuIE1hcHMgY29sbGVjdGVkIGV2ZW50cyB0byBhIGNvcnJlc3BvbmRpbmcgRE9NIGVsZW1lbnQgKGFuIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGtleSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RG9tRXZlbnRzSW5mbyhcbiAgdFZpZXc6IFRWaWV3LFxuICBsVmlldzogTFZpZXcsXG4gIGV2ZW50VHlwZXNUb1JlcGxheToge3JlZ3VsYXI6IFNldDxzdHJpbmc+OyBjYXB0dXJlOiBTZXQ8c3RyaW5nPn0sXG4pOiBNYXA8RWxlbWVudCwgc3RyaW5nW10+IHtcbiAgY29uc3QgZXZlbnRzID0gbmV3IE1hcDxFbGVtZW50LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgbENsZWFudXAgPSBsVmlld1tDTEVBTlVQXTtcbiAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwO1xuICBpZiAoIXRDbGVhbnVwIHx8ICFsQ2xlYW51cCkge1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGZpcnN0UGFyYW0gPSB0Q2xlYW51cFtpKytdO1xuICAgIGNvbnN0IHNlY29uZFBhcmFtID0gdENsZWFudXBbaSsrXTtcbiAgICBpZiAodHlwZW9mIGZpcnN0UGFyYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZTogc3RyaW5nID0gZmlyc3RQYXJhbTtcbiAgICBpZiAoIWlzU3VwcG9ydGVkRXZlbnQobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNDYXB0dXJlRXZlbnQobmFtZSkpIHtcbiAgICAgIGV2ZW50VHlwZXNUb1JlcGxheS5jYXB0dXJlLmFkZChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnRUeXBlc1RvUmVwbGF5LnJlZ3VsYXIuYWRkKG5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lckVsZW1lbnQgPSB1bndyYXBSTm9kZShsVmlld1tzZWNvbmRQYXJhbV0pIGFzIGFueSBhcyBFbGVtZW50O1xuICAgIGkrKzsgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHBvc2l0aW9uIChsb2NhdGlvbiBvZiB0aGUgbGlzdGVuZXIgaWR4KVxuICAgIGNvbnN0IHVzZUNhcHR1cmVPckluZHggPSB0Q2xlYW51cFtpKytdO1xuICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy5cbiAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIHBvc2l0aXZlIG51bWJlciB0aGVuIGl0IGluIHVuc3Vic2NyaWJlIG1ldGhvZFxuICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgbmVnYXRpdmUgbnVtYmVyIHRoZW4gaXQgaXMgYSBTdWJzY3JpcHRpb25cbiAgICBjb25zdCBpc0RvbUV2ZW50ID0gdHlwZW9mIHVzZUNhcHR1cmVPckluZHggPT09ICdib29sZWFuJyB8fCB1c2VDYXB0dXJlT3JJbmR4ID49IDA7XG4gICAgaWYgKCFpc0RvbUV2ZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFldmVudHMuaGFzKGxpc3RlbmVyRWxlbWVudCkpIHtcbiAgICAgIGV2ZW50cy5zZXQobGlzdGVuZXJFbGVtZW50LCBbbmFtZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudHMuZ2V0KGxpc3RlbmVyRWxlbWVudCkhLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBldmVudHM7XG59XG4iXX0=
|
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { inject, Injector } from '../di';
|
|
9
9
|
import { isRootTemplateMessage } from '../render3/i18n/i18n_util';
|
|
10
|
+
import { createIcuIterator } from '../render3/instructions/i18n_icu_container_visitor';
|
|
11
|
+
import { isTNodeShape } from '../render3/interfaces/node';
|
|
10
12
|
import { HEADER_OFFSET, HYDRATION, RENDERER, TVIEW } from '../render3/interfaces/view';
|
|
11
|
-
import { nativeRemoveNode } from '../render3/node_manipulation';
|
|
13
|
+
import { getFirstNativeNode, nativeRemoveNode } from '../render3/node_manipulation';
|
|
12
14
|
import { unwrapRNode } from '../render3/util/view_utils';
|
|
13
15
|
import { assertDefined, assertNotEqual } from '../util/assert';
|
|
14
16
|
import { I18N_DATA } from './interfaces';
|
|
15
|
-
import { locateNextRNode, tryLocateRNodeByPath } from './node_lookup_utils';
|
|
17
|
+
import { isDisconnectedRNode, locateNextRNode, tryLocateRNodeByPath } from './node_lookup_utils';
|
|
16
18
|
import { IS_I18N_HYDRATION_ENABLED } from './tokens';
|
|
17
19
|
import { getNgContainerSize, initDisconnectedNodes, isSerializedElementContainer, processTextNodeBeforeSerialization, } from './utils';
|
|
18
20
|
let _isI18nHydrationSupportEnabled = false;
|
|
@@ -112,30 +114,104 @@ export function trySerializeI18nBlock(lView, index, context) {
|
|
|
112
114
|
if (!tI18n || !tI18n.ast) {
|
|
113
115
|
return null;
|
|
114
116
|
}
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
const serializedI18nBlock = {
|
|
118
|
+
caseQueue: [],
|
|
119
|
+
disconnectedNodes: new Set(),
|
|
120
|
+
disjointNodes: new Set(),
|
|
121
|
+
};
|
|
122
|
+
serializeI18nBlock(lView, serializedI18nBlock, context, tI18n.ast);
|
|
123
|
+
return serializedI18nBlock.caseQueue.length === 0 &&
|
|
124
|
+
serializedI18nBlock.disconnectedNodes.size === 0 &&
|
|
125
|
+
serializedI18nBlock.disjointNodes.size === 0
|
|
126
|
+
? null
|
|
127
|
+
: serializedI18nBlock;
|
|
118
128
|
}
|
|
119
|
-
function serializeI18nBlock(lView,
|
|
129
|
+
function serializeI18nBlock(lView, serializedI18nBlock, context, nodes) {
|
|
130
|
+
let prevRNode = null;
|
|
131
|
+
for (const node of nodes) {
|
|
132
|
+
const nextRNode = serializeI18nNode(lView, serializedI18nBlock, context, node);
|
|
133
|
+
if (nextRNode) {
|
|
134
|
+
if (isDisjointNode(prevRNode, nextRNode)) {
|
|
135
|
+
serializedI18nBlock.disjointNodes.add(node.index - HEADER_OFFSET);
|
|
136
|
+
}
|
|
137
|
+
prevRNode = nextRNode;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return prevRNode;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Helper to determine whether the given nodes are "disjoint".
|
|
144
|
+
*
|
|
145
|
+
* The i18n hydration process walks through the DOM and i18n nodes
|
|
146
|
+
* at the same time. It expects the sibling DOM node of the previous
|
|
147
|
+
* i18n node to be the first node of the next i18n node.
|
|
148
|
+
*
|
|
149
|
+
* In cases of content projection, this won't always be the case. So
|
|
150
|
+
* when we detect that, we mark the node as "disjoint", ensuring that
|
|
151
|
+
* we will serialize the path to the node. This way, when we hydrate the
|
|
152
|
+
* i18n node, we will be able to find the correct place to start.
|
|
153
|
+
*/
|
|
154
|
+
function isDisjointNode(prevNode, nextNode) {
|
|
155
|
+
return prevNode && prevNode.nextSibling !== nextNode;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Process the given i18n node for serialization.
|
|
159
|
+
* Returns the first RNode for the i18n node to begin hydration.
|
|
160
|
+
*/
|
|
161
|
+
function serializeI18nNode(lView, serializedI18nBlock, context, node) {
|
|
162
|
+
const maybeRNode = unwrapRNode(lView[node.index]);
|
|
163
|
+
if (!maybeRNode || isDisconnectedRNode(maybeRNode)) {
|
|
164
|
+
serializedI18nBlock.disconnectedNodes.add(node.index - HEADER_OFFSET);
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const rNode = maybeRNode;
|
|
120
168
|
switch (node.kind) {
|
|
121
|
-
case 0 /* I18nNodeKind.TEXT */:
|
|
122
|
-
const rNode = unwrapRNode(lView[node.index]);
|
|
169
|
+
case 0 /* I18nNodeKind.TEXT */: {
|
|
123
170
|
processTextNodeBeforeSerialization(context, rNode);
|
|
124
171
|
break;
|
|
172
|
+
}
|
|
125
173
|
case 1 /* I18nNodeKind.ELEMENT */:
|
|
126
|
-
case 2 /* I18nNodeKind.PLACEHOLDER */:
|
|
127
|
-
|
|
174
|
+
case 2 /* I18nNodeKind.PLACEHOLDER */: {
|
|
175
|
+
serializeI18nBlock(lView, serializedI18nBlock, context, node.children);
|
|
128
176
|
break;
|
|
129
|
-
|
|
177
|
+
}
|
|
178
|
+
case 3 /* I18nNodeKind.ICU */: {
|
|
130
179
|
const currentCase = lView[node.currentCaseLViewIndex];
|
|
131
180
|
if (currentCase != null) {
|
|
132
181
|
// i18n uses a negative value to signal a change to a new case, so we
|
|
133
182
|
// need to invert it to get the proper value.
|
|
134
183
|
const caseIdx = currentCase < 0 ? ~currentCase : currentCase;
|
|
135
|
-
caseQueue.push(caseIdx);
|
|
136
|
-
|
|
184
|
+
serializedI18nBlock.caseQueue.push(caseIdx);
|
|
185
|
+
serializeI18nBlock(lView, serializedI18nBlock, context, node.cases[caseIdx]);
|
|
137
186
|
}
|
|
138
187
|
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return getFirstNativeNodeForI18nNode(lView, node);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Helper function to get the first native node to begin hydrating
|
|
194
|
+
* the given i18n node.
|
|
195
|
+
*/
|
|
196
|
+
function getFirstNativeNodeForI18nNode(lView, node) {
|
|
197
|
+
const tView = lView[TVIEW];
|
|
198
|
+
const maybeTNode = tView.data[node.index];
|
|
199
|
+
if (isTNodeShape(maybeTNode)) {
|
|
200
|
+
// If the node is backed by an actual TNode, we can simply delegate.
|
|
201
|
+
return getFirstNativeNode(lView, maybeTNode);
|
|
202
|
+
}
|
|
203
|
+
else if (node.kind === 3 /* I18nNodeKind.ICU */) {
|
|
204
|
+
// A nested ICU container won't have an actual TNode. In that case, we can use
|
|
205
|
+
// an iterator to find the first child.
|
|
206
|
+
const icuIterator = createIcuIterator(maybeTNode, lView);
|
|
207
|
+
let rNode = icuIterator();
|
|
208
|
+
// If the ICU container has no nodes, then we use the ICU anchor as the node.
|
|
209
|
+
return rNode ?? unwrapRNode(lView[node.index]);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// Otherwise, the node is a text or trivial element in an ICU container,
|
|
213
|
+
// and we can just use the RNode directly.
|
|
214
|
+
return unwrapRNode(lView[node.index]) ?? null;
|
|
139
215
|
}
|
|
140
216
|
}
|
|
141
217
|
function setCurrentNode(state, node) {
|
|
@@ -228,16 +304,24 @@ function prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplate
|
|
|
228
304
|
}
|
|
229
305
|
function collectI18nNodesFromDom(context, state, nodeOrNodes) {
|
|
230
306
|
if (Array.isArray(nodeOrNodes)) {
|
|
307
|
+
let nextState = state;
|
|
231
308
|
for (const node of nodeOrNodes) {
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
309
|
+
// Whenever a node doesn't directly follow the previous RNode, it
|
|
310
|
+
// is given a path. We need to resume collecting nodes from that location
|
|
311
|
+
// until and unless we find another disjoint node.
|
|
235
312
|
const targetNode = tryLocateRNodeByPath(context.hydrationInfo, context.lView, node.index - HEADER_OFFSET);
|
|
236
|
-
|
|
313
|
+
if (targetNode) {
|
|
314
|
+
nextState = forkHydrationState(state, targetNode);
|
|
315
|
+
}
|
|
237
316
|
collectI18nNodesFromDom(context, nextState, node);
|
|
238
317
|
}
|
|
239
318
|
}
|
|
240
319
|
else {
|
|
320
|
+
if (context.disconnectedNodes.has(nodeOrNodes.index - HEADER_OFFSET)) {
|
|
321
|
+
// i18n nodes can be considered disconnected if e.g. they were projected.
|
|
322
|
+
// In that case, we have to make sure to skip over them.
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
241
325
|
switch (nodeOrNodes.kind) {
|
|
242
326
|
case 0 /* I18nNodeKind.TEXT */: {
|
|
243
327
|
// Claim a text node for hydration
|
|
@@ -374,4 +458,4 @@ function cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData) {
|
|
|
374
458
|
}
|
|
375
459
|
}
|
|
376
460
|
}
|
|
377
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pMThuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBS2hFLE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFTLFFBQVEsRUFBUyxLQUFLLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc3RCxPQUFPLEVBQW9DLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLDRCQUE0QixFQUM1QixrQ0FBa0MsR0FDbkMsTUFBTSxTQUFTLENBQUM7QUFFakIsSUFBSSw4QkFBOEIsR0FBRyxLQUFLLENBQUM7QUFFM0MsSUFBSSxpQ0FBaUMsR0FBNEMsR0FBRyxFQUFFO0lBQ3BGLG1FQUFtRTtBQUNyRSxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0NBQWdDLENBQUMsT0FBZ0I7SUFDL0QsOEJBQThCLEdBQUcsT0FBTyxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLE9BQU8sOEJBQThCLENBQUM7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QUMsQ0FBQztZQUNqQyxLQUFLLE1BQU0saUJBQWlCLElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDOUQsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDO1FBRUQsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDcEMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQy9CLFFBQWtCLEVBQ2xCLFNBQW9DLEVBQ3BDLGlCQUFvQztJQUVwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDeEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7aW5qZWN0LCBJbmplY3Rvcn0gZnJvbSAnLi4vZGknO1xuaW1wb3J0IHtpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2V9IGZyb20gJy4uL3JlbmRlcjMvaTE4bi9pMThuX3V0aWwnO1xuaW1wb3J0IHtJMThuTm9kZSwgSTE4bk5vZGVLaW5kLCBJMThuUGxhY2Vob2xkZXJUeXBlLCBUSTE4bn0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL2kxOG4nO1xuaW1wb3J0IHtUTm9kZSwgVE5vZGVUeXBlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgdHlwZSB7UmVuZGVyZXJ9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9yZW5kZXJlcic7XG5pbXBvcnQgdHlwZSB7Uk5vZGV9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9yZW5kZXJlcl9kb20nO1xuaW1wb3J0IHtIRUFERVJfT0ZGU0VULCBIWURSQVRJT04sIExWaWV3LCBSRU5ERVJFUiwgVFZpZXcsIFRWSUVXfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge25hdGl2ZVJlbW92ZU5vZGV9IGZyb20gJy4uL3JlbmRlcjMvbm9kZV9tYW5pcHVsYXRpb24nO1xuaW1wb3J0IHt1bndyYXBSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy91dGlsL3ZpZXdfdXRpbHMnO1xuaW1wb3J0IHthc3NlcnREZWZpbmVkLCBhc3NlcnROb3RFcXVhbH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7SHlkcmF0aW9uQ29udGV4dH0gZnJvbSAnLi9hbm5vdGF0ZSc7XG5pbXBvcnQge0RlaHlkcmF0ZWRJY3VEYXRhLCBEZWh5ZHJhdGVkVmlldywgSTE4Tl9EQVRBfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtsb2NhdGVOZXh0Uk5vZGUsIHRyeUxvY2F0ZVJOb2RlQnlQYXRofSBmcm9tICcuL25vZGVfbG9va3VwX3V0aWxzJztcbmltcG9ydCB7SVNfSTE4Tl9IWURSQVRJT05fRU5BQkxFRH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHtcbiAgZ2V0TmdDb250YWluZXJTaXplLFxuICBpbml0RGlzY29ubmVjdGVkTm9kZXMsXG4gIGlzU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXIsXG4gIHByb2Nlc3NUZXh0Tm9kZUJlZm9yZVNlcmlhbGl6YXRpb24sXG59IGZyb20gJy4vdXRpbHMnO1xuXG5sZXQgX2lzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkID0gZmFsc2U7XG5cbmxldCBfcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGw6IHR5cGVvZiBwcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbCA9ICgpID0+IHtcbiAgLy8gbm9vcCB1bmxlc3MgYGVuYWJsZVByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsYCBpcyBpbnZva2VkLlxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldElzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgX2lzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkID0gZW5hYmxlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkKCkge1xuICByZXR1cm4gX2lzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkO1xufVxuXG4vKipcbiAqIFByZXBhcmVzIGFuIGkxOG4gYmxvY2sgYW5kIGl0cyBjaGlsZHJlbiwgbG9jYXRlZCBhdCB0aGUgZ2l2ZW5cbiAqIHZpZXcgYW5kIGluc3RydWN0aW9uIGluZGV4LCBmb3IgaHlkcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBsVmlldyBsVmlldyB3aXRoIHRoZSBpMThuIGJsb2NrXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGkxOG4gYmxvY2sgaW4gdGhlIGxWaWV3XG4gKiBAcGFyYW0gcGFyZW50VE5vZGUgVE5vZGUgb2YgdGhlIHBhcmVudCBvZiB0aGUgaTE4biBibG9ja1xuICogQHBhcmFtIHN1YlRlbXBsYXRlSW5kZXggc3ViLXRlbXBsYXRlIGluZGV4LCBvciAtMSBmb3IgdGhlIG1haW4gdGVtcGxhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb24oXG4gIGxWaWV3OiBMVmlldyxcbiAgaW5kZXg6IG51bWJlcixcbiAgcGFyZW50VE5vZGU6IFROb2RlIHwgbnVsbCxcbiAgc3ViVGVtcGxhdGVJbmRleDogbnVtYmVyLFxuKTogdm9pZCB7XG4gIF9wcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbChsVmlldywgaW5kZXgsIHBhcmVudFROb2RlLCBzdWJUZW1wbGF0ZUluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsKCkge1xuICBfcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwgPSBwcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSTE4bkh5ZHJhdGlvbkVuYWJsZWQoaW5qZWN0b3I/OiBJbmplY3Rvcikge1xuICBpbmplY3RvciA9IGluamVjdG9yID8/IGluamVjdChJbmplY3Rvcik7XG4gIHJldHVybiBpbmplY3Rvci5nZXQoSVNfSTE4Tl9IWURSQVRJT05fRU5BQkxFRCwgZmFsc2UpO1xufVxuXG4vKipcbiAqIENvbGxlY3RzLCBpZiBub3QgYWxyZWFkeSBjYWNoZWQsIGFsbCBvZiB0aGUgaW5kaWNlcyBpbiB0aGVcbiAqIGdpdmVuIFRWaWV3IHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBhbiBpMThuIGJsb2NrLlxuICpcbiAqIFNpbmNlIGkxOG4gYmxvY2tzIGRvbid0IGludHJvZHVjZSBhIHBhcmVudCBUTm9kZSwgdGhpcyBpcyBuZWNlc3NhcnlcbiAqIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBpbmRpY2VzIGluIGEgTFZpZXcgYXJlIHRyYW5zbGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNvbXB1dGVJMThuQ2hpbGRyZW4oXG4gIHRWaWV3OiBUVmlldyxcbiAgY29udGV4dDogSHlkcmF0aW9uQ29udGV4dCxcbik6IFNldDxudW1iZXI+IHwgbnVsbCB7XG4gIGxldCBpMThuQ2hpbGRyZW4gPSBjb250ZXh0LmkxOG5DaGlsZHJlbi5nZXQodFZpZXcpO1xuICBpZiAoaTE4bkNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICBpMThuQ2hpbGRyZW4gPSBjb2xsZWN0STE4bkNoaWxkcmVuKHRWaWV3KTtcbiAgICBjb250ZXh0LmkxOG5DaGlsZHJlbi5zZXQodFZpZXcsIGkxOG5DaGlsZHJlbik7XG4gIH1cbiAgcmV0dXJuIGkxOG5DaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEkxOG5DaGlsZHJlbih0VmlldzogVFZpZXcpOiBTZXQ8bnVtYmVyPiB8IG51bGwge1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RJMThuVmlld3Mobm9kZTogSTE4bk5vZGUpIHtcbiAgICBjaGlsZHJlbi5hZGQobm9kZS5pbmRleCk7XG5cbiAgICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuRUxFTUVOVDpcbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLlBMQUNFSE9MREVSOiB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb2xsZWN0STE4blZpZXdzKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLklDVToge1xuICAgICAgICBmb3IgKGNvbnN0IGNhc2VOb2RlcyBvZiBub2RlLmNhc2VzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjYXNlTm9kZSBvZiBjYXNlTm9kZXMpIHtcbiAgICAgICAgICAgIGNvbGxlY3RJMThuVmlld3MoY2FzZU5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcmF2ZXJzZSB0aHJvdWdoIHRoZSBBU1Qgb2YgZWFjaCBpMThuIGJsb2NrIGluIHRoZSBMVmlldyxcbiAgLy8gYW5kIGNvbGxlY3QgZXZlcnkgaW5zdHJ1Y3Rpb24gaW5kZXguXG4gIGZvciAobGV0IGkgPSBIRUFERVJfT0ZGU0VUOyBpIDwgdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXg7IGkrKykge1xuICAgIGNvbnN0IHRJMThuID0gdFZpZXcuZGF0YVtpXSBhcyBUSTE4biB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRJMThuIHx8ICF0STE4bi5hc3QpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0STE4bi5hc3QpIHtcbiAgICAgIGNvbGxlY3RJMThuVmlld3Mobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuLnNpemUgPT09IDAgPyBudWxsIDogY2hpbGRyZW47XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gc2VyaWFsaXplIGkxOG4gZGF0YSBmb3IgYW4gaTE4biBibG9jaywgbG9jYXRlZCBhdFxuICogdGhlIGdpdmVuIHZpZXcgYW5kIGluc3RydWN0aW9uIGluZGV4LlxuICpcbiAqIEBwYXJhbSBsVmlldyBsVmlldyB3aXRoIHRoZSBpMThuIGJsb2NrXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGkxOG4gYmxvY2sgaW4gdGhlIGxWaWV3XG4gKiBAcGFyYW0gY29udGV4dCB0aGUgaHlkcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIHRoZSBpMThuIGRhdGEsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcmVsZXZhbnQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5U2VyaWFsaXplSTE4bkJsb2NrKFxuICBsVmlldzogTFZpZXcsXG4gIGluZGV4OiBudW1iZXIsXG4gIGNvbnRleHQ6IEh5ZHJhdGlvbkNvbnRleHQsXG4pOiBBcnJheTxudW1iZXI+IHwgbnVsbCB7XG4gIGlmICghY29udGV4dC5pc0kxOG5IeWRyYXRpb25FbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgY29uc3QgdEkxOG4gPSB0Vmlldy5kYXRhW2luZGV4XSBhcyBUSTE4biB8IHVuZGVmaW5lZDtcbiAgaWYgKCF0STE4biB8fCAhdEkxOG4uYXN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjYXNlUXVldWU6IG51bWJlcltdID0gW107XG4gIHRJMThuLmFzdC5mb3JFYWNoKChub2RlKSA9PiBzZXJpYWxpemVJMThuQmxvY2sobFZpZXcsIGNhc2VRdWV1ZSwgY29udGV4dCwgbm9kZSkpO1xuICByZXR1cm4gY2FzZVF1ZXVlLmxlbmd0aCA+IDAgPyBjYXNlUXVldWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVJMThuQmxvY2soXG4gIGxWaWV3OiBMVmlldyxcbiAgY2FzZVF1ZXVlOiBudW1iZXJbXSxcbiAgY29udGV4dDogSHlkcmF0aW9uQ29udGV4dCxcbiAgbm9kZTogSTE4bk5vZGUsXG4pIHtcbiAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICBjYXNlIEkxOG5Ob2RlS2luZC5URVhUOlxuICAgICAgY29uc3Qgck5vZGUgPSB1bndyYXBSTm9kZShsVmlld1tub2RlLmluZGV4XSEpO1xuICAgICAgcHJvY2Vzc1RleHROb2RlQmVmb3JlU2VyaWFsaXphdGlvbihjb250ZXh0LCByTm9kZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSTE4bk5vZGVLaW5kLkVMRU1FTlQ6XG4gICAgY2FzZSBJMThuTm9kZUtpbmQuUExBQ0VIT0xERVI6XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKG5vZGUpID0+IHNlcmlhbGl6ZUkxOG5CbG9jayhsVmlldywgY2FzZVF1ZXVlLCBjb250ZXh0LCBub2RlKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSTE4bk5vZGVLaW5kLklDVTpcbiAgICAgIGNvbnN0IGN1cnJlbnRDYXNlID0gbFZpZXdbbm9kZS5jdXJyZW50Q2FzZUxWaWV3SW5kZXhdIGFzIG51bWJlciB8IG51bGw7XG4gICAgICBpZiAoY3VycmVudENhc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBpMThuIHVzZXMgYSBuZWdhdGl2ZSB2YWx1ZSB0byBzaWduYWwgYSBjaGFuZ2UgdG8gYSBuZXcgY2FzZSwgc28gd2VcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlcnQgaXQgdG8gZ2V0IHRoZSBwcm9wZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IGNhc2VJZHggPSBjdXJyZW50Q2FzZSA8IDAgPyB+Y3VycmVudENhc2UgOiBjdXJyZW50Q2FzZTtcbiAgICAgICAgY2FzZVF1ZXVlLnB1c2goY2FzZUlkeCk7XG4gICAgICAgIG5vZGUuY2FzZXNbY2FzZUlkeF0uZm9yRWFjaCgobm9kZSkgPT4gc2VyaWFsaXplSTE4bkJsb2NrKGxWaWV3LCBjYXNlUXVldWUsIGNvbnRleHQsIG5vZGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHNoYXJlZCBkYXRhIGF2YWlsYWJsZSBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBwcm9jZXNzLlxuICovXG5pbnRlcmZhY2UgSTE4bkh5ZHJhdGlvbkNvbnRleHQge1xuICBoeWRyYXRpb25JbmZvOiBEZWh5ZHJhdGVkVmlldztcbiAgbFZpZXc6IExWaWV3O1xuICBpMThuTm9kZXM6IE1hcDxudW1iZXIsIFJOb2RlIHwgbnVsbD47XG4gIGRpc2Nvbm5lY3RlZE5vZGVzOiBTZXQ8bnVtYmVyPjtcbiAgY2FzZVF1ZXVlOiBudW1iZXJbXTtcbiAgZGVoeWRyYXRlZEljdURhdGE6IE1hcDxudW1iZXIsIERlaHlkcmF0ZWRJY3VEYXRhPjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgY3VycmVudCBoeWRyYXRpb24gc3RhdGUuXG4gKi9cbmludGVyZmFjZSBJMThuSHlkcmF0aW9uU3RhdGUge1xuICAvLyBUaGUgY3VycmVudCBub2RlXG4gIGN1cnJlbnROb2RlOiBOb2RlIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdHJlZSBzaG91bGQgYmUgY29ubmVjdGVkLlxuICAgKlxuICAgKiBEdXJpbmcgaHlkcmF0aW9uLCBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZXhwZWN0IHRvIGhhdmUgYVxuICAgKiBjdXJyZW50IFJOb2RlLCBidXQgd2UgZG9uJ3QuIEluIHN1Y2ggY2FzZXMsIHdlIHN0aWxsIG5lZWRcbiAgICogdG8gcHJvcGFnYXRlIHRoZSBleHBlY3RhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBMVmlld3MsXG4gICAqIHNvIHRoYXQgdGhlIHByb3BlciBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIGNhbiBwcm92aWRlXG4gICAqIHRoZSBjb3JyZWN0IGNvbnRleHQgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50Tm9kZShzdGF0ZTogSTE4bkh5ZHJhdGlvblN0YXRlLCBub2RlOiBOb2RlIHwgbnVsbCkge1xuICBzdGF0ZS5jdXJyZW50Tm9kZSA9IG5vZGU7XG59XG5cbi8qKlxuICogTWFya3MgdGhlIGN1cnJlbnQgUk5vZGUgYXMgdGhlIGh5ZHJhdGlvbiByb290IGZvciB0aGUgZ2l2ZW5cbiAqIEFTVCBub2RlLlxuICovXG5mdW5jdGlvbiBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihcbiAgY29udGV4dDogSTE4bkh5ZHJhdGlvbkNvbnRleHQsXG4gIHN0YXRlOiBJMThuSHlkcmF0aW9uU3RhdGUsXG4gIGFzdE5vZGU6IEkxOG5Ob2RlLFxuKSB7XG4gIGNvbnN0IG5vT2Zmc2V0SW5kZXggPSBhc3ROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDtcbiAgY29uc3Qge2Rpc2Nvbm5lY3RlZE5vZGVzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGN1cnJlbnROb2RlID0gc3RhdGUuY3VycmVudE5vZGU7XG5cbiAgaWYgKHN0YXRlLmlzQ29ubmVjdGVkKSB7XG4gICAgY29udGV4dC5pMThuTm9kZXMuc2V0KG5vT2Zmc2V0SW5kZXgsIGN1cnJlbnROb2RlKTtcblxuICAgIC8vIFdlIGV4cGVjdCB0aGUgbm9kZSB0byBiZSBjb25uZWN0ZWQsIHNvIGVuc3VyZSB0aGF0IGl0XG4gICAgLy8gaXMgbm90IGluIHRoZSBzZXQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBmb3VuZCBpdCxcbiAgICAvLyBzbyB0aGF0IHRoZSBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIGNhbiBwcm92aWRlIHRoZVxuICAgIC8vIHByb3BlciBjb250ZXh0LlxuICAgIGRpc2Nvbm5lY3RlZE5vZGVzLmRlbGV0ZShub09mZnNldEluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICBkaXNjb25uZWN0ZWROb2Rlcy5hZGQobm9PZmZzZXRJbmRleCk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudE5vZGU7XG59XG5cbi8qKlxuICogU2tpcCBvdmVyIHNvbWUgc2libGluZyBub2RlcyBkdXJpbmcgaHlkcmF0aW9uLlxuICpcbiAqIE5vdGU6IHdlIHVzZSB0aGlzIGluc3RlYWQgb2YgYHNpYmxpbmdBZnRlcmAgYXMgaXQncyBleHBlY3RlZCB0aGF0XG4gKiBzb21ldGltZXMgd2UgbWlnaHQgZW5jb3VudGVyIG51bGwgbm9kZXMuIEluIHRob3NlIGNhc2VzLCB3ZSB3YW50IHRvXG4gKiBkZWZlciB0byBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIHRvIHByb3ZpZGUgcHJvcGVyIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIHNraXBTaWJsaW5nTm9kZXMoc3RhdGU6IEkxOG5IeWRyYXRpb25TdGF0ZSwgc2tpcDogbnVtYmVyKSB7XG4gIGxldCBjdXJyZW50Tm9kZSA9IHN0YXRlLmN1cnJlbnROb2RlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNraXA7IGkrKykge1xuICAgIGlmICghY3VycmVudE5vZGUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlPy5uZXh0U2libGluZyA/PyBudWxsO1xuICB9XG4gIHJldHVybiBjdXJyZW50Tm9kZTtcbn1cblxuLyoqXG4gKiBGb3JrIHRoZSBnaXZlbiBzdGF0ZSBpbnRvIGEgbmV3IHN0YXRlIGZvciBoeWRyYXRpbmcgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGZvcmtIeWRyYXRpb25TdGF0ZShzdGF0ZTogSTE4bkh5ZHJhdGlvblN0YXRlLCBuZXh0Tm9kZTogTm9kZSB8IG51bGwpIHtcbiAgcmV0dXJuIHtjdXJyZW50Tm9kZTogbmV4dE5vZGUsIGlzQ29ubmVjdGVkOiBzdGF0ZS5pc0Nvbm5lY3RlZH07XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsKFxuICBsVmlldzogTFZpZXcsXG4gIGluZGV4OiBudW1iZXIsXG4gIHBhcmVudFROb2RlOiBUTm9kZSB8IG51bGwsXG4gIHN1YlRlbXBsYXRlSW5kZXg6IG51bWJlcixcbikge1xuICBpZiAoIWlzSTE4bkh5ZHJhdGlvblN1cHBvcnRFbmFibGVkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoeWRyYXRpb25JbmZvID0gbFZpZXdbSFlEUkFUSU9OXTtcbiAgaWYgKCFoeWRyYXRpb25JbmZvKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107XG4gIGNvbnN0IHRJMThuID0gdFZpZXcuZGF0YVtpbmRleF0gYXMgVEkxOG47XG4gIG5nRGV2TW9kZSAmJlxuICAgIGFzc2VydERlZmluZWQodEkxOG4sICdFeHBlY3RlZCBpMThuIGRhdGEgdG8gYmUgcHJlc2VudCBpbiBhIGdpdmVuIFRWaWV3IHNsb3QgZHVyaW5nIGh5ZHJhdGlvbicpO1xuXG4gIGZ1bmN0aW9uIGZpbmRIeWRyYXRpb25Sb290KCkge1xuICAgIGlmIChpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2Uoc3ViVGVtcGxhdGVJbmRleCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYW4gaTE4biBibG9jay4gSW4gdGhpcyBjYXNlLCBvdXIgaHlkcmF0aW9uIHJvb3Qgd2lsbFxuICAgICAgLy8gZGVwZW5kIG9uIHdoZXJlIG91ciBwYXJlbnQgVE5vZGUgKGkuZS4gdGhlIGJsb2NrIHdpdGggaTE4biBhcHBsaWVkKSBpc1xuICAgICAgLy8gaW4gdGhlIERPTS5cbiAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHBhcmVudFROb2RlLCAnRXhwZWN0ZWQgcGFyZW50IFROb2RlIHdoaWxlIGh5ZHJhdGluZyBpMThuIHJvb3QnKTtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gbG9jYXRlTmV4dFJOb2RlKGh5ZHJhdGlvbkluZm8hLCB0VmlldywgbFZpZXcsIHBhcmVudFROb2RlISkgYXMgTm9kZTtcblxuICAgICAgLy8gSWYgdGhpcyBpMThuIGJsb2NrIGlzIGF0dGFjaGVkIHRvIGFuIDxuZy1jb250YWluZXI+LCB0aGVuIHdlIHdhbnQgdG8gYmVnaW5cbiAgICAgIC8vIGh5ZHJhdGluZyBkaXJlY3RseSB3aXRoIHRoZSBSTm9kZS4gT3RoZXJ3aXNlLCBmb3IgYSBUTm9kZSB3aXRoIGEgcGh5c2ljYWwgRE9NXG4gICAgICAvLyBlbGVtZW50LCB3ZSB3YW50IHRvIHJlY3Vyc2UgaW50byB0aGUgZmlyc3QgY2hpbGQgYW5kIGJlZ2luIHRoZXJlLlxuICAgICAgcmV0dXJuIHBhcmVudFROb2RlIS50eXBlICYgVE5vZGVUeXBlLkVsZW1lbnRDb250YWluZXIgPyByb290Tm9kZSA6IHJvb3ROb2RlLmZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIG5lc3RlZCB0ZW1wbGF0ZSBpbiBhbiBpMThuIGJsb2NrLiBJbiB0aGlzIGNhc2UsIHRoZSBlbnRpcmUgdmlld1xuICAgIC8vIGlzIHRyYW5zbGF0ZWQsIGFuZCBwYXJ0IG9mIGEgZGVoeWRyYXRlZCB2aWV3IGluIGEgY29udGFpbmVyLiBUaGlzIG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBjYW4gc2ltcGx5IGJlZ2luIGh5ZHJhdGlvbiB3aXRoIHRoZSBmaXJzdCBkZWh5ZHJhdGVkIGNoaWxkLlxuICAgIHJldHVybiBoeWRyYXRpb25JbmZvPy5maXJzdENoaWxkIGFzIE5vZGU7XG4gIH1cblxuICBjb25zdCBjdXJyZW50Tm9kZSA9IGZpbmRIeWRyYXRpb25Sb290KCk7XG4gIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGN1cnJlbnROb2RlLCAnRXhwZWN0ZWQgcm9vdCBpMThuIG5vZGUgZHVyaW5nIGh5ZHJhdGlvbicpO1xuXG4gIGNvbnN0IGRpc2Nvbm5lY3RlZE5vZGVzID0gaW5pdERpc2Nvbm5lY3RlZE5vZGVzKGh5ZHJhdGlvbkluZm8pID8/IG5ldyBTZXQoKTtcbiAgY29uc3QgaTE4bk5vZGVzID0gKGh5ZHJhdGlvbkluZm8uaTE4bk5vZGVzID8/PSBuZXcgTWFwPG51bWJlciwgUk5vZGUgfCBudWxsPigpKTtcbiAgY29uc3QgY2FzZVF1ZXVlID0gaHlkcmF0aW9uSW5mby5kYXRhW0kxOE5fREFUQV0/LltpbmRleCAtIEhFQURFUl9PRkZTRVRdID8/IFtdO1xuICBjb25zdCBkZWh5ZHJhdGVkSWN1RGF0YSA9IChoeWRyYXRpb25JbmZvLmRlaHlkcmF0ZWRJY3VEYXRhID8/PSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICBEZWh5ZHJhdGVkSWN1RGF0YVxuICA+KCkpO1xuXG4gIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgIHtoeWRyYXRpb25JbmZvLCBsVmlldywgaTE4bk5vZGVzLCBkaXNjb25uZWN0ZWROb2RlcywgY2FzZVF1ZXVlLCBkZWh5ZHJhdGVkSWN1RGF0YX0sXG4gICAge2N1cnJlbnROb2RlLCBpc0Nvbm5lY3RlZDogdHJ1ZX0sXG4gICAgdEkxOG4uYXN0LFxuICApO1xuXG4gIC8vIE5vZGVzIGZyb20gaW5hY3RpdmUgSUNVIGNhc2VzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRpc2Nvbm5lY3RlZC4gV2UgdHJhY2sgdGhlbSBhYm92ZVxuICAvLyBiZWNhdXNlIHRoZXkgYXJlbid0IChhbmQgc2hvdWxkbid0IGJlKSBzZXJpYWxpemVkLiBTaW5jZSB3ZSBtYXkgbXV0YXRlIG9yIGNyZWF0ZSBhXG4gIC8vIG5ldyBzZXQsIHdlIG5lZWQgdG8gYmUgc3VyZSB0byB3cml0ZSB0aGUgZXhwZWN0ZWQgdmFsdWUgYmFjayB0byB0aGUgRGVoeWRyYXRlZFZpZXcuXG4gIGh5ZHJhdGlvbkluZm8uZGlzY29ubmVjdGVkTm9kZXMgPSBkaXNjb25uZWN0ZWROb2Rlcy5zaXplID09PSAwID8gbnVsbCA6IGRpc2Nvbm5lY3RlZE5vZGVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShcbiAgY29udGV4dDogSTE4bkh5ZHJhdGlvbkNvbnRleHQsXG4gIHN0YXRlOiBJMThuSHlkcmF0aW9uU3RhdGUsXG4gIG5vZGVPck5vZGVzOiBJMThuTm9kZSB8IEkxOG5Ob2RlW10sXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZU9yTm9kZXMpKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVPck5vZGVzKSB7XG4gICAgICAvLyBJZiB0aGUgbm9kZSBpcyBiZWluZyBwcm9qZWN0ZWQgZWxzZXdoZXJlLCB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5XG4gICAgICAvLyBicmFuY2ggdGhlIHN0YXRlIHRvIHRoYXQgbG9jYXRpb24gdG8gY29udGludWUgaHlkcmF0aW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjb250aW51ZSBoeWRyYXRpb24gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0cnlMb2NhdGVSTm9kZUJ5UGF0aChcbiAgICAgICAgY29udGV4dC5oeWRyYXRpb25JbmZvLFxuICAgICAgICBjb250ZXh0LmxWaWV3LFxuICAgICAgICBub2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXh0U3RhdGUgPSB0YXJnZXROb2RlID8gZm9ya0h5ZHJhdGlvblN0YXRlKHN0YXRlLCB0YXJnZXROb2RlIGFzIE5vZGUpIDogc3RhdGU7XG4gICAgICBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShjb250ZXh0LCBuZXh0U3RhdGUsIG5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKG5vZGVPck5vZGVzLmtpbmQpIHtcbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLlRFWFQ6IHtcbiAgICAgICAgLy8gQ2xhaW0gYSB0ZXh0IG5vZGUgZm9yIGh5ZHJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5FTEVNRU5UOiB7XG4gICAgICAgIC8vIFJlY3Vyc2UgaW50byB0aGUgY3VycmVudCBlbGVtZW50J3MgY2hpbGRyZW4uLi5cbiAgICAgICAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBmb3JrSHlkcmF0aW9uU3RhdGUoc3RhdGUsIHN0YXRlLmN1cnJlbnROb2RlPy5maXJzdENoaWxkID8/IG51bGwpLFxuICAgICAgICAgIG5vZGVPck5vZGVzLmNoaWxkcmVuLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFuZCBjbGFpbSB0aGUgcGFyZW50IGVsZW1lbnQgaXRzZWxmLlxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5QTEFDRUhPTERFUjoge1xuICAgICAgICBjb25zdCBub09mZnNldEluZGV4ID0gbm9kZU9yTm9kZXMuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICAgICAgICBjb25zdCB7aHlkcmF0aW9uSW5mb30gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBjb250YWluZXJTaXplID0gZ2V0TmdDb250YWluZXJTaXplKGh5ZHJhdGlvbkluZm8sIG5vT2Zmc2V0SW5kZXgpO1xuXG4gICAgICAgIHN3aXRjaCAobm9kZU9yTm9kZXMudHlwZSkge1xuICAgICAgICAgIGNhc2UgSTE4blBsYWNlaG9sZGVyVHlwZS5FTEVNRU5UOiB7XG4gICAgICAgICAgICAvLyBIeWRyYXRpb24gZXhwZWN0cyB0byBmaW5kIHRoZSBoZWFkIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihjb250ZXh0LCBzdGF0ZSwgbm9kZU9yTm9kZXMpO1xuXG4gICAgICAgICAgICAvLyBBIFROb2RlIGZvciB0aGUgbm9kZSBtYXkgbm90IHlldCBpZiB3ZSdyZSBoeWRyYXRpbmcgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLFxuICAgICAgICAgICAgLy8gc28gdXNlIHRoZSBzZXJpYWxpemVkIGRhdGEgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gPG5nLWNvbnRhaW5lcj4uXG4gICAgICAgICAgICBpZiAoaXNTZXJpYWxpemVkRWxlbWVudENvbnRhaW5lcihoeWRyYXRpb25JbmZvLCBub09mZnNldEluZGV4KSkge1xuICAgICAgICAgICAgICAvLyBBbiA8bmctY29udGFpbmVyPiBkb2Vzbid0IGhhdmUgYSBwaHlzaWNhbCBET00gbm9kZSwgc28gd2UgbmVlZCB0b1xuICAgICAgICAgICAgICAvLyBjb250aW51ZSBoeWRyYXRpbmcgZnJvbSBzaWJsaW5ncy5cbiAgICAgICAgICAgICAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oY29udGV4dCwgc3RhdGUsIG5vZGVPck5vZGVzLmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGFuY2hvciBlbGVtZW50LiBJdCB3aWxsIGJlIGNsYWltZWQgYnkgdGhlXG4gICAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gY29udGFpbmVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBza2lwU2libGluZ05vZGVzKHN0YXRlLCAxKTtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIG5leHROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vbi1jb250YWluZXIgZWxlbWVudHMgcmVwcmVzZW50IGFuIGFjdHVhbCBub2RlIGluIHRoZSBET00sIHNvIHdlXG4gICAgICAgICAgICAgIC8vIG5lZWQgdG8gY29udGludWUgaHlkcmF0aW9uIHdpdGggdGhlIGNoaWxkcmVuLCBhbmQgY2xhaW0gdGhlIG5vZGUuXG4gICAgICAgICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgZm9ya0h5ZHJhdGlvblN0YXRlKHN0YXRlLCBzdGF0ZS5jdXJyZW50Tm9kZT8uZmlyc3RDaGlsZCA/PyBudWxsKSxcbiAgICAgICAgICAgICAgICBub2RlT3JOb2Rlcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIGN1cnJlbnROb2RlPy5uZXh0U2libGluZyA/PyBudWxsKTtcblxuICAgICAgICAgICAgICAvLyBFbGVtZW50cyBjYW4gYWxzbyBiZSB0aGUgYW5jaG9yIG9mIGEgdmlldyBjb250YWluZXIsIHNvIHRoZXJlIG1heVxuICAgICAgICAgICAgICAvLyBiZSBlbGVtZW50cyBhZnRlciB0aGlzIG5vZGUgdGhhdCB3ZSBuZWVkIHRvIHNraXAuXG4gICAgICAgICAgICAgIGlmIChjb250YWluZXJTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gYCsxYCBzdGFuZHMgZm9yIGFuIGFuY2hvciBub2RlIGFmdGVyIGFsbCBvZiB0aGUgdmlld3MgaW4gdGhlIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHNraXBTaWJsaW5nTm9kZXMoc3RhdGUsIGNvbnRhaW5lclNpemUgKyAxKTtcbiAgICAgICAgICAgICAgICBzZXRDdXJyZW50Tm9kZShzdGF0ZSwgbmV4dE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlIEkxOG5QbGFjZWhvbGRlclR5cGUuU1VCVEVNUExBVEU6IHtcbiAgICAgICAgICAgIG5nRGV2TW9kZSAmJlxuICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbChcbiAgICAgICAgICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIGEgY29udGFpbmVyIHNpemUgd2hpbGUgaHlkcmF0aW5nIGkxOG4gc3VidGVtcGxhdGUnLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRpb24gZXhwZWN0cyB0byBmaW5kIHRoZSBoZWFkIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgb3ZlciBhbGwgb2YgdGhlIHRlbXBsYXRlIGNoaWxkcmVuLCBhcyB3ZWxsIGFzIHRoZSBhbmNob3JcbiAgICAgICAgICAgIC8vIG5vZGUsIHNpbmNlIHRoZSB0ZW1wbGF0ZSBpdHNlbGYgd2lsbCBoYW5kbGUgdGhlbSBpbnN0ZWFkLlxuICAgICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBza2lwU2libGluZ05vZGVzKHN0YXRlLCBjb250YWluZXJTaXplISArIDEpO1xuICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIG5leHROb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuSUNVOiB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IG5vZGUgaXMgY29ubmVjdGVkLCB3ZSBuZWVkIHRvIHBvcCB0aGUgbmV4dCBjYXNlIGZyb20gdGhlXG4gICAgICAgIC8vIHF1ZXVlLCBzbyB0aGF0IHRoZSBhY3RpdmUgY2FzZSBpcyBhbHNvIGNvbnNpZGVyZWQgY29ubmVjdGVkLlxuICAgICAgICBjb25zdCBzZWxlY3RlZENhc2UgPSBzdGF0ZS5pc0Nvbm5lY3RlZCA/IGNvbnRleHQuY2FzZVF1ZXVlLnNoaWZ0KCkhIDogbnVsbDtcbiAgICAgICAgY29uc3QgY2hpbGRTdGF0ZSA9IHtjdXJyZW50Tm9kZTogbnVsbCwgaXNDb25uZWN0ZWQ6IGZhbHNlfTtcblxuICAgICAgICAvLyBXZSB0cmF2ZXJzZSB0aHJvdWdoIGVhY2ggY2FzZSwgZXZlbiBpZiBpdCdzIG5vdCBhY3RpdmUsXG4gICAgICAgIC8vIHNvIHRoYXQgd2UgY29ycmVjdGx5IHBvcHVsYXRlIGRpc2Nvbm5lY3RlZCBub2Rlcy5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlT3JOb2Rlcy5jYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGkgPT09IHNlbGVjdGVkQ2FzZSA/IHN0YXRlIDogY2hpbGRTdGF0ZSxcbiAgICAgICAgICAgIG5vZGVPck5vZGVzLmNhc2VzW2ldLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRDYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSUNVcyByZXByZXNlbnQgYSBicmFuY2hpbmcgc3RhdGUsIGFuZCB0aGUgc2VsZWN0ZWQgY2FzZSBjb3VsZCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB0aGFuIHdoYXQgaXQgd2FzIG9uIHRoZSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNsZWFuXG4gICAgICAgICAgLy8gdXAgdGhlIG5vZGVzIGZyb20gdGhlIG9yaWdpbmFsIGNhc2UuIFRvIGRvIHRoYXQsIHdlIHN0b3JlIHRoZSBzZWxlY3RlZCBjYXNlLlxuICAgICAgICAgIGNvbnRleHQuZGVoeWRyYXRlZEljdURhdGEuc2V0KG5vZGVPck5vZGVzLmluZGV4LCB7Y2FzZTogc2VsZWN0ZWRDYXNlLCBub2RlOiBub2RlT3JOb2Rlc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSHlkcmF0aW9uIGV4cGVjdHMgdG8gZmluZCB0aGUgSUNVIGFuY2hvciBlbGVtZW50LlxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5sZXQgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsOiB0eXBlb2YgY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGwgPSAoKSA9PiB7XG4gIC8vIG5vb3AgdW5sZXNzIGBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbGAgaXMgaW52b2tlZFxufTtcblxuLyoqXG4gKiBNYXJrIHRoZSBjYXNlIGZvciB0aGUgSUNVIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSB2aWV3IGFzIGNsYWltZWQsXG4gKiBhbGxvd2luZyBpdHMgbm9kZXMgdG8gYmUgaHlkcmF0ZWQgYW5kIG5vdCBjbGVhbmVkIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZShsVmlldzogTFZpZXcsIGljdUluZGV4OiBudW1iZXIsIGNhc2VJbmRleDogbnVtYmVyKSB7XG4gIF9jbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbChsVmlldywgaWN1SW5kZXgsIGNhc2VJbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbCgpIHtcbiAgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsID0gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGw7XG59XG5cbmZ1bmN0aW9uIGNsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsKGxWaWV3OiBMVmlldywgaWN1SW5kZXg6IG51bWJlciwgY2FzZUluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZGVoeWRyYXRlZEljdURhdGFNYXAgPSBsVmlld1tIWURSQVRJT05dPy5kZWh5ZHJhdGVkSWN1RGF0YTtcbiAgaWYgKGRlaHlkcmF0ZWRJY3VEYXRhTWFwKSB7XG4gICAgY29uc3QgZGVoeWRyYXRlZEljdURhdGEgPSBkZWh5ZHJhdGVkSWN1RGF0YU1hcC5nZXQoaWN1SW5kZXgpO1xuICAgIGlmIChkZWh5ZHJhdGVkSWN1RGF0YT8uY2FzZSA9PT0gY2FzZUluZGV4KSB7XG4gICAgICAvLyBJZiB0aGUgY2FzZSB3ZSdyZSBhdHRlbXB0aW5nIHRvIGNsYWltIG1hdGNoZXMgdGhlIGRlaHlkcmF0ZWQgb25lLFxuICAgICAgLy8gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCB0byBtYXJrIGl0IGFzIFwiY2xhaW1lZC5cIlxuICAgICAgZGVoeWRyYXRlZEljdURhdGFNYXAuZGVsZXRlKGljdUluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBhbGwgaTE4biBoeWRyYXRpb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZpZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwSTE4bkh5ZHJhdGlvbkRhdGEobFZpZXc6IExWaWV3KSB7XG4gIGNvbnN0IGh5ZHJhdGlvbkluZm8gPSBsVmlld1tIWURSQVRJT05dO1xuICBpZiAoaHlkcmF0aW9uSW5mbykge1xuICAgIGNvbnN0IHtpMThuTm9kZXMsIGRlaHlkcmF0ZWRJY3VEYXRhOiBkZWh5ZHJhdGVkSWN1RGF0YU1hcH0gPSBoeWRyYXRpb25JbmZvO1xuICAgIGlmIChpMThuTm9kZXMgJiYgZGVoeWRyYXRlZEljdURhdGFNYXApIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgICAgZm9yIChjb25zdCBkZWh5ZHJhdGVkSWN1RGF0YSBvZiBkZWh5ZHJhdGVkSWN1RGF0YU1hcC52YWx1ZXMoKSkge1xuICAgICAgICBjbGVhbnVwRGVoeWRyYXRlZEljdURhdGEocmVuZGVyZXIsIGkxOG5Ob2RlcywgZGVoeWRyYXRlZEljdURhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGh5ZHJhdGlvbkluZm8uaTE4bk5vZGVzID0gdW5kZWZpbmVkO1xuICAgIGh5ZHJhdGlvbkluZm8uZGVoeWRyYXRlZEljdURhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW51cERlaHlkcmF0ZWRJY3VEYXRhKFxuICByZW5kZXJlcjogUmVuZGVyZXIsXG4gIGkxOG5Ob2RlczogTWFwPG51bWJlciwgUk5vZGUgfCBudWxsPixcbiAgZGVoeWRyYXRlZEljdURhdGE6IERlaHlkcmF0ZWRJY3VEYXRhLFxuKSB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkZWh5ZHJhdGVkSWN1RGF0YS5ub2RlLmNhc2VzW2RlaHlkcmF0ZWRJY3VEYXRhLmNhc2VdKSB7XG4gICAgY29uc3Qgck5vZGUgPSBpMThuTm9kZXMuZ2V0KG5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTtcbiAgICBpZiAock5vZGUpIHtcbiAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
461
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pMThuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBRXJGLE9BQU8sRUFBQyxZQUFZLEVBQW1CLE1BQU0sNEJBQTRCLENBQUM7QUFHMUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxTQUFTLEVBQVMsUUFBUSxFQUFTLEtBQUssRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ25HLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsYUFBYSxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzdELE9BQU8sRUFBb0MsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsNEJBQTRCLEVBQzVCLGtDQUFrQyxHQUNuQyxNQUFNLFNBQVMsQ0FBQztBQUVqQixJQUFJLDhCQUE4QixHQUFHLEtBQUssQ0FBQztBQUUzQyxJQUFJLGlDQUFpQyxHQUE0QyxHQUFHLEVBQUU7SUFDcEYsbUVBQW1FO0FBQ3JFLENBQUMsQ0FBQztBQUVG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aUIsRUFBRSxvQkFBb0IsRUFBQyxHQUFHLGFBQWEsQ0FBQztRQUMzRSxJQUFJLFNBQVMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxLQUFLLE1BQU0saUJBQWlCLElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDOUQsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDO1FBRUQsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDcEMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQy9CLFFBQWtCLEVBQ2xCLFNBQW9DLEVBQ3BDLGlCQUFvQztJQUVwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDeEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7aW5qZWN0LCBJbmplY3Rvcn0gZnJvbSAnLi4vZGknO1xuaW1wb3J0IHtpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2V9IGZyb20gJy4uL3JlbmRlcjMvaTE4bi9pMThuX3V0aWwnO1xuaW1wb3J0IHtjcmVhdGVJY3VJdGVyYXRvcn0gZnJvbSAnLi4vcmVuZGVyMy9pbnN0cnVjdGlvbnMvaTE4bl9pY3VfY29udGFpbmVyX3Zpc2l0b3InO1xuaW1wb3J0IHtJMThuTm9kZSwgSTE4bk5vZGVLaW5kLCBJMThuUGxhY2Vob2xkZXJUeXBlLCBUSTE4biwgVEljdX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL2kxOG4nO1xuaW1wb3J0IHtpc1ROb2RlU2hhcGUsIFROb2RlLCBUTm9kZVR5cGV9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB0eXBlIHtSZW5kZXJlcn0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyJztcbmltcG9ydCB0eXBlIHtSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5pbXBvcnQge0hFQURFUl9PRkZTRVQsIEhZRFJBVElPTiwgTFZpZXcsIFJFTkRFUkVSLCBUVmlldywgVFZJRVd9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy92aWV3JztcbmltcG9ydCB7Z2V0Rmlyc3ROYXRpdmVOb2RlLCBuYXRpdmVSZW1vdmVOb2RlfSBmcm9tICcuLi9yZW5kZXIzL25vZGVfbWFuaXB1bGF0aW9uJztcbmltcG9ydCB7dW53cmFwUk5vZGV9IGZyb20gJy4uL3JlbmRlcjMvdXRpbC92aWV3X3V0aWxzJztcbmltcG9ydCB7YXNzZXJ0RGVmaW5lZCwgYXNzZXJ0Tm90RXF1YWx9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge0h5ZHJhdGlvbkNvbnRleHR9IGZyb20gJy4vYW5ub3RhdGUnO1xuaW1wb3J0IHtEZWh5ZHJhdGVkSWN1RGF0YSwgRGVoeWRyYXRlZFZpZXcsIEkxOE5fREFUQX0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7aXNEaXNjb25uZWN0ZWRSTm9kZSwgbG9jYXRlTmV4dFJOb2RlLCB0cnlMb2NhdGVSTm9kZUJ5UGF0aH0gZnJvbSAnLi9ub2RlX2xvb2t1cF91dGlscyc7XG5pbXBvcnQge0lTX0kxOE5fSFlEUkFUSU9OX0VOQUJMRUR9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7XG4gIGdldE5nQ29udGFpbmVyU2l6ZSxcbiAgaW5pdERpc2Nvbm5lY3RlZE5vZGVzLFxuICBpc1NlcmlhbGl6ZWRFbGVtZW50Q29udGFpbmVyLFxuICBwcm9jZXNzVGV4dE5vZGVCZWZvcmVTZXJpYWxpemF0aW9uLFxufSBmcm9tICcuL3V0aWxzJztcblxubGV0IF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCA9IGZhbHNlO1xuXG5sZXQgX3ByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsOiB0eXBlb2YgcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwgPSAoKSA9PiB7XG4gIC8vIG5vb3AgdW5sZXNzIGBlbmFibGVQcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbGAgaXMgaW52b2tlZC5cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gIF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCA9IGVuYWJsZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZDtcbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBhbiBpMThuIGJsb2NrIGFuZCBpdHMgY2hpbGRyZW4sIGxvY2F0ZWQgYXQgdGhlIGdpdmVuXG4gKiB2aWV3IGFuZCBpbnN0cnVjdGlvbiBpbmRleCwgZm9yIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbFZpZXcgbFZpZXcgd2l0aCB0aGUgaTE4biBibG9ja1xuICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBpMThuIGJsb2NrIGluIHRoZSBsVmlld1xuICogQHBhcmFtIHBhcmVudFROb2RlIFROb2RlIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGkxOG4gYmxvY2tcbiAqIEBwYXJhbSBzdWJUZW1wbGF0ZUluZGV4IHN1Yi10ZW1wbGF0ZSBpbmRleCwgb3IgLTEgZm9yIHRoZSBtYWluIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uKFxuICBsVmlldzogTFZpZXcsXG4gIGluZGV4OiBudW1iZXIsXG4gIHBhcmVudFROb2RlOiBUTm9kZSB8IG51bGwsXG4gIHN1YlRlbXBsYXRlSW5kZXg6IG51bWJlcixcbik6IHZvaWQge1xuICBfcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwobFZpZXcsIGluZGV4LCBwYXJlbnRUTm9kZSwgc3ViVGVtcGxhdGVJbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbCgpIHtcbiAgX3ByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsID0gcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5IeWRyYXRpb25FbmFibGVkKGluamVjdG9yPzogSW5qZWN0b3IpIHtcbiAgaW5qZWN0b3IgPSBpbmplY3RvciA/PyBpbmplY3QoSW5qZWN0b3IpO1xuICByZXR1cm4gaW5qZWN0b3IuZ2V0KElTX0kxOE5fSFlEUkFUSU9OX0VOQUJMRUQsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0cywgaWYgbm90IGFscmVhZHkgY2FjaGVkLCBhbGwgb2YgdGhlIGluZGljZXMgaW4gdGhlXG4gKiBnaXZlbiBUVmlldyB3aGljaCBhcmUgY2hpbGRyZW4gb2YgYW4gaTE4biBibG9jay5cbiAqXG4gKiBTaW5jZSBpMThuIGJsb2NrcyBkb24ndCBpbnRyb2R1Y2UgYSBwYXJlbnQgVE5vZGUsIHRoaXMgaXMgbmVjZXNzYXJ5XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggaW5kaWNlcyBpbiBhIExWaWV3IGFyZSB0cmFuc2xhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDb21wdXRlSTE4bkNoaWxkcmVuKFxuICB0VmlldzogVFZpZXcsXG4gIGNvbnRleHQ6IEh5ZHJhdGlvbkNvbnRleHQsXG4pOiBTZXQ8bnVtYmVyPiB8IG51bGwge1xuICBsZXQgaTE4bkNoaWxkcmVuID0gY29udGV4dC5pMThuQ2hpbGRyZW4uZ2V0KHRWaWV3KTtcbiAgaWYgKGkxOG5DaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaTE4bkNoaWxkcmVuID0gY29sbGVjdEkxOG5DaGlsZHJlbih0Vmlldyk7XG4gICAgY29udGV4dC5pMThuQ2hpbGRyZW4uc2V0KHRWaWV3LCBpMThuQ2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBpMThuQ2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RJMThuQ2hpbGRyZW4odFZpZXc6IFRWaWV3KTogU2V0PG51bWJlcj4gfCBudWxsIHtcbiAgY29uc3QgY2hpbGRyZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBmdW5jdGlvbiBjb2xsZWN0STE4blZpZXdzKG5vZGU6IEkxOG5Ob2RlKSB7XG4gICAgY2hpbGRyZW4uYWRkKG5vZGUuaW5kZXgpO1xuXG4gICAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLkVMRU1FTlQ6XG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5QTEFDRUhPTERFUjoge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29sbGVjdEkxOG5WaWV3cyhjaGlsZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5JQ1U6IHtcbiAgICAgICAgZm9yIChjb25zdCBjYXNlTm9kZXMgb2Ygbm9kZS5jYXNlcykge1xuICAgICAgICAgIGZvciAoY29uc3QgY2FzZU5vZGUgb2YgY2FzZU5vZGVzKSB7XG4gICAgICAgICAgICBjb2xsZWN0STE4blZpZXdzKGNhc2VOb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVHJhdmVyc2UgdGhyb3VnaCB0aGUgQVNUIG9mIGVhY2ggaTE4biBibG9jayBpbiB0aGUgTFZpZXcsXG4gIC8vIGFuZCBjb2xsZWN0IGV2ZXJ5IGluc3RydWN0aW9uIGluZGV4LlxuICBmb3IgKGxldCBpID0gSEVBREVSX09GRlNFVDsgaSA8IHRWaWV3LmJpbmRpbmdTdGFydEluZGV4OyBpKyspIHtcbiAgICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaV0gYXMgVEkxOG4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF0STE4biB8fCAhdEkxOG4uYXN0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdEkxOG4uYXN0KSB7XG4gICAgICBjb2xsZWN0STE4blZpZXdzKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbi5zaXplID09PSAwID8gbnVsbCA6IGNoaWxkcmVuO1xufVxuXG4vKipcbiAqIFJlc3VsdGluZyBkYXRhIGZyb20gc2VyaWFsaXppbmcgYW4gaTE4biBibG9jay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkSTE4bkJsb2NrIHtcbiAgLyoqXG4gICAqIEEgcXVldWUgb2YgYWN0aXZlIElDVSBjYXNlcyBmcm9tIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsXG4gICAqIG9mIHRoZSBpMThuIEFTVC4gVGhpcyBpcyBzZXJpYWxpemVkIHRvIHRoZSBjbGllbnQgaW4gb3JkZXJcbiAgICogdG8gY29ycmVjdGx5IGFzc29jaWF0ZSBET00gbm9kZXMgd2l0aCBpMThuIG5vZGVzIGR1cmluZ1xuICAgKiBoeWRyYXRpb24uXG4gICAqL1xuICBjYXNlUXVldWU6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGluZGljZXMgaW4gdGhlIGxWaWV3IG9mIHRoZSBibG9jayBmb3Igbm9kZXNcbiAgICogdGhhdCBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIERPTS4gSW4gaTE4biwgdGhpcyBjYW5cbiAgICogaGFwcGVuIHdoZW4gdXNpbmcgY29udGVudCBwcm9qZWN0aW9uIGJ1dCBzb21lIG5vZGVzIGFyZVxuICAgKiBub3Qgc2VsZWN0ZWQgYnkgYW4gPG5nLWNvbnRlbnQgLz4uXG4gICAqL1xuICBkaXNjb25uZWN0ZWROb2RlczogU2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGluZGljZXMgaW4gdGhlIGxWaWV3IG9mIHRoZSBibG9jayBmb3Igbm9kZXNcbiAgICogY29uc2lkZXJlZCBcImRpc2pvaW50XCIsIGluZGljYXRpbmcgdGhhdCB3ZSBuZWVkIHRvIHNlcmlhbGl6ZVxuICAgKiBhIHBhdGggdG8gdGhlIG5vZGUgaW4gb3JkZXIgdG8gaHlkcmF0ZSBpdC5cbiAgICpcbiAgICogQSBub2RlIGlzIGNvbnNpZGVyZWQgZGlzam9pbnQgd2hlbiBpdHMgUk5vZGUgZG9lcyBub3RcbiAgICogZGlyZWN0bHkgZm9sbG93IHRoZSBSTm9kZSBvZiB0aGUgcHJldmlvdXMgaTE4biBub2RlLCBmb3JcbiAgICogZXhhbXBsZSwgYmVjYXVzZSBvZiBjb250ZW50IHByb2plY3Rpb24uXG4gICAqL1xuICBkaXNqb2ludE5vZGVzOiBTZXQ8bnVtYmVyPjtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBzZXJpYWxpemUgaTE4biBkYXRhIGZvciBhbiBpMThuIGJsb2NrLCBsb2NhdGVkIGF0XG4gKiB0aGUgZ2l2ZW4gdmlldyBhbmQgaW5zdHJ1Y3Rpb24gaW5kZXguXG4gKlxuICogQHBhcmFtIGxWaWV3IGxWaWV3IHdpdGggdGhlIGkxOG4gYmxvY2tcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgaTE4biBibG9jayBpbiB0aGUgbFZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBoeWRyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgdGhlIGkxOG4gZGF0YSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyByZWxldmFudCBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZXJpYWxpemVJMThuQmxvY2soXG4gIGxWaWV3OiBMVmlldyxcbiAgaW5kZXg6IG51bWJlcixcbiAgY29udGV4dDogSHlkcmF0aW9uQ29udGV4dCxcbik6IFNlcmlhbGl6ZWRJMThuQmxvY2sgfCBudWxsIHtcbiAgaWYgKCFjb250ZXh0LmlzSTE4bkh5ZHJhdGlvbkVuYWJsZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaW5kZXhdIGFzIFRJMThuIHwgdW5kZWZpbmVkO1xuICBpZiAoIXRJMThuIHx8ICF0STE4bi5hc3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRJMThuQmxvY2s6IFNlcmlhbGl6ZWRJMThuQmxvY2sgPSB7XG4gICAgY2FzZVF1ZXVlOiBbXSxcbiAgICBkaXNjb25uZWN0ZWROb2RlczogbmV3IFNldCgpLFxuICAgIGRpc2pvaW50Tm9kZXM6IG5ldyBTZXQoKSxcbiAgfTtcbiAgc2VyaWFsaXplSTE4bkJsb2NrKGxWaWV3LCBzZXJpYWxpemVkSTE4bkJsb2NrLCBjb250ZXh0LCB0STE4bi5hc3QpO1xuXG4gIHJldHVybiBzZXJpYWxpemVkSTE4bkJsb2NrLmNhc2VRdWV1ZS5sZW5ndGggPT09IDAgJiZcbiAgICBzZXJpYWxpemVkSTE4bkJsb2NrLmRpc2Nvbm5lY3RlZE5vZGVzLnNpemUgPT09IDAgJiZcbiAgICBzZXJpYWxpemVkSTE4bkJsb2NrLmRpc2pvaW50Tm9kZXMuc2l6ZSA9PT0gMFxuICAgID8gbnVsbFxuICAgIDogc2VyaWFsaXplZEkxOG5CbG9jaztcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplSTE4bkJsb2NrKFxuICBsVmlldzogTFZpZXcsXG4gIHNlcmlhbGl6ZWRJMThuQmxvY2s6IFNlcmlhbGl6ZWRJMThuQmxvY2ssXG4gIGNvbnRleHQ6IEh5ZHJhdGlvbkNvbnRleHQsXG4gIG5vZGVzOiBJMThuTm9kZVtdLFxuKTogTm9kZSB8IG51bGwge1xuICBsZXQgcHJldlJOb2RlID0gbnVsbDtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgY29uc3QgbmV4dFJOb2RlID0gc2VyaWFsaXplSTE4bk5vZGUobFZpZXcsIHNlcmlhbGl6ZWRJMThuQmxvY2ssIGNvbnRleHQsIG5vZGUpO1xuICAgIGlmIChuZXh0Uk5vZGUpIHtcbiAgICAgIGlmIChpc0Rpc2pvaW50Tm9kZShwcmV2Uk5vZGUsIG5leHRSTm9kZSkpIHtcbiAgICAgICAgc2VyaWFsaXplZEkxOG5CbG9jay5kaXNqb2ludE5vZGVzLmFkZChub2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCk7XG4gICAgICB9XG4gICAgICBwcmV2Uk5vZGUgPSBuZXh0Uk5vZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmV2Uk5vZGU7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBub2RlcyBhcmUgXCJkaXNqb2ludFwiLlxuICpcbiAqIFRoZSBpMThuIGh5ZHJhdGlvbiBwcm9jZXNzIHdhbGtzIHRocm91Z2ggdGhlIERPTSBhbmQgaTE4biBub2Rlc1xuICogYXQgdGhlIHNhbWUgdGltZS4gSXQgZXhwZWN0cyB0aGUgc2libGluZyBET00gbm9kZSBvZiB0aGUgcHJldmlvdXNcbiAqIGkxOG4gbm9kZSB0byBiZSB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgbmV4dCBpMThuIG5vZGUuXG4gKlxuICogSW4gY2FzZXMgb2YgY29udGVudCBwcm9qZWN0aW9uLCB0aGlzIHdvbid0IGFsd2F5cyBiZSB0aGUgY2FzZS4gU29cbiAqIHdoZW4gd2UgZGV0ZWN0IHRoYXQsIHdlIG1hcmsgdGhlIG5vZGUgYXMgXCJkaXNqb2ludFwiLCBlbnN1cmluZyB0aGF0XG4gKiB3ZSB3aWxsIHNlcmlhbGl6ZSB0aGUgcGF0aCB0byB0aGUgbm9kZS4gVGhpcyB3YXksIHdoZW4gd2UgaHlkcmF0ZSB0aGVcbiAqIGkxOG4gbm9kZSwgd2Ugd2lsbCBiZSBhYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGxhY2UgdG8gc3RhcnQuXG4gKi9cbmZ1bmN0aW9uIGlzRGlzam9pbnROb2RlKHByZXZOb2RlOiBOb2RlIHwgbnVsbCwgbmV4dE5vZGU6IE5vZGUpIHtcbiAgcmV0dXJuIHByZXZOb2RlICYmIHByZXZOb2RlLm5leHRTaWJsaW5nICE9PSBuZXh0Tm9kZTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSBnaXZlbiBpMThuIG5vZGUgZm9yIHNlcmlhbGl6YXRpb24uXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBSTm9kZSBmb3IgdGhlIGkxOG4gbm9kZSB0byBiZWdpbiBoeWRyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUkxOG5Ob2RlKFxuICBsVmlldzogTFZpZXcsXG4gIHNlcmlhbGl6ZWRJMThuQmxvY2s6IFNlcmlhbGl6ZWRJMThuQmxvY2ssXG4gIGNvbnRleHQ6IEh5ZHJhdGlvbkNvbnRleHQsXG4gIG5vZGU6IEkxOG5Ob2RlLFxuKTogTm9kZSB8IG51bGwge1xuICBjb25zdCBtYXliZVJOb2RlID0gdW53cmFwUk5vZGUobFZpZXdbbm9kZS5pbmRleF0hKTtcbiAgaWYgKCFtYXliZVJOb2RlIHx8IGlzRGlzY29ubmVjdGVkUk5vZGUobWF5YmVSTm9kZSkpIHtcbiAgICBzZXJpYWxpemVkSTE4bkJsb2NrLmRpc2Nvbm5lY3RlZE5vZGVzLmFkZChub2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByTm9kZSA9IG1heWJlUk5vZGUgYXMgTm9kZTtcbiAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICBjYXNlIEkxOG5Ob2RlS2luZC5URVhUOiB7XG4gICAgICBwcm9jZXNzVGV4dE5vZGVCZWZvcmVTZXJpYWxpemF0aW9uKGNvbnRleHQsIHJOb2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgSTE4bk5vZGVLaW5kLkVMRU1FTlQ6XG4gICAgY2FzZSBJMThuTm9kZUtpbmQuUExBQ0VIT0xERVI6IHtcbiAgICAgIHNlcmlhbGl6ZUkxOG5CbG9jayhsVmlldywgc2VyaWFsaXplZEkxOG5CbG9jaywgY29udGV4dCwgbm9kZS5jaGlsZHJlbik7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIEkxOG5Ob2RlS2luZC5JQ1U6IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDYXNlID0gbFZpZXdbbm9kZS5jdXJyZW50Q2FzZUxWaWV3SW5kZXhdIGFzIG51bWJlciB8IG51bGw7XG4gICAgICBpZiAoY3VycmVudENhc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBpMThuIHVzZXMgYSBuZWdhdGl2ZSB2YWx1ZSB0byBzaWduYWwgYSBjaGFuZ2UgdG8gYSBuZXcgY2FzZSwgc28gd2VcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlcnQgaXQgdG8gZ2V0IHRoZSBwcm9wZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IGNhc2VJZHggPSBjdXJyZW50Q2FzZSA8IDAgPyB+Y3VycmVudENhc2UgOiBjdXJyZW50Q2FzZTtcbiAgICAgICAgc2VyaWFsaXplZEkxOG5CbG9jay5jYXNlUXVldWUucHVzaChjYXNlSWR4KTtcbiAgICAgICAgc2VyaWFsaXplSTE4bkJsb2NrKGxWaWV3LCBzZXJpYWxpemVkSTE4bkJsb2NrLCBjb250ZXh0LCBub2RlLmNhc2VzW2Nhc2VJZHhdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRGaXJzdE5hdGl2ZU5vZGVGb3JJMThuTm9kZShsVmlldywgbm9kZSkgYXMgTm9kZSB8IG51bGw7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgZmlyc3QgbmF0aXZlIG5vZGUgdG8gYmVnaW4gaHlkcmF0aW5nXG4gKiB0aGUgZ2l2ZW4gaTE4biBub2RlLlxuICovXG5mdW5jdGlvbiBnZXRGaXJzdE5hdGl2ZU5vZGVGb3JJMThuTm9kZShsVmlldzogTFZpZXcsIG5vZGU6IEkxOG5Ob2RlKSB7XG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBjb25zdCBtYXliZVROb2RlID0gdFZpZXcuZGF0YVtub2RlLmluZGV4XTtcblxuICBpZiAoaXNUTm9kZVNoYXBlKG1heWJlVE5vZGUpKSB7XG4gICAgLy8gSWYgdGhlIG5vZGUgaXMgYmFja2VkIGJ5IGFuIGFjdHVhbCBUTm9kZSwgd2UgY2FuIHNpbXBseSBkZWxlZ2F0ZS5cbiAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCBtYXliZVROb2RlKTtcbiAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT09IEkxOG5Ob2RlS2luZC5JQ1UpIHtcbiAgICAvLyBBIG5lc3RlZCBJQ1UgY29udGFpbmVyIHdvbid0IGhhdmUgYW4gYWN0dWFsIFROb2RlLiBJbiB0aGF0IGNhc2UsIHdlIGNhbiB1c2VcbiAgICAvLyBhbiBpdGVyYXRvciB0byBmaW5kIHRoZSBmaXJzdCBjaGlsZC5cbiAgICBjb25zdCBpY3VJdGVyYXRvciA9IGNyZWF0ZUljdUl0ZXJhdG9yKG1heWJlVE5vZGUgYXMgVEljdSwgbFZpZXcpO1xuICAgIGxldCByTm9kZTogUk5vZGUgfCBudWxsID0gaWN1SXRlcmF0b3IoKTtcblxuICAgIC8vIElmIHRoZSBJQ1UgY29udGFpbmVyIGhhcyBubyBub2RlcywgdGhlbiB3ZSB1c2UgdGhlIElDVSBhbmNob3IgYXMgdGhlIG5vZGUuXG4gICAgcmV0dXJuIHJOb2RlID8/IHVud3JhcFJOb2RlKGxWaWV3W25vZGUuaW5kZXhdKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIHRoZSBub2RlIGlzIGEgdGV4dCBvciB0cml2aWFsIGVsZW1lbnQgaW4gYW4gSUNVIGNvbnRhaW5lcixcbiAgICAvLyBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBSTm9kZSBkaXJlY3RseS5cbiAgICByZXR1cm4gdW53cmFwUk5vZGUobFZpZXdbbm9kZS5pbmRleF0pID8/IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgc2hhcmVkIGRhdGEgYXZhaWxhYmxlIGR1cmluZyB0aGUgaHlkcmF0aW9uIHByb2Nlc3MuXG4gKi9cbmludGVyZmFjZSBJMThuSHlkcmF0aW9uQ29udGV4dCB7XG4gIGh5ZHJhdGlvbkluZm86IERlaHlkcmF0ZWRWaWV3O1xuICBsVmlldzogTFZpZXc7XG4gIGkxOG5Ob2RlczogTWFwPG51bWJlciwgUk5vZGUgfCBudWxsPjtcbiAgZGlzY29ubmVjdGVkTm9kZXM6IFNldDxudW1iZXI+O1xuICBjYXNlUXVldWU6IG51bWJlcltdO1xuICBkZWh5ZHJhdGVkSWN1RGF0YTogTWFwPG51bWJlciwgRGVoeWRyYXRlZEljdURhdGE+O1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBjdXJyZW50IGh5ZHJhdGlvbiBzdGF0ZS5cbiAqL1xuaW50ZXJmYWNlIEkxOG5IeWRyYXRpb25TdGF0ZSB7XG4gIC8vIFRoZSBjdXJyZW50IG5vZGVcbiAgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0cmVlIHNob3VsZCBiZSBjb25uZWN0ZWQuXG4gICAqXG4gICAqIER1cmluZyBoeWRyYXRpb24sIGl0IGNhbiBoYXBwZW4gdGhhdCB3ZSBleHBlY3QgdG8gaGF2ZSBhXG4gICAqIGN1cnJlbnQgUk5vZGUsIGJ1dCB3ZSBkb24ndC4gSW4gc3VjaCBjYXNlcywgd2Ugc3RpbGwgbmVlZFxuICAgKiB0byBwcm9wYWdhdGUgdGhlIGV4cGVjdGF0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIExWaWV3cyxcbiAgICogc28gdGhhdCB0aGUgcHJvcGVyIGRvd25zdHJlYW0gZXJyb3IgaGFuZGxpbmcgY2FuIHByb3ZpZGVcbiAgICogdGhlIGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnROb2RlKHN0YXRlOiBJMThuSHlkcmF0aW9uU3RhdGUsIG5vZGU6IE5vZGUgfCBudWxsKSB7XG4gIHN0YXRlLmN1cnJlbnROb2RlID0gbm9kZTtcbn1cblxuLyoqXG4gKiBNYXJrcyB0aGUgY3VycmVudCBSTm9kZSBhcyB0aGUgaHlkcmF0aW9uIHJvb3QgZm9yIHRoZSBnaXZlblxuICogQVNUIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKFxuICBjb250ZXh0OiBJMThuSHlkcmF0aW9uQ29udGV4dCxcbiAgc3RhdGU6IEkxOG5IeWRyYXRpb25TdGF0ZSxcbiAgYXN0Tm9kZTogSTE4bk5vZGUsXG4pIHtcbiAgY29uc3Qgbm9PZmZzZXRJbmRleCA9IGFzdE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICBjb25zdCB7ZGlzY29ubmVjdGVkTm9kZXN9ID0gY29udGV4dDtcbiAgY29uc3QgY3VycmVudE5vZGUgPSBzdGF0ZS5jdXJyZW50Tm9kZTtcblxuICBpZiAoc3RhdGUuaXNDb25uZWN0ZWQpIHtcbiAgICBjb250ZXh0LmkxOG5Ob2Rlcy5zZXQobm9PZmZzZXRJbmRleCwgY3VycmVudE5vZGUpO1xuXG4gICAgLy8gV2UgZXhwZWN0IHRoZSBub2RlIHRvIGJlIGNvbm5lY3RlZCwgc28gZW5zdXJlIHRoYXQgaXRcbiAgICAvLyBpcyBub3QgaW4gdGhlIHNldCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGZvdW5kIGl0LFxuICAgIC8vIHNvIHRoYXQgdGhlIGRvd25zdHJlYW0gZXJyb3IgaGFuZGxpbmcgY2FuIHByb3ZpZGUgdGhlXG4gICAgLy8gcHJvcGVyIGNvbnRleHQuXG4gICAgZGlzY29ubmVjdGVkTm9kZXMuZGVsZXRlKG5vT2Zmc2V0SW5kZXgpO1xuICB9IGVsc2Uge1xuICAgIGRpc2Nvbm5lY3RlZE5vZGVzLmFkZChub09mZnNldEluZGV4KTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50Tm9kZTtcbn1cblxuLyoqXG4gKiBTa2lwIG92ZXIgc29tZSBzaWJsaW5nIG5vZGVzIGR1cmluZyBoeWRyYXRpb24uXG4gKlxuICogTm90ZTogd2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBgc2libGluZ0FmdGVyYCBhcyBpdCdzIGV4cGVjdGVkIHRoYXRcbiAqIHNvbWV0aW1lcyB3ZSBtaWdodCBlbmNvdW50ZXIgbnVsbCBub2Rlcy4gSW4gdGhvc2UgY2FzZXMsIHdlIHdhbnQgdG9cbiAqIGRlZmVyIHRvIGRvd25zdHJlYW0gZXJyb3IgaGFuZGxpbmcgdG8gcHJvdmlkZSBwcm9wZXIgY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gc2tpcFNpYmxpbmdOb2RlcyhzdGF0ZTogSTE4bkh5ZHJhdGlvblN0YXRlLCBza2lwOiBudW1iZXIpIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gc3RhdGUuY3VycmVudE5vZGU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpcDsgaSsrKSB7XG4gICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGU/Lm5leHRTaWJsaW5nID8/IG51bGw7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnROb2RlO1xufVxuXG4vKipcbiAqIEZvcmsgdGhlIGdpdmVuIHN0YXRlIGludG8gYSBuZXcgc3RhdGUgZm9yIGh5ZHJhdGluZyBjaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gZm9ya0h5ZHJhdGlvblN0YXRlKHN0YXRlOiBJMThuSHlkcmF0aW9uU3RhdGUsIG5leHROb2RlOiBOb2RlIHwgbnVsbCkge1xuICByZXR1cm4ge2N1cnJlbnROb2RlOiBuZXh0Tm9kZSwgaXNDb25uZWN0ZWQ6IHN0YXRlLmlzQ29ubmVjdGVkfTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwoXG4gIGxWaWV3OiBMVmlldyxcbiAgaW5kZXg6IG51bWJlcixcbiAgcGFyZW50VE5vZGU6IFROb2RlIHwgbnVsbCxcbiAgc3ViVGVtcGxhdGVJbmRleDogbnVtYmVyLFxuKSB7XG4gIGlmICghaXNJMThuSHlkcmF0aW9uU3VwcG9ydEVuYWJsZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh5ZHJhdGlvbkluZm8gPSBsVmlld1tIWURSQVRJT05dO1xuICBpZiAoIWh5ZHJhdGlvbkluZm8pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgY29uc3QgdEkxOG4gPSB0Vmlldy5kYXRhW2luZGV4XSBhcyBUSTE4bjtcbiAgbmdEZXZNb2RlICYmXG4gICAgYXNzZXJ0RGVmaW5lZCh0STE4biwgJ0V4cGVjdGVkIGkxOG4gZGF0YSB0byBiZSBwcmVzZW50IGluIGEgZ2l2ZW4gVFZpZXcgc2xvdCBkdXJpbmcgaHlkcmF0aW9uJyk7XG5cbiAgZnVuY3Rpb24gZmluZEh5ZHJhdGlvblJvb3QoKSB7XG4gICAgaWYgKGlzUm9vdFRlbXBsYXRlTWVzc2FnZShzdWJUZW1wbGF0ZUluZGV4KSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiBhbiBpMThuIGJsb2NrLiBJbiB0aGlzIGNhc2UsIG91ciBoeWRyYXRpb24gcm9vdCB3aWxsXG4gICAgICAvLyBkZXBlbmQgb24gd2hlcmUgb3VyIHBhcmVudCBUTm9kZSAoaS5lLiB0aGUgYmxvY2sgd2l0aCBpMThuIGFwcGxpZWQpIGlzXG4gICAgICAvLyBpbiB0aGUgRE9NLlxuICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocGFyZW50VE5vZGUsICdFeHBlY3RlZCBwYXJlbnQgVE5vZGUgd2hpbGUgaHlkcmF0aW5nIGkxOG4gcm9vdCcpO1xuICAgICAgY29uc3Qgcm9vdE5vZGUgPSBsb2NhdGVOZXh0Uk5vZGUoaHlkcmF0aW9uSW5mbyEsIHRWaWV3LCBsVmlldywgcGFyZW50VE5vZGUhKSBhcyBOb2RlO1xuXG4gICAgICAvLyBJZiB0aGlzIGkxOG4gYmxvY2sgaXMgYXR0YWNoZWQgdG8gYW4gPG5nLWNvbnRhaW5lcj4sIHRoZW4gd2Ugd2FudCB0byBiZWdpblxuICAgICAgLy8gaHlkcmF0aW5nIGRpcmVjdGx5IHdpdGggdGhlIFJOb2RlLiBPdGhlcndpc2UsIGZvciBhIFROb2RlIHdpdGggYSBwaHlzaWNhbCBET01cbiAgICAgIC8vIGVsZW1lbnQsIHdlIHdhbnQgdG8gcmVjdXJzZSBpbnRvIHRoZSBmaXJzdCBjaGlsZCBhbmQgYmVnaW4gdGhlcmUuXG4gICAgICByZXR1cm4gcGFyZW50VE5vZGUhLnR5cGUgJiBUTm9kZVR5cGUuRWxlbWVudENvbnRhaW5lciA/IHJvb3ROb2RlIDogcm9vdE5vZGUuZmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGEgbmVzdGVkIHRlbXBsYXRlIGluIGFuIGkxOG4gYmxvY2suIEluIHRoaXMgY2FzZSwgdGhlIGVudGlyZSB2aWV3XG4gICAgLy8gaXMgdHJhbnNsYXRlZCwgYW5kIHBhcnQgb2YgYSBkZWh5ZHJhdGVkIHZpZXcgaW4gYSBjb250YWluZXIuIFRoaXMgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGNhbiBzaW1wbHkgYmVnaW4gaHlkcmF0aW9uIHdpdGggdGhlIGZpcnN0IGRlaHlkcmF0ZWQgY2hpbGQuXG4gICAgcmV0dXJuIGh5ZHJhdGlvbkluZm8/LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnROb2RlID0gZmluZEh5ZHJhdGlvblJvb3QoKTtcbiAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY3VycmVudE5vZGUsICdFeHBlY3RlZCByb290IGkxOG4gbm9kZSBkdXJpbmcgaHlkcmF0aW9uJyk7XG5cbiAgY29uc3QgZGlzY29ubmVjdGVkTm9kZXMgPSBpbml0RGlzY29ubmVjdGVkTm9kZXMoaHlkcmF0aW9uSW5mbykgPz8gbmV3IFNldCgpO1xuICBjb25zdCBpMThuTm9kZXMgPSAoaHlkcmF0aW9uSW5mby5pMThuTm9kZXMgPz89IG5ldyBNYXA8bnVtYmVyLCBSTm9kZSB8IG51bGw+KCkpO1xuICBjb25zdCBjYXNlUXVldWUgPSBoeWRyYXRpb25JbmZvLmRhdGFbSTE4Tl9EQVRBXT8uW2luZGV4IC0gSEVBREVSX09GRlNFVF0gPz8gW107XG4gIGNvbnN0IGRlaHlkcmF0ZWRJY3VEYXRhID0gKGh5ZHJhdGlvbkluZm8uZGVoeWRyYXRlZEljdURhdGEgPz89IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIERlaHlkcmF0ZWRJY3VEYXRhXG4gID4oKSk7XG5cbiAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oXG4gICAge2h5ZHJhdGlvbkluZm8sIGxWaWV3LCBpMThuTm9kZXMsIGRpc2Nvbm5lY3RlZE5vZGVzLCBjYXNlUXVldWUsIGRlaHlkcmF0ZWRJY3VEYXRhfSxcbiAgICB7Y3VycmVudE5vZGUsIGlzQ29ubmVjdGVkOiB0cnVlfSxcbiAgICB0STE4bi5hc3QsXG4gICk7XG5cbiAgLy8gTm9kZXMgZnJvbSBpbmFjdGl2ZSBJQ1UgY2FzZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGlzY29ubmVjdGVkLiBXZSB0cmFjayB0aGVtIGFib3ZlXG4gIC8vIGJlY2F1c2UgdGhleSBhcmVuJ3QgKGFuZCBzaG91bGRuJ3QgYmUpIHNlcmlhbGl6ZWQuIFNpbmNlIHdlIG1heSBtdXRhdGUgb3IgY3JlYXRlIGFcbiAgLy8gbmV3IHNldCwgd2UgbmVlZCB0byBiZSBzdXJlIHRvIHdyaXRlIHRoZSBleHBlY3RlZCB2YWx1ZSBiYWNrIHRvIHRoZSBEZWh5ZHJhdGVkVmlldy5cbiAgaHlkcmF0aW9uSW5mby5kaXNjb25uZWN0ZWROb2RlcyA9IGRpc2Nvbm5lY3RlZE5vZGVzLnNpemUgPT09IDAgPyBudWxsIDogZGlzY29ubmVjdGVkTm9kZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICBjb250ZXh0OiBJMThuSHlkcmF0aW9uQ29udGV4dCxcbiAgc3RhdGU6IEkxOG5IeWRyYXRpb25TdGF0ZSxcbiAgbm9kZU9yTm9kZXM6IEkxOG5Ob2RlIHwgSTE4bk5vZGVbXSxcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlT3JOb2RlcykpIHtcbiAgICBsZXQgbmV4dFN0YXRlID0gc3RhdGU7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVPck5vZGVzKSB7XG4gICAgICAvLyBXaGVuZXZlciBhIG5vZGUgZG9lc24ndCBkaXJlY3RseSBmb2xsb3cgdGhlIHByZXZpb3VzIFJOb2RlLCBpdFxuICAgICAgLy8gaXMgZ2l2ZW4gYSBwYXRoLiBXZSBuZWVkIHRvIHJlc3VtZSBjb2xsZWN0aW5nIG5vZGVzIGZyb20gdGhhdCBsb2NhdGlvblxuICAgICAgLy8gdW50aWwgYW5kIHVubGVzcyB3ZSBmaW5kIGFub3RoZXIgZGlzam9pbnQgbm9kZS5cbiAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0cnlMb2NhdGVSTm9kZUJ5UGF0aChcbiAgICAgICAgY29udGV4dC5oeWRyYXRpb25JbmZvLFxuICAgICAgICBjb250ZXh0LmxWaWV3LFxuICAgICAgICBub2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0Tm9kZSkge1xuICAgICAgICBuZXh0U3RhdGUgPSBmb3JrSHlkcmF0aW9uU3RhdGUoc3RhdGUsIHRhcmdldE5vZGUgYXMgTm9kZSk7XG4gICAgICB9XG4gICAgICBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShjb250ZXh0LCBuZXh0U3RhdGUsIG5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY29udGV4dC5kaXNjb25uZWN0ZWROb2Rlcy5oYXMobm9kZU9yTm9kZXMuaW5kZXggLSBIRUFERVJfT0ZGU0VUKSkge1xuICAgICAgLy8gaTE4biBub2RlcyBjYW4gYmUgY29uc2lkZXJlZCBkaXNjb25uZWN0ZWQgaWYgZS5nLiB0aGV5IHdlcmUgcHJvamVjdGVkLlxuICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0byBza2lwIG92ZXIgdGhlbS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5vZGVPck5vZGVzLmtpbmQpIHtcbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLlRFWFQ6IHtcbiAgICAgICAgLy8gQ2xhaW0gYSB0ZXh0IG5vZGUgZm9yIGh5ZHJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5FTEVNRU5UOiB7XG4gICAgICAgIC8vIFJlY3Vyc2UgaW50byB0aGUgY3VycmVudCBlbGVtZW50J3MgY2hpbGRyZW4uLi5cbiAgICAgICAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBmb3JrSHlkcmF0aW9uU3RhdGUoc3RhdGUsIHN0YXRlLmN1cnJlbnROb2RlPy5maXJzdENoaWxkID8/IG51bGwpLFxuICAgICAgICAgIG5vZGVPck5vZGVzLmNoaWxkcmVuLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFuZCBjbGFpbSB0aGUgcGFyZW50IGVsZW1lbnQgaXRzZWxmLlxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5QTEFDRUhPTERFUjoge1xuICAgICAgICBjb25zdCBub09mZnNldEluZGV4ID0gbm9kZU9yTm9kZXMuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICAgICAgICBjb25zdCB7aHlkcmF0aW9uSW5mb30gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBjb250YWluZXJTaXplID0gZ2V0TmdDb250YWluZXJTaXplKGh5ZHJhdGlvbkluZm8sIG5vT2Zmc2V0SW5kZXgpO1xuXG4gICAgICAgIHN3aXRjaCAobm9kZU9yTm9kZXMudHlwZSkge1xuICAgICAgICAgIGNhc2UgSTE4blBsYWNlaG9sZGVyVHlwZS5FTEVNRU5UOiB7XG4gICAgICAgICAgICAvLyBIeWRyYXRpb24gZXhwZWN0cyB0byBmaW5kIHRoZSBoZWFkIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihjb250ZXh0LCBzdGF0ZSwgbm9kZU9yTm9kZXMpO1xuXG4gICAgICAgICAgICAvLyBBIFROb2RlIGZvciB0aGUgbm9kZSBtYXkgbm90IHlldCBpZiB3ZSdyZSBoeWRyYXRpbmcgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLFxuICAgICAgICAgICAgLy8gc28gdXNlIHRoZSBzZXJpYWxpemVkIGRhdGEgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gPG5nLWNvbnRhaW5lcj4uXG4gICAgICAgICAgICBpZiAoaXNTZXJpYWxpemVkRWxlbWVudENvbnRhaW5lcihoeWRyYXRpb25JbmZvLCBub09mZnNldEluZGV4KSkge1xuICAgICAgICAgICAgICAvLyBBbiA8bmctY29udGFpbmVyPiBkb2Vzbid0IGhhdmUgYSBwaHlzaWNhbCBET00gbm9kZSwgc28gd2UgbmVlZCB0b1xuICAgICAgICAgICAgICAvLyBjb250aW51ZSBoeWRyYXRpbmcgZnJvbSBzaWJsaW5ncy5cbiAgICAgICAgICAgICAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oY29udGV4dCwgc3RhdGUsIG5vZGVPck5vZGVzLmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGFuY2hvciBlbGVtZW50LiBJdCB3aWxsIGJlIGNsYWltZWQgYnkgdGhlXG4gICAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gY29udGFpbmVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBza2lwU2libGluZ05vZGVzKHN0YXRlLCAxKTtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIG5leHROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vbi1jb250YWluZXIgZWxlbWVudHMgcmVwcmVzZW50IGFuIGFjdHVhbCBub2RlIGluIHRoZSBET00sIHNvIHdlXG4gICAgICAgICAgICAgIC8vIG5lZWQgdG8gY29udGludWUgaHlkcmF0aW9uIHdpdGggdGhlIGNoaWxkcmVuLCBhbmQgY2xhaW0gdGhlIG5vZGUuXG4gICAgICAgICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgZm9ya0h5ZHJhdGlvblN0YXRlKHN0YXRlLCBzdGF0ZS5jdXJyZW50Tm9kZT8uZmlyc3RDaGlsZCA/PyBudWxsKSxcbiAgICAgICAgICAgICAgICBub2RlT3JOb2Rlcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIGN1cnJlbnROb2RlPy5uZXh0U2libGluZyA/PyBudWxsKTtcblxuICAgICAgICAgICAgICAvLyBFbGVtZW50cyBjYW4gYWxzbyBiZSB0aGUgYW5jaG9yIG9mIGEgdmlldyBjb250YWluZXIsIHNvIHRoZXJlIG1heVxuICAgICAgICAgICAgICAvLyBiZSBlbGVtZW50cyBhZnRlciB0aGlzIG5vZGUgdGhhdCB3ZSBuZWVkIHRvIHNraXAuXG4gICAgICAgICAgICAgIGlmIChjb250YWluZXJTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gYCsxYCBzdGFuZHMgZm9yIGFuIGFuY2hvciBub2RlIGFmdGVyIGFsbCBvZiB0aGUgdmlld3MgaW4gdGhlIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHNraXBTaWJsaW5nTm9kZXMoc3RhdGUsIGNvbnRhaW5lclNpemUgKyAxKTtcbiAgICAgICAgICAgICAgICBzZXRDdXJyZW50Tm9kZShzdGF0ZSwgbmV4dE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlIEkxOG5QbGFjZWhvbGRlclR5cGUuU1VCVEVNUExBVEU6IHtcbiAgICAgICAgICAgIG5nRGV2TW9kZSAmJlxuICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbChcbiAgICAgICAgICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIGEgY29udGFpbmVyIHNpemUgd2hpbGUgaHlkcmF0aW5nIGkxOG4gc3VidGVtcGxhdGUnLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRpb24gZXhwZWN0cyB0byBmaW5kIHRoZSBoZWFkIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgb3ZlciBhbGwgb2YgdGhlIHRlbXBsYXRlIGNoaWxkcmVuLCBhcyB3ZWxsIGFzIHRoZSBhbmNob3JcbiAgICAgICAgICAgIC8vIG5vZGUsIHNpbmNlIHRoZSB0ZW1wbGF0ZSBpdHNlbGYgd2lsbCBoYW5kbGUgdGhlbSBpbnN0ZWFkLlxuICAgICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBza2lwU2libGluZ05vZGVzKHN0YXRlLCBjb250YWluZXJTaXplISArIDEpO1xuICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIG5leHROb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuSUNVOiB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IG5vZGUgaXMgY29ubmVjdGVkLCB3ZSBuZWVkIHRvIHBvcCB0aGUgbmV4dCBjYXNlIGZyb20gdGhlXG4gICAgICAgIC8vIHF1ZXVlLCBzbyB0aGF0IHRoZSBhY3RpdmUgY2FzZSBpcyBhbHNvIGNvbnNpZGVyZWQgY29ubmVjdGVkLlxuICAgICAgICBjb25zdCBzZWxlY3RlZENhc2UgPSBzdGF0ZS5pc0Nvbm5lY3RlZCA/IGNvbnRleHQuY2FzZVF1ZXVlLnNoaWZ0KCkhIDogbnVsbDtcbiAgICAgICAgY29uc3QgY2hpbGRTdGF0ZSA9IHtjdXJyZW50Tm9kZTogbnVsbCwgaXNDb25uZWN0ZWQ6IGZhbHNlfTtcblxuICAgICAgICAvLyBXZSB0cmF2ZXJzZSB0aHJvdWdoIGVhY2ggY2FzZSwgZXZlbiBpZiBpdCdzIG5vdCBhY3RpdmUsXG4gICAgICAgIC8vIHNvIHRoYXQgd2UgY29ycmVjdGx5IHBvcHVsYXRlIGRpc2Nvbm5lY3RlZCBub2Rlcy5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlT3JOb2Rlcy5jYXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGkgPT09IHNlbGVjdGVkQ2FzZSA/IHN0YXRlIDogY2hpbGRTdGF0ZSxcbiAgICAgICAgICAgIG5vZGVPck5vZGVzLmNhc2VzW2ldLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRDYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSUNVcyByZXByZXNlbnQgYSBicmFuY2hpbmcgc3RhdGUsIGFuZCB0aGUgc2VsZWN0ZWQgY2FzZSBjb3VsZCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB0aGFuIHdoYXQgaXQgd2FzIG9uIHRoZSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNsZWFuXG4gICAgICAgICAgLy8gdXAgdGhlIG5vZGVzIGZyb20gdGhlIG9yaWdpbmFsIGNhc2UuIFRvIGRvIHRoYXQsIHdlIHN0b3JlIHRoZSBzZWxlY3RlZCBjYXNlLlxuICAgICAgICAgIGNvbnRleHQuZGVoeWRyYXRlZEljdURhdGEuc2V0KG5vZGVPck5vZGVzLmluZGV4LCB7Y2FzZTogc2VsZWN0ZWRDYXNlLCBub2RlOiBub2RlT3JOb2Rlc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSHlkcmF0aW9uIGV4cGVjdHMgdG8gZmluZCB0aGUgSUNVIGFuY2hvciBlbGVtZW50LlxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5sZXQgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsOiB0eXBlb2YgY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGwgPSAoKSA9PiB7XG4gIC8vIG5vb3AgdW5sZXNzIGBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbGAgaXMgaW52b2tlZFxufTtcblxuLyoqXG4gKiBNYXJrIHRoZSBjYXNlIGZvciB0aGUgSUNVIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSB2aWV3IGFzIGNsYWltZWQsXG4gKiBhbGxvd2luZyBpdHMgbm9kZXMgdG8gYmUgaHlkcmF0ZWQgYW5kIG5vdCBjbGVhbmVkIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZShsVmlldzogTFZpZXcsIGljdUluZGV4OiBudW1iZXIsIGNhc2VJbmRleDogbnVtYmVyKSB7XG4gIF9jbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbChsVmlldywgaWN1SW5kZXgsIGNhc2VJbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbCgpIHtcbiAgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsID0gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGw7XG59XG5cbmZ1bmN0aW9uIGNsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsKGxWaWV3OiBMVmlldywgaWN1SW5kZXg6IG51bWJlciwgY2FzZUluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZGVoeWRyYXRlZEljdURhdGFNYXAgPSBsVmlld1tIWURSQVRJT05dPy5kZWh5ZHJhdGVkSWN1RGF0YTtcbiAgaWYgKGRlaHlkcmF0ZWRJY3VEYXRhTWFwKSB7XG4gICAgY29uc3QgZGVoeWRyYXRlZEljdURhdGEgPSBkZWh5ZHJhdGVkSWN1RGF0YU1hcC5nZXQoaWN1SW5kZXgpO1xuICAgIGlmIChkZWh5ZHJhdGVkSWN1RGF0YT8uY2FzZSA9PT0gY2FzZUluZGV4KSB7XG4gICAgICAvLyBJZiB0aGUgY2FzZSB3ZSdyZSBhdHRlbXB0aW5nIHRvIGNsYWltIG1hdGNoZXMgdGhlIGRlaHlkcmF0ZWQgb25lLFxuICAgICAgLy8gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCB0byBtYXJrIGl0IGFzIFwiY2xhaW1lZC5cIlxuICAgICAgZGVoeWRyYXRlZEljdURhdGFNYXAuZGVsZXRlKGljdUluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBhbGwgaTE4biBoeWRyYXRpb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZpZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwSTE4bkh5ZHJhdGlvbkRhdGEobFZpZXc6IExWaWV3KSB7XG4gIGNvbnN0IGh5ZHJhdGlvbkluZm8gPSBsVmlld1tIWURSQVRJT05dO1xuICBpZiAoaHlkcmF0aW9uSW5mbykge1xuICAgIGNvbnN0IHtpMThuTm9kZXMsIGRlaHlkcmF0ZWRJY3VEYXRhOiBkZWh5ZHJhdGVkSWN1RGF0YU1hcH0gPSBoeWRyYXRpb25JbmZvO1xuICAgIGlmIChpMThuTm9kZXMgJiYgZGVoeWRyYXRlZEljdURhdGFNYXApIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgICAgZm9yIChjb25zdCBkZWh5ZHJhdGVkSWN1RGF0YSBvZiBkZWh5ZHJhdGVkSWN1RGF0YU1hcC52YWx1ZXMoKSkge1xuICAgICAgICBjbGVhbnVwRGVoeWRyYXRlZEljdURhdGEocmVuZGVyZXIsIGkxOG5Ob2RlcywgZGVoeWRyYXRlZEljdURhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGh5ZHJhdGlvbkluZm8uaTE4bk5vZGVzID0gdW5kZWZpbmVkO1xuICAgIGh5ZHJhdGlvbkluZm8uZGVoeWRyYXRlZEljdURhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW51cERlaHlkcmF0ZWRJY3VEYXRhKFxuICByZW5kZXJlcjogUmVuZGVyZXIsXG4gIGkxOG5Ob2RlczogTWFwPG51bWJlciwgUk5vZGUgfCBudWxsPixcbiAgZGVoeWRyYXRlZEljdURhdGE6IERlaHlkcmF0ZWRJY3VEYXRhLFxuKSB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkZWh5ZHJhdGVkSWN1RGF0YS5ub2RlLmNhc2VzW2RlaHlkcmF0ZWRJY3VEYXRhLmNhc2VdKSB7XG4gICAgY29uc3Qgck5vZGUgPSBpMThuTm9kZXMuZ2V0KG5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTtcbiAgICBpZiAock5vZGUpIHtcbiAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|