| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208 |
4
809
50
1
1
1
1
1
1
1
1
811
809
809
809
809
809
43
809
1
130
130
130
130
6
130
1
55
55
55
1
75
1
347
346
346
1
340
339
339
1
157
9
17
6
148
1
1
50
50
50
50
50
1
59
55
55
53
53
53
1
81
75
75
72
72
72
1
130
130
130
125
125
1
130
130
169
1
217
213
213
213
1
203
199
1
69
69
69
69
1
55
55
55
55
1
8
7
6
6
1
10
9
7
7
1
45
45
45
45
1
24
24
24
1
1
| "use strict";
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
var _slicedToArray = function (arr, i) { Eif (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { var _arr = []; for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { _arr.push(_step.value); if (i && _arr.length === i) break; } return _arr; } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } };
var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
var invariant = _interopRequire(require("invariant"));
var keyMirror = _interopRequire(require("keymirror"));
var isArray = _interopRequire(require("lodash/lang/isArray"));
var getNextUniqueId = _interopRequire(require("./getNextUniqueId"));
var HandlerRoles = keyMirror({
SOURCE: null,
TARGET: null
});
var HANDLE_SEPARATOR = "🐲";
var TYPE_SEPARATOR = "💧";
function parseHandle(handle) {
var _handle$split = handle.split(HANDLE_SEPARATOR);
var _handle$split2 = _slicedToArray(_handle$split, 3);
var type = _handle$split2[0];
var role = _handle$split2[1];
var id = _handle$split2[2];
if (type.indexOf(TYPE_SEPARATOR) > -1) {
type = type.split(TYPE_SEPARATOR);
}
return { type: type, role: role, id: id };
}
function makeHandle(_ref) {
var type = _ref.type;
var role = _ref.role;
var id = _ref.id;
if (isArray(type)) {
type = type.join(TYPE_SEPARATOR);
}
return [type, role, id].join(HANDLE_SEPARATOR);
}
function validateSourceContract(source) {
invariant(typeof source.canDrag === "function", "Expected canDrag to be a function.");
invariant(typeof source.beginDrag === "function", "Expected beginDrag to be a function.");
invariant(typeof source.endDrag === "function", "Expected endDrag to be a function.");
}
function validateTargetContract(target) {
invariant(typeof target.drop === "function", "Expected beginDrag to be a function.");
}
function validateSourceHandle(handle) {
var _parseHandle = parseHandle(handle);
var role = _parseHandle.role;
invariant(role === HandlerRoles.SOURCE, "Expected to receive a source handle");
}
function validateTargetHandle(handle) {
var _parseHandle = parseHandle(handle);
var role = _parseHandle.role;
invariant(role === HandlerRoles.TARGET, "Expected to receive a target handle");
}
function validateType(type, allowArray) {
if (allowArray && isArray(type)) {
type.forEach(function (t) {
return validateType(t, false);
});
return;
}
invariant(typeof type === "string", allowArray ? "Type can only be a string or an array of them." : "Type can only be a string.");
}
var HandlerRegistry = (function () {
function HandlerRegistry(actions) {
_classCallCheck(this, HandlerRegistry);
this.actions = actions;
this.handlers = {};
this.pinnedSourceHandle = null;
this.pinnedSource = null;
}
HandlerRegistry.prototype.addSource = function addSource(type, source) {
validateType(type);
validateSourceContract(source);
var sourceHandle = this.addHandler(HandlerRoles.SOURCE, type, source);
validateSourceHandle(sourceHandle);
this.actions.addSource(sourceHandle);
return sourceHandle;
};
HandlerRegistry.prototype.addTarget = function addTarget(type, target) {
validateType(type, true);
validateTargetContract(target);
var targetHandle = this.addHandler(HandlerRoles.TARGET, type, target);
validateTargetHandle(targetHandle);
this.actions.addTarget(targetHandle);
return targetHandle;
};
HandlerRegistry.prototype.addHandler = function addHandler(role, type, handler) {
var id = getNextUniqueId().toString();
var handle = makeHandle({ role: role, type: type, id: id });
invariant(!this.containsHandler(handler), "Cannot add the same handler instance twice.");
this.handlers[handle] = handler;
return handle;
};
HandlerRegistry.prototype.containsHandler = function containsHandler(handler) {
var _this = this;
return Object.keys(this.handlers).some(function (key) {
return _this.handlers[key] === handler;
});
};
HandlerRegistry.prototype.getSource = function getSource(sourceHandle, includePinned) {
validateSourceHandle(sourceHandle);
var isPinned = includePinned && sourceHandle === this.pinnedSourceHandle;
var source = isPinned ? this.pinnedSource : this.handlers[sourceHandle];
return source;
};
HandlerRegistry.prototype.getTarget = function getTarget(targetHandle) {
validateTargetHandle(targetHandle);
return this.handlers[targetHandle];
};
HandlerRegistry.prototype.getSourceType = function getSourceType(sourceHandle) {
validateSourceHandle(sourceHandle);
var _parseHandle = parseHandle(sourceHandle);
var type = _parseHandle.type;
return type;
};
HandlerRegistry.prototype.getTargetType = function getTargetType(targetHandle) {
validateTargetHandle(targetHandle);
var _parseHandle = parseHandle(targetHandle);
var type = _parseHandle.type;
return type;
};
HandlerRegistry.prototype.removeSource = function removeSource(sourceHandle) {
validateSourceHandle(sourceHandle);
invariant(this.getSource(sourceHandle), "Cannot remove a source that was not added.");
delete this.handlers[sourceHandle];
this.actions.removeSource(sourceHandle);
};
HandlerRegistry.prototype.removeTarget = function removeTarget(targetHandle) {
validateTargetHandle(targetHandle);
invariant(this.getTarget(targetHandle), "Cannot remove a target that was not added.");
delete this.handlers[targetHandle];
this.actions.removeTarget(targetHandle);
};
HandlerRegistry.prototype.pinSource = function pinSource(handle) {
var source = this.getSource(handle);
invariant(source, "Cannot pin a source that was not added.");
this.pinnedSourceHandle = handle;
this.pinnedSource = source;
};
HandlerRegistry.prototype.unpinSource = function unpinSource() {
invariant(this.pinnedSource, "No source is pinned at the time.");
this.pinnedSourceHandle = null;
this.pinnedSource = null;
};
return HandlerRegistry;
})();
module.exports = HandlerRegistry;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9kYW4vRG9jdW1lbnRzL1Byb2plY3RzL2RuZC1jb3JlL21vZHVsZXMvdXRpbHMvSGFuZGxlclJlZ2lzdHJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0lBQU8sU0FBUywyQkFBTSxXQUFXOztJQUMxQixTQUFTLDJCQUFNLFdBQVc7O0lBQzFCLE9BQU8sMkJBQU0scUJBQXFCOztJQUNsQyxlQUFlLDJCQUFNLG1CQUFtQjs7QUFFL0MsSUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBQzdCLFFBQU0sRUFBRSxJQUFJO0FBQ1osUUFBTSxFQUFFLElBQUk7Q0FDYixDQUFDLENBQUM7O0FBRUgsSUFBTSxnQkFBZ0IsR0FBRyxJQUFjLENBQUM7QUFDeEMsSUFBTSxjQUFjLEdBQUcsSUFBYyxDQUFDOztBQUV0QyxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7c0JBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQzs7OztNQUFoRCxJQUFJO01BQUUsSUFBSTtNQUFFLEVBQUU7O0FBQ25CLE1BQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNyQyxRQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztHQUNuQztBQUNELFNBQU8sRUFBRSxJQUFJLEVBQUosSUFBSSxFQUFFLElBQUksRUFBSixJQUFJLEVBQUUsRUFBRSxFQUFGLEVBQUUsRUFBRSxDQUFDO0NBQzNCOztBQUVELFNBQVMsVUFBVSxPQUFxQjtNQUFsQixJQUFJLFFBQUosSUFBSTtNQUFFLElBQUksUUFBSixJQUFJO01BQUUsRUFBRSxRQUFGLEVBQUU7O0FBQ2xDLE1BQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2pCLFFBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0dBQ2xDO0FBQ0QsU0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFB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QUMsQ0FBQztHQUN6Qzs7QUFyRmtCLGlCQUFlLFdBdUZsQyxTQUFTLEdBQUEsbUJBQUMsTUFBTSxFQUFFO0FBQ2hCLFFBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsYUFBUyxDQUFDLE1BQU0sRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDOztBQUU3RCxRQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLFFBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0dBQzVCOztBQTdGa0IsaUJBQWUsV0ErRmxDLFdBQVcsR0FBQSx1QkFBRztBQUNaLGFBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7O0FBRWpFLFFBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDL0IsUUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7R0FDMUI7O1NBcEdrQixlQUFlOzs7aUJBQWYsZUFBZSIsImZpbGUiOiIvVXNlcnMvZGFuL0RvY3VtZW50cy9Qcm9qZWN0cy9kbmQtY29yZS9tb2R1bGVzL3V0aWxzL0hhbmRsZXJSZWdpc3RyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCBrZXlNaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCBpc0FycmF5IGZyb20gJ2xvZGFzaC9sYW5nL2lzQXJyYXknO1xuaW1wb3J0IGdldE5leHRVbmlxdWVJZCBmcm9tICcuL2dldE5leHRVbmlxdWVJZCc7XG5cbmNvbnN0IEhhbmRsZXJSb2xlcyA9IGtleU1pcnJvcih7XG4gIFNPVVJDRTogbnVsbCxcbiAgVEFSR0VUOiBudWxsXG59KTtcblxuY29uc3QgSEFORExFX1NFUEFSQVRPUiA9ICdcXHVkODNkXFx1ZGMzMic7XG5jb25zdCBUWVBFX1NFUEFSQVRPUiA9ICdcXHVkODNkXFx1ZGNhNyc7XG5cbmZ1bmN0aW9uIHBhcnNlSGFuZGxlKGhhbmRsZSkge1xuICBsZXQgW3R5cGUsIHJvbGUsIGlkXSA9IGhhbmRsZS5zcGxpdChIQU5ETEVfU0VQQVJBVE9SKTtcbiAgaWYgKHR5cGUuaW5kZXhPZihUWVBFX1NFUEFSQVRPUikgPiAtMSkge1xuICAgIHR5cGUgPSB0eXBlLnNwbGl0KFRZUEVfU0VQQVJBVE9SKTtcbiAgfVxuICByZXR1cm4geyB0eXBlLCByb2xlLCBpZCB9O1xufVxuXG5mdW5jdGlvbiBtYWtlSGFuZGxlKHsgdHlwZSwgcm9sZSwgaWQgfSkge1xuICBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgIHR5cGUgPSB0eXBlLmpvaW4oVFlQRV9TRVBBUkFUT1IpO1xuICB9XG4gIHJldHVybiBbdHlwZSwgcm9sZSwgaWRdLmpvaW4oSEFORExFX1NFUEFSQVRPUik7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKSB7XG4gIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmNhbkRyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBjYW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmJlZ2luRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGJlZ2luRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5lbmREcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgZW5kRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhcmdldENvbnRyYWN0KHRhcmdldCkge1xuICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5kcm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgYmVnaW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU291cmNlSGFuZGxlKGhhbmRsZSkge1xuICBjb25zdCB7IHJvbGUgfSA9IHBhcnNlSGFuZGxlKGhhbmRsZSk7XG4gIGludmFyaWFudChyb2xlID09PSBIYW5kbGVyUm9sZXMuU09VUkNFLCAnRXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNvdXJjZSBoYW5kbGUnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRIYW5kbGUoaGFuZGxlKSB7XG4gIGNvbnN0IHsgcm9sZSB9ID0gcGFyc2VIYW5kbGUoaGFuZGxlKTtcbiAgaW52YXJpYW50KHJvbGUgPT09IEhhbmRsZXJSb2xlcy5UQVJHRVQsICdFeHBlY3RlZCB0byByZWNlaXZlIGEgdGFyZ2V0IGhhbmRsZScpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZSwgYWxsb3dBcnJheSkge1xuICBpZiAoYWxsb3dBcnJheSAmJiBpc0FycmF5KHR5cGUpKSB7XG4gICAgdHlwZS5mb3JFYWNoKHQgPT4gdmFsaWRhdGVUeXBlKHQsIGZhbHNlKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW52YXJpYW50KFxuICAgIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyxcbiAgICBhbGxvd0FycmF5ID9cbiAgICAgICdUeXBlIGNhbiBvbmx5IGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHRoZW0uJyA6XG4gICAgICAnVHlwZSBjYW4gb25seSBiZSBhIHN0cmluZy4nXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhbmRsZXJSZWdpc3RyeSB7XG4gIGNvbnN0cnVjdG9yKGFjdGlvbnMpIHtcbiAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zO1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gIH1cblxuICBhZGRTb3VyY2UodHlwZSwgc291cmNlKSB7XG4gICAgdmFsaWRhdGVUeXBlKHR5cGUpO1xuICAgIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKTtcblxuICAgIGNvbnN0IHNvdXJjZUhhbmRsZSA9IHRoaXMuYWRkSGFuZGxlcihIYW5kbGVyUm9sZXMuU09VUkNFLCB0eXBlLCBzb3VyY2UpO1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG5cbiAgICB0aGlzLmFjdGlvbnMuYWRkU291cmNlKHNvdXJjZUhhbmRsZSk7XG4gICAgcmV0dXJuIHNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIGFkZFRhcmdldCh0eXBlLCB0YXJnZXQpIHtcbiAgICB2YWxpZGF0ZVR5cGUodHlwZSwgdHJ1ZSk7XG4gICAgdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpO1xuXG4gICAgY29uc3QgdGFyZ2V0SGFuZGxlID0gdGhpcy5hZGRIYW5kbGVyKEhhbmRsZXJSb2xlcy5UQVJHRVQsIHR5cGUsIHRhcmdldCk7XG4gICAgdmFsaWRhdGVUYXJnZXRIYW5kbGUodGFyZ2V0SGFuZGxlKTtcblxuICAgIHRoaXMuYWN0aW9ucy5hZGRUYXJnZXQodGFyZ2V0SGFuZGxlKTtcbiAgICByZXR1cm4gdGFyZ2V0SGFuZGxlO1xuICB9XG5cbiAgYWRkSGFuZGxlcihyb2xlLCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgaWQgPSBnZXROZXh0VW5pcXVlSWQoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGhhbmRsZSA9IG1ha2VIYW5kbGUoeyByb2xlLCB0eXBlLCBpZCB9KTtcblxuICAgIGludmFyaWFudCghdGhpcy5jb250YWluc0hhbmRsZXIoaGFuZGxlciksICdDYW5ub3QgYWRkIHRoZSBzYW1lIGhhbmRsZXIgaW5zdGFuY2UgdHdpY2UuJyk7XG4gICAgdGhpcy5oYW5kbGVyc1toYW5kbGVdID0gaGFuZGxlcjtcblxuICAgIHJldHVybiBoYW5kbGU7XG4gIH1cblxuICBjb250YWluc0hhbmRsZXIoaGFuZGxlcikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmhhbmRsZXJzKS5zb21lKGtleSA9PiB0aGlzLmhhbmRsZXJzW2tleV0gPT09IGhhbmRsZXIpO1xuICB9XG5cbiAgZ2V0U291cmNlKHNvdXJjZUhhbmRsZSwgaW5jbHVkZVBpbm5lZCkge1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG5cbiAgICBjb25zdCBpc1Bpbm5lZCA9IGluY2x1ZGVQaW5uZWQgJiYgc291cmNlSGFuZGxlID09PSB0aGlzLnBpbm5lZFNvdXJjZUhhbmRsZTtcbiAgICBjb25zdCBzb3VyY2UgPSBpc1Bpbm5lZCA/IHRoaXMucGlubmVkU291cmNlIDogdGhpcy5oYW5kbGVyc1tzb3VyY2VIYW5kbGVdO1xuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGdldFRhcmdldCh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzW3RhcmdldEhhbmRsZV07XG4gIH1cblxuICBnZXRTb3VyY2VUeXBlKHNvdXJjZUhhbmRsZSkge1xuICAgIHZhbGlkYXRlU291cmNlSGFuZGxlKHNvdXJjZUhhbmRsZSk7XG4gICAgY29uc3QgeyB0eXBlIH0gPSBwYXJzZUhhbmRsZShzb3VyY2VIYW5kbGUpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZ2V0VGFyZ2V0VHlwZSh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gcGFyc2VIYW5kbGUodGFyZ2V0SGFuZGxlKTtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHJlbW92ZVNvdXJjZShzb3VyY2VIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVNvdXJjZUhhbmRsZShzb3VyY2VIYW5kbGUpO1xuICAgIGludmFyaWFudCh0aGlzLmdldFNvdXJjZShzb3VyY2VIYW5kbGUpLCAnQ2Fubm90IHJlbW92ZSBhIHNvdXJjZSB0aGF0IHdhcyBub3QgYWRkZWQuJyk7XG5cbiAgICBkZWxldGUgdGhpcy5oYW5kbGVyc1tzb3VyY2VIYW5kbGVdO1xuICAgIHRoaXMuYWN0aW9ucy5yZW1vdmVTb3VyY2Uoc291cmNlSGFuZGxlKTtcbiAgfVxuXG4gIHJlbW92ZVRhcmdldCh0YXJnZXRIYW5kbGUpIHtcbiAgICB2YWxpZGF0ZVRhcmdldEhhbmRsZSh0YXJnZXRIYW5kbGUpO1xuICAgIGludmFyaWFudCh0aGlzLmdldFRhcmdldCh0YXJnZXRIYW5kbGUpLCAnQ2Fubm90IHJlbW92ZSBhIHRhcmdldCB0aGF0IHdhcyBub3QgYWRkZWQuJyk7XG5cbiAgICBkZWxldGUgdGhpcy5oYW5kbGVyc1t0YXJnZXRIYW5kbGVdO1xuICAgIHRoaXMuYWN0aW9ucy5yZW1vdmVUYXJnZXQodGFyZ2V0SGFuZGxlKTtcbiAgfVxuXG4gIHBpblNvdXJjZShoYW5kbGUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShoYW5kbGUpO1xuICAgIGludmFyaWFudChzb3VyY2UsICdDYW5ub3QgcGluIGEgc291cmNlIHRoYXQgd2FzIG5vdCBhZGRlZC4nKTtcblxuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gaGFuZGxlO1xuICAgIHRoaXMucGlubmVkU291cmNlID0gc291cmNlO1xuICB9XG5cbiAgdW5waW5Tb3VyY2UoKSB7XG4gICAgaW52YXJpYW50KHRoaXMucGlubmVkU291cmNlLCAnTm8gc291cmNlIGlzIHBpbm5lZCBhdCB0aGUgdGltZS4nKTtcblxuICAgIHRoaXMucGlubmVkU291cmNlSGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gIH1cbn0iXX0= |